@clockworkdog/cogs-client 2.0.0 → 2.1.1
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/dist/AudioPlayer.d.ts +1 -0
- package/dist/AudioPlayer.js +2 -2
- package/dist/CogsConnection.d.ts +12 -0
- package/dist/CogsConnection.js +60 -10
- package/dist/VideoPlayer.d.ts +1 -0
- package/dist/VideoPlayer.js +2 -2
- package/dist/browser/index.js +301 -26
- package/dist/helpers/urls.d.ts +9 -0
- package/dist/helpers/urls.js +10 -3
- package/dist/types/CogsClientMessage.d.ts +6 -1
- package/package.json +4 -1
package/dist/browser/index.js
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const howler_1 = require("howler");
|
|
5
|
-
const urls_1 = require("./helpers/urls");
|
|
6
5
|
const DEBUG = false;
|
|
7
6
|
// Check an iOS-only property (See https://developer.mozilla.org/en-US/docs/Web/API/Navigator#non-standard_properties)
|
|
8
7
|
const IS_IOS = typeof navigator.standalone !== 'undefined';
|
|
9
8
|
class AudioPlayer {
|
|
10
9
|
constructor(cogsConnection) {
|
|
10
|
+
this.cogsConnection = cogsConnection;
|
|
11
11
|
this.eventTarget = new EventTarget();
|
|
12
12
|
this.globalVolume = 1;
|
|
13
13
|
this.audioClipPlayers = {};
|
|
@@ -408,7 +408,7 @@ class AudioPlayer {
|
|
|
408
408
|
}
|
|
409
409
|
createPlayer(path, config) {
|
|
410
410
|
const player = new howler_1.Howl({
|
|
411
|
-
src:
|
|
411
|
+
src: this.cogsConnection.getAssetUrl(path),
|
|
412
412
|
autoplay: false,
|
|
413
413
|
loop: false,
|
|
414
414
|
volume: 1,
|
|
@@ -480,13 +480,14 @@ function fadeAudioPlayerVolume(howl, volume, fade, soundId) {
|
|
|
480
480
|
howl.fade(howl.volume(soundId), volume, fade, soundId);
|
|
481
481
|
}
|
|
482
482
|
|
|
483
|
-
},{"
|
|
483
|
+
},{"howler":16}],2:[function(require,module,exports){
|
|
484
484
|
"use strict";
|
|
485
485
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
486
486
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
487
487
|
};
|
|
488
488
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
489
489
|
exports.CogsIncomingEvent = exports.CogsStateChangedEvent = exports.CogsConfigChangedEvent = exports.CogsMessageEvent = exports.CogsConnectionCloseEvent = exports.CogsConnectionOpenEvent = void 0;
|
|
490
|
+
const compare_versions_1 = require("compare-versions");
|
|
490
491
|
const ShowPhase_1 = __importDefault(require("./types/ShowPhase"));
|
|
491
492
|
const reconnecting_websocket_1 = __importDefault(require("reconnecting-websocket"));
|
|
492
493
|
const urls_1 = require("./helpers/urls");
|
|
@@ -503,6 +504,15 @@ class CogsConnection {
|
|
|
503
504
|
get timerState() {
|
|
504
505
|
return this._timerState ? { ...this._timerState } : null;
|
|
505
506
|
}
|
|
507
|
+
get supportsHttp2Assets() {
|
|
508
|
+
return this.clientSupportsHttp2Assets && this.serverSupportsHttp2Assets;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Return asset URLs using the information about the client and server support for HTTP/2
|
|
512
|
+
*/
|
|
513
|
+
getAssetUrl(path) {
|
|
514
|
+
return (0, urls_1.assetUrl)(path, this.supportsHttp2Assets);
|
|
515
|
+
}
|
|
506
516
|
get selectedAudioOutput() {
|
|
507
517
|
return this._selectedAudioOutput;
|
|
508
518
|
}
|
|
@@ -514,18 +524,29 @@ class CogsConnection {
|
|
|
514
524
|
this.currentState = {}; // Received on open connection - TODO: set initial state from manifest?
|
|
515
525
|
this._showPhase = ShowPhase_1.default.Setup;
|
|
516
526
|
this._timerState = null;
|
|
527
|
+
/**
|
|
528
|
+
* Track the support for HTTP/2 assets on the client and server side
|
|
529
|
+
* Client side is dictated by the environment we're connecting from (and the media cogs-av-box version)
|
|
530
|
+
* Server side is dictated by the COGS version which added the HTTP/2 assets server itself
|
|
531
|
+
*/
|
|
532
|
+
this.clientSupportsHttp2Assets = false;
|
|
533
|
+
this.serverSupportsHttp2Assets = false;
|
|
517
534
|
/**
|
|
518
535
|
* Cached audio outputs use to look up the device/sink ID when a different device label is requested
|
|
519
536
|
*/
|
|
520
537
|
this.audioOutputs = undefined;
|
|
521
538
|
this._selectedAudioOutput = '';
|
|
522
539
|
this.currentState = { ...initialClientState };
|
|
523
|
-
const { useReconnectingWebsocket, path, pathParams } = websocketParametersFromUrl(document.location.href);
|
|
540
|
+
const { useReconnectingWebsocket, path, pathParams, supportsHttp2Assets } = websocketParametersFromUrl(document.location.href);
|
|
524
541
|
const socketUrl = `ws://${hostname}:${port}${path}${pathParams ? '?' + pathParams : ''}`;
|
|
525
542
|
this.websocket = useReconnectingWebsocket ? new reconnecting_websocket_1.default(socketUrl) : new WebSocket(socketUrl);
|
|
543
|
+
this.clientSupportsHttp2Assets = !!supportsHttp2Assets;
|
|
526
544
|
this.websocket.onopen = () => {
|
|
527
545
|
this.currentConfig = {}; // Received on open connection
|
|
528
546
|
this.currentState = {}; // Received on open connection
|
|
547
|
+
// Reset this flag as we might have just connected to an old COGS version which doesn't support HTTP/2
|
|
548
|
+
// The flag will be set when COGS sends a "cogs_environment" message
|
|
549
|
+
this.serverSupportsHttp2Assets = false;
|
|
529
550
|
this.dispatchEvent(new CogsConnectionOpenEvent());
|
|
530
551
|
this.setState(this.currentState); // TODO: Remove this because you should set it manually...??
|
|
531
552
|
};
|
|
@@ -560,6 +581,9 @@ class CogsConnection {
|
|
|
560
581
|
case 'show_phase':
|
|
561
582
|
this._showPhase = message.phase;
|
|
562
583
|
break;
|
|
584
|
+
case 'cogs_environment':
|
|
585
|
+
this.serverSupportsHttp2Assets = message.http2AssetsServer;
|
|
586
|
+
break;
|
|
563
587
|
}
|
|
564
588
|
this.dispatchEvent(new CogsMessageEvent(message));
|
|
565
589
|
}
|
|
@@ -651,41 +675,67 @@ class CogsConnection {
|
|
|
651
675
|
}
|
|
652
676
|
exports.default = CogsConnection;
|
|
653
677
|
function websocketParametersFromUrl(url) {
|
|
654
|
-
var _a, _b, _c, _d, _e;
|
|
678
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
655
679
|
const parsedUrl = new URL(url);
|
|
656
680
|
const pathParams = new URLSearchParams(parsedUrl.searchParams);
|
|
657
681
|
const localClientId = pathParams.get('local_id');
|
|
658
682
|
const isSimulator = pathParams.get('simulator') === 'true';
|
|
659
683
|
const display = (_a = pathParams.get('display')) !== null && _a !== void 0 ? _a : '';
|
|
660
684
|
const pluginId = parsedUrl.pathname.startsWith('/plugin/') ? decodeURIComponent(parsedUrl.pathname.split('/')[2]) : undefined;
|
|
685
|
+
// Allow explicitly disabling HTTP/2 assets. This is useful in situations where we know the self-signed certificate cannot be
|
|
686
|
+
// supported such as the native mobile app
|
|
687
|
+
const disableHttp2Assets = ((_b = pathParams.get('http2Assets')) !== null && _b !== void 0 ? _b : '') === 'false';
|
|
661
688
|
if (localClientId) {
|
|
662
|
-
const type = (
|
|
689
|
+
const type = (_c = pathParams.get('t')) !== null && _c !== void 0 ? _c : '';
|
|
663
690
|
pathParams.delete('local_id');
|
|
664
691
|
return {
|
|
665
692
|
path: `/local/${encodeURIComponent(localClientId)}`,
|
|
666
693
|
pathParams: new URLSearchParams({ t: type }),
|
|
667
694
|
useReconnectingWebsocket: true,
|
|
695
|
+
supportsHttp2Assets: !disableHttp2Assets,
|
|
668
696
|
};
|
|
669
697
|
}
|
|
670
698
|
else if (isSimulator) {
|
|
671
|
-
const
|
|
699
|
+
const supportsHttp2Assets = ((_d = pathParams.get('http2Assets')) !== null && _d !== void 0 ? _d : '') === 'true';
|
|
700
|
+
pathParams.delete('http2Assets');
|
|
701
|
+
const name = (_e = pathParams.get('name')) !== null && _e !== void 0 ? _e : '';
|
|
672
702
|
pathParams.delete('simulator');
|
|
673
703
|
pathParams.delete('name');
|
|
674
|
-
return {
|
|
704
|
+
return {
|
|
705
|
+
path: `/simulator/${encodeURIComponent(name)}`,
|
|
706
|
+
pathParams,
|
|
707
|
+
useReconnectingWebsocket: true,
|
|
708
|
+
supportsHttp2Assets: !disableHttp2Assets && supportsHttp2Assets,
|
|
709
|
+
};
|
|
675
710
|
}
|
|
676
711
|
else if (display) {
|
|
677
|
-
const displayIdIndex = (
|
|
712
|
+
const displayIdIndex = (_f = pathParams.get('displayIdIndex')) !== null && _f !== void 0 ? _f : '';
|
|
678
713
|
pathParams.delete('display');
|
|
679
714
|
pathParams.delete('displayIdIndex');
|
|
680
|
-
return {
|
|
715
|
+
return {
|
|
716
|
+
path: `/display/${encodeURIComponent(display)}/${encodeURIComponent(displayIdIndex)}`,
|
|
717
|
+
supportsHttp2Assets: !disableHttp2Assets,
|
|
718
|
+
};
|
|
681
719
|
}
|
|
682
720
|
else if (pluginId) {
|
|
683
|
-
return {
|
|
721
|
+
return {
|
|
722
|
+
path: `/plugin/${encodeURIComponent(pluginId)}`,
|
|
723
|
+
useReconnectingWebsocket: true,
|
|
724
|
+
supportsHttp2Assets: !disableHttp2Assets,
|
|
725
|
+
};
|
|
684
726
|
}
|
|
685
727
|
else {
|
|
686
|
-
const serial = (
|
|
728
|
+
const serial = (_g = pathParams.get('serial')) !== null && _g !== void 0 ? _g : '';
|
|
687
729
|
pathParams.delete('serial');
|
|
688
|
-
|
|
730
|
+
// Check if cogs-box-av is a version which added support for ignoring HTTP/2 self-signed certificates
|
|
731
|
+
const firmwareVersion = ((_h = pathParams.get('f')) !== null && _h !== void 0 ? _h : '').replace(/^v/, '');
|
|
732
|
+
const isCogsBoxAvDevBuild = firmwareVersion === '0.0.0'; // We assume dev firmware builds have HTTP/2 assets support - Added in 2024-03
|
|
733
|
+
const supportsHttp2Assets = isCogsBoxAvDevBuild || ((0, compare_versions_1.validate)(firmwareVersion) && (0, compare_versions_1.satisfies)(firmwareVersion, '>=4.9.0'));
|
|
734
|
+
return {
|
|
735
|
+
path: `/client/${encodeURIComponent(serial)}`,
|
|
736
|
+
pathParams,
|
|
737
|
+
supportsHttp2Assets: !disableHttp2Assets && supportsHttp2Assets,
|
|
738
|
+
};
|
|
689
739
|
}
|
|
690
740
|
}
|
|
691
741
|
class CogsConnectionOpenEvent extends Event {
|
|
@@ -736,7 +786,7 @@ class CogsIncomingEvent extends Event {
|
|
|
736
786
|
}
|
|
737
787
|
exports.CogsIncomingEvent = CogsIncomingEvent;
|
|
738
788
|
|
|
739
|
-
},{"./helpers/urls":5,"./types/ShowPhase":10,"reconnecting-websocket":
|
|
789
|
+
},{"./helpers/urls":5,"./types/ShowPhase":10,"compare-versions":15,"reconnecting-websocket":19}],3:[function(require,module,exports){
|
|
740
790
|
"use strict";
|
|
741
791
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
742
792
|
exports.LIVE_VIDEO_PLAYBACK_RATE = void 0;
|
|
@@ -840,11 +890,11 @@ exports.default = RtspStreamer;
|
|
|
840
890
|
},{"./helpers/urls":5,"@clockworkdog/media-stream-library-browser":12}],4:[function(require,module,exports){
|
|
841
891
|
"use strict";
|
|
842
892
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
843
|
-
const urls_1 = require("./helpers/urls");
|
|
844
893
|
const VideoState_1 = require("./types/VideoState");
|
|
845
894
|
const DEFAULT_PARENT_ELEMENT = document.body;
|
|
846
895
|
class VideoPlayer {
|
|
847
896
|
constructor(cogsConnection, parentElement = DEFAULT_PARENT_ELEMENT) {
|
|
897
|
+
this.cogsConnection = cogsConnection;
|
|
848
898
|
this.eventTarget = new EventTarget();
|
|
849
899
|
this.globalVolume = 1;
|
|
850
900
|
this.videoClipPlayers = {};
|
|
@@ -1124,7 +1174,7 @@ class VideoPlayer {
|
|
|
1124
1174
|
createVideoElement(path, config, { volume }) {
|
|
1125
1175
|
const videoElement = document.createElement('video');
|
|
1126
1176
|
videoElement.playsInline = true; // Required for iOS
|
|
1127
|
-
videoElement.src =
|
|
1177
|
+
videoElement.src = this.cogsConnection.getAssetUrl(path);
|
|
1128
1178
|
videoElement.autoplay = false;
|
|
1129
1179
|
videoElement.loop = false;
|
|
1130
1180
|
setVideoElementVolume(videoElement, volume * this.globalVolume);
|
|
@@ -1231,14 +1281,21 @@ function setVideoElementVolume(videoElement, volume) {
|
|
|
1231
1281
|
videoElement.muted = volume === 0;
|
|
1232
1282
|
}
|
|
1233
1283
|
|
|
1234
|
-
},{"./
|
|
1284
|
+
},{"./types/VideoState":11}],5:[function(require,module,exports){
|
|
1235
1285
|
"use strict";
|
|
1236
1286
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1237
|
-
exports.preloadUrl = exports.assetUrl = exports.COGS_SERVER_PORT = void 0;
|
|
1287
|
+
exports.preloadUrl = exports.assetUrl = exports.COGS_SERVER_PORT = exports.COGS_ASSETS_SERVER_PORT = void 0;
|
|
1288
|
+
exports.COGS_ASSETS_SERVER_PORT = 12094;
|
|
1238
1289
|
exports.COGS_SERVER_PORT = 12095;
|
|
1239
|
-
function assetUrl(file) {
|
|
1290
|
+
function assetUrl(file, useHttp2AssetsServer) {
|
|
1240
1291
|
const location = typeof window !== 'undefined' ? window.location : undefined;
|
|
1241
|
-
|
|
1292
|
+
const path = `/assets/${encodeURIComponent(file)}`;
|
|
1293
|
+
if (useHttp2AssetsServer) {
|
|
1294
|
+
return `https://${location === null || location === void 0 ? void 0 : location.hostname}:${exports.COGS_ASSETS_SERVER_PORT}${path}`;
|
|
1295
|
+
}
|
|
1296
|
+
else {
|
|
1297
|
+
return `${location === null || location === void 0 ? void 0 : location.protocol}//${location === null || location === void 0 ? void 0 : location.hostname}:${exports.COGS_SERVER_PORT}${path}`;
|
|
1298
|
+
}
|
|
1242
1299
|
}
|
|
1243
1300
|
exports.assetUrl = assetUrl;
|
|
1244
1301
|
async function preloadUrl(url) {
|
|
@@ -1362,7 +1419,7 @@ ${e.toLowerCase()}: `,n=r.toString().toLowerCase().indexOf(t);if(n>=0){let i=r.i
|
|
|
1362
1419
|
|
|
1363
1420
|
}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
|
|
1364
1421
|
|
|
1365
|
-
},{"_process":
|
|
1422
|
+
},{"_process":18,"buffer":14}],13:[function(require,module,exports){
|
|
1366
1423
|
'use strict'
|
|
1367
1424
|
|
|
1368
1425
|
exports.byteLength = byteLength
|
|
@@ -3296,7 +3353,225 @@ function numberIsNaN (obj) {
|
|
|
3296
3353
|
|
|
3297
3354
|
}).call(this)}).call(this,require("buffer").Buffer)
|
|
3298
3355
|
|
|
3299
|
-
},{"base64-js":13,"buffer":14,"ieee754":
|
|
3356
|
+
},{"base64-js":13,"buffer":14,"ieee754":17}],15:[function(require,module,exports){
|
|
3357
|
+
(function (global, factory) {
|
|
3358
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3359
|
+
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
3360
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.compareVersions = {}));
|
|
3361
|
+
})(this, (function (exports) { 'use strict';
|
|
3362
|
+
|
|
3363
|
+
const semver = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i;
|
|
3364
|
+
const validateAndParse = (version) => {
|
|
3365
|
+
if (typeof version !== 'string') {
|
|
3366
|
+
throw new TypeError('Invalid argument expected string');
|
|
3367
|
+
}
|
|
3368
|
+
const match = version.match(semver);
|
|
3369
|
+
if (!match) {
|
|
3370
|
+
throw new Error(`Invalid argument not valid semver ('${version}' received)`);
|
|
3371
|
+
}
|
|
3372
|
+
match.shift();
|
|
3373
|
+
return match;
|
|
3374
|
+
};
|
|
3375
|
+
const isWildcard = (s) => s === '*' || s === 'x' || s === 'X';
|
|
3376
|
+
const tryParse = (v) => {
|
|
3377
|
+
const n = parseInt(v, 10);
|
|
3378
|
+
return isNaN(n) ? v : n;
|
|
3379
|
+
};
|
|
3380
|
+
const forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];
|
|
3381
|
+
const compareStrings = (a, b) => {
|
|
3382
|
+
if (isWildcard(a) || isWildcard(b))
|
|
3383
|
+
return 0;
|
|
3384
|
+
const [ap, bp] = forceType(tryParse(a), tryParse(b));
|
|
3385
|
+
if (ap > bp)
|
|
3386
|
+
return 1;
|
|
3387
|
+
if (ap < bp)
|
|
3388
|
+
return -1;
|
|
3389
|
+
return 0;
|
|
3390
|
+
};
|
|
3391
|
+
const compareSegments = (a, b) => {
|
|
3392
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
3393
|
+
const r = compareStrings(a[i] || '0', b[i] || '0');
|
|
3394
|
+
if (r !== 0)
|
|
3395
|
+
return r;
|
|
3396
|
+
}
|
|
3397
|
+
return 0;
|
|
3398
|
+
};
|
|
3399
|
+
|
|
3400
|
+
/**
|
|
3401
|
+
* Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.
|
|
3402
|
+
* This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.
|
|
3403
|
+
* @param v1 - First version to compare
|
|
3404
|
+
* @param v2 - Second version to compare
|
|
3405
|
+
* @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).
|
|
3406
|
+
*/
|
|
3407
|
+
const compareVersions = (v1, v2) => {
|
|
3408
|
+
// validate input and split into segments
|
|
3409
|
+
const n1 = validateAndParse(v1);
|
|
3410
|
+
const n2 = validateAndParse(v2);
|
|
3411
|
+
// pop off the patch
|
|
3412
|
+
const p1 = n1.pop();
|
|
3413
|
+
const p2 = n2.pop();
|
|
3414
|
+
// validate numbers
|
|
3415
|
+
const r = compareSegments(n1, n2);
|
|
3416
|
+
if (r !== 0)
|
|
3417
|
+
return r;
|
|
3418
|
+
// validate pre-release
|
|
3419
|
+
if (p1 && p2) {
|
|
3420
|
+
return compareSegments(p1.split('.'), p2.split('.'));
|
|
3421
|
+
}
|
|
3422
|
+
else if (p1 || p2) {
|
|
3423
|
+
return p1 ? -1 : 1;
|
|
3424
|
+
}
|
|
3425
|
+
return 0;
|
|
3426
|
+
};
|
|
3427
|
+
|
|
3428
|
+
/**
|
|
3429
|
+
* Compare [semver](https://semver.org/) version strings using the specified operator.
|
|
3430
|
+
*
|
|
3431
|
+
* @param v1 First version to compare
|
|
3432
|
+
* @param v2 Second version to compare
|
|
3433
|
+
* @param operator Allowed arithmetic operator to use
|
|
3434
|
+
* @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.
|
|
3435
|
+
*
|
|
3436
|
+
* @example
|
|
3437
|
+
* ```
|
|
3438
|
+
* compare('10.1.8', '10.0.4', '>'); // return true
|
|
3439
|
+
* compare('10.0.1', '10.0.1', '='); // return true
|
|
3440
|
+
* compare('10.1.1', '10.2.2', '<'); // return true
|
|
3441
|
+
* compare('10.1.1', '10.2.2', '<='); // return true
|
|
3442
|
+
* compare('10.1.1', '10.2.2', '>='); // return false
|
|
3443
|
+
* ```
|
|
3444
|
+
*/
|
|
3445
|
+
const compare = (v1, v2, operator) => {
|
|
3446
|
+
// validate input operator
|
|
3447
|
+
assertValidOperator(operator);
|
|
3448
|
+
// since result of compareVersions can only be -1 or 0 or 1
|
|
3449
|
+
// a simple map can be used to replace switch
|
|
3450
|
+
const res = compareVersions(v1, v2);
|
|
3451
|
+
return operatorResMap[operator].includes(res);
|
|
3452
|
+
};
|
|
3453
|
+
const operatorResMap = {
|
|
3454
|
+
'>': [1],
|
|
3455
|
+
'>=': [0, 1],
|
|
3456
|
+
'=': [0],
|
|
3457
|
+
'<=': [-1, 0],
|
|
3458
|
+
'<': [-1],
|
|
3459
|
+
'!=': [-1, 1],
|
|
3460
|
+
};
|
|
3461
|
+
const allowedOperators = Object.keys(operatorResMap);
|
|
3462
|
+
const assertValidOperator = (op) => {
|
|
3463
|
+
if (typeof op !== 'string') {
|
|
3464
|
+
throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);
|
|
3465
|
+
}
|
|
3466
|
+
if (allowedOperators.indexOf(op) === -1) {
|
|
3467
|
+
throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);
|
|
3468
|
+
}
|
|
3469
|
+
};
|
|
3470
|
+
|
|
3471
|
+
/**
|
|
3472
|
+
* Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.
|
|
3473
|
+
*
|
|
3474
|
+
* @param version Version number to match
|
|
3475
|
+
* @param range Range pattern for version
|
|
3476
|
+
* @returns `true` if the version number is within the range, `false` otherwise.
|
|
3477
|
+
*
|
|
3478
|
+
* @example
|
|
3479
|
+
* ```
|
|
3480
|
+
* satisfies('1.1.0', '^1.0.0'); // return true
|
|
3481
|
+
* satisfies('1.1.0', '~1.0.0'); // return false
|
|
3482
|
+
* ```
|
|
3483
|
+
*/
|
|
3484
|
+
const satisfies = (version, range) => {
|
|
3485
|
+
// clean input
|
|
3486
|
+
range = range.replace(/([><=]+)\s+/g, '$1');
|
|
3487
|
+
// handle multiple comparators
|
|
3488
|
+
if (range.includes('||')) {
|
|
3489
|
+
return range.split('||').some((r) => satisfies(version, r));
|
|
3490
|
+
}
|
|
3491
|
+
else if (range.includes(' - ')) {
|
|
3492
|
+
const [a, b] = range.split(' - ', 2);
|
|
3493
|
+
return satisfies(version, `>=${a} <=${b}`);
|
|
3494
|
+
}
|
|
3495
|
+
else if (range.includes(' ')) {
|
|
3496
|
+
return range
|
|
3497
|
+
.trim()
|
|
3498
|
+
.replace(/\s{2,}/g, ' ')
|
|
3499
|
+
.split(' ')
|
|
3500
|
+
.every((r) => satisfies(version, r));
|
|
3501
|
+
}
|
|
3502
|
+
// if no range operator then "="
|
|
3503
|
+
const m = range.match(/^([<>=~^]+)/);
|
|
3504
|
+
const op = m ? m[1] : '=';
|
|
3505
|
+
// if gt/lt/eq then operator compare
|
|
3506
|
+
if (op !== '^' && op !== '~')
|
|
3507
|
+
return compare(version, range, op);
|
|
3508
|
+
// else range of either "~" or "^" is assumed
|
|
3509
|
+
const [v1, v2, v3, , vp] = validateAndParse(version);
|
|
3510
|
+
const [r1, r2, r3, , rp] = validateAndParse(range);
|
|
3511
|
+
const v = [v1, v2, v3];
|
|
3512
|
+
const r = [r1, r2 !== null && r2 !== void 0 ? r2 : 'x', r3 !== null && r3 !== void 0 ? r3 : 'x'];
|
|
3513
|
+
// validate pre-release
|
|
3514
|
+
if (rp) {
|
|
3515
|
+
if (!vp)
|
|
3516
|
+
return false;
|
|
3517
|
+
if (compareSegments(v, r) !== 0)
|
|
3518
|
+
return false;
|
|
3519
|
+
if (compareSegments(vp.split('.'), rp.split('.')) === -1)
|
|
3520
|
+
return false;
|
|
3521
|
+
}
|
|
3522
|
+
// first non-zero number
|
|
3523
|
+
const nonZero = r.findIndex((v) => v !== '0') + 1;
|
|
3524
|
+
// pointer to where segments can be >=
|
|
3525
|
+
const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;
|
|
3526
|
+
// before pointer must be equal
|
|
3527
|
+
if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0)
|
|
3528
|
+
return false;
|
|
3529
|
+
// after pointer must be >=
|
|
3530
|
+
if (compareSegments(v.slice(i), r.slice(i)) === -1)
|
|
3531
|
+
return false;
|
|
3532
|
+
return true;
|
|
3533
|
+
};
|
|
3534
|
+
|
|
3535
|
+
/**
|
|
3536
|
+
* Validate [semver](https://semver.org/) version strings.
|
|
3537
|
+
*
|
|
3538
|
+
* @param version Version number to validate
|
|
3539
|
+
* @returns `true` if the version number is a valid semver version number, `false` otherwise.
|
|
3540
|
+
*
|
|
3541
|
+
* @example
|
|
3542
|
+
* ```
|
|
3543
|
+
* validate('1.0.0-rc.1'); // return true
|
|
3544
|
+
* validate('1.0-rc.1'); // return false
|
|
3545
|
+
* validate('foo'); // return false
|
|
3546
|
+
* ```
|
|
3547
|
+
*/
|
|
3548
|
+
const validate = (version) => typeof version === 'string' && /^[v\d]/.test(version) && semver.test(version);
|
|
3549
|
+
/**
|
|
3550
|
+
* Validate [semver](https://semver.org/) version strings strictly. Will not accept wildcards and version ranges.
|
|
3551
|
+
*
|
|
3552
|
+
* @param version Version number to validate
|
|
3553
|
+
* @returns `true` if the version number is a valid semver version number `false` otherwise
|
|
3554
|
+
*
|
|
3555
|
+
* @example
|
|
3556
|
+
* ```
|
|
3557
|
+
* validate('1.0.0-rc.1'); // return true
|
|
3558
|
+
* validate('1.0-rc.1'); // return false
|
|
3559
|
+
* validate('foo'); // return false
|
|
3560
|
+
* ```
|
|
3561
|
+
*/
|
|
3562
|
+
const validateStrict = (version) => typeof version === 'string' &&
|
|
3563
|
+
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/.test(version);
|
|
3564
|
+
|
|
3565
|
+
exports.compare = compare;
|
|
3566
|
+
exports.compareVersions = compareVersions;
|
|
3567
|
+
exports.satisfies = satisfies;
|
|
3568
|
+
exports.validate = validate;
|
|
3569
|
+
exports.validateStrict = validateStrict;
|
|
3570
|
+
|
|
3571
|
+
}));
|
|
3572
|
+
|
|
3573
|
+
|
|
3574
|
+
},{}],16:[function(require,module,exports){
|
|
3300
3575
|
(function (global){(function (){
|
|
3301
3576
|
/*!
|
|
3302
3577
|
* howler.js v2.2.1
|
|
@@ -6526,7 +6801,7 @@ function numberIsNaN (obj) {
|
|
|
6526
6801
|
|
|
6527
6802
|
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
6528
6803
|
|
|
6529
|
-
},{}],
|
|
6804
|
+
},{}],17:[function(require,module,exports){
|
|
6530
6805
|
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
6531
6806
|
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
|
|
6532
6807
|
var e, m
|
|
@@ -6613,7 +6888,7 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
|
|
|
6613
6888
|
buffer[offset + i - d] |= s * 128
|
|
6614
6889
|
}
|
|
6615
6890
|
|
|
6616
|
-
},{}],
|
|
6891
|
+
},{}],18:[function(require,module,exports){
|
|
6617
6892
|
// shim for using process in browser
|
|
6618
6893
|
var process = module.exports = {};
|
|
6619
6894
|
|
|
@@ -6799,7 +7074,7 @@ process.chdir = function (dir) {
|
|
|
6799
7074
|
};
|
|
6800
7075
|
process.umask = function() { return 0; };
|
|
6801
7076
|
|
|
6802
|
-
},{}],
|
|
7077
|
+
},{}],19:[function(require,module,exports){
|
|
6803
7078
|
'use strict';
|
|
6804
7079
|
|
|
6805
7080
|
/*! *****************************************************************************
|
|
@@ -7393,4 +7668,4 @@ module.exports = ReconnectingWebSocket;
|
|
|
7393
7668
|
},{}]},{},[6])(6)
|
|
7394
7669
|
});
|
|
7395
7670
|
|
|
7396
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkaXN0L0F1ZGlvUGxheWVyLmpzIiwiZGlzdC9Db2dzQ29ubmVjdGlvbi5qcyIsImRpc3QvUnRzcFN0cmVhbWVyLmpzIiwiZGlzdC9WaWRlb1BsYXllci5qcyIsImRpc3QvaGVscGVycy91cmxzLmpzIiwiZGlzdC9pbmRleC5qcyIsImRpc3QvdHlwZXMvQXVkaW9TdGF0ZS5qcyIsImRpc3QvdHlwZXMvU2hvd1BoYXNlLmpzIiwiZGlzdC90eXBlcy9WaWRlb1N0YXRlLmpzIiwibm9kZV9tb2R1bGVzL0BjbG9ja3dvcmtkb2cvbWVkaWEtc3RyZWFtLWxpYnJhcnktYnJvd3Nlci9kaXN0L2luZGV4LmNqcy5qcyIsIm5vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hvd2xlci9kaXN0L2hvd2xlci5qcyIsIm5vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWNvbm5lY3Rpbmctd2Vic29ja2V0L2Rpc3QvcmVjb25uZWN0aW5nLXdlYnNvY2tldC1janMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBOzs7Ozs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNqdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDenBHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBob3dsZXJfMSA9IHJlcXVpcmUoXCJob3dsZXJcIik7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jb25zdCBERUJVRyA9IGZhbHNlO1xuLy8gQ2hlY2sgYW4gaU9TLW9ubHkgcHJvcGVydHkgKFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTmF2aWdhdG9yI25vbi1zdGFuZGFyZF9wcm9wZXJ0aWVzKVxuY29uc3QgSVNfSU9TID0gdHlwZW9mIG5hdmlnYXRvci5zdGFuZGFsb25lICE9PSAndW5kZWZpbmVkJztcbmNsYXNzIEF1ZGlvUGxheWVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb2dzQ29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIHRoaXMuZ2xvYmFsVm9sdW1lID0gMTtcbiAgICAgICAgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuc2lua0lkID0gJyc7XG4gICAgICAgIC8vIFNlbmQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGVhY2ggY2xpcCB0byBDT0dTXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYXVkaW9DbGlwU3RhdGUnLCAoeyBkZXRhaWwgfSkgPT4ge1xuICAgICAgICAgICAgY29nc0Nvbm5lY3Rpb24uc2VuZE1lZGlhQ2xpcFN0YXRlKGRldGFpbCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIGF1ZGlvIGNvbnRyb2wgbWVzc2FnZXNcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IG1lc3NhZ2UgfSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpYV9jb25maWdfdXBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2xvYmFsVm9sdW1lICE9PSBtZXNzYWdlLmdsb2JhbFZvbHVtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHbG9iYWxWb2x1bWUobWVzc2FnZS5nbG9iYWxWb2x1bWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmF1ZGlvT3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpbmtJZCA9IGNvZ3NDb25uZWN0aW9uLmdldEF1ZGlvU2lua0lkKG1lc3NhZ2UuYXVkaW9PdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdWRpb1Npbmsoc2lua0lkICE9PSBudWxsICYmIHNpbmtJZCAhPT0gdm9pZCAwID8gc2lua0lkIDogJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ29uZmlnKG1lc3NhZ2UuZmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19wbGF5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5QXVkaW9DbGlwKG1lc3NhZ2UuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheUlkOiBtZXNzYWdlLnBsYXlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTogbWVzc2FnZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wOiBCb29sZWFuKG1lc3NhZ2UubG9vcCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWRlOiBtZXNzYWdlLmZhZGUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19wYXVzZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2VBdWRpb0NsaXAobWVzc2FnZS5maWxlLCB7IGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXVkaW9fc3RvcCc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcEF1ZGlvQ2xpcChtZXNzYWdlLmZpbGUsIHsgZmFkZTogbWVzc2FnZS5mYWRlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wQWxsQXVkaW9DbGlwcyh7IGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19zZXRfY2xpcF92b2x1bWUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1ZGlvQ2xpcFZvbHVtZShtZXNzYWdlLmZpbGUsIHsgdm9sdW1lOiBtZXNzYWdlLnZvbHVtZSwgZmFkZTogbWVzc2FnZS5mYWRlIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE9uIGNvbm5lY3Rpb24sIHNlbmQgdGhlIGN1cnJlbnQgcGxheWluZyBzdGF0ZSBvZiBhbGwgY2xpcHNcbiAgICAgICAgLy8gKFVzdWFsbHkgZW1wdHkgdW5sZXNzIHdlYnNvY2tldCBpcyByZWNvbm5lY3RpbmcpXG4gICAgICAgIGNvbnN0IHNlbmRJbml0aWFsQ2xpcFN0YXRlcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gT2JqZWN0LmVudHJpZXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKS5tYXAoKFtmaWxlLCBwbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlQ2xpcHMgPSBPYmplY3QudmFsdWVzKHBsYXllci5hY3RpdmVDbGlwcyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gYWN0aXZlQ2xpcHMuc29tZSgoeyBzdGF0ZSB9KSA9PiBzdGF0ZS50eXBlID09PSAncGxheWluZycgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnR5cGUgPT09ICdzdG9wcGluZycgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3BsYXlfcmVxdWVzdGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAnc3RvcF9yZXF1ZXN0ZWQnKVxuICAgICAgICAgICAgICAgICAgICA/ICdwbGF5aW5nJ1xuICAgICAgICAgICAgICAgICAgICA6IGFjdGl2ZUNsaXBzLnNvbWUoKHsgc3RhdGUgfSkgPT4gc3RhdGUudHlwZSA9PT0gJ3BhdXNlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdwYXVzZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdzdG9wcGVkJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2ZpbGUsIHN0YXR1c107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvZ3NDb25uZWN0aW9uLnNlbmRJbml0aWFsTWVkaWFDbGlwU3RhdGVzKHsgbWVkaWFUeXBlOiAnYXVkaW8nLCBmaWxlcyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHNlbmRJbml0aWFsQ2xpcFN0YXRlcyk7XG4gICAgICAgIHNlbmRJbml0aWFsQ2xpcFN0YXRlcygpO1xuICAgIH1cbiAgICBzZXRHbG9iYWxWb2x1bWUodm9sdW1lKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsVm9sdW1lID0gdm9sdW1lO1xuICAgICAgICBob3dsZXJfMS5Ib3dsZXIudm9sdW1lKHZvbHVtZSk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgcGxheUF1ZGlvQ2xpcChwYXRoLCB7IHBsYXlJZCwgdm9sdW1lLCBmYWRlLCBsb29wIH0pIHtcbiAgICAgICAgbG9nKCdQbGF5aW5nIGNsaXAnLCB7IHBhdGggfSk7XG4gICAgICAgIGlmICghKHBhdGggaW4gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzKSkge1xuICAgICAgICAgICAgbG9nKCdDcmVhdGluZyBlcGhlbWVyYWwgY2xpcCcsIHsgcGF0aCB9KTtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSA9IHRoaXMuY3JlYXRlQ2xpcChwYXRoLCB7IHByZWxvYWQ6IGZhbHNlLCBlcGhlbWVyYWw6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIC8vIFBhdXNlZCBjbGlwcyBuZWVkIHRvIGJlIHBsYXllZCBhZ2FpblxuICAgICAgICAgICAgY29uc3QgcGF1c2VkU291bmRJZHMgPSBPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIHsgc3RhdGUgfV0pID0+IHN0YXRlLnR5cGUgPT09ICdwYXVzZWQnKVxuICAgICAgICAgICAgICAgIC5tYXAoKFtpZF0pID0+IHBhcnNlSW50KGlkKSk7XG4gICAgICAgICAgICBjb25zdCBwYXVzaW5nU291bmRJZHMgPSBPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIHsgc3RhdGUgfV0pID0+IHN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJylcbiAgICAgICAgICAgICAgICAubWFwKChbaWRdKSA9PiBwYXJzZUludChpZCkpO1xuICAgICAgICAgICAgcGF1c2VkU291bmRJZHMuZm9yRWFjaCgoc291bmRJZCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZygnUmVzdW1pbmcgcGF1c2VkIGNsaXAnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5wbGF5KHNvdW5kSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBDbGlwcyB3aXRoIHBhdXNlIHJlcXVlc3RlZCBubyBsb25nZXIgbmVlZCB0byBwYXVzZSwgdGhleSBjYW4gY29udGludWUgcGxheWluZyBub3dcbiAgICAgICAgICAgIGNvbnN0IHBhdXNlUmVxdWVzdGVkU291bmRJZHMgPSBPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIHsgc3RhdGUgfV0pID0+IHN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnKVxuICAgICAgICAgICAgICAgIC5tYXAoKFtpZF0pID0+IHBhcnNlSW50KGlkKSk7XG4gICAgICAgICAgICAvLyBJZiBubyBjdXJyZW50bHkgcGF1c2VkL3BhdXNpbmcvcGF1c2VfcmVxdWVzdGVkIGNsaXBzLCBwbGF5IGEgbmV3IGNsaXBcbiAgICAgICAgICAgIGNvbnN0IG5ld1NvdW5kSWRzID0gcGF1c2VkU291bmRJZHMubGVuZ3RoID4gMCB8fCBwYXVzaW5nU291bmRJZHMubGVuZ3RoID4gMCB8fCBwYXVzZVJlcXVlc3RlZFNvdW5kSWRzLmxlbmd0aCA+IDAgPyBbXSA6IFtjbGlwUGxheWVyLnBsYXllci5wbGF5KCldO1xuICAgICAgICAgICAgLy8gUGF1c2luZyBjbGlwcyBhcmUgdGVjaG5pY2FsbHkgY3VycmVudGx5IHBsYXlpbmcgYXMgZmFyIGFzIEhvd2xlciBpcyBjb25jZXJuZWRcbiAgICAgICAgICAgIHBhdXNpbmdTb3VuZElkcy5mb3JFYWNoKChzb3VuZElkKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nKCdTdG9wcGluZyBmYWRlIGFuZCByZXN1bWluZyBwYXVzaW5nIGNsaXAnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBmYWRlIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdmYWRlJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgbG9vcCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLmxvb3AobG9vcCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHN0YXRlIHRvICdwbGF5aW5nJ1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlQXVkaW9DbGlwKHBhdGgsIHNvdW5kSWQsIChjbGlwKSA9PiAoeyAuLi5jbGlwLCBzdGF0ZTogeyB0eXBlOiAncGxheWluZycgfSB9KSk7XG4gICAgICAgICAgICAgICAgLy8gU2V0IHZvbHVtZSwgb3Igc3RhcnQgYSBuZXcgZmFkZVxuICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmYWRlIHdoZW4gY2xpcCBzdGFydHNcbiAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gcGF1c2VkIGFuZCBwYXVzZV9yZXF1ZXN0ZWQgY2xpcHMgdHJlYXRlZCB0aGUgc2FtZSwgdGhleSBzaG91bGQgaGF2ZSB0aGVpciBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAvLyB1cGRhdGVkIHdpdGggdGhlIGxhdGVzdCBwbGF5IGFjdGlvbidzIHByb3BlcnRpZXNcbiAgICAgICAgICAgIFsuLi5wYXVzZWRTb3VuZElkcywgLi4ucGF1c2VSZXF1ZXN0ZWRTb3VuZElkcywgLi4ubmV3U291bmRJZHNdLmZvckVhY2goKHNvdW5kSWQpID0+IHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5sb29wKGxvb3AsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIENsZWFudXAgYW55IG9sZCBjYWxsYmFja3MgZmlyc3RcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ3BsYXknLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZigncGF1c2UnLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZignZmFkZScsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdlbmQnLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZignc3RvcCcsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gTm9uLXByZWxvYWRlZCBjbGlwcyBkb24ndCB5ZXQgaGF2ZSBhbiBIVE1MIGF1ZGlvIG5vZGVcbiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHNldCB0aGUgYXVkaW8gb3V0cHV0IHdoZW4gaXQncyBwbGF5aW5nXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgncGxheScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UGxheWVyU2lua0lkKGNsaXBQbGF5ZXIucGxheWVyLCB0aGlzLnNpbmtJZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgnc3RvcCcsICgpID0+IHRoaXMuaGFuZGxlU3RvcHBlZENsaXAocGF0aCwgcGxheUlkLCBzb3VuZElkKSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gTG9vcGluZyBjbGlwcyBmaXJlIHRoZSAnZW5kJyBjYWxsYmFjayBvbiBldmVyeSBsb29wXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBpZiAoISgoX2EgPSBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzW3NvdW5kSWRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubG9vcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcHBlZENsaXAocGF0aCwgcGxheUlkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUNsaXAgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXlJZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHsgdHlwZTogJ3BsYXlfcmVxdWVzdGVkJyB9LFxuICAgICAgICAgICAgICAgICAgICBsb29wLFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gcGxheV9yZXF1ZXN0ZWQnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBPbmNlIGNsaXAgc3RhcnRzLCBjaGVjayBpZiBpdCBzaG91bGQgYWN0dWFsbHkgYmUgcGF1c2VkIG9yIHN0b3BwZWRcbiAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHRoZW4gdXBkYXRlIHN0YXRlIHRvICdwbGF5aW5nJ1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpcFN0YXRlID0gKF9hID0gY2xpcFBsYXllci5hY3RpdmVDbGlwc1tzb3VuZElkXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGNsaXBTdGF0ZSA9PT0gbnVsbCB8fCBjbGlwU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsaXBTdGF0ZS50eXBlKSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ2xpcCBzdGFydGVkIHBsYXlpbmcgYnV0IHNob3VsZCBiZSBwYXVzZWQnLCB7IHBhdGgsIHNvdW5kSWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdXNlQXVkaW9DbGlwKHBhdGgsIHsgZmFkZTogY2xpcFN0YXRlLmZhZGUgfSwgc291bmRJZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsaXBTdGF0ZSA9PT0gbnVsbCB8fCBjbGlwU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsaXBTdGF0ZS50eXBlKSA9PT0gJ3N0b3BfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDbGlwIHN0YXJ0ZWQgcGxheWluZyBidXQgc2hvdWxkIGJlIHN0b3BwZWQnLCB7IHBhdGgsIHNvdW5kSWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BBdWRpb0NsaXAocGF0aCwgeyBmYWRlOiBjbGlwU3RhdGUuZmFkZSB9LCBzb3VuZElkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBwbGF5aW5nJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUF1ZGlvQ2xpcChwYXRoLCBzb3VuZElkLCAoY2xpcCkgPT4gKHsgLi4uY2xpcCwgc3RhdGU6IHsgdHlwZTogJ3BsYXlpbmcnIH0gfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gVG8gZmFkZSBvciB0byBubyBmYWRlP1xuICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmYWRlIHdoZW4gY2xpcCBzdGFydHNcbiAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIudm9sdW1lKDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5tdXRlKGZhbHNlLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgncGxheScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhZGVBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRyYWNrIG5ldy91cGRhdGVkIGFjdGl2ZSBjbGlwXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5hY3RpdmVDbGlwcyA9IHsgLi4uY2xpcFBsYXllci5hY3RpdmVDbGlwcywgW3NvdW5kSWRdOiBhY3RpdmVDbGlwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAncGxheWluZycpO1xuICAgIH1cbiAgICBwYXVzZUF1ZGlvQ2xpcChwYXRoLCB7IGZhZGUgfSwgb25seVNvdW5kSWQsIGFsbG93SWZQYXVzZVJlcXVlc3RlZCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAvLyBObyBhY3RpdmUgY2xpcHMgdG8gcGF1c2VcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKChfYiA9IChfYSA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjdGl2ZUNsaXBzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcykubWFwKChbc291bmRJZFN0ciwgY2xpcF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VuZElkID0gcGFyc2VJbnQoc291bmRJZFN0cik7XG4gICAgICAgICAgICAgICAgLy8gSWYgb25seVNvdW5kSWQgc3BlY2lmaWVkLCBvbmx5IHVwZGF0ZSB0aGF0IGNsaXBcbiAgICAgICAgICAgICAgICBpZiAob25seVNvdW5kSWQgPT09IHVuZGVmaW5lZCB8fCBvbmx5U291bmRJZCA9PT0gc291bmRJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGFsbG93SWZQYXVzZVJlcXVlc3RlZCAmJiBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnKSB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5aW5nJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFkZSB0aGVuIHBhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgnZmFkZScsIChzb3VuZElkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnBhdXNlKHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gcGF1c2VkIChhZnRlciBmYWRlKScsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUF1ZGlvQ2xpcChwYXRoLCBzb3VuZElkLCAoY2xpcCkgPT4gKHsgLi4uY2xpcCwgc3RhdGU6IHsgdHlwZTogJ3BhdXNlZCcgfSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKGNsaXAucGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCAwLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDTElQIC0+IHBhdXNpbmcnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAncGF1c2luZycgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIG5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnBhdXNlKHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBwYXVzZWQnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAncGF1c2VkJyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKGNsaXAucGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xpcCBoYXNuJ3Qgc3RhcnRlZCBwbGF5aW5nIHlldCwgb3IgaGFzIGFscmVhZHkgaGFkIHBhdXNlX3JlcXVlc3RlZCAoYnV0IGZhZGUgbWF5IGhhdmUgY2hhbmdlZCBzbyB1cGRhdGUgaGVyZSlcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2xpcC5zdGF0ZS50eXBlID09PSAncGxheV9yZXF1ZXN0ZWQnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBwYXVzZV9yZXF1ZXN0ZWQnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdwYXVzZV9yZXF1ZXN0ZWQnLCBmYWRlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtzb3VuZElkU3RyLCBjbGlwXTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RvcEF1ZGlvQ2xpcChwYXRoLCB7IGZhZGUgfSwgb25seVNvdW5kSWQsIGFsbG93SWZTdG9wUmVxdWVzdGVkKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBsb2coJ1N0b3AgYXVkaW8gY2xpcCcsIHsgYWN0aXZlQ2xpcHM6IChfYSA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjdGl2ZUNsaXBzIH0pO1xuICAgICAgICAvLyBObyBhY3RpdmUgY2xpcHMgdG8gc3RvcFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoKF9jID0gKF9iID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuYWN0aXZlQ2xpcHMpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgY2xpcFBsYXllci5hY3RpdmVDbGlwcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKS5tYXAoKFtzb3VuZElkU3RyLCBjbGlwXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kSWQgPSBwYXJzZUludChzb3VuZElkU3RyKTtcbiAgICAgICAgICAgICAgICAvLyBJZiBvbmx5U291bmRJZCBzcGVjaWZpZWQsIG9ubHkgdXBkYXRlIHRoYXQgY2xpcFxuICAgICAgICAgICAgICAgIGlmIChvbmx5U291bmRJZCA9PT0gdW5kZWZpbmVkIHx8IG9ubHlTb3VuZElkID09PSBzb3VuZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYWxsb3dJZlN0b3BSZXF1ZXN0ZWQgJiYgY2xpcC5zdGF0ZS50eXBlID09PSAnc3RvcF9yZXF1ZXN0ZWQnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZS50eXBlID09PSAncGxheWluZycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlLnR5cGUgPT09ICdzdG9wcGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSAmJiBjbGlwLnN0YXRlLnR5cGUgIT09ICdwYXVzZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbnkgb2xkIGZhZGUgY2FsbGJhY2tzIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGNhc3Qgb25jZSBodHRwczovL2dpdGh1Yi5jb20vRGVmaW5pdGVseVR5cGVkL0RlZmluaXRlbHlUeXBlZC9wdWxsLzU5NDExIGlzIG1lcmdlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZignZmFkZScsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhZGVBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgMCwgZmFkZSAqIDEwMDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBjYWxsYmFjayBhZnRlciBzdGFydGluZyBuZXcgZmFkZSwgb3RoZXJ3aXNlIGl0IHdpbGwgZmlyZSBzdHJhaWdodCBhd2F5IGFzIHRoZSBwcmV2aW91cyBmYWRlIGlzIGNhbmNlbGxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ2ZhZGUnLCAoc291bmRJZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5sb29wKGZhbHNlLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIuc3RvcChzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gc3RvcHBpbmcnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAnc3RvcHBpbmcnIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1N0b3AgY2xpcCcsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLmxvb3AoZmFsc2UsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnN0b3Aoc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xpcCBoYXNuJ3Qgc3RhcnRlZCBwbGF5aW5nIHlldCwgb3IgaGFzIGFscmVhZHkgaGFkIHN0b3BfcmVxdWVzdGVkIChidXQgZmFkZSBtYXkgaGF2ZSBjaGFuZ2VkIHNvIHVwZGF0ZSBoZXJlKVxuICAgICAgICAgICAgICAgICAgICAvLyBvciBoYXMgcGF1c2VfcmVxdWVzdGVkLCBidXQgc3RvcCB0YWtlcyBwcmVjZWRlbmNlXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlfcmVxdWVzdGVkJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3N0b3BfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKFwiVHJ5aW5nIHRvIHN0b3AgY2xpcCB3aGljaCBoYXNuJ3Qgc3RhcnRlZCBwbGF5aW5nIHlldFwiLCB7IHBhdGgsIHNvdW5kSWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gc3RvcF9yZXF1ZXN0ZWQnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdzdG9wX3JlcXVlc3RlZCcsIGZhZGUgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gW3NvdW5kSWRTdHIsIGNsaXBdO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdG9wQWxsQXVkaW9DbGlwcyhvcHRpb25zKSB7XG4gICAgICAgIGxvZygnU3RvcHBpbmcgYWxsIGNsaXBzJyk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuYXVkaW9DbGlwUGxheWVycykuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9wQXVkaW9DbGlwKHBhdGgsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0QXVkaW9DbGlwVm9sdW1lKHBhdGgsIHsgdm9sdW1lLCBmYWRlIH0pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKCEodm9sdW1lID49IDAgJiYgdm9sdW1lIDw9IDEpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdm9sdW1lJywgdm9sdW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBhY3RpdmUgY2xpcHMgdG8gc2V0IHZvbHVtZSBmb3JcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKChfYiA9IChfYSA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjdGl2ZUNsaXBzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcykubWFwKChbc291bmRJZFN0ciwgY2xpcF0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmVkIGZvciBwYXVzaW5nL3N0b3BwaW5nIGluc3RhbmNlc1xuICAgICAgICAgICAgICAgIGlmIChjbGlwLnN0YXRlLnR5cGUgIT09ICdwYXVzaW5nJyAmJiBjbGlwLnN0YXRlLnR5cGUgIT09ICdzdG9wcGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRJZCA9IHBhcnNlSW50KHNvdW5kSWRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWRlVmFsaWQoZmFkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhZGVBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3NvdW5kSWRTdHIsIHsgLi4uY2xpcCwgdm9sdW1lIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtzb3VuZElkU3RyLCBjbGlwXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhbmRsZVN0b3BwZWRDbGlwKHBhdGgsIHBsYXlJZCwgc291bmRJZCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNbc291bmRJZF07XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgcGF0aCwgJ3N0b3BwZWQnKTtcbiAgICB9XG4gICAgdXBkYXRlQWN0aXZlQXVkaW9DbGlwKHBhdGgsIHNvdW5kSWQsIHVwZGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4gc291bmRJZCBpbiBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzXG4gICAgICAgICAgICA/IHsgLi4uY2xpcFBsYXllciwgYWN0aXZlQ2xpcHM6IHsgLi4uY2xpcFBsYXllci5hY3RpdmVDbGlwcywgW3NvdW5kSWRdOiB1cGRhdGUoY2xpcFBsYXllci5hY3RpdmVDbGlwc1tzb3VuZElkXSkgfSB9XG4gICAgICAgICAgICA6IGNsaXBQbGF5ZXIpO1xuICAgIH1cbiAgICB1cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgdXBkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHBhdGggaW4gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvQ2xpcFBsYXllcnMgPSB7IC4uLnRoaXMuYXVkaW9DbGlwUGxheWVycywgW3BhdGhdOiB1cGRhdGUodGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdKSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIE9uY2UgbGFzdCBpbnN0YW5jZSBvZiBhbiBlcGhlbWVyYWwgY2xpcCBpcyByZW1vdmVkLCBjbGVhbnVwIGFuZCByZW1vdmUgdGhlIHBsYXllclxuICAgICAgICBjb25zdCBjbGlwUGxheWVyID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdO1xuICAgICAgICBpZiAoY2xpcFBsYXllciAmJiBPYmplY3Qua2V5cygoX2EgPSBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSkubGVuZ3RoID09PSAwICYmIGNsaXBQbGF5ZXIuY29uZmlnLmVwaGVtZXJhbCkge1xuICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIudW5sb2FkKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgc2V0QXVkaW9TaW5rKHNpbmtJZCkge1xuICAgICAgICBsb2coYFNldHRpbmcgc2luayBJRCBmb3IgYWxsIGNsaXBzOmAsIHNpbmtJZCk7XG4gICAgICAgIGZvciAoY29uc3QgY2xpcFBsYXllciBvZiBPYmplY3QudmFsdWVzKHRoaXMuYXVkaW9DbGlwUGxheWVycykpIHtcbiAgICAgICAgICAgIHNldFBsYXllclNpbmtJZChjbGlwUGxheWVyLnBsYXllciwgc2lua0lkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNpbmtJZCA9IHNpbmtJZDtcbiAgICB9XG4gICAgdXBkYXRlQ29uZmlnKG5ld0ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG5ld0F1ZGlvRmlsZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobmV3RmlsZXMpLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGZpbGVbMV0udHlwZTtcbiAgICAgICAgICAgIC8vIENPR1MgNC42IGRpZCBub3Qgc2VuZCBhIGB0eXBlYCBidXQgb25seSByZXBvcnRlZCBhdWRpbyBmaWxlc1xuICAgICAgICAgICAgLy8gc28gd2UgYXNzdW1lIGF1ZGlvIGlmIG5vIGB0eXBlYCBpcyBnaXZlblxuICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09ICdhdWRpbycgfHwgIXR5cGU7XG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNDbGlwUGxheWVycyA9IHRoaXMuYXVkaW9DbGlwUGxheWVycztcbiAgICAgICAgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzID0gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsaXBQbGF5ZXJzID0geyAuLi5wcmV2aW91c0NsaXBQbGF5ZXJzIH07XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkQ2xpcHMgPSBPYmplY3Qua2V5cyhwcmV2aW91c0NsaXBQbGF5ZXJzKS5maWx0ZXIoKHByZXZpb3VzRmlsZSkgPT4gIShwcmV2aW91c0ZpbGUgaW4gbmV3QXVkaW9GaWxlcykgJiYgIXByZXZpb3VzQ2xpcFBsYXllcnNbcHJldmlvdXNGaWxlXS5jb25maWcuZXBoZW1lcmFsKTtcbiAgICAgICAgICAgIHJlbW92ZWRDbGlwcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxheWVyID0gcHJldmlvdXNDbGlwUGxheWVyc1tmaWxlXS5wbGF5ZXI7XG4gICAgICAgICAgICAgICAgcGxheWVyLnVubG9hZCgpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjbGlwUGxheWVyc1tmaWxlXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYWRkZWRDbGlwcyA9IE9iamVjdC5lbnRyaWVzKG5ld0F1ZGlvRmlsZXMpLmZpbHRlcigoW25ld2ZpbGVdKSA9PiAhcHJldmlvdXNDbGlwUGxheWVyc1tuZXdmaWxlXSk7XG4gICAgICAgICAgICBhZGRlZENsaXBzLmZvckVhY2goKFtwYXRoLCBjb25maWddKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLmNyZWF0ZUNsaXAocGF0aCwgeyAuLi5jb25maWcsIGVwaGVtZXJhbDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRDbGlwcyA9IE9iamVjdC5rZXlzKHByZXZpb3VzQ2xpcFBsYXllcnMpLmZpbHRlcigocHJldmlvdXNGaWxlKSA9PiBwcmV2aW91c0ZpbGUgaW4gbmV3QXVkaW9GaWxlcyk7XG4gICAgICAgICAgICB1cGRhdGVkQ2xpcHMuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXJzW3BhdGhdID0gdGhpcy51cGRhdGVkQ2xpcChwYXRoLCBjbGlwUGxheWVyc1twYXRoXSwgeyAuLi5uZXdBdWRpb0ZpbGVzW3BhdGhdLCBlcGhlbWVyYWw6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcnM7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgbm90aWZ5U3RhdGVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIGNvbnN0IGNsaXBzID0gT2JqZWN0LmVudHJpZXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKS5yZWR1Y2UoKGNsaXBzLCBbcGF0aCwgY2xpcFBsYXllcl0pID0+IHtcbiAgICAgICAgICAgIGNsaXBzW3BhdGhdID0ge1xuICAgICAgICAgICAgICAgIGNvbmZpZzogeyBwcmVsb2FkOiBjbGlwUGxheWVyLmNvbmZpZy5wcmVsb2FkLCBlcGhlbWVyYWw6IGNsaXBQbGF5ZXIuY29uZmlnLmVwaGVtZXJhbCB9LFxuICAgICAgICAgICAgICAgIGFjdGl2ZUNsaXBzOiBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwcztcbiAgICAgICAgfSwge30pO1xuICAgICAgICBjb25zdCBpc1BsYXlpbmcgPSBPYmplY3QudmFsdWVzKHRoaXMuYXVkaW9DbGlwUGxheWVycykuc29tZSgoeyBhY3RpdmVDbGlwcyB9KSA9PiBPYmplY3QudmFsdWVzKGFjdGl2ZUNsaXBzKS5zb21lKChjbGlwKSA9PiBjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5aW5nJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdzdG9wcGluZycpKTtcbiAgICAgICAgY29uc3QgYXVkaW9TdGF0ZSA9IHtcbiAgICAgICAgICAgIGdsb2JhbFZvbHVtZTogdGhpcy5nbG9iYWxWb2x1bWUsXG4gICAgICAgICAgICBpc1BsYXlpbmcsXG4gICAgICAgICAgICBjbGlwcyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdzdGF0ZScsIGF1ZGlvU3RhdGUpO1xuICAgIH1cbiAgICBub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBmaWxlLCBzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdhdWRpb0NsaXBTdGF0ZScsIHsgbWVkaWFUeXBlOiAnYXVkaW8nLCBwbGF5SWQsIGZpbGUsIHN0YXR1cyB9KTtcbiAgICB9XG4gICAgLy8gVHlwZS1zYWZlIHdyYXBwZXIgYXJvdW5kIEV2ZW50VGFyZ2V0XG4gICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGRpc3BhdGNoRXZlbnQodHlwZSwgZGV0YWlsKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQodHlwZSwgeyBkZXRhaWwgfSkpO1xuICAgIH1cbiAgICBjcmVhdGVQbGF5ZXIocGF0aCwgY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBob3dsZXJfMS5Ib3dsKHtcbiAgICAgICAgICAgIHNyYzogKDAsIHVybHNfMS5hc3NldFVybCkocGF0aCksXG4gICAgICAgICAgICBhdXRvcGxheTogZmFsc2UsXG4gICAgICAgICAgICBsb29wOiBmYWxzZSxcbiAgICAgICAgICAgIHZvbHVtZTogMSxcbiAgICAgICAgICAgIGh0bWw1OiB0cnVlLFxuICAgICAgICAgICAgcHJlbG9hZDogY29uZmlnLnByZWxvYWQsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRQbGF5ZXJTaW5rSWQocGxheWVyLCB0aGlzLnNpbmtJZCk7XG4gICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuICAgIGNyZWF0ZUNsaXAoZmlsZSwgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBwbGF5ZXI6IHRoaXMuY3JlYXRlUGxheWVyKGZpbGUsIGNvbmZpZyksXG4gICAgICAgICAgICBhY3RpdmVDbGlwczoge30sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZWRDbGlwKGNsaXBQYXRoLCBwcmV2aW91c0NsaXAsIG5ld0NvbmZpZykge1xuICAgICAgICBjb25zdCBjbGlwID0geyAuLi5wcmV2aW91c0NsaXAsIGNvbmZpZzogbmV3Q29uZmlnIH07XG4gICAgICAgIGlmIChwcmV2aW91c0NsaXAuY29uZmlnLnByZWxvYWQgIT09IG5ld0NvbmZpZy5wcmVsb2FkKSB7XG4gICAgICAgICAgICBjbGlwLnBsYXllci51bmxvYWQoKTtcbiAgICAgICAgICAgIGNsaXAucGxheWVyID0gdGhpcy5jcmVhdGVQbGF5ZXIoY2xpcFBhdGgsIG5ld0NvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsaXA7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQXVkaW9QbGF5ZXI7XG5mdW5jdGlvbiBsb2coLi4uZGF0YSkge1xuICAgIGlmIChERUJVRykge1xuICAgICAgICBjb25zb2xlLmxvZyguLi5kYXRhKTtcbiAgICB9XG59XG4vKipcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIHRoaXMgYSB2YWxpZCBmYWRlIGR1cmF0aW9uLiBBbHdheXMgcmV0dXJucyBgZmFsc2VgIG9uIGlPU1xuICovXG5mdW5jdGlvbiBpc0ZhZGVWYWxpZChmYWRlKSB7XG4gICAgcmV0dXJuICFJU19JT1MgJiYgdHlwZW9mIGZhZGUgPT09ICdudW1iZXInICYmICFpc05hTihmYWRlKSAmJiBmYWRlID4gMDtcbn1cbmZ1bmN0aW9uIHNldFBsYXllclNpbmtJZChwbGF5ZXIsIHNpbmtJZCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoc2lua0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGxheWVyLl9odG1sNSkge1xuICAgICAgICAoX2EgPSBwbGF5ZXIuX3NvdW5kcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvckVhY2goKHNvdW5kKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgKF9iID0gKF9hID0gc291bmQuX25vZGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRTaW5rSWQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBzaW5rSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSB3ZWIgYXVkaW9cbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5ub3Qgc2V0IHNpbmsgSUQ6IHdlYiBhdWRpbyBub3Qgc3VwcG9ydGVkJywgcGxheWVyKTtcbiAgICB9XG59XG4vKipcbiAqIFNldCBhdWRpbyB2b2x1bWVcbiAqXG4gKiBUaGlzIGRvZXNuJ3Qgd29yayBvbiBpT1MgKHZvbHVtZSBpcyByZWFkLW9ubHkpIHNvIGF0IGxlYXN0IG11dGUgaXQgaWYgdGhlIHZvbHVtZSBpcyB6ZXJvXG4gKi9cbmZ1bmN0aW9uIHNldEF1ZGlvUGxheWVyVm9sdW1lKGhvd2wsIHZvbHVtZSwgc291bmRJZCkge1xuICAgIGhvd2wudm9sdW1lKHZvbHVtZSwgc291bmRJZCk7XG4gICAgaG93bC5tdXRlKHZvbHVtZSA9PT0gMCwgc291bmRJZCk7XG59XG4vKipcbiAqIEZhZGUgdG8gYXVkaW8gdm9sdW1lXG4gKlxuICogTm90ZTogVGhpcyBkb2Vzbid0IHdvcmsgb24gaU9TICh2b2x1bWUgaXMgcmVhZC1vbmx5KVxuICovXG5mdW5jdGlvbiBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoaG93bCwgdm9sdW1lLCBmYWRlLCBzb3VuZElkKSB7XG4gICAgaG93bC5mYWRlKGhvd2wudm9sdW1lKHNvdW5kSWQpLCB2b2x1bWUsIGZhZGUsIHNvdW5kSWQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNvZ3NJbmNvbWluZ0V2ZW50ID0gZXhwb3J0cy5Db2dzU3RhdGVDaGFuZ2VkRXZlbnQgPSBleHBvcnRzLkNvZ3NDb25maWdDaGFuZ2VkRXZlbnQgPSBleHBvcnRzLkNvZ3NNZXNzYWdlRXZlbnQgPSBleHBvcnRzLkNvZ3NDb25uZWN0aW9uQ2xvc2VFdmVudCA9IGV4cG9ydHMuQ29nc0Nvbm5lY3Rpb25PcGVuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCBTaG93UGhhc2VfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlcy9TaG93UGhhc2VcIikpO1xuY29uc3QgcmVjb25uZWN0aW5nX3dlYnNvY2tldF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJyZWNvbm5lY3Rpbmctd2Vic29ja2V0XCIpKTtcbmNvbnN0IHVybHNfMSA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvdXJsc1wiKTtcbmNsYXNzIENvZ3NDb25uZWN0aW9uIHtcbiAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmN1cnJlbnRDb25maWcgfTtcbiAgICB9XG4gICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmN1cnJlbnRTdGF0ZSB9O1xuICAgIH1cbiAgICBnZXQgc2hvd1BoYXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd1BoYXNlO1xuICAgIH1cbiAgICBnZXQgdGltZXJTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVyU3RhdGUgPyB7IC4uLnRoaXMuX3RpbWVyU3RhdGUgfSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBzZWxlY3RlZEF1ZGlvT3V0cHV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBdWRpb091dHB1dDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IobWFuaWZlc3QsIHsgaG9zdG5hbWUgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSwgcG9ydCA9IHVybHNfMS5DT0dTX1NFUlZFUl9QT1JUIH0gPSB7fSwgaW5pdGlhbENsaWVudFN0YXRlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0O1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIHRoaXMuY3VycmVudENvbmZpZyA9IHt9OyAvLyBSZWNlaXZlZCBvbiBvcGVuIGNvbm5lY3Rpb25cbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uIC0gVE9ETzogc2V0IGluaXRpYWwgc3RhdGUgZnJvbSBtYW5pZmVzdD9cbiAgICAgICAgdGhpcy5fc2hvd1BoYXNlID0gU2hvd1BoYXNlXzEuZGVmYXVsdC5TZXR1cDtcbiAgICAgICAgdGhpcy5fdGltZXJTdGF0ZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWNoZWQgYXVkaW8gb3V0cHV0cyB1c2UgdG8gbG9vayB1cCB0aGUgZGV2aWNlL3NpbmsgSUQgd2hlbiBhIGRpZmZlcmVudCBkZXZpY2UgbGFiZWwgaXMgcmVxdWVzdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1ZGlvT3V0cHV0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRBdWRpb091dHB1dCA9ICcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHsgLi4uaW5pdGlhbENsaWVudFN0YXRlIH07XG4gICAgICAgIGNvbnN0IHsgdXNlUmVjb25uZWN0aW5nV2Vic29ja2V0LCBwYXRoLCBwYXRoUGFyYW1zIH0gPSB3ZWJzb2NrZXRQYXJhbWV0ZXJzRnJvbVVybChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3Qgc29ja2V0VXJsID0gYHdzOi8vJHtob3N0bmFtZX06JHtwb3J0fSR7cGF0aH0ke3BhdGhQYXJhbXMgPyAnPycgKyBwYXRoUGFyYW1zIDogJyd9YDtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQgPSB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQgPyBuZXcgcmVjb25uZWN0aW5nX3dlYnNvY2tldF8xLmRlZmF1bHQoc29ja2V0VXJsKSA6IG5ldyBXZWJTb2NrZXQoc29ja2V0VXJsKTtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0ge307IC8vIFJlY2VpdmVkIG9uIG9wZW4gY29ubmVjdGlvblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENvZ3NDb25uZWN0aW9uT3BlbkV2ZW50KCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZSk7IC8vIFRPRE86IFJlbW92ZSB0aGlzIGJlY2F1c2UgeW91IHNob3VsZCBzZXQgaXQgbWFudWFsbHkuLi4/P1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLndlYnNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDb2dzQ29ubmVjdGlvbkNsb3NlRXZlbnQoKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2Vic29ja2V0Lm9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSBwYXJzZWQuY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDb2dzQ29uZmlnQ2hhbmdlZEV2ZW50KHRoaXMuY3VycmVudENvbmZpZykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlZC51cGRhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUsIC4uLnBhcnNlZC51cGRhdGVzIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENvZ3NTdGF0ZUNoYW5nZWRFdmVudChwYXJzZWQudXBkYXRlcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlZC5ldmVudCAmJiBwYXJzZWQuZXZlbnQua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENvZ3NJbmNvbWluZ0V2ZW50KHBhcnNlZC5ldmVudC5rZXksIHBhcnNlZC5ldmVudC52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwYXJzZWQubWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBwYXJzZWQubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWRqdXN0YWJsZV90aW1lcl91cGRhdGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1lclN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25NaWxsaXM6IG1lc3NhZ2UuZHVyYXRpb25NaWxsaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNraW5nOiBtZXNzYWdlLnRpY2tpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Nob3dfcGhhc2UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaG93UGhhc2UgPSBtZXNzYWdlLnBoYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ29nc01lc3NhZ2VFdmVudChtZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBoYW5kbGluZyBkYXRhJywgZGF0YSwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gcGFyc2UgaW5jb21pbmcgZGF0YSBmcm9tIHNlcnZlcicsIGRhdGEsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBTZW5kIGEgbGlzdCBvZiBhdWRpbyBvdXRwdXRzIHRvIENPR1MgYW5kIGtlZXAgaXQgdXAgdG8gZGF0ZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCByZWZyZXNoQXVkaW9PdXRwdXRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzYCBpcyB1bmRlZmluZWQgb24gQ09HUyBBViA8PSA0LjUgYmVjYXVzZSBvZiBzZWN1cmUgb3JpZ2luIHBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5tZWRpYURldmljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9PdXRwdXRzID0gKGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpKS5maWx0ZXIoKHsga2luZCB9KSA9PiBraW5kID09PSAnYXVkaW9vdXRwdXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kQXVkaW9PdXRwdXRzKGF1ZGlvT3V0cHV0cyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9PdXRwdXRzID0gYXVkaW9PdXRwdXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCByZWZyZXNoQXVkaW9PdXRwdXRzKTtcbiAgICAgICAgICAgIChfYSA9IG5hdmlnYXRvci5tZWRpYURldmljZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VjaGFuZ2UnLCByZWZyZXNoQXVkaW9PdXRwdXRzKTtcbiAgICAgICAgICAgIHJlZnJlc2hBdWRpb091dHB1dHMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTjtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMud2Vic29ja2V0LmNsb3NlKCk7XG4gICAgfVxuICAgIHNlbmRFdmVudChldmVudE5hbWUsIC4uLltldmVudFZhbHVlXSkge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBldmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBldmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0U3RhdGUodmFsdWVzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZSwgLi4udmFsdWVzIH07XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgdXBkYXRlczogdmFsdWVzIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBdWRpb1NpbmtJZChhdWRpb091dHB1dCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gYXVkaW9PdXRwdXQgPyAoX2IgPSAoX2EgPSB0aGlzLmF1ZGlvT3V0cHV0cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbmQoKHsgbGFiZWwgfSkgPT4gbGFiZWwgPT09IGF1ZGlvT3V0cHV0KSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRldmljZUlkIDogJyc7XG4gICAgfVxuICAgIHNlbmRJbml0aWFsTWVkaWFDbGlwU3RhdGVzKGFsbE1lZGlhQ2xpcFN0YXRlcykge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IGFsbE1lZGlhQ2xpcFN0YXRlcyB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VuZE1lZGlhQ2xpcFN0YXRlKG1lZGlhQ2xpcFN0YXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgbWVkaWFDbGlwU3RhdGUgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNlbmRBdWRpb091dHB1dHMoYXVkaW9PdXRwdXRzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgYXVkaW9PdXRwdXRzIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93IG9yIGhpZGUgdGhlIHBsdWdpbiB3aW5kb3cuXG4gICAgICogQHBhcmFtIHZpc2libGUgV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIHdpbmRvd1xuICAgICAqIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgcGx1Z2lucywgbm90IGZvciBNZWRpYSBNYXN0ZXIgY29udGVudC5cbiAgICAgKi9cbiAgICBzZXRQbHVnaW5XaW5kb3dWaXNpYmxlKHZpc2libGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB3aW5kb3c6IHsgdmlzaWJsZSB9IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUeXBlLXNhZmUgd3JhcHBlciBhcm91bmQgRXZlbnRUYXJnZXRcbiAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcGF0Y2hFdmVudChldmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IENvZ3NDb25uZWN0aW9uO1xuZnVuY3Rpb24gd2Vic29ja2V0UGFyYW1ldGVyc0Zyb21VcmwodXJsKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgY29uc3QgcGF0aFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyc2VkVXJsLnNlYXJjaFBhcmFtcyk7XG4gICAgY29uc3QgbG9jYWxDbGllbnRJZCA9IHBhdGhQYXJhbXMuZ2V0KCdsb2NhbF9pZCcpO1xuICAgIGNvbnN0IGlzU2ltdWxhdG9yID0gcGF0aFBhcmFtcy5nZXQoJ3NpbXVsYXRvcicpID09PSAndHJ1ZSc7XG4gICAgY29uc3QgZGlzcGxheSA9IChfYSA9IHBhdGhQYXJhbXMuZ2V0KCdkaXNwbGF5JykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIGNvbnN0IHBsdWdpbklkID0gcGFyc2VkVXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9wbHVnaW4vJykgPyBkZWNvZGVVUklDb21wb25lbnQocGFyc2VkVXJsLnBhdGhuYW1lLnNwbGl0KCcvJylbMl0pIDogdW5kZWZpbmVkO1xuICAgIGlmIChsb2NhbENsaWVudElkKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSAoX2IgPSBwYXRoUGFyYW1zLmdldCgndCcpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ2xvY2FsX2lkJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoOiBgL2xvY2FsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGxvY2FsQ2xpZW50SWQpfWAsXG4gICAgICAgICAgICBwYXRoUGFyYW1zOiBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgdDogdHlwZSB9KSxcbiAgICAgICAgICAgIHVzZVJlY29ubmVjdGluZ1dlYnNvY2tldDogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTaW11bGF0b3IpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IChfYyA9IHBhdGhQYXJhbXMuZ2V0KCduYW1lJykpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICcnO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnc2ltdWxhdG9yJyk7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCduYW1lJyk7XG4gICAgICAgIHJldHVybiB7IHBhdGg6IGAvc2ltdWxhdG9yLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWAsIHBhdGhQYXJhbXMsIHVzZVJlY29ubmVjdGluZ1dlYnNvY2tldDogdHJ1ZSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChkaXNwbGF5KSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlJZEluZGV4ID0gKF9kID0gcGF0aFBhcmFtcy5nZXQoJ2Rpc3BsYXlJZEluZGV4JykpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICcnO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnZGlzcGxheScpO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnZGlzcGxheUlkSW5kZXgnKTtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogYC9kaXNwbGF5LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpc3BsYXkpfS8ke2VuY29kZVVSSUNvbXBvbmVudChkaXNwbGF5SWRJbmRleCl9YCB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChwbHVnaW5JZCkge1xuICAgICAgICByZXR1cm4geyBwYXRoOiBgL3BsdWdpbi8ke2VuY29kZVVSSUNvbXBvbmVudChwbHVnaW5JZCl9YCwgdXNlUmVjb25uZWN0aW5nV2Vic29ja2V0OiB0cnVlIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBzZXJpYWwgPSAoX2UgPSBwYXRoUGFyYW1zLmdldCgnc2VyaWFsJykpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6ICcnO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnc2VyaWFsJyk7XG4gICAgICAgIHJldHVybiB7IHBhdGg6IGAvY2xpZW50LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcmlhbCl9YCwgcGF0aFBhcmFtcyB9O1xuICAgIH1cbn1cbmNsYXNzIENvZ3NDb25uZWN0aW9uT3BlbkV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignb3BlbicpO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdvcGVuJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NDb25uZWN0aW9uT3BlbkV2ZW50ID0gQ29nc0Nvbm5lY3Rpb25PcGVuRXZlbnQ7XG5jbGFzcyBDb2dzQ29ubmVjdGlvbkNsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdjbG9zZScpO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdjbG9zZSc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzQ29ubmVjdGlvbkNsb3NlRXZlbnQgPSBDb2dzQ29ubmVjdGlvbkNsb3NlRXZlbnQ7XG5jbGFzcyBDb2dzTWVzc2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoJ21lc3NhZ2UnKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5fY29nc0Nvbm5lY3Rpb25FdmVudFR5cGUgPSAnbWVzc2FnZSc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzTWVzc2FnZUV2ZW50ID0gQ29nc01lc3NhZ2VFdmVudDtcbmNsYXNzIENvZ3NDb25maWdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCdjb25maWcnKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ2NvbmZpZyc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzQ29uZmlnQ2hhbmdlZEV2ZW50ID0gQ29nc0NvbmZpZ0NoYW5nZWRFdmVudDtcbmNsYXNzIENvZ3NTdGF0ZUNoYW5nZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICBzdXBlcignc3RhdGUnKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdzdGF0ZSc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzU3RhdGVDaGFuZ2VkRXZlbnQgPSBDb2dzU3RhdGVDaGFuZ2VkRXZlbnQ7XG5jbGFzcyBDb2dzSW5jb21pbmdFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2YWx1ZSkge1xuICAgICAgICBzdXBlcignZXZlbnQnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdldmVudCc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzSW5jb21pbmdFdmVudCA9IENvZ3NJbmNvbWluZ0V2ZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURSA9IHZvaWQgMDtcbmNvbnN0IG1lZGlhX3N0cmVhbV9saWJyYXJ5X2Jyb3dzZXJfMSA9IHJlcXVpcmUoXCJAY2xvY2t3b3JrZG9nL21lZGlhLXN0cmVhbS1saWJyYXJ5LWJyb3dzZXJcIik7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jb25zdCBERUZBVUxUX1ZJREVPX1BMQVlCQUNLX1JBVEUgPSAxO1xuLy8gVXNlIGEgZmFzdGVyLXRoYW4tcmVhbHRpbWUgcGxheWJhY2sgcmF0ZSBieSBkZWZhdWx0XG4vLyBzbyB0aGF0IGl0IGtlZXBzIHVwIHdpdGggYSByZWFsdGltZSBzdHJlYW0gaW4gY2FzZSBvZiB2aWRlbyBidWZmZXJpbmdcbmV4cG9ydHMuTElWRV9WSURFT19QTEFZQkFDS19SQVRFID0gMS4xO1xuLyoqXG4gKiBNYW5hZ2VzIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIENPR1MgVENQIHJlbGF5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNlbmQgUlRTUCB2aWRlb1xuICogZmVlZHMgdG8gdGhlIHdlYi5cbiAqL1xuY2xhc3MgUnRzcFN0cmVhbWVyIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGhvc3RuYW1lID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUsIHBvcnQgPSB1cmxzXzEuQ09HU19TRVJWRVJfUE9SVCwgcGF0aCA9ICcvdGNwLXByb3h5JywgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuX3dlYnNvY2tldFVyaSA9IGB3czovLyR7aG9zdG5hbWV9OiR7cG9ydH0ke3BhdGh9YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgYW4gUlRTUCB2aWRlbyBzdHJlYW0gb24gd2l0aCB0aGUgZ2l2ZW4gVVJJIG9uIHRoZSBnaXZlbiB2aWRlbyBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgZnVuY3Rpb24gdG8gY2xvc2UgdGhlIHBpcGVsaW5lXG4gICAgICovXG4gICAgcGxheShwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHVyaSwgdmlkZW9FbGVtZW50IH0gPSBwYXJhbXM7XG4gICAgICAgIHZpZGVvRWxlbWVudC5wbGF5c0lubGluZSA9IHRydWU7IC8vIFJlcXVpcmVkIGZvciBpT1NcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBjb25zdCBzdGFydFBpcGVsaW5lID0gKCkgPT4ge1xuICAgICAgICAgICAgcGlwZWxpbmUgPT09IG51bGwgfHwgcGlwZWxpbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBpcGVsaW5lLmNsb3NlKCk7XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ldyBtZWRpYV9zdHJlYW1fbGlicmFyeV9icm93c2VyXzEuSHRtbDVWaWRlb1BpcGVsaW5lKHtcbiAgICAgICAgICAgICAgICB3czogeyB1cmk6IHRoaXMuX3dlYnNvY2tldFVyaSB9LFxuICAgICAgICAgICAgICAgIHJ0c3A6IHsgdXJpOiB1cmkgfSxcbiAgICAgICAgICAgICAgICBtZWRpYUVsZW1lbnQ6IHZpZGVvRWxlbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gUmVzdGFydCBzdHJlYW0gb24gUlRDUCBCWUUgKHN0cmVhbSBlbmRlZClcbiAgICAgICAgICAgIHBpcGVsaW5lLnJ0c3Aub25SdGNwID0gKHJ0Y3ApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoKDAsIG1lZGlhX3N0cmVhbV9saWJyYXJ5X2Jyb3dzZXJfMS5pc1J0Y3BCeWUpKHJ0Y3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdWaWRlbyBzdHJlYW0gZW5kZWQuIFJlc3RhcnRpbmcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHN0YXJ0UGlwZWxpbmUsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBTdGFydCBwbGF5YmFjayB3aGVuIHJlYWR5XG4gICAgICAgICAgICBwaXBlbGluZS5yZWFkeS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlbGluZS5ydHNwLnBsYXkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBzdGFydFBpcGVsaW5lKCk7XG4gICAgICAgIGlmIChwYXJhbXMucGxheWJhY2tSYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5YmFja1JhdGUgPSAoX2EgPSBwYXJhbXMucGxheWJhY2tSYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBERUZBVUxUX1ZJREVPX1BMQVlCQUNLX1JBVEU7XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQucGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcmFtcy5yZXN0YXJ0SWZTdG9wcGVkKSB7XG4gICAgICAgICAgICBsZXQgcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGludGVydmFsID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVRpbWVVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZVRpbWVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGlmICghaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVmlkZW8gc3RvcHBlZCBwbGF5aW5nLiBSZXN0YXJ0aW5nLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc3RhcnRQaXBlbGluZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQYXVzZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZVRpbWVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIGhhbmRsZVBsYXkpO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgaGFuZGxlUGF1c2UpO1xuICAgICAgICAgICAgcmVtb3ZlUmVzdGFydExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVQYXVzZSgpO1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5JywgaGFuZGxlUGxheSk7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgaGFuZGxlUGF1c2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9PT0gbnVsbCB8fCBwaXBlbGluZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGlwZWxpbmUuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID09PSBudWxsIHx8IHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUnRzcFN0cmVhbWVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jb25zdCBWaWRlb1N0YXRlXzEgPSByZXF1aXJlKFwiLi90eXBlcy9WaWRlb1N0YXRlXCIpO1xuY29uc3QgREVGQVVMVF9QQVJFTlRfRUxFTUVOVCA9IGRvY3VtZW50LmJvZHk7XG5jbGFzcyBWaWRlb1BsYXllciB7XG4gICAgY29uc3RydWN0b3IoY29nc0Nvbm5lY3Rpb24sIHBhcmVudEVsZW1lbnQgPSBERUZBVUxUX1BBUkVOVF9FTEVNRU5UKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICAgICAgdGhpcy5nbG9iYWxWb2x1bWUgPSAxO1xuICAgICAgICB0aGlzLnZpZGVvQ2xpcFBsYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5zaW5rSWQgPSAnJztcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgLy8gU2VuZCB0aGUgY3VycmVudCBzdGF0dXMgb2YgZWFjaCBjbGlwIHRvIENPR1NcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd2aWRlb0NsaXBTdGF0ZScsICh7IGRldGFpbCB9KSA9PiB7XG4gICAgICAgICAgICBjb2dzQ29ubmVjdGlvbi5zZW5kTWVkaWFDbGlwU3RhdGUoZGV0YWlsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgdmlkZW8gY29udHJvbCBtZXNzYWdlc1xuICAgICAgICBjb2dzQ29ubmVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgbWVzc2FnZSB9KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ21lZGlhX2NvbmZpZ191cGRhdGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEdsb2JhbFZvbHVtZShtZXNzYWdlLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmF1ZGlvT3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpbmtJZCA9IGNvZ3NDb25uZWN0aW9uLmdldEF1ZGlvU2lua0lkKG1lc3NhZ2UuYXVkaW9PdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdWRpb1Npbmsoc2lua0lkICE9PSBudWxsICYmIHNpbmtJZCAhPT0gdm9pZCAwID8gc2lua0lkIDogJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ29uZmlnKG1lc3NhZ2UuZmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19wbGF5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5VmlkZW9DbGlwKG1lc3NhZ2UuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheUlkOiBtZXNzYWdlLnBsYXlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTogbWVzc2FnZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wOiBCb29sZWFuKG1lc3NhZ2UubG9vcCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXQ6IG1lc3NhZ2UuZml0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW9fcGF1c2UnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdXNlVmlkZW9DbGlwKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3N0b3AnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BWaWRlb0NsaXAoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW9fc2V0X3ZvbHVtZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmlkZW9DbGlwVm9sdW1lKHsgdm9sdW1lOiBtZXNzYWdlLnZvbHVtZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW9fc2V0X2ZpdCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmlkZW9DbGlwRml0KHsgZml0OiBtZXNzYWdlLmZpdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbiBjb25uZWN0aW9uLCBzZW5kIHRoZSBjdXJyZW50IHBsYXlpbmcgc3RhdGUgb2YgYWxsIGNsaXBzXG4gICAgICAgIC8vIChVc3VhbGx5IGVtcHR5IHVubGVzcyB3ZWJzb2NrZXQgaXMgcmVjb25uZWN0aW5nKVxuICAgICAgICBjb25zdCBzZW5kSW5pdGlhbENsaXBTdGF0ZXMgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMudmlkZW9DbGlwUGxheWVycykubWFwKChbZmlsZSwgcGxheWVyXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9ICFwbGF5ZXIudmlkZW9FbGVtZW50LnBhdXNlZFxuICAgICAgICAgICAgICAgICAgICA/ICdwbGF5aW5nJ1xuICAgICAgICAgICAgICAgICAgICA6IHBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPT09IDAgfHwgcGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9PT0gcGxheWVyLnZpZGVvRWxlbWVudC5kdXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyAncGF1c2VkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnc3RvcHBlZCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtmaWxlLCBzdGF0dXNdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb2dzQ29ubmVjdGlvbi5zZW5kSW5pdGlhbE1lZGlhQ2xpcFN0YXRlcyh7IG1lZGlhVHlwZTogJ3ZpZGVvJywgZmlsZXMgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvZ3NDb25uZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCBzZW5kSW5pdGlhbENsaXBTdGF0ZXMpO1xuICAgICAgICBzZW5kSW5pdGlhbENsaXBTdGF0ZXMoKTtcbiAgICB9XG4gICAgc2V0UGFyZW50RWxlbWVudChwYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIE9iamVjdC52YWx1ZXModGhpcy52aWRlb0NsaXBQbGF5ZXJzKS5mb3JFYWNoKChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlc2V0UGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJlbnRFbGVtZW50KERFRkFVTFRfUEFSRU5UX0VMRU1FTlQpO1xuICAgIH1cbiAgICBzZXRHbG9iYWxWb2x1bWUoZ2xvYmFsVm9sdW1lKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXModGhpcy52aWRlb0NsaXBQbGF5ZXJzKS5mb3JFYWNoKChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBzZXRWaWRlb0VsZW1lbnRWb2x1bWUoY2xpcFBsYXllci52aWRlb0VsZW1lbnQsIGNsaXBQbGF5ZXIudm9sdW1lICogZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2xvYmFsVm9sdW1lID0gZ2xvYmFsVm9sdW1lO1xuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIHBsYXlWaWRlb0NsaXAocGF0aCwgeyBwbGF5SWQsIHZvbHVtZSwgbG9vcCwgZml0IH0pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSkge1xuICAgICAgICAgICAgdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdID0gdGhpcy5jcmVhdGVDbGlwUGxheWVyKHBhdGgsIHsgcHJlbG9hZDogJ25vbmUnLCBlcGhlbWVyYWw6IHRydWUsIGZpdCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGFscmVhZHkgYSBwZW5kaW5nIGNsaXAsIHdoaWNoIGhhcyBub3cgYmVlbiBzdXBlcnNlZGVkIGFuZCBhYm9ydCB0aGUgcGxheSBvcGVyYXRpb25cbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHRoaXMucGVuZGluZ0NsaXAucGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5sb2FkKCk7IC8vIFJlc2V0cyB0aGUgbWVkaWEgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmV3IHBlbmRpbmcgY2xpcCBpcyB2aWRlbyBiZWluZyByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLmFjdGl2ZUNsaXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXRoKSAhPT0gcGF0aCkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHsgcGF0aCwgcGxheUlkLCBhY3Rpb25PbmNlUGxheWluZzogJ3BsYXknIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0dXAgYW5kIHBsYXkgdGhlIHBlbmRpbmcgY2xpcCdzIHBsYXllclxuICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgY2xpcFBsYXllci52b2x1bWUgPSB2b2x1bWU7XG4gICAgICAgICAgICBzZXRWaWRlb0VsZW1lbnRWb2x1bWUoY2xpcFBsYXllci52aWRlb0VsZW1lbnQsIHZvbHVtZSAqIHRoaXMuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50Lmxvb3AgPSBsb29wO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuc3R5bGUub2JqZWN0Rml0ID0gZml0O1xuICAgICAgICAgICAgaWYgKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID09PSBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5kdXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnBsYXkoKTtcbiAgICAgICAgICAgIC8vIERpc3BsYXkgcmlnaHQgYXdheSBpZiB0aGVyZSdzIGN1cnJlbnRseSBubyBhY3RpdmUgY2xpcFxuICAgICAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZUNsaXApIHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGF1c2VWaWRlb0NsaXAoKSB7XG4gICAgICAgIC8vIFBlbmRpbmcgY2xpcCBzaG91bGQgYmUgcGF1c2VkIHdoZW4gaXQgbG9hZHMgYW5kIGJlY29tZXMgYWN0aXZlXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwLmFjdGlvbk9uY2VQbGF5aW5nID0gJ3BhdXNlJztcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXVzZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBjbGlwXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUNsaXApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcGxheUlkLCBwYXRoIH0gPSB0aGlzLmFjdGl2ZUNsaXA7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAoX2EgPSBjbGlwUGxheWVyLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgcGF0aCwgJ3BhdXNlZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3BWaWRlb0NsaXAoKSB7XG4gICAgICAgIC8vIFBlbmRpbmcgY2xpcCBzaG91bGQgYmUgc3RvcHBlZCB3aGVuIGl0IGxvYWRzIGFuZCBiZWNvbWVzIGFjdGl2ZVxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcC5hY3Rpb25PbmNlUGxheWluZyA9ICdzdG9wJztcbiAgICAgICAgfVxuICAgICAgICAvLyBTdG9wIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNsaXBcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2xpcCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcCh0aGlzLmFjdGl2ZUNsaXAucGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0VmlkZW9DbGlwVm9sdW1lKHsgdm9sdW1lIH0pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwZW5kaW5nIGNsaXAsIHRoaXMgaXMgbGF0ZXN0IHRvIGhhdmUgYmVlbiBwbGF5ZWQgc28gdXBkYXRlIGl0cyB2b2x1bWVcbiAgICAgICAgY29uc3QgY2xpcFRvVXBkYXRlID0gKF9iID0gKF9hID0gdGhpcy5wZW5kaW5nQ2xpcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5hY3RpdmVDbGlwKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghY2xpcFRvVXBkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodm9sdW1lID49IDAgJiYgdm9sdW1lIDw9IDEpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdm9sdW1lJywgdm9sdW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihjbGlwVG9VcGRhdGUucGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChjbGlwUGxheWVyLnZpZGVvRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIudm9sdW1lID0gdm9sdW1lO1xuICAgICAgICAgICAgICAgIHNldFZpZGVvRWxlbWVudFZvbHVtZShjbGlwUGxheWVyLnZpZGVvRWxlbWVudCwgdm9sdW1lICogdGhpcy5nbG9iYWxWb2x1bWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRWaWRlb0NsaXBGaXQoeyBmaXQgfSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHBlbmRpbmcgY2xpcCwgdGhpcyBpcyBsYXRlc3QgdG8gaGF2ZSBiZWVuIHBsYXllZCBzbyB1cGRhdGUgaXRzIGZpdFxuICAgICAgICBjb25zdCBjbGlwVG9VcGRhdGUgPSAoX2IgPSAoX2EgPSB0aGlzLnBlbmRpbmdDbGlwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmFjdGl2ZUNsaXApICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFjbGlwVG9VcGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihjbGlwVG9VcGRhdGUucGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChjbGlwUGxheWVyLnZpZGVvRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnN0eWxlLm9iamVjdEZpdCA9IGZpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlU3RvcHBlZENsaXAocGF0aCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVDbGlwIHx8IHRoaXMuYWN0aXZlQ2xpcC5wYXRoICE9PSBwYXRoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGxheUlkID0gdGhpcy5hY3RpdmVDbGlwLnBsYXlJZDtcbiAgICAgICAgLy8gT25jZSBhbiBlcGhlbWVyYWwgY2xpcCBzdG9wcywgY2xlYW51cCBhbmQgcmVtb3ZlIHRoZSBwbGF5ZXJcbiAgICAgICAgaWYgKChfYSA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1t0aGlzLmFjdGl2ZUNsaXAucGF0aF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb25maWcuZXBoZW1lcmFsKSB7XG4gICAgICAgICAgICB0aGlzLnVubG9hZENsaXAocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVDbGlwID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID0gMDtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgcGF0aCwgJ3N0b3BwZWQnKTtcbiAgICB9XG4gICAgdXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIHVwZGF0ZSkge1xuICAgICAgICBpZiAodGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQbGF5ZXIgPSB1cGRhdGUodGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdKTtcbiAgICAgICAgICAgIGlmIChuZXdQbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0gPSBuZXdQbGF5ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldEF1ZGlvU2luayhzaW5rSWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBjbGlwUGxheWVyIG9mIE9iamVjdC52YWx1ZXModGhpcy52aWRlb0NsaXBQbGF5ZXJzKSkge1xuICAgICAgICAgICAgc2V0UGxheWVyU2lua0lkKGNsaXBQbGF5ZXIsIHNpbmtJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaW5rSWQgPSBzaW5rSWQ7XG4gICAgfVxuICAgIHVwZGF0ZUNvbmZpZyhuZXdQYXRocykge1xuICAgICAgICBjb25zdCBuZXdWaWRlb1BhdGhzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG5ld1BhdGhzKS5maWx0ZXIoKFssIHsgdHlwZSB9XSkgPT4gdHlwZSA9PT0gJ3ZpZGVvJyB8fCAhdHlwZSkpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0NsaXBQbGF5ZXJzID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzO1xuICAgICAgICB0aGlzLnZpZGVvQ2xpcFBsYXllcnMgPSAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2xpcFBsYXllcnMgPSB7IC4uLnByZXZpb3VzQ2xpcFBsYXllcnMgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRDbGlwcyA9IE9iamVjdC5rZXlzKHByZXZpb3VzQ2xpcFBsYXllcnMpLmZpbHRlcigocHJldmlvdXNQYXRoKSA9PiAhKHByZXZpb3VzUGF0aCBpbiBuZXdWaWRlb1BhdGhzKSk7XG4gICAgICAgICAgICByZW1vdmVkQ2xpcHMuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAgICAgaWYgKCgoX2EgPSB0aGlzLmFjdGl2ZUNsaXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXRoKSA9PT0gcGF0aCAmJiAoKF9iID0gcHJldmlvdXNDbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNvbmZpZy5lcGhlbWVyYWwpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCAocGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuY29uZmlnID0geyAuLi5wbGF5ZXIuY29uZmlnLCBlcGhlbWVyYWw6IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bmxvYWRDbGlwKHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2xpcFBsYXllcnNbcGF0aF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBhZGRlZENsaXBzID0gT2JqZWN0LmVudHJpZXMobmV3VmlkZW9QYXRocykuZmlsdGVyKChbbmV3RmlsZV0pID0+ICFwcmV2aW91c0NsaXBQbGF5ZXJzW25ld0ZpbGVdKTtcbiAgICAgICAgICAgIGFkZGVkQ2xpcHMuZm9yRWFjaCgoW3BhdGgsIGNvbmZpZ10pID0+IHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyc1twYXRoXSA9IHRoaXMuY3JlYXRlQ2xpcFBsYXllcihwYXRoLCB7IC4uLmNvbmZpZywgcHJlbG9hZDogcHJlbG9hZFN0cmluZyhjb25maWcucHJlbG9hZCksIGVwaGVtZXJhbDogZmFsc2UsIGZpdDogJ2NvbnRhaW4nIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkQ2xpcHMgPSBPYmplY3QuZW50cmllcyhwcmV2aW91c0NsaXBQbGF5ZXJzKS5maWx0ZXIoKFtwcmV2aW91c1BhdGhdKSA9PiBwcmV2aW91c1BhdGggaW4gbmV3VmlkZW9QYXRocyk7XG4gICAgICAgICAgICB1cGRhdGVkQ2xpcHMuZm9yRWFjaCgoW3BhdGgsIHByZXZpb3VzQ2xpcFBsYXllcl0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNDbGlwUGxheWVyLmNvbmZpZy5wcmVsb2FkICE9PSBuZXdWaWRlb1BhdGhzW3BhdGhdLnByZWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKHBsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLmNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wbGF5ZXIuY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWQ6IHByZWxvYWRTdHJpbmcobmV3VmlkZW9QYXRoc1twYXRoXS5wcmVsb2FkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGhlbWVyYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci52aWRlb0VsZW1lbnQucHJlbG9hZCA9IHBsYXllci5jb25maWcucHJlbG9hZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXJzO1xuICAgICAgICB9KSgpO1xuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIG5vdGlmeVN0YXRlTGlzdGVuZXJzKCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGNvbnN0IFZpZGVvU3RhdGUgPSB7XG4gICAgICAgICAgICBnbG9iYWxWb2x1bWU6IHRoaXMuZ2xvYmFsVm9sdW1lLFxuICAgICAgICAgICAgaXNQbGF5aW5nOiB0aGlzLmFjdGl2ZUNsaXAgPyAhKChfYSA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1t0aGlzLmFjdGl2ZUNsaXAucGF0aF0udmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF1c2VkKSA6IGZhbHNlLFxuICAgICAgICAgICAgY2xpcHM6IHsgLi4udGhpcy52aWRlb0NsaXBQbGF5ZXJzIH0sXG4gICAgICAgICAgICBhY3RpdmVDbGlwOiB0aGlzLmFjdGl2ZUNsaXBcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogdGhpcy5hY3RpdmVDbGlwLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAhKChfYiA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1t0aGlzLmFjdGl2ZUNsaXAucGF0aF0udmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGF1c2VkKSA/IFZpZGVvU3RhdGVfMS5BY3RpdmVWaWRlb0NsaXBTdGF0ZS5QbGF5aW5nIDogVmlkZW9TdGF0ZV8xLkFjdGl2ZVZpZGVvQ2xpcFN0YXRlLlBhdXNlZCxcbiAgICAgICAgICAgICAgICAgICAgbG9vcDogKF9kID0gKF9jID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5sb29wKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiAoKF9lID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5tdXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoX2cgPSAoX2YgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLnZvbHVtZSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogMCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnc3RhdGUnLCBWaWRlb1N0YXRlKTtcbiAgICB9XG4gICAgbm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgZmlsZSwgc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgndmlkZW9DbGlwU3RhdGUnLCB7IHBsYXlJZCwgbWVkaWFUeXBlOiAndmlkZW8nLCBmaWxlLCBzdGF0dXMgfSk7XG4gICAgfVxuICAgIC8vIFR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBFdmVudFRhcmdldFxuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBkaXNwYXRjaEV2ZW50KHR5cGUsIGRldGFpbCkge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHR5cGUsIHsgZGV0YWlsIH0pKTtcbiAgICB9XG4gICAgY3JlYXRlVmlkZW9FbGVtZW50KHBhdGgsIGNvbmZpZywgeyB2b2x1bWUgfSkge1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICB2aWRlb0VsZW1lbnQucGxheXNJbmxpbmUgPSB0cnVlOyAvLyBSZXF1aXJlZCBmb3IgaU9TXG4gICAgICAgIHZpZGVvRWxlbWVudC5zcmMgPSAoMCwgdXJsc18xLmFzc2V0VXJsKShwYXRoKTtcbiAgICAgICAgdmlkZW9FbGVtZW50LmF1dG9wbGF5ID0gZmFsc2U7XG4gICAgICAgIHZpZGVvRWxlbWVudC5sb29wID0gZmFsc2U7XG4gICAgICAgIHNldFZpZGVvRWxlbWVudFZvbHVtZSh2aWRlb0VsZW1lbnQsIHZvbHVtZSAqIHRoaXMuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgdmlkZW9FbGVtZW50LnByZWxvYWQgPSBjb25maWcucHJlbG9hZDtcbiAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNsaXAgaXMgc3RpbGwgdGhlIHBlbmRpbmcgb25lIHdoZW4gaXQgYWN0dWFsbHkgc3RhcnQgcGxheWluZywgdGhlbiBlbnN1cmUgaXQgaXMgaW4gdGhlIGNvcnJlY3Qgc3RhdGVcbiAgICAgICAgICAgIGlmICgoKF9hID0gdGhpcy5wZW5kaW5nQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnBlbmRpbmdDbGlwLmFjdGlvbk9uY2VQbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BsYXknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSBwbGF5aW5nLCBzaG93IHRoZSB2aWRlbyBlbGVtZW50LCBhbmQgbm90aWZ5IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnModGhpcy5wZW5kaW5nQ2xpcC5wbGF5SWQsIHBhdGgsICdwbGF5aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXVzZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHBsYXliYWNrLCBzaG93IHRoZSB2aWRlbyBlbGVtZW50LCBhbmQgbm90aWZ5IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyh0aGlzLnBlbmRpbmdDbGlwLnBsYXlJZCwgcGF0aCwgJ3BhdXNlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RvcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHBsYXliYWNrLCBsZWF2ZSB0aGUgdmlkZW8gZWxlbWVudCBoaWRkZW4sIGFuZCBub3RpZnkgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHRoaXMucGVuZGluZ0NsaXAucGxheUlkLCBwYXRoLCAnc3RvcHBlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgcHJldmlvdXNseSBhY3RpdmUgY2xpcCwgdGhlbiBzdG9wIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2xpcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHRoaXMuYWN0aXZlQ2xpcC5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDbGlwID0gdGhpcy5wZW5kaW5nQ2xpcDtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKChfYiA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBhdGgpID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZSB0aGUgYWN0aXZlIGNsaXAgdGhlbiBqdXN0IG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB3ZSBhcmUgbm93IHBsYXlpbmdcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyh0aGlzLmFjdGl2ZUNsaXAucGxheUlkLCBwYXRoLCAncGxheWluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0IHNob3VsZG4ndCBiZSBwbGF5aW5nLCBsaWtlIGJlY2F1c2UgYW5vdGhlciBjbGlwIGJlY2FtZSBwZW5kaW5nIGJlZm9yZSB3ZSBsb2FkZWQsXG4gICAgICAgICAgICAgICAgLy8gc28gd2UgcGF1c2UgYW5kIGRvbid0IHNob3cgb3Igbm90aWZ5IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gSWdub3JlIGlmIHRoZXJlJ3MgYSBwZW5kaW5nIGNsaXAsIGFzIG9uY2UgdGhhdCBzdGFydHMgcGxheWluZyB0aGUgYWN0aXZlIGNsaXAgd2lsbCBiZSBzdG9wcGVkXG4gICAgICAgICAgICAvLyBBbHNvIGlnbm9yZSBpZiB0aGUgdmlkZW8gaXMgc2V0IHRvIGxvb3BcbiAgICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2xpcCAmJiAhdmlkZW9FbGVtZW50Lmxvb3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLnRvcCA9ICcwJztcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLm9iamVjdEZpdCA9IGNvbmZpZy5maXQ7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodmlkZW9FbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIHZpZGVvRWxlbWVudDtcbiAgICB9XG4gICAgY3JlYXRlQ2xpcFBsYXllcihwYXRoLCBjb25maWcpIHtcbiAgICAgICAgY29uc3Qgdm9sdW1lID0gMTtcbiAgICAgICAgY29uc3QgcGxheWVyID0ge1xuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdmlkZW9FbGVtZW50OiB0aGlzLmNyZWF0ZVZpZGVvRWxlbWVudChwYXRoLCBjb25maWcsIHsgdm9sdW1lIH0pLFxuICAgICAgICAgICAgdm9sdW1lLFxuICAgICAgICB9O1xuICAgICAgICBzZXRQbGF5ZXJTaW5rSWQocGxheWVyLCB0aGlzLnNpbmtJZCk7XG4gICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuICAgIHVubG9hZENsaXAocGF0aCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAoKChfYSA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpID09PSBwYXRoKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5SWQgPSB0aGlzLmFjdGl2ZUNsaXAucGxheUlkO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVDbGlwID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAnc3RvcHBlZCcpO1xuICAgICAgICB9XG4gICAgICAgIChfYiA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gVmlkZW9QbGF5ZXI7XG5mdW5jdGlvbiBwcmVsb2FkU3RyaW5nKHByZWxvYWQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByZWxvYWQgPT09ICdzdHJpbmcnID8gcHJlbG9hZCA6IHByZWxvYWQgPyAnYXV0bycgOiAnbm9uZSc7XG59XG5mdW5jdGlvbiBzZXRQbGF5ZXJTaW5rSWQocGxheWVyLCBzaW5rSWQpIHtcbiAgICBpZiAoc2lua0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBsYXllci52aWRlb0VsZW1lbnQuc2V0U2lua0lkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBsYXllci52aWRlb0VsZW1lbnQuc2V0U2lua0lkKHNpbmtJZCk7XG4gICAgfVxufVxuLyoqXG4gKiBTZXQgdmlkZW8gdm9sdW1lXG4gKlxuICogVGhpcyBkb2Vzbid0IHdvcmsgb24gaU9TICh2b2x1bWUgaXMgcmVhZC1vbmx5KSBzbyBhdCBsZWFzdCBtdXRlIGl0IGlmIHRoZSB2b2x1bWUgaXMgemVyb1xuICovXG5mdW5jdGlvbiBzZXRWaWRlb0VsZW1lbnRWb2x1bWUodmlkZW9FbGVtZW50LCB2b2x1bWUpIHtcbiAgICB2aWRlb0VsZW1lbnQudm9sdW1lID0gdm9sdW1lO1xuICAgIHZpZGVvRWxlbWVudC5tdXRlZCA9IHZvbHVtZSA9PT0gMDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wcmVsb2FkVXJsID0gZXhwb3J0cy5hc3NldFVybCA9IGV4cG9ydHMuQ09HU19TRVJWRVJfUE9SVCA9IHZvaWQgMDtcbmV4cG9ydHMuQ09HU19TRVJWRVJfUE9SVCA9IDEyMDk1O1xuZnVuY3Rpb24gYXNzZXRVcmwoZmlsZSkge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubG9jYXRpb24gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGAke2xvY2F0aW9uID09PSBudWxsIHx8IGxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhdGlvbi5wcm90b2NvbH0vLyR7bG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2F0aW9uLmhvc3RuYW1lfToke2V4cG9ydHMuQ09HU19TRVJWRVJfUE9SVH0vYXNzZXRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGUpfWA7XG59XG5leHBvcnRzLmFzc2V0VXJsID0gYXNzZXRVcmw7XG5hc3luYyBmdW5jdGlvbiBwcmVsb2FkVXJsKHVybCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAvLyBXZSB1c2VkIGFycmF5QnVmZmVyKClgIGluc3RlYWQgb2YgYGJsb2IoKWAgYmVjYXVzZSB0aGUgbGF0dGVyIHNlZW1zIHRvIGZhaWwgb24gUGlzIHdoZW4gcHJlbG9hZGluZyBzb21lIGZpbGVzXG4gICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2F3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCldKSk7XG59XG5leHBvcnRzLnByZWxvYWRVcmwgPSBwcmVsb2FkVXJsO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1hbmlmZXN0VHlwZXMgPSBleHBvcnRzLnByZWxvYWRVcmwgPSBleHBvcnRzLmFzc2V0VXJsID0gZXhwb3J0cy5Db2dzVmlkZW9QbGF5ZXIgPSBleHBvcnRzLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURSA9IGV4cG9ydHMuQ29nc1J0c3BTdHJlYW1lciA9IGV4cG9ydHMuQ29nc0F1ZGlvUGxheWVyID0gZXhwb3J0cy5TaG93UGhhc2UgPSBleHBvcnRzLkNvZ3NDb25uZWN0aW9uID0gdm9pZCAwO1xudmFyIENvZ3NDb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9Db2dzQ29ubmVjdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZ3NDb25uZWN0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2ltcG9ydERlZmF1bHQoQ29nc0Nvbm5lY3Rpb25fMSkuZGVmYXVsdDsgfSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9Db2dzQ29ubmVjdGlvblwiKSwgZXhwb3J0cyk7XG52YXIgU2hvd1BoYXNlXzEgPSByZXF1aXJlKFwiLi90eXBlcy9TaG93UGhhc2VcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTaG93UGhhc2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChTaG93UGhhc2VfMSkuZGVmYXVsdDsgfSB9KTtcbnZhciBBdWRpb1BsYXllcl8xID0gcmVxdWlyZShcIi4vQXVkaW9QbGF5ZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2dzQXVkaW9QbGF5ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChBdWRpb1BsYXllcl8xKS5kZWZhdWx0OyB9IH0pO1xudmFyIFJ0c3BTdHJlYW1lcl8xID0gcmVxdWlyZShcIi4vUnRzcFN0cmVhbWVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29nc1J0c3BTdHJlYW1lclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gX19pbXBvcnREZWZhdWx0KFJ0c3BTdHJlYW1lcl8xKS5kZWZhdWx0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTElWRV9WSURFT19QTEFZQkFDS19SQVRFXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBSdHNwU3RyZWFtZXJfMS5MSVZFX1ZJREVPX1BMQVlCQUNLX1JBVEU7IH0gfSk7XG52YXIgVmlkZW9QbGF5ZXJfMSA9IHJlcXVpcmUoXCIuL1ZpZGVvUGxheWVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29nc1ZpZGVvUGxheWVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2ltcG9ydERlZmF1bHQoVmlkZW9QbGF5ZXJfMSkuZGVmYXVsdDsgfSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90eXBlcy9BdWRpb1N0YXRlXCIpLCBleHBvcnRzKTtcbnZhciB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJhc3NldFVybFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdXJsc18xLmFzc2V0VXJsOyB9IH0pO1xudmFyIHVybHNfMiA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvdXJsc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInByZWxvYWRVcmxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVybHNfMi5wcmVsb2FkVXJsOyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3R5cGVzL0NvZ3NQbHVnaW5NYW5pZmVzdFwiKSwgZXhwb3J0cyk7XG5leHBvcnRzLk1hbmlmZXN0VHlwZXMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vdHlwZXMvTWFuaWZlc3RUeXBlc1wiKSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFNob3dQaGFzZTtcbihmdW5jdGlvbiAoU2hvd1BoYXNlKSB7XG4gICAgU2hvd1BoYXNlW1wiU2V0dXBcIl0gPSBcInNldHVwXCI7XG4gICAgU2hvd1BoYXNlW1wiUHJlc2hvd1wiXSA9IFwicHJlLXNob3dcIjtcbiAgICBTaG93UGhhc2VbXCJJblByb2dyZXNzXCJdID0gXCJpbiBwcm9ncmVzc1wiO1xuICAgIFNob3dQaGFzZVtcIkZpbmlzaGVkXCJdID0gXCJmaW5pc2hlZFwiO1xufSkoU2hvd1BoYXNlIHx8IChTaG93UGhhc2UgPSB7fSkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gU2hvd1BoYXNlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFjdGl2ZVZpZGVvQ2xpcFN0YXRlID0gdm9pZCAwO1xudmFyIEFjdGl2ZVZpZGVvQ2xpcFN0YXRlO1xuKGZ1bmN0aW9uIChBY3RpdmVWaWRlb0NsaXBTdGF0ZSkge1xuICAgIEFjdGl2ZVZpZGVvQ2xpcFN0YXRlW1wiUGF1c2VkXCJdID0gXCJwYXVzZWRcIjtcbiAgICBBY3RpdmVWaWRlb0NsaXBTdGF0ZVtcIlBsYXlpbmdcIl0gPSBcInBsYXlpbmdcIjtcbn0pKEFjdGl2ZVZpZGVvQ2xpcFN0YXRlIHx8IChleHBvcnRzLkFjdGl2ZVZpZGVvQ2xpcFN0YXRlID0gQWN0aXZlVmlkZW9DbGlwU3RhdGUgPSB7fSkpO1xuIiwidmFyIGZhPU9iamVjdC5jcmVhdGU7dmFyIEZ0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgY2E9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgbGE9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIGRhPU9iamVjdC5nZXRQcm90b3R5cGVPZixwYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBoYT0ocixlKT0+KCk9PihyJiYoZT1yKHI9MCkpLGUpO3ZhciBTPShyLGUpPT4oKT0+KGV8fHIoKGU9e2V4cG9ydHM6e319KS5leHBvcnRzLGUpLGUuZXhwb3J0cyksUHQ9KHIsZSk9Pntmb3IodmFyIHQgaW4gZSlGdChyLHQse2dldDplW3RdLGVudW1lcmFibGU6ITB9KX0sc2k9KHIsZSx0LG4pPT57aWYoZSYmdHlwZW9mIGU9PVwib2JqZWN0XCJ8fHR5cGVvZiBlPT1cImZ1bmN0aW9uXCIpZm9yKGxldCBpIG9mIGxhKGUpKSFwYS5jYWxsKHIsaSkmJmkhPT10JiZGdChyLGkse2dldDooKT0+ZVtpXSxlbnVtZXJhYmxlOiEobj1jYShlLGkpKXx8bi5lbnVtZXJhYmxlfSk7cmV0dXJuIHJ9O3ZhciBDPShyLGUsdCk9Pih0PXIhPW51bGw/ZmEoZGEocikpOnt9LHNpKGV8fCFyfHwhci5fX2VzTW9kdWxlP0Z0KHQsXCJkZWZhdWx0XCIse3ZhbHVlOnIsZW51bWVyYWJsZTohMH0pOnQscikpLG1hPXI9PnNpKEZ0KHt9LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHIpO3ZhciBmaT1TKGt0PT57XCJ1c2Ugc3RyaWN0XCI7YygpO2t0LmJ5dGVMZW5ndGg9eWE7a3QudG9CeXRlQXJyYXk9eGE7a3QuZnJvbUJ5dGVBcnJheT12YTt2YXIgbmU9W10sSz1bXSxnYT10eXBlb2YgVWludDhBcnJheTxcInVcIj9VaW50OEFycmF5OkFycmF5LFZyPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO2ZvcihGZT0wLGFpPVZyLmxlbmd0aDtGZTxhaTsrK0ZlKW5lW0ZlXT1WcltGZV0sS1tWci5jaGFyQ29kZUF0KEZlKV09RmU7dmFyIEZlLGFpO0tbXCItXCIuY2hhckNvZGVBdCgwKV09NjI7S1tcIl9cIi5jaGFyQ29kZUF0KDApXT02MztmdW5jdGlvbiB1aShyKXt2YXIgZT1yLmxlbmd0aDtpZihlJTQ+MCl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0XCIpO3ZhciB0PXIuaW5kZXhPZihcIj1cIik7dD09PS0xJiYodD1lKTt2YXIgbj10PT09ZT8wOjQtdCU0O3JldHVyblt0LG5dfWZ1bmN0aW9uIHlhKHIpe3ZhciBlPXVpKHIpLHQ9ZVswXSxuPWVbMV07cmV0dXJuKHQrbikqMy80LW59ZnVuY3Rpb24gYmEocixlLHQpe3JldHVybihlK3QpKjMvNC10fWZ1bmN0aW9uIHhhKHIpe3ZhciBlLHQ9dWkociksbj10WzBdLGk9dFsxXSxvPW5ldyBnYShiYShyLG4saSkpLHM9MCxhPWk+MD9uLTQ6bix1O2Zvcih1PTA7dTxhO3UrPTQpZT1LW3IuY2hhckNvZGVBdCh1KV08PDE4fEtbci5jaGFyQ29kZUF0KHUrMSldPDwxMnxLW3IuY2hhckNvZGVBdCh1KzIpXTw8NnxLW3IuY2hhckNvZGVBdCh1KzMpXSxvW3MrK109ZT4+MTYmMjU1LG9bcysrXT1lPj44JjI1NSxvW3MrK109ZSYyNTU7cmV0dXJuIGk9PT0yJiYoZT1LW3IuY2hhckNvZGVBdCh1KV08PDJ8S1tyLmNoYXJDb2RlQXQodSsxKV0+PjQsb1tzKytdPWUmMjU1KSxpPT09MSYmKGU9S1tyLmNoYXJDb2RlQXQodSldPDwxMHxLW3IuY2hhckNvZGVBdCh1KzEpXTw8NHxLW3IuY2hhckNvZGVBdCh1KzIpXT4+MixvW3MrK109ZT4+OCYyNTUsb1tzKytdPWUmMjU1KSxvfWZ1bmN0aW9uIF9hKHIpe3JldHVybiBuZVtyPj4xOCY2M10rbmVbcj4+MTImNjNdK25lW3I+PjYmNjNdK25lW3ImNjNdfWZ1bmN0aW9uIHdhKHIsZSx0KXtmb3IodmFyIG4saT1bXSxvPWU7bzx0O28rPTMpbj0ocltvXTw8MTYmMTY3MTE2ODApKyhyW28rMV08PDgmNjUyODApKyhyW28rMl0mMjU1KSxpLnB1c2goX2EobikpO3JldHVybiBpLmpvaW4oXCJcIil9ZnVuY3Rpb24gdmEocil7Zm9yKHZhciBlLHQ9ci5sZW5ndGgsbj10JTMsaT1bXSxvPTE2MzgzLHM9MCxhPXQtbjtzPGE7cys9bylpLnB1c2god2EocixzLHMrbz5hP2E6cytvKSk7cmV0dXJuIG49PT0xPyhlPXJbdC0xXSxpLnB1c2gobmVbZT4+Ml0rbmVbZTw8NCY2M10rXCI9PVwiKSk6bj09PTImJihlPShyW3QtMl08PDgpK3JbdC0xXSxpLnB1c2gobmVbZT4+MTBdK25lW2U+PjQmNjNdK25lW2U8PDImNjNdK1wiPVwiKSksaS5qb2luKFwiXCIpfX0pO3ZhciBjaT1TKHpyPT57YygpO3pyLnJlYWQ9ZnVuY3Rpb24ocixlLHQsbixpKXt2YXIgbyxzLGE9aSo4LW4tMSx1PSgxPDxhKS0xLGY9dT4+MSxsPS03LGQ9dD9pLTE6MCxoPXQ/LTE6MSxtPXJbZStkXTtmb3IoZCs9aCxvPW0mKDE8PC1sKS0xLG0+Pj0tbCxsKz1hO2w+MDtvPW8qMjU2K3JbZStkXSxkKz1oLGwtPTgpO2ZvcihzPW8mKDE8PC1sKS0xLG8+Pj0tbCxsKz1uO2w+MDtzPXMqMjU2K3JbZStkXSxkKz1oLGwtPTgpO2lmKG89PT0wKW89MS1mO2Vsc2V7aWYobz09PXUpcmV0dXJuIHM/TmFOOihtPy0xOjEpKigxLzApO3M9cytNYXRoLnBvdygyLG4pLG89by1mfXJldHVybihtPy0xOjEpKnMqTWF0aC5wb3coMixvLW4pfTt6ci53cml0ZT1mdW5jdGlvbihyLGUsdCxuLGksbyl7dmFyIHMsYSx1LGY9byo4LWktMSxsPSgxPDxmKS0xLGQ9bD4+MSxoPWk9PT0yMz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsbT1uPzA6by0xLGI9bj8xOi0xLHk9ZTwwfHxlPT09MCYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWwpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MikscytkPj0xP2UrPWgvdTplKz1oKk1hdGgucG93KDIsMS1kKSxlKnU+PTImJihzKyssdS89MikscytkPj1sPyhhPTAscz1sKTpzK2Q+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLGkpLHM9cytkKTooYT1lKk1hdGgucG93KDIsZC0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7clt0K21dPWEmMjU1LG0rPWIsYS89MjU2LGktPTgpO2ZvcihzPXM8PGl8YSxmKz1pO2Y+MDtyW3QrbV09cyYyNTUsbSs9YixzLz0yNTYsZi09OCk7clt0K20tYl18PXkqMTI4fX0pO3ZhciBYZT1TKEtlPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBZcj1maSgpLHplPWNpKCksbGk9dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZ0eXBlb2YgU3ltYm9sLmZvcj09XCJmdW5jdGlvblwiP1N5bWJvbC5mb3IoXCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbVwiKTpudWxsO0tlLkJ1ZmZlcj1wO0tlLlNsb3dCdWZmZXI9QmE7S2UuSU5TUEVDVF9NQVhfQllURVM9NTA7dmFyIE90PTIxNDc0ODM2NDc7S2Uua01heExlbmd0aD1PdDtwLlRZUEVEX0FSUkFZX1NVUFBPUlQ9RWEoKTshcC5UWVBFRF9BUlJBWV9TVVBQT1JUJiZ0eXBlb2YgY29uc29sZTxcInVcIiYmdHlwZW9mIGNvbnNvbGUuZXJyb3I9PVwiZnVuY3Rpb25cIiYmY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSBgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LlwiKTtmdW5jdGlvbiBFYSgpe3RyeXtsZXQgcj1uZXcgVWludDhBcnJheSgxKSxlPXtmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsVWludDhBcnJheS5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZihyLGUpLHIuZm9vKCk9PT00Mn1jYXRjaHtyZXR1cm4hMX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHAucHJvdG90eXBlLFwicGFyZW50XCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoISFwLmlzQnVmZmVyKHRoaXMpKXJldHVybiB0aGlzLmJ1ZmZlcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocC5wcm90b3R5cGUsXCJvZmZzZXRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZighIXAuaXNCdWZmZXIodGhpcykpcmV0dXJuIHRoaXMuYnl0ZU9mZnNldH19KTtmdW5jdGlvbiBkZShyKXtpZihyPk90KXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInK3IrJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpO2xldCBlPW5ldyBVaW50OEFycmF5KHIpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoZSxwLnByb3RvdHlwZSksZX1mdW5jdGlvbiBwKHIsZSx0KXtpZih0eXBlb2Ygcj09XCJudW1iZXJcIil7aWYodHlwZW9mIGU9PVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTtyZXR1cm4gUXIocil9cmV0dXJuIG1pKHIsZSx0KX1wLnBvb2xTaXplPTgxOTI7ZnVuY3Rpb24gbWkocixlLHQpe2lmKHR5cGVvZiByPT1cInN0cmluZ1wiKXJldHVybiBSYShyLGUpO2lmKEFycmF5QnVmZmVyLmlzVmlldyhyKSlyZXR1cm4gVGEocik7aWYocj09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgXCIrdHlwZW9mIHIpO2lmKGllKHIsQXJyYXlCdWZmZXIpfHxyJiZpZShyLmJ1ZmZlcixBcnJheUJ1ZmZlcil8fHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcjxcInVcIiYmKGllKHIsU2hhcmVkQXJyYXlCdWZmZXIpfHxyJiZpZShyLmJ1ZmZlcixTaGFyZWRBcnJheUJ1ZmZlcikpKXJldHVybiBYcihyLGUsdCk7aWYodHlwZW9mIHI9PVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTtsZXQgbj1yLnZhbHVlT2YmJnIudmFsdWVPZigpO2lmKG4hPW51bGwmJm4hPT1yKXJldHVybiBwLmZyb20obixlLHQpO2xldCBpPUNhKHIpO2lmKGkpcmV0dXJuIGk7aWYodHlwZW9mIFN5bWJvbDxcInVcIiYmU3ltYm9sLnRvUHJpbWl0aXZlIT1udWxsJiZ0eXBlb2YgcltTeW1ib2wudG9QcmltaXRpdmVdPT1cImZ1bmN0aW9uXCIpcmV0dXJuIHAuZnJvbShyW1N5bWJvbC50b1ByaW1pdGl2ZV0oXCJzdHJpbmdcIiksZSx0KTt0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgXCIrdHlwZW9mIHIpfXAuZnJvbT1mdW5jdGlvbihyLGUsdCl7cmV0dXJuIG1pKHIsZSx0KX07T2JqZWN0LnNldFByb3RvdHlwZU9mKHAucHJvdG90eXBlLFVpbnQ4QXJyYXkucHJvdG90eXBlKTtPYmplY3Quc2V0UHJvdG90eXBlT2YocCxVaW50OEFycmF5KTtmdW5jdGlvbiBnaShyKXtpZih0eXBlb2YgciE9XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInK3IrJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpfWZ1bmN0aW9uIFNhKHIsZSx0KXtyZXR1cm4gZ2kocikscjw9MD9kZShyKTplIT09dm9pZCAwP3R5cGVvZiB0PT1cInN0cmluZ1wiP2RlKHIpLmZpbGwoZSx0KTpkZShyKS5maWxsKGUpOmRlKHIpfXAuYWxsb2M9ZnVuY3Rpb24ocixlLHQpe3JldHVybiBTYShyLGUsdCl9O2Z1bmN0aW9uIFFyKHIpe3JldHVybiBnaShyKSxkZShyPDA/MDpacihyKXwwKX1wLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHIpe3JldHVybiBRcihyKX07cC5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24ocil7cmV0dXJuIFFyKHIpfTtmdW5jdGlvbiBSYShyLGUpe2lmKCh0eXBlb2YgZSE9XCJzdHJpbmdcInx8ZT09PVwiXCIpJiYoZT1cInV0ZjhcIiksIXAuaXNFbmNvZGluZyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrZSk7bGV0IHQ9eWkocixlKXwwLG49ZGUodCksaT1uLndyaXRlKHIsZSk7cmV0dXJuIGkhPT10JiYobj1uLnNsaWNlKDAsaSkpLG59ZnVuY3Rpb24gS3Iocil7bGV0IGU9ci5sZW5ndGg8MD8wOlpyKHIubGVuZ3RoKXwwLHQ9ZGUoZSk7Zm9yKGxldCBuPTA7bjxlO24rPTEpdFtuXT1yW25dJjI1NTtyZXR1cm4gdH1mdW5jdGlvbiBUYShyKXtpZihpZShyLFVpbnQ4QXJyYXkpKXtsZXQgZT1uZXcgVWludDhBcnJheShyKTtyZXR1cm4gWHIoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCl9cmV0dXJuIEtyKHIpfWZ1bmN0aW9uIFhyKHIsZSx0KXtpZihlPDB8fHIuYnl0ZUxlbmd0aDxlKXRocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO2lmKHIuYnl0ZUxlbmd0aDxlKyh0fHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtsZXQgbjtyZXR1cm4gZT09PXZvaWQgMCYmdD09PXZvaWQgMD9uPW5ldyBVaW50OEFycmF5KHIpOnQ9PT12b2lkIDA/bj1uZXcgVWludDhBcnJheShyLGUpOm49bmV3IFVpbnQ4QXJyYXkocixlLHQpLE9iamVjdC5zZXRQcm90b3R5cGVPZihuLHAucHJvdG90eXBlKSxufWZ1bmN0aW9uIENhKHIpe2lmKHAuaXNCdWZmZXIocikpe2xldCBlPVpyKHIubGVuZ3RoKXwwLHQ9ZGUoZSk7cmV0dXJuIHQubGVuZ3RoPT09MHx8ci5jb3B5KHQsMCwwLGUpLHR9aWYoci5sZW5ndGghPT12b2lkIDApcmV0dXJuIHR5cGVvZiByLmxlbmd0aCE9XCJudW1iZXJcInx8dG4oci5sZW5ndGgpP2RlKDApOktyKHIpO2lmKHIudHlwZT09PVwiQnVmZmVyXCImJkFycmF5LmlzQXJyYXkoci5kYXRhKSlyZXR1cm4gS3Ioci5kYXRhKX1mdW5jdGlvbiBacihyKXtpZihyPj1PdCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHhcIitPdC50b1N0cmluZygxNikrXCIgYnl0ZXNcIik7cmV0dXJuIHJ8MH1mdW5jdGlvbiBCYShyKXtyZXR1cm4rciE9ciYmKHI9MCkscC5hbGxvYygrcil9cC5pc0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gZSE9bnVsbCYmZS5faXNCdWZmZXI9PT0hMCYmZSE9PXAucHJvdG90eXBlfTtwLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZihpZShlLFVpbnQ4QXJyYXkpJiYoZT1wLmZyb20oZSxlLm9mZnNldCxlLmJ5dGVMZW5ndGgpKSxpZSh0LFVpbnQ4QXJyYXkpJiYodD1wLmZyb20odCx0Lm9mZnNldCx0LmJ5dGVMZW5ndGgpKSwhcC5pc0J1ZmZlcihlKXx8IXAuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheScpO2lmKGU9PT10KXJldHVybiAwO2xldCBuPWUubGVuZ3RoLGk9dC5sZW5ndGg7Zm9yKGxldCBvPTAscz1NYXRoLm1pbihuLGkpO288czsrK28paWYoZVtvXSE9PXRbb10pe249ZVtvXSxpPXRbb107YnJlYWt9cmV0dXJuIG48aT8tMTppPG4/MTowfTtwLmlzRW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpKXtjYXNlXCJoZXhcIjpjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpjYXNlXCJhc2NpaVwiOmNhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOmNhc2VcImJhc2U2NFwiOmNhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtwLmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKGUubGVuZ3RoPT09MClyZXR1cm4gcC5hbGxvYygwKTtsZXQgbjtpZih0PT09dm9pZCAwKWZvcih0PTAsbj0wO248ZS5sZW5ndGg7KytuKXQrPWVbbl0ubGVuZ3RoO2xldCBpPXAuYWxsb2NVbnNhZmUodCksbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe2xldCBzPWVbbl07aWYoaWUocyxVaW50OEFycmF5KSlvK3MubGVuZ3RoPmkubGVuZ3RoPyhwLmlzQnVmZmVyKHMpfHwocz1wLmZyb20ocykpLHMuY29weShpLG8pKTpVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChpLHMsbyk7ZWxzZSBpZihwLmlzQnVmZmVyKHMpKXMuY29weShpLG8pO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7bys9cy5sZW5ndGh9cmV0dXJuIGl9O2Z1bmN0aW9uIHlpKHIsZSl7aWYocC5pc0J1ZmZlcihyKSlyZXR1cm4gci5sZW5ndGg7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpfHxpZShyLEFycmF5QnVmZmVyKSlyZXR1cm4gci5ieXRlTGVuZ3RoO2lmKHR5cGVvZiByIT1cInN0cmluZ1wiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpO2xldCB0PXIubGVuZ3RoLG49YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl09PT0hMDtpZighbiYmdD09PTApcmV0dXJuIDA7bGV0IGk9ITE7Zm9yKDs7KXN3aXRjaChlKXtjYXNlXCJhc2NpaVwiOmNhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVybiB0O2Nhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOnJldHVybiBKcihyKS5sZW5ndGg7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIHQqMjtjYXNlXCJoZXhcIjpyZXR1cm4gdD4+PjE7Y2FzZVwiYmFzZTY0XCI6cmV0dXJuIFRpKHIpLmxlbmd0aDtkZWZhdWx0OmlmKGkpcmV0dXJuIG4/LTE6SnIocikubGVuZ3RoO2U9KFwiXCIrZSkudG9Mb3dlckNhc2UoKSxpPSEwfX1wLmJ5dGVMZW5ndGg9eWk7ZnVuY3Rpb24gTWEocixlLHQpe2xldCBuPSExO2lmKChlPT09dm9pZCAwfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RofHwoKHQ9PT12b2lkIDB8fHQ+dGhpcy5sZW5ndGgpJiYodD10aGlzLmxlbmd0aCksdDw9MCl8fCh0Pj4+PTAsZT4+Pj0wLHQ8PWUpKXJldHVyblwiXCI7Zm9yKHJ8fChyPVwidXRmOFwiKTs7KXN3aXRjaChyKXtjYXNlXCJoZXhcIjpyZXR1cm4gTmEodGhpcyxlLHQpO2Nhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOnJldHVybiB4aSh0aGlzLGUsdCk7Y2FzZVwiYXNjaWlcIjpyZXR1cm4gVWEodGhpcyxlLHQpO2Nhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVybiBEYSh0aGlzLGUsdCk7Y2FzZVwiYmFzZTY0XCI6cmV0dXJuIGthKHRoaXMsZSx0KTtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gSGEodGhpcyxlLHQpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrcik7cj0ocitcIlwiKS50b0xvd2VyQ2FzZSgpLG49ITB9fXAucHJvdG90eXBlLl9pc0J1ZmZlcj0hMDtmdW5jdGlvbiBQZShyLGUsdCl7bGV0IG49cltlXTtyW2VdPXJbdF0sclt0XT1ufXAucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe2xldCBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0c1wiKTtmb3IobGV0IHQ9MDt0PGU7dCs9MilQZSh0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5sZW5ndGg7aWYoZSU0IT09MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzXCIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kz00KVBlKHRoaXMsdCx0KzMpLFBlKHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe2xldCBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0c1wiKTtmb3IobGV0IHQ9MDt0PGU7dCs9OClQZSh0aGlzLHQsdCs3KSxQZSh0aGlzLHQrMSx0KzYpLFBlKHRoaXMsdCsyLHQrNSksUGUodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgZT10aGlzLmxlbmd0aDtyZXR1cm4gZT09PTA/XCJcIjphcmd1bWVudHMubGVuZ3RoPT09MD94aSh0aGlzLDAsZSk6TWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtwLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZz1wLnByb3RvdHlwZS50b1N0cmluZztwLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIXAuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXJcIik7cmV0dXJuIHRoaXM9PT1lPyEwOnAuY29tcGFyZSh0aGlzLGUpPT09MH07cC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe2xldCBlPVwiXCIsdD1LZS5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gZT10aGlzLnRvU3RyaW5nKFwiaGV4XCIsMCx0KS5yZXBsYWNlKC8oLnsyfSkvZyxcIiQxIFwiKS50cmltKCksdGhpcy5sZW5ndGg+dCYmKGUrPVwiIC4uLiBcIiksXCI8QnVmZmVyIFwiK2UrXCI+XCJ9O2xpJiYocC5wcm90b3R5cGVbbGldPXAucHJvdG90eXBlLmluc3BlY3QpO3AucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LG4saSxvKXtpZihpZShlLFVpbnQ4QXJyYXkpJiYoZT1wLmZyb20oZSxlLm9mZnNldCxlLmJ5dGVMZW5ndGgpKSwhcC5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIGUpO2lmKHQ9PT12b2lkIDAmJih0PTApLG49PT12b2lkIDAmJihuPWU/ZS5sZW5ndGg6MCksaT09PXZvaWQgMCYmKGk9MCksbz09PXZvaWQgMCYmKG89dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8aTwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwib3V0IG9mIHJhbmdlIGluZGV4XCIpO2lmKGk+PW8mJnQ+PW4pcmV0dXJuIDA7aWYoaT49bylyZXR1cm4tMTtpZih0Pj1uKXJldHVybiAxO2lmKHQ+Pj49MCxuPj4+PTAsaT4+Pj0wLG8+Pj49MCx0aGlzPT09ZSlyZXR1cm4gMDtsZXQgcz1vLWksYT1uLXQsdT1NYXRoLm1pbihzLGEpLGY9dGhpcy5zbGljZShpLG8pLGw9ZS5zbGljZSh0LG4pO2ZvcihsZXQgZD0wO2Q8dTsrK2QpaWYoZltkXSE9PWxbZF0pe3M9ZltkXSxhPWxbZF07YnJlYWt9cmV0dXJuIHM8YT8tMTphPHM/MTowfTtmdW5jdGlvbiBiaShyLGUsdCxuLGkpe2lmKHIubGVuZ3RoPT09MClyZXR1cm4tMTtpZih0eXBlb2YgdD09XCJzdHJpbmdcIj8obj10LHQ9MCk6dD4yMTQ3NDgzNjQ3P3Q9MjE0NzQ4MzY0Nzp0PC0yMTQ3NDgzNjQ4JiYodD0tMjE0NzQ4MzY0OCksdD0rdCx0bih0KSYmKHQ9aT8wOnIubGVuZ3RoLTEpLHQ8MCYmKHQ9ci5sZW5ndGgrdCksdD49ci5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7dD1yLmxlbmd0aC0xfWVsc2UgaWYodDwwKWlmKGkpdD0wO2Vsc2UgcmV0dXJuLTE7aWYodHlwZW9mIGU9PVwic3RyaW5nXCImJihlPXAuZnJvbShlLG4pKSxwLmlzQnVmZmVyKGUpKXJldHVybiBlLmxlbmd0aD09PTA/LTE6ZGkocixlLHQsbixpKTtpZih0eXBlb2YgZT09XCJudW1iZXJcIilyZXR1cm4gZT1lJjI1NSx0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj09XCJmdW5jdGlvblwiP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHIsZSx0KTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHIsZSx0KTpkaShyLFtlXSx0LG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlclwiKX1mdW5jdGlvbiBkaShyLGUsdCxuLGkpe2xldCBvPTEscz1yLmxlbmd0aCxhPWUubGVuZ3RoO2lmKG4hPT12b2lkIDAmJihuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpLG49PT1cInVjczJcInx8bj09PVwidWNzLTJcInx8bj09PVwidXRmMTZsZVwifHxuPT09XCJ1dGYtMTZsZVwiKSl7aWYoci5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTtvPTIscy89MixhLz0yLHQvPTJ9ZnVuY3Rpb24gdShsLGQpe3JldHVybiBvPT09MT9sW2RdOmwucmVhZFVJbnQxNkJFKGQqbyl9bGV0IGY7aWYoaSl7bGV0IGw9LTE7Zm9yKGY9dDtmPHM7ZisrKWlmKHUocixmKT09PXUoZSxsPT09LTE/MDpmLWwpKXtpZihsPT09LTEmJihsPWYpLGYtbCsxPT09YSlyZXR1cm4gbCpvfWVsc2UgbCE9PS0xJiYoZi09Zi1sKSxsPS0xfWVsc2UgZm9yKHQrYT5zJiYodD1zLWEpLGY9dDtmPj0wO2YtLSl7bGV0IGw9ITA7Zm9yKGxldCBkPTA7ZDxhO2QrKylpZih1KHIsZitkKSE9PXUoZSxkKSl7bD0hMTticmVha31pZihsKXJldHVybiBmfXJldHVybi0xfXAucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5pbmRleE9mKGUsdCxuKSE9PS0xfTtwLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYmkodGhpcyxlLHQsbiwhMCl9O3AucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYmkodGhpcyxlLHQsbiwhMSl9O2Z1bmN0aW9uIExhKHIsZSx0LG4pe3Q9TnVtYmVyKHQpfHwwO2xldCBpPXIubGVuZ3RoLXQ7bj8obj1OdW1iZXIobiksbj5pJiYobj1pKSk6bj1pO2xldCBvPWUubGVuZ3RoO24+by8yJiYobj1vLzIpO2xldCBzO2ZvcihzPTA7czxuOysrcyl7bGV0IGE9cGFyc2VJbnQoZS5zdWJzdHIocyoyLDIpLDE2KTtpZih0bihhKSlyZXR1cm4gcztyW3Qrc109YX1yZXR1cm4gc31mdW5jdGlvbiBJYShyLGUsdCxuKXtyZXR1cm4gVXQoSnIoZSxyLmxlbmd0aC10KSxyLHQsbil9ZnVuY3Rpb24gQWEocixlLHQsbil7cmV0dXJuIFV0KCRhKGUpLHIsdCxuKX1mdW5jdGlvbiBGYShyLGUsdCxuKXtyZXR1cm4gVXQoVGkoZSkscix0LG4pfWZ1bmN0aW9uIFBhKHIsZSx0LG4pe3JldHVybiBVdChHYShlLHIubGVuZ3RoLXQpLHIsdCxuKX1wLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixpKXtpZih0PT09dm9pZCAwKWk9XCJ1dGY4XCIsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZihuPT09dm9pZCAwJiZ0eXBlb2YgdD09XCJzdHJpbmdcIilpPXQsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZihpc0Zpbml0ZSh0KSl0PXQ+Pj4wLGlzRmluaXRlKG4pPyhuPW4+Pj4wLGk9PT12b2lkIDAmJihpPVwidXRmOFwiKSk6KGk9bixuPXZvaWQgMCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFwiKTtsZXQgbz10aGlzLmxlbmd0aC10O2lmKChuPT09dm9pZCAwfHxuPm8pJiYobj1vKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHNcIik7aXx8KGk9XCJ1dGY4XCIpO2xldCBzPSExO2Zvcig7Oylzd2l0Y2goaSl7Y2FzZVwiaGV4XCI6cmV0dXJuIExhKHRoaXMsZSx0LG4pO2Nhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOnJldHVybiBJYSh0aGlzLGUsdCxuKTtjYXNlXCJhc2NpaVwiOmNhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVybiBBYSh0aGlzLGUsdCxuKTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4gRmEodGhpcyxlLHQsbik7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIFBhKHRoaXMsZSx0LG4pO2RlZmF1bHQ6aWYocyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIraSk7aT0oXCJcIitpKS50b0xvd2VyQ2FzZSgpLHM9ITB9fTtwLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTpcIkJ1ZmZlclwiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24ga2EocixlLHQpe3JldHVybiBlPT09MCYmdD09PXIubGVuZ3RoP1lyLmZyb21CeXRlQXJyYXkocik6WXIuZnJvbUJ5dGVBcnJheShyLnNsaWNlKGUsdCkpfWZ1bmN0aW9uIHhpKHIsZSx0KXt0PU1hdGgubWluKHIubGVuZ3RoLHQpO2xldCBuPVtdLGk9ZTtmb3IoO2k8dDspe2xldCBvPXJbaV0scz1udWxsLGE9bz4yMzk/NDpvPjIyMz8zOm8+MTkxPzI6MTtpZihpK2E8PXQpe2xldCB1LGYsbCxkO3N3aXRjaChhKXtjYXNlIDE6bzwxMjgmJihzPW8pO2JyZWFrO2Nhc2UgMjp1PXJbaSsxXSwodSYxOTIpPT09MTI4JiYoZD0obyYzMSk8PDZ8dSY2MyxkPjEyNyYmKHM9ZCkpO2JyZWFrO2Nhc2UgMzp1PXJbaSsxXSxmPXJbaSsyXSwodSYxOTIpPT09MTI4JiYoZiYxOTIpPT09MTI4JiYoZD0obyYxNSk8PDEyfCh1JjYzKTw8NnxmJjYzLGQ+MjA0NyYmKGQ8NTUyOTZ8fGQ+NTczNDMpJiYocz1kKSk7YnJlYWs7Y2FzZSA0OnU9cltpKzFdLGY9cltpKzJdLGw9cltpKzNdLCh1JjE5Mik9PT0xMjgmJihmJjE5Mik9PT0xMjgmJihsJjE5Mik9PT0xMjgmJihkPShvJjE1KTw8MTh8KHUmNjMpPDwxMnwoZiY2Myk8PDZ8bCY2MyxkPjY1NTM1JiZkPDExMTQxMTImJihzPWQpKX19cz09PW51bGw/KHM9NjU1MzMsYT0xKTpzPjY1NTM1JiYocy09NjU1MzYsbi5wdXNoKHM+Pj4xMCYxMDIzfDU1Mjk2KSxzPTU2MzIwfHMmMTAyMyksbi5wdXNoKHMpLGkrPWF9cmV0dXJuIE9hKG4pfXZhciBwaT00MDk2O2Z1bmN0aW9uIE9hKHIpe2xldCBlPXIubGVuZ3RoO2lmKGU8PXBpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxyKTtsZXQgdD1cIlwiLG49MDtmb3IoO248ZTspdCs9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsci5zbGljZShuLG4rPXBpKSk7cmV0dXJuIHR9ZnVuY3Rpb24gVWEocixlLHQpe2xldCBuPVwiXCI7dD1NYXRoLm1pbihyLmxlbmd0aCx0KTtmb3IobGV0IGk9ZTtpPHQ7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSYxMjcpO3JldHVybiBufWZ1bmN0aW9uIERhKHIsZSx0KXtsZXQgbj1cIlwiO3Q9TWF0aC5taW4oci5sZW5ndGgsdCk7Zm9yKGxldCBpPWU7aTx0OysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0pO3JldHVybiBufWZ1bmN0aW9uIE5hKHIsZSx0KXtsZXQgbj1yLmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghdHx8dDwwfHx0Pm4pJiYodD1uKTtsZXQgaT1cIlwiO2ZvcihsZXQgbz1lO288dDsrK28paSs9VmFbcltvXV07cmV0dXJuIGl9ZnVuY3Rpb24gSGEocixlLHQpe2xldCBuPXIuc2xpY2UoZSx0KSxpPVwiXCI7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aC0xO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dK25bbysxXSoyNTYpO3JldHVybiBpfXAucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7bGV0IG49dGhpcy5sZW5ndGg7ZT1+fmUsdD10PT09dm9pZCAwP246fn50LGU8MD8oZSs9bixlPDAmJihlPTApKTplPm4mJihlPW4pLHQ8MD8odCs9bix0PDAmJih0PTApKTp0Pm4mJih0PW4pLHQ8ZSYmKHQ9ZSk7bGV0IGk9dGhpcy5zdWJhcnJheShlLHQpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoaSxwLnByb3RvdHlwZSksaX07ZnVuY3Rpb24gRChyLGUsdCl7aWYociUxIT09MHx8cjwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwib2Zmc2V0IGlzIG5vdCB1aW50XCIpO2lmKHIrZT50KXRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aFwiKX1wLnByb3RvdHlwZS5yZWFkVWludExFPXAucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2U9ZT4+PjAsdD10Pj4+MCxufHxEKGUsdCx0aGlzLmxlbmd0aCk7bGV0IGk9dGhpc1tlXSxvPTEscz0wO2Zvcig7KytzPHQmJihvKj0yNTYpOylpKz10aGlzW2Urc10qbztyZXR1cm4gaX07cC5wcm90b3R5cGUucmVhZFVpbnRCRT1wLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxuKXtlPWU+Pj4wLHQ9dD4+PjAsbnx8RChlLHQsdGhpcy5sZW5ndGgpO2xldCBpPXRoaXNbZSstLXRdLG89MTtmb3IoO3Q+MCYmKG8qPTI1Nik7KWkrPXRoaXNbZSstLXRdKm87cmV0dXJuIGl9O3AucHJvdG90eXBlLnJlYWRVaW50OD1wLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX07cC5wcm90b3R5cGUucmVhZFVpbnQxNkxFPXAucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH07cC5wcm90b3R5cGUucmVhZFVpbnQxNkJFPXAucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX07cC5wcm90b3R5cGUucmVhZFVpbnQzMkxFPXAucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrdGhpc1tlKzNdKjE2Nzc3MjE2fTtwLnByb3RvdHlwZS5yZWFkVWludDMyQkU9cC5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV0qMTY3NzcyMTYrKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9O3AucHJvdG90eXBlLnJlYWRCaWdVSW50NjRMRT1iZShmdW5jdGlvbihlKXtlPWU+Pj4wLFllKGUsXCJvZmZzZXRcIik7bGV0IHQ9dGhpc1tlXSxuPXRoaXNbZSs3XTsodD09PXZvaWQgMHx8bj09PXZvaWQgMCkmJnd0KGUsdGhpcy5sZW5ndGgtOCk7bGV0IGk9dCt0aGlzWysrZV0qMioqOCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjI0LG89dGhpc1srK2VdK3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSoyKioxNituKjIqKjI0O3JldHVybiBCaWdJbnQoaSkrKEJpZ0ludChvKTw8QmlnSW50KDMyKSl9KTtwLnByb3RvdHlwZS5yZWFkQmlnVUludDY0QkU9YmUoZnVuY3Rpb24oZSl7ZT1lPj4+MCxZZShlLFwib2Zmc2V0XCIpO2xldCB0PXRoaXNbZV0sbj10aGlzW2UrN107KHQ9PT12b2lkIDB8fG49PT12b2lkIDApJiZ3dChlLHRoaXMubGVuZ3RoLTgpO2xldCBpPXQqMioqMjQrdGhpc1srK2VdKjIqKjE2K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSxvPXRoaXNbKytlXSoyKioyNCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjgrbjtyZXR1cm4oQmlnSW50KGkpPDxCaWdJbnQoMzIpKStCaWdJbnQobyl9KTtwLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2U9ZT4+PjAsdD10Pj4+MCxufHxEKGUsdCx0aGlzLmxlbmd0aCk7bGV0IGk9dGhpc1tlXSxvPTEscz0wO2Zvcig7KytzPHQmJihvKj0yNTYpOylpKz10aGlzW2Urc10qbztyZXR1cm4gbyo9MTI4LGk+PW8mJihpLT1NYXRoLnBvdygyLDgqdCkpLGl9O3AucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbihlLHQsbil7ZT1lPj4+MCx0PXQ+Pj4wLG58fEQoZSx0LHRoaXMubGVuZ3RoKTtsZXQgaT10LG89MSxzPXRoaXNbZSstLWldO2Zvcig7aT4wJiYobyo9MjU2KTspcys9dGhpc1tlKy0taV0qbztyZXR1cm4gbyo9MTI4LHM+PW8mJihzLT1NYXRoLnBvdygyLDgqdCkpLHN9O3AucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV0mMTI4PygyNTUtdGhpc1tlXSsxKSotMTp0aGlzW2VdfTtwLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe2U9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpO2xldCBuPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiBuJjMyNzY4P258NDI5NDkwMTc2MDpufTtwLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe2U9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpO2xldCBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiBuJjMyNzY4P258NDI5NDkwMTc2MDpufTtwLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9O3AucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX07cC5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEU9YmUoZnVuY3Rpb24oZSl7ZT1lPj4+MCxZZShlLFwib2Zmc2V0XCIpO2xldCB0PXRoaXNbZV0sbj10aGlzW2UrN107KHQ9PT12b2lkIDB8fG49PT12b2lkIDApJiZ3dChlLHRoaXMubGVuZ3RoLTgpO2xldCBpPXRoaXNbZSs0XSt0aGlzW2UrNV0qMioqOCt0aGlzW2UrNl0qMioqMTYrKG48PDI0KTtyZXR1cm4oQmlnSW50KGkpPDxCaWdJbnQoMzIpKStCaWdJbnQodCt0aGlzWysrZV0qMioqOCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjI0KX0pO3AucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFPWJlKGZ1bmN0aW9uKGUpe2U9ZT4+PjAsWWUoZSxcIm9mZnNldFwiKTtsZXQgdD10aGlzW2VdLG49dGhpc1tlKzddOyh0PT09dm9pZCAwfHxuPT09dm9pZCAwKSYmd3QoZSx0aGlzLmxlbmd0aC04KTtsZXQgaT0odDw8MjQpK3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqOCt0aGlzWysrZV07cmV0dXJuKEJpZ0ludChpKTw8QmlnSW50KDMyKSkrQmlnSW50KHRoaXNbKytlXSoyKioyNCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjgrbil9KTtwLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSx6ZS5yZWFkKHRoaXMsZSwhMCwyMyw0KX07cC5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksemUucmVhZCh0aGlzLGUsITEsMjMsNCl9O3AucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw4LHRoaXMubGVuZ3RoKSx6ZS5yZWFkKHRoaXMsZSwhMCw1Miw4KX07cC5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDgsdGhpcy5sZW5ndGgpLHplLnJlYWQodGhpcyxlLCExLDUyLDgpfTtmdW5jdGlvbiBXKHIsZSx0LG4saSxvKXtpZighcC5pc0J1ZmZlcihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZih0K24+ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIil9cC5wcm90b3R5cGUud3JpdGVVaW50TEU9cC5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LG4saSl7aWYoZT0rZSx0PXQ+Pj4wLG49bj4+PjAsIWkpe2xldCBhPU1hdGgucG93KDIsOCpuKS0xO1codGhpcyxlLHQsbixhLDApfWxldCBvPTEscz0wO2Zvcih0aGlzW3RdPWUmMjU1OysrczxuJiYobyo9MjU2KTspdGhpc1t0K3NdPWUvbyYyNTU7cmV0dXJuIHQrbn07cC5wcm90b3R5cGUud3JpdGVVaW50QkU9cC5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LG4saSl7aWYoZT0rZSx0PXQ+Pj4wLG49bj4+PjAsIWkpe2xldCBhPU1hdGgucG93KDIsOCpuKS0xO1codGhpcyxlLHQsbixhLDApfWxldCBvPW4tMSxzPTE7Zm9yKHRoaXNbdCtvXT1lJjI1NTstLW8+PTAmJihzKj0yNTYpOyl0aGlzW3Qrb109ZS9zJjI1NTtyZXR1cm4gdCtufTtwLnByb3RvdHlwZS53cml0ZVVpbnQ4PXAucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCwxLDI1NSwwKSx0aGlzW3RdPWUmMjU1LHQrMX07cC5wcm90b3R5cGUud3JpdGVVaW50MTZMRT1wLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiw2NTUzNSwwKSx0aGlzW3RdPWUmMjU1LHRoaXNbdCsxXT1lPj4+OCx0KzJ9O3AucHJvdG90eXBlLndyaXRlVWludDE2QkU9cC5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDIsNjU1MzUsMCksdGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09ZSYyNTUsdCsyfTtwLnByb3RvdHlwZS53cml0ZVVpbnQzMkxFPXAucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksdGhpc1t0KzNdPWU+Pj4yNCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCsxXT1lPj4+OCx0aGlzW3RdPWUmMjU1LHQrNH07cC5wcm90b3R5cGUud3JpdGVVaW50MzJCRT1wLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT1lJjI1NSx0KzR9O2Z1bmN0aW9uIF9pKHIsZSx0LG4saSl7UmkoZSxuLGkscix0LDcpO2xldCBvPU51bWJlcihlJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7clt0KytdPW8sbz1vPj44LHJbdCsrXT1vLG89bz4+OCxyW3QrK109byxvPW8+Pjgsclt0KytdPW87bGV0IHM9TnVtYmVyKGU+PkJpZ0ludCgzMikmQmlnSW50KDQyOTQ5NjcyOTUpKTtyZXR1cm4gclt0KytdPXMscz1zPj44LHJbdCsrXT1zLHM9cz4+OCxyW3QrK109cyxzPXM+Pjgsclt0KytdPXMsdH1mdW5jdGlvbiB3aShyLGUsdCxuLGkpe1JpKGUsbixpLHIsdCw3KTtsZXQgbz1OdW1iZXIoZSZCaWdJbnQoNDI5NDk2NzI5NSkpO3JbdCs3XT1vLG89bz4+OCxyW3QrNl09byxvPW8+Pjgsclt0KzVdPW8sbz1vPj44LHJbdCs0XT1vO2xldCBzPU51bWJlcihlPj5CaWdJbnQoMzIpJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7cmV0dXJuIHJbdCszXT1zLHM9cz4+OCxyW3QrMl09cyxzPXM+Pjgsclt0KzFdPXMscz1zPj44LHJbdF09cyx0Kzh9cC5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIF9pKHRoaXMsZSx0LEJpZ0ludCgwKSxCaWdJbnQoXCIweGZmZmZmZmZmZmZmZmZmZmZcIikpfSk7cC5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRCRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIHdpKHRoaXMsZSx0LEJpZ0ludCgwKSxCaWdJbnQoXCIweGZmZmZmZmZmZmZmZmZmZmZcIikpfSk7cC5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsIWkpe2xldCB1PU1hdGgucG93KDIsOCpuLTEpO1codGhpcyxlLHQsbix1LTEsLXUpfWxldCBvPTAscz0xLGE9MDtmb3IodGhpc1t0XT1lJjI1NTsrK288biYmKHMqPTI1Nik7KWU8MCYmYT09PTAmJnRoaXNbdCtvLTFdIT09MCYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259O3AucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24oZSx0LG4saSl7aWYoZT0rZSx0PXQ+Pj4wLCFpKXtsZXQgdT1NYXRoLnBvdygyLDgqbi0xKTtXKHRoaXMsZSx0LG4sdS0xLC11KX1sZXQgbz1uLTEscz0xLGE9MDtmb3IodGhpc1t0K29dPWUmMjU1Oy0tbz49MCYmKHMqPTI1Nik7KWU8MCYmYT09PTAmJnRoaXNbdCtvKzFdIT09MCYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259O3AucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDEsMTI3LC0xMjgpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT1lJjI1NSx0KzF9O3AucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSx0aGlzW3RdPWUmMjU1LHRoaXNbdCsxXT1lPj4+OCx0KzJ9O3AucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSx0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT1lJjI1NSx0KzJ9O3AucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdGhpc1t0XT1lJjI1NSx0aGlzW3QrMV09ZT4+PjgsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrM109ZT4+PjI0LHQrNH07cC5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSx0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109ZSYyNTUsdCs0fTtwLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEU9YmUoZnVuY3Rpb24oZSx0PTApe3JldHVybiBfaSh0aGlzLGUsdCwtQmlnSW50KFwiMHg4MDAwMDAwMDAwMDAwMDAwXCIpLEJpZ0ludChcIjB4N2ZmZmZmZmZmZmZmZmZmZlwiKSl9KTtwLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkU9YmUoZnVuY3Rpb24oZSx0PTApe3JldHVybiB3aSh0aGlzLGUsdCwtQmlnSW50KFwiMHg4MDAwMDAwMDAwMDAwMDAwXCIpLEJpZ0ludChcIjB4N2ZmZmZmZmZmZmZmZmZmZlwiKSl9KTtmdW5jdGlvbiB2aShyLGUsdCxuLGksbyl7aWYodCtuPnIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKX1mdW5jdGlvbiBFaShyLGUsdCxuLGkpe3JldHVybiBlPStlLHQ9dD4+PjAsaXx8dmkocixlLHQsNCwzNDAyODIzNDY2Mzg1Mjg4NmUyMiwtMzQwMjgyMzQ2NjM4NTI4ODZlMjIpLHplLndyaXRlKHIsZSx0LG4sMjMsNCksdCs0fXAucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEVpKHRoaXMsZSx0LCEwLG4pfTtwLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBFaSh0aGlzLGUsdCwhMSxuKX07ZnVuY3Rpb24gU2kocixlLHQsbixpKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLGl8fHZpKHIsZSx0LDgsMTc5NzY5MzEzNDg2MjMxNTdlMjkyLC0xNzk3NjkzMTM0ODYyMzE1N2UyOTIpLHplLndyaXRlKHIsZSx0LG4sNTIsOCksdCs4fXAucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTaSh0aGlzLGUsdCwhMCxuKX07cC5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFNpKHRoaXMsZSx0LCExLG4pfTtwLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxuLGkpe2lmKCFwLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXJcIik7aWYobnx8KG49MCksIWkmJmkhPT0wJiYoaT10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxpPjAmJmk8biYmKGk9biksaT09PW58fGUubGVuZ3RoPT09MHx8dGhpcy5sZW5ndGg9PT0wKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHNcIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtpZihpPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kc1wiKTtpPnRoaXMubGVuZ3RoJiYoaT10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxpLW4mJihpPWUubGVuZ3RoLXQrbik7bGV0IG89aS1uO3JldHVybiB0aGlzPT09ZSYmdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW49PVwiZnVuY3Rpb25cIj90aGlzLmNvcHlXaXRoaW4odCxuLGkpOlVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLGkpLHQpLG99O3AucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4saSl7aWYodHlwZW9mIGU9PVwic3RyaW5nXCIpe2lmKHR5cGVvZiB0PT1cInN0cmluZ1wiPyhpPXQsdD0wLG49dGhpcy5sZW5ndGgpOnR5cGVvZiBuPT1cInN0cmluZ1wiJiYoaT1uLG49dGhpcy5sZW5ndGgpLGkhPT12b2lkIDAmJnR5cGVvZiBpIT1cInN0cmluZ1wiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nXCIpO2lmKHR5cGVvZiBpPT1cInN0cmluZ1wiJiYhcC5pc0VuY29kaW5nKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitpKTtpZihlLmxlbmd0aD09PTEpe2xldCBzPWUuY2hhckNvZGVBdCgwKTsoaT09PVwidXRmOFwiJiZzPDEyOHx8aT09PVwibGF0aW4xXCIpJiYoZT1zKX19ZWxzZSB0eXBlb2YgZT09XCJudW1iZXJcIj9lPWUmMjU1OnR5cGVvZiBlPT1cImJvb2xlYW5cIiYmKGU9TnVtYmVyKGUpKTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJPdXQgb2YgcmFuZ2UgaW5kZXhcIik7aWYobjw9dClyZXR1cm4gdGhpczt0PXQ+Pj4wLG49bj09PXZvaWQgMD90aGlzLmxlbmd0aDpuPj4+MCxlfHwoZT0wKTtsZXQgbztpZih0eXBlb2YgZT09XCJudW1iZXJcIilmb3Iobz10O288bjsrK28pdGhpc1tvXT1lO2Vsc2V7bGV0IHM9cC5pc0J1ZmZlcihlKT9lOnAuZnJvbShlLGkpLGE9cy5sZW5ndGg7aWYoYT09PTApdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJytlKydcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKTtmb3Iobz0wO288bi10Oysrbyl0aGlzW28rdF09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgVmU9e307ZnVuY3Rpb24gZW4ocixlLHQpe1ZlW3JdPWNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJtZXNzYWdlXCIse3ZhbHVlOmUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHRoaXMubmFtZT1gJHt0aGlzLm5hbWV9IFske3J9XWAsdGhpcy5zdGFjayxkZWxldGUgdGhpcy5uYW1lfWdldCBjb2RlKCl7cmV0dXJuIHJ9c2V0IGNvZGUoaSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJjb2RlXCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmksd3JpdGFibGU6ITB9KX10b1N0cmluZygpe3JldHVybmAke3RoaXMubmFtZX0gWyR7cn1dOiAke3RoaXMubWVzc2FnZX1gfX19ZW4oXCJFUlJfQlVGRkVSX09VVF9PRl9CT1VORFNcIixmdW5jdGlvbihyKXtyZXR1cm4gcj9gJHtyfSBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHNgOlwiQXR0ZW1wdCB0byBhY2Nlc3MgbWVtb3J5IG91dHNpZGUgYnVmZmVyIGJvdW5kc1wifSxSYW5nZUVycm9yKTtlbihcIkVSUl9JTlZBTElEX0FSR19UWVBFXCIsZnVuY3Rpb24ocixlKXtyZXR1cm5gVGhlIFwiJHtyfVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgZX1gfSxUeXBlRXJyb3IpO2VuKFwiRVJSX09VVF9PRl9SQU5HRVwiLGZ1bmN0aW9uKHIsZSx0KXtsZXQgbj1gVGhlIHZhbHVlIG9mIFwiJHtyfVwiIGlzIG91dCBvZiByYW5nZS5gLGk9dDtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih0KSYmTWF0aC5hYnModCk+MioqMzI/aT1oaShTdHJpbmcodCkpOnR5cGVvZiB0PT1cImJpZ2ludFwiJiYoaT1TdHJpbmcodCksKHQ+QmlnSW50KDIpKipCaWdJbnQoMzIpfHx0PC0oQmlnSW50KDIpKipCaWdJbnQoMzIpKSkmJihpPWhpKGkpKSxpKz1cIm5cIiksbis9YCBJdCBtdXN0IGJlICR7ZX0uIFJlY2VpdmVkICR7aX1gLG59LFJhbmdlRXJyb3IpO2Z1bmN0aW9uIGhpKHIpe2xldCBlPVwiXCIsdD1yLmxlbmd0aCxuPXJbMF09PT1cIi1cIj8xOjA7Zm9yKDt0Pj1uKzQ7dC09MyllPWBfJHtyLnNsaWNlKHQtMyx0KX0ke2V9YDtyZXR1cm5gJHtyLnNsaWNlKDAsdCl9JHtlfWB9ZnVuY3Rpb24gcWEocixlLHQpe1llKGUsXCJvZmZzZXRcIiksKHJbZV09PT12b2lkIDB8fHJbZSt0XT09PXZvaWQgMCkmJnd0KGUsci5sZW5ndGgtKHQrMSkpfWZ1bmN0aW9uIFJpKHIsZSx0LG4saSxvKXtpZihyPnR8fHI8ZSl7bGV0IHM9dHlwZW9mIGU9PVwiYmlnaW50XCI/XCJuXCI6XCJcIixhO3Rocm93IG8+Mz9lPT09MHx8ZT09PUJpZ0ludCgwKT9hPWA+PSAwJHtzfSBhbmQgPCAyJHtzfSAqKiAkeyhvKzEpKjh9JHtzfWA6YT1gPj0gLSgyJHtzfSAqKiAkeyhvKzEpKjgtMX0ke3N9KSBhbmQgPCAyICoqICR7KG8rMSkqOC0xfSR7c31gOmE9YD49ICR7ZX0ke3N9IGFuZCA8PSAke3R9JHtzfWAsbmV3IFZlLkVSUl9PVVRfT0ZfUkFOR0UoXCJ2YWx1ZVwiLGEscil9cWEobixpLG8pfWZ1bmN0aW9uIFllKHIsZSl7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFZlLkVSUl9JTlZBTElEX0FSR19UWVBFKGUsXCJudW1iZXJcIixyKX1mdW5jdGlvbiB3dChyLGUsdCl7dGhyb3cgTWF0aC5mbG9vcihyKSE9PXI/KFllKHIsdCksbmV3IFZlLkVSUl9PVVRfT0ZfUkFOR0UodHx8XCJvZmZzZXRcIixcImFuIGludGVnZXJcIixyKSk6ZTwwP25ldyBWZS5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFM6bmV3IFZlLkVSUl9PVVRfT0ZfUkFOR0UodHx8XCJvZmZzZXRcIixgPj0gJHt0PzE6MH0gYW5kIDw9ICR7ZX1gLHIpfXZhciBqYT0vW14rLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIFdhKHIpe2lmKHI9ci5zcGxpdChcIj1cIilbMF0scj1yLnRyaW0oKS5yZXBsYWNlKGphLFwiXCIpLHIubGVuZ3RoPDIpcmV0dXJuXCJcIjtmb3IoO3IubGVuZ3RoJTQhPT0wOylyPXIrXCI9XCI7cmV0dXJuIHJ9ZnVuY3Rpb24gSnIocixlKXtlPWV8fDEvMDtsZXQgdCxuPXIubGVuZ3RoLGk9bnVsbCxvPVtdO2ZvcihsZXQgcz0wO3M8bjsrK3Mpe2lmKHQ9ci5jaGFyQ29kZUF0KHMpLHQ+NTUyOTUmJnQ8NTczNDQpe2lmKCFpKXtpZih0PjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9ZWxzZSBpZihzKzE9PT1uKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT10O2NvbnRpbnVlfWlmKHQ8NTYzMjApeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXQ7Y29udGludWV9dD0oaS01NTI5Njw8MTB8dC01NjMyMCkrNjU1MzZ9ZWxzZSBpJiYoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHQ8MTI4KXtpZigoZS09MSk8MClicmVhaztvLnB1c2godCl9ZWxzZSBpZih0PDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO28ucHVzaCh0Pj42fDE5Mix0JjYzfDEyOCl9ZWxzZSBpZih0PDY1NTM2KXtpZigoZS09Myk8MClicmVhaztvLnB1c2godD4+MTJ8MjI0LHQ+PjYmNjN8MTI4LHQmNjN8MTI4KX1lbHNlIGlmKHQ8MTExNDExMil7aWYoKGUtPTQpPDApYnJlYWs7by5wdXNoKHQ+PjE4fDI0MCx0Pj4xMiY2M3wxMjgsdD4+NiY2M3wxMjgsdCY2M3wxMjgpfWVsc2UgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb2RlIHBvaW50XCIpfXJldHVybiBvfWZ1bmN0aW9uICRhKHIpe2xldCBlPVtdO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7Kyt0KWUucHVzaChyLmNoYXJDb2RlQXQodCkmMjU1KTtyZXR1cm4gZX1mdW5jdGlvbiBHYShyLGUpe2xldCB0LG4saSxvPVtdO2ZvcihsZXQgcz0wO3M8ci5sZW5ndGgmJiEoKGUtPTIpPDApOysrcyl0PXIuY2hhckNvZGVBdChzKSxuPXQ+PjgsaT10JTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfWZ1bmN0aW9uIFRpKHIpe3JldHVybiBZci50b0J5dGVBcnJheShXYShyKSl9ZnVuY3Rpb24gVXQocixlLHQsbil7bGV0IGk7Zm9yKGk9MDtpPG4mJiEoaSt0Pj1lLmxlbmd0aHx8aT49ci5sZW5ndGgpOysraSllW2krdF09cltpXTtyZXR1cm4gaX1mdW5jdGlvbiBpZShyLGUpe3JldHVybiByIGluc3RhbmNlb2YgZXx8ciE9bnVsbCYmci5jb25zdHJ1Y3RvciE9bnVsbCYmci5jb25zdHJ1Y3Rvci5uYW1lIT1udWxsJiZyLmNvbnN0cnVjdG9yLm5hbWU9PT1lLm5hbWV9ZnVuY3Rpb24gdG4ocil7cmV0dXJuIHIhPT1yfXZhciBWYT1mdW5jdGlvbigpe2xldCByPVwiMDEyMzQ1Njc4OWFiY2RlZlwiLGU9bmV3IEFycmF5KDI1Nik7Zm9yKGxldCB0PTA7dDwxNjsrK3Qpe2xldCBuPXQqMTY7Zm9yKGxldCBpPTA7aTwxNjsrK2kpZVtuK2ldPXJbdF0rcltpXX1yZXR1cm4gZX0oKTtmdW5jdGlvbiBiZShyKXtyZXR1cm4gdHlwZW9mIEJpZ0ludD5cInVcIj96YTpyfWZ1bmN0aW9uIHphKCl7dGhyb3cgbmV3IEVycm9yKFwiQmlnSW50IG5vdCBzdXBwb3J0ZWRcIil9fSk7dmFyIElpPVMoKGNsLExpKT0+e2MoKTt2YXIgUD1MaS5leHBvcnRzPXt9LG9lLHNlO2Z1bmN0aW9uIHJuKCl7dGhyb3cgbmV3IEVycm9yKFwic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKX1mdW5jdGlvbiBubigpe3Rocm93IG5ldyBFcnJvcihcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKX0oZnVuY3Rpb24oKXt0cnl7dHlwZW9mIHNldFRpbWVvdXQ9PVwiZnVuY3Rpb25cIj9vZT1zZXRUaW1lb3V0Om9lPXJufWNhdGNoe29lPXJufXRyeXt0eXBlb2YgY2xlYXJUaW1lb3V0PT1cImZ1bmN0aW9uXCI/c2U9Y2xlYXJUaW1lb3V0OnNlPW5ufWNhdGNoe3NlPW5ufX0pKCk7ZnVuY3Rpb24gQ2kocil7aWYob2U9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KHIsMCk7aWYoKG9lPT09cm58fCFvZSkmJnNldFRpbWVvdXQpcmV0dXJuIG9lPXNldFRpbWVvdXQsc2V0VGltZW91dChyLDApO3RyeXtyZXR1cm4gb2UociwwKX1jYXRjaHt0cnl7cmV0dXJuIG9lLmNhbGwobnVsbCxyLDApfWNhdGNoe3JldHVybiBvZS5jYWxsKHRoaXMsciwwKX19fWZ1bmN0aW9uIFlhKHIpe2lmKHNlPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQocik7aWYoKHNlPT09bm58fCFzZSkmJmNsZWFyVGltZW91dClyZXR1cm4gc2U9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChyKTt0cnl7cmV0dXJuIHNlKHIpfWNhdGNoe3RyeXtyZXR1cm4gc2UuY2FsbChudWxsLHIpfWNhdGNoe3JldHVybiBzZS5jYWxsKHRoaXMscil9fX12YXIgcGU9W10sSmU9ITEsa2UsRHQ9LTE7ZnVuY3Rpb24gS2EoKXshSmV8fCFrZXx8KEplPSExLGtlLmxlbmd0aD9wZT1rZS5jb25jYXQocGUpOkR0PS0xLHBlLmxlbmd0aCYmQmkoKSl9ZnVuY3Rpb24gQmkoKXtpZighSmUpe3ZhciByPUNpKEthKTtKZT0hMDtmb3IodmFyIGU9cGUubGVuZ3RoO2U7KXtmb3Ioa2U9cGUscGU9W107KytEdDxlOylrZSYma2VbRHRdLnJ1bigpO0R0PS0xLGU9cGUubGVuZ3RofWtlPW51bGwsSmU9ITEsWWEocil9fVAubmV4dFRpY2s9ZnVuY3Rpb24ocil7dmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0LTFdPWFyZ3VtZW50c1t0XTtwZS5wdXNoKG5ldyBNaShyLGUpKSxwZS5sZW5ndGg9PT0xJiYhSmUmJkNpKEJpKX07ZnVuY3Rpb24gTWkocixlKXt0aGlzLmZ1bj1yLHRoaXMuYXJyYXk9ZX1NaS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07UC50aXRsZT1cImJyb3dzZXJcIjtQLmJyb3dzZXI9ITA7UC5lbnY9e307UC5hcmd2PVtdO1AudmVyc2lvbj1cIlwiO1AudmVyc2lvbnM9e307ZnVuY3Rpb24gaGUoKXt9UC5vbj1oZTtQLmFkZExpc3RlbmVyPWhlO1Aub25jZT1oZTtQLm9mZj1oZTtQLnJlbW92ZUxpc3RlbmVyPWhlO1AucmVtb3ZlQWxsTGlzdGVuZXJzPWhlO1AuZW1pdD1oZTtQLnByZXBlbmRMaXN0ZW5lcj1oZTtQLnByZXBlbmRPbmNlTGlzdGVuZXI9aGU7UC5saXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuW119O1AuYmluZGluZz1mdW5jdGlvbihyKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKX07UC5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn07UC5jaGRpcj1mdW5jdGlvbihyKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIil9O1AudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19KTt2YXIgQWksWGEsYz1oYSgoKT0+e0FpPUMoWGUoKSksWGE9QyhJaSgpKTt3aW5kb3cuQnVmZmVyPUFpLkJ1ZmZlcjt3aW5kb3cucHJvY2Vzcz1YYX0pO3ZhciBqaT1TKChsbCxvbik9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFFlPXR5cGVvZiBSZWZsZWN0PT1cIm9iamVjdFwiP1JlZmxlY3Q6bnVsbCxGaT1RZSYmdHlwZW9mIFFlLmFwcGx5PT1cImZ1bmN0aW9uXCI/UWUuYXBwbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChlLHQsbil9LE50O1FlJiZ0eXBlb2YgUWUub3duS2V5cz09XCJmdW5jdGlvblwiP050PVFlLm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9OdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSkpfTpOdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSl9O2Z1bmN0aW9uIEphKHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBraT1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKGUpe3JldHVybiBlIT09ZX07ZnVuY3Rpb24gQigpe0IuaW5pdC5jYWxsKHRoaXMpfW9uLmV4cG9ydHM9Qjtvbi5leHBvcnRzLm9uY2U9dHU7Qi5FdmVudEVtaXR0ZXI9QjtCLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMDtCLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MDtCLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgUGk9MTA7ZnVuY3Rpb24gSHQocil7aWYodHlwZW9mIHIhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiByKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoQixcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUGl9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9XCJudW1iZXJcInx8cjwwfHxraShyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrcitcIi5cIik7UGk9cn19KTtCLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9O0IucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJudW1iZXJcInx8ZTwwfHxraShlKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrZStcIi5cIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9O2Z1bmN0aW9uIE9pKHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/Qi5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31CLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gT2kodGhpcyl9O0IucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQucHVzaChhcmd1bWVudHNbbl0pO3ZhciBpPWU9PT1cImVycm9yXCIsbz10aGlzLl9ldmVudHM7aWYobyE9PXZvaWQgMClpPWkmJm8uZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighaSlyZXR1cm4hMTtpZihpKXt2YXIgcztpZih0Lmxlbmd0aD4wJiYocz10WzBdKSxzIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgczt2YXIgYT1uZXcgRXJyb3IoXCJVbmhhbmRsZWQgZXJyb3IuXCIrKHM/XCIgKFwiK3MubWVzc2FnZStcIilcIjpcIlwiKSk7dGhyb3cgYS5jb250ZXh0PXMsYX12YXIgdT1vW2VdO2lmKHU9PT12b2lkIDApcmV0dXJuITE7aWYodHlwZW9mIHU9PVwiZnVuY3Rpb25cIilGaSh1LHRoaXMsdCk7ZWxzZSBmb3IodmFyIGY9dS5sZW5ndGgsbD1xaSh1LGYpLG49MDtuPGY7KytuKUZpKGxbbl0sdGhpcyx0KTtyZXR1cm4hMH07ZnVuY3Rpb24gVWkocixlLHQsbil7dmFyIGksbyxzO2lmKEh0KHQpLG89ci5fZXZlbnRzLG89PT12b2lkIDA/KG89ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KG8ubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoXCJuZXdMaXN0ZW5lclwiLGUsdC5saXN0ZW5lcj90Lmxpc3RlbmVyOnQpLG89ci5fZXZlbnRzKSxzPW9bZV0pLHM9PT12b2lkIDApcz1vW2VdPXQsKytyLl9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBzPT1cImZ1bmN0aW9uXCI/cz1vW2VdPW4/W3Qsc106W3MsdF06bj9zLnVuc2hpZnQodCk6cy5wdXNoKHQpLGk9T2kociksaT4wJiZzLmxlbmd0aD5pJiYhcy53YXJuZWQpe3Mud2FybmVkPSEwO3ZhciBhPW5ldyBFcnJvcihcIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gXCIrcy5sZW5ndGgrXCIgXCIrU3RyaW5nKGUpK1wiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXRcIik7YS5uYW1lPVwiTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nXCIsYS5lbWl0dGVyPXIsYS50eXBlPWUsYS5jb3VudD1zLmxlbmd0aCxKYShhKX1yZXR1cm4gcn1CLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBVaSh0aGlzLGUsdCwhMSl9O0IucHJvdG90eXBlLm9uPUIucHJvdG90eXBlLmFkZExpc3RlbmVyO0IucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBVaSh0aGlzLGUsdCwhMCl9O2Z1bmN0aW9uIFFhKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiBEaShyLGUsdCl7dmFyIG49e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTplLGxpc3RlbmVyOnR9LGk9UWEuYmluZChuKTtyZXR1cm4gaS5saXN0ZW5lcj10LG4ud3JhcEZuPWksaX1CLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEh0KHQpLHRoaXMub24oZSxEaSh0aGlzLGUsdCkpLHRoaXN9O0IucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSHQodCksdGhpcy5wcmVwZW5kTGlzdGVuZXIoZSxEaSh0aGlzLGUsdCkpLHRoaXN9O0IucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLHMsYTtpZihIdCh0KSxpPXRoaXMuX2V2ZW50cyxpPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49aVtlXSxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49PT10fHxuLmxpc3RlbmVyPT09dCktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLG4ubGlzdGVuZXJ8fHQpKTtlbHNlIGlmKHR5cGVvZiBuIT1cImZ1bmN0aW9uXCIpe2ZvcihvPS0xLHM9bi5sZW5ndGgtMTtzPj0wO3MtLSlpZihuW3NdPT09dHx8bltzXS5saXN0ZW5lcj09PXQpe2E9bltzXS5saXN0ZW5lcixvPXM7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzO289PT0wP24uc2hpZnQoKTpaYShuLG8pLG4ubGVuZ3RoPT09MSYmKGlbZV09blswXSksaS5yZW1vdmVMaXN0ZW5lciE9PXZvaWQgMCYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLGF8fHQpfXJldHVybiB0aGlzfTtCLnByb3RvdHlwZS5vZmY9Qi5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7Qi5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3ZhciB0LG4saTtpZihuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG4ucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpuW2VdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIG5bZV0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBvPU9iamVjdC5rZXlzKG4pLHM7Zm9yKGk9MDtpPG8ubGVuZ3RoOysraSlzPW9baV0scyE9PVwicmVtb3ZlTGlzdGVuZXJcIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMocyk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKFwicmVtb3ZlTGlzdGVuZXJcIiksdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKHQ9bltlXSx0eXBlb2YgdD09XCJmdW5jdGlvblwiKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0KTtlbHNlIGlmKHQhPT12b2lkIDApZm9yKGk9dC5sZW5ndGgtMTtpPj0wO2ktLSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsdFtpXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIE5pKHIsZSx0KXt2YXIgbj1yLl9ldmVudHM7aWYobj09PXZvaWQgMClyZXR1cm5bXTt2YXIgaT1uW2VdO3JldHVybiBpPT09dm9pZCAwP1tdOnR5cGVvZiBpPT1cImZ1bmN0aW9uXCI/dD9baS5saXN0ZW5lcnx8aV06W2ldOnQ/ZXUoaSk6cWkoaSxpLmxlbmd0aCl9Qi5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBOaSh0aGlzLGUsITApfTtCLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIE5pKHRoaXMsZSwhMSl9O0IubGlzdGVuZXJDb3VudD1mdW5jdGlvbihyLGUpe3JldHVybiB0eXBlb2Ygci5saXN0ZW5lckNvdW50PT1cImZ1bmN0aW9uXCI/ci5saXN0ZW5lckNvdW50KGUpOkhpLmNhbGwocixlKX07Qi5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1IaTtmdW5jdGlvbiBIaShyKXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSE9PXZvaWQgMCl7dmFyIHQ9ZVtyXTtpZih0eXBlb2YgdD09XCJmdW5jdGlvblwiKXJldHVybiAxO2lmKHQhPT12b2lkIDApcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfUIucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9OdCh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBxaShyLGUpe2Zvcih2YXIgdD1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24pdFtuXT1yW25dO3JldHVybiB0fWZ1bmN0aW9uIFphKHIsZSl7Zm9yKDtlKzE8ci5sZW5ndGg7ZSsrKXJbZV09cltlKzFdO3IucG9wKCl9ZnVuY3Rpb24gZXUocil7Zm9yKHZhciBlPW5ldyBBcnJheShyLmxlbmd0aCksdD0wO3Q8ZS5sZW5ndGg7Kyt0KWVbdF09clt0XS5saXN0ZW5lcnx8clt0XTtyZXR1cm4gZX1mdW5jdGlvbiB0dShyLGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGkoKXtvIT09dm9pZCAwJiZyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixvKSx0KFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9dmFyIG87ZSE9PVwiZXJyb3JcIiYmKG89ZnVuY3Rpb24oYSl7ci5yZW1vdmVMaXN0ZW5lcihlLGkpLG4oYSl9LHIub25jZShcImVycm9yXCIsbykpLHIub25jZShlLGkpfSl9fSk7dmFyIE9lPVMoKGRsLHNuKT0+e2MoKTt0eXBlb2YgT2JqZWN0LmNyZWF0ZT09XCJmdW5jdGlvblwiP3NuLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt0JiYoZS5zdXBlcl89dCxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OnNuLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZih0KXtlLnN1cGVyXz10O3ZhciBuPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgbixlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lfX19KTt2YXIgdW49UygocGwsYW4pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBaZT10eXBlb2YgUmVmbGVjdD09XCJvYmplY3RcIj9SZWZsZWN0Om51bGwsV2k9WmUmJnR5cGVvZiBaZS5hcHBseT09XCJmdW5jdGlvblwiP1plLmFwcGx5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoZSx0LG4pfSxxdDtaZSYmdHlwZW9mIFplLm93bktleXM9PVwiZnVuY3Rpb25cIj9xdD1aZS5vd25LZXlzOk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/cXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpKX06cXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpfTtmdW5jdGlvbiBydShyKXtjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybihyKX12YXIgR2k9TnVtYmVyLmlzTmFOfHxmdW5jdGlvbihlKXtyZXR1cm4gZSE9PWV9O2Z1bmN0aW9uIE0oKXtNLmluaXQuY2FsbCh0aGlzKX1hbi5leHBvcnRzPU07YW4uZXhwb3J0cy5vbmNlPXN1O00uRXZlbnRFbWl0dGVyPU07TS5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDA7TS5wcm90b3R5cGUuX2V2ZW50c0NvdW50PTA7TS5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDA7dmFyICRpPTEwO2Z1bmN0aW9uIGp0KHIpe2lmKHR5cGVvZiByIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2Ygcil9T2JqZWN0LmRlZmluZVByb3BlcnR5KE0sXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuICRpfSxzZXQ6ZnVuY3Rpb24ocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCJ8fHI8MHx8R2kocikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrXCIuXCIpOyRpPXJ9fSk7TS5pbml0PWZ1bmN0aW9uKCl7KHRoaXMuX2V2ZW50cz09PXZvaWQgMHx8dGhpcy5fZXZlbnRzPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpJiYodGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfTtNLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPVwibnVtYmVyXCJ8fGU8MHx8R2koZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK2UrXCIuXCIpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9ZSx0aGlzfTtmdW5jdGlvbiBWaShyKXtyZXR1cm4gci5fbWF4TGlzdGVuZXJzPT09dm9pZCAwP00uZGVmYXVsdE1heExpc3RlbmVyczpyLl9tYXhMaXN0ZW5lcnN9TS5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIFZpKHRoaXMpfTtNLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYXJndW1lbnRzW25dKTt2YXIgaT1lPT09XCJlcnJvclwiLG89dGhpcy5fZXZlbnRzO2lmKG8hPT12b2lkIDApaT1pJiZvLmVycm9yPT09dm9pZCAwO2Vsc2UgaWYoIWkpcmV0dXJuITE7aWYoaSl7dmFyIHM7aWYodC5sZW5ndGg+MCYmKHM9dFswXSkscyBpbnN0YW5jZW9mIEVycm9yKXRocm93IHM7dmFyIGE9bmV3IEVycm9yKFwiVW5oYW5kbGVkIGVycm9yLlwiKyhzP1wiIChcIitzLm1lc3NhZ2UrXCIpXCI6XCJcIikpO3Rocm93IGEuY29udGV4dD1zLGF9dmFyIHU9b1tlXTtpZih1PT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiB1PT1cImZ1bmN0aW9uXCIpV2kodSx0aGlzLHQpO2Vsc2UgZm9yKHZhciBmPXUubGVuZ3RoLGw9SmkodSxmKSxuPTA7bjxmOysrbilXaShsW25dLHRoaXMsdCk7cmV0dXJuITB9O2Z1bmN0aW9uIHppKHIsZSx0LG4pe3ZhciBpLG8scztpZihqdCh0KSxvPXIuX2V2ZW50cyxvPT09dm9pZCAwPyhvPXIuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHIuX2V2ZW50c0NvdW50PTApOihvLm5ld0xpc3RlbmVyIT09dm9pZCAwJiYoci5lbWl0KFwibmV3TGlzdGVuZXJcIixlLHQubGlzdGVuZXI/dC5saXN0ZW5lcjp0KSxvPXIuX2V2ZW50cykscz1vW2VdKSxzPT09dm9pZCAwKXM9b1tlXT10LCsrci5fZXZlbnRzQ291bnQ7ZWxzZSBpZih0eXBlb2Ygcz09XCJmdW5jdGlvblwiP3M9b1tlXT1uP1t0LHNdOltzLHRdOm4/cy51bnNoaWZ0KHQpOnMucHVzaCh0KSxpPVZpKHIpLGk+MCYmcy5sZW5ndGg+aSYmIXMud2FybmVkKXtzLndhcm5lZD0hMDt2YXIgYT1uZXcgRXJyb3IoXCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuIFwiK3MubGVuZ3RoK1wiIFwiK1N0cmluZyhlKStcIiBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0XCIpO2EubmFtZT1cIk1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZ1wiLGEuZW1pdHRlcj1yLGEudHlwZT1lLGEuY291bnQ9cy5sZW5ndGgscnUoYSl9cmV0dXJuIHJ9TS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gemkodGhpcyxlLHQsITEpfTtNLnByb3RvdHlwZS5vbj1NLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtNLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gemkodGhpcyxlLHQsITApfTtmdW5jdGlvbiBudSgpe2lmKCF0aGlzLmZpcmVkKXJldHVybiB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsdGhpcy53cmFwRm4pLHRoaXMuZmlyZWQ9ITAsYXJndW1lbnRzLmxlbmd0aD09PTA/dGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTp0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LGFyZ3VtZW50cyl9ZnVuY3Rpb24gWWkocixlLHQpe3ZhciBuPXtmaXJlZDohMSx3cmFwRm46dm9pZCAwLHRhcmdldDpyLHR5cGU6ZSxsaXN0ZW5lcjp0fSxpPW51LmJpbmQobik7cmV0dXJuIGkubGlzdGVuZXI9dCxuLndyYXBGbj1pLGl9TS5wcm90b3R5cGUub25jZT1mdW5jdGlvbihlLHQpe3JldHVybiBqdCh0KSx0aGlzLm9uKGUsWWkodGhpcyxlLHQpKSx0aGlzfTtNLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGp0KHQpLHRoaXMucHJlcGVuZExpc3RlbmVyKGUsWWkodGhpcyxlLHQpKSx0aGlzfTtNLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuLGksbyxzLGE7aWYoanQodCksaT10aGlzLl9ldmVudHMsaT09PXZvaWQgMClyZXR1cm4gdGhpcztpZihuPWlbZV0sbj09PXZvaWQgMClyZXR1cm4gdGhpcztpZihuPT09dHx8bi5saXN0ZW5lcj09PXQpLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6KGRlbGV0ZSBpW2VdLGkucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsZSxuLmxpc3RlbmVyfHx0KSk7ZWxzZSBpZih0eXBlb2YgbiE9XCJmdW5jdGlvblwiKXtmb3Iobz0tMSxzPW4ubGVuZ3RoLTE7cz49MDtzLS0paWYobltzXT09PXR8fG5bc10ubGlzdGVuZXI9PT10KXthPW5bc10ubGlzdGVuZXIsbz1zO2JyZWFrfWlmKG88MClyZXR1cm4gdGhpcztvPT09MD9uLnNoaWZ0KCk6aXUobixvKSxuLmxlbmd0aD09PTEmJihpW2VdPW5bMF0pLGkucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsZSxhfHx0KX1yZXR1cm4gdGhpc307TS5wcm90b3R5cGUub2ZmPU0ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO00ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgdCxuLGk7aWYobj10aGlzLl9ldmVudHMsbj09PXZvaWQgMClyZXR1cm4gdGhpcztpZihuLnJlbW92ZUxpc3RlbmVyPT09dm9pZCAwKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MD8odGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCk6bltlXSE9PXZvaWQgMCYmKC0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOmRlbGV0ZSBuW2VdKSx0aGlzO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXt2YXIgbz1PYmplY3Qua2V5cyhuKSxzO2ZvcihpPTA7aTxvLmxlbmd0aDsrK2kpcz1vW2ldLHMhPT1cInJlbW92ZUxpc3RlbmVyXCImJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKHMpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhcInJlbW92ZUxpc3RlbmVyXCIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZih0PW5bZV0sdHlwZW9mIHQ9PVwiZnVuY3Rpb25cIil0aGlzLnJlbW92ZUxpc3RlbmVyKGUsdCk7ZWxzZSBpZih0IT09dm9pZCAwKWZvcihpPXQubGVuZ3RoLTE7aT49MDtpLS0pdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHRbaV0pO3JldHVybiB0aGlzfTtmdW5jdGlvbiBLaShyLGUsdCl7dmFyIG49ci5fZXZlbnRzO2lmKG49PT12b2lkIDApcmV0dXJuW107dmFyIGk9bltlXTtyZXR1cm4gaT09PXZvaWQgMD9bXTp0eXBlb2YgaT09XCJmdW5jdGlvblwiP3Q/W2kubGlzdGVuZXJ8fGldOltpXTp0P291KGkpOkppKGksaS5sZW5ndGgpfU0ucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gS2kodGhpcyxlLCEwKX07TS5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBLaSh0aGlzLGUsITEpfTtNLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24ocixlKXtyZXR1cm4gdHlwZW9mIHIubGlzdGVuZXJDb3VudD09XCJmdW5jdGlvblwiP3IubGlzdGVuZXJDb3VudChlKTpYaS5jYWxsKHIsZSl9O00ucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9WGk7ZnVuY3Rpb24gWGkocil7dmFyIGU9dGhpcy5fZXZlbnRzO2lmKGUhPT12b2lkIDApe3ZhciB0PWVbcl07aWYodHlwZW9mIHQ9PVwiZnVuY3Rpb25cIilyZXR1cm4gMTtpZih0IT09dm9pZCAwKXJldHVybiB0Lmxlbmd0aH1yZXR1cm4gMH1NLnByb3RvdHlwZS5ldmVudE5hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/cXQodGhpcy5fZXZlbnRzKTpbXX07ZnVuY3Rpb24gSmkocixlKXtmb3IodmFyIHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKXRbbl09cltuXTtyZXR1cm4gdH1mdW5jdGlvbiBpdShyLGUpe2Zvcig7ZSsxPHIubGVuZ3RoO2UrKylyW2VdPXJbZSsxXTtyLnBvcCgpfWZ1bmN0aW9uIG91KHIpe2Zvcih2YXIgZT1uZXcgQXJyYXkoci5sZW5ndGgpLHQ9MDt0PGUubGVuZ3RoOysrdCllW3RdPXJbdF0ubGlzdGVuZXJ8fHJbdF07cmV0dXJuIGV9ZnVuY3Rpb24gc3UocixlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBpKCl7byE9PXZvaWQgMCYmci5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsbyksdChbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfXZhciBvO2UhPT1cImVycm9yXCImJihvPWZ1bmN0aW9uKGEpe3IucmVtb3ZlTGlzdGVuZXIoZSxpKSxuKGEpfSxyLm9uY2UoXCJlcnJvclwiLG8pKSxyLm9uY2UoZSxpKX0pfX0pO3ZhciBmbj1TKChobCxRaSk9PntjKCk7UWkuZXhwb3J0cz11bigpLkV2ZW50RW1pdHRlcn0pO3ZhciBjbj1TKCgpPT57YygpfSk7dmFyIHJvPVMoKHlsLHRvKT0+e1widXNlIHN0cmljdFwiO2MoKTtmdW5jdGlvbiBaaShyLGUpe3ZhciB0PU9iamVjdC5rZXlzKHIpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocik7ZSYmKG49bi5maWx0ZXIoZnVuY3Rpb24oaSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixpKS5lbnVtZXJhYmxlfSkpLHQucHVzaC5hcHBseSh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIGF1KHIpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciB0PWFyZ3VtZW50c1tlXSE9bnVsbD9hcmd1bWVudHNbZV06e307ZSUyP1ppKE9iamVjdCh0KSwhMCkuZm9yRWFjaChmdW5jdGlvbihuKXt1dShyLG4sdFtuXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTpaaShPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsbixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikpfSl9cmV0dXJuIHJ9ZnVuY3Rpb24gdXUocixlLHQpe3JldHVybiBlIGluIHI/T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsZSx7dmFsdWU6dCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnJbZV09dCxyfWZ1bmN0aW9uIGZ1KHIsZSl7aWYoIShyIGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBlbyhyLGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLmtleSxuKX19ZnVuY3Rpb24gY3UocixlLHQpe3JldHVybiBlJiZlbyhyLnByb3RvdHlwZSxlKSx0JiZlbyhyLHQpLHJ9dmFyIGx1PVhlKCksV3Q9bHUuQnVmZmVyLGR1PWNuKCksbG49ZHUuaW5zcGVjdCxwdT1sbiYmbG4uY3VzdG9tfHxcImluc3BlY3RcIjtmdW5jdGlvbiBodShyLGUsdCl7V3QucHJvdG90eXBlLmNvcHkuY2FsbChyLGUsdCl9dG8uZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXtmdSh0aGlzLHIpLHRoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9cmV0dXJuIGN1KHIsW3trZXk6XCJwdXNoXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9bjp0aGlzLmhlYWQ9bix0aGlzLnRhaWw9biwrK3RoaXMubGVuZ3RofX0se2tleTpcInVuc2hpZnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTt0aGlzLmxlbmd0aD09PTAmJih0aGlzLnRhaWw9biksdGhpcy5oZWFkPW4sKyt0aGlzLmxlbmd0aH19LHtrZXk6XCJzaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5sZW5ndGghPT0wKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gdGhpcy5sZW5ndGg9PT0xP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX19LHtrZXk6XCJjbGVhclwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9fSx7a2V5Olwiam9pblwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMubGVuZ3RoPT09MClyZXR1cm5cIlwiO2Zvcih2YXIgbj10aGlzLmhlYWQsaT1cIlwiK24uZGF0YTtuPW4ubmV4dDspaSs9dCtuLmRhdGE7cmV0dXJuIGl9fSx7a2V5OlwiY29uY2F0XCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5sZW5ndGg9PT0wKXJldHVybiBXdC5hbGxvYygwKTtmb3IodmFyIG49V3QuYWxsb2NVbnNhZmUodD4+PjApLGk9dGhpcy5oZWFkLG89MDtpOylodShpLmRhdGEsbixvKSxvKz1pLmRhdGEubGVuZ3RoLGk9aS5uZXh0O3JldHVybiBufX0se2tleTpcImNvbnN1bWVcIix2YWx1ZTpmdW5jdGlvbih0LG4pe3ZhciBpO3JldHVybiB0PHRoaXMuaGVhZC5kYXRhLmxlbmd0aD8oaT10aGlzLmhlYWQuZGF0YS5zbGljZSgwLHQpLHRoaXMuaGVhZC5kYXRhPXRoaXMuaGVhZC5kYXRhLnNsaWNlKHQpKTp0PT09dGhpcy5oZWFkLmRhdGEubGVuZ3RoP2k9dGhpcy5zaGlmdCgpOmk9bj90aGlzLl9nZXRTdHJpbmcodCk6dGhpcy5fZ2V0QnVmZmVyKHQpLGl9fSx7a2V5OlwiZmlyc3RcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWQuZGF0YX19LHtrZXk6XCJfZ2V0U3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5oZWFkLGk9MSxvPW4uZGF0YTtmb3IodC09by5sZW5ndGg7bj1uLm5leHQ7KXt2YXIgcz1uLmRhdGEsYT10PnMubGVuZ3RoP3MubGVuZ3RoOnQ7aWYoYT09PXMubGVuZ3RoP28rPXM6bys9cy5zbGljZSgwLHQpLHQtPWEsdD09PTApe2E9PT1zLmxlbmd0aD8oKytpLG4ubmV4dD90aGlzLmhlYWQ9bi5uZXh0OnRoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCk6KHRoaXMuaGVhZD1uLG4uZGF0YT1zLnNsaWNlKGEpKTticmVha30rK2l9cmV0dXJuIHRoaXMubGVuZ3RoLT1pLG99fSx7a2V5OlwiX2dldEJ1ZmZlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPVd0LmFsbG9jVW5zYWZlKHQpLGk9dGhpcy5oZWFkLG89MTtmb3IoaS5kYXRhLmNvcHkobiksdC09aS5kYXRhLmxlbmd0aDtpPWkubmV4dDspe3ZhciBzPWkuZGF0YSxhPXQ+cy5sZW5ndGg/cy5sZW5ndGg6dDtpZihzLmNvcHkobixuLmxlbmd0aC10LDAsYSksdC09YSx0PT09MCl7YT09PXMubGVuZ3RoPygrK28saS5uZXh0P3RoaXMuaGVhZD1pLm5leHQ6dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsKToodGhpcy5oZWFkPWksaS5kYXRhPXMuc2xpY2UoYSkpO2JyZWFrfSsrb31yZXR1cm4gdGhpcy5sZW5ndGgtPW8sbn19LHtrZXk6cHUsdmFsdWU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbG4odGhpcyxhdSh7fSxuLHtkZXB0aDowLGN1c3RvbUluc3BlY3Q6ITF9KSl9fV0pLHJ9KCl9KTt2YXIgcG49UygoYmwsaW8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO2Z1bmN0aW9uIG11KHIsZSl7dmFyIHQ9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLGk9dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7cmV0dXJuIG58fGk/KGU/ZShyKTpyJiYodGhpcy5fd3JpdGFibGVTdGF0ZT90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZHx8KHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHByb2Nlc3MubmV4dFRpY2soZG4sdGhpcyxyKSk6cHJvY2Vzcy5uZXh0VGljayhkbix0aGlzLHIpKSx0aGlzKToodGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSEwKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX2Rlc3Ryb3kocnx8bnVsbCxmdW5jdGlvbihvKXshZSYmbz90Ll93cml0YWJsZVN0YXRlP3QuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkP3Byb2Nlc3MubmV4dFRpY2soJHQsdCk6KHQuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHByb2Nlc3MubmV4dFRpY2sobm8sdCxvKSk6cHJvY2Vzcy5uZXh0VGljayhubyx0LG8pOmU/KHByb2Nlc3MubmV4dFRpY2soJHQsdCksZShvKSk6cHJvY2Vzcy5uZXh0VGljaygkdCx0KX0pLHRoaXMpfWZ1bmN0aW9uIG5vKHIsZSl7ZG4ocixlKSwkdChyKX1mdW5jdGlvbiAkdChyKXtyLl93cml0YWJsZVN0YXRlJiYhci5fd3JpdGFibGVTdGF0ZS5lbWl0Q2xvc2V8fHIuX3JlYWRhYmxlU3RhdGUmJiFyLl9yZWFkYWJsZVN0YXRlLmVtaXRDbG9zZXx8ci5lbWl0KFwiY2xvc2VcIil9ZnVuY3Rpb24gZ3UoKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkPSExKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZz0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmFsQ2FsbGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMSl9ZnVuY3Rpb24gZG4ocixlKXtyLmVtaXQoXCJlcnJvclwiLGUpfWZ1bmN0aW9uIHl1KHIsZSl7dmFyIHQ9ci5fcmVhZGFibGVTdGF0ZSxuPXIuX3dyaXRhYmxlU3RhdGU7dCYmdC5hdXRvRGVzdHJveXx8biYmbi5hdXRvRGVzdHJveT9yLmRlc3Ryb3koZSk6ci5lbWl0KFwiZXJyb3JcIixlKX1pby5leHBvcnRzPXtkZXN0cm95Om11LHVuZGVzdHJveTpndSxlcnJvck9yRGVzdHJveTp5dX19KTt2YXIgVWU9UygoeGwsYW8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO2Z1bmN0aW9uIGJ1KHIsZSl7ci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksci5wcm90b3R5cGUuY29uc3RydWN0b3I9cixyLl9fcHJvdG9fXz1lfXZhciBzbz17fTtmdW5jdGlvbiBYKHIsZSx0KXt0fHwodD1FcnJvcik7ZnVuY3Rpb24gbihvLHMsYSl7cmV0dXJuIHR5cGVvZiBlPT1cInN0cmluZ1wiP2U6ZShvLHMsYSl9dmFyIGk9ZnVuY3Rpb24obyl7YnUocyxvKTtmdW5jdGlvbiBzKGEsdSxmKXtyZXR1cm4gby5jYWxsKHRoaXMsbihhLHUsZikpfHx0aGlzfXJldHVybiBzfSh0KTtpLnByb3RvdHlwZS5uYW1lPXQubmFtZSxpLnByb3RvdHlwZS5jb2RlPXIsc29bcl09aX1mdW5jdGlvbiBvbyhyLGUpe2lmKEFycmF5LmlzQXJyYXkocikpe3ZhciB0PXIubGVuZ3RoO3JldHVybiByPXIubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBTdHJpbmcobil9KSx0PjI/XCJvbmUgb2YgXCIuY29uY2F0KGUsXCIgXCIpLmNvbmNhdChyLnNsaWNlKDAsdC0xKS5qb2luKFwiLCBcIiksXCIsIG9yIFwiKStyW3QtMV06dD09PTI/XCJvbmUgb2YgXCIuY29uY2F0KGUsXCIgXCIpLmNvbmNhdChyWzBdLFwiIG9yIFwiKS5jb25jYXQoclsxXSk6XCJvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KHJbMF0pfWVsc2UgcmV0dXJuXCJvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KFN0cmluZyhyKSl9ZnVuY3Rpb24geHUocixlLHQpe3JldHVybiByLnN1YnN0cighdHx8dDwwPzA6K3QsZS5sZW5ndGgpPT09ZX1mdW5jdGlvbiBfdShyLGUsdCl7cmV0dXJuKHQ9PT12b2lkIDB8fHQ+ci5sZW5ndGgpJiYodD1yLmxlbmd0aCksci5zdWJzdHJpbmcodC1lLmxlbmd0aCx0KT09PWV9ZnVuY3Rpb24gd3UocixlLHQpe3JldHVybiB0eXBlb2YgdCE9XCJudW1iZXJcIiYmKHQ9MCksdCtlLmxlbmd0aD5yLmxlbmd0aD8hMTpyLmluZGV4T2YoZSx0KSE9PS0xfVgoXCJFUlJfSU5WQUxJRF9PUFRfVkFMVUVcIixmdW5jdGlvbihyLGUpe3JldHVybidUaGUgdmFsdWUgXCInK2UrJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcIicrcisnXCInfSxUeXBlRXJyb3IpO1goXCJFUlJfSU5WQUxJRF9BUkdfVFlQRVwiLGZ1bmN0aW9uKHIsZSx0KXt2YXIgbjt0eXBlb2YgZT09XCJzdHJpbmdcIiYmeHUoZSxcIm5vdCBcIik/KG49XCJtdXN0IG5vdCBiZVwiLGU9ZS5yZXBsYWNlKC9ebm90IC8sXCJcIikpOm49XCJtdXN0IGJlXCI7dmFyIGk7aWYoX3UocixcIiBhcmd1bWVudFwiKSlpPVwiVGhlIFwiLmNvbmNhdChyLFwiIFwiKS5jb25jYXQobixcIiBcIikuY29uY2F0KG9vKGUsXCJ0eXBlXCIpKTtlbHNle3ZhciBvPXd1KHIsXCIuXCIpP1wicHJvcGVydHlcIjpcImFyZ3VtZW50XCI7aT0nVGhlIFwiJy5jb25jYXQociwnXCIgJykuY29uY2F0KG8sXCIgXCIpLmNvbmNhdChuLFwiIFwiKS5jb25jYXQob28oZSxcInR5cGVcIikpfXJldHVybiBpKz1cIi4gUmVjZWl2ZWQgdHlwZSBcIi5jb25jYXQodHlwZW9mIHQpLGl9LFR5cGVFcnJvcik7WChcIkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0ZcIixcInN0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GXCIpO1goXCJFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRFwiLGZ1bmN0aW9uKHIpe3JldHVyblwiVGhlIFwiK3IrXCIgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZFwifSk7WChcIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFXCIsXCJQcmVtYXR1cmUgY2xvc2VcIik7WChcIkVSUl9TVFJFQU1fREVTVFJPWUVEXCIsZnVuY3Rpb24ocil7cmV0dXJuXCJDYW5ub3QgY2FsbCBcIityK1wiIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWRcIn0pO1goXCJFUlJfTVVMVElQTEVfQ0FMTEJBQ0tcIixcIkNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lc1wiKTtYKFwiRVJSX1NUUkVBTV9DQU5OT1RfUElQRVwiLFwiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZVwiKTtYKFwiRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkRcIixcIndyaXRlIGFmdGVyIGVuZFwiKTtYKFwiRVJSX1NUUkVBTV9OVUxMX1ZBTFVFU1wiLFwiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW1cIixUeXBlRXJyb3IpO1goXCJFUlJfVU5LTk9XTl9FTkNPRElOR1wiLGZ1bmN0aW9uKHIpe3JldHVyblwiVW5rbm93biBlbmNvZGluZzogXCIrcn0sVHlwZUVycm9yKTtYKFwiRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVFwiLFwic3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnRcIik7YW8uZXhwb3J0cy5jb2Rlcz1zb30pO3ZhciBobj1TKChfbCx1byk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIHZ1PVVlKCkuY29kZXMuRVJSX0lOVkFMSURfT1BUX1ZBTFVFO2Z1bmN0aW9uIEV1KHIsZSx0KXtyZXR1cm4gci5oaWdoV2F0ZXJNYXJrIT1udWxsP3IuaGlnaFdhdGVyTWFyazplP3JbdF06bnVsbH1mdW5jdGlvbiBTdShyLGUsdCxuKXt2YXIgaT1FdShlLG4sdCk7aWYoaSE9bnVsbCl7aWYoIShpc0Zpbml0ZShpKSYmTWF0aC5mbG9vcihpKT09PWkpfHxpPDApe3ZhciBvPW4/dDpcImhpZ2hXYXRlck1hcmtcIjt0aHJvdyBuZXcgdnUobyxpKX1yZXR1cm4gTWF0aC5mbG9vcihpKX1yZXR1cm4gci5vYmplY3RNb2RlPzE2OjE2KjEwMjR9dW8uZXhwb3J0cz17Z2V0SGlnaFdhdGVyTWFyazpTdX19KTt2YXIgY289Uygod2wsZm8pPT57YygpO2ZvLmV4cG9ydHM9UnU7ZnVuY3Rpb24gUnUocixlKXtpZihtbihcIm5vRGVwcmVjYXRpb25cIikpcmV0dXJuIHI7dmFyIHQ9ITE7ZnVuY3Rpb24gbigpe2lmKCF0KXtpZihtbihcInRocm93RGVwcmVjYXRpb25cIikpdGhyb3cgbmV3IEVycm9yKGUpO21uKFwidHJhY2VEZXByZWNhdGlvblwiKT9jb25zb2xlLnRyYWNlKGUpOmNvbnNvbGUud2FybihlKSx0PSEwfXJldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn1mdW5jdGlvbiBtbihyKXt0cnl7aWYoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpcmV0dXJuITF9Y2F0Y2h7cmV0dXJuITF9dmFyIGU9Z2xvYmFsLmxvY2FsU3RvcmFnZVtyXTtyZXR1cm4gZT09bnVsbD8hMTpTdHJpbmcoZSkudG9Mb3dlckNhc2UoKT09PVwidHJ1ZVwifX0pO3ZhciBibj1TKCh2bCx5byk9PntcInVzZSBzdHJpY3RcIjtjKCk7eW8uZXhwb3J0cz1GO2Z1bmN0aW9uIHBvKHIpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKCl7UXUoZSxyKX19dmFyIGV0O0YuV3JpdGFibGVTdGF0ZT1FdDt2YXIgVHU9e2RlcHJlY2F0ZTpjbygpfSxobz1mbigpLFZ0PVhlKCkuQnVmZmVyLEN1PWdsb2JhbC5VaW50OEFycmF5fHxmdW5jdGlvbigpe307ZnVuY3Rpb24gQnUocil7cmV0dXJuIFZ0LmZyb20ocil9ZnVuY3Rpb24gTXUocil7cmV0dXJuIFZ0LmlzQnVmZmVyKHIpfHxyIGluc3RhbmNlb2YgQ3V9dmFyIHluPXBuKCksTHU9aG4oKSxJdT1MdS5nZXRIaWdoV2F0ZXJNYXJrLHhlPVVlKCkuY29kZXMsQXU9eGUuRVJSX0lOVkFMSURfQVJHX1RZUEUsRnU9eGUuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsUHU9eGUuRVJSX01VTFRJUExFX0NBTExCQUNLLGt1PXhlLkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsT3U9eGUuRVJSX1NUUkVBTV9ERVNUUk9ZRUQsVXU9eGUuRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUyxEdT14ZS5FUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCxOdT14ZS5FUlJfVU5LTk9XTl9FTkNPRElORyx0dD15bi5lcnJvck9yRGVzdHJveTtPZSgpKEYsaG8pO2Z1bmN0aW9uIEh1KCl7fWZ1bmN0aW9uIEV0KHIsZSx0KXtldD1ldHx8RGUoKSxyPXJ8fHt9LHR5cGVvZiB0IT1cImJvb2xlYW5cIiYmKHQ9ZSBpbnN0YW5jZW9mIGV0KSx0aGlzLm9iamVjdE1vZGU9ISFyLm9iamVjdE1vZGUsdCYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhci53cml0YWJsZU9iamVjdE1vZGUpLHRoaXMuaGlnaFdhdGVyTWFyaz1JdSh0aGlzLHIsXCJ3cml0YWJsZUhpZ2hXYXRlck1hcmtcIix0KSx0aGlzLmZpbmFsQ2FsbGVkPSExLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMTt2YXIgbj1yLmRlY29kZVN0cmluZ3M9PT0hMTt0aGlzLmRlY29kZVN0cmluZ3M9IW4sdGhpcy5kZWZhdWx0RW5jb2Rpbmc9ci5kZWZhdWx0RW5jb2Rpbmd8fFwidXRmOFwiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24oaSl7enUoZSxpKX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuZW1pdENsb3NlPXIuZW1pdENsb3NlIT09ITEsdGhpcy5hdXRvRGVzdHJveT0hIXIuYXV0b0Rlc3Ryb3ksdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBwbyh0aGlzKX1FdC5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuYnVmZmVyZWRSZXF1ZXN0LHQ9W107ZTspdC5wdXNoKGUpLGU9ZS5uZXh0O3JldHVybiB0fTsoZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEV0LnByb3RvdHlwZSxcImJ1ZmZlclwiLHtnZXQ6VHUuZGVwcmVjYXRlKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9LFwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC5cIixcIkRFUDAwMDNcIil9KX1jYXRjaHt9fSkoKTt2YXIgR3Q7dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZTeW1ib2wuaGFzSW5zdGFuY2UmJnR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXT09XCJmdW5jdGlvblwiPyhHdD1GdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRixTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBHdC5jYWxsKHRoaXMsZSk/ITA6dGhpcyE9PUY/ITE6ZSYmZS5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIEV0fX0pKTpHdD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHRoaXN9O2Z1bmN0aW9uIEYocil7ZXQ9ZXR8fERlKCk7dmFyIGU9dGhpcyBpbnN0YW5jZW9mIGV0O2lmKCFlJiYhR3QuY2FsbChGLHRoaXMpKXJldHVybiBuZXcgRihyKTt0aGlzLl93cml0YWJsZVN0YXRlPW5ldyBFdChyLHRoaXMsZSksdGhpcy53cml0YWJsZT0hMCxyJiYodHlwZW9mIHIud3JpdGU9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX3dyaXRlPXIud3JpdGUpLHR5cGVvZiByLndyaXRldj09XCJmdW5jdGlvblwiJiYodGhpcy5fd3JpdGV2PXIud3JpdGV2KSx0eXBlb2Ygci5kZXN0cm95PT1cImZ1bmN0aW9uXCImJih0aGlzLl9kZXN0cm95PXIuZGVzdHJveSksdHlwZW9mIHIuZmluYWw9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX2ZpbmFsPXIuZmluYWwpKSxoby5jYWxsKHRoaXMpfUYucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0dCh0aGlzLG5ldyBrdSl9O2Z1bmN0aW9uIHF1KHIsZSl7dmFyIHQ9bmV3IER1O3R0KHIsdCkscHJvY2Vzcy5uZXh0VGljayhlLHQpfWZ1bmN0aW9uIGp1KHIsZSx0LG4pe3ZhciBpO3JldHVybiB0PT09bnVsbD9pPW5ldyBVdTp0eXBlb2YgdCE9XCJzdHJpbmdcIiYmIWUub2JqZWN0TW9kZSYmKGk9bmV3IEF1KFwiY2h1bmtcIixbXCJzdHJpbmdcIixcIkJ1ZmZlclwiXSx0KSksaT8odHQocixpKSxwcm9jZXNzLm5leHRUaWNrKG4saSksITEpOiEwfUYucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHIsZSx0KXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlLGk9ITEsbz0hbi5vYmplY3RNb2RlJiZNdShyKTtyZXR1cm4gbyYmIVZ0LmlzQnVmZmVyKHIpJiYocj1CdShyKSksdHlwZW9mIGU9PVwiZnVuY3Rpb25cIiYmKHQ9ZSxlPW51bGwpLG8/ZT1cImJ1ZmZlclwiOmV8fChlPW4uZGVmYXVsdEVuY29kaW5nKSx0eXBlb2YgdCE9XCJmdW5jdGlvblwiJiYodD1IdSksbi5lbmRpbmc/cXUodGhpcyx0KToob3x8anUodGhpcyxuLHIsdCkpJiYobi5wZW5kaW5nY2IrKyxpPSR1KHRoaXMsbixvLHIsZSx0KSksaX07Ri5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9O0YucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciByPXRoaXMuX3dyaXRhYmxlU3RhdGU7ci5jb3JrZWQmJihyLmNvcmtlZC0tLCFyLndyaXRpbmcmJiFyLmNvcmtlZCYmIXIuYnVmZmVyUHJvY2Vzc2luZyYmci5idWZmZXJlZFJlcXVlc3QmJm1vKHRoaXMscikpfTtGLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PVwic3RyaW5nXCImJihlPWUudG9Mb3dlckNhc2UoKSksIShbXCJoZXhcIixcInV0ZjhcIixcInV0Zi04XCIsXCJhc2NpaVwiLFwiYmluYXJ5XCIsXCJiYXNlNjRcIixcInVjczJcIixcInVjcy0yXCIsXCJ1dGYxNmxlXCIsXCJ1dGYtMTZsZVwiLFwicmF3XCJdLmluZGV4T2YoKGUrXCJcIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBOdShlKTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9ZSx0aGlzfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsXCJ3cml0YWJsZUJ1ZmZlclwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpfX0pO2Z1bmN0aW9uIFd1KHIsZSx0KXtyZXR1cm4hci5vYmplY3RNb2RlJiZyLmRlY29kZVN0cmluZ3MhPT0hMSYmdHlwZW9mIGU9PVwic3RyaW5nXCImJihlPVZ0LmZyb20oZSx0KSksZX1PYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsXCJ3cml0YWJsZUhpZ2hXYXRlck1hcmtcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pO2Z1bmN0aW9uICR1KHIsZSx0LG4saSxvKXtpZighdCl7dmFyIHM9V3UoZSxuLGkpO24hPT1zJiYodD0hMCxpPVwiYnVmZmVyXCIsbj1zKX12YXIgYT1lLm9iamVjdE1vZGU/MTpuLmxlbmd0aDtlLmxlbmd0aCs9YTt2YXIgdT1lLmxlbmd0aDxlLmhpZ2hXYXRlck1hcms7aWYodXx8KGUubmVlZERyYWluPSEwKSxlLndyaXRpbmd8fGUuY29ya2VkKXt2YXIgZj1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q7ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PXtjaHVuazpuLGVuY29kaW5nOmksaXNCdWY6dCxjYWxsYmFjazpvLG5leHQ6bnVsbH0sZj9mLm5leHQ9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OmUuYnVmZmVyZWRSZXF1ZXN0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgZ24ocixlLCExLGEsbixpLG8pO3JldHVybiB1fWZ1bmN0aW9uIGduKHIsZSx0LG4saSxvLHMpe2Uud3JpdGVsZW49bixlLndyaXRlY2I9cyxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLGUuZGVzdHJveWVkP2Uub253cml0ZShuZXcgT3UoXCJ3cml0ZVwiKSk6dD9yLl93cml0ZXYoaSxlLm9ud3JpdGUpOnIuX3dyaXRlKGksbyxlLm9ud3JpdGUpLGUuc3luYz0hMX1mdW5jdGlvbiBHdShyLGUsdCxuLGkpey0tZS5wZW5kaW5nY2IsdD8ocHJvY2Vzcy5uZXh0VGljayhpLG4pLHByb2Nlc3MubmV4dFRpY2sodnQscixlKSxyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0dChyLG4pKTooaShuKSxyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0dChyLG4pLHZ0KHIsZSkpfWZ1bmN0aW9uIFZ1KHIpe3Iud3JpdGluZz0hMSxyLndyaXRlY2I9bnVsbCxyLmxlbmd0aC09ci53cml0ZWxlbixyLndyaXRlbGVuPTB9ZnVuY3Rpb24genUocixlKXt2YXIgdD1yLl93cml0YWJsZVN0YXRlLG49dC5zeW5jLGk9dC53cml0ZWNiO2lmKHR5cGVvZiBpIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IFB1O2lmKFZ1KHQpLGUpR3Uocix0LG4sZSxpKTtlbHNle3ZhciBvPWdvKHQpfHxyLmRlc3Ryb3llZDshbyYmIXQuY29ya2VkJiYhdC5idWZmZXJQcm9jZXNzaW5nJiZ0LmJ1ZmZlcmVkUmVxdWVzdCYmbW8ocix0KSxuP3Byb2Nlc3MubmV4dFRpY2sobG8scix0LG8saSk6bG8ocix0LG8saSl9fWZ1bmN0aW9uIGxvKHIsZSx0LG4pe3R8fFl1KHIsZSksZS5wZW5kaW5nY2ItLSxuKCksdnQocixlKX1mdW5jdGlvbiBZdShyLGUpe2UubGVuZ3RoPT09MCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSxyLmVtaXQoXCJkcmFpblwiKSl9ZnVuY3Rpb24gbW8ocixlKXtlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIHQ9ZS5idWZmZXJlZFJlcXVlc3Q7aWYoci5fd3JpdGV2JiZ0JiZ0Lm5leHQpe3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsaT1uZXcgQXJyYXkobiksbz1lLmNvcmtlZFJlcXVlc3RzRnJlZTtvLmVudHJ5PXQ7Zm9yKHZhciBzPTAsYT0hMDt0OylpW3NdPXQsdC5pc0J1Znx8KGE9ITEpLHQ9dC5uZXh0LHMrPTE7aS5hbGxCdWZmZXJzPWEsZ24ocixlLCEwLGUubGVuZ3RoLGksXCJcIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IHBvKGUpLGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MH1lbHNle2Zvcig7dDspe3ZhciB1PXQuY2h1bmssZj10LmVuY29kaW5nLGw9dC5jYWxsYmFjayxkPWUub2JqZWN0TW9kZT8xOnUubGVuZ3RoO2lmKGduKHIsZSwhMSxkLHUsZixsKSx0PXQubmV4dCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS0sZS53cml0aW5nKWJyZWFrfXQ9PT1udWxsJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0PXQsZS5idWZmZXJQcm9jZXNzaW5nPSExfUYucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihyLGUsdCl7dChuZXcgRnUoXCJfd3JpdGUoKVwiKSl9O0YucHJvdG90eXBlLl93cml0ZXY9bnVsbDtGLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24ocixlLHQpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGU7cmV0dXJuIHR5cGVvZiByPT1cImZ1bmN0aW9uXCI/KHQ9cixyPW51bGwsZT1udWxsKTp0eXBlb2YgZT09XCJmdW5jdGlvblwiJiYodD1lLGU9bnVsbCksciE9bnVsbCYmdGhpcy53cml0ZShyLGUpLG4uY29ya2VkJiYobi5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxuLmVuZGluZ3x8SnUodGhpcyxuLHQpLHRoaXN9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcIndyaXRhYmxlTGVuZ3RoXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RofX0pO2Z1bmN0aW9uIGdvKHIpe3JldHVybiByLmVuZGluZyYmci5sZW5ndGg9PT0wJiZyLmJ1ZmZlcmVkUmVxdWVzdD09PW51bGwmJiFyLmZpbmlzaGVkJiYhci53cml0aW5nfWZ1bmN0aW9uIEt1KHIsZSl7ci5fZmluYWwoZnVuY3Rpb24odCl7ZS5wZW5kaW5nY2ItLSx0JiZ0dChyLHQpLGUucHJlZmluaXNoZWQ9ITAsci5lbWl0KFwicHJlZmluaXNoXCIpLHZ0KHIsZSl9KX1mdW5jdGlvbiBYdShyLGUpeyFlLnByZWZpbmlzaGVkJiYhZS5maW5hbENhbGxlZCYmKHR5cGVvZiByLl9maW5hbD09XCJmdW5jdGlvblwiJiYhZS5kZXN0cm95ZWQ/KGUucGVuZGluZ2NiKyssZS5maW5hbENhbGxlZD0hMCxwcm9jZXNzLm5leHRUaWNrKEt1LHIsZSkpOihlLnByZWZpbmlzaGVkPSEwLHIuZW1pdChcInByZWZpbmlzaFwiKSkpfWZ1bmN0aW9uIHZ0KHIsZSl7dmFyIHQ9Z28oZSk7aWYodCYmKFh1KHIsZSksZS5wZW5kaW5nY2I9PT0wJiYoZS5maW5pc2hlZD0hMCxyLmVtaXQoXCJmaW5pc2hcIiksZS5hdXRvRGVzdHJveSkpKXt2YXIgbj1yLl9yZWFkYWJsZVN0YXRlOyghbnx8bi5hdXRvRGVzdHJveSYmbi5lbmRFbWl0dGVkKSYmci5kZXN0cm95KCl9cmV0dXJuIHR9ZnVuY3Rpb24gSnUocixlLHQpe2UuZW5kaW5nPSEwLHZ0KHIsZSksdCYmKGUuZmluaXNoZWQ/cHJvY2Vzcy5uZXh0VGljayh0KTpyLm9uY2UoXCJmaW5pc2hcIix0KSksZS5lbmRlZD0hMCxyLndyaXRhYmxlPSExfWZ1bmN0aW9uIFF1KHIsZSx0KXt2YXIgbj1yLmVudHJ5O2ZvcihyLmVudHJ5PW51bGw7bjspe3ZhciBpPW4uY2FsbGJhY2s7ZS5wZW5kaW5nY2ItLSxpKHQpLG49bi5uZXh0fWUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9cn1PYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsXCJkZXN0cm95ZWRcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZT09PXZvaWQgMD8hMTp0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKGUpeyF0aGlzLl93cml0YWJsZVN0YXRlfHwodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSk7Ri5wcm90b3R5cGUuZGVzdHJveT15bi5kZXN0cm95O0YucHJvdG90eXBlLl91bmRlc3Ryb3k9eW4udW5kZXN0cm95O0YucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHIsZSl7ZShyKX19KTt2YXIgRGU9UygoRWwseG8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBadT1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ocil7dmFyIGU9W107Zm9yKHZhciB0IGluIHIpZS5wdXNoKHQpO3JldHVybiBlfTt4by5leHBvcnRzPWFlO3ZhciBibz13bigpLF9uPWJuKCk7T2UoKShhZSxibyk7Zm9yKHhuPVp1KF9uLnByb3RvdHlwZSksenQ9MDt6dDx4bi5sZW5ndGg7enQrKylZdD14blt6dF0sYWUucHJvdG90eXBlW1l0XXx8KGFlLnByb3RvdHlwZVtZdF09X24ucHJvdG90eXBlW1l0XSk7dmFyIHhuLFl0LHp0O2Z1bmN0aW9uIGFlKHIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGFlKSlyZXR1cm4gbmV3IGFlKHIpO2JvLmNhbGwodGhpcyxyKSxfbi5jYWxsKHRoaXMsciksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHImJihyLnJlYWRhYmxlPT09ITEmJih0aGlzLnJlYWRhYmxlPSExKSxyLndyaXRhYmxlPT09ITEmJih0aGlzLndyaXRhYmxlPSExKSxyLmFsbG93SGFsZk9wZW49PT0hMSYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSx0aGlzLm9uY2UoXCJlbmRcIixlZikpKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoYWUucHJvdG90eXBlLFwid3JpdGFibGVIaWdoV2F0ZXJNYXJrXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYWUucHJvdG90eXBlLFwid3JpdGFibGVCdWZmZXJcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYWUucHJvdG90eXBlLFwid3JpdGFibGVMZW5ndGhcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGh9fSk7ZnVuY3Rpb24gZWYoKXt0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxwcm9jZXNzLm5leHRUaWNrKHRmLHRoaXMpfWZ1bmN0aW9uIHRmKHIpe3IuZW5kKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGFlLnByb3RvdHlwZSxcImRlc3Ryb3llZFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlPT09dm9pZCAwfHx0aGlzLl93cml0YWJsZVN0YXRlPT09dm9pZCAwPyExOnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3JlYWRhYmxlU3RhdGU9PT12b2lkIDB8fHRoaXMuX3dyaXRhYmxlU3RhdGU9PT12b2lkIDB8fCh0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD1lLHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPWUpfX0pfSk7dmFyIHZvPVMoKHZuLHdvKT0+e2MoKTt2YXIgS3Q9WGUoKSx1ZT1LdC5CdWZmZXI7ZnVuY3Rpb24gX28ocixlKXtmb3IodmFyIHQgaW4gcillW3RdPXJbdF19dWUuZnJvbSYmdWUuYWxsb2MmJnVlLmFsbG9jVW5zYWZlJiZ1ZS5hbGxvY1Vuc2FmZVNsb3c/d28uZXhwb3J0cz1LdDooX28oS3Qsdm4pLHZuLkJ1ZmZlcj1OZSk7ZnVuY3Rpb24gTmUocixlLHQpe3JldHVybiB1ZShyLGUsdCl9TmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodWUucHJvdG90eXBlKTtfbyh1ZSxOZSk7TmUuZnJvbT1mdW5jdGlvbihyLGUsdCl7aWYodHlwZW9mIHI9PVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyXCIpO3JldHVybiB1ZShyLGUsdCl9O05lLmFsbG9jPWZ1bmN0aW9uKHIsZSx0KXtpZih0eXBlb2YgciE9XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlclwiKTt2YXIgbj11ZShyKTtyZXR1cm4gZSE9PXZvaWQgMD90eXBlb2YgdD09XCJzdHJpbmdcIj9uLmZpbGwoZSx0KTpuLmZpbGwoZSk6bi5maWxsKDApLG59O05lLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyXCIpO3JldHVybiB1ZShyKX07TmUuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyXCIpO3JldHVybiBLdC5TbG93QnVmZmVyKHIpfX0pO3ZhciBSbj1TKFNvPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBTbj12bygpLkJ1ZmZlcixFbz1Tbi5pc0VuY29kaW5nfHxmdW5jdGlvbihyKXtzd2l0Y2gocj1cIlwiK3IsciYmci50b0xvd2VyQ2FzZSgpKXtjYXNlXCJoZXhcIjpjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpjYXNlXCJhc2NpaVwiOmNhc2VcImJpbmFyeVwiOmNhc2VcImJhc2U2NFwiOmNhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOmNhc2VcInJhd1wiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiByZihyKXtpZighcilyZXR1cm5cInV0ZjhcIjtmb3IodmFyIGU7Oylzd2l0Y2gocil7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuXCJ1dGY4XCI7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuXCJ1dGYxNmxlXCI7Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuXCJsYXRpbjFcIjtjYXNlXCJiYXNlNjRcIjpjYXNlXCJhc2NpaVwiOmNhc2VcImhleFwiOnJldHVybiByO2RlZmF1bHQ6aWYoZSlyZXR1cm47cj0oXCJcIityKS50b0xvd2VyQ2FzZSgpLGU9ITB9fWZ1bmN0aW9uIG5mKHIpe3ZhciBlPXJmKHIpO2lmKHR5cGVvZiBlIT1cInN0cmluZ1wiJiYoU24uaXNFbmNvZGluZz09PUVvfHwhRW8ocikpKXRocm93IG5ldyBFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK3IpO3JldHVybiBlfHxyfVNvLlN0cmluZ0RlY29kZXI9U3Q7ZnVuY3Rpb24gU3Qocil7dGhpcy5lbmNvZGluZz1uZihyKTt2YXIgZTtzd2l0Y2godGhpcy5lbmNvZGluZyl7Y2FzZVwidXRmMTZsZVwiOnRoaXMudGV4dD1jZix0aGlzLmVuZD1sZixlPTQ7YnJlYWs7Y2FzZVwidXRmOFwiOnRoaXMuZmlsbExhc3Q9YWYsZT00O2JyZWFrO2Nhc2VcImJhc2U2NFwiOnRoaXMudGV4dD1kZix0aGlzLmVuZD1wZixlPTM7YnJlYWs7ZGVmYXVsdDp0aGlzLndyaXRlPWhmLHRoaXMuZW5kPW1mO3JldHVybn10aGlzLmxhc3ROZWVkPTAsdGhpcy5sYXN0VG90YWw9MCx0aGlzLmxhc3RDaGFyPVNuLmFsbG9jVW5zYWZlKGUpfVN0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihyKXtpZihyLmxlbmd0aD09PTApcmV0dXJuXCJcIjt2YXIgZSx0O2lmKHRoaXMubGFzdE5lZWQpe2lmKGU9dGhpcy5maWxsTGFzdChyKSxlPT09dm9pZCAwKXJldHVyblwiXCI7dD10aGlzLmxhc3ROZWVkLHRoaXMubGFzdE5lZWQ9MH1lbHNlIHQ9MDtyZXR1cm4gdDxyLmxlbmd0aD9lP2UrdGhpcy50ZXh0KHIsdCk6dGhpcy50ZXh0KHIsdCk6ZXx8XCJcIn07U3QucHJvdG90eXBlLmVuZD1mZjtTdC5wcm90b3R5cGUudGV4dD11ZjtTdC5wcm90b3R5cGUuZmlsbExhc3Q9ZnVuY3Rpb24ocil7aWYodGhpcy5sYXN0TmVlZDw9ci5sZW5ndGgpcmV0dXJuIHIuY29weSh0aGlzLmxhc3RDaGFyLHRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCk7ci5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHIubGVuZ3RoKSx0aGlzLmxhc3ROZWVkLT1yLmxlbmd0aH07ZnVuY3Rpb24gRW4ocil7cmV0dXJuIHI8PTEyNz8wOnI+PjU9PT02PzI6cj4+ND09PTE0PzM6cj4+Mz09PTMwPzQ6cj4+Nj09PTI/LTE6LTJ9ZnVuY3Rpb24gb2YocixlLHQpe3ZhciBuPWUubGVuZ3RoLTE7aWYobjx0KXJldHVybiAwO3ZhciBpPUVuKGVbbl0pO3JldHVybiBpPj0wPyhpPjAmJihyLmxhc3ROZWVkPWktMSksaSk6LS1uPHR8fGk9PT0tMj8wOihpPUVuKGVbbl0pLGk+PTA/KGk+MCYmKHIubGFzdE5lZWQ9aS0yKSxpKTotLW48dHx8aT09PS0yPzA6KGk9RW4oZVtuXSksaT49MD8oaT4wJiYoaT09PTI/aT0wOnIubGFzdE5lZWQ9aS0zKSxpKTowKSl9ZnVuY3Rpb24gc2YocixlLHQpe2lmKChlWzBdJjE5MikhPT0xMjgpcmV0dXJuIHIubGFzdE5lZWQ9MCxcIlxcdUZGRkRcIjtpZihyLmxhc3ROZWVkPjEmJmUubGVuZ3RoPjEpe2lmKChlWzFdJjE5MikhPT0xMjgpcmV0dXJuIHIubGFzdE5lZWQ9MSxcIlxcdUZGRkRcIjtpZihyLmxhc3ROZWVkPjImJmUubGVuZ3RoPjImJihlWzJdJjE5MikhPT0xMjgpcmV0dXJuIHIubGFzdE5lZWQ9MixcIlxcdUZGRkRcIn19ZnVuY3Rpb24gYWYocil7dmFyIGU9dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCx0PXNmKHRoaXMscixlKTtpZih0IT09dm9pZCAwKXJldHVybiB0O2lmKHRoaXMubGFzdE5lZWQ8PXIubGVuZ3RoKXJldHVybiByLmNvcHkodGhpcy5sYXN0Q2hhcixlLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpO3IuY29weSh0aGlzLmxhc3RDaGFyLGUsMCxyLmxlbmd0aCksdGhpcy5sYXN0TmVlZC09ci5sZW5ndGh9ZnVuY3Rpb24gdWYocixlKXt2YXIgdD1vZih0aGlzLHIsZSk7aWYoIXRoaXMubGFzdE5lZWQpcmV0dXJuIHIudG9TdHJpbmcoXCJ1dGY4XCIsZSk7dGhpcy5sYXN0VG90YWw9dDt2YXIgbj1yLmxlbmd0aC0odC10aGlzLmxhc3ROZWVkKTtyZXR1cm4gci5jb3B5KHRoaXMubGFzdENoYXIsMCxuKSxyLnRvU3RyaW5nKFwidXRmOFwiLGUsbil9ZnVuY3Rpb24gZmYocil7dmFyIGU9ciYmci5sZW5ndGg/dGhpcy53cml0ZShyKTpcIlwiO3JldHVybiB0aGlzLmxhc3ROZWVkP2UrXCJcXHVGRkZEXCI6ZX1mdW5jdGlvbiBjZihyLGUpe2lmKChyLmxlbmd0aC1lKSUyPT09MCl7dmFyIHQ9ci50b1N0cmluZyhcInV0ZjE2bGVcIixlKTtpZih0KXt2YXIgbj10LmNoYXJDb2RlQXQodC5sZW5ndGgtMSk7aWYobj49NTUyOTYmJm48PTU2MzE5KXJldHVybiB0aGlzLmxhc3ROZWVkPTIsdGhpcy5sYXN0VG90YWw9NCx0aGlzLmxhc3RDaGFyWzBdPXJbci5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT1yW3IubGVuZ3RoLTFdLHQuc2xpY2UoMCwtMSl9cmV0dXJuIHR9cmV0dXJuIHRoaXMubGFzdE5lZWQ9MSx0aGlzLmxhc3RUb3RhbD0yLHRoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0xXSxyLnRvU3RyaW5nKFwidXRmMTZsZVwiLGUsci5sZW5ndGgtMSl9ZnVuY3Rpb24gbGYocil7dmFyIGU9ciYmci5sZW5ndGg/dGhpcy53cml0ZShyKTpcIlwiO2lmKHRoaXMubGFzdE5lZWQpe3ZhciB0PXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQ7cmV0dXJuIGUrdGhpcy5sYXN0Q2hhci50b1N0cmluZyhcInV0ZjE2bGVcIiwwLHQpfXJldHVybiBlfWZ1bmN0aW9uIGRmKHIsZSl7dmFyIHQ9KHIubGVuZ3RoLWUpJTM7cmV0dXJuIHQ9PT0wP3IudG9TdHJpbmcoXCJiYXNlNjRcIixlKToodGhpcy5sYXN0TmVlZD0zLXQsdGhpcy5sYXN0VG90YWw9Myx0PT09MT90aGlzLmxhc3RDaGFyWzBdPXJbci5sZW5ndGgtMV06KHRoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXJbci5sZW5ndGgtMV0pLHIudG9TdHJpbmcoXCJiYXNlNjRcIixlLHIubGVuZ3RoLXQpKX1mdW5jdGlvbiBwZihyKXt2YXIgZT1yJiZyLmxlbmd0aD90aGlzLndyaXRlKHIpOlwiXCI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZSt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKFwiYmFzZTY0XCIsMCwzLXRoaXMubGFzdE5lZWQpOmV9ZnVuY3Rpb24gaGYocil7cmV0dXJuIHIudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gbWYocil7cmV0dXJuIHImJnIubGVuZ3RoP3RoaXMud3JpdGUocik6XCJcIn19KTt2YXIgWHQ9UygoUmwsQ28pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBSbz1VZSgpLmNvZGVzLkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFO2Z1bmN0aW9uIGdmKHIpe3ZhciBlPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFlKXtlPSEwO2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQpLGk9MDtpPHQ7aSsrKW5baV09YXJndW1lbnRzW2ldO3IuYXBwbHkodGhpcyxuKX19fWZ1bmN0aW9uIHlmKCl7fWZ1bmN0aW9uIGJmKHIpe3JldHVybiByLnNldEhlYWRlciYmdHlwZW9mIHIuYWJvcnQ9PVwiZnVuY3Rpb25cIn1mdW5jdGlvbiBUbyhyLGUsdCl7aWYodHlwZW9mIGU9PVwiZnVuY3Rpb25cIilyZXR1cm4gVG8ocixudWxsLGUpO2V8fChlPXt9KSx0PWdmKHR8fHlmKTt2YXIgbj1lLnJlYWRhYmxlfHxlLnJlYWRhYmxlIT09ITEmJnIucmVhZGFibGUsaT1lLndyaXRhYmxlfHxlLndyaXRhYmxlIT09ITEmJnIud3JpdGFibGUsbz1mdW5jdGlvbigpe3Iud3JpdGFibGV8fGEoKX0scz1yLl93cml0YWJsZVN0YXRlJiZyLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkLGE9ZnVuY3Rpb24oKXtpPSExLHM9ITAsbnx8dC5jYWxsKHIpfSx1PXIuX3JlYWRhYmxlU3RhdGUmJnIuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCxmPWZ1bmN0aW9uKCl7bj0hMSx1PSEwLGl8fHQuY2FsbChyKX0sbD1mdW5jdGlvbihiKXt0LmNhbGwocixiKX0sZD1mdW5jdGlvbigpe3ZhciBiO2lmKG4mJiF1KXJldHVybighci5fcmVhZGFibGVTdGF0ZXx8IXIuX3JlYWRhYmxlU3RhdGUuZW5kZWQpJiYoYj1uZXcgUm8pLHQuY2FsbChyLGIpO2lmKGkmJiFzKXJldHVybighci5fd3JpdGFibGVTdGF0ZXx8IXIuX3dyaXRhYmxlU3RhdGUuZW5kZWQpJiYoYj1uZXcgUm8pLHQuY2FsbChyLGIpfSxoPWZ1bmN0aW9uKCl7ci5yZXEub24oXCJmaW5pc2hcIixhKX07cmV0dXJuIGJmKHIpPyhyLm9uKFwiY29tcGxldGVcIixhKSxyLm9uKFwiYWJvcnRcIixkKSxyLnJlcT9oKCk6ci5vbihcInJlcXVlc3RcIixoKSk6aSYmIXIuX3dyaXRhYmxlU3RhdGUmJihyLm9uKFwiZW5kXCIsbyksci5vbihcImNsb3NlXCIsbykpLHIub24oXCJlbmRcIixmKSxyLm9uKFwiZmluaXNoXCIsYSksZS5lcnJvciE9PSExJiZyLm9uKFwiZXJyb3JcIixsKSxyLm9uKFwiY2xvc2VcIixkKSxmdW5jdGlvbigpe3IucmVtb3ZlTGlzdGVuZXIoXCJjb21wbGV0ZVwiLGEpLHIucmVtb3ZlTGlzdGVuZXIoXCJhYm9ydFwiLGQpLHIucmVtb3ZlTGlzdGVuZXIoXCJyZXF1ZXN0XCIsaCksci5yZXEmJnIucmVxLnJlbW92ZUxpc3RlbmVyKFwiZmluaXNoXCIsYSksci5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLG8pLHIucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLG8pLHIucmVtb3ZlTGlzdGVuZXIoXCJmaW5pc2hcIixhKSxyLnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsZiksci5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsbCksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsZCl9fUNvLmV4cG9ydHM9VG99KTt2YXIgTW89UygoVGwsQm8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBKdDtmdW5jdGlvbiBfZShyLGUsdCl7cmV0dXJuIGUgaW4gcj9PYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHt2YWx1ZTp0LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6cltlXT10LHJ9dmFyIHhmPVh0KCksd2U9U3ltYm9sKFwibGFzdFJlc29sdmVcIiksSGU9U3ltYm9sKFwibGFzdFJlamVjdFwiKSxSdD1TeW1ib2woXCJlcnJvclwiKSxRdD1TeW1ib2woXCJlbmRlZFwiKSxxZT1TeW1ib2woXCJsYXN0UHJvbWlzZVwiKSxUbj1TeW1ib2woXCJoYW5kbGVQcm9taXNlXCIpLGplPVN5bWJvbChcInN0cmVhbVwiKTtmdW5jdGlvbiB2ZShyLGUpe3JldHVybnt2YWx1ZTpyLGRvbmU6ZX19ZnVuY3Rpb24gX2Yocil7dmFyIGU9clt3ZV07aWYoZSE9PW51bGwpe3ZhciB0PXJbamVdLnJlYWQoKTt0IT09bnVsbCYmKHJbcWVdPW51bGwsclt3ZV09bnVsbCxyW0hlXT1udWxsLGUodmUodCwhMSkpKX19ZnVuY3Rpb24gd2Yocil7cHJvY2Vzcy5uZXh0VGljayhfZixyKX1mdW5jdGlvbiB2ZihyLGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3IudGhlbihmdW5jdGlvbigpe2lmKGVbUXRdKXt0KHZlKHZvaWQgMCwhMCkpO3JldHVybn1lW1RuXSh0LG4pfSxuKX19dmFyIEVmPU9iamVjdC5nZXRQcm90b3R5cGVPZihmdW5jdGlvbigpe30pLFNmPU9iamVjdC5zZXRQcm90b3R5cGVPZigoSnQ9e2dldCBzdHJlYW0oKXtyZXR1cm4gdGhpc1tqZV19LG5leHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpc1tSdF07aWYodCE9PW51bGwpcmV0dXJuIFByb21pc2UucmVqZWN0KHQpO2lmKHRoaXNbUXRdKXJldHVybiBQcm9taXNlLnJlc29sdmUodmUodm9pZCAwLCEwKSk7aWYodGhpc1tqZV0uZGVzdHJveWVkKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihzLGEpe3Byb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKXtlW1J0XT9hKGVbUnRdKTpzKHZlKHZvaWQgMCwhMCkpfSl9KTt2YXIgbj10aGlzW3FlXSxpO2lmKG4paT1uZXcgUHJvbWlzZSh2ZihuLHRoaXMpKTtlbHNle3ZhciBvPXRoaXNbamVdLnJlYWQoKTtpZihvIT09bnVsbClyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZlKG8sITEpKTtpPW5ldyBQcm9taXNlKHRoaXNbVG5dKX1yZXR1cm4gdGhpc1txZV09aSxpfX0sX2UoSnQsU3ltYm9sLmFzeW5jSXRlcmF0b3IsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLF9lKEp0LFwicmV0dXJuXCIsZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2VbamVdLmRlc3Ryb3kobnVsbCxmdW5jdGlvbihpKXtpZihpKXtuKGkpO3JldHVybn10KHZlKHZvaWQgMCwhMCkpfSl9KX0pLEp0KSxFZiksUmY9ZnVuY3Rpb24oZSl7dmFyIHQsbj1PYmplY3QuY3JlYXRlKFNmLCh0PXt9LF9lKHQsamUse3ZhbHVlOmUsd3JpdGFibGU6ITB9KSxfZSh0LHdlLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksX2UodCxIZSx7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLF9lKHQsUnQse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZSh0LFF0LHt2YWx1ZTplLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsd3JpdGFibGU6ITB9KSxfZSh0LFRuLHt2YWx1ZTpmdW5jdGlvbihvLHMpe3ZhciBhPW5bamVdLnJlYWQoKTthPyhuW3FlXT1udWxsLG5bd2VdPW51bGwsbltIZV09bnVsbCxvKHZlKGEsITEpKSk6KG5bd2VdPW8sbltIZV09cyl9LHdyaXRhYmxlOiEwfSksdCkpO3JldHVybiBuW3FlXT1udWxsLHhmKGUsZnVuY3Rpb24oaSl7aWYoaSYmaS5jb2RlIT09XCJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRVwiKXt2YXIgbz1uW0hlXTtvIT09bnVsbCYmKG5bcWVdPW51bGwsblt3ZV09bnVsbCxuW0hlXT1udWxsLG8oaSkpLG5bUnRdPWk7cmV0dXJufXZhciBzPW5bd2VdO3MhPT1udWxsJiYobltxZV09bnVsbCxuW3dlXT1udWxsLG5bSGVdPW51bGwscyh2ZSh2b2lkIDAsITApKSksbltRdF09ITB9KSxlLm9uKFwicmVhZGFibGVcIix3Zi5iaW5kKG51bGwsbikpLG59O0JvLmV4cG9ydHM9UmZ9KTt2YXIgSW89UygoQ2wsTG8pPT57YygpO0xvLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJSZWFkYWJsZS5mcm9tIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXJcIil9fSk7dmFyIHduPVMoKE1sLHFvKT0+e1widXNlIHN0cmljdFwiO2MoKTtxby5leHBvcnRzPUU7dmFyIHJ0O0UuUmVhZGFibGVTdGF0ZT1rbzt2YXIgQmw9dW4oKS5FdmVudEVtaXR0ZXIsUG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5saXN0ZW5lcnModCkubGVuZ3RofSxDdD1mbigpLFp0PVhlKCkuQnVmZmVyLFRmPWdsb2JhbC5VaW50OEFycmF5fHxmdW5jdGlvbigpe307ZnVuY3Rpb24gQ2Yocil7cmV0dXJuIFp0LmZyb20ocil9ZnVuY3Rpb24gQmYocil7cmV0dXJuIFp0LmlzQnVmZmVyKHIpfHxyIGluc3RhbmNlb2YgVGZ9dmFyIENuPWNuKCkseDtDbiYmQ24uZGVidWdsb2c/eD1Dbi5kZWJ1Z2xvZyhcInN0cmVhbVwiKTp4PWZ1bmN0aW9uKCl7fTt2YXIgTWY9cm8oKSxQbj1wbigpLExmPWhuKCksSWY9TGYuZ2V0SGlnaFdhdGVyTWFyayxlcj1VZSgpLmNvZGVzLEFmPWVyLkVSUl9JTlZBTElEX0FSR19UWVBFLEZmPWVyLkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YsUGY9ZXIuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsa2Y9ZXIuRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCxudCxCbixNbjtPZSgpKEUsQ3QpO3ZhciBUdD1Qbi5lcnJvck9yRGVzdHJveSxMbj1bXCJlcnJvclwiLFwiY2xvc2VcIixcImRlc3Ryb3lcIixcInBhdXNlXCIsXCJyZXN1bWVcIl07ZnVuY3Rpb24gT2YocixlLHQpe2lmKHR5cGVvZiByLnByZXBlbmRMaXN0ZW5lcj09XCJmdW5jdGlvblwiKXJldHVybiByLnByZXBlbmRMaXN0ZW5lcihlLHQpOyFyLl9ldmVudHN8fCFyLl9ldmVudHNbZV0/ci5vbihlLHQpOkFycmF5LmlzQXJyYXkoci5fZXZlbnRzW2VdKT9yLl9ldmVudHNbZV0udW5zaGlmdCh0KTpyLl9ldmVudHNbZV09W3Qsci5fZXZlbnRzW2VdXX1mdW5jdGlvbiBrbyhyLGUsdCl7cnQ9cnR8fERlKCkscj1yfHx7fSx0eXBlb2YgdCE9XCJib29sZWFuXCImJih0PWUgaW5zdGFuY2VvZiBydCksdGhpcy5vYmplY3RNb2RlPSEhci5vYmplY3RNb2RlLHQmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXIucmVhZGFibGVPYmplY3RNb2RlKSx0aGlzLmhpZ2hXYXRlck1hcms9SWYodGhpcyxyLFwicmVhZGFibGVIaWdoV2F0ZXJNYXJrXCIsdCksdGhpcy5idWZmZXI9bmV3IE1mLHRoaXMubGVuZ3RoPTAsdGhpcy5waXBlcz1udWxsLHRoaXMucGlwZXNDb3VudD0wLHRoaXMuZmxvd2luZz1udWxsLHRoaXMuZW5kZWQ9ITEsdGhpcy5lbmRFbWl0dGVkPSExLHRoaXMucmVhZGluZz0hMSx0aGlzLnN5bmM9ITAsdGhpcy5uZWVkUmVhZGFibGU9ITEsdGhpcy5lbWl0dGVkUmVhZGFibGU9ITEsdGhpcy5yZWFkYWJsZUxpc3RlbmluZz0hMSx0aGlzLnJlc3VtZVNjaGVkdWxlZD0hMSx0aGlzLnBhdXNlZD0hMCx0aGlzLmVtaXRDbG9zZT1yLmVtaXRDbG9zZSE9PSExLHRoaXMuYXV0b0Rlc3Ryb3k9ISFyLmF1dG9EZXN0cm95LHRoaXMuZGVzdHJveWVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXIuZGVmYXVsdEVuY29kaW5nfHxcInV0ZjhcIix0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCxyLmVuY29kaW5nJiYobnR8fChudD1SbigpLlN0cmluZ0RlY29kZXIpLHRoaXMuZGVjb2Rlcj1uZXcgbnQoci5lbmNvZGluZyksdGhpcy5lbmNvZGluZz1yLmVuY29kaW5nKX1mdW5jdGlvbiBFKHIpe2lmKHJ0PXJ0fHxEZSgpLCEodGhpcyBpbnN0YW5jZW9mIEUpKXJldHVybiBuZXcgRShyKTt2YXIgZT10aGlzIGluc3RhbmNlb2YgcnQ7dGhpcy5fcmVhZGFibGVTdGF0ZT1uZXcga28ocix0aGlzLGUpLHRoaXMucmVhZGFibGU9ITAsciYmKHR5cGVvZiByLnJlYWQ9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX3JlYWQ9ci5yZWFkKSx0eXBlb2Ygci5kZXN0cm95PT1cImZ1bmN0aW9uXCImJih0aGlzLl9kZXN0cm95PXIuZGVzdHJveSkpLEN0LmNhbGwodGhpcyl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEUucHJvdG90eXBlLFwiZGVzdHJveWVkXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGU9PT12b2lkIDA/ITE6dGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbihlKXshdGhpcy5fcmVhZGFibGVTdGF0ZXx8KHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPWUpfX0pO0UucHJvdG90eXBlLmRlc3Ryb3k9UG4uZGVzdHJveTtFLnByb3RvdHlwZS5fdW5kZXN0cm95PVBuLnVuZGVzdHJveTtFLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihyLGUpe2Uocil9O0UucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24ocixlKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlLG47cmV0dXJuIHQub2JqZWN0TW9kZT9uPSEwOnR5cGVvZiByPT1cInN0cmluZ1wiJiYoZT1lfHx0LmRlZmF1bHRFbmNvZGluZyxlIT09dC5lbmNvZGluZyYmKHI9WnQuZnJvbShyLGUpLGU9XCJcIiksbj0hMCksT28odGhpcyxyLGUsITEsbil9O0UucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24ocil7cmV0dXJuIE9vKHRoaXMscixudWxsLCEwLCExKX07ZnVuY3Rpb24gT28ocixlLHQsbixpKXt4KFwicmVhZGFibGVBZGRDaHVua1wiLGUpO3ZhciBvPXIuX3JlYWRhYmxlU3RhdGU7aWYoZT09PW51bGwpby5yZWFkaW5nPSExLE5mKHIsbyk7ZWxzZXt2YXIgcztpZihpfHwocz1VZihvLGUpKSxzKVR0KHIscyk7ZWxzZSBpZihvLm9iamVjdE1vZGV8fGUmJmUubGVuZ3RoPjApaWYodHlwZW9mIGUhPVwic3RyaW5nXCImJiFvLm9iamVjdE1vZGUmJk9iamVjdC5nZXRQcm90b3R5cGVPZihlKSE9PVp0LnByb3RvdHlwZSYmKGU9Q2YoZSkpLG4pby5lbmRFbWl0dGVkP1R0KHIsbmV3IGtmKTpJbihyLG8sZSwhMCk7ZWxzZSBpZihvLmVuZGVkKVR0KHIsbmV3IEZmKTtlbHNle2lmKG8uZGVzdHJveWVkKXJldHVybiExO28ucmVhZGluZz0hMSxvLmRlY29kZXImJiF0PyhlPW8uZGVjb2Rlci53cml0ZShlKSxvLm9iamVjdE1vZGV8fGUubGVuZ3RoIT09MD9JbihyLG8sZSwhMSk6Rm4ocixvKSk6SW4ocixvLGUsITEpfWVsc2Ugbnx8KG8ucmVhZGluZz0hMSxGbihyLG8pKX1yZXR1cm4hby5lbmRlZCYmKG8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFya3x8by5sZW5ndGg9PT0wKX1mdW5jdGlvbiBJbihyLGUsdCxuKXtlLmZsb3dpbmcmJmUubGVuZ3RoPT09MCYmIWUuc3luYz8oZS5hd2FpdERyYWluPTAsci5lbWl0KFwiZGF0YVwiLHQpKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnQubGVuZ3RoLG4/ZS5idWZmZXIudW5zaGlmdCh0KTplLmJ1ZmZlci5wdXNoKHQpLGUubmVlZFJlYWRhYmxlJiZ0cihyKSksRm4ocixlKX1mdW5jdGlvbiBVZihyLGUpe3ZhciB0O3JldHVybiFCZihlKSYmdHlwZW9mIGUhPVwic3RyaW5nXCImJmUhPT12b2lkIDAmJiFyLm9iamVjdE1vZGUmJih0PW5ldyBBZihcImNodW5rXCIsW1wic3RyaW5nXCIsXCJCdWZmZXJcIixcIlVpbnQ4QXJyYXlcIl0sZSkpLHR9RS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPT09ITF9O0UucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHIpe250fHwobnQ9Um4oKS5TdHJpbmdEZWNvZGVyKTt2YXIgZT1uZXcgbnQocik7dGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPWUsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZz10aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIuZW5jb2Rpbmc7Zm9yKHZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmhlYWQsbj1cIlwiO3QhPT1udWxsOyluKz1lLndyaXRlKHQuZGF0YSksdD10Lm5leHQ7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmNsZWFyKCksbiE9PVwiXCImJnRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLnB1c2gobiksdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGg9bi5sZW5ndGgsdGhpc307dmFyIEFvPTEwNzM3NDE4MjQ7ZnVuY3Rpb24gRGYocil7cmV0dXJuIHI+PUFvP3I9QW86KHItLSxyfD1yPj4+MSxyfD1yPj4+MixyfD1yPj4+NCxyfD1yPj4+OCxyfD1yPj4+MTYscisrKSxyfWZ1bmN0aW9uIEZvKHIsZSl7cmV0dXJuIHI8PTB8fGUubGVuZ3RoPT09MCYmZS5lbmRlZD8wOmUub2JqZWN0TW9kZT8xOnIhPT1yP2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoocj5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9RGYocikpLHI8PWUubGVuZ3RoP3I6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfUUucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24ocil7eChcInJlYWRcIixyKSxyPXBhcnNlSW50KHIsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUsdD1yO2lmKHIhPT0wJiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLHI9PT0wJiZlLm5lZWRSZWFkYWJsZSYmKChlLmhpZ2hXYXRlck1hcmshPT0wP2UubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcms6ZS5sZW5ndGg+MCl8fGUuZW5kZWQpKXJldHVybiB4KFwicmVhZDogZW1pdFJlYWRhYmxlXCIsZS5sZW5ndGgsZS5lbmRlZCksZS5sZW5ndGg9PT0wJiZlLmVuZGVkP0FuKHRoaXMpOnRyKHRoaXMpLG51bGw7aWYocj1GbyhyLGUpLHI9PT0wJiZlLmVuZGVkKXJldHVybiBlLmxlbmd0aD09PTAmJkFuKHRoaXMpLG51bGw7dmFyIG49ZS5uZWVkUmVhZGFibGU7eChcIm5lZWQgcmVhZGFibGVcIixuKSwoZS5sZW5ndGg9PT0wfHxlLmxlbmd0aC1yPGUuaGlnaFdhdGVyTWFyaykmJihuPSEwLHgoXCJsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFya1wiLG4pKSxlLmVuZGVkfHxlLnJlYWRpbmc/KG49ITEseChcInJlYWRpbmcgb3IgZW5kZWRcIixuKSk6biYmKHgoXCJkbyByZWFkXCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsZS5sZW5ndGg9PT0wJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwocj1Gbyh0LGUpKSk7dmFyIGk7cmV0dXJuIHI+MD9pPU5vKHIsZSk6aT1udWxsLGk9PT1udWxsPyhlLm5lZWRSZWFkYWJsZT1lLmxlbmd0aDw9ZS5oaWdoV2F0ZXJNYXJrLHI9MCk6KGUubGVuZ3RoLT1yLGUuYXdhaXREcmFpbj0wKSxlLmxlbmd0aD09PTAmJihlLmVuZGVkfHwoZS5uZWVkUmVhZGFibGU9ITApLHQhPT1yJiZlLmVuZGVkJiZBbih0aGlzKSksaSE9PW51bGwmJnRoaXMuZW1pdChcImRhdGFcIixpKSxpfTtmdW5jdGlvbiBOZihyLGUpe2lmKHgoXCJvbkVvZkNodW5rXCIpLCFlLmVuZGVkKXtpZihlLmRlY29kZXIpe3ZhciB0PWUuZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmKGUuYnVmZmVyLnB1c2godCksZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnQubGVuZ3RoKX1lLmVuZGVkPSEwLGUuc3luYz90cihyKTooZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChlLmVtaXR0ZWRSZWFkYWJsZT0hMCxVbyhyKSkpfX1mdW5jdGlvbiB0cihyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO3goXCJlbWl0UmVhZGFibGVcIixlLm5lZWRSZWFkYWJsZSxlLmVtaXR0ZWRSZWFkYWJsZSksZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fCh4KFwiZW1pdFJlYWRhYmxlXCIsZS5mbG93aW5nKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMCxwcm9jZXNzLm5leHRUaWNrKFVvLHIpKX1mdW5jdGlvbiBVbyhyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO3goXCJlbWl0UmVhZGFibGVfXCIsZS5kZXN0cm95ZWQsZS5sZW5ndGgsZS5lbmRlZCksIWUuZGVzdHJveWVkJiYoZS5sZW5ndGh8fGUuZW5kZWQpJiYoci5lbWl0KFwicmVhZGFibGVcIiksZS5lbWl0dGVkUmVhZGFibGU9ITEpLGUubmVlZFJlYWRhYmxlPSFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDw9ZS5oaWdoV2F0ZXJNYXJrLGtuKHIpfWZ1bmN0aW9uIEZuKHIsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAscHJvY2Vzcy5uZXh0VGljayhIZixyLGUpKX1mdW5jdGlvbiBIZihyLGUpe2Zvcig7IWUucmVhZGluZyYmIWUuZW5kZWQmJihlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmt8fGUuZmxvd2luZyYmZS5sZW5ndGg9PT0wKTspe3ZhciB0PWUubGVuZ3RoO2lmKHgoXCJtYXliZVJlYWRNb3JlIHJlYWQgMFwiKSxyLnJlYWQoMCksdD09PWUubGVuZ3RoKWJyZWFrfWUucmVhZGluZ01vcmU9ITF9RS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24ocil7VHQodGhpcyxuZXcgUGYoXCJfcmVhZCgpXCIpKX07RS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbihyLGUpe3ZhciB0PXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChuLnBpcGVzQ291bnQpe2Nhc2UgMDpuLnBpcGVzPXI7YnJlYWs7Y2FzZSAxOm4ucGlwZXM9W24ucGlwZXMscl07YnJlYWs7ZGVmYXVsdDpuLnBpcGVzLnB1c2gocik7YnJlYWt9bi5waXBlc0NvdW50Kz0xLHgoXCJwaXBlIGNvdW50PSVkIG9wdHM9JWpcIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9KCFlfHxlLmVuZCE9PSExKSYmciE9PXByb2Nlc3Muc3Rkb3V0JiZyIT09cHJvY2Vzcy5zdGRlcnIsbz1pP2E6eTtuLmVuZEVtaXR0ZWQ/cHJvY2Vzcy5uZXh0VGljayhvKTp0Lm9uY2UoXCJlbmRcIixvKSxyLm9uKFwidW5waXBlXCIscyk7ZnVuY3Rpb24gcyh3LF8pe3goXCJvbnVucGlwZVwiKSx3PT09dCYmXyYmXy5oYXNVbnBpcGVkPT09ITEmJihfLmhhc1VucGlwZWQ9ITAsbCgpKX1mdW5jdGlvbiBhKCl7eChcIm9uZW5kXCIpLHIuZW5kKCl9dmFyIHU9cWYodCk7ci5vbihcImRyYWluXCIsdSk7dmFyIGY9ITE7ZnVuY3Rpb24gbCgpe3goXCJjbGVhbnVwXCIpLHIucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLG0pLHIucmVtb3ZlTGlzdGVuZXIoXCJmaW5pc2hcIixiKSxyLnJlbW92ZUxpc3RlbmVyKFwiZHJhaW5cIix1KSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixoKSxyLnJlbW92ZUxpc3RlbmVyKFwidW5waXBlXCIscyksdC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLGEpLHQucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIix5KSx0LnJlbW92ZUxpc3RlbmVyKFwiZGF0YVwiLGQpLGY9ITAsbi5hd2FpdERyYWluJiYoIXIuX3dyaXRhYmxlU3RhdGV8fHIuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSYmdSgpfXQub24oXCJkYXRhXCIsZCk7ZnVuY3Rpb24gZCh3KXt4KFwib25kYXRhXCIpO3ZhciBfPXIud3JpdGUodyk7eChcImRlc3Qud3JpdGVcIixfKSxfPT09ITEmJigobi5waXBlc0NvdW50PT09MSYmbi5waXBlcz09PXJ8fG4ucGlwZXNDb3VudD4xJiZIbyhuLnBpcGVzLHIpIT09LTEpJiYhZiYmKHgoXCJmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2VcIixuLmF3YWl0RHJhaW4pLG4uYXdhaXREcmFpbisrKSx0LnBhdXNlKCkpfWZ1bmN0aW9uIGgodyl7eChcIm9uZXJyb3JcIix3KSx5KCksci5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsaCksUG8ocixcImVycm9yXCIpPT09MCYmVHQocix3KX1PZihyLFwiZXJyb3JcIixoKTtmdW5jdGlvbiBtKCl7ci5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGIpLHkoKX1yLm9uY2UoXCJjbG9zZVwiLG0pO2Z1bmN0aW9uIGIoKXt4KFwib25maW5pc2hcIiksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsbSkseSgpfXIub25jZShcImZpbmlzaFwiLGIpO2Z1bmN0aW9uIHkoKXt4KFwidW5waXBlXCIpLHQudW5waXBlKHIpfXJldHVybiByLmVtaXQoXCJwaXBlXCIsdCksbi5mbG93aW5nfHwoeChcInBpcGUgcmVzdW1lXCIpLHQucmVzdW1lKCkpLHJ9O2Z1bmN0aW9uIHFmKHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXIuX3JlYWRhYmxlU3RhdGU7eChcInBpcGVPbkRyYWluXCIsdC5hd2FpdERyYWluKSx0LmF3YWl0RHJhaW4mJnQuYXdhaXREcmFpbi0tLHQuYXdhaXREcmFpbj09PTAmJlBvKHIsXCJkYXRhXCIpJiYodC5mbG93aW5nPSEwLGtuKHIpKX19RS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHIpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUsdD17aGFzVW5waXBlZDohMX07aWYoZS5waXBlc0NvdW50PT09MClyZXR1cm4gdGhpcztpZihlLnBpcGVzQ291bnQ9PT0xKXJldHVybiByJiZyIT09ZS5waXBlcz90aGlzOihyfHwocj1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHImJnIuZW1pdChcInVucGlwZVwiLHRoaXMsdCksdGhpcyk7aWYoIXIpe3ZhciBuPWUucGlwZXMsaT1lLnBpcGVzQ291bnQ7ZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMTtmb3IodmFyIG89MDtvPGk7bysrKW5bb10uZW1pdChcInVucGlwZVwiLHRoaXMse2hhc1VucGlwZWQ6ITF9KTtyZXR1cm4gdGhpc312YXIgcz1IbyhlLnBpcGVzLHIpO3JldHVybiBzPT09LTE/dGhpczooZS5waXBlcy5zcGxpY2UocywxKSxlLnBpcGVzQ291bnQtPTEsZS5waXBlc0NvdW50PT09MSYmKGUucGlwZXM9ZS5waXBlc1swXSksci5lbWl0KFwidW5waXBlXCIsdGhpcyx0KSx0aGlzKX07RS5wcm90b3R5cGUub249ZnVuY3Rpb24ocixlKXt2YXIgdD1DdC5wcm90b3R5cGUub24uY2FsbCh0aGlzLHIsZSksbj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByPT09XCJkYXRhXCI/KG4ucmVhZGFibGVMaXN0ZW5pbmc9dGhpcy5saXN0ZW5lckNvdW50KFwicmVhZGFibGVcIik+MCxuLmZsb3dpbmchPT0hMSYmdGhpcy5yZXN1bWUoKSk6cj09PVwicmVhZGFibGVcIiYmIW4uZW5kRW1pdHRlZCYmIW4ucmVhZGFibGVMaXN0ZW5pbmcmJihuLnJlYWRhYmxlTGlzdGVuaW5nPW4ubmVlZFJlYWRhYmxlPSEwLG4uZmxvd2luZz0hMSxuLmVtaXR0ZWRSZWFkYWJsZT0hMSx4KFwib24gcmVhZGFibGVcIixuLmxlbmd0aCxuLnJlYWRpbmcpLG4ubGVuZ3RoP3RyKHRoaXMpOm4ucmVhZGluZ3x8cHJvY2Vzcy5uZXh0VGljayhqZix0aGlzKSksdH07RS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9RS5wcm90b3R5cGUub247RS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgdD1DdC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIuY2FsbCh0aGlzLHIsZSk7cmV0dXJuIHI9PT1cInJlYWRhYmxlXCImJnByb2Nlc3MubmV4dFRpY2soRG8sdGhpcyksdH07RS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3ZhciBlPUN0LnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybihyPT09XCJyZWFkYWJsZVwifHxyPT09dm9pZCAwKSYmcHJvY2Vzcy5uZXh0VGljayhEbyx0aGlzKSxlfTtmdW5jdGlvbiBEbyhyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO2UucmVhZGFibGVMaXN0ZW5pbmc9ci5saXN0ZW5lckNvdW50KFwicmVhZGFibGVcIik+MCxlLnJlc3VtZVNjaGVkdWxlZCYmIWUucGF1c2VkP2UuZmxvd2luZz0hMDpyLmxpc3RlbmVyQ291bnQoXCJkYXRhXCIpPjAmJnIucmVzdW1lKCl9ZnVuY3Rpb24gamYocil7eChcInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMFwiKSxyLnJlYWQoMCl9RS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gci5mbG93aW5nfHwoeChcInJlc3VtZVwiKSxyLmZsb3dpbmc9IXIucmVhZGFibGVMaXN0ZW5pbmcsV2YodGhpcyxyKSksci5wYXVzZWQ9ITEsdGhpc307ZnVuY3Rpb24gV2YocixlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLHByb2Nlc3MubmV4dFRpY2soJGYscixlKSl9ZnVuY3Rpb24gJGYocixlKXt4KFwicmVzdW1lXCIsZS5yZWFkaW5nKSxlLnJlYWRpbmd8fHIucmVhZCgwKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxyLmVtaXQoXCJyZXN1bWVcIiksa24ociksZS5mbG93aW5nJiYhZS5yZWFkaW5nJiZyLnJlYWQoMCl9RS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4geChcImNhbGwgcGF1c2UgZmxvd2luZz0lalwiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nIT09ITEmJih4KFwicGF1c2VcIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdChcInBhdXNlXCIpKSx0aGlzLl9yZWFkYWJsZVN0YXRlLnBhdXNlZD0hMCx0aGlzfTtmdW5jdGlvbiBrbihyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO2Zvcih4KFwiZmxvd1wiLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZyLnJlYWQoKSE9PW51bGw7KTt9RS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihyKXt2YXIgZT10aGlzLHQ9dGhpcy5fcmVhZGFibGVTdGF0ZSxuPSExO3Iub24oXCJlbmRcIixmdW5jdGlvbigpe2lmKHgoXCJ3cmFwcGVkIGVuZFwiKSx0LmRlY29kZXImJiF0LmVuZGVkKXt2YXIgcz10LmRlY29kZXIuZW5kKCk7cyYmcy5sZW5ndGgmJmUucHVzaChzKX1lLnB1c2gobnVsbCl9KSxyLm9uKFwiZGF0YVwiLGZ1bmN0aW9uKHMpe2lmKHgoXCJ3cmFwcGVkIGRhdGFcIiksdC5kZWNvZGVyJiYocz10LmRlY29kZXIud3JpdGUocykpLCEodC5vYmplY3RNb2RlJiZzPT1udWxsKSYmISghdC5vYmplY3RNb2RlJiYoIXN8fCFzLmxlbmd0aCkpKXt2YXIgYT1lLnB1c2gocyk7YXx8KG49ITAsci5wYXVzZSgpKX19KTtmb3IodmFyIGkgaW4gcil0aGlzW2ldPT09dm9pZCAwJiZ0eXBlb2YgcltpXT09XCJmdW5jdGlvblwiJiYodGhpc1tpXT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gclthXS5hcHBseShyLGFyZ3VtZW50cyl9fShpKSk7Zm9yKHZhciBvPTA7bzxMbi5sZW5ndGg7bysrKXIub24oTG5bb10sdGhpcy5lbWl0LmJpbmQodGhpcyxMbltvXSkpO3JldHVybiB0aGlzLl9yZWFkPWZ1bmN0aW9uKHMpe3goXCJ3cmFwcGVkIF9yZWFkXCIscyksbiYmKG49ITEsci5yZXN1bWUoKSl9LHRoaXN9O3R5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmKEUucHJvdG90eXBlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiBCbj09PXZvaWQgMCYmKEJuPU1vKCkpLEJuKHRoaXMpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEUucHJvdG90eXBlLFwicmVhZGFibGVIaWdoV2F0ZXJNYXJrXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJyZWFkYWJsZUJ1ZmZlclwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlJiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJyZWFkYWJsZUZsb3dpbmdcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz1lKX19KTtFLl9mcm9tTGlzdD1ObztPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJyZWFkYWJsZUxlbmd0aFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aH19KTtmdW5jdGlvbiBObyhyLGUpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4gbnVsbDt2YXIgdDtyZXR1cm4gZS5vYmplY3RNb2RlP3Q9ZS5idWZmZXIuc2hpZnQoKTohcnx8cj49ZS5sZW5ndGg/KGUuZGVjb2Rlcj90PWUuYnVmZmVyLmpvaW4oXCJcIik6ZS5idWZmZXIubGVuZ3RoPT09MT90PWUuYnVmZmVyLmZpcnN0KCk6dD1lLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLGUuYnVmZmVyLmNsZWFyKCkpOnQ9ZS5idWZmZXIuY29uc3VtZShyLGUuZGVjb2RlciksdH1mdW5jdGlvbiBBbihyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO3goXCJlbmRSZWFkYWJsZVwiLGUuZW5kRW1pdHRlZCksZS5lbmRFbWl0dGVkfHwoZS5lbmRlZD0hMCxwcm9jZXNzLm5leHRUaWNrKEdmLGUscikpfWZ1bmN0aW9uIEdmKHIsZSl7aWYoeChcImVuZFJlYWRhYmxlTlRcIixyLmVuZEVtaXR0ZWQsci5sZW5ndGgpLCFyLmVuZEVtaXR0ZWQmJnIubGVuZ3RoPT09MCYmKHIuZW5kRW1pdHRlZD0hMCxlLnJlYWRhYmxlPSExLGUuZW1pdChcImVuZFwiKSxyLmF1dG9EZXN0cm95KSl7dmFyIHQ9ZS5fd3JpdGFibGVTdGF0ZTsoIXR8fHQuYXV0b0Rlc3Ryb3kmJnQuZmluaXNoZWQpJiZlLmRlc3Ryb3koKX19dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiYoRS5mcm9tPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIE1uPT09dm9pZCAwJiYoTW49SW8oKSksTW4oRSxyLGUpfSk7ZnVuY3Rpb24gSG8ocixlKXtmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspaWYoclt0XT09PWUpcmV0dXJuIHQ7cmV0dXJuLTF9fSk7dmFyIE9uPVMoKExsLFdvKT0+e1widXNlIHN0cmljdFwiO2MoKTtXby5leHBvcnRzPW1lO3ZhciBycj1VZSgpLmNvZGVzLFZmPXJyLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELHpmPXJyLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxZZj1yci5FUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HLEtmPXJyLkVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMCxucj1EZSgpO09lKCkobWUsbnIpO2Z1bmN0aW9uIFhmKHIsZSl7dmFyIHQ9dGhpcy5fdHJhbnNmb3JtU3RhdGU7dC50cmFuc2Zvcm1pbmc9ITE7dmFyIG49dC53cml0ZWNiO2lmKG49PT1udWxsKXJldHVybiB0aGlzLmVtaXQoXCJlcnJvclwiLG5ldyB6Zik7dC53cml0ZWNodW5rPW51bGwsdC53cml0ZWNiPW51bGwsZSE9bnVsbCYmdGhpcy5wdXNoKGUpLG4ocik7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTtpLnJlYWRpbmc9ITEsKGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9ZnVuY3Rpb24gbWUocil7aWYoISh0aGlzIGluc3RhbmNlb2YgbWUpKXJldHVybiBuZXcgbWUocik7bnIuY2FsbCh0aGlzLHIpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPXthZnRlclRyYW5zZm9ybTpYZi5iaW5kKHRoaXMpLG5lZWRUcmFuc2Zvcm06ITEsdHJhbnNmb3JtaW5nOiExLHdyaXRlY2I6bnVsbCx3cml0ZWNodW5rOm51bGwsd3JpdGVlbmNvZGluZzpudWxsfSx0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsciYmKHR5cGVvZiByLnRyYW5zZm9ybT09XCJmdW5jdGlvblwiJiYodGhpcy5fdHJhbnNmb3JtPXIudHJhbnNmb3JtKSx0eXBlb2Ygci5mbHVzaD09XCJmdW5jdGlvblwiJiYodGhpcy5fZmx1c2g9ci5mbHVzaCkpLHRoaXMub24oXCJwcmVmaW5pc2hcIixKZil9ZnVuY3Rpb24gSmYoKXt2YXIgcj10aGlzO3R5cGVvZiB0aGlzLl9mbHVzaD09XCJmdW5jdGlvblwiJiYhdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ/dGhpcy5fZmx1c2goZnVuY3Rpb24oZSx0KXtqbyhyLGUsdCl9KTpqbyh0aGlzLG51bGwsbnVsbCl9bWUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24ocixlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxuci5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMscixlKX07bWUucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24ocixlLHQpe3QobmV3IFZmKFwiX3RyYW5zZm9ybSgpXCIpKX07bWUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihyLGUsdCl7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7aWYobi53cml0ZWNiPXQsbi53cml0ZWNodW5rPXIsbi53cml0ZWVuY29kaW5nPWUsIW4udHJhbnNmb3JtaW5nKXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlOyhuLm5lZWRUcmFuc2Zvcm18fGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9fTttZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24ocil7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7ZS53cml0ZWNodW5rIT09bnVsbCYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfTttZS5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24ocixlKXtuci5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLHIsZnVuY3Rpb24odCl7ZSh0KX0pfTtmdW5jdGlvbiBqbyhyLGUsdCl7aWYoZSlyZXR1cm4gci5lbWl0KFwiZXJyb3JcIixlKTtpZih0IT1udWxsJiZyLnB1c2godCksci5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpdGhyb3cgbmV3IEtmO2lmKHIuX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgWWY7cmV0dXJuIHIucHVzaChudWxsKX19KTt2YXIgVm89UygoSWwsR28pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO0dvLmV4cG9ydHM9QnQ7dmFyICRvPU9uKCk7T2UoKShCdCwkbyk7ZnVuY3Rpb24gQnQocil7aWYoISh0aGlzIGluc3RhbmNlb2YgQnQpKXJldHVybiBuZXcgQnQocik7JG8uY2FsbCh0aGlzLHIpfUJ0LnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHIsZSx0KXt0KG51bGwscil9fSk7dmFyIEpvPVMoKEFsLFhvKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgVW47ZnVuY3Rpb24gUWYocil7dmFyIGU9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7ZXx8KGU9ITAsci5hcHBseSh2b2lkIDAsYXJndW1lbnRzKSl9fXZhciBLbz1VZSgpLmNvZGVzLFpmPUtvLkVSUl9NSVNTSU5HX0FSR1MsZWM9S28uRVJSX1NUUkVBTV9ERVNUUk9ZRUQ7ZnVuY3Rpb24gem8ocil7aWYocil0aHJvdyByfWZ1bmN0aW9uIHRjKHIpe3JldHVybiByLnNldEhlYWRlciYmdHlwZW9mIHIuYWJvcnQ9PVwiZnVuY3Rpb25cIn1mdW5jdGlvbiByYyhyLGUsdCxuKXtuPVFmKG4pO3ZhciBpPSExO3Iub24oXCJjbG9zZVwiLGZ1bmN0aW9uKCl7aT0hMH0pLFVuPT09dm9pZCAwJiYoVW49WHQoKSksVW4ocix7cmVhZGFibGU6ZSx3cml0YWJsZTp0fSxmdW5jdGlvbihzKXtpZihzKXJldHVybiBuKHMpO2k9ITAsbigpfSk7dmFyIG89ITE7cmV0dXJuIGZ1bmN0aW9uKHMpe2lmKCFpJiYhbyl7aWYobz0hMCx0YyhyKSlyZXR1cm4gci5hYm9ydCgpO2lmKHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIilyZXR1cm4gci5kZXN0cm95KCk7bihzfHxuZXcgZWMoXCJwaXBlXCIpKX19fWZ1bmN0aW9uIFlvKHIpe3IoKX1mdW5jdGlvbiBuYyhyLGUpe3JldHVybiByLnBpcGUoZSl9ZnVuY3Rpb24gaWMocil7cmV0dXJuIXIubGVuZ3RofHx0eXBlb2YgcltyLmxlbmd0aC0xXSE9XCJmdW5jdGlvblwiP3pvOnIucG9wKCl9ZnVuY3Rpb24gb2MoKXtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheShyKSx0PTA7dDxyO3QrKyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj1pYyhlKTtpZihBcnJheS5pc0FycmF5KGVbMF0pJiYoZT1lWzBdKSxlLmxlbmd0aDwyKXRocm93IG5ldyBaZihcInN0cmVhbXNcIik7dmFyIGksbz1lLm1hcChmdW5jdGlvbihzLGEpe3ZhciB1PWE8ZS5sZW5ndGgtMSxmPWE+MDtyZXR1cm4gcmMocyx1LGYsZnVuY3Rpb24obCl7aXx8KGk9bCksbCYmby5mb3JFYWNoKFlvKSwhdSYmKG8uZm9yRWFjaChZbyksbihpKSl9KX0pO3JldHVybiBlLnJlZHVjZShuYyl9WG8uZXhwb3J0cz1vY30pO3ZhciBOPVMoKEZsLFFvKT0+e2MoKTtRby5leHBvcnRzPUo7dmFyIERuPWppKCkuRXZlbnRFbWl0dGVyLHNjPU9lKCk7c2MoSixEbik7Si5SZWFkYWJsZT13bigpO0ouV3JpdGFibGU9Ym4oKTtKLkR1cGxleD1EZSgpO0ouVHJhbnNmb3JtPU9uKCk7Si5QYXNzVGhyb3VnaD1WbygpO0ouZmluaXNoZWQ9WHQoKTtKLnBpcGVsaW5lPUpvKCk7Si5TdHJlYW09SjtmdW5jdGlvbiBKKCl7RG4uY2FsbCh0aGlzKX1KLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9dGhpcztmdW5jdGlvbiBuKGwpe3Iud3JpdGFibGUmJnIud3JpdGUobCk9PT0hMSYmdC5wYXVzZSYmdC5wYXVzZSgpfXQub24oXCJkYXRhXCIsbik7ZnVuY3Rpb24gaSgpe3QucmVhZGFibGUmJnQucmVzdW1lJiZ0LnJlc3VtZSgpfXIub24oXCJkcmFpblwiLGkpLCFyLl9pc1N0ZGlvJiYoIWV8fGUuZW5kIT09ITEpJiYodC5vbihcImVuZFwiLHMpLHQub24oXCJjbG9zZVwiLGEpKTt2YXIgbz0hMTtmdW5jdGlvbiBzKCl7b3x8KG89ITAsci5lbmQoKSl9ZnVuY3Rpb24gYSgpe298fChvPSEwLHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIiYmci5kZXN0cm95KCkpfWZ1bmN0aW9uIHUobCl7aWYoZigpLERuLmxpc3RlbmVyQ291bnQodGhpcyxcImVycm9yXCIpPT09MCl0aHJvdyBsfXQub24oXCJlcnJvclwiLHUpLHIub24oXCJlcnJvclwiLHUpO2Z1bmN0aW9uIGYoKXt0LnJlbW92ZUxpc3RlbmVyKFwiZGF0YVwiLG4pLHIucmVtb3ZlTGlzdGVuZXIoXCJkcmFpblwiLGkpLHQucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixzKSx0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixhKSx0LnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIix1KSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIix1KSx0LnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsZiksdC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsZiksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsZil9cmV0dXJuIHQub24oXCJlbmRcIixmKSx0Lm9uKFwiY2xvc2VcIixmKSxyLm9uKFwiY2xvc2VcIixmKSxyLmVtaXQoXCJwaXBlXCIsdCkscn19KTt2YXIgdXM9UygoeWQsYXMpPT57YygpO3ZhciBhdD0xZTMsdXQ9YXQqNjAsZnQ9dXQqNjAsJGU9ZnQqMjQsZmM9JGUqNyxjYz0kZSozNjUuMjU7YXMuZXhwb3J0cz1mdW5jdGlvbihyLGUpe2U9ZXx8e307dmFyIHQ9dHlwZW9mIHI7aWYodD09PVwic3RyaW5nXCImJnIubGVuZ3RoPjApcmV0dXJuIGxjKHIpO2lmKHQ9PT1cIm51bWJlclwiJiZpc0Zpbml0ZShyKSlyZXR1cm4gZS5sb25nP3BjKHIpOmRjKHIpO3Rocm93IG5ldyBFcnJvcihcInZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9XCIrSlNPTi5zdHJpbmdpZnkocikpfTtmdW5jdGlvbiBsYyhyKXtpZihyPVN0cmluZyhyKSwhKHIubGVuZ3RoPjEwMCkpe3ZhciBlPS9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhyKTtpZighIWUpe3ZhciB0PXBhcnNlRmxvYXQoZVsxXSksbj0oZVsyXXx8XCJtc1wiKS50b0xvd2VyQ2FzZSgpO3N3aXRjaChuKXtjYXNlXCJ5ZWFyc1wiOmNhc2VcInllYXJcIjpjYXNlXCJ5cnNcIjpjYXNlXCJ5clwiOmNhc2VcInlcIjpyZXR1cm4gdCpjYztjYXNlXCJ3ZWVrc1wiOmNhc2VcIndlZWtcIjpjYXNlXCJ3XCI6cmV0dXJuIHQqZmM7Y2FzZVwiZGF5c1wiOmNhc2VcImRheVwiOmNhc2VcImRcIjpyZXR1cm4gdCokZTtjYXNlXCJob3Vyc1wiOmNhc2VcImhvdXJcIjpjYXNlXCJocnNcIjpjYXNlXCJoclwiOmNhc2VcImhcIjpyZXR1cm4gdCpmdDtjYXNlXCJtaW51dGVzXCI6Y2FzZVwibWludXRlXCI6Y2FzZVwibWluc1wiOmNhc2VcIm1pblwiOmNhc2VcIm1cIjpyZXR1cm4gdCp1dDtjYXNlXCJzZWNvbmRzXCI6Y2FzZVwic2Vjb25kXCI6Y2FzZVwic2Vjc1wiOmNhc2VcInNlY1wiOmNhc2VcInNcIjpyZXR1cm4gdCphdDtjYXNlXCJtaWxsaXNlY29uZHNcIjpjYXNlXCJtaWxsaXNlY29uZFwiOmNhc2VcIm1zZWNzXCI6Y2FzZVwibXNlY1wiOmNhc2VcIm1zXCI6cmV0dXJuIHQ7ZGVmYXVsdDpyZXR1cm59fX19ZnVuY3Rpb24gZGMocil7dmFyIGU9TWF0aC5hYnMocik7cmV0dXJuIGU+PSRlP01hdGgucm91bmQoci8kZSkrXCJkXCI6ZT49ZnQ/TWF0aC5yb3VuZChyL2Z0KStcImhcIjplPj11dD9NYXRoLnJvdW5kKHIvdXQpK1wibVwiOmU+PWF0P01hdGgucm91bmQoci9hdCkrXCJzXCI6citcIm1zXCJ9ZnVuY3Rpb24gcGMocil7dmFyIGU9TWF0aC5hYnMocik7cmV0dXJuIGU+PSRlP2ZyKHIsZSwkZSxcImRheVwiKTplPj1mdD9mcihyLGUsZnQsXCJob3VyXCIpOmU+PXV0P2ZyKHIsZSx1dCxcIm1pbnV0ZVwiKTplPj1hdD9mcihyLGUsYXQsXCJzZWNvbmRcIik6citcIiBtc1wifWZ1bmN0aW9uIGZyKHIsZSx0LG4pe3ZhciBpPWU+PXQqMS41O3JldHVybiBNYXRoLnJvdW5kKHIvdCkrXCIgXCIrbisoaT9cInNcIjpcIlwiKX19KTt2YXIgY3M9UygoYmQsZnMpPT57YygpO2Z1bmN0aW9uIGhjKHIpe3QuZGVidWc9dCx0LmRlZmF1bHQ9dCx0LmNvZXJjZT11LHQuZGlzYWJsZT1vLHQuZW5hYmxlPWksdC5lbmFibGVkPXMsdC5odW1hbml6ZT11cygpLHQuZGVzdHJveT1mLE9iamVjdC5rZXlzKHIpLmZvckVhY2gobD0+e3RbbF09cltsXX0pLHQubmFtZXM9W10sdC5za2lwcz1bXSx0LmZvcm1hdHRlcnM9e307ZnVuY3Rpb24gZShsKXtsZXQgZD0wO2ZvcihsZXQgaD0wO2g8bC5sZW5ndGg7aCsrKWQ9KGQ8PDUpLWQrbC5jaGFyQ29kZUF0KGgpLGR8PTA7cmV0dXJuIHQuY29sb3JzW01hdGguYWJzKGQpJXQuY29sb3JzLmxlbmd0aF19dC5zZWxlY3RDb2xvcj1lO2Z1bmN0aW9uIHQobCl7bGV0IGQsaD1udWxsLG0sYjtmdW5jdGlvbiB5KC4uLncpe2lmKCF5LmVuYWJsZWQpcmV0dXJuO2xldCBfPXksdj1OdW1iZXIobmV3IERhdGUpLHE9di0oZHx8dik7Xy5kaWZmPXEsXy5wcmV2PWQsXy5jdXJyPXYsZD12LHdbMF09dC5jb2VyY2Uod1swXSksdHlwZW9mIHdbMF0hPVwic3RyaW5nXCImJncudW5zaGlmdChcIiVPXCIpO2xldCBBPTA7d1swXT13WzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLChZLEdlKT0+e2lmKFk9PT1cIiUlXCIpcmV0dXJuXCIlXCI7QSsrO2xldCBJZT10LmZvcm1hdHRlcnNbR2VdO2lmKHR5cGVvZiBJZT09XCJmdW5jdGlvblwiKXtsZXQgQWU9d1tBXTtZPUllLmNhbGwoXyxBZSksdy5zcGxpY2UoQSwxKSxBLS19cmV0dXJuIFl9KSx0LmZvcm1hdEFyZ3MuY2FsbChfLHcpLChfLmxvZ3x8dC5sb2cpLmFwcGx5KF8sdyl9cmV0dXJuIHkubmFtZXNwYWNlPWwseS51c2VDb2xvcnM9dC51c2VDb2xvcnMoKSx5LmNvbG9yPXQuc2VsZWN0Q29sb3IobCkseS5leHRlbmQ9bix5LmRlc3Ryb3k9dC5kZXN0cm95LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LFwiZW5hYmxlZFwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6KCk9PmghPT1udWxsP2g6KG0hPT10Lm5hbWVzcGFjZXMmJihtPXQubmFtZXNwYWNlcyxiPXQuZW5hYmxlZChsKSksYiksc2V0Onc9PntoPXd9fSksdHlwZW9mIHQuaW5pdD09XCJmdW5jdGlvblwiJiZ0LmluaXQoeSkseX1mdW5jdGlvbiBuKGwsZCl7bGV0IGg9dCh0aGlzLm5hbWVzcGFjZSsodHlwZW9mIGQ+XCJ1XCI/XCI6XCI6ZCkrbCk7cmV0dXJuIGgubG9nPXRoaXMubG9nLGh9ZnVuY3Rpb24gaShsKXt0LnNhdmUobCksdC5uYW1lc3BhY2VzPWwsdC5uYW1lcz1bXSx0LnNraXBzPVtdO2xldCBkLGg9KHR5cGVvZiBsPT1cInN0cmluZ1wiP2w6XCJcIikuc3BsaXQoL1tcXHMsXSsvKSxtPWgubGVuZ3RoO2ZvcihkPTA7ZDxtO2QrKykhaFtkXXx8KGw9aFtkXS5yZXBsYWNlKC9cXCovZyxcIi4qP1wiKSxsWzBdPT09XCItXCI/dC5za2lwcy5wdXNoKG5ldyBSZWdFeHAoXCJeXCIrbC5zbGljZSgxKStcIiRcIikpOnQubmFtZXMucHVzaChuZXcgUmVnRXhwKFwiXlwiK2wrXCIkXCIpKSl9ZnVuY3Rpb24gbygpe2xldCBsPVsuLi50Lm5hbWVzLm1hcChhKSwuLi50LnNraXBzLm1hcChhKS5tYXAoZD0+XCItXCIrZCldLmpvaW4oXCIsXCIpO3JldHVybiB0LmVuYWJsZShcIlwiKSxsfWZ1bmN0aW9uIHMobCl7aWYobFtsLmxlbmd0aC0xXT09PVwiKlwiKXJldHVybiEwO2xldCBkLGg7Zm9yKGQ9MCxoPXQuc2tpcHMubGVuZ3RoO2Q8aDtkKyspaWYodC5za2lwc1tkXS50ZXN0KGwpKXJldHVybiExO2ZvcihkPTAsaD10Lm5hbWVzLmxlbmd0aDtkPGg7ZCsrKWlmKHQubmFtZXNbZF0udGVzdChsKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBhKGwpe3JldHVybiBsLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIsbC50b1N0cmluZygpLmxlbmd0aC0yKS5yZXBsYWNlKC9cXC5cXCpcXD8kLyxcIipcIil9ZnVuY3Rpb24gdShsKXtyZXR1cm4gbCBpbnN0YW5jZW9mIEVycm9yP2wuc3RhY2t8fGwubWVzc2FnZTpsfWZ1bmN0aW9uIGYoKXtjb25zb2xlLndhcm4oXCJJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuXCIpfXJldHVybiB0LmVuYWJsZSh0LmxvYWQoKSksdH1mcy5leHBvcnRzPWhjfSk7dmFyIGxlPVMoKHosY3IpPT57YygpO3ouZm9ybWF0QXJncz1nYzt6LnNhdmU9eWM7ei5sb2FkPWJjO3oudXNlQ29sb3JzPW1jO3ouc3RvcmFnZT14YygpO3ouZGVzdHJveT0oKCk9PntsZXQgcj0hMTtyZXR1cm4oKT0+e3J8fChyPSEwLGNvbnNvbGUud2FybihcIkluc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC5cIikpfX0pKCk7ei5jb2xvcnM9W1wiIzAwMDBDQ1wiLFwiIzAwMDBGRlwiLFwiIzAwMzNDQ1wiLFwiIzAwMzNGRlwiLFwiIzAwNjZDQ1wiLFwiIzAwNjZGRlwiLFwiIzAwOTlDQ1wiLFwiIzAwOTlGRlwiLFwiIzAwQ0MwMFwiLFwiIzAwQ0MzM1wiLFwiIzAwQ0M2NlwiLFwiIzAwQ0M5OVwiLFwiIzAwQ0NDQ1wiLFwiIzAwQ0NGRlwiLFwiIzMzMDBDQ1wiLFwiIzMzMDBGRlwiLFwiIzMzMzNDQ1wiLFwiIzMzMzNGRlwiLFwiIzMzNjZDQ1wiLFwiIzMzNjZGRlwiLFwiIzMzOTlDQ1wiLFwiIzMzOTlGRlwiLFwiIzMzQ0MwMFwiLFwiIzMzQ0MzM1wiLFwiIzMzQ0M2NlwiLFwiIzMzQ0M5OVwiLFwiIzMzQ0NDQ1wiLFwiIzMzQ0NGRlwiLFwiIzY2MDBDQ1wiLFwiIzY2MDBGRlwiLFwiIzY2MzNDQ1wiLFwiIzY2MzNGRlwiLFwiIzY2Q0MwMFwiLFwiIzY2Q0MzM1wiLFwiIzk5MDBDQ1wiLFwiIzk5MDBGRlwiLFwiIzk5MzNDQ1wiLFwiIzk5MzNGRlwiLFwiIzk5Q0MwMFwiLFwiIzk5Q0MzM1wiLFwiI0NDMDAwMFwiLFwiI0NDMDAzM1wiLFwiI0NDMDA2NlwiLFwiI0NDMDA5OVwiLFwiI0NDMDBDQ1wiLFwiI0NDMDBGRlwiLFwiI0NDMzMwMFwiLFwiI0NDMzMzM1wiLFwiI0NDMzM2NlwiLFwiI0NDMzM5OVwiLFwiI0NDMzNDQ1wiLFwiI0NDMzNGRlwiLFwiI0NDNjYwMFwiLFwiI0NDNjYzM1wiLFwiI0NDOTkwMFwiLFwiI0NDOTkzM1wiLFwiI0NDQ0MwMFwiLFwiI0NDQ0MzM1wiLFwiI0ZGMDAwMFwiLFwiI0ZGMDAzM1wiLFwiI0ZGMDA2NlwiLFwiI0ZGMDA5OVwiLFwiI0ZGMDBDQ1wiLFwiI0ZGMDBGRlwiLFwiI0ZGMzMwMFwiLFwiI0ZGMzMzM1wiLFwiI0ZGMzM2NlwiLFwiI0ZGMzM5OVwiLFwiI0ZGMzNDQ1wiLFwiI0ZGMzNGRlwiLFwiI0ZGNjYwMFwiLFwiI0ZGNjYzM1wiLFwiI0ZGOTkwMFwiLFwiI0ZGOTkzM1wiLFwiI0ZGQ0MwMFwiLFwiI0ZGQ0MzM1wiXTtmdW5jdGlvbiBtYygpe3JldHVybiB0eXBlb2Ygd2luZG93PFwidVwiJiZ3aW5kb3cucHJvY2VzcyYmKHdpbmRvdy5wcm9jZXNzLnR5cGU9PT1cInJlbmRlcmVyXCJ8fHdpbmRvdy5wcm9jZXNzLl9fbndqcyk/ITA6dHlwZW9mIG5hdmlnYXRvcjxcInVcIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pPyExOnR5cGVvZiBkb2N1bWVudDxcInVcIiYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlfHx0eXBlb2Ygd2luZG93PFwidVwiJiZ3aW5kb3cuY29uc29sZSYmKHdpbmRvdy5jb25zb2xlLmZpcmVidWd8fHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiYmd2luZG93LmNvbnNvbGUudGFibGUpfHx0eXBlb2YgbmF2aWdhdG9yPFwidVwiJiZuYXZpZ2F0b3IudXNlckFnZW50JiZuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSYmcGFyc2VJbnQoUmVnRXhwLiQxLDEwKT49MzF8fHR5cGVvZiBuYXZpZ2F0b3I8XCJ1XCImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKX1mdW5jdGlvbiBnYyhyKXtpZihyWzBdPSh0aGlzLnVzZUNvbG9ycz9cIiVjXCI6XCJcIikrdGhpcy5uYW1lc3BhY2UrKHRoaXMudXNlQ29sb3JzP1wiICVjXCI6XCIgXCIpK3JbMF0rKHRoaXMudXNlQ29sb3JzP1wiJWMgXCI6XCIgXCIpK1wiK1wiK2NyLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSwhdGhpcy51c2VDb2xvcnMpcmV0dXJuO2xldCBlPVwiY29sb3I6IFwiK3RoaXMuY29sb3I7ci5zcGxpY2UoMSwwLGUsXCJjb2xvcjogaW5oZXJpdFwiKTtsZXQgdD0wLG49MDtyWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZyxpPT57aSE9PVwiJSVcIiYmKHQrKyxpPT09XCIlY1wiJiYobj10KSl9KSxyLnNwbGljZShuLDAsZSl9ei5sb2c9Y29uc29sZS5kZWJ1Z3x8Y29uc29sZS5sb2d8fCgoKT0+e30pO2Z1bmN0aW9uIHljKHIpe3RyeXtyP3ouc3RvcmFnZS5zZXRJdGVtKFwiZGVidWdcIixyKTp6LnN0b3JhZ2UucmVtb3ZlSXRlbShcImRlYnVnXCIpfWNhdGNoe319ZnVuY3Rpb24gYmMoKXtsZXQgcjt0cnl7cj16LnN0b3JhZ2UuZ2V0SXRlbShcImRlYnVnXCIpfWNhdGNoe31yZXR1cm4hciYmdHlwZW9mIHByb2Nlc3M8XCJ1XCImJlwiZW52XCJpbiBwcm9jZXNzJiYocj1wcm9jZXNzLmVudi5ERUJVRykscn1mdW5jdGlvbiB4Yygpe3RyeXtyZXR1cm4gbG9jYWxTdG9yYWdlfWNhdGNoe319Y3IuZXhwb3J0cz1jcygpKHopO3Zhcntmb3JtYXR0ZXJzOl9jfT1jci5leHBvcnRzO19jLmo9ZnVuY3Rpb24ocil7dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShyKX1jYXRjaChlKXtyZXR1cm5cIltVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiBcIitlLm1lc3NhZ2V9fX0pO3ZhciBuYT1TKHRpPT57XCJ1c2Ugc3RyaWN0XCI7YygpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcmE9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7dGhpcy5fZGF0YUxlbmd0aD0wLHRoaXMuX2J1ZmZlckxlbmd0aD0wLHRoaXMuX3N0YXRlPW5ldyBJbnQzMkFycmF5KDQpLHRoaXMuX2J1ZmZlcj1uZXcgQXJyYXlCdWZmZXIoNjgpLHRoaXMuX2J1ZmZlcjg9bmV3IFVpbnQ4QXJyYXkodGhpcy5fYnVmZmVyLDAsNjgpLHRoaXMuX2J1ZmZlcjMyPW5ldyBVaW50MzJBcnJheSh0aGlzLl9idWZmZXIsMCwxNyksdGhpcy5zdGFydCgpfXJldHVybiByLmhhc2hTdHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9ITEpLHRoaXMub25lUGFzc0hhc2hlci5zdGFydCgpLmFwcGVuZFN0cihlKS5lbmQodCl9LHIuaGFzaEFzY2lpU3RyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSx0aGlzLm9uZVBhc3NIYXNoZXIuc3RhcnQoKS5hcHBlbmRBc2NpaVN0cihlKS5lbmQodCl9LHIuX2hleD1mdW5jdGlvbihlKXt2YXIgdD1yLmhleENoYXJzLG49ci5oZXhPdXQsaSxvLHMsYTtmb3IoYT0wO2E8NDthKz0xKWZvcihvPWEqOCxpPWVbYV0scz0wO3M8ODtzKz0yKW5bbysxK3NdPXQuY2hhckF0KGkmMTUpLGk+Pj49NCxuW28rMCtzXT10LmNoYXJBdChpJjE1KSxpPj4+PTQ7cmV0dXJuIG4uam9pbihcIlwiKX0sci5fbWQ1Y3ljbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lWzBdLGk9ZVsxXSxvPWVbMl0scz1lWzNdO24rPShpJm98fmkmcykrdFswXS02ODA4NzY5MzZ8MCxuPShuPDw3fG4+Pj4yNSkraXwwLHMrPShuJml8fm4mbykrdFsxXS0zODk1NjQ1ODZ8MCxzPShzPDwxMnxzPj4+MjApK258MCxvKz0ocyZufH5zJmkpK3RbMl0rNjA2MTA1ODE5fDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzNdLTEwNDQ1MjUzMzB8MCxpPShpPDwyMnxpPj4+MTApK298MCxuKz0oaSZvfH5pJnMpK3RbNF0tMTc2NDE4ODk3fDAsbj0objw8N3xuPj4+MjUpK2l8MCxzKz0obiZpfH5uJm8pK3RbNV0rMTIwMDA4MDQyNnwwLHM9KHM8PDEyfHM+Pj4yMCkrbnwwLG8rPShzJm58fnMmaSkrdFs2XS0xNDczMjMxMzQxfDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzddLTQ1NzA1OTgzfDAsaT0oaTw8MjJ8aT4+PjEwKStvfDAsbis9KGkmb3x+aSZzKSt0WzhdKzE3NzAwMzU0MTZ8MCxuPShuPDw3fG4+Pj4yNSkraXwwLHMrPShuJml8fm4mbykrdFs5XS0xOTU4NDE0NDE3fDAscz0oczw8MTJ8cz4+PjIwKStufDAsbys9KHMmbnx+cyZpKSt0WzEwXS00MjA2M3wwLG89KG88PDE3fG8+Pj4xNSkrc3wwLGkrPShvJnN8fm8mbikrdFsxMV0tMTk5MDQwNDE2MnwwLGk9KGk8PDIyfGk+Pj4xMCkrb3wwLG4rPShpJm98fmkmcykrdFsxMl0rMTgwNDYwMzY4MnwwLG49KG48PDd8bj4+PjI1KStpfDAscys9KG4maXx+biZvKSt0WzEzXS00MDM0MTEwMXwwLHM9KHM8PDEyfHM+Pj4yMCkrbnwwLG8rPShzJm58fnMmaSkrdFsxNF0tMTUwMjAwMjI5MHwwLG89KG88PDE3fG8+Pj4xNSkrc3wwLGkrPShvJnN8fm8mbikrdFsxNV0rMTIzNjUzNTMyOXwwLGk9KGk8PDIyfGk+Pj4xMCkrb3wwLG4rPShpJnN8byZ+cykrdFsxXS0xNjU3OTY1MTB8MCxuPShuPDw1fG4+Pj4yNykraXwwLHMrPShuJm98aSZ+bykrdFs2XS0xMDY5NTAxNjMyfDAscz0oczw8OXxzPj4+MjMpK258MCxvKz0ocyZpfG4mfmkpK3RbMTFdKzY0MzcxNzcxM3wwLG89KG88PDE0fG8+Pj4xOCkrc3wwLGkrPShvJm58cyZ+bikrdFswXS0zNzM4OTczMDJ8MCxpPShpPDwyMHxpPj4+MTIpK298MCxuKz0oaSZzfG8mfnMpK3RbNV0tNzAxNTU4NjkxfDAsbj0objw8NXxuPj4+MjcpK2l8MCxzKz0obiZvfGkmfm8pK3RbMTBdKzM4MDE2MDgzfDAscz0oczw8OXxzPj4+MjMpK258MCxvKz0ocyZpfG4mfmkpK3RbMTVdLTY2MDQ3ODMzNXwwLG89KG88PDE0fG8+Pj4xOCkrc3wwLGkrPShvJm58cyZ+bikrdFs0XS00MDU1Mzc4NDh8MCxpPShpPDwyMHxpPj4+MTIpK298MCxuKz0oaSZzfG8mfnMpK3RbOV0rNTY4NDQ2NDM4fDAsbj0objw8NXxuPj4+MjcpK2l8MCxzKz0obiZvfGkmfm8pK3RbMTRdLTEwMTk4MDM2OTB8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFszXS0xODczNjM5NjF8MCxvPShvPDwxNHxvPj4+MTgpK3N8MCxpKz0obyZufHMmfm4pK3RbOF0rMTE2MzUzMTUwMXwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpJnN8byZ+cykrdFsxM10tMTQ0NDY4MTQ2N3wwLG49KG48PDV8bj4+PjI3KStpfDAscys9KG4mb3xpJn5vKSt0WzJdLTUxNDAzNzg0fDAscz0oczw8OXxzPj4+MjMpK258MCxvKz0ocyZpfG4mfmkpK3RbN10rMTczNTMyODQ3M3wwLG89KG88PDE0fG8+Pj4xOCkrc3wwLGkrPShvJm58cyZ+bikrdFsxMl0tMTkyNjYwNzczNHwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpXm9ecykrdFs1XS0zNzg1NTh8MCxuPShuPDw0fG4+Pj4yOCkraXwwLHMrPShuXmlebykrdFs4XS0yMDIyNTc0NDYzfDAscz0oczw8MTF8cz4+PjIxKStufDAsbys9KHNebl5pKSt0WzExXSsxODM5MDMwNTYyfDAsbz0obzw8MTZ8bz4+PjE2KStzfDAsaSs9KG9ec15uKSt0WzE0XS0zNTMwOTU1NnwwLGk9KGk8PDIzfGk+Pj45KStvfDAsbis9KGleb15zKSt0WzFdLTE1MzA5OTIwNjB8MCxuPShuPDw0fG4+Pj4yOCkraXwwLHMrPShuXmlebykrdFs0XSsxMjcyODkzMzUzfDAscz0oczw8MTF8cz4+PjIxKStufDAsbys9KHNebl5pKSt0WzddLTE1NTQ5NzYzMnwwLG89KG88PDE2fG8+Pj4xNikrc3wwLGkrPShvXnNebikrdFsxMF0tMTA5NDczMDY0MHwwLGk9KGk8PDIzfGk+Pj45KStvfDAsbis9KGleb15zKSt0WzEzXSs2ODEyNzkxNzR8MCxuPShuPDw0fG4+Pj4yOCkraXwwLHMrPShuXmlebykrdFswXS0zNTg1MzcyMjJ8MCxzPShzPDwxMXxzPj4+MjEpK258MCxvKz0oc15uXmkpK3RbM10tNzIyNTIxOTc5fDAsbz0obzw8MTZ8bz4+PjE2KStzfDAsaSs9KG9ec15uKSt0WzZdKzc2MDI5MTg5fDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0oaV5vXnMpK3RbOV0tNjQwMzY0NDg3fDAsbj0objw8NHxuPj4+MjgpK2l8MCxzKz0obl5pXm8pK3RbMTJdLTQyMTgxNTgzNXwwLHM9KHM8PDExfHM+Pj4yMSkrbnwwLG8rPShzXm5eaSkrdFsxNV0rNTMwNzQyNTIwfDAsbz0obzw8MTZ8bz4+PjE2KStzfDAsaSs9KG9ec15uKSt0WzJdLTk5NTMzODY1MXwwLGk9KGk8PDIzfGk+Pj45KStvfDAsbis9KG9eKGl8fnMpKSt0WzBdLTE5ODYzMDg0NHwwLG49KG48PDZ8bj4+PjI2KStpfDAscys9KGleKG58fm8pKSt0WzddKzExMjY4OTE0MTV8MCxzPShzPDwxMHxzPj4+MjIpK258MCxvKz0obl4oc3x+aSkpK3RbMTRdLTE0MTYzNTQ5MDV8MCxvPShvPDwxNXxvPj4+MTcpK3N8MCxpKz0oc14ob3x+bikpK3RbNV0tNTc0MzQwNTV8MCxpPShpPDwyMXxpPj4+MTEpK298MCxuKz0ob14oaXx+cykpK3RbMTJdKzE3MDA0ODU1NzF8MCxuPShuPDw2fG4+Pj4yNikraXwwLHMrPShpXihufH5vKSkrdFszXS0xODk0OTg2NjA2fDAscz0oczw8MTB8cz4+PjIyKStufDAsbys9KG5eKHN8fmkpKSt0WzEwXS0xMDUxNTIzfDAsbz0obzw8MTV8bz4+PjE3KStzfDAsaSs9KHNeKG98fm4pKSt0WzFdLTIwNTQ5MjI3OTl8MCxpPShpPDwyMXxpPj4+MTEpK298MCxuKz0ob14oaXx+cykpK3RbOF0rMTg3MzMxMzM1OXwwLG49KG48PDZ8bj4+PjI2KStpfDAscys9KGleKG58fm8pKSt0WzE1XS0zMDYxMTc0NHwwLHM9KHM8PDEwfHM+Pj4yMikrbnwwLG8rPShuXihzfH5pKSkrdFs2XS0xNTYwMTk4MzgwfDAsbz0obzw8MTV8bz4+PjE3KStzfDAsaSs9KHNeKG98fm4pKSt0WzEzXSsxMzA5MTUxNjQ5fDAsaT0oaTw8MjF8aT4+PjExKStvfDAsbis9KG9eKGl8fnMpKSt0WzRdLTE0NTUyMzA3MHwwLG49KG48PDZ8bj4+PjI2KStpfDAscys9KGleKG58fm8pKSt0WzExXS0xMTIwMjEwMzc5fDAscz0oczw8MTB8cz4+PjIyKStufDAsbys9KG5eKHN8fmkpKSt0WzJdKzcxODc4NzI1OXwwLG89KG88PDE1fG8+Pj4xNykrc3wwLGkrPShzXihvfH5uKSkrdFs5XS0zNDM0ODU1NTF8MCxpPShpPDwyMXxpPj4+MTEpK298MCxlWzBdPW4rZVswXXwwLGVbMV09aStlWzFdfDAsZVsyXT1vK2VbMl18MCxlWzNdPXMrZVszXXwwfSxyLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhTGVuZ3RoPTAsdGhpcy5fYnVmZmVyTGVuZ3RoPTAsdGhpcy5fc3RhdGUuc2V0KHIuc3RhdGVJZGVudGl0eSksdGhpc30sci5wcm90b3R5cGUuYXBwZW5kU3RyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2J1ZmZlcjgsbj10aGlzLl9idWZmZXIzMixpPXRoaXMuX2J1ZmZlckxlbmd0aCxvLHM7Zm9yKHM9MDtzPGUubGVuZ3RoO3MrPTEpe2lmKG89ZS5jaGFyQ29kZUF0KHMpLG88MTI4KXRbaSsrXT1vO2Vsc2UgaWYobzwyMDQ4KXRbaSsrXT0obz4+PjYpKzE5Mix0W2krK109byY2M3wxMjg7ZWxzZSBpZihvPDU1Mjk2fHxvPjU2MzE5KXRbaSsrXT0obz4+PjEyKSsyMjQsdFtpKytdPW8+Pj42JjYzfDEyOCx0W2krK109byY2M3wxMjg7ZWxzZXtpZihvPShvLTU1Mjk2KSoxMDI0KyhlLmNoYXJDb2RlQXQoKytzKS01NjMyMCkrNjU1MzYsbz4xMTE0MTExKXRocm93IG5ldyBFcnJvcihcIlVuaWNvZGUgc3RhbmRhcmQgc3VwcG9ydHMgY29kZSBwb2ludHMgdXAgdG8gVSsxMEZGRkZcIik7dFtpKytdPShvPj4+MTgpKzI0MCx0W2krK109bz4+PjEyJjYzfDEyOCx0W2krK109bz4+PjYmNjN8MTI4LHRbaSsrXT1vJjYzfDEyOH1pPj02NCYmKHRoaXMuX2RhdGFMZW5ndGgrPTY0LHIuX21kNWN5Y2xlKHRoaXMuX3N0YXRlLG4pLGktPTY0LG5bMF09blsxNl0pfXJldHVybiB0aGlzLl9idWZmZXJMZW5ndGg9aSx0aGlzfSxyLnByb3RvdHlwZS5hcHBlbmRBc2NpaVN0cj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5fYnVmZmVyOCxuPXRoaXMuX2J1ZmZlcjMyLGk9dGhpcy5fYnVmZmVyTGVuZ3RoLG8scz0wOzspe2ZvcihvPU1hdGgubWluKGUubGVuZ3RoLXMsNjQtaSk7by0tOyl0W2krK109ZS5jaGFyQ29kZUF0KHMrKyk7aWYoaTw2NClicmVhazt0aGlzLl9kYXRhTGVuZ3RoKz02NCxyLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxuKSxpPTB9cmV0dXJuIHRoaXMuX2J1ZmZlckxlbmd0aD1pLHRoaXN9LHIucHJvdG90eXBlLmFwcGVuZEJ5dGVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5fYnVmZmVyOCxuPXRoaXMuX2J1ZmZlcjMyLGk9dGhpcy5fYnVmZmVyTGVuZ3RoLG8scz0wOzspe2ZvcihvPU1hdGgubWluKGUubGVuZ3RoLXMsNjQtaSk7by0tOyl0W2krK109ZVtzKytdO2lmKGk8NjQpYnJlYWs7dGhpcy5fZGF0YUxlbmd0aCs9NjQsci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsbiksaT0wfXJldHVybiB0aGlzLl9idWZmZXJMZW5ndGg9aSx0aGlzfSxyLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3N0YXRlO3JldHVybntidWZmZXI6U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLEFycmF5LmZyb20odGhpcy5fYnVmZmVyOCkpLGJ1Zmxlbjp0aGlzLl9idWZmZXJMZW5ndGgsbGVuZ3RoOnRoaXMuX2RhdGFMZW5ndGgsc3RhdGU6W2VbMF0sZVsxXSxlWzJdLGVbM11dfX0sci5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5idWZmZXIsbj1lLnN0YXRlLGk9dGhpcy5fc3RhdGUsbztmb3IodGhpcy5fZGF0YUxlbmd0aD1lLmxlbmd0aCx0aGlzLl9idWZmZXJMZW5ndGg9ZS5idWZsZW4saVswXT1uWzBdLGlbMV09blsxXSxpWzJdPW5bMl0saVszXT1uWzNdLG89MDtvPHQubGVuZ3RoO28rPTEpdGhpcy5fYnVmZmVyOFtvXT10LmNoYXJDb2RlQXQobyl9LHIucHJvdG90eXBlLmVuZD1mdW5jdGlvbihlKXtlPT09dm9pZCAwJiYoZT0hMSk7dmFyIHQ9dGhpcy5fYnVmZmVyTGVuZ3RoLG49dGhpcy5fYnVmZmVyOCxpPXRoaXMuX2J1ZmZlcjMyLG89KHQ+PjIpKzE7dGhpcy5fZGF0YUxlbmd0aCs9dDt2YXIgcz10aGlzLl9kYXRhTGVuZ3RoKjg7aWYoblt0XT0xMjgsblt0KzFdPW5bdCsyXT1uW3QrM109MCxpLnNldChyLmJ1ZmZlcjMySWRlbnRpdHkuc3ViYXJyYXkobyksbyksdD41NSYmKHIuX21kNWN5Y2xlKHRoaXMuX3N0YXRlLGkpLGkuc2V0KHIuYnVmZmVyMzJJZGVudGl0eSkpLHM8PTQyOTQ5NjcyOTUpaVsxNF09cztlbHNle3ZhciBhPXMudG9TdHJpbmcoMTYpLm1hdGNoKC8oLio/KSguezAsOH0pJC8pO2lmKGE9PT1udWxsKXJldHVybjt2YXIgdT1wYXJzZUludChhWzJdLDE2KSxmPXBhcnNlSW50KGFbMV0sMTYpfHwwO2lbMTRdPXUsaVsxNV09Zn1yZXR1cm4gci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsaSksZT90aGlzLl9zdGF0ZTpyLl9oZXgodGhpcy5fc3RhdGUpfSxyLnN0YXRlSWRlbnRpdHk9bmV3IEludDMyQXJyYXkoWzE3MzI1ODQxOTMsLTI3MTczMzg3OSwtMTczMjU4NDE5NCwyNzE3MzM4NzhdKSxyLmJ1ZmZlcjMySWRlbnRpdHk9bmV3IEludDMyQXJyYXkoWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdKSxyLmhleENoYXJzPVwiMDEyMzQ1Njc4OWFiY2RlZlwiLHIuaGV4T3V0PVtdLHIub25lUGFzc0hhc2hlcj1uZXcgcixyfSgpO3RpLk1kNT1yYTtpZihyYS5oYXNoU3RyKFwiaGVsbG9cIikhPT1cIjVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyXCIpdGhyb3cgbmV3IEVycm9yKFwiTWQ1IHNlbGYgdGVzdCBmYWlsZWQuXCIpfSk7dmFyIGlsPXt9O1B0KGlsLHtBQUNEZXBheTooKT0+b3QsQmFzaWNEZXBheTooKT0+c3IsQ2FudmFzU2luazooKT0+c3QsSDI2NERlcGF5OigpPT5jdCxIdG1sNUNhbnZhc1BpcGVsaW5lOigpPT5IcixIdG1sNVZpZGVvTWV0YWRhdGFQaXBlbGluZTooKT0+cXIsSHRtbDVWaWRlb1BpcGVsaW5lOigpPT5fdCxIdHRwTXNlUGlwZWxpbmU6KCk9PkdyLEh0dHBTb3VyY2U6KCk9PmRyLEluc3BlY3RvcjooKT0+cHIsSlBFR0RlcGF5OigpPT5sdCxNZXNzYWdlVHlwZTooKT0+SSxNZXRhZGF0YVBpcGVsaW5lOigpPT5qcixNcDRDYXB0dXJlOigpPT5tcixNcDRNdXhlcjooKT0+cHQsTXNlU2luazooKT0+VGUsT05WSUZEZXBheTooKT0+Q2UsUGlwZWxpbmU6KCk9PkJlLFJUQ1BQYWNrZXRUeXBlOigpPT5LbixSVFNQUmVzcG9uc2VFcnJvcjooKT0+SXQsUlRTUF9NRVRIT0Q6KCk9Pk9yLFJ0c3BNanBlZ1BpcGVsaW5lOigpPT54dCxSdHNwTXA0UGlwZWxpbmU6KCk9PmJ0LFJ0c3BQYXJzZXI6KCk9Pm10LFJ0c3BQaXBlbGluZTooKT0+ZWUsUnRzcFNlc3Npb246KCk9Pnl0LFNERVNJdGVtOigpPT5KbixTUjooKT0+SHMsU2NoZWR1bGVyOigpPT5XZSxTaW5rOigpPT5RLFNvdXJjZTooKT0+VixUdWJlOigpPT5SLFdTU291cmNlOigpPT5HLFdzU2RwUGlwZWxpbmU6KCk9PldyLGFkZFJUU1BSZXRyeTooKT0+YWEsYm9keU9mZnNldDooKT0+QXIsY1NyYzooKT0+bnMsY1NyY0NvdW50OigpPT5TZSxjb21wb25lbnRzOigpPT5laSxjb25uZWN0aW9uRW5kZWQ6KCk9PkxyLGNvbnRlbnRCYXNlOigpPT5Ccixjb250ZW50TG9jYXRpb246KCk9Pk1yLGNyZWF0ZVRyYW5zZm9ybTooKT0+eWUsZXh0SGVhZGVyOigpPT5pcyxleHRIZWFkZXJMZW5ndGg6KCk9Pk10LGV4dGVuc2lvbjooKT0+b3IsZXh0cmFjdEhlYWRlclZhbHVlOigpPT5yZSxleHRyYWN0VVJJczooKT0+SnMsZ2V0VGltZTooKT0+UHIsaXNSdGNwQXBwOigpPT4kcyxpc1J0Y3BCeWU6KCk9PndyLGlzUnRjcFJSOigpPT5qcyxpc1J0Y3BTREVTOigpPT5Xcyxpc1J0Y3BTUjooKT0+X3IsbWFya2VyOigpPT5jZSxtZXNzYWdlRnJvbUJ1ZmZlcjooKT0+U3IscGFkZGluZzooKT0+ZXMscGFyc2U6KCk9PlFuLHBhcnNlUnRjcDooKT0+WG4scGF5bG9hZDooKT0+WixwYXlsb2FkVHlwZTooKT0+TyxwaXBlbGluZXM6KCk9Pm5pLHJhbmdlOigpPT5JcixydGNwTWVzc2FnZUZyb21CdWZmZXI6KCk9PnhyLHNTcmM6KCk9PnJzLHNlcXVlbmNlOigpPT5ScixzZXF1ZW5jZU51bWJlcjooKT0+dHMsc2Vzc2lvbklkOigpPT5UcixzZXNzaW9uVGltZW91dDooKT0+Q3Isc3RhdHVzQ29kZTooKT0+aHQsdGltZXN0YW1wOigpPT5ILHV0aWxzOigpPT5paSx2ZXJzaW9uOigpPT5ab30pO21vZHVsZS5leHBvcnRzPW1hKGlsKTtjKCk7dmFyIGVpPXt9O1B0KGVpLHtBQUNEZXBheTooKT0+b3QsQmFzaWNEZXBheTooKT0+c3IsQ2FudmFzU2luazooKT0+c3QsSDI2NERlcGF5OigpPT5jdCxIdHRwU291cmNlOigpPT5kcixJbnNwZWN0b3I6KCk9PnByLEpQRUdEZXBheTooKT0+bHQsTWVzc2FnZVR5cGU6KCk9PkksTXA0Q2FwdHVyZTooKT0+bXIsTXA0TXV4ZXI6KCk9PnB0LE1zZVNpbms6KCk9PlRlLE9OVklGRGVwYXk6KCk9PkNlLFJUU1BSZXNwb25zZUVycm9yOigpPT5JdCxSVFNQX01FVEhPRDooKT0+T3IsUnRzcFBhcnNlcjooKT0+bXQsUnRzcFNlc3Npb246KCk9Pnl0LFNpbms6KCk9PlEsU291cmNlOigpPT5WLFR1YmU6KCk9PlIsV1NTb3VyY2U6KCk9PkcsY3JlYXRlVHJhbnNmb3JtOigpPT55ZX0pO2MoKTtjKCk7dmFyIGdlPUMoTigpKTtjKCk7dmFyIEVlPUMoTigpKSxmZT1jbGFzc3tzdGF0aWMgY29uc3VtZXIoZT0oKT0+e30pe3JldHVybiBuZXcgRWUuV3JpdGFibGUoe29iamVjdE1vZGU6ITAsd3JpdGUodCxuLGkpe2UodCksaSgpfX0pfXN0YXRpYyBwZWVrZXIoZSl7aWYodHlwZW9mIGUhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgRXJyb3IoXCJ5b3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvblwiKTtyZXR1cm4gbmV3IEVlLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm0odCxuLGkpe2UodCksaSh2b2lkIDAsdCl9fSl9c3RhdGljIHByb2R1Y2VyKGUpe2xldCB0PTA7cmV0dXJuIG5ldyBFZS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkKCl7ZSE9PXZvaWQgMCYmKHQ8ZS5sZW5ndGg/dGhpcy5wdXNoKGVbdCsrXSk6dGhpcy5wdXNoKG51bGwpKX19KX1zdGF0aWMgcmVjb3JkZXIoZSx0KXtyZXR1cm4gbmV3IEVlLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm0obixpLG8pe2xldCBzPURhdGUubm93KCksYT1PYmplY3QuYXNzaWduKHt9LG4se2RhdGE6bi5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfSk7dC53cml0ZShKU09OLnN0cmluZ2lmeSh7dHlwZTplLHRpbWVzdGFtcDpzLG1lc3NhZ2U6YX0sbnVsbCwyKSksdC53cml0ZShgLFxuYCksbyh2b2lkIDAsbil9fSl9c3RhdGljIHJlcGxheWVyKGUpe2xldCB0PTAsbj1lWzBdLnRpbWVzdGFtcDtyZXR1cm4gbmV3IEVlLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQoKXtsZXQgaT1lW3QrK107aWYoaSl7bGV0e3R5cGU6byx0aW1lc3RhbXA6cyxtZXNzYWdlOmF9PWksdT1zLW47aWYobj1zLGEpe2xldCBmPWEuZGF0YT9CdWZmZXIuZnJvbShhLmRhdGEsXCJiYXNlNjRcIik6QnVmZmVyLmFsbG9jKDApLGw9T2JqZWN0LmFzc2lnbih7fSxhLHtkYXRhOmZ9KTt0aGlzLnB1c2goe3R5cGU6byxkZWxheTp1LG1zZzpsfSl9ZWxzZSB0aGlzLnB1c2goe3R5cGU6byxkZWxheTp1LG1zZzpudWxsfSl9ZWxzZSB0aGlzLnB1c2gobnVsbCl9fSl9fTt2YXIgaXI9Y2xhc3N7fSxWPWNsYXNzIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IodD1uZXcgZ2UuUmVhZGFibGUoe29iamVjdE1vZGU6ITB9KSxuPW5ldyBnZS5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMH0pKXtzdXBlcigpO3RoaXMuaW5jb21pbmc9dCx0aGlzLm91dGdvaW5nPW4sdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2PW51bGx9c3RhdGljIGZyb21NZXNzYWdlcyh0KXtyZXR1cm4gbmV3IFYoZmUucHJvZHVjZXIodCksZmUuY29uc3VtZXIoKSl9Y29ubmVjdCh0KXtpZih0PT09bnVsbClyZXR1cm4gdGhpcztpZih0aGlzLm5leHQhPT1udWxsfHx0LnByZXYhPT1udWxsKXRocm93IG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZmFpbGVkOiBjb21wb25lbnQocykgYWxyZWFkeSBjb25uZWN0ZWRcIik7aWYoIXRoaXMuaW5jb21pbmcucmVhZGFibGV8fCF0aGlzLm91dGdvaW5nLndyaXRhYmxlKXRocm93IG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZmFpbGVkOiB0aGlzIGNvbXBvbmVudCBub3QgY29tcGF0aWJsZVwiKTtpZighdC5pbmNvbWluZy53cml0YWJsZXx8IXQub3V0Z29pbmcucmVhZGFibGUpdGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdGlvbiBmYWlsZWQ6IG5leHQgY29tcG9uZW50IG5vdCBjb21wYXRpYmxlXCIpO3RyeXt0aGlzLmluY29taW5nLnBpcGUodC5pbmNvbWluZyksdC5vdXRnb2luZy5waXBlKHRoaXMub3V0Z29pbmcpfWNhdGNoKG8pe3Rocm93IG5ldyBFcnJvcihgY29ubmVjdGlvbiBmYWlsZWQ6ICR7by5tZXNzYWdlfWApfWxldCBuPW89Pnt0aGlzLmluY29taW5nLmVtaXQoXCJlcnJvclwiLG8pfTt0LmluY29taW5nLm9uKFwiZXJyb3JcIixuKTtsZXQgaT1vPT57dC5vdXRnb2luZy5lbWl0KFwiZXJyb3JcIixvKX07cmV0dXJuIHRoaXMub3V0Z29pbmcub24oXCJlcnJvclwiLGkpLHRoaXMubmV4dD10LHQucHJldj10aGlzLHRoaXMuX2luY29taW5nRXJyb3JIYW5kbGVyPW4sdGhpcy5fb3V0Z29pbmdFcnJvckhhbmRsZXI9aSx0fWRpc2Nvbm5lY3QoKXtsZXQgdD10aGlzLm5leHQ7cmV0dXJuIHQhPT1udWxsJiYodGhpcy5pbmNvbWluZy51bnBpcGUodC5pbmNvbWluZyksdC5vdXRnb2luZy51bnBpcGUodGhpcy5vdXRnb2luZyksdHlwZW9mIHRoaXMuX2luY29taW5nRXJyb3JIYW5kbGVyPFwidVwiJiZ0LmluY29taW5nLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIix0aGlzLl9pbmNvbWluZ0Vycm9ySGFuZGxlciksdHlwZW9mIHRoaXMuX291dGdvaW5nRXJyb3JIYW5kbGVyPFwidVwiJiZ0aGlzLm91dGdvaW5nLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIix0aGlzLl9vdXRnb2luZ0Vycm9ySGFuZGxlciksdGhpcy5uZXh0PW51bGwsdC5wcmV2PW51bGwsZGVsZXRlIHRoaXMuX2luY29taW5nRXJyb3JIYW5kbGVyLGRlbGV0ZSB0aGlzLl9vdXRnb2luZ0Vycm9ySGFuZGxlciksdGhpc319LFI9Y2xhc3MgZXh0ZW5kcyBWe2NvbnN0cnVjdG9yKHQ9bmV3IGdlLlBhc3NUaHJvdWdoKHtvYmplY3RNb2RlOiEwfSksbj1uZXcgZ2UuUGFzc1Rocm91Z2goe29iamVjdE1vZGU6ITB9KSl7c3VwZXIodCxuKTt0aGlzLmluY29taW5nPXQsdGhpcy5vdXRnb2luZz1ufXN0YXRpYyBmcm9tSGFuZGxlcnModCxuKXtsZXQgaT10P2ZlLnBlZWtlcih0KTp2b2lkIDAsbz1uP2ZlLnBlZWtlcihuKTp2b2lkIDA7cmV0dXJuIG5ldyBSKGksbyl9fSxRPWNsYXNzIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IodD1uZXcgZ2UuV3JpdGFibGUoe29iamVjdE1vZGU6ITB9KSxuPW5ldyBnZS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMH0pKXtzdXBlcigpO3RoaXMuaW5jb21pbmc9dCx0aGlzLm91dGdvaW5nPW4sdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2PW51bGx9c3RhdGljIGZyb21IYW5kbGVyKHQpe2xldCBuPW5ldyBRKGZlLmNvbnN1bWVyKHQpLGZlLnByb2R1Y2VyKHZvaWQgMCkpO3JldHVybiBuLmluY29taW5nLm9uKFwiZmluaXNoXCIsKCk9PntuLm91dGdvaW5nLnB1c2gobnVsbCl9KSxufWNvbm5lY3QoKXt0aHJvdyBuZXcgRXJyb3IoXCJjb25uZWN0aW9uIGZhaWxlZDogYXR0ZW1wdGluZyB0byBjb25uZWN0IGFmdGVyIGEgc2lua1wiKX1kaXNjb25uZWN0KCl7cmV0dXJuIHRoaXN9fTtjKCk7YygpO2MoKTt2YXIgaXQ9WzEyOCw2NCwzMiwxNiw4LDQsMiwxXTt2YXIgWm89cj0+clswXT4+PjYsZXM9cj0+ISEoclswXSZpdFsyXSksb3I9cj0+ISEoclswXSZpdFszXSksU2U9cj0+clswXSYxNSxjZT1yPT4hIShyWzFdJml0WzBdKSxPPXI9PnJbMV0mMTI3LHRzPXI9PnIucmVhZFVJbnQxNkJFKDIpLEg9cj0+ci5yZWFkVUludDMyQkUoNCkscnM9cj0+ci5yZWFkVUludDMyQkUoOCksbnM9KHIsZT0wKT0+U2Uocik+ZT9yLnJlYWRVSW50MzJCRSgxMitlKjQpOjAsTXQ9cj0+b3Iocik/ci5yZWFkVUludDE2QkUoMTIrU2UocikqNCsyKTowLGlzPXI9Pk10KHIpPT09MD9CdWZmZXIuZnJvbShbXSk6ci5zbGljZSgxMitTZShyKSo0LDEyK1NlKHIpKjQrNCtNdChyKSo0KSxaPXI9Pm9yKHIpP3Iuc2xpY2UoMTIrU2UocikqNCs0K010KHIpKjQpOnIuc2xpY2UoMTIrU2UocikqNCk7YygpO3ZhciBJPShkPT4oZFtkLlVOS05PV049MF09XCJVTktOT1dOXCIsZFtkLlJBVz0xXT1cIlJBV1wiLGRbZC5SVFA9Ml09XCJSVFBcIixkW2QuUlRDUD0zXT1cIlJUQ1BcIixkW2QuUlRTUD00XT1cIlJUU1BcIixkW2QuU0RQPTVdPVwiU0RQXCIsZFtkLkVMRU1FTlRBUlk9Nl09XCJFTEVNRU5UQVJZXCIsZFtkLkgyNjQ9N109XCJIMjY0XCIsZFtkLklTT009OF09XCJJU09NXCIsZFtkLlhNTD05XT1cIlhNTFwiLGRbZC5KUEVHPTEwXT1cIkpQRUdcIixkKSkoSXx8e30pO2MoKTtmdW5jdGlvbiBvcyhyLGUsdCl7bGV0IG49WihyLmRhdGEpLGk9MDtpZihlKXtsZXQgcz1uLnJlYWRVSW50MTZCRSgwKTtpPTIrKHMrcyU4KS84fWxldCBvPXt0eXBlOjYsZGF0YTpuLnNsaWNlKGkpLHBheWxvYWRUeXBlOk8oci5kYXRhKSx0aW1lc3RhbXA6SChyLmRhdGEpLG50cFRpbWVzdGFtcDpyLm50cFRpbWVzdGFtcH07dChvKX1jKCk7dmFyIHNzPUMoTigpKSx5ZT1yPT5uZXcgc3MuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpyfSk7dmFyIG90PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQsbj15ZShmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09NSl7bGV0IGE7Zm9yKGxldCB1IG9mIGkuc2RwLm1lZGlhKXUudHlwZT09PVwiYXVkaW9cIiYmdS5mbXRwJiZ1LmZtdHAucGFyYW1ldGVycyYmdS5mbXRwLnBhcmFtZXRlcnMubW9kZT09PVwiQUFDLWhiclwiJiYoYT11KTtpZihhJiZhLnJ0cG1hcCE9PXZvaWQgMCl7ZT1OdW1iZXIoYS5ydHBtYXAucGF5bG9hZFR5cGUpO2xldCB1PWEuZm10cC5wYXJhbWV0ZXJzLGY9TnVtYmVyKHUuc2l6ZWxlbmd0aCl8fDAsbD1OdW1iZXIodS5pbmRleGxlbmd0aCl8fDAsZD1OdW1iZXIodS5pbmRleGRlbHRhbGVuZ3RoKXx8MCxoPU51bWJlcih1LmN0c2RlbHRhbGVuZ3RoKXx8MCxtPU51bWJlcih1LmR0c2RlbHRhbGVuZ3RoKXx8MCxiPU51bWJlcih1LnJhbmRvbWFjY2Vzc2luZGljYXRpb24pfHwwLHk9TnVtYmVyKHUuc3RyZWFtc3RhdGVpbmRpY2F0aW9uKXx8MCx3PU51bWJlcih1LmF1eGlsaWFyeWRhdGFzaXplbGVuZ3RoKXx8MDt0PWYrTWF0aC5tYXgobCxkKStoK20rYit5K3c+MH1zKHZvaWQgMCxpKX1lbHNlIGkudHlwZT09PTImJk8oaS5kYXRhKT09PWU/KG9zKGksdCx0aGlzLnB1c2guYmluZCh0aGlzKSkscygpKTpzKHZvaWQgMCxpKX0pO3N1cGVyKG4pfX07YygpO3ZhciBzcj1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoZSl7aWYoZT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJ5b3UgbXVzdCBzdXBwbHkgYSBwYXlsb2FkIHR5cGUgdG8gQmFzaWNEZXBheUNvbXBvbmVudFwiKTtsZXQgdD1CdWZmZXIuYWxsb2MoMCksbj15ZShmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09MiYmTyhpLmRhdGEpPT09ZSl7bGV0IGE9WihpLmRhdGEpO3Q9QnVmZmVyLmNvbmNhdChbdCxhXSksY2UoaS5kYXRhKSYmKHQubGVuZ3RoPjAmJnRoaXMucHVzaCh7ZGF0YTp0LHRpbWVzdGFtcDpIKGkuZGF0YSksbnRwVGltZXN0YW1wOmkubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oaS5kYXRhKSx0eXBlOjZ9KSx0PUJ1ZmZlci5hbGxvYygwKSkscygpfWVsc2Ugcyh2b2lkIDAsaSl9KTtzdXBlcihuKX19O2MoKTtjKCk7dmFyIGFyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5lbGFwc2VkPTAsdGhpcy5zdGFydGVkPTAsdGhpcy5zdG9wcGVkPSEwfXN0YXJ0KCl7dGhpcy5zdG9wcGVkJiYodGhpcy5zdGFydGVkPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSx0aGlzLnN0b3BwZWQ9ITEpfXN0b3AoKXt0aGlzLnN0b3BwZWR8fCh0aGlzLmVsYXBzZWQ9dGhpcy5ub3coKSx0aGlzLnN0b3BwZWQ9ITApfXJlc2V0KCl7dGhpcy5lbGFwc2VkPTAsdGhpcy5zdGFydGVkPTAsdGhpcy5zdG9wcGVkPSEwfW5vdygpe3JldHVybiB0aGlzLnN0b3BwZWQ/dGhpcy5lbGFwc2VkOnRoaXMuZWxhcHNlZCsod2luZG93LnBlcmZvcm1hbmNlLm5vdygpLXRoaXMuc3RhcnRlZCl9cGxheSgpe3RoaXMuc3RhcnQoKX1wYXVzZSgpe3RoaXMuc3RvcCgpfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLm5vdygpLzFlM319O2MoKTt2YXIgV2U9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG49MTApe3RoaXMuX2Nsb2NrPWUsdGhpcy5faGFuZGxlcj10LHRoaXMuX3RvbGVyYW5jZT1uLHRoaXMuX25leHRSdW49MCx0aGlzLl9uZXh0UGxheT0wLHRoaXMuX2ZpZm89W10sdGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZT0wLHRoaXMuX3N1c3BlbmRlZD0hMX1yZXNldCgpe2NsZWFyVGltZW91dCh0aGlzLl9uZXh0UnVuKSxjbGVhclRpbWVvdXQodGhpcy5fbmV4dFBsYXkpLHRoaXMuX2ZpZm89W10sdGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZT0wLHRoaXMuX3N1c3BlbmRlZD0hMX1pbml0KGUpe3RoaXMuX250cFByZXNlbnRhdGlvblRpbWU9ZX1zdXNwZW5kKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX25leHRQbGF5KSx0aGlzLl9zdXNwZW5kZWQ9ITB9cmVzdW1lKCl7dGhpcy5fc3VzcGVuZGVkPSExLHRoaXMucnVuKHZvaWQgMCl9cnVuKGUpe2lmKGNsZWFyVGltZW91dCh0aGlzLl9uZXh0UnVuKSx0eXBlb2YgdGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZT5cInVcInx8KHR5cGVvZiBlPFwidVwiJiZ0aGlzLl9maWZvLnB1c2goZSksdGhpcy5fc3VzcGVuZGVkKXx8dGhpcy5fZmlmby5sZW5ndGg9PT0wKXJldHVybjtsZXQgdD0wLG47ZG97bGV0IGk9dGhpcy5fZmlmby5zaGlmdCgpO2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiaW50ZXJuYWwgZXJyb3I6IG1lc3NhZ2Ugc2hvdWxkIG5ldmVyIGJlIHVuZGVmaW5lZFwiKTtuPWk7bGV0IG89bi5udHBUaW1lc3RhbXA7aWYobz09PXZvaWQgMCljb250aW51ZTt0PW8tdGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZS10aGlzLl9jbG9jay5jdXJyZW50VGltZSoxZTMsTWF0aC5hYnModCk8dGhpcy5fdG9sZXJhbmNlJiZ0aGlzLl9oYW5kbGVyJiZ0aGlzLl9oYW5kbGVyKG4pfXdoaWxlKHQ8dGhpcy5fdG9sZXJhbmNlJiZ0aGlzLl9maWZvLmxlbmd0aD4wKTt0PC10aGlzLl90b2xlcmFuY2U/KGNsZWFyVGltZW91dCh0aGlzLl9uZXh0UGxheSksdGhpcy5fY2xvY2sucGF1c2UoKSx0aGlzLl9uZXh0UGxheT13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fY2xvY2sucGxheSgpLC10KSk6dD50aGlzLl90b2xlcmFuY2UmJih0aGlzLl9maWZvLnVuc2hpZnQobiksdGhpcy5fbmV4dFJ1bj13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5ydW4odm9pZCAwKSx0KSl9fTt2YXIgdXI9QyhOKCkpLGFjPXI9PntyLmJpdHJhdGU9MCxyLmZyYW1lcmF0ZT0wLHIucmVuZGVyZWRGcmFtZXM9MH0sdWM9cj0+e2xldCBlPTAsdD0wLG49MDtyZXR1cm4oaSx7Ynl0ZUxlbmd0aDpvLGR1cmF0aW9uOnN9KT0+e2lmKGUrPW8sdCs9cyxuKyssdD49cil7bGV0IGE9OCplLHU9bixmPXQvcjtpLmJpdHJhdGU9YS9mLGkuZnJhbWVyYXRlPXUvZixlPTAsdD0wLG49MH19fSxzdD1jbGFzcyBleHRlbmRzIFF7Y29uc3RydWN0b3IodCl7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJjYW52YXMgZWxlbWVudCBhcmd1bWVudCBtaXNzaW5nXCIpO2xldCBuPTAsaT0wLG89MCxzPXtiaXRyYXRlOjAsZnJhbWVyYXRlOjAscmVuZGVyZWRGcmFtZXM6MH0sYSx1PW51bGw7d2luZG93LmNyZWF0ZUltYWdlQml0bWFwIT09dm9pZCAwJiYodT10LmdldENvbnRleHQoXCJiaXRtYXByZW5kZXJlclwiKSksdT09PW51bGwmJih1PXQuZ2V0Q29udGV4dChcIjJkXCIpKTtsZXQgZjtpZih1PT09bnVsbClmPSgpPT57fTtlbHNlIGlmKFwidHJhbnNmZXJGcm9tSW1hZ2VCaXRtYXBcImluIHUpe2xldCBfPXU7Zj0oe2Jsb2I6dn0pPT57cy5yZW5kZXJlZEZyYW1lcysrLHdpbmRvdy5jcmVhdGVJbWFnZUJpdG1hcCh2KS50aGVuKHE9PntfLnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKHEpfSkuY2F0Y2goKCk9Pnt9KX19ZWxzZXtsZXQgXz11LHY9bmV3IEltYWdlO3Yub25sb2FkPSgpPT57Xy5kcmF3SW1hZ2UodiwwLDApfSxmPSh7YmxvYjpxfSk9PntzLnJlbmRlcmVkRnJhbWVzKys7bGV0IEE9d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocSk7di5zcmM9QX19bGV0IGw9bmV3IGFyLGQ9bmV3IFdlKGwsZiksaD0wLG09KCk9Pnt0aGlzLm9uQ2FucGxheSYmdGhpcy5vbkNhbnBsYXkoKX0sYj1fPT57dGhpcy5vblN5bmMmJnRoaXMub25TeW5jKF8pfSx5PW5ldyB1ci5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMCx3cml0ZTooXyx2LHEpPT57aWYoXy50eXBlPT09NSl7bC5yZXNldCgpLGQucmVzZXQoKSxuPTA7bGV0IEE9Xy5zZHAubWVkaWEuZmluZChqPT5qLnR5cGU9PT1cInZpZGVvXCImJmoucnRwbWFwIT09dm9pZCAwJiZqLnJ0cG1hcC5lbmNvZGluZ05hbWU9PT1cIkpQRUdcIik7QSE9PXZvaWQgMCYmQS5ydHBtYXAhPT12b2lkIDAmJihvPUEucnRwbWFwLmNsb2NrcmF0ZSxhYyhzKSxhPXVjKG8pKSxxKCl9ZWxzZSBpZihfLnR5cGU9PT0xMCl7bGV0e3RpbWVzdGFtcDpBLG50cFRpbWVzdGFtcDpqfT1fO2lmKCFuKXtuPUEsaT1BO2xldHt3aWR0aDpJZSxoZWlnaHQ6QWV9PV8uZnJhbWVzaXplO3Qud2lkdGg9SWUsdC5oZWlnaHQ9QWUsZC5pbml0KDApfWxldCBZPTFlMyooQS1uKS9vLEdlPW5ldyB3aW5kb3cuQmxvYihbXy5kYXRhXSx7dHlwZTpcImltYWdlL2pwZWdcIn0pOyFoJiZqJiYoaD1qLVksYihoKSksZC5ydW4oe250cFRpbWVzdGFtcDpZLGJsb2I6R2V9KSxBPT09biYmbSgpLGEocyx7Ynl0ZUxlbmd0aDpfLmRhdGEubGVuZ3RoLGR1cmF0aW9uOkEtaX0pLGk9QSxxKCl9ZWxzZSBxKCl9fSksdz1uZXcgdXIuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZDpmdW5jdGlvbigpe319KTt3Lm9uKFwiZXJyb3JcIiwoKT0+e2NvbnNvbGUud2FybihcIm91dGdvaW5nIHN0cmVhbSBicm9rZSBzb21ld2hlcmVcIil9KTtzdXBlcih5LHcpO3RoaXMuX2Nsb2NrPWwsdGhpcy5fc2NoZWR1bGVyPWQsdGhpcy5faW5mbz1zLHRoaXMub25DYW5wbGF5PXZvaWQgMCx0aGlzLm9uU3luYz12b2lkIDB9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2Nsb2NrLmN1cnJlbnRUaW1lfXBhdXNlKCl7dGhpcy5fc2NoZWR1bGVyLnN1c3BlbmQoKSx0aGlzLl9jbG9jay5wYXVzZSgpfXBsYXkoKXt0aGlzLl9jbG9jay5wbGF5KCksdGhpcy5fc2NoZWR1bGVyLnJlc3VtZSgpfWdldCBiaXRyYXRlKCl7cmV0dXJuIHRoaXMuX2luZm8uYml0cmF0ZX1nZXQgZnJhbWVyYXRlKCl7cmV0dXJuIHRoaXMuX2luZm8uZnJhbWVyYXRlfX07YygpO3ZhciBkcz1DKE4oKSk7YygpO3ZhciBscz1DKGxlKCkpO3ZhciB3Yz0oMCxscy5kZWZhdWx0KShcIm1zbDpoMjY0ZGVwYXlcIiksbHI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApfXBhcnNlKGUpe2xldCB0PVooZS5kYXRhKSxuPXRbMF0mMzE7aWYobj09PTI4KXtsZXQgaT10WzBdLG89dFsxXSxzPSEhKG8+PjcpLGE9byYzMSx1PWkmMjI0fGEsZj1vJjY0O2lmKHMpcmV0dXJuIHRoaXMuX2J1ZmZlcj1CdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbMCwwLDAsMCx1XSksdC5zbGljZSgyKV0pLG51bGw7aWYoZil7bGV0IGw9QnVmZmVyLmNvbmNhdChbdGhpcy5fYnVmZmVyLHQuc2xpY2UoMildKTtsLndyaXRlVUludDMyQkUobC5sZW5ndGgtNCwwKTtsZXQgZD17ZGF0YTpsLHR5cGU6Nyx0aW1lc3RhbXA6SChlLmRhdGEpLG50cFRpbWVzdGFtcDplLm50cFRpbWVzdGFtcCxwYXlsb2FkVHlwZTpPKGUuZGF0YSksbmFsVHlwZTphfTtyZXR1cm4gdGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvYygwKSxkfWVsc2UgcmV0dXJuIHRoaXMuX2J1ZmZlcj1CdWZmZXIuY29uY2F0KFt0aGlzLl9idWZmZXIsdC5zbGljZSgyKV0pLG51bGx9ZWxzZSBpZigobj09PTF8fG49PT01KSYmdGhpcy5fYnVmZmVyLmxlbmd0aD09PTApe2xldCBpPUJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFswLDAsMCwwXSksdF0pO2kud3JpdGVVSW50MzJCRShpLmxlbmd0aC00LDApO2xldCBvPXtkYXRhOmksdHlwZTo3LHRpbWVzdGFtcDpIKGUuZGF0YSksbnRwVGltZXN0YW1wOmUubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oZS5kYXRhKSxuYWxUeXBlOm59O3JldHVybiB0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApLG99ZWxzZSByZXR1cm4gd2MoYEgyNjRkZXBheUNvbXBvbmVudCBjYW4gb25seSBleHRyYWN0IHR5cGVzIDEsNSBhbmQgMjgsIGdvdCAke259YCksdGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvYygwKSxudWxsfX07dmFyIGN0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQ9ITEsbj1bXSxpPW5ldyBscixvPW5ldyBkcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKHMsYSx1KXtpZihzLnR5cGU9PT01KXtsZXQgZj1zLnNkcC5tZWRpYS5maW5kKGw9PmwudHlwZT09PVwidmlkZW9cIiYmbC5ydHBtYXAhPT12b2lkIDAmJmwucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiSDI2NFwiKTtmIT09dm9pZCAwJiZmLnJ0cG1hcCE9PXZvaWQgMCYmKGU9Zi5ydHBtYXAucGF5bG9hZFR5cGUpLHUodm9pZCAwLHMpfWVsc2UgaWYocy50eXBlPT09MiYmTyhzLmRhdGEpPT09ZSl7bGV0IGY9Y2Uocy5kYXRhKSxsPWkucGFyc2Uocyk7aWYobD09PW51bGx8fCF0JiZsLm5hbFR5cGUhPT01KXt1KCk7cmV0dXJufXQ9ITAsbi5wdXNoKGwuZGF0YSksZiYmKHRoaXMucHVzaCh7Li4ubCxkYXRhOm4ubGVuZ3RoPT09MT9uWzBdOkJ1ZmZlci5jb25jYXQobil9KSxuPVtdKSx1KCl9ZWxzZSB1KHZvaWQgMCxzKX19KTtzdXBlcihvKX19O2MoKTt2YXIgcHM9QyhsZSgpKTt2YXIgaHM9QyhOKCkpO3ZhciBObj0oMCxwcy5kZWZhdWx0KShcIm1zbDpodHRwLXNvdXJjZVwiKSxkcj1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodCl7bGV0e3VyaTpuLG9wdGlvbnM6aX09dCxvPW5ldyBocy5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO28ub24oXCJlcnJvclwiLHM9Pntjb25zb2xlLndhcm4oXCJjbG9zaW5nIHNvY2tldCBkdWUgdG8gaW5jb21pbmcgZXJyb3JcIixzKSx0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKX0pO3N1cGVyKG8pO28uX3JlYWQ9KCk9Pnt0aGlzLl9wdWxsKCl9LHRoaXMudXJpPW4sdGhpcy5vcHRpb25zPWksdGhpcy5fYWxsRG9uZT0hMX1wbGF5KCl7aWYodGhpcy51cmk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHN0YXJ0IHBsYXlpbmcgd2hlbiB0aGVyZSBpcyBubyBVUklcIik7dGhpcy5fYWJvcnRDb250cm9sbGVyPW5ldyBBYm9ydENvbnRyb2xsZXIsdGhpcy5sZW5ndGg9MCxmZXRjaCh0aGlzLnVyaSx7Y3JlZGVudGlhbHM6XCJpbmNsdWRlXCIsc2lnbmFsOnRoaXMuX2Fib3J0Q29udHJvbGxlci5zaWduYWwsLi4udGhpcy5vcHRpb25zfSkudGhlbih0PT57aWYodC5ib2R5PT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJlbXB0eSByZXNwb25zZSBib2R5XCIpO3RoaXMub25IZWFkZXJzJiZ0aGlzLm9uSGVhZGVycyh0LmhlYWRlcnMpLHRoaXMuX3JlYWRlcj10LmJvZHkuZ2V0UmVhZGVyKCksdGhpcy5fcHVsbCgpfSkuY2F0Y2godD0+e2NvbnNvbGUuZXJyb3IoXCJodHRwLXNvdXJjZTogZmV0Y2ggZmFpbGVkOiBcIix0KX0pfWFib3J0KCl7dGhpcy5fcmVhZGVyJiZ0aGlzLl9yZWFkZXIuY2FuY2VsKCkuY2F0Y2godD0+e2NvbnNvbGUubG9nKFwiaHR0cC1zb3VyY2U6IGNhbmNlbCByZWFkZXIgZmFpbGVkOiBcIix0KX0pLHRoaXMuX2Fib3J0Q29udHJvbGxlciYmdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCl9X2lzQ2xvc2VkKCl7cmV0dXJuIHRoaXMuX2FsbERvbmV9X2Nsb3NlKCl7dGhpcy5fcmVhZGVyPXZvaWQgMCx0aGlzLl9hbGxEb25lPSEwLHRoaXMuaW5jb21pbmcucHVzaChudWxsKSx0aGlzLm9uU2VydmVyQ2xvc2U/LigpfV9wdWxsKCl7dGhpcy5fcmVhZGVyIT09dm9pZCAwJiZ0aGlzLl9yZWFkZXIucmVhZCgpLnRoZW4oKHtkb25lOnQsdmFsdWU6bn0pPT57aWYodCl7dGhpcy5faXNDbG9zZWQoKXx8KE5uKFwiZmV0Y2ggY29tcGxldGVkLCB0b3RhbCBkb3dubG9hZGVkOiBcIix0aGlzLmxlbmd0aCxcIiBieXRlc1wiKSx0aGlzLl9jbG9zZSgpKTtyZXR1cm59aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCB2YWx1ZSB0byBiZSBkZWZpbmVkXCIpO2lmKHRoaXMubGVuZ3RoPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIGxlbmd0aCB0byBiZSBkZWZpbmVkXCIpO3RoaXMubGVuZ3RoKz1uLmxlbmd0aDtsZXQgaT1CdWZmZXIuZnJvbShuKTt0aGlzLmluY29taW5nLnB1c2goe2RhdGE6aSx0eXBlOjF9KT90aGlzLl9wdWxsKCk6Tm4oXCJkb3duc3RyZWFtIGJhY2sgcHJlc3N1cmU6IHBhdXNpbmcgcmVhZFwiKX0pLmNhdGNoKHQ9PntObihcImh0dHAtc291cmNlOiByZWFkIGZhaWxlZDogXCIsdCksdGhpcy5faXNDbG9zZWQoKXx8dGhpcy5fY2xvc2UoKX0pfX07YygpO3ZhciBIbj1DKE4oKSksbXM9KHIsZSk9PntsZXQgdD1EYXRlLm5vdygpLG49aT0+e2xldCBvPURhdGUubm93KCk7Y29uc29sZS5sb2coYCR7cn06ICske28tdH1tc2AsaSksdD1vfTtyZXR1cm4gZT09PXZvaWQgMD9uOmk9PmkudHlwZT09PWUmJm4oaSl9LHByPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3RvcihlKXtsZXQgdD1tcyhcImluY29taW5nXCIsZSksbj1uZXcgSG4uVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihzLGEsdSl7dChzKSx1KHZvaWQgMCxzKX19KSxpPW1zKFwib3V0Z29pbmdcIixlKSxvPW5ldyBIbi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKHMsYSx1KXtpKHMpLHUodm9pZCAwLHMpfX0pO3N1cGVyKG4sbyl9fTtjKCk7YygpO2MoKTtmdW5jdGlvbiBTcygpe3JldHVybiBCdWZmZXIuZnJvbShbMjU1LDIxNl0pfWZ1bmN0aW9uIFJzKHIsZSl7bGV0IHQ9ciYxPzEyODo2NCxuPXImMj8xMjg6NjQ7aWYoZS5sZW5ndGghPT10K24pdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBxdWFudGl6YXRpb24gdGFibGVcIik7bGV0IGk9QnVmZmVyLmZyb20oWzI1NSwyMTksMCx0KzMsMF0pLG89QnVmZmVyLmZyb20oWzI1NSwyMTksMCxuKzMsMV0pO3JldHVybiBCdWZmZXIuY29uY2F0KFtpLGUuc2xpY2UoMCx0KSxvLGUuc2xpY2UodCldKX1mdW5jdGlvbiBUcyhyLGUsdCl7cmV0dXJuIEJ1ZmZlci5mcm9tKFsyNTUsMTkyLDAsMTcsOCxlPj44LGUscj4+OCxyLDMsMCx0PT09MD8zMzozNCwwLDEsMTcsMSwyLDE3LDFdKX12YXIgZ3M9WzAsMSw1LDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDBdLHlzPVswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExXSxicz1bMCwyLDEsMywzLDIsNCwzLDUsNSw0LDQsMCwwLDEsMTI1XSx4cz1bMSwyLDMsMCw0LDE3LDUsMTgsMzMsNDksNjUsNiwxOSw4MSw5Nyw3LDM0LDExMywyMCw1MCwxMjksMTQ1LDE2MSw4LDM1LDY2LDE3NywxOTMsMjEsODIsMjA5LDI0MCwzNiw1MSw5OCwxMTQsMTMwLDksMTAsMjIsMjMsMjQsMjUsMjYsMzcsMzgsMzksNDAsNDEsNDIsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsODMsODQsODUsODYsODcsODgsODksOTAsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwXSxfcz1bMCwzLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMF0sd3M9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLHZzPVswLDIsMSwyLDQsNCwzLDQsNyw1LDQsNCwwLDEsMiwxMTldLEVzPVswLDEsMiwzLDE3LDQsNSwzMyw0OSw2LDE4LDY1LDgxLDcsOTcsMTEzLDE5LDM0LDUwLDEyOSw4LDIwLDY2LDE0NSwxNjEsMTc3LDE5Myw5LDM1LDUxLDgyLDI0MCwyMSw5OCwxMTQsMjA5LDEwLDIyLDM2LDUyLDIyNSwzNywyNDEsMjMsMjQsMjUsMjYsMzgsMzksNDAsNDEsNDIsNTMsNTQsNTUsNTYsNTcsNTgsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsODMsODQsODUsODYsODcsODgsODksOTAsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTBdO2Z1bmN0aW9uIENzKCl7bGV0IHI9W1syNTUsMTk2LDAsMytncy5sZW5ndGgreXMubGVuZ3RoLDBdLGdzLHlzXSxlPVtbMjU1LDE5NiwwLDMrYnMubGVuZ3RoK3hzLmxlbmd0aCwxPDw0fDBdLGJzLHhzXSx0PVtbMjU1LDE5NiwwLDMrX3MubGVuZ3RoK3dzLmxlbmd0aCwwPDw0fDFdLF9zLHdzXSxuPVtbMjU1LDE5NiwwLDMrdnMubGVuZ3RoK0VzLmxlbmd0aCwxPDw0fDFdLHZzLEVzXTtyZXR1cm4gQnVmZmVyLmNvbmNhdChbLi4uci5tYXAoQnVmZmVyLmZyb20pLC4uLmUubWFwKEJ1ZmZlci5mcm9tKSwuLi50Lm1hcChCdWZmZXIuZnJvbSksLi4ubi5tYXAoQnVmZmVyLmZyb20pXSl9ZnVuY3Rpb24gQnMoKXtyZXR1cm4gQnVmZmVyLmZyb20oWzI1NSwyMTgsMCwxMiwzLDAsMCwxLDE3LDIsMTcsMCw2MywwXSl9ZnVuY3Rpb24gTXMocil7cmV0dXJuIEJ1ZmZlci5mcm9tKFsyNTUsMjIxLDAsNCxyPj44LHImMjU1XSl9YygpO2MoKTtmdW5jdGlvbiBocihyLGUsdCl7cmV0dXJuIHI+dD90OnI8ZT9lOnJ9dmFyIEVjPVsxNiwxMSwxMiwxNCwxMiwxMCwxNiwxNCwxMywxNCwxOCwxNywxNiwxOSwyNCw0MCwyNiwyNCwyMiwyMiwyNCw0OSwzNSwzNywyOSw0MCw1OCw1MSw2MSw2MCw1Nyw1MSw1Niw1NSw2NCw3Miw5Miw3OCw2NCw2OCw4Nyw2OSw1NSw1Niw4MCwxMDksODEsODcsOTUsOTgsMTAzLDEwNCwxMDMsNjIsNzcsMTEzLDEyMSwxMTIsMTAwLDEyMCw5MiwxMDEsMTAzLDk5XSxTYz1bMTcsMTgsMTgsMjQsMjEsMjQsNDcsMjYsMjYsNDcsOTksNjYsNTYsNjYsOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTldO2Z1bmN0aW9uIExzKHIpe2xldCBlPWhyKHIsMSw5OSksdD1CdWZmZXIuYWxsb2MoMTI4KSxuPXI8NTA/TWF0aC5mbG9vcig1ZTMvZSk6MjAwLWUqMjtmb3IobGV0IGk9MDtpPDY0O2krKyl7bGV0IG89TWF0aC5mbG9vcigoRWNbaV0qbis1MCkvMTAwKSxzPU1hdGguZmxvb3IoKFNjW2ldKm4rNTApLzEwMCk7dC53cml0ZVVJbnQ4KGhyKG8sMSwyNTUpLGkpLHQud3JpdGVVSW50OChocihzLDEsMjU1KSxpKzY0KX1yZXR1cm4gdH1mdW5jdGlvbiBxbihyPTAsZT0wKXtsZXQgdD1TcygpLG49Q3MoKSxpPUJzKCk7cmV0dXJuIGZ1bmN0aW9uKHMpe2xldCBhLHU9W107Zm9yKGxldCBfIG9mIHMpe2xldCB2PVooXykscT12LnJlYWRVSW50OCgwKSxBPXYucmVhZFVJbnQ4KDEpPDwxNnx2LnJlYWRVSW50OCgyKTw8OHx2LnJlYWRVSW50OCgzKSxqPXYucmVhZFVJbnQ4KDQpLFk9di5yZWFkVUludDgoNSksR2U9di5yZWFkVUludDgoNikqOHx8cixJZT12LnJlYWRVSW50OCg3KSo4fHxlO3Y9di5zbGljZSg4KTtsZXQgQWU9MDtpZihqPj02NCYmajw9MTI3JiYoQWU9di5yZWFkVUludDE2QkUoMCksdj12LnNsaWNlKDQpKSxZPj0xMjgmJkE9PT0wKXtsZXQgb2k9di5yZWFkVUludDgoMSksQXQ9di5yZWFkVUludDE2QkUoMiksdWE9di5zbGljZSg0LDQrQXQpO2E9e3R5cGVTcGVjaWZpYzpxLHR5cGU6aix3aWR0aDpHZSxoZWlnaHQ6SWUsRFJJOkFlLHByZWNpc2lvbjpvaSxxVGFibGU6dWF9LHY9di5zbGljZSg0K0F0KX1lbHNlIGlmKFk8MTI4JiZBPT09MCl7bGV0IEF0PUxzKFkpO2E9e3R5cGVTcGVjaWZpYzpxLHR5cGU6aix3aWR0aDpHZSxoZWlnaHQ6SWUsRFJJOkFlLHByZWNpc2lvbjowLHFUYWJsZTpBdH19dS5wdXNoKHYpfWlmKGE9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibm8gcXVhbnRpemF0aW9uIGhlYWRlciBwcmVzZW50XCIpO2xldHtwcmVjaXNpb246ZixxVGFibGU6bCx0eXBlOmQsd2lkdGg6aCxoZWlnaHQ6bX09YSxiPVJzKGYsbCkseT1hLkRSST09PTA/QnVmZmVyLmFsbG9jKDApOk1zKGEuRFJJKSx3PVRzKGgsbSxkKTtyZXR1cm57c2l6ZTp7d2lkdGg6aCxoZWlnaHQ6bX0sZGF0YTpCdWZmZXIuY29uY2F0KFt0LGIseSx3LG4saSwuLi51XSl9fX12YXIgSXM9QyhOKCkpO3ZhciBsdD1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtsZXQgZSx0PVtdLG4saT1uZXcgSXMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihvLHMsYSl7aWYoby50eXBlPT09NSl7bGV0IHU9by5zZHAubWVkaWEuZmluZChmPT5mLnR5cGU9PT1cInZpZGVvXCImJmYucnRwbWFwIT09dm9pZCAwJiZmLnJ0cG1hcC5lbmNvZGluZ05hbWU9PT1cIkpQRUdcIik7aWYodSE9PXZvaWQgMCYmdS5ydHBtYXAhPT12b2lkIDApe2U9TnVtYmVyKHUucnRwbWFwLnBheWxvYWRUeXBlKTtsZXQgZj11LmZyYW1lc2l6ZTtpZihmIT09dm9pZCAwKXtsZXRbbCxkXT1mO249cW4obCxkKX1lbHNlIG49cW4oKX1hKHZvaWQgMCxvKX1lbHNlIGlmKG8udHlwZT09PTImJk8oby5kYXRhKT09PWUpe2lmKHQucHVzaChvLmRhdGEpLGNlKG8uZGF0YSkmJnQubGVuZ3RoPjApe2xldCB1PW4odCk7dGhpcy5wdXNoKHt0aW1lc3RhbXA6SChvLmRhdGEpLG50cFRpbWVzdGFtcDpvLm50cFRpbWVzdGFtcCxwYXlsb2FkVHlwZTpPKG8uZGF0YSksZGF0YTp1LmRhdGEsZnJhbWVzaXplOnUuc2l6ZSx0eXBlOjEwfSksdD1bXX1hKCl9ZWxzZSBhKHZvaWQgMCxvKX19KTtzdXBlcihpKX19O2MoKTt2YXIgam49QyhsZSgpKTt2YXIgQXM9QyhOKCkpO3ZhciBSYz0yMjVlNixtcj1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IodD1SYyl7bGV0IG49bmV3IEFzLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06KGksbyxzKT0+e3RoaXMuX2FjdGl2ZSYmaS50eXBlPT09OCYmaS50cmFja3MhPT12b2lkIDAmJih0aGlzLl9jYXB0dXJlPSEwKSx0aGlzLl9jYXB0dXJlJiZpLnR5cGU9PT04JiYodGhpcy5fYnVmZmVyT2Zmc2V0PHRoaXMuX2J1ZmZlci5ieXRlTGVuZ3RoLWkuZGF0YS5ieXRlTGVuZ3RoPyhpLmRhdGEuY29weSh0aGlzLl9idWZmZXIsdGhpcy5fYnVmZmVyT2Zmc2V0KSx0aGlzLl9idWZmZXJPZmZzZXQrPWkuZGF0YS5ieXRlTGVuZ3RoKTp0aGlzLnN0b3AoKSkscyh2b2lkIDAsaSl9fSk7bi5vbihcImZpbmlzaFwiLCgpPT57dGhpcy5zdG9wKCl9KTtzdXBlcihuKTt0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKDApLHRoaXMuX2J1ZmZlclNpemU9dCx0aGlzLl9idWZmZXJPZmZzZXQ9MCx0aGlzLl9hY3RpdmU9ITEsdGhpcy5fY2FwdHVyZT0hMSx0aGlzLl9jYXB0dXJlQ2FsbGJhY2s9KCk9Pnt9fXN0YXJ0KHQpe3RoaXMuX2FjdGl2ZXx8KCgwLGpuLmRlZmF1bHQpKFwibXNsOmNhcHR1cmU6c3RhcnRcIikodCksdGhpcy5fY2FwdHVyZUNhbGxiYWNrPXQsdGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvY1Vuc2FmZSh0aGlzLl9idWZmZXJTaXplKSx0aGlzLl9idWZmZXJPZmZzZXQ9MCx0aGlzLl9hY3RpdmU9ITApfXN0b3AoKXtpZih0aGlzLl9hY3RpdmUpeygwLGpuLmRlZmF1bHQpKFwibXNsOmNhcHR1cmU6c3RvcFwiKShgY2FwdHVyZWQgYnl0ZXM6ICR7dGhpcy5fYnVmZmVyT2Zmc2V0fWApO3RyeXt0aGlzLl9jYXB0dXJlQ2FsbGJhY2sodGhpcy5fYnVmZmVyLnNsaWNlKDAsdGhpcy5fYnVmZmVyT2Zmc2V0KSl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcih0KX10aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKDApLHRoaXMuX2J1ZmZlck9mZnNldD0wLHRoaXMuX2FjdGl2ZT0hMSx0aGlzLl9jYXB0dXJlPSExfX19O2MoKTt2YXIgWW49QyhsZSgpKTtjKCk7dmFyIFduPU1hdGgucG93KDIsMzIpLCQ9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5ieXRlTGVuZ3RoPWV9fSx0ZT1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcih0KTt0aGlzLmNvcHk9KHQsbik9Pnt0LmZpbGwoMCxuLG4rdGhpcy5ieXRlTGVuZ3RoKX19bG9hZCgpe319LFJlPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0Lmxlbmd0aCk7dGhpcy5jb3B5PSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLmJ5dGVMZW5ndGg7aSs9MSl0W24raV09dGhpcy52YWx1ZS5jaGFyQ29kZUF0KGkpfTt0aGlzLmxvYWQ9KHQsbik9Pnt0aGlzLnZhbHVlPXQuc2xpY2UobixuK3RoaXMuYnl0ZUxlbmd0aCkudG9TdHJpbmcoXCJhc2NpaVwiKX07dGhpcy52YWx1ZT10fX0saz1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcigxKTt0aGlzLmNvcHk9KHQsbik9Pnt0LndyaXRlVUludDgodGhpcy52YWx1ZSxuKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50OChuKX07dGhpcy52YWx1ZT10fX0sTHQ9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKTt0aGlzLmNvcHk9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0LndyaXRlVUludDgodGhpcy52YWx1ZVtpXSxuK2kpfTt0aGlzLmxvYWQ9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0aGlzLnZhbHVlW2ldPXQucmVhZFVJbnQ4KG4raSl9O3RoaXMudmFsdWU9dH19LEw9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIoMik7dGhpcy5jb3B5PSh0LG4pPT57dC53cml0ZVVJbnQxNkJFKHRoaXMudmFsdWUsbil9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5yZWFkVUludDE2QkUobil9O3RoaXMudmFsdWU9dH19LCRuPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDMpO3RoaXMuY29weT0odCxuKT0+e3Qud3JpdGVVSW50OCh0aGlzLnZhbHVlPj4xNiYyNTUsbiksdC53cml0ZVVJbnQ4KHRoaXMudmFsdWU+PjgmMjU1LG4rMSksdC53cml0ZVVJbnQ4KHRoaXMudmFsdWUmMjU1LG4rMil9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5yZWFkVUludDgobik8PDE2K3QucmVhZFVJbnQ4KG4rMSk8PDgrdC5yZWFkVUludDgobisyKX07dGhpcy52YWx1ZT10fX0sR249Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKjIpO3RoaXMuY29weT0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXQud3JpdGVVSW50MTZCRSh0aGlzLnZhbHVlW2ldLG4rMippKX07dGhpcy5sb2FkPSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdGhpcy52YWx1ZVtpXT10LnJlYWRVSW50MTZCRShuKzIqaSl9O3RoaXMudmFsdWU9dH19LGc9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIoNCk7dGhpcy5jb3B5PSh0LG4pPT57dC53cml0ZVVJbnQzMkJFKHRoaXMudmFsdWUsbil9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5yZWFkVUludDMyQkUobil9O3RoaXMudmFsdWU9dH19LGR0PWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0Lmxlbmd0aCo0KTt0aGlzLmNvcHk9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0LndyaXRlVUludDMyQkUodGhpcy52YWx1ZVtpXSxuKzQqaSl9O3RoaXMubG9hZD0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXRoaXMudmFsdWVbaV09dC5yZWFkVUludDMyQkUobis0KmkpfTt0aGlzLnZhbHVlPXR9fSxWbj1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcig4KTt0aGlzLmNvcHk9KHQsbik9PntsZXQgaT10aGlzLnZhbHVlL1dufDAsbz10aGlzLnZhbHVlLWkqV247dC53cml0ZVVJbnQzMkJFKGksbiksdC53cml0ZVVJbnQzMkJFKG8sbis0KX07dGhpcy5sb2FkPSh0LG4pPT57bGV0IGk9dC5yZWFkVUludDMyQkUobiksbz10LnJlYWRVSW50MzJCRShuKzQpO3RoaXMudmFsdWU9aSpXbitvfTt0aGlzLnZhbHVlPXR9fSxGcz1mdW5jdGlvbihyPTApe3JldHVybiBjbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3Iobil7c3VwZXIoMCk7dGhpcy5jb3B5PShuLGkpPT57bGV0IG89MDtmb3IobGV0IHMgb2YgdGhpcy52YWx1ZSlzLmNvcHkobixpK28pLG8rPXMuYnl0ZUxlbmd0aH07dGhpcy5sb2FkPSgpPT57fTt0aGlzLnZhbHVlPW4ucmVkdWNlKChpLG8pPT5pLmNvbmNhdChuZXcgTChvLmxlbmd0aCksbmV3IEx0KG8pKSxbbmV3IGsocnxuLmxlbmd0aCldKSx0aGlzLmJ5dGVMZW5ndGg9dGhpcy52YWx1ZS5yZWR1Y2UoKGksbyk9Pmkrby5ieXRlTGVuZ3RoLDApfX19LFBzPXtmdHlwOntjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcIm1ham9yX2JyYW5kXCIsUmUsXCJpc29tXCJdLFtcIm1pbm9yX3ZlcnNpb25cIixnLDBdLFtcImNvbXBhdGlibGVfYnJhbmRzXCIsUmUsXCJtcDQxXCJdXX0sbW9vdjp7Y29udGFpbmVyOlwiZmlsZVwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sbWRhdDp7Y29udGFpbmVyOlwiZmlsZVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcImFueVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltdfSxtdmhkOntjb250YWluZXI6XCJtb292XCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJjcmVhdGlvbl90aW1lXCIsZywwXSxbXCJtb2RpZmljYXRpb25fdGltZVwiLGcsMF0sW1widGltZXNjYWxlXCIsZywxZTNdLFtcImR1cmF0aW9uXCIsZyw0Mjk0OTY3Mjk1XSxbXCJyYXRlXCIsZyw2NTUzNl0sW1widm9sdW1lXCIsTCwyNTZdLFtcInJlc2VydmVkXCIsdGUsMTBdLFtcIm1hdHJpeFwiLGR0LFs2NTUzNiwwLDAsMCw2NTUzNiwwLDAsMCwxMDczNzQxODI0XV0sW1wicHJlX2RlZmluZWRcIix0ZSwyNF0sW1wibmV4dF90cmFja19JRFwiLGcsNDI5NDk2NzI5NV1dfSx0cmFrOntjb250YWluZXI6XCJtb292XCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lK1wiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sdGtoZDp7Y29udGFpbmVyOlwidHJha1wiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczozfSxib2R5OltbXCJjcmVhdGlvbl90aW1lXCIsZywwXSxbXCJtb2RpZmljYXRpb25fdGltZVwiLGcsMF0sW1widHJhY2tfSURcIixnLDFdLFtcInJlc2VydmVkXCIsdGUsNF0sW1wiZHVyYXRpb25cIixnLDBdLFtcInJlc2VydmVkMlwiLHRlLDhdLFtcImxheWVyXCIsTCwwXSxbXCJhbHRlcm5hdGVfZ3JvdXBcIixMLDBdLFtcInZvbHVtZVwiLEwsMjU2XSxbXCJyZXNlcnZlZDNcIix0ZSwyXSxbXCJtYXRyaXhcIixkdCxbNjU1MzYsMCwwLDAsNjU1MzYsMCwwLDAsMTA3Mzc0MTgyNF1dLFtcIndpZHRoXCIsZywwXSxbXCJoZWlnaHRcIixnLDBdXX0sdHJlZjp7Y29udGFpbmVyOlwidHJha1wiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITF9LG1kaWE6e2NvbnRhaW5lcjpcInRyYWtcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LG1kaGQ6e2NvbnRhaW5lcjpcIm1kaWFcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImNyZWF0aW9uX3RpbWVcIixnLDBdLFtcIm1vZGlmaWNhdGlvbl90aW1lXCIsZywwXSxbXCJ0aW1lc2NhbGVcIixnLDFlM10sW1wiZHVyYXRpb25cIixnLDQyOTQ5NjcyOTVdLFtcImxhbmd1YWdlXCIsTCwwXSxbXCJwcmVfZGVmaW5lZFwiLEwsMF1dfSxoZGxyOntjb250YWluZXI6XCJtZGlhXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJwcmVkZWZpbmVkXCIsZywwXSxbXCJoYW5kbGVyX3R5cGVcIixSZSxcInZpZGVcIl0sW1wicmVzZXJ2ZWRcIix0ZSwxMl0sW1wibmFtZVwiLFJlLFwiVmlkZW9IYW5kbGVyXFwwXCJdXX0sbWluZjp7Y29udGFpbmVyOlwibWRpYVwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sdm1oZDp7Y29udGFpbmVyOlwibWluZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczoxfSxib2R5OltbXCJncmFwaGljc21vZGVcIixMLDBdLFtcIm9wY29sb3JcIixHbixbMCwwLDBdXV19LHNtaGQ6e2NvbnRhaW5lcjpcIm1pbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImJhbGFuY2VcIixMLDBdLFtcInJlc2VydmVkXCIsTF1dfSxkaW5mOntjb250YWluZXI6XCJtaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxkcmVmOntjb250YWluZXI6XCJkaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMF1dfSxcInVybCBcIjp7Y29udGFpbmVyOlwiZHJlZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZStcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7ZmxhZ3M6MX0sYm9keTpbXX0sc3RibDp7Y29udGFpbmVyOlwibWluZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sc3R0czp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sc3RzZDp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITAsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDFdXX0sYXZjMTp7Y29udGFpbmVyOlwic3RzZFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJyZXNlcnZlZFwiLHRlLDZdLFtcImRhdGFfcmVmZXJlbmNlX2luZGV4XCIsTCwxXSxbXCJwcmVfZGVmaW5lZFwiLEwsMF0sW1wicmVzZXJ2ZWQyXCIsdGUsMl0sW1wicHJlX2RlZmluZWQyXCIsZHQsWzAsMCwwXV0sW1wid2lkdGhcIixMLDE5MjBdLFtcImhlaWdodFwiLEwsMTA4MF0sW1wiaG9yaXpyZXNvbHV0aW9uXCIsZyw0NzE4NTkyXSxbXCJ2ZXJ0cmVzb2x1dGlvblwiLGcsNDcxODU5Ml0sW1wicmVzZXJ2ZWQzXCIsZywwXSxbXCJmcmFtZV9jb3VudFwiLEwsMV0sW1wiY29tcHJlc3Nvcm5hbWVcIixMdCxCdWZmZXIuYWxsb2MoMzIpXSxbXCJkZXB0aFwiLEwsMjRdLFtcInByZV9kZWZpbmVkM1wiLEwsNjU1MzVdXX0sYXZjQzp7Y29udGFpbmVyOlwiYXZjMVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJjb25maWd1cmF0aW9uVmVyc2lvblwiLGssMV0sW1wiQVZDUHJvZmlsZUluZGljYXRpb25cIixrLDc3XSxbXCJwcm9maWxlX2NvbXBhdGliaWxpdHlcIixrLDBdLFtcIkFWQ0xldmVsSW5kaWNhdGlvblwiLGssNDFdLFtcImxlbmd0aFNpemVNaW51c09uZVwiLGssMjU1XSxbXCJzZXF1ZW5jZVBhcmFtZXRlclNldHNcIixGcygyMjQpLFtdXSxbXCJwaWN0dXJlUGFyYW1ldGVyU2V0c1wiLEZzKCksW11dXX0sbXA0YTp7Y29udGFpbmVyOlwic3RzZFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJyZXNlcnZlZFwiLHRlLDZdLFtcImRhdGFfcmVmZXJlbmNlX2luZGV4XCIsTCwxXSxbXCJyZXNlcnZlZDJcIixkdCxbMCwwXV0sW1wiY2hhbm5lbGNvdW50XCIsTCwyXSxbXCJzYW1wbGVzaXplXCIsTCwxNl0sW1wicHJlX2RlZmluZWRcIixMLDBdLFtcInJlc2VydmVkM1wiLEwsMF0sW1wic2FtcGxlcmF0ZVwiLGcsMF1dfSxlc2RzOntjb250YWluZXI6XCJtcDRhXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJFU19EZXNjclRhZ1wiLGssM10sW1wiRVNfRGVzY3JMZW5ndGhcIixrLDI1XSxbXCJFU19JRFwiLEwsMV0sW1wiZmxhZ3NBbmRTdHJlYW1Qcmlvcml0eVwiLGssMF0sW1wiRGVjb2RlckNvbmZpZ0Rlc2NyVGFnXCIsayw0XSxbXCJEZWNvZGVyQ29uZmlnRGVzY3JMZW5ndGhcIixrLDE3XSxbXCJvYmplY3RQcm9maWxlSW5kaWNhdGlvblwiLGssNjRdLFtcInN0cmVhbVR5cGVVcHN0cmVhbVJlc2VydmVkXCIsaywyMV0sW1wiYnVmZmVyU2l6ZURCXCIsTHQsWzAsMCwwXV0sW1wibWF4Qml0UmF0ZVwiLGcsMF0sW1wiYXZnQml0UmF0ZVwiLGcsMF0sW1wiRGVjU3BlY2lmaWNJbmZvU2hvcnRUYWdcIixrLDVdLFtcIkRlY1NwZWNpZmljSW5mb1Nob3J0TGVuZ3RoXCIsaywyXSxbXCJhdWRpb0NvbmZpZ0J5dGVzXCIsTCwwXSxbXCJTTENvbmZpZ0Rlc2NyVGFnXCIsayw2XSxbXCJTTENvbmZpZ0Rlc2NyTGVuZ3RoXCIsaywxXSxbXCJTTENvbmZpZ0Rlc2NyUHJlZGVmaW5lZFwiLGssMl1dfSxzdHN6Ontjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJzYW1wbGVfc2l6ZVwiLGcsMF0sW1wic2FtcGxlX2NvdW50XCIsZywwXV19LHN0c2M6e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LHN0Y286e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LHN0c3M6e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMF1dfSxlZHRzOntjb250YWluZXI6XCJ0cmFrXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sZWxzdDp7Y29udGFpbmVyOlwiZWR0c1wiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywxXSxbXCJzZWdtZW50X2R1cmF0aW9uXCIsZywwXSxbXCJtZWRpYV90aW1lXCIsZyw0Mjk0OTY3Mjk1XSxbXCJtZWRpYV9yYXRlX2ludGVnZXJcIixMLDFdLFtcIm1lZGlhX3JhdGVfZnJhY3Rpb25cIixMLDBdXX0sbXZleDp7Y29udGFpbmVyOlwibW9vdlwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LG1laGQ6e2NvbnRhaW5lcjpcIm12ZXhcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJmcmFnbWVudF9kdXJhdGlvblwiLGcsMF1dfSx0cmV4Ontjb250YWluZXI6XCJtdmV4XCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lK1wiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1widHJhY2tfSURcIixnLDFdLFtcImRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4XCIsZywxXSxbXCJkZWZhdWx0X3NhbXBsZV9kdXJhdGlvblwiLGcsMF0sW1wiZGVmYXVsdF9zYW1wbGVfc2l6ZVwiLGcsMF0sW1wiZGVmYXVsdF9zYW1wbGVfZmxhZ3NcIixnLDBdXX0sbW9vZjp7Y29udGFpbmVyOlwiZmlsZVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcInplcm8rXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiExfSxtZmhkOntjb250YWluZXI6XCJtb29mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJzZXF1ZW5jZV9udW1iZXJcIixnLDBdXX0sdHJhZjp7Y29udGFpbmVyOlwibW9vZlwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcInplcm8rXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSx0ZmhkOntjb250YWluZXI6XCJ0cmFmXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjMyfSxib2R5OltbXCJ0cmFja19JRFwiLGcsMV0sW1wiZGVmYXVsdF9zYW1wbGVfZmxhZ3NcIixnLDBdXX0sdGZkdDp7Y29udGFpbmVyOlwidHJhZlwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7dmVyc2lvbjoxfSxib2R5OltbXCJiYXNlTWVkaWFEZWNvZGVUaW1lXCIsVm4sMF1dfSx0cnVuOntjb250YWluZXI6XCJ0cmFmXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiemVybytcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7ZmxhZ3M6NzczfSxib2R5OltbXCJzYW1wbGVfY291bnRcIixnLDFdLFtcImRhdGFfb2Zmc2V0XCIsZywwXSxbXCJmaXJzdF9zYW1wbGVfZmxhZ3NcIixnLDBdLFtcInNhbXBsZV9kdXJhdGlvblwiLGcsMF0sW1wic2FtcGxlX3NpemVcIixnLDBdXX0sXCIuLi4uXCI6e2JveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltdfSxmaWxlOntib3g6XCJOb25lXCIsaXNfY29udGFpbmVyOiEwLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwifX0sem49Y2xhc3N7c3RhdGljIE5vbmUoKXtyZXR1cm5bXX1zdGF0aWMgQm94KGUpe3JldHVybltbXCJzaXplXCIsZywwXSxbXCJ0eXBlXCIsUmUsZV1dfXN0YXRpYyBGdWxsQm94KGUpe3JldHVybltdLmNvbmNhdCh0aGlzLkJveChlKSxbW1widmVyc2lvblwiLGssMF0sW1wiZmxhZ3NcIiwkbiwwXV0pfX0sVD1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCxuKXtzdXBlcigwKTt0aGlzLnR5cGU9dDtsZXQgaT1Qc1t0aGlzLnR5cGVdO2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIGJveCB0eXBlOiAke3R9YCk7dGhpcy5jb25maWc9T2JqZWN0LmFzc2lnbih7fSxpLmNvbmZpZyxuKTtsZXQgbz16bltpLmJveF0odGhpcy50eXBlKSxzPWkuYm9keXx8W107dGhpcy5zdHJ1Y3Q9bmV3IE1hcDtsZXQgYT0wO2ZvcihsZXRbdSxmLGxdb2ZbXS5jb25jYXQobyxzKSl7aWYodGhpcy5oYXModSkpdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIGFkZCBleGlzdGluZyBrZXlcIik7bGV0IGQ9bDt0aGlzLmNvbmZpZ1t1XSYmKGQ9dGhpcy5jb25maWdbdV0pO2xldCBoPW5ldyBmKGQpO3RoaXMuc3RydWN0LnNldCh1LHtvZmZzZXQ6YSxlbGVtZW50Omh9KSxhKz1oLmJ5dGVMZW5ndGh9dGhpcy5ieXRlTGVuZ3RoPWF9ZWxlbWVudCh0KXtsZXQgbj10aGlzLnN0cnVjdC5nZXQodCk7aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGtleVwiKTtyZXR1cm4gbi5lbGVtZW50fXNldCh0LG4pe3RoaXMuZWxlbWVudCh0KS52YWx1ZT1ufWdldCh0KXtyZXR1cm4gdGhpcy5lbGVtZW50KHQpLnZhbHVlfW9mZnNldCh0KXtsZXQgbj10aGlzLnN0cnVjdC5nZXQodCk7aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGtleVwiKTtyZXR1cm4gbi5vZmZzZXR9aGFzKHQpe3JldHVybiB0aGlzLnN0cnVjdC5oYXModCl9YWRkKHQsbil7aWYodGhpcy5oYXModCkpdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIGFkZCBleGlzdGluZyBrZXlcIik7cmV0dXJuIHRoaXMuc3RydWN0LnNldCh0LHtvZmZzZXQ6dGhpcy5ieXRlTGVuZ3RoLGVsZW1lbnQ6bn0pLHRoaXMuYnl0ZUxlbmd0aCs9bi5ieXRlTGVuZ3RoLHRoaXN9YnVmZmVyKCl7bGV0IHQ9QnVmZmVyLmFsbG9jVW5zYWZlKHRoaXMuYnl0ZUxlbmd0aCk7cmV0dXJuIHRoaXMuY29weSh0KSx0fWNvcHkodCxuPTApe3RoaXMuc2V0KFwic2l6ZVwiLHRoaXMuYnl0ZUxlbmd0aCk7Zm9yKGxldCBpIG9mIHRoaXMuc3RydWN0LnZhbHVlcygpKWkuZWxlbWVudC5jb3B5KHQsbitpLm9mZnNldCl9bG9hZCh0LG49MCl7Zm9yKGxldCBpIG9mIHRoaXMuc3RydWN0LnZhbHVlcygpKWkuZWxlbWVudC5sb2FkIT09dm9pZCAwJiZpLmVsZW1lbnQubG9hZCh0LG4raS5vZmZzZXQpfWZvcm1hdCh0PTApe2xldCBuPVtcIiBcIi5yZXBlYXQodCkrYFske3RoaXMudHlwZX1dICgke3RoaXMuYnl0ZUxlbmd0aH0pYF07Zm9yKGxldFtpLG9db2YgdGhpcy5zdHJ1Y3Qpe2xldCBzPW8uZWxlbWVudDtzLmZvcm1hdCE9PXZvaWQgMD9uLnB1c2gocy5mb3JtYXQodCsyKSk6bi5wdXNoKFwiIFwiLnJlcGVhdCh0KzIpK2Ake2l9ID0gJHtzLnZhbHVlfSAoJHtzLmJ5dGVMZW5ndGh9KWApfXJldHVybiBuLmpvaW4oYFxuYCl9cHJpbnQodCl7Y29uc29sZS53YXJuKHRoaXMuZm9ybWF0KHQpKX19LFU9Y2xhc3MgZXh0ZW5kcyBUe2NvbnN0cnVjdG9yKHQsbiwuLi5pKXtzdXBlcih0LG4pO3RoaXMuYm94U2l6ZT0wLHRoaXMuYXBwZW5kKC4uLmkpfWFwcGVuZCguLi50KXtmb3IobGV0IG4gb2YgdCl0aGlzLmFkZChgYm94XyR7dGhpcy5ib3hTaXplKyt9YCxuKTtyZXR1cm4gdGhpc31wYXJzZSh0KXtsZXQgbj1bXTtmb3IoO3QuYnl0ZUxlbmd0aD4wOyl7bGV0IGk9bmV3IFJlKFwiLi4uLlwiKTtpLmxvYWQodCw0KTtsZXQgbz1pLnZhbHVlLHM9UHNbb10sYTtpZihzIT09dm9pZCAwKXtpZihzLmlzX2NvbnRhaW5lcil7YT1uZXcgVShvKSxhLmxvYWQodCk7bGV0IHU9YS5wYXJzZSh0LnNsaWNlKGEuYnl0ZUxlbmd0aCxhLmdldChcInNpemVcIikpKTtuLnB1c2goLi4udSl9ZWxzZSBpZihhPW5ldyBUKG8pLGEubG9hZCh0KSxvPT09XCJhdmNDXCIpe2xldCB1PWEuZWxlbWVudChcIkFWQ1Byb2ZpbGVJbmRpY2F0aW9uXCIpLnZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLDApLGY9YS5lbGVtZW50KFwicHJvZmlsZV9jb21wYXRpYmlsaXR5XCIpLnZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLDApLGw9YS5lbGVtZW50KFwiQVZDTGV2ZWxJbmRpY2F0aW9uXCIpLnZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLDApO24ucHVzaCh7dHlwZTpcInZpZGVvXCIsbWltZTpgYXZjMS4ke3V9JHtmfSR7bH1gfSl9ZWxzZSBpZihvPT09XCJlc2RzXCIpe2xldCBmPWEuZWxlbWVudChcImF1ZGlvQ29uZmlnQnl0ZXNcIikudmFsdWU+Pj4xMSYzMTtuLnB1c2goe3R5cGU6XCJhdWRpb1wiLG1pbWU6YG1wNGEuNDAuJHtmfWB9KX19ZWxzZSBhPW5ldyBUKFwiLi4uLlwiKSxhLmxvYWQodCksYS50eXBlPWEuZ2V0KFwidHlwZVwiKTt0aGlzLmFwcGVuZChhKSx0PXQuc2xpY2UoYS5nZXQoXCJzaXplXCIpKX1yZXR1cm4gbn19O2MoKTtjKCk7dmFyIFRjPXsxOlwiQUFDIE1haW5cIiwyOlwiQUFDIExDXCJ9LENjPXswOlwiOTYga0h6XCIsMTpcIjg4LjIga0h6XCIsMjpcIjY0IGtIelwiLDM6XCI0OCBrSHpcIiw0OlwiNDQuMSBrSHpcIiw1OlwiMzIga0h6XCIsNjpcIjI0IGtIelwiLDc6XCIyMi4wNSBrSHpcIiw4OlwiMTYga0h6XCIsOTpcIjEyIGtIelwiLDEwOlwiMTEuMDI1IGtIelwiLDExOlwiOCBrSHpcIiwxMjpcIjcuMzUga0h6XCJ9LEJjPXsxOlwiTW9ub1wiLDI6XCJTdGVyZW9cIn0sTWM9cj0+e2xldCBlPXI+Pj4xMSYzMSx0PXI+Pj43JjE1LG49cj4+PjMmMTUsaT1UY1tlXXx8YEFBQyAoJHtlfSlgLG89Q2NbdF18fFwidW5rbm93blwiLHM9QmNbbl18fG4udG9TdHJpbmcoKTtyZXR1cm57Y29kaW5nOmksc2FtcGxpbmdSYXRlOm8sY2hhbm5lbHM6c319LGtzPShyLGUsdCk9PntsZXQgbj1OdW1iZXIoci5mbXRwLnBhcmFtZXRlcnMuYml0cmF0ZSl8fDMyZTQsaT1wYXJzZUludChyLmZtdHAucGFyYW1ldGVycy5jb25maWcuc3Vic3RyKDAsNCksMTYpLG89aT4+PjExJjMxO3JldHVybnt0a2hkOnt0cmFja19JRDp0LGNyZWF0aW9uX3RpbWU6ZSxtb2RpZmljYXRpb25fdGltZTplLHdpZHRoOjAsaGVpZ2h0OjAsdm9sdW1lOjF9LG1kaGQ6e3RpbWVzY2FsZTpOdW1iZXIoci5ydHBtYXAuY2xvY2tyYXRlKSxjcmVhdGlvbl90aW1lOmUsbW9kaWZpY2F0aW9uX3RpbWU6ZSxkdXJhdGlvbjowfSxoZGxyOntoYW5kbGVyX3R5cGU6XCJzb3VuXCIsbmFtZTpcIlNvdW5kSGFuZGxlclxcMFwifSxtZWRpYUhlYWRlckJveDpuZXcgVChcInNtaGRcIiksc2FtcGxlRW50cnlCb3g6bmV3IFUoXCJtcDRhXCIse3NhbXBsZXJhdGU6ci5ydHBtYXAuY2xvY2tyYXRlPDwxNj4+PjB9LG5ldyBUKFwiZXNkc1wiLHthdWRpb0NvbmZpZ0J5dGVzOmksbWF4Qml0UmF0ZTpuLGF2Z0JpdFJhdGU6bn0pKSxkZWZhdWx0RnJhbWVEdXJhdGlvbjoxMDI0LG1pbWU6YG1wNGEuNDAuJHtvfWAsY29kZWM6TWMoaSl9fTtjKCk7YygpO2Z1bmN0aW9uIExjKHIpe3JldHVybiByPjY0JiZyPDkxP3ItNjU6cj45NiYmcjwxMjM/ci03MTpyPjQ3JiZyPDU4P3IrNDpyPT09NDM/NjI6cj09PTQ3PzYzOjB9ZnVuY3Rpb24gT3MocixlKXtsZXQgdD1yLnJlcGxhY2UoL1teQS1aYS16MC05Ky9dL2csXCJcIiksbj10Lmxlbmd0aCxpPWU/TWF0aC5jZWlsKChuKjMrMT4+MikvZSkqZTpuKjMrMT4+MixvPW5ldyBVaW50OEFycmF5KGkpLHMsYSx1PTAsZj0wO2ZvcihsZXQgbD0wO2w8bjtsKyspaWYoYT1sJjMsdXw9TGModC5jaGFyQ29kZUF0KGwpKTw8MTgtNiphLGE9PT0zfHxuLWw9PT0xKXtmb3Iocz0wO3M8MyYmZjxpO3MrKyxmKyspb1tmXT11Pj4+KDE2Pj4+cyYyNCkmMjU1O3U9MH1yZXR1cm4gb31jKCk7YygpO3ZhciBncj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9idWZmZXI9ZSx0aGlzLl9kYXRhVmlldz1uZXcgRGF0YVZpZXcodGhpcy5fYnVmZmVyKSx0aGlzLl9vZmZzZXQ9MCx0aGlzLl9iaXRwb3M9MCx0aGlzLl9ieXRlPTB9cmVhZFVpbnQ4KGUpe3JldHVybiB0aGlzLl9kYXRhVmlldy5nZXRVaW50OChlKX1yZWFkVWludDE2KGUpe3JldHVybiB0aGlzLl9kYXRhVmlldy5nZXRVaW50MTYoZSl9cmVhZFVpbnQzMihlKXtyZXR1cm4gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKGUpfXJlYWROZXh0KCl7bGV0IGU9dGhpcy5yZWFkVWludDgodGhpcy5fb2Zmc2V0KTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz0xLGV9cmVhZEJpdHMoZSl7aWYoZT4zMnx8ZT09PTApdGhyb3cgbmV3IEVycm9yKFwibGVuZ3RoIGhhcyB0byBiZSBiZXR3ZWVuIDAgLSAzMSBiaXRzXCIpO2xldCB0PTA7Zm9yKGxldCBuPTE7bjw9ZTsrK24pdGhpcy5fYml0cG9zPT09MCYmKHRoaXMuX2J5dGU9dGhpcy5yZWFkTmV4dCgpKSx0PXQ8PDF8dGhpcy5fYnl0ZT4+OC0rK3RoaXMuX2JpdHBvcyYxLHRoaXMuX2JpdHBvcyU9ODtyZXR1cm4gdH1yZWFkVW5zaWduZWRFeHBHb2xvbWIoKXtsZXQgZT0wO2Zvcig7dGhpcy5yZWFkQml0cygxKSE9PTE7KWUrKztpZihlPT09MClyZXR1cm4gMDtpZihlPj0zMSl0aHJvdyBuZXcgRXJyb3IoXCJyZWFkIHVuc2lnbmVkIGV4cG9uZW50aWFsIEdvbG9tYjogaW50ZXJuYWwgZXJyb3JcIik7bGV0IHQ9dGhpcy5yZWFkQml0cyhlKTtyZXR1cm4gdHw9MTw8ZSx0LTF9cmVhZFNpZ25lZEV4cEdvbG9tYigpe2xldCBlPXRoaXMucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7cmV0dXJuIGUmMT9lPWUrMT4+MTplPS0oZT4+MSksZX1zaXplKCl7cmV0dXJuIHRoaXMuX2J1ZmZlci5ieXRlTGVuZ3RofWdldFVpbnQ4QXJyYXkoKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5fYnVmZmVyKX1nZXRBcnJheUJ1ZmZlcigpe3JldHVybiB0aGlzLl9idWZmZXJ9fTt2YXIgeXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5yZWFkZXI9bmV3IGdyKGUpfXBhcnNlKCl7dGhpcy5yZWFkZXIucmVhZE5leHQoKTtsZXQgZT10aGlzLnJlYWRlci5yZWFkTmV4dCgpO3RoaXMucmVhZGVyLnJlYWROZXh0KCk7bGV0IHQ9dGhpcy5yZWFkZXIucmVhZE5leHQoKTtpZih0aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSxbMTAwLDExMCwxMjIsMjQ0LDQ0LDgzLDg2LDExOF0uaW5jbHVkZXMoZSkpe2xldCBiPXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpO2lmKGI9PT0zJiZ0aGlzLnJlYWRlci5yZWFkQml0cygxKSx0aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkQml0cygxKSx0aGlzLnJlYWRlci5yZWFkQml0cygxKSlmb3IobGV0IHc9MDt3PChiIT09Mz84OjEyKTt3KyspdGhpcy5yZWFkZXIucmVhZEJpdHMoMSl9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7bGV0IG49dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7aWYobj09PTApdGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7ZWxzZSBpZihuPT09MSl7bGV0IGI9MDt0aGlzLnJlYWRlci5yZWFkQml0cygxKSx0aGlzLnJlYWRlci5yZWFkU2lnbmVkRXhwR29sb21iKCksdGhpcy5yZWFkZXIucmVhZFNpZ25lZEV4cEdvbG9tYigpLGI9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7Zm9yKGxldCB5PTA7eTxiO3krKyl0aGlzLnJlYWRlci5yZWFkU2lnbmVkRXhwR29sb21iKCl9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCksdGhpcy5yZWFkZXIucmVhZEJpdHMoMSk7bGV0IGk9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCksbz10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSxzPXRoaXMucmVhZGVyLnJlYWRCaXRzKDEpO3RoaXMucmVhZGVyLnJlYWRCaXRzKDEpO2xldCBhPXRoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHU9YT90aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTowLGY9YT90aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTowLGw9YT90aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTowLGQ9YT90aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTowLGg9KGkrMSkqMTYtdSoyLWYqMixtPSgyLXMpKihvKzEpKjE2LWwqMi1kKjI7cmV0dXJue3Byb2ZpbGU6ZSxsZXZlbDp0LzEwLHdpZHRoOmgsaGVpZ2h0Om19fX07dmFyIEljPXs2NjpcIkJhc2VsaW5lXCIsNzc6XCJNYWluXCIsMTAwOlwiSGlnaFwifSxBYz1yPT57bGV0IGU9cGFyc2VJbnQoci5zdWJzdHIoMCwyKSwxNiksdD1wYXJzZUludChyLnN1YnN0cig0LDIpLDE2KSxuPUljW2VdfHxlLnRvU3RyaW5nKCksaT0odC8xMCkudG9GaXhlZCgxKTtyZXR1cm57Y29kaW5nOlwiSC4yNjRcIixwcm9maWxlOm4sbGV2ZWw6aX19LFVzPShyLGUsdCk9PntsZXQgbj1yLmZtdHAucGFyYW1ldGVyc1tcInByb2ZpbGUtbGV2ZWwtaWRcIl0saT1yLmZtdHAucGFyYW1ldGVyc1tcInNwcm9wLXBhcmFtZXRlci1zZXRzXCJdLnNwbGl0KFwiLFwiKS5tYXAoT3MpLG89aS5zbGljZSgwLDEpLHM9aS5zbGljZSgxKSxhPW5ldyB5cihvWzBdLmJ1ZmZlcikucGFyc2UoKSx1PTM2MDA7cmV0dXJue21lZGlhSGVhZGVyQm94Om5ldyBUKFwidm1oZFwiKSxzYW1wbGVFbnRyeUJveDpuZXcgVShcImF2YzFcIix7d2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHR9LG5ldyBUKFwiYXZjQ1wiLHtBVkNQcm9maWxlSW5kaWNhdGlvbjpvWzBdWzFdLHByb2ZpbGVfY29tcGF0aWJpbGl0eTpvWzBdWzJdLEFWQ0xldmVsSW5kaWNhdGlvbjpvWzBdWzNdLHNlcXVlbmNlUGFyYW1ldGVyU2V0czpvLHBpY3R1cmVQYXJhbWV0ZXJTZXRzOnN9KSksdGtoZDp7dHJhY2tfSUQ6dCxjcmVhdGlvbl90aW1lOmUsbW9kaWZpY2F0aW9uX3RpbWU6ZSx3aWR0aDphLndpZHRoPDwxNixoZWlnaHQ6YS5oZWlnaHQ8PDE2LHZvbHVtZTowfSxoZGxyOnt9LG1kaGQ6e3RpbWVzY2FsZTpyLnJ0cG1hcC5jbG9ja3JhdGUsY3JlYXRpb25fdGltZTplLG1vZGlmaWNhdGlvbl90aW1lOmUsZHVyYXRpb246MH0sZGVmYXVsdEZyYW1lRHVyYXRpb246ci5mcmFtZXJhdGUhPT12b2lkIDAmJnIuZnJhbWVyYXRlPjAmJk51bWJlcihyLnJ0cG1hcC5jbG9ja3JhdGUpL051bWJlcihyLmZyYW1lcmF0ZSl8fHUsbWltZTpgYXZjMS4ke259YCxjb2RlYzpBYyhuKX19O3ZhciBEcz17XCJNUEVHNC1HRU5FUklDXCI6a3MsSDI2NDpVc30sRmM9KCk9Pih7bGFzdFRpbWVzdGFtcDowLGJhc2VNZWRpYURlY29kZVRpbWU6MCxkZWZhdWx0RnJhbWVEdXJhdGlvbjowLGNsb2NrcmF0ZTowLGJpdHJhdGU6MCxmcmFtZXJhdGU6MCxjdW11bGF0aXZlQnl0ZUxlbmd0aDowLGN1bXVsYXRpdmVEdXJhdGlvbjowLGN1bXVsYXRpdmVGcmFtZXM6MH0pLFBjPShyLHtieXRlTGVuZ3RoOmUsZHVyYXRpb246dH0pPT57aWYoci5jdW11bGF0aXZlQnl0ZUxlbmd0aCs9ZSxyLmN1bXVsYXRpdmVEdXJhdGlvbis9dCxyLmN1bXVsYXRpdmVGcmFtZXMrKyxyLmN1bXVsYXRpdmVEdXJhdGlvbj49ci5jbG9ja3JhdGUpe2xldCBuPTgqci5jdW11bGF0aXZlQnl0ZUxlbmd0aCxpPXIuY3VtdWxhdGl2ZUZyYW1lcyxvPXIuY3VtdWxhdGl2ZUR1cmF0aW9uL3IuY2xvY2tyYXRlO3IuYml0cmF0ZT1uL28sci5mcmFtZXJhdGU9aS9vLHIuY3VtdWxhdGl2ZUJ5dGVMZW5ndGg9MCxyLmN1bXVsYXRpdmVEdXJhdGlvbj0wLHIuY3VtdWxhdGl2ZUZyYW1lcz0wfX0sYnI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnRyYWNrSWRNYXA9e30sdGhpcy5zZXF1ZW5jZU51bWJlcj0wLHRoaXMubnRwUHJlc2VudGF0aW9uVGltZT0wLHRoaXMudHJhY2tEYXRhPVtdfXRyYWsoZSl7bGV0IHQ9bmV3IFUoXCJ0cmFrXCIpLG49bmV3IFUoXCJtZGlhXCIpLGk9bmV3IFUoXCJtaW5mXCIpLG89bmV3IFUoXCJkaW5mXCIpLHM9bmV3IFUoXCJkcmVmXCIpLGE9bmV3IFUoXCJzdGJsXCIpO3JldHVybiBzLnNldChcImVudHJ5X2NvdW50XCIsMSksdC5hcHBlbmQobmV3IFQoXCJ0a2hkXCIsZS50a2hkKSxuLmFwcGVuZChuZXcgVChcIm1kaGRcIixlLm1kaGQpLG5ldyBUKFwiaGRsclwiLGUuaGRsciksaS5hcHBlbmQoZS5tZWRpYUhlYWRlckJveCxvLmFwcGVuZChzLmFwcGVuZChuZXcgVChcInVybCBcIikpKSxhLmFwcGVuZChuZXcgVShcInN0c2RcIix2b2lkIDAsZS5zYW1wbGVFbnRyeUJveCksbmV3IFQoXCJzdHRzXCIpLG5ldyBUKFwic3RzY1wiKSxuZXcgVChcInN0Y29cIiksbmV3IFQoXCJzdHN6XCIpLG5ldyBUKFwic3Rzc1wiKSkpKSksdH1tb292KGUsdCl7bGV0IG49bmV3IFUoXCJtb292XCIpO24uYXBwZW5kKG5ldyBUKFwibXZoZFwiLHtjcmVhdGlvbl90aW1lOnQsbW9kaWZpY2F0aW9uX3RpbWU6dCxkdXJhdGlvbjowfSkpO2xldCBpPW5ldyBVKFwibXZleFwiKTt0aGlzLnRyYWNrSWRNYXA9e30sdGhpcy5zZXF1ZW5jZU51bWJlcj0wLHRoaXMubnRwUHJlc2VudGF0aW9uVGltZT0wO2xldCBvPTA7cmV0dXJuIHRoaXMudHJhY2tEYXRhPVtdLGUubWVkaWEuZm9yRWFjaChzPT57aWYocy5ydHBtYXA9PT12b2lkIDApcmV0dXJuO2xldCBhPXMucnRwbWFwLnBheWxvYWRUeXBlLHU9cy5ydHBtYXAuZW5jb2RpbmdOYW1lO2lmKERzW3VdIT09dm9pZCAwKXt0aGlzLnRyYWNrSWRNYXBbYV09KytvLHMudHlwZS50b0xvd2VyQ2FzZSgpPT09XCJ2aWRlb1wiJiYodGhpcy52aWRlb1RyYWNrSWQ9byk7bGV0IGY9RHNbdV0ocyx0LG8pO3MubWltZT1mLm1pbWUscy5jb2RlYz1mLmNvZGVjO2xldCBsPUZjKCk7bC5jbG9ja3JhdGU9cy5ydHBtYXAuY2xvY2tyYXRlLGwuZGVmYXVsdEZyYW1lRHVyYXRpb249Zi5kZWZhdWx0RnJhbWVEdXJhdGlvbix0aGlzLnRyYWNrRGF0YS5wdXNoKGwpO2xldCBkPXRoaXMudHJhayhmKTtuLmFwcGVuZChkKSxpLmFwcGVuZChuZXcgVChcInRyZXhcIix7dHJhY2tfSUQ6b30pKX19KSxuLmFwcGVuZChpKSxufW1vb2YoZSl7bGV0e3RyYWNrSWQ6dCx0aW1lc3RhbXA6bixieXRlTGVuZ3RoOml9PWUsbz10LTEscz10aGlzLnRyYWNrRGF0YVtvXSxhPXMubGFzdFRpbWVzdGFtcCE9PTA/bi1zLmxhc3RUaW1lc3RhbXB8MDpzLmRlZmF1bHRGcmFtZUR1cmF0aW9uLHU9YT4wP2E6cy5kZWZhdWx0RnJhbWVEdXJhdGlvbjtzLmxhc3RUaW1lc3RhbXA9YT4wP246cy5sYXN0VGltZXN0YW1wK3U7bGV0IGY9bmV3IFUoXCJtb29mXCIpLGw9bmV3IFUoXCJ0cmFmXCIpLGQ9bmV3IFQoXCJ0cnVuXCIse3NhbXBsZV9kdXJhdGlvbjp1LHNhbXBsZV9zaXplOmksZmlyc3Rfc2FtcGxlX2ZsYWdzOjY0fSk7cmV0dXJuIGYuYXBwZW5kKG5ldyBUKFwibWZoZFwiLHtzZXF1ZW5jZV9udW1iZXI6dGhpcy5zZXF1ZW5jZU51bWJlcisrfSksbC5hcHBlbmQobmV3IFQoXCJ0ZmhkXCIse3RyYWNrX0lEOnR9KSxuZXcgVChcInRmZHRcIix7YmFzZU1lZGlhRGVjb2RlVGltZTpzLmJhc2VNZWRpYURlY29kZVRpbWV9KSxkKSkscy5iYXNlTWVkaWFEZWNvZGVUaW1lKz11LGQuc2V0KFwiZGF0YV9vZmZzZXRcIixmLmJ5dGVMZW5ndGgrOCksUGMocyx7Ynl0ZUxlbmd0aDppLGR1cmF0aW9uOnV9KSxmfW1kYXQoZSl7bGV0IHQ9bmV3IFQoXCJtZGF0XCIpO3JldHVybiB0LmFkZChcImRhdGFcIixlKSx0fXNldFByZXNlbnRhdGlvblRpbWUoZSx0KXtpZighdGhpcy5udHBQcmVzZW50YXRpb25UaW1lJiZ0JiZlPT09dGhpcy52aWRlb1RyYWNrSWQpe2xldCBuPWUtMSxpPXRoaXMudHJhY2tEYXRhW25dO3RoaXMubnRwUHJlc2VudGF0aW9uVGltZT10LTFlMyooaS5iYXNlTWVkaWFEZWNvZGVUaW1lL2kuY2xvY2tyYXRlKX19fTt2YXIgTnM9QyhOKCkpO3ZhciBwdD1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtsZXQgdD1uZXcgYnIsbj1vPT57dGhpcy5vblN5bmMmJnRoaXMub25TeW5jKG8pfSxpPW5ldyBOcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKG8scyxhKXtpZihvLnR5cGU9PT01KXtsZXQgdT1NYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpLzFlMysyMDgyODUyZTMpLGY9bmV3IFQoXCJmdHlwXCIpLGw9dC5tb292KG8uc2RwLHUpLGQ9QnVmZmVyLmFsbG9jVW5zYWZlKGYuYnl0ZUxlbmd0aCtsLmJ5dGVMZW5ndGgpO2YuY29weShkLDApLGwuY29weShkLGYuYnl0ZUxlbmd0aCksKDAsWW4uZGVmYXVsdCkoXCJtc2w6bXA0Omlzb21cIikoYGZ0eXA6ICR7Zi5mb3JtYXQoKX1gKSwoMCxZbi5kZWZhdWx0KShcIm1zbDptcDQ6aXNvbVwiKShgbW9vdjogJHtsLmZvcm1hdCgpfWApO2xldCBoPW8uc2RwLm1lZGlhLm1hcChtPT4oe3R5cGU6bS50eXBlLGVuY29kaW5nOm0ucnRwbWFwJiZtLnJ0cG1hcC5lbmNvZGluZ05hbWUsbWltZTptLm1pbWUsY29kZWM6bS5jb2RlY30pKTt0aGlzLnB1c2goe3R5cGU6OCxkYXRhOmQsdHJhY2tzOmgsZnR5cDpmLG1vb3Y6bH0pfWVsc2UgaWYoby50eXBlPT09Nnx8by50eXBlPT09Nyl7bGV0e3BheWxvYWRUeXBlOnUsdGltZXN0YW1wOmYsbnRwVGltZXN0YW1wOmx9PW8sZD10LnRyYWNrSWRNYXBbdV07aWYoZCl7dC5udHBQcmVzZW50YXRpb25UaW1lfHwodC5zZXRQcmVzZW50YXRpb25UaW1lKGQsbCksdC5udHBQcmVzZW50YXRpb25UaW1lJiZuKHQubnRwUHJlc2VudGF0aW9uVGltZSkpO2xldCBoLG09by50eXBlPT09Nz9vLm5hbFR5cGU9PT01OnZvaWQgMDt0Lm50cFByZXNlbnRhdGlvblRpbWUmJm0mJm8ubnRwVGltZXN0YW1wIT09dm9pZCAwJiYoaD0oby5udHBUaW1lc3RhbXAtdC5udHBQcmVzZW50YXRpb25UaW1lKS8xZTMpO2xldCBiPW8uZGF0YS5ieXRlTGVuZ3RoLHk9dC5tb29mKHt0cmFja0lkOmQsdGltZXN0YW1wOmYsYnl0ZUxlbmd0aDpifSksdz10Lm1kYXQoby5kYXRhKSxfPUJ1ZmZlci5hbGxvY1Vuc2FmZSh5LmJ5dGVMZW5ndGgrdy5ieXRlTGVuZ3RoKTt5LmNvcHkoXywwKSx3LmNvcHkoXyx5LmJ5dGVMZW5ndGgpLHRoaXMucHVzaCh7dHlwZTo4LGRhdGE6Xyxtb29mOnksbWRhdDp3LG50cFRpbWVzdGFtcDpsLGNoZWNrcG9pbnRUaW1lOmh9KX19ZWxzZSB0aGlzLnB1c2gobyk7YSgpfX0pO3N1cGVyKGkpO3RoaXMuYm94QnVpbGRlcj10fWdldCBiaXRyYXRlKCl7cmV0dXJuIHRoaXMuYm94QnVpbGRlci50cmFja0RhdGEmJnRoaXMuYm94QnVpbGRlci50cmFja0RhdGEubWFwKHQ9PnQuYml0cmF0ZSl9Z2V0IGZyYW1lcmF0ZSgpe3JldHVybiB0aGlzLmJveEJ1aWxkZXIudHJhY2tEYXRhJiZ0aGlzLmJveEJ1aWxkZXIudHJhY2tEYXRhLm1hcCh0PT50LmZyYW1lcmF0ZSl9Z2V0IG50cFByZXNlbnRhdGlvblRpbWUoKXtyZXR1cm4gdGhpcy5ib3hCdWlsZGVyLm50cFByZXNlbnRhdGlvblRpbWV9fTtjKCk7dmFyIFZzPUMobGUoKSk7dmFyIHZyPUMoTigpKTtjKCk7dmFyIEtuPShvPT4ob1tvLlNSPTIwMF09XCJTUlwiLG9bby5SUj0yMDFdPVwiUlJcIixvW28uU0RFUz0yMDJdPVwiU0RFU1wiLG9bby5CWUU9MjAzXT1cIkJZRVwiLG9bby5BUFA9MjA0XT1cIkFQUFwiLG8pKShLbnx8e30pLGtjPXI9Pih7dmVyc2lvbjpyWzBdPj4+NixwYWRkaW5nOiEhKHJbMF0maXRbMl0pLGNvdW50OnJbMF0mMzEscGFja2V0VHlwZTpyLnJlYWRVSW50OCgxKSxsZW5ndGg6ci5yZWFkVUludDE2QkUoMil9KSxYbj1yPT57bGV0IGU9a2Mocik7c3dpdGNoKGUucGFja2V0VHlwZSl7Y2FzZSAyMDA6cmV0dXJuIE9jKHIsZSk7Y2FzZSAyMDE6cmV0dXJuIFVjKHIsZSk7Y2FzZSAyMDI6cmV0dXJuIERjKHIsZSk7Y2FzZSAyMDM6cmV0dXJuIE5jKHIsZSk7Y2FzZSAyMDQ6cmV0dXJuIEhjKHIsZSk7ZGVmYXVsdDpyZXR1cm4gZX19LHhyPShyLGUpPT4oe3R5cGU6MyxkYXRhOmUsY2hhbm5lbDpyLHJ0Y3A6WG4oZSl9KSxIcz17cGFja2V0VHlwZToyMDB9LHFzPShyLGUsdCk9PntsZXQgbj1bXTtmb3IobGV0IGk9MDtpPHI7aSsrKXtsZXQgbz10K2kqMjQ7bi5wdXNoKHtzeW5jU291cmNlOmUucmVhZFVJbnQzMkJFKG8rMCksZnJhY3Rpb25Mb3N0OmUucmVhZFVJbnQ4KG8rNCksY3VtdWxhdGl2ZU51bWJlck9mUGFja2V0c0xvc3Q6ZS5yZWFkVUludEJFKG8rNSwzKSxleHRlbmRlZEhpZ2hlc3RTZXF1ZW5jZU51bWJlclJlY2VpdmVkOmUucmVhZFVJbnQzMkJFKG8rOCksaW50ZXJhcnJpdmFsSml0dGVyOmUucmVhZFVJbnQzMkJFKG8rMTIpLGxhc3RTUlRpbWVzdGFtcDplLnJlYWRVSW50MzJCRShvKzE2KSxkZWxheVNpbmNlTGFzdFNSOmUucmVhZFVJbnQzMkJFKG8rMjApfSl9cmV0dXJuIG59LE9jPShyLGUpPT4oey4uLmUsc3luY1NvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxudHBNb3N0OnIucmVhZFVJbnQzMkJFKDgpLG50cExlYXN0OnIucmVhZFVJbnQzMkJFKDEyKSxydHBUaW1lc3RhbXA6ci5yZWFkVUludDMyQkUoMTYpLHNlbmRlcnNQYWNrZXRDb3VudDpyLnJlYWRVSW50MzJCRSgyMCksc2VuZGVyc09jdGV0Q291bnQ6ci5yZWFkVUludDMyQkUoMjQpLHJlcG9ydHM6cXMoZS5jb3VudCxyLDI4KX0pLF9yPXI9PnIucGFja2V0VHlwZT09PTIwMCxVYz0ocixlKT0+KHsuLi5lLHN5bmNTb3VyY2U6ci5yZWFkVUludDMyQkUoNCkscmVwb3J0czpxcyhlLmNvdW50LHIsOCl9KSxqcz1yPT5yLnBhY2tldFR5cGU9PT0yMDEsSm49KHU9Pih1W3UuQ05BTUU9MV09XCJDTkFNRVwiLHVbdS5OQU1FPTJdPVwiTkFNRVwiLHVbdS5FTUFJTD0zXT1cIkVNQUlMXCIsdVt1LlBIT05FPTRdPVwiUEhPTkVcIix1W3UuTE9DPTVdPVwiTE9DXCIsdVt1LlRPT0w9Nl09XCJUT09MXCIsdVt1Lk5PVEU9N109XCJOT1RFXCIsdVt1LlBSSVY9OF09XCJQUklWXCIsdSkpKEpufHx7fSksRGM9KHIsZSk9PntsZXQgdD1bXSxuPTQ7Zm9yKGxldCBpPTA7aTxlLmNvdW50O2krKyl7bGV0IG89e3NvdXJjZTpyLnJlYWRVSW50MzJCRShuKSxpdGVtczpbXX07Zm9yKG4rPTQ7Oyl7bGV0IHM9ci5yZWFkVUludDgobisrKTtpZihzPT09MCl7biU0IT09MCYmKG4rPTQtbiU0KTticmVha31sZXQgYT1yLnJlYWRVSW50OChuKyspO2lmKHM9PT04KXtsZXQgdT1yLnJlYWRVSW50OChuKSxmPXIudG9TdHJpbmcoXCJ1dGY4XCIsbisxLG4rMSt1KSxsPXIudG9TdHJpbmcoXCJ1dGY4XCIsbisxK3UsbithKTtvLml0ZW1zLnB1c2goWzgsZixsXSl9ZWxzZXtsZXQgdT1yLnRvU3RyaW5nKFwidXRmOFwiLG4sbithKTtvLml0ZW1zLnB1c2goW3MsdV0pfW4rPWF9dC5wdXNoKG8pfXJldHVybnsuLi5lLHN5bmNTb3VyY2U6ci5yZWFkVUludDMyQkUoNCksc291cmNlRGVzY3JpcHRpb25zOnR9fSxXcz1yPT5yLnBhY2tldFR5cGU9PT0yMDIsTmM9KHIsZSk9PntsZXQgdD1bXTtmb3IobGV0IGk9MDtpPGUuY291bnQ7aSsrKXQucHVzaChyLnJlYWRVSW50MzJCRSg0KzQqaSkpO2xldCBuO2lmKGUubGVuZ3RoPmUuY291bnQpe2xldCBpPTQrNCplLmNvdW50LG89ci5yZWFkVUludDgoaSk7bj1yLnRvU3RyaW5nKFwidXRmLThcIixpKzEsaSsxK28pfXJldHVybnsuLi5lLHNvdXJjZXM6dCxyZWFzb246bn19LHdyPXI9PnIucGFja2V0VHlwZT09PTIwMyxIYz0ocixlKT0+KHsuLi5lLHN1YnR5cGU6ZS5jb3VudCxzb3VyY2U6ci5yZWFkVUludDMyQkUoNCksbmFtZTpyLnRvU3RyaW5nKFwiYXNjaWlcIiw4LDEyKSxkYXRhOnIuc2xpY2UoMTIpfSksJHM9cj0+ci5wYWNrZXRUeXBlPT09MjA0O3ZhciBxYz0xMDAsR3M9KDAsVnMuZGVmYXVsdCkoXCJtc2w6bXNlXCIpLFRlPWNsYXNzIGV4dGVuZHMgUXtjb25zdHJ1Y3Rvcih0KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInZpZGVvIGVsZW1lbnQgYXJndW1lbnQgbWlzc2luZ1wiKTtsZXQgbixpLG89bmV3IHZyLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwLHdyaXRlOihhLHUsZik9PntpZihhLnR5cGU9PT04KWlmKHRoaXMuX2RvbmU9ZixhLnRyYWNrcyE9PXZvaWQgMHx8YS5taW1lIT09dm9pZCAwKXtsZXQgbD1hLnRyYWNrcz8/W10sZD1sLm1hcCh5PT55Lm1pbWUpLmZpbHRlcih5PT55KSxoPWQubGVuZ3RoIT09MD9kLmpvaW4oXCIsIFwiKTpcImF2YzEuNjQwMDI5LCBtcDRhLjQwLjJcIixtPWEubWltZT8/YHZpZGVvL21wNDsgY29kZWNzPVwiJHtofVwiYDtpZighTWVkaWFTb3VyY2UuaXNUeXBlU3VwcG9ydGVkKG0pKXtvLmVtaXQoXCJlcnJvclwiLGB1bnN1cHBvcnRlZCBtZWRpYSB0eXBlOiAke219YCk7cmV0dXJufXRoaXMuX2xhc3RDaGVja3BvaW50VGltZT0wLG49bmV3IE1lZGlhU291cmNlLHQuc3JjPXdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG4pO2xldCBiPSgpPT57aWYobj09PXZvaWQgMCl7by5lbWl0KFwiZXJyb3JcIixcIm5vIE1lZGlhU291cmNlIGluc3RhbmNlXCIpO3JldHVybn13aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh0LnNyYyksbi5yZW1vdmVFdmVudExpc3RlbmVyKFwic291cmNlb3BlblwiLGIpLHRoaXMub25Tb3VyY2VPcGVuJiZ0aGlzLm9uU291cmNlT3BlbihuLGwpLGk9dGhpcy5hZGRTb3VyY2VCdWZmZXIodCxuLG0pLGkub25lcnJvcj15PT57Y29uc29sZS5lcnJvcihcImVycm9yIG9uIFNvdXJjZUJ1ZmZlcjogXCIseSksby5lbWl0KFwiZXJyb3JcIil9O3RyeXtpLmFwcGVuZEJ1ZmZlcihhLmRhdGEpfWNhdGNoKHkpe0dzKFwiZmFpbGVkIHRvIGFwcGVuZCB0byBTb3VyY2VCdWZmZXI6IFwiLHksYSl9fTtuLmFkZEV2ZW50TGlzdGVuZXIoXCJzb3VyY2VvcGVuXCIsYil9ZWxzZXt0aGlzLl9sYXN0Q2hlY2twb2ludFRpbWU9YS5jaGVja3BvaW50VGltZSE9PXZvaWQgMD9hLmNoZWNrcG9pbnRUaW1lOnRoaXMuX2xhc3RDaGVja3BvaW50VGltZTt0cnl7aT8uYXBwZW5kQnVmZmVyKGEuZGF0YSl9Y2F0Y2gobCl7R3MoXCJmYWlsZWQgdG8gYXBwZW5kIHRvIFNvdXJjZUJ1ZmZlcjogXCIsbCxhKX19ZWxzZSBhLnR5cGU9PT0zJiZ3cihhLnJ0Y3ApJiZuPy5yZWFkeVN0YXRlPT09XCJvcGVuXCImJm4uZW5kT2ZTdHJlYW0oKSxmKCl9fSk7by5vbihcImZpbmlzaFwiLCgpPT57Y29uc29sZS53YXJuKFwiaW5jb21pbmcgc3RyZWFtIGZpbmlzaGVkOiBlbmQgc3RyZWFtXCIpLG4mJm4ucmVhZHlTdGF0ZT09PVwib3BlblwiJiZuLmVuZE9mU3RyZWFtKCl9KSxvLm9uKFwiZXJyb3JcIixhPT57Y29uc29sZS5lcnJvcihcImVycm9yIG9uIGluY29taW5nIHN0cmVhbTogXCIsYSksaSYmaS51cGRhdGluZz9pLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVlbmRcIiwoKT0+e24/LnJlYWR5U3RhdGU9PT1cIm9wZW5cIiYmbi5lbmRPZlN0cmVhbSgpfSk6bj8ucmVhZHlTdGF0ZT09PVwib3BlblwiJiZuLmVuZE9mU3RyZWFtKCl9KTtsZXQgcz1uZXcgdnIuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZDpmdW5jdGlvbigpe319KTtzLm9uKFwiZXJyb3JcIiwoKT0+e2NvbnNvbGUud2FybihcIm91dGdvaW5nIHN0cmVhbSBicm9rZSBzb21ld2hlcmVcIil9KTtzdXBlcihvLHMpO3RoaXMuX3ZpZGVvRWw9dCx0aGlzLl9sYXN0Q2hlY2twb2ludFRpbWU9MH1hZGRTb3VyY2VCdWZmZXIodCxuLGkpe2xldCBvPW4uYWRkU291cmNlQnVmZmVyKGkpLHM9MCxhPSgpPT57aWYoKytzLHM+cWMmJm8uYnVmZmVyZWQubGVuZ3RoKXtzPTA7bGV0IHU9by5idWZmZXJlZC5sZW5ndGgtMSxmPW8uYnVmZmVyZWQuc3RhcnQodSksbD1NYXRoLm1pbih0LmN1cnJlbnRUaW1lLHRoaXMuX2xhc3RDaGVja3BvaW50VGltZSktMTA7dHJ5e2lmKGw+Zil7by5yZW1vdmUoZixsKTtyZXR1cm59fWNhdGNoKGQpe2NvbnNvbGUud2FybihkKX19dGhpcy5fZG9uZSYmdGhpcy5fZG9uZSgpfTtyZXR1cm4gby5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZW5kXCIsYSksb31nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fdmlkZW9FbC5jdXJyZW50VGltZX1hc3luYyBwbGF5KCl7cmV0dXJuIGF3YWl0IHRoaXMuX3ZpZGVvRWwucGxheSgpfXBhdXNlKCl7cmV0dXJuIHRoaXMuX3ZpZGVvRWwucGF1c2UoKX19O2MoKTt2YXIgenM9QyhOKCkpO3ZhciBDZT1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtsZXQgZSx0PVtdLG49bmV3IHpzLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24oaSxvLHMpe2lmKGkudHlwZT09PTUpe2xldCBhO2ZvcihsZXQgdSBvZiBpLnNkcC5tZWRpYSl1LnR5cGU9PT1cImFwcGxpY2F0aW9uXCImJnUucnRwbWFwJiZ1LnJ0cG1hcC5lbmNvZGluZ05hbWU9PT1cIlZORC5PTlZJRi5NRVRBREFUQVwiJiYoYT11KTthJiZhLnJ0cG1hcCYmKGU9TnVtYmVyKGEucnRwbWFwLnBheWxvYWRUeXBlKSkscyh2b2lkIDAsaSl9ZWxzZSBpZihpLnR5cGU9PT0yJiZPKGkuZGF0YSk9PT1lKXtpZih0LnB1c2goWihpLmRhdGEpKSxjZShpLmRhdGEpJiZ0Lmxlbmd0aD4wKXtsZXQgYT17dGltZXN0YW1wOkgoaS5kYXRhKSxudHBUaW1lc3RhbXA6aS5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhpLmRhdGEpLGRhdGE6QnVmZmVyLmNvbmNhdCh0KSx0eXBlOjl9O3Modm9pZCAwLGEpLHQ9W107cmV0dXJufXMoKX1lbHNlIHModm9pZCAwLGkpfX0pO3N1cGVyKG4pfX07YygpO3ZhciBabj1DKE4oKSk7YygpO3ZhciBZcz1DKGxlKCkpLGpjPVwiUlRTUC8xLjBcIixLcz1yPT57aWYoIXIubWV0aG9kfHwhci51cmkpdGhyb3cgbmV3IEVycm9yKFwibWVzc2FnZSBuZWVkcyB0byBjb250YWluIGEgbWV0aG9kIGFuZCBhIHVyaVwiKTtsZXQgZT1yLnByb3RvY29sfHxqYyx0PXIuaGVhZGVyc3x8e30sbj1bYCR7ci5tZXRob2R9ICR7ci51cml9ICR7ZX1gLE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoW2ksb10pPT5pK1wiOiBcIitvKS5qb2luKGBcXHJcbmApLGBcXHJcbmBdLmpvaW4oYFxcclxuYCk7cmV0dXJuKDAsWXMuZGVmYXVsdCkoXCJtc2w6cnRzcDpvdXRnb2luZ1wiKShuKSxCdWZmZXIuZnJvbShuKX07YygpO2MoKTt2YXIgV2M9KHIsZSx0PTApPT57bGV0IG49YFxuJHtlfWA7dD1yLmluZGV4T2Yobix0KTtsZXQgaT0wLG89W107Zm9yKDt0Pj0wOylpPXIuaW5kZXhPZihgXG5gLHQrbi5sZW5ndGgpLG8ucHVzaChyLnRvU3RyaW5nKFwiYXNjaWlcIix0K24ubGVuZ3RoLGkpLnRyaW0oKSksdD1yLmluZGV4T2YobixpKTtyZXR1cm4gb30sJGM9cj0+ci5tYXRjaCgvXm09LyksRXI9KHIsZSk9PntsZXQgdD1lLmluZGV4T2Yocik7cmV0dXJuIHQ8MD9bZS5zbGljZSgwKV06W2Uuc2xpY2UoMCx0KSxlLnNsaWNlKHQrMSldfSxYcz17Zm10cDpyPT57bGV0W2UsdF09RXIoXCIgXCIscik7c3dpdGNoKGUpe2RlZmF1bHQ6bGV0IG49dD90LnRyaW0oKS5zcGxpdChcIjtcIik6W10saT17fTtyZXR1cm4gbi5mb3JFYWNoKG89PntsZXRbcyxhXT1FcihcIj1cIixvKSx1PXMudHJpbSgpLnRvTG93ZXJDYXNlKCk7dSE9PVwiXCImJihpW3VdPWEudHJpbSgpKX0pLHtmb3JtYXQ6ZSxwYXJhbWV0ZXJzOml9fX0sZnJhbWVyYXRlOk51bWJlcixydHBtYXA6cj0+e2xldFtlLHRdPUVyKFwiIFwiLHIpLFtuLGksb109dC50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiL1wiKTtyZXR1cm4gbz09PXZvaWQgMD97cGF5bG9hZFR5cGU6TnVtYmVyKGUpLGVuY29kaW5nTmFtZTpuLGNsb2NrcmF0ZTpOdW1iZXIoaSl9OntwYXlsb2FkVHlwZTpOdW1iZXIoZSksZW5jb2RpbmdOYW1lOm4sY2xvY2tyYXRlOk51bWJlcihpKSxlbmNvZGluZ1BhcmFtZXRlcnM6b319LHRyYW5zZm9ybTpyPT5yLnNwbGl0KFwiO1wiKS5tYXAoZT0+ZS5zcGxpdChcIixcIikubWFwKE51bWJlcikpLFwieC1zZW5zb3ItdHJhbnNmb3JtXCI6cj0+ci5zcGxpdChcIjtcIikubWFwKGU9PmUuc3BsaXQoXCIsXCIpLm1hcChOdW1iZXIpKSxmcmFtZXNpemU6cj0+ci5zcGxpdChcIiBcIilbMV0uc3BsaXQoXCItXCIpLm1hcChOdW1iZXIpfSxHYz1yPT57bGV0W2UsdF09RXIoXCI6XCIscik7cmV0dXJuIHQ9PT12b2lkIDA/e1tlXTohMH06WHNbZV0hPT12b2lkIDA/e1tlXTpYc1tlXSh0KX06e1tlXTp0fX0sVmM9cj0+e2xldCBlPXIuc2xpY2UoMCwxKSx0PXIuc2xpY2UoMik7c3dpdGNoKGUpe2Nhc2VcInZcIjpyZXR1cm57dmVyc2lvbjp0fTtjYXNlXCJvXCI6bGV0W24saSxvLHMsYSx1XT10LnNwbGl0KFwiIFwiKTtyZXR1cm57b3JpZ2luOnthZGRyVHlwZTphLG5ldFR5cGU6cyxzZXNzaW9uSWQ6aSxzZXNzaW9uVmVyc2lvbjpvLHVuaWNhc3RBZGRyZXNzOnUsdXNlcm5hbWU6bn19O2Nhc2VcInNcIjpyZXR1cm57c2Vzc2lvbk5hbWU6dH07Y2FzZVwiaVwiOnJldHVybntzZXNzaW9uSW5mb3JtYXRpb246dH07Y2FzZVwidVwiOnJldHVybnt1cmk6dH07Y2FzZVwiZVwiOnJldHVybntlbWFpbDp0fTtjYXNlXCJwXCI6cmV0dXJue3Bob25lOnR9O2Nhc2VcImNcIjpsZXRbZixsLGRdPXQuc3BsaXQoXCIgXCIpO3JldHVybntjb25uZWN0aW9uRGF0YTp7YWRkclR5cGU6bCxjb25uZWN0aW9uQWRkcmVzczpkLG5ldFR5cGU6Zn19O2Nhc2VcImJcIjpsZXRbaCxtXT10LnNwbGl0KFwiOlwiKTtyZXR1cm57Ynd0eXBlOmgsYmFuZHdpZHRoOm19O2Nhc2VcInRcIjpsZXRbYix5XT10LnNwbGl0KFwiIFwiKS5tYXAoTnVtYmVyKTtyZXR1cm57dGltZTp7c3RhcnRUaW1lOmIsc3RvcFRpbWU6eX19O2Nhc2VcInJcIjpsZXRbdyxfLC4uLnZdPXQuc3BsaXQoXCIgXCIpLm1hcChOdW1iZXIpO3JldHVybntyZXBlYXRUaW1lczp7cmVwZWF0SW50ZXJ2YWw6dyxhY3RpdmVEdXJhdGlvbjpfLG9mZnNldHM6dn19O2Nhc2VcInpcIjpyZXR1cm47Y2FzZVwia1wiOnJldHVybjtjYXNlXCJhXCI6cmV0dXJuIEdjKHQpO2Nhc2VcIm1cIjpsZXRbcSxBLGosWV09dC5zcGxpdChcIiBcIik7cmV0dXJue3R5cGU6cSxwb3J0Ok51bWJlcihBKSxwcm90b2NvbDpqLGZtdDpOdW1iZXIoWSl9O2RlZmF1bHQ6fX0sSnM9cj0+e2xldCBlPXIuaW5kZXhPZihgXG5tPWApO3JldHVybiBXYyhyLFwiYT1jb250cm9sOlwiLGUpfSxRbj1yPT57bGV0IGU9ci50b1N0cmluZyhcImFzY2lpXCIpLnNwbGl0KGBcbmApLm1hcChvPT5vLnRyaW0oKSksdD17c2Vzc2lvbjp7fSxtZWRpYTpbXX0sbj0wLGk9dC5zZXNzaW9uO2ZvcihsZXQgbyBvZiBlKSRjKG8pJiYodC5tZWRpYVtuXT17fSxpPXQubWVkaWFbbl0sKytuKSxpPU9iamVjdC5hc3NpZ24oaSxWYyhvKSk7cmV0dXJuIHR9LFNyPXI9Pih7dHlwZTo1LGRhdGE6cixzZHA6UW4ocil9KTtjKCk7dmFyIHJlPShyLGUpPT57bGV0IHQ9YFxuJHtlLnRvTG93ZXJDYXNlKCl9OiBgLG49ci50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0KTtpZihuPj0wKXtsZXQgaT1yLmluZGV4T2YoYFxuYCxuK3QubGVuZ3RoKTtyZXR1cm4gci50b1N0cmluZyhcImFzY2lpXCIsbit0Lmxlbmd0aCxpKS50cmltKCl9cmV0dXJuIG51bGx9LFJyPXI9PntsZXQgZT1yZShyLFwiQ1NlcVwiKTtyZXR1cm4gZSE9PW51bGw/TnVtYmVyKGUpOm51bGx9LFRyPXI9PntsZXQgZT1yZShyLFwiU2Vzc2lvblwiKTtyZXR1cm4gZT9lLnNwbGl0KFwiO1wiKVswXTpudWxsfSxDcj1yPT57bGV0IGU9cmUocixcIlNlc3Npb25cIik7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7bGV0IHQ9NjAsbj1cInRpbWVvdXQ9XCIsaT1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihuKTtpZihpIT09LTEpe2xldCBvPWUuc3Vic3RyaW5nKGkrbi5sZW5ndGgpO289by5zcGxpdChcIjtcIilbMF07bGV0IHM9cGFyc2VJbnQobyk7cmV0dXJuIGlzTmFOKHMpP3Q6c31yZXR1cm4gdH0saHQ9cj0+TnVtYmVyKHIudG9TdHJpbmcoXCJhc2NpaVwiLDksMTIpKSxCcj1yPT5yZShyLFwiQ29udGVudC1CYXNlXCIpLE1yPXI9PnJlKHIsXCJDb250ZW50LUxvY2F0aW9uXCIpLExyPXI9PntsZXQgZT1yZShyLFwiQ29ubmVjdGlvblwiKTtyZXR1cm4gZSE9PW51bGwmJmUudG9Mb3dlckNhc2UoKT09PVwiY2xvc2VcIn0sSXI9cj0+e2xldCBlPXJlKHIsXCJSYW5nZVwiKTtpZihlIT09bnVsbClyZXR1cm4gZS5zcGxpdChcIj1cIilbMV0uc3BsaXQoXCItXCIpfSxBcj1yPT57bGV0IGU9W2BcblxuYCxcIlxcclxcclwiLGBcXHJcblxcclxuYF0ubWFwKHQ9PntsZXQgbj1yLmluZGV4T2YodCk7cmV0dXJuIG4hPT0tMT9uK3QubGVuZ3RoOm59KS5maWx0ZXIodD0+dCE9PS0xKTtyZXR1cm4gZS5sZW5ndGg+MD9lLnJlZHVjZSgodCxuKT0+TWF0aC5taW4odCxuKSk6LTF9O3ZhciBacz00LFFzPTM2LHpjPXI9PntsZXQgZT1CdWZmZXIuYWxsb2MoWnMpLHQ9MCxuPTA7Zm9yKDtuPGUubGVuZ3RoOyl7bGV0IHU9clt0KytdLGY9TWF0aC5taW4odS5sZW5ndGgsZS5sZW5ndGgtbik7dS5jb3B5KGUsbiwwLGYpLG4rPWZ9bGV0IGk9ZVsxXSxvPWUubGVuZ3RoLHM9ZS5yZWFkVUludDE2QkUoMiksYT1vK3M7cmV0dXJue2NoYW5uZWw6aSxiZWdpbjpvLGVuZDphfX0sRnI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9jaHVua3M9W107dGhpcy5fbGVuZ3RoPTA7dGhpcy5fc3RhdGU9MDt0aGlzLl9pbml0KCl9X2luaXQoKXt0aGlzLl9jaHVua3M9W10sdGhpcy5fbGVuZ3RoPTAsdGhpcy5fc3RhdGU9MH1fcHVzaChlKXt0aGlzLl9jaHVua3MucHVzaChlKSx0aGlzLl9sZW5ndGgrPWUubGVuZ3RofV9wYXJzZVJ0c3AoKXtsZXQgZT1bXSx0PUJ1ZmZlci5jb25jYXQodGhpcy5fY2h1bmtzKSxuPUFyKHQpO2lmKG49PT0tMSlyZXR1cm4gZTtsZXQgaT1uLG89cmUodCxcIkNvbnRlbnQtTGVuZ3RoXCIpO2lmKG8mJnBhcnNlSW50KG8pPnQubGVuZ3RoLWkpcmV0dXJuIGU7aWYodGhpcy5faW5pdCgpLGk9PT10Lmxlbmd0aHx8dFtpXT09PVFzKXtsZXQgcz10LnNsaWNlKDAsaSk7ZS5wdXNoKHt0eXBlOjQsZGF0YTpzfSk7bGV0IGE9dC5zbGljZShpKTt0aGlzLl9wdXNoKGEpfWVsc2V7bGV0IHM9dCxhPXQuc2xpY2UoaSk7ZS5wdXNoKHt0eXBlOjQsZGF0YTpzfSksZS5wdXNoKFNyKGEpKX1yZXR1cm4gZX1fcGFyc2VJbnRlcmxlYXZlZCgpe2xldCBlPVtdO2lmKHRoaXMuX2xlbmd0aDxac3x8KHRoaXMuX3BhY2tldHx8KHRoaXMuX3BhY2tldD16Yyh0aGlzLl9jaHVua3MpKSx0aGlzLl9sZW5ndGg8dGhpcy5fcGFja2V0LmVuZCkpcmV0dXJuIGU7bGV0IHQ9QnVmZmVyLmNvbmNhdCh0aGlzLl9jaHVua3MpLG49dC5zbGljZSh0aGlzLl9wYWNrZXQuYmVnaW4sdGhpcy5fcGFja2V0LmVuZCksaT10LnNsaWNlKHRoaXMuX3BhY2tldC5lbmQpLG89dGhpcy5fcGFja2V0LmNoYW5uZWw7aWYoZGVsZXRlIHRoaXMuX3BhY2tldCx0aGlzLl9pbml0KCksdGhpcy5fcHVzaChpKSxvJTI9PT0wKWUucHVzaCh7dHlwZToyLGRhdGE6bixjaGFubmVsOm99KTtlbHNle2xldCBzPW47ZG97bGV0IGE9cy5yZWFkVUludDE2QkUoMikqNCs0O2UucHVzaCh4cihvLHMuc2xpY2UoMCxhKSkpLHM9cy5zbGljZShhKX13aGlsZShzLmxlbmd0aD4wKX1yZXR1cm4gZX1fc2V0U3RhdGUoKXtmb3IoO3RoaXMuX2NodW5rcy5sZW5ndGg+MCYmdGhpcy5fY2h1bmtzWzBdLmxlbmd0aD09PTA7KXRoaXMuX2NodW5rcy5zaGlmdCgpO2xldCBlPXRoaXMuX2NodW5rc1swXTtpZih0aGlzLl9jaHVua3MubGVuZ3RoPT09MCl0aGlzLl9zdGF0ZT0wO2Vsc2UgaWYoZVswXT09PVFzKXRoaXMuX3N0YXRlPTE7ZWxzZSBpZihlLnRvU3RyaW5nKFwiYXNjaWlcIiwwLDQpPT09XCJSVFNQXCIpdGhpcy5fc3RhdGU9MjtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaHVuayBvZiBsZW5ndGggJHtlLmxlbmd0aH1gKX1wYXJzZShlKXt0aGlzLl9wdXNoKGUpLHRoaXMuX3N0YXRlPT09MCYmdGhpcy5fc2V0U3RhdGUoKTtsZXQgdD1bXSxuPSExO2Zvcig7IW47KXtsZXQgaT1bXTtzd2l0Y2godGhpcy5fc3RhdGUpe2Nhc2UgMDpicmVhaztjYXNlIDE6aT10aGlzLl9wYXJzZUludGVybGVhdmVkKCk7YnJlYWs7Y2FzZSAyOmk9dGhpcy5fcGFyc2VSdHNwKCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZVwiKX1pLmxlbmd0aD4wP3Q9dC5jb25jYXQoaSk6bj0hMCx0aGlzLl9zZXRTdGF0ZSgpfXJldHVybiB0fX07dmFyIG10PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlPW5ldyBGcix0PW5ldyBabi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT0xKXRyeXtlLnBhcnNlKGkuZGF0YSkuZm9yRWFjaChhPT50LnB1c2goYSkpLHMoKX1jYXRjaChhKXtzKGEpfWVsc2Ugcyh2b2lkIDAsaSl9fSksbj1uZXcgWm4uVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09NCl7bGV0IGE9S3MoaSk7cyh2b2lkIDAse3R5cGU6MSxkYXRhOmF9KX1lbHNlIHModm9pZCAwLGkpfX0pO3N1cGVyKHQsbil9fTtjKCk7dmFyIGtyPUMobGUoKSk7YygpO3ZhciBndD0ocixlKT0+e2xldCB0O2lmKGUhPT12b2lkIDApe2lmKHR5cGVvZiBlIT1cIm9iamVjdFwiKXRocm93IG5ldyBFcnJvcihcIm1lcmdlIGV4cGVjdHMgb3ZlcnJpZGUgdG8gYmUgYW4gb2JqZWN0IVwiKTt0PU9iamVjdC5rZXlzKGUpLnJlZHVjZSgobixpKT0+KGVbaV0hPT12b2lkIDAmJihuW2ldPWVbaV0pLG4pLHt9KX1yZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyLHQpfTt2YXIgZWE9QyhOKCkpO2MoKTt2YXIgWWM9RGF0ZS5VVEMoMTkwMCwwLDEpO2Z1bmN0aW9uIFByKHIsZSl7bGV0IHQ9KHIrZS80Mjk0OTY3Mjk2KSoxZTM7cmV0dXJuIFljK3R9ZnVuY3Rpb24gS2Mocil7cmV0dXJuL15bXjpdKzpcXC9cXC8vLnRlc3Qocil9dmFyIE9yPShzPT4ocy5PUFRJT05TPVwiT1BUSU9OU1wiLHMuREVTQ1JJQkU9XCJERVNDUklCRVwiLHMuU0VUVVA9XCJTRVRVUFwiLHMuUExBWT1cIlBMQVlcIixzLlBBVVNFPVwiUEFVU0VcIixzLlRFQVJET1dOPVwiVEVBUkRPV05cIixzKSkoT3J8fHt9KSxYYz01LEpjPShyPXR5cGVvZiB3aW5kb3c+XCJ1XCI/XCJcIjp3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsZT1bXSk9Pih7dXJpOmUubGVuZ3RoPjA/YHJ0c3A6Ly8ke3J9L2F4aXMtbWVkaWEvbWVkaWEuYW1wPyR7ZS5qb2luKFwiJlwiKX1gOmBydHNwOi8vJHtyfS9heGlzLW1lZGlhL21lZGlhLmFtcGB9KSxJdD1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbil7c3VwZXIodCk7dGhpcy5uYW1lPVwiUlRTUFJlc3BvbnNlRXJyb3JcIix0aGlzLmNvZGU9bn19LHl0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcih0PXt9KXtsZXR7dXJpOm4saGVhZGVyczppLGRlZmF1bHRIZWFkZXJzOm99PWd0KEpjKHQuaG9zdG5hbWUsdC5wYXJhbWV0ZXJzKSx0KSxzPW5ldyBlYS5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOihhLHUsZik9PnthLnR5cGU9PT00Pyh0aGlzLl9vblJ0c3AoYSksZigpKTphLnR5cGU9PT0zPyh0aGlzLl9vblJ0Y3AoYSksdGhpcy5vblJ0Y3AmJnRoaXMub25SdGNwKGEucnRjcCksZih2b2lkIDAsYSkpOmEudHlwZT09PTI/KHRoaXMuX29uUnRwKGEpLGYodm9pZCAwLGEpKTooYS50eXBlPT09NSYmKHRoaXMuX29uU2RwKGEpLHRoaXMub25TZHAmJnRoaXMub25TZHAoYS5zZHApKSxmKHZvaWQgMCxhKSl9fSk7cy5vbihcImVuZFwiLCgpPT57dGhpcy5fb3V0Z29pbmdDbG9zZWQ9ITB9KTtzdXBlcihzKTt0aGlzLl9vdXRnb2luZ0Nsb3NlZD0hMSx0aGlzLl9yZXNldCgpLHRoaXMudXBkYXRlKG4saSxvKSx0aGlzLl9zZXNzaW9uQ29udHJvbFVSTD10aGlzLl9jb250cm9sVVJMKCl9dXBkYXRlKHQsbj17fSxpPXt9KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhbiB1cmkgd2hlbiBjcmVhdGluZyBhIFJ0c3BTZXNzaW9uQ29tcG9uZW50XCIpO3RoaXMudXJpPXQsdGhpcy5kZWZhdWx0SGVhZGVycz1pLHRoaXMuaGVhZGVycz1PYmplY3QuYXNzaWduKHtbXCJPUFRJT05TXCJdOnt9LFtcIlBMQVlcIl06e30sW1wiU0VUVVBcIl06e0Jsb2Nrc2l6ZTpcIjY0MDAwXCJ9LFtcIkRFU0NSSUJFXCJdOntBY2NlcHQ6XCJhcHBsaWNhdGlvbi9zZHBcIn0sW1wiUEFVU0VcIl06e319LG4pfV9yZXNldCgpe3RoaXMuX3NlcXVlbmNlPTEsdGhpcy5yZXRyeT0oKT0+Y29uc29sZS5lcnJvcihcIk5vIHJlcXVlc3Qgc2VudCwgY2FuJ3QgcmV0cnlcIiksdGhpcy5fY2FsbFN0YWNrPVtdLHRoaXMuX2NhbGxIaXN0b3J5PVtdLHRoaXMuX3N0YXRlPVwiaWRsZVwiLHRoaXMuX3dhaXRpbmc9ITEsdGhpcy5fY29udGVudEJhc2U9bnVsbCx0aGlzLl9zZXNzaW9uSWQ9bnVsbCx0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCE9PW51bGwmJmNsZWFySW50ZXJ2YWwodGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwpLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsPW51bGwsdGhpcy50MD12b2lkIDAsdGhpcy5uMD12b2lkIDAsdGhpcy5jbG9ja3JhdGVzPXZvaWQgMH1fY29udHJvbFVSTCh0KXtpZih0IT09dm9pZCAwJiZLYyh0KSlyZXR1cm4gdDtsZXQgbj10aGlzLl9jb250ZW50QmFzZT8/dGhpcy5fY29udGVudExvY2F0aW9uPz90aGlzLnVyaTtpZihuPT1udWxsKXRocm93IG5ldyBFcnJvcihcInJlbGF0aXZlIG9yIG1pc3NpbmcgY29udHJvbCBhdHRyaWJ1dGUgYnV0IG5vIGJhc2UgVVJMIGF2YWlsYWJsZVwiKTtyZXR1cm4gdD09PXZvaWQgMHx8dD09PVwiKlwiP246bmV3IFVSTCh0LG4pLmhyZWZ9X29uUnRzcCh0KXt0aGlzLl93YWl0aW5nPSExO2xldCBuPWh0KHQuZGF0YSksaT1Mcih0LmRhdGEpLG89UnIodC5kYXRhKTtpZihvPT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBleHBlY3RlZCBzZXF1ZW5jZSBudW1iZXJcIik7aWYodGhpcy5fY2FsbEhpc3Rvcnk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7bGV0IHM9dGhpcy5fY2FsbEhpc3Rvcnlbby0xXTtpZigoMCxrci5kZWZhdWx0KShcIm1zbDpydHNwOmluY29taW5nXCIpKGAke3QuZGF0YX1gKSwhdGhpcy5fc2Vzc2lvbklkJiYhaSl7dGhpcy5fc2Vzc2lvbklkPVRyKHQuZGF0YSk7bGV0IGE9Q3IodC5kYXRhKTthIT09bnVsbCYmKHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsIT09bnVsbCYmY2xlYXJJbnRlcnZhbCh0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCksdGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKCk9Pnt0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJPUFRJT05TXCJ9KSx0aGlzLl9kZXF1ZXVlKCl9LE1hdGgubWF4KFhjLGEtNSkqMWUzKSl9dGhpcy5fY29udGVudEJhc2V8fCh0aGlzLl9jb250ZW50QmFzZT1Ccih0LmRhdGEpKSx0aGlzLl9jb250ZW50TG9jYXRpb258fCh0aGlzLl9jb250ZW50TG9jYXRpb249TXIodC5kYXRhKSksbj49NDAwJiZ0aGlzLm9uRXJyb3ImJnRoaXMub25FcnJvcihuZXcgSXQodC5kYXRhLnRvU3RyaW5nKFwiYXNjaWlcIiksbikpLHM9PT1cIlBMQVlcIiYmdGhpcy5vblBsYXkmJnRoaXMub25QbGF5KElyKHQuZGF0YSkpLGkmJigoMCxrci5kZWZhdWx0KShcIm1zbDpydHNwOmluY29taW5nXCIpKGBSVFNQIFNlc3Npb24gJHt0aGlzLl9zZXNzaW9uSWR9IGVuZGVkIHdpdGggc3RhdHVzQ29kZTogJHtufWApLHRoaXMuX3Nlc3Npb25JZD1udWxsKSx0aGlzLl9kZXF1ZXVlKCl9X29uUnRjcCh0KXtpZih0aGlzLnQwPT09dm9pZCAwfHx0aGlzLm4wPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGludGVybmFsIGVycm9yXCIpO2lmKF9yKHQucnRjcCkpe2xldCBuPXQuY2hhbm5lbC0xO3RoaXMudDBbbl09dC5ydGNwLnJ0cFRpbWVzdGFtcCx0aGlzLm4wW25dPVByKHQucnRjcC5udHBNb3N0LHQucnRjcC5udHBMZWFzdCl9fV9vblJ0cCh0KXtpZih0aGlzLnQwPT09dm9pZCAwfHx0aGlzLm4wPT09dm9pZCAwfHx0aGlzLmNsb2NrcmF0ZXM9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7bGV0IG49dC5jaGFubmVsLGk9dGhpcy50MFtuXSxvPXRoaXMubjBbbl07aWYodHlwZW9mIGk8XCJ1XCImJnR5cGVvZiBvPFwidVwiKXtsZXQgcz10aGlzLmNsb2NrcmF0ZXNbbl0sdT1IKHQuZGF0YSktaXwwO3QubnRwVGltZXN0YW1wPXUvcyoxZTMrb319X29uU2RwKHQpe3RoaXMubjA9e30sdGhpcy50MD17fSx0aGlzLmNsb2NrcmF0ZXM9e30sdGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkw9dGhpcy5fY29udHJvbFVSTCh0LnNkcC5zZXNzaW9uLmNvbnRyb2wpLHQuc2RwLm1lZGlhLmZvckVhY2goKG4saSk9PntpZihuLnJ0cG1hcD09PXZvaWQgMClyZXR1cm47bGV0e2Nsb2NrcmF0ZTpvfT1uLnJ0cG1hcCxzPWkqMixhPXMrMSx1PW4uY29udHJvbD09PXZvaWQgMD90aGlzLl9zZXNzaW9uQ29udHJvbFVSTDp0aGlzLl9jb250cm9sVVJMKG4uY29udHJvbCk7dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiU0VUVVBcIixoZWFkZXJzOntUcmFuc3BvcnQ6XCJSVFAvQVZQL1RDUDt1bmljYXN0O2ludGVybGVhdmVkPVwiK3MrXCItXCIrYX0sdXJpOnV9KSx0aGlzLmNsb2NrcmF0ZXMhPT12b2lkIDAmJih0aGlzLmNsb2NrcmF0ZXNbc109byl9KSx0aGlzLl9zdGF0ZT09PVwicGxheWluZ1wiJiZ0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJQTEFZXCIsaGVhZGVyczp7UmFuZ2U6YG5wdD0ke3RoaXMuc3RhcnRUaW1lfHwwfS1gfSx1cmk6dGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkx9KSx0aGlzLl9kZXF1ZXVlKCl9cGxheSh0PTApe2lmKHRoaXMuX3N0YXRlPT09XCJpZGxlXCIpdGhpcy5zdGFydFRpbWU9TnVtYmVyKHQpfHwwLHRoaXMuX2VucXVldWUoe21ldGhvZDpcIk9QVElPTlNcIn0pLHRoaXMuX2VucXVldWUoe21ldGhvZDpcIkRFU0NSSUJFXCJ9KTtlbHNlIGlmKHRoaXMuX3N0YXRlPT09XCJwYXVzZWRcIil7aWYodGhpcy5fc2Vzc2lvbklkPT09bnVsbHx8dGhpcy5fc2Vzc2lvbklkPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGludGVybmFsIGVycm9yXCIpO3RoaXMuX2VucXVldWUoe21ldGhvZDpcIlBMQVlcIixoZWFkZXJzOntTZXNzaW9uOnRoaXMuX3Nlc3Npb25JZH0sdXJpOnRoaXMuX3Nlc3Npb25Db250cm9sVVJMfSl9dGhpcy5fc3RhdGU9XCJwbGF5aW5nXCIsdGhpcy5fZGVxdWV1ZSgpfXBhdXNlKCl7dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiUEFVU0VcIn0pLHRoaXMuX3N0YXRlPVwicGF1c2VkXCIsdGhpcy5fZGVxdWV1ZSgpfXN0b3AoKXt0aGlzLl9zZXNzaW9uSWQ/dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiVEVBUkRPV05cIn0pOnRoaXMuX2NhbGxTdGFjaz1bXSx0aGlzLl9zdGF0ZT1cImlkbGVcIix0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCE9PW51bGwmJihjbGVhckludGVydmFsKHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsKSx0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbD1udWxsKSx0aGlzLl9kZXF1ZXVlKCl9c2VuZCh0KXtsZXR7bWV0aG9kOm4saGVhZGVyczppLHVyaTpvfT10O2lmKG49PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBtZXRob2Qgd2hlbiBzZW5kIHJlcXVlc3RcIik7aWYodGhpcy5fd2FpdGluZz0hMCx0aGlzLnJldHJ5PXRoaXMuc2VuZC5iaW5kKHRoaXMsdCksdGhpcy5fc2VxdWVuY2U9PT12b2lkIDB8fHRoaXMuaGVhZGVycz09PXZvaWQgMHx8dGhpcy5fY2FsbEhpc3Rvcnk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7bGV0IHM9T2JqZWN0LmFzc2lnbih7dHlwZTo0LHVyaTpvfHx0aGlzLl9zZXNzaW9uQ29udHJvbFVSTCxkYXRhOkJ1ZmZlci5hbGxvYygwKX0se21ldGhvZDpuLGhlYWRlcnM6aX0se2hlYWRlcnM6T2JqZWN0LmFzc2lnbih7Q1NlcTp0aGlzLl9zZXF1ZW5jZSsrfSx0aGlzLmRlZmF1bHRIZWFkZXJzLHRoaXMuaGVhZGVyc1tuXSxpKX0pO3RoaXMuX3Nlc3Npb25JZCYmKHMuaGVhZGVycy5TZXNzaW9uPXRoaXMuX3Nlc3Npb25JZCksdGhpcy5fY2FsbEhpc3RvcnkucHVzaChuKSx0aGlzLl9vdXRnb2luZ0Nsb3NlZD8oMCxrci5kZWZhdWx0KShcIm1zbDpydHNwOm91dGdvaW5nXCIpKGBVbmFibGUgdG8gc2VuZCAke259LCBjb25uZWN0aW9uIGNsb3NlZGApOnRoaXMub3V0Z29pbmcucHVzaChzKX1fZW5xdWV1ZSh0KXtpZih0aGlzLl9jYWxsU3RhY2s9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7dGhpcy5fY2FsbFN0YWNrLnB1c2godCl9X2RlcXVldWUoKXtpZih0aGlzLl9jYWxsU3RhY2s9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7aWYoIXRoaXMuX3dhaXRpbmcmJnRoaXMuX2NhbGxTdGFjay5sZW5ndGg+MCl7bGV0IHQ9dGhpcy5fY2FsbFN0YWNrLnNoaWZ0KCk7dCE9PXZvaWQgMCYmdGhpcy5zZW5kKHQpfX19O2MoKTt2YXIgVXI9QyhsZSgpKTt2YXIgRHI9QyhOKCkpO2MoKTt2YXIgUWM9MTAwMDcsWmM9KHI9d2luZG93LmxvY2F0aW9uLmhvc3QsZT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpPT4oe3VyaTpgJHtlPT09XCJodHRwczpcIj9cIndzczpcIjpcIndzOlwifS8vJHtyfS9ydHNwLW92ZXItd2Vic29ja2V0YCx0b2tlblVyaTpgJHtlfS8vJHtyfS9heGlzLWNnaS9ydHNwd3NzZXNzaW9uLmNnaWAscHJvdG9jb2w6XCJiaW5hcnlcIix0aW1lb3V0OlFjfSksdGE9YXN5bmMocj17fSk9PntsZXR7dXJpOmUsdG9rZW5Vcmk6dCxwcm90b2NvbDpuLHRpbWVvdXQ6aX09Z3QoWmMoci5ob3N0LHIuc2NoZW1lKSxyKTtpZihlPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIndzOiBpbnRlcm5hbCBlcnJvclwiKTtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKG8scyk9Pnt0cnl7bGV0IGE9bmV3IFdlYlNvY2tldChlLG4pLHU9c2V0VGltZW91dCgoKT0+e2NsZWFyVGltZW91dCh1KSxhLnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuQ09OTkVDVElORyYmKGEub25lcnJvcj1udWxsLHMobmV3IEVycm9yKFwid2Vic29ja2V0IGNvbm5lY3Rpb24gdGltZWQgb3V0XCIpKSl9LGkpO2EuYmluYXJ5VHlwZT1cImFycmF5YnVmZmVyXCIsYS5vbmVycm9yPWY9PntjbGVhclRpbWVvdXQodSk7ZnVuY3Rpb24gbCgpe2lmKHRoaXMuc3RhdHVzPj00MDApe2NvbnNvbGUud2FybihcImZhaWxlZCB0byBsb2FkIHRva2VuXCIsdGhpcy5zdGF0dXMsdGhpcy5yZXNwb25zZVRleHQpLHMoZik7cmV0dXJufWxldCBoPXRoaXMucmVzcG9uc2VUZXh0LnRyaW0oKSxtPWAke2V9P3J0c3B3c3Nlc3Npb249JHtofWAsYj1uZXcgV2ViU29ja2V0KG0sbik7Yi5iaW5hcnlUeXBlPVwiYXJyYXlidWZmZXJcIixiLm9uZXJyb3I9eT0+e3MoeSl9LGIub25vcGVuPSgpPT5vKGIpfWxldCBkPW5ldyBYTUxIdHRwUmVxdWVzdDtkLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsbCksZC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIixoPT57Y29uc29sZS53YXJuKFwiZmFpbGVkIHRvIGdldCB0b2tlblwiKSxzKGgpfSksZC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwoKT0+cyhmKSksZC5vcGVuKFwiR0VUXCIsYCR7dH0/JHtEYXRlLm5vdygpfWApO3RyeXtkLnNlbmQoKX1jYXRjaHtzKGYpfX0sYS5vbm9wZW49KCk9PntjbGVhclRpbWVvdXQodSksbyhhKX19Y2F0Y2goYSl7cyhhKX19KX07dmFyIGVsPTEwMDEsRz1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodCl7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJzb2NrZXQgYXJndW1lbnQgbWlzc2luZ1wiKTtsZXQgbj1uZXcgRHIuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZDpmdW5jdGlvbigpe319KTt0Lm9ubWVzc2FnZT1vPT57bGV0IHM9QnVmZmVyLmZyb20oby5kYXRhKTtuLnB1c2goe2RhdGE6cyx0eXBlOjF9KXx8dC5yZWFkeVN0YXRlPT09V2ViU29ja2V0Lk9QRU4mJigoMCxVci5kZWZhdWx0KShcIm1zbDp3ZWJzb2NrZXQ6aW5jb21pbmdcIikoXCJkb3duc3RyZWFtIGZyb3plblwiKSx0LmNsb3NlKCkpfSxuLm9uKFwiZXJyb3JcIixvPT57Y29uc29sZS53YXJuKFwiY2xvc2luZyBzb2NrZXQgZHVlIHRvIGluY29taW5nIGVycm9yXCIsbyksdC5jbG9zZSgpfSk7bGV0IGk9bmV3IERyLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwLHdyaXRlOmZ1bmN0aW9uKG8scyxhKXt0cnl7dC5zZW5kKG8uZGF0YSl9Y2F0Y2h7Y29uc29sZS53YXJuKFwibWVzc2FnZSBsb3N0IGR1cmluZyBzZW5kOlwiLG8pfWEoKX19KTtpLm9uKFwiZXJyb3JcIixvPT57Y29uc29sZS53YXJuKFwiZXJyb3IgZHVyaW5nIHdlYnNvY2tldCBzZW5kLCBpZ25vcmluZzpcIixvKX0pLGkub24oXCJmaW5pc2hcIiwoKT0+eygwLFVyLmRlZmF1bHQpKFwibXNsOndlYnNvY2tldDpvdXRnb2luZ1wiKShcImZpbmlzaFwiKSx0LnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuQ0xPU0VEJiZ0LmNsb3NlKCl9KSx0Lm9uY2xvc2U9bz0+eygwLFVyLmRlZmF1bHQpKFwibXNsOndlYnNvY2tldDpjbG9zZVwiKShgJHtvLmNvZGV9YCksby5jb2RlPT09ZWwmJnRoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCksbi5wdXNoKG51bGwpLGkuZW5kKCl9O3N1cGVyKG4saSl9c3RhdGljIGFzeW5jIG9wZW4odCl7cmV0dXJuIGF3YWl0IHRhKHQpLnRoZW4obj0+bmV3IEcobikpfX07dmFyIG5pPXt9O1B0KG5pLHtIdG1sNUNhbnZhc1BpcGVsaW5lOigpPT5IcixIdG1sNVZpZGVvTWV0YWRhdGFQaXBlbGluZTooKT0+cXIsSHRtbDVWaWRlb1BpcGVsaW5lOigpPT5fdCxIdHRwTXNlUGlwZWxpbmU6KCk9PkdyLE1ldGFkYXRhUGlwZWxpbmU6KCk9PmpyLFBpcGVsaW5lOigpPT5CZSxSdHNwTWpwZWdQaXBlbGluZTooKT0+eHQsUnRzcE1wNFBpcGVsaW5lOigpPT5idCxSdHNwUGlwZWxpbmU6KCk9PmVlLFdzU2RwUGlwZWxpbmU6KCk9PldyfSk7YygpO2MoKTt2YXIgQmU9Y2xhc3N7Y29uc3RydWN0b3IoLi4uZSl7bGV0W3QsLi4ubl09ZTt0aGlzLl9zZXQ9bmV3IFNldChlKSx0aGlzLmZpcnN0Q29tcG9uZW50PXQsdGhpcy5sYXN0Q29tcG9uZW50PW4ucmVkdWNlKChpLG8pPT5pLmNvbm5lY3QobyksdCl9aW5pdCguLi5lKXtsZXRbdCwuLi5uXT1lO3RoaXMuX3NldD1uZXcgU2V0KGUpLHRoaXMuZmlyc3RDb21wb25lbnQ9dCx0aGlzLmxhc3RDb21wb25lbnQ9bi5yZWR1Y2UoKGksbyk9PmkuY29ubmVjdChvKSx0KX1pbnNlcnRBZnRlcihlLHQpe2lmKCF0aGlzLl9zZXQuaGFzKGUpKXRocm93IG5ldyBFcnJvcihcImluc2VydGlvbiBwb2ludCBub3QgcGFydCBvZiBwaXBlbGluZVwiKTtpZih0aGlzLl9zZXQuaGFzKHQpKXRocm93IG5ldyBFcnJvcihcIm5ldyBjb21wb25lbnQgYWxyZWFkeSBpbiB0aGUgcGlwZWxpbmVcIik7bGV0IG49ZS5uZXh0O3JldHVybiBuPT09bnVsbD8oZS5jb25uZWN0KHQpLHRoaXMubGFzdENvbXBvbmVudD10KTooZS5kaXNjb25uZWN0KCksZS5jb25uZWN0KHQpLmNvbm5lY3QobikpLHRoaXMuX3NldC5hZGQodCksdGhpc31pbnNlcnRCZWZvcmUoZSx0KXtpZighdGhpcy5fc2V0LmhhcyhlKSl0aHJvdyBuZXcgRXJyb3IoXCJpbnNlcnRpb24gcG9pbnQgbm90IHBhcnQgb2YgcGlwZWxpbmVcIik7aWYodGhpcy5fc2V0Lmhhcyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJuZXcgY29tcG9uZW50IGFscmVhZHkgaW4gdGhlIHBpcGVsaW5lXCIpO2xldCBuPWUucHJldjtyZXR1cm4gbj09PW51bGw/KHQuY29ubmVjdChlKSx0aGlzLmZpcnN0Q29tcG9uZW50PXQpOihuLmRpc2Nvbm5lY3QoKSxuLmNvbm5lY3QodCkuY29ubmVjdChlKSksdGhpcy5fc2V0LmFkZCh0KSx0aGlzfXJlbW92ZShlKXtpZighdGhpcy5fc2V0LmhhcyhlKSl0aHJvdyBuZXcgRXJyb3IoXCJjb21wb25lbnQgbm90IHBhcnQgb2YgcGlwZWxpbmVcIik7bGV0IHQ9ZS5wcmV2LG49ZS5uZXh0O2lmKHQ9PT1udWxsJiZuPT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3QgcmVtb3ZlIGxhc3QgY29tcG9uZW50XCIpO3JldHVybiB0PT09bnVsbCYmbiE9PW51bGw/KGUuZGlzY29ubmVjdCgpLHRoaXMuZmlyc3RDb21wb25lbnQ9bik6dCE9PW51bGwmJm49PT1udWxsPyh0LmRpc2Nvbm5lY3QoKSx0aGlzLmxhc3RDb21wb25lbnQ9dCk6dCE9PW51bGwmJm4hPT1udWxsJiYodC5kaXNjb25uZWN0KCksZS5kaXNjb25uZWN0KCksdC5jb25uZWN0KG4pKSx0aGlzLl9zZXQuZGVsZXRlKGUpLHRoaXN9YXBwZW5kKC4uLmUpe3JldHVybiBlLmZvckVhY2godD0+e3RoaXMuaW5zZXJ0QWZ0ZXIodGhpcy5sYXN0Q29tcG9uZW50LHQpfSksdGhpc31wcmVwZW5kKC4uLmUpe3JldHVybiBlLmZvckVhY2godD0+e3RoaXMuaW5zZXJ0QmVmb3JlKHRoaXMuZmlyc3RDb21wb25lbnQsdCl9KSx0aGlzfX07YygpO3ZhciBlZT1jbGFzcyBleHRlbmRzIEJle2NvbnN0cnVjdG9yKHQpe2xldCBuPW5ldyBtdCxpPW5ldyB5dCh0KTtpLm9uU2RwPW89Pnt0aGlzLm9uU2RwJiZ0aGlzLm9uU2RwKG8pfSxpLm9uUGxheT1vPT57dGhpcy5vblBsYXkmJnRoaXMub25QbGF5KG8pfTtzdXBlcihuLGkpO3RoaXMucnRzcD1pfX07YygpO3ZhciBidD1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO2xldCBuPW5ldyBjdCxpPW5ldyBvdCxvPW5ldyBwdDtvLm9uU3luYz1zPT57dGhpcy5vblN5bmMmJnRoaXMub25TeW5jKHMpfSx0aGlzLmFwcGVuZChuLGksbyksdGhpcy5fbXA0TXV4ZXI9b31nZXQgYml0cmF0ZSgpe3JldHVybiB0aGlzLl9tcDRNdXhlci5iaXRyYXRlfWdldCBmcmFtZXJhdGUoKXtyZXR1cm4gdGhpcy5fbXA0TXV4ZXIuZnJhbWVyYXRlfX07YygpO3ZhciB4dD1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2xldCB0PW5ldyBsdDt0aGlzLmFwcGVuZCh0KX19O2MoKTtjKCk7YygpO3ZhciBNZT1DKG5hKCkpLE5yPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLm5jPSgpPT4oKyt0aGlzLmNvdW50LHRoaXMuY291bnQudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsXCIwXCIpKTt0aGlzLmNub25jZT0oKT0+bmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMjU2KSkubWFwKGU9PmUudG9TdHJpbmcoMTYpKS5qb2luKFwiXCIpO3RoaXMuaGExPWU9PntsZXQgdD10aGlzLmhhMUJhc2U7cmV0dXJuIHRoaXMuYWxnb3JpdGhtPT09XCJtZDUtc2Vzc1wiJiYodD1uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke3R9OiR7dGhpcy5ub25jZX06JHtlfWApLmVuZCgpLnRvU3RyaW5nKCkpLHR9O3RoaXMuaGEyPShlLHQsbj1cIlwiKT0+e2xldCBpPW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7ZX06JHt0fWApLmVuZCgpLnRvU3RyaW5nKCk7aWYodGhpcy5hbGdvcml0aG09PT1cIm1kNS1zZXNzXCIpe2xldCBvPW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIobikuZW5kKCkudG9TdHJpbmcoKTtpPW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7ZX06JHt0fToke299YCkuZW5kKCkudG9TdHJpbmcoKX1yZXR1cm4gaX07dGhpcy5hdXRob3JpemF0aW9uPShlPVwiR0VUXCIsdD1cIlwiLG4pPT57bGV0IGk9dGhpcy5uYygpLG89dGhpcy5jbm9uY2UoKSxzPXRoaXMuaGExKG8pLGE9dGhpcy5oYTIoZSx0LG4pLHU9dGhpcy5xb3A9PT12b2lkIDA/bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtzfToke3RoaXMubm9uY2V9OiR7YX1gKS5lbmQoKS50b1N0cmluZygpOm5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7c306JHt0aGlzLm5vbmNlfToke2l9OiR7b306JHt0aGlzLnFvcH06JHthfWApLmVuZCgpLnRvU3RyaW5nKCksZj1bXTtyZXR1cm4gZi5wdXNoKGB1c2VybmFtZT1cIiR7dGhpcy51c2VybmFtZX1cImApLGYucHVzaChgcmVhbG09XCIke3RoaXMucmVhbG19XCJgKSxmLnB1c2goYG5vbmNlPVwiJHt0aGlzLm5vbmNlfVwiYCksZi5wdXNoKGB1cmk9XCIke3R9XCJgKSx0aGlzLnFvcCE9PXZvaWQgMCYmKGYucHVzaChgcW9wPSR7dGhpcy5xb3B9YCksZi5wdXNoKGBuYz0ke2l9YCksZi5wdXNoKGBjbm9uY2U9XCIke299XCJgKSksZi5wdXNoKGByZXNwb25zZT1cIiR7dX1cImApLHRoaXMub3BhcXVlIT09dm9pZCAwJiZmLnB1c2goYG9wYXF1ZT1cIiR7dGhpcy5vcGFxdWV9XCJgKSxgRGlnZXN0ICR7Zi5qb2luKFwiLCBcIil9YH07bGV0IGk9ZS5nZXQoXCJyZWFsbVwiKTtpZihpPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIm5vIHJlYWxtIGluIGRpZ2VzdCBjaGFsbGVuZ2VcIik7dGhpcy5yZWFsbT1pLHRoaXMuaGExQmFzZT1uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke3R9OiR7aX06JHtufWApLmVuZCgpLnRvU3RyaW5nKCk7bGV0IG89ZS5nZXQoXCJub25jZVwiKTtpZihvPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIm5vIG5vbmNlIGluIGRpZ2VzdCBjaGFsbGVuZ2VcIik7dGhpcy5ub25jZT1vLHRoaXMub3BhcXVlPWUuZ2V0KFwib3BhcXVlXCIpO2xldCBzPWUuZ2V0KFwiYWxnb3JpdGhtXCIpO3MhPT12b2lkIDA/cz09PVwibWQ1XCI/dGhpcy5hbGdvcml0aG09XCJtZDVcIjpzPT09XCJtZDUtc2Vzc1wiJiYodGhpcy5hbGdvcml0aG09XCJtZDUtc2Vzc1wiKTp0aGlzLmFsZ29yaXRobT1cIm1kNVwiO2xldCBhPWUuZ2V0KFwicW9wXCIpO2lmKGEhPT12b2lkIDApe2xldCB1PWEuc3BsaXQoXCIsXCIpLm1hcChmPT5mLnRyaW0oKSk7dS5zb21lKGY9PmY9PT1cImF1dGhcIik/dGhpcy5xb3A9XCJhdXRoXCI6dS5zb21lKGY9PmY9PT1cImF1dGgtaW50XCIpJiYodGhpcy5xb3A9XCJhdXRoLWludFwiKX10aGlzLmNvdW50PTAsdGhpcy51c2VybmFtZT10fX07YygpO3ZhciBpYT1yPT57bGV0WyxlLC4uLnRdPXIuc3BsaXQoXCIgXCIpLG49W10saT0vXFxzKihbXj1dKyk9XCIoW15cIl0qKVwiLD8vZ20sbztkbyBpZihvPWkuZXhlYyh0LmpvaW4oXCIgXCIpKSxvIT09bnVsbCl7bGV0WyxhLHVdPW87bi5wdXNoKFthLHVdKX13aGlsZShvIT09bnVsbCk7bGV0IHM9bmV3IE1hcChuKTtyZXR1cm57dHlwZTplLnRvTG93ZXJDYXNlKCkscGFyYW1zOnN9fTt2YXIgdGw9NDAxLHJsPXt1c2VybmFtZTpcInJvb3RcIixwYXNzd29yZDpcInBhc3NcIn0sTGU9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKGU9e30pe2xldHt1c2VybmFtZTp0LHBhc3N3b3JkOm59PWd0KHJsLGUpO2lmKHQ9PT12b2lkIDB8fG49PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibmVlZCB1c2VybmFtZSBhbmQgcGFzc3dvcmRcIik7bGV0IGksbyxzPXllKGZ1bmN0aW9uKHUsZixsKXt1LnR5cGU9PT00JiYoaT11LG8mJnUuaGVhZGVycyYmKHUuaGVhZGVycy5BdXRob3JpemF0aW9uPW8pKSxsKHZvaWQgMCx1KX0pLGE9eWUoZnVuY3Rpb24odSxmLGwpe2lmKHUudHlwZT09PTQmJmh0KHUuZGF0YSk9PT10bCl7bGV0IGg9dS5kYXRhLnRvU3RyaW5nKCkuc3BsaXQoYFxuYCkuZmluZChiPT4vV1dXLUF1dGgvaS50ZXN0KGIpKTtpZihoPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCBmaW5kIFdXVy1BdXRoZW50aWNhdGUgaGVhZGVyXCIpO2xldCBtPWlhKGgpO2lmKG0udHlwZT09PVwiYmFzaWNcIilvPVwiQmFzaWMgXCIrQnVmZmVyLmZyb20odCtcIjpcIituKS50b1N0cmluZyhcImJhc2U2NFwiKTtlbHNlIGlmKG0udHlwZT09PVwiZGlnZXN0XCIpbz1uZXcgTnIobS5wYXJhbXMsdCxuKS5hdXRob3JpemF0aW9uKGkubWV0aG9kLGkudXJpKTtlbHNlIHJldHVybjtzLndyaXRlKGksKCk9PmwoKSl9ZWxzZSBsKHZvaWQgMCx1KX0pO3N1cGVyKGEscyl9fTt2YXIgSHI9Y2xhc3MgZXh0ZW5kcyB4dHtjb25zdHJ1Y3Rvcih0KXtsZXR7d3M6bixydHNwOmksbWVkaWFFbGVtZW50Om8sYXV0aDpzfT10O3N1cGVyKGkpO2lmKHMpe2xldCBmPW5ldyBMZShzKTt0aGlzLmluc2VydEJlZm9yZSh0aGlzLnJ0c3AsZil9bGV0IGE9bmV3IHN0KG8pO2Eub25DYW5wbGF5PSgpPT57YS5wbGF5KCksdGhpcy5vbkNhbnBsYXkmJnRoaXMub25DYW5wbGF5KCl9LGEub25TeW5jPWY9Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMoZil9LHRoaXMuYXBwZW5kKGEpLHRoaXMuX3Npbms9YTtsZXQgdT1HLm9wZW4obik7dGhpcy5yZWFkeT11LnRoZW4oZj0+e2Yub25TZXJ2ZXJDbG9zZT0oKT0+e3RoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCl9LHRoaXMucHJlcGVuZChmKSx0aGlzLl9zcmM9Zn0pfWNsb3NlKCl7dGhpcy5fc3JjJiZ0aGlzLl9zcmMub3V0Z29pbmcuZW5kKCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX3NpbmsuY3VycmVudFRpbWV9cGxheSgpe3JldHVybiB0aGlzLl9zaW5rLnBsYXkoKX1wYXVzZSgpe3JldHVybiB0aGlzLl9zaW5rLnBhdXNlKCl9Z2V0IGJpdHJhdGUoKXtyZXR1cm4gdGhpcy5fc2luay5iaXRyYXRlfWdldCBmcmFtZXJhdGUoKXtyZXR1cm4gdGhpcy5fc2luay5mcmFtZXJhdGV9fTtjKCk7dmFyIF90PWNsYXNzIGV4dGVuZHMgYnR7Y29uc3RydWN0b3IodCl7bGV0e3dzOm4scnRzcDppLG1lZGlhRWxlbWVudDpvLGF1dGg6c309dDtzdXBlcihpKTtpZihzKXtsZXQgZj1uZXcgTGUocyk7dGhpcy5pbnNlcnRCZWZvcmUodGhpcy5ydHNwLGYpfWxldCBhPW5ldyBUZShvKTthLm9uU291cmNlT3Blbj0oZixsKT0+e3RoaXMudHJhY2tzPWwsdGhpcy5vblNvdXJjZU9wZW4mJnRoaXMub25Tb3VyY2VPcGVuKGYsbCl9LHRoaXMuYXBwZW5kKGEpLHRoaXMuX3Npbms9YTtsZXQgdT1HLm9wZW4obik7dGhpcy5yZWFkeT11LnRoZW4oZj0+e2Yub25TZXJ2ZXJDbG9zZT0oKT0+e3RoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCl9LHRoaXMucHJlcGVuZChmKSx0aGlzLl9zcmM9Zn0pfWNsb3NlKCl7dGhpcy5fc3JjJiZ0aGlzLl9zcmMub3V0Z29pbmcuZW5kKCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX3NpbmsuY3VycmVudFRpbWV9YXN5bmMgcGxheSgpe3JldHVybiBhd2FpdCB0aGlzLl9zaW5rLnBsYXkoKX1wYXVzZSgpe3JldHVybiB0aGlzLl9zaW5rLnBhdXNlKCl9fTtjKCk7dmFyIHFyPWNsYXNzIGV4dGVuZHMgX3R7Y29uc3RydWN0b3IoZSl7bGV0e21ldGFkYXRhSGFuZGxlcjp0fT1lO3N1cGVyKGUpO2xldCBuPW5ldyBDZTt0aGlzLmluc2VydEFmdGVyKHRoaXMucnRzcCxuKTtsZXQgaT1SLmZyb21IYW5kbGVycyhvPT57by50eXBlPT09OSYmdChvKX0sdm9pZCAwKTt0aGlzLmluc2VydEFmdGVyKG4saSl9fTtjKCk7dmFyIG5sPXtwYXJhbWV0ZXJzOltcImF1ZGlvPTBcIixcInZpZGVvPTBcIixcImV2ZW50PW9uXCIsXCJwdHo9YWxsXCJdfSxqcj1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQpe2xldHt3czpuLHJ0c3A6aSxtZXRhZGF0YUhhbmRsZXI6b309dDtzdXBlcihPYmplY3QuYXNzaWduKHt9LG5sLGkpKTtsZXQgcz1uZXcgQ2U7dGhpcy5hcHBlbmQocyk7bGV0IGE9US5mcm9tSGFuZGxlcihmPT57Zi50eXBlPT09OSYmbyhmKX0pO3RoaXMuYXBwZW5kKGEpO2xldCB1PUcub3BlbihuKTt0aGlzLnJlYWR5PXUudGhlbihmPT57Zi5vblNlcnZlckNsb3NlPSgpPT57dGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKX0sdGhpcy5wcmVwZW5kKGYpLHRoaXMuX3NyYz1mfSl9Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5vdXRnb2luZy5lbmQoKX19O2MoKTt2YXIgV3I9Y2xhc3MgZXh0ZW5kcyBlZXtjb25zdHJ1Y3Rvcih0KXtsZXR7d3M6bixydHNwOmksYXV0aDpvfT10O3N1cGVyKGkpO2lmKG8pe2xldCBhPW5ldyBMZShvKTt0aGlzLmluc2VydEJlZm9yZSh0aGlzLnJ0c3AsYSl9bGV0IHM9Ry5vcGVuKG4pO3RoaXMucmVhZHk9cy50aGVuKGE9PnthLm9uU2VydmVyQ2xvc2U9KCk9Pnt0aGlzLm9uU2VydmVyQ2xvc2UmJnRoaXMub25TZXJ2ZXJDbG9zZSgpfSx0aGlzLnByZXBlbmQoYSksdGhpcy5fc3JjPWF9KX1jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLm91dGdvaW5nLmVuZCgpfWdldCBzZHAoKXtyZXR1cm4gdGhpcy5yZWFkeS50aGVuKGFzeW5jKCk9PntsZXQgdD1uZXcgUHJvbWlzZShuPT57dGhpcy5ydHNwLm9uU2RwPW59KTtyZXR1cm4gdGhpcy5ydHNwLnNlbmQoe21ldGhvZDpcIkRFU0NSSUJFXCJ9KSx0aGlzLnJ0c3Auc2VuZCh7bWV0aG9kOlwiVEVBUkRPV05cIn0pLGF3YWl0IHR9KX19O2MoKTtjKCk7dmFyIG9hPUMobGUoKSk7dmFyIHNhPUMoTigpKTt2YXIgcmk9KDAsb2EuZGVmYXVsdCkoXCJtc2w6aHR0cC1tcDRcIiksJHI9Y2xhc3MgZXh0ZW5kcyBWe2NvbnN0cnVjdG9yKHQpe2xldHt1cmk6bixvcHRpb25zOml9PXQsbz1uZXcgc2EuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZDpmdW5jdGlvbigpe319KTtvLm9uKFwiZXJyb3JcIixzPT57Y29uc29sZS53YXJuKFwiY2xvc2luZyBzb2NrZXQgZHVlIHRvIGluY29taW5nIGVycm9yXCIscyksdGhpcy5fcmVhZGVyJiZ0aGlzLl9yZWFkZXIuY2FuY2VsKCl9KTtzdXBlcihvKTtvLl9yZWFkPSgpPT57dGhpcy5fcHVsbCgpfSx0aGlzLnVyaT1uLHRoaXMub3B0aW9ucz1pLHRoaXMuX2FsbERvbmU9ITF9cGxheSgpe2lmKHRoaXMudXJpPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCBzdGFydCBwbGF5aW5nIHdoZW4gdGhlcmUgaXMgbm8gVVJJXCIpO3RoaXMuX2Fib3J0Q29udHJvbGxlcj1uZXcgQWJvcnRDb250cm9sbGVyLHRoaXMubGVuZ3RoPTAsZmV0Y2godGhpcy51cmkse2NyZWRlbnRpYWxzOlwiaW5jbHVkZVwiLHNpZ25hbDp0aGlzLl9hYm9ydENvbnRyb2xsZXIuc2lnbmFsLC4uLnRoaXMub3B0aW9uc30pLnRoZW4odD0+e2lmKHQuYm9keT09PW51bGwpdGhyb3cgbmV3IEVycm9yKFwiZW1wdHkgcmVzcG9uc2UgYm9keVwiKTtsZXQgbj10LmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpO3RoaXMuaW5jb21pbmcucHVzaCh7ZGF0YTpCdWZmZXIuYWxsb2MoMCksdHlwZTo4LG1pbWU6bn0pLHRoaXMub25IZWFkZXJzJiZ0aGlzLm9uSGVhZGVycyh0LmhlYWRlcnMpLHRoaXMuX3JlYWRlcj10LmJvZHkuZ2V0UmVhZGVyKCksdGhpcy5fcHVsbCgpfSkuY2F0Y2godD0+e2NvbnNvbGUuZXJyb3IoXCJodHRwLXNvdXJjZTogZmV0Y2ggZmFpbGVkOiBcIix0KX0pfWFib3J0KCl7dGhpcy5fcmVhZGVyJiZ0aGlzLl9yZWFkZXIuY2FuY2VsKCkuY2F0Y2godD0+e2NvbnNvbGUubG9nKFwiaHR0cC1zb3VyY2U6IGNhbmNlbCByZWFkZXIgZmFpbGVkOiBcIix0KX0pLHRoaXMuX2Fib3J0Q29udHJvbGxlciYmdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCl9X2lzQ2xvc2VkKCl7cmV0dXJuIHRoaXMuX2FsbERvbmV9X2Nsb3NlKCl7dGhpcy5fcmVhZGVyPXZvaWQgMCx0aGlzLl9hbGxEb25lPSEwLHRoaXMuaW5jb21pbmcucHVzaChudWxsKSx0aGlzLm9uU2VydmVyQ2xvc2U/LigpfV9wdWxsKCl7dGhpcy5fcmVhZGVyIT09dm9pZCAwJiZ0aGlzLl9yZWFkZXIucmVhZCgpLnRoZW4oKHtkb25lOnQsdmFsdWU6bn0pPT57aWYodCl7dGhpcy5faXNDbG9zZWQoKXx8KHJpKFwiZmV0Y2ggY29tcGxldGVkLCB0b3RhbCBkb3dubG9hZGVkOiBcIix0aGlzLmxlbmd0aCxcIiBieXRlc1wiKSx0aGlzLl9jbG9zZSgpKTtyZXR1cm59aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCB2YWx1ZSB0byBiZSBkZWZpbmVkXCIpO2lmKHRoaXMubGVuZ3RoPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIGxlbmd0aCB0byBiZSBkZWZpbmVkXCIpO3RoaXMubGVuZ3RoKz1uLmxlbmd0aDtsZXQgaT1CdWZmZXIuZnJvbShuKTt0aGlzLmluY29taW5nLnB1c2goe2RhdGE6aSx0eXBlOjh9KT90aGlzLl9wdWxsKCk6cmkoXCJkb3duc3RyZWFtIGJhY2sgcHJlc3N1cmU6IHBhdXNpbmcgcmVhZFwiKX0pLmNhdGNoKHQ9PntyaShcImh0dHAtc291cmNlOiByZWFkIGZhaWxlZDogXCIsdCksdGhpcy5faXNDbG9zZWQoKXx8dGhpcy5fY2xvc2UoKX0pfX07dmFyIEdyPWNsYXNzIGV4dGVuZHMgQmV7Y29uc3RydWN0b3IodCl7bGV0e2h0dHA6bixtZWRpYUVsZW1lbnQ6aX09dCxvPW5ldyAkcihuKSxzPW5ldyBUZShpKTtvLm9uSGVhZGVycz1hPT57dGhpcy5vbkhlYWRlcnMmJnRoaXMub25IZWFkZXJzKGEpfSxvLm9uU2VydmVyQ2xvc2U9KCk9PnRoaXMub25TZXJ2ZXJDbG9zZT8uKCk7c3VwZXIobyxzKTt0aGlzLl9zcmM9byx0aGlzLl9zaW5rPXMsdGhpcy5odHRwPW99Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5hYm9ydCgpfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl9zaW5rLmN1cnJlbnRUaW1lfWFzeW5jIHBsYXkoKXtyZXR1cm4gYXdhaXQgdGhpcy5fc2luay5wbGF5KCl9cGF1c2UoKXtyZXR1cm4gdGhpcy5fc2luay5wYXVzZSgpfX07dmFyIGlpPXt9O1B0KGlpLHtSVENQUGFja2V0VHlwZTooKT0+S24sU0RFU0l0ZW06KCk9PkpuLFNSOigpPT5IcyxTY2hlZHVsZXI6KCk9PldlLGFkZFJUU1BSZXRyeTooKT0+YWEsYm9keU9mZnNldDooKT0+QXIsY1NyYzooKT0+bnMsY1NyY0NvdW50OigpPT5TZSxjb25uZWN0aW9uRW5kZWQ6KCk9PkxyLGNvbnRlbnRCYXNlOigpPT5Ccixjb250ZW50TG9jYXRpb246KCk9Pk1yLGV4dEhlYWRlcjooKT0+aXMsZXh0SGVhZGVyTGVuZ3RoOigpPT5NdCxleHRlbnNpb246KCk9Pm9yLGV4dHJhY3RIZWFkZXJWYWx1ZTooKT0+cmUsZXh0cmFjdFVSSXM6KCk9PkpzLGdldFRpbWU6KCk9PlByLGlzUnRjcEFwcDooKT0+JHMsaXNSdGNwQnllOigpPT53cixpc1J0Y3BSUjooKT0+anMsaXNSdGNwU0RFUzooKT0+V3MsaXNSdGNwU1I6KCk9Pl9yLG1hcmtlcjooKT0+Y2UsbWVzc2FnZUZyb21CdWZmZXI6KCk9PlNyLHBhZGRpbmc6KCk9PmVzLHBhcnNlOigpPT5RbixwYXJzZVJ0Y3A6KCk9PlhuLHBheWxvYWQ6KCk9PloscGF5bG9hZFR5cGU6KCk9Pk8scmFuZ2U6KCk9PklyLHJ0Y3BNZXNzYWdlRnJvbUJ1ZmZlcjooKT0+eHIsc1NyYzooKT0+cnMsc2VxdWVuY2U6KCk9PlJyLHNlcXVlbmNlTnVtYmVyOigpPT50cyxzZXNzaW9uSWQ6KCk9PlRyLHNlc3Npb25UaW1lb3V0OigpPT5DcixzdGF0dXNDb2RlOigpPT5odCx0aW1lc3RhbXA6KCk9PkgsdmVyc2lvbjooKT0+Wm99KTtjKCk7YygpO2MoKTt2YXIgYWE9KHIse21heFJldHJpZXM6ZSxlcnJvcnM6dH09e21heFJldHJpZXM6MjAsZXJyb3JzOls1MDNdfSk9PntsZXQgbj0wLGk9ci5vbkVycm9yO3Iub25FcnJvcj1vPT57aWYoaT8uKG8pLCEhdC5pbmNsdWRlcyhvLmNvZGUpKXtpZigobis9MSk+ZSl7Y29uc29sZS5sb2coXCJyZXRyeSwgdG9vIG1hbnlcIixuLGUpO3JldHVybn1zZXRUaW1lb3V0KCgpPT5yLnJldHJ5Py4oKSxuKjEwMCl9fX07XG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmNqcy5qcy5tYXBcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbnZhciBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0geyBfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICE9IG51bGwgJiZcbiAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKClcbiAgaWYgKHZhbHVlT2YgIT0gbnVsbCAmJiB2YWx1ZU9mICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB2YXIgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoXG4gICAgKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICApXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcbkJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbkJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IGJ1Zi53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgYnVmID0gYnVmLnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgdmFyIGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgYnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0IChvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoaXNJbnN0YW5jZShidWYsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBidWYgPSBCdWZmZXIuZnJvbShidWYpXG4gICAgfVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IGlzSW5zdGFuY2Uoc3RyaW5nLCBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc3RyaW5nXG4gICAgKVxuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpXG4gIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIH1cbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nXG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKClcbiAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aClcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldClcbiAgICApXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0IC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKVxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFVzZSBidWlsdC1pbiB3aGVuIGF2YWlsYWJsZSwgbWlzc2luZyBmcm9tIElFMTFcbiAgICB0aGlzLmNvcHlXaXRoaW4odGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpXG4gIH0gZWxzZSBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdXG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsIi8qIVxuICogIGhvd2xlci5qcyB2Mi4yLjFcbiAqICBob3dsZXJqcy5jb21cbiAqXG4gKiAgKGMpIDIwMTMtMjAyMCwgSmFtZXMgU2ltcHNvbiBvZiBHb2xkRmlyZSBTdHVkaW9zXG4gKiAgZ29sZGZpcmVzdHVkaW9zLmNvbVxuICpcbiAqICBNSVQgTGljZW5zZVxuICovXG5cbihmdW5jdGlvbigpIHtcblxuICAndXNlIHN0cmljdCc7XG5cbiAgLyoqIEdsb2JhbCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGdsb2JhbCBjb250cm9sbGVyLiBBbGwgY29udGFpbmVkIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgYXBwbHlcbiAgICogdG8gYWxsIHNvdW5kcyB0aGF0IGFyZSBjdXJyZW50bHkgcGxheWluZyBvciB3aWxsIGJlIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICB2YXIgSG93bGVyR2xvYmFsID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH07XG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIEhvd2xlciBvYmplY3QuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gQ3JlYXRlIGEgZ2xvYmFsIElEIGNvdW50ZXIuXG4gICAgICBzZWxmLl9jb3VudGVyID0gMTAwMDtcblxuICAgICAgLy8gUG9vbCBvZiB1bmxvY2tlZCBIVE1MNSBBdWRpbyBvYmplY3RzLlxuICAgICAgc2VsZi5faHRtbDVBdWRpb1Bvb2wgPSBbXTtcbiAgICAgIHNlbGYuaHRtbDVQb29sU2l6ZSA9IDEwO1xuXG4gICAgICAvLyBJbnRlcm5hbCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fY29kZWNzID0ge307XG4gICAgICBzZWxmLl9ob3dscyA9IFtdO1xuICAgICAgc2VsZi5fbXV0ZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuX3ZvbHVtZSA9IDE7XG4gICAgICBzZWxmLl9jYW5QbGF5RXZlbnQgPSAnY2FucGxheXRocm91Z2gnO1xuICAgICAgc2VsZi5fbmF2aWdhdG9yID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0b3IpID8gd2luZG93Lm5hdmlnYXRvciA6IG51bGw7XG5cbiAgICAgIC8vIFB1YmxpYyBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5tYXN0ZXJHYWluID0gbnVsbDtcbiAgICAgIHNlbGYubm9BdWRpbyA9IGZhbHNlO1xuICAgICAgc2VsZi51c2luZ1dlYkF1ZGlvID0gdHJ1ZTtcbiAgICAgIHNlbGYuYXV0b1N1c3BlbmQgPSB0cnVlO1xuICAgICAgc2VsZi5jdHggPSBudWxsO1xuXG4gICAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGUgYXV0byBhdWRpbyB1bmxvY2tlci5cbiAgICAgIHNlbGYuYXV0b1VubG9jayA9IHRydWU7XG5cbiAgICAgIC8vIFNldHVwIHRoZSB2YXJpb3VzIHN0YXRlIHZhbHVlcyBmb3IgZ2xvYmFsIHRyYWNraW5nLlxuICAgICAgc2VsZi5fc2V0dXAoKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIGdsb2JhbCB2b2x1bWUgZm9yIGFsbCBzb3VuZHMuXG4gICAgICogQHBhcmFtICB7RmxvYXR9IHZvbCBWb2x1bWUgZnJvbSAwLjAgdG8gMS4wLlxuICAgICAqIEByZXR1cm4ge0hvd2xlci9GbG9hdH0gICAgIFJldHVybnMgc2VsZiBvciBjdXJyZW50IHZvbHVtZS5cbiAgICAgKi9cbiAgICB2b2x1bWU6IGZ1bmN0aW9uKHZvbCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcbiAgICAgIHZvbCA9IHBhcnNlRmxvYXQodm9sKTtcblxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBBdWRpb0NvbnRleHQgY3JlYXRlZCB5ZXQsIHJ1biB0aGUgc2V0dXAuXG4gICAgICBpZiAoIXNlbGYuY3R4KSB7XG4gICAgICAgIHNldHVwQXVkaW9Db250ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygdm9sICE9PSAndW5kZWZpbmVkJyAmJiB2b2wgPj0gMCAmJiB2b2wgPD0gMSkge1xuICAgICAgICBzZWxmLl92b2x1bWUgPSB2b2w7XG5cbiAgICAgICAgLy8gRG9uJ3QgdXBkYXRlIGFueSBvZiB0aGUgbm9kZXMgaWYgd2UgYXJlIG11dGVkLlxuICAgICAgICBpZiAoc2VsZi5fbXV0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdoZW4gdXNpbmcgV2ViIEF1ZGlvLCB3ZSBqdXN0IG5lZWQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgZ2Fpbi5cbiAgICAgICAgaWYgKHNlbGYudXNpbmdXZWJBdWRpbykge1xuICAgICAgICAgIHNlbGYubWFzdGVyR2Fpbi5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYW5kIGNoYW5nZSB2b2x1bWUgZm9yIGFsbCBIVE1MNSBhdWRpbyBub2Rlcy5cbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICAgICAgICB2YXIgaWRzID0gc2VsZi5faG93bHNbaV0uX2dldFNvdW5kSWRzKCk7XG5cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCBjaGFuZ2UgdGhlIHZvbHVtZXMuXG4gICAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8aWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX2hvd2xzW2ldLl9zb3VuZEJ5SWQoaWRzW2pdKTtcblxuICAgICAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS52b2x1bWUgPSBzb3VuZC5fdm9sdW1lICogdm9sO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLl92b2x1bWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBtdXRpbmcgYW5kIHVubXV0aW5nIGdsb2JhbGx5LlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IG11dGVkIElzIG11dGVkIG9yIG5vdC5cbiAgICAgKi9cbiAgICBtdXRlOiBmdW5jdGlvbihtdXRlZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBBdWRpb0NvbnRleHQgY3JlYXRlZCB5ZXQsIHJ1biB0aGUgc2V0dXAuXG4gICAgICBpZiAoIXNlbGYuY3R4KSB7XG4gICAgICAgIHNldHVwQXVkaW9Db250ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX211dGVkID0gbXV0ZWQ7XG5cbiAgICAgIC8vIFdpdGggV2ViIEF1ZGlvLCB3ZSBqdXN0IG5lZWQgdG8gbXV0ZSB0aGUgbWFzdGVyIGdhaW4uXG4gICAgICBpZiAoc2VsZi51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgIHNlbGYubWFzdGVyR2Fpbi5nYWluLnNldFZhbHVlQXRUaW1lKG11dGVkID8gMCA6IHNlbGYuX3ZvbHVtZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbmQgbXV0ZSBhbGwgSFRNTDUgQXVkaW8gbm9kZXMuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAgICAgIHZhciBpZHMgPSBzZWxmLl9ob3dsc1tpXS5fZ2V0U291bmRJZHMoKTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCBtYXJrIHRoZSBhdWRpbyBub2RlIGFzIG11dGVkLlxuICAgICAgICAgIGZvciAodmFyIGo9MDsgajxpZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX2hvd2xzW2ldLl9zb3VuZEJ5SWQoaWRzW2pdKTtcblxuICAgICAgICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLm11dGVkID0gKG11dGVkKSA/IHRydWUgOiBzb3VuZC5fbXV0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgc3RvcHBpbmcgYWxsIHNvdW5kcyBnbG9iYWxseS5cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgSG93bHMgYW5kIHN0b3AgdGhlbS5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzZWxmLl9ob3dsc1tpXS5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbmxvYWQgYW5kIGRlc3Ryb3kgYWxsIGN1cnJlbnRseSBsb2FkZWQgSG93bCBvYmplY3RzLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgZm9yICh2YXIgaT1zZWxmLl9ob3dscy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7XG4gICAgICAgIHNlbGYuX2hvd2xzW2ldLnVubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgQXVkaW9Db250ZXh0IHRvIG1ha2Ugc3VyZSBpdCBpcyBmdWxseSByZXNldC5cbiAgICAgIGlmIChzZWxmLnVzaW5nV2ViQXVkaW8gJiYgc2VsZi5jdHggJiYgdHlwZW9mIHNlbGYuY3R4LmNsb3NlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLmN0eC5jbG9zZSgpO1xuICAgICAgICBzZWxmLmN0eCA9IG51bGw7XG4gICAgICAgIHNldHVwQXVkaW9Db250ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgY29kZWMgc3VwcG9ydCBvZiBzcGVjaWZpYyBleHRlbnNpb24uXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBleHQgQXVkaW8gZmlsZSBleHRlbnRpb24uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBjb2RlY3M6IGZ1bmN0aW9uKGV4dCkge1xuICAgICAgcmV0dXJuICh0aGlzIHx8IEhvd2xlcikuX2NvZGVjc1tleHQucmVwbGFjZSgvXngtLywgJycpXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0dXAgdmFyaW91cyBzdGF0ZSB2YWx1ZXMgZm9yIGdsb2JhbCB0cmFja2luZy5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX3NldHVwOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBzdXNwZW5kL3Jlc3VtZSBzdGF0ZSBvZiB0aGUgQXVkaW9Db250ZXh0LlxuICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY3R4ID8gc2VsZi5jdHguc3RhdGUgfHwgJ3N1c3BlbmRlZCcgOiAnc3VzcGVuZGVkJztcblxuICAgICAgLy8gQXV0b21hdGljYWxseSBiZWdpbiB0aGUgMzAtc2Vjb25kIHN1c3BlbmQgcHJvY2Vzc1xuICAgICAgc2VsZi5fYXV0b1N1c3BlbmQoKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYXVkaW8gaXMgYXZhaWxhYmxlLlxuICAgICAgaWYgKCFzZWxmLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgLy8gTm8gYXVkaW8gaXMgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtIGlmIG5vQXVkaW8gaXMgc2V0IHRvIHRydWUuXG4gICAgICAgIGlmICh0eXBlb2YgQXVkaW8gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciB0ZXN0ID0gbmV3IEF1ZGlvKCk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjYW5wbGF5dGhyb3VnaCBldmVudCBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRlc3Qub25jYW5wbGF5dGhyb3VnaCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgc2VsZi5fY2FuUGxheUV2ZW50ID0gJ2NhbnBsYXknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgc2VsZi5ub0F1ZGlvID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5ub0F1ZGlvID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUZXN0IHRvIG1ha2Ugc3VyZSBhdWRpbyBpc24ndCBkaXNhYmxlZCBpbiBJbnRlcm5ldCBFeHBsb3Jlci5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB0ZXN0ID0gbmV3IEF1ZGlvKCk7XG4gICAgICAgIGlmICh0ZXN0Lm11dGVkKSB7XG4gICAgICAgICAgc2VsZi5ub0F1ZGlvID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgLy8gQ2hlY2sgZm9yIHN1cHBvcnRlZCBjb2RlY3MuXG4gICAgICBpZiAoIXNlbGYubm9BdWRpbykge1xuICAgICAgICBzZWxmLl9zZXR1cENvZGVjcygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgZm9yIGJyb3dzZXIgc3VwcG9ydCBmb3IgdmFyaW91cyBjb2RlY3MgYW5kIGNhY2hlIHRoZSByZXN1bHRzLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfc2V0dXBDb2RlY3M6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcbiAgICAgIHZhciBhdWRpb1Rlc3QgPSBudWxsO1xuXG4gICAgICAvLyBNdXN0IHdyYXAgaW4gYSB0cnkvY2F0Y2ggYmVjYXVzZSBJRTExIGluIHNlcnZlciBtb2RlIHRocm93cyBhbiBlcnJvci5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF1ZGlvVGVzdCA9ICh0eXBlb2YgQXVkaW8gIT09ICd1bmRlZmluZWQnKSA/IG5ldyBBdWRpbygpIDogbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhdWRpb1Rlc3QgfHwgdHlwZW9mIGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgdmFyIG1wZWdUZXN0ID0gYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tcGVnOycpLnJlcGxhY2UoL15ubyQvLCAnJyk7XG5cbiAgICAgIC8vIE9wZXJhIHZlcnNpb24gPDMzIGhhcyBtaXhlZCBNUDMgc3VwcG9ydCwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgYW5kIGJsb2NrIGl0LlxuICAgICAgdmFyIGNoZWNrT3BlcmEgPSBzZWxmLl9uYXZpZ2F0b3IgJiYgc2VsZi5fbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT1BSXFwvKFswLTZdLikvZyk7XG4gICAgICB2YXIgaXNPbGRPcGVyYSA9IChjaGVja09wZXJhICYmIHBhcnNlSW50KGNoZWNrT3BlcmFbMF0uc3BsaXQoJy8nKVsxXSwgMTApIDwgMzMpO1xuXG4gICAgICBzZWxmLl9jb2RlY3MgPSB7XG4gICAgICAgIG1wMzogISEoIWlzT2xkT3BlcmEgJiYgKG1wZWdUZXN0IHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbXAzOycpLnJlcGxhY2UoL15ubyQvLCAnJykpKSxcbiAgICAgICAgbXBlZzogISFtcGVnVGVzdCxcbiAgICAgICAgb3B1czogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL29nZzsgY29kZWNzPVwib3B1c1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgb2dnOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vb2dnOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG9nYTogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL29nZzsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICB3YXY6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2F2OyBjb2RlY3M9XCIxXCInKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3dhdicpKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBhYWM6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgY2FmOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1jYWY7JykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgbTRhOiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtbTRhOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbTRhOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vYWFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBtNGI6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1tNGI7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tNGI7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG1wNDogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LW1wNDsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wNDsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKSkucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgd2ViYTogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3dlYm07IGNvZGVjcz1cInZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgd2VibTogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3dlYm07IGNvZGVjcz1cInZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgZG9sYnk6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tcDQ7IGNvZGVjcz1cImVjLTNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIGZsYWM6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1mbGFjOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vZmxhYzsnKSkucmVwbGFjZSgvXm5vJC8sICcnKVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNvbWUgYnJvd3NlcnMvZGV2aWNlcyB3aWxsIG9ubHkgYWxsb3cgYXVkaW8gdG8gYmUgcGxheWVkIGFmdGVyIGEgdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgKiBBdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgdW5sb2NrIGF1ZGlvIG9uIHRoZSBmaXJzdCB1c2VyIGludGVyYWN0aW9uLlxuICAgICAqIENvbmNlcHQgZnJvbTogaHR0cDovL3BhdWxiYWthdXMuY29tL3R1dG9yaWFscy9odG1sNS93ZWItYXVkaW8tb24taW9zL1xuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfdW5sb2NrQXVkaW86IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gT25seSBydW4gdGhpcyBpZiBXZWIgQXVkaW8gaXMgc3VwcG9ydGVkIGFuZCBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHVubG9ja2VkLlxuICAgICAgaWYgKHNlbGYuX2F1ZGlvVW5sb2NrZWQgfHwgIXNlbGYuY3R4KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VsZi5fYXVkaW9VbmxvY2tlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5hdXRvVW5sb2NrID0gZmFsc2U7XG5cbiAgICAgIC8vIFNvbWUgbW9iaWxlIGRldmljZXMvcGxhdGZvcm1zIGhhdmUgZGlzdG9ydGlvbiBpc3N1ZXMgd2hlbiBvcGVuaW5nL2Nsb3NpbmcgdGFicyBhbmQvb3Igd2ViIHZpZXdzLlxuICAgICAgLy8gQnVncyBpbiB0aGUgYnJvd3NlciAoZXNwZWNpYWxseSBNb2JpbGUgU2FmYXJpKSBjYW4gY2F1c2UgdGhlIHNhbXBsZVJhdGUgdG8gY2hhbmdlIGZyb20gNDQxMDAgdG8gNDgwMDAuXG4gICAgICAvLyBCeSBjYWxsaW5nIEhvd2xlci51bmxvYWQoKSwgd2UgY3JlYXRlIGEgbmV3IEF1ZGlvQ29udGV4dCB3aXRoIHRoZSBjb3JyZWN0IHNhbXBsZVJhdGUuXG4gICAgICBpZiAoIXNlbGYuX21vYmlsZVVubG9hZGVkICYmIHNlbGYuY3R4LnNhbXBsZVJhdGUgIT09IDQ0MTAwKSB7XG4gICAgICAgIHNlbGYuX21vYmlsZVVubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgc2VsZi51bmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2NyYXRjaCBidWZmZXIgZm9yIGVuYWJsaW5nIGlPUyB0byBkaXNwb3NlIG9mIHdlYiBhdWRpbyBidWZmZXJzIGNvcnJlY3RseSwgYXMgcGVyOlxuICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNDExOTY4NFxuICAgICAgc2VsZi5fc2NyYXRjaEJ1ZmZlciA9IHNlbGYuY3R4LmNyZWF0ZUJ1ZmZlcigxLCAxLCAyMjA1MCk7XG5cbiAgICAgIC8vIENhbGwgdGhpcyBtZXRob2Qgb24gdG91Y2ggc3RhcnQgdG8gY3JlYXRlIGFuZCBwbGF5IGEgYnVmZmVyLFxuICAgICAgLy8gdGhlbiBjaGVjayBpZiB0aGUgYXVkaW8gYWN0dWFsbHkgcGxheWVkIHRvIGRldGVybWluZSBpZlxuICAgICAgLy8gYXVkaW8gaGFzIG5vdyBiZWVuIHVubG9ja2VkIG9uIGlPUywgQW5kcm9pZCwgZXRjLlxuICAgICAgdmFyIHVubG9jayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgcG9vbCBvZiB1bmxvY2tlZCBIVE1MNSBBdWRpbyBvYmplY3RzIHRoYXQgY2FuXG4gICAgICAgIC8vIGJlIHVzZWQgZm9yIHBsYXlpbmcgc291bmRzIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbi4gSFRNTDVcbiAgICAgICAgLy8gQXVkaW8gb2JqZWN0cyBtdXN0IGJlIGluZGl2aWR1YWxseSB1bmxvY2tlZCwgYXMgb3Bwb3NlZFxuICAgICAgICAvLyB0byB0aGUgV2ViQXVkaW8gQVBJIHdoaWNoIG9ubHkgbmVlZHMgYSBzaW5nbGUgYWN0aXZhdGlvbi5cbiAgICAgICAgLy8gVGhpcyBtdXN0IG9jY3VyIGJlZm9yZSBXZWJBdWRpbyBzZXR1cCBvciB0aGUgc291cmNlLm9uZW5kZWRcbiAgICAgICAgLy8gZXZlbnQgd2lsbCBub3QgZmlyZS5cbiAgICAgICAgd2hpbGUgKHNlbGYuX2h0bWw1QXVkaW9Qb29sLmxlbmd0aCA8IHNlbGYuaHRtbDVQb29sU2l6ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgYXVkaW9Ob2RlID0gbmV3IEF1ZGlvKCk7XG5cbiAgICAgICAgICAgIC8vIE1hcmsgdGhpcyBBdWRpbyBvYmplY3QgYXMgdW5sb2NrZWQgdG8gZW5zdXJlIGl0IGNhbiBnZXQgcmV0dXJuZWRcbiAgICAgICAgICAgIC8vIHRvIHRoZSB1bmxvY2tlZCBwb29sIHdoZW4gcmVsZWFzZWQuXG4gICAgICAgICAgICBhdWRpb05vZGUuX3VubG9ja2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBhdWRpbyBub2RlIHRvIHRoZSBwb29sLlxuICAgICAgICAgICAgc2VsZi5fcmVsZWFzZUh0bWw1QXVkaW8oYXVkaW9Ob2RlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFueSBhc3NpZ25lZCBhdWRpbyBub2RlcyBhbmQgdW5sb2NrIHRoZW0uXG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghc2VsZi5faG93bHNbaV0uX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2hvd2xzW2ldLl9nZXRTb3VuZElkcygpO1xuXG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHNvdW5kcyBhbmQgdW5sb2NrIHRoZSBhdWRpbyBub2Rlcy5cbiAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxpZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5faG93bHNbaV0uX3NvdW5kQnlJZChpZHNbal0pO1xuXG4gICAgICAgICAgICAgIGlmIChzb3VuZCAmJiBzb3VuZC5fbm9kZSAmJiAhc291bmQuX25vZGUuX3VubG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUuX3VubG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5sb2FkKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXggQW5kcm9pZCBjYW4gbm90IHBsYXkgaW4gc3VzcGVuZCBzdGF0ZS5cbiAgICAgICAgc2VsZi5fYXV0b1Jlc3VtZSgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBidWZmZXIuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWxmLmN0eC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcbiAgICAgICAgc291cmNlLmJ1ZmZlciA9IHNlbGYuX3NjcmF0Y2hCdWZmZXI7XG4gICAgICAgIHNvdXJjZS5jb25uZWN0KHNlbGYuY3R4LmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAvLyBQbGF5IHRoZSBlbXB0eSBidWZmZXIuXG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlLnN0YXJ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHNvdXJjZS5ub3RlT24oMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc291cmNlLnN0YXJ0KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbGluZyByZXN1bWUoKSBvbiBhIHN0YWNrIGluaXRpYXRlZCBieSB1c2VyIGdlc3R1cmUgaXMgd2hhdCBhY3R1YWxseSB1bmxvY2tzIHRoZSBhdWRpbyBvbiBBbmRyb2lkIENocm9tZSA+PSA1NS5cbiAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmN0eC5yZXN1bWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzZWxmLmN0eC5yZXN1bWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldHVwIGEgdGltZW91dCB0byBjaGVjayB0aGF0IHdlIGFyZSB1bmxvY2tlZCBvbiB0aGUgbmV4dCBldmVudCBsb29wLlxuICAgICAgICBzb3VyY2Uub25lbmRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNvdXJjZS5kaXNjb25uZWN0KDApO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmxvY2tlZCBzdGF0ZSBhbmQgcHJldmVudCB0aGlzIGNoZWNrIGZyb20gaGFwcGVuaW5nIGFnYWluLlxuICAgICAgICAgIHNlbGYuX2F1ZGlvVW5sb2NrZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0b3VjaCBzdGFydCBsaXN0ZW5lci5cbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdW5sb2NrLCB0cnVlKTtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHVubG9jaywgdHJ1ZSk7XG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bmxvY2ssIHRydWUpO1xuXG4gICAgICAgICAgLy8gTGV0IGFsbCBzb3VuZHMga25vdyB0aGF0IGF1ZGlvIGhhcyBiZWVuIHVubG9ja2VkLlxuICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2VsZi5faG93bHNbaV0uX2VtaXQoJ3VubG9jaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldHVwIGEgdG91Y2ggc3RhcnQgbGlzdGVuZXIgdG8gYXR0ZW1wdCBhbiB1bmxvY2sgaW4uXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdW5sb2NrLCB0cnVlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdW5sb2NrLCB0cnVlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdW5sb2NrLCB0cnVlKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhbiB1bmxvY2tlZCBIVE1MNSBBdWRpbyBvYmplY3QgZnJvbSB0aGUgcG9vbC4gSWYgbm9uZSBhcmUgbGVmdCxcbiAgICAgKiByZXR1cm4gYSBuZXcgQXVkaW8gb2JqZWN0IGFuZCB0aHJvdyBhIHdhcm5pbmcuXG4gICAgICogQHJldHVybiB7QXVkaW99IEhUTUw1IEF1ZGlvIG9iamVjdC5cbiAgICAgKi9cbiAgICBfb2J0YWluSHRtbDVBdWRpbzogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIG5leHQgb2JqZWN0IGZyb20gdGhlIHBvb2wgaWYgb25lIGV4aXN0cy5cbiAgICAgIGlmIChzZWxmLl9odG1sNUF1ZGlvUG9vbC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX2h0bWw1QXVkaW9Qb29sLnBvcCgpO1xuICAgICAgfVxuXG4gICAgICAvLy5DaGVjayBpZiB0aGUgYXVkaW8gaXMgbG9ja2VkIGFuZCB0aHJvdyBhIHdhcm5pbmcuXG4gICAgICB2YXIgdGVzdFBsYXkgPSBuZXcgQXVkaW8oKS5wbGF5KCk7XG4gICAgICBpZiAodGVzdFBsYXkgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmICh0ZXN0UGxheSBpbnN0YW5jZW9mIFByb21pc2UgfHwgdHlwZW9mIHRlc3RQbGF5LnRoZW4gPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRlc3RQbGF5LmNhdGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignSFRNTDUgQXVkaW8gcG9vbCBleGhhdXN0ZWQsIHJldHVybmluZyBwb3RlbnRpYWxseSBsb2NrZWQgYXVkaW8gb2JqZWN0LicpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBBdWRpbygpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gYWN0aXZhdGVkIEhUTUw1IEF1ZGlvIG9iamVjdCB0byB0aGUgcG9vbC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX3JlbGVhc2VIdG1sNUF1ZGlvOiBmdW5jdGlvbihhdWRpbykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gRG9uJ3QgYWRkIGF1ZGlvIHRvIHRoZSBwb29sIGlmIHdlIGRvbid0IGtub3cgaWYgaXQgaGFzIGJlZW4gdW5sb2NrZWQuXG4gICAgICBpZiAoYXVkaW8uX3VubG9ja2VkKSB7XG4gICAgICAgIHNlbGYuX2h0bWw1QXVkaW9Qb29sLnB1c2goYXVkaW8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXV0b21hdGljYWxseSBzdXNwZW5kIHRoZSBXZWIgQXVkaW8gQXVkaW9Db250ZXh0IGFmdGVyIG5vIHNvdW5kIGhhcyBwbGF5ZWQgZm9yIDMwIHNlY29uZHMuXG4gICAgICogVGhpcyBzYXZlcyBwcm9jZXNzaW5nL2VuZXJneSBhbmQgZml4ZXMgdmFyaW91cyBicm93c2VyLXNwZWNpZmljIGJ1Z3Mgd2l0aCBhdWRpbyBnZXR0aW5nIHN0dWNrLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfYXV0b1N1c3BlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoIXNlbGYuYXV0b1N1c3BlbmQgfHwgIXNlbGYuY3R4IHx8IHR5cGVvZiBzZWxmLmN0eC5zdXNwZW5kID09PSAndW5kZWZpbmVkJyB8fCAhSG93bGVyLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBhbnkgc291bmRzIGFyZSBwbGF5aW5nLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8c2VsZi5faG93bHNbaV0uX3NvdW5kcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fc291bmRzW2pdLl9wYXVzZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9zdXNwZW5kVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3N1c3BlbmRUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIHNvdW5kIGhhcyBwbGF5ZWQgYWZ0ZXIgMzAgc2Vjb25kcywgc3VzcGVuZCB0aGUgY29udGV4dC5cbiAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghc2VsZi5hdXRvU3VzcGVuZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IG51bGw7XG4gICAgICAgIHNlbGYuc3RhdGUgPSAnc3VzcGVuZGluZyc7XG5cbiAgICAgICAgLy8gSGFuZGxlIHVwZGF0aW5nIHRoZSBzdGF0ZSBvZiB0aGUgYXVkaW8gY29udGV4dCBhZnRlciBzdXNwZW5kaW5nLlxuICAgICAgICB2YXIgaGFuZGxlU3VzcGVuc2lvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuc3RhdGUgPSAnc3VzcGVuZGVkJztcblxuICAgICAgICAgIGlmIChzZWxmLl9yZXN1bWVBZnRlclN1c3BlbmQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzZWxmLl9yZXN1bWVBZnRlclN1c3BlbmQ7XG4gICAgICAgICAgICBzZWxmLl9hdXRvUmVzdW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEVpdGhlciB0aGUgc3RhdGUgZ2V0cyBzdXNwZW5kZWQgb3IgaXQgaXMgaW50ZXJydXB0ZWQuXG4gICAgICAgIC8vIEVpdGhlciB3YXksIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzdGF0ZSB0byBzdXNwZW5kZWQuXG4gICAgICAgIHNlbGYuY3R4LnN1c3BlbmQoKS50aGVuKGhhbmRsZVN1c3BlbnNpb24sIGhhbmRsZVN1c3BlbnNpb24pO1xuICAgICAgfSwgMzAwMDApO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXV0b21hdGljYWxseSByZXN1bWUgdGhlIFdlYiBBdWRpbyBBdWRpb0NvbnRleHQgd2hlbiBhIG5ldyBzb3VuZCBpcyBwbGF5ZWQuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9hdXRvUmVzdW1lOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKCFzZWxmLmN0eCB8fCB0eXBlb2Ygc2VsZi5jdHgucmVzdW1lID09PSAndW5kZWZpbmVkJyB8fCAhSG93bGVyLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gJ3J1bm5pbmcnICYmIHNlbGYuY3R4LnN0YXRlICE9PSAnaW50ZXJydXB0ZWQnICYmIHNlbGYuX3N1c3BlbmRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fc3VzcGVuZFRpbWVyKTtcbiAgICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcgfHwgc2VsZi5zdGF0ZSA9PT0gJ3J1bm5pbmcnICYmIHNlbGYuY3R4LnN0YXRlID09PSAnaW50ZXJydXB0ZWQnKSB7XG4gICAgICAgIHNlbGYuY3R4LnJlc3VtZSgpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5zdGF0ZSA9ICdydW5uaW5nJztcblxuICAgICAgICAgIC8vIEVtaXQgdG8gYWxsIEhvd2xzIHRoYXQgdGhlIGF1ZGlvIGhhcyByZXN1bWVkLlxuICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2VsZi5faG93bHNbaV0uX2VtaXQoJ3Jlc3VtZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNlbGYuX3N1c3BlbmRUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChzZWxmLl9zdXNwZW5kVGltZXIpO1xuICAgICAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5zdGF0ZSA9PT0gJ3N1c3BlbmRpbmcnKSB7XG4gICAgICAgIHNlbGYuX3Jlc3VtZUFmdGVyU3VzcGVuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXR1cCB0aGUgZ2xvYmFsIGF1ZGlvIGNvbnRyb2xsZXIuXG4gIHZhciBIb3dsZXIgPSBuZXcgSG93bGVyR2xvYmFsKCk7XG5cbiAgLyoqIEdyb3VwIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBhdWRpbyBncm91cCBjb250cm9sbGVyLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbyBQYXNzZWQgaW4gcHJvcGVydGllcyBmb3IgdGhpcyBncm91cC5cbiAgICovXG4gIHZhciBIb3dsID0gZnVuY3Rpb24obykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFRocm93IGFuIGVycm9yIGlmIG5vIHNvdXJjZSBpcyBwcm92aWRlZC5cbiAgICBpZiAoIW8uc3JjIHx8IG8uc3JjLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcignQW4gYXJyYXkgb2Ygc291cmNlIGZpbGVzIG11c3QgYmUgcGFzc2VkIHdpdGggYW55IG5ldyBIb3dsLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlbGYuaW5pdChvKTtcbiAgfTtcbiAgSG93bC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBIb3dsIGdyb3VwIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IG8gUGFzc2VkIGluIHByb3BlcnRpZXMgZm9yIHRoaXMgZ3JvdXAuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gQXVkaW9Db250ZXh0IGNyZWF0ZWQgeWV0LCBydW4gdGhlIHNldHVwLlxuICAgICAgaWYgKCFIb3dsZXIuY3R4KSB7XG4gICAgICAgIHNldHVwQXVkaW9Db250ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIHVzZXItZGVmaW5lZCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9hdXRvcGxheSA9IG8uYXV0b3BsYXkgfHwgZmFsc2U7XG4gICAgICBzZWxmLl9mb3JtYXQgPSAodHlwZW9mIG8uZm9ybWF0ICE9PSAnc3RyaW5nJykgPyBvLmZvcm1hdCA6IFtvLmZvcm1hdF07XG4gICAgICBzZWxmLl9odG1sNSA9IG8uaHRtbDUgfHwgZmFsc2U7XG4gICAgICBzZWxmLl9tdXRlZCA9IG8ubXV0ZSB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX2xvb3AgPSBvLmxvb3AgfHwgZmFsc2U7XG4gICAgICBzZWxmLl9wb29sID0gby5wb29sIHx8IDU7XG4gICAgICBzZWxmLl9wcmVsb2FkID0gKHR5cGVvZiBvLnByZWxvYWQgPT09ICdib29sZWFuJyB8fCBvLnByZWxvYWQgPT09ICdtZXRhZGF0YScpID8gby5wcmVsb2FkIDogdHJ1ZTtcbiAgICAgIHNlbGYuX3JhdGUgPSBvLnJhdGUgfHwgMTtcbiAgICAgIHNlbGYuX3Nwcml0ZSA9IG8uc3ByaXRlIHx8IHt9O1xuICAgICAgc2VsZi5fc3JjID0gKHR5cGVvZiBvLnNyYyAhPT0gJ3N0cmluZycpID8gby5zcmMgOiBbby5zcmNdO1xuICAgICAgc2VsZi5fdm9sdW1lID0gby52b2x1bWUgIT09IHVuZGVmaW5lZCA/IG8udm9sdW1lIDogMTtcbiAgICAgIHNlbGYuX3hociA9IHtcbiAgICAgICAgbWV0aG9kOiBvLnhociAmJiBvLnhoci5tZXRob2QgPyBvLnhoci5tZXRob2QgOiAnR0VUJyxcbiAgICAgICAgaGVhZGVyczogby54aHIgJiYgby54aHIuaGVhZGVycyA/IG8ueGhyLmhlYWRlcnMgOiBudWxsLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IG8ueGhyICYmIG8ueGhyLndpdGhDcmVkZW50aWFscyA/IG8ueGhyLndpdGhDcmVkZW50aWFscyA6IGZhbHNlLFxuICAgICAgfTtcblxuICAgICAgLy8gU2V0dXAgYWxsIG90aGVyIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX2R1cmF0aW9uID0gMDtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgIHNlbGYuX3NvdW5kcyA9IFtdO1xuICAgICAgc2VsZi5fZW5kVGltZXJzID0ge307XG4gICAgICBzZWxmLl9xdWV1ZSA9IFtdO1xuICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcblxuICAgICAgLy8gU2V0dXAgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgc2VsZi5fb25lbmQgPSBvLm9uZW5kID8gW3tmbjogby5vbmVuZH1dIDogW107XG4gICAgICBzZWxmLl9vbmZhZGUgPSBvLm9uZmFkZSA/IFt7Zm46IG8ub25mYWRlfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ubG9hZCA9IG8ub25sb2FkID8gW3tmbjogby5vbmxvYWR9XSA6IFtdO1xuICAgICAgc2VsZi5fb25sb2FkZXJyb3IgPSBvLm9ubG9hZGVycm9yID8gW3tmbjogby5vbmxvYWRlcnJvcn1dIDogW107XG4gICAgICBzZWxmLl9vbnBsYXllcnJvciA9IG8ub25wbGF5ZXJyb3IgPyBbe2ZuOiBvLm9ucGxheWVycm9yfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucGF1c2UgPSBvLm9ucGF1c2UgPyBbe2ZuOiBvLm9ucGF1c2V9XSA6IFtdO1xuICAgICAgc2VsZi5fb25wbGF5ID0gby5vbnBsYXkgPyBbe2ZuOiBvLm9ucGxheX1dIDogW107XG4gICAgICBzZWxmLl9vbnN0b3AgPSBvLm9uc3RvcCA/IFt7Zm46IG8ub25zdG9wfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ubXV0ZSA9IG8ub25tdXRlID8gW3tmbjogby5vbm11dGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb252b2x1bWUgPSBvLm9udm9sdW1lID8gW3tmbjogby5vbnZvbHVtZX1dIDogW107XG4gICAgICBzZWxmLl9vbnJhdGUgPSBvLm9ucmF0ZSA/IFt7Zm46IG8ub25yYXRlfV0gOiBbXTtcbiAgICAgIHNlbGYuX29uc2VlayA9IG8ub25zZWVrID8gW3tmbjogby5vbnNlZWt9XSA6IFtdO1xuICAgICAgc2VsZi5fb251bmxvY2sgPSBvLm9udW5sb2NrID8gW3tmbjogby5vbnVubG9ja31dIDogW107XG4gICAgICBzZWxmLl9vbnJlc3VtZSA9IFtdO1xuXG4gICAgICAvLyBXZWIgQXVkaW8gb3IgSFRNTDUgQXVkaW8/XG4gICAgICBzZWxmLl93ZWJBdWRpbyA9IEhvd2xlci51c2luZ1dlYkF1ZGlvICYmICFzZWxmLl9odG1sNTtcblxuICAgICAgLy8gQXV0b21hdGljYWxseSB0cnkgdG8gZW5hYmxlIGF1ZGlvLlxuICAgICAgaWYgKHR5cGVvZiBIb3dsZXIuY3R4ICE9PSAndW5kZWZpbmVkJyAmJiBIb3dsZXIuY3R4ICYmIEhvd2xlci5hdXRvVW5sb2NrKSB7XG4gICAgICAgIEhvd2xlci5fdW5sb2NrQXVkaW8oKTtcbiAgICAgIH1cblxuICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGlzIEhvd2wgZ3JvdXAgaW4gdGhlIGdsb2JhbCBjb250cm9sbGVyLlxuICAgICAgSG93bGVyLl9ob3dscy5wdXNoKHNlbGYpO1xuXG4gICAgICAvLyBJZiB0aGV5IHNlbGVjdGVkIGF1dG9wbGF5LCBhZGQgYSBwbGF5IGV2ZW50IHRvIHRoZSBsb2FkIHF1ZXVlLlxuICAgICAgaWYgKHNlbGYuX2F1dG9wbGF5KSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAncGxheScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYucGxheSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgdGhlIHNvdXJjZSBmaWxlIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLlxuICAgICAgaWYgKHNlbGYuX3ByZWxvYWQgJiYgc2VsZi5fcHJlbG9hZCAhPT0gJ25vbmUnKSB7XG4gICAgICAgIHNlbGYubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgYXVkaW8gZmlsZS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgdXJsID0gbnVsbDtcblxuICAgICAgLy8gSWYgbm8gYXVkaW8gaXMgYXZhaWxhYmxlLCBxdWl0IGltbWVkaWF0ZWx5LlxuICAgICAgaWYgKEhvd2xlci5ub0F1ZGlvKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdObyBhdWRpbyBzdXBwb3J0LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSBvdXIgc291cmNlIGlzIGluIGFuIGFycmF5LlxuICAgICAgaWYgKHR5cGVvZiBzZWxmLl9zcmMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNlbGYuX3NyYyA9IFtzZWxmLl9zcmNdO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHNvdXJjZXMgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIGNvbXBhdGlibGUuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc3JjLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBleHQsIHN0cjtcblxuICAgICAgICBpZiAoc2VsZi5fZm9ybWF0ICYmIHNlbGYuX2Zvcm1hdFtpXSkge1xuICAgICAgICAgIC8vIElmIGFuIGV4dGVuc2lvbiB3YXMgc3BlY2lmaWVkLCB1c2UgdGhhdCBpbnN0ZWFkLlxuICAgICAgICAgIGV4dCA9IHNlbGYuX2Zvcm1hdFtpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHNvdXJjZSBpcyBhIHN0cmluZy5cbiAgICAgICAgICBzdHIgPSBzZWxmLl9zcmNbaV07XG4gICAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnTm9uLXN0cmluZyBmb3VuZCBpbiBzZWxlY3RlZCBhdWRpbyBzb3VyY2VzIC0gaWdub3JpbmcuJyk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBmaWxlIGV4dGVuc2lvbiBmcm9tIHRoZSBVUkwgb3IgYmFzZTY0IGRhdGEgVVJJLlxuICAgICAgICAgIGV4dCA9IC9eZGF0YTphdWRpb1xcLyhbXjssXSspOy9pLmV4ZWMoc3RyKTtcbiAgICAgICAgICBpZiAoIWV4dCkge1xuICAgICAgICAgICAgZXh0ID0gL1xcLihbXi5dKykkLy5leGVjKHN0ci5zcGxpdCgnPycsIDEpWzBdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICBleHQgPSBleHRbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2cgYSB3YXJuaW5nIGlmIG5vIGV4dGVuc2lvbiB3YXMgZm91bmQuXG4gICAgICAgIGlmICghZXh0KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdObyBmaWxlIGV4dGVuc2lvbiB3YXMgZm91bmQuIENvbnNpZGVyIHVzaW5nIHRoZSBcImZvcm1hdFwiIHByb3BlcnR5IG9yIHNwZWNpZnkgYW4gZXh0ZW5zaW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBleHRlbnNpb24gaXMgYXZhaWxhYmxlLlxuICAgICAgICBpZiAoZXh0ICYmIEhvd2xlci5jb2RlY3MoZXh0KSkge1xuICAgICAgICAgIHVybCA9IHNlbGYuX3NyY1tpXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnTm8gY29kZWMgc3VwcG9ydCBmb3Igc2VsZWN0ZWQgYXVkaW8gc291cmNlcy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9zcmMgPSB1cmw7XG4gICAgICBzZWxmLl9zdGF0ZSA9ICdsb2FkaW5nJztcblxuICAgICAgLy8gSWYgdGhlIGhvc3RpbmcgcGFnZSBpcyBIVFRQUyBhbmQgdGhlIHNvdXJjZSBpc24ndCxcbiAgICAgIC8vIGRyb3AgZG93biB0byBIVE1MNSBBdWRpbyB0byBhdm9pZCBNaXhlZCBDb250ZW50IGVycm9ycy5cbiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonICYmIHVybC5zbGljZSgwLCA1KSA9PT0gJ2h0dHA6Jykge1xuICAgICAgICBzZWxmLl9odG1sNSA9IHRydWU7XG4gICAgICAgIHNlbGYuX3dlYkF1ZGlvID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzb3VuZCBvYmplY3QgYW5kIGFkZCBpdCB0byB0aGUgcG9vbC5cbiAgICAgIG5ldyBTb3VuZChzZWxmKTtcblxuICAgICAgLy8gTG9hZCBhbmQgZGVjb2RlIHRoZSBhdWRpbyBkYXRhIGZvciBwbGF5YmFjay5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICBsb2FkQnVmZmVyKHNlbGYpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGxheSBhIHNvdW5kIG9yIHJlc3VtZSBwcmV2aW91cyBwbGF5YmFjay5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmcvTnVtYmVyfSBzcHJpdGUgICBTcHJpdGUgbmFtZSBmb3Igc3ByaXRlIHBsYXliYWNrIG9yIHNvdW5kIGlkIHRvIGNvbnRpbnVlIHByZXZpb3VzLlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IGludGVybmFsIEludGVybmFsIFVzZTogdHJ1ZSBwcmV2ZW50cyBldmVudCBmaXJpbmcuXG4gICAgICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICBTb3VuZCBJRC5cbiAgICAgKi9cbiAgICBwbGF5OiBmdW5jdGlvbihzcHJpdGUsIGludGVybmFsKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgaWQgPSBudWxsO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgaWYgYSBzcHJpdGUsIHNvdW5kIGlkIG9yIG5vdGhpbmcgd2FzIHBhc3NlZFxuICAgICAgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlkID0gc3ByaXRlO1xuICAgICAgICBzcHJpdGUgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3ByaXRlID09PSAnc3RyaW5nJyAmJiBzZWxmLl9zdGF0ZSA9PT0gJ2xvYWRlZCcgJiYgIXNlbGYuX3Nwcml0ZVtzcHJpdGVdKSB7XG4gICAgICAgIC8vIElmIHRoZSBwYXNzZWQgc3ByaXRlIGRvZXNuJ3QgZXhpc3QsIGRvIG5vdGhpbmcuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3ByaXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgc291bmQgc3ByaXRlIChwbGF5cyB0aGUgZnVsbCBhdWRpbyBsZW5ndGgpLlxuICAgICAgICBzcHJpdGUgPSAnX19kZWZhdWx0JztcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHNpbmdsZSBwYXVzZWQgc291bmQgdGhhdCBpc24ndCBlbmRlZC5cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMsIHBsYXkgdGhhdCBzb3VuZC4gSWYgbm90LCBjb250aW51ZSBhcyB1c3VhbC5cbiAgICAgICAgaWYgKCFzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICAgIHZhciBudW0gPSAwO1xuICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX3BhdXNlZCAmJiAhc2VsZi5fc291bmRzW2ldLl9lbmRlZCkge1xuICAgICAgICAgICAgICBudW0rKztcbiAgICAgICAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbaV0uX2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChudW0gPT09IDEpIHtcbiAgICAgICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBzZWxlY3RlZCBub2RlLCBvciBnZXQgb25lIGZyb20gdGhlIHBvb2wuXG4gICAgICB2YXIgc291bmQgPSBpZCA/IHNlbGYuX3NvdW5kQnlJZChpZCkgOiBzZWxmLl9pbmFjdGl2ZVNvdW5kKCk7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBkb2Vzbid0IGV4aXN0LCBkbyBub3RoaW5nLlxuICAgICAgaWYgKCFzb3VuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2VsZWN0IHRoZSBzcHJpdGUgZGVmaW5pdGlvbi5cbiAgICAgIGlmIChpZCAmJiAhc3ByaXRlKSB7XG4gICAgICAgIHNwcml0ZSA9IHNvdW5kLl9zcHJpdGUgfHwgJ19fZGVmYXVsdCc7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCB3ZSBtdXN0IHdhaXQgdG8gZ2V0IHRoZSBhdWRpbydzIGR1cmF0aW9uLlxuICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdhaXQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHJ1biBpbnRvIHJhY2UgY29uZGl0aW9ucyB3aXRoXG4gICAgICAvLyB0aGUgb3JkZXIgb2YgZnVuY3Rpb24gY2FsbHMuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIC8vIFNldCB0aGUgc3ByaXRlIHZhbHVlIG9uIHRoaXMgc291bmQuXG4gICAgICAgIHNvdW5kLl9zcHJpdGUgPSBzcHJpdGU7XG5cbiAgICAgICAgLy8gTWFyayB0aGlzIHNvdW5kIGFzIG5vdCBlbmRlZCBpbiBjYXNlIGFub3RoZXIgc291bmQgaXMgcGxheWVkIGJlZm9yZSB0aGlzIG9uZSBsb2Fkcy5cbiAgICAgICAgc291bmQuX2VuZGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBzb3VuZCB0byB0aGUgcXVldWUgdG8gYmUgcGxheWVkIG9uIGxvYWQuXG4gICAgICAgIHZhciBzb3VuZElkID0gc291bmQuX2lkO1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ3BsYXknLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLnBsYXkoc291bmRJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc291bmRJZDtcbiAgICAgIH1cblxuICAgICAgLy8gRG9uJ3QgcGxheSB0aGUgc291bmQgaWYgYW4gaWQgd2FzIHBhc3NlZCBhbmQgaXQgaXMgYWxyZWFkeSBwbGF5aW5nLlxuICAgICAgaWYgKGlkICYmICFzb3VuZC5fcGF1c2VkKSB7XG4gICAgICAgIC8vIFRyaWdnZXIgdGhlIHBsYXkgZXZlbnQsIGluIG9yZGVyIHRvIGtlZXAgaXRlcmF0aW5nIHRocm91Z2ggcXVldWUuXG4gICAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICBzZWxmLl9sb2FkUXVldWUoJ3BsYXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzb3VuZC5faWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgQXVkaW9Db250ZXh0IGlzbid0IHN1c3BlbmRlZCwgYW5kIHJlc3VtZSBpdCBpZiBpdCBpcy5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICBIb3dsZXIuX2F1dG9SZXN1bWUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBsb25nIHRvIHBsYXkgZm9yIGFuZCB3aGVyZSB0byBzdGFydCBwbGF5aW5nLlxuICAgICAgdmFyIHNlZWsgPSBNYXRoLm1heCgwLCBzb3VuZC5fc2VlayA+IDAgPyBzb3VuZC5fc2VlayA6IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdIC8gMTAwMCk7XG4gICAgICB2YXIgZHVyYXRpb24gPSBNYXRoLm1heCgwLCAoKHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMV0pIC8gMTAwMCkgLSBzZWVrKTtcbiAgICAgIHZhciB0aW1lb3V0ID0gKGR1cmF0aW9uICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG4gICAgICB2YXIgc3RhcnQgPSBzZWxmLl9zcHJpdGVbc3ByaXRlXVswXSAvIDEwMDA7XG4gICAgICB2YXIgc3RvcCA9IChzZWxmLl9zcHJpdGVbc3ByaXRlXVswXSArIHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzFdKSAvIDEwMDA7XG4gICAgICBzb3VuZC5fc3ByaXRlID0gc3ByaXRlO1xuXG4gICAgICAvLyBNYXJrIHRoZSBzb3VuZCBhcyBlbmRlZCBpbnN0YW50bHkgc28gdGhhdCB0aGlzIGFzeW5jIHBsYXliYWNrXG4gICAgICAvLyBkb2Vzbid0IGdldCBncmFiYmVkIGJ5IGFub3RoZXIgY2FsbCB0byBwbGF5IHdoaWxlIHRoaXMgb25lIHdhaXRzIHRvIHN0YXJ0LlxuICAgICAgc291bmQuX2VuZGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc291bmQuXG4gICAgICB2YXIgc2V0UGFyYW1zID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNvdW5kLl9wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgc291bmQuX3NlZWsgPSBzZWVrO1xuICAgICAgICBzb3VuZC5fc3RhcnQgPSBzdGFydDtcbiAgICAgICAgc291bmQuX3N0b3AgPSBzdG9wO1xuICAgICAgICBzb3VuZC5fbG9vcCA9ICEhKHNvdW5kLl9sb29wIHx8IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzJdKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEVuZCB0aGUgc291bmQgaW5zdGFudGx5IGlmIHNlZWsgaXMgYXQgdGhlIGVuZC5cbiAgICAgIGlmIChzZWVrID49IHN0b3ApIHtcbiAgICAgICAgc2VsZi5fZW5kZWQoc291bmQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEJlZ2luIHRoZSBhY3R1YWwgcGxheWJhY2suXG4gICAgICB2YXIgbm9kZSA9IHNvdW5kLl9ub2RlO1xuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgIC8vIEZpcmUgdGhpcyB3aGVuIHRoZSBzb3VuZCBpcyByZWFkeSB0byBwbGF5IHRvIGJlZ2luIFdlYiBBdWRpbyBwbGF5YmFjay5cbiAgICAgICAgdmFyIHBsYXlXZWJBdWRpbyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gZmFsc2U7XG4gICAgICAgICAgc2V0UGFyYW1zKCk7XG4gICAgICAgICAgc2VsZi5fcmVmcmVzaEJ1ZmZlcihzb3VuZCk7XG5cbiAgICAgICAgICAvLyBTZXR1cCB0aGUgcGxheWJhY2sgcGFyYW1zLlxuICAgICAgICAgIHZhciB2b2wgPSAoc291bmQuX211dGVkIHx8IHNlbGYuX211dGVkKSA/IDAgOiBzb3VuZC5fdm9sdW1lO1xuICAgICAgICAgIG5vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2b2wsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgIHNvdW5kLl9wbGF5U3RhcnQgPSBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lO1xuXG4gICAgICAgICAgLy8gUGxheSB0aGUgc291bmQgdXNpbmcgdGhlIHN1cHBvcnRlZCBtZXRob2QuXG4gICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmJ1ZmZlclNvdXJjZS5zdGFydCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNvdW5kLl9sb29wID8gbm9kZS5idWZmZXJTb3VyY2Uubm90ZUdyYWluT24oMCwgc2VlaywgODY0MDApIDogbm9kZS5idWZmZXJTb3VyY2Uubm90ZUdyYWluT24oMCwgc2VlaywgZHVyYXRpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3VuZC5fbG9vcCA/IG5vZGUuYnVmZmVyU291cmNlLnN0YXJ0KDAsIHNlZWssIDg2NDAwKSA6IG5vZGUuYnVmZmVyU291cmNlLnN0YXJ0KDAsIHNlZWssIGR1cmF0aW9uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdGFydCBhIG5ldyB0aW1lciBpZiBub25lIGlzIHByZXNlbnQuXG4gICAgICAgICAgaWYgKHRpbWVvdXQgIT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSA9IHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIHRpbWVvdXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXknLCBzb3VuZC5faWQpO1xuICAgICAgICAgICAgICBzZWxmLl9sb2FkUXVldWUoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoSG93bGVyLnN0YXRlID09PSAncnVubmluZycgJiYgSG93bGVyLmN0eC5zdGF0ZSAhPT0gJ2ludGVycnVwdGVkJykge1xuICAgICAgICAgIHBsYXlXZWJBdWRpbygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhdWRpbyBjb250ZXh0IHRvIHJlc3VtZSBiZWZvcmUgcGxheWluZy5cbiAgICAgICAgICBzZWxmLm9uY2UoJ3Jlc3VtZScsIHBsYXlXZWJBdWRpbyk7XG5cbiAgICAgICAgICAvLyBDYW5jZWwgdGhlIGVuZCB0aW1lci5cbiAgICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kLl9pZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpcmUgdGhpcyB3aGVuIHRoZSBzb3VuZCBpcyByZWFkeSB0byBwbGF5IHRvIGJlZ2luIEhUTUw1IEF1ZGlvIHBsYXliYWNrLlxuICAgICAgICB2YXIgcGxheUh0bWw1ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbm9kZS5jdXJyZW50VGltZSA9IHNlZWs7XG4gICAgICAgICAgbm9kZS5tdXRlZCA9IHNvdW5kLl9tdXRlZCB8fCBzZWxmLl9tdXRlZCB8fCBIb3dsZXIuX211dGVkIHx8IG5vZGUubXV0ZWQ7XG4gICAgICAgICAgbm9kZS52b2x1bWUgPSBzb3VuZC5fdm9sdW1lICogSG93bGVyLnZvbHVtZSgpO1xuICAgICAgICAgIG5vZGUucGxheWJhY2tSYXRlID0gc291bmQuX3JhdGU7XG5cbiAgICAgICAgICAvLyBTb21lIGJyb3dzZXJzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhpcyBpcyBjYWxsZWQgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcGxheSA9IG5vZGUucGxheSgpO1xuXG4gICAgICAgICAgICAvLyBTdXBwb3J0IG9sZGVyIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwcm9taXNlcywgYW5kIHRodXMgZG9uJ3QgaGF2ZSB0aGlzIGlzc3VlLlxuICAgICAgICAgICAgaWYgKHBsYXkgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIChwbGF5IGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2YgcGxheS50aGVuID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAvLyBJbXBsZW1lbnRzIGEgbG9jayB0byBwcmV2ZW50IERPTUV4Y2VwdGlvbjogVGhlIHBsYXkoKSByZXF1ZXN0IHdhcyBpbnRlcnJ1cHRlZCBieSBhIGNhbGwgdG8gcGF1c2UoKS5cbiAgICAgICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIC8vIFNldCBwYXJhbSB2YWx1ZXMgaW1tZWRpYXRlbHkuXG4gICAgICAgICAgICAgIHNldFBhcmFtcygpO1xuXG4gICAgICAgICAgICAgIC8vIFJlbGVhc2VzIHRoZSBsb2NrIGFuZCBleGVjdXRlcyBxdWV1ZWQgYWN0aW9ucy5cbiAgICAgICAgICAgICAgcGxheVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIG5vZGUuX3VubG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXllcnJvcicsIHNvdW5kLl9pZCwgJ1BsYXliYWNrIHdhcyB1bmFibGUgdG8gc3RhcnQuIFRoaXMgaXMgbW9zdCBjb21tb25seSBhbiBpc3N1ZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29uIG1vYmlsZSBkZXZpY2VzIGFuZCBDaHJvbWUgd2hlcmUgcGxheWJhY2sgd2FzIG5vdCB3aXRoaW4gYSB1c2VyIGludGVyYWN0aW9uLicpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZW5kZWQgYW5kIHBhdXNlZCB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgICBzb3VuZC5fZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgc291bmQuX3BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICBzZXRQYXJhbXMoKTtcbiAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXR0aW5nIHJhdGUgYmVmb3JlIHBsYXlpbmcgd29uJ3Qgd29yayBpbiBJRSwgc28gd2Ugc2V0IGl0IGFnYWluIGhlcmUuXG4gICAgICAgICAgICBub2RlLnBsYXliYWNrUmF0ZSA9IHNvdW5kLl9yYXRlO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBzdGlsbCBwYXVzZWQsIHRoZW4gd2UgY2FuIGFzc3VtZSB0aGVyZSB3YXMgYSBwbGF5YmFjayBpc3N1ZS5cbiAgICAgICAgICAgIGlmIChub2RlLnBhdXNlZCkge1xuICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5ZXJyb3InLCBzb3VuZC5faWQsICdQbGF5YmFjayB3YXMgdW5hYmxlIHRvIHN0YXJ0LiBUaGlzIGlzIG1vc3QgY29tbW9ubHkgYW4gaXNzdWUgJyArXG4gICAgICAgICAgICAgICAgJ29uIG1vYmlsZSBkZXZpY2VzIGFuZCBDaHJvbWUgd2hlcmUgcGxheWJhY2sgd2FzIG5vdCB3aXRoaW4gYSB1c2VyIGludGVyYWN0aW9uLicpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldHVwIHRoZSBlbmQgdGltZXIgb24gc3ByaXRlcyBvciBsaXN0ZW4gZm9yIHRoZSBlbmRlZCBldmVudC5cbiAgICAgICAgICAgIGlmIChzcHJpdGUgIT09ICdfX2RlZmF1bHQnIHx8IHNvdW5kLl9sb29wKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIEZpcmUgZW5kZWQgb24gdGhpcyBhdWRpbyBub2RlLlxuICAgICAgICAgICAgICAgIHNlbGYuX2VuZGVkKHNvdW5kKTtcblxuICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoaXMgbGlzdGVuZXIuXG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdLCBmYWxzZSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheWVycm9yJywgc291bmQuX2lkLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJZiB0aGlzIGlzIHN0cmVhbWluZyBhdWRpbywgbWFrZSBzdXJlIHRoZSBzcmMgaXMgc2V0IGFuZCBsb2FkIGFnYWluLlxuICAgICAgICBpZiAobm9kZS5zcmMgPT09ICdkYXRhOmF1ZGlvL3dhdjtiYXNlNjQsVWtsR1JpZ0FBQUJYUVZaRlptMTBJQklBQUFBQkFBRUFSS3dBQUloWUFRQUNBQkFBQUFCa1lYUmhBZ0FBQUFFQScpIHtcbiAgICAgICAgICBub2RlLnNyYyA9IHNlbGYuX3NyYztcbiAgICAgICAgICBub2RlLmxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBsYXkgaW1tZWRpYXRlbHkgaWYgcmVhZHksIG9yIHdhaXQgZm9yIHRoZSAnY2FucGxheXRocm91Z2gnZSB2ZW50LlxuICAgICAgICB2YXIgbG9hZGVkTm9SZWFkeVN0YXRlID0gKHdpbmRvdyAmJiB3aW5kb3cuZWplY3RhKSB8fCAoIW5vZGUucmVhZHlTdGF0ZSAmJiBIb3dsZXIuX25hdmlnYXRvci5pc0NvY29vbkpTKTtcbiAgICAgICAgaWYgKG5vZGUucmVhZHlTdGF0ZSA+PSAzIHx8IGxvYWRlZE5vUmVhZHlTdGF0ZSkge1xuICAgICAgICAgIHBsYXlIdG1sNSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gQmVnaW4gcGxheWJhY2suXG4gICAgICAgICAgICBwbGF5SHRtbDUoKTtcblxuICAgICAgICAgICAgLy8gQ2xlYXIgdGhpcyBsaXN0ZW5lci5cbiAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgbGlzdGVuZXIsIGZhbHNlKTtcblxuICAgICAgICAgIC8vIENhbmNlbCB0aGUgZW5kIHRpbWVyLlxuICAgICAgICAgIHNlbGYuX2NsZWFyVGltZXIoc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc291bmQuX2lkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXVzZSBwbGF5YmFjayBhbmQgc2F2ZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIElEIChlbXB0eSB0byBwYXVzZSBhbGwgaW4gZ3JvdXApLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgcGF1c2U6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkIG9yIGEgcGxheSgpIHByb21pc2UgaXMgcGVuZGluZywgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIHBhdXNlIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdwYXVzZScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYucGF1c2UoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGlkIGlzIHBhc3NlZCwgZ2V0IGFsbCBJRCdzIHRvIGJlIHBhdXNlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGVuZCB0aW1lci5cbiAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZHNbaV0pO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIGlmIChzb3VuZCAmJiAhc291bmQuX3BhdXNlZCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWVrIHBvc2l0aW9uLlxuICAgICAgICAgIHNvdW5kLl9zZWVrID0gc2VsZi5zZWVrKGlkc1tpXSk7XG4gICAgICAgICAgc291bmQuX3JhdGVTZWVrID0gMDtcbiAgICAgICAgICBzb3VuZC5fcGF1c2VkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIFN0b3AgY3VycmVudGx5IHJ1bm5pbmcgZmFkZXMuXG4gICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRzW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc291bmQgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICAgICAgICAgICAgaWYgKCFzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLm5vdGVPZmYoMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AoMCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgICAgICAgICAgc2VsZi5fY2xlYW5CdWZmZXIoc291bmQuX25vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNOYU4oc291bmQuX25vZGUuZHVyYXRpb24pIHx8IHNvdW5kLl9ub2RlLmR1cmF0aW9uID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcmUgdGhlIHBhdXNlIGV2ZW50LCB1bmxlc3MgYHRydWVgIGlzIHBhc3NlZCBhcyB0aGUgMm5kIGFyZ3VtZW50LlxuICAgICAgICBpZiAoIWFyZ3VtZW50c1sxXSkge1xuICAgICAgICAgIHNlbGYuX2VtaXQoJ3BhdXNlJywgc291bmQgPyBzb3VuZC5faWQgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RvcCBwbGF5YmFjayBhbmQgcmVzZXQgdG8gc3RhcnQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgSUQgKGVtcHR5IHRvIHN0b3AgYWxsIGluIGdyb3VwKS5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBpbnRlcm5hbCBJbnRlcm5hbCBVc2U6IHRydWUgcHJldmVudHMgZXZlbnQgZmlyaW5nLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24oaWQsIGludGVybmFsKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gc3RvcCB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnIHx8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnc3RvcCcsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuc3RvcChpZCwgaW50ZXJuYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGlkIGlzIHBhc3NlZCwgZ2V0IGFsbCBJRCdzIHRvIGJlIHN0b3BwZWQuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBlbmQgdGltZXIuXG4gICAgICAgIHNlbGYuX2NsZWFyVGltZXIoaWRzW2ldKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aGUgc2VlayBwb3NpdGlvbi5cbiAgICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IDA7XG4gICAgICAgICAgc291bmQuX3BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgc291bmQuX2VuZGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIFN0b3AgY3VycmVudGx5IHJ1bm5pbmcgZmFkZXMuXG4gICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRzW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc291bmQncyBBdWRpb0J1ZmZlclNvdXJjZU5vZGUgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uubm90ZU9mZigwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AoMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICAgICAgICAgICAgc2VsZi5fY2xlYW5CdWZmZXIoc291bmQuX25vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc05hTihzb3VuZC5fbm9kZS5kdXJhdGlvbikgfHwgc291bmQuX25vZGUuZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmN1cnJlbnRUaW1lID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnBhdXNlKCk7XG5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxpdmUgc3RyZWFtLCBzdG9wIGRvd25sb2FkIG9uY2UgdGhlIGF1ZGlvIGlzIHN0b3BwZWQuXG4gICAgICAgICAgICAgIGlmIChzb3VuZC5fbm9kZS5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9jbGVhclNvdW5kKHNvdW5kLl9ub2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3N0b3AnLCBzb3VuZC5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXV0ZS91bm11dGUgYSBzaW5nbGUgc291bmQgb3IgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gbXV0ZWQgU2V0IHRvIHRydWUgdG8gbXV0ZSBhbmQgZmFsc2UgdG8gdW5tdXRlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICAgVGhlIHNvdW5kIElEIHRvIHVwZGF0ZSAob21pdCB0byBtdXRlL3VubXV0ZSBhbGwpLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgbXV0ZTogZnVuY3Rpb24obXV0ZWQsIGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gbXV0ZSB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdtdXRlJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5tdXRlKG11dGVkLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYXBwbHlpbmcgbXV0ZS91bm11dGUgdG8gYWxsIHNvdW5kcywgdXBkYXRlIHRoZSBncm91cCdzIHZhbHVlLlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtdXRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgc2VsZi5fbXV0ZWQgPSBtdXRlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fbXV0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgbXV0ZWQuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgIHNvdW5kLl9tdXRlZCA9IG11dGVkO1xuXG4gICAgICAgICAgLy8gQ2FuY2VsIGFjdGl2ZSBmYWRlIGFuZCBzZXQgdGhlIHZvbHVtZSB0byB0aGUgZW5kIHZhbHVlLlxuICAgICAgICAgIGlmIChzb3VuZC5faW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKHNvdW5kLl9pZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKG11dGVkID8gMCA6IHNvdW5kLl92b2x1bWUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLm11dGVkID0gSG93bGVyLl9tdXRlZCA/IHRydWUgOiBtdXRlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdtdXRlJywgc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgdm9sdW1lIG9mIHRoaXMgc291bmQgb3Igb2YgdGhlIEhvd2wgZ3JvdXAuIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICAgKiAgIHZvbHVtZSgpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3Mgdm9sdW1lIHZhbHVlLlxuICAgICAqICAgdm9sdW1lKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGN1cnJlbnQgdm9sdW1lLlxuICAgICAqICAgdm9sdW1lKHZvbCkgLT4gU2V0cyB0aGUgdm9sdW1lIG9mIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqICAgdm9sdW1lKHZvbCwgaWQpIC0+IFNldHMgdGhlIHZvbHVtZSBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9IFJldHVybnMgc2VsZiBvciBjdXJyZW50IHZvbHVtZS5cbiAgICAgKi9cbiAgICB2b2x1bWU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgdm9sLCBpZDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgYmFzZWQgb24gYXJndW1lbnRzLlxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdyb3Vwcycgdm9sdW1lLlxuICAgICAgICByZXR1cm4gc2VsZi5fdm9sdW1lO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSB8fCBhcmdzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgYXJnc1sxXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhbiBJRCwgYW5kIGlmIG5vdCwgYXNzdW1lIGl0IGlzIGEgbmV3IHZvbHVtZS5cbiAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGlkcy5pbmRleE9mKGFyZ3NbMF0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1swXSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZvbCA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPj0gMikge1xuICAgICAgICB2b2wgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgb3IgcmV0dXJuIHRoZSBjdXJyZW50IHZvbHVtZS5cbiAgICAgIHZhciBzb3VuZDtcbiAgICAgIGlmICh0eXBlb2Ygdm9sICE9PSAndW5kZWZpbmVkJyAmJiB2b2wgPj0gMCAmJiB2b2wgPD0gMSkge1xuICAgICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSB2b2x1bWUgd2hlbiBjYXBhYmxlLlxuICAgICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiAndm9sdW1lJyxcbiAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlbGYudm9sdW1lLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwIHZvbHVtZS5cbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzZWxmLl92b2x1bWUgPSB2b2w7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgb25lIG9yIGFsbCB2b2x1bWVzLlxuICAgICAgICBpZCA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZFtpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAgIHNvdW5kLl92b2x1bWUgPSB2b2w7XG5cbiAgICAgICAgICAgIC8vIFN0b3AgY3VycmVudGx5IHJ1bm5pbmcgZmFkZXMuXG4gICAgICAgICAgICBpZiAoIWFyZ3NbMl0pIHtcbiAgICAgICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgIXNvdW5kLl9tdXRlZCkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbXV0ZWQpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUudm9sdW1lID0gdm9sICogSG93bGVyLnZvbHVtZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLl9lbWl0KCd2b2x1bWUnLCBzb3VuZC5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQgPSBpZCA/IHNlbGYuX3NvdW5kQnlJZChpZCkgOiBzZWxmLl9zb3VuZHNbMF07XG4gICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl92b2x1bWUgOiAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmFkZSBhIGN1cnJlbnRseSBwbGF5aW5nIHNvdW5kIGJldHdlZW4gdHdvIHZvbHVtZXMgKGlmIG5vIGlkIGlzIHBhc3NlZCwgYWxsIHNvdW5kcyB3aWxsIGZhZGUpLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gZnJvbSBUaGUgdmFsdWUgdG8gZmFkZSBmcm9tICgwLjAgdG8gMS4wKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHRvICAgVGhlIHZvbHVtZSB0byBmYWRlIHRvICgwLjAgdG8gMS4wKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGxlbiAgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZmFkZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkICAgVGhlIHNvdW5kIGlkIChvbWl0IHRvIGZhZGUgYWxsIHNvdW5kcykuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBmYWRlOiBmdW5jdGlvbihmcm9tLCB0bywgbGVuLCBpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGZhZGUgd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ2ZhZGUnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLmZhZGUoZnJvbSwgdG8sIGxlbiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdG8vZnJvbS9sZW4gdmFsdWVzIGFyZSBudW1iZXJzLlxuICAgICAgZnJvbSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHBhcnNlRmxvYXQoZnJvbSkpLCAxKTtcbiAgICAgIHRvID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgcGFyc2VGbG9hdCh0bykpLCAxKTtcbiAgICAgIGxlbiA9IHBhcnNlRmxvYXQobGVuKTtcblxuICAgICAgLy8gU2V0IHRoZSB2b2x1bWUgdG8gdGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAgc2VsZi52b2x1bWUoZnJvbSwgaWQpO1xuXG4gICAgICAvLyBGYWRlIHRoZSB2b2x1bWUgb2Ygb25lIG9yIGFsbCBzb3VuZHMuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBsaW5lYXIgZmFkZSBvciBmYWxsIGJhY2sgdG8gdGltZW91dHMgd2l0aCBIVE1MNSBBdWRpby5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgLy8gU3RvcCB0aGUgcHJldmlvdXMgZmFkZSBpZiBubyBzcHJpdGUgaXMgYmVpbmcgdXNlZCAob3RoZXJ3aXNlLCB2b2x1bWUgaGFuZGxlcyB0aGlzKS5cbiAgICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZHNbaV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBXZWIgQXVkaW8sIGxldCB0aGUgbmF0aXZlIG1ldGhvZHMgZG8gdGhlIGFjdHVhbCBmYWRlLlxuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiAhc291bmQuX211dGVkKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGN1cnJlbnRUaW1lICsgKGxlbiAvIDEwMDApO1xuICAgICAgICAgICAgc291bmQuX3ZvbHVtZSA9IGZyb207XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKGZyb20sIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4ubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUodG8sIGVuZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fc3RhcnRGYWRlSW50ZXJ2YWwoc291bmQsIGZyb20sIHRvLCBsZW4sIGlkc1tpXSwgdHlwZW9mIGlkID09PSAndW5kZWZpbmVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgaW50ZXJuYWwgaW50ZXJ2YWwgdG8gZmFkZSBhIHNvdW5kLlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gc291bmQgUmVmZXJlbmNlIHRvIHNvdW5kIHRvIGZhZGUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBmcm9tIFRoZSB2YWx1ZSB0byBmYWRlIGZyb20gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdG8gICBUaGUgdm9sdW1lIHRvIGZhZGUgdG8gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gbGVuICBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBmYWRlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICBUaGUgc291bmQgaWQgdG8gZmFkZS5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBpc0dyb3VwICAgSWYgdHJ1ZSwgc2V0IHRoZSB2b2x1bWUgb24gdGhlIGdyb3VwLlxuICAgICAqL1xuICAgIF9zdGFydEZhZGVJbnRlcnZhbDogZnVuY3Rpb24oc291bmQsIGZyb20sIHRvLCBsZW4sIGlkLCBpc0dyb3VwKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgdm9sID0gZnJvbTtcbiAgICAgIHZhciBkaWZmID0gdG8gLSBmcm9tO1xuICAgICAgdmFyIHN0ZXBzID0gTWF0aC5hYnMoZGlmZiAvIDAuMDEpO1xuICAgICAgdmFyIHN0ZXBMZW4gPSBNYXRoLm1heCg0LCAoc3RlcHMgPiAwKSA/IGxlbiAvIHN0ZXBzIDogbGVuKTtcbiAgICAgIHZhciBsYXN0VGljayA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIFN0b3JlIHRoZSB2YWx1ZSBiZWluZyBmYWRlZCB0by5cbiAgICAgIHNvdW5kLl9mYWRlVG8gPSB0bztcblxuICAgICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgdmFsdWUgb24gZWFjaCBpbnRlcnZhbCB0aWNrLlxuICAgICAgc291bmQuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgdm9sdW1lIGJhc2VkIG9uIHRoZSB0aW1lIHNpbmNlIHRoZSBsYXN0IHRpY2suXG4gICAgICAgIHZhciB0aWNrID0gKERhdGUubm93KCkgLSBsYXN0VGljaykgLyBsZW47XG4gICAgICAgIGxhc3RUaWNrID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdm9sICs9IGRpZmYgKiB0aWNrO1xuXG4gICAgICAgIC8vIFJvdW5kIHRvIHdpdGhpbiAyIGRlY2ltYWwgcG9pbnRzLlxuICAgICAgICB2b2wgPSBNYXRoLnJvdW5kKHZvbCAqIDEwMCkgLyAxMDA7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2b2x1bWUgaXMgaW4gdGhlIHJpZ2h0IGJvdW5kcy5cbiAgICAgICAgaWYgKGRpZmYgPCAwKSB7XG4gICAgICAgICAgdm9sID0gTWF0aC5tYXgodG8sIHZvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm9sID0gTWF0aC5taW4odG8sIHZvbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGFuZ2UgdGhlIHZvbHVtZS5cbiAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgc291bmQuX3ZvbHVtZSA9IHZvbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLnZvbHVtZSh2b2wsIHNvdW5kLl9pZCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwJ3Mgdm9sdW1lLlxuICAgICAgICBpZiAoaXNHcm91cCkge1xuICAgICAgICAgIHNlbGYuX3ZvbHVtZSA9IHZvbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdoZW4gdGhlIGZhZGUgaXMgY29tcGxldGUsIHN0b3AgaXQgYW5kIGZpcmUgZXZlbnQuXG4gICAgICAgIGlmICgodG8gPCBmcm9tICYmIHZvbCA8PSB0bykgfHwgKHRvID4gZnJvbSAmJiB2b2wgPj0gdG8pKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzb3VuZC5faW50ZXJ2YWwpO1xuICAgICAgICAgIHNvdW5kLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICAgICAgc291bmQuX2ZhZGVUbyA9IG51bGw7XG4gICAgICAgICAgc2VsZi52b2x1bWUodG8sIHNvdW5kLl9pZCk7XG4gICAgICAgICAgc2VsZi5fZW1pdCgnZmFkZScsIHNvdW5kLl9pZCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHN0ZXBMZW4pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBzdG9wcyB0aGUgY3VycmVudGx5IHBsYXlpbmcgZmFkZSB3aGVuXG4gICAgICogYSBuZXcgZmFkZSBzdGFydHMsIHZvbHVtZSBpcyBjaGFuZ2VkIG9yIHRoZSBzb3VuZCBpcyBzdG9wcGVkLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX3N0b3BGYWRlOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcblxuICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9pbnRlcnZhbCkge1xuICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLmNhbmNlbFNjaGVkdWxlZFZhbHVlcyhIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoc291bmQuX2ludGVydmFsKTtcbiAgICAgICAgc291bmQuX2ludGVydmFsID0gbnVsbDtcbiAgICAgICAgc2VsZi52b2x1bWUoc291bmQuX2ZhZGVUbywgaWQpO1xuICAgICAgICBzb3VuZC5fZmFkZVRvID0gbnVsbDtcbiAgICAgICAgc2VsZi5fZW1pdCgnZmFkZScsIGlkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIGxvb3AgcGFyYW1ldGVyIG9uIGEgc291bmQuIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICAgKiAgIGxvb3AoKSAtPiBSZXR1cm5zIHRoZSBncm91cCdzIGxvb3AgdmFsdWUuXG4gICAgICogICBsb29wKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGxvb3AgdmFsdWUuXG4gICAgICogICBsb29wKGxvb3ApIC0+IFNldHMgdGhlIGxvb3AgdmFsdWUgZm9yIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqICAgbG9vcChsb29wLCBpZCkgLT4gU2V0cyB0aGUgbG9vcCB2YWx1ZSBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9Cb29sZWFufSBSZXR1cm5zIHNlbGYgb3IgY3VycmVudCBsb29wIHZhbHVlLlxuICAgICAqL1xuICAgIGxvb3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgbG9vcCwgaWQsIHNvdW5kO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBmb3IgbG9vcCBhbmQgaWQuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBncm91J3MgbG9vcCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIHNlbGYuX2xvb3A7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbG9vcCA9IGFyZ3NbMF07XG4gICAgICAgICAgc2VsZi5fbG9vcCA9IGxvb3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmV0dXJuIHRoaXMgc291bmQncyBsb29wIHZhbHVlLlxuICAgICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKHBhcnNlSW50KGFyZ3NbMF0sIDEwKSk7XG4gICAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX2xvb3AgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBsb29wID0gYXJnc1swXTtcbiAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGlkIGlzIHBhc3NlZCwgZ2V0IGFsbCBJRCdzIHRvIGJlIGxvb3BlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgc291bmQuX2xvb3AgPSBsb29wO1xuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wID0gbG9vcDtcbiAgICAgICAgICAgIGlmIChsb29wKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wU3RhcnQgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BFbmQgPSBzb3VuZC5fc3RvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIHBsYXliYWNrIHJhdGUgb2YgYSBzb3VuZC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgcmF0ZSgpIC0+IFJldHVybnMgdGhlIGZpcnN0IHNvdW5kIG5vZGUncyBjdXJyZW50IHBsYXliYWNrIHJhdGUuXG4gICAgICogICByYXRlKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cbiAgICAgKiAgIHJhdGUocmF0ZSkgLT4gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBvZiBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgKiAgIHJhdGUocmF0ZSwgaWQpIC0+IFNldHMgdGhlIHBsYXliYWNrIHJhdGUgb2YgcGFzc2VkIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2wvTnVtYmVyfSBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cbiAgICAgKi9cbiAgICByYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdmFyIHJhdGUsIGlkO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gV2Ugd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGZpcnN0IG5vZGUuXG4gICAgICAgIGlkID0gc2VsZi5fc291bmRzWzBdLl9pZDtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhbiBJRCwgYW5kIGlmIG5vdCwgYXNzdW1lIGl0IGlzIGEgbmV3IHJhdGUgdmFsdWUuXG4gICAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcygpO1xuICAgICAgICB2YXIgaW5kZXggPSBpZHMuaW5kZXhPZihhcmdzWzBdKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMF0sIDEwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByYXRlID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByYXRlID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGxheWJhY2sgcmF0ZSBvciByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICB2YXIgc291bmQ7XG4gICAgICBpZiAodHlwZW9mIHJhdGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHBsYXliYWNrIHJhdGUgd2hlbiBjYXBhYmxlLlxuICAgICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnIHx8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgICBldmVudDogJ3JhdGUnLFxuICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2VsZi5yYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwIHJhdGUuXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc2VsZi5fcmF0ZSA9IHJhdGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgb25lIG9yIGFsbCB2b2x1bWVzLlxuICAgICAgICBpZCA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZFtpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3VyIHBvc2l0aW9uIHdoZW4gdGhlIHJhdGUgY2hhbmdlZCBhbmQgdXBkYXRlIHRoZSBwbGF5YmFja1xuICAgICAgICAgICAgLy8gc3RhcnQgcG9zaXRpb24gc28gd2UgY2FuIHByb3Blcmx5IGFkanVzdCB0aGUgc2VlayBwb3NpdGlvbiBmb3IgdGltZSBlbGFwc2VkLlxuICAgICAgICAgICAgaWYgKHNlbGYucGxheWluZyhpZFtpXSkpIHtcbiAgICAgICAgICAgICAgc291bmQuX3JhdGVTZWVrID0gc2VsZi5zZWVrKGlkW2ldKTtcbiAgICAgICAgICAgICAgc291bmQuX3BsYXlTdGFydCA9IHNlbGYuX3dlYkF1ZGlvID8gSG93bGVyLmN0eC5jdXJyZW50VGltZSA6IHNvdW5kLl9wbGF5U3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VuZC5fcmF0ZSA9IHJhdGU7XG5cbiAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgcGxheWJhY2sgcmF0ZS5cbiAgICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShyYXRlLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRpbWVycy5cbiAgICAgICAgICAgIHZhciBzZWVrID0gc2VsZi5zZWVrKGlkW2ldKTtcbiAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9ICgoc2VsZi5fc3ByaXRlW3NvdW5kLl9zcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3NvdW5kLl9zcHJpdGVdWzFdKSAvIDEwMDApIC0gc2VlaztcbiAgICAgICAgICAgIHZhciB0aW1lb3V0ID0gKGR1cmF0aW9uICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IGVuZCB0aW1lciBpZiBzb3VuZCBpcyBhbHJlYWR5IHBsYXlpbmcuXG4gICAgICAgICAgICBpZiAoc2VsZi5fZW5kVGltZXJzW2lkW2ldXSB8fCAhc291bmQuX3BhdXNlZCkge1xuICAgICAgICAgICAgICBzZWxmLl9jbGVhclRpbWVyKGlkW2ldKTtcbiAgICAgICAgICAgICAgc2VsZi5fZW5kVGltZXJzW2lkW2ldXSA9IHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdyYXRlJywgc291bmQuX2lkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX3JhdGUgOiBzZWxmLl9yYXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgc2VlayBwb3NpdGlvbiBvZiBhIHNvdW5kLiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxseSB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAgICogICBzZWVrKCkgLT4gUmV0dXJucyB0aGUgZmlyc3Qgc291bmQgbm9kZSdzIGN1cnJlbnQgc2VlayBwb3NpdGlvbi5cbiAgICAgKiAgIHNlZWsoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgY3VycmVudCBzZWVrIHBvc2l0aW9uLlxuICAgICAqICAgc2VlayhzZWVrKSAtPiBTZXRzIHRoZSBzZWVrIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBzb3VuZCBub2RlLlxuICAgICAqICAgc2VlayhzZWVrLCBpZCkgLT4gU2V0cyB0aGUgc2VlayBwb3NpdGlvbiBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9IFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIHNlZWs6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgc2VlaywgaWQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50cy5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBXZSB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG5vZGUuXG4gICAgICAgIGlkID0gc2VsZi5fc291bmRzWzBdLl9pZDtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhbiBJRCwgYW5kIGlmIG5vdCwgYXNzdW1lIGl0IGlzIGEgbmV3IHNlZWsgcG9zaXRpb24uXG4gICAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcygpO1xuICAgICAgICB2YXIgaW5kZXggPSBpZHMuaW5kZXhPZihhcmdzWzBdKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMF0sIDEwKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLl9zb3VuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbMF0uX2lkO1xuICAgICAgICAgIHNlZWsgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHNlZWsgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gSUQsIGJhaWwgb3V0LlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gc2VlayB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAodHlwZW9mIHNlZWsgPT09ICdudW1iZXInICYmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnc2VlaycsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuc2Vlay5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VlayA9PT0gJ251bWJlcicgJiYgc2VlayA+PSAwKSB7XG4gICAgICAgICAgLy8gUGF1c2UgdGhlIHNvdW5kIGFuZCB1cGRhdGUgcG9zaXRpb24gZm9yIHJlc3RhcnRpbmcgcGxheWJhY2suXG4gICAgICAgICAgdmFyIHBsYXlpbmcgPSBzZWxmLnBsYXlpbmcoaWQpO1xuICAgICAgICAgIGlmIChwbGF5aW5nKSB7XG4gICAgICAgICAgICBzZWxmLnBhdXNlKGlkLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBNb3ZlIHRoZSBwb3NpdGlvbiBvZiB0aGUgdHJhY2sgYW5kIGNhbmNlbCB0aW1lci5cbiAgICAgICAgICBzb3VuZC5fc2VlayA9IHNlZWs7XG4gICAgICAgICAgc291bmQuX2VuZGVkID0gZmFsc2U7XG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZCk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlZWsgcG9zaXRpb24gZm9yIEhUTUw1IEF1ZGlvLlxuICAgICAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgIWlzTmFOKHNvdW5kLl9ub2RlLmR1cmF0aW9uKSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUuY3VycmVudFRpbWUgPSBzZWVrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlZWsgYW5kIGVtaXQgd2hlbiByZWFkeS5cbiAgICAgICAgICB2YXIgc2Vla0FuZEVtaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3NlZWsnLCBpZCk7XG5cbiAgICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIHBsYXliYWNrIGlmIHRoZSBzb3VuZCB3YXMgcGxheWluZy5cbiAgICAgICAgICAgIGlmIChwbGF5aW5nKSB7XG4gICAgICAgICAgICAgIHNlbGYucGxheShpZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBwbGF5IGxvY2sgdG8gYmUgdW5zZXQgYmVmb3JlIGVtaXR0aW5nIChIVE1MNSBBdWRpbykuXG4gICAgICAgICAgaWYgKHBsYXlpbmcgJiYgIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICB2YXIgZW1pdFNlZWsgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKCFzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICAgICAgICAgIHNlZWtBbmRFbWl0KCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChlbWl0U2VlaywgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGVtaXRTZWVrLCAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2Vla0FuZEVtaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICB2YXIgcmVhbFRpbWUgPSBzZWxmLnBsYXlpbmcoaWQpID8gSG93bGVyLmN0eC5jdXJyZW50VGltZSAtIHNvdW5kLl9wbGF5U3RhcnQgOiAwO1xuICAgICAgICAgICAgdmFyIHJhdGVTZWVrID0gc291bmQuX3JhdGVTZWVrID8gc291bmQuX3JhdGVTZWVrIC0gc291bmQuX3NlZWsgOiAwO1xuICAgICAgICAgICAgcmV0dXJuIHNvdW5kLl9zZWVrICsgKHJhdGVTZWVrICsgcmVhbFRpbWUgKiBNYXRoLmFicyhzb3VuZC5fcmF0ZSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc291bmQuX25vZGUuY3VycmVudFRpbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHNwZWNpZmljIHNvdW5kIGlzIGN1cnJlbnRseSBwbGF5aW5nIG9yIG5vdCAoaWYgaWQgaXMgcHJvdmlkZWQpLCBvciBjaGVjayBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIHNvdW5kcyBpbiB0aGUgZ3JvdXAgaXMgcGxheWluZyBvciBub3QuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgaWQgVGhlIHNvdW5kIGlkIHRvIGNoZWNrLiBJZiBub25lIGlzIHBhc3NlZCwgdGhlIHdob2xlIHNvdW5kIGdyb3VwIGlzIGNoZWNrZWQuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiBwbGF5aW5nIGFuZCBmYWxzZSBpZiBub3QuXG4gICAgICovXG4gICAgcGxheWluZzogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gQ2hlY2sgdGhlIHBhc3NlZCBzb3VuZCBJRCAoaWYgYW55KS5cbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZCk7XG4gICAgICAgIHJldHVybiBzb3VuZCA/ICFzb3VuZC5fcGF1c2VkIDogZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgbG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIGNoZWNrIGlmIGFueSBhcmUgcGxheWluZy5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFzZWxmLl9zb3VuZHNbaV0uX3BhdXNlZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkdXJhdGlvbiBvZiB0aGlzIHNvdW5kLiBQYXNzaW5nIGEgc291bmQgaWQgd2lsbCByZXR1cm4gdGhlIHNwcml0ZSBkdXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBpZCB0byBjaGVjay4gSWYgbm9uZSBpcyBwYXNzZWQsIHJldHVybiBmdWxsIHNvdXJjZSBkdXJhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEF1ZGlvIGR1cmF0aW9uIGluIHNlY29uZHMuXG4gICAgICovXG4gICAgZHVyYXRpb246IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZHVyYXRpb24gPSBzZWxmLl9kdXJhdGlvbjtcblxuICAgICAgLy8gSWYgd2UgcGFzcyBhbiBJRCwgZ2V0IHRoZSBzb3VuZCBhbmQgcmV0dXJuIHRoZSBzcHJpdGUgbGVuZ3RoLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBkdXJhdGlvbiA9IHNlbGYuX3Nwcml0ZVtzb3VuZC5fc3ByaXRlXVsxXSAvIDEwMDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkdXJhdGlvbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2FkZWQgc3RhdGUgb2YgdGhpcyBIb3dsLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gJ3VubG9hZGVkJywgJ2xvYWRpbmcnLCAnbG9hZGVkJ1xuICAgICAqL1xuICAgIHN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5sb2FkIGFuZCBkZXN0cm95IHRoZSBjdXJyZW50IEhvd2wgb2JqZWN0LlxuICAgICAqIFRoaXMgd2lsbCBpbW1lZGlhdGVseSBzdG9wIGFsbCBzb3VuZCBpbnN0YW5jZXMgYXR0YWNoZWQgdG8gdGhpcyBncm91cC5cbiAgICAgKi9cbiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBTdG9wIHBsYXlpbmcgYW55IGFjdGl2ZSBzb3VuZHMuXG4gICAgICB2YXIgc291bmRzID0gc2VsZi5fc291bmRzO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPHNvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBTdG9wIHRoZSBzb3VuZCBpZiBpdCBpcyBjdXJyZW50bHkgcGxheWluZy5cbiAgICAgICAgaWYgKCFzb3VuZHNbaV0uX3BhdXNlZCkge1xuICAgICAgICAgIHNlbGYuc3RvcChzb3VuZHNbaV0uX2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIG9yIGRpc2Nvbm5lY3QuXG4gICAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHNvdXJjZSB0byAwLXNlY29uZCBzaWxlbmNlIHRvIHN0b3AgYW55IGRvd25sb2FkaW5nIChleGNlcHQgaW4gSUUpLlxuICAgICAgICAgIHNlbGYuX2NsZWFyU291bmQoc291bmRzW2ldLl9ub2RlKTtcblxuICAgICAgICAgIC8vIFJlbW92ZSBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHNvdW5kc1tpXS5fZXJyb3JGbiwgZmFsc2UpO1xuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBzb3VuZHNbaV0uX2xvYWRGbiwgZmFsc2UpO1xuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNvdW5kc1tpXS5fZW5kRm4sIGZhbHNlKTtcblxuICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIEF1ZGlvIG9iamVjdCBiYWNrIHRvIHRoZSBwb29sLlxuICAgICAgICAgIEhvd2xlci5fcmVsZWFzZUh0bWw1QXVkaW8oc291bmRzW2ldLl9ub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtcHR5IG91dCBhbGwgb2YgdGhlIG5vZGVzLlxuICAgICAgICBkZWxldGUgc291bmRzW2ldLl9ub2RlO1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgdGltZXJzIGFyZSBjbGVhcmVkIG91dC5cbiAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZHNbaV0uX2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIHRoZSByZWZlcmVuY2VzIGluIHRoZSBnbG9iYWwgSG93bGVyIG9iamVjdC5cbiAgICAgIHZhciBpbmRleCA9IEhvd2xlci5faG93bHMuaW5kZXhPZihzZWxmKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIEhvd2xlci5faG93bHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIHRoaXMgc291bmQgZnJvbSB0aGUgY2FjaGUgKGlmIG5vIG90aGVyIEhvd2wgaXMgdXNpbmcgaXQpLlxuICAgICAgdmFyIHJlbUNhY2hlID0gdHJ1ZTtcbiAgICAgIGZvciAoaT0wOyBpPEhvd2xlci5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEhvd2xlci5faG93bHNbaV0uX3NyYyA9PT0gc2VsZi5fc3JjIHx8IHNlbGYuX3NyYy5pbmRleE9mKEhvd2xlci5faG93bHNbaV0uX3NyYykgPj0gMCkge1xuICAgICAgICAgIHJlbUNhY2hlID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNhY2hlICYmIHJlbUNhY2hlKSB7XG4gICAgICAgIGRlbGV0ZSBjYWNoZVtzZWxmLl9zcmNdO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciBnbG9iYWwgZXJyb3JzLlxuICAgICAgSG93bGVyLm5vQXVkaW8gPSBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgb3V0IGBzZWxmYC5cbiAgICAgIHNlbGYuX3N0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgIHNlbGYuX3NvdW5kcyA9IFtdO1xuICAgICAgc2VsZiA9IG51bGw7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnQuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgIExpc3RlbmVyIHRvIGNhbGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIGlkICAgIChvcHRpb25hbCkgT25seSBsaXN0ZW4gdG8gZXZlbnRzIGZvciB0aGlzIHNvdW5kLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gICBvbmNlICAoSU5URVJOQUwpIE1hcmtzIGV2ZW50IHRvIGZpcmUgb25seSBvbmNlLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uKGV2ZW50LCBmbiwgaWQsIG9uY2UpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBzZWxmWydfb24nICsgZXZlbnRdO1xuXG4gICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKG9uY2UgPyB7aWQ6IGlkLCBmbjogZm4sIG9uY2U6IG9uY2V9IDoge2lkOiBpZCwgZm46IGZufSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBjdXN0b20gZXZlbnQuIENhbGwgd2l0aG91dCBwYXJhbWV0ZXJzIHRvIHJlbW92ZSBhbGwgZXZlbnRzLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gICBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAgICBMaXN0ZW5lciB0byByZW1vdmUuIExlYXZlIGVtcHR5IHRvIHJlbW92ZSBhbGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIGlkICAgIChvcHRpb25hbCkgT25seSByZW1vdmUgZXZlbnRzIGZvciB0aGlzIHNvdW5kLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbihldmVudCwgZm4sIGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZXZlbnRzID0gc2VsZlsnX29uJyArIGV2ZW50XTtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgLy8gQWxsb3cgcGFzc2luZyBqdXN0IGFuIGV2ZW50IGFuZCBJRC5cbiAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlkID0gZm47XG4gICAgICAgIGZuID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZuIHx8IGlkKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBldmVudCBzdG9yZSBhbmQgcmVtb3ZlIHRoZSBwYXNzZWQgZnVuY3Rpb24uXG4gICAgICAgIGZvciAoaT0wOyBpPGV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBpc0lkID0gKGlkID09PSBldmVudHNbaV0uaWQpO1xuICAgICAgICAgIGlmIChmbiA9PT0gZXZlbnRzW2ldLmZuICYmIGlzSWQgfHwgIWZuICYmIGlzSWQpIHtcbiAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQpIHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IGFsbCBldmVudHMgb2YgdGhpcyB0eXBlLlxuICAgICAgICBzZWxmWydfb24nICsgZXZlbnRdID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGVhciBvdXQgYWxsIGV2ZW50cyBvZiBldmVyeSB0eXBlLlxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNlbGYpO1xuICAgICAgICBmb3IgKGk9MDsgaTxrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKChrZXlzW2ldLmluZGV4T2YoJ19vbicpID09PSAwKSAmJiBBcnJheS5pc0FycmF5KHNlbGZba2V5c1tpXV0pKSB7XG4gICAgICAgICAgICBzZWxmW2tleXNbaV1dID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnQgYW5kIHJlbW92ZSBpdCBvbmNlIGZpcmVkLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gICBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAgICBMaXN0ZW5lciB0byBjYWxsLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gICBpZCAgICAob3B0aW9uYWwpIE9ubHkgbGlzdGVuIHRvIGV2ZW50cyBmb3IgdGhpcyBzb3VuZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIG9uY2U6IGZ1bmN0aW9uKGV2ZW50LCBmbiwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gU2V0dXAgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgc2VsZi5vbihldmVudCwgZm4sIGlkLCAxKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEVtaXQgYWxsIGV2ZW50cyBvZiBhIHNwZWNpZmljIHR5cGUgYW5kIHBhc3MgdGhlIHNvdW5kIGlkLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZXZlbnQgRXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkICAgIFNvdW5kIElELlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gbXNnICAgTWVzc2FnZSB0byBnbyB3aXRoIGV2ZW50LlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2VtaXQ6IGZ1bmN0aW9uKGV2ZW50LCBpZCwgbXNnKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZXZlbnRzID0gc2VsZlsnX29uJyArIGV2ZW50XTtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGV2ZW50IHN0b3JlIGFuZCBmaXJlIGFsbCBmdW5jdGlvbnMuXG4gICAgICBmb3IgKHZhciBpPWV2ZW50cy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7XG4gICAgICAgIC8vIE9ubHkgZmlyZSB0aGUgbGlzdGVuZXIgaWYgdGhlIGNvcnJlY3QgSUQgaXMgdXNlZC5cbiAgICAgICAgaWYgKCFldmVudHNbaV0uaWQgfHwgZXZlbnRzW2ldLmlkID09PSBpZCB8fCBldmVudCA9PT0gJ2xvYWQnKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLCBpZCwgbXNnKTtcbiAgICAgICAgICB9LmJpbmQoc2VsZiwgZXZlbnRzW2ldLmZuKSwgMCk7XG5cbiAgICAgICAgICAvLyBJZiB0aGlzIGV2ZW50IHdhcyBzZXR1cCB3aXRoIGBvbmNlYCwgcmVtb3ZlIGl0LlxuICAgICAgICAgIGlmIChldmVudHNbaV0ub25jZSkge1xuICAgICAgICAgICAgc2VsZi5vZmYoZXZlbnQsIGV2ZW50c1tpXS5mbiwgZXZlbnRzW2ldLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUGFzcyB0aGUgZXZlbnQgdHlwZSBpbnRvIGxvYWQgcXVldWUgc28gdGhhdCBpdCBjYW4gY29udGludWUgc3RlcHBpbmcuXG4gICAgICBzZWxmLl9sb2FkUXVldWUoZXZlbnQpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUXVldWUgb2YgYWN0aW9ucyBpbml0aWF0ZWQgYmVmb3JlIHRoZSBzb3VuZCBoYXMgbG9hZGVkLlxuICAgICAqIFRoZXNlIHdpbGwgYmUgY2FsbGVkIGluIHNlcXVlbmNlLCB3aXRoIHRoZSBuZXh0IG9ubHkgZmlyaW5nXG4gICAgICogYWZ0ZXIgdGhlIHByZXZpb3VzIGhhcyBmaW5pc2hlZCBleGVjdXRpbmcgKGV2ZW4gaWYgYXN5bmMgbGlrZSBwbGF5KS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9sb2FkUXVldWU6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmIChzZWxmLl9xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0YXNrID0gc2VsZi5fcXVldWVbMF07XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgdGFzayBpZiBhIG1hdGNoaW5nIGV2ZW50IHdhcyBwYXNzZWQuXG4gICAgICAgIGlmICh0YXNrLmV2ZW50ID09PSBldmVudCkge1xuICAgICAgICAgIHNlbGYuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gdGhlIHRhc2sgaWYgbm8gZXZlbnQgdHlwZSBpcyBwYXNzZWQuXG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICB0YXNrLmFjdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHBsYXliYWNrIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgZHVyYXRpb24uXG4gICAgICogQHBhcmFtICB7U291bmR9IHNvdW5kIFRoZSBzb3VuZCBvYmplY3QgdG8gd29yayB3aXRoLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2VuZGVkOiBmdW5jdGlvbihzb3VuZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNwcml0ZSA9IHNvdW5kLl9zcHJpdGU7XG5cbiAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBJRSBhbmQgdGhlcmUgd2FzIG5ldHdvcmsgbGF0ZW5jeSB3ZSBtYXkgYmUgY2xpcHBpbmdcbiAgICAgIC8vIGF1ZGlvIGJlZm9yZSBpdCBjb21wbGV0ZXMgcGxheWluZy4gTGV0cyBjaGVjayB0aGUgbm9kZSB0byBtYWtlIHN1cmUgaXRcbiAgICAgIC8vIGJlbGlldmVzIGl0IGhhcyBjb21wbGV0ZWQsIGJlZm9yZSBlbmRpbmcgdGhlIHBsYXliYWNrLlxuICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiAhc291bmQuX25vZGUucGF1c2VkICYmICFzb3VuZC5fbm9kZS5lbmRlZCAmJiBzb3VuZC5fbm9kZS5jdXJyZW50VGltZSA8IHNvdW5kLl9zdG9wKSB7XG4gICAgICAgIHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIDEwMCk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG91bGQgdGhpcyBzb3VuZCBsb29wP1xuICAgICAgdmFyIGxvb3AgPSAhIShzb3VuZC5fbG9vcCB8fCBzZWxmLl9zcHJpdGVbc3ByaXRlXVsyXSk7XG5cbiAgICAgIC8vIEZpcmUgdGhlIGVuZGVkIGV2ZW50LlxuICAgICAgc2VsZi5fZW1pdCgnZW5kJywgc291bmQuX2lkKTtcblxuICAgICAgLy8gUmVzdGFydCB0aGUgcGxheWJhY2sgZm9yIEhUTUw1IEF1ZGlvIGxvb3AuXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmIGxvb3ApIHtcbiAgICAgICAgc2VsZi5zdG9wKHNvdW5kLl9pZCwgdHJ1ZSkucGxheShzb3VuZC5faWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXN0YXJ0IHRoaXMgdGltZXIgaWYgb24gYSBXZWIgQXVkaW8gbG9vcC5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBsb29wKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ3BsYXknLCBzb3VuZC5faWQpO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICBzb3VuZC5fcGxheVN0YXJ0ID0gSG93bGVyLmN0eC5jdXJyZW50VGltZTtcblxuICAgICAgICB2YXIgdGltZW91dCA9ICgoc291bmQuX3N0b3AgLSBzb3VuZC5fc3RhcnQpICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG4gICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcmsgdGhlIG5vZGUgYXMgcGF1c2VkLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmICFsb29wKSB7XG4gICAgICAgIHNvdW5kLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICBzb3VuZC5fZW5kZWQgPSB0cnVlO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kLl9pZCk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICAgIHNlbGYuX2NsZWFuQnVmZmVyKHNvdW5kLl9ub2RlKTtcblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGF1dG8tc3VzcGVuZCBBdWRpb0NvbnRleHQgaWYgbm8gc291bmRzIGFyZSBzdGlsbCBwbGF5aW5nLlxuICAgICAgICBIb3dsZXIuX2F1dG9TdXNwZW5kKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gdXNpbmcgYSBzcHJpdGUsIGVuZCB0aGUgdHJhY2suXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmICFsb29wKSB7XG4gICAgICAgIHNlbGYuc3RvcChzb3VuZC5faWQsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGVuZCB0aW1lciBmb3IgYSBzb3VuZCBwbGF5YmFjay5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBJRC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9jbGVhclRpbWVyOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoc2VsZi5fZW5kVGltZXJzW2lkXSkge1xuICAgICAgICAvLyBDbGVhciB0aGUgdGltZW91dCBvciByZW1vdmUgdGhlIGVuZGVkIGxpc3RlbmVyLlxuICAgICAgICBpZiAodHlwZW9mIHNlbGYuX2VuZFRpbWVyc1tpZF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fZW5kVGltZXJzW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kVGltZXJzW2lkXSwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBzZWxmLl9lbmRUaW1lcnNbaWRdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzb3VuZCBpZGVudGlmaWVkIGJ5IHRoaXMgSUQsIG9yIHJldHVybiBudWxsLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgU291bmQgSURcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9ICAgIFNvdW5kIG9iamVjdCBvciBudWxsLlxuICAgICAqL1xuICAgIF9zb3VuZEJ5SWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCBmaW5kIHRoZSBvbmUgd2l0aCB0aGlzIElELlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaWQgPT09IHNlbGYuX3NvdW5kc1tpXS5faWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc291bmRzW2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gaW5hY3RpdmUgc291bmQgZnJvbSB0aGUgcG9vbCBvciBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAqIEByZXR1cm4ge1NvdW5kfSBTb3VuZCBwbGF5YmFjayBvYmplY3QuXG4gICAgICovXG4gICAgX2luYWN0aXZlU291bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBzZWxmLl9kcmFpbigpO1xuXG4gICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbmFjdGl2ZSBub2RlIHRvIHJlY3ljbGUuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuX3NvdW5kc1tpXS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGluYWN0aXZlIG5vZGUgd2FzIGZvdW5kLCBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAgcmV0dXJuIG5ldyBTb3VuZChzZWxmKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRHJhaW4gZXhjZXNzIGluYWN0aXZlIHNvdW5kcyBmcm9tIHRoZSBwb29sLlxuICAgICAqL1xuICAgIF9kcmFpbjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgbGltaXQgPSBzZWxmLl9wb29sO1xuICAgICAgdmFyIGNudCA9IDA7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSBsZXNzIHNvdW5kcyB0aGFuIHRoZSBtYXggcG9vbCBzaXplLCB3ZSBhcmUgZG9uZS5cbiAgICAgIGlmIChzZWxmLl9zb3VuZHMubGVuZ3RoIDwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGluYWN0aXZlIHNvdW5kcy5cbiAgICAgIGZvciAoaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5fc291bmRzW2ldLl9lbmRlZCkge1xuICAgICAgICAgIGNudCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBleGNlc3MgaW5hY3RpdmUgc291bmRzLCBnb2luZyBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgZm9yIChpPXNlbGYuX3NvdW5kcy5sZW5ndGggLSAxOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgaWYgKGNudCA8PSBsaW1pdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYXVkaW8gc291cmNlIHdoZW4gdXNpbmcgV2ViIEF1ZGlvLlxuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzZWxmLl9zb3VuZHNbaV0uX25vZGUpIHtcbiAgICAgICAgICAgIHNlbGYuX3NvdW5kc1tpXS5fbm9kZS5kaXNjb25uZWN0KDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSBzb3VuZHMgdW50aWwgd2UgaGF2ZSB0aGUgcG9vbCBzaXplLlxuICAgICAgICAgIHNlbGYuX3NvdW5kcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgY250LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBJRCdzIGZyb20gdGhlIHNvdW5kcyBwb29sLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgT25seSByZXR1cm4gb25lIElEIGlmIG9uZSBpcyBwYXNzZWQuXG4gICAgICogQHJldHVybiB7QXJyYXl9ICAgIEFycmF5IG9mIElEcy5cbiAgICAgKi9cbiAgICBfZ2V0U291bmRJZHM6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBpZHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlkcy5wdXNoKHNlbGYuX3NvdW5kc1tpXS5faWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbaWRdO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBzb3VuZCBiYWNrIGludG8gdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICogQHBhcmFtICB7U291bmR9IHNvdW5kIFRoZSBzb3VuZCBvYmplY3QgdG8gd29yayB3aXRoLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX3JlZnJlc2hCdWZmZXI6IGZ1bmN0aW9uKHNvdW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBidWZmZXIgc291cmNlIGZvciBwbGF5YmFjay5cbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSA9IEhvd2xlci5jdHguY3JlYXRlQnVmZmVyU291cmNlKCk7XG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuYnVmZmVyID0gY2FjaGVbc2VsZi5fc3JjXTtcblxuICAgICAgLy8gQ29ubmVjdCB0byB0aGUgY29ycmVjdCBub2RlLlxuICAgICAgaWYgKHNvdW5kLl9wYW5uZXIpIHtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmNvbm5lY3Qoc291bmQuX3Bhbm5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuY29ubmVjdChzb3VuZC5fbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIGxvb3BpbmcgYW5kIHBsYXliYWNrIHJhdGUuXG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcCA9IHNvdW5kLl9sb29wO1xuICAgICAgaWYgKHNvdW5kLl9sb29wKSB7XG4gICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wU3RhcnQgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BFbmQgPSBzb3VuZC5fc3RvcCB8fCAwO1xuICAgICAgfVxuICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShzb3VuZC5fcmF0ZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IG1lbW9yeSBsZWFrcyBieSBjbGVhbmluZyB1cCB0aGUgYnVmZmVyIHNvdXJjZSBhZnRlciBwbGF5YmFjay5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IG5vZGUgU291bmQncyBhdWRpbyBub2RlIGNvbnRhaW5pbmcgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfY2xlYW5CdWZmZXI6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBpc0lPUyA9IEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCdBcHBsZScpID49IDA7XG5cbiAgICAgIGlmIChIb3dsZXIuX3NjcmF0Y2hCdWZmZXIgJiYgbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgbm9kZS5idWZmZXJTb3VyY2Uub25lbmRlZCA9IG51bGw7XG4gICAgICAgIG5vZGUuYnVmZmVyU291cmNlLmRpc2Nvbm5lY3QoMCk7XG4gICAgICAgIGlmIChpc0lPUykge1xuICAgICAgICAgIHRyeSB7IG5vZGUuYnVmZmVyU291cmNlLmJ1ZmZlciA9IEhvd2xlci5fc2NyYXRjaEJ1ZmZlcjsgfSBjYXRjaChlKSB7fVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlLmJ1ZmZlclNvdXJjZSA9IG51bGw7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNvdXJjZSB0byBhIDAtc2Vjb25kIHNpbGVuY2UgdG8gc3RvcCBhbnkgZG93bmxvYWRpbmcgKGV4Y2VwdCBpbiBJRSkuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBub2RlIEF1ZGlvIG5vZGUgdG8gY2xlYXIuXG4gICAgICovXG4gICAgX2NsZWFyU291bmQ6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBjaGVja0lFID0gL01TSUUgfFRyaWRlbnRcXC8vLnRlc3QoSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIGlmICghY2hlY2tJRSkge1xuICAgICAgICBub2RlLnNyYyA9ICdkYXRhOmF1ZGlvL3dhdjtiYXNlNjQsVWtsR1JpZ0FBQUJYUVZaRlptMTBJQklBQUFBQkFBRUFSS3dBQUloWUFRQUNBQkFBQUFCa1lYUmhBZ0FBQUFFQSc7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBTaW5nbGUgU291bmQgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogU2V0dXAgdGhlIHNvdW5kIG9iamVjdCwgd2hpY2ggZWFjaCBub2RlIGF0dGFjaGVkIHRvIGEgSG93bCBncm91cCBpcyBjb250YWluZWQgaW4uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBob3dsIFRoZSBIb3dsIHBhcmVudCBncm91cC5cbiAgICovXG4gIHZhciBTb3VuZCA9IGZ1bmN0aW9uKGhvd2wpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSBob3dsO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9O1xuICBTb3VuZC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBTb3VuZCBvYmplY3QuXG4gICAgICogQHJldHVybiB7U291bmR9XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBTZXR1cCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLlxuICAgICAgc2VsZi5fbXV0ZWQgPSBwYXJlbnQuX211dGVkO1xuICAgICAgc2VsZi5fbG9vcCA9IHBhcmVudC5fbG9vcDtcbiAgICAgIHNlbGYuX3ZvbHVtZSA9IHBhcmVudC5fdm9sdW1lO1xuICAgICAgc2VsZi5fcmF0ZSA9IHBhcmVudC5fcmF0ZTtcbiAgICAgIHNlbGYuX3NlZWsgPSAwO1xuICAgICAgc2VsZi5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHNlbGYuX2VuZGVkID0gdHJ1ZTtcbiAgICAgIHNlbGYuX3Nwcml0ZSA9ICdfX2RlZmF1bHQnO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBzb3VuZC5cbiAgICAgIHNlbGYuX2lkID0gKytIb3dsZXIuX2NvdW50ZXI7XG5cbiAgICAgIC8vIEFkZCBpdHNlbGYgdG8gdGhlIHBhcmVudCdzIHBvb2wuXG4gICAgICBwYXJlbnQuX3NvdW5kcy5wdXNoKHNlbGYpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIG5ldyBub2RlLlxuICAgICAgc2VsZi5jcmVhdGUoKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgc2V0dXAgYSBuZXcgc291bmQgb2JqZWN0LCB3aGV0aGVyIEhUTUw1IEF1ZGlvIG9yIFdlYiBBdWRpby5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICAgKi9cbiAgICBjcmVhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcbiAgICAgIHZhciB2b2x1bWUgPSAoSG93bGVyLl9tdXRlZCB8fCBzZWxmLl9tdXRlZCB8fCBzZWxmLl9wYXJlbnQuX211dGVkKSA/IDAgOiBzZWxmLl92b2x1bWU7XG5cbiAgICAgIGlmIChwYXJlbnQuX3dlYkF1ZGlvKSB7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgZ2FpbiBub2RlIGZvciBjb250cm9sbGluZyB2b2x1bWUgKHRoZSBzb3VyY2Ugd2lsbCBjb25uZWN0IHRvIHRoaXMpLlxuICAgICAgICBzZWxmLl9ub2RlID0gKHR5cGVvZiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4gPT09ICd1bmRlZmluZWQnKSA/IEhvd2xlci5jdHguY3JlYXRlR2Fpbk5vZGUoKSA6IEhvd2xlci5jdHguY3JlYXRlR2FpbigpO1xuICAgICAgICBzZWxmLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUodm9sdW1lLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc2VsZi5fbm9kZS5wYXVzZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLl9ub2RlLmNvbm5lY3QoSG93bGVyLm1hc3RlckdhaW4pO1xuICAgICAgfSBlbHNlIGlmICghSG93bGVyLm5vQXVkaW8pIHtcbiAgICAgICAgLy8gR2V0IGFuIHVubG9ja2VkIEF1ZGlvIG9iamVjdCBmcm9tIHRoZSBwb29sLlxuICAgICAgICBzZWxmLl9ub2RlID0gSG93bGVyLl9vYnRhaW5IdG1sNUF1ZGlvKCk7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBlcnJvcnMgKGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMtYXV0aG9yLXZpZXcvc3BlYy5odG1sI21lZGlhZXJyb3IpLlxuICAgICAgICBzZWxmLl9lcnJvckZuID0gc2VsZi5fZXJyb3JMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgc2VsZi5fZXJyb3JGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgJ2NhbnBsYXl0aHJvdWdoJyBldmVudCB0byBsZXQgdXMga25vdyB0aGUgc291bmQgaXMgcmVhZHkuXG4gICAgICAgIHNlbGYuX2xvYWRGbiA9IHNlbGYuX2xvYWRMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoSG93bGVyLl9jYW5QbGF5RXZlbnQsIHNlbGYuX2xvYWRGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgdGhlICdlbmRlZCcgZXZlbnQgb24gdGhlIHNvdW5kIHRvIGFjY291bnQgZm9yIGVkZ2UtY2FzZSB3aGVyZVxuICAgICAgICAvLyBhIGZpbml0ZSBzb3VuZCBoYXMgYSBkdXJhdGlvbiBvZiBJbmZpbml0eS5cbiAgICAgICAgc2VsZi5fZW5kRm4gPSBzZWxmLl9lbmRMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kRm4sIGZhbHNlKTtcblxuICAgICAgICAvLyBTZXR1cCB0aGUgbmV3IGF1ZGlvIG5vZGUuXG4gICAgICAgIHNlbGYuX25vZGUuc3JjID0gcGFyZW50Ll9zcmM7XG4gICAgICAgIHNlbGYuX25vZGUucHJlbG9hZCA9IHBhcmVudC5fcHJlbG9hZCA9PT0gdHJ1ZSA/ICdhdXRvJyA6IHBhcmVudC5fcHJlbG9hZDtcbiAgICAgICAgc2VsZi5fbm9kZS52b2x1bWUgPSB2b2x1bWUgKiBIb3dsZXIudm9sdW1lKCk7XG5cbiAgICAgICAgLy8gQmVnaW4gbG9hZGluZyB0aGUgc291cmNlLlxuICAgICAgICBzZWxmLl9ub2RlLmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgc291bmQgdG8gdGhlIG9yaWdpbmFsIHN0YXRlIChmb3IgcmVjeWNsZSkuXG4gICAgICogQHJldHVybiB7U291bmR9XG4gICAgICovXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gUmVzZXQgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgc291bmQuXG4gICAgICBzZWxmLl9tdXRlZCA9IHBhcmVudC5fbXV0ZWQ7XG4gICAgICBzZWxmLl9sb29wID0gcGFyZW50Ll9sb29wO1xuICAgICAgc2VsZi5fdm9sdW1lID0gcGFyZW50Ll92b2x1bWU7XG4gICAgICBzZWxmLl9yYXRlID0gcGFyZW50Ll9yYXRlO1xuICAgICAgc2VsZi5fc2VlayA9IDA7XG4gICAgICBzZWxmLl9yYXRlU2VlayA9IDA7XG4gICAgICBzZWxmLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fZW5kZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fc3ByaXRlID0gJ19fZGVmYXVsdCc7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IElEIHNvIHRoYXQgaXQgaXNuJ3QgY29uZnVzZWQgd2l0aCB0aGUgcHJldmlvdXMgc291bmQuXG4gICAgICBzZWxmLl9pZCA9ICsrSG93bGVyLl9jb3VudGVyO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSFRNTDUgQXVkaW8gZXJyb3IgbGlzdGVuZXIgY2FsbGJhY2suXG4gICAgICovXG4gICAgX2Vycm9yTGlzdGVuZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBGaXJlIGFuIGVycm9yIGV2ZW50IGFuZCBwYXNzIGJhY2sgdGhlIGNvZGUuXG4gICAgICBzZWxmLl9wYXJlbnQuX2VtaXQoJ2xvYWRlcnJvcicsIHNlbGYuX2lkLCBzZWxmLl9ub2RlLmVycm9yID8gc2VsZi5fbm9kZS5lcnJvci5jb2RlIDogMCk7XG5cbiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgIHNlbGYuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBzZWxmLl9lcnJvckZuLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhUTUw1IEF1ZGlvIGNhbnBsYXl0aHJvdWdoIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIF9sb2FkTGlzdGVuZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gUm91bmQgdXAgdGhlIGR1cmF0aW9uIHRvIGFjY291bnQgZm9yIHRoZSBsb3dlciBwcmVjaXNpb24gaW4gSFRNTDUgQXVkaW8uXG4gICAgICBwYXJlbnQuX2R1cmF0aW9uID0gTWF0aC5jZWlsKHNlbGYuX25vZGUuZHVyYXRpb24gKiAxMCkgLyAxMDtcblxuICAgICAgLy8gU2V0dXAgYSBzcHJpdGUgaWYgbm9uZSBpcyBkZWZpbmVkLlxuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcmVudC5fc3ByaXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGFyZW50Ll9zcHJpdGUgPSB7X19kZWZhdWx0OiBbMCwgcGFyZW50Ll9kdXJhdGlvbiAqIDEwMDBdfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudC5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHBhcmVudC5fc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgcGFyZW50Ll9lbWl0KCdsb2FkJyk7XG4gICAgICAgIHBhcmVudC5fbG9hZFF1ZXVlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgIHNlbGYuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgc2VsZi5fbG9hZEZuLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhUTUw1IEF1ZGlvIGVuZGVkIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIF9lbmRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBPbmx5IGhhbmRsZSB0aGUgYGVuZGVkYGAgZXZlbnQgaWYgdGhlIGR1cmF0aW9uIGlzIEluZmluaXR5LlxuICAgICAgaWYgKHBhcmVudC5fZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcGFyZW50IGR1cmF0aW9uIHRvIG1hdGNoIHRoZSByZWFsIGF1ZGlvIGR1cmF0aW9uLlxuICAgICAgICAvLyBSb3VuZCB1cCB0aGUgZHVyYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlIGxvd2VyIHByZWNpc2lvbiBpbiBIVE1MNSBBdWRpby5cbiAgICAgICAgcGFyZW50Ll9kdXJhdGlvbiA9IE1hdGguY2VpbChzZWxmLl9ub2RlLmR1cmF0aW9uICogMTApIC8gMTA7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzcHJpdGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcmVhbCBkdXJhdGlvbi5cbiAgICAgICAgaWYgKHBhcmVudC5fc3ByaXRlLl9fZGVmYXVsdFsxXSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICBwYXJlbnQuX3Nwcml0ZS5fX2RlZmF1bHRbMV0gPSBwYXJlbnQuX2R1cmF0aW9uICogMTAwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJ1biB0aGUgcmVndWxhciBlbmRlZCBtZXRob2QuXG4gICAgICAgIHBhcmVudC5fZW5kZWQoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBsaXN0ZW5lciBzaW5jZSB0aGUgZHVyYXRpb24gaXMgbm93IGNvcnJlY3QuXG4gICAgICBzZWxmLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kRm4sIGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIEhlbHBlciBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHZhciBjYWNoZSA9IHt9O1xuXG4gIC8qKlxuICAgKiBCdWZmZXIgYSBzb3VuZCBmcm9tIFVSTCwgRGF0YSBVUkkgb3IgY2FjaGUgYW5kIGRlY29kZSB0byBhdWRpbyBzb3VyY2UgKFdlYiBBdWRpbyBBUEkpLlxuICAgKiBAcGFyYW0gIHtIb3dsfSBzZWxmXG4gICAqL1xuICB2YXIgbG9hZEJ1ZmZlciA9IGZ1bmN0aW9uKHNlbGYpIHtcbiAgICB2YXIgdXJsID0gc2VsZi5fc3JjO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGNhY2hlZCBhbmQgdXNlIGl0IGluc3RlYWQuXG4gICAgaWYgKGNhY2hlW3VybF0pIHtcbiAgICAgIC8vIFNldCB0aGUgZHVyYXRpb24gZnJvbSB0aGUgY2FjaGUuXG4gICAgICBzZWxmLl9kdXJhdGlvbiA9IGNhY2hlW3VybF0uZHVyYXRpb247XG5cbiAgICAgIC8vIExvYWQgdGhlIHNvdW5kIGludG8gdGhpcyBIb3dsLlxuICAgICAgbG9hZFNvdW5kKHNlbGYpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKC9eZGF0YTpbXjtdKztiYXNlNjQsLy50ZXN0KHVybCkpIHtcbiAgICAgIC8vIERlY29kZSB0aGUgYmFzZTY0IGRhdGEgVVJJIHdpdGhvdXQgWEhSLCBzaW5jZSBzb21lIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgaXQuXG4gICAgICB2YXIgZGF0YSA9IGF0b2IodXJsLnNwbGl0KCcsJylbMV0pO1xuICAgICAgdmFyIGRhdGFWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGF0YVZpZXdbaV0gPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgICB9XG5cbiAgICAgIGRlY29kZUF1ZGlvRGF0YShkYXRhVmlldy5idWZmZXIsIHNlbGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMb2FkIHRoZSBidWZmZXIgZnJvbSB0aGUgVVJMLlxuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgeGhyLm9wZW4oc2VsZi5feGhyLm1ldGhvZCwgdXJsLCB0cnVlKTtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBzZWxmLl94aHIud2l0aENyZWRlbnRpYWxzO1xuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG5cbiAgICAgIC8vIEFwcGx5IGFueSBjdXN0b20gaGVhZGVycyB0byB0aGUgcmVxdWVzdC5cbiAgICAgIGlmIChzZWxmLl94aHIuaGVhZGVycykge1xuICAgICAgICBPYmplY3Qua2V5cyhzZWxmLl94aHIuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIHNlbGYuX3hoci5oZWFkZXJzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZ2V0IGEgc3VjY2Vzc2Z1bCByZXNwb25zZSBiYWNrLlxuICAgICAgICB2YXIgY29kZSA9ICh4aHIuc3RhdHVzICsgJycpWzBdO1xuICAgICAgICBpZiAoY29kZSAhPT0gJzAnICYmIGNvZGUgIT09ICcyJyAmJiBjb2RlICE9PSAnMycpIHtcbiAgICAgICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnRmFpbGVkIGxvYWRpbmcgYXVkaW8gZmlsZSB3aXRoIHN0YXR1czogJyArIHhoci5zdGF0dXMgKyAnLicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZUF1ZGlvRGF0YSh4aHIucmVzcG9uc2UsIHNlbGYpO1xuICAgICAgfTtcbiAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGVycm9yLCBzd2l0Y2ggdG8gSFRNTDUgQXVkaW8uXG4gICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIHNlbGYuX2h0bWw1ID0gdHJ1ZTtcbiAgICAgICAgICBzZWxmLl93ZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgICAgIHNlbGYuX3NvdW5kcyA9IFtdO1xuICAgICAgICAgIGRlbGV0ZSBjYWNoZVt1cmxdO1xuICAgICAgICAgIHNlbGYubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc2FmZVhoclNlbmQoeGhyKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIFhIUiByZXF1ZXN0IHdyYXBwZWQgaW4gYSB0cnkvY2F0Y2guXG4gICAqIEBwYXJhbSAge09iamVjdH0geGhyIFhIUiB0byBzZW5kLlxuICAgKi9cbiAgdmFyIHNhZmVYaHJTZW5kID0gZnVuY3Rpb24oeGhyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHhoci5zZW5kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgeGhyLm9uZXJyb3IoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY29kZSBhdWRpbyBkYXRhIGZyb20gYW4gYXJyYXkgYnVmZmVyLlxuICAgKiBAcGFyYW0gIHtBcnJheUJ1ZmZlcn0gYXJyYXlidWZmZXIgVGhlIGF1ZGlvIGRhdGEuXG4gICAqIEBwYXJhbSAge0hvd2x9ICAgICAgICBzZWxmXG4gICAqL1xuICB2YXIgZGVjb2RlQXVkaW9EYXRhID0gZnVuY3Rpb24oYXJyYXlidWZmZXIsIHNlbGYpIHtcbiAgICAvLyBGaXJlIGEgbG9hZCBlcnJvciBpZiBzb21ldGhpbmcgYnJva2UuXG4gICAgdmFyIGVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnRGVjb2RpbmcgYXVkaW8gZGF0YSBmYWlsZWQuJyk7XG4gICAgfTtcblxuICAgIC8vIExvYWQgdGhlIHNvdW5kIG9uIHN1Y2Nlc3MuXG4gICAgdmFyIHN1Y2Nlc3MgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgIGlmIChidWZmZXIgJiYgc2VsZi5fc291bmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2FjaGVbc2VsZi5fc3JjXSA9IGJ1ZmZlcjtcbiAgICAgICAgbG9hZFNvdW5kKHNlbGYsIGJ1ZmZlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBEZWNvZGUgdGhlIGJ1ZmZlciBpbnRvIGFuIGF1ZGlvIHNvdXJjZS5cbiAgICBpZiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIEhvd2xlci5jdHguZGVjb2RlQXVkaW9EYXRhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgSG93bGVyLmN0eC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlidWZmZXIpLnRoZW4oc3VjY2VzcykuY2F0Y2goZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBIb3dsZXIuY3R4LmRlY29kZUF1ZGlvRGF0YShhcnJheWJ1ZmZlciwgc3VjY2VzcywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb3VuZCBpcyBub3cgbG9hZGVkLCBzbyBmaW5pc2ggc2V0dGluZyBldmVyeXRoaW5nIHVwIGFuZCBmaXJlIHRoZSBsb2FkZWQgZXZlbnQuXG4gICAqIEBwYXJhbSAge0hvd2x9IHNlbGZcbiAgICogQHBhcmFtICB7T2JqZWN0fSBidWZmZXIgVGhlIGRlY29kZWQgYnVmZmVyIHNvdW5kIHNvdXJjZS5cbiAgICovXG4gIHZhciBsb2FkU291bmQgPSBmdW5jdGlvbihzZWxmLCBidWZmZXIpIHtcbiAgICAvLyBTZXQgdGhlIGR1cmF0aW9uLlxuICAgIGlmIChidWZmZXIgJiYgIXNlbGYuX2R1cmF0aW9uKSB7XG4gICAgICBzZWxmLl9kdXJhdGlvbiA9IGJ1ZmZlci5kdXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBTZXR1cCBhIHNwcml0ZSBpZiBub25lIGlzIGRlZmluZWQuXG4gICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuX3Nwcml0ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxmLl9zcHJpdGUgPSB7X19kZWZhdWx0OiBbMCwgc2VsZi5fZHVyYXRpb24gKiAxMDAwXX07XG4gICAgfVxuXG4gICAgLy8gRmlyZSB0aGUgbG9hZGVkIGV2ZW50LlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ2xvYWRlZCc7XG4gICAgICBzZWxmLl9lbWl0KCdsb2FkJyk7XG4gICAgICBzZWxmLl9sb2FkUXVldWUoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBhdWRpbyBjb250ZXh0IHdoZW4gYXZhaWxhYmxlLCBvciBzd2l0Y2ggdG8gSFRNTDUgQXVkaW8gbW9kZS5cbiAgICovXG4gIHZhciBzZXR1cEF1ZGlvQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIElmIHdlIGhhdmUgYWxyZWFkeSBkZXRlY3RlZCB0aGF0IFdlYiBBdWRpbyBpc24ndCBzdXBwb3J0ZWQsIGRvbid0IHJ1biB0aGlzIHN0ZXAgYWdhaW4uXG4gICAgaWYgKCFIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHdlIGFyZSB1c2luZyBXZWIgQXVkaW8gYW5kIHNldHVwIHRoZSBBdWRpb0NvbnRleHQgaWYgd2UgYXJlLlxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIEF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgSG93bGVyLmN0eCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdlYmtpdEF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgSG93bGVyLmN0eCA9IG5ldyB3ZWJraXRBdWRpb0NvbnRleHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhdWRpbyBjb250ZXh0IGNyZWF0aW9uIHN0aWxsIGZhaWxlZCwgc2V0IHVzaW5nIHdlYiBhdWRpbyB0byBmYWxzZS5cbiAgICBpZiAoIUhvd2xlci5jdHgpIHtcbiAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSB3ZWJ2aWV3IGlzIGJlaW5nIHVzZWQgb24gaU9TOCBvciBlYXJsaWVyIChyYXRoZXIgdGhhbiB0aGUgYnJvd3NlcikuXG4gICAgLy8gSWYgaXQgaXMsIGRpc2FibGUgV2ViIEF1ZGlvIGFzIGl0IGNhdXNlcyBjcmFzaGluZy5cbiAgICB2YXIgaU9TID0gKC9pUChob25lfG9kfGFkKS8udGVzdChIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci5wbGF0Zm9ybSkpO1xuICAgIHZhciBhcHBWZXJzaW9uID0gSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvT1MgKFxcZCspXyhcXGQrKV8/KFxcZCspPy8pO1xuICAgIHZhciB2ZXJzaW9uID0gYXBwVmVyc2lvbiA/IHBhcnNlSW50KGFwcFZlcnNpb25bMV0sIDEwKSA6IG51bGw7XG4gICAgaWYgKGlPUyAmJiB2ZXJzaW9uICYmIHZlcnNpb24gPCA5KSB7XG4gICAgICB2YXIgc2FmYXJpID0gL3NhZmFyaS8udGVzdChIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XG4gICAgICBpZiAoSG93bGVyLl9uYXZpZ2F0b3IgJiYgIXNhZmFyaSkge1xuICAgICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbmQgZXhwb3NlIHRoZSBtYXN0ZXIgR2Fpbk5vZGUgd2hlbiB1c2luZyBXZWIgQXVkaW8gKHVzZWZ1bCBmb3IgcGx1Z2lucyBvciBhZHZhbmNlZCB1c2FnZSkuXG4gICAgaWYgKEhvd2xlci51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICBIb3dsZXIubWFzdGVyR2FpbiA9ICh0eXBlb2YgSG93bGVyLmN0eC5jcmVhdGVHYWluID09PSAndW5kZWZpbmVkJykgPyBIb3dsZXIuY3R4LmNyZWF0ZUdhaW5Ob2RlKCkgOiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgIEhvd2xlci5tYXN0ZXJHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUoSG93bGVyLl9tdXRlZCA/IDAgOiBIb3dsZXIuX3ZvbHVtZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICBIb3dsZXIubWFzdGVyR2Fpbi5jb25uZWN0KEhvd2xlci5jdHguZGVzdGluYXRpb24pO1xuICAgIH1cblxuICAgIC8vIFJlLXJ1biB0aGUgc2V0dXAgb24gSG93bGVyLlxuICAgIEhvd2xlci5fc2V0dXAoKTtcbiAgfTtcblxuICAvLyBBZGQgc3VwcG9ydCBmb3IgQU1EIChBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24pIGxpYnJhcmllcyBzdWNoIGFzIHJlcXVpcmUuanMuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgSG93bGVyOiBIb3dsZXIsXG4gICAgICAgIEhvd2w6IEhvd2xcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBBZGQgc3VwcG9ydCBmb3IgQ29tbW9uSlMgbGlicmFyaWVzIHN1Y2ggYXMgYnJvd3NlcmlmeS5cbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMuSG93bGVyID0gSG93bGVyO1xuICAgIGV4cG9ydHMuSG93bCA9IEhvd2w7XG4gIH1cblxuICAvLyBBZGQgdG8gZ2xvYmFsIGluIE5vZGUuanMgKGZvciB0ZXN0aW5nLCBldGMpLlxuICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBnbG9iYWwuSG93bGVyR2xvYmFsID0gSG93bGVyR2xvYmFsO1xuICAgIGdsb2JhbC5Ib3dsZXIgPSBIb3dsZXI7XG4gICAgZ2xvYmFsLkhvd2wgPSBIb3dsO1xuICAgIGdsb2JhbC5Tb3VuZCA9IFNvdW5kO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7ICAvLyBEZWZpbmUgZ2xvYmFsbHkgaW4gY2FzZSBBTUQgaXMgbm90IGF2YWlsYWJsZSBvciB1bnVzZWQuXG4gICAgd2luZG93Lkhvd2xlckdsb2JhbCA9IEhvd2xlckdsb2JhbDtcbiAgICB3aW5kb3cuSG93bGVyID0gSG93bGVyO1xuICAgIHdpbmRvdy5Ib3dsID0gSG93bDtcbiAgICB3aW5kb3cuU291bmQgPSBTb3VuZDtcbiAgfVxufSkoKTtcblxuXG4vKiFcbiAqICBTcGF0aWFsIFBsdWdpbiAtIEFkZHMgc3VwcG9ydCBmb3Igc3RlcmVvIGFuZCAzRCBhdWRpbyB3aGVyZSBXZWIgQXVkaW8gaXMgc3VwcG9ydGVkLlxuICogIFxuICogIGhvd2xlci5qcyB2Mi4yLjFcbiAqICBob3dsZXJqcy5jb21cbiAqXG4gKiAgKGMpIDIwMTMtMjAyMCwgSmFtZXMgU2ltcHNvbiBvZiBHb2xkRmlyZSBTdHVkaW9zXG4gKiAgZ29sZGZpcmVzdHVkaW9zLmNvbVxuICpcbiAqICBNSVQgTGljZW5zZVxuICovXG5cbihmdW5jdGlvbigpIHtcblxuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gU2V0dXAgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlLl9wb3MgPSBbMCwgMCwgMF07XG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUuX29yaWVudGF0aW9uID0gWzAsIDAsIC0xLCAwLCAxLCAwXTtcblxuICAvKiogR2xvYmFsIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gdXBkYXRlIHRoZSBzdGVyZW8gcGFubmluZyBwb3NpdGlvbiBvZiBhbGwgY3VycmVudCBIb3dscy5cbiAgICogRnV0dXJlIEhvd2xzIHdpbGwgbm90IHVzZSB0aGlzIHZhbHVlIHVubGVzcyBleHBsaWNpdGx5IHNldC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBwYW4gQSB2YWx1ZSBvZiAtMS4wIGlzIGFsbCB0aGUgd2F5IGxlZnQgYW5kIDEuMCBpcyBhbGwgdGhlIHdheSByaWdodC5cbiAgICogQHJldHVybiB7SG93bGVyL051bWJlcn0gICAgIFNlbGYgb3IgY3VycmVudCBzdGVyZW8gcGFubmluZyB2YWx1ZS5cbiAgICovXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUuc3RlcmVvID0gZnVuY3Rpb24ocGFuKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLmN0eCB8fCAhc2VsZi5jdHgubGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgSG93bHMgYW5kIHVwZGF0ZSB0aGVpciBzdGVyZW8gcGFubmluZy5cbiAgICBmb3IgKHZhciBpPXNlbGYuX2hvd2xzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgIHNlbGYuX2hvd2xzW2ldLnN0ZXJlbyhwYW4pO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbGlzdGVuZXIgaW4gM0QgY2FydGVzaWFuIHNwYWNlLiBTb3VuZHMgdXNpbmdcbiAgICogM0QgcG9zaXRpb24gd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbGlzdGVuZXIncyBwb3NpdGlvbi5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4IFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5IFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6IFRoZSB6LXBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHJldHVybiB7SG93bGVyL0FycmF5fSAgIFNlbGYgb3IgY3VycmVudCBsaXN0ZW5lciBwb3NpdGlvbi5cbiAgICovXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUucG9zID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5jdHggfHwgIXNlbGYuY3R4Lmxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHRzIGZvciBvcHRpb25hbCAneScgJiAneicuXG4gICAgeSA9ICh0eXBlb2YgeSAhPT0gJ251bWJlcicpID8gc2VsZi5fcG9zWzFdIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9wb3NbMl0gOiB6O1xuXG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgc2VsZi5fcG9zID0gW3gsIHksIHpdO1xuXG4gICAgICBpZiAodHlwZW9mIHNlbGYuY3R4Lmxpc3RlbmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIucG9zaXRpb25YLnNldFRhcmdldEF0VGltZShzZWxmLl9wb3NbMF0sIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnBvc2l0aW9uWS5zZXRUYXJnZXRBdFRpbWUoc2VsZi5fcG9zWzFdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5wb3NpdGlvblouc2V0VGFyZ2V0QXRUaW1lKHNlbGYuX3Bvc1syXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnNldFBvc2l0aW9uKHNlbGYuX3Bvc1swXSwgc2VsZi5fcG9zWzFdLCBzZWxmLl9wb3NbMl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2VsZi5fcG9zO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBkaXJlY3Rpb24gdGhlIGxpc3RlbmVyIGlzIHBvaW50aW5nIGluIHRoZSAzRCBjYXJ0ZXNpYW4gc3BhY2UuXG4gICAqIEEgZnJvbnQgYW5kIHVwIHZlY3RvciBtdXN0IGJlIHByb3ZpZGVkLiBUaGUgZnJvbnQgaXMgdGhlIGRpcmVjdGlvbiB0aGVcbiAgICogZmFjZSBvZiB0aGUgbGlzdGVuZXIgaXMgcG9pbnRpbmcsIGFuZCB1cCBpcyB0aGUgZGlyZWN0aW9uIHRoZSB0b3Agb2YgdGhlXG4gICAqIGxpc3RlbmVyIGlzIHBvaW50aW5nLiBUaHVzLCB0aGVzZSB2YWx1ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGF0IHJpZ2h0IGFuZ2xlc1xuICAgKiBmcm9tIGVhY2ggb3RoZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geCAgIFRoZSB4LW9yaWVudGF0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5ICAgVGhlIHktb3JpZW50YXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogICBUaGUgei1vcmllbnRhdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geFVwIFRoZSB4LW9yaWVudGF0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHlVcCBUaGUgeS1vcmllbnRhdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6VXAgVGhlIHotb3JpZW50YXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEByZXR1cm4ge0hvd2xlci9BcnJheX0gICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBvcmllbnRhdGlvbiB2ZWN0b3JzLlxuICAgKi9cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IGZ1bmN0aW9uKHgsIHksIHosIHhVcCwgeVVwLCB6VXApIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuY3R4IHx8ICFzZWxmLmN0eC5saXN0ZW5lcikge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgJ3knICYgJ3onLlxuICAgIHZhciBvciA9IHNlbGYuX29yaWVudGF0aW9uO1xuICAgIHkgPSAodHlwZW9mIHkgIT09ICdudW1iZXInKSA/IG9yWzFdIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyBvclsyXSA6IHo7XG4gICAgeFVwID0gKHR5cGVvZiB4VXAgIT09ICdudW1iZXInKSA/IG9yWzNdIDogeFVwO1xuICAgIHlVcCA9ICh0eXBlb2YgeVVwICE9PSAnbnVtYmVyJykgPyBvcls0XSA6IHlVcDtcbiAgICB6VXAgPSAodHlwZW9mIHpVcCAhPT0gJ251bWJlcicpID8gb3JbNV0gOiB6VXA7XG5cbiAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IFt4LCB5LCB6LCB4VXAsIHlVcCwgelVwXTtcblxuICAgICAgaWYgKHR5cGVvZiBzZWxmLmN0eC5saXN0ZW5lci5mb3J3YXJkWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuZm9yd2FyZFguc2V0VGFyZ2V0QXRUaW1lKHgsIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLmZvcndhcmRZLnNldFRhcmdldEF0VGltZSh5LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5mb3J3YXJkWi5zZXRUYXJnZXRBdFRpbWUoeiwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIudXBYLnNldFRhcmdldEF0VGltZSh4VXAsIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnVwWS5zZXRUYXJnZXRBdFRpbWUoeVVwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci51cFouc2V0VGFyZ2V0QXRUaW1lKHpVcCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnNldE9yaWVudGF0aW9uKHgsIHksIHosIHhVcCwgeVVwLCB6VXApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqIEdyb3VwIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEFkZCBuZXcgcHJvcGVydGllcyB0byB0aGUgY29yZSBpbml0LlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gX3N1cGVyIENvcmUgaW5pdCBtZXRob2QuXG4gICAqIEByZXR1cm4ge0hvd2x9XG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5pbml0ID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFNldHVwIHVzZXItZGVmaW5lZCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IG8ub3JpZW50YXRpb24gfHwgWzEsIDAsIDBdO1xuICAgICAgc2VsZi5fc3RlcmVvID0gby5zdGVyZW8gfHwgbnVsbDtcbiAgICAgIHNlbGYuX3BvcyA9IG8ucG9zIHx8IG51bGw7XG4gICAgICBzZWxmLl9wYW5uZXJBdHRyID0ge1xuICAgICAgICBjb25lSW5uZXJBbmdsZTogdHlwZW9mIG8uY29uZUlubmVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lSW5uZXJBbmdsZSA6IDM2MCxcbiAgICAgICAgY29uZU91dGVyQW5nbGU6IHR5cGVvZiBvLmNvbmVPdXRlckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyQW5nbGUgOiAzNjAsXG4gICAgICAgIGNvbmVPdXRlckdhaW46IHR5cGVvZiBvLmNvbmVPdXRlckdhaW4gIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJHYWluIDogMCxcbiAgICAgICAgZGlzdGFuY2VNb2RlbDogdHlwZW9mIG8uZGlzdGFuY2VNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLmRpc3RhbmNlTW9kZWwgOiAnaW52ZXJzZScsXG4gICAgICAgIG1heERpc3RhbmNlOiB0eXBlb2Ygby5tYXhEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLm1heERpc3RhbmNlIDogMTAwMDAsXG4gICAgICAgIHBhbm5pbmdNb2RlbDogdHlwZW9mIG8ucGFubmluZ01vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmluZ01vZGVsIDogJ0hSVEYnLFxuICAgICAgICByZWZEaXN0YW5jZTogdHlwZW9mIG8ucmVmRGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5yZWZEaXN0YW5jZSA6IDEsXG4gICAgICAgIHJvbGxvZmZGYWN0b3I6IHR5cGVvZiBvLnJvbGxvZmZGYWN0b3IgIT09ICd1bmRlZmluZWQnID8gby5yb2xsb2ZmRmFjdG9yIDogMVxuICAgICAgfTtcblxuICAgICAgLy8gU2V0dXAgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgc2VsZi5fb25zdGVyZW8gPSBvLm9uc3RlcmVvID8gW3tmbjogby5vbnN0ZXJlb31dIDogW107XG4gICAgICBzZWxmLl9vbnBvcyA9IG8ub25wb3MgPyBbe2ZuOiBvLm9ucG9zfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ub3JpZW50YXRpb24gPSBvLm9ub3JpZW50YXRpb24gPyBbe2ZuOiBvLm9ub3JpZW50YXRpb259XSA6IFtdO1xuXG4gICAgICAvLyBDb21wbGV0ZSBpbml0aWxpemF0aW9uIHdpdGggaG93bGVyLmpzIGNvcmUncyBpbml0IGZ1bmN0aW9uLlxuICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIG8pO1xuICAgIH07XG4gIH0pKEhvd2wucHJvdG90eXBlLmluaXQpO1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBzdGVyZW8gcGFubmluZyBvZiB0aGUgYXVkaW8gc291cmNlIGZvciB0aGlzIHNvdW5kIG9yIGFsbCBpbiB0aGUgZ3JvdXAuXG4gICAqIEBwYXJhbSAge051bWJlcn0gcGFuICBBIHZhbHVlIG9mIC0xLjAgaXMgYWxsIHRoZSB3YXkgbGVmdCBhbmQgMS4wIGlzIGFsbCB0aGUgd2F5IHJpZ2h0LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIChvcHRpb25hbCkgVGhlIHNvdW5kIElELiBJZiBub25lIGlzIHBhc3NlZCwgYWxsIGluIGdyb3VwIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9ICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBzdGVyZW8gcGFubmluZyB2YWx1ZS5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLnN0ZXJlbyA9IGZ1bmN0aW9uKHBhbiwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSBzdGVyZW8gcGFuIHdoZW4gY2FwYWJsZS5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdzdGVyZW8nLFxuICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuc3RlcmVvKHBhbiwgaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIFBhbm5lclN0ZXJlb05vZGUgc3VwcG9ydCBhbmQgZmFsbGJhY2sgdG8gUGFubmVyTm9kZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgIHZhciBwYW5uZXJUeXBlID0gKHR5cGVvZiBIb3dsZXIuY3R4LmNyZWF0ZVN0ZXJlb1Bhbm5lciA9PT0gJ3VuZGVmaW5lZCcpID8gJ3NwYXRpYWwnIDogJ3N0ZXJlbyc7XG5cbiAgICAvLyBTZXR1cCB0aGUgZ3JvdXAncyBzdGVyZW8gcGFubmluZyBpZiBubyBJRCBpcyBwYXNzZWQuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBzdGVyZW8gcGFubmluZyBpZiBubyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuXG4gICAgICBpZiAodHlwZW9mIHBhbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2VsZi5fc3RlcmVvID0gcGFuO1xuICAgICAgICBzZWxmLl9wb3MgPSBbcGFuLCAwLCAwXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9zdGVyZW87XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIHRoZSBzdHJlbyBwYW5uaW5nIG9mIG9uZSBvciBhbGwgc291bmRzIGluIGdyb3VwLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgc291bmQuX3N0ZXJlbyA9IHBhbjtcbiAgICAgICAgICBzb3VuZC5fcG9zID0gW3BhbiwgMCwgMF07XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBmYWxsaW5nIGJhY2ssIG1ha2Ugc3VyZSB0aGUgcGFubmluZ01vZGVsIGlzIGVxdWFscG93ZXIuXG4gICAgICAgICAgICBzb3VuZC5fcGFubmVyQXR0ci5wYW5uaW5nTW9kZWwgPSAnZXF1YWxwb3dlcic7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcGFubmVyIHNldHVwIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIG5vdC5cbiAgICAgICAgICAgIGlmICghc291bmQuX3Bhbm5lciB8fCAhc291bmQuX3Bhbm5lci5wYW4pIHtcbiAgICAgICAgICAgICAgc2V0dXBQYW5uZXIoc291bmQsIHBhbm5lclR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFubmVyVHlwZSA9PT0gJ3NwYXRpYWwnKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX3Bhbm5lci5wb3NpdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUocGFuLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWS5zZXRWYWx1ZUF0VGltZSgwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZSgwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnNldFBvc2l0aW9uKHBhbiwgMCwgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucGFuLnNldFZhbHVlQXRUaW1lKHBhbiwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgnc3RlcmVvJywgc291bmQuX2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc291bmQuX3N0ZXJlbztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSAzRCBzcGF0aWFsIHBvc2l0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UgZm9yIHRoaXMgc291bmQgb3IgZ3JvdXAgcmVsYXRpdmUgdG8gdGhlIGdsb2JhbCBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4ICBUaGUgeC1wb3NpdGlvbiBvZiB0aGUgYXVkaW8gc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgIFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geiAgVGhlIHotcG9zaXRpb24gb2YgdGhlIGF1ZGlvIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAob3B0aW9uYWwpIFRoZSBzb3VuZCBJRC4gSWYgbm9uZSBpcyBwYXNzZWQsIGFsbCBpbiBncm91cCB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEByZXR1cm4ge0hvd2wvQXJyYXl9ICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCAzRCBzcGF0aWFsIHBvc2l0aW9uOiBbeCwgeSwgel0uXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5wb3MgPSBmdW5jdGlvbih4LCB5LCB6LCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHBvc2l0aW9uIHdoZW4gY2FwYWJsZS5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdwb3MnLFxuICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYucG9zKHgsIHksIHosIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyAwIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyAtMC41IDogejtcblxuICAgIC8vIFNldHVwIHRoZSBncm91cCdzIHNwYXRpYWwgcG9zaXRpb24gaWYgbm8gSUQgaXMgcGFzc2VkLlxuICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3Mgc3BhdGlhbCBwb3NpdGlvbiBpZiBubyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuXG4gICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNlbGYuX3BvcyA9IFt4LCB5LCB6XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9wb3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIHRoZSBzcGF0aWFsIHBvc2l0aW9uIG9mIG9uZSBvciBhbGwgc291bmRzIGluIGdyb3VwLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNvdW5kLl9wb3MgPSBbeCwgeSwgel07XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcGFubmVyIHNldHVwIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIG5vdC5cbiAgICAgICAgICAgIGlmICghc291bmQuX3Bhbm5lciB8fCBzb3VuZC5fcGFubmVyLnBhbikge1xuICAgICAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgJ3NwYXRpYWwnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoeCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKHksIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZSh6LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0UG9zaXRpb24oeCwgeSwgeik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgncG9zJywgc291bmQuX2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc291bmQuX3BvcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBkaXJlY3Rpb24gdGhlIGF1ZGlvIHNvdXJjZSBpcyBwb2ludGluZyBpbiB0aGUgM0QgY2FydGVzaWFuIGNvb3JkaW5hdGVcbiAgICogc3BhY2UuIERlcGVuZGluZyBvbiBob3cgZGlyZWN0aW9uIHRoZSBzb3VuZCBpcywgYmFzZWQgb24gdGhlIGBjb25lYCBhdHRyaWJ1dGVzLFxuICAgKiBhIHNvdW5kIHBvaW50aW5nIGF3YXkgZnJvbSB0aGUgbGlzdGVuZXIgY2FuIGJlIHF1aWV0IG9yIHNpbGVudC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4ICBUaGUgeC1vcmllbnRhdGlvbiBvZiB0aGUgc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgIFRoZSB5LW9yaWVudGF0aW9uIG9mIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geiAgVGhlIHotb3JpZW50YXRpb24gb2YgdGhlIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAob3B0aW9uYWwpIFRoZSBzb3VuZCBJRC4gSWYgbm9uZSBpcyBwYXNzZWQsIGFsbCBpbiBncm91cCB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEByZXR1cm4ge0hvd2wvQXJyYXl9ICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCAzRCBzcGF0aWFsIG9yaWVudGF0aW9uOiBbeCwgeSwgel0uXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IGZ1bmN0aW9uKHgsIHksIHosIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2Ugb3JpZW50YXRpb24gd2hlbiBjYXBhYmxlLlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogJ29yaWVudGF0aW9uJyxcbiAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLm9yaWVudGF0aW9uKHgsIHksIHosIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9vcmllbnRhdGlvblsxXSA6IHk7XG4gICAgeiA9ICh0eXBlb2YgeiAhPT0gJ251bWJlcicpID8gc2VsZi5fb3JpZW50YXRpb25bMl0gOiB6O1xuXG4gICAgLy8gU2V0dXAgdGhlIGdyb3VwJ3Mgc3BhdGlhbCBvcmllbnRhdGlvbiBpZiBubyBJRCBpcyBwYXNzZWQuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBzcGF0aWFsIG9yaWVudGF0aW9uIGlmIG5vIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC5cbiAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBbeCwgeSwgel07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc2VsZi5fb3JpZW50YXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIHRoZSBzcGF0aWFsIG9yaWVudGF0aW9uIG9mIG9uZSBvciBhbGwgc291bmRzIGluIGdyb3VwLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNvdW5kLl9vcmllbnRhdGlvbiA9IFt4LCB5LCB6XTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYW5uZXIgc2V0dXAgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbm90LlxuICAgICAgICAgICAgaWYgKCFzb3VuZC5fcGFubmVyKSB7XG4gICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgcG9zaXRpb24gdG8gc2V0dXAgdGhlIG5vZGUgd2l0aC5cbiAgICAgICAgICAgICAgaWYgKCFzb3VuZC5fcG9zKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX3BvcyA9IHNlbGYuX3BvcyB8fCBbMCwgMCwgLTAuNV07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgJ3NwYXRpYWwnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblguc2V0VmFsdWVBdFRpbWUoeCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25ZLnNldFZhbHVlQXRUaW1lKHksIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWi5zZXRWYWx1ZUF0VGltZSh6LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0T3JpZW50YXRpb24oeCwgeSwgeik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgnb3JpZW50YXRpb24nLCBzb3VuZC5faWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzb3VuZC5fb3JpZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgcGFubmVyIG5vZGUncyBhdHRyaWJ1dGVzIGZvciBhIHNvdW5kIG9yIGdyb3VwIG9mIHNvdW5kcy5cbiAgICogVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbCB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAqICAgcGFubmVyQXR0cigpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3MgdmFsdWVzLlxuICAgKiAgIHBhbm5lckF0dHIoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgdmFsdWVzLlxuICAgKiAgIHBhbm5lckF0dHIobykgLT4gU2V0J3MgdGhlIHZhbHVlcyBvZiBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICogICBwYW5uZXJBdHRyKG8sIGlkKSAtPiBTZXQncyB0aGUgdmFsdWVzIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICpcbiAgICogICBBdHRyaWJ1dGVzOlxuICAgKiAgICAgY29uZUlubmVyQW5nbGUgLSAoMzYwIGJ5IGRlZmF1bHQpIEEgcGFyYW1ldGVyIGZvciBkaXJlY3Rpb25hbCBhdWRpbyBzb3VyY2VzLCB0aGlzIGlzIGFuIGFuZ2xlLCBpbiBkZWdyZWVzLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgb2Ygd2hpY2ggdGhlcmUgd2lsbCBiZSBubyB2b2x1bWUgcmVkdWN0aW9uLlxuICAgKiAgICAgY29uZU91dGVyQW5nbGUgLSAoMzYwIGJ5IGRlZmF1bHQpIEEgcGFyYW1ldGVyIGZvciBkaXJlY3Rpb25hbCBhdWRpbyBzb3VyY2VzLCB0aGlzIGlzIGFuIGFuZ2xlLCBpbiBkZWdyZWVzLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBvdXRzaWRlIG9mIHdoaWNoIHRoZSB2b2x1bWUgd2lsbCBiZSByZWR1Y2VkIHRvIGEgY29uc3RhbnQgdmFsdWUgb2YgYGNvbmVPdXRlckdhaW5gLlxuICAgKiAgICAgY29uZU91dGVyR2FpbiAtICgwIGJ5IGRlZmF1bHQpIEEgcGFyYW1ldGVyIGZvciBkaXJlY3Rpb25hbCBhdWRpbyBzb3VyY2VzLCB0aGlzIGlzIHRoZSBnYWluIG91dHNpZGUgb2YgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgYGNvbmVPdXRlckFuZ2xlYC4gSXQgaXMgYSBsaW5lYXIgdmFsdWUgaW4gdGhlIHJhbmdlIGBbMCwgMV1gLlxuICAgKiAgICAgZGlzdGFuY2VNb2RlbCAtICgnaW52ZXJzZScgYnkgZGVmYXVsdCkgRGV0ZXJtaW5lcyBhbGdvcml0aG0gdXNlZCB0byByZWR1Y2Ugdm9sdW1lIGFzIGF1ZGlvIG1vdmVzIGF3YXkgZnJvbVxuICAgKiAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLiBDYW4gYmUgYGxpbmVhcmAsIGBpbnZlcnNlYCBvciBgZXhwb25lbnRpYWwuXG4gICAqICAgICBtYXhEaXN0YW5jZSAtICgxMDAwMCBieSBkZWZhdWx0KSBUaGUgbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIHNvdXJjZSBhbmQgbGlzdGVuZXIsIGFmdGVyIHdoaWNoIHRoZSB2b2x1bWVcbiAgICogICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgcmVkdWNlZCBhbnkgZnVydGhlci5cbiAgICogICAgIHJlZkRpc3RhbmNlIC0gKDEgYnkgZGVmYXVsdCkgQSByZWZlcmVuY2UgZGlzdGFuY2UgZm9yIHJlZHVjaW5nIHZvbHVtZSBhcyBzb3VyY2UgbW92ZXMgZnVydGhlciBmcm9tIHRoZSBsaXN0ZW5lci5cbiAgICogICAgICAgICAgICAgICAgICAgVGhpcyBpcyBzaW1wbHkgYSB2YXJpYWJsZSBvZiB0aGUgZGlzdGFuY2UgbW9kZWwgYW5kIGhhcyBhIGRpZmZlcmVudCBlZmZlY3QgZGVwZW5kaW5nIG9uIHdoaWNoIG1vZGVsXG4gICAqICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgYW5kIHRoZSBzY2FsZSBvZiB5b3VyIGNvb3JkaW5hdGVzLiBHZW5lcmFsbHksIHZvbHVtZSB3aWxsIGJlIGVxdWFsIHRvIDEgYXQgdGhpcyBkaXN0YW5jZS5cbiAgICogICAgIHJvbGxvZmZGYWN0b3IgLSAoMSBieSBkZWZhdWx0KSBIb3cgcXVpY2tseSB0aGUgdm9sdW1lIHJlZHVjZXMgYXMgc291cmNlIG1vdmVzIGZyb20gbGlzdGVuZXIuIFRoaXMgaXMgc2ltcGx5IGFcbiAgICogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvZiB0aGUgZGlzdGFuY2UgbW9kZWwgYW5kIGNhbiBiZSBpbiB0aGUgcmFuZ2Ugb2YgYFswLCAxXWAgd2l0aCBgbGluZWFyYCBhbmQgYFswLCDiiJ5dYFxuICAgKiAgICAgICAgICAgICAgICAgICAgIHdpdGggYGludmVyc2VgIGFuZCBgZXhwb25lbnRpYWxgLlxuICAgKiAgICAgcGFubmluZ01vZGVsIC0gKCdIUlRGJyBieSBkZWZhdWx0KSBEZXRlcm1pbmVzIHdoaWNoIHNwYXRpYWxpemF0aW9uIGFsZ29yaXRobSBpcyB1c2VkIHRvIHBvc2l0aW9uIGF1ZGlvLlxuICAgKiAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBgSFJURmAgb3IgYGVxdWFscG93ZXJgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtIb3dsL09iamVjdH0gUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgcGFubmVyIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5wYW5uZXJBdHRyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBvLCBpZCwgc291bmQ7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3MgcGFubmVyIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gICAgICByZXR1cm4gc2VsZi5fcGFubmVyQXR0cjtcbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG8gPSBhcmdzWzBdO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdSdzIHBhbm5lciBhdHRyaWJ1dGUgdmFsdWVzLlxuICAgICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICghby5wYW5uZXJBdHRyKSB7XG4gICAgICAgICAgICBvLnBhbm5lckF0dHIgPSB7XG4gICAgICAgICAgICAgIGNvbmVJbm5lckFuZ2xlOiBvLmNvbmVJbm5lckFuZ2xlLFxuICAgICAgICAgICAgICBjb25lT3V0ZXJBbmdsZTogby5jb25lT3V0ZXJBbmdsZSxcbiAgICAgICAgICAgICAgY29uZU91dGVyR2Fpbjogby5jb25lT3V0ZXJHYWluLFxuICAgICAgICAgICAgICBkaXN0YW5jZU1vZGVsOiBvLmRpc3RhbmNlTW9kZWwsXG4gICAgICAgICAgICAgIG1heERpc3RhbmNlOiBvLm1heERpc3RhbmNlLFxuICAgICAgICAgICAgICByZWZEaXN0YW5jZTogby5yZWZEaXN0YW5jZSxcbiAgICAgICAgICAgICAgcm9sbG9mZkZhY3Rvcjogby5yb2xsb2ZmRmFjdG9yLFxuICAgICAgICAgICAgICBwYW5uaW5nTW9kZWw6IG8ucGFubmluZ01vZGVsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSB7XG4gICAgICAgICAgICBjb25lSW5uZXJBbmdsZTogdHlwZW9mIG8ucGFubmVyQXR0ci5jb25lSW5uZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIuY29uZUlubmVyQW5nbGUgOiBzZWxmLl9jb25lSW5uZXJBbmdsZSxcbiAgICAgICAgICAgIGNvbmVPdXRlckFuZ2xlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLmNvbmVPdXRlckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5jb25lT3V0ZXJBbmdsZSA6IHNlbGYuX2NvbmVPdXRlckFuZ2xlLFxuICAgICAgICAgICAgY29uZU91dGVyR2FpbjogdHlwZW9mIG8ucGFubmVyQXR0ci5jb25lT3V0ZXJHYWluICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5jb25lT3V0ZXJHYWluIDogc2VsZi5fY29uZU91dGVyR2FpbixcbiAgICAgICAgICAgIGRpc3RhbmNlTW9kZWw6IHR5cGVvZiBvLnBhbm5lckF0dHIuZGlzdGFuY2VNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIuZGlzdGFuY2VNb2RlbCA6IHNlbGYuX2Rpc3RhbmNlTW9kZWwsXG4gICAgICAgICAgICBtYXhEaXN0YW5jZTogdHlwZW9mIG8ucGFubmVyQXR0ci5tYXhEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIubWF4RGlzdGFuY2UgOiBzZWxmLl9tYXhEaXN0YW5jZSxcbiAgICAgICAgICAgIHJlZkRpc3RhbmNlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLnJlZkRpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5yZWZEaXN0YW5jZSA6IHNlbGYuX3JlZkRpc3RhbmNlLFxuICAgICAgICAgICAgcm9sbG9mZkZhY3RvcjogdHlwZW9mIG8ucGFubmVyQXR0ci5yb2xsb2ZmRmFjdG9yICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5yb2xsb2ZmRmFjdG9yIDogc2VsZi5fcm9sbG9mZkZhY3RvcixcbiAgICAgICAgICAgIHBhbm5pbmdNb2RlbDogdHlwZW9mIG8ucGFubmVyQXR0ci5wYW5uaW5nTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbCA6IHNlbGYuX3Bhbm5pbmdNb2RlbFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldHVybiB0aGlzIHNvdW5kJ3MgcGFubmVyIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKHBhcnNlSW50KGFyZ3NbMF0sIDEwKSk7XG4gICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl9wYW5uZXJBdHRyIDogc2VsZi5fcGFubmVyQXR0cjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBvID0gYXJnc1swXTtcbiAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgc291bmRzLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIC8vIE1lcmdlIHRoZSBuZXcgdmFsdWVzIGludG8gdGhlIHNvdW5kLlxuICAgICAgICB2YXIgcGEgPSBzb3VuZC5fcGFubmVyQXR0cjtcbiAgICAgICAgcGEgPSB7XG4gICAgICAgICAgY29uZUlubmVyQW5nbGU6IHR5cGVvZiBvLmNvbmVJbm5lckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZUlubmVyQW5nbGUgOiBwYS5jb25lSW5uZXJBbmdsZSxcbiAgICAgICAgICBjb25lT3V0ZXJBbmdsZTogdHlwZW9mIG8uY29uZU91dGVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJBbmdsZSA6IHBhLmNvbmVPdXRlckFuZ2xlLFxuICAgICAgICAgIGNvbmVPdXRlckdhaW46IHR5cGVvZiBvLmNvbmVPdXRlckdhaW4gIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJHYWluIDogcGEuY29uZU91dGVyR2FpbixcbiAgICAgICAgICBkaXN0YW5jZU1vZGVsOiB0eXBlb2Ygby5kaXN0YW5jZU1vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8uZGlzdGFuY2VNb2RlbCA6IHBhLmRpc3RhbmNlTW9kZWwsXG4gICAgICAgICAgbWF4RGlzdGFuY2U6IHR5cGVvZiBvLm1heERpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ubWF4RGlzdGFuY2UgOiBwYS5tYXhEaXN0YW5jZSxcbiAgICAgICAgICByZWZEaXN0YW5jZTogdHlwZW9mIG8ucmVmRGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5yZWZEaXN0YW5jZSA6IHBhLnJlZkRpc3RhbmNlLFxuICAgICAgICAgIHJvbGxvZmZGYWN0b3I6IHR5cGVvZiBvLnJvbGxvZmZGYWN0b3IgIT09ICd1bmRlZmluZWQnID8gby5yb2xsb2ZmRmFjdG9yIDogcGEucm9sbG9mZkZhY3RvcixcbiAgICAgICAgICBwYW5uaW5nTW9kZWw6IHR5cGVvZiBvLnBhbm5pbmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5pbmdNb2RlbCA6IHBhLnBhbm5pbmdNb2RlbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcGFubmVyIHZhbHVlcyBvciBjcmVhdGUgYSBuZXcgcGFubmVyIGlmIG5vbmUgZXhpc3RzLlxuICAgICAgICB2YXIgcGFubmVyID0gc291bmQuX3Bhbm5lcjtcbiAgICAgICAgaWYgKHBhbm5lcikge1xuICAgICAgICAgIHBhbm5lci5jb25lSW5uZXJBbmdsZSA9IHBhLmNvbmVJbm5lckFuZ2xlO1xuICAgICAgICAgIHBhbm5lci5jb25lT3V0ZXJBbmdsZSA9IHBhLmNvbmVPdXRlckFuZ2xlO1xuICAgICAgICAgIHBhbm5lci5jb25lT3V0ZXJHYWluID0gcGEuY29uZU91dGVyR2FpbjtcbiAgICAgICAgICBwYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHBhLmRpc3RhbmNlTW9kZWw7XG4gICAgICAgICAgcGFubmVyLm1heERpc3RhbmNlID0gcGEubWF4RGlzdGFuY2U7XG4gICAgICAgICAgcGFubmVyLnJlZkRpc3RhbmNlID0gcGEucmVmRGlzdGFuY2U7XG4gICAgICAgICAgcGFubmVyLnJvbGxvZmZGYWN0b3IgPSBwYS5yb2xsb2ZmRmFjdG9yO1xuICAgICAgICAgIHBhbm5lci5wYW5uaW5nTW9kZWwgPSBwYS5wYW5uaW5nTW9kZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBwb3NpdGlvbiB0byBzZXR1cCB0aGUgbm9kZSB3aXRoLlxuICAgICAgICAgIGlmICghc291bmQuX3Bvcykge1xuICAgICAgICAgICAgc291bmQuX3BvcyA9IHNlbGYuX3BvcyB8fCBbMCwgMCwgLTAuNV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhbm5lciBub2RlLlxuICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCAnc3BhdGlhbCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqIFNpbmdsZSBTb3VuZCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBBZGQgbmV3IHByb3BlcnRpZXMgdG8gdGhlIGNvcmUgU291bmQgaW5pdC5cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IF9zdXBlciBDb3JlIFNvdW5kIGluaXQgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICovXG4gIFNvdW5kLnByb3RvdHlwZS5pbml0ID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFNldHVwIHVzZXItZGVmaW5lZCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IHBhcmVudC5fb3JpZW50YXRpb247XG4gICAgICBzZWxmLl9zdGVyZW8gPSBwYXJlbnQuX3N0ZXJlbztcbiAgICAgIHNlbGYuX3BvcyA9IHBhcmVudC5fcG9zO1xuICAgICAgc2VsZi5fcGFubmVyQXR0ciA9IHBhcmVudC5fcGFubmVyQXR0cjtcblxuICAgICAgLy8gQ29tcGxldGUgaW5pdGlsaXphdGlvbiB3aXRoIGhvd2xlci5qcyBjb3JlIFNvdW5kJ3MgaW5pdCBmdW5jdGlvbi5cbiAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgICAvLyBJZiBhIHN0ZXJlbyBvciBwb3NpdGlvbiB3YXMgc3BlY2lmaWVkLCBzZXQgaXQgdXAuXG4gICAgICBpZiAoc2VsZi5fc3RlcmVvKSB7XG4gICAgICAgIHBhcmVudC5zdGVyZW8oc2VsZi5fc3RlcmVvKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5fcG9zKSB7XG4gICAgICAgIHBhcmVudC5wb3Moc2VsZi5fcG9zWzBdLCBzZWxmLl9wb3NbMV0sIHNlbGYuX3Bvc1syXSwgc2VsZi5faWQpO1xuICAgICAgfVxuICAgIH07XG4gIH0pKFNvdW5kLnByb3RvdHlwZS5pbml0KTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIFNvdW5kLnJlc2V0IG1ldGhvZCB0byBjbGVhbiB1cCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNwYXRpYWwgcGx1Z2luLlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gX3N1cGVyIFNvdW5kIHJlc2V0IG1ldGhvZC5cbiAgICogQHJldHVybiB7U291bmR9XG4gICAqL1xuICBTb3VuZC5wcm90b3R5cGUucmVzZXQgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gUmVzZXQgYWxsIHNwYXRpYWwgcGx1Z2luIHByb3BlcnRpZXMgb24gdGhpcyBzb3VuZC5cbiAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gcGFyZW50Ll9vcmllbnRhdGlvbjtcbiAgICAgIHNlbGYuX3N0ZXJlbyA9IHBhcmVudC5fc3RlcmVvO1xuICAgICAgc2VsZi5fcG9zID0gcGFyZW50Ll9wb3M7XG4gICAgICBzZWxmLl9wYW5uZXJBdHRyID0gcGFyZW50Ll9wYW5uZXJBdHRyO1xuXG4gICAgICAvLyBJZiBhIHN0ZXJlbyBvciBwb3NpdGlvbiB3YXMgc3BlY2lmaWVkLCBzZXQgaXQgdXAuXG4gICAgICBpZiAoc2VsZi5fc3RlcmVvKSB7XG4gICAgICAgIHBhcmVudC5zdGVyZW8oc2VsZi5fc3RlcmVvKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5fcG9zKSB7XG4gICAgICAgIHBhcmVudC5wb3Moc2VsZi5fcG9zWzBdLCBzZWxmLl9wb3NbMV0sIHNlbGYuX3Bvc1syXSwgc2VsZi5faWQpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLl9wYW5uZXIpIHtcbiAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgcGFubmVyLlxuICAgICAgICBzZWxmLl9wYW5uZXIuZGlzY29ubmVjdCgwKTtcbiAgICAgICAgc2VsZi5fcGFubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICBwYXJlbnQuX3JlZnJlc2hCdWZmZXIoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBsZXRlIHJlc2V0dGluZyBvZiB0aGUgc291bmQuXG4gICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgfSkoU291bmQucHJvdG90eXBlLnJlc2V0KTtcblxuICAvKiogSGVscGVyIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwYW5uZXIgbm9kZSBhbmQgc2F2ZSBpdCBvbiB0aGUgc291bmQuXG4gICAqIEBwYXJhbSAge1NvdW5kfSBzb3VuZCBTcGVjaWZpYyBzb3VuZCB0byBzZXR1cCBwYW5uaW5nIG9uLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUeXBlIG9mIHBhbm5lciB0byBjcmVhdGU6ICdzdGVyZW8nIG9yICdzcGF0aWFsJy5cbiAgICovXG4gIHZhciBzZXR1cFBhbm5lciA9IGZ1bmN0aW9uKHNvdW5kLCB0eXBlKSB7XG4gICAgdHlwZSA9IHR5cGUgfHwgJ3NwYXRpYWwnO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBuZXcgcGFubmVyIG5vZGUuXG4gICAgaWYgKHR5cGUgPT09ICdzcGF0aWFsJykge1xuICAgICAgc291bmQuX3Bhbm5lciA9IEhvd2xlci5jdHguY3JlYXRlUGFubmVyKCk7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVJbm5lckFuZ2xlID0gc291bmQuX3Bhbm5lckF0dHIuY29uZUlubmVyQW5nbGU7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVPdXRlckFuZ2xlID0gc291bmQuX3Bhbm5lckF0dHIuY29uZU91dGVyQW5nbGU7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVPdXRlckdhaW4gPSBzb3VuZC5fcGFubmVyQXR0ci5jb25lT3V0ZXJHYWluO1xuICAgICAgc291bmQuX3Bhbm5lci5kaXN0YW5jZU1vZGVsID0gc291bmQuX3Bhbm5lckF0dHIuZGlzdGFuY2VNb2RlbDtcbiAgICAgIHNvdW5kLl9wYW5uZXIubWF4RGlzdGFuY2UgPSBzb3VuZC5fcGFubmVyQXR0ci5tYXhEaXN0YW5jZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucmVmRGlzdGFuY2UgPSBzb3VuZC5fcGFubmVyQXR0ci5yZWZEaXN0YW5jZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucm9sbG9mZkZhY3RvciA9IHNvdW5kLl9wYW5uZXJBdHRyLnJvbGxvZmZGYWN0b3I7XG4gICAgICBzb3VuZC5fcGFubmVyLnBhbm5pbmdNb2RlbCA9IHNvdW5kLl9wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbDtcblxuICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoc291bmQuX3Bvc1swXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9wb3NbMV0sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZShzb3VuZC5fcG9zWzJdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0UG9zaXRpb24oc291bmQuX3Bvc1swXSwgc291bmQuX3Bvc1sxXSwgc291bmQuX3Bvc1syXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25YLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9vcmllbnRhdGlvblswXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25ZLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9vcmllbnRhdGlvblsxXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25aLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9vcmllbnRhdGlvblsyXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZC5fcGFubmVyLnNldE9yaWVudGF0aW9uKHNvdW5kLl9vcmllbnRhdGlvblswXSwgc291bmQuX29yaWVudGF0aW9uWzFdLCBzb3VuZC5fb3JpZW50YXRpb25bMl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzb3VuZC5fcGFubmVyID0gSG93bGVyLmN0eC5jcmVhdGVTdGVyZW9QYW5uZXIoKTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucGFuLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9zdGVyZW8sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgIH1cblxuICAgIHNvdW5kLl9wYW5uZXIuY29ubmVjdChzb3VuZC5fbm9kZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbm5lY3Rpb25zLlxuICAgIGlmICghc291bmQuX3BhdXNlZCkge1xuICAgICAgc291bmQuX3BhcmVudC5wYXVzZShzb3VuZC5faWQsIHRydWUpLnBsYXkoc291bmQuX2lkLCB0cnVlKTtcbiAgICB9XG4gIH07XG59KSgpO1xuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cblxudmFyIEV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRXZlbnQodHlwZSwgdGFyZ2V0KSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcclxuICAgIH1cclxuICAgIHJldHVybiBFdmVudDtcclxufSgpKTtcclxudmFyIEVycm9yRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICBfX2V4dGVuZHMoRXJyb3JFdmVudCwgX3N1cGVyKTtcclxuICAgIGZ1bmN0aW9uIEVycm9yRXZlbnQoZXJyb3IsIHRhcmdldCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsICdlcnJvcicsIHRhcmdldCkgfHwgdGhpcztcclxuICAgICAgICBfdGhpcy5tZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICBfdGhpcy5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgIHJldHVybiBfdGhpcztcclxuICAgIH1cclxuICAgIHJldHVybiBFcnJvckV2ZW50O1xyXG59KEV2ZW50KSk7XHJcbnZhciBDbG9zZUV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgX19leHRlbmRzKENsb3NlRXZlbnQsIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBDbG9zZUV2ZW50KGNvZGUsIHJlYXNvbiwgdGFyZ2V0KSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IHZvaWQgMCkgeyBjb2RlID0gMTAwMDsgfVxyXG4gICAgICAgIGlmIChyZWFzb24gPT09IHZvaWQgMCkgeyByZWFzb24gPSAnJzsgfVxyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsICdjbG9zZScsIHRhcmdldCkgfHwgdGhpcztcclxuICAgICAgICBfdGhpcy53YXNDbGVhbiA9IHRydWU7XHJcbiAgICAgICAgX3RoaXMuY29kZSA9IGNvZGU7XHJcbiAgICAgICAgX3RoaXMucmVhc29uID0gcmVhc29uO1xyXG4gICAgICAgIHJldHVybiBfdGhpcztcclxuICAgIH1cclxuICAgIHJldHVybiBDbG9zZUV2ZW50O1xyXG59KEV2ZW50KSk7XG5cbi8qIVxyXG4gKiBSZWNvbm5lY3RpbmcgV2ViU29ja2V0XHJcbiAqIGJ5IFBlZHJvIExhZGFyaWEgPHBlZHJvLmxhZGFyaWFAZ21haWwuY29tPlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcGxhZGFyaWEvcmVjb25uZWN0aW5nLXdlYnNvY2tldFxyXG4gKiBMaWNlbnNlIE1JVFxyXG4gKi9cclxudmFyIGdldEdsb2JhbFdlYlNvY2tldCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICByZXR1cm4gV2ViU29ja2V0O1xyXG4gICAgfVxyXG59O1xyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIGdpdmVuIGFyZ3VtZW50IGxvb2tzIGxpa2UgYSBXZWJTb2NrZXQgY2xhc3NcclxuICovXHJcbnZhciBpc1dlYlNvY2tldCA9IGZ1bmN0aW9uICh3KSB7IHJldHVybiB0eXBlb2YgdyAhPT0gJ3VuZGVmaW5lZCcgJiYgISF3ICYmIHcuQ0xPU0lORyA9PT0gMjsgfTtcclxudmFyIERFRkFVTFQgPSB7XHJcbiAgICBtYXhSZWNvbm5lY3Rpb25EZWxheTogMTAwMDAsXHJcbiAgICBtaW5SZWNvbm5lY3Rpb25EZWxheTogMTAwMCArIE1hdGgucmFuZG9tKCkgKiA0MDAwLFxyXG4gICAgbWluVXB0aW1lOiA1MDAwLFxyXG4gICAgcmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yOiAxLjMsXHJcbiAgICBjb25uZWN0aW9uVGltZW91dDogNDAwMCxcclxuICAgIG1heFJldHJpZXM6IEluZmluaXR5LFxyXG4gICAgbWF4RW5xdWV1ZWRNZXNzYWdlczogSW5maW5pdHksXHJcbiAgICBzdGFydENsb3NlZDogZmFsc2UsXHJcbiAgICBkZWJ1ZzogZmFsc2UsXHJcbn07XHJcbnZhciBSZWNvbm5lY3RpbmdXZWJTb2NrZXQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQodXJsLCBwcm90b2NvbHMsIG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XHJcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0ge1xyXG4gICAgICAgICAgICBlcnJvcjogW10sXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IFtdLFxyXG4gICAgICAgICAgICBvcGVuOiBbXSxcclxuICAgICAgICAgICAgY2xvc2U6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCA9IC0xO1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZFJlY29ubmVjdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdExvY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9iaW5hcnlUeXBlID0gJ2Jsb2InO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlQ2FsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVF1ZXVlID0gW107XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uJ3MgcmVhZHlTdGF0ZSBjaGFuZ2VzIHRvIENMT1NFRFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25jbG9zZSA9IG51bGw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbmVycm9yID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbm1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbidzIHJlYWR5U3RhdGUgY2hhbmdlcyB0byBPUEVOO1xyXG4gICAgICAgICAqIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbm9wZW4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZU9wZW4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdvcGVuIGV2ZW50Jyk7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLl9vcHRpb25zLm1pblVwdGltZSwgbWluVXB0aW1lID0gX2EgPT09IHZvaWQgMCA/IERFRkFVTFQubWluVXB0aW1lIDogX2E7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpcy5fY29ubmVjdFRpbWVvdXQpO1xyXG4gICAgICAgICAgICBfdGhpcy5fdXB0aW1lVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2FjY2VwdE9wZW4oKTsgfSwgbWluVXB0aW1lKTtcclxuICAgICAgICAgICAgX3RoaXMuX3dzLmJpbmFyeVR5cGUgPSBfdGhpcy5fYmluYXJ5VHlwZTtcclxuICAgICAgICAgICAgLy8gc2VuZCBlbnF1ZXVlZCBtZXNzYWdlcyAobWVzc2FnZXMgc2VudCBiZWZvcmUgd2Vic29ja2V0IG9wZW4gZXZlbnQpXHJcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlUXVldWUuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkgeyByZXR1cm4gX3RoaXMuX3dzLnNlbmQobWVzc2FnZSk7IH0pO1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZVF1ZXVlID0gW107XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbm9wZW4pIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9ub3BlbihldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX2xpc3RlbmVycy5vcGVuLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBfdGhpcy5fY2FsbEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVNZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnbWVzc2FnZSBldmVudCcpO1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMub25tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbm1lc3NhZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMubWVzc2FnZS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gX3RoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdlcnJvciBldmVudCcsIGV2ZW50Lm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5fZGlzY29ubmVjdCh1bmRlZmluZWQsIGV2ZW50Lm1lc3NhZ2UgPT09ICdUSU1FT1VUJyA/ICd0aW1lb3V0JyA6IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbmVycm9yKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ2V4ZWMgZXJyb3IgbGlzdGVuZXJzJyk7XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMuZXJyb3IuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3QoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnY2xvc2UgZXZlbnQnKTtcclxuICAgICAgICAgICAgX3RoaXMuX2NsZWFyVGltZW91dHMoKTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLl9zaG91bGRSZWNvbm5lY3QpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9jb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKF90aGlzLm9uY2xvc2UpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uY2xvc2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMuY2xvc2UuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcclxuICAgICAgICB0aGlzLl9wcm90b2NvbHMgPSBwcm90b2NvbHM7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuc3RhcnRDbG9zZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2hvdWxkUmVjb25uZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQsIFwiQ09OTkVDVElOR1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldCwgXCJPUEVOXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LCBcIkNMT1NJTkdcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQsIFwiQ0xPU0VEXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJDT05ORUNUSU5HXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlY29ubmVjdGluZ1dlYlNvY2tldC5DT05ORUNUSU5HO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiT1BFTlwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuT1BFTjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcIkNMT1NJTkdcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNMT1NJTkc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJDTE9TRURcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNMT1NFRDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcImJpbmFyeVR5cGVcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd3MgPyB0aGlzLl93cy5iaW5hcnlUeXBlIDogdGhpcy5fYmluYXJ5VHlwZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JpbmFyeVR5cGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93cy5iaW5hcnlUeXBlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcInJldHJ5Q291bnRcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvciBjb25uZWN0aW9uIHJldHJpZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuX3JldHJ5Q291bnQsIDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiYnVmZmVyZWRBbW91bnRcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgdXNpbmcgY2FsbHMgdG8gc2VuZCgpIGJ1dCBub3QgeWV0XHJcbiAgICAgICAgICogdHJhbnNtaXR0ZWQgdG8gdGhlIG5ldHdvcmsuIFRoaXMgdmFsdWUgcmVzZXRzIHRvIHplcm8gb25jZSBhbGwgcXVldWVkIGRhdGEgaGFzIGJlZW4gc2VudC5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGRvZXMgbm90IHJlc2V0IHRvIHplcm8gd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQ7IGlmIHlvdSBrZWVwIGNhbGxpbmcgc2VuZCgpLFxyXG4gICAgICAgICAqIHRoaXMgd2lsbCBjb250aW51ZSB0byBjbGltYi4gUmVhZCBvbmx5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBieXRlcyA9IHRoaXMuX21lc3NhZ2VRdWV1ZS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgbWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBtZXNzYWdlLmxlbmd0aDsgLy8gbm90IGJ5dGUgc2l6ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gbWVzc2FnZS5zaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IG1lc3NhZ2UuYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgICAgICByZXR1cm4gYnl0ZXMgKyAodGhpcy5fd3MgPyB0aGlzLl93cy5idWZmZXJlZEFtb3VudCA6IDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiZXh0ZW5zaW9uc1wiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGV4dGVuc2lvbnMgc2VsZWN0ZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBpcyBjdXJyZW50bHkgb25seSB0aGUgZW1wdHkgc3RyaW5nIG9yIGEgbGlzdCBvZlxyXG4gICAgICAgICAqIGV4dGVuc2lvbnMgYXMgbmVnb3RpYXRlZCBieSB0aGUgY29ubmVjdGlvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd3MgPyB0aGlzLl93cy5leHRlbnNpb25zIDogJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJwcm90b2NvbFwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgc3ViLXByb3RvY29sIHRoZSBzZXJ2ZXIgc2VsZWN0ZWQ7XHJcbiAgICAgICAgICogdGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgc3RyaW5ncyBzcGVjaWZpZWQgaW4gdGhlIHByb3RvY29scyBwYXJhbWV0ZXIgd2hlbiBjcmVhdGluZyB0aGVcclxuICAgICAgICAgKiBXZWJTb2NrZXQgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLnByb3RvY29sIDogJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJyZWFkeVN0YXRlXCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbjsgdGhpcyBpcyBvbmUgb2YgdGhlIFJlYWR5IHN0YXRlIGNvbnN0YW50c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93cy5yZWFkeVN0YXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zLnN0YXJ0Q2xvc2VkXHJcbiAgICAgICAgICAgICAgICA/IFJlY29ubmVjdGluZ1dlYlNvY2tldC5DTE9TRURcclxuICAgICAgICAgICAgICAgIDogUmVjb25uZWN0aW5nV2ViU29ja2V0LkNPTk5FQ1RJTkc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJ1cmxcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBVUkwgYXMgcmVzb2x2ZWQgYnkgdGhlIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLnVybCA6ICcnO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIGNvbm5lY3Rpb24gYXR0ZW1wdCwgaWYgYW55LiBJZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5XHJcbiAgICAgKiBDTE9TRUQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZ1xyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbikge1xyXG4gICAgICAgIGlmIChjb2RlID09PSB2b2lkIDApIHsgY29kZSA9IDEwMDA7IH1cclxuICAgICAgICB0aGlzLl9jbG9zZUNhbGxlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVjb25uZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0cygpO1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVidWcoJ2Nsb3NlIGVucXVldWVkOiBubyB3cyBpbnN0YW5jZScpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl93cy5yZWFkeVN0YXRlID09PSB0aGlzLkNMT1NFRCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnY2xvc2U6IGFscmVhZHkgY2xvc2VkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fd3MuY2xvc2UoY29kZSwgcmVhc29uKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIENsb3NlcyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gb3IgY29ubmVjdGlvbiBhdHRlbXB0IGFuZCBjb25uZWN0cyBhZ2Fpbi5cclxuICAgICAqIFJlc2V0cyByZXRyeSBjb3VudGVyO1xyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLnJlY29ubmVjdCA9IGZ1bmN0aW9uIChjb2RlLCByZWFzb24pIHtcclxuICAgICAgICB0aGlzLl9zaG91bGRSZWNvbm5lY3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlQ2FsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCA9IC0xO1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MgfHwgdGhpcy5fd3MucmVhZHlTdGF0ZSA9PT0gdGhpcy5DTE9TRUQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZGlzY29ubmVjdChjb2RlLCByZWFzb24pO1xyXG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogRW5xdWV1ZSBzcGVjaWZpZWQgZGF0YSB0byBiZSB0cmFuc21pdHRlZCB0byB0aGUgc2VydmVyIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dzICYmIHRoaXMuX3dzLnJlYWR5U3RhdGUgPT09IHRoaXMuT1BFTikge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1Zygnc2VuZCcsIGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLl93cy5zZW5kKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5fb3B0aW9ucy5tYXhFbnF1ZXVlZE1lc3NhZ2VzLCBtYXhFbnF1ZXVlZE1lc3NhZ2VzID0gX2EgPT09IHZvaWQgMCA/IERFRkFVTFQubWF4RW5xdWV1ZWRNZXNzYWdlcyA6IF9hO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVzc2FnZVF1ZXVlLmxlbmd0aCA8IG1heEVucXVldWVkTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdlbnF1ZXVlJywgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlUXVldWUucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIgb2YgYSBzcGVjaWZpYyBldmVudCB0eXBlXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIHZhciBlXzEsIF9hO1xyXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnQudHlwZV07XHJcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbGlzdGVuZXJzXzEgPSBfX3ZhbHVlcyhsaXN0ZW5lcnMpLCBsaXN0ZW5lcnNfMV8xID0gbGlzdGVuZXJzXzEubmV4dCgpOyAhbGlzdGVuZXJzXzFfMS5kb25lOyBsaXN0ZW5lcnNfMV8xID0gbGlzdGVuZXJzXzEubmV4dCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzXzFfMS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzXzFfMSAmJiAhbGlzdGVuZXJzXzFfMS5kb25lICYmIChfYSA9IGxpc3RlbmVyc18xLnJldHVybikpIF9hLmNhbGwobGlzdGVuZXJzXzEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW3R5cGVdKSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID0gdGhpcy5fbGlzdGVuZXJzW3R5cGVdLmZpbHRlcihmdW5jdGlvbiAobCkgeyByZXR1cm4gbCAhPT0gbGlzdGVuZXI7IH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9kZWJ1ZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZGVidWcpIHtcclxuICAgICAgICAgICAgLy8gbm90IHVzaW5nIHNwcmVhZCBiZWNhdXNlIGNvbXBpbGVkIHZlcnNpb24gdXNlcyBTeW1ib2xzXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBfX3NwcmVhZChbJ1JXUz4nXSwgYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9nZXROZXh0RGVsYXkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF9hID0gdGhpcy5fb3B0aW9ucywgX2IgPSBfYS5yZWNvbm5lY3Rpb25EZWxheUdyb3dGYWN0b3IsIHJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciA9IF9iID09PSB2b2lkIDAgPyBERUZBVUxULnJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciA6IF9iLCBfYyA9IF9hLm1pblJlY29ubmVjdGlvbkRlbGF5LCBtaW5SZWNvbm5lY3Rpb25EZWxheSA9IF9jID09PSB2b2lkIDAgPyBERUZBVUxULm1pblJlY29ubmVjdGlvbkRlbGF5IDogX2MsIF9kID0gX2EubWF4UmVjb25uZWN0aW9uRGVsYXksIG1heFJlY29ubmVjdGlvbkRlbGF5ID0gX2QgPT09IHZvaWQgMCA/IERFRkFVTFQubWF4UmVjb25uZWN0aW9uRGVsYXkgOiBfZDtcclxuICAgICAgICB2YXIgZGVsYXkgPSAwO1xyXG4gICAgICAgIGlmICh0aGlzLl9yZXRyeUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBkZWxheSA9XHJcbiAgICAgICAgICAgICAgICBtaW5SZWNvbm5lY3Rpb25EZWxheSAqIE1hdGgucG93KHJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciwgdGhpcy5fcmV0cnlDb3VudCAtIDEpO1xyXG4gICAgICAgICAgICBpZiAoZGVsYXkgPiBtYXhSZWNvbm5lY3Rpb25EZWxheSkge1xyXG4gICAgICAgICAgICAgICAgZGVsYXkgPSBtYXhSZWNvbm5lY3Rpb25EZWxheTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWJ1ZygnbmV4dCBkZWxheScsIGRlbGF5KTtcclxuICAgICAgICByZXR1cm4gZGVsYXk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fd2FpdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIF90aGlzLl9nZXROZXh0RGVsYXkoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fZ2V0TmV4dFVybCA9IGZ1bmN0aW9uICh1cmxQcm92aWRlcikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdXJsUHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXJsUHJvdmlkZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHVybFByb3ZpZGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSB1cmxQcm92aWRlcigpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISF1cmwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBVUkwnKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RMb2NrIHx8ICF0aGlzLl9zaG91bGRSZWNvbm5lY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb25uZWN0TG9jayA9IHRydWU7XHJcbiAgICAgICAgdmFyIF9hID0gdGhpcy5fb3B0aW9ucywgX2IgPSBfYS5tYXhSZXRyaWVzLCBtYXhSZXRyaWVzID0gX2IgPT09IHZvaWQgMCA/IERFRkFVTFQubWF4UmV0cmllcyA6IF9iLCBfYyA9IF9hLmNvbm5lY3Rpb25UaW1lb3V0LCBjb25uZWN0aW9uVGltZW91dCA9IF9jID09PSB2b2lkIDAgPyBERUZBVUxULmNvbm5lY3Rpb25UaW1lb3V0IDogX2MsIF9kID0gX2EuV2ViU29ja2V0LCBXZWJTb2NrZXQgPSBfZCA9PT0gdm9pZCAwID8gZ2V0R2xvYmFsV2ViU29ja2V0KCkgOiBfZDtcclxuICAgICAgICBpZiAodGhpcy5fcmV0cnlDb3VudCA+PSBtYXhSZXRyaWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdtYXggcmV0cmllcyByZWFjaGVkJywgdGhpcy5fcmV0cnlDb3VudCwgJz49JywgbWF4UmV0cmllcyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCsrO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnKCdjb25uZWN0JywgdGhpcy5fcmV0cnlDb3VudCk7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgaWYgKCFpc1dlYlNvY2tldChXZWJTb2NrZXQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdObyB2YWxpZCBXZWJTb2NrZXQgY2xhc3MgcHJvdmlkZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fd2FpdCgpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9nZXROZXh0VXJsKF90aGlzLl91cmwpOyB9KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodXJsKSB7XHJcbiAgICAgICAgICAgIC8vIGNsb3NlIGNvdWxkIGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRpbmcgdGhlIHdzXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fY2xvc2VDYWxsZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ2Nvbm5lY3QnLCB7IHVybDogdXJsLCBwcm90b2NvbHM6IF90aGlzLl9wcm90b2NvbHMgfSk7XHJcbiAgICAgICAgICAgIF90aGlzLl93cyA9IF90aGlzLl9wcm90b2NvbHNcclxuICAgICAgICAgICAgICAgID8gbmV3IFdlYlNvY2tldCh1cmwsIF90aGlzLl9wcm90b2NvbHMpXHJcbiAgICAgICAgICAgICAgICA6IG5ldyBXZWJTb2NrZXQodXJsKTtcclxuICAgICAgICAgICAgX3RoaXMuX3dzLmJpbmFyeVR5cGUgPSBfdGhpcy5fYmluYXJ5VHlwZTtcclxuICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3RMb2NrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIF90aGlzLl9hZGRMaXN0ZW5lcnMoKTtcclxuICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3RUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5faGFuZGxlVGltZW91dCgpOyB9LCBjb25uZWN0aW9uVGltZW91dCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5faGFuZGxlVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLl9kZWJ1ZygndGltZW91dCBldmVudCcpO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKG5ldyBFcnJvckV2ZW50KEVycm9yKCdUSU1FT1VUJyksIHRoaXMpKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9kaXNjb25uZWN0ID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbikge1xyXG4gICAgICAgIGlmIChjb2RlID09PSB2b2lkIDApIHsgY29kZSA9IDEwMDA7IH1cclxuICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXRzKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dzLmNsb3NlKGNvZGUsIHJlYXNvbik7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlKG5ldyBDbG9zZUV2ZW50KGNvZGUsIHJlYXNvbiwgdGhpcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2FjY2VwdE9wZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVidWcoJ2FjY2VwdCBvcGVuJyk7XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCA9IDA7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fY2FsbEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKCdoYW5kbGVFdmVudCcgaW4gbGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fcmVtb3ZlTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWJ1ZygncmVtb3ZlTGlzdGVuZXJzJyk7XHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuX2hhbmRsZU9wZW4pO1xyXG4gICAgICAgIHRoaXMuX3dzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5faGFuZGxlQ2xvc2UpO1xyXG4gICAgICAgIHRoaXMuX3dzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVNZXNzYWdlKTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9oYW5kbGVFcnJvcik7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fYWRkTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWJ1ZygnYWRkTGlzdGVuZXJzJyk7XHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuX2hhbmRsZU9wZW4pO1xyXG4gICAgICAgIHRoaXMuX3dzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5faGFuZGxlQ2xvc2UpO1xyXG4gICAgICAgIHRoaXMuX3dzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVNZXNzYWdlKTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9oYW5kbGVFcnJvcik7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fY2xlYXJUaW1lb3V0cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY29ubmVjdFRpbWVvdXQpO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cHRpbWVUaW1lb3V0KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0O1xyXG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlY29ubmVjdGluZ1dlYlNvY2tldDtcbiJdfQ==
|
|
7671
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkaXN0L0F1ZGlvUGxheWVyLmpzIiwiZGlzdC9Db2dzQ29ubmVjdGlvbi5qcyIsImRpc3QvUnRzcFN0cmVhbWVyLmpzIiwiZGlzdC9WaWRlb1BsYXllci5qcyIsImRpc3QvaGVscGVycy91cmxzLmpzIiwiZGlzdC9pbmRleC5qcyIsImRpc3QvdHlwZXMvQXVkaW9TdGF0ZS5qcyIsImRpc3QvdHlwZXMvU2hvd1BoYXNlLmpzIiwiZGlzdC90eXBlcy9WaWRlb1N0YXRlLmpzIiwibm9kZV9tb2R1bGVzL0BjbG9ja3dvcmtkb2cvbWVkaWEtc3RyZWFtLWxpYnJhcnktYnJvd3Nlci9kaXN0L2luZGV4LmNqcy5qcyIsIm5vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBhcmUtdmVyc2lvbnMvbGliL3VtZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ob3dsZXIvZGlzdC9ob3dsZXIuanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVjb25uZWN0aW5nLXdlYnNvY2tldC9kaXN0L3JlY29ubmVjdGluZy13ZWJzb2NrZXQtY2pzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDanZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDenBHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBob3dsZXJfMSA9IHJlcXVpcmUoXCJob3dsZXJcIik7XG5jb25zdCBERUJVRyA9IGZhbHNlO1xuLy8gQ2hlY2sgYW4gaU9TLW9ubHkgcHJvcGVydHkgKFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTmF2aWdhdG9yI25vbi1zdGFuZGFyZF9wcm9wZXJ0aWVzKVxuY29uc3QgSVNfSU9TID0gdHlwZW9mIG5hdmlnYXRvci5zdGFuZGFsb25lICE9PSAndW5kZWZpbmVkJztcbmNsYXNzIEF1ZGlvUGxheWVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb2dzQ29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvZ3NDb25uZWN0aW9uID0gY29nc0Nvbm5lY3Rpb247XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICAgICAgdGhpcy5nbG9iYWxWb2x1bWUgPSAxO1xuICAgICAgICB0aGlzLmF1ZGlvQ2xpcFBsYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5zaW5rSWQgPSAnJztcbiAgICAgICAgLy8gU2VuZCB0aGUgY3VycmVudCBzdGF0dXMgb2YgZWFjaCBjbGlwIHRvIENPR1NcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhdWRpb0NsaXBTdGF0ZScsICh7IGRldGFpbCB9KSA9PiB7XG4gICAgICAgICAgICBjb2dzQ29ubmVjdGlvbi5zZW5kTWVkaWFDbGlwU3RhdGUoZGV0YWlsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgYXVkaW8gY29udHJvbCBtZXNzYWdlc1xuICAgICAgICBjb2dzQ29ubmVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgbWVzc2FnZSB9KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ21lZGlhX2NvbmZpZ191cGRhdGUnOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nbG9iYWxWb2x1bWUgIT09IG1lc3NhZ2UuZ2xvYmFsVm9sdW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEdsb2JhbFZvbHVtZShtZXNzYWdlLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXVkaW9PdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lua0lkID0gY29nc0Nvbm5lY3Rpb24uZ2V0QXVkaW9TaW5rSWQobWVzc2FnZS5hdWRpb091dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1ZGlvU2luayhzaW5rSWQgIT09IG51bGwgJiYgc2lua0lkICE9PSB2b2lkIDAgPyBzaW5rSWQgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb25maWcobWVzc2FnZS5maWxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2F1ZGlvX3BsYXknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlBdWRpb0NsaXAobWVzc2FnZS5maWxlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5SWQ6IG1lc3NhZ2UucGxheUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBtZXNzYWdlLnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3A6IEJvb2xlYW4obWVzc2FnZS5sb29wKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhZGU6IG1lc3NhZ2UuZmFkZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2F1ZGlvX3BhdXNlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXVzZUF1ZGlvQ2xpcChtZXNzYWdlLmZpbGUsIHsgZmFkZTogbWVzc2FnZS5mYWRlIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19zdG9wJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wQXVkaW9DbGlwKG1lc3NhZ2UuZmlsZSwgeyBmYWRlOiBtZXNzYWdlLmZhZGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BBbGxBdWRpb0NsaXBzKHsgZmFkZTogbWVzc2FnZS5mYWRlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2F1ZGlvX3NldF9jbGlwX3ZvbHVtZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXVkaW9DbGlwVm9sdW1lKG1lc3NhZ2UuZmlsZSwgeyB2b2x1bWU6IG1lc3NhZ2Uudm9sdW1lLCBmYWRlOiBtZXNzYWdlLmZhZGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gT24gY29ubmVjdGlvbiwgc2VuZCB0aGUgY3VycmVudCBwbGF5aW5nIHN0YXRlIG9mIGFsbCBjbGlwc1xuICAgICAgICAvLyAoVXN1YWxseSBlbXB0eSB1bmxlc3Mgd2Vic29ja2V0IGlzIHJlY29ubmVjdGluZylcbiAgICAgICAgY29uc3Qgc2VuZEluaXRpYWxDbGlwU3RhdGVzID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpLm1hcCgoW2ZpbGUsIHBsYXllcl0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVDbGlwcyA9IE9iamVjdC52YWx1ZXMocGxheWVyLmFjdGl2ZUNsaXBzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhY3RpdmVDbGlwcy5zb21lKCh7IHN0YXRlIH0pID0+IHN0YXRlLnR5cGUgPT09ICdwbGF5aW5nJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAncGF1c2luZycgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3N0b3BwaW5nJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAncGxheV9yZXF1ZXN0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnR5cGUgPT09ICdzdG9wX3JlcXVlc3RlZCcpXG4gICAgICAgICAgICAgICAgICAgID8gJ3BsYXlpbmcnXG4gICAgICAgICAgICAgICAgICAgIDogYWN0aXZlQ2xpcHMuc29tZSgoeyBzdGF0ZSB9KSA9PiBzdGF0ZS50eXBlID09PSAncGF1c2VkJylcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3BhdXNlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ3N0b3BwZWQnO1xuICAgICAgICAgICAgICAgIHJldHVybiBbZmlsZSwgc3RhdHVzXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29nc0Nvbm5lY3Rpb24uc2VuZEluaXRpYWxNZWRpYUNsaXBTdGF0ZXMoeyBtZWRpYVR5cGU6ICdhdWRpbycsIGZpbGVzIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb2dzQ29ubmVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgc2VuZEluaXRpYWxDbGlwU3RhdGVzKTtcbiAgICAgICAgc2VuZEluaXRpYWxDbGlwU3RhdGVzKCk7XG4gICAgfVxuICAgIHNldEdsb2JhbFZvbHVtZSh2b2x1bWUpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxWb2x1bWUgPSB2b2x1bWU7XG4gICAgICAgIGhvd2xlcl8xLkhvd2xlci52b2x1bWUodm9sdW1lKTtcbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgICBwbGF5QXVkaW9DbGlwKHBhdGgsIHsgcGxheUlkLCB2b2x1bWUsIGZhZGUsIGxvb3AgfSkge1xuICAgICAgICBsb2coJ1BsYXlpbmcgY2xpcCcsIHsgcGF0aCB9KTtcbiAgICAgICAgaWYgKCEocGF0aCBpbiB0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpKSB7XG4gICAgICAgICAgICBsb2coJ0NyZWF0aW5nIGVwaGVtZXJhbCBjbGlwJywgeyBwYXRoIH0pO1xuICAgICAgICAgICAgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdID0gdGhpcy5jcmVhdGVDbGlwKHBhdGgsIHsgcHJlbG9hZDogZmFsc2UsIGVwaGVtZXJhbDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgLy8gUGF1c2VkIGNsaXBzIG5lZWQgdG8gYmUgcGxheWVkIGFnYWluXG4gICAgICAgICAgICBjb25zdCBwYXVzZWRTb3VuZElkcyA9IE9iamVjdC5lbnRyaWVzKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoWywgeyBzdGF0ZSB9XSkgPT4gc3RhdGUudHlwZSA9PT0gJ3BhdXNlZCcpXG4gICAgICAgICAgICAgICAgLm1hcCgoW2lkXSkgPT4gcGFyc2VJbnQoaWQpKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdXNpbmdTb3VuZElkcyA9IE9iamVjdC5lbnRyaWVzKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoWywgeyBzdGF0ZSB9XSkgPT4gc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnKVxuICAgICAgICAgICAgICAgIC5tYXAoKFtpZF0pID0+IHBhcnNlSW50KGlkKSk7XG4gICAgICAgICAgICBwYXVzZWRTb3VuZElkcy5mb3JFYWNoKChzb3VuZElkKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nKCdSZXN1bWluZyBwYXVzZWQgY2xpcCcsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnBsYXkoc291bmRJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENsaXBzIHdpdGggcGF1c2UgcmVxdWVzdGVkIG5vIGxvbmdlciBuZWVkIHRvIHBhdXNlLCB0aGV5IGNhbiBjb250aW51ZSBwbGF5aW5nIG5vd1xuICAgICAgICAgICAgY29uc3QgcGF1c2VSZXF1ZXN0ZWRTb3VuZElkcyA9IE9iamVjdC5lbnRyaWVzKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoWywgeyBzdGF0ZSB9XSkgPT4gc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcpXG4gICAgICAgICAgICAgICAgLm1hcCgoW2lkXSkgPT4gcGFyc2VJbnQoaWQpKTtcbiAgICAgICAgICAgIC8vIElmIG5vIGN1cnJlbnRseSBwYXVzZWQvcGF1c2luZy9wYXVzZV9yZXF1ZXN0ZWQgY2xpcHMsIHBsYXkgYSBuZXcgY2xpcFxuICAgICAgICAgICAgY29uc3QgbmV3U291bmRJZHMgPSBwYXVzZWRTb3VuZElkcy5sZW5ndGggPiAwIHx8IHBhdXNpbmdTb3VuZElkcy5sZW5ndGggPiAwIHx8IHBhdXNlUmVxdWVzdGVkU291bmRJZHMubGVuZ3RoID4gMCA/IFtdIDogW2NsaXBQbGF5ZXIucGxheWVyLnBsYXkoKV07XG4gICAgICAgICAgICAvLyBQYXVzaW5nIGNsaXBzIGFyZSB0ZWNobmljYWxseSBjdXJyZW50bHkgcGxheWluZyBhcyBmYXIgYXMgSG93bGVyIGlzIGNvbmNlcm5lZFxuICAgICAgICAgICAgcGF1c2luZ1NvdW5kSWRzLmZvckVhY2goKHNvdW5kSWQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2coJ1N0b3BwaW5nIGZhZGUgYW5kIHJlc3VtaW5nIHBhdXNpbmcgY2xpcCcsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIFN0b3AgdGhlIGZhZGUgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ2ZhZGUnLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIFNldCBsb29wIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIubG9vcChsb29wLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgc3RhdGUgdG8gJ3BsYXlpbmcnXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVBdWRpb0NsaXAocGF0aCwgc291bmRJZCwgKGNsaXApID0+ICh7IC4uLmNsaXAsIHN0YXRlOiB7IHR5cGU6ICdwbGF5aW5nJyB9IH0pKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgdm9sdW1lLCBvciBzdGFydCBhIG5ldyBmYWRlXG4gICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZhZGUgd2hlbiBjbGlwIHN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgZmFkZSAqIDEwMDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBwYXVzZWQgYW5kIHBhdXNlX3JlcXVlc3RlZCBjbGlwcyB0cmVhdGVkIHRoZSBzYW1lLCB0aGV5IHNob3VsZCBoYXZlIHRoZWlyIHByb3BlcnRpZXNcbiAgICAgICAgICAgIC8vIHVwZGF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHBsYXkgYWN0aW9uJ3MgcHJvcGVydGllc1xuICAgICAgICAgICAgWy4uLnBhdXNlZFNvdW5kSWRzLCAuLi5wYXVzZVJlcXVlc3RlZFNvdW5kSWRzLCAuLi5uZXdTb3VuZElkc10uZm9yRWFjaCgoc291bmRJZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLmxvb3AobG9vcCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbnkgb2xkIGNhbGxiYWNrcyBmaXJzdFxuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZigncGxheScsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdwYXVzZScsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdmYWRlJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ2VuZCcsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdzdG9wJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBOb24tcHJlbG9hZGVkIGNsaXBzIGRvbid0IHlldCBoYXZlIGFuIEhUTUwgYXVkaW8gbm9kZVxuICAgICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gc2V0IHRoZSBhdWRpbyBvdXRwdXQgd2hlbiBpdCdzIHBsYXlpbmdcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdwbGF5JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRQbGF5ZXJTaW5rSWQoY2xpcFBsYXllci5wbGF5ZXIsIHRoaXMuc2lua0lkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdzdG9wJywgKCkgPT4gdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcChwYXRoLCBwbGF5SWQsIHNvdW5kSWQpLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBMb29waW5nIGNsaXBzIGZpcmUgdGhlICdlbmQnIGNhbGxiYWNrIG9uIGV2ZXJ5IGxvb3BcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKChfYSA9IGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNbc291bmRJZF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sb29wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcChwYXRoLCBwbGF5SWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlQ2xpcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcGxheUlkLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogeyB0eXBlOiAncGxheV9yZXF1ZXN0ZWQnIH0sXG4gICAgICAgICAgICAgICAgICAgIGxvb3AsXG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBwbGF5X3JlcXVlc3RlZCcsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIE9uY2UgY2xpcCBzdGFydHMsIGNoZWNrIGlmIGl0IHNob3VsZCBhY3R1YWxseSBiZSBwYXVzZWQgb3Igc3RvcHBlZFxuICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgdGhlbiB1cGRhdGUgc3RhdGUgdG8gJ3BsYXlpbmcnXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgncGxheScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGlwU3RhdGUgPSAoX2EgPSBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzW3NvdW5kSWRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoY2xpcFN0YXRlID09PSBudWxsIHx8IGNsaXBTdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xpcFN0YXRlLnR5cGUpID09PSAncGF1c2VfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDbGlwIHN0YXJ0ZWQgcGxheWluZyBidXQgc2hvdWxkIGJlIHBhdXNlZCcsIHsgcGF0aCwgc291bmRJZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2VBdWRpb0NsaXAocGF0aCwgeyBmYWRlOiBjbGlwU3RhdGUuZmFkZSB9LCBzb3VuZElkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoY2xpcFN0YXRlID09PSBudWxsIHx8IGNsaXBTdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xpcFN0YXRlLnR5cGUpID09PSAnc3RvcF9yZXF1ZXN0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NsaXAgc3RhcnRlZCBwbGF5aW5nIGJ1dCBzaG91bGQgYmUgc3RvcHBlZCcsIHsgcGF0aCwgc291bmRJZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcEF1ZGlvQ2xpcChwYXRoLCB7IGZhZGU6IGNsaXBTdGF0ZS5mYWRlIH0sIHNvdW5kSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDTElQIC0+IHBsYXlpbmcnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlQXVkaW9DbGlwKHBhdGgsIHNvdW5kSWQsIChjbGlwKSA9PiAoeyAuLi5jbGlwLCBzdGF0ZTogeyB0eXBlOiAncGxheWluZycgfSB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBUbyBmYWRlIG9yIHRvIG5vIGZhZGU/XG4gICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZhZGUgd2hlbiBjbGlwIHN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci52b2x1bWUoMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm11dGUoZmFsc2UsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdwbGF5JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVHJhY2sgbmV3L3VwZGF0ZWQgYWN0aXZlIGNsaXBcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzID0geyAuLi5jbGlwUGxheWVyLmFjdGl2ZUNsaXBzLCBbc291bmRJZF06IGFjdGl2ZUNsaXAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIHBhdGgsICdwbGF5aW5nJyk7XG4gICAgfVxuICAgIHBhdXNlQXVkaW9DbGlwKHBhdGgsIHsgZmFkZSB9LCBvbmx5U291bmRJZCwgYWxsb3dJZlBhdXNlUmVxdWVzdGVkKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIC8vIE5vIGFjdGl2ZSBjbGlwcyB0byBwYXVzZVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoKF9iID0gKF9hID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWN0aXZlQ2xpcHMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgY2xpcFBsYXllci5hY3RpdmVDbGlwcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKS5tYXAoKFtzb3VuZElkU3RyLCBjbGlwXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kSWQgPSBwYXJzZUludChzb3VuZElkU3RyKTtcbiAgICAgICAgICAgICAgICAvLyBJZiBvbmx5U291bmRJZCBzcGVjaWZpZWQsIG9ubHkgdXBkYXRlIHRoYXQgY2xpcFxuICAgICAgICAgICAgICAgIGlmIChvbmx5U291bmRJZCA9PT0gdW5kZWZpbmVkIHx8IG9ubHlTb3VuZElkID09PSBzb3VuZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYWxsb3dJZlBhdXNlUmVxdWVzdGVkICYmIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcpIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlpbmcnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWRlVmFsaWQoZmFkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWRlIHRoZW4gcGF1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdmYWRlJywgKHNvdW5kSWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIucGF1c2Uoc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBwYXVzZWQgKGFmdGVyIGZhZGUpJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlQXVkaW9DbGlwKHBhdGgsIHNvdW5kSWQsIChjbGlwKSA9PiAoeyAuLi5jbGlwLCBzdGF0ZTogeyB0eXBlOiAncGF1c2VkJyB9IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMoY2xpcC5wbGF5SWQsIHBhdGgsICdwYXVzZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIDAsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gcGF1c2luZycsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdwYXVzaW5nJyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGF1c2Ugbm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIucGF1c2Uoc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDTElQIC0+IHBhdXNlZCcsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdwYXVzZWQnIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMoY2xpcC5wbGF5SWQsIHBhdGgsICdwYXVzZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBDbGlwIGhhc24ndCBzdGFydGVkIHBsYXlpbmcgeWV0LCBvciBoYXMgYWxyZWFkeSBoYWQgcGF1c2VfcmVxdWVzdGVkIChidXQgZmFkZSBtYXkgaGF2ZSBjaGFuZ2VkIHNvIHVwZGF0ZSBoZXJlKVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5X3JlcXVlc3RlZCcgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDTElQIC0+IHBhdXNlX3JlcXVlc3RlZCcsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZSA9IHsgdHlwZTogJ3BhdXNlX3JlcXVlc3RlZCcsIGZhZGUgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gW3NvdW5kSWRTdHIsIGNsaXBdO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdG9wQXVkaW9DbGlwKHBhdGgsIHsgZmFkZSB9LCBvbmx5U291bmRJZCwgYWxsb3dJZlN0b3BSZXF1ZXN0ZWQpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGxvZygnU3RvcCBhdWRpbyBjbGlwJywgeyBhY3RpdmVDbGlwczogKF9hID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWN0aXZlQ2xpcHMgfSk7XG4gICAgICAgIC8vIE5vIGFjdGl2ZSBjbGlwcyB0byBzdG9wXG4gICAgICAgIGlmIChPYmplY3Qua2V5cygoX2MgPSAoX2IgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5hY3RpdmVDbGlwcykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDoge30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpLm1hcCgoW3NvdW5kSWRTdHIsIGNsaXBdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291bmRJZCA9IHBhcnNlSW50KHNvdW5kSWRTdHIpO1xuICAgICAgICAgICAgICAgIC8vIElmIG9ubHlTb3VuZElkIHNwZWNpZmllZCwgb25seSB1cGRhdGUgdGhhdCBjbGlwXG4gICAgICAgICAgICAgICAgaWYgKG9ubHlTb3VuZElkID09PSB1bmRlZmluZWQgfHwgb25seVNvdW5kSWQgPT09IHNvdW5kSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhbGxvd0lmU3RvcFJlcXVlc3RlZCAmJiBjbGlwLnN0YXRlLnR5cGUgPT09ICdzdG9wX3JlcXVlc3RlZCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5aW5nJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2luZycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3N0b3BwaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpICYmIGNsaXAuc3RhdGUudHlwZSAhPT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIGFueSBvbGQgZmFkZSBjYWxsYmFja3MgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgY2FzdCBvbmNlIGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkL3B1bGwvNTk0MTEgaXMgbWVyZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdmYWRlJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCAwLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGNhbGxiYWNrIGFmdGVyIHN0YXJ0aW5nIG5ldyBmYWRlLCBvdGhlcndpc2UgaXQgd2lsbCBmaXJlIHN0cmFpZ2h0IGF3YXkgYXMgdGhlIHByZXZpb3VzIGZhZGUgaXMgY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgnZmFkZScsIChzb3VuZElkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLmxvb3AoZmFsc2UsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5zdG9wKHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBzdG9wcGluZycsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdzdG9wcGluZycgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnU3RvcCBjbGlwJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIubG9vcChmYWxzZSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIuc3RvcChzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBDbGlwIGhhc24ndCBzdGFydGVkIHBsYXlpbmcgeWV0LCBvciBoYXMgYWxyZWFkeSBoYWQgc3RvcF9yZXF1ZXN0ZWQgKGJ1dCBmYWRlIG1heSBoYXZlIGNoYW5nZWQgc28gdXBkYXRlIGhlcmUpXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIGhhcyBwYXVzZV9yZXF1ZXN0ZWQsIGJ1dCBzdG9wIHRha2VzIHByZWNlZGVuY2VcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2xpcC5zdGF0ZS50eXBlID09PSAncGxheV9yZXF1ZXN0ZWQnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAnc3RvcF9yZXF1ZXN0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coXCJUcnlpbmcgdG8gc3RvcCBjbGlwIHdoaWNoIGhhc24ndCBzdGFydGVkIHBsYXlpbmcgeWV0XCIsIHsgcGF0aCwgc291bmRJZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBzdG9wX3JlcXVlc3RlZCcsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZSA9IHsgdHlwZTogJ3N0b3BfcmVxdWVzdGVkJywgZmFkZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbc291bmRJZFN0ciwgY2xpcF07XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0b3BBbGxBdWRpb0NsaXBzKG9wdGlvbnMpIHtcbiAgICAgICAgbG9nKCdTdG9wcGluZyBhbGwgY2xpcHMnKTtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0b3BBdWRpb0NsaXAocGF0aCwgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRBdWRpb0NsaXBWb2x1bWUocGF0aCwgeyB2b2x1bWUsIGZhZGUgfSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAoISh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgPD0gMSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2b2x1bWUnLCB2b2x1bWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGFjdGl2ZSBjbGlwcyB0byBzZXQgdm9sdW1lIGZvclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoKF9iID0gKF9hID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWN0aXZlQ2xpcHMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgY2xpcFBsYXllci5hY3RpdmVDbGlwcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKS5tYXAoKFtzb3VuZElkU3RyLCBjbGlwXSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZWQgZm9yIHBhdXNpbmcvc3RvcHBpbmcgaW5zdGFuY2VzXG4gICAgICAgICAgICAgICAgaWYgKGNsaXAuc3RhdGUudHlwZSAhPT0gJ3BhdXNpbmcnICYmIGNsaXAuc3RhdGUudHlwZSAhPT0gJ3N0b3BwaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZElkID0gcGFyc2VJbnQoc291bmRJZFN0cik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbc291bmRJZFN0ciwgeyAuLi5jbGlwLCB2b2x1bWUgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3NvdW5kSWRTdHIsIGNsaXBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlU3RvcHBlZENsaXAocGF0aCwgcGxheUlkLCBzb3VuZElkKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgY2xpcFBsYXllci5hY3RpdmVDbGlwc1tzb3VuZElkXTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAnc3RvcHBlZCcpO1xuICAgIH1cbiAgICB1cGRhdGVBY3RpdmVBdWRpb0NsaXAocGF0aCwgc291bmRJZCwgdXBkYXRlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiBzb3VuZElkIGluIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNcbiAgICAgICAgICAgID8geyAuLi5jbGlwUGxheWVyLCBhY3RpdmVDbGlwczogeyAuLi5jbGlwUGxheWVyLmFjdGl2ZUNsaXBzLCBbc291bmRJZF06IHVwZGF0ZShjbGlwUGxheWVyLmFjdGl2ZUNsaXBzW3NvdW5kSWRdKSB9IH1cbiAgICAgICAgICAgIDogY2xpcFBsYXllcik7XG4gICAgfVxuICAgIHVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCB1cGRhdGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAocGF0aCBpbiB0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9DbGlwUGxheWVycyA9IHsgLi4udGhpcy5hdWRpb0NsaXBQbGF5ZXJzLCBbcGF0aF06IHVwZGF0ZSh0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25jZSBsYXN0IGluc3RhbmNlIG9mIGFuIGVwaGVtZXJhbCBjbGlwIGlzIHJlbW92ZWQsIGNsZWFudXAgYW5kIHJlbW92ZSB0aGUgcGxheWVyXG4gICAgICAgIGNvbnN0IGNsaXBQbGF5ZXIgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF07XG4gICAgICAgIGlmIChjbGlwUGxheWVyICYmIE9iamVjdC5rZXlzKChfYSA9IGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9KS5sZW5ndGggPT09IDAgJiYgY2xpcFBsYXllci5jb25maWcuZXBoZW1lcmFsKSB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci51bmxvYWQoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgICBzZXRBdWRpb1Npbmsoc2lua0lkKSB7XG4gICAgICAgIGxvZyhgU2V0dGluZyBzaW5rIElEIGZvciBhbGwgY2xpcHM6YCwgc2lua0lkKTtcbiAgICAgICAgZm9yIChjb25zdCBjbGlwUGxheWVyIG9mIE9iamVjdC52YWx1ZXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKSkge1xuICAgICAgICAgICAgc2V0UGxheWVyU2lua0lkKGNsaXBQbGF5ZXIucGxheWVyLCBzaW5rSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2lua0lkID0gc2lua0lkO1xuICAgIH1cbiAgICB1cGRhdGVDb25maWcobmV3RmlsZXMpIHtcbiAgICAgICAgY29uc3QgbmV3QXVkaW9GaWxlcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhuZXdGaWxlcykuZmlsdGVyKChmaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gZmlsZVsxXS50eXBlO1xuICAgICAgICAgICAgLy8gQ09HUyA0LjYgZGlkIG5vdCBzZW5kIGEgYHR5cGVgIGJ1dCBvbmx5IHJlcG9ydGVkIGF1ZGlvIGZpbGVzXG4gICAgICAgICAgICAvLyBzbyB3ZSBhc3N1bWUgYXVkaW8gaWYgbm8gYHR5cGVgIGlzIGdpdmVuXG4gICAgICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ2F1ZGlvJyB8fCAhdHlwZTtcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0NsaXBQbGF5ZXJzID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzO1xuICAgICAgICB0aGlzLmF1ZGlvQ2xpcFBsYXllcnMgPSAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2xpcFBsYXllcnMgPSB7IC4uLnByZXZpb3VzQ2xpcFBsYXllcnMgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRDbGlwcyA9IE9iamVjdC5rZXlzKHByZXZpb3VzQ2xpcFBsYXllcnMpLmZpbHRlcigocHJldmlvdXNGaWxlKSA9PiAhKHByZXZpb3VzRmlsZSBpbiBuZXdBdWRpb0ZpbGVzKSAmJiAhcHJldmlvdXNDbGlwUGxheWVyc1twcmV2aW91c0ZpbGVdLmNvbmZpZy5lcGhlbWVyYWwpO1xuICAgICAgICAgICAgcmVtb3ZlZENsaXBzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBwcmV2aW91c0NsaXBQbGF5ZXJzW2ZpbGVdLnBsYXllcjtcbiAgICAgICAgICAgICAgICBwbGF5ZXIudW5sb2FkKCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNsaXBQbGF5ZXJzW2ZpbGVdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBhZGRlZENsaXBzID0gT2JqZWN0LmVudHJpZXMobmV3QXVkaW9GaWxlcykuZmlsdGVyKChbbmV3ZmlsZV0pID0+ICFwcmV2aW91c0NsaXBQbGF5ZXJzW25ld2ZpbGVdKTtcbiAgICAgICAgICAgIGFkZGVkQ2xpcHMuZm9yRWFjaCgoW3BhdGgsIGNvbmZpZ10pID0+IHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyc1twYXRoXSA9IHRoaXMuY3JlYXRlQ2xpcChwYXRoLCB7IC4uLmNvbmZpZywgZXBoZW1lcmFsOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZENsaXBzID0gT2JqZWN0LmtleXMocHJldmlvdXNDbGlwUGxheWVycykuZmlsdGVyKChwcmV2aW91c0ZpbGUpID0+IHByZXZpb3VzRmlsZSBpbiBuZXdBdWRpb0ZpbGVzKTtcbiAgICAgICAgICAgIHVwZGF0ZWRDbGlwcy5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLnVwZGF0ZWRDbGlwKHBhdGgsIGNsaXBQbGF5ZXJzW3BhdGhdLCB7IC4uLm5ld0F1ZGlvRmlsZXNbcGF0aF0sIGVwaGVtZXJhbDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVycztcbiAgICAgICAgfSkoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgICBub3RpZnlTdGF0ZUxpc3RlbmVycygpIHtcbiAgICAgICAgY29uc3QgY2xpcHMgPSBPYmplY3QuZW50cmllcyh0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpLnJlZHVjZSgoY2xpcHMsIFtwYXRoLCBjbGlwUGxheWVyXSkgPT4ge1xuICAgICAgICAgICAgY2xpcHNbcGF0aF0gPSB7XG4gICAgICAgICAgICAgICAgY29uZmlnOiB7IHByZWxvYWQ6IGNsaXBQbGF5ZXIuY29uZmlnLnByZWxvYWQsIGVwaGVtZXJhbDogY2xpcFBsYXllci5jb25maWcuZXBoZW1lcmFsIH0sXG4gICAgICAgICAgICAgICAgYWN0aXZlQ2xpcHM6IGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBzO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGNvbnN0IGlzUGxheWluZyA9IE9iamVjdC52YWx1ZXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKS5zb21lKCh7IGFjdGl2ZUNsaXBzIH0pID0+IE9iamVjdC52YWx1ZXMoYWN0aXZlQ2xpcHMpLnNvbWUoKGNsaXApID0+IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlpbmcnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3N0b3BwaW5nJykpO1xuICAgICAgICBjb25zdCBhdWRpb1N0YXRlID0ge1xuICAgICAgICAgICAgZ2xvYmFsVm9sdW1lOiB0aGlzLmdsb2JhbFZvbHVtZSxcbiAgICAgICAgICAgIGlzUGxheWluZyxcbiAgICAgICAgICAgIGNsaXBzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3N0YXRlJywgYXVkaW9TdGF0ZSk7XG4gICAgfVxuICAgIG5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIGZpbGUsIHN0YXR1cykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ2F1ZGlvQ2xpcFN0YXRlJywgeyBtZWRpYVR5cGU6ICdhdWRpbycsIHBsYXlJZCwgZmlsZSwgc3RhdHVzIH0pO1xuICAgIH1cbiAgICAvLyBUeXBlLXNhZmUgd3JhcHBlciBhcm91bmQgRXZlbnRUYXJnZXRcbiAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcGF0Y2hFdmVudCh0eXBlLCBkZXRhaWwpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCh0eXBlLCB7IGRldGFpbCB9KSk7XG4gICAgfVxuICAgIGNyZWF0ZVBsYXllcihwYXRoLCBjb25maWcpIHtcbiAgICAgICAgY29uc3QgcGxheWVyID0gbmV3IGhvd2xlcl8xLkhvd2woe1xuICAgICAgICAgICAgc3JjOiB0aGlzLmNvZ3NDb25uZWN0aW9uLmdldEFzc2V0VXJsKHBhdGgpLFxuICAgICAgICAgICAgYXV0b3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgbG9vcDogZmFsc2UsXG4gICAgICAgICAgICB2b2x1bWU6IDEsXG4gICAgICAgICAgICBodG1sNTogdHJ1ZSxcbiAgICAgICAgICAgIHByZWxvYWQ6IGNvbmZpZy5wcmVsb2FkLFxuICAgICAgICB9KTtcbiAgICAgICAgc2V0UGxheWVyU2lua0lkKHBsYXllciwgdGhpcy5zaW5rSWQpO1xuICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgIH1cbiAgICBjcmVhdGVDbGlwKGZpbGUsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcGxheWVyOiB0aGlzLmNyZWF0ZVBsYXllcihmaWxlLCBjb25maWcpLFxuICAgICAgICAgICAgYWN0aXZlQ2xpcHM6IHt9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGVkQ2xpcChjbGlwUGF0aCwgcHJldmlvdXNDbGlwLCBuZXdDb25maWcpIHtcbiAgICAgICAgY29uc3QgY2xpcCA9IHsgLi4ucHJldmlvdXNDbGlwLCBjb25maWc6IG5ld0NvbmZpZyB9O1xuICAgICAgICBpZiAocHJldmlvdXNDbGlwLmNvbmZpZy5wcmVsb2FkICE9PSBuZXdDb25maWcucHJlbG9hZCkge1xuICAgICAgICAgICAgY2xpcC5wbGF5ZXIudW5sb2FkKCk7XG4gICAgICAgICAgICBjbGlwLnBsYXllciA9IHRoaXMuY3JlYXRlUGxheWVyKGNsaXBQYXRoLCBuZXdDb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGlwO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEF1ZGlvUGxheWVyO1xuZnVuY3Rpb24gbG9nKC4uLmRhdGEpIHtcbiAgICBpZiAoREVCVUcpIHtcbiAgICAgICAgY29uc29sZS5sb2coLi4uZGF0YSk7XG4gICAgfVxufVxuLyoqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBpcyB0aGlzIGEgdmFsaWQgZmFkZSBkdXJhdGlvbi4gQWx3YXlzIHJldHVybnMgYGZhbHNlYCBvbiBpT1NcbiAqL1xuZnVuY3Rpb24gaXNGYWRlVmFsaWQoZmFkZSkge1xuICAgIHJldHVybiAhSVNfSU9TICYmIHR5cGVvZiBmYWRlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4oZmFkZSkgJiYgZmFkZSA+IDA7XG59XG5mdW5jdGlvbiBzZXRQbGF5ZXJTaW5rSWQocGxheWVyLCBzaW5rSWQpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHNpbmtJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHBsYXllci5faHRtbDUpIHtcbiAgICAgICAgKF9hID0gcGxheWVyLl9zb3VuZHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JFYWNoKChzb3VuZCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIChfYiA9IChfYSA9IHNvdW5kLl9ub2RlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2V0U2lua0lkKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgc2lua0lkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgd2ViIGF1ZGlvXG4gICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNldCBzaW5rIElEOiB3ZWIgYXVkaW8gbm90IHN1cHBvcnRlZCcsIHBsYXllcik7XG4gICAgfVxufVxuLyoqXG4gKiBTZXQgYXVkaW8gdm9sdW1lXG4gKlxuICogVGhpcyBkb2Vzbid0IHdvcmsgb24gaU9TICh2b2x1bWUgaXMgcmVhZC1vbmx5KSBzbyBhdCBsZWFzdCBtdXRlIGl0IGlmIHRoZSB2b2x1bWUgaXMgemVyb1xuICovXG5mdW5jdGlvbiBzZXRBdWRpb1BsYXllclZvbHVtZShob3dsLCB2b2x1bWUsIHNvdW5kSWQpIHtcbiAgICBob3dsLnZvbHVtZSh2b2x1bWUsIHNvdW5kSWQpO1xuICAgIGhvd2wubXV0ZSh2b2x1bWUgPT09IDAsIHNvdW5kSWQpO1xufVxuLyoqXG4gKiBGYWRlIHRvIGF1ZGlvIHZvbHVtZVxuICpcbiAqIE5vdGU6IFRoaXMgZG9lc24ndCB3b3JrIG9uIGlPUyAodm9sdW1lIGlzIHJlYWQtb25seSlcbiAqL1xuZnVuY3Rpb24gZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGhvd2wsIHZvbHVtZSwgZmFkZSwgc291bmRJZCkge1xuICAgIGhvd2wuZmFkZShob3dsLnZvbHVtZShzb3VuZElkKSwgdm9sdW1lLCBmYWRlLCBzb3VuZElkKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db2dzSW5jb21pbmdFdmVudCA9IGV4cG9ydHMuQ29nc1N0YXRlQ2hhbmdlZEV2ZW50ID0gZXhwb3J0cy5Db2dzQ29uZmlnQ2hhbmdlZEV2ZW50ID0gZXhwb3J0cy5Db2dzTWVzc2FnZUV2ZW50ID0gZXhwb3J0cy5Db2dzQ29ubmVjdGlvbkNsb3NlRXZlbnQgPSBleHBvcnRzLkNvZ3NDb25uZWN0aW9uT3BlbkV2ZW50ID0gdm9pZCAwO1xuY29uc3QgY29tcGFyZV92ZXJzaW9uc18xID0gcmVxdWlyZShcImNvbXBhcmUtdmVyc2lvbnNcIik7XG5jb25zdCBTaG93UGhhc2VfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlcy9TaG93UGhhc2VcIikpO1xuY29uc3QgcmVjb25uZWN0aW5nX3dlYnNvY2tldF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJyZWNvbm5lY3Rpbmctd2Vic29ja2V0XCIpKTtcbmNvbnN0IHVybHNfMSA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvdXJsc1wiKTtcbmNsYXNzIENvZ3NDb25uZWN0aW9uIHtcbiAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmN1cnJlbnRDb25maWcgfTtcbiAgICB9XG4gICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmN1cnJlbnRTdGF0ZSB9O1xuICAgIH1cbiAgICBnZXQgc2hvd1BoYXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd1BoYXNlO1xuICAgIH1cbiAgICBnZXQgdGltZXJTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVyU3RhdGUgPyB7IC4uLnRoaXMuX3RpbWVyU3RhdGUgfSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c0h0dHAyQXNzZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRTdXBwb3J0c0h0dHAyQXNzZXRzICYmIHRoaXMuc2VydmVyU3VwcG9ydHNIdHRwMkFzc2V0cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFzc2V0IFVSTHMgdXNpbmcgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0IGZvciBIVFRQLzJcbiAgICAgKi9cbiAgICBnZXRBc3NldFVybChwYXRoKSB7XG4gICAgICAgIHJldHVybiAoMCwgdXJsc18xLmFzc2V0VXJsKShwYXRoLCB0aGlzLnN1cHBvcnRzSHR0cDJBc3NldHMpO1xuICAgIH1cbiAgICBnZXQgc2VsZWN0ZWRBdWRpb091dHB1dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQXVkaW9PdXRwdXQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG1hbmlmZXN0LCB7IGhvc3RuYW1lID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUsIHBvcnQgPSB1cmxzXzEuQ09HU19TRVJWRVJfUE9SVCB9ID0ge30sIGluaXRpYWxDbGllbnRTdGF0ZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0ge307IC8vIFJlY2VpdmVkIG9uIG9wZW4gY29ubmVjdGlvbiAtIFRPRE86IHNldCBpbml0aWFsIHN0YXRlIGZyb20gbWFuaWZlc3Q/XG4gICAgICAgIHRoaXMuX3Nob3dQaGFzZSA9IFNob3dQaGFzZV8xLmRlZmF1bHQuU2V0dXA7XG4gICAgICAgIHRoaXMuX3RpbWVyU3RhdGUgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogVHJhY2sgdGhlIHN1cHBvcnQgZm9yIEhUVFAvMiBhc3NldHMgb24gdGhlIGNsaWVudCBhbmQgc2VydmVyIHNpZGVcbiAgICAgICAgICogQ2xpZW50IHNpZGUgaXMgZGljdGF0ZWQgYnkgdGhlIGVudmlyb25tZW50IHdlJ3JlIGNvbm5lY3RpbmcgZnJvbSAoYW5kIHRoZSBtZWRpYSBjb2dzLWF2LWJveCB2ZXJzaW9uKVxuICAgICAgICAgKiBTZXJ2ZXIgc2lkZSBpcyBkaWN0YXRlZCBieSB0aGUgQ09HUyB2ZXJzaW9uIHdoaWNoIGFkZGVkIHRoZSBIVFRQLzIgYXNzZXRzIHNlcnZlciBpdHNlbGZcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2xpZW50U3VwcG9ydHNIdHRwMkFzc2V0cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlcnZlclN1cHBvcnRzSHR0cDJBc3NldHMgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhY2hlZCBhdWRpbyBvdXRwdXRzIHVzZSB0byBsb29rIHVwIHRoZSBkZXZpY2Uvc2luayBJRCB3aGVuIGEgZGlmZmVyZW50IGRldmljZSBsYWJlbCBpcyByZXF1ZXN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXVkaW9PdXRwdXRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZEF1ZGlvT3V0cHV0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0geyAuLi5pbml0aWFsQ2xpZW50U3RhdGUgfTtcbiAgICAgICAgY29uc3QgeyB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQsIHBhdGgsIHBhdGhQYXJhbXMsIHN1cHBvcnRzSHR0cDJBc3NldHMgfSA9IHdlYnNvY2tldFBhcmFtZXRlcnNGcm9tVXJsKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBzb2NrZXRVcmwgPSBgd3M6Ly8ke2hvc3RuYW1lfToke3BvcnR9JHtwYXRofSR7cGF0aFBhcmFtcyA/ICc/JyArIHBhdGhQYXJhbXMgOiAnJ31gO1xuICAgICAgICB0aGlzLndlYnNvY2tldCA9IHVzZVJlY29ubmVjdGluZ1dlYnNvY2tldCA/IG5ldyByZWNvbm5lY3Rpbmdfd2Vic29ja2V0XzEuZGVmYXVsdChzb2NrZXRVcmwpIDogbmV3IFdlYlNvY2tldChzb2NrZXRVcmwpO1xuICAgICAgICB0aGlzLmNsaWVudFN1cHBvcnRzSHR0cDJBc3NldHMgPSAhIXN1cHBvcnRzSHR0cDJBc3NldHM7XG4gICAgICAgIHRoaXMud2Vic29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENvbmZpZyA9IHt9OyAvLyBSZWNlaXZlZCBvbiBvcGVuIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0ge307IC8vIFJlY2VpdmVkIG9uIG9wZW4gY29ubmVjdGlvblxuICAgICAgICAgICAgLy8gUmVzZXQgdGhpcyBmbGFnIGFzIHdlIG1pZ2h0IGhhdmUganVzdCBjb25uZWN0ZWQgdG8gYW4gb2xkIENPR1MgdmVyc2lvbiB3aGljaCBkb2Vzbid0IHN1cHBvcnQgSFRUUC8yXG4gICAgICAgICAgICAvLyBUaGUgZmxhZyB3aWxsIGJlIHNldCB3aGVuIENPR1Mgc2VuZHMgYSBcImNvZ3NfZW52aXJvbm1lbnRcIiBtZXNzYWdlXG4gICAgICAgICAgICB0aGlzLnNlcnZlclN1cHBvcnRzSHR0cDJBc3NldHMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ29nc0Nvbm5lY3Rpb25PcGVuRXZlbnQoKSk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHRoaXMuY3VycmVudFN0YXRlKTsgLy8gVE9ETzogUmVtb3ZlIHRoaXMgYmVjYXVzZSB5b3Ugc2hvdWxkIHNldCBpdCBtYW51YWxseS4uLj8/XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2Vic29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENvZ3NDb25uZWN0aW9uQ2xvc2VFdmVudCgpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQub25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbmZpZyA9IHBhcnNlZC5jb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENvZ3NDb25maWdDaGFuZ2VkRXZlbnQodGhpcy5jdXJyZW50Q29uZmlnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VkLnVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZSwgLi4ucGFyc2VkLnVwZGF0ZXMgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ29nc1N0YXRlQ2hhbmdlZEV2ZW50KHBhcnNlZC51cGRhdGVzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VkLmV2ZW50ICYmIHBhcnNlZC5ldmVudC5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ29nc0luY29taW5nRXZlbnQocGFyc2VkLmV2ZW50LmtleSwgcGFyc2VkLmV2ZW50LnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHBhcnNlZC5tZXNzYWdlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHBhcnNlZC5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhZGp1c3RhYmxlX3RpbWVyX3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVyU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1pbGxpczogbWVzc2FnZS5kdXJhdGlvbk1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tpbmc6IG1lc3NhZ2UudGlja2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2hvd19waGFzZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dQaGFzZSA9IG1lc3NhZ2UucGhhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvZ3NfZW52aXJvbm1lbnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlclN1cHBvcnRzSHR0cDJBc3NldHMgPSBtZXNzYWdlLmh0dHAyQXNzZXRzU2VydmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ29nc01lc3NhZ2VFdmVudChtZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBoYW5kbGluZyBkYXRhJywgZGF0YSwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gcGFyc2UgaW5jb21pbmcgZGF0YSBmcm9tIHNlcnZlcicsIGRhdGEsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBTZW5kIGEgbGlzdCBvZiBhdWRpbyBvdXRwdXRzIHRvIENPR1MgYW5kIGtlZXAgaXQgdXAgdG8gZGF0ZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCByZWZyZXNoQXVkaW9PdXRwdXRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzYCBpcyB1bmRlZmluZWQgb24gQ09HUyBBViA8PSA0LjUgYmVjYXVzZSBvZiBzZWN1cmUgb3JpZ2luIHBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5tZWRpYURldmljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9PdXRwdXRzID0gKGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpKS5maWx0ZXIoKHsga2luZCB9KSA9PiBraW5kID09PSAnYXVkaW9vdXRwdXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kQXVkaW9PdXRwdXRzKGF1ZGlvT3V0cHV0cyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9PdXRwdXRzID0gYXVkaW9PdXRwdXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCByZWZyZXNoQXVkaW9PdXRwdXRzKTtcbiAgICAgICAgICAgIChfYSA9IG5hdmlnYXRvci5tZWRpYURldmljZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VjaGFuZ2UnLCByZWZyZXNoQXVkaW9PdXRwdXRzKTtcbiAgICAgICAgICAgIHJlZnJlc2hBdWRpb091dHB1dHMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTjtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMud2Vic29ja2V0LmNsb3NlKCk7XG4gICAgfVxuICAgIHNlbmRFdmVudChldmVudE5hbWUsIC4uLltldmVudFZhbHVlXSkge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBldmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBldmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0U3RhdGUodmFsdWVzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZSwgLi4udmFsdWVzIH07XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgdXBkYXRlczogdmFsdWVzIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBdWRpb1NpbmtJZChhdWRpb091dHB1dCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gYXVkaW9PdXRwdXQgPyAoX2IgPSAoX2EgPSB0aGlzLmF1ZGlvT3V0cHV0cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbmQoKHsgbGFiZWwgfSkgPT4gbGFiZWwgPT09IGF1ZGlvT3V0cHV0KSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRldmljZUlkIDogJyc7XG4gICAgfVxuICAgIHNlbmRJbml0aWFsTWVkaWFDbGlwU3RhdGVzKGFsbE1lZGlhQ2xpcFN0YXRlcykge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IGFsbE1lZGlhQ2xpcFN0YXRlcyB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VuZE1lZGlhQ2xpcFN0YXRlKG1lZGlhQ2xpcFN0YXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgbWVkaWFDbGlwU3RhdGUgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNlbmRBdWRpb091dHB1dHMoYXVkaW9PdXRwdXRzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgYXVkaW9PdXRwdXRzIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93IG9yIGhpZGUgdGhlIHBsdWdpbiB3aW5kb3cuXG4gICAgICogQHBhcmFtIHZpc2libGUgV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIHdpbmRvd1xuICAgICAqIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgcGx1Z2lucywgbm90IGZvciBNZWRpYSBNYXN0ZXIgY29udGVudC5cbiAgICAgKi9cbiAgICBzZXRQbHVnaW5XaW5kb3dWaXNpYmxlKHZpc2libGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB3aW5kb3c6IHsgdmlzaWJsZSB9IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUeXBlLXNhZmUgd3JhcHBlciBhcm91bmQgRXZlbnRUYXJnZXRcbiAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcGF0Y2hFdmVudChldmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IENvZ3NDb25uZWN0aW9uO1xuZnVuY3Rpb24gd2Vic29ja2V0UGFyYW1ldGVyc0Zyb21VcmwodXJsKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgY29uc3QgcGF0aFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyc2VkVXJsLnNlYXJjaFBhcmFtcyk7XG4gICAgY29uc3QgbG9jYWxDbGllbnRJZCA9IHBhdGhQYXJhbXMuZ2V0KCdsb2NhbF9pZCcpO1xuICAgIGNvbnN0IGlzU2ltdWxhdG9yID0gcGF0aFBhcmFtcy5nZXQoJ3NpbXVsYXRvcicpID09PSAndHJ1ZSc7XG4gICAgY29uc3QgZGlzcGxheSA9IChfYSA9IHBhdGhQYXJhbXMuZ2V0KCdkaXNwbGF5JykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIGNvbnN0IHBsdWdpbklkID0gcGFyc2VkVXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9wbHVnaW4vJykgPyBkZWNvZGVVUklDb21wb25lbnQocGFyc2VkVXJsLnBhdGhuYW1lLnNwbGl0KCcvJylbMl0pIDogdW5kZWZpbmVkO1xuICAgIC8vIEFsbG93IGV4cGxpY2l0bHkgZGlzYWJsaW5nIEhUVFAvMiBhc3NldHMuIFRoaXMgaXMgdXNlZnVsIGluIHNpdHVhdGlvbnMgd2hlcmUgd2Uga25vdyB0aGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgY2Fubm90IGJlXG4gICAgLy8gc3VwcG9ydGVkIHN1Y2ggYXMgdGhlIG5hdGl2ZSBtb2JpbGUgYXBwXG4gICAgY29uc3QgZGlzYWJsZUh0dHAyQXNzZXRzID0gKChfYiA9IHBhdGhQYXJhbXMuZ2V0KCdodHRwMkFzc2V0cycpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJykgPT09ICdmYWxzZSc7XG4gICAgaWYgKGxvY2FsQ2xpZW50SWQpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IChfYyA9IHBhdGhQYXJhbXMuZ2V0KCd0JykpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICcnO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnbG9jYWxfaWQnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGAvbG9jYWwvJHtlbmNvZGVVUklDb21wb25lbnQobG9jYWxDbGllbnRJZCl9YCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXM6IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB0OiB0eXBlIH0pLFxuICAgICAgICAgICAgdXNlUmVjb25uZWN0aW5nV2Vic29ja2V0OiB0cnVlLFxuICAgICAgICAgICAgc3VwcG9ydHNIdHRwMkFzc2V0czogIWRpc2FibGVIdHRwMkFzc2V0cyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTaW11bGF0b3IpIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydHNIdHRwMkFzc2V0cyA9ICgoX2QgPSBwYXRoUGFyYW1zLmdldCgnaHR0cDJBc3NldHMnKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJycpID09PSAndHJ1ZSc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdodHRwMkFzc2V0cycpO1xuICAgICAgICBjb25zdCBuYW1lID0gKF9lID0gcGF0aFBhcmFtcy5nZXQoJ25hbWUnKSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogJyc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdzaW11bGF0b3InKTtcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ25hbWUnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGAvc2ltdWxhdG9yLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWAsXG4gICAgICAgICAgICBwYXRoUGFyYW1zLFxuICAgICAgICAgICAgdXNlUmVjb25uZWN0aW5nV2Vic29ja2V0OiB0cnVlLFxuICAgICAgICAgICAgc3VwcG9ydHNIdHRwMkFzc2V0czogIWRpc2FibGVIdHRwMkFzc2V0cyAmJiBzdXBwb3J0c0h0dHAyQXNzZXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChkaXNwbGF5KSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlJZEluZGV4ID0gKF9mID0gcGF0aFBhcmFtcy5nZXQoJ2Rpc3BsYXlJZEluZGV4JykpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6ICcnO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnZGlzcGxheScpO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnZGlzcGxheUlkSW5kZXgnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGAvZGlzcGxheS8ke2VuY29kZVVSSUNvbXBvbmVudChkaXNwbGF5KX0vJHtlbmNvZGVVUklDb21wb25lbnQoZGlzcGxheUlkSW5kZXgpfWAsXG4gICAgICAgICAgICBzdXBwb3J0c0h0dHAyQXNzZXRzOiAhZGlzYWJsZUh0dHAyQXNzZXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChwbHVnaW5JZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogYC9wbHVnaW4vJHtlbmNvZGVVUklDb21wb25lbnQocGx1Z2luSWQpfWAsXG4gICAgICAgICAgICB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQ6IHRydWUsXG4gICAgICAgICAgICBzdXBwb3J0c0h0dHAyQXNzZXRzOiAhZGlzYWJsZUh0dHAyQXNzZXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsID0gKF9nID0gcGF0aFBhcmFtcy5nZXQoJ3NlcmlhbCcpKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAnJztcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ3NlcmlhbCcpO1xuICAgICAgICAvLyBDaGVjayBpZiBjb2dzLWJveC1hdiBpcyBhIHZlcnNpb24gd2hpY2ggYWRkZWQgc3VwcG9ydCBmb3IgaWdub3JpbmcgSFRUUC8yIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlc1xuICAgICAgICBjb25zdCBmaXJtd2FyZVZlcnNpb24gPSAoKF9oID0gcGF0aFBhcmFtcy5nZXQoJ2YnKSkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogJycpLnJlcGxhY2UoL152LywgJycpO1xuICAgICAgICBjb25zdCBpc0NvZ3NCb3hBdkRldkJ1aWxkID0gZmlybXdhcmVWZXJzaW9uID09PSAnMC4wLjAnOyAvLyBXZSBhc3N1bWUgZGV2IGZpcm13YXJlIGJ1aWxkcyBoYXZlIEhUVFAvMiBhc3NldHMgc3VwcG9ydCAtIEFkZGVkIGluIDIwMjQtMDNcbiAgICAgICAgY29uc3Qgc3VwcG9ydHNIdHRwMkFzc2V0cyA9IGlzQ29nc0JveEF2RGV2QnVpbGQgfHwgKCgwLCBjb21wYXJlX3ZlcnNpb25zXzEudmFsaWRhdGUpKGZpcm13YXJlVmVyc2lvbikgJiYgKDAsIGNvbXBhcmVfdmVyc2lvbnNfMS5zYXRpc2ZpZXMpKGZpcm13YXJlVmVyc2lvbiwgJz49NC45LjAnKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoOiBgL2NsaWVudC8ke2VuY29kZVVSSUNvbXBvbmVudChzZXJpYWwpfWAsXG4gICAgICAgICAgICBwYXRoUGFyYW1zLFxuICAgICAgICAgICAgc3VwcG9ydHNIdHRwMkFzc2V0czogIWRpc2FibGVIdHRwMkFzc2V0cyAmJiBzdXBwb3J0c0h0dHAyQXNzZXRzLFxuICAgICAgICB9O1xuICAgIH1cbn1cbmNsYXNzIENvZ3NDb25uZWN0aW9uT3BlbkV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignb3BlbicpO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdvcGVuJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NDb25uZWN0aW9uT3BlbkV2ZW50ID0gQ29nc0Nvbm5lY3Rpb25PcGVuRXZlbnQ7XG5jbGFzcyBDb2dzQ29ubmVjdGlvbkNsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdjbG9zZScpO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdjbG9zZSc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzQ29ubmVjdGlvbkNsb3NlRXZlbnQgPSBDb2dzQ29ubmVjdGlvbkNsb3NlRXZlbnQ7XG5jbGFzcyBDb2dzTWVzc2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoJ21lc3NhZ2UnKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5fY29nc0Nvbm5lY3Rpb25FdmVudFR5cGUgPSAnbWVzc2FnZSc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzTWVzc2FnZUV2ZW50ID0gQ29nc01lc3NhZ2VFdmVudDtcbmNsYXNzIENvZ3NDb25maWdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCdjb25maWcnKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ2NvbmZpZyc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzQ29uZmlnQ2hhbmdlZEV2ZW50ID0gQ29nc0NvbmZpZ0NoYW5nZWRFdmVudDtcbmNsYXNzIENvZ3NTdGF0ZUNoYW5nZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICBzdXBlcignc3RhdGUnKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdzdGF0ZSc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzU3RhdGVDaGFuZ2VkRXZlbnQgPSBDb2dzU3RhdGVDaGFuZ2VkRXZlbnQ7XG5jbGFzcyBDb2dzSW5jb21pbmdFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2YWx1ZSkge1xuICAgICAgICBzdXBlcignZXZlbnQnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdldmVudCc7XG4gICAgfVxufVxuZXhwb3J0cy5Db2dzSW5jb21pbmdFdmVudCA9IENvZ3NJbmNvbWluZ0V2ZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURSA9IHZvaWQgMDtcbmNvbnN0IG1lZGlhX3N0cmVhbV9saWJyYXJ5X2Jyb3dzZXJfMSA9IHJlcXVpcmUoXCJAY2xvY2t3b3JrZG9nL21lZGlhLXN0cmVhbS1saWJyYXJ5LWJyb3dzZXJcIik7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jb25zdCBERUZBVUxUX1ZJREVPX1BMQVlCQUNLX1JBVEUgPSAxO1xuLy8gVXNlIGEgZmFzdGVyLXRoYW4tcmVhbHRpbWUgcGxheWJhY2sgcmF0ZSBieSBkZWZhdWx0XG4vLyBzbyB0aGF0IGl0IGtlZXBzIHVwIHdpdGggYSByZWFsdGltZSBzdHJlYW0gaW4gY2FzZSBvZiB2aWRlbyBidWZmZXJpbmdcbmV4cG9ydHMuTElWRV9WSURFT19QTEFZQkFDS19SQVRFID0gMS4xO1xuLyoqXG4gKiBNYW5hZ2VzIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIENPR1MgVENQIHJlbGF5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNlbmQgUlRTUCB2aWRlb1xuICogZmVlZHMgdG8gdGhlIHdlYi5cbiAqL1xuY2xhc3MgUnRzcFN0cmVhbWVyIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGhvc3RuYW1lID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUsIHBvcnQgPSB1cmxzXzEuQ09HU19TRVJWRVJfUE9SVCwgcGF0aCA9ICcvdGNwLXByb3h5JywgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuX3dlYnNvY2tldFVyaSA9IGB3czovLyR7aG9zdG5hbWV9OiR7cG9ydH0ke3BhdGh9YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgYW4gUlRTUCB2aWRlbyBzdHJlYW0gb24gd2l0aCB0aGUgZ2l2ZW4gVVJJIG9uIHRoZSBnaXZlbiB2aWRlbyBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgZnVuY3Rpb24gdG8gY2xvc2UgdGhlIHBpcGVsaW5lXG4gICAgICovXG4gICAgcGxheShwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHVyaSwgdmlkZW9FbGVtZW50IH0gPSBwYXJhbXM7XG4gICAgICAgIHZpZGVvRWxlbWVudC5wbGF5c0lubGluZSA9IHRydWU7IC8vIFJlcXVpcmVkIGZvciBpT1NcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBjb25zdCBzdGFydFBpcGVsaW5lID0gKCkgPT4ge1xuICAgICAgICAgICAgcGlwZWxpbmUgPT09IG51bGwgfHwgcGlwZWxpbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBpcGVsaW5lLmNsb3NlKCk7XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ldyBtZWRpYV9zdHJlYW1fbGlicmFyeV9icm93c2VyXzEuSHRtbDVWaWRlb1BpcGVsaW5lKHtcbiAgICAgICAgICAgICAgICB3czogeyB1cmk6IHRoaXMuX3dlYnNvY2tldFVyaSB9LFxuICAgICAgICAgICAgICAgIHJ0c3A6IHsgdXJpOiB1cmkgfSxcbiAgICAgICAgICAgICAgICBtZWRpYUVsZW1lbnQ6IHZpZGVvRWxlbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gUmVzdGFydCBzdHJlYW0gb24gUlRDUCBCWUUgKHN0cmVhbSBlbmRlZClcbiAgICAgICAgICAgIHBpcGVsaW5lLnJ0c3Aub25SdGNwID0gKHJ0Y3ApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoKDAsIG1lZGlhX3N0cmVhbV9saWJyYXJ5X2Jyb3dzZXJfMS5pc1J0Y3BCeWUpKHJ0Y3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdWaWRlbyBzdHJlYW0gZW5kZWQuIFJlc3RhcnRpbmcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHN0YXJ0UGlwZWxpbmUsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBTdGFydCBwbGF5YmFjayB3aGVuIHJlYWR5XG4gICAgICAgICAgICBwaXBlbGluZS5yZWFkeS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlbGluZS5ydHNwLnBsYXkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBzdGFydFBpcGVsaW5lKCk7XG4gICAgICAgIGlmIChwYXJhbXMucGxheWJhY2tSYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5YmFja1JhdGUgPSAoX2EgPSBwYXJhbXMucGxheWJhY2tSYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBERUZBVUxUX1ZJREVPX1BMQVlCQUNLX1JBVEU7XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQucGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcmFtcy5yZXN0YXJ0SWZTdG9wcGVkKSB7XG4gICAgICAgICAgICBsZXQgcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGludGVydmFsID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVRpbWVVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZVRpbWVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGlmICghaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVmlkZW8gc3RvcHBlZCBwbGF5aW5nLiBSZXN0YXJ0aW5nLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc3RhcnRQaXBlbGluZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQYXVzZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZVRpbWVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIGhhbmRsZVBsYXkpO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgaGFuZGxlUGF1c2UpO1xuICAgICAgICAgICAgcmVtb3ZlUmVzdGFydExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVQYXVzZSgpO1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5JywgaGFuZGxlUGxheSk7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgaGFuZGxlUGF1c2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9PT0gbnVsbCB8fCBwaXBlbGluZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGlwZWxpbmUuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID09PSBudWxsIHx8IHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUnRzcFN0cmVhbWVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBWaWRlb1N0YXRlXzEgPSByZXF1aXJlKFwiLi90eXBlcy9WaWRlb1N0YXRlXCIpO1xuY29uc3QgREVGQVVMVF9QQVJFTlRfRUxFTUVOVCA9IGRvY3VtZW50LmJvZHk7XG5jbGFzcyBWaWRlb1BsYXllciB7XG4gICAgY29uc3RydWN0b3IoY29nc0Nvbm5lY3Rpb24sIHBhcmVudEVsZW1lbnQgPSBERUZBVUxUX1BBUkVOVF9FTEVNRU5UKSB7XG4gICAgICAgIHRoaXMuY29nc0Nvbm5lY3Rpb24gPSBjb2dzQ29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgICAgICB0aGlzLmdsb2JhbFZvbHVtZSA9IDE7XG4gICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVycyA9IHt9O1xuICAgICAgICB0aGlzLnNpbmtJZCA9ICcnO1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICAvLyBTZW5kIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBlYWNoIGNsaXAgdG8gQ09HU1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3ZpZGVvQ2xpcFN0YXRlJywgKHsgZGV0YWlsIH0pID0+IHtcbiAgICAgICAgICAgIGNvZ3NDb25uZWN0aW9uLnNlbmRNZWRpYUNsaXBTdGF0ZShkZXRhaWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciB2aWRlbyBjb250cm9sIG1lc3NhZ2VzXG4gICAgICAgIGNvZ3NDb25uZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBtZXNzYWdlIH0pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWFfY29uZmlnX3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0R2xvYmFsVm9sdW1lKG1lc3NhZ2UuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXVkaW9PdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lua0lkID0gY29nc0Nvbm5lY3Rpb24uZ2V0QXVkaW9TaW5rSWQobWVzc2FnZS5hdWRpb091dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1ZGlvU2luayhzaW5rSWQgIT09IG51bGwgJiYgc2lua0lkICE9PSB2b2lkIDAgPyBzaW5rSWQgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb25maWcobWVzc2FnZS5maWxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3BsYXknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlWaWRlb0NsaXAobWVzc2FnZS5maWxlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5SWQ6IG1lc3NhZ2UucGxheUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBtZXNzYWdlLnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3A6IEJvb2xlYW4obWVzc2FnZS5sb29wKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpdDogbWVzc2FnZS5maXQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19wYXVzZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2VWaWRlb0NsaXAoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW9fc3RvcCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFZpZGVvQ2xpcCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19zZXRfdm9sdW1lJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWaWRlb0NsaXBWb2x1bWUoeyB2b2x1bWU6IG1lc3NhZ2Uudm9sdW1lIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19zZXRfZml0JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWaWRlb0NsaXBGaXQoeyBmaXQ6IG1lc3NhZ2UuZml0IH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE9uIGNvbm5lY3Rpb24sIHNlbmQgdGhlIGN1cnJlbnQgcGxheWluZyBzdGF0ZSBvZiBhbGwgY2xpcHNcbiAgICAgICAgLy8gKFVzdWFsbHkgZW1wdHkgdW5sZXNzIHdlYnNvY2tldCBpcyByZWNvbm5lY3RpbmcpXG4gICAgICAgIGNvbnN0IHNlbmRJbml0aWFsQ2xpcFN0YXRlcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gT2JqZWN0LmVudHJpZXModGhpcy52aWRlb0NsaXBQbGF5ZXJzKS5tYXAoKFtmaWxlLCBwbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gIXBsYXllci52aWRlb0VsZW1lbnQucGF1c2VkXG4gICAgICAgICAgICAgICAgICAgID8gJ3BsYXlpbmcnXG4gICAgICAgICAgICAgICAgICAgIDogcGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9PT0gMCB8fCBwbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID09PSBwbGF5ZXIudmlkZW9FbGVtZW50LmR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdwYXVzZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdzdG9wcGVkJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2ZpbGUsIHN0YXR1c107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvZ3NDb25uZWN0aW9uLnNlbmRJbml0aWFsTWVkaWFDbGlwU3RhdGVzKHsgbWVkaWFUeXBlOiAndmlkZW8nLCBmaWxlcyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHNlbmRJbml0aWFsQ2xpcFN0YXRlcyk7XG4gICAgICAgIHNlbmRJbml0aWFsQ2xpcFN0YXRlcygpO1xuICAgIH1cbiAgICBzZXRQYXJlbnRFbGVtZW50KHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpLmZvckVhY2goKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2xpcFBsYXllci52aWRlb0VsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzZXRQYXJlbnRFbGVtZW50KCkge1xuICAgICAgICB0aGlzLnNldFBhcmVudEVsZW1lbnQoREVGQVVMVF9QQVJFTlRfRUxFTUVOVCk7XG4gICAgfVxuICAgIHNldEdsb2JhbFZvbHVtZShnbG9iYWxWb2x1bWUpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpLmZvckVhY2goKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHNldFZpZGVvRWxlbWVudFZvbHVtZShjbGlwUGxheWVyLnZpZGVvRWxlbWVudCwgY2xpcFBsYXllci52b2x1bWUgKiBnbG9iYWxWb2x1bWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nbG9iYWxWb2x1bWUgPSBnbG9iYWxWb2x1bWU7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgcGxheVZpZGVvQ2xpcChwYXRoLCB7IHBsYXlJZCwgdm9sdW1lLCBsb29wLCBmaXQgfSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLmNyZWF0ZUNsaXBQbGF5ZXIocGF0aCwgeyBwcmVsb2FkOiAnbm9uZScsIGVwaGVtZXJhbDogdHJ1ZSwgZml0IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYWxyZWFkeSBhIHBlbmRpbmcgY2xpcCwgd2hpY2ggaGFzIG5vdyBiZWVuIHN1cGVyc2VkZWQgYW5kIGFib3J0IHRoZSBwbGF5IG9wZXJhdGlvblxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIodGhpcy5wZW5kaW5nQ2xpcC5wYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LmxvYWQoKTsgLy8gUmVzZXRzIHRoZSBtZWRpYSBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZXcgcGVuZGluZyBjbGlwIGlzIHZpZGVvIGJlaW5nIHJlcXVlc3RlZFxuICAgICAgICBpZiAoKChfYSA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpICE9PSBwYXRoKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0geyBwYXRoLCBwbGF5SWQsIGFjdGlvbk9uY2VQbGF5aW5nOiAncGxheScgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXR1cCBhbmQgcGxheSB0aGUgcGVuZGluZyBjbGlwJ3MgcGxheWVyXG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZvbHVtZSA9IHZvbHVtZTtcbiAgICAgICAgICAgIHNldFZpZGVvRWxlbWVudFZvbHVtZShjbGlwUGxheWVyLnZpZGVvRWxlbWVudCwgdm9sdW1lICogdGhpcy5nbG9iYWxWb2x1bWUpO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQubG9vcCA9IGxvb3A7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7XG4gICAgICAgICAgICBpZiAoY2xpcFBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPT09IGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LmR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQucGxheSgpO1xuICAgICAgICAgICAgLy8gRGlzcGxheSByaWdodCBhd2F5IGlmIHRoZXJlJ3MgY3VycmVudGx5IG5vIGFjdGl2ZSBjbGlwXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZlQ2xpcCkge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXVzZVZpZGVvQ2xpcCgpIHtcbiAgICAgICAgLy8gUGVuZGluZyBjbGlwIHNob3VsZCBiZSBwYXVzZWQgd2hlbiBpdCBsb2FkcyBhbmQgYmVjb21lcyBhY3RpdmVcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAuYWN0aW9uT25jZVBsYXlpbmcgPSAncGF1c2UnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhdXNlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNsaXBcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2xpcCkge1xuICAgICAgICAgICAgY29uc3QgeyBwbGF5SWQsIHBhdGggfSA9IHRoaXMuYWN0aXZlQ2xpcDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIChfYSA9IGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF1c2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcFZpZGVvQ2xpcCgpIHtcbiAgICAgICAgLy8gUGVuZGluZyBjbGlwIHNob3VsZCBiZSBzdG9wcGVkIHdoZW4gaXQgbG9hZHMgYW5kIGJlY29tZXMgYWN0aXZlXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwLmFjdGlvbk9uY2VQbGF5aW5nID0gJ3N0b3AnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0b3AgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2xpcFxuICAgICAgICBpZiAodGhpcy5hY3RpdmVDbGlwKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHRoaXMuYWN0aXZlQ2xpcC5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRWaWRlb0NsaXBWb2x1bWUoeyB2b2x1bWUgfSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHBlbmRpbmcgY2xpcCwgdGhpcyBpcyBsYXRlc3QgdG8gaGF2ZSBiZWVuIHBsYXllZCBzbyB1cGRhdGUgaXRzIHZvbHVtZVxuICAgICAgICBjb25zdCBjbGlwVG9VcGRhdGUgPSAoX2IgPSAoX2EgPSB0aGlzLnBlbmRpbmdDbGlwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmFjdGl2ZUNsaXApICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFjbGlwVG9VcGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgPD0gMSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2b2x1bWUnLCB2b2x1bWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKGNsaXBUb1VwZGF0ZS5wYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52b2x1bWUgPSB2b2x1bWU7XG4gICAgICAgICAgICAgICAgc2V0VmlkZW9FbGVtZW50Vm9sdW1lKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LCB2b2x1bWUgKiB0aGlzLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldFZpZGVvQ2xpcEZpdCh7IGZpdCB9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGVuZGluZyBjbGlwLCB0aGlzIGlzIGxhdGVzdCB0byBoYXZlIGJlZW4gcGxheWVkIHNvIHVwZGF0ZSBpdHMgZml0XG4gICAgICAgIGNvbnN0IGNsaXBUb1VwZGF0ZSA9IChfYiA9IChfYSA9IHRoaXMucGVuZGluZ0NsaXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuYWN0aXZlQ2xpcCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWNsaXBUb1VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKGNsaXBUb1VwZGF0ZS5wYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuc3R5bGUub2JqZWN0Rml0ID0gZml0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVTdG9wcGVkQ2xpcChwYXRoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZUNsaXAgfHwgdGhpcy5hY3RpdmVDbGlwLnBhdGggIT09IHBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbGF5SWQgPSB0aGlzLmFjdGl2ZUNsaXAucGxheUlkO1xuICAgICAgICAvLyBPbmNlIGFuIGVwaGVtZXJhbCBjbGlwIHN0b3BzLCBjbGVhbnVwIGFuZCByZW1vdmUgdGhlIHBsYXllclxuICAgICAgICBpZiAoKF9hID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbmZpZy5lcGhlbWVyYWwpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkQ2xpcChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZUNsaXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAnc3RvcHBlZCcpO1xuICAgIH1cbiAgICB1cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgdXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BsYXllciA9IHVwZGF0ZSh0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pO1xuICAgICAgICAgICAgaWYgKG5ld1BsYXllcikge1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSA9IG5ld1BsYXllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0QXVkaW9TaW5rKHNpbmtJZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNsaXBQbGF5ZXIgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpKSB7XG4gICAgICAgICAgICBzZXRQbGF5ZXJTaW5rSWQoY2xpcFBsYXllciwgc2lua0lkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNpbmtJZCA9IHNpbmtJZDtcbiAgICB9XG4gICAgdXBkYXRlQ29uZmlnKG5ld1BhdGhzKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZpZGVvUGF0aHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobmV3UGF0aHMpLmZpbHRlcigoWywgeyB0eXBlIH1dKSA9PiB0eXBlID09PSAndmlkZW8nIHx8ICF0eXBlKSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ2xpcFBsYXllcnMgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnM7XG4gICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVycyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbGlwUGxheWVycyA9IHsgLi4ucHJldmlvdXNDbGlwUGxheWVycyB9O1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZENsaXBzID0gT2JqZWN0LmtleXMocHJldmlvdXNDbGlwUGxheWVycykuZmlsdGVyKChwcmV2aW91c1BhdGgpID0+ICEocHJldmlvdXNQYXRoIGluIG5ld1ZpZGVvUGF0aHMpKTtcbiAgICAgICAgICAgIHJlbW92ZWRDbGlwcy5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICBpZiAoKChfYSA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpID09PSBwYXRoICYmICgoX2IgPSBwcmV2aW91c0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY29uZmlnLmVwaGVtZXJhbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChwbGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5jb25maWcgPSB7IC4uLnBsYXllci5jb25maWcsIGVwaGVtZXJhbDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVubG9hZENsaXAocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjbGlwUGxheWVyc1twYXRoXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkQ2xpcHMgPSBPYmplY3QuZW50cmllcyhuZXdWaWRlb1BhdGhzKS5maWx0ZXIoKFtuZXdGaWxlXSkgPT4gIXByZXZpb3VzQ2xpcFBsYXllcnNbbmV3RmlsZV0pO1xuICAgICAgICAgICAgYWRkZWRDbGlwcy5mb3JFYWNoKChbcGF0aCwgY29uZmlnXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXJzW3BhdGhdID0gdGhpcy5jcmVhdGVDbGlwUGxheWVyKHBhdGgsIHsgLi4uY29uZmlnLCBwcmVsb2FkOiBwcmVsb2FkU3RyaW5nKGNvbmZpZy5wcmVsb2FkKSwgZXBoZW1lcmFsOiBmYWxzZSwgZml0OiAnY29udGFpbicgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRDbGlwcyA9IE9iamVjdC5lbnRyaWVzKHByZXZpb3VzQ2xpcFBsYXllcnMpLmZpbHRlcigoW3ByZXZpb3VzUGF0aF0pID0+IHByZXZpb3VzUGF0aCBpbiBuZXdWaWRlb1BhdGhzKTtcbiAgICAgICAgICAgIHVwZGF0ZWRDbGlwcy5mb3JFYWNoKChbcGF0aCwgcHJldmlvdXNDbGlwUGxheWVyXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0NsaXBQbGF5ZXIuY29uZmlnLnByZWxvYWQgIT09IG5ld1ZpZGVvUGF0aHNbcGF0aF0ucHJlbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCAocGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuY29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBsYXllci5jb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZDogcHJlbG9hZFN0cmluZyhuZXdWaWRlb1BhdGhzW3BhdGhdLnByZWxvYWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwaGVtZXJhbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLnZpZGVvRWxlbWVudC5wcmVsb2FkID0gcGxheWVyLmNvbmZpZy5wcmVsb2FkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcnM7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgbm90aWZ5U3RhdGVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgY29uc3QgVmlkZW9TdGF0ZSA9IHtcbiAgICAgICAgICAgIGdsb2JhbFZvbHVtZTogdGhpcy5nbG9iYWxWb2x1bWUsXG4gICAgICAgICAgICBpc1BsYXlpbmc6IHRoaXMuYWN0aXZlQ2xpcCA/ICEoKF9hID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXVzZWQpIDogZmFsc2UsXG4gICAgICAgICAgICBjbGlwczogeyAuLi50aGlzLnZpZGVvQ2xpcFBsYXllcnMgfSxcbiAgICAgICAgICAgIGFjdGl2ZUNsaXA6IHRoaXMuYWN0aXZlQ2xpcFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLmFjdGl2ZUNsaXAucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6ICEoKF9iID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXVzZWQpID8gVmlkZW9TdGF0ZV8xLkFjdGl2ZVZpZGVvQ2xpcFN0YXRlLlBsYXlpbmcgOiBWaWRlb1N0YXRlXzEuQWN0aXZlVmlkZW9DbGlwU3RhdGUuUGF1c2VkLFxuICAgICAgICAgICAgICAgICAgICBsb29wOiAoX2QgPSAoX2MgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxvb3ApICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWU6ICgoX2UgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLm11dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChfZyA9IChfZiA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1t0aGlzLmFjdGl2ZUNsaXAucGF0aF0udmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Yudm9sdW1lKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAwLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdzdGF0ZScsIFZpZGVvU3RhdGUpO1xuICAgIH1cbiAgICBub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBmaWxlLCBzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCd2aWRlb0NsaXBTdGF0ZScsIHsgcGxheUlkLCBtZWRpYVR5cGU6ICd2aWRlbycsIGZpbGUsIHN0YXR1cyB9KTtcbiAgICB9XG4gICAgLy8gVHlwZS1zYWZlIHdyYXBwZXIgYXJvdW5kIEV2ZW50VGFyZ2V0XG4gICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGRpc3BhdGNoRXZlbnQodHlwZSwgZGV0YWlsKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQodHlwZSwgeyBkZXRhaWwgfSkpO1xuICAgIH1cbiAgICBjcmVhdGVWaWRlb0VsZW1lbnQocGF0aCwgY29uZmlnLCB7IHZvbHVtZSB9KSB7XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5wbGF5c0lubGluZSA9IHRydWU7IC8vIFJlcXVpcmVkIGZvciBpT1NcbiAgICAgICAgdmlkZW9FbGVtZW50LnNyYyA9IHRoaXMuY29nc0Nvbm5lY3Rpb24uZ2V0QXNzZXRVcmwocGF0aCk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5hdXRvcGxheSA9IGZhbHNlO1xuICAgICAgICB2aWRlb0VsZW1lbnQubG9vcCA9IGZhbHNlO1xuICAgICAgICBzZXRWaWRlb0VsZW1lbnRWb2x1bWUodmlkZW9FbGVtZW50LCB2b2x1bWUgKiB0aGlzLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5wcmVsb2FkID0gY29uZmlnLnByZWxvYWQ7XG4gICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjbGlwIGlzIHN0aWxsIHRoZSBwZW5kaW5nIG9uZSB3aGVuIGl0IGFjdHVhbGx5IHN0YXJ0IHBsYXlpbmcsIHRoZW4gZW5zdXJlIGl0IGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlXG4gICAgICAgICAgICBpZiAoKChfYSA9IHRoaXMucGVuZGluZ0NsaXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXRoKSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5wZW5kaW5nQ2xpcC5hY3Rpb25PbmNlUGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwbGF5Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgcGxheWluZywgc2hvdyB0aGUgdmlkZW8gZWxlbWVudCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHRoaXMucGVuZGluZ0NsaXAucGxheUlkLCBwYXRoLCAncGxheWluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGF1c2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBwbGF5YmFjaywgc2hvdyB0aGUgdmlkZW8gZWxlbWVudCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnModGhpcy5wZW5kaW5nQ2xpcC5wbGF5SWQsIHBhdGgsICdwYXVzZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0b3AnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBwbGF5YmFjaywgbGVhdmUgdGhlIHZpZGVvIGVsZW1lbnQgaGlkZGVuLCBhbmQgbm90aWZ5IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyh0aGlzLnBlbmRpbmdDbGlwLnBsYXlJZCwgcGF0aCwgJ3N0b3BwZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIHByZXZpb3VzbHkgYWN0aXZlIGNsaXAsIHRoZW4gc3RvcCBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNsaXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcCh0aGlzLmFjdGl2ZUNsaXAucGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2xpcCA9IHRoaXMucGVuZGluZ0NsaXA7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCgoX2IgPSB0aGlzLmFjdGl2ZUNsaXApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXRoKSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgdGhlIGFjdGl2ZSBjbGlwIHRoZW4ganVzdCBub3RpZnkgbGlzdGVuZXJzIHRoYXQgd2UgYXJlIG5vdyBwbGF5aW5nXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnModGhpcy5hY3RpdmVDbGlwLnBsYXlJZCwgcGF0aCwgJ3BsYXlpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdCBzaG91bGRuJ3QgYmUgcGxheWluZywgbGlrZSBiZWNhdXNlIGFub3RoZXIgY2xpcCBiZWNhbWUgcGVuZGluZyBiZWZvcmUgd2UgbG9hZGVkLFxuICAgICAgICAgICAgICAgIC8vIHNvIHdlIHBhdXNlIGFuZCBkb24ndCBzaG93IG9yIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBpZiB0aGVyZSdzIGEgcGVuZGluZyBjbGlwLCBhcyBvbmNlIHRoYXQgc3RhcnRzIHBsYXlpbmcgdGhlIGFjdGl2ZSBjbGlwIHdpbGwgYmUgc3RvcHBlZFxuICAgICAgICAgICAgLy8gQWxzbyBpZ25vcmUgaWYgdGhlIHZpZGVvIGlzIHNldCB0byBsb29wXG4gICAgICAgICAgICBpZiAoIXRoaXMucGVuZGluZ0NsaXAgJiYgIXZpZGVvRWxlbWVudC5sb29wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS50b3AgPSAnMCc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5vYmplY3RGaXQgPSBjb25maWcuZml0O1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHZpZGVvRWxlbWVudCk7XG4gICAgICAgIHJldHVybiB2aWRlb0VsZW1lbnQ7XG4gICAgfVxuICAgIGNyZWF0ZUNsaXBQbGF5ZXIocGF0aCwgY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHZvbHVtZSA9IDE7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudDogdGhpcy5jcmVhdGVWaWRlb0VsZW1lbnQocGF0aCwgY29uZmlnLCB7IHZvbHVtZSB9KSxcbiAgICAgICAgICAgIHZvbHVtZSxcbiAgICAgICAgfTtcbiAgICAgICAgc2V0UGxheWVyU2lua0lkKHBsYXllciwgdGhpcy5zaW5rSWQpO1xuICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgIH1cbiAgICB1bmxvYWRDbGlwKHBhdGgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLmFjdGl2ZUNsaXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXRoKSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgY29uc3QgcGxheUlkID0gdGhpcy5hY3RpdmVDbGlwLnBsYXlJZDtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2xpcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgcGF0aCwgJ3N0b3BwZWQnKTtcbiAgICAgICAgfVxuICAgICAgICAoX2IgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi52aWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsICgpID0+IG51bGwpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFZpZGVvUGxheWVyO1xuZnVuY3Rpb24gcHJlbG9hZFN0cmluZyhwcmVsb2FkKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcmVsb2FkID09PSAnc3RyaW5nJyA/IHByZWxvYWQgOiBwcmVsb2FkID8gJ2F1dG8nIDogJ25vbmUnO1xufVxuZnVuY3Rpb24gc2V0UGxheWVyU2lua0lkKHBsYXllciwgc2lua0lkKSB7XG4gICAgaWYgKHNpbmtJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwbGF5ZXIudmlkZW9FbGVtZW50LnNldFNpbmtJZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwbGF5ZXIudmlkZW9FbGVtZW50LnNldFNpbmtJZChzaW5rSWQpO1xuICAgIH1cbn1cbi8qKlxuICogU2V0IHZpZGVvIHZvbHVtZVxuICpcbiAqIFRoaXMgZG9lc24ndCB3b3JrIG9uIGlPUyAodm9sdW1lIGlzIHJlYWQtb25seSkgc28gYXQgbGVhc3QgbXV0ZSBpdCBpZiB0aGUgdm9sdW1lIGlzIHplcm9cbiAqL1xuZnVuY3Rpb24gc2V0VmlkZW9FbGVtZW50Vm9sdW1lKHZpZGVvRWxlbWVudCwgdm9sdW1lKSB7XG4gICAgdmlkZW9FbGVtZW50LnZvbHVtZSA9IHZvbHVtZTtcbiAgICB2aWRlb0VsZW1lbnQubXV0ZWQgPSB2b2x1bWUgPT09IDA7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHJlbG9hZFVybCA9IGV4cG9ydHMuYXNzZXRVcmwgPSBleHBvcnRzLkNPR1NfU0VSVkVSX1BPUlQgPSBleHBvcnRzLkNPR1NfQVNTRVRTX1NFUlZFUl9QT1JUID0gdm9pZCAwO1xuZXhwb3J0cy5DT0dTX0FTU0VUU19TRVJWRVJfUE9SVCA9IDEyMDk0O1xuZXhwb3J0cy5DT0dTX1NFUlZFUl9QT1JUID0gMTIwOTU7XG5mdW5jdGlvbiBhc3NldFVybChmaWxlLCB1c2VIdHRwMkFzc2V0c1NlcnZlcikge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubG9jYXRpb24gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGF0aCA9IGAvYXNzZXRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGUpfWA7XG4gICAgaWYgKHVzZUh0dHAyQXNzZXRzU2VydmVyKSB7XG4gICAgICAgIHJldHVybiBgaHR0cHM6Ly8ke2xvY2F0aW9uID09PSBudWxsIHx8IGxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhdGlvbi5ob3N0bmFtZX06JHtleHBvcnRzLkNPR1NfQVNTRVRTX1NFUlZFUl9QT1JUfSR7cGF0aH1gO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2xvY2F0aW9uID09PSBudWxsIHx8IGxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhdGlvbi5wcm90b2NvbH0vLyR7bG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2F0aW9uLmhvc3RuYW1lfToke2V4cG9ydHMuQ09HU19TRVJWRVJfUE9SVH0ke3BhdGh9YDtcbiAgICB9XG59XG5leHBvcnRzLmFzc2V0VXJsID0gYXNzZXRVcmw7XG5hc3luYyBmdW5jdGlvbiBwcmVsb2FkVXJsKHVybCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAvLyBXZSB1c2VkIGFycmF5QnVmZmVyKClgIGluc3RlYWQgb2YgYGJsb2IoKWAgYmVjYXVzZSB0aGUgbGF0dGVyIHNlZW1zIHRvIGZhaWwgb24gUGlzIHdoZW4gcHJlbG9hZGluZyBzb21lIGZpbGVzXG4gICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2F3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCldKSk7XG59XG5leHBvcnRzLnByZWxvYWRVcmwgPSBwcmVsb2FkVXJsO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1hbmlmZXN0VHlwZXMgPSBleHBvcnRzLnByZWxvYWRVcmwgPSBleHBvcnRzLmFzc2V0VXJsID0gZXhwb3J0cy5Db2dzVmlkZW9QbGF5ZXIgPSBleHBvcnRzLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURSA9IGV4cG9ydHMuQ29nc1J0c3BTdHJlYW1lciA9IGV4cG9ydHMuQ29nc0F1ZGlvUGxheWVyID0gZXhwb3J0cy5TaG93UGhhc2UgPSBleHBvcnRzLkNvZ3NDb25uZWN0aW9uID0gdm9pZCAwO1xudmFyIENvZ3NDb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9Db2dzQ29ubmVjdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZ3NDb25uZWN0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2ltcG9ydERlZmF1bHQoQ29nc0Nvbm5lY3Rpb25fMSkuZGVmYXVsdDsgfSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9Db2dzQ29ubmVjdGlvblwiKSwgZXhwb3J0cyk7XG52YXIgU2hvd1BoYXNlXzEgPSByZXF1aXJlKFwiLi90eXBlcy9TaG93UGhhc2VcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTaG93UGhhc2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChTaG93UGhhc2VfMSkuZGVmYXVsdDsgfSB9KTtcbnZhciBBdWRpb1BsYXllcl8xID0gcmVxdWlyZShcIi4vQXVkaW9QbGF5ZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2dzQXVkaW9QbGF5ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChBdWRpb1BsYXllcl8xKS5kZWZhdWx0OyB9IH0pO1xudmFyIFJ0c3BTdHJlYW1lcl8xID0gcmVxdWlyZShcIi4vUnRzcFN0cmVhbWVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29nc1J0c3BTdHJlYW1lclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gX19pbXBvcnREZWZhdWx0KFJ0c3BTdHJlYW1lcl8xKS5kZWZhdWx0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTElWRV9WSURFT19QTEFZQkFDS19SQVRFXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBSdHNwU3RyZWFtZXJfMS5MSVZFX1ZJREVPX1BMQVlCQUNLX1JBVEU7IH0gfSk7XG52YXIgVmlkZW9QbGF5ZXJfMSA9IHJlcXVpcmUoXCIuL1ZpZGVvUGxheWVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29nc1ZpZGVvUGxheWVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2ltcG9ydERlZmF1bHQoVmlkZW9QbGF5ZXJfMSkuZGVmYXVsdDsgfSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90eXBlcy9BdWRpb1N0YXRlXCIpLCBleHBvcnRzKTtcbnZhciB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJhc3NldFVybFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdXJsc18xLmFzc2V0VXJsOyB9IH0pO1xudmFyIHVybHNfMiA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvdXJsc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInByZWxvYWRVcmxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVybHNfMi5wcmVsb2FkVXJsOyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3R5cGVzL0NvZ3NQbHVnaW5NYW5pZmVzdFwiKSwgZXhwb3J0cyk7XG5leHBvcnRzLk1hbmlmZXN0VHlwZXMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vdHlwZXMvTWFuaWZlc3RUeXBlc1wiKSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFNob3dQaGFzZTtcbihmdW5jdGlvbiAoU2hvd1BoYXNlKSB7XG4gICAgU2hvd1BoYXNlW1wiU2V0dXBcIl0gPSBcInNldHVwXCI7XG4gICAgU2hvd1BoYXNlW1wiUHJlc2hvd1wiXSA9IFwicHJlLXNob3dcIjtcbiAgICBTaG93UGhhc2VbXCJJblByb2dyZXNzXCJdID0gXCJpbiBwcm9ncmVzc1wiO1xuICAgIFNob3dQaGFzZVtcIkZpbmlzaGVkXCJdID0gXCJmaW5pc2hlZFwiO1xufSkoU2hvd1BoYXNlIHx8IChTaG93UGhhc2UgPSB7fSkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gU2hvd1BoYXNlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFjdGl2ZVZpZGVvQ2xpcFN0YXRlID0gdm9pZCAwO1xudmFyIEFjdGl2ZVZpZGVvQ2xpcFN0YXRlO1xuKGZ1bmN0aW9uIChBY3RpdmVWaWRlb0NsaXBTdGF0ZSkge1xuICAgIEFjdGl2ZVZpZGVvQ2xpcFN0YXRlW1wiUGF1c2VkXCJdID0gXCJwYXVzZWRcIjtcbiAgICBBY3RpdmVWaWRlb0NsaXBTdGF0ZVtcIlBsYXlpbmdcIl0gPSBcInBsYXlpbmdcIjtcbn0pKEFjdGl2ZVZpZGVvQ2xpcFN0YXRlIHx8IChleHBvcnRzLkFjdGl2ZVZpZGVvQ2xpcFN0YXRlID0gQWN0aXZlVmlkZW9DbGlwU3RhdGUgPSB7fSkpO1xuIiwidmFyIGZhPU9iamVjdC5jcmVhdGU7dmFyIEZ0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgY2E9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgbGE9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIGRhPU9iamVjdC5nZXRQcm90b3R5cGVPZixwYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBoYT0ocixlKT0+KCk9PihyJiYoZT1yKHI9MCkpLGUpO3ZhciBTPShyLGUpPT4oKT0+KGV8fHIoKGU9e2V4cG9ydHM6e319KS5leHBvcnRzLGUpLGUuZXhwb3J0cyksUHQ9KHIsZSk9Pntmb3IodmFyIHQgaW4gZSlGdChyLHQse2dldDplW3RdLGVudW1lcmFibGU6ITB9KX0sc2k9KHIsZSx0LG4pPT57aWYoZSYmdHlwZW9mIGU9PVwib2JqZWN0XCJ8fHR5cGVvZiBlPT1cImZ1bmN0aW9uXCIpZm9yKGxldCBpIG9mIGxhKGUpKSFwYS5jYWxsKHIsaSkmJmkhPT10JiZGdChyLGkse2dldDooKT0+ZVtpXSxlbnVtZXJhYmxlOiEobj1jYShlLGkpKXx8bi5lbnVtZXJhYmxlfSk7cmV0dXJuIHJ9O3ZhciBDPShyLGUsdCk9Pih0PXIhPW51bGw/ZmEoZGEocikpOnt9LHNpKGV8fCFyfHwhci5fX2VzTW9kdWxlP0Z0KHQsXCJkZWZhdWx0XCIse3ZhbHVlOnIsZW51bWVyYWJsZTohMH0pOnQscikpLG1hPXI9PnNpKEZ0KHt9LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHIpO3ZhciBmaT1TKGt0PT57XCJ1c2Ugc3RyaWN0XCI7YygpO2t0LmJ5dGVMZW5ndGg9eWE7a3QudG9CeXRlQXJyYXk9eGE7a3QuZnJvbUJ5dGVBcnJheT12YTt2YXIgbmU9W10sSz1bXSxnYT10eXBlb2YgVWludDhBcnJheTxcInVcIj9VaW50OEFycmF5OkFycmF5LFZyPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO2ZvcihGZT0wLGFpPVZyLmxlbmd0aDtGZTxhaTsrK0ZlKW5lW0ZlXT1WcltGZV0sS1tWci5jaGFyQ29kZUF0KEZlKV09RmU7dmFyIEZlLGFpO0tbXCItXCIuY2hhckNvZGVBdCgwKV09NjI7S1tcIl9cIi5jaGFyQ29kZUF0KDApXT02MztmdW5jdGlvbiB1aShyKXt2YXIgZT1yLmxlbmd0aDtpZihlJTQ+MCl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0XCIpO3ZhciB0PXIuaW5kZXhPZihcIj1cIik7dD09PS0xJiYodD1lKTt2YXIgbj10PT09ZT8wOjQtdCU0O3JldHVyblt0LG5dfWZ1bmN0aW9uIHlhKHIpe3ZhciBlPXVpKHIpLHQ9ZVswXSxuPWVbMV07cmV0dXJuKHQrbikqMy80LW59ZnVuY3Rpb24gYmEocixlLHQpe3JldHVybihlK3QpKjMvNC10fWZ1bmN0aW9uIHhhKHIpe3ZhciBlLHQ9dWkociksbj10WzBdLGk9dFsxXSxvPW5ldyBnYShiYShyLG4saSkpLHM9MCxhPWk+MD9uLTQ6bix1O2Zvcih1PTA7dTxhO3UrPTQpZT1LW3IuY2hhckNvZGVBdCh1KV08PDE4fEtbci5jaGFyQ29kZUF0KHUrMSldPDwxMnxLW3IuY2hhckNvZGVBdCh1KzIpXTw8NnxLW3IuY2hhckNvZGVBdCh1KzMpXSxvW3MrK109ZT4+MTYmMjU1LG9bcysrXT1lPj44JjI1NSxvW3MrK109ZSYyNTU7cmV0dXJuIGk9PT0yJiYoZT1LW3IuY2hhckNvZGVBdCh1KV08PDJ8S1tyLmNoYXJDb2RlQXQodSsxKV0+PjQsb1tzKytdPWUmMjU1KSxpPT09MSYmKGU9S1tyLmNoYXJDb2RlQXQodSldPDwxMHxLW3IuY2hhckNvZGVBdCh1KzEpXTw8NHxLW3IuY2hhckNvZGVBdCh1KzIpXT4+MixvW3MrK109ZT4+OCYyNTUsb1tzKytdPWUmMjU1KSxvfWZ1bmN0aW9uIF9hKHIpe3JldHVybiBuZVtyPj4xOCY2M10rbmVbcj4+MTImNjNdK25lW3I+PjYmNjNdK25lW3ImNjNdfWZ1bmN0aW9uIHdhKHIsZSx0KXtmb3IodmFyIG4saT1bXSxvPWU7bzx0O28rPTMpbj0ocltvXTw8MTYmMTY3MTE2ODApKyhyW28rMV08PDgmNjUyODApKyhyW28rMl0mMjU1KSxpLnB1c2goX2EobikpO3JldHVybiBpLmpvaW4oXCJcIil9ZnVuY3Rpb24gdmEocil7Zm9yKHZhciBlLHQ9ci5sZW5ndGgsbj10JTMsaT1bXSxvPTE2MzgzLHM9MCxhPXQtbjtzPGE7cys9bylpLnB1c2god2EocixzLHMrbz5hP2E6cytvKSk7cmV0dXJuIG49PT0xPyhlPXJbdC0xXSxpLnB1c2gobmVbZT4+Ml0rbmVbZTw8NCY2M10rXCI9PVwiKSk6bj09PTImJihlPShyW3QtMl08PDgpK3JbdC0xXSxpLnB1c2gobmVbZT4+MTBdK25lW2U+PjQmNjNdK25lW2U8PDImNjNdK1wiPVwiKSksaS5qb2luKFwiXCIpfX0pO3ZhciBjaT1TKHpyPT57YygpO3pyLnJlYWQ9ZnVuY3Rpb24ocixlLHQsbixpKXt2YXIgbyxzLGE9aSo4LW4tMSx1PSgxPDxhKS0xLGY9dT4+MSxsPS03LGQ9dD9pLTE6MCxoPXQ/LTE6MSxtPXJbZStkXTtmb3IoZCs9aCxvPW0mKDE8PC1sKS0xLG0+Pj0tbCxsKz1hO2w+MDtvPW8qMjU2K3JbZStkXSxkKz1oLGwtPTgpO2ZvcihzPW8mKDE8PC1sKS0xLG8+Pj0tbCxsKz1uO2w+MDtzPXMqMjU2K3JbZStkXSxkKz1oLGwtPTgpO2lmKG89PT0wKW89MS1mO2Vsc2V7aWYobz09PXUpcmV0dXJuIHM/TmFOOihtPy0xOjEpKigxLzApO3M9cytNYXRoLnBvdygyLG4pLG89by1mfXJldHVybihtPy0xOjEpKnMqTWF0aC5wb3coMixvLW4pfTt6ci53cml0ZT1mdW5jdGlvbihyLGUsdCxuLGksbyl7dmFyIHMsYSx1LGY9byo4LWktMSxsPSgxPDxmKS0xLGQ9bD4+MSxoPWk9PT0yMz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsbT1uPzA6by0xLGI9bj8xOi0xLHk9ZTwwfHxlPT09MCYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWwpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MikscytkPj0xP2UrPWgvdTplKz1oKk1hdGgucG93KDIsMS1kKSxlKnU+PTImJihzKyssdS89MikscytkPj1sPyhhPTAscz1sKTpzK2Q+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLGkpLHM9cytkKTooYT1lKk1hdGgucG93KDIsZC0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7clt0K21dPWEmMjU1LG0rPWIsYS89MjU2LGktPTgpO2ZvcihzPXM8PGl8YSxmKz1pO2Y+MDtyW3QrbV09cyYyNTUsbSs9YixzLz0yNTYsZi09OCk7clt0K20tYl18PXkqMTI4fX0pO3ZhciBYZT1TKEtlPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBZcj1maSgpLHplPWNpKCksbGk9dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZ0eXBlb2YgU3ltYm9sLmZvcj09XCJmdW5jdGlvblwiP1N5bWJvbC5mb3IoXCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbVwiKTpudWxsO0tlLkJ1ZmZlcj1wO0tlLlNsb3dCdWZmZXI9QmE7S2UuSU5TUEVDVF9NQVhfQllURVM9NTA7dmFyIE90PTIxNDc0ODM2NDc7S2Uua01heExlbmd0aD1PdDtwLlRZUEVEX0FSUkFZX1NVUFBPUlQ9RWEoKTshcC5UWVBFRF9BUlJBWV9TVVBQT1JUJiZ0eXBlb2YgY29uc29sZTxcInVcIiYmdHlwZW9mIGNvbnNvbGUuZXJyb3I9PVwiZnVuY3Rpb25cIiYmY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSBgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LlwiKTtmdW5jdGlvbiBFYSgpe3RyeXtsZXQgcj1uZXcgVWludDhBcnJheSgxKSxlPXtmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsVWludDhBcnJheS5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZihyLGUpLHIuZm9vKCk9PT00Mn1jYXRjaHtyZXR1cm4hMX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHAucHJvdG90eXBlLFwicGFyZW50XCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoISFwLmlzQnVmZmVyKHRoaXMpKXJldHVybiB0aGlzLmJ1ZmZlcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocC5wcm90b3R5cGUsXCJvZmZzZXRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZighIXAuaXNCdWZmZXIodGhpcykpcmV0dXJuIHRoaXMuYnl0ZU9mZnNldH19KTtmdW5jdGlvbiBkZShyKXtpZihyPk90KXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInK3IrJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpO2xldCBlPW5ldyBVaW50OEFycmF5KHIpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoZSxwLnByb3RvdHlwZSksZX1mdW5jdGlvbiBwKHIsZSx0KXtpZih0eXBlb2Ygcj09XCJudW1iZXJcIil7aWYodHlwZW9mIGU9PVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTtyZXR1cm4gUXIocil9cmV0dXJuIG1pKHIsZSx0KX1wLnBvb2xTaXplPTgxOTI7ZnVuY3Rpb24gbWkocixlLHQpe2lmKHR5cGVvZiByPT1cInN0cmluZ1wiKXJldHVybiBSYShyLGUpO2lmKEFycmF5QnVmZmVyLmlzVmlldyhyKSlyZXR1cm4gVGEocik7aWYocj09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgXCIrdHlwZW9mIHIpO2lmKGllKHIsQXJyYXlCdWZmZXIpfHxyJiZpZShyLmJ1ZmZlcixBcnJheUJ1ZmZlcil8fHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcjxcInVcIiYmKGllKHIsU2hhcmVkQXJyYXlCdWZmZXIpfHxyJiZpZShyLmJ1ZmZlcixTaGFyZWRBcnJheUJ1ZmZlcikpKXJldHVybiBYcihyLGUsdCk7aWYodHlwZW9mIHI9PVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTtsZXQgbj1yLnZhbHVlT2YmJnIudmFsdWVPZigpO2lmKG4hPW51bGwmJm4hPT1yKXJldHVybiBwLmZyb20obixlLHQpO2xldCBpPUNhKHIpO2lmKGkpcmV0dXJuIGk7aWYodHlwZW9mIFN5bWJvbDxcInVcIiYmU3ltYm9sLnRvUHJpbWl0aXZlIT1udWxsJiZ0eXBlb2YgcltTeW1ib2wudG9QcmltaXRpdmVdPT1cImZ1bmN0aW9uXCIpcmV0dXJuIHAuZnJvbShyW1N5bWJvbC50b1ByaW1pdGl2ZV0oXCJzdHJpbmdcIiksZSx0KTt0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgXCIrdHlwZW9mIHIpfXAuZnJvbT1mdW5jdGlvbihyLGUsdCl7cmV0dXJuIG1pKHIsZSx0KX07T2JqZWN0LnNldFByb3RvdHlwZU9mKHAucHJvdG90eXBlLFVpbnQ4QXJyYXkucHJvdG90eXBlKTtPYmplY3Quc2V0UHJvdG90eXBlT2YocCxVaW50OEFycmF5KTtmdW5jdGlvbiBnaShyKXtpZih0eXBlb2YgciE9XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInK3IrJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpfWZ1bmN0aW9uIFNhKHIsZSx0KXtyZXR1cm4gZ2kocikscjw9MD9kZShyKTplIT09dm9pZCAwP3R5cGVvZiB0PT1cInN0cmluZ1wiP2RlKHIpLmZpbGwoZSx0KTpkZShyKS5maWxsKGUpOmRlKHIpfXAuYWxsb2M9ZnVuY3Rpb24ocixlLHQpe3JldHVybiBTYShyLGUsdCl9O2Z1bmN0aW9uIFFyKHIpe3JldHVybiBnaShyKSxkZShyPDA/MDpacihyKXwwKX1wLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHIpe3JldHVybiBRcihyKX07cC5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24ocil7cmV0dXJuIFFyKHIpfTtmdW5jdGlvbiBSYShyLGUpe2lmKCh0eXBlb2YgZSE9XCJzdHJpbmdcInx8ZT09PVwiXCIpJiYoZT1cInV0ZjhcIiksIXAuaXNFbmNvZGluZyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrZSk7bGV0IHQ9eWkocixlKXwwLG49ZGUodCksaT1uLndyaXRlKHIsZSk7cmV0dXJuIGkhPT10JiYobj1uLnNsaWNlKDAsaSkpLG59ZnVuY3Rpb24gS3Iocil7bGV0IGU9ci5sZW5ndGg8MD8wOlpyKHIubGVuZ3RoKXwwLHQ9ZGUoZSk7Zm9yKGxldCBuPTA7bjxlO24rPTEpdFtuXT1yW25dJjI1NTtyZXR1cm4gdH1mdW5jdGlvbiBUYShyKXtpZihpZShyLFVpbnQ4QXJyYXkpKXtsZXQgZT1uZXcgVWludDhBcnJheShyKTtyZXR1cm4gWHIoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCl9cmV0dXJuIEtyKHIpfWZ1bmN0aW9uIFhyKHIsZSx0KXtpZihlPDB8fHIuYnl0ZUxlbmd0aDxlKXRocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO2lmKHIuYnl0ZUxlbmd0aDxlKyh0fHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtsZXQgbjtyZXR1cm4gZT09PXZvaWQgMCYmdD09PXZvaWQgMD9uPW5ldyBVaW50OEFycmF5KHIpOnQ9PT12b2lkIDA/bj1uZXcgVWludDhBcnJheShyLGUpOm49bmV3IFVpbnQ4QXJyYXkocixlLHQpLE9iamVjdC5zZXRQcm90b3R5cGVPZihuLHAucHJvdG90eXBlKSxufWZ1bmN0aW9uIENhKHIpe2lmKHAuaXNCdWZmZXIocikpe2xldCBlPVpyKHIubGVuZ3RoKXwwLHQ9ZGUoZSk7cmV0dXJuIHQubGVuZ3RoPT09MHx8ci5jb3B5KHQsMCwwLGUpLHR9aWYoci5sZW5ndGghPT12b2lkIDApcmV0dXJuIHR5cGVvZiByLmxlbmd0aCE9XCJudW1iZXJcInx8dG4oci5sZW5ndGgpP2RlKDApOktyKHIpO2lmKHIudHlwZT09PVwiQnVmZmVyXCImJkFycmF5LmlzQXJyYXkoci5kYXRhKSlyZXR1cm4gS3Ioci5kYXRhKX1mdW5jdGlvbiBacihyKXtpZihyPj1PdCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHhcIitPdC50b1N0cmluZygxNikrXCIgYnl0ZXNcIik7cmV0dXJuIHJ8MH1mdW5jdGlvbiBCYShyKXtyZXR1cm4rciE9ciYmKHI9MCkscC5hbGxvYygrcil9cC5pc0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gZSE9bnVsbCYmZS5faXNCdWZmZXI9PT0hMCYmZSE9PXAucHJvdG90eXBlfTtwLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZihpZShlLFVpbnQ4QXJyYXkpJiYoZT1wLmZyb20oZSxlLm9mZnNldCxlLmJ5dGVMZW5ndGgpKSxpZSh0LFVpbnQ4QXJyYXkpJiYodD1wLmZyb20odCx0Lm9mZnNldCx0LmJ5dGVMZW5ndGgpKSwhcC5pc0J1ZmZlcihlKXx8IXAuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheScpO2lmKGU9PT10KXJldHVybiAwO2xldCBuPWUubGVuZ3RoLGk9dC5sZW5ndGg7Zm9yKGxldCBvPTAscz1NYXRoLm1pbihuLGkpO288czsrK28paWYoZVtvXSE9PXRbb10pe249ZVtvXSxpPXRbb107YnJlYWt9cmV0dXJuIG48aT8tMTppPG4/MTowfTtwLmlzRW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpKXtjYXNlXCJoZXhcIjpjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpjYXNlXCJhc2NpaVwiOmNhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOmNhc2VcImJhc2U2NFwiOmNhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtwLmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKGUubGVuZ3RoPT09MClyZXR1cm4gcC5hbGxvYygwKTtsZXQgbjtpZih0PT09dm9pZCAwKWZvcih0PTAsbj0wO248ZS5sZW5ndGg7KytuKXQrPWVbbl0ubGVuZ3RoO2xldCBpPXAuYWxsb2NVbnNhZmUodCksbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe2xldCBzPWVbbl07aWYoaWUocyxVaW50OEFycmF5KSlvK3MubGVuZ3RoPmkubGVuZ3RoPyhwLmlzQnVmZmVyKHMpfHwocz1wLmZyb20ocykpLHMuY29weShpLG8pKTpVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChpLHMsbyk7ZWxzZSBpZihwLmlzQnVmZmVyKHMpKXMuY29weShpLG8pO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7bys9cy5sZW5ndGh9cmV0dXJuIGl9O2Z1bmN0aW9uIHlpKHIsZSl7aWYocC5pc0J1ZmZlcihyKSlyZXR1cm4gci5sZW5ndGg7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpfHxpZShyLEFycmF5QnVmZmVyKSlyZXR1cm4gci5ieXRlTGVuZ3RoO2lmKHR5cGVvZiByIT1cInN0cmluZ1wiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpO2xldCB0PXIubGVuZ3RoLG49YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl09PT0hMDtpZighbiYmdD09PTApcmV0dXJuIDA7bGV0IGk9ITE7Zm9yKDs7KXN3aXRjaChlKXtjYXNlXCJhc2NpaVwiOmNhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVybiB0O2Nhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOnJldHVybiBKcihyKS5sZW5ndGg7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIHQqMjtjYXNlXCJoZXhcIjpyZXR1cm4gdD4+PjE7Y2FzZVwiYmFzZTY0XCI6cmV0dXJuIFRpKHIpLmxlbmd0aDtkZWZhdWx0OmlmKGkpcmV0dXJuIG4/LTE6SnIocikubGVuZ3RoO2U9KFwiXCIrZSkudG9Mb3dlckNhc2UoKSxpPSEwfX1wLmJ5dGVMZW5ndGg9eWk7ZnVuY3Rpb24gTWEocixlLHQpe2xldCBuPSExO2lmKChlPT09dm9pZCAwfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RofHwoKHQ9PT12b2lkIDB8fHQ+dGhpcy5sZW5ndGgpJiYodD10aGlzLmxlbmd0aCksdDw9MCl8fCh0Pj4+PTAsZT4+Pj0wLHQ8PWUpKXJldHVyblwiXCI7Zm9yKHJ8fChyPVwidXRmOFwiKTs7KXN3aXRjaChyKXtjYXNlXCJoZXhcIjpyZXR1cm4gTmEodGhpcyxlLHQpO2Nhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOnJldHVybiB4aSh0aGlzLGUsdCk7Y2FzZVwiYXNjaWlcIjpyZXR1cm4gVWEodGhpcyxlLHQpO2Nhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVybiBEYSh0aGlzLGUsdCk7Y2FzZVwiYmFzZTY0XCI6cmV0dXJuIGthKHRoaXMsZSx0KTtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gSGEodGhpcyxlLHQpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrcik7cj0ocitcIlwiKS50b0xvd2VyQ2FzZSgpLG49ITB9fXAucHJvdG90eXBlLl9pc0J1ZmZlcj0hMDtmdW5jdGlvbiBQZShyLGUsdCl7bGV0IG49cltlXTtyW2VdPXJbdF0sclt0XT1ufXAucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe2xldCBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0c1wiKTtmb3IobGV0IHQ9MDt0PGU7dCs9MilQZSh0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5sZW5ndGg7aWYoZSU0IT09MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzXCIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kz00KVBlKHRoaXMsdCx0KzMpLFBlKHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe2xldCBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0c1wiKTtmb3IobGV0IHQ9MDt0PGU7dCs9OClQZSh0aGlzLHQsdCs3KSxQZSh0aGlzLHQrMSx0KzYpLFBlKHRoaXMsdCsyLHQrNSksUGUodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgZT10aGlzLmxlbmd0aDtyZXR1cm4gZT09PTA/XCJcIjphcmd1bWVudHMubGVuZ3RoPT09MD94aSh0aGlzLDAsZSk6TWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtwLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZz1wLnByb3RvdHlwZS50b1N0cmluZztwLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIXAuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXJcIik7cmV0dXJuIHRoaXM9PT1lPyEwOnAuY29tcGFyZSh0aGlzLGUpPT09MH07cC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe2xldCBlPVwiXCIsdD1LZS5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gZT10aGlzLnRvU3RyaW5nKFwiaGV4XCIsMCx0KS5yZXBsYWNlKC8oLnsyfSkvZyxcIiQxIFwiKS50cmltKCksdGhpcy5sZW5ndGg+dCYmKGUrPVwiIC4uLiBcIiksXCI8QnVmZmVyIFwiK2UrXCI+XCJ9O2xpJiYocC5wcm90b3R5cGVbbGldPXAucHJvdG90eXBlLmluc3BlY3QpO3AucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LG4saSxvKXtpZihpZShlLFVpbnQ4QXJyYXkpJiYoZT1wLmZyb20oZSxlLm9mZnNldCxlLmJ5dGVMZW5ndGgpKSwhcC5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIGUpO2lmKHQ9PT12b2lkIDAmJih0PTApLG49PT12b2lkIDAmJihuPWU/ZS5sZW5ndGg6MCksaT09PXZvaWQgMCYmKGk9MCksbz09PXZvaWQgMCYmKG89dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8aTwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwib3V0IG9mIHJhbmdlIGluZGV4XCIpO2lmKGk+PW8mJnQ+PW4pcmV0dXJuIDA7aWYoaT49bylyZXR1cm4tMTtpZih0Pj1uKXJldHVybiAxO2lmKHQ+Pj49MCxuPj4+PTAsaT4+Pj0wLG8+Pj49MCx0aGlzPT09ZSlyZXR1cm4gMDtsZXQgcz1vLWksYT1uLXQsdT1NYXRoLm1pbihzLGEpLGY9dGhpcy5zbGljZShpLG8pLGw9ZS5zbGljZSh0LG4pO2ZvcihsZXQgZD0wO2Q8dTsrK2QpaWYoZltkXSE9PWxbZF0pe3M9ZltkXSxhPWxbZF07YnJlYWt9cmV0dXJuIHM8YT8tMTphPHM/MTowfTtmdW5jdGlvbiBiaShyLGUsdCxuLGkpe2lmKHIubGVuZ3RoPT09MClyZXR1cm4tMTtpZih0eXBlb2YgdD09XCJzdHJpbmdcIj8obj10LHQ9MCk6dD4yMTQ3NDgzNjQ3P3Q9MjE0NzQ4MzY0Nzp0PC0yMTQ3NDgzNjQ4JiYodD0tMjE0NzQ4MzY0OCksdD0rdCx0bih0KSYmKHQ9aT8wOnIubGVuZ3RoLTEpLHQ8MCYmKHQ9ci5sZW5ndGgrdCksdD49ci5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7dD1yLmxlbmd0aC0xfWVsc2UgaWYodDwwKWlmKGkpdD0wO2Vsc2UgcmV0dXJuLTE7aWYodHlwZW9mIGU9PVwic3RyaW5nXCImJihlPXAuZnJvbShlLG4pKSxwLmlzQnVmZmVyKGUpKXJldHVybiBlLmxlbmd0aD09PTA/LTE6ZGkocixlLHQsbixpKTtpZih0eXBlb2YgZT09XCJudW1iZXJcIilyZXR1cm4gZT1lJjI1NSx0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj09XCJmdW5jdGlvblwiP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHIsZSx0KTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHIsZSx0KTpkaShyLFtlXSx0LG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlclwiKX1mdW5jdGlvbiBkaShyLGUsdCxuLGkpe2xldCBvPTEscz1yLmxlbmd0aCxhPWUubGVuZ3RoO2lmKG4hPT12b2lkIDAmJihuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpLG49PT1cInVjczJcInx8bj09PVwidWNzLTJcInx8bj09PVwidXRmMTZsZVwifHxuPT09XCJ1dGYtMTZsZVwiKSl7aWYoci5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTtvPTIscy89MixhLz0yLHQvPTJ9ZnVuY3Rpb24gdShsLGQpe3JldHVybiBvPT09MT9sW2RdOmwucmVhZFVJbnQxNkJFKGQqbyl9bGV0IGY7aWYoaSl7bGV0IGw9LTE7Zm9yKGY9dDtmPHM7ZisrKWlmKHUocixmKT09PXUoZSxsPT09LTE/MDpmLWwpKXtpZihsPT09LTEmJihsPWYpLGYtbCsxPT09YSlyZXR1cm4gbCpvfWVsc2UgbCE9PS0xJiYoZi09Zi1sKSxsPS0xfWVsc2UgZm9yKHQrYT5zJiYodD1zLWEpLGY9dDtmPj0wO2YtLSl7bGV0IGw9ITA7Zm9yKGxldCBkPTA7ZDxhO2QrKylpZih1KHIsZitkKSE9PXUoZSxkKSl7bD0hMTticmVha31pZihsKXJldHVybiBmfXJldHVybi0xfXAucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5pbmRleE9mKGUsdCxuKSE9PS0xfTtwLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYmkodGhpcyxlLHQsbiwhMCl9O3AucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYmkodGhpcyxlLHQsbiwhMSl9O2Z1bmN0aW9uIExhKHIsZSx0LG4pe3Q9TnVtYmVyKHQpfHwwO2xldCBpPXIubGVuZ3RoLXQ7bj8obj1OdW1iZXIobiksbj5pJiYobj1pKSk6bj1pO2xldCBvPWUubGVuZ3RoO24+by8yJiYobj1vLzIpO2xldCBzO2ZvcihzPTA7czxuOysrcyl7bGV0IGE9cGFyc2VJbnQoZS5zdWJzdHIocyoyLDIpLDE2KTtpZih0bihhKSlyZXR1cm4gcztyW3Qrc109YX1yZXR1cm4gc31mdW5jdGlvbiBJYShyLGUsdCxuKXtyZXR1cm4gVXQoSnIoZSxyLmxlbmd0aC10KSxyLHQsbil9ZnVuY3Rpb24gQWEocixlLHQsbil7cmV0dXJuIFV0KCRhKGUpLHIsdCxuKX1mdW5jdGlvbiBGYShyLGUsdCxuKXtyZXR1cm4gVXQoVGkoZSkscix0LG4pfWZ1bmN0aW9uIFBhKHIsZSx0LG4pe3JldHVybiBVdChHYShlLHIubGVuZ3RoLXQpLHIsdCxuKX1wLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixpKXtpZih0PT09dm9pZCAwKWk9XCJ1dGY4XCIsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZihuPT09dm9pZCAwJiZ0eXBlb2YgdD09XCJzdHJpbmdcIilpPXQsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZihpc0Zpbml0ZSh0KSl0PXQ+Pj4wLGlzRmluaXRlKG4pPyhuPW4+Pj4wLGk9PT12b2lkIDAmJihpPVwidXRmOFwiKSk6KGk9bixuPXZvaWQgMCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFwiKTtsZXQgbz10aGlzLmxlbmd0aC10O2lmKChuPT09dm9pZCAwfHxuPm8pJiYobj1vKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHNcIik7aXx8KGk9XCJ1dGY4XCIpO2xldCBzPSExO2Zvcig7Oylzd2l0Y2goaSl7Y2FzZVwiaGV4XCI6cmV0dXJuIExhKHRoaXMsZSx0LG4pO2Nhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOnJldHVybiBJYSh0aGlzLGUsdCxuKTtjYXNlXCJhc2NpaVwiOmNhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVybiBBYSh0aGlzLGUsdCxuKTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4gRmEodGhpcyxlLHQsbik7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIFBhKHRoaXMsZSx0LG4pO2RlZmF1bHQ6aWYocyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIraSk7aT0oXCJcIitpKS50b0xvd2VyQ2FzZSgpLHM9ITB9fTtwLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTpcIkJ1ZmZlclwiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24ga2EocixlLHQpe3JldHVybiBlPT09MCYmdD09PXIubGVuZ3RoP1lyLmZyb21CeXRlQXJyYXkocik6WXIuZnJvbUJ5dGVBcnJheShyLnNsaWNlKGUsdCkpfWZ1bmN0aW9uIHhpKHIsZSx0KXt0PU1hdGgubWluKHIubGVuZ3RoLHQpO2xldCBuPVtdLGk9ZTtmb3IoO2k8dDspe2xldCBvPXJbaV0scz1udWxsLGE9bz4yMzk/NDpvPjIyMz8zOm8+MTkxPzI6MTtpZihpK2E8PXQpe2xldCB1LGYsbCxkO3N3aXRjaChhKXtjYXNlIDE6bzwxMjgmJihzPW8pO2JyZWFrO2Nhc2UgMjp1PXJbaSsxXSwodSYxOTIpPT09MTI4JiYoZD0obyYzMSk8PDZ8dSY2MyxkPjEyNyYmKHM9ZCkpO2JyZWFrO2Nhc2UgMzp1PXJbaSsxXSxmPXJbaSsyXSwodSYxOTIpPT09MTI4JiYoZiYxOTIpPT09MTI4JiYoZD0obyYxNSk8PDEyfCh1JjYzKTw8NnxmJjYzLGQ+MjA0NyYmKGQ8NTUyOTZ8fGQ+NTczNDMpJiYocz1kKSk7YnJlYWs7Y2FzZSA0OnU9cltpKzFdLGY9cltpKzJdLGw9cltpKzNdLCh1JjE5Mik9PT0xMjgmJihmJjE5Mik9PT0xMjgmJihsJjE5Mik9PT0xMjgmJihkPShvJjE1KTw8MTh8KHUmNjMpPDwxMnwoZiY2Myk8PDZ8bCY2MyxkPjY1NTM1JiZkPDExMTQxMTImJihzPWQpKX19cz09PW51bGw/KHM9NjU1MzMsYT0xKTpzPjY1NTM1JiYocy09NjU1MzYsbi5wdXNoKHM+Pj4xMCYxMDIzfDU1Mjk2KSxzPTU2MzIwfHMmMTAyMyksbi5wdXNoKHMpLGkrPWF9cmV0dXJuIE9hKG4pfXZhciBwaT00MDk2O2Z1bmN0aW9uIE9hKHIpe2xldCBlPXIubGVuZ3RoO2lmKGU8PXBpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxyKTtsZXQgdD1cIlwiLG49MDtmb3IoO248ZTspdCs9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsci5zbGljZShuLG4rPXBpKSk7cmV0dXJuIHR9ZnVuY3Rpb24gVWEocixlLHQpe2xldCBuPVwiXCI7dD1NYXRoLm1pbihyLmxlbmd0aCx0KTtmb3IobGV0IGk9ZTtpPHQ7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSYxMjcpO3JldHVybiBufWZ1bmN0aW9uIERhKHIsZSx0KXtsZXQgbj1cIlwiO3Q9TWF0aC5taW4oci5sZW5ndGgsdCk7Zm9yKGxldCBpPWU7aTx0OysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0pO3JldHVybiBufWZ1bmN0aW9uIE5hKHIsZSx0KXtsZXQgbj1yLmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghdHx8dDwwfHx0Pm4pJiYodD1uKTtsZXQgaT1cIlwiO2ZvcihsZXQgbz1lO288dDsrK28paSs9VmFbcltvXV07cmV0dXJuIGl9ZnVuY3Rpb24gSGEocixlLHQpe2xldCBuPXIuc2xpY2UoZSx0KSxpPVwiXCI7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aC0xO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dK25bbysxXSoyNTYpO3JldHVybiBpfXAucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7bGV0IG49dGhpcy5sZW5ndGg7ZT1+fmUsdD10PT09dm9pZCAwP246fn50LGU8MD8oZSs9bixlPDAmJihlPTApKTplPm4mJihlPW4pLHQ8MD8odCs9bix0PDAmJih0PTApKTp0Pm4mJih0PW4pLHQ8ZSYmKHQ9ZSk7bGV0IGk9dGhpcy5zdWJhcnJheShlLHQpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoaSxwLnByb3RvdHlwZSksaX07ZnVuY3Rpb24gRChyLGUsdCl7aWYociUxIT09MHx8cjwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwib2Zmc2V0IGlzIG5vdCB1aW50XCIpO2lmKHIrZT50KXRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aFwiKX1wLnByb3RvdHlwZS5yZWFkVWludExFPXAucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2U9ZT4+PjAsdD10Pj4+MCxufHxEKGUsdCx0aGlzLmxlbmd0aCk7bGV0IGk9dGhpc1tlXSxvPTEscz0wO2Zvcig7KytzPHQmJihvKj0yNTYpOylpKz10aGlzW2Urc10qbztyZXR1cm4gaX07cC5wcm90b3R5cGUucmVhZFVpbnRCRT1wLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxuKXtlPWU+Pj4wLHQ9dD4+PjAsbnx8RChlLHQsdGhpcy5sZW5ndGgpO2xldCBpPXRoaXNbZSstLXRdLG89MTtmb3IoO3Q+MCYmKG8qPTI1Nik7KWkrPXRoaXNbZSstLXRdKm87cmV0dXJuIGl9O3AucHJvdG90eXBlLnJlYWRVaW50OD1wLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX07cC5wcm90b3R5cGUucmVhZFVpbnQxNkxFPXAucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH07cC5wcm90b3R5cGUucmVhZFVpbnQxNkJFPXAucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX07cC5wcm90b3R5cGUucmVhZFVpbnQzMkxFPXAucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrdGhpc1tlKzNdKjE2Nzc3MjE2fTtwLnByb3RvdHlwZS5yZWFkVWludDMyQkU9cC5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV0qMTY3NzcyMTYrKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9O3AucHJvdG90eXBlLnJlYWRCaWdVSW50NjRMRT1iZShmdW5jdGlvbihlKXtlPWU+Pj4wLFllKGUsXCJvZmZzZXRcIik7bGV0IHQ9dGhpc1tlXSxuPXRoaXNbZSs3XTsodD09PXZvaWQgMHx8bj09PXZvaWQgMCkmJnd0KGUsdGhpcy5sZW5ndGgtOCk7bGV0IGk9dCt0aGlzWysrZV0qMioqOCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjI0LG89dGhpc1srK2VdK3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSoyKioxNituKjIqKjI0O3JldHVybiBCaWdJbnQoaSkrKEJpZ0ludChvKTw8QmlnSW50KDMyKSl9KTtwLnByb3RvdHlwZS5yZWFkQmlnVUludDY0QkU9YmUoZnVuY3Rpb24oZSl7ZT1lPj4+MCxZZShlLFwib2Zmc2V0XCIpO2xldCB0PXRoaXNbZV0sbj10aGlzW2UrN107KHQ9PT12b2lkIDB8fG49PT12b2lkIDApJiZ3dChlLHRoaXMubGVuZ3RoLTgpO2xldCBpPXQqMioqMjQrdGhpc1srK2VdKjIqKjE2K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSxvPXRoaXNbKytlXSoyKioyNCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjgrbjtyZXR1cm4oQmlnSW50KGkpPDxCaWdJbnQoMzIpKStCaWdJbnQobyl9KTtwLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2U9ZT4+PjAsdD10Pj4+MCxufHxEKGUsdCx0aGlzLmxlbmd0aCk7bGV0IGk9dGhpc1tlXSxvPTEscz0wO2Zvcig7KytzPHQmJihvKj0yNTYpOylpKz10aGlzW2Urc10qbztyZXR1cm4gbyo9MTI4LGk+PW8mJihpLT1NYXRoLnBvdygyLDgqdCkpLGl9O3AucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbihlLHQsbil7ZT1lPj4+MCx0PXQ+Pj4wLG58fEQoZSx0LHRoaXMubGVuZ3RoKTtsZXQgaT10LG89MSxzPXRoaXNbZSstLWldO2Zvcig7aT4wJiYobyo9MjU2KTspcys9dGhpc1tlKy0taV0qbztyZXR1cm4gbyo9MTI4LHM+PW8mJihzLT1NYXRoLnBvdygyLDgqdCkpLHN9O3AucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV0mMTI4PygyNTUtdGhpc1tlXSsxKSotMTp0aGlzW2VdfTtwLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe2U9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpO2xldCBuPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiBuJjMyNzY4P258NDI5NDkwMTc2MDpufTtwLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe2U9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpO2xldCBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiBuJjMyNzY4P258NDI5NDkwMTc2MDpufTtwLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9O3AucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX07cC5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEU9YmUoZnVuY3Rpb24oZSl7ZT1lPj4+MCxZZShlLFwib2Zmc2V0XCIpO2xldCB0PXRoaXNbZV0sbj10aGlzW2UrN107KHQ9PT12b2lkIDB8fG49PT12b2lkIDApJiZ3dChlLHRoaXMubGVuZ3RoLTgpO2xldCBpPXRoaXNbZSs0XSt0aGlzW2UrNV0qMioqOCt0aGlzW2UrNl0qMioqMTYrKG48PDI0KTtyZXR1cm4oQmlnSW50KGkpPDxCaWdJbnQoMzIpKStCaWdJbnQodCt0aGlzWysrZV0qMioqOCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjI0KX0pO3AucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFPWJlKGZ1bmN0aW9uKGUpe2U9ZT4+PjAsWWUoZSxcIm9mZnNldFwiKTtsZXQgdD10aGlzW2VdLG49dGhpc1tlKzddOyh0PT09dm9pZCAwfHxuPT09dm9pZCAwKSYmd3QoZSx0aGlzLmxlbmd0aC04KTtsZXQgaT0odDw8MjQpK3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqOCt0aGlzWysrZV07cmV0dXJuKEJpZ0ludChpKTw8QmlnSW50KDMyKSkrQmlnSW50KHRoaXNbKytlXSoyKioyNCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjgrbil9KTtwLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSx6ZS5yZWFkKHRoaXMsZSwhMCwyMyw0KX07cC5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksemUucmVhZCh0aGlzLGUsITEsMjMsNCl9O3AucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw4LHRoaXMubGVuZ3RoKSx6ZS5yZWFkKHRoaXMsZSwhMCw1Miw4KX07cC5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDgsdGhpcy5sZW5ndGgpLHplLnJlYWQodGhpcyxlLCExLDUyLDgpfTtmdW5jdGlvbiBXKHIsZSx0LG4saSxvKXtpZighcC5pc0J1ZmZlcihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZih0K24+ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIil9cC5wcm90b3R5cGUud3JpdGVVaW50TEU9cC5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LG4saSl7aWYoZT0rZSx0PXQ+Pj4wLG49bj4+PjAsIWkpe2xldCBhPU1hdGgucG93KDIsOCpuKS0xO1codGhpcyxlLHQsbixhLDApfWxldCBvPTEscz0wO2Zvcih0aGlzW3RdPWUmMjU1OysrczxuJiYobyo9MjU2KTspdGhpc1t0K3NdPWUvbyYyNTU7cmV0dXJuIHQrbn07cC5wcm90b3R5cGUud3JpdGVVaW50QkU9cC5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LG4saSl7aWYoZT0rZSx0PXQ+Pj4wLG49bj4+PjAsIWkpe2xldCBhPU1hdGgucG93KDIsOCpuKS0xO1codGhpcyxlLHQsbixhLDApfWxldCBvPW4tMSxzPTE7Zm9yKHRoaXNbdCtvXT1lJjI1NTstLW8+PTAmJihzKj0yNTYpOyl0aGlzW3Qrb109ZS9zJjI1NTtyZXR1cm4gdCtufTtwLnByb3RvdHlwZS53cml0ZVVpbnQ4PXAucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCwxLDI1NSwwKSx0aGlzW3RdPWUmMjU1LHQrMX07cC5wcm90b3R5cGUud3JpdGVVaW50MTZMRT1wLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiw2NTUzNSwwKSx0aGlzW3RdPWUmMjU1LHRoaXNbdCsxXT1lPj4+OCx0KzJ9O3AucHJvdG90eXBlLndyaXRlVWludDE2QkU9cC5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDIsNjU1MzUsMCksdGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09ZSYyNTUsdCsyfTtwLnByb3RvdHlwZS53cml0ZVVpbnQzMkxFPXAucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksdGhpc1t0KzNdPWU+Pj4yNCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCsxXT1lPj4+OCx0aGlzW3RdPWUmMjU1LHQrNH07cC5wcm90b3R5cGUud3JpdGVVaW50MzJCRT1wLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT1lJjI1NSx0KzR9O2Z1bmN0aW9uIF9pKHIsZSx0LG4saSl7UmkoZSxuLGkscix0LDcpO2xldCBvPU51bWJlcihlJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7clt0KytdPW8sbz1vPj44LHJbdCsrXT1vLG89bz4+OCxyW3QrK109byxvPW8+Pjgsclt0KytdPW87bGV0IHM9TnVtYmVyKGU+PkJpZ0ludCgzMikmQmlnSW50KDQyOTQ5NjcyOTUpKTtyZXR1cm4gclt0KytdPXMscz1zPj44LHJbdCsrXT1zLHM9cz4+OCxyW3QrK109cyxzPXM+Pjgsclt0KytdPXMsdH1mdW5jdGlvbiB3aShyLGUsdCxuLGkpe1JpKGUsbixpLHIsdCw3KTtsZXQgbz1OdW1iZXIoZSZCaWdJbnQoNDI5NDk2NzI5NSkpO3JbdCs3XT1vLG89bz4+OCxyW3QrNl09byxvPW8+Pjgsclt0KzVdPW8sbz1vPj44LHJbdCs0XT1vO2xldCBzPU51bWJlcihlPj5CaWdJbnQoMzIpJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7cmV0dXJuIHJbdCszXT1zLHM9cz4+OCxyW3QrMl09cyxzPXM+Pjgsclt0KzFdPXMscz1zPj44LHJbdF09cyx0Kzh9cC5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIF9pKHRoaXMsZSx0LEJpZ0ludCgwKSxCaWdJbnQoXCIweGZmZmZmZmZmZmZmZmZmZmZcIikpfSk7cC5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRCRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIHdpKHRoaXMsZSx0LEJpZ0ludCgwKSxCaWdJbnQoXCIweGZmZmZmZmZmZmZmZmZmZmZcIikpfSk7cC5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsIWkpe2xldCB1PU1hdGgucG93KDIsOCpuLTEpO1codGhpcyxlLHQsbix1LTEsLXUpfWxldCBvPTAscz0xLGE9MDtmb3IodGhpc1t0XT1lJjI1NTsrK288biYmKHMqPTI1Nik7KWU8MCYmYT09PTAmJnRoaXNbdCtvLTFdIT09MCYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259O3AucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24oZSx0LG4saSl7aWYoZT0rZSx0PXQ+Pj4wLCFpKXtsZXQgdT1NYXRoLnBvdygyLDgqbi0xKTtXKHRoaXMsZSx0LG4sdS0xLC11KX1sZXQgbz1uLTEscz0xLGE9MDtmb3IodGhpc1t0K29dPWUmMjU1Oy0tbz49MCYmKHMqPTI1Nik7KWU8MCYmYT09PTAmJnRoaXNbdCtvKzFdIT09MCYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259O3AucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDEsMTI3LC0xMjgpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT1lJjI1NSx0KzF9O3AucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSx0aGlzW3RdPWUmMjU1LHRoaXNbdCsxXT1lPj4+OCx0KzJ9O3AucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSx0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT1lJjI1NSx0KzJ9O3AucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdGhpc1t0XT1lJjI1NSx0aGlzW3QrMV09ZT4+PjgsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrM109ZT4+PjI0LHQrNH07cC5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSx0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109ZSYyNTUsdCs0fTtwLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEU9YmUoZnVuY3Rpb24oZSx0PTApe3JldHVybiBfaSh0aGlzLGUsdCwtQmlnSW50KFwiMHg4MDAwMDAwMDAwMDAwMDAwXCIpLEJpZ0ludChcIjB4N2ZmZmZmZmZmZmZmZmZmZlwiKSl9KTtwLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkU9YmUoZnVuY3Rpb24oZSx0PTApe3JldHVybiB3aSh0aGlzLGUsdCwtQmlnSW50KFwiMHg4MDAwMDAwMDAwMDAwMDAwXCIpLEJpZ0ludChcIjB4N2ZmZmZmZmZmZmZmZmZmZlwiKSl9KTtmdW5jdGlvbiB2aShyLGUsdCxuLGksbyl7aWYodCtuPnIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKX1mdW5jdGlvbiBFaShyLGUsdCxuLGkpe3JldHVybiBlPStlLHQ9dD4+PjAsaXx8dmkocixlLHQsNCwzNDAyODIzNDY2Mzg1Mjg4NmUyMiwtMzQwMjgyMzQ2NjM4NTI4ODZlMjIpLHplLndyaXRlKHIsZSx0LG4sMjMsNCksdCs0fXAucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEVpKHRoaXMsZSx0LCEwLG4pfTtwLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBFaSh0aGlzLGUsdCwhMSxuKX07ZnVuY3Rpb24gU2kocixlLHQsbixpKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLGl8fHZpKHIsZSx0LDgsMTc5NzY5MzEzNDg2MjMxNTdlMjkyLC0xNzk3NjkzMTM0ODYyMzE1N2UyOTIpLHplLndyaXRlKHIsZSx0LG4sNTIsOCksdCs4fXAucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTaSh0aGlzLGUsdCwhMCxuKX07cC5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFNpKHRoaXMsZSx0LCExLG4pfTtwLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxuLGkpe2lmKCFwLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXJcIik7aWYobnx8KG49MCksIWkmJmkhPT0wJiYoaT10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxpPjAmJmk8biYmKGk9biksaT09PW58fGUubGVuZ3RoPT09MHx8dGhpcy5sZW5ndGg9PT0wKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHNcIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtpZihpPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kc1wiKTtpPnRoaXMubGVuZ3RoJiYoaT10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxpLW4mJihpPWUubGVuZ3RoLXQrbik7bGV0IG89aS1uO3JldHVybiB0aGlzPT09ZSYmdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW49PVwiZnVuY3Rpb25cIj90aGlzLmNvcHlXaXRoaW4odCxuLGkpOlVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLGkpLHQpLG99O3AucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4saSl7aWYodHlwZW9mIGU9PVwic3RyaW5nXCIpe2lmKHR5cGVvZiB0PT1cInN0cmluZ1wiPyhpPXQsdD0wLG49dGhpcy5sZW5ndGgpOnR5cGVvZiBuPT1cInN0cmluZ1wiJiYoaT1uLG49dGhpcy5sZW5ndGgpLGkhPT12b2lkIDAmJnR5cGVvZiBpIT1cInN0cmluZ1wiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nXCIpO2lmKHR5cGVvZiBpPT1cInN0cmluZ1wiJiYhcC5pc0VuY29kaW5nKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitpKTtpZihlLmxlbmd0aD09PTEpe2xldCBzPWUuY2hhckNvZGVBdCgwKTsoaT09PVwidXRmOFwiJiZzPDEyOHx8aT09PVwibGF0aW4xXCIpJiYoZT1zKX19ZWxzZSB0eXBlb2YgZT09XCJudW1iZXJcIj9lPWUmMjU1OnR5cGVvZiBlPT1cImJvb2xlYW5cIiYmKGU9TnVtYmVyKGUpKTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJPdXQgb2YgcmFuZ2UgaW5kZXhcIik7aWYobjw9dClyZXR1cm4gdGhpczt0PXQ+Pj4wLG49bj09PXZvaWQgMD90aGlzLmxlbmd0aDpuPj4+MCxlfHwoZT0wKTtsZXQgbztpZih0eXBlb2YgZT09XCJudW1iZXJcIilmb3Iobz10O288bjsrK28pdGhpc1tvXT1lO2Vsc2V7bGV0IHM9cC5pc0J1ZmZlcihlKT9lOnAuZnJvbShlLGkpLGE9cy5sZW5ndGg7aWYoYT09PTApdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJytlKydcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKTtmb3Iobz0wO288bi10Oysrbyl0aGlzW28rdF09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgVmU9e307ZnVuY3Rpb24gZW4ocixlLHQpe1ZlW3JdPWNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJtZXNzYWdlXCIse3ZhbHVlOmUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHRoaXMubmFtZT1gJHt0aGlzLm5hbWV9IFske3J9XWAsdGhpcy5zdGFjayxkZWxldGUgdGhpcy5uYW1lfWdldCBjb2RlKCl7cmV0dXJuIHJ9c2V0IGNvZGUoaSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJjb2RlXCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmksd3JpdGFibGU6ITB9KX10b1N0cmluZygpe3JldHVybmAke3RoaXMubmFtZX0gWyR7cn1dOiAke3RoaXMubWVzc2FnZX1gfX19ZW4oXCJFUlJfQlVGRkVSX09VVF9PRl9CT1VORFNcIixmdW5jdGlvbihyKXtyZXR1cm4gcj9gJHtyfSBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHNgOlwiQXR0ZW1wdCB0byBhY2Nlc3MgbWVtb3J5IG91dHNpZGUgYnVmZmVyIGJvdW5kc1wifSxSYW5nZUVycm9yKTtlbihcIkVSUl9JTlZBTElEX0FSR19UWVBFXCIsZnVuY3Rpb24ocixlKXtyZXR1cm5gVGhlIFwiJHtyfVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgZX1gfSxUeXBlRXJyb3IpO2VuKFwiRVJSX09VVF9PRl9SQU5HRVwiLGZ1bmN0aW9uKHIsZSx0KXtsZXQgbj1gVGhlIHZhbHVlIG9mIFwiJHtyfVwiIGlzIG91dCBvZiByYW5nZS5gLGk9dDtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih0KSYmTWF0aC5hYnModCk+MioqMzI/aT1oaShTdHJpbmcodCkpOnR5cGVvZiB0PT1cImJpZ2ludFwiJiYoaT1TdHJpbmcodCksKHQ+QmlnSW50KDIpKipCaWdJbnQoMzIpfHx0PC0oQmlnSW50KDIpKipCaWdJbnQoMzIpKSkmJihpPWhpKGkpKSxpKz1cIm5cIiksbis9YCBJdCBtdXN0IGJlICR7ZX0uIFJlY2VpdmVkICR7aX1gLG59LFJhbmdlRXJyb3IpO2Z1bmN0aW9uIGhpKHIpe2xldCBlPVwiXCIsdD1yLmxlbmd0aCxuPXJbMF09PT1cIi1cIj8xOjA7Zm9yKDt0Pj1uKzQ7dC09MyllPWBfJHtyLnNsaWNlKHQtMyx0KX0ke2V9YDtyZXR1cm5gJHtyLnNsaWNlKDAsdCl9JHtlfWB9ZnVuY3Rpb24gcWEocixlLHQpe1llKGUsXCJvZmZzZXRcIiksKHJbZV09PT12b2lkIDB8fHJbZSt0XT09PXZvaWQgMCkmJnd0KGUsci5sZW5ndGgtKHQrMSkpfWZ1bmN0aW9uIFJpKHIsZSx0LG4saSxvKXtpZihyPnR8fHI8ZSl7bGV0IHM9dHlwZW9mIGU9PVwiYmlnaW50XCI/XCJuXCI6XCJcIixhO3Rocm93IG8+Mz9lPT09MHx8ZT09PUJpZ0ludCgwKT9hPWA+PSAwJHtzfSBhbmQgPCAyJHtzfSAqKiAkeyhvKzEpKjh9JHtzfWA6YT1gPj0gLSgyJHtzfSAqKiAkeyhvKzEpKjgtMX0ke3N9KSBhbmQgPCAyICoqICR7KG8rMSkqOC0xfSR7c31gOmE9YD49ICR7ZX0ke3N9IGFuZCA8PSAke3R9JHtzfWAsbmV3IFZlLkVSUl9PVVRfT0ZfUkFOR0UoXCJ2YWx1ZVwiLGEscil9cWEobixpLG8pfWZ1bmN0aW9uIFllKHIsZSl7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFZlLkVSUl9JTlZBTElEX0FSR19UWVBFKGUsXCJudW1iZXJcIixyKX1mdW5jdGlvbiB3dChyLGUsdCl7dGhyb3cgTWF0aC5mbG9vcihyKSE9PXI/KFllKHIsdCksbmV3IFZlLkVSUl9PVVRfT0ZfUkFOR0UodHx8XCJvZmZzZXRcIixcImFuIGludGVnZXJcIixyKSk6ZTwwP25ldyBWZS5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFM6bmV3IFZlLkVSUl9PVVRfT0ZfUkFOR0UodHx8XCJvZmZzZXRcIixgPj0gJHt0PzE6MH0gYW5kIDw9ICR7ZX1gLHIpfXZhciBqYT0vW14rLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIFdhKHIpe2lmKHI9ci5zcGxpdChcIj1cIilbMF0scj1yLnRyaW0oKS5yZXBsYWNlKGphLFwiXCIpLHIubGVuZ3RoPDIpcmV0dXJuXCJcIjtmb3IoO3IubGVuZ3RoJTQhPT0wOylyPXIrXCI9XCI7cmV0dXJuIHJ9ZnVuY3Rpb24gSnIocixlKXtlPWV8fDEvMDtsZXQgdCxuPXIubGVuZ3RoLGk9bnVsbCxvPVtdO2ZvcihsZXQgcz0wO3M8bjsrK3Mpe2lmKHQ9ci5jaGFyQ29kZUF0KHMpLHQ+NTUyOTUmJnQ8NTczNDQpe2lmKCFpKXtpZih0PjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9ZWxzZSBpZihzKzE9PT1uKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT10O2NvbnRpbnVlfWlmKHQ8NTYzMjApeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXQ7Y29udGludWV9dD0oaS01NTI5Njw8MTB8dC01NjMyMCkrNjU1MzZ9ZWxzZSBpJiYoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHQ8MTI4KXtpZigoZS09MSk8MClicmVhaztvLnB1c2godCl9ZWxzZSBpZih0PDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO28ucHVzaCh0Pj42fDE5Mix0JjYzfDEyOCl9ZWxzZSBpZih0PDY1NTM2KXtpZigoZS09Myk8MClicmVhaztvLnB1c2godD4+MTJ8MjI0LHQ+PjYmNjN8MTI4LHQmNjN8MTI4KX1lbHNlIGlmKHQ8MTExNDExMil7aWYoKGUtPTQpPDApYnJlYWs7by5wdXNoKHQ+PjE4fDI0MCx0Pj4xMiY2M3wxMjgsdD4+NiY2M3wxMjgsdCY2M3wxMjgpfWVsc2UgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb2RlIHBvaW50XCIpfXJldHVybiBvfWZ1bmN0aW9uICRhKHIpe2xldCBlPVtdO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7Kyt0KWUucHVzaChyLmNoYXJDb2RlQXQodCkmMjU1KTtyZXR1cm4gZX1mdW5jdGlvbiBHYShyLGUpe2xldCB0LG4saSxvPVtdO2ZvcihsZXQgcz0wO3M8ci5sZW5ndGgmJiEoKGUtPTIpPDApOysrcyl0PXIuY2hhckNvZGVBdChzKSxuPXQ+PjgsaT10JTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfWZ1bmN0aW9uIFRpKHIpe3JldHVybiBZci50b0J5dGVBcnJheShXYShyKSl9ZnVuY3Rpb24gVXQocixlLHQsbil7bGV0IGk7Zm9yKGk9MDtpPG4mJiEoaSt0Pj1lLmxlbmd0aHx8aT49ci5sZW5ndGgpOysraSllW2krdF09cltpXTtyZXR1cm4gaX1mdW5jdGlvbiBpZShyLGUpe3JldHVybiByIGluc3RhbmNlb2YgZXx8ciE9bnVsbCYmci5jb25zdHJ1Y3RvciE9bnVsbCYmci5jb25zdHJ1Y3Rvci5uYW1lIT1udWxsJiZyLmNvbnN0cnVjdG9yLm5hbWU9PT1lLm5hbWV9ZnVuY3Rpb24gdG4ocil7cmV0dXJuIHIhPT1yfXZhciBWYT1mdW5jdGlvbigpe2xldCByPVwiMDEyMzQ1Njc4OWFiY2RlZlwiLGU9bmV3IEFycmF5KDI1Nik7Zm9yKGxldCB0PTA7dDwxNjsrK3Qpe2xldCBuPXQqMTY7Zm9yKGxldCBpPTA7aTwxNjsrK2kpZVtuK2ldPXJbdF0rcltpXX1yZXR1cm4gZX0oKTtmdW5jdGlvbiBiZShyKXtyZXR1cm4gdHlwZW9mIEJpZ0ludD5cInVcIj96YTpyfWZ1bmN0aW9uIHphKCl7dGhyb3cgbmV3IEVycm9yKFwiQmlnSW50IG5vdCBzdXBwb3J0ZWRcIil9fSk7dmFyIElpPVMoKGNsLExpKT0+e2MoKTt2YXIgUD1MaS5leHBvcnRzPXt9LG9lLHNlO2Z1bmN0aW9uIHJuKCl7dGhyb3cgbmV3IEVycm9yKFwic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKX1mdW5jdGlvbiBubigpe3Rocm93IG5ldyBFcnJvcihcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKX0oZnVuY3Rpb24oKXt0cnl7dHlwZW9mIHNldFRpbWVvdXQ9PVwiZnVuY3Rpb25cIj9vZT1zZXRUaW1lb3V0Om9lPXJufWNhdGNoe29lPXJufXRyeXt0eXBlb2YgY2xlYXJUaW1lb3V0PT1cImZ1bmN0aW9uXCI/c2U9Y2xlYXJUaW1lb3V0OnNlPW5ufWNhdGNoe3NlPW5ufX0pKCk7ZnVuY3Rpb24gQ2kocil7aWYob2U9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KHIsMCk7aWYoKG9lPT09cm58fCFvZSkmJnNldFRpbWVvdXQpcmV0dXJuIG9lPXNldFRpbWVvdXQsc2V0VGltZW91dChyLDApO3RyeXtyZXR1cm4gb2UociwwKX1jYXRjaHt0cnl7cmV0dXJuIG9lLmNhbGwobnVsbCxyLDApfWNhdGNoe3JldHVybiBvZS5jYWxsKHRoaXMsciwwKX19fWZ1bmN0aW9uIFlhKHIpe2lmKHNlPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQocik7aWYoKHNlPT09bm58fCFzZSkmJmNsZWFyVGltZW91dClyZXR1cm4gc2U9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChyKTt0cnl7cmV0dXJuIHNlKHIpfWNhdGNoe3RyeXtyZXR1cm4gc2UuY2FsbChudWxsLHIpfWNhdGNoe3JldHVybiBzZS5jYWxsKHRoaXMscil9fX12YXIgcGU9W10sSmU9ITEsa2UsRHQ9LTE7ZnVuY3Rpb24gS2EoKXshSmV8fCFrZXx8KEplPSExLGtlLmxlbmd0aD9wZT1rZS5jb25jYXQocGUpOkR0PS0xLHBlLmxlbmd0aCYmQmkoKSl9ZnVuY3Rpb24gQmkoKXtpZighSmUpe3ZhciByPUNpKEthKTtKZT0hMDtmb3IodmFyIGU9cGUubGVuZ3RoO2U7KXtmb3Ioa2U9cGUscGU9W107KytEdDxlOylrZSYma2VbRHRdLnJ1bigpO0R0PS0xLGU9cGUubGVuZ3RofWtlPW51bGwsSmU9ITEsWWEocil9fVAubmV4dFRpY2s9ZnVuY3Rpb24ocil7dmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0LTFdPWFyZ3VtZW50c1t0XTtwZS5wdXNoKG5ldyBNaShyLGUpKSxwZS5sZW5ndGg9PT0xJiYhSmUmJkNpKEJpKX07ZnVuY3Rpb24gTWkocixlKXt0aGlzLmZ1bj1yLHRoaXMuYXJyYXk9ZX1NaS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07UC50aXRsZT1cImJyb3dzZXJcIjtQLmJyb3dzZXI9ITA7UC5lbnY9e307UC5hcmd2PVtdO1AudmVyc2lvbj1cIlwiO1AudmVyc2lvbnM9e307ZnVuY3Rpb24gaGUoKXt9UC5vbj1oZTtQLmFkZExpc3RlbmVyPWhlO1Aub25jZT1oZTtQLm9mZj1oZTtQLnJlbW92ZUxpc3RlbmVyPWhlO1AucmVtb3ZlQWxsTGlzdGVuZXJzPWhlO1AuZW1pdD1oZTtQLnByZXBlbmRMaXN0ZW5lcj1oZTtQLnByZXBlbmRPbmNlTGlzdGVuZXI9aGU7UC5saXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuW119O1AuYmluZGluZz1mdW5jdGlvbihyKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKX07UC5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn07UC5jaGRpcj1mdW5jdGlvbihyKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIil9O1AudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19KTt2YXIgQWksWGEsYz1oYSgoKT0+e0FpPUMoWGUoKSksWGE9QyhJaSgpKTt3aW5kb3cuQnVmZmVyPUFpLkJ1ZmZlcjt3aW5kb3cucHJvY2Vzcz1YYX0pO3ZhciBqaT1TKChsbCxvbik9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFFlPXR5cGVvZiBSZWZsZWN0PT1cIm9iamVjdFwiP1JlZmxlY3Q6bnVsbCxGaT1RZSYmdHlwZW9mIFFlLmFwcGx5PT1cImZ1bmN0aW9uXCI/UWUuYXBwbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChlLHQsbil9LE50O1FlJiZ0eXBlb2YgUWUub3duS2V5cz09XCJmdW5jdGlvblwiP050PVFlLm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9OdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSkpfTpOdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSl9O2Z1bmN0aW9uIEphKHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBraT1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKGUpe3JldHVybiBlIT09ZX07ZnVuY3Rpb24gQigpe0IuaW5pdC5jYWxsKHRoaXMpfW9uLmV4cG9ydHM9Qjtvbi5leHBvcnRzLm9uY2U9dHU7Qi5FdmVudEVtaXR0ZXI9QjtCLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMDtCLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MDtCLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgUGk9MTA7ZnVuY3Rpb24gSHQocil7aWYodHlwZW9mIHIhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiByKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoQixcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUGl9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9XCJudW1iZXJcInx8cjwwfHxraShyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrcitcIi5cIik7UGk9cn19KTtCLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9O0IucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJudW1iZXJcInx8ZTwwfHxraShlKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrZStcIi5cIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9O2Z1bmN0aW9uIE9pKHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/Qi5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31CLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gT2kodGhpcyl9O0IucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQucHVzaChhcmd1bWVudHNbbl0pO3ZhciBpPWU9PT1cImVycm9yXCIsbz10aGlzLl9ldmVudHM7aWYobyE9PXZvaWQgMClpPWkmJm8uZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighaSlyZXR1cm4hMTtpZihpKXt2YXIgcztpZih0Lmxlbmd0aD4wJiYocz10WzBdKSxzIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgczt2YXIgYT1uZXcgRXJyb3IoXCJVbmhhbmRsZWQgZXJyb3IuXCIrKHM/XCIgKFwiK3MubWVzc2FnZStcIilcIjpcIlwiKSk7dGhyb3cgYS5jb250ZXh0PXMsYX12YXIgdT1vW2VdO2lmKHU9PT12b2lkIDApcmV0dXJuITE7aWYodHlwZW9mIHU9PVwiZnVuY3Rpb25cIilGaSh1LHRoaXMsdCk7ZWxzZSBmb3IodmFyIGY9dS5sZW5ndGgsbD1xaSh1LGYpLG49MDtuPGY7KytuKUZpKGxbbl0sdGhpcyx0KTtyZXR1cm4hMH07ZnVuY3Rpb24gVWkocixlLHQsbil7dmFyIGksbyxzO2lmKEh0KHQpLG89ci5fZXZlbnRzLG89PT12b2lkIDA/KG89ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KG8ubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoXCJuZXdMaXN0ZW5lclwiLGUsdC5saXN0ZW5lcj90Lmxpc3RlbmVyOnQpLG89ci5fZXZlbnRzKSxzPW9bZV0pLHM9PT12b2lkIDApcz1vW2VdPXQsKytyLl9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBzPT1cImZ1bmN0aW9uXCI/cz1vW2VdPW4/W3Qsc106W3MsdF06bj9zLnVuc2hpZnQodCk6cy5wdXNoKHQpLGk9T2kociksaT4wJiZzLmxlbmd0aD5pJiYhcy53YXJuZWQpe3Mud2FybmVkPSEwO3ZhciBhPW5ldyBFcnJvcihcIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gXCIrcy5sZW5ndGgrXCIgXCIrU3RyaW5nKGUpK1wiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXRcIik7YS5uYW1lPVwiTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nXCIsYS5lbWl0dGVyPXIsYS50eXBlPWUsYS5jb3VudD1zLmxlbmd0aCxKYShhKX1yZXR1cm4gcn1CLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBVaSh0aGlzLGUsdCwhMSl9O0IucHJvdG90eXBlLm9uPUIucHJvdG90eXBlLmFkZExpc3RlbmVyO0IucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBVaSh0aGlzLGUsdCwhMCl9O2Z1bmN0aW9uIFFhKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiBEaShyLGUsdCl7dmFyIG49e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTplLGxpc3RlbmVyOnR9LGk9UWEuYmluZChuKTtyZXR1cm4gaS5saXN0ZW5lcj10LG4ud3JhcEZuPWksaX1CLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEh0KHQpLHRoaXMub24oZSxEaSh0aGlzLGUsdCkpLHRoaXN9O0IucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSHQodCksdGhpcy5wcmVwZW5kTGlzdGVuZXIoZSxEaSh0aGlzLGUsdCkpLHRoaXN9O0IucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLHMsYTtpZihIdCh0KSxpPXRoaXMuX2V2ZW50cyxpPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49aVtlXSxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49PT10fHxuLmxpc3RlbmVyPT09dCktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLG4ubGlzdGVuZXJ8fHQpKTtlbHNlIGlmKHR5cGVvZiBuIT1cImZ1bmN0aW9uXCIpe2ZvcihvPS0xLHM9bi5sZW5ndGgtMTtzPj0wO3MtLSlpZihuW3NdPT09dHx8bltzXS5saXN0ZW5lcj09PXQpe2E9bltzXS5saXN0ZW5lcixvPXM7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzO289PT0wP24uc2hpZnQoKTpaYShuLG8pLG4ubGVuZ3RoPT09MSYmKGlbZV09blswXSksaS5yZW1vdmVMaXN0ZW5lciE9PXZvaWQgMCYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLGF8fHQpfXJldHVybiB0aGlzfTtCLnByb3RvdHlwZS5vZmY9Qi5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7Qi5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3ZhciB0LG4saTtpZihuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG4ucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpuW2VdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIG5bZV0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBvPU9iamVjdC5rZXlzKG4pLHM7Zm9yKGk9MDtpPG8ubGVuZ3RoOysraSlzPW9baV0scyE9PVwicmVtb3ZlTGlzdGVuZXJcIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMocyk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKFwicmVtb3ZlTGlzdGVuZXJcIiksdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKHQ9bltlXSx0eXBlb2YgdD09XCJmdW5jdGlvblwiKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0KTtlbHNlIGlmKHQhPT12b2lkIDApZm9yKGk9dC5sZW5ndGgtMTtpPj0wO2ktLSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsdFtpXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIE5pKHIsZSx0KXt2YXIgbj1yLl9ldmVudHM7aWYobj09PXZvaWQgMClyZXR1cm5bXTt2YXIgaT1uW2VdO3JldHVybiBpPT09dm9pZCAwP1tdOnR5cGVvZiBpPT1cImZ1bmN0aW9uXCI/dD9baS5saXN0ZW5lcnx8aV06W2ldOnQ/ZXUoaSk6cWkoaSxpLmxlbmd0aCl9Qi5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBOaSh0aGlzLGUsITApfTtCLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIE5pKHRoaXMsZSwhMSl9O0IubGlzdGVuZXJDb3VudD1mdW5jdGlvbihyLGUpe3JldHVybiB0eXBlb2Ygci5saXN0ZW5lckNvdW50PT1cImZ1bmN0aW9uXCI/ci5saXN0ZW5lckNvdW50KGUpOkhpLmNhbGwocixlKX07Qi5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1IaTtmdW5jdGlvbiBIaShyKXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSE9PXZvaWQgMCl7dmFyIHQ9ZVtyXTtpZih0eXBlb2YgdD09XCJmdW5jdGlvblwiKXJldHVybiAxO2lmKHQhPT12b2lkIDApcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfUIucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9OdCh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBxaShyLGUpe2Zvcih2YXIgdD1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24pdFtuXT1yW25dO3JldHVybiB0fWZ1bmN0aW9uIFphKHIsZSl7Zm9yKDtlKzE8ci5sZW5ndGg7ZSsrKXJbZV09cltlKzFdO3IucG9wKCl9ZnVuY3Rpb24gZXUocil7Zm9yKHZhciBlPW5ldyBBcnJheShyLmxlbmd0aCksdD0wO3Q8ZS5sZW5ndGg7Kyt0KWVbdF09clt0XS5saXN0ZW5lcnx8clt0XTtyZXR1cm4gZX1mdW5jdGlvbiB0dShyLGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGkoKXtvIT09dm9pZCAwJiZyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixvKSx0KFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9dmFyIG87ZSE9PVwiZXJyb3JcIiYmKG89ZnVuY3Rpb24oYSl7ci5yZW1vdmVMaXN0ZW5lcihlLGkpLG4oYSl9LHIub25jZShcImVycm9yXCIsbykpLHIub25jZShlLGkpfSl9fSk7dmFyIE9lPVMoKGRsLHNuKT0+e2MoKTt0eXBlb2YgT2JqZWN0LmNyZWF0ZT09XCJmdW5jdGlvblwiP3NuLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt0JiYoZS5zdXBlcl89dCxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OnNuLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZih0KXtlLnN1cGVyXz10O3ZhciBuPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgbixlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lfX19KTt2YXIgdW49UygocGwsYW4pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBaZT10eXBlb2YgUmVmbGVjdD09XCJvYmplY3RcIj9SZWZsZWN0Om51bGwsV2k9WmUmJnR5cGVvZiBaZS5hcHBseT09XCJmdW5jdGlvblwiP1plLmFwcGx5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoZSx0LG4pfSxxdDtaZSYmdHlwZW9mIFplLm93bktleXM9PVwiZnVuY3Rpb25cIj9xdD1aZS5vd25LZXlzOk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/cXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpKX06cXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpfTtmdW5jdGlvbiBydShyKXtjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybihyKX12YXIgR2k9TnVtYmVyLmlzTmFOfHxmdW5jdGlvbihlKXtyZXR1cm4gZSE9PWV9O2Z1bmN0aW9uIE0oKXtNLmluaXQuY2FsbCh0aGlzKX1hbi5leHBvcnRzPU07YW4uZXhwb3J0cy5vbmNlPXN1O00uRXZlbnRFbWl0dGVyPU07TS5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDA7TS5wcm90b3R5cGUuX2V2ZW50c0NvdW50PTA7TS5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDA7dmFyICRpPTEwO2Z1bmN0aW9uIGp0KHIpe2lmKHR5cGVvZiByIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2Ygcil9T2JqZWN0LmRlZmluZVByb3BlcnR5KE0sXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuICRpfSxzZXQ6ZnVuY3Rpb24ocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCJ8fHI8MHx8R2kocikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrXCIuXCIpOyRpPXJ9fSk7TS5pbml0PWZ1bmN0aW9uKCl7KHRoaXMuX2V2ZW50cz09PXZvaWQgMHx8dGhpcy5fZXZlbnRzPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpJiYodGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfTtNLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPVwibnVtYmVyXCJ8fGU8MHx8R2koZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK2UrXCIuXCIpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9ZSx0aGlzfTtmdW5jdGlvbiBWaShyKXtyZXR1cm4gci5fbWF4TGlzdGVuZXJzPT09dm9pZCAwP00uZGVmYXVsdE1heExpc3RlbmVyczpyLl9tYXhMaXN0ZW5lcnN9TS5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIFZpKHRoaXMpfTtNLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYXJndW1lbnRzW25dKTt2YXIgaT1lPT09XCJlcnJvclwiLG89dGhpcy5fZXZlbnRzO2lmKG8hPT12b2lkIDApaT1pJiZvLmVycm9yPT09dm9pZCAwO2Vsc2UgaWYoIWkpcmV0dXJuITE7aWYoaSl7dmFyIHM7aWYodC5sZW5ndGg+MCYmKHM9dFswXSkscyBpbnN0YW5jZW9mIEVycm9yKXRocm93IHM7dmFyIGE9bmV3IEVycm9yKFwiVW5oYW5kbGVkIGVycm9yLlwiKyhzP1wiIChcIitzLm1lc3NhZ2UrXCIpXCI6XCJcIikpO3Rocm93IGEuY29udGV4dD1zLGF9dmFyIHU9b1tlXTtpZih1PT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiB1PT1cImZ1bmN0aW9uXCIpV2kodSx0aGlzLHQpO2Vsc2UgZm9yKHZhciBmPXUubGVuZ3RoLGw9SmkodSxmKSxuPTA7bjxmOysrbilXaShsW25dLHRoaXMsdCk7cmV0dXJuITB9O2Z1bmN0aW9uIHppKHIsZSx0LG4pe3ZhciBpLG8scztpZihqdCh0KSxvPXIuX2V2ZW50cyxvPT09dm9pZCAwPyhvPXIuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHIuX2V2ZW50c0NvdW50PTApOihvLm5ld0xpc3RlbmVyIT09dm9pZCAwJiYoci5lbWl0KFwibmV3TGlzdGVuZXJcIixlLHQubGlzdGVuZXI/dC5saXN0ZW5lcjp0KSxvPXIuX2V2ZW50cykscz1vW2VdKSxzPT09dm9pZCAwKXM9b1tlXT10LCsrci5fZXZlbnRzQ291bnQ7ZWxzZSBpZih0eXBlb2Ygcz09XCJmdW5jdGlvblwiP3M9b1tlXT1uP1t0LHNdOltzLHRdOm4/cy51bnNoaWZ0KHQpOnMucHVzaCh0KSxpPVZpKHIpLGk+MCYmcy5sZW5ndGg+aSYmIXMud2FybmVkKXtzLndhcm5lZD0hMDt2YXIgYT1uZXcgRXJyb3IoXCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuIFwiK3MubGVuZ3RoK1wiIFwiK1N0cmluZyhlKStcIiBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0XCIpO2EubmFtZT1cIk1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZ1wiLGEuZW1pdHRlcj1yLGEudHlwZT1lLGEuY291bnQ9cy5sZW5ndGgscnUoYSl9cmV0dXJuIHJ9TS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gemkodGhpcyxlLHQsITEpfTtNLnByb3RvdHlwZS5vbj1NLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtNLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gemkodGhpcyxlLHQsITApfTtmdW5jdGlvbiBudSgpe2lmKCF0aGlzLmZpcmVkKXJldHVybiB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsdGhpcy53cmFwRm4pLHRoaXMuZmlyZWQ9ITAsYXJndW1lbnRzLmxlbmd0aD09PTA/dGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTp0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LGFyZ3VtZW50cyl9ZnVuY3Rpb24gWWkocixlLHQpe3ZhciBuPXtmaXJlZDohMSx3cmFwRm46dm9pZCAwLHRhcmdldDpyLHR5cGU6ZSxsaXN0ZW5lcjp0fSxpPW51LmJpbmQobik7cmV0dXJuIGkubGlzdGVuZXI9dCxuLndyYXBGbj1pLGl9TS5wcm90b3R5cGUub25jZT1mdW5jdGlvbihlLHQpe3JldHVybiBqdCh0KSx0aGlzLm9uKGUsWWkodGhpcyxlLHQpKSx0aGlzfTtNLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGp0KHQpLHRoaXMucHJlcGVuZExpc3RlbmVyKGUsWWkodGhpcyxlLHQpKSx0aGlzfTtNLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuLGksbyxzLGE7aWYoanQodCksaT10aGlzLl9ldmVudHMsaT09PXZvaWQgMClyZXR1cm4gdGhpcztpZihuPWlbZV0sbj09PXZvaWQgMClyZXR1cm4gdGhpcztpZihuPT09dHx8bi5saXN0ZW5lcj09PXQpLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6KGRlbGV0ZSBpW2VdLGkucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsZSxuLmxpc3RlbmVyfHx0KSk7ZWxzZSBpZih0eXBlb2YgbiE9XCJmdW5jdGlvblwiKXtmb3Iobz0tMSxzPW4ubGVuZ3RoLTE7cz49MDtzLS0paWYobltzXT09PXR8fG5bc10ubGlzdGVuZXI9PT10KXthPW5bc10ubGlzdGVuZXIsbz1zO2JyZWFrfWlmKG88MClyZXR1cm4gdGhpcztvPT09MD9uLnNoaWZ0KCk6aXUobixvKSxuLmxlbmd0aD09PTEmJihpW2VdPW5bMF0pLGkucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsZSxhfHx0KX1yZXR1cm4gdGhpc307TS5wcm90b3R5cGUub2ZmPU0ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO00ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgdCxuLGk7aWYobj10aGlzLl9ldmVudHMsbj09PXZvaWQgMClyZXR1cm4gdGhpcztpZihuLnJlbW92ZUxpc3RlbmVyPT09dm9pZCAwKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MD8odGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCk6bltlXSE9PXZvaWQgMCYmKC0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOmRlbGV0ZSBuW2VdKSx0aGlzO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXt2YXIgbz1PYmplY3Qua2V5cyhuKSxzO2ZvcihpPTA7aTxvLmxlbmd0aDsrK2kpcz1vW2ldLHMhPT1cInJlbW92ZUxpc3RlbmVyXCImJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKHMpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhcInJlbW92ZUxpc3RlbmVyXCIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZih0PW5bZV0sdHlwZW9mIHQ9PVwiZnVuY3Rpb25cIil0aGlzLnJlbW92ZUxpc3RlbmVyKGUsdCk7ZWxzZSBpZih0IT09dm9pZCAwKWZvcihpPXQubGVuZ3RoLTE7aT49MDtpLS0pdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHRbaV0pO3JldHVybiB0aGlzfTtmdW5jdGlvbiBLaShyLGUsdCl7dmFyIG49ci5fZXZlbnRzO2lmKG49PT12b2lkIDApcmV0dXJuW107dmFyIGk9bltlXTtyZXR1cm4gaT09PXZvaWQgMD9bXTp0eXBlb2YgaT09XCJmdW5jdGlvblwiP3Q/W2kubGlzdGVuZXJ8fGldOltpXTp0P291KGkpOkppKGksaS5sZW5ndGgpfU0ucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gS2kodGhpcyxlLCEwKX07TS5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBLaSh0aGlzLGUsITEpfTtNLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24ocixlKXtyZXR1cm4gdHlwZW9mIHIubGlzdGVuZXJDb3VudD09XCJmdW5jdGlvblwiP3IubGlzdGVuZXJDb3VudChlKTpYaS5jYWxsKHIsZSl9O00ucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9WGk7ZnVuY3Rpb24gWGkocil7dmFyIGU9dGhpcy5fZXZlbnRzO2lmKGUhPT12b2lkIDApe3ZhciB0PWVbcl07aWYodHlwZW9mIHQ9PVwiZnVuY3Rpb25cIilyZXR1cm4gMTtpZih0IT09dm9pZCAwKXJldHVybiB0Lmxlbmd0aH1yZXR1cm4gMH1NLnByb3RvdHlwZS5ldmVudE5hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/cXQodGhpcy5fZXZlbnRzKTpbXX07ZnVuY3Rpb24gSmkocixlKXtmb3IodmFyIHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKXRbbl09cltuXTtyZXR1cm4gdH1mdW5jdGlvbiBpdShyLGUpe2Zvcig7ZSsxPHIubGVuZ3RoO2UrKylyW2VdPXJbZSsxXTtyLnBvcCgpfWZ1bmN0aW9uIG91KHIpe2Zvcih2YXIgZT1uZXcgQXJyYXkoci5sZW5ndGgpLHQ9MDt0PGUubGVuZ3RoOysrdCllW3RdPXJbdF0ubGlzdGVuZXJ8fHJbdF07cmV0dXJuIGV9ZnVuY3Rpb24gc3UocixlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBpKCl7byE9PXZvaWQgMCYmci5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsbyksdChbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfXZhciBvO2UhPT1cImVycm9yXCImJihvPWZ1bmN0aW9uKGEpe3IucmVtb3ZlTGlzdGVuZXIoZSxpKSxuKGEpfSxyLm9uY2UoXCJlcnJvclwiLG8pKSxyLm9uY2UoZSxpKX0pfX0pO3ZhciBmbj1TKChobCxRaSk9PntjKCk7UWkuZXhwb3J0cz11bigpLkV2ZW50RW1pdHRlcn0pO3ZhciBjbj1TKCgpPT57YygpfSk7dmFyIHJvPVMoKHlsLHRvKT0+e1widXNlIHN0cmljdFwiO2MoKTtmdW5jdGlvbiBaaShyLGUpe3ZhciB0PU9iamVjdC5rZXlzKHIpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocik7ZSYmKG49bi5maWx0ZXIoZnVuY3Rpb24oaSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixpKS5lbnVtZXJhYmxlfSkpLHQucHVzaC5hcHBseSh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIGF1KHIpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciB0PWFyZ3VtZW50c1tlXSE9bnVsbD9hcmd1bWVudHNbZV06e307ZSUyP1ppKE9iamVjdCh0KSwhMCkuZm9yRWFjaChmdW5jdGlvbihuKXt1dShyLG4sdFtuXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTpaaShPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsbixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikpfSl9cmV0dXJuIHJ9ZnVuY3Rpb24gdXUocixlLHQpe3JldHVybiBlIGluIHI/T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsZSx7dmFsdWU6dCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnJbZV09dCxyfWZ1bmN0aW9uIGZ1KHIsZSl7aWYoIShyIGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBlbyhyLGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLmtleSxuKX19ZnVuY3Rpb24gY3UocixlLHQpe3JldHVybiBlJiZlbyhyLnByb3RvdHlwZSxlKSx0JiZlbyhyLHQpLHJ9dmFyIGx1PVhlKCksV3Q9bHUuQnVmZmVyLGR1PWNuKCksbG49ZHUuaW5zcGVjdCxwdT1sbiYmbG4uY3VzdG9tfHxcImluc3BlY3RcIjtmdW5jdGlvbiBodShyLGUsdCl7V3QucHJvdG90eXBlLmNvcHkuY2FsbChyLGUsdCl9dG8uZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXtmdSh0aGlzLHIpLHRoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9cmV0dXJuIGN1KHIsW3trZXk6XCJwdXNoXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9bjp0aGlzLmhlYWQ9bix0aGlzLnRhaWw9biwrK3RoaXMubGVuZ3RofX0se2tleTpcInVuc2hpZnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTt0aGlzLmxlbmd0aD09PTAmJih0aGlzLnRhaWw9biksdGhpcy5oZWFkPW4sKyt0aGlzLmxlbmd0aH19LHtrZXk6XCJzaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5sZW5ndGghPT0wKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gdGhpcy5sZW5ndGg9PT0xP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX19LHtrZXk6XCJjbGVhclwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9fSx7a2V5Olwiam9pblwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMubGVuZ3RoPT09MClyZXR1cm5cIlwiO2Zvcih2YXIgbj10aGlzLmhlYWQsaT1cIlwiK24uZGF0YTtuPW4ubmV4dDspaSs9dCtuLmRhdGE7cmV0dXJuIGl9fSx7a2V5OlwiY29uY2F0XCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5sZW5ndGg9PT0wKXJldHVybiBXdC5hbGxvYygwKTtmb3IodmFyIG49V3QuYWxsb2NVbnNhZmUodD4+PjApLGk9dGhpcy5oZWFkLG89MDtpOylodShpLmRhdGEsbixvKSxvKz1pLmRhdGEubGVuZ3RoLGk9aS5uZXh0O3JldHVybiBufX0se2tleTpcImNvbnN1bWVcIix2YWx1ZTpmdW5jdGlvbih0LG4pe3ZhciBpO3JldHVybiB0PHRoaXMuaGVhZC5kYXRhLmxlbmd0aD8oaT10aGlzLmhlYWQuZGF0YS5zbGljZSgwLHQpLHRoaXMuaGVhZC5kYXRhPXRoaXMuaGVhZC5kYXRhLnNsaWNlKHQpKTp0PT09dGhpcy5oZWFkLmRhdGEubGVuZ3RoP2k9dGhpcy5zaGlmdCgpOmk9bj90aGlzLl9nZXRTdHJpbmcodCk6dGhpcy5fZ2V0QnVmZmVyKHQpLGl9fSx7a2V5OlwiZmlyc3RcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWQuZGF0YX19LHtrZXk6XCJfZ2V0U3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5oZWFkLGk9MSxvPW4uZGF0YTtmb3IodC09by5sZW5ndGg7bj1uLm5leHQ7KXt2YXIgcz1uLmRhdGEsYT10PnMubGVuZ3RoP3MubGVuZ3RoOnQ7aWYoYT09PXMubGVuZ3RoP28rPXM6bys9cy5zbGljZSgwLHQpLHQtPWEsdD09PTApe2E9PT1zLmxlbmd0aD8oKytpLG4ubmV4dD90aGlzLmhlYWQ9bi5uZXh0OnRoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCk6KHRoaXMuaGVhZD1uLG4uZGF0YT1zLnNsaWNlKGEpKTticmVha30rK2l9cmV0dXJuIHRoaXMubGVuZ3RoLT1pLG99fSx7a2V5OlwiX2dldEJ1ZmZlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPVd0LmFsbG9jVW5zYWZlKHQpLGk9dGhpcy5oZWFkLG89MTtmb3IoaS5kYXRhLmNvcHkobiksdC09aS5kYXRhLmxlbmd0aDtpPWkubmV4dDspe3ZhciBzPWkuZGF0YSxhPXQ+cy5sZW5ndGg/cy5sZW5ndGg6dDtpZihzLmNvcHkobixuLmxlbmd0aC10LDAsYSksdC09YSx0PT09MCl7YT09PXMubGVuZ3RoPygrK28saS5uZXh0P3RoaXMuaGVhZD1pLm5leHQ6dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsKToodGhpcy5oZWFkPWksaS5kYXRhPXMuc2xpY2UoYSkpO2JyZWFrfSsrb31yZXR1cm4gdGhpcy5sZW5ndGgtPW8sbn19LHtrZXk6cHUsdmFsdWU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbG4odGhpcyxhdSh7fSxuLHtkZXB0aDowLGN1c3RvbUluc3BlY3Q6ITF9KSl9fV0pLHJ9KCl9KTt2YXIgcG49UygoYmwsaW8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO2Z1bmN0aW9uIG11KHIsZSl7dmFyIHQ9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLGk9dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7cmV0dXJuIG58fGk/KGU/ZShyKTpyJiYodGhpcy5fd3JpdGFibGVTdGF0ZT90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZHx8KHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHByb2Nlc3MubmV4dFRpY2soZG4sdGhpcyxyKSk6cHJvY2Vzcy5uZXh0VGljayhkbix0aGlzLHIpKSx0aGlzKToodGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSEwKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX2Rlc3Ryb3kocnx8bnVsbCxmdW5jdGlvbihvKXshZSYmbz90Ll93cml0YWJsZVN0YXRlP3QuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkP3Byb2Nlc3MubmV4dFRpY2soJHQsdCk6KHQuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHByb2Nlc3MubmV4dFRpY2sobm8sdCxvKSk6cHJvY2Vzcy5uZXh0VGljayhubyx0LG8pOmU/KHByb2Nlc3MubmV4dFRpY2soJHQsdCksZShvKSk6cHJvY2Vzcy5uZXh0VGljaygkdCx0KX0pLHRoaXMpfWZ1bmN0aW9uIG5vKHIsZSl7ZG4ocixlKSwkdChyKX1mdW5jdGlvbiAkdChyKXtyLl93cml0YWJsZVN0YXRlJiYhci5fd3JpdGFibGVTdGF0ZS5lbWl0Q2xvc2V8fHIuX3JlYWRhYmxlU3RhdGUmJiFyLl9yZWFkYWJsZVN0YXRlLmVtaXRDbG9zZXx8ci5lbWl0KFwiY2xvc2VcIil9ZnVuY3Rpb24gZ3UoKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkPSExKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZz0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmFsQ2FsbGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMSl9ZnVuY3Rpb24gZG4ocixlKXtyLmVtaXQoXCJlcnJvclwiLGUpfWZ1bmN0aW9uIHl1KHIsZSl7dmFyIHQ9ci5fcmVhZGFibGVTdGF0ZSxuPXIuX3dyaXRhYmxlU3RhdGU7dCYmdC5hdXRvRGVzdHJveXx8biYmbi5hdXRvRGVzdHJveT9yLmRlc3Ryb3koZSk6ci5lbWl0KFwiZXJyb3JcIixlKX1pby5leHBvcnRzPXtkZXN0cm95Om11LHVuZGVzdHJveTpndSxlcnJvck9yRGVzdHJveTp5dX19KTt2YXIgVWU9UygoeGwsYW8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO2Z1bmN0aW9uIGJ1KHIsZSl7ci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksci5wcm90b3R5cGUuY29uc3RydWN0b3I9cixyLl9fcHJvdG9fXz1lfXZhciBzbz17fTtmdW5jdGlvbiBYKHIsZSx0KXt0fHwodD1FcnJvcik7ZnVuY3Rpb24gbihvLHMsYSl7cmV0dXJuIHR5cGVvZiBlPT1cInN0cmluZ1wiP2U6ZShvLHMsYSl9dmFyIGk9ZnVuY3Rpb24obyl7YnUocyxvKTtmdW5jdGlvbiBzKGEsdSxmKXtyZXR1cm4gby5jYWxsKHRoaXMsbihhLHUsZikpfHx0aGlzfXJldHVybiBzfSh0KTtpLnByb3RvdHlwZS5uYW1lPXQubmFtZSxpLnByb3RvdHlwZS5jb2RlPXIsc29bcl09aX1mdW5jdGlvbiBvbyhyLGUpe2lmKEFycmF5LmlzQXJyYXkocikpe3ZhciB0PXIubGVuZ3RoO3JldHVybiByPXIubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBTdHJpbmcobil9KSx0PjI/XCJvbmUgb2YgXCIuY29uY2F0KGUsXCIgXCIpLmNvbmNhdChyLnNsaWNlKDAsdC0xKS5qb2luKFwiLCBcIiksXCIsIG9yIFwiKStyW3QtMV06dD09PTI/XCJvbmUgb2YgXCIuY29uY2F0KGUsXCIgXCIpLmNvbmNhdChyWzBdLFwiIG9yIFwiKS5jb25jYXQoclsxXSk6XCJvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KHJbMF0pfWVsc2UgcmV0dXJuXCJvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KFN0cmluZyhyKSl9ZnVuY3Rpb24geHUocixlLHQpe3JldHVybiByLnN1YnN0cighdHx8dDwwPzA6K3QsZS5sZW5ndGgpPT09ZX1mdW5jdGlvbiBfdShyLGUsdCl7cmV0dXJuKHQ9PT12b2lkIDB8fHQ+ci5sZW5ndGgpJiYodD1yLmxlbmd0aCksci5zdWJzdHJpbmcodC1lLmxlbmd0aCx0KT09PWV9ZnVuY3Rpb24gd3UocixlLHQpe3JldHVybiB0eXBlb2YgdCE9XCJudW1iZXJcIiYmKHQ9MCksdCtlLmxlbmd0aD5yLmxlbmd0aD8hMTpyLmluZGV4T2YoZSx0KSE9PS0xfVgoXCJFUlJfSU5WQUxJRF9PUFRfVkFMVUVcIixmdW5jdGlvbihyLGUpe3JldHVybidUaGUgdmFsdWUgXCInK2UrJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcIicrcisnXCInfSxUeXBlRXJyb3IpO1goXCJFUlJfSU5WQUxJRF9BUkdfVFlQRVwiLGZ1bmN0aW9uKHIsZSx0KXt2YXIgbjt0eXBlb2YgZT09XCJzdHJpbmdcIiYmeHUoZSxcIm5vdCBcIik/KG49XCJtdXN0IG5vdCBiZVwiLGU9ZS5yZXBsYWNlKC9ebm90IC8sXCJcIikpOm49XCJtdXN0IGJlXCI7dmFyIGk7aWYoX3UocixcIiBhcmd1bWVudFwiKSlpPVwiVGhlIFwiLmNvbmNhdChyLFwiIFwiKS5jb25jYXQobixcIiBcIikuY29uY2F0KG9vKGUsXCJ0eXBlXCIpKTtlbHNle3ZhciBvPXd1KHIsXCIuXCIpP1wicHJvcGVydHlcIjpcImFyZ3VtZW50XCI7aT0nVGhlIFwiJy5jb25jYXQociwnXCIgJykuY29uY2F0KG8sXCIgXCIpLmNvbmNhdChuLFwiIFwiKS5jb25jYXQob28oZSxcInR5cGVcIikpfXJldHVybiBpKz1cIi4gUmVjZWl2ZWQgdHlwZSBcIi5jb25jYXQodHlwZW9mIHQpLGl9LFR5cGVFcnJvcik7WChcIkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0ZcIixcInN0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GXCIpO1goXCJFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRFwiLGZ1bmN0aW9uKHIpe3JldHVyblwiVGhlIFwiK3IrXCIgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZFwifSk7WChcIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFXCIsXCJQcmVtYXR1cmUgY2xvc2VcIik7WChcIkVSUl9TVFJFQU1fREVTVFJPWUVEXCIsZnVuY3Rpb24ocil7cmV0dXJuXCJDYW5ub3QgY2FsbCBcIityK1wiIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWRcIn0pO1goXCJFUlJfTVVMVElQTEVfQ0FMTEJBQ0tcIixcIkNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lc1wiKTtYKFwiRVJSX1NUUkVBTV9DQU5OT1RfUElQRVwiLFwiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZVwiKTtYKFwiRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkRcIixcIndyaXRlIGFmdGVyIGVuZFwiKTtYKFwiRVJSX1NUUkVBTV9OVUxMX1ZBTFVFU1wiLFwiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW1cIixUeXBlRXJyb3IpO1goXCJFUlJfVU5LTk9XTl9FTkNPRElOR1wiLGZ1bmN0aW9uKHIpe3JldHVyblwiVW5rbm93biBlbmNvZGluZzogXCIrcn0sVHlwZUVycm9yKTtYKFwiRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVFwiLFwic3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnRcIik7YW8uZXhwb3J0cy5jb2Rlcz1zb30pO3ZhciBobj1TKChfbCx1byk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIHZ1PVVlKCkuY29kZXMuRVJSX0lOVkFMSURfT1BUX1ZBTFVFO2Z1bmN0aW9uIEV1KHIsZSx0KXtyZXR1cm4gci5oaWdoV2F0ZXJNYXJrIT1udWxsP3IuaGlnaFdhdGVyTWFyazplP3JbdF06bnVsbH1mdW5jdGlvbiBTdShyLGUsdCxuKXt2YXIgaT1FdShlLG4sdCk7aWYoaSE9bnVsbCl7aWYoIShpc0Zpbml0ZShpKSYmTWF0aC5mbG9vcihpKT09PWkpfHxpPDApe3ZhciBvPW4/dDpcImhpZ2hXYXRlck1hcmtcIjt0aHJvdyBuZXcgdnUobyxpKX1yZXR1cm4gTWF0aC5mbG9vcihpKX1yZXR1cm4gci5vYmplY3RNb2RlPzE2OjE2KjEwMjR9dW8uZXhwb3J0cz17Z2V0SGlnaFdhdGVyTWFyazpTdX19KTt2YXIgY289Uygod2wsZm8pPT57YygpO2ZvLmV4cG9ydHM9UnU7ZnVuY3Rpb24gUnUocixlKXtpZihtbihcIm5vRGVwcmVjYXRpb25cIikpcmV0dXJuIHI7dmFyIHQ9ITE7ZnVuY3Rpb24gbigpe2lmKCF0KXtpZihtbihcInRocm93RGVwcmVjYXRpb25cIikpdGhyb3cgbmV3IEVycm9yKGUpO21uKFwidHJhY2VEZXByZWNhdGlvblwiKT9jb25zb2xlLnRyYWNlKGUpOmNvbnNvbGUud2FybihlKSx0PSEwfXJldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn1mdW5jdGlvbiBtbihyKXt0cnl7aWYoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpcmV0dXJuITF9Y2F0Y2h7cmV0dXJuITF9dmFyIGU9Z2xvYmFsLmxvY2FsU3RvcmFnZVtyXTtyZXR1cm4gZT09bnVsbD8hMTpTdHJpbmcoZSkudG9Mb3dlckNhc2UoKT09PVwidHJ1ZVwifX0pO3ZhciBibj1TKCh2bCx5byk9PntcInVzZSBzdHJpY3RcIjtjKCk7eW8uZXhwb3J0cz1GO2Z1bmN0aW9uIHBvKHIpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKCl7UXUoZSxyKX19dmFyIGV0O0YuV3JpdGFibGVTdGF0ZT1FdDt2YXIgVHU9e2RlcHJlY2F0ZTpjbygpfSxobz1mbigpLFZ0PVhlKCkuQnVmZmVyLEN1PWdsb2JhbC5VaW50OEFycmF5fHxmdW5jdGlvbigpe307ZnVuY3Rpb24gQnUocil7cmV0dXJuIFZ0LmZyb20ocil9ZnVuY3Rpb24gTXUocil7cmV0dXJuIFZ0LmlzQnVmZmVyKHIpfHxyIGluc3RhbmNlb2YgQ3V9dmFyIHluPXBuKCksTHU9aG4oKSxJdT1MdS5nZXRIaWdoV2F0ZXJNYXJrLHhlPVVlKCkuY29kZXMsQXU9eGUuRVJSX0lOVkFMSURfQVJHX1RZUEUsRnU9eGUuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsUHU9eGUuRVJSX01VTFRJUExFX0NBTExCQUNLLGt1PXhlLkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsT3U9eGUuRVJSX1NUUkVBTV9ERVNUUk9ZRUQsVXU9eGUuRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUyxEdT14ZS5FUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCxOdT14ZS5FUlJfVU5LTk9XTl9FTkNPRElORyx0dD15bi5lcnJvck9yRGVzdHJveTtPZSgpKEYsaG8pO2Z1bmN0aW9uIEh1KCl7fWZ1bmN0aW9uIEV0KHIsZSx0KXtldD1ldHx8RGUoKSxyPXJ8fHt9LHR5cGVvZiB0IT1cImJvb2xlYW5cIiYmKHQ9ZSBpbnN0YW5jZW9mIGV0KSx0aGlzLm9iamVjdE1vZGU9ISFyLm9iamVjdE1vZGUsdCYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhci53cml0YWJsZU9iamVjdE1vZGUpLHRoaXMuaGlnaFdhdGVyTWFyaz1JdSh0aGlzLHIsXCJ3cml0YWJsZUhpZ2hXYXRlck1hcmtcIix0KSx0aGlzLmZpbmFsQ2FsbGVkPSExLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMTt2YXIgbj1yLmRlY29kZVN0cmluZ3M9PT0hMTt0aGlzLmRlY29kZVN0cmluZ3M9IW4sdGhpcy5kZWZhdWx0RW5jb2Rpbmc9ci5kZWZhdWx0RW5jb2Rpbmd8fFwidXRmOFwiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24oaSl7enUoZSxpKX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuZW1pdENsb3NlPXIuZW1pdENsb3NlIT09ITEsdGhpcy5hdXRvRGVzdHJveT0hIXIuYXV0b0Rlc3Ryb3ksdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBwbyh0aGlzKX1FdC5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuYnVmZmVyZWRSZXF1ZXN0LHQ9W107ZTspdC5wdXNoKGUpLGU9ZS5uZXh0O3JldHVybiB0fTsoZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEV0LnByb3RvdHlwZSxcImJ1ZmZlclwiLHtnZXQ6VHUuZGVwcmVjYXRlKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9LFwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC5cIixcIkRFUDAwMDNcIil9KX1jYXRjaHt9fSkoKTt2YXIgR3Q7dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZTeW1ib2wuaGFzSW5zdGFuY2UmJnR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXT09XCJmdW5jdGlvblwiPyhHdD1GdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRixTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBHdC5jYWxsKHRoaXMsZSk/ITA6dGhpcyE9PUY/ITE6ZSYmZS5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIEV0fX0pKTpHdD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHRoaXN9O2Z1bmN0aW9uIEYocil7ZXQ9ZXR8fERlKCk7dmFyIGU9dGhpcyBpbnN0YW5jZW9mIGV0O2lmKCFlJiYhR3QuY2FsbChGLHRoaXMpKXJldHVybiBuZXcgRihyKTt0aGlzLl93cml0YWJsZVN0YXRlPW5ldyBFdChyLHRoaXMsZSksdGhpcy53cml0YWJsZT0hMCxyJiYodHlwZW9mIHIud3JpdGU9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX3dyaXRlPXIud3JpdGUpLHR5cGVvZiByLndyaXRldj09XCJmdW5jdGlvblwiJiYodGhpcy5fd3JpdGV2PXIud3JpdGV2KSx0eXBlb2Ygci5kZXN0cm95PT1cImZ1bmN0aW9uXCImJih0aGlzLl9kZXN0cm95PXIuZGVzdHJveSksdHlwZW9mIHIuZmluYWw9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX2ZpbmFsPXIuZmluYWwpKSxoby5jYWxsKHRoaXMpfUYucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0dCh0aGlzLG5ldyBrdSl9O2Z1bmN0aW9uIHF1KHIsZSl7dmFyIHQ9bmV3IER1O3R0KHIsdCkscHJvY2Vzcy5uZXh0VGljayhlLHQpfWZ1bmN0aW9uIGp1KHIsZSx0LG4pe3ZhciBpO3JldHVybiB0PT09bnVsbD9pPW5ldyBVdTp0eXBlb2YgdCE9XCJzdHJpbmdcIiYmIWUub2JqZWN0TW9kZSYmKGk9bmV3IEF1KFwiY2h1bmtcIixbXCJzdHJpbmdcIixcIkJ1ZmZlclwiXSx0KSksaT8odHQocixpKSxwcm9jZXNzLm5leHRUaWNrKG4saSksITEpOiEwfUYucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHIsZSx0KXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlLGk9ITEsbz0hbi5vYmplY3RNb2RlJiZNdShyKTtyZXR1cm4gbyYmIVZ0LmlzQnVmZmVyKHIpJiYocj1CdShyKSksdHlwZW9mIGU9PVwiZnVuY3Rpb25cIiYmKHQ9ZSxlPW51bGwpLG8/ZT1cImJ1ZmZlclwiOmV8fChlPW4uZGVmYXVsdEVuY29kaW5nKSx0eXBlb2YgdCE9XCJmdW5jdGlvblwiJiYodD1IdSksbi5lbmRpbmc/cXUodGhpcyx0KToob3x8anUodGhpcyxuLHIsdCkpJiYobi5wZW5kaW5nY2IrKyxpPSR1KHRoaXMsbixvLHIsZSx0KSksaX07Ri5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9O0YucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciByPXRoaXMuX3dyaXRhYmxlU3RhdGU7ci5jb3JrZWQmJihyLmNvcmtlZC0tLCFyLndyaXRpbmcmJiFyLmNvcmtlZCYmIXIuYnVmZmVyUHJvY2Vzc2luZyYmci5idWZmZXJlZFJlcXVlc3QmJm1vKHRoaXMscikpfTtGLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PVwic3RyaW5nXCImJihlPWUudG9Mb3dlckNhc2UoKSksIShbXCJoZXhcIixcInV0ZjhcIixcInV0Zi04XCIsXCJhc2NpaVwiLFwiYmluYXJ5XCIsXCJiYXNlNjRcIixcInVjczJcIixcInVjcy0yXCIsXCJ1dGYxNmxlXCIsXCJ1dGYtMTZsZVwiLFwicmF3XCJdLmluZGV4T2YoKGUrXCJcIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBOdShlKTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9ZSx0aGlzfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsXCJ3cml0YWJsZUJ1ZmZlclwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpfX0pO2Z1bmN0aW9uIFd1KHIsZSx0KXtyZXR1cm4hci5vYmplY3RNb2RlJiZyLmRlY29kZVN0cmluZ3MhPT0hMSYmdHlwZW9mIGU9PVwic3RyaW5nXCImJihlPVZ0LmZyb20oZSx0KSksZX1PYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsXCJ3cml0YWJsZUhpZ2hXYXRlck1hcmtcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pO2Z1bmN0aW9uICR1KHIsZSx0LG4saSxvKXtpZighdCl7dmFyIHM9V3UoZSxuLGkpO24hPT1zJiYodD0hMCxpPVwiYnVmZmVyXCIsbj1zKX12YXIgYT1lLm9iamVjdE1vZGU/MTpuLmxlbmd0aDtlLmxlbmd0aCs9YTt2YXIgdT1lLmxlbmd0aDxlLmhpZ2hXYXRlck1hcms7aWYodXx8KGUubmVlZERyYWluPSEwKSxlLndyaXRpbmd8fGUuY29ya2VkKXt2YXIgZj1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q7ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PXtjaHVuazpuLGVuY29kaW5nOmksaXNCdWY6dCxjYWxsYmFjazpvLG5leHQ6bnVsbH0sZj9mLm5leHQ9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OmUuYnVmZmVyZWRSZXF1ZXN0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgZ24ocixlLCExLGEsbixpLG8pO3JldHVybiB1fWZ1bmN0aW9uIGduKHIsZSx0LG4saSxvLHMpe2Uud3JpdGVsZW49bixlLndyaXRlY2I9cyxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLGUuZGVzdHJveWVkP2Uub253cml0ZShuZXcgT3UoXCJ3cml0ZVwiKSk6dD9yLl93cml0ZXYoaSxlLm9ud3JpdGUpOnIuX3dyaXRlKGksbyxlLm9ud3JpdGUpLGUuc3luYz0hMX1mdW5jdGlvbiBHdShyLGUsdCxuLGkpey0tZS5wZW5kaW5nY2IsdD8ocHJvY2Vzcy5uZXh0VGljayhpLG4pLHByb2Nlc3MubmV4dFRpY2sodnQscixlKSxyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0dChyLG4pKTooaShuKSxyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0dChyLG4pLHZ0KHIsZSkpfWZ1bmN0aW9uIFZ1KHIpe3Iud3JpdGluZz0hMSxyLndyaXRlY2I9bnVsbCxyLmxlbmd0aC09ci53cml0ZWxlbixyLndyaXRlbGVuPTB9ZnVuY3Rpb24genUocixlKXt2YXIgdD1yLl93cml0YWJsZVN0YXRlLG49dC5zeW5jLGk9dC53cml0ZWNiO2lmKHR5cGVvZiBpIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IFB1O2lmKFZ1KHQpLGUpR3Uocix0LG4sZSxpKTtlbHNle3ZhciBvPWdvKHQpfHxyLmRlc3Ryb3llZDshbyYmIXQuY29ya2VkJiYhdC5idWZmZXJQcm9jZXNzaW5nJiZ0LmJ1ZmZlcmVkUmVxdWVzdCYmbW8ocix0KSxuP3Byb2Nlc3MubmV4dFRpY2sobG8scix0LG8saSk6bG8ocix0LG8saSl9fWZ1bmN0aW9uIGxvKHIsZSx0LG4pe3R8fFl1KHIsZSksZS5wZW5kaW5nY2ItLSxuKCksdnQocixlKX1mdW5jdGlvbiBZdShyLGUpe2UubGVuZ3RoPT09MCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSxyLmVtaXQoXCJkcmFpblwiKSl9ZnVuY3Rpb24gbW8ocixlKXtlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIHQ9ZS5idWZmZXJlZFJlcXVlc3Q7aWYoci5fd3JpdGV2JiZ0JiZ0Lm5leHQpe3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsaT1uZXcgQXJyYXkobiksbz1lLmNvcmtlZFJlcXVlc3RzRnJlZTtvLmVudHJ5PXQ7Zm9yKHZhciBzPTAsYT0hMDt0OylpW3NdPXQsdC5pc0J1Znx8KGE9ITEpLHQ9dC5uZXh0LHMrPTE7aS5hbGxCdWZmZXJzPWEsZ24ocixlLCEwLGUubGVuZ3RoLGksXCJcIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IHBvKGUpLGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MH1lbHNle2Zvcig7dDspe3ZhciB1PXQuY2h1bmssZj10LmVuY29kaW5nLGw9dC5jYWxsYmFjayxkPWUub2JqZWN0TW9kZT8xOnUubGVuZ3RoO2lmKGduKHIsZSwhMSxkLHUsZixsKSx0PXQubmV4dCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS0sZS53cml0aW5nKWJyZWFrfXQ9PT1udWxsJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0PXQsZS5idWZmZXJQcm9jZXNzaW5nPSExfUYucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihyLGUsdCl7dChuZXcgRnUoXCJfd3JpdGUoKVwiKSl9O0YucHJvdG90eXBlLl93cml0ZXY9bnVsbDtGLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24ocixlLHQpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGU7cmV0dXJuIHR5cGVvZiByPT1cImZ1bmN0aW9uXCI/KHQ9cixyPW51bGwsZT1udWxsKTp0eXBlb2YgZT09XCJmdW5jdGlvblwiJiYodD1lLGU9bnVsbCksciE9bnVsbCYmdGhpcy53cml0ZShyLGUpLG4uY29ya2VkJiYobi5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxuLmVuZGluZ3x8SnUodGhpcyxuLHQpLHRoaXN9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcIndyaXRhYmxlTGVuZ3RoXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RofX0pO2Z1bmN0aW9uIGdvKHIpe3JldHVybiByLmVuZGluZyYmci5sZW5ndGg9PT0wJiZyLmJ1ZmZlcmVkUmVxdWVzdD09PW51bGwmJiFyLmZpbmlzaGVkJiYhci53cml0aW5nfWZ1bmN0aW9uIEt1KHIsZSl7ci5fZmluYWwoZnVuY3Rpb24odCl7ZS5wZW5kaW5nY2ItLSx0JiZ0dChyLHQpLGUucHJlZmluaXNoZWQ9ITAsci5lbWl0KFwicHJlZmluaXNoXCIpLHZ0KHIsZSl9KX1mdW5jdGlvbiBYdShyLGUpeyFlLnByZWZpbmlzaGVkJiYhZS5maW5hbENhbGxlZCYmKHR5cGVvZiByLl9maW5hbD09XCJmdW5jdGlvblwiJiYhZS5kZXN0cm95ZWQ/KGUucGVuZGluZ2NiKyssZS5maW5hbENhbGxlZD0hMCxwcm9jZXNzLm5leHRUaWNrKEt1LHIsZSkpOihlLnByZWZpbmlzaGVkPSEwLHIuZW1pdChcInByZWZpbmlzaFwiKSkpfWZ1bmN0aW9uIHZ0KHIsZSl7dmFyIHQ9Z28oZSk7aWYodCYmKFh1KHIsZSksZS5wZW5kaW5nY2I9PT0wJiYoZS5maW5pc2hlZD0hMCxyLmVtaXQoXCJmaW5pc2hcIiksZS5hdXRvRGVzdHJveSkpKXt2YXIgbj1yLl9yZWFkYWJsZVN0YXRlOyghbnx8bi5hdXRvRGVzdHJveSYmbi5lbmRFbWl0dGVkKSYmci5kZXN0cm95KCl9cmV0dXJuIHR9ZnVuY3Rpb24gSnUocixlLHQpe2UuZW5kaW5nPSEwLHZ0KHIsZSksdCYmKGUuZmluaXNoZWQ/cHJvY2Vzcy5uZXh0VGljayh0KTpyLm9uY2UoXCJmaW5pc2hcIix0KSksZS5lbmRlZD0hMCxyLndyaXRhYmxlPSExfWZ1bmN0aW9uIFF1KHIsZSx0KXt2YXIgbj1yLmVudHJ5O2ZvcihyLmVudHJ5PW51bGw7bjspe3ZhciBpPW4uY2FsbGJhY2s7ZS5wZW5kaW5nY2ItLSxpKHQpLG49bi5uZXh0fWUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9cn1PYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsXCJkZXN0cm95ZWRcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZT09PXZvaWQgMD8hMTp0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKGUpeyF0aGlzLl93cml0YWJsZVN0YXRlfHwodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSk7Ri5wcm90b3R5cGUuZGVzdHJveT15bi5kZXN0cm95O0YucHJvdG90eXBlLl91bmRlc3Ryb3k9eW4udW5kZXN0cm95O0YucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHIsZSl7ZShyKX19KTt2YXIgRGU9UygoRWwseG8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBadT1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ocil7dmFyIGU9W107Zm9yKHZhciB0IGluIHIpZS5wdXNoKHQpO3JldHVybiBlfTt4by5leHBvcnRzPWFlO3ZhciBibz13bigpLF9uPWJuKCk7T2UoKShhZSxibyk7Zm9yKHhuPVp1KF9uLnByb3RvdHlwZSksenQ9MDt6dDx4bi5sZW5ndGg7enQrKylZdD14blt6dF0sYWUucHJvdG90eXBlW1l0XXx8KGFlLnByb3RvdHlwZVtZdF09X24ucHJvdG90eXBlW1l0XSk7dmFyIHhuLFl0LHp0O2Z1bmN0aW9uIGFlKHIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGFlKSlyZXR1cm4gbmV3IGFlKHIpO2JvLmNhbGwodGhpcyxyKSxfbi5jYWxsKHRoaXMsciksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHImJihyLnJlYWRhYmxlPT09ITEmJih0aGlzLnJlYWRhYmxlPSExKSxyLndyaXRhYmxlPT09ITEmJih0aGlzLndyaXRhYmxlPSExKSxyLmFsbG93SGFsZk9wZW49PT0hMSYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSx0aGlzLm9uY2UoXCJlbmRcIixlZikpKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoYWUucHJvdG90eXBlLFwid3JpdGFibGVIaWdoV2F0ZXJNYXJrXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYWUucHJvdG90eXBlLFwid3JpdGFibGVCdWZmZXJcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYWUucHJvdG90eXBlLFwid3JpdGFibGVMZW5ndGhcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGh9fSk7ZnVuY3Rpb24gZWYoKXt0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxwcm9jZXNzLm5leHRUaWNrKHRmLHRoaXMpfWZ1bmN0aW9uIHRmKHIpe3IuZW5kKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGFlLnByb3RvdHlwZSxcImRlc3Ryb3llZFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlPT09dm9pZCAwfHx0aGlzLl93cml0YWJsZVN0YXRlPT09dm9pZCAwPyExOnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3JlYWRhYmxlU3RhdGU9PT12b2lkIDB8fHRoaXMuX3dyaXRhYmxlU3RhdGU9PT12b2lkIDB8fCh0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD1lLHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPWUpfX0pfSk7dmFyIHZvPVMoKHZuLHdvKT0+e2MoKTt2YXIgS3Q9WGUoKSx1ZT1LdC5CdWZmZXI7ZnVuY3Rpb24gX28ocixlKXtmb3IodmFyIHQgaW4gcillW3RdPXJbdF19dWUuZnJvbSYmdWUuYWxsb2MmJnVlLmFsbG9jVW5zYWZlJiZ1ZS5hbGxvY1Vuc2FmZVNsb3c/d28uZXhwb3J0cz1LdDooX28oS3Qsdm4pLHZuLkJ1ZmZlcj1OZSk7ZnVuY3Rpb24gTmUocixlLHQpe3JldHVybiB1ZShyLGUsdCl9TmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodWUucHJvdG90eXBlKTtfbyh1ZSxOZSk7TmUuZnJvbT1mdW5jdGlvbihyLGUsdCl7aWYodHlwZW9mIHI9PVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyXCIpO3JldHVybiB1ZShyLGUsdCl9O05lLmFsbG9jPWZ1bmN0aW9uKHIsZSx0KXtpZih0eXBlb2YgciE9XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlclwiKTt2YXIgbj11ZShyKTtyZXR1cm4gZSE9PXZvaWQgMD90eXBlb2YgdD09XCJzdHJpbmdcIj9uLmZpbGwoZSx0KTpuLmZpbGwoZSk6bi5maWxsKDApLG59O05lLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyXCIpO3JldHVybiB1ZShyKX07TmUuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyXCIpO3JldHVybiBLdC5TbG93QnVmZmVyKHIpfX0pO3ZhciBSbj1TKFNvPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBTbj12bygpLkJ1ZmZlcixFbz1Tbi5pc0VuY29kaW5nfHxmdW5jdGlvbihyKXtzd2l0Y2gocj1cIlwiK3IsciYmci50b0xvd2VyQ2FzZSgpKXtjYXNlXCJoZXhcIjpjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpjYXNlXCJhc2NpaVwiOmNhc2VcImJpbmFyeVwiOmNhc2VcImJhc2U2NFwiOmNhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOmNhc2VcInJhd1wiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiByZihyKXtpZighcilyZXR1cm5cInV0ZjhcIjtmb3IodmFyIGU7Oylzd2l0Y2gocil7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuXCJ1dGY4XCI7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuXCJ1dGYxNmxlXCI7Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuXCJsYXRpbjFcIjtjYXNlXCJiYXNlNjRcIjpjYXNlXCJhc2NpaVwiOmNhc2VcImhleFwiOnJldHVybiByO2RlZmF1bHQ6aWYoZSlyZXR1cm47cj0oXCJcIityKS50b0xvd2VyQ2FzZSgpLGU9ITB9fWZ1bmN0aW9uIG5mKHIpe3ZhciBlPXJmKHIpO2lmKHR5cGVvZiBlIT1cInN0cmluZ1wiJiYoU24uaXNFbmNvZGluZz09PUVvfHwhRW8ocikpKXRocm93IG5ldyBFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK3IpO3JldHVybiBlfHxyfVNvLlN0cmluZ0RlY29kZXI9U3Q7ZnVuY3Rpb24gU3Qocil7dGhpcy5lbmNvZGluZz1uZihyKTt2YXIgZTtzd2l0Y2godGhpcy5lbmNvZGluZyl7Y2FzZVwidXRmMTZsZVwiOnRoaXMudGV4dD1jZix0aGlzLmVuZD1sZixlPTQ7YnJlYWs7Y2FzZVwidXRmOFwiOnRoaXMuZmlsbExhc3Q9YWYsZT00O2JyZWFrO2Nhc2VcImJhc2U2NFwiOnRoaXMudGV4dD1kZix0aGlzLmVuZD1wZixlPTM7YnJlYWs7ZGVmYXVsdDp0aGlzLndyaXRlPWhmLHRoaXMuZW5kPW1mO3JldHVybn10aGlzLmxhc3ROZWVkPTAsdGhpcy5sYXN0VG90YWw9MCx0aGlzLmxhc3RDaGFyPVNuLmFsbG9jVW5zYWZlKGUpfVN0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihyKXtpZihyLmxlbmd0aD09PTApcmV0dXJuXCJcIjt2YXIgZSx0O2lmKHRoaXMubGFzdE5lZWQpe2lmKGU9dGhpcy5maWxsTGFzdChyKSxlPT09dm9pZCAwKXJldHVyblwiXCI7dD10aGlzLmxhc3ROZWVkLHRoaXMubGFzdE5lZWQ9MH1lbHNlIHQ9MDtyZXR1cm4gdDxyLmxlbmd0aD9lP2UrdGhpcy50ZXh0KHIsdCk6dGhpcy50ZXh0KHIsdCk6ZXx8XCJcIn07U3QucHJvdG90eXBlLmVuZD1mZjtTdC5wcm90b3R5cGUudGV4dD11ZjtTdC5wcm90b3R5cGUuZmlsbExhc3Q9ZnVuY3Rpb24ocil7aWYodGhpcy5sYXN0TmVlZDw9ci5sZW5ndGgpcmV0dXJuIHIuY29weSh0aGlzLmxhc3RDaGFyLHRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCk7ci5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHIubGVuZ3RoKSx0aGlzLmxhc3ROZWVkLT1yLmxlbmd0aH07ZnVuY3Rpb24gRW4ocil7cmV0dXJuIHI8PTEyNz8wOnI+PjU9PT02PzI6cj4+ND09PTE0PzM6cj4+Mz09PTMwPzQ6cj4+Nj09PTI/LTE6LTJ9ZnVuY3Rpb24gb2YocixlLHQpe3ZhciBuPWUubGVuZ3RoLTE7aWYobjx0KXJldHVybiAwO3ZhciBpPUVuKGVbbl0pO3JldHVybiBpPj0wPyhpPjAmJihyLmxhc3ROZWVkPWktMSksaSk6LS1uPHR8fGk9PT0tMj8wOihpPUVuKGVbbl0pLGk+PTA/KGk+MCYmKHIubGFzdE5lZWQ9aS0yKSxpKTotLW48dHx8aT09PS0yPzA6KGk9RW4oZVtuXSksaT49MD8oaT4wJiYoaT09PTI/aT0wOnIubGFzdE5lZWQ9aS0zKSxpKTowKSl9ZnVuY3Rpb24gc2YocixlLHQpe2lmKChlWzBdJjE5MikhPT0xMjgpcmV0dXJuIHIubGFzdE5lZWQ9MCxcIlxcdUZGRkRcIjtpZihyLmxhc3ROZWVkPjEmJmUubGVuZ3RoPjEpe2lmKChlWzFdJjE5MikhPT0xMjgpcmV0dXJuIHIubGFzdE5lZWQ9MSxcIlxcdUZGRkRcIjtpZihyLmxhc3ROZWVkPjImJmUubGVuZ3RoPjImJihlWzJdJjE5MikhPT0xMjgpcmV0dXJuIHIubGFzdE5lZWQ9MixcIlxcdUZGRkRcIn19ZnVuY3Rpb24gYWYocil7dmFyIGU9dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCx0PXNmKHRoaXMscixlKTtpZih0IT09dm9pZCAwKXJldHVybiB0O2lmKHRoaXMubGFzdE5lZWQ8PXIubGVuZ3RoKXJldHVybiByLmNvcHkodGhpcy5sYXN0Q2hhcixlLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpO3IuY29weSh0aGlzLmxhc3RDaGFyLGUsMCxyLmxlbmd0aCksdGhpcy5sYXN0TmVlZC09ci5sZW5ndGh9ZnVuY3Rpb24gdWYocixlKXt2YXIgdD1vZih0aGlzLHIsZSk7aWYoIXRoaXMubGFzdE5lZWQpcmV0dXJuIHIudG9TdHJpbmcoXCJ1dGY4XCIsZSk7dGhpcy5sYXN0VG90YWw9dDt2YXIgbj1yLmxlbmd0aC0odC10aGlzLmxhc3ROZWVkKTtyZXR1cm4gci5jb3B5KHRoaXMubGFzdENoYXIsMCxuKSxyLnRvU3RyaW5nKFwidXRmOFwiLGUsbil9ZnVuY3Rpb24gZmYocil7dmFyIGU9ciYmci5sZW5ndGg/dGhpcy53cml0ZShyKTpcIlwiO3JldHVybiB0aGlzLmxhc3ROZWVkP2UrXCJcXHVGRkZEXCI6ZX1mdW5jdGlvbiBjZihyLGUpe2lmKChyLmxlbmd0aC1lKSUyPT09MCl7dmFyIHQ9ci50b1N0cmluZyhcInV0ZjE2bGVcIixlKTtpZih0KXt2YXIgbj10LmNoYXJDb2RlQXQodC5sZW5ndGgtMSk7aWYobj49NTUyOTYmJm48PTU2MzE5KXJldHVybiB0aGlzLmxhc3ROZWVkPTIsdGhpcy5sYXN0VG90YWw9NCx0aGlzLmxhc3RDaGFyWzBdPXJbci5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT1yW3IubGVuZ3RoLTFdLHQuc2xpY2UoMCwtMSl9cmV0dXJuIHR9cmV0dXJuIHRoaXMubGFzdE5lZWQ9MSx0aGlzLmxhc3RUb3RhbD0yLHRoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0xXSxyLnRvU3RyaW5nKFwidXRmMTZsZVwiLGUsci5sZW5ndGgtMSl9ZnVuY3Rpb24gbGYocil7dmFyIGU9ciYmci5sZW5ndGg/dGhpcy53cml0ZShyKTpcIlwiO2lmKHRoaXMubGFzdE5lZWQpe3ZhciB0PXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQ7cmV0dXJuIGUrdGhpcy5sYXN0Q2hhci50b1N0cmluZyhcInV0ZjE2bGVcIiwwLHQpfXJldHVybiBlfWZ1bmN0aW9uIGRmKHIsZSl7dmFyIHQ9KHIubGVuZ3RoLWUpJTM7cmV0dXJuIHQ9PT0wP3IudG9TdHJpbmcoXCJiYXNlNjRcIixlKToodGhpcy5sYXN0TmVlZD0zLXQsdGhpcy5sYXN0VG90YWw9Myx0PT09MT90aGlzLmxhc3RDaGFyWzBdPXJbci5sZW5ndGgtMV06KHRoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXJbci5sZW5ndGgtMV0pLHIudG9TdHJpbmcoXCJiYXNlNjRcIixlLHIubGVuZ3RoLXQpKX1mdW5jdGlvbiBwZihyKXt2YXIgZT1yJiZyLmxlbmd0aD90aGlzLndyaXRlKHIpOlwiXCI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZSt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKFwiYmFzZTY0XCIsMCwzLXRoaXMubGFzdE5lZWQpOmV9ZnVuY3Rpb24gaGYocil7cmV0dXJuIHIudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gbWYocil7cmV0dXJuIHImJnIubGVuZ3RoP3RoaXMud3JpdGUocik6XCJcIn19KTt2YXIgWHQ9UygoUmwsQ28pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBSbz1VZSgpLmNvZGVzLkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFO2Z1bmN0aW9uIGdmKHIpe3ZhciBlPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFlKXtlPSEwO2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQpLGk9MDtpPHQ7aSsrKW5baV09YXJndW1lbnRzW2ldO3IuYXBwbHkodGhpcyxuKX19fWZ1bmN0aW9uIHlmKCl7fWZ1bmN0aW9uIGJmKHIpe3JldHVybiByLnNldEhlYWRlciYmdHlwZW9mIHIuYWJvcnQ9PVwiZnVuY3Rpb25cIn1mdW5jdGlvbiBUbyhyLGUsdCl7aWYodHlwZW9mIGU9PVwiZnVuY3Rpb25cIilyZXR1cm4gVG8ocixudWxsLGUpO2V8fChlPXt9KSx0PWdmKHR8fHlmKTt2YXIgbj1lLnJlYWRhYmxlfHxlLnJlYWRhYmxlIT09ITEmJnIucmVhZGFibGUsaT1lLndyaXRhYmxlfHxlLndyaXRhYmxlIT09ITEmJnIud3JpdGFibGUsbz1mdW5jdGlvbigpe3Iud3JpdGFibGV8fGEoKX0scz1yLl93cml0YWJsZVN0YXRlJiZyLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkLGE9ZnVuY3Rpb24oKXtpPSExLHM9ITAsbnx8dC5jYWxsKHIpfSx1PXIuX3JlYWRhYmxlU3RhdGUmJnIuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCxmPWZ1bmN0aW9uKCl7bj0hMSx1PSEwLGl8fHQuY2FsbChyKX0sbD1mdW5jdGlvbihiKXt0LmNhbGwocixiKX0sZD1mdW5jdGlvbigpe3ZhciBiO2lmKG4mJiF1KXJldHVybighci5fcmVhZGFibGVTdGF0ZXx8IXIuX3JlYWRhYmxlU3RhdGUuZW5kZWQpJiYoYj1uZXcgUm8pLHQuY2FsbChyLGIpO2lmKGkmJiFzKXJldHVybighci5fd3JpdGFibGVTdGF0ZXx8IXIuX3dyaXRhYmxlU3RhdGUuZW5kZWQpJiYoYj1uZXcgUm8pLHQuY2FsbChyLGIpfSxoPWZ1bmN0aW9uKCl7ci5yZXEub24oXCJmaW5pc2hcIixhKX07cmV0dXJuIGJmKHIpPyhyLm9uKFwiY29tcGxldGVcIixhKSxyLm9uKFwiYWJvcnRcIixkKSxyLnJlcT9oKCk6ci5vbihcInJlcXVlc3RcIixoKSk6aSYmIXIuX3dyaXRhYmxlU3RhdGUmJihyLm9uKFwiZW5kXCIsbyksci5vbihcImNsb3NlXCIsbykpLHIub24oXCJlbmRcIixmKSxyLm9uKFwiZmluaXNoXCIsYSksZS5lcnJvciE9PSExJiZyLm9uKFwiZXJyb3JcIixsKSxyLm9uKFwiY2xvc2VcIixkKSxmdW5jdGlvbigpe3IucmVtb3ZlTGlzdGVuZXIoXCJjb21wbGV0ZVwiLGEpLHIucmVtb3ZlTGlzdGVuZXIoXCJhYm9ydFwiLGQpLHIucmVtb3ZlTGlzdGVuZXIoXCJyZXF1ZXN0XCIsaCksci5yZXEmJnIucmVxLnJlbW92ZUxpc3RlbmVyKFwiZmluaXNoXCIsYSksci5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLG8pLHIucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLG8pLHIucmVtb3ZlTGlzdGVuZXIoXCJmaW5pc2hcIixhKSxyLnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsZiksci5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsbCksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsZCl9fUNvLmV4cG9ydHM9VG99KTt2YXIgTW89UygoVGwsQm8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBKdDtmdW5jdGlvbiBfZShyLGUsdCl7cmV0dXJuIGUgaW4gcj9PYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHt2YWx1ZTp0LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6cltlXT10LHJ9dmFyIHhmPVh0KCksd2U9U3ltYm9sKFwibGFzdFJlc29sdmVcIiksSGU9U3ltYm9sKFwibGFzdFJlamVjdFwiKSxSdD1TeW1ib2woXCJlcnJvclwiKSxRdD1TeW1ib2woXCJlbmRlZFwiKSxxZT1TeW1ib2woXCJsYXN0UHJvbWlzZVwiKSxUbj1TeW1ib2woXCJoYW5kbGVQcm9taXNlXCIpLGplPVN5bWJvbChcInN0cmVhbVwiKTtmdW5jdGlvbiB2ZShyLGUpe3JldHVybnt2YWx1ZTpyLGRvbmU6ZX19ZnVuY3Rpb24gX2Yocil7dmFyIGU9clt3ZV07aWYoZSE9PW51bGwpe3ZhciB0PXJbamVdLnJlYWQoKTt0IT09bnVsbCYmKHJbcWVdPW51bGwsclt3ZV09bnVsbCxyW0hlXT1udWxsLGUodmUodCwhMSkpKX19ZnVuY3Rpb24gd2Yocil7cHJvY2Vzcy5uZXh0VGljayhfZixyKX1mdW5jdGlvbiB2ZihyLGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3IudGhlbihmdW5jdGlvbigpe2lmKGVbUXRdKXt0KHZlKHZvaWQgMCwhMCkpO3JldHVybn1lW1RuXSh0LG4pfSxuKX19dmFyIEVmPU9iamVjdC5nZXRQcm90b3R5cGVPZihmdW5jdGlvbigpe30pLFNmPU9iamVjdC5zZXRQcm90b3R5cGVPZigoSnQ9e2dldCBzdHJlYW0oKXtyZXR1cm4gdGhpc1tqZV19LG5leHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpc1tSdF07aWYodCE9PW51bGwpcmV0dXJuIFByb21pc2UucmVqZWN0KHQpO2lmKHRoaXNbUXRdKXJldHVybiBQcm9taXNlLnJlc29sdmUodmUodm9pZCAwLCEwKSk7aWYodGhpc1tqZV0uZGVzdHJveWVkKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihzLGEpe3Byb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKXtlW1J0XT9hKGVbUnRdKTpzKHZlKHZvaWQgMCwhMCkpfSl9KTt2YXIgbj10aGlzW3FlXSxpO2lmKG4paT1uZXcgUHJvbWlzZSh2ZihuLHRoaXMpKTtlbHNle3ZhciBvPXRoaXNbamVdLnJlYWQoKTtpZihvIT09bnVsbClyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZlKG8sITEpKTtpPW5ldyBQcm9taXNlKHRoaXNbVG5dKX1yZXR1cm4gdGhpc1txZV09aSxpfX0sX2UoSnQsU3ltYm9sLmFzeW5jSXRlcmF0b3IsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLF9lKEp0LFwicmV0dXJuXCIsZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2VbamVdLmRlc3Ryb3kobnVsbCxmdW5jdGlvbihpKXtpZihpKXtuKGkpO3JldHVybn10KHZlKHZvaWQgMCwhMCkpfSl9KX0pLEp0KSxFZiksUmY9ZnVuY3Rpb24oZSl7dmFyIHQsbj1PYmplY3QuY3JlYXRlKFNmLCh0PXt9LF9lKHQsamUse3ZhbHVlOmUsd3JpdGFibGU6ITB9KSxfZSh0LHdlLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksX2UodCxIZSx7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLF9lKHQsUnQse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZSh0LFF0LHt2YWx1ZTplLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsd3JpdGFibGU6ITB9KSxfZSh0LFRuLHt2YWx1ZTpmdW5jdGlvbihvLHMpe3ZhciBhPW5bamVdLnJlYWQoKTthPyhuW3FlXT1udWxsLG5bd2VdPW51bGwsbltIZV09bnVsbCxvKHZlKGEsITEpKSk6KG5bd2VdPW8sbltIZV09cyl9LHdyaXRhYmxlOiEwfSksdCkpO3JldHVybiBuW3FlXT1udWxsLHhmKGUsZnVuY3Rpb24oaSl7aWYoaSYmaS5jb2RlIT09XCJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRVwiKXt2YXIgbz1uW0hlXTtvIT09bnVsbCYmKG5bcWVdPW51bGwsblt3ZV09bnVsbCxuW0hlXT1udWxsLG8oaSkpLG5bUnRdPWk7cmV0dXJufXZhciBzPW5bd2VdO3MhPT1udWxsJiYobltxZV09bnVsbCxuW3dlXT1udWxsLG5bSGVdPW51bGwscyh2ZSh2b2lkIDAsITApKSksbltRdF09ITB9KSxlLm9uKFwicmVhZGFibGVcIix3Zi5iaW5kKG51bGwsbikpLG59O0JvLmV4cG9ydHM9UmZ9KTt2YXIgSW89UygoQ2wsTG8pPT57YygpO0xvLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJSZWFkYWJsZS5mcm9tIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXJcIil9fSk7dmFyIHduPVMoKE1sLHFvKT0+e1widXNlIHN0cmljdFwiO2MoKTtxby5leHBvcnRzPUU7dmFyIHJ0O0UuUmVhZGFibGVTdGF0ZT1rbzt2YXIgQmw9dW4oKS5FdmVudEVtaXR0ZXIsUG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5saXN0ZW5lcnModCkubGVuZ3RofSxDdD1mbigpLFp0PVhlKCkuQnVmZmVyLFRmPWdsb2JhbC5VaW50OEFycmF5fHxmdW5jdGlvbigpe307ZnVuY3Rpb24gQ2Yocil7cmV0dXJuIFp0LmZyb20ocil9ZnVuY3Rpb24gQmYocil7cmV0dXJuIFp0LmlzQnVmZmVyKHIpfHxyIGluc3RhbmNlb2YgVGZ9dmFyIENuPWNuKCkseDtDbiYmQ24uZGVidWdsb2c/eD1Dbi5kZWJ1Z2xvZyhcInN0cmVhbVwiKTp4PWZ1bmN0aW9uKCl7fTt2YXIgTWY9cm8oKSxQbj1wbigpLExmPWhuKCksSWY9TGYuZ2V0SGlnaFdhdGVyTWFyayxlcj1VZSgpLmNvZGVzLEFmPWVyLkVSUl9JTlZBTElEX0FSR19UWVBFLEZmPWVyLkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YsUGY9ZXIuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsa2Y9ZXIuRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCxudCxCbixNbjtPZSgpKEUsQ3QpO3ZhciBUdD1Qbi5lcnJvck9yRGVzdHJveSxMbj1bXCJlcnJvclwiLFwiY2xvc2VcIixcImRlc3Ryb3lcIixcInBhdXNlXCIsXCJyZXN1bWVcIl07ZnVuY3Rpb24gT2YocixlLHQpe2lmKHR5cGVvZiByLnByZXBlbmRMaXN0ZW5lcj09XCJmdW5jdGlvblwiKXJldHVybiByLnByZXBlbmRMaXN0ZW5lcihlLHQpOyFyLl9ldmVudHN8fCFyLl9ldmVudHNbZV0/ci5vbihlLHQpOkFycmF5LmlzQXJyYXkoci5fZXZlbnRzW2VdKT9yLl9ldmVudHNbZV0udW5zaGlmdCh0KTpyLl9ldmVudHNbZV09W3Qsci5fZXZlbnRzW2VdXX1mdW5jdGlvbiBrbyhyLGUsdCl7cnQ9cnR8fERlKCkscj1yfHx7fSx0eXBlb2YgdCE9XCJib29sZWFuXCImJih0PWUgaW5zdGFuY2VvZiBydCksdGhpcy5vYmplY3RNb2RlPSEhci5vYmplY3RNb2RlLHQmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXIucmVhZGFibGVPYmplY3RNb2RlKSx0aGlzLmhpZ2hXYXRlck1hcms9SWYodGhpcyxyLFwicmVhZGFibGVIaWdoV2F0ZXJNYXJrXCIsdCksdGhpcy5idWZmZXI9bmV3IE1mLHRoaXMubGVuZ3RoPTAsdGhpcy5waXBlcz1udWxsLHRoaXMucGlwZXNDb3VudD0wLHRoaXMuZmxvd2luZz1udWxsLHRoaXMuZW5kZWQ9ITEsdGhpcy5lbmRFbWl0dGVkPSExLHRoaXMucmVhZGluZz0hMSx0aGlzLnN5bmM9ITAsdGhpcy5uZWVkUmVhZGFibGU9ITEsdGhpcy5lbWl0dGVkUmVhZGFibGU9ITEsdGhpcy5yZWFkYWJsZUxpc3RlbmluZz0hMSx0aGlzLnJlc3VtZVNjaGVkdWxlZD0hMSx0aGlzLnBhdXNlZD0hMCx0aGlzLmVtaXRDbG9zZT1yLmVtaXRDbG9zZSE9PSExLHRoaXMuYXV0b0Rlc3Ryb3k9ISFyLmF1dG9EZXN0cm95LHRoaXMuZGVzdHJveWVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXIuZGVmYXVsdEVuY29kaW5nfHxcInV0ZjhcIix0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCxyLmVuY29kaW5nJiYobnR8fChudD1SbigpLlN0cmluZ0RlY29kZXIpLHRoaXMuZGVjb2Rlcj1uZXcgbnQoci5lbmNvZGluZyksdGhpcy5lbmNvZGluZz1yLmVuY29kaW5nKX1mdW5jdGlvbiBFKHIpe2lmKHJ0PXJ0fHxEZSgpLCEodGhpcyBpbnN0YW5jZW9mIEUpKXJldHVybiBuZXcgRShyKTt2YXIgZT10aGlzIGluc3RhbmNlb2YgcnQ7dGhpcy5fcmVhZGFibGVTdGF0ZT1uZXcga28ocix0aGlzLGUpLHRoaXMucmVhZGFibGU9ITAsciYmKHR5cGVvZiByLnJlYWQ9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX3JlYWQ9ci5yZWFkKSx0eXBlb2Ygci5kZXN0cm95PT1cImZ1bmN0aW9uXCImJih0aGlzLl9kZXN0cm95PXIuZGVzdHJveSkpLEN0LmNhbGwodGhpcyl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEUucHJvdG90eXBlLFwiZGVzdHJveWVkXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGU9PT12b2lkIDA/ITE6dGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbihlKXshdGhpcy5fcmVhZGFibGVTdGF0ZXx8KHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPWUpfX0pO0UucHJvdG90eXBlLmRlc3Ryb3k9UG4uZGVzdHJveTtFLnByb3RvdHlwZS5fdW5kZXN0cm95PVBuLnVuZGVzdHJveTtFLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihyLGUpe2Uocil9O0UucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24ocixlKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlLG47cmV0dXJuIHQub2JqZWN0TW9kZT9uPSEwOnR5cGVvZiByPT1cInN0cmluZ1wiJiYoZT1lfHx0LmRlZmF1bHRFbmNvZGluZyxlIT09dC5lbmNvZGluZyYmKHI9WnQuZnJvbShyLGUpLGU9XCJcIiksbj0hMCksT28odGhpcyxyLGUsITEsbil9O0UucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24ocil7cmV0dXJuIE9vKHRoaXMscixudWxsLCEwLCExKX07ZnVuY3Rpb24gT28ocixlLHQsbixpKXt4KFwicmVhZGFibGVBZGRDaHVua1wiLGUpO3ZhciBvPXIuX3JlYWRhYmxlU3RhdGU7aWYoZT09PW51bGwpby5yZWFkaW5nPSExLE5mKHIsbyk7ZWxzZXt2YXIgcztpZihpfHwocz1VZihvLGUpKSxzKVR0KHIscyk7ZWxzZSBpZihvLm9iamVjdE1vZGV8fGUmJmUubGVuZ3RoPjApaWYodHlwZW9mIGUhPVwic3RyaW5nXCImJiFvLm9iamVjdE1vZGUmJk9iamVjdC5nZXRQcm90b3R5cGVPZihlKSE9PVp0LnByb3RvdHlwZSYmKGU9Q2YoZSkpLG4pby5lbmRFbWl0dGVkP1R0KHIsbmV3IGtmKTpJbihyLG8sZSwhMCk7ZWxzZSBpZihvLmVuZGVkKVR0KHIsbmV3IEZmKTtlbHNle2lmKG8uZGVzdHJveWVkKXJldHVybiExO28ucmVhZGluZz0hMSxvLmRlY29kZXImJiF0PyhlPW8uZGVjb2Rlci53cml0ZShlKSxvLm9iamVjdE1vZGV8fGUubGVuZ3RoIT09MD9JbihyLG8sZSwhMSk6Rm4ocixvKSk6SW4ocixvLGUsITEpfWVsc2Ugbnx8KG8ucmVhZGluZz0hMSxGbihyLG8pKX1yZXR1cm4hby5lbmRlZCYmKG8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFya3x8by5sZW5ndGg9PT0wKX1mdW5jdGlvbiBJbihyLGUsdCxuKXtlLmZsb3dpbmcmJmUubGVuZ3RoPT09MCYmIWUuc3luYz8oZS5hd2FpdERyYWluPTAsci5lbWl0KFwiZGF0YVwiLHQpKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnQubGVuZ3RoLG4/ZS5idWZmZXIudW5zaGlmdCh0KTplLmJ1ZmZlci5wdXNoKHQpLGUubmVlZFJlYWRhYmxlJiZ0cihyKSksRm4ocixlKX1mdW5jdGlvbiBVZihyLGUpe3ZhciB0O3JldHVybiFCZihlKSYmdHlwZW9mIGUhPVwic3RyaW5nXCImJmUhPT12b2lkIDAmJiFyLm9iamVjdE1vZGUmJih0PW5ldyBBZihcImNodW5rXCIsW1wic3RyaW5nXCIsXCJCdWZmZXJcIixcIlVpbnQ4QXJyYXlcIl0sZSkpLHR9RS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPT09ITF9O0UucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHIpe250fHwobnQ9Um4oKS5TdHJpbmdEZWNvZGVyKTt2YXIgZT1uZXcgbnQocik7dGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPWUsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZz10aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIuZW5jb2Rpbmc7Zm9yKHZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmhlYWQsbj1cIlwiO3QhPT1udWxsOyluKz1lLndyaXRlKHQuZGF0YSksdD10Lm5leHQ7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmNsZWFyKCksbiE9PVwiXCImJnRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLnB1c2gobiksdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGg9bi5sZW5ndGgsdGhpc307dmFyIEFvPTEwNzM3NDE4MjQ7ZnVuY3Rpb24gRGYocil7cmV0dXJuIHI+PUFvP3I9QW86KHItLSxyfD1yPj4+MSxyfD1yPj4+MixyfD1yPj4+NCxyfD1yPj4+OCxyfD1yPj4+MTYscisrKSxyfWZ1bmN0aW9uIEZvKHIsZSl7cmV0dXJuIHI8PTB8fGUubGVuZ3RoPT09MCYmZS5lbmRlZD8wOmUub2JqZWN0TW9kZT8xOnIhPT1yP2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoocj5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9RGYocikpLHI8PWUubGVuZ3RoP3I6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfUUucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24ocil7eChcInJlYWRcIixyKSxyPXBhcnNlSW50KHIsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUsdD1yO2lmKHIhPT0wJiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLHI9PT0wJiZlLm5lZWRSZWFkYWJsZSYmKChlLmhpZ2hXYXRlck1hcmshPT0wP2UubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcms6ZS5sZW5ndGg+MCl8fGUuZW5kZWQpKXJldHVybiB4KFwicmVhZDogZW1pdFJlYWRhYmxlXCIsZS5sZW5ndGgsZS5lbmRlZCksZS5sZW5ndGg9PT0wJiZlLmVuZGVkP0FuKHRoaXMpOnRyKHRoaXMpLG51bGw7aWYocj1GbyhyLGUpLHI9PT0wJiZlLmVuZGVkKXJldHVybiBlLmxlbmd0aD09PTAmJkFuKHRoaXMpLG51bGw7dmFyIG49ZS5uZWVkUmVhZGFibGU7eChcIm5lZWQgcmVhZGFibGVcIixuKSwoZS5sZW5ndGg9PT0wfHxlLmxlbmd0aC1yPGUuaGlnaFdhdGVyTWFyaykmJihuPSEwLHgoXCJsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFya1wiLG4pKSxlLmVuZGVkfHxlLnJlYWRpbmc/KG49ITEseChcInJlYWRpbmcgb3IgZW5kZWRcIixuKSk6biYmKHgoXCJkbyByZWFkXCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsZS5sZW5ndGg9PT0wJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwocj1Gbyh0LGUpKSk7dmFyIGk7cmV0dXJuIHI+MD9pPU5vKHIsZSk6aT1udWxsLGk9PT1udWxsPyhlLm5lZWRSZWFkYWJsZT1lLmxlbmd0aDw9ZS5oaWdoV2F0ZXJNYXJrLHI9MCk6KGUubGVuZ3RoLT1yLGUuYXdhaXREcmFpbj0wKSxlLmxlbmd0aD09PTAmJihlLmVuZGVkfHwoZS5uZWVkUmVhZGFibGU9ITApLHQhPT1yJiZlLmVuZGVkJiZBbih0aGlzKSksaSE9PW51bGwmJnRoaXMuZW1pdChcImRhdGFcIixpKSxpfTtmdW5jdGlvbiBOZihyLGUpe2lmKHgoXCJvbkVvZkNodW5rXCIpLCFlLmVuZGVkKXtpZihlLmRlY29kZXIpe3ZhciB0PWUuZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmKGUuYnVmZmVyLnB1c2godCksZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnQubGVuZ3RoKX1lLmVuZGVkPSEwLGUuc3luYz90cihyKTooZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChlLmVtaXR0ZWRSZWFkYWJsZT0hMCxVbyhyKSkpfX1mdW5jdGlvbiB0cihyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO3goXCJlbWl0UmVhZGFibGVcIixlLm5lZWRSZWFkYWJsZSxlLmVtaXR0ZWRSZWFkYWJsZSksZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fCh4KFwiZW1pdFJlYWRhYmxlXCIsZS5mbG93aW5nKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMCxwcm9jZXNzLm5leHRUaWNrKFVvLHIpKX1mdW5jdGlvbiBVbyhyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO3goXCJlbWl0UmVhZGFibGVfXCIsZS5kZXN0cm95ZWQsZS5sZW5ndGgsZS5lbmRlZCksIWUuZGVzdHJveWVkJiYoZS5sZW5ndGh8fGUuZW5kZWQpJiYoci5lbWl0KFwicmVhZGFibGVcIiksZS5lbWl0dGVkUmVhZGFibGU9ITEpLGUubmVlZFJlYWRhYmxlPSFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDw9ZS5oaWdoV2F0ZXJNYXJrLGtuKHIpfWZ1bmN0aW9uIEZuKHIsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAscHJvY2Vzcy5uZXh0VGljayhIZixyLGUpKX1mdW5jdGlvbiBIZihyLGUpe2Zvcig7IWUucmVhZGluZyYmIWUuZW5kZWQmJihlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmt8fGUuZmxvd2luZyYmZS5sZW5ndGg9PT0wKTspe3ZhciB0PWUubGVuZ3RoO2lmKHgoXCJtYXliZVJlYWRNb3JlIHJlYWQgMFwiKSxyLnJlYWQoMCksdD09PWUubGVuZ3RoKWJyZWFrfWUucmVhZGluZ01vcmU9ITF9RS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24ocil7VHQodGhpcyxuZXcgUGYoXCJfcmVhZCgpXCIpKX07RS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbihyLGUpe3ZhciB0PXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChuLnBpcGVzQ291bnQpe2Nhc2UgMDpuLnBpcGVzPXI7YnJlYWs7Y2FzZSAxOm4ucGlwZXM9W24ucGlwZXMscl07YnJlYWs7ZGVmYXVsdDpuLnBpcGVzLnB1c2gocik7YnJlYWt9bi5waXBlc0NvdW50Kz0xLHgoXCJwaXBlIGNvdW50PSVkIG9wdHM9JWpcIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9KCFlfHxlLmVuZCE9PSExKSYmciE9PXByb2Nlc3Muc3Rkb3V0JiZyIT09cHJvY2Vzcy5zdGRlcnIsbz1pP2E6eTtuLmVuZEVtaXR0ZWQ/cHJvY2Vzcy5uZXh0VGljayhvKTp0Lm9uY2UoXCJlbmRcIixvKSxyLm9uKFwidW5waXBlXCIscyk7ZnVuY3Rpb24gcyh3LF8pe3goXCJvbnVucGlwZVwiKSx3PT09dCYmXyYmXy5oYXNVbnBpcGVkPT09ITEmJihfLmhhc1VucGlwZWQ9ITAsbCgpKX1mdW5jdGlvbiBhKCl7eChcIm9uZW5kXCIpLHIuZW5kKCl9dmFyIHU9cWYodCk7ci5vbihcImRyYWluXCIsdSk7dmFyIGY9ITE7ZnVuY3Rpb24gbCgpe3goXCJjbGVhbnVwXCIpLHIucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLG0pLHIucmVtb3ZlTGlzdGVuZXIoXCJmaW5pc2hcIixiKSxyLnJlbW92ZUxpc3RlbmVyKFwiZHJhaW5cIix1KSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixoKSxyLnJlbW92ZUxpc3RlbmVyKFwidW5waXBlXCIscyksdC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLGEpLHQucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIix5KSx0LnJlbW92ZUxpc3RlbmVyKFwiZGF0YVwiLGQpLGY9ITAsbi5hd2FpdERyYWluJiYoIXIuX3dyaXRhYmxlU3RhdGV8fHIuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSYmdSgpfXQub24oXCJkYXRhXCIsZCk7ZnVuY3Rpb24gZCh3KXt4KFwib25kYXRhXCIpO3ZhciBfPXIud3JpdGUodyk7eChcImRlc3Qud3JpdGVcIixfKSxfPT09ITEmJigobi5waXBlc0NvdW50PT09MSYmbi5waXBlcz09PXJ8fG4ucGlwZXNDb3VudD4xJiZIbyhuLnBpcGVzLHIpIT09LTEpJiYhZiYmKHgoXCJmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2VcIixuLmF3YWl0RHJhaW4pLG4uYXdhaXREcmFpbisrKSx0LnBhdXNlKCkpfWZ1bmN0aW9uIGgodyl7eChcIm9uZXJyb3JcIix3KSx5KCksci5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsaCksUG8ocixcImVycm9yXCIpPT09MCYmVHQocix3KX1PZihyLFwiZXJyb3JcIixoKTtmdW5jdGlvbiBtKCl7ci5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGIpLHkoKX1yLm9uY2UoXCJjbG9zZVwiLG0pO2Z1bmN0aW9uIGIoKXt4KFwib25maW5pc2hcIiksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsbSkseSgpfXIub25jZShcImZpbmlzaFwiLGIpO2Z1bmN0aW9uIHkoKXt4KFwidW5waXBlXCIpLHQudW5waXBlKHIpfXJldHVybiByLmVtaXQoXCJwaXBlXCIsdCksbi5mbG93aW5nfHwoeChcInBpcGUgcmVzdW1lXCIpLHQucmVzdW1lKCkpLHJ9O2Z1bmN0aW9uIHFmKHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXIuX3JlYWRhYmxlU3RhdGU7eChcInBpcGVPbkRyYWluXCIsdC5hd2FpdERyYWluKSx0LmF3YWl0RHJhaW4mJnQuYXdhaXREcmFpbi0tLHQuYXdhaXREcmFpbj09PTAmJlBvKHIsXCJkYXRhXCIpJiYodC5mbG93aW5nPSEwLGtuKHIpKX19RS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHIpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUsdD17aGFzVW5waXBlZDohMX07aWYoZS5waXBlc0NvdW50PT09MClyZXR1cm4gdGhpcztpZihlLnBpcGVzQ291bnQ9PT0xKXJldHVybiByJiZyIT09ZS5waXBlcz90aGlzOihyfHwocj1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHImJnIuZW1pdChcInVucGlwZVwiLHRoaXMsdCksdGhpcyk7aWYoIXIpe3ZhciBuPWUucGlwZXMsaT1lLnBpcGVzQ291bnQ7ZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMTtmb3IodmFyIG89MDtvPGk7bysrKW5bb10uZW1pdChcInVucGlwZVwiLHRoaXMse2hhc1VucGlwZWQ6ITF9KTtyZXR1cm4gdGhpc312YXIgcz1IbyhlLnBpcGVzLHIpO3JldHVybiBzPT09LTE/dGhpczooZS5waXBlcy5zcGxpY2UocywxKSxlLnBpcGVzQ291bnQtPTEsZS5waXBlc0NvdW50PT09MSYmKGUucGlwZXM9ZS5waXBlc1swXSksci5lbWl0KFwidW5waXBlXCIsdGhpcyx0KSx0aGlzKX07RS5wcm90b3R5cGUub249ZnVuY3Rpb24ocixlKXt2YXIgdD1DdC5wcm90b3R5cGUub24uY2FsbCh0aGlzLHIsZSksbj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByPT09XCJkYXRhXCI/KG4ucmVhZGFibGVMaXN0ZW5pbmc9dGhpcy5saXN0ZW5lckNvdW50KFwicmVhZGFibGVcIik+MCxuLmZsb3dpbmchPT0hMSYmdGhpcy5yZXN1bWUoKSk6cj09PVwicmVhZGFibGVcIiYmIW4uZW5kRW1pdHRlZCYmIW4ucmVhZGFibGVMaXN0ZW5pbmcmJihuLnJlYWRhYmxlTGlzdGVuaW5nPW4ubmVlZFJlYWRhYmxlPSEwLG4uZmxvd2luZz0hMSxuLmVtaXR0ZWRSZWFkYWJsZT0hMSx4KFwib24gcmVhZGFibGVcIixuLmxlbmd0aCxuLnJlYWRpbmcpLG4ubGVuZ3RoP3RyKHRoaXMpOm4ucmVhZGluZ3x8cHJvY2Vzcy5uZXh0VGljayhqZix0aGlzKSksdH07RS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9RS5wcm90b3R5cGUub247RS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgdD1DdC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIuY2FsbCh0aGlzLHIsZSk7cmV0dXJuIHI9PT1cInJlYWRhYmxlXCImJnByb2Nlc3MubmV4dFRpY2soRG8sdGhpcyksdH07RS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3ZhciBlPUN0LnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybihyPT09XCJyZWFkYWJsZVwifHxyPT09dm9pZCAwKSYmcHJvY2Vzcy5uZXh0VGljayhEbyx0aGlzKSxlfTtmdW5jdGlvbiBEbyhyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO2UucmVhZGFibGVMaXN0ZW5pbmc9ci5saXN0ZW5lckNvdW50KFwicmVhZGFibGVcIik+MCxlLnJlc3VtZVNjaGVkdWxlZCYmIWUucGF1c2VkP2UuZmxvd2luZz0hMDpyLmxpc3RlbmVyQ291bnQoXCJkYXRhXCIpPjAmJnIucmVzdW1lKCl9ZnVuY3Rpb24gamYocil7eChcInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMFwiKSxyLnJlYWQoMCl9RS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gci5mbG93aW5nfHwoeChcInJlc3VtZVwiKSxyLmZsb3dpbmc9IXIucmVhZGFibGVMaXN0ZW5pbmcsV2YodGhpcyxyKSksci5wYXVzZWQ9ITEsdGhpc307ZnVuY3Rpb24gV2YocixlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLHByb2Nlc3MubmV4dFRpY2soJGYscixlKSl9ZnVuY3Rpb24gJGYocixlKXt4KFwicmVzdW1lXCIsZS5yZWFkaW5nKSxlLnJlYWRpbmd8fHIucmVhZCgwKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxyLmVtaXQoXCJyZXN1bWVcIiksa24ociksZS5mbG93aW5nJiYhZS5yZWFkaW5nJiZyLnJlYWQoMCl9RS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4geChcImNhbGwgcGF1c2UgZmxvd2luZz0lalwiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nIT09ITEmJih4KFwicGF1c2VcIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdChcInBhdXNlXCIpKSx0aGlzLl9yZWFkYWJsZVN0YXRlLnBhdXNlZD0hMCx0aGlzfTtmdW5jdGlvbiBrbihyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO2Zvcih4KFwiZmxvd1wiLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZyLnJlYWQoKSE9PW51bGw7KTt9RS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihyKXt2YXIgZT10aGlzLHQ9dGhpcy5fcmVhZGFibGVTdGF0ZSxuPSExO3Iub24oXCJlbmRcIixmdW5jdGlvbigpe2lmKHgoXCJ3cmFwcGVkIGVuZFwiKSx0LmRlY29kZXImJiF0LmVuZGVkKXt2YXIgcz10LmRlY29kZXIuZW5kKCk7cyYmcy5sZW5ndGgmJmUucHVzaChzKX1lLnB1c2gobnVsbCl9KSxyLm9uKFwiZGF0YVwiLGZ1bmN0aW9uKHMpe2lmKHgoXCJ3cmFwcGVkIGRhdGFcIiksdC5kZWNvZGVyJiYocz10LmRlY29kZXIud3JpdGUocykpLCEodC5vYmplY3RNb2RlJiZzPT1udWxsKSYmISghdC5vYmplY3RNb2RlJiYoIXN8fCFzLmxlbmd0aCkpKXt2YXIgYT1lLnB1c2gocyk7YXx8KG49ITAsci5wYXVzZSgpKX19KTtmb3IodmFyIGkgaW4gcil0aGlzW2ldPT09dm9pZCAwJiZ0eXBlb2YgcltpXT09XCJmdW5jdGlvblwiJiYodGhpc1tpXT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gclthXS5hcHBseShyLGFyZ3VtZW50cyl9fShpKSk7Zm9yKHZhciBvPTA7bzxMbi5sZW5ndGg7bysrKXIub24oTG5bb10sdGhpcy5lbWl0LmJpbmQodGhpcyxMbltvXSkpO3JldHVybiB0aGlzLl9yZWFkPWZ1bmN0aW9uKHMpe3goXCJ3cmFwcGVkIF9yZWFkXCIscyksbiYmKG49ITEsci5yZXN1bWUoKSl9LHRoaXN9O3R5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmKEUucHJvdG90eXBlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiBCbj09PXZvaWQgMCYmKEJuPU1vKCkpLEJuKHRoaXMpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEUucHJvdG90eXBlLFwicmVhZGFibGVIaWdoV2F0ZXJNYXJrXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJyZWFkYWJsZUJ1ZmZlclwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlJiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJyZWFkYWJsZUZsb3dpbmdcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz1lKX19KTtFLl9mcm9tTGlzdD1ObztPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJyZWFkYWJsZUxlbmd0aFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aH19KTtmdW5jdGlvbiBObyhyLGUpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4gbnVsbDt2YXIgdDtyZXR1cm4gZS5vYmplY3RNb2RlP3Q9ZS5idWZmZXIuc2hpZnQoKTohcnx8cj49ZS5sZW5ndGg/KGUuZGVjb2Rlcj90PWUuYnVmZmVyLmpvaW4oXCJcIik6ZS5idWZmZXIubGVuZ3RoPT09MT90PWUuYnVmZmVyLmZpcnN0KCk6dD1lLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLGUuYnVmZmVyLmNsZWFyKCkpOnQ9ZS5idWZmZXIuY29uc3VtZShyLGUuZGVjb2RlciksdH1mdW5jdGlvbiBBbihyKXt2YXIgZT1yLl9yZWFkYWJsZVN0YXRlO3goXCJlbmRSZWFkYWJsZVwiLGUuZW5kRW1pdHRlZCksZS5lbmRFbWl0dGVkfHwoZS5lbmRlZD0hMCxwcm9jZXNzLm5leHRUaWNrKEdmLGUscikpfWZ1bmN0aW9uIEdmKHIsZSl7aWYoeChcImVuZFJlYWRhYmxlTlRcIixyLmVuZEVtaXR0ZWQsci5sZW5ndGgpLCFyLmVuZEVtaXR0ZWQmJnIubGVuZ3RoPT09MCYmKHIuZW5kRW1pdHRlZD0hMCxlLnJlYWRhYmxlPSExLGUuZW1pdChcImVuZFwiKSxyLmF1dG9EZXN0cm95KSl7dmFyIHQ9ZS5fd3JpdGFibGVTdGF0ZTsoIXR8fHQuYXV0b0Rlc3Ryb3kmJnQuZmluaXNoZWQpJiZlLmRlc3Ryb3koKX19dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiYoRS5mcm9tPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIE1uPT09dm9pZCAwJiYoTW49SW8oKSksTW4oRSxyLGUpfSk7ZnVuY3Rpb24gSG8ocixlKXtmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspaWYoclt0XT09PWUpcmV0dXJuIHQ7cmV0dXJuLTF9fSk7dmFyIE9uPVMoKExsLFdvKT0+e1widXNlIHN0cmljdFwiO2MoKTtXby5leHBvcnRzPW1lO3ZhciBycj1VZSgpLmNvZGVzLFZmPXJyLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELHpmPXJyLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxZZj1yci5FUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HLEtmPXJyLkVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMCxucj1EZSgpO09lKCkobWUsbnIpO2Z1bmN0aW9uIFhmKHIsZSl7dmFyIHQ9dGhpcy5fdHJhbnNmb3JtU3RhdGU7dC50cmFuc2Zvcm1pbmc9ITE7dmFyIG49dC53cml0ZWNiO2lmKG49PT1udWxsKXJldHVybiB0aGlzLmVtaXQoXCJlcnJvclwiLG5ldyB6Zik7dC53cml0ZWNodW5rPW51bGwsdC53cml0ZWNiPW51bGwsZSE9bnVsbCYmdGhpcy5wdXNoKGUpLG4ocik7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTtpLnJlYWRpbmc9ITEsKGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9ZnVuY3Rpb24gbWUocil7aWYoISh0aGlzIGluc3RhbmNlb2YgbWUpKXJldHVybiBuZXcgbWUocik7bnIuY2FsbCh0aGlzLHIpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPXthZnRlclRyYW5zZm9ybTpYZi5iaW5kKHRoaXMpLG5lZWRUcmFuc2Zvcm06ITEsdHJhbnNmb3JtaW5nOiExLHdyaXRlY2I6bnVsbCx3cml0ZWNodW5rOm51bGwsd3JpdGVlbmNvZGluZzpudWxsfSx0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsciYmKHR5cGVvZiByLnRyYW5zZm9ybT09XCJmdW5jdGlvblwiJiYodGhpcy5fdHJhbnNmb3JtPXIudHJhbnNmb3JtKSx0eXBlb2Ygci5mbHVzaD09XCJmdW5jdGlvblwiJiYodGhpcy5fZmx1c2g9ci5mbHVzaCkpLHRoaXMub24oXCJwcmVmaW5pc2hcIixKZil9ZnVuY3Rpb24gSmYoKXt2YXIgcj10aGlzO3R5cGVvZiB0aGlzLl9mbHVzaD09XCJmdW5jdGlvblwiJiYhdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ/dGhpcy5fZmx1c2goZnVuY3Rpb24oZSx0KXtqbyhyLGUsdCl9KTpqbyh0aGlzLG51bGwsbnVsbCl9bWUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24ocixlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxuci5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMscixlKX07bWUucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24ocixlLHQpe3QobmV3IFZmKFwiX3RyYW5zZm9ybSgpXCIpKX07bWUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihyLGUsdCl7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7aWYobi53cml0ZWNiPXQsbi53cml0ZWNodW5rPXIsbi53cml0ZWVuY29kaW5nPWUsIW4udHJhbnNmb3JtaW5nKXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlOyhuLm5lZWRUcmFuc2Zvcm18fGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9fTttZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24ocil7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7ZS53cml0ZWNodW5rIT09bnVsbCYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfTttZS5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24ocixlKXtuci5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLHIsZnVuY3Rpb24odCl7ZSh0KX0pfTtmdW5jdGlvbiBqbyhyLGUsdCl7aWYoZSlyZXR1cm4gci5lbWl0KFwiZXJyb3JcIixlKTtpZih0IT1udWxsJiZyLnB1c2godCksci5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpdGhyb3cgbmV3IEtmO2lmKHIuX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgWWY7cmV0dXJuIHIucHVzaChudWxsKX19KTt2YXIgVm89UygoSWwsR28pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO0dvLmV4cG9ydHM9QnQ7dmFyICRvPU9uKCk7T2UoKShCdCwkbyk7ZnVuY3Rpb24gQnQocil7aWYoISh0aGlzIGluc3RhbmNlb2YgQnQpKXJldHVybiBuZXcgQnQocik7JG8uY2FsbCh0aGlzLHIpfUJ0LnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHIsZSx0KXt0KG51bGwscil9fSk7dmFyIEpvPVMoKEFsLFhvKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgVW47ZnVuY3Rpb24gUWYocil7dmFyIGU9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7ZXx8KGU9ITAsci5hcHBseSh2b2lkIDAsYXJndW1lbnRzKSl9fXZhciBLbz1VZSgpLmNvZGVzLFpmPUtvLkVSUl9NSVNTSU5HX0FSR1MsZWM9S28uRVJSX1NUUkVBTV9ERVNUUk9ZRUQ7ZnVuY3Rpb24gem8ocil7aWYocil0aHJvdyByfWZ1bmN0aW9uIHRjKHIpe3JldHVybiByLnNldEhlYWRlciYmdHlwZW9mIHIuYWJvcnQ9PVwiZnVuY3Rpb25cIn1mdW5jdGlvbiByYyhyLGUsdCxuKXtuPVFmKG4pO3ZhciBpPSExO3Iub24oXCJjbG9zZVwiLGZ1bmN0aW9uKCl7aT0hMH0pLFVuPT09dm9pZCAwJiYoVW49WHQoKSksVW4ocix7cmVhZGFibGU6ZSx3cml0YWJsZTp0fSxmdW5jdGlvbihzKXtpZihzKXJldHVybiBuKHMpO2k9ITAsbigpfSk7dmFyIG89ITE7cmV0dXJuIGZ1bmN0aW9uKHMpe2lmKCFpJiYhbyl7aWYobz0hMCx0YyhyKSlyZXR1cm4gci5hYm9ydCgpO2lmKHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIilyZXR1cm4gci5kZXN0cm95KCk7bihzfHxuZXcgZWMoXCJwaXBlXCIpKX19fWZ1bmN0aW9uIFlvKHIpe3IoKX1mdW5jdGlvbiBuYyhyLGUpe3JldHVybiByLnBpcGUoZSl9ZnVuY3Rpb24gaWMocil7cmV0dXJuIXIubGVuZ3RofHx0eXBlb2YgcltyLmxlbmd0aC0xXSE9XCJmdW5jdGlvblwiP3pvOnIucG9wKCl9ZnVuY3Rpb24gb2MoKXtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheShyKSx0PTA7dDxyO3QrKyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj1pYyhlKTtpZihBcnJheS5pc0FycmF5KGVbMF0pJiYoZT1lWzBdKSxlLmxlbmd0aDwyKXRocm93IG5ldyBaZihcInN0cmVhbXNcIik7dmFyIGksbz1lLm1hcChmdW5jdGlvbihzLGEpe3ZhciB1PWE8ZS5sZW5ndGgtMSxmPWE+MDtyZXR1cm4gcmMocyx1LGYsZnVuY3Rpb24obCl7aXx8KGk9bCksbCYmby5mb3JFYWNoKFlvKSwhdSYmKG8uZm9yRWFjaChZbyksbihpKSl9KX0pO3JldHVybiBlLnJlZHVjZShuYyl9WG8uZXhwb3J0cz1vY30pO3ZhciBOPVMoKEZsLFFvKT0+e2MoKTtRby5leHBvcnRzPUo7dmFyIERuPWppKCkuRXZlbnRFbWl0dGVyLHNjPU9lKCk7c2MoSixEbik7Si5SZWFkYWJsZT13bigpO0ouV3JpdGFibGU9Ym4oKTtKLkR1cGxleD1EZSgpO0ouVHJhbnNmb3JtPU9uKCk7Si5QYXNzVGhyb3VnaD1WbygpO0ouZmluaXNoZWQ9WHQoKTtKLnBpcGVsaW5lPUpvKCk7Si5TdHJlYW09SjtmdW5jdGlvbiBKKCl7RG4uY2FsbCh0aGlzKX1KLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9dGhpcztmdW5jdGlvbiBuKGwpe3Iud3JpdGFibGUmJnIud3JpdGUobCk9PT0hMSYmdC5wYXVzZSYmdC5wYXVzZSgpfXQub24oXCJkYXRhXCIsbik7ZnVuY3Rpb24gaSgpe3QucmVhZGFibGUmJnQucmVzdW1lJiZ0LnJlc3VtZSgpfXIub24oXCJkcmFpblwiLGkpLCFyLl9pc1N0ZGlvJiYoIWV8fGUuZW5kIT09ITEpJiYodC5vbihcImVuZFwiLHMpLHQub24oXCJjbG9zZVwiLGEpKTt2YXIgbz0hMTtmdW5jdGlvbiBzKCl7b3x8KG89ITAsci5lbmQoKSl9ZnVuY3Rpb24gYSgpe298fChvPSEwLHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIiYmci5kZXN0cm95KCkpfWZ1bmN0aW9uIHUobCl7aWYoZigpLERuLmxpc3RlbmVyQ291bnQodGhpcyxcImVycm9yXCIpPT09MCl0aHJvdyBsfXQub24oXCJlcnJvclwiLHUpLHIub24oXCJlcnJvclwiLHUpO2Z1bmN0aW9uIGYoKXt0LnJlbW92ZUxpc3RlbmVyKFwiZGF0YVwiLG4pLHIucmVtb3ZlTGlzdGVuZXIoXCJkcmFpblwiLGkpLHQucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixzKSx0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixhKSx0LnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIix1KSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIix1KSx0LnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsZiksdC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsZiksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsZil9cmV0dXJuIHQub24oXCJlbmRcIixmKSx0Lm9uKFwiY2xvc2VcIixmKSxyLm9uKFwiY2xvc2VcIixmKSxyLmVtaXQoXCJwaXBlXCIsdCkscn19KTt2YXIgdXM9UygoeWQsYXMpPT57YygpO3ZhciBhdD0xZTMsdXQ9YXQqNjAsZnQ9dXQqNjAsJGU9ZnQqMjQsZmM9JGUqNyxjYz0kZSozNjUuMjU7YXMuZXhwb3J0cz1mdW5jdGlvbihyLGUpe2U9ZXx8e307dmFyIHQ9dHlwZW9mIHI7aWYodD09PVwic3RyaW5nXCImJnIubGVuZ3RoPjApcmV0dXJuIGxjKHIpO2lmKHQ9PT1cIm51bWJlclwiJiZpc0Zpbml0ZShyKSlyZXR1cm4gZS5sb25nP3BjKHIpOmRjKHIpO3Rocm93IG5ldyBFcnJvcihcInZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9XCIrSlNPTi5zdHJpbmdpZnkocikpfTtmdW5jdGlvbiBsYyhyKXtpZihyPVN0cmluZyhyKSwhKHIubGVuZ3RoPjEwMCkpe3ZhciBlPS9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhyKTtpZighIWUpe3ZhciB0PXBhcnNlRmxvYXQoZVsxXSksbj0oZVsyXXx8XCJtc1wiKS50b0xvd2VyQ2FzZSgpO3N3aXRjaChuKXtjYXNlXCJ5ZWFyc1wiOmNhc2VcInllYXJcIjpjYXNlXCJ5cnNcIjpjYXNlXCJ5clwiOmNhc2VcInlcIjpyZXR1cm4gdCpjYztjYXNlXCJ3ZWVrc1wiOmNhc2VcIndlZWtcIjpjYXNlXCJ3XCI6cmV0dXJuIHQqZmM7Y2FzZVwiZGF5c1wiOmNhc2VcImRheVwiOmNhc2VcImRcIjpyZXR1cm4gdCokZTtjYXNlXCJob3Vyc1wiOmNhc2VcImhvdXJcIjpjYXNlXCJocnNcIjpjYXNlXCJoclwiOmNhc2VcImhcIjpyZXR1cm4gdCpmdDtjYXNlXCJtaW51dGVzXCI6Y2FzZVwibWludXRlXCI6Y2FzZVwibWluc1wiOmNhc2VcIm1pblwiOmNhc2VcIm1cIjpyZXR1cm4gdCp1dDtjYXNlXCJzZWNvbmRzXCI6Y2FzZVwic2Vjb25kXCI6Y2FzZVwic2Vjc1wiOmNhc2VcInNlY1wiOmNhc2VcInNcIjpyZXR1cm4gdCphdDtjYXNlXCJtaWxsaXNlY29uZHNcIjpjYXNlXCJtaWxsaXNlY29uZFwiOmNhc2VcIm1zZWNzXCI6Y2FzZVwibXNlY1wiOmNhc2VcIm1zXCI6cmV0dXJuIHQ7ZGVmYXVsdDpyZXR1cm59fX19ZnVuY3Rpb24gZGMocil7dmFyIGU9TWF0aC5hYnMocik7cmV0dXJuIGU+PSRlP01hdGgucm91bmQoci8kZSkrXCJkXCI6ZT49ZnQ/TWF0aC5yb3VuZChyL2Z0KStcImhcIjplPj11dD9NYXRoLnJvdW5kKHIvdXQpK1wibVwiOmU+PWF0P01hdGgucm91bmQoci9hdCkrXCJzXCI6citcIm1zXCJ9ZnVuY3Rpb24gcGMocil7dmFyIGU9TWF0aC5hYnMocik7cmV0dXJuIGU+PSRlP2ZyKHIsZSwkZSxcImRheVwiKTplPj1mdD9mcihyLGUsZnQsXCJob3VyXCIpOmU+PXV0P2ZyKHIsZSx1dCxcIm1pbnV0ZVwiKTplPj1hdD9mcihyLGUsYXQsXCJzZWNvbmRcIik6citcIiBtc1wifWZ1bmN0aW9uIGZyKHIsZSx0LG4pe3ZhciBpPWU+PXQqMS41O3JldHVybiBNYXRoLnJvdW5kKHIvdCkrXCIgXCIrbisoaT9cInNcIjpcIlwiKX19KTt2YXIgY3M9UygoYmQsZnMpPT57YygpO2Z1bmN0aW9uIGhjKHIpe3QuZGVidWc9dCx0LmRlZmF1bHQ9dCx0LmNvZXJjZT11LHQuZGlzYWJsZT1vLHQuZW5hYmxlPWksdC5lbmFibGVkPXMsdC5odW1hbml6ZT11cygpLHQuZGVzdHJveT1mLE9iamVjdC5rZXlzKHIpLmZvckVhY2gobD0+e3RbbF09cltsXX0pLHQubmFtZXM9W10sdC5za2lwcz1bXSx0LmZvcm1hdHRlcnM9e307ZnVuY3Rpb24gZShsKXtsZXQgZD0wO2ZvcihsZXQgaD0wO2g8bC5sZW5ndGg7aCsrKWQ9KGQ8PDUpLWQrbC5jaGFyQ29kZUF0KGgpLGR8PTA7cmV0dXJuIHQuY29sb3JzW01hdGguYWJzKGQpJXQuY29sb3JzLmxlbmd0aF19dC5zZWxlY3RDb2xvcj1lO2Z1bmN0aW9uIHQobCl7bGV0IGQsaD1udWxsLG0sYjtmdW5jdGlvbiB5KC4uLncpe2lmKCF5LmVuYWJsZWQpcmV0dXJuO2xldCBfPXksdj1OdW1iZXIobmV3IERhdGUpLHE9di0oZHx8dik7Xy5kaWZmPXEsXy5wcmV2PWQsXy5jdXJyPXYsZD12LHdbMF09dC5jb2VyY2Uod1swXSksdHlwZW9mIHdbMF0hPVwic3RyaW5nXCImJncudW5zaGlmdChcIiVPXCIpO2xldCBBPTA7d1swXT13WzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLChZLEdlKT0+e2lmKFk9PT1cIiUlXCIpcmV0dXJuXCIlXCI7QSsrO2xldCBJZT10LmZvcm1hdHRlcnNbR2VdO2lmKHR5cGVvZiBJZT09XCJmdW5jdGlvblwiKXtsZXQgQWU9d1tBXTtZPUllLmNhbGwoXyxBZSksdy5zcGxpY2UoQSwxKSxBLS19cmV0dXJuIFl9KSx0LmZvcm1hdEFyZ3MuY2FsbChfLHcpLChfLmxvZ3x8dC5sb2cpLmFwcGx5KF8sdyl9cmV0dXJuIHkubmFtZXNwYWNlPWwseS51c2VDb2xvcnM9dC51c2VDb2xvcnMoKSx5LmNvbG9yPXQuc2VsZWN0Q29sb3IobCkseS5leHRlbmQ9bix5LmRlc3Ryb3k9dC5kZXN0cm95LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LFwiZW5hYmxlZFwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6KCk9PmghPT1udWxsP2g6KG0hPT10Lm5hbWVzcGFjZXMmJihtPXQubmFtZXNwYWNlcyxiPXQuZW5hYmxlZChsKSksYiksc2V0Onc9PntoPXd9fSksdHlwZW9mIHQuaW5pdD09XCJmdW5jdGlvblwiJiZ0LmluaXQoeSkseX1mdW5jdGlvbiBuKGwsZCl7bGV0IGg9dCh0aGlzLm5hbWVzcGFjZSsodHlwZW9mIGQ+XCJ1XCI/XCI6XCI6ZCkrbCk7cmV0dXJuIGgubG9nPXRoaXMubG9nLGh9ZnVuY3Rpb24gaShsKXt0LnNhdmUobCksdC5uYW1lc3BhY2VzPWwsdC5uYW1lcz1bXSx0LnNraXBzPVtdO2xldCBkLGg9KHR5cGVvZiBsPT1cInN0cmluZ1wiP2w6XCJcIikuc3BsaXQoL1tcXHMsXSsvKSxtPWgubGVuZ3RoO2ZvcihkPTA7ZDxtO2QrKykhaFtkXXx8KGw9aFtkXS5yZXBsYWNlKC9cXCovZyxcIi4qP1wiKSxsWzBdPT09XCItXCI/dC5za2lwcy5wdXNoKG5ldyBSZWdFeHAoXCJeXCIrbC5zbGljZSgxKStcIiRcIikpOnQubmFtZXMucHVzaChuZXcgUmVnRXhwKFwiXlwiK2wrXCIkXCIpKSl9ZnVuY3Rpb24gbygpe2xldCBsPVsuLi50Lm5hbWVzLm1hcChhKSwuLi50LnNraXBzLm1hcChhKS5tYXAoZD0+XCItXCIrZCldLmpvaW4oXCIsXCIpO3JldHVybiB0LmVuYWJsZShcIlwiKSxsfWZ1bmN0aW9uIHMobCl7aWYobFtsLmxlbmd0aC0xXT09PVwiKlwiKXJldHVybiEwO2xldCBkLGg7Zm9yKGQ9MCxoPXQuc2tpcHMubGVuZ3RoO2Q8aDtkKyspaWYodC5za2lwc1tkXS50ZXN0KGwpKXJldHVybiExO2ZvcihkPTAsaD10Lm5hbWVzLmxlbmd0aDtkPGg7ZCsrKWlmKHQubmFtZXNbZF0udGVzdChsKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBhKGwpe3JldHVybiBsLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIsbC50b1N0cmluZygpLmxlbmd0aC0yKS5yZXBsYWNlKC9cXC5cXCpcXD8kLyxcIipcIil9ZnVuY3Rpb24gdShsKXtyZXR1cm4gbCBpbnN0YW5jZW9mIEVycm9yP2wuc3RhY2t8fGwubWVzc2FnZTpsfWZ1bmN0aW9uIGYoKXtjb25zb2xlLndhcm4oXCJJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuXCIpfXJldHVybiB0LmVuYWJsZSh0LmxvYWQoKSksdH1mcy5leHBvcnRzPWhjfSk7dmFyIGxlPVMoKHosY3IpPT57YygpO3ouZm9ybWF0QXJncz1nYzt6LnNhdmU9eWM7ei5sb2FkPWJjO3oudXNlQ29sb3JzPW1jO3ouc3RvcmFnZT14YygpO3ouZGVzdHJveT0oKCk9PntsZXQgcj0hMTtyZXR1cm4oKT0+e3J8fChyPSEwLGNvbnNvbGUud2FybihcIkluc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC5cIikpfX0pKCk7ei5jb2xvcnM9W1wiIzAwMDBDQ1wiLFwiIzAwMDBGRlwiLFwiIzAwMzNDQ1wiLFwiIzAwMzNGRlwiLFwiIzAwNjZDQ1wiLFwiIzAwNjZGRlwiLFwiIzAwOTlDQ1wiLFwiIzAwOTlGRlwiLFwiIzAwQ0MwMFwiLFwiIzAwQ0MzM1wiLFwiIzAwQ0M2NlwiLFwiIzAwQ0M5OVwiLFwiIzAwQ0NDQ1wiLFwiIzAwQ0NGRlwiLFwiIzMzMDBDQ1wiLFwiIzMzMDBGRlwiLFwiIzMzMzNDQ1wiLFwiIzMzMzNGRlwiLFwiIzMzNjZDQ1wiLFwiIzMzNjZGRlwiLFwiIzMzOTlDQ1wiLFwiIzMzOTlGRlwiLFwiIzMzQ0MwMFwiLFwiIzMzQ0MzM1wiLFwiIzMzQ0M2NlwiLFwiIzMzQ0M5OVwiLFwiIzMzQ0NDQ1wiLFwiIzMzQ0NGRlwiLFwiIzY2MDBDQ1wiLFwiIzY2MDBGRlwiLFwiIzY2MzNDQ1wiLFwiIzY2MzNGRlwiLFwiIzY2Q0MwMFwiLFwiIzY2Q0MzM1wiLFwiIzk5MDBDQ1wiLFwiIzk5MDBGRlwiLFwiIzk5MzNDQ1wiLFwiIzk5MzNGRlwiLFwiIzk5Q0MwMFwiLFwiIzk5Q0MzM1wiLFwiI0NDMDAwMFwiLFwiI0NDMDAzM1wiLFwiI0NDMDA2NlwiLFwiI0NDMDA5OVwiLFwiI0NDMDBDQ1wiLFwiI0NDMDBGRlwiLFwiI0NDMzMwMFwiLFwiI0NDMzMzM1wiLFwiI0NDMzM2NlwiLFwiI0NDMzM5OVwiLFwiI0NDMzNDQ1wiLFwiI0NDMzNGRlwiLFwiI0NDNjYwMFwiLFwiI0NDNjYzM1wiLFwiI0NDOTkwMFwiLFwiI0NDOTkzM1wiLFwiI0NDQ0MwMFwiLFwiI0NDQ0MzM1wiLFwiI0ZGMDAwMFwiLFwiI0ZGMDAzM1wiLFwiI0ZGMDA2NlwiLFwiI0ZGMDA5OVwiLFwiI0ZGMDBDQ1wiLFwiI0ZGMDBGRlwiLFwiI0ZGMzMwMFwiLFwiI0ZGMzMzM1wiLFwiI0ZGMzM2NlwiLFwiI0ZGMzM5OVwiLFwiI0ZGMzNDQ1wiLFwiI0ZGMzNGRlwiLFwiI0ZGNjYwMFwiLFwiI0ZGNjYzM1wiLFwiI0ZGOTkwMFwiLFwiI0ZGOTkzM1wiLFwiI0ZGQ0MwMFwiLFwiI0ZGQ0MzM1wiXTtmdW5jdGlvbiBtYygpe3JldHVybiB0eXBlb2Ygd2luZG93PFwidVwiJiZ3aW5kb3cucHJvY2VzcyYmKHdpbmRvdy5wcm9jZXNzLnR5cGU9PT1cInJlbmRlcmVyXCJ8fHdpbmRvdy5wcm9jZXNzLl9fbndqcyk/ITA6dHlwZW9mIG5hdmlnYXRvcjxcInVcIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pPyExOnR5cGVvZiBkb2N1bWVudDxcInVcIiYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlfHx0eXBlb2Ygd2luZG93PFwidVwiJiZ3aW5kb3cuY29uc29sZSYmKHdpbmRvdy5jb25zb2xlLmZpcmVidWd8fHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiYmd2luZG93LmNvbnNvbGUudGFibGUpfHx0eXBlb2YgbmF2aWdhdG9yPFwidVwiJiZuYXZpZ2F0b3IudXNlckFnZW50JiZuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSYmcGFyc2VJbnQoUmVnRXhwLiQxLDEwKT49MzF8fHR5cGVvZiBuYXZpZ2F0b3I8XCJ1XCImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKX1mdW5jdGlvbiBnYyhyKXtpZihyWzBdPSh0aGlzLnVzZUNvbG9ycz9cIiVjXCI6XCJcIikrdGhpcy5uYW1lc3BhY2UrKHRoaXMudXNlQ29sb3JzP1wiICVjXCI6XCIgXCIpK3JbMF0rKHRoaXMudXNlQ29sb3JzP1wiJWMgXCI6XCIgXCIpK1wiK1wiK2NyLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSwhdGhpcy51c2VDb2xvcnMpcmV0dXJuO2xldCBlPVwiY29sb3I6IFwiK3RoaXMuY29sb3I7ci5zcGxpY2UoMSwwLGUsXCJjb2xvcjogaW5oZXJpdFwiKTtsZXQgdD0wLG49MDtyWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZyxpPT57aSE9PVwiJSVcIiYmKHQrKyxpPT09XCIlY1wiJiYobj10KSl9KSxyLnNwbGljZShuLDAsZSl9ei5sb2c9Y29uc29sZS5kZWJ1Z3x8Y29uc29sZS5sb2d8fCgoKT0+e30pO2Z1bmN0aW9uIHljKHIpe3RyeXtyP3ouc3RvcmFnZS5zZXRJdGVtKFwiZGVidWdcIixyKTp6LnN0b3JhZ2UucmVtb3ZlSXRlbShcImRlYnVnXCIpfWNhdGNoe319ZnVuY3Rpb24gYmMoKXtsZXQgcjt0cnl7cj16LnN0b3JhZ2UuZ2V0SXRlbShcImRlYnVnXCIpfWNhdGNoe31yZXR1cm4hciYmdHlwZW9mIHByb2Nlc3M8XCJ1XCImJlwiZW52XCJpbiBwcm9jZXNzJiYocj1wcm9jZXNzLmVudi5ERUJVRykscn1mdW5jdGlvbiB4Yygpe3RyeXtyZXR1cm4gbG9jYWxTdG9yYWdlfWNhdGNoe319Y3IuZXhwb3J0cz1jcygpKHopO3Zhcntmb3JtYXR0ZXJzOl9jfT1jci5leHBvcnRzO19jLmo9ZnVuY3Rpb24ocil7dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShyKX1jYXRjaChlKXtyZXR1cm5cIltVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiBcIitlLm1lc3NhZ2V9fX0pO3ZhciBuYT1TKHRpPT57XCJ1c2Ugc3RyaWN0XCI7YygpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcmE9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7dGhpcy5fZGF0YUxlbmd0aD0wLHRoaXMuX2J1ZmZlckxlbmd0aD0wLHRoaXMuX3N0YXRlPW5ldyBJbnQzMkFycmF5KDQpLHRoaXMuX2J1ZmZlcj1uZXcgQXJyYXlCdWZmZXIoNjgpLHRoaXMuX2J1ZmZlcjg9bmV3IFVpbnQ4QXJyYXkodGhpcy5fYnVmZmVyLDAsNjgpLHRoaXMuX2J1ZmZlcjMyPW5ldyBVaW50MzJBcnJheSh0aGlzLl9idWZmZXIsMCwxNyksdGhpcy5zdGFydCgpfXJldHVybiByLmhhc2hTdHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9ITEpLHRoaXMub25lUGFzc0hhc2hlci5zdGFydCgpLmFwcGVuZFN0cihlKS5lbmQodCl9LHIuaGFzaEFzY2lpU3RyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSx0aGlzLm9uZVBhc3NIYXNoZXIuc3RhcnQoKS5hcHBlbmRBc2NpaVN0cihlKS5lbmQodCl9LHIuX2hleD1mdW5jdGlvbihlKXt2YXIgdD1yLmhleENoYXJzLG49ci5oZXhPdXQsaSxvLHMsYTtmb3IoYT0wO2E8NDthKz0xKWZvcihvPWEqOCxpPWVbYV0scz0wO3M8ODtzKz0yKW5bbysxK3NdPXQuY2hhckF0KGkmMTUpLGk+Pj49NCxuW28rMCtzXT10LmNoYXJBdChpJjE1KSxpPj4+PTQ7cmV0dXJuIG4uam9pbihcIlwiKX0sci5fbWQ1Y3ljbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lWzBdLGk9ZVsxXSxvPWVbMl0scz1lWzNdO24rPShpJm98fmkmcykrdFswXS02ODA4NzY5MzZ8MCxuPShuPDw3fG4+Pj4yNSkraXwwLHMrPShuJml8fm4mbykrdFsxXS0zODk1NjQ1ODZ8MCxzPShzPDwxMnxzPj4+MjApK258MCxvKz0ocyZufH5zJmkpK3RbMl0rNjA2MTA1ODE5fDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzNdLTEwNDQ1MjUzMzB8MCxpPShpPDwyMnxpPj4+MTApK298MCxuKz0oaSZvfH5pJnMpK3RbNF0tMTc2NDE4ODk3fDAsbj0objw8N3xuPj4+MjUpK2l8MCxzKz0obiZpfH5uJm8pK3RbNV0rMTIwMDA4MDQyNnwwLHM9KHM8PDEyfHM+Pj4yMCkrbnwwLG8rPShzJm58fnMmaSkrdFs2XS0xNDczMjMxMzQxfDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzddLTQ1NzA1OTgzfDAsaT0oaTw8MjJ8aT4+PjEwKStvfDAsbis9KGkmb3x+aSZzKSt0WzhdKzE3NzAwMzU0MTZ8MCxuPShuPDw3fG4+Pj4yNSkraXwwLHMrPShuJml8fm4mbykrdFs5XS0xOTU4NDE0NDE3fDAscz0oczw8MTJ8cz4+PjIwKStufDAsbys9KHMmbnx+cyZpKSt0WzEwXS00MjA2M3wwLG89KG88PDE3fG8+Pj4xNSkrc3wwLGkrPShvJnN8fm8mbikrdFsxMV0tMTk5MDQwNDE2MnwwLGk9KGk8PDIyfGk+Pj4xMCkrb3wwLG4rPShpJm98fmkmcykrdFsxMl0rMTgwNDYwMzY4MnwwLG49KG48PDd8bj4+PjI1KStpfDAscys9KG4maXx+biZvKSt0WzEzXS00MDM0MTEwMXwwLHM9KHM8PDEyfHM+Pj4yMCkrbnwwLG8rPShzJm58fnMmaSkrdFsxNF0tMTUwMjAwMjI5MHwwLG89KG88PDE3fG8+Pj4xNSkrc3wwLGkrPShvJnN8fm8mbikrdFsxNV0rMTIzNjUzNTMyOXwwLGk9KGk8PDIyfGk+Pj4xMCkrb3wwLG4rPShpJnN8byZ+cykrdFsxXS0xNjU3OTY1MTB8MCxuPShuPDw1fG4+Pj4yNykraXwwLHMrPShuJm98aSZ+bykrdFs2XS0xMDY5NTAxNjMyfDAscz0oczw8OXxzPj4+MjMpK258MCxvKz0ocyZpfG4mfmkpK3RbMTFdKzY0MzcxNzcxM3wwLG89KG88PDE0fG8+Pj4xOCkrc3wwLGkrPShvJm58cyZ+bikrdFswXS0zNzM4OTczMDJ8MCxpPShpPDwyMHxpPj4+MTIpK298MCxuKz0oaSZzfG8mfnMpK3RbNV0tNzAxNTU4NjkxfDAsbj0objw8NXxuPj4+MjcpK2l8MCxzKz0obiZvfGkmfm8pK3RbMTBdKzM4MDE2MDgzfDAscz0oczw8OXxzPj4+MjMpK258MCxvKz0ocyZpfG4mfmkpK3RbMTVdLTY2MDQ3ODMzNXwwLG89KG88PDE0fG8+Pj4xOCkrc3wwLGkrPShvJm58cyZ+bikrdFs0XS00MDU1Mzc4NDh8MCxpPShpPDwyMHxpPj4+MTIpK298MCxuKz0oaSZzfG8mfnMpK3RbOV0rNTY4NDQ2NDM4fDAsbj0objw8NXxuPj4+MjcpK2l8MCxzKz0obiZvfGkmfm8pK3RbMTRdLTEwMTk4MDM2OTB8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFszXS0xODczNjM5NjF8MCxvPShvPDwxNHxvPj4+MTgpK3N8MCxpKz0obyZufHMmfm4pK3RbOF0rMTE2MzUzMTUwMXwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpJnN8byZ+cykrdFsxM10tMTQ0NDY4MTQ2N3wwLG49KG48PDV8bj4+PjI3KStpfDAscys9KG4mb3xpJn5vKSt0WzJdLTUxNDAzNzg0fDAscz0oczw8OXxzPj4+MjMpK258MCxvKz0ocyZpfG4mfmkpK3RbN10rMTczNTMyODQ3M3wwLG89KG88PDE0fG8+Pj4xOCkrc3wwLGkrPShvJm58cyZ+bikrdFsxMl0tMTkyNjYwNzczNHwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpXm9ecykrdFs1XS0zNzg1NTh8MCxuPShuPDw0fG4+Pj4yOCkraXwwLHMrPShuXmlebykrdFs4XS0yMDIyNTc0NDYzfDAscz0oczw8MTF8cz4+PjIxKStufDAsbys9KHNebl5pKSt0WzExXSsxODM5MDMwNTYyfDAsbz0obzw8MTZ8bz4+PjE2KStzfDAsaSs9KG9ec15uKSt0WzE0XS0zNTMwOTU1NnwwLGk9KGk8PDIzfGk+Pj45KStvfDAsbis9KGleb15zKSt0WzFdLTE1MzA5OTIwNjB8MCxuPShuPDw0fG4+Pj4yOCkraXwwLHMrPShuXmlebykrdFs0XSsxMjcyODkzMzUzfDAscz0oczw8MTF8cz4+PjIxKStufDAsbys9KHNebl5pKSt0WzddLTE1NTQ5NzYzMnwwLG89KG88PDE2fG8+Pj4xNikrc3wwLGkrPShvXnNebikrdFsxMF0tMTA5NDczMDY0MHwwLGk9KGk8PDIzfGk+Pj45KStvfDAsbis9KGleb15zKSt0WzEzXSs2ODEyNzkxNzR8MCxuPShuPDw0fG4+Pj4yOCkraXwwLHMrPShuXmlebykrdFswXS0zNTg1MzcyMjJ8MCxzPShzPDwxMXxzPj4+MjEpK258MCxvKz0oc15uXmkpK3RbM10tNzIyNTIxOTc5fDAsbz0obzw8MTZ8bz4+PjE2KStzfDAsaSs9KG9ec15uKSt0WzZdKzc2MDI5MTg5fDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0oaV5vXnMpK3RbOV0tNjQwMzY0NDg3fDAsbj0objw8NHxuPj4+MjgpK2l8MCxzKz0obl5pXm8pK3RbMTJdLTQyMTgxNTgzNXwwLHM9KHM8PDExfHM+Pj4yMSkrbnwwLG8rPShzXm5eaSkrdFsxNV0rNTMwNzQyNTIwfDAsbz0obzw8MTZ8bz4+PjE2KStzfDAsaSs9KG9ec15uKSt0WzJdLTk5NTMzODY1MXwwLGk9KGk8PDIzfGk+Pj45KStvfDAsbis9KG9eKGl8fnMpKSt0WzBdLTE5ODYzMDg0NHwwLG49KG48PDZ8bj4+PjI2KStpfDAscys9KGleKG58fm8pKSt0WzddKzExMjY4OTE0MTV8MCxzPShzPDwxMHxzPj4+MjIpK258MCxvKz0obl4oc3x+aSkpK3RbMTRdLTE0MTYzNTQ5MDV8MCxvPShvPDwxNXxvPj4+MTcpK3N8MCxpKz0oc14ob3x+bikpK3RbNV0tNTc0MzQwNTV8MCxpPShpPDwyMXxpPj4+MTEpK298MCxuKz0ob14oaXx+cykpK3RbMTJdKzE3MDA0ODU1NzF8MCxuPShuPDw2fG4+Pj4yNikraXwwLHMrPShpXihufH5vKSkrdFszXS0xODk0OTg2NjA2fDAscz0oczw8MTB8cz4+PjIyKStufDAsbys9KG5eKHN8fmkpKSt0WzEwXS0xMDUxNTIzfDAsbz0obzw8MTV8bz4+PjE3KStzfDAsaSs9KHNeKG98fm4pKSt0WzFdLTIwNTQ5MjI3OTl8MCxpPShpPDwyMXxpPj4+MTEpK298MCxuKz0ob14oaXx+cykpK3RbOF0rMTg3MzMxMzM1OXwwLG49KG48PDZ8bj4+PjI2KStpfDAscys9KGleKG58fm8pKSt0WzE1XS0zMDYxMTc0NHwwLHM9KHM8PDEwfHM+Pj4yMikrbnwwLG8rPShuXihzfH5pKSkrdFs2XS0xNTYwMTk4MzgwfDAsbz0obzw8MTV8bz4+PjE3KStzfDAsaSs9KHNeKG98fm4pKSt0WzEzXSsxMzA5MTUxNjQ5fDAsaT0oaTw8MjF8aT4+PjExKStvfDAsbis9KG9eKGl8fnMpKSt0WzRdLTE0NTUyMzA3MHwwLG49KG48PDZ8bj4+PjI2KStpfDAscys9KGleKG58fm8pKSt0WzExXS0xMTIwMjEwMzc5fDAscz0oczw8MTB8cz4+PjIyKStufDAsbys9KG5eKHN8fmkpKSt0WzJdKzcxODc4NzI1OXwwLG89KG88PDE1fG8+Pj4xNykrc3wwLGkrPShzXihvfH5uKSkrdFs5XS0zNDM0ODU1NTF8MCxpPShpPDwyMXxpPj4+MTEpK298MCxlWzBdPW4rZVswXXwwLGVbMV09aStlWzFdfDAsZVsyXT1vK2VbMl18MCxlWzNdPXMrZVszXXwwfSxyLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhTGVuZ3RoPTAsdGhpcy5fYnVmZmVyTGVuZ3RoPTAsdGhpcy5fc3RhdGUuc2V0KHIuc3RhdGVJZGVudGl0eSksdGhpc30sci5wcm90b3R5cGUuYXBwZW5kU3RyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2J1ZmZlcjgsbj10aGlzLl9idWZmZXIzMixpPXRoaXMuX2J1ZmZlckxlbmd0aCxvLHM7Zm9yKHM9MDtzPGUubGVuZ3RoO3MrPTEpe2lmKG89ZS5jaGFyQ29kZUF0KHMpLG88MTI4KXRbaSsrXT1vO2Vsc2UgaWYobzwyMDQ4KXRbaSsrXT0obz4+PjYpKzE5Mix0W2krK109byY2M3wxMjg7ZWxzZSBpZihvPDU1Mjk2fHxvPjU2MzE5KXRbaSsrXT0obz4+PjEyKSsyMjQsdFtpKytdPW8+Pj42JjYzfDEyOCx0W2krK109byY2M3wxMjg7ZWxzZXtpZihvPShvLTU1Mjk2KSoxMDI0KyhlLmNoYXJDb2RlQXQoKytzKS01NjMyMCkrNjU1MzYsbz4xMTE0MTExKXRocm93IG5ldyBFcnJvcihcIlVuaWNvZGUgc3RhbmRhcmQgc3VwcG9ydHMgY29kZSBwb2ludHMgdXAgdG8gVSsxMEZGRkZcIik7dFtpKytdPShvPj4+MTgpKzI0MCx0W2krK109bz4+PjEyJjYzfDEyOCx0W2krK109bz4+PjYmNjN8MTI4LHRbaSsrXT1vJjYzfDEyOH1pPj02NCYmKHRoaXMuX2RhdGFMZW5ndGgrPTY0LHIuX21kNWN5Y2xlKHRoaXMuX3N0YXRlLG4pLGktPTY0LG5bMF09blsxNl0pfXJldHVybiB0aGlzLl9idWZmZXJMZW5ndGg9aSx0aGlzfSxyLnByb3RvdHlwZS5hcHBlbmRBc2NpaVN0cj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5fYnVmZmVyOCxuPXRoaXMuX2J1ZmZlcjMyLGk9dGhpcy5fYnVmZmVyTGVuZ3RoLG8scz0wOzspe2ZvcihvPU1hdGgubWluKGUubGVuZ3RoLXMsNjQtaSk7by0tOyl0W2krK109ZS5jaGFyQ29kZUF0KHMrKyk7aWYoaTw2NClicmVhazt0aGlzLl9kYXRhTGVuZ3RoKz02NCxyLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxuKSxpPTB9cmV0dXJuIHRoaXMuX2J1ZmZlckxlbmd0aD1pLHRoaXN9LHIucHJvdG90eXBlLmFwcGVuZEJ5dGVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5fYnVmZmVyOCxuPXRoaXMuX2J1ZmZlcjMyLGk9dGhpcy5fYnVmZmVyTGVuZ3RoLG8scz0wOzspe2ZvcihvPU1hdGgubWluKGUubGVuZ3RoLXMsNjQtaSk7by0tOyl0W2krK109ZVtzKytdO2lmKGk8NjQpYnJlYWs7dGhpcy5fZGF0YUxlbmd0aCs9NjQsci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsbiksaT0wfXJldHVybiB0aGlzLl9idWZmZXJMZW5ndGg9aSx0aGlzfSxyLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3N0YXRlO3JldHVybntidWZmZXI6U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLEFycmF5LmZyb20odGhpcy5fYnVmZmVyOCkpLGJ1Zmxlbjp0aGlzLl9idWZmZXJMZW5ndGgsbGVuZ3RoOnRoaXMuX2RhdGFMZW5ndGgsc3RhdGU6W2VbMF0sZVsxXSxlWzJdLGVbM11dfX0sci5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5idWZmZXIsbj1lLnN0YXRlLGk9dGhpcy5fc3RhdGUsbztmb3IodGhpcy5fZGF0YUxlbmd0aD1lLmxlbmd0aCx0aGlzLl9idWZmZXJMZW5ndGg9ZS5idWZsZW4saVswXT1uWzBdLGlbMV09blsxXSxpWzJdPW5bMl0saVszXT1uWzNdLG89MDtvPHQubGVuZ3RoO28rPTEpdGhpcy5fYnVmZmVyOFtvXT10LmNoYXJDb2RlQXQobyl9LHIucHJvdG90eXBlLmVuZD1mdW5jdGlvbihlKXtlPT09dm9pZCAwJiYoZT0hMSk7dmFyIHQ9dGhpcy5fYnVmZmVyTGVuZ3RoLG49dGhpcy5fYnVmZmVyOCxpPXRoaXMuX2J1ZmZlcjMyLG89KHQ+PjIpKzE7dGhpcy5fZGF0YUxlbmd0aCs9dDt2YXIgcz10aGlzLl9kYXRhTGVuZ3RoKjg7aWYoblt0XT0xMjgsblt0KzFdPW5bdCsyXT1uW3QrM109MCxpLnNldChyLmJ1ZmZlcjMySWRlbnRpdHkuc3ViYXJyYXkobyksbyksdD41NSYmKHIuX21kNWN5Y2xlKHRoaXMuX3N0YXRlLGkpLGkuc2V0KHIuYnVmZmVyMzJJZGVudGl0eSkpLHM8PTQyOTQ5NjcyOTUpaVsxNF09cztlbHNle3ZhciBhPXMudG9TdHJpbmcoMTYpLm1hdGNoKC8oLio/KSguezAsOH0pJC8pO2lmKGE9PT1udWxsKXJldHVybjt2YXIgdT1wYXJzZUludChhWzJdLDE2KSxmPXBhcnNlSW50KGFbMV0sMTYpfHwwO2lbMTRdPXUsaVsxNV09Zn1yZXR1cm4gci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsaSksZT90aGlzLl9zdGF0ZTpyLl9oZXgodGhpcy5fc3RhdGUpfSxyLnN0YXRlSWRlbnRpdHk9bmV3IEludDMyQXJyYXkoWzE3MzI1ODQxOTMsLTI3MTczMzg3OSwtMTczMjU4NDE5NCwyNzE3MzM4NzhdKSxyLmJ1ZmZlcjMySWRlbnRpdHk9bmV3IEludDMyQXJyYXkoWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdKSxyLmhleENoYXJzPVwiMDEyMzQ1Njc4OWFiY2RlZlwiLHIuaGV4T3V0PVtdLHIub25lUGFzc0hhc2hlcj1uZXcgcixyfSgpO3RpLk1kNT1yYTtpZihyYS5oYXNoU3RyKFwiaGVsbG9cIikhPT1cIjVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyXCIpdGhyb3cgbmV3IEVycm9yKFwiTWQ1IHNlbGYgdGVzdCBmYWlsZWQuXCIpfSk7dmFyIGlsPXt9O1B0KGlsLHtBQUNEZXBheTooKT0+b3QsQmFzaWNEZXBheTooKT0+c3IsQ2FudmFzU2luazooKT0+c3QsSDI2NERlcGF5OigpPT5jdCxIdG1sNUNhbnZhc1BpcGVsaW5lOigpPT5IcixIdG1sNVZpZGVvTWV0YWRhdGFQaXBlbGluZTooKT0+cXIsSHRtbDVWaWRlb1BpcGVsaW5lOigpPT5fdCxIdHRwTXNlUGlwZWxpbmU6KCk9PkdyLEh0dHBTb3VyY2U6KCk9PmRyLEluc3BlY3RvcjooKT0+cHIsSlBFR0RlcGF5OigpPT5sdCxNZXNzYWdlVHlwZTooKT0+SSxNZXRhZGF0YVBpcGVsaW5lOigpPT5qcixNcDRDYXB0dXJlOigpPT5tcixNcDRNdXhlcjooKT0+cHQsTXNlU2luazooKT0+VGUsT05WSUZEZXBheTooKT0+Q2UsUGlwZWxpbmU6KCk9PkJlLFJUQ1BQYWNrZXRUeXBlOigpPT5LbixSVFNQUmVzcG9uc2VFcnJvcjooKT0+SXQsUlRTUF9NRVRIT0Q6KCk9Pk9yLFJ0c3BNanBlZ1BpcGVsaW5lOigpPT54dCxSdHNwTXA0UGlwZWxpbmU6KCk9PmJ0LFJ0c3BQYXJzZXI6KCk9Pm10LFJ0c3BQaXBlbGluZTooKT0+ZWUsUnRzcFNlc3Npb246KCk9Pnl0LFNERVNJdGVtOigpPT5KbixTUjooKT0+SHMsU2NoZWR1bGVyOigpPT5XZSxTaW5rOigpPT5RLFNvdXJjZTooKT0+VixUdWJlOigpPT5SLFdTU291cmNlOigpPT5HLFdzU2RwUGlwZWxpbmU6KCk9PldyLGFkZFJUU1BSZXRyeTooKT0+YWEsYm9keU9mZnNldDooKT0+QXIsY1NyYzooKT0+bnMsY1NyY0NvdW50OigpPT5TZSxjb21wb25lbnRzOigpPT5laSxjb25uZWN0aW9uRW5kZWQ6KCk9PkxyLGNvbnRlbnRCYXNlOigpPT5Ccixjb250ZW50TG9jYXRpb246KCk9Pk1yLGNyZWF0ZVRyYW5zZm9ybTooKT0+eWUsZXh0SGVhZGVyOigpPT5pcyxleHRIZWFkZXJMZW5ndGg6KCk9Pk10LGV4dGVuc2lvbjooKT0+b3IsZXh0cmFjdEhlYWRlclZhbHVlOigpPT5yZSxleHRyYWN0VVJJczooKT0+SnMsZ2V0VGltZTooKT0+UHIsaXNSdGNwQXBwOigpPT4kcyxpc1J0Y3BCeWU6KCk9PndyLGlzUnRjcFJSOigpPT5qcyxpc1J0Y3BTREVTOigpPT5Xcyxpc1J0Y3BTUjooKT0+X3IsbWFya2VyOigpPT5jZSxtZXNzYWdlRnJvbUJ1ZmZlcjooKT0+U3IscGFkZGluZzooKT0+ZXMscGFyc2U6KCk9PlFuLHBhcnNlUnRjcDooKT0+WG4scGF5bG9hZDooKT0+WixwYXlsb2FkVHlwZTooKT0+TyxwaXBlbGluZXM6KCk9Pm5pLHJhbmdlOigpPT5JcixydGNwTWVzc2FnZUZyb21CdWZmZXI6KCk9PnhyLHNTcmM6KCk9PnJzLHNlcXVlbmNlOigpPT5ScixzZXF1ZW5jZU51bWJlcjooKT0+dHMsc2Vzc2lvbklkOigpPT5UcixzZXNzaW9uVGltZW91dDooKT0+Q3Isc3RhdHVzQ29kZTooKT0+aHQsdGltZXN0YW1wOigpPT5ILHV0aWxzOigpPT5paSx2ZXJzaW9uOigpPT5ab30pO21vZHVsZS5leHBvcnRzPW1hKGlsKTtjKCk7dmFyIGVpPXt9O1B0KGVpLHtBQUNEZXBheTooKT0+b3QsQmFzaWNEZXBheTooKT0+c3IsQ2FudmFzU2luazooKT0+c3QsSDI2NERlcGF5OigpPT5jdCxIdHRwU291cmNlOigpPT5kcixJbnNwZWN0b3I6KCk9PnByLEpQRUdEZXBheTooKT0+bHQsTWVzc2FnZVR5cGU6KCk9PkksTXA0Q2FwdHVyZTooKT0+bXIsTXA0TXV4ZXI6KCk9PnB0LE1zZVNpbms6KCk9PlRlLE9OVklGRGVwYXk6KCk9PkNlLFJUU1BSZXNwb25zZUVycm9yOigpPT5JdCxSVFNQX01FVEhPRDooKT0+T3IsUnRzcFBhcnNlcjooKT0+bXQsUnRzcFNlc3Npb246KCk9Pnl0LFNpbms6KCk9PlEsU291cmNlOigpPT5WLFR1YmU6KCk9PlIsV1NTb3VyY2U6KCk9PkcsY3JlYXRlVHJhbnNmb3JtOigpPT55ZX0pO2MoKTtjKCk7dmFyIGdlPUMoTigpKTtjKCk7dmFyIEVlPUMoTigpKSxmZT1jbGFzc3tzdGF0aWMgY29uc3VtZXIoZT0oKT0+e30pe3JldHVybiBuZXcgRWUuV3JpdGFibGUoe29iamVjdE1vZGU6ITAsd3JpdGUodCxuLGkpe2UodCksaSgpfX0pfXN0YXRpYyBwZWVrZXIoZSl7aWYodHlwZW9mIGUhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgRXJyb3IoXCJ5b3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvblwiKTtyZXR1cm4gbmV3IEVlLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm0odCxuLGkpe2UodCksaSh2b2lkIDAsdCl9fSl9c3RhdGljIHByb2R1Y2VyKGUpe2xldCB0PTA7cmV0dXJuIG5ldyBFZS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkKCl7ZSE9PXZvaWQgMCYmKHQ8ZS5sZW5ndGg/dGhpcy5wdXNoKGVbdCsrXSk6dGhpcy5wdXNoKG51bGwpKX19KX1zdGF0aWMgcmVjb3JkZXIoZSx0KXtyZXR1cm4gbmV3IEVlLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm0obixpLG8pe2xldCBzPURhdGUubm93KCksYT1PYmplY3QuYXNzaWduKHt9LG4se2RhdGE6bi5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfSk7dC53cml0ZShKU09OLnN0cmluZ2lmeSh7dHlwZTplLHRpbWVzdGFtcDpzLG1lc3NhZ2U6YX0sbnVsbCwyKSksdC53cml0ZShgLFxuYCksbyh2b2lkIDAsbil9fSl9c3RhdGljIHJlcGxheWVyKGUpe2xldCB0PTAsbj1lWzBdLnRpbWVzdGFtcDtyZXR1cm4gbmV3IEVlLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQoKXtsZXQgaT1lW3QrK107aWYoaSl7bGV0e3R5cGU6byx0aW1lc3RhbXA6cyxtZXNzYWdlOmF9PWksdT1zLW47aWYobj1zLGEpe2xldCBmPWEuZGF0YT9CdWZmZXIuZnJvbShhLmRhdGEsXCJiYXNlNjRcIik6QnVmZmVyLmFsbG9jKDApLGw9T2JqZWN0LmFzc2lnbih7fSxhLHtkYXRhOmZ9KTt0aGlzLnB1c2goe3R5cGU6byxkZWxheTp1LG1zZzpsfSl9ZWxzZSB0aGlzLnB1c2goe3R5cGU6byxkZWxheTp1LG1zZzpudWxsfSl9ZWxzZSB0aGlzLnB1c2gobnVsbCl9fSl9fTt2YXIgaXI9Y2xhc3N7fSxWPWNsYXNzIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IodD1uZXcgZ2UuUmVhZGFibGUoe29iamVjdE1vZGU6ITB9KSxuPW5ldyBnZS5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMH0pKXtzdXBlcigpO3RoaXMuaW5jb21pbmc9dCx0aGlzLm91dGdvaW5nPW4sdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2PW51bGx9c3RhdGljIGZyb21NZXNzYWdlcyh0KXtyZXR1cm4gbmV3IFYoZmUucHJvZHVjZXIodCksZmUuY29uc3VtZXIoKSl9Y29ubmVjdCh0KXtpZih0PT09bnVsbClyZXR1cm4gdGhpcztpZih0aGlzLm5leHQhPT1udWxsfHx0LnByZXYhPT1udWxsKXRocm93IG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZmFpbGVkOiBjb21wb25lbnQocykgYWxyZWFkeSBjb25uZWN0ZWRcIik7aWYoIXRoaXMuaW5jb21pbmcucmVhZGFibGV8fCF0aGlzLm91dGdvaW5nLndyaXRhYmxlKXRocm93IG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZmFpbGVkOiB0aGlzIGNvbXBvbmVudCBub3QgY29tcGF0aWJsZVwiKTtpZighdC5pbmNvbWluZy53cml0YWJsZXx8IXQub3V0Z29pbmcucmVhZGFibGUpdGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdGlvbiBmYWlsZWQ6IG5leHQgY29tcG9uZW50IG5vdCBjb21wYXRpYmxlXCIpO3RyeXt0aGlzLmluY29taW5nLnBpcGUodC5pbmNvbWluZyksdC5vdXRnb2luZy5waXBlKHRoaXMub3V0Z29pbmcpfWNhdGNoKG8pe3Rocm93IG5ldyBFcnJvcihgY29ubmVjdGlvbiBmYWlsZWQ6ICR7by5tZXNzYWdlfWApfWxldCBuPW89Pnt0aGlzLmluY29taW5nLmVtaXQoXCJlcnJvclwiLG8pfTt0LmluY29taW5nLm9uKFwiZXJyb3JcIixuKTtsZXQgaT1vPT57dC5vdXRnb2luZy5lbWl0KFwiZXJyb3JcIixvKX07cmV0dXJuIHRoaXMub3V0Z29pbmcub24oXCJlcnJvclwiLGkpLHRoaXMubmV4dD10LHQucHJldj10aGlzLHRoaXMuX2luY29taW5nRXJyb3JIYW5kbGVyPW4sdGhpcy5fb3V0Z29pbmdFcnJvckhhbmRsZXI9aSx0fWRpc2Nvbm5lY3QoKXtsZXQgdD10aGlzLm5leHQ7cmV0dXJuIHQhPT1udWxsJiYodGhpcy5pbmNvbWluZy51bnBpcGUodC5pbmNvbWluZyksdC5vdXRnb2luZy51bnBpcGUodGhpcy5vdXRnb2luZyksdHlwZW9mIHRoaXMuX2luY29taW5nRXJyb3JIYW5kbGVyPFwidVwiJiZ0LmluY29taW5nLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIix0aGlzLl9pbmNvbWluZ0Vycm9ySGFuZGxlciksdHlwZW9mIHRoaXMuX291dGdvaW5nRXJyb3JIYW5kbGVyPFwidVwiJiZ0aGlzLm91dGdvaW5nLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIix0aGlzLl9vdXRnb2luZ0Vycm9ySGFuZGxlciksdGhpcy5uZXh0PW51bGwsdC5wcmV2PW51bGwsZGVsZXRlIHRoaXMuX2luY29taW5nRXJyb3JIYW5kbGVyLGRlbGV0ZSB0aGlzLl9vdXRnb2luZ0Vycm9ySGFuZGxlciksdGhpc319LFI9Y2xhc3MgZXh0ZW5kcyBWe2NvbnN0cnVjdG9yKHQ9bmV3IGdlLlBhc3NUaHJvdWdoKHtvYmplY3RNb2RlOiEwfSksbj1uZXcgZ2UuUGFzc1Rocm91Z2goe29iamVjdE1vZGU6ITB9KSl7c3VwZXIodCxuKTt0aGlzLmluY29taW5nPXQsdGhpcy5vdXRnb2luZz1ufXN0YXRpYyBmcm9tSGFuZGxlcnModCxuKXtsZXQgaT10P2ZlLnBlZWtlcih0KTp2b2lkIDAsbz1uP2ZlLnBlZWtlcihuKTp2b2lkIDA7cmV0dXJuIG5ldyBSKGksbyl9fSxRPWNsYXNzIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IodD1uZXcgZ2UuV3JpdGFibGUoe29iamVjdE1vZGU6ITB9KSxuPW5ldyBnZS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMH0pKXtzdXBlcigpO3RoaXMuaW5jb21pbmc9dCx0aGlzLm91dGdvaW5nPW4sdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2PW51bGx9c3RhdGljIGZyb21IYW5kbGVyKHQpe2xldCBuPW5ldyBRKGZlLmNvbnN1bWVyKHQpLGZlLnByb2R1Y2VyKHZvaWQgMCkpO3JldHVybiBuLmluY29taW5nLm9uKFwiZmluaXNoXCIsKCk9PntuLm91dGdvaW5nLnB1c2gobnVsbCl9KSxufWNvbm5lY3QoKXt0aHJvdyBuZXcgRXJyb3IoXCJjb25uZWN0aW9uIGZhaWxlZDogYXR0ZW1wdGluZyB0byBjb25uZWN0IGFmdGVyIGEgc2lua1wiKX1kaXNjb25uZWN0KCl7cmV0dXJuIHRoaXN9fTtjKCk7YygpO2MoKTt2YXIgaXQ9WzEyOCw2NCwzMiwxNiw4LDQsMiwxXTt2YXIgWm89cj0+clswXT4+PjYsZXM9cj0+ISEoclswXSZpdFsyXSksb3I9cj0+ISEoclswXSZpdFszXSksU2U9cj0+clswXSYxNSxjZT1yPT4hIShyWzFdJml0WzBdKSxPPXI9PnJbMV0mMTI3LHRzPXI9PnIucmVhZFVJbnQxNkJFKDIpLEg9cj0+ci5yZWFkVUludDMyQkUoNCkscnM9cj0+ci5yZWFkVUludDMyQkUoOCksbnM9KHIsZT0wKT0+U2Uocik+ZT9yLnJlYWRVSW50MzJCRSgxMitlKjQpOjAsTXQ9cj0+b3Iocik/ci5yZWFkVUludDE2QkUoMTIrU2UocikqNCsyKTowLGlzPXI9Pk10KHIpPT09MD9CdWZmZXIuZnJvbShbXSk6ci5zbGljZSgxMitTZShyKSo0LDEyK1NlKHIpKjQrNCtNdChyKSo0KSxaPXI9Pm9yKHIpP3Iuc2xpY2UoMTIrU2UocikqNCs0K010KHIpKjQpOnIuc2xpY2UoMTIrU2UocikqNCk7YygpO3ZhciBJPShkPT4oZFtkLlVOS05PV049MF09XCJVTktOT1dOXCIsZFtkLlJBVz0xXT1cIlJBV1wiLGRbZC5SVFA9Ml09XCJSVFBcIixkW2QuUlRDUD0zXT1cIlJUQ1BcIixkW2QuUlRTUD00XT1cIlJUU1BcIixkW2QuU0RQPTVdPVwiU0RQXCIsZFtkLkVMRU1FTlRBUlk9Nl09XCJFTEVNRU5UQVJZXCIsZFtkLkgyNjQ9N109XCJIMjY0XCIsZFtkLklTT009OF09XCJJU09NXCIsZFtkLlhNTD05XT1cIlhNTFwiLGRbZC5KUEVHPTEwXT1cIkpQRUdcIixkKSkoSXx8e30pO2MoKTtmdW5jdGlvbiBvcyhyLGUsdCl7bGV0IG49WihyLmRhdGEpLGk9MDtpZihlKXtsZXQgcz1uLnJlYWRVSW50MTZCRSgwKTtpPTIrKHMrcyU4KS84fWxldCBvPXt0eXBlOjYsZGF0YTpuLnNsaWNlKGkpLHBheWxvYWRUeXBlOk8oci5kYXRhKSx0aW1lc3RhbXA6SChyLmRhdGEpLG50cFRpbWVzdGFtcDpyLm50cFRpbWVzdGFtcH07dChvKX1jKCk7dmFyIHNzPUMoTigpKSx5ZT1yPT5uZXcgc3MuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpyfSk7dmFyIG90PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQsbj15ZShmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09NSl7bGV0IGE7Zm9yKGxldCB1IG9mIGkuc2RwLm1lZGlhKXUudHlwZT09PVwiYXVkaW9cIiYmdS5mbXRwJiZ1LmZtdHAucGFyYW1ldGVycyYmdS5mbXRwLnBhcmFtZXRlcnMubW9kZT09PVwiQUFDLWhiclwiJiYoYT11KTtpZihhJiZhLnJ0cG1hcCE9PXZvaWQgMCl7ZT1OdW1iZXIoYS5ydHBtYXAucGF5bG9hZFR5cGUpO2xldCB1PWEuZm10cC5wYXJhbWV0ZXJzLGY9TnVtYmVyKHUuc2l6ZWxlbmd0aCl8fDAsbD1OdW1iZXIodS5pbmRleGxlbmd0aCl8fDAsZD1OdW1iZXIodS5pbmRleGRlbHRhbGVuZ3RoKXx8MCxoPU51bWJlcih1LmN0c2RlbHRhbGVuZ3RoKXx8MCxtPU51bWJlcih1LmR0c2RlbHRhbGVuZ3RoKXx8MCxiPU51bWJlcih1LnJhbmRvbWFjY2Vzc2luZGljYXRpb24pfHwwLHk9TnVtYmVyKHUuc3RyZWFtc3RhdGVpbmRpY2F0aW9uKXx8MCx3PU51bWJlcih1LmF1eGlsaWFyeWRhdGFzaXplbGVuZ3RoKXx8MDt0PWYrTWF0aC5tYXgobCxkKStoK20rYit5K3c+MH1zKHZvaWQgMCxpKX1lbHNlIGkudHlwZT09PTImJk8oaS5kYXRhKT09PWU/KG9zKGksdCx0aGlzLnB1c2guYmluZCh0aGlzKSkscygpKTpzKHZvaWQgMCxpKX0pO3N1cGVyKG4pfX07YygpO3ZhciBzcj1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoZSl7aWYoZT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJ5b3UgbXVzdCBzdXBwbHkgYSBwYXlsb2FkIHR5cGUgdG8gQmFzaWNEZXBheUNvbXBvbmVudFwiKTtsZXQgdD1CdWZmZXIuYWxsb2MoMCksbj15ZShmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09MiYmTyhpLmRhdGEpPT09ZSl7bGV0IGE9WihpLmRhdGEpO3Q9QnVmZmVyLmNvbmNhdChbdCxhXSksY2UoaS5kYXRhKSYmKHQubGVuZ3RoPjAmJnRoaXMucHVzaCh7ZGF0YTp0LHRpbWVzdGFtcDpIKGkuZGF0YSksbnRwVGltZXN0YW1wOmkubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oaS5kYXRhKSx0eXBlOjZ9KSx0PUJ1ZmZlci5hbGxvYygwKSkscygpfWVsc2Ugcyh2b2lkIDAsaSl9KTtzdXBlcihuKX19O2MoKTtjKCk7dmFyIGFyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5lbGFwc2VkPTAsdGhpcy5zdGFydGVkPTAsdGhpcy5zdG9wcGVkPSEwfXN0YXJ0KCl7dGhpcy5zdG9wcGVkJiYodGhpcy5zdGFydGVkPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSx0aGlzLnN0b3BwZWQ9ITEpfXN0b3AoKXt0aGlzLnN0b3BwZWR8fCh0aGlzLmVsYXBzZWQ9dGhpcy5ub3coKSx0aGlzLnN0b3BwZWQ9ITApfXJlc2V0KCl7dGhpcy5lbGFwc2VkPTAsdGhpcy5zdGFydGVkPTAsdGhpcy5zdG9wcGVkPSEwfW5vdygpe3JldHVybiB0aGlzLnN0b3BwZWQ/dGhpcy5lbGFwc2VkOnRoaXMuZWxhcHNlZCsod2luZG93LnBlcmZvcm1hbmNlLm5vdygpLXRoaXMuc3RhcnRlZCl9cGxheSgpe3RoaXMuc3RhcnQoKX1wYXVzZSgpe3RoaXMuc3RvcCgpfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLm5vdygpLzFlM319O2MoKTt2YXIgV2U9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG49MTApe3RoaXMuX2Nsb2NrPWUsdGhpcy5faGFuZGxlcj10LHRoaXMuX3RvbGVyYW5jZT1uLHRoaXMuX25leHRSdW49MCx0aGlzLl9uZXh0UGxheT0wLHRoaXMuX2ZpZm89W10sdGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZT0wLHRoaXMuX3N1c3BlbmRlZD0hMX1yZXNldCgpe2NsZWFyVGltZW91dCh0aGlzLl9uZXh0UnVuKSxjbGVhclRpbWVvdXQodGhpcy5fbmV4dFBsYXkpLHRoaXMuX2ZpZm89W10sdGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZT0wLHRoaXMuX3N1c3BlbmRlZD0hMX1pbml0KGUpe3RoaXMuX250cFByZXNlbnRhdGlvblRpbWU9ZX1zdXNwZW5kKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX25leHRQbGF5KSx0aGlzLl9zdXNwZW5kZWQ9ITB9cmVzdW1lKCl7dGhpcy5fc3VzcGVuZGVkPSExLHRoaXMucnVuKHZvaWQgMCl9cnVuKGUpe2lmKGNsZWFyVGltZW91dCh0aGlzLl9uZXh0UnVuKSx0eXBlb2YgdGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZT5cInVcInx8KHR5cGVvZiBlPFwidVwiJiZ0aGlzLl9maWZvLnB1c2goZSksdGhpcy5fc3VzcGVuZGVkKXx8dGhpcy5fZmlmby5sZW5ndGg9PT0wKXJldHVybjtsZXQgdD0wLG47ZG97bGV0IGk9dGhpcy5fZmlmby5zaGlmdCgpO2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiaW50ZXJuYWwgZXJyb3I6IG1lc3NhZ2Ugc2hvdWxkIG5ldmVyIGJlIHVuZGVmaW5lZFwiKTtuPWk7bGV0IG89bi5udHBUaW1lc3RhbXA7aWYobz09PXZvaWQgMCljb250aW51ZTt0PW8tdGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZS10aGlzLl9jbG9jay5jdXJyZW50VGltZSoxZTMsTWF0aC5hYnModCk8dGhpcy5fdG9sZXJhbmNlJiZ0aGlzLl9oYW5kbGVyJiZ0aGlzLl9oYW5kbGVyKG4pfXdoaWxlKHQ8dGhpcy5fdG9sZXJhbmNlJiZ0aGlzLl9maWZvLmxlbmd0aD4wKTt0PC10aGlzLl90b2xlcmFuY2U/KGNsZWFyVGltZW91dCh0aGlzLl9uZXh0UGxheSksdGhpcy5fY2xvY2sucGF1c2UoKSx0aGlzLl9uZXh0UGxheT13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fY2xvY2sucGxheSgpLC10KSk6dD50aGlzLl90b2xlcmFuY2UmJih0aGlzLl9maWZvLnVuc2hpZnQobiksdGhpcy5fbmV4dFJ1bj13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5ydW4odm9pZCAwKSx0KSl9fTt2YXIgdXI9QyhOKCkpLGFjPXI9PntyLmJpdHJhdGU9MCxyLmZyYW1lcmF0ZT0wLHIucmVuZGVyZWRGcmFtZXM9MH0sdWM9cj0+e2xldCBlPTAsdD0wLG49MDtyZXR1cm4oaSx7Ynl0ZUxlbmd0aDpvLGR1cmF0aW9uOnN9KT0+e2lmKGUrPW8sdCs9cyxuKyssdD49cil7bGV0IGE9OCplLHU9bixmPXQvcjtpLmJpdHJhdGU9YS9mLGkuZnJhbWVyYXRlPXUvZixlPTAsdD0wLG49MH19fSxzdD1jbGFzcyBleHRlbmRzIFF7Y29uc3RydWN0b3IodCl7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJjYW52YXMgZWxlbWVudCBhcmd1bWVudCBtaXNzaW5nXCIpO2xldCBuPTAsaT0wLG89MCxzPXtiaXRyYXRlOjAsZnJhbWVyYXRlOjAscmVuZGVyZWRGcmFtZXM6MH0sYSx1PW51bGw7d2luZG93LmNyZWF0ZUltYWdlQml0bWFwIT09dm9pZCAwJiYodT10LmdldENvbnRleHQoXCJiaXRtYXByZW5kZXJlclwiKSksdT09PW51bGwmJih1PXQuZ2V0Q29udGV4dChcIjJkXCIpKTtsZXQgZjtpZih1PT09bnVsbClmPSgpPT57fTtlbHNlIGlmKFwidHJhbnNmZXJGcm9tSW1hZ2VCaXRtYXBcImluIHUpe2xldCBfPXU7Zj0oe2Jsb2I6dn0pPT57cy5yZW5kZXJlZEZyYW1lcysrLHdpbmRvdy5jcmVhdGVJbWFnZUJpdG1hcCh2KS50aGVuKHE9PntfLnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKHEpfSkuY2F0Y2goKCk9Pnt9KX19ZWxzZXtsZXQgXz11LHY9bmV3IEltYWdlO3Yub25sb2FkPSgpPT57Xy5kcmF3SW1hZ2UodiwwLDApfSxmPSh7YmxvYjpxfSk9PntzLnJlbmRlcmVkRnJhbWVzKys7bGV0IEE9d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocSk7di5zcmM9QX19bGV0IGw9bmV3IGFyLGQ9bmV3IFdlKGwsZiksaD0wLG09KCk9Pnt0aGlzLm9uQ2FucGxheSYmdGhpcy5vbkNhbnBsYXkoKX0sYj1fPT57dGhpcy5vblN5bmMmJnRoaXMub25TeW5jKF8pfSx5PW5ldyB1ci5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMCx3cml0ZTooXyx2LHEpPT57aWYoXy50eXBlPT09NSl7bC5yZXNldCgpLGQucmVzZXQoKSxuPTA7bGV0IEE9Xy5zZHAubWVkaWEuZmluZChqPT5qLnR5cGU9PT1cInZpZGVvXCImJmoucnRwbWFwIT09dm9pZCAwJiZqLnJ0cG1hcC5lbmNvZGluZ05hbWU9PT1cIkpQRUdcIik7QSE9PXZvaWQgMCYmQS5ydHBtYXAhPT12b2lkIDAmJihvPUEucnRwbWFwLmNsb2NrcmF0ZSxhYyhzKSxhPXVjKG8pKSxxKCl9ZWxzZSBpZihfLnR5cGU9PT0xMCl7bGV0e3RpbWVzdGFtcDpBLG50cFRpbWVzdGFtcDpqfT1fO2lmKCFuKXtuPUEsaT1BO2xldHt3aWR0aDpJZSxoZWlnaHQ6QWV9PV8uZnJhbWVzaXplO3Qud2lkdGg9SWUsdC5oZWlnaHQ9QWUsZC5pbml0KDApfWxldCBZPTFlMyooQS1uKS9vLEdlPW5ldyB3aW5kb3cuQmxvYihbXy5kYXRhXSx7dHlwZTpcImltYWdlL2pwZWdcIn0pOyFoJiZqJiYoaD1qLVksYihoKSksZC5ydW4oe250cFRpbWVzdGFtcDpZLGJsb2I6R2V9KSxBPT09biYmbSgpLGEocyx7Ynl0ZUxlbmd0aDpfLmRhdGEubGVuZ3RoLGR1cmF0aW9uOkEtaX0pLGk9QSxxKCl9ZWxzZSBxKCl9fSksdz1uZXcgdXIuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZDpmdW5jdGlvbigpe319KTt3Lm9uKFwiZXJyb3JcIiwoKT0+e2NvbnNvbGUud2FybihcIm91dGdvaW5nIHN0cmVhbSBicm9rZSBzb21ld2hlcmVcIil9KTtzdXBlcih5LHcpO3RoaXMuX2Nsb2NrPWwsdGhpcy5fc2NoZWR1bGVyPWQsdGhpcy5faW5mbz1zLHRoaXMub25DYW5wbGF5PXZvaWQgMCx0aGlzLm9uU3luYz12b2lkIDB9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2Nsb2NrLmN1cnJlbnRUaW1lfXBhdXNlKCl7dGhpcy5fc2NoZWR1bGVyLnN1c3BlbmQoKSx0aGlzLl9jbG9jay5wYXVzZSgpfXBsYXkoKXt0aGlzLl9jbG9jay5wbGF5KCksdGhpcy5fc2NoZWR1bGVyLnJlc3VtZSgpfWdldCBiaXRyYXRlKCl7cmV0dXJuIHRoaXMuX2luZm8uYml0cmF0ZX1nZXQgZnJhbWVyYXRlKCl7cmV0dXJuIHRoaXMuX2luZm8uZnJhbWVyYXRlfX07YygpO3ZhciBkcz1DKE4oKSk7YygpO3ZhciBscz1DKGxlKCkpO3ZhciB3Yz0oMCxscy5kZWZhdWx0KShcIm1zbDpoMjY0ZGVwYXlcIiksbHI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApfXBhcnNlKGUpe2xldCB0PVooZS5kYXRhKSxuPXRbMF0mMzE7aWYobj09PTI4KXtsZXQgaT10WzBdLG89dFsxXSxzPSEhKG8+PjcpLGE9byYzMSx1PWkmMjI0fGEsZj1vJjY0O2lmKHMpcmV0dXJuIHRoaXMuX2J1ZmZlcj1CdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbMCwwLDAsMCx1XSksdC5zbGljZSgyKV0pLG51bGw7aWYoZil7bGV0IGw9QnVmZmVyLmNvbmNhdChbdGhpcy5fYnVmZmVyLHQuc2xpY2UoMildKTtsLndyaXRlVUludDMyQkUobC5sZW5ndGgtNCwwKTtsZXQgZD17ZGF0YTpsLHR5cGU6Nyx0aW1lc3RhbXA6SChlLmRhdGEpLG50cFRpbWVzdGFtcDplLm50cFRpbWVzdGFtcCxwYXlsb2FkVHlwZTpPKGUuZGF0YSksbmFsVHlwZTphfTtyZXR1cm4gdGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvYygwKSxkfWVsc2UgcmV0dXJuIHRoaXMuX2J1ZmZlcj1CdWZmZXIuY29uY2F0KFt0aGlzLl9idWZmZXIsdC5zbGljZSgyKV0pLG51bGx9ZWxzZSBpZigobj09PTF8fG49PT01KSYmdGhpcy5fYnVmZmVyLmxlbmd0aD09PTApe2xldCBpPUJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFswLDAsMCwwXSksdF0pO2kud3JpdGVVSW50MzJCRShpLmxlbmd0aC00LDApO2xldCBvPXtkYXRhOmksdHlwZTo3LHRpbWVzdGFtcDpIKGUuZGF0YSksbnRwVGltZXN0YW1wOmUubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oZS5kYXRhKSxuYWxUeXBlOm59O3JldHVybiB0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApLG99ZWxzZSByZXR1cm4gd2MoYEgyNjRkZXBheUNvbXBvbmVudCBjYW4gb25seSBleHRyYWN0IHR5cGVzIDEsNSBhbmQgMjgsIGdvdCAke259YCksdGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvYygwKSxudWxsfX07dmFyIGN0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQ9ITEsbj1bXSxpPW5ldyBscixvPW5ldyBkcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKHMsYSx1KXtpZihzLnR5cGU9PT01KXtsZXQgZj1zLnNkcC5tZWRpYS5maW5kKGw9PmwudHlwZT09PVwidmlkZW9cIiYmbC5ydHBtYXAhPT12b2lkIDAmJmwucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiSDI2NFwiKTtmIT09dm9pZCAwJiZmLnJ0cG1hcCE9PXZvaWQgMCYmKGU9Zi5ydHBtYXAucGF5bG9hZFR5cGUpLHUodm9pZCAwLHMpfWVsc2UgaWYocy50eXBlPT09MiYmTyhzLmRhdGEpPT09ZSl7bGV0IGY9Y2Uocy5kYXRhKSxsPWkucGFyc2Uocyk7aWYobD09PW51bGx8fCF0JiZsLm5hbFR5cGUhPT01KXt1KCk7cmV0dXJufXQ9ITAsbi5wdXNoKGwuZGF0YSksZiYmKHRoaXMucHVzaCh7Li4ubCxkYXRhOm4ubGVuZ3RoPT09MT9uWzBdOkJ1ZmZlci5jb25jYXQobil9KSxuPVtdKSx1KCl9ZWxzZSB1KHZvaWQgMCxzKX19KTtzdXBlcihvKX19O2MoKTt2YXIgcHM9QyhsZSgpKTt2YXIgaHM9QyhOKCkpO3ZhciBObj0oMCxwcy5kZWZhdWx0KShcIm1zbDpodHRwLXNvdXJjZVwiKSxkcj1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodCl7bGV0e3VyaTpuLG9wdGlvbnM6aX09dCxvPW5ldyBocy5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO28ub24oXCJlcnJvclwiLHM9Pntjb25zb2xlLndhcm4oXCJjbG9zaW5nIHNvY2tldCBkdWUgdG8gaW5jb21pbmcgZXJyb3JcIixzKSx0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKX0pO3N1cGVyKG8pO28uX3JlYWQ9KCk9Pnt0aGlzLl9wdWxsKCl9LHRoaXMudXJpPW4sdGhpcy5vcHRpb25zPWksdGhpcy5fYWxsRG9uZT0hMX1wbGF5KCl7aWYodGhpcy51cmk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHN0YXJ0IHBsYXlpbmcgd2hlbiB0aGVyZSBpcyBubyBVUklcIik7dGhpcy5fYWJvcnRDb250cm9sbGVyPW5ldyBBYm9ydENvbnRyb2xsZXIsdGhpcy5sZW5ndGg9MCxmZXRjaCh0aGlzLnVyaSx7Y3JlZGVudGlhbHM6XCJpbmNsdWRlXCIsc2lnbmFsOnRoaXMuX2Fib3J0Q29udHJvbGxlci5zaWduYWwsLi4udGhpcy5vcHRpb25zfSkudGhlbih0PT57aWYodC5ib2R5PT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJlbXB0eSByZXNwb25zZSBib2R5XCIpO3RoaXMub25IZWFkZXJzJiZ0aGlzLm9uSGVhZGVycyh0LmhlYWRlcnMpLHRoaXMuX3JlYWRlcj10LmJvZHkuZ2V0UmVhZGVyKCksdGhpcy5fcHVsbCgpfSkuY2F0Y2godD0+e2NvbnNvbGUuZXJyb3IoXCJodHRwLXNvdXJjZTogZmV0Y2ggZmFpbGVkOiBcIix0KX0pfWFib3J0KCl7dGhpcy5fcmVhZGVyJiZ0aGlzLl9yZWFkZXIuY2FuY2VsKCkuY2F0Y2godD0+e2NvbnNvbGUubG9nKFwiaHR0cC1zb3VyY2U6IGNhbmNlbCByZWFkZXIgZmFpbGVkOiBcIix0KX0pLHRoaXMuX2Fib3J0Q29udHJvbGxlciYmdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCl9X2lzQ2xvc2VkKCl7cmV0dXJuIHRoaXMuX2FsbERvbmV9X2Nsb3NlKCl7dGhpcy5fcmVhZGVyPXZvaWQgMCx0aGlzLl9hbGxEb25lPSEwLHRoaXMuaW5jb21pbmcucHVzaChudWxsKSx0aGlzLm9uU2VydmVyQ2xvc2U/LigpfV9wdWxsKCl7dGhpcy5fcmVhZGVyIT09dm9pZCAwJiZ0aGlzLl9yZWFkZXIucmVhZCgpLnRoZW4oKHtkb25lOnQsdmFsdWU6bn0pPT57aWYodCl7dGhpcy5faXNDbG9zZWQoKXx8KE5uKFwiZmV0Y2ggY29tcGxldGVkLCB0b3RhbCBkb3dubG9hZGVkOiBcIix0aGlzLmxlbmd0aCxcIiBieXRlc1wiKSx0aGlzLl9jbG9zZSgpKTtyZXR1cm59aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCB2YWx1ZSB0byBiZSBkZWZpbmVkXCIpO2lmKHRoaXMubGVuZ3RoPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIGxlbmd0aCB0byBiZSBkZWZpbmVkXCIpO3RoaXMubGVuZ3RoKz1uLmxlbmd0aDtsZXQgaT1CdWZmZXIuZnJvbShuKTt0aGlzLmluY29taW5nLnB1c2goe2RhdGE6aSx0eXBlOjF9KT90aGlzLl9wdWxsKCk6Tm4oXCJkb3duc3RyZWFtIGJhY2sgcHJlc3N1cmU6IHBhdXNpbmcgcmVhZFwiKX0pLmNhdGNoKHQ9PntObihcImh0dHAtc291cmNlOiByZWFkIGZhaWxlZDogXCIsdCksdGhpcy5faXNDbG9zZWQoKXx8dGhpcy5fY2xvc2UoKX0pfX07YygpO3ZhciBIbj1DKE4oKSksbXM9KHIsZSk9PntsZXQgdD1EYXRlLm5vdygpLG49aT0+e2xldCBvPURhdGUubm93KCk7Y29uc29sZS5sb2coYCR7cn06ICske28tdH1tc2AsaSksdD1vfTtyZXR1cm4gZT09PXZvaWQgMD9uOmk9PmkudHlwZT09PWUmJm4oaSl9LHByPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3RvcihlKXtsZXQgdD1tcyhcImluY29taW5nXCIsZSksbj1uZXcgSG4uVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihzLGEsdSl7dChzKSx1KHZvaWQgMCxzKX19KSxpPW1zKFwib3V0Z29pbmdcIixlKSxvPW5ldyBIbi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKHMsYSx1KXtpKHMpLHUodm9pZCAwLHMpfX0pO3N1cGVyKG4sbyl9fTtjKCk7YygpO2MoKTtmdW5jdGlvbiBTcygpe3JldHVybiBCdWZmZXIuZnJvbShbMjU1LDIxNl0pfWZ1bmN0aW9uIFJzKHIsZSl7bGV0IHQ9ciYxPzEyODo2NCxuPXImMj8xMjg6NjQ7aWYoZS5sZW5ndGghPT10K24pdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBxdWFudGl6YXRpb24gdGFibGVcIik7bGV0IGk9QnVmZmVyLmZyb20oWzI1NSwyMTksMCx0KzMsMF0pLG89QnVmZmVyLmZyb20oWzI1NSwyMTksMCxuKzMsMV0pO3JldHVybiBCdWZmZXIuY29uY2F0KFtpLGUuc2xpY2UoMCx0KSxvLGUuc2xpY2UodCldKX1mdW5jdGlvbiBUcyhyLGUsdCl7cmV0dXJuIEJ1ZmZlci5mcm9tKFsyNTUsMTkyLDAsMTcsOCxlPj44LGUscj4+OCxyLDMsMCx0PT09MD8zMzozNCwwLDEsMTcsMSwyLDE3LDFdKX12YXIgZ3M9WzAsMSw1LDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDBdLHlzPVswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExXSxicz1bMCwyLDEsMywzLDIsNCwzLDUsNSw0LDQsMCwwLDEsMTI1XSx4cz1bMSwyLDMsMCw0LDE3LDUsMTgsMzMsNDksNjUsNiwxOSw4MSw5Nyw3LDM0LDExMywyMCw1MCwxMjksMTQ1LDE2MSw4LDM1LDY2LDE3NywxOTMsMjEsODIsMjA5LDI0MCwzNiw1MSw5OCwxMTQsMTMwLDksMTAsMjIsMjMsMjQsMjUsMjYsMzcsMzgsMzksNDAsNDEsNDIsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsODMsODQsODUsODYsODcsODgsODksOTAsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwXSxfcz1bMCwzLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMF0sd3M9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLHZzPVswLDIsMSwyLDQsNCwzLDQsNyw1LDQsNCwwLDEsMiwxMTldLEVzPVswLDEsMiwzLDE3LDQsNSwzMyw0OSw2LDE4LDY1LDgxLDcsOTcsMTEzLDE5LDM0LDUwLDEyOSw4LDIwLDY2LDE0NSwxNjEsMTc3LDE5Myw5LDM1LDUxLDgyLDI0MCwyMSw5OCwxMTQsMjA5LDEwLDIyLDM2LDUyLDIyNSwzNywyNDEsMjMsMjQsMjUsMjYsMzgsMzksNDAsNDEsNDIsNTMsNTQsNTUsNTYsNTcsNTgsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsODMsODQsODUsODYsODcsODgsODksOTAsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTBdO2Z1bmN0aW9uIENzKCl7bGV0IHI9W1syNTUsMTk2LDAsMytncy5sZW5ndGgreXMubGVuZ3RoLDBdLGdzLHlzXSxlPVtbMjU1LDE5NiwwLDMrYnMubGVuZ3RoK3hzLmxlbmd0aCwxPDw0fDBdLGJzLHhzXSx0PVtbMjU1LDE5NiwwLDMrX3MubGVuZ3RoK3dzLmxlbmd0aCwwPDw0fDFdLF9zLHdzXSxuPVtbMjU1LDE5NiwwLDMrdnMubGVuZ3RoK0VzLmxlbmd0aCwxPDw0fDFdLHZzLEVzXTtyZXR1cm4gQnVmZmVyLmNvbmNhdChbLi4uci5tYXAoQnVmZmVyLmZyb20pLC4uLmUubWFwKEJ1ZmZlci5mcm9tKSwuLi50Lm1hcChCdWZmZXIuZnJvbSksLi4ubi5tYXAoQnVmZmVyLmZyb20pXSl9ZnVuY3Rpb24gQnMoKXtyZXR1cm4gQnVmZmVyLmZyb20oWzI1NSwyMTgsMCwxMiwzLDAsMCwxLDE3LDIsMTcsMCw2MywwXSl9ZnVuY3Rpb24gTXMocil7cmV0dXJuIEJ1ZmZlci5mcm9tKFsyNTUsMjIxLDAsNCxyPj44LHImMjU1XSl9YygpO2MoKTtmdW5jdGlvbiBocihyLGUsdCl7cmV0dXJuIHI+dD90OnI8ZT9lOnJ9dmFyIEVjPVsxNiwxMSwxMiwxNCwxMiwxMCwxNiwxNCwxMywxNCwxOCwxNywxNiwxOSwyNCw0MCwyNiwyNCwyMiwyMiwyNCw0OSwzNSwzNywyOSw0MCw1OCw1MSw2MSw2MCw1Nyw1MSw1Niw1NSw2NCw3Miw5Miw3OCw2NCw2OCw4Nyw2OSw1NSw1Niw4MCwxMDksODEsODcsOTUsOTgsMTAzLDEwNCwxMDMsNjIsNzcsMTEzLDEyMSwxMTIsMTAwLDEyMCw5MiwxMDEsMTAzLDk5XSxTYz1bMTcsMTgsMTgsMjQsMjEsMjQsNDcsMjYsMjYsNDcsOTksNjYsNTYsNjYsOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTldO2Z1bmN0aW9uIExzKHIpe2xldCBlPWhyKHIsMSw5OSksdD1CdWZmZXIuYWxsb2MoMTI4KSxuPXI8NTA/TWF0aC5mbG9vcig1ZTMvZSk6MjAwLWUqMjtmb3IobGV0IGk9MDtpPDY0O2krKyl7bGV0IG89TWF0aC5mbG9vcigoRWNbaV0qbis1MCkvMTAwKSxzPU1hdGguZmxvb3IoKFNjW2ldKm4rNTApLzEwMCk7dC53cml0ZVVJbnQ4KGhyKG8sMSwyNTUpLGkpLHQud3JpdGVVSW50OChocihzLDEsMjU1KSxpKzY0KX1yZXR1cm4gdH1mdW5jdGlvbiBxbihyPTAsZT0wKXtsZXQgdD1TcygpLG49Q3MoKSxpPUJzKCk7cmV0dXJuIGZ1bmN0aW9uKHMpe2xldCBhLHU9W107Zm9yKGxldCBfIG9mIHMpe2xldCB2PVooXykscT12LnJlYWRVSW50OCgwKSxBPXYucmVhZFVJbnQ4KDEpPDwxNnx2LnJlYWRVSW50OCgyKTw8OHx2LnJlYWRVSW50OCgzKSxqPXYucmVhZFVJbnQ4KDQpLFk9di5yZWFkVUludDgoNSksR2U9di5yZWFkVUludDgoNikqOHx8cixJZT12LnJlYWRVSW50OCg3KSo4fHxlO3Y9di5zbGljZSg4KTtsZXQgQWU9MDtpZihqPj02NCYmajw9MTI3JiYoQWU9di5yZWFkVUludDE2QkUoMCksdj12LnNsaWNlKDQpKSxZPj0xMjgmJkE9PT0wKXtsZXQgb2k9di5yZWFkVUludDgoMSksQXQ9di5yZWFkVUludDE2QkUoMiksdWE9di5zbGljZSg0LDQrQXQpO2E9e3R5cGVTcGVjaWZpYzpxLHR5cGU6aix3aWR0aDpHZSxoZWlnaHQ6SWUsRFJJOkFlLHByZWNpc2lvbjpvaSxxVGFibGU6dWF9LHY9di5zbGljZSg0K0F0KX1lbHNlIGlmKFk8MTI4JiZBPT09MCl7bGV0IEF0PUxzKFkpO2E9e3R5cGVTcGVjaWZpYzpxLHR5cGU6aix3aWR0aDpHZSxoZWlnaHQ6SWUsRFJJOkFlLHByZWNpc2lvbjowLHFUYWJsZTpBdH19dS5wdXNoKHYpfWlmKGE9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibm8gcXVhbnRpemF0aW9uIGhlYWRlciBwcmVzZW50XCIpO2xldHtwcmVjaXNpb246ZixxVGFibGU6bCx0eXBlOmQsd2lkdGg6aCxoZWlnaHQ6bX09YSxiPVJzKGYsbCkseT1hLkRSST09PTA/QnVmZmVyLmFsbG9jKDApOk1zKGEuRFJJKSx3PVRzKGgsbSxkKTtyZXR1cm57c2l6ZTp7d2lkdGg6aCxoZWlnaHQ6bX0sZGF0YTpCdWZmZXIuY29uY2F0KFt0LGIseSx3LG4saSwuLi51XSl9fX12YXIgSXM9QyhOKCkpO3ZhciBsdD1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtsZXQgZSx0PVtdLG4saT1uZXcgSXMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihvLHMsYSl7aWYoby50eXBlPT09NSl7bGV0IHU9by5zZHAubWVkaWEuZmluZChmPT5mLnR5cGU9PT1cInZpZGVvXCImJmYucnRwbWFwIT09dm9pZCAwJiZmLnJ0cG1hcC5lbmNvZGluZ05hbWU9PT1cIkpQRUdcIik7aWYodSE9PXZvaWQgMCYmdS5ydHBtYXAhPT12b2lkIDApe2U9TnVtYmVyKHUucnRwbWFwLnBheWxvYWRUeXBlKTtsZXQgZj11LmZyYW1lc2l6ZTtpZihmIT09dm9pZCAwKXtsZXRbbCxkXT1mO249cW4obCxkKX1lbHNlIG49cW4oKX1hKHZvaWQgMCxvKX1lbHNlIGlmKG8udHlwZT09PTImJk8oby5kYXRhKT09PWUpe2lmKHQucHVzaChvLmRhdGEpLGNlKG8uZGF0YSkmJnQubGVuZ3RoPjApe2xldCB1PW4odCk7dGhpcy5wdXNoKHt0aW1lc3RhbXA6SChvLmRhdGEpLG50cFRpbWVzdGFtcDpvLm50cFRpbWVzdGFtcCxwYXlsb2FkVHlwZTpPKG8uZGF0YSksZGF0YTp1LmRhdGEsZnJhbWVzaXplOnUuc2l6ZSx0eXBlOjEwfSksdD1bXX1hKCl9ZWxzZSBhKHZvaWQgMCxvKX19KTtzdXBlcihpKX19O2MoKTt2YXIgam49QyhsZSgpKTt2YXIgQXM9QyhOKCkpO3ZhciBSYz0yMjVlNixtcj1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IodD1SYyl7bGV0IG49bmV3IEFzLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06KGksbyxzKT0+e3RoaXMuX2FjdGl2ZSYmaS50eXBlPT09OCYmaS50cmFja3MhPT12b2lkIDAmJih0aGlzLl9jYXB0dXJlPSEwKSx0aGlzLl9jYXB0dXJlJiZpLnR5cGU9PT04JiYodGhpcy5fYnVmZmVyT2Zmc2V0PHRoaXMuX2J1ZmZlci5ieXRlTGVuZ3RoLWkuZGF0YS5ieXRlTGVuZ3RoPyhpLmRhdGEuY29weSh0aGlzLl9idWZmZXIsdGhpcy5fYnVmZmVyT2Zmc2V0KSx0aGlzLl9idWZmZXJPZmZzZXQrPWkuZGF0YS5ieXRlTGVuZ3RoKTp0aGlzLnN0b3AoKSkscyh2b2lkIDAsaSl9fSk7bi5vbihcImZpbmlzaFwiLCgpPT57dGhpcy5zdG9wKCl9KTtzdXBlcihuKTt0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKDApLHRoaXMuX2J1ZmZlclNpemU9dCx0aGlzLl9idWZmZXJPZmZzZXQ9MCx0aGlzLl9hY3RpdmU9ITEsdGhpcy5fY2FwdHVyZT0hMSx0aGlzLl9jYXB0dXJlQ2FsbGJhY2s9KCk9Pnt9fXN0YXJ0KHQpe3RoaXMuX2FjdGl2ZXx8KCgwLGpuLmRlZmF1bHQpKFwibXNsOmNhcHR1cmU6c3RhcnRcIikodCksdGhpcy5fY2FwdHVyZUNhbGxiYWNrPXQsdGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvY1Vuc2FmZSh0aGlzLl9idWZmZXJTaXplKSx0aGlzLl9idWZmZXJPZmZzZXQ9MCx0aGlzLl9hY3RpdmU9ITApfXN0b3AoKXtpZih0aGlzLl9hY3RpdmUpeygwLGpuLmRlZmF1bHQpKFwibXNsOmNhcHR1cmU6c3RvcFwiKShgY2FwdHVyZWQgYnl0ZXM6ICR7dGhpcy5fYnVmZmVyT2Zmc2V0fWApO3RyeXt0aGlzLl9jYXB0dXJlQ2FsbGJhY2sodGhpcy5fYnVmZmVyLnNsaWNlKDAsdGhpcy5fYnVmZmVyT2Zmc2V0KSl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcih0KX10aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKDApLHRoaXMuX2J1ZmZlck9mZnNldD0wLHRoaXMuX2FjdGl2ZT0hMSx0aGlzLl9jYXB0dXJlPSExfX19O2MoKTt2YXIgWW49QyhsZSgpKTtjKCk7dmFyIFduPU1hdGgucG93KDIsMzIpLCQ9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5ieXRlTGVuZ3RoPWV9fSx0ZT1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcih0KTt0aGlzLmNvcHk9KHQsbik9Pnt0LmZpbGwoMCxuLG4rdGhpcy5ieXRlTGVuZ3RoKX19bG9hZCgpe319LFJlPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0Lmxlbmd0aCk7dGhpcy5jb3B5PSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLmJ5dGVMZW5ndGg7aSs9MSl0W24raV09dGhpcy52YWx1ZS5jaGFyQ29kZUF0KGkpfTt0aGlzLmxvYWQ9KHQsbik9Pnt0aGlzLnZhbHVlPXQuc2xpY2UobixuK3RoaXMuYnl0ZUxlbmd0aCkudG9TdHJpbmcoXCJhc2NpaVwiKX07dGhpcy52YWx1ZT10fX0saz1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcigxKTt0aGlzLmNvcHk9KHQsbik9Pnt0LndyaXRlVUludDgodGhpcy52YWx1ZSxuKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50OChuKX07dGhpcy52YWx1ZT10fX0sTHQ9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKTt0aGlzLmNvcHk9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0LndyaXRlVUludDgodGhpcy52YWx1ZVtpXSxuK2kpfTt0aGlzLmxvYWQ9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0aGlzLnZhbHVlW2ldPXQucmVhZFVJbnQ4KG4raSl9O3RoaXMudmFsdWU9dH19LEw9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIoMik7dGhpcy5jb3B5PSh0LG4pPT57dC53cml0ZVVJbnQxNkJFKHRoaXMudmFsdWUsbil9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5yZWFkVUludDE2QkUobil9O3RoaXMudmFsdWU9dH19LCRuPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDMpO3RoaXMuY29weT0odCxuKT0+e3Qud3JpdGVVSW50OCh0aGlzLnZhbHVlPj4xNiYyNTUsbiksdC53cml0ZVVJbnQ4KHRoaXMudmFsdWU+PjgmMjU1LG4rMSksdC53cml0ZVVJbnQ4KHRoaXMudmFsdWUmMjU1LG4rMil9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5yZWFkVUludDgobik8PDE2K3QucmVhZFVJbnQ4KG4rMSk8PDgrdC5yZWFkVUludDgobisyKX07dGhpcy52YWx1ZT10fX0sR249Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKjIpO3RoaXMuY29weT0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXQud3JpdGVVSW50MTZCRSh0aGlzLnZhbHVlW2ldLG4rMippKX07dGhpcy5sb2FkPSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdGhpcy52YWx1ZVtpXT10LnJlYWRVSW50MTZCRShuKzIqaSl9O3RoaXMudmFsdWU9dH19LGc9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIoNCk7dGhpcy5jb3B5PSh0LG4pPT57dC53cml0ZVVJbnQzMkJFKHRoaXMudmFsdWUsbil9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5yZWFkVUludDMyQkUobil9O3RoaXMudmFsdWU9dH19LGR0PWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0Lmxlbmd0aCo0KTt0aGlzLmNvcHk9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0LndyaXRlVUludDMyQkUodGhpcy52YWx1ZVtpXSxuKzQqaSl9O3RoaXMubG9hZD0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXRoaXMudmFsdWVbaV09dC5yZWFkVUludDMyQkUobis0KmkpfTt0aGlzLnZhbHVlPXR9fSxWbj1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcig4KTt0aGlzLmNvcHk9KHQsbik9PntsZXQgaT10aGlzLnZhbHVlL1dufDAsbz10aGlzLnZhbHVlLWkqV247dC53cml0ZVVJbnQzMkJFKGksbiksdC53cml0ZVVJbnQzMkJFKG8sbis0KX07dGhpcy5sb2FkPSh0LG4pPT57bGV0IGk9dC5yZWFkVUludDMyQkUobiksbz10LnJlYWRVSW50MzJCRShuKzQpO3RoaXMudmFsdWU9aSpXbitvfTt0aGlzLnZhbHVlPXR9fSxGcz1mdW5jdGlvbihyPTApe3JldHVybiBjbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3Iobil7c3VwZXIoMCk7dGhpcy5jb3B5PShuLGkpPT57bGV0IG89MDtmb3IobGV0IHMgb2YgdGhpcy52YWx1ZSlzLmNvcHkobixpK28pLG8rPXMuYnl0ZUxlbmd0aH07dGhpcy5sb2FkPSgpPT57fTt0aGlzLnZhbHVlPW4ucmVkdWNlKChpLG8pPT5pLmNvbmNhdChuZXcgTChvLmxlbmd0aCksbmV3IEx0KG8pKSxbbmV3IGsocnxuLmxlbmd0aCldKSx0aGlzLmJ5dGVMZW5ndGg9dGhpcy52YWx1ZS5yZWR1Y2UoKGksbyk9Pmkrby5ieXRlTGVuZ3RoLDApfX19LFBzPXtmdHlwOntjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcIm1ham9yX2JyYW5kXCIsUmUsXCJpc29tXCJdLFtcIm1pbm9yX3ZlcnNpb25cIixnLDBdLFtcImNvbXBhdGlibGVfYnJhbmRzXCIsUmUsXCJtcDQxXCJdXX0sbW9vdjp7Y29udGFpbmVyOlwiZmlsZVwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sbWRhdDp7Y29udGFpbmVyOlwiZmlsZVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcImFueVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltdfSxtdmhkOntjb250YWluZXI6XCJtb292XCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJjcmVhdGlvbl90aW1lXCIsZywwXSxbXCJtb2RpZmljYXRpb25fdGltZVwiLGcsMF0sW1widGltZXNjYWxlXCIsZywxZTNdLFtcImR1cmF0aW9uXCIsZyw0Mjk0OTY3Mjk1XSxbXCJyYXRlXCIsZyw2NTUzNl0sW1widm9sdW1lXCIsTCwyNTZdLFtcInJlc2VydmVkXCIsdGUsMTBdLFtcIm1hdHJpeFwiLGR0LFs2NTUzNiwwLDAsMCw2NTUzNiwwLDAsMCwxMDczNzQxODI0XV0sW1wicHJlX2RlZmluZWRcIix0ZSwyNF0sW1wibmV4dF90cmFja19JRFwiLGcsNDI5NDk2NzI5NV1dfSx0cmFrOntjb250YWluZXI6XCJtb292XCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lK1wiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sdGtoZDp7Y29udGFpbmVyOlwidHJha1wiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczozfSxib2R5OltbXCJjcmVhdGlvbl90aW1lXCIsZywwXSxbXCJtb2RpZmljYXRpb25fdGltZVwiLGcsMF0sW1widHJhY2tfSURcIixnLDFdLFtcInJlc2VydmVkXCIsdGUsNF0sW1wiZHVyYXRpb25cIixnLDBdLFtcInJlc2VydmVkMlwiLHRlLDhdLFtcImxheWVyXCIsTCwwXSxbXCJhbHRlcm5hdGVfZ3JvdXBcIixMLDBdLFtcInZvbHVtZVwiLEwsMjU2XSxbXCJyZXNlcnZlZDNcIix0ZSwyXSxbXCJtYXRyaXhcIixkdCxbNjU1MzYsMCwwLDAsNjU1MzYsMCwwLDAsMTA3Mzc0MTgyNF1dLFtcIndpZHRoXCIsZywwXSxbXCJoZWlnaHRcIixnLDBdXX0sdHJlZjp7Y29udGFpbmVyOlwidHJha1wiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITF9LG1kaWE6e2NvbnRhaW5lcjpcInRyYWtcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LG1kaGQ6e2NvbnRhaW5lcjpcIm1kaWFcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImNyZWF0aW9uX3RpbWVcIixnLDBdLFtcIm1vZGlmaWNhdGlvbl90aW1lXCIsZywwXSxbXCJ0aW1lc2NhbGVcIixnLDFlM10sW1wiZHVyYXRpb25cIixnLDQyOTQ5NjcyOTVdLFtcImxhbmd1YWdlXCIsTCwwXSxbXCJwcmVfZGVmaW5lZFwiLEwsMF1dfSxoZGxyOntjb250YWluZXI6XCJtZGlhXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJwcmVkZWZpbmVkXCIsZywwXSxbXCJoYW5kbGVyX3R5cGVcIixSZSxcInZpZGVcIl0sW1wicmVzZXJ2ZWRcIix0ZSwxMl0sW1wibmFtZVwiLFJlLFwiVmlkZW9IYW5kbGVyXFwwXCJdXX0sbWluZjp7Y29udGFpbmVyOlwibWRpYVwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sdm1oZDp7Y29udGFpbmVyOlwibWluZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczoxfSxib2R5OltbXCJncmFwaGljc21vZGVcIixMLDBdLFtcIm9wY29sb3JcIixHbixbMCwwLDBdXV19LHNtaGQ6e2NvbnRhaW5lcjpcIm1pbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImJhbGFuY2VcIixMLDBdLFtcInJlc2VydmVkXCIsTF1dfSxkaW5mOntjb250YWluZXI6XCJtaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxkcmVmOntjb250YWluZXI6XCJkaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMF1dfSxcInVybCBcIjp7Y29udGFpbmVyOlwiZHJlZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZStcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7ZmxhZ3M6MX0sYm9keTpbXX0sc3RibDp7Y29udGFpbmVyOlwibWluZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sc3R0czp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sc3RzZDp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITAsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDFdXX0sYXZjMTp7Y29udGFpbmVyOlwic3RzZFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJyZXNlcnZlZFwiLHRlLDZdLFtcImRhdGFfcmVmZXJlbmNlX2luZGV4XCIsTCwxXSxbXCJwcmVfZGVmaW5lZFwiLEwsMF0sW1wicmVzZXJ2ZWQyXCIsdGUsMl0sW1wicHJlX2RlZmluZWQyXCIsZHQsWzAsMCwwXV0sW1wid2lkdGhcIixMLDE5MjBdLFtcImhlaWdodFwiLEwsMTA4MF0sW1wiaG9yaXpyZXNvbHV0aW9uXCIsZyw0NzE4NTkyXSxbXCJ2ZXJ0cmVzb2x1dGlvblwiLGcsNDcxODU5Ml0sW1wicmVzZXJ2ZWQzXCIsZywwXSxbXCJmcmFtZV9jb3VudFwiLEwsMV0sW1wiY29tcHJlc3Nvcm5hbWVcIixMdCxCdWZmZXIuYWxsb2MoMzIpXSxbXCJkZXB0aFwiLEwsMjRdLFtcInByZV9kZWZpbmVkM1wiLEwsNjU1MzVdXX0sYXZjQzp7Y29udGFpbmVyOlwiYXZjMVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJjb25maWd1cmF0aW9uVmVyc2lvblwiLGssMV0sW1wiQVZDUHJvZmlsZUluZGljYXRpb25cIixrLDc3XSxbXCJwcm9maWxlX2NvbXBhdGliaWxpdHlcIixrLDBdLFtcIkFWQ0xldmVsSW5kaWNhdGlvblwiLGssNDFdLFtcImxlbmd0aFNpemVNaW51c09uZVwiLGssMjU1XSxbXCJzZXF1ZW5jZVBhcmFtZXRlclNldHNcIixGcygyMjQpLFtdXSxbXCJwaWN0dXJlUGFyYW1ldGVyU2V0c1wiLEZzKCksW11dXX0sbXA0YTp7Y29udGFpbmVyOlwic3RzZFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJyZXNlcnZlZFwiLHRlLDZdLFtcImRhdGFfcmVmZXJlbmNlX2luZGV4XCIsTCwxXSxbXCJyZXNlcnZlZDJcIixkdCxbMCwwXV0sW1wiY2hhbm5lbGNvdW50XCIsTCwyXSxbXCJzYW1wbGVzaXplXCIsTCwxNl0sW1wicHJlX2RlZmluZWRcIixMLDBdLFtcInJlc2VydmVkM1wiLEwsMF0sW1wic2FtcGxlcmF0ZVwiLGcsMF1dfSxlc2RzOntjb250YWluZXI6XCJtcDRhXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJFU19EZXNjclRhZ1wiLGssM10sW1wiRVNfRGVzY3JMZW5ndGhcIixrLDI1XSxbXCJFU19JRFwiLEwsMV0sW1wiZmxhZ3NBbmRTdHJlYW1Qcmlvcml0eVwiLGssMF0sW1wiRGVjb2RlckNvbmZpZ0Rlc2NyVGFnXCIsayw0XSxbXCJEZWNvZGVyQ29uZmlnRGVzY3JMZW5ndGhcIixrLDE3XSxbXCJvYmplY3RQcm9maWxlSW5kaWNhdGlvblwiLGssNjRdLFtcInN0cmVhbVR5cGVVcHN0cmVhbVJlc2VydmVkXCIsaywyMV0sW1wiYnVmZmVyU2l6ZURCXCIsTHQsWzAsMCwwXV0sW1wibWF4Qml0UmF0ZVwiLGcsMF0sW1wiYXZnQml0UmF0ZVwiLGcsMF0sW1wiRGVjU3BlY2lmaWNJbmZvU2hvcnRUYWdcIixrLDVdLFtcIkRlY1NwZWNpZmljSW5mb1Nob3J0TGVuZ3RoXCIsaywyXSxbXCJhdWRpb0NvbmZpZ0J5dGVzXCIsTCwwXSxbXCJTTENvbmZpZ0Rlc2NyVGFnXCIsayw2XSxbXCJTTENvbmZpZ0Rlc2NyTGVuZ3RoXCIsaywxXSxbXCJTTENvbmZpZ0Rlc2NyUHJlZGVmaW5lZFwiLGssMl1dfSxzdHN6Ontjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJzYW1wbGVfc2l6ZVwiLGcsMF0sW1wic2FtcGxlX2NvdW50XCIsZywwXV19LHN0c2M6e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LHN0Y286e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LHN0c3M6e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMF1dfSxlZHRzOntjb250YWluZXI6XCJ0cmFrXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sZWxzdDp7Y29udGFpbmVyOlwiZWR0c1wiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywxXSxbXCJzZWdtZW50X2R1cmF0aW9uXCIsZywwXSxbXCJtZWRpYV90aW1lXCIsZyw0Mjk0OTY3Mjk1XSxbXCJtZWRpYV9yYXRlX2ludGVnZXJcIixMLDFdLFtcIm1lZGlhX3JhdGVfZnJhY3Rpb25cIixMLDBdXX0sbXZleDp7Y29udGFpbmVyOlwibW9vdlwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LG1laGQ6e2NvbnRhaW5lcjpcIm12ZXhcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJmcmFnbWVudF9kdXJhdGlvblwiLGcsMF1dfSx0cmV4Ontjb250YWluZXI6XCJtdmV4XCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lK1wiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1widHJhY2tfSURcIixnLDFdLFtcImRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4XCIsZywxXSxbXCJkZWZhdWx0X3NhbXBsZV9kdXJhdGlvblwiLGcsMF0sW1wiZGVmYXVsdF9zYW1wbGVfc2l6ZVwiLGcsMF0sW1wiZGVmYXVsdF9zYW1wbGVfZmxhZ3NcIixnLDBdXX0sbW9vZjp7Y29udGFpbmVyOlwiZmlsZVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcInplcm8rXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiExfSxtZmhkOntjb250YWluZXI6XCJtb29mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJzZXF1ZW5jZV9udW1iZXJcIixnLDBdXX0sdHJhZjp7Y29udGFpbmVyOlwibW9vZlwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcInplcm8rXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSx0ZmhkOntjb250YWluZXI6XCJ0cmFmXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjMyfSxib2R5OltbXCJ0cmFja19JRFwiLGcsMV0sW1wiZGVmYXVsdF9zYW1wbGVfZmxhZ3NcIixnLDBdXX0sdGZkdDp7Y29udGFpbmVyOlwidHJhZlwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7dmVyc2lvbjoxfSxib2R5OltbXCJiYXNlTWVkaWFEZWNvZGVUaW1lXCIsVm4sMF1dfSx0cnVuOntjb250YWluZXI6XCJ0cmFmXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiemVybytcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7ZmxhZ3M6NzczfSxib2R5OltbXCJzYW1wbGVfY291bnRcIixnLDFdLFtcImRhdGFfb2Zmc2V0XCIsZywwXSxbXCJmaXJzdF9zYW1wbGVfZmxhZ3NcIixnLDBdLFtcInNhbXBsZV9kdXJhdGlvblwiLGcsMF0sW1wic2FtcGxlX3NpemVcIixnLDBdXX0sXCIuLi4uXCI6e2JveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltdfSxmaWxlOntib3g6XCJOb25lXCIsaXNfY29udGFpbmVyOiEwLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwifX0sem49Y2xhc3N7c3RhdGljIE5vbmUoKXtyZXR1cm5bXX1zdGF0aWMgQm94KGUpe3JldHVybltbXCJzaXplXCIsZywwXSxbXCJ0eXBlXCIsUmUsZV1dfXN0YXRpYyBGdWxsQm94KGUpe3JldHVybltdLmNvbmNhdCh0aGlzLkJveChlKSxbW1widmVyc2lvblwiLGssMF0sW1wiZmxhZ3NcIiwkbiwwXV0pfX0sVD1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCxuKXtzdXBlcigwKTt0aGlzLnR5cGU9dDtsZXQgaT1Qc1t0aGlzLnR5cGVdO2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIGJveCB0eXBlOiAke3R9YCk7dGhpcy5jb25maWc9T2JqZWN0LmFzc2lnbih7fSxpLmNvbmZpZyxuKTtsZXQgbz16bltpLmJveF0odGhpcy50eXBlKSxzPWkuYm9keXx8W107dGhpcy5zdHJ1Y3Q9bmV3IE1hcDtsZXQgYT0wO2ZvcihsZXRbdSxmLGxdb2ZbXS5jb25jYXQobyxzKSl7aWYodGhpcy5oYXModSkpdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIGFkZCBleGlzdGluZyBrZXlcIik7bGV0IGQ9bDt0aGlzLmNvbmZpZ1t1XSYmKGQ9dGhpcy5jb25maWdbdV0pO2xldCBoPW5ldyBmKGQpO3RoaXMuc3RydWN0LnNldCh1LHtvZmZzZXQ6YSxlbGVtZW50Omh9KSxhKz1oLmJ5dGVMZW5ndGh9dGhpcy5ieXRlTGVuZ3RoPWF9ZWxlbWVudCh0KXtsZXQgbj10aGlzLnN0cnVjdC5nZXQodCk7aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGtleVwiKTtyZXR1cm4gbi5lbGVtZW50fXNldCh0LG4pe3RoaXMuZWxlbWVudCh0KS52YWx1ZT1ufWdldCh0KXtyZXR1cm4gdGhpcy5lbGVtZW50KHQpLnZhbHVlfW9mZnNldCh0KXtsZXQgbj10aGlzLnN0cnVjdC5nZXQodCk7aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGtleVwiKTtyZXR1cm4gbi5vZmZzZXR9aGFzKHQpe3JldHVybiB0aGlzLnN0cnVjdC5oYXModCl9YWRkKHQsbil7aWYodGhpcy5oYXModCkpdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIGFkZCBleGlzdGluZyBrZXlcIik7cmV0dXJuIHRoaXMuc3RydWN0LnNldCh0LHtvZmZzZXQ6dGhpcy5ieXRlTGVuZ3RoLGVsZW1lbnQ6bn0pLHRoaXMuYnl0ZUxlbmd0aCs9bi5ieXRlTGVuZ3RoLHRoaXN9YnVmZmVyKCl7bGV0IHQ9QnVmZmVyLmFsbG9jVW5zYWZlKHRoaXMuYnl0ZUxlbmd0aCk7cmV0dXJuIHRoaXMuY29weSh0KSx0fWNvcHkodCxuPTApe3RoaXMuc2V0KFwic2l6ZVwiLHRoaXMuYnl0ZUxlbmd0aCk7Zm9yKGxldCBpIG9mIHRoaXMuc3RydWN0LnZhbHVlcygpKWkuZWxlbWVudC5jb3B5KHQsbitpLm9mZnNldCl9bG9hZCh0LG49MCl7Zm9yKGxldCBpIG9mIHRoaXMuc3RydWN0LnZhbHVlcygpKWkuZWxlbWVudC5sb2FkIT09dm9pZCAwJiZpLmVsZW1lbnQubG9hZCh0LG4raS5vZmZzZXQpfWZvcm1hdCh0PTApe2xldCBuPVtcIiBcIi5yZXBlYXQodCkrYFske3RoaXMudHlwZX1dICgke3RoaXMuYnl0ZUxlbmd0aH0pYF07Zm9yKGxldFtpLG9db2YgdGhpcy5zdHJ1Y3Qpe2xldCBzPW8uZWxlbWVudDtzLmZvcm1hdCE9PXZvaWQgMD9uLnB1c2gocy5mb3JtYXQodCsyKSk6bi5wdXNoKFwiIFwiLnJlcGVhdCh0KzIpK2Ake2l9ID0gJHtzLnZhbHVlfSAoJHtzLmJ5dGVMZW5ndGh9KWApfXJldHVybiBuLmpvaW4oYFxuYCl9cHJpbnQodCl7Y29uc29sZS53YXJuKHRoaXMuZm9ybWF0KHQpKX19LFU9Y2xhc3MgZXh0ZW5kcyBUe2NvbnN0cnVjdG9yKHQsbiwuLi5pKXtzdXBlcih0LG4pO3RoaXMuYm94U2l6ZT0wLHRoaXMuYXBwZW5kKC4uLmkpfWFwcGVuZCguLi50KXtmb3IobGV0IG4gb2YgdCl0aGlzLmFkZChgYm94XyR7dGhpcy5ib3hTaXplKyt9YCxuKTtyZXR1cm4gdGhpc31wYXJzZSh0KXtsZXQgbj1bXTtmb3IoO3QuYnl0ZUxlbmd0aD4wOyl7bGV0IGk9bmV3IFJlKFwiLi4uLlwiKTtpLmxvYWQodCw0KTtsZXQgbz1pLnZhbHVlLHM9UHNbb10sYTtpZihzIT09dm9pZCAwKXtpZihzLmlzX2NvbnRhaW5lcil7YT1uZXcgVShvKSxhLmxvYWQodCk7bGV0IHU9YS5wYXJzZSh0LnNsaWNlKGEuYnl0ZUxlbmd0aCxhLmdldChcInNpemVcIikpKTtuLnB1c2goLi4udSl9ZWxzZSBpZihhPW5ldyBUKG8pLGEubG9hZCh0KSxvPT09XCJhdmNDXCIpe2xldCB1PWEuZWxlbWVudChcIkFWQ1Byb2ZpbGVJbmRpY2F0aW9uXCIpLnZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLDApLGY9YS5lbGVtZW50KFwicHJvZmlsZV9jb21wYXRpYmlsaXR5XCIpLnZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLDApLGw9YS5lbGVtZW50KFwiQVZDTGV2ZWxJbmRpY2F0aW9uXCIpLnZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLDApO24ucHVzaCh7dHlwZTpcInZpZGVvXCIsbWltZTpgYXZjMS4ke3V9JHtmfSR7bH1gfSl9ZWxzZSBpZihvPT09XCJlc2RzXCIpe2xldCBmPWEuZWxlbWVudChcImF1ZGlvQ29uZmlnQnl0ZXNcIikudmFsdWU+Pj4xMSYzMTtuLnB1c2goe3R5cGU6XCJhdWRpb1wiLG1pbWU6YG1wNGEuNDAuJHtmfWB9KX19ZWxzZSBhPW5ldyBUKFwiLi4uLlwiKSxhLmxvYWQodCksYS50eXBlPWEuZ2V0KFwidHlwZVwiKTt0aGlzLmFwcGVuZChhKSx0PXQuc2xpY2UoYS5nZXQoXCJzaXplXCIpKX1yZXR1cm4gbn19O2MoKTtjKCk7dmFyIFRjPXsxOlwiQUFDIE1haW5cIiwyOlwiQUFDIExDXCJ9LENjPXswOlwiOTYga0h6XCIsMTpcIjg4LjIga0h6XCIsMjpcIjY0IGtIelwiLDM6XCI0OCBrSHpcIiw0OlwiNDQuMSBrSHpcIiw1OlwiMzIga0h6XCIsNjpcIjI0IGtIelwiLDc6XCIyMi4wNSBrSHpcIiw4OlwiMTYga0h6XCIsOTpcIjEyIGtIelwiLDEwOlwiMTEuMDI1IGtIelwiLDExOlwiOCBrSHpcIiwxMjpcIjcuMzUga0h6XCJ9LEJjPXsxOlwiTW9ub1wiLDI6XCJTdGVyZW9cIn0sTWM9cj0+e2xldCBlPXI+Pj4xMSYzMSx0PXI+Pj43JjE1LG49cj4+PjMmMTUsaT1UY1tlXXx8YEFBQyAoJHtlfSlgLG89Q2NbdF18fFwidW5rbm93blwiLHM9QmNbbl18fG4udG9TdHJpbmcoKTtyZXR1cm57Y29kaW5nOmksc2FtcGxpbmdSYXRlOm8sY2hhbm5lbHM6c319LGtzPShyLGUsdCk9PntsZXQgbj1OdW1iZXIoci5mbXRwLnBhcmFtZXRlcnMuYml0cmF0ZSl8fDMyZTQsaT1wYXJzZUludChyLmZtdHAucGFyYW1ldGVycy5jb25maWcuc3Vic3RyKDAsNCksMTYpLG89aT4+PjExJjMxO3JldHVybnt0a2hkOnt0cmFja19JRDp0LGNyZWF0aW9uX3RpbWU6ZSxtb2RpZmljYXRpb25fdGltZTplLHdpZHRoOjAsaGVpZ2h0OjAsdm9sdW1lOjF9LG1kaGQ6e3RpbWVzY2FsZTpOdW1iZXIoci5ydHBtYXAuY2xvY2tyYXRlKSxjcmVhdGlvbl90aW1lOmUsbW9kaWZpY2F0aW9uX3RpbWU6ZSxkdXJhdGlvbjowfSxoZGxyOntoYW5kbGVyX3R5cGU6XCJzb3VuXCIsbmFtZTpcIlNvdW5kSGFuZGxlclxcMFwifSxtZWRpYUhlYWRlckJveDpuZXcgVChcInNtaGRcIiksc2FtcGxlRW50cnlCb3g6bmV3IFUoXCJtcDRhXCIse3NhbXBsZXJhdGU6ci5ydHBtYXAuY2xvY2tyYXRlPDwxNj4+PjB9LG5ldyBUKFwiZXNkc1wiLHthdWRpb0NvbmZpZ0J5dGVzOmksbWF4Qml0UmF0ZTpuLGF2Z0JpdFJhdGU6bn0pKSxkZWZhdWx0RnJhbWVEdXJhdGlvbjoxMDI0LG1pbWU6YG1wNGEuNDAuJHtvfWAsY29kZWM6TWMoaSl9fTtjKCk7YygpO2Z1bmN0aW9uIExjKHIpe3JldHVybiByPjY0JiZyPDkxP3ItNjU6cj45NiYmcjwxMjM/ci03MTpyPjQ3JiZyPDU4P3IrNDpyPT09NDM/NjI6cj09PTQ3PzYzOjB9ZnVuY3Rpb24gT3MocixlKXtsZXQgdD1yLnJlcGxhY2UoL1teQS1aYS16MC05Ky9dL2csXCJcIiksbj10Lmxlbmd0aCxpPWU/TWF0aC5jZWlsKChuKjMrMT4+MikvZSkqZTpuKjMrMT4+MixvPW5ldyBVaW50OEFycmF5KGkpLHMsYSx1PTAsZj0wO2ZvcihsZXQgbD0wO2w8bjtsKyspaWYoYT1sJjMsdXw9TGModC5jaGFyQ29kZUF0KGwpKTw8MTgtNiphLGE9PT0zfHxuLWw9PT0xKXtmb3Iocz0wO3M8MyYmZjxpO3MrKyxmKyspb1tmXT11Pj4+KDE2Pj4+cyYyNCkmMjU1O3U9MH1yZXR1cm4gb31jKCk7YygpO3ZhciBncj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9idWZmZXI9ZSx0aGlzLl9kYXRhVmlldz1uZXcgRGF0YVZpZXcodGhpcy5fYnVmZmVyKSx0aGlzLl9vZmZzZXQ9MCx0aGlzLl9iaXRwb3M9MCx0aGlzLl9ieXRlPTB9cmVhZFVpbnQ4KGUpe3JldHVybiB0aGlzLl9kYXRhVmlldy5nZXRVaW50OChlKX1yZWFkVWludDE2KGUpe3JldHVybiB0aGlzLl9kYXRhVmlldy5nZXRVaW50MTYoZSl9cmVhZFVpbnQzMihlKXtyZXR1cm4gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKGUpfXJlYWROZXh0KCl7bGV0IGU9dGhpcy5yZWFkVWludDgodGhpcy5fb2Zmc2V0KTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz0xLGV9cmVhZEJpdHMoZSl7aWYoZT4zMnx8ZT09PTApdGhyb3cgbmV3IEVycm9yKFwibGVuZ3RoIGhhcyB0byBiZSBiZXR3ZWVuIDAgLSAzMSBiaXRzXCIpO2xldCB0PTA7Zm9yKGxldCBuPTE7bjw9ZTsrK24pdGhpcy5fYml0cG9zPT09MCYmKHRoaXMuX2J5dGU9dGhpcy5yZWFkTmV4dCgpKSx0PXQ8PDF8dGhpcy5fYnl0ZT4+OC0rK3RoaXMuX2JpdHBvcyYxLHRoaXMuX2JpdHBvcyU9ODtyZXR1cm4gdH1yZWFkVW5zaWduZWRFeHBHb2xvbWIoKXtsZXQgZT0wO2Zvcig7dGhpcy5yZWFkQml0cygxKSE9PTE7KWUrKztpZihlPT09MClyZXR1cm4gMDtpZihlPj0zMSl0aHJvdyBuZXcgRXJyb3IoXCJyZWFkIHVuc2lnbmVkIGV4cG9uZW50aWFsIEdvbG9tYjogaW50ZXJuYWwgZXJyb3JcIik7bGV0IHQ9dGhpcy5yZWFkQml0cyhlKTtyZXR1cm4gdHw9MTw8ZSx0LTF9cmVhZFNpZ25lZEV4cEdvbG9tYigpe2xldCBlPXRoaXMucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7cmV0dXJuIGUmMT9lPWUrMT4+MTplPS0oZT4+MSksZX1zaXplKCl7cmV0dXJuIHRoaXMuX2J1ZmZlci5ieXRlTGVuZ3RofWdldFVpbnQ4QXJyYXkoKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5fYnVmZmVyKX1nZXRBcnJheUJ1ZmZlcigpe3JldHVybiB0aGlzLl9idWZmZXJ9fTt2YXIgeXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5yZWFkZXI9bmV3IGdyKGUpfXBhcnNlKCl7dGhpcy5yZWFkZXIucmVhZE5leHQoKTtsZXQgZT10aGlzLnJlYWRlci5yZWFkTmV4dCgpO3RoaXMucmVhZGVyLnJlYWROZXh0KCk7bGV0IHQ9dGhpcy5yZWFkZXIucmVhZE5leHQoKTtpZih0aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSxbMTAwLDExMCwxMjIsMjQ0LDQ0LDgzLDg2LDExOF0uaW5jbHVkZXMoZSkpe2xldCBiPXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpO2lmKGI9PT0zJiZ0aGlzLnJlYWRlci5yZWFkQml0cygxKSx0aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkQml0cygxKSx0aGlzLnJlYWRlci5yZWFkQml0cygxKSlmb3IobGV0IHc9MDt3PChiIT09Mz84OjEyKTt3KyspdGhpcy5yZWFkZXIucmVhZEJpdHMoMSl9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7bGV0IG49dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7aWYobj09PTApdGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7ZWxzZSBpZihuPT09MSl7bGV0IGI9MDt0aGlzLnJlYWRlci5yZWFkQml0cygxKSx0aGlzLnJlYWRlci5yZWFkU2lnbmVkRXhwR29sb21iKCksdGhpcy5yZWFkZXIucmVhZFNpZ25lZEV4cEdvbG9tYigpLGI9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7Zm9yKGxldCB5PTA7eTxiO3krKyl0aGlzLnJlYWRlci5yZWFkU2lnbmVkRXhwR29sb21iKCl9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCksdGhpcy5yZWFkZXIucmVhZEJpdHMoMSk7bGV0IGk9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCksbz10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSxzPXRoaXMucmVhZGVyLnJlYWRCaXRzKDEpO3RoaXMucmVhZGVyLnJlYWRCaXRzKDEpO2xldCBhPXRoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHU9YT90aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTowLGY9YT90aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTowLGw9YT90aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTowLGQ9YT90aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTowLGg9KGkrMSkqMTYtdSoyLWYqMixtPSgyLXMpKihvKzEpKjE2LWwqMi1kKjI7cmV0dXJue3Byb2ZpbGU6ZSxsZXZlbDp0LzEwLHdpZHRoOmgsaGVpZ2h0Om19fX07dmFyIEljPXs2NjpcIkJhc2VsaW5lXCIsNzc6XCJNYWluXCIsMTAwOlwiSGlnaFwifSxBYz1yPT57bGV0IGU9cGFyc2VJbnQoci5zdWJzdHIoMCwyKSwxNiksdD1wYXJzZUludChyLnN1YnN0cig0LDIpLDE2KSxuPUljW2VdfHxlLnRvU3RyaW5nKCksaT0odC8xMCkudG9GaXhlZCgxKTtyZXR1cm57Y29kaW5nOlwiSC4yNjRcIixwcm9maWxlOm4sbGV2ZWw6aX19LFVzPShyLGUsdCk9PntsZXQgbj1yLmZtdHAucGFyYW1ldGVyc1tcInByb2ZpbGUtbGV2ZWwtaWRcIl0saT1yLmZtdHAucGFyYW1ldGVyc1tcInNwcm9wLXBhcmFtZXRlci1zZXRzXCJdLnNwbGl0KFwiLFwiKS5tYXAoT3MpLG89aS5zbGljZSgwLDEpLHM9aS5zbGljZSgxKSxhPW5ldyB5cihvWzBdLmJ1ZmZlcikucGFyc2UoKSx1PTM2MDA7cmV0dXJue21lZGlhSGVhZGVyQm94Om5ldyBUKFwidm1oZFwiKSxzYW1wbGVFbnRyeUJveDpuZXcgVShcImF2YzFcIix7d2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHR9LG5ldyBUKFwiYXZjQ1wiLHtBVkNQcm9maWxlSW5kaWNhdGlvbjpvWzBdWzFdLHByb2ZpbGVfY29tcGF0aWJpbGl0eTpvWzBdWzJdLEFWQ0xldmVsSW5kaWNhdGlvbjpvWzBdWzNdLHNlcXVlbmNlUGFyYW1ldGVyU2V0czpvLHBpY3R1cmVQYXJhbWV0ZXJTZXRzOnN9KSksdGtoZDp7dHJhY2tfSUQ6dCxjcmVhdGlvbl90aW1lOmUsbW9kaWZpY2F0aW9uX3RpbWU6ZSx3aWR0aDphLndpZHRoPDwxNixoZWlnaHQ6YS5oZWlnaHQ8PDE2LHZvbHVtZTowfSxoZGxyOnt9LG1kaGQ6e3RpbWVzY2FsZTpyLnJ0cG1hcC5jbG9ja3JhdGUsY3JlYXRpb25fdGltZTplLG1vZGlmaWNhdGlvbl90aW1lOmUsZHVyYXRpb246MH0sZGVmYXVsdEZyYW1lRHVyYXRpb246ci5mcmFtZXJhdGUhPT12b2lkIDAmJnIuZnJhbWVyYXRlPjAmJk51bWJlcihyLnJ0cG1hcC5jbG9ja3JhdGUpL051bWJlcihyLmZyYW1lcmF0ZSl8fHUsbWltZTpgYXZjMS4ke259YCxjb2RlYzpBYyhuKX19O3ZhciBEcz17XCJNUEVHNC1HRU5FUklDXCI6a3MsSDI2NDpVc30sRmM9KCk9Pih7bGFzdFRpbWVzdGFtcDowLGJhc2VNZWRpYURlY29kZVRpbWU6MCxkZWZhdWx0RnJhbWVEdXJhdGlvbjowLGNsb2NrcmF0ZTowLGJpdHJhdGU6MCxmcmFtZXJhdGU6MCxjdW11bGF0aXZlQnl0ZUxlbmd0aDowLGN1bXVsYXRpdmVEdXJhdGlvbjowLGN1bXVsYXRpdmVGcmFtZXM6MH0pLFBjPShyLHtieXRlTGVuZ3RoOmUsZHVyYXRpb246dH0pPT57aWYoci5jdW11bGF0aXZlQnl0ZUxlbmd0aCs9ZSxyLmN1bXVsYXRpdmVEdXJhdGlvbis9dCxyLmN1bXVsYXRpdmVGcmFtZXMrKyxyLmN1bXVsYXRpdmVEdXJhdGlvbj49ci5jbG9ja3JhdGUpe2xldCBuPTgqci5jdW11bGF0aXZlQnl0ZUxlbmd0aCxpPXIuY3VtdWxhdGl2ZUZyYW1lcyxvPXIuY3VtdWxhdGl2ZUR1cmF0aW9uL3IuY2xvY2tyYXRlO3IuYml0cmF0ZT1uL28sci5mcmFtZXJhdGU9aS9vLHIuY3VtdWxhdGl2ZUJ5dGVMZW5ndGg9MCxyLmN1bXVsYXRpdmVEdXJhdGlvbj0wLHIuY3VtdWxhdGl2ZUZyYW1lcz0wfX0sYnI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnRyYWNrSWRNYXA9e30sdGhpcy5zZXF1ZW5jZU51bWJlcj0wLHRoaXMubnRwUHJlc2VudGF0aW9uVGltZT0wLHRoaXMudHJhY2tEYXRhPVtdfXRyYWsoZSl7bGV0IHQ9bmV3IFUoXCJ0cmFrXCIpLG49bmV3IFUoXCJtZGlhXCIpLGk9bmV3IFUoXCJtaW5mXCIpLG89bmV3IFUoXCJkaW5mXCIpLHM9bmV3IFUoXCJkcmVmXCIpLGE9bmV3IFUoXCJzdGJsXCIpO3JldHVybiBzLnNldChcImVudHJ5X2NvdW50XCIsMSksdC5hcHBlbmQobmV3IFQoXCJ0a2hkXCIsZS50a2hkKSxuLmFwcGVuZChuZXcgVChcIm1kaGRcIixlLm1kaGQpLG5ldyBUKFwiaGRsclwiLGUuaGRsciksaS5hcHBlbmQoZS5tZWRpYUhlYWRlckJveCxvLmFwcGVuZChzLmFwcGVuZChuZXcgVChcInVybCBcIikpKSxhLmFwcGVuZChuZXcgVShcInN0c2RcIix2b2lkIDAsZS5zYW1wbGVFbnRyeUJveCksbmV3IFQoXCJzdHRzXCIpLG5ldyBUKFwic3RzY1wiKSxuZXcgVChcInN0Y29cIiksbmV3IFQoXCJzdHN6XCIpLG5ldyBUKFwic3Rzc1wiKSkpKSksdH1tb292KGUsdCl7bGV0IG49bmV3IFUoXCJtb292XCIpO24uYXBwZW5kKG5ldyBUKFwibXZoZFwiLHtjcmVhdGlvbl90aW1lOnQsbW9kaWZpY2F0aW9uX3RpbWU6dCxkdXJhdGlvbjowfSkpO2xldCBpPW5ldyBVKFwibXZleFwiKTt0aGlzLnRyYWNrSWRNYXA9e30sdGhpcy5zZXF1ZW5jZU51bWJlcj0wLHRoaXMubnRwUHJlc2VudGF0aW9uVGltZT0wO2xldCBvPTA7cmV0dXJuIHRoaXMudHJhY2tEYXRhPVtdLGUubWVkaWEuZm9yRWFjaChzPT57aWYocy5ydHBtYXA9PT12b2lkIDApcmV0dXJuO2xldCBhPXMucnRwbWFwLnBheWxvYWRUeXBlLHU9cy5ydHBtYXAuZW5jb2RpbmdOYW1lO2lmKERzW3VdIT09dm9pZCAwKXt0aGlzLnRyYWNrSWRNYXBbYV09KytvLHMudHlwZS50b0xvd2VyQ2FzZSgpPT09XCJ2aWRlb1wiJiYodGhpcy52aWRlb1RyYWNrSWQ9byk7bGV0IGY9RHNbdV0ocyx0LG8pO3MubWltZT1mLm1pbWUscy5jb2RlYz1mLmNvZGVjO2xldCBsPUZjKCk7bC5jbG9ja3JhdGU9cy5ydHBtYXAuY2xvY2tyYXRlLGwuZGVmYXVsdEZyYW1lRHVyYXRpb249Zi5kZWZhdWx0RnJhbWVEdXJhdGlvbix0aGlzLnRyYWNrRGF0YS5wdXNoKGwpO2xldCBkPXRoaXMudHJhayhmKTtuLmFwcGVuZChkKSxpLmFwcGVuZChuZXcgVChcInRyZXhcIix7dHJhY2tfSUQ6b30pKX19KSxuLmFwcGVuZChpKSxufW1vb2YoZSl7bGV0e3RyYWNrSWQ6dCx0aW1lc3RhbXA6bixieXRlTGVuZ3RoOml9PWUsbz10LTEscz10aGlzLnRyYWNrRGF0YVtvXSxhPXMubGFzdFRpbWVzdGFtcCE9PTA/bi1zLmxhc3RUaW1lc3RhbXB8MDpzLmRlZmF1bHRGcmFtZUR1cmF0aW9uLHU9YT4wP2E6cy5kZWZhdWx0RnJhbWVEdXJhdGlvbjtzLmxhc3RUaW1lc3RhbXA9YT4wP246cy5sYXN0VGltZXN0YW1wK3U7bGV0IGY9bmV3IFUoXCJtb29mXCIpLGw9bmV3IFUoXCJ0cmFmXCIpLGQ9bmV3IFQoXCJ0cnVuXCIse3NhbXBsZV9kdXJhdGlvbjp1LHNhbXBsZV9zaXplOmksZmlyc3Rfc2FtcGxlX2ZsYWdzOjY0fSk7cmV0dXJuIGYuYXBwZW5kKG5ldyBUKFwibWZoZFwiLHtzZXF1ZW5jZV9udW1iZXI6dGhpcy5zZXF1ZW5jZU51bWJlcisrfSksbC5hcHBlbmQobmV3IFQoXCJ0ZmhkXCIse3RyYWNrX0lEOnR9KSxuZXcgVChcInRmZHRcIix7YmFzZU1lZGlhRGVjb2RlVGltZTpzLmJhc2VNZWRpYURlY29kZVRpbWV9KSxkKSkscy5iYXNlTWVkaWFEZWNvZGVUaW1lKz11LGQuc2V0KFwiZGF0YV9vZmZzZXRcIixmLmJ5dGVMZW5ndGgrOCksUGMocyx7Ynl0ZUxlbmd0aDppLGR1cmF0aW9uOnV9KSxmfW1kYXQoZSl7bGV0IHQ9bmV3IFQoXCJtZGF0XCIpO3JldHVybiB0LmFkZChcImRhdGFcIixlKSx0fXNldFByZXNlbnRhdGlvblRpbWUoZSx0KXtpZighdGhpcy5udHBQcmVzZW50YXRpb25UaW1lJiZ0JiZlPT09dGhpcy52aWRlb1RyYWNrSWQpe2xldCBuPWUtMSxpPXRoaXMudHJhY2tEYXRhW25dO3RoaXMubnRwUHJlc2VudGF0aW9uVGltZT10LTFlMyooaS5iYXNlTWVkaWFEZWNvZGVUaW1lL2kuY2xvY2tyYXRlKX19fTt2YXIgTnM9QyhOKCkpO3ZhciBwdD1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtsZXQgdD1uZXcgYnIsbj1vPT57dGhpcy5vblN5bmMmJnRoaXMub25TeW5jKG8pfSxpPW5ldyBOcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKG8scyxhKXtpZihvLnR5cGU9PT01KXtsZXQgdT1NYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpLzFlMysyMDgyODUyZTMpLGY9bmV3IFQoXCJmdHlwXCIpLGw9dC5tb292KG8uc2RwLHUpLGQ9QnVmZmVyLmFsbG9jVW5zYWZlKGYuYnl0ZUxlbmd0aCtsLmJ5dGVMZW5ndGgpO2YuY29weShkLDApLGwuY29weShkLGYuYnl0ZUxlbmd0aCksKDAsWW4uZGVmYXVsdCkoXCJtc2w6bXA0Omlzb21cIikoYGZ0eXA6ICR7Zi5mb3JtYXQoKX1gKSwoMCxZbi5kZWZhdWx0KShcIm1zbDptcDQ6aXNvbVwiKShgbW9vdjogJHtsLmZvcm1hdCgpfWApO2xldCBoPW8uc2RwLm1lZGlhLm1hcChtPT4oe3R5cGU6bS50eXBlLGVuY29kaW5nOm0ucnRwbWFwJiZtLnJ0cG1hcC5lbmNvZGluZ05hbWUsbWltZTptLm1pbWUsY29kZWM6bS5jb2RlY30pKTt0aGlzLnB1c2goe3R5cGU6OCxkYXRhOmQsdHJhY2tzOmgsZnR5cDpmLG1vb3Y6bH0pfWVsc2UgaWYoby50eXBlPT09Nnx8by50eXBlPT09Nyl7bGV0e3BheWxvYWRUeXBlOnUsdGltZXN0YW1wOmYsbnRwVGltZXN0YW1wOmx9PW8sZD10LnRyYWNrSWRNYXBbdV07aWYoZCl7dC5udHBQcmVzZW50YXRpb25UaW1lfHwodC5zZXRQcmVzZW50YXRpb25UaW1lKGQsbCksdC5udHBQcmVzZW50YXRpb25UaW1lJiZuKHQubnRwUHJlc2VudGF0aW9uVGltZSkpO2xldCBoLG09by50eXBlPT09Nz9vLm5hbFR5cGU9PT01OnZvaWQgMDt0Lm50cFByZXNlbnRhdGlvblRpbWUmJm0mJm8ubnRwVGltZXN0YW1wIT09dm9pZCAwJiYoaD0oby5udHBUaW1lc3RhbXAtdC5udHBQcmVzZW50YXRpb25UaW1lKS8xZTMpO2xldCBiPW8uZGF0YS5ieXRlTGVuZ3RoLHk9dC5tb29mKHt0cmFja0lkOmQsdGltZXN0YW1wOmYsYnl0ZUxlbmd0aDpifSksdz10Lm1kYXQoby5kYXRhKSxfPUJ1ZmZlci5hbGxvY1Vuc2FmZSh5LmJ5dGVMZW5ndGgrdy5ieXRlTGVuZ3RoKTt5LmNvcHkoXywwKSx3LmNvcHkoXyx5LmJ5dGVMZW5ndGgpLHRoaXMucHVzaCh7dHlwZTo4LGRhdGE6Xyxtb29mOnksbWRhdDp3LG50cFRpbWVzdGFtcDpsLGNoZWNrcG9pbnRUaW1lOmh9KX19ZWxzZSB0aGlzLnB1c2gobyk7YSgpfX0pO3N1cGVyKGkpO3RoaXMuYm94QnVpbGRlcj10fWdldCBiaXRyYXRlKCl7cmV0dXJuIHRoaXMuYm94QnVpbGRlci50cmFja0RhdGEmJnRoaXMuYm94QnVpbGRlci50cmFja0RhdGEubWFwKHQ9PnQuYml0cmF0ZSl9Z2V0IGZyYW1lcmF0ZSgpe3JldHVybiB0aGlzLmJveEJ1aWxkZXIudHJhY2tEYXRhJiZ0aGlzLmJveEJ1aWxkZXIudHJhY2tEYXRhLm1hcCh0PT50LmZyYW1lcmF0ZSl9Z2V0IG50cFByZXNlbnRhdGlvblRpbWUoKXtyZXR1cm4gdGhpcy5ib3hCdWlsZGVyLm50cFByZXNlbnRhdGlvblRpbWV9fTtjKCk7dmFyIFZzPUMobGUoKSk7dmFyIHZyPUMoTigpKTtjKCk7dmFyIEtuPShvPT4ob1tvLlNSPTIwMF09XCJTUlwiLG9bby5SUj0yMDFdPVwiUlJcIixvW28uU0RFUz0yMDJdPVwiU0RFU1wiLG9bby5CWUU9MjAzXT1cIkJZRVwiLG9bby5BUFA9MjA0XT1cIkFQUFwiLG8pKShLbnx8e30pLGtjPXI9Pih7dmVyc2lvbjpyWzBdPj4+NixwYWRkaW5nOiEhKHJbMF0maXRbMl0pLGNvdW50OnJbMF0mMzEscGFja2V0VHlwZTpyLnJlYWRVSW50OCgxKSxsZW5ndGg6ci5yZWFkVUludDE2QkUoMil9KSxYbj1yPT57bGV0IGU9a2Mocik7c3dpdGNoKGUucGFja2V0VHlwZSl7Y2FzZSAyMDA6cmV0dXJuIE9jKHIsZSk7Y2FzZSAyMDE6cmV0dXJuIFVjKHIsZSk7Y2FzZSAyMDI6cmV0dXJuIERjKHIsZSk7Y2FzZSAyMDM6cmV0dXJuIE5jKHIsZSk7Y2FzZSAyMDQ6cmV0dXJuIEhjKHIsZSk7ZGVmYXVsdDpyZXR1cm4gZX19LHhyPShyLGUpPT4oe3R5cGU6MyxkYXRhOmUsY2hhbm5lbDpyLHJ0Y3A6WG4oZSl9KSxIcz17cGFja2V0VHlwZToyMDB9LHFzPShyLGUsdCk9PntsZXQgbj1bXTtmb3IobGV0IGk9MDtpPHI7aSsrKXtsZXQgbz10K2kqMjQ7bi5wdXNoKHtzeW5jU291cmNlOmUucmVhZFVJbnQzMkJFKG8rMCksZnJhY3Rpb25Mb3N0OmUucmVhZFVJbnQ4KG8rNCksY3VtdWxhdGl2ZU51bWJlck9mUGFja2V0c0xvc3Q6ZS5yZWFkVUludEJFKG8rNSwzKSxleHRlbmRlZEhpZ2hlc3RTZXF1ZW5jZU51bWJlclJlY2VpdmVkOmUucmVhZFVJbnQzMkJFKG8rOCksaW50ZXJhcnJpdmFsSml0dGVyOmUucmVhZFVJbnQzMkJFKG8rMTIpLGxhc3RTUlRpbWVzdGFtcDplLnJlYWRVSW50MzJCRShvKzE2KSxkZWxheVNpbmNlTGFzdFNSOmUucmVhZFVJbnQzMkJFKG8rMjApfSl9cmV0dXJuIG59LE9jPShyLGUpPT4oey4uLmUsc3luY1NvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxudHBNb3N0OnIucmVhZFVJbnQzMkJFKDgpLG50cExlYXN0OnIucmVhZFVJbnQzMkJFKDEyKSxydHBUaW1lc3RhbXA6ci5yZWFkVUludDMyQkUoMTYpLHNlbmRlcnNQYWNrZXRDb3VudDpyLnJlYWRVSW50MzJCRSgyMCksc2VuZGVyc09jdGV0Q291bnQ6ci5yZWFkVUludDMyQkUoMjQpLHJlcG9ydHM6cXMoZS5jb3VudCxyLDI4KX0pLF9yPXI9PnIucGFja2V0VHlwZT09PTIwMCxVYz0ocixlKT0+KHsuLi5lLHN5bmNTb3VyY2U6ci5yZWFkVUludDMyQkUoNCkscmVwb3J0czpxcyhlLmNvdW50LHIsOCl9KSxqcz1yPT5yLnBhY2tldFR5cGU9PT0yMDEsSm49KHU9Pih1W3UuQ05BTUU9MV09XCJDTkFNRVwiLHVbdS5OQU1FPTJdPVwiTkFNRVwiLHVbdS5FTUFJTD0zXT1cIkVNQUlMXCIsdVt1LlBIT05FPTRdPVwiUEhPTkVcIix1W3UuTE9DPTVdPVwiTE9DXCIsdVt1LlRPT0w9Nl09XCJUT09MXCIsdVt1Lk5PVEU9N109XCJOT1RFXCIsdVt1LlBSSVY9OF09XCJQUklWXCIsdSkpKEpufHx7fSksRGM9KHIsZSk9PntsZXQgdD1bXSxuPTQ7Zm9yKGxldCBpPTA7aTxlLmNvdW50O2krKyl7bGV0IG89e3NvdXJjZTpyLnJlYWRVSW50MzJCRShuKSxpdGVtczpbXX07Zm9yKG4rPTQ7Oyl7bGV0IHM9ci5yZWFkVUludDgobisrKTtpZihzPT09MCl7biU0IT09MCYmKG4rPTQtbiU0KTticmVha31sZXQgYT1yLnJlYWRVSW50OChuKyspO2lmKHM9PT04KXtsZXQgdT1yLnJlYWRVSW50OChuKSxmPXIudG9TdHJpbmcoXCJ1dGY4XCIsbisxLG4rMSt1KSxsPXIudG9TdHJpbmcoXCJ1dGY4XCIsbisxK3UsbithKTtvLml0ZW1zLnB1c2goWzgsZixsXSl9ZWxzZXtsZXQgdT1yLnRvU3RyaW5nKFwidXRmOFwiLG4sbithKTtvLml0ZW1zLnB1c2goW3MsdV0pfW4rPWF9dC5wdXNoKG8pfXJldHVybnsuLi5lLHN5bmNTb3VyY2U6ci5yZWFkVUludDMyQkUoNCksc291cmNlRGVzY3JpcHRpb25zOnR9fSxXcz1yPT5yLnBhY2tldFR5cGU9PT0yMDIsTmM9KHIsZSk9PntsZXQgdD1bXTtmb3IobGV0IGk9MDtpPGUuY291bnQ7aSsrKXQucHVzaChyLnJlYWRVSW50MzJCRSg0KzQqaSkpO2xldCBuO2lmKGUubGVuZ3RoPmUuY291bnQpe2xldCBpPTQrNCplLmNvdW50LG89ci5yZWFkVUludDgoaSk7bj1yLnRvU3RyaW5nKFwidXRmLThcIixpKzEsaSsxK28pfXJldHVybnsuLi5lLHNvdXJjZXM6dCxyZWFzb246bn19LHdyPXI9PnIucGFja2V0VHlwZT09PTIwMyxIYz0ocixlKT0+KHsuLi5lLHN1YnR5cGU6ZS5jb3VudCxzb3VyY2U6ci5yZWFkVUludDMyQkUoNCksbmFtZTpyLnRvU3RyaW5nKFwiYXNjaWlcIiw4LDEyKSxkYXRhOnIuc2xpY2UoMTIpfSksJHM9cj0+ci5wYWNrZXRUeXBlPT09MjA0O3ZhciBxYz0xMDAsR3M9KDAsVnMuZGVmYXVsdCkoXCJtc2w6bXNlXCIpLFRlPWNsYXNzIGV4dGVuZHMgUXtjb25zdHJ1Y3Rvcih0KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInZpZGVvIGVsZW1lbnQgYXJndW1lbnQgbWlzc2luZ1wiKTtsZXQgbixpLG89bmV3IHZyLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwLHdyaXRlOihhLHUsZik9PntpZihhLnR5cGU9PT04KWlmKHRoaXMuX2RvbmU9ZixhLnRyYWNrcyE9PXZvaWQgMHx8YS5taW1lIT09dm9pZCAwKXtsZXQgbD1hLnRyYWNrcz8/W10sZD1sLm1hcCh5PT55Lm1pbWUpLmZpbHRlcih5PT55KSxoPWQubGVuZ3RoIT09MD9kLmpvaW4oXCIsIFwiKTpcImF2YzEuNjQwMDI5LCBtcDRhLjQwLjJcIixtPWEubWltZT8/YHZpZGVvL21wNDsgY29kZWNzPVwiJHtofVwiYDtpZighTWVkaWFTb3VyY2UuaXNUeXBlU3VwcG9ydGVkKG0pKXtvLmVtaXQoXCJlcnJvclwiLGB1bnN1cHBvcnRlZCBtZWRpYSB0eXBlOiAke219YCk7cmV0dXJufXRoaXMuX2xhc3RDaGVja3BvaW50VGltZT0wLG49bmV3IE1lZGlhU291cmNlLHQuc3JjPXdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG4pO2xldCBiPSgpPT57aWYobj09PXZvaWQgMCl7by5lbWl0KFwiZXJyb3JcIixcIm5vIE1lZGlhU291cmNlIGluc3RhbmNlXCIpO3JldHVybn13aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh0LnNyYyksbi5yZW1vdmVFdmVudExpc3RlbmVyKFwic291cmNlb3BlblwiLGIpLHRoaXMub25Tb3VyY2VPcGVuJiZ0aGlzLm9uU291cmNlT3BlbihuLGwpLGk9dGhpcy5hZGRTb3VyY2VCdWZmZXIodCxuLG0pLGkub25lcnJvcj15PT57Y29uc29sZS5lcnJvcihcImVycm9yIG9uIFNvdXJjZUJ1ZmZlcjogXCIseSksby5lbWl0KFwiZXJyb3JcIil9O3RyeXtpLmFwcGVuZEJ1ZmZlcihhLmRhdGEpfWNhdGNoKHkpe0dzKFwiZmFpbGVkIHRvIGFwcGVuZCB0byBTb3VyY2VCdWZmZXI6IFwiLHksYSl9fTtuLmFkZEV2ZW50TGlzdGVuZXIoXCJzb3VyY2VvcGVuXCIsYil9ZWxzZXt0aGlzLl9sYXN0Q2hlY2twb2ludFRpbWU9YS5jaGVja3BvaW50VGltZSE9PXZvaWQgMD9hLmNoZWNrcG9pbnRUaW1lOnRoaXMuX2xhc3RDaGVja3BvaW50VGltZTt0cnl7aT8uYXBwZW5kQnVmZmVyKGEuZGF0YSl9Y2F0Y2gobCl7R3MoXCJmYWlsZWQgdG8gYXBwZW5kIHRvIFNvdXJjZUJ1ZmZlcjogXCIsbCxhKX19ZWxzZSBhLnR5cGU9PT0zJiZ3cihhLnJ0Y3ApJiZuPy5yZWFkeVN0YXRlPT09XCJvcGVuXCImJm4uZW5kT2ZTdHJlYW0oKSxmKCl9fSk7by5vbihcImZpbmlzaFwiLCgpPT57Y29uc29sZS53YXJuKFwiaW5jb21pbmcgc3RyZWFtIGZpbmlzaGVkOiBlbmQgc3RyZWFtXCIpLG4mJm4ucmVhZHlTdGF0ZT09PVwib3BlblwiJiZuLmVuZE9mU3RyZWFtKCl9KSxvLm9uKFwiZXJyb3JcIixhPT57Y29uc29sZS5lcnJvcihcImVycm9yIG9uIGluY29taW5nIHN0cmVhbTogXCIsYSksaSYmaS51cGRhdGluZz9pLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVlbmRcIiwoKT0+e24/LnJlYWR5U3RhdGU9PT1cIm9wZW5cIiYmbi5lbmRPZlN0cmVhbSgpfSk6bj8ucmVhZHlTdGF0ZT09PVwib3BlblwiJiZuLmVuZE9mU3RyZWFtKCl9KTtsZXQgcz1uZXcgdnIuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZDpmdW5jdGlvbigpe319KTtzLm9uKFwiZXJyb3JcIiwoKT0+e2NvbnNvbGUud2FybihcIm91dGdvaW5nIHN0cmVhbSBicm9rZSBzb21ld2hlcmVcIil9KTtzdXBlcihvLHMpO3RoaXMuX3ZpZGVvRWw9dCx0aGlzLl9sYXN0Q2hlY2twb2ludFRpbWU9MH1hZGRTb3VyY2VCdWZmZXIodCxuLGkpe2xldCBvPW4uYWRkU291cmNlQnVmZmVyKGkpLHM9MCxhPSgpPT57aWYoKytzLHM+cWMmJm8uYnVmZmVyZWQubGVuZ3RoKXtzPTA7bGV0IHU9by5idWZmZXJlZC5sZW5ndGgtMSxmPW8uYnVmZmVyZWQuc3RhcnQodSksbD1NYXRoLm1pbih0LmN1cnJlbnRUaW1lLHRoaXMuX2xhc3RDaGVja3BvaW50VGltZSktMTA7dHJ5e2lmKGw+Zil7by5yZW1vdmUoZixsKTtyZXR1cm59fWNhdGNoKGQpe2NvbnNvbGUud2FybihkKX19dGhpcy5fZG9uZSYmdGhpcy5fZG9uZSgpfTtyZXR1cm4gby5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZW5kXCIsYSksb31nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fdmlkZW9FbC5jdXJyZW50VGltZX1hc3luYyBwbGF5KCl7cmV0dXJuIGF3YWl0IHRoaXMuX3ZpZGVvRWwucGxheSgpfXBhdXNlKCl7cmV0dXJuIHRoaXMuX3ZpZGVvRWwucGF1c2UoKX19O2MoKTt2YXIgenM9QyhOKCkpO3ZhciBDZT1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtsZXQgZSx0PVtdLG49bmV3IHpzLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24oaSxvLHMpe2lmKGkudHlwZT09PTUpe2xldCBhO2ZvcihsZXQgdSBvZiBpLnNkcC5tZWRpYSl1LnR5cGU9PT1cImFwcGxpY2F0aW9uXCImJnUucnRwbWFwJiZ1LnJ0cG1hcC5lbmNvZGluZ05hbWU9PT1cIlZORC5PTlZJRi5NRVRBREFUQVwiJiYoYT11KTthJiZhLnJ0cG1hcCYmKGU9TnVtYmVyKGEucnRwbWFwLnBheWxvYWRUeXBlKSkscyh2b2lkIDAsaSl9ZWxzZSBpZihpLnR5cGU9PT0yJiZPKGkuZGF0YSk9PT1lKXtpZih0LnB1c2goWihpLmRhdGEpKSxjZShpLmRhdGEpJiZ0Lmxlbmd0aD4wKXtsZXQgYT17dGltZXN0YW1wOkgoaS5kYXRhKSxudHBUaW1lc3RhbXA6aS5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhpLmRhdGEpLGRhdGE6QnVmZmVyLmNvbmNhdCh0KSx0eXBlOjl9O3Modm9pZCAwLGEpLHQ9W107cmV0dXJufXMoKX1lbHNlIHModm9pZCAwLGkpfX0pO3N1cGVyKG4pfX07YygpO3ZhciBabj1DKE4oKSk7YygpO3ZhciBZcz1DKGxlKCkpLGpjPVwiUlRTUC8xLjBcIixLcz1yPT57aWYoIXIubWV0aG9kfHwhci51cmkpdGhyb3cgbmV3IEVycm9yKFwibWVzc2FnZSBuZWVkcyB0byBjb250YWluIGEgbWV0aG9kIGFuZCBhIHVyaVwiKTtsZXQgZT1yLnByb3RvY29sfHxqYyx0PXIuaGVhZGVyc3x8e30sbj1bYCR7ci5tZXRob2R9ICR7ci51cml9ICR7ZX1gLE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoW2ksb10pPT5pK1wiOiBcIitvKS5qb2luKGBcXHJcbmApLGBcXHJcbmBdLmpvaW4oYFxcclxuYCk7cmV0dXJuKDAsWXMuZGVmYXVsdCkoXCJtc2w6cnRzcDpvdXRnb2luZ1wiKShuKSxCdWZmZXIuZnJvbShuKX07YygpO2MoKTt2YXIgV2M9KHIsZSx0PTApPT57bGV0IG49YFxuJHtlfWA7dD1yLmluZGV4T2Yobix0KTtsZXQgaT0wLG89W107Zm9yKDt0Pj0wOylpPXIuaW5kZXhPZihgXG5gLHQrbi5sZW5ndGgpLG8ucHVzaChyLnRvU3RyaW5nKFwiYXNjaWlcIix0K24ubGVuZ3RoLGkpLnRyaW0oKSksdD1yLmluZGV4T2YobixpKTtyZXR1cm4gb30sJGM9cj0+ci5tYXRjaCgvXm09LyksRXI9KHIsZSk9PntsZXQgdD1lLmluZGV4T2Yocik7cmV0dXJuIHQ8MD9bZS5zbGljZSgwKV06W2Uuc2xpY2UoMCx0KSxlLnNsaWNlKHQrMSldfSxYcz17Zm10cDpyPT57bGV0W2UsdF09RXIoXCIgXCIscik7c3dpdGNoKGUpe2RlZmF1bHQ6bGV0IG49dD90LnRyaW0oKS5zcGxpdChcIjtcIik6W10saT17fTtyZXR1cm4gbi5mb3JFYWNoKG89PntsZXRbcyxhXT1FcihcIj1cIixvKSx1PXMudHJpbSgpLnRvTG93ZXJDYXNlKCk7dSE9PVwiXCImJihpW3VdPWEudHJpbSgpKX0pLHtmb3JtYXQ6ZSxwYXJhbWV0ZXJzOml9fX0sZnJhbWVyYXRlOk51bWJlcixydHBtYXA6cj0+e2xldFtlLHRdPUVyKFwiIFwiLHIpLFtuLGksb109dC50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiL1wiKTtyZXR1cm4gbz09PXZvaWQgMD97cGF5bG9hZFR5cGU6TnVtYmVyKGUpLGVuY29kaW5nTmFtZTpuLGNsb2NrcmF0ZTpOdW1iZXIoaSl9OntwYXlsb2FkVHlwZTpOdW1iZXIoZSksZW5jb2RpbmdOYW1lOm4sY2xvY2tyYXRlOk51bWJlcihpKSxlbmNvZGluZ1BhcmFtZXRlcnM6b319LHRyYW5zZm9ybTpyPT5yLnNwbGl0KFwiO1wiKS5tYXAoZT0+ZS5zcGxpdChcIixcIikubWFwKE51bWJlcikpLFwieC1zZW5zb3ItdHJhbnNmb3JtXCI6cj0+ci5zcGxpdChcIjtcIikubWFwKGU9PmUuc3BsaXQoXCIsXCIpLm1hcChOdW1iZXIpKSxmcmFtZXNpemU6cj0+ci5zcGxpdChcIiBcIilbMV0uc3BsaXQoXCItXCIpLm1hcChOdW1iZXIpfSxHYz1yPT57bGV0W2UsdF09RXIoXCI6XCIscik7cmV0dXJuIHQ9PT12b2lkIDA/e1tlXTohMH06WHNbZV0hPT12b2lkIDA/e1tlXTpYc1tlXSh0KX06e1tlXTp0fX0sVmM9cj0+e2xldCBlPXIuc2xpY2UoMCwxKSx0PXIuc2xpY2UoMik7c3dpdGNoKGUpe2Nhc2VcInZcIjpyZXR1cm57dmVyc2lvbjp0fTtjYXNlXCJvXCI6bGV0W24saSxvLHMsYSx1XT10LnNwbGl0KFwiIFwiKTtyZXR1cm57b3JpZ2luOnthZGRyVHlwZTphLG5ldFR5cGU6cyxzZXNzaW9uSWQ6aSxzZXNzaW9uVmVyc2lvbjpvLHVuaWNhc3RBZGRyZXNzOnUsdXNlcm5hbWU6bn19O2Nhc2VcInNcIjpyZXR1cm57c2Vzc2lvbk5hbWU6dH07Y2FzZVwiaVwiOnJldHVybntzZXNzaW9uSW5mb3JtYXRpb246dH07Y2FzZVwidVwiOnJldHVybnt1cmk6dH07Y2FzZVwiZVwiOnJldHVybntlbWFpbDp0fTtjYXNlXCJwXCI6cmV0dXJue3Bob25lOnR9O2Nhc2VcImNcIjpsZXRbZixsLGRdPXQuc3BsaXQoXCIgXCIpO3JldHVybntjb25uZWN0aW9uRGF0YTp7YWRkclR5cGU6bCxjb25uZWN0aW9uQWRkcmVzczpkLG5ldFR5cGU6Zn19O2Nhc2VcImJcIjpsZXRbaCxtXT10LnNwbGl0KFwiOlwiKTtyZXR1cm57Ynd0eXBlOmgsYmFuZHdpZHRoOm19O2Nhc2VcInRcIjpsZXRbYix5XT10LnNwbGl0KFwiIFwiKS5tYXAoTnVtYmVyKTtyZXR1cm57dGltZTp7c3RhcnRUaW1lOmIsc3RvcFRpbWU6eX19O2Nhc2VcInJcIjpsZXRbdyxfLC4uLnZdPXQuc3BsaXQoXCIgXCIpLm1hcChOdW1iZXIpO3JldHVybntyZXBlYXRUaW1lczp7cmVwZWF0SW50ZXJ2YWw6dyxhY3RpdmVEdXJhdGlvbjpfLG9mZnNldHM6dn19O2Nhc2VcInpcIjpyZXR1cm47Y2FzZVwia1wiOnJldHVybjtjYXNlXCJhXCI6cmV0dXJuIEdjKHQpO2Nhc2VcIm1cIjpsZXRbcSxBLGosWV09dC5zcGxpdChcIiBcIik7cmV0dXJue3R5cGU6cSxwb3J0Ok51bWJlcihBKSxwcm90b2NvbDpqLGZtdDpOdW1iZXIoWSl9O2RlZmF1bHQ6fX0sSnM9cj0+e2xldCBlPXIuaW5kZXhPZihgXG5tPWApO3JldHVybiBXYyhyLFwiYT1jb250cm9sOlwiLGUpfSxRbj1yPT57bGV0IGU9ci50b1N0cmluZyhcImFzY2lpXCIpLnNwbGl0KGBcbmApLm1hcChvPT5vLnRyaW0oKSksdD17c2Vzc2lvbjp7fSxtZWRpYTpbXX0sbj0wLGk9dC5zZXNzaW9uO2ZvcihsZXQgbyBvZiBlKSRjKG8pJiYodC5tZWRpYVtuXT17fSxpPXQubWVkaWFbbl0sKytuKSxpPU9iamVjdC5hc3NpZ24oaSxWYyhvKSk7cmV0dXJuIHR9LFNyPXI9Pih7dHlwZTo1LGRhdGE6cixzZHA6UW4ocil9KTtjKCk7dmFyIHJlPShyLGUpPT57bGV0IHQ9YFxuJHtlLnRvTG93ZXJDYXNlKCl9OiBgLG49ci50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0KTtpZihuPj0wKXtsZXQgaT1yLmluZGV4T2YoYFxuYCxuK3QubGVuZ3RoKTtyZXR1cm4gci50b1N0cmluZyhcImFzY2lpXCIsbit0Lmxlbmd0aCxpKS50cmltKCl9cmV0dXJuIG51bGx9LFJyPXI9PntsZXQgZT1yZShyLFwiQ1NlcVwiKTtyZXR1cm4gZSE9PW51bGw/TnVtYmVyKGUpOm51bGx9LFRyPXI9PntsZXQgZT1yZShyLFwiU2Vzc2lvblwiKTtyZXR1cm4gZT9lLnNwbGl0KFwiO1wiKVswXTpudWxsfSxDcj1yPT57bGV0IGU9cmUocixcIlNlc3Npb25cIik7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7bGV0IHQ9NjAsbj1cInRpbWVvdXQ9XCIsaT1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihuKTtpZihpIT09LTEpe2xldCBvPWUuc3Vic3RyaW5nKGkrbi5sZW5ndGgpO289by5zcGxpdChcIjtcIilbMF07bGV0IHM9cGFyc2VJbnQobyk7cmV0dXJuIGlzTmFOKHMpP3Q6c31yZXR1cm4gdH0saHQ9cj0+TnVtYmVyKHIudG9TdHJpbmcoXCJhc2NpaVwiLDksMTIpKSxCcj1yPT5yZShyLFwiQ29udGVudC1CYXNlXCIpLE1yPXI9PnJlKHIsXCJDb250ZW50LUxvY2F0aW9uXCIpLExyPXI9PntsZXQgZT1yZShyLFwiQ29ubmVjdGlvblwiKTtyZXR1cm4gZSE9PW51bGwmJmUudG9Mb3dlckNhc2UoKT09PVwiY2xvc2VcIn0sSXI9cj0+e2xldCBlPXJlKHIsXCJSYW5nZVwiKTtpZihlIT09bnVsbClyZXR1cm4gZS5zcGxpdChcIj1cIilbMV0uc3BsaXQoXCItXCIpfSxBcj1yPT57bGV0IGU9W2BcblxuYCxcIlxcclxcclwiLGBcXHJcblxcclxuYF0ubWFwKHQ9PntsZXQgbj1yLmluZGV4T2YodCk7cmV0dXJuIG4hPT0tMT9uK3QubGVuZ3RoOm59KS5maWx0ZXIodD0+dCE9PS0xKTtyZXR1cm4gZS5sZW5ndGg+MD9lLnJlZHVjZSgodCxuKT0+TWF0aC5taW4odCxuKSk6LTF9O3ZhciBacz00LFFzPTM2LHpjPXI9PntsZXQgZT1CdWZmZXIuYWxsb2MoWnMpLHQ9MCxuPTA7Zm9yKDtuPGUubGVuZ3RoOyl7bGV0IHU9clt0KytdLGY9TWF0aC5taW4odS5sZW5ndGgsZS5sZW5ndGgtbik7dS5jb3B5KGUsbiwwLGYpLG4rPWZ9bGV0IGk9ZVsxXSxvPWUubGVuZ3RoLHM9ZS5yZWFkVUludDE2QkUoMiksYT1vK3M7cmV0dXJue2NoYW5uZWw6aSxiZWdpbjpvLGVuZDphfX0sRnI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9jaHVua3M9W107dGhpcy5fbGVuZ3RoPTA7dGhpcy5fc3RhdGU9MDt0aGlzLl9pbml0KCl9X2luaXQoKXt0aGlzLl9jaHVua3M9W10sdGhpcy5fbGVuZ3RoPTAsdGhpcy5fc3RhdGU9MH1fcHVzaChlKXt0aGlzLl9jaHVua3MucHVzaChlKSx0aGlzLl9sZW5ndGgrPWUubGVuZ3RofV9wYXJzZVJ0c3AoKXtsZXQgZT1bXSx0PUJ1ZmZlci5jb25jYXQodGhpcy5fY2h1bmtzKSxuPUFyKHQpO2lmKG49PT0tMSlyZXR1cm4gZTtsZXQgaT1uLG89cmUodCxcIkNvbnRlbnQtTGVuZ3RoXCIpO2lmKG8mJnBhcnNlSW50KG8pPnQubGVuZ3RoLWkpcmV0dXJuIGU7aWYodGhpcy5faW5pdCgpLGk9PT10Lmxlbmd0aHx8dFtpXT09PVFzKXtsZXQgcz10LnNsaWNlKDAsaSk7ZS5wdXNoKHt0eXBlOjQsZGF0YTpzfSk7bGV0IGE9dC5zbGljZShpKTt0aGlzLl9wdXNoKGEpfWVsc2V7bGV0IHM9dCxhPXQuc2xpY2UoaSk7ZS5wdXNoKHt0eXBlOjQsZGF0YTpzfSksZS5wdXNoKFNyKGEpKX1yZXR1cm4gZX1fcGFyc2VJbnRlcmxlYXZlZCgpe2xldCBlPVtdO2lmKHRoaXMuX2xlbmd0aDxac3x8KHRoaXMuX3BhY2tldHx8KHRoaXMuX3BhY2tldD16Yyh0aGlzLl9jaHVua3MpKSx0aGlzLl9sZW5ndGg8dGhpcy5fcGFja2V0LmVuZCkpcmV0dXJuIGU7bGV0IHQ9QnVmZmVyLmNvbmNhdCh0aGlzLl9jaHVua3MpLG49dC5zbGljZSh0aGlzLl9wYWNrZXQuYmVnaW4sdGhpcy5fcGFja2V0LmVuZCksaT10LnNsaWNlKHRoaXMuX3BhY2tldC5lbmQpLG89dGhpcy5fcGFja2V0LmNoYW5uZWw7aWYoZGVsZXRlIHRoaXMuX3BhY2tldCx0aGlzLl9pbml0KCksdGhpcy5fcHVzaChpKSxvJTI9PT0wKWUucHVzaCh7dHlwZToyLGRhdGE6bixjaGFubmVsOm99KTtlbHNle2xldCBzPW47ZG97bGV0IGE9cy5yZWFkVUludDE2QkUoMikqNCs0O2UucHVzaCh4cihvLHMuc2xpY2UoMCxhKSkpLHM9cy5zbGljZShhKX13aGlsZShzLmxlbmd0aD4wKX1yZXR1cm4gZX1fc2V0U3RhdGUoKXtmb3IoO3RoaXMuX2NodW5rcy5sZW5ndGg+MCYmdGhpcy5fY2h1bmtzWzBdLmxlbmd0aD09PTA7KXRoaXMuX2NodW5rcy5zaGlmdCgpO2xldCBlPXRoaXMuX2NodW5rc1swXTtpZih0aGlzLl9jaHVua3MubGVuZ3RoPT09MCl0aGlzLl9zdGF0ZT0wO2Vsc2UgaWYoZVswXT09PVFzKXRoaXMuX3N0YXRlPTE7ZWxzZSBpZihlLnRvU3RyaW5nKFwiYXNjaWlcIiwwLDQpPT09XCJSVFNQXCIpdGhpcy5fc3RhdGU9MjtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaHVuayBvZiBsZW5ndGggJHtlLmxlbmd0aH1gKX1wYXJzZShlKXt0aGlzLl9wdXNoKGUpLHRoaXMuX3N0YXRlPT09MCYmdGhpcy5fc2V0U3RhdGUoKTtsZXQgdD1bXSxuPSExO2Zvcig7IW47KXtsZXQgaT1bXTtzd2l0Y2godGhpcy5fc3RhdGUpe2Nhc2UgMDpicmVhaztjYXNlIDE6aT10aGlzLl9wYXJzZUludGVybGVhdmVkKCk7YnJlYWs7Y2FzZSAyOmk9dGhpcy5fcGFyc2VSdHNwKCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZVwiKX1pLmxlbmd0aD4wP3Q9dC5jb25jYXQoaSk6bj0hMCx0aGlzLl9zZXRTdGF0ZSgpfXJldHVybiB0fX07dmFyIG10PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlPW5ldyBGcix0PW5ldyBabi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT0xKXRyeXtlLnBhcnNlKGkuZGF0YSkuZm9yRWFjaChhPT50LnB1c2goYSkpLHMoKX1jYXRjaChhKXtzKGEpfWVsc2Ugcyh2b2lkIDAsaSl9fSksbj1uZXcgWm4uVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09NCl7bGV0IGE9S3MoaSk7cyh2b2lkIDAse3R5cGU6MSxkYXRhOmF9KX1lbHNlIHModm9pZCAwLGkpfX0pO3N1cGVyKHQsbil9fTtjKCk7dmFyIGtyPUMobGUoKSk7YygpO3ZhciBndD0ocixlKT0+e2xldCB0O2lmKGUhPT12b2lkIDApe2lmKHR5cGVvZiBlIT1cIm9iamVjdFwiKXRocm93IG5ldyBFcnJvcihcIm1lcmdlIGV4cGVjdHMgb3ZlcnJpZGUgdG8gYmUgYW4gb2JqZWN0IVwiKTt0PU9iamVjdC5rZXlzKGUpLnJlZHVjZSgobixpKT0+KGVbaV0hPT12b2lkIDAmJihuW2ldPWVbaV0pLG4pLHt9KX1yZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyLHQpfTt2YXIgZWE9QyhOKCkpO2MoKTt2YXIgWWM9RGF0ZS5VVEMoMTkwMCwwLDEpO2Z1bmN0aW9uIFByKHIsZSl7bGV0IHQ9KHIrZS80Mjk0OTY3Mjk2KSoxZTM7cmV0dXJuIFljK3R9ZnVuY3Rpb24gS2Mocil7cmV0dXJuL15bXjpdKzpcXC9cXC8vLnRlc3Qocil9dmFyIE9yPShzPT4ocy5PUFRJT05TPVwiT1BUSU9OU1wiLHMuREVTQ1JJQkU9XCJERVNDUklCRVwiLHMuU0VUVVA9XCJTRVRVUFwiLHMuUExBWT1cIlBMQVlcIixzLlBBVVNFPVwiUEFVU0VcIixzLlRFQVJET1dOPVwiVEVBUkRPV05cIixzKSkoT3J8fHt9KSxYYz01LEpjPShyPXR5cGVvZiB3aW5kb3c+XCJ1XCI/XCJcIjp3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsZT1bXSk9Pih7dXJpOmUubGVuZ3RoPjA/YHJ0c3A6Ly8ke3J9L2F4aXMtbWVkaWEvbWVkaWEuYW1wPyR7ZS5qb2luKFwiJlwiKX1gOmBydHNwOi8vJHtyfS9heGlzLW1lZGlhL21lZGlhLmFtcGB9KSxJdD1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbil7c3VwZXIodCk7dGhpcy5uYW1lPVwiUlRTUFJlc3BvbnNlRXJyb3JcIix0aGlzLmNvZGU9bn19LHl0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcih0PXt9KXtsZXR7dXJpOm4saGVhZGVyczppLGRlZmF1bHRIZWFkZXJzOm99PWd0KEpjKHQuaG9zdG5hbWUsdC5wYXJhbWV0ZXJzKSx0KSxzPW5ldyBlYS5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOihhLHUsZik9PnthLnR5cGU9PT00Pyh0aGlzLl9vblJ0c3AoYSksZigpKTphLnR5cGU9PT0zPyh0aGlzLl9vblJ0Y3AoYSksdGhpcy5vblJ0Y3AmJnRoaXMub25SdGNwKGEucnRjcCksZih2b2lkIDAsYSkpOmEudHlwZT09PTI/KHRoaXMuX29uUnRwKGEpLGYodm9pZCAwLGEpKTooYS50eXBlPT09NSYmKHRoaXMuX29uU2RwKGEpLHRoaXMub25TZHAmJnRoaXMub25TZHAoYS5zZHApKSxmKHZvaWQgMCxhKSl9fSk7cy5vbihcImVuZFwiLCgpPT57dGhpcy5fb3V0Z29pbmdDbG9zZWQ9ITB9KTtzdXBlcihzKTt0aGlzLl9vdXRnb2luZ0Nsb3NlZD0hMSx0aGlzLl9yZXNldCgpLHRoaXMudXBkYXRlKG4saSxvKSx0aGlzLl9zZXNzaW9uQ29udHJvbFVSTD10aGlzLl9jb250cm9sVVJMKCl9dXBkYXRlKHQsbj17fSxpPXt9KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhbiB1cmkgd2hlbiBjcmVhdGluZyBhIFJ0c3BTZXNzaW9uQ29tcG9uZW50XCIpO3RoaXMudXJpPXQsdGhpcy5kZWZhdWx0SGVhZGVycz1pLHRoaXMuaGVhZGVycz1PYmplY3QuYXNzaWduKHtbXCJPUFRJT05TXCJdOnt9LFtcIlBMQVlcIl06e30sW1wiU0VUVVBcIl06e0Jsb2Nrc2l6ZTpcIjY0MDAwXCJ9LFtcIkRFU0NSSUJFXCJdOntBY2NlcHQ6XCJhcHBsaWNhdGlvbi9zZHBcIn0sW1wiUEFVU0VcIl06e319LG4pfV9yZXNldCgpe3RoaXMuX3NlcXVlbmNlPTEsdGhpcy5yZXRyeT0oKT0+Y29uc29sZS5lcnJvcihcIk5vIHJlcXVlc3Qgc2VudCwgY2FuJ3QgcmV0cnlcIiksdGhpcy5fY2FsbFN0YWNrPVtdLHRoaXMuX2NhbGxIaXN0b3J5PVtdLHRoaXMuX3N0YXRlPVwiaWRsZVwiLHRoaXMuX3dhaXRpbmc9ITEsdGhpcy5fY29udGVudEJhc2U9bnVsbCx0aGlzLl9zZXNzaW9uSWQ9bnVsbCx0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCE9PW51bGwmJmNsZWFySW50ZXJ2YWwodGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwpLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsPW51bGwsdGhpcy50MD12b2lkIDAsdGhpcy5uMD12b2lkIDAsdGhpcy5jbG9ja3JhdGVzPXZvaWQgMH1fY29udHJvbFVSTCh0KXtpZih0IT09dm9pZCAwJiZLYyh0KSlyZXR1cm4gdDtsZXQgbj10aGlzLl9jb250ZW50QmFzZT8/dGhpcy5fY29udGVudExvY2F0aW9uPz90aGlzLnVyaTtpZihuPT1udWxsKXRocm93IG5ldyBFcnJvcihcInJlbGF0aXZlIG9yIG1pc3NpbmcgY29udHJvbCBhdHRyaWJ1dGUgYnV0IG5vIGJhc2UgVVJMIGF2YWlsYWJsZVwiKTtyZXR1cm4gdD09PXZvaWQgMHx8dD09PVwiKlwiP246bmV3IFVSTCh0LG4pLmhyZWZ9X29uUnRzcCh0KXt0aGlzLl93YWl0aW5nPSExO2xldCBuPWh0KHQuZGF0YSksaT1Mcih0LmRhdGEpLG89UnIodC5kYXRhKTtpZihvPT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBleHBlY3RlZCBzZXF1ZW5jZSBudW1iZXJcIik7aWYodGhpcy5fY2FsbEhpc3Rvcnk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7bGV0IHM9dGhpcy5fY2FsbEhpc3Rvcnlbby0xXTtpZigoMCxrci5kZWZhdWx0KShcIm1zbDpydHNwOmluY29taW5nXCIpKGAke3QuZGF0YX1gKSwhdGhpcy5fc2Vzc2lvbklkJiYhaSl7dGhpcy5fc2Vzc2lvbklkPVRyKHQuZGF0YSk7bGV0IGE9Q3IodC5kYXRhKTthIT09bnVsbCYmKHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsIT09bnVsbCYmY2xlYXJJbnRlcnZhbCh0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCksdGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKCk9Pnt0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJPUFRJT05TXCJ9KSx0aGlzLl9kZXF1ZXVlKCl9LE1hdGgubWF4KFhjLGEtNSkqMWUzKSl9dGhpcy5fY29udGVudEJhc2V8fCh0aGlzLl9jb250ZW50QmFzZT1Ccih0LmRhdGEpKSx0aGlzLl9jb250ZW50TG9jYXRpb258fCh0aGlzLl9jb250ZW50TG9jYXRpb249TXIodC5kYXRhKSksbj49NDAwJiZ0aGlzLm9uRXJyb3ImJnRoaXMub25FcnJvcihuZXcgSXQodC5kYXRhLnRvU3RyaW5nKFwiYXNjaWlcIiksbikpLHM9PT1cIlBMQVlcIiYmdGhpcy5vblBsYXkmJnRoaXMub25QbGF5KElyKHQuZGF0YSkpLGkmJigoMCxrci5kZWZhdWx0KShcIm1zbDpydHNwOmluY29taW5nXCIpKGBSVFNQIFNlc3Npb24gJHt0aGlzLl9zZXNzaW9uSWR9IGVuZGVkIHdpdGggc3RhdHVzQ29kZTogJHtufWApLHRoaXMuX3Nlc3Npb25JZD1udWxsKSx0aGlzLl9kZXF1ZXVlKCl9X29uUnRjcCh0KXtpZih0aGlzLnQwPT09dm9pZCAwfHx0aGlzLm4wPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGludGVybmFsIGVycm9yXCIpO2lmKF9yKHQucnRjcCkpe2xldCBuPXQuY2hhbm5lbC0xO3RoaXMudDBbbl09dC5ydGNwLnJ0cFRpbWVzdGFtcCx0aGlzLm4wW25dPVByKHQucnRjcC5udHBNb3N0LHQucnRjcC5udHBMZWFzdCl9fV9vblJ0cCh0KXtpZih0aGlzLnQwPT09dm9pZCAwfHx0aGlzLm4wPT09dm9pZCAwfHx0aGlzLmNsb2NrcmF0ZXM9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7bGV0IG49dC5jaGFubmVsLGk9dGhpcy50MFtuXSxvPXRoaXMubjBbbl07aWYodHlwZW9mIGk8XCJ1XCImJnR5cGVvZiBvPFwidVwiKXtsZXQgcz10aGlzLmNsb2NrcmF0ZXNbbl0sdT1IKHQuZGF0YSktaXwwO3QubnRwVGltZXN0YW1wPXUvcyoxZTMrb319X29uU2RwKHQpe3RoaXMubjA9e30sdGhpcy50MD17fSx0aGlzLmNsb2NrcmF0ZXM9e30sdGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkw9dGhpcy5fY29udHJvbFVSTCh0LnNkcC5zZXNzaW9uLmNvbnRyb2wpLHQuc2RwLm1lZGlhLmZvckVhY2goKG4saSk9PntpZihuLnJ0cG1hcD09PXZvaWQgMClyZXR1cm47bGV0e2Nsb2NrcmF0ZTpvfT1uLnJ0cG1hcCxzPWkqMixhPXMrMSx1PW4uY29udHJvbD09PXZvaWQgMD90aGlzLl9zZXNzaW9uQ29udHJvbFVSTDp0aGlzLl9jb250cm9sVVJMKG4uY29udHJvbCk7dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiU0VUVVBcIixoZWFkZXJzOntUcmFuc3BvcnQ6XCJSVFAvQVZQL1RDUDt1bmljYXN0O2ludGVybGVhdmVkPVwiK3MrXCItXCIrYX0sdXJpOnV9KSx0aGlzLmNsb2NrcmF0ZXMhPT12b2lkIDAmJih0aGlzLmNsb2NrcmF0ZXNbc109byl9KSx0aGlzLl9zdGF0ZT09PVwicGxheWluZ1wiJiZ0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJQTEFZXCIsaGVhZGVyczp7UmFuZ2U6YG5wdD0ke3RoaXMuc3RhcnRUaW1lfHwwfS1gfSx1cmk6dGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkx9KSx0aGlzLl9kZXF1ZXVlKCl9cGxheSh0PTApe2lmKHRoaXMuX3N0YXRlPT09XCJpZGxlXCIpdGhpcy5zdGFydFRpbWU9TnVtYmVyKHQpfHwwLHRoaXMuX2VucXVldWUoe21ldGhvZDpcIk9QVElPTlNcIn0pLHRoaXMuX2VucXVldWUoe21ldGhvZDpcIkRFU0NSSUJFXCJ9KTtlbHNlIGlmKHRoaXMuX3N0YXRlPT09XCJwYXVzZWRcIil7aWYodGhpcy5fc2Vzc2lvbklkPT09bnVsbHx8dGhpcy5fc2Vzc2lvbklkPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGludGVybmFsIGVycm9yXCIpO3RoaXMuX2VucXVldWUoe21ldGhvZDpcIlBMQVlcIixoZWFkZXJzOntTZXNzaW9uOnRoaXMuX3Nlc3Npb25JZH0sdXJpOnRoaXMuX3Nlc3Npb25Db250cm9sVVJMfSl9dGhpcy5fc3RhdGU9XCJwbGF5aW5nXCIsdGhpcy5fZGVxdWV1ZSgpfXBhdXNlKCl7dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiUEFVU0VcIn0pLHRoaXMuX3N0YXRlPVwicGF1c2VkXCIsdGhpcy5fZGVxdWV1ZSgpfXN0b3AoKXt0aGlzLl9zZXNzaW9uSWQ/dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiVEVBUkRPV05cIn0pOnRoaXMuX2NhbGxTdGFjaz1bXSx0aGlzLl9zdGF0ZT1cImlkbGVcIix0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCE9PW51bGwmJihjbGVhckludGVydmFsKHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsKSx0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbD1udWxsKSx0aGlzLl9kZXF1ZXVlKCl9c2VuZCh0KXtsZXR7bWV0aG9kOm4saGVhZGVyczppLHVyaTpvfT10O2lmKG49PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBtZXRob2Qgd2hlbiBzZW5kIHJlcXVlc3RcIik7aWYodGhpcy5fd2FpdGluZz0hMCx0aGlzLnJldHJ5PXRoaXMuc2VuZC5iaW5kKHRoaXMsdCksdGhpcy5fc2VxdWVuY2U9PT12b2lkIDB8fHRoaXMuaGVhZGVycz09PXZvaWQgMHx8dGhpcy5fY2FsbEhpc3Rvcnk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7bGV0IHM9T2JqZWN0LmFzc2lnbih7dHlwZTo0LHVyaTpvfHx0aGlzLl9zZXNzaW9uQ29udHJvbFVSTCxkYXRhOkJ1ZmZlci5hbGxvYygwKX0se21ldGhvZDpuLGhlYWRlcnM6aX0se2hlYWRlcnM6T2JqZWN0LmFzc2lnbih7Q1NlcTp0aGlzLl9zZXF1ZW5jZSsrfSx0aGlzLmRlZmF1bHRIZWFkZXJzLHRoaXMuaGVhZGVyc1tuXSxpKX0pO3RoaXMuX3Nlc3Npb25JZCYmKHMuaGVhZGVycy5TZXNzaW9uPXRoaXMuX3Nlc3Npb25JZCksdGhpcy5fY2FsbEhpc3RvcnkucHVzaChuKSx0aGlzLl9vdXRnb2luZ0Nsb3NlZD8oMCxrci5kZWZhdWx0KShcIm1zbDpydHNwOm91dGdvaW5nXCIpKGBVbmFibGUgdG8gc2VuZCAke259LCBjb25uZWN0aW9uIGNsb3NlZGApOnRoaXMub3V0Z29pbmcucHVzaChzKX1fZW5xdWV1ZSh0KXtpZih0aGlzLl9jYWxsU3RhY2s9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7dGhpcy5fY2FsbFN0YWNrLnB1c2godCl9X2RlcXVldWUoKXtpZih0aGlzLl9jYWxsU3RhY2s9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7aWYoIXRoaXMuX3dhaXRpbmcmJnRoaXMuX2NhbGxTdGFjay5sZW5ndGg+MCl7bGV0IHQ9dGhpcy5fY2FsbFN0YWNrLnNoaWZ0KCk7dCE9PXZvaWQgMCYmdGhpcy5zZW5kKHQpfX19O2MoKTt2YXIgVXI9QyhsZSgpKTt2YXIgRHI9QyhOKCkpO2MoKTt2YXIgUWM9MTAwMDcsWmM9KHI9d2luZG93LmxvY2F0aW9uLmhvc3QsZT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpPT4oe3VyaTpgJHtlPT09XCJodHRwczpcIj9cIndzczpcIjpcIndzOlwifS8vJHtyfS9ydHNwLW92ZXItd2Vic29ja2V0YCx0b2tlblVyaTpgJHtlfS8vJHtyfS9heGlzLWNnaS9ydHNwd3NzZXNzaW9uLmNnaWAscHJvdG9jb2w6XCJiaW5hcnlcIix0aW1lb3V0OlFjfSksdGE9YXN5bmMocj17fSk9PntsZXR7dXJpOmUsdG9rZW5Vcmk6dCxwcm90b2NvbDpuLHRpbWVvdXQ6aX09Z3QoWmMoci5ob3N0LHIuc2NoZW1lKSxyKTtpZihlPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIndzOiBpbnRlcm5hbCBlcnJvclwiKTtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKG8scyk9Pnt0cnl7bGV0IGE9bmV3IFdlYlNvY2tldChlLG4pLHU9c2V0VGltZW91dCgoKT0+e2NsZWFyVGltZW91dCh1KSxhLnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuQ09OTkVDVElORyYmKGEub25lcnJvcj1udWxsLHMobmV3IEVycm9yKFwid2Vic29ja2V0IGNvbm5lY3Rpb24gdGltZWQgb3V0XCIpKSl9LGkpO2EuYmluYXJ5VHlwZT1cImFycmF5YnVmZmVyXCIsYS5vbmVycm9yPWY9PntjbGVhclRpbWVvdXQodSk7ZnVuY3Rpb24gbCgpe2lmKHRoaXMuc3RhdHVzPj00MDApe2NvbnNvbGUud2FybihcImZhaWxlZCB0byBsb2FkIHRva2VuXCIsdGhpcy5zdGF0dXMsdGhpcy5yZXNwb25zZVRleHQpLHMoZik7cmV0dXJufWxldCBoPXRoaXMucmVzcG9uc2VUZXh0LnRyaW0oKSxtPWAke2V9P3J0c3B3c3Nlc3Npb249JHtofWAsYj1uZXcgV2ViU29ja2V0KG0sbik7Yi5iaW5hcnlUeXBlPVwiYXJyYXlidWZmZXJcIixiLm9uZXJyb3I9eT0+e3MoeSl9LGIub25vcGVuPSgpPT5vKGIpfWxldCBkPW5ldyBYTUxIdHRwUmVxdWVzdDtkLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsbCksZC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIixoPT57Y29uc29sZS53YXJuKFwiZmFpbGVkIHRvIGdldCB0b2tlblwiKSxzKGgpfSksZC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwoKT0+cyhmKSksZC5vcGVuKFwiR0VUXCIsYCR7dH0/JHtEYXRlLm5vdygpfWApO3RyeXtkLnNlbmQoKX1jYXRjaHtzKGYpfX0sYS5vbm9wZW49KCk9PntjbGVhclRpbWVvdXQodSksbyhhKX19Y2F0Y2goYSl7cyhhKX19KX07dmFyIGVsPTEwMDEsRz1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodCl7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJzb2NrZXQgYXJndW1lbnQgbWlzc2luZ1wiKTtsZXQgbj1uZXcgRHIuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZDpmdW5jdGlvbigpe319KTt0Lm9ubWVzc2FnZT1vPT57bGV0IHM9QnVmZmVyLmZyb20oby5kYXRhKTtuLnB1c2goe2RhdGE6cyx0eXBlOjF9KXx8dC5yZWFkeVN0YXRlPT09V2ViU29ja2V0Lk9QRU4mJigoMCxVci5kZWZhdWx0KShcIm1zbDp3ZWJzb2NrZXQ6aW5jb21pbmdcIikoXCJkb3duc3RyZWFtIGZyb3plblwiKSx0LmNsb3NlKCkpfSxuLm9uKFwiZXJyb3JcIixvPT57Y29uc29sZS53YXJuKFwiY2xvc2luZyBzb2NrZXQgZHVlIHRvIGluY29taW5nIGVycm9yXCIsbyksdC5jbG9zZSgpfSk7bGV0IGk9bmV3IERyLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwLHdyaXRlOmZ1bmN0aW9uKG8scyxhKXt0cnl7dC5zZW5kKG8uZGF0YSl9Y2F0Y2h7Y29uc29sZS53YXJuKFwibWVzc2FnZSBsb3N0IGR1cmluZyBzZW5kOlwiLG8pfWEoKX19KTtpLm9uKFwiZXJyb3JcIixvPT57Y29uc29sZS53YXJuKFwiZXJyb3IgZHVyaW5nIHdlYnNvY2tldCBzZW5kLCBpZ25vcmluZzpcIixvKX0pLGkub24oXCJmaW5pc2hcIiwoKT0+eygwLFVyLmRlZmF1bHQpKFwibXNsOndlYnNvY2tldDpvdXRnb2luZ1wiKShcImZpbmlzaFwiKSx0LnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuQ0xPU0VEJiZ0LmNsb3NlKCl9KSx0Lm9uY2xvc2U9bz0+eygwLFVyLmRlZmF1bHQpKFwibXNsOndlYnNvY2tldDpjbG9zZVwiKShgJHtvLmNvZGV9YCksby5jb2RlPT09ZWwmJnRoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCksbi5wdXNoKG51bGwpLGkuZW5kKCl9O3N1cGVyKG4saSl9c3RhdGljIGFzeW5jIG9wZW4odCl7cmV0dXJuIGF3YWl0IHRhKHQpLnRoZW4obj0+bmV3IEcobikpfX07dmFyIG5pPXt9O1B0KG5pLHtIdG1sNUNhbnZhc1BpcGVsaW5lOigpPT5IcixIdG1sNVZpZGVvTWV0YWRhdGFQaXBlbGluZTooKT0+cXIsSHRtbDVWaWRlb1BpcGVsaW5lOigpPT5fdCxIdHRwTXNlUGlwZWxpbmU6KCk9PkdyLE1ldGFkYXRhUGlwZWxpbmU6KCk9PmpyLFBpcGVsaW5lOigpPT5CZSxSdHNwTWpwZWdQaXBlbGluZTooKT0+eHQsUnRzcE1wNFBpcGVsaW5lOigpPT5idCxSdHNwUGlwZWxpbmU6KCk9PmVlLFdzU2RwUGlwZWxpbmU6KCk9PldyfSk7YygpO2MoKTt2YXIgQmU9Y2xhc3N7Y29uc3RydWN0b3IoLi4uZSl7bGV0W3QsLi4ubl09ZTt0aGlzLl9zZXQ9bmV3IFNldChlKSx0aGlzLmZpcnN0Q29tcG9uZW50PXQsdGhpcy5sYXN0Q29tcG9uZW50PW4ucmVkdWNlKChpLG8pPT5pLmNvbm5lY3QobyksdCl9aW5pdCguLi5lKXtsZXRbdCwuLi5uXT1lO3RoaXMuX3NldD1uZXcgU2V0KGUpLHRoaXMuZmlyc3RDb21wb25lbnQ9dCx0aGlzLmxhc3RDb21wb25lbnQ9bi5yZWR1Y2UoKGksbyk9PmkuY29ubmVjdChvKSx0KX1pbnNlcnRBZnRlcihlLHQpe2lmKCF0aGlzLl9zZXQuaGFzKGUpKXRocm93IG5ldyBFcnJvcihcImluc2VydGlvbiBwb2ludCBub3QgcGFydCBvZiBwaXBlbGluZVwiKTtpZih0aGlzLl9zZXQuaGFzKHQpKXRocm93IG5ldyBFcnJvcihcIm5ldyBjb21wb25lbnQgYWxyZWFkeSBpbiB0aGUgcGlwZWxpbmVcIik7bGV0IG49ZS5uZXh0O3JldHVybiBuPT09bnVsbD8oZS5jb25uZWN0KHQpLHRoaXMubGFzdENvbXBvbmVudD10KTooZS5kaXNjb25uZWN0KCksZS5jb25uZWN0KHQpLmNvbm5lY3QobikpLHRoaXMuX3NldC5hZGQodCksdGhpc31pbnNlcnRCZWZvcmUoZSx0KXtpZighdGhpcy5fc2V0LmhhcyhlKSl0aHJvdyBuZXcgRXJyb3IoXCJpbnNlcnRpb24gcG9pbnQgbm90IHBhcnQgb2YgcGlwZWxpbmVcIik7aWYodGhpcy5fc2V0Lmhhcyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJuZXcgY29tcG9uZW50IGFscmVhZHkgaW4gdGhlIHBpcGVsaW5lXCIpO2xldCBuPWUucHJldjtyZXR1cm4gbj09PW51bGw/KHQuY29ubmVjdChlKSx0aGlzLmZpcnN0Q29tcG9uZW50PXQpOihuLmRpc2Nvbm5lY3QoKSxuLmNvbm5lY3QodCkuY29ubmVjdChlKSksdGhpcy5fc2V0LmFkZCh0KSx0aGlzfXJlbW92ZShlKXtpZighdGhpcy5fc2V0LmhhcyhlKSl0aHJvdyBuZXcgRXJyb3IoXCJjb21wb25lbnQgbm90IHBhcnQgb2YgcGlwZWxpbmVcIik7bGV0IHQ9ZS5wcmV2LG49ZS5uZXh0O2lmKHQ9PT1udWxsJiZuPT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3QgcmVtb3ZlIGxhc3QgY29tcG9uZW50XCIpO3JldHVybiB0PT09bnVsbCYmbiE9PW51bGw/KGUuZGlzY29ubmVjdCgpLHRoaXMuZmlyc3RDb21wb25lbnQ9bik6dCE9PW51bGwmJm49PT1udWxsPyh0LmRpc2Nvbm5lY3QoKSx0aGlzLmxhc3RDb21wb25lbnQ9dCk6dCE9PW51bGwmJm4hPT1udWxsJiYodC5kaXNjb25uZWN0KCksZS5kaXNjb25uZWN0KCksdC5jb25uZWN0KG4pKSx0aGlzLl9zZXQuZGVsZXRlKGUpLHRoaXN9YXBwZW5kKC4uLmUpe3JldHVybiBlLmZvckVhY2godD0+e3RoaXMuaW5zZXJ0QWZ0ZXIodGhpcy5sYXN0Q29tcG9uZW50LHQpfSksdGhpc31wcmVwZW5kKC4uLmUpe3JldHVybiBlLmZvckVhY2godD0+e3RoaXMuaW5zZXJ0QmVmb3JlKHRoaXMuZmlyc3RDb21wb25lbnQsdCl9KSx0aGlzfX07YygpO3ZhciBlZT1jbGFzcyBleHRlbmRzIEJle2NvbnN0cnVjdG9yKHQpe2xldCBuPW5ldyBtdCxpPW5ldyB5dCh0KTtpLm9uU2RwPW89Pnt0aGlzLm9uU2RwJiZ0aGlzLm9uU2RwKG8pfSxpLm9uUGxheT1vPT57dGhpcy5vblBsYXkmJnRoaXMub25QbGF5KG8pfTtzdXBlcihuLGkpO3RoaXMucnRzcD1pfX07YygpO3ZhciBidD1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO2xldCBuPW5ldyBjdCxpPW5ldyBvdCxvPW5ldyBwdDtvLm9uU3luYz1zPT57dGhpcy5vblN5bmMmJnRoaXMub25TeW5jKHMpfSx0aGlzLmFwcGVuZChuLGksbyksdGhpcy5fbXA0TXV4ZXI9b31nZXQgYml0cmF0ZSgpe3JldHVybiB0aGlzLl9tcDRNdXhlci5iaXRyYXRlfWdldCBmcmFtZXJhdGUoKXtyZXR1cm4gdGhpcy5fbXA0TXV4ZXIuZnJhbWVyYXRlfX07YygpO3ZhciB4dD1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2xldCB0PW5ldyBsdDt0aGlzLmFwcGVuZCh0KX19O2MoKTtjKCk7YygpO3ZhciBNZT1DKG5hKCkpLE5yPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLm5jPSgpPT4oKyt0aGlzLmNvdW50LHRoaXMuY291bnQudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsXCIwXCIpKTt0aGlzLmNub25jZT0oKT0+bmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMjU2KSkubWFwKGU9PmUudG9TdHJpbmcoMTYpKS5qb2luKFwiXCIpO3RoaXMuaGExPWU9PntsZXQgdD10aGlzLmhhMUJhc2U7cmV0dXJuIHRoaXMuYWxnb3JpdGhtPT09XCJtZDUtc2Vzc1wiJiYodD1uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke3R9OiR7dGhpcy5ub25jZX06JHtlfWApLmVuZCgpLnRvU3RyaW5nKCkpLHR9O3RoaXMuaGEyPShlLHQsbj1cIlwiKT0+e2xldCBpPW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7ZX06JHt0fWApLmVuZCgpLnRvU3RyaW5nKCk7aWYodGhpcy5hbGdvcml0aG09PT1cIm1kNS1zZXNzXCIpe2xldCBvPW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIobikuZW5kKCkudG9TdHJpbmcoKTtpPW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7ZX06JHt0fToke299YCkuZW5kKCkudG9TdHJpbmcoKX1yZXR1cm4gaX07dGhpcy5hdXRob3JpemF0aW9uPShlPVwiR0VUXCIsdD1cIlwiLG4pPT57bGV0IGk9dGhpcy5uYygpLG89dGhpcy5jbm9uY2UoKSxzPXRoaXMuaGExKG8pLGE9dGhpcy5oYTIoZSx0LG4pLHU9dGhpcy5xb3A9PT12b2lkIDA/bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtzfToke3RoaXMubm9uY2V9OiR7YX1gKS5lbmQoKS50b1N0cmluZygpOm5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7c306JHt0aGlzLm5vbmNlfToke2l9OiR7b306JHt0aGlzLnFvcH06JHthfWApLmVuZCgpLnRvU3RyaW5nKCksZj1bXTtyZXR1cm4gZi5wdXNoKGB1c2VybmFtZT1cIiR7dGhpcy51c2VybmFtZX1cImApLGYucHVzaChgcmVhbG09XCIke3RoaXMucmVhbG19XCJgKSxmLnB1c2goYG5vbmNlPVwiJHt0aGlzLm5vbmNlfVwiYCksZi5wdXNoKGB1cmk9XCIke3R9XCJgKSx0aGlzLnFvcCE9PXZvaWQgMCYmKGYucHVzaChgcW9wPSR7dGhpcy5xb3B9YCksZi5wdXNoKGBuYz0ke2l9YCksZi5wdXNoKGBjbm9uY2U9XCIke299XCJgKSksZi5wdXNoKGByZXNwb25zZT1cIiR7dX1cImApLHRoaXMub3BhcXVlIT09dm9pZCAwJiZmLnB1c2goYG9wYXF1ZT1cIiR7dGhpcy5vcGFxdWV9XCJgKSxgRGlnZXN0ICR7Zi5qb2luKFwiLCBcIil9YH07bGV0IGk9ZS5nZXQoXCJyZWFsbVwiKTtpZihpPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIm5vIHJlYWxtIGluIGRpZ2VzdCBjaGFsbGVuZ2VcIik7dGhpcy5yZWFsbT1pLHRoaXMuaGExQmFzZT1uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke3R9OiR7aX06JHtufWApLmVuZCgpLnRvU3RyaW5nKCk7bGV0IG89ZS5nZXQoXCJub25jZVwiKTtpZihvPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIm5vIG5vbmNlIGluIGRpZ2VzdCBjaGFsbGVuZ2VcIik7dGhpcy5ub25jZT1vLHRoaXMub3BhcXVlPWUuZ2V0KFwib3BhcXVlXCIpO2xldCBzPWUuZ2V0KFwiYWxnb3JpdGhtXCIpO3MhPT12b2lkIDA/cz09PVwibWQ1XCI/dGhpcy5hbGdvcml0aG09XCJtZDVcIjpzPT09XCJtZDUtc2Vzc1wiJiYodGhpcy5hbGdvcml0aG09XCJtZDUtc2Vzc1wiKTp0aGlzLmFsZ29yaXRobT1cIm1kNVwiO2xldCBhPWUuZ2V0KFwicW9wXCIpO2lmKGEhPT12b2lkIDApe2xldCB1PWEuc3BsaXQoXCIsXCIpLm1hcChmPT5mLnRyaW0oKSk7dS5zb21lKGY9PmY9PT1cImF1dGhcIik/dGhpcy5xb3A9XCJhdXRoXCI6dS5zb21lKGY9PmY9PT1cImF1dGgtaW50XCIpJiYodGhpcy5xb3A9XCJhdXRoLWludFwiKX10aGlzLmNvdW50PTAsdGhpcy51c2VybmFtZT10fX07YygpO3ZhciBpYT1yPT57bGV0WyxlLC4uLnRdPXIuc3BsaXQoXCIgXCIpLG49W10saT0vXFxzKihbXj1dKyk9XCIoW15cIl0qKVwiLD8vZ20sbztkbyBpZihvPWkuZXhlYyh0LmpvaW4oXCIgXCIpKSxvIT09bnVsbCl7bGV0WyxhLHVdPW87bi5wdXNoKFthLHVdKX13aGlsZShvIT09bnVsbCk7bGV0IHM9bmV3IE1hcChuKTtyZXR1cm57dHlwZTplLnRvTG93ZXJDYXNlKCkscGFyYW1zOnN9fTt2YXIgdGw9NDAxLHJsPXt1c2VybmFtZTpcInJvb3RcIixwYXNzd29yZDpcInBhc3NcIn0sTGU9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKGU9e30pe2xldHt1c2VybmFtZTp0LHBhc3N3b3JkOm59PWd0KHJsLGUpO2lmKHQ9PT12b2lkIDB8fG49PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibmVlZCB1c2VybmFtZSBhbmQgcGFzc3dvcmRcIik7bGV0IGksbyxzPXllKGZ1bmN0aW9uKHUsZixsKXt1LnR5cGU9PT00JiYoaT11LG8mJnUuaGVhZGVycyYmKHUuaGVhZGVycy5BdXRob3JpemF0aW9uPW8pKSxsKHZvaWQgMCx1KX0pLGE9eWUoZnVuY3Rpb24odSxmLGwpe2lmKHUudHlwZT09PTQmJmh0KHUuZGF0YSk9PT10bCl7bGV0IGg9dS5kYXRhLnRvU3RyaW5nKCkuc3BsaXQoYFxuYCkuZmluZChiPT4vV1dXLUF1dGgvaS50ZXN0KGIpKTtpZihoPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCBmaW5kIFdXVy1BdXRoZW50aWNhdGUgaGVhZGVyXCIpO2xldCBtPWlhKGgpO2lmKG0udHlwZT09PVwiYmFzaWNcIilvPVwiQmFzaWMgXCIrQnVmZmVyLmZyb20odCtcIjpcIituKS50b1N0cmluZyhcImJhc2U2NFwiKTtlbHNlIGlmKG0udHlwZT09PVwiZGlnZXN0XCIpbz1uZXcgTnIobS5wYXJhbXMsdCxuKS5hdXRob3JpemF0aW9uKGkubWV0aG9kLGkudXJpKTtlbHNlIHJldHVybjtzLndyaXRlKGksKCk9PmwoKSl9ZWxzZSBsKHZvaWQgMCx1KX0pO3N1cGVyKGEscyl9fTt2YXIgSHI9Y2xhc3MgZXh0ZW5kcyB4dHtjb25zdHJ1Y3Rvcih0KXtsZXR7d3M6bixydHNwOmksbWVkaWFFbGVtZW50Om8sYXV0aDpzfT10O3N1cGVyKGkpO2lmKHMpe2xldCBmPW5ldyBMZShzKTt0aGlzLmluc2VydEJlZm9yZSh0aGlzLnJ0c3AsZil9bGV0IGE9bmV3IHN0KG8pO2Eub25DYW5wbGF5PSgpPT57YS5wbGF5KCksdGhpcy5vbkNhbnBsYXkmJnRoaXMub25DYW5wbGF5KCl9LGEub25TeW5jPWY9Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMoZil9LHRoaXMuYXBwZW5kKGEpLHRoaXMuX3Npbms9YTtsZXQgdT1HLm9wZW4obik7dGhpcy5yZWFkeT11LnRoZW4oZj0+e2Yub25TZXJ2ZXJDbG9zZT0oKT0+e3RoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCl9LHRoaXMucHJlcGVuZChmKSx0aGlzLl9zcmM9Zn0pfWNsb3NlKCl7dGhpcy5fc3JjJiZ0aGlzLl9zcmMub3V0Z29pbmcuZW5kKCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX3NpbmsuY3VycmVudFRpbWV9cGxheSgpe3JldHVybiB0aGlzLl9zaW5rLnBsYXkoKX1wYXVzZSgpe3JldHVybiB0aGlzLl9zaW5rLnBhdXNlKCl9Z2V0IGJpdHJhdGUoKXtyZXR1cm4gdGhpcy5fc2luay5iaXRyYXRlfWdldCBmcmFtZXJhdGUoKXtyZXR1cm4gdGhpcy5fc2luay5mcmFtZXJhdGV9fTtjKCk7dmFyIF90PWNsYXNzIGV4dGVuZHMgYnR7Y29uc3RydWN0b3IodCl7bGV0e3dzOm4scnRzcDppLG1lZGlhRWxlbWVudDpvLGF1dGg6c309dDtzdXBlcihpKTtpZihzKXtsZXQgZj1uZXcgTGUocyk7dGhpcy5pbnNlcnRCZWZvcmUodGhpcy5ydHNwLGYpfWxldCBhPW5ldyBUZShvKTthLm9uU291cmNlT3Blbj0oZixsKT0+e3RoaXMudHJhY2tzPWwsdGhpcy5vblNvdXJjZU9wZW4mJnRoaXMub25Tb3VyY2VPcGVuKGYsbCl9LHRoaXMuYXBwZW5kKGEpLHRoaXMuX3Npbms9YTtsZXQgdT1HLm9wZW4obik7dGhpcy5yZWFkeT11LnRoZW4oZj0+e2Yub25TZXJ2ZXJDbG9zZT0oKT0+e3RoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCl9LHRoaXMucHJlcGVuZChmKSx0aGlzLl9zcmM9Zn0pfWNsb3NlKCl7dGhpcy5fc3JjJiZ0aGlzLl9zcmMub3V0Z29pbmcuZW5kKCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX3NpbmsuY3VycmVudFRpbWV9YXN5bmMgcGxheSgpe3JldHVybiBhd2FpdCB0aGlzLl9zaW5rLnBsYXkoKX1wYXVzZSgpe3JldHVybiB0aGlzLl9zaW5rLnBhdXNlKCl9fTtjKCk7dmFyIHFyPWNsYXNzIGV4dGVuZHMgX3R7Y29uc3RydWN0b3IoZSl7bGV0e21ldGFkYXRhSGFuZGxlcjp0fT1lO3N1cGVyKGUpO2xldCBuPW5ldyBDZTt0aGlzLmluc2VydEFmdGVyKHRoaXMucnRzcCxuKTtsZXQgaT1SLmZyb21IYW5kbGVycyhvPT57by50eXBlPT09OSYmdChvKX0sdm9pZCAwKTt0aGlzLmluc2VydEFmdGVyKG4saSl9fTtjKCk7dmFyIG5sPXtwYXJhbWV0ZXJzOltcImF1ZGlvPTBcIixcInZpZGVvPTBcIixcImV2ZW50PW9uXCIsXCJwdHo9YWxsXCJdfSxqcj1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQpe2xldHt3czpuLHJ0c3A6aSxtZXRhZGF0YUhhbmRsZXI6b309dDtzdXBlcihPYmplY3QuYXNzaWduKHt9LG5sLGkpKTtsZXQgcz1uZXcgQ2U7dGhpcy5hcHBlbmQocyk7bGV0IGE9US5mcm9tSGFuZGxlcihmPT57Zi50eXBlPT09OSYmbyhmKX0pO3RoaXMuYXBwZW5kKGEpO2xldCB1PUcub3BlbihuKTt0aGlzLnJlYWR5PXUudGhlbihmPT57Zi5vblNlcnZlckNsb3NlPSgpPT57dGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKX0sdGhpcy5wcmVwZW5kKGYpLHRoaXMuX3NyYz1mfSl9Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5vdXRnb2luZy5lbmQoKX19O2MoKTt2YXIgV3I9Y2xhc3MgZXh0ZW5kcyBlZXtjb25zdHJ1Y3Rvcih0KXtsZXR7d3M6bixydHNwOmksYXV0aDpvfT10O3N1cGVyKGkpO2lmKG8pe2xldCBhPW5ldyBMZShvKTt0aGlzLmluc2VydEJlZm9yZSh0aGlzLnJ0c3AsYSl9bGV0IHM9Ry5vcGVuKG4pO3RoaXMucmVhZHk9cy50aGVuKGE9PnthLm9uU2VydmVyQ2xvc2U9KCk9Pnt0aGlzLm9uU2VydmVyQ2xvc2UmJnRoaXMub25TZXJ2ZXJDbG9zZSgpfSx0aGlzLnByZXBlbmQoYSksdGhpcy5fc3JjPWF9KX1jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLm91dGdvaW5nLmVuZCgpfWdldCBzZHAoKXtyZXR1cm4gdGhpcy5yZWFkeS50aGVuKGFzeW5jKCk9PntsZXQgdD1uZXcgUHJvbWlzZShuPT57dGhpcy5ydHNwLm9uU2RwPW59KTtyZXR1cm4gdGhpcy5ydHNwLnNlbmQoe21ldGhvZDpcIkRFU0NSSUJFXCJ9KSx0aGlzLnJ0c3Auc2VuZCh7bWV0aG9kOlwiVEVBUkRPV05cIn0pLGF3YWl0IHR9KX19O2MoKTtjKCk7dmFyIG9hPUMobGUoKSk7dmFyIHNhPUMoTigpKTt2YXIgcmk9KDAsb2EuZGVmYXVsdCkoXCJtc2w6aHR0cC1tcDRcIiksJHI9Y2xhc3MgZXh0ZW5kcyBWe2NvbnN0cnVjdG9yKHQpe2xldHt1cmk6bixvcHRpb25zOml9PXQsbz1uZXcgc2EuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZDpmdW5jdGlvbigpe319KTtvLm9uKFwiZXJyb3JcIixzPT57Y29uc29sZS53YXJuKFwiY2xvc2luZyBzb2NrZXQgZHVlIHRvIGluY29taW5nIGVycm9yXCIscyksdGhpcy5fcmVhZGVyJiZ0aGlzLl9yZWFkZXIuY2FuY2VsKCl9KTtzdXBlcihvKTtvLl9yZWFkPSgpPT57dGhpcy5fcHVsbCgpfSx0aGlzLnVyaT1uLHRoaXMub3B0aW9ucz1pLHRoaXMuX2FsbERvbmU9ITF9cGxheSgpe2lmKHRoaXMudXJpPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCBzdGFydCBwbGF5aW5nIHdoZW4gdGhlcmUgaXMgbm8gVVJJXCIpO3RoaXMuX2Fib3J0Q29udHJvbGxlcj1uZXcgQWJvcnRDb250cm9sbGVyLHRoaXMubGVuZ3RoPTAsZmV0Y2godGhpcy51cmkse2NyZWRlbnRpYWxzOlwiaW5jbHVkZVwiLHNpZ25hbDp0aGlzLl9hYm9ydENvbnRyb2xsZXIuc2lnbmFsLC4uLnRoaXMub3B0aW9uc30pLnRoZW4odD0+e2lmKHQuYm9keT09PW51bGwpdGhyb3cgbmV3IEVycm9yKFwiZW1wdHkgcmVzcG9uc2UgYm9keVwiKTtsZXQgbj10LmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpO3RoaXMuaW5jb21pbmcucHVzaCh7ZGF0YTpCdWZmZXIuYWxsb2MoMCksdHlwZTo4LG1pbWU6bn0pLHRoaXMub25IZWFkZXJzJiZ0aGlzLm9uSGVhZGVycyh0LmhlYWRlcnMpLHRoaXMuX3JlYWRlcj10LmJvZHkuZ2V0UmVhZGVyKCksdGhpcy5fcHVsbCgpfSkuY2F0Y2godD0+e2NvbnNvbGUuZXJyb3IoXCJodHRwLXNvdXJjZTogZmV0Y2ggZmFpbGVkOiBcIix0KX0pfWFib3J0KCl7dGhpcy5fcmVhZGVyJiZ0aGlzLl9yZWFkZXIuY2FuY2VsKCkuY2F0Y2godD0+e2NvbnNvbGUubG9nKFwiaHR0cC1zb3VyY2U6IGNhbmNlbCByZWFkZXIgZmFpbGVkOiBcIix0KX0pLHRoaXMuX2Fib3J0Q29udHJvbGxlciYmdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCl9X2lzQ2xvc2VkKCl7cmV0dXJuIHRoaXMuX2FsbERvbmV9X2Nsb3NlKCl7dGhpcy5fcmVhZGVyPXZvaWQgMCx0aGlzLl9hbGxEb25lPSEwLHRoaXMuaW5jb21pbmcucHVzaChudWxsKSx0aGlzLm9uU2VydmVyQ2xvc2U/LigpfV9wdWxsKCl7dGhpcy5fcmVhZGVyIT09dm9pZCAwJiZ0aGlzLl9yZWFkZXIucmVhZCgpLnRoZW4oKHtkb25lOnQsdmFsdWU6bn0pPT57aWYodCl7dGhpcy5faXNDbG9zZWQoKXx8KHJpKFwiZmV0Y2ggY29tcGxldGVkLCB0b3RhbCBkb3dubG9hZGVkOiBcIix0aGlzLmxlbmd0aCxcIiBieXRlc1wiKSx0aGlzLl9jbG9zZSgpKTtyZXR1cm59aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCB2YWx1ZSB0byBiZSBkZWZpbmVkXCIpO2lmKHRoaXMubGVuZ3RoPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIGxlbmd0aCB0byBiZSBkZWZpbmVkXCIpO3RoaXMubGVuZ3RoKz1uLmxlbmd0aDtsZXQgaT1CdWZmZXIuZnJvbShuKTt0aGlzLmluY29taW5nLnB1c2goe2RhdGE6aSx0eXBlOjh9KT90aGlzLl9wdWxsKCk6cmkoXCJkb3duc3RyZWFtIGJhY2sgcHJlc3N1cmU6IHBhdXNpbmcgcmVhZFwiKX0pLmNhdGNoKHQ9PntyaShcImh0dHAtc291cmNlOiByZWFkIGZhaWxlZDogXCIsdCksdGhpcy5faXNDbG9zZWQoKXx8dGhpcy5fY2xvc2UoKX0pfX07dmFyIEdyPWNsYXNzIGV4dGVuZHMgQmV7Y29uc3RydWN0b3IodCl7bGV0e2h0dHA6bixtZWRpYUVsZW1lbnQ6aX09dCxvPW5ldyAkcihuKSxzPW5ldyBUZShpKTtvLm9uSGVhZGVycz1hPT57dGhpcy5vbkhlYWRlcnMmJnRoaXMub25IZWFkZXJzKGEpfSxvLm9uU2VydmVyQ2xvc2U9KCk9PnRoaXMub25TZXJ2ZXJDbG9zZT8uKCk7c3VwZXIobyxzKTt0aGlzLl9zcmM9byx0aGlzLl9zaW5rPXMsdGhpcy5odHRwPW99Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5hYm9ydCgpfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl9zaW5rLmN1cnJlbnRUaW1lfWFzeW5jIHBsYXkoKXtyZXR1cm4gYXdhaXQgdGhpcy5fc2luay5wbGF5KCl9cGF1c2UoKXtyZXR1cm4gdGhpcy5fc2luay5wYXVzZSgpfX07dmFyIGlpPXt9O1B0KGlpLHtSVENQUGFja2V0VHlwZTooKT0+S24sU0RFU0l0ZW06KCk9PkpuLFNSOigpPT5IcyxTY2hlZHVsZXI6KCk9PldlLGFkZFJUU1BSZXRyeTooKT0+YWEsYm9keU9mZnNldDooKT0+QXIsY1NyYzooKT0+bnMsY1NyY0NvdW50OigpPT5TZSxjb25uZWN0aW9uRW5kZWQ6KCk9PkxyLGNvbnRlbnRCYXNlOigpPT5Ccixjb250ZW50TG9jYXRpb246KCk9Pk1yLGV4dEhlYWRlcjooKT0+aXMsZXh0SGVhZGVyTGVuZ3RoOigpPT5NdCxleHRlbnNpb246KCk9Pm9yLGV4dHJhY3RIZWFkZXJWYWx1ZTooKT0+cmUsZXh0cmFjdFVSSXM6KCk9PkpzLGdldFRpbWU6KCk9PlByLGlzUnRjcEFwcDooKT0+JHMsaXNSdGNwQnllOigpPT53cixpc1J0Y3BSUjooKT0+anMsaXNSdGNwU0RFUzooKT0+V3MsaXNSdGNwU1I6KCk9Pl9yLG1hcmtlcjooKT0+Y2UsbWVzc2FnZUZyb21CdWZmZXI6KCk9PlNyLHBhZGRpbmc6KCk9PmVzLHBhcnNlOigpPT5RbixwYXJzZVJ0Y3A6KCk9PlhuLHBheWxvYWQ6KCk9PloscGF5bG9hZFR5cGU6KCk9Pk8scmFuZ2U6KCk9PklyLHJ0Y3BNZXNzYWdlRnJvbUJ1ZmZlcjooKT0+eHIsc1NyYzooKT0+cnMsc2VxdWVuY2U6KCk9PlJyLHNlcXVlbmNlTnVtYmVyOigpPT50cyxzZXNzaW9uSWQ6KCk9PlRyLHNlc3Npb25UaW1lb3V0OigpPT5DcixzdGF0dXNDb2RlOigpPT5odCx0aW1lc3RhbXA6KCk9PkgsdmVyc2lvbjooKT0+Wm99KTtjKCk7YygpO2MoKTt2YXIgYWE9KHIse21heFJldHJpZXM6ZSxlcnJvcnM6dH09e21heFJldHJpZXM6MjAsZXJyb3JzOls1MDNdfSk9PntsZXQgbj0wLGk9ci5vbkVycm9yO3Iub25FcnJvcj1vPT57aWYoaT8uKG8pLCEhdC5pbmNsdWRlcyhvLmNvZGUpKXtpZigobis9MSk+ZSl7Y29uc29sZS5sb2coXCJyZXRyeSwgdG9vIG1hbnlcIixuLGUpO3JldHVybn1zZXRUaW1lb3V0KCgpPT5yLnJldHJ5Py4oKSxuKjEwMCl9fX07XG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmNqcy5qcy5tYXBcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbnZhciBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0geyBfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICE9IG51bGwgJiZcbiAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKClcbiAgaWYgKHZhbHVlT2YgIT0gbnVsbCAmJiB2YWx1ZU9mICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB2YXIgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoXG4gICAgKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICApXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcbkJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbkJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IGJ1Zi53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgYnVmID0gYnVmLnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgdmFyIGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgYnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0IChvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoaXNJbnN0YW5jZShidWYsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBidWYgPSBCdWZmZXIuZnJvbShidWYpXG4gICAgfVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IGlzSW5zdGFuY2Uoc3RyaW5nLCBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc3RyaW5nXG4gICAgKVxuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpXG4gIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIH1cbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nXG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKClcbiAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aClcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldClcbiAgICApXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0IC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKVxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFVzZSBidWlsdC1pbiB3aGVuIGF2YWlsYWJsZSwgbWlzc2luZyBmcm9tIElFMTFcbiAgICB0aGlzLmNvcHlXaXRoaW4odGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpXG4gIH0gZWxzZSBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdXG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gICAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuY29tcGFyZVZlcnNpb25zID0ge30pKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbiAgICBjb25zdCBzZW12ZXIgPSAvXlt2Xn48Pj1dKj8oXFxkKykoPzpcXC4oW3gqXXxcXGQrKSg/OlxcLihbeCpdfFxcZCspKD86XFwuKFt4Kl18XFxkKykpPyg/Oi0oW1xcZGEtelxcLV0rKD86XFwuW1xcZGEtelxcLV0rKSopKT8oPzpcXCtbXFxkYS16XFwtXSsoPzpcXC5bXFxkYS16XFwtXSspKik/KT8pPyQvaTtcbiAgICBjb25zdCB2YWxpZGF0ZUFuZFBhcnNlID0gKHZlcnNpb24pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudCBleHBlY3RlZCBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaCA9IHZlcnNpb24ubWF0Y2goc2VtdmVyKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50IG5vdCB2YWxpZCBzZW12ZXIgKCcke3ZlcnNpb259JyByZWNlaXZlZClgKTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaC5zaGlmdCgpO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfTtcbiAgICBjb25zdCBpc1dpbGRjYXJkID0gKHMpID0+IHMgPT09ICcqJyB8fCBzID09PSAneCcgfHwgcyA9PT0gJ1gnO1xuICAgIGNvbnN0IHRyeVBhcnNlID0gKHYpID0+IHtcbiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KHYsIDEwKTtcbiAgICAgICAgcmV0dXJuIGlzTmFOKG4pID8gdiA6IG47XG4gICAgfTtcbiAgICBjb25zdCBmb3JjZVR5cGUgPSAoYSwgYikgPT4gdHlwZW9mIGEgIT09IHR5cGVvZiBiID8gW1N0cmluZyhhKSwgU3RyaW5nKGIpXSA6IFthLCBiXTtcbiAgICBjb25zdCBjb21wYXJlU3RyaW5ncyA9IChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChpc1dpbGRjYXJkKGEpIHx8IGlzV2lsZGNhcmQoYikpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgW2FwLCBicF0gPSBmb3JjZVR5cGUodHJ5UGFyc2UoYSksIHRyeVBhcnNlKGIpKTtcbiAgICAgICAgaWYgKGFwID4gYnApXG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgaWYgKGFwIDwgYnApXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG4gICAgY29uc3QgY29tcGFyZVNlZ21lbnRzID0gKGEsIGIpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBjb21wYXJlU3RyaW5ncyhhW2ldIHx8ICcwJywgYltpXSB8fCAnMCcpO1xuICAgICAgICAgICAgaWYgKHIgIT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgW3NlbXZlcl0oaHR0cHM6Ly9zZW12ZXIub3JnLykgdmVyc2lvbiBzdHJpbmdzIHRvIGZpbmQgZ3JlYXRlciwgZXF1YWwgb3IgbGVzc2VyLlxuICAgICAqIFRoaXMgbGlicmFyeSBzdXBwb3J0cyB0aGUgZnVsbCBzZW12ZXIgc3BlY2lmaWNhdGlvbiwgaW5jbHVkaW5nIGNvbXBhcmluZyB2ZXJzaW9ucyB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgZGlnaXRzIGxpa2UgYDEuMC4wYCwgYDEuMGAsIGAxYCwgYW5kIHByZS1yZWxlYXNlIHZlcnNpb25zIGxpa2UgYDEuMC4wLWFscGhhYC5cbiAgICAgKiBAcGFyYW0gdjEgLSBGaXJzdCB2ZXJzaW9uIHRvIGNvbXBhcmVcbiAgICAgKiBAcGFyYW0gdjIgLSBTZWNvbmQgdmVyc2lvbiB0byBjb21wYXJlXG4gICAgICogQHJldHVybnMgTnVtZXJpYyB2YWx1ZSBjb21wYXRpYmxlIHdpdGggdGhlIFtBcnJheS5zb3J0KGZuKSBpbnRlcmZhY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3NvcnQjUGFyYW1ldGVycykuXG4gICAgICovXG4gICAgY29uc3QgY29tcGFyZVZlcnNpb25zID0gKHYxLCB2MikgPT4ge1xuICAgICAgICAvLyB2YWxpZGF0ZSBpbnB1dCBhbmQgc3BsaXQgaW50byBzZWdtZW50c1xuICAgICAgICBjb25zdCBuMSA9IHZhbGlkYXRlQW5kUGFyc2UodjEpO1xuICAgICAgICBjb25zdCBuMiA9IHZhbGlkYXRlQW5kUGFyc2UodjIpO1xuICAgICAgICAvLyBwb3Agb2ZmIHRoZSBwYXRjaFxuICAgICAgICBjb25zdCBwMSA9IG4xLnBvcCgpO1xuICAgICAgICBjb25zdCBwMiA9IG4yLnBvcCgpO1xuICAgICAgICAvLyB2YWxpZGF0ZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHIgPSBjb21wYXJlU2VnbWVudHMobjEsIG4yKTtcbiAgICAgICAgaWYgKHIgIT09IDApXG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgLy8gdmFsaWRhdGUgcHJlLXJlbGVhc2VcbiAgICAgICAgaWYgKHAxICYmIHAyKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcGFyZVNlZ21lbnRzKHAxLnNwbGl0KCcuJyksIHAyLnNwbGl0KCcuJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHAxIHx8IHAyKSB7XG4gICAgICAgICAgICByZXR1cm4gcDEgPyAtMSA6IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgW3NlbXZlcl0oaHR0cHM6Ly9zZW12ZXIub3JnLykgdmVyc2lvbiBzdHJpbmdzIHVzaW5nIHRoZSBzcGVjaWZpZWQgb3BlcmF0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdjEgRmlyc3QgdmVyc2lvbiB0byBjb21wYXJlXG4gICAgICogQHBhcmFtIHYyIFNlY29uZCB2ZXJzaW9uIHRvIGNvbXBhcmVcbiAgICAgKiBAcGFyYW0gb3BlcmF0b3IgQWxsb3dlZCBhcml0aG1ldGljIG9wZXJhdG9yIHRvIHVzZVxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBmaXJzdFZlcnNpb24gYW5kIHRoZSBzZWNvbmRWZXJzaW9uIHNhdGlzZmllcyB0aGUgb3BlcmF0b3IsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjb21wYXJlKCcxMC4xLjgnLCAnMTAuMC40JywgJz4nKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiBjb21wYXJlKCcxMC4wLjEnLCAnMTAuMC4xJywgJz0nKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiBjb21wYXJlKCcxMC4xLjEnLCAnMTAuMi4yJywgJzwnKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiBjb21wYXJlKCcxMC4xLjEnLCAnMTAuMi4yJywgJzw9Jyk7IC8vIHJldHVybiB0cnVlXG4gICAgICogY29tcGFyZSgnMTAuMS4xJywgJzEwLjIuMicsICc+PScpOyAvLyByZXR1cm4gZmFsc2VcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdCBjb21wYXJlID0gKHYxLCB2Miwgb3BlcmF0b3IpID0+IHtcbiAgICAgICAgLy8gdmFsaWRhdGUgaW5wdXQgb3BlcmF0b3JcbiAgICAgICAgYXNzZXJ0VmFsaWRPcGVyYXRvcihvcGVyYXRvcik7XG4gICAgICAgIC8vIHNpbmNlIHJlc3VsdCBvZiBjb21wYXJlVmVyc2lvbnMgY2FuIG9ubHkgYmUgLTEgb3IgMCBvciAxXG4gICAgICAgIC8vIGEgc2ltcGxlIG1hcCBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHN3aXRjaFxuICAgICAgICBjb25zdCByZXMgPSBjb21wYXJlVmVyc2lvbnModjEsIHYyKTtcbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yUmVzTWFwW29wZXJhdG9yXS5pbmNsdWRlcyhyZXMpO1xuICAgIH07XG4gICAgY29uc3Qgb3BlcmF0b3JSZXNNYXAgPSB7XG4gICAgICAgICc+JzogWzFdLFxuICAgICAgICAnPj0nOiBbMCwgMV0sXG4gICAgICAgICc9JzogWzBdLFxuICAgICAgICAnPD0nOiBbLTEsIDBdLFxuICAgICAgICAnPCc6IFstMV0sXG4gICAgICAgICchPSc6IFstMSwgMV0sXG4gICAgfTtcbiAgICBjb25zdCBhbGxvd2VkT3BlcmF0b3JzID0gT2JqZWN0LmtleXMob3BlcmF0b3JSZXNNYXApO1xuICAgIGNvbnN0IGFzc2VydFZhbGlkT3BlcmF0b3IgPSAob3ApID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3IgdHlwZSwgZXhwZWN0ZWQgc3RyaW5nIGJ1dCBnb3QgJHt0eXBlb2Ygb3B9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93ZWRPcGVyYXRvcnMuaW5kZXhPZihvcCkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3BlcmF0b3IsIGV4cGVjdGVkIG9uZSBvZiAke2FsbG93ZWRPcGVyYXRvcnMuam9pbignfCcpfWApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE1hdGNoIFtucG0gc2VtdmVyXShodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ni91c2luZy1ucG0vc2VtdmVyKSB2ZXJzaW9uIHJhbmdlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBudW1iZXIgdG8gbWF0Y2hcbiAgICAgKiBAcGFyYW0gcmFuZ2UgUmFuZ2UgcGF0dGVybiBmb3IgdmVyc2lvblxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmVyc2lvbiBudW1iZXIgaXMgd2l0aGluIHRoZSByYW5nZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIHNhdGlzZmllcygnMS4xLjAnLCAnXjEuMC4wJyk7IC8vIHJldHVybiB0cnVlXG4gICAgICogc2F0aXNmaWVzKCcxLjEuMCcsICd+MS4wLjAnKTsgLy8gcmV0dXJuIGZhbHNlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3Qgc2F0aXNmaWVzID0gKHZlcnNpb24sIHJhbmdlKSA9PiB7XG4gICAgICAgIC8vIGNsZWFuIGlucHV0XG4gICAgICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZSgvKFs+PD1dKylcXHMrL2csICckMScpO1xuICAgICAgICAvLyBoYW5kbGUgbXVsdGlwbGUgY29tcGFyYXRvcnNcbiAgICAgICAgaWYgKHJhbmdlLmluY2x1ZGVzKCd8fCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3BsaXQoJ3x8Jykuc29tZSgocikgPT4gc2F0aXNmaWVzKHZlcnNpb24sIHIpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyYW5nZS5pbmNsdWRlcygnIC0gJykpIHtcbiAgICAgICAgICAgIGNvbnN0IFthLCBiXSA9IHJhbmdlLnNwbGl0KCcgLSAnLCAyKTtcbiAgICAgICAgICAgIHJldHVybiBzYXRpc2ZpZXModmVyc2lvbiwgYD49JHthfSA8PSR7Yn1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyYW5nZS5pbmNsdWRlcygnICcpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VcbiAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcc3syLH0vZywgJyAnKVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgICAgICAgICAgLmV2ZXJ5KChyKSA9PiBzYXRpc2ZpZXModmVyc2lvbiwgcikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIG5vIHJhbmdlIG9wZXJhdG9yIHRoZW4gXCI9XCJcbiAgICAgICAgY29uc3QgbSA9IHJhbmdlLm1hdGNoKC9eKFs8Pj1+Xl0rKS8pO1xuICAgICAgICBjb25zdCBvcCA9IG0gPyBtWzFdIDogJz0nO1xuICAgICAgICAvLyBpZiBndC9sdC9lcSB0aGVuIG9wZXJhdG9yIGNvbXBhcmVcbiAgICAgICAgaWYgKG9wICE9PSAnXicgJiYgb3AgIT09ICd+JylcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlKHZlcnNpb24sIHJhbmdlLCBvcCk7XG4gICAgICAgIC8vIGVsc2UgcmFuZ2Ugb2YgZWl0aGVyIFwiflwiIG9yIFwiXlwiIGlzIGFzc3VtZWRcbiAgICAgICAgY29uc3QgW3YxLCB2MiwgdjMsICwgdnBdID0gdmFsaWRhdGVBbmRQYXJzZSh2ZXJzaW9uKTtcbiAgICAgICAgY29uc3QgW3IxLCByMiwgcjMsICwgcnBdID0gdmFsaWRhdGVBbmRQYXJzZShyYW5nZSk7XG4gICAgICAgIGNvbnN0IHYgPSBbdjEsIHYyLCB2M107XG4gICAgICAgIGNvbnN0IHIgPSBbcjEsIHIyICE9PSBudWxsICYmIHIyICE9PSB2b2lkIDAgPyByMiA6ICd4JywgcjMgIT09IG51bGwgJiYgcjMgIT09IHZvaWQgMCA/IHIzIDogJ3gnXTtcbiAgICAgICAgLy8gdmFsaWRhdGUgcHJlLXJlbGVhc2VcbiAgICAgICAgaWYgKHJwKSB7XG4gICAgICAgICAgICBpZiAoIXZwKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChjb21wYXJlU2VnbWVudHModiwgcikgIT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGNvbXBhcmVTZWdtZW50cyh2cC5zcGxpdCgnLicpLCBycC5zcGxpdCgnLicpKSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpcnN0IG5vbi16ZXJvIG51bWJlclxuICAgICAgICBjb25zdCBub25aZXJvID0gci5maW5kSW5kZXgoKHYpID0+IHYgIT09ICcwJykgKyAxO1xuICAgICAgICAvLyBwb2ludGVyIHRvIHdoZXJlIHNlZ21lbnRzIGNhbiBiZSA+PVxuICAgICAgICBjb25zdCBpID0gb3AgPT09ICd+JyA/IDIgOiBub25aZXJvID4gMSA/IG5vblplcm8gOiAxO1xuICAgICAgICAvLyBiZWZvcmUgcG9pbnRlciBtdXN0IGJlIGVxdWFsXG4gICAgICAgIGlmIChjb21wYXJlU2VnbWVudHModi5zbGljZSgwLCBpKSwgci5zbGljZSgwLCBpKSkgIT09IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIGFmdGVyIHBvaW50ZXIgbXVzdCBiZSA+PVxuICAgICAgICBpZiAoY29tcGFyZVNlZ21lbnRzKHYuc2xpY2UoaSksIHIuc2xpY2UoaSkpID09PSAtMSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIFtzZW12ZXJdKGh0dHBzOi8vc2VtdmVyLm9yZy8pIHZlcnNpb24gc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFZlcnNpb24gbnVtYmVyIHRvIHZhbGlkYXRlXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBhIHZhbGlkIHNlbXZlciB2ZXJzaW9uIG51bWJlciwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIHZhbGlkYXRlKCcxLjAuMC1yYy4xJyk7IC8vIHJldHVybiB0cnVlXG4gICAgICogdmFsaWRhdGUoJzEuMC1yYy4xJyk7IC8vIHJldHVybiBmYWxzZVxuICAgICAqIHZhbGlkYXRlKCdmb28nKTsgLy8gcmV0dXJuIGZhbHNlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3QgdmFsaWRhdGUgPSAodmVyc2lvbikgPT4gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnICYmIC9eW3ZcXGRdLy50ZXN0KHZlcnNpb24pICYmIHNlbXZlci50ZXN0KHZlcnNpb24pO1xuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIFtzZW12ZXJdKGh0dHBzOi8vc2VtdmVyLm9yZy8pIHZlcnNpb24gc3RyaW5ncyBzdHJpY3RseS4gV2lsbCBub3QgYWNjZXB0IHdpbGRjYXJkcyBhbmQgdmVyc2lvbiByYW5nZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBWZXJzaW9uIG51bWJlciB0byB2YWxpZGF0ZVxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmVyc2lvbiBudW1iZXIgaXMgYSB2YWxpZCBzZW12ZXIgdmVyc2lvbiBudW1iZXIgYGZhbHNlYCBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogdmFsaWRhdGUoJzEuMC4wLXJjLjEnKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiB2YWxpZGF0ZSgnMS4wLXJjLjEnKTsgLy8gcmV0dXJuIGZhbHNlXG4gICAgICogdmFsaWRhdGUoJ2ZvbycpOyAvLyByZXR1cm4gZmFsc2VcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZVN0cmljdCA9ICh2ZXJzaW9uKSA9PiB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgL14oMHxbMS05XVxcZCopXFwuKDB8WzEtOV1cXGQqKVxcLigwfFsxLTldXFxkKikoPzotKCg/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSg/OlxcLig/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSkqKSk/KD86XFwrKFswLTlhLXpBLVotXSsoPzpcXC5bMC05YS16QS1aLV0rKSopKT8kLy50ZXN0KHZlcnNpb24pO1xuXG4gICAgZXhwb3J0cy5jb21wYXJlID0gY29tcGFyZTtcbiAgICBleHBvcnRzLmNvbXBhcmVWZXJzaW9ucyA9IGNvbXBhcmVWZXJzaW9ucztcbiAgICBleHBvcnRzLnNhdGlzZmllcyA9IHNhdGlzZmllcztcbiAgICBleHBvcnRzLnZhbGlkYXRlID0gdmFsaWRhdGU7XG4gICAgZXhwb3J0cy52YWxpZGF0ZVN0cmljdCA9IHZhbGlkYXRlU3RyaWN0O1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsIi8qIVxuICogIGhvd2xlci5qcyB2Mi4yLjFcbiAqICBob3dsZXJqcy5jb21cbiAqXG4gKiAgKGMpIDIwMTMtMjAyMCwgSmFtZXMgU2ltcHNvbiBvZiBHb2xkRmlyZSBTdHVkaW9zXG4gKiAgZ29sZGZpcmVzdHVkaW9zLmNvbVxuICpcbiAqICBNSVQgTGljZW5zZVxuICovXG5cbihmdW5jdGlvbigpIHtcblxuICAndXNlIHN0cmljdCc7XG5cbiAgLyoqIEdsb2JhbCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGdsb2JhbCBjb250cm9sbGVyLiBBbGwgY29udGFpbmVkIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgYXBwbHlcbiAgICogdG8gYWxsIHNvdW5kcyB0aGF0IGFyZSBjdXJyZW50bHkgcGxheWluZyBvciB3aWxsIGJlIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICB2YXIgSG93bGVyR2xvYmFsID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH07XG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIEhvd2xlciBvYmplY3QuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gQ3JlYXRlIGEgZ2xvYmFsIElEIGNvdW50ZXIuXG4gICAgICBzZWxmLl9jb3VudGVyID0gMTAwMDtcblxuICAgICAgLy8gUG9vbCBvZiB1bmxvY2tlZCBIVE1MNSBBdWRpbyBvYmplY3RzLlxuICAgICAgc2VsZi5faHRtbDVBdWRpb1Bvb2wgPSBbXTtcbiAgICAgIHNlbGYuaHRtbDVQb29sU2l6ZSA9IDEwO1xuXG4gICAgICAvLyBJbnRlcm5hbCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fY29kZWNzID0ge307XG4gICAgICBzZWxmLl9ob3dscyA9IFtdO1xuICAgICAgc2VsZi5fbXV0ZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuX3ZvbHVtZSA9IDE7XG4gICAgICBzZWxmLl9jYW5QbGF5RXZlbnQgPSAnY2FucGxheXRocm91Z2gnO1xuICAgICAgc2VsZi5fbmF2aWdhdG9yID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0b3IpID8gd2luZG93Lm5hdmlnYXRvciA6IG51bGw7XG5cbiAgICAgIC8vIFB1YmxpYyBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5tYXN0ZXJHYWluID0gbnVsbDtcbiAgICAgIHNlbGYubm9BdWRpbyA9IGZhbHNlO1xuICAgICAgc2VsZi51c2luZ1dlYkF1ZGlvID0gdHJ1ZTtcbiAgICAgIHNlbGYuYXV0b1N1c3BlbmQgPSB0cnVlO1xuICAgICAgc2VsZi5jdHggPSBudWxsO1xuXG4gICAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGUgYXV0byBhdWRpbyB1bmxvY2tlci5cbiAgICAgIHNlbGYuYXV0b1VubG9jayA9IHRydWU7XG5cbiAgICAgIC8vIFNldHVwIHRoZSB2YXJpb3VzIHN0YXRlIHZhbHVlcyBmb3IgZ2xvYmFsIHRyYWNraW5nLlxuICAgICAgc2VsZi5fc2V0dXAoKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIGdsb2JhbCB2b2x1bWUgZm9yIGFsbCBzb3VuZHMuXG4gICAgICogQHBhcmFtICB7RmxvYXR9IHZvbCBWb2x1bWUgZnJvbSAwLjAgdG8gMS4wLlxuICAgICAqIEByZXR1cm4ge0hvd2xlci9GbG9hdH0gICAgIFJldHVybnMgc2VsZiBvciBjdXJyZW50IHZvbHVtZS5cbiAgICAgKi9cbiAgICB2b2x1bWU6IGZ1bmN0aW9uKHZvbCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcbiAgICAgIHZvbCA9IHBhcnNlRmxvYXQodm9sKTtcblxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBBdWRpb0NvbnRleHQgY3JlYXRlZCB5ZXQsIHJ1biB0aGUgc2V0dXAuXG4gICAgICBpZiAoIXNlbGYuY3R4KSB7XG4gICAgICAgIHNldHVwQXVkaW9Db250ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygdm9sICE9PSAndW5kZWZpbmVkJyAmJiB2b2wgPj0gMCAmJiB2b2wgPD0gMSkge1xuICAgICAgICBzZWxmLl92b2x1bWUgPSB2b2w7XG5cbiAgICAgICAgLy8gRG9uJ3QgdXBkYXRlIGFueSBvZiB0aGUgbm9kZXMgaWYgd2UgYXJlIG11dGVkLlxuICAgICAgICBpZiAoc2VsZi5fbXV0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdoZW4gdXNpbmcgV2ViIEF1ZGlvLCB3ZSBqdXN0IG5lZWQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgZ2Fpbi5cbiAgICAgICAgaWYgKHNlbGYudXNpbmdXZWJBdWRpbykge1xuICAgICAgICAgIHNlbGYubWFzdGVyR2Fpbi5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYW5kIGNoYW5nZSB2b2x1bWUgZm9yIGFsbCBIVE1MNSBhdWRpbyBub2Rlcy5cbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICAgICAgICB2YXIgaWRzID0gc2VsZi5faG93bHNbaV0uX2dldFNvdW5kSWRzKCk7XG5cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCBjaGFuZ2UgdGhlIHZvbHVtZXMuXG4gICAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8aWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX2hvd2xzW2ldLl9zb3VuZEJ5SWQoaWRzW2pdKTtcblxuICAgICAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS52b2x1bWUgPSBzb3VuZC5fdm9sdW1lICogdm9sO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLl92b2x1bWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBtdXRpbmcgYW5kIHVubXV0aW5nIGdsb2JhbGx5LlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IG11dGVkIElzIG11dGVkIG9yIG5vdC5cbiAgICAgKi9cbiAgICBtdXRlOiBmdW5jdGlvbihtdXRlZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBBdWRpb0NvbnRleHQgY3JlYXRlZCB5ZXQsIHJ1biB0aGUgc2V0dXAuXG4gICAgICBpZiAoIXNlbGYuY3R4KSB7XG4gICAgICAgIHNldHVwQXVkaW9Db250ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX211dGVkID0gbXV0ZWQ7XG5cbiAgICAgIC8vIFdpdGggV2ViIEF1ZGlvLCB3ZSBqdXN0IG5lZWQgdG8gbXV0ZSB0aGUgbWFzdGVyIGdhaW4uXG4gICAgICBpZiAoc2VsZi51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgIHNlbGYubWFzdGVyR2Fpbi5nYWluLnNldFZhbHVlQXRUaW1lKG11dGVkID8gMCA6IHNlbGYuX3ZvbHVtZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbmQgbXV0ZSBhbGwgSFRNTDUgQXVkaW8gbm9kZXMuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAgICAgIHZhciBpZHMgPSBzZWxmLl9ob3dsc1tpXS5fZ2V0U291bmRJZHMoKTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCBtYXJrIHRoZSBhdWRpbyBub2RlIGFzIG11dGVkLlxuICAgICAgICAgIGZvciAodmFyIGo9MDsgajxpZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX2hvd2xzW2ldLl9zb3VuZEJ5SWQoaWRzW2pdKTtcblxuICAgICAgICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLm11dGVkID0gKG11dGVkKSA/IHRydWUgOiBzb3VuZC5fbXV0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgc3RvcHBpbmcgYWxsIHNvdW5kcyBnbG9iYWxseS5cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgSG93bHMgYW5kIHN0b3AgdGhlbS5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzZWxmLl9ob3dsc1tpXS5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbmxvYWQgYW5kIGRlc3Ryb3kgYWxsIGN1cnJlbnRseSBsb2FkZWQgSG93bCBvYmplY3RzLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgZm9yICh2YXIgaT1zZWxmLl9ob3dscy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7XG4gICAgICAgIHNlbGYuX2hvd2xzW2ldLnVubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgQXVkaW9Db250ZXh0IHRvIG1ha2Ugc3VyZSBpdCBpcyBmdWxseSByZXNldC5cbiAgICAgIGlmIChzZWxmLnVzaW5nV2ViQXVkaW8gJiYgc2VsZi5jdHggJiYgdHlwZW9mIHNlbGYuY3R4LmNsb3NlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLmN0eC5jbG9zZSgpO1xuICAgICAgICBzZWxmLmN0eCA9IG51bGw7XG4gICAgICAgIHNldHVwQXVkaW9Db250ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgY29kZWMgc3VwcG9ydCBvZiBzcGVjaWZpYyBleHRlbnNpb24uXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBleHQgQXVkaW8gZmlsZSBleHRlbnRpb24uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBjb2RlY3M6IGZ1bmN0aW9uKGV4dCkge1xuICAgICAgcmV0dXJuICh0aGlzIHx8IEhvd2xlcikuX2NvZGVjc1tleHQucmVwbGFjZSgvXngtLywgJycpXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0dXAgdmFyaW91cyBzdGF0ZSB2YWx1ZXMgZm9yIGdsb2JhbCB0cmFja2luZy5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX3NldHVwOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBzdXNwZW5kL3Jlc3VtZSBzdGF0ZSBvZiB0aGUgQXVkaW9Db250ZXh0LlxuICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY3R4ID8gc2VsZi5jdHguc3RhdGUgfHwgJ3N1c3BlbmRlZCcgOiAnc3VzcGVuZGVkJztcblxuICAgICAgLy8gQXV0b21hdGljYWxseSBiZWdpbiB0aGUgMzAtc2Vjb25kIHN1c3BlbmQgcHJvY2Vzc1xuICAgICAgc2VsZi5fYXV0b1N1c3BlbmQoKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYXVkaW8gaXMgYXZhaWxhYmxlLlxuICAgICAgaWYgKCFzZWxmLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgLy8gTm8gYXVkaW8gaXMgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtIGlmIG5vQXVkaW8gaXMgc2V0IHRvIHRydWUuXG4gICAgICAgIGlmICh0eXBlb2YgQXVkaW8gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciB0ZXN0ID0gbmV3IEF1ZGlvKCk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjYW5wbGF5dGhyb3VnaCBldmVudCBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRlc3Qub25jYW5wbGF5dGhyb3VnaCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgc2VsZi5fY2FuUGxheUV2ZW50ID0gJ2NhbnBsYXknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgc2VsZi5ub0F1ZGlvID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5ub0F1ZGlvID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUZXN0IHRvIG1ha2Ugc3VyZSBhdWRpbyBpc24ndCBkaXNhYmxlZCBpbiBJbnRlcm5ldCBFeHBsb3Jlci5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB0ZXN0ID0gbmV3IEF1ZGlvKCk7XG4gICAgICAgIGlmICh0ZXN0Lm11dGVkKSB7XG4gICAgICAgICAgc2VsZi5ub0F1ZGlvID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgLy8gQ2hlY2sgZm9yIHN1cHBvcnRlZCBjb2RlY3MuXG4gICAgICBpZiAoIXNlbGYubm9BdWRpbykge1xuICAgICAgICBzZWxmLl9zZXR1cENvZGVjcygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgZm9yIGJyb3dzZXIgc3VwcG9ydCBmb3IgdmFyaW91cyBjb2RlY3MgYW5kIGNhY2hlIHRoZSByZXN1bHRzLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfc2V0dXBDb2RlY3M6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcbiAgICAgIHZhciBhdWRpb1Rlc3QgPSBudWxsO1xuXG4gICAgICAvLyBNdXN0IHdyYXAgaW4gYSB0cnkvY2F0Y2ggYmVjYXVzZSBJRTExIGluIHNlcnZlciBtb2RlIHRocm93cyBhbiBlcnJvci5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF1ZGlvVGVzdCA9ICh0eXBlb2YgQXVkaW8gIT09ICd1bmRlZmluZWQnKSA/IG5ldyBBdWRpbygpIDogbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhdWRpb1Rlc3QgfHwgdHlwZW9mIGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgdmFyIG1wZWdUZXN0ID0gYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tcGVnOycpLnJlcGxhY2UoL15ubyQvLCAnJyk7XG5cbiAgICAgIC8vIE9wZXJhIHZlcnNpb24gPDMzIGhhcyBtaXhlZCBNUDMgc3VwcG9ydCwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgYW5kIGJsb2NrIGl0LlxuICAgICAgdmFyIGNoZWNrT3BlcmEgPSBzZWxmLl9uYXZpZ2F0b3IgJiYgc2VsZi5fbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT1BSXFwvKFswLTZdLikvZyk7XG4gICAgICB2YXIgaXNPbGRPcGVyYSA9IChjaGVja09wZXJhICYmIHBhcnNlSW50KGNoZWNrT3BlcmFbMF0uc3BsaXQoJy8nKVsxXSwgMTApIDwgMzMpO1xuXG4gICAgICBzZWxmLl9jb2RlY3MgPSB7XG4gICAgICAgIG1wMzogISEoIWlzT2xkT3BlcmEgJiYgKG1wZWdUZXN0IHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbXAzOycpLnJlcGxhY2UoL15ubyQvLCAnJykpKSxcbiAgICAgICAgbXBlZzogISFtcGVnVGVzdCxcbiAgICAgICAgb3B1czogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL29nZzsgY29kZWNzPVwib3B1c1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgb2dnOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vb2dnOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG9nYTogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL29nZzsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICB3YXY6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2F2OyBjb2RlY3M9XCIxXCInKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3dhdicpKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBhYWM6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgY2FmOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1jYWY7JykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgbTRhOiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtbTRhOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbTRhOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vYWFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBtNGI6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1tNGI7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tNGI7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG1wNDogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LW1wNDsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wNDsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKSkucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgd2ViYTogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3dlYm07IGNvZGVjcz1cInZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgd2VibTogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3dlYm07IGNvZGVjcz1cInZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgZG9sYnk6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tcDQ7IGNvZGVjcz1cImVjLTNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIGZsYWM6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1mbGFjOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vZmxhYzsnKSkucmVwbGFjZSgvXm5vJC8sICcnKVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNvbWUgYnJvd3NlcnMvZGV2aWNlcyB3aWxsIG9ubHkgYWxsb3cgYXVkaW8gdG8gYmUgcGxheWVkIGFmdGVyIGEgdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgKiBBdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgdW5sb2NrIGF1ZGlvIG9uIHRoZSBmaXJzdCB1c2VyIGludGVyYWN0aW9uLlxuICAgICAqIENvbmNlcHQgZnJvbTogaHR0cDovL3BhdWxiYWthdXMuY29tL3R1dG9yaWFscy9odG1sNS93ZWItYXVkaW8tb24taW9zL1xuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfdW5sb2NrQXVkaW86IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gT25seSBydW4gdGhpcyBpZiBXZWIgQXVkaW8gaXMgc3VwcG9ydGVkIGFuZCBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHVubG9ja2VkLlxuICAgICAgaWYgKHNlbGYuX2F1ZGlvVW5sb2NrZWQgfHwgIXNlbGYuY3R4KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VsZi5fYXVkaW9VbmxvY2tlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5hdXRvVW5sb2NrID0gZmFsc2U7XG5cbiAgICAgIC8vIFNvbWUgbW9iaWxlIGRldmljZXMvcGxhdGZvcm1zIGhhdmUgZGlzdG9ydGlvbiBpc3N1ZXMgd2hlbiBvcGVuaW5nL2Nsb3NpbmcgdGFicyBhbmQvb3Igd2ViIHZpZXdzLlxuICAgICAgLy8gQnVncyBpbiB0aGUgYnJvd3NlciAoZXNwZWNpYWxseSBNb2JpbGUgU2FmYXJpKSBjYW4gY2F1c2UgdGhlIHNhbXBsZVJhdGUgdG8gY2hhbmdlIGZyb20gNDQxMDAgdG8gNDgwMDAuXG4gICAgICAvLyBCeSBjYWxsaW5nIEhvd2xlci51bmxvYWQoKSwgd2UgY3JlYXRlIGEgbmV3IEF1ZGlvQ29udGV4dCB3aXRoIHRoZSBjb3JyZWN0IHNhbXBsZVJhdGUuXG4gICAgICBpZiAoIXNlbGYuX21vYmlsZVVubG9hZGVkICYmIHNlbGYuY3R4LnNhbXBsZVJhdGUgIT09IDQ0MTAwKSB7XG4gICAgICAgIHNlbGYuX21vYmlsZVVubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgc2VsZi51bmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2NyYXRjaCBidWZmZXIgZm9yIGVuYWJsaW5nIGlPUyB0byBkaXNwb3NlIG9mIHdlYiBhdWRpbyBidWZmZXJzIGNvcnJlY3RseSwgYXMgcGVyOlxuICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNDExOTY4NFxuICAgICAgc2VsZi5fc2NyYXRjaEJ1ZmZlciA9IHNlbGYuY3R4LmNyZWF0ZUJ1ZmZlcigxLCAxLCAyMjA1MCk7XG5cbiAgICAgIC8vIENhbGwgdGhpcyBtZXRob2Qgb24gdG91Y2ggc3RhcnQgdG8gY3JlYXRlIGFuZCBwbGF5IGEgYnVmZmVyLFxuICAgICAgLy8gdGhlbiBjaGVjayBpZiB0aGUgYXVkaW8gYWN0dWFsbHkgcGxheWVkIHRvIGRldGVybWluZSBpZlxuICAgICAgLy8gYXVkaW8gaGFzIG5vdyBiZWVuIHVubG9ja2VkIG9uIGlPUywgQW5kcm9pZCwgZXRjLlxuICAgICAgdmFyIHVubG9jayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgcG9vbCBvZiB1bmxvY2tlZCBIVE1MNSBBdWRpbyBvYmplY3RzIHRoYXQgY2FuXG4gICAgICAgIC8vIGJlIHVzZWQgZm9yIHBsYXlpbmcgc291bmRzIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbi4gSFRNTDVcbiAgICAgICAgLy8gQXVkaW8gb2JqZWN0cyBtdXN0IGJlIGluZGl2aWR1YWxseSB1bmxvY2tlZCwgYXMgb3Bwb3NlZFxuICAgICAgICAvLyB0byB0aGUgV2ViQXVkaW8gQVBJIHdoaWNoIG9ubHkgbmVlZHMgYSBzaW5nbGUgYWN0aXZhdGlvbi5cbiAgICAgICAgLy8gVGhpcyBtdXN0IG9jY3VyIGJlZm9yZSBXZWJBdWRpbyBzZXR1cCBvciB0aGUgc291cmNlLm9uZW5kZWRcbiAgICAgICAgLy8gZXZlbnQgd2lsbCBub3QgZmlyZS5cbiAgICAgICAgd2hpbGUgKHNlbGYuX2h0bWw1QXVkaW9Qb29sLmxlbmd0aCA8IHNlbGYuaHRtbDVQb29sU2l6ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgYXVkaW9Ob2RlID0gbmV3IEF1ZGlvKCk7XG5cbiAgICAgICAgICAgIC8vIE1hcmsgdGhpcyBBdWRpbyBvYmplY3QgYXMgdW5sb2NrZWQgdG8gZW5zdXJlIGl0IGNhbiBnZXQgcmV0dXJuZWRcbiAgICAgICAgICAgIC8vIHRvIHRoZSB1bmxvY2tlZCBwb29sIHdoZW4gcmVsZWFzZWQuXG4gICAgICAgICAgICBhdWRpb05vZGUuX3VubG9ja2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBhdWRpbyBub2RlIHRvIHRoZSBwb29sLlxuICAgICAgICAgICAgc2VsZi5fcmVsZWFzZUh0bWw1QXVkaW8oYXVkaW9Ob2RlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFueSBhc3NpZ25lZCBhdWRpbyBub2RlcyBhbmQgdW5sb2NrIHRoZW0uXG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghc2VsZi5faG93bHNbaV0uX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2hvd2xzW2ldLl9nZXRTb3VuZElkcygpO1xuXG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHNvdW5kcyBhbmQgdW5sb2NrIHRoZSBhdWRpbyBub2Rlcy5cbiAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxpZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5faG93bHNbaV0uX3NvdW5kQnlJZChpZHNbal0pO1xuXG4gICAgICAgICAgICAgIGlmIChzb3VuZCAmJiBzb3VuZC5fbm9kZSAmJiAhc291bmQuX25vZGUuX3VubG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUuX3VubG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5sb2FkKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXggQW5kcm9pZCBjYW4gbm90IHBsYXkgaW4gc3VzcGVuZCBzdGF0ZS5cbiAgICAgICAgc2VsZi5fYXV0b1Jlc3VtZSgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBidWZmZXIuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWxmLmN0eC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcbiAgICAgICAgc291cmNlLmJ1ZmZlciA9IHNlbGYuX3NjcmF0Y2hCdWZmZXI7XG4gICAgICAgIHNvdXJjZS5jb25uZWN0KHNlbGYuY3R4LmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAvLyBQbGF5IHRoZSBlbXB0eSBidWZmZXIuXG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlLnN0YXJ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHNvdXJjZS5ub3RlT24oMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc291cmNlLnN0YXJ0KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbGluZyByZXN1bWUoKSBvbiBhIHN0YWNrIGluaXRpYXRlZCBieSB1c2VyIGdlc3R1cmUgaXMgd2hhdCBhY3R1YWxseSB1bmxvY2tzIHRoZSBhdWRpbyBvbiBBbmRyb2lkIENocm9tZSA+PSA1NS5cbiAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmN0eC5yZXN1bWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzZWxmLmN0eC5yZXN1bWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldHVwIGEgdGltZW91dCB0byBjaGVjayB0aGF0IHdlIGFyZSB1bmxvY2tlZCBvbiB0aGUgbmV4dCBldmVudCBsb29wLlxuICAgICAgICBzb3VyY2Uub25lbmRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNvdXJjZS5kaXNjb25uZWN0KDApO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmxvY2tlZCBzdGF0ZSBhbmQgcHJldmVudCB0aGlzIGNoZWNrIGZyb20gaGFwcGVuaW5nIGFnYWluLlxuICAgICAgICAgIHNlbGYuX2F1ZGlvVW5sb2NrZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0b3VjaCBzdGFydCBsaXN0ZW5lci5cbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdW5sb2NrLCB0cnVlKTtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHVubG9jaywgdHJ1ZSk7XG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bmxvY2ssIHRydWUpO1xuXG4gICAgICAgICAgLy8gTGV0IGFsbCBzb3VuZHMga25vdyB0aGF0IGF1ZGlvIGhhcyBiZWVuIHVubG9ja2VkLlxuICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2VsZi5faG93bHNbaV0uX2VtaXQoJ3VubG9jaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldHVwIGEgdG91Y2ggc3RhcnQgbGlzdGVuZXIgdG8gYXR0ZW1wdCBhbiB1bmxvY2sgaW4uXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdW5sb2NrLCB0cnVlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdW5sb2NrLCB0cnVlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdW5sb2NrLCB0cnVlKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhbiB1bmxvY2tlZCBIVE1MNSBBdWRpbyBvYmplY3QgZnJvbSB0aGUgcG9vbC4gSWYgbm9uZSBhcmUgbGVmdCxcbiAgICAgKiByZXR1cm4gYSBuZXcgQXVkaW8gb2JqZWN0IGFuZCB0aHJvdyBhIHdhcm5pbmcuXG4gICAgICogQHJldHVybiB7QXVkaW99IEhUTUw1IEF1ZGlvIG9iamVjdC5cbiAgICAgKi9cbiAgICBfb2J0YWluSHRtbDVBdWRpbzogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIG5leHQgb2JqZWN0IGZyb20gdGhlIHBvb2wgaWYgb25lIGV4aXN0cy5cbiAgICAgIGlmIChzZWxmLl9odG1sNUF1ZGlvUG9vbC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX2h0bWw1QXVkaW9Qb29sLnBvcCgpO1xuICAgICAgfVxuXG4gICAgICAvLy5DaGVjayBpZiB0aGUgYXVkaW8gaXMgbG9ja2VkIGFuZCB0aHJvdyBhIHdhcm5pbmcuXG4gICAgICB2YXIgdGVzdFBsYXkgPSBuZXcgQXVkaW8oKS5wbGF5KCk7XG4gICAgICBpZiAodGVzdFBsYXkgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmICh0ZXN0UGxheSBpbnN0YW5jZW9mIFByb21pc2UgfHwgdHlwZW9mIHRlc3RQbGF5LnRoZW4gPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRlc3RQbGF5LmNhdGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignSFRNTDUgQXVkaW8gcG9vbCBleGhhdXN0ZWQsIHJldHVybmluZyBwb3RlbnRpYWxseSBsb2NrZWQgYXVkaW8gb2JqZWN0LicpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBBdWRpbygpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gYWN0aXZhdGVkIEhUTUw1IEF1ZGlvIG9iamVjdCB0byB0aGUgcG9vbC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX3JlbGVhc2VIdG1sNUF1ZGlvOiBmdW5jdGlvbihhdWRpbykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gRG9uJ3QgYWRkIGF1ZGlvIHRvIHRoZSBwb29sIGlmIHdlIGRvbid0IGtub3cgaWYgaXQgaGFzIGJlZW4gdW5sb2NrZWQuXG4gICAgICBpZiAoYXVkaW8uX3VubG9ja2VkKSB7XG4gICAgICAgIHNlbGYuX2h0bWw1QXVkaW9Qb29sLnB1c2goYXVkaW8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXV0b21hdGljYWxseSBzdXNwZW5kIHRoZSBXZWIgQXVkaW8gQXVkaW9Db250ZXh0IGFmdGVyIG5vIHNvdW5kIGhhcyBwbGF5ZWQgZm9yIDMwIHNlY29uZHMuXG4gICAgICogVGhpcyBzYXZlcyBwcm9jZXNzaW5nL2VuZXJneSBhbmQgZml4ZXMgdmFyaW91cyBicm93c2VyLXNwZWNpZmljIGJ1Z3Mgd2l0aCBhdWRpbyBnZXR0aW5nIHN0dWNrLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfYXV0b1N1c3BlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoIXNlbGYuYXV0b1N1c3BlbmQgfHwgIXNlbGYuY3R4IHx8IHR5cGVvZiBzZWxmLmN0eC5zdXNwZW5kID09PSAndW5kZWZpbmVkJyB8fCAhSG93bGVyLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBhbnkgc291bmRzIGFyZSBwbGF5aW5nLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8c2VsZi5faG93bHNbaV0uX3NvdW5kcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fc291bmRzW2pdLl9wYXVzZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9zdXNwZW5kVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3N1c3BlbmRUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIHNvdW5kIGhhcyBwbGF5ZWQgYWZ0ZXIgMzAgc2Vjb25kcywgc3VzcGVuZCB0aGUgY29udGV4dC5cbiAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghc2VsZi5hdXRvU3VzcGVuZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IG51bGw7XG4gICAgICAgIHNlbGYuc3RhdGUgPSAnc3VzcGVuZGluZyc7XG5cbiAgICAgICAgLy8gSGFuZGxlIHVwZGF0aW5nIHRoZSBzdGF0ZSBvZiB0aGUgYXVkaW8gY29udGV4dCBhZnRlciBzdXNwZW5kaW5nLlxuICAgICAgICB2YXIgaGFuZGxlU3VzcGVuc2lvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuc3RhdGUgPSAnc3VzcGVuZGVkJztcblxuICAgICAgICAgIGlmIChzZWxmLl9yZXN1bWVBZnRlclN1c3BlbmQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzZWxmLl9yZXN1bWVBZnRlclN1c3BlbmQ7XG4gICAgICAgICAgICBzZWxmLl9hdXRvUmVzdW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEVpdGhlciB0aGUgc3RhdGUgZ2V0cyBzdXNwZW5kZWQgb3IgaXQgaXMgaW50ZXJydXB0ZWQuXG4gICAgICAgIC8vIEVpdGhlciB3YXksIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzdGF0ZSB0byBzdXNwZW5kZWQuXG4gICAgICAgIHNlbGYuY3R4LnN1c3BlbmQoKS50aGVuKGhhbmRsZVN1c3BlbnNpb24sIGhhbmRsZVN1c3BlbnNpb24pO1xuICAgICAgfSwgMzAwMDApO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXV0b21hdGljYWxseSByZXN1bWUgdGhlIFdlYiBBdWRpbyBBdWRpb0NvbnRleHQgd2hlbiBhIG5ldyBzb3VuZCBpcyBwbGF5ZWQuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9hdXRvUmVzdW1lOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKCFzZWxmLmN0eCB8fCB0eXBlb2Ygc2VsZi5jdHgucmVzdW1lID09PSAndW5kZWZpbmVkJyB8fCAhSG93bGVyLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gJ3J1bm5pbmcnICYmIHNlbGYuY3R4LnN0YXRlICE9PSAnaW50ZXJydXB0ZWQnICYmIHNlbGYuX3N1c3BlbmRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fc3VzcGVuZFRpbWVyKTtcbiAgICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcgfHwgc2VsZi5zdGF0ZSA9PT0gJ3J1bm5pbmcnICYmIHNlbGYuY3R4LnN0YXRlID09PSAnaW50ZXJydXB0ZWQnKSB7XG4gICAgICAgIHNlbGYuY3R4LnJlc3VtZSgpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5zdGF0ZSA9ICdydW5uaW5nJztcblxuICAgICAgICAgIC8vIEVtaXQgdG8gYWxsIEhvd2xzIHRoYXQgdGhlIGF1ZGlvIGhhcyByZXN1bWVkLlxuICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2VsZi5faG93bHNbaV0uX2VtaXQoJ3Jlc3VtZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNlbGYuX3N1c3BlbmRUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChzZWxmLl9zdXNwZW5kVGltZXIpO1xuICAgICAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5zdGF0ZSA9PT0gJ3N1c3BlbmRpbmcnKSB7XG4gICAgICAgIHNlbGYuX3Jlc3VtZUFmdGVyU3VzcGVuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXR1cCB0aGUgZ2xvYmFsIGF1ZGlvIGNvbnRyb2xsZXIuXG4gIHZhciBIb3dsZXIgPSBuZXcgSG93bGVyR2xvYmFsKCk7XG5cbiAgLyoqIEdyb3VwIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBhdWRpbyBncm91cCBjb250cm9sbGVyLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbyBQYXNzZWQgaW4gcHJvcGVydGllcyBmb3IgdGhpcyBncm91cC5cbiAgICovXG4gIHZhciBIb3dsID0gZnVuY3Rpb24obykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFRocm93IGFuIGVycm9yIGlmIG5vIHNvdXJjZSBpcyBwcm92aWRlZC5cbiAgICBpZiAoIW8uc3JjIHx8IG8uc3JjLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcignQW4gYXJyYXkgb2Ygc291cmNlIGZpbGVzIG11c3QgYmUgcGFzc2VkIHdpdGggYW55IG5ldyBIb3dsLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlbGYuaW5pdChvKTtcbiAgfTtcbiAgSG93bC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBIb3dsIGdyb3VwIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IG8gUGFzc2VkIGluIHByb3BlcnRpZXMgZm9yIHRoaXMgZ3JvdXAuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gQXVkaW9Db250ZXh0IGNyZWF0ZWQgeWV0LCBydW4gdGhlIHNldHVwLlxuICAgICAgaWYgKCFIb3dsZXIuY3R4KSB7XG4gICAgICAgIHNldHVwQXVkaW9Db250ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIHVzZXItZGVmaW5lZCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9hdXRvcGxheSA9IG8uYXV0b3BsYXkgfHwgZmFsc2U7XG4gICAgICBzZWxmLl9mb3JtYXQgPSAodHlwZW9mIG8uZm9ybWF0ICE9PSAnc3RyaW5nJykgPyBvLmZvcm1hdCA6IFtvLmZvcm1hdF07XG4gICAgICBzZWxmLl9odG1sNSA9IG8uaHRtbDUgfHwgZmFsc2U7XG4gICAgICBzZWxmLl9tdXRlZCA9IG8ubXV0ZSB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX2xvb3AgPSBvLmxvb3AgfHwgZmFsc2U7XG4gICAgICBzZWxmLl9wb29sID0gby5wb29sIHx8IDU7XG4gICAgICBzZWxmLl9wcmVsb2FkID0gKHR5cGVvZiBvLnByZWxvYWQgPT09ICdib29sZWFuJyB8fCBvLnByZWxvYWQgPT09ICdtZXRhZGF0YScpID8gby5wcmVsb2FkIDogdHJ1ZTtcbiAgICAgIHNlbGYuX3JhdGUgPSBvLnJhdGUgfHwgMTtcbiAgICAgIHNlbGYuX3Nwcml0ZSA9IG8uc3ByaXRlIHx8IHt9O1xuICAgICAgc2VsZi5fc3JjID0gKHR5cGVvZiBvLnNyYyAhPT0gJ3N0cmluZycpID8gby5zcmMgOiBbby5zcmNdO1xuICAgICAgc2VsZi5fdm9sdW1lID0gby52b2x1bWUgIT09IHVuZGVmaW5lZCA/IG8udm9sdW1lIDogMTtcbiAgICAgIHNlbGYuX3hociA9IHtcbiAgICAgICAgbWV0aG9kOiBvLnhociAmJiBvLnhoci5tZXRob2QgPyBvLnhoci5tZXRob2QgOiAnR0VUJyxcbiAgICAgICAgaGVhZGVyczogby54aHIgJiYgby54aHIuaGVhZGVycyA/IG8ueGhyLmhlYWRlcnMgOiBudWxsLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IG8ueGhyICYmIG8ueGhyLndpdGhDcmVkZW50aWFscyA/IG8ueGhyLndpdGhDcmVkZW50aWFscyA6IGZhbHNlLFxuICAgICAgfTtcblxuICAgICAgLy8gU2V0dXAgYWxsIG90aGVyIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX2R1cmF0aW9uID0gMDtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgIHNlbGYuX3NvdW5kcyA9IFtdO1xuICAgICAgc2VsZi5fZW5kVGltZXJzID0ge307XG4gICAgICBzZWxmLl9xdWV1ZSA9IFtdO1xuICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcblxuICAgICAgLy8gU2V0dXAgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgc2VsZi5fb25lbmQgPSBvLm9uZW5kID8gW3tmbjogby5vbmVuZH1dIDogW107XG4gICAgICBzZWxmLl9vbmZhZGUgPSBvLm9uZmFkZSA/IFt7Zm46IG8ub25mYWRlfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ubG9hZCA9IG8ub25sb2FkID8gW3tmbjogby5vbmxvYWR9XSA6IFtdO1xuICAgICAgc2VsZi5fb25sb2FkZXJyb3IgPSBvLm9ubG9hZGVycm9yID8gW3tmbjogby5vbmxvYWRlcnJvcn1dIDogW107XG4gICAgICBzZWxmLl9vbnBsYXllcnJvciA9IG8ub25wbGF5ZXJyb3IgPyBbe2ZuOiBvLm9ucGxheWVycm9yfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucGF1c2UgPSBvLm9ucGF1c2UgPyBbe2ZuOiBvLm9ucGF1c2V9XSA6IFtdO1xuICAgICAgc2VsZi5fb25wbGF5ID0gby5vbnBsYXkgPyBbe2ZuOiBvLm9ucGxheX1dIDogW107XG4gICAgICBzZWxmLl9vbnN0b3AgPSBvLm9uc3RvcCA/IFt7Zm46IG8ub25zdG9wfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ubXV0ZSA9IG8ub25tdXRlID8gW3tmbjogby5vbm11dGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb252b2x1bWUgPSBvLm9udm9sdW1lID8gW3tmbjogby5vbnZvbHVtZX1dIDogW107XG4gICAgICBzZWxmLl9vbnJhdGUgPSBvLm9ucmF0ZSA/IFt7Zm46IG8ub25yYXRlfV0gOiBbXTtcbiAgICAgIHNlbGYuX29uc2VlayA9IG8ub25zZWVrID8gW3tmbjogby5vbnNlZWt9XSA6IFtdO1xuICAgICAgc2VsZi5fb251bmxvY2sgPSBvLm9udW5sb2NrID8gW3tmbjogby5vbnVubG9ja31dIDogW107XG4gICAgICBzZWxmLl9vbnJlc3VtZSA9IFtdO1xuXG4gICAgICAvLyBXZWIgQXVkaW8gb3IgSFRNTDUgQXVkaW8/XG4gICAgICBzZWxmLl93ZWJBdWRpbyA9IEhvd2xlci51c2luZ1dlYkF1ZGlvICYmICFzZWxmLl9odG1sNTtcblxuICAgICAgLy8gQXV0b21hdGljYWxseSB0cnkgdG8gZW5hYmxlIGF1ZGlvLlxuICAgICAgaWYgKHR5cGVvZiBIb3dsZXIuY3R4ICE9PSAndW5kZWZpbmVkJyAmJiBIb3dsZXIuY3R4ICYmIEhvd2xlci5hdXRvVW5sb2NrKSB7XG4gICAgICAgIEhvd2xlci5fdW5sb2NrQXVkaW8oKTtcbiAgICAgIH1cblxuICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGlzIEhvd2wgZ3JvdXAgaW4gdGhlIGdsb2JhbCBjb250cm9sbGVyLlxuICAgICAgSG93bGVyLl9ob3dscy5wdXNoKHNlbGYpO1xuXG4gICAgICAvLyBJZiB0aGV5IHNlbGVjdGVkIGF1dG9wbGF5LCBhZGQgYSBwbGF5IGV2ZW50IHRvIHRoZSBsb2FkIHF1ZXVlLlxuICAgICAgaWYgKHNlbGYuX2F1dG9wbGF5KSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAncGxheScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYucGxheSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgdGhlIHNvdXJjZSBmaWxlIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLlxuICAgICAgaWYgKHNlbGYuX3ByZWxvYWQgJiYgc2VsZi5fcHJlbG9hZCAhPT0gJ25vbmUnKSB7XG4gICAgICAgIHNlbGYubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgYXVkaW8gZmlsZS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgdXJsID0gbnVsbDtcblxuICAgICAgLy8gSWYgbm8gYXVkaW8gaXMgYXZhaWxhYmxlLCBxdWl0IGltbWVkaWF0ZWx5LlxuICAgICAgaWYgKEhvd2xlci5ub0F1ZGlvKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdObyBhdWRpbyBzdXBwb3J0LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSBvdXIgc291cmNlIGlzIGluIGFuIGFycmF5LlxuICAgICAgaWYgKHR5cGVvZiBzZWxmLl9zcmMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNlbGYuX3NyYyA9IFtzZWxmLl9zcmNdO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHNvdXJjZXMgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIGNvbXBhdGlibGUuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc3JjLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBleHQsIHN0cjtcblxuICAgICAgICBpZiAoc2VsZi5fZm9ybWF0ICYmIHNlbGYuX2Zvcm1hdFtpXSkge1xuICAgICAgICAgIC8vIElmIGFuIGV4dGVuc2lvbiB3YXMgc3BlY2lmaWVkLCB1c2UgdGhhdCBpbnN0ZWFkLlxuICAgICAgICAgIGV4dCA9IHNlbGYuX2Zvcm1hdFtpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHNvdXJjZSBpcyBhIHN0cmluZy5cbiAgICAgICAgICBzdHIgPSBzZWxmLl9zcmNbaV07XG4gICAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnTm9uLXN0cmluZyBmb3VuZCBpbiBzZWxlY3RlZCBhdWRpbyBzb3VyY2VzIC0gaWdub3JpbmcuJyk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBmaWxlIGV4dGVuc2lvbiBmcm9tIHRoZSBVUkwgb3IgYmFzZTY0IGRhdGEgVVJJLlxuICAgICAgICAgIGV4dCA9IC9eZGF0YTphdWRpb1xcLyhbXjssXSspOy9pLmV4ZWMoc3RyKTtcbiAgICAgICAgICBpZiAoIWV4dCkge1xuICAgICAgICAgICAgZXh0ID0gL1xcLihbXi5dKykkLy5leGVjKHN0ci5zcGxpdCgnPycsIDEpWzBdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICBleHQgPSBleHRbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2cgYSB3YXJuaW5nIGlmIG5vIGV4dGVuc2lvbiB3YXMgZm91bmQuXG4gICAgICAgIGlmICghZXh0KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdObyBmaWxlIGV4dGVuc2lvbiB3YXMgZm91bmQuIENvbnNpZGVyIHVzaW5nIHRoZSBcImZvcm1hdFwiIHByb3BlcnR5IG9yIHNwZWNpZnkgYW4gZXh0ZW5zaW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBleHRlbnNpb24gaXMgYXZhaWxhYmxlLlxuICAgICAgICBpZiAoZXh0ICYmIEhvd2xlci5jb2RlY3MoZXh0KSkge1xuICAgICAgICAgIHVybCA9IHNlbGYuX3NyY1tpXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnTm8gY29kZWMgc3VwcG9ydCBmb3Igc2VsZWN0ZWQgYXVkaW8gc291cmNlcy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9zcmMgPSB1cmw7XG4gICAgICBzZWxmLl9zdGF0ZSA9ICdsb2FkaW5nJztcblxuICAgICAgLy8gSWYgdGhlIGhvc3RpbmcgcGFnZSBpcyBIVFRQUyBhbmQgdGhlIHNvdXJjZSBpc24ndCxcbiAgICAgIC8vIGRyb3AgZG93biB0byBIVE1MNSBBdWRpbyB0byBhdm9pZCBNaXhlZCBDb250ZW50IGVycm9ycy5cbiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonICYmIHVybC5zbGljZSgwLCA1KSA9PT0gJ2h0dHA6Jykge1xuICAgICAgICBzZWxmLl9odG1sNSA9IHRydWU7XG4gICAgICAgIHNlbGYuX3dlYkF1ZGlvID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzb3VuZCBvYmplY3QgYW5kIGFkZCBpdCB0byB0aGUgcG9vbC5cbiAgICAgIG5ldyBTb3VuZChzZWxmKTtcblxuICAgICAgLy8gTG9hZCBhbmQgZGVjb2RlIHRoZSBhdWRpbyBkYXRhIGZvciBwbGF5YmFjay5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICBsb2FkQnVmZmVyKHNlbGYpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGxheSBhIHNvdW5kIG9yIHJlc3VtZSBwcmV2aW91cyBwbGF5YmFjay5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmcvTnVtYmVyfSBzcHJpdGUgICBTcHJpdGUgbmFtZSBmb3Igc3ByaXRlIHBsYXliYWNrIG9yIHNvdW5kIGlkIHRvIGNvbnRpbnVlIHByZXZpb3VzLlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IGludGVybmFsIEludGVybmFsIFVzZTogdHJ1ZSBwcmV2ZW50cyBldmVudCBmaXJpbmcuXG4gICAgICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICBTb3VuZCBJRC5cbiAgICAgKi9cbiAgICBwbGF5OiBmdW5jdGlvbihzcHJpdGUsIGludGVybmFsKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgaWQgPSBudWxsO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgaWYgYSBzcHJpdGUsIHNvdW5kIGlkIG9yIG5vdGhpbmcgd2FzIHBhc3NlZFxuICAgICAgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlkID0gc3ByaXRlO1xuICAgICAgICBzcHJpdGUgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3ByaXRlID09PSAnc3RyaW5nJyAmJiBzZWxmLl9zdGF0ZSA9PT0gJ2xvYWRlZCcgJiYgIXNlbGYuX3Nwcml0ZVtzcHJpdGVdKSB7XG4gICAgICAgIC8vIElmIHRoZSBwYXNzZWQgc3ByaXRlIGRvZXNuJ3QgZXhpc3QsIGRvIG5vdGhpbmcuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3ByaXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgc291bmQgc3ByaXRlIChwbGF5cyB0aGUgZnVsbCBhdWRpbyBsZW5ndGgpLlxuICAgICAgICBzcHJpdGUgPSAnX19kZWZhdWx0JztcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHNpbmdsZSBwYXVzZWQgc291bmQgdGhhdCBpc24ndCBlbmRlZC5cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMsIHBsYXkgdGhhdCBzb3VuZC4gSWYgbm90LCBjb250aW51ZSBhcyB1c3VhbC5cbiAgICAgICAgaWYgKCFzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICAgIHZhciBudW0gPSAwO1xuICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX3BhdXNlZCAmJiAhc2VsZi5fc291bmRzW2ldLl9lbmRlZCkge1xuICAgICAgICAgICAgICBudW0rKztcbiAgICAgICAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbaV0uX2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChudW0gPT09IDEpIHtcbiAgICAgICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBzZWxlY3RlZCBub2RlLCBvciBnZXQgb25lIGZyb20gdGhlIHBvb2wuXG4gICAgICB2YXIgc291bmQgPSBpZCA/IHNlbGYuX3NvdW5kQnlJZChpZCkgOiBzZWxmLl9pbmFjdGl2ZVNvdW5kKCk7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBkb2Vzbid0IGV4aXN0LCBkbyBub3RoaW5nLlxuICAgICAgaWYgKCFzb3VuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2VsZWN0IHRoZSBzcHJpdGUgZGVmaW5pdGlvbi5cbiAgICAgIGlmIChpZCAmJiAhc3ByaXRlKSB7XG4gICAgICAgIHNwcml0ZSA9IHNvdW5kLl9zcHJpdGUgfHwgJ19fZGVmYXVsdCc7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCB3ZSBtdXN0IHdhaXQgdG8gZ2V0IHRoZSBhdWRpbydzIGR1cmF0aW9uLlxuICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdhaXQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHJ1biBpbnRvIHJhY2UgY29uZGl0aW9ucyB3aXRoXG4gICAgICAvLyB0aGUgb3JkZXIgb2YgZnVuY3Rpb24gY2FsbHMuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIC8vIFNldCB0aGUgc3ByaXRlIHZhbHVlIG9uIHRoaXMgc291bmQuXG4gICAgICAgIHNvdW5kLl9zcHJpdGUgPSBzcHJpdGU7XG5cbiAgICAgICAgLy8gTWFyayB0aGlzIHNvdW5kIGFzIG5vdCBlbmRlZCBpbiBjYXNlIGFub3RoZXIgc291bmQgaXMgcGxheWVkIGJlZm9yZSB0aGlzIG9uZSBsb2Fkcy5cbiAgICAgICAgc291bmQuX2VuZGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBzb3VuZCB0byB0aGUgcXVldWUgdG8gYmUgcGxheWVkIG9uIGxvYWQuXG4gICAgICAgIHZhciBzb3VuZElkID0gc291bmQuX2lkO1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ3BsYXknLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLnBsYXkoc291bmRJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc291bmRJZDtcbiAgICAgIH1cblxuICAgICAgLy8gRG9uJ3QgcGxheSB0aGUgc291bmQgaWYgYW4gaWQgd2FzIHBhc3NlZCBhbmQgaXQgaXMgYWxyZWFkeSBwbGF5aW5nLlxuICAgICAgaWYgKGlkICYmICFzb3VuZC5fcGF1c2VkKSB7XG4gICAgICAgIC8vIFRyaWdnZXIgdGhlIHBsYXkgZXZlbnQsIGluIG9yZGVyIHRvIGtlZXAgaXRlcmF0aW5nIHRocm91Z2ggcXVldWUuXG4gICAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICBzZWxmLl9sb2FkUXVldWUoJ3BsYXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzb3VuZC5faWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgQXVkaW9Db250ZXh0IGlzbid0IHN1c3BlbmRlZCwgYW5kIHJlc3VtZSBpdCBpZiBpdCBpcy5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICBIb3dsZXIuX2F1dG9SZXN1bWUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBsb25nIHRvIHBsYXkgZm9yIGFuZCB3aGVyZSB0byBzdGFydCBwbGF5aW5nLlxuICAgICAgdmFyIHNlZWsgPSBNYXRoLm1heCgwLCBzb3VuZC5fc2VlayA+IDAgPyBzb3VuZC5fc2VlayA6IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdIC8gMTAwMCk7XG4gICAgICB2YXIgZHVyYXRpb24gPSBNYXRoLm1heCgwLCAoKHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMV0pIC8gMTAwMCkgLSBzZWVrKTtcbiAgICAgIHZhciB0aW1lb3V0ID0gKGR1cmF0aW9uICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG4gICAgICB2YXIgc3RhcnQgPSBzZWxmLl9zcHJpdGVbc3ByaXRlXVswXSAvIDEwMDA7XG4gICAgICB2YXIgc3RvcCA9IChzZWxmLl9zcHJpdGVbc3ByaXRlXVswXSArIHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzFdKSAvIDEwMDA7XG4gICAgICBzb3VuZC5fc3ByaXRlID0gc3ByaXRlO1xuXG4gICAgICAvLyBNYXJrIHRoZSBzb3VuZCBhcyBlbmRlZCBpbnN0YW50bHkgc28gdGhhdCB0aGlzIGFzeW5jIHBsYXliYWNrXG4gICAgICAvLyBkb2Vzbid0IGdldCBncmFiYmVkIGJ5IGFub3RoZXIgY2FsbCB0byBwbGF5IHdoaWxlIHRoaXMgb25lIHdhaXRzIHRvIHN0YXJ0LlxuICAgICAgc291bmQuX2VuZGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc291bmQuXG4gICAgICB2YXIgc2V0UGFyYW1zID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNvdW5kLl9wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgc291bmQuX3NlZWsgPSBzZWVrO1xuICAgICAgICBzb3VuZC5fc3RhcnQgPSBzdGFydDtcbiAgICAgICAgc291bmQuX3N0b3AgPSBzdG9wO1xuICAgICAgICBzb3VuZC5fbG9vcCA9ICEhKHNvdW5kLl9sb29wIHx8IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzJdKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEVuZCB0aGUgc291bmQgaW5zdGFudGx5IGlmIHNlZWsgaXMgYXQgdGhlIGVuZC5cbiAgICAgIGlmIChzZWVrID49IHN0b3ApIHtcbiAgICAgICAgc2VsZi5fZW5kZWQoc291bmQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEJlZ2luIHRoZSBhY3R1YWwgcGxheWJhY2suXG4gICAgICB2YXIgbm9kZSA9IHNvdW5kLl9ub2RlO1xuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgIC8vIEZpcmUgdGhpcyB3aGVuIHRoZSBzb3VuZCBpcyByZWFkeSB0byBwbGF5IHRvIGJlZ2luIFdlYiBBdWRpbyBwbGF5YmFjay5cbiAgICAgICAgdmFyIHBsYXlXZWJBdWRpbyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gZmFsc2U7XG4gICAgICAgICAgc2V0UGFyYW1zKCk7XG4gICAgICAgICAgc2VsZi5fcmVmcmVzaEJ1ZmZlcihzb3VuZCk7XG5cbiAgICAgICAgICAvLyBTZXR1cCB0aGUgcGxheWJhY2sgcGFyYW1zLlxuICAgICAgICAgIHZhciB2b2wgPSAoc291bmQuX211dGVkIHx8IHNlbGYuX211dGVkKSA/IDAgOiBzb3VuZC5fdm9sdW1lO1xuICAgICAgICAgIG5vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2b2wsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgIHNvdW5kLl9wbGF5U3RhcnQgPSBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lO1xuXG4gICAgICAgICAgLy8gUGxheSB0aGUgc291bmQgdXNpbmcgdGhlIHN1cHBvcnRlZCBtZXRob2QuXG4gICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmJ1ZmZlclNvdXJjZS5zdGFydCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNvdW5kLl9sb29wID8gbm9kZS5idWZmZXJTb3VyY2Uubm90ZUdyYWluT24oMCwgc2VlaywgODY0MDApIDogbm9kZS5idWZmZXJTb3VyY2Uubm90ZUdyYWluT24oMCwgc2VlaywgZHVyYXRpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3VuZC5fbG9vcCA/IG5vZGUuYnVmZmVyU291cmNlLnN0YXJ0KDAsIHNlZWssIDg2NDAwKSA6IG5vZGUuYnVmZmVyU291cmNlLnN0YXJ0KDAsIHNlZWssIGR1cmF0aW9uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdGFydCBhIG5ldyB0aW1lciBpZiBub25lIGlzIHByZXNlbnQuXG4gICAgICAgICAgaWYgKHRpbWVvdXQgIT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSA9IHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIHRpbWVvdXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXknLCBzb3VuZC5faWQpO1xuICAgICAgICAgICAgICBzZWxmLl9sb2FkUXVldWUoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoSG93bGVyLnN0YXRlID09PSAncnVubmluZycgJiYgSG93bGVyLmN0eC5zdGF0ZSAhPT0gJ2ludGVycnVwdGVkJykge1xuICAgICAgICAgIHBsYXlXZWJBdWRpbygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhdWRpbyBjb250ZXh0IHRvIHJlc3VtZSBiZWZvcmUgcGxheWluZy5cbiAgICAgICAgICBzZWxmLm9uY2UoJ3Jlc3VtZScsIHBsYXlXZWJBdWRpbyk7XG5cbiAgICAgICAgICAvLyBDYW5jZWwgdGhlIGVuZCB0aW1lci5cbiAgICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kLl9pZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpcmUgdGhpcyB3aGVuIHRoZSBzb3VuZCBpcyByZWFkeSB0byBwbGF5IHRvIGJlZ2luIEhUTUw1IEF1ZGlvIHBsYXliYWNrLlxuICAgICAgICB2YXIgcGxheUh0bWw1ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbm9kZS5jdXJyZW50VGltZSA9IHNlZWs7XG4gICAgICAgICAgbm9kZS5tdXRlZCA9IHNvdW5kLl9tdXRlZCB8fCBzZWxmLl9tdXRlZCB8fCBIb3dsZXIuX211dGVkIHx8IG5vZGUubXV0ZWQ7XG4gICAgICAgICAgbm9kZS52b2x1bWUgPSBzb3VuZC5fdm9sdW1lICogSG93bGVyLnZvbHVtZSgpO1xuICAgICAgICAgIG5vZGUucGxheWJhY2tSYXRlID0gc291bmQuX3JhdGU7XG5cbiAgICAgICAgICAvLyBTb21lIGJyb3dzZXJzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhpcyBpcyBjYWxsZWQgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcGxheSA9IG5vZGUucGxheSgpO1xuXG4gICAgICAgICAgICAvLyBTdXBwb3J0IG9sZGVyIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwcm9taXNlcywgYW5kIHRodXMgZG9uJ3QgaGF2ZSB0aGlzIGlzc3VlLlxuICAgICAgICAgICAgaWYgKHBsYXkgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIChwbGF5IGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2YgcGxheS50aGVuID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAvLyBJbXBsZW1lbnRzIGEgbG9jayB0byBwcmV2ZW50IERPTUV4Y2VwdGlvbjogVGhlIHBsYXkoKSByZXF1ZXN0IHdhcyBpbnRlcnJ1cHRlZCBieSBhIGNhbGwgdG8gcGF1c2UoKS5cbiAgICAgICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIC8vIFNldCBwYXJhbSB2YWx1ZXMgaW1tZWRpYXRlbHkuXG4gICAgICAgICAgICAgIHNldFBhcmFtcygpO1xuXG4gICAgICAgICAgICAgIC8vIFJlbGVhc2VzIHRoZSBsb2NrIGFuZCBleGVjdXRlcyBxdWV1ZWQgYWN0aW9ucy5cbiAgICAgICAgICAgICAgcGxheVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIG5vZGUuX3VubG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXllcnJvcicsIHNvdW5kLl9pZCwgJ1BsYXliYWNrIHdhcyB1bmFibGUgdG8gc3RhcnQuIFRoaXMgaXMgbW9zdCBjb21tb25seSBhbiBpc3N1ZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29uIG1vYmlsZSBkZXZpY2VzIGFuZCBDaHJvbWUgd2hlcmUgcGxheWJhY2sgd2FzIG5vdCB3aXRoaW4gYSB1c2VyIGludGVyYWN0aW9uLicpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZW5kZWQgYW5kIHBhdXNlZCB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgICBzb3VuZC5fZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgc291bmQuX3BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICBzZXRQYXJhbXMoKTtcbiAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXR0aW5nIHJhdGUgYmVmb3JlIHBsYXlpbmcgd29uJ3Qgd29yayBpbiBJRSwgc28gd2Ugc2V0IGl0IGFnYWluIGhlcmUuXG4gICAgICAgICAgICBub2RlLnBsYXliYWNrUmF0ZSA9IHNvdW5kLl9yYXRlO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBzdGlsbCBwYXVzZWQsIHRoZW4gd2UgY2FuIGFzc3VtZSB0aGVyZSB3YXMgYSBwbGF5YmFjayBpc3N1ZS5cbiAgICAgICAgICAgIGlmIChub2RlLnBhdXNlZCkge1xuICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5ZXJyb3InLCBzb3VuZC5faWQsICdQbGF5YmFjayB3YXMgdW5hYmxlIHRvIHN0YXJ0LiBUaGlzIGlzIG1vc3QgY29tbW9ubHkgYW4gaXNzdWUgJyArXG4gICAgICAgICAgICAgICAgJ29uIG1vYmlsZSBkZXZpY2VzIGFuZCBDaHJvbWUgd2hlcmUgcGxheWJhY2sgd2FzIG5vdCB3aXRoaW4gYSB1c2VyIGludGVyYWN0aW9uLicpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldHVwIHRoZSBlbmQgdGltZXIgb24gc3ByaXRlcyBvciBsaXN0ZW4gZm9yIHRoZSBlbmRlZCBldmVudC5cbiAgICAgICAgICAgIGlmIChzcHJpdGUgIT09ICdfX2RlZmF1bHQnIHx8IHNvdW5kLl9sb29wKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIEZpcmUgZW5kZWQgb24gdGhpcyBhdWRpbyBub2RlLlxuICAgICAgICAgICAgICAgIHNlbGYuX2VuZGVkKHNvdW5kKTtcblxuICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoaXMgbGlzdGVuZXIuXG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdLCBmYWxzZSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheWVycm9yJywgc291bmQuX2lkLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJZiB0aGlzIGlzIHN0cmVhbWluZyBhdWRpbywgbWFrZSBzdXJlIHRoZSBzcmMgaXMgc2V0IGFuZCBsb2FkIGFnYWluLlxuICAgICAgICBpZiAobm9kZS5zcmMgPT09ICdkYXRhOmF1ZGlvL3dhdjtiYXNlNjQsVWtsR1JpZ0FBQUJYUVZaRlptMTBJQklBQUFBQkFBRUFSS3dBQUloWUFRQUNBQkFBQUFCa1lYUmhBZ0FBQUFFQScpIHtcbiAgICAgICAgICBub2RlLnNyYyA9IHNlbGYuX3NyYztcbiAgICAgICAgICBub2RlLmxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBsYXkgaW1tZWRpYXRlbHkgaWYgcmVhZHksIG9yIHdhaXQgZm9yIHRoZSAnY2FucGxheXRocm91Z2gnZSB2ZW50LlxuICAgICAgICB2YXIgbG9hZGVkTm9SZWFkeVN0YXRlID0gKHdpbmRvdyAmJiB3aW5kb3cuZWplY3RhKSB8fCAoIW5vZGUucmVhZHlTdGF0ZSAmJiBIb3dsZXIuX25hdmlnYXRvci5pc0NvY29vbkpTKTtcbiAgICAgICAgaWYgKG5vZGUucmVhZHlTdGF0ZSA+PSAzIHx8IGxvYWRlZE5vUmVhZHlTdGF0ZSkge1xuICAgICAgICAgIHBsYXlIdG1sNSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gQmVnaW4gcGxheWJhY2suXG4gICAgICAgICAgICBwbGF5SHRtbDUoKTtcblxuICAgICAgICAgICAgLy8gQ2xlYXIgdGhpcyBsaXN0ZW5lci5cbiAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgbGlzdGVuZXIsIGZhbHNlKTtcblxuICAgICAgICAgIC8vIENhbmNlbCB0aGUgZW5kIHRpbWVyLlxuICAgICAgICAgIHNlbGYuX2NsZWFyVGltZXIoc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc291bmQuX2lkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXVzZSBwbGF5YmFjayBhbmQgc2F2ZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIElEIChlbXB0eSB0byBwYXVzZSBhbGwgaW4gZ3JvdXApLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgcGF1c2U6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkIG9yIGEgcGxheSgpIHByb21pc2UgaXMgcGVuZGluZywgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIHBhdXNlIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdwYXVzZScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYucGF1c2UoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGlkIGlzIHBhc3NlZCwgZ2V0IGFsbCBJRCdzIHRvIGJlIHBhdXNlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGVuZCB0aW1lci5cbiAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZHNbaV0pO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIGlmIChzb3VuZCAmJiAhc291bmQuX3BhdXNlZCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWVrIHBvc2l0aW9uLlxuICAgICAgICAgIHNvdW5kLl9zZWVrID0gc2VsZi5zZWVrKGlkc1tpXSk7XG4gICAgICAgICAgc291bmQuX3JhdGVTZWVrID0gMDtcbiAgICAgICAgICBzb3VuZC5fcGF1c2VkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIFN0b3AgY3VycmVudGx5IHJ1bm5pbmcgZmFkZXMuXG4gICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRzW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc291bmQgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICAgICAgICAgICAgaWYgKCFzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLm5vdGVPZmYoMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AoMCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgICAgICAgICAgc2VsZi5fY2xlYW5CdWZmZXIoc291bmQuX25vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNOYU4oc291bmQuX25vZGUuZHVyYXRpb24pIHx8IHNvdW5kLl9ub2RlLmR1cmF0aW9uID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcmUgdGhlIHBhdXNlIGV2ZW50LCB1bmxlc3MgYHRydWVgIGlzIHBhc3NlZCBhcyB0aGUgMm5kIGFyZ3VtZW50LlxuICAgICAgICBpZiAoIWFyZ3VtZW50c1sxXSkge1xuICAgICAgICAgIHNlbGYuX2VtaXQoJ3BhdXNlJywgc291bmQgPyBzb3VuZC5faWQgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RvcCBwbGF5YmFjayBhbmQgcmVzZXQgdG8gc3RhcnQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgSUQgKGVtcHR5IHRvIHN0b3AgYWxsIGluIGdyb3VwKS5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBpbnRlcm5hbCBJbnRlcm5hbCBVc2U6IHRydWUgcHJldmVudHMgZXZlbnQgZmlyaW5nLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24oaWQsIGludGVybmFsKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gc3RvcCB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnIHx8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnc3RvcCcsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuc3RvcChpZCwgaW50ZXJuYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGlkIGlzIHBhc3NlZCwgZ2V0IGFsbCBJRCdzIHRvIGJlIHN0b3BwZWQuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBlbmQgdGltZXIuXG4gICAgICAgIHNlbGYuX2NsZWFyVGltZXIoaWRzW2ldKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aGUgc2VlayBwb3NpdGlvbi5cbiAgICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IDA7XG4gICAgICAgICAgc291bmQuX3BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgc291bmQuX2VuZGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIFN0b3AgY3VycmVudGx5IHJ1bm5pbmcgZmFkZXMuXG4gICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRzW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc291bmQncyBBdWRpb0J1ZmZlclNvdXJjZU5vZGUgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uubm90ZU9mZigwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AoMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICAgICAgICAgICAgc2VsZi5fY2xlYW5CdWZmZXIoc291bmQuX25vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc05hTihzb3VuZC5fbm9kZS5kdXJhdGlvbikgfHwgc291bmQuX25vZGUuZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmN1cnJlbnRUaW1lID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnBhdXNlKCk7XG5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxpdmUgc3RyZWFtLCBzdG9wIGRvd25sb2FkIG9uY2UgdGhlIGF1ZGlvIGlzIHN0b3BwZWQuXG4gICAgICAgICAgICAgIGlmIChzb3VuZC5fbm9kZS5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9jbGVhclNvdW5kKHNvdW5kLl9ub2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3N0b3AnLCBzb3VuZC5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXV0ZS91bm11dGUgYSBzaW5nbGUgc291bmQgb3IgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gbXV0ZWQgU2V0IHRvIHRydWUgdG8gbXV0ZSBhbmQgZmFsc2UgdG8gdW5tdXRlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICAgVGhlIHNvdW5kIElEIHRvIHVwZGF0ZSAob21pdCB0byBtdXRlL3VubXV0ZSBhbGwpLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgbXV0ZTogZnVuY3Rpb24obXV0ZWQsIGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gbXV0ZSB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdtdXRlJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5tdXRlKG11dGVkLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYXBwbHlpbmcgbXV0ZS91bm11dGUgdG8gYWxsIHNvdW5kcywgdXBkYXRlIHRoZSBncm91cCdzIHZhbHVlLlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtdXRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgc2VsZi5fbXV0ZWQgPSBtdXRlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fbXV0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgbXV0ZWQuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgIHNvdW5kLl9tdXRlZCA9IG11dGVkO1xuXG4gICAgICAgICAgLy8gQ2FuY2VsIGFjdGl2ZSBmYWRlIGFuZCBzZXQgdGhlIHZvbHVtZSB0byB0aGUgZW5kIHZhbHVlLlxuICAgICAgICAgIGlmIChzb3VuZC5faW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKHNvdW5kLl9pZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKG11dGVkID8gMCA6IHNvdW5kLl92b2x1bWUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLm11dGVkID0gSG93bGVyLl9tdXRlZCA/IHRydWUgOiBtdXRlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdtdXRlJywgc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgdm9sdW1lIG9mIHRoaXMgc291bmQgb3Igb2YgdGhlIEhvd2wgZ3JvdXAuIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICAgKiAgIHZvbHVtZSgpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3Mgdm9sdW1lIHZhbHVlLlxuICAgICAqICAgdm9sdW1lKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGN1cnJlbnQgdm9sdW1lLlxuICAgICAqICAgdm9sdW1lKHZvbCkgLT4gU2V0cyB0aGUgdm9sdW1lIG9mIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqICAgdm9sdW1lKHZvbCwgaWQpIC0+IFNldHMgdGhlIHZvbHVtZSBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9IFJldHVybnMgc2VsZiBvciBjdXJyZW50IHZvbHVtZS5cbiAgICAgKi9cbiAgICB2b2x1bWU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgdm9sLCBpZDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgYmFzZWQgb24gYXJndW1lbnRzLlxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdyb3Vwcycgdm9sdW1lLlxuICAgICAgICByZXR1cm4gc2VsZi5fdm9sdW1lO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSB8fCBhcmdzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgYXJnc1sxXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhbiBJRCwgYW5kIGlmIG5vdCwgYXNzdW1lIGl0IGlzIGEgbmV3IHZvbHVtZS5cbiAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGlkcy5pbmRleE9mKGFyZ3NbMF0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1swXSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZvbCA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPj0gMikge1xuICAgICAgICB2b2wgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgb3IgcmV0dXJuIHRoZSBjdXJyZW50IHZvbHVtZS5cbiAgICAgIHZhciBzb3VuZDtcbiAgICAgIGlmICh0eXBlb2Ygdm9sICE9PSAndW5kZWZpbmVkJyAmJiB2b2wgPj0gMCAmJiB2b2wgPD0gMSkge1xuICAgICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSB2b2x1bWUgd2hlbiBjYXBhYmxlLlxuICAgICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiAndm9sdW1lJyxcbiAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlbGYudm9sdW1lLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwIHZvbHVtZS5cbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzZWxmLl92b2x1bWUgPSB2b2w7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgb25lIG9yIGFsbCB2b2x1bWVzLlxuICAgICAgICBpZCA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZFtpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAgIHNvdW5kLl92b2x1bWUgPSB2b2w7XG5cbiAgICAgICAgICAgIC8vIFN0b3AgY3VycmVudGx5IHJ1bm5pbmcgZmFkZXMuXG4gICAgICAgICAgICBpZiAoIWFyZ3NbMl0pIHtcbiAgICAgICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgIXNvdW5kLl9tdXRlZCkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbXV0ZWQpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUudm9sdW1lID0gdm9sICogSG93bGVyLnZvbHVtZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLl9lbWl0KCd2b2x1bWUnLCBzb3VuZC5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQgPSBpZCA/IHNlbGYuX3NvdW5kQnlJZChpZCkgOiBzZWxmLl9zb3VuZHNbMF07XG4gICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl92b2x1bWUgOiAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmFkZSBhIGN1cnJlbnRseSBwbGF5aW5nIHNvdW5kIGJldHdlZW4gdHdvIHZvbHVtZXMgKGlmIG5vIGlkIGlzIHBhc3NlZCwgYWxsIHNvdW5kcyB3aWxsIGZhZGUpLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gZnJvbSBUaGUgdmFsdWUgdG8gZmFkZSBmcm9tICgwLjAgdG8gMS4wKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHRvICAgVGhlIHZvbHVtZSB0byBmYWRlIHRvICgwLjAgdG8gMS4wKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGxlbiAgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZmFkZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkICAgVGhlIHNvdW5kIGlkIChvbWl0IHRvIGZhZGUgYWxsIHNvdW5kcykuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBmYWRlOiBmdW5jdGlvbihmcm9tLCB0bywgbGVuLCBpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGZhZGUgd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ2ZhZGUnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLmZhZGUoZnJvbSwgdG8sIGxlbiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdG8vZnJvbS9sZW4gdmFsdWVzIGFyZSBudW1iZXJzLlxuICAgICAgZnJvbSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHBhcnNlRmxvYXQoZnJvbSkpLCAxKTtcbiAgICAgIHRvID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgcGFyc2VGbG9hdCh0bykpLCAxKTtcbiAgICAgIGxlbiA9IHBhcnNlRmxvYXQobGVuKTtcblxuICAgICAgLy8gU2V0IHRoZSB2b2x1bWUgdG8gdGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAgc2VsZi52b2x1bWUoZnJvbSwgaWQpO1xuXG4gICAgICAvLyBGYWRlIHRoZSB2b2x1bWUgb2Ygb25lIG9yIGFsbCBzb3VuZHMuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBsaW5lYXIgZmFkZSBvciBmYWxsIGJhY2sgdG8gdGltZW91dHMgd2l0aCBIVE1MNSBBdWRpby5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgLy8gU3RvcCB0aGUgcHJldmlvdXMgZmFkZSBpZiBubyBzcHJpdGUgaXMgYmVpbmcgdXNlZCAob3RoZXJ3aXNlLCB2b2x1bWUgaGFuZGxlcyB0aGlzKS5cbiAgICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZHNbaV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBXZWIgQXVkaW8sIGxldCB0aGUgbmF0aXZlIG1ldGhvZHMgZG8gdGhlIGFjdHVhbCBmYWRlLlxuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiAhc291bmQuX211dGVkKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGN1cnJlbnRUaW1lICsgKGxlbiAvIDEwMDApO1xuICAgICAgICAgICAgc291bmQuX3ZvbHVtZSA9IGZyb207XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKGZyb20sIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4ubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUodG8sIGVuZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fc3RhcnRGYWRlSW50ZXJ2YWwoc291bmQsIGZyb20sIHRvLCBsZW4sIGlkc1tpXSwgdHlwZW9mIGlkID09PSAndW5kZWZpbmVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgaW50ZXJuYWwgaW50ZXJ2YWwgdG8gZmFkZSBhIHNvdW5kLlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gc291bmQgUmVmZXJlbmNlIHRvIHNvdW5kIHRvIGZhZGUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBmcm9tIFRoZSB2YWx1ZSB0byBmYWRlIGZyb20gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdG8gICBUaGUgdm9sdW1lIHRvIGZhZGUgdG8gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gbGVuICBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBmYWRlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICBUaGUgc291bmQgaWQgdG8gZmFkZS5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBpc0dyb3VwICAgSWYgdHJ1ZSwgc2V0IHRoZSB2b2x1bWUgb24gdGhlIGdyb3VwLlxuICAgICAqL1xuICAgIF9zdGFydEZhZGVJbnRlcnZhbDogZnVuY3Rpb24oc291bmQsIGZyb20sIHRvLCBsZW4sIGlkLCBpc0dyb3VwKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgdm9sID0gZnJvbTtcbiAgICAgIHZhciBkaWZmID0gdG8gLSBmcm9tO1xuICAgICAgdmFyIHN0ZXBzID0gTWF0aC5hYnMoZGlmZiAvIDAuMDEpO1xuICAgICAgdmFyIHN0ZXBMZW4gPSBNYXRoLm1heCg0LCAoc3RlcHMgPiAwKSA/IGxlbiAvIHN0ZXBzIDogbGVuKTtcbiAgICAgIHZhciBsYXN0VGljayA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIFN0b3JlIHRoZSB2YWx1ZSBiZWluZyBmYWRlZCB0by5cbiAgICAgIHNvdW5kLl9mYWRlVG8gPSB0bztcblxuICAgICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgdmFsdWUgb24gZWFjaCBpbnRlcnZhbCB0aWNrLlxuICAgICAgc291bmQuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgdm9sdW1lIGJhc2VkIG9uIHRoZSB0aW1lIHNpbmNlIHRoZSBsYXN0IHRpY2suXG4gICAgICAgIHZhciB0aWNrID0gKERhdGUubm93KCkgLSBsYXN0VGljaykgLyBsZW47XG4gICAgICAgIGxhc3RUaWNrID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdm9sICs9IGRpZmYgKiB0aWNrO1xuXG4gICAgICAgIC8vIFJvdW5kIHRvIHdpdGhpbiAyIGRlY2ltYWwgcG9pbnRzLlxuICAgICAgICB2b2wgPSBNYXRoLnJvdW5kKHZvbCAqIDEwMCkgLyAxMDA7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2b2x1bWUgaXMgaW4gdGhlIHJpZ2h0IGJvdW5kcy5cbiAgICAgICAgaWYgKGRpZmYgPCAwKSB7XG4gICAgICAgICAgdm9sID0gTWF0aC5tYXgodG8sIHZvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm9sID0gTWF0aC5taW4odG8sIHZvbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGFuZ2UgdGhlIHZvbHVtZS5cbiAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgc291bmQuX3ZvbHVtZSA9IHZvbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLnZvbHVtZSh2b2wsIHNvdW5kLl9pZCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwJ3Mgdm9sdW1lLlxuICAgICAgICBpZiAoaXNHcm91cCkge1xuICAgICAgICAgIHNlbGYuX3ZvbHVtZSA9IHZvbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdoZW4gdGhlIGZhZGUgaXMgY29tcGxldGUsIHN0b3AgaXQgYW5kIGZpcmUgZXZlbnQuXG4gICAgICAgIGlmICgodG8gPCBmcm9tICYmIHZvbCA8PSB0bykgfHwgKHRvID4gZnJvbSAmJiB2b2wgPj0gdG8pKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzb3VuZC5faW50ZXJ2YWwpO1xuICAgICAgICAgIHNvdW5kLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICAgICAgc291bmQuX2ZhZGVUbyA9IG51bGw7XG4gICAgICAgICAgc2VsZi52b2x1bWUodG8sIHNvdW5kLl9pZCk7XG4gICAgICAgICAgc2VsZi5fZW1pdCgnZmFkZScsIHNvdW5kLl9pZCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHN0ZXBMZW4pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBzdG9wcyB0aGUgY3VycmVudGx5IHBsYXlpbmcgZmFkZSB3aGVuXG4gICAgICogYSBuZXcgZmFkZSBzdGFydHMsIHZvbHVtZSBpcyBjaGFuZ2VkIG9yIHRoZSBzb3VuZCBpcyBzdG9wcGVkLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX3N0b3BGYWRlOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcblxuICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9pbnRlcnZhbCkge1xuICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLmNhbmNlbFNjaGVkdWxlZFZhbHVlcyhIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoc291bmQuX2ludGVydmFsKTtcbiAgICAgICAgc291bmQuX2ludGVydmFsID0gbnVsbDtcbiAgICAgICAgc2VsZi52b2x1bWUoc291bmQuX2ZhZGVUbywgaWQpO1xuICAgICAgICBzb3VuZC5fZmFkZVRvID0gbnVsbDtcbiAgICAgICAgc2VsZi5fZW1pdCgnZmFkZScsIGlkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIGxvb3AgcGFyYW1ldGVyIG9uIGEgc291bmQuIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICAgKiAgIGxvb3AoKSAtPiBSZXR1cm5zIHRoZSBncm91cCdzIGxvb3AgdmFsdWUuXG4gICAgICogICBsb29wKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGxvb3AgdmFsdWUuXG4gICAgICogICBsb29wKGxvb3ApIC0+IFNldHMgdGhlIGxvb3AgdmFsdWUgZm9yIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqICAgbG9vcChsb29wLCBpZCkgLT4gU2V0cyB0aGUgbG9vcCB2YWx1ZSBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9Cb29sZWFufSBSZXR1cm5zIHNlbGYgb3IgY3VycmVudCBsb29wIHZhbHVlLlxuICAgICAqL1xuICAgIGxvb3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgbG9vcCwgaWQsIHNvdW5kO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBmb3IgbG9vcCBhbmQgaWQuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBncm91J3MgbG9vcCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIHNlbGYuX2xvb3A7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbG9vcCA9IGFyZ3NbMF07XG4gICAgICAgICAgc2VsZi5fbG9vcCA9IGxvb3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmV0dXJuIHRoaXMgc291bmQncyBsb29wIHZhbHVlLlxuICAgICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKHBhcnNlSW50KGFyZ3NbMF0sIDEwKSk7XG4gICAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX2xvb3AgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBsb29wID0gYXJnc1swXTtcbiAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGlkIGlzIHBhc3NlZCwgZ2V0IGFsbCBJRCdzIHRvIGJlIGxvb3BlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgc291bmQuX2xvb3AgPSBsb29wO1xuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wID0gbG9vcDtcbiAgICAgICAgICAgIGlmIChsb29wKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wU3RhcnQgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BFbmQgPSBzb3VuZC5fc3RvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIHBsYXliYWNrIHJhdGUgb2YgYSBzb3VuZC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgcmF0ZSgpIC0+IFJldHVybnMgdGhlIGZpcnN0IHNvdW5kIG5vZGUncyBjdXJyZW50IHBsYXliYWNrIHJhdGUuXG4gICAgICogICByYXRlKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cbiAgICAgKiAgIHJhdGUocmF0ZSkgLT4gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBvZiBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgKiAgIHJhdGUocmF0ZSwgaWQpIC0+IFNldHMgdGhlIHBsYXliYWNrIHJhdGUgb2YgcGFzc2VkIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2wvTnVtYmVyfSBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cbiAgICAgKi9cbiAgICByYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdmFyIHJhdGUsIGlkO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gV2Ugd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGZpcnN0IG5vZGUuXG4gICAgICAgIGlkID0gc2VsZi5fc291bmRzWzBdLl9pZDtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhbiBJRCwgYW5kIGlmIG5vdCwgYXNzdW1lIGl0IGlzIGEgbmV3IHJhdGUgdmFsdWUuXG4gICAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcygpO1xuICAgICAgICB2YXIgaW5kZXggPSBpZHMuaW5kZXhPZihhcmdzWzBdKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMF0sIDEwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByYXRlID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByYXRlID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGxheWJhY2sgcmF0ZSBvciByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICB2YXIgc291bmQ7XG4gICAgICBpZiAodHlwZW9mIHJhdGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHBsYXliYWNrIHJhdGUgd2hlbiBjYXBhYmxlLlxuICAgICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnIHx8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgICBldmVudDogJ3JhdGUnLFxuICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2VsZi5yYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwIHJhdGUuXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc2VsZi5fcmF0ZSA9IHJhdGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgb25lIG9yIGFsbCB2b2x1bWVzLlxuICAgICAgICBpZCA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZFtpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3VyIHBvc2l0aW9uIHdoZW4gdGhlIHJhdGUgY2hhbmdlZCBhbmQgdXBkYXRlIHRoZSBwbGF5YmFja1xuICAgICAgICAgICAgLy8gc3RhcnQgcG9zaXRpb24gc28gd2UgY2FuIHByb3Blcmx5IGFkanVzdCB0aGUgc2VlayBwb3NpdGlvbiBmb3IgdGltZSBlbGFwc2VkLlxuICAgICAgICAgICAgaWYgKHNlbGYucGxheWluZyhpZFtpXSkpIHtcbiAgICAgICAgICAgICAgc291bmQuX3JhdGVTZWVrID0gc2VsZi5zZWVrKGlkW2ldKTtcbiAgICAgICAgICAgICAgc291bmQuX3BsYXlTdGFydCA9IHNlbGYuX3dlYkF1ZGlvID8gSG93bGVyLmN0eC5jdXJyZW50VGltZSA6IHNvdW5kLl9wbGF5U3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VuZC5fcmF0ZSA9IHJhdGU7XG5cbiAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgcGxheWJhY2sgcmF0ZS5cbiAgICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShyYXRlLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRpbWVycy5cbiAgICAgICAgICAgIHZhciBzZWVrID0gc2VsZi5zZWVrKGlkW2ldKTtcbiAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9ICgoc2VsZi5fc3ByaXRlW3NvdW5kLl9zcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3NvdW5kLl9zcHJpdGVdWzFdKSAvIDEwMDApIC0gc2VlaztcbiAgICAgICAgICAgIHZhciB0aW1lb3V0ID0gKGR1cmF0aW9uICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IGVuZCB0aW1lciBpZiBzb3VuZCBpcyBhbHJlYWR5IHBsYXlpbmcuXG4gICAgICAgICAgICBpZiAoc2VsZi5fZW5kVGltZXJzW2lkW2ldXSB8fCAhc291bmQuX3BhdXNlZCkge1xuICAgICAgICAgICAgICBzZWxmLl9jbGVhclRpbWVyKGlkW2ldKTtcbiAgICAgICAgICAgICAgc2VsZi5fZW5kVGltZXJzW2lkW2ldXSA9IHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdyYXRlJywgc291bmQuX2lkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX3JhdGUgOiBzZWxmLl9yYXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgc2VlayBwb3NpdGlvbiBvZiBhIHNvdW5kLiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxseSB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAgICogICBzZWVrKCkgLT4gUmV0dXJucyB0aGUgZmlyc3Qgc291bmQgbm9kZSdzIGN1cnJlbnQgc2VlayBwb3NpdGlvbi5cbiAgICAgKiAgIHNlZWsoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgY3VycmVudCBzZWVrIHBvc2l0aW9uLlxuICAgICAqICAgc2VlayhzZWVrKSAtPiBTZXRzIHRoZSBzZWVrIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBzb3VuZCBub2RlLlxuICAgICAqICAgc2VlayhzZWVrLCBpZCkgLT4gU2V0cyB0aGUgc2VlayBwb3NpdGlvbiBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9IFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIHNlZWs6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgc2VlaywgaWQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50cy5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBXZSB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG5vZGUuXG4gICAgICAgIGlkID0gc2VsZi5fc291bmRzWzBdLl9pZDtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhbiBJRCwgYW5kIGlmIG5vdCwgYXNzdW1lIGl0IGlzIGEgbmV3IHNlZWsgcG9zaXRpb24uXG4gICAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcygpO1xuICAgICAgICB2YXIgaW5kZXggPSBpZHMuaW5kZXhPZihhcmdzWzBdKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMF0sIDEwKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLl9zb3VuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbMF0uX2lkO1xuICAgICAgICAgIHNlZWsgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHNlZWsgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gSUQsIGJhaWwgb3V0LlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gc2VlayB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAodHlwZW9mIHNlZWsgPT09ICdudW1iZXInICYmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnc2VlaycsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuc2Vlay5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VlayA9PT0gJ251bWJlcicgJiYgc2VlayA+PSAwKSB7XG4gICAgICAgICAgLy8gUGF1c2UgdGhlIHNvdW5kIGFuZCB1cGRhdGUgcG9zaXRpb24gZm9yIHJlc3RhcnRpbmcgcGxheWJhY2suXG4gICAgICAgICAgdmFyIHBsYXlpbmcgPSBzZWxmLnBsYXlpbmcoaWQpO1xuICAgICAgICAgIGlmIChwbGF5aW5nKSB7XG4gICAgICAgICAgICBzZWxmLnBhdXNlKGlkLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBNb3ZlIHRoZSBwb3NpdGlvbiBvZiB0aGUgdHJhY2sgYW5kIGNhbmNlbCB0aW1lci5cbiAgICAgICAgICBzb3VuZC5fc2VlayA9IHNlZWs7XG4gICAgICAgICAgc291bmQuX2VuZGVkID0gZmFsc2U7XG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZCk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlZWsgcG9zaXRpb24gZm9yIEhUTUw1IEF1ZGlvLlxuICAgICAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgIWlzTmFOKHNvdW5kLl9ub2RlLmR1cmF0aW9uKSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUuY3VycmVudFRpbWUgPSBzZWVrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlZWsgYW5kIGVtaXQgd2hlbiByZWFkeS5cbiAgICAgICAgICB2YXIgc2Vla0FuZEVtaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3NlZWsnLCBpZCk7XG5cbiAgICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIHBsYXliYWNrIGlmIHRoZSBzb3VuZCB3YXMgcGxheWluZy5cbiAgICAgICAgICAgIGlmIChwbGF5aW5nKSB7XG4gICAgICAgICAgICAgIHNlbGYucGxheShpZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBwbGF5IGxvY2sgdG8gYmUgdW5zZXQgYmVmb3JlIGVtaXR0aW5nIChIVE1MNSBBdWRpbykuXG4gICAgICAgICAgaWYgKHBsYXlpbmcgJiYgIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICB2YXIgZW1pdFNlZWsgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKCFzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICAgICAgICAgIHNlZWtBbmRFbWl0KCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChlbWl0U2VlaywgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGVtaXRTZWVrLCAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2Vla0FuZEVtaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICB2YXIgcmVhbFRpbWUgPSBzZWxmLnBsYXlpbmcoaWQpID8gSG93bGVyLmN0eC5jdXJyZW50VGltZSAtIHNvdW5kLl9wbGF5U3RhcnQgOiAwO1xuICAgICAgICAgICAgdmFyIHJhdGVTZWVrID0gc291bmQuX3JhdGVTZWVrID8gc291bmQuX3JhdGVTZWVrIC0gc291bmQuX3NlZWsgOiAwO1xuICAgICAgICAgICAgcmV0dXJuIHNvdW5kLl9zZWVrICsgKHJhdGVTZWVrICsgcmVhbFRpbWUgKiBNYXRoLmFicyhzb3VuZC5fcmF0ZSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc291bmQuX25vZGUuY3VycmVudFRpbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHNwZWNpZmljIHNvdW5kIGlzIGN1cnJlbnRseSBwbGF5aW5nIG9yIG5vdCAoaWYgaWQgaXMgcHJvdmlkZWQpLCBvciBjaGVjayBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIHNvdW5kcyBpbiB0aGUgZ3JvdXAgaXMgcGxheWluZyBvciBub3QuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgaWQgVGhlIHNvdW5kIGlkIHRvIGNoZWNrLiBJZiBub25lIGlzIHBhc3NlZCwgdGhlIHdob2xlIHNvdW5kIGdyb3VwIGlzIGNoZWNrZWQuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiBwbGF5aW5nIGFuZCBmYWxzZSBpZiBub3QuXG4gICAgICovXG4gICAgcGxheWluZzogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gQ2hlY2sgdGhlIHBhc3NlZCBzb3VuZCBJRCAoaWYgYW55KS5cbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZCk7XG4gICAgICAgIHJldHVybiBzb3VuZCA/ICFzb3VuZC5fcGF1c2VkIDogZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgbG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIGNoZWNrIGlmIGFueSBhcmUgcGxheWluZy5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFzZWxmLl9zb3VuZHNbaV0uX3BhdXNlZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkdXJhdGlvbiBvZiB0aGlzIHNvdW5kLiBQYXNzaW5nIGEgc291bmQgaWQgd2lsbCByZXR1cm4gdGhlIHNwcml0ZSBkdXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBpZCB0byBjaGVjay4gSWYgbm9uZSBpcyBwYXNzZWQsIHJldHVybiBmdWxsIHNvdXJjZSBkdXJhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEF1ZGlvIGR1cmF0aW9uIGluIHNlY29uZHMuXG4gICAgICovXG4gICAgZHVyYXRpb246IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZHVyYXRpb24gPSBzZWxmLl9kdXJhdGlvbjtcblxuICAgICAgLy8gSWYgd2UgcGFzcyBhbiBJRCwgZ2V0IHRoZSBzb3VuZCBhbmQgcmV0dXJuIHRoZSBzcHJpdGUgbGVuZ3RoLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBkdXJhdGlvbiA9IHNlbGYuX3Nwcml0ZVtzb3VuZC5fc3ByaXRlXVsxXSAvIDEwMDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkdXJhdGlvbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2FkZWQgc3RhdGUgb2YgdGhpcyBIb3dsLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gJ3VubG9hZGVkJywgJ2xvYWRpbmcnLCAnbG9hZGVkJ1xuICAgICAqL1xuICAgIHN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5sb2FkIGFuZCBkZXN0cm95IHRoZSBjdXJyZW50IEhvd2wgb2JqZWN0LlxuICAgICAqIFRoaXMgd2lsbCBpbW1lZGlhdGVseSBzdG9wIGFsbCBzb3VuZCBpbnN0YW5jZXMgYXR0YWNoZWQgdG8gdGhpcyBncm91cC5cbiAgICAgKi9cbiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBTdG9wIHBsYXlpbmcgYW55IGFjdGl2ZSBzb3VuZHMuXG4gICAgICB2YXIgc291bmRzID0gc2VsZi5fc291bmRzO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPHNvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBTdG9wIHRoZSBzb3VuZCBpZiBpdCBpcyBjdXJyZW50bHkgcGxheWluZy5cbiAgICAgICAgaWYgKCFzb3VuZHNbaV0uX3BhdXNlZCkge1xuICAgICAgICAgIHNlbGYuc3RvcChzb3VuZHNbaV0uX2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIG9yIGRpc2Nvbm5lY3QuXG4gICAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHNvdXJjZSB0byAwLXNlY29uZCBzaWxlbmNlIHRvIHN0b3AgYW55IGRvd25sb2FkaW5nIChleGNlcHQgaW4gSUUpLlxuICAgICAgICAgIHNlbGYuX2NsZWFyU291bmQoc291bmRzW2ldLl9ub2RlKTtcblxuICAgICAgICAgIC8vIFJlbW92ZSBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHNvdW5kc1tpXS5fZXJyb3JGbiwgZmFsc2UpO1xuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBzb3VuZHNbaV0uX2xvYWRGbiwgZmFsc2UpO1xuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNvdW5kc1tpXS5fZW5kRm4sIGZhbHNlKTtcblxuICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIEF1ZGlvIG9iamVjdCBiYWNrIHRvIHRoZSBwb29sLlxuICAgICAgICAgIEhvd2xlci5fcmVsZWFzZUh0bWw1QXVkaW8oc291bmRzW2ldLl9ub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtcHR5IG91dCBhbGwgb2YgdGhlIG5vZGVzLlxuICAgICAgICBkZWxldGUgc291bmRzW2ldLl9ub2RlO1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgdGltZXJzIGFyZSBjbGVhcmVkIG91dC5cbiAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZHNbaV0uX2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIHRoZSByZWZlcmVuY2VzIGluIHRoZSBnbG9iYWwgSG93bGVyIG9iamVjdC5cbiAgICAgIHZhciBpbmRleCA9IEhvd2xlci5faG93bHMuaW5kZXhPZihzZWxmKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIEhvd2xlci5faG93bHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIHRoaXMgc291bmQgZnJvbSB0aGUgY2FjaGUgKGlmIG5vIG90aGVyIEhvd2wgaXMgdXNpbmcgaXQpLlxuICAgICAgdmFyIHJlbUNhY2hlID0gdHJ1ZTtcbiAgICAgIGZvciAoaT0wOyBpPEhvd2xlci5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEhvd2xlci5faG93bHNbaV0uX3NyYyA9PT0gc2VsZi5fc3JjIHx8IHNlbGYuX3NyYy5pbmRleE9mKEhvd2xlci5faG93bHNbaV0uX3NyYykgPj0gMCkge1xuICAgICAgICAgIHJlbUNhY2hlID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNhY2hlICYmIHJlbUNhY2hlKSB7XG4gICAgICAgIGRlbGV0ZSBjYWNoZVtzZWxmLl9zcmNdO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciBnbG9iYWwgZXJyb3JzLlxuICAgICAgSG93bGVyLm5vQXVkaW8gPSBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgb3V0IGBzZWxmYC5cbiAgICAgIHNlbGYuX3N0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgIHNlbGYuX3NvdW5kcyA9IFtdO1xuICAgICAgc2VsZiA9IG51bGw7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnQuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgIExpc3RlbmVyIHRvIGNhbGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIGlkICAgIChvcHRpb25hbCkgT25seSBsaXN0ZW4gdG8gZXZlbnRzIGZvciB0aGlzIHNvdW5kLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gICBvbmNlICAoSU5URVJOQUwpIE1hcmtzIGV2ZW50IHRvIGZpcmUgb25seSBvbmNlLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uKGV2ZW50LCBmbiwgaWQsIG9uY2UpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBzZWxmWydfb24nICsgZXZlbnRdO1xuXG4gICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKG9uY2UgPyB7aWQ6IGlkLCBmbjogZm4sIG9uY2U6IG9uY2V9IDoge2lkOiBpZCwgZm46IGZufSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBjdXN0b20gZXZlbnQuIENhbGwgd2l0aG91dCBwYXJhbWV0ZXJzIHRvIHJlbW92ZSBhbGwgZXZlbnRzLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gICBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAgICBMaXN0ZW5lciB0byByZW1vdmUuIExlYXZlIGVtcHR5IHRvIHJlbW92ZSBhbGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIGlkICAgIChvcHRpb25hbCkgT25seSByZW1vdmUgZXZlbnRzIGZvciB0aGlzIHNvdW5kLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbihldmVudCwgZm4sIGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZXZlbnRzID0gc2VsZlsnX29uJyArIGV2ZW50XTtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgLy8gQWxsb3cgcGFzc2luZyBqdXN0IGFuIGV2ZW50IGFuZCBJRC5cbiAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlkID0gZm47XG4gICAgICAgIGZuID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZuIHx8IGlkKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBldmVudCBzdG9yZSBhbmQgcmVtb3ZlIHRoZSBwYXNzZWQgZnVuY3Rpb24uXG4gICAgICAgIGZvciAoaT0wOyBpPGV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBpc0lkID0gKGlkID09PSBldmVudHNbaV0uaWQpO1xuICAgICAgICAgIGlmIChmbiA9PT0gZXZlbnRzW2ldLmZuICYmIGlzSWQgfHwgIWZuICYmIGlzSWQpIHtcbiAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQpIHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IGFsbCBldmVudHMgb2YgdGhpcyB0eXBlLlxuICAgICAgICBzZWxmWydfb24nICsgZXZlbnRdID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGVhciBvdXQgYWxsIGV2ZW50cyBvZiBldmVyeSB0eXBlLlxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNlbGYpO1xuICAgICAgICBmb3IgKGk9MDsgaTxrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKChrZXlzW2ldLmluZGV4T2YoJ19vbicpID09PSAwKSAmJiBBcnJheS5pc0FycmF5KHNlbGZba2V5c1tpXV0pKSB7XG4gICAgICAgICAgICBzZWxmW2tleXNbaV1dID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnQgYW5kIHJlbW92ZSBpdCBvbmNlIGZpcmVkLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gICBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAgICBMaXN0ZW5lciB0byBjYWxsLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gICBpZCAgICAob3B0aW9uYWwpIE9ubHkgbGlzdGVuIHRvIGV2ZW50cyBmb3IgdGhpcyBzb3VuZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIG9uY2U6IGZ1bmN0aW9uKGV2ZW50LCBmbiwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gU2V0dXAgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgc2VsZi5vbihldmVudCwgZm4sIGlkLCAxKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEVtaXQgYWxsIGV2ZW50cyBvZiBhIHNwZWNpZmljIHR5cGUgYW5kIHBhc3MgdGhlIHNvdW5kIGlkLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZXZlbnQgRXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkICAgIFNvdW5kIElELlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gbXNnICAgTWVzc2FnZSB0byBnbyB3aXRoIGV2ZW50LlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2VtaXQ6IGZ1bmN0aW9uKGV2ZW50LCBpZCwgbXNnKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZXZlbnRzID0gc2VsZlsnX29uJyArIGV2ZW50XTtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGV2ZW50IHN0b3JlIGFuZCBmaXJlIGFsbCBmdW5jdGlvbnMuXG4gICAgICBmb3IgKHZhciBpPWV2ZW50cy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7XG4gICAgICAgIC8vIE9ubHkgZmlyZSB0aGUgbGlzdGVuZXIgaWYgdGhlIGNvcnJlY3QgSUQgaXMgdXNlZC5cbiAgICAgICAgaWYgKCFldmVudHNbaV0uaWQgfHwgZXZlbnRzW2ldLmlkID09PSBpZCB8fCBldmVudCA9PT0gJ2xvYWQnKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLCBpZCwgbXNnKTtcbiAgICAgICAgICB9LmJpbmQoc2VsZiwgZXZlbnRzW2ldLmZuKSwgMCk7XG5cbiAgICAgICAgICAvLyBJZiB0aGlzIGV2ZW50IHdhcyBzZXR1cCB3aXRoIGBvbmNlYCwgcmVtb3ZlIGl0LlxuICAgICAgICAgIGlmIChldmVudHNbaV0ub25jZSkge1xuICAgICAgICAgICAgc2VsZi5vZmYoZXZlbnQsIGV2ZW50c1tpXS5mbiwgZXZlbnRzW2ldLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUGFzcyB0aGUgZXZlbnQgdHlwZSBpbnRvIGxvYWQgcXVldWUgc28gdGhhdCBpdCBjYW4gY29udGludWUgc3RlcHBpbmcuXG4gICAgICBzZWxmLl9sb2FkUXVldWUoZXZlbnQpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUXVldWUgb2YgYWN0aW9ucyBpbml0aWF0ZWQgYmVmb3JlIHRoZSBzb3VuZCBoYXMgbG9hZGVkLlxuICAgICAqIFRoZXNlIHdpbGwgYmUgY2FsbGVkIGluIHNlcXVlbmNlLCB3aXRoIHRoZSBuZXh0IG9ubHkgZmlyaW5nXG4gICAgICogYWZ0ZXIgdGhlIHByZXZpb3VzIGhhcyBmaW5pc2hlZCBleGVjdXRpbmcgKGV2ZW4gaWYgYXN5bmMgbGlrZSBwbGF5KS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9sb2FkUXVldWU6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmIChzZWxmLl9xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0YXNrID0gc2VsZi5fcXVldWVbMF07XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgdGFzayBpZiBhIG1hdGNoaW5nIGV2ZW50IHdhcyBwYXNzZWQuXG4gICAgICAgIGlmICh0YXNrLmV2ZW50ID09PSBldmVudCkge1xuICAgICAgICAgIHNlbGYuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gdGhlIHRhc2sgaWYgbm8gZXZlbnQgdHlwZSBpcyBwYXNzZWQuXG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICB0YXNrLmFjdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHBsYXliYWNrIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgZHVyYXRpb24uXG4gICAgICogQHBhcmFtICB7U291bmR9IHNvdW5kIFRoZSBzb3VuZCBvYmplY3QgdG8gd29yayB3aXRoLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2VuZGVkOiBmdW5jdGlvbihzb3VuZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNwcml0ZSA9IHNvdW5kLl9zcHJpdGU7XG5cbiAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBJRSBhbmQgdGhlcmUgd2FzIG5ldHdvcmsgbGF0ZW5jeSB3ZSBtYXkgYmUgY2xpcHBpbmdcbiAgICAgIC8vIGF1ZGlvIGJlZm9yZSBpdCBjb21wbGV0ZXMgcGxheWluZy4gTGV0cyBjaGVjayB0aGUgbm9kZSB0byBtYWtlIHN1cmUgaXRcbiAgICAgIC8vIGJlbGlldmVzIGl0IGhhcyBjb21wbGV0ZWQsIGJlZm9yZSBlbmRpbmcgdGhlIHBsYXliYWNrLlxuICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiAhc291bmQuX25vZGUucGF1c2VkICYmICFzb3VuZC5fbm9kZS5lbmRlZCAmJiBzb3VuZC5fbm9kZS5jdXJyZW50VGltZSA8IHNvdW5kLl9zdG9wKSB7XG4gICAgICAgIHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIDEwMCk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG91bGQgdGhpcyBzb3VuZCBsb29wP1xuICAgICAgdmFyIGxvb3AgPSAhIShzb3VuZC5fbG9vcCB8fCBzZWxmLl9zcHJpdGVbc3ByaXRlXVsyXSk7XG5cbiAgICAgIC8vIEZpcmUgdGhlIGVuZGVkIGV2ZW50LlxuICAgICAgc2VsZi5fZW1pdCgnZW5kJywgc291bmQuX2lkKTtcblxuICAgICAgLy8gUmVzdGFydCB0aGUgcGxheWJhY2sgZm9yIEhUTUw1IEF1ZGlvIGxvb3AuXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmIGxvb3ApIHtcbiAgICAgICAgc2VsZi5zdG9wKHNvdW5kLl9pZCwgdHJ1ZSkucGxheShzb3VuZC5faWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXN0YXJ0IHRoaXMgdGltZXIgaWYgb24gYSBXZWIgQXVkaW8gbG9vcC5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBsb29wKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ3BsYXknLCBzb3VuZC5faWQpO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICBzb3VuZC5fcGxheVN0YXJ0ID0gSG93bGVyLmN0eC5jdXJyZW50VGltZTtcblxuICAgICAgICB2YXIgdGltZW91dCA9ICgoc291bmQuX3N0b3AgLSBzb3VuZC5fc3RhcnQpICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG4gICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcmsgdGhlIG5vZGUgYXMgcGF1c2VkLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmICFsb29wKSB7XG4gICAgICAgIHNvdW5kLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICBzb3VuZC5fZW5kZWQgPSB0cnVlO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kLl9pZCk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICAgIHNlbGYuX2NsZWFuQnVmZmVyKHNvdW5kLl9ub2RlKTtcblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGF1dG8tc3VzcGVuZCBBdWRpb0NvbnRleHQgaWYgbm8gc291bmRzIGFyZSBzdGlsbCBwbGF5aW5nLlxuICAgICAgICBIb3dsZXIuX2F1dG9TdXNwZW5kKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gdXNpbmcgYSBzcHJpdGUsIGVuZCB0aGUgdHJhY2suXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmICFsb29wKSB7XG4gICAgICAgIHNlbGYuc3RvcChzb3VuZC5faWQsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGVuZCB0aW1lciBmb3IgYSBzb3VuZCBwbGF5YmFjay5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBJRC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9jbGVhclRpbWVyOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoc2VsZi5fZW5kVGltZXJzW2lkXSkge1xuICAgICAgICAvLyBDbGVhciB0aGUgdGltZW91dCBvciByZW1vdmUgdGhlIGVuZGVkIGxpc3RlbmVyLlxuICAgICAgICBpZiAodHlwZW9mIHNlbGYuX2VuZFRpbWVyc1tpZF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fZW5kVGltZXJzW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kVGltZXJzW2lkXSwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBzZWxmLl9lbmRUaW1lcnNbaWRdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzb3VuZCBpZGVudGlmaWVkIGJ5IHRoaXMgSUQsIG9yIHJldHVybiBudWxsLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgU291bmQgSURcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9ICAgIFNvdW5kIG9iamVjdCBvciBudWxsLlxuICAgICAqL1xuICAgIF9zb3VuZEJ5SWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCBmaW5kIHRoZSBvbmUgd2l0aCB0aGlzIElELlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaWQgPT09IHNlbGYuX3NvdW5kc1tpXS5faWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc291bmRzW2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gaW5hY3RpdmUgc291bmQgZnJvbSB0aGUgcG9vbCBvciBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAqIEByZXR1cm4ge1NvdW5kfSBTb3VuZCBwbGF5YmFjayBvYmplY3QuXG4gICAgICovXG4gICAgX2luYWN0aXZlU291bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBzZWxmLl9kcmFpbigpO1xuXG4gICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbmFjdGl2ZSBub2RlIHRvIHJlY3ljbGUuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuX3NvdW5kc1tpXS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGluYWN0aXZlIG5vZGUgd2FzIGZvdW5kLCBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAgcmV0dXJuIG5ldyBTb3VuZChzZWxmKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRHJhaW4gZXhjZXNzIGluYWN0aXZlIHNvdW5kcyBmcm9tIHRoZSBwb29sLlxuICAgICAqL1xuICAgIF9kcmFpbjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgbGltaXQgPSBzZWxmLl9wb29sO1xuICAgICAgdmFyIGNudCA9IDA7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSBsZXNzIHNvdW5kcyB0aGFuIHRoZSBtYXggcG9vbCBzaXplLCB3ZSBhcmUgZG9uZS5cbiAgICAgIGlmIChzZWxmLl9zb3VuZHMubGVuZ3RoIDwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGluYWN0aXZlIHNvdW5kcy5cbiAgICAgIGZvciAoaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5fc291bmRzW2ldLl9lbmRlZCkge1xuICAgICAgICAgIGNudCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBleGNlc3MgaW5hY3RpdmUgc291bmRzLCBnb2luZyBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgZm9yIChpPXNlbGYuX3NvdW5kcy5sZW5ndGggLSAxOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgaWYgKGNudCA8PSBsaW1pdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYXVkaW8gc291cmNlIHdoZW4gdXNpbmcgV2ViIEF1ZGlvLlxuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzZWxmLl9zb3VuZHNbaV0uX25vZGUpIHtcbiAgICAgICAgICAgIHNlbGYuX3NvdW5kc1tpXS5fbm9kZS5kaXNjb25uZWN0KDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSBzb3VuZHMgdW50aWwgd2UgaGF2ZSB0aGUgcG9vbCBzaXplLlxuICAgICAgICAgIHNlbGYuX3NvdW5kcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgY250LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBJRCdzIGZyb20gdGhlIHNvdW5kcyBwb29sLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgT25seSByZXR1cm4gb25lIElEIGlmIG9uZSBpcyBwYXNzZWQuXG4gICAgICogQHJldHVybiB7QXJyYXl9ICAgIEFycmF5IG9mIElEcy5cbiAgICAgKi9cbiAgICBfZ2V0U291bmRJZHM6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBpZHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlkcy5wdXNoKHNlbGYuX3NvdW5kc1tpXS5faWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbaWRdO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBzb3VuZCBiYWNrIGludG8gdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICogQHBhcmFtICB7U291bmR9IHNvdW5kIFRoZSBzb3VuZCBvYmplY3QgdG8gd29yayB3aXRoLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX3JlZnJlc2hCdWZmZXI6IGZ1bmN0aW9uKHNvdW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBidWZmZXIgc291cmNlIGZvciBwbGF5YmFjay5cbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSA9IEhvd2xlci5jdHguY3JlYXRlQnVmZmVyU291cmNlKCk7XG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuYnVmZmVyID0gY2FjaGVbc2VsZi5fc3JjXTtcblxuICAgICAgLy8gQ29ubmVjdCB0byB0aGUgY29ycmVjdCBub2RlLlxuICAgICAgaWYgKHNvdW5kLl9wYW5uZXIpIHtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmNvbm5lY3Qoc291bmQuX3Bhbm5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuY29ubmVjdChzb3VuZC5fbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIGxvb3BpbmcgYW5kIHBsYXliYWNrIHJhdGUuXG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcCA9IHNvdW5kLl9sb29wO1xuICAgICAgaWYgKHNvdW5kLl9sb29wKSB7XG4gICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wU3RhcnQgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BFbmQgPSBzb3VuZC5fc3RvcCB8fCAwO1xuICAgICAgfVxuICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShzb3VuZC5fcmF0ZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IG1lbW9yeSBsZWFrcyBieSBjbGVhbmluZyB1cCB0aGUgYnVmZmVyIHNvdXJjZSBhZnRlciBwbGF5YmFjay5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IG5vZGUgU291bmQncyBhdWRpbyBub2RlIGNvbnRhaW5pbmcgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfY2xlYW5CdWZmZXI6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBpc0lPUyA9IEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCdBcHBsZScpID49IDA7XG5cbiAgICAgIGlmIChIb3dsZXIuX3NjcmF0Y2hCdWZmZXIgJiYgbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgbm9kZS5idWZmZXJTb3VyY2Uub25lbmRlZCA9IG51bGw7XG4gICAgICAgIG5vZGUuYnVmZmVyU291cmNlLmRpc2Nvbm5lY3QoMCk7XG4gICAgICAgIGlmIChpc0lPUykge1xuICAgICAgICAgIHRyeSB7IG5vZGUuYnVmZmVyU291cmNlLmJ1ZmZlciA9IEhvd2xlci5fc2NyYXRjaEJ1ZmZlcjsgfSBjYXRjaChlKSB7fVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlLmJ1ZmZlclNvdXJjZSA9IG51bGw7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNvdXJjZSB0byBhIDAtc2Vjb25kIHNpbGVuY2UgdG8gc3RvcCBhbnkgZG93bmxvYWRpbmcgKGV4Y2VwdCBpbiBJRSkuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBub2RlIEF1ZGlvIG5vZGUgdG8gY2xlYXIuXG4gICAgICovXG4gICAgX2NsZWFyU291bmQ6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBjaGVja0lFID0gL01TSUUgfFRyaWRlbnRcXC8vLnRlc3QoSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIGlmICghY2hlY2tJRSkge1xuICAgICAgICBub2RlLnNyYyA9ICdkYXRhOmF1ZGlvL3dhdjtiYXNlNjQsVWtsR1JpZ0FBQUJYUVZaRlptMTBJQklBQUFBQkFBRUFSS3dBQUloWUFRQUNBQkFBQUFCa1lYUmhBZ0FBQUFFQSc7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBTaW5nbGUgU291bmQgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogU2V0dXAgdGhlIHNvdW5kIG9iamVjdCwgd2hpY2ggZWFjaCBub2RlIGF0dGFjaGVkIHRvIGEgSG93bCBncm91cCBpcyBjb250YWluZWQgaW4uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBob3dsIFRoZSBIb3dsIHBhcmVudCBncm91cC5cbiAgICovXG4gIHZhciBTb3VuZCA9IGZ1bmN0aW9uKGhvd2wpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSBob3dsO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9O1xuICBTb3VuZC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBTb3VuZCBvYmplY3QuXG4gICAgICogQHJldHVybiB7U291bmR9XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBTZXR1cCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLlxuICAgICAgc2VsZi5fbXV0ZWQgPSBwYXJlbnQuX211dGVkO1xuICAgICAgc2VsZi5fbG9vcCA9IHBhcmVudC5fbG9vcDtcbiAgICAgIHNlbGYuX3ZvbHVtZSA9IHBhcmVudC5fdm9sdW1lO1xuICAgICAgc2VsZi5fcmF0ZSA9IHBhcmVudC5fcmF0ZTtcbiAgICAgIHNlbGYuX3NlZWsgPSAwO1xuICAgICAgc2VsZi5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHNlbGYuX2VuZGVkID0gdHJ1ZTtcbiAgICAgIHNlbGYuX3Nwcml0ZSA9ICdfX2RlZmF1bHQnO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBzb3VuZC5cbiAgICAgIHNlbGYuX2lkID0gKytIb3dsZXIuX2NvdW50ZXI7XG5cbiAgICAgIC8vIEFkZCBpdHNlbGYgdG8gdGhlIHBhcmVudCdzIHBvb2wuXG4gICAgICBwYXJlbnQuX3NvdW5kcy5wdXNoKHNlbGYpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIG5ldyBub2RlLlxuICAgICAgc2VsZi5jcmVhdGUoKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgc2V0dXAgYSBuZXcgc291bmQgb2JqZWN0LCB3aGV0aGVyIEhUTUw1IEF1ZGlvIG9yIFdlYiBBdWRpby5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICAgKi9cbiAgICBjcmVhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcbiAgICAgIHZhciB2b2x1bWUgPSAoSG93bGVyLl9tdXRlZCB8fCBzZWxmLl9tdXRlZCB8fCBzZWxmLl9wYXJlbnQuX211dGVkKSA/IDAgOiBzZWxmLl92b2x1bWU7XG5cbiAgICAgIGlmIChwYXJlbnQuX3dlYkF1ZGlvKSB7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgZ2FpbiBub2RlIGZvciBjb250cm9sbGluZyB2b2x1bWUgKHRoZSBzb3VyY2Ugd2lsbCBjb25uZWN0IHRvIHRoaXMpLlxuICAgICAgICBzZWxmLl9ub2RlID0gKHR5cGVvZiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4gPT09ICd1bmRlZmluZWQnKSA/IEhvd2xlci5jdHguY3JlYXRlR2Fpbk5vZGUoKSA6IEhvd2xlci5jdHguY3JlYXRlR2FpbigpO1xuICAgICAgICBzZWxmLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUodm9sdW1lLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc2VsZi5fbm9kZS5wYXVzZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLl9ub2RlLmNvbm5lY3QoSG93bGVyLm1hc3RlckdhaW4pO1xuICAgICAgfSBlbHNlIGlmICghSG93bGVyLm5vQXVkaW8pIHtcbiAgICAgICAgLy8gR2V0IGFuIHVubG9ja2VkIEF1ZGlvIG9iamVjdCBmcm9tIHRoZSBwb29sLlxuICAgICAgICBzZWxmLl9ub2RlID0gSG93bGVyLl9vYnRhaW5IdG1sNUF1ZGlvKCk7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBlcnJvcnMgKGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMtYXV0aG9yLXZpZXcvc3BlYy5odG1sI21lZGlhZXJyb3IpLlxuICAgICAgICBzZWxmLl9lcnJvckZuID0gc2VsZi5fZXJyb3JMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgc2VsZi5fZXJyb3JGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgJ2NhbnBsYXl0aHJvdWdoJyBldmVudCB0byBsZXQgdXMga25vdyB0aGUgc291bmQgaXMgcmVhZHkuXG4gICAgICAgIHNlbGYuX2xvYWRGbiA9IHNlbGYuX2xvYWRMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoSG93bGVyLl9jYW5QbGF5RXZlbnQsIHNlbGYuX2xvYWRGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgdGhlICdlbmRlZCcgZXZlbnQgb24gdGhlIHNvdW5kIHRvIGFjY291bnQgZm9yIGVkZ2UtY2FzZSB3aGVyZVxuICAgICAgICAvLyBhIGZpbml0ZSBzb3VuZCBoYXMgYSBkdXJhdGlvbiBvZiBJbmZpbml0eS5cbiAgICAgICAgc2VsZi5fZW5kRm4gPSBzZWxmLl9lbmRMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kRm4sIGZhbHNlKTtcblxuICAgICAgICAvLyBTZXR1cCB0aGUgbmV3IGF1ZGlvIG5vZGUuXG4gICAgICAgIHNlbGYuX25vZGUuc3JjID0gcGFyZW50Ll9zcmM7XG4gICAgICAgIHNlbGYuX25vZGUucHJlbG9hZCA9IHBhcmVudC5fcHJlbG9hZCA9PT0gdHJ1ZSA/ICdhdXRvJyA6IHBhcmVudC5fcHJlbG9hZDtcbiAgICAgICAgc2VsZi5fbm9kZS52b2x1bWUgPSB2b2x1bWUgKiBIb3dsZXIudm9sdW1lKCk7XG5cbiAgICAgICAgLy8gQmVnaW4gbG9hZGluZyB0aGUgc291cmNlLlxuICAgICAgICBzZWxmLl9ub2RlLmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgc291bmQgdG8gdGhlIG9yaWdpbmFsIHN0YXRlIChmb3IgcmVjeWNsZSkuXG4gICAgICogQHJldHVybiB7U291bmR9XG4gICAgICovXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gUmVzZXQgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgc291bmQuXG4gICAgICBzZWxmLl9tdXRlZCA9IHBhcmVudC5fbXV0ZWQ7XG4gICAgICBzZWxmLl9sb29wID0gcGFyZW50Ll9sb29wO1xuICAgICAgc2VsZi5fdm9sdW1lID0gcGFyZW50Ll92b2x1bWU7XG4gICAgICBzZWxmLl9yYXRlID0gcGFyZW50Ll9yYXRlO1xuICAgICAgc2VsZi5fc2VlayA9IDA7XG4gICAgICBzZWxmLl9yYXRlU2VlayA9IDA7XG4gICAgICBzZWxmLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fZW5kZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fc3ByaXRlID0gJ19fZGVmYXVsdCc7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IElEIHNvIHRoYXQgaXQgaXNuJ3QgY29uZnVzZWQgd2l0aCB0aGUgcHJldmlvdXMgc291bmQuXG4gICAgICBzZWxmLl9pZCA9ICsrSG93bGVyLl9jb3VudGVyO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSFRNTDUgQXVkaW8gZXJyb3IgbGlzdGVuZXIgY2FsbGJhY2suXG4gICAgICovXG4gICAgX2Vycm9yTGlzdGVuZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBGaXJlIGFuIGVycm9yIGV2ZW50IGFuZCBwYXNzIGJhY2sgdGhlIGNvZGUuXG4gICAgICBzZWxmLl9wYXJlbnQuX2VtaXQoJ2xvYWRlcnJvcicsIHNlbGYuX2lkLCBzZWxmLl9ub2RlLmVycm9yID8gc2VsZi5fbm9kZS5lcnJvci5jb2RlIDogMCk7XG5cbiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgIHNlbGYuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBzZWxmLl9lcnJvckZuLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhUTUw1IEF1ZGlvIGNhbnBsYXl0aHJvdWdoIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIF9sb2FkTGlzdGVuZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gUm91bmQgdXAgdGhlIGR1cmF0aW9uIHRvIGFjY291bnQgZm9yIHRoZSBsb3dlciBwcmVjaXNpb24gaW4gSFRNTDUgQXVkaW8uXG4gICAgICBwYXJlbnQuX2R1cmF0aW9uID0gTWF0aC5jZWlsKHNlbGYuX25vZGUuZHVyYXRpb24gKiAxMCkgLyAxMDtcblxuICAgICAgLy8gU2V0dXAgYSBzcHJpdGUgaWYgbm9uZSBpcyBkZWZpbmVkLlxuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcmVudC5fc3ByaXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGFyZW50Ll9zcHJpdGUgPSB7X19kZWZhdWx0OiBbMCwgcGFyZW50Ll9kdXJhdGlvbiAqIDEwMDBdfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudC5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHBhcmVudC5fc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgcGFyZW50Ll9lbWl0KCdsb2FkJyk7XG4gICAgICAgIHBhcmVudC5fbG9hZFF1ZXVlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgIHNlbGYuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgc2VsZi5fbG9hZEZuLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhUTUw1IEF1ZGlvIGVuZGVkIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIF9lbmRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBPbmx5IGhhbmRsZSB0aGUgYGVuZGVkYGAgZXZlbnQgaWYgdGhlIGR1cmF0aW9uIGlzIEluZmluaXR5LlxuICAgICAgaWYgKHBhcmVudC5fZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcGFyZW50IGR1cmF0aW9uIHRvIG1hdGNoIHRoZSByZWFsIGF1ZGlvIGR1cmF0aW9uLlxuICAgICAgICAvLyBSb3VuZCB1cCB0aGUgZHVyYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlIGxvd2VyIHByZWNpc2lvbiBpbiBIVE1MNSBBdWRpby5cbiAgICAgICAgcGFyZW50Ll9kdXJhdGlvbiA9IE1hdGguY2VpbChzZWxmLl9ub2RlLmR1cmF0aW9uICogMTApIC8gMTA7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzcHJpdGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcmVhbCBkdXJhdGlvbi5cbiAgICAgICAgaWYgKHBhcmVudC5fc3ByaXRlLl9fZGVmYXVsdFsxXSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICBwYXJlbnQuX3Nwcml0ZS5fX2RlZmF1bHRbMV0gPSBwYXJlbnQuX2R1cmF0aW9uICogMTAwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJ1biB0aGUgcmVndWxhciBlbmRlZCBtZXRob2QuXG4gICAgICAgIHBhcmVudC5fZW5kZWQoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBsaXN0ZW5lciBzaW5jZSB0aGUgZHVyYXRpb24gaXMgbm93IGNvcnJlY3QuXG4gICAgICBzZWxmLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kRm4sIGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIEhlbHBlciBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHZhciBjYWNoZSA9IHt9O1xuXG4gIC8qKlxuICAgKiBCdWZmZXIgYSBzb3VuZCBmcm9tIFVSTCwgRGF0YSBVUkkgb3IgY2FjaGUgYW5kIGRlY29kZSB0byBhdWRpbyBzb3VyY2UgKFdlYiBBdWRpbyBBUEkpLlxuICAgKiBAcGFyYW0gIHtIb3dsfSBzZWxmXG4gICAqL1xuICB2YXIgbG9hZEJ1ZmZlciA9IGZ1bmN0aW9uKHNlbGYpIHtcbiAgICB2YXIgdXJsID0gc2VsZi5fc3JjO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGNhY2hlZCBhbmQgdXNlIGl0IGluc3RlYWQuXG4gICAgaWYgKGNhY2hlW3VybF0pIHtcbiAgICAgIC8vIFNldCB0aGUgZHVyYXRpb24gZnJvbSB0aGUgY2FjaGUuXG4gICAgICBzZWxmLl9kdXJhdGlvbiA9IGNhY2hlW3VybF0uZHVyYXRpb247XG5cbiAgICAgIC8vIExvYWQgdGhlIHNvdW5kIGludG8gdGhpcyBIb3dsLlxuICAgICAgbG9hZFNvdW5kKHNlbGYpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKC9eZGF0YTpbXjtdKztiYXNlNjQsLy50ZXN0KHVybCkpIHtcbiAgICAgIC8vIERlY29kZSB0aGUgYmFzZTY0IGRhdGEgVVJJIHdpdGhvdXQgWEhSLCBzaW5jZSBzb21lIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgaXQuXG4gICAgICB2YXIgZGF0YSA9IGF0b2IodXJsLnNwbGl0KCcsJylbMV0pO1xuICAgICAgdmFyIGRhdGFWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGF0YVZpZXdbaV0gPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgICB9XG5cbiAgICAgIGRlY29kZUF1ZGlvRGF0YShkYXRhVmlldy5idWZmZXIsIHNlbGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMb2FkIHRoZSBidWZmZXIgZnJvbSB0aGUgVVJMLlxuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgeGhyLm9wZW4oc2VsZi5feGhyLm1ldGhvZCwgdXJsLCB0cnVlKTtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBzZWxmLl94aHIud2l0aENyZWRlbnRpYWxzO1xuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG5cbiAgICAgIC8vIEFwcGx5IGFueSBjdXN0b20gaGVhZGVycyB0byB0aGUgcmVxdWVzdC5cbiAgICAgIGlmIChzZWxmLl94aHIuaGVhZGVycykge1xuICAgICAgICBPYmplY3Qua2V5cyhzZWxmLl94aHIuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIHNlbGYuX3hoci5oZWFkZXJzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZ2V0IGEgc3VjY2Vzc2Z1bCByZXNwb25zZSBiYWNrLlxuICAgICAgICB2YXIgY29kZSA9ICh4aHIuc3RhdHVzICsgJycpWzBdO1xuICAgICAgICBpZiAoY29kZSAhPT0gJzAnICYmIGNvZGUgIT09ICcyJyAmJiBjb2RlICE9PSAnMycpIHtcbiAgICAgICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnRmFpbGVkIGxvYWRpbmcgYXVkaW8gZmlsZSB3aXRoIHN0YXR1czogJyArIHhoci5zdGF0dXMgKyAnLicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZUF1ZGlvRGF0YSh4aHIucmVzcG9uc2UsIHNlbGYpO1xuICAgICAgfTtcbiAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGVycm9yLCBzd2l0Y2ggdG8gSFRNTDUgQXVkaW8uXG4gICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIHNlbGYuX2h0bWw1ID0gdHJ1ZTtcbiAgICAgICAgICBzZWxmLl93ZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgICAgIHNlbGYuX3NvdW5kcyA9IFtdO1xuICAgICAgICAgIGRlbGV0ZSBjYWNoZVt1cmxdO1xuICAgICAgICAgIHNlbGYubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc2FmZVhoclNlbmQoeGhyKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIFhIUiByZXF1ZXN0IHdyYXBwZWQgaW4gYSB0cnkvY2F0Y2guXG4gICAqIEBwYXJhbSAge09iamVjdH0geGhyIFhIUiB0byBzZW5kLlxuICAgKi9cbiAgdmFyIHNhZmVYaHJTZW5kID0gZnVuY3Rpb24oeGhyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHhoci5zZW5kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgeGhyLm9uZXJyb3IoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY29kZSBhdWRpbyBkYXRhIGZyb20gYW4gYXJyYXkgYnVmZmVyLlxuICAgKiBAcGFyYW0gIHtBcnJheUJ1ZmZlcn0gYXJyYXlidWZmZXIgVGhlIGF1ZGlvIGRhdGEuXG4gICAqIEBwYXJhbSAge0hvd2x9ICAgICAgICBzZWxmXG4gICAqL1xuICB2YXIgZGVjb2RlQXVkaW9EYXRhID0gZnVuY3Rpb24oYXJyYXlidWZmZXIsIHNlbGYpIHtcbiAgICAvLyBGaXJlIGEgbG9hZCBlcnJvciBpZiBzb21ldGhpbmcgYnJva2UuXG4gICAgdmFyIGVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnRGVjb2RpbmcgYXVkaW8gZGF0YSBmYWlsZWQuJyk7XG4gICAgfTtcblxuICAgIC8vIExvYWQgdGhlIHNvdW5kIG9uIHN1Y2Nlc3MuXG4gICAgdmFyIHN1Y2Nlc3MgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgIGlmIChidWZmZXIgJiYgc2VsZi5fc291bmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2FjaGVbc2VsZi5fc3JjXSA9IGJ1ZmZlcjtcbiAgICAgICAgbG9hZFNvdW5kKHNlbGYsIGJ1ZmZlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBEZWNvZGUgdGhlIGJ1ZmZlciBpbnRvIGFuIGF1ZGlvIHNvdXJjZS5cbiAgICBpZiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIEhvd2xlci5jdHguZGVjb2RlQXVkaW9EYXRhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgSG93bGVyLmN0eC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlidWZmZXIpLnRoZW4oc3VjY2VzcykuY2F0Y2goZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBIb3dsZXIuY3R4LmRlY29kZUF1ZGlvRGF0YShhcnJheWJ1ZmZlciwgc3VjY2VzcywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb3VuZCBpcyBub3cgbG9hZGVkLCBzbyBmaW5pc2ggc2V0dGluZyBldmVyeXRoaW5nIHVwIGFuZCBmaXJlIHRoZSBsb2FkZWQgZXZlbnQuXG4gICAqIEBwYXJhbSAge0hvd2x9IHNlbGZcbiAgICogQHBhcmFtICB7T2JqZWN0fSBidWZmZXIgVGhlIGRlY29kZWQgYnVmZmVyIHNvdW5kIHNvdXJjZS5cbiAgICovXG4gIHZhciBsb2FkU291bmQgPSBmdW5jdGlvbihzZWxmLCBidWZmZXIpIHtcbiAgICAvLyBTZXQgdGhlIGR1cmF0aW9uLlxuICAgIGlmIChidWZmZXIgJiYgIXNlbGYuX2R1cmF0aW9uKSB7XG4gICAgICBzZWxmLl9kdXJhdGlvbiA9IGJ1ZmZlci5kdXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBTZXR1cCBhIHNwcml0ZSBpZiBub25lIGlzIGRlZmluZWQuXG4gICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuX3Nwcml0ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxmLl9zcHJpdGUgPSB7X19kZWZhdWx0OiBbMCwgc2VsZi5fZHVyYXRpb24gKiAxMDAwXX07XG4gICAgfVxuXG4gICAgLy8gRmlyZSB0aGUgbG9hZGVkIGV2ZW50LlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ2xvYWRlZCc7XG4gICAgICBzZWxmLl9lbWl0KCdsb2FkJyk7XG4gICAgICBzZWxmLl9sb2FkUXVldWUoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBhdWRpbyBjb250ZXh0IHdoZW4gYXZhaWxhYmxlLCBvciBzd2l0Y2ggdG8gSFRNTDUgQXVkaW8gbW9kZS5cbiAgICovXG4gIHZhciBzZXR1cEF1ZGlvQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIElmIHdlIGhhdmUgYWxyZWFkeSBkZXRlY3RlZCB0aGF0IFdlYiBBdWRpbyBpc24ndCBzdXBwb3J0ZWQsIGRvbid0IHJ1biB0aGlzIHN0ZXAgYWdhaW4uXG4gICAgaWYgKCFIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHdlIGFyZSB1c2luZyBXZWIgQXVkaW8gYW5kIHNldHVwIHRoZSBBdWRpb0NvbnRleHQgaWYgd2UgYXJlLlxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIEF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgSG93bGVyLmN0eCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdlYmtpdEF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgSG93bGVyLmN0eCA9IG5ldyB3ZWJraXRBdWRpb0NvbnRleHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhdWRpbyBjb250ZXh0IGNyZWF0aW9uIHN0aWxsIGZhaWxlZCwgc2V0IHVzaW5nIHdlYiBhdWRpbyB0byBmYWxzZS5cbiAgICBpZiAoIUhvd2xlci5jdHgpIHtcbiAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSB3ZWJ2aWV3IGlzIGJlaW5nIHVzZWQgb24gaU9TOCBvciBlYXJsaWVyIChyYXRoZXIgdGhhbiB0aGUgYnJvd3NlcikuXG4gICAgLy8gSWYgaXQgaXMsIGRpc2FibGUgV2ViIEF1ZGlvIGFzIGl0IGNhdXNlcyBjcmFzaGluZy5cbiAgICB2YXIgaU9TID0gKC9pUChob25lfG9kfGFkKS8udGVzdChIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci5wbGF0Zm9ybSkpO1xuICAgIHZhciBhcHBWZXJzaW9uID0gSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvT1MgKFxcZCspXyhcXGQrKV8/KFxcZCspPy8pO1xuICAgIHZhciB2ZXJzaW9uID0gYXBwVmVyc2lvbiA/IHBhcnNlSW50KGFwcFZlcnNpb25bMV0sIDEwKSA6IG51bGw7XG4gICAgaWYgKGlPUyAmJiB2ZXJzaW9uICYmIHZlcnNpb24gPCA5KSB7XG4gICAgICB2YXIgc2FmYXJpID0gL3NhZmFyaS8udGVzdChIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XG4gICAgICBpZiAoSG93bGVyLl9uYXZpZ2F0b3IgJiYgIXNhZmFyaSkge1xuICAgICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbmQgZXhwb3NlIHRoZSBtYXN0ZXIgR2Fpbk5vZGUgd2hlbiB1c2luZyBXZWIgQXVkaW8gKHVzZWZ1bCBmb3IgcGx1Z2lucyBvciBhZHZhbmNlZCB1c2FnZSkuXG4gICAgaWYgKEhvd2xlci51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICBIb3dsZXIubWFzdGVyR2FpbiA9ICh0eXBlb2YgSG93bGVyLmN0eC5jcmVhdGVHYWluID09PSAndW5kZWZpbmVkJykgPyBIb3dsZXIuY3R4LmNyZWF0ZUdhaW5Ob2RlKCkgOiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgIEhvd2xlci5tYXN0ZXJHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUoSG93bGVyLl9tdXRlZCA/IDAgOiBIb3dsZXIuX3ZvbHVtZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICBIb3dsZXIubWFzdGVyR2Fpbi5jb25uZWN0KEhvd2xlci5jdHguZGVzdGluYXRpb24pO1xuICAgIH1cblxuICAgIC8vIFJlLXJ1biB0aGUgc2V0dXAgb24gSG93bGVyLlxuICAgIEhvd2xlci5fc2V0dXAoKTtcbiAgfTtcblxuICAvLyBBZGQgc3VwcG9ydCBmb3IgQU1EIChBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24pIGxpYnJhcmllcyBzdWNoIGFzIHJlcXVpcmUuanMuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgSG93bGVyOiBIb3dsZXIsXG4gICAgICAgIEhvd2w6IEhvd2xcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBBZGQgc3VwcG9ydCBmb3IgQ29tbW9uSlMgbGlicmFyaWVzIHN1Y2ggYXMgYnJvd3NlcmlmeS5cbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMuSG93bGVyID0gSG93bGVyO1xuICAgIGV4cG9ydHMuSG93bCA9IEhvd2w7XG4gIH1cblxuICAvLyBBZGQgdG8gZ2xvYmFsIGluIE5vZGUuanMgKGZvciB0ZXN0aW5nLCBldGMpLlxuICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBnbG9iYWwuSG93bGVyR2xvYmFsID0gSG93bGVyR2xvYmFsO1xuICAgIGdsb2JhbC5Ib3dsZXIgPSBIb3dsZXI7XG4gICAgZ2xvYmFsLkhvd2wgPSBIb3dsO1xuICAgIGdsb2JhbC5Tb3VuZCA9IFNvdW5kO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7ICAvLyBEZWZpbmUgZ2xvYmFsbHkgaW4gY2FzZSBBTUQgaXMgbm90IGF2YWlsYWJsZSBvciB1bnVzZWQuXG4gICAgd2luZG93Lkhvd2xlckdsb2JhbCA9IEhvd2xlckdsb2JhbDtcbiAgICB3aW5kb3cuSG93bGVyID0gSG93bGVyO1xuICAgIHdpbmRvdy5Ib3dsID0gSG93bDtcbiAgICB3aW5kb3cuU291bmQgPSBTb3VuZDtcbiAgfVxufSkoKTtcblxuXG4vKiFcbiAqICBTcGF0aWFsIFBsdWdpbiAtIEFkZHMgc3VwcG9ydCBmb3Igc3RlcmVvIGFuZCAzRCBhdWRpbyB3aGVyZSBXZWIgQXVkaW8gaXMgc3VwcG9ydGVkLlxuICogIFxuICogIGhvd2xlci5qcyB2Mi4yLjFcbiAqICBob3dsZXJqcy5jb21cbiAqXG4gKiAgKGMpIDIwMTMtMjAyMCwgSmFtZXMgU2ltcHNvbiBvZiBHb2xkRmlyZSBTdHVkaW9zXG4gKiAgZ29sZGZpcmVzdHVkaW9zLmNvbVxuICpcbiAqICBNSVQgTGljZW5zZVxuICovXG5cbihmdW5jdGlvbigpIHtcblxuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gU2V0dXAgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlLl9wb3MgPSBbMCwgMCwgMF07XG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUuX29yaWVudGF0aW9uID0gWzAsIDAsIC0xLCAwLCAxLCAwXTtcblxuICAvKiogR2xvYmFsIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gdXBkYXRlIHRoZSBzdGVyZW8gcGFubmluZyBwb3NpdGlvbiBvZiBhbGwgY3VycmVudCBIb3dscy5cbiAgICogRnV0dXJlIEhvd2xzIHdpbGwgbm90IHVzZSB0aGlzIHZhbHVlIHVubGVzcyBleHBsaWNpdGx5IHNldC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBwYW4gQSB2YWx1ZSBvZiAtMS4wIGlzIGFsbCB0aGUgd2F5IGxlZnQgYW5kIDEuMCBpcyBhbGwgdGhlIHdheSByaWdodC5cbiAgICogQHJldHVybiB7SG93bGVyL051bWJlcn0gICAgIFNlbGYgb3IgY3VycmVudCBzdGVyZW8gcGFubmluZyB2YWx1ZS5cbiAgICovXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUuc3RlcmVvID0gZnVuY3Rpb24ocGFuKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLmN0eCB8fCAhc2VsZi5jdHgubGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgSG93bHMgYW5kIHVwZGF0ZSB0aGVpciBzdGVyZW8gcGFubmluZy5cbiAgICBmb3IgKHZhciBpPXNlbGYuX2hvd2xzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgIHNlbGYuX2hvd2xzW2ldLnN0ZXJlbyhwYW4pO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbGlzdGVuZXIgaW4gM0QgY2FydGVzaWFuIHNwYWNlLiBTb3VuZHMgdXNpbmdcbiAgICogM0QgcG9zaXRpb24gd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbGlzdGVuZXIncyBwb3NpdGlvbi5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4IFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5IFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6IFRoZSB6LXBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHJldHVybiB7SG93bGVyL0FycmF5fSAgIFNlbGYgb3IgY3VycmVudCBsaXN0ZW5lciBwb3NpdGlvbi5cbiAgICovXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUucG9zID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5jdHggfHwgIXNlbGYuY3R4Lmxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHRzIGZvciBvcHRpb25hbCAneScgJiAneicuXG4gICAgeSA9ICh0eXBlb2YgeSAhPT0gJ251bWJlcicpID8gc2VsZi5fcG9zWzFdIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9wb3NbMl0gOiB6O1xuXG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgc2VsZi5fcG9zID0gW3gsIHksIHpdO1xuXG4gICAgICBpZiAodHlwZW9mIHNlbGYuY3R4Lmxpc3RlbmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIucG9zaXRpb25YLnNldFRhcmdldEF0VGltZShzZWxmLl9wb3NbMF0sIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnBvc2l0aW9uWS5zZXRUYXJnZXRBdFRpbWUoc2VsZi5fcG9zWzFdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5wb3NpdGlvblouc2V0VGFyZ2V0QXRUaW1lKHNlbGYuX3Bvc1syXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnNldFBvc2l0aW9uKHNlbGYuX3Bvc1swXSwgc2VsZi5fcG9zWzFdLCBzZWxmLl9wb3NbMl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2VsZi5fcG9zO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBkaXJlY3Rpb24gdGhlIGxpc3RlbmVyIGlzIHBvaW50aW5nIGluIHRoZSAzRCBjYXJ0ZXNpYW4gc3BhY2UuXG4gICAqIEEgZnJvbnQgYW5kIHVwIHZlY3RvciBtdXN0IGJlIHByb3ZpZGVkLiBUaGUgZnJvbnQgaXMgdGhlIGRpcmVjdGlvbiB0aGVcbiAgICogZmFjZSBvZiB0aGUgbGlzdGVuZXIgaXMgcG9pbnRpbmcsIGFuZCB1cCBpcyB0aGUgZGlyZWN0aW9uIHRoZSB0b3Agb2YgdGhlXG4gICAqIGxpc3RlbmVyIGlzIHBvaW50aW5nLiBUaHVzLCB0aGVzZSB2YWx1ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGF0IHJpZ2h0IGFuZ2xlc1xuICAgKiBmcm9tIGVhY2ggb3RoZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geCAgIFRoZSB4LW9yaWVudGF0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5ICAgVGhlIHktb3JpZW50YXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogICBUaGUgei1vcmllbnRhdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geFVwIFRoZSB4LW9yaWVudGF0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHlVcCBUaGUgeS1vcmllbnRhdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6VXAgVGhlIHotb3JpZW50YXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEByZXR1cm4ge0hvd2xlci9BcnJheX0gICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBvcmllbnRhdGlvbiB2ZWN0b3JzLlxuICAgKi9cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IGZ1bmN0aW9uKHgsIHksIHosIHhVcCwgeVVwLCB6VXApIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuY3R4IHx8ICFzZWxmLmN0eC5saXN0ZW5lcikge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgJ3knICYgJ3onLlxuICAgIHZhciBvciA9IHNlbGYuX29yaWVudGF0aW9uO1xuICAgIHkgPSAodHlwZW9mIHkgIT09ICdudW1iZXInKSA/IG9yWzFdIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyBvclsyXSA6IHo7XG4gICAgeFVwID0gKHR5cGVvZiB4VXAgIT09ICdudW1iZXInKSA/IG9yWzNdIDogeFVwO1xuICAgIHlVcCA9ICh0eXBlb2YgeVVwICE9PSAnbnVtYmVyJykgPyBvcls0XSA6IHlVcDtcbiAgICB6VXAgPSAodHlwZW9mIHpVcCAhPT0gJ251bWJlcicpID8gb3JbNV0gOiB6VXA7XG5cbiAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IFt4LCB5LCB6LCB4VXAsIHlVcCwgelVwXTtcblxuICAgICAgaWYgKHR5cGVvZiBzZWxmLmN0eC5saXN0ZW5lci5mb3J3YXJkWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuZm9yd2FyZFguc2V0VGFyZ2V0QXRUaW1lKHgsIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLmZvcndhcmRZLnNldFRhcmdldEF0VGltZSh5LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5mb3J3YXJkWi5zZXRUYXJnZXRBdFRpbWUoeiwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIudXBYLnNldFRhcmdldEF0VGltZSh4VXAsIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnVwWS5zZXRUYXJnZXRBdFRpbWUoeVVwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci51cFouc2V0VGFyZ2V0QXRUaW1lKHpVcCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnNldE9yaWVudGF0aW9uKHgsIHksIHosIHhVcCwgeVVwLCB6VXApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqIEdyb3VwIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEFkZCBuZXcgcHJvcGVydGllcyB0byB0aGUgY29yZSBpbml0LlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gX3N1cGVyIENvcmUgaW5pdCBtZXRob2QuXG4gICAqIEByZXR1cm4ge0hvd2x9XG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5pbml0ID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFNldHVwIHVzZXItZGVmaW5lZCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IG8ub3JpZW50YXRpb24gfHwgWzEsIDAsIDBdO1xuICAgICAgc2VsZi5fc3RlcmVvID0gby5zdGVyZW8gfHwgbnVsbDtcbiAgICAgIHNlbGYuX3BvcyA9IG8ucG9zIHx8IG51bGw7XG4gICAgICBzZWxmLl9wYW5uZXJBdHRyID0ge1xuICAgICAgICBjb25lSW5uZXJBbmdsZTogdHlwZW9mIG8uY29uZUlubmVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lSW5uZXJBbmdsZSA6IDM2MCxcbiAgICAgICAgY29uZU91dGVyQW5nbGU6IHR5cGVvZiBvLmNvbmVPdXRlckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyQW5nbGUgOiAzNjAsXG4gICAgICAgIGNvbmVPdXRlckdhaW46IHR5cGVvZiBvLmNvbmVPdXRlckdhaW4gIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJHYWluIDogMCxcbiAgICAgICAgZGlzdGFuY2VNb2RlbDogdHlwZW9mIG8uZGlzdGFuY2VNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLmRpc3RhbmNlTW9kZWwgOiAnaW52ZXJzZScsXG4gICAgICAgIG1heERpc3RhbmNlOiB0eXBlb2Ygby5tYXhEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLm1heERpc3RhbmNlIDogMTAwMDAsXG4gICAgICAgIHBhbm5pbmdNb2RlbDogdHlwZW9mIG8ucGFubmluZ01vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmluZ01vZGVsIDogJ0hSVEYnLFxuICAgICAgICByZWZEaXN0YW5jZTogdHlwZW9mIG8ucmVmRGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5yZWZEaXN0YW5jZSA6IDEsXG4gICAgICAgIHJvbGxvZmZGYWN0b3I6IHR5cGVvZiBvLnJvbGxvZmZGYWN0b3IgIT09ICd1bmRlZmluZWQnID8gby5yb2xsb2ZmRmFjdG9yIDogMVxuICAgICAgfTtcblxuICAgICAgLy8gU2V0dXAgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgc2VsZi5fb25zdGVyZW8gPSBvLm9uc3RlcmVvID8gW3tmbjogby5vbnN0ZXJlb31dIDogW107XG4gICAgICBzZWxmLl9vbnBvcyA9IG8ub25wb3MgPyBbe2ZuOiBvLm9ucG9zfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ub3JpZW50YXRpb24gPSBvLm9ub3JpZW50YXRpb24gPyBbe2ZuOiBvLm9ub3JpZW50YXRpb259XSA6IFtdO1xuXG4gICAgICAvLyBDb21wbGV0ZSBpbml0aWxpemF0aW9uIHdpdGggaG93bGVyLmpzIGNvcmUncyBpbml0IGZ1bmN0aW9uLlxuICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIG8pO1xuICAgIH07XG4gIH0pKEhvd2wucHJvdG90eXBlLmluaXQpO1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBzdGVyZW8gcGFubmluZyBvZiB0aGUgYXVkaW8gc291cmNlIGZvciB0aGlzIHNvdW5kIG9yIGFsbCBpbiB0aGUgZ3JvdXAuXG4gICAqIEBwYXJhbSAge051bWJlcn0gcGFuICBBIHZhbHVlIG9mIC0xLjAgaXMgYWxsIHRoZSB3YXkgbGVmdCBhbmQgMS4wIGlzIGFsbCB0aGUgd2F5IHJpZ2h0LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIChvcHRpb25hbCkgVGhlIHNvdW5kIElELiBJZiBub25lIGlzIHBhc3NlZCwgYWxsIGluIGdyb3VwIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9ICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBzdGVyZW8gcGFubmluZyB2YWx1ZS5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLnN0ZXJlbyA9IGZ1bmN0aW9uKHBhbiwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSBzdGVyZW8gcGFuIHdoZW4gY2FwYWJsZS5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdzdGVyZW8nLFxuICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuc3RlcmVvKHBhbiwgaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIFBhbm5lclN0ZXJlb05vZGUgc3VwcG9ydCBhbmQgZmFsbGJhY2sgdG8gUGFubmVyTm9kZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgIHZhciBwYW5uZXJUeXBlID0gKHR5cGVvZiBIb3dsZXIuY3R4LmNyZWF0ZVN0ZXJlb1Bhbm5lciA9PT0gJ3VuZGVmaW5lZCcpID8gJ3NwYXRpYWwnIDogJ3N0ZXJlbyc7XG5cbiAgICAvLyBTZXR1cCB0aGUgZ3JvdXAncyBzdGVyZW8gcGFubmluZyBpZiBubyBJRCBpcyBwYXNzZWQuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBzdGVyZW8gcGFubmluZyBpZiBubyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuXG4gICAgICBpZiAodHlwZW9mIHBhbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2VsZi5fc3RlcmVvID0gcGFuO1xuICAgICAgICBzZWxmLl9wb3MgPSBbcGFuLCAwLCAwXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9zdGVyZW87XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIHRoZSBzdHJlbyBwYW5uaW5nIG9mIG9uZSBvciBhbGwgc291bmRzIGluIGdyb3VwLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgc291bmQuX3N0ZXJlbyA9IHBhbjtcbiAgICAgICAgICBzb3VuZC5fcG9zID0gW3BhbiwgMCwgMF07XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBmYWxsaW5nIGJhY2ssIG1ha2Ugc3VyZSB0aGUgcGFubmluZ01vZGVsIGlzIGVxdWFscG93ZXIuXG4gICAgICAgICAgICBzb3VuZC5fcGFubmVyQXR0ci5wYW5uaW5nTW9kZWwgPSAnZXF1YWxwb3dlcic7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcGFubmVyIHNldHVwIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIG5vdC5cbiAgICAgICAgICAgIGlmICghc291bmQuX3Bhbm5lciB8fCAhc291bmQuX3Bhbm5lci5wYW4pIHtcbiAgICAgICAgICAgICAgc2V0dXBQYW5uZXIoc291bmQsIHBhbm5lclR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFubmVyVHlwZSA9PT0gJ3NwYXRpYWwnKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX3Bhbm5lci5wb3NpdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUocGFuLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWS5zZXRWYWx1ZUF0VGltZSgwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZSgwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnNldFBvc2l0aW9uKHBhbiwgMCwgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucGFuLnNldFZhbHVlQXRUaW1lKHBhbiwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgnc3RlcmVvJywgc291bmQuX2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc291bmQuX3N0ZXJlbztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSAzRCBzcGF0aWFsIHBvc2l0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UgZm9yIHRoaXMgc291bmQgb3IgZ3JvdXAgcmVsYXRpdmUgdG8gdGhlIGdsb2JhbCBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4ICBUaGUgeC1wb3NpdGlvbiBvZiB0aGUgYXVkaW8gc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgIFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geiAgVGhlIHotcG9zaXRpb24gb2YgdGhlIGF1ZGlvIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAob3B0aW9uYWwpIFRoZSBzb3VuZCBJRC4gSWYgbm9uZSBpcyBwYXNzZWQsIGFsbCBpbiBncm91cCB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEByZXR1cm4ge0hvd2wvQXJyYXl9ICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCAzRCBzcGF0aWFsIHBvc2l0aW9uOiBbeCwgeSwgel0uXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5wb3MgPSBmdW5jdGlvbih4LCB5LCB6LCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHBvc2l0aW9uIHdoZW4gY2FwYWJsZS5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdwb3MnLFxuICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYucG9zKHgsIHksIHosIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyAwIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyAtMC41IDogejtcblxuICAgIC8vIFNldHVwIHRoZSBncm91cCdzIHNwYXRpYWwgcG9zaXRpb24gaWYgbm8gSUQgaXMgcGFzc2VkLlxuICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3Mgc3BhdGlhbCBwb3NpdGlvbiBpZiBubyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuXG4gICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNlbGYuX3BvcyA9IFt4LCB5LCB6XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9wb3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIHRoZSBzcGF0aWFsIHBvc2l0aW9uIG9mIG9uZSBvciBhbGwgc291bmRzIGluIGdyb3VwLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNvdW5kLl9wb3MgPSBbeCwgeSwgel07XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcGFubmVyIHNldHVwIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIG5vdC5cbiAgICAgICAgICAgIGlmICghc291bmQuX3Bhbm5lciB8fCBzb3VuZC5fcGFubmVyLnBhbikge1xuICAgICAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgJ3NwYXRpYWwnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoeCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKHksIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZSh6LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0UG9zaXRpb24oeCwgeSwgeik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgncG9zJywgc291bmQuX2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc291bmQuX3BvcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBkaXJlY3Rpb24gdGhlIGF1ZGlvIHNvdXJjZSBpcyBwb2ludGluZyBpbiB0aGUgM0QgY2FydGVzaWFuIGNvb3JkaW5hdGVcbiAgICogc3BhY2UuIERlcGVuZGluZyBvbiBob3cgZGlyZWN0aW9uIHRoZSBzb3VuZCBpcywgYmFzZWQgb24gdGhlIGBjb25lYCBhdHRyaWJ1dGVzLFxuICAgKiBhIHNvdW5kIHBvaW50aW5nIGF3YXkgZnJvbSB0aGUgbGlzdGVuZXIgY2FuIGJlIHF1aWV0IG9yIHNpbGVudC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4ICBUaGUgeC1vcmllbnRhdGlvbiBvZiB0aGUgc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgIFRoZSB5LW9yaWVudGF0aW9uIG9mIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geiAgVGhlIHotb3JpZW50YXRpb24gb2YgdGhlIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAob3B0aW9uYWwpIFRoZSBzb3VuZCBJRC4gSWYgbm9uZSBpcyBwYXNzZWQsIGFsbCBpbiBncm91cCB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEByZXR1cm4ge0hvd2wvQXJyYXl9ICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCAzRCBzcGF0aWFsIG9yaWVudGF0aW9uOiBbeCwgeSwgel0uXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IGZ1bmN0aW9uKHgsIHksIHosIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2Ugb3JpZW50YXRpb24gd2hlbiBjYXBhYmxlLlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogJ29yaWVudGF0aW9uJyxcbiAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLm9yaWVudGF0aW9uKHgsIHksIHosIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9vcmllbnRhdGlvblsxXSA6IHk7XG4gICAgeiA9ICh0eXBlb2YgeiAhPT0gJ251bWJlcicpID8gc2VsZi5fb3JpZW50YXRpb25bMl0gOiB6O1xuXG4gICAgLy8gU2V0dXAgdGhlIGdyb3VwJ3Mgc3BhdGlhbCBvcmllbnRhdGlvbiBpZiBubyBJRCBpcyBwYXNzZWQuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBzcGF0aWFsIG9yaWVudGF0aW9uIGlmIG5vIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC5cbiAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBbeCwgeSwgel07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc2VsZi5fb3JpZW50YXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIHRoZSBzcGF0aWFsIG9yaWVudGF0aW9uIG9mIG9uZSBvciBhbGwgc291bmRzIGluIGdyb3VwLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNvdW5kLl9vcmllbnRhdGlvbiA9IFt4LCB5LCB6XTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYW5uZXIgc2V0dXAgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbm90LlxuICAgICAgICAgICAgaWYgKCFzb3VuZC5fcGFubmVyKSB7XG4gICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgcG9zaXRpb24gdG8gc2V0dXAgdGhlIG5vZGUgd2l0aC5cbiAgICAgICAgICAgICAgaWYgKCFzb3VuZC5fcG9zKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX3BvcyA9IHNlbGYuX3BvcyB8fCBbMCwgMCwgLTAuNV07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgJ3NwYXRpYWwnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblguc2V0VmFsdWVBdFRpbWUoeCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25ZLnNldFZhbHVlQXRUaW1lKHksIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWi5zZXRWYWx1ZUF0VGltZSh6LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0T3JpZW50YXRpb24oeCwgeSwgeik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgnb3JpZW50YXRpb24nLCBzb3VuZC5faWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzb3VuZC5fb3JpZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgcGFubmVyIG5vZGUncyBhdHRyaWJ1dGVzIGZvciBhIHNvdW5kIG9yIGdyb3VwIG9mIHNvdW5kcy5cbiAgICogVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbCB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAqICAgcGFubmVyQXR0cigpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3MgdmFsdWVzLlxuICAgKiAgIHBhbm5lckF0dHIoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgdmFsdWVzLlxuICAgKiAgIHBhbm5lckF0dHIobykgLT4gU2V0J3MgdGhlIHZhbHVlcyBvZiBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICogICBwYW5uZXJBdHRyKG8sIGlkKSAtPiBTZXQncyB0aGUgdmFsdWVzIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICpcbiAgICogICBBdHRyaWJ1dGVzOlxuICAgKiAgICAgY29uZUlubmVyQW5nbGUgLSAoMzYwIGJ5IGRlZmF1bHQpIEEgcGFyYW1ldGVyIGZvciBkaXJlY3Rpb25hbCBhdWRpbyBzb3VyY2VzLCB0aGlzIGlzIGFuIGFuZ2xlLCBpbiBkZWdyZWVzLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgb2Ygd2hpY2ggdGhlcmUgd2lsbCBiZSBubyB2b2x1bWUgcmVkdWN0aW9uLlxuICAgKiAgICAgY29uZU91dGVyQW5nbGUgLSAoMzYwIGJ5IGRlZmF1bHQpIEEgcGFyYW1ldGVyIGZvciBkaXJlY3Rpb25hbCBhdWRpbyBzb3VyY2VzLCB0aGlzIGlzIGFuIGFuZ2xlLCBpbiBkZWdyZWVzLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBvdXRzaWRlIG9mIHdoaWNoIHRoZSB2b2x1bWUgd2lsbCBiZSByZWR1Y2VkIHRvIGEgY29uc3RhbnQgdmFsdWUgb2YgYGNvbmVPdXRlckdhaW5gLlxuICAgKiAgICAgY29uZU91dGVyR2FpbiAtICgwIGJ5IGRlZmF1bHQpIEEgcGFyYW1ldGVyIGZvciBkaXJlY3Rpb25hbCBhdWRpbyBzb3VyY2VzLCB0aGlzIGlzIHRoZSBnYWluIG91dHNpZGUgb2YgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgYGNvbmVPdXRlckFuZ2xlYC4gSXQgaXMgYSBsaW5lYXIgdmFsdWUgaW4gdGhlIHJhbmdlIGBbMCwgMV1gLlxuICAgKiAgICAgZGlzdGFuY2VNb2RlbCAtICgnaW52ZXJzZScgYnkgZGVmYXVsdCkgRGV0ZXJtaW5lcyBhbGdvcml0aG0gdXNlZCB0byByZWR1Y2Ugdm9sdW1lIGFzIGF1ZGlvIG1vdmVzIGF3YXkgZnJvbVxuICAgKiAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLiBDYW4gYmUgYGxpbmVhcmAsIGBpbnZlcnNlYCBvciBgZXhwb25lbnRpYWwuXG4gICAqICAgICBtYXhEaXN0YW5jZSAtICgxMDAwMCBieSBkZWZhdWx0KSBUaGUgbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIHNvdXJjZSBhbmQgbGlzdGVuZXIsIGFmdGVyIHdoaWNoIHRoZSB2b2x1bWVcbiAgICogICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgcmVkdWNlZCBhbnkgZnVydGhlci5cbiAgICogICAgIHJlZkRpc3RhbmNlIC0gKDEgYnkgZGVmYXVsdCkgQSByZWZlcmVuY2UgZGlzdGFuY2UgZm9yIHJlZHVjaW5nIHZvbHVtZSBhcyBzb3VyY2UgbW92ZXMgZnVydGhlciBmcm9tIHRoZSBsaXN0ZW5lci5cbiAgICogICAgICAgICAgICAgICAgICAgVGhpcyBpcyBzaW1wbHkgYSB2YXJpYWJsZSBvZiB0aGUgZGlzdGFuY2UgbW9kZWwgYW5kIGhhcyBhIGRpZmZlcmVudCBlZmZlY3QgZGVwZW5kaW5nIG9uIHdoaWNoIG1vZGVsXG4gICAqICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgYW5kIHRoZSBzY2FsZSBvZiB5b3VyIGNvb3JkaW5hdGVzLiBHZW5lcmFsbHksIHZvbHVtZSB3aWxsIGJlIGVxdWFsIHRvIDEgYXQgdGhpcyBkaXN0YW5jZS5cbiAgICogICAgIHJvbGxvZmZGYWN0b3IgLSAoMSBieSBkZWZhdWx0KSBIb3cgcXVpY2tseSB0aGUgdm9sdW1lIHJlZHVjZXMgYXMgc291cmNlIG1vdmVzIGZyb20gbGlzdGVuZXIuIFRoaXMgaXMgc2ltcGx5IGFcbiAgICogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvZiB0aGUgZGlzdGFuY2UgbW9kZWwgYW5kIGNhbiBiZSBpbiB0aGUgcmFuZ2Ugb2YgYFswLCAxXWAgd2l0aCBgbGluZWFyYCBhbmQgYFswLCDiiJ5dYFxuICAgKiAgICAgICAgICAgICAgICAgICAgIHdpdGggYGludmVyc2VgIGFuZCBgZXhwb25lbnRpYWxgLlxuICAgKiAgICAgcGFubmluZ01vZGVsIC0gKCdIUlRGJyBieSBkZWZhdWx0KSBEZXRlcm1pbmVzIHdoaWNoIHNwYXRpYWxpemF0aW9uIGFsZ29yaXRobSBpcyB1c2VkIHRvIHBvc2l0aW9uIGF1ZGlvLlxuICAgKiAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBgSFJURmAgb3IgYGVxdWFscG93ZXJgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtIb3dsL09iamVjdH0gUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgcGFubmVyIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5wYW5uZXJBdHRyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBvLCBpZCwgc291bmQ7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3MgcGFubmVyIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gICAgICByZXR1cm4gc2VsZi5fcGFubmVyQXR0cjtcbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG8gPSBhcmdzWzBdO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdSdzIHBhbm5lciBhdHRyaWJ1dGUgdmFsdWVzLlxuICAgICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICghby5wYW5uZXJBdHRyKSB7XG4gICAgICAgICAgICBvLnBhbm5lckF0dHIgPSB7XG4gICAgICAgICAgICAgIGNvbmVJbm5lckFuZ2xlOiBvLmNvbmVJbm5lckFuZ2xlLFxuICAgICAgICAgICAgICBjb25lT3V0ZXJBbmdsZTogby5jb25lT3V0ZXJBbmdsZSxcbiAgICAgICAgICAgICAgY29uZU91dGVyR2Fpbjogby5jb25lT3V0ZXJHYWluLFxuICAgICAgICAgICAgICBkaXN0YW5jZU1vZGVsOiBvLmRpc3RhbmNlTW9kZWwsXG4gICAgICAgICAgICAgIG1heERpc3RhbmNlOiBvLm1heERpc3RhbmNlLFxuICAgICAgICAgICAgICByZWZEaXN0YW5jZTogby5yZWZEaXN0YW5jZSxcbiAgICAgICAgICAgICAgcm9sbG9mZkZhY3Rvcjogby5yb2xsb2ZmRmFjdG9yLFxuICAgICAgICAgICAgICBwYW5uaW5nTW9kZWw6IG8ucGFubmluZ01vZGVsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSB7XG4gICAgICAgICAgICBjb25lSW5uZXJBbmdsZTogdHlwZW9mIG8ucGFubmVyQXR0ci5jb25lSW5uZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIuY29uZUlubmVyQW5nbGUgOiBzZWxmLl9jb25lSW5uZXJBbmdsZSxcbiAgICAgICAgICAgIGNvbmVPdXRlckFuZ2xlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLmNvbmVPdXRlckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5jb25lT3V0ZXJBbmdsZSA6IHNlbGYuX2NvbmVPdXRlckFuZ2xlLFxuICAgICAgICAgICAgY29uZU91dGVyR2FpbjogdHlwZW9mIG8ucGFubmVyQXR0ci5jb25lT3V0ZXJHYWluICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5jb25lT3V0ZXJHYWluIDogc2VsZi5fY29uZU91dGVyR2FpbixcbiAgICAgICAgICAgIGRpc3RhbmNlTW9kZWw6IHR5cGVvZiBvLnBhbm5lckF0dHIuZGlzdGFuY2VNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIuZGlzdGFuY2VNb2RlbCA6IHNlbGYuX2Rpc3RhbmNlTW9kZWwsXG4gICAgICAgICAgICBtYXhEaXN0YW5jZTogdHlwZW9mIG8ucGFubmVyQXR0ci5tYXhEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIubWF4RGlzdGFuY2UgOiBzZWxmLl9tYXhEaXN0YW5jZSxcbiAgICAgICAgICAgIHJlZkRpc3RhbmNlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLnJlZkRpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5yZWZEaXN0YW5jZSA6IHNlbGYuX3JlZkRpc3RhbmNlLFxuICAgICAgICAgICAgcm9sbG9mZkZhY3RvcjogdHlwZW9mIG8ucGFubmVyQXR0ci5yb2xsb2ZmRmFjdG9yICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5yb2xsb2ZmRmFjdG9yIDogc2VsZi5fcm9sbG9mZkZhY3RvcixcbiAgICAgICAgICAgIHBhbm5pbmdNb2RlbDogdHlwZW9mIG8ucGFubmVyQXR0ci5wYW5uaW5nTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbCA6IHNlbGYuX3Bhbm5pbmdNb2RlbFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldHVybiB0aGlzIHNvdW5kJ3MgcGFubmVyIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKHBhcnNlSW50KGFyZ3NbMF0sIDEwKSk7XG4gICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl9wYW5uZXJBdHRyIDogc2VsZi5fcGFubmVyQXR0cjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBvID0gYXJnc1swXTtcbiAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgc291bmRzLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIC8vIE1lcmdlIHRoZSBuZXcgdmFsdWVzIGludG8gdGhlIHNvdW5kLlxuICAgICAgICB2YXIgcGEgPSBzb3VuZC5fcGFubmVyQXR0cjtcbiAgICAgICAgcGEgPSB7XG4gICAgICAgICAgY29uZUlubmVyQW5nbGU6IHR5cGVvZiBvLmNvbmVJbm5lckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZUlubmVyQW5nbGUgOiBwYS5jb25lSW5uZXJBbmdsZSxcbiAgICAgICAgICBjb25lT3V0ZXJBbmdsZTogdHlwZW9mIG8uY29uZU91dGVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJBbmdsZSA6IHBhLmNvbmVPdXRlckFuZ2xlLFxuICAgICAgICAgIGNvbmVPdXRlckdhaW46IHR5cGVvZiBvLmNvbmVPdXRlckdhaW4gIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJHYWluIDogcGEuY29uZU91dGVyR2FpbixcbiAgICAgICAgICBkaXN0YW5jZU1vZGVsOiB0eXBlb2Ygby5kaXN0YW5jZU1vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8uZGlzdGFuY2VNb2RlbCA6IHBhLmRpc3RhbmNlTW9kZWwsXG4gICAgICAgICAgbWF4RGlzdGFuY2U6IHR5cGVvZiBvLm1heERpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ubWF4RGlzdGFuY2UgOiBwYS5tYXhEaXN0YW5jZSxcbiAgICAgICAgICByZWZEaXN0YW5jZTogdHlwZW9mIG8ucmVmRGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5yZWZEaXN0YW5jZSA6IHBhLnJlZkRpc3RhbmNlLFxuICAgICAgICAgIHJvbGxvZmZGYWN0b3I6IHR5cGVvZiBvLnJvbGxvZmZGYWN0b3IgIT09ICd1bmRlZmluZWQnID8gby5yb2xsb2ZmRmFjdG9yIDogcGEucm9sbG9mZkZhY3RvcixcbiAgICAgICAgICBwYW5uaW5nTW9kZWw6IHR5cGVvZiBvLnBhbm5pbmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5pbmdNb2RlbCA6IHBhLnBhbm5pbmdNb2RlbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcGFubmVyIHZhbHVlcyBvciBjcmVhdGUgYSBuZXcgcGFubmVyIGlmIG5vbmUgZXhpc3RzLlxuICAgICAgICB2YXIgcGFubmVyID0gc291bmQuX3Bhbm5lcjtcbiAgICAgICAgaWYgKHBhbm5lcikge1xuICAgICAgICAgIHBhbm5lci5jb25lSW5uZXJBbmdsZSA9IHBhLmNvbmVJbm5lckFuZ2xlO1xuICAgICAgICAgIHBhbm5lci5jb25lT3V0ZXJBbmdsZSA9IHBhLmNvbmVPdXRlckFuZ2xlO1xuICAgICAgICAgIHBhbm5lci5jb25lT3V0ZXJHYWluID0gcGEuY29uZU91dGVyR2FpbjtcbiAgICAgICAgICBwYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHBhLmRpc3RhbmNlTW9kZWw7XG4gICAgICAgICAgcGFubmVyLm1heERpc3RhbmNlID0gcGEubWF4RGlzdGFuY2U7XG4gICAgICAgICAgcGFubmVyLnJlZkRpc3RhbmNlID0gcGEucmVmRGlzdGFuY2U7XG4gICAgICAgICAgcGFubmVyLnJvbGxvZmZGYWN0b3IgPSBwYS5yb2xsb2ZmRmFjdG9yO1xuICAgICAgICAgIHBhbm5lci5wYW5uaW5nTW9kZWwgPSBwYS5wYW5uaW5nTW9kZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBwb3NpdGlvbiB0byBzZXR1cCB0aGUgbm9kZSB3aXRoLlxuICAgICAgICAgIGlmICghc291bmQuX3Bvcykge1xuICAgICAgICAgICAgc291bmQuX3BvcyA9IHNlbGYuX3BvcyB8fCBbMCwgMCwgLTAuNV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhbm5lciBub2RlLlxuICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCAnc3BhdGlhbCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqIFNpbmdsZSBTb3VuZCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBBZGQgbmV3IHByb3BlcnRpZXMgdG8gdGhlIGNvcmUgU291bmQgaW5pdC5cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IF9zdXBlciBDb3JlIFNvdW5kIGluaXQgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICovXG4gIFNvdW5kLnByb3RvdHlwZS5pbml0ID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFNldHVwIHVzZXItZGVmaW5lZCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IHBhcmVudC5fb3JpZW50YXRpb247XG4gICAgICBzZWxmLl9zdGVyZW8gPSBwYXJlbnQuX3N0ZXJlbztcbiAgICAgIHNlbGYuX3BvcyA9IHBhcmVudC5fcG9zO1xuICAgICAgc2VsZi5fcGFubmVyQXR0ciA9IHBhcmVudC5fcGFubmVyQXR0cjtcblxuICAgICAgLy8gQ29tcGxldGUgaW5pdGlsaXphdGlvbiB3aXRoIGhvd2xlci5qcyBjb3JlIFNvdW5kJ3MgaW5pdCBmdW5jdGlvbi5cbiAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgICAvLyBJZiBhIHN0ZXJlbyBvciBwb3NpdGlvbiB3YXMgc3BlY2lmaWVkLCBzZXQgaXQgdXAuXG4gICAgICBpZiAoc2VsZi5fc3RlcmVvKSB7XG4gICAgICAgIHBhcmVudC5zdGVyZW8oc2VsZi5fc3RlcmVvKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5fcG9zKSB7XG4gICAgICAgIHBhcmVudC5wb3Moc2VsZi5fcG9zWzBdLCBzZWxmLl9wb3NbMV0sIHNlbGYuX3Bvc1syXSwgc2VsZi5faWQpO1xuICAgICAgfVxuICAgIH07XG4gIH0pKFNvdW5kLnByb3RvdHlwZS5pbml0KTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIFNvdW5kLnJlc2V0IG1ldGhvZCB0byBjbGVhbiB1cCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNwYXRpYWwgcGx1Z2luLlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gX3N1cGVyIFNvdW5kIHJlc2V0IG1ldGhvZC5cbiAgICogQHJldHVybiB7U291bmR9XG4gICAqL1xuICBTb3VuZC5wcm90b3R5cGUucmVzZXQgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gUmVzZXQgYWxsIHNwYXRpYWwgcGx1Z2luIHByb3BlcnRpZXMgb24gdGhpcyBzb3VuZC5cbiAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gcGFyZW50Ll9vcmllbnRhdGlvbjtcbiAgICAgIHNlbGYuX3N0ZXJlbyA9IHBhcmVudC5fc3RlcmVvO1xuICAgICAgc2VsZi5fcG9zID0gcGFyZW50Ll9wb3M7XG4gICAgICBzZWxmLl9wYW5uZXJBdHRyID0gcGFyZW50Ll9wYW5uZXJBdHRyO1xuXG4gICAgICAvLyBJZiBhIHN0ZXJlbyBvciBwb3NpdGlvbiB3YXMgc3BlY2lmaWVkLCBzZXQgaXQgdXAuXG4gICAgICBpZiAoc2VsZi5fc3RlcmVvKSB7XG4gICAgICAgIHBhcmVudC5zdGVyZW8oc2VsZi5fc3RlcmVvKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5fcG9zKSB7XG4gICAgICAgIHBhcmVudC5wb3Moc2VsZi5fcG9zWzBdLCBzZWxmLl9wb3NbMV0sIHNlbGYuX3Bvc1syXSwgc2VsZi5faWQpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLl9wYW5uZXIpIHtcbiAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgcGFubmVyLlxuICAgICAgICBzZWxmLl9wYW5uZXIuZGlzY29ubmVjdCgwKTtcbiAgICAgICAgc2VsZi5fcGFubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICBwYXJlbnQuX3JlZnJlc2hCdWZmZXIoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBsZXRlIHJlc2V0dGluZyBvZiB0aGUgc291bmQuXG4gICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgfSkoU291bmQucHJvdG90eXBlLnJlc2V0KTtcblxuICAvKiogSGVscGVyIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwYW5uZXIgbm9kZSBhbmQgc2F2ZSBpdCBvbiB0aGUgc291bmQuXG4gICAqIEBwYXJhbSAge1NvdW5kfSBzb3VuZCBTcGVjaWZpYyBzb3VuZCB0byBzZXR1cCBwYW5uaW5nIG9uLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUeXBlIG9mIHBhbm5lciB0byBjcmVhdGU6ICdzdGVyZW8nIG9yICdzcGF0aWFsJy5cbiAgICovXG4gIHZhciBzZXR1cFBhbm5lciA9IGZ1bmN0aW9uKHNvdW5kLCB0eXBlKSB7XG4gICAgdHlwZSA9IHR5cGUgfHwgJ3NwYXRpYWwnO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBuZXcgcGFubmVyIG5vZGUuXG4gICAgaWYgKHR5cGUgPT09ICdzcGF0aWFsJykge1xuICAgICAgc291bmQuX3Bhbm5lciA9IEhvd2xlci5jdHguY3JlYXRlUGFubmVyKCk7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVJbm5lckFuZ2xlID0gc291bmQuX3Bhbm5lckF0dHIuY29uZUlubmVyQW5nbGU7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVPdXRlckFuZ2xlID0gc291bmQuX3Bhbm5lckF0dHIuY29uZU91dGVyQW5nbGU7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVPdXRlckdhaW4gPSBzb3VuZC5fcGFubmVyQXR0ci5jb25lT3V0ZXJHYWluO1xuICAgICAgc291bmQuX3Bhbm5lci5kaXN0YW5jZU1vZGVsID0gc291bmQuX3Bhbm5lckF0dHIuZGlzdGFuY2VNb2RlbDtcbiAgICAgIHNvdW5kLl9wYW5uZXIubWF4RGlzdGFuY2UgPSBzb3VuZC5fcGFubmVyQXR0ci5tYXhEaXN0YW5jZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucmVmRGlzdGFuY2UgPSBzb3VuZC5fcGFubmVyQXR0ci5yZWZEaXN0YW5jZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucm9sbG9mZkZhY3RvciA9IHNvdW5kLl9wYW5uZXJBdHRyLnJvbGxvZmZGYWN0b3I7XG4gICAgICBzb3VuZC5fcGFubmVyLnBhbm5pbmdNb2RlbCA9IHNvdW5kLl9wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbDtcblxuICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoc291bmQuX3Bvc1swXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9wb3NbMV0sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZShzb3VuZC5fcG9zWzJdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0UG9zaXRpb24oc291bmQuX3Bvc1swXSwgc291bmQuX3Bvc1sxXSwgc291bmQuX3Bvc1syXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25YLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9vcmllbnRhdGlvblswXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25ZLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9vcmllbnRhdGlvblsxXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25aLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9vcmllbnRhdGlvblsyXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZC5fcGFubmVyLnNldE9yaWVudGF0aW9uKHNvdW5kLl9vcmllbnRhdGlvblswXSwgc291bmQuX29yaWVudGF0aW9uWzFdLCBzb3VuZC5fb3JpZW50YXRpb25bMl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzb3VuZC5fcGFubmVyID0gSG93bGVyLmN0eC5jcmVhdGVTdGVyZW9QYW5uZXIoKTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucGFuLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9zdGVyZW8sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgIH1cblxuICAgIHNvdW5kLl9wYW5uZXIuY29ubmVjdChzb3VuZC5fbm9kZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbm5lY3Rpb25zLlxuICAgIGlmICghc291bmQuX3BhdXNlZCkge1xuICAgICAgc291bmQuX3BhcmVudC5wYXVzZShzb3VuZC5faWQsIHRydWUpLnBsYXkoc291bmQuX2lkLCB0cnVlKTtcbiAgICB9XG4gIH07XG59KSgpO1xuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cblxudmFyIEV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRXZlbnQodHlwZSwgdGFyZ2V0KSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcclxuICAgIH1cclxuICAgIHJldHVybiBFdmVudDtcclxufSgpKTtcclxudmFyIEVycm9yRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICBfX2V4dGVuZHMoRXJyb3JFdmVudCwgX3N1cGVyKTtcclxuICAgIGZ1bmN0aW9uIEVycm9yRXZlbnQoZXJyb3IsIHRhcmdldCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsICdlcnJvcicsIHRhcmdldCkgfHwgdGhpcztcclxuICAgICAgICBfdGhpcy5tZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICBfdGhpcy5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgIHJldHVybiBfdGhpcztcclxuICAgIH1cclxuICAgIHJldHVybiBFcnJvckV2ZW50O1xyXG59KEV2ZW50KSk7XHJcbnZhciBDbG9zZUV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgX19leHRlbmRzKENsb3NlRXZlbnQsIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBDbG9zZUV2ZW50KGNvZGUsIHJlYXNvbiwgdGFyZ2V0KSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IHZvaWQgMCkgeyBjb2RlID0gMTAwMDsgfVxyXG4gICAgICAgIGlmIChyZWFzb24gPT09IHZvaWQgMCkgeyByZWFzb24gPSAnJzsgfVxyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsICdjbG9zZScsIHRhcmdldCkgfHwgdGhpcztcclxuICAgICAgICBfdGhpcy53YXNDbGVhbiA9IHRydWU7XHJcbiAgICAgICAgX3RoaXMuY29kZSA9IGNvZGU7XHJcbiAgICAgICAgX3RoaXMucmVhc29uID0gcmVhc29uO1xyXG4gICAgICAgIHJldHVybiBfdGhpcztcclxuICAgIH1cclxuICAgIHJldHVybiBDbG9zZUV2ZW50O1xyXG59KEV2ZW50KSk7XG5cbi8qIVxyXG4gKiBSZWNvbm5lY3RpbmcgV2ViU29ja2V0XHJcbiAqIGJ5IFBlZHJvIExhZGFyaWEgPHBlZHJvLmxhZGFyaWFAZ21haWwuY29tPlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcGxhZGFyaWEvcmVjb25uZWN0aW5nLXdlYnNvY2tldFxyXG4gKiBMaWNlbnNlIE1JVFxyXG4gKi9cclxudmFyIGdldEdsb2JhbFdlYlNvY2tldCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICByZXR1cm4gV2ViU29ja2V0O1xyXG4gICAgfVxyXG59O1xyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIGdpdmVuIGFyZ3VtZW50IGxvb2tzIGxpa2UgYSBXZWJTb2NrZXQgY2xhc3NcclxuICovXHJcbnZhciBpc1dlYlNvY2tldCA9IGZ1bmN0aW9uICh3KSB7IHJldHVybiB0eXBlb2YgdyAhPT0gJ3VuZGVmaW5lZCcgJiYgISF3ICYmIHcuQ0xPU0lORyA9PT0gMjsgfTtcclxudmFyIERFRkFVTFQgPSB7XHJcbiAgICBtYXhSZWNvbm5lY3Rpb25EZWxheTogMTAwMDAsXHJcbiAgICBtaW5SZWNvbm5lY3Rpb25EZWxheTogMTAwMCArIE1hdGgucmFuZG9tKCkgKiA0MDAwLFxyXG4gICAgbWluVXB0aW1lOiA1MDAwLFxyXG4gICAgcmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yOiAxLjMsXHJcbiAgICBjb25uZWN0aW9uVGltZW91dDogNDAwMCxcclxuICAgIG1heFJldHJpZXM6IEluZmluaXR5LFxyXG4gICAgbWF4RW5xdWV1ZWRNZXNzYWdlczogSW5maW5pdHksXHJcbiAgICBzdGFydENsb3NlZDogZmFsc2UsXHJcbiAgICBkZWJ1ZzogZmFsc2UsXHJcbn07XHJcbnZhciBSZWNvbm5lY3RpbmdXZWJTb2NrZXQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQodXJsLCBwcm90b2NvbHMsIG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XHJcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0ge1xyXG4gICAgICAgICAgICBlcnJvcjogW10sXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IFtdLFxyXG4gICAgICAgICAgICBvcGVuOiBbXSxcclxuICAgICAgICAgICAgY2xvc2U6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCA9IC0xO1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZFJlY29ubmVjdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdExvY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9iaW5hcnlUeXBlID0gJ2Jsb2InO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlQ2FsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVF1ZXVlID0gW107XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uJ3MgcmVhZHlTdGF0ZSBjaGFuZ2VzIHRvIENMT1NFRFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25jbG9zZSA9IG51bGw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbmVycm9yID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbm1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbidzIHJlYWR5U3RhdGUgY2hhbmdlcyB0byBPUEVOO1xyXG4gICAgICAgICAqIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbm9wZW4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZU9wZW4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdvcGVuIGV2ZW50Jyk7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLl9vcHRpb25zLm1pblVwdGltZSwgbWluVXB0aW1lID0gX2EgPT09IHZvaWQgMCA/IERFRkFVTFQubWluVXB0aW1lIDogX2E7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpcy5fY29ubmVjdFRpbWVvdXQpO1xyXG4gICAgICAgICAgICBfdGhpcy5fdXB0aW1lVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2FjY2VwdE9wZW4oKTsgfSwgbWluVXB0aW1lKTtcclxuICAgICAgICAgICAgX3RoaXMuX3dzLmJpbmFyeVR5cGUgPSBfdGhpcy5fYmluYXJ5VHlwZTtcclxuICAgICAgICAgICAgLy8gc2VuZCBlbnF1ZXVlZCBtZXNzYWdlcyAobWVzc2FnZXMgc2VudCBiZWZvcmUgd2Vic29ja2V0IG9wZW4gZXZlbnQpXHJcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlUXVldWUuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkgeyByZXR1cm4gX3RoaXMuX3dzLnNlbmQobWVzc2FnZSk7IH0pO1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZVF1ZXVlID0gW107XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbm9wZW4pIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9ub3BlbihldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX2xpc3RlbmVycy5vcGVuLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBfdGhpcy5fY2FsbEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVNZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnbWVzc2FnZSBldmVudCcpO1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMub25tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbm1lc3NhZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMubWVzc2FnZS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gX3RoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdlcnJvciBldmVudCcsIGV2ZW50Lm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5fZGlzY29ubmVjdCh1bmRlZmluZWQsIGV2ZW50Lm1lc3NhZ2UgPT09ICdUSU1FT1VUJyA/ICd0aW1lb3V0JyA6IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbmVycm9yKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ2V4ZWMgZXJyb3IgbGlzdGVuZXJzJyk7XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMuZXJyb3IuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3QoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnY2xvc2UgZXZlbnQnKTtcclxuICAgICAgICAgICAgX3RoaXMuX2NsZWFyVGltZW91dHMoKTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLl9zaG91bGRSZWNvbm5lY3QpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9jb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKF90aGlzLm9uY2xvc2UpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uY2xvc2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMuY2xvc2UuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcclxuICAgICAgICB0aGlzLl9wcm90b2NvbHMgPSBwcm90b2NvbHM7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuc3RhcnRDbG9zZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2hvdWxkUmVjb25uZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQsIFwiQ09OTkVDVElOR1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldCwgXCJPUEVOXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LCBcIkNMT1NJTkdcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQsIFwiQ0xPU0VEXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJDT05ORUNUSU5HXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlY29ubmVjdGluZ1dlYlNvY2tldC5DT05ORUNUSU5HO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiT1BFTlwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuT1BFTjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcIkNMT1NJTkdcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNMT1NJTkc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJDTE9TRURcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNMT1NFRDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcImJpbmFyeVR5cGVcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd3MgPyB0aGlzLl93cy5iaW5hcnlUeXBlIDogdGhpcy5fYmluYXJ5VHlwZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JpbmFyeVR5cGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93cy5iaW5hcnlUeXBlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcInJldHJ5Q291bnRcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvciBjb25uZWN0aW9uIHJldHJpZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuX3JldHJ5Q291bnQsIDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiYnVmZmVyZWRBbW91bnRcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgdXNpbmcgY2FsbHMgdG8gc2VuZCgpIGJ1dCBub3QgeWV0XHJcbiAgICAgICAgICogdHJhbnNtaXR0ZWQgdG8gdGhlIG5ldHdvcmsuIFRoaXMgdmFsdWUgcmVzZXRzIHRvIHplcm8gb25jZSBhbGwgcXVldWVkIGRhdGEgaGFzIGJlZW4gc2VudC5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGRvZXMgbm90IHJlc2V0IHRvIHplcm8gd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQ7IGlmIHlvdSBrZWVwIGNhbGxpbmcgc2VuZCgpLFxyXG4gICAgICAgICAqIHRoaXMgd2lsbCBjb250aW51ZSB0byBjbGltYi4gUmVhZCBvbmx5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBieXRlcyA9IHRoaXMuX21lc3NhZ2VRdWV1ZS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgbWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBtZXNzYWdlLmxlbmd0aDsgLy8gbm90IGJ5dGUgc2l6ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gbWVzc2FnZS5zaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IG1lc3NhZ2UuYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgICAgICByZXR1cm4gYnl0ZXMgKyAodGhpcy5fd3MgPyB0aGlzLl93cy5idWZmZXJlZEFtb3VudCA6IDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiZXh0ZW5zaW9uc1wiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGV4dGVuc2lvbnMgc2VsZWN0ZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBpcyBjdXJyZW50bHkgb25seSB0aGUgZW1wdHkgc3RyaW5nIG9yIGEgbGlzdCBvZlxyXG4gICAgICAgICAqIGV4dGVuc2lvbnMgYXMgbmVnb3RpYXRlZCBieSB0aGUgY29ubmVjdGlvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd3MgPyB0aGlzLl93cy5leHRlbnNpb25zIDogJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJwcm90b2NvbFwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgc3ViLXByb3RvY29sIHRoZSBzZXJ2ZXIgc2VsZWN0ZWQ7XHJcbiAgICAgICAgICogdGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgc3RyaW5ncyBzcGVjaWZpZWQgaW4gdGhlIHByb3RvY29scyBwYXJhbWV0ZXIgd2hlbiBjcmVhdGluZyB0aGVcclxuICAgICAgICAgKiBXZWJTb2NrZXQgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLnByb3RvY29sIDogJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJyZWFkeVN0YXRlXCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbjsgdGhpcyBpcyBvbmUgb2YgdGhlIFJlYWR5IHN0YXRlIGNvbnN0YW50c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93cy5yZWFkeVN0YXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zLnN0YXJ0Q2xvc2VkXHJcbiAgICAgICAgICAgICAgICA/IFJlY29ubmVjdGluZ1dlYlNvY2tldC5DTE9TRURcclxuICAgICAgICAgICAgICAgIDogUmVjb25uZWN0aW5nV2ViU29ja2V0LkNPTk5FQ1RJTkc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJ1cmxcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBVUkwgYXMgcmVzb2x2ZWQgYnkgdGhlIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLnVybCA6ICcnO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIGNvbm5lY3Rpb24gYXR0ZW1wdCwgaWYgYW55LiBJZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5XHJcbiAgICAgKiBDTE9TRUQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZ1xyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbikge1xyXG4gICAgICAgIGlmIChjb2RlID09PSB2b2lkIDApIHsgY29kZSA9IDEwMDA7IH1cclxuICAgICAgICB0aGlzLl9jbG9zZUNhbGxlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVjb25uZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0cygpO1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVidWcoJ2Nsb3NlIGVucXVldWVkOiBubyB3cyBpbnN0YW5jZScpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl93cy5yZWFkeVN0YXRlID09PSB0aGlzLkNMT1NFRCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnY2xvc2U6IGFscmVhZHkgY2xvc2VkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fd3MuY2xvc2UoY29kZSwgcmVhc29uKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIENsb3NlcyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gb3IgY29ubmVjdGlvbiBhdHRlbXB0IGFuZCBjb25uZWN0cyBhZ2Fpbi5cclxuICAgICAqIFJlc2V0cyByZXRyeSBjb3VudGVyO1xyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLnJlY29ubmVjdCA9IGZ1bmN0aW9uIChjb2RlLCByZWFzb24pIHtcclxuICAgICAgICB0aGlzLl9zaG91bGRSZWNvbm5lY3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlQ2FsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCA9IC0xO1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MgfHwgdGhpcy5fd3MucmVhZHlTdGF0ZSA9PT0gdGhpcy5DTE9TRUQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZGlzY29ubmVjdChjb2RlLCByZWFzb24pO1xyXG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogRW5xdWV1ZSBzcGVjaWZpZWQgZGF0YSB0byBiZSB0cmFuc21pdHRlZCB0byB0aGUgc2VydmVyIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dzICYmIHRoaXMuX3dzLnJlYWR5U3RhdGUgPT09IHRoaXMuT1BFTikge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1Zygnc2VuZCcsIGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLl93cy5zZW5kKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5fb3B0aW9ucy5tYXhFbnF1ZXVlZE1lc3NhZ2VzLCBtYXhFbnF1ZXVlZE1lc3NhZ2VzID0gX2EgPT09IHZvaWQgMCA/IERFRkFVTFQubWF4RW5xdWV1ZWRNZXNzYWdlcyA6IF9hO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVzc2FnZVF1ZXVlLmxlbmd0aCA8IG1heEVucXVldWVkTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdlbnF1ZXVlJywgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlUXVldWUucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIgb2YgYSBzcGVjaWZpYyBldmVudCB0eXBlXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIHZhciBlXzEsIF9hO1xyXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnQudHlwZV07XHJcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbGlzdGVuZXJzXzEgPSBfX3ZhbHVlcyhsaXN0ZW5lcnMpLCBsaXN0ZW5lcnNfMV8xID0gbGlzdGVuZXJzXzEubmV4dCgpOyAhbGlzdGVuZXJzXzFfMS5kb25lOyBsaXN0ZW5lcnNfMV8xID0gbGlzdGVuZXJzXzEubmV4dCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzXzFfMS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzXzFfMSAmJiAhbGlzdGVuZXJzXzFfMS5kb25lICYmIChfYSA9IGxpc3RlbmVyc18xLnJldHVybikpIF9hLmNhbGwobGlzdGVuZXJzXzEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW3R5cGVdKSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID0gdGhpcy5fbGlzdGVuZXJzW3R5cGVdLmZpbHRlcihmdW5jdGlvbiAobCkgeyByZXR1cm4gbCAhPT0gbGlzdGVuZXI7IH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9kZWJ1ZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZGVidWcpIHtcclxuICAgICAgICAgICAgLy8gbm90IHVzaW5nIHNwcmVhZCBiZWNhdXNlIGNvbXBpbGVkIHZlcnNpb24gdXNlcyBTeW1ib2xzXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBfX3NwcmVhZChbJ1JXUz4nXSwgYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9nZXROZXh0RGVsYXkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF9hID0gdGhpcy5fb3B0aW9ucywgX2IgPSBfYS5yZWNvbm5lY3Rpb25EZWxheUdyb3dGYWN0b3IsIHJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciA9IF9iID09PSB2b2lkIDAgPyBERUZBVUxULnJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciA6IF9iLCBfYyA9IF9hLm1pblJlY29ubmVjdGlvbkRlbGF5LCBtaW5SZWNvbm5lY3Rpb25EZWxheSA9IF9jID09PSB2b2lkIDAgPyBERUZBVUxULm1pblJlY29ubmVjdGlvbkRlbGF5IDogX2MsIF9kID0gX2EubWF4UmVjb25uZWN0aW9uRGVsYXksIG1heFJlY29ubmVjdGlvbkRlbGF5ID0gX2QgPT09IHZvaWQgMCA/IERFRkFVTFQubWF4UmVjb25uZWN0aW9uRGVsYXkgOiBfZDtcclxuICAgICAgICB2YXIgZGVsYXkgPSAwO1xyXG4gICAgICAgIGlmICh0aGlzLl9yZXRyeUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBkZWxheSA9XHJcbiAgICAgICAgICAgICAgICBtaW5SZWNvbm5lY3Rpb25EZWxheSAqIE1hdGgucG93KHJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciwgdGhpcy5fcmV0cnlDb3VudCAtIDEpO1xyXG4gICAgICAgICAgICBpZiAoZGVsYXkgPiBtYXhSZWNvbm5lY3Rpb25EZWxheSkge1xyXG4gICAgICAgICAgICAgICAgZGVsYXkgPSBtYXhSZWNvbm5lY3Rpb25EZWxheTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWJ1ZygnbmV4dCBkZWxheScsIGRlbGF5KTtcclxuICAgICAgICByZXR1cm4gZGVsYXk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fd2FpdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIF90aGlzLl9nZXROZXh0RGVsYXkoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fZ2V0TmV4dFVybCA9IGZ1bmN0aW9uICh1cmxQcm92aWRlcikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdXJsUHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXJsUHJvdmlkZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHVybFByb3ZpZGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSB1cmxQcm92aWRlcigpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISF1cmwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBVUkwnKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RMb2NrIHx8ICF0aGlzLl9zaG91bGRSZWNvbm5lY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb25uZWN0TG9jayA9IHRydWU7XHJcbiAgICAgICAgdmFyIF9hID0gdGhpcy5fb3B0aW9ucywgX2IgPSBfYS5tYXhSZXRyaWVzLCBtYXhSZXRyaWVzID0gX2IgPT09IHZvaWQgMCA/IERFRkFVTFQubWF4UmV0cmllcyA6IF9iLCBfYyA9IF9hLmNvbm5lY3Rpb25UaW1lb3V0LCBjb25uZWN0aW9uVGltZW91dCA9IF9jID09PSB2b2lkIDAgPyBERUZBVUxULmNvbm5lY3Rpb25UaW1lb3V0IDogX2MsIF9kID0gX2EuV2ViU29ja2V0LCBXZWJTb2NrZXQgPSBfZCA9PT0gdm9pZCAwID8gZ2V0R2xvYmFsV2ViU29ja2V0KCkgOiBfZDtcclxuICAgICAgICBpZiAodGhpcy5fcmV0cnlDb3VudCA+PSBtYXhSZXRyaWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdtYXggcmV0cmllcyByZWFjaGVkJywgdGhpcy5fcmV0cnlDb3VudCwgJz49JywgbWF4UmV0cmllcyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCsrO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnKCdjb25uZWN0JywgdGhpcy5fcmV0cnlDb3VudCk7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgaWYgKCFpc1dlYlNvY2tldChXZWJTb2NrZXQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdObyB2YWxpZCBXZWJTb2NrZXQgY2xhc3MgcHJvdmlkZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fd2FpdCgpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9nZXROZXh0VXJsKF90aGlzLl91cmwpOyB9KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodXJsKSB7XHJcbiAgICAgICAgICAgIC8vIGNsb3NlIGNvdWxkIGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRpbmcgdGhlIHdzXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fY2xvc2VDYWxsZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ2Nvbm5lY3QnLCB7IHVybDogdXJsLCBwcm90b2NvbHM6IF90aGlzLl9wcm90b2NvbHMgfSk7XHJcbiAgICAgICAgICAgIF90aGlzLl93cyA9IF90aGlzLl9wcm90b2NvbHNcclxuICAgICAgICAgICAgICAgID8gbmV3IFdlYlNvY2tldCh1cmwsIF90aGlzLl9wcm90b2NvbHMpXHJcbiAgICAgICAgICAgICAgICA6IG5ldyBXZWJTb2NrZXQodXJsKTtcclxuICAgICAgICAgICAgX3RoaXMuX3dzLmJpbmFyeVR5cGUgPSBfdGhpcy5fYmluYXJ5VHlwZTtcclxuICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3RMb2NrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIF90aGlzLl9hZGRMaXN0ZW5lcnMoKTtcclxuICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3RUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5faGFuZGxlVGltZW91dCgpOyB9LCBjb25uZWN0aW9uVGltZW91dCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5faGFuZGxlVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLl9kZWJ1ZygndGltZW91dCBldmVudCcpO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKG5ldyBFcnJvckV2ZW50KEVycm9yKCdUSU1FT1VUJyksIHRoaXMpKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9kaXNjb25uZWN0ID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbikge1xyXG4gICAgICAgIGlmIChjb2RlID09PSB2b2lkIDApIHsgY29kZSA9IDEwMDA7IH1cclxuICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXRzKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dzLmNsb3NlKGNvZGUsIHJlYXNvbik7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlKG5ldyBDbG9zZUV2ZW50KGNvZGUsIHJlYXNvbiwgdGhpcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2FjY2VwdE9wZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVidWcoJ2FjY2VwdCBvcGVuJyk7XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCA9IDA7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fY2FsbEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKCdoYW5kbGVFdmVudCcgaW4gbGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fcmVtb3ZlTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWJ1ZygncmVtb3ZlTGlzdGVuZXJzJyk7XHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuX2hhbmRsZU9wZW4pO1xyXG4gICAgICAgIHRoaXMuX3dzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5faGFuZGxlQ2xvc2UpO1xyXG4gICAgICAgIHRoaXMuX3dzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVNZXNzYWdlKTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9oYW5kbGVFcnJvcik7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fYWRkTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWJ1ZygnYWRkTGlzdGVuZXJzJyk7XHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuX2hhbmRsZU9wZW4pO1xyXG4gICAgICAgIHRoaXMuX3dzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5faGFuZGxlQ2xvc2UpO1xyXG4gICAgICAgIHRoaXMuX3dzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVNZXNzYWdlKTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9oYW5kbGVFcnJvcik7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fY2xlYXJUaW1lb3V0cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY29ubmVjdFRpbWVvdXQpO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cHRpbWVUaW1lb3V0KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0O1xyXG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlY29ubmVjdGluZ1dlYlNvY2tldDtcbiJdfQ==
|