@arcware-cloud/pixelstreaming-websdk 1.2.13 → 1.2.15
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/index.cjs.js +344 -4
- package/index.esm.js +364 -22
- package/index.umd.js +344 -4
- package/package.json +1 -1
- package/types/index.d.ts +0 -3
- package/types/lib/ApplyUrlHack.d.ts +0 -2
- package/types/lib/ArcwareApplication.d.ts +0 -48
- package/types/lib/ArcwareConfig.d.ts +0 -35
- package/types/lib/ArcwareInit.d.ts +0 -15
- package/types/lib/ArcwarePixelStreaming.d.ts +0 -97
- package/types/lib/MessageTypes.d.ts +0 -4
- package/types/lib/domain/ArcwareSettingsSchema.d.ts +0 -209
- package/types/lib/domain/ConnectionIdentifier.d.ts +0 -27
- package/types/lib/domain/EventHandler.d.ts +0 -11
- package/types/lib/domain/Session.d.ts +0 -29
- package/types/lib/domain/Stats.d.ts +0 -36
- package/types/lib/domain/debounce.d.ts +0 -1
- package/types/lib/index.d.ts +0 -6
- package/types/lib/styles/ArcwarePixelStreamingApplicationStyles.d.ts +0 -478
- package/types/lib/ui/ArcwareLogoLoader/index.d.ts +0 -6
- package/types/lib/ui/AudioButton/AudioIcon.d.ts +0 -7
- package/types/lib/ui/AudioButton/index.d.ts +0 -15
- package/types/lib/ui/LoveLetters/index.d.ts +0 -6
- package/types/lib/ui/MicButton/index.d.ts +0 -14
- package/types/lib/ui/MicIcon/index.d.ts +0 -7
- package/types/lib/ui/MicrophoneOverlay/index.d.ts +0 -11
- package/types/lib/ui/PlayIcon/index.d.ts +0 -5
- package/types/lib/ui/StopButton/index.d.ts +0 -16
- package/types/lib/ui/StopIcon/index.d.ts +0 -5
- package/types/shared/index.d.ts +0 -1
- package/types/shared/lib/Messages/ErrorMessage.d.ts +0 -18
- package/types/shared/lib/Messages/LoveLetter.d.ts +0 -18
- package/types/shared/lib/Messages/Ping.d.ts +0 -15
- package/types/shared/lib/Messages/Queue.d.ts +0 -58
- package/types/shared/lib/Messages/SessionId.d.ts +0 -12
- package/types/shared/lib/Messages/Stats.d.ts +0 -182
- package/types/shared/lib/Messages/StreamInfo.d.ts +0 -338
- package/types/shared/lib/Messages/Version.d.ts +0 -12
- package/types/shared/lib/Messages/WebSdkSettings.d.ts +0 -96
- package/types/shared/lib/Messages/index.d.ts +0 -192
- package/types/shared/lib/index.d.ts +0 -1
package/index.cjs.js
CHANGED
|
@@ -23351,7 +23351,7 @@ class ArcwareConfig extends lib_pixelstreamingfrontend_ue5_5_1.Config {
|
|
|
23351
23351
|
if (!config.initialSettings.ss)
|
|
23352
23352
|
config.initialSettings.ss = exports.DefaultUrl;
|
|
23353
23353
|
super(config);
|
|
23354
|
-
this.VERSION = "1.2.
|
|
23354
|
+
this.VERSION = "1.2.15";
|
|
23355
23355
|
this.settings = settings;
|
|
23356
23356
|
this.session = new Session_1.Session();
|
|
23357
23357
|
this._initialSettings = config.initialSettings;
|
|
@@ -23492,6 +23492,7 @@ exports.ArcwareInit = ArcwareInit;
|
|
|
23492
23492
|
|
|
23493
23493
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
23494
23494
|
exports.ArcwarePixelStreaming = void 0;
|
|
23495
|
+
const tslib_1 = __webpack_require__(655);
|
|
23495
23496
|
const shared_pixelstreaming_websdk_1 = __webpack_require__(7910);
|
|
23496
23497
|
const lib_pixelstreamingfrontend_ue5_5_1 = __webpack_require__(693);
|
|
23497
23498
|
const ApplyUrlHack_1 = __webpack_require__(4790);
|
|
@@ -23502,6 +23503,7 @@ const LoveLetters_1 = __webpack_require__(4572);
|
|
|
23502
23503
|
const ArcwareLogoLoader_1 = __webpack_require__(6469);
|
|
23503
23504
|
const MicrophoneOverlay_1 = __webpack_require__(3613);
|
|
23504
23505
|
const ConnectionIdentifier_1 = __webpack_require__(5999);
|
|
23506
|
+
const DiagnosticsCollector_1 = __webpack_require__(6478);
|
|
23505
23507
|
class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStreaming {
|
|
23506
23508
|
/** Returns a list of WebSocketStates of all PixelStreaming Instances generated. */
|
|
23507
23509
|
get WebsocketStates() {
|
|
@@ -23549,6 +23551,9 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
|
|
|
23549
23551
|
this.config = config;
|
|
23550
23552
|
this.loveLettersList = [];
|
|
23551
23553
|
this.microphoneOverlay = new MicrophoneOverlay_1.MicrophoneOverlay(this);
|
|
23554
|
+
this.diagnosticsCollector = new DiagnosticsCollector_1.DiagnosticsCollector({
|
|
23555
|
+
enableBandwidthProbe: false,
|
|
23556
|
+
});
|
|
23552
23557
|
// this.loveLettersContainer = null;
|
|
23553
23558
|
this.wrapWebSocketOnCloseHandler();
|
|
23554
23559
|
// Bind the event listener function to the class instance
|
|
@@ -23607,7 +23612,10 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
|
|
|
23607
23612
|
*/
|
|
23608
23613
|
/** On version requested, the version of the WebSDK would be returned. */
|
|
23609
23614
|
onVersion(message) {
|
|
23610
|
-
|
|
23615
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
23616
|
+
const diagnostics = yield this.diagnosticsCollector.collect();
|
|
23617
|
+
this.send({ type: "version", version: this.config.VERSION, diagnostics });
|
|
23618
|
+
});
|
|
23611
23619
|
}
|
|
23612
23620
|
/** On ping the session creation timestamp will be updated. */
|
|
23613
23621
|
onPing(message) {
|
|
@@ -23939,6 +23947,339 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
|
|
|
23939
23947
|
exports.ArcwarePixelStreaming = ArcwarePixelStreaming;
|
|
23940
23948
|
|
|
23941
23949
|
|
|
23950
|
+
/***/ }),
|
|
23951
|
+
|
|
23952
|
+
/***/ 6478:
|
|
23953
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
23954
|
+
|
|
23955
|
+
|
|
23956
|
+
/**
|
|
23957
|
+
* DiagnosticsCollector.ts
|
|
23958
|
+
* Lightweight, privacy-aware client diagnostics for troubleshooting + analytics.
|
|
23959
|
+
* WebRTC collection intentionally omitted (to add later).
|
|
23960
|
+
*
|
|
23961
|
+
* Notes:
|
|
23962
|
+
* - Some fields are best-effort due to browser restrictions; they're nullable.
|
|
23963
|
+
* - Bandwidth probe requires a small binary served with:
|
|
23964
|
+
* Content-Type: application/octet-stream
|
|
23965
|
+
* Content-Encoding: identity
|
|
23966
|
+
* Cache-Control: no-store
|
|
23967
|
+
* Default location: /diag/probe.bin
|
|
23968
|
+
*/
|
|
23969
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
23970
|
+
exports.DiagnosticsCollector = void 0;
|
|
23971
|
+
const tslib_1 = __webpack_require__(655);
|
|
23972
|
+
/**
|
|
23973
|
+
* DiagnosticsCollector
|
|
23974
|
+
*/
|
|
23975
|
+
class DiagnosticsCollector {
|
|
23976
|
+
constructor(opts = {}) {
|
|
23977
|
+
var _a, _b, _c, _d;
|
|
23978
|
+
this.opts = {
|
|
23979
|
+
enableBandwidthProbe: (_a = opts.enableBandwidthProbe) !== null && _a !== void 0 ? _a : true,
|
|
23980
|
+
probeUrl: (_b = opts.probeUrl) !== null && _b !== void 0 ? _b : '/diag/probe.bin',
|
|
23981
|
+
respectSaveData: (_c = opts.respectSaveData) !== null && _c !== void 0 ? _c : true,
|
|
23982
|
+
sampleRate: Math.max(0, Math.min(1, (_d = opts.sampleRate) !== null && _d !== void 0 ? _d : 1))
|
|
23983
|
+
};
|
|
23984
|
+
}
|
|
23985
|
+
/**
|
|
23986
|
+
* Collect the diagnostics payload.
|
|
23987
|
+
*/
|
|
23988
|
+
collect() {
|
|
23989
|
+
var _a, _b;
|
|
23990
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
23991
|
+
if (!this.shouldSample()) {
|
|
23992
|
+
return {
|
|
23993
|
+
device: { type: 'desktop', touchSupport: false },
|
|
23994
|
+
runtime: { browser: { family: 'Unknown', version: null }, os: { family: 'Unknown', version: null } },
|
|
23995
|
+
powerHints: { saveData: null, prefersReducedData: null, prefersReducedMotion: null },
|
|
23996
|
+
network: { type: null, effectiveType: null, downlinkMbps: null, rttMs: null, measuredDownlinkMbps: null },
|
|
23997
|
+
timestamps: { collectedAt: Date.now() }
|
|
23998
|
+
};
|
|
23999
|
+
}
|
|
24000
|
+
const collectedAt = Date.now();
|
|
24001
|
+
const [uaInfo, codecSupport, measuredDownlinkMbps] = yield Promise.all([
|
|
24002
|
+
this.getUAInfo(),
|
|
24003
|
+
this.getCodecSupport(),
|
|
24004
|
+
this.maybeMeasureBandwidth()
|
|
24005
|
+
]);
|
|
24006
|
+
return {
|
|
24007
|
+
device: {
|
|
24008
|
+
type: this.inferDeviceType(),
|
|
24009
|
+
vendor: null,
|
|
24010
|
+
model: uaInfo.model,
|
|
24011
|
+
architecture: uaInfo.architecture,
|
|
24012
|
+
bitness: uaInfo.bitness,
|
|
24013
|
+
touchSupport: this.hasTouch(),
|
|
24014
|
+
hardwareConcurrency: (_a = navigator.hardwareConcurrency) !== null && _a !== void 0 ? _a : null,
|
|
24015
|
+
deviceMemory: (_b = navigator.deviceMemory) !== null && _b !== void 0 ? _b : null,
|
|
24016
|
+
orientation: this.getOrientation(),
|
|
24017
|
+
webgl: this.hasWebGL(),
|
|
24018
|
+
codecs: codecSupport
|
|
24019
|
+
},
|
|
24020
|
+
runtime: {
|
|
24021
|
+
browser: { family: uaInfo.browserFamily, version: uaInfo.browserVersion },
|
|
24022
|
+
os: { family: uaInfo.osFamily, version: uaInfo.osVersion }
|
|
24023
|
+
},
|
|
24024
|
+
powerHints: this.getPowerHints(),
|
|
24025
|
+
network: this.getNetworkInfo(measuredDownlinkMbps),
|
|
24026
|
+
timestamps: { collectedAt }
|
|
24027
|
+
};
|
|
24028
|
+
});
|
|
24029
|
+
}
|
|
24030
|
+
/**
|
|
24031
|
+
* Collect a safe subset of WebRTC stats once PC is connected.
|
|
24032
|
+
*/
|
|
24033
|
+
collectWebRTC(pc) {
|
|
24034
|
+
var _a, _b, _c, _d, _e, _f;
|
|
24035
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
24036
|
+
try {
|
|
24037
|
+
const stats = yield pc.getStats();
|
|
24038
|
+
let selected, transport, local, remote;
|
|
24039
|
+
stats.forEach((r) => {
|
|
24040
|
+
if (r.type === 'transport' && r.selectedCandidatePairId)
|
|
24041
|
+
transport = r;
|
|
24042
|
+
if (r.type === 'candidate-pair' && (r.selected || r.nominated))
|
|
24043
|
+
selected = r;
|
|
24044
|
+
});
|
|
24045
|
+
if (selected) {
|
|
24046
|
+
local = stats.get(selected.localCandidateId);
|
|
24047
|
+
remote = stats.get(selected.remoteCandidateId);
|
|
24048
|
+
}
|
|
24049
|
+
return {
|
|
24050
|
+
candidatePairId: (_a = selected === null || selected === void 0 ? void 0 : selected.id) !== null && _a !== void 0 ? _a : null,
|
|
24051
|
+
localCandidateType: (_b = local === null || local === void 0 ? void 0 : local.candidateType) !== null && _b !== void 0 ? _b : null,
|
|
24052
|
+
remoteCandidateType: (_c = remote === null || remote === void 0 ? void 0 : remote.candidateType) !== null && _c !== void 0 ? _c : null,
|
|
24053
|
+
protocol: (_d = local === null || local === void 0 ? void 0 : local.protocol) !== null && _d !== void 0 ? _d : null,
|
|
24054
|
+
networkType: (_e = local === null || local === void 0 ? void 0 : local.networkType) !== null && _e !== void 0 ? _e : null,
|
|
24055
|
+
dtlsCipher: (_f = transport === null || transport === void 0 ? void 0 : transport.dtlsCipher) !== null && _f !== void 0 ? _f : null
|
|
24056
|
+
};
|
|
24057
|
+
}
|
|
24058
|
+
catch (_g) {
|
|
24059
|
+
return {};
|
|
24060
|
+
}
|
|
24061
|
+
});
|
|
24062
|
+
}
|
|
24063
|
+
/**
|
|
24064
|
+
* Helper to embed diagnostics in a hello envelope.
|
|
24065
|
+
*/
|
|
24066
|
+
buildHelloEnvelope(base, pc) {
|
|
24067
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
24068
|
+
const diag = yield this.collect();
|
|
24069
|
+
const webrtc = pc ? yield this.collectWebRTC(pc) : undefined;
|
|
24070
|
+
const ext = webrtc ? { diag: Object.assign(Object.assign({}, diag), { webrtc }) } : { diag };
|
|
24071
|
+
return Object.assign(Object.assign({}, base), { ext });
|
|
24072
|
+
});
|
|
24073
|
+
}
|
|
24074
|
+
// ---------- Internals ----------
|
|
24075
|
+
shouldSample() {
|
|
24076
|
+
if (this.opts.sampleRate >= 1)
|
|
24077
|
+
return true;
|
|
24078
|
+
return Math.random() < this.opts.sampleRate;
|
|
24079
|
+
}
|
|
24080
|
+
hasTouch() {
|
|
24081
|
+
var _a;
|
|
24082
|
+
const nav = navigator;
|
|
24083
|
+
return 'ontouchstart' in window || ((_a = nav.maxTouchPoints) !== null && _a !== void 0 ? _a : 0) > 0;
|
|
24084
|
+
}
|
|
24085
|
+
getOrientation() {
|
|
24086
|
+
var _a;
|
|
24087
|
+
try {
|
|
24088
|
+
if ((_a = screen.orientation) === null || _a === void 0 ? void 0 : _a.type) {
|
|
24089
|
+
return screen.orientation.type.startsWith('portrait') ? 'portrait' : 'landscape';
|
|
24090
|
+
}
|
|
24091
|
+
if (window.matchMedia) {
|
|
24092
|
+
return window.matchMedia('(orientation: portrait)').matches ? 'portrait' : 'landscape';
|
|
24093
|
+
}
|
|
24094
|
+
}
|
|
24095
|
+
catch (_b) { }
|
|
24096
|
+
return null;
|
|
24097
|
+
}
|
|
24098
|
+
hasWebGL() {
|
|
24099
|
+
try {
|
|
24100
|
+
const canvas = document.createElement('canvas');
|
|
24101
|
+
return !!(canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));
|
|
24102
|
+
}
|
|
24103
|
+
catch (_a) {
|
|
24104
|
+
return false;
|
|
24105
|
+
}
|
|
24106
|
+
}
|
|
24107
|
+
/**
|
|
24108
|
+
* Heuristic device type: best-effort only.
|
|
24109
|
+
*/
|
|
24110
|
+
inferDeviceType() {
|
|
24111
|
+
const uaData = navigator.userAgentData;
|
|
24112
|
+
const isMobileCH = (uaData === null || uaData === void 0 ? void 0 : uaData.mobile) === true;
|
|
24113
|
+
const minDim = Math.min(screen.width, screen.height);
|
|
24114
|
+
if (isMobileCH && minDim >= 600)
|
|
24115
|
+
return 'tablet';
|
|
24116
|
+
if (isMobileCH)
|
|
24117
|
+
return 'mobile';
|
|
24118
|
+
if (/\b(iPad|Tablet)\b/i.test(navigator.userAgent))
|
|
24119
|
+
return 'tablet';
|
|
24120
|
+
if (('ontouchstart' in window) && minDim >= 600 && minDim <= 1100)
|
|
24121
|
+
return 'tablet';
|
|
24122
|
+
return 'desktop';
|
|
24123
|
+
}
|
|
24124
|
+
getPowerHints() {
|
|
24125
|
+
const conn = navigator.connection;
|
|
24126
|
+
const saveData = typeof (conn === null || conn === void 0 ? void 0 : conn.saveData) === 'boolean' ? conn.saveData : null;
|
|
24127
|
+
let prefersReducedData = null;
|
|
24128
|
+
let prefersReducedMotion = null;
|
|
24129
|
+
if (typeof window.matchMedia === 'function') {
|
|
24130
|
+
try {
|
|
24131
|
+
const mqData = window.matchMedia('(prefers-reduced-data: reduce)');
|
|
24132
|
+
if (typeof mqData.matches === 'boolean') {
|
|
24133
|
+
prefersReducedData = mqData.matches;
|
|
24134
|
+
}
|
|
24135
|
+
}
|
|
24136
|
+
catch (_a) { }
|
|
24137
|
+
try {
|
|
24138
|
+
const mqMotion = window.matchMedia('(prefers-reduced-motion: reduce)');
|
|
24139
|
+
if (typeof mqMotion.matches === 'boolean') {
|
|
24140
|
+
prefersReducedMotion = mqMotion.matches;
|
|
24141
|
+
}
|
|
24142
|
+
}
|
|
24143
|
+
catch (_b) { }
|
|
24144
|
+
}
|
|
24145
|
+
return { saveData, prefersReducedData, prefersReducedMotion };
|
|
24146
|
+
}
|
|
24147
|
+
getNetworkInfo(measuredDownlinkMbps) {
|
|
24148
|
+
const conn = navigator.connection;
|
|
24149
|
+
return {
|
|
24150
|
+
type: (typeof (conn === null || conn === void 0 ? void 0 : conn.type) === 'string') ? conn.type : null,
|
|
24151
|
+
effectiveType: (typeof (conn === null || conn === void 0 ? void 0 : conn.effectiveType) === 'string') ? conn.effectiveType : null,
|
|
24152
|
+
downlinkMbps: (typeof (conn === null || conn === void 0 ? void 0 : conn.downlink) === 'number') ? conn.downlink : null,
|
|
24153
|
+
rttMs: (typeof (conn === null || conn === void 0 ? void 0 : conn.rtt) === 'number') ? conn.rtt : null,
|
|
24154
|
+
measuredDownlinkMbps
|
|
24155
|
+
};
|
|
24156
|
+
}
|
|
24157
|
+
maybeMeasureBandwidth() {
|
|
24158
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
24159
|
+
const conn = navigator.connection;
|
|
24160
|
+
const saveData = (conn === null || conn === void 0 ? void 0 : conn.saveData) === true;
|
|
24161
|
+
if (!this.opts.enableBandwidthProbe)
|
|
24162
|
+
return null;
|
|
24163
|
+
if (this.opts.respectSaveData && saveData)
|
|
24164
|
+
return null;
|
|
24165
|
+
try {
|
|
24166
|
+
const t0 = performance.now();
|
|
24167
|
+
const res = yield fetch(this.withCacheBuster(this.opts.probeUrl), {
|
|
24168
|
+
cache: 'no-store',
|
|
24169
|
+
credentials: 'omit'
|
|
24170
|
+
});
|
|
24171
|
+
const buf = yield res.arrayBuffer();
|
|
24172
|
+
const t1 = performance.now();
|
|
24173
|
+
const bits = buf.byteLength * 8;
|
|
24174
|
+
const seconds = (t1 - t0) / 1000;
|
|
24175
|
+
if (seconds <= 0.05)
|
|
24176
|
+
return null; // ignore unstable samples
|
|
24177
|
+
return +((bits / seconds) / 1000000).toFixed(2);
|
|
24178
|
+
}
|
|
24179
|
+
catch (_a) {
|
|
24180
|
+
return null;
|
|
24181
|
+
}
|
|
24182
|
+
});
|
|
24183
|
+
}
|
|
24184
|
+
withCacheBuster(url) {
|
|
24185
|
+
var _a, _b;
|
|
24186
|
+
const u = new URL(url, location.origin);
|
|
24187
|
+
const token = (_b = (_a = crypto === null || crypto === void 0 ? void 0 : crypto.randomUUID) === null || _a === void 0 ? void 0 : _a.call(crypto)) !== null && _b !== void 0 ? _b : String(Date.now());
|
|
24188
|
+
u.searchParams.set('cb', token);
|
|
24189
|
+
return u.toString();
|
|
24190
|
+
}
|
|
24191
|
+
getCodecSupport() {
|
|
24192
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
24193
|
+
const [h264, hevc] = yield Promise.all([
|
|
24194
|
+
this.supportsCodec('video/mp4; codecs="avc1.42E01E"'),
|
|
24195
|
+
this.supportsCodec('video/mp4; codecs="hvc1.1.6.L93.B0"')
|
|
24196
|
+
]);
|
|
24197
|
+
return { h264, hevc };
|
|
24198
|
+
});
|
|
24199
|
+
}
|
|
24200
|
+
supportsCodec(mime) {
|
|
24201
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
24202
|
+
try {
|
|
24203
|
+
if ('mediaCapabilities' in navigator) {
|
|
24204
|
+
// @ts-ignore
|
|
24205
|
+
const res = yield navigator.mediaCapabilities.decodingInfo({
|
|
24206
|
+
type: 'file',
|
|
24207
|
+
video: { contentType: mime, width: 1920, height: 1080, bitrate: 5000000, framerate: 30 }
|
|
24208
|
+
});
|
|
24209
|
+
return !!(res === null || res === void 0 ? void 0 : res.supported);
|
|
24210
|
+
}
|
|
24211
|
+
}
|
|
24212
|
+
catch (_a) { }
|
|
24213
|
+
try {
|
|
24214
|
+
const v = document.createElement('video');
|
|
24215
|
+
return v.canPlayType(mime) !== '';
|
|
24216
|
+
}
|
|
24217
|
+
catch (_b) {
|
|
24218
|
+
return false;
|
|
24219
|
+
}
|
|
24220
|
+
});
|
|
24221
|
+
}
|
|
24222
|
+
getUAInfo() {
|
|
24223
|
+
var _a, _b;
|
|
24224
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
24225
|
+
const nav = navigator;
|
|
24226
|
+
const uaData = nav.userAgentData;
|
|
24227
|
+
let browserFamily = 'Unknown', browserVersion = null;
|
|
24228
|
+
let osFamily = 'Unknown', osVersion = null;
|
|
24229
|
+
let model = null, architecture = null, bitness = null;
|
|
24230
|
+
if (uaData === null || uaData === void 0 ? void 0 : uaData.getHighEntropyValues) {
|
|
24231
|
+
try {
|
|
24232
|
+
const high = yield uaData.getHighEntropyValues([
|
|
24233
|
+
'platform', 'platformVersion', 'model', 'architecture', 'bitness', 'fullVersionList'
|
|
24234
|
+
]);
|
|
24235
|
+
osFamily = high.platform || 'Unknown';
|
|
24236
|
+
osVersion = high.platformVersion || null;
|
|
24237
|
+
model = high.model || null;
|
|
24238
|
+
architecture = high.architecture || null;
|
|
24239
|
+
bitness = high.bitness || null;
|
|
24240
|
+
const brands = high.fullVersionList || uaData.brands || [];
|
|
24241
|
+
const real = brands.find(b => b.brand && !/Chromium|Not:?A-?Brand/i.test(b.brand));
|
|
24242
|
+
browserFamily = (real === null || real === void 0 ? void 0 : real.brand) || ((_a = brands[0]) === null || _a === void 0 ? void 0 : _a.brand) || 'Unknown';
|
|
24243
|
+
browserVersion = (real === null || real === void 0 ? void 0 : real.version) || ((_b = brands[0]) === null || _b === void 0 ? void 0 : _b.version) || null;
|
|
24244
|
+
}
|
|
24245
|
+
catch (_c) { }
|
|
24246
|
+
}
|
|
24247
|
+
if (browserFamily === 'Unknown') {
|
|
24248
|
+
const ua = navigator.userAgent;
|
|
24249
|
+
if (/Firefox\/(\S+)/.test(ua)) {
|
|
24250
|
+
browserFamily = 'Firefox';
|
|
24251
|
+
browserVersion = RegExp.$1;
|
|
24252
|
+
}
|
|
24253
|
+
else if (/Edg\/(\S+)/.test(ua)) {
|
|
24254
|
+
browserFamily = 'Edge';
|
|
24255
|
+
browserVersion = RegExp.$1;
|
|
24256
|
+
}
|
|
24257
|
+
else if (/Chrome\/(\S+)/.test(ua)) {
|
|
24258
|
+
browserFamily = 'Chrome';
|
|
24259
|
+
browserVersion = RegExp.$1;
|
|
24260
|
+
}
|
|
24261
|
+
else if (/Version\/(\S+).*Safari/.test(ua)) {
|
|
24262
|
+
browserFamily = 'Safari';
|
|
24263
|
+
browserVersion = RegExp.$1;
|
|
24264
|
+
}
|
|
24265
|
+
if (/Windows/.test(ua))
|
|
24266
|
+
osFamily = 'Windows';
|
|
24267
|
+
else if (/Mac OS X/.test(ua))
|
|
24268
|
+
osFamily = 'macOS';
|
|
24269
|
+
else if (/Android/.test(ua))
|
|
24270
|
+
osFamily = 'Android';
|
|
24271
|
+
else if (/iPhone|iPad|iPod/.test(ua))
|
|
24272
|
+
osFamily = 'iOS';
|
|
24273
|
+
else if (/Linux/.test(ua))
|
|
24274
|
+
osFamily = 'Linux';
|
|
24275
|
+
}
|
|
24276
|
+
return { browserFamily, browserVersion, osFamily, osVersion, model, architecture, bitness };
|
|
24277
|
+
});
|
|
24278
|
+
}
|
|
24279
|
+
}
|
|
24280
|
+
exports.DiagnosticsCollector = DiagnosticsCollector;
|
|
24281
|
+
|
|
24282
|
+
|
|
23942
24283
|
/***/ }),
|
|
23943
24284
|
|
|
23944
24285
|
/***/ 5602:
|
|
@@ -30636,5 +30977,4 @@ function _typeof(o) {
|
|
|
30636
30977
|
/******/ if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true });
|
|
30637
30978
|
/******/
|
|
30638
30979
|
/******/ })()
|
|
30639
|
-
;
|
|
30640
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxlQUFlO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHNCQUFzQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsZ0VBQWdFO0FBQzVJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsZ0VBQWdFO0FBQzVJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixlQUFlO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLDhDQUE4QyxLQUFLLElBQUksTUFBTTtBQUM3RCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFlBQVk7QUFDMUQsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNoUEE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNEJBQTRCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksd0ZBQWMsbUNBQW1DLElBQUk7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx3RkFBYyxxQ0FBcUMsSUFBSTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRixvRUFBb0I7QUFDckc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1GQUFtRixvRUFBb0I7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRixvRUFBb0I7QUFDckc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1GQUFtRixvRUFBb0I7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLENBQUMsOENBQThDO0FBQy9DOzs7Ozs7Ozs7OztBQzVqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsdUNBQXVDLGtCQUFrQixHQUFHLFVBQVUsT0FBTyxrQkFBa0I7QUFDekk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUZBO0FBQzRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQixxREFBVztBQUM1QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNDQTtBQUM0QztBQUM1QztBQUNBO0FBQ0E7QUFDTyw0QkFBNEIscURBQVc7QUFDOUM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUM3RUE7QUFDc0U7QUFDMUI7QUFDNUM7QUFDQTtBQUNBO0FBQ08sNEJBQTRCLHFEQUFXO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHNGQUFZLG1CQUFtQixNQUFNLCtCQUErQixTQUFTO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUVBO0FBQzRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQixxREFBVztBQUM1QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyx5REFBYTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MseURBQWE7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixzRkFBWSwwQ0FBMEMsV0FBVztBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDbFRBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOzs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOzs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOzs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRJQUE0SSxLQUFLO0FBQ2pKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUhBQWlILEtBQUs7QUFDdEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmQTtBQUNBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNzRTtBQUNYO0FBQ1A7QUFDSTtBQUNaO0FBQzRCO0FBQ2hCO0FBQ2pEO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGlFQUFpQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsMkRBQWU7QUFDckQ7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyw2REFBZTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0E7QUFDQSw4Q0FBOEMsd0RBQVk7QUFDMUQsaURBQWlELDJEQUFlO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixzRkFBWTtBQUM1QixnQkFBZ0Isc0ZBQVk7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCx3REFBWTtBQUM5RCxxREFBcUQsMkRBQWU7QUFDcEU7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNGQUFZO0FBQ2hDLG9CQUFvQixzRkFBWTtBQUNoQztBQUNBO0FBQ0Esb0RBQW9ELDJFQUErQjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQix3QkFBd0Isc0ZBQVksNEJBQTRCLElBQUk7QUFDcEUscUJBQXFCO0FBQ3JCLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QywyRUFBK0I7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGdCQUFnQixFQUFFLDhCQUE4QjtBQUN2RjtBQUNBLHNFQUFzRSwyRUFBK0I7QUFDckc7QUFDQTtBQUNBLHNEQUFzRCwyRUFBK0I7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCwyRUFBK0I7QUFDckY7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkYsNkJBQTZCO0FBQ3hIO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBLDhDQUE4QyxnRUFBb0IsY0FBYyxjQUFjO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHNFQUEwQjtBQUNoRSx3QkFBd0IsK0dBQXFDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEscUZBQVc7QUFDbkI7QUFDQSxzQ0FBc0MsMkRBQWU7QUFDckQ7QUFDQTtBQUNBLGdCQUFnQixxRkFBVyw4REFBOEQsbUJBQW1CLGNBQWMsdUJBQXVCLFlBQVksc0JBQXNCLFNBQVMsbUJBQW1CO0FBQy9NO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxxRkFBVztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHFGQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxxRkFBVztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsMkVBQStCO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlIQUFpSCx1QkFBdUI7QUFDeEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwrRUFBbUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpSEFBaUgsdUJBQXVCO0FBQ3hJO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0VBQW1DO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGtEQUFhO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTLEVBQUUsdURBQWtCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdG1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNvRDtBQUM0QjtBQUNwQjtBQUNVO0FBQ3loQjtBQUNwaUI7QUFDcUI7QUFDbUI7QUFDdkQ7QUFDZ0I7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDBFQUEwQjtBQUMzRDtBQUNBO0FBQ0EsMkNBQTJDLHdGQUFzQjtBQUNqRSxvQ0FBb0MsbUVBQWU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQscUVBQXlCO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsaURBQWlELDhEQUFrQjtBQUNuRTtBQUNBLFNBQVM7QUFDVCxpREFBaUQseUVBQTZCO0FBQzlFO0FBQ0EsU0FBUztBQUNULGlEQUFpRCxtRUFBdUI7QUFDeEUscUNBQXFDLG1FQUF1QixxQkFBcUIseUNBQXlDO0FBQzFILGtGQUFrRiw0REFBZ0I7QUFDbEcsU0FBUztBQUNUO0FBQ0EsaURBQWlELCtEQUFtQjtBQUNwRTtBQUNBLFNBQVM7QUFDVCxpREFBaUQsNERBQWdCO0FBQ2pFO0FBQ0EsU0FBUztBQUNULGlEQUFpRCxzRUFBMEI7QUFDM0Usa0ZBQWtGLDREQUFnQjtBQUNsRyxTQUFTO0FBQ1QsaURBQWlELDREQUFnQjtBQUNqRTtBQUNBLFNBQVM7QUFDVCxpREFBaUQsOERBQWtCO0FBQ25FO0FBQ0EsU0FBUztBQUNUO0FBQ0Esd0RBQXdELG1FQUF1QjtBQUMvRSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0EsWUFBWSxxRkFBVztBQUN2QjtBQUNBLDBDQUEwQyw4RUFBa0M7QUFDNUUsU0FBUztBQUNULHdEQUF3RCxtRUFBdUI7QUFDL0UsWUFBWSxxRkFBVztBQUN2QjtBQUNBLFlBQVkscUZBQVc7QUFDdkI7QUFDQSwwQ0FBMEMsOEVBQWtDO0FBQzVFLFNBQVM7QUFDVDtBQUNBLHdEQUF3RCx3RUFBNEI7QUFDcEYsWUFBWSxxRkFBVztBQUN2QjtBQUNBLFlBQVkscUZBQVc7QUFDdkIsMENBQTBDLDhFQUFrQztBQUM1RSxTQUFTO0FBQ1Qsd0RBQXdELHdFQUE0QjtBQUNwRixZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0EsWUFBWSxxRkFBVztBQUN2QiwwQ0FBMEMsOEVBQWtDO0FBQzVFLFNBQVM7QUFDVDtBQUNBLHdEQUF3RCw4RUFBa0M7QUFDMUY7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0EsWUFBWSxxRkFBVztBQUN2QixTQUFTO0FBQ1Qsd0RBQXdELDhFQUFrQztBQUMxRjtBQUNBLFlBQVkscUZBQVc7QUFDdkI7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCLFNBQVM7QUFDVDtBQUNBLHdEQUF3RCw4RUFBa0M7QUFDMUYsWUFBWSxxRkFBVztBQUN2QjtBQUNBLFlBQVkscUZBQVc7QUFDdkIsU0FBUztBQUNULHdEQUF3RCw4RUFBa0M7QUFDMUYsWUFBWSxxRkFBVztBQUN2QjtBQUNBLFlBQVkscUZBQVc7QUFDdkIsU0FBUztBQUNULHdEQUF3RCx1RUFBMkI7QUFDbkYsWUFBWSxxRkFBVztBQUN2QjtBQUNBLFlBQVkscUZBQVc7QUFDdkIsU0FBUztBQUNULHVEQUF1RCwyRUFBK0I7QUFDdEY7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhFQUE4RSwyRUFBK0I7QUFDN0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxxRUFBcUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsb0VBQW9CO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qyx3RUFBd0I7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyw2REFBaUI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsd0ZBQWM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHFGQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDRFQUFnQztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsd0ZBQWM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHFGQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDRFQUFnQztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHNFQUFzQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLDhEQUFjO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsbUVBQW1CLEdBQUcsWUFBWTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLG9FQUFvQixHQUFHLGFBQWE7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxzRUFBc0IsR0FBRyxhQUFhO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsa0VBQWtCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsdUVBQXVCO0FBQ3BFO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxxRUFBcUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxvRUFBb0I7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxpRUFBaUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxxRUFBcUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsc0VBQXNCLEdBQUcsZ0JBQWdCO0FBQ3RGO0FBQ0E7QUFDQSw2Q0FBNkMsbUZBQW1DLEdBQUcsVUFBVTtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGtFQUFrQixHQUFHLDZCQUE2QjtBQUMvRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsc0VBQXNCLEdBQUcsV0FBVztBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxvRUFBb0IsR0FBRyxVQUFVO0FBQzlFO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxRkFBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsb0VBQWdCO0FBQzlDLFFBQVEscUZBQVcseUJBQXlCLGFBQWE7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLG1FQUF1QjtBQUNyRTtBQUNBLDhDQUE4QyxtRUFBdUI7QUFDckUsc0RBQXNELG1FQUF1QjtBQUM3RTtBQUNBLDhDQUE4QyxtRUFBdUIsZ0NBQWdDLG1FQUF1QjtBQUM1SCxzREFBc0QsbUVBQXVCO0FBQzdFO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qyx3RUFBNEI7QUFDMUU7QUFDQSw4Q0FBOEMsd0VBQTRCO0FBQzFFLHNEQUFzRCx3RUFBNEI7QUFDbEY7QUFDQSw4Q0FBOEMsd0VBQTRCLGdDQUFnQyx3RUFBNEI7QUFDdEksc0RBQXNELHdFQUE0QjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLDhFQUFrQztBQUNwRSxrREFBa0QsOEVBQWtDLGtDQUFrQyw4RUFBa0M7QUFDeEo7QUFDQSxrQ0FBa0MsOEVBQWtDO0FBQ3BFLGtEQUFrRCw4RUFBa0Msa0NBQWtDLDhFQUFrQztBQUN4SjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw4RUFBa0MsZ0NBQWdDLDhFQUFrQztBQUM5SSxrREFBa0QsOEVBQWtDO0FBQ3BGO0FBQ0EsMENBQTBDLDhFQUFrQyxnQ0FBZ0MsOEVBQWtDO0FBQzlJLGtEQUFrRCw4RUFBa0M7QUFDcEY7QUFDQSwwQ0FBMEMsdUVBQTJCLGdDQUFnQyx1RUFBMkI7QUFDaEksa0RBQWtELHVFQUEyQjtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHFFQUF5QjtBQUM1RDtBQUNBO0FBQ0EsNkNBQTZDLGdFQUFnQixHQUFHLG9CQUFvQjtBQUNwRjtBQUNBO0FBQ0EsNkNBQTZDLG9FQUFvQixHQUFHLGtCQUFrQjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELDJFQUEyQjtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELDJHQUFnQztBQUN6RixxREFBcUQsaUZBQWlDLEdBQUcsUUFBUTtBQUNqRyxhQUFhO0FBQ2IsdUVBQXVFLFFBQVEsWUFBWTtBQUMzRjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixxR0FBNkI7QUFDdkQsWUFBWSx3RkFBYyxnREFBZ0QsS0FBSztBQUMvRTtBQUNBO0FBQ0EsMEJBQTBCLG1HQUEyQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN2cUJBO0FBQ3NFO0FBQy9EO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEscUZBQVc7QUFDbkI7QUFDQSxRQUFRLHFGQUFXO0FBQ25CO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNsQ0E7QUFDc0U7QUFDL0Q7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHNGQUFZLG1FQUFtRSxZQUFZO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBLFlBQVksc0ZBQVksb0VBQW9FO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiw2QkFBNkIsbUJBQW1CLHlEQUF5RDtBQUN6RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxvQkFBb0I7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFlBQVkscUZBQVcsNERBQTRELGFBQWEsSUFBSSw0QkFBNEI7QUFDaEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ3JIQTtBQUNzRTtBQUMvRDtBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHFGQUFXLDhCQUE4QixpQkFBaUI7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRDQUE0QztBQUM3Qzs7Ozs7Ozs7Ozs7QUNqTkE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdDQTtBQUNzRTtBQUMvRDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx3RkFBYztBQUMxQix3RUFBd0UscUJBQXFCO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UscUJBQXFCO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDbllBO0FBQ3NFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUZBQVc7QUFDdkI7QUFDQTtBQUNBLFFBQVEscUZBQVc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekY7QUFDQSxTQUFTO0FBQ1QsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekY7QUFDQSxTQUFTO0FBQ1QsNERBQTRELHFHQUE2QjtBQUN6RjtBQUNBLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGO0FBQ0EsU0FBUztBQUNULDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtB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QTtBQUNBLFFBQVEscUZBQVc7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsbUVBQXVCO0FBQzlFO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLHVDQUF1Qyw0REFBWSxHQUFHLGFBQWE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcFdBO0FBQytFO0FBQ3JCO0FBQzFCO0FBQ21CO0FBQ0E7QUFDSTtBQUNBO0FBQ0o7QUFDYztBQUNEO0FBQ007QUFDeEI7QUFDK0I7QUFDakM7QUFDbUM7QUFDSTtBQUNWO0FBQ007QUFDbUI7QUFDSztBQUMxQztBQUNEO0FBQ3hCO0FBQ3lCO0FBQzdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekJBO0FBQ2lHO0FBQ3RDO0FBQ007QUFDWjtBQUNBO0FBQ0U7QUFDSjtBQUNUO0FBQ1k7QUFDRjtBQUNOO0FBQ1k7QUFDWjtBQUNNO0FBQzJDO0FBQ2pDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzREFBUTtBQUNwQztBQUNBLFlBQVksd0VBQWM7QUFDMUI7QUFDQSxrQ0FBa0Msc0RBQVU7QUFDNUM7QUFDQTtBQUNBLFlBQVksd0VBQWM7QUFDMUI7QUFDQSxxQ0FBcUMsNERBQWE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxrRUFBZ0I7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCwwRUFBb0I7QUFDaEYsd0RBQXdELHdGQUFZO0FBQ3BFO0FBQ0EsU0FBUztBQUNULDZDQUE2Qyx3RkFBWTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLHlFQUFpQjtBQUN0RCxrQ0FBa0MsbUVBQWM7QUFDaEQsK0JBQStCLDZEQUFXO0FBQzFDLCtCQUErQiw2REFBVztBQUMxQyxnQ0FBZ0MsZ0VBQVk7QUFDNUMsOEJBQThCLDREQUFVO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxjQUFjLG1GQUE2QjtBQUNsRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixtREFBUTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLDRGQUFzQztBQUMxRztBQUNBLG9CQUFvQix1RUFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELDRGQUFzQztBQUNwRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQywrREFBYztBQUNwRDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsNENBQTRDLCtEQUFjO0FBQzFEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSw4Q0FBOEMsK0RBQWM7QUFDNUQ7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsMEVBQW9CO0FBQ2hGLDZDQUE2QywwRUFBb0IsbUJBQW1CLGdDQUFnQztBQUNwSDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsOERBQThELFFBQVEseUJBQXlCO0FBQy9GLDREQUE0RCxRQUFRLGFBQWE7QUFDakY7QUFDQTtBQUNBLDZEQUE2RCxRQUFRLFNBQVM7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxRQUFRLHNDQUFzQztBQUM1RztBQUNBO0FBQ0EsMkRBQTJELFFBQVEsV0FBVztBQUM5RTtBQUNBLDhEQUE4RCxRQUFRLFVBQVU7QUFDaEYsMkRBQTJELFFBQVEseUJBQXlCO0FBQzVGLHlEQUF5RCxRQUFRLG1CQUFtQjtBQUNwRiw2REFBNkQsUUFBUSxlQUFlO0FBQ3BGLDZEQUE2RCxRQUFRLGtCQUFrQjtBQUN2Rix3RUFBd0UsUUFBUSxVQUFVO0FBQzFGLCtEQUErRCxRQUFRLGlFQUFpRTtBQUN4SSwyREFBMkQsUUFBUSxXQUFXO0FBQzlFO0FBQ0EsdURBQXVELFFBQVEsU0FBUztBQUN4RSxxRUFBcUUsMkZBQWM7QUFDbkY7QUFDQTtBQUNBLGtEQUFrRCxzR0FBMEI7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsNkZBQWlCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxZQUFZO0FBQ2hGO0FBQ0EsMENBQTBDLGdCQUFnQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHdGQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QywrRkFBbUI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLGlHQUFxQjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsa0JBQWtCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxrQkFBa0I7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxRQUFRO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw2REFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHFCQUFxQjtBQUNyQztBQUNBLGtCQUFrQiw2R0FBaUM7QUFDbkQsK0VBQStFLDZHQUFpQztBQUNoSDtBQUNBLDZDQUE2Qyw2R0FBaUM7QUFDOUU7QUFDQTtBQUNBLDRDQUE0Qyw2R0FBaUM7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdsQkE7QUFDOEw7QUFDOUk7QUFDSTtBQUNKO0FBQ0k7QUFDMEQ7QUFDdkc7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsMEVBQW9CLE1BQU0sdUZBQVcsQ0FBQywwRUFBb0I7QUFDdkYsNkNBQTZDLGdDQUFnQztBQUM3RSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMseURBQWE7QUFDMUQ7QUFDQTtBQUNBLDZDQUE2Qyx5REFBYTtBQUMxRDtBQUNBO0FBQ0Esc0RBQXNELHlEQUFhO0FBQ25FO0FBQ0E7QUFDQSx5REFBeUQsNkRBQWU7QUFDeEU7QUFDQTtBQUNBLHdEQUF3RCw2REFBZTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDBFQUFnQixpQkFBaUIscUZBQStCO0FBQzVFO0FBQ0EsaUZBQWlGLHFGQUErQjtBQUNoSDtBQUNBLGdCQUFnQiwwRUFBZ0IsaUJBQWlCLDhHQUFrQztBQUNuRixpRkFBaUYsOEdBQWtDO0FBQ25ILGdCQUFnQiwwRUFBZ0IsaUJBQWlCLHVHQUEyQjtBQUM1RSxxRkFBcUYsdUdBQTJCO0FBQ2hILGdCQUFnQiwwRUFBZ0IsaUJBQWlCLDZGQUFpQjtBQUNsRSx3RUFBd0UsNkZBQWlCO0FBQ3pGLGdCQUFnQiwwRUFBZ0IsaUJBQWlCLCtGQUFtQjtBQUNwRSx3RUFBd0UsK0ZBQW1CO0FBQzNGLGdCQUFnQiwwRUFBZ0IsaUJBQWlCLHdGQUFZO0FBQzdELHdFQUF3RSx3RkFBWTtBQUNwRixnQkFBZ0IsMEVBQWdCLGlCQUFpQiwyRkFBZTtBQUNoRSx3RUFBd0UsMkZBQWU7QUFDdkYsZ0JBQWdCLDBFQUFnQixpQkFBaUIsaUdBQXFCO0FBQ3RFLHdFQUF3RSxpR0FBcUI7QUFDN0YsZ0JBQWdCLDBFQUFnQixpQkFBaUIscUdBQXlCO0FBQzFFLHdFQUF3RSxxR0FBeUI7QUFDakcsZ0JBQWdCLDBFQUFnQixpQkFBaUIsZ0dBQW9CO0FBQ3JFLHdFQUF3RSxnR0FBb0I7QUFDNUYsZ0JBQWdCLDBFQUFnQixpQkFBaUIsMkZBQWU7QUFDaEUsd0VBQXdFLDJGQUFlO0FBQ3ZGLGdCQUFnQiwwRUFBZ0IsaUJBQWlCLHFHQUF5QjtBQUMxRSx3RUFBd0UscUdBQXlCO0FBQ2pHLGdCQUFnQiwwRUFBZ0IsaUJBQWlCLDhGQUFrQjtBQUNuRSx3RUFBd0UsOEZBQWtCO0FBQzFGLGdCQUFnQiwwRUFBZ0IsaUJBQWlCLGlHQUFxQjtBQUN0RSx3RUFBd0UsaUdBQXFCO0FBQzdGLGdCQUFnQiwwRUFBZ0IsaUJBQWlCLDRHQUFnQztBQUNqRix1RkFBdUYsNEdBQWdDO0FBQ3ZILGdCQUFnQiwwRUFBZ0IsaUJBQWlCLDhHQUFrQztBQUNuRix1RkFBdUYsOEdBQWtDO0FBQ3pILGdCQUFnQiwwRUFBZ0IsaUJBQWlCLGtIQUFzQztBQUN2Rix1RkFBdUYsa0hBQXNDO0FBQzdILGdCQUFnQiwwRUFBZ0IsaUJBQWlCLHNIQUEwQztBQUMzRix1RkFBdUYsc0hBQTBDO0FBQ2pJLGdCQUFnQiwwRUFBZ0IsaUJBQWlCLDRHQUFnQztBQUNqRix1RkFBdUYsNEdBQWdDO0FBQ3ZIO0FBQ0EsWUFBWSwwRUFBZ0IsaUJBQWlCLHlFQUFtQjtBQUNoRTtBQUNBLG1GQUFtRix5RUFBbUI7QUFDdEcsZ0JBQWdCLDBFQUFnQixpQkFBaUIseUdBQTZCO0FBQzlFLDBFQUEwRSx5R0FBNkI7QUFDdkcsZ0JBQWdCLDBFQUFnQixpQkFBaUIsbUdBQXVCO0FBQ3hFLDBFQUEwRSxtR0FBdUI7QUFDakcsZ0JBQWdCLDBFQUFnQixpQkFBaUIsMEVBQW9CO0FBQ3JFLDBFQUEwRSwwRUFBb0I7QUFDOUY7QUFDQSxZQUFZLDBFQUFnQixpQkFBaUIsNEVBQXNCO0FBQ25FO0FBQ0Esb0ZBQW9GLDRFQUFzQjtBQUMxRyxnQkFBZ0IsMEVBQWdCLGlCQUFpQiwrRkFBbUI7QUFDcEUsMkVBQTJFLCtGQUFtQjtBQUM5RixnQkFBZ0IsMEVBQWdCLGlCQUFpQiw0RkFBZ0I7QUFDakUsMkVBQTJFLDRGQUFnQjtBQUMzRixnQkFBZ0IsMEVBQWdCLGlCQUFpQixzR0FBMEI7QUFDM0UsMkVBQTJFLHNHQUEwQjtBQUNyRyxnQkFBZ0IsMEVBQWdCLGlCQUFpQiw0RkFBZ0I7QUFDakUsMkVBQTJFLDRGQUFnQjtBQUMzRixnQkFBZ0IsMEVBQWdCLGlCQUFpQiw4RkFBa0I7QUFDbkUsMkVBQTJFLDhGQUFrQjtBQUM3RixnQkFBZ0IsMEVBQWdCLGlCQUFpQixtR0FBdUI7QUFDeEUsMkVBQTJFLG1HQUF1QjtBQUNsRztBQUNBLFlBQVksMEVBQWdCLGlCQUFpQiw4RUFBd0I7QUFDckU7QUFDQSxzRkFBc0YsOEVBQXdCO0FBQzlHLGdCQUFnQiwwRUFBZ0IsaUJBQWlCLDhHQUFrQztBQUNuRiw0RkFBNEYsOEdBQWtDO0FBQzlILGdCQUFnQiwwRUFBZ0IsaUJBQWlCLDhHQUFrQztBQUNuRiw0RkFBNEYsOEdBQWtDO0FBQzlILHFFQUFxRSwyR0FBK0I7QUFDcEcsZ0JBQWdCLDBFQUFnQixpQkFBaUIsMkdBQStCO0FBQ2hGLDBGQUEwRiwyR0FBK0I7QUFDekg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDBFQUFnQixpQkFBaUIsNkdBQWlDO0FBQ2xGLDBGQUEwRiw2R0FBaUM7QUFDM0g7QUFDQSxZQUFZLDBFQUFnQixpQkFBaUIsNkVBQXVCO0FBQ3BFO0FBQ0EscUZBQXFGLDZFQUF1QjtBQUM1RyxnQkFBZ0IsMEVBQWdCLGlCQUFpQix1R0FBMkI7QUFDNUUsMkZBQTJGLHVHQUEyQjtBQUN0SCxnQkFBZ0IsMEVBQWdCLGlCQUFpQiw4R0FBa0M7QUFDbkYsMkZBQTJGLDhHQUFrQztBQUM3SCxnQkFBZ0IsMEVBQWdCLGlCQUFpQiw4R0FBa0M7QUFDbkYsMkZBQTJGLDhHQUFrQztBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixRQUFRLG9CQUFvQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMEZBQWMscUNBQXFDLElBQUk7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHdGQUFRO0FBQ3BCO0FBQ0E7QUFDQSxpQkFBaUIsMkZBQVc7QUFDNUI7QUFDQTtBQUNBLGlCQUFpQix3RkFBUTtBQUN6QjtBQUNBO0FBQ0EsaUJBQWlCLDBGQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHdGQUFRO0FBQ3BCO0FBQ0E7QUFDQSxpQkFBaUIsMkZBQVc7QUFDNUI7QUFDQTtBQUNBLGlCQUFpQix3RkFBUTtBQUN6QjtBQUNBO0FBQ0EsaUJBQWlCLDBGQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDcFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN4QkE7QUFDZ0Q7QUFDekMsNEJBQTRCLHlEQUFhO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN6R0E7QUFDd0U7QUFDeEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ08sOEJBQThCLHlEQUFhO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwwRkFBYyxpRUFBaUUsZ0JBQWdCLHVCQUF1QixpQkFBaUI7QUFDM0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEhBO0FBQ2dEO0FBQ3pDLDhCQUE4Qix5REFBYTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFFBQVE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLHFCQUFxQjtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEhBO0FBQ2dEO0FBQ3pDLDRCQUE0Qix5REFBYTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckdBO0FBQ2dEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNPLHlCQUF5Qix5REFBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUhBQXVILFVBQVU7QUFDakk7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDM0NBO0FBQ3dFO0FBQzVCO0FBQzVDO0FBQ0E7QUFDQTtBQUNPLDRCQUE0QixxREFBVztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsdUZBQVc7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDL0JBO0FBQ2dEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNPLDZCQUE2Qix5REFBYTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwQ0E7QUFDZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ08sZ0NBQWdDLHlEQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckNBO0FBQzRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNPLDJCQUEyQixxREFBVztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMvQkE7QUFDNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ08sMEJBQTBCLHFEQUFXO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9CQTtBQUNnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDTywwQkFBMEIseURBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN2Q0E7QUFDNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ08sMEJBQTBCLHFEQUFXO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDekJBO0FBQ3NCO0FBQ2lCO0FBQ087QUFDdkM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0R0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNqREE7QUFDd0U7QUFDakI7QUFDdkQ7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLDRFQUF5QjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1RkFBVztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3BEQTtBQUM0QztBQUM0QjtBQUMxQjtBQUNvQjtBQUNPO0FBQ3pFO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHFEQUFXO0FBQzFDLDBDQUEwQywyRUFBc0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVFQUFnQixlQUFlLDZFQUEwQjtBQUN6RTtBQUNBLDZDQUE2Qyw2RUFBMEI7QUFDdkU7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVFQUFnQixlQUFlLDZFQUEwQjtBQUN6RTtBQUNBLDZDQUE2Qyw2RUFBMEI7QUFDdkU7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVFQUFnQixlQUFlLDRFQUF5QjtBQUN4RTtBQUNBO0FBQ0EsZ0JBQWdCLHVFQUFnQixlQUFlLHVGQUFvQztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUZBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsNEJBQTRCLGtFQUFxQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdUZBQVcsZ0NBQWdDLHNCQUFzQjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsNkVBQTBCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDZFQUEwQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDZFQUEwQjtBQUNwRCxhQUFhLHVFQUFnQixlQUFlLDZFQUEwQjtBQUN0RTtBQUNBO0FBQ0EsMEJBQTBCLDZFQUEwQjtBQUNwRCxhQUFhLHVFQUFnQixlQUFlLDZFQUEwQjtBQUN0RTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNkVBQTBCLGtCQUFrQiw2RUFBMEI7QUFDaEc7QUFDQTtBQUNBLHlDQUF5Qyw2RUFBMEI7QUFDbkUsNEJBQTRCLFVBQVUsSUFBSSxLQUFLO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzdXQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHNEQUFzRDtBQUNoRDtBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFdBQVc7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxXQUFXO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsV0FBVztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxXQUFXO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDTztBQUNQO0FBQ0E7QUFDQSx3QkFBd0IsWUFBWTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixhQUFhO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFD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ZSxZQUFZLCtEQUFlLE9BQU87QUFDcEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDeEcrRDtBQUMvRDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsNkRBQWU7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELDJEQUFhO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLDZEQUFlO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMEJBQTBCLDJCQUEyQjtBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCLDJCQUEyQjtBQUNyRCxzREFBc0Q7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDJDQUEyQztBQUMzQzs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLDhFQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxnQkFBZ0I7QUFDckI7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyw4RUFBUSxHQUFHO0FBQzlDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMEJBQTBCLDJCQUEyQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0RBQWtEOztBQUVsRDtBQUNBO0FBQ0EsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDhFQUFRLEdBQUc7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUEsa0NBQWtDO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1Q0FBdUM7QUFDM0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHdDQUF3QztBQUM1RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLHlDQUF5QztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQix5Q0FBeUM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsbUNBQW1DO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsb0JBQW9CLHdDQUF3QztBQUM1RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQiw4RUFBUSxHQUFHO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkVBQTJFLGFBQWE7QUFDeEY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLHdEQUFPO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sTUFBTSx3REFBTztBQUNiO0FBQ0E7O0FBRUEsRUFBRSxrRkFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxp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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0IsT0FBTztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGlEQUFpRDtBQUN2RjtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHlCQUF5QjtBQUMvRDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHVCQUF1QjtBQUM3RDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxnQ0FBZ0MsMkRBQTJEO0FBQzNGO0FBQ0E7QUFDQSxnQ0FBZ0MseURBQXlEO0FBQ3pGO0FBQ0E7QUFDQSxnQ0FBZ0MsMkRBQTJEO0FBQzNGO0FBQ0E7QUFDQSxnQ0FBZ0MsMERBQTBEO0FBQzFGO0FBQ0E7QUFDQSxnQ0FBZ0MsMERBQTBEO0FBQzFGO0FBQ0E7QUFDQSxnQ0FBZ0MsMkRBQTJEO0FBQzNGO0FBQ0E7QUFDQSxnQ0FBZ0MsMERBQTBEO0FBQzFGO0FBQ0E7QUFDQSxnQ0FBZ0Msd0RBQXdEO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGNBQWM7QUFDMUQsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLHFCQUFxQjtBQUNqRSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMscUJBQXFCO0FBQ2pFLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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QixxQkFBcUIsc0RBQU87QUFDNUI7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUc7QUFDSDs7Ozs7OztVQ1JBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxpQ0FBaUMsV0FBVztXQUM1QztXQUNBOzs7OztXQ1BBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztVRU5BO1VBQ0E7VUFDQTtVQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9FdmVudC9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9Mb2dnZXIvTG9nZ2VyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vTWVzc2FnZXMvbWVzc2FnZV9oZWxwZXJzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vTWVzc2FnZXMvbWVzc2FnZV9yZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41L2Rpc3QvZXNtL01lc3NhZ2VzL3NpZ25hbGxpbmdfbWVzc2FnZXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9Qcm90b2NvbC9LZWVwYWxpdmVNb25pdG9yLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vUHJvdG9jb2wvU2lnbmFsbGluZ1Byb3RvY29sLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vVHJhbnNwb3J0L1dlYlNvY2tldFRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41L2Rpc3QvZXNtL1RyYW5zcG9ydC9XZWJTb2NrZXRUcmFuc3BvcnROSlMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9VdGlsL1NkcFV0aWxzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vcGl4ZWxzdHJlYW1pbmdjb21tb24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0FGSy9BRktDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9Db25maWcvQ29uZmlnLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9Db25maWcvU2V0dGluZ0Jhc2UuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nRmxhZy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdOdW1iZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nT3B0aW9uLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9Db25maWcvU2V0dGluZ1RleHQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0RhdGFDaGFubmVsL0RhdGFDaGFubmVsQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vRGF0YUNoYW5uZWwvRGF0YUNoYW5uZWxMYXRlbmN5VGVzdENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0RhdGFDaGFubmVsL0RhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXN1bHRzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbFNlbmRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vRGF0YUNoYW5uZWwvSW5pdGlhbFNldHRpbmdzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9EYXRhQ2hhbm5lbC9MYXRlbmN5VGVzdFJlc3VsdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0ZyZWV6ZUZyYW1lL0ZyZWV6ZUZyYW1lLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9GcmVlemVGcmFtZS9GcmVlemVGcmFtZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9HYW1lcGFkQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL0dhbWVwYWRUeXBlcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL0lucHV0Q2xhc3Nlc0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9LZXlDb2Rlcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL0tleWJvYXJkQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL01vdXNlQnV0dG9ucy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL01vdXNlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL01vdXNlQ29udHJvbGxlckhvdmVyaW5nLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvTW91c2VDb250cm9sbGVyTG9ja2VkLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvU3BlY2lhbEtleUNvZGVzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvVG91Y2hDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvVG91Y2hDb250cm9sbGVyRmFrZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL1hSR2FtZXBhZENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9BZ2dyZWdhdGVkU3RhdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9DYW5kaWRhdGVQYWlyU3RhdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9DYW5kaWRhdGVTdGF0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvRGF0YUNoYW5uZWxTdGF0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0luYm91bmRSVFBTdGF0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0xhdGVuY3lDYWxjdWxhdG9yLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvT3V0Qm91bmRSVFBTdGF0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL1Nlc3Npb25TdGF0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL1N0cmVhbVN0YXRzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9QaXhlbFN0cmVhbWluZy9QaXhlbFN0cmVhbWluZy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVWVJbnN0YW5jZU1lc3NhZ2UvUmVzcG9uc2VDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9VZUluc3RhbmNlTWVzc2FnZS9TZW5kTWVzc2FnZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1VlSW5zdGFuY2VNZXNzYWdlL1N0cmVhbU1lc3NhZ2VDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9VZUluc3RhbmNlTWVzc2FnZS9Ub1N0cmVhbWVyTWVzc2FnZXNDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9VdGlsL0Jyb3dzZXJVdGlscy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVXRpbC9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1V0aWwvRmlsZVV0aWwuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1V0aWwvSVVSTFNlYXJjaFBhcmFtcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVXRpbC9JbnB1dENvb3JkVHJhbnNsYXRvci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVXRpbC9SVENVdGlscy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVmlkZW9QbGF5ZXIvU3RyZWFtQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVmlkZW9QbGF5ZXIvVmlkZW9QbGF5ZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1dlYlJ0Y1BsYXllci9XZWJSdGNQbGF5ZXJDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9XZWJYUi9XZWJYUkNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL3BpeGVsc3RyZWFtaW5nZnJvbnRlbmQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL0FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9Db25maWcvQ29uZmlnVUkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nVUlCYXNlLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9Db25maWcvU2V0dGluZ1VJRmxhZy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdVSU51bWJlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdVSU9wdGlvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdVSVRleHQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL092ZXJsYXkvQUZLT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9BY3Rpb25PdmVybGF5LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9PdmVybGF5L0Jhc2VPdmVybGF5LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9PdmVybGF5L0Nvbm5lY3RPdmVybGF5LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9PdmVybGF5L0Rpc2Nvbm5lY3RPdmVybGF5LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9PdmVybGF5L0Vycm9yT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9JbmZvT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9QbGF5T3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9UZXh0T3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vU3R5bGVzL1BpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL0NvbnRyb2xzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9EYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9FZGl0VGV4dE1vZGFsLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9GdWxsc2NyZWVuSWNvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvTGFiZWxsZWRCdXR0b24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL0xhdGVuY3lUZXN0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9TZXR0aW5nc0ljb24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1N0YXRzSWNvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvU3RhdHNQYW5lbC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvVUlDb25maWd1cmF0aW9uVHlwZXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1ZpZGVvUXBJbmRpY2F0b3IuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1hSSWNvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVXRpbC9NYXRoVXRpbHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL3BpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvYXNzZXJ0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2Jhc2U2NC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9iaW5hcnktZm9ybWF0LWNvbnRyYWN0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2JpbmFyeS1yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvYmluYXJ5LXdyaXRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9nb29nLXZhcmludC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9qc29uLWZvcm1hdC1jb250cmFjdC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9qc29uLXR5cGluZ3MuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvbG93ZXItY2FtZWwtY2FzZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9tZXNzYWdlLXR5cGUtY29udHJhY3QuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvbWVzc2FnZS10eXBlLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L29uZW9mLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3BiLWxvbmcuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1iaW5hcnktcmVhZGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tYmluYXJ5LXdyaXRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWVxdWFscy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWluZm8uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1qc29uLXJlYWRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWpzb24td3JpdGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tbG9uZy1jb252ZXJ0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tbWVyZ2UtcGFydGlhbC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLXNjYWxhci1kZWZhdWx0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tdHlwZS1jaGVjay5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3RvSW50ZWdlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9hZGRNaWxsaXNlY29uZHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vYWRkU2Vjb25kcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9pc0JlZm9yZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS90b0RhdGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9oeXBoZW5hdGUtc3R5bGUtbmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2lzLWluLWJyb3dzZXIvZGlzdC9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9qc3MtcGx1Z2luLWNhbWVsLWNhc2UvZGlzdC9qc3MtcGx1Z2luLWNhbWVsLWNhc2UuZXNtLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvanNzLXBsdWdpbi1nbG9iYWwvZGlzdC9qc3MtcGx1Z2luLWdsb2JhbC5lc20uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9qc3MvZGlzdC9qc3MuZXNtLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvc2RwL3NkcC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL3Rpbnktd2FybmluZy9kaXN0L3Rpbnktd2FybmluZy5lc20uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9BcHBseVVybEhhY2sudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvQXJjd2FyZUFwcGxpY2F0aW9uLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL0FyY3dhcmVDb25maWcudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvQXJjd2FyZUluaXQudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvQXJjd2FyZVBpeGVsU3RyZWFtaW5nLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL2RvbWFpbi9BcmN3YXJlU2V0dGluZ3NTY2hlbWEudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvZG9tYWluL0Nvbm5lY3Rpb25JZGVudGlmaWVyLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL2RvbWFpbi9FdmVudEhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvZG9tYWluL1Nlc3Npb24udHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvZG9tYWluL1N0YXRzLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL2RvbWFpbi9kZWJvdW5jZS50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9zdHlsZXMvQXJjd2FyZVBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZXMudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvdWkvQXJjd2FyZUxvZ29Mb2FkZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvdWkvQXVkaW9CdXR0b24vQXVkaW9JY29uLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL0F1ZGlvQnV0dG9uL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL0xvdmVMZXR0ZXJzL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL01pY0J1dHRvbi9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9NaWNJY29uL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL01pY3JvcGhvbmVPdmVybGF5L2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL1BsYXlJY29uL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL1N0b3BCdXR0b24vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvdWkvU3RvcEljb24vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL0Vycm9yTWVzc2FnZS50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL3NoYXJlZC9saWIvTWVzc2FnZXMvTG92ZUxldHRlci50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL3NoYXJlZC9saWIvTWVzc2FnZXMvUGluZy50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL3NoYXJlZC9saWIvTWVzc2FnZXMvUXVldWUudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1Nlc3Npb25JZC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL3NoYXJlZC9saWIvTWVzc2FnZXMvU3RhdHMudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1N0cmVhbUluZm8udHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1ZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1dlYlNka1NldHRpbmdzLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL3NoYXJlZC9saWIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy93cy9icm93c2VyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvem9kL2xpYi9ab2RFcnJvci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL3pvZC9saWIvZXJyb3JzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvem9kL2xpYi9leHRlcm5hbC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL3pvZC9saWIvaGVscGVycy9lcnJvclV0aWwuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy96b2QvbGliL2hlbHBlcnMvcGFyc2VVdGlsLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvem9kL2xpYi9oZWxwZXJzL3R5cGVBbGlhc2VzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvem9kL2xpYi9oZWxwZXJzL3V0aWwuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy96b2QvbGliL2luZGV4LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvem9kL2xpYi9sb2NhbGVzL2VuLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvem9kL2xpYi90eXBlcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1ByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJvcGVydHlLZXkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvd2VicGFjay9hZnRlci1zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBUbyBtYXRjaCBOb2RlSlMnIEV2ZW50RW1pdHRlciBzeW50YXggd2l0aG91dCBkb3duc3RyZWFtIGNvZGUgY2hhbmdlcyB3ZSBuZWVkIHRvIHVzZSBgYW55YC5cbi8vIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBkaXNhYmxlIGxpbnRpbmcgYGFueWAgY2hlY2tzIG9uIHRoaXMgZmlsZS5cbi8vXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5jbGFzcyBQaXhlbFN0cmVhbWluZ0V2ZW50TGlzdGVuZXIge1xuICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2FyZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgaGFuZGxlRXZlbnQoX2V2dCkge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayguLi50aGlzLl9hcmdzKTtcbiAgICAgICAgLy8gUmVzZXQgc3RvcmFnZSBvZiBhcmdzLlxuICAgICAgICB0aGlzLl9hcmdzID0gW107XG4gICAgfVxuICAgIHNldEFyZ3MoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9hcmdzID0gYXJncztcbiAgICB9XG59XG4vKipcbiAqIEEgZmVhdHVyZS1saW1pdGVkLCBidXQgX21vc3RseV8gZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgTm9kZSdzIEV2ZW50RW1pdHRlciB0eXBlIHRoYXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgRXZlbnRUYXJnZXQuXG4gKlxuICogRm9yIHRob3NlIHVuZmFtaWxpYXIgd2l0aCBOb2RlJ3MgRXZlbnRFbWl0dGVyLCBoZXJlIGlzIHNvbWUgaW5mbyBmcm9tIHRoZSBvZmZpY2lhbCBkb2NzOlxuICpcbiAqIFtJbiBOb2RlSlNdIGFsbCBvYmplY3RzIHRoYXQgZW1pdCBldmVudHMgYXJlIGluc3RhbmNlcyBvZiB0aGUgYEV2ZW50RW1pdHRlcmAgY2xhc3MuIFRoZXNlXG4gKiBvYmplY3RzIGV4cG9zZSBhbiBgZXZlbnRFbWl0dGVyLm9uKClgIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIG9uZSBvciBtb3JlXG4gKiBmdW5jdGlvbnMgdG8gYmUgYXR0YWNoZWQgdG8gbmFtZWQgZXZlbnRzIGVtaXR0ZWQgYnkgdGhlIG9iamVjdC4gVHlwaWNhbGx5LFxuICogZXZlbnQgbmFtZXMgYXJlIGNhbWVsLWNhc2VkIHN0cmluZ3MgYnV0IGFueSB2YWxpZCBKYXZhU2NyaXB0IHByb3BlcnR5IGtleVxuICogY2FuIGJlIHVzZWQuXG4gKlxuICogV2hlbiB0aGUgYEV2ZW50RW1pdHRlcmAgb2JqZWN0IGVtaXRzIGFuIGV2ZW50LCBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBhdHRhY2hlZFxuICogdG8gdGhhdCBzcGVjaWZpYyBldmVudCBhcmUgY2FsbGVkIF9zeW5jaHJvbm91c2x5Xy4gQW55IHZhbHVlcyByZXR1cm5lZCBieSB0aGVcbiAqIGNhbGxlZCBsaXN0ZW5lcnMgYXJlIF9pZ25vcmVkXyBhbmQgZGlzY2FyZGVkLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHNpbXBsZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZSB3aXRoIGEgc2luZ2xlXG4gKiBsaXN0ZW5lci4gVGhlIGBldmVudEVtaXR0ZXIub24oKWAgbWV0aG9kIGlzIHVzZWQgdG8gcmVnaXN0ZXIgbGlzdGVuZXJzLCB3aGlsZVxuICogdGhlIGBldmVudEVtaXR0ZXIuZW1pdCgpYCBtZXRob2QgaXMgdXNlZCB0byB0cmlnZ2VyIHRoZSBldmVudC5cbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuICpcbiAqIGNsYXNzIE15RW1pdHRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7fVxuICpcbiAqIGNvbnN0IG15RW1pdHRlciA9IG5ldyBNeUVtaXR0ZXIoKTtcbiAqIG15RW1pdHRlci5vbignZXZlbnQnLCAoKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdhbiBldmVudCBvY2N1cnJlZCEnKTtcbiAqIH0pO1xuICogbXlFbWl0dGVyLmVtaXQoJ2V2ZW50Jyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIHJlbW92ZUxpc3RlbmVySW50ZXJuYWwoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAodGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGFpciA9IGxpc3RlbmVyc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRQYWlyLmNhbGxiYWNrID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBldmVudCB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50UGFpci5ldmVudExpc3RlbmVyV3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIG91ciBpbnRlcm5hbCBtYXBcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgYGVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcilgLlxuICAgICAqL1xuICAgIGFkZExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGBsaXN0ZW5lcmAgZnVuY3Rpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdGVuZXJzIGFycmF5IGZvciB0aGUgZXZlbnRcbiAgICAgKiBuYW1lZCBgZXZlbnROYW1lYC5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogc2VydmVyLm9uKCdjb25uZWN0aW9uJywgKHN0cmVhbSkgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coJ3NvbWVvbmUgY29ubmVjdGVkIScpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAsIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBXcmFwIG91ciBub3JtYWwgSlMgZnVuY3Rpb24gaW4gYSBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2VcbiAgICAgICAgLy8gc28gd2UgY2FuIHVzZSBpdCB3aXRoIGV2ZW50IHRhcmdldC5cbiAgICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcldyYXBwZXIgPSBuZXcgUGl4ZWxTdHJlYW1pbmdFdmVudExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgICAgc3VwZXIuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50TGlzdGVuZXJXcmFwcGVyKTtcbiAgICAgICAgLy8gU3RvcmUgdGhlIGV2ZW50IGxpc3RlbmVyL2Z1bmN0aW9uIHBhaXIgZm9yIGxhdGVyIHJlbW92YWwuXG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ldyBBcnJheSgpKTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLl9ldmVudExpc3RlbmVyc1xuICAgICAgICAgICAgLmdldChldmVudE5hbWUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHVzaCh7IGNhbGxiYWNrOiBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lcldyYXBwZXI6IGV2ZW50TGlzdGVuZXJXcmFwcGVyIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhICoqb25lLXRpbWUqKiBgbGlzdGVuZXJgIGZ1bmN0aW9uIGZvciB0aGUgZXZlbnQgbmFtZWQgYGV2ZW50TmFtZWAuIFRoZVxuICAgICAqIG5leHQgdGltZSBgZXZlbnROYW1lYCBpcyB0cmlnZ2VyZWQsIHRoaXMgbGlzdGVuZXIgaXMgcmVtb3ZlZCBhbmQgdGhlbiBpbnZva2VkLlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBzZXJ2ZXIub25jZSgnY29ubmVjdGlvbicsIChzdHJlYW0pID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBaCwgd2UgaGF2ZSBvdXIgZmlyc3QgdXNlciEnKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkLlxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgb25jZShldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gUGFzcyBvcHRpb25zIHNvIHRoaXMgZXZlbnQgY2FsbGJhY2sgaXMgb25seSBjYWxsZWQgb25jZVxuICAgICAgICBjb25zdCBldmVudExpc3RlbmVyT3B0cyA9IHsgb25jZTogdHJ1ZSB9O1xuICAgICAgICAvLyBXcmFwIG91ciBub3JtYWwgSlMgZnVuY3Rpb24gaW4gYSBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2VcbiAgICAgICAgLy8gc28gd2UgY2FuIHVzZSBpdCB3aXRoIGV2ZW50IHRhcmdldCBhbmQgcmVtb3ZlIGl0IGZyb20gZXZlbnQgdGFyZ2V0IHdoZW4gdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMuXG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJXcmFwcGVyID0gbmV3IFBpeGVsU3RyZWFtaW5nRXZlbnRMaXN0ZW5lcigoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIoYXJncyk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVySW50ZXJuYWwoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgICAgIH0pO1xuICAgICAgICBzdXBlci5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lcldyYXBwZXIsIGV2ZW50TGlzdGVuZXJPcHRzKTtcbiAgICAgICAgLy8gU3RvcmUgdGhlIGV2ZW50IGxpc3RlbmVyL2Z1bmN0aW9uIHBhaXIgZm9yIGxhdGVyIHJlbW92YWwuXG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ldyBBcnJheSgpKTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLl9ldmVudExpc3RlbmVyc1xuICAgICAgICAgICAgLmdldChldmVudE5hbWUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHVzaCh7IGNhbGxiYWNrOiBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lcldyYXBwZXI6IGV2ZW50TGlzdGVuZXJXcmFwcGVyIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGBsaXN0ZW5lcmAgZnJvbSB0aGlzIEV2ZW50RW1pdHRlci5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2FsbGJhY2sgPSAoc3RyZWFtKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZygnc29tZW9uZSBjb25uZWN0ZWQhJyk7XG4gICAgICogfTtcbiAgICAgKiBzZXJ2ZXIub24oJ2Nvbm5lY3Rpb24nLCBjYWxsYmFjayk7XG4gICAgICogLy8gLi4uXG4gICAgICogc2VydmVyLnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0aW9uJywgY2FsbGJhY2spO1xuICAgICAqIGBgYFxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkLlxuICAgICAqL1xuICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lckludGVybmFsKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIGBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKClgLlxuICAgICAqL1xuICAgIG9mZihldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgYGV2ZW50TmFtZWAuXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAsIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWQuXG4gICAgICovXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50TmFtZSkge1xuICAgICAgICBpZiAodGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZW1vdmUgZWFjaCBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBldmVudCB0YXJnZXRcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXJQYWlyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyUGFpci5ldmVudExpc3RlbmVyV3JhcHBlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBtYXBwZWQgdG8gdGhpcyBldmVudCBmcm9tIG91ciBpbnRlcm5hbCBtYXBcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91c2x5IGNhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciB0aGUgZXZlbnQgbmFtZWQgYGV2ZW50TmFtZWAsIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZCwgcGFzc2luZyB0aGUgc3VwcGxpZWQgYXJndW1lbnRzXG4gICAgICogdG8gZWFjaC5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBldmVudCBoYWQgbGlzdGVuZXJzLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuICAgICAqIGNvbnN0IG15RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgKlxuICAgICAqIC8vIEZpcnN0IGxpc3RlbmVyXG4gICAgICogbXlFbWl0dGVyLm9uKCdldmVudCcsIGZ1bmN0aW9uIGZpcnN0TGlzdGVuZXIoKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnSGVsbG9vb28hIGZpcnN0IGxpc3RlbmVyJyk7XG4gICAgICogfSk7XG4gICAgICogLy8gU2Vjb25kIGxpc3RlbmVyXG4gICAgICogbXlFbWl0dGVyLm9uKCdldmVudCcsIGZ1bmN0aW9uIHNlY29uZExpc3RlbmVyKGFyZzEsIGFyZzIpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBldmVudCB3aXRoIHBhcmFtZXRlcnMgJHthcmcxfSwgJHthcmcyfSBpbiBzZWNvbmQgbGlzdGVuZXJgKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyBUaGlyZCBsaXN0ZW5lclxuICAgICAqIG15RW1pdHRlci5vbignZXZlbnQnLCBmdW5jdGlvbiB0aGlyZExpc3RlbmVyKC4uLmFyZ3MpIHtcbiAgICAgKiAgIGNvbnN0IHBhcmFtZXRlcnMgPSBhcmdzLmpvaW4oJywgJyk7XG4gICAgICogICBjb25zb2xlLmxvZyhgZXZlbnQgd2l0aCBwYXJhbWV0ZXJzICR7cGFyYW1ldGVyc30gaW4gdGhpcmQgbGlzdGVuZXJgKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG15RW1pdHRlci5saXN0ZW5lcnMoJ2V2ZW50JykpO1xuICAgICAqXG4gICAgICogbXlFbWl0dGVyLmVtaXQoJ2V2ZW50JywgMSwgMiwgMywgNCwgNSk7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHM6XG4gICAgICogLy8gW1xuICAgICAqIC8vICAgW0Z1bmN0aW9uOiBmaXJzdExpc3RlbmVyXSxcbiAgICAgKiAvLyAgIFtGdW5jdGlvbjogc2Vjb25kTGlzdGVuZXJdLFxuICAgICAqIC8vICAgW0Z1bmN0aW9uOiB0aGlyZExpc3RlbmVyXVxuICAgICAqIC8vIF1cbiAgICAgKiAvLyBIZWxsb29vbyEgZmlyc3QgbGlzdGVuZXJcbiAgICAgKiAvLyBldmVudCB3aXRoIHBhcmFtZXRlcnMgMSwgMiBpbiBzZWNvbmQgbGlzdGVuZXJcbiAgICAgKiAvLyBldmVudCB3aXRoIHBhcmFtZXRlcnMgMSwgMiwgMywgNCwgNSBpbiB0aGlyZCBsaXN0ZW5lclxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9ldmVudExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFbnN1cmUgZWFjaCBvZiBvdXIgbGlzdGVuZXJzIGhhdmUgdGhlIGFyZ3MgdGhlIGNhbGxiYWNrIGluamVjdGVkXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyUGFpciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lclBhaXIuZXZlbnRMaXN0ZW5lcldyYXBwZXIuc2V0QXJncyguLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZpcmUgb2ZmIHRoZSBhY3R1YWwgZXZlbnRcbiAgICAgICAgICAgIHN1cGVyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KGV2ZW50TmFtZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV2ZW50RW1pdHRlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IHZhciBMb2dMZXZlbDtcbihmdW5jdGlvbiAoTG9nTGV2ZWwpIHtcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkRpc2FibGVkXCJdID0gMF0gPSBcIkRpc2FibGVkXCI7XG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJFcnJvclwiXSA9IDFdID0gXCJFcnJvclwiO1xuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiV2FybmluZ1wiXSA9IDJdID0gXCJXYXJuaW5nXCI7XG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJJbmZvXCJdID0gM10gPSBcIkluZm9cIjtcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkRlYnVnXCJdID0gNF0gPSBcIkRlYnVnXCI7XG59KShMb2dMZXZlbCB8fCAoTG9nTGV2ZWwgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZ2xvYmFsIGNvbnRleHQgZm9yIHRoZSBsb2dnZXIgY29uZmlndXJhdGlvbi5cbiAqIFRoaXMgY2Fubm90IGJlIHN0b3JlZCBzdGF0aWNhbGx5IGluIHRoZSBMb2dnZXIgY2xhc3MgYmVjYXVzZSB3ZSBzb21ldGltZXMgaGF2ZSBtdWx0aXBsZSBleGVjdXRpb25cbiAqIGNvbnRleHRzLCBzdWNoIGFzIHN0YXRzIHJlcG9ydGluZy4gSW5zdGVhZCB3ZSBzdG9yZSB0aGUgbG9nZ2VyIGNvbmZpZyBjb250ZXh0IG9uIHRoZSB3aW5kb3cgb2JqZWN0XG4gKiB0byBiZSBzaGFyZWQgd2l0aCBhbnkgTG9nZ2VyIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dlckNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxvZ0xldmVsID0gTG9nTGV2ZWwuRGVidWc7XG4gICAgICAgIHRoaXMuaW5jbHVkZVN0YWNrID0gdHJ1ZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVMb2dnZXIobG9nZ2VyKSB7XG4gICAgTG9nZ2VyID0gbG9nZ2VyO1xufVxuLyoqXG4gKiBBIGJhc2ljIGNvbnNvbGUgbG9nZ2VyIHV0aWxpemVkIGJ5IHRoZSBQaXhlbCBTdHJlYW1pbmcgZnJvbnRlbmQgdG8gYWxsb3dcbiAqIGxvZ2dpbmcgdG8gdGhlIGJyb3dzZXIgY29uc29sZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dlclR5cGUge1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbG9nIHZlcmJvc2l0eSBsZXZlbFxuICAgICAqL1xuICAgIEluaXRMb2dnaW5nKGxvZ0xldmVsLCBpbmNsdWRlU3RhY2spIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmxvZ0xldmVsID0gbG9nTGV2ZWw7XG4gICAgICAgIHRoaXMuY29udGV4dC5pbmNsdWRlU3RhY2sgPSBpbmNsdWRlU3RhY2s7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ2dpbmcgb3V0cHV0IGZvciBkZWJ1Z2dpbmdcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgICAqL1xuICAgIERlYnVnKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb2dMZXZlbCA+PSBMb2dMZXZlbC5EZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5Db21tb25Mb2coJ0RlYnVnJywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQmFzaWMgbG9nZ2luZyBvdXRwdXQgZm9yIHN0YW5kYXJkIG1lc3NhZ2VzXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWRcbiAgICAgKi9cbiAgICBJbmZvKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb2dMZXZlbCA+PSBMb2dMZXZlbC5JbmZvKSB7XG4gICAgICAgICAgICB0aGlzLkNvbW1vbkxvZygnSW5mbycsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ2dpbmcgZm9yIHdhcm5pbmdzXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWRcbiAgICAgKi9cbiAgICBXYXJuaW5nKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb2dMZXZlbCA+PSBMb2dMZXZlbC5XYXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLkNvbW1vbkxvZygnV2FybmluZycsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVycm9yIGxvZ2dpbmdcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgICAqL1xuICAgIEVycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb2dMZXZlbCA+PSBMb2dMZXZlbC5FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5Db21tb25Mb2coJ0Vycm9yJywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbW1vbiBsb2cgZnVuY3Rpb24gdGhhdCBhbGwgb3RoZXIgbG9nIGZ1bmN0aW9ucyBjYWxsIHRvLlxuICAgICAqIEBwYXJhbSBsZXZlbCAtIHRoZSBsZXZlbCBvZiB0aGlzIGxvZyBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBzdGFjayAtIGFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBmcm9tIHdoZXJlIHRoZSBsb2cgbWVzc2FnZSB3YXMgY2FsbGVkLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIENvbW1vbkxvZyhsZXZlbCwgbWVzc2FnZSkge1xuICAgICAgICBsZXQgbG9nTWVzc2FnZSA9IGBbJHtsZXZlbH1dIC0gJHttZXNzYWdlfWA7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuaW5jbHVkZVN0YWNrKSB7XG4gICAgICAgICAgICBsb2dNZXNzYWdlICs9IGBcXG5TdGFjazogJHt0aGlzLkdldFN0YWNrVHJhY2UoKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZXZlbCA9PT0gJ0Vycm9yJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihsb2dNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsZXZlbCA9PT0gJ1dhcm5pbmcnKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4obG9nTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYXB0dXJlcyB0aGUgc3RhY2sgYW5kIHJldHVybnMgaXRcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBzdGFja1xuICAgICAqL1xuICAgIEdldFN0YWNrVHJhY2UoKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICAgIGxldCBmb3JtYXR0ZWRTdGFjayA9ICdObyBTdGFjayBBdmFpbGFibGUgZm9yIHRoaXMgYnJvd3Nlcic7XG4gICAgICAgIC8vIGZvcm1hdCB0aGUgZXJyb3JcbiAgICAgICAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdGFjayA9IGVycm9yLnN0YWNrLnRvU3RyaW5nKCkucmVwbGFjZSgvRXJyb3IvZywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZWRTdGFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGV4ZWN1dGlvbiBjb250ZXh0cywgKHN0YXRzIHJlcG9ydGluZyBhbmQgc29tZSB3ZWJ4ciBsb2dnaW5nIGNvbWVzIGZyb21cbiAgICAgKiBkaWZmZXJlbnQgZXhlY3V0aW9uIGNvbnRleHRzIHdlIGNhbiBlbmQgdXAgd2l0aCBtdWx0aXBsZSBzdGF0aWMgTG9nZ2VyIGluc3RhbmNlcy4gSGVyZSB3ZSB0cnkgdG9cbiAgICAgKiB3b3JrIGFyb3VuZCBpdCBieSBzdG9yaW5nIHRoZSBjb250ZXh0IG9uIHRoZSB3aW5kb3cgb2JqZWN0LlxuICAgICAqL1xuICAgIFZhbGlkYXRlQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cpIHtcbiAgICAgICAgICAgICAgICAvLyBubyB3aW5kb3cgb2JqZWN0IHNvIHdlIGNhbiBvbmx5IHN0b3JlIGEgbG9jYWwgY29udGV4dC5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgTG9nZ2VyQ29udGV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXdpbmRvdy5sb2dnZXJDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IExvZ2dlckNvbnRleHQoKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9nZ2VyQ29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IHdpbmRvdy5sb2dnZXJDb250ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGxldCBMb2dnZXIgPSBuZXcgTG9nZ2VyVHlwZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9nZ2VyLmpzLm1hcCIsImltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL0xvZ2dlci9Mb2dnZXInO1xuaW1wb3J0IHsgTWVzc2FnZVJlZ2lzdHJ5IH0gZnJvbSAnLi9tZXNzYWdlX3JlZ2lzdHJ5Jztcbi8qKlxuICogQSBoZWxwZXIgZm9yIGNyZWF0aW5nIHNpZ25hbGxpbmcgbWVzc2FnZXMuIFRha2VzIGluIG9wdGlvbmFsIGdpdmVuIHBhcmFtZXRlcnMgYW5kXG4gKiBpbmNsdWRlcyB0aGVtIGluIGEgbWVzc2FnZSBvYmplY3Qgd2l0aCB0aGUgJ3R5cGUnIGZpZWxkIHNldCBwcm9wZXJseSBmb3IgdGhlIG1lc3NhZ2VcbiAqIHR5cGUgc3VwcGxpZWQuXG4gKiBAcGFyYW0gbWVzc2FnZVR5cGUgLSBBIG1lc3NhZ2UgdHlwZSBmcm9tIE1lc3NhZ2VSZWdpc3RyeSB0aGF0IGluZGljYXRlcyB0aGUgdHlwZSBvZiBtZXNzYWdlIHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvcHRpb25hbCBvYmplY3Qgd2hvc2UgZmllbGRzIGFyZSBhZGRlZCB0byB0aGUgbmV3bHkgY3JlYXRlZCBtZXNzYWdlLlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyBtZXNzYWdlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2UobWVzc2FnZVR5cGUsIHBhcmFtcykge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlVHlwZS5jcmVhdGUoKTtcbiAgICBtZXNzYWdlLnR5cGUgPSBtZXNzYWdlVHlwZS50eXBlTmFtZTtcbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIG1lc3NhZ2VUeXBlLm1lcmdlUGFydGlhbChtZXNzYWdlLCBwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbn1cbi8qKlxuICogVGVzdHMgdGhhdCB0aGUgc3VwcGxpZWQgbWVzc2FnZSBpcyB2YWxpZC4gVGhhdCBpcyBjb250YWlucyBhbGwgZXhwZWN0ZWQgZmllbGRzIGFuZFxuICogZG9lc24ndCBjb250YWluIGFueSB1bmtub3duIGZpZWxkcy5cbiAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm5zIFRoZSBtZXNzYWdlIHR5cGUgZnJvbSBNZXNzYWdlUmVnaXN0cnkgb2YgdGhlIHN1cHBsaWVkIG1lc3NhZ2Ugb2JqZWN0IGlmIGl0J3MgdmFsaWQsIG9yIG51bGwgaWYgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWVzc2FnZShtc2cpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGlmICghbXNnLnR5cGUpIHtcbiAgICAgICAgTG9nZ2VyLkVycm9yKGBQYXJzZWQgbWVzc2FnZSBoYXMgbm8gdHlwZS4gUmVqZWN0ZWQuICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gTWVzc2FnZVJlZ2lzdHJ5W21zZy50eXBlXTtcbiAgICBpZiAoIW1lc3NhZ2VUeXBlKSB7XG4gICAgICAgIExvZ2dlci5FcnJvcihgTWVzc2FnZSBpcyBvZiBhbiB1bmtub3duIHR5cGU6IFwiJHttc2cudHlwZX1cIi4gUmVqZWN0ZWQuYCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZVR5cGUuZmllbGRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgbWVzc2FnZVR5cGUuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoIWZpZWxkLm9wdCkge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1zZywgZmllbGQubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBNZXNzYWdlIFwiJHttc2cudHlwZX1cIlwiIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGQgXCIke2ZpZWxkLm5hbWV9XCIuIFJlamVjdGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBpbiBtc2cpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBtZXNzYWdlVHlwZS5maWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLm5hbWUgPT09IGZpZWxkTmFtZSk7XG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgTWVzc2FnZSBcIiR7bXNnLnR5cGV9XCIgY29udGFpbnMgdW5rbm93biBmaWVsZCBcIiR7ZmllbGROYW1lfVwiLiBSZWplY3RlZC5gKTtcbiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkID8gbWVzc2FnZVR5cGUgOiBudWxsO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVzc2FnZV9oZWxwZXJzLmpzLm1hcCIsImltcG9ydCAqIGFzIE1lc3NhZ2VzIGZyb20gJy4vc2lnbmFsbGluZ19tZXNzYWdlcyc7XG4vKipcbiAqIEEgbWFwIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHNpZ25hbGxpbmcgbWVzc2FnZXMgaW4gdGhlIFBpeGVsIFN0cmVhbWluZ1xuICogc2lnbmFsbGluZyBwcm90b2NvbC4gVGhpcyBhbGxvd3MgbWFwcGluZyBvZiBzaWduYWxsaW5nIG1lc3NhZ2UgbmFtZXNcbiAqIHRvIGFjdHVhbCBtZXNzYWdlIHR5cGVzLlxuICovXG5leHBvcnQgY29uc3QgTWVzc2FnZVJlZ2lzdHJ5ID0ge1xuICAgIGFuc3dlcjogTWVzc2FnZXMuYW5zd2VyLFxuICAgIGNvbmZpZzogTWVzc2FnZXMuY29uZmlnLFxuICAgIGRpc2Nvbm5lY3RQbGF5ZXI6IE1lc3NhZ2VzLmRpc2Nvbm5lY3RQbGF5ZXIsXG4gICAgZW5kcG9pbnRJZDogTWVzc2FnZXMuZW5kcG9pbnRJZCxcbiAgICBlbmRwb2ludElkQ29uZmlybTogTWVzc2FnZXMuZW5kcG9pbnRJZENvbmZpcm0sXG4gICAgaWNlQ2FuZGlkYXRlOiBNZXNzYWdlcy5pY2VDYW5kaWRhdGUsXG4gICAgaWRlbnRpZnk6IE1lc3NhZ2VzLmlkZW50aWZ5LFxuICAgIGxpc3RTdHJlYW1lcnM6IE1lc3NhZ2VzLmxpc3RTdHJlYW1lcnMsXG4gICAgb2ZmZXI6IE1lc3NhZ2VzLm9mZmVyLFxuICAgIHBpbmc6IE1lc3NhZ2VzLnBpbmcsXG4gICAgcGxheWVyQ29ubmVjdGVkOiBNZXNzYWdlcy5wbGF5ZXJDb25uZWN0ZWQsXG4gICAgcGxheWVyQ291bnQ6IE1lc3NhZ2VzLnBsYXllckNvdW50LFxuICAgIHBsYXllckRpc2Nvbm5lY3RlZDogTWVzc2FnZXMucGxheWVyRGlzY29ubmVjdGVkLFxuICAgIHBvbmc6IE1lc3NhZ2VzLnBvbmcsXG4gICAgc3RhdHM6IE1lc3NhZ2VzLnN0YXRzLFxuICAgIHN0cmVhbWVyRGlzY29ubmVjdGVkOiBNZXNzYWdlcy5zdHJlYW1lckRpc2Nvbm5lY3RlZCxcbiAgICBzdHJlYW1lckxpc3Q6IE1lc3NhZ2VzLnN0cmVhbWVyTGlzdCxcbiAgICBzdWJzY3JpYmU6IE1lc3NhZ2VzLnN1YnNjcmliZSxcbiAgICB1bnN1YnNjcmliZTogTWVzc2FnZXMudW5zdWJzY3JpYmUsXG4gICAgbGF5ZXJQcmVmZXJlbmNlOiBNZXNzYWdlcy5sYXllclByZWZlcmVuY2UsXG4gICAgZGF0YUNoYW5uZWxSZXF1ZXN0OiBNZXNzYWdlcy5kYXRhQ2hhbm5lbFJlcXVlc3QsXG4gICAgcGVlckRhdGFDaGFubmVsczogTWVzc2FnZXMucGVlckRhdGFDaGFubmVscyxcbiAgICBwZWVyRGF0YUNoYW5uZWxzUmVhZHk6IE1lc3NhZ2VzLnBlZXJEYXRhQ2hhbm5lbHNSZWFkeSxcbiAgICBzdHJlYW1lckRhdGFDaGFubmVsczogTWVzc2FnZXMuc3RyZWFtZXJEYXRhQ2hhbm5lbHMsXG4gICAgc3RhcnRTdHJlYW1pbmc6IE1lc3NhZ2VzLnN0YXJ0U3RyZWFtaW5nLFxuICAgIHN0b3BTdHJlYW1pbmc6IE1lc3NhZ2VzLnN0b3BTdHJlYW1pbmdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXNzYWdlX3JlZ2lzdHJ5LmpzLm1hcCIsImltcG9ydCB7IFdpcmVUeXBlIH0gZnJvbSBcIkBwcm90b2J1Zi10cy9ydW50aW1lXCI7XG5pbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyIH0gZnJvbSBcIkBwcm90b2J1Zi10cy9ydW50aW1lXCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsIH0gZnJvbSBcIkBwcm90b2J1Zi10cy9ydW50aW1lXCI7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gXCJAcHJvdG9idWYtdHMvcnVudGltZVwiO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgYmFzZV9tZXNzYWdlJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiYmFzZV9tZXNzYWdlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGJhc2VfbWVzc2FnZVxuICovXG5leHBvcnQgY29uc3QgYmFzZV9tZXNzYWdlID0gbmV3IGJhc2VfbWVzc2FnZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBwZWVyQ29ubmVjdGlvbk9wdGlvbnMkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJwZWVyQ29ubmVjdGlvbk9wdGlvbnNcIiwgW10pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHBlZXJDb25uZWN0aW9uT3B0aW9uc1xuICovXG5leHBvcnQgY29uc3QgcGVlckNvbm5lY3Rpb25PcHRpb25zID0gbmV3IHBlZXJDb25uZWN0aW9uT3B0aW9ucyRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBjb25maWckVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJjb25maWdcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInBlZXJDb25uZWN0aW9uT3B0aW9uc1wiLCBraW5kOiBcIm1lc3NhZ2VcIiwgVDogKCkgPT4gcGVlckNvbm5lY3Rpb25PcHRpb25zIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInByb3RvY29sVmVyc2lvblwiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogcGVlckNvbm5lY3Rpb25PcHRpb25zIHBlZXJDb25uZWN0aW9uT3B0aW9ucyAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBlZXJDb25uZWN0aW9uT3B0aW9ucyA9IHBlZXJDb25uZWN0aW9uT3B0aW9ucy5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMsIG1lc3NhZ2UucGVlckNvbm5lY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgcHJvdG9jb2xWZXJzaW9uICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHJvdG9jb2xWZXJzaW9uID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogcGVlckNvbm5lY3Rpb25PcHRpb25zIHBlZXJDb25uZWN0aW9uT3B0aW9ucyA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBlZXJDb25uZWN0aW9uT3B0aW9ucylcbiAgICAgICAgICAgIHBlZXJDb25uZWN0aW9uT3B0aW9ucy5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UucGVlckNvbm5lY3Rpb25PcHRpb25zLCB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKS5qb2luKCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIHN0cmluZyBwcm90b2NvbFZlcnNpb24gPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wcm90b2NvbFZlcnNpb24gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wcm90b2NvbFZlcnNpb24pO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgY29uZmlnXG4gKi9cbmV4cG9ydCBjb25zdCBjb25maWcgPSBuZXcgY29uZmlnJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGlkZW50aWZ5JFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiaWRlbnRpZnlcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgaWRlbnRpZnlcbiAqL1xuZXhwb3J0IGNvbnN0IGlkZW50aWZ5ID0gbmV3IGlkZW50aWZ5JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGVuZHBvaW50SWQkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJlbmRwb2ludElkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJpZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMywgbmFtZTogXCJwcm90b2NvbFZlcnNpb25cIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuaWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgcHJvdG9jb2xWZXJzaW9uICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHJvdG9jb2xWZXJzaW9uID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIGlkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UuaWQpO1xuICAgICAgICAvKiBvcHRpb25hbCBzdHJpbmcgcHJvdG9jb2xWZXJzaW9uID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucHJvdG9jb2xWZXJzaW9uICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UucHJvdG9jb2xWZXJzaW9uKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGVuZHBvaW50SWRcbiAqL1xuZXhwb3J0IGNvbnN0IGVuZHBvaW50SWQgPSBuZXcgZW5kcG9pbnRJZCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBlbmRwb2ludElkQ29uZmlybSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImVuZHBvaW50SWRDb25maXJtXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJjb21taXR0ZWRJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuY29tbWl0dGVkSWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgY29tbWl0dGVkSWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb21taXR0ZWRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBjb21taXR0ZWRJZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmNvbW1pdHRlZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLmNvbW1pdHRlZElkKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGVuZHBvaW50SWRDb25maXJtXG4gKi9cbmV4cG9ydCBjb25zdCBlbmRwb2ludElkQ29uZmlybSA9IG5ldyBlbmRwb2ludElkQ29uZmlybSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdHJlYW1lcklkQ2hhbmdlZCRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInN0cmVhbWVySWRDaGFuZ2VkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJuZXdJRFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UubmV3SUQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgbmV3SUQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uZXdJRCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBuZXdJRCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5ld0lEICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5ld0lEKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0cmVhbWVySWRDaGFuZ2VkXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJlYW1lcklkQ2hhbmdlZCA9IG5ldyBzdHJlYW1lcklkQ2hhbmdlZCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBsaXN0U3RyZWFtZXJzJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwibGlzdFN0cmVhbWVyc1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBsaXN0U3RyZWFtZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBsaXN0U3RyZWFtZXJzID0gbmV3IGxpc3RTdHJlYW1lcnMkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3RyZWFtZXJMaXN0JFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwic3RyZWFtZXJMaXN0XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJpZHNcIiwga2luZDogXCJzY2FsYXJcIiwgcmVwZWF0OiAyIC8qUmVwZWF0VHlwZS5VTlBBQ0tFRCovLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuaWRzID0gW107XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHJlcGVhdGVkIHN0cmluZyBpZHMgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZHMucHVzaChyZWFkZXIuc3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogcmVwZWF0ZWQgc3RyaW5nIGlkcyA9IDI7ICovXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZS5pZHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UuaWRzW2ldKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0cmVhbWVyTGlzdFxuICovXG5leHBvcnQgY29uc3Qgc3RyZWFtZXJMaXN0ID0gbmV3IHN0cmVhbWVyTGlzdCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdWJzY3JpYmUkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdWJzY3JpYmVcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInN0cmVhbWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnN0cmVhbWVySWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgc3RyZWFtZXJJZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0cmVhbWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBzdHJpbmcgc3RyZWFtZXJJZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnN0cmVhbWVySWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc3RyZWFtZXJJZCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBzdWJzY3JpYmVcbiAqL1xuZXhwb3J0IGNvbnN0IHN1YnNjcmliZSA9IG5ldyBzdWJzY3JpYmUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgdW5zdWJzY3JpYmUkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJ1bnN1YnNjcmliZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSB1bnN1YnNjcmliZVxuICovXG5leHBvcnQgY29uc3QgdW5zdWJzY3JpYmUgPSBuZXcgdW5zdWJzY3JpYmUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3Vic2NyaWJlRmFpbGVkJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwic3Vic2NyaWJlRmFpbGVkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJtZXNzYWdlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5tZXNzYWdlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIG1lc3NhZ2UgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tZXNzYWdlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIG1lc3NhZ2UgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm1lc3NhZ2UpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3Vic2NyaWJlRmFpbGVkXG4gKi9cbmV4cG9ydCBjb25zdCBzdWJzY3JpYmVGYWlsZWQgPSBuZXcgc3Vic2NyaWJlRmFpbGVkJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHBsYXllckNvbm5lY3RlZCRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBsYXllckNvbm5lY3RlZFwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwiZGF0YUNoYW5uZWxcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInNmdVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA4IC8qU2NhbGFyVHlwZS5CT09MKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDUsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLmRhdGFDaGFubmVsID0gZmFsc2U7XG4gICAgICAgIG1lc3NhZ2Uuc2Z1ID0gZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBib29sIGRhdGFDaGFubmVsICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YUNoYW5uZWwgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGJvb2wgc2Z1ICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2Z1ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgcGxheWVySWQgKi8gNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIGJvb2wgZGF0YUNoYW5uZWwgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhQ2hhbm5lbCAhPT0gZmFsc2UpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLlZhcmludCkuYm9vbChtZXNzYWdlLmRhdGFDaGFubmVsKTtcbiAgICAgICAgLyogYm9vbCBzZnUgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZnUgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5WYXJpbnQpLmJvb2wobWVzc2FnZS5zZnUpO1xuICAgICAgICAvKiBzdHJpbmcgcGxheWVySWQgPSA1OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoNSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wbGF5ZXJJZCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBwbGF5ZXJDb25uZWN0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IHBsYXllckNvbm5lY3RlZCA9IG5ldyBwbGF5ZXJDb25uZWN0ZWQkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgcGxheWVyRGlzY29ubmVjdGVkJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwicGxheWVyRGlzY29ubmVjdGVkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJwbGF5ZXJJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgcGxheWVySWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBwbGF5ZXJJZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllcklkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHBsYXllckRpc2Nvbm5lY3RlZFxuICovXG5leHBvcnQgY29uc3QgcGxheWVyRGlzY29ubmVjdGVkID0gbmV3IHBsYXllckRpc2Nvbm5lY3RlZCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBvZmZlciRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcIm9mZmVyXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJzZHBcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJzZnVcIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA4IC8qU2NhbGFyVHlwZS5CT09MKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDUsIG5hbWU6IFwibXVsdGlwbGV4XCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiA2LCBuYW1lOiBcInNjYWxhYmlsaXR5TW9kZVwiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zZHAgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgc2RwICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2RwID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIG9wdGlvbmFsIHN0cmluZyBwbGF5ZXJJZCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIG9wdGlvbmFsIGJvb2wgc2Z1ICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2Z1ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBib29sIG11bHRpcGxleCAqLyA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm11bHRpcGxleCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgc3RyaW5nIHNjYWxhYmlsaXR5TW9kZSAqLyA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNjYWxhYmlsaXR5TW9kZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBzZHAgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZHAgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2RwKTtcbiAgICAgICAgLyogb3B0aW9uYWwgc3RyaW5nIHBsYXllcklkID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVySWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wbGF5ZXJJZCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIGJvb2wgc2Z1ID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2Z1ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIFdpcmVUeXBlLlZhcmludCkuYm9vbChtZXNzYWdlLnNmdSk7XG4gICAgICAgIC8qIG9wdGlvbmFsIGJvb2wgbXVsdGlwbGV4ID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UubXVsdGlwbGV4ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDUsIFdpcmVUeXBlLlZhcmludCkuYm9vbChtZXNzYWdlLm11bHRpcGxleCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIHN0cmluZyBzY2FsYWJpbGl0eU1vZGUgPSA2OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zY2FsYWJpbGl0eU1vZGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5zY2FsYWJpbGl0eU1vZGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugb2ZmZXJcbiAqL1xuZXhwb3J0IGNvbnN0IG9mZmVyID0gbmV3IG9mZmVyJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGFuc3dlciRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImFuc3dlclwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwic2RwXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInBsYXllcklkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwibWluQml0cmF0ZUJwc1wiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDUsIG5hbWU6IFwibWF4Qml0cmF0ZUJwc1wiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnNkcCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzZHAgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZHAgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgc3RyaW5nIHBsYXllcklkICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgaW50MzIgbWluQml0cmF0ZUJwcyAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1pbkJpdHJhdGVCcHMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBpbnQzMiBtYXhCaXRyYXRlQnBzICovIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF4Qml0cmF0ZUJwcyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIHNkcCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNkcCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5zZHApO1xuICAgICAgICAvKiBvcHRpb25hbCBzdHJpbmcgcGxheWVySWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgLyogb3B0aW9uYWwgaW50MzIgbWluQml0cmF0ZUJwcyA9IDQ7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm1pbkJpdHJhdGVCcHMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNCwgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLm1pbkJpdHJhdGVCcHMpO1xuICAgICAgICAvKiBvcHRpb25hbCBpbnQzMiBtYXhCaXRyYXRlQnBzID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UubWF4Qml0cmF0ZUJwcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg1LCBXaXJlVHlwZS5WYXJpbnQpLmludDMyKG1lc3NhZ2UubWF4Qml0cmF0ZUJwcyk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBhbnN3ZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGFuc3dlciA9IG5ldyBhbnN3ZXIkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgaWNlQ2FuZGlkYXRlRGF0YSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImljZUNhbmRpZGF0ZURhdGFcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJjYW5kaWRhdGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwic2RwTWlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInNkcE1MaW5lSW5kZXhcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJ1c2VybmFtZUZyYWdtZW50XCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLmNhbmRpZGF0ZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc2RwTWlkID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zZHBNTGluZUluZGV4ID0gMDtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgY2FuZGlkYXRlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2FuZGlkYXRlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzZHBNaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZHBNaWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgc2RwTUxpbmVJbmRleCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNkcE1MaW5lSW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgdXNlcm5hbWVGcmFnbWVudCAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVzZXJuYW1lRnJhZ21lbnQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIGNhbmRpZGF0ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmNhbmRpZGF0ZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5jYW5kaWRhdGUpO1xuICAgICAgICAvKiBzdHJpbmcgc2RwTWlkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2RwTWlkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnNkcE1pZCk7XG4gICAgICAgIC8qIGludDMyIHNkcE1MaW5lSW5kZXggPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZHBNTGluZUluZGV4ICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5WYXJpbnQpLmludDMyKG1lc3NhZ2Uuc2RwTUxpbmVJbmRleCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIHN0cmluZyB1c2VybmFtZUZyYWdtZW50ID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlcm5hbWVGcmFnbWVudCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg0LCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnVzZXJuYW1lRnJhZ21lbnQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgaWNlQ2FuZGlkYXRlRGF0YVxuICovXG5leHBvcnQgY29uc3QgaWNlQ2FuZGlkYXRlRGF0YSA9IG5ldyBpY2VDYW5kaWRhdGVEYXRhJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGljZUNhbmRpZGF0ZSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImljZUNhbmRpZGF0ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwiY2FuZGlkYXRlXCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiBpY2VDYW5kaWRhdGVEYXRhIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInBsYXllcklkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpY2VDYW5kaWRhdGVEYXRhIGNhbmRpZGF0ZSAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNhbmRpZGF0ZSA9IGljZUNhbmRpZGF0ZURhdGEuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCBtZXNzYWdlLmNhbmRpZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgc3RyaW5nIHBsYXllcklkICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBpY2VDYW5kaWRhdGVEYXRhIGNhbmRpZGF0ZSA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmNhbmRpZGF0ZSlcbiAgICAgICAgICAgIGljZUNhbmRpZGF0ZURhdGEuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmNhbmRpZGF0ZSwgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICAvKiBvcHRpb25hbCBzdHJpbmcgcGxheWVySWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGljZUNhbmRpZGF0ZVxuICovXG5leHBvcnQgY29uc3QgaWNlQ2FuZGlkYXRlID0gbmV3IGljZUNhbmRpZGF0ZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBkaXNjb25uZWN0UGxheWVyJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZGlzY29ubmVjdFBsYXllclwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwicmVhc29uXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHBsYXllcklkICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgc3RyaW5nIHJlYXNvbiAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlYXNvbiA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBwbGF5ZXJJZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllcklkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgLyogb3B0aW9uYWwgc3RyaW5nIHJlYXNvbiA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnJlYXNvbiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnJlYXNvbik7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBkaXNjb25uZWN0UGxheWVyXG4gKi9cbmV4cG9ydCBjb25zdCBkaXNjb25uZWN0UGxheWVyID0gbmV3IGRpc2Nvbm5lY3RQbGF5ZXIkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgcGluZyRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBpbmdcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInRpbWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UudGltZSA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHRpbWUgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aW1lID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBpbnQzMiB0aW1lID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZSAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnRpbWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgcGluZ1xuICovXG5leHBvcnQgY29uc3QgcGluZyA9IG5ldyBwaW5nJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHBvbmckVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJwb25nXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ0aW1lXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnRpbWUgPSAwO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQzMiB0aW1lICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGltZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogaW50MzIgdGltZSA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnRpbWUgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS50aW1lKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHBvbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHBvbmcgPSBuZXcgcG9uZyRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdHJlYW1lckRpc2Nvbm5lY3RlZCRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInN0cmVhbWVyRGlzY29ubmVjdGVkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0cmVhbWVyRGlzY29ubmVjdGVkXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJlYW1lckRpc2Nvbm5lY3RlZCA9IG5ldyBzdHJlYW1lckRpc2Nvbm5lY3RlZCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBsYXllclByZWZlcmVuY2UkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJsYXllclByZWZlcmVuY2VcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInNwYXRpYWxMYXllclwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInRlbXBvcmFsTGF5ZXJcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJwbGF5ZXJJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc3BhdGlhbExheWVyID0gMDtcbiAgICAgICAgbWVzc2FnZS50ZW1wb3JhbExheWVyID0gMDtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHNwYXRpYWxMYXllciAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNwYXRpYWxMYXllciA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHRlbXBvcmFsTGF5ZXIgKi8gMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZW1wb3JhbExheWVyID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHBsYXllcklkICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBpbnQzMiBzcGF0aWFsTGF5ZXIgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zcGF0aWFsTGF5ZXIgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5zcGF0aWFsTGF5ZXIpO1xuICAgICAgICAvKiBpbnQzMiB0ZW1wb3JhbExheWVyID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudGVtcG9yYWxMYXllciAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnRlbXBvcmFsTGF5ZXIpO1xuICAgICAgICAvKiBzdHJpbmcgcGxheWVySWQgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoNCwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wbGF5ZXJJZCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBsYXllclByZWZlcmVuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyUHJlZmVyZW5jZSA9IG5ldyBsYXllclByZWZlcmVuY2UkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgZGF0YUNoYW5uZWxSZXF1ZXN0JFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZGF0YUNoYW5uZWxSZXF1ZXN0XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGRhdGFDaGFubmVsUmVxdWVzdFxuICovXG5leHBvcnQgY29uc3QgZGF0YUNoYW5uZWxSZXF1ZXN0ID0gbmV3IGRhdGFDaGFubmVsUmVxdWVzdCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBwZWVyRGF0YUNoYW5uZWxzJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwicGVlckRhdGFDaGFubmVsc1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwic2VuZFN0cmVhbUlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwicmVjdlN0cmVhbUlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zZW5kU3RyZWFtSWQgPSAwO1xuICAgICAgICBtZXNzYWdlLnJlY3ZTdHJlYW1JZCA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBwbGF5ZXJJZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHNlbmRTdHJlYW1JZCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRTdHJlYW1JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHJlY3ZTdHJlYW1JZCAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlY3ZTdHJlYW1JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIHBsYXllcklkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVySWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UucGxheWVySWQpO1xuICAgICAgICAvKiBpbnQzMiBzZW5kU3RyZWFtSWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZW5kU3RyZWFtSWQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5zZW5kU3RyZWFtSWQpO1xuICAgICAgICAvKiBpbnQzMiByZWN2U3RyZWFtSWQgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5yZWN2U3RyZWFtSWQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5yZWN2U3RyZWFtSWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgcGVlckRhdGFDaGFubmVsc1xuICovXG5leHBvcnQgY29uc3QgcGVlckRhdGFDaGFubmVscyA9IG5ldyBwZWVyRGF0YUNoYW5uZWxzJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHBlZXJEYXRhQ2hhbm5lbHNSZWFkeSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBlZXJEYXRhQ2hhbm5lbHNSZWFkeVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBwZWVyRGF0YUNoYW5uZWxzUmVhZHlcbiAqL1xuZXhwb3J0IGNvbnN0IHBlZXJEYXRhQ2hhbm5lbHNSZWFkeSA9IG5ldyBwZWVyRGF0YUNoYW5uZWxzUmVhZHkkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3RyZWFtZXJEYXRhQ2hhbm5lbHMkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdHJlYW1lckRhdGFDaGFubmVsc1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwic2Z1SWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwic2VuZFN0cmVhbUlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwicmVjdlN0cmVhbUlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnNmdUlkID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zZW5kU3RyZWFtSWQgPSAwO1xuICAgICAgICBtZXNzYWdlLnJlY3ZTdHJlYW1JZCA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzZnVJZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNmdUlkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHNlbmRTdHJlYW1JZCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRTdHJlYW1JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHJlY3ZTdHJlYW1JZCAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlY3ZTdHJlYW1JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIHNmdUlkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2Z1SWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2Z1SWQpO1xuICAgICAgICAvKiBpbnQzMiBzZW5kU3RyZWFtSWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZW5kU3RyZWFtSWQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5zZW5kU3RyZWFtSWQpO1xuICAgICAgICAvKiBpbnQzMiByZWN2U3RyZWFtSWQgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5yZWN2U3RyZWFtSWQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5yZWN2U3RyZWFtSWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3RyZWFtZXJEYXRhQ2hhbm5lbHNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmVhbWVyRGF0YUNoYW5uZWxzID0gbmV3IHN0cmVhbWVyRGF0YUNoYW5uZWxzJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHN0YXJ0U3RyZWFtaW5nJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwic3RhcnRTdHJlYW1pbmdcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3RhcnRTdHJlYW1pbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0U3RyZWFtaW5nID0gbmV3IHN0YXJ0U3RyZWFtaW5nJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHN0b3BTdHJlYW1pbmckVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdG9wU3RyZWFtaW5nXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0b3BTdHJlYW1pbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHN0b3BTdHJlYW1pbmcgPSBuZXcgc3RvcFN0cmVhbWluZyRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBwbGF5ZXJDb3VudCRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBsYXllckNvdW50XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJjb3VudFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5jb3VudCA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIGNvdW50ICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY291bnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIGludDMyIGNvdW50ID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuY291bnQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5jb3VudCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBwbGF5ZXJDb3VudFxuICovXG5leHBvcnQgY29uc3QgcGxheWVyQ291bnQgPSBuZXcgcGxheWVyQ291bnQkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3RhdHMkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdGF0c1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwiZGF0YVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuZGF0YSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBkYXRhICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBkYXRhID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuZGF0YSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5kYXRhKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0YXRzXG4gKi9cbmV4cG9ydCBjb25zdCBzdGF0cyA9IG5ldyBzdGF0cyRUeXBlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaWduYWxsaW5nX21lc3NhZ2VzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgKiBhcyBNZXNzYWdlcyBmcm9tICcuLi9NZXNzYWdlcy9zaWduYWxsaW5nX21lc3NhZ2VzJztcbmltcG9ydCAqIGFzIE1lc3NhZ2VIZWxwZXJzIGZyb20gJy4uL01lc3NhZ2VzL21lc3NhZ2VfaGVscGVycyc7XG4vKipcbiAqIFVzZWQgdG8gcmVndWxhcmx5IHBpbmcgYSBwcm90b2NvbCBjb25uZWN0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBnb29kIGFuZCBvcGVuLlxuICogV2hlbiB0aGUgcG9uZyBkb2Vzbid0IGNvbWUgaW4gcmVzcG9uc2UgdG8gYSBwaW5nIGluIHRpbWUgYSBjYWxsYmFjayBpcyBmaXJlZCB0aGF0IGNhbiBiZSBoYW5kZWRcbiAqIGJ5IHRoZSBvd25lci5cbiAqL1xuZXhwb3J0IGNsYXNzIEtlZXBhbGl2ZU1vbml0b3Ige1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIFJvdW5kIFRyaXAgVGltZSBvZiB0aGUgY3VycmVudCBjb25uZWN0aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKi9cbiAgICBnZXQgUlRUKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ydHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbW9uaXRvciBhbmQgc3RhcnRzIHRoZSBwaW5nIHRpbWVyLiBJZiBhIHBvbmcgZG9lcyBub3QgY29tZSBiYWNrIGJ5IHRoZSB0aW1lIHdlIHdhbnRcbiAgICAgKiB0byBzZW5kIGEgc2Vjb25kIHBpbmcgdGhlbiB0aGUgY29ubmVjdGlvbiBpcyBjb25zaWRlcmVkIGRlYWQgYW5kIHRoZSBvblRpbWVvdXQgY2FsbGJhY2sgaXMgZmlyZWQuXG4gICAgICogQHBhcmFtIHByb3RvY29sIC0gVGhlIGNvbm5lY3Rpb24gdGhhdCB3ZSB3YW50IHRvIG1vbml0b3IuXG4gICAgICogQHBhcmFtIHRpbWVvdXQgLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwaW5nIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3RvY29sLCB0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ydHQgPSAwO1xuICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIHRoaXMub25SZXNwb25zZSA9IHRoaXMub25IZWFydGJlYXRSZXNwb25zZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnByb3RvY29sLnRyYW5zcG9ydC5vbignY2xvc2UnLCB0aGlzLnN0b3AuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHRoaXMuYWxpdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnByb3RvY29sLm9uKCdwb25nJywgdGhpcy5vblJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBzZXRJbnRlcnZhbCh0aGlzLnNlbmRIZWFydGJlYXQuYmluZCh0aGlzKSwgdGhpcy50aW1lb3V0KTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmtlZXBhbGl2ZSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wub2ZmKCdwb25nJywgdGhpcy5vblJlc3BvbnNlKTtcbiAgICB9XG4gICAgc2VuZEhlYXJ0YmVhdCgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBpZiB3ZSBuZXZlciBnb3QgYSByZXNwb25zZSBmcm9tIHRoZSBsYXN0IGhlYXJ0YmVhdCwgYXNzdW1lIHRoZSBjb25uZWN0aW9uIGlzIGRlYWQgYW5kIHRpbWVvdXRcbiAgICAgICAgaWYgKHRoaXMuYWxpdmUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAoX2EgPSB0aGlzLm9uVGltZW91dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFyayB0aGUgY29ubmVjdGlvbiBhcyB0ZW1wb3JhcmlseSBkZWFkIHVudGlsIHdlIGdldCBhIHJlc3BvbnNlIGZyb20gdGhlIHBpbmdcbiAgICAgICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMucGluZywgeyB0aW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSB9KSk7XG4gICAgfVxuICAgIG9uSGVhcnRiZWF0UmVzcG9uc2UocG9uZ01zZykge1xuICAgICAgICAvLyB3ZSBnb3QgYSBwb25nIHJlc3BvbnNlIGZyb20gdGhlIG90aGVyIHNpZGUsIHRoZSBjb25uZWN0aW9uIGlzIGdvb2QuXG4gICAgICAgIC8vIHdlIGFsc28gc3RvcmUgdGhlIHJvdW5kIHRyaXAgdGltZSBpZiBhbnlvbmUgaXMgY3VyaW91c1xuICAgICAgICB0aGlzLnJ0dCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gcG9uZ01zZy50aW1lO1xuICAgICAgICB0aGlzLmFsaXZlID0gdHJ1ZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LZWVwYWxpdmVNb25pdG9yLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9FdmVudC9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vTG9nZ2VyL0xvZ2dlcic7XG4vKipcbiAqIFNpZ25hbGxpbmcgcHJvdG9jb2wgZm9yIGhhbmRsaW5nIG1lc3NhZ2VzIGZyb20gdGhlIHNpZ25hbGxpbmcgc2VydmVyLlxuICpcbiAqIExpc3RlbiBvbiB0aGlzIGVtaXR0ZXIgZm9yIG1lc3NhZ2VzLiBNZXNzYWdlIHR5cGUgaXMgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuXG4gKiBFeGFtcGxlOlxuICogICAgICBzaWduYWxsaW5nUHJvdG9jb2wub24oJ2NvbmZpZycsIChtZXNzYWdlOiBNZXNzYWdlcy5jb25maWcpID1cXD4gY29uc29sZS5sb2coYEdvdCBhIGNvbmZpZyBtZXNzYWdlOiAke21lc3NhZ2V9YCkpKTtcbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGluIHRoaXMgY2xhc3Mgd2lsbCBhbHNvIGVtaXQgb24gbWVzc2FnZSBldmVudHMuXG4gKlxuICogRXZlbnRzIGVtaXR0ZWQgb24gdHJhbnNwb3J0OlxuICogICBtZXNzYWdlOlxuICogICAgICBFbWl0dGVkIGFueSB0aW1lIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBieSB0aGUgdHJhbnNwb3J0LiBMaXN0ZW4gb24gdGhpcyBpZlxuICogICAgICB5b3Ugd2lzaCB0byBjYXB0dXJlIGFsbCBtZXNzYWdlcywgcmF0aGVyIHRoYW4gc3BlY2lmaWMgbWVzc2FnZXMgb25cbiAqICAgICAgJ21lc3NhZ2VIYW5kbGVycycuXG4gKlxuICogICBvdXQ6XG4gKiAgICAgIEVtaXR0ZWQgd2hlbiBzZW5kaW5nIGEgbWVzc2FnZSBvdXQgb24gdGhlIHRyYW5zcG9ydC4gU2ltaWxhciB0byAnbWVzc2FnZScgYnV0XG4gKiAgICAgIG9ubHkgZm9yIHdoZW4gbWVzc2FnZXMgYXJlIHNlbnQgZnJvbSB0aGlzIGVuZHBvaW50LiBVc2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25hbGxpbmdQcm90b2NvbCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgc3RhdGljIGdldCBTSUdOQUxMSU5HX1ZFUlNJT04oKSB7XG4gICAgICAgIHJldHVybiAnMS4zLjAnO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih0cmFuc3BvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgIHRyYW5zcG9ydC5vbk1lc3NhZ2UgPSAobXNnKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkTWVzc2FnZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKG1zZyk7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkRlYnVnKCdQcm90b2NvbCByZWNlaXZlZCA9PiBcXG4nICsgSlNPTi5zdHJpbmdpZnkocGFyc2VkRGF0YSwgdW5kZWZpbmVkLCA0KSk7XG4gICAgICAgICAgICAgICAgcGFyc2VkTWVzc2FnZSA9IHBhcnNlZERhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBFcnJvciBwYXJzaW5nIG1lc3NhZ2Ugc3RyaW5nICR7bXNnfS5cXG4ke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgVW5rbm93biBlcnJvciB3aGlsZSBwYXJzaW5nIG1lc3NhZ2UgZGF0YSBpbiBoYW5kbGVPbk1lc3NhZ2VgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2FsbCB0aGUgaGFuZGxlcnNcbiAgICAgICAgICAgIHRyYW5zcG9ydC5lbWl0KCdtZXNzYWdlJywgcGFyc2VkTWVzc2FnZSk7IC8vIGVtaXQgdGhpcyBmb3IgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhbnkgbWVzc2FnZVxuICAgICAgICAgICAgaWYgKCF0aGlzLmVtaXQocGFyc2VkTWVzc2FnZS50eXBlLCBwYXJzZWRNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgIC8vIGVtaXQgdGhpcyBmb3IgbGlzdGVuZXJzIGxpc3RlbmluZyBmb3Igc3BlY2lmaWMgbWVzc2FnZXNcbiAgICAgICAgICAgICAgICAvLyBubyBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3VuaGFuZGxlZCcsIHBhcnNlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc2tzIHRoZSB0cmFuc3BvcnQgdG8gY29ubmVjdCB0byB0aGUgZ2l2ZW4gVVJMLlxuICAgICAqIEBwYXJhbSB1cmwgLSBUaGUgdXJsIHRvIGNvbm5lY3QgdG8uXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBjYWxsIHN1Y2NlZWRlZC5cbiAgICAgKi9cbiAgICBjb25uZWN0KHVybCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuY29ubmVjdCh1cmwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc2tzIHRoZSB0cmFuc3BvcnQgdG8gZGlzY29ubmVjdCBmcm9tIGFueSBjb25uZWN0aW9uIGl0IG1pZ2h0IGhhdmUuXG4gICAgICogQHBhcmFtIGNvZGUgLSBBbiBvcHRpb25hbCBkaXNjb25uZWN0aW9uIGNvZGUuXG4gICAgICogQHBhcmFtIHJlYXNvbiAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aXZlIHN0cmluZyBmb3IgdGhlIGRpc2Nvbm5lY3QgcmVhc29uLlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0LmRpc2Nvbm5lY3QoY29kZSwgcmVhc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIGFuZCByZWFkeSB0byBzZW5kL3JlY2VpdmUgbWVzc2FnZXMuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvdG9jb2wgaXMgY29ubmVjdGVkLlxuICAgICAqL1xuICAgIGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuaXNDb25uZWN0ZWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFzc2VzIGEgbWVzc2FnZSB0byB0aGUgdHJhbnNwb3J0IHRvIHNlbmQgdG8gdGhlIG90aGVyIGVuZC5cbiAgICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBzZW5kTWVzc2FnZShtc2cpIHtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuc2VuZE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobXNnKSk7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0LmVtaXQoJ291dCcsIG1zZyk7IC8vIGVtaXQgdGhpcyBmb3IgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBvdXRnb2luZyBtZXNzYWdlc1xuICAgICAgICBMb2dnZXIuRGVidWcoJ1Byb3RvY29sIHNlbnQgPT4gXFxuJyArIEpTT04uc3RyaW5naWZ5KG1zZywgdW5kZWZpbmVkLCA0KSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbmFsbGluZ1Byb3RvY29sLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9Mb2dnZXIvTG9nZ2VyJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL0V2ZW50L0V2ZW50RW1pdHRlcic7XG4vKipcbiAqIFRoZSBjb250cm9sbGVyIGZvciB0aGUgV2ViU29ja2V0IGFuZCBhbGwgYXNzb2NpYXRlZCBtZXRob2RzXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgV2ViU29ja2V0VHJhbnNwb3J0IGZvciBicm93c2VyIGNvbnRleHRzLlxuICAgICAqIEBwYXJhbSBwcm90b2NvbHMgLSBBbiBvcHRpb25hbCBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzIHRvIHBhc3MgdG8gdGhlIG5ldyB3ZWJzb2NrZXQgcHJvdG9jb2xzIHBhcmFtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdG9jb2xzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuV1NfT1BFTl9TVEFURSA9IDE7XG4gICAgICAgIHRoaXMucHJvdG9jb2xzID0gcHJvdG9jb2xzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIG1lc3NhZ2Ugb3ZlciB0aGUgd2Vic29ja2V0LlxuICAgICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBzZW5kLlxuICAgICAqL1xuICAgIHNlbmRNZXNzYWdlKG1zZykge1xuICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LnNlbmQobXNnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IHRvIHRoZSBzaWduYWxpbmcgc2VydmVyXG4gICAgICogQHBhcmFtIGNvbm5lY3Rpb25VUkwgLSBUaGUgQWRkcmVzcyBvZiB0aGUgc2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEByZXR1cm5zIElmIHRoZXJlIGlzIGEgY29ubmVjdGlvblxuICAgICAqL1xuICAgIGNvbm5lY3QoY29ubmVjdGlvblVSTCkge1xuICAgICAgICBMb2dnZXIuSW5mbyhjb25uZWN0aW9uVVJMKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldChjb25uZWN0aW9uVVJMLCB0aGlzLnByb3RvY29scyk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5vbm9wZW4gPSAoXykgPT4gdGhpcy5oYW5kbGVPbk9wZW4oKTtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0Lm9uZXJyb3IgPSAoXykgPT4gdGhpcy5oYW5kbGVPbkVycm9yKCk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5vbmNsb3NlID0gKGV2ZW50KSA9PiB0aGlzLmhhbmRsZU9uQ2xvc2UoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQub25tZXNzYWdlID0gKGV2ZW50KSA9PiB0aGlzLmhhbmRsZU9uTWVzc2FnZShldmVudCk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5vbm1lc3NhZ2ViaW5hcnkgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlT25NZXNzYWdlQmluYXJ5KGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0IHRoaXMgdHJhbnNwb3J0LlxuICAgICAqIEBwYXJhbSBjb2RlIC0gQW4gb3B0aW9uYWwgZGlzY29ubmVjdCBjb2RlLlxuICAgICAqIEBwYXJhbSByZWFzb24gLSBBIGRlc2NyaXB0aXZlIHN0cmluZyBmb3IgdGhlIGRpc2Nvbm5lY3QgcmVhc29uLlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgdHJhbnNwb3J0IGlzIGNvbm5lY3RlZCBhbmQgcmVhZHkgdG8gc2VuZC9yZWNlaXZlIG1lc3NhZ2VzLlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMud2ViU29ja2V0ICYmIHRoaXMud2ViU29ja2V0LnJlYWR5U3RhdGUgIT0gV2ViU29ja2V0LkNMT1NFRDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGF0IGhhcHBlbnMgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgaW4gYmluYXJ5IGZvcm1cbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBNZXNzYWdlIFJlY2VpdmVkXG4gICAgICovXG4gICAgaGFuZGxlT25NZXNzYWdlQmluYXJ5KGV2ZW50KSB7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCBpcyBlbXB0eSByZXR1cm5cbiAgICAgICAgaWYgKCFldmVudCB8fCAhZXZlbnQuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSB0aGUgYmluYXJ5IGFuZCB0aGVuIGhhbmRsZSB0aGUgbWVzc2FnZVxuICAgICAgICBldmVudC5kYXRhXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudGhlbigobWVzc2FnZVN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gYnVpbGQgYSBuZXcgbWVzc2FnZVxuICAgICAgICAgICAgY29uc3QgY29uc3RydWN0ZWRNZXNzYWdlID0gbmV3IE1lc3NhZ2VFdmVudCgnbWVzc2FnZUZyb21CaW5hcnknLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogbWVzc2FnZVN0cmluZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBzZW5kIHRoZSBuZXcgc3RyaW5naWZpZWQgZXZlbnQgYmFjayBpbnRvIGBvbm1lc3NhZ2VgXG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9uTWVzc2FnZShjb25zdHJ1Y3RlZE1lc3NhZ2UpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBGYWlsZWQgdG8gcGFyc2UgYmluYXJ5IGJsb2IgZnJvbSB3ZWJzb2NrZXQsIHJlYXNvbjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGF0IGhhcHBlbnMgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBNZXNzYWdlIFJlY2VpdmVkXG4gICAgICovXG4gICAgaGFuZGxlT25NZXNzYWdlKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlYnNvY2tldCBtZXNzYWdlIGlzIGJpbmFyeSwgaWYgc28sIHN0cmluZ2lmeSBpdC5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT25NZXNzYWdlQmluYXJ5KGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMub25NZXNzYWdlKGV2ZW50LmRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgV2Vic29ja2V0IGlzIG9wZW5lZFxuICAgICAqL1xuICAgIGhhbmRsZU9uT3BlbigpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0Nvbm5lY3RlZCB0byB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIgdmlhIFdlYlNvY2tldCcpO1xuICAgICAgICB0aGlzLmVtaXQoJ29wZW4nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIG9uIHRoZSB3ZWJzb2NrZXRcbiAgICAgKi9cbiAgICBoYW5kbGVPbkVycm9yKCkge1xuICAgICAgICAvL0xvZ2dlci5FcnJvcihMb2dnZXIuR2V0U3RhY2tUcmFjZSgpLCAnV2ViU29ja2V0IGVycm9yJyk7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBXZWJzb2NrZXQgaXMgY2xvc2VkXG4gICAgICogQHBhcmFtIGV2ZW50IC0gQ2xvc2UgRXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVPbkNsb3NlKGV2ZW50KSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEaXNjb25uZWN0ZWQgdG8gdGhlIHNpZ25hbGxpbmcgc2VydmVyIHZpYSBXZWJTb2NrZXQ6ICcgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXZlbnQuY29kZSkgK1xuICAgICAgICAgICAgJyAtICcgK1xuICAgICAgICAgICAgZXZlbnQucmVhc29uKTtcbiAgICAgICAgdGhpcy5lbWl0KCdjbG9zZScsIGV2ZW50KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWJTb2NrZXRUcmFuc3BvcnQuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL0V2ZW50L0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgV2ViU29ja2V0IGZyb20gJ3dzJztcbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgV2ViU29ja2V0VHJhbnNwb3J0IGZyb20gcGl4ZWxzdHJlYW1pbmdjb21tb24gdGhhdCBzdXBwb3J0cyBub2RlLmpzIHdlYnNvY2tldHNcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIHNsaWdodCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSAnd3MnIG5vZGUuanMgcGFja2FnZSBhbmQgdGhlIHdlYnNvY2tldHNcbiAqIHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlcnMuXG4gKiBEbyBub3QgdXNlIHRoaXMgY29kZSBpbiBhIGJyb3dzZXIgdXNlICdXZWJTb2NrZXRUcmFuc3BvcnQnIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRUcmFuc3BvcnROSlMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuV1NfT1BFTl9TVEFURSA9IDE7XG4gICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIFdlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQgPSBhcmd1bWVudDtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdvcGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdG9jb2xzID0gYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBtZXNzYWdlIG92ZXIgdGhlIHdlYnNvY2tldC5cbiAgICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBzZW5kTWVzc2FnZShtc2cpIHtcbiAgICAgICAgaWYgKHRoaXMud2ViU29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5zZW5kKG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byB0aGUgc2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEBwYXJhbSBjb25uZWN0aW9uVVJMIC0gVGhlIEFkZHJlc3Mgb2YgdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKiBAcGFyYW0gcHJvdG9jb2xzIC0gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyB0byBwYXNzIHRvIHRoZSBuZXcgd2Vic29ja2V0IHByb3RvY29scyBwYXJhbVxuICAgICAqIEByZXR1cm5zIElmIHRoZXJlIGlzIGEgY29ubmVjdGlvblxuICAgICAqL1xuICAgIGNvbm5lY3QoY29ubmVjdGlvblVSTCkge1xuICAgICAgICB0aGlzLndlYlNvY2tldCA9IG5ldyBXZWJTb2NrZXQoY29ubmVjdGlvblVSTCwgdGhpcy5wcm90b2NvbHMpO1xuICAgICAgICB0aGlzLnNldHVwU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3QgdGhpcyB0cmFuc3BvcnQuXG4gICAgICogQHBhcmFtIGNvZGUgLSBBbiBvcHRpb25hbCBkaXNjb25uZWN0IGNvZGUuXG4gICAgICogQHBhcmFtIHJlYXNvbiAtIEEgZGVzY3JpcHRpdmUgc3RyaW5nIGZvciB0aGUgZGlzY29ubmVjdCByZWFzb24uXG4gICAgICovXG4gICAgZGlzY29ubmVjdChjb2RlLCByZWFzb24pIHtcbiAgICAgICAgaWYgKHRoaXMud2ViU29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIGFuZCByZWFkeSB0byBzZW5kL3JlY2VpdmUgbWVzc2FnZXMuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIGNvbm5lY3RlZC5cbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy53ZWJTb2NrZXQgJiYgdGhpcy53ZWJTb2NrZXQucmVhZHlTdGF0ZSAhPSBXZWJTb2NrZXQuQ0xPU0VEO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoYXQgaGFwcGVucyB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgICAqIEBwYXJhbSBldmVudCAtIE1lc3NhZ2UgUmVjZWl2ZWRcbiAgICAgKi9cbiAgICBoYW5kbGVPbk1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMub25NZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLm9uTWVzc2FnZShldmVudC5kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIFdlYnNvY2tldCBpcyBvcGVuZWRcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBOb3QgVXNlZFxuICAgICAqL1xuICAgIGhhbmRsZU9uT3BlbihldmVudCkge1xuICAgICAgICB0aGlzLmVtaXQoJ29wZW4nLCBldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBvbiB0aGUgd2Vic29ja2V0XG4gICAgICogQHBhcmFtIGV2ZW50IC0gRXJyb3IgUGF5bG9hZFxuICAgICAqL1xuICAgIGhhbmRsZU9uRXJyb3IoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBXZWJzb2NrZXQgaXMgY2xvc2VkXG4gICAgICogQHBhcmFtIGV2ZW50IC0gQ2xvc2UgRXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVPbkNsb3NlKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZW1pdCgnY2xvc2UnLCBldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgV2Vic29ja2V0IGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLndlYlNvY2tldCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsb3NlKCk7XG4gICAgfVxuICAgIHNldHVwU29ja2V0SGFuZGxlcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuaGFuZGxlT25PcGVuLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLmhhbmRsZU9uRXJyb3IuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIHRoaXMuaGFuZGxlT25DbG9zZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZU9uTWVzc2FnZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYlNvY2tldFRyYW5zcG9ydE5KUy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IGNsYXNzIFNEUFV0aWxzIHtcbiAgICBzdGF0aWMgYWRkVmlkZW9IZWFkZXJFeHRlbnNpb25Ub1NkcChzZHAsIHVyaSkge1xuICAgICAgICAvLyBGaW5kIHRoZSBoaWdoZXN0IHVzZWQgaGVhZGVyIGV4dGVuc2lvbiBpZCBieSBzb3J0aW5nIHRoZSBleHRlbnNpb24gaWRzIHVzZWQsXG4gICAgICAgIC8vIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZXMgYW5kIGFkZGluZyBvbmUuXG4gICAgICAgIC8vIFRvZG86IFVwZGF0ZSB0aGlzIHdoZW4gV2ViUlRDIGluIENocm9tZSBzdXBwb3J0cyB0aGUgaGVhZGVyIGV4dGVuc2lvbiBBUEkuXG4gICAgICAgIGNvbnN0IHVzZWRJZHMgPSBzZHBcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aCgnYT1leHRtYXA6JykpXG4gICAgICAgICAgICAubWFwKChsaW5lKSA9PiBwYXJzZUludChsaW5lLnNwbGl0KCcgJylbMF0uc3Vic3RyaW5nKDkpLCAxMCkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtLCBpbmRleCwgYXJyYXkpID0+IGFycmF5LmluZGV4T2YoaXRlbSkgPT09IGluZGV4KTtcbiAgICAgICAgY29uc3QgbmV4dElkID0gdXNlZElkc1t1c2VkSWRzLmxlbmd0aCAtIDFdICsgMTtcbiAgICAgICAgY29uc3QgZXh0bWFwTGluZSA9ICdhPWV4dG1hcDonICsgbmV4dElkICsgJyAnICsgdXJpICsgJ1xcclxcbic7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gc2RwLnNwbGl0KCdcXG5tPScpLm1hcCgocGFydCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoaW5kZXggPiAwID8gJ209JyArIHBhcnQgOiBwYXJ0KS50cmltKCkgKyAnXFxyXFxuJztcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlc3Npb25QYXJ0ID0gc2VjdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgLy8gT25seSBhZGQgZXh0ZW5zaW9uIHRvIG09dmlkZW8gbWVkaWEgc2VjdGlvblxuICAgICAgICByZXR1cm4gKHNlc3Npb25QYXJ0ICtcbiAgICAgICAgICAgIHNlY3Rpb25zXG4gICAgICAgICAgICAgICAgLm1hcCgobWVkaWFTZWN0aW9uKSA9PiBtZWRpYVNlY3Rpb24uc3RhcnRzV2l0aCgnbT12aWRlbycpID8gbWVkaWFTZWN0aW9uICsgZXh0bWFwTGluZSA6IG1lZGlhU2VjdGlvbilcbiAgICAgICAgICAgICAgICAuam9pbignJykpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNkcFV0aWxzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgeyBMb2dnZXIsIExvZ0xldmVsLCBvdmVycmlkZUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyL0xvZ2dlcic7XG5leHBvcnQgeyBXZWJTb2NrZXRUcmFuc3BvcnQgfSBmcm9tICcuL1RyYW5zcG9ydC9XZWJTb2NrZXRUcmFuc3BvcnQnO1xuZXhwb3J0IHsgV2ViU29ja2V0VHJhbnNwb3J0TkpTIH0gZnJvbSAnLi9UcmFuc3BvcnQvV2ViU29ja2V0VHJhbnNwb3J0TkpTJztcbmV4cG9ydCB7IFNpZ25hbGxpbmdQcm90b2NvbCB9IGZyb20gJy4vUHJvdG9jb2wvU2lnbmFsbGluZ1Byb3RvY29sJztcbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vRXZlbnQvRXZlbnRFbWl0dGVyJztcbmV4cG9ydCB7IE1lc3NhZ2VSZWdpc3RyeSB9IGZyb20gJy4vTWVzc2FnZXMvbWVzc2FnZV9yZWdpc3RyeSc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlc18xIGZyb20gJy4vTWVzc2FnZXMvc2lnbmFsbGluZ19tZXNzYWdlcyc7XG5leHBvcnQgeyBNZXNzYWdlc18xIGFzIE1lc3NhZ2VzIH07XG5pbXBvcnQgKiBhcyBNZXNzYWdlSGVscGVyc18xIGZyb20gJy4vTWVzc2FnZXMvbWVzc2FnZV9oZWxwZXJzJztcbmV4cG9ydCB7IE1lc3NhZ2VIZWxwZXJzXzEgYXMgTWVzc2FnZUhlbHBlcnMgfTtcbmV4cG9ydCB7IEtlZXBhbGl2ZU1vbml0b3IgfSBmcm9tICcuL1Byb3RvY29sL0tlZXBhbGl2ZU1vbml0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9VdGlsL1NkcFV0aWxzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpeGVsc3RyZWFtaW5nY29tbW9uLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBGbGFncywgTnVtZXJpY1BhcmFtZXRlcnMgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IEFma1RpbWVkT3V0RXZlbnQsIEFma1dhcm5pbmdBY3RpdmF0ZUV2ZW50LCBBZmtXYXJuaW5nRGVhY3RpdmF0ZUV2ZW50LCBBZmtXYXJuaW5nVXBkYXRlRXZlbnQgfSBmcm9tICcuLi9VdGlsL0V2ZW50RW1pdHRlcic7XG5leHBvcnQgY2xhc3MgQUZLQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBwaXhlbFN0cmVhbWluZywgb25EaXNtaXNzQWZrKSB7XG4gICAgICAgIC8vIHRpbWUgb3V0IGxvZ2ljIGRldGFpbHNcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb3VudGRvd25BY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy53YXJuVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY291bnREb3duID0gMDtcbiAgICAgICAgdGhpcy5jb3VudERvd25UaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcgPSBwaXhlbFN0cmVhbWluZztcbiAgICAgICAgdGhpcy5vbkRpc21pc3NBZmsgPSBvbkRpc21pc3NBZms7XG4gICAgICAgIHRoaXMub25BRktUaW1lZE91dENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FGSyB0aW1lZCBvdXQsIGRpZCB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGlzIGNhbGxiYWNrPycpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0aG9kcyB0aGF0IG9jY3VyIHdoZW4gYW4gYWZrIGV2ZW50IGxpc3RlbmVyIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBvbkFma0NsaWNrKCkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuY291bnREb3duVGltZXIpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUgfHwgdGhpcy5jb3VudGRvd25BY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBZmtXYXJuaW5nVGltZXIoKTtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgQWZrV2FybmluZ0RlYWN0aXZhdGVFdmVudCgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydCB0aGUgd2FybmluZyB0aW1lciBpZiBhIHRpbWVvdXQgaXMgc2V0IGdyZWF0ZXIgdGhhdCAwIHNlY29uZHNcbiAgICAgKi9cbiAgICBzdGFydEFma1dhcm5pbmdUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MpID4gMCAmJlxuICAgICAgICAgICAgdGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5BRktEZXRlY3Rpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRBZmtXYXJuaW5nVGltZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgYWZrIHdhcm5pbmcgdGltZXJcbiAgICAgKi9cbiAgICBzdG9wQWZrV2FybmluZ1RpbWVyKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvdW50ZG93bkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy53YXJuVGltZXIpO1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuY291bnREb3duVGltZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgdGltZXIgd2hpY2ggd2hlbiBlbGFwc2VkIHdpbGwgd2FybiB0aGUgdXNlciB0aGV5IGFyZSBpbmFjdGl2ZS5cbiAgICAgKi9cbiAgICBwYXVzZUFma1dhcm5pbmdUaW1lcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHVzZXIgaW50ZXJhY3RzIHRoZW4gcmVzZXQgdGhlIHdhcm5pbmcgdGltZXIuXG4gICAgICovXG4gICAgcmVzZXRBZmtXYXJuaW5nVGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSAmJiB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkFGS0RldGVjdGlvbikpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLndhcm5UaW1lcik7XG4gICAgICAgICAgICB0aGlzLndhcm5UaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hY3RpdmF0ZUFma0V2ZW50KCksIHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MpICogMTAwMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGUgQUZLIG92ZXJsYXkgYW5kIGJlZ2luIHRoZSBjb3VudERvd25cbiAgICAgKi9cbiAgICBhY3RpdmF0ZUFma0V2ZW50KCkge1xuICAgICAgICAvLyBQYXVzZSB0aGUgdGltZXIgd2hpbGUgdGhlIHVzZXIgaXMgbG9va2luZyBhdCB0aGUgaW5hY3Rpdml0eSB3YXJuaW5nIG92ZXJsYXlcbiAgICAgICAgdGhpcy5wYXVzZUFma1dhcm5pbmdUaW1lcigpO1xuICAgICAgICAvLyBpbnN0YW50aWF0ZSBhIG5ldyBvdmVybGF5XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgQWZrV2FybmluZ0FjdGl2YXRlRXZlbnQoe1xuICAgICAgICAgICAgY291bnREb3duOiB0aGlzLmNvdW50RG93bixcbiAgICAgICAgICAgIGRpc21pc3NBZms6IHRoaXMub25EaXNtaXNzQWZrXG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gdXBkYXRlIG91ciBjb3VudERvd24gdGltZXIgYW5kIG92ZXJsYXkgY29udGVudHNcbiAgICAgICAgdGhpcy5jb3VudERvd24gPSB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLkFGS0NvdW50ZG93blNlY3MpO1xuICAgICAgICB0aGlzLmNvdW50ZG93bkFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgQWZrV2FybmluZ1VwZGF0ZUV2ZW50KHsgY291bnREb3duOiB0aGlzLmNvdW50RG93biB9KSk7XG4gICAgICAgIC8vIGlmIHdlIGFyZSBpbiBsb2NrZWQgbW91c2UgZXhpdCBwb2ludGVybG9ja1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUpKSB7XG4gICAgICAgICAgICAvLyBtaW5vciBoYWNrIHRvIGFsbGV2aWF0ZSBpb3Mgbm90IHN1cHBvcnRpbmcgcG9pbnRlcmxvY2tcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5leGl0UG9pbnRlckxvY2spIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5leGl0UG9pbnRlckxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyByZXNldCBvdXIgY291bnREb3duIGludGVydmFsIGFjY29yZGluZ2x5XG4gICAgICAgIHRoaXMuY291bnREb3duVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvdW50RG93bi0tO1xuICAgICAgICAgICAgaWYgKHRoaXMuY291bnREb3duID09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBmYWlsZWQgdG8gY2xpY2sgc28gaGlkZSB0aGUgb3ZlcmxheSBhbmQgZGlzY29ubmVjdCB0aGVtLlxuICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgQWZrVGltZWRPdXRFdmVudCgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQUZLVGltZWRPdXRDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIExvZ2dlci5JbmZvKCdZb3UgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCBkdWUgdG8gaW5hY3Rpdml0eScpO1xuICAgICAgICAgICAgICAgIC8vIHN3aXRjaCBvZmYgdGhlIGFmayBmZWF0dXJlIGFzIHN0cmVhbSBoYXMgY2xvc2VkXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wQWZrV2FybmluZ1RpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IEFma1dhcm5pbmdVcGRhdGVFdmVudCh7IGNvdW50RG93bjogdGhpcy5jb3VudERvd24gfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BRktDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBTZXR0aW5nRmxhZyB9IGZyb20gJy4vU2V0dGluZ0ZsYWcnO1xuaW1wb3J0IHsgU2V0dGluZ051bWJlciB9IGZyb20gJy4vU2V0dGluZ051bWJlcic7XG5pbXBvcnQgeyBTZXR0aW5nVGV4dCB9IGZyb20gJy4vU2V0dGluZ1RleHQnO1xuaW1wb3J0IHsgU2V0dGluZ09wdGlvbiB9IGZyb20gJy4vU2V0dGluZ09wdGlvbic7XG5pbXBvcnQgeyBTZXR0aW5nc0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL1V0aWwvRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IEJyb3dzZXJVdGlscyB9IGZyb20gJy4uL1V0aWwvQnJvd3NlclV0aWxzJztcbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGZsYWdzIHRoYXQgY2FuIGJlIHRvZ2dsZWQgYW5kIGFyZSBjb3JlIHRvIGFsbCBQaXhlbCBTdHJlYW1pbmcgZXhwZXJpZW5jZXMuXG4gKiBUaGVzZSBhcmUgdXNlZCBpbiB0aGUgYENvbmZpZy5GbGFnc2AgbWFwLlxuICovXG5leHBvcnQgY2xhc3MgRmxhZ3Mge1xufVxuRmxhZ3MuQXV0b0Nvbm5lY3QgPSAnQXV0b0Nvbm5lY3QnO1xuRmxhZ3MuQXV0b1BsYXlWaWRlbyA9ICdBdXRvUGxheVZpZGVvJztcbkZsYWdzLkFGS0RldGVjdGlvbiA9ICdUaW1lb3V0SWZJZGxlJztcbkZsYWdzLkhvdmVyaW5nTW91c2VNb2RlID0gJ0hvdmVyaW5nTW91c2UnO1xuRmxhZ3MuRm9yY2VNb25vQXVkaW8gPSAnRm9yY2VNb25vQXVkaW8nO1xuRmxhZ3MuRm9yY2VUVVJOID0gJ0ZvcmNlVFVSTic7XG5GbGFncy5GYWtlTW91c2VXaXRoVG91Y2hlcyA9ICdGYWtlTW91c2VXaXRoVG91Y2hlcyc7XG5GbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyID0gJ0NvbnRyb2xzUXVhbGl0eSc7XG5GbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbiA9ICdNYXRjaFZpZXdwb3J0UmVzJztcbkZsYWdzLlN0YXJ0VmlkZW9NdXRlZCA9ICdTdGFydFZpZGVvTXV0ZWQnO1xuRmxhZ3MuU3VwcHJlc3NCcm93c2VyS2V5cyA9ICdTdXBwcmVzc0Jyb3dzZXJLZXlzJztcbkZsYWdzLlVzZU1pYyA9ICdVc2VNaWMnO1xuRmxhZ3MuVXNlTW9kYWxGb3JUZXh0SW5wdXQgPSAnVXNlTW9kYWxGb3JUZXh0SW5wdXQnO1xuRmxhZ3MuVXNlQ2FtZXJhID0gJ1VzZUNhbWVyYSc7XG5GbGFncy5LZXlib2FyZElucHV0ID0gJ0tleWJvYXJkSW5wdXQnO1xuRmxhZ3MuTW91c2VJbnB1dCA9ICdNb3VzZUlucHV0JztcbkZsYWdzLlRvdWNoSW5wdXQgPSAnVG91Y2hJbnB1dCc7XG5GbGFncy5HYW1lcGFkSW5wdXQgPSAnR2FtZXBhZElucHV0JztcbkZsYWdzLlhSQ29udHJvbGxlcklucHV0ID0gJ1hSQ29udHJvbGxlcklucHV0JztcbkZsYWdzLldhaXRGb3JTdHJlYW1lciA9ICdXYWl0Rm9yU3RyZWFtZXInO1xuRmxhZ3MuSGlkZVVJID0gJ0hpZGVVSSc7XG5GbGFncy5FbmFibGVDYXB0dXJlVGltZUV4dCA9ICdFbmFibGVDYXB0dXJlVGltZUV4dCc7XG5leHBvcnQgY29uc3QgaXNGbGFnSWQgPSAoaWQpID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEZsYWdzKS5zb21lKChuYW1lKSA9PiBGbGFnc1tuYW1lXSA9PT0gaWQpO1xuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgbnVtZXJpYyBwYXJhbWV0ZXJzIHRoYXQgYXJlIGNvcmUgdG8gYWxsIFBpeGVsIFN0cmVhbWluZyBleHBlcmllbmNlcy5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBOdW1lcmljUGFyYW1ldGVycyB7XG59XG5OdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcyA9ICdBRktUaW1lb3V0Jztcbk51bWVyaWNQYXJhbWV0ZXJzLkFGS0NvdW50ZG93blNlY3MgPSAnQUZLQ291bnRkb3duJztcbk51bWVyaWNQYXJhbWV0ZXJzLk1pblFQID0gJ01pblFQJztcbk51bWVyaWNQYXJhbWV0ZXJzLk1heFFQID0gJ01heFFQJztcbk51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHkgPSAnTWluUXVhbGl0eSc7XG5OdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5ID0gJ01heFF1YWxpdHknO1xuTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbiA9ICdDb21wYXRRdWFsaXR5TWluJztcbk51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXggPSAnQ29tcGF0UXVhbGl0eU1heCc7XG5OdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFMgPSAnV2ViUlRDRlBTJztcbk51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUgPSAnV2ViUlRDTWluQml0cmF0ZSc7XG5OdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlID0gJ1dlYlJUQ01heEJpdHJhdGUnO1xuTnVtZXJpY1BhcmFtZXRlcnMuTWF4UmVjb25uZWN0QXR0ZW1wdHMgPSAnTWF4UmVjb25uZWN0QXR0ZW1wdHMnO1xuTnVtZXJpY1BhcmFtZXRlcnMuU3RyZWFtZXJBdXRvSm9pbkludGVydmFsID0gJ1N0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbCc7XG5OdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSA9ICdLZWVwYWxpdmVEZWxheSc7XG5leHBvcnQgY29uc3QgaXNOdW1lcmljSWQgPSAoaWQpID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE51bWVyaWNQYXJhbWV0ZXJzKS5zb21lKChuYW1lKSA9PiBOdW1lcmljUGFyYW1ldGVyc1tuYW1lXSA9PT0gaWQpO1xuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgdGV4dHVhbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGNvcmUgdG8gYWxsIFBpeGVsIFN0cmVhbWluZyBleHBlcmllbmNlcy5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0UGFyYW1ldGVycyB7XG59XG5UZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsID0gJ3NzJztcbmV4cG9ydCBjb25zdCBpc1RleHRJZCA9IChpZCkgPT4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoVGV4dFBhcmFtZXRlcnMpLnNvbWUoKG5hbWUpID0+IFRleHRQYXJhbWV0ZXJzW25hbWVdID09PSBpZCk7XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBlbnVtIGJhc2VkIHBhcmFtZXRlcnMgdGhhdCBhcmUgY29yZSB0byBhbGwgUGl4ZWwgU3RyZWFtaW5nIGV4cGVyaWVuY2VzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIE9wdGlvblBhcmFtZXRlcnMge1xufVxuT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYyA9ICdQcmVmZXJyZWRDb2RlYyc7XG5PcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQgPSAnU3RyZWFtZXJJZCc7XG5PcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkgPSAnUHJlZmVycmVkUXVhbGl0eSc7XG5leHBvcnQgY29uc3QgaXNPcHRpb25JZCA9IChpZCkgPT4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT3B0aW9uUGFyYW1ldGVycykuc29tZSgobmFtZSkgPT4gT3B0aW9uUGFyYW1ldGVyc1tuYW1lXSA9PT0gaWQpO1xuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgLy8gLS0tLS0tLS0tLS0tIFNldHRpbmdzIC0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgLyogQSBtYXAgb2YgZmxhZ3MgdGhhdCBjYW4gYmUgdG9nZ2xlZCAtIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluIHRoZSBhcHBsaWNhdGlvbiAtIGUuZy4gVXNlIE1pYz8gKi9cbiAgICAgICAgdGhpcy5mbGFncyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgbnVtZXJpY2FsIHNldHRpbmdzIC0gb3B0aW9ucyB0aGF0IGNhbiBiZSBpbiB0aGUgYXBwbGljYXRpb24gLSBlLmcuIE1pbkJpdHJhdGUgKi9cbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgdGV4dCBzZXR0aW5ncyAtIGUuZy4gc2lnbmFsbGluZyBzZXJ2ZXIgdXJsICovXG4gICAgICAgIHRoaXMudGV4dFBhcmFtZXRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8qIEEgbWFwIG9mIGVudW0gYmFzZWQgc2V0dGluZ3MgLSBlLmcuIHByZWZlcnJlZCBjb2RlYyAqL1xuICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IHsgaW5pdGlhbFNldHRpbmdzLCB1c2VVcmxQYXJhbXMsIHdlYlNvY2tldFByb3RvY29scyB9ID0gY29uZmlnO1xuICAgICAgICB0aGlzLl91c2VVcmxQYXJhbXMgPSAhIXVzZVVybFBhcmFtcztcbiAgICAgICAgdGhpcy5fd2ViU29ja2V0UHJvdG9jb2xzID0gd2ViU29ja2V0UHJvdG9jb2xzO1xuICAgICAgICB0aGlzLnBvcHVsYXRlRGVmYXVsdFNldHRpbmdzKHRoaXMuX3VzZVVybFBhcmFtcywgaW5pdGlhbFNldHRpbmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiByZWFkaW5nIGNvbmZpZ3VyYXRpb24gaW5pdGlhbCB2YWx1ZXMgZnJvbSBVUkwgcGFyYW1ldGVycywgYW5kXG4gICAgICogcGVyc2lzdGluZyBjaGFuZ2VzIGluIFVSTCB3aGVuIGNoYW5nZWQuXG4gICAgICovXG4gICAgZ2V0IHVzZVVybFBhcmFtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZVVybFBhcmFtcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHByb3RvY29sIG9yIGxpc3Qgb2YgcHJvdG9jb2xzIHRvIHBhc3MgdG8gdGhlIHdlYnNvY2tldCBpZiBzZXQuXG4gICAgICovXG4gICAgZ2V0IHdlYlNvY2tldFByb3RvY29scygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlYlNvY2tldFByb3RvY29scztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUG9wdWxhdGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGEgUGl4ZWwgU3RyZWFtaW5nIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcG9wdWxhdGVEZWZhdWx0U2V0dGluZ3ModXNlVXJsUGFyYW1zLCBzZXR0aW5ncykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGV4dCBQYXJhbWV0ZXJzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRleHRQYXJhbWV0ZXJzLnNldChUZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsLCBuZXcgU2V0dGluZ1RleHQoVGV4dFBhcmFtZXRlcnMuU2lnbmFsbGluZ1NlcnZlclVybCwgJ1NpZ25hbGxpbmcgdXJsJywgJ1VybCBvZiB0aGUgc2lnbmFsbGluZyBzZXJ2ZXInLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIFRleHRQYXJhbWV0ZXJzLlNpZ25hbGxpbmdTZXJ2ZXJVcmwpXG4gICAgICAgICAgICA/IHNldHRpbmdzW1RleHRQYXJhbWV0ZXJzLlNpZ25hbGxpbmdTZXJ2ZXJVcmxdXG4gICAgICAgICAgICA6IChsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOi8vJyA6ICd3czovLycpICtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgK1xuICAgICAgICAgICAgICAgIC8vIGZvciByZWFkYWJpbGl0eSwgd2Ugb21pdCB0aGUgcG9ydCBpZiBpdCdzIDgwXG4gICAgICAgICAgICAgICAgKHdpbmRvdy5sb2NhdGlvbi5wb3J0ID09PSAnODAnIHx8IHdpbmRvdy5sb2NhdGlvbi5wb3J0ID09PSAnJ1xuICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgIDogYDoke3dpbmRvdy5sb2NhdGlvbi5wb3J0fWApLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzLnNldChPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQsIG5ldyBTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCwgJ1N0cmVhbWVyIElEJywgJ1RoZSBJRCBvZiB0aGUgc3RyZWFtZXIgdG8gc3RyZWFtLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWRdXG4gICAgICAgICAgICA6ICcnLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZClcbiAgICAgICAgICAgID8gW3NldHRpbmdzW09wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZF1dXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIGNvbnN0IGdldERlZmF1bHRWaWRlb0NvZGVjID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgdmlkZW9Db2RlY3MgPSBCcm93c2VyVXRpbHMuZ2V0U3VwcG9ydGVkVmlkZW9Db2RlY3MoKTtcbiAgICAgICAgICAgIC8vIElmIG9ubHkgb25lIG9wdGlvbiwgdGhlbiBzZWxlY3QgdGhhdC5cbiAgICAgICAgICAgIGlmICh2aWRlb0NvZGVjcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2aWRlb0NvZGVjc1swXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvQ29kZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0Q29kZWMgPSB2aWRlb0NvZGVjc1swXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGVjIG9mIHZpZGVvQ29kZWNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlYy5zdGFydHNXaXRoKCdIMjY0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2RlYztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvZGVjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKCdDb3VsZCBub3QgZmluZCBhbnkgcmVhc29uYWJsZSB2aWRlbyBjb2RlYyB0byBhc3NpZ24gYXMgYSBkZWZhdWx0LicpO1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtYXRjaFNwZWNpZmllZENvZGVjVG9DbG9zZXN0U3VwcG9ydGVkID0gZnVuY3Rpb24gKHNwZWNpZmllZENvZGVjKSB7XG4gICAgICAgICAgICBjb25zdCBicm93c2VyU3VwcG9ydGVkQ29kZWNzID0gQnJvd3NlclV0aWxzLmdldFN1cHBvcnRlZFZpZGVvQ29kZWNzKCk7XG4gICAgICAgICAgICAvLyBDb2RlYyBzdXBwbGllZCBpbiB1cmwgcGFyYW0gaXMgYW4gZXhhY3QgbWF0Y2ggZm9yIHRoZSBicm93c2VyIGNvZGVjLlxuICAgICAgICAgICAgLy8gKGUuZy4gSDI2NCBsZXZlbC1hc3ltbWV0cnktYWxsb3dlZD0xO3BhY2tldGl6YXRpb24tbW9kZT0xO3Byb2ZpbGUtbGV2ZWwtaWQ9NDJlMDFmKVxuICAgICAgICAgICAgaWYgKGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MuaW5jbHVkZXMoc3BlY2lmaWVkQ29kZWMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmllZENvZGVjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIHRoZSBzdGFydCBvZiB3aGF0ZXZlciBpcyBwYXNzZWQgaW50byB0aGUgdXJsIHBhcmFtZXRlciB3aXRoIHdoYXQgdGhlIGJyb3dzZXIgc3VwcG9ydHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgYnJvd3NlckNvZGVjIG9mIGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnJvd3NlckNvZGVjLnN0YXJ0c1dpdGgoc3BlY2lmaWVkQ29kZWMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBicm93c2VyQ29kZWM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZW4ndCBhYmxlIHRvIG1hdGNoLCBqdXN0IHJldHVybiB0aGUgY29kZWMgYXMgZnJvbSB0aGUgVVJMIGFzLWlzLlxuICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmllZENvZGVjO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogRW51bSBQYXJhbWV0ZXJzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnMuc2V0KE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMsIG5ldyBTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMsICdQcmVmZXJyZWQgQ29kZWMnLCAnVGhlIHByZWZlcnJlZCBjb2RlYyB0byBiZSB1c2VkIGR1cmluZyBjb2RlYyBuZWdvdGlhdGlvbicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYylcbiAgICAgICAgICAgID8gbWF0Y2hTcGVjaWZpZWRDb2RlY1RvQ2xvc2VzdFN1cHBvcnRlZChzZXR0aW5nc1tPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjXSlcbiAgICAgICAgICAgIDogZ2V0RGVmYXVsdFZpZGVvQ29kZWMoKSwgQnJvd3NlclV0aWxzLmdldFN1cHBvcnRlZFZpZGVvQ29kZWNzKCksIHVzZVVybFBhcmFtcywgbWF0Y2hTcGVjaWZpZWRDb2RlY1RvQ2xvc2VzdFN1cHBvcnRlZCkpO1xuICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnMuc2V0KE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSwgbmV3IFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5LCAnUHJlZmVycmVkIFF1YWxpdHknLCAnVGhlIHByZWZlcnJlZCBxdWFsaXR5IG9mIHRoZSBzdHJlYW0gKG9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIHRoZSBTRlUpJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkpXG4gICAgICAgICAgICA/IHNldHRpbmdzW09wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eV1cbiAgICAgICAgICAgIDogJ0RlZmF1bHQnLCBbJ0RlZmF1bHQnXSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCb29sZWFuIHBhcmFtZXRlcnNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkF1dG9Db25uZWN0LCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuQXV0b0Nvbm5lY3QsICdBdXRvIGNvbm5lY3QgdG8gc3RyZWFtJywgJ1doZXRoZXIgd2Ugc2hvdWxkIGF0dGVtcHQgdG8gYXV0byBjb25uZWN0IHRvIHRoZSBzaWduYWxsaW5nIHNlcnZlciBvciBzaG93IGEgY2xpY2sgdG8gc3RhcnQgcHJvbXB0LicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuQXV0b0Nvbm5lY3QpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkF1dG9Db25uZWN0XVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkF1dG9QbGF5VmlkZW8sIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5BdXRvUGxheVZpZGVvLCAnQXV0byBwbGF5IHZpZGVvJywgJ1doZW4gdmlkZW8gaXMgcmVhZHkgYXV0b21hdGljYWxseSBzdGFydCBwbGF5aW5nIGl0IGFzIG9wcG9zZWQgdG8gc2hvd2luZyBhIHBsYXkgYnV0dG9uLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuQXV0b1BsYXlWaWRlbylcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuQXV0b1BsYXlWaWRlb11cbiAgICAgICAgICAgIDogdHJ1ZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLlVzZU1pYywgbmV3IFNldHRpbmdGbGFnKEZsYWdzLlVzZU1pYywgJ1VzZSBtaWNyb3Bob25lJywgJ01ha2UgYnJvd3NlciByZXF1ZXN0IG1pY3JvcGhvbmUgYWNjZXNzIGFuZCBvcGVuIGFuIGlucHV0IGF1ZGlvIHRyYWNrLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuVXNlTWljKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5Vc2VNaWNdXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuVXNlTW9kYWxGb3JUZXh0SW5wdXQsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5Vc2VNb2RhbEZvclRleHRJbnB1dCwgJ1VzZSBtb2RhbCBmb3IgdGV4dCBpbnB1dCcsICdXaGVuIGVudGVyaW5nIGlucHV0IGludG8gYSBzdHJlYW1lZCBVRSB0ZXh0IHdpZGdldCwgdXNlIGFuIGlucHV0IG1vZGFsLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuVXNlTW9kYWxGb3JUZXh0SW5wdXQpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLlVzZU1vZGFsRm9yVGV4dElucHV0XVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuVXNlQ2FtZXJhLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuVXNlQ2FtZXJhLCAnVXNlIHdlYmNhbScsICdNYWtlIGJyb3dzZXIgcmVxdWVzdCB3ZWJjYW0gYWNjZXNzIGFuZCBvcGVuIGEgaW5wdXQgdmlkZW8gdHJhY2suJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Vc2VDYW1lcmEpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLlVzZUNhbWVyYV1cbiAgICAgICAgICAgIDogZmFsc2UsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5TdGFydFZpZGVvTXV0ZWQsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5TdGFydFZpZGVvTXV0ZWQsICdTdGFydCB2aWRlbyBtdXRlZCcsICdWaWRlbyB3aWxsIHN0YXJ0IG11dGVkIGlmIHRydWUuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5TdGFydFZpZGVvTXV0ZWQpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLlN0YXJ0VmlkZW9NdXRlZF1cbiAgICAgICAgICAgIDogZmFsc2UsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuU3VwcHJlc3NCcm93c2VyS2V5cywgJ1N1cHByZXNzIGJyb3dzZXIga2V5cycsICdTdXBwcmVzcyBjZXJ0YWluIGJyb3dzZXIga2V5cyB0aGF0IHdlIHVzZSBpbiBVRSwgZm9yIGV4YW1wbGUgRjUgdG8gc2hvdyBzaGFkZXIgY29tcGxleGl0eSBpbnN0ZWFkIG9mIHJlZnJlc2ggdGhlIHBhZ2UuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzXVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuSXNRdWFsaXR5Q29udHJvbGxlciwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXIsICdJcyBxdWFsaXR5IGNvbnRyb2xsZXI/JywgJ1RydWUgaWYgdGhpcyBwZWVyIGNvbnRyb2xzIHN0cmVhbSBxdWFsaXR5Jywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyXVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuRm9yY2VNb25vQXVkaW8sIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5Gb3JjZU1vbm9BdWRpbywgJ0ZvcmNlIG1vbm8gYXVkaW8nLCAnRm9yY2UgYnJvd3NlciB0byByZXF1ZXN0IG1vbm8gYXVkaW8gaW4gdGhlIFNEUCcsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuRm9yY2VNb25vQXVkaW8pXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkZvcmNlTW9ub0F1ZGlvXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkZvcmNlVFVSTiwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkZvcmNlVFVSTiwgJ0ZvcmNlIFRVUk4nLCAnT25seSBnZW5lcmF0ZSBUVVJOL1JlbGF5ZWQgSUNFIGNhbmRpZGF0ZXMuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Gb3JjZVRVUk4pXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkZvcmNlVFVSTl1cbiAgICAgICAgICAgIDogZmFsc2UsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5BRktEZXRlY3Rpb24sIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5BRktEZXRlY3Rpb24sICdBRksgaWYgaWRsZScsICdUaW1lb3V0IHRoZSBleHBlcmllbmNlIGlmIHVzZXIgaXMgQUZLIGZvciBhIHBlcmlvZC4nLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLkFGS0RldGVjdGlvbilcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuQUZLRGV0ZWN0aW9uXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb24sICdNYXRjaCB2aWV3cG9ydCByZXNvbHV0aW9uJywgJ1BpeGVsIFN0cmVhbWluZyB3aWxsIGJlIGluc3RydWN0ZWQgdG8gZHluYW1pY2FsbHkgcmVzaXplIHRoZSB2aWRlbyBzdHJlYW0gdG8gbWF0Y2ggdGhlIHNpemUgb2YgdGhlIHZpZGVvIGVsZW1lbnQuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbilcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb25dXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5Ib3ZlcmluZ01vdXNlTW9kZSwgJ0NvbnRyb2wgU2NoZW1lOiBMb2NrZWQgTW91c2UnLCAnRWl0aGVyIGxvY2tlZCBtb3VzZSwgd2hlcmUgdGhlIHBvaW50ZXIgaXMgY29uc3VtZWQgYnkgdGhlIHZpZGVvIGFuZCBsb2NrZWQgdG8gaXQsIG9yIGhvdmVyaW5nIG1vdXNlLCB3aGVyZSB0aGUgbW91c2UgaXMgbm90IGNvbnN1bWVkLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkhvdmVyaW5nTW91c2VNb2RlXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zLCAoaXNIb3ZlcmluZ01vdXNlLCBzZXR0aW5nKSA9PiB7XG4gICAgICAgICAgICBzZXR0aW5nLmxhYmVsID0gYENvbnRyb2wgU2NoZW1lOiAke2lzSG92ZXJpbmdNb3VzZSA/ICdIb3ZlcmluZycgOiAnTG9ja2VkJ30gTW91c2VgO1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkZha2VNb3VzZVdpdGhUb3VjaGVzLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMsICdGYWtlIG1vdXNlIHdpdGggdG91Y2hlcycsICdBIHNpbmdsZSBmaW5nZXIgdG91Y2ggaXMgY29udmVydGVkIGludG8gYSBtb3VzZSBldmVudC4gVGhpcyBhbGxvd3MgYSBub24tdG91Y2ggYXBwbGljYXRpb24gdG8gYmUgY29udHJvbGxlZCBwYXJ0aWFsbHkgdmlhIGEgdG91Y2ggZGV2aWNlLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkZha2VNb3VzZVdpdGhUb3VjaGVzXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLktleWJvYXJkSW5wdXQsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5LZXlib2FyZElucHV0LCAnS2V5Ym9hcmQgaW5wdXQnLCAnSWYgZW5hYmxlZCwgc2VuZCBrZXlib2FyZCBldmVudHMgdG8gc3RyZWFtZXInLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLktleWJvYXJkSW5wdXQpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLktleWJvYXJkSW5wdXRdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5Nb3VzZUlucHV0LCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuTW91c2VJbnB1dCwgJ01vdXNlIGlucHV0JywgJ0lmIGVuYWJsZWQsIHNlbmQgbW91c2UgZXZlbnRzIHRvIHN0cmVhbWVyJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Nb3VzZUlucHV0KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5Nb3VzZUlucHV0XVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuVG91Y2hJbnB1dCwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLlRvdWNoSW5wdXQsICdUb3VjaCBpbnB1dCcsICdJZiBlbmFibGVkLCBzZW5kIHRvdWNoIGV2ZW50cyB0byBzdHJlYW1lcicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuVG91Y2hJbnB1dClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuVG91Y2hJbnB1dF1cbiAgICAgICAgICAgIDogdHJ1ZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkdhbWVwYWRJbnB1dCwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkdhbWVwYWRJbnB1dCwgJ0dhbWVwYWQgaW5wdXQnLCAnSWYgZW5hYmxlZCwgc2VuZCBnYW1lcGFkIGV2ZW50cyB0byBzdHJlYW1lcicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuR2FtZXBhZElucHV0KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5HYW1lcGFkSW5wdXRdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5YUkNvbnRyb2xsZXJJbnB1dCwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLlhSQ29udHJvbGxlcklucHV0LCAnWFIgY29udHJvbGxlciBpbnB1dCcsICdJZiBlbmFibGVkLCBzZW5kIFhSIGNvbnRyb2xsZXIgZXZlbnRzIHRvIHN0cmVhbWVyJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5YUkNvbnRyb2xsZXJJbnB1dClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuWFJDb250cm9sbGVySW5wdXRdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5XYWl0Rm9yU3RyZWFtZXIsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5XYWl0Rm9yU3RyZWFtZXIsICdXYWl0IGZvciBzdHJlYW1lcicsICdXaWxsIGNvbnRpbnVlIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBmaXJzdCBzdHJlYW1lciBhdmFpbGFibGUuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5XYWl0Rm9yU3RyZWFtZXIpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLldhaXRGb3JTdHJlYW1lcl1cbiAgICAgICAgICAgIDogdHJ1ZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkhpZGVVSSwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkhpZGVVSSwgJ0hpZGUgdGhlIFVJIG92ZXJsYXknLCAnV2lsbCBoaWRlIGFsbCBVSSBvdmVybGF5IGRldGFpbHMnLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLkhpZGVVSSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuSGlkZVVJXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkVuYWJsZUNhcHR1cmVUaW1lRXh0LCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuRW5hYmxlQ2FwdHVyZVRpbWVFeHQsICdFbmFibGUgYWJzLWNhcHR1cmUtdGltZScsICdFbmFibGVzIHRoZSBhYnMtY2FwdHVyZS10aW1lIFJUUCBoZWFkZXIgZXh0ZW5zaW9uJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5FbmFibGVDYXB0dXJlVGltZUV4dClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuRW5hYmxlQ2FwdHVyZVRpbWVFeHRdXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE51bWVyaWMgcGFyYW1ldGVyc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLkFGS1RpbWVvdXRTZWNzLCAnQUZLIHRpbWVvdXQnLCAnVGhlIHRpbWUgKGluIHNlY29uZHMpIGl0IHRha2VzIGZvciB0aGUgYXBwbGljYXRpb24gdG8gdGltZSBvdXQgaWYgQUZLIHRpbWVvdXQgaXMgZW5hYmxlZC4nLCAwIC8qbWluKi8sIG51bGwgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcylcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3NdXG4gICAgICAgICAgICA6IDEyMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5BRktDb3VudGRvd25TZWNzLCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5BRktDb3VudGRvd25TZWNzLCAnQUZLIGNvdW50ZG93bicsICdUaGUgdGltZSAoaW4gc2Vjb25kcykgZm9yIGEgdXNlciB0byByZXNwb25kIGJlZm9yZSB0aGUgc3RyZWFtIGlzIGVuZGVkIGFmdGVyIGFuIEFGSyB0aW1lb3V0LicsIDEwIC8qbWluKi8sIG51bGwgLyptYXgqLywgMTAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UmVjb25uZWN0QXR0ZW1wdHMsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1heFJlY29ubmVjdEF0dGVtcHRzLCAnTWF4IFJlY29ubmVjdHMnLCAnTWF4aW11bSBudW1iZXIgb2YgcmVjb25uZWN0cyB0aGUgYXBwbGljYXRpb24gd2lsbCBhdHRlbXB0IHdoZW4gYSBzdHJlYW1lciBkaXNjb25uZWN0cy4nLCAwIC8qbWluKi8sIDk5OSAvKm1heCovLCBzZXR0aW5ncyAmJlxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cylcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuTWF4UmVjb25uZWN0QXR0ZW1wdHNdXG4gICAgICAgICAgICA6IDMgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWluUVAsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1pblFQLCAnTWluIFFQJywgJ1RoZSBsb3dlciBib3VuZCBmb3IgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKFFQKSBvZiB0aGUgZW5jb2Rlci4gMCA9IEJlc3QgcXVhbGl0eSwgNTEgPSB3b3JzdCBxdWFsaXR5LicsIDAgLyptaW4qLywgNTEgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5NaW5RUClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuTWluUVBdXG4gICAgICAgICAgICA6IDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVAsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1heFFQLCAnTWF4IFFQJywgJ1RoZSB1cHBlciBib3VuZCBmb3IgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKFFQKSBvZiB0aGUgZW5jb2Rlci4gMCA9IEJlc3QgcXVhbGl0eSwgNTEgPSB3b3JzdCBxdWFsaXR5LicsIDAgLyptaW4qLywgNTEgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5NYXhRUClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVBdXG4gICAgICAgICAgICA6IDUxIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHksIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHksICdNaW4gUXVhbGl0eScsICdUaGUgbG93ZXIgYm91bmQgZm9yIHRoZSBxdWFsaXR5IGZhY3RvciBvZiB0aGUgZW5jb2Rlci4gMCA9IFdvcnN0IHF1YWxpdHksIDEwMCA9IEJlc3QgcXVhbGl0eS4nLCAwIC8qbWluKi8sIDEwMCAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHkpXG4gICAgICAgICAgICA/IHNldHRpbmdzW051bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHldXG4gICAgICAgICAgICA6IDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eSwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eSwgJ01heCBRdWFsaXR5JywgJ1RoZSB1cHBlciBib3VuZCBmb3IgdGhlIHF1YWxpdHkgZmFjdG9yIG9mIHRoZSBlbmNvZGVyLiAwID0gV29yc3QgcXVhbGl0eSwgMTAwID0gQmVzdCBxdWFsaXR5LicsIDAgLyptaW4qLywgMTAwIC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eV1cbiAgICAgICAgICAgIDogMTAwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4sIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4sICdNaW4gUXVhbGl0eScsICdUaGUgbG93ZXIgYm91bmQgZm9yIGVuY29kaW5nIHF1YWxpdHkuIDAgPSBXb3JzdCwgMTAwID0gQmVzdC4nLCAwIC8qbWluKi8sIDEwMCAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4pXG4gICAgICAgICAgICA/IHNldHRpbmdzW051bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW5dXG4gICAgICAgICAgICA6IDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCwgJ01heCBRdWFsaXR5JywgJ1RoZSB1cHBlciBib3VuZCBmb3IgZW5jb2RpbmcgcXVhbGl0eS4gMCA9IFdvcnN0LCAxMDAgPSBCZXN0LicsIDAgLyptaW4qLywgMTAwIC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heF1cbiAgICAgICAgICAgIDogMTAwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ0ZQUywgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTLCAnTWF4IEZQUycsICdUaGUgbWF4aW11bSBGUFMgdGhhdCBXZWJSVEMgd2lsbCB0cnkgdG8gdHJhbnNtaXQgZnJhbWVzIGF0LicsIDEgLyptaW4qLywgOTk5IC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFNdXG4gICAgICAgICAgICA6IDYwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUsICdNaW4gQml0cmF0ZSAoa2JwcyknLCAnVGhlIG1pbmltdW0gYml0cmF0ZSB0aGF0IFdlYlJUQyBzaG91bGQgdXNlLicsIDAgLyptaW4qLywgNTAwMDAwIC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZV1cbiAgICAgICAgICAgIDogMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlLCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlLCAnTWF4IEJpdHJhdGUgKGticHMpJywgJ1RoZSBtYXhpbXVtIGJpdHJhdGUgdGhhdCBXZWJSVEMgc2hvdWxkIHVzZS4nLCAwIC8qbWluKi8sIDUwMDAwMCAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpXG4gICAgICAgICAgICA/IHNldHRpbmdzW051bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGVdXG4gICAgICAgICAgICA6IDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuU3RyZWFtZXJBdXRvSm9pbkludGVydmFsLCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwsICdTdHJlYW1lciBBdXRvIEpvaW4gSW50ZXJ2YWwgKG1zKScsICdEZWxheSBiZXR3ZWVuIHJldHJpZXMgd2hlbiB3YWl0aW5nIGZvciBhbiBhdmFpbGFibGUgc3RyZWFtZXIuJywgNTAwIC8qbWluKi8sIDkwMDAwMCAvKm1heCovLCBzZXR0aW5ncyAmJlxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwpXG4gICAgICAgICAgICA/IHNldHRpbmdzW051bWVyaWNQYXJhbWV0ZXJzLlN0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbF1cbiAgICAgICAgICAgIDogMzAwMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuS2VlcGFsaXZlRGVsYXksICdDb25uZWN0aW9uIEtlZXBhbGl2ZSBkZWxheScsICdEZWxheSBiZXR3ZWVuIGtlZXBhbGl2ZSBwaW5ncyB0byB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIuJywgMCAvKm1pbiovLCA5MDAwMDAgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuS2VlcGFsaXZlRGVsYXldXG4gICAgICAgICAgICA6IDMwMDAwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgbnVtZXJpYyBzZXR0aW5nIGlzIHRvZ2dsZWQuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2VkTGlzdGVuZXIgVGhlIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgbnVtZXJpYyB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIF9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKGlkLCBvbkNoYW5nZWRMaXN0ZW5lcikge1xuICAgICAgICBpZiAodGhpcy5udW1lcmljUGFyYW1ldGVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmdldChpZCkuYWRkT25DaGFuZ2VkTGlzdGVuZXIob25DaGFuZ2VkTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9hZGRPbk9wdGlvblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoaWQsIG9uQ2hhbmdlZExpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvblBhcmFtZXRlcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmdldChpZCkuYWRkT25DaGFuZ2VkTGlzdGVuZXIob25DaGFuZ2VkTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG51bWVyaWMgc2V0dGluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBnZXR0aW5nIGEgdmFsdWUgZm9yLlxuICAgICAqIEByZXR1cm5zIFRoZSBudW1lcmljIHZhbHVlIHN0b3JlZCBpbiB0aGUgcGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBpZC5cbiAgICAgKi9cbiAgICBnZXROdW1lcmljU2V0dGluZ1ZhbHVlKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmdldChpZCkubnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBubyBudW1lcmljIHNldHRpbmcgd2l0aCB0aGUgaWQgb2YgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSB0ZXh0IHNldHRpbmcgd2UgYXJlIGludGVyZXN0ZWQgaW4gZ2V0dGluZyBhIHZhbHVlIGZvci5cbiAgICAgKiBAcmV0dXJucyBUaGUgdGV4dCB2YWx1ZSBzdG9yZWQgaW4gdGhlIHBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgaWQuXG4gICAgICovXG4gICAgZ2V0VGV4dFNldHRpbmdWYWx1ZShpZCkge1xuICAgICAgICBpZiAodGhpcy50ZXh0UGFyYW1ldGVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0UGFyYW1ldGVycy5nZXQoaWQpLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBubyBudW1lcmljIHNldHRpbmcgd2l0aCB0aGUgaWQgb2YgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgbnVtYmVyIGluIHRoZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG51bWVyaWMgc2V0dGluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG51bWVyaWMgdmFsdWUgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldE51bWVyaWNTZXR0aW5nKGlkLCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5udW1lcmljUGFyYW1ldGVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmdldChpZCkubnVtYmVyID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIG51bWVyaWMgc2V0dGluZyB3aXRoIHRoZSBpZCBvZiAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgZmxhZyBpcyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGZsYWcuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlTGlzdGVuZXIgVGhlIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBfYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKGlkLCBvbkNoYW5nZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MuZ2V0KGlkKS5vbkNoYW5nZSA9IG9uQ2hhbmdlTGlzdGVuZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSB0ZXh0IGlzIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2VMaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIF9hZGRPblRleHRTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKGlkLCBvbkNoYW5nZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnRleHRQYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dFBhcmFtZXRlcnMuZ2V0KGlkKS5vbkNoYW5nZSA9IG9uQ2hhbmdlTGlzdGVuZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvcHRpb24gd2hpY2ggaGFzIHRoZSBnaXZlbiBpZC5cbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBvcHRpb24uXG4gICAgICogQHJldHVybnMgVGhlIFNldHRpbmdPcHRpb24gb2JqZWN0IG1hdGNoaW5nIGlkXG4gICAgICovXG4gICAgZ2V0U2V0dGluZ09wdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmdldChpZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmxhZyB3aGljaCBoYXMgdGhlIGdpdmVuIGlkLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgdW5pcXVlIGlkIGZvciB0aGUgZmxhZy5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmbGFnIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNGbGFnRW5hYmxlZChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFncy5nZXQoaWQpLmZsYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBmbGFnIHRvIGJlIGVuYWJsZWQvZGlzYWJsZWQuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZmxhZyB0byB0b2dnbGUuXG4gICAgICogQHBhcmFtIGZsYWdFbmFibGVkIFRydWUgaWYgdGhlIGZsYWcgc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgICovXG4gICAgc2V0RmxhZ0VuYWJsZWQoaWQsIGZsYWdFbmFibGVkKSB7XG4gICAgICAgIGlmICghdGhpcy5mbGFncy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgQ2Fubm90IHRvZ2dsZSBmbGFnIGNhbGxlZCAke2lkfSAtIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBDb25maWcuZmxhZ3MgbWFwLmApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mbGFncy5nZXQoaWQpLmZsYWcgPSBmbGFnRW5hYmxlZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHRleHQgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBzZXR0aW5nXG4gICAgICogQHBhcmFtIHNldHRpbmdWYWx1ZSBUaGUgdmFsdWUgdG8gc2V0IGluIHRoZSBzZXR0aW5nLlxuICAgICAqL1xuICAgIHNldFRleHRTZXR0aW5nKGlkLCBzZXR0aW5nVmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRleHRQYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBDYW5ub3Qgc2V0IHRleHQgc2V0dGluZyBjYWxsZWQgJHtpZH0gLSBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ29uZmlnLnRleHRQYXJhbWV0ZXJzIG1hcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGV4dFBhcmFtZXRlcnMuZ2V0KGlkKS50ZXh0ID0gc2V0dGluZ1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgb3B0aW9uIHNldHRpbmcgbGlzdCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHNldHRpbmdcbiAgICAgKiBAcGFyYW0gc2V0dGluZ09wdGlvbnMgVGhlIHZhbHVlcyB0aGUgc2V0dGluZyBjb3VsZCB0YWtlXG4gICAgICovXG4gICAgc2V0T3B0aW9uU2V0dGluZ09wdGlvbnMoaWQsIHNldHRpbmdPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBDYW5ub3Qgc2V0IHRleHQgc2V0dGluZyBjYWxsZWQgJHtpZH0gLSBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ29uZmlnLm9wdGlvblBhcmFtZXRlcnMgbWFwLmApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmdldChpZCkub3B0aW9ucyA9IHNldHRpbmdPcHRpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBvcHRpb24gZW51bSBzZXR0aW5ncyBzZWxlY3RlZCBvcHRpb24uXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgc2V0dGluZ1xuICAgICAqIEBwYXJhbSBzZXR0aW5nT3B0aW9ucyBUaGUgdmFsdWUgdG8gc2VsZWN0IG91dCBvZiBhbGwgdGhlIG9wdGlvbnNcbiAgICAgKi9cbiAgICBzZXRPcHRpb25TZXR0aW5nVmFsdWUoaWQsIHNldHRpbmdWYWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9uUGFyYW1ldGVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgQ2Fubm90IHNldCB0ZXh0IHNldHRpbmcgY2FsbGVkICR7aWR9IC0gaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIENvbmZpZy5lbnVtUGFyYW1ldGVycyBtYXAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25TZXR0aW5nID0gdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmdldChpZCk7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ09wdGlvbnMgPSBvcHRpb25TZXR0aW5nLm9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoIWV4aXN0aW5nT3B0aW9ucy5pbmNsdWRlcyhzZXR0aW5nVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdPcHRpb25zLnB1c2goc2V0dGluZ1ZhbHVlKTtcbiAgICAgICAgICAgICAgICBvcHRpb25TZXR0aW5nLm9wdGlvbnMgPSBleGlzdGluZ09wdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25TZXR0aW5nLnNlbGVjdGVkID0gc2V0dGluZ1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgZm9yIHRoZSBmbGFnLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGZsYWcuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBuZXcgbGFiZWwgdG8gdXNlIGZvciB0aGUgZmxhZy5cbiAgICAgKi9cbiAgICBzZXRGbGFnTGFiZWwoaWQsIGxhYmVsKSB7XG4gICAgICAgIGlmICghdGhpcy5mbGFncy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgQ2Fubm90IHNldCBsYWJlbCBmb3IgZmxhZyBjYWxsZWQgJHtpZH0gLSBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ29uZmlnLmZsYWdzIG1hcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MuZ2V0KGlkKS5sYWJlbCA9IGxhYmVsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIHN1YnNldCBvZiBhbGwgc2V0dGluZ3MgaW4gb25lIGZ1bmN0aW9uIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgQSAocGFydGlhbCkgbGlzdCBvZiBzZXR0aW5ncyB0byBzZXRcbiAgICAgKi9cbiAgICBzZXRTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzZXR0aW5ncykpIHtcbiAgICAgICAgICAgIGlmIChpc0ZsYWdJZChrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGbGFnRW5hYmxlZChrZXksIHNldHRpbmdzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNOdW1lcmljSWQoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TnVtZXJpY1NldHRpbmcoa2V5LCBzZXR0aW5nc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVGV4dElkKGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHRTZXR0aW5nKGtleSwgc2V0dGluZ3Nba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc09wdGlvbklkKGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldE9wdGlvblNldHRpbmdWYWx1ZShrZXksIHNldHRpbmdzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgc2V0dGluZ3NcbiAgICAgKiBAcmV0dXJucyBBbGwgc2V0dGluZyB2YWx1ZXMgYXMgYW4gb2JqZWN0IHdpdGggc2V0dGluZyBpZHMgYXMga2V5c1xuICAgICAqL1xuICAgIGdldFNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmZsYWdzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IHZhbHVlLmZsYWc7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5udW1lcmljUGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZS5udW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy50ZXh0UGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZS50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMub3B0aW9uUGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZS5zZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0dGluZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgRmxhZyBzZXR0aW5ncyBhcyBhbiBhcnJheS5cbiAgICAgKiBAcmV0dXJucyBBbGwgU2V0dGluZ0ZsYWcgb2JqZWN0c1xuICAgICAqL1xuICAgIGdldEZsYWdzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmZsYWdzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBUZXh0IHNldHRpbmdzIGFzIGFuIGFycmF5LlxuICAgICAqIEByZXR1cm5zIEFsbCBTZXR0aW5nVGV4dCBvYmplY3RzXG4gICAgICovXG4gICAgZ2V0VGV4dFNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnRleHRQYXJhbWV0ZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBOdW1iZXIgc2V0dGluZ3MgYXMgYW4gYXJyYXkuXG4gICAgICogQHJldHVybnMgQWxsIFNldHRpbmdOdW1iZXIgb2JqZWN0c1xuICAgICAqL1xuICAgIGdldE51bWVyaWNTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5udW1lcmljUGFyYW1ldGVycy52YWx1ZXMoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgT3B0aW9uIHNldHRpbmdzIGFzIGFuIGFycmF5LlxuICAgICAqIEByZXR1cm5zIEFsbCBTZXR0aW5nT3B0aW9uIG9iamVjdHNcbiAgICAgKi9cbiAgICBnZXRPcHRpb25TZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5vcHRpb25QYXJhbWV0ZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdCBldmVudHMgd2hlbiBzZXR0aW5ncyBjaGFuZ2UuXG4gICAgICogQHBhcmFtIGV2ZW50RW1pdHRlclxuICAgICAqL1xuICAgIF9yZWdpc3Rlck9uQ2hhbmdlRXZlbnRzKGV2ZW50RW1pdHRlcikge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmZsYWdzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgZmxhZyA9IHRoaXMuZmxhZ3MuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoZmxhZykge1xuICAgICAgICAgICAgICAgIGZsYWcub25DaGFuZ2VFbWl0ID0gKG5ld1ZhbHVlKSA9PiBldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogZmxhZy5pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ZsYWcnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogZmxhZ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyID0gdGhpcy5udW1lcmljUGFyYW1ldGVycy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBudW1iZXIub25DaGFuZ2VFbWl0ID0gKG5ld1ZhbHVlKSA9PiBldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVtYmVyLmlkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG51bWJlclxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnRleHRQYXJhbWV0ZXJzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMudGV4dFBhcmFtZXRlcnMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgIHRleHQub25DaGFuZ2VFbWl0ID0gKG5ld1ZhbHVlKSA9PiBldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogdGV4dC5pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGV4dFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm9wdGlvblBhcmFtZXRlcnMua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvblBhcmFtZXRlcnMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uLm9uQ2hhbmdlRW1pdCA9IChuZXdWYWx1ZSkgPT4gZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29wdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvcHRpb25cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBlbnVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW91c2UgYmVpbmcgbG9ja2VkIG9yIGhvdmVyaW5nXG4gKi9cbmV4cG9ydCB2YXIgQ29udHJvbFNjaGVtZVR5cGU7XG4oZnVuY3Rpb24gKENvbnRyb2xTY2hlbWVUeXBlKSB7XG4gICAgQ29udHJvbFNjaGVtZVR5cGVbQ29udHJvbFNjaGVtZVR5cGVbXCJMb2NrZWRNb3VzZVwiXSA9IDBdID0gXCJMb2NrZWRNb3VzZVwiO1xuICAgIENvbnRyb2xTY2hlbWVUeXBlW0NvbnRyb2xTY2hlbWVUeXBlW1wiSG92ZXJpbmdNb3VzZVwiXSA9IDFdID0gXCJIb3ZlcmluZ01vdXNlXCI7XG59KShDb250cm9sU2NoZW1lVHlwZSB8fCAoQ29udHJvbFNjaGVtZVR5cGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29uZmlnLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGEgc2V0dGluZyB0aGF0IGhhcyBhIHRleHQgbGFiZWwgYW5kIGFuIGFyYml0cmFyeSBzZXR0aW5nIHZhbHVlIGl0IHN0b3Jlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBkZWZhdWx0U2V0dGluZ1ZhbHVlLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgLyogRG8gbm90aGluZywgdG8gYmUgb3ZlcnJpZGRlbi4gKi9cbiAgICB9KSB7XG4gICAgICAgIHRoaXMucGFyc2VVUkxQYXJhbXMoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRW1pdCA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIERvIG5vdGhpbmcsIHRvIGJlIG92ZXJyaWRkZW4uICovXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gICAgICAgIHRoaXMudmFsdWUgPSBkZWZhdWx0U2V0dGluZ1ZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBsYWJlbCBzZXR0aW5nIGxhYmVsLlxuICAgICAqL1xuICAgIHNldCBsYWJlbChpbkxhYmVsKSB7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gaW5MYWJlbDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgbGFiZWwgdGV4dCBmb3IgdGhlIHNldHRpbmcuXG4gICAgICovXG4gICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gVGhlIHNldHRpbmcncyB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBzZXR0aW5nJ3Mgc3RvcmVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBpblZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqL1xuICAgIHNldCB2YWx1ZShpblZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gaW5WYWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLl92YWx1ZSwgdGhpcyk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VFbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyc2lzdCB0aGUgc2V0dGluZyB2YWx1ZSBpbiBVUkwuXG4gICAgICovXG4gICAgdXBkYXRlVVJMUGFyYW1zKCkge1xuICAgICAgICBpZiAodGhpcy51c2VVcmxQYXJhbXMpIHtcbiAgICAgICAgICAgIC8vIHNldCB1cmwgcGFyYW1zXG4gICAgICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVTdHJpbmcgPSB0aGlzLmdldFZhbHVlQXNTdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIF92YWx1ZV0gb2YgdXJsUGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSA9PSB0aGlzLmlkLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1zLnNldChuYW1lLCB2YWx1ZVN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIHNldCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2V0KSB7XG4gICAgICAgICAgICAgICAgdXJsUGFyYW1zLnNldCh0aGlzLmlkLCB2YWx1ZVN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCB1cmxQYXJhbXMudG9TdHJpbmcoKSAhPT0gJycgPyBgJHtsb2NhdGlvbi5wYXRobmFtZX0/JHt1cmxQYXJhbXN9YCA6IGAke2xvY2F0aW9uLnBhdGhuYW1lfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyBzdWIgdHlwZXMgdG8gcHJvdmlkZSB0aGVpciB2YWx1ZSBmb3IgdGhlIHVybCBzZWFyY2ggcGFyYW1zLlxuICAgICAqL1xuICAgIGdldFZhbHVlQXNTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcGFyc2VVUkxQYXJhbXMoKSB7XG4gICAgICAgIHRoaXMuX3VybFBhcmFtcyA9IHt9O1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgcGFyYW1zKSB7XG4gICAgICAgICAgICB0aGlzLl91cmxQYXJhbXNbbmFtZS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhc1VSTFBhcmFtKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKSBpbiB0aGlzLl91cmxQYXJhbXM7XG4gICAgfVxuICAgIGdldFVSTFBhcmFtKG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVVJMUGFyYW0obmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cmxQYXJhbXNbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2V0dGluZ0Jhc2UuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IFNldHRpbmdCYXNlIH0gZnJvbSAnLi9TZXR0aW5nQmFzZSc7XG4vKipcbiAqIEEgYm9vbGVhbiBmbGFnIHNldHRpbmcgb2JqZWN0IHdpdGggYSB0ZXh0IGxhYmVsLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ0ZsYWcgZXh0ZW5kcyBTZXR0aW5nQmFzZSB7XG4gICAgY29uc3RydWN0b3IoaWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgZGVmYXVsdEZsYWdWYWx1ZSwgdXNlVXJsUGFyYW1zLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgLyogRG8gbm90aGluZywgdG8gYmUgb3ZlcnJpZGRlbi4gKi9cbiAgICB9KSB7XG4gICAgICAgIHN1cGVyKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHRGbGFnVmFsdWUsIGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgaWYgKCF1c2VVcmxQYXJhbXMgfHwgIXRoaXMuaGFzVVJMUGFyYW0odGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhZyA9IGRlZmF1bHRGbGFnVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXJzZSBmbGFnIGZyb20gdXJsIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIGNvbnN0IHVybFBhcmFtRmxhZyA9IHRoaXMuZ2V0VVJMUGFyYW0odGhpcy5pZCk7XG4gICAgICAgICAgICB0aGlzLmZsYWcgPSB1cmxQYXJhbUZsYWcudG9Mb3dlckNhc2UoKSAhPSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlVXJsUGFyYW1zID0gdXNlVXJsUGFyYW1zO1xuICAgIH1cbiAgICBnZXRWYWx1ZUFzU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFnID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGlzIGZsYWcuXG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLmZsYWcgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFRoZSBzZXR0aW5nJ3MgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0IGZsYWcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc2V0dGluZydzIHN0b3JlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gaW5WYWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgc2V0dGluZy5cbiAgICAgKi9cbiAgICBzZXQgZmxhZyhpblZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBpblZhbHVlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdGbGFnLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBTZXR0aW5nQmFzZSB9IGZyb20gJy4vU2V0dGluZ0Jhc2UnO1xuLyoqXG4gKiBBIG51bWJlciBzZXR0aW5nIG9iamVjdCB3aXRoIGEgdGV4dCBsYWJlbC4gTWluIGFuZCBtYXggbGltaXQgdGhlIHJhbmdlIG9mIGFsbG93ZWQgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ051bWJlciBleHRlbmRzIFNldHRpbmdCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBtaW4sIG1heCwgZGVmYXVsdE51bWJlciwgdXNlVXJsUGFyYW1zLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgLyogRG8gbm90aGluZywgdG8gYmUgb3ZlcnJpZGRlbi4gKi9cbiAgICB9KSB7XG4gICAgICAgIHN1cGVyKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHROdW1iZXIsIGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5fbWluID0gbWluO1xuICAgICAgICB0aGlzLl9tYXggPSBtYXg7XG4gICAgICAgIC8vIGF0dGVtcHQgdG8gcmVhZCB0aGUgbnVtYmVyIGZyb20gdGhlIHVybCBwYXJhbXNcbiAgICAgICAgaWYgKCF1c2VVcmxQYXJhbXMgfHwgIXRoaXMuaGFzVVJMUGFyYW0odGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMubnVtYmVyID0gZGVmYXVsdE51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQodGhpcy5nZXRVUkxQYXJhbSh0aGlzLmlkKSk7XG4gICAgICAgICAgICB0aGlzLm51bWJlciA9IE51bWJlci5pc05hTihwYXJzZWRWYWx1ZSkgPyBkZWZhdWx0TnVtYmVyIDogcGFyc2VkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VVcmxQYXJhbXMgPSB1c2VVcmxQYXJhbXM7XG4gICAgfVxuICAgIGdldFZhbHVlQXNTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlci50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG51bWJlciB2YWx1ZSAod2lsbCBiZSBjbGFtcGVkIHdpdGhpbiByYW5nZSkuXG4gICAgICovXG4gICAgc2V0IG51bWJlcihuZXdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2xhbXAobmV3TnVtYmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIG51bWJlciBzdG9yZWQuXG4gICAgICovXG4gICAgZ2V0IG51bWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsYW1wcyBhIG51bWJlciBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMgKGluY2x1c2l2ZSkuXG4gICAgICogQHBhcmFtIGluTnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHJldHVybnMgVGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqL1xuICAgIGNsYW1wKGluTnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9taW4gPT0gbnVsbCAmJiB0aGlzLl9tYXggPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGluTnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX21pbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5fbWF4LCBpbk51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fbWF4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLl9taW4sIGluTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih0aGlzLl9tYXgsIGluTnVtYmVyKSwgdGhpcy5fbWluKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlXG4gICAgICogQHJldHVybnMgVGhlIG1pbmltdW0gdmFsdWVcbiAgICAgKi9cbiAgICBnZXQgbWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlXG4gICAgICogQHJldHVybnMgVGhlIG1heGltdW0gdmFsdWVcbiAgICAgKi9cbiAgICBnZXQgbWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhlIG51bWJlciBvYmplY3QuXG4gICAgICovXG4gICAgYWRkT25DaGFuZ2VkTGlzdGVuZXIob25DaGFuZ2VkRnVuYykge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2VkRnVuYztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nTnVtYmVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBTZXR0aW5nQmFzZSB9IGZyb20gJy4vU2V0dGluZ0Jhc2UnO1xuLyoqXG4gKiBBbiBPcHRpb24gc2V0dGluZyBvYmplY3Qgd2l0aCBhIHRleHQgbGFiZWwuIEFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbiBhcnJheSBvZiBvcHRpb25zIGFuZCBzZWxlY3Qgb25lIG9mIHRoZW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nT3B0aW9uIGV4dGVuZHMgU2V0dGluZ0Jhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHRUZXh0VmFsdWUsIG9wdGlvbnMsIHVzZVVybFBhcmFtcywgZGVmYXVsdFVybFBhcmFtUmVzb2x2ZXIgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLyogUmV0dXJuIHRoZSBzdHJpbmcgYXMtaXMgYnkgZGVmYXVsdCAqL1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSwgZGVmYXVsdE9uQ2hhbmdlTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIC8qIERvIG5vdGhpbmcsIHRvIGJlIG92ZXJyaWRkZW4uICovXG4gICAgfSkge1xuICAgICAgICBzdXBlcihpZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBkZWZhdWx0VGV4dFZhbHVlLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuX3VybFBhcmFtUmVzb2x2ZXIgPSBkZWZhdWx0VXJsUGFyYW1SZXNvbHZlcjtcbiAgICAgICAgY29uc3Qgc3RyaW5nVG9NYXRjaCA9IHRoaXMuaGFzVVJMUGFyYW0odGhpcy5pZClcbiAgICAgICAgICAgID8gdGhpcy5fdXJsUGFyYW1SZXNvbHZlcih0aGlzLmdldFVSTFBhcmFtKHRoaXMuaWQpKVxuICAgICAgICAgICAgOiBkZWZhdWx0VGV4dFZhbHVlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiBbc3RyaW5nVG9NYXRjaF07XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzdHJpbmdUb01hdGNoO1xuICAgICAgICB0aGlzLnVzZVVybFBhcmFtcyA9IHVzZVVybFBhcmFtcztcbiAgICB9XG4gICAgZ2V0VmFsdWVBc1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNoYW5nZSBsaXN0ZW5lciB0byB0aGUgc2VsZWN0IGVsZW1lbnQuXG4gICAgICovXG4gICAgYWRkT25DaGFuZ2VkTGlzdGVuZXIob25DaGFuZ2VkRnVuYykge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2VkRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgQWxsIGF2YWlsYWJsZSBvcHRpb25zIGFzIGFuIGFycmF5XG4gICAgICovXG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB2YWx1ZXMgQXJyYXkgb2Ygb3B0aW9uc1xuICAgICAqL1xuICAgIHNldCBvcHRpb25zKHZhbHVlcykge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gdmFsdWVzO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgU2VsZWN0ZWQgb3B0aW9uIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgZ2V0IHNlbGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHNlbGVjdGVkIG9wdGlvbiBpZiBpdCBtYXRjaGVzIG9uZSBvZiB0aGUgYXZhaWxhYmxlIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gdmFsdWUgU2VsZWN0ZWQgb3B0aW9uXG4gICAgICovXG4gICAgc2V0IHNlbGVjdGVkKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgb3B0aW9ucyBjb250YWlucyB0aGUgdmFsdWUsIHRoZW4gc2V0IHRoYXQgYXMgc2VsZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgQ291bGQgbm90IHNldCBcIiR7dmFsdWV9XCIgYXMgdGhlIHNlbGVjdGVkIG9wdGlvbiBmb3IgJHt0aGlzLmlkfSBiZWNhdXNlIGl0IHdhc24ndCBvbmUgb2YgdGhlIG9wdGlvbnMuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB1cmwgcGFyYW1ldGVyIHJlc29sdmVyIHRvIGRvIHNvbWUgdHJhbnNmb3JtYXRpb24gdG8gdGhlIHN0cmluZyB2YWx1ZVxuICAgICAqIHRoYXQgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHVybCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSB1cmxQYXJhbSBBIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgZXh0cmFjdGVkIHVybCBwYXJhbWV0ZXIgc3RyaW5nIGZvciB0aGlzIHNldHRpbmcgdG8gc29tZXRoaW5nIGVsc2UuXG4gICAgICovXG4gICAgc2V0IHVybFBhcmFtUmVzb2x2ZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdXJsUGFyYW1SZXNvbHZlciA9IHZhbHVlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdPcHRpb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IFNldHRpbmdCYXNlIH0gZnJvbSAnLi9TZXR0aW5nQmFzZSc7XG4vKipcbiAqIEEgdGV4dCBzZXR0aW5nIG9iamVjdCB3aXRoIGEgdGV4dCBsYWJlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdUZXh0IGV4dGVuZHMgU2V0dGluZ0Jhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHRUZXh0VmFsdWUsIHVzZVVybFBhcmFtcywgZGVmYXVsdE9uQ2hhbmdlTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIC8qIERvIG5vdGhpbmcsIHRvIGJlIG92ZXJyaWRkZW4uICovXG4gICAgfSkge1xuICAgICAgICBzdXBlcihpZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBkZWZhdWx0VGV4dFZhbHVlLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lcik7XG4gICAgICAgIGlmICghdXNlVXJsUGFyYW1zIHx8ICF0aGlzLmhhc1VSTFBhcmFtKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSBkZWZhdWx0VGV4dFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFyc2UgZmxhZyBmcm9tIHVybCBwYXJhbWV0ZXJzXG4gICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLmdldFVSTFBhcmFtKHRoaXMuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlVXJsUGFyYW1zID0gdXNlVXJsUGFyYW1zO1xuICAgIH1cbiAgICBnZXRWYWx1ZUFzU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFRoZSBzZXR0aW5nJ3MgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHNldHRpbmcncyBzdG9yZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIGluVmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNldHRpbmcuXG4gICAgICovXG4gICAgc2V0IHRleHQoaW5WYWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gaW5WYWx1ZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nVGV4dC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuLyoqXG4gKiBIYW5kbGVzIHRoZSBTZW5kaW5nIGFuZCBSZWNlaXZpbmcgb2YgbWVzc2FnZXMgdG8gdGhlIFVFIEluc3RhbmNlIHZpYSB0aGUgRGF0YSBDaGFubmVsXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlzUmVjZWl2aW5nRnJlZXplRnJhbWUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZGF0YWNoYW5uZWwgY29udHJvbGxlciBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IERhdGFDaGFubmVsQ29udHJvbGxlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIGdldERhdGFDaGFubmVsSW5zdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUbyBDcmVhdGUgYW5kIFNldCB1cCBhIERhdGEgQ2hhbm5lbFxuICAgICAqIEBwYXJhbSBwZWVyQ29ubmVjdGlvbiAtIFRoZSBSVEMgUGVlciBDb25uZWN0aW9uXG4gICAgICogQHBhcmFtIGxhYmVsIC0gTGFiZWwgb2YgdGhlIERhdGEgQ2hhbm5lbFxuICAgICAqIEBwYXJhbSBkYXRhY2hhbm5lbE9wdGlvbnMgLSBPcHRpb25hbCBSVEMgRGF0YUNoYW5uZWwgb3B0aW9uc1xuICAgICAqL1xuICAgIGNyZWF0ZURhdGFDaGFubmVsKHBlZXJDb25uZWN0aW9uLCBsYWJlbCwgZGF0YWNoYW5uZWxPcHRpb25zKSB7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24gPSBwZWVyQ29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsT3B0aW9ucyA9IGRhdGFjaGFubmVsT3B0aW9ucztcbiAgICAgICAgaWYgKGRhdGFjaGFubmVsT3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFjaGFubmVsT3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5kYXRhY2hhbm5lbE9wdGlvbnMub3JkZXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbCA9IHRoaXMucGVlckNvbm5lY3Rpb24uY3JlYXRlRGF0YUNoYW5uZWwodGhpcy5sYWJlbCwgdGhpcy5kYXRhY2hhbm5lbE9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNldHVwRGF0YUNoYW5uZWwoKTtcbiAgICB9XG4gICAgc2V0dXBEYXRhQ2hhbm5lbCgpIHtcbiAgICAgICAgLy9XZSBXYW50IGFuIEFycmF5IEJ1ZmZlciBub3QgYSBibG9iXG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWwuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWwub25vcGVuID0gKGV2KSA9PiB0aGlzLmhhbmRsZU9uT3Blbihldik7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWwub25jbG9zZSA9IChldikgPT4gdGhpcy5oYW5kbGVPbkNsb3NlKGV2KTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbC5vbm1lc3NhZ2UgPSAoZXYpID0+IHRoaXMuaGFuZGxlT25NZXNzYWdlKGV2KTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbC5vbmVycm9yID0gKGV2KSA9PiB0aGlzLmhhbmRsZU9uRXJyb3IoZXYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIERhdGEgQ2hhbm5lbCBpcyBvcGVuZWRcbiAgICAgKi9cbiAgICBoYW5kbGVPbk9wZW4oZXYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBMb2dnZXIuSW5mbyhgRGF0YSBDaGFubmVsICgke3RoaXMubGFiZWx9KSBvcGVuZWQuYCk7XG4gICAgICAgIHRoaXMub25PcGVuKChfYSA9IHRoaXMuZGF0YUNoYW5uZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYWJlbCwgZXYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIERhdGEgQ2hhbm5lbCBpcyBjbG9zZWRcbiAgICAgKi9cbiAgICBoYW5kbGVPbkNsb3NlKGV2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgTG9nZ2VyLkluZm8oYERhdGEgQ2hhbm5lbCAoJHt0aGlzLmxhYmVsfSkgY2xvc2VkLmApO1xuICAgICAgICB0aGlzLm9uQ2xvc2UoKF9hID0gdGhpcy5kYXRhQ2hhbm5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhYmVsLCBldik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBNZXNzYWdlIEV2ZW50XG4gICAgICovXG4gICAgaGFuZGxlT25NZXNzYWdlKGV2ZW50KSB7XG4gICAgICAgIC8vIEhpZ2hlciBsb2cgbGV2ZWwgdG8gcHJldmVudCBsb2cgc3BhbSB3aXRoIG1lc3NhZ2VzIHJlY2VpdmVkXG4gICAgICAgIExvZ2dlci5JbmZvKGBEYXRhIENoYW5uZWwgKCR7dGhpcy5sYWJlbH0pIG1lc3NhZ2U6ICR7ZXZlbnR9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBhbiBlcnJvciBpcyB0aHJvd25cbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBFcnJvciBFdmVudFxuICAgICAqL1xuICAgIGhhbmRsZU9uRXJyb3IoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBMb2dnZXIuSW5mbyhgRGF0YSBDaGFubmVsICgke3RoaXMubGFiZWx9KSBlcnJvcjogJHtldmVudH1gKTtcbiAgICAgICAgdGhpcy5vbkVycm9yKChfYSA9IHRoaXMuZGF0YUNoYW5uZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYWJlbCwgZXZlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0byByZWdpc3RlciBvbk9wZW4gaGFuZGxlclxuICAgICAqIEBwYXJhbSBsYWJlbCBEYXRhIGNoYW5uZWwgbGFiZWwgKFwiZGF0YWNoYW5uZWxcIiwgXCJzZW5kLWRhdGFjaGFubmVsXCIsIFwicmVjdi1kYXRhY2hhbm5lbFwiKVxuICAgICAqIEBwYXJhbSBldiBldmVudFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvbk9wZW4obGFiZWwsIGV2KSB7XG4gICAgICAgIC8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgb25DbG9zZSBoYW5kbGVyXG4gICAgICogQHBhcmFtIGxhYmVsIERhdGEgY2hhbm5lbCBsYWJlbCAoXCJkYXRhY2hhbm5lbFwiLCBcInNlbmQtZGF0YWNoYW5uZWxcIiwgXCJyZWN2LWRhdGFjaGFubmVsXCIpXG4gICAgICogQHBhcmFtIGV2IGV2ZW50XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uQ2xvc2UobGFiZWwsIGV2KSB7XG4gICAgICAgIC8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgb25FcnJvciBoYW5kbGVyXG4gICAgICogQHBhcmFtIGxhYmVsIERhdGEgY2hhbm5lbCBsYWJlbCAoXCJkYXRhY2hhbm5lbFwiLCBcInNlbmQtZGF0YWNoYW5uZWxcIiwgXCJyZWN2LWRhdGFjaGFubmVsXCIpXG4gICAgICogQHBhcmFtIGV2IGV2ZW50XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uRXJyb3IobGFiZWwsIGV2KSB7XG4gICAgICAgIC8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhQ2hhbm5lbENvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IERhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZWNvcmQgfSBmcm9tICcuL0RhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXN1bHRzJztcbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Ioc2luaywgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5pbnRlcnZhbEhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zaW5rID0gc2luaztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLnJlY29yZHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc2VxID0gMDtcbiAgICB9XG4gICAgc3RhcnQoY29uZmlnKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnJlY29yZHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5pbnRlcnZhbEhhbmRsZSA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLnN0YXJ0VGltZSA+PSBjb25maWcuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFJlcXVlc3QoY29uZmlnLnJlcXVlc3RTaXplLCBjb25maWcucmVzcG9uc2VTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuYmluZCh0aGlzKSwgTWF0aC5mbG9vcigxMDAwIC8gY29uZmlnLnJwcykpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxIYW5kbGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxIYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbEhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5wcm9kdWNlUmVzdWx0KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb2R1Y2VSZXN1bHQoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFJlY29yZHMgPSBuZXcgTWFwKHRoaXMucmVjb3Jkcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWNvcmRzOiByZXN1bHRSZWNvcmRzLFxuICAgICAgICAgICAgZGF0YUNoYW5uZWxSdHQ6IE1hdGguY2VpbChBcnJheS5mcm9tKHRoaXMucmVjb3Jkcy52YWx1ZXMoKSkucmVkdWNlKChhY2MsIG5leHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgKG5leHQucGxheWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSBuZXh0LnBsYXllclNlbnRUaW1lc3RhbXApO1xuICAgICAgICAgICAgfSwgMCkgLyB0aGlzLnJlY29yZHMuc2l6ZSksXG4gICAgICAgICAgICBwbGF5ZXJUb1N0cmVhbWVyVGltZTogTWF0aC5jZWlsKEFycmF5LmZyb20odGhpcy5yZWNvcmRzLnZhbHVlcygpKS5yZWR1Y2UoKGFjYywgbmV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyAobmV4dC5zdHJlYW1lclJlY2VpdmVkVGltZXN0YW1wIC0gbmV4dC5wbGF5ZXJTZW50VGltZXN0YW1wKTtcbiAgICAgICAgICAgIH0sIDApIC8gdGhpcy5yZWNvcmRzLnNpemUpLFxuICAgICAgICAgICAgc3RyZWFtZXJUb1BsYXllclRpbWU6IE1hdGguY2VpbChBcnJheS5mcm9tKHRoaXMucmVjb3Jkcy52YWx1ZXMoKSkucmVkdWNlKChhY2MsIG5leHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgKG5leHQucGxheWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSBuZXh0LnN0cmVhbWVyU2VudFRpbWVzdGFtcCk7XG4gICAgICAgICAgICB9LCAwKSAvIHRoaXMucmVjb3Jkcy5zaXplKSxcbiAgICAgICAgICAgIGV4cG9ydExhdGVuY3lBc0NTVjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjc3YgPSAnVGltZXN0YW1wO1JUVDtQbGF5ZXJUb1N0cmVhbWVyO1N0cmVhbWVyVG9QbGF5ZXI7XFxuJztcbiAgICAgICAgICAgICAgICByZXN1bHRSZWNvcmRzLmZvckVhY2goKHJlY29yZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjc3YgKz0gcmVjb3JkLnBsYXllclNlbnRUaW1lc3RhbXAgKyAnOyc7XG4gICAgICAgICAgICAgICAgICAgIGNzdiArPSByZWNvcmQucGxheWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSByZWNvcmQucGxheWVyU2VudFRpbWVzdGFtcCArICc7JztcbiAgICAgICAgICAgICAgICAgICAgY3N2ICs9IHJlY29yZC5zdHJlYW1lclJlY2VpdmVkVGltZXN0YW1wIC0gcmVjb3JkLnBsYXllclNlbnRUaW1lc3RhbXAgKyAnOyc7XG4gICAgICAgICAgICAgICAgICAgIGNzdiArPSByZWNvcmQucGxheWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSByZWNvcmQuc3RyZWFtZXJTZW50VGltZXN0YW1wICsgJzsnO1xuICAgICAgICAgICAgICAgICAgICBjc3YgKz0gJ1xcbic7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNzdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgaXNSdW5uaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmludGVydmFsSGFuZGxlO1xuICAgIH1cbiAgICByZWNlaXZlKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcignVW5kZWZpbmVkIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldChyZXNwb25zZS5TZXEpO1xuICAgICAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgICAgICByZWNvcmQudXBkYXRlKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0U2l6ZSwgcmVzcG9uc2VTaXplKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmNyZWF0ZVJlcXVlc3QocmVxdWVzdFNpemUsIHJlc3BvbnNlU2l6ZSk7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IG5ldyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVjb3JkKHJlcXVlc3QpO1xuICAgICAgICB0aGlzLnJlY29yZHMuc2V0KHJlY29yZC5zZXEsIHJlY29yZCk7XG4gICAgICAgIHRoaXMuc2luayhyZXF1ZXN0KTtcbiAgICB9XG4gICAgY3JlYXRlUmVxdWVzdChyZXF1ZXN0U2l6ZSwgcmVzcG9uc2VTaXplKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBTZXE6IHRoaXMuc2VxKyssXG4gICAgICAgICAgICBGaWxsUmVzcG9uc2VTaXplOiByZXNwb25zZVNpemUsXG4gICAgICAgICAgICBGaWxsZXI6IHJlcXVlc3RTaXplID8gJ0EnLnJlcGVhdChyZXF1ZXN0U2l6ZSkgOiAnJ1xuICAgICAgICB9O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgY2xhc3MgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlY29yZCB7XG4gICAgY29uc3RydWN0b3IocmVxdWVzdCkge1xuICAgICAgICB0aGlzLnNlcSA9IHJlcXVlc3QuU2VxO1xuICAgICAgICB0aGlzLnBsYXllclNlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnJlcXVlc3RGaWxsZXJTaXplID0gcmVxdWVzdC5GaWxsZXIgPyByZXF1ZXN0LkZpbGxlci5sZW5ndGggOiAwO1xuICAgIH1cbiAgICB1cGRhdGUocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXJSZWNlaXZlZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuc3RyZWFtZXJSZWNlaXZlZFRpbWVzdGFtcCA9IHJlc3BvbnNlLlJlY2VpdmVkVGltZXN0YW1wO1xuICAgICAgICB0aGlzLnN0cmVhbWVyU2VudFRpbWVzdGFtcCA9IHJlc3BvbnNlLlNlbnRUaW1lc3RhbXA7XG4gICAgICAgIHRoaXMucmVzcG9uc2VGaWxsZXJTaXplID0gcmVzcG9uc2UuRmlsbGVyID8gcmVzcG9uc2UuRmlsbGVyLmxlbmd0aCA6IDA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogQSBjbGFzcyBmb3Igc2VuZGluZyBkYXRhIGNoYW5uZWwgbWVzc2FnZXNcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsU2VuZGVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZGF0YUNoYW5uZWxQcm92aWRlciAtIERhdGEgY2hhbm5lbCBvYmplY3QgdHlwZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGFDaGFubmVsUHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbFByb3ZpZGVyID0gZGF0YUNoYW5uZWxQcm92aWRlcjtcbiAgICB9XG4gICAgY2FuU2VuZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmRhdGFDaGFubmVsUHJvdmlkZXIuZ2V0RGF0YUNoYW5uZWxJbnN0YW5jZSgpLmRhdGFDaGFubmVsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5uZWxQcm92aWRlci5nZXREYXRhQ2hhbm5lbEluc3RhbmNlKCkuZGF0YUNoYW5uZWwucmVhZHlTdGF0ZSA9PSAnb3BlbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIERhdGEgb3ZlciB0aGUgRGF0YSBjaGFubmVsIHRvIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIC0gTWVzc2FnZSBEYXRhIEFycmF5IEJ1ZmZlclxuICAgICAqL1xuICAgIHNlbmREYXRhKGRhdGEpIHtcbiAgICAgICAgLy8gcmVzZXQgdGhlIGFmayBpbmFjdGl2aXR5XG4gICAgICAgIGNvbnN0IGRhdGFDaGFubmVsSW5zdGFuY2UgPSB0aGlzLmRhdGFDaGFubmVsUHJvdmlkZXIuZ2V0RGF0YUNoYW5uZWxJbnN0YW5jZSgpO1xuICAgICAgICBpZiAoZGF0YUNoYW5uZWxJbnN0YW5jZS5kYXRhQ2hhbm5lbC5yZWFkeVN0YXRlID09ICdvcGVuJykge1xuICAgICAgICAgICAgZGF0YUNoYW5uZWxJbnN0YW5jZS5kYXRhQ2hhbm5lbC5zZW5kKGRhdGEpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYE1lc3NhZ2UgU2VudDogJHtuZXcgVWludDhBcnJheShkYXRhKX1gKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRBZmtXYXJuaW5nVGltZXJPbkRhdGFTZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoYE1lc3NhZ2UgRmFpbGVkOiAke25ldyBVaW50OEFycmF5KGRhdGEpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG92ZXJyaWRlIG1ldGhvZCBmb3IgcmVzZXR0aW5nIHRoZSBBZmsgd2FybmluZyB0aW1lciB3aGVuIGRhdGEgaXMgc2VudCBvdmVyIHRoZSBkYXRhIGNoYW5uZWxcbiAgICAgKi9cbiAgICByZXNldEFma1dhcm5pbmdUaW1lck9uRGF0YVNlbmQoKSB7XG4gICAgICAgIC8vIEJhc2UgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURhdGFDaGFubmVsU2VuZGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIExhdGVuY3kgVGVzdCBSZXN1bHRzIERhdGFcbiAqL1xuZXhwb3J0IGNsYXNzIEluaXRpYWxTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuUGl4ZWxTdHJlYW1pbmdTZXR0aW5ncyA9IG5ldyBQaXhlbFN0cmVhbWluZ1NldHRpbmdzKCk7XG4gICAgICAgIHRoaXMuRW5jb2RlclNldHRpbmdzID0gbmV3IEVuY29kZXJTZXR0aW5ncygpO1xuICAgICAgICB0aGlzLldlYlJUQ1NldHRpbmdzID0gbmV3IFdlYlJUQ1NldHRpbmdzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBGUFMgYW5kIE1heEZQUyBzdGF0cyBiZXR3ZWVuIDQuMjcgYW5kIDVcbiAgICAgKi9cbiAgICB1ZUNvbXBhdGlibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLldlYlJUQ1NldHRpbmdzLk1heEZQUyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLldlYlJUQ1NldHRpbmdzLkZQUyA9IHRoaXMuV2ViUlRDU2V0dGluZ3MuTWF4RlBTO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGNsYXNzIGZvciBoYW5kbGluZyBQaXhlbCBTdHJlYW1pbmcgZGV0YWlsc1xuICovXG5leHBvcnQgY2xhc3MgUGl4ZWxTdHJlYW1pbmdTZXR0aW5ncyB7XG59XG4vKipcbiAqIEEgY2xhc3MgZm9yIGhhbmRsaW5nIGVuY29kZXIgc3RhdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEVuY29kZXJTZXR0aW5ncyB7XG59XG4vKipcbiAqIEEgY2xhc3MgZm9yIGhhbmRsaW5nIHdlYiBydGMgc3RhdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJUQ1NldHRpbmdzIHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluaXRpYWxTZXR0aW5ncy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuLyoqXG4gKiBMYXRlbmN5IFRlc3QgUmVzdWx0cyBEYXRhXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXRlbmN5VGVzdFJlc3VsdHMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL0ZpZWxkcyBTZXQgZnJvbSB0aGUgbGF0ZW5jeSBwYXlsb2FkIHJlZ2FyZGxlc3Mgb2YgdmVyc2lvblxuICAgICAgICB0aGlzLlJlY2VpcHRUaW1lTXMgPSBudWxsO1xuICAgICAgICB0aGlzLlRyYW5zbWlzc2lvblRpbWVNcyA9IG51bGw7XG4gICAgICAgIC8vRmllbGRzIFNldCBmcm9tIHRoZSBsYXRlbmN5IHBheWxvYWQgZnJvbSA0LjI3LjJcbiAgICAgICAgdGhpcy5QcmVDYXB0dXJlVGltZU1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5Qb3N0Q2FwdHVyZVRpbWVNcyA9IG51bGw7XG4gICAgICAgIHRoaXMuUHJlRW5jb2RlVGltZU1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5Qb3N0RW5jb2RlVGltZU1zID0gbnVsbDtcbiAgICAgICAgLy9GaWVsZHMgU2V0IGZyb20gdGhlIGxhdGVuY3kgcGF5bG9hZCBmcm9tIDUuMFxuICAgICAgICB0aGlzLkVuY29kZU1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5DYXB0dXJlVG9TZW5kTXMgPSBudWxsO1xuICAgICAgICAvL0ZpZWxkcyBTZXQgd2hlbiBwcm9jZXNzZWRcbiAgICAgICAgdGhpcy50ZXN0U3RhcnRUaW1lTXMgPSAwO1xuICAgICAgICB0aGlzLmJyb3dzZXJSZWNlaXB0VGltZU1zID0gMDtcbiAgICAgICAgLy9GaWVsZHMgc2V0IGZyb20gY2FsY3VsYXRpb25zXG4gICAgICAgIHRoaXMubGF0ZW5jeUV4Y2x1ZGluZ0RlY29kZSA9IDA7XG4gICAgICAgIHRoaXMudGVzdER1cmF0aW9uID0gMDtcbiAgICAgICAgLy91ZUxhdGVuY3k6IG51bWJlciA9IDA7XG4gICAgICAgIHRoaXMubmV0d29ya0xhdGVuY3kgPSAwO1xuICAgICAgICB0aGlzLmJyb3dzZXJTZW5kTGF0ZW5jeSA9IDA7XG4gICAgICAgIHRoaXMuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgPSAwO1xuICAgICAgICB0aGlzLmVuZFRvRW5kTGF0ZW5jeSA9IDA7XG4gICAgICAgIC8vdWVQaXhlbFN0cmVhbUxhdGVuY3k6IG51bWJlciA9IDA7XG4gICAgICAgIHRoaXMuZW5jb2RlTGF0ZW5jeSA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIERlbHRhIFRpbWUgTWlsbGlzZWNvbmRzXG4gICAgICogQHBhcmFtIERlbHRhVGltZU1zIC0gRGVsdGEgVGltZSBNaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICBzZXRGcmFtZURpc3BsYXlEZWx0YVRpbWUoRGVsdGFUaW1lTXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5mcmFtZURpc3BsYXlEZWx0YVRpbWVNcyA9IE1hdGgucm91bmQoRGVsdGFUaW1lTXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIGVuY29kZXIgdGltZXMgYW5kIHNldCB0aGVtXG4gICAgICovXG4gICAgcHJvY2Vzc0ZpZWxkcygpIHtcbiAgICAgICAgaWYgKHRoaXMuRW5jb2RlTXMgPT0gbnVsbCAmJiAodGhpcy5QcmVFbmNvZGVUaW1lTXMgIT0gbnVsbCB8fCB0aGlzLlBvc3RFbmNvZGVUaW1lTXMgIT0gbnVsbCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGBTZXR0aW5nIEVuY29kZSBNcyBcXG4gJHt0aGlzLlBvc3RFbmNvZGVUaW1lTXN9IFxcbiAke3RoaXMuUHJlRW5jb2RlVGltZU1zfWApO1xuICAgICAgICAgICAgdGhpcy5FbmNvZGVNcyA9IHRoaXMuUG9zdEVuY29kZVRpbWVNcyAtIHRoaXMuUHJlRW5jb2RlVGltZU1zO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLkNhcHR1cmVUb1NlbmRNcyA9PSBudWxsICYmXG4gICAgICAgICAgICAodGhpcy5QcmVDYXB0dXJlVGltZU1zICE9IG51bGwgfHwgdGhpcy5Qb3N0Q2FwdHVyZVRpbWVNcyAhPSBudWxsKSkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYFNldHRpbmcgQ2FwdHVyZVRvU2VuZE1zIE1zIFxcbiAke3RoaXMuUG9zdENhcHR1cmVUaW1lTXN9IFxcbiAke3RoaXMuUHJlQ2FwdHVyZVRpbWVNc31gKTtcbiAgICAgICAgICAgIHRoaXMuQ2FwdHVyZVRvU2VuZE1zID0gdGhpcy5Qb3N0Q2FwdHVyZVRpbWVNcyAtIHRoaXMuUHJlQ2FwdHVyZVRpbWVNcztcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxhdGVuY3lUZXN0UmVzdWx0cy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBBIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgZnJlZXplIGZyYW1lIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgRnJlZXplRnJhbWUge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGZyZWV6ZSBmcmFtZVxuICAgICAqIEBwYXJhbSByb290RGl2IHRoZSBkaXYgdGhhdCBhIGZyZWV6ZSBmcmFtZSBlbGVtZW50IHdpbGwgYmUgaW5qZWN0ZWQgaW50b1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvb3REaXYpIHtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZUhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWVXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMucm9vdERpdiA9IHJvb3REaXY7XG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgb3ZlcmxheVxuICAgICAgICB0aGlzLnJvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuaWQgPSAnZnJlZXplRnJhbWUnO1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuekluZGV4ID0gJzIwJztcbiAgICAgICAgLy8gY3JlYXRlIHRoZSBpbWFnZSBwbGFjZSBob2xkZXJcbiAgICAgICAgdGhpcy5pbWFnZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgdGhpcy5pbWFnZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAvLyBhcHBlbmQgdGhlIGltYWdlIGludG8gdGhlIHJvb3QgZWxlbWVudCBhbmQgYXBwZW5kIHRoZSBlbGVtZW50IHRvIHRoZSByb290IGRpdlxuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMucm9vdEVsZW1lbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZyZWV6ZSBmcmFtZSBlbGVtZW50IGZvciBzaG93aW5nXG4gICAgICovXG4gICAgc2V0RWxlbWVudEZvclNob3coKSB7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZnJlZXplIGZyYW1lIGVsZW1lbnQgZm9yIGhpZGluZ1xuICAgICAqL1xuICAgIHNldEVsZW1lbnRGb3JIaWRlKCkge1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgZnJlZXplIGZyYW1lcyBpbWFnZSBzb3VyY2VcbiAgICAgKiBAcGFyYW0ganBlZyAtIHRoZSBmcmVlemUgZnJhbWUgaW1hZ2UgYXMgYSBieXRlIGFycmF5IGRhdGFcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZUVsZW1lbnRTb3VyY2UoanBlZykge1xuICAgICAgICBjb25zdCBiYXNlNjQgPSBidG9hKGpwZWcucmVkdWNlKChkYXRhLCBieXRlKSA9PiBkYXRhICsgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSwgJycpKTtcbiAgICAgICAgdGhpcy5pbWFnZUVsZW1lbnQuc3JjID0gJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJyArIGJhc2U2NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkaW1lbnNpb25zIGZvciB0aGUgZnJlZXplIGZyYW1lIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJlc2l6ZSBpdFxuICAgICAqL1xuICAgIHNldERpbWVuc2lvbnNGcm9tRWxlbWVudEFuZFJlc2l6ZSgpIHtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZUhlaWdodCA9IHRoaXMuaW1hZ2VFbGVtZW50Lm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWVXaWR0aCA9IHRoaXMuaW1hZ2VFbGVtZW50Lm5hdHVyYWxXaWR0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzaXplIGEgZnJlZXplIGZyYW1lIGVsZW1lbnRcbiAgICAgKi9cbiAgICByZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmZyZWV6ZUZyYW1lV2lkdGggIT09IDAgJiYgdGhpcy5mcmVlemVGcmFtZUhlaWdodCAhPT0gMCkge1xuICAgICAgICAgICAgbGV0IGRpc3BsYXlXaWR0aCA9IDA7XG4gICAgICAgICAgICBsZXQgZGlzcGxheUhlaWdodCA9IDA7XG4gICAgICAgICAgICBsZXQgZGlzcGxheVRvcCA9IDA7XG4gICAgICAgICAgICBsZXQgZGlzcGxheUxlZnQgPSAwO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50QXNwZWN0UmF0aW8gPSB0aGlzLnJvb3REaXYuY2xpZW50V2lkdGggLyB0aGlzLnJvb3REaXYuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgdmlkZW9Bc3BlY3RSYXRpbyA9IHRoaXMuZnJlZXplRnJhbWVXaWR0aCAvIHRoaXMuZnJlZXplRnJhbWVIZWlnaHQ7XG4gICAgICAgICAgICBpZiAocGFyZW50QXNwZWN0UmF0aW8gPCB2aWRlb0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoID0gdGhpcy5yb290RGl2LmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMucm9vdERpdi5jbGllbnRXaWR0aCAvIHZpZGVvQXNwZWN0UmF0aW8pO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlUb3AgPSBNYXRoLmZsb29yKCh0aGlzLnJvb3REaXYuY2xpZW50SGVpZ2h0IC0gZGlzcGxheUhlaWdodCkgKiAwLjUpO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlMZWZ0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCA9IE1hdGguZmxvb3IodGhpcy5yb290RGl2LmNsaWVudEhlaWdodCAqIHZpZGVvQXNwZWN0UmF0aW8pO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSB0aGlzLnJvb3REaXYuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGRpc3BsYXlUb3AgPSAwO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlMZWZ0ID0gTWF0aC5mbG9vcigodGhpcy5yb290RGl2LmNsaWVudFdpZHRoIC0gZGlzcGxheVdpZHRoKSAqIDAuNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy5yb290RGl2Lm9mZnNldFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5yb290RGl2Lm9mZnNldEhlaWdodCArICdweCc7XG4gICAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLmxlZnQgPSAwICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUudG9wID0gMCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zdHlsZS53aWR0aCA9IGRpc3BsYXlXaWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBkaXNwbGF5SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VFbGVtZW50LnN0eWxlLmxlZnQgPSBkaXNwbGF5TGVmdCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zdHlsZS50b3AgPSBkaXNwbGF5VG9wICsgJ3B4JztcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyZWV6ZUZyYW1lLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBGcmVlemVGcmFtZSB9IGZyb20gJy4vRnJlZXplRnJhbWUnO1xuLyoqXG4gKiBBIGNsYXNzIGZvciBjb250cm9sbGluZyBmcmVlemUgZnJhbWUgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgY2xhc3MgRnJlZXplRnJhbWVDb250cm9sbGVyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBmcmVlemUgZnJhbWUgY29udHJvbGxlclxuICAgICAqIEBwYXJhbSByb290RGl2IC0gdGhlIGRpdiB0aGF0IGEgZnJlZXplIGZyYW1lIGVsZW1lbnQgd2lsbCBiZSBpbmplY3RlZCBpbnRvXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdERpdikge1xuICAgICAgICB0aGlzLnJlY2VpdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgICB0aGlzLmpwZWcgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZURlbGF5ID0gNTA7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWUgPSBuZXcgRnJlZXplRnJhbWUocm9vdERpdik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgdGhlIGZyZWV6ZSBmcmFtZSBpZiBpdCBpcyB2YWxpZFxuICAgICAqL1xuICAgIHNob3dGcmVlemVGcmFtZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlZXplRnJhbWUuc2V0RWxlbWVudEZvclNob3coKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBmcmVlemUgZnJhbWUgYW5kIHNldCB0aGUgdmFsaWRpdHkgdG8gZmFsc2VcbiAgICAgKi9cbiAgICBoaWRlRnJlZXplRnJhbWUoKSB7XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZS5zZXRFbGVtZW50Rm9ySGlkZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGZyZWV6ZSBmcmFtZXMgaW1hZ2Ugc291cmNlIGFuZCBsb2FkIGl0XG4gICAgICogQHBhcmFtIGpwZWcgLSB0aGUgZnJlZXplIGZyYW1lIGltYWdlIGFzIGEgYnl0ZSBhcnJheSBkYXRhXG4gICAgICogQHBhcmFtIG9uTG9hZENhbGxCYWNrIC0gYSBjYWxsIGJhY2sgZm9yIG1hbmFnaW5nIGlmIHRoZSBwbGF5IG92ZXJsYXkgbmVlZHMgdG8gYmUgc2hvd24gb3Igbm90XG4gICAgICovXG4gICAgdXBkYXRlRnJlZXplRnJhbWVBbmRTaG93KGpwZWcsIG9uTG9hZENhbGxCYWNrKSB7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWUudXBkYXRlSW1hZ2VFbGVtZW50U291cmNlKGpwZWcpO1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lLmltYWdlRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lLnNldERpbWVuc2lvbnNGcm9tRWxlbWVudEFuZFJlc2l6ZSgpO1xuICAgICAgICAgICAgb25Mb2FkQ2FsbEJhY2soKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgbmV3IGZyZWV6ZSBmcmFtZSBpbWFnZSBhbmQgdXBkYXRlIGl0XG4gICAgICogQHBhcmFtIHZpZXcgLSB0aGUgZnJlZXplIGZyYW1lIGltYWdlIGFzIGEgYnl0ZSBhcnJheSBkYXRhXG4gICAgICogQHBhcmFtIG9uTG9hZENhbGxCYWNrIC0gYSBjYWxsIGJhY2sgZm9yIG1hbmFnaW5nIGlmIHRoZSBwbGF5IG92ZXJsYXkgbmVlZHMgdG8gYmUgc2hvd24gb3Igbm90XG4gICAgICovXG4gICAgcHJvY2Vzc0ZyZWV6ZUZyYW1lTWVzc2FnZSh2aWV3LCBvbkxvYWRDYWxsQmFjaykge1xuICAgICAgICAvLyBSZXNldCBmcmVlemUgZnJhbWUgaWYgd2UgZ290IGEgZnJlZXplIGZyYW1lIG1lc3NhZ2UgYW5kIHdlIGFyZSBub3QgXCJyZWNlaXZpbmdcIiB5ZXQuXG4gICAgICAgIGlmICghdGhpcy5yZWNlaXZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmpwZWcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXh0cmFjdCB0b3RhbCBzaXplIG9mIGZyZWV6ZSBmcmFtZSAoYWNyb3NzIGFsbCBjaHVua3MpXG4gICAgICAgIHRoaXMuc2l6ZSA9IG5ldyBEYXRhVmlldyh2aWV3LnNsaWNlKDEsIDUpLmJ1ZmZlcikuZ2V0SW50MzIoMCwgdHJ1ZSk7XG4gICAgICAgIC8vIEdldCB0aGUganBlZyBwYXJ0IG9mIHRoZSBwYXlsb2FkXG4gICAgICAgIGNvbnN0IGpwZWdCeXRlcyA9IHZpZXcuc2xpY2UoMSArIDQpO1xuICAgICAgICAvLyBBcHBlbmQgdG8gZXhpc3RpbmcganBlZyB0aGF0IGhvbGRzIHRoZSBmcmVlemUgZnJhbWVcbiAgICAgICAgaWYgKHRoaXMuanBlZykge1xuICAgICAgICAgICAgY29uc3QganBlZyA9IG5ldyBVaW50OEFycmF5KHRoaXMuanBlZy5sZW5ndGggKyBqcGVnQnl0ZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGpwZWcuc2V0KHRoaXMuanBlZywgMCk7XG4gICAgICAgICAgICBqcGVnLnNldChqcGVnQnl0ZXMsIHRoaXMuanBlZy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5qcGVnID0ganBlZztcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBleGlzdGluZyBmcmVlemUgZnJhbWUganBlZywgbWFrZSBvbmVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmpwZWcgPSBqcGVnQnl0ZXM7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmluZyA9IHRydWU7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhgcmVjZWl2ZWQgZmlyc3QgY2h1bmsgb2YgZnJlZXplIGZyYW1lOiAke3RoaXMuanBlZy5sZW5ndGh9LyR7dGhpcy5zaXplfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbmlzaGVkIHJlY2VpdmluZyBmcmVlemUgZnJhbWUsIHdlIGNhbiBzaG93IGl0IG5vd1xuICAgICAgICBpZiAodGhpcy5qcGVnLmxlbmd0aCA9PT0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhgcmVjZWl2ZWQgY29tcGxldGUgZnJlZXplIGZyYW1lICR7dGhpcy5zaXplfWApO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGcmVlemVGcmFtZUFuZFNob3codGhpcy5qcGVnLCBvbkxvYWRDYWxsQmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgcmVjZWl2ZWQgbW9yZSBkYXRhIHRoYW4gdGhlIGZyZWV6ZSBmcmFtZSBwYXlsb2FkIG1lc3NhZ2UgaW5kaWNhdGUgKHRoaXMgaXMgYW4gZXJyb3IpXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuanBlZy5sZW5ndGggPiB0aGlzLnNpemUpIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgcmVjZWl2ZWQgYmlnZ2VyIGZyZWV6ZSBmcmFtZSB0aGFuIGFkdmVydGlzZWQ6ICR7dGhpcy5qcGVnLmxlbmd0aH0vJHt0aGlzLnNpemV9YCk7XG4gICAgICAgICAgICB0aGlzLmpwZWcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnJlZXplRnJhbWVDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBkZWVwQ29weUdhbWVwYWQgfSBmcm9tICcuL0dhbWVwYWRUeXBlcyc7XG4vKipcbiAqIEdhbWVwYWQgbGF5b3V0IGNvZGVzIGVudW1cbiAqL1xuZXhwb3J0IHZhciBHYW1lcGFkTGF5b3V0O1xuKGZ1bmN0aW9uIChHYW1lcGFkTGF5b3V0KSB7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRDbHVzdGVyQm90dG9tQnV0dG9uXCJdID0gMF0gPSBcIlJpZ2h0Q2x1c3RlckJvdHRvbUJ1dHRvblwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlJpZ2h0Q2x1c3RlclJpZ2h0QnV0dG9uXCJdID0gMV0gPSBcIlJpZ2h0Q2x1c3RlclJpZ2h0QnV0dG9uXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRDbHVzdGVyTGVmdEJ1dHRvblwiXSA9IDJdID0gXCJSaWdodENsdXN0ZXJMZWZ0QnV0dG9uXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRDbHVzdGVyVG9wQnV0dG9uXCJdID0gM10gPSBcIlJpZ2h0Q2x1c3RlclRvcEJ1dHRvblwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRTaG91bGRlclwiXSA9IDRdID0gXCJMZWZ0U2hvdWxkZXJcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJSaWdodFNob3VsZGVyXCJdID0gNV0gPSBcIlJpZ2h0U2hvdWxkZXJcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0VHJpZ2dlclwiXSA9IDZdID0gXCJMZWZ0VHJpZ2dlclwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlJpZ2h0VHJpZ2dlclwiXSA9IDddID0gXCJSaWdodFRyaWdnZXJcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJTZWxlY3RPckJhY2tcIl0gPSA4XSA9IFwiU2VsZWN0T3JCYWNrXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiU3RhcnRPckZvcndhcmRcIl0gPSA5XSA9IFwiU3RhcnRPckZvcndhcmRcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0QW5hbG9nUHJlc3NcIl0gPSAxMF0gPSBcIkxlZnRBbmFsb2dQcmVzc1wiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlJpZ2h0QW5hbG9nUHJlc3NcIl0gPSAxMV0gPSBcIlJpZ2h0QW5hbG9nUHJlc3NcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0Q2x1c3RlclRvcEJ1dHRvblwiXSA9IDEyXSA9IFwiTGVmdENsdXN0ZXJUb3BCdXR0b25cIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0Q2x1c3RlckJvdHRvbUJ1dHRvblwiXSA9IDEzXSA9IFwiTGVmdENsdXN0ZXJCb3R0b21CdXR0b25cIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0Q2x1c3RlckxlZnRCdXR0b25cIl0gPSAxNF0gPSBcIkxlZnRDbHVzdGVyTGVmdEJ1dHRvblwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRDbHVzdGVyUmlnaHRCdXR0b25cIl0gPSAxNV0gPSBcIkxlZnRDbHVzdGVyUmlnaHRCdXR0b25cIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJDZW50cmVCdXR0b25cIl0gPSAxNl0gPSBcIkNlbnRyZUJ1dHRvblwiO1xuICAgIC8vIEF4ZXNcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0U3RpY2tIb3Jpem9udGFsXCJdID0gMF0gPSBcIkxlZnRTdGlja0hvcml6b250YWxcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0U3RpY2tWZXJ0aWNhbFwiXSA9IDFdID0gXCJMZWZ0U3RpY2tWZXJ0aWNhbFwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlJpZ2h0U3RpY2tIb3Jpem9udGFsXCJdID0gMl0gPSBcIlJpZ2h0U3RpY2tIb3Jpem9udGFsXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRTdGlja1ZlcnRpY2FsXCJdID0gM10gPSBcIlJpZ2h0U3RpY2tWZXJ0aWNhbFwiO1xufSkoR2FtZXBhZExheW91dCB8fCAoR2FtZXBhZExheW91dCA9IHt9KSk7XG4vKipcbiAqIEhhbmRsZXMgZ2FtZXBhZCBldmVudHMgZnJvbSB0aGUgZG9jdW1lbnQgdG8gc2VuZCB0byB0aGUgc3RyZWFtZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBHYW1lcGFkQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlciA9IHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyO1xuICAgICAgICB0aGlzLm9uR2FtZXBhZENvbm5lY3RlZExpc3RlbmVyID0gdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkdhbWVwYWREaXNjb25uZWN0ZWRMaXN0ZW5lciA9IHRoaXMub25HYW1lcGFkRGlzY29ubmVjdGVkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYmVmb3JlVW5sb2FkTGlzdGVuZXIgPSB0aGlzLm9uQmVmb3JlVW5sb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gKHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLmJpbmQod2luZG93KTtcbiAgICB9XG4gICAgcmVnaXN0ZXIoKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLmJlZm9yZVVubG9hZExpc3RlbmVyKTtcbiAgICAgICAgY29uc3QgYnJvd3NlcldpbmRvdyA9IHdpbmRvdztcbiAgICAgICAgaWYgKCdHYW1lcGFkRXZlbnQnIGluIGJyb3dzZXJXaW5kb3cpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdnYW1lcGFkY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZ2FtZXBhZGRpc2Nvbm5lY3RlZCcsIHRoaXMub25HYW1lcGFkRGlzY29ubmVjdGVkTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCdXZWJLaXRHYW1lcGFkRXZlbnQnIGluIGJyb3dzZXJXaW5kb3cpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRnYW1lcGFkY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0Z2FtZXBhZGRpc2Nvbm5lY3RlZCcsIHRoaXMub25HYW1lcGFkRGlzY29ubmVjdGVkTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSBbXTtcbiAgICAgICAgaWYgKG5hdmlnYXRvci5nZXRHYW1lcGFkcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBnYW1lcGFkIG9mIG5hdmlnYXRvci5nZXRHYW1lcGFkcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdhbWVwYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWQobmV3IEdhbWVwYWRFdmVudCgnZ2FtZXBhZGNvbm5lY3RlZCcsIHsgZ2FtZXBhZCB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdnYW1lcGFkY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdnYW1lcGFkZGlzY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWREaXNjb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRnYW1lcGFkY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRnYW1lcGFkZGlzY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWREaXNjb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbGxlciBvZiB0aGlzLmNvbnRyb2xsZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWREaXNjb25uZWN0ZWQnKShbY29udHJvbGxlci5pZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSBbXTtcbiAgICB9XG4gICAgb25HYW1lcGFkUmVzcG9uc2VSZWNlaXZlZChnYW1lcGFkSWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIHRoaXMuY29udHJvbGxlcnMpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyICYmIGNvbnRyb2xsZXIuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuaWQgPSBnYW1lcGFkSWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25HYW1lcGFkQ29ubmVjdGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGdhbWVwYWQgPSBldmVudC5nYW1lcGFkO1xuICAgICAgICBjb25zdCBuZXdDb250cm9sbGVyID0ge1xuICAgICAgICAgICAgY3VycmVudFN0YXRlOiBkZWVwQ29weUdhbWVwYWQoZ2FtZXBhZCksXG4gICAgICAgICAgICBwcmV2U3RhdGU6IGRlZXBDb3B5R2FtZXBhZChnYW1lcGFkKSxcbiAgICAgICAgICAgIGlkOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyc1tnYW1lcGFkLmluZGV4XSA9IG5ld0NvbnRyb2xsZXI7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy51cGRhdGVTdGF0dXMoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZENvbm5lY3RlZCcpKCk7XG4gICAgfVxuICAgIG9uR2FtZXBhZERpc2Nvbm5lY3RlZChldmVudCkge1xuICAgICAgICBjb25zdCBnYW1lcGFkID0gZXZlbnQuZ2FtZXBhZDtcbiAgICAgICAgY29uc3QgZGVsZXRlZENvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXJzW2dhbWVwYWQuaW5kZXhdO1xuICAgICAgICBkZWxldGUgdGhpcy5jb250cm9sbGVyc1tnYW1lcGFkLmluZGV4XTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IHRoaXMuY29udHJvbGxlcnMuZmlsdGVyKChjb250cm9sbGVyKSA9PiBjb250cm9sbGVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoZGVsZXRlZENvbnRyb2xsZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkRGlzY29ubmVjdGVkJykoW1xuICAgICAgICAgICAgICAgIGRlbGV0ZWRDb250cm9sbGVyLmlkXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FuR2FtZXBhZHMoKSB7XG4gICAgICAgIGNvbnN0IGdhbWVwYWRzID0gbmF2aWdhdG9yLmdldEdhbWVwYWRzXG4gICAgICAgICAgICA/IG5hdmlnYXRvci5nZXRHYW1lcGFkcygpXG4gICAgICAgICAgICA6IG5hdmlnYXRvci53ZWJraXRHZXRHYW1lcGFkc1xuICAgICAgICAgICAgICAgID8gbmF2aWdhdG9yLndlYmtpdEdldEdhbWVwYWRzKClcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhbWVwYWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ2FtZXBhZHNbaV0gJiYgdGhpcy5jb250cm9sbGVyc1tnYW1lcGFkc1tpXS5pbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNbZ2FtZXBhZHNbaV0uaW5kZXhdLmN1cnJlbnRTdGF0ZSA9IGdhbWVwYWRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVN0YXR1cygpIHtcbiAgICAgICAgdGhpcy5zY2FuR2FtZXBhZHMoKTtcbiAgICAgICAgY29uc3QgdG9TdHJlYW1lckhhbmRsZXJzID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnM7XG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBtdWx0aXBsZSBjb250cm9sbGVycyBpbiB0aGUgY2FzZSB0aGUgbXVsdGlwbGUgZ2FtZXBhZHMgYXJlIGNvbm5lY3RlZFxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5jb250cm9sbGVycykge1xuICAgICAgICAgICAgaWYgKCFjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHJlY2VpdmVkIGFuIGlkIChwb3NzaWJsZSBpZiB1c2luZyBhbiBvbGRlciB2ZXJzaW9uIG9mIFVFKSwgcmV0dXJuIHRvIG9yaWdpbmFsIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXJJZCA9IGNvbnRyb2xsZXIuaWQgPT09IHVuZGVmaW5lZCA/IHRoaXMuY29udHJvbGxlcnMuaW5kZXhPZihjb250cm9sbGVyKSA6IGNvbnRyb2xsZXIuaWQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjb250cm9sbGVyLmN1cnJlbnRTdGF0ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbGxlci5jdXJyZW50U3RhdGUuYnV0dG9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRCdXR0b24gPSBjb250cm9sbGVyLmN1cnJlbnRTdGF0ZS5idXR0b25zW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQnV0dG9uID0gY29udHJvbGxlci5wcmV2U3RhdGUuYnV0dG9uc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJ1dHRvbi5wcmVzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IEdhbWVwYWRMYXlvdXQuTGVmdFRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVFcyBsZWZ0IGFuYWxvZyBoYXMgYSBidXR0b24gaW5kZXggb2YgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZEFuYWxvZycpKFtjb250cm9sbGVySWQsIDUsIGN1cnJlbnRCdXR0b24udmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IEdhbWVwYWRMYXlvdXQuUmlnaHRUcmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVRXMgcmlnaHQgYW5hbG9nIGhhcyBhIGJ1dHRvbiBpbmRleCBvZiA2XG4gICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkQW5hbG9nJykoW2NvbnRyb2xsZXJJZCwgNiwgY3VycmVudEJ1dHRvbi52YWx1ZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZEJ1dHRvblByZXNzZWQnKShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b24ucHJlc3NlZCA/IDEgOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghY3VycmVudEJ1dHRvbi5wcmVzc2VkICYmIHByZXZpb3VzQnV0dG9uLnByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBHYW1lcGFkTGF5b3V0LkxlZnRUcmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVRXMgbGVmdCBhbmFsb2cgaGFzIGEgYnV0dG9uIGluZGV4IG9mIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWRBbmFsb2cnKShbY29udHJvbGxlcklkLCA1LCAwXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA9PSBHYW1lcGFkTGF5b3V0LlJpZ2h0VHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUVzIHJpZ2h0IGFuYWxvZyBoYXMgYSBidXR0b24gaW5kZXggb2YgNlxuICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZEFuYWxvZycpKFtjb250cm9sbGVySWQsIDYsIDBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWRCdXR0b25SZWxlYXNlZCcpKFtjb250cm9sbGVySWQsIGksIDBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBnYW1lcGFkIGF4ZXMgKHdlIHdpbGwgaW5jcmVtZW50IGluIGxvdHMgb2YgMiBhcyB0aGVyZSBpcyAyIGF4ZXMgcGVyIHN0aWNrKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50U3RhdGUuYXhlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICAgIC8vIEhvcml6b250YWwgYXhlcyBhcmUgZXZlbiBudW1iZXJlZFxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBwYXJzZUZsb2F0KGN1cnJlbnRTdGF0ZS5heGVzW2ldLnRvRml4ZWQoNCkpO1xuICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsIGF4ZXMgYXJlIG9kZCBudW1iZXJlZFxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9nYW1lcGFkLyNyZW1hcHBpbmcgR2FtZXBhZCBicm93c2VyIHNpZGUgc3RhbmRhcmQgbWFwcGluZyBoYXMgcG9zaXRpdmUgZG93biwgbmVnYXRpdmUgdXAuIFRoaXMgaXMgZG93bnJpZ2h0IGRpc2d1c3RpbmcuIFNvIHdlIGZpeCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gLXBhcnNlRmxvYXQoY3VycmVudFN0YXRlLmF4ZXNbaSArIDFdLnRvRml4ZWQoNCkpO1xuICAgICAgICAgICAgICAgIC8vIFVFJ3MgYW5hbG9nIGF4ZXMgZm9sbG93IHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBicm93c2VycywgYnV0IHN0YXJ0IGF0IGluZGV4IDEgc28gd2Ugd2lsbCBvZmZzZXQgYXMgc3VjaFxuICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWRBbmFsb2cnKShbY29udHJvbGxlcklkLCBpICsgMSwgeF0pOyAvLyBIb3Jpem9udGFsIGF4ZXMsIG9ubHkgb2Zmc2V0IGJ5IDFcbiAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkQW5hbG9nJykoW2NvbnRyb2xsZXJJZCwgaSArIDIsIHldKTsgLy8gVmVydGljYWwgYXhlcywgb2Zmc2V0IGJ5IHR3byAoMSB0byBtYXRjaCBVRXMgYXhlcyBjb252ZW50aW9uIGFuZCB0aGVuIGFub3RoZXIgMSBmb3IgdGhlIHZlcnRpY2FsIGF4ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVySW5kZXggPSB0aGlzLmNvbnRyb2xsZXJzLmluZGV4T2YoY29udHJvbGxlcik7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW2NvbnRyb2xsZXJJbmRleF0ucHJldlN0YXRlID0gZGVlcENvcHlHYW1lcGFkKGN1cnJlbnRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy51cGRhdGVTdGF0dXMoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25CZWZvcmVVbmxvYWQoXykge1xuICAgICAgICAvLyBXaGVuIGEgdXNlciBuYXZpZ2F0ZXMgYXdheSBmcm9tIHRoZSBwYWdlLCB3ZSBuZWVkIHRvIGluZm9ybSBVRSBvZiBhbGwgdGhlIGRpc2Nvbm5lY3RpbmdcbiAgICAgICAgLy8gY29udHJvbGxlcnNcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIHRoaXMuY29udHJvbGxlcnMpIHtcbiAgICAgICAgICAgIGlmICghY29udHJvbGxlciB8fCBjb250cm9sbGVyLmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZERpc2Nvbm5lY3RlZCcpKFtjb250cm9sbGVyLmlkXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYW1lcGFkQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBEZWVwIGNvcGllcyB0aGUgdmFsdWVzIGZyb20gYSBnYW1lcGFkIGJ5IGZpcnN0IGNvbnZlcnRpbmcgaXQgdG8gYSBKU09OIG9iamVjdCBhbmQgdGhlbiBiYWNrIHRvIGEgZ2FtZXBhZFxuICpcbiAqIEBwYXJhbSBnYW1lcGFkIHRoZSBvcmlnaW5hbCBnYW1lcGFkXG4gKiBAcmV0dXJucyBhIG5ldyBnYW1lcGFkIG9iamVjdCwgcG9wdWxhdGVkIHdpdGggdGhlIG9yaWdpbmFsIGdhbWVwYWRzIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcENvcHlHYW1lcGFkKGdhbWVwYWQpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGJ1dHRvbnM6IGdhbWVwYWQuYnV0dG9ucy5tYXAoKGIpID0+IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgcHJlc3NlZDogYi5wcmVzc2VkLFxuICAgICAgICAgICAgdG91Y2hlZDogYi50b3VjaGVkLFxuICAgICAgICAgICAgdmFsdWU6IGIudmFsdWVcbiAgICAgICAgfSkpKSxcbiAgICAgICAgYXhlczogZ2FtZXBhZC5heGVzXG4gICAgfSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2FtZXBhZFR5cGVzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBLZXlib2FyZENvbnRyb2xsZXIgfSBmcm9tICcuL0tleWJvYXJkQ29udHJvbGxlcic7XG5pbXBvcnQgeyBNb3VzZUNvbnRyb2xsZXJMb2NrZWQgfSBmcm9tICcuL01vdXNlQ29udHJvbGxlckxvY2tlZCc7XG5pbXBvcnQgeyBNb3VzZUNvbnRyb2xsZXJIb3ZlcmluZyB9IGZyb20gJy4vTW91c2VDb250cm9sbGVySG92ZXJpbmcnO1xuaW1wb3J0IHsgVG91Y2hDb250cm9sbGVyIH0gZnJvbSAnLi9Ub3VjaENvbnRyb2xsZXInO1xuaW1wb3J0IHsgVG91Y2hDb250cm9sbGVyRmFrZSB9IGZyb20gJy4vVG91Y2hDb250cm9sbGVyRmFrZSc7XG5pbXBvcnQgeyBHYW1lcGFkQ29udHJvbGxlciB9IGZyb20gJy4vR2FtZXBhZENvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ29udHJvbFNjaGVtZVR5cGUgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogQ2xhc3MgZm9yIG1ha2luZyBhbmQgc2V0dGluZyB1cCBpbnB1dCBjbGFzcyB0eXBlc1xuICovXG5leHBvcnQgY2xhc3MgSW5wdXRDbGFzc2VzRmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyIC0gU3RyZWFtIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gdmlkZW9FbGVtZW50UHJvdmlkZXIgLSBWaWRlbyBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gY29vcmRpbmF0ZUNvbnZlcnRlciAtIEEgY29vcmRpbmF0ZUNvbnZlcnRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLCB2aWRlb0VsZW1lbnRQcm92aWRlciwgY29vcmRpbmF0ZUNvbnZlcnRlcikge1xuICAgICAgICB0aGlzLmFjdGl2ZUtleXMgPSBuZXcgQWN0aXZlS2V5cygpO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyID0gdG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXI7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIgPSB2aWRlb0VsZW1lbnRQcm92aWRlcjtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlQ29udmVydGVyID0gY29vcmRpbmF0ZUNvbnZlcnRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGJyb3dzZXIga2V5IGV2ZW50cy5cbiAgICAgKi9cbiAgICByZWdpc3RlcktleUJvYXJkKGNvbmZpZykge1xuICAgICAgICBMb2dnZXIuSW5mbygnUmVnaXN0ZXIgS2V5Ym9hcmQgRXZlbnRzJyk7XG4gICAgICAgIGNvbnN0IGtleWJvYXJkQ29udHJvbGxlciA9IG5ldyBLZXlib2FyZENvbnRyb2xsZXIodGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlciwgY29uZmlnLCB0aGlzLmFjdGl2ZUtleXMpO1xuICAgICAgICBrZXlib2FyZENvbnRyb2xsZXIucmVnaXN0ZXIoKTtcbiAgICAgICAgcmV0dXJuIGtleWJvYXJkQ29udHJvbGxlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogcmVnaXN0ZXIgbW91c2UgZXZlbnRzIGJhc2VkIG9uIGEgY29udHJvbCB0eXBlXG4gICAgICogQHBhcmFtIGNvbnRyb2xTY2hlbWUgLSBpZiB0aGUgbW91c2UgaXMgZWl0aGVyIGhvdmVyaW5nIG9yIGxvY2tlZFxuICAgICAqL1xuICAgIHJlZ2lzdGVyTW91c2UoY29udHJvbFNjaGVtZSkge1xuICAgICAgICBMb2dnZXIuSW5mbygnUmVnaXN0ZXIgTW91c2UgRXZlbnRzJyk7XG4gICAgICAgIGxldCBtb3VzZUNvbnRyb2xsZXI7XG4gICAgICAgIGlmIChjb250cm9sU2NoZW1lID09IENvbnRyb2xTY2hlbWVUeXBlLkhvdmVyaW5nTW91c2UpIHtcbiAgICAgICAgICAgIG1vdXNlQ29udHJvbGxlciA9IG5ldyBNb3VzZUNvbnRyb2xsZXJIb3ZlcmluZyh0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLCB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLCB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIsIHRoaXMuYWN0aXZlS2V5cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtb3VzZUNvbnRyb2xsZXIgPSBuZXcgTW91c2VDb250cm9sbGVyTG9ja2VkKHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIsIHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIsIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlciwgdGhpcy5hY3RpdmVLZXlzKTtcbiAgICAgICAgfVxuICAgICAgICBtb3VzZUNvbnRyb2xsZXIucmVnaXN0ZXIoKTtcbiAgICAgICAgcmV0dXJuIG1vdXNlQ29udHJvbGxlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogcmVnaXN0ZXIgdG91Y2ggZXZlbnRzXG4gICAgICogQHBhcmFtIGZha2VNb3VzZVRvdWNoIC0gdGhlIGZha2VkIG1vdXNlIHRvdWNoIGV2ZW50XG4gICAgICovXG4gICAgcmVnaXN0ZXJUb3VjaChmYWtlTW91c2VUb3VjaCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnUmVnaXN0ZXJpbmcgVG91Y2gnKTtcbiAgICAgICAgbGV0IHRvdWNoQ29udHJvbGxlcjtcbiAgICAgICAgaWYgKGZha2VNb3VzZVRvdWNoKSB7XG4gICAgICAgICAgICB0b3VjaENvbnRyb2xsZXIgPSBuZXcgVG91Y2hDb250cm9sbGVyRmFrZSh0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLCB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLCB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG91Y2hDb250cm9sbGVyID0gbmV3IFRvdWNoQ29udHJvbGxlcih0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLCB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLCB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRvdWNoQ29udHJvbGxlci5yZWdpc3RlcigpO1xuICAgICAgICByZXR1cm4gdG91Y2hDb250cm9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZWdpc3RlcnMgYSBnYW1lcGFkXG4gICAgICovXG4gICAgcmVnaXN0ZXJHYW1lUGFkKCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnUmVnaXN0ZXIgR2FtZSBQYWQnKTtcbiAgICAgICAgY29uc3QgZ2FtZXBhZENvbnRyb2xsZXIgPSBuZXcgR2FtZXBhZENvbnRyb2xsZXIodGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlcik7XG4gICAgICAgIGdhbWVwYWRDb250cm9sbGVyLnJlZ2lzdGVyKCk7XG4gICAgICAgIHJldHVybiBnYW1lcGFkQ29udHJvbGxlcjtcbiAgICB9XG59XG4vKipcbiAqIEEgY2xhc3MgdGhhdCBrZWVwcyB0cmFjayBvZiBjdXJyZW50IGFjdGl2ZSBrZXlzXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3RpdmVLZXlzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVLZXlzID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlS2V5cyA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYXJyYXkgb2YgYWN0aXZlIGtleXNcbiAgICAgKiBAcmV0dXJucyAtIGFuIGFycmF5IG9mIGFjdGl2ZSBrZXlzXG4gICAgICovXG4gICAgZ2V0QWN0aXZlS2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlS2V5cztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnB1dENsYXNzZXNGYWN0b3J5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKlxuICogTmV3IGJyb3dzZXIgQVBJcyBoYXZlIG1vdmVkIGF3YXkgZnJvbSBLZXlib2FyZEV2ZW50LmtleUNvZGUgdG8gS2V5Ym9hcmRFdmVudC5Db2RlLlxuICogRm9yIGRldGFpbHMgc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXlDb2RlI2NvbnN0YW50c19mb3Jfa2V5Y29kZV92YWx1ZVxuICogV2Ugc3RpbGwgdXNlIG9sZCBLZXlib2FyZEV2ZW50LmtleUNvZGUgaW50ZWdlcnMgaW4gdGhlIFVFIEMrKyBzaWRlLCBzbyB3ZSBuZWVkIGEgd2F5IHRvIG1hcCB0aGUgbmV3XG4gKiBzdHJpbmctYmFzZWQgS2V5Ym9hcmRFdmVudC5Db2RlIHRvIHRoZSBvbGQgaW50ZWdlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBDb2RlVG9LZXlDb2RlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgRXNjYXBlOiAyNyxcbiAgICBEaWdpdDA6IDQ4LFxuICAgIERpZ2l0MTogNDksXG4gICAgRGlnaXQyOiA1MCxcbiAgICBEaWdpdDM6IDUxLFxuICAgIERpZ2l0NDogNTIsXG4gICAgRGlnaXQ1OiA1MyxcbiAgICBEaWdpdDY6IDU0LFxuICAgIERpZ2l0NzogNTUsXG4gICAgRGlnaXQ4OiA1NixcbiAgICBEaWdpdDk6IDU3LFxuICAgIE1pbnVzOiAxNzMsXG4gICAgRXF1YWw6IDE4NyxcbiAgICBCYWNrc3BhY2U6IDgsXG4gICAgVGFiOiA5LFxuICAgIEtleVE6IDgxLFxuICAgIEtleVc6IDg3LFxuICAgIEtleUU6IDY5LFxuICAgIEtleVI6IDgyLFxuICAgIEtleVQ6IDg0LFxuICAgIEtleVk6IDg5LFxuICAgIEtleVU6IDg1LFxuICAgIEtleUk6IDczLFxuICAgIEtleU86IDc5LFxuICAgIEtleVA6IDgwLFxuICAgIEJyYWNrZXRMZWZ0OiAyMTksXG4gICAgQnJhY2tldFJpZ2h0OiAyMjEsXG4gICAgRW50ZXI6IDEzLFxuICAgIENvbnRyb2xMZWZ0OiAxNyxcbiAgICBLZXlBOiA2NSxcbiAgICBLZXlTOiA4MyxcbiAgICBLZXlEOiA2OCxcbiAgICBLZXlGOiA3MCxcbiAgICBLZXlHOiA3MSxcbiAgICBLZXlIOiA3MixcbiAgICBLZXlKOiA3NCxcbiAgICBLZXlLOiA3NSxcbiAgICBLZXlMOiA3NixcbiAgICBTZW1pY29sb246IDE4NixcbiAgICBRdW90ZTogMjIyLFxuICAgIEJhY2txdW90ZTogMTkyLFxuICAgIFNoaWZ0TGVmdDogMTYsXG4gICAgQmFja3NsYXNoOiAyMjAsXG4gICAgS2V5WjogOTAsXG4gICAgS2V5WDogODgsXG4gICAgS2V5QzogNjcsXG4gICAgS2V5VjogODYsXG4gICAgS2V5QjogNjYsXG4gICAgS2V5TjogNzgsXG4gICAgS2V5TTogNzcsXG4gICAgQ29tbWE6IDE4OCxcbiAgICBQZXJpb2Q6IDE5MCxcbiAgICBTbGFzaDogMTkxLFxuICAgIFNoaWZ0UmlnaHQ6IDI1MyxcbiAgICBBbHRMZWZ0OiAxOCxcbiAgICBTcGFjZTogMzIsXG4gICAgQ2Fwc0xvY2s6IDIwLFxuICAgIEYxOiAxMTIsXG4gICAgRjI6IDExMyxcbiAgICBGMzogMTE0LFxuICAgIEY0OiAxMTUsXG4gICAgRjU6IDExNixcbiAgICBGNjogMTE3LFxuICAgIEY3OiAxMTgsXG4gICAgRjg6IDExOSxcbiAgICBGOTogMTIwLFxuICAgIEYxMDogMTIxLFxuICAgIEYxMTogMTIyLFxuICAgIEYxMjogMTIzLFxuICAgIFBhdXNlOiAxOSxcbiAgICBTY3JvbGxMb2NrOiAxNDUsXG4gICAgTnVtcGFkRGl2aWRlOiAxMTEsXG4gICAgTnVtcGFkTXVsdGlwbHk6IDEwNixcbiAgICBOdW1wYWRTdWJ0cmFjdDogMTA5LFxuICAgIE51bXBhZEFkZDogMTA3LFxuICAgIE51bXBhZERlY2ltYWw6IDExMCxcbiAgICBOdW1wYWQ5OiAxMDUsXG4gICAgTnVtcGFkODogMTA0LFxuICAgIE51bXBhZDc6IDEwMyxcbiAgICBOdW1wYWQ2OiAxMDIsXG4gICAgTnVtcGFkNTogMTAxLFxuICAgIE51bXBhZDQ6IDEwMCxcbiAgICBOdW1wYWQzOiA5OSxcbiAgICBOdW1wYWQyOiA5OCxcbiAgICBOdW1wYWQxOiA5NyxcbiAgICBOdW1wYWQwOiA5NixcbiAgICBOdW1Mb2NrOiAxNDQsXG4gICAgQ29udHJvbFJpZ2h0OiAyNTQsXG4gICAgQWx0UmlnaHQ6IDI1NSxcbiAgICBIb21lOiAzNixcbiAgICBFbmQ6IDM1LFxuICAgIEFycm93VXA6IDM4LFxuICAgIEFycm93TGVmdDogMzcsXG4gICAgQXJyb3dSaWdodDogMzksXG4gICAgQXJyb3dEb3duOiA0MCxcbiAgICBQYWdlVXA6IDMzLFxuICAgIFBhZ2VEb3duOiAzNCxcbiAgICBJbnNlcnQ6IDQ1LFxuICAgIERlbGV0ZTogNDYsXG4gICAgQ29udGV4dE1lbnU6IDkzXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtleUNvZGVzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBTcGVjaWFsS2V5Q29kZXMgfSBmcm9tICcuL1NwZWNpYWxLZXlDb2Rlcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBGbGFncyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgQ29kZVRvS2V5Q29kZSB9IGZyb20gJy4vS2V5Q29kZXMnO1xuLyoqXG4gKiBIYW5kbGVzIHRoZSBLZXlib2FyZCBJbnB1dHMgZm9yIHRoZSBkb2N1bWVudFxuICovXG5leHBvcnQgY2xhc3MgS2V5Ym9hcmRDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgY29uZmlnLCBhY3RpdmVLZXlzKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIgPSBzdHJlYW1NZXNzYWdlQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuYWN0aXZlS2V5cyA9IGFjdGl2ZUtleXM7XG4gICAgICAgIHRoaXMub25LZXlEb3duTGlzdGVuZXIgPSB0aGlzLmhhbmRsZU9uS2V5RG93bi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uS2V5VXBMaXN0ZW5lciA9IHRoaXMuaGFuZGxlT25LZXlVcC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uS2V5UHJlc3NMaXN0ZW5lciA9IHRoaXMuaGFuZGxlT25LZXlQcmVzcy5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duTGlzdGVuZXIpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25LZXlVcExpc3RlbmVyKTtcbiAgICAgICAgLy9UaGlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYXMgYXQgSnVuIDEzIDIwMjFcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCB0aGlzLm9uS2V5UHJlc3NMaXN0ZW5lcik7XG4gICAgfVxuICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bkxpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uS2V5VXBMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgdGhpcy5vbktleVByZXNzTGlzdGVuZXIpO1xuICAgIH1cbiAgICBoYW5kbGVPbktleURvd24oa2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGtleUNvZGUgPSB0aGlzLmdldEtleWNvZGUoa2V5Ym9hcmRFdmVudCk7XG4gICAgICAgIGlmICgha2V5Q29kZSB8fCBrZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b1N0cmVhbWVySGFuZGxlcnMgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICAgICAgKF9hID0gdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnS2V5RG93bicpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoW3RoaXMuZ2V0S2V5Y29kZShrZXlib2FyZEV2ZW50KSwga2V5Ym9hcmRFdmVudC5yZXBlYXQgPyAxIDogMF0pO1xuICAgICAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5hY3RpdmVLZXlzLmdldEFjdGl2ZUtleXMoKTtcbiAgICAgICAgYWN0aXZlS2V5cy5wdXNoKGtleUNvZGUpO1xuICAgICAgICAvLyBCYWNrc3BhY2UgaXMgbm90IGNvbnNpZGVyZWQgYSBrZXlwcmVzcyBpbiBKYXZhU2NyaXB0IGJ1dCB3ZSBuZWVkIGl0XG4gICAgICAgIC8vIHRvIGJlIHNvIGNoYXJhY3RlcnMgbWF5IGJlIGRlbGV0ZWQgaW4gYSBVRSB0ZXh0IGVudHJ5IGZpZWxkLlxuICAgICAgICAvLyBzaW5jZSBrZXlwcmVzcyBpcyBkZXByZWNhdGVkIHdlIHJlYWxseSBzaG91bGQgYmUgc2VuZGluZyBhbGwga2V5cyB0byBrZXlwcmVzc1xuICAgICAgICAvLyBvciB3ZSBjaGFuZ2UgZXZlcnl0aGluZyB0byBoYW5kbGUgdGhlIGRlcHJlY2F0aW9uIG9mIHRoZXNlIHBhcnRzXG4gICAgICAgIGlmIChrZXlDb2RlID09PSBTcGVjaWFsS2V5Q29kZXMuYmFja1NwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9uS2V5UHJlc3MobmV3IEtleWJvYXJkRXZlbnQoJ2tleXByZXNzJywge1xuICAgICAgICAgICAgICAgIGNoYXJDb2RlOiBTcGVjaWFsS2V5Q29kZXMuYmFja1NwYWNlLFxuICAgICAgICAgICAgICAgIGtleUNvZGU6IFNwZWNpYWxLZXlDb2Rlcy5iYWNrU3BhY2VcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzKSAmJiB0aGlzLmlzS2V5Q29kZUJyb3dzZXJLZXkoa2V5Q29kZSkpIHtcbiAgICAgICAgICAgIGtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVPbktleVVwKGtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBrZXlDb2RlID0gdGhpcy5nZXRLZXljb2RlKGtleWJvYXJkRXZlbnQpO1xuICAgICAgICBpZiAoIWtleUNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b1N0cmVhbWVySGFuZGxlcnMgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICAgICAgKF9hID0gdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnS2V5VXAnKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKFtrZXlDb2RlXSk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlN1cHByZXNzQnJvd3NlcktleXMpICYmIHRoaXMuaXNLZXlDb2RlQnJvd3NlcktleShrZXlDb2RlKSkge1xuICAgICAgICAgICAga2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZU9uS2V5UHJlc3Moa2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGtleUNvZGUgPSB0aGlzLmdldEtleWNvZGUoa2V5Ym9hcmRFdmVudCk7XG4gICAgICAgIGlmICgha2V5Q29kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICAoX2EgPSB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdLZXlQcmVzcycpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoW2tleUNvZGVdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgS2V5Y29kZSBvZiB0aGUgS2V5IHByZXNzZWRcbiAgICAgKiBAcGFyYW0ga2V5Ym9hcmRFdmVudCAtIEtleSBib2FyZCBFdmVudFxuICAgICAqIEByZXR1cm5zIC0gdGhlIGtleSBjb2RlIG9mIHRoZSBLZXlcbiAgICAgKi9cbiAgICBnZXRLZXljb2RlKGtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBrZXlDb2RlIHByb3BlcnR5IGJlY2F1c2UgYnJvd3NlciBBUEkgaXMgZGVwcmVjYXRlZCB0aGVuIHVzZSBLZXlib2FyZEV2ZW50LmNvZGUgaW5zdGVhZC5cbiAgICAgICAgLy8gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXlDb2RlI2NvbnN0YW50c19mb3Jfa2V5Y29kZV92YWx1ZVxuICAgICAgICBpZiAoISgna2V5Q29kZScgaW4ga2V5Ym9hcmRFdmVudCkpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgdHlwZSBhc3NlcnRpb24gaGVyZSBpcyByZXF1aXJlZCBiZWNhdXNlIGlmICdrZXlDb2RlJyBkb2VzbnQgZXhpc3QgaW4ga2V5Ym9hcmRFdmVudCB0aGVuXG4gICAgICAgICAgICAvLyBpdCBjYW5ub3QgYmUgYSBLZXlib2FyZEV2ZW50IGFuZCBzbyBpdCBnZXRzIG5hcnJvd2VkIHRvICduZXZlcidcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0ga2V5Ym9hcmRFdmVudDtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgS2V5Ym9hcmRFdmVudC5jb2RlIHN0cmluZyBpbnRvIGludGVnZXItYmFzZWQga2V5IGNvZGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAgICAgICAgICBpZiAoZXZlbnQuY29kZSBpbiBDb2RlVG9LZXlDb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvZGVUb0tleUNvZGVbZXZlbnQuY29kZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgS2V5Ym9hcmQgY29kZSBvZiAke2V2ZW50LmNvZGV9IGlzIG5vdCBzdXBwb3J0ZWQgaW4gb3VyIG1hcHBpbmcsIGlnbm9yaW5nIHRoaXMga2V5LmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIG1hZGUgaXQgaGVyZSBLZXlib2FyZEV2ZW50LmtleUNvZGUgaXMgc3RpbGwgc3VwcG9ydGVkIHNvIHdlIGNhbiBzYWZlbHkgdXNlIGl0LlxuICAgICAgICBpZiAoa2V5Ym9hcmRFdmVudC5rZXlDb2RlID09PSBTcGVjaWFsS2V5Q29kZXMuc2hpZnQgJiYga2V5Ym9hcmRFdmVudC5jb2RlID09PSAnU2hpZnRSaWdodCcpIHtcbiAgICAgICAgICAgIHJldHVybiBTcGVjaWFsS2V5Q29kZXMucmlnaHRTaGlmdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXlib2FyZEV2ZW50LmtleUNvZGUgPT09IFNwZWNpYWxLZXlDb2Rlcy5jb250cm9sICYmXG4gICAgICAgICAgICBrZXlib2FyZEV2ZW50LmNvZGUgPT09ICdDb250cm9sUmlnaHQnKSB7XG4gICAgICAgICAgICByZXR1cm4gU3BlY2lhbEtleUNvZGVzLnJpZ2h0Q29udHJvbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXlib2FyZEV2ZW50LmtleUNvZGUgPT09IFNwZWNpYWxLZXlDb2Rlcy5hbHQgJiYga2V5Ym9hcmRFdmVudC5jb2RlID09PSAnQWx0UmlnaHQnKSB7XG4gICAgICAgICAgICByZXR1cm4gU3BlY2lhbEtleUNvZGVzLnJpZ2h0QWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGtleWJvYXJkRXZlbnQua2V5Q29kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBCcm93c2VyIGtleXMgZG8gbm90IGhhdmUgYSBjaGFyQ29kZSBzbyB3ZSBvbmx5IG5lZWQgdG8gdGVzdCBrZXlDb2RlLlxuICAgICAqIEBwYXJhbSBrZXlDb2RlIC0gdGhlIGJyb3dzZXIga2V5Y29kZSBudW1iZXJcbiAgICAgKi9cbiAgICBpc0tleUNvZGVCcm93c2VyS2V5KGtleUNvZGUpIHtcbiAgICAgICAgLy8gRnVuY3Rpb24ga2V5cyBvciB0YWIga2V5IGFyZSBjb25zaWRlcmVkIFwiYnJvd3NlciBrZXlzXCIgdGhhdCB3ZSBtYXkgd2lzaCB0byBzdXBwcmVzcyBieSBwcmV2ZW50aW5nIHRoZW0gYmVpbmcgcHJvY2VzcyBieSBicm93c2VyLlxuICAgICAgICByZXR1cm4gKGtleUNvZGUgPj0gMTEyICYmIGtleUNvZGUgPD0gMTIzKSB8fCBrZXlDb2RlID09PSA5O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtleWJvYXJkQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBNb3VzZSBCdXR0b24gRGF0YVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Nb3VzZUV2ZW50L2J1dHRvbn1cbiAqL1xuZXhwb3J0IGNsYXNzIE1vdXNlQnV0dG9uIHtcbn1cbk1vdXNlQnV0dG9uLm1haW5CdXR0b24gPSAwOyAvLyBMZWZ0IGJ1dHRvbi5cbk1vdXNlQnV0dG9uLmF1eGlsaWFyeUJ1dHRvbiA9IDE7IC8vIFdoZWVsIGJ1dHRvbi5cbk1vdXNlQnV0dG9uLnNlY29uZGFyeUJ1dHRvbiA9IDI7IC8vIFJpZ2h0IGJ1dHRvbi5cbk1vdXNlQnV0dG9uLmZvdXJ0aEJ1dHRvbiA9IDM7IC8vIEJyb3dzZXIgQmFjayBidXR0b24uXG5Nb3VzZUJ1dHRvbi5maWZ0aEJ1dHRvbiA9IDQ7IC8vIEJyb3dzZXIgRm9yd2FyZCBidXR0b24uXG4vKipcbiAqIE1vdXNlIEJ1dHRvbiBNYXNrIERhdGFcbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTW91c2VFdmVudC9idXR0b25zfVxuICovXG5leHBvcnQgY2xhc3MgTW91c2VCdXR0b25zTWFzayB7XG59XG5Nb3VzZUJ1dHRvbnNNYXNrLnByaW1hcnlCdXR0b24gPSAxOyAvLyBMZWZ0IGJ1dHRvbi5cbk1vdXNlQnV0dG9uc01hc2suc2Vjb25kYXJ5QnV0dG9uID0gMjsgLy8gUmlnaHQgYnV0dG9uLlxuTW91c2VCdXR0b25zTWFzay5hdXhpbGlhcnlCdXR0b24gPSA0OyAvLyBXaGVlbCBidXR0b24uXG5Nb3VzZUJ1dHRvbnNNYXNrLmZvdXJ0aEJ1dHRvbiA9IDg7IC8vIEJyb3dzZXIgQmFjayBidXR0b24uXG5Nb3VzZUJ1dHRvbnNNYXNrLmZpZnRoQnV0dG9uID0gMTY7IC8vIEJyb3dzZXIgRm9yd2FyZCBidXR0b24uXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3VzZUJ1dHRvbnMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IE1vdXNlQnV0dG9uc01hc2ssIE1vdXNlQnV0dG9uIH0gZnJvbSAnLi9Nb3VzZUJ1dHRvbnMnO1xuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgbW91c2UgY29udHJvbGxlcnMuIFNpbmNlIHRoZXJlIGlzIGEgYnVuY2ggb2Ygc2hhcmVkIGJlaGF2aW91ciBiZXR3ZWVuIGxvY2tlZCBhbmRcbiAqIGhvdmVyIG1vdXNlIGNvbnRyb2xsZXJzIHRoaXMgaXMgd2hlcmUgdGhhdCBzaGFyZWQgYmVoYXZpb3VyIGxpdmVzLlxuICovXG5leHBvcnQgY2xhc3MgTW91c2VDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgdmlkZW9QbGF5ZXIsIGNvb3JkaW5hdGVDb252ZXJ0ZXIsIGFjdGl2ZUtleXMpIHtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlciA9IHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIgPSBjb29yZGluYXRlQ29udmVydGVyO1xuICAgICAgICB0aGlzLnZpZGVvUGxheWVyID0gdmlkZW9QbGF5ZXI7XG4gICAgICAgIHRoaXMuYWN0aXZlS2V5cyA9IGFjdGl2ZUtleXM7XG4gICAgICAgIHRoaXMub25FbnRlckxpc3RlbmVyID0gdGhpcy5vbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkxlYXZlTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VMZWF2ZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgdGhpcy5yZWdpc3Rlck1vdXNlRW50ZXJBbmRMZWF2ZUV2ZW50cygpO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyKCkge1xuICAgICAgICB0aGlzLnVucmVnaXN0ZXJNb3VzZUVudGVyQW5kTGVhdmVFdmVudHMoKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJNb3VzZUVudGVyQW5kTGVhdmVFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMudmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIHZpZGVvRWxlbWVudFBhcmVudCA9PT0gbnVsbCB8fCB2aWRlb0VsZW1lbnRQYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5vbkVudGVyTGlzdGVuZXIpO1xuICAgICAgICB2aWRlb0VsZW1lbnRQYXJlbnQgPT09IG51bGwgfHwgdmlkZW9FbGVtZW50UGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMub25MZWF2ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgdW5yZWdpc3Rlck1vdXNlRW50ZXJBbmRMZWF2ZUV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50ID09PSBudWxsIHx8IHZpZGVvRWxlbWVudFBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLm9uRW50ZXJMaXN0ZW5lcik7XG4gICAgICAgIHZpZGVvRWxlbWVudFBhcmVudCA9PT0gbnVsbCB8fCB2aWRlb0VsZW1lbnRQYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5vbkxlYXZlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbk1vdXNlRW50ZXIoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlRW50ZXInKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKCk7XG4gICAgICAgIHRoaXMucHJlc3NNb3VzZUJ1dHRvbnMoZXZlbnQuYnV0dG9ucywgZXZlbnQueCwgZXZlbnQueSk7XG4gICAgfVxuICAgIG9uTW91c2VMZWF2ZShldmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VMZWF2ZScpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoKTtcbiAgICAgICAgdGhpcy5yZWxlYXNlTW91c2VCdXR0b25zKGV2ZW50LmJ1dHRvbnMsIGV2ZW50LngsIGV2ZW50LnkpO1xuICAgIH1cbiAgICByZWxlYXNlTW91c2VCdXR0b25zKGJ1dHRvbnMsIFgsIFkpIHtcbiAgICAgICAgY29uc3QgY29vcmQgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIudHJhbnNsYXRlVW5zaWduZWQoWCwgWSk7XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5wcmltYXJ5QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZVVwKE1vdXNlQnV0dG9uLm1haW5CdXR0b24sIGNvb3JkLngsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5zZWNvbmRhcnlCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlVXAoTW91c2VCdXR0b24uc2Vjb25kYXJ5QnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suYXV4aWxpYXJ5QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZVVwKE1vdXNlQnV0dG9uLmF1eGlsaWFyeUJ1dHRvbiwgY29vcmQueCwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvbnMgJiBNb3VzZUJ1dHRvbnNNYXNrLmZvdXJ0aEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5zZW5kTW91c2VVcChNb3VzZUJ1dHRvbi5mb3VydGhCdXR0b24sIGNvb3JkLngsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5maWZ0aEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5zZW5kTW91c2VVcChNb3VzZUJ1dHRvbi5maWZ0aEJ1dHRvbiwgY29vcmQueCwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJlc3NNb3VzZUJ1dHRvbnMoYnV0dG9ucywgWCwgWSkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChYLCBZKTtcbiAgICAgICAgaWYgKGJ1dHRvbnMgJiBNb3VzZUJ1dHRvbnNNYXNrLnByaW1hcnlCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlRG93bihNb3VzZUJ1dHRvbi5tYWluQnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suc2Vjb25kYXJ5QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZURvd24oTW91c2VCdXR0b24uc2Vjb25kYXJ5QnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suYXV4aWxpYXJ5QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZURvd24oTW91c2VCdXR0b24uYXV4aWxpYXJ5QnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suZm91cnRoQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZURvd24oTW91c2VCdXR0b24uZm91cnRoQnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suZmlmdGhCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlRG93bihNb3VzZUJ1dHRvbi5maWZ0aEJ1dHRvbiwgY29vcmQueCwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VuZE1vdXNlRG93bihidXR0b24sIFgsIFkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlRG93bicpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoW2J1dHRvbiwgWCwgWV0pO1xuICAgIH1cbiAgICBzZW5kTW91c2VVcChidXR0b24sIFgsIFkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChYLCBZKTtcbiAgICAgICAgKF9hID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZVVwJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYShbYnV0dG9uLCBjb29yZC54LCBjb29yZC55XSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW91c2VDb250cm9sbGVyLmpzLm1hcCIsImltcG9ydCB7IE1vdXNlQ29udHJvbGxlciB9IGZyb20gJy4vTW91c2VDb250cm9sbGVyJztcbi8qKlxuICogQSBtb3VzZSBjb250cm9sbGVyIHRoYXQgYWxsb3dzIHRoZSBtb3VzZSB0byBmcmVlbHkgZmxvYXQgb3ZlciB0aGUgdmlkZW8gZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb3VzZUNvbnRyb2xsZXJIb3ZlcmluZyBleHRlbmRzIE1vdXNlQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIsIHZpZGVvUGxheWVyLCBjb29yZGluYXRlQ29udmVydGVyLCBhY3RpdmVLZXlzKSB7XG4gICAgICAgIHN1cGVyKHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCB2aWRlb1BsYXllciwgY29vcmRpbmF0ZUNvbnZlcnRlciwgYWN0aXZlS2V5cyk7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50ID0gdmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VVcC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VEb3duLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZURibENsaWNrTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VEYmxDbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyID0gdGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyID0gdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uQ29udGV4dE1lbnVMaXN0ZW5lciA9IHRoaXMub25Db250ZXh0TWVudS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgc3VwZXIucmVnaXN0ZXIoKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vbk1vdXNlRG93bkxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMub25Db250ZXh0TWVudUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uTW91c2VEYmxDbGlja0xpc3RlbmVyKTtcbiAgICB9XG4gICAgdW5yZWdpc3RlcigpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vbk1vdXNlRG93bkxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMub25Db250ZXh0TWVudUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uTW91c2VEYmxDbGlja0xpc3RlbmVyKTtcbiAgICAgICAgc3VwZXIudW5yZWdpc3RlcigpO1xuICAgIH1cbiAgICBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZURvd24nKShbZXZlbnQuYnV0dG9uLCBjb29yZC54LCBjb29yZC55XSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uTW91c2VVcChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZVVwJykoW2V2ZW50LmJ1dHRvbiwgY29vcmQueCwgY29vcmQueV0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBvbkNvbnRleHRNZW51KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICAgICAgICBjb25zdCBkZWx0YSA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVTaWduZWQoZXZlbnQubW92ZW1lbnRYLCBldmVudC5tb3ZlbWVudFkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlTW92ZScpKFtcbiAgICAgICAgICAgIGNvb3JkLngsXG4gICAgICAgICAgICBjb29yZC55LFxuICAgICAgICAgICAgZGVsdGEueCxcbiAgICAgICAgICAgIGRlbHRhLnlcbiAgICAgICAgXSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uTW91c2VXaGVlbChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZVdoZWVsJykoW1xuICAgICAgICAgICAgZXZlbnQud2hlZWxEZWx0YSxcbiAgICAgICAgICAgIGNvb3JkLngsXG4gICAgICAgICAgICBjb29yZC55XG4gICAgICAgIF0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBvbk1vdXNlRGJsQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29vcmQgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIudHJhbnNsYXRlVW5zaWduZWQoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VEb3VibGUnKShbZXZlbnQuYnV0dG9uLCBjb29yZC54LCBjb29yZC55XSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW91c2VDb250cm9sbGVySG92ZXJpbmcuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IE1vdXNlQ29udHJvbGxlciB9IGZyb20gJy4vTW91c2VDb250cm9sbGVyJztcbi8qKlxuICogQSBtb3VzZSBjb250cm9sbGVyIHRoYXQgbG9ja3MgdGhlIG1vdXNlIHRvIHRoZSB2aWRlbyBkb2N1bWVudCBhbmQgcHJldmVudHMgaXQgZnJvbSBsZWF2aW5nIHRoZSB3aW5kb3dcbiAqL1xuZXhwb3J0IGNsYXNzIE1vdXNlQ29udHJvbGxlckxvY2tlZCBleHRlbmRzIE1vdXNlQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIsIHZpZGVvUGxheWVyLCBjb29yZGluYXRlQ29udmVydGVyLCBhY3RpdmVLZXlzKSB7XG4gICAgICAgIHN1cGVyKHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCB2aWRlb1BsYXllciwgY29vcmRpbmF0ZUNvbnZlcnRlciwgYWN0aXZlS2V5cyk7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50ID0gdmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMueCA9IHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy55ID0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC8gMjtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIudHJhbnNsYXRlVW5zaWduZWQodGhpcy54LCB0aGlzLnkpO1xuICAgICAgICB0aGlzLm9uUmVxdWVzdExvY2tMaXN0ZW5lciA9IHRoaXMub25SZXF1ZXN0TG9jay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VVcC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VEb3duLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZURibENsaWNrTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VEYmxDbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyID0gdGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyID0gdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgc3VwZXIucmVnaXN0ZXIoKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVxdWVzdFBvaW50ZXJMb2NrID1cbiAgICAgICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlcXVlc3RQb2ludGVyTG9jayB8fCB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5tb3pSZXF1ZXN0UG9pbnRlckxvY2s7XG4gICAgICAgIGRvY3VtZW50LmV4aXRQb2ludGVyTG9jayA9IGRvY3VtZW50LmV4aXRQb2ludGVyTG9jayB8fCBkb2N1bWVudC5tb3pFeGl0UG9pbnRlckxvY2s7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZXF1ZXN0UG9pbnRlckxvY2spIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vblJlcXVlc3RMb2NrTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5vbkxvY2tTdGF0ZUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96cG9pbnRlcmxvY2tjaGFuZ2UnLCB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXBMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5vbk1vdXNlV2hlZWxMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5vbk1vdXNlRGJsQ2xpY2tMaXN0ZW5lcik7XG4gICAgfVxuICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJMb2NrRWxlbWVudCA9IGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCB8fCBkb2N1bWVudC5tb3pQb2ludGVyTG9ja0VsZW1lbnQ7XG4gICAgICAgIGlmIChkb2N1bWVudC5leGl0UG9pbnRlckxvY2sgJiYgcG9pbnRlckxvY2tFbGVtZW50ID09PSB0aGlzLnZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdFBvaW50ZXJMb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uUmVxdWVzdExvY2tMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5vbkxvY2tTdGF0ZUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW96cG9pbnRlcmxvY2tjaGFuZ2UnLCB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXBMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5vbk1vdXNlV2hlZWxMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5vbk1vdXNlRGJsQ2xpY2tMaXN0ZW5lcik7XG4gICAgICAgIHN1cGVyLnVucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgb25SZXF1ZXN0TG9jaygpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVxdWVzdFBvaW50ZXJMb2NrKCk7XG4gICAgfVxuICAgIG9uTG9ja1N0YXRlQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBwb2ludGVyTG9ja0VsZW1lbnQgPSBkb2N1bWVudC5wb2ludGVyTG9ja0VsZW1lbnQgfHwgZG9jdW1lbnQubW96UG9pbnRlckxvY2tFbGVtZW50O1xuICAgICAgICBpZiAocG9pbnRlckxvY2tFbGVtZW50ID09PSB0aGlzLnZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1BvaW50ZXIgbG9ja2VkJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1RoZSBwb2ludGVyIGxvY2sgc3RhdHVzIGlzIG5vdyB1bmxvY2tlZCcpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIC8vIElmIG1vdXNlIGxvc2VzIGZvY3VzLCBzZW5kIGEga2V5IHVwIGZvciBhbGwgb2YgdGhlIGN1cnJlbnRseSBoZWxkLWRvd24ga2V5c1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYXMgd2hlbiB0aGUgbW91c2UgbG9zZXMgZm9jdXMsIHRoZSB3aW5kb3dzIHN0b3BzIGxpc3RlbmluZyBmb3IgZXZlbnRzIGFuZCBhcyBzdWNoXG4gICAgICAgICAgICAvLyB0aGUga2V5dXAgbGlzdGVuZXIgd29uJ3QgZ2V0IGZpcmVkXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5hY3RpdmVLZXlzLmdldEFjdGl2ZUtleXMoKTtcbiAgICAgICAgICAgIGFjdGl2ZUtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdLZXlVcCcpKFtrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VEb3duJykoW1xuICAgICAgICAgICAgZXZlbnQuYnV0dG9uLFxuICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBzdG9yZSB2YWx1ZSBvZiB0aGlzLmNvb3JkIGFzIG9wcG9zZWQgdG8gdGhlIG1vdXNlRXZlbnQueC95IGFzIHRoZSBtb3VzZUV2ZW50IGxvY2F0aW9uXG4gICAgICAgICAgICAvLyB1c2VzIHRoZSBzeXN0ZW0gY3Vyc29yIGxvY2F0aW9uIHdoaWNoIGhhc24ndCBtb3ZlZFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueCxcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZENvb3JkLnlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIG9uTW91c2VVcChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlVXAnKShbXG4gICAgICAgICAgICBldmVudC5idXR0b24sXG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHN0b3JlIHZhbHVlIG9mIHRoaXMuY29vcmQgYXMgb3Bwb3NlZCB0byB0aGUgbW91c2VFdmVudC54L3kgYXMgdGhlIG1vdXNlRXZlbnQgbG9jYXRpb25cbiAgICAgICAgICAgIC8vIHVzZXMgdGhlIHN5c3RlbSBjdXJzb3IgbG9jYXRpb24gd2hpY2ggaGFzbid0IG1vdmVkXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC54LFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3R5bGVXaWR0aCA9IHRoaXMudmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCkuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IHN0eWxlSGVpZ2h0ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKS5jbGllbnRIZWlnaHQ7XG4gICAgICAgIHRoaXMueCArPSBldmVudC5tb3ZlbWVudFg7XG4gICAgICAgIHRoaXMueSArPSBldmVudC5tb3ZlbWVudFk7XG4gICAgICAgIHdoaWxlICh0aGlzLnggPiBzdHlsZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLnggLT0gc3R5bGVXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy55ID4gc3R5bGVIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMueSAtPSBzdHlsZUhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy54IDwgMCkge1xuICAgICAgICAgICAgdGhpcy54ICs9IHN0eWxlV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMueSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMueSArPSBzdHlsZUhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh0aGlzLngsIHRoaXMueSk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVNpZ25lZChldmVudC5tb3ZlbWVudFgsIGV2ZW50Lm1vdmVtZW50WSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VNb3ZlJykoW1xuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueCxcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZENvb3JkLnksXG4gICAgICAgICAgICBkZWx0YS54LFxuICAgICAgICAgICAgZGVsdGEueVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgb25Nb3VzZVdoZWVsKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VXaGVlbCcpKFtcbiAgICAgICAgICAgIGV2ZW50LndoZWVsRGVsdGEsXG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHN0b3JlIHZhbHVlIG9mIHRoaXMuY29vcmQgYXMgb3Bwb3NlZCB0byB0aGUgbW91c2VFdmVudC54L3kgYXMgdGhlIG1vdXNlRXZlbnQgbG9jYXRpb25cbiAgICAgICAgICAgIC8vIHVzZXMgdGhlIHN5c3RlbSBjdXJzb3IgbG9jYXRpb24gd2hpY2ggaGFzbid0IG1vdmVkXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC54LFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgb25Nb3VzZURibENsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VEb3VibGUnKShbXG4gICAgICAgICAgICBldmVudC5idXR0b24sXG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHN0b3JlIHZhbHVlIG9mIHRoaXMuY29vcmQgYXMgb3Bwb3NlZCB0byB0aGUgbW91c2VFdmVudC54L3kgYXMgdGhlIG1vdXNlRXZlbnQgbG9jYXRpb25cbiAgICAgICAgICAgIC8vIHVzZXMgdGhlIHN5c3RlbSBjdXJzb3IgbG9jYXRpb24gd2hpY2ggaGFzbid0IG1vdmVkXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC54LFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueVxuICAgICAgICBdKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3VzZUNvbnRyb2xsZXJMb2NrZWQuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBTcGVjaWFsIEtleSBjb2Rlc1xuICogIE11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggSmF2YVNjcmlwdEtleUNvZGVUb0ZLZXkgQysrIGFycmF5LlxuICogVGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgdGhlIHNwZWNpYWwga2V5IGNvZGUgZ2l2ZW4gYmVsb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGVjaWFsS2V5Q29kZXMge1xufVxuU3BlY2lhbEtleUNvZGVzLmJhY2tTcGFjZSA9IDg7XG5TcGVjaWFsS2V5Q29kZXMuc2hpZnQgPSAxNjtcblNwZWNpYWxLZXlDb2Rlcy5jb250cm9sID0gMTc7XG5TcGVjaWFsS2V5Q29kZXMuYWx0ID0gMTg7XG5TcGVjaWFsS2V5Q29kZXMucmlnaHRTaGlmdCA9IDI1MztcblNwZWNpYWxLZXlDb2Rlcy5yaWdodENvbnRyb2wgPSAyNTQ7XG5TcGVjaWFsS2V5Q29kZXMucmlnaHRBbHQgPSAyNTU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGVjaWFsS2V5Q29kZXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogVGhlIGJhc2ljIHRvdWNoIGNvbnRyb2xsZXIgdGhhdCBoYW5kbGVzIHRoZSB0b3VjaCBldmVudHMgb24gdGhlIGRvY3VtZW50LlxuICovXG5leHBvcnQgY2xhc3MgVG91Y2hDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgdmlkZW9QbGF5ZXIsIGNvb3JkaW5hdGVDb252ZXJ0ZXIpIHtcbiAgICAgICAgdGhpcy5maW5nZXJzID0gWzksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDBdO1xuICAgICAgICB0aGlzLmZpbmdlcklkcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5tYXhCeXRlVmFsdWUgPSAyNTU7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIgPSBzdHJlYW1NZXNzYWdlQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy52aWRlb1BsYXllciA9IHZpZGVvUGxheWVyO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIgPSBjb29yZGluYXRlQ29udmVydGVyO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudCA9IHZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpO1xuICAgICAgICB0aGlzLm9uVG91Y2hTdGFydExpc3RlbmVyID0gdGhpcy5vblRvdWNoU3RhcnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblRvdWNoRW5kTGlzdGVuZXIgPSB0aGlzLm9uVG91Y2hFbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyID0gdGhpcy5vblRvdWNoTW92ZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0TGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Ub3VjaEVuZExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgdW5yZWdpc3RlcigpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0TGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Ub3VjaEVuZExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgcmVtZW1iZXJUb3VjaCh0b3VjaCkge1xuICAgICAgICBjb25zdCBmaW5nZXIgPSB0aGlzLmZpbmdlcnMucG9wKCk7XG4gICAgICAgIGlmIChmaW5nZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ2V4aGF1c3RlZCB0b3VjaCBpZGVudGlmaWVycycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluZ2VySWRzLnNldCh0b3VjaC5pZGVudGlmaWVyLCBmaW5nZXIpO1xuICAgIH1cbiAgICBmb3JnZXRUb3VjaCh0b3VjaCkge1xuICAgICAgICB0aGlzLmZpbmdlcnMucHVzaCh0aGlzLmZpbmdlcklkcy5nZXQodG91Y2guaWRlbnRpZmllcikpO1xuICAgICAgICAvLyBTb3J0IGFycmF5IGJhY2sgaW50byBkZXNjZW5kaW5nIG9yZGVyLiBUaGlzIG1lYW5zIGlmIGZpbmdlciAnMScgd2VyZSB0byBsaWZ0IGFmdGVyIGZpbmdlciAnMCcsIHdlIHdvdWxkIGVuc3VyZSB0aGF0IDAgd2lsbCBiZSB0aGUgZmlyc3QgaW5kZXggdG8gcG9wXG4gICAgICAgIHRoaXMuZmluZ2Vycy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYiAtIGE7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZpbmdlcklkcy5kZWxldGUodG91Y2guaWRlbnRpZmllcik7XG4gICAgfVxuICAgIG9uVG91Y2hTdGFydCh0b3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG91Y2hFdmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgdGhpcy5yZW1lbWJlclRvdWNoKHRvdWNoRXZlbnQuY2hhbmdlZFRvdWNoZXNbdF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdFRvdWNoRGF0YSgnVG91Y2hTdGFydCcsIHRvdWNoRXZlbnQuY2hhbmdlZFRvdWNoZXMpO1xuICAgICAgICB0b3VjaEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uVG91Y2hFbmQodG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXRUb3VjaERhdGEoJ1RvdWNoRW5kJywgdG91Y2hFdmVudC5jaGFuZ2VkVG91Y2hlcyk7XG4gICAgICAgIC8vIFJlLWN5Y2xlIHVuaXF1ZSBpZGVudGlmaWVycyBwcmV2aW91c2x5IGFzc2lnbmVkIHRvIGVhY2ggdG91Y2guXG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG91Y2hFdmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgdGhpcy5mb3JnZXRUb3VjaCh0b3VjaEV2ZW50LmNoYW5nZWRUb3VjaGVzW3RdKTtcbiAgICAgICAgfVxuICAgICAgICB0b3VjaEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uVG91Y2hNb3ZlKHRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0VG91Y2hEYXRhKCdUb3VjaE1vdmUnLCB0b3VjaEV2ZW50LnRvdWNoZXMpO1xuICAgICAgICB0b3VjaEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVtaXRUb3VjaERhdGEodHlwZSwgdG91Y2hlcykge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB0b1N0cmVhbWVySGFuZGxlcnMgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b3VjaGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBjb25zdCBudW1Ub3VjaGVzID0gMTsgLy8gdGhlIG51bWJlciBvZiB0b3VjaGVzIHRvIGJlIHNlbnQgdGhpcyBtZXNzYWdlXG4gICAgICAgICAgICBjb25zdCB0b3VjaCA9IHRvdWNoZXNbdF07XG4gICAgICAgICAgICBjb25zdCB4ID0gdG91Y2guY2xpZW50WCAtIG9mZnNldC5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgeSA9IHRvdWNoLmNsaWVudFkgLSBvZmZzZXQudG9wO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYEYke3RoaXMuZmluZ2VySWRzLmdldCh0b3VjaC5pZGVudGlmaWVyKX09KCR7eH0sICR7eX0pYCk7XG4gICAgICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh4LCB5KTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ1RvdWNoU3RhcnQnOlxuICAgICAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdUb3VjaFN0YXJ0JykoW1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtVG91Y2hlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLngsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC55LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5nZXJJZHMuZ2V0KHRvdWNoLmlkZW50aWZpZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhCeXRlVmFsdWUgKiAodG91Y2guZm9yY2UgPiAwID8gdG91Y2guZm9yY2UgOiAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLmluUmFuZ2UgPyAxIDogMFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVG91Y2hFbmQnOlxuICAgICAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdUb3VjaEVuZCcpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bVRvdWNoZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC54LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmQueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZ2VySWRzLmdldCh0b3VjaC5pZGVudGlmaWVyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4Qnl0ZVZhbHVlICogdG91Y2guZm9yY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC5pblJhbmdlID8gMSA6IDBcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1RvdWNoTW92ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1RvdWNoTW92ZScpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bVRvdWNoZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC54LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmQueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZ2VySWRzLmdldCh0b3VjaC5pZGVudGlmaWVyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4Qnl0ZVZhbHVlICogKHRvdWNoLmZvcmNlID4gMCA/IHRvdWNoLmZvcmNlIDogMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC5pblJhbmdlID8gMSA6IDBcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG91Y2hDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBNb3VzZUJ1dHRvbiB9IGZyb20gJy4vTW91c2VCdXR0b25zJztcbi8qKlxuICogQWxsb3dzIGZvciB0aGUgdXNhZ2Ugb2YgZmFrZSB0b3VjaCBldmVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIFRvdWNoQ29udHJvbGxlckZha2Uge1xuICAgIGNvbnN0cnVjdG9yKHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCB2aWRlb1BsYXllciwgY29vcmRpbmF0ZUNvbnZlcnRlcikge1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyID0gc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIgPSB2aWRlb1BsYXllcjtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlQ29udmVydGVyID0gY29vcmRpbmF0ZUNvbnZlcnRlcjtcbiAgICAgICAgdGhpcy5vblRvdWNoU3RhcnRMaXN0ZW5lciA9IHRoaXMub25Ub3VjaFN0YXJ0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Ub3VjaEVuZExpc3RlbmVyID0gdGhpcy5vblRvdWNoRW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Ub3VjaE1vdmVMaXN0ZW5lciA9IHRoaXMub25Ub3VjaE1vdmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG4gICAgcmVnaXN0ZXIoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uVG91Y2hTdGFydExpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uVG91Y2hFbmRMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Ub3VjaE1vdmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uVG91Y2hTdGFydExpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uVG91Y2hFbmRMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Ub3VjaE1vdmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIG9uVG91Y2hTdGFydCh0b3VjaCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkgfHwgdG91Y2gudGFyZ2V0ICE9PSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmFrZVRvdWNoRmluZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0X3RvdWNoID0gdG91Y2guY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICAgICAgICB0aGlzLmZha2VUb3VjaEZpbmdlciA9IHtcbiAgICAgICAgICAgICAgICBpZDogZmlyc3RfdG91Y2guaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICB4OiBmaXJzdF90b3VjaC5jbGllbnRYIC0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0LmxlZnQsXG4gICAgICAgICAgICAgICAgeTogZmlyc3RfdG91Y2guY2xpZW50WSAtIHRoaXMudmlkZW9FbGVtZW50UGFyZW50Q2xpZW50UmVjdC50b3BcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgbW91c2VFdmVudCA9IG5ldyBNb3VzZUV2ZW50KCdtb3VzZWVudGVyJywgZmlyc3RfdG91Y2gpO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50LmRpc3BhdGNoRXZlbnQobW91c2VFdmVudCk7XG4gICAgICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh0aGlzLmZha2VUb3VjaEZpbmdlci54LCB0aGlzLmZha2VUb3VjaEZpbmdlci55KTtcbiAgICAgICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VEb3duJykoW01vdXNlQnV0dG9uLm1haW5CdXR0b24sIGNvb3JkLngsIGNvb3JkLnldKTtcbiAgICAgICAgfVxuICAgICAgICB0b3VjaC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBvblRvdWNoRW5kKHRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpIHx8IHRoaXMuZmFrZVRvdWNoRmluZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpO1xuICAgICAgICBjb25zdCB0b1N0cmVhbWVySGFuZGxlcnMgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b3VjaEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBjb25zdCB0b3VjaCA9IHRvdWNoRXZlbnQuY2hhbmdlZFRvdWNoZXNbdF07XG4gICAgICAgICAgICBpZiAodG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5mYWtlVG91Y2hGaW5nZXIuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gdG91Y2guY2xpZW50WCAtIHRoaXMudmlkZW9FbGVtZW50UGFyZW50Q2xpZW50UmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB0b3VjaC5jbGllbnRZIC0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0LnRvcDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh4LCB5KTtcbiAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZVVwJykoW01vdXNlQnV0dG9uLm1haW5CdXR0b24sIGNvb3JkLngsIGNvb3JkLnldKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb3VzZUV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ21vdXNlbGVhdmUnLCB0b3VjaCk7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50LmRpc3BhdGNoRXZlbnQobW91c2VFdmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWtlVG91Y2hGaW5nZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRvdWNoRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgb25Ub3VjaE1vdmUodG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkgfHwgdGhpcy5mYWtlVG91Y2hGaW5nZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRvdWNoRXZlbnQudG91Y2hlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgY29uc3QgdG91Y2ggPSB0b3VjaEV2ZW50LnRvdWNoZXNbdF07XG4gICAgICAgICAgICBpZiAodG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5mYWtlVG91Y2hGaW5nZXIuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gdG91Y2guY2xpZW50WCAtIHRoaXMudmlkZW9FbGVtZW50UGFyZW50Q2xpZW50UmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB0b3VjaC5jbGllbnRZIC0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0LnRvcDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh4LCB5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVTaWduZWQoeCAtIHRoaXMuZmFrZVRvdWNoRmluZ2VyLngsIHkgLSB0aGlzLmZha2VUb3VjaEZpbmdlci55KTtcbiAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZU1vdmUnKShbY29vcmQueCwgY29vcmQueSwgZGVsdGEueCwgZGVsdGEueV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmFrZVRvdWNoRmluZ2VyLnggPSB4O1xuICAgICAgICAgICAgICAgIHRoaXMuZmFrZVRvdWNoRmluZ2VyLnkgPSB5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRvdWNoRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub3VjaENvbnRyb2xsZXJGYWtlLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBkZWVwQ29weUdhbWVwYWQgfSBmcm9tICcuL0dhbWVwYWRUeXBlcyc7XG4vKipcbiAqIFRoZSBjbGFzcyB0aGF0IGhhbmRsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgWFIgZ2FtZXBhZHMgYW5kIGNvbnRyb2xsZXJzLlxuICovXG5leHBvcnQgY2xhc3MgWFJHYW1lcGFkQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyIC0gU3RyZWFtIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlcikge1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyID0gdG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXI7XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSBbXTtcbiAgICB9XG4gICAgdXBkYXRlU3RhdHVzKHNvdXJjZSwgZnJhbWUsIHJlZlNwYWNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UuZ2FtZXBhZCkge1xuICAgICAgICAgICAgY29uc3QgZ2FtZXBhZFBvc2UgPSBmcmFtZS5nZXRQb3NlKHNvdXJjZS5ncmlwU3BhY2UsIHJlZlNwYWNlKTtcbiAgICAgICAgICAgIGlmICghZ2FtZXBhZFBvc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3lzdGVtID0gMDtcbiAgICAgICAgICAgIGlmIChzb3VyY2UucHJvZmlsZXMuaW5jbHVkZXMoJ2h0Yy12aXZlJykpIHtcbiAgICAgICAgICAgICAgICBzeXN0ZW0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlLnByb2ZpbGVzLmluY2x1ZGVzKCdvY3VsdXMtdG91Y2gnKSkge1xuICAgICAgICAgICAgICAgIHN5c3RlbSA9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPICh3aWxsaWFtLmJlbGNoZXIpOiBBZGQgb3RoZXIgcHJvZmlsZXMgKFF1ZXN0LCBNaWNyb3NvZnQgTWl4ZWQgUmVhbGl0eSwgZXRjKVxuICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUlN5c3RlbScpKFtzeXN0ZW1dKTtcbiAgICAgICAgICAgIC8vIERlZmF1bHQ6IEFueUhhbmQgKDIpXG4gICAgICAgICAgICBsZXQgaGFuZGVkbmVzcyA9IDI7XG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZS5oYW5kZWRuZXNzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MgPSAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNlbmQgY29udHJvbGxlciB0cmFuc2Zvcm1cbiAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IGdhbWVwYWRQb3NlLnRyYW5zZm9ybS5tYXRyaXg7XG4gICAgICAgICAgICBjb25zdCBtYXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgICAgIG1hdFtpXSA9IG5ldyBGbG9hdDMyQXJyYXkoW21hdHJpeFtpXV0pWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSQ29udHJvbGxlclRyYW5zZm9ybScpKFtcbiAgICAgICAgICAgICAgICBtYXRbMF0sIG1hdFs0XSwgbWF0WzhdLCBtYXRbMTJdLFxuICAgICAgICAgICAgICAgIG1hdFsxXSwgbWF0WzVdLCBtYXRbOV0sIG1hdFsxM10sXG4gICAgICAgICAgICAgICAgbWF0WzJdLCBtYXRbNl0sIG1hdFsxMF0sIG1hdFsxNF0sXG4gICAgICAgICAgICAgICAgbWF0WzNdLCBtYXRbN10sIG1hdFsxMV0sIG1hdFsxNV0sXG4gICAgICAgICAgICAgICAgaGFuZGVkbmVzc1xuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBIYW5kbGUgY29udHJvbGxlciBidXR0b25zIGFuZCBheGVzXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyc1toYW5kZWRuZXNzXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc1toYW5kZWRuZXNzXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBpZDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW2hhbmRlZG5lc3NdLnByZXZTdGF0ZSA9IGRlZXBDb3B5R2FtZXBhZChzb3VyY2UuZ2FtZXBhZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW2hhbmRlZG5lc3NdLmN1cnJlbnRTdGF0ZSA9IGRlZXBDb3B5R2FtZXBhZChzb3VyY2UuZ2FtZXBhZCk7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyc1toYW5kZWRuZXNzXTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJTdGF0ZSA9IGNvbnRyb2xsZXIuY3VycmVudFN0YXRlO1xuICAgICAgICAgICAgY29uc3QgcHJldlN0YXRlID0gY29udHJvbGxlci5wcmV2U3RhdGU7XG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYnV0dG9uc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyU3RhdGUuYnV0dG9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJCdXR0b24gPSBjdXJyU3RhdGUuYnV0dG9uc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2QnV0dG9uID0gcHJldlN0YXRlLmJ1dHRvbnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJCdXR0b24ucHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1JlcGVhdCA9IHByZXZCdXR0b24ucHJlc3NlZCA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSQnV0dG9uUHJlc3NlZCcpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyQnV0dG9uLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmV2QnV0dG9uLnByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUkJ1dHRvblJlbGVhc2VkJykoW1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGVkbmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VyckJ1dHRvbi50b3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvdWNoZWRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNSZXBlYXQgPSBwcmV2QnV0dG9uLnRvdWNoZWQgPyAxIDogMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUkJ1dHRvblRvdWNoZWQnKShbXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kZWRuZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmV2QnV0dG9uLnRvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUkJ1dHRvblRvdWNoUmVsZWFzZWQnKShbXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kZWRuZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGdhbWVwYWQgYXhlc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyU3RhdGUuYXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1ckF4aXNWYWx1ZSA9IGN1cnJTdGF0ZS5heGVzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZBeGlzVmFsdWUgPSBwcmV2U3RhdGUuYXhlc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHNlbmQgYXhpcyB1cGRhdGUgaWYgdGhlcmUgaXMgYSBjaGFuZ2VcbiAgICAgICAgICAgICAgICBpZiAoY3VyQXhpc1ZhbHVlICE9IHByZXZBeGlzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUkFuYWxvZycpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQXhpc1ZhbHVlXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNbaGFuZGVkbmVzc10ucHJldlN0YXRlID0gY3VyclN0YXRlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9WFJHYW1lcGFkQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgSW5ib3VuZFZpZGVvU3RhdHMsIEluYm91bmRBdWRpb1N0YXRzIH0gZnJvbSAnLi9JbmJvdW5kUlRQU3RhdHMnO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxTdGF0cyB9IGZyb20gJy4vRGF0YUNoYW5uZWxTdGF0cyc7XG5pbXBvcnQgeyBDYW5kaWRhdGVTdGF0IH0gZnJvbSAnLi9DYW5kaWRhdGVTdGF0JztcbmltcG9ydCB7IFJlbW90ZU91dGJvdW5kUlRQU3RhdHMsIE91dGJvdW5kUlRQU3RhdHMgfSBmcm9tICcuL091dEJvdW5kUlRQU3RhdHMnO1xuaW1wb3J0IHsgU2Vzc2lvblN0YXRzIH0gZnJvbSAnLi9TZXNzaW9uU3RhdHMnO1xuaW1wb3J0IHsgU3RyZWFtU3RhdHMgfSBmcm9tICcuL1N0cmVhbVN0YXRzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogVGhlIEFnZ3JlZ2F0ZWQgU3RhdHMgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgUlRDIFN0YXRzIFJlcG9ydFxuICovXG5leHBvcnQgY2xhc3MgQWdncmVnYXRlZFN0YXRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbmJvdW5kVmlkZW9TdGF0cyA9IG5ldyBJbmJvdW5kVmlkZW9TdGF0cygpO1xuICAgICAgICB0aGlzLmluYm91bmRBdWRpb1N0YXRzID0gbmV3IEluYm91bmRBdWRpb1N0YXRzKCk7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cyA9IG5ldyBEYXRhQ2hhbm5lbFN0YXRzKCk7XG4gICAgICAgIHRoaXMub3V0Ym91bmRWaWRlb1N0YXRzID0gbmV3IE91dGJvdW5kUlRQU3RhdHMoKTtcbiAgICAgICAgdGhpcy5vdXRib3VuZEF1ZGlvU3RhdHMgPSBuZXcgT3V0Ym91bmRSVFBTdGF0cygpO1xuICAgICAgICB0aGlzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cyA9IG5ldyBSZW1vdGVPdXRib3VuZFJUUFN0YXRzKCk7XG4gICAgICAgIHRoaXMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzID0gbmV3IFJlbW90ZU91dGJvdW5kUlRQU3RhdHMoKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdHMgPSBuZXcgU2Vzc2lvblN0YXRzKCk7XG4gICAgICAgIHRoaXMuc3RyZWFtU3RhdHMgPSBuZXcgU3RyZWFtU3RhdHMoKTtcbiAgICAgICAgdGhpcy5jb2RlY3MgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdhdGhlciBhbGwgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb24gUmVwb3J0XG4gICAgICogQHBhcmFtIHJ0Y1N0YXRzUmVwb3J0IC0gUlRDIFN0YXRzIFJlcG9ydFxuICAgICAqL1xuICAgIHByb2Nlc3NTdGF0cyhydGNTdGF0c1JlcG9ydCkge1xuICAgICAgICB0aGlzLmxvY2FsQ2FuZGlkYXRlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICB0aGlzLnJlbW90ZUNhbmRpZGF0ZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdGhpcy5jYW5kaWRhdGVQYWlycyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBydGNTdGF0c1JlcG9ydC5mb3JFYWNoKChzdGF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gc3RhdC50eXBlO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2FuZGlkYXRlLXBhaXInOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNhbmRpZGF0ZVBhaXIoc3RhdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NlcnRpZmljYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29kZWMnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvZGVjKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkYXRhLWNoYW5uZWwnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURhdGFDaGFubmVsKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdpbmJvdW5kLXJ0cCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5ib3VuZFJUUChzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbG9jYWwtY2FuZGlkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVMb2NhbENhbmRpZGF0ZShzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWEtc291cmNlJzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWEtcGxheW91dCc6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ291dGJvdW5kLXJ0cCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlTG9jYWxPdXRib3VuZChzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncGVlci1jb25uZWN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncmVtb3RlLWNhbmRpZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVtb3RlQ2FuZGlkYXRlKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdGUtaW5ib3VuZC1ydHAnOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdGUtb3V0Ym91bmQtcnRwJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZW1vdGVPdXRib3VuZChzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndHJhY2snOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyYWNrKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0cmFuc3BvcnQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyYW5zcG9ydChzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyZWFtJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdHJlYW0oc3RhdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcigndW5oYW5kbGVkIFN0YXQgVHlwZScpO1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbyhzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHN0cmVhbSBzdGF0cyBkYXRhIGZyb20gd2VicnRjXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhdCAtIHRoZSBzdGF0cyBjb21pbmcgaW4gZnJvbSB3ZWJydGNcbiAgICAgKi9cbiAgICBoYW5kbGVTdHJlYW0oc3RhdCkge1xuICAgICAgICB0aGlzLnN0cmVhbVN0YXRzID0gc3RhdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgSWNlIENhbmRpZGF0ZSBQYWlyIERhdGFcbiAgICAgKiBAcGFyYW0gc3RhdCAtIHRoZSBzdGF0cyBjb21pbmcgaW4gZnJvbSBpY2UgY2FuZGlkYXRlc1xuICAgICAqL1xuICAgIGhhbmRsZUNhbmRpZGF0ZVBhaXIoc3RhdCkge1xuICAgICAgICAvLyBBZGQgdGhlIGNhbmRpZGF0ZSBwYWlyIHRvIHRoZSBjYW5kaWRhdGUgcGFpciBhcnJheVxuICAgICAgICB0aGlzLmNhbmRpZGF0ZVBhaXJzLnB1c2goc3RhdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIERhdGEgQ2hhbm5lbCBEYXRhXG4gICAgICogQHBhcmFtIHN0YXQgLSB0aGUgc3RhdHMgY29taW5nIGluIGZyb20gdGhlIGRhdGEgY2hhbm5lbFxuICAgICAqL1xuICAgIGhhbmRsZURhdGFDaGFubmVsKHN0YXQpIHtcbiAgICAgICAgdGhpcy5kYXRhY2hhbm5lbFN0YXRzLmJ5dGVzUmVjZWl2ZWQgPSBzdGF0LmJ5dGVzUmVjZWl2ZWQ7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cy5ieXRlc1NlbnQgPSBzdGF0LmJ5dGVzU2VudDtcbiAgICAgICAgdGhpcy5kYXRhY2hhbm5lbFN0YXRzLmRhdGFDaGFubmVsSWRlbnRpZmllciA9IHN0YXQuZGF0YUNoYW5uZWxJZGVudGlmaWVyO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMuaWQgPSBzdGF0LmlkO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMubGFiZWwgPSBzdGF0LmxhYmVsO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMubWVzc2FnZXNSZWNlaXZlZCA9IHN0YXQubWVzc2FnZXNSZWNlaXZlZDtcbiAgICAgICAgdGhpcy5kYXRhY2hhbm5lbFN0YXRzLm1lc3NhZ2VzU2VudCA9IHN0YXQubWVzc2FnZXNTZW50O1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMucHJvdG9jb2wgPSBzdGF0LnByb3RvY29sO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMuc3RhdGUgPSBzdGF0LnN0YXRlO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMudGltZXN0YW1wID0gc3RhdC50aW1lc3RhbXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIExvY2FsIEljZSBDYW5kaWRhdGUgRGF0YVxuICAgICAqIEBwYXJhbSBzdGF0IC0gbG9jYWwgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVMb2NhbENhbmRpZGF0ZShzdGF0KSB7XG4gICAgICAgIGNvbnN0IGxvY2FsQ2FuZGlkYXRlID0gbmV3IENhbmRpZGF0ZVN0YXQoKTtcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUubGFiZWwgPSAnbG9jYWwtY2FuZGlkYXRlJztcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUuYWRkcmVzcyA9IHN0YXQuYWRkcmVzcztcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUucG9ydCA9IHN0YXQucG9ydDtcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUucHJvdG9jb2wgPSBzdGF0LnByb3RvY29sO1xuICAgICAgICBsb2NhbENhbmRpZGF0ZS5jYW5kaWRhdGVUeXBlID0gc3RhdC5jYW5kaWRhdGVUeXBlO1xuICAgICAgICBsb2NhbENhbmRpZGF0ZS5pZCA9IHN0YXQuaWQ7XG4gICAgICAgIGxvY2FsQ2FuZGlkYXRlLnJlbGF5UHJvdG9jb2wgPSBzdGF0LnJlbGF5UHJvdG9jb2w7XG4gICAgICAgIGxvY2FsQ2FuZGlkYXRlLnRyYW5zcG9ydElkID0gc3RhdC50cmFuc3BvcnRJZDtcbiAgICAgICAgdGhpcy5sb2NhbENhbmRpZGF0ZXMucHVzaChsb2NhbENhbmRpZGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIFJlbW90ZSBJY2UgQ2FuZGlkYXRlIERhdGFcbiAgICAgKiBAcGFyYW0gc3RhdCAtIGljZSBjYW5kaWRhdGUgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVSZW1vdGVDYW5kaWRhdGUoc3RhdCkge1xuICAgICAgICBjb25zdCByZW1vdGVDYW5kaWRhdGUgPSBuZXcgQ2FuZGlkYXRlU3RhdCgpO1xuICAgICAgICByZW1vdGVDYW5kaWRhdGUubGFiZWwgPSAncmVtb3RlLWNhbmRpZGF0ZSc7XG4gICAgICAgIHJlbW90ZUNhbmRpZGF0ZS5hZGRyZXNzID0gc3RhdC5hZGRyZXNzO1xuICAgICAgICByZW1vdGVDYW5kaWRhdGUucG9ydCA9IHN0YXQucG9ydDtcbiAgICAgICAgcmVtb3RlQ2FuZGlkYXRlLnByb3RvY29sID0gc3RhdC5wcm90b2NvbDtcbiAgICAgICAgcmVtb3RlQ2FuZGlkYXRlLmlkID0gc3RhdC5pZDtcbiAgICAgICAgcmVtb3RlQ2FuZGlkYXRlLmNhbmRpZGF0ZVR5cGUgPSBzdGF0LmNhbmRpZGF0ZVR5cGU7XG4gICAgICAgIHJlbW90ZUNhbmRpZGF0ZS5yZWxheVByb3RvY29sID0gc3RhdC5yZWxheVByb3RvY29sO1xuICAgICAgICByZW1vdGVDYW5kaWRhdGUudHJhbnNwb3J0SWQgPSBzdGF0LnRyYW5zcG9ydElkO1xuICAgICAgICB0aGlzLnJlbW90ZUNhbmRpZGF0ZXMucHVzaChyZW1vdGVDYW5kaWRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBJbmJvdW5kIFJUUCBBdWRpbyBhbmQgVmlkZW8gRGF0YVxuICAgICAqIEBwYXJhbSBzdGF0IC0gaW5ib3VuZCBydHAgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVJbmJvdW5kUlRQKHN0YXQpIHtcbiAgICAgICAgc3dpdGNoIChzdGF0LmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYml0cmF0ZSBiZXR3ZWVuIHN0YXQgdXBkYXRlc1xuICAgICAgICAgICAgICAgIGlmIChzdGF0LmJ5dGVzUmVjZWl2ZWQgPiB0aGlzLmluYm91bmRWaWRlb1N0YXRzLmJ5dGVzUmVjZWl2ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RhdC50aW1lc3RhbXAgPiB0aGlzLmluYm91bmRWaWRlb1N0YXRzLnRpbWVzdGFtcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKDggKiAoc3RhdC5ieXRlc1JlY2VpdmVkIC0gdGhpcy5pbmJvdW5kVmlkZW9TdGF0cy5ieXRlc1JlY2VpdmVkKSkgL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0LnRpbWVzdGFtcCAtIHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMudGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmJvdW5kVmlkZW9TdGF0cy5iaXRyYXRlID0gTWF0aC5mbG9vcih0aGlzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb3B5IG1lbWJlcnMgZnJvbSBzdGF0IGludG8gYHRoaXMuaW5ib3VuZFZpZGVvU3RhdHNgXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRWaWRlb1N0YXRzW2tleV0gPSBzdGF0W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXVkaW8nOlxuICAgICAgICAgICAgICAgIGlmIChzdGF0LmJ5dGVzUmVjZWl2ZWQgPiB0aGlzLmluYm91bmRBdWRpb1N0YXRzLmJ5dGVzUmVjZWl2ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RhdC50aW1lc3RhbXAgPiB0aGlzLmluYm91bmRBdWRpb1N0YXRzLnRpbWVzdGFtcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRBdWRpb1N0YXRzLmJpdHJhdGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKDggKiAoc3RhdC5ieXRlc1JlY2VpdmVkIC0gdGhpcy5pbmJvdW5kQXVkaW9TdGF0cy5ieXRlc1JlY2VpdmVkKSkgL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0LnRpbWVzdGFtcCAtIHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHMudGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmJvdW5kQXVkaW9TdGF0cy5iaXRyYXRlID0gTWF0aC5mbG9vcih0aGlzLmluYm91bmRBdWRpb1N0YXRzLmJpdHJhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb3B5IG1lbWJlcnMgZnJvbSBzdGF0IGludG8gYHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHNgXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRBdWRpb1N0YXRzW2tleV0gPSBzdGF0W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEtpbmQgc2hvdWxkIGJlIGF1ZGlvIG9yIHZpZGVvLCB3ZSBnb3QgJHtzdGF0LmtpbmR9IC0gdGhhdCdzIHVuc3VwcG9ydGVkLmApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIFwibG9jYWxcIiBvdXRib3VuZCBSVFAgQXVkaW8gYW5kIFZpZGVvIHN0YXRzLlxuICAgICAqIEBwYXJhbSBzdGF0IC0gbG9jYWwgb3V0Ym91bmQgcnRwIHN0YXRzXG4gICAgICovXG4gICAgaGFuZGxlTG9jYWxPdXRib3VuZChzdGF0KSB7XG4gICAgICAgIGNvbnN0IGxvY2FsT3V0Ym91bmRTdGF0cyA9IHN0YXQua2luZCA9PT0gJ2F1ZGlvJyA/IHRoaXMub3V0Ym91bmRBdWRpb1N0YXRzIDogdGhpcy5vdXRib3VuZFZpZGVvU3RhdHM7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5hY3RpdmUgPSBzdGF0LmFjdGl2ZTtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmNvZGVjSWQgPSBzdGF0LmNvZGVjSWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5ieXRlc1NlbnQgPSBzdGF0LmJ5dGVzU2VudDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmZyYW1lSGVpZ2h0ID0gc3RhdC5mcmFtZUhlaWdodDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmZyYW1lV2lkdGggPSBzdGF0LmZyYW1lV2lkdGg7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5mcmFtZXNFbmNvZGVkID0gc3RhdC5mcmFtZXNFbmNvZGVkO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMuZnJhbWVzUGVyU2Vjb25kID0gc3RhdC5mcmFtZXNQZXJTZWNvbmQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5oZWFkZXJCeXRlc1NlbnQgPSBzdGF0LmhlYWRlckJ5dGVzU2VudDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmlkID0gc3RhdC5pZDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmtleUZyYW1lc0VuY29kZWQgPSBzdGF0LmtleUZyYW1lc0VuY29kZWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5raW5kID0gc3RhdC5raW5kO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMubWVkaWFTb3VyY2VJZCA9IHN0YXQubWVkaWFTb3VyY2VJZDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLm1pZCA9IHN0YXQubWlkO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMubmFja0NvdW50ID0gc3RhdC5uYWNrQ291bnQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5wYWNrZXRzU2VudCA9IHN0YXQucGFja2V0c1NlbnQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5xcFN1bSA9IHN0YXQucXBTdW07XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyA9IHN0YXQucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5xdWFsaXR5TGltaXRhdGlvblJlYXNvbiA9IHN0YXQucXVhbGl0eUxpbWl0YXRpb25SZWFzb247XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5yZW1vdGVJZCA9IHN0YXQucmVtb3RlSWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50ID0gc3RhdC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50O1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMucmlkID0gc3RhdC5yaWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5zY2FsYWJpbGl0eU1vZGUgPSBzdGF0LnNjYWxhYmlsaXR5TW9kZTtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnNzcmMgPSBzdGF0LnNzcmM7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy50YXJnZXRCaXRyYXRlID0gc3RhdC50YXJnZXRCaXRyYXRlO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMudGltZXN0YW1wID0gc3RhdC50aW1lc3RhbXA7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy50b3RhbEVuY29kZVRpbWUgPSBzdGF0LnRvdGFsRW5jb2RlVGltZTtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnRvdGFsRW5jb2RlQnl0ZXNUYXJnZXQgPSBzdGF0LnRvdGFsRW5jb2RlQnl0ZXNUYXJnZXQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy50b3RhbFBhY2tldFNlbmREZWxheSA9IHN0YXQudG90YWxQYWNrZXRTZW5kRGVsYXk7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy50cmFuc3BvcnRJZCA9IHN0YXQudHJhbnNwb3J0SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIFwicmVtb3RlXCIgb3V0Ym91bmQgUlRQIEF1ZGlvIGFuZCBWaWRlbyBzdGF0cy5cbiAgICAgKiBAcGFyYW0gc3RhdCAtIHJlbW90ZSBvdXRib3VuZCBydHAgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVSZW1vdGVPdXRib3VuZChzdGF0KSB7XG4gICAgICAgIGNvbnN0IHJlbW90ZU91dGJvdW5kU3RhdHMgPSBzdGF0LmtpbmQgPT09ICdhdWRpbycgPyB0aGlzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cyA6IHRoaXMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzO1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLmJ5dGVzU2VudCA9IHN0YXQuYnl0ZXNTZW50O1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLmNvZGVjSWQgPSBzdGF0LmNvZGVjSWQ7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMuaWQgPSBzdGF0LmlkO1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLmtpbmQgPSBzdGF0LmtpbmQ7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMubG9jYWxJZCA9IHN0YXQubG9jYWxJZDtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy5wYWNrZXRzU2VudCA9IHN0YXQucGFja2V0c1NlbnQ7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMucmVtb3RlVGltZXN0YW1wID0gc3RhdC5yZW1vdGVUaW1lc3RhbXA7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMucmVwb3J0c1NlbnQgPSBzdGF0LnJlcG9ydHNTZW50O1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMgPSBzdGF0LnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMuc3NyYyA9IHN0YXQuc3NyYztcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy50aW1lc3RhbXAgPSBzdGF0LnRpbWVzdGFtcDtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy50b3RhbFJvdW5kVHJpcFRpbWUgPSBzdGF0LnRvdGFsUm91bmRUcmlwVGltZTtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy50cmFuc3BvcnRJZCA9IHN0YXQudHJhbnNwb3J0SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIEluYm91bmQgVmlkZW8gVHJhY2sgRGF0YVxuICAgICAqIEBwYXJhbSBzdGF0IC0gdmlkZW8gdHJhY2sgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVUcmFjayhzdGF0KSB7XG4gICAgICAgIC8vIHdlIG9ubHkgd2FudCB0byBleHRyYWN0IHN0YXRzIGZyb20gdGhlIHZpZGVvIHRyYWNrXG4gICAgICAgIGlmIChzdGF0LnR5cGUgPT09ICd0cmFjaycgJiYgKHN0YXQudHJhY2tJZGVudGlmaWVyID09PSAndmlkZW9fbGFiZWwnIHx8IHN0YXQua2luZCA9PT0gJ3ZpZGVvJykpIHtcbiAgICAgICAgICAgIHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzRHJvcHBlZCA9IHN0YXQuZnJhbWVzRHJvcHBlZDtcbiAgICAgICAgICAgIHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzUmVjZWl2ZWQgPSBzdGF0LmZyYW1lc1JlY2VpdmVkO1xuICAgICAgICAgICAgdGhpcy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZUhlaWdodCA9IHN0YXQuZnJhbWVIZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lV2lkdGggPSBzdGF0LmZyYW1lV2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlVHJhbnNwb3J0KHN0YXQpIHtcbiAgICAgICAgdGhpcy50cmFuc3BvcnRTdGF0cyA9IHN0YXQ7XG4gICAgfVxuICAgIGhhbmRsZUNvZGVjKHN0YXQpIHtcbiAgICAgICAgY29uc3QgY29kZWNJZCA9IHN0YXQuaWQ7XG4gICAgICAgIHRoaXMuY29kZWNzLnNldChjb2RlY0lkLCBzdGF0KTtcbiAgICB9XG4gICAgaGFuZGxlU2Vzc2lvblN0YXRpc3RpY3ModmlkZW9TdGFydFRpbWUsIGlucHV0Q29udHJvbGxlciwgdmlkZW9FbmNvZGVyQXZnUVApIHtcbiAgICAgICAgY29uc3QgZGVsdGFUaW1lID0gRGF0ZS5ub3coKSAtIHZpZGVvU3RhcnRUaW1lO1xuICAgICAgICB0aGlzLnNlc3Npb25TdGF0cy5ydW5UaW1lID0gbmV3IERhdGUoZGVsdGFUaW1lKS50b0lTT1N0cmluZygpLnN1YnN0cigxMSwgOCkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udHJvbHNTdHJlYW1JbnB1dCA9IGlucHV0Q29udHJvbGxlciA9PT0gbnVsbCA/ICdOb3Qgc2VudCB5ZXQnIDogaW5wdXRDb250cm9sbGVyID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdHMuY29udHJvbHNTdHJlYW1JbnB1dCA9IGNvbnRyb2xzU3RyZWFtSW5wdXQ7XG4gICAgICAgIHRoaXMuc2Vzc2lvblN0YXRzLnZpZGVvRW5jb2RlckF2Z1FQID0gdmlkZW9FbmNvZGVyQXZnUVA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgdmFsdWUgY29taW5nIGluIGZyb20gb3VyIHN0YXRzIGlzIGFjdHVhbGx5IGEgbnVtYmVyXG4gICAgICogQHBhcmFtIHZhbHVlIC0gdGhlIG51bWJlciB0byBiZSBjaGVja2VkXG4gICAgICovXG4gICAgaXNOdW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBhY3RpdmUgY2FuZGlkYXRlIHBhaXJcbiAgICAgKiBAcmV0dXJucyBUaGUgY2FuZGlkYXRlIHBhaXIgdGhhdCBpcyBjdXJyZW50bHkgcmVjZWl2aW5nIGRhdGFcbiAgICAgKi9cbiAgICBnZXRBY3RpdmVDYW5kaWRhdGVQYWlyKCkge1xuICAgICAgICBpZiAodGhpcy5jYW5kaWRhdGVQYWlycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgUlRDVHJhbnNwb3J0IHN0YXQgaXMgbm90IHVuZGVmaW5lZFxuICAgICAgICBpZiAodGhpcy50cmFuc3BvcnRTdGF0cykge1xuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjYW5kaWRhdGUgcGFpciB0aGF0IG1hdGNoZXMgdGhlIHRyYW5zcG9ydCBjYW5kaWRhdGUgcGFpciBpZFxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYWlyID0gdGhpcy5jYW5kaWRhdGVQYWlycy5maW5kKChjYW5kaWRhdGVQYWlyKSA9PiBjYW5kaWRhdGVQYWlyLmlkID09PSB0aGlzLnRyYW5zcG9ydFN0YXRzLnNlbGVjdGVkQ2FuZGlkYXRlUGFpcklkKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFBhaXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkUGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGAuc2VsZWN0ZWRgIG1lbWJlciBvZiB0aGUgY2FuZGlkYXRlIHBhaXJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYWlyID0gdGhpcy5jYW5kaWRhdGVQYWlycy5maW5kKChjYW5kaWRhdGVQYWlyKSA9PiBjYW5kaWRhdGVQYWlyLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkUGFpciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFBhaXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZ2dyZWdhdGVkU3RhdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogSUNFIENhbmRpZGF0ZSBQYWlyIFN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5kaWRhdGVQYWlyU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FuZGlkYXRlUGFpclN0YXRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIElDRSBDYW5kaWRhdGUgU3RhdCBjb2xsZWN0ZWQgZnJvbSB0aGUgUlRDIFN0YXRzIFJlcG9ydFxuICovXG5leHBvcnQgY2xhc3MgQ2FuZGlkYXRlU3RhdCB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYW5kaWRhdGVTdGF0LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIERhdGEgQ2hhbm5lbCBTdGF0cyBjb2xsZWN0ZWQgZnJvbSB0aGUgUlRDIFN0YXRzIFJlcG9ydFxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNoYW5uZWxTdGF0cyB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhQ2hhbm5lbFN0YXRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEluYm91bmQgQXVkaW8gU3RhdHMgY29sbGVjdGVkIGZyb20gdGhlIFJUQyBTdGF0cyBSZXBvcnRcbiAqL1xuZXhwb3J0IGNsYXNzIEluYm91bmRBdWRpb1N0YXRzIHtcbn1cbi8qKlxuICogSW5ib3VuZCBWaWRlbyBTdGF0cyBjb2xsZWN0ZWQgZnJvbSB0aGUgUlRDIFN0YXRzIFJlcG9ydFxuICovXG5leHBvcnQgY2xhc3MgSW5ib3VuZFZpZGVvU3RhdHMge1xufVxuLyoqXG4gKiBJbmJvdW5kIFN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmJvdW5kUlRQU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5ib3VuZFJUUFN0YXRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIFJlcHJlc2VudHMgZWl0aGVyIGE6XG4gKiAtIHN5bmNocm9uaXphdGlvbiBzb3VyY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SVENSdHBSZWNlaXZlci9nZXRTeW5jaHJvbml6YXRpb25Tb3VyY2VzXG4gKiAtIGNvbnRyaWJ1dGluZyBzb3VyY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SVENSdHBSZWNlaXZlci9nZXRDb250cmlidXRpbmdTb3VyY2VzXG4gKiBXaGljaCBhbHNvIChpZiBicm93c2VyIHN1cHBvcnRzIGl0KSBtYXkgb3B0aW9uYWxsIGNvbnRhaW4gZmllbGRzIGZvciBjYXB0dXJlVGltZXN0YW1wICsgc2VuZGVyQ2FwdHVyZVRpbWVPZmZzZXRcbiAqIGlmIHRoZSBhYnMtY2FwdHVyZS10aW1lIFJUUCBoZWFkZXIgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgKGN1cnJlbnRseSB0aGlzIG9ubHkgd29ya3MgaW4gQ2hyb21pdW0gYmFzZWQgYnJvd3NlcnMpLlxuICovXG5jbGFzcyBSVENSdHBDYXB0dXJlU291cmNlIHtcbn1cbi8qKlxuICogRnJhbWVUaW1pbmdJbmZvIGlzIGEgQ2hyb21pdW0tc3BlY2lmaWMgc2V0IG9mIFdlYlJUQyBzdGF0cyB1c2VmdWwgZm9yIGxhdGVuY3kgY2FsY3VsYXRpb24uIEl0IGlzIHN0b3JlZCBpbiBXZWJSVEMgc3RhdHMgYXMgYGdvb2dUaW1pbmdGcmFtZUluZm9gLlxuICogSXQgaXMgZGVmaW5lZCBhcyBhbiBSVFAgaGVhZGVyIGV4dGVuc2lvbiBoZXJlOiBodHRwczovL3dlYnJ0Yy5nb29nbGVzb3VyY2UuY29tL3NyYy8rL3JlZnMvaGVhZHMvbWFpbi9kb2NzL25hdGl2ZS1jb2RlL3J0cC1oZHJleHQvdmlkZW8tdGltaW5nL1JFQURNRS5tZFxuICogSXQgaXMgZGVmaW5lZCBpbiBzb3VyY2UgY29kZSBoZXJlOiBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFpbjp0aGlyZF9wYXJ0eS93ZWJydGMvYXBpL3ZpZGVvL3ZpZGVvX3RpbWluZy5jYztsPTgyO2RyYz04ZDM5OTgxNzI4MmUzYzEyZWQ1NGViMjNlYzQyYTVlNDE4Mjk4ZWM2XG4gKiBJdCBpcyBkaXNjdXNzZWQgYnkgaXRzIGF1dGhvciBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vdzNjL3dlYnJ0Yy1wcm92aXNpb25hbC1zdGF0cy9pc3N1ZXMvNDAjaXNzdWVjb21tZW50LTEyNzI5MTY2OTJcbiAqIEluIHN1bW1hcnkgaXQgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyAoaW4gdGhpcyBvcmRlcik6XG4gKiAxKSAgUlRQIHRpbWVzdGFtcDogdGhlIFJUUCB0aW1lc3RhbXAgb2YgdGhlIGZyYW1lXG4gKiAyKSAgQ2FwdHVyZSB0aW1lOiB0aW1lc3RhbXAgd2hlbiB0aGlzIGZyYW1lIHdhcyBjYXB0dXJlZFxuICogMykgIEVuY29kZSBzdGFydDogdGltZXN0YW1wIHdoZW4gdGhpcyBmcmFtZSBzdGFydGVkIHRvIGJlIGVuY29kZWRcbiAqIDQpICBFbmNvZGUgZmluaXNoOiB0aW1lc3RhbXAgd2hlbiB0aGlzIGZyYW1lIGZpbmlzaGVkIGVuY29kaW5nXG4gKiA1KSAgUGFja2V0aXphdGlvbiBmaW5pc2g6IHRpbWVzdGFtcCB3aGVuIHRoaXMgZnJhbWUgd2FzIHNwbGl0IGludG8gcGFja2V0cyBhbmQgd2FzIHJlYWR5IHRvIGJlIHNlbnQgb3ZlciB0aGUgbmV0d29ya1xuICogNikgIFBhY2VyIGV4aXQ6IHRpbWVzdGFtcCB3aGVuIGxhc3QgcGFja2V0IG9mIHRoaXMgZnJhbWUgd2FzIHNlbnQgb3ZlciB0aGUgbmV0d29yayBieSB0aGUgc2VuZGVyIGF0IHRoaXMgdGltZXN0YW1wXG4gKiA3KSAgTmV0d29yayB0aW1lc3RhbXAxOiBwbGFjZSBmb3IgdGhlIFNGVSB0byBtYXJrIHdoZW4gdGhlIGZyYW1lIHN0YXJ0ZWQgYmVpbmcgZm9yd2FyZGVkLiBBcHBsaWNhdGlvbiBzcGVjaWZpYy5cbiAqIDgpICBOZXR3b3JrIHRpbWVzdGFtcDI6IHBsYWNlIGZvciB0aGUgU0ZVIHRvIG1hcmsgd2hlbiB0aGUgZnJhbWUgZmluaXNoZWQgYmVpbmcgZm9yd2FyZGVkLiBBcHBsaWNhdGlvbiBzcGVjaWZpYy5cbiAqIDkpICBSZWNlaXZlIHN0YXJ0OiB0aW1lc3RhbXAgd2hlbiB0aGUgZmlyc3QgcGFja2V0IG9mIHRoaXMgZnJhbWUgd2FzIHJlY2VpdmVkXG4gKiAxMCkgUmVjZWl2ZSBmaW5pc2g6IHRpbWVzdGFtcCB3aGVuIHRoZSBsYXN0IHBhY2tldCBvZiB0aGlzIGZyYW1lIHdhcyByZWNlaXZlZFxuICogMTEpIERlY29kZSBzdGFydDogIHRpbWVzdGFtcCB3aGVuIHRoZSBmcmFtZSB3YXMgcGFzc2VkIHRvIGRlY29kZXJcbiAqIDEyKSBEZWNvZGUgZmluaXNoOiAgdGltZXN0YW1wIHdoZW4gdGhlIGZyYW1lIHdhcyBkZWNvZGVkXG4gKiAxMykgUmVuZGVyIHRpbWU6ICB0aW1lc3RhbXAgb2YgdGhlIHByb2plY3RlZCByZW5kZXIgdGltZSBmb3IgdGhpcyBmcmFtZVxuICogMTQpIFwiaXMgb3V0bGllclwiOiBhIGZsYWcgZm9yIGlmIHRoaXMgZnJhbWUgaXMgYmlnZ2VyIGluIGVuY29kZWQgc2l6ZSB0aGFuIHRoZSBhdmVyYWdlIGZyYW1lIGJ5IGF0IGxlYXN0IDV4LlxuICogMTUpIFwidHJpZ2dlcmVkIGJ5IHRpbWVyXCI6IGEgZmxhZyBmb3IgaWYgdGhpcyByZXBvcnQgd2FzIHRyaWdnZXJlZCBieSB0aGUgdGltZXIgKFRoZSByZXBvcnQgaXMgc2VudCBldmVyeSAyMDBtcylcbiAqL1xuZXhwb3J0IGNsYXNzIEZyYW1lVGltaW5nSW5mbyB7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgYSBjb21iaW5hdGlvbiBvZiBsYXRlbmN5IHN0YXRpc3RpY3MgdXNpbmcgcHVyZWx5IFdlYlJUQyBBUEkuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXRlbmN5Q2FsY3VsYXRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qIENsb2NrIG9mZnNldCBiZXR3ZWVuIHBlZXIgY2xvY2tzIGNhbm5vdCBhbHdheXMgYmUgY2FsY3VsYXRlZCBhcyBpdCByZWxpZXMgb2YgbGF0ZXN0IHNlbmRlciByZXBvcnRzLlxuICAgICAgICAgKiBzbyB3ZSBzdG9yZSB0aGUgbGFzdCB0aW1lIHdlIGhhZCBhIHZhbGlkIGNsb2NrIG9mZnNldCBpbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGNsb2NrcyBoYXZlbid0IGRyaWZ0ZWQgdG9vIG11Y2ggc2luY2UgdGhlbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGF0ZXN0U2VuZGVyUmVjdkNsb2NrT2Zmc2V0ID0gbnVsbDtcbiAgICB9XG4gICAgY2FsY3VsYXRlKHN0YXRzLCByZWNlaXZlcnMpIHtcbiAgICAgICAgY29uc3QgbGF0ZW5jeUluZm8gPSBuZXcgTGF0ZW5jeUluZm8oKTtcbiAgICAgICAgY29uc3QgcnR0TVMgPSB0aGlzLmdldFJUVE1zKHN0YXRzKTtcbiAgICAgICAgaWYgKHJ0dE1TICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLnJ0dE1zID0gcnR0TVM7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgc2VuZGVyIGxhdGVuY3kgdXNpbmcgdGhlIGZpcnN0IHZhbGlkIHZpZGVvIHNzcmMvY3NyY1xuICAgICAgICAgICAgY29uc3QgY2FwdHVyZVNvdXJjZSA9IHRoaXMuZ2V0Q2FwdHVyZVNvdXJjZShyZWNlaXZlcnMpO1xuICAgICAgICAgICAgaWYgKGNhcHR1cmVTb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbmRlckxhdGVuY3lNcyA9IHRoaXMuY2FsY3VsYXRlU2VuZGVyTGF0ZW5jeShzdGF0cywgY2FwdHVyZVNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbmRlckxhdGVuY3lNcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsYXRlbmN5SW5mby5zZW5kZXJMYXRlbmN5TXMgPSBzZW5kZXJMYXRlbmN5TXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJydGMtc3RhdHMvI2RvbS1ydGNpbmJvdW5kcnRwc3RyZWFtc3RhdHMtdG90YWxwcm9jZXNzaW5nZGVsYXlcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLnRvdGFsUHJvY2Vzc2luZ0RlbGF5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZVByb2Nlc3NpbmdEZWxheU1zID1cbiAgICAgICAgICAgICAgICAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMudG90YWxQcm9jZXNzaW5nRGVsYXkgLyBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEZWNvZGVkKSAqIDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1zdGF0cy8jZG9tLXJ0Y2luYm91bmRydHBzdHJlYW1zdGF0cy1qaXR0ZXJidWZmZXJtaW5pbXVtZGVsYXlcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmppdHRlckJ1ZmZlckRlbGF5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXRlbmN5SW5mby5hdmVyYWdlSml0dGVyQnVmZmVyRGVsYXlNcyA9XG4gICAgICAgICAgICAgICAgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmppdHRlckJ1ZmZlckRlbGF5IC9cbiAgICAgICAgICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50KSAqXG4gICAgICAgICAgICAgICAgICAgIDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1zdGF0cy8jZG9tLXJ0Y2luYm91bmRydHBzdHJlYW1zdGF0cy10b3RhbGRlY29kZXRpbWVcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMudG90YWxEZWNvZGVUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VEZWNvZGVMYXRlbmN5TXMgPVxuICAgICAgICAgICAgICAgIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy50b3RhbERlY29kZVRpbWUgLyBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEZWNvZGVkKSAqIDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1zdGF0cy8jZG9tLXJ0Y2luYm91bmRydHBzdHJlYW1zdGF0cy1mcmFtZXNhc3NlbWJsZWRmcm9tbXVsdGlwbGVwYWNrZXRzXG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy50b3RhbEFzc2VtYmx5VGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNBc3NlbWJsZWRGcm9tTXVsdGlwbGVQYWNrZXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VBc3NlbWJseURlbGF5TXMgPVxuICAgICAgICAgICAgICAgIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy50b3RhbEFzc2VtYmx5VGltZSAvXG4gICAgICAgICAgICAgICAgICAgIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0Fzc2VtYmxlZEZyb21NdWx0aXBsZVBhY2tldHMpICpcbiAgICAgICAgICAgICAgICAgICAgMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHRyYWN0IGV4dHJhIENocm9tZS1zcGVjaWZpYyBzdGF0cyBsaWtlIGVuY29kaW5nIGxhdGVuY3lcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmdvb2dUaW1pbmdGcmFtZUluZm8gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZ29vZ1RpbWluZ0ZyYW1lSW5mby5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsYXRlbmN5SW5mby5mcmFtZVRpbWluZyA9IHRoaXMuZXh0cmFjdEZyYW1lVGltaW5nSW5mbyhzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5nb29nVGltaW5nRnJhbWVJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxjdWxhdGUgRTJFIGxhdGVuY3kgdXNpbmcgdmlkZW8tdGltaW5nIGNhcHR1cmUgdG8gc2VuZCB0aW1lICsgb25lIHdheSBuZXR3b3JrIGxhdGVuY3kgKyByZWNlaXZlci1zaWRlIGxhdGVuY3lcbiAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmNhcHR1cmVUb1NlbmRMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZVByb2Nlc3NpbmdEZWxheU1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLnJ0dE1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VFMkVMYXRlbmN5ID1cbiAgICAgICAgICAgICAgICBsYXRlbmN5SW5mby5mcmFtZVRpbWluZy5jYXB0dXJlVG9TZW5kTGF0ZW5jeU1zICtcbiAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeUluZm8ucnR0TXMgKiAwLjUgK1xuICAgICAgICAgICAgICAgICAgICBsYXRlbmN5SW5mby5hdmVyYWdlUHJvY2Vzc2luZ0RlbGF5TXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsY3VsYXRlIEUyRSBsYXRlbmN5IGFzIGFicy1jYXB0dXJlLXRpbWUgY2FwdHVyZSB0byBzZW5kIGxhdGVuY3kgKyBvbmUgd2F5IG5ldHdvcmsgbGF0ZW5jeSArIHJlY2VpdmVyLXNpZGUgbGF0ZW5jeVxuICAgICAgICBpZiAobGF0ZW5jeUluZm8uc2VuZGVyTGF0ZW5jeU1zICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZVByb2Nlc3NpbmdEZWxheU1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLnJ0dE1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VFMkVMYXRlbmN5ID1cbiAgICAgICAgICAgICAgICBsYXRlbmN5SW5mby5zZW5kZXJMYXRlbmN5TXMgKyBsYXRlbmN5SW5mby5ydHRNcyAqIDAuNSArIGxhdGVuY3lJbmZvLmF2ZXJhZ2VQcm9jZXNzaW5nRGVsYXlNcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF0ZW5jeUluZm87XG4gICAgfVxuICAgIGV4dHJhY3RGcmFtZVRpbWluZ0luZm8oZ29vZ1RpbWluZ0ZyYW1lSW5mbykge1xuICAgICAgICBjb25zdCB0aW1pbmdJbmZvID0gbmV3IEZyYW1lVGltaW5nSW5mbygpO1xuICAgICAgICBjb25zdCB0aW1pbmdJbmZvQXJyID0gZ29vZ1RpbWluZ0ZyYW1lSW5mby5zcGxpdCgnLCcpO1xuICAgICAgICAvLyBTaG91bGQgaGF2ZSBleGFjdGx5IDE1IGVsZW1lbnRzIGFjY29yZGluZyB0bzpcbiAgICAgICAgLy8gaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL21haW46dGhpcmRfcGFydHkvd2VicnRjL2FwaS92aWRlby92aWRlb190aW1pbmcuY2M7bD04MjtkcmM9OGQzOTk4MTcyODJlM2MxMmVkNTRlYjIzZWM0MmE1ZTQxODI5OGVjNlxuICAgICAgICBpZiAodGltaW5nSW5mb0Fyci5sZW5ndGggPT09IDE1KSB7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLnJ0cFRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzBdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uY2FwdHVyZVRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzFdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uZW5jb2RlU3RhcnRUaW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0FyclsyXSk7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLmVuY29kZUZpbmlzaFRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzNdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ucGFja2V0aXplckZpbmlzaFRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzRdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ucGFjZXJFeGl0VGltZXN0YW1wID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbNV0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5uZXR3b3JrVGltZXN0YW1wMSA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzZdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ubmV0d29ya1RpbWVzdGFtcDIgPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0Fycls3XSk7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLnJlY2VpdmVTdGFydCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzhdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ucmVjZWl2ZUZpbmlzaCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzldKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uZGVjb2RlU3RhcnQgPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0FyclsxMF0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5kZWNvZGVGaW5pc2ggPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0FyclsxMV0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5yZW5kZXJUaW1lID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbMTJdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uaXNPdXRsaWVyID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbMTNdKSA+IDA7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLmlzVHJpZ2dlcmVkQnlUaW1lciA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzE0XSkgPiAwO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNvbWUgbGF0ZW5jeSBzdGF0c1xuICAgICAgICAgICAgdGltaW5nSW5mby5lbmNvZGVyTGF0ZW5jeU1zID0gdGltaW5nSW5mby5lbmNvZGVGaW5pc2hUaW1lc3RhbXAgLSB0aW1pbmdJbmZvLmVuY29kZVN0YXJ0VGltZXN0YW1wO1xuICAgICAgICAgICAgdGltaW5nSW5mby5wYWNrZXRpemVMYXRlbmN5TXMgPVxuICAgICAgICAgICAgICAgIHRpbWluZ0luZm8ucGFja2V0aXplckZpbmlzaFRpbWVzdGFtcCAtIHRpbWluZ0luZm8uZW5jb2RlRmluaXNoVGltZXN0YW1wO1xuICAgICAgICAgICAgdGltaW5nSW5mby5wYWNlckxhdGVuY3lNcyA9IHRpbWluZ0luZm8ucGFjZXJFeGl0VGltZXN0YW1wIC0gdGltaW5nSW5mby5wYWNrZXRpemVyRmluaXNoVGltZXN0YW1wO1xuICAgICAgICAgICAgdGltaW5nSW5mby5jYXB0dXJlVG9TZW5kTGF0ZW5jeU1zID0gdGltaW5nSW5mby5wYWNlckV4aXRUaW1lc3RhbXAgLSB0aW1pbmdJbmZvLmNhcHR1cmVUaW1lc3RhbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbWluZ0luZm87XG4gICAgfVxuICAgIGNhbGN1bGF0ZVNlbmRlckxhdGVuY3koc3RhdHMsIGNhcHR1cmVTb3VyY2UpIHtcbiAgICAgICAgLy8gVGhlIGNhbGN1bGF0aW9uIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGlzIGFzIHBlciB0aGUgcHJvY2VkdXJlIGRlZmluZWQgaGVyZTpcbiAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1leHRlbnNpb25zLyNkb20tcnRjcnRwY29udHJpYnV0aW5nc291cmNlLXNlbmRlcmNhcHR1cmV0aW1lb2Zmc2V0XG4gICAgICAgIC8vIEdldCB0aGUgc2VuZGVyIGNhcHR1cmUgaW4gdGhlIHNlbmRlcidzIGNsb2NrXG4gICAgICAgIGNvbnN0IHNlbmRlckNhcHR1cmVUaW1lc3RhbXAgPSBjYXB0dXJlU291cmNlLmNhcHR1cmVUaW1lc3RhbXAgKyBjYXB0dXJlU291cmNlLnNlbmRlckNhcHR1cmVUaW1lT2Zmc2V0O1xuICAgICAgICBsZXQgc2VuZFJlY3ZDbG9ja09mZnNldCA9IHRoaXMuY2FsY3VsYXRlU2VuZGVyUmVjZWl2ZXJDbG9ja09mZnNldChzdGF0cyk7XG4gICAgICAgIC8vIFVzZSBsYXRlc3QgY2xvY2sgb2Zmc2V0IGlmIHdlIGNvdWxkbid0IGNhbGN1bGF0ZSBvbmUgbm93XG4gICAgICAgIGlmIChzZW5kUmVjdkNsb2NrT2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhdGVzdFNlbmRlclJlY3ZDbG9ja09mZnNldCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2VuZFJlY3ZDbG9ja09mZnNldCA9IHRoaXMubGF0ZXN0U2VuZGVyUmVjdkNsb2NrT2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhdGVzdFNlbmRlclJlY3ZDbG9ja09mZnNldCA9IHNlbmRSZWN2Q2xvY2tPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBicmluZ3Mgc2VuZGVyIGNsb2NrIHJvdWdobHkgaW5saW5lIHdpdGggcmVjdiBjbG9ja1xuICAgICAgICBjb25zdCByZWN2Q2FwdHVyZVRpbWVzdGFtcE5UUCA9IHNlbmRlckNhcHR1cmVUaW1lc3RhbXAgKyBzZW5kUmVjdkNsb2NrT2Zmc2V0O1xuICAgICAgICAvLyBBcyBkZWZpbmVkIGluIENocm9tZSBzb3VyY2U6IGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9leHRlcm5hbC93ZWJydGMvKy9tYXN0ZXIvc3lzdGVtX3dyYXBwZXJzL2luY2x1ZGUvY2xvY2suaCMyNlxuICAgICAgICBjb25zdCBudHAxOTcwID0gMjIwODk4ODgwMDAwMDtcbiAgICAgICAgY29uc3QgcmVjdkNhcHR1cmVUaW1lc3RhbXAgPSByZWN2Q2FwdHVyZVRpbWVzdGFtcE5UUCAtIG50cDE5NzA7XG4gICAgICAgIGNvbnN0IHNlbmRlckxhdGVuY3kgPSBjYXB0dXJlU291cmNlLnRpbWVzdGFtcCAtIHJlY3ZDYXB0dXJlVGltZXN0YW1wO1xuICAgICAgICByZXR1cm4gc2VuZGVyTGF0ZW5jeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgZmlyc3QgdmFsaWQgc3NyYyBvciBjc3JjIHRoYXQgaGFzIGNhcHR1cmUgdGltZSBmaWVsZHMgcHJlc2VudCBmcm9tIGFicy1jYXB0dXJlLXRpbWUgaGVhZGVyIGV4dGVuc2lvbi5cbiAgICAgKiBAcGFyYW0gcmVjZWl2ZXJzIFRoZSBSVFAgcmVjZXZpZXJzIHRoaXMgcGVlciBjb25uZWN0aW9uIGhhcy5cbiAgICAgKiBAcmV0dXJucyBBIHNpbmdsZSB2YWxpZCBzc3JjIG9yIGNzcmMgdGhhdCBoYXMgY2FwdHVyZSB0aW1lIGZpZWxkcyBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUgKGUuZy4gaW4gbm9uLWNocm9taXVtIGJyb3dzZXJzIGl0IHdpbGwgYmUgbnVsbCkuXG4gICAgICovXG4gICAgZ2V0Q2FwdHVyZVNvdXJjZShyZWNlaXZlcnMpIHtcbiAgICAgICAgLy8gV2Ugb25seSB3YW50IHZpZGVvIHJlY2VpdmVyc1xuICAgICAgICByZWNlaXZlcnMgPSByZWNlaXZlcnMuZmlsdGVyKChyZWNlaXZlcikgPT4gcmVjZWl2ZXIudHJhY2sua2luZCA9PT0gJ3ZpZGVvJyk7XG4gICAgICAgIGZvciAoY29uc3QgcmVjZWl2ZXIgb2YgcmVjZWl2ZXJzKSB7XG4gICAgICAgICAgICAvLyBHbyB0aHJvdWdoIGFsbCBzc3JjIGFuZCBjc3JjIHRvIGNoZWNrIGZvciBjYXB0dXJlIHRpbWVzdGFtcFxuICAgICAgICAgICAgLy8gTm90ZTogQ29udmVyc2lvbiB0byBgYW55YCBoZXJlIGlzIGJlY2F1c2UgVFMgZG9lcyBub3QgaGF2ZSBjYXB0dXJlVGltZXN0YW1wIGV0YyBkZWZpbmVkIGluIHRoZSB0eXBlc1xuICAgICAgICAgICAgLy8gdGhlc2UgZmllbGRzIG9ubHkgZXhpc3QgaW4gQ2hyb21pdW0gY3VycmVudGx5LlxuICAgICAgICAgICAgY29uc3Qgc291cmNlcyA9IHJlY2VpdmVyXG4gICAgICAgICAgICAgICAgLmdldFN5bmNocm9uaXphdGlvblNvdXJjZXMoKVxuICAgICAgICAgICAgICAgIC5jb25jYXQocmVjZWl2ZXIuZ2V0Q29udHJpYnV0aW5nU291cmNlcygpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3JjIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3JjLmNhcHR1cmVUaW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBzcmMuc2VuZGVyQ2FwdHVyZVRpbWVPZmZzZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBzcmMudGltZXN0YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FwdHVyZVNyYyA9IG5ldyBSVENSdHBDYXB0dXJlU291cmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVTcmMudGltZXN0YW1wID0gc3JjLnRpbWVzdGFtcDtcbiAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNyYy5jYXB0dXJlVGltZXN0YW1wID0gc3JjLmNhcHR1cmVUaW1lc3RhbXA7XG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVTcmMuc2VuZGVyQ2FwdHVyZVRpbWVPZmZzZXQgPSBzcmMuc2VuZGVyQ2FwdHVyZVRpbWVPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXB0dXJlU3JjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY2FsY3VsYXRlU2VuZGVyUmVjZWl2ZXJDbG9ja09mZnNldChzdGF0cykge1xuICAgICAgICAvLyBUaGUgY2FsY3VsYXRpb24gcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gaXMgYXMgcGVyIHRoZSBwcm9jZWR1cmUgZGVmaW5lZCBoZXJlOlxuICAgICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2VicnRjLWV4dGVuc2lvbnMvI2RvbS1ydGNydHBjb250cmlidXRpbmdzb3VyY2Utc2VuZGVyY2FwdHVyZXRpbWVvZmZzZXRcbiAgICAgICAgY29uc3QgaGFzUmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzID0gc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy50aW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzLnJlbW90ZVRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBOb3RlOiBBcyBvZiBDaHJvbWUgMTMyLCByZW1vdGUtb3V0Ym91bmQtcnRwIHN0YXRzIGZvciB2aWRlbyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZCAoYXVkaW8gd29ya3MpLlxuICAgICAgICAvLyBUaGlzIGNvZGVwYXRoIHNob3VsZCBhY3RpdmF0ZSBvbmNlIHRoZXkgZG8gYmVnaW4gdG8gd29yay5cbiAgICAgICAgaWYgKCFoYXNSZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbW90ZVN0YXRzQXJyaXZlZFRpbWVzdGFtcCA9IHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy50aW1lc3RhbXA7XG4gICAgICAgIGNvbnN0IHJlbW90ZVN0YXRzU2VudFRpbWVzdGFtcCA9IHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy5yZW1vdGVUaW1lc3RhbXA7XG4gICAgICAgIGNvbnN0IHJ0dE1zID0gdGhpcy5nZXRSVFRNcyhzdGF0cyk7XG4gICAgICAgIGlmIChyZW1vdGVTdGF0c0Fycml2ZWRUaW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgcmVtb3RlU3RhdHNTZW50VGltZXN0YW1wICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHJ0dE1zICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBvbmV3YXlEZWxheSA9IHJ0dE1zICogMC41O1xuICAgICAgICAgICAgcmV0dXJuIHJlbW90ZVN0YXRzQXJyaXZlZFRpbWVzdGFtcCAtIChyZW1vdGVTdGF0c1NlbnRUaW1lc3RhbXAgKyBvbmV3YXlEZWxheSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ291bGQgbm90IGdldCBzdGF0cyB0byBjYWxjdWxhdGUgc2VuZGVyL3JlY2VpdmVyIGNsb2NrIG9mZnNldFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFJUVE1zKHN0YXRzKSB7XG4gICAgICAgIC8vIFRyeSB0byBnZXQgaXQgZnJvbSB0aGUgYWN0aXZlIGNhbmRpZGF0ZSBwYWlyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZVBhaXIgPSBzdGF0cy5nZXRBY3RpdmVDYW5kaWRhdGVQYWlyKCk7XG4gICAgICAgIGlmICghIWFjdGl2ZUNhbmRpZGF0ZVBhaXIgJiYgYWN0aXZlQ2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJSVFRTZWNvbmRzID0gYWN0aXZlQ2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZTtcbiAgICAgICAgICAgIHJldHVybiBjdXJSVFRTZWNvbmRzICogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZXh0IHRyeSB0byBnZXQgaXQgZnJvbSByZW1vdGUtb3V0Ym91bmQtcnRwIHZpZGVvIHN0YXRzXG4gICAgICAgIGlmICghIXN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cyAmJlxuICAgICAgICAgICAgc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzLnRvdGFsUm91bmRUcmlwVGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1J0dFNlY29uZHMgPSBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMudG90YWxSb3VuZFRyaXBUaW1lIC9cbiAgICAgICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cztcbiAgICAgICAgICAgIHJldHVybiBhdmdSdHRTZWNvbmRzICogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZXh0IHRyeSB0byBnZXQgaXQgZnJvbSByZW1vdGUtb3V0Ym91bmQtcnRwIGF1ZGlvIHN0YXRzXG4gICAgICAgIGlmICghIXN0YXRzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cyAmJlxuICAgICAgICAgICAgc3RhdHMucmVtb3RlT3V0Ym91bmRBdWRpb1N0YXRzLnRvdGFsUm91bmRUcmlwVGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZEF1ZGlvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZEF1ZGlvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1J0dFNlY29uZHMgPSBzdGF0cy5yZW1vdGVPdXRib3VuZEF1ZGlvU3RhdHMudG90YWxSb3VuZFRyaXBUaW1lIC9cbiAgICAgICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZEF1ZGlvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cztcbiAgICAgICAgICAgIHJldHVybiBhdmdSdHRTZWNvbmRzICogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBsYXRlbmN5IGluZm9ybWF0aW9uIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIFdlYlJUQyBBUEkuXG4gKiBNb3N0IHN0YXRzIGFyZSBjYWxjdWxhdGVkIGZvbGxvd2luZyB0aGUgc3BlYzpcbiAqIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJydGMtc3RhdHMvI2RpY3Rpb25hcnktcnRjaW5ib3VuZHJ0cHN0cmVhbXN0YXRzLW1lbWJlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIExhdGVuY3lJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aW1lIHRha2VuIGZyb20gdGhlIG1vbWVudCBhIGZyYW1lIGlzIGRvbmUgY2FwdHVyaW5nIHRvIHRoZSBtb21lbnQgaXQgaXMgc2VudCBvdmVyIHRoZSBuZXR3b3JrLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGNhbiBvbmx5IGJlIGNhbGN1bGF0ZWQgaWYgYm90aCBvZmZlciBhbmQgYW5zd2VyIGNvbnRhaW4gdGhlXG4gICAgICAgICAqIHRoZSBSVFAgaGVhZGVyIGV4dGVuc2lvbiBmb3IgYHZpZGVvLXRpbWluZ2AgKENocm9tZSBvbmx5IGZvciBub3cpXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbmRlckxhdGVuY3lNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aW1lIHRha2VuIGZyb20gdGhlIG1vbWVudCBhIGZyYW1lIGlzIGRvbmUgY2FwdHVyaW5nIHRvIHRoZSBtb21lbnQgaXQgaXMgc2VudCBvdmVyIHRoZSBuZXR3b3JrLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGNhbiBvbmx5IGJlIGNhbGN1bGF0ZWQgaWYgYm90aCBvZmZlciBhbmQgYW5zd2VyIGNvbnRhaW4gdGhlXG4gICAgICAgICAqIHRoZSBSVFAgaGVhZGVyIGV4dGVuc2lvbiBmb3IgYGFicy1jYXB0dXJlLXRpbWVgIChDaHJvbWUgb25seSBmb3Igbm93KVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZW5kZXJMYXRlbmN5QWJzQ2FwdHVyZVRpbWVNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyogVGhlIHJvdW5kIHRyaXAgdGltZSAobWlsbGlzZWNvbmRzKSBiZXR3ZWVuIGVhY2ggc2VuZGVyLT5yZWNlaXZlci0+c2VuZGVyICovXG4gICAgICAgIHRoaXMucnR0TXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qIEF2ZXJhZ2UgdGltZSB0YWtlbiAobWlsbGlzZWNvbmRzKSBmcm9tIHZpZGVvIHBhY2tldCByZWNlaXB0IHRvIHBvc3QtZGVjb2RlLiAqL1xuICAgICAgICB0aGlzLmF2ZXJhZ2VQcm9jZXNzaW5nRGVsYXlNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyogQXZlcmFnZSB0aW1lIHRha2VuIChtaWxsaXNlY29uZHMpIGluc2lkZSB0aGUgaml0dGVyIGJ1ZmZlciAod2hpY2ggaXMgcG9zdC1yZWNlaXB0IGJ1dCBwcmUtZGVjb2RlKS4gKi9cbiAgICAgICAgdGhpcy5hdmVyYWdlSml0dGVyQnVmZmVyRGVsYXlNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyogQXZlcmFnZSB0aW1lIHRha2VuIChtaWxsaXNlY29uZHMpIHRvIGRlY29kZSBhIHZpZGVvIGZyYW1lLiAqL1xuICAgICAgICB0aGlzLmF2ZXJhZ2VEZWNvZGVMYXRlbmN5TXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qIEF2ZXJhZ2UgdGltZSB0YWtlbiAobWlsbGlzZWNvbmRzKSB0byBiZXR3ZWVuIHJlY2VpcHQgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IHZpZGVvIHBhY2tldCBvZiBhLiAqL1xuICAgICAgICB0aGlzLmF2ZXJhZ2VBc3NlbWJseURlbGF5TXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qIFRoZSBzZW5kZXIgbGF0ZW5jeSArIFJUVC8yICsgcHJvY2Vzc2luZyBkZWxheSAqL1xuICAgICAgICB0aGlzLmF2ZXJhZ2VFMkVMYXRlbmN5ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiBUaW1pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdvcnN0IHBlcmZvcm1pbmcgZnJhbWUgc2luY2UgdGhlIGxhc3QgZ2V0U3RhdHMgY2FsbCAob25seSB3b3JrcyBvbiBDaHJvbWUpICovXG4gICAgICAgIHRoaXMuZnJhbWVUaW1pbmcgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGF0ZW5jeUNhbGN1bGF0b3IuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogT3V0Ym91bmQgUlRQIHN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0IHVuZGVyIGBvdXRib3VuZC1ydHBgLlxuICogV3JhcHBlciBhcm91bmQ6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SVENPdXRib3VuZFJ0cFN0cmVhbVN0YXRzXG4gKiBUaGVzZSBhcmUgc3RhdHMgZm9yIHZpZGVvIHdlIGFyZSBzZW5kaW5nIHRvIGEgcmVtb3RlIHBlZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBPdXRib3VuZFJUUFN0YXRzIHtcbn1cbi8qKlxuICogUmVtb3RlIG91dGJvdW5kIHN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0IHVuZGVyIGByZW1vdGUtb3V0Ym91bmQtcnRwYC5cbiAqIFdyYXBwZXIgYXJvdW5kOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUlRDUmVtb3RlT3V0Ym91bmRSdHBTdHJlYW1TdGF0c1xuICogVGhlc2UgYXJlIHN0YXRzIGZvciBtZWRpYSB3ZSBhcmUgcmVjZWl2aW5nIGZyb20gYSByZW1vdGUgcGVlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbW90ZU91dGJvdW5kUlRQU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3V0Qm91bmRSVFBTdGF0cy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBPcHRpb25QYXJhbWV0ZXJzLCBGbGFncyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgQWdncmVnYXRlZFN0YXRzIH0gZnJvbSAnLi9BZ2dyZWdhdGVkU3RhdHMnO1xuaW1wb3J0IHsgcGFyc2VSdHBQYXJhbWV0ZXJzLCBzcGxpdFNlY3Rpb25zIH0gZnJvbSAnc2RwJztcbmltcG9ydCB7IFJUQ1V0aWxzIH0gZnJvbSAnLi4vVXRpbC9SVENVdGlscyc7XG5pbXBvcnQgeyBTRFBVdGlscyB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IExhdGVuY3lDYWxjdWxhdG9yIH0gZnJvbSAnLi9MYXRlbmN5Q2FsY3VsYXRvcic7XG5leHBvcnQgY29uc3Qga0Fic0NhcHR1cmVUaW1lID0gJ2h0dHA6Ly93d3cud2VicnRjLm9yZy9leHBlcmltZW50cy9ydHAtaGRyZXh0L2Ficy1jYXB0dXJlLXRpbWUnO1xuLyoqXG4gKiBIYW5kbGVzIHRoZSBQZWVyIENvbm5lY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBlZXJDb25uZWN0aW9uQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IFJUQyBQZWVyIENvbm5lY3Rpb24gY2xpZW50XG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBQZWVyIGNvbm5lY3Rpb24gT3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlnIGZvciBvdXIgUFMgZXhwZXJpZW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb25maWcsIHByZWZlcnJlZENvZGVjKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmNyZWF0ZVBlZXJDb25uZWN0aW9uKG9wdGlvbnMsIHByZWZlcnJlZENvZGVjKTtcbiAgICAgICAgdGhpcy5sYXRlbmN5Q2FsY3VsYXRvciA9IG5ldyBMYXRlbmN5Q2FsY3VsYXRvcigpO1xuICAgIH1cbiAgICBjcmVhdGVQZWVyQ29ubmVjdGlvbihvcHRpb25zLCBwcmVmZXJyZWRDb2RlYykge1xuICAgICAgICAvLyBTZXQgdGhlIElDRSB0cmFuc3BvcnQgdG8gcmVsYXkgaWYgVFVSTiBlbmFibGVkXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkZvcmNlVFVSTikpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaWNlVHJhbnNwb3J0UG9saWN5ID0gJ3JlbGF5JztcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdGb3JjaW5nIFRVUk4gdXNhZ2UgYnkgc2V0dGluZyBJQ0UgVHJhbnNwb3J0IFBvbGljeSBpbiBwZWVyIGNvbm5lY3Rpb24gY29uZmlnLicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJ1aWxkIGEgbmV3IHBlZXIgY29ubmVjdGlvbiB3aXRoIHRoZSBvcHRpb25zXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24gPSBuZXcgUlRDUGVlckNvbm5lY3Rpb24ob3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24ub25zaWduYWxpbmdzdGF0ZWNoYW5nZSA9IChldikgPT4gdGhpcy5oYW5kbGVTaWduYWxTdGF0ZUNoYW5nZShldik7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24ub25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSAoZXYpID0+IHRoaXMuaGFuZGxlSWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlKGV2KTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5vbmljZWdhdGhlcmluZ3N0YXRlY2hhbmdlID0gKGV2KSA9PiB0aGlzLmhhbmRsZUljZUdhdGhlcmluZ1N0YXRlQ2hhbmdlKGV2KTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5vbnRyYWNrID0gKGV2KSA9PiB0aGlzLmhhbmRsZU9uVHJhY2soZXYpO1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uLm9uaWNlY2FuZGlkYXRlID0gKGV2KSA9PiB0aGlzLmhhbmRsZUljZUNhbmRpZGF0ZShldik7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24ub25kYXRhY2hhbm5lbCA9IChldikgPT4gdGhpcy5oYW5kbGVEYXRhQ2hhbm5lbChldik7XG4gICAgICAgIHRoaXMuYWdncmVnYXRlZFN0YXRzID0gbmV3IEFnZ3JlZ2F0ZWRTdGF0cygpO1xuICAgICAgICB0aGlzLnByZWZlcnJlZENvZGVjID0gcHJlZmVycmVkQ29kZWM7XG4gICAgICAgIHRoaXMudXBkYXRlQ29kZWNTZWxlY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gb2ZmZXIgZm9yIHRoZSBXZWIgUlRDIGhhbmRzaGFrZSBhbmQgc2VuZCB0aGUgb2ZmZXIgdG8gdGhlIHNpZ25hbGluZyBzZXJ2ZXIgdmlhIHdlYnNvY2tldFxuICAgICAqIEBwYXJhbSBvZmZlck9wdGlvbnMgLSBSVEMgT2ZmZXIgT3B0aW9uc1xuICAgICAqL1xuICAgIGNyZWF0ZU9mZmVyKG9mZmVyT3B0aW9ucywgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnQ3JlYXRlIE9mZmVyJyk7XG4gICAgICAgICAgICBjb25zdCBpc0xvY2FsaG9zdENvbm5lY3Rpb24gPSBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgbG9jYXRpb24uaG9zdG5hbWUgPT09ICcxMjcuMC4wLjEnO1xuICAgICAgICAgICAgY29uc3QgaXNIdHRwc0Nvbm5lY3Rpb24gPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICAgICAgICBsZXQgdXNlTWljID0gY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuVXNlTWljKTtcbiAgICAgICAgICAgIGxldCB1c2VDYW1lcmEgPSBjb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Vc2VDYW1lcmEpO1xuICAgICAgICAgICAgaWYgKCh1c2VNaWMgfHwgdXNlQ2FtZXJhKSAmJiAhKGlzTG9jYWxob3N0Q29ubmVjdGlvbiB8fCBpc0h0dHBzQ29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICB1c2VNaWMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB1c2VDYW1lcmEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoJ01pY3JvcGhvbmUgYW5kIFdlYmNhbSBhY2Nlc3MgaW4gdGhlIGJyb3dzZXIgd2lsbCBub3Qgd29yayBpZiB5b3UgYXJlIG5vdCBvbiBIVFRQUyBvciBsb2NhbGhvc3QuIERpc2FibGluZyBtaWMgYW5kIHdlYmNhbSBhY2Nlc3MuJyk7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKFwiRm9yIHRlc3RpbmcgeW91IGNhbiBlbmFibGUgSFRUUCBtaWNyb3Bob25lIGFjY2VzcyBDaHJvbWUgYnkgdmlzaXRpbmcgY2hyb21lOi8vZmxhZ3MvIGFuZCBlbmFibGluZyAndW5zYWZlbHktdHJlYXQtaW5zZWN1cmUtb3JpZ2luLWFzLXNlY3VyZSdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldHVwVHJhbnNjZWl2ZXJzQXN5bmModXNlTWljLCB1c2VDYW1lcmEpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3JlYXRlT2ZmZXIob2ZmZXJPcHRpb25zKS50aGVuKChvZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5Q29ubmVjdGluZygpO1xuICAgICAgICAgICAgICAgICAgICBvZmZlci5zZHAgPSB0aGlzLm11bmdlU0RQKG9mZmVyLnNkcCwgdXNlTWljKTtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldExvY2FsRGVzY3JpcHRpb24ob2ZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2VuZFdlYlJUQ09mZmVyKG9mZmVyKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5U2V0dXBGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlY2VpdmUgb2ZmZXIgZnJvbSBVRSBzaWRlIGFuZCBwcm9jZXNzIGl0IGFzIHRoZSByZW1vdGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwZWVyIGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICByZWNlaXZlT2ZmZXIob2ZmZXIsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1JlY2VpdmUgT2ZmZXInKTtcbiAgICAgICAgICAgIC8vIElmIFVFIG9yIEpTU3RyZWFtZXIgZGlkIHNlbmQgYWJzLWNhcHR1cmUtdGltZSBSVFAgaGVhZGVyIGV4dGVuc2lvbiB0byBhIG5vbi1DaHJvbWUgYnJvd3NlclxuICAgICAgICAgICAgLy8gdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgU0RQIGJlY2F1c2UgaWYgRmlyZWZveCBkZXRlY3RzIGl0IGluIG9mZmVyIG9yIGFuc3dlciBpdCB3aWxsIGZhaWwgdG8gY29ubmVjdFxuICAgICAgICAgICAgLy8gZHVlIGhhdmluZyAxNSBvciBtb3JlIGhlYWRlciBleHRlbnNpb25zOiBodHRwczovL21haWxhcmNoaXZlLmlldGYub3JnL2FyY2gvbXNnL3J0Y3dlYi9RUm5XTnVXekd1TFJvdldkSGtvZE5QNlZPZ2cvXG4gICAgICAgICAgICBpZiAodGhpcy5pc0ZpcmVmb3goKSkge1xuICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IGE9ZXh0bWFwOjE1IGh0dHA6Ly93d3cud2VicnRjLm9yZy9leHBlcmltZW50cy9ydHAtaGRyZXh0L2Ficy1jYXB0dXJlLXRpbWVcbiAgICAgICAgICAgICAgICBvZmZlci5zZHAgPSBvZmZlci5zZHAucmVwbGFjZSgvXmE9ZXh0bWFwOlxcZCsgaHR0cDpcXC9cXC93d3dcXC53ZWJydGNcXC5vcmdcXC9leHBlcmltZW50c1xcL3J0cC1oZHJleHRcXC9hYnMtY2FwdHVyZS10aW1lXFxyXFxuL2dtLCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEZpcmUgZXZlbnQgZm9yIHdoZW4gcmVtb3RlIG9mZmVyIGRlc2NyaXB0aW9uIGlzIHNldFxuICAgICAgICAgICAgICAgIHRoaXMub25TZXRSZW1vdGVEZXNjcmlwdGlvbihvZmZlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNMb2NhbGhvc3RDb25uZWN0aW9uID0gbG9jYXRpb24uaG9zdG5hbWUgPT09ICdsb2NhbGhvc3QnIHx8IGxvY2F0aW9uLmhvc3RuYW1lID09PSAnMTI3LjAuMC4xJztcbiAgICAgICAgICAgICAgICBjb25zdCBpc0h0dHBzQ29ubmVjdGlvbiA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgICAgICBsZXQgdXNlTWljID0gY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuVXNlTWljKTtcbiAgICAgICAgICAgICAgICBsZXQgdXNlQ2FtZXJhID0gY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuVXNlQ2FtZXJhKTtcbiAgICAgICAgICAgICAgICBpZiAoKHVzZU1pYyB8fCB1c2VDYW1lcmEpICYmICEoaXNMb2NhbGhvc3RDb25uZWN0aW9uIHx8IGlzSHR0cHNDb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICB1c2VNaWMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FtZXJhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcignTWljcm9waG9uZSBhbmQgV2ViY2FtIGFjY2VzcyBpbiB0aGUgYnJvd3NlciB3aWxsIG5vdCB3b3JrIGlmIHlvdSBhcmUgbm90IG9uIEhUVFBTIG9yIGxvY2FsaG9zdC4gRGlzYWJsaW5nIG1pYyBhbmQgd2ViY2FtIGFjY2Vzcy4nKTtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKFwiRm9yIHRlc3RpbmcgeW91IGNhbiBlbmFibGUgSFRUUCBtaWNyb3Bob25lIGFjY2VzcyBDaHJvbWUgYnkgdmlzaXRpbmcgY2hyb21lOi8vZmxhZ3MvIGFuZCBlbmFibGluZyAndW5zYWZlbHktdHJlYXQtaW5zZWN1cmUtb3JpZ2luLWFzLXNlY3VyZSdcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFkZCBvdXIgbGlzdCBvZiBwcmVmZXJyZWQgY29kZWNzLCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ09wdGlvbnMoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYywgdGhpcy5mdXp6eUludGVyc2VjdFVFQW5kQnJvd3NlckNvZGVjcyhvZmZlcikpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBUcmFuc2NlaXZlcnNBc3luYyh1c2VNaWMsIHVzZUNhbWVyYSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNyZWF0ZUFuc3dlcigpLnRoZW4oKEFuc3dlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgQW5zd2VyLnNkcCA9IHRoaXMubXVuZ2VTRFAoQW5zd2VyLnNkcCwgdXNlTWljKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2V0TG9jYWxEZXNjcmlwdGlvbihBbnN3ZXIpO1xuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25TZXRMb2NhbERlc2NyaXB0aW9uKChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jdXJyZW50TG9jYWxEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgY3JlYXRlQW5zd2VyKCkgZmFpbGVkIC0gJHtlcnJ9YCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIFJlbW90ZSBEZXNjcmlwdG9yIGZyb20gdGhlIHNpZ25hbGluZyBzZXJ2ZXIgdG8gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0gYW5zd2VyIC0gUlRDIFNlc3Npb24gRGVzY3JpcHRvciBmcm9tIHRoZSBTaWduYWxpbmcgU2VydmVyXG4gICAgICovXG4gICAgcmVjZWl2ZUFuc3dlcihhbnN3ZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2V0UmVtb3RlRGVzY3JpcHRpb24oYW5zd2VyKTtcbiAgICAgICAgLy8gQWRkIG91ciBsaXN0IG9mIHByZWZlcnJlZCBjb2RlY3MsIGluIG9yZGVyIG9mIHByZWZlcmVuY2VcbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ09wdGlvbnMoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYywgdGhpcy5mdXp6eUludGVyc2VjdFVFQW5kQnJvd3NlckNvZGVjcyhhbnN3ZXIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgQWdncmVnYXRlZCBTdGF0cyBhbmQgdGhlbiBmaXJlIGEgb25WaWRlbyBTdGF0cyBldmVudFxuICAgICAqL1xuICAgIGdlbmVyYXRlU3RhdHMoKSB7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24uZ2V0U3RhdHMoKS50aGVuKChzdGF0c0RhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWdncmVnYXRlZFN0YXRzLnByb2Nlc3NTdGF0cyhzdGF0c0RhdGEpO1xuICAgICAgICAgICAgdGhpcy5vblZpZGVvU3RhdHModGhpcy5hZ2dyZWdhdGVkU3RhdHMpO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGxhdGVuY3kgdXNpbmcgc3RhdHMgYW5kIHZpZGVvIHJlY2VpdmVycyBhbmQgdGhlbiBjYWxsIHRoZSBoYW5kbGluZyBmdW5jdGlvblxuICAgICAgICAgICAgY29uc3QgbGF0ZW5jeUluZm8gPSB0aGlzLmxhdGVuY3lDYWxjdWxhdG9yLmNhbGN1bGF0ZSh0aGlzLmFnZ3JlZ2F0ZWRTdGF0cywgdGhpcy5wZWVyQ29ubmVjdGlvbi5nZXRSZWNlaXZlcnMoKSk7XG4gICAgICAgICAgICB0aGlzLm9uTGF0ZW5jeUNhbGN1bGF0ZWQobGF0ZW5jeUluZm8pO1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwcmVmZXJyZWQgY29kZWMgc2VsZWN0aW9uIGJhc2VkIG9uIHdoYXQgd2FzIGFjdHVhbGx5IG5lZ290aWF0ZWRcbiAgICAgICAgICAgIGlmICh0aGlzLnVwZGF0ZUNvZGVjU2VsZWN0aW9uICYmICEhdGhpcy5hZ2dyZWdhdGVkU3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuY29kZWNJZCkge1xuICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgcXVhbGlmaWVkIGNvZGVjIG5hbWUgZnJvbSB0aGUgbWltZXR5cGUgYW5kIGZtdHBcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlY1N0YXRzID0gdGhpcy5hZ2dyZWdhdGVkU3RhdHMuY29kZWNzLmdldCh0aGlzLmFnZ3JlZ2F0ZWRTdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5jb2RlY0lkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZWNTdGF0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZWNTaG9ydG5hbWUgPSBjb2RlY1N0YXRzLm1pbWVUeXBlLnJlcGxhY2UoJ3ZpZGVvLycsICcnKTtcbiAgICAgICAgICAgICAgICBsZXQgZnVsbENvZGVjTmFtZSA9IGNvZGVjU2hvcnRuYW1lO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlY1N0YXRzLnNkcEZtdHBMaW5lICYmIGNvZGVjU3RhdHMuc2RwRm10cExpbmUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBmdWxsQ29kZWNOYW1lID0gYCR7Y29kZWNTaG9ydG5hbWV9ICR7Y29kZWNTdGF0cy5zZHBGbXRwTGluZS50cmltKCl9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYWxsQnJvd3NlckNvZGVjcyA9IHRoaXMuY29uZmlnLmdldFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYykub3B0aW9ucztcbiAgICAgICAgICAgICAgICAvLyBUaGUgbGlzdCBvZiBjb2RlY3MgZGlyZWN0bHkgY29udGFpbnMgdGhlIG9uZSB0aGF0IHdhcyBuZWdvdGlhdGVkLCBzZWxlY3QgdGhhdFxuICAgICAgICAgICAgICAgIGlmIChhbGxCcm93c2VyQ29kZWNzLmluY2x1ZGVzKGZ1bGxDb2RlY05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE9wdGlvblNldHRpbmdWYWx1ZShPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjLCBmdWxsQ29kZWNOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBtYXRjaCBvbiB0aGUgZnVsbCBuYW1lLCB0cnkgdG8gbWF0Y2ggb24ganVzdCB0aGUgY29kZWMgc2hvcnRuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRMaXN0ID0gYWxsQnJvd3NlckNvZGVjcy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmluZGV4T2YoY29kZWNTaG9ydG5hbWUpICE9PSAtMSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE9wdGlvblNldHRpbmdWYWx1ZShPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjLCBmaWx0ZXJlZExpc3RbMF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgVGhlIFBlZXIgQ29ubmVjdGlvblxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5wZWVyQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTW9kaWZ5IHRoZSBTZXNzaW9uIERlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0gc2RwIC0gU2Vzc2lvbiBEZXNjcmlwdG9yIGFzIGEgc3RyaW5nXG4gICAgICogQHBhcmFtIHVzZU1pYyAtIElzIHRoZSBtaWNyb3Bob25lIGluIHVzZVxuICAgICAqIEByZXR1cm5zIEEgbW9kaWZpZWQgU2Vzc2lvbiBEZXNjcmlwdG9yXG4gICAgICovXG4gICAgbXVuZ2VTRFAoc2RwLCB1c2VNaWMpIHtcbiAgICAgICAgbGV0IG11bmdlZFNEUCA9IHNkcC5yZXBsYWNlKC8oYT1mbXRwOlxcZCsgLipsZXZlbC1hc3ltbWV0cnktYWxsb3dlZD0uKilcXHJcXG4vZ20sICckMTt4LWdvb2dsZS1zdGFydC1iaXRyYXRlPTEwMDAwO3gtZ29vZ2xlLW1heC1iaXRyYXRlPTEwMDAwMFxcclxcbicpO1xuICAgICAgICAvLyBzZXQgbWF4IGJpdHJhdGUgdG8gaGlnaGVzdCBiaXRyYXRlIE9wdXMgc3VwcG9ydHNcbiAgICAgICAgbGV0IGF1ZGlvU0RQID0gJ21heGF2ZXJhZ2ViaXRyYXRlPTUxMDAwMDsnO1xuICAgICAgICBpZiAodXNlTWljKSB7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIG1heCBjYXB0dXJlIHJhdGUgdG8gNDhraHogKHNvIHdlIGNhbiBzZW5kIGhpZ2ggcXVhbGl0eSBhdWRpbyBmcm9tIG1pYylcbiAgICAgICAgICAgIGF1ZGlvU0RQICs9ICdzcHJvcC1tYXhjYXB0dXJlcmF0ZT00ODAwMDsnO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcmNlIG1vbm8gb3Igc3RlcmVvIGJhc2VkIG9uIHdoZXRoZXIgP2ZvcmNlTW9ubyB3YXMgcGFzc2VkIG9yIG5vdFxuICAgICAgICBhdWRpb1NEUCArPSB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkZvcmNlTW9ub0F1ZGlvKSA/ICdzdGVyZW89MDsnIDogJ3N0ZXJlbz0xOyc7XG4gICAgICAgIC8vIGVuYWJsZSBpbi1iYW5kIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiBmb3Igb3B1cyBhdWRpb1xuICAgICAgICBhdWRpb1NEUCArPSAndXNlaW5iYW5kZmVjPTEnO1xuICAgICAgICAvLyBXZSB1c2UgdGhlIGxpbmUgJ3VzZWluYmFuZGZlYz0xJyAod2hpY2ggT3B1cyB1c2VzKSB0byBzZXQgb3VyIE9wdXMgc3BlY2lmaWMgYXVkaW8gcGFyYW1ldGVycy5cbiAgICAgICAgbXVuZ2VkU0RQID0gbXVuZ2VkU0RQLnJlcGxhY2UoJ3VzZWluYmFuZGZlYz0xJywgYXVkaW9TRFApO1xuICAgICAgICAvLyBBZGQgYWJzLWNhcHR1cmUtdGltZSBSVFAgaGVhZGVyIGV4dGVuc2lvbiBpZiB3ZSBoYXZlIGVuYWJsZWQgdGhlIHNldHRpbmcuXG4gICAgICAgIC8vIE5vdGU6IEFzIGF0IEZlYiAyMDI1LCBDaHJvbWl1bSBiYXNlZCBicm93c2VycyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHN1cHBvcnQgdGhpcyBhbmRcbiAgICAgICAgLy8gbXVuZ2luZyBpdCBpbnRvIHRoZSBhbnN3ZXIgaW4gRmlyZWZveCB3aWxsIGNhdXNlIHRoZSBjb25uZWN0aW9uIHRvIGZhaWwuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkVuYWJsZUNhcHR1cmVUaW1lRXh0KSAmJiAhdGhpcy5pc0ZpcmVmb3goKSkge1xuICAgICAgICAgICAgbXVuZ2VkU0RQID0gU0RQVXRpbHMuYWRkVmlkZW9IZWFkZXJFeHRlbnNpb25Ub1NkcChtdW5nZWRTRFAsIGtBYnNDYXB0dXJlVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG11bmdlZFNEUDtcbiAgICB9XG4gICAgaXNGaXJlZm94KCkge1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIGEgSWNlIENhbmRpZGF0ZSBpcyByZWNlaXZlZCBhZGQgdG8gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0gaWNlQ2FuZGlkYXRlIC0gUlRDIEljZSBDYW5kaWRhdGUgZnJvbSB0aGUgU2lnbmFsaW5nIFNlcnZlclxuICAgICAqL1xuICAgIGhhbmRsZU9uSWNlKGljZUNhbmRpZGF0ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIExvZ2dlci5JbmZvKCdwZWVyY29ubmVjdGlvbiBoYW5kbGVPbkljZScpO1xuICAgICAgICAvLyAvLyBpZiBmb3JjaW5nIFRVUk4sIHJlamVjdCBhbnkgY2FuZGlkYXRlcyBub3QgcmVsYXlcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuRm9yY2VUVVJOKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgbm8gcmVsYXkgYWRkcmVzcyBpcyBmb3VuZCwgaWYgc28sIHdlIGFyZSBhc3N1bWluZyBpdCBtZWFucyBubyBUVVJOIHNlcnZlclxuICAgICAgICAgICAgaWYgKGljZUNhbmRpZGF0ZS5jYW5kaWRhdGUuaW5kZXhPZigncmVsYXknKSA8IDApIHtcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbyhgRHJvcHBpbmcgY2FuZGlkYXRlIGJlY2F1c2UgaXQgd2FzIG5vdCBUVVJOIHJlbGF5LiB8IFR5cGU9ICR7aWNlQ2FuZGlkYXRlLnR5cGV9IHwgUHJvdG9jb2w9ICR7aWNlQ2FuZGlkYXRlLnByb3RvY29sfSB8IEFkZHJlc3M9JHtpY2VDYW5kaWRhdGUuYWRkcmVzc30gfCBQb3J0PSR7aWNlQ2FuZGlkYXRlLnBvcnR9IHxgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKF9hID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFkZEljZUNhbmRpZGF0ZShpY2VDYW5kaWRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBSVEMgUGVlciBDb25uZWN0aW9uIFNpZ25hbGluZyBzZXJ2ZXIgc3RhdGUgQ2hhbmdlc1xuICAgICAqIEBwYXJhbSBzdGF0ZSAtIFNpZ25hbGluZyBTZXJ2ZXIgU3RhdGUgQ2hhbmdlIEV2ZW50XG4gICAgICovXG4gICAgaGFuZGxlU2lnbmFsU3RhdGVDaGFuZ2Uoc3RhdGUpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ3NpZ25hbGluZyBzdGF0ZSBjaGFuZ2U6ICcgKyBzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB3aGVuIHRoZSBJY2UgQ29ubmVjdGlvbiBTdGF0ZSBDaGFuZ2VzXG4gICAgICogQHBhcmFtIHN0YXRlIC0gSWNlIENvbm5lY3Rpb24gU3RhdGVcbiAgICAgKi9cbiAgICBoYW5kbGVJY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2Uoc3RhdGUpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ2ljZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZTogJyArIHN0YXRlKTtcbiAgICAgICAgdGhpcy5vbkljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB3aGVuIHRoZSBJY2UgR2F0aGVyaW5nIFN0YXRlIENoYW5nZXNcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBJY2UgR2F0aGVyaW5nIFN0YXRlIENoYW5nZVxuICAgICAqL1xuICAgIGhhbmRsZUljZUdhdGhlcmluZ1N0YXRlQ2hhbmdlKHN0YXRlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdpY2UgZ2F0aGVyaW5nIHN0YXRlIGNoYW5nZTogJyArIEpTT04uc3RyaW5naWZ5KHN0YXRlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgb25UcmFjayBtZXRob2RcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgd2ViUnRjIHRyYWNrIGV2ZW50XG4gICAgICovXG4gICAgaGFuZGxlT25UcmFjayhldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuc3RyZWFtcy5sZW5ndGggPCAxIHx8IGV2ZW50LnN0cmVhbXNbMF0uaWQgPT0gJ3Byb2JhdG9yJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50cmFjay5raW5kID09ICd2aWRlbycpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9UcmFjayA9IGV2ZW50LnRyYWNrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50cmFjay5raW5kID09ICdhdWRpbycpIHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9UcmFjayA9IGV2ZW50LnRyYWNrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25UcmFjayhldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgb25QZWVySWNlQ2FuZGlkYXRlXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHBlZXIgaWNlIGNhbmRpZGF0ZVxuICAgICAqL1xuICAgIGhhbmRsZUljZUNhbmRpZGF0ZShldmVudCkge1xuICAgICAgICB0aGlzLm9uUGVlckljZUNhbmRpZGF0ZShldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgb25EYXRhQ2hhbm5lbFxuICAgICAqIEBwYXJhbSBldmVudCAtIFRoZSBwZWVyJ3MgZGF0YSBjaGFubmVsXG4gICAgICovXG4gICAgaGFuZGxlRGF0YUNoYW5uZWwoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbkRhdGFDaGFubmVsKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3ZlcnJpZGUgbWV0aG9kIGZvciBvblRyYWNrIGZvciB1c2Ugb3V0c2lkZSBvZiB0aGUgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyXG4gICAgICogQHBhcmFtIHRyYWNrRXZlbnQgLSBUaGUgd2ViUnRjIHRyYWNrIGV2ZW50XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uVHJhY2sodHJhY2tFdmVudCkge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3ZlcnJpZGUgbWV0aG9kIGZvciBvbkljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSBmb3IgdXNlIG91dHNpZGUgb2YgdGhlIFBlZXJDb25uZWN0aW9uQ29udHJvbGxlclxuICAgICAqIEBwYXJhbSBldmVudCAtIFRoZSB3ZWJSdGMgaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlIGV2ZW50XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uSWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvdmVycmlkZSBtZXRob2QgZm9yIG9uUGVlckljZUNhbmRpZGF0ZSBmb3IgdXNlIG91dHNpZGUgb2YgdGhlIFBlZXJDb25uZWN0aW9uQ29udHJvbGxlclxuICAgICAqIEBwYXJhbSBwZWVyQ29ubmVjdGlvbkljZUV2ZW50IC0gVGhlIHBlZXIgaWNlIGNhbmRpZGF0ZVxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblBlZXJJY2VDYW5kaWRhdGUocGVlckNvbm5lY3Rpb25JY2VFdmVudCkge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3ZlcnJpZGUgbWV0aG9kIGZvciBvbkRhdGFDaGFubmVsIGZvciB1c2Ugb3V0c2lkZSBvZiB0aGUgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyXG4gICAgICogQHBhcmFtIGRhdGFjaGFubmVsRXZlbnQgLSBUaGUgcGVlcidzIGRhdGEgY2hhbm5lbFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvbkRhdGFDaGFubmVsKGRhdGFjaGFubmVsRXZlbnQpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIFVFIGFuZCBicm93c2VyIGNvZGVjcywgd2l0aCBmdXp6eSBtYXRjaGluZyBpZiBzb21lIHBhcmFtZXRlcnMgYXJlIG1pc21hdGNoZWQuXG4gICAgICogQHBhcmFtIHNkcCBUaGUgcmVtb3RlIHNkcFxuICAgICAqIEByZXR1cm5zIFRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiBicm93c2VyIHN1cHBvcnRlZCBjb2RlY3MgYW5kIHVlIHN1cHBvcnRlZCBjb2RlY3MuXG4gICAgICovXG4gICAgZnV6enlJbnRlcnNlY3RVRUFuZEJyb3dzZXJDb2RlY3Moc2RwKSB7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYnVpbGQgYW4gYXJyYXkgb2YgYWxsIHN1cHBvcnRlZCBjb2RlY3Mgb24gYm90aCBzaWRlc1xuICAgICAgICBjb25zdCBhbGxTdXBwb3J0ZWRDb2RlY3MgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgY29uc3QgYWxsVUVDb2RlY3MgPSB0aGlzLnBhcnNlQXZhaWxhYmxlQ29kZWNzKHNkcCk7XG4gICAgICAgIGNvbnN0IGFsbEJyb3dzZXJDb2RlY3MgPSB0aGlzLmNvbmZpZy5nZXRTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMpLm9wdGlvbnM7XG4gICAgICAgIGZvciAoY29uc3QgdWVDb2RlYyBvZiBhbGxVRUNvZGVjcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYnJvd3NlciBjb2RlY3MgZGlyZWN0bHkgbWF0Y2hlcyBVRSBjb2RlYyAod2l0aCBwYXJhbWV0ZXJzIGFuZCBldmVyeXRoaW5nKVxuICAgICAgICAgICAgaWYgKGFsbEJyb3dzZXJDb2RlY3MuaW5jbHVkZXModWVDb2RlYykpIHtcbiAgICAgICAgICAgICAgICBhbGxTdXBwb3J0ZWRDb2RlY3MucHVzaCh1ZUNvZGVjKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBpZiBicm93c2VyIGNvZGVjIGF0IGxlYXN0IGNvbnRhaW5zIGEgbWF0Y2ggZm9yIHRoZSBVRSBjb2RlYyBuYW1lICh3aXRob3V0IHBhcmFtZXRlcnMpLlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdWVDb2RlY05hbWVBbmRQYXJhbXMgPSB1ZUNvZGVjLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdWVDb2RlY05hbWUgPSB1ZUNvZGVjTmFtZUFuZFBhcmFtc1swXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGJyb3dzZXJDb2RlYyBvZiBhbGxCcm93c2VyQ29kZWNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChicm93c2VyQ29kZWMuaW5jbHVkZXModWVDb2RlY05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBwYXNzIGJyb3dzZXIgY29kZWMgaGVyZSBhcyB0aGV5IG9wdGlvbiBjb250YWluIGV4dHJhIHBhcmFtZXRlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxTdXBwb3J0ZWRDb2RlY3MucHVzaChicm93c2VyQ29kZWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbFN1cHBvcnRlZENvZGVjcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0dXAgdHJhY2tzIG9uIHRoZSBSVEMgUGVlciBDb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHVzZU1pYyAtIGlzIG1pYyBpbiB1c2VcbiAgICAgKiBAcGFyYW0gdXNlQ2FtZXJhIC0gaXMgd2ViY2FtIGluIHVzZVxuICAgICAqL1xuICAgIHNldHVwVHJhbnNjZWl2ZXJzQXN5bmModXNlTWljLCB1c2VDYW1lcmEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2g7XG4gICAgICAgICAgICBsZXQgaGFzVmlkZW9SZWNlaXZlciA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0cmFuc2NlaXZlciBvZiAoX2IgPSAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0VHJhbnNjZWl2ZXJzKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zY2VpdmVyICYmXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyICYmXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrICYmXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrLmtpbmQgPT09ICd2aWRlbycpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzVmlkZW9SZWNlaXZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldHVwIGEgdHJhbnNjZWl2ZXIgZm9yIHNlbmRpbmcgd2ViY2FtIHZpZGVvIHRvIFVFIGFuZCByZWNlaXZpbmcgdmlkZW8gZnJvbSBVRVxuICAgICAgICAgICAgaWYgKCF1c2VDYW1lcmEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc1ZpZGVvUmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgKF9jID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmFkZFRyYW5zY2VpdmVyKCd2aWRlbycsIHsgZGlyZWN0aW9uOiAncmVjdm9ubHknIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc2V0dXBWaWRlb1NlbmRlcihoYXNWaWRlb1JlY2VpdmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMgJiYgdGhpcy5wcmVmZXJyZWRDb2RlYyAhPSAnJykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdHJhbnNjZWl2ZXIgb2YgKF9lID0gKF9kID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmdldFRyYW5zY2VpdmVycygpKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBbXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlci50cmFjayAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sua2luZCA9PT0gJ3ZpZGVvJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2V0Q29kZWNQcmVmZXJlbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IG91ciBwcmVmZXJyZWQgY29kZWMgZnJvbSB0aGUgY29kZWNzIG9wdGlvbnMgZHJvcCBkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmVmZXJyZWRSVFBDb2RlYyA9IHRoaXMucHJlZmVycmVkQ29kZWMuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZlcnJlZFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZTogJ3ZpZGVvLycgKyBwcmVmZXJyZWRSVFBDb2RlY1swXSAvKiBOYW1lICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrUmF0ZTogOTAwMDAgLyogQWxsIGN1cnJlbnQgdmlkZW8gZm9ybWF0cyBpbiBicm93c2VycyBoYXZlIDkwa2h6IGNsb2NrIHJhdGUgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RwRm10cExpbmU6IHByZWZlcnJlZFJUUENvZGVjWzFdID8gcHJlZmVycmVkUlRQQ29kZWNbMV0gOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIGEgbGlzdCBvZiBjb2RlY3Mgd2Ugd2lsbCBzdXBwb3J0IHdpdGggb3VyIHByZWZlcnJlZCBvbmUgaW4gdGhlIGZpcnN0IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXJTdXBwb3J0ZWRDb2RlY3MgPSBbcHJlZmVycmVkUlRDUnRwQ29kZWNDYXBhYmlsaXR5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIGNvZGVjcyB0aGUgYnJvd3NlciBzdXBwb3J0cyBhbmQgYWRkIHRoZW0gdG8gdGhlIGxpc3QgKGluIGFueSBvcmRlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIFJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcygndmlkZW8nKS5jb2RlY3MuZm9yRWFjaCgoYnJvd3NlclN1cHBvcnRlZENvZGVjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWRkIG91ciBwcmVmZXJyZWQgY29kZWMgYWdhaW4sIGJ1dCBhZGQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyb3dzZXJTdXBwb3J0ZWRDb2RlYy5taW1lVHlwZSAhPSBwcmVmZXJyZWRSVENSdHBDb2RlY0NhcGFiaWxpdHkubWltZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyU3VwcG9ydGVkQ29kZWNzLnB1c2goYnJvd3NlclN1cHBvcnRlZENvZGVjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGJyb3dzZXJTdXBwb3J0ZWRDb2RlYyA9PT0gbnVsbCB8fCBicm93c2VyU3VwcG9ydGVkQ29kZWMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJyb3dzZXJTdXBwb3J0ZWRDb2RlYy5zZHBGbXRwTGluZSkgIT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZWZlcnJlZFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSA9PT0gbnVsbCB8fCBwcmVmZXJyZWRSVENSdHBDb2RlY0NhcGFiaWxpdHkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByZWZlcnJlZFJUQ1J0cENvZGVjQ2FwYWJpbGl0eS5zZHBGbXRwTGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyU3VwcG9ydGVkQ29kZWNzLnB1c2goYnJvd3NlclN1cHBvcnRlZENvZGVjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29kZWMgb2Ygb3VyU3VwcG9ydGVkQ29kZWNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlYyA9PT0gbnVsbCB8fCBjb2RlYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29kZWMuc2RwRm10cExpbmUpID09PSB1bmRlZmluZWQgfHwgY29kZWMuc2RwRm10cExpbmUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGR5bmFtaWNhbGx5IGFkZCBtZW1iZXJzIHRvIHRoZSBjb2RlYywgc28gaW5zdGVhZCByZW1vdmUgdGhlIGZpZWxkIGlmIGl0J3MgZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvZGVjLnNkcEZtdHBMaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNldENvZGVjUHJlZmVyZW5jZXMob3VyU3VwcG9ydGVkQ29kZWNzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBoYXNBdWRpb1JlY2VpdmVyID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRyYW5zY2VpdmVyIG9mIChfZyA9IChfZiA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5nZXRUcmFuc2NlaXZlcnMoKSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogW10pIHtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sgJiZcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sua2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgICAgICAgICBoYXNBdWRpb1JlY2VpdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0dXAgYSB0cmFuc2NlaXZlciBmb3Igc2VuZGluZyBtaWMgYXVkaW8gdG8gVUUgYW5kIHJlY2VpdmluZyBhdWRpbyBmcm9tIFVFXG4gICAgICAgICAgICBpZiAoIXVzZU1pYykge1xuICAgICAgICAgICAgICAgIGlmICghaGFzQXVkaW9SZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAoX2ggPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2guYWRkVHJhbnNjZWl2ZXIoJ2F1ZGlvJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAncmVjdm9ubHknXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc2V0dXBBdWRpb1NlbmRlcihoYXNBdWRpb1JlY2VpdmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldHVwVmlkZW9TZW5kZXIoaGFzVmlkZW9SZWNlaXZlcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBtZWRpYSBzZW5kIG9wdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhU2VuZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdmlkZW86IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBOb3RlIHVzaW5nIHdlYmNhbSBvbiBhbmRyb2lkIGNocm9tZSByZXF1aXJlcyBTU0wgb3IgY2hyb21lOi8vZmxhZ3MvIFwidW5zYWZlbHktdHJlYXQtaW5zZWN1cmUtb3JpZ2luLWFzLXNlY3VyZVwiXG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSB5aWVsZCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShtZWRpYVNlbmRPcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzVmlkZW9SZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYW5zY2VpdmVyIG9mIChfYiA9IChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRUcmFuc2NlaXZlcnMoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSVENVdGlscy5jYW5UcmFuc2NlaXZlclJlY2VpdmVWaWRlbyh0cmFuc2NlaXZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNrIG9mIHN0cmVhbS5nZXRUcmFja3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sua2luZCAmJiB0cmFjay5raW5kID09ICd2aWRlbycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlci5yZXBsYWNlVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIuZGlyZWN0aW9uID0gJ3NlbmRyZWN2JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0cmFjayBvZiBzdHJlYW0uZ2V0VHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay5raW5kICYmIHRyYWNrLmtpbmQgPT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfYyA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5hZGRUcmFuc2NlaXZlcih0cmFjaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdzZW5kcmVjdidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghaGFzVmlkZW9SZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAoX2QgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuYWRkVHJhbnNjZWl2ZXIoJ3ZpZGVvJywgeyBkaXJlY3Rpb246ICdyZWN2b25seScgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0dXBBdWRpb1NlbmRlcihoYXNBdWRpb1JlY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIGF1ZGlvIG9wdGlvbnMgYmFzZWQgb24gbWljIHVzYWdlXG4gICAgICAgICAgICBjb25zdCBhdWRpb09wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgYXV0b0dhaW5Db250cm9sOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQ6IDEsXG4gICAgICAgICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgICAgICBub2lzZVN1cHByZXNzaW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiA0ODAwMCxcbiAgICAgICAgICAgICAgICBzYW1wbGVTaXplOiAxNixcbiAgICAgICAgICAgICAgICB2b2x1bWU6IDEuMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIHNldCB0aGUgbWVkaWEgc2VuZCBvcHRpb25zXG4gICAgICAgICAgICBjb25zdCBtZWRpYVNlbmRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHZpZGVvOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhdWRpbzogYXVkaW9PcHRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gTm90ZSB1c2luZyBtaWMgb24gYW5kcm9pZCBjaHJvbWUgcmVxdWlyZXMgU1NMIG9yIGNocm9tZTovL2ZsYWdzLyBcInVuc2FmZWx5LXRyZWF0LWluc2VjdXJlLW9yaWdpbi1hcy1zZWN1cmVcIlxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0geWllbGQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobWVkaWFTZW5kT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0F1ZGlvUmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0cmFuc2NlaXZlciBvZiAoX2IgPSAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0VHJhbnNjZWl2ZXJzKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlRDVXRpbHMuY2FuVHJhbnNjZWl2ZXJSZWNlaXZlQXVkaW8odHJhbnNjZWl2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0cmFjayBvZiBzdHJlYW0uZ2V0VHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLmtpbmQgJiYgdHJhY2sua2luZCA9PSAnYXVkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIucmVwbGFjZVRyYWNrKHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9ICdzZW5kcmVjdic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdHJhY2sgb2Ygc3RyZWFtLmdldFRyYWNrcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sua2luZCAmJiB0cmFjay5raW5kID09ICdhdWRpbycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2MgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuYWRkVHJhbnNjZWl2ZXIodHJhY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnc2VuZHJlY3YnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0F1ZGlvUmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgKF9kID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmFkZFRyYW5zY2VpdmVyKCdhdWRpbycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ3JlY3Zvbmx5J1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbmQgb3ZlcnJpZGUgZXZlbnQgZm9yIHdoZW4gdGhlIHZpZGVvIHN0YXRzIGFyZSBmaXJlZFxuICAgICAqIEBwYXJhbSBldmVudCAtIEFnZ3JlZ2F0ZWQgU3RhdHNcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25WaWRlb1N0YXRzKGV2ZW50KSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbmQgb3ZlcnJpZGUgZXZlbnQgZm9yIHdoZW4gbGF0ZW5jeSBpbmZvIGlzIGNhbGN1bGF0ZWRcbiAgICAgKiBAcGFyYW0gbGF0ZW5jeUluZm8gLSBDYWxjdWxhdGVkIGxhdGVuY3kgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uTGF0ZW5jeUNhbGN1bGF0ZWQobGF0ZW5jeUluZm8pIHtcbiAgICAgICAgLy8gRGVmYXVsdCBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV2ZW50IHRvIHNlbmQgdGhlIFJUQyBvZmZlciB0byB0aGUgU2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEBwYXJhbSBvZmZlciAtIFJUQyBPZmZlclxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblNlbmRXZWJSVENPZmZlcihvZmZlcikge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZlbnQgZmlyZWQgd2hlbiByZW1vdGUgb2ZmZXIgZGVzY3JpcHRpb24gaXMgc2V0LlxuICAgICAqIEBwYXJhbSBvZmZlciAtIFJUQyBPZmZlclxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblNldFJlbW90ZURlc2NyaXB0aW9uKG9mZmVyKSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmVudCBmaXJlIHdoZW4gbG9jYWwgZGVzY3JpcHRpb24gYW5zd2VyIGlzIHNldC5cbiAgICAgKiBAcGFyYW0gYW5zd2VyIC0gUlRDIEFuc3dlclxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblNldExvY2FsRGVzY3JpcHRpb24oYW5zd2VyKSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvdmVycmlkZSBmb3Igc2hvd2luZyB0aGUgUGVlciBjb25uZWN0aW9uIGNvbm5lY3RpbmcgT3ZlcmxheVxuICAgICAqL1xuICAgIHNob3dUZXh0T3ZlcmxheUNvbm5lY3RpbmcoKSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvdmVycmlkZSBmb3Igc2hvd2luZyB0aGUgUGVlciBjb25uZWN0aW9uIEZhaWxlZCBvdmVybGF5XG4gICAgICovXG4gICAgc2hvd1RleHRPdmVybGF5U2V0dXBGYWlsdXJlKCkge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgcGFyc2VBdmFpbGFibGVDb2RlY3MocnRjU2Vzc2lvbkRlc2NyaXB0aW9uKSB7XG4gICAgICAgIC8vIE5vIHBvaW50IGluIHVwZGF0aW5nIHRoZSBhdmFpbGFibGUgY29kZWNzIGlmIG9uIEZGXG4gICAgICAgIGlmICghUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzKVxuICAgICAgICAgICAgcmV0dXJuIFsnT25seSBhdmFpbGFibGUgb24gQ2hyb21lJ107XG4gICAgICAgIGNvbnN0IHVlU3VwcG9ydGVkQ29kZWNzID0gW107XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gc3BsaXRTZWN0aW9ucyhydGNTZXNzaW9uRGVzY3JpcHRpb24uc2RwKTtcbiAgICAgICAgLy8gZGlzY2FyZCB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBhcyB3ZSBvbmx5IHdhbnQgbWVkaWEgcmVsYXRlZCBpbmZvXG4gICAgICAgIHNlY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgIHNlY3Rpb25zLmZvckVhY2goKG1lZGlhU2VjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb2RlY3MgfSA9IHBhcnNlUnRwUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24pO1xuICAgICAgICAgICAgLy8gRmlsdGVyIG9ubHkgZm9yIFZQWCAvIEgyNlggLyBBVjFcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXIgPSAvKFZQXFxkfEgyNlxcZHxBVjEpLiovO1xuICAgICAgICAgICAgY29kZWNzLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHIgPSBjLm5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjLnBhcmFtZXRlcnMgfHwge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwKSA9PiBwICsgJz0nICsgYy5wYXJhbWV0ZXJzW3BdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJzsnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG1hdGNoZXIuZXhlYyhzdHIpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYy5uYW1lID09ICdWUDknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVRSBhbnN3ZXJzIGRvbid0IHNwZWNpZnkgcHJvZmlsZSBidXQgd2Uga25vdyB3ZSB3YW50IHByb2ZpbGUgMFxuICAgICAgICAgICAgICAgICAgICAgICAgYy5wYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9maWxlLWlkJzogJzAnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVjU3RyID0gYy5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjLnBhcmFtZXRlcnMgfHwge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocCkgPT4gcCArICc9JyArIGMucGFyYW1ldGVyc1twXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignOycpO1xuICAgICAgICAgICAgICAgICAgICB1ZVN1cHBvcnRlZENvZGVjcy5wdXNoKGNvZGVjU3RyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB1ZVN1cHBvcnRlZENvZGVjcztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogU2Vzc2lvbiBzdGF0aXN0aWNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2Vzc2lvblN0YXRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIENsYXNzIHRvIGhvbGQgdGhlIHN0cmVhbSBzdGF0cyBkYXRhIGNvbWluZyBpbiBmcm9tIHdlYlJ0Y1xuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyZWFtU3RhdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IE9wdGlvblBhcmFtZXRlcnMgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnJztcbmltcG9ydCB7IFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIgfSBmcm9tICcuLi9XZWJSdGNQbGF5ZXIvV2ViUnRjUGxheWVyQ29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGFncywgTnVtZXJpY1BhcmFtZXRlcnMgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IFBpeGVsU3RyZWFtaW5nRXZlbnRFbWl0dGVyLCBJbml0aWFsU2V0dGluZ3NFdmVudCwgTGF0ZW5jeUNhbGN1bGF0ZWRFdmVudCwgTGF0ZW5jeVRlc3RSZXN1bHRFdmVudCwgU3RhdHNSZWNlaXZlZEV2ZW50LCBTdHJlYW1Mb2FkaW5nRXZlbnQsIFN0cmVhbVByZUNvbm5lY3RFdmVudCwgU3RyZWFtUmVjb25uZWN0RXZlbnQsIFN0cmVhbVByZURpc2Nvbm5lY3RFdmVudCwgVmlkZW9FbmNvZGVyQXZnUVBFdmVudCwgVmlkZW9Jbml0aWFsaXplZEV2ZW50LCBXZWJSdGNBdXRvQ29ubmVjdEV2ZW50LCBXZWJSdGNDb25uZWN0ZWRFdmVudCwgV2ViUnRjQ29ubmVjdGluZ0V2ZW50LCBXZWJSdGNEaXNjb25uZWN0ZWRFdmVudCwgV2ViUnRjRmFpbGVkRXZlbnQsIFdlYlJ0Y1NkcEV2ZW50LCBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2VFdmVudCwgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdEV2ZW50LCBQbGF5ZXJDb3VudEV2ZW50LCBXZWJSdGNUQ1BSZWxheURldGVjdGVkRXZlbnQsIFN1YnNjcmliZUZhaWxlZEV2ZW50LCBXZWJSdGNTZHBPZmZlckV2ZW50LCBXZWJSdGNTZHBBbnN3ZXJFdmVudCB9IGZyb20gJy4uL1V0aWwvRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IFdlYlhSQ29udHJvbGxlciB9IGZyb20gJy4uL1dlYlhSL1dlYlhSQ29udHJvbGxlcic7XG5pbXBvcnQgeyBNZXNzYWdlRGlyZWN0aW9uIH0gZnJvbSAnLi4vVWVJbnN0YW5jZU1lc3NhZ2UvU3RyZWFtTWVzc2FnZUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdENvbnRyb2xsZXIgfSBmcm9tICcuLi9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udHJvbGxlcic7XG5pbXBvcnQgeyBSVENVdGlscyB9IGZyb20gJy4uL1V0aWwvUlRDVXRpbHMnO1xuaW1wb3J0IHsgSVVSTFNlYXJjaFBhcmFtcyB9IGZyb20gJy4uL1V0aWwvSVVSTFNlYXJjaFBhcmFtcyc7XG4vKipcbiAqIFRoZSBrZXkgY2xhc3MgZm9yIHRoZSBicm93c2VyIHNpZGUgb2YgYSBQaXhlbCBTdHJlYW1pbmcgYXBwbGljYXRpb24sIGl0IGluY2x1ZGVzOlxuICogV2ViUlRDIGhhbmRsaW5nLCBYUiBzdXBwb3J0LCBpbnB1dCBoYW5kbGluZywgYW5kIGVtaXR0ZXJzIGZvciBsaWZldGltZSBhbmQgc3RhdGUgY2hhbmdlIGV2ZW50cy5cbiAqIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIGNsYXNzIGFzIGlzLCB0aHJvdWdoIGNvbXBvc2l0aW9uLCBvciBleHRlbmQgaXQuIEluIGFueSBjYXNlLFxuICogdGhpcyB3aWxsIGxpa2VseSBiZSB0aGUgY29yZSBvZiB5b3VyIFBpeGVsIFN0cmVhbWluZyBleHBlcmllbmNlIGluIHRlcm1zIG9mIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXhlbFN0cmVhbWluZyB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmZpZyAtIEEgbmV3bHkgaW5zdGFudGlhdGVkIGNvbmZpZyBvYmplY3RcbiAgICAgKiBAcGFyYW0gb3ZlcnJpZGVzIC0gUGFyYW1ldGVycyB0byBvdmVycmlkZSBkZWZhdWx0IGJlaGF2aW91clxuICAgICAqIHJldHVybnMgdGhlIGJhc2UgUGl4ZWwgc3RyZWFtaW5nIG9iamVjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgb3ZlcnJpZGVzKSB7XG4gICAgICAgIHRoaXMuYWxsb3dDb25zb2xlQ29tbWFuZHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIGlmIChvdmVycmlkZXMgPT09IG51bGwgfHwgb3ZlcnJpZGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdmVycmlkZXMudmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLl92aWRlb0VsZW1lbnRQYXJlbnQgPSBvdmVycmlkZXMudmlkZW9FbGVtZW50UGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlciA9IG5ldyBQaXhlbFN0cmVhbWluZ0V2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZVNldHRpbmdzKCk7XG4gICAgICAgIC8vIHNldHVwIFdlYlJUQ1xuICAgICAgICB0aGlzLnNldFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIobmV3IFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIodGhpcy5jb25maWcsIHRoaXMpKTtcbiAgICAgICAgdGhpcy5fd2ViWHJDb250cm9sbGVyID0gbmV3IFdlYlhSQ29udHJvbGxlcih0aGlzLl93ZWJSdGNDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5fc2V0dXBXZWJSdGNUQ1BSZWxheURldGVjdGlvbiA9IHRoaXMuX3NldHVwV2ViUnRjVENQUmVsYXlEZXRlY3Rpb24uYmluZCh0aGlzKTtcbiAgICAgICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgd2ViUnRjQ29ubmVjdGVkIGV2ZW50XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5hZGRFdmVudExpc3RlbmVyKCd3ZWJSdGNDb25uZWN0ZWQnLCAoXykgPT4ge1xuICAgICAgICAgICAgLy8gQmluZCB0byB0aGUgc3RhdHMgcmVjZWl2ZWQgZXZlbnRcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5hZGRFdmVudExpc3RlbmVyKCdzdGF0c1JlY2VpdmVkJywgdGhpcy5fc2V0dXBXZWJSdGNUQ1BSZWxheURldGVjdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHZpZGVvIHN0cmVhbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldCB2aWRlb0VsZW1lbnRQYXJlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLl92aWRlb0VsZW1lbnRQYXJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvRWxlbWVudFBhcmVudC5pZCA9ICd2aWRlb0VsZW1lbnRQYXJlbnQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl92aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGUgc2V0dGluZ3Mgd2l0aCBvbiBjaGFuZ2UgbGlzdGVuZXJzIGFuZCBhbnkgYWRkaXRpb25hbCBwZXIgZXhwZXJpZW5jZSBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBjb25maWd1cmVTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihGbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyLCAod2FudHNRdWFsaXR5Q29udHJvbGxlcikgPT4ge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHNldHRpbmcgaGFzIGJlZW4gc2V0IHRvIHRydWUgKGVpdGhlciBwcm9ncmFtbWF0aWNhbGx5IG9yIHRoZSB1c2VyIGhhcyBmbGlja2VkIHRoZSB0b2dnbGUpXG4gICAgICAgICAgICAvLyBhbmQgd2UgYXJlbid0IGN1cnJlbnRseSBxdWFsaXR5IGNvbnRyb2xsZXIsIHNlbmQgdGhlIHJlcXVlc3RcbiAgICAgICAgICAgIGlmICh3YW50c1F1YWxpdHlDb250cm9sbGVyID09PSB0cnVlICYmICF0aGlzLl93ZWJSdGNDb250cm9sbGVyLmlzUXVhbGl0eUNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRSZXF1ZXN0UXVhbGl0eUNvbnRyb2xPd25lcnNoaXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuQUZLRGV0ZWN0aW9uLCAoaXNBRktFbmFibGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldEFma0VuYWJsZWQoaXNBRktFbmFibGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb24sICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIudXBkYXRlVmlkZW9TdHJlYW1TaXplKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEZsYWdzLkhvdmVyaW5nTW91c2VNb2RlLCAoaXNIb3ZlcmluZ01vdXNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXRGbGFnTGFiZWwoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUsIGBDb250cm9sIFNjaGVtZTogJHtpc0hvdmVyaW5nTW91c2UgPyAnSG92ZXJpbmcnIDogJ0xvY2tlZCd9IE1vdXNlYCk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldE1vdXNlSW5wdXRFbmFibGVkKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuTW91c2VJbnB1dCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gdXNlciBpbnB1dFxuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEZsYWdzLktleWJvYXJkSW5wdXQsIChpc0VuYWJsZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0S2V5Ym9hcmRJbnB1dEVuYWJsZWQoaXNFbmFibGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuTW91c2VJbnB1dCwgKGlzRW5hYmxlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZXRNb3VzZUlucHV0RW5hYmxlZChpc0VuYWJsZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihGbGFncy5GYWtlTW91c2VXaXRoVG91Y2hlcywgKF9pc0Zha2VNb3VzZUVuYWJsZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0VG91Y2hJbnB1dEVuYWJsZWQodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Ub3VjaElucHV0KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEZsYWdzLlRvdWNoSW5wdXQsIChpc0VuYWJsZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0VG91Y2hJbnB1dEVuYWJsZWQoaXNFbmFibGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuR2FtZXBhZElucHV0LCAoaXNFbmFibGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldEdhbWVQYWRJbnB1dEVuYWJsZWQoaXNFbmFibGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGRpcmVjdCBxcCBzZXR0aW5nc1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5NaW5RUCwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0gIFNlbmRpbmcgTWluUVAgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRFbmNvZGVyTWluUVAobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIGNvbnN0IHF1YWxpdHkgPSBNYXRoLnRydW5jKDEwMCAqICgxIC0gbmV3VmFsdWUgLyA1MSkpO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCwgcXVhbGl0eSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5NYXhRUCwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0gIFNlbmRpbmcgTWF4UVAgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRFbmNvZGVyTWF4UVAobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIGNvbnN0IHF1YWxpdHkgPSBNYXRoLnRydW5jKDEwMCAqICgxIC0gbmV3VmFsdWUgLyA1MSkpO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbiwgcXVhbGl0eSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBkaXJlY3QgcXVhbGl0eSBmYWN0b3Igc2V0dGluZ3NcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uTnVtZXJpY1NldHRpbmdDaGFuZ2VkTGlzdGVuZXIoTnVtZXJpY1BhcmFtZXRlcnMuTWluUXVhbGl0eSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0gIFNlbmRpbmcgTWluUXVhbGl0eSAgLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZEVuY29kZXJNaW5RdWFsaXR5KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluLCBuZXdWYWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5LCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyBNYXhRdWFsaXR5ICAtLS0tLS0tLScpO1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kRW5jb2Rlck1heFF1YWxpdHkobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgsIG5ld1ZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG5ldyBxdWFsaXR5IHZhbHVlIHRoYXQgZ2V0cyBzY2FsZWQgdG8gcXAgZm9yIGxlZ2FjeSByZWFzb25zXG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4sIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSA1MSAtIChuZXdWYWx1ZSAvIDEwMCkgKiA1MTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyBNaW5RUCBmcm9tIHF1YWxpdHkgdmFsdWUgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRFbmNvZGVyTWF4UVAobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSA1MSAtIChuZXdWYWx1ZSAvIDEwMCkgKiA1MTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyBNYXhRUCBmcm9tIHF1YWxpdHkgdmFsdWUgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRFbmNvZGVyTWluUVAobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFdlYlJUQyBzZXR0aW5nc1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyB3ZWIgcnRjIHNldHRpbmdzICAtLS0tLS0tLScpO1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kV2ViUlRDTWluQml0cmF0ZShuZXdWYWx1ZSAqIDEwMDAgLyoga2JwcyB0byBicHMgKi8pO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tICBTZW5kaW5nIHdlYiBydGMgc2V0dGluZ3MgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRXZWJSVENNYXhCaXRyYXRlKG5ld1ZhbHVlICogMTAwMCAvKiBrYnBzIHRvIGJwcyAqLyk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uTnVtZXJpY1NldHRpbmdDaGFuZ2VkTGlzdGVuZXIoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyB3ZWIgcnRjIHNldHRpbmdzICAtLS0tLS0tLScpO1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kV2ViUlRDRnBzKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25PcHRpb25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldFByZWZlcnJlZENvZGVjKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9yZWdpc3Rlck9uQ2hhbmdlRXZlbnRzKHRoaXMuX2V2ZW50RW1pdHRlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgaW5wdXQgY29udHJvbCBvd25lcnNoaXBcbiAgICAgKiBAcGFyYW0gaW5wdXRDb250cm9sT3duZXJzaGlwIC0gZG9lcyB0aGUgdXNlciBoYXZlIGlucHV0IGNvbnRyb2wgb3duZXJzaGlwXG4gICAgICovXG4gICAgX29uSW5wdXRDb250cm9sT3duZXJzaGlwKGlucHV0Q29udHJvbE93bmVyc2hpcCkge1xuICAgICAgICB0aGlzLl9pbnB1dENvbnRyb2xsZXIgPSBpbnB1dENvbnRyb2xPd25lcnNoaXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc3RhbnRpYXRlIHRoZSBXZWJSVENQbGF5ZXJDb250cm9sbGVyIGludGVyZmFjZSB0byBwcm92aWRlIFdlYlJUQ1BsYXllckNvbnRyb2xsZXIgZnVuY3Rpb25hbGl0eSB3aXRoaW4gdGhpcyBjbGFzcyBhbmQgc2V0IHVwIGFueXRoaW5nIHRoYXQgcmVxdWlyZXMgaXRcbiAgICAgKiBAcGFyYW0gd2ViUnRjUGxheWVyQ29udHJvbGxlciAtIGEgV2ViUnRjUGxheWVyQ29udHJvbGxlciBjb250cm9sbGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0V2ViUnRjUGxheWVyQ29udHJvbGxlcih3ZWJSdGNQbGF5ZXJDb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIgPSB3ZWJSdGNQbGF5ZXJDb250cm9sbGVyO1xuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldFByZWZlcnJlZENvZGVjKHRoaXMuY29uZmlnLmdldFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYykuc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgICAgIC8vIGNvbm5lY3QgaWYgYXV0byBjb25uZWN0IGZsYWcgaXMgZW5hYmxlZFxuICAgICAgICB0aGlzLmNoZWNrRm9yQXV0b0Nvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byBzaWduYWxpbmcgc2VydmVyLlxuICAgICAqL1xuICAgIGNvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTdHJlYW1QcmVDb25uZWN0RXZlbnQoKSk7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuY29ubmVjdFRvU2lnbmFsbGluZ1NlcnZlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWNvbm5lY3RzIHRvIHRoZSBzaWduYWxpbmcgc2VydmVyLiBJZiBjb25uZWN0aW9uIGlzIHVwLCBkaXNjb25uZWN0cyBmaXJzdFxuICAgICAqIGJlZm9yZSBlc3RhYmxpc2hpbmcgYSBuZXcgY29ubmVjdGlvblxuICAgICAqL1xuICAgIHJlY29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFN0cmVhbVJlY29ubmVjdEV2ZW50KCkpO1xuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnRyeVJlY29ubmVjdCgnUmVjb25uZWN0aW5nLi4uJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgc2lnbmFsaW5nIHNlcnZlciBhbmQgY2xvc2Ugb3BlbiBwZWVyIGNvbm5lY3Rpb25zLlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTdHJlYW1QcmVEaXNjb25uZWN0RXZlbnQoKSk7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgc3RyZWFtLiBDYW4gYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYSBwZWVyIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgcGxheSgpIHtcbiAgICAgICAgdGhpcy5fb25TdHJlYW1Mb2FkaW5nKCk7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIucGxheVN0cmVhbSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdXRvIGNvbm5lY3QgaWYgQXV0b0Nvbm5lY3QgZmxhZyBpcyBlbmFibGVkXG4gICAgICovXG4gICAgY2hlY2tGb3JBdXRvQ29ubmVjdCgpIHtcbiAgICAgICAgLy8gc2V0IHVwIGlmIHRoZSBhdXRvIHBsYXkgd2lsbCBiZSB1c2VkIG9yIHJlZ3VsYXIgY2xpY2sgdG8gc3RhcnRcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQXV0b0Nvbm5lY3QpKSB7XG4gICAgICAgICAgICAvLyBpZiBhdXRvcGxheWluZyBzaG93IGFuIGluZm8gb3ZlcmxheSB3aGlsZSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgY29ubmVjdGlvbiB0byBiZWdpblxuICAgICAgICAgICAgdGhpcy5fb25XZWJSdGNBdXRvQ29ubmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5jb25uZWN0VG9TaWduYWxsaW5nU2VydmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV2lsbCB1bm11dGUgdGhlIG1pY3JvcGhvbmUgdHJhY2sgd2hpY2ggaXMgc2VudCB0byBVbnJlYWwgRW5naW5lLlxuICAgICAqIEJ5IGRlZmF1bHQsIHdpbGwgb25seSB1bm11dGUgYW4gZXhpc3RpbmcgbWljIHRyYWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvcmNlRW5hYmxlIENhbiBiZSB1c2VkIGZvciBjYXNlcyB3aGVuIHRoaXMgb2JqZWN0IHdhc24ndCBpbml0aWFsaXplZCB3aXRoIGEgbWljIHRyYWNrLlxuICAgICAqIElmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgcmVzdGFydGVkIHdpdGggYSBtaWNyb3Bob25lLlxuICAgICAqIFdhcm5pbmc6IHRoaXMgdGFrZXMgc29tZSB0aW1lLCBhcyBhIGZ1bGwgcmVuZWdvdGlhdGlvbiBhbmQgcmVjb25uZWN0aW9uIHdpbGwgaGFwcGVuLlxuICAgICAqL1xuICAgIHVubXV0ZU1pY3JvcGhvbmUoZm9yY2VFbmFibGUgPSBmYWxzZSkge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGV4aXN0aW5nIG1pYyB0cmFjaywgd2UganVzdCBzZXQgbXV0ZWQgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoJ1VzZU1pYycpKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1pY3JvcGhvbmVNdXRlZChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBwcmUtZXhpc3RpbmcgbWljIHRyYWNrLCBhbmQgY2FsbGVyIGlzIG9rIHdpdGggZnVsbCByZXNldCwgd2UgZW5hYmxlIGFuZCByZXNldFxuICAgICAgICBpZiAoZm9yY2VFbmFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldEZsYWdFbmFibGVkKCdVc2VNaWMnLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgcHJlZmVyIG5vdCB0byBmb3JjZSBhIHJlY29ubmVjdGlvbiwganVzdCB3YXJuIHRoZSB1c2VyIHRoYXQgdGhpcyBvcGVyYXRpb24gZGlkbid0IGhhcHBlblxuICAgICAgICBMb2dnZXIuV2FybmluZygnVHJ5aW5nIHRvIHVubXV0ZSBtaWMsIGJ1dCBQaXhlbFN0cmVhbWluZyB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBubyBtaWNyb3Bob25lIHRyYWNrLiBDYWxsIHdpdGggZm9yY2VFbmFibGUgPT0gdHJ1ZSB0byByZS1jb25uZWN0IHdpdGggYSBtaWMgdHJhY2suJyk7XG4gICAgfVxuICAgIG11dGVNaWNyb3Bob25lKCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZCgnVXNlTWljJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TWljcm9waG9uZU11dGVkKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhc24ndCBhIG1pYyB0cmFjaywganVzdCBsZXQgdXNlciBrbm93IHRoZXJlJ3Mgbm90aGluZyB0byBtdXRlXG4gICAgICAgIExvZ2dlci5JbmZvKCdUcnlpbmcgdG8gbXV0ZSBtaWMsIGJ1dCBQaXhlbFN0cmVhbWluZyBoYXMgbm8gbWljcm9waG9uZSB0cmFjaywgc28gc2VuZGluZyBzb3VuZCBpcyBhbHJlYWR5IGRpc2FibGVkLicpO1xuICAgIH1cbiAgICBzZXRNaWNyb3Bob25lTXV0ZWQobXV0ZSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGZvciAoY29uc3QgdHJhbnNjZWl2ZXIgb2YgKF9kID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5fd2ViUnRjQ29udHJvbGxlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZ2V0VHJhbnNjZWl2ZXJzKCkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFtdKSB7XG4gICAgICAgICAgICBpZiAoUlRDVXRpbHMuY2FuVHJhbnNjZWl2ZXJTZW5kQXVkaW8odHJhbnNjZWl2ZXIpKSB7XG4gICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2VuZGVyLnRyYWNrLmVuYWJsZWQgPSAhbXV0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaWxsIHVubXV0ZSB0aGUgdmlkZW8gdHJhY2sgd2hpY2ggaXMgc2VudCB0byBVbnJlYWwgRW5naW5lLlxuICAgICAqIEJ5IGRlZmF1bHQsIHdpbGwgb25seSB1bm11dGUgYW4gZXhpc3RpbmcgdmlkZW8gdHJhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9yY2VFbmFibGUgQ2FuIGJlIHVzZWQgZm9yIGNhc2VzIHdoZW4gdGhpcyBvYmplY3Qgd2Fzbid0IGluaXRpYWxpemVkIHdpdGggYSB2aWRlbyB0cmFjay5cbiAgICAgKiBJZiB0aGlzIHBhcmFtZXRlciBpcyB0cnVlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIHJlc3RhcnRlZCB3aXRoIGEgY2FtZXJhLlxuICAgICAqIFdhcm5pbmc6IHRoaXMgdGFrZXMgc29tZSB0aW1lLCBhcyBhIGZ1bGwgcmVuZWdvdGlhdGlvbiBhbmQgcmVjb25uZWN0aW9uIHdpbGwgaGFwcGVuLlxuICAgICAqL1xuICAgIHVubXV0ZUNhbWVyYShmb3JjZUVuYWJsZSA9IGZhbHNlKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgdmlkZW8gdHJhY2ssIHdlIGp1c3Qgc2V0IG11dGVkIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKCdVc2VDYW1lcmEnKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDYW1lcmFNdXRlZChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBwcmUtZXhpc3RpbmcgdmlkZW8gdHJhY2ssIGFuZCBjYWxsZXIgaXMgb2sgd2l0aCBmdWxsIHJlc2V0LCB3ZSBlbmFibGUgYW5kIHJlc2V0XG4gICAgICAgIGlmIChmb3JjZUVuYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0RmxhZ0VuYWJsZWQoJ1VzZUNhbWVyYScsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBwcmVmZXIgbm90IHRvIGZvcmNlIGEgcmVjb25uZWN0aW9uLCBqdXN0IHdhcm4gdGhlIHVzZXIgdGhhdCB0aGlzIG9wZXJhdGlvbiBkaWRuJ3QgaGFwcGVuXG4gICAgICAgIExvZ2dlci5XYXJuaW5nKCdUcnlpbmcgdG8gdW5tdXRlIHZpZGVvLCBidXQgUGl4ZWxTdHJlYW1pbmcgd2FzIGluaXRpYWxpemVkIHdpdGggbm8gdmlkZW8gdHJhY2suIENhbGwgd2l0aCBmb3JjZUVuYWJsZSA9PSB0cnVlIHRvIHJlLWNvbm5lY3Qgd2l0aCBhIHZpZGVvIHRyYWNrLicpO1xuICAgIH1cbiAgICBtdXRlQ2FtZXJhKCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZCgnVXNlQ2FtZXJhJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FtZXJhTXV0ZWQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2Fzbid0IGEgbWljIHRyYWNrLCBqdXN0IGxldCB1c2VyIGtub3cgdGhlcmUncyBub3RoaW5nIHRvIG11dGVcbiAgICAgICAgTG9nZ2VyLkluZm8oJ1RyeWluZyB0byBtdXRlIGNhbWVyYSwgYnV0IFBpeGVsU3RyZWFtaW5nIGhhcyBubyB2aWRlbyB0cmFjaywgc28gc2VuZGluZyB2aWRlbyBpcyBhbHJlYWR5IGRpc2FibGVkLicpO1xuICAgIH1cbiAgICBzZXRDYW1lcmFNdXRlZChtdXRlKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc2NlaXZlciBvZiAoX2QgPSAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLl93ZWJSdGNDb250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGVlckNvbm5lY3Rpb25Db250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5nZXRUcmFuc2NlaXZlcnMoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogW10pIHtcbiAgICAgICAgICAgIGlmIChSVENVdGlscy5jYW5UcmFuc2NlaXZlclNlbmRWaWRlbyh0cmFuc2NlaXZlcikpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIudHJhY2suZW5hYmxlZCA9ICFtdXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGVtaXQgYW4gZXZlbnQgd2hlbiBhdXRvIGNvbm5lY3Rpbmcgb2NjdXJzXG4gICAgICovXG4gICAgX29uV2ViUnRjQXV0b0Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNBdXRvQ29ubmVjdEV2ZW50KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBlbWl0IGFuIGV2ZW50IGZvciB3aGVuIFNEUCBuZWdvdGlhdGlvbiBpcyBmdWxseSBmaW5pc2hlZC5cbiAgICAgKi9cbiAgICBfb25XZWJSdGNTZHAoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNTZHBFdmVudCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZW1pdCBhbiBTRFAgb2ZmZXIgYWZ0ZXIgaXQgaGFzIGJlZW4gc2V0LlxuICAgICAqL1xuICAgIF9vbldlYlJ0Y1NkcE9mZmVyKG9mZmVyKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNTZHBPZmZlckV2ZW50KHsgc2RwOiBvZmZlciB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGVtaXQgYW4gU0RQIGFuc3dlciBhZnRlciBpdCBoYXMgYmVlbiBzZXQuXG4gICAgICovXG4gICAgX29uV2ViUnRjU2RwQW5zd2VyKGFuc3dlcikge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgV2ViUnRjU2RwQW5zd2VyRXZlbnQoeyBzZHA6IGFuc3dlciB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIGNhbGwgdG8gZW1pdCBhIGBsYXRlbmN5Q2FsY3VsYXRlZGAgZXZlbnQuXG4gICAgICovXG4gICAgX29uTGF0ZW5jeUNhbGN1bGF0ZWQobGF0ZW5jeUluZm8pIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IExhdGVuY3lDYWxjdWxhdGVkRXZlbnQoeyBsYXRlbmN5SW5mbyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGVtaXRzIGEgU3RyZWFtTG9hZGluZyBldmVudFxuICAgICAqL1xuICAgIF9vblN0cmVhbUxvYWRpbmcoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTdHJlYW1Mb2FkaW5nRXZlbnQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIHZpZGVvIGlzIGRpc2Nvbm5lY3RlZCAtIGVtaXRzIGdpdmVuIGV2ZW50U3RyaW5nIG9yIGFuIG92ZXJyaWRlXG4gICAgICogbWVzc2FnZSBmcm9tIHdlYlJ0Y0NvbnRyb2xsZXIgaWYgb25lIGhhcyBiZWVuIHNldFxuICAgICAqIEBwYXJhbSBldmVudFN0cmluZyAtIGEgc3RyaW5nIGRlc2NyaWJpbmcgd2h5IHRoZSBjb25uZWN0aW9uIGNsb3NlZFxuICAgICAqIEBwYXJhbSBhbGxvd0NsaWNrVG9SZWNvbm5lY3QgLSB0cnVlIGlmIHdlIHdhbnQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gcmV0cnkgdGhlIGNvbm5lY3Rpb24gd2l0aCBhIGNsaWNrXG4gICAgICovXG4gICAgX29uRGlzY29ubmVjdChldmVudFN0cmluZywgYWxsb3dDbGlja1RvUmVjb25uZWN0KSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNEaXNjb25uZWN0ZWRFdmVudCh7XG4gICAgICAgICAgICBldmVudFN0cmluZzogZXZlbnRTdHJpbmcsXG4gICAgICAgICAgICBhbGxvd0NsaWNrVG9SZWNvbm5lY3Q6IGFsbG93Q2xpY2tUb1JlY29ubmVjdFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBXZWIgUnRjIGlzIGNvbm5lY3RpbmdcbiAgICAgKi9cbiAgICBfb25XZWJSdGNDb25uZWN0aW5nKCkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgV2ViUnRjQ29ubmVjdGluZ0V2ZW50KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gV2ViIFJ0YyBoYXMgY29ubmVjdGVkXG4gICAgICovXG4gICAgX29uV2ViUnRjQ29ubmVjdGVkKCkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgV2ViUnRjQ29ubmVjdGVkRXZlbnQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBXZWIgUnRjIGZhaWxzIHRvIGNvbm5lY3RcbiAgICAgKi9cbiAgICBfb25XZWJSdGNGYWlsZWQoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNGYWlsZWRFdmVudCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIHdoZW4gdGhlIFZpZGVvIGhhcyBiZWVuIEluaXRpYWxpemVkXG4gICAgICovXG4gICAgX29uVmlkZW9Jbml0aWFsaXplZCgpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFZpZGVvSW5pdGlhbGl6ZWRFdmVudCgpKTtcbiAgICAgICAgdGhpcy5fdmlkZW9TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiByZWNlaXZpbmcgbGF0ZW5jeSB0ZXN0IHJlc3VsdHNcbiAgICAgKiBAcGFyYW0gbGF0ZW5jeSAtIGxhdGVuY3kgdGVzdCByZXN1bHRzIG9iamVjdFxuICAgICAqL1xuICAgIF9vbkxhdGVuY3lUZXN0UmVzdWx0KGxhdGVuY3lUaW1pbmdzKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBMYXRlbmN5VGVzdFJlc3VsdEV2ZW50KHsgbGF0ZW5jeVRpbWluZ3MgfSkpO1xuICAgIH1cbiAgICBfb25EYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IERhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZUV2ZW50KHsgcmVzcG9uc2UgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiByZWNlaXZpbmcgdmlkZW8gc3RhdGlzdGljc1xuICAgICAqIEBwYXJhbSB2aWRlb1N0YXRzIC0gdmlkZW8gc3RhdGlzdGljcyBhcyBhIGFnZ3JlZ2F0ZSBzdGF0cyBvYmplY3RcbiAgICAgKi9cbiAgICBfb25WaWRlb1N0YXRzKHZpZGVvU3RhdHMpIHtcbiAgICAgICAgLy8gRHVyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLl92aWRlb1N0YXJ0VGltZSB8fCB0aGlzLl92aWRlb1N0YXJ0VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl92aWRlb1N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmlkZW9TdGF0cy5oYW5kbGVTZXNzaW9uU3RhdGlzdGljcyh0aGlzLl92aWRlb1N0YXJ0VGltZSwgdGhpcy5faW5wdXRDb250cm9sbGVyLCB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnZpZGVvQXZnUXApO1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU3RhdHNSZWNlaXZlZEV2ZW50KHsgYWdncmVnYXRlZFN0YXRzOiB2aWRlb1N0YXRzIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHVwIGZ1bmN0aW9uYWxpdHkgdG8gaGFwcGVuIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGF2ZXJhZ2UgdmlkZW8gZW5jb2RlciBxcFxuICAgICAqIEBwYXJhbSBRUCAtIHRoZSBxdWFsaXR5IG51bWJlciBvZiB0aGUgc3RyZWFtXG4gICAgICovXG4gICAgX29uVmlkZW9FbmNvZGVyQXZnUVAoUVApIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFZpZGVvRW5jb2RlckF2Z1FQRXZlbnQoeyBhdmdRUDogUVAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiByZWNlaXZpbmcgYW5kIGhhbmRsaW5nIGluaXRpYWwgc2V0dGluZ3MgZm9yIHRoZSBVRSBhcHBcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBpbml0aWFsIFVFIGFwcCBzZXR0aW5nc1xuICAgICAqL1xuICAgIF9vbkluaXRpYWxTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBJbml0aWFsU2V0dGluZ3NFdmVudCh7IHNldHRpbmdzIH0pKTtcbiAgICAgICAgaWYgKHNldHRpbmdzLlBpeGVsU3RyZWFtaW5nU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dDb25zb2xlQ29tbWFuZHMgPSAoX2EgPSBzZXR0aW5ncy5QaXhlbFN0cmVhbWluZ1NldHRpbmdzLkFsbG93UGl4ZWxTdHJlYW1pbmdDb21tYW5kcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd0NvbnNvbGVDb21tYW5kcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbygnLUFsbG93UGl4ZWxTdHJlYW1pbmdDb21tYW5kcz1mYWxzZSwgc2VuZGluZyBhcmJpdHJhcnkgY29uc29sZSBjb21tYW5kcyBmcm9tIGJyb3dzZXIgdG8gVUUgaXMgZGlzYWJsZWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlVXJsUGFyYW1zID0gdGhpcy5jb25maWcudXNlVXJsUGFyYW1zO1xuICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgSVVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgTG9nZ2VyLkluZm8oYHVzaW5nIFVSTCBwYXJhbWV0ZXJzICR7dXNlVXJsUGFyYW1zfWApO1xuICAgICAgICBpZiAoc2V0dGluZ3MuRW5jb2RlclNldHRpbmdzKSB7XG4gICAgICAgICAgICAvLyBoZXJlIHdlIHNob3VsZCBlaXRoZXIgZ2V0IE1pbi9NYXhRUCBmcm9tIFBTMVxuICAgICAgICAgICAgLy8gb3IgTWluL01heFF1YWxpdHkgZnJvbSBQUzJcbiAgICAgICAgICAgIC8vIHdlIG9ubHkgd2FudCB0byBzZXQgb25lIHNldCBvciB0aGUgb3RoZXIgYXMgdGhleSBjb252ZXJnZSBpbiBDb21wYXRRdWFsaXR5TWluL01heCBhbmRcbiAgICAgICAgICAgIC8vIHdlIGRvbnQgd2FudCB0byBoYXZlIHRoZW0gY29uZmxpY3Qgd2l0aCBkZWZhdWx0IHZhbHVlcy5cbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5FbmNvZGVyU2V0dGluZ3MuTWluUVApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5NaW5RUCwgXG4gICAgICAgICAgICAgICAgLy8gSWYgYSBzZXR0aW5nIGlzIHNldCBpbiB0aGUgVVJMLCBtYWtlIHN1cmUgd2UgcmVzcGVjdCB0aGF0IHZhbHVlIGFzIG9wcG9zZWQgdG8gd2hhdCB0aGUgYXBwbGljYXRpb24gc2VuZHMgdXNcbiAgICAgICAgICAgICAgICB1c2VVcmxQYXJhbXMgJiYgdXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5NaW5RUClcbiAgICAgICAgICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdCh1cmxQYXJhbXMuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLk1pblFQKSlcbiAgICAgICAgICAgICAgICAgICAgOiBzZXR0aW5ncy5FbmNvZGVyU2V0dGluZ3MuTWluUVAgfHwgMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVAsIHVzZVVybFBhcmFtcyAmJiB1cmxQYXJhbXMuaGFzKE51bWVyaWNQYXJhbWV0ZXJzLk1heFFQKVxuICAgICAgICAgICAgICAgICAgICA/IE51bWJlci5wYXJzZUZsb2F0KHVybFBhcmFtcy5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVApKVxuICAgICAgICAgICAgICAgICAgICA6IHNldHRpbmdzLkVuY29kZXJTZXR0aW5ncy5NYXhRUCB8fCA1MSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuRW5jb2RlclNldHRpbmdzLk1pblF1YWxpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5NaW5RdWFsaXR5LCBcbiAgICAgICAgICAgICAgICAvLyBJZiBhIHNldHRpbmcgaXMgc2V0IGluIHRoZSBVUkwsIG1ha2Ugc3VyZSB3ZSByZXNwZWN0IHRoYXQgdmFsdWUgYXMgb3Bwb3NlZCB0byB3aGF0IHRoZSBhcHBsaWNhdGlvbiBzZW5kcyB1c1xuICAgICAgICAgICAgICAgIHVzZVVybFBhcmFtcyAmJiB1cmxQYXJhbXMuaGFzKE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHkpXG4gICAgICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5NaW5RdWFsaXR5KSlcbiAgICAgICAgICAgICAgICAgICAgOiBzZXR0aW5ncy5FbmNvZGVyU2V0dGluZ3MuTWluUXVhbGl0eSB8fCAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5LCB1c2VVcmxQYXJhbXMgJiYgdXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5KVxuICAgICAgICAgICAgICAgICAgICA/IE51bWJlci5wYXJzZUZsb2F0KHVybFBhcmFtcy5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eSkpXG4gICAgICAgICAgICAgICAgICAgIDogc2V0dGluZ3MuRW5jb2RlclNldHRpbmdzLk1heFF1YWxpdHkgfHwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoZXNlIHR3byBhcmUganVzdCB1c2VkIHRvIGNvbnZlcmdlIHF1YWxpdHkgYW5kIHFwIGFuZCBiZWhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50bHkgc2luY2UgdGhleVxuICAgICAgICAgICAgLy8gc2hvdWxkbnQgZXhpc3QgaW4gRW5jb2RlclNldHRpbmdzXG4gICAgICAgICAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVybFBhcmFtcy5oYXMoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbiwgTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4LCBOdW1iZXIucGFyc2VGbG9hdCh1cmxQYXJhbXMuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5XZWJSVENTZXR0aW5ncykge1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSwgdXNlVXJsUGFyYW1zICYmIHVybFBhcmFtcy5oYXMoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSlcbiAgICAgICAgICAgICAgICA/IE51bWJlci5wYXJzZUZsb2F0KHVybFBhcmFtcy5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSkpXG4gICAgICAgICAgICAgICAgOiBzZXR0aW5ncy5XZWJSVENTZXR0aW5ncy5NaW5CaXRyYXRlIC8gMTAwMCAvKiBicHMgdG8ga2JwcyAqLyk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlLCB1c2VVcmxQYXJhbXMgJiYgdXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlKVxuICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlKSlcbiAgICAgICAgICAgICAgICA6IHNldHRpbmdzLldlYlJUQ1NldHRpbmdzLk1heEJpdHJhdGUgLyAxMDAwIC8qIGJwcyB0byBrYnBzICovKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ0ZQUywgdXNlVXJsUGFyYW1zICYmIHVybFBhcmFtcy5oYXMoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTKVxuICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFMpKVxuICAgICAgICAgICAgICAgIDogc2V0dGluZ3MuV2ViUlRDU2V0dGluZ3MuRlBTKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiBzZXR0aW5nIHF1YWxpdHkgY29udHJvbCBvd25lcnNoaXAgb2YgYSBzdHJlYW1cbiAgICAgKiBAcGFyYW0gaGFzUXVhbGl0eU93bmVyc2hpcCAtIGRvZXMgdGhpcyB1c2VyIGhhdmUgcXVhbGl0eSBvd25lcnNoaXAgb2YgdGhlIHN0cmVhbSB0cnVlIC8gZmFsc2VcbiAgICAgKi9cbiAgICBfb25RdWFsaXR5Q29udHJvbE93bmVyc2hpcChoYXNRdWFsaXR5T3duZXJzaGlwKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldEZsYWdFbmFibGVkKEZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXIsIGhhc1F1YWxpdHlPd25lcnNoaXApO1xuICAgIH1cbiAgICBfb25QbGF5ZXJDb3VudChwbGF5ZXJDb3VudCkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgUGxheWVyQ291bnRFdmVudCh7IGNvdW50OiBwbGF5ZXJDb3VudCB9KSk7XG4gICAgfVxuICAgIF9vblN1YnNjcmliZUZhaWxlZChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTdWJzY3JpYmVGYWlsZWRFdmVudCh7IG1lc3NhZ2U6IG1lc3NhZ2UgfSkpO1xuICAgIH1cbiAgICAvLyBTZXRzIHVwIHRvIGVtaXQgdGhlIHdlYnJ0YyB0Y3AgcmVsYXkgZGV0ZWN0IGV2ZW50XG4gICAgX3NldHVwV2ViUnRjVENQUmVsYXlEZXRlY3Rpb24oc3RhdHNSZWNlaXZlZEV2ZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgYWN0aXZlIGNhbmRpZGF0ZSBwYWlyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZVBhaXIgPSBzdGF0c1JlY2VpdmVkRXZlbnQuZGF0YS5hZ2dyZWdhdGVkU3RhdHMuZ2V0QWN0aXZlQ2FuZGlkYXRlUGFpcigpO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aXZlIGNhbmRpZGF0ZSBwYWlyIGlzIG5vdCBudWxsXG4gICAgICAgIGlmIChhY3RpdmVDYW5kaWRhdGVQYWlyICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbG9jYWwgY2FuZGlkYXRlIGFzc2lnbmVkIHRvIHRoZSBhY3RpdmUgY2FuZGlkYXRlIHBhaXJcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsQ2FuZGlkYXRlID0gc3RhdHNSZWNlaXZlZEV2ZW50LmRhdGEuYWdncmVnYXRlZFN0YXRzLmxvY2FsQ2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBhY3RpdmVDYW5kaWRhdGVQYWlyLmxvY2FsQ2FuZGlkYXRlSWQsIG51bGwpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxvY2FsIGNhbmRpZGF0ZSBpcyBub3QgbnVsbCwgY2FuZGlkYXRlIHR5cGUgaXMgcmVsYXkgYW5kIHRoZSByZWxheSBwcm90b2NvbCBpcyB0Y3BcbiAgICAgICAgICAgIGlmIChsb2NhbENhbmRpZGF0ZSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgbG9jYWxDYW5kaWRhdGUuY2FuZGlkYXRlVHlwZSA9PSAncmVsYXknICYmXG4gICAgICAgICAgICAgICAgbG9jYWxDYW5kaWRhdGUucmVsYXlQcm90b2NvbCA9PSAndGNwJykge1xuICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIHdlYiBydGMgdGNwIHJlbGF5IGRldGVjdGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFdlYlJ0Y1RDUFJlbGF5RGV0ZWN0ZWRFdmVudCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBjaGVjayBpcyBjb21wbGV0ZWQgYW5kIHRoZSBzdGF0cyBsaXN0ZW4gZXZlbnQgY2FuIGJlIHJlbW92ZWRcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGF0c1JlY2VpdmVkJywgdGhpcy5fc2V0dXBXZWJSdGNUQ1BSZWxheURldGVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBhIGNvbm5lY3Rpb24gbGF0ZW5jeSB0ZXN0LlxuICAgICAqIE5PVEU6IFRoZXJlIGFyZSBwbGFucyB0byByZWZhY3RvciBhbGwgcmVxdWVzdCogZnVuY3Rpb25zLiBFeHBlY3QgY2hhbmdlcyBpZiB5b3UgdXNlIHRoaXMhXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICByZXF1ZXN0TGF0ZW5jeVRlc3QoKSB7XG4gICAgICAgIGlmICghdGhpcy5fd2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZExhdGVuY3lUZXN0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGEgZGF0YSBjaGFubmVsIGxhdGVuY3kgdGVzdC5cbiAgICAgKiBOT1RFOiBUaGVyZSBhcmUgcGxhbnMgdG8gcmVmYWN0b3IgYWxsIHJlcXVlc3QqIGZ1bmN0aW9ucy4gRXhwZWN0IGNoYW5nZXMgaWYgeW91IHVzZSB0aGlzIVxuICAgICAqL1xuICAgIHJlcXVlc3REYXRhQ2hhbm5lbExhdGVuY3lUZXN0KGNvbmZpZykge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udHJvbGxlciA9IG5ldyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udHJvbGxlcih0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmREYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmJpbmQodGhpcy5fd2ViUnRjQ29udHJvbGxlciksIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdEV2ZW50KHsgcmVzdWx0IH0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2UnLCAoeyBkYXRhOiB7IHJlc3BvbnNlIH0gfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyLnJlY2VpdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyLnN0YXJ0KGNvbmZpZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZm9yIHRoZSBVRSBhcHBsaWNhdGlvbiB0byBzaG93IEZQUyBjb3VudGVyLlxuICAgICAqIE5PVEU6IFRoZXJlIGFyZSBwbGFucyB0byByZWZhY3RvciBhbGwgcmVxdWVzdCogZnVuY3Rpb25zLiBFeHBlY3QgY2hhbmdlcyBpZiB5b3UgdXNlIHRoaXMhXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICByZXF1ZXN0U2hvd0ZwcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWJSdGNDb250cm9sbGVyLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kU2hvd0ZwcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBmb3IgYSBuZXcgSUZyYW1lIGZyb20gdGhlIFVFIGFwcGxpY2F0aW9uLlxuICAgICAqIE5PVEU6IFRoZXJlIGFyZSBwbGFucyB0byByZWZhY3RvciBhbGwgcmVxdWVzdCogZnVuY3Rpb25zLiBFeHBlY3QgY2hhbmdlcyBpZiB5b3UgdXNlIHRoaXMhXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICByZXF1ZXN0SWZyYW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRJZnJhbWVSZXF1ZXN0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGRhdGEgdG8gVUUgYXBwbGljYXRpb24uIFRoZSBkYXRhIHdpbGwgYmUgcnVuIHRocm91Z2ggSlNPTi5zdHJpbmdpZnkoKSBzbyBlLmcuIHN0cmluZ3NcbiAgICAgKiBhbmQgYW55IHNlcmlhbGl6YWJsZSBwbGFpbiBKU09OIG9iamVjdHMgd2l0aCBubyByZWN1cnJlbmNlIGNhbiBiZSBzZW50LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgc3VjY2VlZGVkLCBmYWxzZSBpZiByZWplY3RlZFxuICAgICAqL1xuICAgIGVtaXRVSUludGVyYWN0aW9uKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWJSdGNDb250cm9sbGVyLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5lbWl0VUlJbnRlcmFjdGlvbihkZXNjcmlwdG9yKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBjb21tYW5kIHRvIFVFIGFwcGxpY2F0aW9uLiBCbG9ja3MgQ29uc29sZUNvbW1hbmQgZGVzY3JpcHRvcnMgdW5sZXNzIFVFXG4gICAgICogaGFzIHNpZ25hbGVkIHRoYXQgaXQgYWxsb3dzIGNvbnNvbGUgY29tbWFuZHMuXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBzdWNjZWVkZWQsIGZhbHNlIGlmIHJlamVjdGVkXG4gICAgICovXG4gICAgZW1pdENvbW1hbmQoZGVzY3JpcHRvcikge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYWxsb3dDb25zb2xlQ29tbWFuZHMgJiYgJ0NvbnNvbGVDb21tYW5kJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5lbWl0Q29tbWFuZChkZXNjcmlwdG9yKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBjb25zb2xlIGNvbW1hbmQgdG8gVUUgYXBwbGljYXRpb24uIE9ubHkgYWxsb3dlZCBpZiBVRSBoYXMgc2lnbmFsZWQgdGhhdCBpdCBhbGxvd3NcbiAgICAgKiBjb25zb2xlIGNvbW1hbmRzLlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgc3VjY2VlZGVkLCBmYWxzZSBpZiByZWplY3RlZFxuICAgICAqL1xuICAgIGVtaXRDb25zb2xlQ29tbWFuZChjb21tYW5kKSB7XG4gICAgICAgIGlmICghdGhpcy5hbGxvd0NvbnNvbGVDb21tYW5kcyB8fCAhdGhpcy5fd2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuZW1pdENvbnNvbGVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGV4dCBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgVUUgdGV4dCBib3ggd2lkZ2V0LlxuICAgICAqIEBwYXJhbSBjb250ZW50cyBUaGUgbmV3IGNvbnRlbnRzIG9mIHRoZSBVRSB0ZXh0IGJveC5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBtZXNzYWdlIGNvdWxkIGJlIHNlbnQuXG4gICAgICovXG4gICAgc2VuZFRleHRib3hFbnRyeShjb250ZW50cykge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRUZXh0Ym94RW50cnkoY29udGVudHMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgVUUgLT4gYnJvd3NlciByZXNwb25zZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc3BvbnNlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgLSBUaGUgbWV0aG9kIHRvIGJlIGFjdGl2YXRlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgICAqL1xuICAgIGFkZFJlc3BvbnNlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnJlc3BvbnNlQ29udHJvbGxlci5hZGRSZXNwb25zZUV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBVRSAtPiBicm93c2VyIHJlc3BvbnNlIGV2ZW50IGxpc3RlbmVyXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzcG9uc2UgaGFuZGxlclxuICAgICAqL1xuICAgIHJlbW92ZVJlc3BvbnNlRXZlbnRMaXN0ZW5lcihuYW1lKSB7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIucmVzcG9uc2VDb250cm9sbGVyLnJlbW92ZVJlc3BvbnNlRXZlbnRMaXN0ZW5lcihuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBuZXcgZXZlbnQuXG4gICAgICogQHBhcmFtIGUgZXZlbnRcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGRpc3BhdGNoRXZlbnQoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQoZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIuXG4gICAgICogQHBhcmFtIHR5cGUgZXZlbnQgbmFtZVxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBldmVudCBoYW5kbGVyLlxuICAgICAqIEBwYXJhbSB0eXBlIGV2ZW50IG5hbWVcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqL1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmFibGUvZGlzYWJsZSBYUiBtb2RlLlxuICAgICAqL1xuICAgIHRvZ2dsZVhSKCkge1xuICAgICAgICB0aGlzLndlYlhyQ29udHJvbGxlci54ckNsaWNrZWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFzcyBpbiBhIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgc2lnbmFsbGluZyBzZXJ2ZXIgVVJMLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGlmIHlvdSBuZWVkIHRvIHByb2dyYW1tYXRpY2FsbHkgY29uc3RydWN0IHlvdXIgc2lnbmFsbGluZyBzZXJ2ZXIgVVJMLlxuICAgICAqIEBwYXJhbSBzaWduYWxsaW5nVXJsQnVpbGRlckZ1bmMgQSBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhIHNpZ25hbGxpbmcgc2VydmVyIHVybC5cbiAgICAgKi9cbiAgICBzZXRTaWduYWxsaW5nVXJsQnVpbGRlcihzaWduYWxsaW5nVXJsQnVpbGRlckZ1bmMpIHtcbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zaWduYWxsaW5nVXJsQnVpbGRlciA9IHNpZ25hbGxpbmdVcmxCdWlsZGVyRnVuYztcbiAgICB9XG4gICAgZ2V0IHdlYlJ0Y0NvbnRyb2xsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWJSdGNDb250cm9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQdWJsaWMgZ2V0dGVyIGZvciB0aGUgd2Vic29ja2V0IGNvbnRyb2xsZXIuIEFjY2VzcyB0byB0aGlzIHByb3BlcnR5IGFsbG93cyB5b3UgdG8gc2VuZFxuICAgICAqIGN1c3RvbSB3ZWJzb2NrZXQgbWVzc2FnZXMuXG4gICAgICovXG4gICAgZ2V0IHNpZ25hbGxpbmdQcm90b2NvbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIucHJvdG9jb2w7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1YmxpYyBnZXR0ZXIgZm9yIHRoZSB3ZWJYckNvbnRyb2xsZXIgY29udHJvbGxlci4gVXNlZCBmb3IgYWxsIFhSIGZlYXR1cmVzLlxuICAgICAqL1xuICAgIGdldCB3ZWJYckNvbnRyb2xsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWJYckNvbnRyb2xsZXI7XG4gICAgfVxuICAgIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIobmFtZSwgZGlyZWN0aW9uLCBoYW5kbGVyKSB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyICYmIHR5cGVvZiBoYW5kbGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoYFVuYWJsZSB0byByZWdpc3RlciBhbiB1bmRlZmluZWQgaGFuZGxlciBmb3IgJHtuYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciAmJiB0eXBlb2YgaGFuZGxlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihkaXJlY3Rpb24sIG5hbWUsIChkYXRhKSA9PiB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIobmFtZSwgZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGRpcmVjdGlvbiwgbmFtZSwgKGRhdGEpID0+IGhhbmRsZXIoZGF0YSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB0b1N0cmVhbWVySGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICB9XG4gICAgaXNSZWNvbm5lY3RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWJSdGNDb250cm9sbGVyLmlzUmVjb25uZWN0aW5nO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBpeGVsU3RyZWFtaW5nLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5leHBvcnQgY2xhc3MgUmVzcG9uc2VDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZUV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSByZXNwb25zZSBldmVudCBsaXN0ZW5lciB0byB0aGUgcmVzcG9uc2UgbWFwXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgLSBUaGUgbWV0aG9kIHRvIGJlIGFjdGl2YXRlZCB3aGVuIHRoZSByZXNwb25zZSBpcyBzZWxlY3RlZFxuICAgICAqL1xuICAgIGFkZFJlc3BvbnNlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnJlc3BvbnNlRXZlbnRMaXN0ZW5lcnMuc2V0KG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgcmVzcG9uc2UgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIHJlc3BvbnNlIG1hcFxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlUmVzcG9uc2VFdmVudExpc3RlbmVyKG5hbWUpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZUV2ZW50TGlzdGVuZXJzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIGEgcmVzcG9uc2Ugd2hlbiByZWNlaXZpbmcgb25lIGZvcm0gdGhlIHN0cmVhbWVyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBEYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGEgY2hhbm5lbCB3aXRoIHRoZSBjb21tYW5kIGluIHF1ZXN0aW9uXG4gICAgICovXG4gICAgb25SZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5SZXNwb25zZScpO1xuICAgICAgICBjb25zdCByZXNwb25zZXMgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZShtZXNzYWdlLnNsaWNlKDEpKTtcbiAgICAgICAgTG9nZ2VyLkluZm8ocmVzcG9uc2VzKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZUV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihyZXNwb25zZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNwb25zZUNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmV4cG9ydCBjbGFzcyBTZW5kTWVzc2FnZUNvbnRyb2xsZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBkYXRhQ2hhbm5lbFNlbmRlciAtIERhdGEgY2hhbm5lbCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB0b1N0cmVhbWVyTWVzc2FnZXNNYXBQcm92aWRlciAtIFN0cmVhbSBNZXNzYWdlcyBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGFDaGFubmVsU2VuZGVyLCB0b1N0cmVhbWVyTWVzc2FnZXNNYXBQcm92aWRlcikge1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsU2VuZGVyID0gZGF0YUNoYW5uZWxTZW5kZXI7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzTWFwUHJvdmlkZXIgPSB0b1N0cmVhbWVyTWVzc2FnZXNNYXBQcm92aWRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHN0cmVhbWVyIHRocm91Z2ggdGhlIGRhdGEgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSAtIHRoZSB0eXBlIG9mIG1lc3NhZ2Ugd2UgYXJlIHNlbmRpbmdcbiAgICAgKiBAcGFyYW0gbWVzc2FnZURhdGEgLSB0aGUgbWVzc2FnZSBkYXRhIHdlIGFyZSBzZW5kaW5nIG92ZXIgdGhlIGRhdGEgY2hhbm5lbFxuICAgICAqIEByZXR1cm5zIC0gbmlsXG4gICAgICovXG4gICAgc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKG1lc3NhZ2VUeXBlLCBtZXNzYWdlRGF0YSkge1xuICAgICAgICBpZiAobWVzc2FnZURhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWVzc2FnZURhdGEgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b1N0cmVhbWVyTWVzc2FnZXMgPSB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc01hcFByb3ZpZGVyLnRvU3RyZWFtZXJNZXNzYWdlcztcbiAgICAgICAgY29uc3QgbWVzc2FnZUZvcm1hdCA9IHRvU3RyZWFtZXJNZXNzYWdlcy5nZXQobWVzc2FnZVR5cGUpO1xuICAgICAgICBpZiAobWVzc2FnZUZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEF0dGVtcHRlZCB0byBzZW5kIGEgbWVzc2FnZSB0byB0aGUgc3RyZWFtZXIgd2l0aCBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZVR5cGV9LCBidXQgdGhlIGZyb250ZW5kIGhhc24ndCBiZWVuIGNvbmZpZ3VyZWQgdG8gc2VuZCBzdWNoIGEgbWVzc2FnZS4gQ2hlY2sgeW91J3ZlIGFkZGVkIHRoZSBtZXNzYWdlIHR5cGUgaW4geW91ciBjcHBgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZUZvcm1hdC5zdHJ1Y3R1cmUgJiYgbWVzc2FnZURhdGEgJiYgbWVzc2FnZUZvcm1hdC5zdHJ1Y3R1cmUubGVuZ3RoICE9PSBtZXNzYWdlRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgUHJvdmlkZWQgbWVzc2FnZSBkYXRhIGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQgbGF5b3V0LiBFeHBlY3RlZCBbICR7bWVzc2FnZUZvcm1hdC5zdHJ1Y3R1cmVcbiAgICAgICAgICAgICAgICAubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3VpbnQ4JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndWludDE2JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW50MTYnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdmbG9hdCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKX0gXSBidXQgcmVjZWl2ZWQgWyAke21lc3NhZ2VEYXRhLm1hcCgoZWxlbWVudCkgPT4gdHlwZW9mIGVsZW1lbnQpLnRvU3RyaW5nKCl9IF1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYnl0ZUxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIC8vIE9uZSBsb29wIHRvIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIGFsbCBvZiB0aGUgcHJvdmlkZWQgZGF0YVxuICAgICAgICBtZXNzYWdlRGF0YS5mb3JFYWNoKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBtZXNzYWdlRm9ybWF0LnN0cnVjdHVyZVtpZHhdO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndWludDgnOlxuICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VpbnQxNic6XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaW50MTYnOlxuICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCArPSA0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGUnOlxuICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIC8vIDIgYnl0ZXMgZm9yIHN0cmluZyBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCArPSAyO1xuICAgICAgICAgICAgICAgICAgICAvLyAyIGJ5dGVzIHBlciBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGggKz0gMiAqIHRleHRFbmNvZGVyLmVuY29kZShlbGVtZW50KS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aCArIDEpKTtcbiAgICAgICAgZGF0YS5zZXRVaW50OCgwLCBtZXNzYWdlRm9ybWF0LmlkKTtcbiAgICAgICAgbGV0IGJ5dGVPZmZzZXQgPSAxO1xuICAgICAgICBtZXNzYWdlRGF0YS5mb3JFYWNoKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBtZXNzYWdlRm9ybWF0LnN0cnVjdHVyZVtpZHhdO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndWludDgnOlxuICAgICAgICAgICAgICAgICAgICBkYXRhLnNldFVpbnQ4KGJ5dGVPZmZzZXQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VpbnQxNic6XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0VWludDE2KGJ5dGVPZmZzZXQsIGVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ludDE2JzpcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRJbnQxNihieXRlT2Zmc2V0LCBlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZU9mZnNldCArPSAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdmbG9hdCc6XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0RmxvYXQzMihieXRlT2Zmc2V0LCBlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZU9mZnNldCArPSA0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGUnOlxuICAgICAgICAgICAgICAgICAgICBkYXRhLnNldEZsb2F0NjQoYnl0ZU9mZnNldCwgZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVPZmZzZXQgKz0gODtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRVaW50MTYoYnl0ZU9mZnNldCwgZWxlbWVudC5sZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRVaW50MTYoYnl0ZU9mZnNldCwgZWxlbWVudC5jaGFyQ29kZUF0KGkpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVPZmZzZXQgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5kYXRhQ2hhbm5lbFNlbmRlci5jYW5TZW5kKCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGBEYXRhIGNoYW5uZWwgY2Fubm90IHNlbmQgeWV0LCBza2lwcGluZyBzZW5kaW5nIG1lc3NhZ2U6ICR7bWVzc2FnZVR5cGV9IC0gJHtuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlcil9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbFNlbmRlci5zZW5kRGF0YShkYXRhLmJ1ZmZlcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VuZE1lc3NhZ2VDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5leHBvcnQgY2xhc3MgVG9TdHJlYW1lck1lc3NhZ2Uge1xufVxuZXhwb3J0IGNsYXNzIFN0cmVhbU1lc3NhZ2VDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVySGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVySGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB0aGUgRGVmYXVsdCBtZXNzYWdlIHByb3RvY29sXG4gICAgICovXG4gICAgcG9wdWxhdGVEZWZhdWx0UHJvdG9jb2woKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIENvbnRyb2wgTWVzc2FnZXMuIFJhbmdlID0gMC4uNDkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0lGcmFtZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICBpZDogMCxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnUmVxdWVzdFF1YWxpdHlDb250cm9sJywge1xuICAgICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0Zwc1JlcXVlc3QnLCB7XG4gICAgICAgICAgICBpZDogMixcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnQXZlcmFnZUJpdHJhdGVSZXF1ZXN0Jywge1xuICAgICAgICAgICAgaWQ6IDMsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1N0YXJ0U3RyZWFtaW5nJywge1xuICAgICAgICAgICAgaWQ6IDQsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1N0b3BTdHJlYW1pbmcnLCB7XG4gICAgICAgICAgICBpZDogNSxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnTGF0ZW5jeVRlc3QnLCB7XG4gICAgICAgICAgICBpZDogNixcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWydzdHJpbmcnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdSZXF1ZXN0SW5pdGlhbFNldHRpbmdzJywge1xuICAgICAgICAgICAgaWQ6IDcsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1Rlc3RFY2hvJywge1xuICAgICAgICAgICAgaWQ6IDgsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0RhdGFDaGFubmVsTGF0ZW5jeVRlc3QnLCB7XG4gICAgICAgICAgICBpZDogOSxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIC8qXG4gICAgICAgICAqIElucHV0IE1lc3NhZ2VzLiBSYW5nZSA9IDUwLi44OS5cbiAgICAgICAgICovXG4gICAgICAgIC8vIEdlbmVyaWMgSW5wdXQgTWVzc2FnZXMuIFJhbmdlID0gNTAuLjU5LlxuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1VJSW50ZXJhY3Rpb24nLCB7XG4gICAgICAgICAgICBpZDogNTAsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsnc3RyaW5nJ11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnQ29tbWFuZCcsIHtcbiAgICAgICAgICAgIGlkOiA1MSxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWydzdHJpbmcnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdUZXh0Ym94RW50cnknLCB7XG4gICAgICAgICAgICBpZDogNTIsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsnc3RyaW5nJ11cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEtleWJvYXJkIElucHV0IE1lc3NhZ2UuIFJhbmdlID0gNjAuLjY5LlxuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0tleURvd24nLCB7XG4gICAgICAgICAgICBpZDogNjAsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgIGtleUNvZGUgIGlzUmVwZWF0XG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnLCAndWludDgnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdLZXlVcCcsIHtcbiAgICAgICAgICAgIGlkOiA2MSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAga2V5Q29kZVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnS2V5UHJlc3MnLCB7XG4gICAgICAgICAgICBpZDogNjIsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgIGNoYXJjb2RlXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDE2J11cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE1vdXNlIElucHV0IE1lc3NhZ2VzLiBSYW5nZSA9IDcwLi43OS5cbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZUVudGVyJywge1xuICAgICAgICAgICAgaWQ6IDcwLFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZUxlYXZlJywge1xuICAgICAgICAgICAgaWQ6IDcxLFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZURvd24nLCB7XG4gICAgICAgICAgICBpZDogNzIsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgYnV0dG9uICAgICB4ICAgICAgICAgeVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQxNicsICd1aW50MTYnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZVVwJywge1xuICAgICAgICAgICAgaWQ6IDczLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIGJ1dHRvbiAgICAgeCAgICAgICAgIHlcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50MTYnLCAndWludDE2J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnTW91c2VNb3ZlJywge1xuICAgICAgICAgICAgaWQ6IDc0LFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIHggICAgICAgICAgIHkgICAgICBkZWx0YVggICAgZGVsdGFZXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDE2JywgJ3VpbnQxNicsICdpbnQxNicsICdpbnQxNiddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ01vdXNlV2hlZWwnLCB7XG4gICAgICAgICAgICBpZDogNzUsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgZGVsdGEgICAgICAgeCAgICAgICAgeVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ2ludDE2JywgJ3VpbnQxNicsICd1aW50MTYnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZURvdWJsZScsIHtcbiAgICAgICAgICAgIGlkOiA3NixcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICBidXR0b24gICAgIHggICAgICAgICB5XG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnLCAndWludDE2JywgJ3VpbnQxNiddXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUb3VjaCBJbnB1dCBNZXNzYWdlcy4gUmFuZ2UgPSA4MC4uODkuXG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnVG91Y2hTdGFydCcsIHtcbiAgICAgICAgICAgIGlkOiA4MCxcbiAgICAgICAgICAgIC8vICAgICAgICAgIG51bXRvdWNoZXMoMSkgICB4ICAgICAgIHkgICAgICAgIGlkeCAgICAgZm9yY2UgICAgIHZhbGlkXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnLCAndWludDE2JywgJ3VpbnQxNicsICd1aW50OCcsICd1aW50OCcsICd1aW50OCddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1RvdWNoRW5kJywge1xuICAgICAgICAgICAgaWQ6IDgxLFxuICAgICAgICAgICAgLy8gICAgICAgICAgbnVtdG91Y2hlcygxKSAgIHggICAgICAgeSAgICAgICAgaWR4ICAgICBmb3JjZSAgICAgdmFsaWRcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50MTYnLCAndWludDE2JywgJ3VpbnQ4JywgJ3VpbnQ4JywgJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnVG91Y2hNb3ZlJywge1xuICAgICAgICAgICAgaWQ6IDgyLFxuICAgICAgICAgICAgLy8gICAgICAgICAgbnVtdG91Y2hlcygxKSAgIHggICAgICAgeSAgICAgICBpZHggICAgICBmb3JjZSAgICAgdmFsaWRcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50MTYnLCAndWludDE2JywgJ3VpbnQ4JywgJ3VpbnQ4JywgJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEdhbWVwYWQgSW5wdXQgTWVzc2FnZXMuIFJhbmdlID0gOTAuLjk5XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnR2FtZXBhZENvbm5lY3RlZCcsIHtcbiAgICAgICAgICAgIGlkOiA5MyxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnR2FtZXBhZEJ1dHRvblByZXNzZWQnLCB7XG4gICAgICAgICAgICBpZDogOTAsXG4gICAgICAgICAgICAvLyAgICAgICAgIGN0cmxlcklkICAgYnV0dG9uICBpc1JlcGVhdFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQ4JywgJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnR2FtZXBhZEJ1dHRvblJlbGVhc2VkJywge1xuICAgICAgICAgICAgaWQ6IDkxLFxuICAgICAgICAgICAgLy8gICAgICAgICBjdHJsZXJJZCAgIGJ1dHRvbiAgaXNSZXBlYXQoMClcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50OCcsICd1aW50OCddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0dhbWVwYWRBbmFsb2cnLCB7XG4gICAgICAgICAgICBpZDogOTIsXG4gICAgICAgICAgICAvLyAgICAgICAgIGN0cmxlcklkICAgYnV0dG9uICBhbmFsb2dWYWx1ZVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQ4JywgJ2RvdWJsZSddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0dhbWVwYWREaXNjb25uZWN0ZWQnLCB7XG4gICAgICAgICAgICBpZDogOTQsXG4gICAgICAgICAgICAvLyAgICAgICAgICBjdHJsZXJJZFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDAsICdRdWFsaXR5Q29udHJvbE93bmVyc2hpcCcpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCgxLCAnUmVzcG9uc2UnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMiwgJ0NvbW1hbmQnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMywgJ0ZyZWV6ZUZyYW1lJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDQsICdVbmZyZWV6ZUZyYW1lJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDUsICdWaWRlb0VuY29kZXJBdmdRUCcpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCg2LCAnTGF0ZW5jeVRlc3QnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoNywgJ0luaXRpYWxTZXR0aW5ncycpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCg4LCAnRmlsZUV4dGVuc2lvbicpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCg5LCAnRmlsZU1pbWVUeXBlJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDEwLCAnRmlsZUNvbnRlbnRzJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDExLCAnVGVzdEVjaG8nKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMTIsICdJbnB1dENvbnRyb2xPd25lcnNoaXAnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMTMsICdHYW1lcGFkUmVzcG9uc2UnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMTQsICdEYXRhQ2hhbm5lbExhdGVuY3lUZXN0Jyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDI1NSwgJ1Byb3RvY29sJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgbWVzc2FnZSBoYW5kbGVyXG4gICAgICogQHBhcmFtIG1lc3NhZ2VEaXJlY3Rpb24gLSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtZXNzYWdlOyB0b1N0cmVhbWVyIG9yIGZyb21TdHJlYW1lclxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlXG4gICAgICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIC0gdGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCB0byBiZSBleGVjdXRlZCB3aGVuIHRoaXMgaGFuZGxlciBpcyBjYWxsZWRcbiAgICAgKi9cbiAgICByZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2VEaXJlY3Rpb24sIG1lc3NhZ2VUeXBlLCBtZXNzYWdlSGFuZGxlcikge1xuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyOlxuICAgICAgICAgICAgICAgIHRoaXMudG9TdHJlYW1lckhhbmRsZXJzLnNldChtZXNzYWdlVHlwZSwgbWVzc2FnZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lcjpcbiAgICAgICAgICAgICAgICB0aGlzLmZyb21TdHJlYW1lckhhbmRsZXJzLnNldChtZXNzYWdlVHlwZSwgbWVzc2FnZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbyhgVW5rbm93biBtZXNzYWdlIGRpcmVjdGlvbiAke21lc3NhZ2VEaXJlY3Rpb259YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBlbnVtIGZvciBtZXNzYWdlIGRpcmVjdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBNZXNzYWdlRGlyZWN0aW9uO1xuKGZ1bmN0aW9uIChNZXNzYWdlRGlyZWN0aW9uKSB7XG4gICAgTWVzc2FnZURpcmVjdGlvbltNZXNzYWdlRGlyZWN0aW9uW1wiVG9TdHJlYW1lclwiXSA9IDBdID0gXCJUb1N0cmVhbWVyXCI7XG4gICAgTWVzc2FnZURpcmVjdGlvbltNZXNzYWdlRGlyZWN0aW9uW1wiRnJvbVN0cmVhbWVyXCJdID0gMV0gPSBcIkZyb21TdHJlYW1lclwiO1xufSkoTWVzc2FnZURpcmVjdGlvbiB8fCAoTWVzc2FnZURpcmVjdGlvbiA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJlYW1NZXNzYWdlQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IGNsYXNzIFRvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBzZW5kTWVzc2FnZUNvbnRyb2xsZXIgLSBTdHJlYW0gbWVzc2FnZSBjb250cm9sbGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2VuZE1lc3NhZ2VDb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyID0gc2VuZE1lc3NhZ2VDb250cm9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIFJlcXVlc3QgdG8gVGFrZSBRdWFsaXR5IENvbnRyb2wgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgU2VuZFJlcXVlc3RRdWFsaXR5Q29udHJvbCgpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdSZXF1ZXN0UXVhbGl0eUNvbnRyb2wnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBNYXggRlBTIFJlcXVlc3QgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgU2VuZE1heEZwc1JlcXVlc3QoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignRnBzUmVxdWVzdCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIEF2ZXJhZ2UgQml0cmF0ZSBSZXF1ZXN0IHRvIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqL1xuICAgIFNlbmRBdmVyYWdlQml0cmF0ZVJlcXVlc3QoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignQXZlcmFnZUJpdHJhdGVSZXF1ZXN0Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBTdGFydCBTdHJlYW1pbmcgTWVzc2FnZSB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBTZW5kU3RhcnRTdHJlYW1pbmcoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignU3RhcnRTdHJlYW1pbmcnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIFN0b3AgU3RyZWFtaW5nIE1lc3NhZ2UgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgU2VuZFN0b3BTdHJlYW1pbmcoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignU3RvcFN0cmVhbWluZycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgUmVxdWVzdCBJbml0aWFsIFNldHRpbmdzIHRvIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqL1xuICAgIFNlbmRSZXF1ZXN0SW5pdGlhbFNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1JlcXVlc3RJbml0aWFsU2V0dGluZ3MnKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub1N0cmVhbWVyTWVzc2FnZXNDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5leHBvcnQgY2xhc3MgQnJvd3NlclV0aWxzIHtcbiAgICBzdGF0aWMgZ2V0U3VwcG9ydGVkVmlkZW9Db2RlY3MoKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MgPSBbXTtcbiAgICAgICAgLy8gVHJ5IGdldCB0aGUgaW5mbyBuZWVkZWQgZnJvbSB0aGUgUlRDUnRwUmVjZWl2ZXIuIFRoaXMgaXMgb25seSBhdmFpbGFibGUgb24gY2hyb21lXG4gICAgICAgIGlmICghUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZygnUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzIEFQSSBpcyBub3QgYXZhaWxhYmxlIGluIHlvdXIgYnJvd3NlciwgZGVmYXVsdGluZyB0byBndWVzcyB0aGF0IHdlIHN1cHBvcnQgSC4yNjQuJyk7XG4gICAgICAgICAgICBicm93c2VyU3VwcG9ydGVkQ29kZWNzLnB1c2goJ0gyNjQgbGV2ZWwtYXN5bW1ldHJ5LWFsbG93ZWQ9MTtwYWNrZXRpemF0aW9uLW1vZGU9MTtwcm9maWxlLWxldmVsLWlkPTQyZTAxZicpO1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3M7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF0Y2hlciA9IC8oVlBcXGR8SDI2XFxkfEFWMSkuKi87XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IFJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcygndmlkZW8nKTtcbiAgICAgICAgaWYgKCFjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgIGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MucHVzaCgnSDI2NCBsZXZlbC1hc3ltbWV0cnktYWxsb3dlZD0xO3BhY2tldGl6YXRpb24tbW9kZT0xO3Byb2ZpbGUtbGV2ZWwtaWQ9NDJlMDFmJyk7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlclN1cHBvcnRlZENvZGVjcztcbiAgICAgICAgfVxuICAgICAgICBjYXBhYmlsaXRpZXMuY29kZWNzLmZvckVhY2goKGNvZGVjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSBjb2RlYy5taW1lVHlwZS5zcGxpdCgnLycpWzFdICsgJyAnICsgKGNvZGVjLnNkcEZtdHBMaW5lIHx8ICcnKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlci5leGVjKHN0cik7XG4gICAgICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicm93c2VyU3VwcG9ydGVkQ29kZWNzLnB1c2goc3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBicm93c2VyU3VwcG9ydGVkQ29kZWNzO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJVdGlscy5qcy5tYXAiLCIvKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIEFGSyBkaXNjb25uZWN0IGlzIGFib3V0IHRvIGhhcHBlbi5cbiAqIENhbiBiZSBjYW5jZWxsZWQgYnkgY2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZmtXYXJuaW5nQWN0aXZhdGVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdhZmtXYXJuaW5nQWN0aXZhdGUnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHRoZSBBRksgZGlzY29ubmVjdCBjb3VudGRvd24gaXMgdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFma1dhcm5pbmdVcGRhdGVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdhZmtXYXJuaW5nVXBkYXRlJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBBRksgd2FybmluZyBpcyBkZWFjdGl2YXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFma1dhcm5pbmdEZWFjdGl2YXRlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdhZmtXYXJuaW5nRGVhY3RpdmF0ZScpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gQUZLIGNvdW50ZG93biByZWFjaGVzIDAgYW5kIHRoZSB1c2VyIGlzIGRpc2Nvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFma1RpbWVkT3V0RXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdhZmtUaW1lZE91dCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gd2UgcmVjZWl2ZSBuZXcgdmlkZW8gcXVhbGl0eSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFZpZGVvRW5jb2RlckF2Z1FQRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcigndmlkZW9FbmNvZGVyQXZnUVAnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciBhIFdlYlJ0YyBjb25uZWN0aW9uIGhhcyBiZWVuIG5lZ290aWF0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNTZHBFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y1NkcCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGFmdGVyIHRoZSBTRFAgYW5zd2VyIGlzIHNldC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJ0Y1NkcEFuc3dlckV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y1NkcEFuc3dlcicpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGFmdGVyIHRoZSBTRFAgb2ZmZXIgaXMgc2V0LlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjU2RwT2ZmZXJFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCd3ZWJSdGNTZHBPZmZlcicpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gYXV0byBjb25uZWN0aW5nLlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjQXV0b0Nvbm5lY3RFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y0F1dG9Db25uZWN0Jyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBzZW5kaW5nIGEgV2ViUnRjIG9mZmVyLlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjQ29ubmVjdGluZ0V2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignd2ViUnRjQ29ubmVjdGluZycpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gV2ViUnRjIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNDb25uZWN0ZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y0Nvbm5lY3RlZCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGlmIFdlYlJ0YyBjb25uZWN0aW9uIGhhcyBmYWlsZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNGYWlsZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y0ZhaWxlZCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGlmIFdlYlJ0YyBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJ0Y0Rpc2Nvbm5lY3RlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y0Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gUlRDRGF0YUNoYW5uZWwgaXMgb3BlbmVkLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNoYW5uZWxPcGVuRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignZGF0YUNoYW5uZWxPcGVuJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBSVENEYXRhQ2hhbm5lbCBpcyBjbG9zZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbENsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignZGF0YUNoYW5uZWxDbG9zZScpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIG9uIFJUQ0RhdGFDaGFubmVsIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdkYXRhQ2hhbm5lbEVycm9yJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgdmlkZW8gc3RyZWFtIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICovXG5leHBvcnQgY2xhc3MgVmlkZW9Jbml0aWFsaXplZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigndmlkZW9Jbml0aWFsaXplZCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdmlkZW8gc3RyZWFtIGxvYWRpbmcgc3RhcnRzLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtTG9hZGluZ0V2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignc3RyZWFtTG9hZGluZycpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdmlkZW8gc3RyZWFtIGxvYWRpbmcgaGFzIGZpbmlzaGVkLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtUHJlQ29ubmVjdEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignc3RyZWFtQ29ubmVjdCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdmlkZW8gc3RyZWFtIGhhcyBzdG9wcGVkLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtUHJlRGlzY29ubmVjdEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignc3RyZWFtRGlzY29ubmVjdCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdmlkZW8gc3RyZWFtIGlzIHJlY29ubmVjdGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmVhbVJlY29ubmVjdEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignc3RyZWFtUmVjb25uZWN0Jyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgaWYgdGhlcmUgYXJlIGVycm9ycyBsb2FkaW5nIHRoZSB2aWRlbyBzdHJlYW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5U3RyZWFtRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdwbGF5U3RyZWFtRXJyb3InKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBiZWZvcmUgdHJ5aW5nIHRvIHN0YXJ0IHZpZGVvIHBsYXliYWNrLlxuICovXG5leHBvcnQgY2xhc3MgUGxheVN0cmVhbUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigncGxheVN0cmVhbScpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGlmIHRoZSBicm93c2VyIHJlamVjdHMgdmlkZW8gcGxheWJhY2suIENhbiBoYXBwZW4gZm9yIGV4YW1wbGUgaWZcbiAqIHZpZGVvIGF1dG8tcGxheSB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24gaXMgcmVmdXNlZCBieSB0aGUgYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYXlTdHJlYW1SZWplY3RlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3BsYXlTdHJlYW1SZWplY3RlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gcmVjZWl2aW5nIGEgZnVsbCBGcmVlemVGcmFtZSBpbWFnZSBmcm9tIFVFLlxuICovXG5leHBvcnQgY2xhc3MgTG9hZEZyZWV6ZUZyYW1lRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignbG9hZEZyZWV6ZUZyYW1lJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiByZWNlaXZpbmcgVW5mcmVlemVGcmFtZSBtZXNzYWdlIGZyb20gVUUgYW5kIHZpZGVvIHBsYXliYWNrIGlzIGFib3V0IHRvIGJlIHJlc3VtZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBIaWRlRnJlZXplRnJhbWVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ2hpZGVGcmVlemVGcmFtZScpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gcmVjZWl2aW5nIFdlYlJUQyBzdGF0aXN0aWNzLlxuICovXG5leHBvcnQgY2xhc3MgU3RhdHNSZWNlaXZlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3N0YXRzUmVjZWl2ZWQnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHN0cmVhbWVyIGxpc3QgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmVhbWVyTGlzdE1lc3NhZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdzdHJlYW1lckxpc3RNZXNzYWdlJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBhIHN1YnNjcmliZWQgdG8gc3RyZWFtZXIncyBpZCBjaGFuZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignU3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiByZWNlaXZpbmcgbGF0ZW5jeSB0ZXN0IHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXRlbmN5VGVzdFJlc3VsdEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ2xhdGVuY3lUZXN0UmVzdWx0Jyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgZXZlcnl0aW1lIGxhdGVuY3kgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgV2ViUlRDIHN0YXRzIEFQSS5cbiAqL1xuZXhwb3J0IGNsYXNzIExhdGVuY3lDYWxjdWxhdGVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignbGF0ZW5jeUNhbGN1bGF0ZWQnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHdlIHJlY2VpdmUgdGhlIFwib25TY3JlZW5LZXlib2FyZFwiIGNvbW1hbmQgZnJvbSBVRS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNob3dPblNjcmVlbktleWJvYXJkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignc2hvd09uU2NyZWVuS2V5Ym9hcmQnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHJlY2VpdmluZyBkYXRhIGNoYW5uZWwgbGF0ZW5jeSB0ZXN0IHJlc3BvbnNlIGZyb20gc2VydmVyLlxuICogVGhpcyBldmVudCBpcyBoYW5kbGVkIGJ5IERhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2UnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIGRhdGEgY2hhbm5lbCBsYXRlbmN5IHRlc3QgcmVzdWx0cyBhcmUgcmVhZHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0RXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignZGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBTdWJzY3JpYmVGYWlsZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdzdWJzY3JpYmVGYWlsZWQnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHJlY2VpdmluZyBpbml0aWFsIHNldHRpbmdzIGZyb20gVUUuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbml0aWFsU2V0dGluZ3NFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdpbml0aWFsU2V0dGluZ3MnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIFBpeGVsU3RyZWFtaW5nIHNldHRpbmdzIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzQ2hhbmdlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3NldHRpbmdzQ2hhbmdlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogRXZlbnQgZW1pdHRlZCB3aGVuIGFuIFhSIFNlc3Npb24gc3RhcnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBYclNlc3Npb25TdGFydGVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCd4clNlc3Npb25TdGFydGVkJyk7XG4gICAgfVxufVxuLyoqXG4gKiBFdmVudCBlbWl0dGVkIHdoZW4gYW4gWFIgU2Vzc2lvbiBlbmRzXG4gKi9cbmV4cG9ydCBjbGFzcyBYclNlc3Npb25FbmRlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigneHJTZXNzaW9uRW5kZWQnKTtcbiAgICB9XG59XG4vKipcbiAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhbiBYUiBGcmFtZSBpcyBjb21wbGV0ZVxuICovXG5leHBvcnQgY2xhc3MgWHJGcmFtZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3hyRnJhbWUnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHJlY2VpdmluZyBhIHBsYXllciBjb3VudCBmcm9tIHRoZSBzaWduYWxsaW5nIHNlcnZlclxuICovXG5leHBvcnQgY2xhc3MgUGxheWVyQ291bnRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdwbGF5ZXJDb3VudCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdGhlIHdlYlJUQyBjb25uZWN0aW9ucyBpcyByZWxheWVkIG92ZXIgVENQLlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjVENQUmVsYXlEZXRlY3RlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignd2ViUnRjVENQUmVsYXlEZXRlY3RlZCcpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBQaXhlbFN0cmVhbWluZ0V2ZW50RW1pdHRlciBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIG5ldyBldmVudC5cbiAgICAgKiBAcGFyYW0gZSBldmVudFxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZGlzcGF0Y2hFdmVudChlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEV2ZW50KGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhbiBldmVudCBoYW5kbGVyLlxuICAgICAqIEBwYXJhbSB0eXBlIGV2ZW50IG5hbWVcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqL1xuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgc3VwZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBldmVudCBoYW5kbGVyLlxuICAgICAqIEBwYXJhbSB0eXBlIGV2ZW50IG5hbWVcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqL1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgc3VwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRFbWl0dGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHBvcHVsYXRlIGZpbGUgaW5mb3JtYXRpb24gZnJvbSBieXRlIGJ1ZmZlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlVXRpbCB7XG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgZmlsZXMgZXh0ZW5zaW9uIHdoZW4gcmVjZWl2ZWQgb3ZlciBkYXRhIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gdmlldyAtIHRoZSBmaWxlIGV4dGVuc2lvbiBkYXRhXG4gICAgICovXG4gICAgc3RhdGljIHNldEV4dGVuc2lvbkZyb21CeXRlcyh2aWV3LCBmaWxlKSB7XG4gICAgICAgIC8vIFJlc2V0IGZpbGUgaWYgd2UgZ290IGEgZmlsZSBtZXNzYWdlIGFuZCB3ZSBhcmUgbm90IFwicmVjZWl2aW5nXCIgaXQgeWV0XG4gICAgICAgIGlmICghZmlsZS5yZWNlaXZpbmcpIHtcbiAgICAgICAgICAgIGZpbGUubWltZXR5cGUgPSAnJztcbiAgICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID0gJyc7XG4gICAgICAgICAgICBmaWxlLnJlY2VpdmluZyA9IHRydWU7XG4gICAgICAgICAgICBmaWxlLnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBmaWxlLmNodW5rcyA9IDA7XG4gICAgICAgICAgICBmaWxlLmRhdGEgPSBbXTtcbiAgICAgICAgICAgIGZpbGUudGltZXN0YW1wU3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdSZWNlaXZlZCBmaXJzdCBjaHVuayBvZiBmaWxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uQXNTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZSh2aWV3LnNsaWNlKDEpKTtcbiAgICAgICAgTG9nZ2VyLkluZm8oZXh0ZW5zaW9uQXNTdHJpbmcpO1xuICAgICAgICBmaWxlLmV4dGVuc2lvbiA9IGV4dGVuc2lvbkFzU3RyaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSBmaWxlcyBtaW1lIHR5cGUgd2hlbiByZWNlaXZlZCBvdmVyIGRhdGEgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB2aWV3IC0gdGhlIGZpbGUgbWltZSB0eXBlIGRhdGFcbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0TWltZVR5cGVGcm9tQnl0ZXModmlldywgZmlsZSkge1xuICAgICAgICAvLyBSZXNldCBmaWxlIGlmIHdlIGdvdCBhIGZpbGUgbWVzc2FnZSBhbmQgd2UgYXJlIG5vdCBcInJlY2VpdmluZ1wiIGl0IHlldFxuICAgICAgICBpZiAoIWZpbGUucmVjZWl2aW5nKSB7XG4gICAgICAgICAgICBmaWxlLm1pbWV0eXBlID0gJyc7XG4gICAgICAgICAgICBmaWxlLmV4dGVuc2lvbiA9ICcnO1xuICAgICAgICAgICAgZmlsZS5yZWNlaXZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgZmlsZS52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgZmlsZS5jaHVua3MgPSAwO1xuICAgICAgICAgICAgZmlsZS5kYXRhID0gW107XG4gICAgICAgICAgICBmaWxlLnRpbWVzdGFtcFN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnUmVjZWl2ZWQgZmlyc3QgY2h1bmsgb2YgZmlsZScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbWVBc1N0cmluZyA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKHZpZXcuc2xpY2UoMSkpO1xuICAgICAgICBMb2dnZXIuSW5mbyhtaW1lQXNTdHJpbmcpO1xuICAgICAgICBmaWxlLm1pbWV0eXBlID0gbWltZUFzU3RyaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSBmaWxlcyBjb250ZW50cyB3aGVuIHJlY2VpdmVkIG92ZXIgZGF0YSBjaGFubmVsXG4gICAgICogQHBhcmFtIHZpZXcgLSB0aGUgZmlsZSBjb250ZW50cyBkYXRhXG4gICAgICovXG4gICAgc3RhdGljIHNldENvbnRlbnRzRnJvbUJ5dGVzKHZpZXcsIGZpbGUpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCByZWNlaXZlZCB0aGUgaW5pdGlhbCBzZXR1cCBpbnN0cnVjdGlvbnMsIHJldHVyblxuICAgICAgICBpZiAoIWZpbGUucmVjZWl2aW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB0eXBlU2l6ZSA9IDE7XG4gICAgICAgIGNvbnN0IGludFNpemUgPSA0O1xuICAgICAgICBjb25zdCBtYXhNZXNzYWdlU2l6ZSA9IDE2ICogMTAyNDtcbiAgICAgICAgY29uc3QgaGVhZGVyU2l6ZSA9IHR5cGVTaXplICsgaW50U2l6ZTtcbiAgICAgICAgY29uc3QgbWF4UGF5bG9hZFNpemUgPSBtYXhNZXNzYWdlU2l6ZSAtIGhlYWRlclNpemU7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2YgY2h1bmtzIGZyb20gdGhlIHRvdGFsIGZpbGUgc2l6ZVxuICAgICAgICBmaWxlLmNodW5rcyA9IE1hdGguY2VpbChuZXcgRGF0YVZpZXcodmlldy5zbGljZSh0eXBlU2l6ZSwgaGVhZGVyU2l6ZSkuYnVmZmVyKS5nZXRJbnQzMigwLCB0cnVlKSAvIG1heFBheWxvYWRTaXplKTtcbiAgICAgICAgLy8gR2V0IHRoZSBmaWxlIHBhcnQgb2YgdGhlIHBheWxvYWRcbiAgICAgICAgY29uc3QgZmlsZUJ5dGVzID0gdmlldy5zbGljZShoZWFkZXJTaXplKTtcbiAgICAgICAgLy8gQXBwZW5kIHRvIGV4aXN0aW5nIGRhdGEgdGhhdCBob2xkcyB0aGUgZmlsZVxuICAgICAgICBmaWxlLmRhdGEucHVzaChmaWxlQnl0ZXMpO1xuICAgICAgICAvLyBVbmNvbW1lbnQgZm9yIGRlYnVnXG4gICAgICAgIExvZ2dlci5JbmZvKGBSZWNlaXZlZCBmaWxlIGNodW5rOiAke2ZpbGUuZGF0YS5sZW5ndGh9LyR7ZmlsZS5jaHVua3N9YCk7XG4gICAgICAgIGlmIChmaWxlLmRhdGEubGVuZ3RoID09PSBmaWxlLmNodW5rcykge1xuICAgICAgICAgICAgZmlsZS5yZWNlaXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGZpbGUudmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1JlY2VpdmVkIGNvbXBsZXRlIGZpbGUnKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyRHVyYXRpb24gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGZpbGUudGltZXN0YW1wU3RhcnQ7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2ZlckJpdHJhdGUgPSBNYXRoLnJvdW5kKChmaWxlLmNodW5rcyAqIG1heE1lc3NhZ2VTaXplKSAvIHRyYW5zZmVyRHVyYXRpb24pO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYEF2ZXJhZ2UgdHJhbnNmZXIgYml0cmF0ZTogJHt0cmFuc2ZlckJpdHJhdGV9a2IvcyBvdmVyICR7dHJhbnNmZXJEdXJhdGlvbiAvIDEwMDB9IHNlY29uZHNgKTtcbiAgICAgICAgICAgIC8vIEZpbGUgcmVjb25zdHJ1Y3Rpb25cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRXhhbXBsZSBjb2RlIHRvIHJlY29uc3RydWN0IHRoZSBmaWxlXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogVGhpcyBjb2RlIHJlY29uc3RydWN0cyB0aGUgcmVjZWl2ZWQgZGF0YSBpbnRvIHRoZSBvcmlnaW5hbCBmaWxlIGJhc2VkIG9uIHRoZSBtaW1lIHR5cGUgYW5kIGV4dGVuc2lvbiBwcm92aWRlZCBhbmQgdGhlbiBkb3dubG9hZHMgdGhlIHJlY29uc3RydWN0ZWQgZmlsZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCByZWNlaXZlZCA9IG5ldyBCbG9iKGZpbGUuZGF0YSwgeyB0eXBlOiBmaWxlLm1pbWV0eXBlIH0pO1xuICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCdocmVmJywgVVJMLmNyZWF0ZU9iamVjdFVSTChyZWNlaXZlZCkpO1xuICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgYHRyYW5zZmVyLiR7ZmlsZS5leHRlbnNpb259YCk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChhKTtcbiAgICAgICAgICAgIC8vIGlmIHlvdSBhcmUgc28gaW5jbGluZWQgdG8gbWFrZSBpdCBhdXRvLWRvd25sb2FkLCBkbyBzb21ldGhpbmcgbGlrZTogYS5jbGljaygpO1xuICAgICAgICAgICAgYS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaWxlLmRhdGEubGVuZ3RoID4gZmlsZS5jaHVua3MpIHtcbiAgICAgICAgICAgIGZpbGUucmVjZWl2aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoYFJlY2VpdmVkIGJpZ2dlciBmaWxlIHRoYW4gYWR2ZXJ0aXNlZDogJHtmaWxlLmRhdGEubGVuZ3RofS8ke2ZpbGUuY2h1bmtzfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHRlbXBsYXRlIGZvciBhIGRvd25sb2FkZWQgZmlsZVxuICovXG5leHBvcnQgY2xhc3MgRmlsZVRlbXBsYXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5taW1ldHlwZSA9ICcnO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9ICcnO1xuICAgICAgICB0aGlzLnJlY2VpdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNodW5rcyA9IDA7XG4gICAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZVV0aWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQSBjYXNlIGluc2Vuc2l0aXZlLCBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIFVSTFNlYXJjaFBhcmFtc1xuICovXG5leHBvcnQgY2xhc3MgSVVSTFNlYXJjaFBhcmFtcyB7XG4gICAgY29uc3RydWN0b3Ioc2VhcmNoKSB7XG4gICAgICAgIHRoaXMuX3VybFBhcmFtcyA9IHt9O1xuICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCk7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiB1cmxQYXJhbXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3VybFBhcmFtc1tuYW1lLnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKSBpbiB0aGlzLl91cmxQYXJhbXM7XG4gICAgfVxuICAgIGdldChuYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VybFBhcmFtc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlVUkxTZWFyY2hQYXJhbXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQ29udmVydHMgY29vcmRpbmF0ZXMgZnJvbSBlbGVtZW50IHJlbGF0aXZlIGNvb3JkaW5hdGVzIHRvIHZhbHVlcyBub3JtYWxpemVkIHdpdGhpbiB0aGUgdmFsdWUgcmFuZ2Ugb2YgYSBzaG9ydCAoYW5kIGJhY2sgYWdhaW4pXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnB1dENvb3JkVHJhbnNsYXRvciB7XG4gICAgLy8gd2UgZG9udCB1c2UgYSBjb25zdHJ1Y3RvciBoZXJlIGJlY2F1c2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGFuZCBwYXNzZWQgYXJvdW5kIHRvIHZhcmlvdXMgbG9jYXRpb25zXG4gICAgLy8gcG9zc2libHkgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAgICByZWNvbmZpZ3VyZShwbGF5ZXJTaXplLCB2aWRlb1NpemUpIHtcbiAgICAgICAgY29uc3QgcGxheWVyQXNwZWN0UmF0aW8gPSBwbGF5ZXJTaXplLmhlaWdodCAvIHBsYXllclNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHZpZGVvQXNwZWN0UmF0aW8gPSB2aWRlb1NpemUuaGVpZ2h0IC8gdmlkZW9TaXplLndpZHRoO1xuICAgICAgICB0aGlzLnBsYXllcklzTGFyZ2VyID0gcGxheWVyQXNwZWN0UmF0aW8gPiB2aWRlb0FzcGVjdFJhdGlvO1xuICAgICAgICB0aGlzLnBsYXllclNpemUgPSBwbGF5ZXJTaXplO1xuICAgICAgICB0aGlzLnJhdGlvID0gdGhpcy5wbGF5ZXJJc0xhcmdlclxuICAgICAgICAgICAgPyBwbGF5ZXJBc3BlY3RSYXRpbyAvIHZpZGVvQXNwZWN0UmF0aW9cbiAgICAgICAgICAgIDogdmlkZW9Bc3BlY3RSYXRpbyAvIHBsYXllckFzcGVjdFJhdGlvO1xuICAgIH1cbiAgICB0cmFuc2xhdGVVbnNpZ25lZCh4LCB5KSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRYID0gdGhpcy5wbGF5ZXJJc0xhcmdlclxuICAgICAgICAgICAgPyB4IC8gdGhpcy5wbGF5ZXJTaXplLndpZHRoXG4gICAgICAgICAgICA6IHRoaXMucmF0aW8gKiAoeCAvIHRoaXMucGxheWVyU2l6ZS53aWR0aCAtIDAuNSkgKyAwLjU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRZID0gdGhpcy5wbGF5ZXJJc0xhcmdlclxuICAgICAgICAgICAgPyB0aGlzLnJhdGlvICogKHkgLyB0aGlzLnBsYXllclNpemUuaGVpZ2h0IC0gMC41KSArIDAuNVxuICAgICAgICAgICAgOiB5IC8gdGhpcy5wbGF5ZXJTaXplLmhlaWdodDtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRYIDwgMC4wIHx8IG5vcm1hbGl6ZWRYID4gMS4wIHx8IG5vcm1hbGl6ZWRZIDwgMC4wIHx8IG5vcm1hbGl6ZWRZID4gMS4wKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpblJhbmdlOiBmYWxzZSwgeDogNjU1MzUsIHk6IDY1NTM1IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBpblJhbmdlOiB0cnVlLCB4OiBub3JtYWxpemVkWCAqIDY1NTM2LCB5OiBub3JtYWxpemVkWSAqIDY1NTM2IH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJhbnNsYXRlU2lnbmVkKHgsIHkpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFggPSB0aGlzLnBsYXllcklzTGFyZ2VyXG4gICAgICAgICAgICA/IHggLyAoMC41ICogdGhpcy5wbGF5ZXJTaXplLndpZHRoKVxuICAgICAgICAgICAgOiAodGhpcy5yYXRpbyAqIHgpIC8gKDAuNSAqIHRoaXMucGxheWVyU2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRZID0gdGhpcy5wbGF5ZXJJc0xhcmdlclxuICAgICAgICAgICAgPyAodGhpcy5yYXRpbyAqIHkpIC8gKDAuNSAqIHRoaXMucGxheWVyU2l6ZS5oZWlnaHQpXG4gICAgICAgICAgICA6IHkgLyAoMC41ICogdGhpcy5wbGF5ZXJTaXplLmhlaWdodCk7XG4gICAgICAgIHJldHVybiB7IHg6IG5vcm1hbGl6ZWRYICogMzI3NjcsIHk6IG5vcm1hbGl6ZWRZICogMzI3NjcgfTtcbiAgICB9XG4gICAgdW50cmFuc2xhdGVVbnNpZ25lZCh4LCB5KSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRYID0gdGhpcy5wbGF5ZXJJc0xhcmdlciA/IHggLyA2NTUzNiA6ICh4IC8gNjU1MzYgLSAwLjUpIC8gdGhpcy5yYXRpbyArIDAuNTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFkgPSB0aGlzLnBsYXllcklzTGFyZ2VyID8gKHkgLyA2NTUzNiAtIDAuNSkgLyB0aGlzLnJhdGlvICsgMC41IDogeSAvIDY1NTM2O1xuICAgICAgICByZXR1cm4geyB4OiBub3JtYWxpemVkWCAqIHRoaXMucGxheWVyU2l6ZS53aWR0aCwgeTogbm9ybWFsaXplZFkgKiB0aGlzLnBsYXllclNpemUuaGVpZ2h0IH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5wdXRDb29yZFRyYW5zbGF0b3IuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmV4cG9ydCBjbGFzcyBSVENVdGlscyB7XG4gICAgc3RhdGljIGlzVmlkZW9UcmFuc2NlaXZlcih0cmFuc2NlaXZlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5UcmFuc2NlaXZlclJlY2VpdmVWaWRlbyh0cmFuc2NlaXZlcikgfHwgdGhpcy5jYW5UcmFuc2NlaXZlclNlbmRWaWRlbyh0cmFuc2NlaXZlcik7XG4gICAgfVxuICAgIHN0YXRpYyBjYW5UcmFuc2NlaXZlclJlY2VpdmVWaWRlbyh0cmFuc2NlaXZlcikge1xuICAgICAgICByZXR1cm4gKCEhdHJhbnNjZWl2ZXIgJiZcbiAgICAgICAgICAgICh0cmFuc2NlaXZlci5kaXJlY3Rpb24gPT09ICdzZW5kcmVjdicgfHwgdHJhbnNjZWl2ZXIuZGlyZWN0aW9uID09PSAncmVjdm9ubHknKSAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlci50cmFjay5raW5kID09PSAndmlkZW8nKTtcbiAgICB9XG4gICAgc3RhdGljIGNhblRyYW5zY2VpdmVyU2VuZFZpZGVvKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiAoISF0cmFuc2NlaXZlciAmJlxuICAgICAgICAgICAgKHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCB0cmFuc2NlaXZlci5kaXJlY3Rpb24gPT09ICdzZW5kb25seScpICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlci50cmFjayAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2VuZGVyLnRyYWNrLmtpbmQgPT09ICd2aWRlbycpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNBdWRpb1RyYW5zY2VpdmVyKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhblRyYW5zY2VpdmVyUmVjZWl2ZUF1ZGlvKHRyYW5zY2VpdmVyKSB8fCB0aGlzLmNhblRyYW5zY2VpdmVyU2VuZEF1ZGlvKHRyYW5zY2VpdmVyKTtcbiAgICB9XG4gICAgc3RhdGljIGNhblRyYW5zY2VpdmVyUmVjZWl2ZUF1ZGlvKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiAoISF0cmFuc2NlaXZlciAmJlxuICAgICAgICAgICAgKHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCB0cmFuc2NlaXZlci5kaXJlY3Rpb24gPT09ICdyZWN2b25seScpICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlciAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrLmtpbmQgPT09ICdhdWRpbycpO1xuICAgIH1cbiAgICBzdGF0aWMgY2FuVHJhbnNjZWl2ZXJTZW5kQXVkaW8odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuICghIXRyYW5zY2VpdmVyICYmXG4gICAgICAgICAgICAodHJhbnNjZWl2ZXIuZGlyZWN0aW9uID09PSAnc2VuZHJlY3YnIHx8IHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9PT0gJ3NlbmRvbmx5JykgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlciAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2VuZGVyLnRyYWNrICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIudHJhY2sua2luZCA9PT0gJ2F1ZGlvJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UlRDVXRpbHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogVmlkZW8gUGxheWVyIENvbnRyb2xsZXIgaGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgdGhlIHZpZGVvIEhUTUwgZWxlbWVudCBhbmQgYWxsIGhhbmRsZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1Db250cm9sbGVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdmlkZW9FbGVtZW50UHJvdmlkZXIgVmlkZW8gUGxheWVyIGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmlkZW9FbGVtZW50UHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQcm92aWRlciA9IHZpZGVvRWxlbWVudFByb3ZpZGVyO1xuICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0F1ZGlvJyk7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIuc2V0QXVkaW9FbGVtZW50KHRoaXMuYXVkaW9FbGVtZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBQZWVyIGNvbm5lY3Rpb24gaGFzIGEgdHJhY2sgZXZlbnRcbiAgICAgKiBAcGFyYW0gcnRjVHJhY2tFdmVudCAtIFJUQyBUcmFjayBFdmVudFxuICAgICAqL1xuICAgIGhhbmRsZU9uVHJhY2socnRjVHJhY2tFdmVudCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnaGFuZGxlT25UcmFjayAnICsgSlNPTi5zdHJpbmdpZnkocnRjVHJhY2tFdmVudC5zdHJlYW1zKSk7XG4gICAgICAgIC8vIERvIG5vdCBhZGQgdGhlIHRyYWNrIGlmIHRoZSBJRCBpcyBgcHJvYmF0b3JgIGFzIHRoaXMgaXMgc3BlY2lhbCB0cmFjayBjcmVhdGVkIGJ5IG1lZGlhc291cCBmb3IgYml0cmF0ZSBwcm9iaW5nLlxuICAgICAgICAvLyBSZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vRXBpY0dhbWVzRXh0L1BpeGVsU3RyZWFtaW5nSW5mcmFzdHJ1Y3R1cmUvcHVsbC84NiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICBpZiAocnRjVHJhY2tFdmVudC5zdHJlYW1zLmxlbmd0aCA8IDEgfHwgcnRjVHJhY2tFdmVudC5zdHJlYW1zWzBdLmlkID09ICdwcm9iYXRvcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLmdldFZpZGVvRWxlbWVudCgpO1xuICAgICAgICBpZiAocnRjVHJhY2tFdmVudC50cmFjaykge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ0dvdCB0cmFjayAtICcgK1xuICAgICAgICAgICAgICAgIHJ0Y1RyYWNrRXZlbnQudHJhY2sua2luZCArXG4gICAgICAgICAgICAgICAgJyBpZD0nICtcbiAgICAgICAgICAgICAgICBydGNUcmFja0V2ZW50LnRyYWNrLmlkICtcbiAgICAgICAgICAgICAgICAnIHJlYWR5U3RhdGU9JyArXG4gICAgICAgICAgICAgICAgcnRjVHJhY2tFdmVudC50cmFjay5yZWFkeVN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnRjVHJhY2tFdmVudC50cmFjay5raW5kID09ICdhdWRpbycpIHtcbiAgICAgICAgICAgIHRoaXMuQ3JlYXRlQXVkaW9UcmFjayhydGNUcmFja0V2ZW50LnN0cmVhbXNbMF0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ0Y1RyYWNrRXZlbnQudHJhY2sua2luZCA9PSAndmlkZW8nICYmXG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQuc3JjT2JqZWN0ICE9PSBydGNUcmFja0V2ZW50LnN0cmVhbXNbMF0pIHtcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zcmNPYmplY3QgPSBydGNUcmFja0V2ZW50LnN0cmVhbXNbMF07XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnU2V0IHZpZGVvIHNvdXJjZSBmcm9tIHZpZGVvIHRyYWNrIG9udHJhY2suJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYXVkaW8gZGV2aWNlIHdoZW4gcmVjZWl2aW5nIGFuIFJUQ1RyYWNrRXZlbnQgd2l0aCB0aGUga2luZCBvZiBcImF1ZGlvXCJcbiAgICAgKiBAcGFyYW0gYXVkaW9NZWRpYVN0cmVhbSAtIEF1ZGlvIE1lZGlhIHN0cmVhbSB0cmFja1xuICAgICAqL1xuICAgIENyZWF0ZUF1ZGlvVHJhY2soYXVkaW9NZWRpYVN0cmVhbSkge1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLmdldFZpZGVvRWxlbWVudCgpO1xuICAgICAgICAvLyBkbyBub3RoaW5nIHRoZSB2aWRlbyBoYXMgdGhlIHNhbWUgbWVkaWEgc3RyZWFtIGFzIHRoZSBhdWRpbyB0cmFjayB3ZSBoYXZlIGhlcmUgKHRoZXkgYXJlIGxpbmtlZClcbiAgICAgICAgaWYgKHZpZGVvRWxlbWVudC5zcmNPYmplY3QgPT0gYXVkaW9NZWRpYVN0cmVhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHZpZGVvIGVsZW1lbnQgaGFzIHNvbWUgb3RoZXIgbWVkaWEgc3RyZWFtIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF1ZGlvIHRyYWNrXG4gICAgICAgIGVsc2UgaWYgKHZpZGVvRWxlbWVudC5zcmNPYmplY3QgJiYgdmlkZW9FbGVtZW50LnNyY09iamVjdCAhPT0gYXVkaW9NZWRpYVN0cmVhbSkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGF1ZGlvIGVsZW1lbnRcbiAgICAgICAgICAgIHRoaXMuYXVkaW9FbGVtZW50LnNyY09iamVjdCA9IGF1ZGlvTWVkaWFTdHJlYW07XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnQ3JlYXRlZCBuZXcgYXVkaW8gZWxlbWVudCB0byBwbGF5IHNlcGFyYXRlIGF1ZGlvIHN0cmVhbS4nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmVhbUNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEZsYWdzIH0gZnJvbSAnLi4vQ29uZmlnL0NvbmZpZyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG4vKipcbiAqIFRoZSB2aWRlbyBwbGF5ZXIgaHRtbCBlbGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBWaWRlb1BsYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZpZGVvRWxlbWVudFBhcmVudCB0aGUgaHRtbCBkaXYgdGhlIHRoZSB2aWRlbyBwbGF5ZXIgd2lsbCBiZSBpbmplY3RlZCBpbnRvXG4gICAgICogQHBhcmFtIGNvbmZpZyB0aGUgYXBwbGljYXRpb25zIGNvbmZpZ3VyYXRpb24uIFdlJ3JlIGludGVyZXN0ZWQgaW4gdGhlIHN0YXJ0VmlkZW9NdXRlZCBmbGFnXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmlkZW9FbGVtZW50UGFyZW50LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5sYXN0VGltZVJlc2l6ZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuaWQgPSAnc3RyZWFtaW5nVmlkZW8nO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IHRydWU7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50LnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHZpZGVvRWxlbWVudFBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLnZpZGVvRWxlbWVudCk7XG4gICAgICAgIHRoaXMub25SZXNpemVQbGF5ZXJDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXNvbHV0aW9uIGNoYW5nZWQsIHJlc3R5bGluZyBwbGF5ZXIsIGRpZCB5b3UgZm9yZ2V0IHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24/Jyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbkNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1Jlc29sdXRpb24gY2hhbmdlZCBhbmQgbWF0Y2ggdmlld3BvcnQgcmVzb2x1dGlvbiBpcyB0dXJuZWQgb24sIGRpZCB5b3UgZm9yZ2V0IHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24/Jyk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIHNldCBwbGF5IGZvciB2aWRlbyAoYW5kIGF1ZGlvKVxuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50ICE9IHVuZGVmaW5lZCAmJiB0aGlzLmF1ZGlvRWxlbWVudC5wYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC5wbGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52aWRlb0VsZW1lbnQucGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQucGxheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5vbmxvYWRlZG1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblZpZGVvSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gc2V0IHJlc2l6ZSBldmVudHMgdG8gdGhlIHdpbmRvd3MgaWYgaXQgaXMgcmVzaXplZCBvciBpdHMgb3JpZW50YXRpb24gaXMgY2hhbmdlZFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5yZXNpemVQbGF5ZXJTdHlsZSgpLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgKCkgPT4gdGhpcy5vbk9yaWVudGF0aW9uQ2hhbmdlKCkpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuc3JjT2JqZWN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLmF1ZGlvRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQuc3JjID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0QXVkaW9FbGVtZW50KGF1ZGlvRWxlbWVudCkge1xuICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudCA9IGF1ZGlvRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB1cCB0aGUgdmlkZW8gZWxlbWVudCB3aXRoIGFueSBhcHBsaWNhdGlvbiBjb25maWcgYW5kIHBsYXlzIHRoZSB2aWRlbyBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBmb3IgaWYgcGxheWluZyB0aGUgdmlkZW8gd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LlxuICAgICAqL1xuICAgIHBsYXkoKSB7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm11dGVkID0gdGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5TdGFydFZpZGVvTXV0ZWQpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5hdXRvcGxheSA9IHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQXV0b1BsYXlWaWRlbyk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvRWxlbWVudC5wbGF5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZpZGVvIGVsZW1lbnQgaXMgcGF1c2VkLlxuICAgICAqL1xuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlb0VsZW1lbnQucGF1c2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyAtIHdoZXRoZXIgdGhlIHZpZGVvIGVsZW1lbnQgaXMgcGxheWluZy5cbiAgICAgKi9cbiAgICBpc1ZpZGVvUmVhZHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvRWxlbWVudC5yZWFkeVN0YXRlICE9PSB1bmRlZmluZWQgJiYgdGhpcy52aWRlb0VsZW1lbnQucmVhZHlTdGF0ZSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZpZGVvIGVsZW1lbnQgaGFzIGEgdmFsaWQgdmlkZW8gc291cmNlIChzcmNPYmplY3QpLlxuICAgICAqL1xuICAgIGhhc1ZpZGVvU291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlb0VsZW1lbnQuc3JjT2JqZWN0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy52aWRlb0VsZW1lbnQuc3JjT2JqZWN0ICE9PSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgaHRtbCB2aWRlbyBlbGVtZW50XG4gICAgICogQHJldHVybnMgLSB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSB2aWRlbyBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0VmlkZW9FbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlb0VsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSBodG1sIHZpZGVvIGVsZW1lbnRzIHBhcmVudFxuICAgICAqIEByZXR1cm5zIC0gdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgdmlkZW8gZWxlbWVudHMgcGFyZW50XG4gICAgICovXG4gICAgZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLnZpZGVvRWxlbWVudC5wYXJlbnRFbGVtZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgVmlkZW8gRWxlbWVudHMgc3JjIG9iamVjdCB0cmFja3MgdG8gZW5hYmxlXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBFbmFibGUgVHJhY2tzIG9uIHRoZSBTcmMgT2JqZWN0XG4gICAgICovXG4gICAgc2V0VmlkZW9FbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgICAgLy8gdGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrIHVudGlsIHR5cGUgc2NyaXB0cyB2aWRlbyBlbGVtZW50IGlzIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmVlZCBmb3IgdHJhY2tzIG9uIGEgaHRtbCB2aWRlbyBlbGVtZW50XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHRoaXMudmlkZW9FbGVtZW50O1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3JjT2JqZWN0XG4gICAgICAgICAgICAuZ2V0VHJhY2tzKClcbiAgICAgICAgICAgIC5mb3JFYWNoKCh0cmFjaykgPT4gKHRyYWNrLmVuYWJsZWQgPSBlbmFibGVkKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG92ZXJyaWRlIGZvciB3aGVuIHRoZSB2aWRlbyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGEgc3JjT2JqZWN0XG4gICAgICovXG4gICAgb25WaWRlb0luaXRpYWxpemVkKCkge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogT24gdGhlIG9yaWVudGF0aW9uIGNoYW5nZSBvZiBhIHdpbmRvdyBjbGVhciB0aGUgdGltZW91dFxuICAgICAqL1xuICAgIG9uT3JpZW50YXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm9yaWVudGF0aW9uQ2hhbmdlVGltZW91dCk7XG4gICAgICAgIHRoaXMub3JpZW50YXRpb25DaGFuZ2VUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVQbGF5ZXJTdHlsZSgpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBwbGF5ZXIgc3R5bGUgYmFzZWQgb24gdGhlIHdpbmRvdyBoZWlnaHQgYW5kIHdpZHRoXG4gICAgICogQHJldHVybnMgLSBuaWwgaWYgcmVxdWlyZW1lbnRzIGFyZSBzYXRpc2ZpZWRcbiAgICAgKi9cbiAgICByZXNpemVQbGF5ZXJTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKCF2aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvU3RyZWFtU2l6ZSgpO1xuICAgICAgICBpZiAodmlkZW9FbGVtZW50UGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnZml4ZWQtc2l6ZScpKSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzaXplUGxheWVyQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb250cm9scyBmb3IgcmVzaXppbmcgdGhlIHBsYXllclxuICAgICAgICB0aGlzLnJlc2l6ZVBsYXllclN0eWxlVG9GaWxsUGFyZW50RWxlbWVudCgpO1xuICAgICAgICB0aGlzLm9uUmVzaXplUGxheWVyQ2FsbGJhY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgcGxheWVyIGVsZW1lbnQgdG8gZmlsbCB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKi9cbiAgICByZXNpemVQbGF5ZXJTdHlsZVRvRmlsbFBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIC8vVmlkZW8gaXMgbm90IGluaXRpYWxpemVkIHlldCBzbyBzZXQgdmlkZW9FbGVtZW50UGFyZW50IHRvIHNpemUgb2YgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgY29uc3Qgc3R5bGVXaWR0aCA9ICcxMDAlJztcbiAgICAgICAgY29uc3Qgc3R5bGVIZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgIGNvbnN0IHN0eWxlVG9wID0gMDtcbiAgICAgICAgY29uc3Qgc3R5bGVMZWZ0ID0gMDtcbiAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAndG9wOiAnICtcbiAgICAgICAgICAgIHN0eWxlVG9wICtcbiAgICAgICAgICAgICdweDsgbGVmdDogJyArXG4gICAgICAgICAgICBzdHlsZUxlZnQgK1xuICAgICAgICAgICAgJ3B4OyB3aWR0aDogJyArXG4gICAgICAgICAgICBzdHlsZVdpZHRoICtcbiAgICAgICAgICAgICc7IGhlaWdodDogJyArXG4gICAgICAgICAgICBzdHlsZUhlaWdodCArXG4gICAgICAgICAgICAnOyBjdXJzb3I6IGRlZmF1bHQ7Jyk7XG4gICAgfVxuICAgIHVwZGF0ZVZpZGVvU3RyZWFtU2l6ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAobm93IC0gdGhpcy5sYXN0VGltZVJlc2l6ZWQgPiAzMDApIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAoIXZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbkNhbGxiYWNrKHZpZGVvRWxlbWVudFBhcmVudC5jbGllbnRXaWR0aCwgdmlkZW9FbGVtZW50UGFyZW50LmNsaWVudEhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RUaW1lUmVzaXplZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1Jlc2l6aW5nIHRvbyBvZnRlbiAtIHNraXBwaW5nJyk7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0SGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplVGltZW91dEhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlVmlkZW9TdHJlYW1TaXplKCksIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWRlb1BsYXllci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgV2ViU29ja2V0VHJhbnNwb3J0LCBMb2dnZXIsIFNpZ25hbGxpbmdQcm90b2NvbCwgTWVzc2FnZXMsIE1lc3NhZ2VIZWxwZXJzLCBLZWVwYWxpdmVNb25pdG9yIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuaW1wb3J0IHsgU3RyZWFtQ29udHJvbGxlciB9IGZyb20gJy4uL1ZpZGVvUGxheWVyL1N0cmVhbUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgRnJlZXplRnJhbWVDb250cm9sbGVyIH0gZnJvbSAnLi4vRnJlZXplRnJhbWUvRnJlZXplRnJhbWVDb250cm9sbGVyJztcbmltcG9ydCB7IEFGS0NvbnRyb2xsZXIgfSBmcm9tICcuLi9BRksvQUZLQ29udHJvbGxlcic7XG5pbXBvcnQgeyBEYXRhQ2hhbm5lbENvbnRyb2xsZXIgfSBmcm9tICcuLi9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbENvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyIH0gZnJvbSAnLi4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGFncywgQ29udHJvbFNjaGVtZVR5cGUsIFRleHRQYXJhbWV0ZXJzLCBPcHRpb25QYXJhbWV0ZXJzLCBOdW1lcmljUGFyYW1ldGVycyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgSW5pdGlhbFNldHRpbmdzIH0gZnJvbSAnLi4vRGF0YUNoYW5uZWwvSW5pdGlhbFNldHRpbmdzJztcbmltcG9ydCB7IExhdGVuY3lUZXN0UmVzdWx0cyB9IGZyb20gJy4uL0RhdGFDaGFubmVsL0xhdGVuY3lUZXN0UmVzdWx0cyc7XG5pbXBvcnQgeyBGaWxlVGVtcGxhdGUsIEZpbGVVdGlsIH0gZnJvbSAnLi4vVXRpbC9GaWxlVXRpbCc7XG5pbXBvcnQgeyBJbnB1dENsYXNzZXNGYWN0b3J5IH0gZnJvbSAnLi4vSW5wdXRzL0lucHV0Q2xhc3Nlc0ZhY3RvcnknO1xuaW1wb3J0IHsgVmlkZW9QbGF5ZXIgfSBmcm9tICcuLi9WaWRlb1BsYXllci9WaWRlb1BsYXllcic7XG5pbXBvcnQgeyBTdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgTWVzc2FnZURpcmVjdGlvbiB9IGZyb20gJy4uL1VlSW5zdGFuY2VNZXNzYWdlL1N0cmVhbU1lc3NhZ2VDb250cm9sbGVyJztcbmltcG9ydCB7IFJlc3BvbnNlQ29udHJvbGxlciB9IGZyb20gJy4uL1VlSW5zdGFuY2VNZXNzYWdlL1Jlc3BvbnNlQ29udHJvbGxlcic7XG5pbXBvcnQgeyBTZW5kTWVzc2FnZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9VZUluc3RhbmNlTWVzc2FnZS9TZW5kTWVzc2FnZUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgVG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlciB9IGZyb20gJy4uL1VlSW5zdGFuY2VNZXNzYWdlL1RvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxTZW5kZXIgfSBmcm9tICcuLi9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbFNlbmRlcic7XG5pbXBvcnQgeyBJbnB1dENvb3JkVHJhbnNsYXRvciB9IGZyb20gJy4uL1V0aWwvSW5wdXRDb29yZFRyYW5zbGF0b3InO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxDbG9zZUV2ZW50LCBEYXRhQ2hhbm5lbEVycm9yRXZlbnQsIERhdGFDaGFubmVsT3BlbkV2ZW50LCBIaWRlRnJlZXplRnJhbWVFdmVudCwgTG9hZEZyZWV6ZUZyYW1lRXZlbnQsIFBsYXlTdHJlYW1FcnJvckV2ZW50LCBQbGF5U3RyZWFtRXZlbnQsIFBsYXlTdHJlYW1SZWplY3RlZEV2ZW50LCBTaG93T25TY3JlZW5LZXlib2FyZEV2ZW50LCBTdHJlYW1lckxpc3RNZXNzYWdlRXZlbnQsIFN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZUV2ZW50IH0gZnJvbSAnLi4vVXRpbC9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgSVVSTFNlYXJjaFBhcmFtcyB9IGZyb20gJy4uL1V0aWwvSVVSTFNlYXJjaFBhcmFtcyc7XG5pbXBvcnQgeyBCcm93c2VyVXRpbHMgfSBmcm9tICcuLi9VdGlsL0Jyb3dzZXJVdGlscyc7XG4vKipcbiAqIEVudHJ5IHBvaW50IGZvciB0aGUgV2ViUlRDIFBsYXllclxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjUGxheWVyQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gdGhlIGZyb250ZW5kIGNvbmZpZyBvYmplY3RcbiAgICAgKiBAcGFyYW0gcGl4ZWxTdHJlYW1pbmcgLSB0aGUgUGl4ZWxTdHJlYW1pbmcgb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBwaXhlbFN0cmVhbWluZykge1xuICAgICAgICB0aGlzLnNob3VsZFNob3dQbGF5T3ZlcmxheSA9IHRydWU7XG4gICAgICAgIHRoaXMuYXV0b0pvaW5UaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcgPSBwaXhlbFN0cmVhbWluZztcbiAgICAgICAgdGhpcy5yZXNwb25zZUNvbnRyb2xsZXIgPSBuZXcgUmVzcG9uc2VDb250cm9sbGVyKCk7XG4gICAgICAgIHRoaXMuZmlsZSA9IG5ldyBGaWxlVGVtcGxhdGUoKTtcbiAgICAgICAgdGhpcy5zZHBDb25zdHJhaW50cyA9IHtcbiAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlQXVkaW86IHRydWUsXG4gICAgICAgICAgICBvZmZlclRvUmVjZWl2ZVZpZGVvOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIC8vIHNldCB1cCB0aGUgYWZrIGxvZ2ljIGNsYXNzIGFuZCBjb25uZWN0IHVwIGl0cyBtZXRob2QgZm9yIGNsb3NpbmcgdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgICAgdGhpcy5hZmtDb250cm9sbGVyID0gbmV3IEFGS0NvbnRyb2xsZXIodGhpcy5jb25maWcsIHRoaXMucGl4ZWxTdHJlYW1pbmcsIHRoaXMub25BZmtUcmlnZ2VyZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuYWZrQ29udHJvbGxlci5vbkFGS1RpbWVkT3V0Q2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU2lnbmFsaW5nU2VydmVyKCdZb3UgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCBkdWUgdG8gaW5hY3Rpdml0eS4nLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyID0gbmV3IEZyZWV6ZUZyYW1lQ29udHJvbGxlcih0aGlzLnBpeGVsU3RyZWFtaW5nLnZpZGVvRWxlbWVudFBhcmVudCk7XG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIgPSBuZXcgVmlkZW9QbGF5ZXIodGhpcy5waXhlbFN0cmVhbWluZy52aWRlb0VsZW1lbnRQYXJlbnQsIHRoaXMuY29uZmlnKTtcbiAgICAgICAgdGhpcy52aWRlb1BsYXllci5vblZpZGVvSW5pdGlhbGl6ZWQgPSAoKSA9PiB0aGlzLmhhbmRsZVZpZGVvSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgLy8gV2hlbiBpbiBtYXRjaCB2aWV3cG9ydCByZXNvbHV0aW9uIG1vZGUsIHdoZW4gdGhlIGJyb3dzZXIgdmlld3BvcnQgaXMgcmVzaXplZCB3ZSBzZW5kIGEgcmVzaXplIGNvbW1hbmQgYmFjayB0byBVRS5cbiAgICAgICAgdGhpcy52aWRlb1BsYXllci5vbk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uQ2FsbGJhY2sgPSAod2lkdGgsIGhlaWdodCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgICAgICAnUmVzb2x1dGlvbi5XaWR0aCc6IHdpZHRoLFxuICAgICAgICAgICAgICAgICdSZXNvbHV0aW9uLkhlaWdodCc6IGhlaWdodFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtKU09OLnN0cmluZ2lmeShkZXNjcmlwdG9yKV0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyBFdmVyeSB0aW1lIHZpZGVvIHBsYXllciBpcyByZXNpemVkIGluIGJyb3dzZXIgd2UgbmVlZCB0byByZWluaXRpYWxpemUgdGhlIG1vdXNlIGNvb3JkaW5hdGUgY29udmVyc2lvbiBhbmQgZnJlZXplIGZyYW1lIHNpemluZyBsb2dpYy5cbiAgICAgICAgdGhpcy52aWRlb1BsYXllci5vblJlc2l6ZVBsYXllckNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRVcE1vdXNlQW5kRnJlZXplRnJhbWUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIodGhpcy52aWRlb1BsYXllcik7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlciA9IG5ldyBJbnB1dENvb3JkVHJhbnNsYXRvcigpO1xuICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyID0gbmV3IERhdGFDaGFubmVsQ29udHJvbGxlcigpO1xuICAgICAgICB0aGlzLnJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIgPSBuZXcgRGF0YUNoYW5uZWxDb250cm9sbGVyKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEYXRhQ2hhbm5lbEV2ZW50RW1pdHRlcnModGhpcy5zZW5kcmVjdkRhdGFDaGFubmVsQ29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEYXRhQ2hhbm5lbEV2ZW50RW1pdHRlcnModGhpcy5yZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbFNlbmRlciA9IG5ldyBEYXRhQ2hhbm5lbFNlbmRlcih0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbFNlbmRlci5yZXNldEFma1dhcm5pbmdUaW1lck9uRGF0YVNlbmQgPSAoKSA9PiB0aGlzLmFma0NvbnRyb2xsZXIucmVzZXRBZmtXYXJuaW5nVGltZXIoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1NZXNzYWdlQ29udHJvbGxlcigpO1xuICAgICAgICAvLyBzZXQgdXAgd2Vic29ja2V0IG1ldGhvZHNcbiAgICAgICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgV2ViU29ja2V0VHJhbnNwb3J0KGNvbmZpZy53ZWJTb2NrZXRQcm90b2NvbHMpO1xuICAgICAgICB0aGlzLnByb3RvY29sID0gbmV3IFNpZ25hbGxpbmdQcm90b2NvbCh0aGlzLnRyYW5zcG9ydCk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuYWRkTGlzdGVuZXIoTWVzc2FnZXMuY29uZmlnLnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZU9uQ29uZmlnTWVzc2FnZShtc2cpKTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5hZGRMaXN0ZW5lcihNZXNzYWdlcy5waW5nLnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZVBpbmdNZXNzYWdlKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnN0cmVhbWVyTGlzdC50eXBlTmFtZSwgKG1zZykgPT4gdGhpcy5oYW5kbGVTdHJlYW1lckxpc3RNZXNzYWdlKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnN1YnNjcmliZUZhaWxlZC50eXBlTmFtZSwgKG1zZykgPT4gdGhpcy5oYW5kbGVTdWJzY3JpYmVGYWlsZWRNZXNzYWdlKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnN0cmVhbWVySWRDaGFuZ2VkLnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZVN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZShtc2cpKTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5hZGRMaXN0ZW5lcihNZXNzYWdlcy5wbGF5ZXJDb3VudC50eXBlTmFtZSwgKG1zZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxheWVyQ291bnRNZXNzYWdlID0gbXNnO1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25QbGF5ZXJDb3VudChwbGF5ZXJDb3VudE1lc3NhZ2UuY291bnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5hZGRMaXN0ZW5lcihNZXNzYWdlcy5hbnN3ZXIudHlwZU5hbWUsIChtc2cpID0+IHRoaXMuaGFuZGxlV2ViUnRjQW5zd2VyKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLm9mZmVyLnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZVdlYlJ0Y09mZmVyKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnBlZXJEYXRhQ2hhbm5lbHMudHlwZU5hbWUsIChtc2cpID0+IHRoaXMuaGFuZGxlV2ViUnRjU0ZVUGVlckRhdGFjaGFubmVscyhtc2cpKTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5hZGRMaXN0ZW5lcihNZXNzYWdlcy5pY2VDYW5kaWRhdGUudHlwZU5hbWUsIChtc2cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGljZUNhbmRpZGF0ZU1lc3NhZ2UgPSBtc2c7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUljZUNhbmRpZGF0ZShpY2VDYW5kaWRhdGVNZXNzYWdlLmNhbmRpZGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb3RvY29sLnRyYW5zcG9ydC5hZGRMaXN0ZW5lcignb3BlbicsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLmxpc3RTdHJlYW1lcnMpO1xuICAgICAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDA7XG4gICAgICAgICAgICB0aGlzLmlzUmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb3RvY29sLnRyYW5zcG9ydC5hZGRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBkb250IHJlYWxseSBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUgc2luY2UgdGhlIGNsb3NlIGV2ZW50IHNob3VsZCBmb2xsb3cuXG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEdvdCBhIHRyYW5zcG9ydCBlcnJvci5gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wudHJhbnNwb3J0LmFkZExpc3RlbmVyKCdjbG9zZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gd2hlbiB3ZSByZWZyZXNoIHRoZSBwYWdlIGR1cmluZyBhIHN0cmVhbSB3ZSBnZXQgdGhlIGdvaW5nIGF3YXkgY29kZS5cbiAgICAgICAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29ubmVjdCBzaW5jZSB3ZSdyZSBuYXZpZ2F0aW5nIGF3YXkuXG4gICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ2xvc2VFdmVudC9jb2RlXG4gICAgICAgICAgICAvLyBsaXN0cyBhbGwgdGhlIGNvZGVzLlxuICAgICAgICAgICAgY29uc3QgQ09ERV9HT0lOR19BV0FZID0gMTAwMTtcbiAgICAgICAgICAgIGNvbnN0IG1heFJlY29ubmVjdEF0dGVtcHRzID0gdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cyk7XG4gICAgICAgICAgICBjb25zdCBhdHRlbXB0c0xlZnQgPSB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPCBtYXhSZWNvbm5lY3RBdHRlbXB0cztcbiAgICAgICAgICAgIGNvbnN0IHJlY29ubmVjdEVuYWJsZWQgPSB0aGlzLmZvcmNlUmVjb25uZWN0IHx8ICh0aGlzLmVuYWJsZUF1dG9SZWNvbm5lY3QgJiYgbWF4UmVjb25uZWN0QXR0ZW1wdHMgPiAwICYmIGF0dGVtcHRzTGVmdCk7XG4gICAgICAgICAgICBjb25zdCB3aWxsVHJ5UmVjb25uZWN0ID0gcmVjb25uZWN0RW5hYmxlZCAmJiBldmVudC5jb2RlICE9IENPREVfR09JTkdfQVdBWTtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93Q2xpY2tUb1JlY29ubmVjdCA9ICF3aWxsVHJ5UmVjb25uZWN0O1xuICAgICAgICAgICAgY29uc3QgZGlzY29ubmVjdE1lc3NhZ2UgPSB0aGlzLmRpc2Nvbm5lY3RNZXNzYWdlID8gdGhpcy5kaXNjb25uZWN0TWVzc2FnZSA6IGV2ZW50LnJlYXNvbjtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VSZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBjb2RlY3Mgb24gZGlzY29ubmVjdCBzbyB0aGF0IGlmIHRoZSBuZXh0IGNvbm5lY3Rpb24gaGFzIFwiTmVnb3RpYXRlQ29kZWNzXCIgb25cbiAgICAgICAgICAgIC8vIHRoZW4gYWxsIGNvZGVjcyBjYW4gYmUgbmVnb3RpYXRlZFxuICAgICAgICAgICAgdGhpcy5jb25maWcuZ2V0U2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjKS5vcHRpb25zID1cbiAgICAgICAgICAgICAgICBCcm93c2VyVXRpbHMuZ2V0U3VwcG9ydGVkVmlkZW9Db2RlY3MoKTtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uRGlzY29ubmVjdChkaXNjb25uZWN0TWVzc2FnZSwgYWxsb3dDbGlja1RvUmVjb25uZWN0KTtcbiAgICAgICAgICAgIHRoaXMuYWZrQ29udHJvbGxlci5zdG9wQWZrV2FybmluZ1RpbWVyKCk7XG4gICAgICAgICAgICAvLyBzdG9wIHNlbmRpbmcgc3RhdHMgb24gaW50ZXJ2YWwgaWYgd2UgaGF2ZSBjbG9zZWQgb3VyIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRzVGltZXJIYW5kbGUgJiYgdGhpcy5zdGF0c1RpbWVySGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXRzVGltZXJIYW5kbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHN0cmVhbSBxdWFsaXR5IGljb24uXG4gICAgICAgICAgICB0aGlzLnNldFZpZGVvRW5jb2RlckF2Z1FQKDApO1xuICAgICAgICAgICAgLy8gdW5yZWdpc3RlciBhbGwgaW5wdXQgZGV2aWNlIGV2ZW50IGhhbmRsZXJzIG9uIGRpc2Nvbm5lY3RcbiAgICAgICAgICAgIHRoaXMuc2V0VG91Y2hJbnB1dEVuYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zZXRNb3VzZUlucHV0RW5hYmxlZChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnNldEtleWJvYXJkSW5wdXRFbmFibGVkKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0R2FtZVBhZElucHV0RW5hYmxlZChmYWxzZSk7XG4gICAgICAgICAgICBpZiAod2lsbFRyeVJlY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIC8vIG5lZWQgYSBzbWFsbCBkZWxheSBoZXJlIHRvIHByZXZlbnQgcmVjb25uZWN0IHNwYW1taW5nXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvUmVjb25uZWN0KGV2ZW50LnJlYXNvbik7XG4gICAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBzZXQgdXAgdGhlIGZpbmFsIHdlYlJ0YyBwbGF5ZXIgY29udHJvbGxlciBtZXRob2RzIGZyb20gd2l0aGluIG91ciBhcHBsaWNhdGlvbiBzbyBhIGNvbm5lY3Rpb24gY2FuIGJlIGFjdGl2YXRlZFxuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTZW5kTWVzc2FnZUNvbnRyb2xsZXIodGhpcy5kYXRhQ2hhbm5lbFNlbmRlciwgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlcik7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlciA9IG5ldyBUb1N0cmVhbWVyTWVzc2FnZXNDb250cm9sbGVyKHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVycygpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnBvcHVsYXRlRGVmYXVsdFByb3RvY29sKCk7XG4gICAgICAgIHRoaXMuaW5wdXRDbGFzc2VzRmFjdG9yeSA9IG5ldyBJbnB1dENsYXNzZXNGYWN0b3J5KHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIsIHRoaXMudmlkZW9QbGF5ZXIsIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlcik7XG4gICAgICAgIHRoaXMuaXNVc2luZ1NGVSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzVXNpbmdTVkMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1F1YWxpdHlDb250cm9sbGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJlZmVycmVkQ29kZWMgPSAnJztcbiAgICAgICAgdGhpcy5lbmFibGVBdXRvUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb3JjZVJlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwO1xuICAgICAgICB0aGlzLmlzUmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk9wdGlvblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkLCAoc3RyZWFtZXJpZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0cmVhbWVyaWQgPT09IHVuZGVmaW5lZCB8fCBzdHJlYW1lcmlkID09PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBjdXJyZW50IHBlZXIgY29ubmVjdGlvbiBhbmQgY3JlYXRlIGEgbmV3IG9uZVxuICAgICAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIucGVlckNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLmNyZWF0ZVBlZXJDb25uZWN0aW9uKHRoaXMucGVlckNvbmZpZywgdGhpcy5wcmVmZXJyZWRDb2RlYyk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZWRTdHJlYW0gPSBzdHJlYW1lcmlkO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMuc3Vic2NyaWJlLCB7IHN0cmVhbWVySWQ6IHN0cmVhbWVyaWQgfSk7XG4gICAgICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uT3B0aW9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHksIChwcmVmZXJyZWRRdWFsaXR5KSA9PiB7XG4gICAgICAgICAgICBpZiAocHJlZmVycmVkUXVhbGl0eSA9PT0gdW5kZWZpbmVkIHx8IHByZWZlcnJlZFF1YWxpdHkgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1VzaW5nU1ZDKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlciBpcyB1c2luZyBTVkMgc28gc2VsZWN0ZWQgcXVhbGl0eSB3aWxsIGJlIG9mIHRoZSBmb3JtIFN4VHkoaCkuIEp1c3QgZXh0cmFjdCB0aGUgeCBhbmQgeSBudW1iZXJzXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMubGF5ZXJQcmVmZXJlbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIHNwYXRpYWxMYXllcjogK3ByZWZlcnJlZFF1YWxpdHlbMV0gLSAxLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbExheWVyOiArcHJlZmVycmVkUXVhbGl0eVszXSAtIDFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZXIgaXMgbm90IHVzaW5nIFNWQyBzbyB0aGUgc2VsZWN0ZWQgcXVhbGl0eSB3aWxsIGJlIGVpdGhlciBMb3csIE1lZGl1bSBvciBIaWdoIHNvIHdlIGV4dHJhY3QgdGhlIGFwcHJvcHJpYXRlIHNwYXRpYWwgbGF5ZXIgaW5kZXhcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxRdWFsaXRpZXMgPSB0aGlzLmNvbmZpZy5nZXRTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSkub3B0aW9ucztcbiAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5SW5kZXggPSBhbGxRdWFsaXRpZXMuaW5kZXhPZihwcmVmZXJyZWRRdWFsaXR5KTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5sYXllclByZWZlcmVuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhdGlhbExheWVyOiBxdWFsaXR5SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsTGF5ZXI6IDBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldFZpZGVvRW5jb2RlckF2Z1FQKC0xKTtcbiAgICAgICAgdGhpcy5zaWduYWxsaW5nVXJsQnVpbGRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNpZ25hbGxpbmdTZXJ2ZXJVcmwgPSB0aGlzLmNvbmZpZy5nZXRUZXh0U2V0dGluZ1ZhbHVlKFRleHRQYXJhbWV0ZXJzLlNpZ25hbGxpbmdTZXJ2ZXJVcmwpO1xuICAgICAgICAgICAgcmV0dXJuIHNpZ25hbGxpbmdTZXJ2ZXJVcmw7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSB2aWRlbyBwbGF5ZXIgYW5kIG1ha2VzIHN1cmUgcmVzb3VyY2VzIGFyZSBmcmVlZC4gVGhpcyBoZWxwcyB0byBwcmV2ZW50IHRoZSBpc3N1ZSBpbiBjaHJvbWVcbiAgICAgKiB3aGVyZSBpdCByZWZ1c2VzIHRvIG1ha2UgbmV3IHZpZGVvIHBsYXllcnMuXG4gICAgICovXG4gICAgZGVzdHJveVZpZGVvUGxheWVyKCkge1xuICAgICAgICB0aGlzLnZpZGVvUGxheWVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgICAqIEBwYXJhbSBldmVudCAtIE1lc3NhZ2UgRXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVPbk1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KGV2ZW50LmRhdGEpO1xuICAgICAgICBMb2dnZXIuSW5mbygnTWVzc2FnZSBpbmNvbWluZzonICsgbWVzc2FnZSk7XG4gICAgICAgIC8vdHJ5IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLmZyb21TdHJlYW1lck1lc3NhZ2VzLmdldChtZXNzYWdlWzBdKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5mcm9tU3RyZWFtZXJIYW5kbGVycy5nZXQobWVzc2FnZVR5cGUpKGV2ZW50LmRhdGEpO1xuICAgICAgICAvL30gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy9Mb2dnZXIuRXJyb3IoTG9nZ2VyLkdldFN0YWNrVHJhY2UoKSwgYEN1c3RvbSBkYXRhIGNoYW5uZWwgbWVzc2FnZSB3aXRoIG1lc3NhZ2UgdHlwZSB0aGF0IGlzIHVua25vd24gdG8gdGhlIFBpeGVsIFN0cmVhbWluZyBwcm90b2NvbC4gRG9lcyB5b3VyIFBpeGVsU3RyZWFtaW5nUHJvdG9jb2wgbmVlZCB1cGRhdGluZz8gVGhlIG1lc3NhZ2UgdHlwZSB3YXM6ICR7bWVzc2FnZVswXX1gKTtcbiAgICAgICAgLy99XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIG1lc3NhZ2UgYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcnMoKSB7XG4gICAgICAgIC8vIEZyb20gU3RyZWFtZXJcbiAgICAgICAgLy8gTWVzc2FnZSBldmVudHMgZnJvbSB0aGUgc3RyZWFtZXIgaGF2ZSBhIGRhdGEgdHlwZSBvZiBBcnJheUJ1ZmZlciBhcyB3ZSBmb3JjZSB0aGlzIHR5cGUgaW4gdGhlIERhdGFjaGFubmVsQ29udHJvbGxlclxuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdRdWFsaXR5Q29udHJvbE93bmVyc2hpcCcsIChkYXRhKSA9PiB0aGlzLm9uUXVhbGl0eUNvbnRyb2xPd25lcnNoaXAoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdSZXNwb25zZScsIChkYXRhKSA9PiB0aGlzLnJlc3BvbnNlQ29udHJvbGxlci5vblJlc3BvbnNlKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnQ29tbWFuZCcsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ29tbWFuZChkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ0ZyZWV6ZUZyYW1lJywgKGRhdGEpID0+IHRoaXMub25GcmVlemVGcmFtZU1lc3NhZ2UoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdVbmZyZWV6ZUZyYW1lJywgKCkgPT4gdGhpcy5pbnZhbGlkYXRlRnJlZXplRnJhbWVBbmRFbmFibGVWaWRlbygpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnVmlkZW9FbmNvZGVyQXZnUVAnLCAoZGF0YSkgPT4gdGhpcy5oYW5kbGVWaWRlb0VuY29kZXJBdmdRUChkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ0xhdGVuY3lUZXN0JywgKGRhdGEpID0+IHRoaXMuaGFuZGxlTGF0ZW5jeVRlc3RSZXN1bHQoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdEYXRhQ2hhbm5lbExhdGVuY3lUZXN0JywgKGRhdGEpID0+IHRoaXMuaGFuZGxlRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3BvbnNlKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnSW5pdGlhbFNldHRpbmdzJywgKGRhdGEpID0+IHRoaXMuaGFuZGxlSW5pdGlhbFNldHRpbmdzKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnRmlsZUV4dGVuc2lvbicsIChkYXRhKSA9PiB0aGlzLm9uRmlsZUV4dGVuc2lvbihkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ0ZpbGVNaW1lVHlwZScsIChkYXRhKSA9PiB0aGlzLm9uRmlsZU1pbWVUeXBlKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnRmlsZUNvbnRlbnRzJywgKGRhdGEpID0+IHRoaXMub25GaWxlQ29udGVudHMoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdUZXN0RWNobycsICgpID0+IHtcbiAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ0lucHV0Q29udHJvbE93bmVyc2hpcCcsIChkYXRhKSA9PiB0aGlzLm9uSW5wdXRDb250cm9sT3duZXJzaGlwKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnR2FtZXBhZFJlc3BvbnNlJywgKGRhdGEpID0+IHRoaXMub25HYW1lcGFkUmVzcG9uc2UoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdNdWx0aXBsZXhlZCcsICgpID0+IHtcbiAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgYXMgdGhpcyBtZXNzYWdlIHR5cGUgaXMgdXNlZCBvbmx5IGJ5IHRoZSBTRlUgKi9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ1Byb3RvY29sJywgKGRhdGEpID0+IHRoaXMub25Qcm90b2NvbE1lc3NhZ2UoZGF0YSkpO1xuICAgICAgICAvLyBUbyBTdHJlYW1lclxuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnSUZyYW1lUmVxdWVzdCcsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignSUZyYW1lUmVxdWVzdCcpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1JlcXVlc3RRdWFsaXR5Q29udHJvbCcsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignUmVxdWVzdFF1YWxpdHlDb250cm9sJykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnRnBzUmVxdWVzdCcsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignRnBzUmVxdWVzdCcpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0F2ZXJhZ2VCaXRyYXRlUmVxdWVzdCcsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignQXZlcmFnZUJpdHJhdGVSZXF1ZXN0JykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnU3RhcnRTdHJlYW1pbmcnLCAoKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1N0YXJ0U3RyZWFtaW5nJykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnU3RvcFN0cmVhbWluZycsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignU3RvcFN0cmVhbWluZycpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0xhdGVuY3lUZXN0JywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTGF0ZW5jeVRlc3QnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdSZXF1ZXN0SW5pdGlhbFNldHRpbmdzJywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdSZXF1ZXN0SW5pdGlhbFNldHRpbmdzJykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnVGVzdEVjaG8nLCAoKSA9PiB7XG4gICAgICAgICAgICAvKiBEbyBub3RoaW5nICovXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnVUlJbnRlcmFjdGlvbicsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1VJSW50ZXJhY3Rpb24nLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdDb21tYW5kJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignQ29tbWFuZCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1RleHRib3hFbnRyeScsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1RleHRib3hFbnRyeScsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0tleURvd24nLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdLZXlEb3duJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnS2V5VXAnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdLZXlVcCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0tleVByZXNzJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignS2V5UHJlc3MnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdNb3VzZUVudGVyJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTW91c2VFbnRlcicsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ01vdXNlTGVhdmUnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdNb3VzZUxlYXZlJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnTW91c2VEb3duJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTW91c2VEb3duJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnTW91c2VVcCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ01vdXNlVXAnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdNb3VzZU1vdmUnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdNb3VzZU1vdmUnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdNb3VzZVdoZWVsJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTW91c2VXaGVlbCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ01vdXNlRG91YmxlJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTW91c2VEb3VibGUnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdUb3VjaFN0YXJ0JywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignVG91Y2hTdGFydCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1RvdWNoRW5kJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignVG91Y2hFbmQnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdUb3VjaE1vdmUnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdUb3VjaE1vdmUnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdHYW1lcGFkQ29ubmVjdGVkJywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdHYW1lcGFkQ29ubmVjdGVkJykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnR2FtZXBhZEJ1dHRvblByZXNzZWQnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdHYW1lcGFkQnV0dG9uUHJlc3NlZCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0dhbWVwYWRCdXR0b25SZWxlYXNlZCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ0dhbWVwYWRCdXR0b25SZWxlYXNlZCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0dhbWVwYWRBbmFsb2cnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdHYW1lcGFkQW5hbG9nJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnR2FtZXBhZERpc2Nvbm5lY3RlZCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ0dhbWVwYWREaXNjb25uZWN0ZWQnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkV5ZVZpZXdzJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJFeWVWaWV3cycsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1hSSE1EVHJhbnNmb3JtJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJITURUcmFuc2Zvcm0nLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkNvbnRyb2xsZXJUcmFuc2Zvcm0nLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdYUkNvbnRyb2xsZXJUcmFuc2Zvcm0nLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUlN5c3RlbScsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1hSU3lzdGVtJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnWFJCdXR0b25Ub3VjaGVkJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJCdXR0b25Ub3VjaGVkJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnWFJCdXR0b25Ub3VjaFJlbGVhc2VkJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJCdXR0b25Ub3VjaFJlbGVhc2VkJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnWFJCdXR0b25QcmVzc2VkJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJCdXR0b25QcmVzc2VkJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnWFJCdXR0b25SZWxlYXNlZCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1hSQnV0dG9uUmVsZWFzZWQnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkFuYWxvZycsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1hSQW5hbG9nJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnQ2hhbm5lbFJlbGF5U3RhdHVzJywgKCkgPT4ge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZyBhcyB0aGlzIG1lc3NhZ2UgdHlwZSBpcyB1c2VkIG9ubHkgYnkgdGhlIFNGVSAqL1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ011bHRpcGxleGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZyBhcyB0aGlzIG1lc3NhZ2UgdHlwZSBpcyB1c2VkIG9ubHkgYnkgdGhlIFNGVSAqL1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWN0aXZhdGUgdGhlIGxvZ2ljIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1hbmQgZnJvbSBVRVxuICAgICAqIEBwYXJhbSBtZXNzYWdlXG4gICAgICovXG4gICAgb25Db21tYW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLkNvbW1hbmQnKTtcbiAgICAgICAgY29uc3QgY29tbWFuZEFzU3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCd1dGYtMTYnKS5kZWNvZGUobWVzc2FnZS5zbGljZSgxKSk7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhIENoYW5uZWwgQ29tbWFuZDogJyArIGNvbW1hbmRBc1N0cmluZyk7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBKU09OLnBhcnNlKGNvbW1hbmRBc1N0cmluZyk7XG4gICAgICAgIC8vIEhhbmRsZSBcIm9uU2NyZWVuS2V5Ym9hcmRcIiBldmVudFxuICAgICAgICBpZiAoY29tbWFuZC5jb21tYW5kID09PSAnb25TY3JlZW5LZXlib2FyZCcpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT25TY3JlZW5LZXlib2FyZENvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlT25TY3JlZW5LZXlib2FyZENvbW1hbmQoY29tbWFuZCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBzaG93T25TY3JlZW5LZXlib2FyZDogKF9hID0gY29tbWFuZC5zaG93T25TY3JlZW5LZXlib2FyZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZSxcbiAgICAgICAgICAgIHg6IChfYiA9IGNvbW1hbmQueCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHk6IChfYyA9IGNvbW1hbmQueSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMCxcbiAgICAgICAgICAgIGNvbnRlbnRzOiAoX2QgPSBjb21tYW5kLmNvbnRlbnRzKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IFNob3dPblNjcmVlbktleWJvYXJkRXZlbnQoZGF0YSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGEgcHJvdG9jb2wgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBzdHJlYW1lclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGRhdGEgZnJvbSB0aGUgc3RyZWFtZXJcbiAgICAgKi9cbiAgICBvblByb3RvY29sTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbFN0cmluZyA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKG1lc3NhZ2Uuc2xpY2UoMSkpO1xuICAgICAgICAgICAgY29uc3QgcHJvdG9jb2xKU09OID0gSlNPTi5wYXJzZShwcm90b2NvbFN0cmluZyk7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90b2NvbEpTT04sICdEaXJlY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcignTWFsZm9ybWVkIHByb3RvY29sIHJlY2VpdmVkLiBFbnN1cmUgdGhlIHByb3RvY29sIG1lc3NhZ2UgY29udGFpbnMgYSBkaXJlY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHByb3RvY29sSlNPTi5EaXJlY3Rpb247XG4gICAgICAgICAgICBkZWxldGUgcHJvdG9jb2xKU09OLkRpcmVjdGlvbjtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGBSZWNlaXZlZCBuZXcgJHtkaXJlY3Rpb24gPT0gTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIgPyAnRnJvbVN0cmVhbWVyJyA6ICdUb1N0cmVhbWVyJ30gcHJvdG9jb2wuIFVwZGF0aW5nIGV4aXN0aW5nIHByb3RvY29sLi4uYCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwcm90b2NvbEpTT04pLmZvckVhY2goKG1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHByb3RvY29sSlNPTlttZXNzYWdlVHlwZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIGNvbnRhaW5zIGFsbCB0aGUgcmVsZXZhbnQgcGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtZXNzYWdlLCAnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgVG9TdHJlYW1lci0+JHttZXNzYWdlVHlwZX0gcHJvdG9jb2wgZGVmaW5pdGlvbiB3YXMgbWFsZm9ybWVkIGFzIGl0IGRpZG4ndCBjb250YWluIGF0IGxlYXN0IGFuIGlkXFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiB3YXM6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgMil9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGluIGEgZm9yRWFjaCBpcyBlcXVpdmFsZW50IHRvIGEgY29udGludWUgaW4gYSBub3JtYWwgZm9yIGxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVRTUuMSBhbmQgVUU1LjIgZG9uJ3Qgc2VuZCBhIHN0cnVjdHVyZSBmb3IgdGhlc2UgbWVzc2FnZSB0eXBlcywgYnV0IHRoZXkgYWN0dWFsbHkgZG8gaGF2ZSBhIHN0cnVjdHVyZSBzbyBpZ25vcmUgdXBkYXRpbmcgdGhlbVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSAnVUlJbnRlcmFjdGlvbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZSA9PT0gJ0NvbW1hbmQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGUgPT09ICdMYXRlbmN5VGVzdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KG1lc3NhZ2VUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3ZlIHJlZ2lzdGVyZWQgYSBoYW5kbGVyIGZvciB0aGlzIG1lc3NhZ2UgdHlwZSB3ZSBjYW4gYWRkIGl0IHRvIG91ciBzdXBwb3J0ZWQgbWVzc2FnZXMuIGllIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lck1lc3NhZ2VzLnNldChtZXNzYWdlVHlwZSwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYFRoZXJlIHdhcyBubyByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIFwiJHttZXNzYWdlVHlwZX1cIiAtIHRyeSBhZGRpbmcgb25lIHVzaW5nIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCBcIiR7bWVzc2FnZVR5cGV9XCIsIG15SGFuZGxlcilgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbWVzc2FnZSBjb250YWlucyBhbGwgdGhlIHJlbGV2YW50IHBhcmFtc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWVzc2FnZSwgJ2lkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEZyb21TdHJlYW1lci0+JHttZXNzYWdlVHlwZX0gcHJvdG9jb2wgZGVmaW5pdGlvbiB3YXMgbWFsZm9ybWVkIGFzIGl0IGRpZG4ndCBjb250YWluIGF0IGxlYXN0IGFuIGlkXFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiB3YXM6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgMil9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGluIGEgZm9yRWFjaCBpcyBlcXVpdmFsZW50IHRvIGEgY29udGludWUgaW4gYSBub3JtYWwgZm9yIGxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5mcm9tU3RyZWFtZXJIYW5kbGVycy5nZXQobWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UndmUgcmVnaXN0ZXJlZCBhIGhhbmRsZXIgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLiBpZSByZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKC4uLilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldChtZXNzYWdlLmlkLCBtZXNzYWdlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYFRoZXJlIHdhcyBubyByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIFwiJHttZXNzYWdlfVwiIC0gdHJ5IGFkZGluZyBvbmUgdXNpbmcgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgXCIke21lc3NhZ2VUeXBlfVwiLCBteUhhbmRsZXIpYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgVW5rbm93biBkaXJlY3Rpb246ICR7ZGlyZWN0aW9ufWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gT25jZSB0aGUgcHJvdG9jb2wgaGFzIGJlZW4gcmVjZWl2ZWQsIHdlIGNhbiBzZW5kIG91ciBjb250cm9sIG1lc3NhZ2VzXG4gICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXIuU2VuZFJlcXVlc3RJbml0aWFsU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlci5TZW5kUmVxdWVzdFF1YWxpdHlDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgYW4gaW5wdXQgY29udHJvbCBtZXNzYWdlIHdoZW4gaXQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc3RyZWFtZXJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgaW5wdXQgY29udHJvbCBtZXNzYWdlXG4gICAgICovXG4gICAgb25JbnB1dENvbnRyb2xPd25lcnNoaXAobWVzc2FnZSkge1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZSk7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5JbnB1dENvbnRyb2xPd25lcnNoaXAnKTtcbiAgICAgICAgY29uc3QgaW5wdXRDb250cm9sT3duZXJzaGlwID0gbmV3IEJvb2xlYW4odmlld1sxXSkudmFsdWVPZigpO1xuICAgICAgICBMb2dnZXIuSW5mbyhgUmVjZWl2ZWQgaW5wdXQgY29udHJvbGxlciBtZXNzYWdlIC0gd2lsbCB5b3VyIGlucHV0IGNvbnRyb2wgdGhlIHN0cmVhbTogJHtpbnB1dENvbnRyb2xPd25lcnNoaXB9YCk7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uSW5wdXRDb250cm9sT3duZXJzaGlwKGlucHV0Q29udHJvbE93bmVyc2hpcCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBvbkdhbWVwYWRSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCd1dGYtMTYnKS5kZWNvZGUobWVzc2FnZS5zbGljZSgxKSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSlNPTiA9IEpTT04ucGFyc2UocmVzcG9uc2VTdHJpbmcpO1xuICAgICAgICB0aGlzLmdhbWVQYWRDb250cm9sbGVyLm9uR2FtZXBhZFJlc3BvbnNlUmVjZWl2ZWQocmVzcG9uc2VKU09OLmNvbnRyb2xsZXJJZCk7XG4gICAgfVxuICAgIG9uQWZrVHJpZ2dlcmVkKCkge1xuICAgICAgICB0aGlzLmFma0NvbnRyb2xsZXIub25BZmtDbGljaygpO1xuICAgICAgICAvLyBpZiB0aGUgc3RyZWFtIGlzIHBhdXNlZCBwbGF5IGl0LCBpZiB3ZSBjYW5cbiAgICAgICAgaWYgKHRoaXMudmlkZW9QbGF5ZXIuaXNQYXVzZWQoKSAmJiB0aGlzLnZpZGVvUGxheWVyLmhhc1ZpZGVvU291cmNlKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGxheVN0cmVhbSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB3aGV0aGVyIHdlIHNob3VsZCB0aW1lb3V0IHdoZW4gYWZrLlxuICAgICAqIEBwYXJhbSBhZmtFbmFibGVkIElmIHRydWUgd2UgdGltZW91dCB3aGVuIGlkbGUgZm9yIHNvbWUgZ2l2ZW4gYW1vdW50IG9mIHRpbWUuXG4gICAgICovXG4gICAgc2V0QWZrRW5hYmxlZChhZmtFbmFibGVkKSB7XG4gICAgICAgIGlmIChhZmtFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLm9uQWZrVHJpZ2dlcmVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFma0NvbnRyb2xsZXIuc3RvcEFma1dhcm5pbmdUaW1lcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgYSByZWNvbm5lY3Rpb24gdG8gdGhlIHNpZ25hbGxpbmcgc2VydmVyLiBNYW51YWwgdHJpZ2dlclxuICAgICAqL1xuICAgIHRyeVJlY29ubmVjdChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuZm9yY2VSZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLmRvUmVjb25uZWN0KG1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEb2VzIHRoZSBhY3R1YWwgcmVjb25uZWN0IHdvcmsuIFVzZWQgYnkgdGhlIGF1dG8gcmVjb25uZWN0IGZlYXR1cmUgdG8gc2tpcCB0aGUgbWFudWFsIGZsYWcuXG4gICAgICovXG4gICAgZG9SZWNvbm5lY3QobWVzc2FnZSkge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyB3ZWJTb2NrZXRDb250cm9sbGVyIHJldHVybiBpbW1lZGlhdGVseSBvciB0aGlzIHdpbGwgbm90IHdvcmtcbiAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnVGhpcyBwbGF5ZXIgaGFzIG5vIHByb3RvY29sIGNvbm5lY3Rpb24uJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1JlY29ubmVjdGluZyA9IHRydWU7XG4gICAgICAgIC8vIGlmIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4sIGZpcnN0IGNsb3NlIGl0IGFuZCBmb3JjZSBhIHJlY29ubmVjdC5cbiAgICAgICAgaWYgKHRoaXMucHJvdG9jb2wuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcmNlUmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0TWVzc2FnZSA9IGAke21lc3NhZ2V9IFJlY29ubmVjdGluZy5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jbG9zZVNpZ25hbGluZ1NlcnZlcihtZXNzYWdlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uV2ViUnRjQXV0b0Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdFRvU2lnbmFsbGluZ1NlcnZlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgZnJlZXplIGZyYW1lIGlmIGl0IGlzIHJlcXVpcmVkIG90aGVyd2lzZSBzaG93cyB0aGUgcGxheSBvdmVybGF5XG4gICAgICovXG4gICAgbG9hZEZyZWV6ZUZyYW1lT3JTaG93UGxheU92ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgTG9hZEZyZWV6ZUZyYW1lRXZlbnQoe1xuICAgICAgICAgICAgc2hvdWxkU2hvd1BsYXlPdmVybGF5OiB0aGlzLnNob3VsZFNob3dQbGF5T3ZlcmxheSxcbiAgICAgICAgICAgIGlzVmFsaWQ6IHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyLnZhbGlkLFxuICAgICAgICAgICAganBlZ0RhdGE6IHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyLmpwZWdcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRTaG93UGxheU92ZXJsYXkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdzaG93aW5nIHBsYXkgb3ZlcmxheScpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVQbGF5ZXJTdHlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ3Nob3dpbmcgZnJlZXplIGZyYW1lJyk7XG4gICAgICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lQ29udHJvbGxlci5zaG93RnJlZXplRnJhbWUoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9QbGF5ZXIuc2V0VmlkZW9FbmFibGVkKGZhbHNlKTtcbiAgICAgICAgfSwgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIuZnJlZXplRnJhbWVEZWxheSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIGZyZWV6ZSBmcmFtZSBhbmQgbG9hZCBpdFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBmcmVlemUgZnJhbWUgZGF0YSBpbiBieXRlc1xuICAgICAqL1xuICAgIG9uRnJlZXplRnJhbWVNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLkZyZWV6ZUZyYW1lJyk7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIucHJvY2Vzc0ZyZWV6ZUZyYW1lTWVzc2FnZSh2aWV3LCAoKSA9PiB0aGlzLmxvYWRGcmVlemVGcmFtZU9yU2hvd1BsYXlPdmVybGF5KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmFibGUgdGhlIHZpZGVvIGFmdGVyIGhpZGluZyBhIGZyZWV6ZSBmcmFtZVxuICAgICAqL1xuICAgIGludmFsaWRhdGVGcmVlemVGcmFtZUFuZEVuYWJsZVZpZGVvKCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnRGF0YUNoYW5uZWxSZWNlaXZlTWVzc2FnZVR5cGUuRnJlZXplRnJhbWUnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IEhpZGVGcmVlemVGcmFtZUV2ZW50KCkpO1xuICAgICAgICAgICAgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIuaGlkZUZyZWV6ZUZyYW1lKCk7XG4gICAgICAgIH0sIHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyLmZyZWV6ZUZyYW1lRGVsYXkpO1xuICAgICAgICBpZiAodGhpcy52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKSkge1xuICAgICAgICAgICAgdGhpcy52aWRlb1BsYXllci5zZXRWaWRlb0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJlcCBkYXRhY2hhbm5lbCBkYXRhIGZvciBwcm9jZXNzaW5nIGZpbGUgZXh0ZW5zaW9uXG4gICAgICogQHBhcmFtIGRhdGEgdGhlIGZpbGUgZXh0ZW5zaW9uIGRhdGFcbiAgICAgKi9cbiAgICBvbkZpbGVFeHRlbnNpb24oZGF0YSkge1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIEZpbGVVdGlsLnNldEV4dGVuc2lvbkZyb21CeXRlcyh2aWV3LCB0aGlzLmZpbGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVwIGRhdGFjaGFubmVsIGRhdGEgZm9yIHByb2Nlc3NpbmcgdGhlIGZpbGUgbWltZSB0eXBlXG4gICAgICogQHBhcmFtIGRhdGEgdGhlIGZpbGUgbWltZSB0eXBlIGRhdGFcbiAgICAgKi9cbiAgICBvbkZpbGVNaW1lVHlwZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgRmlsZVV0aWwuc2V0TWltZVR5cGVGcm9tQnl0ZXModmlldywgdGhpcy5maWxlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJlcCBkYXRhY2hhbm5lbCBkYXRhIGZvciBwcm9jZXNzaW5nIHRoZSBmaWxlIGNvbnRlbnRzXG4gICAgICogQHBhcmFtIGRhdGEgdGhlIGZpbGUgY29udGVudHMgZGF0YVxuICAgICAqL1xuICAgIG9uRmlsZUNvbnRlbnRzKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBGaWxlVXRpbC5zZXRDb250ZW50c0Zyb21CeXRlcyh2aWV3LCB0aGlzLmZpbGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQbGF5cyB0aGUgc3RyZWFtIGF1ZGlvIGFuZCB2aWRlbyBzb3VyY2UgYW5kIHNldHMgdXAgb3RoZXIgcGllY2VzIHdoaWxlIHRoZSBzdHJlYW0gc3RhcnRzXG4gICAgICovXG4gICAgcGxheVN0cmVhbSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0NvdWxkIG5vdCBwbGF5IHZpZGVvIHN0cmVhbSBiZWNhdXNlIHRoZSB2aWRlbyBwbGF5ZXIgd2FzIG5vdCBpbml0aWFsaXplZCBjb3JyZWN0bHkuJztcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgUGxheVN0cmVhbUVycm9yRXZlbnQoeyBtZXNzYWdlIH0pKTtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgICB0aGlzLmNsb3NlU2lnbmFsaW5nU2VydmVyKCdTdHJlYW0gbm90IGluaXRpYWxpemVkIGNvcnJlY3RseScsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaGFzVmlkZW9Tb3VyY2UoKSkge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoJ0Nhbm5vdCBwbGF5IHN0cmVhbSwgdGhlIHZpZGVvIGVsZW1lbnQgaGFzIG5vIHNyY09iamVjdCB0byBwbGF5LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VG91Y2hJbnB1dEVuYWJsZWQodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Ub3VjaElucHV0KSk7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgUGxheVN0cmVhbUV2ZW50KCkpO1xuICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyLmF1ZGlvRWxlbWVudC5zcmNPYmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0TXV0ZWQgPSB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlN0YXJ0VmlkZW9NdXRlZCk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuYXVkaW9FbGVtZW50Lm11dGVkID0gc3RhcnRNdXRlZDtcbiAgICAgICAgICAgIGlmIChzdGFydE11dGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5VmlkZW8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlci5hdWRpb0VsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgLnBsYXkoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheVZpZGVvKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChvblJlamVjdGVkUmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbmZvKG9uUmVqZWN0ZWRSZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbygnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGF1dG9wbGF5aW5nIHZpZGVvIHdpdGhvdXQgaW50ZXJhY3Rpb24gLSB0byByZXNvbHZlIHRoaXMgd2UgYXJlIGdvaW5nIHRvIHNob3cgdGhlIHBsYXkgYnV0dG9uIG92ZXJsYXkuJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgUGxheVN0cmVhbVJlamVjdGVkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBvblJlamVjdGVkUmVhc29uXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGxheVZpZGVvKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG91bGRTaG93UGxheU92ZXJsYXkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIuc2hvd0ZyZWV6ZUZyYW1lKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBsYXlzIHRoZSB2aWRlbyBzdHJlYW1cbiAgICAgKi9cbiAgICBwbGF5VmlkZW8oKSB7XG4gICAgICAgIC8vIGhhbmRsZSBwbGF5KCkgd2l0aCBwcm9taXNlIGFzIGl0IGlzIGFuIGFzeW5jaHJvbm91cyBjYWxsXG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIucGxheSgpLmNhdGNoKChvblJlamVjdGVkUmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyLmF1ZGlvRWxlbWVudC5zcmNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuYXVkaW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhvblJlamVjdGVkUmVhc29uKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYXV0b3BsYXlpbmcgdmlkZW8gd2l0aG91dCBpbnRlcmFjdGlvbiAtIHRvIHJlc29sdmUgdGhpcyB3ZSBhcmUgZ29pbmcgdG8gc2hvdyB0aGUgcGxheSBidXR0b24gb3ZlcmxheS4nKTtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgUGxheVN0cmVhbVJlamVjdGVkRXZlbnQoeyByZWFzb246IG9uUmVqZWN0ZWRSZWFzb24gfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5hYmxlIHRoZSB2aWRlbyB0byBwbGF5IGF1dG9tYXRpY2FsbHkgaWYgZW5hYmxlQXV0b3BsYXkgaXMgdHJ1ZVxuICAgICAqL1xuICAgIGF1dG9QbGF5VmlkZW9PclNldFVwUGxheU92ZXJsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkF1dG9QbGF5VmlkZW8pKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IHRvIHBsYXkgdGhlIHZpZGVvXG4gICAgICAgICAgICB0aGlzLnBsYXlTdHJlYW0oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbm5lY3QgdG8gdGhlIFNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKi9cbiAgICBjb25uZWN0VG9TaWduYWxsaW5nU2VydmVyKCkge1xuICAgICAgICB0aGlzLmxvY2FsbHlDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbmFibGVBdXRvUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0TWVzc2FnZSA9IG51bGw7XG4gICAgICAgIGNvbnN0IHNpZ25hbGxpbmdVcmwgPSB0aGlzLnNpZ25hbGxpbmdVcmxCdWlsZGVyKCk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuY29ubmVjdChzaWduYWxsaW5nVXJsKTtcbiAgICAgICAgY29uc3Qga2VlcGFsaXZlRGVsYXkgPSB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLktlZXBhbGl2ZURlbGF5KTtcbiAgICAgICAgaWYgKGtlZXBhbGl2ZURlbGF5ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBuZXcgS2VlcGFsaXZlTW9uaXRvcih0aGlzLnByb3RvY29sLCBrZWVwYWxpdmVEZWxheSk7XG4gICAgICAgICAgICB0aGlzLmtlZXBhbGl2ZS5vblRpbWVvdXQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBpbmcgZmFpbHMganVzdCBkaXNjb25uZWN0XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBQcm90b2NvbCB0aW1lb3V0YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbC5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBzdGFydCB0aGUgaGFuZHNoYWtlIHRvIHRoZSBzaWduYWxsaW5nIHNlcnZlclxuICAgICAqIEBwYXJhbSBwZWVyQ29uZmlnICAtIFJUQyBDb25maWd1cmF0aW9uIE9wdGlvbnMgZnJvbSB0aGUgU2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEByZW1hcmsgUlRDIFBlZXIgQ29ubmVjdGlvbiBvbiBJY2UgQ2FuZGlkYXRlIGV2ZW50IGhhdmUgaXQgaGFuZGxlZCBieSBoYW5kbGUgU2VuZCBJY2UgQ2FuZGlkYXRlXG4gICAgICovXG4gICAgc3RhcnRTZXNzaW9uKHBlZXJDb25maWcpIHtcbiAgICAgICAgdGhpcy5wZWVyQ29uZmlnID0gcGVlckNvbmZpZztcbiAgICAgICAgLy8gY2hlY2sgZm9yIGZvcmNpbmcgdHVyblxuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Gb3JjZVRVUk4pKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgYSB0dXJuIHNlcnZlclxuICAgICAgICAgICAgY29uc3QgaGFzVHVyblNlcnZlciA9IHRoaXMuY2hlY2tUdXJuU2VydmVyQXZhaWxhYmlsaXR5KHBlZXJDb25maWcpO1xuICAgICAgICAgICAgLy8gY2xvc2UgYW5kIGVycm9yIGlmIHR1cm4gaXMgZm9yY2VkIGFuZCB0aGVyZSBpcyBubyB0dXJuIHNlcnZlclxuICAgICAgICAgICAgaWYgKCFoYXNUdXJuU2VydmVyKSB7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ05vIHR1cm4gc2VydmVyIHdhcyBmb3VuZCBpbiB0aGUgUGVlciBDb25uZWN0aW9uIE9wdGlvbnMuIFRVUk4gY2Fubm90IGJlIGZvcmNlZCwgY2xvc2luZyBjb25uZWN0aW9uLiBQbGVhc2UgdXNlIFNUVU4gaW5zdGVhZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VTaWduYWxpbmdTZXJ2ZXIoJ1RVUk4gY2Fubm90IGJlIGZvcmNlZCwgY2xvc2luZyBjb25uZWN0aW9uLiBQbGVhc2UgdXNlIFNUVU4gaW5zdGVhZC4nLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNldCB1cCB0aGUgcGVlciBjb25uZWN0aW9uIGNvbnRyb2xsZXJcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIgPSBuZXcgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyKHRoaXMucGVlckNvbmZpZywgdGhpcy5jb25maWcsIHRoaXMucHJlZmVycmVkQ29kZWMpO1xuICAgICAgICAvLyBzZXQgdXAgcGVlciBjb25uZWN0aW9uIGNvbnRyb2xsZXIgdmlkZW8gc3RhdHNcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25WaWRlb1N0YXRzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVZpZGVvU3RhdHMoZXZlbnQpO1xuICAgICAgICB9O1xuICAgICAgICAvKiBTZXQgZXZlbnQgaGFuZGxlciBmb3IgbGF0ZW5jeSBpbmZvcm1hdGlvbiBpcyBjYWxjdWxhdGVkLCBoYW5kbGUgdGhlIGV2ZW50IGJ5IHByb3BvZ2F0aW5nIHRvIHRoZSBQaXhlbFN0cmVhbWluZyBBUEkgKi9cbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25MYXRlbmN5Q2FsY3VsYXRlZCA9IChsYXRlbmN5SW5mbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25MYXRlbmN5Q2FsY3VsYXRlZChsYXRlbmN5SW5mbyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qIFdoZW4gdGhlIFBlZXIgQ29ubmVjdGlvbiB3YW50cyB0byBzZW5kIGFuIG9mZmVyIGhhdmUgaXQgaGFuZGxlZCAqL1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5vblNlbmRXZWJSVENPZmZlciA9IChvZmZlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZW5kV2ViUlRDT2ZmZXIob2ZmZXIpO1xuICAgICAgICB9O1xuICAgICAgICAvKiBTZXQgZXZlbnQgaGFuZGxlciBmb3Igd2hlbiBsb2NhbCBhbnN3ZXIgZGVzY3JpcHRpb24gaXMgc2V0ICovXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLm9uU2V0TG9jYWxEZXNjcmlwdGlvbiA9IChhbnN3ZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VuZFdlYlJUQ0Fuc3dlcihhbnN3ZXIpO1xuICAgICAgICB9O1xuICAgICAgICAvKiBTZXQgZXZlbnQgaGFuZGxlciBmb3Igd2hlbiByZW1vdGUgb2ZmZXIgZGVzY3JpcHRpb24gaXMgc2V0ICovXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLm9uU2V0UmVtb3RlRGVzY3JpcHRpb24gPSAob2ZmZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uV2ViUnRjU2RwT2ZmZXIob2ZmZXIpO1xuICAgICAgICB9O1xuICAgICAgICAvKiBXaGVuIHRoZSBQZWVyIENvbm5lY3Rpb24gaWNlIGNhbmRpZGF0ZSBpcyBhZGRlZCBoYXZlIGl0IGhhbmRsZWQgKi9cbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25QZWVySWNlQ2FuZGlkYXRlID0gKHBlZXJDb25uZWN0aW9uSWNlRXZlbnQpID0+IHRoaXMuaGFuZGxlU2VuZEljZUNhbmRpZGF0ZShwZWVyQ29ubmVjdGlvbkljZUV2ZW50KTtcbiAgICAgICAgLyogV2hlbiB0aGUgUGVlciBDb25uZWN0aW9uIGhhcyBhIGRhdGEgY2hhbm5lbCBjcmVhdGVkIGZvciBpdCBieSB0aGUgYnJvd3NlciwgaGFuZGxlIGl0ICovXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLm9uRGF0YUNoYW5uZWwgPSAoZGF0YWNoYW5uZWxFdmVudCkgPT4gdGhpcy5oYW5kbGVEYXRhQ2hhbm5lbChkYXRhY2hhbm5lbEV2ZW50KTtcbiAgICAgICAgLy8gc2V0IHVwIHdlYlJ0YyB0ZXh0IG92ZXJsYXlzXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnNob3dUZXh0T3ZlcmxheUNvbm5lY3RpbmcgPSAoKSA9PiB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbldlYlJ0Y0Nvbm5lY3RpbmcoKTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIuc2hvd1RleHRPdmVybGF5U2V0dXBGYWlsdXJlID0gKCkgPT4gdGhpcy5waXhlbFN0cmVhbWluZy5fb25XZWJSdGNGYWlsZWQoKTtcbiAgICAgICAgbGV0IHdlYlJ0Y0Nvbm5lY3RlZFNlbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25JY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBCcm93c2VycyBlbWl0IFwiY29ubmVjdGVkXCIgd2hlbiBnZXR0aW5nIGZpcnN0IGNvbm5lY3Rpb24gYW5kIFwiY29tcGxldGVkXCIgd2hlbiBmaW5pc2hpbmdcbiAgICAgICAgICAgIC8vIGNhbmRpZGF0ZSBjaGVja2luZy4gSG93ZXZlciwgc29tZXRpbWVzIGJyb3dzZXJzIGNhbiBza2lwIFwiY29ubmVjdGVkXCIgYW5kIG9ubHkgZW1pdCBcImNvbXBsZXRlZFwiLlxuICAgICAgICAgICAgLy8gVGhlcmVmb3JlIG5lZWQgdG8gY2hlY2sgYm90aCBjYXNlcyBhbmQgZW1pdCBvbldlYlJ0Y0Nvbm5lY3RlZCBvbmx5IG9uY2Ugb24gdGhlIGZpcnN0IGhpdC5cbiAgICAgICAgICAgIGlmICghd2ViUnRjQ29ubmVjdGVkU2VudCAmJlxuICAgICAgICAgICAgICAgIFsnY29ubmVjdGVkJywgJ2NvbXBsZXRlZCddLmluY2x1ZGVzKHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnBlZXJDb25uZWN0aW9uLmljZUNvbm5lY3Rpb25TdGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbldlYlJ0Y0Nvbm5lY3RlZCgpO1xuICAgICAgICAgICAgICAgIHdlYlJ0Y0Nvbm5lY3RlZFNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiBSVEMgUGVlciBDb25uZWN0aW9uIG9uIFRyYWNrIGV2ZW50IC0+IGhhbmRsZSBvbiB0cmFjayAqL1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5vblRyYWNrID0gKHRyYWNrRXZlbnQpID0+IHRoaXMuc3RyZWFtQ29udHJvbGxlci5oYW5kbGVPblRyYWNrKHRyYWNrRXZlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdGhlIHBlZXIgY29ubmVjdGlvbiBvcHRpb25zIGZvciBhIHR1cm4gc2VydmVyIGFuZCByZXR1cm5zIHRydWUgb3IgZmFsc2VcbiAgICAgKi9cbiAgICBjaGVja1R1cm5TZXJ2ZXJBdmFpbGFiaWxpdHkob3B0aW9ucykge1xuICAgICAgICAvLyBpZiBpY2VTZXJ2ZXJzIGlzIGVtcHR5IHJldHVybiBmYWxzZSB0aGlzIHNob3VsZCBub3QgYmUgdGhlIGdlbmVyYWwgdXNlIGNhc2UgYnV0IGlzIGhlcmUgaW5jYXNlXG4gICAgICAgIGlmICghb3B0aW9ucy5pY2VTZXJ2ZXJzKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnQSB0dXJuIHNldmVyIHdhcyBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIGljZSBzZXJ2ZXJzIHRvIGNoZWNrIGZvciBhIHR1cm4gdXJsXG4gICAgICAgIGZvciAoY29uc3QgaWNlU2VydmVyIG9mIG9wdGlvbnMuaWNlU2VydmVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgb2YgaWNlU2VydmVyLnVybHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCd0dXJuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluZm8oYEEgdHVybiBzZXZlciB3YXMgZm91bmQgYXQgJHt1cmx9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBMb2dnZXIuSW5mbygnQSB0dXJuIHNldmVyIHdhcyBub3QgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gYSBDb25maWcgTWVzc2FnZSBpcyByZWNlaXZlZCBjb250YWlucyB0aGUgUGVlciBDb25uZWN0aW9uIE9wdGlvbnMgcmVxdWlyZWQgKFNUVU4gYW5kIFRVUk4gU2VydmVyIEluZm8pXG4gICAgICogQHBhcmFtIG1lc3NhZ2VDb25maWcgLSBDb25maWcgTWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBzaWduYWxpbmcgc2VydmVyXG4gICAgICovXG4gICAgaGFuZGxlT25Db25maWdNZXNzYWdlKG1lc3NhZ2VDb25maWcpIHtcbiAgICAgICAgdGhpcy5yZXNpemVQbGF5ZXJTdHlsZSgpO1xuICAgICAgICAvLyBUZWxsIHRoZSBXZWJSdGNDb250cm9sbGVyIHRvIHN0YXJ0IGEgc2Vzc2lvbiB3aXRoIHRoZSBwZWVyIG9wdGlvbnMgc2VudCBmcm9tIHRoZSBzaWduYWxpbmcgc2VydmVyXG4gICAgICAgIHRoaXMuc3RhcnRTZXNzaW9uKG1lc3NhZ2VDb25maWcucGVlckNvbm5lY3Rpb25PcHRpb25zKTtcbiAgICB9XG4gICAgaGFuZGxlUGluZ01lc3NhZ2UocGluZ01lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLnBvbmcsIHsgdGltZTogcGluZ01lc3NhZ2UudGltZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIgZ2l2ZXMgdXMgdGhlIGxpc3Qgb2Ygc3RyZWFtZXIgaWRzLlxuICAgICAqL1xuICAgIGhhbmRsZVN0cmVhbWVyTGlzdE1lc3NhZ2UobWVzc2FnZVN0cmVhbWVyTGlzdCkge1xuICAgICAgICBMb2dnZXIuSW5mbyhgR290IHN0cmVhbWVyIGxpc3QgJHttZXNzYWdlU3RyZWFtZXJMaXN0Lmlkc31gKTtcbiAgICAgICAgbGV0IHdhbnRlZFN0cmVhbWVySWQgPSAnJztcbiAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHNlbGVjdGVkIHN0cmVhbWVyIGlkIG9wdGlvblxuICAgICAgICBjb25zdCBzdHJlYW1lcklET3B0aW9uID0gdGhpcy5jb25maWcuZ2V0U2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpO1xuICAgICAgICBjb25zdCBleGlzdGluZ1NlbGVjdGlvbiA9IHN0cmVhbWVySURPcHRpb24uc2VsZWN0ZWQudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgIGlmIChleGlzdGluZ1NlbGVjdGlvbikge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBzZWxlY3RlZCBvcHRpb24gaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICB3YW50ZWRTdHJlYW1lcklkID0gc3RyZWFtZXJJRE9wdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgdGhlIHN0cmVhbWVycyB0byB0aGUgVUlcbiAgICAgICAgY29uc3Qgc2V0dGluZ09wdGlvbnMgPSBbLi4ubWVzc2FnZVN0cmVhbWVyTGlzdC5pZHNdOyAvLyBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlU3RyZWFtZXJMaXN0Lmlkc1xuICAgICAgICBzZXR0aW5nT3B0aW9ucy51bnNoaWZ0KCcnKTsgLy8gYWRkIGFuIGVtcHR5IG9wdGlvbiBhdCB0aGUgdG9wXG4gICAgICAgIHRoaXMuY29uZmlnLnNldE9wdGlvblNldHRpbmdPcHRpb25zKE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCwgc2V0dGluZ09wdGlvbnMpO1xuICAgICAgICBsZXQgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCA9ICcnO1xuICAgICAgICBjb25zdCB3YWl0Rm9yU3RyZWFtZXIgPSB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLldhaXRGb3JTdHJlYW1lcik7XG4gICAgICAgIGNvbnN0IHJlY29ubmVjdExpbWl0ID0gdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cyk7XG4gICAgICAgIGNvbnN0IHJlY29ubmVjdERlbGF5ID0gdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwpO1xuICAgICAgICAvLyBmaXJzdCB3ZSBmaWd1cmUgb3V0IGEgd2FudGVkIHN0cmVhbWVyIGlkIHRocm91Z2ggdmFyaW91cyBtZWFuc1xuICAgICAgICBjb25zdCB1c2VVcmxQYXJhbXMgPSB0aGlzLmNvbmZpZy51c2VVcmxQYXJhbXM7XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBJVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICBpZiAodXNlVXJsUGFyYW1zICYmIHVybFBhcmFtcy5oYXMoT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkKSkge1xuICAgICAgICAgICAgLy8gaWYgd2UndmUgc2V0IHRoZSBzdHJlYW1lciBpZCBvbiB0aGUgdXJsIHdlIG9ubHkgd2FudCB0aGF0IHN0cmVhbWVyIGlkXG4gICAgICAgICAgICB3YW50ZWRTdHJlYW1lcklkID0gdXJsUGFyYW1zLmdldChPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc3Vic2NyaWJlZFN0cmVhbSkge1xuICAgICAgICAgICAgLy8gd2Ugd2VyZSBwcmV2aW91c2x5IHN1YnNjcmliZWQgdG8gYSBzdHJlYW1lciwgd2Ugd2FudCB0aGF0XG4gICAgICAgICAgICB3YW50ZWRTdHJlYW1lcklkID0gdGhpcy5zdWJzY3JpYmVkU3RyZWFtO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyBsZXRzIHNlZSBpZiB3ZSBjYW4gcGljayBpdC5cbiAgICAgICAgaWYgKHdhbnRlZFN0cmVhbWVySWQgJiYgbWVzc2FnZVN0cmVhbWVyTGlzdC5pZHMuaW5jbHVkZXMod2FudGVkU3RyZWFtZXJJZCkpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSB3YW50ZWQgc3RyZWFtIGlzIGluIHRoZSBsaXN0LiB3ZSBwaWNrIHRoYXRcbiAgICAgICAgICAgIGF1dG9TZWxlY3RlZFN0cmVhbWVySWQgPSB3YW50ZWRTdHJlYW1lcklkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCghd2FudGVkU3RyZWFtZXJJZCB8fCAhd2FpdEZvclN0cmVhbWVyKSAmJiBtZXNzYWdlU3RyZWFtZXJMaXN0Lmlkcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpZiB3ZSdyZSBub3Qgd2FpdGluZyBmb3IgdGhlIHdhbnRlZCBzdHJlYW1lciBhbmQgdGhlcmUncyBvbmx5IG9uZSBzdHJlYW1lciwgY29ubmVjdCB0byBpdFxuICAgICAgICAgICAgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCA9IG1lc3NhZ2VTdHJlYW1lckxpc3QuaWRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlIGZvdW5kIGEgc3RyZWFtZXIgaWQgdG8gYXV0byBzZWxlY3QsIHNlbGVjdCBpdFxuICAgICAgICBpZiAoYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMDtcbiAgICAgICAgICAgIHRoaXMuaXNSZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE9wdGlvblNldHRpbmdWYWx1ZShPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQsIGF1dG9TZWxlY3RlZFN0cmVhbWVySWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8gYXV0byBzZWxlY3RlZCBzdHJlYW1lci5cbiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHdhaXRpbmcgZm9yIGEgc3RyZWFtZXIgdGhlbiB0cnkgcmVjb25uZWN0aW5nXG4gICAgICAgICAgICBpZiAod2FpdEZvclN0cmVhbWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjb25uZWN0QXR0ZW1wdCA8IHJlY29ubmVjdExpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJlY29ubmVjdHMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUmVjb25uZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMubGlzdFN0cmVhbWVycykpO1xuICAgICAgICAgICAgICAgICAgICB9LCByZWNvbm5lY3REZWxheSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBleGhhdXN0ZWQgb3VyIHJlY29ubmVjdCBhdHRlbXB0cywgcmV0dXJuIHRvIG1haW4gc2NyZWVuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVBdXRvUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGRpc3BhdGNoIHRoaXMgZXZlbnQgZmluYWxseVxuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IFN0cmVhbWVyTGlzdE1lc3NhZ2VFdmVudCh7XG4gICAgICAgICAgICBtZXNzYWdlU3RyZWFtZXJMaXN0LFxuICAgICAgICAgICAgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCxcbiAgICAgICAgICAgIHdhbnRlZFN0cmVhbWVySWRcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBoYW5kbGVTdWJzY3JpYmVGYWlsZWRNZXNzYWdlKHN1YnNjcmliZUZhaWxlZE1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMDtcbiAgICAgICAgdGhpcy5pc1JlY29ubmVjdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVuYWJsZUF1dG9SZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25TdWJzY3JpYmVGYWlsZWQoc3Vic2NyaWJlRmFpbGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgaGFuZGxlU3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlKHN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZSkge1xuICAgICAgICBjb25zdCBuZXdJRCA9IHN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZS5uZXdJRDtcbiAgICAgICAgLy8gbmVlZCB0byBlZGl0IHRoZSBzZWxlY3RlZCBzdHJlYW1lciBpbiB0aGUgc2V0dGluZ3MgbGlzdFxuICAgICAgICBjb25zdCBzdHJlYW1lckxpc3RPcHRpb25zID0gdGhpcy5jb25maWcuZ2V0U2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpO1xuICAgICAgICAvLyB0ZW1wb3JhcmlseSBwcmV2ZW50IG9uQ2hhbmdlIGZyb20gZmlyaW5nIChpdCB3b3VsZCB0cnkgdG8gc3Vic2NyaWJlIHRvIHRoZSBzdHJlYW1lciBhZ2FpbilcbiAgICAgICAgY29uc3Qgb2xkT25DaGFuZ2UgPSBzdHJlYW1lckxpc3RPcHRpb25zLm9uQ2hhbmdlO1xuICAgICAgICBzdHJlYW1lckxpc3RPcHRpb25zLm9uQ2hhbmdlID0gKCkgPT4geyB9O1xuICAgICAgICAvLyBjaGFuZ2UgdGhlIHNlbGVjdGVkIGVudHJ5LlxuICAgICAgICBjb25zdCBzdHJlYW1lckxpc3QgPSBzdHJlYW1lckxpc3RPcHRpb25zLm9wdGlvbnM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyZWFtZXJMaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoc3RyZWFtZXJMaXN0W2ldID09IHRoaXMuc3Vic2NyaWJlZFN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHN0cmVhbWVyTGlzdFtpXSA9IG5ld0lEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgbGlzdFxuICAgICAgICBzdHJlYW1lckxpc3RPcHRpb25zLm9wdGlvbnMgPSBzdHJlYW1lckxpc3Q7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgZW50cnlcbiAgICAgICAgc3RyZWFtZXJMaXN0T3B0aW9ucy5zZWxlY3RlZCA9IG5ld0lEO1xuICAgICAgICAvLyByZXN0b3JlIHRoZSBvbGQgY2hhbmdlIG5vdGlmaWVyLlxuICAgICAgICBzdHJlYW1lckxpc3RPcHRpb25zLm9uQ2hhbmdlID0gb2xkT25DaGFuZ2U7XG4gICAgICAgIC8vIHJlbWVtYmVyIHdoaWNoIHN0cmVhbSB3ZSdyZSBzdWJzY3JpYmUgdG9cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVkU3RyZWFtID0gc3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlLm5ld0lEO1xuICAgICAgICAvLyBub3RpZnkgYW55IGxpc3RlbmVyc1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IFN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZUV2ZW50KHtcbiAgICAgICAgICAgIG5ld0lEXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRoZSBSVEMgQW5zd2VyIGZyb20gdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKiBAcGFyYW0gQW5zd2VyIC0gQW5zd2VyIFNEUCBmcm9tIHRoZSBwZWVyLlxuICAgICAqL1xuICAgIGhhbmRsZVdlYlJ0Y0Fuc3dlcihBbnN3ZXIpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYEdvdCBhbnN3ZXIgc2RwICR7QW5zd2VyLnNkcH1gKTtcbiAgICAgICAgY29uc3Qgc2RwQW5zd2VyID0ge1xuICAgICAgICAgICAgc2RwOiBBbnN3ZXIuc2RwLFxuICAgICAgICAgICAgdHlwZTogJ2Fuc3dlcidcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIucmVjZWl2ZUFuc3dlcihzZHBBbnN3ZXIpO1xuICAgICAgICB0aGlzLmhhbmRsZVBvc3RXZWJydGNOZWdvdGlhdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIFJUQyBvZmZlciBmcm9tIGEgV2ViUlRDIHBlZXIgKHJlY2VpdmVkIHRocm91Z2ggdGhlIHNpZ25hbGxpbmcgc2VydmVyKS5cbiAgICAgKiBAcGFyYW0gT2ZmZXIgLSBPZmZlciBTRFAgZnJvbSB0aGUgcGVlci5cbiAgICAgKi9cbiAgICBoYW5kbGVXZWJSdGNPZmZlcihPZmZlcikge1xuICAgICAgICBMb2dnZXIuSW5mbyhgR290IG9mZmVyIHNkcCAke09mZmVyLnNkcH1gKTtcbiAgICAgICAgdGhpcy5pc1VzaW5nU0ZVID0gT2ZmZXIuc2Z1ID8gT2ZmZXIuc2Z1IDogZmFsc2U7XG4gICAgICAgIHRoaXMuaXNVc2luZ1NWQyA9IE9mZmVyLnNjYWxhYmlsaXR5TW9kZSA/IE9mZmVyLnNjYWxhYmlsaXR5TW9kZSAhPSAnTDFUMScgOiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaXNVc2luZ1NGVSB8fCB0aGlzLmlzVXNpbmdTVkMpIHtcbiAgICAgICAgICAgIC8vIERpc2FibGUgbmVnb3RpYXRpbmcgd2l0aCB0aGUgc2Z1IGFzIHRoZSBzZnUgb25seSBzdXBwb3J0cyBvbmUgY29kZWMgYXQgYSB0aW1lXG4gICAgICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5wcmVmZXJyZWRDb2RlYyA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5PVEU6IFRoZXNlIHR3byBzZXR0aW5ncyBjb25maWd1cmF0aW9ucyBhcmUgZG9uZSBvdXRzaWRlIG9mIGFuIGlmKHRoaXMuaXNVc2luZ1NGVSkgc28gdGhhdCB1c2Vyc1xuICAgICAgICAvLyBjYW4gc3dpdGNoIGJldHdlZW4gYSBkZWZhdWx0IGFuZCBTRlUgc3RyZWFtIGFuZCBoYXZlIHRoZSBzZXR0aW5ncyByZWNvbmZpZ3VyZSBhcHByb3ByaWF0ZWx5XG4gICAgICAgIGNvbnN0IHNjYWxhYmlsaXR5TW9kZSA9IE9mZmVyLnNjYWxhYmlsaXR5TW9kZSA/IE9mZmVyLnNjYWxhYmlsaXR5TW9kZSA6ICdMMVQxJztcbiAgICAgICAgbGV0IGF2YWlsYWJsZVF1YWxpdGllcyA9IFsnRGVmYXVsdCddO1xuICAgICAgICBpZiAodGhpcy5pc1VzaW5nU0ZVKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNVc2luZ1NWQykge1xuICAgICAgICAgICAgICAgIC8vIFVzZXIgaXMgdXNpbmcgYW4gU0ZVIHdpdGhvdXQgYW55IHRlbXBvcmFsIHNjYWxhYmlsaXR5LiBKdXN0IG9mZmVyIGVhc2lseSByZWFkYWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVF1YWxpdGllcyA9IFsnTG93JywgJ01lZGl1bScsICdIaWdoJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2VyIGlzIHVzaW5nIFNWQy4gR2VuZXJhdGUgYWxsIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVF1YWxpdGllcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heFNwYXRpYWxMYXllcnMgPSArc2NhbGFiaWxpdHlNb2RlWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heFRlbXBvcmFsTGF5ZXJzID0gK3NjYWxhYmlsaXR5TW9kZVszXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzID0gMTsgcyA8PSBtYXhTcGF0aWFsTGF5ZXJzOyBzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdCA9IDE7IHQgPD0gbWF4VGVtcG9yYWxMYXllcnM7IHQrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlUXVhbGl0aWVzLnB1c2goYFMke3N9VCR7dH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgdGhlIHBvc3NpYmxlIHZpZGVvIHF1YWxpdHkgb3B0aW9uc1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcHRpb25TZXR0aW5nT3B0aW9ucyhPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHksIGF2YWlsYWJsZVF1YWxpdGllcyk7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgdmlkZW8gcXVhbGl0eSB3aXRoIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHJlc29sdXRpb25cbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ1ZhbHVlKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSwgYXZhaWxhYmxlUXVhbGl0aWVzLnNsaWNlKC0xKVswXSk7XG4gICAgICAgIGNvbnN0IHNkcE9mZmVyID0ge1xuICAgICAgICAgICAgc2RwOiBPZmZlci5zZHAsXG4gICAgICAgICAgICB0eXBlOiAnb2ZmZXInXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnJlY2VpdmVPZmZlcihzZHBPZmZlciwgdGhpcy5jb25maWcpO1xuICAgICAgICB0aGlzLmhhbmRsZVBvc3RXZWJydGNOZWdvdGlhdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgd2hlbiB0aGUgU0ZVIHByb3ZpZGVzIHRoZSBwZWVyIHdpdGggaXRzIGRhdGEgY2hhbm5lbHNcbiAgICAgKiBAcGFyYW0gRGF0YUNoYW5uZWxzIC0gVGhlIG1lc3NhZ2UgZnJvbSB0aGUgU0ZVIGNvbnRhaW5pbmcgdGhlIGRhdGEgY2hhbm5lbHMgaWRzXG4gICAgICovXG4gICAgaGFuZGxlV2ViUnRjU0ZVUGVlckRhdGFjaGFubmVscyhEYXRhQ2hhbm5lbHMpIHtcbiAgICAgICAgY29uc3QgU2VuZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmVnb3RpYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGlkOiBEYXRhQ2hhbm5lbHMuc2VuZFN0cmVhbUlkXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHVuaWRpcmVjdGlvbmFsID0gRGF0YUNoYW5uZWxzLnNlbmRTdHJlYW1JZCAhPSBEYXRhQ2hhbm5lbHMucmVjdlN0cmVhbUlkO1xuICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmNyZWF0ZURhdGFDaGFubmVsKHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnBlZXJDb25uZWN0aW9uLCB1bmlkaXJlY3Rpb25hbCA/ICdzZW5kLWRhdGFjaGFubmVsJyA6ICdkYXRhY2hhbm5lbCcsIFNlbmRPcHRpb25zKTtcbiAgICAgICAgaWYgKHVuaWRpcmVjdGlvbmFsKSB7XG4gICAgICAgICAgICBjb25zdCBSZWN2T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBvcmRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5lZ290aWF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaWQ6IERhdGFDaGFubmVscy5yZWN2U3RyZWFtSWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIuY3JlYXRlRGF0YUNoYW5uZWwodGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIucGVlckNvbm5lY3Rpb24sICdyZWN2LWRhdGFjaGFubmVsJywgUmVjdk9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5yZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmhhbmRsZU9uT3BlbiA9ICgpID0+IHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UoTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5wZWVyRGF0YUNoYW5uZWxzUmVhZHkpKTtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHVuaS1kaXJlY3Rpb25hbCwgb25seSB0aGUgcmVjdiBkYXRhIGNoYW5uZWwgc2hvdWxkIGhhbmRsZSBpbmNvbWluZyBtZXNzYWdlc1xuICAgICAgICAgICAgdGhpcy5yZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmhhbmRsZU9uTWVzc2FnZSA9IChldikgPT4gdGhpcy5oYW5kbGVPbk1lc3NhZ2UoZXYpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZWxzZSBvdXIgcHJpbWFyeSBkYXRhY2hhbm5lbCBpcyBzZW5kL3JlY3Ygc28gaXQgY2FuIGhhbmRsZSBpbmNvbWluZyBtZXNzYWdlc1xuICAgICAgICAgICAgdGhpcy5zZW5kcmVjdkRhdGFDaGFubmVsQ29udHJvbGxlci5oYW5kbGVPbk1lc3NhZ2UgPSAoZXYpID0+IHRoaXMuaGFuZGxlT25NZXNzYWdlKGV2KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVQb3N0V2VicnRjTmVnb3RpYXRpb24oKSB7XG4gICAgICAgIC8vIHN0YXJ0IHRoZSBhZmsgd2FybmluZyB0aW1lciBhcyBQUyBpcyBub3cgcnVubmluZ1xuICAgICAgICB0aGlzLmFma0NvbnRyb2xsZXIuc3RhcnRBZmtXYXJuaW5nVGltZXIoKTtcbiAgICAgICAgLy8gc2hvdyB0aGUgb3ZlcmxheSB0aGF0IHdlIGhhdmUgbmVnb3RpYXRlZCBhIGNvbm5lY3Rpb25cbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25XZWJSdGNTZHAoKTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHNUaW1lckhhbmRsZSAmJiB0aGlzLnN0YXRzVGltZXJIYW5kbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zdGF0c1RpbWVySGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRzVGltZXJIYW5kbGUgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5nZXRTdGF0cygpLCAxMDAwKTtcbiAgICAgICAgLyogICovXG4gICAgICAgIHRoaXMuc2V0TW91c2VJbnB1dEVuYWJsZWQodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Nb3VzZUlucHV0KSk7XG4gICAgICAgIHRoaXMuc2V0S2V5Ym9hcmRJbnB1dEVuYWJsZWQodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5LZXlib2FyZElucHV0KSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZVBhZElucHV0RW5hYmxlZCh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkdhbWVwYWRJbnB1dCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIGFuIGljZSBDYW5kaWRhdGUgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgU2lnbmFsaW5nIHNlcnZlciBhZGQgaXQgdG8gdGhlIFBlZXIgQ29ubmVjdGlvbiBDbGllbnRcbiAgICAgKiBAcGFyYW0gaWNlQ2FuZGlkYXRlIC0gSWNlIENhbmRpZGF0ZSBmcm9tIFNlcnZlclxuICAgICAqL1xuICAgIGhhbmRsZUljZUNhbmRpZGF0ZShpY2VDYW5kaWRhdGUpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ1dlYiBSVEMgQ29udHJvbGxlcjogb25XZWJSdGNJY2UnKTtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbmV3IFJUQ0ljZUNhbmRpZGF0ZShpY2VDYW5kaWRhdGUpO1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5oYW5kbGVPbkljZShjYW5kaWRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBpY2UgQ2FuZGlkYXRlIHRvIHRoZSBzaWduYWxpbmcgc2VydmVyIHZpYSB3ZWJzb2NrZXRcbiAgICAgKiBAcGFyYW0gaWNlRXZlbnQgLSBSVEMgUGVlciBDb25uZWN0aW9uSWNlRXZlbnQpIHtcbiAgICAgKi9cbiAgICBoYW5kbGVTZW5kSWNlQ2FuZGlkYXRlKGljZUV2ZW50KSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdPbkljZUNhbmRpZGF0ZScpO1xuICAgICAgICBpZiAoaWNlRXZlbnQuY2FuZGlkYXRlICYmIGljZUV2ZW50LmNhbmRpZGF0ZS5jYW5kaWRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UoTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5pY2VDYW5kaWRhdGUsIHsgY2FuZGlkYXRlOiBpY2VFdmVudC5jYW5kaWRhdGUgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIGljZSBDYW5kaWRhdGUgdG8gdGhlIHNpZ25hbGluZyBzZXJ2ZXIgdmlhIHdlYnNvY2tldFxuICAgICAqIEBwYXJhbSBpY2VFdmVudCAtIFJUQyBQZWVyIENvbm5lY3Rpb25JY2VFdmVudCkge1xuICAgICAqL1xuICAgIGhhbmRsZURhdGFDaGFubmVsKGRhdGFjaGFubmVsRXZlbnQpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGEgY2hhbm5lbCBjcmVhdGVkIGZvciB1cyBieSBicm93c2VyIGFzIHdlIGFyZSBhIHJlY2VpdmluZyBwZWVyLicpO1xuICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmRhdGFDaGFubmVsID0gZGF0YWNoYW5uZWxFdmVudC5jaGFubmVsO1xuICAgICAgICAvLyBEYXRhIGNoYW5uZWwgd2FzIGNyZWF0ZWQgZm9yIHVzLCBzbyB3ZSBqdXN0IG5lZWQgdG8gc2V0dXAgaXRzIGNhbGxiYWNrcyBhbmQgYXJyYXkgdHlwZVxuICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLnNldHVwRGF0YUNoYW5uZWwoKTtcbiAgICAgICAgdGhpcy5zZW5kcmVjdkRhdGFDaGFubmVsQ29udHJvbGxlci5oYW5kbGVPbk1lc3NhZ2UgPSAoZXYpID0+IHRoaXMuaGFuZGxlT25NZXNzYWdlKGV2KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgUlRDIE9mZmVyIFNlc3Npb24gdG8gdGhlIFNpZ25hbGluZyBzZXJ2ZXIgdmlhIHdlYnNvY2tldFxuICAgICAqIEBwYXJhbSBvZmZlciAtIFJUQyBTZXNzaW9uIERlc2NyaXB0aW9uXG4gICAgICovXG4gICAgaGFuZGxlU2VuZFdlYlJUQ09mZmVyKG9mZmVyKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdTZW5kaW5nIHRoZSBvZmZlciB0byB0aGUgU2VydmVyJyk7XG4gICAgICAgIGNvbnN0IGV4dHJhUGFyYW1zID0ge1xuICAgICAgICAgICAgc2RwOiBvZmZlci5zZHAsXG4gICAgICAgICAgICBtaW5CaXRyYXRlQnBzOiAxMDAwICogdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlKSxcbiAgICAgICAgICAgIG1heEJpdHJhdGVCcHM6IDEwMDAgKiB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UoTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5vZmZlciwgZXh0cmFQYXJhbXMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgUlRDIE9mZmVyIFNlc3Npb24gdG8gdGhlIFNpZ25hbGluZyBzZXJ2ZXIgdmlhIHdlYnNvY2tldFxuICAgICAqIEBwYXJhbSBhbnN3ZXIgLSBSVEMgU2Vzc2lvbiBEZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGhhbmRsZVNlbmRXZWJSVENBbnN3ZXIoYW5zd2VyKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdTZW5kaW5nIHRoZSBhbnN3ZXIgdG8gdGhlIFNlcnZlcicpO1xuICAgICAgICBjb25zdCBleHRyYVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNkcDogYW5zd2VyLnNkcCxcbiAgICAgICAgICAgIG1pbkJpdHJhdGVCcHM6IDEwMDAgKiB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUpLFxuICAgICAgICAgICAgbWF4Qml0cmF0ZUJwczogMTAwMCAqIHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWF4Qml0cmF0ZSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLmFuc3dlciwgZXh0cmFQYXJhbXMpKTtcbiAgICAgICAgaWYgKHRoaXMuaXNVc2luZ1NGVSkge1xuICAgICAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLmRhdGFDaGFubmVsUmVxdWVzdCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlbmQgYW5zd2VyIGJhY2sgdG8gUGl4ZWwgU3RyZWFtaW5nIG1haW4gY2xhc3MgZm9yIGV2ZW50IGRpc3BhdGNoXG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uV2ViUnRjU2RwQW5zd2VyKGFuc3dlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZnJlZXplIGZyYW1lIG92ZXJsYXkgdG8gdGhlIHBsYXllciBkaXZcbiAgICAgKi9cbiAgICBzZXRVcE1vdXNlQW5kRnJlZXplRnJhbWUoKSB7XG4gICAgICAgIC8vIENhbGN1bGF0aW5nIGFuZCBub3JtYWxpemluZyBwb3NpdGlvbnMgZGVwZW5kcyBvbiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGxheWVyLlxuICAgICAgICBjb25zdCBwbGF5ZXJFbGVtZW50ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnJlY29uZmlndXJlKHsgd2lkdGg6IHBsYXllckVsZW1lbnQuY2xpZW50V2lkdGgsIGhlaWdodDogcGxheWVyRWxlbWVudC5jbGllbnRIZWlnaHQgfSwgeyB3aWR0aDogdmlkZW9FbGVtZW50LnZpZGVvV2lkdGgsIGhlaWdodDogdmlkZW9FbGVtZW50LnZpZGVvSGVpZ2h0IH0pO1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lQ29udHJvbGxlci5mcmVlemVGcmFtZS5yZXNpemUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIENvbm5lY3Rpb24gdG8gdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKi9cbiAgICBjbG9zZVNpZ25hbGluZ1NlcnZlcihtZXNzYWdlLCBhbGxvd1JlY29ubmVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMubG9jYWxseUNsb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZW5hYmxlQXV0b1JlY29ubmVjdCA9IGFsbG93UmVjb25uZWN0O1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgKF9hID0gdGhpcy5wcm90b2NvbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRpc2Nvbm5lY3QoMTAwMCwgbWVzc2FnZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBwZWVyIGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBjbG9zZVBlZXJDb25uZWN0aW9uKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgYWxsIGNvbm5lY3Rpb25zXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VTaWduYWxpbmdTZXJ2ZXIoJycsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5jbG9zZVBlZXJDb25uZWN0aW9uKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpcmVzIGEgVmlkZW8gU3RhdHMgRXZlbnQgaW4gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBnZXRTdGF0cygpIHtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIuZ2VuZXJhdGVTdGF0cygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgTGF0ZW5jeSBUZXN0IFJlcXVlc3QgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgc2VuZExhdGVuY3lUZXN0KCkge1xuICAgICAgICB0aGlzLmxhdGVuY3lTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0xhdGVuY3lUZXN0JykoW1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIFN0YXJ0VGltZTogdGhpcy5sYXRlbmN5U3RhcnRUaW1lXG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIERhdGEgQ2hhbm5lbCBMYXRlbmN5IFRlc3QgUmVxdWVzdCB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZW5kRGF0YUNoYW5uZWxMYXRlbmN5VGVzdChkZXNjcmlwdG9yKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCcpKFtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGRlc2NyaXB0b3IpXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBNaW5RUCBlbmNvZGVyIHNldHRpbmcgdG8gdGhlIFVFIEluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBtaW5RUCAtIFRoZSBsb3dlciBib3VuZCBmb3IgUVAgd2hlbiBlbmNvZGluZ1xuICAgICAqIHZhbGlkIHZhbHVlcyBhcmUgKDEtNTEpIHdoZXJlOlxuICAgICAqIDEgPSBCZXN0IHF1YWxpdHkgYnV0IGhpZ2hlc3QgYml0cmF0ZS5cbiAgICAgKiA1MSA9IFdvcnN0IHF1YWxpdHkgYnV0IGxvd2VzdCBiaXRyYXRlLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIG1pblFQIGlzIDEgbWVhbmluZyB0aGUgZW5jb2RlciBpcyBmcmVlXG4gICAgICogdG8gYWltIGZvciB0aGUgYmVzdCBxdWFsaXR5IGl0IGNhbiBvbiB0aGUgZ2l2ZW4gbmV0d29yayBsaW5rLlxuICAgICAqL1xuICAgIHNlbmRFbmNvZGVyTWluUVAobWluUVApIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYE1pblFQPSR7bWluUVB9XFxuYCk7XG4gICAgICAgIGlmIChtaW5RUCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnRW5jb2Rlci5NaW5RUCc6IG1pblFQXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIE1heFFQIGVuY29kZXIgc2V0dGluZyB0byB0aGUgVUUgSW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1heFFQIC0gVGhlIHVwcGVyIGJvdW5kIGZvciBRUCB3aGVuIGVuY29kaW5nXG4gICAgICogdmFsaWQgdmFsdWVzIGFyZSAoMS01MSkgd2hlcmU6XG4gICAgICogMSA9IEJlc3QgcXVhbGl0eSBidXQgaGlnaGVzdCBiaXRyYXRlLlxuICAgICAqIDUxID0gV29yc3QgcXVhbGl0eSBidXQgbG93ZXN0IGJpdHJhdGUuXG4gICAgICogQnkgZGVmYXVsdCB0aGUgbWF4UVAgaXMgNTEgbWVhbmluZyB0aGUgZW5jb2RlciBpcyBmcmVlXG4gICAgICogdG8gZHJvcCBxdWFsaXR5IGFzIGxvdyBhcyBuZWVkZWQgb24gdGhlIGdpdmVuIG5ldHdvcmsgbGluay5cbiAgICAgKi9cbiAgICBzZW5kRW5jb2Rlck1heFFQKG1heFFQKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBNYXhRUD0ke21heFFQfVxcbmApO1xuICAgICAgICBpZiAobWF4UVAgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdDb21tYW5kJykoW1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgJ0VuY29kZXIuTWF4UVAnOiBtYXhRUFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBNaW5RdWFsaXR5IGVuY29kZXIgc2V0dGluZyB0byB0aGUgVUUgSW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1pblF1YWxpdHkgLSBUaGUgbG93ZXIgYm91bmQgZm9yIHF1YWxpdHkgd2hlbiBlbmNvZGluZ1xuICAgICAqIHZhbGlkIHZhbHVlcyBhcmUgKDAtMTAwKSB3aGVyZTpcbiAgICAgKiAwID0gV29yc3QgcXVhbGl0eS5cbiAgICAgKiAxMDAgPSBCZXN0IHF1YWxpdHkuXG4gICAgICovXG4gICAgc2VuZEVuY29kZXJNaW5RdWFsaXR5KG1pblF1YWxpdHkpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYE1pblF1YWxpdHk9JHttaW5RdWFsaXR5fVxcbmApO1xuICAgICAgICBpZiAobWluUXVhbGl0eSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnRW5jb2Rlci5NaW5RdWFsaXR5JzogbWluUXVhbGl0eVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBNYXhRdWFsaXR5IGVuY29kZXIgc2V0dGluZyB0byB0aGUgVUUgSW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1heFF1YWxpdHkgLSBUaGUgdXBwZXIgYm91bmQgZm9yIHF1YWxpdHkgd2hlbiBlbmNvZGluZ1xuICAgICAqIHZhbGlkIHZhbHVlcyBhcmUgKDAtMTAwKSB3aGVyZTpcbiAgICAgKiAwID0gV29yc3QgcXVhbGl0eS5cbiAgICAgKiAxMDAgPSBCZXN0IHF1YWxpdHkuXG4gICAgICovXG4gICAgc2VuZEVuY29kZXJNYXhRdWFsaXR5KG1heFF1YWxpdHkpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYE1heFF1YWxpdHk9JHttYXhRdWFsaXR5fVxcbmApO1xuICAgICAgICBpZiAobWF4UXVhbGl0eSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnRW5jb2Rlci5NYXhRdWFsaXR5JzogbWF4UXVhbGl0eVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSB7IFdlYlJUQy5NaW5CaXRyYXRlOiBTb21lTnVtYmVyIH19IGNvbW1hbmQgdG8gVUUgdG8gc2V0XG4gICAgICogdGhlIG1pbmltdW0gYml0cmF0ZSB0aGF0IHdlIGFsbG93IFdlYlJUQyB0byB1c2VcbiAgICAgKiAobm90ZSBzZXR0aW5nIHRoaXMgdG9vIGhpZ2ggaW4gcG9vciBuZXR3b3JrcyBjYW4gYmUgcHJvYmxlbWF0aWMpLlxuICAgICAqIEBwYXJhbSBtaW5CaXRyYXRlIC0gVGhlIG1pbmltdW0gYml0cmF0ZSB3ZSB3b3VsZCBsaWtlIFdlYlJUQyB0byBub3QgZmFsbCBiZWxvdy5cbiAgICAgKi9cbiAgICBzZW5kV2ViUlRDTWluQml0cmF0ZShtaW5CaXRyYXRlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBXZWJSVEMgTWluIEJpdHJhdGU9JHttaW5CaXRyYXRlfWApO1xuICAgICAgICBpZiAobWluQml0cmF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnV2ViUlRDLk1pbkJpdHJhdGUnOiBtaW5CaXRyYXRlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIHsgV2ViUlRDLk1heEJpdHJhdGU6IFNvbWVOdW1iZXIgfX0gY29tbWFuZCB0byBVRSB0byBzZXRcbiAgICAgKiB0aGUgbWluaW11bSBiaXRyYXRlIHRoYXQgd2UgYWxsb3cgV2ViUlRDIHRvIHVzZVxuICAgICAqIChub3RlIHNldHRpbmcgdGhpcyB0b28gbG93IGNvdWxkIHJlc3VsdCBpbiBibG9ja3kgdmlkZW8pLlxuICAgICAqIEBwYXJhbSBtaW5CaXRyYXRlIC0gVGhlIG1pbmltdW0gYml0cmF0ZSB3ZSB3b3VsZCBsaWtlIFdlYlJUQyB0byBub3QgZmFsbCBiZWxvdy5cbiAgICAgKi9cbiAgICBzZW5kV2ViUlRDTWF4Qml0cmF0ZShtYXhCaXRyYXRlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBXZWJSVEMgTWF4IEJpdHJhdGU9JHttYXhCaXRyYXRlfWApO1xuICAgICAgICBpZiAobWF4Qml0cmF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnV2ViUlRDLk1heEJpdHJhdGUnOiBtYXhCaXRyYXRlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIHsgV2ViUlRDLkZwczogU29tZU51bWJlciB9fSBVRSA1LjArXG4gICAgICogYW5kIHsgV2ViUlRDLk1heEZwcyB9IFVFIDQuMjcgY29tbWFuZCB0byBzZXRcbiAgICAgKiB0aGUgbWF4aW11bSBmcHMgd2Ugd291bGQgbGlrZSBXZWJSVEMgdG8gc3RyZWFtIGF0LlxuICAgICAqIEBwYXJhbSBmcHMgLSBUaGUgbWF4aW11bSBzdHJlYW0gZnBzLlxuICAgICAqL1xuICAgIHNlbmRXZWJSVENGcHMoZnBzKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBXZWJSVEMgRlBTPSR7ZnBzfWApO1xuICAgICAgICBpZiAoZnBzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7ICdXZWJSVEMuRnBzJzogZnBzIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIC8qIFRPRE86IFJlbW92ZSB3aGVuIFVFIDQuMjcgdW5zdXBwb3J0ZWQuICovXG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyAnV2ViUlRDLk1heEZwcyc6IGZwcyB9KVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhlIFVJIERlc2NyaXB0b3IgYHN0YXQgZnBzYCB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZW5kU2hvd0ZwcygpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0gICBTZW5kaW5nIHNob3cgc3RhdCB0byBVRSAgIC0tLS0nKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdDb21tYW5kJykoW0pTT04uc3RyaW5naWZ5KHsgJ3N0YXQuZnBzJzogJycgfSldKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBJZnJhbWUgcmVxdWVzdCB0byB0aGUgc3RyZWFtZXJcbiAgICAgKi9cbiAgICBzZW5kSWZyYW1lUmVxdWVzdCgpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0gICBTZW5kaW5nIFJlcXVlc3QgZm9yIGFuIElGcmFtZSAgLS0tLScpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0lGcmFtZVJlcXVlc3QnKSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgVUlJbnRlcmFjdGlvbiBtZXNzYWdlXG4gICAgICovXG4gICAgZW1pdFVJSW50ZXJhY3Rpb24oZGVzY3JpcHRvcikge1xuICAgICAgICBMb2dnZXIuSW5mbygnLS0tLSAgIFNlbmRpbmcgY3VzdG9tIFVJSW50ZXJhY3Rpb24gbWVzc2FnZSAgIC0tLS0nKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdVSUludGVyYWN0aW9uJykoW0pTT04uc3RyaW5naWZ5KGRlc2NyaXB0b3IpXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBDb21tYW5kIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBlbWl0Q29tbWFuZChkZXNjcmlwdG9yKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCctLS0tICAgU2VuZGluZyBjdXN0b20gQ29tbWFuZCBtZXNzYWdlICAgLS0tLScpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbSlNPTi5zdHJpbmdpZnkoZGVzY3JpcHRvcildKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIGNvbnNvbGUgY29tbWFuZCBtZXNzYWdlXG4gICAgICovXG4gICAgZW1pdENvbnNvbGVDb21tYW5kKGNvbW1hbmQpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0gICBTZW5kaW5nIGN1c3RvbSBDb21tYW5kOkNvbnNvbGVDb21tYW5kIG1lc3NhZ2UgICAtLS0tJyk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBDb25zb2xlQ29tbWFuZDogY29tbWFuZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byB0aGUgVUUgSW5zdGFuY2UgdG8gaGF2ZSBvd25lcnNoaXAgb2YgUXVhbGl0eVxuICAgICAqL1xuICAgIHNlbmRSZXF1ZXN0UXVhbGl0eUNvbnRyb2xPd25lcnNoaXAoKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCctLS0tICAgU2VuZGluZyBSZXF1ZXN0IHRvIENvbnRyb2wgUXVhbGl0eSAgLS0tLScpO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXIuU2VuZFJlcXVlc3RRdWFsaXR5Q29udHJvbCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgYFRleHRCb3hFbnRyeWAgbWVzc2FnZSBiYWNrIHRvIFVFLlxuICAgICAqIEBwYXJhbSBjb250ZW50cyBUaGUgbmV3IGNvbnRlbnRzIG9mIHRoZSBVRSBzaWRlIHRleHQgYm94LlxuICAgICAqL1xuICAgIHNlbmRUZXh0Ym94RW50cnkoY29udGVudHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBMb2dnZXIuSW5mbygnLS0tLSAgIFNlbmRpbmcgVGV4dGJveEVudHJ5IG1lc3NhZ2UgIC0tLS0nKTtcbiAgICAgICAgKF9hID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdUZXh0Ym94RW50cnknKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKFtjb250ZW50c10pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gYSBMYXRlbmN5IFRlc3QgUmVzdWx0IGFyZSByZWNlaXZlZCBmcm9tIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gTGF0ZW5jeSBUZXN0IFRpbWluZ3NcbiAgICAgKi9cbiAgICBoYW5kbGVMYXRlbmN5VGVzdFJlc3VsdChtZXNzYWdlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5sYXRlbmN5VGVzdCcpO1xuICAgICAgICBjb25zdCBsYXRlbmN5QXNTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZShtZXNzYWdlLnNsaWNlKDEpKTtcbiAgICAgICAgY29uc3QgbGF0ZW5jeVRlc3RSZXN1bHRzID0gbmV3IExhdGVuY3lUZXN0UmVzdWx0cygpO1xuICAgICAgICBPYmplY3QuYXNzaWduKGxhdGVuY3lUZXN0UmVzdWx0cywgSlNPTi5wYXJzZShsYXRlbmN5QXNTdHJpbmcpKTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLnByb2Nlc3NGaWVsZHMoKTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLnRlc3RTdGFydFRpbWVNcyA9IHRoaXMubGF0ZW5jeVN0YXJ0VGltZTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLmJyb3dzZXJSZWNlaXB0VGltZU1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLmxhdGVuY3lFeGNsdWRpbmdEZWNvZGUgPSB+fihsYXRlbmN5VGVzdFJlc3VsdHMuYnJvd3NlclJlY2VpcHRUaW1lTXMgLSBsYXRlbmN5VGVzdFJlc3VsdHMudGVzdFN0YXJ0VGltZU1zKTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLnRlc3REdXJhdGlvbiA9IH5+KGxhdGVuY3lUZXN0UmVzdWx0cy5UcmFuc21pc3Npb25UaW1lTXMgLSBsYXRlbmN5VGVzdFJlc3VsdHMuUmVjZWlwdFRpbWVNcyk7XG4gICAgICAgIGxhdGVuY3lUZXN0UmVzdWx0cy5uZXR3b3JrTGF0ZW5jeSA9IH5+KGxhdGVuY3lUZXN0UmVzdWx0cy5sYXRlbmN5RXhjbHVkaW5nRGVjb2RlIC0gbGF0ZW5jeVRlc3RSZXN1bHRzLnRlc3REdXJhdGlvbik7XG4gICAgICAgIGlmIChsYXRlbmN5VGVzdFJlc3VsdHMuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgJiYgbGF0ZW5jeVRlc3RSZXN1bHRzLmJyb3dzZXJSZWNlaXB0VGltZU1zKSB7XG4gICAgICAgICAgICBsYXRlbmN5VGVzdFJlc3VsdHMuZW5kVG9FbmRMYXRlbmN5ID0gfn4obGF0ZW5jeVRlc3RSZXN1bHRzLmZyYW1lRGlzcGxheURlbHRhVGltZU1zICtcbiAgICAgICAgICAgICAgICBsYXRlbmN5VGVzdFJlc3VsdHMubmV0d29ya0xhdGVuY3ksXG4gICAgICAgICAgICAgICAgK2xhdGVuY3lUZXN0UmVzdWx0cy5DYXB0dXJlVG9TZW5kTXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uTGF0ZW5jeVRlc3RSZXN1bHQobGF0ZW5jeVRlc3RSZXN1bHRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIGEgRGF0YSBDaGFubmVsIExhdGVuY3kgVGVzdCBSZXNwb25zZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gRGF0YSBDaGFubmVsIExhdGVuY3kgVGVzdCBSZXNwb25zZVxuICAgICAqL1xuICAgIGhhbmRsZURhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5kYXRhQ2hhbm5lbExhdGVuY3lSZXNwb25zZScpO1xuICAgICAgICBjb25zdCByZXNwb25zZUFzU3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCd1dGYtMTYnKS5kZWNvZGUobWVzc2FnZS5zbGljZSgxKSk7XG4gICAgICAgIGNvbnN0IGxhdGVuY3lUZXN0UmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlQXNTdHJpbmcpO1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbkRhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZShsYXRlbmN5VGVzdFJlc3BvbnNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBFbmNvZGVyIGFuZCBXZWIgUlRDIFNldHRpbmdzIGFyZSByZWNlaXZlZCBmcm9tIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gSW5pdGlhbCBFbmNvZGVyIGFuZCBXZWIgUlRDIFNldHRpbmdzXG4gICAgICovXG4gICAgaGFuZGxlSW5pdGlhbFNldHRpbmdzKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLkluaXRpYWxTZXR0aW5ncycpO1xuICAgICAgICBjb25zdCBwYXlsb2FkQXNTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZShtZXNzYWdlLnNsaWNlKDEpKTtcbiAgICAgICAgY29uc3QgcGFyc2VkSW5pdGlhbFNldHRpbmdzID0gSlNPTi5wYXJzZShwYXlsb2FkQXNTdHJpbmcpO1xuICAgICAgICBjb25zdCBpbml0aWFsU2V0dGluZ3MgPSBuZXcgSW5pdGlhbFNldHRpbmdzKCk7XG4gICAgICAgIGlmIChwYXJzZWRJbml0aWFsU2V0dGluZ3MuRW5jb2Rlcikge1xuICAgICAgICAgICAgaW5pdGlhbFNldHRpbmdzLkVuY29kZXJTZXR0aW5ncyA9IHBhcnNlZEluaXRpYWxTZXR0aW5ncy5FbmNvZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWRJbml0aWFsU2V0dGluZ3MuV2ViUlRDKSB7XG4gICAgICAgICAgICBpbml0aWFsU2V0dGluZ3MuV2ViUlRDU2V0dGluZ3MgPSBwYXJzZWRJbml0aWFsU2V0dGluZ3MuV2ViUlRDO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWRJbml0aWFsU2V0dGluZ3MuUGl4ZWxTdHJlYW1pbmcpIHtcbiAgICAgICAgICAgIGluaXRpYWxTZXR0aW5ncy5QaXhlbFN0cmVhbWluZ1NldHRpbmdzID0gcGFyc2VkSW5pdGlhbFNldHRpbmdzLlBpeGVsU3RyZWFtaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWRJbml0aWFsU2V0dGluZ3MuQ29uZmlnT3B0aW9ucyAmJlxuICAgICAgICAgICAgcGFyc2VkSW5pdGlhbFNldHRpbmdzLkNvbmZpZ09wdGlvbnMuRGVmYXVsdFRvSG92ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUsICEhcGFyc2VkSW5pdGlhbFNldHRpbmdzLkNvbmZpZ09wdGlvbnMuRGVmYXVsdFRvSG92ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxTZXR0aW5ncy51ZUNvbXBhdGlibGUoKTtcbiAgICAgICAgTG9nZ2VyLkluZm8ocGF5bG9hZEFzU3RyaW5nKTtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25Jbml0aWFsU2V0dGluZ3MoaW5pdGlhbFNldHRpbmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBRdWFudGl6YXRpb24gUGFyYW1ldGVyIGFyZSByZWNlaXZlZCBmcm9tIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gRW5jb2RlcnMgUXVhbnRpemF0aW9uIFBhcmFtZXRlclxuICAgICAqL1xuICAgIGhhbmRsZVZpZGVvRW5jb2RlckF2Z1FQKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLlZpZGVvRW5jb2RlckF2Z1FQJyk7XG4gICAgICAgIGNvbnN0IEF2Z1FQID0gTnVtYmVyKG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKG1lc3NhZ2Uuc2xpY2UoMSkpKTtcbiAgICAgICAgdGhpcy5zZXRWaWRlb0VuY29kZXJBdmdRUChBdmdRUCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBoYXMgYmVlbiBsb2FkZWQgd2l0aCBhIHNyY09iamVjdFxuICAgICAqL1xuICAgIGhhbmRsZVZpZGVvSW5pdGlhbGl6ZWQoKSB7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uVmlkZW9Jbml0aWFsaXplZCgpO1xuICAgICAgICAvLyBlaXRoZXIgYXV0b3BsYXkgdGhlIHZpZGVvIG9yIHNldCB1cCB0aGUgcGxheSBvdmVybGF5XG4gICAgICAgIHRoaXMuYXV0b1BsYXlWaWRlb09yU2V0VXBQbGF5T3ZlcmxheSgpO1xuICAgICAgICB0aGlzLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIudXBkYXRlVmlkZW9TdHJlYW1TaXplKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZsYWcgc2V0IGlmIHRoZSB1c2VyIGhhcyBRdWFsaXR5IE93bmVyc2hpcFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gRG9lcyB0aGUgY3VycmVudCBjbGllbnQgaGF2ZSBRdWFsaXR5IE93bmVyc2hpcFxuICAgICAqL1xuICAgIG9uUXVhbGl0eUNvbnRyb2xPd25lcnNoaXAobWVzc2FnZSkge1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZSk7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5RdWFsaXR5Q29udHJvbE93bmVyc2hpcCcpO1xuICAgICAgICB0aGlzLmlzUXVhbGl0eUNvbnRyb2xsZXIgPSBuZXcgQm9vbGVhbih2aWV3WzFdKS52YWx1ZU9mKCk7XG4gICAgICAgIExvZ2dlci5JbmZvKGBSZWNlaXZlZCBxdWFsaXR5IGNvbnRyb2xsZXIgbWVzc2FnZSwgd2lsbCBjb250cm9sIHF1YWxpdHk6ICR7dGhpcy5pc1F1YWxpdHlDb250cm9sbGVyfWApO1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vblF1YWxpdHlDb250cm9sT3duZXJzaGlwKHRoaXMuaXNRdWFsaXR5Q29udHJvbGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgQWdncmVnYXRlZCBzdGF0cyBhcmUgQ29sbGVjdGVkXG4gICAgICogQHBhcmFtIHN0YXRzIC0gQWdncmVnYXRlZCBTdGF0c1xuICAgICAqL1xuICAgIGhhbmRsZVZpZGVvU3RhdHMoc3RhdHMpIHtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25WaWRlb1N0YXRzKHN0YXRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gUmVzaXplIHRoZSBWaWRlbyBQbGF5ZXIgZWxlbWVudFxuICAgICAqL1xuICAgIHJlc2l6ZVBsYXllclN0eWxlKCkge1xuICAgICAgICB0aGlzLnZpZGVvUGxheWVyLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgfVxuICAgIHNldFByZWZlcnJlZENvZGVjKGNvZGVjKSB7XG4gICAgICAgIHRoaXMucHJlZmVycmVkQ29kZWMgPSBjb2RlYztcbiAgICAgICAgaWYgKHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5wcmVmZXJyZWRDb2RlYyA9IGNvZGVjO1xuICAgICAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIudXBkYXRlQ29kZWNTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRWaWRlb0VuY29kZXJBdmdRUChhdmdRUCkge1xuICAgICAgICB0aGlzLnZpZGVvQXZnUXAgPSBhdmdRUDtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25WaWRlb0VuY29kZXJBdmdRUCh0aGlzLnZpZGVvQXZnUXApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBlbmFibGVzL2Rpc2FibGVzIGtleWJvYXJkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIHNldEtleWJvYXJkSW5wdXRFbmFibGVkKGlzRW5hYmxlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMua2V5Ym9hcmRDb250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudW5yZWdpc3RlcigpO1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkQ29udHJvbGxlciA9IHRoaXMuaW5wdXRDbGFzc2VzRmFjdG9yeS5yZWdpc3RlcktleUJvYXJkKHRoaXMuY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBlbmFibGVzL2Rpc2FibGVzIG1vdXNlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIHNldE1vdXNlSW5wdXRFbmFibGVkKGlzRW5hYmxlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMubW91c2VDb250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudW5yZWdpc3RlcigpO1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBtb3VzZU1vZGUgPSB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkhvdmVyaW5nTW91c2VNb2RlKVxuICAgICAgICAgICAgICAgID8gQ29udHJvbFNjaGVtZVR5cGUuSG92ZXJpbmdNb3VzZVxuICAgICAgICAgICAgICAgIDogQ29udHJvbFNjaGVtZVR5cGUuTG9ja2VkTW91c2U7XG4gICAgICAgICAgICB0aGlzLm1vdXNlQ29udHJvbGxlciA9IHRoaXMuaW5wdXRDbGFzc2VzRmFjdG9yeS5yZWdpc3Rlck1vdXNlKG1vdXNlTW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogZW5hYmxlcy9kaXNhYmxlcyB0b3VjaCBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBzZXRUb3VjaElucHV0RW5hYmxlZChpc0VuYWJsZWQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnRvdWNoQ29udHJvbGxlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnVucmVnaXN0ZXIoKTtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy50b3VjaENvbnRyb2xsZXIgPSB0aGlzLmlucHV0Q2xhc3Nlc0ZhY3RvcnkucmVnaXN0ZXJUb3VjaCh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkZha2VNb3VzZVdpdGhUb3VjaGVzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogZW5hYmxlcy9kaXNhYmxlcyBnYW1lIHBhZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBzZXRHYW1lUGFkSW5wdXRFbmFibGVkKGlzRW5hYmxlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuZ2FtZVBhZENvbnRyb2xsZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS51bnJlZ2lzdGVyKCk7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2FtZVBhZENvbnRyb2xsZXIgPSB0aGlzLmlucHV0Q2xhc3Nlc0ZhY3RvcnkucmVnaXN0ZXJHYW1lUGFkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVnaXN0ZXJEYXRhQ2hhbm5lbEV2ZW50RW1pdHRlcnMoZGF0YUNoYW5uZWwpIHtcbiAgICAgICAgZGF0YUNoYW5uZWwub25PcGVuID0gKGxhYmVsLCBldmVudCkgPT4gdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBEYXRhQ2hhbm5lbE9wZW5FdmVudCh7IGxhYmVsLCBldmVudCB9KSk7XG4gICAgICAgIGRhdGFDaGFubmVsLm9uQ2xvc2UgPSAobGFiZWwsIGV2ZW50KSA9PiB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IERhdGFDaGFubmVsQ2xvc2VFdmVudCh7IGxhYmVsLCBldmVudCB9KSk7XG4gICAgICAgIGRhdGFDaGFubmVsLm9uRXJyb3IgPSAobGFiZWwsIGV2ZW50KSA9PiB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IERhdGFDaGFubmVsRXJyb3JFdmVudCh7IGxhYmVsLCBldmVudCB9KSk7XG4gICAgfVxuICAgIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIobmFtZSwgZGlyZWN0aW9uLCBoYW5kbGVyKSB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyICYmIHR5cGVvZiBoYW5kbGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoYFVuYWJsZSB0byByZWdpc3RlciBoYW5kbGVyIGZvciAke25hbWV9IGFzIG5vIGhhbmRsZXIgd2FzIHBhc3NlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihkaXJlY3Rpb24sIG5hbWUsIChkYXRhKSA9PiB0eXBlb2YgaGFuZGxlciA9PT0gJ3VuZGVmaW5lZCcgJiYgZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXJcbiAgICAgICAgICAgID8gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKG5hbWUsIGRhdGEpXG4gICAgICAgICAgICA6IGhhbmRsZXIoZGF0YSkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYlJ0Y1BsYXllckNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IFhSR2FtZXBhZENvbnRyb2xsZXIgfSBmcm9tICcuLi9JbnB1dHMvWFJHYW1lcGFkQ29udHJvbGxlcic7XG5pbXBvcnQgeyBYckZyYW1lRXZlbnQgfSBmcm9tICcuLi9VdGlsL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBGbGFncyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuZXhwb3J0IGNsYXNzIFdlYlhSQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Iod2ViUnRjUGxheWVyQ29udHJvbGxlcikge1xuICAgICAgICB0aGlzLnhyVmlld2VyUG9zZSA9IG51bGw7XG4gICAgICAgIC8vIFVzZWQgZm9yIGNvbXBhcmlzb25zIHRvIGVuc3VyZSB0d28gbnVtYmVycyBhcmUgY2xvc2UgZW5vdWdoLlxuICAgICAgICB0aGlzLkVQU0lMT04gPSAwLjAwMDAwMDE7XG4gICAgICAgIHRoaXMudmlkZW9UZXh0dXJlID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcmV2VmlkZW9XaWR0aCA9IDA7XG4gICAgICAgIHRoaXMucHJldlZpZGVvSGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5sZWZ0VmlldyA9IG51bGw7XG4gICAgICAgIHRoaXMucmlnaHRWaWV3ID0gbnVsbDtcbiAgICAgICAgLy8gU3RvcmUgdGhlIEhNRCBkYXRhIHdlIGhhdmUgbGFzdCBzZW50IChub3QgYWxsIG9mIGl0IGlzIG5lZWRlZCBldmVyeSBmcmFtZSB1bmxlc3MgaXQgY2hhbmdlcylcbiAgICAgICAgdGhpcy5sYXN0U2VudExlZnRFeWVQcm9qID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0U2VudFJpZ2h0RXllUHJvaiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZUxlZnRFeWVQb3MgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RTZW50UmVsYXRpdmVSaWdodEV5ZVBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMueHJTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy53ZWJSdGNDb250cm9sbGVyID0gd2ViUnRjUGxheWVyQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy54ckdhbWVwYWRDb250cm9sbGVyID0gbmV3IFhSR2FtZXBhZENvbnRyb2xsZXIodGhpcy53ZWJSdGNDb250cm9sbGVyLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5vblNlc3Npb25FbmRlZCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgICAgICB0aGlzLm9uU2Vzc2lvblN0YXJ0ZWQgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICAgICAgdGhpcy5vbkZyYW1lID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgfVxuICAgIHhyQ2xpY2tlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnhyU2Vzc2lvbikge1xuICAgICAgICAgICAgaWYgKCFuYXZpZ2F0b3IueHIpIHtcbiAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoJ1RoaXMgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhSLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hdmlnYXRvci54clxuICAgICAgICAgICAgICAgIC8qIFJlcXVlc3QgaW1tZXJzaXZlLXZyIHNlc3Npb24gd2l0aG91dCBhbnkgb3B0aW9uYWwgZmVhdHVyZXMuICovXG4gICAgICAgICAgICAgICAgLnJlcXVlc3RTZXNzaW9uKCdpbW1lcnNpdmUtdnInLCB7IG9wdGlvbmFsRmVhdHVyZXM6IFtdIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHNlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uWHJTZXNzaW9uU3RhcnRlZChzZXNzaW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy54clNlc3Npb24uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25YclNlc3Npb25FbmRlZCgpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ1hSIFNlc3Npb24gZW5kZWQnKTtcbiAgICAgICAgdGhpcy54clNlc3Npb24gPSBudWxsO1xuICAgICAgICB0aGlzLm9uU2Vzc2lvbkVuZGVkLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd4clNlc3Npb25FbmRlZCcpKTtcbiAgICB9XG4gICAgaW5pdEdMKCkge1xuICAgICAgICBpZiAodGhpcy5nbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB0aGlzLmdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsMicsIHtcbiAgICAgICAgICAgIHhyQ29tcGF0aWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gU2V0IG91ciBjbGVhciBjb2xvclxuICAgICAgICB0aGlzLmdsLmNsZWFyQ29sb3IoMC4wLCAwLjAsIDAuMCwgMSk7XG4gICAgfVxuICAgIGluaXRTaGFkZXJzKCkge1xuICAgICAgICAvLyBzaGFkZXIgc291cmNlIGNvZGVcbiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uO1xuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBhX3RleENvb3JkO1xuXG4gICAgICAgIC8vIHZhcnlpbmdzXG4gICAgICAgIHZhcnlpbmcgdmVjMiB2X3RleENvb3JkO1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24ueCwgYV9wb3NpdGlvbi55LCAwLCAxKTtcbiAgICAgICAgICAgLy8gcGFzcyB0aGUgdGV4Q29vcmQgdG8gdGhlIGZyYWdtZW50IHNoYWRlclxuICAgICAgICAgICAvLyBUaGUgR1BVIHdpbGwgaW50ZXJwb2xhdGUgdGhpcyB2YWx1ZSBiZXR3ZWVuIHBvaW50cy5cbiAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7XG4gICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBgXG4gICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG4gICAgICAgIC8vIG91ciB0ZXh0dXJlXG4gICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7XG5cbiAgICAgICAgLy8gdGhlIHRleENvb3JkcyBwYXNzZWQgaW4gZnJvbSB0aGUgdmVydGV4IHNoYWRlci5cbiAgICAgICAgdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodV9pbWFnZSwgdl90ZXhDb29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgLy8gc2V0dXAgdmVydGV4IHNoYWRlclxuICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSB0aGlzLmdsLmNyZWF0ZVNoYWRlcih0aGlzLmdsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICB0aGlzLmdsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNoYWRlclNvdXJjZSk7XG4gICAgICAgIHRoaXMuZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICAvLyBzZXR1cCBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmdsLmNyZWF0ZVNoYWRlcih0aGlzLmdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgICAgIHRoaXMuZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7XG4gICAgICAgIHRoaXMuZ2wuY29tcGlsZVNoYWRlcihmcmFnbWVudFNoYWRlcik7XG4gICAgICAgIC8vIHNldHVwIEdMU0wgcHJvZ3JhbVxuICAgICAgICBjb25zdCBzaGFkZXJQcm9ncmFtID0gdGhpcy5nbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHNoYWRlclByb2dyYW0sIHZlcnRleFNoYWRlcik7XG4gICAgICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHNoYWRlclByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgdGhpcy5nbC5saW5rUHJvZ3JhbShzaGFkZXJQcm9ncmFtKTtcbiAgICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHNoYWRlclByb2dyYW0pO1xuICAgICAgICAvLyBsb29rIHVwIHdoZXJlIHZlcnRleCBkYXRhIG5lZWRzIHRvIGdvXG4gICAgICAgIHRoaXMucG9zaXRpb25Mb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24oc2hhZGVyUHJvZ3JhbSwgJ2FfcG9zaXRpb24nKTtcbiAgICAgICAgdGhpcy50ZXhjb29yZExvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbihzaGFkZXJQcm9ncmFtLCAnYV90ZXhDb29yZCcpO1xuICAgIH1cbiAgICB1cGRhdGVWaWRlb1RleHR1cmUoKSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1RleHR1cmUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBvdXIgdGV4dHVyZSB0aGF0IHdlIHVzZSBpbiBvdXIgc2hhZGVyXG4gICAgICAgICAgICAvLyBhbmQgYmluZCBpdCBvbmNlIGJlY2F1c2Ugd2UgbmV2ZXIgdXNlIGFueSBvdGhlciB0ZXh0dXJlLlxuICAgICAgICAgICAgdGhpcy52aWRlb1RleHR1cmUgPSB0aGlzLmdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLnZpZGVvVGV4dHVyZSk7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHBhcmFtZXRlcnMgc28gd2UgY2FuIHJlbmRlciBhbnkgc2l6ZSBpbWFnZS5cbiAgICAgICAgICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9XUkFQX1MsIHRoaXMuZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICB0aGlzLmdsLnRleFBhcmFtZXRlcmkodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLmdsLlRFWFRVUkVfV1JBUF9ULCB0aGlzLmdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy5nbC5URVhUVVJFX01JTl9GSUxURVIsIHRoaXMuZ2wuTElORUFSKTtcbiAgICAgICAgICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCB0aGlzLmdsLkxJTkVBUik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmlkZW9IZWlnaHQgPSB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkudmlkZW9IZWlnaHQ7XG4gICAgICAgIGNvbnN0IHZpZGVvV2lkdGggPSB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkudmlkZW9XaWR0aDtcbiAgICAgICAgaWYgKHRoaXMucHJldlZpZGVvSGVpZ2h0ICE9IHZpZGVvSGVpZ2h0IHx8IHRoaXMucHJldlZpZGVvV2lkdGggIT0gdmlkZW9XaWR0aCkge1xuICAgICAgICAgICAgLy8gRG8gZnVsbCB1cGRhdGUgb2YgdGV4dHVyZSBpZiBkaW1lbnNpb25zIGRvIG5vdCBtYXRjaFxuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMud2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBkaW1lbnNpb25zIG1hdGNoIGp1c3QgdXBkYXRlIHRoZSBzdWIgcmVnaW9uXG4gICAgICAgICAgICB0aGlzLmdsLnRleFN1YkltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMud2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHByZXYgdmlkZW8gd2lkdGgvaGVpZ2h0XG4gICAgICAgIHRoaXMucHJldlZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7XG4gICAgICAgIHRoaXMucHJldlZpZGVvV2lkdGggPSB2aWRlb1dpZHRoO1xuICAgIH1cbiAgICBpbml0QnVmZmVycygpIHtcbiAgICAgICAgLy8gQ3JlYXRlIG91dCBwb3NpdGlvbiBidWZmZXIgYW5kIGl0cyB2ZXJ0ZXggc2hhZGVyIGF0dHJpYnV0ZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBidWZmZXIgdG8gcHV0IHRoZSB0aGUgdmVydGljZXMgb2YgdGhlIHBsYW5lIHdlIHdpbGwgZHJhdyB0aGUgdmlkZW8gc3RyZWFtIG9udG9cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25CdWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgLy8gQmluZCB0aGUgcG9zaXRpb24gYnVmZmVyXG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMucG9zaXRpb25CdWZmZXIpO1xuICAgICAgICAgICAgLy8gRW5hYmxlIGBwb3NpdGlvbkxvY2F0aW9uYCB0byBiZSB1c2VkIGFzIHZlcnRleCBzaGFkZXIgYXR0cmlidXRlXG4gICAgICAgICAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMucG9zaXRpb25Mb2NhdGlvbik7XG4gICAgICAgICAgICAvLyBOb3RlOiBwb3NpdGlvbnMgYXJlIHBhc3NlZCBpbiBjbGlwLXNwYWNlIGNvb3JkaW5hdGVzIFstMS4uMV0gc28gbm8gbmVlZCB0byBjb252ZXJ0IGluLXNoYWRlclxuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgICAgICAgICAgIC0xLjAsIDEuMCxcbiAgICAgICAgICAgICAgICAxLjAsIDEuMCxcbiAgICAgICAgICAgICAgICAtMS4wLCAtMS4wLFxuICAgICAgICAgICAgICAgIC0xLjAsIC0xLjAsXG4gICAgICAgICAgICAgICAgMS4wLCAxLjAsXG4gICAgICAgICAgICAgICAgMS4wLCAtMS4wXG4gICAgICAgICAgICBdKSwgdGhpcy5nbC5TVEFUSUNfRFJBVyk7XG4gICAgICAgICAgICAvLyBUZWxsIHBvc2l0aW9uIGF0dHJpYnV0ZSBvZiB0aGUgdmVydGV4IHNoYWRlciBob3cgdG8gZ2V0IGRhdGEgb3V0IG9mIHRoZSBib3VuZCBidWZmZXIgKHRoZSBwb3NpdGlvbkJ1ZmZlcilcbiAgICAgICAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnBvc2l0aW9uTG9jYXRpb24sIDIgLypzaXplKi8sIHRoaXMuZ2wuRkxPQVQgLyp0eXBlKi8sIGZhbHNlIC8qbm9ybWFsaXplKi8sIDAgLypzdHJpZGUqLywgMCAvKm9mZnNldCovKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgb3VyIHRleHR1cmUgY29vcmRpbmF0ZSBidWZmZXJzIGZvciBhY2Nlc3Npbmcgb3VyIHRleHR1cmVcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy50ZXhjb29yZEJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgICAgICAvLyBCaW5kIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGUgYnVmZmVyXG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMudGV4Y29vcmRCdWZmZXIpO1xuICAgICAgICAgICAgLy8gRW5hYmxlIGB0ZXhjb29yZExvY2F0aW9uYCB0byBiZSB1c2VkIGFzIGEgdmVydGV4IHNoYWRlciBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHRoaXMuZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy50ZXhjb29yZExvY2F0aW9uKTtcbiAgICAgICAgICAgIC8vIFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIHRvIGFwcGx5IGZvciByZWN0YW5nbGUgd2UgYXJlIGRyYXdpbmdcbiAgICAgICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjAsIDEuMCwgMC4wLCAxLjAsIDEuMCwgMC4wLCAxLjAsIDEuMF0pLCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcbiAgICAgICAgICAgIC8vIFRlbGwgdGV4dHVyZSBjb29yZGluYXRlIGF0dHJpYnV0ZSBvZiB0aGUgdmVydGV4IHNoYWRlciBob3cgdG8gZ2V0IGRhdGEgb3V0IG9mIHRoZSBib3VuZCBidWZmZXIgKHRoZSB0ZXhjb29yZEJ1ZmZlcilcbiAgICAgICAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnRleGNvb3JkTG9jYXRpb24sIDIgLypzaXplKi8sIHRoaXMuZ2wuRkxPQVQgLyp0eXBlKi8sIGZhbHNlIC8qbm9ybWFsaXplKi8sIDAgLypzdHJpZGUqLywgMCAvKm9mZnNldCovKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblhyU2Vzc2lvblN0YXJ0ZWQoc2Vzc2lvbikge1xuICAgICAgICBMb2dnZXIuSW5mbygnWFIgU2Vzc2lvbiBzdGFydGVkJyk7XG4gICAgICAgIHRoaXMueHJTZXNzaW9uID0gc2Vzc2lvbjtcbiAgICAgICAgdGhpcy54clNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblhyU2Vzc2lvbkVuZGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJbml0aWFsaXphdGlvblxuICAgICAgICB0aGlzLmluaXRHTCgpO1xuICAgICAgICB0aGlzLmluaXRTaGFkZXJzKCk7XG4gICAgICAgIHRoaXMuaW5pdEJ1ZmZlcnMoKTtcbiAgICAgICAgc2Vzc2lvbi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoJ2xvY2FsJykudGhlbigocmVmU3BhY2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMueHJSZWZTcGFjZSA9IHJlZlNwYWNlO1xuICAgICAgICAgICAgLy8gU2V0IHVwIG91ciBiYXNlIGxheWVyIChpLmUuIGEgcHJvamVjdGlvbiBsYXllciB0aGF0IGZpbGxzIHRoZSBlbnRpcmUgWFIgdmlld3BvcnQpLlxuICAgICAgICAgICAgdGhpcy54clNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoe1xuICAgICAgICAgICAgICAgIGJhc2VMYXllcjogbmV3IFhSV2ViR0xMYXllcih0aGlzLnhyU2Vzc2lvbiwgdGhpcy5nbClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRhcmdldCBmcmFtZXJhdGUgdG8gOTAgZnBzIGlmIDkwIGZwcyBpcyBzdXBwb3J0ZWQgaW4gdGhpcyBYUiBkZXZpY2VcbiAgICAgICAgICAgIGlmICh0aGlzLnhyU2Vzc2lvbi5zdXBwb3J0ZWRGcmFtZVJhdGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmcmFtZVJhdGUgb2YgdGhpcy54clNlc3Npb24uc3VwcG9ydGVkRnJhbWVSYXRlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVSYXRlID09IDkwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnVwZGF0ZVRhcmdldEZyYW1lUmF0ZSg5MCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCaW5kaW5nIHRvIGVhY2ggbmV3IGZyYW1lIHRvIGdldCBsYXRlc3QgWFIgdXBkYXRlc1xuICAgICAgICAgICAgdGhpcy54clNlc3Npb24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMub25YckZyYW1lLmJpbmQodGhpcykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vblNlc3Npb25TdGFydGVkLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd4clNlc3Npb25TdGFydGVkJykpO1xuICAgIH1cbiAgICBhcmVBcnJheXNFcXVhbChhLCBiKSB7XG4gICAgICAgIHJldHVybiAoYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKGVsZW1lbnQsIGluZGV4KSA9PiBNYXRoLmFicyhlbGVtZW50IC0gYltpbmRleF0pIDw9IHRoaXMuRVBTSUxPTikpO1xuICAgIH1cbiAgICBhcmVQb2ludHNFcXVhbChhLCBiKSB7XG4gICAgICAgIHJldHVybiAoTWF0aC5hYnMoYS54IC0gYi54KSA+PSB0aGlzLkVQU0lMT04gJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEueSAtIGIueSkgPj0gdGhpcy5FUFNJTE9OICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhLnogLSBiLnopID49IHRoaXMuRVBTSUxPTik7XG4gICAgfVxuICAgIHNlbmRYUkRhdGFUb1VFKCkge1xuICAgICAgICBpZiAodGhpcy5sZWZ0VmlldyA9PSBudWxsIHx8IHRoaXMucmlnaHRWaWV3ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBzZWxlY3RpdmVseSBzZW5kIGVpdGhlciB0aGUgYFhSRXllVmlld3NgIG9yIGBYUkhNRFRyYW5zZm9ybWBcbiAgICAgICAgLy8gbWVzc2FnZXMgb3ZlciB0aGUgZGF0YWNoYW5uZWwuIFRoZSByZWFzb24gZm9yIHRoaXMgc2VsZWN0aXZlIHNlbmRpbmcgaXMgdGhhdFxuICAgICAgICAvLyB0aGUgYFhSRXllVmlld3NgIGlzIGEgbXVjaCBsYXJnZXIgbWVzc2FnZSBhbmQgY2hhbmdlcyBpbmZyZXF1ZW50bHkgKGUuZy4gb25seSB3aGVuIHVzZXIgY2hhbmdlcyBoZWFkc2V0IElQRCkuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgd2Ugb25seSBuZWVkIHRvIHNlbmQgaXQgb25jZSBvbiBzdGFydHVwIGFuZCB0aGVuIGFueSB0aW1lIGl0IGNoYW5nZXMuXG4gICAgICAgIC8vIFRoZSByZXN0IG9mIHRoZSB0aW1lIHdlIGNhbiBzZW5kIHRoZSBgWFJITURUcmFuc2Zvcm1gIG1lc3NhZ2UuXG4gICAgICAgIGxldCBzaG91bGRTZW5kRXllVmlld3MgPSB0aGlzLmxhc3RTZW50TGVmdEV5ZVByb2ogPT0gbnVsbCB8fFxuICAgICAgICAgICAgdGhpcy5sYXN0U2VudFJpZ2h0RXllUHJvaiA9PSBudWxsIHx8XG4gICAgICAgICAgICB0aGlzLmxhc3RTZW50UmVsYXRpdmVMZWZ0RXllUG9zID09IG51bGwgfHxcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZVJpZ2h0RXllUG9zID09IG51bGw7XG4gICAgICAgIGNvbnN0IGxlZnRFeWVUcmFucyA9IHRoaXMubGVmdFZpZXcudHJhbnNmb3JtLm1hdHJpeDtcbiAgICAgICAgY29uc3QgbGVmdEV5ZVByb2ogPSB0aGlzLmxlZnRWaWV3LnByb2plY3Rpb25NYXRyaXg7XG4gICAgICAgIGNvbnN0IHJpZ2h0RXllVHJhbnMgPSB0aGlzLnJpZ2h0Vmlldy50cmFuc2Zvcm0ubWF0cml4O1xuICAgICAgICBjb25zdCByaWdodEV5ZVByb2ogPSB0aGlzLnJpZ2h0Vmlldy5wcm9qZWN0aW9uTWF0cml4O1xuICAgICAgICBjb25zdCBobWRUcmFucyA9IHRoaXMueHJWaWV3ZXJQb3NlLnRyYW5zZm9ybS5tYXRyaXg7XG4gICAgICAgIC8vIENoZWNrIGlmIHByb2plY3Rpb24gbWF0cmljZXMgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIGlmICghc2hvdWxkU2VuZEV5ZVZpZXdzICYmIHRoaXMubGFzdFNlbnRMZWZ0RXllUHJvaiAhPSBudWxsICYmIHRoaXMubGFzdFNlbnRSaWdodEV5ZVByb2ogIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbGVmdEV5ZVByb2pVbmNoYW5nZWQgPSB0aGlzLmFyZUFycmF5c0VxdWFsKGxlZnRFeWVQcm9qLCB0aGlzLmxhc3RTZW50TGVmdEV5ZVByb2opO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRFeWVQcm9qVW5jaGFuZ2VkID0gdGhpcy5hcmVBcnJheXNFcXVhbChyaWdodEV5ZVByb2osIHRoaXMubGFzdFNlbnRSaWdodEV5ZVByb2opO1xuICAgICAgICAgICAgc2hvdWxkU2VuZEV5ZVZpZXdzID0gbGVmdEV5ZVByb2pVbmNoYW5nZWQgPT0gZmFsc2UgfHwgcmlnaHRFeWVQcm9qVW5jaGFuZ2VkID09IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlZnRFeWVSZWxhdGl2ZVBvcyA9IG5ldyBET01Qb2ludFJlYWRPbmx5KHRoaXMubGVmdFZpZXcudHJhbnNmb3JtLnBvc2l0aW9uLnggLSB0aGlzLnhyVmlld2VyUG9zZS50cmFuc2Zvcm0ucG9zaXRpb24ueCwgdGhpcy5sZWZ0Vmlldy50cmFuc2Zvcm0ucG9zaXRpb24ueSAtIHRoaXMueHJWaWV3ZXJQb3NlLnRyYW5zZm9ybS5wb3NpdGlvbi55LCB0aGlzLmxlZnRWaWV3LnRyYW5zZm9ybS5wb3NpdGlvbi56IC0gdGhpcy54clZpZXdlclBvc2UudHJhbnNmb3JtLnBvc2l0aW9uLnosIDEuMCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0RXllUmVsYXRpdmVQb3MgPSBuZXcgRE9NUG9pbnRSZWFkT25seSh0aGlzLmxlZnRWaWV3LnRyYW5zZm9ybS5wb3NpdGlvbi54IC0gdGhpcy54clZpZXdlclBvc2UudHJhbnNmb3JtLnBvc2l0aW9uLngsIHRoaXMubGVmdFZpZXcudHJhbnNmb3JtLnBvc2l0aW9uLnkgLSB0aGlzLnhyVmlld2VyUG9zZS50cmFuc2Zvcm0ucG9zaXRpb24ueSwgdGhpcy5sZWZ0Vmlldy50cmFuc2Zvcm0ucG9zaXRpb24ueiAtIHRoaXMueHJWaWV3ZXJQb3NlLnRyYW5zZm9ybS5wb3NpdGlvbi56LCAxLjApO1xuICAgICAgICAvLyBDaGVjayBpZiByZWxhdGl2ZSBleWUgcG9zIGhhcyBjaGFuZ2VkIChlLmcgSVBEIGNoYW5nZWQpXG4gICAgICAgIGlmICghc2hvdWxkU2VuZEV5ZVZpZXdzICYmXG4gICAgICAgICAgICB0aGlzLmxhc3RTZW50UmVsYXRpdmVMZWZ0RXllUG9zICE9IG51bGwgJiZcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZVJpZ2h0RXllUG9zICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRFeWVQb3NVbmNoYW5nZWQgPSB0aGlzLmFyZVBvaW50c0VxdWFsKGxlZnRFeWVSZWxhdGl2ZVBvcywgdGhpcy5sYXN0U2VudFJlbGF0aXZlTGVmdEV5ZVBvcyk7XG4gICAgICAgICAgICBjb25zdCByaWdodEV5ZVBvc1VuY2hhbmdlZCA9IHRoaXMuYXJlUG9pbnRzRXF1YWwocmlnaHRFeWVSZWxhdGl2ZVBvcywgdGhpcy5sYXN0U2VudFJlbGF0aXZlUmlnaHRFeWVQb3MpO1xuICAgICAgICAgICAgc2hvdWxkU2VuZEV5ZVZpZXdzID0gbGVmdEV5ZVBvc1VuY2hhbmdlZCA9PSBmYWxzZSB8fCByaWdodEV5ZVBvc1VuY2hhbmdlZCA9PSBmYWxzZTtcbiAgICAgICAgICAgIC8vIE5vdGU6IFdlIGFyZSBub3QgY2hlY2tpbmcgaWYgRXllVmlldyByb3RhdGlvbiBjaGFuZ2VzIChhcyBmYXIgYXMgSSBrbm93IG5vIEhNRCBzdXBwb3J0cyBjaGFuZ2luZyB0aGlzIHZhbHVlIGF0IHJ1bnRpbWUpLlxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRTZW5kRXllVmlld3MpIHtcbiAgICAgICAgICAgIC8vIHNlbmQgdHJhbnNmb3JtICg0eDQpIGFuZCBwcm9qZWN0aW9uIG1hdHJpeCAoNHg0KSBkYXRhIGZvciBlYWNoIGV5ZSAobGVmdCBmaXJzdCwgdGhlbiByaWdodClcbiAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy53ZWJSdGNDb250cm9sbGVyLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSRXllVmlld3MnKShbXG4gICAgICAgICAgICAgICAgLy8gTGVmdCBleWUgNHg0IHRyYW5zZm9ybSBtYXRyaXhcbiAgICAgICAgICAgICAgICBsZWZ0RXllVHJhbnNbMF0sIGxlZnRFeWVUcmFuc1s0XSwgbGVmdEV5ZVRyYW5zWzhdLCBsZWZ0RXllVHJhbnNbMTJdLFxuICAgICAgICAgICAgICAgIGxlZnRFeWVUcmFuc1sxXSwgbGVmdEV5ZVRyYW5zWzVdLCBsZWZ0RXllVHJhbnNbOV0sIGxlZnRFeWVUcmFuc1sxM10sXG4gICAgICAgICAgICAgICAgbGVmdEV5ZVRyYW5zWzJdLCBsZWZ0RXllVHJhbnNbNl0sIGxlZnRFeWVUcmFuc1sxMF0sIGxlZnRFeWVUcmFuc1sxNF0sXG4gICAgICAgICAgICAgICAgbGVmdEV5ZVRyYW5zWzNdLCBsZWZ0RXllVHJhbnNbN10sIGxlZnRFeWVUcmFuc1sxMV0sIGxlZnRFeWVUcmFuc1sxNV0sXG4gICAgICAgICAgICAgICAgLy8gTGVmdCBleWUgNHg0IHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgICAgICAgICAgbGVmdEV5ZVByb2pbMF0sIGxlZnRFeWVQcm9qWzRdLCBsZWZ0RXllUHJvals4XSwgbGVmdEV5ZVByb2pbMTJdLFxuICAgICAgICAgICAgICAgIGxlZnRFeWVQcm9qWzFdLCBsZWZ0RXllUHJvals1XSwgbGVmdEV5ZVByb2pbOV0sIGxlZnRFeWVQcm9qWzEzXSxcbiAgICAgICAgICAgICAgICBsZWZ0RXllUHJvalsyXSwgbGVmdEV5ZVByb2pbNl0sIGxlZnRFeWVQcm9qWzEwXSwgbGVmdEV5ZVByb2pbMTRdLFxuICAgICAgICAgICAgICAgIGxlZnRFeWVQcm9qWzNdLCBsZWZ0RXllUHJvals3XSwgbGVmdEV5ZVByb2pbMTFdLCBsZWZ0RXllUHJvalsxNV0sXG4gICAgICAgICAgICAgICAgLy8gUmlnaHQgZXllIDR4NCB0cmFuc2Zvcm0gbWF0cml4XG4gICAgICAgICAgICAgICAgcmlnaHRFeWVUcmFuc1swXSwgcmlnaHRFeWVUcmFuc1s0XSwgcmlnaHRFeWVUcmFuc1s4XSwgcmlnaHRFeWVUcmFuc1sxMl0sXG4gICAgICAgICAgICAgICAgcmlnaHRFeWVUcmFuc1sxXSwgcmlnaHRFeWVUcmFuc1s1XSwgcmlnaHRFeWVUcmFuc1s5XSwgcmlnaHRFeWVUcmFuc1sxM10sXG4gICAgICAgICAgICAgICAgcmlnaHRFeWVUcmFuc1syXSwgcmlnaHRFeWVUcmFuc1s2XSwgcmlnaHRFeWVUcmFuc1sxMF0sIHJpZ2h0RXllVHJhbnNbMTRdLFxuICAgICAgICAgICAgICAgIHJpZ2h0RXllVHJhbnNbM10sIHJpZ2h0RXllVHJhbnNbN10sIHJpZ2h0RXllVHJhbnNbMTFdLCByaWdodEV5ZVRyYW5zWzE1XSxcbiAgICAgICAgICAgICAgICAvLyByaWdodCBleWUgNHg0IHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgICAgICAgICAgcmlnaHRFeWVQcm9qWzBdLCByaWdodEV5ZVByb2pbNF0sIHJpZ2h0RXllUHJvals4XSwgcmlnaHRFeWVQcm9qWzEyXSxcbiAgICAgICAgICAgICAgICByaWdodEV5ZVByb2pbMV0sIHJpZ2h0RXllUHJvals1XSwgcmlnaHRFeWVQcm9qWzldLCByaWdodEV5ZVByb2pbMTNdLFxuICAgICAgICAgICAgICAgIHJpZ2h0RXllUHJvalsyXSwgcmlnaHRFeWVQcm9qWzZdLCByaWdodEV5ZVByb2pbMTBdLCByaWdodEV5ZVByb2pbMTRdLFxuICAgICAgICAgICAgICAgIHJpZ2h0RXllUHJvalszXSwgcmlnaHRFeWVQcm9qWzddLCByaWdodEV5ZVByb2pbMTFdLCByaWdodEV5ZVByb2pbMTVdLFxuICAgICAgICAgICAgICAgIC8vIEhNRCA0eDQgdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMF0sIGhtZFRyYW5zWzRdLCBobWRUcmFuc1s4XSwgaG1kVHJhbnNbMTJdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzFdLCBobWRUcmFuc1s1XSwgaG1kVHJhbnNbOV0sIGhtZFRyYW5zWzEzXSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1syXSwgaG1kVHJhbnNbNl0sIGhtZFRyYW5zWzEwXSwgaG1kVHJhbnNbMTRdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzNdLCBobWRUcmFuc1s3XSwgaG1kVHJhbnNbMTFdLCBobWRUcmFuc1sxNV0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRMZWZ0RXllUHJvaiA9IGxlZnRFeWVQcm9qO1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VudFJpZ2h0RXllUHJvaiA9IHJpZ2h0RXllUHJvajtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZUxlZnRFeWVQb3MgPSBsZWZ0RXllUmVsYXRpdmVQb3M7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZW50UmVsYXRpdmVSaWdodEV5ZVBvcyA9IHJpZ2h0RXllUmVsYXRpdmVQb3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBuZWVkIHRvIHRoZSBlbnRpcmUgZXllIHZpZXdzIGJlaW5nIHNlbnQganVzdCBzZW5kIHRoZSBITUQgdHJhbnNmb3JtXG4gICAgICAgICAgICB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnWFJITURUcmFuc2Zvcm0nKShbXG4gICAgICAgICAgICAgICAgLy8gSE1EIDR4NCB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICBobWRUcmFuc1swXSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1s0XSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1s4XSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1sxMl0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMV0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbNV0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbOV0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMTNdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzJdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzZdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzEwXSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1sxNF0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbM10sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbN10sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMTFdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzE1XVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25YckZyYW1lKHRpbWUsIGZyYW1lKSB7XG4gICAgICAgIHRoaXMueHJWaWV3ZXJQb3NlID0gZnJhbWUuZ2V0Vmlld2VyUG9zZSh0aGlzLnhyUmVmU3BhY2UpO1xuICAgICAgICBpZiAodGhpcy54clZpZXdlclBvc2UpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3MoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnRWaWV3ID09IG51bGwgfHwgdGhpcy5yaWdodFZpZXcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VuZFhSRGF0YVRvVUUoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9UZXh0dXJlKCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndlYlJ0Y0NvbnRyb2xsZXIuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuWFJDb250cm9sbGVySW5wdXQpKSB7XG4gICAgICAgICAgICB0aGlzLnhyU2Vzc2lvbi5pbnB1dFNvdXJjZXMuZm9yRWFjaCgoc291cmNlLCBfaW5kZXgsIF9hcnJheSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMueHJHYW1lcGFkQ29udHJvbGxlci51cGRhdGVTdGF0dXMoc291cmNlLCBmcmFtZSwgdGhpcy54clJlZlNwYWNlKTtcbiAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueHJTZXNzaW9uLnJlcXVlc3RBbmltYXRpb25GcmFtZSgodGltZSwgZnJhbWUpID0+IHRoaXMub25YckZyYW1lKHRpbWUsIGZyYW1lKSk7XG4gICAgICAgIHRoaXMub25GcmFtZS5kaXNwYXRjaEV2ZW50KG5ldyBYckZyYW1lRXZlbnQoeyB0aW1lLCBmcmFtZSB9KSk7XG4gICAgfVxuICAgIHVwZGF0ZVZpZXdzKCkge1xuICAgICAgICBpZiAoIXRoaXMueHJWaWV3ZXJQb3NlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2aWV3IG9mIHRoaXMueHJWaWV3ZXJQb3NlLnZpZXdzKSB7XG4gICAgICAgICAgICBpZiAodmlldy5leWUgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMubGVmdFZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmlldy5leWUgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0VmlldyA9IHZpZXc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuZ2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBCaW5kIHRoZSBmcmFtZWJ1ZmZlciB0byB0aGUgYmFzZSBsYXllcidzIGZyYW1lYnVmZmVyXG4gICAgICAgIGNvbnN0IGdsTGF5ZXIgPSB0aGlzLnhyU2Vzc2lvbi5yZW5kZXJTdGF0ZS5iYXNlTGF5ZXI7XG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIGdsTGF5ZXIuZnJhbWVidWZmZXIpO1xuICAgICAgICAvLyBTZXQgdGhlIHJlbGV2YW50IHBvcnRpb24gb2YgY2xpcCBzcGFjZVxuICAgICAgICB0aGlzLmdsLnZpZXdwb3J0KDAsIDAsIGdsTGF5ZXIuZnJhbWVidWZmZXJXaWR0aCwgZ2xMYXllci5mcmFtZWJ1ZmZlckhlaWdodCk7XG4gICAgICAgIC8vIERyYXcgdGhlIHJlY3RhbmdsZSB3ZSB3aWxsIHNob3cgdGhlIHZpZGVvIHN0cmVhbSB0ZXh0dXJlIG9uXG4gICAgICAgIHRoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmdsLlRSSUFOR0xFUyAvKnByaW1pdGl2ZVR5cGUqLywgMCAvKm9mZnNldCovLCA2IC8qY291bnQqLyk7XG4gICAgfVxuICAgIHN0YXRpYyBpc1Nlc3Npb25TdXBwb3J0ZWQobW9kZSkge1xuICAgICAgICBpZiAobG9jYXRpb24ucHJvdG9jb2wgIT09ICdodHRwczonKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnV2ViWFIgcmVxdWlyZXMgaHR0cHMsIGlmIHlvdSB3YW50IFdlYlhSIHVzZSBodHRwcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2aWdhdG9yLnhyKSB7XG4gICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnhyLmlzU2Vzc2lvblN1cHBvcnRlZChtb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWJYUkNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmV4cG9ydCB7IFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIgfSBmcm9tICcuL1dlYlJ0Y1BsYXllci9XZWJSdGNQbGF5ZXJDb250cm9sbGVyJztcbmV4cG9ydCB7IFdlYlhSQ29udHJvbGxlciB9IGZyb20gJy4vV2ViWFIvV2ViWFJDb250cm9sbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29uZmlnL0NvbmZpZyc7XG5leHBvcnQgeyBTZXR0aW5nQmFzZSB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdCYXNlJztcbmV4cG9ydCB7IFNldHRpbmdGbGFnIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ0ZsYWcnO1xuZXhwb3J0IHsgU2V0dGluZ051bWJlciB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdOdW1iZXInO1xuZXhwb3J0IHsgU2V0dGluZ09wdGlvbiB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdPcHRpb24nO1xuZXhwb3J0IHsgU2V0dGluZ1RleHQgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5nVGV4dCc7XG5leHBvcnQgeyBQaXhlbFN0cmVhbWluZyB9IGZyb20gJy4vUGl4ZWxTdHJlYW1pbmcvUGl4ZWxTdHJlYW1pbmcnO1xuZXhwb3J0IHsgQUZLQ29udHJvbGxlciBhcyBBZmtMb2dpYyB9IGZyb20gJy4vQUZLL0FGS0NvbnRyb2xsZXInO1xuZXhwb3J0IHsgTGF0ZW5jeVRlc3RSZXN1bHRzIH0gZnJvbSAnLi9EYXRhQ2hhbm5lbC9MYXRlbmN5VGVzdFJlc3VsdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9EYXRhQ2hhbm5lbC9Jbml0aWFsU2V0dGluZ3MnO1xuZXhwb3J0IHsgQWdncmVnYXRlZFN0YXRzIH0gZnJvbSAnLi9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvQWdncmVnYXRlZFN0YXRzJztcbmV4cG9ydCAqIGZyb20gJy4vVXRpbC9JbnB1dENvb3JkVHJhbnNsYXRvcic7XG5leHBvcnQgeyBNZXNzYWdlRGlyZWN0aW9uIH0gZnJvbSAnLi9VZUluc3RhbmNlTWVzc2FnZS9TdHJlYW1NZXNzYWdlQ29udHJvbGxlcic7XG5leHBvcnQgeyBDYW5kaWRhdGVQYWlyU3RhdHMgfSBmcm9tICcuL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9DYW5kaWRhdGVQYWlyU3RhdHMnO1xuZXhwb3J0IHsgQ2FuZGlkYXRlU3RhdCB9IGZyb20gJy4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0NhbmRpZGF0ZVN0YXQnO1xuZXhwb3J0IHsgRGF0YUNoYW5uZWxTdGF0cyB9IGZyb20gJy4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0RhdGFDaGFubmVsU3RhdHMnO1xuZXhwb3J0IHsgSW5ib3VuZEF1ZGlvU3RhdHMsIEluYm91bmRWaWRlb1N0YXRzIH0gZnJvbSAnLi9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvSW5ib3VuZFJUUFN0YXRzJztcbmV4cG9ydCB7IE91dGJvdW5kUlRQU3RhdHMsIFJlbW90ZU91dGJvdW5kUlRQU3RhdHMgfSBmcm9tICcuL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9PdXRCb3VuZFJUUFN0YXRzJztcbmV4cG9ydCAqIGZyb20gJy4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0xhdGVuY3lDYWxjdWxhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vRGF0YUNoYW5uZWwvRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9VdGlsL0V2ZW50RW1pdHRlcic7XG5leHBvcnQgKiBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBGbGFncywgTG9nZ2VyLCBPcHRpb25QYXJhbWV0ZXJzIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNSc7XG5pbXBvcnQgeyBDb25uZWN0T3ZlcmxheSB9IGZyb20gJy4uL092ZXJsYXkvQ29ubmVjdE92ZXJsYXknO1xuaW1wb3J0IHsgRGlzY29ubmVjdE92ZXJsYXkgfSBmcm9tICcuLi9PdmVybGF5L0Rpc2Nvbm5lY3RPdmVybGF5JztcbmltcG9ydCB7IFBsYXlPdmVybGF5IH0gZnJvbSAnLi4vT3ZlcmxheS9QbGF5T3ZlcmxheSc7XG5pbXBvcnQgeyBJbmZvT3ZlcmxheSB9IGZyb20gJy4uL092ZXJsYXkvSW5mb092ZXJsYXknO1xuaW1wb3J0IHsgRXJyb3JPdmVybGF5IH0gZnJvbSAnLi4vT3ZlcmxheS9FcnJvck92ZXJsYXknO1xuaW1wb3J0IHsgQUZLT3ZlcmxheSB9IGZyb20gJy4uL092ZXJsYXkvQUZLT3ZlcmxheSc7XG5pbXBvcnQgeyBDb250cm9scyB9IGZyb20gJy4uL1VJL0NvbnRyb2xzJztcbmltcG9ydCB7IExhYmVsbGVkQnV0dG9uIH0gZnJvbSAnLi4vVUkvTGFiZWxsZWRCdXR0b24nO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gJy4uL1VJL1NldHRpbmdzUGFuZWwnO1xuaW1wb3J0IHsgU3RhdHNQYW5lbCB9IGZyb20gJy4uL1VJL1N0YXRzUGFuZWwnO1xuaW1wb3J0IHsgVmlkZW9RcEluZGljYXRvciB9IGZyb20gJy4uL1VJL1ZpZGVvUXBJbmRpY2F0b3InO1xuaW1wb3J0IHsgQ29uZmlnVUkgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnVUknO1xuaW1wb3J0IHsgRWRpdFRleHRNb2RhbCB9IGZyb20gJy4uL1VJL0VkaXRUZXh0TW9kYWwnO1xuaW1wb3J0IHsgVUlFbGVtZW50Q3JlYXRpb25Nb2RlLCBpc1BhbmVsRW5hYmxlZCwgRXh0cmFGbGFncyB9IGZyb20gJy4uL1VJL1VJQ29uZmlndXJhdGlvblR5cGVzJztcbmltcG9ydCB7IEZ1bGxTY3JlZW5JY29uRXh0ZXJuYWwgfSBmcm9tICcuLi9VSS9GdWxsc2NyZWVuSWNvbic7XG4vKipcbiAqIEFuIEFwcGxpY2F0aW9uIGlzIGEgY29tYmluYXRpb24gb2YgVUkgZWxlbWVudHMgdG8gZGlzcGxheSBhbmQgbWFuYWdlIGEgV2ViUlRDIFBpeGVsIFN0cmVhbWluZ1xuICogY29ubmVjdGlvbi4gSXQgaW5jbHVkZXMgZmVhdHVyZXMgZm9yIGNvbnRyb2xsaW5nIGEgc3RyZWFtIHdpdGggbW91c2UgYW5kIGtleWJvYXJkLFxuICogbWFuYWdpbmcgY29ubmVjdGlvbiBlbmRwb2ludHMsIGFzIHdlbGwgYXMgZGlzcGxheWluZyBzdGF0cyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBJbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLmVkaXRUZXh0TW9kYWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBvcHRpb25zLnN0cmVhbTtcbiAgICAgICAgLy8gRXhwbGljaXRseSBjcmVhdGUgdWkgZmVhdHVyZXMgbm93IHNvIGNyZWF0aW9uIHRpbWUgaXMga25vd25cbiAgICAgICAgdGhpcy5fdWlGZWF0dXJlRWxlbWVudCA9IHRoaXMuY3JlYXRlVUlGZWF0dXJlc0VsZW1lbnQoKTtcbiAgICAgICAgLy8gRXhwbGljaXRseSBjcmVhdGUgcm9vdCBlbGVtZW50IG5vdyBzbyBjcmVhdGlvbiB0aW1lIGlzIGtub3duXG4gICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gdGhpcy5jcmVhdGVSb290RWxlbWVudCh0aGlzLnN0cmVhbSwgdGhpcy5fdWlGZWF0dXJlRWxlbWVudCk7XG4gICAgICAgIHRoaXMub25Db2xvck1vZGVDaGFuZ2VkID0gb3B0aW9ucy5vbkNvbG9yTW9kZUNoYW5nZWQ7XG4gICAgICAgIHRoaXMuY29uZmlnVUkgPSBuZXcgQ29uZmlnVUkodGhpcy5zdHJlYW0uY29uZmlnKTtcbiAgICAgICAgdGhpcy5jcmVhdGVPdmVybGF5cygpO1xuICAgICAgICBpZiAoaXNQYW5lbEVuYWJsZWQob3B0aW9ucy5zdGF0c1BhbmVsQ29uZmlnKSkge1xuICAgICAgICAgICAgLy8gQWRkIHN0YXRzIHBhbmVsXG4gICAgICAgICAgICB0aGlzLnN0YXRzUGFuZWwgPSBuZXcgU3RhdHNQYW5lbChvcHRpb25zLnN0YXRzUGFuZWxDb25maWcpO1xuICAgICAgICAgICAgdGhpcy51aUZlYXR1cmVzRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzUGFuZWwucm9vdEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1BhbmVsRW5hYmxlZChvcHRpb25zLnNldHRpbmdzUGFuZWxDb25maWcpKSB7XG4gICAgICAgICAgICAvLyBBZGQgc2V0dGluZ3MgcGFuZWxcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbCA9IG5ldyBTZXR0aW5nc1BhbmVsKCk7XG4gICAgICAgICAgICB0aGlzLnVpRmVhdHVyZXNFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NQYW5lbC5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZVNldHRpbmdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zLnZpZGVvUXBJbmRpY2F0b3JDb25maWcgfHwgIW9wdGlvbnMudmlkZW9RcEluZGljYXRvckNvbmZpZy5kaXNhYmxlSW5kaWNhdG9yKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIHZpZGVvIHN0cmVhbSBRUCBpbmRpY2F0b3JcbiAgICAgICAgICAgIHRoaXMudmlkZW9RcEluZGljYXRvciA9IG5ldyBWaWRlb1FwSW5kaWNhdG9yKG9wdGlvbnMudmlkZW9RcEluZGljYXRvckNvbmZpZyk7XG4gICAgICAgICAgICB0aGlzLnVpRmVhdHVyZXNFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmlkZW9RcEluZGljYXRvci5yb290RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVCdXR0b25zKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFja3MoKTtcbiAgICAgICAgdGhpcy5zaG93Q29ubmVjdE9yQXV0b0Nvbm5lY3RPdmVybGF5cygpO1xuICAgICAgICB0aGlzLnNldENvbG9yTW9kZSh0aGlzLmNvbmZpZ1VJLmlzQ3VzdG9tRmxhZ0VuYWJsZWQoRXh0cmFGbGFncy5MaWdodE1vZGUpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuSGlkZVVJLCAoaXNFbmFibGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl91aUZlYXR1cmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBpc0VuYWJsZWQgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnN0cmVhbS5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5IaWRlVUkpKSB7XG4gICAgICAgICAgICB0aGlzLl91aUZlYXR1cmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVPdmVybGF5cygpIHtcbiAgICAgICAgLy8gYnVpbGQgYWxsIG9mIHRoZSBvdmVybGF5c1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPdmVybGF5ID0gbmV3IERpc2Nvbm5lY3RPdmVybGF5KHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudCk7XG4gICAgICAgIHRoaXMuY29ubmVjdE92ZXJsYXkgPSBuZXcgQ29ubmVjdE92ZXJsYXkodGhpcy5zdHJlYW0udmlkZW9FbGVtZW50UGFyZW50KTtcbiAgICAgICAgdGhpcy5wbGF5T3ZlcmxheSA9IG5ldyBQbGF5T3ZlcmxheSh0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQpO1xuICAgICAgICB0aGlzLmluZm9PdmVybGF5ID0gbmV3IEluZm9PdmVybGF5KHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudCk7XG4gICAgICAgIHRoaXMuZXJyb3JPdmVybGF5ID0gbmV3IEVycm9yT3ZlcmxheSh0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQpO1xuICAgICAgICB0aGlzLmFma092ZXJsYXkgPSBuZXcgQUZLT3ZlcmxheSh0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQpO1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPdmVybGF5Lm9uQWN0aW9uKCgpID0+IHRoaXMuc3RyZWFtLnJlY29ubmVjdCgpKTtcbiAgICAgICAgLy8gQnVpbGQgdGhlIHdlYlJ0YyBjb25uZWN0IG92ZXJsYXkgRXZlbnQgTGlzdGVuZXIgYW5kIHNob3cgdGhlIGNvbm5lY3Qgb3ZlcmxheVxuICAgICAgICB0aGlzLmNvbm5lY3RPdmVybGF5Lm9uQWN0aW9uKCgpID0+IHRoaXMuc3RyZWFtLmNvbm5lY3QoKSk7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgcGxheSBvdmVybGF5cyBhY3Rpb25cbiAgICAgICAgdGhpcy5wbGF5T3ZlcmxheS5vbkFjdGlvbigoKSA9PiB0aGlzLnN0cmVhbS5wbGF5KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgYnV0dG9uIGNsaWNrIGZ1bmN0aW9ucyBhbmQgYnV0dG9uIGZ1bmN0aW9uYWxpdHlcbiAgICAgKi9cbiAgICBjcmVhdGVCdXR0b25zKCkge1xuICAgICAgICBjb25zdCBpc0lwaG9uZSA9IC9pUGhvbmUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICAgIGNvbnN0IGlzSXBhZCA9IC9pUGFkLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8XG4gICAgICAgICAgICAoL01hY2ludG9zaC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAnb250b3VjaGVuZCcgaW4gZG9jdW1lbnQpO1xuICAgICAgICBjb25zdCBpc1NhZmFyaSA9IG5hdmlnYXRvci52ZW5kb3IgJiZcbiAgICAgICAgICAgIG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZignQXBwbGUnKSA+IC0xICYmXG4gICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50ICYmXG4gICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0NyaU9TJykgPT0gLTEgJiZcbiAgICAgICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRnhpT1MnKSA9PSAtMTtcbiAgICAgICAgLy8gSW4gc29tZSBjYXNlcyB3ZSB3YW50IHRvIGRpc2FibGUgZnVsbHNjcmVlbiBidXR0b24gaWYgaXQgaXMgbm90IGV4cGxpY2l0bHkgcmVxdWVzdGVkOlxuICAgICAgICAvLyBJUGhvbmUgZG9lcyBub3Qgc3VwcG9ydCBmdWxsc2NyZWVuIEFQSSBhcyBhdCAyOHRoIEp1bHkgMjAyNCAoc2VlOiBodHRwczovL2Nhbml1c2UuY29tL2Z1bGxzY3JlZW4pIHNvIGlmXG4gICAgICAgIC8vIHdlIGFyZSBvbiBJUGhvbmUgYW5kIHVzZXIgaGFzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSBjb25maWd1cmVkIFVJIGNvbmZpZyBmb3JcbiAgICAgICAgLy8gZnVsbHNjcmVlbiBidXR0b24gdGhlbiB3ZSBzaG91bGQgZGlzYWJsZSB0aGlzIGJ1dHRvbiBhcyBpdCBkb2Vzbid0IHdvcmsuXG4gICAgICAgIC8vIEFkZGl0aW9uYWxseSBpUGFkIG9uIG5vbi1TYWZhcmkgYnJvd3NlcnMgZG9lc24ndCByZWFsbHkgYWxsb3cgdG91Y2ggaW5wdXRzIGFuZCBmdWxsc2NyZWVuIHZpZGVvIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICAgIC8vIElmIHlvdSBkbyB0aGlzIHRoZSB2aWRlbyBnZXRzIGRyYWdnZWQgb2ZmIGJhY2sgdG8gbm9ybWFsIG5vbi1mdWxsc2NyZWVuIHZpZGVvIGFuZCB0aGVuIHRoZSB2aWRlbyBpcyBwYXVzZWQuXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL0VwaWNHYW1lc0V4dC9QaXhlbFN0cmVhbWluZ0luZnJhc3RydWN0dXJlL2lzc3Vlcy8yMTlcbiAgICAgICAgY29uc3QgZGlzYWJsZUZ1bGxzY3JlZW5CdXR0b24gPSBpc0lwaG9uZSB8fCAoIWlzU2FmYXJpICYmIGlzSXBhZCk7XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmZ1bGxTY3JlZW5Db250cm9sc0NvbmZpZyA9PT0gdW5kZWZpbmVkICYmIGRpc2FibGVGdWxsc2NyZWVuQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmZ1bGxTY3JlZW5Db250cm9sc0NvbmZpZyA9IHsgY3JlYXRpb25Nb2RlOiBVSUVsZW1lbnRDcmVhdGlvbk1vZGUuRGlzYWJsZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzVUlDb25maWcgPSB7XG4gICAgICAgICAgICBzdGF0c0J1dHRvblR5cGU6IHRoaXMuX29wdGlvbnMuc3RhdHNQYW5lbENvbmZpZ1xuICAgICAgICAgICAgICAgID8gdGhpcy5fb3B0aW9ucy5zdGF0c1BhbmVsQ29uZmlnLnZpc2liaWxpdHlCdXR0b25Db25maWdcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNldHRpbmdzQnV0dG9uVHlwZTogdGhpcy5fb3B0aW9ucy5zZXR0aW5nc1BhbmVsQ29uZmlnXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9vcHRpb25zLnNldHRpbmdzUGFuZWxDb25maWcudmlzaWJpbGl0eUJ1dHRvbkNvbmZpZ1xuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZnVsbHNjcmVlbkJ1dHRvblR5cGU6IHRoaXMuX29wdGlvbnMuZnVsbFNjcmVlbkNvbnRyb2xzQ29uZmlnLFxuICAgICAgICAgICAgeHJJY29uVHlwZTogdGhpcy5fb3B0aW9ucy54ckNvbnRyb2xzQ29uZmlnLFxuICAgICAgICAgICAgaGlkZUNvbnRyb2xzSW5GdWxsc2NyZWVuOiB0aGlzLl9vcHRpb25zLmhpZGVDb250cm9sc0luRnVsbHNjcmVlblxuICAgICAgICB9O1xuICAgICAgICAvLyBTZXR1cCBjb250cm9sc1xuICAgICAgICBjb25zdCBjb250cm9scyA9IG5ldyBDb250cm9scyhjb250cm9sc1VJQ29uZmlnKTtcbiAgICAgICAgdGhpcy51aUZlYXR1cmVzRWxlbWVudC5hcHBlbmRDaGlsZChjb250cm9scy5yb290RWxlbWVudCk7XG4gICAgICAgIC8vIFdoZW4gd2UgZnVsbHNjcmVlbiB3ZSB3YW50IHRoaXMgZWxlbWVudCB0byBiZSB0aGUgcm9vdFxuICAgICAgICBjb25zdCBmdWxsU2NyZWVuQnV0dG9uID0gXG4gICAgICAgIC8vIERlcGVuZGluZyBvbiBpZiB3ZSdyZSBjcmVhdGluZyBhbiBpbnRlcm5hbCBidXR0b24sIG9yIHVzaW5nIGFuIGV4dGVybmFsIG9uZVxuICAgICAgICAhIXRoaXMuX29wdGlvbnMuZnVsbFNjcmVlbkNvbnRyb2xzQ29uZmlnICYmXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmZ1bGxTY3JlZW5Db250cm9sc0NvbmZpZy5jcmVhdGlvbk1vZGUgPT09IFVJRWxlbWVudENyZWF0aW9uTW9kZS5Vc2VDdXN0b21FbGVtZW50XG4gICAgICAgICAgICA/IC8vIEVpdGhlciBjcmVhdGUgYSBmdWxsc2NyZWVuIGNsYXNzIGJhc2VkIG9uIHRoZSBleHRlcm5hbCBidXR0b25cbiAgICAgICAgICAgICAgICBuZXcgRnVsbFNjcmVlbkljb25FeHRlcm5hbCh0aGlzLl9vcHRpb25zLmZ1bGxTY3JlZW5Db250cm9sc0NvbmZpZy5jdXN0b21FbGVtZW50KVxuICAgICAgICAgICAgOiAvLyBPciB1c2UgdGhlIG9uZSBjcmVhdGVkIGJ5IHRoZSBDb250cm9scyBpbml0aWFsaXplciBlYXJsaWVyXG4gICAgICAgICAgICAgICAgY29udHJvbHMuZnVsbHNjcmVlbkljb247XG4gICAgICAgIGlmIChmdWxsU2NyZWVuQnV0dG9uKSB7XG4gICAgICAgICAgICBmdWxsU2NyZWVuQnV0dG9uLmZ1bGxzY3JlZW5FbGVtZW50ID0gL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudClcbiAgICAgICAgICAgICAgICA/IHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKVswXVxuICAgICAgICAgICAgICAgIDogdGhpcy5yb290RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGQgc2V0dGluZ3MgYnV0dG9uIHRvIGNvbnRyb2xzXG4gICAgICAgIGNvbnN0IHNldHRpbmdzQnV0dG9uID0gY29udHJvbHMuc2V0dGluZ3NJY29uXG4gICAgICAgICAgICA/IGNvbnRyb2xzLnNldHRpbmdzSWNvbi5yb290RWxlbWVudFxuICAgICAgICAgICAgOiB0aGlzLl9vcHRpb25zLnNldHRpbmdzUGFuZWxDb25maWcudmlzaWJpbGl0eUJ1dHRvbkNvbmZpZy5jdXN0b21FbGVtZW50O1xuICAgICAgICBpZiAoc2V0dGluZ3NCdXR0b24pXG4gICAgICAgICAgICBzZXR0aW5nc0J1dHRvbi5vbmNsaWNrID0gKCkgPT4gdGhpcy5zZXR0aW5nc0NsaWNrZWQoKTtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NQYW5lbClcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbC5zZXR0aW5nc0Nsb3NlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB0aGlzLnNldHRpbmdzQ2xpY2tlZCgpO1xuICAgICAgICAvLyBBZGQgV2ViWFIgYnV0dG9uIHRvIGNvbnRyb2xzXG4gICAgICAgIGNvbnN0IHhyQnV0dG9uID0gY29udHJvbHMueHJJY29uXG4gICAgICAgICAgICA/IGNvbnRyb2xzLnhySWNvbi5yb290RWxlbWVudFxuICAgICAgICAgICAgOiB0aGlzLl9vcHRpb25zLnhyQ29udHJvbHNDb25maWcuY3JlYXRpb25Nb2RlID09PSBVSUVsZW1lbnRDcmVhdGlvbk1vZGUuVXNlQ3VzdG9tRWxlbWVudFxuICAgICAgICAgICAgICAgID8gdGhpcy5fb3B0aW9ucy54ckNvbnRyb2xzQ29uZmlnLmN1c3RvbUVsZW1lbnRcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHhyQnV0dG9uKVxuICAgICAgICAgICAgeHJCdXR0b24ub25jbGljayA9ICgpID0+IHRoaXMuc3RyZWFtLnRvZ2dsZVhSKCk7XG4gICAgICAgIC8vIHNldHVwIHRoZSBzdGF0cy9pbmZvIGJ1dHRvblxuICAgICAgICBjb25zdCBzdGF0c0J1dHRvbiA9IGNvbnRyb2xzLnN0YXRzSWNvblxuICAgICAgICAgICAgPyBjb250cm9scy5zdGF0c0ljb24ucm9vdEVsZW1lbnRcbiAgICAgICAgICAgIDogdGhpcy5fb3B0aW9ucy5zdGF0c1BhbmVsQ29uZmlnLnZpc2liaWxpdHlCdXR0b25Db25maWcuY3VzdG9tRWxlbWVudDtcbiAgICAgICAgaWYgKHN0YXRzQnV0dG9uKVxuICAgICAgICAgICAgc3RhdHNCdXR0b24ub25jbGljayA9ICgpID0+IHRoaXMuc3RhdHNDbGlja2VkKCk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRzUGFuZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHNQYW5lbC5zdGF0c0Nsb3NlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB0aGlzLnN0YXRzQ2xpY2tlZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCBjb21tYW5kIGJ1dHRvbnMgKGlmIHdlIGhhdmUgc29tZXdoZXJlIHRvIGFkZCB0aGVtIHRvKVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nc1BhbmVsKSB7XG4gICAgICAgICAgICAvLyBBZGQgYnV0dG9uIGZvciB0b2dnbGUgZnBzXG4gICAgICAgICAgICBjb25zdCBzaG93RlBTQnV0dG9uID0gbmV3IExhYmVsbGVkQnV0dG9uKCdTaG93IEZQUycsICdUb2dnbGUnKTtcbiAgICAgICAgICAgIHNob3dGUFNCdXR0b24uYWRkT25DbGlja0xpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbS5yZXF1ZXN0U2hvd0ZwcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBZGQgYnV0dG9uIGZvciByZXN0YXJ0IHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgcmVzdGFydFN0cmVhbUJ1dHRvbiA9IG5ldyBMYWJlbGxlZEJ1dHRvbignUmVzdGFydCBTdHJlYW0nLCAnUmVzdGFydCcpO1xuICAgICAgICAgICAgcmVzdGFydFN0cmVhbUJ1dHRvbi5hZGRPbkNsaWNrTGlzdGVuZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtLnJlY29ubmVjdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBZGQgYnV0dG9uIGZvciByZXF1ZXN0IGtleWZyYW1lXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0S2V5ZnJhbWVCdXR0b24gPSBuZXcgTGFiZWxsZWRCdXR0b24oJ1JlcXVlc3Qga2V5ZnJhbWUnLCAnUmVxdWVzdCcpO1xuICAgICAgICAgICAgcmVxdWVzdEtleWZyYW1lQnV0dG9uLmFkZE9uQ2xpY2tMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0ucmVxdWVzdElmcmFtZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBjb21tYW5kc1NlY3Rpb25FbGVtID0gdGhpcy5jb25maWdVSS5idWlsZFNlY3Rpb25XaXRoSGVhZGluZyh0aGlzLnNldHRpbmdzUGFuZWwuc2V0dGluZ3NDb250ZW50RWxlbWVudCwgJ0NvbW1hbmRzJyk7XG4gICAgICAgICAgICBjb21tYW5kc1NlY3Rpb25FbGVtLmFwcGVuZENoaWxkKHNob3dGUFNCdXR0b24ucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgY29tbWFuZHNTZWN0aW9uRWxlbS5hcHBlbmRDaGlsZChyZXF1ZXN0S2V5ZnJhbWVCdXR0b24ucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgY29tbWFuZHNTZWN0aW9uRWxlbS5hcHBlbmRDaGlsZChyZXN0YXJ0U3RyZWFtQnV0dG9uLnJvb3RFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhlIHNldHRpbmdzIHdpdGggb24gY2hhbmdlIGxpc3RlbmVycyBhbmQgYW55IGFkZGl0aW9uYWwgcGVyIGV4cGVyaWVuY2Ugc2V0dGluZ3MuXG4gICAgICovXG4gICAgY29uZmlndXJlU2V0dGluZ3MoKSB7XG4gICAgICAgIC8vIFRoaXMgYnVpbGRzIGFsbCB0aGUgc2V0dGluZ3Mgc2VjdGlvbnMgYW5kIGZsYWdzIHVuZGVyIHRoaXMgYHNldHRpbmdzQ29udGVudGAgZWxlbWVudC5cbiAgICAgICAgdGhpcy5jb25maWdVSS5wb3B1bGF0ZVNldHRpbmdzRWxlbWVudCh0aGlzLnNldHRpbmdzUGFuZWwuc2V0dGluZ3NDb250ZW50RWxlbWVudCwgdGhpcy5fb3B0aW9ucy5zZXR0aW5nc1BhbmVsQ29uZmlnKTtcbiAgICAgICAgdGhpcy5jb25maWdVSS5hZGRDdXN0b21GbGFnT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEV4dHJhRmxhZ3MuTGlnaHRNb2RlLCAoaXNMaWdodE1vZGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnVUkuc2V0Q3VzdG9tRmxhZ0xhYmVsKEV4dHJhRmxhZ3MuTGlnaHRNb2RlLCBgQ29sb3IgU2NoZW1lOiAke2lzTGlnaHRNb2RlID8gJ0xpZ2h0JyA6ICdEYXJrJ30gTW9kZWApO1xuICAgICAgICAgICAgdGhpcy5zZXRDb2xvck1vZGUoaXNMaWdodE1vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVnaXN0ZXJDYWxsYmFja3MoKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ2Fma1dhcm5pbmdBY3RpdmF0ZScsICh7IGRhdGE6IHsgY291bnREb3duLCBkaXNtaXNzQWZrIH0gfSkgPT4gdGhpcy5zaG93QWZrT3ZlcmxheShjb3VudERvd24sIGRpc21pc3NBZmspKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignYWZrV2FybmluZ1VwZGF0ZScsICh7IGRhdGE6IHsgY291bnREb3duIH0gfSkgPT4gdGhpcy5hZmtPdmVybGF5LnVwZGF0ZUNvdW50ZG93bihjb3VudERvd24pKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignYWZrV2FybmluZ0RlYWN0aXZhdGUnLCAoKSA9PiB0aGlzLmFma092ZXJsYXkuaGlkZSgpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignYWZrVGltZWRPdXQnLCAoKSA9PiB0aGlzLmFma092ZXJsYXkuaGlkZSgpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcigndmlkZW9FbmNvZGVyQXZnUVAnLCAoeyBkYXRhOiB7IGF2Z1FQIH0gfSkgPT4gdGhpcy5vblZpZGVvRW5jb2RlckF2Z1FQKGF2Z1FQKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y1NkcCcsICgpID0+IHRoaXMub25XZWJSdGNTZHAoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0F1dG9Db25uZWN0JywgKCkgPT4gdGhpcy5vbldlYlJ0Y0F1dG9Db25uZWN0KCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCd3ZWJSdGNDb25uZWN0aW5nJywgKCkgPT4gdGhpcy5vbldlYlJ0Y0Nvbm5lY3RpbmcoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0Nvbm5lY3RlZCcsICgpID0+IHRoaXMub25XZWJSdGNDb25uZWN0ZWQoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0ZhaWxlZCcsICgpID0+IHRoaXMub25XZWJSdGNGYWlsZWQoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0Rpc2Nvbm5lY3RlZCcsICh7IGRhdGE6IHsgZXZlbnRTdHJpbmcsIGFsbG93Q2xpY2tUb1JlY29ubmVjdCB9IH0pID0+IHRoaXMub25EaXNjb25uZWN0KGV2ZW50U3RyaW5nLCBhbGxvd0NsaWNrVG9SZWNvbm5lY3QpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcigndmlkZW9Jbml0aWFsaXplZCcsICgpID0+IHRoaXMub25WaWRlb0luaXRpYWxpemVkKCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzdHJlYW1Mb2FkaW5nJywgKCkgPT4gdGhpcy5vblN0cmVhbUxvYWRpbmcoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlTdHJlYW1FcnJvcicsICh7IGRhdGE6IHsgbWVzc2FnZSB9IH0pID0+IHRoaXMub25QbGF5U3RyZWFtRXJyb3IobWVzc2FnZSkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdwbGF5U3RyZWFtJywgKCkgPT4gdGhpcy5vblBsYXlTdHJlYW0oKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlTdHJlYW1SZWplY3RlZCcsICh7IGRhdGE6IHsgcmVhc29uIH0gfSkgPT4gdGhpcy5vblBsYXlTdHJlYW1SZWplY3RlZChyZWFzb24pKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignbG9hZEZyZWV6ZUZyYW1lJywgKHsgZGF0YTogeyBzaG91bGRTaG93UGxheU92ZXJsYXkgfSB9KSA9PiB0aGlzLm9uTG9hZEZyZWV6ZUZyYW1lKHNob3VsZFNob3dQbGF5T3ZlcmxheSkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzdGF0c1JlY2VpdmVkJywgKHsgZGF0YTogeyBhZ2dyZWdhdGVkU3RhdHMgfSB9KSA9PiB0aGlzLm9uU3RhdHNSZWNlaXZlZChhZ2dyZWdhdGVkU3RhdHMpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignbGF0ZW5jeUNhbGN1bGF0ZWQnLCAoeyBkYXRhOiB7IGxhdGVuY3lJbmZvIH0gfSkgPT4gdGhpcy5vbkxhdGVuY3lVcGRhdGUobGF0ZW5jeUluZm8pKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignbGF0ZW5jeVRlc3RSZXN1bHQnLCAoeyBkYXRhOiB7IGxhdGVuY3lUaW1pbmdzIH0gfSkgPT4gdGhpcy5vbkxhdGVuY3lUZXN0UmVzdWx0cyhsYXRlbmN5VGltaW5ncykpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0JywgKHsgZGF0YTogeyByZXN1bHQgfSB9KSA9PiB0aGlzLm9uRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdHMocmVzdWx0KSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3N0cmVhbWVyTGlzdE1lc3NhZ2UnLCAoeyBkYXRhOiB7IG1lc3NhZ2VTdHJlYW1lckxpc3QsIGF1dG9TZWxlY3RlZFN0cmVhbWVySWQsIHdhbnRlZFN0cmVhbWVySWQgfSB9KSA9PiB0aGlzLmhhbmRsZVN0cmVhbWVyTGlzdE1lc3NhZ2UobWVzc2FnZVN0cmVhbWVyTGlzdCwgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCwgd2FudGVkU3RyZWFtZXJJZCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzdWJzY3JpYmVGYWlsZWQnLCAoeyBkYXRhOiB7IG1lc3NhZ2UgfSB9KSA9PiB0aGlzLmhhbmRsZVN1YnNjcmliZUZhaWxlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzZXR0aW5nc0NoYW5nZWQnLCAoZXZlbnQpID0+IHRoaXMub25TZXR0aW5nc0NoYW5nZWQoZXZlbnQpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcigncGxheWVyQ291bnQnLCAoeyBkYXRhOiB7IGNvdW50IH0gfSkgPT4gdGhpcy5vblBsYXllckNvdW50KGNvdW50KSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y1RDUFJlbGF5RGV0ZWN0ZWQnLCAoKSA9PiBMb2dnZXIuV2FybmluZyhgU3RyZWFtIHF1YWlsdHkgZGVncmFkZWQgZHVlIHRvIG5ldHdvcmsgZW52aXJvbWVudCwgc3RyZWFtIGlzIHJlbGF5ZWQgb3ZlciBUQ1AuYCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzaG93T25TY3JlZW5LZXlib2FyZCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gT25seSBzaG93IHRoZSBlZGl0IHRleHQgbW9kYWwgaWYgdGhlIGZsYWcgaXMgZW5hYmxlZFxuICAgICAgICAgICAgaWYgKCF0aGlzLnN0cmVhbS5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Vc2VNb2RhbEZvclRleHRJbnB1dCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBldnREYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGlmIChldnREYXRhLnNob3dPblNjcmVlbktleWJvYXJkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RWRpdFRleHRNb2RhbChldnREYXRhLmNvbnRlbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvb3RFbGVtZW50IG9mIHRoZSBhcHBsaWNhdGlvbiwgdmlkZW8gc3RyZWFtIGFuZCBhbGwgVUkgYXJlIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gdGhpcy5jcmVhdGVSb290RWxlbWVudCh0aGlzLnN0cmVhbSwgdGhpcy51aUZlYXR1cmVzRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSBQaXhlbCBTdHJlYW1pbmcgVUkuXG4gICAgICogTm90ZTogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgUGl4ZWwgU3RyZWFtaW5nIG9iamVjdCBpcyBjcmVhdGVkLlxuICAgICAqIEBwYXJhbSBwaXhlbHN0cmVhbWluZyAtIFRoZSBQaXhlbCBTdHJlYW1pbmcgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB1aUZlYXR1cmVzRWxlbSAtIFRoZSBlbGVtZW50IGhvbGRpbmcgYWxsIHRoZSBjdXN0b20gVUkgZmVhdHVyZXMuXG4gICAgICogQHJldHVybnMgQSBkaXYgd2l0aCB0aGUgaWQgI3BsYXllclVJIHBvcHVsYXRlZCB3aXRoIHZpZGVvRWxlbWVudFBhcmVudCBhbmQgdWlGZWF0dXJlRWxlbWVudC5cbiAgICAgKi9cbiAgICBjcmVhdGVSb290RWxlbWVudChwaXhlbHN0cmVhbWluZywgdWlGZWF0dXJlc0VsZW0pIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbGVtLmlkID0gJ3BsYXllclVJJztcbiAgICAgICAgZWxlbS5jbGFzc0xpc3QuYWRkKCdub3NlbGVjdCcpO1xuICAgICAgICBpZiAocGl4ZWxzdHJlYW1pbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgY3JlYXRlIHJvb3QgZWxlbWVudCBwcm9wZXJseSAtIHBpeGVsc3RyZWFtaW5nIG9iamVjdCB3YXMgdW5kZWZpbmVkLiBBcmUgeW91IGNhbGxpbmcgdGhpcyB0b28gZWFybHk/Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBpeGVsc3RyZWFtaW5nLnZpZGVvRWxlbWVudFBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBjcmVhdGUgcm9vdCBlbGVtZW50IHByb3Blcmx5IC0gdmlkZW9FbGVtZW50UGFyZW50IG9iamVjdCB3YXMgdW5kZWZpbmVkLiBBcmUgeW91IGNhbGxpbmcgdGhpcyB0b28gZWFybHk/Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVpRmVhdHVyZXNFbGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGNyZWF0ZSByb290IGVsZW1lbnQgcHJvcGVybHkgLSB1aUZlYXR1cmVzRWxlbWVudCBvYmplY3Qgd2FzIHVuZGVmaW5lZC4gQXJlIHlvdSBjYWxsaW5nIHRoaXMgdG9vIGVhcmx5PycpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQocGl4ZWxzdHJlYW1pbmcudmlkZW9FbGVtZW50UGFyZW50KTtcbiAgICAgICAgZWxlbS5hcHBlbmRDaGlsZCh1aUZlYXR1cmVzRWxlbSk7XG4gICAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgYWxsIHRoZSBVSSBmZWF0dXJlcywgbGlrZSB0aGUgc3RhdHMgYW5kIHNldHRpbmdzIHBhbmVscy5cbiAgICAgKi9cbiAgICBnZXQgdWlGZWF0dXJlc0VsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdWlGZWF0dXJlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fdWlGZWF0dXJlRWxlbWVudCA9IHRoaXMuY3JlYXRlVUlGZWF0dXJlc0VsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdWlGZWF0dXJlRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgVUkgZmVhdHVyZXMgZWxlbWVudCBmb3IgaG9sZGluZyBhbGwgdGhlIGN1c3RvbSBVSSBmZWF0dXJlcy5cbiAgICAgKiBAcmV0dXJucyBBIGRpdiB3aXRoIHRoZSBpZCAjdWlGZWF0dXJlcy5cbiAgICAgKi9cbiAgICBjcmVhdGVVSUZlYXR1cmVzRWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbGVtLmlkID0gJ3VpRmVhdHVyZXMnO1xuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIGRpc2Nvbm5lY3Qgb3ZlcmxheVxuICAgICAqIEBwYXJhbSB1cGRhdGVUZXh0IC0gdGhlIHRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIHNob3dEaXNjb25uZWN0T3ZlcmxheSh1cGRhdGVUZXh0KSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgICAgIHRoaXMudXBkYXRlRGlzY29ubmVjdE92ZXJsYXkodXBkYXRlVGV4dCk7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdE92ZXJsYXkuc2hvdygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5ID0gdGhpcy5kaXNjb25uZWN0T3ZlcmxheTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBkaXNjb25uZWN0IG92ZXJsYXlzIHNwYW4gdGV4dFxuICAgICAqIEBwYXJhbSB1cGRhdGVUZXh0IC0gdGhlIG5ldyBjb3VudGRvd24gbnVtYmVyXG4gICAgICovXG4gICAgdXBkYXRlRGlzY29ubmVjdE92ZXJsYXkodXBkYXRlVGV4dCkge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPdmVybGF5LnVwZGF0ZSh1cGRhdGVUZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBkaXNjb25uZWN0IG92ZXJsYXlzIGFjdGlvblxuICAgICAqL1xuICAgIG9uRGlzY29ubmVjdGlvbkFjdGlvbigpIHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0T3ZlcmxheS5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWRlcyB0aGUgY3VycmVudCBvdmVybGF5XG4gICAgICovXG4gICAgaGlkZUN1cnJlbnRPdmVybGF5KCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50T3ZlcmxheSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5LmhpZGUoKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3dzIHRoZSBjb25uZWN0IG92ZXJsYXlcbiAgICAgKi9cbiAgICBzaG93Q29ubmVjdE92ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgICAgIHRoaXMuY29ubmVjdE92ZXJsYXkuc2hvdygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5ID0gdGhpcy5jb25uZWN0T3ZlcmxheTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIHBsYXkgb3ZlcmxheVxuICAgICAqL1xuICAgIHNob3dQbGF5T3ZlcmxheSgpIHtcbiAgICAgICAgdGhpcy5oaWRlQ3VycmVudE92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5wbGF5T3ZlcmxheS5zaG93KCk7XG4gICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSB0aGlzLnBsYXlPdmVybGF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgdGV4dCBvdmVybGF5XG4gICAgICogQHBhcmFtIHRleHQgLSB0aGUgdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIG92ZXJsYXlcbiAgICAgKi9cbiAgICBzaG93VGV4dE92ZXJsYXkodGV4dCkge1xuICAgICAgICB0aGlzLmhpZGVDdXJyZW50T3ZlcmxheSgpO1xuICAgICAgICB0aGlzLmluZm9PdmVybGF5LnVwZGF0ZSh0ZXh0KTtcbiAgICAgICAgdGhpcy5pbmZvT3ZlcmxheS5zaG93KCk7XG4gICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSB0aGlzLmluZm9PdmVybGF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgZXJyb3Igb3ZlcmxheVxuICAgICAqIEBwYXJhbSB0ZXh0IC0gdGhlIHRleHQgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBvdmVybGF5XG4gICAgICovXG4gICAgc2hvd0Vycm9yT3ZlcmxheSh0ZXh0KSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgICAgIHRoaXMuZXJyb3JPdmVybGF5LnVwZGF0ZSh0ZXh0KTtcbiAgICAgICAgdGhpcy5lcnJvck92ZXJsYXkuc2hvdygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5ID0gdGhpcy5lcnJvck92ZXJsYXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSBzZXR0aW5ncyBwYW5lbCBpZiBjbGlja2VkXG4gICAgICovXG4gICAgc2V0dGluZ3NDbGlja2VkKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuc3RhdHNQYW5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsLnRvZ2dsZVZpc2liaWxpdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3Mgb3IgaGlkZXMgdGhlIHN0YXRzIHBhbmVsIGlmIGNsaWNrZWRcbiAgICAgKi9cbiAgICBzdGF0c0NsaWNrZWQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5zZXR0aW5nc1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZSgpO1xuICAgICAgICB0aGlzLnN0YXRzUGFuZWwudG9nZ2xlVmlzaWJpbGl0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZXMgdGhlIGNvbm5lY3Qgb3ZlcmxheXMgYWN0aW9uXG4gICAgICovXG4gICAgb25Db25uZWN0QWN0aW9uKCkge1xuICAgICAgICB0aGlzLmNvbm5lY3RPdmVybGF5LmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgcGxheSBvdmVybGF5cyBhY3Rpb25cbiAgICAgKi9cbiAgICBvblBsYXlBY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucGxheU92ZXJsYXkuYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIGFmayBvdmVybGF5XG4gICAgICogQHBhcmFtIGNvdW50RG93biAtIHRoZSBjb3VudGRvd24gbnVtYmVyIGZvciB0aGUgYWZrIGNvdW50ZG93blxuICAgICAqL1xuICAgIHNob3dBZmtPdmVybGF5KGNvdW50RG93biwgZGlzbWlzc0Fmaykge1xuICAgICAgICB0aGlzLmhpZGVDdXJyZW50T3ZlcmxheSgpO1xuICAgICAgICB0aGlzLmFma092ZXJsYXkudXBkYXRlQ291bnRkb3duKGNvdW50RG93bik7XG4gICAgICAgIHRoaXMuYWZrT3ZlcmxheS5vbkFjdGlvbigoKSA9PiBkaXNtaXNzQWZrKCkpO1xuICAgICAgICB0aGlzLmFma092ZXJsYXkuc2hvdygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5ID0gdGhpcy5hZmtPdmVybGF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93IHRoZSBDb25uZWN0IE92ZXJsYXkgb3IgYXV0byBjb25uZWN0XG4gICAgICovXG4gICAgc2hvd0Nvbm5lY3RPckF1dG9Db25uZWN0T3ZlcmxheXMoKSB7XG4gICAgICAgIC8vIHNldCB1cCBpZiB0aGUgYXV0byBwbGF5IHdpbGwgYmUgdXNlZCBvciByZWd1bGFyIGNsaWNrIHRvIHN0YXJ0XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW0uY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQXV0b0Nvbm5lY3QpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dDb25uZWN0T3ZlcmxheSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgdGhlIHdlYlJ0Y0F1dG9Db25uZWN0IE92ZXJsYXkgYW5kIGNvbm5lY3RcbiAgICAgKi9cbiAgICBvbldlYlJ0Y0F1dG9Db25uZWN0KCkge1xuICAgICAgICB0aGlzLnNob3dUZXh0T3ZlcmxheSgnQXV0byBDb25uZWN0aW5nIE5vdycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiByZWNlaXZpbmcgYSB3ZWJSVEMgYW5zd2VyXG4gICAgICovXG4gICAgb25XZWJSdGNTZHAoKSB7XG4gICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5KCdXZWJSVEMgQ29ubmVjdGlvbiBOZWdvdGlhdGVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3dzIGEgdGV4dCBvdmVybGF5IHRvIGFsZXJ0IHRoZSB1c2VyIHRoZSBzdHJlYW0gaXMgY3VycmVudGx5IGxvYWRpbmdcbiAgICAgKi9cbiAgICBvblN0cmVhbUxvYWRpbmcoKSB7XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBzcGlubmVyIHNwYW5cbiAgICAgICAgY29uc3Qgc3Bpbm5lclNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHNwaW5uZXJTcGFuLmNsYXNzTmFtZSA9ICd2aXN1YWxseS1oaWRkZW4nO1xuICAgICAgICBzcGlubmVyU3Bhbi5pbm5lckhUTUwgPSAnTG9hZGluZy4uLic7XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBzcGlubmVyIGRpdlxuICAgICAgICBjb25zdCBzcGlubmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHNwaW5uZXJEaXYuaWQgPSAnbG9hZGluZy1zcGlubmVyJztcbiAgICAgICAgc3Bpbm5lckRpdi5jbGFzc05hbWUgPSAnc3Bpbm5lci1ib3JkZXIgbXMtMic7XG4gICAgICAgIHNwaW5uZXJEaXYuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xuICAgICAgICAvLyBhcHBlbmQgdGhlIHNwaW5uZXIgdG8gdGhlIGVsZW1lbnRcbiAgICAgICAgc3Bpbm5lckRpdi5hcHBlbmRDaGlsZChzcGlubmVyU3Bhbik7XG4gICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5KCdMb2FkaW5nIFN0cmVhbSAnICsgc3Bpbm5lckRpdi5vdXRlckhUTUwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmVudCBmaXJlZCB3aGVuIHRoZSB2aWRlbyBpcyBkaXNjb25uZWN0ZWQgLSBkaXNwbGF5cyB0aGUgZXJyb3Igb3ZlcmxheSBhbmQgcmVzZXRzIHRoZSBidXR0b25zIHN0cmVhbSB0b29scyB1cG9uIGRpc2Nvbm5lY3RcbiAgICAgKiBAcGFyYW0gZXZlbnRTdHJpbmcgLSB0aGUgZXZlbnQgdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gYWxsb3dDbGlja1RvUmVjb25uZWN0IC0gdHJ1ZSBpZiB3ZSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIGNsaWNrIHRvIHJlY29ubmVjdC4gT3RoZXJ3aXNlIGl0J3MganVzdCBhIG1lc3NhZ2UuXG4gICAgICovXG4gICAgb25EaXNjb25uZWN0KGV2ZW50U3RyaW5nLCBhbGxvd0NsaWNrVG9SZWNvbm5lY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBvdmVybGF5TWVzc2FnZSA9ICdEaXNjb25uZWN0ZWQnICsgKGV2ZW50U3RyaW5nID8gYDogJHtldmVudFN0cmluZ31gIDogJy4nKTtcbiAgICAgICAgaWYgKGFsbG93Q2xpY2tUb1JlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5zaG93RGlzY29ubmVjdE92ZXJsYXkoYCR7b3ZlcmxheU1lc3NhZ2V9IENsaWNrIFRvIFJlc3RhcnQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvck92ZXJsYXkob3ZlcmxheU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpc2FibGUgc3RhcnRpbmcgYSBsYXRlbmN5IGNoZWNrc1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIFdlYiBSdGMgaXMgY29ubmVjdGluZ1xuICAgICAqL1xuICAgIG9uV2ViUnRjQ29ubmVjdGluZygpIHtcbiAgICAgICAgdGhpcy5zaG93VGV4dE92ZXJsYXkoJ1N0YXJ0aW5nIGNvbm5lY3Rpb24gdG8gc2VydmVyLCBwbGVhc2Ugd2FpdCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gV2ViIFJ0YyBoYXMgY29ubmVjdGVkXG4gICAgICovXG4gICAgb25XZWJSdGNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5KCdXZWJSVEMgY29ubmVjdGVkLCB3YWl0aW5nIGZvciB2aWRlbycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gV2ViIFJ0YyBmYWlscyB0byBjb25uZWN0XG4gICAgICovXG4gICAgb25XZWJSdGNGYWlsZWQoKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yT3ZlcmxheSgnVW5hYmxlIHRvIHNldHVwIHZpZGVvJyk7XG4gICAgfVxuICAgIG9uTG9hZEZyZWV6ZUZyYW1lKHNob3VsZFNob3dQbGF5T3ZlcmxheSkge1xuICAgICAgICBpZiAoc2hvdWxkU2hvd1BsYXlPdmVybGF5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnc2hvd2luZyBwbGF5IG92ZXJsYXknKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BsYXlPdmVybGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25QbGF5U3RyZWFtKCkge1xuICAgICAgICB0aGlzLmhpZGVDdXJyZW50T3ZlcmxheSgpO1xuICAgIH1cbiAgICBvblBsYXlTdHJlYW1FcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yT3ZlcmxheShtZXNzYWdlKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICAgIG9uUGxheVN0cmVhbVJlamVjdGVkKG9uUmVqZWN0ZWRSZWFzb24pIHtcbiAgICAgICAgdGhpcy5zaG93UGxheU92ZXJsYXkoKTtcbiAgICB9XG4gICAgb25WaWRlb0luaXRpYWxpemVkKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW0uY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQXV0b1BsYXlWaWRlbykpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BsYXlPdmVybGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgKF9hID0gdGhpcy5zdGF0c1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25WaWRlb0luaXRpYWxpemVkKHRoaXMuc3RyZWFtKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHVwIGZ1bmN0aW9uYWxpdHkgdG8gaGFwcGVuIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGF2ZXJhZ2UgdmlkZW8gZW5jb2RlciBxcFxuICAgICAqIEBwYXJhbSBRUCAtIHRoZSBxdWFsaXR5IG51bWJlciBvZiB0aGUgc3RyZWFtXG4gICAgICovXG4gICAgb25WaWRlb0VuY29kZXJBdmdRUChRUCkge1xuICAgICAgICAvLyBVcGRhdGUgaW50ZXJuYWwgUVAgaW5kaWNhdG9yIGlmIG9uZSBpcyBwcmVzZW50XG4gICAgICAgIGlmICh0aGlzLnZpZGVvUXBJbmRpY2F0b3IpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9RcEluZGljYXRvci51cGRhdGVRcFRvb2x0aXAoUVApO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uSW5pdGlhbFNldHRpbmdzKHNldHRpbmdzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHNldHRpbmdzLlBpeGVsU3RyZWFtaW5nU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMuc3RhdHNQYW5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbmZpZ3VyZShzZXR0aW5ncy5QaXhlbFN0cmVhbWluZ1NldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblN0YXRzUmVjZWl2ZWQoYWdncmVnYXRlZFN0YXRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gR3JhYiBhbGwgc3RhdHMgd2UgY2FuIG9mZiB0aGUgYWdncmVnYXRlZCBzdGF0c1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYW5kbGVTdGF0cyhhZ2dyZWdhdGVkU3RhdHMpO1xuICAgIH1cbiAgICBvbkxhdGVuY3lVcGRhdGUobGF0ZW5jeUluZm8pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYW5kbGVMYXRlbmN5SW5mbyhsYXRlbmN5SW5mbyk7XG4gICAgfVxuICAgIG9uTGF0ZW5jeVRlc3RSZXN1bHRzKGxhdGVuY3lUaW1pbmdzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5zdGF0c1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGF0ZW5jeVRlc3QuaGFuZGxlVGVzdFJlc3VsdChsYXRlbmN5VGltaW5ncyk7XG4gICAgfVxuICAgIG9uRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdHMocmVzdWx0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5zdGF0c1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5oYW5kbGVUZXN0UmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuICAgIG9uUGxheWVyQ291bnQocGxheWVyQ291bnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYW5kbGVQbGF5ZXJDb3VudChwbGF5ZXJDb3VudCk7XG4gICAgfVxuICAgIGhhbmRsZVN0cmVhbWVyTGlzdE1lc3NhZ2UobWVzc2FnZVN0cmVhbWluZ0xpc3QsIGF1dG9TZWxlY3RlZFN0cmVhbWVySWQsIHdhbnRlZFN0cmVhbWVySWQpIHtcbiAgICAgICAgY29uc3Qgd2FpdEZvclN0cmVhbWVyID0gdGhpcy5zdHJlYW0uY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuV2FpdEZvclN0cmVhbWVyKTtcbiAgICAgICAgY29uc3QgaXNSZWNvbm5lY3RpbmcgPSB0aGlzLnN0cmVhbS5pc1JlY29ubmVjdGluZygpO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IG51bGw7XG4gICAgICAgIGxldCBhbGxvd1Jlc3RhcnQgPSB0cnVlO1xuICAgICAgICBpZiAoIWF1dG9TZWxlY3RlZFN0cmVhbWVySWQpIHtcbiAgICAgICAgICAgIGlmICh3YWl0Rm9yU3RyZWFtZXIgJiYgd2FudGVkU3RyZWFtZXJJZCkge1xuICAgICAgICAgICAgICAgIGlmIChpc1JlY29ubmVjdGluZykge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFdhaXRpbmcgZm9yICR7d2FudGVkU3RyZWFtZXJJZH0gdG8gYmVjb21lIGF2YWlsYWJsZS5gO1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgR2F2ZSB1cCB3YWl0aW5nIGZvciAke3dhbnRlZFN0cmVhbWVySWR9IHRvIGJlY29tZSBhdmFpbGFibGUuIENsaWNrIHRvIHRyeSBhZ2FpbmA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlU3RyZWFtaW5nTGlzdC5pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBgIG9yIHNlbGVjdCBhIHN0cmVhbWVyIGZyb20gdGhlIHNldHRpbmdzIG1lbnUuYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2VTdHJlYW1pbmdMaXN0Lmlkcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpc1JlY29ubmVjdGluZykge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFdhaXRpbmcgZm9yIGEgc3RyZWFtZXIgdG8gYmVjb21lIGF2YWlsYWJsZS5gO1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgTm8gc3RyZWFtZXJzIGF2YWlsYWJsZS4gQ2xpY2sgdG8gdHJ5IGFnYWluLmA7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93UmVzdGFydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBNdWx0aXBsZSBzdHJlYW1lcnMgYXZhaWxhYmxlLiBTZWxlY3Qgb25lIGZyb20gdGhlIHNldHRpbmdzIG1lbnUuYDtcbiAgICAgICAgICAgICAgICBhbGxvd1Jlc3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbGxvd1Jlc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dEaXNjb25uZWN0T3ZlcmxheShtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5KG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVN1YnNjcmliZUZhaWxlZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICB0aGlzLnNob3dEaXNjb25uZWN0T3ZlcmxheShgU3Vic2NyaWJlIGZhaWxlZDogXCIke21lc3NhZ2V9XCIgQ2xpY2sgdG8gdHJ5IGFnYWluYCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBsaWdodC9kYXJrIGNvbG9yIG1vZGVcbiAgICAgKiBAcGFyYW0gaXNMaWdodE1vZGUgLSBzaG91bGQgd2UgdXNlIGEgbGlnaHQgb3IgZGFyayBjb2xvciBzY2hlbWVcbiAgICAgKi9cbiAgICBzZXRDb2xvck1vZGUoaXNMaWdodE1vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMub25Db2xvck1vZGVDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ29sb3JNb2RlQ2hhbmdlZChpc0xpZ2h0TW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvd0VkaXRUZXh0TW9kYWwodWVUZXh0Ym94Q29udGVudHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBSZW1vdmUgYW55IGV4aXN0aW5nIG1vZGFsXG4gICAgICAgIChfYSA9IHRoaXMuZWRpdFRleHRNb2RhbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJvb3RFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAvLyBNYWtlIGEgbmV3IG1vZGFsIGZvciBlZGl0aW5nIHRoZSBVRSB0ZXh0Ym94IG9uIHRoZSBicm93c2VyIHNpZGVcbiAgICAgICAgdGhpcy5lZGl0VGV4dE1vZGFsID0gbmV3IEVkaXRUZXh0TW9kYWwoKTtcbiAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSByb290IG9mIHRoZSBQaXhlbCBTdHJlYW1pbmcgYXBwbGljYXRpb25cbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5hcHBlbmQodGhpcy5lZGl0VGV4dE1vZGFsLnJvb3RFbGVtZW50KTtcbiAgICAgICAgLy8gQWRkIHRoZSB0ZXh0IGNvbnRlbnQgZnJvbSBVRSBzaWRlIGFuZCBzdW1tb24gb24tc2NyZWVuIGtleWJvYXJkXG4gICAgICAgIHRoaXMuZWRpdFRleHRNb2RhbC5zaG93TW9kYWwodWVUZXh0Ym94Q29udGVudHMpO1xuICAgICAgICAvLyBCaW5kIHRvIHRoZSBjb25maXJtIGV2ZW50XG4gICAgICAgIHRoaXMuZWRpdFRleHRNb2RhbC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcignZWRpdENvbmZpcm1lZCcsIChldnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRUZXh0RXZlbnQgPSBldnQ7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbS5zZW5kVGV4dGJveEVudHJ5KGVkaXRUZXh0RXZlbnQuY29uZmlybWVkVGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvblNldHRpbmdzQ2hhbmdlZChldmVudCkge1xuICAgICAgICAvLyBQYXNzIHRoZSBldmVudCBkaXJlY3RseSBvbnRvIHRoZSBjb25maWdVSS4gVGhpcyB3aWxsIGRvIHRoaW5ncyBsaWtlIHVwZGF0aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgICAgLy8gYXMgd2VsbCBhcyB0aGUgc2VsZWN0ZWQgdmFsdWVcbiAgICAgICAgdGhpcy5jb25maWdVSS5vblNldHRpbmdzQ2hhbmdlZChldmVudCk7XG4gICAgICAgIGNvbnN0IHsgXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgICAgICAgZGF0YTogeyBpZCwgdGFyZ2V0LCB0eXBlIH0gfSA9IGV2ZW50O1xuICAgICAgICAvLyBFeHBsaWNpdGx5IGhhbmRsZSBzcGVjaWZpYyBzZXR0aW5nIGJlaGF2aW91clxuICAgICAgICBpZiAoaWQgPT0gT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5KSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmZXJyZWRRdWFsaXR5T3B0aW9uID0gdGhpcy5zdHJlYW0uY29uZmlnLmdldFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5KTtcbiAgICAgICAgICAgIGlmIChbLi4ucHJlZmVycmVkUXVhbGl0eU9wdGlvbi5vcHRpb25zXS5pbmNsdWRlcygnRGVmYXVsdCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdVSS5kaXNhYmxlU2V0dGluZyhPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdVSS5lbmFibGVTZXR0aW5nKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcHBsaWNhdGlvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgVGV4dFBhcmFtZXRlcnMsIE9wdGlvblBhcmFtZXRlcnMsIEZsYWdzLCBOdW1lcmljUGFyYW1ldGVycywgU2V0dGluZ0ZsYWcsIExvZ2dlciwgaXNGbGFnSWQsIGlzTnVtZXJpY0lkLCBpc1RleHRJZCwgaXNPcHRpb25JZCB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgU2V0dGluZ1VJRmxhZyB9IGZyb20gJy4vU2V0dGluZ1VJRmxhZyc7XG5pbXBvcnQgeyBTZXR0aW5nVUlOdW1iZXIgfSBmcm9tICcuL1NldHRpbmdVSU51bWJlcic7XG5pbXBvcnQgeyBTZXR0aW5nVUlUZXh0IH0gZnJvbSAnLi9TZXR0aW5nVUlUZXh0JztcbmltcG9ydCB7IFNldHRpbmdVSU9wdGlvbiB9IGZyb20gJy4vU2V0dGluZ1VJT3B0aW9uJztcbmltcG9ydCB7IEV4dHJhRmxhZ3MsIGlzU2VjdGlvbkVuYWJsZWQsIGlzU2V0dGluZ0VuYWJsZWQsIFNldHRpbmdzU2VjdGlvbnMgfSBmcm9tICcuLi9VSS9VSUNvbmZpZ3VyYXRpb25UeXBlcyc7XG5leHBvcnQgY2xhc3MgQ29uZmlnVUkge1xuICAgIC8vIC0tLS0tLS0tLS0tLSBTZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICB0aGlzLmN1c3RvbUZsYWdzID0gbmV3IE1hcCgpO1xuICAgICAgICAvKiBBIG1hcCBvZiBmbGFncyB0aGF0IGNhbiBiZSB0b2dnbGVkIC0gb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4gdGhlIGFwcGxpY2F0aW9uIC0gZS5nLiBVc2UgTWljPyAqL1xuICAgICAgICB0aGlzLmZsYWdzVWkgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8qIEEgbWFwIG9mIG51bWVyaWNhbCBzZXR0aW5ncyAtIG9wdGlvbnMgdGhhdCBjYW4gYmUgaW4gdGhlIGFwcGxpY2F0aW9uIC0gZS5nLiBNaW5CaXRyYXRlICovXG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaSA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgdGV4dCBzZXR0aW5ncyAtIGUuZy4gc2lnbmFsbGluZyBzZXJ2ZXIgdXJsICovXG4gICAgICAgIHRoaXMudGV4dFBhcmFtZXRlcnNVaSA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgZW51bSBiYXNlZCBzZXR0aW5ncyAtIGUuZy4gcHJlZmVycmVkIGNvZGVjICovXG4gICAgICAgIHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZUN1c3RvbVVJU2V0dGluZ3MoY29uZmlnLnVzZVVybFBhcmFtcyk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJTZXR0aW5nc1VJQ29tcG9uZW50cyhjb25maWcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgY3VzdG9tIFVJIHNldHRpbmdzIHRoYXQgYXJlIG5vdCBwcm92aWRlZCBieSB0aGUgUGl4ZWwgU3RyZWFtaW5nIGxpYnJhcnkuXG4gICAgICovXG4gICAgY3JlYXRlQ3VzdG9tVUlTZXR0aW5ncyh1c2VVcmxQYXJhbXMpIHtcbiAgICAgICAgdGhpcy5jdXN0b21GbGFncy5zZXQoRXh0cmFGbGFncy5MaWdodE1vZGUsIG5ldyBTZXR0aW5nRmxhZyhFeHRyYUZsYWdzLkxpZ2h0TW9kZSwgJ0NvbG9yIFNjaGVtZTogRGFyayBNb2RlJywgJ1BhZ2Ugc3R5bGluZyB3aWxsIGJlIGVpdGhlciBsaWdodCBvciBkYXJrJywgZmFsc2UgLyppZiB3YW50IHRvIHVzZSBzeXN0ZW0gcHJlZjogKHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KScpLm1hdGNoZXMpKi8sIHVzZVVybFBhcmFtcywgKGlzTGlnaHRNb2RlLCBzZXR0aW5nKSA9PiB7XG4gICAgICAgICAgICBzZXR0aW5nLmxhYmVsID0gYENvbG9yIFNjaGVtZTogJHtpc0xpZ2h0TW9kZSA/ICdMaWdodCcgOiAnRGFyayd9IE1vZGVgO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgVUkgd3JhcHBlciBjb21wb25lbnRzIGZvciBlYWNoIHNldHRpbmcgZWxlbWVudCBpbiBjb25maWcuXG4gICAgICogQHBhcmFtIGNvbmZpZyAtXG4gICAgICovXG4gICAgcmVnaXN0ZXJTZXR0aW5nc1VJQ29tcG9uZW50cyhjb25maWcpIHtcbiAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGNvbmZpZy5nZXRGbGFncygpKSB7XG4gICAgICAgICAgICB0aGlzLmZsYWdzVWkuc2V0KHNldHRpbmcuaWQsIG5ldyBTZXR0aW5nVUlGbGFnKHNldHRpbmcpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgQXJyYXkuZnJvbSh0aGlzLmN1c3RvbUZsYWdzLnZhbHVlcygpKSkge1xuICAgICAgICAgICAgdGhpcy5mbGFnc1VpLnNldChzZXR0aW5nLmlkLCBuZXcgU2V0dGluZ1VJRmxhZyhzZXR0aW5nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGNvbmZpZy5nZXRUZXh0U2V0dGluZ3MoKSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0UGFyYW1ldGVyc1VpLnNldChzZXR0aW5nLmlkLCBuZXcgU2V0dGluZ1VJVGV4dChzZXR0aW5nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGNvbmZpZy5nZXROdW1lcmljU2V0dGluZ3MoKSkge1xuICAgICAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLnNldChzZXR0aW5nLmlkLCBuZXcgU2V0dGluZ1VJTnVtYmVyKHNldHRpbmcpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgY29uZmlnLmdldE9wdGlvblNldHRpbmdzKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLnNldChzZXR0aW5nLmlkLCBuZXcgU2V0dGluZ1VJT3B0aW9uKHNldHRpbmcpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlIERPTSBlbGVtZW50cyBmb3IgYSBzZXR0aW5ncyBzZWN0aW9uIHdpdGggYSBoZWFkaW5nLlxuICAgICAqIEBwYXJhbSBzZXR0aW5nc0VsZW0gLSBUaGUgcGFyZW50IGNvbnRhaW5lciBmb3Igb3VyIERPTSBlbGVtZW50cy5cbiAgICAgKiBAcGFyYW0gc2VjdGlvbkhlYWRpbmcgLSBUaGUgaGVhZGluZyBlbGVtZW50IHRvIGdvIGludG8gdGhlIHNlY3Rpb24uXG4gICAgICogQHJldHVybnMgVGhlIGNvbnN0cnVjdGVkIERPTSBlbGVtZW50IGZvciB0aGUgc2VjdGlvbi5cbiAgICAgKi9cbiAgICBidWlsZFNlY3Rpb25XaXRoSGVhZGluZyhzZXR0aW5nc0VsZW0sIHNlY3Rpb25IZWFkaW5nKSB7XG4gICAgICAgIC8vIG1ha2Ugc2VjdGlvbiBlbGVtZW50XG4gICAgICAgIGNvbnN0IHNlY3Rpb25FbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xuICAgICAgICBzZWN0aW9uRWxlbS5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nc0NvbnRhaW5lcicpO1xuICAgICAgICAvLyBtYWtlIHNlY3Rpb24gaGVhZGluZ1xuICAgICAgICBjb25zdCBwc1NldHRpbmdzSGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHBzU2V0dGluZ3NIZWFkZXIuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NIZWFkZXInKTtcbiAgICAgICAgcHNTZXR0aW5nc0hlYWRlci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy10ZXh0Jyk7XG4gICAgICAgIHBzU2V0dGluZ3NIZWFkZXIudGV4dENvbnRlbnQgPSBzZWN0aW9uSGVhZGluZztcbiAgICAgICAgLy8gYWRkIHNlY3Rpb24gYW5kIGhlYWRpbmcgdG8gcGFyZW50IHNldHRpbmdzIGVsZW1lbnRcbiAgICAgICAgc2VjdGlvbkVsZW0uYXBwZW5kQ2hpbGQocHNTZXR0aW5nc0hlYWRlcik7XG4gICAgICAgIHNldHRpbmdzRWxlbS5hcHBlbmRDaGlsZChzZWN0aW9uRWxlbSk7XG4gICAgICAgIHJldHVybiBzZWN0aW9uRWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0dXAgZmxhZ3Mgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGBDb25maWcuZmxhZ3NgIG1hcC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3NFbGVtIC0gLSBUaGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5kaXZpZHVhbCBzZXR0aW5ncyBzZWN0aW9ucywgZmxhZ3MsIGFuZCBzbyBvbi5cbiAgICAgKi9cbiAgICBwb3B1bGF0ZVNldHRpbmdzRWxlbWVudChzZXR0aW5nc0VsZW0sIHNldHRpbmdzQ29uZmlnKSB7XG4gICAgICAgIGlmIChpc1NlY3Rpb25FbmFibGVkKHNldHRpbmdzQ29uZmlnLCBTZXR0aW5nc1NlY3Rpb25zLlBpeGVsU3RyZWFtaW5nKSkge1xuICAgICAgICAgICAgLyogU2V0dXAgYWxsIFBpeGVsIFN0cmVhbWluZyBzcGVjaWZpYyBzZXR0aW5ncyAqL1xuICAgICAgICAgICAgY29uc3QgcHNTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5QaXhlbFN0cmVhbWluZyk7XG4gICAgICAgICAgICAvLyBtYWtlIHNldHRpbmdzIHNob3cgdXAgaW4gRE9NXG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgVGV4dFBhcmFtZXRlcnMuU2lnbmFsbGluZ1NlcnZlclVybCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nVGV4dChwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy50ZXh0UGFyYW1ldGVyc1VpLmdldChUZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdPcHRpb24ocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLmdldChPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5BdXRvQ29ubmVjdCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5BdXRvQ29ubmVjdCkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkF1dG9QbGF5VmlkZW8pKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuQXV0b1BsYXlWaWRlbykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLlVzZU1pYykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5Vc2VNaWMpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5Vc2VDYW1lcmEpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuVXNlQ2FtZXJhKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuU3RhcnRWaWRlb011dGVkKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLlN0YXJ0VmlkZW9NdXRlZCkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXIpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuSXNRdWFsaXR5Q29udHJvbGxlcikpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkZvcmNlTW9ub0F1ZGlvKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLkZvcmNlTW9ub0F1ZGlvKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuRm9yY2VUVVJOKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLkZvcmNlVFVSTikpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLlN1cHByZXNzQnJvd3NlcktleXMpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuU3VwcHJlc3NCcm93c2VyS2V5cykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkFGS0RldGVjdGlvbikpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5BRktEZXRlY3Rpb24pKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5XYWl0Rm9yU3RyZWFtZXIpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuV2FpdEZvclN0cmVhbWVyKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ051bWVyaWMocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5BRktDb3VudGRvd25TZWNzKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdOdW1lcmljKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLkFGS0NvdW50ZG93blNlY3MpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLlN0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1NlY3Rpb25FbmFibGVkKHNldHRpbmdzQ29uZmlnLCBTZXR0aW5nc1NlY3Rpb25zLlVJKSkge1xuICAgICAgICAgICAgLyogU2V0dXAgYWxsIHZpZXcvdWkgcmVsYXRlZCBzZXR0aW5ncyB1bmRlciB0aGlzIHNlY3Rpb24gKi9cbiAgICAgICAgICAgIGNvbnN0IHZpZXdTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5VSSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb24pKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcodmlld1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbikpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkhvdmVyaW5nTW91c2VNb2RlKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHZpZXdTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBFeHRyYUZsYWdzLkxpZ2h0TW9kZSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyh2aWV3U2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEV4dHJhRmxhZ3MuTGlnaHRNb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU2VjdGlvbkVuYWJsZWQoc2V0dGluZ3NDb25maWcsIFNldHRpbmdzU2VjdGlvbnMuSW5wdXQpKSB7XG4gICAgICAgICAgICAvKiBTZXR1cCBhbGwgZW5jb2RlciByZWxhdGVkIHNldHRpbmdzIHVuZGVyIHRoaXMgc2VjdGlvbiAqL1xuICAgICAgICAgICAgY29uc3QgaW5wdXRTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5JbnB1dCk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuS2V5Ym9hcmRJbnB1dCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhpbnB1dFNldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5LZXlib2FyZElucHV0KSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuTW91c2VJbnB1dCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhpbnB1dFNldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5Nb3VzZUlucHV0KSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcoaW5wdXRTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5Ub3VjaElucHV0KSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKGlucHV0U2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLlRvdWNoSW5wdXQpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5HYW1lcGFkSW5wdXQpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcoaW5wdXRTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuR2FtZXBhZElucHV0KSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuWFJDb250cm9sbGVySW5wdXQpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcoaW5wdXRTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuWFJDb250cm9sbGVySW5wdXQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgU2V0dGluZ3NTZWN0aW9ucy5FbmNvZGVyKSkge1xuICAgICAgICAgICAgLyogU2V0dXAgYWxsIGVuY29kZXIgcmVsYXRlZCBzZXR0aW5ncyB1bmRlciB0aGlzIHNlY3Rpb24gKi9cbiAgICAgICAgICAgIGNvbnN0IGVuY29kZXJTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5FbmNvZGVyKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdOdW1lcmljKGVuY29kZXJTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbikpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ051bWVyaWMoZW5jb2RlclNldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4KSk7XG4gICAgICAgICAgICBjb25zdCBwcmVmZXJyZWRDb2RlY09wdGlvbiA9IHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLmdldChPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdPcHRpb24oZW5jb2RlclNldHRpbmdzU2VjdGlvbiwgdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuZ2V0KE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMpKTtcbiAgICAgICAgICAgIGlmIChwcmVmZXJyZWRDb2RlY09wdGlvbiAmJlxuICAgICAgICAgICAgICAgIFsuLi5wcmVmZXJyZWRDb2RlY09wdGlvbi5zZWxlY3Rvci5vcHRpb25zXVxuICAgICAgICAgICAgICAgICAgICAubWFwKChvKSA9PiBvLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAuaW5jbHVkZXMoJ09ubHkgYXZhaWxhYmxlIG9uIENocm9tZScpKSB7XG4gICAgICAgICAgICAgICAgcHJlZmVycmVkQ29kZWNPcHRpb24uZGlzYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nT3B0aW9uKGVuY29kZXJTZXR0aW5nc1NlY3Rpb24sIHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLmdldChPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgU2V0dGluZ3NTZWN0aW9ucy5XZWJSVEMpKSB7XG4gICAgICAgICAgICAvKiBTZXR1cCBhbGwgd2VicnRjIHJlbGF0ZWQgc2V0dGluZ3MgdW5kZXIgdGhpcyBzZWN0aW9uICovXG4gICAgICAgICAgICBjb25zdCB3ZWJydGNTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5XZWJSVEMpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ0ZQUykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyh3ZWJydGNTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyh3ZWJydGNTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ051bWVyaWMod2VicnRjU2V0dGluZ3NTZWN0aW9uLCB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBTZXR0aW5nVGV4dCBlbGVtZW50IHRvIGEgcGFydGljdWxhciBzZXR0aW5ncyBzZWN0aW9uIGluIHRoZSBET00gYW5kIHJlZ2lzdGVycyB0aGF0IHRleHQgaW4gdGhlIHRleHQgc2V0dGluZ3MgbWFwLlxuICAgICAqIEBwYXJhbSBzZXR0aW5nc1NlY3Rpb24gLSBUaGUgc2V0dGluZ3Mgc2VjdGlvbiBIVE1MIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHNldHRpbmdUZXh0IC0gVGhlIHRleHR1YWwgc2V0dGluZ3Mgb2JqZWN0LlxuICAgICAqL1xuICAgIGFkZFNldHRpbmdUZXh0KHNldHRpbmdzU2VjdGlvbiwgc2V0dGluZ1RleHQpIHtcbiAgICAgICAgaWYgKHNldHRpbmdUZXh0KSB7XG4gICAgICAgICAgICBzZXR0aW5nc1NlY3Rpb24uYXBwZW5kQ2hpbGQoc2V0dGluZ1RleHQucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy50ZXh0UGFyYW1ldGVyc1VpLnNldChzZXR0aW5nVGV4dC5zZXR0aW5nLmlkLCBzZXR0aW5nVGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgU2V0dGluZ0ZsYWcgZWxlbWVudCB0byBhIHBhcnRpY3VsYXIgc2V0dGluZ3Mgc2VjdGlvbiBpbiB0aGUgRE9NIGFuZCByZWdpc3RlcnMgdGhhdCBmbGFnIGluIHRoZSBDb25maWcuZmxhZyBtYXAuXG4gICAgICogQHBhcmFtIHNldHRpbmdzU2VjdGlvbiAtIFRoZSBzZXR0aW5ncyBzZWN0aW9uIEhUTUwgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ0ZsYWcgLSBUaGUgc2V0dGluZ3MgZmxhZyBvYmplY3QuXG4gICAgICovXG4gICAgYWRkU2V0dGluZ0ZsYWcoc2V0dGluZ3NTZWN0aW9uLCBzZXR0aW5nRmxhZykge1xuICAgICAgICBpZiAoc2V0dGluZ0ZsYWcpIHtcbiAgICAgICAgICAgIHNldHRpbmdzU2VjdGlvbi5hcHBlbmRDaGlsZChzZXR0aW5nRmxhZy5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzVWkuc2V0KHNldHRpbmdGbGFnLnNldHRpbmcuaWQsIHNldHRpbmdGbGFnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBudW1lcmljIHNldHRpbmcgZWxlbWVudCB0byBhIHBhcnRpY3VsYXIgc2V0dGluZ3Mgc2VjdGlvbiBpbiB0aGUgRE9NIGFuZCByZWdpc3RlcnMgdGhhdCBmbGFnIGluIHRoZSBDb25maWcubnVtZXJpY1BhcmFtZXRlcnMgbWFwLlxuICAgICAqIEBwYXJhbSBzZXR0aW5nc1NlY3Rpb24gLSBUaGUgc2V0dGluZ3Mgc2VjdGlvbiBIVE1MIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHNldHRpbmdGbGFnIC0gVGhlIHNldHRpbmdzIGZsYWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGFkZFNldHRpbmdOdW1lcmljKHNldHRpbmdzU2VjdGlvbiwgc2V0dGluZykge1xuICAgICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICAgICAgc2V0dGluZ3NTZWN0aW9uLmFwcGVuZENoaWxkKHNldHRpbmcucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLnNldChzZXR0aW5nLnNldHRpbmcuaWQsIHNldHRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBlbnVtIGJhc2VkIHNldHRpbmdzIGVsZW1lbnQgdG8gYSBwYXJ0aWN1bGFyIHNldHRpbmdzIHNlY3Rpb24gaW4gdGhlIERPTSBhbmQgcmVnaXN0ZXJzIHRoYXQgZmxhZyBpbiB0aGUgQ29uZmlnLmVudW1QYXJhbWV0ZXJzIG1hcC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3NTZWN0aW9uIC0gVGhlIHNldHRpbmdzIHNlY3Rpb24gSFRNTCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSBzZXR0aW5nRmxhZyAtIFRoZSBzZXR0aW5ncyBmbGFnIG9iamVjdC5cbiAgICAgKi9cbiAgICBhZGRTZXR0aW5nT3B0aW9uKHNldHRpbmdzU2VjdGlvbiwgc2V0dGluZykge1xuICAgICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICAgICAgc2V0dGluZ3NTZWN0aW9uLmFwcGVuZENoaWxkKHNldHRpbmcucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuc2V0KHNldHRpbmcuc2V0dGluZy5pZCwgc2V0dGluZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25TZXR0aW5nc0NoYW5nZWQoeyBkYXRhOiB7IGlkLCB0YXJnZXQsIHR5cGUgfSB9KSB7XG4gICAgICAgIGlmICh0eXBlID09PSAnZmxhZycpIHtcbiAgICAgICAgICAgIGNvbnN0IF9pZCA9IGlkO1xuICAgICAgICAgICAgY29uc3QgX3RhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSB0aGlzLmZsYWdzVWkuZ2V0KF9pZCk7XG4gICAgICAgICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLmZsYWcgIT09IF90YXJnZXQuZmxhZykge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLmZsYWcgPSBfdGFyZ2V0LmZsYWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLmxhYmVsICE9PSBfdGFyZ2V0LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmcubGFiZWwgPSBfdGFyZ2V0LmxhYmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uc3QgX2lkID0gaWQ7XG4gICAgICAgICAgICBjb25zdCBfdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoX2lkKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmcubnVtYmVyICE9PSBfdGFyZ2V0Lm51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLm51bWJlciA9IF90YXJnZXQubnVtYmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5sYWJlbCAhPT0gX3RhcmdldC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLmxhYmVsID0gX3RhcmdldC5sYWJlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBjb25zdCBfaWQgPSBpZDtcbiAgICAgICAgICAgIGNvbnN0IF90YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gdGhpcy50ZXh0UGFyYW1ldGVyc1VpLmdldChfaWQpO1xuICAgICAgICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy50ZXh0ICE9PSBfdGFyZ2V0LnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0gX3RhcmdldC50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5sYWJlbCAhPT0gX3RhcmdldC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLmxhYmVsID0gX3RhcmdldC5sYWJlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ29wdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IF9pZCA9IGlkO1xuICAgICAgICAgICAgY29uc3QgX3RhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSB0aGlzLm9wdGlvblBhcmFtZXRlcnNVaS5nZXQoX2lkKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdWlPcHRpb25zID0gc2V0dGluZy5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldE9wdGlvbnMgPSBfdGFyZ2V0Lm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKHVpT3B0aW9ucy5sZW5ndGggIT09IHRhcmdldE9wdGlvbnMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgICF1aU9wdGlvbnMuZXZlcnkoKHZhbHVlKSA9PiB0YXJnZXRPcHRpb25zLmluY2x1ZGVzKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5vcHRpb25zID0gX3RhcmdldC5vcHRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5zZWxlY3RlZCAhPT0gX3RhcmdldC5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLnNlbGVjdGVkID0gX3RhcmdldC5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmcubGFiZWwgIT09IF90YXJnZXQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5sYWJlbCA9IF90YXJnZXQubGFiZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgZmxhZyBpcyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2VMaXN0ZW5lciAtIFRoZSBjYWxsYmFjayB0byBmaXJlIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICovXG4gICAgYWRkQ3VzdG9tRmxhZ09uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihpZCwgb25DaGFuZ2VMaXN0ZW5lcikge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21GbGFncy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUZsYWdzLmdldChpZCkub25DaGFuZ2UgPSBvbkNoYW5nZUxpc3RlbmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgZm9yIHRoZSBmbGFnLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gbGFiZWwgLSBUaGUgbmV3IGxhYmVsIHRvIHVzZSBmb3IgdGhlIGZsYWcuXG4gICAgICovXG4gICAgc2V0Q3VzdG9tRmxhZ0xhYmVsKGlkLCBsYWJlbCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tRmxhZ3MuaGFzKGlkKSkge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoYENhbm5vdCBzZXQgbGFiZWwgZm9yIGZsYWcgY2FsbGVkICR7aWR9IC0gaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIENvbmZpZy5mbGFncyBtYXAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUZsYWdzLmdldChpZCkubGFiZWwgPSBsYWJlbDtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3NVaS5nZXQoaWQpLmxhYmVsID0gbGFiZWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmbGFnIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gaWQuXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGZsYWcuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZmxhZyBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIGlzQ3VzdG9tRmxhZ0VuYWJsZWQoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tRmxhZ3MuZ2V0KGlkKS5mbGFnO1xuICAgIH1cbiAgICBkaXNhYmxlU2V0dGluZyhpZCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGlmIChpc0ZsYWdJZChpZCkpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMuZmxhZ3NVaS5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTnVtZXJpY0lkKGlkKSkge1xuICAgICAgICAgICAgKF9iID0gdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChpZCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNUZXh0SWQoaWQpKSB7XG4gICAgICAgICAgICAoX2MgPSB0aGlzLnRleHRQYXJhbWV0ZXJzVWkuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRpc2FibGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09wdGlvbklkKGlkKSkge1xuICAgICAgICAgICAgKF9kID0gdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmRpc2FibGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbmFibGVTZXR0aW5nKGlkKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgaWYgKGlzRmxhZ0lkKGlkKSkge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5mbGFnc1VpLmdldChpZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc051bWVyaWNJZChpZCkpIHtcbiAgICAgICAgICAgIChfYiA9IHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNUZXh0SWQoaWQpKSB7XG4gICAgICAgICAgICAoX2MgPSB0aGlzLnRleHRQYXJhbWV0ZXJzVWkuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT3B0aW9uSWQoaWQpKSB7XG4gICAgICAgICAgICAoX2QgPSB0aGlzLm9wdGlvblBhcmFtZXRlcnNVaS5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25maWdVSS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhIHNldHRpbmcgdGhhdCBoYXMgYSB0ZXh0IGxhYmVsLCBhbiBhcmJpdHJhcnkgc2V0dGluZyB2YWx1ZSBpdCBzdG9yZXMsIGFuIGEgSFRNTCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGlzIHNldHRpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nVUlCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5nKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmcgPSBzZXR0aW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBjb21wb25lbnQuXG4gICAgICovXG4gICAgZ2V0IHNldHRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gb3IgY3JlYXRlcyBhIEhUTUwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhpcyBzZXR0aW5nIGluIHRoZSBET00uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nVUlCYXNlLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBTZXR0aW5nVUlCYXNlIH0gZnJvbSAnLi9TZXR0aW5nVUlCYXNlJztcbmV4cG9ydCBjbGFzcyBTZXR0aW5nVUlGbGFnIGV4dGVuZHMgU2V0dGluZ1VJQmFzZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZykge1xuICAgICAgICBzdXBlcihzZXR0aW5nKTtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHNldHRpbmcubGFiZWw7XG4gICAgICAgIHRoaXMuZmxhZyA9IHNldHRpbmcuZmxhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIHNldHRpbmcgY29tcG9uZW50LlxuICAgICAqL1xuICAgIGdldCBzZXR0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZztcbiAgICB9XG4gICAgZ2V0IHNldHRpbmdzVGV4dEVsZW0oKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3NUZXh0RWxlbSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbS5pbm5lclRleHQgPSB0aGlzLnNldHRpbmcuX2xhYmVsO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbS50aXRsZSA9IHRoaXMuc2V0dGluZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NUZXh0RWxlbTtcbiAgICB9XG4gICAgZ2V0IGNoZWNrYm94KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrYm94KSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgICAgICAgIC8vIEJsb2NrIGtleXByZXNzL3VwL2Rvd24gcHJvcG9nYXRpb24gZnJvbSB0ZXh0IGZpZWxkIHR5cGluZyBnb2luZyB0byBVRVxuICAgICAgICAgICAgdGhpcy5fY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrYm94O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gb3IgY3JlYXRlcyBhIEhUTUwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhpcyBzZXR0aW5nIGluIHRoZSBET00uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgcm9vdCBkaXYgd2l0aCBcInNldHRpbmdcIiBjc3MgY2xhc3NcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9IHRoaXMuc2V0dGluZy5pZDtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NldHRpbmcnKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBkaXYgZWxlbWVudCB0byBjb250YWluIG91ciBzZXR0aW5nJ3MgdGV4dFxuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1RleHRFbGVtKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBsYWJlbCBlbGVtZW50IHRvIHdyYXAgb3V0IGlucHV0IHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICAgICAgICB3cmFwcGVyTGFiZWwuY2xhc3NMaXN0LmFkZCgndGdsLXN3aXRjaCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQod3JhcHBlckxhYmVsKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBpbnB1dCB0eXBlPWNoZWNrYm94XG4gICAgICAgICAgICB0aGlzLmNoZWNrYm94LnRpdGxlID0gdGhpcy5zZXR0aW5nLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgdGhpcy5jaGVja2JveC5jbGFzc0xpc3QuYWRkKCd0Z2wnKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tib3guY2xhc3NMaXN0LmFkZCgndGdsLWZsYXQnKTtcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgc2xpZGVyLmNsYXNzTGlzdC5hZGQoJ3RnbC1zbGlkZXInKTtcbiAgICAgICAgICAgIHdyYXBwZXJMYWJlbC5hcHBlbmRDaGlsZCh0aGlzLmNoZWNrYm94KTtcbiAgICAgICAgICAgIHdyYXBwZXJMYWJlbC5hcHBlbmRDaGlsZChzbGlkZXIpO1xuICAgICAgICAgICAgLy8gc2V0dXAgb24gY2hhbmdlIGZyb20gY2hlY2tib3hcbiAgICAgICAgICAgIHRoaXMuY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuZmxhZyAhPT0gdGhpcy5jaGVja2JveC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5mbGFnID0gdGhpcy5jaGVja2JveC5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcudXBkYXRlVVJMUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHNldHRpbmcncyBzdG9yZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIGluVmFsdWUgLSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgc2V0dGluZy5cbiAgICAgKi9cbiAgICBzZXQgZmxhZyhpblZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hlY2tib3guY2hlY2tlZCA9IGluVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB2YWx1ZVxuICAgICAqL1xuICAgIGdldCBmbGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja2JveC5jaGVja2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBsYWJlbCAtIHNldHRpbmcgbGFiZWwuXG4gICAgICovXG4gICAgc2V0IGxhYmVsKGluTGFiZWwpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IGluTGFiZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBsYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NUZXh0RWxlbS5pbm5lclRleHQ7XG4gICAgfVxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tib3guZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nVUlGbGFnLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41JztcbmltcG9ydCB7IFNldHRpbmdVSUJhc2UgfSBmcm9tICcuL1NldHRpbmdVSUJhc2UnO1xuLyoqXG4gKiBBIG51bWJlciBzcGlubmVyIHdpdGggYSB0ZXh0IGxhYmVsIGJlc2lkZSBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdVSU51bWJlciBleHRlbmRzIFNldHRpbmdVSUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmcpIHtcbiAgICAgICAgc3VwZXIoc2V0dGluZyk7XG4gICAgICAgIHRoaXMubGFiZWwgPSB0aGlzLnNldHRpbmcubGFiZWw7XG4gICAgICAgIHRoaXMubnVtYmVyID0gdGhpcy5zZXR0aW5nLm51bWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIHNldHRpbmcgY29tcG9uZW50LlxuICAgICAqL1xuICAgIGdldCBzZXR0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZztcbiAgICB9XG4gICAgZ2V0IHNldHRpbmdzVGV4dEVsZW0oKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3NUZXh0RWxlbSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0udGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzVGV4dEVsZW07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgSFRNTElucHV0RWxlbWVudCBmb3IgdGhlIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBnZXQgc3Bpbm5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zcGlubmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zcGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIudHlwZSA9ICdudW1iZXInO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5taW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIubWluID0gdGhpcy5zZXR0aW5nLm1pbi50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5tYXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIubWF4ID0gdGhpcy5zZXR0aW5nLm1heC50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc3Bpbm5lci52YWx1ZSA9IHRoaXMuc2V0dGluZy5udW1iZXIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIudGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgICAgICB0aGlzLl9zcGlubmVyLmNsYXNzTGlzdC5hZGQoJ2Zvcm0tY29udHJvbCcpO1xuICAgICAgICAgICAgLy8gQmxvY2sga2V5cHJlc3MvdXAvZG93biBwcm9wb2dhdGlvbiBmcm9tIHRleHQgZmllbGQgdHlwaW5nIGdvaW5nIHRvIFVFXG4gICAgICAgICAgICB0aGlzLnNwaW5uZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zcGlubmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc3Bpbm5lci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3Bpbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHJvb3QgZGl2IHdpdGggXCJzZXR0aW5nXCIgY3NzIGNsYXNzXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2V0dGluZycpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZm9ybS1ncm91cCcpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGRpdiBlbGVtZW50IHRvIGNvbnRhaW4gb3VyIHNldHRpbmcncyB0ZXh0XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzVGV4dEVsZW0pO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGxhYmVsIGVsZW1lbnQgdG8gd3JhcCBvdXQgaW5wdXQgdHlwZVxuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zcGlubmVyKTtcbiAgICAgICAgICAgIC8vIHNldHVwIG9uY2hhbmdlXG4gICAgICAgICAgICB0aGlzLnNwaW5uZXIub25jaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dEVsZW0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChpbnB1dEVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBDb3VsZCBub3QgcGFyc2UgdmFsdWUgY2hhbmdlIGludG8gYSB2YWxpZCBudW1iZXIgLSB2YWx1ZSB3YXMgJHtpbnB1dEVsZW0udmFsdWV9LCByZXNldHRpbmcgdmFsdWUgdG8gJHt0aGlzLnNldHRpbmcubWlufWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLm51bWJlciAhPT0gdGhpcy5zZXR0aW5nLm1pbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLm51bWJlciA9IHRoaXMuc2V0dGluZy5taW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcubnVtYmVyICE9PSBwYXJzZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLm51bWJlciA9IHBhcnNlZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnVwZGF0ZVVSTFBhcmFtcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbnVtYmVyIGluIHRoZSBzcGlubmVyICh3aWxsIGJlIGNsYW1wZWQgd2l0aGluIHJhbmdlKS5cbiAgICAgKi9cbiAgICBzZXQgbnVtYmVyKG5ld051bWJlcikge1xuICAgICAgICB0aGlzLnNwaW5uZXIudmFsdWUgPSB0aGlzLnNldHRpbmcuY2xhbXAobmV3TnVtYmVyKS50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdmFsdWVcbiAgICAgKi9cbiAgICBnZXQgbnVtYmVyKCkge1xuICAgICAgICByZXR1cm4gK3RoaXMuc3Bpbm5lci52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0gbGFiZWwgLSBzZXR0aW5nIGxhYmVsLlxuICAgICAqL1xuICAgIHNldCBsYWJlbChpbkxhYmVsKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NUZXh0RWxlbS5pbm5lclRleHQgPSBpbkxhYmVsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0O1xuICAgIH1cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLnNwaW5uZXIuZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuc3Bpbm5lci5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdVSU51bWJlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgU2V0dGluZ1VJQmFzZSB9IGZyb20gJy4vU2V0dGluZ1VJQmFzZSc7XG5leHBvcnQgY2xhc3MgU2V0dGluZ1VJT3B0aW9uIGV4dGVuZHMgU2V0dGluZ1VJQmFzZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZykge1xuICAgICAgICBzdXBlcihzZXR0aW5nKTtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdGhpcy5zZXR0aW5nLm9wdGlvbnM7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNldHRpbmcuc2VsZWN0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBnZXQgc2V0dGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmc7XG4gICAgfVxuICAgIGdldCBzZWxlY3RvcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yLmNsYXNzTGlzdC5hZGQoJ2Zvcm0tY29udHJvbCcpO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3Mtb3B0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdG9yO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NUZXh0RWxlbSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc1RleHRFbGVtKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0udGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzVGV4dEVsZW07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGxhYmVsIC0gc2V0dGluZyBsYWJlbC5cbiAgICAgKi9cbiAgICBzZXQgbGFiZWwoaW5MYWJlbCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0ID0gaW5MYWJlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGxhYmVsXG4gICAgICovXG4gICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHJvb3QgZGl2IHdpdGggXCJzZXR0aW5nXCIgY3NzIGNsYXNzXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSB0aGlzLnNldHRpbmcuaWQ7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmb3JtLWdyb3VwJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgdG8gY29udGFpbiBvdXIgc2V0dGluZydzIHRleHRcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NUZXh0RWxlbSk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbGFiZWwgZWxlbWVudCB0byB3cmFwIG91dCBpbnB1dCB0eXBlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQod3JhcHBlckxhYmVsKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBzZWxlY3QgZWxlbWVudFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rvci50aXRsZSA9IHRoaXMuc2V0dGluZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHdyYXBwZXJMYWJlbC5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdG9yKTtcbiAgICAgICAgICAgIC8vIHNldHVwIG9uIGNoYW5nZSBmcm9tIHNlbGVjdG9yXG4gICAgICAgICAgICB0aGlzLnNlbGVjdG9yLm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2VsZWN0ZWQgIT09IHRoaXMuc2VsZWN0b3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNlbGVjdGVkID0gdGhpcy5zZWxlY3Rvci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnVwZGF0ZVVSTFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBCbG9jayBrZXlwcmVzcy91cC9kb3duIHByb3BvZ2F0aW9uIGZyb20gdGV4dCBmaWVsZCB0eXBpbmcgZ29pbmcgdG8gVUVcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rvci5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgc2V0IG9wdGlvbnModmFsdWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnNlbGVjdG9yLm9wdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IucmVtb3ZlKGkpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgICAgICBvcHQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIG9wdC5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuc2VsZWN0b3Iub3B0aW9uc10ubWFwKChvKSA9PiBvLnZhbHVlKTtcbiAgICB9XG4gICAgc2V0IHNlbGVjdGVkKHZhbHVlKSB7XG4gICAgICAgIC8vIEEgdXNlciBtYXkgbm90IHNwZWNpZnkgdGhlIGZ1bGwgcG9zc2libGUgdmFsdWUgc28gd2UgaW5zdGVhZCB1c2UgdGhlIGNsb3Nlc3QgbWF0Y2guXG4gICAgICAgIC8vIGVnID94eHg9SDI2NCB3b3VsZCBzZWxlY3QgJ0gyNjQgbGV2ZWwtYXN5bW1ldHJ5LWFsbG93ZWQ9MTtwYWNrZXRpemF0aW9uLW1vZGU9MTtwcm9maWxlLWxldmVsLWlkPTQyMDAxZidcbiAgICAgICAgY29uc3QgZmlsdGVyZWRMaXN0ID0gdGhpcy5vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uaW5kZXhPZih2YWx1ZSkgIT09IC0xKTtcbiAgICAgICAgaWYgKGZpbHRlcmVkTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IudmFsdWUgPSBmaWx0ZXJlZExpc3RbMF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHNlbGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rvci52YWx1ZTtcbiAgICB9XG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdVSU9wdGlvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgU2V0dGluZ1VJQmFzZSB9IGZyb20gJy4vU2V0dGluZ1VJQmFzZSc7XG5leHBvcnQgY2xhc3MgU2V0dGluZ1VJVGV4dCBleHRlbmRzIFNldHRpbmdVSUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmcpIHtcbiAgICAgICAgc3VwZXIoc2V0dGluZyk7XG4gICAgICAgIHRoaXMubGFiZWwgPSB0aGlzLnNldHRpbmcubGFiZWw7XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMuc2V0dGluZy50ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBjb21wb25lbnQuXG4gICAgICovXG4gICAgZ2V0IHNldHRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NUZXh0RWxlbSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc1RleHRFbGVtKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0udGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzVGV4dEVsZW07XG4gICAgfVxuICAgIGdldCB0ZXh0Ym94KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3RleHRib3gpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHRib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgICAgdGhpcy5fdGV4dGJveC5jbGFzc0xpc3QuYWRkKCdmb3JtLWNvbnRyb2wnKTtcbiAgICAgICAgICAgIHRoaXMuX3RleHRib3gudHlwZSA9ICd0ZXh0Ym94JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dGJveDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHJvb3QgZGl2IHdpdGggXCJzZXR0aW5nXCIgY3NzIGNsYXNzXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSB0aGlzLnNldHRpbmcuaWQ7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgdG8gY29udGFpbiBvdXIgc2V0dGluZydzIHRleHRcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NUZXh0RWxlbSk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbGFiZWwgZWxlbWVudCB0byB3cmFwIG91dCBpbnB1dCB0eXBlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQod3JhcHBlckxhYmVsKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBpbnB1dCB0eXBlPWNoZWNrYm94XG4gICAgICAgICAgICB0aGlzLnRleHRib3gudGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgICAgICB3cmFwcGVyTGFiZWwuYXBwZW5kQ2hpbGQodGhpcy50ZXh0Ym94KTtcbiAgICAgICAgICAgIC8vIHNldHVwIG9uIGNoYW5nZSBmcm9tIGNoZWNrYm94XG4gICAgICAgICAgICB0aGlzLnRleHRib3guYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnRleHQgIT09IHRoaXMudGV4dGJveC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcudGV4dCA9IHRoaXMudGV4dGJveC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnVwZGF0ZVVSTFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQmxvY2sga2V5cHJlc3MvdXAvZG93biBwcm9wb2dhdGlvbiBmcm9tIHRleHQgZmllbGQgdHlwaW5nIGdvaW5nIHRvIFVFXG4gICAgICAgICAgICB0aGlzLnRleHRib3guYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0Ym94LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dGJveC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc2V0dGluZydzIHN0b3JlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gaW5WYWx1ZSAtIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqL1xuICAgIHNldCB0ZXh0KGluVmFsdWUpIHtcbiAgICAgICAgdGhpcy50ZXh0Ym94LnZhbHVlID0gaW5WYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHZhbHVlXG4gICAgICovXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRib3gudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGxhYmVsIC0gc2V0dGluZyBsYWJlbC5cbiAgICAgKi9cbiAgICBzZXQgbGFiZWwoaW5MYWJlbCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0ID0gaW5MYWJlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGxhYmVsXG4gICAgICovXG4gICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dDtcbiAgICB9XG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy50ZXh0Ym94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLnRleHRib3guZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nVUlUZXh0LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBBY3Rpb25PdmVybGF5IH0gZnJvbSAnLi9BY3Rpb25PdmVybGF5Jztcbi8qKlxuICogU2hvdyBhbiBvdmVybGF5IGZvciB3aGVuIHRoZSBzZXNzaW9uIGlzIHVuYXR0ZW5kZWQsIGl0IGJlZ2lucyBhIGNvdW50ZG93biB0aW1lciwgd2hpY2ggd2hlbiBlbGFwc2VkIHdpbGwgZGlzY29ubmVjdCB0aGUgc3RyZWFtLlxuICovXG5leHBvcnQgY2xhc3MgQUZLT3ZlcmxheSBleHRlbmRzIEFjdGlvbk92ZXJsYXkge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvb3QgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXkuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBhZmtPdmVybGF5SHRtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBhZmtPdmVybGF5SHRtbC5pZCA9ICdhZmtPdmVybGF5JztcbiAgICAgICAgYWZrT3ZlcmxheUh0bWwuY2xhc3NOYW1lID0gJ2NsaWNrYWJsZVN0YXRlJztcbiAgICAgICAgcmV0dXJuIGFma092ZXJsYXlIdG1sO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZW50IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LCB3aGljaCBjb250YWluIHNvbWUgdGV4dCBmb3IgYW4gYWZrIGNvdW50IGRvd24uXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBhZmtPdmVybGF5SHRtbElubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGFma092ZXJsYXlIdG1sSW5uZXIuaWQgPSAnYWZrT3ZlcmxheUlubmVyJztcbiAgICAgICAgYWZrT3ZlcmxheUh0bWxJbm5lci5pbm5lckhUTUwgPVxuICAgICAgICAgICAgJzxjZW50ZXI+Tm8gYWN0aXZpdHkgZGV0ZWN0ZWQ8YnI+RGlzY29ubmVjdGluZyBpbiA8c3BhbiBpZD1cImFma0NvdW50RG93bk51bWJlclwiPjwvc3Bhbj4gc2Vjb25kczxicj5DbGljayB0byBjb250aW51ZTxicj48L2NlbnRlcj4nO1xuICAgICAgICByZXR1cm4gYWZrT3ZlcmxheUh0bWxJbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGFuIEFmayBvdmVybGF5XG4gICAgICogQHBhcmFtIHBhcmVudEVsZW1lbnQgLSB0aGUgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdERpdikge1xuICAgICAgICBzdXBlcihyb290RGl2LCBBRktPdmVybGF5LmNyZWF0ZVJvb3RFbGVtZW50KCksIEFGS092ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGNvdW50IGRvd24gc3BhbnMgbnVtYmVyIGZvciB0aGUgb3ZlcmxheVxuICAgICAqIEBwYXJhbSBjb3VudGRvd24gLSB0aGUgY291bnQgZG93biBudW1iZXIgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BhbiBmb3IgdXBkYXRpbmdcbiAgICAgKi9cbiAgICB1cGRhdGVDb3VudGRvd24oY291bnRkb3duKSB7XG4gICAgICAgIHRoaXMudGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gYDxjZW50ZXI+Tm8gYWN0aXZpdHkgZGV0ZWN0ZWQ8YnI+RGlzY29ubmVjdGluZyBpbiA8c3BhbiBpZD1cImFma0NvdW50RG93bk51bWJlclwiPiR7Y291bnRkb3dufTwvc3Bhbj4gc2Vjb25kczxicj5DbGljayB0byBjb250aW51ZTxicj48L2NlbnRlcj5gO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFGS092ZXJsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgT3ZlcmxheUJhc2UgfSBmcm9tICcuL0Jhc2VPdmVybGF5Jztcbi8qKlxuICogQ2xhc3MgZm9yIHRoZSBiYXNlIGFjdGlvbiBvdmVybGF5IHN0cnVjdHVyZVxuICovXG5leHBvcnQgY2xhc3MgQWN0aW9uT3ZlcmxheSBleHRlbmRzIE92ZXJsYXlCYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYW4gYWN0aW9uIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gcm9vdERpdiAtIHRoZSByb290IGVsZW1lbnQgdGhpcyBvdmVybGF5IHdpbGwgYmUgaW5zZXJ0ZWQgaW50b1xuICAgICAqIEBwYXJhbSByb290RWxlbWVudCAtIHRoZSByb290IGVsZW1lbnQgdGhhdCBpcyB0aGUgb3ZlcmxheVxuICAgICAqIEBwYXJhbSBjb250ZW50RWxlbWVudCAtIGFuIGVsZW1lbnQgdGhhdCBjb250YWlucyB0ZXh0IGZvciB0aGUgYWN0aW9uIG92ZXJsYXlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihyb290RGl2LCByb290RWxlbWVudCwgY29udGVudEVsZW1lbnQpIHtcbiAgICAgICAgc3VwZXIocm9vdERpdiwgcm9vdEVsZW1lbnQsIGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5vbkFjdGlvbkNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLyBMb2dnZXIuSW5mbygnRGlkIHlvdSBmb3JnZXQgdG8gc2V0IHRoZSBvbkFjdGlvbiBjYWxsYmFjayBpbiB5b3VyIG92ZXJsYXk/Jyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgdGV4dCBvdmVybGF5cyBpbm5lciB0ZXh0XG4gICAgICogQHBhcmFtIHRleHQgLSB0aGUgdXBkYXRlIHRleHQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIHVwZGF0ZSh0ZXh0KSB7XG4gICAgICAgIGlmICh0ZXh0ICE9IG51bGwgfHwgdGV4dCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgYSBtZXRob2QgYXMgYW4gZXZlbnQgZW1pdHRlciBjYWxsYmFja1xuICAgICAqIEBwYXJhbSBjYWxsQmFjayAtIHRoZSBtZXRob2QgdGhhdCBpcyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZW1pdHRlZFxuICAgICAqL1xuICAgIG9uQWN0aW9uKGNhbGxCYWNrKSB7XG4gICAgICAgIHRoaXMub25BY3Rpb25DYWxsYmFjayA9IGNhbGxCYWNrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZSBhbiBldmVudCB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBldmVudCBlbWl0dGVyXG4gICAgICovXG4gICAgYWN0aXZhdGUoKSB7XG4gICAgICAgIHRoaXMub25BY3Rpb25DYWxsYmFjaygpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjdGlvbk92ZXJsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQ2xhc3MgZm9yIHRoZSBiYXNlIG92ZXJsYXkgc3RydWN0dXJlXG4gKi9cbmV4cG9ydCBjbGFzcyBPdmVybGF5QmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGFuIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gcm9vdERpdiAtIHRoZSByb290IGVsZW1lbnQgdGhpcyBvdmVybGF5IHdpbGwgYmUgaW5zZXJ0ZWQgaW50b1xuICAgICAqIEBwYXJhbSByb290RWxlbWVudCAtIHRoZSByb290IGVsZW1lbnQgdGhhdCBpcyB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvb3REaXYsIHJvb3RFbGVtZW50LCB0ZXh0RWxlbWVudCkge1xuICAgICAgICB0aGlzLnJvb3REaXYgPSByb290RGl2O1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50ID0gcm9vdEVsZW1lbnQ7XG4gICAgICAgIHRoaXMudGV4dEVsZW1lbnQgPSB0ZXh0RWxlbWVudDtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRleHRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHRoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLnJvb3RFbGVtZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuU3RhdGUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGlkZSB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuU3RhdGUnKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXNlT3ZlcmxheS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgQWN0aW9uT3ZlcmxheSB9IGZyb20gJy4vQWN0aW9uT3ZlcmxheSc7XG4vKipcbiAqIE92ZXJsYXkgc2hvd24gZHVyaW5nIGNvbm5lY3Rpb24sIGhhcyBhIGJ1dHRvbiB0aGF0IGNhbiBiZSBjbGlja2VkIHRvIGluaXRpYXRlIGEgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbm5lY3RPdmVybGF5IGV4dGVuZHMgQWN0aW9uT3ZlcmxheSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgcm9vdCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbm5lY3RFbGVtLmlkID0gJ2Nvbm5lY3RPdmVybGF5JztcbiAgICAgICAgY29ubmVjdEVsZW0uY2xhc3NOYW1lID0gJ2NsaWNrYWJsZVN0YXRlJztcbiAgICAgICAgcmV0dXJuIGNvbm5lY3RFbGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZW50IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LCB3aGljaCBjb250YWluIHdoYXRldmVyIGNvbnRlbnQgdGhpcyBlbGVtZW50IGNvbnRhaW5zLCBsaWtlIHRleHQgb3IgYSBidXR0b24uXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBjb25uZWN0Q29udGVudEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29ubmVjdENvbnRlbnRFbGVtLmlkID0gJ2Nvbm5lY3RCdXR0b24nO1xuICAgICAgICBjb25uZWN0Q29udGVudEVsZW0uaW5uZXJIVE1MID0gJ0NsaWNrIHRvIHN0YXJ0JztcbiAgICAgICAgcmV0dXJuIGNvbm5lY3RDb250ZW50RWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgY29ubmVjdCBvdmVybGF5IHdpdGggYSBjb25uZWN0aW9uIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbSAtIHRoZSBwYXJlbnQgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudEVsZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50RWxlbSwgQ29ubmVjdE92ZXJsYXkuY3JlYXRlUm9vdEVsZW1lbnQoKSwgQ29ubmVjdE92ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgICAgIC8vIGFkZCB0aGUgbmV3IGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbm5lY3RPdmVybGF5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBBY3Rpb25PdmVybGF5IH0gZnJvbSAnLi9BY3Rpb25PdmVybGF5Jztcbi8qKlxuICogT3ZlcmxheSBzaG93biBkdXJpbmcgZGlzY29ubmVjdGlvbiwgaGFzIGEgcmVjb25uZWN0aW9uIGVsZW1lbnQgdGhhdCBjYW4gYmUgY2xpY2tlZCB0byByZWNvbm5lY3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNjb25uZWN0T3ZlcmxheSBleHRlbmRzIEFjdGlvbk92ZXJsYXkge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvb3QgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXkuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBkaXNjb25uZWN0T3ZlcmxheUh0bWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGlzY29ubmVjdE92ZXJsYXlIdG1sLmlkID0gJ2Rpc2Nvbm5lY3RPdmVybGF5JztcbiAgICAgICAgZGlzY29ubmVjdE92ZXJsYXlIdG1sLmNsYXNzTmFtZSA9ICdjbGlja2FibGVTdGF0ZSc7XG4gICAgICAgIHJldHVybiBkaXNjb25uZWN0T3ZlcmxheUh0bWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRlbnQgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXksIHdoaWNoIGNvbnRhaW4gd2hhdGV2ZXIgY29udGVudCB0aGlzIGVsZW1lbnQgY29udGFpbnMsIGxpa2UgdGV4dCBvciBhIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlQ29udGVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBpbm5lciBodG1sIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBkaXNjb25uZWN0T3ZlcmxheUh0bWxDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGlzY29ubmVjdE92ZXJsYXlIdG1sQ29udGFpbmVyLmlkID0gJ2Rpc2Nvbm5lY3RCdXR0b24nO1xuICAgICAgICBkaXNjb25uZWN0T3ZlcmxheUh0bWxDb250YWluZXIuaW5uZXJIVE1MID0gJ0NsaWNrIFRvIFJlc3RhcnQnO1xuICAgICAgICByZXR1cm4gZGlzY29ubmVjdE92ZXJsYXlIdG1sQ29udGFpbmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBkaXNjb25uZWN0IG92ZXJsYXkgd2l0aCBhIHJldHJ5IGNvbm5lY3Rpb24gaWNvbi5cbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbSAtIHRoZSBwYXJlbnQgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudEVsZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50RWxlbSwgRGlzY29ubmVjdE92ZXJsYXkuY3JlYXRlUm9vdEVsZW1lbnQoKSwgRGlzY29ubmVjdE92ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgICAgIC8vIGFkZCB0aGUgbmV3IGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpc2Nvbm5lY3RPdmVybGF5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBUZXh0T3ZlcmxheSB9IGZyb20gJy4vVGV4dE92ZXJsYXknO1xuLyoqXG4gKiBHZW5lcmljIG92ZXJsYXkgdXNlZCB0byBzaG93IHRleHR1YWwgZXJyb3IgaW5mbyB0byB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEVycm9yT3ZlcmxheSBleHRlbmRzIFRleHRPdmVybGF5IHtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCByb290IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVSb290RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZXJyb3JPdmVybGF5SHRtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlcnJvck92ZXJsYXlIdG1sLmlkID0gJ2Vycm9yT3ZlcmxheSc7XG4gICAgICAgIGVycm9yT3ZlcmxheUh0bWwuY2xhc3NOYW1lID0gJ3RleHREaXNwbGF5U3RhdGUnO1xuICAgICAgICByZXR1cm4gZXJyb3JPdmVybGF5SHRtbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGVudCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheSwgd2hpY2ggY29udGFpbiB3aGF0ZXZlciBjb250ZW50IHRoaXMgZWxlbWVudCBjb250YWlucywgbGlrZSB0ZXh0IG9yIGEgYnV0dG9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZXJyb3JPdmVybGF5SHRtbElubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVycm9yT3ZlcmxheUh0bWxJbm5lci5pZCA9ICdlcnJvck92ZXJsYXlJbm5lcic7XG4gICAgICAgIHJldHVybiBlcnJvck92ZXJsYXlIdG1sSW5uZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGNvbm5lY3Qgb3ZlcmxheSB3aXRoIGEgY29ubmVjdGlvbiBidXR0b24uXG4gICAgICogQHBhcmFtIHBhcmVudEVsZW0gLSB0aGUgcGFyZW50IGVsZW1lbnQgdGhpcyBvdmVybGF5IHdpbGwgYmUgaW5zZXJ0ZWQgaW50by5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRFbGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudEVsZW0sIEVycm9yT3ZlcmxheS5jcmVhdGVSb290RWxlbWVudCgpLCBFcnJvck92ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJyb3JPdmVybGF5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBUZXh0T3ZlcmxheSB9IGZyb20gJy4vVGV4dE92ZXJsYXknO1xuLyoqXG4gKiBHZW5lcmljIG92ZXJsYXkgdXNlZCB0byBzaG93IHRleHR1YWwgaW5mbyB0byB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEluZm9PdmVybGF5IGV4dGVuZHMgVGV4dE92ZXJsYXkge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvb3QgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXkuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBpbmZvT3ZlcmxheUh0bWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaW5mb092ZXJsYXlIdG1sLmlkID0gJ2luZm9PdmVybGF5JztcbiAgICAgICAgaW5mb092ZXJsYXlIdG1sLmNsYXNzTmFtZSA9ICd0ZXh0RGlzcGxheVN0YXRlJztcbiAgICAgICAgcmV0dXJuIGluZm9PdmVybGF5SHRtbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGVudCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheSwgd2hpY2ggY29udGFpbiB3aGF0ZXZlciBjb250ZW50IHRoaXMgZWxlbWVudCBjb250YWlucywgbGlrZSB0ZXh0IG9yIGEgYnV0dG9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgaW5mb092ZXJsYXlIdG1sSW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaW5mb092ZXJsYXlIdG1sSW5uZXIuaWQgPSAnbWVzc2FnZU92ZXJsYXlJbm5lcic7XG4gICAgICAgIHJldHVybiBpbmZvT3ZlcmxheUh0bWxJbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgY29ubmVjdCBvdmVybGF5IHdpdGggYSBjb25uZWN0aW9uIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbSAtIHRoZSBwYXJlbnQgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudEVsZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50RWxlbSwgSW5mb092ZXJsYXkuY3JlYXRlUm9vdEVsZW1lbnQoKSwgSW5mb092ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5mb092ZXJsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEFjdGlvbk92ZXJsYXkgfSBmcm9tICcuL0FjdGlvbk92ZXJsYXknO1xuLyoqXG4gKiBPdmVybGF5IHNob3duIHdoZW4gc3RyZWFtIGlzIHJlYWR5IHRvIHBsYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5T3ZlcmxheSBleHRlbmRzIEFjdGlvbk92ZXJsYXkge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvb3QgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXkuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBwbGF5RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBwbGF5RWxlbS5pZCA9ICdwbGF5T3ZlcmxheSc7XG4gICAgICAgIHBsYXlFbGVtLmNsYXNzTmFtZSA9ICdjbGlja2FibGVTdGF0ZSc7XG4gICAgICAgIHJldHVybiBwbGF5RWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGVudCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheSwgd2hpY2ggY29udGFpbiB3aGF0ZXZlciBjb250ZW50IHRoaXMgZWxlbWVudCBjb250YWlucywgbGlrZSB0ZXh0IG9yIGEgYnV0dG9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgLy8gdG9kbzogY2hhbmdlIHRoaXMgdG8gYW4gc3ZnXG4gICAgICAgIGNvbnN0IHBsYXlPdmVybGF5SHRtbElubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgIHBsYXlPdmVybGF5SHRtbElubmVyLmlkID0gJ3BsYXlCdXR0b24nO1xuICAgICAgICBwbGF5T3ZlcmxheUh0bWxJbm5lci5zcmMgPVxuICAgICAgICAgICAgJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBUEVBQUFENUNBWUFBQUQybU5Oa0FBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQUFBWmRFVllkRk52Wm5SM1lYSmxBSEJoYVc1MExtNWxkQ0EwTGpBdU1qSHhJR21WQUFBU2drbEVRVlI0WHUyZEM3QmRWWDJIcVVDQ0lSQVNDUGpBRklRUkVCUkJCU1JZYkZPdDhsSXJGVVdSRnFYV3NUNXdiSXRVcUZXczBLcUlNUEtvWUVXcFJTMDZLRGpTMUJlVkZrVlFiQ3crd0NmaUF3R2hDS1dQOVB1WnRVMjR1VGU1OXp6MjJZL3ZtL25Ha1h0ejdqbHJyOStzZGZaZWEvMDNXYjE2OVF0eEdXNjJpWWkwRDhMN05id1lqOEVkY2RQeUl4RnBBNFQyUC9GLzhVYThDSS9HaFBuWHlxK0lTSk1ockFseHhYOWhSdVlMOFNoOFNQazFFV2txQkhYZEVGZmNnNnZ3M2ZoczNLYjh1b2cwRFFJNlhZZ3I4ck92WXNKOE9NNHYvMHhFbWtJSjZvYjRQOHpJZkFOZWdDdlFNSXMwQlFLNXNSQlhKTXkvd0l6TTUrQnlYRkJlUmtRbUJVR2NiWWpYNVM1TW1NL0FBM0NMOG5JaVVqY0VjSkFRVjl5Qlg4YS93U2VpejVoRjZvYmdEUlBpa0dmTUNmT1g4RFRjdTd5MGlOUUJvUnMyeEJYL2czZGl3dndtM0tuOENSRVpKNFJ0VkNHdXFNS2N1OWtuNHhKMDlaZkl1Q0Jnb3c1eHlKM3NUTE56QXl3cndGNkoyNk5oRmhrMUJHc2NJVjZYaFBsdXZBNlB4eDNLbnhhUlVVQ294aDNpaW9RNXo1bi9CWS9GSmVVdGlNZ3dFS2E2UWx5Uk1OK0huOEhuNFpibHJZaklJQkNpdWtNYzhwMjVXczZaTUQrenZCMFJtU3NFYUJJaG5rcmV3NVY0RUhyQ2lNaGNLQUZxQ3YrTmwrSit1QkM5bXkyeU1RaEtrMEpja2UvTTc4R3N5MDZZSDFUZXJvaE1oWUEwTWNRVlA4Tno4VURjQ2wyYkxUSVZndEhrRUZkOEQ4L0UvWEZyZEdRV3FTQVFiUWh4eUtPcG0vQjAzQWM5TWtna0VJYTJoTGdpTjc4UzVsUHgwYmdJdlFFbS9ZVUF0QzNFRlFuenpmZ251RGM2elpaK1FzZHZhNGpYNVN2NGF0d1hIWm1sWDlEaHV4RGlrQzJRbjhkWFlVYm1SZVVqaW5RYk9udFhRbHlSVFJhZndsZGd3cnhWK2FnaTNZUk8zclVRVi93Y1YrTEw4REhveVp6U1RlamNYUTF4UmM3L3VoeXpsM2t2M0x4OGRKRnVRS2Z1ZW9oRG5qRm5aUDRvL2o3bTBaUUg0RXMzb0RQM0ljUVYyZjZZTUYrQ09aamdVZWlaMmRKdTZNUjlDdkc2M0lMdng0ek1DZk84MGlRaTdZTE8yOWNRVjN3YjM0c3BzcjRydW1CRTJnV2R0dThoRGxuOTlTMU1YZVlYNE02bGVVU2FEeDNXRUs4bFJkWVQ1bFIvelBsZm5zd3B6WWVPYW9qWEo0Y1NmQjNQdytmZ3R1ZzBXNW9KbmRNUVQwL3VaR2VhWFpWeWZUWnVWNXBOcERuUU1RM3h4c2swTzlVZno4WkRjZHZTZkNLVGh3NXBpR2RQMmlvRjQ5NkpUMGMzV2Nqa0tSMVQ1a1lXakNUTTc4RGZRaGVNeU9TZ0F4cml3Y2gzNWxSL3ZBYlB3T1hvelMrcEh6cWVJUjZPYWwxMnd2eDJmQnk2eVVMcWd3NW5pRWREd3B5UitWcE1rZlhzbUhJcHA0d2ZPcG9oSGoyMzRSZndGTndEbldiTCtLQ0RHZUx4a0pINXAzZzF2ZzUzSzAwdU1scm9YSVo0dkdUQlNNSjhGZVprem1XbDZVVkdBNTNLRU5mRC9aaXlOQ215bnZPL0ZwZExJREljZENaRFhDOFptZk9kK2Qvd0plalpYekljZENKRFhEOTV4cHdqZG5QK1Y3NHpINFd1L3BMQm9QTVk0c21TTU4rRktiSitCQnBtbVJ0MEdrUGNEQkxtdS9GamVBaTZsRk5tQjUzRkVEZUhUTFB6YUNvajgwZHdCZnFNV1RZTW5jUVFONWVzQVBzdzdsY3VsOGo2MEVFTWNmUEpEYkQzWVU3bDNLeGNPcEUxMENrTWNUdklWRHZmbWMvRTNYRUx0UHFqR09LV2toVmdwK0dlbUREN3ZiblAwQUVNY1h0SmtmVTM0R054QVRveTl4RXV2Q0Z1UDZ2d0pNeU9xWVhsMGtwZjRLSWI0bTVRbmN5WlRSYXBaR0dZK3dJWDJ4QjNpM3Z4T3N3bWkxM1FhWGJYNFFJYjRtNlNZM2EvaU1kaDdtWWI1cTdDaFRYRTNhWGFhTEVTcTdyTVc1WkxMMTJCaTJxSSs4RTllRGttekx1aFllNEtYRXhEM0I4eU10K09sK0tMMENMclhZQ0xhSWo3UjhKOEsxNkNSNlBMT2RzTUY4OFE5NWZzbVBvUlhvelB4ZHpOZHZWWDIrQ2lHV0xKemErRU9YV1pqOFNkMEFQdzJ3SVh5eEJMcVBZeTM0TG5ZOEs4REExejArRWlHV0taU2dKOUk3NExVMlI5UjNTYTNWUzRPSVpZWnFKYXlua1dwc2o2dzB1M2tTYkJoVEhFc2pIdXd4c3dwVndQdzZXbCswZ1Q0SUlZWXBrTm1XS25yMXlQcWY1NEtHNVZ1cEZNa25KaFJHWkx3cHpWWDZuKytEWjhHcnBqYXBKd0FReXhERUxDbkIxVHFXVHgxL2dVZEdTZUJEUzhJWlpCU1pCanp2NzZQUDRWSG9TR3VVNW9jRU1zb3lCaFRzRzRWSDk4SXg2QTgwczNrM0ZDUXh0aUdTVlpNUElUL0N3bXpQdWh6NWpIQ1Exc2lHVWNaQ2xud3Z4cFBBWDNMRjFPUmcyTmE0aGxYR1NLblFVakNmTm44UFg0Q055MGREOFpCVFNvSVpaeGt6QlhJL1BuOEFUTXVtekRQQXBvU0VNc2RaRXc1enZ6RHpIVDdKZGp3dXpaWDhOQUF4cGltUVNaWmlmTW44VGo4YUdsUzhwY29mRU1zVXlLak13NWxUT25qSHdjYzJUUWt0STFaYmJRYUlaWUprM0NuRTBXR1ptdndPZWgrNWhuQzQxbGlLVXBWQ056d3Z3SlBCeTkrYlV4YUNSRExFMGpZYjRmVS8weDAreUQ4Y0dseThwVWFCeERMRTBrUWE3Q2ZDZm1NTDhEMFNOMnAwS2pHR0pwT2dsenRXZ2toL2s5Q1QxaXQ0TEdNTVRTRmhMbUxCckozZXh6Y0ovU2pmc05EV0dJcFkwazBEL0FNL0dScFR2M0V4ckFFRXVicVZhQW5ZNUxzWDkzcy9uUWhsaTZRTFVGOG5XWUkzYm5ZVCtXYy9KQkRiRjBoZXFPOWpmd2xmaEluSS9kRGpNZjBCQkxGMG1ZcjhOc3NraU5xUzJ3bTJIbWd4bGk2VEo1enB3amcvNFFkOGJ1TFJyaFF4bGk2UU01WmpkSEJoMkgrYzdjblVVamZCaERMSDBoVSt5N2NDVStIN09YZVY2SlFudmhReGhpNlJzSmMwYm15L0JaK01zYllDVVM3WU0zYjRpbHJ5VE0yUUw1UVV6QnVIeG5idDgwbXpkdGlFVldyNzROTDhLVWNrMlI5ZmFNekx4WlF5eXlob3pNV2NwNUlmNHVKc3pOUDV5QU4ybUlSUjVJVm4vZGpPZmhFZGpzdy94NGM0WllaSHJ5alBrbVBCc1B3WWVWMkRRTDNwZ2hGcG1aVExGelpGRENuTHJNejhEdHNUa2JMWGd6aGxoazR5VE0yY3U4Q3JOaktpTnp3ano1T2xPOENVTXNNamNTNXF6TGZndW15UHIySlU2VGdUZGdpRVVHb3lxeW5yck12NDJUT1RPYlAyeUlSUVluMCt3czVid2FVOHIxTjNIckVxOTY0QThhWXBIaFNaanZ3QlNNUzVnUHducldaZk9IRExISTZNZ3o1aHl4bTRKeGY0a0g0SGpEekI4d3hDS2pKMkhPTlB1ZjhjOXhIeHpQWG1aZTJCQ0xqSWRNc1dNcVdmd1Rub2lQd2RHT3pMeWdJUllaUHdselZXUHF0YmdYam1iQkNDOWtpRVhxSTgrWXM4bmljbndON2xhaU9EaThpQ0VXcVplTXlsbVhuVENuWUZ4TzV0eXhSSEx1OEk4TnNjaGtTSml6THZ2N21KSDVwYmdZNTdaamluOWdpRVVtU3pVeWZ3OVRaUDFZM0xaRWRPUHd5NFpZcEJra3pLbisrQjM4S0I2RjI1V296Z3kvWkloRm1rWENuTE8vdm9zZndwd3lzcWhFZG4zNG9TRVdhU1lKOHk4dzArd1A0R0c0L29JUi9xTWhGbWsyVlpnenpVNllzMk5xN1Q1bS9vOGhGbWtIQ1hPMlB5Yk1GK08rK0NCRExOSXVFdVNzeTg1MzVsdnhaRU1zMGo2cVdzelpKYlhVRUl1MGkxdndyWmhxRlp2NW5WaWtQV1RxZkE1bUY5UUREK2ZqUHhoaWtlYVI3Nzd4ZHJ3QW4xQWl1ejc4MEJDTE5JdnNkTXFCQXFrTnRSdzNYQmVLWHpERUlwTW5vMjdDZXpkZWlrL0dCU1dtRzRaZk5NUWlreVBoelhycFZHWE02UjhyY0c3bFZma0hobGlrZmhMZTdGektvNktWK0h1NDVtN3pYT0VmR21LUmVza2U0b1QzazNnTWJsbmlPQmk4Z0NFV3FZZU12RC9HSy9GNDNLSEVjRGg0SVVNc01sNXl3K3BIbUxPb1g0YURIOFV6SGJ5Z0lSWVpEL25lbTVIM0tqd0JkOExSVjFIa1JRMnh5R2pKM2VhY05aMWlheWZocitQNDZobno0b1pZWkRSazJwendwaDdUWCtDdU9QNzZ4ZndSUXl3eUhObFZWSVgzVkh4OGlWYzk4QWNOc2NqZ1pKRkd5cHErR2ZmSHdaNzFEZ04vMUJDTHpKMmY0Ny9pV3pCbFRJZDcxanNNL0hGRExESTdjcmY1SHJ3RzM0WUhZNzBGeGFlRE4yR0lSVFpNd3B2amNLN0ZkK0JUY2ZMaHJlRE5HR0tSbWNuSWV6MitFdy9GaFRpM01pdmpoamRraUVYV0owZkVmaFhQd21maTRoS1o1c0diTThRaWE4bjY1bFg0TGt6bGhZZVZxRFFYM3FRaEZsbnpyUGMvOEZ6TXRzQmwyS3hwODB6d1JnMng5SjBjeG40ZXBvQlpsa2pXLzZ4M0dIakRobGo2U0paSTVnVEo5K0R6TWVIZHZNU2lYZkRHRGJIMGlXcGJZTXFnSkx5N1lMdEczcW53QVF5eDlJVnNDN3dFWDRDNzQvaDJGdFVKSDhRUVM5ZkpVVGc1UWZJNDNBUG5sZTdmRGZoQWhsaTZTbzUvL1JpK0dCUGV5YTF2SGlkOE1FTXNYU01IMFgwQ1g0Sjc0Y0xTM2JzSkg5QVFTMWZJVGF2czZmMVZlTEVkejNxSGdROXBpS1h0WkhOQzFqZm5FTHBmVHB1eCsrR3Q0TU1hWW1rcm1UWi9HVitMQ1crM3A4MHp3UWMzeE5JMnNrVHlCc3doZEh0aWM3WUZUZ0lhd0JCTG03Z1JUOEhINGRiWW4ybnpUTkFJaGxqYVFDcmt2d2tUM3R5d0d2OHBrbTJCeGpERTBsUnlva2JPc2pvRFV5RS9ONndNNzFSb0ZFTXNUU1BodlJQZmpZL0dCZWkwZVNab0hFTXNUZUoyL0FEdWcrM2NWVlEzTkpRaGxpYVFrZmNmOFNub3FEc1hhREJETEpNaWo0cnV4Y3Z3YWVqSU93ZzBuQ0dXdXNueXlJVDNDandNKzdsSVkxVFFnSVpZNmlBM3F6THlabWRSU24wZWljMDlRYkpOMEpDR1dNWkp3cHVSOXc3OEVyNFF1N2tsY0ZMUW9JWll4a1hxOU9adWMyb1daWE5DdjVkSGpnc2ExaERMcUtuQ20ycUIyWnp3ME5MZFpCelF3SVpZUmtXbXpUL0RoUGRFM0tWME14a25OTFFobG1ISjk5NkVOd1hIc2praHE2eGNIbGtYTkxZaGxrRkplSFBES2h2eXN6a2g0VzMzOGE5dGhFWTN4REpYOHFnb0d4TVMzdFRwZlN6T0wxMUs2b2JHTjhReVd4TGVMSS9NdERtbFB2ZEhwODJUaG90Z2lHVTJaT1N0d3JzQ1hTTFpGTGdZaGxnMnhGMlljNnpPeHFlakN6V2FCaGZGRU10MHBNajJWekIxZWcvQkphWExTTlBnNGhoaXFjamQ1aXpVU0lYOGxQcDhGaTR0WFVXYUNoZkpFRXRJaGZ3VTJiNFFVMlI3TzNSZmJ4dmdRaG5pZnBPRDE3K0pDVzlLZlM1Rjd6aTNDUzZZSWU0bk9YajlXL2gzZUF3K3ZIUUphUnRjUEVQY0wvS3M5MmE4Q0kvRlhkRnBjNXZoQWhyaS92QjkvSHY4QTN3VXVrU3lDM0FoRFhIMytTbitBeDZQcVpEdkVza3V3UVUxeE4ya09nb25KMGltMUdjMkoyeFJMcnQwQ1M2c0llNFcxYzZpajJORzNsUk9tRmN1dDNRUkxyQWg3ZzRKNzVYNFI3ZzNHdDQrd0lVMnhPMG4wK1pQNGFzd0JjZGMzOXdudU9DR3VMM2tXZS9uOERXNEx5NHFsMVg2QkJmZUVMZVRMK0FKK0FUY0JuM1cyMWU0K0lhNFBlU084OWZ3VC9HSnVBaGRJdGwzNkFTR3VQbGtaOUczOGZXWW8zQXk4aHBlV1FPZHdSQTNseHdCZXhPK0dWUHEwN0luc2o1MERFUGNUTEsrK2UyWWM2d1dvOTk1Wlhyb0hJYTRXZHlLT1Fwbk9XYmF2R201VkNMVFF5Y3h4TTBncDBpZWowL0czTEF5dkRJNzZDeUdlSEpVeCtHOEh3OUV3eXR6aDA1amlDZEREcUs3SEEvQWhlaDNYaGtNT284aHJwZTA5NmZ4ZDlEOXZESThwVlBKK0xrWFA0dlBRYWZNTWpyb1VJWjRmT1E3YjlZM1g0VTV4OG9pMnpKNjZGaUdlUFJrZVdST2tmd2lIb2VlM1N6amd3NW1pRWREUnQxNEQrYnc5WmZqRHFXWlJjWUhIYzBRRDA5MUZFNk9nUDB6OU9CMXFRODZteUVlbkt4dFRuZ3o4cjRCSFhtbGZ1aDRobmp1Skx3cDlabHFnYWZoN3FVNVJlcUhEbWlJWjArbXpWa2VlUU8rRlI5Zm1sRmtjdEFSRGZIc1NKM2VmOGRxWjVHSDBFa3pvRE1hNHBuSjNlYTBUMDdUT0FlenZubEJhVHFSWmxBNnFUeVFoRGRybTFmaEJYZ3dHbDVwSm5ST1E3eVc2amx2d3Z0ZWZBWnVYcHBLcEptVVRpdHJwODBwOVpuMXpROHVUU1RTYk9pc2ZROXhwczJwa0ovd1BoZTNLMDBqMGc3b3RIME44ZjM0ZFh3ZkhvMFcyWloyUXVmdFk0aXpQREtuYWJ3SUg0RWUveXJ0aFE3Y2x4Qm5sZFVQOEJKOE1TYTg3dXVWOWtOSDducUljNFpWd3ZzaGZDa3VROE1yM1lFTzNkVVFaNG5rRC9IRG1GS2ZlNVNQTE5JdDZOeGRESEhDK3hGOEJhYnNpU092ZEJjNmVKZENmQnRlaGdsdmltejdyRmU2RHgyOUN5SE9RbzByOE5XWU9yMFcyWmIrUUlkdmE0aXpSRExQZWxkaTZ2U20xT2ZDOHJGRStnTWR2NDBoem51K0dsTWhmei9jRWowT1Ivb0puYjlOSWM1N3ZRWlB4Q2VoSTY5SUNVYlR5ZG5OMStMSm1QQXVLVzlmUkFoRWswT2NaNzNYWXc2aE93Zzl2MWxrS2dTanFTSE81b1JUOFRkd0ticStXV1E2Q0VlVFFwdzd6bG1vY1RxbVRtL09iN2JvbU1pR0lDUk5DSEdtelQvQnN6Q2xQalB5dXNwS1pEWVFsa21IK01mNHQ3Z2N0MGVuelNKemdkQk1Lc1FKNzBYNFZIVGtGUmtVd2xOM2lGTTU0WU40S0c2TEhrUW5NZ3lFcUs0UTUxbnZwWmp3WnVRMXZDS2pnRERWRWVJcjhYQk1lTDNiTERKS0NOVzRRcHlSOXpvOEFyZEJiMWlKakFQQ05lb1FKN3lwRm5nc3prYzNKb2lNRTBJMnFoRG5XVzhLanYweHVqRkJwQzRJM0RBaHpncXJIRVNYVXAvWjAvdVE4cklpVWhjRWI1QVFKN3ozNFRmd0pOeTV2SnlJMUEwQm5HMklFOXlZc2lmZndUZml6dWgzWHBGSlFnaG5FK0o4MzAxNHY0dXBrTDhyK3FoSXBBa1F4ZzJGT09ITnp6TnRQaGYzUkVkZWtTWlJRanFWVEp0emd1U05lRDRlV0g1ZFJKb0dBWjBhNHJ2eG0zZ2hya0NuelNKTmhwQldJYzcvcGxwZ3dwdWRSWjdkTE5JR0NPdnRKYndYNDJHNHVQeElSTm9Bb1UyZDNpTnhVZmxQSXRJYU50bmsvd0VHQm9NZHBFQ0dIQUFBQUFCSlJVNUVya0pnZ2c9PSc7XG4gICAgICAgIHBsYXlPdmVybGF5SHRtbElubmVyLmFsdCA9ICdTdGFydCBTdHJlYW1pbmcnO1xuICAgICAgICByZXR1cm4gcGxheU92ZXJsYXlIdG1sSW5uZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGNvbm5lY3Qgb3ZlcmxheSB3aXRoIGEgY29ubmVjdGlvbiBidXR0b24uXG4gICAgICogQHBhcmFtIHBhcmVudEVsZW0gLSB0aGUgcGFyZW50IGVsZW1lbnQgdGhpcyBvdmVybGF5IHdpbGwgYmUgaW5zZXJ0ZWQgaW50by5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRFbGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudEVsZW0sIFBsYXlPdmVybGF5LmNyZWF0ZVJvb3RFbGVtZW50KCksIFBsYXlPdmVybGF5LmNyZWF0ZUNvbnRlbnRFbGVtZW50KCkpO1xuICAgICAgICAvLyBhZGQgdGhlIG5ldyBldmVudCBsaXN0ZW5lclxuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QbGF5T3ZlcmxheS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgT3ZlcmxheUJhc2UgfSBmcm9tICcuL0Jhc2VPdmVybGF5Jztcbi8qKlxuICogQ2xhc3MgZm9yIHRoZSB0ZXh0IG92ZXJsYXkgYmFzZVxuICovXG5leHBvcnQgY2xhc3MgVGV4dE92ZXJsYXkgZXh0ZW5kcyBPdmVybGF5QmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgdGV4dCBvdmVybGF5XG4gICAgICogQHBhcmFtIHJvb3REaXYgLSB0aGUgcm9vdCBlbGVtZW50IHRoaXMgb3ZlcmxheSB3aWxsIGJlIGluc2VydGVkIGludG9cbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgLSB0aGUgcm9vdCBlbGVtZW50IHRoYXQgaXMgdGhlIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gdGV4dEVsZW1lbnQgLSBhbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGV4dCBmb3IgdGhlIGFjdGlvbiBvdmVybGF5XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdERpdiwgcm9vdEVsZW1lbnQsIHRleHRFbGVtZW50KSB7XG4gICAgICAgIHN1cGVyKHJvb3REaXYsIHJvb3RFbGVtZW50LCB0ZXh0RWxlbWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgdGV4dCBvdmVybGF5cyBpbm5lciB0ZXh0XG4gICAgICogQHBhcmFtIHRleHQgLSB0aGUgdXBkYXRlIHRleHQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIHVwZGF0ZSh0ZXh0KSB7XG4gICAgICAgIGlmICh0ZXh0ICE9IG51bGwgfHwgdGV4dCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRleHRPdmVybGF5LmpzLm1hcCIsIi8qIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICovXG5pbXBvcnQganNzIGZyb20gJ2pzcyc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJ2pzcy1wbHVnaW4tZ2xvYmFsJztcbmltcG9ydCBjYW1lbENhc2UgZnJvbSAnanNzLXBsdWdpbi1jYW1lbC1jYXNlJztcbmV4cG9ydCBjbGFzcyBQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0TGlnaHRNb2RlUGFsZXR0ZSA9IHtcbiAgICAgICAgICAgICctLWNvbG9yMCc6ICcjZTJlMGRkODAnLFxuICAgICAgICAgICAgJy0tY29sb3IxJzogJyNGRkZGRkYnLFxuICAgICAgICAgICAgJy0tY29sb3IyJzogJyMwMDAwMDAnLFxuICAgICAgICAgICAgJy0tY29sb3IzJzogJyMwNTg1ZmUnLFxuICAgICAgICAgICAgJy0tY29sb3I0JzogJyMzNWIzNTAnLFxuICAgICAgICAgICAgJy0tY29sb3I1JzogJyNmZmFiMDAnLFxuICAgICAgICAgICAgJy0tY29sb3I2JzogJyNlMWUyZGQnLFxuICAgICAgICAgICAgJy0tY29sb3I3JzogJyNjM2M0YmYnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVmYXVsdERhcmtNb2RlUGFsZXR0ZSA9IHtcbiAgICAgICAgICAgICctLWNvbG9yMCc6ICcjMWQxZjIyZTAnLFxuICAgICAgICAgICAgJy0tY29sb3IxJzogJyMwMDAwMDAnLFxuICAgICAgICAgICAgJy0tY29sb3IyJzogJyNGRkZGRkYnLFxuICAgICAgICAgICAgJy0tY29sb3IzJzogJyMwNTg1ZmUnLFxuICAgICAgICAgICAgJy0tY29sb3I0JzogJyMzNWIzNTAnLFxuICAgICAgICAgICAgJy0tY29sb3I1JzogJyNmZmFiMDAnLFxuICAgICAgICAgICAgJy0tY29sb3I2JzogJyMxZTFkMjInLFxuICAgICAgICAgICAgJy0tY29sb3I3JzogJyMzYzNiNDAnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVmYXVsdFN0eWxlcyA9IHtcbiAgICAgICAgICAgICc6cm9vdCc6IHtcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjAnOiAnIzFkMWYyMmUwJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjEnOiAnIzAwMDAwMCcsXG4gICAgICAgICAgICAgICAgJy0tY29sb3IyJzogJyNGRkZGRkYnLFxuICAgICAgICAgICAgICAgICctLWNvbG9yMyc6ICcjMDU4NWZlJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjQnOiAnIzM1YjM1MCcsXG4gICAgICAgICAgICAgICAgJy0tY29sb3I1JzogJyNmZmFiMDAnLFxuICAgICAgICAgICAgICAgICctLWNvbG9yNic6ICcjMWUxZDIyJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjcnOiAnIzNjM2I0MCcsXG4gICAgICAgICAgICAgICAgJy0tY29sb3I4JzogJyM0MTAwOGMnLFxuICAgICAgICAgICAgICAgICctLWNvbG9yOSc6ICcjM2UwMDcwJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjEwJzogJyMyZTAwNTInLFxuICAgICAgICAgICAgICAgICctLWNvbG9yMTEnOiAncmdiYSg2NSwwLDEzOSwxKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLm5vc2VsZWN0Jzoge1xuICAgICAgICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjcGxheWVyVUknOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjdmlkZW9FbGVtZW50UGFyZW50Jzoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3IxKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpRmVhdHVyZXMnOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6ICczMCcsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJyxcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5VaVRvb2wgLnRvb2x0aXB0ZXh0Jzoge1xuICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJyxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzE1cHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwcHggMTBweCcsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCInTW9udHNlcnJhdCcsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzAuNzVyZW0nLFxuICAgICAgICAgICAgICAgIGxldHRlclNwYWNpbmc6ICcwLjc1cHgnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIHRvcDogJzAnLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMjUlKScsXG4gICAgICAgICAgICAgICAgbGVmdDogJzEyNSUnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogJzIwJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuVWlUb29sOmhvdmVyIC50b29sdGlwdGV4dCc6IHtcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiAndmlzaWJsZScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3I3KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI2Nvbm5lY3Rpb24gLnRvb2x0aXB0ZXh0Jzoge1xuICAgICAgICAgICAgICAgIHRvcDogJzEyNSUnLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTI1JSknLFxuICAgICAgICAgICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6ICcyMCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjY29ubmVjdGlvbic6IHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICBib3R0b206ICc4JScsXG4gICAgICAgICAgICAgICAgbGVmdDogJzUlJyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBcIidNaWNocm9tYScsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICczcmVtJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzNyZW0nLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdhbGwnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5ncy1wYW5lbCAudG9vbHRpcHRleHQnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICB0b3A6ICcxMjUlJyxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICAgICAgekluZGV4OiAnMjAnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnM3B4IHNvbGlkIHZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnbWF4LWNvbnRlbnQnLFxuICAgICAgICAgICAgICAgIGZhbGxiYWNrczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJ21heC1jb250ZW50J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICczcHggc29saWQgdmFyKC0tY29sb3IzKSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6ICcyMCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogJzAnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogJzEyNSUnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI2NvbnRyb2xzJzoge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIHRvcDogJzMlJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMiUnLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiJ01pY2hyb21hJywgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdhbGwnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI2NvbnRyb2xzPionOiB7XG4gICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMnJlbScsXG4gICAgICAgICAgICAgICAgbGluZUhlaWdodDogJzEuNzVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwLjVyZW0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNjb250cm9scyAjYWRkaXRpb25hbGluZm8nOiB7XG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBcIidNb250c2VycmF0Jywgc2Fucy1zZXJpZlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNmdWxsc2NyZWVuLWJ0bic6IHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMC42cmVtICFpbXBvcnRhbnQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNtaW5pbWl6ZUljb24nOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5nc0J0biwgI3N0YXRzQnRuJzoge1xuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyN1aUZlYXR1cmVzIGJ1dHRvbic6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgdmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzNyZW0nLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzNyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpRmVhdHVyZXMgYnV0dG9uOmhvdmVyJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzNweCBzb2xpZCB2YXIoLS1jb2xvcjMpJyxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnMC4yNXMgZWFzZScsXG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjU1cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAnMC41NXJlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpRmVhdHVyZXMgYnV0dG9uOmFjdGl2ZSc6IHtcbiAgICAgICAgICAgICAgICBib3JkZXI6ICczcHggc29saWQgdmFyKC0tY29sb3IzKScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjU1cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAnMC41NXJlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1mbGF0Jzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMiknLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiJ01vbnRzZXJyYXQnXCIsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzNweCBzb2xpZCB2YXIoLS1jb2xvcjMpJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxcmVtJyxcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzAuNzVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1mbGF0OmhvdmVyJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdlYXNlIDAuM3MnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5idG4tZmxhdDpkaXNhYmxlZCc6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1jb2xvcjMpJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5idG4tZmxhdDphY3RpdmUnOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5idG4tZmxhdDpmb2N1cyc6IHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiAnbm9uZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpRmVhdHVyZXMgaW1nJzoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnBhbmVsLXdyYXAnOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzIwdncnLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiAnOTB2dycsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKScsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJy4zcyBlYXNlLW91dCcsXG4gICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ2FsbCcsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dYOiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjApJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcucGFuZWwtd3JhcC12aXNpYmxlJzoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCUpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcucGFuZWwnOiB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzFlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3NldHRpbmdzSGVhZGluZywgI3N0YXRzSGVhZGluZyc6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzJlbScsXG4gICAgICAgICAgICAgICAgbWFyZ2luQmxvY2tTdGFydDogJzAuNjdlbScsXG4gICAgICAgICAgICAgICAgbWFyZ2luQmxvY2tFbmQ6ICcwLjY3ZW0nLFxuICAgICAgICAgICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiAnMHB4JyxcbiAgICAgICAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6ICcwcHgnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwIDAgMCAycmVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjc2V0dGluZ3NDbG9zZSwgI3N0YXRzQ2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMmVtJyxcbiAgICAgICAgICAgICAgICBmbG9hdDogJ3JpZ2h0J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjc2V0dGluZ3NDbG9zZTphZnRlciwgI3N0YXRzQ2xvc2U6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlxcXFwwMGQ3XCInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5nc0Nsb3NlOmhvdmVyLCAjc3RhdHNDbG9zZTpob3Zlcic6IHtcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdlYXNlIDAuM3MnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5nc0NvbnRlbnQsICNzdGF0c0NvbnRlbnQnOiB7XG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogJzJyZW0nLFxuICAgICAgICAgICAgICAgIG1hcmdpblJpZ2h0OiAnMnJlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnNldHRpbmcnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzAuMTVyZW0gMTBweCAwLjE1cmVtIDEwcHgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5zZXR0aW5ncy10ZXh0Jzoge1xuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3IyKScsXG4gICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnNldHRpbmdzLW9wdGlvbic6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIHRleHRPdmVyZmxvdzogJ2VsbGlwc2lzJyxcbiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjY29ubmVjdE92ZXJsYXksICNwbGF5T3ZlcmxheSwgI2luZm9PdmVybGF5LCAjZXJyb3JPdmVybGF5LCAjYWZrT3ZlcmxheSwgI2Rpc2Nvbm5lY3RPdmVybGF5Jzoge1xuICAgICAgICAgICAgICAgIHpJbmRleDogJzMwJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMiknLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMS44ZW0nLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3IxKScsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIHRleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5jbGlja2FibGVTdGF0ZSc6IHtcbiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50ZXh0RGlzcGxheVN0YXRlJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuaGlkZGVuU3RhdGUnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNwbGF5QnV0dG9uLCAjY29ubmVjdEJ1dHRvbic6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6ICczMCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnaW1nI3BsYXlCdXR0b24nOiB7XG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcyNDFweCcsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMCUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyN1aUludGVyYWN0aW9uJzoge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNVSUludGVyYWN0aW9uQnV0dG9uQm91bmRhcnknOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzJweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI1VJSW50ZXJhY3Rpb25CdXR0b24nOiB7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1vdmVybGF5Jzoge1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wtc3dpdGNoJzoge1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wtc3dpdGNoIC50Z2wnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wsIC50Z2w6YWZ0ZXIsIC50Z2w6YmVmb3JlLCAudGdsICosIC50Z2wgKjphZnRlciwgLnRnbCAqOmJlZm9yZSwgLnRnbCsudGdsLXNsaWRlcic6IHtcbiAgICAgICAgICAgICAgICAnLXdlYmtpdC1ib3gtc2l6aW5nJzogJ2JvcmRlci1ib3gnLFxuICAgICAgICAgICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2w6Oi1tb3otc2VsZWN0aW9uLCAudGdsOmFmdGVyOjotbW96LXNlbGVjdGlvbiwgLnRnbDpiZWZvcmU6Oi1tb3otc2VsZWN0aW9uLCAudGdsICo6Oi1tb3otc2VsZWN0aW9uLCAudGdsICo6YWZ0ZXI6Oi1tb3otc2VsZWN0aW9uLCAudGdsICo6YmVmb3JlOjotbW96LXNlbGVjdGlvbiwgLnRnbCsudGdsLXNsaWRlcjo6LW1vei1zZWxlY3Rpb24nOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2w6OnNlbGVjdGlvbiwgLnRnbDphZnRlcjo6c2VsZWN0aW9uLCAudGdsOmJlZm9yZTo6c2VsZWN0aW9uLCAudGdsICo6OnNlbGVjdGlvbiwgLnRnbCAqOmFmdGVyOjpzZWxlY3Rpb24sIC50Z2wgKjpiZWZvcmU6OnNlbGVjdGlvbiwgLnRnbCsudGdsLXNsaWRlcjo6c2VsZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICdub25lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsLXNsaWRlcic6IHt9LFxuICAgICAgICAgICAgJy50Z2wrLnRnbC1zbGlkZXInOiB7XG4gICAgICAgICAgICAgICAgb3V0bGluZTogJzAnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc0MHB4JyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxOHB4JyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICB1c2VyU2VsZWN0OiAnbm9uZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbCsudGdsLXNsaWRlcjphZnRlciwgLnRnbCsudGdsLXNsaWRlcjpiZWZvcmUnOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wrLnRnbC1zbGlkZXI6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgICAgbGVmdDogJzAnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wrLnRnbC1zbGlkZXI6YmVmb3JlJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsLWZsYXQrLnRnbC1zbGlkZXInOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzJweCcsXG4gICAgICAgICAgICAgICAgJy13ZWJraXQtdHJhbnNpdGlvbic6ICdhbGwgLjJzIGVhc2UnLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdhbGwgLjJzIGVhc2UnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1jb2xvcjYpJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICczcHggc29saWQgdmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMmVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsLWZsYXQrLnRnbC1zbGlkZXI6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgICAgJy13ZWJraXQtdHJhbnNpdGlvbic6ICdhbGwgLjJzIGVhc2UnLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdhbGwgLjJzIGVhc2UnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMWVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsLWZsYXQ6Y2hlY2tlZCsudGdsLXNsaWRlcic6IHtcbiAgICAgICAgICAgICAgICBib3JkZXI6ICczcHggc29saWQgdmFyKC0tY29sb3IzKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbC1mbGF0OmNoZWNrZWQrLnRnbC1zbGlkZXI6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgICAgbGVmdDogJzUwJScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLWNvbG9yMyknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5idG4tYXBwbHknOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrICFpbXBvcnRhbnQnLFxuICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnNDAlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuZm9ybS1jb250cm9sJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yNyknLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzJweCBzb2xpZCB2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3IyKScsXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAncmlnaHQnLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICdpbmhlcml0J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuZm9ybS1jb250cm9sOmhvdmVyJzoge1xuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tY29sb3I3KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmZvcm0tZ3JvdXAnOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogJzRweCcsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2dyaWQnLFxuICAgICAgICAgICAgICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICc4MCUgMjAlJyxcbiAgICAgICAgICAgICAgICByb3dHYXA6ICc0cHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogJzEwcHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnMTBweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmZvcm0tZ3JvdXAgbGFiZWwnOiB7XG4gICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnNldHRpbmdzQ29udGFpbmVyJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206ICcxcHggc29saWQgdmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogJzEwcHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdCb3R0b206ICcxMHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuc2V0dGluZ3NDb250YWluZXI+IDpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6ICc0cHgnLFxuICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogJzRweCcsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdiYXNlbGluZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmNvbGxhcHNlJzoge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnNSUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzdHJlYW1Ub29scyc6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b21SaWdodFJhZGl1czogJzVweCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tTGVmdFJhZGl1czogJzVweCcsXG4gICAgICAgICAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIHRvcDogJzAnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAnMiUnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogJzEwMCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnNHB4IHNvbGlkIHZhcigtLWNvbG91cjgpJyxcbiAgICAgICAgICAgICAgICBib3JkZXJUb3BXaWR0aDogJzBweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnNldHRpbmdzSGVhZGVyJzoge1xuICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogJ2l0YWxpYydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3N0cmVhbVRvb2xzSGVhZGVyJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWJldHdlZW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCB2YXIoLS1jb2xvdXI4KScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3I3KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnN0cmVhbVRvb2xzJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yMiknLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICd2YXIoLS1idXR0b25Gb250KScsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ2xpZ2h0ZXInLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3I3KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnN0cmVhbVRvb2xzLXNob3duPiNzdHJlYW1Ub29sc1NldHRpbmdzLCAuc3RyZWFtVG9vbHMtc2hvd24+I3N0cmVhbVRvb2xzU3RhdHMnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjc3RyZWFtVG9vbHNUb2dnbGUnOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjcXVhbGl0eVN0YXR1cyc6IHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzM3cHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogJzRweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnN2Z0ljb24nOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogJ3ZhcigtLWNvbG9yMiknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5tb2RhbCc6IHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzEwMHZ3JyxcbiAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6ICcxMDB2aCcsXG4gICAgICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgICAgIHRvcDogJzAnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuaW5uZXJNb2RhbCc6IHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICczMDBweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3IwKScsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMC43NWVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcubW9kYWxCdG5Db250YWluZXInOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYXJvdW5kJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6ICcxZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdCb3R0b206ICcxZW0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5tb2RhbFRleHRBcmVhJzoge1xuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2xlZnQnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnOTUlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICByZXNpemU6ICdub25lJyxcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzFyZW0nLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCB2YXIoLS1jb2xvcjIpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcubW9kYWxUZXh0QXJlYTpmb2N1cy12aXNpYmxlJzoge1xuICAgICAgICAgICAgICAgIG91dGxpbmU6ICdub25lICFpbXBvcnRhbnQnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCB2YXIoLS1jb2xvcjMpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcubW9kYWwgLmJ0bi1mbGF0Jzoge1xuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMS4wcmVtJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGN1c3RvbVN0eWxlcywgbGlnaHRNb2RlUGFsZXR0ZSwgZGFya01vZGVQYWxldHRlLCBqc3NJbnNlcnRpb25Qb2ludCB9ID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgICAgIC8vIE9uZSB0aW1lIHNldHVwIHdpdGggZGVmYXVsdCBwbHVnaW5zIGFuZCBzZXR0aW5ncy5cbiAgICAgICAgY29uc3QganNzT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC8vIEpTUyBoYXMgbWFueSBpbnRlcmVzdGluZyBwbHVnaW5zIHdlIG1heSB3aXNoIHRvIHR1cm4gb25cbiAgICAgICAgICAgIC8vcGx1Z2luczogW2Z1bmN0aW9ucygpLCB0ZW1wbGF0ZSgpLCBnbG9iYWwoKSwgZXh0ZW5kKCksIG5lc3RlZCgpLCBjb21wb3NlKCksIGNhbWVsQ2FzZSgpLCBkZWZhdWx0VW5pdChvcHRpb25zLmRlZmF1bHRVbml0KSwgZXhwYW5kKCksIHZlbmRvclByZWZpeGVyKCksIHByb3BzU29ydCgpXVxuICAgICAgICAgICAgcGx1Z2luczogW2dsb2JhbCgpLCBjYW1lbENhc2UoKV0sXG4gICAgICAgICAgICBpbnNlcnRpb25Qb2ludDoganNzSW5zZXJ0aW9uUG9pbnRcbiAgICAgICAgfTtcbiAgICAgICAganNzLnNldHVwKGpzc09wdGlvbnMpO1xuICAgICAgICB0aGlzLmN1c3RvbVN0eWxlcyA9IGN1c3RvbVN0eWxlcztcbiAgICAgICAgdGhpcy5saWdodE1vZGVQYWxldHRlID0gbGlnaHRNb2RlUGFsZXR0ZSAhPT0gbnVsbCAmJiBsaWdodE1vZGVQYWxldHRlICE9PSB2b2lkIDAgPyBsaWdodE1vZGVQYWxldHRlIDogdGhpcy5kZWZhdWx0TGlnaHRNb2RlUGFsZXR0ZTtcbiAgICAgICAgdGhpcy5kYXJrTW9kZVBhbGV0dGUgPSBkYXJrTW9kZVBhbGV0dGUgIT09IG51bGwgJiYgZGFya01vZGVQYWxldHRlICE9PSB2b2lkIDAgPyBkYXJrTW9kZVBhbGV0dGUgOiB0aGlzLmRlZmF1bHREYXJrTW9kZVBhbGV0dGU7XG4gICAgfVxuICAgIGFwcGx5U3R5bGVTaGVldCgpIHtcbiAgICAgICAgLy8gVG9kbzogcmVmYWN0b3IgY29kZWJhc2UgdG8gdXNlIGpzcyBhdCBhIGNvbXBvbmVudCBsZXZlbCwgY2xhc3NlcyBjYW4gYmUgZ3JhYmJlZCBsaWtlIHNvOlxuICAgICAgICAvL2NvbnN0IHtwaXhlbFN0cmVhbWluZ0NsYXNzZXN9ID0ganNzLmNyZWF0ZVN0eWxlU2hlZXQoc3R5bGVzKS5hdHRhY2goKTtcbiAgICAgICAgLy8gYXR0YWNoIGdlbmVyYXRlZCBzdHlsZSBzaGVldCB0byBwYWdlXG4gICAgICAgIGpzcy5jcmVhdGVTdHlsZVNoZWV0KHtcbiAgICAgICAgICAgICdAZ2xvYmFsJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRTdHlsZXMpLCB0aGlzLmN1c3RvbVN0eWxlcylcbiAgICAgICAgfSkuYXR0YWNoKCk7XG4gICAgfVxuICAgIGFwcGx5UGFsZXR0ZShwYWxldHRlKSB7XG4gICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignOnJvb3QnKTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29sb3IwJywgcGFsZXR0ZVsnLS1jb2xvcjAnXSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWNvbG9yMScsIHBhbGV0dGVbJy0tY29sb3IxJ10pO1xuICAgICAgICByb290RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb2xvcjInLCBwYWxldHRlWyctLWNvbG9yMiddKTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29sb3IzJywgcGFsZXR0ZVsnLS1jb2xvcjMnXSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWNvbG9yNCcsIHBhbGV0dGVbJy0tY29sb3I0J10pO1xuICAgICAgICByb290RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb2xvcjUnLCBwYWxldHRlWyctLWNvbG9yNSddKTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29sb3I2JywgcGFsZXR0ZVsnLS1jb2xvcjYnXSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWNvbG9yNycsIHBhbGV0dGVbJy0tY29sb3I3J10pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHBsYXllcnMgY29sb3IgdmFyaWFibGVzXG4gICAgICogQHBhcmFtIGlzTGlnaHRNb2RlIC0gc2hvdWxkIHdlIHVzZSBhIGxpZ2h0IG9yIGRhcmsgY29sb3Igc2NoZW1lXG4gICAgICovXG4gICAgc2V0Q29sb3JNb2RlKGlzTGlnaHRNb2RlKSB7XG4gICAgICAgIGlmIChpc0xpZ2h0TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBseVBhbGV0dGUodGhpcy5saWdodE1vZGVQYWxldHRlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlQYWxldHRlKHRoaXMuZGFya01vZGVQYWxldHRlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEZ1bGxTY3JlZW5JY29uIH0gZnJvbSAnLi9GdWxsc2NyZWVuSWNvbic7XG5pbXBvcnQgeyBTZXR0aW5nc0ljb24gfSBmcm9tICcuL1NldHRpbmdzSWNvbic7XG5pbXBvcnQgeyBTdGF0c0ljb24gfSBmcm9tICcuL1N0YXRzSWNvbic7XG5pbXBvcnQgeyBYUkljb24gfSBmcm9tICcuL1hSSWNvbic7XG5pbXBvcnQgeyBXZWJYUkNvbnRyb2xsZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41JztcbmltcG9ydCB7IFVJRWxlbWVudENyZWF0aW9uTW9kZSB9IGZyb20gJy4uL1VJL1VJQ29uZmlndXJhdGlvblR5cGVzJztcbi8vIElmIHRoZXJlIGlzbid0IGEgdHlwZSBwcm92aWRlZCwgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gY3JlYXRlIHRoZSBlbGVtZW50LlxuZnVuY3Rpb24gc2hvdWxkQ3JlYXRlQnV0dG9uKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSA9PSB1bmRlZmluZWQgPyB0cnVlIDogdHlwZS5jcmVhdGlvbk1vZGUgPT09IFVJRWxlbWVudENyZWF0aW9uTW9kZS5DcmVhdGVEZWZhdWx0RWxlbWVudDtcbn1cbi8qKlxuICogRWxlbWVudCBjb250YWluaW5nIHZhcmlvdXMgY29udHJvbHMgbGlrZSBzdGF0cywgc2V0dGluZ3MsIGZ1bGxzY3JlZW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9scyB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IHRoZSBjb250cm9sc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFjb25maWcgfHwgc2hvdWxkQ3JlYXRlQnV0dG9uKGNvbmZpZy5zdGF0c0J1dHRvblR5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRzSWNvbiA9IG5ldyBTdGF0c0ljb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbmZpZyB8fCBzaG91bGRDcmVhdGVCdXR0b24oY29uZmlnLnNldHRpbmdzQnV0dG9uVHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NJY29uID0gbmV3IFNldHRpbmdzSWNvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29uZmlnIHx8IHNob3VsZENyZWF0ZUJ1dHRvbihjb25maWcuZnVsbHNjcmVlbkJ1dHRvblR5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLmZ1bGxzY3JlZW5JY29uID0gbmV3IEZ1bGxTY3JlZW5JY29uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb25maWcgfHwgc2hvdWxkQ3JlYXRlQnV0dG9uKGNvbmZpZy54ckljb25UeXBlKSkge1xuICAgICAgICAgICAgdGhpcy54ckljb24gPSBuZXcgWFJJY29uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGNvbnRyb2xzLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmlkID0gJ2NvbnRyb2xzJztcbiAgICAgICAgICAgIGlmICh0aGlzLmZ1bGxzY3JlZW5JY29uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5mdWxsc2NyZWVuSWNvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nc0ljb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzSWNvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0c0ljb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzSWNvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy54ckljb24pIHtcbiAgICAgICAgICAgICAgICB2b2lkIFdlYlhSQ29udHJvbGxlci5pc1Nlc3Npb25TdXBwb3J0ZWQoJ2ltbWVyc2l2ZS12cicpLnRoZW4oKHN1cHBvcnRlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnhySWNvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLmhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBoYW5kbGVGdWxsc2NyZWVuQ2hhbmdlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGlzSW5GdWxsc2NyZWVuID0gISFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudDtcbiAgICAgICAgaWYgKGlzSW5GdWxsc2NyZWVuICYmICgoX2EgPSB0aGlzLmNvbmZpZykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhpZGVDb250cm9sc0luRnVsbHNjcmVlbikpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db250cm9scy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNSc7XG5pbXBvcnQgeyBTdGF0c1NlY3Rpb25zIH0gZnJvbSAnLi9VSUNvbmZpZ3VyYXRpb25UeXBlcyc7XG4vKipcbiAqIERhdGFDaGFubmVsIExhdGVuY3kgdGVzdCBVSSBlbGVtZW50cyBhbmQgcmVzdWx0cyBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsTGF0ZW5jeVRlc3Qge1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnV0dG9uIGNvbnRhaW5pbmcgdGhlIHN0YXRzIGljb24uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzQ29udGFpbmVyJyk7XG4gICAgICAgICAgICAvLyBtYWtlIGhlYWRpbmdcbiAgICAgICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGhlYWRpbmcuaWQgPSAnZGF0YUNoYW5uZWxMYXRlbmN5VGVzdEhlYWRlcic7XG4gICAgICAgICAgICBoZWFkaW5nLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzLXRleHQnKTtcbiAgICAgICAgICAgIGhlYWRpbmcuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NIZWFkZXInKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKGhlYWRpbmcpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGluZ1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGhlYWRpbmdUZXh0LmlubmVySFRNTCA9IFN0YXRzU2VjdGlvbnMuRGF0YUNoYW5uZWxMYXRlbmN5VGVzdDtcbiAgICAgICAgICAgIGhlYWRpbmcuYXBwZW5kQ2hpbGQoaGVhZGluZ1RleHQpO1xuICAgICAgICAgICAgaGVhZGluZy5hcHBlbmRDaGlsZCh0aGlzLmxhdGVuY3lUZXN0QnV0dG9uKTtcbiAgICAgICAgICAgIC8vIG1ha2UgdGVzdCByZXN1bHRzIGVsZW1lbnRcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNQYXJlbnRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICByZXN1bHRzUGFyZW50RWxlbS5pZCA9ICdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udGFpbmVyJztcbiAgICAgICAgICAgIHJlc3VsdHNQYXJlbnRFbGVtLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0c1BhcmVudEVsZW0pO1xuICAgICAgICAgICAgcmVzdWx0c1BhcmVudEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBsYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuaWQgPSAnZGF0YUNoYW5uZWxMYXRlbmN5U3RhdHNSZXN1bHRzJztcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnU3RhdHNSZXN1bHQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IGxhdGVuY3lUZXN0QnV0dG9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi52YWx1ZSA9ICdSdW4gVGVzdCc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi5pZCA9ICdidG4tc3RhcnQtZGF0YS1jaGFubmVsLWxhdGVuY3ktdGVzdCc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdzdHJlYW1Ub29scy1idXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB0aGUgVUkgYmFzZWQgb24gdGhlIGxhdGVuY3kgdGVzdCdzIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSBsYXRlbmN5IHRlc3QgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBoYW5kbGVUZXN0UmVzdWx0KHJlc3VsdCkge1xuICAgICAgICBMb2dnZXIuSW5mbyhKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIHdlIGhhdmUgcmVzdWx0cywgTmFOIHdvdWxkIG1lYW4gdGhhdCBVRSB2ZXJzaW9uIHdlIHRhbGsgdG8gZG9lc24ndCBzdXBwb3J0IG91ciB0ZXN0XG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaXNOYU4ocmVzdWx0LmRhdGFDaGFubmVsUnR0KSkge1xuICAgICAgICAgICAgdGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50LmlubmVySFRNTCA9ICc8ZGl2Pk5vdCBzdXBwb3J0ZWQ8L2Rpdj4nO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXRlbmN5U3RhdHNJbm5lckhUTUwgPSAnJztcbiAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9ICc8ZGl2PkRhdGEgY2hhbm5lbCBSVFQgKG1zKTogJyArIHJlc3VsdC5kYXRhQ2hhbm5lbFJ0dCArICc8L2Rpdj4nO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2VwYXJhdGUgcGF0aCB0aW1lIGRpc2NvdmVyeSB3b3JrcyBvbmx5IHdoZW4gVUUgYW5kIFBsYXllciBjbG9ja3MgaGF2ZSBiZWVuIHN5bmNocm9uaXplZC5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChyZXN1bHQucGxheWVyVG9TdHJlYW1lclRpbWUgPj0gMCAmJiByZXN1bHQuc3RyZWFtZXJUb1BsYXllclRpbWUgPj0gMCkge1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9XG4gICAgICAgICAgICAgICAgJzxkaXY+UGxheWVyIHRvIFN0cmVhbWVyIHBhdGggKG1zKTogJyArIHJlc3VsdC5wbGF5ZXJUb1N0cmVhbWVyVGltZSArICc8L2Rpdj4nO1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9XG4gICAgICAgICAgICAgICAgJzxkaXY+U3RyZWFtZXIgdG8gUGxheWVyIHBhdGggKG1zKTogJyArIHJlc3VsdC5zdHJlYW1lclRvUGxheWVyVGltZSArICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudC5pbm5lckhUTUwgPSBsYXRlbmN5U3RhdHNJbm5lckhUTUw7XG4gICAgICAgIC8vc2V0dXAgYnV0dG9uIHRvIGRvd25sb2FkIHRoZSBkZXRhaWxlZCByZXN1bHRzXG4gICAgICAgIGNvbnN0IGRvd25sb2FkQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgZG93bmxvYWRCdXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICBkb3dubG9hZEJ1dHRvbi52YWx1ZSA9ICdEb3dubG9hZCc7XG4gICAgICAgIGRvd25sb2FkQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3N0cmVhbVRvb2xzLWJ1dHRvbicpO1xuICAgICAgICBkb3dubG9hZEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdidG4tZmxhdCcpO1xuICAgICAgICBkb3dubG9hZEJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtyZXN1bHQuZXhwb3J0TGF0ZW5jeUFzQ1NWKCldLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KTtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgICAgICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgICAgICAgYS5kb3dubG9hZCA9ICdkYXRhX2NoYW5uZWxfbGF0ZW5jeV90ZXN0X3Jlc3VsdHMuY3N2JztcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICBhLmNsaWNrKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50LmFwcGVuZENoaWxkKGRvd25sb2FkQnV0dG9uKTtcbiAgICB9XG4gICAgaGFuZGxlVGVzdFN0YXJ0KCkge1xuICAgICAgICB0aGlzLmxhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuaW5uZXJIVE1MID0gJzxkaXY+VGVzdCBpbiBwcm9ncmVzczwvZGl2Pic7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gRXZlbnQgZmlyZWQgd2hlbiBcIkNvbmZpcm1cIiBidXR0b24gaXMgY2xpY2tlZFxuZXhwb3J0IGNsYXNzIEVkaXRDb25maXJtZWRFdmVudCBleHRlbmRzIEN1c3RvbUV2ZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maXJtZWRUZXh0KSB7XG4gICAgICAgIHN1cGVyKCdlZGl0Q29uZmlybWVkJywge1xuICAgICAgICAgICAgZGV0YWlsOiBjb25maXJtZWRUZXh0LFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlybWVkVGV4dCA9IGNvbmZpcm1lZFRleHQ7XG4gICAgfVxufVxuLyoqXG4gKiBBIG1vZGFsIHRoYXQgaXMgc2hvd24gd2hlbiBhIFVFIHdpZGdldCBpcyB0b3VjaGVkIG9uIG1vYmlsZS5cbiAqIG9yXG4gKiBBIGhpZGRlbiAob2Zmc2NyZWVuKSBpbnB1dCBmaWVsZCB0aGF0IGlzIHNob3duIG9uIG5vbi10b3VjaCBkZXZpY2VzIChlLmcuIERlc2t0b3ApXG4gKiB3aGVuIGEgVUUgd2lkZ2V0IGlzIGNsaWNrZWQuIFRoZSBoaWRkZW4gdGV4dCBmaWVsZCBpcyB1c2VkIHNvIG5vbi1sYXRpbiBjaGFyYWN0ZXJcbiAqIGlucHV0IGNhbiBiZSBjb21wb3NlZCB1c2luZyBJTUUgYXNzaXN0YW5jZSAod2hpY2ggcmVxdWlyZXMgYW4gaW5wdXQgZmllbGQpLlxuICpcbiAqIFRoZSByZWFzb24gdGhpcyBtb2RhbCBpcyByZXF1aXJlZCBpcyB0aGF0IG9uIG1vYmlsZSB0eXBpbmcgdXNlc1xuICogYW4gb24tc2NyZWVuIGtleWJvYXJkLCB3aGljaCByZXF1aXJlcyBhIHZhbGlkIGlucHV0IHRleHQgYXJlYS9pbnB1dFxuICogdG8gYmUgZm9jdXNlZCB0byBzdW1tb24gaXQuIFRoZXJlZm9yZSB3ZSBzaG93IHRoaXMgbW9kYWwgd2hpY2ggaGFzXG4gKiB0aGUgY29udGVudHMgb2YgdGhlIFVFIHdpZGdldCwgcG9wdWxhdGUgaXRzIHRleHQgYXJlYSB3aXRoIHRoZSBjb250ZW50c1xuICogb2YgdGhlIFVFIHdpZGdldCwgdGhlbiBmb2N1cyB0aGUgdGV4dCBhcmVhIHRvIGZpbmFsbHkgc3VtbW9uIHRoZSBuYXRpdmVcbiAqIG9uLXNjcmVlbiBrZXlib2FyZC5cbiAqXG4gKiBUaGUgbW9kYWwgYWxzbyBjb250YWluczpcbiAqIDEpIEEgY2FuY2VsIGJ1dHRvbiAtIHRoaXMgY2xvc2VzIHRoZSBtb2RhbFxuICogMikgQSBjb25maXJtIGJ1dHRvbiAtIHRoaXMgc3VibWl0cyB0aGUgZWRpdCBiYWNrIHRvIHRoZSBVRSBzaWRlXG4gKi9cbmV4cG9ydCBjbGFzcyBFZGl0VGV4dE1vZGFsIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSB0aGlzLnJvb3RFbGVtZW50O1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICB9XG4gICAgLy8gQmluZCB0byB0aGlzIGlmIHlvdSB3YW50IHRvIGhhbmRsZSBlZGl0IGNvbmZpcm1lZFxuICAgIGdldCBldmVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudHM7XG4gICAgfVxuICAgIHNob3dNb2RhbChleGlzdGluZ1RleHRBcmVhQ29udGVudHMpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nVGV4dEFyZWFDb250ZW50cykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBudWxsIHRlcm1pbmF0b3JzIGZyb20gdGhlIHN0cmluZ1xuICAgICAgICAgICAgZXhpc3RpbmdUZXh0QXJlYUNvbnRlbnRzID0gZXhpc3RpbmdUZXh0QXJlYUNvbnRlbnRzLnJlcGxhY2UoL1xcMC9nLCAnJyk7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhLnZhbHVlID0gZXhpc3RpbmdUZXh0QXJlYUNvbnRlbnRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJyaW5nIGZvY3VzIHRvIHRoZSB0ZXh0IGFyZWEuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBtYWtlIHRoZSBvbi1zY3JlZW4ga2V5Ym9hcmQgc2hvdyBpZiB3ZSBhcmVcbiAgICAgICAgLy8gYSBkZXZpY2UgdGhhdCBoYXMgYSBuYXRpdmUgb24tc2NyZWVuIGtleWJvYXJkLlxuICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSBub24tdG91Y2ggZGV2aWNlIHRoaXMgd2lsbCBnaXZlIElNRSBhIHZhbGlkXG4gICAgICAgIC8vIGlucHV0IGZpZWxkIHRvIHdvcmsgd2l0aC5cbiAgICAgICAgdGhpcy50ZXh0QXJlYS5mb2N1cygpO1xuICAgICAgICAvLyBQdXQgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIHRleHRhcmVhXG4gICAgICAgIHRoaXMudGV4dEFyZWEuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLnRleHRBcmVhLnZhbHVlLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByb290IGVsZW1lbnQgdGhhdCBjb250YWlucyBlaXRoZXIgdGhlIG1vZGFsIChtb2JpbGUpIG9yIGhpZGRlbiB0ZXh0IGlucHV0IChkZXNrdG9wKVxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21vZGFsJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmlubmVyTW9kYWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IGlubmVyTW9kYWwoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5uZXJNb2RhbCkge1xuICAgICAgICAgICAgdGhpcy5faW5uZXJNb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5faW5uZXJNb2RhbC5jbGFzc0xpc3QuYWRkKCdpbm5lck1vZGFsJyk7XG4gICAgICAgICAgICB0aGlzLl9pbm5lck1vZGFsLmFwcGVuZENoaWxkKHRoaXMuZWRpdFRleHRIZWFkaW5nKTtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyTW9kYWwuYXBwZW5kQ2hpbGQodGhpcy50ZXh0QXJlYSk7XG4gICAgICAgICAgICB0aGlzLl9pbm5lck1vZGFsLmFwcGVuZENoaWxkKHRoaXMubW9kYWxCdG5Db250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbm5lck1vZGFsO1xuICAgIH1cbiAgICBnZXQgZWRpdFRleHRIZWFkaW5nKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2VkaXRUZXh0SGVhZGluZykge1xuICAgICAgICAgICAgdGhpcy5fZWRpdFRleHRIZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRUZXh0SGVhZGluZy5pbm5lclRleHQgPSAnRWRpdCBUZXh0JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdFRleHRIZWFkaW5nO1xuICAgIH1cbiAgICBnZXQgdGV4dEFyZWEoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdGV4dEFyZWEpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgICAgICAgIHRoaXMuX3RleHRBcmVhLmNsYXNzTGlzdC5hZGQoJ2Zvcm0tY29udHJvbCcpO1xuICAgICAgICAgICAgdGhpcy5fdGV4dEFyZWEuY2xhc3NMaXN0LmFkZCgnbW9kYWxUZXh0QXJlYScpO1xuICAgICAgICAgICAgdGhpcy5fdGV4dEFyZWEudGl0bGUgPSAnRWRpdCBUZXh0IEFyZWEnO1xuICAgICAgICAgICAgdGhpcy5fdGV4dEFyZWEucGxhY2Vob2xkZXIgPSAnVUUgdGV4dCB3aWRnZXQgdmFsdWUgaGVyZS4uLic7XG4gICAgICAgICAgICAvLyBXaGVuIGtleWJvYXJkIGlzIHR5cGVkIGludG8gd2Ugd2FudCB0byBlbnN1cmUga2V5cyBhcmUgbm90IHNlbnQgYmFjayB0byBVRSB1bnRpbCB3ZSBjb25maXJtLlxuICAgICAgICAgICAgdGhpcy50ZXh0QXJlYS5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbXBvc2l0aW9uZW5kJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dEFyZWE7XG4gICAgfVxuICAgIGdldCBtb2RhbEJ0bkNvbnRhaW5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tb2RhbEJ0bkNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fbW9kYWxCdG5Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX21vZGFsQnRuQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21vZGFsQnRuQ29udGFpbmVyJyk7XG4gICAgICAgICAgICB0aGlzLl9tb2RhbEJ0bkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbmNlbEJ0bik7XG4gICAgICAgICAgICB0aGlzLl9tb2RhbEJ0bkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbmZpcm1CdG4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RhbEJ0bkNvbnRhaW5lcjtcbiAgICB9XG4gICAgZ2V0IGNhbmNlbEJ0bigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYW5jZWxCdG4pIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsQnRuLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxCdG4uaW5uZXJUZXh0ID0gJ0NhbmNlbCc7XG4gICAgICAgICAgICAvLyBXaGVuIGNhbmNlbCBpcyBjbGlja2VkLCByZW1vdmUgdGhpcyBtb2RhbCBmcm9tIHRoZSBET01cbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBjbGljay90YXAgZG9lcyBub3QgZ28gYmFjayB0byBVRVxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbmNlbEJ0bjtcbiAgICB9XG4gICAgZ2V0IGNvbmZpcm1CdG4oKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29uZmlybUJ0bikge1xuICAgICAgICAgICAgdGhpcy5fY29uZmlybUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fY29uZmlybUJ0bi5jbGFzc0xpc3QuYWRkKCdidG4tZmxhdCcpO1xuICAgICAgICAgICAgdGhpcy5fY29uZmlybUJ0bi5pbm5lclRleHQgPSAnQ29uZmlybSc7XG4gICAgICAgICAgICAvLyBXaGVuIGNvbmZpcm0gaXMgY2xpY2tlZCwgcmVtb3ZlIGZyb20gRE9NIGFuZCBzZW5kIHRoZSBjb250ZW50cyBvZiB0ZXh0YXJlYSB0byBVRVxuICAgICAgICAgICAgdGhpcy5fY29uZmlybUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IEVkaXRDb25maXJtZWRFdmVudCh0aGlzLnRleHRBcmVhLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNsaWNrL3RhcCBkb2VzIG5vdCBnbyBiYWNrIHRvIFVFXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlybUJ0bjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FZGl0VGV4dE1vZGFsLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFuIGVsZW1lbnQgKGkuZS4gYnV0dG9uKSB0aGF0LCB3aGVuIGNsaWNrZWQsIHdpbGwgdG9nZ2xlIGZ1bGxzY3JlZW4gb2YgYSBnaXZlbiBlbGVtZW50LlxuICogQ2FuIGJlIGluaXRpYWxpemVkIHdpdGggYW55IEhUTUxFbGVtZW50LCBpZiBpdCBpcyBzZXQgYXMgcm9vdEVsZW1lbnQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgY2xhc3MgRnVsbFNjcmVlbkljb25CYXNlIHtcbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgc2V0IHJvb3RFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5vbmNsaWNrID0gKCkgPT4gdGhpcy50b2dnbGVGdWxsc2NyZWVuKCk7XG4gICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gZmFsc2U7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgZnVsbCBzY3JlZW4gZXZlbnRzXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCAoKSA9PiB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZSgpLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCAoKSA9PiB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZSgpLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCAoKSA9PiB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZSgpLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ01TRnVsbHNjcmVlbkNoYW5nZScsICgpID0+IHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlKCksIGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGRvY3VtZW50IG9yIGZ1bGxzY3JlZW5FbGVtZW50IGZ1bGxzY3JlZW4uXG4gICAgICovXG4gICAgdG9nZ2xlRnVsbHNjcmVlbigpIHtcbiAgICAgICAgLy8gaWYgYWxyZWFkeSBmdWxsIHNjcmVlbjsgZXhpdFxuICAgICAgICAvLyBlbHNlIGdvIGZ1bGxzY3JlZW5cbiAgICAgICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgICAgIGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZ1bGxzY3JlZW5FbGVtZW50O1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50Lm1velJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5tb3pSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC53ZWJraXRFbnRlckZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LndlYmtpdEVudGVyRnVsbHNjcmVlbigpOyAvL2ZvciBpcGhvbmUgdGhpcyBjb2RlIHdvcmtlZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uIG9uIGNoYW5nZVxuICAgICAqL1xuICAgIG9uRnVsbHNjcmVlbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPVxuICAgICAgICAgICAgZG9jdW1lbnQud2Via2l0SXNGdWxsU2NyZWVuIHx8XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQubW96RnVsbFNjcmVlbiB8fFxuICAgICAgICAgICAgICAgIChkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50ICYmIGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQgIT09IG51bGwpIHx8XG4gICAgICAgICAgICAgICAgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50ICYmIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50ICE9PSBudWxsKTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEZ1bGxTY3JlZW5JY29uQmFzZSB0aGF0IHVzZXMgYW4gZXh0ZXJuYWxseVxuICogcHJvdmlkZWQgSFRNTEVsZW1lbnQgZm9yIHRvZ2dsaW5nIGZ1bGwgc2NyZWVuLlxuICovXG5leHBvcnQgY2xhc3MgRnVsbFNjcmVlbkljb25FeHRlcm5hbCBleHRlbmRzIEZ1bGxTY3JlZW5JY29uQmFzZSB7XG4gICAgY29uc3RydWN0b3IoZXh0ZXJuYWxCdXR0b24pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudCA9IGV4dGVybmFsQnV0dG9uO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGRlZmF1bHQgZnVsbHNjcmVlbiBpY29uIHRoYXQgY29udGFpbnMgYSBidXR0b24gYW5kIHN2Z3MgZm9yIGVhY2ggc3RhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBGdWxsU2NyZWVuSWNvbiBleHRlbmRzIEZ1bGxTY3JlZW5JY29uQmFzZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgY3JlYXRlZEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIGNyZWF0ZWRCdXR0b24uY2xhc3NMaXN0LmFkZCgnVWlUb29sJyk7XG4gICAgICAgIGNyZWF0ZWRCdXR0b24uaWQgPSAnZnVsbHNjcmVlbi1idG4nO1xuICAgICAgICBjcmVhdGVkQnV0dG9uLmFwcGVuZENoaWxkKHRoaXMubWF4aW1pemVJY29uKTtcbiAgICAgICAgY3JlYXRlZEJ1dHRvbi5hcHBlbmRDaGlsZCh0aGlzLm1pbmltaXplSWNvbik7XG4gICAgICAgIGNyZWF0ZWRCdXR0b24uYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwVGV4dCk7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQgPSBjcmVhdGVkQnV0dG9uO1xuICAgIH1cbiAgICBnZXQgdG9vbHRpcFRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9vbHRpcFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQuY2xhc3NMaXN0LmFkZCgndG9vbHRpcHRleHQnKTtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0LmlubmVySFRNTCA9ICdGdWxsc2NyZWVuJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9vbHRpcFRleHQ7XG4gICAgfVxuICAgIGdldCBtYXhpbWl6ZUljb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWF4aW1pemVJY29uKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXhpbWl6ZUljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgICAgdGhpcy5fbWF4aW1pemVJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICdpZCcsICdtYXhpbWl6ZUljb24nKTtcbiAgICAgICAgICAgIHRoaXMuX21heGltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneCcsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX21heGltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneScsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX21heGltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAndmlld0JveCcsICcwIDAgMzg0Ljk3IDM4NC45NycpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHN2ZyBncm91cCBmb3IgdGhlIHBhdGhzXG4gICAgICAgICAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuY2xhc3NMaXN0LmFkZCgnc3ZnSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fbWF4aW1pemVJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBwYXRocyBmb3IgdGhlIGljb24gaXRzZWxmLCBvbmUgZm9yIGVhY2ggY29ybmVyXG4gICAgICAgICAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTM4NC45NywxMi4wM2MwLTYuNzEzLTUuMzE3LTEyLjAzLTEyLjAzLTEyLjAzSDI2NC44NDdjLTYuODMzLDAtMTEuOTIyLDUuMzktMTEuOTM0LDEyLjIyM2MwLDYuODIxLDUuMTAxLDExLjgzOCwxMS45MzQsMTEuODM4aDk2LjA2MmwtMC4xOTMsOTYuNTE5YzAsNi44MzMsNS4xOTcsMTIuMDMsMTIuMDMsMTIuMDNjNi44MzMtMC4wMTIsMTIuMDMtNS4xOTcsMTIuMDMtMTIuMDNsMC4xOTMtMTA4LjM2OWMwLTAuMDM2LTAuMDEyLTAuMDYtMC4wMTItMC4wODRDMzg0Ljk1OCwxMi4wOSwzODQuOTcsMTIuMDY2LDM4NC45NywxMi4wM3onKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTIwLjQ5NiwwSDEyLjQwM2MtMC4wMzYsMC0wLjA2LDAuMDEyLTAuMDk2LDAuMDEyQzEyLjI4MywwLjAxMiwxMi4yNDcsMCwxMi4yMjMsMEM1LjUxLDAsMC4xOTIsNS4zMTcsMC4xOTIsMTIuMDNMMCwxMjAuMzk5YzAsNi44MzMsNS4zOSwxMS45MzQsMTIuMjIzLDExLjkzNGM2LjgyMSwwLDExLjgzOC01LjEwMSwxMS44MzgtMTEuOTM0bDAuMTkyLTk2LjMzOWg5Ni4yNDJjNi44MzMsMCwxMi4wMy01LjE5NywxMi4wMy0xMi4wM0MxMzIuNTE0LDUuMTk3LDEyNy4zMTcsMCwxMjAuNDk2LDB6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTEyMC4xMjMsMzYwLjkwOUgyNC4wNjF2LTk2LjI0MmMwLTYuODMzLTUuMTk3LTEyLjAzLTEyLjAzLTEyLjAzUzAsMjU3LjgzMywwLDI2NC42Njd2MTA4LjA5MmMwLDAuMDM2LDAuMDEyLDAuMDYsMC4wMTIsMC4wODRjMCwwLjAzNi0wLjAxMiwwLjA2LTAuMDEyLDAuMDk2YzAsNi43MTMsNS4zMTcsMTIuMDMsMTIuMDMsMTIuMDNoMTA4LjA5MmM2LjgzMywwLDExLjkyMi01LjM5LDExLjkzNC0xMi4yMjNDMTMyLjA1NywzNjUuOTI2LDEyNi45NTYsMzYwLjkwOSwxMjAuMTIzLDM2MC45MDl6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDQuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTM3Mi43NDcsMjUyLjkxM2MtNi44MzMsMC0xMS44NSw1LjEwMS0xMS44MzgsMTEuOTM0djk2LjA2MmgtOTYuMjQyYy02LjgzMywwLTEyLjAzLDUuMTk3LTEyLjAzLDEyLjAzczUuMTk3LDEyLjAzLDEyLjAzLDEyLjAzaDEwOC4wOTJjMC4wMzYsMCwwLjA2LTAuMDEyLDAuMDg0LTAuMDEyYzAuMDM2LTAuMDEyLDAuMDYsMC4wMTIsMC4wOTYsMC4wMTJjNi43MTMsMCwxMi4wMy01LjMxNywxMi4wMy0xMi4wM1YyNjQuODQ3QzM4NC45NywyNTguMDE0LDM3OS41OCwyNTIuOTEzLDM3Mi43NDcsMjUyLjkxM3onKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgyKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgzKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGg0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4aW1pemVJY29uO1xuICAgIH1cbiAgICBnZXQgbWluaW1pemVJY29uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21pbmltaXplSWNvbikge1xuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnbWluaW1pemVJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3gnLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3knLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCAnMCAwIDM4NS4zMzEgMzg1LjMzMScpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHN2ZyBncm91cCBmb3IgdGhlIHBhdGhzXG4gICAgICAgICAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuY2xhc3NMaXN0LmFkZCgnc3ZnSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBwYXRocyBmb3IgdGhlIGljb24gaXRzZWxmLCBvbmUgZm9yIGVhY2ggY29ybmVyXG4gICAgICAgICAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTI2NC45NDMsMTU2LjY2NWgxMDguMjczYzYuODMzLDAsMTEuOTM0LTUuMzksMTEuOTM0LTEyLjIxMWMwLTYuODMzLTUuMTAxLTExLjg1LTExLjkzNC0xMS44MzhoLTk2LjI0MlYzNi4xODFjMC02LjgzMy01LjE5Ny0xMi4wMy0xMi4wMy0xMi4wM3MtMTIuMDMsNS4xOTctMTIuMDMsMTIuMDN2MTA4LjI3M2MwLDAuMDM2LDAuMDEyLDAuMDYsMC4wMTIsMC4wODRjMCwwLjAzNi0wLjAxMiwwLjA2LTAuMDEyLDAuMDk2QzI1Mi45MTMsMTUxLjM0NywyNTguMjMsMTU2LjY3NywyNjQuOTQzLDE1Ni42NjV6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTEyMC4yOTEsMjQuMjQ3Yy02LjgyMSwwLTExLjgzOCw1LjExMy0xMS44MzgsMTEuOTM0djk2LjI0MkgxMi4wM2MtNi44MzMsMC0xMi4wMyw1LjE5Ny0xMi4wMywxMi4wM2MwLDYuODMzLDUuMTk3LDEyLjAzLDEyLjAzLDEyLjAzaDEwOC4yNzNjMC4wMzYsMCwwLjA2LTAuMDEyLDAuMDg0LTAuMDEyYzAuMDM2LDAsMC4wNiwwLjAxMiwwLjA5NiwwLjAxMmM2LjcxMywwLDEyLjAzLTUuMzE3LDEyLjAzLTEyLjAzVjM2LjE4MUMxMzIuNTE0LDI5LjM2LDEyNy4xMjQsMjQuMjU5LDEyMC4yOTEsMjQuMjQ3eicpO1xuICAgICAgICAgICAgY29uc3QgcGF0aDMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHBhdGgzLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00xMjAuMzg3LDIyOC42NjZIMTIuMTE1Yy02LjgzMywwLjAxMi0xMS45MzQsNS4zOS0xMS45MzQsMTIuMjIzYzAsNi44MzMsNS4xMDEsMTEuODUsMTEuOTM0LDExLjgzOGg5Ni4yNDJ2OTYuNDIzYzAsNi44MzMsNS4xOTcsMTIuMDMsMTIuMDMsMTIuMDNjNi44MzMsMCwxMi4wMy01LjE5NywxMi4wMy0xMi4wM1YyNDAuODc3YzAtMC4wMzYtMC4wMTItMC4wNi0wLjAxMi0wLjA4NGMwLTAuMDM2LDAuMDEyLTAuMDYsMC4wMTItMC4wOTZDMTMyLjQxOCwyMzMuOTgzLDEyNy4xLDIyOC42NjYsMTIwLjM4NywyMjguNjY2eicpO1xuICAgICAgICAgICAgY29uc3QgcGF0aDQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHBhdGg0LnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00zNzMuMywyMjguNjY2SDI2NS4wMjhjLTAuMDM2LDAtMC4wNiwwLjAxMi0wLjA4NCwwLjAxMmMtMC4wMzYsMC0wLjA2LTAuMDEyLTAuMDk2LTAuMDEyYy02LjcxMywwLTEyLjAzLDUuMzE3LTEyLjAzLDEyLjAzdjEwOC4yNzNjMCw2LjgzMyw1LjM5LDExLjkyMiwxMi4yMjMsMTEuOTM0YzYuODIxLDAuMDEyLDExLjgzOC01LjEwMSwxMS44MzgtMTEuOTIydi05Ni4yNDJIMzczLjNjNi44MzMsMCwxMi4wMy01LjE5NywxMi4wMy0xMi4wM1MzODAuMTM0LDIyOC42NzgsMzczLjMsMjI4LjY2NnonKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgyKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgzKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGg0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWluaW1pemVJY29uO1xuICAgIH1cbiAgICBvbkZ1bGxzY3JlZW5DaGFuZ2UoKSB7XG4gICAgICAgIHN1cGVyLm9uRnVsbHNjcmVlbkNoYW5nZSgpO1xuICAgICAgICBjb25zdCBtaW5pbWl6ZSA9IHRoaXMubWluaW1pemVJY29uO1xuICAgICAgICBjb25zdCBtYXhpbWl6ZSA9IHRoaXMubWF4aW1pemVJY29uO1xuICAgICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIG1pbmltaXplLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcbiAgICAgICAgICAgIC8vaW9zIGRpc2FwcGVhcmluZyBzdmcgZml4XG4gICAgICAgICAgICBtaW5pbWl6ZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgICAgIG1heGltaXplLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtaW5pbWl6ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgbWF4aW1pemUuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xuICAgICAgICAgICAgLy9pb3MgZGlzYXBwZWFyaW5nIHN2ZyBmaXhcbiAgICAgICAgICAgIG1heGltaXplLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnVsbHNjcmVlbkljb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQSBidXR0b24gd2l0aCBhIHRleHQgbGFiZWwgYmVzaWRlIGl0LlxuICovXG5leHBvcnQgY2xhc3MgTGFiZWxsZWRCdXR0b24ge1xuICAgIGNvbnN0cnVjdG9yKGxhYmVsLCBidXR0b25UZXh0KSB7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gbGFiZWw7XG4gICAgICAgIHRoaXMuX2J1dHRvblRleHQgPSBidXR0b25UZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjbGljayBsaXN0ZW5lciB0byB0aGUgYnV0dG9uIGVsZW1lbnQuXG4gICAgICovXG4gICAgYWRkT25DbGlja0xpc3RlbmVyKG9uQ2xpY2tGdW5jKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGlja0Z1bmMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEhUTUxJbnB1dEVsZW1lbnQgZm9yIHRoZSBidXR0b24uXG4gICAgICovXG4gICAgZ2V0IGJ1dHRvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9idXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICB0aGlzLl9idXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnZhbHVlID0gdGhpcy5fYnV0dG9uVGV4dDtcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi5jbGFzc0xpc3QuYWRkKCdvdmVybGF5LWJ1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1dHRvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHJvb3QgZGl2IHdpdGggXCJzZXR0aW5nXCIgY3NzIGNsYXNzXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2V0dGluZycpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGRpdiBlbGVtZW50IHRvIGNvbnRhaW4gb3VyIHNldHRpbmcncyB0ZXh0XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nc1RleHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IHRoaXMuX2xhYmVsO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2V0dGluZ3NUZXh0RWxlbSk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbGFiZWwgZWxlbWVudCB0byB3cmFwIG91dCBpbnB1dCB0eXBlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgICAgICAgICAgd3JhcHBlckxhYmVsLmNsYXNzTGlzdC5hZGQoJ2J0bi1vdmVybGF5Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh3cmFwcGVyTGFiZWwpO1xuICAgICAgICAgICAgd3JhcHBlckxhYmVsLmFwcGVuZENoaWxkKHRoaXMuYnV0dG9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGFiZWxsZWRCdXR0b24uanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgU3RhdHNTZWN0aW9ucyB9IGZyb20gJy4vVUlDb25maWd1cmF0aW9uVHlwZXMnO1xuLyoqXG4gKiBMYXRlbmN5IHRlc3QgVUkgZWxlbWVudHMgYW5kIHJlc3VsdHMgaGFuZGxpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXRlbmN5VGVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0aGUgYnV0dG9uIGNvbnRhaW5pbmcgdGhlIHN0YXRzIGljb24uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzQ29udGFpbmVyJyk7XG4gICAgICAgICAgICAvLyBtYWtlIGhlYWRpbmdcbiAgICAgICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGhlYWRpbmcuaWQgPSAnbGF0ZW5jeVRlc3RIZWFkZXInO1xuICAgICAgICAgICAgaGVhZGluZy5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy10ZXh0Jyk7XG4gICAgICAgICAgICBoZWFkaW5nLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzSGVhZGVyJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZChoZWFkaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRpbmdUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBoZWFkaW5nVGV4dC5pbm5lckhUTUwgPSBTdGF0c1NlY3Rpb25zLkxhdGVuY3lUZXN0O1xuICAgICAgICAgICAgaGVhZGluZy5hcHBlbmRDaGlsZChoZWFkaW5nVGV4dCk7XG4gICAgICAgICAgICBoZWFkaW5nLmFwcGVuZENoaWxkKHRoaXMubGF0ZW5jeVRlc3RCdXR0b24pO1xuICAgICAgICAgICAgLy8gbWFrZSB0ZXN0IHJlc3VsdHMgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0c1BhcmVudEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHJlc3VsdHNQYXJlbnRFbGVtLmlkID0gJ2xhdGVuY3lUZXN0Q29udGFpbmVyJztcbiAgICAgICAgICAgIHJlc3VsdHNQYXJlbnRFbGVtLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0c1BhcmVudEVsZW0pO1xuICAgICAgICAgICAgcmVzdWx0c1BhcmVudEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBsYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuaWQgPSAnbGF0ZW5jeVN0YXRzUmVzdWx0cyc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ1N0YXRzUmVzdWx0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBsYXRlbmN5VGVzdEJ1dHRvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24udmFsdWUgPSAnUnVuIFRlc3QnO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24uaWQgPSAnYnRuLXN0YXJ0LWxhdGVuY3ktdGVzdCc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdzdHJlYW1Ub29scy1idXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB0aGUgVUkgYmFzZWQgb24gdGhlIGxhdGVuY3kgdGVzdCdzIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIGxhdGVuY3lUaW1pbmdzIC0gVGhlIGxhdGVuY3kgdGVzdCByZXN1bHRzLlxuICAgICAqL1xuICAgIGhhbmRsZVRlc3RSZXN1bHQobGF0ZW5jeVRpbWluZ3MpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oSlNPTi5zdHJpbmdpZnkobGF0ZW5jeVRpbWluZ3MpKTtcbiAgICAgICAgbGV0IGxhdGVuY3lTdGF0c0lubmVySFRNTCA9ICcnO1xuICAgICAgICBpZiAobGF0ZW5jeVRpbWluZ3MubmV0d29ya0xhdGVuY3kgIT09IHVuZGVmaW5lZCAmJiBsYXRlbmN5VGltaW5ncy5uZXR3b3JrTGF0ZW5jeSA+IDApIHtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0lubmVySFRNTCArPSAnPGRpdj5OZXQgbGF0ZW5jeSBSVFQgKG1zKTogJyArIGxhdGVuY3lUaW1pbmdzLm5ldHdvcmtMYXRlbmN5ICsgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lUaW1pbmdzLkVuY29kZU1zICE9PSB1bmRlZmluZWQgJiYgbGF0ZW5jeVRpbWluZ3MuRW5jb2RlTXMgPiAwKSB7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz0gJzxkaXY+VUUgRW5jb2RlIChtcyk6ICcgKyBsYXRlbmN5VGltaW5ncy5FbmNvZGVNcyArICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5VGltaW5ncy5DYXB0dXJlVG9TZW5kTXMgIT09IHVuZGVmaW5lZCAmJiBsYXRlbmN5VGltaW5ncy5DYXB0dXJlVG9TZW5kTXMgPiAwKSB7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz0gJzxkaXY+VUUgQ2FwdHVyZSAobXMpOiAnICsgbGF0ZW5jeVRpbWluZ3MuQ2FwdHVyZVRvU2VuZE1zICsgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lUaW1pbmdzLmJyb3dzZXJTZW5kTGF0ZW5jeSAhPT0gdW5kZWZpbmVkICYmIGxhdGVuY3lUaW1pbmdzLmJyb3dzZXJTZW5kTGF0ZW5jeSA+IDApIHtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0lubmVySFRNTCArPVxuICAgICAgICAgICAgICAgICc8ZGl2PkJyb3dzZXIgc2VuZCBsYXRlbmN5IChtcyk6ICcgKyBsYXRlbmN5VGltaW5ncy5icm93c2VyU2VuZExhdGVuY3kgKyAnPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeVRpbWluZ3MuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbGF0ZW5jeVRpbWluZ3MuYnJvd3NlclJlY2VpcHRUaW1lTXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9XG4gICAgICAgICAgICAgICAgbGF0ZW5jeVRpbWluZ3MuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgJiYgbGF0ZW5jeVRpbWluZ3MuYnJvd3NlclJlY2VpcHRUaW1lTXNcbiAgICAgICAgICAgICAgICAgICAgPyAnPGRpdj5Ccm93c2VyIHJlY2VpdmUgbGF0ZW5jeSAobXMpOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lUaW1pbmdzLmZyYW1lRGlzcGxheURlbHRhVGltZU1zICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nXG4gICAgICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lUaW1pbmdzLmxhdGVuY3lFeGNsdWRpbmdEZWNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9XG4gICAgICAgICAgICAgICAgJzxkaXY+VG90YWwgbGF0ZW5jeSAoZXhjbHVkaW5nIGJyb3dzZXIpIChtcyk6ICcgK1xuICAgICAgICAgICAgICAgICAgICBsYXRlbmN5VGltaW5ncy5sYXRlbmN5RXhjbHVkaW5nRGVjb2RlICtcbiAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lUaW1pbmdzLmVuZFRvRW5kTGF0ZW5jeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz0gbGF0ZW5jeVRpbWluZ3MuZW5kVG9FbmRMYXRlbmN5XG4gICAgICAgICAgICAgICAgPyAnPGRpdj5Ub3RhbCBsYXRlbmN5IChtcyk6ICcgKyBsYXRlbmN5VGltaW5ncy5lbmRUb0VuZExhdGVuY3kgKyAnPC9kaXY+J1xuICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50LmlubmVySFRNTCA9IGxhdGVuY3lTdGF0c0lubmVySFRNTDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MYXRlbmN5VGVzdC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBTZXR0aW5ncyBpY29uIHRoYXQgY2FuIGJlIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0ljb24ge1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGhlIGJ1dHRvbiBjb250YWluaW5nIHRoZSBzZXR0aW5ncyBpY29uLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ1VpVG9vbCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSAnc2V0dGluZ3NCdG4nO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc0ljb24pO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBnZXQgdG9vbHRpcFRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9vbHRpcFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQuY2xhc3NMaXN0LmFkZCgndG9vbHRpcHRleHQnKTtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0LmlubmVySFRNTCA9ICdTZXR0aW5ncyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rvb2x0aXBUZXh0O1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NJY29uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzSWNvbikge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnc2V0dGluZ3NJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3gnLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3knLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCAnMCAwIDQ3OC43MDMgNDc4LjcwMycpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHN2ZyBncm91cCBmb3IgdGhlIHBhdGhzXG4gICAgICAgICAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuY2xhc3NMaXN0LmFkZCgnc3ZnSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBwYXRocyBmb3IgdGhlIGljb24gaXRzZWxmLCB0aGUgaW5uZXIgYW5kIG91dCBwYXRoIG9mIGEgY29nXG4gICAgICAgICAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTQ1NC4yLDE4OS4xMDFsLTMzLjYtNS43Yy0zLjUtMTEuMy04LTIyLjItMTMuNS0zMi42bDE5LjgtMjcuN2M4LjQtMTEuOCw3LjEtMjcuOS0zLjItMzguMWwtMjkuOC0yOS44XFxcblx0XHRcdGMtNS42LTUuNi0xMy04LjctMjAuOS04LjdjLTYuMiwwLTEyLjEsMS45LTE3LjEsNS41bC0yNy44LDE5LjhjLTEwLjgtNS43LTIyLjEtMTAuNC0zMy44LTEzLjlsLTUuNi0zMy4yXFxcblx0XHRcdGMtMi40LTE0LjMtMTQuNy0yNC43LTI5LjItMjQuN2gtNDIuMWMtMTQuNSwwLTI2LjgsMTAuNC0yOS4yLDI0LjdsLTUuOCwzNGMtMTEuMiwzLjUtMjIuMSw4LjEtMzIuNSwxMy43bC0yNy41LTE5LjhcXFxuXHRcdFx0Yy01LTMuNi0xMS01LjUtMTcuMi01LjVjLTcuOSwwLTE1LjQsMy4xLTIwLjksOC43bC0yOS45LDI5LjhjLTEwLjIsMTAuMi0xMS42LDI2LjMtMy4yLDM4LjFsMjAsMjguMVxcXG5cdFx0XHRjLTUuNSwxMC41LTkuOSwyMS40LTEzLjMsMzIuN2wtMzMuMiw1LjZjLTE0LjMsMi40LTI0LjcsMTQuNy0yNC43LDI5LjJ2NDIuMWMwLDE0LjUsMTAuNCwyNi44LDI0LjcsMjkuMmwzNCw1LjhcXFxuXHRcdFx0YzMuNSwxMS4yLDguMSwyMi4xLDEzLjcsMzIuNWwtMTkuNywyNy40Yy04LjQsMTEuOC03LjEsMjcuOSwzLjIsMzguMWwyOS44LDI5LjhjNS42LDUuNiwxMyw4LjcsMjAuOSw4LjdjNi4yLDAsMTIuMS0xLjksMTcuMS01LjVcXFxuXHRcdFx0bDI4LjEtMjBjMTAuMSw1LjMsMjAuNyw5LjYsMzEuNiwxM2w1LjYsMzMuNmMyLjQsMTQuMywxNC43LDI0LjcsMjkuMiwyNC43aDQyLjJjMTQuNSwwLDI2LjgtMTAuNCwyOS4yLTI0LjdsNS43LTMzLjZcXFxuXHRcdFx0YzExLjMtMy41LDIyLjItOCwzMi42LTEzLjVsMjcuNywxOS44YzUsMy42LDExLDUuNSwxNy4yLDUuNWwwLDBjNy45LDAsMTUuMy0zLjEsMjAuOS04LjdsMjkuOC0yOS44YzEwLjItMTAuMiwxMS42LTI2LjMsMy4yLTM4LjFcXFxuXHRcdFx0bC0xOS44LTI3LjhjNS41LTEwLjUsMTAuMS0yMS40LDEzLjUtMzIuNmwzMy42LTUuNmMxNC4zLTIuNCwyNC43LTE0LjcsMjQuNy0yOS4ydi00Mi4xXFxcblx0XHRcdEM0NzguOSwyMDMuODAxLDQ2OC41LDE5MS41MDEsNDU0LjIsMTg5LjEwMXogTTQ1MS45LDI2MC40MDFjMCwxLjMtMC45LDIuNC0yLjIsMi42bC00Miw3Yy01LjMsMC45LTkuNSw0LjgtMTAuOCw5LjlcXFxuXHRcdFx0Yy0zLjgsMTQuNy05LjYsMjguOC0xNy40LDQxLjljLTIuNyw0LjYtMi41LDEwLjMsMC42LDE0LjdsMjQuNywzNC44YzAuNywxLDAuNiwyLjUtMC4zLDMuNGwtMjkuOCwyOS44Yy0wLjcsMC43LTEuNCwwLjgtMS45LDAuOFxcXG5cdFx0XHRjLTAuNiwwLTEuMS0wLjItMS41LTAuNWwtMzQuNy0yNC43Yy00LjMtMy4xLTEwLjEtMy4zLTE0LjctMC42Yy0xMy4xLDcuOC0yNy4yLDEzLjYtNDEuOSwxNy40Yy01LjIsMS4zLTkuMSw1LjYtOS45LDEwLjhsLTcuMSw0MlxcXG5cdFx0XHRjLTAuMiwxLjMtMS4zLDIuMi0yLjYsMi4yaC00Mi4xYy0xLjMsMC0yLjQtMC45LTIuNi0yLjJsLTctNDJjLTAuOS01LjMtNC44LTkuNS05LjktMTAuOGMtMTQuMy0zLjctMjguMS05LjQtNDEtMTYuOFxcXG5cdFx0XHRjLTIuMS0xLjItNC41LTEuOC02LjgtMS44Yy0yLjcsMC01LjUsMC44LTcuOCwyLjVsLTM1LDI0LjljLTAuNSwwLjMtMSwwLjUtMS41LDAuNWMtMC40LDAtMS4yLTAuMS0xLjktMC44bC0yOS44LTI5LjhcXFxuXHRcdFx0Yy0wLjktMC45LTEtMi4zLTAuMy0zLjRsMjQuNi0zNC41YzMuMS00LjQsMy4zLTEwLjIsMC42LTE0LjhjLTcuOC0xMy0xMy44LTI3LjEtMTcuNi00MS44Yy0xLjQtNS4xLTUuNi05LTEwLjgtOS45bC00Mi4zLTcuMlxcXG5cdFx0XHRjLTEuMy0wLjItMi4yLTEuMy0yLjItMi42di00Mi4xYzAtMS4zLDAuOS0yLjQsMi4yLTIuNmw0MS43LTdjNS4zLTAuOSw5LjYtNC44LDEwLjktMTBjMy43LTE0LjcsOS40LTI4LjksMTcuMS00MlxcXG5cdFx0XHRjMi43LTQuNiwyLjQtMTAuMy0wLjctMTQuNmwtMjQuOS0zNWMtMC43LTEtMC42LTIuNSwwLjMtMy40bDI5LjgtMjkuOGMwLjctMC43LDEuNC0wLjgsMS45LTAuOGMwLjYsMCwxLjEsMC4yLDEuNSwwLjVsMzQuNSwyNC42XFxcblx0XHRcdGM0LjQsMy4xLDEwLjIsMy4zLDE0LjgsMC42YzEzLTcuOCwyNy4xLTEzLjgsNDEuOC0xNy42YzUuMS0xLjQsOS01LjYsOS45LTEwLjhsNy4yLTQyLjNjMC4yLTEuMywxLjMtMi4yLDIuNi0yLjJoNDIuMVxcXG5cdFx0XHRjMS4zLDAsMi40LDAuOSwyLjYsMi4ybDcsNDEuN2MwLjksNS4zLDQuOCw5LjYsMTAsMTAuOWMxNS4xLDMuOCwyOS41LDkuNyw0Mi45LDE3LjZjNC42LDIuNywxMC4zLDIuNSwxNC43LTAuNmwzNC41LTI0LjhcXFxuXHRcdFx0YzAuNS0wLjMsMS0wLjUsMS41LTAuNWMwLjQsMCwxLjIsMC4xLDEuOSwwLjhsMjkuOCwyOS44YzAuOSwwLjksMSwyLjMsMC4zLDMuNGwtMjQuNywzNC43Yy0zLjEsNC4zLTMuMywxMC4xLTAuNiwxNC43XFxcblx0XHRcdGM3LjgsMTMuMSwxMy42LDI3LjIsMTcuNCw0MS45YzEuMyw1LjIsNS42LDkuMSwxMC44LDkuOWw0Miw3LjFjMS4zLDAuMiwyLjIsMS4zLDIuMiwyLjZ2NDIuMUg0NTEuOXonKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMjM5LjQsMTM2LjAwMWMtNTcsMC0xMDMuMyw0Ni4zLTEwMy4zLDEwMy4zczQ2LjMsMTAzLjMsMTAzLjMsMTAzLjNzMTAzLjMtNDYuMywxMDMuMy0xMDMuM1MyOTYuNCwxMzYuMDAxLDIzOS40LDEzNi4wMDF6IE0yMzkuNCwzMTUuNjAxYy00Mi4xLDAtNzYuMy0zNC4yLTc2LjMtNzYuM3MzNC4yLTc2LjMsNzYuMy03Ni4zczc2LjMsMzQuMiw3Ni4zLDc2LjNTMjgxLjUsMzE1LjYwMSwyMzkuNCwzMTUuNjAxeicpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ljb247XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2V0dGluZ3NJY29uLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEEgVUkgY29tcG9uZW50IGNvbnRhaW5pbmcgYWxsIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NQYW5lbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmlkID0gJ3NldHRpbmdzLXBhbmVsJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BhbmVsLXdyYXAnKTtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcGFuZWxFbGVtLmNsYXNzTGlzdC5hZGQoJ3BhbmVsJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZChwYW5lbEVsZW0pO1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3NIZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzZXR0aW5nc0hlYWRpbmcuaWQgPSAnc2V0dGluZ3NIZWFkaW5nJztcbiAgICAgICAgICAgIHNldHRpbmdzSGVhZGluZy50ZXh0Q29udGVudCA9ICdTZXR0aW5ncyc7XG4gICAgICAgICAgICBwYW5lbEVsZW0uYXBwZW5kQ2hpbGQoc2V0dGluZ3NIZWFkaW5nKTtcbiAgICAgICAgICAgIHBhbmVsRWxlbS5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzQ2xvc2VCdXR0b24pO1xuICAgICAgICAgICAgcGFuZWxFbGVtLmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NDb250ZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc0NvbnRlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0NvbnRlbnRFbGVtZW50LmlkID0gJ3NldHRpbmdzQ29udGVudCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzQ29udGVudEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBzZXR0aW5nc0Nsb3NlQnV0dG9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzQ2xvc2VCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzQ2xvc2VCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzQ2xvc2VCdXR0b24uaWQgPSAnc2V0dGluZ3NDbG9zZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzQ2xvc2VCdXR0b247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgc2V0dGluZ3MgcGFuZWwuXG4gICAgICovXG4gICAgc2hvdygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncGFuZWwtd3JhcC12aXNpYmxlJykpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncGFuZWwtd3JhcC12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzZXR0aW5ncyBwYW5lbC5cbiAgICAgKi9cbiAgICB0b2dnbGVWaXNpYmlsaXR5KCkge1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3BhbmVsLXdyYXAtdmlzaWJsZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWRlIHNldHRpbmdzIHBhbmVsLlxuICAgICAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncGFuZWwtd3JhcC12aXNpYmxlJykpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncGFuZWwtd3JhcC12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nc1BhbmVsLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIFN0YXRzIGljb24gdGhhdCBjYW4gYmUgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRzSWNvbiB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0aGUgYnV0dG9uIGNvbnRhaW5pbmcgdGhlIHN0YXRzIGljb24uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQudHlwZSA9ICdidXR0b24nO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnVWlUb29sJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9ICdzdGF0c0J0bic7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzSWNvbik7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCB0b29sdGlwVGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b29sdGlwVGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dC5jbGFzc0xpc3QuYWRkKCd0b29sdGlwdGV4dCcpO1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQuaW5uZXJIVE1MID0gJ0luZm9ybWF0aW9uJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9vbHRpcFRleHQ7XG4gICAgfVxuICAgIGdldCBzdGF0c0ljb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdHNJY29uKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0ljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICdpZCcsICdzdGF0c0ljb24nKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneCcsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneScsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAndmlld0JveCcsICcwIDAgMzMwIDMzMCcpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHN2ZyBncm91cCBmb3IgdGhlIHBhdGhzXG4gICAgICAgICAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuY2xhc3NMaXN0LmFkZCgnc3ZnSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBwYXRocyBmb3IgdGhlIGljb24gaXRzZWxmLCB0aGUgaW5uZXIgYW5kIG91dCBwYXRoIG9mIGEgY29nXG4gICAgICAgICAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTE2NSwwLjAwOEM3NC4wMTksMC4wMDgsMCw3NC4wMjQsMCwxNjQuOTk5YzAsOTAuOTc3LDc0LjAxOSwxNjQuOTkyLDE2NSwxNjQuOTkyczE2NS03NC4wMTUsMTY1LTE2NC45OTJDMzMwLDc0LjAyNCwyNTUuOTgxLDAuMDA4LDE2NSwwLjAwOHogTTE2NSwyOTkuOTkyYy03NC40MzksMC0xMzUtNjAuNTU3LTEzNS0xMzQuOTkyUzkwLjU2MSwzMC4wMDgsMTY1LDMwLjAwOHMxMzUsNjAuNTU3LDEzNSwxMzQuOTkxQzMwMCwyMzkuNDM2LDIzOS40MzksMjk5Ljk5MiwxNjUsMjk5Ljk5MnonKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTY1LDEzMC4wMDhjLTguMjg0LDAtMTUsNi43MTYtMTUsMTV2OTkuOTgzYzAsOC4yODQsNi43MTYsMTUsMTUsMTVzMTUtNi43MTYsMTUtMTV2LTk5Ljk4M0MxODAsMTM2LjcyNSwxNzMuMjg0LDEzMC4wMDgsMTY1LDEzMC4wMDh6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTE2NSw3MC4wMTFjLTMuOTUsMC03LjgxMSwxLjYtMTAuNjEsNC4zOWMtMi43OSwyLjc5LTQuMzksNi42Ni00LjM5LDEwLjYxczEuNiw3LjgxLDQuMzksMTAuNjFjMi43OSwyLjc5LDYuNjYsNC4zOSwxMC42MSw0LjM5czcuODEtMS42LDEwLjYwOS00LjM5YzIuNzktMi44LDQuMzkxLTYuNjYsNC4zOTEtMTAuNjFzLTEuNjAxLTcuODItNC4zOTEtMTAuNjFDMTcyLjgxLDcxLjYxLDE2OC45NSw3MC4wMTEsMTY1LDcwLjAxMXonKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgyKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHNJY29uO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YXRzSWNvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTGF0ZW5jeVRlc3QgfSBmcm9tICcuL0xhdGVuY3lUZXN0JztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgTWF0aFV0aWxzIH0gZnJvbSAnLi4vVXRpbC9NYXRoVXRpbHMnO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCB9IGZyb20gJy4vRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCc7XG5pbXBvcnQgeyBpc1NlY3Rpb25FbmFibGVkLCBTdGF0c1NlY3Rpb25zIH0gZnJvbSAnLi9VSUNvbmZpZ3VyYXRpb25UeXBlcyc7XG4vKipcbiAqIEEgc3RhdCBzdHJ1Y3R1cmUsIGFuIGlkLCB0aGUgc3RhdCBzdHJpbmcsIGFuZCB0aGUgZWxlbWVudCB3aGVyZSBpdCBpcyByZW5kZXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXQge1xufVxuLyoqXG4gKiBBIFVJIGNvbXBvbmVudCBjb250YWluaW5nIGFsbCB0aGUgc3RhdHMgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRzUGFuZWwge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICAvKiBBIG1hcCBzdGF0cyB3ZSBhcmUgc3RvcmluZy9yZW5kZXJpbmcgKi9cbiAgICAgICAgdGhpcy5zdGF0c01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmxhdGVuY3lUZXN0ID0gbmV3IExhdGVuY3lUZXN0KCk7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdCA9IG5ldyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFJldHVybiBvciBjcmVhdGVzIGEgSFRNTCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGlzIHNldHRpbmcgaW4gdGhlIERPTS5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9ICdzdGF0cy1wYW5lbCc7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwYW5lbC13cmFwJyk7XG4gICAgICAgICAgICBjb25zdCBwYW5lbEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHBhbmVsRWxlbS5jbGFzc0xpc3QuYWRkKCdwYW5lbCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQocGFuZWxFbGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzSGVhZGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgc3RhdHNIZWFkaW5nLmlkID0gJ3N0YXRzSGVhZGluZyc7XG4gICAgICAgICAgICBzdGF0c0hlYWRpbmcudGV4dENvbnRlbnQgPSAnSW5mb3JtYXRpb24nO1xuICAgICAgICAgICAgcGFuZWxFbGVtLmFwcGVuZENoaWxkKHN0YXRzSGVhZGluZyk7XG4gICAgICAgICAgICBwYW5lbEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5zdGF0c0Nsb3NlQnV0dG9uKTtcbiAgICAgICAgICAgIHBhbmVsRWxlbS5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzQ29udGVudEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IHN0YXRzQ29udGVudEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdHNDb250ZW50RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNDb250ZW50RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNDb250ZW50RWxlbWVudC5pZCA9ICdzdGF0c0NvbnRlbnQnO1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtVG9vbFN0YXRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzdHJlYW1Ub29sU3RhdHMuaWQgPSAnc3RyZWFtVG9vbHNTdGF0cyc7XG4gICAgICAgICAgICBzdHJlYW1Ub29sU3RhdHMuY2xhc3NMaXN0LmFkZCgnY29udGFpbmVyJyk7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sU3RhdHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnRyb2xTdGF0cy5pZCA9ICdDb250cm9sU3RhdHMnO1xuICAgICAgICAgICAgY29udHJvbFN0YXRzLmNsYXNzTGlzdC5hZGQoJ3JvdycpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGlzdGljcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcbiAgICAgICAgICAgIHN0YXRpc3RpY3MuaWQgPSAnc3RhdGlzdGljcyc7XG4gICAgICAgICAgICBzdGF0aXN0aWNzLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzQ29udGFpbmVyJyk7XG4gICAgICAgICAgICBjb25zdCBsYXRlbmN5U3RhdHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHMuaWQgPSAnbGF0ZW5jeVN0YXRzJztcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0cy5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nc0NvbnRhaW5lcicpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGlzdGljc0hlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgc3RhdGlzdGljc0hlYWRlci5pZCA9ICdzdGF0aXN0aWNzSGVhZGVyJztcbiAgICAgICAgICAgIHN0YXRpc3RpY3NIZWFkZXIuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3MtdGV4dCcpO1xuICAgICAgICAgICAgc3RhdGlzdGljc0hlYWRlci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nc0hlYWRlcicpO1xuICAgICAgICAgICAgY29uc3QgbGF0ZW5jeVN0YXRzSGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNIZWFkZXIuaWQgPSAnbGF0ZW5jeVN0YXRzSGVhZGVyJztcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0hlYWRlci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy10ZXh0Jyk7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNIZWFkZXIuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NIZWFkZXInKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzQ29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3RyZWFtVG9vbFN0YXRzKTtcbiAgICAgICAgICAgIHN0cmVhbVRvb2xTdGF0cy5hcHBlbmRDaGlsZChjb250cm9sU3RhdHMpO1xuICAgICAgICAgICAgY29udHJvbFN0YXRzLmFwcGVuZENoaWxkKHN0YXRpc3RpY3MpO1xuICAgICAgICAgICAgY29udHJvbFN0YXRzLmFwcGVuZENoaWxkKGxhdGVuY3lTdGF0cyk7XG4gICAgICAgICAgICBzdGF0aXN0aWNzLmFwcGVuZENoaWxkKHN0YXRpc3RpY3NIZWFkZXIpO1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzLmFwcGVuZENoaWxkKGxhdGVuY3lTdGF0c0hlYWRlcik7XG4gICAgICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZCh0aGlzLl9jb25maWcsIFN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb25TdGF0c1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RhdHNUZXh0LmlubmVySFRNTCA9IFN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzO1xuICAgICAgICAgICAgICAgIHN0YXRpc3RpY3NIZWFkZXIuYXBwZW5kQ2hpbGQoc2Vzc2lvblN0YXRzVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aXN0aWNzLmFwcGVuZENoaWxkKHRoaXMuc3RhdGlzdGljc0NvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZCh0aGlzLl9jb25maWcsIFN0YXRzU2VjdGlvbnMuTGF0ZW5jeVN0YXRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVuY3lTdGF0c1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBsYXRlbmN5U3RhdHNUZXh0LmlubmVySFRNTCA9IFN0YXRzU2VjdGlvbnMuTGF0ZW5jeVN0YXRzO1xuICAgICAgICAgICAgICAgIGxhdGVuY3lTdGF0c0hlYWRlci5hcHBlbmRDaGlsZChsYXRlbmN5U3RhdHNUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhdGVuY3lTdGF0cy5hcHBlbmRDaGlsZCh0aGlzLmxhdGVuY3lTdGF0c0NvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZCh0aGlzLl9jb25maWcsIFN0YXRzU2VjdGlvbnMuTGF0ZW5jeVRlc3QpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbFN0YXRzLmFwcGVuZENoaWxkKHRoaXMubGF0ZW5jeVRlc3Qucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU2VjdGlvbkVuYWJsZWQodGhpcy5fY29uZmlnLCBTdGF0c1NlY3Rpb25zLkRhdGFDaGFubmVsTGF0ZW5jeVRlc3QpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbFN0YXRzLmFwcGVuZENoaWxkKHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRzQ29udGVudEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBzdGF0aXN0aWNzQ29udGFpbmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3N0YXRpc3RpY3NDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRpc3RpY3NDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRpc3RpY3NDb250YWluZXIuaWQgPSAnc3RhdGlzdGljc0NvbnRhaW5lcic7XG4gICAgICAgICAgICB0aGlzLl9zdGF0aXN0aWNzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGlzdGljc0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGlzdGljc0NvbnRhaW5lcjtcbiAgICB9XG4gICAgZ2V0IGxhdGVuY3lTdGF0c0NvbnRhaW5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sYXRlbmN5U3RhdHNDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lTdGF0c0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVN0YXRzQ29udGFpbmVyLmlkID0gJ2xhdGVuY3lTdGF0c0NvbnRhaW5lcic7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5U3RhdHNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5U3RhdHNDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5sYXRlbmN5UmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZW5jeVN0YXRzQ29udGFpbmVyO1xuICAgIH1cbiAgICBnZXQgc3RhdHNSZXN1bHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdHNSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzUmVzdWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c1Jlc3VsdC5pZCA9ICdzdGF0aXN0aWNzUmVzdWx0JztcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzUmVzdWx0LmNsYXNzTGlzdC5hZGQoJ1N0YXRzUmVzdWx0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRzUmVzdWx0O1xuICAgIH1cbiAgICBnZXQgbGF0ZW5jeVJlc3VsdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sYXRlbmN5UmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5UmVzdWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5UmVzdWx0LmlkID0gJ2xhdGVuY3lSZXN1bHQnO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVJlc3VsdC5jbGFzc0xpc3QuYWRkKCdTdGF0c1Jlc3VsdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXRlbmN5UmVzdWx0O1xuICAgIH1cbiAgICBnZXQgc3RhdHNDbG9zZUJ1dHRvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdGF0c0Nsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0Nsb3NlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0Nsb3NlQnV0dG9uLmlkID0gJ3N0YXRzQ2xvc2UnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0c0Nsb3NlQnV0dG9uO1xuICAgIH1cbiAgICBvbkRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMubGF0ZW5jeVRlc3QubGF0ZW5jeVRlc3RCdXR0b24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmxhdGVuY3lUZXN0QnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAvL2RvIG5vdGhpbmdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgb25WaWRlb0luaXRpYWxpemVkKHN0cmVhbSkge1xuICAgICAgICAvLyBzdGFydGluZyBhIGxhdGVuY3kgY2hlY2tcbiAgICAgICAgdGhpcy5sYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtLnJlcXVlc3RMYXRlbmN5VGVzdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsTGF0ZW5jeVRlc3QubGF0ZW5jeVRlc3RCdXR0b24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBzdHJlYW0ucmVxdWVzdERhdGFDaGFubmVsTGF0ZW5jeVRlc3Qoe1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgICAgIHJwczogMTAsXG4gICAgICAgICAgICAgICAgcmVxdWVzdFNpemU6IDIwMCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVNpemU6IDIwMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5oYW5kbGVUZXN0U3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uZmlndXJlKHNldHRpbmdzKSB7XG4gICAgICAgIGlmIChzZXR0aW5ncy5EaXNhYmxlTGF0ZW5jeVRlc3QpIHtcbiAgICAgICAgICAgIHRoaXMubGF0ZW5jeVRlc3QubGF0ZW5jeVRlc3RCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5sYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi50aXRsZSA9ICdEaXNhYmxlZCBieSAtUGl4ZWxTdHJlYW1pbmdEaXNhYmxlTGF0ZW5jeVRlc3Rlcj10cnVlJztcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRhdGFDaGFubmVsTGF0ZW5jeVRlc3QubGF0ZW5jeVRlc3RCdXR0b24udGl0bGUgPVxuICAgICAgICAgICAgICAgICdEaXNhYmxlZCBieSAtUGl4ZWxTdHJlYW1pbmdEaXNhYmxlTGF0ZW5jeVRlc3Rlcj10cnVlJztcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctUGl4ZWxTdHJlYW1pbmdEaXNhYmxlTGF0ZW5jeVRlc3Rlcj10cnVlLCByZXF1ZXN0aW5nIGxhdGVuY3kgcmVwb3J0IGZyb20gdGhlIHRoZSBicm93c2VyIHRvIFVFIGlzIGRpc2FibGVkLicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgc3RhdHMgcGFuZWwuXG4gICAgICovXG4gICAgc2hvdygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncGFuZWwtd3JhcC12aXNpYmxlJykpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncGFuZWwtd3JhcC12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzdGF0cyBwYW5lbC5cbiAgICAgKi9cbiAgICB0b2dnbGVWaXNpYmlsaXR5KCkge1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3BhbmVsLXdyYXAtdmlzaWJsZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBzdGF0cyBwYW5lbC5cbiAgICAgKi9cbiAgICBoaWRlKCkge1xuICAgICAgICBpZiAodGhpcy5yb290RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3BhbmVsLXdyYXAtdmlzaWJsZScpKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3BhbmVsLXdyYXAtdmlzaWJsZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVBsYXllckNvdW50KHBsYXllckNvdW50KSB7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnUGxheWVyQ291bnRTdGF0JywgJ1BsYXllcnMnLCBwbGF5ZXJDb3VudC50b1N0cmluZygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0YXRzIGNvbWluZyBpbiBmcm9tIGJyb3dzZXIvVUVcbiAgICAgKiBAcGFyYW0gc3RhdHMgLSB0aGUgc3RhdHMgc3RydWN0dXJlXG4gICAgICovXG4gICAgaGFuZGxlU3RhdHMoc3RhdHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAvLyBmb3JtYXQgbnVtYmVyaW5nIGJhc2VkIG9uIHRoZSBicm93c2VyIGxhbmd1YWdlXG4gICAgICAgIGNvbnN0IG51bWJlckZvcm1hdCA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlLCB7XG4gICAgICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDBcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEluYm91bmQgZGF0YVxuICAgICAgICBjb25zdCBpbmJvdW5kRGF0YSA9IE1hdGhVdGlscy5mb3JtYXRCeXRlcyhzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5ieXRlc1JlY2VpdmVkLCAyKTtcbiAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdJbmJvdW5kRGF0YVN0YXQnLCAnUmVjZWl2ZWQnLCBpbmJvdW5kRGF0YSk7XG4gICAgICAgIC8vIFBhY2tldHMgbG9zdFxuICAgICAgICBjb25zdCBwYWNrZXRzTG9zdFN0YXQgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMsICdwYWNrZXRzTG9zdCcpXG4gICAgICAgICAgICA/IG51bWJlckZvcm1hdC5mb3JtYXQoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMucGFja2V0c0xvc3QpXG4gICAgICAgICAgICA6ICdDaHJvbWUgb25seSc7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnUGFja2V0c0xvc3RTdGF0JywgJ1BhY2tldHMgTG9zdCcsIHBhY2tldHNMb3N0U3RhdCk7XG4gICAgICAgIC8vIEJpdHJhdGVcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnVmlkZW9CaXRyYXRlU3RhdCcsICdWaWRlbyBCaXRyYXRlIChrYnBzKScsIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRBdWRpb1N0YXRzLmJpdHJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnQXVkaW9CaXRyYXRlU3RhdCcsICdBdWRpbyBCaXRyYXRlIChrYnBzKScsIHN0YXRzLmluYm91bmRBdWRpb1N0YXRzLmJpdHJhdGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmlkZW8gcmVzb2x1dGlvblxuICAgICAgICBjb25zdCByZXNTdGF0ID0gc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVXaWR0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZVdpZHRoID4gMCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVIZWlnaHQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVIZWlnaHQgPiAwXG4gICAgICAgICAgICA/IHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lV2lkdGggKyAneCcgKyBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZUhlaWdodFxuICAgICAgICAgICAgOiAnQ2hyb21lIG9ubHknO1xuICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ1ZpZGVvUmVzU3RhdCcsICdWaWRlbyByZXNvbHV0aW9uJywgcmVzU3RhdCk7XG4gICAgICAgIC8vIEZyYW1lcyBkZWNvZGVkXG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEZWNvZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lc0RlY29kZWQgPSBudW1iZXJGb3JtYXQuZm9ybWF0KHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQpO1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdGcmFtZXNEZWNvZGVkU3RhdCcsICdGcmFtZXMgRGVjb2RlZCcsIGZyYW1lc0RlY29kZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZyYW1lcmF0ZVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzUGVyU2Vjb25kKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ0ZyYW1lcmF0ZVN0YXQnLCAnRnJhbWVyYXRlJywgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzUGVyU2Vjb25kLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZyYW1lcyBkcm9wcGVkXG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEcm9wcGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnRnJhbWVzRHJvcHBlZFN0YXQnLCAnRnJhbWVzIGRyb3BwZWQnLCBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEcm9wcGVkLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5jb2RlY0lkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ1ZpZGVvQ29kZWNTdGF0JywgJ1ZpZGVvIGNvZGVjJywgXG4gICAgICAgICAgICAvLyBTcGxpdCB0aGUgY29kZWMgdG8gcmVtb3ZlIHRoZSBGbXRwIGxpbmVcbiAgICAgICAgICAgIChfYiA9IChfYSA9IHN0YXRzLmNvZGVjcy5nZXQoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuY29kZWNJZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5taW1lVHlwZS5yZXBsYWNlKCd2aWRlby8nLCAnJykpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZEF1ZGlvU3RhdHMuY29kZWNJZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdBdWRpb0NvZGVjU3RhdCcsICdBdWRpbyBjb2RlYycsIFxuICAgICAgICAgICAgLy8gU3BsaXQgdGhlIGNvZGVjIHRvIHJlbW92ZSB0aGUgRm10cCBsaW5lXG4gICAgICAgICAgICAoX2QgPSAoX2MgPSBzdGF0cy5jb2RlY3MuZ2V0KHN0YXRzLmluYm91bmRBdWRpb1N0YXRzLmNvZGVjSWQpKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubWltZVR5cGUucmVwbGFjZSgnYXVkaW8vJywgJycpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RvcmUgdGhlIGFjdGl2ZSBjYW5kaWRhdGUgcGFpciByZXR1cm4gYSBuZXcgQ2FuZGlkYXRlIHBhaXIgc3RhdCBpZiBnZXRBY3RpdmVDYW5kaWRhdGUgaXMgbnVsbFxuICAgICAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGVQYWlyID0gc3RhdHMuZ2V0QWN0aXZlQ2FuZGlkYXRlUGFpcigpO1xuICAgICAgICBpZiAoYWN0aXZlQ2FuZGlkYXRlUGFpcikge1xuICAgICAgICAgICAgLy8gUlRUXG4gICAgICAgICAgICBjb25zdCBuZXRSVFQgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYWN0aXZlQ2FuZGlkYXRlUGFpciwgJ2N1cnJlbnRSb3VuZFRyaXBUaW1lJykgJiZcbiAgICAgICAgICAgICAgICBzdGF0cy5pc051bWJlcihhY3RpdmVDYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lKVxuICAgICAgICAgICAgICAgID8gTWF0aC5jZWlsKGFjdGl2ZUNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUgKiAxMDAwKS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgOiBcIkNhbid0IGNhbGN1bGF0ZVwiO1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdSVFRTdGF0JywgJ05ldCBSVFQgKG1zKScsIG5ldFJUVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdEdXJhdGlvblN0YXQnLCAnRHVyYXRpb24nLCBzdGF0cy5zZXNzaW9uU3RhdHMucnVuVGltZSk7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnQ29udHJvbHNJbnB1dFN0YXQnLCAnQ29udHJvbHMgc3RyZWFtIGlucHV0Jywgc3RhdHMuc2Vzc2lvblN0YXRzLmNvbnRyb2xzU3RyZWFtSW5wdXQpO1xuICAgICAgICAvLyBRUFxuICAgICAgICBpZiAoc3RhdHMuc2Vzc2lvblN0YXRzLnZpZGVvRW5jb2RlckF2Z1FQICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFOdW1iZXIuaXNOYU4oc3RhdHMuc2Vzc2lvblN0YXRzLnZpZGVvRW5jb2RlckF2Z1FQKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdRUFN0YXQnLCAnVmlkZW8gcXVhbnRpemF0aW9uIHBhcmFtZXRlcicsIHN0YXRzLnNlc3Npb25TdGF0cy52aWRlb0VuY29kZXJBdmdRUC50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBMb2dnZXIuSW5mbyhgLS0tLS0tLS0tIFN0YXRzIC0tLS0tLS0tLVxcbiAke0pTT04uc3RyaW5naWZ5KHN0YXRzKX1cXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgaGFuZGxlTGF0ZW5jeUluZm8obGF0ZW5jeUluZm8pIHtcbiAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEVuY29kZXIgbGF0ZW5jeVxuICAgICAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmVuY29kZXJMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnRW5jb2RlTGF0ZW5jeScsICdFbmNvZGUgbGF0ZW5jeSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmVuY29kZXJMYXRlbmN5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUGFja2V0aXplciBsYXRlbmN5XG4gICAgICAgICAgICBpZiAobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcucGFja2V0aXplTGF0ZW5jeU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlTGF0ZW5jeVN0YXQoJ1BhY2tldGl6ZXJMYXRlbmN5JywgJ1BhY2tldGl6ZXIgbGF0ZW5jeSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLnBhY2tldGl6ZUxhdGVuY3lNcykudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQYWNlciBsYXRlbmN5XG4gICAgICAgICAgICBpZiAobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcucGFjZXJMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnUGFjZXJMYXRlbmN5JywgJ1BhY2VyIGxhdGVuY3kgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5mcmFtZVRpbWluZy5wYWNlckxhdGVuY3lNcykudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZW5kZXIgbGF0ZW5jeSBjYWxjdWxhdGVkIHVzaW5nIHRpbWluZyBzdGF0c1xuICAgICAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmNhcHR1cmVUb1NlbmRMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnVmlkZW9UaW1pbmdDYXB0dXJlVG9TZW5kJywgJ1Bvc3QtY2FwdHVyZSB0byBzZW5kIGxhdGVuY3kgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5mcmFtZVRpbWluZy5jYXB0dXJlVG9TZW5kTGF0ZW5jeU1zKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeUluZm8uc2VuZGVyTGF0ZW5jeU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnQWJzQ2FwdHVyZVRpbWVUb1NlbmRMYXRlbmN5JywgJ1Bvc3QtY2FwdHVyZSAoYWJzLWN0KSB0byBzZW5kIGxhdGVuY3kgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5zZW5kZXJMYXRlbmN5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5SW5mby5hdmVyYWdlQXNzZW1ibHlEZWxheU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnQXZnQXNzZW1ibHlEZWxheScsICdBc3NlbWJseSBkZWxheSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmF2ZXJhZ2VBc3NlbWJseURlbGF5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5SW5mby5hdmVyYWdlRGVjb2RlTGF0ZW5jeU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnQXZnRGVjb2RlRGVsYXknLCAnRGVjb2RlIHRpbWUgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5hdmVyYWdlRGVjb2RlTGF0ZW5jeU1zKS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeUluZm8uYXZlcmFnZUppdHRlckJ1ZmZlckRlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdBdmdKaXR0ZXJCdWZmZXJEZWxheScsICdKaXR0ZXIgYnVmZmVyIChtcyknLCBNYXRoLmNlaWwobGF0ZW5jeUluZm8uYXZlcmFnZUppdHRlckJ1ZmZlckRlbGF5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5SW5mby5hdmVyYWdlUHJvY2Vzc2luZ0RlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdBdmdQcm9jZXNzaW5nRGVsYXknLCAnUHJvY2Vzc2luZyBkZWxheSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmF2ZXJhZ2VQcm9jZXNzaW5nRGVsYXlNcykudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmF2ZXJhZ2VFMkVMYXRlbmN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnQXZnRTJFTGF0ZW5jeScsICdUb3RhbCBsYXRlbmN5IChtcyknLCBNYXRoLmNlaWwobGF0ZW5jeUluZm8uYXZlcmFnZUUyRUxhdGVuY3kpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgc3RhdCB0byB0aGUgc3RhdHMgcmVzdWx0cyBpbiB0aGUgRE9NIG9yIHVwZGF0ZXMgYW4gZXhpdGluZyBzdGF0LlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgc3RhdCB0byBhZGQvdXBkYXRlLlxuICAgICAqIEBwYXJhbSBzdGF0IC0gVGhlIGNvbnRlbnRzIG9mIHRoZSBzdGF0LlxuICAgICAqL1xuICAgIGFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoaWQsIHN0YXRMYWJlbCwgc3RhdCkge1xuICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU3RhdChTdGF0c1NlY3Rpb25zLlNlc3Npb25TdGF0cywgaWQsIHN0YXRMYWJlbCwgc3RhdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgc3RhdCB0byB0aGUgbGF0ZW5jeSByZXN1bHRzIGluIHRoZSBET00gb3IgdXBkYXRlcyBhbiBleGl0aW5nIHN0YXQuXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBzdGF0IHRvIGFkZC91cGRhdGUuXG4gICAgICogQHBhcmFtIHN0YXQgLSBUaGUgY29udGVudHMgb2YgdGhlIHN0YXQuXG4gICAgICovXG4gICAgYWRkT3JVcGRhdGVMYXRlbmN5U3RhdChpZCwgc3RhdExhYmVsLCBzdGF0KSB7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTdGF0KFN0YXRzU2VjdGlvbnMuTGF0ZW5jeVN0YXRzLCBpZCwgc3RhdExhYmVsLCBzdGF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBzdGF0IHRvIHRoZSBzdGF0cyByZXN1bHRzIGluIHRoZSBET00gb3IgdXBkYXRlcyBhbiBleGl0aW5nIHN0YXQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25JZCAtIFRoZSBzZWN0aW9uIHRvIGFkZCB0aGlzIHN0YXQgdG9vLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgc3RhdCB0byBhZGQvdXBkYXRlLlxuICAgICAqIEBwYXJhbSBzdGF0IC0gVGhlIGNvbnRlbnRzIG9mIHRoZSBzdGF0LlxuICAgICAqL1xuICAgIGFkZE9yVXBkYXRlU3RhdChzZWN0aW9uSWQsIGlkLCBzdGF0TGFiZWwsIHN0YXQpIHtcbiAgICAgICAgaWYgKHNlY3Rpb25JZCA9PT0gU3RhdHNTZWN0aW9ucy5TZXNzaW9uU3RhdHMgJiZcbiAgICAgICAgICAgICFpc1NlY3Rpb25FbmFibGVkKHRoaXMuX2NvbmZpZywgU3RhdHNTZWN0aW9ucy5TZXNzaW9uU3RhdHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY3Rpb25JZCA9PT0gU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMgJiZcbiAgICAgICAgICAgICFpc1NlY3Rpb25FbmFibGVkKHRoaXMuX2NvbmZpZywgU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBzdXBwb3J0IHNlc3Npb24gb3IgbGF0ZW5jeSBzdGF0cyBiZWluZyB1cGRhdGVkIGluIHRoaXMgZnVuY3Rpb24gY3VycmVudGx5XG4gICAgICAgIGlmIChzZWN0aW9uSWQgIT09IFN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzICYmIHNlY3Rpb25JZCAhPT0gU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnRFbGVtID0gc2VjdGlvbklkID09PSBTdGF0c1NlY3Rpb25zLlNlc3Npb25TdGF0cyA/IHRoaXMuc3RhdHNSZXN1bHQgOiB0aGlzLmxhdGVuY3lSZXN1bHQ7XG4gICAgICAgIGNvbnN0IHN0YXRIVE1MID0gYCR7c3RhdExhYmVsfTogJHtzdGF0fWA7XG4gICAgICAgIGlmICghdGhpcy5zdGF0c01hcC5oYXMoaWQpKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHN0YXRcbiAgICAgICAgICAgIGNvbnN0IG5ld1N0YXQgPSBuZXcgU3RhdCgpO1xuICAgICAgICAgICAgbmV3U3RhdC5pZCA9IGlkO1xuICAgICAgICAgICAgbmV3U3RhdC5zdGF0ID0gc3RhdDtcbiAgICAgICAgICAgIG5ld1N0YXQudGl0bGUgPSBzdGF0TGFiZWw7XG4gICAgICAgICAgICBuZXdTdGF0LmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIG5ld1N0YXQuZWxlbWVudC5pbm5lckhUTUwgPSBzdGF0SFRNTDtcbiAgICAgICAgICAgIC8vIGFkZCB0aGUgc3RhdCB0byB0aGUgZG9tXG4gICAgICAgICAgICBwYXJlbnRFbGVtLmFwcGVuZENoaWxkKG5ld1N0YXQuZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRzTWFwLnNldChpZCwgbmV3U3RhdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBleGlzdGluZyBzdGF0XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnN0YXRzTWFwLmdldChpZCk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmVsZW1lbnQuaW5uZXJIVE1MID0gc3RhdEhUTUw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGF0c1BhbmVsLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgY2xhc3MgRXh0cmFGbGFncyB7XG59XG5FeHRyYUZsYWdzLkxpZ2h0TW9kZSA9ICdMaWdodE1vZGUnO1xuLyoqXG4gKiBBbGwgdGhlIFVJIHNlY3Rpb25zIGFjcm9zcyBhbGwgdGhlIHBhbmVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VjdGlvbnMge1xufVxuU2V0dGluZ3NTZWN0aW9ucy5QaXhlbFN0cmVhbWluZyA9ICdQaXhlbCBTdHJlYW1pbmcnO1xuU2V0dGluZ3NTZWN0aW9ucy5VSSA9ICdVSSc7XG5TZXR0aW5nc1NlY3Rpb25zLklucHV0ID0gJ0lucHV0JztcblNldHRpbmdzU2VjdGlvbnMuRW5jb2RlciA9ICdFbmNvZGVyJztcblNldHRpbmdzU2VjdGlvbnMuV2ViUlRDID0gJ1dlYlJUQyc7XG5TZXR0aW5nc1NlY3Rpb25zLkNvbW1hbmRzID0gJ0NvbW1hbmRzJztcbmV4cG9ydCBjbGFzcyBTdGF0c1NlY3Rpb25zIHtcbn1cblN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzID0gJ1Nlc3Npb24gU3RhdHMnO1xuU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMgPSAnTGF0ZW5jeSBTdGF0cyc7XG5TdGF0c1NlY3Rpb25zLkxhdGVuY3lUZXN0ID0gJ0xhdGVuY3kgVGVzdCc7XG5TdGF0c1NlY3Rpb25zLkRhdGFDaGFubmVsTGF0ZW5jeVRlc3QgPSAnRGF0YSBDaGFubmVsIExhdGVuY3kgVGVzdCc7XG4vKiogV2hldGhlciBhIHN0cmVhbSBVSSBlbGVtZW50IGlzIGludGVybmFsbHkgbWFkZSwgZXh0ZXJuYWxseSBwcm92aWRlZCwgb3IgZGlzYWJsZWQuICovXG5leHBvcnQgdmFyIFVJRWxlbWVudENyZWF0aW9uTW9kZTtcbihmdW5jdGlvbiAoVUlFbGVtZW50Q3JlYXRpb25Nb2RlKSB7XG4gICAgVUlFbGVtZW50Q3JlYXRpb25Nb2RlW1VJRWxlbWVudENyZWF0aW9uTW9kZVtcIkNyZWF0ZURlZmF1bHRFbGVtZW50XCJdID0gMF0gPSBcIkNyZWF0ZURlZmF1bHRFbGVtZW50XCI7XG4gICAgVUlFbGVtZW50Q3JlYXRpb25Nb2RlW1VJRWxlbWVudENyZWF0aW9uTW9kZVtcIlVzZUN1c3RvbUVsZW1lbnRcIl0gPSAxXSA9IFwiVXNlQ3VzdG9tRWxlbWVudFwiO1xuICAgIFVJRWxlbWVudENyZWF0aW9uTW9kZVtVSUVsZW1lbnRDcmVhdGlvbk1vZGVbXCJEaXNhYmxlXCJdID0gMl0gPSBcIkRpc2FibGVcIjtcbn0pKFVJRWxlbWVudENyZWF0aW9uTW9kZSB8fCAoVUlFbGVtZW50Q3JlYXRpb25Nb2RlID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBpc1BhbmVsRW5hYmxlZChjb25maWcpIHtcbiAgICByZXR1cm4gIWNvbmZpZyB8fCAoISFjb25maWcgJiYgY29uZmlnLmlzRW5hYmxlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTZWN0aW9uRW5hYmxlZChjb25maWcsIHNlY3Rpb24pIHtcbiAgICByZXR1cm4gKCFjb25maWcgfHxcbiAgICAgICAgKCEhY29uZmlnICYmXG4gICAgICAgICAgICAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcuc2VjdGlvblZpc2liaWxpdHksIHNlY3Rpb24pIHx8XG4gICAgICAgICAgICAgICAgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcuc2VjdGlvblZpc2liaWxpdHksIHNlY3Rpb24pICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZWN0aW9uVmlzaWJpbGl0eVtzZWN0aW9uXSkpKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTZXR0aW5nRW5hYmxlZChjb25maWcsIHNldHRpbmcpIHtcbiAgICByZXR1cm4gKCFjb25maWcgfHxcbiAgICAgICAgKCEhY29uZmlnICYmXG4gICAgICAgICAgICAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcuc2V0dGluZ1Zpc2liaWxpdHksIHNldHRpbmcpIHx8XG4gICAgICAgICAgICAgICAgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcuc2V0dGluZ1Zpc2liaWxpdHksIHNldHRpbmcpICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXR0aW5nVmlzaWJpbGl0eVtzZXR0aW5nXSkpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VSUNvbmZpZ3VyYXRpb25UeXBlcy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBBIFVJIGVsZW1lbnQgc2hvd2luZyB0aGUgUVAgKHF1YW50aXphdGlvbiBwYXJhbWV0ZXIpIG9mIHRoZSB2aWRlbyBzdHJlYW0gYXQgdGhlIGxhc3QgZW5jb2RlZCBmcmFtZSAod2VsbCwgbGFzdCB0cmFuc21pdHRlZCBRUCByZWFsbHkpLlxuICogQSBibG9ja2llciBlbmNvZGluZyB3aWxsIGhhdmUgYSBoaWdoZXIgUVAgYW5kIHRoaXMgd2lsbCBtYWtlIHRoZSBpbmRpY2F0b3IgdHVybiBtb3JlIHJlZC5cbiAqIEEgbm9uLWJsb2NreSBzdHJlYW0gd2lsbCBoYXZlIGEgbG93ZXIgUVAgYW5kIHRoaXMgd2lsbCBtYWtlIHRoZSBpbmRpY2F0b3IgdHVybiBtb3JlIGdyZWVuLlxuICogVGhlIFFQIGluZGljYXRvciBpcyByZXByZXNlbnRlZCB2aXN1YWxseSB1c2luZyBhIFdpRmkgaWNvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFZpZGVvUXBJbmRpY2F0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICB0aGlzLnZpZGVvRW5jb2RlckF2Z1FQID0gLTE7XG4gICAgICAgIC8vIG5vbiBodG1sIGVsZW1lbnRzXG4gICAgICAgIHRoaXMuc3RhdHNUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuY29sb3IgPSAnJztcbiAgICAgICAgLy8gcXAgY29sb3JzXG4gICAgICAgIHRoaXMub3JhbmdlUVAgPSAyNjtcbiAgICAgICAgdGhpcy5yZWRRUCA9IDM1O1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByb290IGVsZW1lbnQgb2YgdGhlIFFQIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJvb3QgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBzdmcgZm9yIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSAnY29ubmVjdGlvbic7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdVaVRvb2wnKTtcbiAgICAgICAgICAgIC8vIGFkZCBzdmcgaWNvbiBmb3IgdGhlIGNvbm5lY3Rpb24gc3RyZW5ndGhcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucXVhbGl0eVN0YXR1cyk7XG4gICAgICAgICAgICAvLyBhZGQgdGhlIHRleHQgdW5kZXJuZWF0aCB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5xdWFsaXR5VGV4dCk7XG4gICAgICAgICAgICAvLyBzZXQgY29sb3JzIHRvIG5vdCBjb25uZWN0ZWQgaW5pdGlhbGx5XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVFwVG9vbHRpcCgtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRleHQgdGhhdCBkaXNwbGF5cyB1bmRlciB0aGUgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgcXVhbGl0eVRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcXVhbGl0eVRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3F1YWxpdHlUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fcXVhbGl0eVRleHQuaWQgPSAncXVhbGl0eVRleHQnO1xuICAgICAgICAgICAgdGhpcy5fcXVhbGl0eVRleHQuY2xhc3NMaXN0LmFkZCgndG9vbHRpcHRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcXVhbGl0eVRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgcXVhbGl0eVN0YXR1cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9xdWFsaXR5U3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLl9xdWFsaXR5U3RhdHVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICAgIHRoaXMuX3F1YWxpdHlTdGF0dXMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2lkJywgJ2Nvbm5lY3Rpb25TdHJlbmd0aCcpO1xuICAgICAgICAgICAgdGhpcy5fcXVhbGl0eVN0YXR1cy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneCcsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3F1YWxpdHlTdGF0dXMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3knLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9xdWFsaXR5U3RhdHVzLnNldEF0dHJpYnV0ZU5TKG51bGwsICd2aWV3Qm94JywgJzAgMCA0OTQuNDUgNDk0LjQ1Jyk7XG4gICAgICAgICAgICAvLyBidWlsZCB3aWZpIGljb25cbiAgICAgICAgICAgIHRoaXMucXVhbGl0eVN0YXR1cy5hcHBlbmRDaGlsZCh0aGlzLmRvdCk7XG4gICAgICAgICAgICB0aGlzLnF1YWxpdHlTdGF0dXMuYXBwZW5kQ2hpbGQodGhpcy5taWRkbGUpO1xuICAgICAgICAgICAgdGhpcy5xdWFsaXR5U3RhdHVzLmFwcGVuZENoaWxkKHRoaXMub3V0ZXIpO1xuICAgICAgICAgICAgdGhpcy5xdWFsaXR5U3RhdHVzLmFwcGVuZENoaWxkKHRoaXMuaW5uZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWFsaXR5U3RhdHVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRvdCBhdCB0aGUgYm90dG9tIG9mIHRoZSB3aWZpIGljb24uXG4gICAgICovXG4gICAgZ2V0IGRvdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnY2lyY2xlJyk7XG4gICAgICAgICAgICB0aGlzLl9kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2lkJywgJ2RvdCcpO1xuICAgICAgICAgICAgdGhpcy5fZG90LnNldEF0dHJpYnV0ZU5TKG51bGwsICdjeCcsICcyNDcuMTI1Jyk7XG4gICAgICAgICAgICB0aGlzLl9kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N5JywgJzM5OC45MjUnKTtcbiAgICAgICAgICAgIHRoaXMuX2RvdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAncicsICczNS4zJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvdXRlciBhcmMgb2YgdGhlIHdpZmkgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgb3V0ZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5fb3V0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX291dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICB0aGlzLl9vdXRlci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnb3V0ZXInKTtcbiAgICAgICAgICAgIHRoaXMuX291dGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ000NjcuOTI1LDIwNC42MjVjLTYuOCwwLTEzLjUtMi42LTE4LjctNy44Yy0xMTEuNS0xMTEuNC0yOTIuNy0xMTEuNC00MDQuMSwwYy0xMC4zLDEwLjMtMjcuMSwxMC4zLTM3LjQsMHMtMTAuMy0yNy4xLDAtMzcuNGM2NC02NCwxNDktOTkuMiwyMzkuNS05OS4yczE3NS41LDM1LjIsMjM5LjUsOTkuMmMxMC4zLDEwLjMsMTAuMywyNy4xLDAsMzcuNEM0ODEuNDI1LDIwMi4wMjUsNDc0LjYyNSwyMDQuNjI1LDQ2Ny45MjUsMjA0LjYyNXonKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fb3V0ZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWlkZGxlIGFyYyBvZiB0aGUgd2lmaSBpY29uLlxuICAgICAqL1xuICAgIGdldCBtaWRkbGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWlkZGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9taWRkbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHRoaXMuX21pZGRsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnbWlkZGxlJyk7XG4gICAgICAgICAgICB0aGlzLl9taWRkbGUuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTM5NS4yMjUsMjc3LjMyNWMtNi44LDAtMTMuNS0yLjYtMTguNy03LjhjLTcxLjQtNzEuMy0xODcuNC03MS4zLTI1OC44LDBjLTEwLjMsMTAuMy0yNy4xLDEwLjMtMzcuNCwwcy0xMC4zLTI3LjEsMC0zNy40YzkyLTkyLDI0MS42LTkyLDMzMy42LDBjMTAuMywxMC4zLDEwLjMsMjcuMSwwLDM3LjRDNDA4LjcyNSwyNzQuNzI1LDQwMS45MjUsMjc3LjMyNSwzOTUuMjI1LDI3Ny4zMjV6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21pZGRsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBpbm5lciBhcmMgb2YgdGhlIHdpZmkgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgaW5uZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5uZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICB0aGlzLl9pbm5lci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnaW5uZXInKTtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00zMjMuNjI1LDM0OC44MjVjLTYuOCwwLTEzLjUtMi42LTE4LjctNy44Yy0xNS40LTE1LjQtMzYtMjMuOS01Ny44LTIzLjlzLTQyLjQsOC41LTU3LjgsMjMuOWMtMTAuMywxMC4zLTI3LjEsMTAuMy0zNy40LDBjLTEwLjMtMTAuMy0xMC4zLTI3LjEsMC0zNy40YzI1LjQtMjUuNCw1OS4yLTM5LjQsOTUuMi0zOS40czY5LjgsMTQsOTUuMiwzOS41YzEwLjMsMTAuMywxMC4zLDI3LjEsMCwzNy40QzMzNy4yMjUsMzQ2LjIyNSwzMzAuNDI1LDM0OC44MjUsMzIzLjYyNSwzNDguODI1eicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlZCB0byBzZXQgdGhlIHNwZWVkIG9mIHRoZSBzdGF0dXMgbGlnaHQuXG4gICAgICogQHBhcmFtIHNwZWVkIC0gU2V0IHRoZSBzcGVlZCBvZiB0aGUgYmxpbmssIGhpZ2hlciBudW1iZXJzIG1ha2UgdGhlIHN0YXR1cyBsaWdodCBibGluayBmYXN0ZXIuXG4gICAgICovXG4gICAgYmxpbmtWaWRlb1F1YWxpdHlTdGF0dXMoc3BlZWQpIHtcbiAgICAgICAgbGV0IGl0ZXJhdGlvbiA9IHNwZWVkO1xuICAgICAgICBsZXQgb3BhY2l0eSA9IDE7XG4gICAgICAgIGNvbnN0IHRpY2tJRCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIG9wYWNpdHkgLT0gMC4xO1xuICAgICAgICAgICAgdGhpcy5xdWFsaXR5VGV4dC5zdHlsZS5vcGFjaXR5ID0gU3RyaW5nKE1hdGguYWJzKChvcGFjaXR5IC0gMC41KSAqIDIpKTtcbiAgICAgICAgICAgIGlmIChvcGFjaXR5IDw9IDAuMSkge1xuICAgICAgICAgICAgICAgIGlmICgtLWl0ZXJhdGlvbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGlja0lEKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwIC8gc3BlZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB1cGRhdGVzIHRoZSBRUCB0b29sdGlwIGJ5IGNvbnZlcnRpbmcgdGhlIFZpZGVvIEVuY29kZXIgUVAgdG8gYSBjb2xvciBsaWdodFxuICAgICAqIEBwYXJhbSBRUCAtIFRoZSB2aWRlbyBlbmNvZGVyIFFQIG51bWJlciBuZWVkZWQgdG8gZmluZCB0aGUgYXZlcmFnZVxuICAgICAqL1xuICAgIHVwZGF0ZVFwVG9vbHRpcChRUCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMudmlkZW9FbmNvZGVyQXZnUVAgPSBRUDtcbiAgICAgICAgaWYgKFFQID4gdGhpcy5yZWRRUCkge1xuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdyZWQnO1xuICAgICAgICAgICAgdGhpcy5ibGlua1ZpZGVvUXVhbGl0eVN0YXR1cygyKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHNUZXh0ID0gYDxkaXYgc3R5bGU9XCJjb2xvcjogJHt0aGlzLmNvbG9yfVwiPlBvb3IgZW5jb2RpbmcgcXVhbGl0eTwvZGl2PmA7XG4gICAgICAgICAgICB0aGlzLm91dGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMubWlkZGxlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMuaW5uZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCB0aGlzLmNvbG9yKTtcbiAgICAgICAgICAgIHRoaXMuZG90LnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5jb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUVAgPiB0aGlzLm9yYW5nZVFQKSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ29yYW5nZSc7XG4gICAgICAgICAgICB0aGlzLmJsaW5rVmlkZW9RdWFsaXR5U3RhdHVzKDEpO1xuICAgICAgICAgICAgdGhpcy5zdGF0c1RleHQgPSBgPGRpdiBzdHlsZT1cImNvbG9yOiAke3RoaXMuY29sb3J9XCI+QmxvY2t5IGVuY29kaW5nIHF1YWxpdHk8L2Rpdj5gO1xuICAgICAgICAgICAgdGhpcy5vdXRlci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjM2MzYjQwJyk7XG4gICAgICAgICAgICB0aGlzLm1pZGRsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5pbm5lci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCB0aGlzLmNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChRUCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJyNiMGIwYjAnO1xuICAgICAgICAgICAgdGhpcy5vdXRlci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjM2MzYjQwJyk7XG4gICAgICAgICAgICB0aGlzLm1pZGRsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjM2MzYjQwJyk7XG4gICAgICAgICAgICB0aGlzLmlubmVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMuZG90LnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHNUZXh0ID0gYDxkaXYgc3R5bGU9XCJjb2xvcjogJHt0aGlzLmNvbG9yfVwiPk5vdCBjb25uZWN0ZWQ8L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdsaW1lJztcbiAgICAgICAgICAgIHRoaXMucXVhbGl0eVN0YXR1cy5zdHlsZS5vcGFjaXR5ID0gKChfYSA9IHRoaXMuY29uZmlnKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZVdoZW5Hb29kKSA9PSB0cnVlID8gJzAnIDogJzEnO1xuICAgICAgICAgICAgdGhpcy5zdGF0c1RleHQgPSBgPGRpdiBzdHlsZT1cImNvbG9yOiAke3RoaXMuY29sb3J9XCI+Q2xlYXIgZW5jb2RpbmcgcXVhbGl0eTwvZGl2PmA7XG4gICAgICAgICAgICB0aGlzLm91dGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLm1pZGRsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5pbm5lci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCB0aGlzLmNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1YWxpdHlUZXh0LmlubmVySFRNTCA9IHRoaXMuc3RhdHNUZXh0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZGVvUXBJbmRpY2F0b3IuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogWFIgaWNvbiB0aGF0IGNhbiBiZSBjbGlja2VkLlxuICovXG5leHBvcnQgY2xhc3MgWFJJY29uIHtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRoZSBidXR0b24gY29udGFpbmluZyB0aGUgWFIgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdVaVRvb2wnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmlkID0gJ3hyQnRuJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMueHJJY29uKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcFRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IHRvb2x0aXBUZXh0KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rvb2x0aXBUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0LmNsYXNzTGlzdC5hZGQoJ3Rvb2x0aXB0ZXh0Jyk7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dC5pbm5lckhUTUwgPSAnWFInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90b29sdGlwVGV4dDtcbiAgICB9XG4gICAgZ2V0IHhySWNvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl94ckljb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3hySWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgICAgICAgICB0aGlzLl94ckljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ2lkJywgJ3hySWNvbicpO1xuICAgICAgICAgICAgdGhpcy5feHJJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd4JywgJzBweCcpO1xuICAgICAgICAgICAgdGhpcy5feHJJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd5JywgJzBweCcpO1xuICAgICAgICAgICAgdGhpcy5feHJJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd2aWV3Qm94JywgJzAgMCAxMDAgMTAwJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgc3ZnIGdyb3VwIGZvciB0aGUgcGF0aHNcbiAgICAgICAgICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBzdmdHcm91cC5jbGFzc0xpc3QuYWRkKCdzdmdJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl94ckljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHBhdGhzIGZvciB0aGUgaWNvbiBpdHNlbGYsIHRoZSBwYXRoIG9mIHRoZSB4ciBoZWFkc2V0XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00yOSA0MWMtNSAwLTkgNC05IDlzNCA5IDkgOSA5LTQgOS05LTQtOS05LTl6bTAgMTRjLTIuOCAwLTUtMi4yLTUtNXMyLjItNSA1LTUgNSAyLjIgNSA1LTIuMiA1LTUgNXptNDItMTRjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05em0wIDE0Yy0yLjggMC01LTIuMi01LTVzMi4yLTUgNS01IDUgMi4yIDUgNS0yLjIgNS01IDV6bTEyLTMxSDE3Yy02LjYgMC0xMiA1LjQtMTIgMTJ2MjhjMCA2LjYgNS40IDEyIDEyIDEyaDE0LjVjMy41IDAgNi44LTEuNSA5LTQuMWwzLjUtNGMxLjUtMS43IDMuNy0yLjcgNi0yLjdzNC41IDEgNiAyLjdsMy41IDRjMi4zIDIuNiA1LjYgNC4xIDkgNC4xSDgzYzYuNiAwIDEyLTUuNCAxMi0xMlYzNmMwLTYuNi01LjQtMTItMTItMTJ6bTggNDBjMCA0LjQtMy42IDgtOCA4SDY4LjVjLTIuMyAwLTQuNS0xLTYtMi43bC0zLjUtNGMtMi4zLTIuNi01LjYtNC4xLTktNC4xLTMuNSAwLTYuOCAxLjUtOSA0LjFsLTMuNSA0QzM2IDcxIDMzLjggNzIgMzEuNSA3MkgxN2MtNC40IDAtOC0zLjYtOC04VjM2YzAtNC40IDMuNi04IDgtOGg2NmM0LjQgMCA4IDMuNiA4IDh2Mjh6Jyk7XG4gICAgICAgICAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5feHJJY29uO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVhSSWNvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IGNsYXNzIE1hdGhVdGlscyB7XG4gICAgLyoqXG4gICAgICogZm9ybWF0cyBCeXRlcyBjb21pbmcgaW4gZm9yIHZpZGVvIHN0YXRzXG4gICAgICogQHBhcmFtIGJ5dGVzIC0gbnVtYmVyIHRvIGNvbnZlcnRcbiAgICAgKiBAcGFyYW0gZGVjaW1hbHMgLSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZm9ybWF0Qnl0ZXMoYnl0ZXMsIGRlY2ltYWxzKSB7XG4gICAgICAgIGlmIChieXRlcyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmYWN0b3IgPSAxMDI0O1xuICAgICAgICBjb25zdCBkbSA9IGRlY2ltYWxzIDwgMCA/IDAgOiBkZWNpbWFscztcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tpQicsICdNaUInLCAnR2lCJywgJ1RpQicsICdQaUInLCAnRWlCJywgJ1ppQicsICdZaUInXTtcbiAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coZmFjdG9yKSk7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGZhY3RvciwgaSkpLnRvRml4ZWQoZG0pKSArICcgJyArIHNpemVzW2ldO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1hdGhVdGlscy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IHsgQXBwbGljYXRpb24gfSBmcm9tICcuL0FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uJztcbmV4cG9ydCB7IFBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZSB9IGZyb20gJy4vU3R5bGVzL1BpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZXMnO1xuZXhwb3J0IHsgQUZLT3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheS9BRktPdmVybGF5JztcbmV4cG9ydCB7IEFjdGlvbk92ZXJsYXkgfSBmcm9tICcuL092ZXJsYXkvQWN0aW9uT3ZlcmxheSc7XG5leHBvcnQgeyBPdmVybGF5QmFzZSB9IGZyb20gJy4vT3ZlcmxheS9CYXNlT3ZlcmxheSc7XG5leHBvcnQgeyBDb25uZWN0T3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheS9Db25uZWN0T3ZlcmxheSc7XG5leHBvcnQgeyBEaXNjb25uZWN0T3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheS9EaXNjb25uZWN0T3ZlcmxheSc7XG5leHBvcnQgeyBFcnJvck92ZXJsYXkgfSBmcm9tICcuL092ZXJsYXkvRXJyb3JPdmVybGF5JztcbmV4cG9ydCB7IEluZm9PdmVybGF5IH0gZnJvbSAnLi9PdmVybGF5L0luZm9PdmVybGF5JztcbmV4cG9ydCB7IFBsYXlPdmVybGF5IH0gZnJvbSAnLi9PdmVybGF5L1BsYXlPdmVybGF5JztcbmV4cG9ydCB7IFRleHRPdmVybGF5IH0gZnJvbSAnLi9PdmVybGF5L1RleHRPdmVybGF5JztcbmV4cG9ydCB7IENvbmZpZ1VJIH0gZnJvbSAnLi9Db25maWcvQ29uZmlnVUknO1xuZXhwb3J0IHsgU2V0dGluZ1VJQmFzZSB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdVSUJhc2UnO1xuZXhwb3J0IHsgU2V0dGluZ1VJRmxhZyB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdVSUZsYWcnO1xuZXhwb3J0IHsgU2V0dGluZ1VJTnVtYmVyIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ1VJTnVtYmVyJztcbmV4cG9ydCB7IFNldHRpbmdVSU9wdGlvbiB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdVSU9wdGlvbic7XG5leHBvcnQgeyBTZXR0aW5nVUlUZXh0IH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ1VJVGV4dCc7XG5leHBvcnQgeyBVSUVsZW1lbnRDcmVhdGlvbk1vZGUgfSBmcm9tICcuL1VJL1VJQ29uZmlndXJhdGlvblR5cGVzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWkuanMubWFwIiwiLyoqXG4gKiBhc3NlcnQgdGhhdCBjb25kaXRpb24gaXMgdHJ1ZSBvciB0aHJvdyBlcnJvciAod2l0aCBtZXNzYWdlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbXNnKSB7XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxufVxuLyoqXG4gKiBhc3NlcnQgdGhhdCB2YWx1ZSBjYW5ub3QgZXhpc3QgPSB0eXBlIGBuZXZlcmAuIHRocm93IHJ1bnRpbWUgZXJyb3IgaWYgaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ldmVyKHZhbHVlLCBtc2cpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnICE9PSBudWxsICYmIG1zZyAhPT0gdm9pZCAwID8gbXNnIDogJ1VuZXhwZWN0ZWQgb2JqZWN0OiAnICsgdmFsdWUpO1xufVxuY29uc3QgRkxPQVQzMl9NQVggPSAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCBGTE9BVDMyX01JTiA9IC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCBVSU5UMzJfTUFYID0gMHhGRkZGRkZGRiwgSU5UMzJfTUFYID0gMFg3RkZGRkZGRiwgSU5UMzJfTUlOID0gLTBYODAwMDAwMDA7XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW50MzIoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09IFwibnVtYmVyXCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnQgMzI6ICcgKyB0eXBlb2YgYXJnKTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYXJnKSB8fCBhcmcgPiBJTlQzMl9NQVggfHwgYXJnIDwgSU5UMzJfTUlOKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW50IDMyOiAnICsgYXJnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRVSW50MzIoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09IFwibnVtYmVyXCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1aW50IDMyOiAnICsgdHlwZW9mIGFyZyk7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGFyZykgfHwgYXJnID4gVUlOVDMyX01BWCB8fCBhcmcgPCAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdWludCAzMjogJyArIGFyZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RmxvYXQzMihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZsb2F0IDMyOiAnICsgdHlwZW9mIGFyZyk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoYXJnKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChhcmcgPiBGTE9BVDMyX01BWCB8fCBhcmcgPCBGTE9BVDMyX01JTilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZsb2F0IDMyOiAnICsgYXJnKTtcbn1cbiIsIi8vIGxvb2t1cCB0YWJsZSBmcm9tIGJhc2U2NCBjaGFyYWN0ZXIgdG8gYnl0ZVxubGV0IGVuY1RhYmxlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcbi8vIGxvb2t1cCB0YWJsZSBmcm9tIGJhc2U2NCBjaGFyYWN0ZXIgKmNvZGUqIHRvIGJ5dGUgYmVjYXVzZSBsb29rdXAgYnkgbnVtYmVyIGlzIGZhc3RcbmxldCBkZWNUYWJsZSA9IFtdO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNUYWJsZS5sZW5ndGg7IGkrKylcbiAgICBkZWNUYWJsZVtlbmNUYWJsZVtpXS5jaGFyQ29kZUF0KDApXSA9IGk7XG4vLyBzdXBwb3J0IGJhc2U2NHVybCB2YXJpYW50c1xuZGVjVGFibGVbXCItXCIuY2hhckNvZGVBdCgwKV0gPSBlbmNUYWJsZS5pbmRleE9mKFwiK1wiKTtcbmRlY1RhYmxlW1wiX1wiLmNoYXJDb2RlQXQoMCldID0gZW5jVGFibGUuaW5kZXhPZihcIi9cIik7XG4vKipcbiAqIERlY29kZXMgYSBiYXNlNjQgc3RyaW5nIHRvIGEgYnl0ZSBhcnJheS5cbiAqXG4gKiAtIGlnbm9yZXMgd2hpdGUtc3BhY2UsIGluY2x1ZGluZyBsaW5lIGJyZWFrcyBhbmQgdGFic1xuICogLSBhbGxvd3MgaW5uZXIgcGFkZGluZyAoY2FuIGRlY29kZSBjb25jYXRlbmF0ZWQgYmFzZTY0IHN0cmluZ3MpXG4gKiAtIGRvZXMgbm90IHJlcXVpcmUgcGFkZGluZ1xuICogLSB1bmRlcnN0YW5kcyBiYXNlNjR1cmwgZW5jb2Rpbmc6XG4gKiAgIFwiLVwiIGluc3RlYWQgb2YgXCIrXCIsXG4gKiAgIFwiX1wiIGluc3RlYWQgb2YgXCIvXCIsXG4gKiAgIG5vIHBhZGRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NGRlY29kZShiYXNlNjRTdHIpIHtcbiAgICAvLyBlc3RpbWF0ZSBieXRlIHNpemUsIG5vdCBhY2NvdW50aW5nIGZvciBpbm5lciBwYWRkaW5nIGFuZCB3aGl0ZXNwYWNlXG4gICAgbGV0IGVzID0gYmFzZTY0U3RyLmxlbmd0aCAqIDMgLyA0O1xuICAgIC8vIGlmIChlcyAlIDMgIT09IDApXG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJhc2U2NCBzdHJpbmcnKTtcbiAgICBpZiAoYmFzZTY0U3RyW2Jhc2U2NFN0ci5sZW5ndGggLSAyXSA9PSAnPScpXG4gICAgICAgIGVzIC09IDI7XG4gICAgZWxzZSBpZiAoYmFzZTY0U3RyW2Jhc2U2NFN0ci5sZW5ndGggLSAxXSA9PSAnPScpXG4gICAgICAgIGVzIC09IDE7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZXMpLCBieXRlUG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYnl0ZSBhcnJheVxuICAgIGdyb3VwUG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYmFzZTY0IGdyb3VwXG4gICAgYiwgLy8gY3VycmVudCBieXRlXG4gICAgcCA9IDAgLy8gcHJldmlvdXMgYnl0ZVxuICAgIDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhc2U2NFN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBiID0gZGVjVGFibGVbYmFzZTY0U3RyLmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBub2luc3BlY3Rpb24gRmFsbFRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICAgICAgICBzd2l0Y2ggKGJhc2U2NFN0cltpXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJz0nOlxuICAgICAgICAgICAgICAgICAgICBncm91cFBvcyA9IDA7IC8vIHJlc2V0IHN0YXRlIHdoZW4gcGFkZGluZyBmb3VuZFxuICAgICAgICAgICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB3aGl0ZS1zcGFjZSwgYW5kIHBhZGRpbmdcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBiYXNlNjQgc3RyaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoZ3JvdXBQb3MpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBwID0gYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgYnl0ZXNbYnl0ZVBvcysrXSA9IHAgPDwgMiB8IChiICYgNDgpID4+IDQ7XG4gICAgICAgICAgICAgICAgcCA9IGI7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGJ5dGVzW2J5dGVQb3MrK10gPSAocCAmIDE1KSA8PCA0IHwgKGIgJiA2MCkgPj4gMjtcbiAgICAgICAgICAgICAgICBwID0gYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgYnl0ZXNbYnl0ZVBvcysrXSA9IChwICYgMykgPDwgNiB8IGI7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChncm91cFBvcyA9PSAxKVxuICAgICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBiYXNlNjQgc3RyaW5nLmApO1xuICAgIHJldHVybiBieXRlcy5zdWJhcnJheSgwLCBieXRlUG9zKTtcbn1cbi8qKlxuICogRW5jb2RlcyBhIGJ5dGUgYXJyYXkgdG8gYSBiYXNlNjQgc3RyaW5nLlxuICogQWRkcyBwYWRkaW5nIGF0IHRoZSBlbmQuXG4gKiBEb2VzIG5vdCBpbnNlcnQgbmV3bGluZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRlbmNvZGUoYnl0ZXMpIHtcbiAgICBsZXQgYmFzZTY0ID0gJycsIGdyb3VwUG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYmFzZTY0IGdyb3VwXG4gICAgYiwgLy8gY3VycmVudCBieXRlXG4gICAgcCA9IDA7IC8vIGNhcnJ5IG92ZXIgZnJvbSBwcmV2aW91cyBieXRlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBiID0gYnl0ZXNbaV07XG4gICAgICAgIHN3aXRjaCAoZ3JvdXBQb3MpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbYiA+PiAyXTtcbiAgICAgICAgICAgICAgICBwID0gKGIgJiAzKSA8PCA0O1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbcCB8IGIgPj4gNF07XG4gICAgICAgICAgICAgICAgcCA9IChiICYgMTUpIDw8IDI7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtwIHwgYiA+PiA2XTtcbiAgICAgICAgICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbYiAmIDYzXTtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGFkZGluZyByZXF1aXJlZD9cbiAgICBpZiAoZ3JvdXBQb3MpIHtcbiAgICAgICAgYmFzZTY0ICs9IGVuY1RhYmxlW3BdO1xuICAgICAgICBiYXNlNjQgKz0gJz0nO1xuICAgICAgICBpZiAoZ3JvdXBQb3MgPT0gMSlcbiAgICAgICAgICAgIGJhc2U2NCArPSAnPSc7XG4gICAgfVxuICAgIHJldHVybiBiYXNlNjQ7XG59XG4iLCIvKipcbiAqIFRoaXMgaGFuZGxlciBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdW5rbm93biBmaWVsZHMuXG4gKiBXaGVuIHJlYWRpbmcgZGF0YSwgdW5rbm93biBmaWVsZHMgYXJlIHN0b3JlZCBvbiB0aGUgbWVzc2FnZSwgaW4gYVxuICogc3ltYm9sIHByb3BlcnR5LlxuICogV2hlbiB3cml0aW5nIGRhdGEsIHRoZSBzeW1ib2wgcHJvcGVydHkgaXMgcXVlcmllZCBhbmQgdW5rbm93biBmaWVsZHNcbiAqIGFyZSBzZXJpYWxpemVkIGludG8gdGhlIG91dHB1dCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IHZhciBVbmtub3duRmllbGRIYW5kbGVyO1xuKGZ1bmN0aW9uIChVbmtub3duRmllbGRIYW5kbGVyKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN5bWJvbCB1c2VkIHRvIHN0b3JlIHVua25vd24gZmllbGRzIGZvciBhIG1lc3NhZ2UuXG4gICAgICogVGhlIHByb3BlcnR5IG11c3QgY29uZm9ybSB0byBgVW5rbm93bkZpZWxkQ29udGFpbmVyYC5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbCA9IFN5bWJvbC5mb3IoXCJwcm90b2J1Zi10cy91bmtub3duXCIpO1xuICAgIC8qKlxuICAgICAqIFN0b3JlIGFuIHVua25vd24gZmllbGQgZHVyaW5nIGJpbmFyeSByZWFkIGRpcmVjdGx5IG9uIHRoZSBtZXNzYWdlLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNvbXBhdGlibGUgd2l0aCBgQmluYXJ5UmVhZE9wdGlvbnMucmVhZFVua25vd25GaWVsZGAuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgPSAodHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkYXRhKSA9PiB7XG4gICAgICAgIGxldCBjb250YWluZXIgPSBpcyhtZXNzYWdlKSA/IG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdIDogbWVzc2FnZVtVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbF0gPSBbXTtcbiAgICAgICAgY29udGFpbmVyLnB1c2goeyBubzogZmllbGRObywgd2lyZVR5cGUsIGRhdGEgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXcml0ZSB1bmtub3duIGZpZWxkcyBzdG9yZWQgZm9yIHRoZSBtZXNzYWdlIHRvIHRoZSB3cml0ZXIuXG4gICAgICogVGhpcyBtZXRob2QgaXMgY29tcGF0aWJsZSB3aXRoIGBCaW5hcnlXcml0ZU9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzYC5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgPSAodHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcikgPT4ge1xuICAgICAgICBmb3IgKGxldCB7IG5vLCB3aXJlVHlwZSwgZGF0YSB9IG9mIFVua25vd25GaWVsZEhhbmRsZXIubGlzdChtZXNzYWdlKSlcbiAgICAgICAgICAgIHdyaXRlci50YWcobm8sIHdpcmVUeXBlKS5yYXcoZGF0YSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMaXN0IHVua25vd24gZmllbGRzIHN0b3JlZCBmb3IgdGhlIG1lc3NhZ2UuXG4gICAgICogTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZXMgZmllbGRzIHdpdGggdGhlIHNhbWUgbnVtYmVyLlxuICAgICAqL1xuICAgIFVua25vd25GaWVsZEhhbmRsZXIubGlzdCA9IChtZXNzYWdlLCBmaWVsZE5vKSA9PiB7XG4gICAgICAgIGlmIChpcyhtZXNzYWdlKSkge1xuICAgICAgICAgICAgbGV0IGFsbCA9IG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdO1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkTm8gPyBhbGwuZmlsdGVyKHVmID0+IHVmLm5vID09IGZpZWxkTm8pIDogYWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxhc3QgdW5rbm93biBmaWVsZCBieSBmaWVsZCBudW1iZXIuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5sYXN0ID0gKG1lc3NhZ2UsIGZpZWxkTm8pID0+IFVua25vd25GaWVsZEhhbmRsZXIubGlzdChtZXNzYWdlLCBmaWVsZE5vKS5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgaXMgPSAobWVzc2FnZSkgPT4gbWVzc2FnZSAmJiBBcnJheS5pc0FycmF5KG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdKTtcbn0pKFVua25vd25GaWVsZEhhbmRsZXIgfHwgKFVua25vd25GaWVsZEhhbmRsZXIgPSB7fSkpO1xuLyoqXG4gKiBNZXJnZXMgYmluYXJ5IHdyaXRlIG9yIHJlYWQgb3B0aW9ucy4gTGF0ZXIgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VCaW5hcnlPcHRpb25zKGEsIGIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhKSwgYik7XG59XG4vKipcbiAqIFByb3RvYnVmIGJpbmFyeSBmb3JtYXQgd2lyZSB0eXBlcy5cbiAqXG4gKiBBIHdpcmUgdHlwZSBwcm92aWRlcyBqdXN0IGVub3VnaCBpbmZvcm1hdGlvbiB0byBmaW5kIHRoZSBsZW5ndGggb2YgdGhlXG4gKiBmb2xsb3dpbmcgdmFsdWUuXG4gKlxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZyNzdHJ1Y3R1cmVcbiAqL1xuZXhwb3J0IHZhciBXaXJlVHlwZTtcbihmdW5jdGlvbiAoV2lyZVR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuICAgICAqL1xuICAgIFdpcmVUeXBlW1dpcmVUeXBlW1wiVmFyaW50XCJdID0gMF0gPSBcIlZhcmludFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkNjQsIHNmaXhlZDY0LCBkb3VibGUuXG4gICAgICogQWx3YXlzIDggYnl0ZXMgd2l0aCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJCaXQ2NFwiXSA9IDFdID0gXCJCaXQ2NFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG4gICAgICpcbiAgICAgKiBPbmx5IHJlcGVhdGVkIG51bWVyaWMgdHlwZXMgKHR5cGVzIHdoaWNoIHVzZSB0aGUgdmFyaW50LCAzMi1iaXQsXG4gICAgICogb3IgNjQtYml0IHdpcmUgdHlwZXMpIGNhbiBiZSBwYWNrZWQuIEluIHByb3RvMywgc3VjaCBmaWVsZHMgYXJlXG4gICAgICogcGFja2VkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJMZW5ndGhEZWxpbWl0ZWRcIl0gPSAyXSA9IFwiTGVuZ3RoRGVsaW1pdGVkXCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZ3JvdXBzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIlN0YXJ0R3JvdXBcIl0gPSAzXSA9IFwiU3RhcnRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGdyb3Vwc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJFbmRHcm91cFwiXSA9IDRdID0gXCJFbmRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkMzIsIHNmaXhlZDMyLCBmbG9hdC5cbiAgICAgKiBBbHdheXMgNCBieXRlcyB3aXRoIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci5cbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIkJpdDMyXCJdID0gNV0gPSBcIkJpdDMyXCI7XG59KShXaXJlVHlwZSB8fCAoV2lyZVR5cGUgPSB7fSkpO1xuIiwiaW1wb3J0IHsgV2lyZVR5cGUgfSBmcm9tIFwiLi9iaW5hcnktZm9ybWF0LWNvbnRyYWN0XCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG5pbXBvcnQgeyB2YXJpbnQzMnJlYWQsIHZhcmludDY0cmVhZCB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5jb25zdCBkZWZhdWx0c1JlYWQgPSB7XG4gICAgcmVhZFVua25vd25GaWVsZDogdHJ1ZSxcbiAgICByZWFkZXJGYWN0b3J5OiBieXRlcyA9PiBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSxcbn07XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3IgcmVhZGluZyBiaW5hcnkgZGF0YSBmb3JtIHBhcnRpYWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVJlYWRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHNSZWFkKSwgb3B0aW9ucykgOiBkZWZhdWx0c1JlYWQ7XG59XG5leHBvcnQgY2xhc3MgQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihidWYsIHRleHREZWNvZGVyKSB7XG4gICAgICAgIHRoaXMudmFyaW50NjQgPSB2YXJpbnQ2NHJlYWQ7IC8vIGRpcnR5IGNhc3QgZm9yIGB0aGlzYFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVhZCBhIGB1aW50MzJgIGZpZWxkLCBhbiB1bnNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51aW50MzIgPSB2YXJpbnQzMnJlYWQ7IC8vIGRpcnR5IGNhc3QgZm9yIGB0aGlzYCBhbmQgYWNjZXNzIHRvIHByb3RlY3RlZCBgYnVmYFxuICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgdGhpcy5sZW4gPSBidWYubGVuZ3RoO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBEYXRhVmlldyhidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLnRleHREZWNvZGVyID0gdGV4dERlY29kZXIgIT09IG51bGwgJiYgdGV4dERlY29kZXIgIT09IHZvaWQgMCA/IHRleHREZWNvZGVyIDogbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiwge1xuICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVCT006IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIHRhZyAtIGZpZWxkIG51bWJlciBhbmQgd2lyZSB0eXBlLlxuICAgICAqL1xuICAgIHRhZygpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRoaXMudWludDMyKCksIGZpZWxkTm8gPSB0YWcgPj4+IDMsIHdpcmVUeXBlID0gdGFnICYgNztcbiAgICAgICAgaWYgKGZpZWxkTm8gPD0gMCB8fCB3aXJlVHlwZSA8IDAgfHwgd2lyZVR5cGUgPiA1KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0YWc6IGZpZWxkIG5vIFwiICsgZmllbGRObyArIFwiIHdpcmUgdHlwZSBcIiArIHdpcmVUeXBlKTtcbiAgICAgICAgcmV0dXJuIFtmaWVsZE5vLCB3aXJlVHlwZV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNraXAgb25lIGVsZW1lbnQgb24gdGhlIHdpcmUgYW5kIHJldHVybiB0aGUgc2tpcHBlZCBkYXRhLlxuICAgICAqIFN1cHBvcnRzIFdpcmVUeXBlLlN0YXJ0R3JvdXAgc2luY2UgdjIuMC4wLWFscGhhLjIzLlxuICAgICAqL1xuICAgIHNraXAod2lyZVR5cGUpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgc3dpdGNoICh3aXJlVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBXaXJlVHlwZS5WYXJpbnQ6XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdICYgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkJpdDY0OlxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkJpdDMyOlxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDpcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLlN0YXJ0R3JvdXA6XG4gICAgICAgICAgICAgICAgLy8gRnJvbSBkZXNjcmlwdG9yLnByb3RvOiBHcm91cCB0eXBlIGlzIGRlcHJlY2F0ZWQsIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zLlxuICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSBtdXN0IHN0aWxsIGJlIGFibGUgdG8gcGFyc2UgYW5kIHRyZWF0IGFzIHVua25vd24uXG4gICAgICAgICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCh0ID0gdGhpcy50YWcoKVsxXSkgIT09IFdpcmVUeXBlLkVuZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbnQgc2tpcCB3aXJlIHR5cGUgXCIgKyB3aXJlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KHN0YXJ0LCB0aGlzLnBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRocm93cyBlcnJvciBpZiBwb3NpdGlvbiBpbiBieXRlIGFycmF5IGlzIG91dCBvZiByYW5nZS5cbiAgICAgKi9cbiAgICBhc3NlcnRCb3VuZHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA+IHRoaXMubGVuKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJwcmVtYXR1cmUgRU9GXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGludDMyYCBmaWVsZCwgYSBzaWduZWQgMzIgYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyKCkgfCAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNpbnQzMmAgZmllbGQsIGEgc2lnbmVkLCB6aWd6YWctZW5jb2RlZCAzMi1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHNpbnQzMigpIHtcbiAgICAgICAgbGV0IHp6ZSA9IHRoaXMudWludDMyKCk7XG4gICAgICAgIC8vIGRlY29kZSB6aWd6YWdcbiAgICAgICAgcmV0dXJuICh6emUgPj4+IDEpIF4gLSh6emUgJiAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBpbnQ2NGAgZmllbGQsIGEgc2lnbmVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgaW50NjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKC4uLnRoaXMudmFyaW50NjQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgdWludDY0YCBmaWVsZCwgYW4gdW5zaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50NjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyguLi50aGlzLnZhcmludDY0KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNpbnQ2NGAgZmllbGQsIGEgc2lnbmVkLCB6aWctemFnLWVuY29kZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBzaW50NjQoKSB7XG4gICAgICAgIGxldCBbbG8sIGhpXSA9IHRoaXMudmFyaW50NjQoKTtcbiAgICAgICAgLy8gZGVjb2RlIHppZyB6YWdcbiAgICAgICAgbGV0IHMgPSAtKGxvICYgMSk7XG4gICAgICAgIGxvID0gKChsbyA+Pj4gMSB8IChoaSAmIDEpIDw8IDMxKSBeIHMpO1xuICAgICAgICBoaSA9IChoaSA+Pj4gMSBeIHMpO1xuICAgICAgICByZXR1cm4gbmV3IFBiTG9uZyhsbywgaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGJvb2xgIGZpZWxkLCBhIHZhcmlhbnQuXG4gICAgICovXG4gICAgYm9vbCgpIHtcbiAgICAgICAgbGV0IFtsbywgaGldID0gdGhpcy52YXJpbnQ2NCgpO1xuICAgICAgICByZXR1cm4gbG8gIT09IDAgfHwgaGkgIT09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgZml4ZWQzMmAgZmllbGQsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIoKHRoaXMucG9zICs9IDQpIC0gNCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc2ZpeGVkMzJgIGZpZWxkLCBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIHNmaXhlZDMyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDMyKCh0aGlzLnBvcyArPSA0KSAtIDQsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGZpeGVkNjRgIGZpZWxkLCBhbiB1bnNpZ25lZCwgZml4ZWQtbGVuZ3RoIDY0IGJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIGZpeGVkNjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyh0aGlzLnNmaXhlZDMyKCksIHRoaXMuc2ZpeGVkMzIoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgZml4ZWQ2NGAgZmllbGQsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggNjQtYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkNjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKHRoaXMuc2ZpeGVkMzIoKSwgdGhpcy5zZml4ZWQzMigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBmbG9hdGAgZmllbGQsIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZmxvYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQzMigodGhpcy5wb3MgKz0gNCkgLSA0LCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBkb3VibGVgIGZpZWxkLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEZsb2F0NjQoKHRoaXMucG9zICs9IDgpIC0gOCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgYnl0ZXNgIGZpZWxkLCBsZW5ndGgtZGVsaW1pdGVkIGFyYml0cmFyeSBkYXRhLlxuICAgICAqL1xuICAgIGJ5dGVzKCkge1xuICAgICAgICBsZXQgbGVuID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc3RyaW5nYCBmaWVsZCwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dERlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuaW1wb3J0IHsgdmFyaW50MzJ3cml0ZSwgdmFyaW50NjR3cml0ZSB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5pbXBvcnQgeyBhc3NlcnRGbG9hdDMyLCBhc3NlcnRJbnQzMiwgYXNzZXJ0VUludDMyIH0gZnJvbSBcIi4vYXNzZXJ0XCI7XG5jb25zdCBkZWZhdWx0c1dyaXRlID0ge1xuICAgIHdyaXRlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICB3cml0ZXJGYWN0b3J5OiAoKSA9PiBuZXcgQmluYXJ5V3JpdGVyKCksXG59O1xuLyoqXG4gKiBNYWtlIG9wdGlvbnMgZm9yIHdyaXRpbmcgYmluYXJ5IGRhdGEgZm9ybSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlXcml0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1dyaXRlKSwgb3B0aW9ucykgOiBkZWZhdWx0c1dyaXRlO1xufVxuZXhwb3J0IGNsYXNzIEJpbmFyeVdyaXRlciB7XG4gICAgY29uc3RydWN0b3IodGV4dEVuY29kZXIpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByZXZpb3VzIGZvcmsgc3RhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xuICAgICAgICB0aGlzLnRleHRFbmNvZGVyID0gdGV4dEVuY29kZXIgIT09IG51bGwgJiYgdGV4dEVuY29kZXIgIT09IHZvaWQgMCA/IHRleHRFbmNvZGVyIDogbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuYnVmID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbGwgYnl0ZXMgd3JpdHRlbiBhbmQgcmVzZXQgdGhpcyB3cml0ZXIuXG4gICAgICovXG4gICAgZmluaXNoKCkge1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBVaW50OEFycmF5KHRoaXMuYnVmKSk7IC8vIGZsdXNoIHRoZSBidWZmZXJcbiAgICAgICAgbGV0IGxlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaHVua3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBsZW4gKz0gdGhpcy5jaHVua3NbaV0ubGVuZ3RoO1xuICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnl0ZXMuc2V0KHRoaXMuY2h1bmtzW2ldLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY2h1bmtzW2ldLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGEgbmV3IGZvcmsgZm9yIGxlbmd0aC1kZWxpbWl0ZWQgZGF0YSBsaWtlIGEgbWVzc2FnZVxuICAgICAqIG9yIGEgcGFja2VkIHJlcGVhdGVkIGZpZWxkLlxuICAgICAqXG4gICAgICogTXVzdCBiZSBqb2luZWQgbGF0ZXIgd2l0aCBgam9pbigpYC5cbiAgICAgKi9cbiAgICBmb3JrKCkge1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBjaHVua3M6IHRoaXMuY2h1bmtzLCBidWY6IHRoaXMuYnVmIH0pO1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmJ1ZiA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSm9pbiB0aGUgbGFzdCBmb3JrLiBXcml0ZSBpdHMgbGVuZ3RoIGFuZCBieXRlcywgdGhlblxuICAgICAqIHJldHVybiB0byB0aGUgcHJldmlvdXMgc3RhdGUuXG4gICAgICovXG4gICAgam9pbigpIHtcbiAgICAgICAgLy8gZ2V0IGNodW5rIG9mIGZvcmtcbiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5maW5pc2goKTtcbiAgICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICBsZXQgcHJldiA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghcHJldilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSwgZm9yayBzdGFjayBlbXB0eScpO1xuICAgICAgICB0aGlzLmNodW5rcyA9IHByZXYuY2h1bmtzO1xuICAgICAgICB0aGlzLmJ1ZiA9IHByZXYuYnVmO1xuICAgICAgICAvLyB3cml0ZSBsZW5ndGggb2YgY2h1bmsgYXMgdmFyaW50XG4gICAgICAgIHRoaXMudWludDMyKGNodW5rLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSB0YWcgKGZpZWxkIG51bWJlciBhbmQgd2lyZSB0eXBlKS5cbiAgICAgKlxuICAgICAqIEVxdWl2YWxlbnQgdG8gYHVpbnQzMiggKGZpZWxkTm8gPDwgMyB8IHR5cGUpID4+PiAwIClgLlxuICAgICAqXG4gICAgICogR2VuZXJhdGVkIGNvZGUgc2hvdWxkIGNvbXB1dGUgdGhlIHRhZyBhaGVhZCBvZiB0aW1lIGFuZCBjYWxsIGB1aW50MzIoKWAuXG4gICAgICovXG4gICAgdGFnKGZpZWxkTm8sIHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyKChmaWVsZE5vIDw8IDMgfCB0eXBlKSA+Pj4gMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgY2h1bmsgb2YgcmF3IGJ5dGVzLlxuICAgICAqL1xuICAgIHJhdyhjaHVuaykge1xuICAgICAgICBpZiAodGhpcy5idWYubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBVaW50OEFycmF5KHRoaXMuYnVmKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgdWludDMyYCB2YWx1ZSwgYW4gdW5zaWduZWQgMzIgYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50MzIodmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VUludDMyKHZhbHVlKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWUgYXMgdmFyaW50IDMyLCBpbmxpbmVkIGZvciBzcGVlZFxuICAgICAgICB3aGlsZSAodmFsdWUgPiAweDdmKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+PiA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgaW50MzJgIHZhbHVlLCBhIHNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAqL1xuICAgIGludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgdmFyaW50MzJ3cml0ZSh2YWx1ZSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgYm9vbGAgdmFsdWUsIGEgdmFyaWFudC5cbiAgICAgKi9cbiAgICBib29sKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYnVmLnB1c2godmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBieXRlc2AgdmFsdWUsIGxlbmd0aC1kZWxpbWl0ZWQgYXJiaXRyYXJ5IGRhdGEuXG4gICAgICovXG4gICAgYnl0ZXModmFsdWUpIHtcbiAgICAgICAgdGhpcy51aW50MzIodmFsdWUuYnl0ZUxlbmd0aCk7IC8vIHdyaXRlIGxlbmd0aCBvZiBjaHVuayBhcyB2YXJpbnRcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc3RyaW5nYCB2YWx1ZSwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLnRleHRFbmNvZGVyLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMudWludDMyKGNodW5rLmJ5dGVMZW5ndGgpOyAvLyB3cml0ZSBsZW5ndGggb2YgY2h1bmsgYXMgdmFyaW50XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGZsb2F0YCB2YWx1ZSwgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICAgKi9cbiAgICBmbG9hdCh2YWx1ZSkge1xuICAgICAgICBhc3NlcnRGbG9hdDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEZsb2F0MzIoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBkb3VibGVgIHZhbHVlLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoY2h1bmsuYnVmZmVyKS5zZXRGbG9hdDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZml4ZWQzMmAgdmFsdWUsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQzMih2YWx1ZSkge1xuICAgICAgICBhc3NlcnRVSW50MzIodmFsdWUpO1xuICAgICAgICBsZXQgY2h1bmsgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcikuc2V0VWludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ZpeGVkMzJgIHZhbHVlLCBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIHNmaXhlZDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ludDMyYCB2YWx1ZSwgYSBzaWduZWQsIHppZ3phZy1lbmNvZGVkIDMyLWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgLy8gemlnemFnIGVuY29kZVxuICAgICAgICB2YWx1ZSA9ICgodmFsdWUgPDwgMSkgXiAodmFsdWUgPj4gMzEpKSA+Pj4gMDtcbiAgICAgICAgdmFyaW50MzJ3cml0ZSh2YWx1ZSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZml4ZWQ2NGAgdmFsdWUsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggNjQtYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkNjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gICAgICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcik7XG4gICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDAsIGxvbmcubG8sIHRydWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDQsIGxvbmcuaGksIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBmaXhlZDY0YCB2YWx1ZSwgYW4gdW5zaWduZWQsIGZpeGVkLWxlbmd0aCA2NCBiaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBmaXhlZDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBsZXQgdmlldyA9IG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpO1xuICAgICAgICBsZXQgbG9uZyA9IFBiVUxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoMCwgbG9uZy5sbywgdHJ1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoNCwgbG9uZy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGludDY0YCB2YWx1ZSwgYSBzaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQ2NCh2YWx1ZSkge1xuICAgICAgICBsZXQgbG9uZyA9IFBiTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgdmFyaW50NjR3cml0ZShsb25nLmxvLCBsb25nLmhpLCB0aGlzLmJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBzaW50NjRgIHZhbHVlLCBhIHNpZ25lZCwgemlnLXphZy1lbmNvZGVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpLCBcbiAgICAgICAgLy8gemlnemFnIGVuY29kZVxuICAgICAgICBzaWduID0gbG9uZy5oaSA+PiAzMSwgbG8gPSAobG9uZy5sbyA8PCAxKSBeIHNpZ24sIGhpID0gKChsb25nLmhpIDw8IDEpIHwgKGxvbmcubG8gPj4+IDMxKSkgXiBzaWduO1xuICAgICAgICB2YXJpbnQ2NHdyaXRlKGxvLCBoaSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgdWludDY0YCB2YWx1ZSwgYW4gdW5zaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50NjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGxvbmcgPSBQYlVMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2YXJpbnQ2NHdyaXRlKGxvbmcubG8sIGxvbmcuaGksIHRoaXMuYnVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4vLyBtZXQ6XG4vL1xuLy8gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuLy8gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyXG4vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4vLyBkaXN0cmlidXRpb24uXG4vLyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbi8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuLy9cbi8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbi8vIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbi8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbi8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbi8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbi8vXG4vLyBDb2RlIGdlbmVyYXRlZCBieSB0aGUgUHJvdG9jb2wgQnVmZmVyIGNvbXBpbGVyIGlzIG93bmVkIGJ5IHRoZSBvd25lclxuLy8gb2YgdGhlIGlucHV0IGZpbGUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgaXQuICBUaGlzIGNvZGUgaXMgbm90XG4vLyBzdGFuZGFsb25lIGFuZCByZXF1aXJlcyBhIHN1cHBvcnQgbGlicmFyeSB0byBiZSBsaW5rZWQgd2l0aCBpdC4gIFRoaXNcbi8vIHN1cHBvcnQgbGlicmFyeSBpcyBpdHNlbGYgY292ZXJlZCBieSB0aGUgYWJvdmUgbGljZW5zZS5cbi8qKlxuICogUmVhZCBhIDY0IGJpdCB2YXJpbnQgYXMgdHdvIEpTIG51bWJlcnMuXG4gKlxuICogUmV0dXJucyB0dXBsZTpcbiAqIFswXTogbG93IGJpdHNcbiAqIFswXTogaGlnaCBiaXRzXG4gKlxuICogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi84YTcxOTI3ZDc0YTRjZTM0ZWZlMmQ4NzY5ZmRhMTk4ZjUyZDIwZDEyL2pzL2V4cGVyaW1lbnRhbC9ydW50aW1lL2tlcm5lbC9idWZmZXJfZGVjb2Rlci5qcyNMMTc1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpbnQ2NHJlYWQoKSB7XG4gICAgbGV0IGxvd0JpdHMgPSAwO1xuICAgIGxldCBoaWdoQml0cyA9IDA7XG4gICAgZm9yIChsZXQgc2hpZnQgPSAwOyBzaGlmdCA8IDI4OyBzaGlmdCArPSA3KSB7XG4gICAgICAgIGxldCBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgICAgIGxvd0JpdHMgfD0gKGIgJiAweDdGKSA8PCBzaGlmdDtcbiAgICAgICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgICAgIHJldHVybiBbbG93Qml0cywgaGlnaEJpdHNdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBtaWRkbGVCeXRlID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgLy8gbGFzdCBmb3VyIGJpdHMgb2YgdGhlIGZpcnN0IDMyIGJpdCBudW1iZXJcbiAgICBsb3dCaXRzIHw9IChtaWRkbGVCeXRlICYgMHgwRikgPDwgMjg7XG4gICAgLy8gMyB1cHBlciBiaXRzIGFyZSBwYXJ0IG9mIHRoZSBuZXh0IDMyIGJpdCBudW1iZXJcbiAgICBoaWdoQml0cyA9IChtaWRkbGVCeXRlICYgMHg3MCkgPj4gNDtcbiAgICBpZiAoKG1pZGRsZUJ5dGUgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiBbbG93Qml0cywgaGlnaEJpdHNdO1xuICAgIH1cbiAgICBmb3IgKGxldCBzaGlmdCA9IDM7IHNoaWZ0IDw9IDMxOyBzaGlmdCArPSA3KSB7XG4gICAgICAgIGxldCBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgICAgIGhpZ2hCaXRzIHw9IChiICYgMHg3RikgPDwgc2hpZnQ7XG4gICAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgICAgICByZXR1cm4gW2xvd0JpdHMsIGhpZ2hCaXRzXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFyaW50Jyk7XG59XG4vKipcbiAqIFdyaXRlIGEgNjQgYml0IHZhcmludCwgZ2l2ZW4gYXMgdHdvIEpTIG51bWJlcnMsIHRvIHRoZSBnaXZlbiBieXRlcyBhcnJheS5cbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iLzhhNzE5MjdkNzRhNGNlMzRlZmUyZDg3NjlmZGExOThmNTJkMjBkMTIvanMvZXhwZXJpbWVudGFsL3J1bnRpbWUva2VybmVsL3dyaXRlci5qcyNMMzQ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpbnQ2NHdyaXRlKGxvLCBoaSwgYnl0ZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI4OyBpID0gaSArIDcpIHtcbiAgICAgICAgY29uc3Qgc2hpZnQgPSBsbyA+Pj4gaTtcbiAgICAgICAgY29uc3QgaGFzTmV4dCA9ICEoKHNoaWZ0ID4+PiA3KSA9PSAwICYmIGhpID09IDApO1xuICAgICAgICBjb25zdCBieXRlID0gKGhhc05leHQgPyBzaGlmdCB8IDB4ODAgOiBzaGlmdCkgJiAweEZGO1xuICAgICAgICBieXRlcy5wdXNoKGJ5dGUpO1xuICAgICAgICBpZiAoIWhhc05leHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzcGxpdEJpdHMgPSAoKGxvID4+PiAyOCkgJiAweDBGKSB8ICgoaGkgJiAweDA3KSA8PCA0KTtcbiAgICBjb25zdCBoYXNNb3JlQml0cyA9ICEoKGhpID4+IDMpID09IDApO1xuICAgIGJ5dGVzLnB1c2goKGhhc01vcmVCaXRzID8gc3BsaXRCaXRzIHwgMHg4MCA6IHNwbGl0Qml0cykgJiAweEZGKTtcbiAgICBpZiAoIWhhc01vcmVCaXRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCAzMTsgaSA9IGkgKyA3KSB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gaGkgPj4+IGk7XG4gICAgICAgIGNvbnN0IGhhc05leHQgPSAhKChzaGlmdCA+Pj4gNykgPT0gMCk7XG4gICAgICAgIGNvbnN0IGJ5dGUgPSAoaGFzTmV4dCA/IHNoaWZ0IHwgMHg4MCA6IHNoaWZ0KSAmIDB4RkY7XG4gICAgICAgIGJ5dGVzLnB1c2goYnl0ZSk7XG4gICAgICAgIGlmICghaGFzTmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJ5dGVzLnB1c2goKGhpID4+PiAzMSkgJiAweDAxKTtcbn1cbi8vIGNvbnN0YW50cyBmb3IgYmluYXJ5IG1hdGhcbmNvbnN0IFRXT19QV1JfMzJfREJMID0gKDEgPDwgMTYpICogKDEgPDwgMTYpO1xuLyoqXG4gKiBQYXJzZSBkZWNpbWFsIHN0cmluZyBvZiA2NCBiaXQgaW50ZWdlciB2YWx1ZSBhcyB0d28gSlMgbnVtYmVycy5cbiAqXG4gKiBSZXR1cm5zIHR1cGxlOlxuICogWzBdOiBtaW51cyBzaWduP1xuICogWzFdOiBsb3cgYml0c1xuICogWzJdOiBoaWdoIGJpdHNcbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50NjRmcm9tU3RyaW5nKGRlYykge1xuICAgIC8vIENoZWNrIGZvciBtaW51cyBzaWduLlxuICAgIGxldCBtaW51cyA9IGRlY1swXSA9PSAnLSc7XG4gICAgaWYgKG1pbnVzKVxuICAgICAgICBkZWMgPSBkZWMuc2xpY2UoMSk7XG4gICAgLy8gV29yayA2IGRlY2ltYWwgZGlnaXRzIGF0IGEgdGltZSwgYWN0aW5nIGxpa2Ugd2UncmUgY29udmVydGluZyBiYXNlIDFlNlxuICAgIC8vIGRpZ2l0cyB0byBiaW5hcnkuIFRoaXMgaXMgc2FmZSB0byBkbyB3aXRoIGZsb2F0aW5nIHBvaW50IG1hdGggYmVjYXVzZVxuICAgIC8vIE51bWJlci5pc1NhZmVJbnRlZ2VyKEFMTF8zMl9CSVRTICogMWU2KSA9PSB0cnVlLlxuICAgIGNvbnN0IGJhc2UgPSAxZTY7XG4gICAgbGV0IGxvd0JpdHMgPSAwO1xuICAgIGxldCBoaWdoQml0cyA9IDA7XG4gICAgZnVuY3Rpb24gYWRkMWU2ZGlnaXQoYmVnaW4sIGVuZCkge1xuICAgICAgICAvLyBOb3RlOiBOdW1iZXIoJycpIGlzIDAuXG4gICAgICAgIGNvbnN0IGRpZ2l0MWU2ID0gTnVtYmVyKGRlYy5zbGljZShiZWdpbiwgZW5kKSk7XG4gICAgICAgIGhpZ2hCaXRzICo9IGJhc2U7XG4gICAgICAgIGxvd0JpdHMgPSBsb3dCaXRzICogYmFzZSArIGRpZ2l0MWU2O1xuICAgICAgICAvLyBDYXJyeSBiaXRzIGZyb20gbG93Qml0cyB0byBoaWdoQml0c1xuICAgICAgICBpZiAobG93Qml0cyA+PSBUV09fUFdSXzMyX0RCTCkge1xuICAgICAgICAgICAgaGlnaEJpdHMgPSBoaWdoQml0cyArICgobG93Qml0cyAvIFRXT19QV1JfMzJfREJMKSB8IDApO1xuICAgICAgICAgICAgbG93Qml0cyA9IGxvd0JpdHMgJSBUV09fUFdSXzMyX0RCTDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQxZTZkaWdpdCgtMjQsIC0xOCk7XG4gICAgYWRkMWU2ZGlnaXQoLTE4LCAtMTIpO1xuICAgIGFkZDFlNmRpZ2l0KC0xMiwgLTYpO1xuICAgIGFkZDFlNmRpZ2l0KC02KTtcbiAgICByZXR1cm4gW21pbnVzLCBsb3dCaXRzLCBoaWdoQml0c107XG59XG4vKipcbiAqIEZvcm1hdCA2NCBiaXQgaW50ZWdlciB2YWx1ZSAoYXMgdHdvIEpTIG51bWJlcnMpIHRvIGRlY2ltYWwgc3RyaW5nLlxuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnQ2NHRvU3RyaW5nKGJpdHNMb3csIGJpdHNIaWdoKSB7XG4gICAgLy8gU2tpcCB0aGUgZXhwZW5zaXZlIGNvbnZlcnNpb24gaWYgdGhlIG51bWJlciBpcyBzbWFsbCBlbm91Z2ggdG8gdXNlIHRoZVxuICAgIC8vIGJ1aWx0LWluIGNvbnZlcnNpb25zLlxuICAgIGlmICgoYml0c0hpZ2ggPj4+IDApIDw9IDB4MUZGRkZGKSB7XG4gICAgICAgIHJldHVybiAnJyArIChUV09fUFdSXzMyX0RCTCAqIGJpdHNIaWdoICsgKGJpdHNMb3cgPj4+IDApKTtcbiAgICB9XG4gICAgLy8gV2hhdCB0aGlzIGNvZGUgaXMgZG9pbmcgaXMgZXNzZW50aWFsbHkgY29udmVydGluZyB0aGUgaW5wdXQgbnVtYmVyIGZyb21cbiAgICAvLyBiYXNlLTIgdG8gYmFzZS0xZTcsIHdoaWNoIGFsbG93cyB1cyB0byByZXByZXNlbnQgdGhlIDY0LWJpdCByYW5nZSB3aXRoXG4gICAgLy8gb25seSAzICh2ZXJ5IGxhcmdlKSBkaWdpdHMuIFRob3NlIGRpZ2l0cyBhcmUgdGhlbiB0cml2aWFsIHRvIGNvbnZlcnQgdG9cbiAgICAvLyBhIGJhc2UtMTAgc3RyaW5nLlxuICAgIC8vIFRoZSBtYWdpYyBudW1iZXJzIHVzZWQgaGVyZSBhcmUgLVxuICAgIC8vIDJeMjQgPSAxNjc3NzIxNiA9ICgxLDY3NzcyMTYpIGluIGJhc2UtMWU3LlxuICAgIC8vIDJeNDggPSAyODE0NzQ5NzY3MTA2NTYgPSAoMiw4MTQ3NDk3LDY3MTA2NTYpIGluIGJhc2UtMWU3LlxuICAgIC8vIFNwbGl0IDMyOjMyIHJlcHJlc2VudGF0aW9uIGludG8gMTY6MjQ6MjQgcmVwcmVzZW50YXRpb24gc28gb3VyXG4gICAgLy8gaW50ZXJtZWRpYXRlIGRpZ2l0cyBkb24ndCBvdmVyZmxvdy5cbiAgICBsZXQgbG93ID0gYml0c0xvdyAmIDB4RkZGRkZGO1xuICAgIGxldCBtaWQgPSAoKChiaXRzTG93ID4+PiAyNCkgfCAoYml0c0hpZ2ggPDwgOCkpID4+PiAwKSAmIDB4RkZGRkZGO1xuICAgIGxldCBoaWdoID0gKGJpdHNIaWdoID4+IDE2KSAmIDB4RkZGRjtcbiAgICAvLyBBc3NlbWJsZSBvdXIgdGhyZWUgYmFzZS0xZTcgZGlnaXRzLCBpZ25vcmluZyBjYXJyaWVzLiBUaGUgbWF4aW11bVxuICAgIC8vIHZhbHVlIGluIGEgZGlnaXQgYXQgdGhpcyBzdGVwIGlzIHJlcHJlc2VudGFibGUgYXMgYSA0OC1iaXQgaW50ZWdlciwgd2hpY2hcbiAgICAvLyBjYW4gYmUgc3RvcmVkIGluIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICBsZXQgZGlnaXRBID0gbG93ICsgKG1pZCAqIDY3NzcyMTYpICsgKGhpZ2ggKiA2NzEwNjU2KTtcbiAgICBsZXQgZGlnaXRCID0gbWlkICsgKGhpZ2ggKiA4MTQ3NDk3KTtcbiAgICBsZXQgZGlnaXRDID0gKGhpZ2ggKiAyKTtcbiAgICAvLyBBcHBseSBjYXJyaWVzIGZyb20gQSB0byBCIGFuZCBmcm9tIEIgdG8gQy5cbiAgICBsZXQgYmFzZSA9IDEwMDAwMDAwO1xuICAgIGlmIChkaWdpdEEgPj0gYmFzZSkge1xuICAgICAgICBkaWdpdEIgKz0gTWF0aC5mbG9vcihkaWdpdEEgLyBiYXNlKTtcbiAgICAgICAgZGlnaXRBICU9IGJhc2U7XG4gICAgfVxuICAgIGlmIChkaWdpdEIgPj0gYmFzZSkge1xuICAgICAgICBkaWdpdEMgKz0gTWF0aC5mbG9vcihkaWdpdEIgLyBiYXNlKTtcbiAgICAgICAgZGlnaXRCICU9IGJhc2U7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgYmFzZS0xZTcgZGlnaXRzIHRvIGJhc2UtMTAsIHdpdGggb3B0aW9uYWwgbGVhZGluZyB6ZXJvZXMuXG4gICAgZnVuY3Rpb24gZGVjaW1hbEZyb20xZTcoZGlnaXQxZTcsIG5lZWRMZWFkaW5nWmVyb3MpIHtcbiAgICAgICAgbGV0IHBhcnRpYWwgPSBkaWdpdDFlNyA/IFN0cmluZyhkaWdpdDFlNykgOiAnJztcbiAgICAgICAgaWYgKG5lZWRMZWFkaW5nWmVyb3MpIHtcbiAgICAgICAgICAgIHJldHVybiAnMDAwMDAwMCcuc2xpY2UocGFydGlhbC5sZW5ndGgpICsgcGFydGlhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydGlhbDtcbiAgICB9XG4gICAgcmV0dXJuIGRlY2ltYWxGcm9tMWU3KGRpZ2l0QywgLypuZWVkTGVhZGluZ1plcm9zPSovIDApICtcbiAgICAgICAgZGVjaW1hbEZyb20xZTcoZGlnaXRCLCAvKm5lZWRMZWFkaW5nWmVyb3M9Ki8gZGlnaXRDKSArXG4gICAgICAgIC8vIElmIHRoZSBmaW5hbCAxZTcgZGlnaXQgZGlkbid0IG5lZWQgbGVhZGluZyB6ZXJvcywgd2Ugd291bGQgaGF2ZVxuICAgICAgICAvLyByZXR1cm5lZCB2aWEgdGhlIHRyaXZpYWwgY29kZSBwYXRoIGF0IHRoZSB0b3AuXG4gICAgICAgIGRlY2ltYWxGcm9tMWU3KGRpZ2l0QSwgLypuZWVkTGVhZGluZ1plcm9zPSovIDEpO1xufVxuLyoqXG4gKiBXcml0ZSBhIDMyIGJpdCB2YXJpbnQsIHNpZ25lZCBvciB1bnNpZ25lZC4gU2FtZSBhcyBgdmFyaW50NjR3cml0ZSgwLCB2YWx1ZSwgYnl0ZXMpYFxuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvMWIxODgzM2Y0ZjJhMmY2ODFmNGU0YTI1Y2RmM2IwYTQzMTE1ZWMyNi9qcy9iaW5hcnkvZW5jb2Rlci5qcyNMMTQ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpbnQzMndyaXRlKHZhbHVlLCBieXRlcykge1xuICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICAgIC8vIHdyaXRlIHZhbHVlIGFzIHZhcmludCAzMlxuICAgICAgICB3aGlsZSAodmFsdWUgPiAweDdmKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKCh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+PiA3O1xuICAgICAgICB9XG4gICAgICAgIGJ5dGVzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA5OyBpKyspIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2godmFsdWUgJiAxMjcgfCAxMjgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA+PiA3O1xuICAgICAgICB9XG4gICAgICAgIGJ5dGVzLnB1c2goMSk7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIGFuIHVuc2lnbmVkIDMyIGJpdCB2YXJpbnQuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi84YTcxOTI3ZDc0YTRjZTM0ZWZlMmQ4NzY5ZmRhMTk4ZjUyZDIwZDEyL2pzL2V4cGVyaW1lbnRhbC9ydW50aW1lL2tlcm5lbC9idWZmZXJfZGVjb2Rlci5qcyNMMjIwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpbnQzMnJlYWQoKSB7XG4gICAgbGV0IGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICBsZXQgcmVzdWx0ID0gYiAmIDB4N0Y7XG4gICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgcmVzdWx0IHw9IChiICYgMHg3RikgPDwgNztcbiAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICByZXN1bHQgfD0gKGIgJiAweDdGKSA8PCAxNDtcbiAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICByZXN1bHQgfD0gKGIgJiAweDdGKSA8PCAyMTtcbiAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIEV4dHJhY3Qgb25seSBsYXN0IDQgYml0c1xuICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICByZXN1bHQgfD0gKGIgJiAweDBGKSA8PCAyODtcbiAgICBmb3IgKGxldCByZWFkQnl0ZXMgPSA1OyAoKGIgJiAweDgwKSAhPT0gMCkgJiYgcmVhZEJ5dGVzIDwgMTA7IHJlYWRCeXRlcysrKVxuICAgICAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgaWYgKChiICYgMHg4MCkgIT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhcmludCcpO1xuICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgLy8gUmVzdWx0IGNhbiBoYXZlIDMyIGJpdHMsIGNvbnZlcnQgaXQgdG8gdW5zaWduZWRcbiAgICByZXR1cm4gcmVzdWx0ID4+PiAwO1xufVxuIiwiY29uc3QgZGVmYXVsdHNXcml0ZSA9IHtcbiAgICBlbWl0RGVmYXVsdFZhbHVlczogZmFsc2UsXG4gICAgZW51bUFzSW50ZWdlcjogZmFsc2UsXG4gICAgdXNlUHJvdG9GaWVsZE5hbWU6IGZhbHNlLFxuICAgIHByZXR0eVNwYWNlczogMCxcbn0sIGRlZmF1bHRzUmVhZCA9IHtcbiAgICBpZ25vcmVVbmtub3duRmllbGRzOiBmYWxzZSxcbn07XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3IgcmVhZGluZyBKU09OIGRhdGEgZnJvbSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uUmVhZE9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1JlYWQpLCBvcHRpb25zKSA6IGRlZmF1bHRzUmVhZDtcbn1cbi8qKlxuICogTWFrZSBvcHRpb25zIGZvciB3cml0aW5nIEpTT04gZGF0YSBmcm9tIHBhcnRpYWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25Xcml0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1dyaXRlKSwgb3B0aW9ucykgOiBkZWZhdWx0c1dyaXRlO1xufVxuLyoqXG4gKiBNZXJnZXMgSlNPTiB3cml0ZSBvciByZWFkIG9wdGlvbnMuIExhdGVyIHZhbHVlcyBvdmVycmlkZSBlYXJsaWVyIHZhbHVlcy4gVHlwZSByZWdpc3RyaWVzIGFyZSBtZXJnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUpzb25PcHRpb25zKGEsIGIpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBjID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhKSwgYik7XG4gICAgYy50eXBlUmVnaXN0cnkgPSBbLi4uKChfYSA9IGEgPT09IG51bGwgfHwgYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogYS50eXBlUmVnaXN0cnkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKSwgLi4uKChfYiA9IGIgPT09IG51bGwgfHwgYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogYi50eXBlUmVnaXN0cnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdKV07XG4gICAgcmV0dXJuIGM7XG59XG4iLCIvKipcbiAqIEdldCB0aGUgdHlwZSBvZiBhIEpTT04gdmFsdWUuXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYXJyYXksIG51bGwgYW5kIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVvZkpzb25WYWx1ZSh2YWx1ZSkge1xuICAgIGxldCB0ID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh0ID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgIH1cbiAgICByZXR1cm4gdDtcbn1cbi8qKlxuICogSXMgdGhpcyBhIEpTT04gb2JqZWN0IChpbnN0ZWFkIG9mIGFuIGFycmF5IG9yIG51bGwpP1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNKc29uT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiIsIi8qKlxuICogQ29udmVydHMgc25ha2VfY2FzZSB0byBsb3dlckNhbWVsQ2FzZS5cbiAqXG4gKiBTaG91bGQgYmVoYXZlIGxpa2UgcHJvdG9jOlxuICogaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iL2U4YWUxMzdjOTY0NDRlYTMxMzQ4NWVkMTExOGM1ZTQzYjIwOTljZjEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYyNMMTE4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb3dlckNhbWVsQ2FzZShzbmFrZUNhc2UpIHtcbiAgICBsZXQgY2FwTmV4dCA9IGZhbHNlO1xuICAgIGNvbnN0IHNiID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbmFrZUNhc2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5leHQgPSBzbmFrZUNhc2UuY2hhckF0KGkpO1xuICAgICAgICBpZiAobmV4dCA9PSAnXycpIHtcbiAgICAgICAgICAgIGNhcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9cXGQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dCk7XG4gICAgICAgICAgICBjYXBOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjYXBOZXh0KSB7XG4gICAgICAgICAgICBzYi5wdXNoKG5leHQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICBjYXBOZXh0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzYi5wdXNoKG5leHQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzYi5wdXNoKG5leHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzYi5qb2luKCcnKTtcbn1cbiIsIi8qKlxuICogVGhlIHN5bWJvbCB1c2VkIGFzIGEga2V5IG9uIG1lc3NhZ2Ugb2JqZWN0cyB0byBzdG9yZSB0aGUgbWVzc2FnZSB0eXBlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIC0gaXQgaXMgaGVyZSB0byBzdGF5LCBidXRcbiAqIGltcGxlbWVudGF0aW9uIGRldGFpbHMgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJwcm90b2J1Zi10cy9tZXNzYWdlLXR5cGVcIik7XG4iLCJpbXBvcnQgeyBNRVNTQUdFX1RZUEUgfSBmcm9tIFwiLi9tZXNzYWdlLXR5cGUtY29udHJhY3RcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZpZWxkSW5mbyB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvblR5cGVDaGVjayB9IGZyb20gXCIuL3JlZmxlY3Rpb24tdHlwZS1jaGVja1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbkpzb25SZWFkZXIgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWpzb24tcmVhZGVyXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uSnNvbldyaXRlciB9IGZyb20gXCIuL3JlZmxlY3Rpb24tanNvbi13cml0ZXJcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb25CaW5hcnlSZWFkZXIgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWJpbmFyeS1yZWFkZXJcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb25CaW5hcnlXcml0ZXIgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWJpbmFyeS13cml0ZXJcIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25DcmVhdGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWNyZWF0ZVwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tbWVyZ2UtcGFydGlhbFwiO1xuaW1wb3J0IHsgdHlwZW9mSnNvblZhbHVlIH0gZnJvbSBcIi4vanNvbi10eXBpbmdzXCI7XG5pbXBvcnQgeyBqc29uUmVhZE9wdGlvbnMsIGpzb25Xcml0ZU9wdGlvbnMsIH0gZnJvbSBcIi4vanNvbi1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25FcXVhbHMgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWVxdWFsc1wiO1xuaW1wb3J0IHsgYmluYXJ5V3JpdGVPcHRpb25zIH0gZnJvbSBcIi4vYmluYXJ5LXdyaXRlclwiO1xuaW1wb3J0IHsgYmluYXJ5UmVhZE9wdGlvbnMgfSBmcm9tIFwiLi9iaW5hcnktcmVhZGVyXCI7XG5jb25zdCBiYXNlRGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3QuZ2V0UHJvdG90eXBlT2Yoe30pKTtcbi8qKlxuICogVGhpcyBzdGFuZGFyZCBtZXNzYWdlIHR5cGUgcHJvdmlkZXMgcmVmbGVjdGlvbi1iYXNlZFxuICogb3BlcmF0aW9ucyB0byB3b3JrIHdpdGggYSBtZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGZpZWxkcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlZmF1bHRDaGVja0RlcHRoID0gMTY7XG4gICAgICAgIHRoaXMudHlwZU5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcy5tYXAobm9ybWFsaXplRmllbGRJbmZvKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgICAgIHRoaXMubWVzc2FnZVByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlRGVzY3JpcHRvcnMpLCB7IFtNRVNTQUdFX1RZUEVdOiB7IHZhbHVlOiB0aGlzIH0gfSkpO1xuICAgICAgICB0aGlzLnJlZlR5cGVDaGVjayA9IG5ldyBSZWZsZWN0aW9uVHlwZUNoZWNrKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkpzb25SZWFkZXIgPSBuZXcgUmVmbGVjdGlvbkpzb25SZWFkZXIodGhpcyk7XG4gICAgICAgIHRoaXMucmVmSnNvbldyaXRlciA9IG5ldyBSZWZsZWN0aW9uSnNvbldyaXRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZCaW5SZWFkZXIgPSBuZXcgUmVmbGVjdGlvbkJpbmFyeVJlYWRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZCaW5Xcml0ZXIgPSBuZXcgUmVmbGVjdGlvbkJpbmFyeVdyaXRlcih0aGlzKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gcmVmbGVjdGlvbkNyZWF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9uZSB0aGUgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFVua25vd24gZmllbGRzIGFyZSBkaXNjYXJkZWQuXG4gICAgICovXG4gICAgY2xvbmUobWVzc2FnZSkge1xuICAgICAgICBsZXQgY29weSA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgY29weSwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZSBoYXZlIHRoZSBzYW1lIGZpZWxkIHZhbHVlcy5cbiAgICAgKiBDaGVja3MgZm9yIGRlZXAgZXF1YWxpdHksIHRyYXZlcnNpbmcgcmVwZWF0ZWQgZmllbGRzLCBvbmVvZiBncm91cHMsIG1hcHNcbiAgICAgKiBhbmQgbWVzc2FnZXMgcmVjdXJzaXZlbHkuXG4gICAgICogV2lsbCBhbHNvIHJldHVybiB0cnVlIGlmIGJvdGggbWVzc2FnZXMgYXJlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGVxdWFscyhhLCBiKSB7XG4gICAgICAgIHJldHVybiByZWZsZWN0aW9uRXF1YWxzKHRoaXMsIGEsIGIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgZ2l2ZW4gdmFsdWUgYXNzaWduYWJsZSB0byBvdXIgbWVzc2FnZSB0eXBlXG4gICAgICogYW5kIGNvbnRhaW5zIG5vIFtleGNlc3MgcHJvcGVydGllc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svaW50ZXJmYWNlcy5odG1sI2V4Y2Vzcy1wcm9wZXJ0eS1jaGVja3MpP1xuICAgICAqL1xuICAgIGlzKGFyZywgZGVwdGggPSB0aGlzLmRlZmF1bHRDaGVja0RlcHRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZlR5cGVDaGVjay5pcyhhcmcsIGRlcHRoLCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBnaXZlbiB2YWx1ZSBhc3NpZ25hYmxlIHRvIG91ciBtZXNzYWdlIHR5cGUsXG4gICAgICogcmVnYXJkbGVzcyBvZiBbZXhjZXNzIHByb3BlcnRpZXNdKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2ludGVyZmFjZXMuaHRtbCNleGNlc3MtcHJvcGVydHktY2hlY2tzKT9cbiAgICAgKi9cbiAgICBpc0Fzc2lnbmFibGUoYXJnLCBkZXB0aCA9IHRoaXMuZGVmYXVsdENoZWNrRGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmVHlwZUNoZWNrLmlzKGFyZywgZGVwdGgsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb3B5IHBhcnRpYWwgZGF0YSBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBtZXJnZVBhcnRpYWwodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCB0YXJnZXQsIHNvdXJjZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBtZXNzYWdlIGZyb20gYmluYXJ5IGZvcm1hdC5cbiAgICAgKi9cbiAgICBmcm9tQmluYXJ5KGRhdGEsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG9wdCA9IGJpbmFyeVJlYWRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEJpbmFyeVJlYWQob3B0LnJlYWRlckZhY3RvcnkoZGF0YSksIGRhdGEuYnl0ZUxlbmd0aCwgb3B0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIG5ldyBtZXNzYWdlIGZyb20gYSBKU09OIHZhbHVlLlxuICAgICAqL1xuICAgIGZyb21Kc29uKGpzb24sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxKc29uUmVhZChqc29uLCBqc29uUmVhZE9wdGlvbnMob3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgbmV3IG1lc3NhZ2UgZnJvbSBhIEpTT04gc3RyaW5nLlxuICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgVC5mcm9tSnNvbihKU09OLnBhcnNlKGpzb24pKWAuXG4gICAgICovXG4gICAgZnJvbUpzb25TdHJpbmcoanNvbiwgb3B0aW9ucykge1xuICAgICAgICBsZXQgdmFsdWUgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tSnNvbih2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIHRoZSBtZXNzYWdlIHRvIGNhbm9uaWNhbCBKU09OIHZhbHVlLlxuICAgICAqL1xuICAgIHRvSnNvbihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIGpzb25Xcml0ZU9wdGlvbnMob3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRoZSBtZXNzYWdlIHRvIGNhbm9uaWNhbCBKU09OIHN0cmluZy5cbiAgICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYEpTT04uc3RyaW5naWZ5KFQudG9Kc29uKHQpKWBcbiAgICAgKi9cbiAgICB0b0pzb25TdHJpbmcobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudG9Kc29uKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmV0dHlTcGFjZXMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0LlxuICAgICAqL1xuICAgIHRvQmluYXJ5KG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG9wdCA9IGJpbmFyeVdyaXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCBvcHQud3JpdGVyRmFjdG9yeSgpLCBvcHQpLmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZC4gSWYgeW91IGp1c3Qgd2FudCB0byByZWFkIGEgbWVzc2FnZSBmcm9tXG4gICAgICogSlNPTiwgdXNlIGBmcm9tSnNvbigpYCBvciBgZnJvbUpzb25TdHJpbmcoKWAuXG4gICAgICpcbiAgICAgKiBSZWFkcyBKU09OIHZhbHVlIGFuZCBtZXJnZXMgdGhlIGZpZWxkcyBpbnRvIHRoZSB0YXJnZXRcbiAgICAgKiBhY2NvcmRpbmcgdG8gcHJvdG9idWYgcnVsZXMuIElmIHRoZSB0YXJnZXQgaXMgb21pdHRlZCxcbiAgICAgKiBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGZpcnN0LlxuICAgICAqL1xuICAgIGludGVybmFsSnNvblJlYWQoanNvbiwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGlmIChqc29uICE9PSBudWxsICYmIHR5cGVvZiBqc29uID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoanNvbikpIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgICAgIHRoaXMucmVmSnNvblJlYWRlci5yZWFkKGpzb24sIG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVzc2FnZSAke3RoaXMudHlwZU5hbWV9IGZyb20gSlNPTiAke3R5cGVvZkpzb25WYWx1ZShqc29uKX0uYCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kLiBJZiB5b3UganVzdCB3YW50IHRvIHdyaXRlIGEgbWVzc2FnZVxuICAgICAqIHRvIEpTT04sIHVzZSBgdG9Kc29uKClgIG9yIGB0b0pzb25TdHJpbmcoKS5cbiAgICAgKlxuICAgICAqIFdyaXRlcyBKU09OIHZhbHVlIGFuZCByZXR1cm5zIGl0LlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci53cml0ZShtZXNzYWdlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QuIElmIHlvdSBqdXN0IHdhbnQgdG8gd3JpdGUgYSBtZXNzYWdlXG4gICAgICogaW4gYmluYXJ5IGZvcm1hdCwgdXNlIGB0b0JpbmFyeSgpYC5cbiAgICAgKlxuICAgICAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgaW4gYmluYXJ5IGZvcm1hdCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZ2l2ZW5cbiAgICAgKiB3cml0ZXIuIFJldHVybnMgcGFzc2VkIHdyaXRlci5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnJlZkJpbldyaXRlci53cml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZC4gSWYgeW91IGp1c3Qgd2FudCB0byByZWFkIGEgbWVzc2FnZSBmcm9tXG4gICAgICogYmluYXJ5IGRhdGEsIHVzZSBgZnJvbUJpbmFyeSgpYC5cbiAgICAgKlxuICAgICAqIFJlYWRzIGRhdGEgZnJvbSBiaW5hcnkgZm9ybWF0IGFuZCBtZXJnZXMgdGhlIGZpZWxkcyBpbnRvXG4gICAgICogdGhlIHRhcmdldCBhY2NvcmRpbmcgdG8gcHJvdG9idWYgcnVsZXMuIElmIHRoZSB0YXJnZXQgaXNcbiAgICAgKiBvbWl0dGVkLCBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGZpcnN0LlxuICAgICAqL1xuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy5yZWZCaW5SZWFkZXIucmVhZChyZWFkZXIsIG1lc3NhZ2UsIG9wdGlvbnMsIGxlbmd0aCk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn1cbiIsIi8qKlxuICogSXMgdGhlIGdpdmVuIHZhbHVlIGEgdmFsaWQgb25lb2YgZ3JvdXA/XG4gKlxuICogV2UgcmVwcmVzZW50IHByb3RvYnVmIGBvbmVvZmAgYXMgYWxnZWJyYWljIGRhdGEgdHlwZXMgKEFEVCkgaW4gZ2VuZXJhdGVkXG4gKiBjb2RlLiBCdXQgd2hlbiB3b3JraW5nIHdpdGggbWVzc2FnZXMgb2YgdW5rbm93biB0eXBlLCB0aGUgQURUIGRvZXMgbm90XG4gKiBoZWxwIHVzLlxuICpcbiAqIFRoaXMgdHlwZSBndWFyZCBjaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBhZGhlcmVzIHRvIHRoZSBBRFQgcnVsZXMsIHdoaWNoXG4gKiBhcmUgYXMgZm9sbG93czpcbiAqXG4gKiAxKSBNdXN0IGJlIGFuIG9iamVjdC5cbiAqXG4gKiAyKSBNdXN0IGhhdmUgYSBcIm9uZW9mS2luZFwiIGRpc2NyaW1pbmF0b3IgcHJvcGVydHkuXG4gKlxuICogMykgSWYgXCJvbmVvZktpbmRcIiBpcyBgdW5kZWZpbmVkYCwgbm8gbWVtYmVyIGZpZWxkIGlzIHNlbGVjdGVkLiBUaGUgb2JqZWN0XG4gKiBtdXN0IG5vdCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0aWVzLlxuICpcbiAqIDQpIElmIFwib25lb2ZLaW5kXCIgaXMgYSBgc3RyaW5nYCwgdGhlIG1lbWJlciBmaWVsZCB3aXRoIHRoaXMgbmFtZSBpc1xuICogc2VsZWN0ZWQuXG4gKlxuICogNSkgSWYgYSBtZW1iZXIgZmllbGQgaXMgc2VsZWN0ZWQsIHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgc2Vjb25kIHByb3BlcnR5XG4gKiB3aXRoIHRoaXMgbmFtZS4gVGhlIHByb3BlcnR5IG11c3Qgbm90IGJlIGB1bmRlZmluZWRgLlxuICpcbiAqIDYpIE5vIGV4dHJhIHByb3BlcnRpZXMgYXJlIGFsbG93ZWQuIFRoZSBvYmplY3QgaGFzIGVpdGhlciBvbmUgcHJvcGVydHlcbiAqIChubyBzZWxlY3Rpb24pIG9yIHR3byBwcm9wZXJ0aWVzIChzZWxlY3Rpb24pLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT25lb2ZHcm91cChhbnkpIHtcbiAgICBpZiAodHlwZW9mIGFueSAhPSAnb2JqZWN0JyB8fCBhbnkgPT09IG51bGwgfHwgIWFueS5oYXNPd25Qcm9wZXJ0eSgnb25lb2ZLaW5kJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGVvZiBhbnkub25lb2ZLaW5kKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIGlmIChhbnlbYW55Lm9uZW9mS2luZF0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYW55KS5sZW5ndGggPT0gMjtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGFueSkubGVuZ3RoID09IDE7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gYSBvbmVvZiBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9uZW9mVmFsdWUob25lb2YsIGtpbmQpIHtcbiAgICByZXR1cm4gb25lb2Zba2luZF07XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0T25lb2ZWYWx1ZShvbmVvZiwga2luZCwgdmFsdWUpIHtcbiAgICBpZiAob25lb2Yub25lb2ZLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIG9uZW9mW29uZW9mLm9uZW9mS2luZF07XG4gICAgfVxuICAgIG9uZW9mLm9uZW9mS2luZCA9IGtpbmQ7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb25lb2Zba2luZF0gPSB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0VW5rbm93bk9uZW9mVmFsdWUob25lb2YsIGtpbmQsIHZhbHVlKSB7XG4gICAgaWYgKG9uZW9mLm9uZW9mS2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBvbmVvZltvbmVvZi5vbmVvZktpbmRdO1xuICAgIH1cbiAgICBvbmVvZi5vbmVvZktpbmQgPSBraW5kO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvbmVvZltraW5kXSA9IHZhbHVlO1xuICAgIH1cbn1cbi8qKlxuICogUmVtb3ZlcyB0aGUgc2VsZWN0ZWQgZmllbGQgaW4gYSBvbmVvZiBncm91cC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIHJlY29tbWVuZGVkIHdheSB0byBtb2RpZnkgYSBvbmVvZiBncm91cCBpcyB0byBzZXRcbiAqIGEgbmV3IG9iamVjdDpcbiAqXG4gKiBgYGB0c1xuICogbWVzc2FnZS5yZXN1bHQgPSB7IG9uZW9mS2luZDogdW5kZWZpbmVkIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT25lb2ZWYWx1ZShvbmVvZikge1xuICAgIGlmIChvbmVvZi5vbmVvZktpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgb25lb2Zbb25lb2Yub25lb2ZLaW5kXTtcbiAgICB9XG4gICAgb25lb2Yub25lb2ZLaW5kID0gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gb25lb2YgZ3JvdXAuXG4gKlxuICogTm90IHRoYXQgdGhlIHJlY29tbWVuZGVkIHdheSB0byBhY2Nlc3MgYSBvbmVvZiBncm91cCBpcyB0byBjaGVja1xuICogdGhlIFwib25lb2ZLaW5kXCIgcHJvcGVydHkgYW5kIGxldCBUeXBlU2NyaXB0IG5hcnJvdyBkb3duIHRoZSB1bmlvblxuICogdHlwZSBmb3IgeW91OlxuICpcbiAqIGBgYHRzXG4gKiBpZiAobWVzc2FnZS5yZXN1bHQub25lb2ZLaW5kID09PSBcImVycm9yXCIpIHtcbiAqICAgbWVzc2FnZS5yZXN1bHQuZXJyb3I7IC8vIHN0cmluZ1xuICogfVxuICogYGBgXG4gKlxuICogSW4gdGhlIHJhcmUgY2FzZSB5b3UganVzdCBuZWVkIHRoZSB2YWx1ZSwgYW5kIGRvIG5vdCBjYXJlIGFib3V0XG4gKiB3aGljaCBwcm90b2J1ZiBmaWVsZCBpcyBzZWxlY3RlZCwgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvblxuICogZm9yIGNvbnZlbmllbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRPbmVvZlZhbHVlKG9uZW9mKSB7XG4gICAgaWYgKG9uZW9mLm9uZW9mS2luZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBvbmVvZltvbmVvZi5vbmVvZktpbmRdO1xufVxuIiwiaW1wb3J0IHsgaW50NjRmcm9tU3RyaW5nLCBpbnQ2NHRvU3RyaW5nIH0gZnJvbSBcIi4vZ29vZy12YXJpbnRcIjtcbmxldCBCSTtcbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RCaSgpIHtcbiAgICBjb25zdCBkdiA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoOCkpO1xuICAgIGNvbnN0IG9rID0gZ2xvYmFsVGhpcy5CaWdJbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiB0eXBlb2YgZHYuZ2V0QmlnSW50NjQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAmJiB0eXBlb2YgZHYuZ2V0QmlnVWludDY0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgJiYgdHlwZW9mIGR2LnNldEJpZ0ludDY0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgJiYgdHlwZW9mIGR2LnNldEJpZ1VpbnQ2NCA9PT0gXCJmdW5jdGlvblwiO1xuICAgIEJJID0gb2sgPyB7XG4gICAgICAgIE1JTjogQmlnSW50KFwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiksXG4gICAgICAgIE1BWDogQmlnSW50KFwiOTIyMzM3MjAzNjg1NDc3NTgwN1wiKSxcbiAgICAgICAgVU1JTjogQmlnSW50KFwiMFwiKSxcbiAgICAgICAgVU1BWDogQmlnSW50KFwiMTg0NDY3NDQwNzM3MDk1NTE2MTVcIiksXG4gICAgICAgIEM6IEJpZ0ludCxcbiAgICAgICAgVjogZHYsXG4gICAgfSA6IHVuZGVmaW5lZDtcbn1cbmRldGVjdEJpKCk7XG5mdW5jdGlvbiBhc3NlcnRCaShiaSkge1xuICAgIGlmICghYmkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJpZ0ludCB1bmF2YWlsYWJsZSwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vc3RhbW0vcHJvdG9idWYtdHMvYmxvYi92MS4wLjgvTUFOVUFMLm1kI2JpZ2ludC1zdXBwb3J0XCIpO1xufVxuLy8gdXNlZCB0byB2YWxpZGF0ZSBmcm9tKHN0cmluZykgaW5wdXQgKHdoZW4gYmlnaW50IGlzIHVuYXZhaWxhYmxlKVxuY29uc3QgUkVfREVDSU1BTF9TVFIgPSAvXi0/WzAtOV0rJC87XG4vLyBjb25zdGFudHMgZm9yIGJpbmFyeSBtYXRoXG5jb25zdCBUV09fUFdSXzMyX0RCTCA9IDB4MTAwMDAwMDAwO1xuY29uc3QgSEFMRl8yX1BXUl8zMiA9IDB4MDgwMDAwMDAwO1xuLy8gYmFzZSBjbGFzcyBmb3IgUGJMb25nIGFuZCBQYlVMb25nIHByb3ZpZGVzIHNoYXJlZCBjb2RlXG5jbGFzcyBTaGFyZWRQYkxvbmcge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBiaXRzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvLCBoaSkge1xuICAgICAgICB0aGlzLmxvID0gbG8gfCAwO1xuICAgICAgICB0aGlzLmhpID0gaGkgfCAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGlzIGluc3RhbmNlIGVxdWFsIHRvIDA/XG4gICAgICovXG4gICAgaXNaZXJvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbyA9PSAwICYmIHRoaXMuaGkgPT0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBhIG5hdGl2ZSBudW1iZXIuXG4gICAgICovXG4gICAgdG9OdW1iZXIoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmhpICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sbyA+Pj4gMCk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIocmVzdWx0KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBjb252ZXJ0IHRvIHNhZmUgbnVtYmVyXCIpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuICogNjQtYml0IHVuc2lnbmVkIGludGVnZXIgYXMgdHdvIDMyLWJpdCB2YWx1ZXMuXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIGBzdHJpbmdgLCBgbnVtYmVyYCBhbmQgYGJpZ2ludGAgcmVwcmVzZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGJVTG9uZyBleHRlbmRzIFNoYXJlZFBiTG9uZyB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gYSBgc3RyaW5nYCwgYG51bWJlcmAgb3IgYGJpZ2ludGAuXG4gICAgICovXG4gICAgc3RhdGljIGZyb20odmFsdWUpIHtcbiAgICAgICAgaWYgKEJJKVxuICAgICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEZhbGxUaHJvdWdoSW5Td2l0Y2hTdGF0ZW1lbnRKU1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJJLkModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCSS5DKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBCSS5VTUlOKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgdmFsdWUgZm9yIHVsb25nJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IEJJLlVNQVgpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vsb25nIHRvbyBsYXJnZScpO1xuICAgICAgICAgICAgICAgICAgICBCSS5WLnNldEJpZ1VpbnQ2NCgwLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyhCSS5WLmdldEludDMyKDAsIHRydWUpLCBCSS5WLmdldEludDMyKDQsIHRydWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVJFX0RFQ0lNQUxfU1RSLnRlc3QodmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgW21pbnVzLCBsbywgaGldID0gaW50NjRmcm9tU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbnVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgdmFsdWUgZm9yIHVsb25nJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyhsbywgaGkpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbnVtYmVyIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIHZhbHVlIGZvciB1bG9uZycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBiVUxvbmcodmFsdWUsIHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gdmFsdWUgJyArIHR5cGVvZiB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gZGVjaW1hbCBzdHJpbmcuXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBCSSA/IHRoaXMudG9CaWdJbnQoKS50b1N0cmluZygpIDogaW50NjR0b1N0cmluZyh0aGlzLmxvLCB0aGlzLmhpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBuYXRpdmUgYmlnaW50LlxuICAgICAqL1xuICAgIHRvQmlnSW50KCkge1xuICAgICAgICBhc3NlcnRCaShCSSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoMCwgdGhpcy5sbywgdHJ1ZSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoNCwgdGhpcy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBCSS5WLmdldEJpZ1VpbnQ2NCgwLCB0cnVlKTtcbiAgICB9XG59XG4vKipcbiAqIHVsb25nIDAgc2luZ2xldG9uLlxuICovXG5QYlVMb25nLlpFUk8gPSBuZXcgUGJVTG9uZygwLCAwKTtcbi8qKlxuICogNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFzIHR3byAzMi1iaXQgdmFsdWVzLlxuICogQ29udmVydHMgYmV0d2VlbiBgc3RyaW5nYCwgYG51bWJlcmAgYW5kIGBiaWdpbnRgIHJlcHJlc2VudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBiTG9uZyBleHRlbmRzIFNoYXJlZFBiTG9uZyB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gYSBgc3RyaW5nYCwgYG51bWJlcmAgb3IgYGJpZ2ludGAuXG4gICAgICovXG4gICAgc3RhdGljIGZyb20odmFsdWUpIHtcbiAgICAgICAgaWYgKEJJKVxuICAgICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEZhbGxUaHJvdWdoSW5Td2l0Y2hTdGF0ZW1lbnRKU1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJJLkModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCSS5DKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBCSS5NSU4pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBzbWFsbCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiBCSS5NQVgpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBsYXJnZScpO1xuICAgICAgICAgICAgICAgICAgICBCSS5WLnNldEJpZ0ludDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYkxvbmcoQkkuVi5nZXRJbnQzMigwLCB0cnVlKSwgQkkuVi5nZXRJbnQzMig0LCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFSRV9ERUNJTUFMX1NUUi50ZXN0KHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IFttaW51cywgbG8sIGhpXSA9IGludDY0ZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW51cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpID4gSEFMRl8yX1BXUl8zMiB8fCAoaGkgPT0gSEFMRl8yX1BXUl8zMiAmJiBsbyAhPSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBzbWFsbCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhpID49IEhBTEZfMl9QV1JfMzIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBsYXJnZScpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGJsID0gbmV3IFBiTG9uZyhsbywgaGkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWludXMgPyBwYmwubmVnYXRlKCkgOiBwYmw7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdudW1iZXIgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBQYkxvbmcodmFsdWUsIHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBQYkxvbmcoLXZhbHVlLCAtdmFsdWUgLyBUV09fUFdSXzMyX0RCTCkubmVnYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biB2YWx1ZSAnICsgdHlwZW9mIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG8gd2UgaGF2ZSBhIG1pbnVzIHNpZ24/XG4gICAgICovXG4gICAgaXNOZWdhdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmhpICYgSEFMRl8yX1BXUl8zMikgIT09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5lZ2F0ZSB0d28ncyBjb21wbGVtZW50LlxuICAgICAqIEludmVydCBhbGwgdGhlIGJpdHMgYW5kIGFkZCBvbmUgdG8gdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBuZWdhdGUoKSB7XG4gICAgICAgIGxldCBoaSA9IH50aGlzLmhpLCBsbyA9IHRoaXMubG87XG4gICAgICAgIGlmIChsbylcbiAgICAgICAgICAgIGxvID0gfmxvICsgMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaGkgKz0gMTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYkxvbmcobG8sIGhpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBkZWNpbWFsIHN0cmluZy5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKEJJKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9CaWdJbnQoKS50b1N0cmluZygpO1xuICAgICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgIGxldCBuID0gdGhpcy5uZWdhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiAnLScgKyBpbnQ2NHRvU3RyaW5nKG4ubG8sIG4uaGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnQ2NHRvU3RyaW5nKHRoaXMubG8sIHRoaXMuaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIG5hdGl2ZSBiaWdpbnQuXG4gICAgICovXG4gICAgdG9CaWdJbnQoKSB7XG4gICAgICAgIGFzc2VydEJpKEJJKTtcbiAgICAgICAgQkkuVi5zZXRJbnQzMigwLCB0aGlzLmxvLCB0cnVlKTtcbiAgICAgICAgQkkuVi5zZXRJbnQzMig0LCB0aGlzLmhpLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIEJJLlYuZ2V0QmlnSW50NjQoMCwgdHJ1ZSk7XG4gICAgfVxufVxuLyoqXG4gKiBsb25nIDAgc2luZ2xldG9uLlxuICovXG5QYkxvbmcuWkVSTyA9IG5ldyBQYkxvbmcoMCwgMCk7XG4iLCJpbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyLCBXaXJlVHlwZSB9IGZyb20gXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IExvbmdUeXBlLCBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uTG9uZ0NvbnZlcnQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWxvbmctY29udmVydFwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvblNjYWxhckRlZmF1bHQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLXNjYWxhci1kZWZhdWx0XCI7XG4vKipcbiAqIFJlYWRzIHByb3RvMyBtZXNzYWdlcyBpbiBiaW5hcnkgZm9ybWF0IHVzaW5nIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgfVxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkTm9Ub0ZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNJbnB1dCA9IChfYSA9IHRoaXMuaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgdGhpcy5maWVsZE5vVG9GaWVsZCA9IG5ldyBNYXAoZmllbGRzSW5wdXQubWFwKGZpZWxkID0+IFtmaWVsZC5ubywgZmllbGRdKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBtZXNzYWdlIGZyb20gYmluYXJ5IGZvcm1hdCBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFJlcGVhdGVkIGZpZWxkcyBhcmUgYXBwZW5kZWQuIE1hcCBlbnRyaWVzIGFyZSBhZGRlZCwgb3ZlcndyaXRpbmdcbiAgICAgKiBleGlzdGluZyBrZXlzLlxuICAgICAqXG4gICAgICogSWYgYSBtZXNzYWdlIGZpZWxkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGVcbiAgICAgKiBuZXcgZGF0YS5cbiAgICAgKi9cbiAgICByZWFkKHJlYWRlciwgbWVzc2FnZSwgb3B0aW9ucywgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBjb25zdCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgLy8gcmVhZCB0aGUgdGFnIGFuZCBmaW5kIHRoZSBmaWVsZFxuICAgICAgICAgICAgY29uc3QgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKSwgZmllbGQgPSB0aGlzLmZpZWxkTm9Ub0ZpZWxkLmdldChmaWVsZE5vKTtcbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICBpZiAodSA9PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMuaW5mby50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLmluZm8udHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRhcmdldCBvYmplY3QgZm9yIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZ1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IG1lc3NhZ2UsIHJlcGVhdGVkID0gZmllbGQucmVwZWF0LCBsb2NhbE5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgICAgICAvLyBpZiBmaWVsZCBpcyBtZW1iZXIgb2Ygb25lb2YgQURULCB1c2UgQURUIGFzIHRhcmdldFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgICAgICAvLyBpZiBvdGhlciBvbmVvZiBtZW1iZXIgc2VsZWN0ZWQsIHNldCBuZXcgQURUXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5vbmVvZktpbmQgIT09IGxvY2FsTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbWVzc2FnZVtmaWVsZC5vbmVvZl0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbmVvZktpbmQ6IGxvY2FsTmFtZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBoYW5kbGVkIG9uZW9mIGFib3ZlLCB3ZSBqdXN0IGhhdmUgcmVhZCB0aGUgdmFsdWUgaW50byBgdGFyZ2V0W2xvY2FsTmFtZV1gXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5raW5kID09IFwiZW51bVwiID8gU2NhbGFyVHlwZS5JTlQzMiA6IGZpZWxkLlQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBMID0gZmllbGQua2luZCA9PSBcInNjYWxhclwiID8gZmllbGQuTCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGFyZ2V0W2xvY2FsTmFtZV07IC8vIHNhZmUgdG8gYXNzdW1lIHByZXNlbmNlIG9mIGFycmF5LCBvbmVvZiBjYW5ub3QgY29udGFpbiByZXBlYXRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aXJlVHlwZSA9PSBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQgJiYgVCAhPSBTY2FsYXJUeXBlLlNUUklORyAmJiBUICE9IFNjYWxhclR5cGUuQllURVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLnNjYWxhcihyZWFkZXIsIFQsIEwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLnNjYWxhcihyZWFkZXIsIFQsIEwpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IHRoaXMuc2NhbGFyKHJlYWRlciwgVCwgTCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyciA9IHRhcmdldFtsb2NhbE5hbWVdOyAvLyBzYWZlIHRvIGFzc3VtZSBwcmVzZW5jZSBvZiBhcnJheSwgb25lb2YgY2Fubm90IGNvbnRhaW4gcmVwZWF0ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gZmllbGQuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChtc2cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdID0gZmllbGQuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgdGFyZ2V0W2xvY2FsTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgIGxldCBbbWFwS2V5LCBtYXBWYWxdID0gdGhpcy5tYXBFbnRyeShmaWVsZCwgcmVhZGVyLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2FmZSB0byBhc3N1bWUgcHJlc2VuY2Ugb2YgbWFwIG9iamVjdCwgb25lb2YgY2Fubm90IGNvbnRhaW4gcmVwZWF0ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdW21hcEtleV0gPSBtYXBWYWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBtYXAgZmllbGQsIGV4cGVjdGluZyBrZXkgZmllbGQgPSAxLCB2YWx1ZSBmaWVsZCA9IDJcbiAgICAgKi9cbiAgICBtYXBFbnRyeShmaWVsZCwgcmVhZGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBsZW5ndGggPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgIGxldCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBsZXQga2V5ID0gdW5kZWZpbmVkOyAvLyBqYXZhc2NyaXB0IG9ubHkgYWxsb3dzIG51bWJlciBvciBzdHJpbmcgZm9yIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgIGxldCB2YWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MKVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcmVhZGVyLmJvb2woKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb25nIHR5cGVzIGFyZSByZWFkIGFzIHN0cmluZywgbnVtYmVyIHR5cGVzIGFyZSBva2F5IGFzIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5zY2FsYXIocmVhZGVyLCBmaWVsZC5LLCBMb25nVHlwZS5TVFJJTkcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5zY2FsYXIocmVhZGVyLCBmaWVsZC5WLlQsIGZpZWxkLlYuTCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5WLlQoKS5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGluIG1hcCBlbnRyeSBmb3IgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGQubmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBrZXlSYXcgPSByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdChmaWVsZC5LKTtcbiAgICAgICAgICAgIGtleSA9IGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MID8ga2V5UmF3LnRvU3RyaW5nKCkgOiBrZXlSYXc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0KGZpZWxkLlYuVCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gZmllbGQuVi5UKCkuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgdmFsXTtcbiAgICB9XG4gICAgc2NhbGFyKHJlYWRlciwgdHlwZSwgbG9uZ1R5cGUpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuZG91YmxlKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLmludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChyZWFkZXIudWludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLmZpeGVkNjQoKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5maXhlZDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc2ZpeGVkMzIoKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KHJlYWRlci5zZml4ZWQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc2ludDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLnNpbnQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyLCBXaXJlVHlwZSB9IGZyb20gXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IFJlcGVhdFR5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuL2Fzc2VydFwiO1xuaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuLyoqXG4gKiBXcml0ZXMgcHJvdG8zIG1lc3NhZ2VzIGluIGJpbmFyeSBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvZW5jb2RpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25CaW5hcnlXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzSW5wdXQgPSB0aGlzLmluZm8uZmllbGRzID8gdGhpcy5pbmZvLmZpZWxkcy5jb25jYXQoKSA6IFtdO1xuICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHNJbnB1dC5zb3J0KChhLCBiKSA9PiBhLm5vIC0gYi5ubyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQuXG4gICAgICovXG4gICAgd3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUsIC8vIHRoaXMgd2lsbCBiZSBvdXIgZmllbGQgdmFsdWUsIHdoZXRoZXIgaXQgaXMgbWVtYmVyIG9mIGEgb25lb2Ygb3Igbm90XG4gICAgICAgICAgICBlbWl0RGVmYXVsdCwgLy8gd2hldGhlciB3ZSBlbWl0IHRoZSBkZWZhdWx0IHZhbHVlIChvbmx5IHRydWUgZm9yIG9uZW9mIG1lbWJlcnMpXG4gICAgICAgICAgICByZXBlYXRlZCA9IGZpZWxkLnJlcGVhdCwgbG9jYWxOYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gaGFuZGxlIG9uZW9mIEFEVFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBtZXNzYWdlW2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kICE9PSBsb2NhbE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZiBmaWVsZCBpcyBub3Qgc2VsZWN0ZWQsIHNraXBcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdyb3VwW2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgZW1pdERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBtZXNzYWdlW2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgZW1pdERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGhhdmUgaGFuZGxlZCBvbmVvZiBhYm92ZS4gd2UganVzdCBoYXZlIHRvIGhvbm9yIGBlbWl0RGVmYXVsdGAuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5raW5kID09IFwiZW51bVwiID8gU2NhbGFyVHlwZS5JTlQzMiA6IGZpZWxkLlQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCA9PSBSZXBlYXRUeXBlLlBBQ0tFRClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhY2tlZCh3cml0ZXIsIFQsIGZpZWxkLm5vLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIFQsIGZpZWxkLm5vLCBpdGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZpZWxkLm9wdCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NhbGFyKHdyaXRlciwgVCwgZmllbGQubm8sIHZhbHVlLCBlbWl0RGVmYXVsdCB8fCBmaWVsZC5vcHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlKHdyaXRlciwgb3B0aW9ucywgZmllbGQuVCgpLCBmaWVsZC5ubywgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5UKCksIGZpZWxkLm5vLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwRW50cnkod3JpdGVyLCBvcHRpb25zLCBmaWVsZCwga2V5LCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMuaW5mby50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICB9XG4gICAgbWFwRW50cnkod3JpdGVyLCBvcHRpb25zLCBmaWVsZCwga2V5LCB2YWx1ZSkge1xuICAgICAgICB3cml0ZXIudGFnKGZpZWxkLm5vLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpO1xuICAgICAgICB3cml0ZXIuZm9yaygpO1xuICAgICAgICAvLyBqYXZhc2NyaXB0IG9ubHkgYWxsb3dzIG51bWJlciBvciBzdHJpbmcgZm9yIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIHdlIGNvbnZlcnQgZnJvbSBvdXIgcmVwcmVzZW50YXRpb24gdG8gdGhlIHByb3RvYnVmIHR5cGVcbiAgICAgICAgbGV0IGtleVZhbHVlID0ga2V5O1xuICAgICAgICBzd2l0Y2ggKGZpZWxkLkspIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAga2V5VmFsdWUgPSBOdW1iZXIucGFyc2VJbnQoa2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGFzc2VydChrZXkgPT0gJ3RydWUnIHx8IGtleSA9PSAnZmFsc2UnKTtcbiAgICAgICAgICAgICAgICBrZXlWYWx1ZSA9IGtleSA9PSAndHJ1ZSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd3JpdGUga2V5LCBleHBlY3Rpbmcga2V5IGZpZWxkIG51bWJlciA9IDFcbiAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBmaWVsZC5LLCAxLCBrZXlWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgIC8vIHdyaXRlIHZhbHVlLCBleHBlY3RpbmcgdmFsdWUgZmllbGQgbnVtYmVyID0gMlxuICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIGZpZWxkLlYuVCwgMiwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBTY2FsYXJUeXBlLklOVDMyLCAyLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5WLlQoKSwgMiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5qb2luKCk7XG4gICAgfVxuICAgIG1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBoYW5kbGVyLCBmaWVsZE5vLCB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaGFuZGxlci5pbnRlcm5hbEJpbmFyeVdyaXRlKHZhbHVlLCB3cml0ZXIudGFnKGZpZWxkTm8sIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKTtcbiAgICAgICAgd3JpdGVyLmpvaW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBzaW5nbGUgc2NhbGFyIHZhbHVlLlxuICAgICAqL1xuICAgIHNjYWxhcih3cml0ZXIsIHR5cGUsIGZpZWxkTm8sIHZhbHVlLCBlbWl0RGVmYXVsdCkge1xuICAgICAgICBsZXQgW3dpcmVUeXBlLCBtZXRob2QsIGlzRGVmYXVsdF0gPSB0aGlzLnNjYWxhckluZm8odHlwZSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVmYXVsdCB8fCBlbWl0RGVmYXVsdCkge1xuICAgICAgICAgICAgd3JpdGVyLnRhZyhmaWVsZE5vLCB3aXJlVHlwZSk7XG4gICAgICAgICAgICB3cml0ZXJbbWV0aG9kXSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYW4gYXJyYXkgb2Ygc2NhbGFyIHZhbHVlcyBpbiBwYWNrZWQgZm9ybWF0LlxuICAgICAqL1xuICAgIHBhY2tlZCh3cml0ZXIsIHR5cGUsIGZpZWxkTm8sIHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBhc3NlcnQodHlwZSAhPT0gU2NhbGFyVHlwZS5CWVRFUyAmJiB0eXBlICE9PSBTY2FsYXJUeXBlLlNUUklORyk7XG4gICAgICAgIC8vIHdyaXRlIHRhZ1xuICAgICAgICB3cml0ZXIudGFnKGZpZWxkTm8sIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7XG4gICAgICAgIC8vIGJlZ2luIGxlbmd0aC1kZWxpbWl0ZWRcbiAgICAgICAgd3JpdGVyLmZvcmsoKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWVzIHdpdGhvdXQgdGFnc1xuICAgICAgICBsZXQgWywgbWV0aG9kLF0gPSB0aGlzLnNjYWxhckluZm8odHlwZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXJbbWV0aG9kXSh2YWx1ZVtpXSk7XG4gICAgICAgIC8vIGVuZCBsZW5ndGggZGVsaW1pdGVkXG4gICAgICAgIHdyaXRlci5qb2luKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBpbmZvcm1hdGlvbiBmb3Igd3JpdGluZyBhIHNjYWxhciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdHVwbGU6XG4gICAgICogWzBdOiBhcHByb3ByaWF0ZSBXaXJlVHlwZVxuICAgICAqIFsxXTogbmFtZSBvZiB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIG9mIElCaW5hcnlXcml0ZXJcbiAgICAgKiBbMl06IHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgZGVmYXVsdCB2YWx1ZVxuICAgICAqXG4gICAgICogSWYgYXJndW1lbnQgYHZhbHVlYCBpcyBvbWl0dGVkLCBbMl0gaXMgYWx3YXlzIGZhbHNlLlxuICAgICAqL1xuICAgIHNjYWxhckluZm8odHlwZSwgdmFsdWUpIHtcbiAgICAgICAgbGV0IHQgPSBXaXJlVHlwZS5WYXJpbnQ7XG4gICAgICAgIGxldCBtO1xuICAgICAgICBsZXQgaSA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkID0gdmFsdWUgPT09IDA7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIG0gPSBcImludDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8ICF2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDtcbiAgICAgICAgICAgICAgICBtID0gXCJzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGQgPSB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbSA9IFwiYm9vbFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICBtID0gXCJ1aW50MzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDY0O1xuICAgICAgICAgICAgICAgIG0gPSBcImRvdWJsZVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQzMjtcbiAgICAgICAgICAgICAgICBtID0gXCJmbG9hdFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8IFBiTG9uZy5mcm9tKHZhbHVlKS5pc1plcm8oKTtcbiAgICAgICAgICAgICAgICBtID0gXCJpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCBQYlVMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcInVpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJVTG9uZy5mcm9tKHZhbHVlKS5pc1plcm8oKTtcbiAgICAgICAgICAgICAgICB0ID0gV2lyZVR5cGUuQml0NjQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiZml4ZWQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8ICF2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiYnl0ZXNcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQzMjtcbiAgICAgICAgICAgICAgICBtID0gXCJmaXhlZDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDMyO1xuICAgICAgICAgICAgICAgIG0gPSBcInNmaXhlZDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQ2NDtcbiAgICAgICAgICAgICAgICBtID0gXCJzZml4ZWQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgICAgICBtID0gXCJzaW50MzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcInNpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdCwgbSwgaSB8fCBkXTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tc2NhbGFyLWRlZmF1bHRcIjtcbmltcG9ydCB7IE1FU1NBR0VfVFlQRSB9IGZyb20gJy4vbWVzc2FnZS10eXBlLWNvbnRyYWN0Jztcbi8qKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2VuZXJpYyBtZXNzYWdlLCB1c2luZyB0aGUgZmllbGRcbiAqIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdGlvbkNyZWF0ZSh0eXBlKSB7XG4gICAgLyoqXG4gICAgICogVGhpcyB0ZXJuYXJ5IGNhbiBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uXG4gICAgICogVGhlIGBPYmplY3QuY3JlYXRlKClgIGNvZGUgcGF0aCB1dGlsaXplcyBhIG5ldyBgbWVzc2FnZVByb3RvdHlwZWBcbiAgICAgKiBwcm9wZXJ0eSBvbiB0aGUgYElNZXNzYWdlVHlwZWAgd2hpY2ggaGFzIHRoaXMgc2FtZSBgTUVTU0FHRV9UWVBFYFxuICAgICAqIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIGl0LiBEb2luZyBpdCB0aGlzIHdheSBtZWFucyB0aGF0IHdlIG9ubHlcbiAgICAgKiBwYXkgdGhlIGNvc3Qgb2YgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYCBvbmNlIHBlciBgSU1lc3NhZ2VUeXBlYFxuICAgICAqIGNsYXNzIG9mIG9uY2UgcGVyIFwiaW5zdGFuY2VcIi4gVGhlIGZhbHN5IGNvZGUgcGF0aCBpcyBvbmx5IHByb3ZpZGVkXG4gICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGluIGNhc2VzIHdoZXJlIHRoZSBydW50aW1lIGxpYnJhcnkgaXNcbiAgICAgKiB1cGRhdGVkIHdpdGhvdXQgYWxzbyB1cGRhdGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4gICAgICovXG4gICAgY29uc3QgbXNnID0gdHlwZS5tZXNzYWdlUHJvdG90eXBlXG4gICAgICAgID8gT2JqZWN0LmNyZWF0ZSh0eXBlLm1lc3NhZ2VQcm90b3R5cGUpXG4gICAgICAgIDogT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCBNRVNTQUdFX1RZUEUsIHsgdmFsdWU6IHR5cGUgfSk7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgdHlwZS5maWVsZHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgIGlmIChmaWVsZC5vcHQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGZpZWxkLm9uZW9mKVxuICAgICAgICAgICAgbXNnW2ZpZWxkLm9uZW9mXSA9IHsgb25lb2ZLaW5kOiB1bmRlZmluZWQgfTtcbiAgICAgICAgZWxzZSBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgbXNnW25hbWVdID0gW107XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgbXNnW25hbWVdID0gcmVmbGVjdGlvblNjYWxhckRlZmF1bHQoZmllbGQuVCwgZmllbGQuTCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlcXVpcmUgMCB0byBiZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwgZW51bXNcbiAgICAgICAgICAgICAgICAgICAgbXNnW25hbWVdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICBtc2dbbmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtc2c7XG59XG4iLCJpbXBvcnQgeyBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0d28gbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGhhdmUgdGhlIHNhbWUgZmllbGQgdmFsdWVzLlxuICogQ2hlY2tzIGZvciBkZWVwIGVxdWFsaXR5LCB0cmF2ZXJzaW5nIHJlcGVhdGVkIGZpZWxkcywgb25lb2YgZ3JvdXBzLCBtYXBzXG4gKiBhbmQgbWVzc2FnZXMgcmVjdXJzaXZlbHkuXG4gKiBXaWxsIGFsc28gcmV0dXJuIHRydWUgaWYgYm90aCBtZXNzYWdlcyBhcmUgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0aW9uRXF1YWxzKGluZm8sIGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFhIHx8ICFiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgaW5mby5maWVsZHMpIHtcbiAgICAgICAgbGV0IGxvY2FsTmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgbGV0IHZhbF9hID0gZmllbGQub25lb2YgPyBhW2ZpZWxkLm9uZW9mXVtsb2NhbE5hbWVdIDogYVtsb2NhbE5hbWVdO1xuICAgICAgICBsZXQgdmFsX2IgPSBmaWVsZC5vbmVvZiA/IGJbZmllbGQub25lb2ZdW2xvY2FsTmFtZV0gOiBiW2xvY2FsTmFtZV07XG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGZpZWxkLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVDtcbiAgICAgICAgICAgICAgICBpZiAoIShmaWVsZC5yZXBlYXRcbiAgICAgICAgICAgICAgICAgICAgPyByZXBlYXRlZFByaW1pdGl2ZUVxKHQsIHZhbF9hLCB2YWxfYilcbiAgICAgICAgICAgICAgICAgICAgOiBwcmltaXRpdmVFcSh0LCB2YWxfYSwgdmFsX2IpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgIGlmICghKGZpZWxkLlYua2luZCA9PSBcIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA/IHJlcGVhdGVkTXNnRXEoZmllbGQuVi5UKCksIG9iamVjdFZhbHVlcyh2YWxfYSksIG9iamVjdFZhbHVlcyh2YWxfYikpXG4gICAgICAgICAgICAgICAgICAgIDogcmVwZWF0ZWRQcmltaXRpdmVFcShmaWVsZC5WLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVi5ULCBvYmplY3RWYWx1ZXModmFsX2EpLCBvYmplY3RWYWx1ZXModmFsX2IpKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZmllbGQucmVwZWF0XG4gICAgICAgICAgICAgICAgICAgID8gcmVwZWF0ZWRNc2dFcShULCB2YWxfYSwgdmFsX2IpXG4gICAgICAgICAgICAgICAgICAgIDogVC5lcXVhbHModmFsX2EsIHZhbF9iKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IG9iamVjdFZhbHVlcyA9IE9iamVjdC52YWx1ZXM7XG5mdW5jdGlvbiBwcmltaXRpdmVFcSh0eXBlLCBhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICh0eXBlICE9PSBTY2FsYXJUeXBlLkJZVEVTKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGJhID0gYTtcbiAgICBsZXQgYmIgPSBiO1xuICAgIGlmIChiYS5sZW5ndGggIT09IGJiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChiYVtpXSAhPSBiYltpXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlcGVhdGVkUHJpbWl0aXZlRXEodHlwZSwgYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghcHJpbWl0aXZlRXEodHlwZSwgYVtpXSwgYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXBlYXRlZE1zZ0VxKHR5cGUsIGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIXR5cGUuZXF1YWxzKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHsgbG93ZXJDYW1lbENhc2UgfSBmcm9tIFwiLi9sb3dlci1jYW1lbC1jYXNlXCI7XG4vKipcbiAqIFNjYWxhciB2YWx1ZSB0eXBlcy4gVGhpcyBpcyBhIHN1YnNldCBvZiBmaWVsZCB0eXBlcyBkZWNsYXJlZCBieSBwcm90b2J1ZlxuICogZW51bSBnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSBUaGUgdHlwZXMgR1JPVVAgYW5kIE1FU1NBR0VcbiAqIGFyZSBvbWl0dGVkLCBidXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgYXJlIGlkZW50aWNhbC5cbiAqL1xuZXhwb3J0IHZhciBTY2FsYXJUeXBlO1xuKGZ1bmN0aW9uIChTY2FsYXJUeXBlKSB7XG4gICAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzLlxuICAgIC8vIE9yZGVyIGlzIHdlaXJkIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiRE9VQkxFXCJdID0gMV0gPSBcIkRPVUJMRVwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkZMT0FUXCJdID0gMl0gPSBcIkZMT0FUXCI7XG4gICAgLy8gTm90IFppZ1phZyBlbmNvZGVkLiAgTmVnYXRpdmUgbnVtYmVycyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDY0IGlmXG4gICAgLy8gbmVnYXRpdmUgdmFsdWVzIGFyZSBsaWtlbHkuXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiSU5UNjRcIl0gPSAzXSA9IFwiSU5UNjRcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJVSU5UNjRcIl0gPSA0XSA9IFwiVUlOVDY0XCI7XG4gICAgLy8gTm90IFppZ1phZyBlbmNvZGVkLiAgTmVnYXRpdmUgbnVtYmVycyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDMyIGlmXG4gICAgLy8gbmVnYXRpdmUgdmFsdWVzIGFyZSBsaWtlbHkuXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiSU5UMzJcIl0gPSA1XSA9IFwiSU5UMzJcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJGSVhFRDY0XCJdID0gNl0gPSBcIkZJWEVENjRcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJGSVhFRDMyXCJdID0gN10gPSBcIkZJWEVEMzJcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJCT09MXCJdID0gOF0gPSBcIkJPT0xcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTVFJJTkdcIl0gPSA5XSA9IFwiU1RSSU5HXCI7XG4gICAgLy8gVGFnLWRlbGltaXRlZCBhZ2dyZWdhdGUuXG4gICAgLy8gR3JvdXAgdHlwZSBpcyBkZXByZWNhdGVkIGFuZCBub3Qgc3VwcG9ydGVkIGluIHByb3RvMy4gSG93ZXZlciwgUHJvdG8zXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIHBhcnNlIHRoZSBncm91cCB3aXJlIGZvcm1hdCBhbmRcbiAgICAvLyB0cmVhdCBncm91cCBmaWVsZHMgYXMgdW5rbm93biBmaWVsZHMuXG4gICAgLy8gVFlQRV9HUk9VUCA9IDEwLFxuICAgIC8vIFRZUEVfTUVTU0FHRSA9IDExLCAgLy8gTGVuZ3RoLWRlbGltaXRlZCBhZ2dyZWdhdGUuXG4gICAgLy8gTmV3IGluIHZlcnNpb24gMi5cbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJCWVRFU1wiXSA9IDEyXSA9IFwiQllURVNcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJVSU5UMzJcIl0gPSAxM10gPSBcIlVJTlQzMlwiO1xuICAgIC8vIFRZUEVfRU5VTSA9IDE0LFxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNGSVhFRDMyXCJdID0gMTVdID0gXCJTRklYRUQzMlwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNGSVhFRDY0XCJdID0gMTZdID0gXCJTRklYRUQ2NFwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNJTlQzMlwiXSA9IDE3XSA9IFwiU0lOVDMyXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU0lOVDY0XCJdID0gMThdID0gXCJTSU5UNjRcIjtcbn0pKFNjYWxhclR5cGUgfHwgKFNjYWxhclR5cGUgPSB7fSkpO1xuLyoqXG4gKiBKYXZhU2NyaXB0IHJlcHJlc2VudGF0aW9uIG9mIDY0IGJpdCBpbnRlZ3JhbCB0eXBlcy4gRXF1aXZhbGVudCB0byB0aGVcbiAqIGZpZWxkIG9wdGlvbiBcImpzdHlwZVwiLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHByb3RvYnVmLXRzIHJlcHJlc2VudHMgNjQgYml0IHR5cGVzIGFzIGBiaWdpbnRgLlxuICpcbiAqIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBieSBlbmFibGluZyB0aGUgcGx1Z2luIHBhcmFtZXRlclxuICogYGxvbmdfdHlwZV9zdHJpbmdgLCB3aGljaCB3aWxsIHJlcHJlc2VudCA2NCBiaXQgdHlwZXMgYXMgYHN0cmluZ2AuXG4gKlxuICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW91ciBmb3IgaW5kaXZpZHVhbCBmaWVsZHNcbiAqIHdpdGggdGhlIGZpZWxkIG9wdGlvbiBcImpzdHlwZVwiOlxuICpcbiAqIGBgYHByb3RvYnVmXG4gKiB1aW50NjQgbXlfZmllbGQgPSAxIFtqc3R5cGUgPSBKU19TVFJJTkddO1xuICogdWludDY0IG90aGVyX2ZpZWxkID0gMiBbanN0eXBlID0gSlNfTlVNQkVSXTtcbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIExvbmdUeXBlO1xuKGZ1bmN0aW9uIChMb25nVHlwZSkge1xuICAgIC8qKlxuICAgICAqIFVzZSBKYXZhU2NyaXB0IGBiaWdpbnRgLlxuICAgICAqXG4gICAgICogRmllbGQgb3B0aW9uIGBbanN0eXBlID0gSlNfTk9STUFMXWAuXG4gICAgICovXG4gICAgTG9uZ1R5cGVbTG9uZ1R5cGVbXCJCSUdJTlRcIl0gPSAwXSA9IFwiQklHSU5UXCI7XG4gICAgLyoqXG4gICAgICogVXNlIEphdmFTY3JpcHQgYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBGaWVsZCBvcHRpb24gYFtqc3R5cGUgPSBKU19TVFJJTkddYC5cbiAgICAgKi9cbiAgICBMb25nVHlwZVtMb25nVHlwZVtcIlNUUklOR1wiXSA9IDFdID0gXCJTVFJJTkdcIjtcbiAgICAvKipcbiAgICAgKiBVc2UgSmF2YVNjcmlwdCBgbnVtYmVyYC5cbiAgICAgKlxuICAgICAqIExhcmdlIHZhbHVlcyB3aWxsIGxvb3NlIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEZpZWxkIG9wdGlvbiBgW2pzdHlwZSA9IEpTX05VTUJFUl1gLlxuICAgICAqL1xuICAgIExvbmdUeXBlW0xvbmdUeXBlW1wiTlVNQkVSXCJdID0gMl0gPSBcIk5VTUJFUlwiO1xufSkoTG9uZ1R5cGUgfHwgKExvbmdUeXBlID0ge30pKTtcbi8qKlxuICogUHJvdG9idWYgMi4xLjAgaW50cm9kdWNlZCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzLlxuICogU2V0dGluZyB0aGUgZmllbGQgb3B0aW9uIGBbcGFja2VkID0gdHJ1ZV1gIGVuYWJsZXMgcGFja2luZy5cbiAqXG4gKiBJbiBwcm90bzMsIGFsbCByZXBlYXRlZCBmaWVsZHMgYXJlIHBhY2tlZCBieSBkZWZhdWx0LlxuICogU2V0dGluZyB0aGUgZmllbGQgb3B0aW9uIGBbcGFja2VkID0gZmFsc2VdYCBkaXNhYmxlcyBwYWNraW5nLlxuICpcbiAqIFBhY2tlZCByZXBlYXRlZCBmaWVsZHMgYXJlIGVuY29kZWQgd2l0aCBhIHNpbmdsZSB0YWcsXG4gKiB0aGVuIGEgbGVuZ3RoLWRlbGltaXRlciwgdGhlbiB0aGUgZWxlbWVudCB2YWx1ZXMuXG4gKlxuICogVW5wYWNrZWQgcmVwZWF0ZWQgZmllbGRzIGFyZSBlbmNvZGVkIHdpdGggYSB0YWcgYW5kXG4gKiB2YWx1ZSBmb3IgZWFjaCBlbGVtZW50LlxuICpcbiAqIGBieXRlc2AgYW5kIGBzdHJpbmdgIGNhbm5vdCBiZSBwYWNrZWQuXG4gKi9cbmV4cG9ydCB2YXIgUmVwZWF0VHlwZTtcbihmdW5jdGlvbiAoUmVwZWF0VHlwZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCBpcyBub3QgcmVwZWF0ZWQuXG4gICAgICovXG4gICAgUmVwZWF0VHlwZVtSZXBlYXRUeXBlW1wiTk9cIl0gPSAwXSA9IFwiTk9cIjtcbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGQgaXMgcmVwZWF0ZWQgYW5kIHNob3VsZCBiZSBwYWNrZWQuXG4gICAgICogSW52YWxpZCBmb3IgYGJ5dGVzYCBhbmQgYHN0cmluZ2AsIHRoZXkgY2Fubm90IGJlIHBhY2tlZC5cbiAgICAgKi9cbiAgICBSZXBlYXRUeXBlW1JlcGVhdFR5cGVbXCJQQUNLRURcIl0gPSAxXSA9IFwiUEFDS0VEXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIGlzIHJlcGVhdGVkIGJ1dCBzaG91bGQgbm90IGJlIHBhY2tlZC5cbiAgICAgKiBUaGUgb25seSB2YWxpZCByZXBlYXQgdHlwZSBmb3IgcmVwZWF0ZWQgYGJ5dGVzYCBhbmQgYHN0cmluZ2AuXG4gICAgICovXG4gICAgUmVwZWF0VHlwZVtSZXBlYXRUeXBlW1wiVU5QQUNLRURcIl0gPSAyXSA9IFwiVU5QQUNLRURcIjtcbn0pKFJlcGVhdFR5cGUgfHwgKFJlcGVhdFR5cGUgPSB7fSkpO1xuLyoqXG4gKiBUdXJucyBQYXJ0aWFsRmllbGRJbmZvIGludG8gRmllbGRJbmZvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmllbGRJbmZvKGZpZWxkKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIGZpZWxkLmxvY2FsTmFtZSA9IChfYSA9IGZpZWxkLmxvY2FsTmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbG93ZXJDYW1lbENhc2UoZmllbGQubmFtZSk7XG4gICAgZmllbGQuanNvbk5hbWUgPSAoX2IgPSBmaWVsZC5qc29uTmFtZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbG93ZXJDYW1lbENhc2UoZmllbGQubmFtZSk7XG4gICAgZmllbGQucmVwZWF0ID0gKF9jID0gZmllbGQucmVwZWF0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBSZXBlYXRUeXBlLk5PO1xuICAgIGZpZWxkLm9wdCA9IChfZCA9IGZpZWxkLm9wdCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogKGZpZWxkLnJlcGVhdCA/IGZhbHNlIDogZmllbGQub25lb2YgPyBmYWxzZSA6IGZpZWxkLmtpbmQgPT0gXCJtZXNzYWdlXCIpO1xuICAgIHJldHVybiBmaWVsZDtcbn1cbi8qKlxuICogUmVhZCBjdXN0b20gZmllbGQgb3B0aW9ucyBmcm9tIGEgZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCB1c2UgcmVhZEZpZWxkT3B0aW9uKClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWVsZE9wdGlvbnMobWVzc2FnZVR5cGUsIGZpZWxkTmFtZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvcHRpb25zID0gKF9hID0gbWVzc2FnZVR5cGUuZmllbGRzLmZpbmQoKG0sIGkpID0+IG0ubG9jYWxOYW1lID09IGZpZWxkTmFtZSB8fCBpID09IGZpZWxkTmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpb25zO1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0gPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0pIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWVsZE9wdGlvbihtZXNzYWdlVHlwZSwgZmllbGROYW1lLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoX2EgPSBtZXNzYWdlVHlwZS5maWVsZHMuZmluZCgobSwgaSkgPT4gbS5sb2NhbE5hbWUgPT0gZmllbGROYW1lIHx8IGkgPT0gZmllbGROYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9wdGlvbnM7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvblZhbCA9IG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV07XG4gICAgaWYgKG9wdGlvblZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWw7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25UeXBlID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25WYWwpIDogb3B0aW9uVmFsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNZXNzYWdlT3B0aW9uKG1lc3NhZ2VUeXBlLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG1lc3NhZ2VUeXBlLm9wdGlvbnM7XG4gICAgY29uc3Qgb3B0aW9uVmFsID0gb3B0aW9uc1tleHRlbnNpb25OYW1lXTtcbiAgICBpZiAob3B0aW9uVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvblZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuc2lvblR5cGUgPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvblZhbCkgOiBvcHRpb25WYWw7XG59XG4iLCJpbXBvcnQgeyBpc0pzb25PYmplY3QsIHR5cGVvZkpzb25WYWx1ZSB9IGZyb20gXCIuL2pzb24tdHlwaW5nc1wiO1xuaW1wb3J0IHsgYmFzZTY0ZGVjb2RlIH0gZnJvbSBcIi4vYmFzZTY0XCI7XG5pbXBvcnQgeyBMb25nVHlwZSwgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnRGbG9hdDMyLCBhc3NlcnRJbnQzMiwgYXNzZXJ0VUludDMyIH0gZnJvbSBcIi4vYXNzZXJ0XCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uTG9uZ0NvbnZlcnQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWxvbmctY29udmVydFwiO1xuLyoqXG4gKiBSZWFkcyBwcm90bzMgbWVzc2FnZXMgaW4gY2Fub25pY2FsIEpTT04gZm9ybWF0IHVzaW5nIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uSnNvblJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB0aGlzLmluZm8gPSBpbmZvO1xuICAgIH1cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmZNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5mTWFwID0ge307XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNJbnB1dCA9IChfYSA9IHRoaXMuaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNJbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZk1hcFtmaWVsZC5uYW1lXSA9IGZpZWxkO1xuICAgICAgICAgICAgICAgIHRoaXMuZk1hcFtmaWVsZC5qc29uTmFtZV0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICB0aGlzLmZNYXBbZmllbGQubG9jYWxOYW1lXSA9IGZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENhbm5vdCBwYXJzZSBKU09OIDx0eXBlIG9mIGpzb25WYWx1ZT4gZm9yIDx0eXBlIG5hbWU+IzxmaWVsZE5hbWU+LlxuICAgIGFzc2VydChjb25kaXRpb24sIGZpZWxkTmFtZSwganNvblZhbHVlKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICAgICAgICBsZXQgd2hhdCA9IHR5cGVvZkpzb25WYWx1ZShqc29uVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHdoYXQgPT0gXCJudW1iZXJcIiB8fCB3aGF0ID09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgIHdoYXQgPSBqc29uVmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIEpTT04gJHt3aGF0fSBmb3IgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGROYW1lfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgbWVzc2FnZSBmcm9tIGNhbm9uaWNhbCBKU09OIGZvcm1hdCBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFJlcGVhdGVkIGZpZWxkcyBhcmUgYXBwZW5kZWQuIE1hcCBlbnRyaWVzIGFyZSBhZGRlZCwgb3ZlcndyaXRpbmdcbiAgICAgKiBleGlzdGluZyBrZXlzLlxuICAgICAqXG4gICAgICogSWYgYSBtZXNzYWdlIGZpZWxkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGVcbiAgICAgKiBuZXcgZGF0YS5cbiAgICAgKi9cbiAgICByZWFkKGlucHV0LCBtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBjb25zdCBvbmVvZnNIYW5kbGVkID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2pzb25LZXksIGpzb25WYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZk1hcFtqc29uS2V5XTtcbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlVW5rbm93bkZpZWxkcylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCB1bmtub3duIGZpZWxkIHdoaWxlIHJlYWRpbmcgJHt0aGlzLmluZm8udHlwZU5hbWV9IGZyb20gSlNPTiBmb3JtYXQuIEpTT04ga2V5OiAke2pzb25LZXl9YCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsb2NhbE5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgICAgICAvLyBoYW5kbGUgb25lb2YgQURUXG4gICAgICAgICAgICBsZXQgdGFyZ2V0OyAvLyB0aGlzIHdpbGwgYmUgdGhlIHRhcmdldCBmb3IgdGhlIGZpZWxkIHZhbHVlLCB3aGV0aGVyIGl0IGlzIG1lbWJlciBvZiBhIG9uZW9mIG9yIG5vdFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbCAmJiAoZmllbGQua2luZCAhPT0gJ2VudW0nIHx8IGZpZWxkLlQoKVswXSAhPT0gJ2dvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gc2luY2UganNvbiBvYmplY3RzIGFyZSB1bm9yZGVyZWQgYnkgc3BlY2lmaWNhdGlvbiwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHRha2UgdGhlIGxhc3Qgb2YgbXVsdGlwbGUgb25lb2ZzXG4gICAgICAgICAgICAgICAgaWYgKG9uZW9mc0hhbmRsZWQuaW5jbHVkZXMoZmllbGQub25lb2YpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE11bHRpcGxlIG1lbWJlcnMgb2YgdGhlIG9uZW9mIGdyb3VwIFwiJHtmaWVsZC5vbmVvZn1cIiBvZiAke3RoaXMuaW5mby50eXBlTmFtZX0gYXJlIHByZXNlbnQgaW4gSlNPTi5gKTtcbiAgICAgICAgICAgICAgICBvbmVvZnNIYW5kbGVkLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IG1lc3NhZ2VbZmllbGQub25lb2ZdID0ge1xuICAgICAgICAgICAgICAgICAgICBvbmVvZktpbmQ6IGxvY2FsTmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBoYW5kbGVkIG9uZW9mIGFib3ZlLiB3ZSBqdXN0IGhhdmUgcmVhZCB0aGUgdmFsdWUgaW50byBgdGFyZ2V0YC5cbiAgICAgICAgICAgIGlmIChmaWVsZC5raW5kID09ICdtYXAnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5wdXRcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChpc0pzb25PYmplY3QoanNvblZhbHVlKSwgZmllbGQubmFtZSwganNvblZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBvdXIgdGFyZ2V0IHRvIHB1dCBtYXAgZW50cmllcyBpbnRvXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRPYmogPSB0YXJnZXRbbG9jYWxOYW1lXTtcbiAgICAgICAgICAgICAgICAvLyByZWFkIGVudHJpZXNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtqc29uT2JqS2V5LCBqc29uT2JqVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoanNvbk9ialZhbHVlICE9PSBudWxsLCBmaWVsZC5uYW1lICsgXCIgbWFwIHZhbHVlXCIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZWFkIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWw7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGZpZWxkLlYuVCgpLmludGVybmFsSnNvblJlYWQoanNvbk9ialZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5lbnVtKGZpZWxkLlYuVCgpLCBqc29uT2JqVmFsdWUsIGZpZWxkLm5hbWUsIG9wdGlvbnMuaWdub3JlVW5rbm93bkZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuc2NhbGFyKGpzb25PYmpWYWx1ZSwgZmllbGQuVi5ULCBmaWVsZC5WLkwsIGZpZWxkLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkLCBmaWVsZC5uYW1lICsgXCIgbWFwIHZhbHVlXCIsIGpzb25PYmpWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWQga2V5XG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBqc29uT2JqS2V5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSyA9PSBTY2FsYXJUeXBlLkJPT0wpXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkgPT0gXCJ0cnVlXCIgPyB0cnVlIDoga2V5ID09IFwiZmFsc2VcIiA/IGZhbHNlIDoga2V5O1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnNjYWxhcihrZXksIGZpZWxkLkssIExvbmdUeXBlLlNUUklORywgZmllbGQubmFtZSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmpba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5yZXBlYXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNvblZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpbnB1dFxuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoanNvblZhbHVlKSwgZmllbGQubmFtZSwganNvblZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBvdXIgdGFyZ2V0IHRvIHB1dCBhcnJheSBlbnRyaWVzIGludG9cbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEFyciA9IHRhcmdldFtsb2NhbE5hbWVdO1xuICAgICAgICAgICAgICAgIC8vIHJlYWQgYXJyYXkgZW50cmllc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QganNvbkl0ZW0gb2YganNvblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KGpzb25JdGVtICE9PSBudWxsLCBmaWVsZC5uYW1lLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGZpZWxkLlQoKS5pbnRlcm5hbEpzb25SZWFkKGpzb25JdGVtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5lbnVtKGZpZWxkLlQoKSwganNvbkl0ZW0sIGZpZWxkLm5hbWUsIG9wdGlvbnMuaWdub3JlVW5rbm93bkZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuc2NhbGFyKGpzb25JdGVtLCBmaWVsZC5ULCBmaWVsZC5MLCBmaWVsZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCwgZmllbGQubmFtZSwganNvblZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRBcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbCAmJiBmaWVsZC5UKCkudHlwZU5hbWUgIT0gJ2dvb2dsZS5wcm90b2J1Zi5WYWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChmaWVsZC5vbmVvZiA9PT0gdW5kZWZpbmVkLCBmaWVsZC5uYW1lICsgXCIgKG9uZW9mIG1lbWJlcilcIiwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IGZpZWxkLlQoKS5pbnRlcm5hbEpzb25SZWFkKGpzb25WYWx1ZSwgb3B0aW9ucywgdGFyZ2V0W2xvY2FsTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5lbnVtKGZpZWxkLlQoKSwganNvblZhbHVlLCBmaWVsZC5uYW1lLCBvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IHRoaXMuc2NhbGFyKGpzb25WYWx1ZSwgZmllbGQuVCwgZmllbGQuTCwgZmllbGQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgZmFsc2VgIGZvciB1bnJlY29nbml6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKlxuICAgICAqIGdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUgYWNjZXB0cyBvbmx5IEpTT04gYG51bGxgIChvciB0aGUgb2xkIGBcIk5VTExfVkFMVUVcImApLlxuICAgICAqL1xuICAgIGVudW0odHlwZSwganNvbiwgZmllbGROYW1lLCBpZ25vcmVVbmtub3duRmllbGRzKSB7XG4gICAgICAgIGlmICh0eXBlWzBdID09ICdnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlJylcbiAgICAgICAgICAgIGFzc2VydChqc29uID09PSBudWxsIHx8IGpzb24gPT09IFwiTlVMTF9WQUxVRVwiLCBgVW5hYmxlIHRvIHBhcnNlIGZpZWxkICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX0sIGVudW0gJHt0eXBlWzBdfSBvbmx5IGFjY2VwdHMgbnVsbC5gKTtcbiAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAvLyB3ZSByZXF1aXJlIDAgdG8gYmUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIGVudW1zXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgc3dpdGNoICh0eXBlb2YganNvbikge1xuICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgIGFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKGpzb24pLCBgVW5hYmxlIHRvIHBhcnNlIGZpZWxkICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX0sIGVudW0gY2FuIG9ubHkgYmUgaW50ZWdyYWwgbnVtYmVyLCBnb3QgJHtqc29ufS5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxFbnVtTmFtZSA9IGpzb247XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVbMl0gJiYganNvbi5zdWJzdHJpbmcoMCwgdHlwZVsyXS5sZW5ndGgpID09PSB0eXBlWzJdKVxuICAgICAgICAgICAgICAgICAgICAvLyBsb29rdXAgd2l0aG91dCB0aGUgc2hhcmVkIHByZWZpeFxuICAgICAgICAgICAgICAgICAgICBsb2NhbEVudW1OYW1lID0ganNvbi5zdWJzdHJpbmcodHlwZVsyXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGxldCBlbnVtTnVtYmVyID0gdHlwZVsxXVtsb2NhbEVudW1OYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVudW1OdW1iZXIgPT09ICd1bmRlZmluZWQnICYmIGlnbm9yZVVua25vd25GaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIGVudW1OdW1iZXIgPT0gXCJudW1iZXJcIiwgYFVuYWJsZSB0byBwYXJzZSBmaWVsZCAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9LCBlbnVtICR7dHlwZVswXX0gaGFzIG5vIHZhbHVlIGZvciBcIiR7anNvbn1cIi5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW51bU51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmFibGUgdG8gcGFyc2UgZmllbGQgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGROYW1lfSwgY2Fubm90IHBhcnNlIGVudW0gdmFsdWUgZnJvbSAke3R5cGVvZiBqc29ufVwiLmApO1xuICAgIH1cbiAgICBzY2FsYXIoanNvbiwgdHlwZSwgbG9uZ1R5cGUsIGZpZWxkTmFtZSkge1xuICAgICAgICBsZXQgZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0LCBkb3VibGU6IEpTT04gdmFsdWUgd2lsbCBiZSBhIG51bWJlciBvciBvbmUgb2YgdGhlIHNwZWNpYWwgc3RyaW5nIHZhbHVlcyBcIk5hTlwiLCBcIkluZmluaXR5XCIsIGFuZCBcIi1JbmZpbml0eVwiLlxuICAgICAgICAgICAgICAgIC8vIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLiBFeHBvbmVudCBub3RhdGlvbiBpcyBhbHNvIGFjY2VwdGVkLlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAuMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IFwiTmFOXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk5hTjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IFwiSW5maW5pdHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIi1JbmZpbml0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImVtcHR5IHN0cmluZ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uID09IFwic3RyaW5nXCIgJiYganNvbi50cmltKCkubGVuZ3RoICE9PSBqc29uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiZXh0cmEgd2hpdGVzcGFjZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9IFwic3RyaW5nXCIgJiYgdHlwZW9mIGpzb24gIT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZsb2F0ID0gTnVtYmVyKGpzb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGZsb2F0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwibm90IGEgbnVtYmVyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShmbG9hdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZmluaXR5IGFuZCAtaW5maW5pdHkgYXJlIGhhbmRsZWQgYnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFib3ZlLCBzbyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJ0b28gbGFyZ2Ugb3Igc21hbGxcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFNjYWxhclR5cGUuRkxPQVQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRGbG9hdDMyKGZsb2F0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0O1xuICAgICAgICAgICAgICAgIC8vIGludDMyLCBmaXhlZDMyLCB1aW50MzI6IEpTT04gdmFsdWUgd2lsbCBiZSBhIGRlY2ltYWwgbnVtYmVyLiBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludDMyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gPT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGludDMyID0ganNvbjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoanNvbiA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImVtcHR5IHN0cmluZ1wiO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YganNvbiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNvbi50cmltKCkubGVuZ3RoICE9PSBqc29uLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJleHRyYSB3aGl0ZXNwYWNlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgPSBOdW1iZXIoanNvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGludDMyID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU2NhbGFyVHlwZS5VSU5UMzIpXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRVSW50MzIoaW50MzIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJbnQzMihpbnQzMik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQzMjtcbiAgICAgICAgICAgICAgICAvLyBpbnQ2NCwgZml4ZWQ2NCwgdWludDY0OiBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIHN0cmluZy4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJMb25nLlpFUk8sIGxvbmdUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9IFwibnVtYmVyXCIgJiYgdHlwZW9mIGpzb24gIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiTG9uZy5mcm9tKGpzb24pLCBsb25nVHlwZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiVUxvbmcuWkVSTywgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT0gXCJudW1iZXJcIiAmJiB0eXBlb2YganNvbiAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJVTG9uZy5mcm9tKGpzb24pLCBsb25nVHlwZSk7XG4gICAgICAgICAgICAgICAgLy8gYm9vbDpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiZXh0cmEgd2hpdGVzcGFjZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChqc29uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiaW52YWxpZCBVVEY4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgICAgICAgICAvLyBieXRlczogSlNPTiB2YWx1ZSB3aWxsIGJlIHRoZSBkYXRhIGVuY29kZWQgYXMgYSBzdHJpbmcgdXNpbmcgc3RhbmRhcmQgYmFzZTY0IGVuY29kaW5nIHdpdGggcGFkZGluZ3MuXG4gICAgICAgICAgICAgICAgLy8gRWl0aGVyIHN0YW5kYXJkIG9yIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZyB3aXRoL3dpdGhvdXQgcGFkZGluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwgfHwganNvbiA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0ZGVjb2RlKGpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hc3NlcnQoZmFsc2UsIGZpZWxkTmFtZSArIChlID8gXCIgLSBcIiArIGUgOiBcIlwiKSwganNvbik7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgYmFzZTY0ZW5jb2RlIH0gZnJvbSBcIi4vYmFzZTY0XCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG5pbXBvcnQgeyBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydEZsb2F0MzIsIGFzc2VydEludDMyLCBhc3NlcnRVSW50MzIgfSBmcm9tIFwiLi9hc3NlcnRcIjtcbi8qKlxuICogV3JpdGVzIHByb3RvMyBtZXNzYWdlcyBpbiBjYW5vbmljYWwgSlNPTiBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvblxuICogaW5mb3JtYXRpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uSnNvbldyaXRlciB7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZmllbGRzID0gKF9hID0gaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgbWVzc2FnZSB0byBhIEpTT04gb2JqZWN0LCBiYXNlZCBvbiB0aGUgZmllbGQgZGVzY3JpcHRvcnMuXG4gICAgICovXG4gICAgd3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBqc29uID0ge30sIHNvdXJjZSA9IG1lc3NhZ2U7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgIC8vIGZpZWxkIGlzIG5vdCBwYXJ0IG9mIGEgb25lb2YsIHNpbXBseSB3cml0ZSBhcyBpc1xuICAgICAgICAgICAgaWYgKCFmaWVsZC5vbmVvZikge1xuICAgICAgICAgICAgICAgIGxldCBqc29uVmFsdWUgPSB0aGlzLmZpZWxkKGZpZWxkLCBzb3VyY2VbZmllbGQubG9jYWxOYW1lXSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBqc29uW29wdGlvbnMudXNlUHJvdG9GaWVsZE5hbWUgPyBmaWVsZC5uYW1lIDogZmllbGQuanNvbk5hbWVdID0ganNvblZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZmllbGQgaXMgcGFydCBvZiBhIG9uZW9mXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IHNvdXJjZVtmaWVsZC5vbmVvZl07XG4gICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kICE9PSBmaWVsZC5sb2NhbE5hbWUpXG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vdCBzZWxlY3RlZCwgc2tpcFxuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZmllbGQua2luZCA9PSAnc2NhbGFyJyB8fCBmaWVsZC5raW5kID09ICdlbnVtJ1xuICAgICAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBlbWl0RGVmYXVsdFZhbHVlczogdHJ1ZSB9KSA6IG9wdGlvbnM7XG4gICAgICAgICAgICBsZXQganNvblZhbHVlID0gdGhpcy5maWVsZChmaWVsZCwgZ3JvdXBbZmllbGQubG9jYWxOYW1lXSwgb3B0KTtcbiAgICAgICAgICAgIGFzc2VydChqc29uVmFsdWUgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBqc29uW29wdGlvbnMudXNlUHJvdG9GaWVsZE5hbWUgPyBmaWVsZC5uYW1lIDogZmllbGQuanNvbk5hbWVdID0ganNvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICBmaWVsZChmaWVsZCwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGpzb25WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGZpZWxkLmtpbmQgPT0gJ21hcCcpIHtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBqc29uT2JqID0ge307XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbZW50cnlLZXksIGVudHJ5VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5zY2FsYXIoZmllbGQuVi5ULCBlbnRyeVZhbHVlLCBmaWVsZC5uYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbk9ialtlbnRyeUtleS50b1N0cmluZygpXSA9IHZhbDsgLy8gSlNPTiBzdGFuZGFyZCBhbGxvd3Mgb25seSAoZG91YmxlIHF1b3RlZCkgc3RyaW5nIGFzIHByb3BlcnR5IGtleVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gZmllbGQuVi5UKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2VudHJ5S2V5LCBlbnRyeVZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubWVzc2FnZShtZXNzYWdlVHlwZSwgZW50cnlWYWx1ZSwgZmllbGQubmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbk9ialtlbnRyeUtleS50b1N0cmluZygpXSA9IHZhbDsgLy8gSlNPTiBzdGFuZGFyZCBhbGxvd3Mgb25seSAoZG91YmxlIHF1b3RlZCkgc3RyaW5nIGFzIHByb3BlcnR5IGtleVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW1JbmZvID0gZmllbGQuVi5UKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2VudHJ5S2V5LCBlbnRyeVZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChlbnRyeVZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGVudHJ5VmFsdWUgPT0gJ251bWJlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5lbnVtKGVudW1JbmZvLCBlbnRyeVZhbHVlLCBmaWVsZC5uYW1lLCBmYWxzZSwgdHJ1ZSwgb3B0aW9ucy5lbnVtQXNJbnRlZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqW2VudHJ5S2V5LnRvU3RyaW5nKCldID0gdmFsOyAvLyBKU09OIHN0YW5kYXJkIGFsbG93cyBvbmx5IChkb3VibGUgcXVvdGVkKSBzdHJpbmcgYXMgcHJvcGVydHkga2V5XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcyB8fCBPYmplY3Qua2V5cyhqc29uT2JqKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IGpzb25PYmo7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZmllbGQucmVwZWF0KSB7XG4gICAgICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh2YWx1ZSkpO1xuICAgICAgICAgICAgY29uc3QganNvbkFyciA9IFtdO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnNjYWxhcihmaWVsZC5ULCB2YWx1ZVtpXSwgZmllbGQubmFtZSwgZmllbGQub3B0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uQXJyLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtSW5mbyA9IGZpZWxkLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbHVlW2ldID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlW2ldID09ICdudW1iZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZW51bShlbnVtSW5mbywgdmFsdWVbaV0sIGZpZWxkLm5hbWUsIGZpZWxkLm9wdCwgdHJ1ZSwgb3B0aW9ucy5lbnVtQXNJbnRlZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uQXJyLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IGZpZWxkLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5tZXNzYWdlKG1lc3NhZ2VUeXBlLCB2YWx1ZVtpXSwgZmllbGQubmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbkFyci5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgY29udmVydGVkIGFycmF5IHRvIGpzb24gb3V0cHV0XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcyB8fCBqc29uQXJyLmxlbmd0aCA+IDAgfHwgb3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcylcbiAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSBqc29uQXJyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSB0aGlzLnNjYWxhcihmaWVsZC5ULCB2YWx1ZSwgZmllbGQubmFtZSwgZmllbGQub3B0LCBvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAganNvblZhbHVlID0gdGhpcy5lbnVtKGZpZWxkLlQoKSwgdmFsdWUsIGZpZWxkLm5hbWUsIGZpZWxkLm9wdCwgb3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcywgb3B0aW9ucy5lbnVtQXNJbnRlZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAganNvblZhbHVlID0gdGhpcy5tZXNzYWdlKGZpZWxkLlQoKSwgdmFsdWUsIGZpZWxkLm5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvblZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBudWxsYCBhcyB0aGUgZGVmYXVsdCBmb3IgZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZS5cbiAgICAgKi9cbiAgICBlbnVtKHR5cGUsIHZhbHVlLCBmaWVsZE5hbWUsIG9wdGlvbmFsLCBlbWl0RGVmYXVsdFZhbHVlcywgZW51bUFzSW50ZWdlcikge1xuICAgICAgICBpZiAodHlwZVswXSA9PSAnZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZScpXG4gICAgICAgICAgICByZXR1cm4gIWVtaXREZWZhdWx0VmFsdWVzICYmICFvcHRpb25hbCA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQob3B0aW9uYWwpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09IDAgJiYgIWVtaXREZWZhdWx0VmFsdWVzICYmICFvcHRpb25hbClcbiAgICAgICAgICAgIC8vIHdlIHJlcXVpcmUgMCB0byBiZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwgZW51bXNcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpO1xuICAgICAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpO1xuICAgICAgICBpZiAoZW51bUFzSW50ZWdlciB8fCAhdHlwZVsxXS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpXG4gICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBub3cgdGhlIGVudW0gdmFsdWUsIGp1c3QgcmV0dXJuIHRoZSBudW1iZXJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVbMl0pXG4gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBkcm9wcGVkIHByZWZpeFxuICAgICAgICAgICAgcmV0dXJuIHR5cGVbMl0gKyB0eXBlWzFdW3ZhbHVlXTtcbiAgICAgICAgcmV0dXJuIHR5cGVbMV1bdmFsdWVdO1xuICAgIH1cbiAgICBtZXNzYWdlKHR5cGUsIHZhbHVlLCBmaWVsZE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcyA/IG51bGwgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0eXBlLmludGVybmFsSnNvbldyaXRlKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgc2NhbGFyKHR5cGUsIHZhbHVlLCBmaWVsZE5hbWUsIG9wdGlvbmFsLCBlbWl0RGVmYXVsdFZhbHVlcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWQgPSBlbWl0RGVmYXVsdFZhbHVlcyB8fCBvcHRpb25hbDtcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEZhbGxUaHJvdWdoSW5Td2l0Y2hTdGF0ZW1lbnRKU1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIC8vIGludDMyLCBmaXhlZDMyLCB1aW50MzI6IEpTT04gdmFsdWUgd2lsbCBiZSBhIGRlY2ltYWwgbnVtYmVyLiBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydFVJbnQzMih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgLy8gZmxvYXQsIGRvdWJsZTogSlNPTiB2YWx1ZSB3aWxsIGJlIGEgbnVtYmVyIG9yIG9uZSBvZiB0aGUgc3BlY2lhbCBzdHJpbmcgdmFsdWVzIFwiTmFOXCIsIFwiSW5maW5pdHlcIiwgYW5kIFwiLUluZmluaXR5XCIuXG4gICAgICAgICAgICAvLyBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC4gRXhwb25lbnQgbm90YXRpb24gaXMgYWxzbyBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GTE9BVDpcbiAgICAgICAgICAgICAgICBhc3NlcnRGbG9hdDMyKHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpO1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05hTic7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnSW5maW5pdHknO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy1JbmZpbml0eSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgLy8gc3RyaW5nOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/ICcnIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGJvb2w6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdib29sZWFuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgLy8gSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBzdHJpbmcuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PSAnYmlnaW50Jyk7XG4gICAgICAgICAgICAgICAgbGV0IHVsb25nID0gUGJVTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodWxvbmcuaXNaZXJvKCkgJiYgIWVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bG9uZy50b1N0cmluZygpO1xuICAgICAgICAgICAgLy8gSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBzdHJpbmcuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDY0OlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQ2NDpcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT0gJ2JpZ2ludCcpO1xuICAgICAgICAgICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChsb25nLmlzWmVybygpICYmICFlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9uZy50b1N0cmluZygpO1xuICAgICAgICAgICAgLy8gYnl0ZXM6IEpTT04gdmFsdWUgd2lsbCBiZSB0aGUgZGF0YSBlbmNvZGVkIGFzIGEgc3RyaW5nIHVzaW5nIHN0YW5kYXJkIGJhc2U2NCBlbmNvZGluZyB3aXRoIHBhZGRpbmdzLlxuICAgICAgICAgICAgLy8gRWl0aGVyIHN0YW5kYXJkIG9yIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZyB3aXRoL3dpdGhvdXQgcGFkZGluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgICAgIGFzc2VydCh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gXCJcIiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0ZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IExvbmdUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG4vKipcbiAqIFV0aWxpdHkgbWV0aG9kIHRvIGNvbnZlcnQgYSBQYkxvbmcgb3IgUGJVbG9uZyB0byBhIEphdmFTY3JpcHRcbiAqIHJlcHJlc2VudGF0aW9uIGR1cmluZyBydW50aW1lLlxuICpcbiAqIFdvcmtzIHdpdGggZ2VuZXJhdGVkIGZpZWxkIGluZm9ybWF0aW9uLCBgdW5kZWZpbmVkYCBpcyBlcXVpdmFsZW50XG4gKiB0byBgU1RSSU5HYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25Mb25nQ29udmVydChsb25nLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgTG9uZ1R5cGUuQklHSU5UOlxuICAgICAgICAgICAgcmV0dXJuIGxvbmcudG9CaWdJbnQoKTtcbiAgICAgICAgY2FzZSBMb25nVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICByZXR1cm4gbG9uZy50b051bWJlcigpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAvLyBjYXNlIExvbmdUeXBlLlNUUklORzpcbiAgICAgICAgICAgIHJldHVybiBsb25nLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBDb3B5IHBhcnRpYWwgZGF0YSBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAqXG4gKiBJZiBhIHNpbmd1bGFyIHNjYWxhciBvciBlbnVtIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgaXRcbiAqIHJlcGxhY2VzIHRoZSBmaWVsZCBpbiB0aGUgdGFyZ2V0LlxuICpcbiAqIElmIGEgc2luZ3VsYXIgbWVzc2FnZSBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGl0IGlzIG1lcmdlZFxuICogd2l0aCB0aGUgdGFyZ2V0IGZpZWxkIGJ5IGNhbGxpbmcgbWVyZ2VQYXJ0aWFsKCkgb2YgdGhlIHJlc3BvbnNpYmxlXG4gKiBtZXNzYWdlIHR5cGUuXG4gKlxuICogSWYgYSByZXBlYXRlZCBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGl0cyB2YWx1ZXMgcmVwbGFjZVxuICogYWxsIHZhbHVlcyBpbiB0aGUgdGFyZ2V0IGFycmF5LCByZW1vdmluZyBleHRyYW5lb3VzIHZhbHVlcy5cbiAqIFJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGFyZSBjb3BpZWQsIG5vdCBtZXJnZWQuXG4gKlxuICogSWYgYSBtYXAgZmllbGQgaXMgcHJlc2VudCBpbiB0aGUgc291cmNlLCBlbnRyaWVzIGFyZSBhZGRlZCB0byB0aGVcbiAqIHRhcmdldCBtYXAsIHJlcGxhY2luZyBlbnRyaWVzIHdpdGggdGhlIHNhbWUga2V5LiBFbnRyaWVzIHRoYXQgb25seVxuICogZXhpc3QgaW4gdGhlIHRhcmdldCByZW1haW4uIEVudHJpZXMgd2l0aCBtZXNzYWdlIHZhbHVlcyBhcmUgY29waWVkLFxuICogbm90IG1lcmdlZC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gcHJvdG9idWYgbWVyZ2Ugc2VtYW50aWNzLFxuICogd2hpY2ggYXBwZW5kcyByZXBlYXRlZCBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKGluZm8sIHRhcmdldCwgc291cmNlKSB7XG4gICAgbGV0IGZpZWxkVmFsdWUsIC8vIHRoZSBmaWVsZCB2YWx1ZSB3ZSBhcmUgd29ya2luZyB3aXRoXG4gICAgaW5wdXQgPSBzb3VyY2UsIG91dHB1dDsgLy8gd2hlcmUgd2Ugd2FudCBvdXIgZmllbGQgdmFsdWUgdG8gZ29cbiAgICBmb3IgKGxldCBmaWVsZCBvZiBpbmZvLmZpZWxkcykge1xuICAgICAgICBsZXQgbmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IGlucHV0W2ZpZWxkLm9uZW9mXTsgLy8gdGhpcyBpcyB0aGUgb25lb2ZgcyBncm91cCBpbiB0aGUgc291cmNlXG4gICAgICAgICAgICBpZiAoKGdyb3VwID09PSBudWxsIHx8IGdyb3VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBncm91cC5vbmVvZktpbmQpID09IHVuZGVmaW5lZCkgeyAvLyB0aGUgdXNlciBpcyBmcmVlIHRvIG9taXRcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gd2Ugc2tpcCB0aGlzIGZpZWxkLCBhbmQgYWxsIG90aGVyIG1lbWJlcnMgdG9vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gZ3JvdXBbbmFtZV07IC8vIG91ciB2YWx1ZSBjb21lcyBmcm9tIHRoZSB0aGUgb25lb2YgZ3JvdXAgb2YgdGhlIHNvdXJjZVxuICAgICAgICAgICAgb3V0cHV0ID0gdGFyZ2V0W2ZpZWxkLm9uZW9mXTsgLy8gYW5kIG91ciBvdXRwdXQgaXMgdGhlIG9uZW9mIGdyb3VwIG9mIHRoZSB0YXJnZXRcbiAgICAgICAgICAgIG91dHB1dC5vbmVvZktpbmQgPSBncm91cC5vbmVvZktpbmQ7IC8vIGFsd2F5cyB1cGRhdGUgZGlzY3JpbWluYXRvclxuICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG91dHB1dFtuYW1lXTsgLy8gcmVtb3ZlIGFueSBleGlzdGluZyB2YWx1ZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIGZ1cnRoZXIgd29yayBvbiBmaWVsZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGlucHV0W25hbWVdOyAvLyB3ZSBhcmUgdXNpbmcgdGhlIHNvdXJjZSBkaXJlY3RseVxuICAgICAgICAgICAgb3V0cHV0ID0gdGFyZ2V0OyAvLyB3ZSB3YW50IG91ciBmaWVsZCB2YWx1ZSB0byBnbyBkaXJlY3RseSBpbnRvIHRoZSB0YXJnZXRcbiAgICAgICAgICAgIGlmIChmaWVsZFZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIGZ1cnRoZXIgd29yayBvbiBmaWVsZCwgZXhpc3RpbmcgdmFsdWUgaXMgdXNlZCBhcyBpc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC5yZXBlYXQpXG4gICAgICAgICAgICBvdXRwdXRbbmFtZV0ubGVuZ3RoID0gZmllbGRWYWx1ZS5sZW5ndGg7IC8vIHJlc2l6ZSB0YXJnZXQgYXJyYXkgdG8gbWF0Y2ggc291cmNlIGFycmF5XG4gICAgICAgIC8vIG5vdyB3ZSBqdXN0IHdvcmsgd2l0aCBgZmllbGRWYWx1ZWAgYW5kIGBvdXRwdXRgIHRvIG1lcmdlIHRoZSB2YWx1ZVxuICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZFZhbHVlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2ldID0gZmllbGRWYWx1ZVtpXTsgLy8gbm90IGEgcmVmZXJlbmNlIHR5cGVcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IGZpZWxkVmFsdWU7IC8vIG5vdCBhIHJlZmVyZW5jZSB0eXBlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgIGxldCBUID0gZmllbGQuVCgpO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5yZXBlYXQpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRWYWx1ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXVtpXSA9IFQuY3JlYXRlKGZpZWxkVmFsdWVbaV0pO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG91dHB1dFtuYW1lXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmFtZV0gPSBULmNyZWF0ZShmaWVsZFZhbHVlKTsgLy8gbm90aGluZyB0byBtZXJnZSB3aXRoXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBULm1lcmdlUGFydGlhbChvdXRwdXRbbmFtZV0sIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgIC8vIE1hcCBhbmQgcmVwZWF0ZWQgZmllbGRzIGFyZSBzaW1wbHkgb3ZlcndyaXR0ZW4sIG5vdCBhcHBlbmRlZCBvciBtZXJnZWRcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dFtuYW1lXSwgZmllbGRWYWx1ZSk7IC8vIGVsZW1lbnRzIGFyZSBub3QgcmVmZXJlbmNlIHR5cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBUID0gZmllbGQuVi5UKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrIG9mIE9iamVjdC5rZXlzKGZpZWxkVmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXVtrXSA9IFQuY3JlYXRlKGZpZWxkVmFsdWVba10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTG9uZ1R5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25Mb25nQ29udmVydCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tbG9uZy1jb252ZXJ0XCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG4vKipcbiAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgc2NhbGFyIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdCh0eXBlLCBsb25nVHlwZSA9IExvbmdUeXBlLlNUUklORykge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiVUxvbmcuWkVSTywgbG9uZ1R5cGUpO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UNjQ6XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQ2NDpcbiAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJMb25nLlpFUk8sIGxvbmdUeXBlKTtcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkRPVUJMRTpcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgcmV0dXJuIDAuMDtcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTG9uZ1R5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IGlzT25lb2ZHcm91cCB9IGZyb20gXCIuL29uZW9mXCI7XG4vLyBub2luc3BlY3Rpb24gSlNNZXRob2RDYW5CZVN0YXRpY1xuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25UeXBlQ2hlY2sge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IChfYSA9IGluZm8uZmllbGRzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgcmVxID0gW10sIGtub3duID0gW10sIG9uZW9mcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvbmVvZnMuaW5jbHVkZXMoZmllbGQub25lb2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uZW9mcy5wdXNoKGZpZWxkLm9uZW9mKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgICAgICBrbm93bi5wdXNoKGZpZWxkLm9uZW9mKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBrbm93bi5wdXNoKGZpZWxkLmxvY2FsTmFtZSk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQub3B0IHx8IGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEucHVzaChmaWVsZC5sb2NhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5wdXNoKGZpZWxkLmxvY2FsTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnB1c2goZmllbGQubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGEgPSB7IHJlcSwga25vd24sIG9uZW9mczogT2JqZWN0LnZhbHVlcyhvbmVvZnMpIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBhcmd1bWVudCBhIHZhbGlkIG1lc3NhZ2UgYXMgc3BlY2lmaWVkIGJ5IHRoZVxuICAgICAqIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24/XG4gICAgICpcbiAgICAgKiBDaGVja3MgYWxsIGZpZWxkIHR5cGVzIHJlY3Vyc2l2ZWx5LiBUaGUgYGRlcHRoYFxuICAgICAqIHNwZWNpZmllcyBob3cgZGVlcCBpbnRvIHRoZSBzdHJ1Y3R1cmUgdGhlIGNoZWNrIHdpbGwgYmUuXG4gICAgICpcbiAgICAgKiBXaXRoIGEgZGVwdGggb2YgMCwgb25seSB0aGUgcHJlc2VuY2Ugb2YgZmllbGRzXG4gICAgICogaXMgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIFdpdGggYSBkZXB0aCBvZiAxIG9yIG1vcmUsIHRoZSBmaWVsZCB0eXBlcyBhcmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIFdpdGggYSBkZXB0aCBvZiAyIG9yIG1vcmUsIHRoZSBtZW1iZXJzIG9mIG1hcCwgcmVwZWF0ZWRcbiAgICAgKiBhbmQgbWVzc2FnZSBmaWVsZHMgYXJlIGNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBNZXNzYWdlIGZpZWxkcyB3aWxsIGJlIGNoZWNrZWQgcmVjdXJzaXZlbHkgd2l0aCBkZXB0aCAtIDEuXG4gICAgICpcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1hcCBlbnRyaWVzIC8gcmVwZWF0ZWQgdmFsdWVzIGJlaW5nIGNoZWNrZWRcbiAgICAgKiBpcyA8IGRlcHRoLlxuICAgICAqL1xuICAgIGlzKG1lc3NhZ2UsIGRlcHRoLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAoZGVwdGggPCAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWVzc2FnZSAhPSAnb2JqZWN0JylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobWVzc2FnZSksIGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIC8vIGlmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZyBpbiBhcmcsIHRoaXMgY2Fubm90IGJlIGEgVFxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPCBkYXRhLnJlcS5sZW5ndGggfHwgZGF0YS5yZXEuc29tZShuID0+ICFrZXlzLmluY2x1ZGVzKG4pKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBhcmcgY29udGFpbnMgYSBrZXkgd2UgZG9udCBrbm93LCB0aGlzIGlzIG5vdCBhIGxpdGVyYWwgVFxuICAgICAgICAgICAgaWYgKGtleXMuc29tZShrID0+ICFkYXRhLmtub3duLmluY2x1ZGVzKGspKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gXCJXaXRoIGEgZGVwdGggb2YgMCwgb25seSB0aGUgcHJlc2VuY2UgYW5kIGFic2VuY2Ugb2YgZmllbGRzIGlzIGNoZWNrZWQuXCJcbiAgICAgICAgLy8gXCJXaXRoIGEgZGVwdGggb2YgMSBvciBtb3JlLCB0aGUgZmllbGQgdHlwZXMgYXJlIGNoZWNrZWQuXCJcbiAgICAgICAgaWYgKGRlcHRoIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgb25lb2YgZ3JvdXBcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIGRhdGEub25lb2ZzKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IG1lc3NhZ2VbbmFtZV07XG4gICAgICAgICAgICBpZiAoIWlzT25lb2ZHcm91cChncm91cCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGdyb3VwLm9uZW9mS2luZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5maW5kKGYgPT4gZi5sb2NhbE5hbWUgPT09IGdyb3VwLm9uZW9mS2luZCk7XG4gICAgICAgICAgICBpZiAoIWZpZWxkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2UgZm91bmQgbm8gZmllbGQsIGJ1dCBoYXZlIGEga2luZCwgc29tZXRoaW5nIGlzIHdyb25nXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmllbGQoZ3JvdXBbZ3JvdXAub25lb2ZLaW5kXSwgZmllbGQsIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB0eXBlc1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQub25lb2YgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWVsZChtZXNzYWdlW2ZpZWxkLmxvY2FsTmFtZV0sIGZpZWxkLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZpZWxkKGFyZywgZmllbGQsIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpIHtcbiAgICAgICAgbGV0IHJlcGVhdGVkID0gZmllbGQucmVwZWF0O1xuICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBpZiAoYXJnID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC5vcHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGFyZywgZmllbGQuVCwgZGVwdGgsIGZpZWxkLkwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcihhcmcsIGZpZWxkLlQsIGZpZWxkLkwpO1xuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICBpZiAoYXJnID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC5vcHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGFyZywgU2NhbGFyVHlwZS5JTlQzMiwgZGVwdGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcihhcmcsIFNjYWxhclR5cGUuSU5UMzIpO1xuICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICBpZiAoYXJnID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZXMoYXJnLCBmaWVsZC5UKCksIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2UoYXJnLCBmaWVsZC5UKCksIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpO1xuICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9ICdvYmplY3QnIHx8IGFyZyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8IDIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXBLZXlzKGFyZywgZmllbGQuSywgZGVwdGgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFycyhPYmplY3QudmFsdWVzKGFyZyksIGZpZWxkLlYuVCwgZGVwdGgsIGZpZWxkLlYuTCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKE9iamVjdC52YWx1ZXMoYXJnKSwgU2NhbGFyVHlwZS5JTlQzMiwgZGVwdGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZXMoT2JqZWN0LnZhbHVlcyhhcmcpLCBmaWVsZC5WLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBtZXNzYWdlKGFyZywgdHlwZSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkge1xuICAgICAgICBpZiAoYWxsb3dFeGNlc3NQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5pc0Fzc2lnbmFibGUoYXJnLCBkZXB0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGUuaXMoYXJnLCBkZXB0aCk7XG4gICAgfVxuICAgIG1lc3NhZ2VzKGFyZywgdHlwZSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRlcHRoIDwgMilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoYWxsb3dFeGNlc3NQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZy5sZW5ndGggJiYgaSA8IGRlcHRoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzQXNzaWduYWJsZShhcmdbaV0sIGRlcHRoIC0gMSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnLmxlbmd0aCAmJiBpIDwgZGVwdGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXMoYXJnW2ldLCBkZXB0aCAtIDEpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNjYWxhcihhcmcsIHR5cGUsIGxvbmdUeXBlKSB7XG4gICAgICAgIGxldCBhcmdUeXBlID0gdHlwZW9mIGFyZztcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UNjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgIHN3aXRjaCAobG9uZ1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBMb25nVHlwZS5CSUdJTlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSBcImJpZ2ludFwiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExvbmdUeXBlLk5VTUJFUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwibnVtYmVyXCIgJiYgIWlzTmFOKGFyZyk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSBcInN0cmluZ1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09ICdib29sZWFuJztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ3N0cmluZyc7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09ICdudW1iZXInICYmICFpc05hTihhcmcpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGFyZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2NhbGFycyhhcmcsIHR5cGUsIGRlcHRoLCBsb25nVHlwZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRlcHRoIDwgMilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmcubGVuZ3RoICYmIGkgPCBkZXB0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2FsYXIoYXJnW2ldLCB0eXBlLCBsb25nVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1hcEtleXMobWFwLCB0eXBlLCBkZXB0aCkge1xuICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG1hcCk7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGtleXMuc2xpY2UoMCwgZGVwdGgpLm1hcChrID0+IHBhcnNlSW50KGspKSwgdHlwZSwgZGVwdGgpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFycyhrZXlzLnNsaWNlKDAsIGRlcHRoKS5tYXAoayA9PiBrID09ICd0cnVlJyA/IHRydWUgOiBrID09ICdmYWxzZScgPyBmYWxzZSA6IGspLCB0eXBlLCBkZXB0aCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoa2V5cywgdHlwZSwgZGVwdGgsIExvbmdUeXBlLlNUUklORyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1aXJlZEFyZ3MocmVxdWlyZWQsIGFyZ3MpIHtcbiAgaWYgKGFyZ3MubGVuZ3RoIDwgcmVxdWlyZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHJlcXVpcmVkICsgJyBhcmd1bWVudCcgKyAocmVxdWlyZWQgPiAxID8gJ3MnIDogJycpICsgJyByZXF1aXJlZCwgYnV0IG9ubHkgJyArIGFyZ3MubGVuZ3RoICsgJyBwcmVzZW50Jyk7XG4gIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0ludGVnZXIoZGlydHlOdW1iZXIpIHtcbiAgaWYgKGRpcnR5TnVtYmVyID09PSBudWxsIHx8IGRpcnR5TnVtYmVyID09PSB0cnVlIHx8IGRpcnR5TnVtYmVyID09PSBmYWxzZSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cbiAgdmFyIG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG4gIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuICByZXR1cm4gbnVtYmVyIDwgMCA/IE1hdGguY2VpbChudW1iZXIpIDogTWF0aC5mbG9vcihudW1iZXIpO1xufSIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGFkZE1pbGxpc2Vjb25kc1xuICogQGNhdGVnb3J5IE1pbGxpc2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbWlsbGlzZWNvbmRzIGFkZGVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA3NTAgbWlsbGlzZWNvbmRzIHRvIDEwIEp1bHkgMjAxNCAxMjo0NTozMC4wMDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNaWxsaXNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMzAsIDApLCA3NTApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NTozMC43NTBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkTWlsbGlzZWNvbmRzKGRpcnR5RGF0ZSwgZGlydHlBbW91bnQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciB0aW1lc3RhbXAgPSB0b0RhdGUoZGlydHlEYXRlKS5nZXRUaW1lKCk7XG4gIHZhciBhbW91bnQgPSB0b0ludGVnZXIoZGlydHlBbW91bnQpO1xuICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wICsgYW1vdW50KTtcbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IGFkZE1pbGxpc2Vjb25kcyBmcm9tIFwiLi4vYWRkTWlsbGlzZWNvbmRzL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBhZGRTZWNvbmRzXG4gKiBAY2F0ZWdvcnkgU2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBhbW91bnQgLSB0aGUgYW1vdW50IG9mIHNlY29uZHMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgc2Vjb25kcyBhZGRlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMzAgc2Vjb25kcyB0byAxMCBKdWx5IDIwMTQgMTI6NDU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRTZWNvbmRzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAxMiwgNDUsIDApLCAzMClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZFNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBhbW91bnQgKiAxMDAwKTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzQmVmb3JlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYmVmb3JlIHRoZSBvdGhlciBvbmUgdG8gcmV0dXJuIHRydWVcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVUb0NvbXBhcmUgLSB0aGUgZGF0ZSB0byBjb21wYXJlIHdpdGhcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZmlyc3QgZGF0ZSBpcyBiZWZvcmUgdGhlIHNlY29uZCBkYXRlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElzIDEwIEp1bHkgMTk4OSBiZWZvcmUgMTEgRmVicnVhcnkgMTk4Nz9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzQmVmb3JlKG5ldyBEYXRlKDE5ODksIDYsIDEwKSwgbmV3IERhdGUoMTk4NywgMSwgMTEpKVxuICogLy89PiBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0JlZm9yZShkaXJ0eURhdGUsIGRpcnR5RGF0ZVRvQ29tcGFyZSkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRhdGVUb0NvbXBhcmUgPSB0b0RhdGUoZGlydHlEYXRlVG9Db21wYXJlKTtcbiAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpIDwgZGF0ZVRvQ29tcGFyZS5nZXRUaW1lKCk7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgdG9EYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdHMgY2xvbmUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgbnVtYmVyLCBpdCBpcyB0cmVhdGVkIGFzIGEgdGltZXN0YW1wLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBub25lIG9mIHRoZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGFyZ3VtZW50IC0gdGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgcGFyc2VkIGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZVxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBhcmdTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpO1xuXG4gIC8vIENsb25lIHRoZSBkYXRlXG4gIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIERhdGUgfHwgX3R5cGVvZihhcmd1bWVudCkgPT09ICdvYmplY3QnICYmIGFyZ1N0ciA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgLy8gUHJldmVudCB0aGUgZGF0ZSB0byBsb3NlIHRoZSBtaWxsaXNlY29uZHMgd2hlbiBwYXNzZWQgdG8gbmV3IERhdGUoKSBpbiBJRTEwXG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50LmdldFRpbWUoKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnbnVtYmVyJyB8fCBhcmdTdHIgPT09ICdbb2JqZWN0IE51bWJlcl0nKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycgfHwgYXJnU3RyID09PSAnW29iamVjdCBTdHJpbmddJykgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFwiU3RhcnRpbmcgd2l0aCB2Mi4wLjAtYmV0YS4xIGRhdGUtZm5zIGRvZXNuJ3QgYWNjZXB0IHN0cmluZ3MgYXMgZGF0ZSBhcmd1bWVudHMuIFBsZWFzZSB1c2UgYHBhcnNlSVNPYCB0byBwYXJzZSBzdHJpbmdzLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNzdHJpbmctYXJndW1lbnRzXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihuZXcgRXJyb3IoKS5zdGFjayk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG59IiwiLyogZXNsaW50LWRpc2FibGUgbm8tdmFyLCBwcmVmZXItdGVtcGxhdGUgKi9cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gL1tBLVpdL2dcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS9cbnZhciBjYWNoZSA9IHt9XG5cbmZ1bmN0aW9uIHRvSHlwaGVuTG93ZXIobWF0Y2gpIHtcbiAgcmV0dXJuICctJyArIG1hdGNoLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKG5hbWUpIHtcbiAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgcmV0dXJuIGNhY2hlW25hbWVdXG4gIH1cblxuICB2YXIgaE5hbWUgPSBuYW1lLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgdG9IeXBoZW5Mb3dlcilcbiAgcmV0dXJuIChjYWNoZVtuYW1lXSA9IG1zUGF0dGVybi50ZXN0KGhOYW1lKSA/ICctJyArIGhOYW1lIDogaE5hbWUpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGh5cGhlbmF0ZVN0eWxlTmFtZVxuIiwidmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnQgdmFyIGlzQnJvd3NlciA9ICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yod2luZG93KSkgPT09IFwib2JqZWN0XCIgJiYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKGRvY3VtZW50KSkgPT09ICdvYmplY3QnICYmIGRvY3VtZW50Lm5vZGVUeXBlID09PSA5O1xuXG5leHBvcnQgZGVmYXVsdCBpc0Jyb3dzZXI7XG4iLCJpbXBvcnQgaHlwaGVuYXRlIGZyb20gJ2h5cGhlbmF0ZS1zdHlsZS1uYW1lJztcblxuLyoqXG4gKiBDb252ZXJ0IGNhbWVsIGNhc2VkIHByb3BlcnR5IG5hbWVzIHRvIGRhc2ggc2VwYXJhdGVkLlxuICovXG5cbmZ1bmN0aW9uIGNvbnZlcnRDYXNlKHN0eWxlKSB7XG4gIHZhciBjb252ZXJ0ZWQgPSB7fTtcblxuICBmb3IgKHZhciBwcm9wIGluIHN0eWxlKSB7XG4gICAgdmFyIGtleSA9IHByb3AuaW5kZXhPZignLS0nKSA9PT0gMCA/IHByb3AgOiBoeXBoZW5hdGUocHJvcCk7XG4gICAgY29udmVydGVkW2tleV0gPSBzdHlsZVtwcm9wXTtcbiAgfVxuXG4gIGlmIChzdHlsZS5mYWxsYmFja3MpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5mYWxsYmFja3MpKSBjb252ZXJ0ZWQuZmFsbGJhY2tzID0gc3R5bGUuZmFsbGJhY2tzLm1hcChjb252ZXJ0Q2FzZSk7ZWxzZSBjb252ZXJ0ZWQuZmFsbGJhY2tzID0gY29udmVydENhc2Uoc3R5bGUuZmFsbGJhY2tzKTtcbiAgfVxuXG4gIHJldHVybiBjb252ZXJ0ZWQ7XG59XG4vKipcbiAqIEFsbG93IGNhbWVsIGNhc2VkIHByb3BlcnR5IG5hbWVzIGJ5IGNvbnZlcnRpbmcgdGhlbSBiYWNrIHRvIGRhc2hlcml6ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBjYW1lbENhc2UoKSB7XG4gIGZ1bmN0aW9uIG9uUHJvY2Vzc1N0eWxlKHN0eWxlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUpKSB7XG4gICAgICAvLyBIYW5kbGUgcnVsZXMgbGlrZSBAZm9udC1mYWNlLCB3aGljaCBjYW4gaGF2ZSBtdWx0aXBsZSBzdHlsZXMgaW4gYW4gYXJyYXlcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdHlsZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgc3R5bGVbaW5kZXhdID0gY29udmVydENhc2Uoc3R5bGVbaW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0Q2FzZShzdHlsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkNoYW5nZVZhbHVlKHZhbHVlLCBwcm9wLCBydWxlKSB7XG4gICAgaWYgKHByb3AuaW5kZXhPZignLS0nKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHZhciBoeXBoZW5hdGVkUHJvcCA9IGh5cGhlbmF0ZShwcm9wKTsgLy8gVGhlcmUgd2FzIG5vIGNhbWVsIGNhc2UgaW4gcGxhY2VcblxuICAgIGlmIChwcm9wID09PSBoeXBoZW5hdGVkUHJvcCkgcmV0dXJuIHZhbHVlO1xuICAgIHJ1bGUucHJvcChoeXBoZW5hdGVkUHJvcCwgdmFsdWUpOyAvLyBDb3JlIHdpbGwgaWdub3JlIHRoYXQgcHJvcGVydHkgdmFsdWUgd2Ugc2V0IHRoZSBwcm9wZXIgb25lIGFib3ZlLlxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9uUHJvY2Vzc1N0eWxlOiBvblByb2Nlc3NTdHlsZSxcbiAgICBvbkNoYW5nZVZhbHVlOiBvbkNoYW5nZVZhbHVlXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhbWVsQ2FzZTtcbiIsImltcG9ydCBfZXh0ZW5kcyBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzJztcbmltcG9ydCB7IFJ1bGVMaXN0IH0gZnJvbSAnanNzJztcblxudmFyIGF0ID0gJ0BnbG9iYWwnO1xudmFyIGF0UHJlZml4ID0gJ0BnbG9iYWwgJztcblxudmFyIEdsb2JhbENvbnRhaW5lclJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbG9iYWxDb250YWluZXJSdWxlKGtleSwgc3R5bGVzLCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlID0gJ2dsb2JhbCc7XG4gICAgdGhpcy5hdCA9IGF0O1xuICAgIHRoaXMuaXNQcm9jZXNzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMucnVsZXMgPSBuZXcgUnVsZUxpc3QoX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIHBhcmVudDogdGhpc1xuICAgIH0pKTtcblxuICAgIGZvciAodmFyIHNlbGVjdG9yIGluIHN0eWxlcykge1xuICAgICAgdGhpcy5ydWxlcy5hZGQoc2VsZWN0b3IsIHN0eWxlc1tzZWxlY3Rvcl0pO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMucHJvY2VzcygpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgYSBydWxlLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBHbG9iYWxDb250YWluZXJSdWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0UnVsZSA9IGZ1bmN0aW9uIGdldFJ1bGUobmFtZSkge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLmdldChuYW1lKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGFuZCByZWdpc3RlciBydWxlLCBydW4gcGx1Z2lucy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uYWRkUnVsZSA9IGZ1bmN0aW9uIGFkZFJ1bGUobmFtZSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgcnVsZSA9IHRoaXMucnVsZXMuYWRkKG5hbWUsIHN0eWxlLCBvcHRpb25zKTtcbiAgICBpZiAocnVsZSkgdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUocnVsZSk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cbiAgLyoqXG4gICAqIFJlcGxhY2UgcnVsZSwgcnVuIHBsdWdpbnMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlcGxhY2VSdWxlID0gZnVuY3Rpb24gcmVwbGFjZVJ1bGUobmFtZSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgbmV3UnVsZSA9IHRoaXMucnVsZXMucmVwbGFjZShuYW1lLCBzdHlsZSwgb3B0aW9ucyk7XG4gICAgaWYgKG5ld1J1bGUpIHRoaXMub3B0aW9ucy5qc3MucGx1Z2lucy5vblByb2Nlc3NSdWxlKG5ld1J1bGUpO1xuICAgIHJldHVybiBuZXdSdWxlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgaW5kZXggb2YgYSBydWxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZihydWxlKSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZXMuaW5kZXhPZihydWxlKTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQ1NTIHN0cmluZy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZXMudG9TdHJpbmcob3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIEdsb2JhbENvbnRhaW5lclJ1bGU7XG59KCk7XG5cbnZhciBHbG9iYWxQcmVmaXhlZFJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbG9iYWxQcmVmaXhlZFJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICdnbG9iYWwnO1xuICAgIHRoaXMuYXQgPSBhdDtcbiAgICB0aGlzLmlzUHJvY2Vzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB2YXIgc2VsZWN0b3IgPSBrZXkuc3Vic3RyKGF0UHJlZml4Lmxlbmd0aCk7XG4gICAgdGhpcy5ydWxlID0gb3B0aW9ucy5qc3MuY3JlYXRlUnVsZShzZWxlY3Rvciwgc3R5bGUsIF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBwYXJlbnQ6IHRoaXNcbiAgICB9KSk7XG4gIH1cblxuICB2YXIgX3Byb3RvMiA9IEdsb2JhbFByZWZpeGVkUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMi50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlID8gdGhpcy5ydWxlLnRvU3RyaW5nKG9wdGlvbnMpIDogJyc7XG4gIH07XG5cbiAgcmV0dXJuIEdsb2JhbFByZWZpeGVkUnVsZTtcbn0oKTtcblxudmFyIHNlcGFyYXRvclJlZ0V4cCA9IC9cXHMqLFxccyovZztcblxuZnVuY3Rpb24gYWRkU2NvcGUoc2VsZWN0b3IsIHNjb3BlKSB7XG4gIHZhciBwYXJ0cyA9IHNlbGVjdG9yLnNwbGl0KHNlcGFyYXRvclJlZ0V4cCk7XG4gIHZhciBzY29wZWQgPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgc2NvcGVkICs9IHNjb3BlICsgXCIgXCIgKyBwYXJ0c1tpXS50cmltKCk7XG4gICAgaWYgKHBhcnRzW2kgKyAxXSkgc2NvcGVkICs9ICcsICc7XG4gIH1cblxuICByZXR1cm4gc2NvcGVkO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVOZXN0ZWRHbG9iYWxDb250YWluZXJSdWxlKHJ1bGUsIHNoZWV0KSB7XG4gIHZhciBvcHRpb25zID0gcnVsZS5vcHRpb25zLFxuICAgICAgc3R5bGUgPSBydWxlLnN0eWxlO1xuICB2YXIgcnVsZXMgPSBzdHlsZSA/IHN0eWxlW2F0XSA6IG51bGw7XG4gIGlmICghcnVsZXMpIHJldHVybjtcblxuICBmb3IgKHZhciBuYW1lIGluIHJ1bGVzKSB7XG4gICAgc2hlZXQuYWRkUnVsZShuYW1lLCBydWxlc1tuYW1lXSwgX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIHNlbGVjdG9yOiBhZGRTY29wZShuYW1lLCBydWxlLnNlbGVjdG9yKVxuICAgIH0pKTtcbiAgfVxuXG4gIGRlbGV0ZSBzdHlsZVthdF07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVByZWZpeGVkR2xvYmFsUnVsZShydWxlLCBzaGVldCkge1xuICB2YXIgb3B0aW9ucyA9IHJ1bGUub3B0aW9ucyxcbiAgICAgIHN0eWxlID0gcnVsZS5zdHlsZTtcblxuICBmb3IgKHZhciBwcm9wIGluIHN0eWxlKSB7XG4gICAgaWYgKHByb3BbMF0gIT09ICdAJyB8fCBwcm9wLnN1YnN0cigwLCBhdC5sZW5ndGgpICE9PSBhdCkgY29udGludWU7XG4gICAgdmFyIHNlbGVjdG9yID0gYWRkU2NvcGUocHJvcC5zdWJzdHIoYXQubGVuZ3RoKSwgcnVsZS5zZWxlY3Rvcik7XG4gICAgc2hlZXQuYWRkUnVsZShzZWxlY3Rvciwgc3R5bGVbcHJvcF0sIF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3JcbiAgICB9KSk7XG4gICAgZGVsZXRlIHN0eWxlW3Byb3BdO1xuICB9XG59XG4vKipcbiAqIENvbnZlcnQgbmVzdGVkIHJ1bGVzIHRvIHNlcGFyYXRlLCByZW1vdmUgdGhlbSBmcm9tIG9yaWdpbmFsIHN0eWxlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGpzc0dsb2JhbCgpIHtcbiAgZnVuY3Rpb24gb25DcmVhdGVSdWxlKG5hbWUsIHN0eWxlcywgb3B0aW9ucykge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAobmFtZSA9PT0gYXQpIHtcbiAgICAgIHJldHVybiBuZXcgR2xvYmFsQ29udGFpbmVyUnVsZShuYW1lLCBzdHlsZXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChuYW1lWzBdID09PSAnQCcgJiYgbmFtZS5zdWJzdHIoMCwgYXRQcmVmaXgubGVuZ3RoKSA9PT0gYXRQcmVmaXgpIHtcbiAgICAgIHJldHVybiBuZXcgR2xvYmFsUHJlZml4ZWRSdWxlKG5hbWUsIHN0eWxlcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgaWYgKHBhcmVudC50eXBlID09PSAnZ2xvYmFsJyB8fCBwYXJlbnQub3B0aW9ucy5wYXJlbnQgJiYgcGFyZW50Lm9wdGlvbnMucGFyZW50LnR5cGUgPT09ICdnbG9iYWwnKSB7XG4gICAgICAgIG9wdGlvbnMuc2NvcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnNlbGVjdG9yICYmIG9wdGlvbnMuc2NvcGVkID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5zZWxlY3RvciA9IG5hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBvblByb2Nlc3NSdWxlKHJ1bGUsIHNoZWV0KSB7XG4gICAgaWYgKHJ1bGUudHlwZSAhPT0gJ3N0eWxlJyB8fCAhc2hlZXQpIHJldHVybjtcbiAgICBoYW5kbGVOZXN0ZWRHbG9iYWxDb250YWluZXJSdWxlKHJ1bGUsIHNoZWV0KTtcbiAgICBoYW5kbGVQcmVmaXhlZEdsb2JhbFJ1bGUocnVsZSwgc2hlZXQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbkNyZWF0ZVJ1bGU6IG9uQ3JlYXRlUnVsZSxcbiAgICBvblByb2Nlc3NSdWxlOiBvblByb2Nlc3NSdWxlXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGpzc0dsb2JhbDtcbiIsImltcG9ydCBfZXh0ZW5kcyBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzJztcbmltcG9ydCBpc0luQnJvd3NlciBmcm9tICdpcy1pbi1icm93c2VyJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3Rpbnktd2FybmluZyc7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzJztcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlJztcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZCc7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSc7XG5cbnZhciBwbGFpbk9iamVjdENvbnN0cnVyY3RvciA9IHt9LmNvbnN0cnVjdG9yO1xuZnVuY3Rpb24gY2xvbmVTdHlsZShzdHlsZSkge1xuICBpZiAoc3R5bGUgPT0gbnVsbCB8fCB0eXBlb2Ygc3R5bGUgIT09ICdvYmplY3QnKSByZXR1cm4gc3R5bGU7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0eWxlKSkgcmV0dXJuIHN0eWxlLm1hcChjbG9uZVN0eWxlKTtcbiAgaWYgKHN0eWxlLmNvbnN0cnVjdG9yICE9PSBwbGFpbk9iamVjdENvbnN0cnVyY3RvcikgcmV0dXJuIHN0eWxlO1xuICB2YXIgbmV3U3R5bGUgPSB7fTtcblxuICBmb3IgKHZhciBuYW1lIGluIHN0eWxlKSB7XG4gICAgbmV3U3R5bGVbbmFtZV0gPSBjbG9uZVN0eWxlKHN0eWxlW25hbWVdKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdHlsZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBydWxlIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVJ1bGUobmFtZSwgZGVjbCwgb3B0aW9ucykge1xuICBpZiAobmFtZSA9PT0gdm9pZCAwKSB7XG4gICAgbmFtZSA9ICd1bm5hbWVkJztcbiAgfVxuXG4gIHZhciBqc3MgPSBvcHRpb25zLmpzcztcbiAgdmFyIGRlY2xDb3B5ID0gY2xvbmVTdHlsZShkZWNsKTtcbiAgdmFyIHJ1bGUgPSBqc3MucGx1Z2lucy5vbkNyZWF0ZVJ1bGUobmFtZSwgZGVjbENvcHksIG9wdGlvbnMpO1xuICBpZiAocnVsZSkgcmV0dXJuIHJ1bGU7IC8vIEl0IGlzIGFuIGF0LXJ1bGUgYW5kIGl0IGhhcyBubyBpbnN0YW5jZS5cblxuICBpZiAobmFtZVswXSA9PT0gJ0AnKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBVbmtub3duIHJ1bGUgXCIgKyBuYW1lKSA6IHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgam9pbiA9IGZ1bmN0aW9uIGpvaW4odmFsdWUsIGJ5KSB7XG4gIHZhciByZXN1bHQgPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gUmVtb3ZlICFpbXBvcnRhbnQgZnJvbSB0aGUgdmFsdWUsIGl0IHdpbGwgYmUgcmVhZGRlZCBsYXRlci5cbiAgICBpZiAodmFsdWVbaV0gPT09ICchaW1wb3J0YW50JykgYnJlYWs7XG4gICAgaWYgKHJlc3VsdCkgcmVzdWx0ICs9IGJ5O1xuICAgIHJlc3VsdCArPSB2YWx1ZVtpXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuLyoqXG4gKiBDb252ZXJ0cyBKU1MgYXJyYXkgdmFsdWUgdG8gYSBDU1Mgc3RyaW5nLlxuICpcbiAqIGBtYXJnaW46IFtbJzVweCcsICcxMHB4J11dYCA+IGBtYXJnaW46IDVweCAxMHB4O2BcbiAqIGBib3JkZXI6IFsnMXB4JywgJzJweCddYCA+IGBib3JkZXI6IDFweCwgMnB4O2BcbiAqIGBtYXJnaW46IFtbJzVweCcsICcxMHB4J10sICchaW1wb3J0YW50J11gID4gYG1hcmdpbjogNXB4IDEwcHggIWltcG9ydGFudDtgXG4gKiBgY29sb3I6IFsncmVkJywgIWltcG9ydGFudF1gID4gYGNvbG9yOiByZWQgIWltcG9ydGFudDtgXG4gKi9cblxuXG52YXIgdG9Dc3NWYWx1ZSA9IGZ1bmN0aW9uIHRvQ3NzVmFsdWUodmFsdWUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICB2YXIgY3NzVmFsdWUgPSAnJzsgLy8gU3VwcG9ydCBzcGFjZSBzZXBhcmF0ZWQgdmFsdWVzIHZpYSBgW1snNXB4JywgJzEwcHgnXV1gLlxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlWzBdKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWx1ZVtpXSA9PT0gJyFpbXBvcnRhbnQnKSBicmVhaztcbiAgICAgIGlmIChjc3NWYWx1ZSkgY3NzVmFsdWUgKz0gJywgJztcbiAgICAgIGNzc1ZhbHVlICs9IGpvaW4odmFsdWVbaV0sICcgJyk7XG4gICAgfVxuICB9IGVsc2UgY3NzVmFsdWUgPSBqb2luKHZhbHVlLCAnLCAnKTsgLy8gQWRkICFpbXBvcnRhbnQsIGJlY2F1c2UgaXQgd2FzIGlnbm9yZWQuXG5cblxuICBpZiAodmFsdWVbdmFsdWUubGVuZ3RoIC0gMV0gPT09ICchaW1wb3J0YW50Jykge1xuICAgIGNzc1ZhbHVlICs9ICcgIWltcG9ydGFudCc7XG4gIH1cblxuICByZXR1cm4gY3NzVmFsdWU7XG59O1xuXG5mdW5jdGlvbiBnZXRXaGl0ZXNwYWNlU3ltYm9scyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9ybWF0ID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICBsaW5lYnJlYWs6ICcnLFxuICAgICAgc3BhY2U6ICcnXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGluZWJyZWFrOiAnXFxuJyxcbiAgICBzcGFjZTogJyAnXG4gIH07XG59XG5cbi8qKlxuICogSW5kZW50IGEgc3RyaW5nLlxuICogaHR0cDovL2pzcGVyZi5jb20vYXJyYXktam9pbi12cy1mb3JcbiAqL1xuXG5mdW5jdGlvbiBpbmRlbnRTdHIoc3RyLCBpbmRlbnQpIHtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBpbmRlbnQ7IGluZGV4KyspIHtcbiAgICByZXN1bHQgKz0gJyAgJztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgKyBzdHI7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgUnVsZSB0byBDU1Mgc3RyaW5nLlxuICovXG5cblxuZnVuY3Rpb24gdG9Dc3Moc2VsZWN0b3IsIHN0eWxlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICghc3R5bGUpIHJldHVybiByZXN1bHQ7XG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRpbmRlbnQgPSBfb3B0aW9ucy5pbmRlbnQsXG4gICAgICBpbmRlbnQgPSBfb3B0aW9ucyRpbmRlbnQgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRpbmRlbnQ7XG4gIHZhciBmYWxsYmFja3MgPSBzdHlsZS5mYWxsYmFja3M7XG5cbiAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSBmYWxzZSkge1xuICAgIGluZGVudCA9IC1JbmZpbml0eTtcbiAgfVxuXG4gIHZhciBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMgPSBnZXRXaGl0ZXNwYWNlU3ltYm9scyhvcHRpb25zKSxcbiAgICAgIGxpbmVicmVhayA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5saW5lYnJlYWssXG4gICAgICBzcGFjZSA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5zcGFjZTtcblxuICBpZiAoc2VsZWN0b3IpIGluZGVudCsrOyAvLyBBcHBseSBmYWxsYmFja3MgZmlyc3QuXG5cbiAgaWYgKGZhbGxiYWNrcykge1xuICAgIC8vIEFycmF5IHN5bnRheCB7ZmFsbGJhY2tzOiBbe3Byb3A6IHZhbHVlfV19XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFsbGJhY2tzKSkge1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGZhbGxiYWNrcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdmFyIGZhbGxiYWNrID0gZmFsbGJhY2tzW2luZGV4XTtcblxuICAgICAgICBmb3IgKHZhciBwcm9wIGluIGZhbGxiYWNrKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gZmFsbGJhY2tbcHJvcF07XG5cbiAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkgcmVzdWx0ICs9IGxpbmVicmVhaztcbiAgICAgICAgICAgIHJlc3VsdCArPSBpbmRlbnRTdHIocHJvcCArIFwiOlwiICsgc3BhY2UgKyB0b0Nzc1ZhbHVlKHZhbHVlKSArIFwiO1wiLCBpbmRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPYmplY3Qgc3ludGF4IHtmYWxsYmFja3M6IHtwcm9wOiB2YWx1ZX19XG4gICAgICBmb3IgKHZhciBfcHJvcCBpbiBmYWxsYmFja3MpIHtcbiAgICAgICAgdmFyIF92YWx1ZSA9IGZhbGxiYWNrc1tfcHJvcF07XG5cbiAgICAgICAgaWYgKF92YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgcmVzdWx0ICs9IGxpbmVicmVhaztcbiAgICAgICAgICByZXN1bHQgKz0gaW5kZW50U3RyKF9wcm9wICsgXCI6XCIgKyBzcGFjZSArIHRvQ3NzVmFsdWUoX3ZhbHVlKSArIFwiO1wiLCBpbmRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX3Byb3AyIGluIHN0eWxlKSB7XG4gICAgdmFyIF92YWx1ZTIgPSBzdHlsZVtfcHJvcDJdO1xuXG4gICAgaWYgKF92YWx1ZTIgIT0gbnVsbCAmJiBfcHJvcDIgIT09ICdmYWxsYmFja3MnKSB7XG4gICAgICBpZiAocmVzdWx0KSByZXN1bHQgKz0gbGluZWJyZWFrO1xuICAgICAgcmVzdWx0ICs9IGluZGVudFN0cihfcHJvcDIgKyBcIjpcIiArIHNwYWNlICsgdG9Dc3NWYWx1ZShfdmFsdWUyKSArIFwiO1wiLCBpbmRlbnQpO1xuICAgIH1cbiAgfSAvLyBBbGxvdyBlbXB0eSBzdHlsZSBpbiB0aGlzIGNhc2UsIGJlY2F1c2UgcHJvcGVydGllcyB3aWxsIGJlIGFkZGVkIGR5bmFtaWNhbGx5LlxuXG5cbiAgaWYgKCFyZXN1bHQgJiYgIW9wdGlvbnMuYWxsb3dFbXB0eSkgcmV0dXJuIHJlc3VsdDsgLy8gV2hlbiBydWxlIGlzIGJlaW5nIHN0cmluZ2lmaWVkIGJlZm9yZSBzZWxlY3RvciB3YXMgZGVmaW5lZC5cblxuICBpZiAoIXNlbGVjdG9yKSByZXR1cm4gcmVzdWx0O1xuICBpbmRlbnQtLTtcbiAgaWYgKHJlc3VsdCkgcmVzdWx0ID0gXCJcIiArIGxpbmVicmVhayArIHJlc3VsdCArIGxpbmVicmVhaztcbiAgcmV0dXJuIGluZGVudFN0cihcIlwiICsgc2VsZWN0b3IgKyBzcGFjZSArIFwie1wiICsgcmVzdWx0LCBpbmRlbnQpICsgaW5kZW50U3RyKCd9JywgaW5kZW50KTtcbn1cblxudmFyIGVzY2FwZVJlZ2V4ID0gLyhbW1xcXS4jKiQ+PCt+PXxeOigpLFwiJ2BcXHNdKS9nO1xudmFyIG5hdGl2ZUVzY2FwZSA9IHR5cGVvZiBDU1MgIT09ICd1bmRlZmluZWQnICYmIENTUy5lc2NhcGU7XG52YXIgZXNjYXBlID0gKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIG5hdGl2ZUVzY2FwZSA/IG5hdGl2ZUVzY2FwZShzdHIpIDogc3RyLnJlcGxhY2UoZXNjYXBlUmVnZXgsICdcXFxcJDEnKTtcbn0pO1xuXG52YXIgQmFzZVN0eWxlUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJhc2VTdHlsZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICdzdHlsZSc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHZhciBzaGVldCA9IG9wdGlvbnMuc2hlZXQsXG4gICAgICAgIFJlbmRlcmVyID0gb3B0aW9ucy5SZW5kZXJlcjtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICBpZiAoc2hlZXQpIHRoaXMucmVuZGVyZXIgPSBzaGVldC5yZW5kZXJlcjtlbHNlIGlmIChSZW5kZXJlcikgdGhpcy5yZW5kZXJlciA9IG5ldyBSZW5kZXJlcigpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IGEgc3R5bGUgcHJvcGVydHkuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IEJhc2VTdHlsZVJ1bGUucHJvdG90eXBlO1xuXG4gIF9wcm90by5wcm9wID0gZnVuY3Rpb24gcHJvcChuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIC8vIEl0J3MgYSBnZXR0ZXIuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnN0eWxlW25hbWVdOyAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLlxuXG4gICAgdmFyIGZvcmNlID0gb3B0aW9ucyA/IG9wdGlvbnMuZm9yY2UgOiBmYWxzZTtcbiAgICBpZiAoIWZvcmNlICYmIHRoaXMuc3R5bGVbbmFtZV0gPT09IHZhbHVlKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnByb2Nlc3MgIT09IGZhbHNlKSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMub3B0aW9ucy5qc3MucGx1Z2lucy5vbkNoYW5nZVZhbHVlKHZhbHVlLCBuYW1lLCB0aGlzKTtcbiAgICB9XG5cbiAgICB2YXIgaXNFbXB0eSA9IG5ld1ZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUgPT09IGZhbHNlO1xuICAgIHZhciBpc0RlZmluZWQgPSBuYW1lIGluIHRoaXMuc3R5bGU7IC8vIFZhbHVlIGlzIGVtcHR5IGFuZCB3YXNuJ3QgZGVmaW5lZCBiZWZvcmUuXG5cbiAgICBpZiAoaXNFbXB0eSAmJiAhaXNEZWZpbmVkICYmICFmb3JjZSkgcmV0dXJuIHRoaXM7IC8vIFdlIGFyZSBnb2luZyB0byByZW1vdmUgdGhpcyB2YWx1ZS5cblxuICAgIHZhciByZW1vdmUgPSBpc0VtcHR5ICYmIGlzRGVmaW5lZDtcbiAgICBpZiAocmVtb3ZlKSBkZWxldGUgdGhpcy5zdHlsZVtuYW1lXTtlbHNlIHRoaXMuc3R5bGVbbmFtZV0gPSBuZXdWYWx1ZTsgLy8gUmVuZGVyYWJsZSBpcyBkZWZpbmVkIGlmIFN0eWxlU2hlZXQgb3B0aW9uIGBsaW5rYCBpcyB0cnVlLlxuXG4gICAgaWYgKHRoaXMucmVuZGVyYWJsZSAmJiB0aGlzLnJlbmRlcmVyKSB7XG4gICAgICBpZiAocmVtb3ZlKSB0aGlzLnJlbmRlcmVyLnJlbW92ZVByb3BlcnR5KHRoaXMucmVuZGVyYWJsZSwgbmFtZSk7ZWxzZSB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMucmVuZGVyYWJsZSwgbmFtZSwgbmV3VmFsdWUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIHNoZWV0ID0gdGhpcy5vcHRpb25zLnNoZWV0O1xuXG4gICAgaWYgKHNoZWV0ICYmIHNoZWV0LmF0dGFjaGVkKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAnW0pTU10gUnVsZSBpcyBub3QgbGlua2VkLiBNaXNzaW5nIHNoZWV0IG9wdGlvbiBcImxpbms6IHRydWVcIi4nKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICByZXR1cm4gQmFzZVN0eWxlUnVsZTtcbn0oKTtcbnZhciBTdHlsZVJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9CYXNlU3R5bGVSdWxlKSB7XG4gIF9pbmhlcml0c0xvb3NlKFN0eWxlUnVsZSwgX0Jhc2VTdHlsZVJ1bGUpO1xuXG4gIGZ1bmN0aW9uIFN0eWxlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfQmFzZVN0eWxlUnVsZS5jYWxsKHRoaXMsIGtleSwgc3R5bGUsIG9wdGlvbnMpIHx8IHRoaXM7XG4gICAgdmFyIHNlbGVjdG9yID0gb3B0aW9ucy5zZWxlY3RvcixcbiAgICAgICAgc2NvcGVkID0gb3B0aW9ucy5zY29wZWQsXG4gICAgICAgIHNoZWV0ID0gb3B0aW9ucy5zaGVldCxcbiAgICAgICAgZ2VuZXJhdGVJZCA9IG9wdGlvbnMuZ2VuZXJhdGVJZDtcblxuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgX3RoaXMuc2VsZWN0b3JUZXh0ID0gc2VsZWN0b3I7XG4gICAgfSBlbHNlIGlmIChzY29wZWQgIT09IGZhbHNlKSB7XG4gICAgICBfdGhpcy5pZCA9IGdlbmVyYXRlSWQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIHNoZWV0KTtcbiAgICAgIF90aGlzLnNlbGVjdG9yVGV4dCA9IFwiLlwiICsgZXNjYXBlKF90aGlzLmlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBzZWxlY3RvciBzdHJpbmcuXG4gICAqIEF0dGVudGlvbjogdXNlIHRoaXMgd2l0aCBjYXV0aW9uLiBNb3N0IGJyb3dzZXJzIGRpZG4ndCBpbXBsZW1lbnRcbiAgICogc2VsZWN0b3JUZXh0IHNldHRlciwgc28gdGhpcyBtYXkgcmVzdWx0IGluIHJlcmVuZGVyaW5nIG9mIGVudGlyZSBTdHlsZSBTaGVldC5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvMiA9IFN0eWxlUnVsZS5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIEFwcGx5IHJ1bGUgdG8gYW4gZWxlbWVudCBpbmxpbmUuXG4gICAqL1xuICBfcHJvdG8yLmFwcGx5VG8gPSBmdW5jdGlvbiBhcHBseVRvKHJlbmRlcmFibGUpIHtcbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuXG4gICAgaWYgKHJlbmRlcmVyKSB7XG4gICAgICB2YXIganNvbiA9IHRoaXMudG9KU09OKCk7XG5cbiAgICAgIGZvciAodmFyIHByb3AgaW4ganNvbikge1xuICAgICAgICByZW5kZXJlci5zZXRQcm9wZXJ0eShyZW5kZXJhYmxlLCBwcm9wLCBqc29uW3Byb3BdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBydWxlLlxuICAgKiBGYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAqIFVzZWZ1bCBmb3IgaW5saW5lIHN0eWxlcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8yLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICB2YXIganNvbiA9IHt9O1xuXG4gICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLnN0eWxlKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnN0eWxlW3Byb3BdO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGpzb25bcHJvcF0gPSB2YWx1ZTtlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkganNvbltwcm9wXSA9IHRvQ3NzVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBqc29uO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90bzIudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgdmFyIHNoZWV0ID0gdGhpcy5vcHRpb25zLnNoZWV0O1xuICAgIHZhciBsaW5rID0gc2hlZXQgPyBzaGVldC5vcHRpb25zLmxpbmsgOiBmYWxzZTtcbiAgICB2YXIgb3B0cyA9IGxpbmsgPyBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgYWxsb3dFbXB0eTogdHJ1ZVxuICAgIH0pIDogb3B0aW9ucztcbiAgICByZXR1cm4gdG9Dc3ModGhpcy5zZWxlY3RvclRleHQsIHRoaXMuc3R5bGUsIG9wdHMpO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhTdHlsZVJ1bGUsIFt7XG4gICAga2V5OiBcInNlbGVjdG9yXCIsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoc2VsZWN0b3IpIHtcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gdGhpcy5zZWxlY3RvclRleHQpIHJldHVybjtcbiAgICAgIHRoaXMuc2VsZWN0b3JUZXh0ID0gc2VsZWN0b3I7XG4gICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyLFxuICAgICAgICAgIHJlbmRlcmFibGUgPSB0aGlzLnJlbmRlcmFibGU7XG4gICAgICBpZiAoIXJlbmRlcmFibGUgfHwgIXJlbmRlcmVyKSByZXR1cm47XG4gICAgICB2YXIgaGFzQ2hhbmdlZCA9IHJlbmRlcmVyLnNldFNlbGVjdG9yKHJlbmRlcmFibGUsIHNlbGVjdG9yKTsgLy8gSWYgc2VsZWN0b3Igc2V0dGVyIGlzIG5vdCBpbXBsZW1lbnRlZCwgcmVyZW5kZXIgdGhlIHJ1bGUuXG5cbiAgICAgIGlmICghaGFzQ2hhbmdlZCkge1xuICAgICAgICByZW5kZXJlci5yZXBsYWNlUnVsZShyZW5kZXJhYmxlLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHNlbGVjdG9yIHN0cmluZy5cbiAgICAgKi9cbiAgICAsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RvclRleHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0eWxlUnVsZTtcbn0oQmFzZVN0eWxlUnVsZSk7XG52YXIgcGx1Z2luU3R5bGVSdWxlID0ge1xuICBvbkNyZWF0ZVJ1bGU6IGZ1bmN0aW9uIG9uQ3JlYXRlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgaWYgKGtleVswXSA9PT0gJ0AnIHx8IG9wdGlvbnMucGFyZW50ICYmIG9wdGlvbnMucGFyZW50LnR5cGUgPT09ICdrZXlmcmFtZXMnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0eWxlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKTtcbiAgfVxufTtcblxudmFyIGRlZmF1bHRUb1N0cmluZ09wdGlvbnMgPSB7XG4gIGluZGVudDogMSxcbiAgY2hpbGRyZW46IHRydWVcbn07XG52YXIgYXRSZWdFeHAgPSAvQChbXFx3LV0rKS87XG4vKipcbiAqIENvbmRpdGlvbmFsIHJ1bGUgZm9yIEBtZWRpYSwgQHN1cHBvcnRzXG4gKi9cblxudmFyIENvbmRpdGlvbmFsUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbmRpdGlvbmFsUnVsZShrZXksIHN0eWxlcywgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICdjb25kaXRpb25hbCc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHZhciBhdE1hdGNoID0ga2V5Lm1hdGNoKGF0UmVnRXhwKTtcbiAgICB0aGlzLmF0ID0gYXRNYXRjaCA/IGF0TWF0Y2hbMV0gOiAndW5rbm93bic7IC8vIEtleSBtaWdodCBjb250YWluIGEgdW5pcXVlIHN1ZmZpeCBpbiBjYXNlIHRoZSBgbmFtZWAgcGFzc2VkIGJ5IHVzZXIgd2FzIGR1cGxpY2F0ZS5cblxuICAgIHRoaXMucXVlcnkgPSBvcHRpb25zLm5hbWUgfHwgXCJAXCIgKyB0aGlzLmF0O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5ydWxlcyA9IG5ldyBSdWxlTGlzdChfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgcGFyZW50OiB0aGlzXG4gICAgfSkpO1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIHRoaXMucnVsZXMuYWRkKG5hbWUsIHN0eWxlc1tuYW1lXSk7XG4gICAgfVxuXG4gICAgdGhpcy5ydWxlcy5wcm9jZXNzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhIHJ1bGUuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IENvbmRpdGlvbmFsUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmdldFJ1bGUgPSBmdW5jdGlvbiBnZXRSdWxlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlcy5nZXQobmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBpbmRleCBvZiBhIHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHJ1bGUpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlcy5pbmRleE9mKHJ1bGUpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIHJ1bGUsIHJ1biBwbHVnaW5zLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5hZGRSdWxlID0gZnVuY3Rpb24gYWRkUnVsZShuYW1lLCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHZhciBydWxlID0gdGhpcy5ydWxlcy5hZGQobmFtZSwgc3R5bGUsIG9wdGlvbnMpO1xuICAgIGlmICghcnVsZSkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUocnVsZSk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cbiAgLyoqXG4gICAqIFJlcGxhY2UgcnVsZSwgcnVuIHBsdWdpbnMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlcGxhY2VSdWxlID0gZnVuY3Rpb24gcmVwbGFjZVJ1bGUobmFtZSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgbmV3UnVsZSA9IHRoaXMucnVsZXMucmVwbGFjZShuYW1lLCBzdHlsZSwgb3B0aW9ucyk7XG4gICAgaWYgKG5ld1J1bGUpIHRoaXMub3B0aW9ucy5qc3MucGx1Z2lucy5vblByb2Nlc3NSdWxlKG5ld1J1bGUpO1xuICAgIHJldHVybiBuZXdSdWxlO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdFRvU3RyaW5nT3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgX2dldFdoaXRlc3BhY2VTeW1ib2xzID0gZ2V0V2hpdGVzcGFjZVN5bWJvbHMob3B0aW9ucyksXG4gICAgICAgIGxpbmVicmVhayA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5saW5lYnJlYWs7XG5cbiAgICBpZiAob3B0aW9ucy5pbmRlbnQgPT0gbnVsbCkgb3B0aW9ucy5pbmRlbnQgPSBkZWZhdWx0VG9TdHJpbmdPcHRpb25zLmluZGVudDtcbiAgICBpZiAob3B0aW9ucy5jaGlsZHJlbiA9PSBudWxsKSBvcHRpb25zLmNoaWxkcmVuID0gZGVmYXVsdFRvU3RyaW5nT3B0aW9ucy5jaGlsZHJlbjtcblxuICAgIGlmIChvcHRpb25zLmNoaWxkcmVuID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcnkgKyBcIiB7fVwiO1xuICAgIH1cblxuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucnVsZXMudG9TdHJpbmcob3B0aW9ucyk7XG4gICAgcmV0dXJuIGNoaWxkcmVuID8gdGhpcy5xdWVyeSArIFwiIHtcIiArIGxpbmVicmVhayArIGNoaWxkcmVuICsgbGluZWJyZWFrICsgXCJ9XCIgOiAnJztcbiAgfTtcblxuICByZXR1cm4gQ29uZGl0aW9uYWxSdWxlO1xufSgpO1xudmFyIGtleVJlZ0V4cCA9IC9AY29udGFpbmVyfEBtZWRpYXxAc3VwcG9ydHNcXHMrLztcbnZhciBwbHVnaW5Db25kaXRpb25hbFJ1bGUgPSB7XG4gIG9uQ3JlYXRlUnVsZTogZnVuY3Rpb24gb25DcmVhdGVSdWxlKGtleSwgc3R5bGVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGtleVJlZ0V4cC50ZXN0KGtleSkgPyBuZXcgQ29uZGl0aW9uYWxSdWxlKGtleSwgc3R5bGVzLCBvcHRpb25zKSA6IG51bGw7XG4gIH1cbn07XG5cbnZhciBkZWZhdWx0VG9TdHJpbmdPcHRpb25zJDEgPSB7XG4gIGluZGVudDogMSxcbiAgY2hpbGRyZW46IHRydWVcbn07XG52YXIgbmFtZVJlZ0V4cCA9IC9Aa2V5ZnJhbWVzXFxzKyhbXFx3LV0rKS87XG4vKipcbiAqIFJ1bGUgZm9yIEBrZXlmcmFtZXNcbiAqL1xuXG52YXIgS2V5ZnJhbWVzUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEtleWZyYW1lc1J1bGUoa2V5LCBmcmFtZXMsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnR5cGUgPSAna2V5ZnJhbWVzJztcbiAgICB0aGlzLmF0ID0gJ0BrZXlmcmFtZXMnO1xuICAgIHRoaXMuaXNQcm9jZXNzZWQgPSBmYWxzZTtcbiAgICB2YXIgbmFtZU1hdGNoID0ga2V5Lm1hdGNoKG5hbWVSZWdFeHApO1xuXG4gICAgaWYgKG5hbWVNYXRjaCAmJiBuYW1lTWF0Y2hbMV0pIHtcbiAgICAgIHRoaXMubmFtZSA9IG5hbWVNYXRjaFsxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYW1lID0gJ25vbmFtZSc7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCBcIltKU1NdIEJhZCBrZXlmcmFtZXMgbmFtZSBcIiArIGtleSkgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdGhpcy5rZXkgPSB0aGlzLnR5cGUgKyBcIi1cIiArIHRoaXMubmFtZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHZhciBzY29wZWQgPSBvcHRpb25zLnNjb3BlZCxcbiAgICAgICAgc2hlZXQgPSBvcHRpb25zLnNoZWV0LFxuICAgICAgICBnZW5lcmF0ZUlkID0gb3B0aW9ucy5nZW5lcmF0ZUlkO1xuICAgIHRoaXMuaWQgPSBzY29wZWQgPT09IGZhbHNlID8gdGhpcy5uYW1lIDogZXNjYXBlKGdlbmVyYXRlSWQodGhpcywgc2hlZXQpKTtcbiAgICB0aGlzLnJ1bGVzID0gbmV3IFJ1bGVMaXN0KF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBwYXJlbnQ6IHRoaXNcbiAgICB9KSk7XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIGZyYW1lcykge1xuICAgICAgdGhpcy5ydWxlcy5hZGQobmFtZSwgZnJhbWVzW25hbWVdLCBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgICBwYXJlbnQ6IHRoaXNcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzLnByb2Nlc3MoKTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQ1NTIHN0cmluZy5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gS2V5ZnJhbWVzUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0VG9TdHJpbmdPcHRpb25zJDE7XG4gICAgfVxuXG4gICAgdmFyIF9nZXRXaGl0ZXNwYWNlU3ltYm9scyA9IGdldFdoaXRlc3BhY2VTeW1ib2xzKG9wdGlvbnMpLFxuICAgICAgICBsaW5lYnJlYWsgPSBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMubGluZWJyZWFrO1xuXG4gICAgaWYgKG9wdGlvbnMuaW5kZW50ID09IG51bGwpIG9wdGlvbnMuaW5kZW50ID0gZGVmYXVsdFRvU3RyaW5nT3B0aW9ucyQxLmluZGVudDtcbiAgICBpZiAob3B0aW9ucy5jaGlsZHJlbiA9PSBudWxsKSBvcHRpb25zLmNoaWxkcmVuID0gZGVmYXVsdFRvU3RyaW5nT3B0aW9ucyQxLmNoaWxkcmVuO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hpbGRyZW4gPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdCArIFwiIFwiICsgdGhpcy5pZCArIFwiIHt9XCI7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5ydWxlcy50b1N0cmluZyhvcHRpb25zKTtcbiAgICBpZiAoY2hpbGRyZW4pIGNoaWxkcmVuID0gXCJcIiArIGxpbmVicmVhayArIGNoaWxkcmVuICsgbGluZWJyZWFrO1xuICAgIHJldHVybiB0aGlzLmF0ICsgXCIgXCIgKyB0aGlzLmlkICsgXCIge1wiICsgY2hpbGRyZW4gKyBcIn1cIjtcbiAgfTtcblxuICByZXR1cm4gS2V5ZnJhbWVzUnVsZTtcbn0oKTtcbnZhciBrZXlSZWdFeHAkMSA9IC9Aa2V5ZnJhbWVzXFxzKy87XG52YXIgcmVmUmVnRXhwID0gL1xcJChbXFx3LV0rKS9nO1xuXG52YXIgZmluZFJlZmVyZW5jZWRLZXlmcmFtZSA9IGZ1bmN0aW9uIGZpbmRSZWZlcmVuY2VkS2V5ZnJhbWUodmFsLCBrZXlmcmFtZXMpIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbC5yZXBsYWNlKHJlZlJlZ0V4cCwgZnVuY3Rpb24gKG1hdGNoLCBuYW1lKSB7XG4gICAgICBpZiAobmFtZSBpbiBrZXlmcmFtZXMpIHtcbiAgICAgICAgcmV0dXJuIGtleWZyYW1lc1tuYW1lXTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBSZWZlcmVuY2VkIGtleWZyYW1lcyBydWxlIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQuXCIpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn07XG4vKipcbiAqIFJlcGxhY2UgdGhlIHJlZmVyZW5jZSBmb3IgYSBhbmltYXRpb24gbmFtZS5cbiAqL1xuXG5cbnZhciByZXBsYWNlUmVmID0gZnVuY3Rpb24gcmVwbGFjZVJlZihzdHlsZSwgcHJvcCwga2V5ZnJhbWVzKSB7XG4gIHZhciB2YWx1ZSA9IHN0eWxlW3Byb3BdO1xuICB2YXIgcmVmS2V5ZnJhbWUgPSBmaW5kUmVmZXJlbmNlZEtleWZyYW1lKHZhbHVlLCBrZXlmcmFtZXMpO1xuXG4gIGlmIChyZWZLZXlmcmFtZSAhPT0gdmFsdWUpIHtcbiAgICBzdHlsZVtwcm9wXSA9IHJlZktleWZyYW1lO1xuICB9XG59O1xuXG52YXIgcGx1Z2luS2V5ZnJhbWVzUnVsZSA9IHtcbiAgb25DcmVhdGVSdWxlOiBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUoa2V5LCBmcmFtZXMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5UmVnRXhwJDEudGVzdChrZXkpID8gbmV3IEtleWZyYW1lc1J1bGUoa2V5LCBmcmFtZXMsIG9wdGlvbnMpIDogbnVsbDtcbiAgfSxcbiAgLy8gQW5pbWF0aW9uIG5hbWUgcmVmIHJlcGxhY2VyLlxuICBvblByb2Nlc3NTdHlsZTogZnVuY3Rpb24gb25Qcm9jZXNzU3R5bGUoc3R5bGUsIHJ1bGUsIHNoZWV0KSB7XG4gICAgaWYgKHJ1bGUudHlwZSAhPT0gJ3N0eWxlJyB8fCAhc2hlZXQpIHJldHVybiBzdHlsZTtcbiAgICBpZiAoJ2FuaW1hdGlvbi1uYW1lJyBpbiBzdHlsZSkgcmVwbGFjZVJlZihzdHlsZSwgJ2FuaW1hdGlvbi1uYW1lJywgc2hlZXQua2V5ZnJhbWVzKTtcbiAgICBpZiAoJ2FuaW1hdGlvbicgaW4gc3R5bGUpIHJlcGxhY2VSZWYoc3R5bGUsICdhbmltYXRpb24nLCBzaGVldC5rZXlmcmFtZXMpO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfSxcbiAgb25DaGFuZ2VWYWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VWYWx1ZSh2YWwsIHByb3AsIHJ1bGUpIHtcbiAgICB2YXIgc2hlZXQgPSBydWxlLm9wdGlvbnMuc2hlZXQ7XG5cbiAgICBpZiAoIXNoZWV0KSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcCkge1xuICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgICAgcmV0dXJuIGZpbmRSZWZlcmVuY2VkS2V5ZnJhbWUodmFsLCBzaGVldC5rZXlmcmFtZXMpO1xuXG4gICAgICBjYXNlICdhbmltYXRpb24tbmFtZSc6XG4gICAgICAgIHJldHVybiBmaW5kUmVmZXJlbmNlZEtleWZyYW1lKHZhbCwgc2hlZXQua2V5ZnJhbWVzKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBLZXlmcmFtZVJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9CYXNlU3R5bGVSdWxlKSB7XG4gIF9pbmhlcml0c0xvb3NlKEtleWZyYW1lUnVsZSwgX0Jhc2VTdHlsZVJ1bGUpO1xuXG4gIGZ1bmN0aW9uIEtleWZyYW1lUnVsZSgpIHtcbiAgICByZXR1cm4gX0Jhc2VTdHlsZVJ1bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEtleWZyYW1lUnVsZS5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIENTUyBzdHJpbmcuXG4gICAqL1xuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgdmFyIHNoZWV0ID0gdGhpcy5vcHRpb25zLnNoZWV0O1xuICAgIHZhciBsaW5rID0gc2hlZXQgPyBzaGVldC5vcHRpb25zLmxpbmsgOiBmYWxzZTtcbiAgICB2YXIgb3B0cyA9IGxpbmsgPyBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgYWxsb3dFbXB0eTogdHJ1ZVxuICAgIH0pIDogb3B0aW9ucztcbiAgICByZXR1cm4gdG9Dc3ModGhpcy5rZXksIHRoaXMuc3R5bGUsIG9wdHMpO1xuICB9O1xuXG4gIHJldHVybiBLZXlmcmFtZVJ1bGU7XG59KEJhc2VTdHlsZVJ1bGUpO1xudmFyIHBsdWdpbktleWZyYW1lUnVsZSA9IHtcbiAgb25DcmVhdGVSdWxlOiBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnBhcmVudCAmJiBvcHRpb25zLnBhcmVudC50eXBlID09PSAna2V5ZnJhbWVzJykge1xuICAgICAgcmV0dXJuIG5ldyBLZXlmcmFtZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbnZhciBGb250RmFjZVJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGb250RmFjZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICdmb250LWZhY2UnO1xuICAgIHRoaXMuYXQgPSAnQGZvbnQtZmFjZSc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBGb250RmFjZVJ1bGUucHJvdG90eXBlO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICB2YXIgX2dldFdoaXRlc3BhY2VTeW1ib2xzID0gZ2V0V2hpdGVzcGFjZVN5bWJvbHMob3B0aW9ucyksXG4gICAgICAgIGxpbmVicmVhayA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5saW5lYnJlYWs7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnN0eWxlKSkge1xuICAgICAgdmFyIHN0ciA9ICcnO1xuXG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5zdHlsZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgc3RyICs9IHRvQ3NzKHRoaXMuYXQsIHRoaXMuc3R5bGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGVbaW5kZXggKyAxXSkgc3RyICs9IGxpbmVicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9Dc3ModGhpcy5hdCwgdGhpcy5zdHlsZSwgb3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIEZvbnRGYWNlUnVsZTtcbn0oKTtcbnZhciBrZXlSZWdFeHAkMiA9IC9AZm9udC1mYWNlLztcbnZhciBwbHVnaW5Gb250RmFjZVJ1bGUgPSB7XG4gIG9uQ3JlYXRlUnVsZTogZnVuY3Rpb24gb25DcmVhdGVSdWxlKGtleSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4ga2V5UmVnRXhwJDIudGVzdChrZXkpID8gbmV3IEZvbnRGYWNlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSA6IG51bGw7XG4gIH1cbn07XG5cbnZhciBWaWV3cG9ydFJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBWaWV3cG9ydFJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICd2aWV3cG9ydCc7XG4gICAgdGhpcy5hdCA9ICdAdmlld3BvcnQnO1xuICAgIHRoaXMuaXNQcm9jZXNzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQ1NTIHN0cmluZy5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gVmlld3BvcnRSdWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRvQ3NzKHRoaXMua2V5LCB0aGlzLnN0eWxlLCBvcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gVmlld3BvcnRSdWxlO1xufSgpO1xudmFyIHBsdWdpblZpZXdwb3J0UnVsZSA9IHtcbiAgb25DcmVhdGVSdWxlOiBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBrZXkgPT09ICdAdmlld3BvcnQnIHx8IGtleSA9PT0gJ0AtbXMtdmlld3BvcnQnID8gbmV3IFZpZXdwb3J0UnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSA6IG51bGw7XG4gIH1cbn07XG5cbnZhciBTaW1wbGVSdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2ltcGxlUnVsZShrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlID0gJ3NpbXBsZSc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cblxuICB2YXIgX3Byb3RvID0gU2ltcGxlUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcob3B0aW9ucykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICB2YXIgc3RyID0gJyc7XG5cbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnZhbHVlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBzdHIgKz0gdGhpcy5rZXkgKyBcIiBcIiArIHRoaXMudmFsdWVbaW5kZXhdICsgXCI7XCI7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlW2luZGV4ICsgMV0pIHN0ciArPSAnXFxuJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5rZXkgKyBcIiBcIiArIHRoaXMudmFsdWUgKyBcIjtcIjtcbiAgfTtcblxuICByZXR1cm4gU2ltcGxlUnVsZTtcbn0oKTtcbnZhciBrZXlzTWFwID0ge1xuICAnQGNoYXJzZXQnOiB0cnVlLFxuICAnQGltcG9ydCc6IHRydWUsXG4gICdAbmFtZXNwYWNlJzogdHJ1ZVxufTtcbnZhciBwbHVnaW5TaW1wbGVSdWxlID0ge1xuICBvbkNyZWF0ZVJ1bGU6IGZ1bmN0aW9uIG9uQ3JlYXRlUnVsZShrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGtleSBpbiBrZXlzTWFwID8gbmV3IFNpbXBsZVJ1bGUoa2V5LCB2YWx1ZSwgb3B0aW9ucykgOiBudWxsO1xuICB9XG59O1xuXG52YXIgcGx1Z2lucyA9IFtwbHVnaW5TdHlsZVJ1bGUsIHBsdWdpbkNvbmRpdGlvbmFsUnVsZSwgcGx1Z2luS2V5ZnJhbWVzUnVsZSwgcGx1Z2luS2V5ZnJhbWVSdWxlLCBwbHVnaW5Gb250RmFjZVJ1bGUsIHBsdWdpblZpZXdwb3J0UnVsZSwgcGx1Z2luU2ltcGxlUnVsZV07XG5cbnZhciBkZWZhdWx0VXBkYXRlT3B0aW9ucyA9IHtcbiAgcHJvY2VzczogdHJ1ZVxufTtcbnZhciBmb3JjZVVwZGF0ZU9wdGlvbnMgPSB7XG4gIGZvcmNlOiB0cnVlLFxuICBwcm9jZXNzOiB0cnVlXG4gIC8qKlxuICAgKiBDb250YWlucyBydWxlcyBvYmplY3RzIGFuZCBhbGxvd3MgYWRkaW5nL3JlbW92aW5nIGV0Yy5cbiAgICogSXMgdXNlZCBmb3IgZS5nLiBieSBgU3R5bGVTaGVldGAgb3IgYENvbmRpdGlvbmFsUnVsZWAuXG4gICAqL1xuXG59O1xuXG52YXIgUnVsZUxpc3QgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvLyBSdWxlcyByZWdpc3RyeSBmb3IgYWNjZXNzIGJ5IC5nZXQoKSBtZXRob2QuXG4gIC8vIEl0IGNvbnRhaW5zIHRoZSBzYW1lIHJ1bGUgcmVnaXN0ZXJlZCBieSBuYW1lIGFuZCBieSBzZWxlY3Rvci5cbiAgLy8gT3JpZ2luYWwgc3R5bGVzIG9iamVjdC5cbiAgLy8gVXNlZCB0byBlbnN1cmUgY29ycmVjdCBydWxlcyBvcmRlci5cbiAgZnVuY3Rpb24gUnVsZUxpc3Qob3B0aW9ucykge1xuICAgIHRoaXMubWFwID0ge307XG4gICAgdGhpcy5yYXcgPSB7fTtcbiAgICB0aGlzLmluZGV4ID0gW107XG4gICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuY2xhc3NlcyA9IG9wdGlvbnMuY2xhc3NlcztcbiAgICB0aGlzLmtleWZyYW1lcyA9IG9wdGlvbnMua2V5ZnJhbWVzO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIHJ1bGUuXG4gICAqXG4gICAqIFdpbGwgbm90IHJlbmRlciBhZnRlciBTdHlsZSBTaGVldCB3YXMgcmVuZGVyZWQgdGhlIGZpcnN0IHRpbWUuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFJ1bGVMaXN0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uYWRkID0gZnVuY3Rpb24gYWRkKG5hbWUsIGRlY2wsIHJ1bGVPcHRpb25zKSB7XG4gICAgdmFyIF90aGlzJG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIHBhcmVudCA9IF90aGlzJG9wdGlvbnMucGFyZW50LFxuICAgICAgICBzaGVldCA9IF90aGlzJG9wdGlvbnMuc2hlZXQsXG4gICAgICAgIGpzcyA9IF90aGlzJG9wdGlvbnMuanNzLFxuICAgICAgICBSZW5kZXJlciA9IF90aGlzJG9wdGlvbnMuUmVuZGVyZXIsXG4gICAgICAgIGdlbmVyYXRlSWQgPSBfdGhpcyRvcHRpb25zLmdlbmVyYXRlSWQsXG4gICAgICAgIHNjb3BlZCA9IF90aGlzJG9wdGlvbnMuc2NvcGVkO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc2VzOiB0aGlzLmNsYXNzZXMsXG4gICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgIHNoZWV0OiBzaGVldCxcbiAgICAgIGpzczoganNzLFxuICAgICAgUmVuZGVyZXI6IFJlbmRlcmVyLFxuICAgICAgZ2VuZXJhdGVJZDogZ2VuZXJhdGVJZCxcbiAgICAgIHNjb3BlZDogc2NvcGVkLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGtleWZyYW1lczogdGhpcy5rZXlmcmFtZXMsXG4gICAgICBzZWxlY3RvcjogdW5kZWZpbmVkXG4gICAgfSwgcnVsZU9wdGlvbnMpOyAvLyBXaGVuIHVzZXIgdXNlcyAuY3JlYXRlU3R5bGVTaGVldCgpLCBkdXBsaWNhdGUgbmFtZXMgYXJlIG5vdCBwb3NzaWJsZSwgYnV0XG4gICAgLy8gYHNoZWV0LmFkZFJ1bGUoKWAgb3BlbnMgdGhlIGRvb3IgZm9yIGFueSBkdXBsaWNhdGUgcnVsZSBuYW1lLiBXaGVuIHRoaXMgaGFwcGVuc1xuICAgIC8vIHdlIG5lZWQgdG8gbWFrZSB0aGUga2V5IHVuaXF1ZSB3aXRoaW4gdGhpcyBSdWxlTGlzdCBpbnN0YW5jZSBzY29wZS5cblxuXG4gICAgdmFyIGtleSA9IG5hbWU7XG5cbiAgICBpZiAobmFtZSBpbiB0aGlzLnJhdykge1xuICAgICAga2V5ID0gbmFtZSArIFwiLWRcIiArIHRoaXMuY291bnRlcisrO1xuICAgIH0gLy8gV2UgbmVlZCB0byBzYXZlIHRoZSBvcmlnaW5hbCBkZWNsIGJlZm9yZSBjcmVhdGluZyB0aGUgcnVsZVxuICAgIC8vIGJlY2F1c2UgY2FjaGUgcGx1Z2luIG5lZWRzIHRvIHVzZSBpdCBhcyBhIGtleSB0byByZXR1cm4gYSBjYWNoZWQgcnVsZS5cblxuXG4gICAgdGhpcy5yYXdba2V5XSA9IGRlY2w7XG5cbiAgICBpZiAoa2V5IGluIHRoaXMuY2xhc3Nlcykge1xuICAgICAgLy8gRS5nLiBydWxlcyBpbnNpZGUgb2YgQG1lZGlhIGNvbnRhaW5lclxuICAgICAgb3B0aW9ucy5zZWxlY3RvciA9IFwiLlwiICsgZXNjYXBlKHRoaXMuY2xhc3Nlc1trZXldKTtcbiAgICB9XG5cbiAgICB2YXIgcnVsZSA9IGNyZWF0ZVJ1bGUoa2V5LCBkZWNsLCBvcHRpb25zKTtcbiAgICBpZiAoIXJ1bGUpIHJldHVybiBudWxsO1xuICAgIHRoaXMucmVnaXN0ZXIocnVsZSk7XG4gICAgdmFyIGluZGV4ID0gb3B0aW9ucy5pbmRleCA9PT0gdW5kZWZpbmVkID8gdGhpcy5pbmRleC5sZW5ndGggOiBvcHRpb25zLmluZGV4O1xuICAgIHRoaXMuaW5kZXguc3BsaWNlKGluZGV4LCAwLCBydWxlKTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuICAvKipcbiAgICogUmVwbGFjZSBydWxlLlxuICAgKiBDcmVhdGUgYSBuZXcgcnVsZSBhbmQgcmVtb3ZlIG9sZCBvbmUgaW5zdGVhZCBvZiBvdmVyd3JpdGluZ1xuICAgKiBiZWNhdXNlIHdlIHdhbnQgdG8gaW52b2tlIG9uQ3JlYXRlUnVsZSBob29rIHRvIG1ha2UgcGx1Z2lucyB3b3JrLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShuYW1lLCBkZWNsLCBydWxlT3B0aW9ucykge1xuICAgIHZhciBvbGRSdWxlID0gdGhpcy5nZXQobmFtZSk7XG4gICAgdmFyIG9sZEluZGV4ID0gdGhpcy5pbmRleC5pbmRleE9mKG9sZFJ1bGUpO1xuXG4gICAgaWYgKG9sZFJ1bGUpIHtcbiAgICAgIHRoaXMucmVtb3ZlKG9sZFJ1bGUpO1xuICAgIH1cblxuICAgIHZhciBvcHRpb25zID0gcnVsZU9wdGlvbnM7XG4gICAgaWYgKG9sZEluZGV4ICE9PSAtMSkgb3B0aW9ucyA9IF9leHRlbmRzKHt9LCBydWxlT3B0aW9ucywge1xuICAgICAgaW5kZXg6IG9sZEluZGV4XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuYWRkKG5hbWUsIGRlY2wsIG9wdGlvbnMpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgYSBydWxlIGJ5IG5hbWUgb3Igc2VsZWN0b3IuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdldCA9IGZ1bmN0aW9uIGdldChuYW1lT3JTZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLm1hcFtuYW1lT3JTZWxlY3Rvcl07XG4gIH1cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZShydWxlKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyKHJ1bGUpO1xuICAgIGRlbGV0ZSB0aGlzLnJhd1tydWxlLmtleV07XG4gICAgdGhpcy5pbmRleC5zcGxpY2UodGhpcy5pbmRleC5pbmRleE9mKHJ1bGUpLCAxKTtcbiAgfVxuICAvKipcbiAgICogR2V0IGluZGV4IG9mIGEgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YocnVsZSkge1xuICAgIHJldHVybiB0aGlzLmluZGV4LmluZGV4T2YocnVsZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biBgb25Qcm9jZXNzUnVsZSgpYCBwbHVnaW5zIG9uIGV2ZXJ5IHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKCkge1xuICAgIHZhciBwbHVnaW5zID0gdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zOyAvLyBXZSBuZWVkIHRvIGNsb25lIGFycmF5IGJlY2F1c2UgaWYgd2UgbW9kaWZ5IHRoZSBpbmRleCBzb21ld2hlcmUgZWxzZSBkdXJpbmcgYSBsb29wXG4gICAgLy8gd2UgZW5kIHVwIHdpdGggdmVyeSBoYXJkLXRvLXRyYWNrLWRvd24gc2lkZSBlZmZlY3RzLlxuXG4gICAgdGhpcy5pbmRleC5zbGljZSgwKS5mb3JFYWNoKHBsdWdpbnMub25Qcm9jZXNzUnVsZSwgcGx1Z2lucyk7XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgcnVsZSBpbiBgLm1hcGAsIGAuY2xhc3Nlc2AgYW5kIGAua2V5ZnJhbWVzYCBtYXBzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKHJ1bGUpIHtcbiAgICB0aGlzLm1hcFtydWxlLmtleV0gPSBydWxlO1xuXG4gICAgaWYgKHJ1bGUgaW5zdGFuY2VvZiBTdHlsZVJ1bGUpIHtcbiAgICAgIHRoaXMubWFwW3J1bGUuc2VsZWN0b3JdID0gcnVsZTtcbiAgICAgIGlmIChydWxlLmlkKSB0aGlzLmNsYXNzZXNbcnVsZS5rZXldID0gcnVsZS5pZDtcbiAgICB9IGVsc2UgaWYgKHJ1bGUgaW5zdGFuY2VvZiBLZXlmcmFtZXNSdWxlICYmIHRoaXMua2V5ZnJhbWVzKSB7XG4gICAgICB0aGlzLmtleWZyYW1lc1tydWxlLm5hbWVdID0gcnVsZS5pZDtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYSBydWxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by51bnJlZ2lzdGVyID0gZnVuY3Rpb24gdW5yZWdpc3RlcihydWxlKSB7XG4gICAgZGVsZXRlIHRoaXMubWFwW3J1bGUua2V5XTtcblxuICAgIGlmIChydWxlIGluc3RhbmNlb2YgU3R5bGVSdWxlKSB7XG4gICAgICBkZWxldGUgdGhpcy5tYXBbcnVsZS5zZWxlY3Rvcl07XG4gICAgICBkZWxldGUgdGhpcy5jbGFzc2VzW3J1bGUua2V5XTtcbiAgICB9IGVsc2UgaWYgKHJ1bGUgaW5zdGFuY2VvZiBLZXlmcmFtZXNSdWxlKSB7XG4gICAgICBkZWxldGUgdGhpcy5rZXlmcmFtZXNbcnVsZS5uYW1lXTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZnVuY3Rpb24gdmFsdWVzIHdpdGggYSBuZXcgZGF0YS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHZhciBuYW1lO1xuICAgIHZhciBkYXRhO1xuICAgIHZhciBvcHRpb25zO1xuXG4gICAgaWYgKHR5cGVvZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAwID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzBdKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWUgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMF07XG4gICAgICBkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1syXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXTtcbiAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgICBuYW1lID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgdGhpcy51cGRhdGVPbmUodGhpcy5nZXQobmFtZSksIGRhdGEsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5pbmRleC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdGhpcy51cGRhdGVPbmUodGhpcy5pbmRleFtpbmRleF0sIGRhdGEsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogRXhlY3V0ZSBwbHVnaW5zLCB1cGRhdGUgcnVsZSBwcm9wcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udXBkYXRlT25lID0gZnVuY3Rpb24gdXBkYXRlT25lKHJ1bGUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdFVwZGF0ZU9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzJG9wdGlvbnMyID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBwbHVnaW5zID0gX3RoaXMkb3B0aW9uczIuanNzLnBsdWdpbnMsXG4gICAgICAgIHNoZWV0ID0gX3RoaXMkb3B0aW9uczIuc2hlZXQ7IC8vIEl0IGlzIGEgcnVsZXMgY29udGFpbmVyIGxpa2UgZm9yIGUuZy4gQ29uZGl0aW9uYWxSdWxlLlxuXG4gICAgaWYgKHJ1bGUucnVsZXMgaW5zdGFuY2VvZiBSdWxlTGlzdCkge1xuICAgICAgcnVsZS5ydWxlcy51cGRhdGUoZGF0YSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlID0gcnVsZS5zdHlsZTtcbiAgICBwbHVnaW5zLm9uVXBkYXRlKGRhdGEsIHJ1bGUsIHNoZWV0LCBvcHRpb25zKTsgLy8gV2UgcmVseSBvbiBhIG5ldyBgc3R5bGVgIHJlZiBpbiBjYXNlIGl0IHdhcyBtdXRhdGVkIGR1cmluZyBvblVwZGF0ZSBob29rLlxuXG4gICAgaWYgKG9wdGlvbnMucHJvY2VzcyAmJiBzdHlsZSAmJiBzdHlsZSAhPT0gcnVsZS5zdHlsZSkge1xuICAgICAgLy8gV2UgbmVlZCB0byBydW4gdGhlIHBsdWdpbnMgaW4gY2FzZSBuZXcgYHN0eWxlYCByZWxpZXMgb24gc3ludGF4IHBsdWdpbnMuXG4gICAgICBwbHVnaW5zLm9uUHJvY2Vzc1N0eWxlKHJ1bGUuc3R5bGUsIHJ1bGUsIHNoZWV0KTsgLy8gVXBkYXRlIGFuZCBhZGQgcHJvcHMuXG5cbiAgICAgIGZvciAodmFyIHByb3AgaW4gcnVsZS5zdHlsZSkge1xuICAgICAgICB2YXIgbmV4dFZhbHVlID0gcnVsZS5zdHlsZVtwcm9wXTtcbiAgICAgICAgdmFyIHByZXZWYWx1ZSA9IHN0eWxlW3Byb3BdOyAvLyBXZSBuZWVkIHRvIHVzZSBgZm9yY2U6IHRydWVgIGJlY2F1c2UgYHJ1bGUuc3R5bGVgIGhhcyBiZWVuIHVwZGF0ZWQgZHVyaW5nIG9uVXBkYXRlIGhvb2ssIHNvIGBydWxlLnByb3AoKWAgd2lsbCBub3QgdXBkYXRlIHRoZSBDU1NPTSBydWxlLlxuICAgICAgICAvLyBXZSBkbyB0aGlzIGNvbXBhcmlzb24gdG8gYXZvaWQgdW5uZWVkZWQgYHJ1bGUucHJvcCgpYCBjYWxscywgc2luY2Ugd2UgaGF2ZSB0aGUgb2xkIGBzdHlsZWAgb2JqZWN0IGhlcmUuXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAhPT0gcHJldlZhbHVlKSB7XG4gICAgICAgICAgcnVsZS5wcm9wKHByb3AsIG5leHRWYWx1ZSwgZm9yY2VVcGRhdGVPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBSZW1vdmUgcHJvcHMuXG5cblxuICAgICAgZm9yICh2YXIgX3Byb3AgaW4gc3R5bGUpIHtcbiAgICAgICAgdmFyIF9uZXh0VmFsdWUgPSBydWxlLnN0eWxlW19wcm9wXTtcbiAgICAgICAgdmFyIF9wcmV2VmFsdWUgPSBzdHlsZVtfcHJvcF07IC8vIFdlIG5lZWQgdG8gdXNlIGBmb3JjZTogdHJ1ZWAgYmVjYXVzZSBgcnVsZS5zdHlsZWAgaGFzIGJlZW4gdXBkYXRlZCBkdXJpbmcgb25VcGRhdGUgaG9vaywgc28gYHJ1bGUucHJvcCgpYCB3aWxsIG5vdCB1cGRhdGUgdGhlIENTU09NIHJ1bGUuXG4gICAgICAgIC8vIFdlIGRvIHRoaXMgY29tcGFyaXNvbiB0byBhdm9pZCB1bm5lZWRlZCBgcnVsZS5wcm9wKClgIGNhbGxzLCBzaW5jZSB3ZSBoYXZlIHRoZSBvbGQgYHN0eWxlYCBvYmplY3QgaGVyZS5cblxuICAgICAgICBpZiAoX25leHRWYWx1ZSA9PSBudWxsICYmIF9uZXh0VmFsdWUgIT09IF9wcmV2VmFsdWUpIHtcbiAgICAgICAgICBydWxlLnByb3AoX3Byb3AsIG51bGwsIGZvcmNlVXBkYXRlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnQgcnVsZXMgdG8gYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIHNoZWV0ID0gdGhpcy5vcHRpb25zLnNoZWV0O1xuICAgIHZhciBsaW5rID0gc2hlZXQgPyBzaGVldC5vcHRpb25zLmxpbmsgOiBmYWxzZTtcblxuICAgIHZhciBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMgPSBnZXRXaGl0ZXNwYWNlU3ltYm9scyhvcHRpb25zKSxcbiAgICAgICAgbGluZWJyZWFrID0gX2dldFdoaXRlc3BhY2VTeW1ib2xzLmxpbmVicmVhaztcblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmluZGV4Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIHJ1bGUgPSB0aGlzLmluZGV4W2luZGV4XTtcbiAgICAgIHZhciBjc3MgPSBydWxlLnRvU3RyaW5nKG9wdGlvbnMpOyAvLyBObyBuZWVkIHRvIHJlbmRlciBhbiBlbXB0eSBydWxlLlxuXG4gICAgICBpZiAoIWNzcyAmJiAhbGluaykgY29udGludWU7XG4gICAgICBpZiAoc3RyKSBzdHIgKz0gbGluZWJyZWFrO1xuICAgICAgc3RyICs9IGNzcztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIHJldHVybiBSdWxlTGlzdDtcbn0oKTtcblxudmFyIFN0eWxlU2hlZXQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdHlsZVNoZWV0KHN0eWxlcywgb3B0aW9ucykge1xuICAgIHRoaXMuYXR0YWNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRlcGxveWVkID0gZmFsc2U7XG4gICAgdGhpcy5jbGFzc2VzID0ge307XG4gICAgdGhpcy5rZXlmcmFtZXMgPSB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgc2hlZXQ6IHRoaXMsXG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBjbGFzc2VzOiB0aGlzLmNsYXNzZXMsXG4gICAgICBrZXlmcmFtZXM6IHRoaXMua2V5ZnJhbWVzXG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9ucy5SZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlciA9IG5ldyBvcHRpb25zLlJlbmRlcmVyKHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMgPSBuZXcgUnVsZUxpc3QodGhpcy5vcHRpb25zKTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICB0aGlzLnJ1bGVzLmFkZChuYW1lLCBzdHlsZXNbbmFtZV0pO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMucHJvY2VzcygpO1xuICB9XG4gIC8qKlxuICAgKiBBdHRhY2ggcmVuZGVyYWJsZSB0byB0aGUgcmVuZGVyIHRyZWUuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFN0eWxlU2hlZXQucHJvdG90eXBlO1xuXG4gIF9wcm90by5hdHRhY2ggPSBmdW5jdGlvbiBhdHRhY2goKSB7XG4gICAgaWYgKHRoaXMuYXR0YWNoZWQpIHJldHVybiB0aGlzO1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB0aGlzLnJlbmRlcmVyLmF0dGFjaCgpO1xuICAgIHRoaXMuYXR0YWNoZWQgPSB0cnVlOyAvLyBPcmRlciBpcyBpbXBvcnRhbnQsIGJlY2F1c2Ugd2UgY2FuJ3QgdXNlIGluc2VydFJ1bGUgQVBJIGlmIHN0eWxlIGVsZW1lbnQgaXMgbm90IGF0dGFjaGVkLlxuXG4gICAgaWYgKCF0aGlzLmRlcGxveWVkKSB0aGlzLmRlcGxveSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgcmVuZGVyYWJsZSBmcm9tIHJlbmRlciB0cmVlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kZXRhY2ggPSBmdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgaWYgKCF0aGlzLmF0dGFjaGVkKSByZXR1cm4gdGhpcztcbiAgICBpZiAodGhpcy5yZW5kZXJlcikgdGhpcy5yZW5kZXJlci5kZXRhY2goKTtcbiAgICB0aGlzLmF0dGFjaGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIHJ1bGUgdG8gdGhlIGN1cnJlbnQgc3R5bGVzaGVldC5cbiAgICogV2lsbCBpbnNlcnQgYSBydWxlIGFsc28gYWZ0ZXIgdGhlIHN0eWxlc2hlZXQgaGFzIGJlZW4gcmVuZGVyZWQgZmlyc3QgdGltZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uYWRkUnVsZSA9IGZ1bmN0aW9uIGFkZFJ1bGUobmFtZSwgZGVjbCwgb3B0aW9ucykge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMucXVldWU7IC8vIFBsdWdpbnMgY2FuIGNyZWF0ZSBydWxlcy5cbiAgICAvLyBJbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgcmlnaHQgb3JkZXIsIHdlIG5lZWQgdG8gcXVldWUgYWxsIGAuYWRkUnVsZWAgY2FsbHMsXG4gICAgLy8gd2hpY2ggaGFwcGVuIGFmdGVyIHRoZSBmaXJzdCBgcnVsZXMuYWRkKClgIGNhbGwuXG5cbiAgICBpZiAodGhpcy5hdHRhY2hlZCAmJiAhcXVldWUpIHRoaXMucXVldWUgPSBbXTtcbiAgICB2YXIgcnVsZSA9IHRoaXMucnVsZXMuYWRkKG5hbWUsIGRlY2wsIG9wdGlvbnMpO1xuICAgIGlmICghcnVsZSkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUocnVsZSk7XG5cbiAgICBpZiAodGhpcy5hdHRhY2hlZCkge1xuICAgICAgaWYgKCF0aGlzLmRlcGxveWVkKSByZXR1cm4gcnVsZTsgLy8gRG9uJ3QgaW5zZXJ0IHJ1bGUgZGlyZWN0bHkgaWYgdGhlcmUgaXMgbm8gc3RyaW5naWZpZWQgdmVyc2lvbiB5ZXQuXG4gICAgICAvLyBJdCB3aWxsIGJlIGluc2VydGVkIGFsbCB0b2dldGhlciB3aGVuIC5hdHRhY2ggaXMgY2FsbGVkLlxuXG4gICAgICBpZiAocXVldWUpIHF1ZXVlLnB1c2gocnVsZSk7ZWxzZSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlKTtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZSkge1xuICAgICAgICAgIHRoaXMucXVldWUuZm9yRWFjaCh0aGlzLmluc2VydFJ1bGUsIHRoaXMpO1xuICAgICAgICAgIHRoaXMucXVldWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBydWxlO1xuICAgIH0gLy8gV2UgY2FuJ3QgYWRkIHJ1bGVzIHRvIGEgZGV0YWNoZWQgc3R5bGUgbm9kZS5cbiAgICAvLyBXZSB3aWxsIHJlZGVwbG95IHRoZSBzaGVldCBvbmNlIHVzZXIgd2lsbCBhdHRhY2ggaXQuXG5cblxuICAgIHRoaXMuZGVwbG95ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuICAvKipcbiAgICogUmVwbGFjZSBhIHJ1bGUgaW4gdGhlIGN1cnJlbnQgc3R5bGVzaGVldC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVwbGFjZVJ1bGUgPSBmdW5jdGlvbiByZXBsYWNlUnVsZShuYW1lT3JTZWxlY3RvciwgZGVjbCwgb3B0aW9ucykge1xuICAgIHZhciBvbGRSdWxlID0gdGhpcy5ydWxlcy5nZXQobmFtZU9yU2VsZWN0b3IpO1xuICAgIGlmICghb2xkUnVsZSkgcmV0dXJuIHRoaXMuYWRkUnVsZShuYW1lT3JTZWxlY3RvciwgZGVjbCwgb3B0aW9ucyk7XG4gICAgdmFyIG5ld1J1bGUgPSB0aGlzLnJ1bGVzLnJlcGxhY2UobmFtZU9yU2VsZWN0b3IsIGRlY2wsIG9wdGlvbnMpO1xuXG4gICAgaWYgKG5ld1J1bGUpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5qc3MucGx1Z2lucy5vblByb2Nlc3NSdWxlKG5ld1J1bGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmF0dGFjaGVkKSB7XG4gICAgICBpZiAoIXRoaXMuZGVwbG95ZWQpIHJldHVybiBuZXdSdWxlOyAvLyBEb24ndCByZXBsYWNlIC8gZGVsZXRlIHJ1bGUgZGlyZWN0bHkgaWYgdGhlcmUgaXMgbm8gc3RyaW5naWZpZWQgdmVyc2lvbiB5ZXQuXG4gICAgICAvLyBJdCB3aWxsIGJlIGluc2VydGVkIGFsbCB0b2dldGhlciB3aGVuIC5hdHRhY2ggaXMgY2FsbGVkLlxuXG4gICAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgICBpZiAoIW5ld1J1bGUpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRlbGV0ZVJ1bGUob2xkUnVsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAob2xkUnVsZS5yZW5kZXJhYmxlKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZXBsYWNlUnVsZShvbGRSdWxlLnJlbmRlcmFibGUsIG5ld1J1bGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdSdWxlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVwbGFjZSBydWxlcyB0byBhIGRldGFjaGVkIHN0eWxlIG5vZGUuXG4gICAgLy8gV2Ugd2lsbCByZWRlcGxveSB0aGUgc2hlZXQgb25jZSB1c2VyIHdpbGwgYXR0YWNoIGl0LlxuXG5cbiAgICB0aGlzLmRlcGxveWVkID0gZmFsc2U7XG4gICAgcmV0dXJuIG5ld1J1bGU7XG4gIH1cbiAgLyoqXG4gICAqIEluc2VydCBydWxlIGludG8gdGhlIFN0eWxlU2hlZXRcbiAgICovXG4gIDtcblxuICBfcHJvdG8uaW5zZXJ0UnVsZSA9IGZ1bmN0aW9uIGluc2VydFJ1bGUocnVsZSkge1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmluc2VydFJ1bGUocnVsZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGFkZCBydWxlcy5cbiAgICogV2lsbCByZW5kZXIgYWxzbyBhZnRlciBTdHlsZSBTaGVldCB3YXMgcmVuZGVyZWQgdGhlIGZpcnN0IHRpbWUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFkZFJ1bGVzID0gZnVuY3Rpb24gYWRkUnVsZXMoc3R5bGVzLCBvcHRpb25zKSB7XG4gICAgdmFyIGFkZGVkID0gW107XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHN0eWxlcykge1xuICAgICAgdmFyIHJ1bGUgPSB0aGlzLmFkZFJ1bGUobmFtZSwgc3R5bGVzW25hbWVdLCBvcHRpb25zKTtcbiAgICAgIGlmIChydWxlKSBhZGRlZC5wdXNoKHJ1bGUpO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRlZDtcbiAgfVxuICAvKipcbiAgICogR2V0IGEgcnVsZSBieSBuYW1lIG9yIHNlbGVjdG9yLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5nZXRSdWxlID0gZnVuY3Rpb24gZ2V0UnVsZShuYW1lT3JTZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLmdldChuYW1lT3JTZWxlY3Rvcik7XG4gIH1cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHJ1bGUgYnkgbmFtZS5cbiAgICogUmV0dXJucyBgdHJ1ZWA6IGlmIHJ1bGUgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBET00uXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmRlbGV0ZVJ1bGUgPSBmdW5jdGlvbiBkZWxldGVSdWxlKG5hbWUpIHtcbiAgICB2YXIgcnVsZSA9IHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JyA/IG5hbWUgOiB0aGlzLnJ1bGVzLmdldChuYW1lKTtcblxuICAgIGlmICghcnVsZSB8fCAvLyBTdHlsZSBzaGVldCB3YXMgY3JlYXRlZCB3aXRob3V0IGxpbms6IHRydWUgYW5kIGF0dGFjaGVkLCBpbiB0aGlzIGNhc2Ugd2VcbiAgICAvLyB3b24ndCBiZSBhYmxlIHRvIHJlbW92ZSB0aGUgQ1NTIHJ1bGUgZnJvbSB0aGUgRE9NLlxuICAgIHRoaXMuYXR0YWNoZWQgJiYgIXJ1bGUucmVuZGVyYWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMucmVtb3ZlKHJ1bGUpO1xuXG4gICAgaWYgKHRoaXMuYXR0YWNoZWQgJiYgcnVsZS5yZW5kZXJhYmxlICYmIHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmRlbGV0ZVJ1bGUocnVsZS5yZW5kZXJhYmxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogR2V0IGluZGV4IG9mIGEgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YocnVsZSkge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLmluZGV4T2YocnVsZSk7XG4gIH1cbiAgLyoqXG4gICAqIERlcGxveSBwdXJlIENTUyBzdHJpbmcgdG8gYSByZW5kZXJhYmxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kZXBsb3kgPSBmdW5jdGlvbiBkZXBsb3koKSB7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHRoaXMucmVuZGVyZXIuZGVwbG95KCk7XG4gICAgdGhpcy5kZXBsb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZnVuY3Rpb24gdmFsdWVzIHdpdGggYSBuZXcgZGF0YS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHZhciBfdGhpcyRydWxlcztcblxuICAgIChfdGhpcyRydWxlcyA9IHRoaXMucnVsZXMpLnVwZGF0ZS5hcHBseShfdGhpcyRydWxlcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgc2luZ2xlIHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVwZGF0ZU9uZSA9IGZ1bmN0aW9uIHVwZGF0ZU9uZShydWxlLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgdGhpcy5ydWxlcy51cGRhdGVPbmUocnVsZSwgZGF0YSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnQgcnVsZXMgdG8gYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlcy50b1N0cmluZyhvcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gU3R5bGVTaGVldDtcbn0oKTtcblxudmFyIFBsdWdpbnNSZWdpc3RyeSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBsdWdpbnNSZWdpc3RyeSgpIHtcbiAgICB0aGlzLnBsdWdpbnMgPSB7XG4gICAgICBpbnRlcm5hbDogW10sXG4gICAgICBleHRlcm5hbDogW11cbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSB7fTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQbHVnaW5zUmVnaXN0cnkucHJvdG90eXBlO1xuXG4gIC8qKlxuICAgKiBDYWxsIGBvbkNyZWF0ZVJ1bGVgIGhvb2tzIGFuZCByZXR1cm4gYW4gb2JqZWN0IGlmIHJldHVybmVkIGJ5IGEgaG9vay5cbiAgICovXG4gIF9wcm90by5vbkNyZWF0ZVJ1bGUgPSBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUobmFtZSwgZGVjbCwgb3B0aW9ucykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpc3RyeS5vbkNyZWF0ZVJ1bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBydWxlID0gdGhpcy5yZWdpc3RyeS5vbkNyZWF0ZVJ1bGVbaV0obmFtZSwgZGVjbCwgb3B0aW9ucyk7XG4gICAgICBpZiAocnVsZSkgcmV0dXJuIHJ1bGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgYG9uUHJvY2Vzc1J1bGVgIGhvb2tzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5vblByb2Nlc3NSdWxlID0gZnVuY3Rpb24gb25Qcm9jZXNzUnVsZShydWxlKSB7XG4gICAgaWYgKHJ1bGUuaXNQcm9jZXNzZWQpIHJldHVybjtcbiAgICB2YXIgc2hlZXQgPSBydWxlLm9wdGlvbnMuc2hlZXQ7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkub25Qcm9jZXNzUnVsZS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5yZWdpc3RyeS5vblByb2Nlc3NSdWxlW2ldKHJ1bGUsIHNoZWV0KTtcbiAgICB9XG5cbiAgICBpZiAocnVsZS5zdHlsZSkgdGhpcy5vblByb2Nlc3NTdHlsZShydWxlLnN0eWxlLCBydWxlLCBzaGVldCk7XG4gICAgcnVsZS5pc1Byb2Nlc3NlZCA9IHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgYG9uUHJvY2Vzc1N0eWxlYCBob29rcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ub25Qcm9jZXNzU3R5bGUgPSBmdW5jdGlvbiBvblByb2Nlc3NTdHlsZShzdHlsZSwgcnVsZSwgc2hlZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkub25Qcm9jZXNzU3R5bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJ1bGUuc3R5bGUgPSB0aGlzLnJlZ2lzdHJ5Lm9uUHJvY2Vzc1N0eWxlW2ldKHJ1bGUuc3R5bGUsIHJ1bGUsIHNoZWV0KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgYG9uUHJvY2Vzc1NoZWV0YCBob29rcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ub25Qcm9jZXNzU2hlZXQgPSBmdW5jdGlvbiBvblByb2Nlc3NTaGVldChzaGVldCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpc3RyeS5vblByb2Nlc3NTaGVldC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5yZWdpc3RyeS5vblByb2Nlc3NTaGVldFtpXShzaGVldCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIGBvblVwZGF0ZWAgaG9va3MuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLm9uVXBkYXRlID0gZnVuY3Rpb24gb25VcGRhdGUoZGF0YSwgcnVsZSwgc2hlZXQsIG9wdGlvbnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkub25VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucmVnaXN0cnkub25VcGRhdGVbaV0oZGF0YSwgcnVsZSwgc2hlZXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ2FsbCBgb25DaGFuZ2VWYWx1ZWAgaG9va3MuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLm9uQ2hhbmdlVmFsdWUgPSBmdW5jdGlvbiBvbkNoYW5nZVZhbHVlKHZhbHVlLCBwcm9wLCBydWxlKSB7XG4gICAgdmFyIHByb2Nlc3NlZFZhbHVlID0gdmFsdWU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkub25DaGFuZ2VWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcHJvY2Vzc2VkVmFsdWUgPSB0aGlzLnJlZ2lzdHJ5Lm9uQ2hhbmdlVmFsdWVbaV0ocHJvY2Vzc2VkVmFsdWUsIHByb3AsIHJ1bGUpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzZWRWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBwbHVnaW4uXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVzZSA9IGZ1bmN0aW9uIHVzZShuZXdQbHVnaW4sIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICBxdWV1ZTogJ2V4dGVybmFsJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcGx1Z2lucyA9IHRoaXMucGx1Z2luc1tvcHRpb25zLnF1ZXVlXTsgLy8gQXZvaWRzIGFwcGx5aW5nIHNhbWUgcGx1Z2luIHR3aWNlLCBhdCBsZWFzdCBiYXNlZCBvbiByZWYuXG5cbiAgICBpZiAocGx1Z2lucy5pbmRleE9mKG5ld1BsdWdpbikgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGx1Z2lucy5wdXNoKG5ld1BsdWdpbik7XG4gICAgdGhpcy5yZWdpc3RyeSA9IFtdLmNvbmNhdCh0aGlzLnBsdWdpbnMuZXh0ZXJuYWwsIHRoaXMucGx1Z2lucy5pbnRlcm5hbCkucmVkdWNlKGZ1bmN0aW9uIChyZWdpc3RyeSwgcGx1Z2luKSB7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIHBsdWdpbikge1xuICAgICAgICBpZiAobmFtZSBpbiByZWdpc3RyeSkge1xuICAgICAgICAgIHJlZ2lzdHJ5W25hbWVdLnB1c2gocGx1Z2luW25hbWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCBcIltKU1NdIFVua25vd24gaG9vayBcXFwiXCIgKyBuYW1lICsgXCJcXFwiLlwiKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgfSwge1xuICAgICAgb25DcmVhdGVSdWxlOiBbXSxcbiAgICAgIG9uUHJvY2Vzc1J1bGU6IFtdLFxuICAgICAgb25Qcm9jZXNzU3R5bGU6IFtdLFxuICAgICAgb25Qcm9jZXNzU2hlZXQ6IFtdLFxuICAgICAgb25DaGFuZ2VWYWx1ZTogW10sXG4gICAgICBvblVwZGF0ZTogW11cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gUGx1Z2luc1JlZ2lzdHJ5O1xufSgpO1xuXG4vKipcbiAqIFNoZWV0cyByZWdpc3RyeSB0byBhY2Nlc3MgYWxsIGluc3RhbmNlcyBpbiBvbmUgcGxhY2UuXG4gKi9cblxudmFyIFNoZWV0c1JlZ2lzdHJ5ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2hlZXRzUmVnaXN0cnkoKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IFtdO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNoZWV0c1JlZ2lzdHJ5LnByb3RvdHlwZTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBTdHlsZSBTaGVldC5cbiAgICovXG4gIF9wcm90by5hZGQgPSBmdW5jdGlvbiBhZGQoc2hlZXQpIHtcbiAgICB2YXIgcmVnaXN0cnkgPSB0aGlzLnJlZ2lzdHJ5O1xuICAgIHZhciBpbmRleCA9IHNoZWV0Lm9wdGlvbnMuaW5kZXg7XG4gICAgaWYgKHJlZ2lzdHJ5LmluZGV4T2Yoc2hlZXQpICE9PSAtMSkgcmV0dXJuO1xuXG4gICAgaWYgKHJlZ2lzdHJ5Lmxlbmd0aCA9PT0gMCB8fCBpbmRleCA+PSB0aGlzLmluZGV4KSB7XG4gICAgICByZWdpc3RyeS5wdXNoKHNoZWV0KTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZpbmQgYSBwb3NpdGlvbi5cblxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyeS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlZ2lzdHJ5W2ldLm9wdGlvbnMuaW5kZXggPiBpbmRleCkge1xuICAgICAgICByZWdpc3RyeS5zcGxpY2UoaSwgMCwgc2hlZXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXNldCB0aGUgcmVnaXN0cnkuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IFtdO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYSBTdHlsZSBTaGVldC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKHNoZWV0KSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5yZWdpc3RyeS5pbmRleE9mKHNoZWV0KTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnQgYWxsIGF0dGFjaGVkIHNoZWV0cyB0byBhIENTUyBzdHJpbmcuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoX3RlbXApIHtcbiAgICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBhdHRhY2hlZCA9IF9yZWYuYXR0YWNoZWQsXG4gICAgICAgIG9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBbXCJhdHRhY2hlZFwiXSk7XG5cbiAgICB2YXIgX2dldFdoaXRlc3BhY2VTeW1ib2xzID0gZ2V0V2hpdGVzcGFjZVN5bWJvbHMob3B0aW9ucyksXG4gICAgICAgIGxpbmVicmVhayA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5saW5lYnJlYWs7XG5cbiAgICB2YXIgY3NzID0gJyc7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzaGVldCA9IHRoaXMucmVnaXN0cnlbaV07XG5cbiAgICAgIGlmIChhdHRhY2hlZCAhPSBudWxsICYmIHNoZWV0LmF0dGFjaGVkICE9PSBhdHRhY2hlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzcykgY3NzICs9IGxpbmVicmVhaztcbiAgICAgIGNzcyArPSBzaGVldC50b1N0cmluZyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3NzO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhTaGVldHNSZWdpc3RyeSwgW3tcbiAgICBrZXk6IFwiaW5kZXhcIixcblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgaGlnaGVzdCBpbmRleCBudW1iZXIuXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5sZW5ndGggPT09IDAgPyAwIDogdGhpcy5yZWdpc3RyeVt0aGlzLnJlZ2lzdHJ5Lmxlbmd0aCAtIDFdLm9wdGlvbnMuaW5kZXg7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNoZWV0c1JlZ2lzdHJ5O1xufSgpO1xuXG4vKipcbiAqIFRoaXMgaXMgYSBnbG9iYWwgc2hlZXRzIHJlZ2lzdHJ5LiBPbmx5IERvbVJlbmRlcmVyIHdpbGwgYWRkIHNoZWV0cyB0byBpdC5cbiAqIE9uIHRoZSBzZXJ2ZXIgb25lIHNob3VsZCB1c2UgYW4gb3duIFNoZWV0c1JlZ2lzdHJ5IGluc3RhbmNlIGFuZCBhZGQgdGhlXG4gKiBzaGVldHMgdG8gaXQsIGJlY2F1c2UgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRvIGNyZWF0ZSBhIG5ldyByZWdpc3RyeSBmb3JcbiAqIGVhY2ggcmVxdWVzdCBpbiBvcmRlciB0byBub3QgbGVhayBzaGVldHMgYWNyb3NzIHJlcXVlc3RzLlxuICovXG5cbnZhciBzaGVldHMgPSBuZXcgU2hlZXRzUmVnaXN0cnkoKTtcblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLyoqXG4gKiBOb3cgdGhhdCBgZ2xvYmFsVGhpc2AgaXMgYXZhaWxhYmxlIG9uIG1vc3QgcGxhdGZvcm1zXG4gKiAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZ2xvYmFsVGhpcyNicm93c2VyX2NvbXBhdGliaWxpdHkpXG4gKiB3ZSBjaGVjayBmb3IgYGdsb2JhbFRoaXNgIGZpcnN0LiBgZ2xvYmFsVGhpc2AgaXMgbmVjZXNzYXJ5IGZvciBqc3NcbiAqIHRvIHJ1biBpbiBBZ29yaWMncyBzZWN1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0IChTRVMpLiBVbmRlciBTRVMsXG4gKiBgZ2xvYmFsVGhpc2AgZXhpc3RzLCBidXQgYHdpbmRvd2AsIGBzZWxmYCwgYW5kIGBGdW5jdGlvbigncmV0dXJuXG4gKiB0aGlzJykoKWAgYXJlIGFsbCB1bmRlZmluZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbiAqL1xudmFyIGdsb2JhbFRoaXMkMSA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PT0gTWF0aCA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxudmFyIG5zID0gJzJmMWFjYzZjM2E2MDZiMDgyZTVlZWY1ZTU0NDE0ZmZiJztcbmlmIChnbG9iYWxUaGlzJDFbbnNdID09IG51bGwpIGdsb2JhbFRoaXMkMVtuc10gPSAwOyAvLyBCdW5kbGUgbWF5IGNvbnRhaW4gbXVsdGlwbGUgSlNTIHZlcnNpb25zIGF0IHRoZSBzYW1lIHRpbWUuIEluIG9yZGVyIHRvIGlkZW50aWZ5XG4vLyB0aGUgY3VycmVudCB2ZXJzaW9uIHdpdGgganVzdCBvbmUgc2hvcnQgbnVtYmVyIGFuZCB1c2UgaXQgZm9yIGNsYXNzZXMgZ2VuZXJhdGlvblxuLy8gd2UgdXNlIGEgY291bnRlci4gQWxzbyBpdCBpcyBtb3JlIGFjY3VyYXRlLCBiZWNhdXNlIHVzZXIgY2FuIG1hbnVhbGx5IHJlZXZhbHVhdGVcbi8vIHRoZSBtb2R1bGUuXG5cbnZhciBtb2R1bGVJZCA9IGdsb2JhbFRoaXMkMVtuc10rKztcblxudmFyIG1heFJ1bGVzID0gMWUxMDtcbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGdlbmVyYXRlcyB1bmlxdWUgY2xhc3MgbmFtZXMgYmFzZWQgb24gY291bnRlcnMuXG4gKiBXaGVuIG5ldyBnZW5lcmF0b3IgZnVuY3Rpb24gaXMgY3JlYXRlZCwgcnVsZSBjb3VudGVyIGlzIHJlc2V0ZWQuXG4gKiBXZSBuZWVkIHRvIHJlc2V0IHRoZSBydWxlIGNvdW50ZXIgZm9yIFNTUiBmb3IgZWFjaCByZXF1ZXN0LlxuICovXG5cbnZhciBjcmVhdGVHZW5lcmF0ZUlkID0gZnVuY3Rpb24gY3JlYXRlR2VuZXJhdGVJZChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgcnVsZUNvdW50ZXIgPSAwO1xuXG4gIHZhciBnZW5lcmF0ZUlkID0gZnVuY3Rpb24gZ2VuZXJhdGVJZChydWxlLCBzaGVldCkge1xuICAgIHJ1bGVDb3VudGVyICs9IDE7XG5cbiAgICBpZiAocnVsZUNvdW50ZXIgPiBtYXhSdWxlcykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBZb3UgbWlnaHQgaGF2ZSBhIG1lbW9yeSBsZWFrLiBSdWxlIGNvdW50ZXIgaXMgYXQgXCIgKyBydWxlQ291bnRlciArIFwiLlwiKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICB2YXIganNzSWQgPSAnJztcbiAgICB2YXIgcHJlZml4ID0gJyc7XG5cbiAgICBpZiAoc2hlZXQpIHtcbiAgICAgIGlmIChzaGVldC5vcHRpb25zLmNsYXNzTmFtZVByZWZpeCkge1xuICAgICAgICBwcmVmaXggPSBzaGVldC5vcHRpb25zLmNsYXNzTmFtZVByZWZpeDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNoZWV0Lm9wdGlvbnMuanNzLmlkICE9IG51bGwpIHtcbiAgICAgICAganNzSWQgPSBTdHJpbmcoc2hlZXQub3B0aW9ucy5qc3MuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1pbmlmeSkge1xuICAgICAgLy8gVXNpbmcgXCJjXCIgYmVjYXVzZSBhIG51bWJlciBjYW4ndCBiZSB0aGUgZmlyc3QgY2hhciBpbiBhIGNsYXNzIG5hbWUuXG4gICAgICByZXR1cm4gXCJcIiArIChwcmVmaXggfHwgJ2MnKSArIG1vZHVsZUlkICsganNzSWQgKyBydWxlQ291bnRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJlZml4ICsgcnVsZS5rZXkgKyBcIi1cIiArIG1vZHVsZUlkICsgKGpzc0lkID8gXCItXCIgKyBqc3NJZCA6ICcnKSArIFwiLVwiICsgcnVsZUNvdW50ZXI7XG4gIH07XG5cbiAgcmV0dXJuIGdlbmVyYXRlSWQ7XG59O1xuXG4vKipcbiAqIENhY2hlIHRoZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCB0aW1lIGEgZnVuY3Rpb24gaXMgY2FsbGVkLlxuICovXG5cbnZhciBtZW1vaXplID0gZnVuY3Rpb24gbWVtb2l6ZShmbikge1xuICB2YXIgdmFsdWU7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF2YWx1ZSkgdmFsdWUgPSBmbigpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn07XG4vKipcbiAqIEdldCBhIHN0eWxlIHByb3BlcnR5IHZhbHVlLlxuICovXG5cblxudmFyIGdldFByb3BlcnR5VmFsdWUgPSBmdW5jdGlvbiBnZXRQcm9wZXJ0eVZhbHVlKGNzc1J1bGUsIHByb3ApIHtcbiAgdHJ5IHtcbiAgICAvLyBTdXBwb3J0IENTU1RPTS5cbiAgICBpZiAoY3NzUnVsZS5hdHRyaWJ1dGVTdHlsZU1hcCkge1xuICAgICAgcmV0dXJuIGNzc1J1bGUuYXR0cmlidXRlU3R5bGVNYXAuZ2V0KHByb3ApO1xuICAgIH1cblxuICAgIHJldHVybiBjc3NSdWxlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUocHJvcCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIElFIG1heSB0aHJvdyBpZiBwcm9wZXJ0eSBpcyB1bmtub3duLlxuICAgIHJldHVybiAnJztcbiAgfVxufTtcbi8qKlxuICogU2V0IGEgc3R5bGUgcHJvcGVydHkuXG4gKi9cblxuXG52YXIgc2V0UHJvcGVydHkgPSBmdW5jdGlvbiBzZXRQcm9wZXJ0eShjc3NSdWxlLCBwcm9wLCB2YWx1ZSkge1xuICB0cnkge1xuICAgIHZhciBjc3NWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjc3NWYWx1ZSA9IHRvQ3NzVmFsdWUodmFsdWUpO1xuICAgIH0gLy8gU3VwcG9ydCBDU1NUT00uXG5cblxuICAgIGlmIChjc3NSdWxlLmF0dHJpYnV0ZVN0eWxlTWFwKSB7XG4gICAgICBjc3NSdWxlLmF0dHJpYnV0ZVN0eWxlTWFwLnNldChwcm9wLCBjc3NWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRleE9mSW1wb3J0YW50RmxhZyA9IGNzc1ZhbHVlID8gY3NzVmFsdWUuaW5kZXhPZignIWltcG9ydGFudCcpIDogLTE7XG4gICAgICB2YXIgY3NzVmFsdWVXaXRob3V0SW1wb3J0YW50RmxhZyA9IGluZGV4T2ZJbXBvcnRhbnRGbGFnID4gLTEgPyBjc3NWYWx1ZS5zdWJzdHIoMCwgaW5kZXhPZkltcG9ydGFudEZsYWcgLSAxKSA6IGNzc1ZhbHVlO1xuICAgICAgY3NzUnVsZS5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wLCBjc3NWYWx1ZVdpdGhvdXRJbXBvcnRhbnRGbGFnLCBpbmRleE9mSW1wb3J0YW50RmxhZyA+IC0xID8gJ2ltcG9ydGFudCcgOiAnJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBJRSBtYXkgdGhyb3cgaWYgcHJvcGVydHkgaXMgdW5rbm93bi5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbiAqIFJlbW92ZSBhIHN0eWxlIHByb3BlcnR5LlxuICovXG5cblxudmFyIHJlbW92ZVByb3BlcnR5ID0gZnVuY3Rpb24gcmVtb3ZlUHJvcGVydHkoY3NzUnVsZSwgcHJvcCkge1xuICB0cnkge1xuICAgIC8vIFN1cHBvcnQgQ1NTVE9NLlxuICAgIGlmIChjc3NSdWxlLmF0dHJpYnV0ZVN0eWxlTWFwKSB7XG4gICAgICBjc3NSdWxlLmF0dHJpYnV0ZVN0eWxlTWFwLmRlbGV0ZShwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3NzUnVsZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsIFwiW0pTU10gRE9NRXhjZXB0aW9uIFxcXCJcIiArIGVyci5tZXNzYWdlICsgXCJcXFwiIHdhcyB0aHJvd24uIFRyaWVkIHRvIHJlbW92ZSBwcm9wZXJ0eSBcXFwiXCIgKyBwcm9wICsgXCJcXFwiLlwiKSA6IHZvaWQgMDtcbiAgfVxufTtcbi8qKlxuICogU2V0IHRoZSBzZWxlY3Rvci5cbiAqL1xuXG5cbnZhciBzZXRTZWxlY3RvciA9IGZ1bmN0aW9uIHNldFNlbGVjdG9yKGNzc1J1bGUsIHNlbGVjdG9yVGV4dCkge1xuICBjc3NSdWxlLnNlbGVjdG9yVGV4dCA9IHNlbGVjdG9yVGV4dDsgLy8gUmV0dXJuIGZhbHNlIGlmIHNldHRlciB3YXMgbm90IHN1Y2Nlc3NmdWwuXG4gIC8vIEN1cnJlbnRseSB3b3JrcyBpbiBjaHJvbWUgb25seS5cblxuICByZXR1cm4gY3NzUnVsZS5zZWxlY3RvclRleHQgPT09IHNlbGVjdG9yVGV4dDtcbn07XG4vKipcbiAqIEdldHMgdGhlIGBoZWFkYCBlbGVtZW50IHVwb24gdGhlIGZpcnN0IGNhbGwgYW5kIGNhY2hlcyBpdC5cbiAqIFdlIGFzc3VtZSBpdCBjYW4ndCBiZSBudWxsLlxuICovXG5cblxudmFyIGdldEhlYWQgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKTtcbn0pO1xuLyoqXG4gKiBGaW5kIGF0dGFjaGVkIHNoZWV0IHdpdGggYW4gaW5kZXggaGlnaGVyIHRoYW4gdGhlIHBhc3NlZCBvbmUuXG4gKi9cblxuZnVuY3Rpb24gZmluZEhpZ2hlclNoZWV0KHJlZ2lzdHJ5LCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVnaXN0cnkubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc2hlZXQgPSByZWdpc3RyeVtpXTtcblxuICAgIGlmIChzaGVldC5hdHRhY2hlZCAmJiBzaGVldC5vcHRpb25zLmluZGV4ID4gb3B0aW9ucy5pbmRleCAmJiBzaGVldC5vcHRpb25zLmluc2VydGlvblBvaW50ID09PSBvcHRpb25zLmluc2VydGlvblBvaW50KSB7XG4gICAgICByZXR1cm4gc2hlZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEZpbmQgYXR0YWNoZWQgc2hlZXQgd2l0aCB0aGUgaGlnaGVzdCBpbmRleC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGZpbmRIaWdoZXN0U2hlZXQocmVnaXN0cnksIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIgaSA9IHJlZ2lzdHJ5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHNoZWV0ID0gcmVnaXN0cnlbaV07XG5cbiAgICBpZiAoc2hlZXQuYXR0YWNoZWQgJiYgc2hlZXQub3B0aW9ucy5pbnNlcnRpb25Qb2ludCA9PT0gb3B0aW9ucy5pbnNlcnRpb25Qb2ludCkge1xuICAgICAgcmV0dXJuIHNoZWV0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBGaW5kIGEgY29tbWVudCB3aXRoIFwianNzXCIgaW5zaWRlLlxuICovXG5cblxuZnVuY3Rpb24gZmluZENvbW1lbnROb2RlKHRleHQpIHtcbiAgdmFyIGhlYWQgPSBnZXRIZWFkKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IGhlYWQuY2hpbGROb2Rlc1tpXTtcblxuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PT0gdGV4dCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEZpbmQgYSBub2RlIGJlZm9yZSB3aGljaCB3ZSBjYW4gaW5zZXJ0IHRoZSBzaGVldC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGZpbmRQcmV2Tm9kZShvcHRpb25zKSB7XG4gIHZhciByZWdpc3RyeSA9IHNoZWV0cy5yZWdpc3RyeTtcblxuICBpZiAocmVnaXN0cnkubGVuZ3RoID4gMCkge1xuICAgIC8vIFRyeSB0byBpbnNlcnQgYmVmb3JlIHRoZSBuZXh0IGhpZ2hlciBzaGVldC5cbiAgICB2YXIgc2hlZXQgPSBmaW5kSGlnaGVyU2hlZXQocmVnaXN0cnksIG9wdGlvbnMpO1xuXG4gICAgaWYgKHNoZWV0ICYmIHNoZWV0LnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJlbnQ6IHNoZWV0LnJlbmRlcmVyLmVsZW1lbnQucGFyZW50Tm9kZSxcbiAgICAgICAgbm9kZTogc2hlZXQucmVuZGVyZXIuZWxlbWVudFxuICAgICAgfTtcbiAgICB9IC8vIE90aGVyd2lzZSBpbnNlcnQgYWZ0ZXIgdGhlIGxhc3QgYXR0YWNoZWQuXG5cblxuICAgIHNoZWV0ID0gZmluZEhpZ2hlc3RTaGVldChyZWdpc3RyeSwgb3B0aW9ucyk7XG5cbiAgICBpZiAoc2hlZXQgJiYgc2hlZXQucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmVudDogc2hlZXQucmVuZGVyZXIuZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgICBub2RlOiBzaGVldC5yZW5kZXJlci5lbGVtZW50Lm5leHRTaWJsaW5nXG4gICAgICB9O1xuICAgIH1cbiAgfSAvLyBUcnkgdG8gZmluZCBhIGNvbW1lbnQgcGxhY2Vob2xkZXIgaWYgcmVnaXN0cnkgaXMgZW1wdHkuXG5cblxuICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBvcHRpb25zLmluc2VydGlvblBvaW50O1xuXG4gIGlmIChpbnNlcnRpb25Qb2ludCAmJiB0eXBlb2YgaW5zZXJ0aW9uUG9pbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIGNvbW1lbnQgPSBmaW5kQ29tbWVudE5vZGUoaW5zZXJ0aW9uUG9pbnQpO1xuXG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmVudDogY29tbWVudC5wYXJlbnROb2RlLFxuICAgICAgICBub2RlOiBjb21tZW50Lm5leHRTaWJsaW5nXG4gICAgICB9O1xuICAgIH0gLy8gSWYgdXNlciBzcGVjaWZpZXMgYW4gaW5zZXJ0aW9uIHBvaW50IGFuZCBpdCBjYW4ndCBiZSBmb3VuZCBpbiB0aGUgZG9jdW1lbnQgLVxuICAgIC8vIGJhZCBzcGVjaWZpY2l0eSBpc3N1ZXMgbWF5IGFwcGVhci5cblxuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBJbnNlcnRpb24gcG9pbnQgXFxcIlwiICsgaW5zZXJ0aW9uUG9pbnQgKyBcIlxcXCIgbm90IGZvdW5kLlwiKSA6IHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogSW5zZXJ0IHN0eWxlIGVsZW1lbnQgaW50byB0aGUgRE9NLlxuICovXG5cblxuZnVuY3Rpb24gaW5zZXJ0U3R5bGUoc3R5bGUsIG9wdGlvbnMpIHtcbiAgdmFyIGluc2VydGlvblBvaW50ID0gb3B0aW9ucy5pbnNlcnRpb25Qb2ludDtcbiAgdmFyIG5leHROb2RlID0gZmluZFByZXZOb2RlKG9wdGlvbnMpO1xuXG4gIGlmIChuZXh0Tm9kZSAhPT0gZmFsc2UgJiYgbmV4dE5vZGUucGFyZW50KSB7XG4gICAgbmV4dE5vZGUucGFyZW50Lmluc2VydEJlZm9yZShzdHlsZSwgbmV4dE5vZGUubm9kZSk7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdvcmtzIHdpdGggaWZyYW1lcyBhbmQgYW55IG5vZGUgdHlwZXMuXG5cblxuICBpZiAoaW5zZXJ0aW9uUG9pbnQgJiYgdHlwZW9mIGluc2VydGlvblBvaW50Lm5vZGVUeXBlID09PSAnbnVtYmVyJykge1xuICAgIHZhciBpbnNlcnRpb25Qb2ludEVsZW1lbnQgPSBpbnNlcnRpb25Qb2ludDtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IGluc2VydGlvblBvaW50RWxlbWVudC5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlKSBwYXJlbnROb2RlLmluc2VydEJlZm9yZShzdHlsZSwgaW5zZXJ0aW9uUG9pbnRFbGVtZW50Lm5leHRTaWJsaW5nKTtlbHNlIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsICdbSlNTXSBJbnNlcnRpb24gcG9pbnQgaXMgbm90IGluIHRoZSBET00uJykgOiB2b2lkIDA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZ2V0SGVhZCgpLmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbi8qKlxuICogUmVhZCBqc3Mgbm9uY2Ugc2V0dGluZyBmcm9tIHRoZSBwYWdlIGlmIHRoZSB1c2VyIGhhcyBzZXQgaXQuXG4gKi9cblxuXG52YXIgZ2V0Tm9uY2UgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW3Byb3BlcnR5PVwiY3NwLW5vbmNlXCJdJyk7XG4gIHJldHVybiBub2RlID8gbm9kZS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSA6IG51bGw7XG59KTtcblxudmFyIF9pbnNlcnRSdWxlID0gZnVuY3Rpb24gaW5zZXJ0UnVsZShjb250YWluZXIsIHJ1bGUsIGluZGV4KSB7XG4gIHRyeSB7XG4gICAgaWYgKCdpbnNlcnRSdWxlJyBpbiBjb250YWluZXIpIHtcbiAgICAgIGNvbnRhaW5lci5pbnNlcnRSdWxlKHJ1bGUsIGluZGV4KTtcbiAgICB9IC8vIEtleWZyYW1lcyBydWxlLlxuICAgIGVsc2UgaWYgKCdhcHBlbmRSdWxlJyBpbiBjb250YWluZXIpIHtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZFJ1bGUocnVsZSk7XG4gICAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsIFwiW0pTU10gXCIgKyBlcnIubWVzc2FnZSkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRhaW5lci5jc3NSdWxlc1tpbmRleF07XG59O1xuXG52YXIgZ2V0VmFsaWRSdWxlSW5zZXJ0aW9uSW5kZXggPSBmdW5jdGlvbiBnZXRWYWxpZFJ1bGVJbnNlcnRpb25JbmRleChjb250YWluZXIsIGluZGV4KSB7XG4gIHZhciBtYXhJbmRleCA9IGNvbnRhaW5lci5jc3NSdWxlcy5sZW5ndGg7IC8vIEluIGNhc2UgcHJldmlvdXMgaW5zZXJ0aW9uIGZhaWxzLCBwYXNzZWQgaW5kZXggbWlnaHQgYmUgd3JvbmdcblxuICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA+IG1heEluZGV4KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgcmV0dXJuIG1heEluZGV4O1xuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufTtcblxudmFyIGNyZWF0ZVN0eWxlID0gZnVuY3Rpb24gY3JlYXRlU3R5bGUoKSB7XG4gIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7IC8vIFdpdGhvdXQgaXQsIElFIHdpbGwgaGF2ZSBhIGJyb2tlbiBzb3VyY2Ugb3JkZXIgc3BlY2lmaWNpdHkgaWYgd2VcbiAgLy8gaW5zZXJ0IHJ1bGVzIGFmdGVyIHdlIGluc2VydCB0aGUgc3R5bGUgdGFnLlxuICAvLyBJdCBzZWVtcyB0byBraWNrLW9mZiB0aGUgc291cmNlIG9yZGVyIHNwZWNpZmljaXR5IGFsZ29yaXRobS5cblxuICBlbC50ZXh0Q29udGVudCA9ICdcXG4nO1xuICByZXR1cm4gZWw7XG59O1xuXG52YXIgRG9tUmVuZGVyZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvLyBXaWxsIGJlIGVtcHR5IGlmIGxpbms6IHRydWUgb3B0aW9uIGlzIG5vdCBzZXQsIGJlY2F1c2VcbiAgLy8gaXQgaXMgb25seSBmb3IgdXNlIHRvZ2V0aGVyIHdpdGggaW5zZXJ0UnVsZSBBUEkuXG4gIGZ1bmN0aW9uIERvbVJlbmRlcmVyKHNoZWV0KSB7XG4gICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlID0gZ2V0UHJvcGVydHlWYWx1ZTtcbiAgICB0aGlzLnNldFByb3BlcnR5ID0gc2V0UHJvcGVydHk7XG4gICAgdGhpcy5yZW1vdmVQcm9wZXJ0eSA9IHJlbW92ZVByb3BlcnR5O1xuICAgIHRoaXMuc2V0U2VsZWN0b3IgPSBzZXRTZWxlY3RvcjtcbiAgICB0aGlzLmhhc0luc2VydGVkUnVsZXMgPSBmYWxzZTtcbiAgICB0aGlzLmNzc1J1bGVzID0gW107XG4gICAgLy8gVGhlcmUgaXMgbm8gc2hlZXQgd2hlbiB0aGUgcmVuZGVyZXIgaXMgdXNlZCBmcm9tIGEgc3RhbmRhbG9uZSBTdHlsZVJ1bGUuXG4gICAgaWYgKHNoZWV0KSBzaGVldHMuYWRkKHNoZWV0KTtcbiAgICB0aGlzLnNoZWV0ID0gc2hlZXQ7XG5cbiAgICB2YXIgX3JlZiA9IHRoaXMuc2hlZXQgPyB0aGlzLnNoZWV0Lm9wdGlvbnMgOiB7fSxcbiAgICAgICAgbWVkaWEgPSBfcmVmLm1lZGlhLFxuICAgICAgICBtZXRhID0gX3JlZi5tZXRhLFxuICAgICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50O1xuXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudCB8fCBjcmVhdGVTdHlsZSgpO1xuICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtanNzJywgJycpO1xuICAgIGlmIChtZWRpYSkgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnbWVkaWEnLCBtZWRpYSk7XG4gICAgaWYgKG1ldGEpIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWV0YScsIG1ldGEpO1xuICAgIHZhciBub25jZSA9IGdldE5vbmNlKCk7XG4gICAgaWYgKG5vbmNlKSB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTtcbiAgfVxuICAvKipcbiAgICogSW5zZXJ0IHN0eWxlIGVsZW1lbnQgaW50byByZW5kZXIgdHJlZS5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gRG9tUmVuZGVyZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5hdHRhY2ggPSBmdW5jdGlvbiBhdHRhY2goKSB7XG4gICAgLy8gSW4gdGhlIGNhc2UgdGhlIGVsZW1lbnQgbm9kZSBpcyBleHRlcm5hbCBhbmQgaXQgaXMgYWxyZWFkeSBpbiB0aGUgRE9NLlxuICAgIGlmICh0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSB8fCAhdGhpcy5zaGVldCkgcmV0dXJuO1xuICAgIGluc2VydFN0eWxlKHRoaXMuZWxlbWVudCwgdGhpcy5zaGVldC5vcHRpb25zKTsgLy8gV2hlbiBydWxlcyBhcmUgaW5zZXJ0ZWQgdXNpbmcgYGluc2VydFJ1bGVgIEFQSSwgYWZ0ZXIgYHNoZWV0LmRldGFjaCgpLmF0dGFjaCgpYFxuICAgIC8vIG1vc3QgYnJvd3NlcnMgY3JlYXRlIGEgbmV3IENTU1N0eWxlU2hlZXQsIGV4Y2VwdCBvZiBhbGwgSUVzLlxuXG4gICAgdmFyIGRlcGxveWVkID0gQm9vbGVhbih0aGlzLnNoZWV0ICYmIHRoaXMuc2hlZXQuZGVwbG95ZWQpO1xuXG4gICAgaWYgKHRoaXMuaGFzSW5zZXJ0ZWRSdWxlcyAmJiBkZXBsb3llZCkge1xuICAgICAgdGhpcy5oYXNJbnNlcnRlZFJ1bGVzID0gZmFsc2U7XG4gICAgICB0aGlzLmRlcGxveSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIHN0eWxlIGVsZW1lbnQgZnJvbSByZW5kZXIgdHJlZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZGV0YWNoID0gZnVuY3Rpb24gZGV0YWNoKCkge1xuICAgIGlmICghdGhpcy5zaGVldCkgcmV0dXJuO1xuICAgIHZhciBwYXJlbnROb2RlID0gdGhpcy5lbGVtZW50LnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUpIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50KTsgLy8gSW4gdGhlIG1vc3QgYnJvd3NlcnMsIHJ1bGVzIGluc2VydGVkIHVzaW5nIGluc2VydFJ1bGUoKSBBUEkgd2lsbCBiZSBsb3N0IHdoZW4gc3R5bGUgZWxlbWVudCBpcyByZW1vdmVkLlxuICAgIC8vIFRob3VnaCBJRSB3aWxsIGtlZXAgdGhlbSBhbmQgd2UgbmVlZCBhIGNvbnNpc3RlbnQgYmVoYXZpb3IuXG5cbiAgICBpZiAodGhpcy5zaGVldC5vcHRpb25zLmxpbmspIHtcbiAgICAgIHRoaXMuY3NzUnVsZXMgPSBbXTtcbiAgICAgIHRoaXMuZWxlbWVudC50ZXh0Q29udGVudCA9ICdcXG4nO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSW5qZWN0IENTUyBzdHJpbmcgaW50byBlbGVtZW50LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kZXBsb3kgPSBmdW5jdGlvbiBkZXBsb3koKSB7XG4gICAgdmFyIHNoZWV0ID0gdGhpcy5zaGVldDtcbiAgICBpZiAoIXNoZWV0KSByZXR1cm47XG5cbiAgICBpZiAoc2hlZXQub3B0aW9ucy5saW5rKSB7XG4gICAgICB0aGlzLmluc2VydFJ1bGVzKHNoZWV0LnJ1bGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnQudGV4dENvbnRlbnQgPSBcIlxcblwiICsgc2hlZXQudG9TdHJpbmcoKSArIFwiXFxuXCI7XG4gIH1cbiAgLyoqXG4gICAqIEluc2VydCBSdWxlTGlzdCBpbnRvIGFuIGVsZW1lbnQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmluc2VydFJ1bGVzID0gZnVuY3Rpb24gaW5zZXJ0UnVsZXMocnVsZXMsIG5hdGl2ZVBhcmVudCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMuaW5kZXgubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlcy5pbmRleFtpXSwgaSwgbmF0aXZlUGFyZW50KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEluc2VydCBhIHJ1bGUgaW50byBlbGVtZW50LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pbnNlcnRSdWxlID0gZnVuY3Rpb24gaW5zZXJ0UnVsZShydWxlLCBpbmRleCwgbmF0aXZlUGFyZW50KSB7XG4gICAgaWYgKG5hdGl2ZVBhcmVudCA9PT0gdm9pZCAwKSB7XG4gICAgICBuYXRpdmVQYXJlbnQgPSB0aGlzLmVsZW1lbnQuc2hlZXQ7XG4gICAgfVxuXG4gICAgaWYgKHJ1bGUucnVsZXMpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBydWxlO1xuICAgICAgdmFyIGxhdGVzdE5hdGl2ZVBhcmVudCA9IG5hdGl2ZVBhcmVudDtcblxuICAgICAgaWYgKHJ1bGUudHlwZSA9PT0gJ2NvbmRpdGlvbmFsJyB8fCBydWxlLnR5cGUgPT09ICdrZXlmcmFtZXMnKSB7XG4gICAgICAgIHZhciBfaW5zZXJ0aW9uSW5kZXggPSBnZXRWYWxpZFJ1bGVJbnNlcnRpb25JbmRleChuYXRpdmVQYXJlbnQsIGluZGV4KTsgLy8gV2UgbmVlZCB0byByZW5kZXIgdGhlIGNvbnRhaW5lciB3aXRob3V0IGNoaWxkcmVuIGZpcnN0LlxuXG5cbiAgICAgICAgbGF0ZXN0TmF0aXZlUGFyZW50ID0gX2luc2VydFJ1bGUobmF0aXZlUGFyZW50LCBwYXJlbnQudG9TdHJpbmcoe1xuICAgICAgICAgIGNoaWxkcmVuOiBmYWxzZVxuICAgICAgICB9KSwgX2luc2VydGlvbkluZGV4KTtcblxuICAgICAgICBpZiAobGF0ZXN0TmF0aXZlUGFyZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmQ3NzUnVsZShydWxlLCBfaW5zZXJ0aW9uSW5kZXgsIGxhdGVzdE5hdGl2ZVBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5zZXJ0UnVsZXMocGFyZW50LnJ1bGVzLCBsYXRlc3ROYXRpdmVQYXJlbnQpO1xuICAgICAgcmV0dXJuIGxhdGVzdE5hdGl2ZVBhcmVudDtcbiAgICB9XG5cbiAgICB2YXIgcnVsZVN0ciA9IHJ1bGUudG9TdHJpbmcoKTtcbiAgICBpZiAoIXJ1bGVTdHIpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgaW5zZXJ0aW9uSW5kZXggPSBnZXRWYWxpZFJ1bGVJbnNlcnRpb25JbmRleChuYXRpdmVQYXJlbnQsIGluZGV4KTtcblxuICAgIHZhciBuYXRpdmVSdWxlID0gX2luc2VydFJ1bGUobmF0aXZlUGFyZW50LCBydWxlU3RyLCBpbnNlcnRpb25JbmRleCk7XG5cbiAgICBpZiAobmF0aXZlUnVsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmhhc0luc2VydGVkUnVsZXMgPSB0cnVlO1xuICAgIHRoaXMucmVmQ3NzUnVsZShydWxlLCBpbnNlcnRpb25JbmRleCwgbmF0aXZlUnVsZSk7XG4gICAgcmV0dXJuIG5hdGl2ZVJ1bGU7XG4gIH07XG5cbiAgX3Byb3RvLnJlZkNzc1J1bGUgPSBmdW5jdGlvbiByZWZDc3NSdWxlKHJ1bGUsIGluZGV4LCBjc3NSdWxlKSB7XG4gICAgcnVsZS5yZW5kZXJhYmxlID0gY3NzUnVsZTsgLy8gV2Ugb25seSB3YW50IHRvIHJlZmVyZW5jZSB0aGUgdG9wIGxldmVsIHJ1bGVzLCBkZWxldGVSdWxlIEFQSSBkb2Vzbid0IHN1cHBvcnQgcmVtb3ZpbmcgbmVzdGVkIHJ1bGVzXG4gICAgLy8gbGlrZSBydWxlcyBpbnNpZGUgbWVkaWEgcXVlcmllcyBvciBrZXlmcmFtZXNcblxuICAgIGlmIChydWxlLm9wdGlvbnMucGFyZW50IGluc3RhbmNlb2YgU3R5bGVTaGVldCkge1xuICAgICAgdGhpcy5jc3NSdWxlcy5zcGxpY2UoaW5kZXgsIDAsIGNzc1J1bGUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRGVsZXRlIGEgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZGVsZXRlUnVsZSA9IGZ1bmN0aW9uIGRlbGV0ZVJ1bGUoY3NzUnVsZSkge1xuICAgIHZhciBzaGVldCA9IHRoaXMuZWxlbWVudC5zaGVldDtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4T2YoY3NzUnVsZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgIHNoZWV0LmRlbGV0ZVJ1bGUoaW5kZXgpO1xuICAgIHRoaXMuY3NzUnVsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogR2V0IGluZGV4IG9mIGEgQ1NTIFJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKGNzc1J1bGUpIHtcbiAgICByZXR1cm4gdGhpcy5jc3NSdWxlcy5pbmRleE9mKGNzc1J1bGUpO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyBDU1MgcnVsZSBhbmQgcmVwbGFjZSB0aGUgZXhpc3Rpbmcgb25lLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZXBsYWNlUnVsZSA9IGZ1bmN0aW9uIHJlcGxhY2VSdWxlKGNzc1J1bGUsIHJ1bGUpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4T2YoY3NzUnVsZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuZWxlbWVudC5zaGVldC5kZWxldGVSdWxlKGluZGV4KTtcbiAgICB0aGlzLmNzc1J1bGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0UnVsZShydWxlLCBpbmRleCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhbGwgcnVsZXMgZWxlbWVudHMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdldFJ1bGVzID0gZnVuY3Rpb24gZ2V0UnVsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5zaGVldC5jc3NSdWxlcztcbiAgfTtcblxuICByZXR1cm4gRG9tUmVuZGVyZXI7XG59KCk7XG5cbnZhciBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuXG52YXIgSnNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSnNzKG9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gaW5zdGFuY2VDb3VudGVyKys7XG4gICAgdGhpcy52ZXJzaW9uID0gXCIxMC4xMC4wXCI7XG4gICAgdGhpcy5wbHVnaW5zID0gbmV3IFBsdWdpbnNSZWdpc3RyeSgpO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGlkOiB7XG4gICAgICAgIG1pbmlmeTogZmFsc2VcbiAgICAgIH0sXG4gICAgICBjcmVhdGVHZW5lcmF0ZUlkOiBjcmVhdGVHZW5lcmF0ZUlkLFxuICAgICAgUmVuZGVyZXI6IGlzSW5Ccm93c2VyID8gRG9tUmVuZGVyZXIgOiBudWxsLFxuICAgICAgcGx1Z2luczogW11cbiAgICB9O1xuICAgIHRoaXMuZ2VuZXJhdGVJZCA9IGNyZWF0ZUdlbmVyYXRlSWQoe1xuICAgICAgbWluaWZ5OiBmYWxzZVxuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBsdWdpbnMudXNlKHBsdWdpbnNbaV0sIHtcbiAgICAgICAgcXVldWU6ICdpbnRlcm5hbCdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2V0dXAob3B0aW9ucyk7XG4gIH1cbiAgLyoqXG4gICAqIFByZXBhcmVzIHZhcmlvdXMgb3B0aW9ucywgYXBwbGllcyBwbHVnaW5zLlxuICAgKiBTaG91bGQgbm90IGJlIHVzZWQgdHdpY2Ugb24gdGhlIHNhbWUgaW5zdGFuY2UsIGJlY2F1c2UgdGhlcmUgaXMgbm8gcGx1Z2luc1xuICAgKiBkZWR1cGxpY2F0aW9uIGxvZ2ljLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBKc3MucHJvdG90eXBlO1xuXG4gIF9wcm90by5zZXR1cCA9IGZ1bmN0aW9uIHNldHVwKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuY3JlYXRlR2VuZXJhdGVJZCkge1xuICAgICAgdGhpcy5vcHRpb25zLmNyZWF0ZUdlbmVyYXRlSWQgPSBvcHRpb25zLmNyZWF0ZUdlbmVyYXRlSWQ7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5pZCA9IF9leHRlbmRzKHt9LCB0aGlzLm9wdGlvbnMuaWQsIG9wdGlvbnMuaWQpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNyZWF0ZUdlbmVyYXRlSWQgfHwgb3B0aW9ucy5pZCkge1xuICAgICAgdGhpcy5nZW5lcmF0ZUlkID0gdGhpcy5vcHRpb25zLmNyZWF0ZUdlbmVyYXRlSWQodGhpcy5vcHRpb25zLmlkKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pbnNlcnRpb25Qb2ludCAhPSBudWxsKSB0aGlzLm9wdGlvbnMuaW5zZXJ0aW9uUG9pbnQgPSBvcHRpb25zLmluc2VydGlvblBvaW50O1xuXG4gICAgaWYgKCdSZW5kZXJlcicgaW4gb3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zLlJlbmRlcmVyID0gb3B0aW9ucy5SZW5kZXJlcjtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItc3ByZWFkXG5cblxuICAgIGlmIChvcHRpb25zLnBsdWdpbnMpIHRoaXMudXNlLmFwcGx5KHRoaXMsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFN0eWxlIFNoZWV0LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5jcmVhdGVTdHlsZVNoZWV0ID0gZnVuY3Rpb24gY3JlYXRlU3R5bGVTaGVldChzdHlsZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgICAgaW5kZXggPSBfb3B0aW9ucy5pbmRleDtcblxuICAgIGlmICh0eXBlb2YgaW5kZXggIT09ICdudW1iZXInKSB7XG4gICAgICBpbmRleCA9IHNoZWV0cy5pbmRleCA9PT0gMCA/IDAgOiBzaGVldHMuaW5kZXggKyAxO1xuICAgIH1cblxuICAgIHZhciBzaGVldCA9IG5ldyBTdHlsZVNoZWV0KHN0eWxlcywgX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIGpzczogdGhpcyxcbiAgICAgIGdlbmVyYXRlSWQ6IG9wdGlvbnMuZ2VuZXJhdGVJZCB8fCB0aGlzLmdlbmVyYXRlSWQsXG4gICAgICBpbnNlcnRpb25Qb2ludDogdGhpcy5vcHRpb25zLmluc2VydGlvblBvaW50LFxuICAgICAgUmVuZGVyZXI6IHRoaXMub3B0aW9ucy5SZW5kZXJlcixcbiAgICAgIGluZGV4OiBpbmRleFxuICAgIH0pKTtcbiAgICB0aGlzLnBsdWdpbnMub25Qcm9jZXNzU2hlZXQoc2hlZXQpO1xuICAgIHJldHVybiBzaGVldDtcbiAgfVxuICAvKipcbiAgICogRGV0YWNoIHRoZSBTdHlsZSBTaGVldCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZW1vdmVTdHlsZVNoZWV0ID0gZnVuY3Rpb24gcmVtb3ZlU3R5bGVTaGVldChzaGVldCkge1xuICAgIHNoZWV0LmRldGFjaCgpO1xuICAgIHNoZWV0cy5yZW1vdmUoc2hlZXQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBydWxlIHdpdGhvdXQgYSBTdHlsZSBTaGVldC5cbiAgICogW0RlcHJlY2F0ZWRdIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5jcmVhdGVSdWxlID0gZnVuY3Rpb24gY3JlYXRlUnVsZSQxKG5hbWUsIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgaWYgKHN0eWxlID09PSB2b2lkIDApIHtcbiAgICAgIHN0eWxlID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIEVuYWJsZSBydWxlIHdpdGhvdXQgbmFtZSBmb3IgaW5saW5lIHN0eWxlcy5cbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVSdWxlKHVuZGVmaW5lZCwgbmFtZSwgc3R5bGUpO1xuICAgIH1cblxuICAgIHZhciBydWxlT3B0aW9ucyA9IF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAganNzOiB0aGlzLFxuICAgICAgUmVuZGVyZXI6IHRoaXMub3B0aW9ucy5SZW5kZXJlclxuICAgIH0pO1xuXG4gICAgaWYgKCFydWxlT3B0aW9ucy5nZW5lcmF0ZUlkKSBydWxlT3B0aW9ucy5nZW5lcmF0ZUlkID0gdGhpcy5nZW5lcmF0ZUlkO1xuICAgIGlmICghcnVsZU9wdGlvbnMuY2xhc3NlcykgcnVsZU9wdGlvbnMuY2xhc3NlcyA9IHt9O1xuICAgIGlmICghcnVsZU9wdGlvbnMua2V5ZnJhbWVzKSBydWxlT3B0aW9ucy5rZXlmcmFtZXMgPSB7fTtcblxuICAgIHZhciBydWxlID0gY3JlYXRlUnVsZShuYW1lLCBzdHlsZSwgcnVsZU9wdGlvbnMpO1xuXG4gICAgaWYgKHJ1bGUpIHRoaXMucGx1Z2lucy5vblByb2Nlc3NSdWxlKHJ1bGUpO1xuICAgIHJldHVybiBydWxlO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBwbHVnaW4uIFBhc3NlZCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgd2l0aCBhIHJ1bGUgaW5zdGFuY2UuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVzZSA9IGZ1bmN0aW9uIHVzZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHBsdWdpbnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBwbHVnaW5zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICBfdGhpcy5wbHVnaW5zLnVzZShwbHVnaW4pO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHJldHVybiBKc3M7XG59KCk7XG5cbnZhciBjcmVhdGVKc3MgPSBmdW5jdGlvbiBjcmVhdGVKc3Mob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEpzcyhvcHRpb25zKTtcbn07XG5cbi8qKlxuICogU2hlZXRzTWFuYWdlciBpcyBsaWtlIGEgV2Vha01hcCB3aGljaCBpcyBkZXNpZ25lZCB0byBjb3VudCBTdHlsZVNoZWV0XG4gKiBpbnN0YW5jZXMgYW5kIGF0dGFjaC9kZXRhY2ggYXV0b21hdGljYWxseS5cbiAqIFVzZWQgaW4gcmVhY3QtanNzLlxuICovXG5cbnZhciBTaGVldHNNYW5hZ2VyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2hlZXRzTWFuYWdlcigpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5zaGVldHMgPSBuZXcgV2Vha01hcCgpO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNoZWV0c01hbmFnZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5zaGVldHMuZ2V0KGtleSk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnNoZWV0O1xuICB9O1xuXG4gIF9wcm90by5hZGQgPSBmdW5jdGlvbiBhZGQoa2V5LCBzaGVldCkge1xuICAgIGlmICh0aGlzLnNoZWV0cy5oYXMoa2V5KSkgcmV0dXJuO1xuICAgIHRoaXMubGVuZ3RoKys7XG4gICAgdGhpcy5zaGVldHMuc2V0KGtleSwge1xuICAgICAgc2hlZXQ6IHNoZWV0LFxuICAgICAgcmVmczogMFxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5tYW5hZ2UgPSBmdW5jdGlvbiBtYW5hZ2Uoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5zaGVldHMuZ2V0KGtleSk7XG5cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGlmIChlbnRyeS5yZWZzID09PSAwKSB7XG4gICAgICAgIGVudHJ5LnNoZWV0LmF0dGFjaCgpO1xuICAgICAgfVxuXG4gICAgICBlbnRyeS5yZWZzKys7XG4gICAgICByZXR1cm4gZW50cnkuc2hlZXQ7XG4gICAgfVxuXG4gICAgd2FybmluZyhmYWxzZSwgXCJbSlNTXSBTaGVldHNNYW5hZ2VyOiBjYW4ndCBmaW5kIHNoZWV0IHRvIG1hbmFnZVwiKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIF9wcm90by51bm1hbmFnZSA9IGZ1bmN0aW9uIHVubWFuYWdlKGtleSkge1xuICAgIHZhciBlbnRyeSA9IHRoaXMuc2hlZXRzLmdldChrZXkpO1xuXG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBpZiAoZW50cnkucmVmcyA+IDApIHtcbiAgICAgICAgZW50cnkucmVmcy0tO1xuICAgICAgICBpZiAoZW50cnkucmVmcyA9PT0gMCkgZW50cnkuc2hlZXQuZGV0YWNoKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsIFwiU2hlZXRzTWFuYWdlcjogY2FuJ3QgZmluZCBzaGVldCB0byB1bm1hbmFnZVwiKTtcbiAgICB9XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKFNoZWV0c01hbmFnZXIsIFt7XG4gICAga2V5OiBcInNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2hlZXRzTWFuYWdlcjtcbn0oKTtcblxuLyoqXG4qIEV4cG9ydCBhIGNvbnN0YW50IGluZGljYXRpbmcgaWYgdGhpcyBicm93c2VyIGhhcyBDU1NUT00gc3VwcG9ydC5cbiogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wMy9jc3NvbVxuKi9cbnZhciBoYXNDU1NUT01TdXBwb3J0ID0gdHlwZW9mIENTUyA9PT0gJ29iamVjdCcgJiYgQ1NTICE9IG51bGwgJiYgJ251bWJlcicgaW4gQ1NTO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgc3R5bGVzIG9iamVjdCB3aXRoIG9ubHkgcHJvcHMgdGhhdCBjb250YWluIGZ1bmN0aW9uIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RHluYW1pY1N0eWxlcyhzdHlsZXMpIHtcbiAgdmFyIHRvID0gbnVsbDtcblxuICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgdmFyIHZhbHVlID0gc3R5bGVzW2tleV07XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKCF0bykgdG8gPSB7fTtcbiAgICAgIHRvW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdmFyIGV4dHJhY3RlZCA9IGdldER5bmFtaWNTdHlsZXModmFsdWUpO1xuXG4gICAgICBpZiAoZXh0cmFjdGVkKSB7XG4gICAgICAgIGlmICghdG8pIHRvID0ge307XG4gICAgICAgIHRvW2tleV0gPSBleHRyYWN0ZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvO1xufVxuXG4vKipcbiAqIEEgYmV0dGVyIGFic3RyYWN0aW9uIG92ZXIgQ1NTLlxuICpcbiAqIEBjb3B5cmlnaHQgT2xlZyBJc29uZW4gKFNsb2JvZHNrb2kpIC8gSXNvbmVuIDIwMTQtcHJlc2VudFxuICogQHdlYnNpdGUgaHR0cHM6Ly9naXRodWIuY29tL2Nzc2luanMvanNzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xudmFyIGluZGV4ID0gY3JlYXRlSnNzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGluZGV4O1xuZXhwb3J0IHsgUnVsZUxpc3QsIFNoZWV0c01hbmFnZXIsIFNoZWV0c1JlZ2lzdHJ5LCBjcmVhdGVKc3MgYXMgY3JlYXRlLCBjcmVhdGVHZW5lcmF0ZUlkLCBjcmVhdGVSdWxlLCBnZXREeW5hbWljU3R5bGVzLCBoYXNDU1NUT01TdXBwb3J0LCBzaGVldHMsIHRvQ3NzVmFsdWUgfTtcbiIsIi8qIGVzbGludC1lbnYgbm9kZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBTRFAgaGVscGVycy5cbmNvbnN0IFNEUFV0aWxzID0ge307XG5cbi8vIEdlbmVyYXRlIGFuIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGZvciBjbmFtZSBvciBtaWRzLlxuLy8gVE9ETzogdXNlIFVVSURzIGluc3RlYWQ/IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2plZC85ODI4ODNcblNEUFV0aWxzLmdlbmVyYXRlSWRlbnRpZmllciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDEyKTtcbn07XG5cbi8vIFRoZSBSVENQIENOQU1FIHVzZWQgYnkgYWxsIHBlZXJjb25uZWN0aW9ucyBmcm9tIHRoZSBzYW1lIEpTLlxuU0RQVXRpbHMubG9jYWxDTmFtZSA9IFNEUFV0aWxzLmdlbmVyYXRlSWRlbnRpZmllcigpO1xuXG4vLyBTcGxpdHMgU0RQIGludG8gbGluZXMsIGRlYWxpbmcgd2l0aCBib3RoIENSTEYgYW5kIExGLlxuU0RQVXRpbHMuc3BsaXRMaW5lcyA9IGZ1bmN0aW9uKGJsb2IpIHtcbiAgcmV0dXJuIGJsb2IudHJpbSgpLnNwbGl0KCdcXG4nKS5tYXAobGluZSA9PiBsaW5lLnRyaW0oKSk7XG59O1xuLy8gU3BsaXRzIFNEUCBpbnRvIHNlc3Npb25wYXJ0IGFuZCBtZWRpYXNlY3Rpb25zLiBFbnN1cmVzIENSTEYuXG5TRFBVdGlscy5zcGxpdFNlY3Rpb25zID0gZnVuY3Rpb24oYmxvYikge1xuICBjb25zdCBwYXJ0cyA9IGJsb2Iuc3BsaXQoJ1xcbm09Jyk7XG4gIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQsIGluZGV4KSA9PiAoaW5kZXggPiAwID9cbiAgICAnbT0nICsgcGFydCA6IHBhcnQpLnRyaW0oKSArICdcXHJcXG4nKTtcbn07XG5cbi8vIFJldHVybnMgdGhlIHNlc3Npb24gZGVzY3JpcHRpb24uXG5TRFBVdGlscy5nZXREZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKGJsb2IpIHtcbiAgY29uc3Qgc2VjdGlvbnMgPSBTRFBVdGlscy5zcGxpdFNlY3Rpb25zKGJsb2IpO1xuICByZXR1cm4gc2VjdGlvbnMgJiYgc2VjdGlvbnNbMF07XG59O1xuXG4vLyBSZXR1cm5zIHRoZSBpbmRpdmlkdWFsIG1lZGlhIHNlY3Rpb25zLlxuU0RQVXRpbHMuZ2V0TWVkaWFTZWN0aW9ucyA9IGZ1bmN0aW9uKGJsb2IpIHtcbiAgY29uc3Qgc2VjdGlvbnMgPSBTRFBVdGlscy5zcGxpdFNlY3Rpb25zKGJsb2IpO1xuICBzZWN0aW9ucy5zaGlmdCgpO1xuICByZXR1cm4gc2VjdGlvbnM7XG59O1xuXG4vLyBSZXR1cm5zIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCBhIGNlcnRhaW4gcHJlZml4LlxuU0RQVXRpbHMubWF0Y2hQcmVmaXggPSBmdW5jdGlvbihibG9iLCBwcmVmaXgpIHtcbiAgcmV0dXJuIFNEUFV0aWxzLnNwbGl0TGluZXMoYmxvYikuZmlsdGVyKGxpbmUgPT4gbGluZS5pbmRleE9mKHByZWZpeCkgPT09IDApO1xufTtcblxuLy8gUGFyc2VzIGFuIElDRSBjYW5kaWRhdGUgbGluZS4gU2FtcGxlIGlucHV0OlxuLy8gY2FuZGlkYXRlOjcwMjc4NjM1MCAyIHVkcCA0MTgxOTkwMiA4LjguOC44IDYwNzY5IHR5cCByZWxheSByYWRkciA4LjguOC44XG4vLyBycG9ydCA1NTk5NlwiXG4vLyBJbnB1dCBjYW4gYmUgcHJlZml4ZWQgd2l0aCBhPS5cblNEUFV0aWxzLnBhcnNlQ2FuZGlkYXRlID0gZnVuY3Rpb24obGluZSkge1xuICBsZXQgcGFydHM7XG4gIC8vIFBhcnNlIGJvdGggdmFyaWFudHMuXG4gIGlmIChsaW5lLmluZGV4T2YoJ2E9Y2FuZGlkYXRlOicpID09PSAwKSB7XG4gICAgcGFydHMgPSBsaW5lLnN1YnN0cmluZygxMikuc3BsaXQoJyAnKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDEwKS5zcGxpdCgnICcpO1xuICB9XG5cbiAgY29uc3QgY2FuZGlkYXRlID0ge1xuICAgIGZvdW5kYXRpb246IHBhcnRzWzBdLFxuICAgIGNvbXBvbmVudDogezE6ICdydHAnLCAyOiAncnRjcCd9W3BhcnRzWzFdXSB8fCBwYXJ0c1sxXSxcbiAgICBwcm90b2NvbDogcGFydHNbMl0udG9Mb3dlckNhc2UoKSxcbiAgICBwcmlvcml0eTogcGFyc2VJbnQocGFydHNbM10sIDEwKSxcbiAgICBpcDogcGFydHNbNF0sXG4gICAgYWRkcmVzczogcGFydHNbNF0sIC8vIGFkZHJlc3MgaXMgYW4gYWxpYXMgZm9yIGlwLlxuICAgIHBvcnQ6IHBhcnNlSW50KHBhcnRzWzVdLCAxMCksXG4gICAgLy8gc2tpcCBwYXJ0c1s2XSA9PSAndHlwJ1xuICAgIHR5cGU6IHBhcnRzWzddLFxuICB9O1xuXG4gIGZvciAobGV0IGkgPSA4OyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBzd2l0Y2ggKHBhcnRzW2ldKSB7XG4gICAgICBjYXNlICdyYWRkcic6XG4gICAgICAgIGNhbmRpZGF0ZS5yZWxhdGVkQWRkcmVzcyA9IHBhcnRzW2kgKyAxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdycG9ydCc6XG4gICAgICAgIGNhbmRpZGF0ZS5yZWxhdGVkUG9ydCA9IHBhcnNlSW50KHBhcnRzW2kgKyAxXSwgMTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RjcHR5cGUnOlxuICAgICAgICBjYW5kaWRhdGUudGNwVHlwZSA9IHBhcnRzW2kgKyAxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1ZnJhZyc6XG4gICAgICAgIGNhbmRpZGF0ZS51ZnJhZyA9IHBhcnRzW2kgKyAxXTsgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNhbmRpZGF0ZS51c2VybmFtZUZyYWdtZW50ID0gcGFydHNbaSArIDFdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IC8vIGV4dGVuc2lvbiBoYW5kbGluZywgaW4gcGFydGljdWxhciB1ZnJhZy4gRG9uJ3Qgb3ZlcndyaXRlLlxuICAgICAgICBpZiAoY2FuZGlkYXRlW3BhcnRzW2ldXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2FuZGlkYXRlW3BhcnRzW2ldXSA9IHBhcnRzW2kgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZTtcbn07XG5cbi8vIFRyYW5zbGF0ZXMgYSBjYW5kaWRhdGUgb2JqZWN0IGludG8gU0RQIGNhbmRpZGF0ZSBhdHRyaWJ1dGUuXG4vLyBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIGE9IHByZWZpeCFcblNEUFV0aWxzLndyaXRlQ2FuZGlkYXRlID0gZnVuY3Rpb24oY2FuZGlkYXRlKSB7XG4gIGNvbnN0IHNkcCA9IFtdO1xuICBzZHAucHVzaChjYW5kaWRhdGUuZm91bmRhdGlvbik7XG5cbiAgY29uc3QgY29tcG9uZW50ID0gY2FuZGlkYXRlLmNvbXBvbmVudDtcbiAgaWYgKGNvbXBvbmVudCA9PT0gJ3J0cCcpIHtcbiAgICBzZHAucHVzaCgxKTtcbiAgfSBlbHNlIGlmIChjb21wb25lbnQgPT09ICdydGNwJykge1xuICAgIHNkcC5wdXNoKDIpO1xuICB9IGVsc2Uge1xuICAgIHNkcC5wdXNoKGNvbXBvbmVudCk7XG4gIH1cbiAgc2RwLnB1c2goY2FuZGlkYXRlLnByb3RvY29sLnRvVXBwZXJDYXNlKCkpO1xuICBzZHAucHVzaChjYW5kaWRhdGUucHJpb3JpdHkpO1xuICBzZHAucHVzaChjYW5kaWRhdGUuYWRkcmVzcyB8fCBjYW5kaWRhdGUuaXApO1xuICBzZHAucHVzaChjYW5kaWRhdGUucG9ydCk7XG5cbiAgY29uc3QgdHlwZSA9IGNhbmRpZGF0ZS50eXBlO1xuICBzZHAucHVzaCgndHlwJyk7XG4gIHNkcC5wdXNoKHR5cGUpO1xuICBpZiAodHlwZSAhPT0gJ2hvc3QnICYmIGNhbmRpZGF0ZS5yZWxhdGVkQWRkcmVzcyAmJlxuICAgICAgY2FuZGlkYXRlLnJlbGF0ZWRQb3J0KSB7XG4gICAgc2RwLnB1c2goJ3JhZGRyJyk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLnJlbGF0ZWRBZGRyZXNzKTtcbiAgICBzZHAucHVzaCgncnBvcnQnKTtcbiAgICBzZHAucHVzaChjYW5kaWRhdGUucmVsYXRlZFBvcnQpO1xuICB9XG4gIGlmIChjYW5kaWRhdGUudGNwVHlwZSAmJiBjYW5kaWRhdGUucHJvdG9jb2wudG9Mb3dlckNhc2UoKSA9PT0gJ3RjcCcpIHtcbiAgICBzZHAucHVzaCgndGNwdHlwZScpO1xuICAgIHNkcC5wdXNoKGNhbmRpZGF0ZS50Y3BUeXBlKTtcbiAgfVxuICBpZiAoY2FuZGlkYXRlLnVzZXJuYW1lRnJhZ21lbnQgfHwgY2FuZGlkYXRlLnVmcmFnKSB7XG4gICAgc2RwLnB1c2goJ3VmcmFnJyk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLnVzZXJuYW1lRnJhZ21lbnQgfHwgY2FuZGlkYXRlLnVmcmFnKTtcbiAgfVxuICByZXR1cm4gJ2NhbmRpZGF0ZTonICsgc2RwLmpvaW4oJyAnKTtcbn07XG5cbi8vIFBhcnNlcyBhbiBpY2Utb3B0aW9ucyBsaW5lLCByZXR1cm5zIGFuIGFycmF5IG9mIG9wdGlvbiB0YWdzLlxuLy8gU2FtcGxlIGlucHV0OlxuLy8gYT1pY2Utb3B0aW9uczpmb28gYmFyXG5TRFBVdGlscy5wYXJzZUljZU9wdGlvbnMgPSBmdW5jdGlvbihsaW5lKSB7XG4gIHJldHVybiBsaW5lLnN1YnN0cmluZygxNCkuc3BsaXQoJyAnKTtcbn07XG5cbi8vIFBhcnNlcyBhIHJ0cG1hcCBsaW5lLCByZXR1cm5zIFJUQ1J0cENvZGRlY1BhcmFtZXRlcnMuIFNhbXBsZSBpbnB1dDpcbi8vIGE9cnRwbWFwOjExMSBvcHVzLzQ4MDAwLzJcblNEUFV0aWxzLnBhcnNlUnRwTWFwID0gZnVuY3Rpb24obGluZSkge1xuICBsZXQgcGFydHMgPSBsaW5lLnN1YnN0cmluZyg5KS5zcGxpdCgnICcpO1xuICBjb25zdCBwYXJzZWQgPSB7XG4gICAgcGF5bG9hZFR5cGU6IHBhcnNlSW50KHBhcnRzLnNoaWZ0KCksIDEwKSwgLy8gd2FzOiBpZFxuICB9O1xuXG4gIHBhcnRzID0gcGFydHNbMF0uc3BsaXQoJy8nKTtcblxuICBwYXJzZWQubmFtZSA9IHBhcnRzWzBdO1xuICBwYXJzZWQuY2xvY2tSYXRlID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsgLy8gd2FzOiBjbG9ja3JhdGVcbiAgcGFyc2VkLmNoYW5uZWxzID0gcGFydHMubGVuZ3RoID09PSAzID8gcGFyc2VJbnQocGFydHNbMl0sIDEwKSA6IDE7XG4gIC8vIGxlZ2FjeSBhbGlhcywgZ290IHJlbmFtZWQgYmFjayB0byBjaGFubmVscyBpbiBPUlRDLlxuICBwYXJzZWQubnVtQ2hhbm5lbHMgPSBwYXJzZWQuY2hhbm5lbHM7XG4gIHJldHVybiBwYXJzZWQ7XG59O1xuXG4vLyBHZW5lcmF0ZXMgYSBydHBtYXAgbGluZSBmcm9tIFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSBvclxuLy8gUlRDUnRwQ29kZWNQYXJhbWV0ZXJzLlxuU0RQVXRpbHMud3JpdGVSdHBNYXAgPSBmdW5jdGlvbihjb2RlYykge1xuICBsZXQgcHQgPSBjb2RlYy5wYXlsb2FkVHlwZTtcbiAgaWYgKGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwdCA9IGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlO1xuICB9XG4gIGNvbnN0IGNoYW5uZWxzID0gY29kZWMuY2hhbm5lbHMgfHwgY29kZWMubnVtQ2hhbm5lbHMgfHwgMTtcbiAgcmV0dXJuICdhPXJ0cG1hcDonICsgcHQgKyAnICcgKyBjb2RlYy5uYW1lICsgJy8nICsgY29kZWMuY2xvY2tSYXRlICtcbiAgICAgIChjaGFubmVscyAhPT0gMSA/ICcvJyArIGNoYW5uZWxzIDogJycpICsgJ1xcclxcbic7XG59O1xuXG4vLyBQYXJzZXMgYSBleHRtYXAgbGluZSAoaGVhZGVyZXh0ZW5zaW9uIGZyb20gUkZDIDUyODUpLiBTYW1wbGUgaW5wdXQ6XG4vLyBhPWV4dG1hcDoyIHVybjppZXRmOnBhcmFtczpydHAtaGRyZXh0OnRvZmZzZXRcbi8vIGE9ZXh0bWFwOjIvc2VuZG9ubHkgdXJuOmlldGY6cGFyYW1zOnJ0cC1oZHJleHQ6dG9mZnNldFxuU0RQVXRpbHMucGFyc2VFeHRtYXAgPSBmdW5jdGlvbihsaW5lKSB7XG4gIGNvbnN0IHBhcnRzID0gbGluZS5zdWJzdHJpbmcoOSkuc3BsaXQoJyAnKTtcbiAgcmV0dXJuIHtcbiAgICBpZDogcGFyc2VJbnQocGFydHNbMF0sIDEwKSxcbiAgICBkaXJlY3Rpb246IHBhcnRzWzBdLmluZGV4T2YoJy8nKSA+IDAgPyBwYXJ0c1swXS5zcGxpdCgnLycpWzFdIDogJ3NlbmRyZWN2JyxcbiAgICB1cmk6IHBhcnRzWzFdLFxuICAgIGF0dHJpYnV0ZXM6IHBhcnRzLnNsaWNlKDIpLmpvaW4oJyAnKSxcbiAgfTtcbn07XG5cbi8vIEdlbmVyYXRlcyBhbiBleHRtYXAgbGluZSBmcm9tIFJUQ1J0cEhlYWRlckV4dGVuc2lvblBhcmFtZXRlcnMgb3Jcbi8vIFJUQ1J0cEhlYWRlckV4dGVuc2lvbi5cblNEUFV0aWxzLndyaXRlRXh0bWFwID0gZnVuY3Rpb24oaGVhZGVyRXh0ZW5zaW9uKSB7XG4gIHJldHVybiAnYT1leHRtYXA6JyArIChoZWFkZXJFeHRlbnNpb24uaWQgfHwgaGVhZGVyRXh0ZW5zaW9uLnByZWZlcnJlZElkKSArXG4gICAgICAoaGVhZGVyRXh0ZW5zaW9uLmRpcmVjdGlvbiAmJiBoZWFkZXJFeHRlbnNpb24uZGlyZWN0aW9uICE9PSAnc2VuZHJlY3YnXG4gICAgICAgID8gJy8nICsgaGVhZGVyRXh0ZW5zaW9uLmRpcmVjdGlvblxuICAgICAgICA6ICcnKSArXG4gICAgICAnICcgKyBoZWFkZXJFeHRlbnNpb24udXJpICtcbiAgICAgIChoZWFkZXJFeHRlbnNpb24uYXR0cmlidXRlcyA/ICcgJyArIGhlYWRlckV4dGVuc2lvbi5hdHRyaWJ1dGVzIDogJycpICtcbiAgICAgICdcXHJcXG4nO1xufTtcblxuLy8gUGFyc2VzIGEgZm10cCBsaW5lLCByZXR1cm5zIGRpY3Rpb25hcnkuIFNhbXBsZSBpbnB1dDpcbi8vIGE9Zm10cDo5NiB2YnI9b247Y25nPW9uXG4vLyBBbHNvIGRlYWxzIHdpdGggdmJyPW9uOyBjbmc9b25cblNEUFV0aWxzLnBhcnNlRm10cCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrdjtcbiAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoJyAnKSArIDEpLnNwbGl0KCc7Jyk7XG4gIGZvciAobGV0IGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICBrdiA9IHBhcnRzW2pdLnRyaW0oKS5zcGxpdCgnPScpO1xuICAgIHBhcnNlZFtrdlswXS50cmltKCldID0ga3ZbMV07XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbi8vIEdlbmVyYXRlcyBhIGZtdHAgbGluZSBmcm9tIFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSBvciBSVENSdHBDb2RlY1BhcmFtZXRlcnMuXG5TRFBVdGlscy53cml0ZUZtdHAgPSBmdW5jdGlvbihjb2RlYykge1xuICBsZXQgbGluZSA9ICcnO1xuICBsZXQgcHQgPSBjb2RlYy5wYXlsb2FkVHlwZTtcbiAgaWYgKGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwdCA9IGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlO1xuICB9XG4gIGlmIChjb2RlYy5wYXJhbWV0ZXJzICYmIE9iamVjdC5rZXlzKGNvZGVjLnBhcmFtZXRlcnMpLmxlbmd0aCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGNvZGVjLnBhcmFtZXRlcnMpLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgaWYgKGNvZGVjLnBhcmFtZXRlcnNbcGFyYW1dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1zLnB1c2gocGFyYW0gKyAnPScgKyBjb2RlYy5wYXJhbWV0ZXJzW3BhcmFtXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbGluZSArPSAnYT1mbXRwOicgKyBwdCArICcgJyArIHBhcmFtcy5qb2luKCc7JykgKyAnXFxyXFxuJztcbiAgfVxuICByZXR1cm4gbGluZTtcbn07XG5cbi8vIFBhcnNlcyBhIHJ0Y3AtZmIgbGluZSwgcmV0dXJucyBSVENQUnRjcEZlZWRiYWNrIG9iamVjdC4gU2FtcGxlIGlucHV0OlxuLy8gYT1ydGNwLWZiOjk4IG5hY2sgcnBzaVxuU0RQVXRpbHMucGFyc2VSdGNwRmIgPSBmdW5jdGlvbihsaW5lKSB7XG4gIGNvbnN0IHBhcnRzID0gbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCcgJykgKyAxKS5zcGxpdCgnICcpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IHBhcnRzLnNoaWZ0KCksXG4gICAgcGFyYW1ldGVyOiBwYXJ0cy5qb2luKCcgJyksXG4gIH07XG59O1xuXG4vLyBHZW5lcmF0ZSBhPXJ0Y3AtZmIgbGluZXMgZnJvbSBSVENSdHBDb2RlY0NhcGFiaWxpdHkgb3IgUlRDUnRwQ29kZWNQYXJhbWV0ZXJzLlxuU0RQVXRpbHMud3JpdGVSdGNwRmIgPSBmdW5jdGlvbihjb2RlYykge1xuICBsZXQgbGluZXMgPSAnJztcbiAgbGV0IHB0ID0gY29kZWMucGF5bG9hZFR5cGU7XG4gIGlmIChjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcHQgPSBjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZTtcbiAgfVxuICBpZiAoY29kZWMucnRjcEZlZWRiYWNrICYmIGNvZGVjLnJ0Y3BGZWVkYmFjay5sZW5ndGgpIHtcbiAgICAvLyBGSVhNRTogc3BlY2lhbCBoYW5kbGluZyBmb3IgdHJyLWludD9cbiAgICBjb2RlYy5ydGNwRmVlZGJhY2suZm9yRWFjaChmYiA9PiB7XG4gICAgICBsaW5lcyArPSAnYT1ydGNwLWZiOicgKyBwdCArICcgJyArIGZiLnR5cGUgK1xuICAgICAgKGZiLnBhcmFtZXRlciAmJiBmYi5wYXJhbWV0ZXIubGVuZ3RoID8gJyAnICsgZmIucGFyYW1ldGVyIDogJycpICtcbiAgICAgICAgICAnXFxyXFxuJztcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbGluZXM7XG59O1xuXG4vLyBQYXJzZXMgYSBSRkMgNTU3NiBzc3JjIG1lZGlhIGF0dHJpYnV0ZS4gU2FtcGxlIGlucHV0OlxuLy8gYT1zc3JjOjM3MzU5Mjg1NTkgY25hbWU6c29tZXRoaW5nXG5TRFBVdGlscy5wYXJzZVNzcmNNZWRpYSA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3Qgc3AgPSBsaW5lLmluZGV4T2YoJyAnKTtcbiAgY29uc3QgcGFydHMgPSB7XG4gICAgc3NyYzogcGFyc2VJbnQobGluZS5zdWJzdHJpbmcoNywgc3ApLCAxMCksXG4gIH07XG4gIGNvbnN0IGNvbG9uID0gbGluZS5pbmRleE9mKCc6Jywgc3ApO1xuICBpZiAoY29sb24gPiAtMSkge1xuICAgIHBhcnRzLmF0dHJpYnV0ZSA9IGxpbmUuc3Vic3RyaW5nKHNwICsgMSwgY29sb24pO1xuICAgIHBhcnRzLnZhbHVlID0gbGluZS5zdWJzdHJpbmcoY29sb24gKyAxKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJ0cy5hdHRyaWJ1dGUgPSBsaW5lLnN1YnN0cmluZyhzcCArIDEpO1xuICB9XG4gIHJldHVybiBwYXJ0cztcbn07XG5cbi8vIFBhcnNlIGEgc3NyYy1ncm91cCBsaW5lIChzZWUgUkZDIDU1NzYpLiBTYW1wbGUgaW5wdXQ6XG4vLyBhPXNzcmMtZ3JvdXA6c2VtYW50aWNzIDEyIDM0XG5TRFBVdGlscy5wYXJzZVNzcmNHcm91cCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZygxMykuc3BsaXQoJyAnKTtcbiAgcmV0dXJuIHtcbiAgICBzZW1hbnRpY3M6IHBhcnRzLnNoaWZ0KCksXG4gICAgc3NyY3M6IHBhcnRzLm1hcChzc3JjID0+IHBhcnNlSW50KHNzcmMsIDEwKSksXG4gIH07XG59O1xuXG4vLyBFeHRyYWN0cyB0aGUgTUlEIChSRkMgNTg4OCkgZnJvbSBhIG1lZGlhIHNlY3Rpb24uXG4vLyBSZXR1cm5zIHRoZSBNSUQgb3IgdW5kZWZpbmVkIGlmIG5vIG1pZCBsaW5lIHdhcyBmb3VuZC5cblNEUFV0aWxzLmdldE1pZCA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBtaWQgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPW1pZDonKVswXTtcbiAgaWYgKG1pZCkge1xuICAgIHJldHVybiBtaWQuc3Vic3RyaW5nKDYpO1xuICB9XG59O1xuXG4vLyBQYXJzZXMgYSBmaW5nZXJwcmludCBsaW5lIGZvciBEVExTLVNSVFAuXG5TRFBVdGlscy5wYXJzZUZpbmdlcnByaW50ID0gZnVuY3Rpb24obGluZSkge1xuICBjb25zdCBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDE0KS5zcGxpdCgnICcpO1xuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogcGFydHNbMF0udG9Mb3dlckNhc2UoKSwgLy8gYWxnb3JpdGhtIGlzIGNhc2Utc2Vuc2l0aXZlIGluIEVkZ2UuXG4gICAgdmFsdWU6IHBhcnRzWzFdLnRvVXBwZXJDYXNlKCksIC8vIHRoZSBkZWZpbml0aW9uIGlzIHVwcGVyLWNhc2UgaW4gUkZDIDQ1NzIuXG4gIH07XG59O1xuXG4vLyBFeHRyYWN0cyBEVExTIHBhcmFtZXRlcnMgZnJvbSBTRFAgbWVkaWEgc2VjdGlvbiBvciBzZXNzaW9ucGFydC5cbi8vIEZJWE1FOiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhpcyBzaG91bGQgb25seVxuLy8gICBnZXQgdGhlIGZpbmdlcnByaW50IGxpbmUgYXMgaW5wdXQuIFNlZSBhbHNvIGdldEljZVBhcmFtZXRlcnMuXG5TRFBVdGlscy5nZXREdGxzUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpIHtcbiAgY29uc3QgbGluZXMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24gKyBzZXNzaW9ucGFydCxcbiAgICAnYT1maW5nZXJwcmludDonKTtcbiAgLy8gTm90ZTogYT1zZXR1cCBsaW5lIGlzIGlnbm9yZWQgc2luY2Ugd2UgdXNlIHRoZSAnYXV0bycgcm9sZSBpbiBFZGdlLlxuICByZXR1cm4ge1xuICAgIHJvbGU6ICdhdXRvJyxcbiAgICBmaW5nZXJwcmludHM6IGxpbmVzLm1hcChTRFBVdGlscy5wYXJzZUZpbmdlcnByaW50KSxcbiAgfTtcbn07XG5cbi8vIFNlcmlhbGl6ZXMgRFRMUyBwYXJhbWV0ZXJzIHRvIFNEUC5cblNEUFV0aWxzLndyaXRlRHRsc1BhcmFtZXRlcnMgPSBmdW5jdGlvbihwYXJhbXMsIHNldHVwVHlwZSkge1xuICBsZXQgc2RwID0gJ2E9c2V0dXA6JyArIHNldHVwVHlwZSArICdcXHJcXG4nO1xuICBwYXJhbXMuZmluZ2VycHJpbnRzLmZvckVhY2goZnAgPT4ge1xuICAgIHNkcCArPSAnYT1maW5nZXJwcmludDonICsgZnAuYWxnb3JpdGhtICsgJyAnICsgZnAudmFsdWUgKyAnXFxyXFxuJztcbiAgfSk7XG4gIHJldHVybiBzZHA7XG59O1xuXG4vLyBQYXJzZXMgYT1jcnlwdG8gbGluZXMgaW50b1xuLy8gICBodHRwczovL3Jhd2dpdC5jb20vYWJvYmEvZWRnZXJ0Yy9tYXN0ZXIvbXNvcnRjLXJzNC5odG1sI2RpY3Rpb25hcnktcnRjc3J0cHNkZXNwYXJhbWV0ZXJzLW1lbWJlcnNcblNEUFV0aWxzLnBhcnNlQ3J5cHRvTGluZSA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZyg5KS5zcGxpdCgnICcpO1xuICByZXR1cm4ge1xuICAgIHRhZzogcGFyc2VJbnQocGFydHNbMF0sIDEwKSxcbiAgICBjcnlwdG9TdWl0ZTogcGFydHNbMV0sXG4gICAga2V5UGFyYW1zOiBwYXJ0c1syXSxcbiAgICBzZXNzaW9uUGFyYW1zOiBwYXJ0cy5zbGljZSgzKSxcbiAgfTtcbn07XG5cblNEUFV0aWxzLndyaXRlQ3J5cHRvTGluZSA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHtcbiAgcmV0dXJuICdhPWNyeXB0bzonICsgcGFyYW1ldGVycy50YWcgKyAnICcgK1xuICAgIHBhcmFtZXRlcnMuY3J5cHRvU3VpdGUgKyAnICcgK1xuICAgICh0eXBlb2YgcGFyYW1ldGVycy5rZXlQYXJhbXMgPT09ICdvYmplY3QnXG4gICAgICA/IFNEUFV0aWxzLndyaXRlQ3J5cHRvS2V5UGFyYW1zKHBhcmFtZXRlcnMua2V5UGFyYW1zKVxuICAgICAgOiBwYXJhbWV0ZXJzLmtleVBhcmFtcykgK1xuICAgIChwYXJhbWV0ZXJzLnNlc3Npb25QYXJhbXMgPyAnICcgKyBwYXJhbWV0ZXJzLnNlc3Npb25QYXJhbXMuam9pbignICcpIDogJycpICtcbiAgICAnXFxyXFxuJztcbn07XG5cbi8vIFBhcnNlcyB0aGUgY3J5cHRvIGtleSBwYXJhbWV0ZXJzIGludG9cbi8vICAgaHR0cHM6Ly9yYXdnaXQuY29tL2Fib2JhL2VkZ2VydGMvbWFzdGVyL21zb3J0Yy1yczQuaHRtbCNydGNzcnRwa2V5cGFyYW0qXG5TRFBVdGlscy5wYXJzZUNyeXB0b0tleVBhcmFtcyA9IGZ1bmN0aW9uKGtleVBhcmFtcykge1xuICBpZiAoa2V5UGFyYW1zLmluZGV4T2YoJ2lubGluZTonKSAhPT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHBhcnRzID0ga2V5UGFyYW1zLnN1YnN0cmluZyg3KS5zcGxpdCgnfCcpO1xuICByZXR1cm4ge1xuICAgIGtleU1ldGhvZDogJ2lubGluZScsXG4gICAga2V5U2FsdDogcGFydHNbMF0sXG4gICAgbGlmZVRpbWU6IHBhcnRzWzFdLFxuICAgIG1raVZhbHVlOiBwYXJ0c1syXSA/IHBhcnRzWzJdLnNwbGl0KCc6JylbMF0gOiB1bmRlZmluZWQsXG4gICAgbWtpTGVuZ3RoOiBwYXJ0c1syXSA/IHBhcnRzWzJdLnNwbGl0KCc6JylbMV0gOiB1bmRlZmluZWQsXG4gIH07XG59O1xuXG5TRFBVdGlscy53cml0ZUNyeXB0b0tleVBhcmFtcyA9IGZ1bmN0aW9uKGtleVBhcmFtcykge1xuICByZXR1cm4ga2V5UGFyYW1zLmtleU1ldGhvZCArICc6J1xuICAgICsga2V5UGFyYW1zLmtleVNhbHQgK1xuICAgIChrZXlQYXJhbXMubGlmZVRpbWUgPyAnfCcgKyBrZXlQYXJhbXMubGlmZVRpbWUgOiAnJykgK1xuICAgIChrZXlQYXJhbXMubWtpVmFsdWUgJiYga2V5UGFyYW1zLm1raUxlbmd0aFxuICAgICAgPyAnfCcgKyBrZXlQYXJhbXMubWtpVmFsdWUgKyAnOicgKyBrZXlQYXJhbXMubWtpTGVuZ3RoXG4gICAgICA6ICcnKTtcbn07XG5cbi8vIEV4dHJhY3RzIGFsbCBTREVTIHBhcmFtZXRlcnMuXG5TRFBVdGlscy5nZXRDcnlwdG9QYXJhbWV0ZXJzID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uLCBzZXNzaW9ucGFydCkge1xuICBjb25zdCBsaW5lcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiArIHNlc3Npb25wYXJ0LFxuICAgICdhPWNyeXB0bzonKTtcbiAgcmV0dXJuIGxpbmVzLm1hcChTRFBVdGlscy5wYXJzZUNyeXB0b0xpbmUpO1xufTtcblxuLy8gUGFyc2VzIElDRSBpbmZvcm1hdGlvbiBmcm9tIFNEUCBtZWRpYSBzZWN0aW9uIG9yIHNlc3Npb25wYXJ0LlxuLy8gRklYTUU6IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGlzIHNob3VsZCBvbmx5XG4vLyAgIGdldCB0aGUgaWNlLXVmcmFnIGFuZCBpY2UtcHdkIGxpbmVzIGFzIGlucHV0LlxuU0RQVXRpbHMuZ2V0SWNlUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpIHtcbiAgY29uc3QgdWZyYWcgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24gKyBzZXNzaW9ucGFydCxcbiAgICAnYT1pY2UtdWZyYWc6JylbMF07XG4gIGNvbnN0IHB3ZCA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiArIHNlc3Npb25wYXJ0LFxuICAgICdhPWljZS1wd2Q6JylbMF07XG4gIGlmICghKHVmcmFnICYmIHB3ZCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHVzZXJuYW1lRnJhZ21lbnQ6IHVmcmFnLnN1YnN0cmluZygxMiksXG4gICAgcGFzc3dvcmQ6IHB3ZC5zdWJzdHJpbmcoMTApLFxuICB9O1xufTtcblxuLy8gU2VyaWFsaXplcyBJQ0UgcGFyYW1ldGVycyB0byBTRFAuXG5TRFBVdGlscy53cml0ZUljZVBhcmFtZXRlcnMgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgbGV0IHNkcCA9ICdhPWljZS11ZnJhZzonICsgcGFyYW1zLnVzZXJuYW1lRnJhZ21lbnQgKyAnXFxyXFxuJyArXG4gICAgICAnYT1pY2UtcHdkOicgKyBwYXJhbXMucGFzc3dvcmQgKyAnXFxyXFxuJztcbiAgaWYgKHBhcmFtcy5pY2VMaXRlKSB7XG4gICAgc2RwICs9ICdhPWljZS1saXRlXFxyXFxuJztcbiAgfVxuICByZXR1cm4gc2RwO1xufTtcblxuLy8gUGFyc2VzIHRoZSBTRFAgbWVkaWEgc2VjdGlvbiBhbmQgcmV0dXJucyBSVENSdHBQYXJhbWV0ZXJzLlxuU0RQVXRpbHMucGFyc2VSdHBQYXJhbWV0ZXJzID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0ge1xuICAgIGNvZGVjczogW10sXG4gICAgaGVhZGVyRXh0ZW5zaW9uczogW10sXG4gICAgZmVjTWVjaGFuaXNtczogW10sXG4gICAgcnRjcDogW10sXG4gIH07XG4gIGNvbnN0IGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICBjb25zdCBtbGluZSA9IGxpbmVzWzBdLnNwbGl0KCcgJyk7XG4gIGRlc2NyaXB0aW9uLnByb2ZpbGUgPSBtbGluZVsyXTtcbiAgZm9yIChsZXQgaSA9IDM7IGkgPCBtbGluZS5sZW5ndGg7IGkrKykgeyAvLyBmaW5kIGFsbCBjb2RlY3MgZnJvbSBtbGluZVszLi5dXG4gICAgY29uc3QgcHQgPSBtbGluZVtpXTtcbiAgICBjb25zdCBydHBtYXBsaW5lID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgoXG4gICAgICBtZWRpYVNlY3Rpb24sICdhPXJ0cG1hcDonICsgcHQgKyAnICcpWzBdO1xuICAgIGlmIChydHBtYXBsaW5lKSB7XG4gICAgICBjb25zdCBjb2RlYyA9IFNEUFV0aWxzLnBhcnNlUnRwTWFwKHJ0cG1hcGxpbmUpO1xuICAgICAgY29uc3QgZm10cHMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChcbiAgICAgICAgbWVkaWFTZWN0aW9uLCAnYT1mbXRwOicgKyBwdCArICcgJyk7XG4gICAgICAvLyBPbmx5IHRoZSBmaXJzdCBhPWZtdHA6PHB0PiBpcyBjb25zaWRlcmVkLlxuICAgICAgY29kZWMucGFyYW1ldGVycyA9IGZtdHBzLmxlbmd0aCA/IFNEUFV0aWxzLnBhcnNlRm10cChmbXRwc1swXSkgOiB7fTtcbiAgICAgIGNvZGVjLnJ0Y3BGZWVkYmFjayA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KFxuICAgICAgICBtZWRpYVNlY3Rpb24sICdhPXJ0Y3AtZmI6JyArIHB0ICsgJyAnKVxuICAgICAgICAubWFwKFNEUFV0aWxzLnBhcnNlUnRjcEZiKTtcbiAgICAgIGRlc2NyaXB0aW9uLmNvZGVjcy5wdXNoKGNvZGVjKTtcbiAgICAgIC8vIHBhcnNlIEZFQyBtZWNoYW5pc21zIGZyb20gcnRwbWFwIGxpbmVzLlxuICAgICAgc3dpdGNoIChjb2RlYy5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnUkVEJzpcbiAgICAgICAgY2FzZSAnVUxQRkVDJzpcbiAgICAgICAgICBkZXNjcmlwdGlvbi5mZWNNZWNoYW5pc21zLnB1c2goY29kZWMubmFtZS50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDogLy8gb25seSBSRUQgYW5kIFVMUEZFQyBhcmUgcmVjb2duaXplZCBhcyBGRUMgbWVjaGFuaXNtcy5cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1leHRtYXA6JykuZm9yRWFjaChsaW5lID0+IHtcbiAgICBkZXNjcmlwdGlvbi5oZWFkZXJFeHRlbnNpb25zLnB1c2goU0RQVXRpbHMucGFyc2VFeHRtYXAobGluZSkpO1xuICB9KTtcbiAgY29uc3Qgd2lsZGNhcmRSdGNwRmIgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXJ0Y3AtZmI6KiAnKVxuICAgIC5tYXAoU0RQVXRpbHMucGFyc2VSdGNwRmIpO1xuICBkZXNjcmlwdGlvbi5jb2RlY3MuZm9yRWFjaChjb2RlYyA9PiB7XG4gICAgd2lsZGNhcmRSdGNwRmIuZm9yRWFjaChmYj0+IHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGNvZGVjLnJ0Y3BGZWVkYmFjay5maW5kKGV4aXN0aW5nRmVlZGJhY2sgPT4ge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdGZWVkYmFjay50eXBlID09PSBmYi50eXBlICYmXG4gICAgICAgICAgZXhpc3RpbmdGZWVkYmFjay5wYXJhbWV0ZXIgPT09IGZiLnBhcmFtZXRlcjtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFkdXBsaWNhdGUpIHtcbiAgICAgICAgY29kZWMucnRjcEZlZWRiYWNrLnB1c2goZmIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgLy8gRklYTUU6IHBhcnNlIHJ0Y3AuXG4gIHJldHVybiBkZXNjcmlwdGlvbjtcbn07XG5cbi8vIEdlbmVyYXRlcyBwYXJ0cyBvZiB0aGUgU0RQIG1lZGlhIHNlY3Rpb24gZGVzY3JpYmluZyB0aGUgY2FwYWJpbGl0aWVzIC9cbi8vIHBhcmFtZXRlcnMuXG5TRFBVdGlscy53cml0ZVJ0cERlc2NyaXB0aW9uID0gZnVuY3Rpb24oa2luZCwgY2Fwcykge1xuICBsZXQgc2RwID0gJyc7XG5cbiAgLy8gQnVpbGQgdGhlIG1saW5lLlxuICBzZHAgKz0gJ209JyArIGtpbmQgKyAnICc7XG4gIHNkcCArPSBjYXBzLmNvZGVjcy5sZW5ndGggPiAwID8gJzknIDogJzAnOyAvLyByZWplY3QgaWYgbm8gY29kZWNzLlxuICBzZHAgKz0gJyAnICsgKGNhcHMucHJvZmlsZSB8fCAnVURQL1RMUy9SVFAvU0FWUEYnKSArICcgJztcbiAgc2RwICs9IGNhcHMuY29kZWNzLm1hcChjb2RlYyA9PiB7XG4gICAgaWYgKGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvZGVjLnBheWxvYWRUeXBlO1xuICB9KS5qb2luKCcgJykgKyAnXFxyXFxuJztcblxuICBzZHAgKz0gJ2M9SU4gSVA0IDAuMC4wLjBcXHJcXG4nO1xuICBzZHAgKz0gJ2E9cnRjcDo5IElOIElQNCAwLjAuMC4wXFxyXFxuJztcblxuICAvLyBBZGQgYT1ydHBtYXAgbGluZXMgZm9yIGVhY2ggY29kZWMuIEFsc28gZm10cCBhbmQgcnRjcC1mYi5cbiAgY2Fwcy5jb2RlY3MuZm9yRWFjaChjb2RlYyA9PiB7XG4gICAgc2RwICs9IFNEUFV0aWxzLndyaXRlUnRwTWFwKGNvZGVjKTtcbiAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVGbXRwKGNvZGVjKTtcbiAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVSdGNwRmIoY29kZWMpO1xuICB9KTtcbiAgbGV0IG1heHB0aW1lID0gMDtcbiAgY2Fwcy5jb2RlY3MuZm9yRWFjaChjb2RlYyA9PiB7XG4gICAgaWYgKGNvZGVjLm1heHB0aW1lID4gbWF4cHRpbWUpIHtcbiAgICAgIG1heHB0aW1lID0gY29kZWMubWF4cHRpbWU7XG4gICAgfVxuICB9KTtcbiAgaWYgKG1heHB0aW1lID4gMCkge1xuICAgIHNkcCArPSAnYT1tYXhwdGltZTonICsgbWF4cHRpbWUgKyAnXFxyXFxuJztcbiAgfVxuXG4gIGlmIChjYXBzLmhlYWRlckV4dGVuc2lvbnMpIHtcbiAgICBjYXBzLmhlYWRlckV4dGVuc2lvbnMuZm9yRWFjaChleHRlbnNpb24gPT4ge1xuICAgICAgc2RwICs9IFNEUFV0aWxzLndyaXRlRXh0bWFwKGV4dGVuc2lvbik7XG4gICAgfSk7XG4gIH1cbiAgLy8gRklYTUU6IHdyaXRlIGZlY01lY2hhbmlzbXMuXG4gIHJldHVybiBzZHA7XG59O1xuXG4vLyBQYXJzZXMgdGhlIFNEUCBtZWRpYSBzZWN0aW9uIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mXG4vLyBSVENSdHBFbmNvZGluZ1BhcmFtZXRlcnMuXG5TRFBVdGlscy5wYXJzZVJ0cEVuY29kaW5nUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBlbmNvZGluZ1BhcmFtZXRlcnMgPSBbXTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBTRFBVdGlscy5wYXJzZVJ0cFBhcmFtZXRlcnMobWVkaWFTZWN0aW9uKTtcbiAgY29uc3QgaGFzUmVkID0gZGVzY3JpcHRpb24uZmVjTWVjaGFuaXNtcy5pbmRleE9mKCdSRUQnKSAhPT0gLTE7XG4gIGNvbnN0IGhhc1VscGZlYyA9IGRlc2NyaXB0aW9uLmZlY01lY2hhbmlzbXMuaW5kZXhPZignVUxQRkVDJykgIT09IC0xO1xuXG4gIC8vIGZpbHRlciBhPXNzcmM6Li4uIGNuYW1lOiwgaWdub3JlIFBsYW5CLW1zaWRcbiAgY29uc3Qgc3NyY3MgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXNzcmM6JylcbiAgICAubWFwKGxpbmUgPT4gU0RQVXRpbHMucGFyc2VTc3JjTWVkaWEobGluZSkpXG4gICAgLmZpbHRlcihwYXJ0cyA9PiBwYXJ0cy5hdHRyaWJ1dGUgPT09ICdjbmFtZScpO1xuICBjb25zdCBwcmltYXJ5U3NyYyA9IHNzcmNzLmxlbmd0aCA+IDAgJiYgc3NyY3NbMF0uc3NyYztcbiAgbGV0IHNlY29uZGFyeVNzcmM7XG5cbiAgY29uc3QgZmxvd3MgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXNzcmMtZ3JvdXA6RklEJylcbiAgICAubWFwKGxpbmUgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZygxNykuc3BsaXQoJyAnKTtcbiAgICAgIHJldHVybiBwYXJ0cy5tYXAocGFydCA9PiBwYXJzZUludChwYXJ0LCAxMCkpO1xuICAgIH0pO1xuICBpZiAoZmxvd3MubGVuZ3RoID4gMCAmJiBmbG93c1swXS5sZW5ndGggPiAxICYmIGZsb3dzWzBdWzBdID09PSBwcmltYXJ5U3NyYykge1xuICAgIHNlY29uZGFyeVNzcmMgPSBmbG93c1swXVsxXTtcbiAgfVxuXG4gIGRlc2NyaXB0aW9uLmNvZGVjcy5mb3JFYWNoKGNvZGVjID0+IHtcbiAgICBpZiAoY29kZWMubmFtZS50b1VwcGVyQ2FzZSgpID09PSAnUlRYJyAmJiBjb2RlYy5wYXJhbWV0ZXJzLmFwdCkge1xuICAgICAgbGV0IGVuY1BhcmFtID0ge1xuICAgICAgICBzc3JjOiBwcmltYXJ5U3NyYyxcbiAgICAgICAgY29kZWNQYXlsb2FkVHlwZTogcGFyc2VJbnQoY29kZWMucGFyYW1ldGVycy5hcHQsIDEwKSxcbiAgICAgIH07XG4gICAgICBpZiAocHJpbWFyeVNzcmMgJiYgc2Vjb25kYXJ5U3NyYykge1xuICAgICAgICBlbmNQYXJhbS5ydHggPSB7c3NyYzogc2Vjb25kYXJ5U3NyY307XG4gICAgICB9XG4gICAgICBlbmNvZGluZ1BhcmFtZXRlcnMucHVzaChlbmNQYXJhbSk7XG4gICAgICBpZiAoaGFzUmVkKSB7XG4gICAgICAgIGVuY1BhcmFtID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbmNQYXJhbSkpO1xuICAgICAgICBlbmNQYXJhbS5mZWMgPSB7XG4gICAgICAgICAgc3NyYzogcHJpbWFyeVNzcmMsXG4gICAgICAgICAgbWVjaGFuaXNtOiBoYXNVbHBmZWMgPyAncmVkK3VscGZlYycgOiAncmVkJyxcbiAgICAgICAgfTtcbiAgICAgICAgZW5jb2RpbmdQYXJhbWV0ZXJzLnB1c2goZW5jUGFyYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGlmIChlbmNvZGluZ1BhcmFtZXRlcnMubGVuZ3RoID09PSAwICYmIHByaW1hcnlTc3JjKSB7XG4gICAgZW5jb2RpbmdQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgc3NyYzogcHJpbWFyeVNzcmMsXG4gICAgfSk7XG4gIH1cblxuICAvLyB3ZSBzdXBwb3J0IGJvdGggYj1BUyBhbmQgYj1USUFTIGJ1dCBpbnRlcnByZXQgQVMgYXMgVElBUy5cbiAgbGV0IGJhbmR3aWR0aCA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2I9Jyk7XG4gIGlmIChiYW5kd2lkdGgubGVuZ3RoKSB7XG4gICAgaWYgKGJhbmR3aWR0aFswXS5pbmRleE9mKCdiPVRJQVM6JykgPT09IDApIHtcbiAgICAgIGJhbmR3aWR0aCA9IHBhcnNlSW50KGJhbmR3aWR0aFswXS5zdWJzdHJpbmcoNyksIDEwKTtcbiAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aFswXS5pbmRleE9mKCdiPUFTOicpID09PSAwKSB7XG4gICAgICAvLyB1c2UgZm9ybXVsYSBmcm9tIEpTRVAgdG8gY29udmVydCBiPUFTIHRvIFRJQVMgdmFsdWUuXG4gICAgICBiYW5kd2lkdGggPSBwYXJzZUludChiYW5kd2lkdGhbMF0uc3Vic3RyaW5nKDUpLCAxMCkgKiAxMDAwICogMC45NVxuICAgICAgICAgIC0gKDUwICogNDAgKiA4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFuZHdpZHRoID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbmNvZGluZ1BhcmFtZXRlcnMuZm9yRWFjaChwYXJhbXMgPT4ge1xuICAgICAgcGFyYW1zLm1heEJpdHJhdGUgPSBiYW5kd2lkdGg7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGVuY29kaW5nUGFyYW1ldGVycztcbn07XG5cbi8vIHBhcnNlcyBodHRwOi8vZHJhZnQub3J0Yy5vcmcvI3J0Y3J0Y3BwYXJhbWV0ZXJzKlxuU0RQVXRpbHMucGFyc2VSdGNwUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBydGNwUGFyYW1ldGVycyA9IHt9O1xuXG4gIC8vIEdldHMgdGhlIGZpcnN0IFNTUkMuIE5vdGUgdGhhdCB3aXRoIFJUWCB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZVxuICAvLyBTU1JDcy5cbiAgY29uc3QgcmVtb3RlU3NyYyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c3NyYzonKVxuICAgIC5tYXAobGluZSA9PiBTRFBVdGlscy5wYXJzZVNzcmNNZWRpYShsaW5lKSlcbiAgICAuZmlsdGVyKG9iaiA9PiBvYmouYXR0cmlidXRlID09PSAnY25hbWUnKVswXTtcbiAgaWYgKHJlbW90ZVNzcmMpIHtcbiAgICBydGNwUGFyYW1ldGVycy5jbmFtZSA9IHJlbW90ZVNzcmMudmFsdWU7XG4gICAgcnRjcFBhcmFtZXRlcnMuc3NyYyA9IHJlbW90ZVNzcmMuc3NyYztcbiAgfVxuXG4gIC8vIEVkZ2UgdXNlcyB0aGUgY29tcG91bmQgYXR0cmlidXRlIGluc3RlYWQgb2YgcmVkdWNlZFNpemVcbiAgLy8gY29tcG91bmQgaXMgIXJlZHVjZWRTaXplXG4gIGNvbnN0IHJzaXplID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1ydGNwLXJzaXplJyk7XG4gIHJ0Y3BQYXJhbWV0ZXJzLnJlZHVjZWRTaXplID0gcnNpemUubGVuZ3RoID4gMDtcbiAgcnRjcFBhcmFtZXRlcnMuY29tcG91bmQgPSByc2l6ZS5sZW5ndGggPT09IDA7XG5cbiAgLy8gcGFyc2VzIHRoZSBydGNwLW11eCBhdHRy0ZZidXRlLlxuICAvLyBOb3RlIHRoYXQgRWRnZSBkb2VzIG5vdCBzdXBwb3J0IHVubXV4ZWQgUlRDUC5cbiAgY29uc3QgbXV4ID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1ydGNwLW11eCcpO1xuICBydGNwUGFyYW1ldGVycy5tdXggPSBtdXgubGVuZ3RoID4gMDtcblxuICByZXR1cm4gcnRjcFBhcmFtZXRlcnM7XG59O1xuXG5TRFBVdGlscy53cml0ZVJ0Y3BQYXJhbWV0ZXJzID0gZnVuY3Rpb24ocnRjcFBhcmFtZXRlcnMpIHtcbiAgbGV0IHNkcCA9ICcnO1xuICBpZiAocnRjcFBhcmFtZXRlcnMucmVkdWNlZFNpemUpIHtcbiAgICBzZHAgKz0gJ2E9cnRjcC1yc2l6ZVxcclxcbic7XG4gIH1cbiAgaWYgKHJ0Y3BQYXJhbWV0ZXJzLm11eCkge1xuICAgIHNkcCArPSAnYT1ydGNwLW11eFxcclxcbic7XG4gIH1cbiAgaWYgKHJ0Y3BQYXJhbWV0ZXJzLnNzcmMgIT09IHVuZGVmaW5lZCAmJiBydGNwUGFyYW1ldGVycy5jbmFtZSkge1xuICAgIHNkcCArPSAnYT1zc3JjOicgKyBydGNwUGFyYW1ldGVycy5zc3JjICtcbiAgICAgICcgY25hbWU6JyArIHJ0Y3BQYXJhbWV0ZXJzLmNuYW1lICsgJ1xcclxcbic7XG4gIH1cbiAgcmV0dXJuIHNkcDtcbn07XG5cblxuLy8gcGFyc2VzIGVpdGhlciBhPW1zaWQ6IG9yIGE9c3NyYzouLi4gbXNpZCBsaW5lcyBhbmQgcmV0dXJuc1xuLy8gdGhlIGlkIG9mIHRoZSBNZWRpYVN0cmVhbSBhbmQgTWVkaWFTdHJlYW1UcmFjay5cblNEUFV0aWxzLnBhcnNlTXNpZCA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBsZXQgcGFydHM7XG4gIGNvbnN0IHNwZWMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPW1zaWQ6Jyk7XG4gIGlmIChzcGVjLmxlbmd0aCA9PT0gMSkge1xuICAgIHBhcnRzID0gc3BlY1swXS5zdWJzdHJpbmcoNykuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4ge3N0cmVhbTogcGFydHNbMF0sIHRyYWNrOiBwYXJ0c1sxXX07XG4gIH1cbiAgY29uc3QgcGxhbkIgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXNzcmM6JylcbiAgICAubWFwKGxpbmUgPT4gU0RQVXRpbHMucGFyc2VTc3JjTWVkaWEobGluZSkpXG4gICAgLmZpbHRlcihtc2lkUGFydHMgPT4gbXNpZFBhcnRzLmF0dHJpYnV0ZSA9PT0gJ21zaWQnKTtcbiAgaWYgKHBsYW5CLmxlbmd0aCA+IDApIHtcbiAgICBwYXJ0cyA9IHBsYW5CWzBdLnZhbHVlLnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIHtzdHJlYW06IHBhcnRzWzBdLCB0cmFjazogcGFydHNbMV19O1xuICB9XG59O1xuXG4vLyBTQ1RQXG4vLyBwYXJzZXMgZHJhZnQtaWV0Zi1tbXVzaWMtc2N0cC1zZHAtMjYgZmlyc3QgYW5kIGZhbGxzIGJhY2tcbi8vIHRvIGRyYWZ0LWlldGYtbW11c2ljLXNjdHAtc2RwLTA1XG5TRFBVdGlscy5wYXJzZVNjdHBEZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBtbGluZSA9IFNEUFV0aWxzLnBhcnNlTUxpbmUobWVkaWFTZWN0aW9uKTtcbiAgY29uc3QgbWF4U2l6ZUxpbmUgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPW1heC1tZXNzYWdlLXNpemU6Jyk7XG4gIGxldCBtYXhNZXNzYWdlU2l6ZTtcbiAgaWYgKG1heFNpemVMaW5lLmxlbmd0aCA+IDApIHtcbiAgICBtYXhNZXNzYWdlU2l6ZSA9IHBhcnNlSW50KG1heFNpemVMaW5lWzBdLnN1YnN0cmluZygxOSksIDEwKTtcbiAgfVxuICBpZiAoaXNOYU4obWF4TWVzc2FnZVNpemUpKSB7XG4gICAgbWF4TWVzc2FnZVNpemUgPSA2NTUzNjtcbiAgfVxuICBjb25zdCBzY3RwUG9ydCA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c2N0cC1wb3J0OicpO1xuICBpZiAoc2N0cFBvcnQubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3J0OiBwYXJzZUludChzY3RwUG9ydFswXS5zdWJzdHJpbmcoMTIpLCAxMCksXG4gICAgICBwcm90b2NvbDogbWxpbmUuZm10LFxuICAgICAgbWF4TWVzc2FnZVNpemUsXG4gICAgfTtcbiAgfVxuICBjb25zdCBzY3RwTWFwTGluZXMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXNjdHBtYXA6Jyk7XG4gIGlmIChzY3RwTWFwTGluZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHBhcnRzID0gc2N0cE1hcExpbmVzWzBdXG4gICAgICAuc3Vic3RyaW5nKDEwKVxuICAgICAgLnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvcnQ6IHBhcnNlSW50KHBhcnRzWzBdLCAxMCksXG4gICAgICBwcm90b2NvbDogcGFydHNbMV0sXG4gICAgICBtYXhNZXNzYWdlU2l6ZSxcbiAgICB9O1xuICB9XG59O1xuXG4vLyBTQ1RQXG4vLyBvdXRwdXRzIHRoZSBkcmFmdC1pZXRmLW1tdXNpYy1zY3RwLXNkcC0yNiB2ZXJzaW9uIHRoYXQgYWxsIGJyb3dzZXJzXG4vLyBzdXBwb3J0IGJ5IG5vdyByZWNlaXZpbmcgaW4gdGhpcyBmb3JtYXQsIHVubGVzcyB3ZSBvcmlnaW5hbGx5IHBhcnNlZFxuLy8gYXMgdGhlIGRyYWZ0LWlldGYtbW11c2ljLXNjdHAtc2RwLTA1IGZvcm1hdCAoaW5kaWNhdGVkIGJ5IHRoZSBtLWxpbmVcbi8vIHByb3RvY29sIG9mIERUTFMvU0NUUCAtLSB3aXRob3V0IFVEUC8gb3IgVENQLylcblNEUFV0aWxzLndyaXRlU2N0cERlc2NyaXB0aW9uID0gZnVuY3Rpb24obWVkaWEsIHNjdHApIHtcbiAgbGV0IG91dHB1dCA9IFtdO1xuICBpZiAobWVkaWEucHJvdG9jb2wgIT09ICdEVExTL1NDVFAnKSB7XG4gICAgb3V0cHV0ID0gW1xuICAgICAgJ209JyArIG1lZGlhLmtpbmQgKyAnIDkgJyArIG1lZGlhLnByb3RvY29sICsgJyAnICsgc2N0cC5wcm90b2NvbCArICdcXHJcXG4nLFxuICAgICAgJ2M9SU4gSVA0IDAuMC4wLjBcXHJcXG4nLFxuICAgICAgJ2E9c2N0cC1wb3J0OicgKyBzY3RwLnBvcnQgKyAnXFxyXFxuJyxcbiAgICBdO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IFtcbiAgICAgICdtPScgKyBtZWRpYS5raW5kICsgJyA5ICcgKyBtZWRpYS5wcm90b2NvbCArICcgJyArIHNjdHAucG9ydCArICdcXHJcXG4nLFxuICAgICAgJ2M9SU4gSVA0IDAuMC4wLjBcXHJcXG4nLFxuICAgICAgJ2E9c2N0cG1hcDonICsgc2N0cC5wb3J0ICsgJyAnICsgc2N0cC5wcm90b2NvbCArICcgNjU1MzVcXHJcXG4nLFxuICAgIF07XG4gIH1cbiAgaWYgKHNjdHAubWF4TWVzc2FnZVNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgIG91dHB1dC5wdXNoKCdhPW1heC1tZXNzYWdlLXNpemU6JyArIHNjdHAubWF4TWVzc2FnZVNpemUgKyAnXFxyXFxuJyk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn07XG5cbi8vIEdlbmVyYXRlIGEgc2Vzc2lvbiBJRCBmb3IgU0RQLlxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtcnRjd2ViLWpzZXAtMjAjc2VjdGlvbi01LjIuMVxuLy8gcmVjb21tZW5kcyB1c2luZyBhIGNyeXB0b2dyYXBoaWNhbGx5IHJhbmRvbSArdmUgNjQtYml0IHZhbHVlXG4vLyBidXQgcmlnaHQgbm93IHRoaXMgc2hvdWxkIGJlIGFjY2VwdGFibGUgYW5kIHdpdGhpbiB0aGUgcmlnaHQgcmFuZ2VcblNEUFV0aWxzLmdlbmVyYXRlU2Vzc2lvbklkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyKDIsIDIyKTtcbn07XG5cbi8vIFdyaXRlIGJvaWxlciBwbGF0ZSBmb3Igc3RhcnQgb2YgU0RQXG4vLyBzZXNzSWQgYXJndW1lbnQgaXMgb3B0aW9uYWwgLSBpZiBub3Qgc3VwcGxpZWQgaXQgd2lsbFxuLy8gYmUgZ2VuZXJhdGVkIHJhbmRvbWx5XG4vLyBzZXNzVmVyc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gMlxuLy8gc2Vzc1VzZXIgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICd0aGlzaXNhZGFwdGVyb3J0YydcblNEUFV0aWxzLndyaXRlU2Vzc2lvbkJvaWxlcnBsYXRlID0gZnVuY3Rpb24oc2Vzc0lkLCBzZXNzVmVyLCBzZXNzVXNlcikge1xuICBsZXQgc2Vzc2lvbklkO1xuICBjb25zdCB2ZXJzaW9uID0gc2Vzc1ZlciAhPT0gdW5kZWZpbmVkID8gc2Vzc1ZlciA6IDI7XG4gIGlmIChzZXNzSWQpIHtcbiAgICBzZXNzaW9uSWQgPSBzZXNzSWQ7XG4gIH0gZWxzZSB7XG4gICAgc2Vzc2lvbklkID0gU0RQVXRpbHMuZ2VuZXJhdGVTZXNzaW9uSWQoKTtcbiAgfVxuICBjb25zdCB1c2VyID0gc2Vzc1VzZXIgfHwgJ3RoaXNpc2FkYXB0ZXJvcnRjJztcbiAgLy8gRklYTUU6IHNlc3MtaWQgc2hvdWxkIGJlIGFuIE5UUCB0aW1lc3RhbXAuXG4gIHJldHVybiAndj0wXFxyXFxuJyArXG4gICAgICAnbz0nICsgdXNlciArICcgJyArIHNlc3Npb25JZCArICcgJyArIHZlcnNpb24gK1xuICAgICAgICAnIElOIElQNCAxMjcuMC4wLjFcXHJcXG4nICtcbiAgICAgICdzPS1cXHJcXG4nICtcbiAgICAgICd0PTAgMFxcclxcbic7XG59O1xuXG4vLyBHZXRzIHRoZSBkaXJlY3Rpb24gZnJvbSB0aGUgbWVkaWFTZWN0aW9uIG9yIHRoZSBzZXNzaW9ucGFydC5cblNEUFV0aWxzLmdldERpcmVjdGlvbiA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpIHtcbiAgLy8gTG9vayBmb3Igc2VuZHJlY3YsIHNlbmRvbmx5LCByZWN2b25seSwgaW5hY3RpdmUsIGRlZmF1bHQgdG8gc2VuZHJlY3YuXG4gIGNvbnN0IGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoIChsaW5lc1tpXSkge1xuICAgICAgY2FzZSAnYT1zZW5kcmVjdic6XG4gICAgICBjYXNlICdhPXNlbmRvbmx5JzpcbiAgICAgIGNhc2UgJ2E9cmVjdm9ubHknOlxuICAgICAgY2FzZSAnYT1pbmFjdGl2ZSc6XG4gICAgICAgIHJldHVybiBsaW5lc1tpXS5zdWJzdHJpbmcoMik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBGSVhNRTogV2hhdCBzaG91bGQgaGFwcGVuIGhlcmU/XG4gICAgfVxuICB9XG4gIGlmIChzZXNzaW9ucGFydCkge1xuICAgIHJldHVybiBTRFBVdGlscy5nZXREaXJlY3Rpb24oc2Vzc2lvbnBhcnQpO1xuICB9XG4gIHJldHVybiAnc2VuZHJlY3YnO1xufTtcblxuU0RQVXRpbHMuZ2V0S2luZCA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBsaW5lcyA9IFNEUFV0aWxzLnNwbGl0TGluZXMobWVkaWFTZWN0aW9uKTtcbiAgY29uc3QgbWxpbmUgPSBsaW5lc1swXS5zcGxpdCgnICcpO1xuICByZXR1cm4gbWxpbmVbMF0uc3Vic3RyaW5nKDIpO1xufTtcblxuU0RQVXRpbHMuaXNSZWplY3RlZCA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICByZXR1cm4gbWVkaWFTZWN0aW9uLnNwbGl0KCcgJywgMilbMV0gPT09ICcwJztcbn07XG5cblNEUFV0aWxzLnBhcnNlTUxpbmUgPSBmdW5jdGlvbihtZWRpYVNlY3Rpb24pIHtcbiAgY29uc3QgbGluZXMgPSBTRFBVdGlscy5zcGxpdExpbmVzKG1lZGlhU2VjdGlvbik7XG4gIGNvbnN0IHBhcnRzID0gbGluZXNbMF0uc3Vic3RyaW5nKDIpLnNwbGl0KCcgJyk7XG4gIHJldHVybiB7XG4gICAga2luZDogcGFydHNbMF0sXG4gICAgcG9ydDogcGFyc2VJbnQocGFydHNbMV0sIDEwKSxcbiAgICBwcm90b2NvbDogcGFydHNbMl0sXG4gICAgZm10OiBwYXJ0cy5zbGljZSgzKS5qb2luKCcgJyksXG4gIH07XG59O1xuXG5TRFBVdGlscy5wYXJzZU9MaW5lID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGNvbnN0IGxpbmUgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdvPScpWzBdO1xuICBjb25zdCBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDIpLnNwbGl0KCcgJyk7XG4gIHJldHVybiB7XG4gICAgdXNlcm5hbWU6IHBhcnRzWzBdLFxuICAgIHNlc3Npb25JZDogcGFydHNbMV0sXG4gICAgc2Vzc2lvblZlcnNpb246IHBhcnNlSW50KHBhcnRzWzJdLCAxMCksXG4gICAgbmV0VHlwZTogcGFydHNbM10sXG4gICAgYWRkcmVzc1R5cGU6IHBhcnRzWzRdLFxuICAgIGFkZHJlc3M6IHBhcnRzWzVdLFxuICB9O1xufTtcblxuLy8gYSB2ZXJ5IG5haXZlIGludGVycHJldGF0aW9uIG9mIGEgdmFsaWQgU0RQLlxuU0RQVXRpbHMuaXNWYWxpZFNEUCA9IGZ1bmN0aW9uKGJsb2IpIHtcbiAgaWYgKHR5cGVvZiBibG9iICE9PSAnc3RyaW5nJyB8fCBibG9iLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBsaW5lcyA9IFNEUFV0aWxzLnNwbGl0TGluZXMoYmxvYik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobGluZXNbaV0ubGVuZ3RoIDwgMiB8fCBsaW5lc1tpXS5jaGFyQXQoMSkgIT09ICc9Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBUT0RPOiBjaGVjayB0aGUgbW9kaWZpZXIgYSBiaXQgbW9yZS5cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbmlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICBtb2R1bGUuZXhwb3J0cyA9IFNEUFV0aWxzO1xufVxuIiwidmFyIGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG5mdW5jdGlvbiB3YXJuaW5nKGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoIWlzUHJvZHVjdGlvbikge1xuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGV4dCA9IFwiV2FybmluZzogXCIgKyBtZXNzYWdlO1xuXG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS53YXJuKHRleHQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aHJvdyBFcnJvcih0ZXh0KTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdhcm5pbmc7XG4iLCJleHBvcnQgKiBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuZXhwb3J0ICogZnJvbSBcIkBlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYlwiO1xuIiwiaW1wb3J0IHsgUGl4ZWxTdHJlYW1pbmcsIFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIgfSBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuaW1wb3J0IHsgQXJjd2FyZVBpeGVsU3RyZWFtaW5nIH0gZnJvbSBcIi4vQXJjd2FyZVBpeGVsU3RyZWFtaW5nXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBVcmxCdWlsZGVyKGlucHV0OiAoKSA9PiBzdHJpbmcsIHVybEZsYWdzPzogc3RyaW5nKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoZGVjb2RlVVJJQ29tcG9uZW50KGlucHV0KCkpKTtcbiAgY29uc3QgcGFyYW1zID0gdXJsLnNlYXJjaFBhcmFtcztcblxuICBsZXQgZmxhZ3MgPSB1cmxGbGFncztcbiAgaWYgKGZsYWdzKSB7XG4gICAgaWYgKGZsYWdzLnN0YXJ0c1dpdGgoXCI/XCIpKSBmbGFncyA9IGZsYWdzLnN1YnN0cmluZygxKTtcbiAgICBmbGFncy5zcGxpdChcIiZcIikuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSB2YWwuc3BsaXQoXCI9XCIpO1xuICAgICAgLy8gRW5zdXJlIHRoZSB2YWx1ZSBpcyBlbmNvZGVkXG4gICAgICBwYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHVybC50b1N0cmluZygpO1xufVxuXG4vLyBIYWNrXG5leHBvcnQgZnVuY3Rpb24gQXBwbHlVcmxIYWNrKCkge1xuICBjb25zdCBzZXRXZWJSdGNQbGF5ZXJDb250cm9sbGVyID0gUGl4ZWxTdHJlYW1pbmcucHJvdG90eXBlW1wic2V0V2ViUnRjUGxheWVyQ29udHJvbGxlclwiXTtcbiAgUGl4ZWxTdHJlYW1pbmcucHJvdG90eXBlW1wic2V0V2ViUnRjUGxheWVyQ29udHJvbGxlclwiXSA9IGZ1bmN0aW9uIHNldFdlYlJ0Y1BsYXllckNvbnRyb2xsZXJPdmVycmlkZShcbiAgICB0aGlzOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcsXG4gICAgd2ViUnRjUGxheWVyQ29udHJvbGxlcjogV2ViUnRjUGxheWVyQ29udHJvbGxlclxuICApOiB2b2lkIHtcbiAgICAvKiogVGhlIGRlZmF1bHQgdXJsIGJ1aWxkZXIgd2lsbCBzaW1wbHkgYWRkIGEgcXVlcnktcGFyYW1ldGVyIHdpdGhvdXQgY2hlY2tpbmcgdGhlIGluaXRpYWwgdXJsLlxuICAgICAqIFRvIGZpeCB0aGF0IGlmIHRoZSB1cmwgYWxyZWFkeSBjb21lcyB3aXRoIHF1ZXJ5LXBhcmFtZXRlcnMgdGhlIG91dHB1dCBoYXMgdG8gYmUgcmV3cml0dGVuLiAqL1xuICAgIGNvbnN0IHNpZ25hbGxpbmdVcmxCdWlsZGVyID0gd2ViUnRjUGxheWVyQ29udHJvbGxlci5zaWduYWxsaW5nVXJsQnVpbGRlcjtcbiAgICB3ZWJSdGNQbGF5ZXJDb250cm9sbGVyLnNpZ25hbGxpbmdVcmxCdWlsZGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIFVybEJ1aWxkZXIoc2lnbmFsbGluZ1VybEJ1aWxkZXIsIHRoaXMuY29uZmlnLnVybEZsYWdzKTtcbiAgICB9O1xuXG4gICAgc2V0V2ViUnRjUGxheWVyQ29udHJvbGxlci5jYWxsKHRoaXMsIHdlYlJ0Y1BsYXllckNvbnRyb2xsZXIpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgTWVzc2FnZXMgfSBmcm9tIFwiQGFyY3dhcmUtY2xvdWQvc2hhcmVkLXBpeGVsc3RyZWFtaW5nLXdlYnNka1wiO1xuaW1wb3J0IHtcbiAgU2V0dGluZ0ZsYWcsXG4gIFNldHRpbmdUZXh0LFxuICBXZWJSdGNQbGF5ZXJDb250cm9sbGVyLFxuICBDb25maWcsXG4gIEZsYWdzLFxufSBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb24sXG4gIFNldHRpbmdVSUZsYWcsXG4gIFNldHRpbmdVSVRleHQsXG4gIFVJT3B0aW9ucyxcbiAgUGl4ZWxTdHJlYW1pbmdBcHBsaWNhdGlvblN0eWxlLFxufSBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNVwiO1xuaW1wb3J0IHsgQXJjd2FyZVBpeGVsU3RyZWFtaW5nIH0gZnJvbSBcIi4vQXJjd2FyZVBpeGVsU3RyZWFtaW5nXCI7XG5pbXBvcnQgeyBBcmN3YXJlU3R5bGVzIH0gZnJvbSBcIi4vc3R5bGVzL0FyY3dhcmVQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzXCI7XG5pbXBvcnQgeyBBdWRpb0J1dHRvbiB9IGZyb20gXCIuL3VpL0F1ZGlvQnV0dG9uXCI7XG5pbXBvcnQgeyBNaWNCdXR0b24gfSBmcm9tIFwiLi91aS9NaWNCdXR0b25cIjtcbmltcG9ydCB7IFN0b3BCdXR0b24gfSBmcm9tIFwiLi91aS9TdG9wQnV0dG9uXCI7XG5cbmNvbnN0IERFQlVHID0gZmFsc2U7XG5cbmNvbnN0IFRleHRLZXlSZWdleCA9IC9eKFxcWycoW2EtekEtWiAwLTktX10rKSdcXF0gKS87XG5cbmZ1bmN0aW9uIGZpbmRFbGVtZW50QnlUZXh0Q29udGVudChyb290OiBIVE1MRWxlbWVudCB8IG51bGwsIHNlbGVjdG9yOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBtYXRjaCA9IFRleHRLZXlSZWdleC5leGVjKHNlbGVjdG9yKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFjdHVhbFNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZShtYXRjaFsxXSwgXCJcIik7XG4gIGNvbnN0IHRleHQgPSBtYXRjaFsyXS50cmltKCk7XG5cbiAgY29uc3QgZWxlbWVudHMgPSAocm9vdCB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYWN0dWFsU2VsZWN0b3IpO1xuICBsZXQgcmVzdWx0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBlbGVtZW50VGV4dDogc3RyaW5nID0gZWxlbWVudD8uaW5uZXJIVE1MLnRyaW0oKTtcbiAgICBpZiAoIXJlc3VsdCAmJiBlbGVtZW50Py5pbm5lckhUTUw/LmluY2x1ZGVzKGA+JHt0ZXh0fTxgKSkge1xuICAgICAgcmVzdWx0ID0gZWxlbWVudDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCByZW1vdmFsczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7XG4gIC8vIElzIG5vdCB1c2VkIGJ5IEFyY3dhcmUgc3lzdGVtIC0gbWF5IG5lZWQgYWRkaXRpb25hbCBjaGVja2luZy5cbiAgXCIjU3RyZWFtZXJJZFwiOiB0cnVlLFxuICAvLyBTaWduYWxsaW5nLVNlcnZlclxuICBcIiNzc1wiOiB0cnVlLFxuICAvLyBJcyBub3Qgd29ya2luZyB3aXRoIG91ciBBRksgU2V0dXAuXG4gIFwiI1RpbWVvdXRJZklkbGVcIjogdHJ1ZSxcbiAgLy8gT2ZmZXJUb1JlY2VpdmUgbmVlZHMgdG8gYmUgZW5hYmxlZCBpbiBBcmN3YXJlIGNsb3VkIGVudmlyb25tZW50LlxuICBcIiNPZmZlclRvUmVjZWl2ZVwiOiB0cnVlLFxuICAvLyBTRlUgY2FuJ3QgYmUgaGFuZGxlZCBpbiBjbG91ZCBlbnZpcm9ubWVudC5cbiAgXCIjcHJlZmVyU0ZVXCI6IHRydWUsXG4gIC8vIFNUVU4gLyBUVVJOIGNhbid0IGJlIGhhbmRsZWQgaW4gY2xvdWQgZW52aXJvbm1lbnQuXG4gIFwiI0ZvcmNlVFVSTlwiOiB0cnVlLFxuICAvLyBBcmN3YXJlIFVJIGRvZXMgbm90IHN1cHBvcnQgTGlnaHQgb3IgRGFyayBtb2RlLlxuICBcIiNMaWdodE1vZGVcIjogdHJ1ZSxcbiAgLy8gQnkgZGVmYXVsdCB0aGUgVXNlTWljIHNldHRpbmcgc2hvdWxkIGJlIGRpc2FibGVkLCBzaW5jZSB0aGUgd29uJ3Qgd29yayB3aXRoIDQuMjcgYW55d2F5LlxuICBcIiNVc2VNaWNcIjogdHJ1ZSxcbiAgLy8gQnkgZGVmYXVsdCB0aGUgTWF0Y2hWaWV3cG9ydFJlcyBzZXR0aW5nIHNob3VsZCBiZSBkaXNhYmxlZCwgc2luY2Ugd2UgaGF2ZSBhIGN1c3RvbSBtZXRob2QgZm9yIHRoYXQuXG4gIFwiI01hdGNoVmlld3BvcnRSZXNcIjogdHJ1ZSxcbiAgLy8gQnkgZGVmYXVsdCB0aGUgSG92ZXJpbmdNb3VzZSBzZXR0aW5nIHNob3VsZCBiZSBkaXNhYmxlZCwgc2luY2Ugd2UgaGF2ZSBhIGN1c3RvbSBtZXRob2QgZm9yIHRoYXQuXG4gIFwiI0hvdmVyaW5nTW91c2VcIjogdHJ1ZSxcbiAgLy8gQUZLIElkbGUgdGltZS5cbiAgXCJbJ0FGSyB0aW1lb3V0J10gZGl2LnNldHRpbmcuZm9ybS1ncm91cDpub3QoW2lkXSlcIjogdHJ1ZSxcbiAgLy8gQnkgZGVmYXVsdCB0aGUgZW5jb2RlciBzZXR0aW5ncyBzaG91bGQgYmUgZGlzYWJsZWQsIHNpbmNlIHRoZSB3b24ndCB3b3JrIHdpdGggNC4yNyBhbnl3YXkuXG4gIFwiWydFbmNvZGVyJ10gc2VjdGlvbi5zZXR0aW5nc0NvbnRhaW5lcjpub3QoW2lkXSlcIjogdHJ1ZSxcbiAgLy8gQnkgZGVmYXVsdCB0aGUgV2ViUlRDIHNldHRpbmdzIHNob3VsZCBiZSBkaXNhYmxlZCwgc2luY2UgdGhlIHdvbid0IHdvcmsgd2l0aCA0LjI3IGFueXdheS5cbiAgXCJbJ1dlYlJUQyddIHNlY3Rpb24uc2V0dGluZ3NDb250YWluZXI6bm90KFtpZF0pXCI6IHRydWUsXG4gIC8vIEJ5IGRlZmF1bHQgdGhlIFVJIHNldHRpbmdzIHNob3VsZCBiZSBkaXNhYmxlZCwgc2luY2Ugd2UgaGF2ZSBhIGN1c3RvbSBtZXRob2QgZm9yIHRoZW0uXG4gIFwiWydVSSddIHNlY3Rpb24uc2V0dGluZ3NDb250YWluZXI6bm90KFtpZF0pXCI6IHRydWUsXG4gIC8vIEhpZGUgb3B0aW9uIG9mIHN0YXJ0IGF1ZGlvIG11dGVkIG9yIG5vdFxuICBcIiNTdGFydFZpZGVvTXV0ZWRcIjogdHJ1ZSxcbn07XG5cbmlmIChERUJVRylcbiAgT2JqZWN0LmtleXMocmVtb3ZhbHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHJlbW92YWxzW2tleV0gPSBmYWxzZTtcbiAgfSk7XG5cbmZ1bmN0aW9uIHJlbW92ZShrZXk6IHN0cmluZywgZWxlbWVudD86IEhUTUxFbGVtZW50IHwgbnVsbCkge1xuICBpZiAocmVtb3ZhbHNba2V5XSA9PT0gdHJ1ZSkge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoREVCVUcpIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5zdHlsZS5jb2xvciA9IFwicmVkXCI7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcmN3YXJlQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7XG4gIHN0YXRpYyBGbGFncyA9IGNsYXNzIHtcbiAgICBzdGF0aWMgbm9TZXNzaW9uID0gXCJub1Nlc3Npb25cIiBhcyBjb25zdDtcbiAgfTtcblxuICBwdWJsaWMgb3ZlcnJpZGUgc3RyZWFtOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmc7XG4gIHByaXZhdGUgdmlkZW9FbGVtZW50UGFyZW50OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIHByaXZhdGUgcmVzcG9uc2VDYWxsYmFjazogKChyZXNwb25zZTogc3RyaW5nKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdlYlJ0Y0NvbnRyb2xsZXI6IFdlYlJ0Y1BsYXllckNvbnRyb2xsZXI7XG5cbiAgb3ZlcnJpZGUgZ2V0IHJvb3RFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gc3VwZXIucm9vdEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIEFyY3dhcmVTZWN0aW9uOiBIVE1MRWxlbWVudCA9IHRoaXMuY29uZmlnVUkuYnVpbGRTZWN0aW9uV2l0aEhlYWRpbmcoXG4gICAgdGhpcy5zZXR0aW5nc1BhbmVsLnNldHRpbmdzQ29udGVudEVsZW1lbnQsXG4gICAgXCJBcmN3YXJlIENsb3VkXCJcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBVSU9wdGlvbnMgJiB7IHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nIH0pIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnN0cmVhbSA9IG9wdGlvbnM/LnN0cmVhbTtcbiAgICB0aGlzLmVtaXRVSUludGVyYWN0aW9uID0gdGhpcy5lbWl0VUlJbnRlcmFjdGlvbi5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5hZGp1c3RTZXR0aW5nc1BhbmVsKCk7XG4gICAgdGhpcy5jcmVhdGVBdWRpb1RvZ2dsZUJ1dHRvbigpO1xuICAgIHRoaXMuY3JlYXRlTWljVG9nZ2xlQnV0dG9uKCk7XG4gICAgdGhpcy5jcmVhdGVTdG9wQnV0dG9uKCk7XG4gICAgdGhpcy5hcHBseUFyY3dhcmVTdHlsZXMoKTtcblxuICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcz8uc3RyZWFtPy52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gdGhpcz8udmlkZW9FbGVtZW50UGFyZW50Py5wYXJlbnRFbGVtZW50O1xuICAgIHRoaXMud2ViUnRjQ29udHJvbGxlciA9IHRoaXM/LnN0cmVhbT8uW1wiX3dlYlJ0Y0NvbnRyb2xsZXJcIl07XG4gICAgXG4gICAgdGhpcy5hZGRMb3ZlTGV0dGVyaGFuZGxlcigpXG5cbiAgICB0aGlzPy5zdHJlYW0/LmFkZFJlc3BvbnNlRXZlbnRMaXN0ZW5lcihcInVlLXJlc3BvbnNlXCIsIChyZXNwb25zZSkgPT4gdGhpcz8uYXBwbGljYXRpb25SZXNwb25zZShyZXNwb25zZSkpO1xuXG4gICAgdGhpcz8uc3RyZWFtPy5zZXNzaW9uSWRIYW5kbGVyPy5hZGQoKHNlc3Npb25JZCkgPT4ge1xuICAgICAgdGhpcz8uc3RhdHNQYW5lbD8uYWRkT3JVcGRhdGVTZXNzaW9uU3RhdChcInNlc3Npb25JZFwiLCBcIlNlc3Npb25JZFwiLCBzZXNzaW9uSWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcz8uc3RyZWFtPy52aWRlb0luaXRpYWxpemVkSGFuZGxlcj8uYWRkKCgpID0+IHtcbiAgICAgIHRoaXM/LmN1cnJlbnRPdmVybGF5Py5oaWRlKCk7XG4gICAgICBpZiAodGhpcz8uc3RyZWFtPy5zdHJlYW1JbmZvKSB0aGlzPy5hdXRvUGxheUhhbmRsZXIodGhpcz8uc3RyZWFtPy5zdHJlYW1JbmZvKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHVpSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIC8vIFJlbW92ZSBmdWxsc2NyZWVuIFVJIERlZmF1bHQgYnV0dG9ucyBmcm9tIERPTVxuICAgICAgdGhpcz8udWlEZWZhdWx0QnV0dG9uVmlzaWJpbHR5KFwiZnVsbHNjcmVlbkJ1dHRvblwiLCBcIiNmdWxsc2NyZWVuLWJ0blwiKTtcbiAgICAgIHRoaXM/LnVpRGVmYXVsdEJ1dHRvblZpc2liaWx0eShcInNldHRpbmdzQnV0dG9uXCIsIFwiI3NldHRpbmdzQnRuXCIpO1xuICAgICAgdGhpcz8udWlEZWZhdWx0QnV0dG9uVmlzaWJpbHR5KFwiaW5mb0J1dHRvblwiLCBcIiNzdGF0c0J0blwiKTtcbiAgICAgIHRoaXM/LnVpRGVmYXVsdEJ1dHRvblZpc2liaWx0eShcImF1ZGlvQnV0dG9uXCIsIFwiI2F1ZGlvQnRuXCIpO1xuICAgICAgdGhpcz8udWlEZWZhdWx0QnV0dG9uVmlzaWJpbHR5KFwic3RvcEJ1dHRvblwiLCBcIiNzdG9wQnRuXCIpO1xuICAgICAgdGhpcz8udWlEZWZhdWx0QnV0dG9uVmlzaWJpbHR5KFwiY29ubmVjdGlvblN0cmVuZ3RoSWNvblwiLCBcIiNjb25uZWN0aW9uXCIpO1xuICAgICAgdGhpcz8udWlEZWZhdWx0QnV0dG9uVmlzaWJpbHR5KFwibWljQnV0dG9uXCIsIFwiI21pY0J0blwiKTtcblxuICAgICAgdGhpcy51aUVsZW1lbnRzVmlzaWJpbGl0eSh0cnVlKTtcbiAgICB9O1xuXG4gICAgLy8gRWl0aGVyIG9uIHN0cmVhbUluZm9cbiAgICAvLyB0aGlzPy5zdHJlYW0uc3RyZWFtSW5mb0hhbmRsZXIuYWRkKHVpSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAvLyBPciBvbiBpbml0aWFsaXplLlxuICAgIHRoaXM/LnN0cmVhbT8udmlkZW9Jbml0aWFsaXplZEhhbmRsZXI/LmFkZCh1aUhhbmRsZXIuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnVpRWxlbWVudHNWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICB0aGlzLmFkZFRleHRUb0Nvbm5lY3RPdmVybGF5KCk7XG4gICAgdGhpcy5wcmV2ZW50RGVmYXVsdEtleWJvYXJkRXZlbnRzKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkTG92ZUxldHRlcmhhbmRsZXIoKVxuICB7XG4gICAgdGhpcz8uc3RyZWFtPy5sb3ZlTGV0dGVySGFuZGxlcj8uYWRkKChsb3ZlTGV0dGVyKSA9PiB7XG4gICAgICBpZiAodGhpcz8ucGxheU92ZXJsYXkgJiYgbG92ZUxldHRlciAmJiB0aGlzPy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGluZm9PdmVybGF5ID0gdGhpcz8ucGFyZW50RWxlbWVudD8ucXVlcnlTZWxlY3RvcihcIiNpbmZvT3ZlcmxheVwiKTtcbiAgICAgICAgaWYgKGluZm9PdmVybGF5KSB7XG4gICAgICAgICAgaW5mb092ZXJsYXk/LmNsYXNzTGlzdD8ucmVtb3ZlKFwiaGlkZGVuU3RhdGVcIik7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGluZm9PdmVybGF5Py5xdWVyeVNlbGVjdG9yKFwiI21lc3NhZ2VPdmVybGF5SW5uZXJcIik7XG4gICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UuaW5uZXJIVE1MID0gbG92ZUxldHRlcj8ucmVhc29uPy5yZXBsYWNlKFwiTEw6IFwiLCBcIlwiKTtcbiAgICAgICAgICB9IFxuICAgICAgICB9XG4gICAgICAgIC8vIHRoaXMucGxheU92ZXJsYXkudGV4dEVsZW1lbnQuaW5uZXJUZXh0ID0gbG92ZUxldHRlci5yZWFzb24ucmVwbGFjZShcIkxMOiBcIiwgXCJcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2V0J3MgYW5kIHJlc2V0cyBoaWRkZW4gc3RhdGUgb2YgXCJhZGRpdGlvbmFsXCIgVUkgRWxlbWVudHMuXG4gICAqIEZvciBleGFtcGxlIGJ1dHRvbnMgb3IgY29ubmVjdGlvbiBpY29uLlxuICAgKiBUaGVzZSB3aWxsIGZhZGUgaW4gdGhyb3VnaCBjc3MgYW5pbWF0aW9uIHVwb24gdGhlIHZpZGVvSW5pdGlhbGl6ZWQgZXZlbnQuXG4gICAqIEF0IHRoaXMgcG9pbnQgaW4gdGltZSB0aGUgc3RyZWFtSW5mbyBpcyBhbHJlYWR5IHByb2Nlc3NlZC5cbiAgICovXG4gIHByaXZhdGUgdWlFbGVtZW50c1Zpc2liaWxpdHkoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb250cm9scyA9IHRoaXM/LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiI2NvbnRyb2xzXCIpO1xuICAgIGlmIChjb250cm9scykge1xuICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgIGNvbnRyb2xzPy5jbGFzc0xpc3Q/LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgICAgY29udHJvbHM/LmNsYXNzTGlzdD8uYWRkKFwidmlzaWJsZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xzPy5jbGFzc0xpc3Q/LnJlbW92ZShcInZpc2libGVcIik7XG4gICAgICAgIGNvbnRyb2xzPy5jbGFzc0xpc3Q/LmFkZChcImhpZGRlblwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcz8ucGFyZW50RWxlbWVudD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIjY29ubmVjdGlvblwiKTtcbiAgICBpZiAoY29ubmVjdGlvbikge1xuICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgIGNvbm5lY3Rpb24/LmNsYXNzTGlzdD8ucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgICAgICBjb25uZWN0aW9uPy5jbGFzc0xpc3Q/LmFkZChcInZpc2libGVcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25uZWN0aW9uPy5jbGFzc0xpc3Q/LnJlbW92ZShcInZpc2libGVcIik7XG4gICAgICAgIGNvbm5lY3Rpb24/LmNsYXNzTGlzdD8uYWRkKFwiaGlkZGVuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0U2V0dGluZ3NQYW5lbCgpIHtcbiAgICAvLyBNYWtlIEFyY3dhcmUgQ2xvdWQgc2V0dGluZ3MgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHNldHRpbmdzIHBhbmVsLlxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXM/LkFyY3dhcmVTZWN0aW9uPy5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHBhcmVudD8ucmVtb3ZlQ2hpbGQodGhpcz8uQXJjd2FyZVNlY3Rpb24pO1xuICAgICAgcGFyZW50Py5pbnNlcnRCZWZvcmUodGhpcz8uQXJjd2FyZVNlY3Rpb24sIHBhcmVudD8uZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB0aGUgc2V0dGluZ3Mgc3BlY2lmaWVkIGJ5IFwicmVtb3ZhbHNcIiBvYmplY3QuXG4gICAgY29uc3QgU2V0dGluZ3NDb250ZW50ID0gdGhpcz8uc2V0dGluZ3NQYW5lbD8uc2V0dGluZ3NDb250ZW50RWxlbWVudDtcbiAgICBpZiAoU2V0dGluZ3NDb250ZW50KSB7XG4gICAgICBTZXR0aW5nc0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBcIjQwMHB4XCI7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlbW92YWxzKSB7XG4gICAgICAgIGlmIChUZXh0S2V5UmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpbmRFbGVtZW50QnlUZXh0Q29udGVudChTZXR0aW5nc0NvbnRlbnQsIGtleSk7XG4gICAgICAgICAgcmVtb3ZlKGtleSwgZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IFNldHRpbmdzQ29udGVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihrZXkpO1xuICAgICAgICAgIHJlbW92ZShrZXksIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbmFtaW5nIHRoZSBcIlJlc3RhcnQgU3RyZWFtXCIgYnV0dG9uIHRvIFwiUmVjb25uZWN0IHRvIFN0cmVhbVwiLlxuICAgICAgY29uc3QgcmVzdGFydFN0cmVhbUJ1dHRvbiA9IGZpbmRFbGVtZW50QnlUZXh0Q29udGVudChTZXR0aW5nc0NvbnRlbnQsIFwiWydSZXN0YXJ0IFN0cmVhbSddIHNlY3Rpb24gPiBkaXYuc2V0dGluZ1wiKTtcbiAgICAgIGlmIChyZXN0YXJ0U3RyZWFtQnV0dG9uKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gcmVzdGFydFN0cmVhbUJ1dHRvbj8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCJkaXZcIik7XG4gICAgICAgIGlmIChsYWJlbCkgbGFiZWwudGV4dENvbnRlbnQgPSBcIlJlY29ubmVjdCB0byBTdHJlYW1cIjtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gcmVzdGFydFN0cmVhbUJ1dHRvbj8ucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcImxhYmVsID4gaW5wdXRcIik7XG4gICAgICAgIGlmIChidXR0b24pIGJ1dHRvbi52YWx1ZSA9IFwicmVjb25uZWN0XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwZW5kIGRpc2NsYWltZXJcbiAgICB7XG4gICAgICBjb25zdCBkaXNjbGFpbWVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGRpc2NsYWltZXI/LmNsYXNzTGlzdD8uYWRkKFwic2V0dGluZ1wiKTtcbiAgICAgIGRpc2NsYWltZXIudGV4dENvbnRlbnQgPSBcIktlZXAgaW4gbWluZCwgdGhlc2Ugc2V0dGluZ3Mgd2lsbCBiZSBhcHBsaWVkIGluIHlvdXIgY3VycmVudCBzZXNzaW9uIG9ubHkuXCI7XG4gICAgICBkaXNjbGFpbWVyLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBcIjE1cHhcIjtcbiAgICAgIHRoaXM/LkFyY3dhcmVTZWN0aW9uPy5hcHBlbmRDaGlsZChkaXNjbGFpbWVyKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZGlzYWJsZSBTZXNzaW9uSWQgYnV0dG9uLlxuICAgIHRoaXM/LkFyY3dhcmVTZWN0aW9uPy5hcHBlbmRDaGlsZChcbiAgICAgIG5ldyBTZXR0aW5nVUlGbGFnKFxuICAgICAgICBuZXcgU2V0dGluZ0ZsYWcoXG4gICAgICAgICAgQXJjd2FyZUFwcGxpY2F0aW9uPy5GbGFncz8ubm9TZXNzaW9uLFxuICAgICAgICAgIFwiRGlzYWJsZSBTZXNzaW9uSWRcIixcbiAgICAgICAgICBcIkRpc2FibGUgc2Vzc2lvbklkIGJhc2VkIHJlY29ubmVjdGlvbi5cIixcbiAgICAgICAgICB0aGlzPy5zdHJlYW0/LnNlc3Npb24/Lm5vU2Vzc2lvbixcbiAgICAgICAgICB0cnVlXG4gICAgICAgIClcbiAgICAgICkucm9vdEVsZW1lbnRcbiAgICApO1xuXG4gICAgLy8gQWRkIHJlcGhyYXNpbmcgb2Ygc2lnbmFsbGluZyBVcmwuXG4gICAgdGhpcz8uQXJjd2FyZVNlY3Rpb24/LmFwcGVuZENoaWxkKFxuICAgICAgbmV3IFNldHRpbmdVSVRleHQoXG4gICAgICAgIG5ldyBTZXR0aW5nVGV4dChcbiAgICAgICAgICBcInNpZ25hbGxpbmctdXJsXCIsXG4gICAgICAgICAgXCJTaWduYWxsaW5nIFVSTFwiLFxuICAgICAgICAgIFwiU2lnbmFsbGluZyBVUkxcIixcbiAgICAgICAgICBgJHt0aGlzPy5zdHJlYW0/LmNvbmZpZz8uZ2V0VGV4dFNldHRpbmdWYWx1ZShcInNzXCIpfT8ke3RoaXM/LnN0cmVhbT8uY29uZmlnPy51cmxGbGFncz8uc2xpY2UoMSl9YCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApXG4gICAgICApLnJvb3RFbGVtZW50XG4gICAgKTtcblxuICAgIGlmIChERUJVRylcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PihcIiNzZXR0aW5nc0J0blwiKT8uY2xpY2soKTtcbiAgICAgIH0sIDIwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBdWRpb1RvZ2dsZUJ1dHRvbigpOiB2b2lkIHtcbiAgICBjb25zdCBhdWRpb0J1dHRvbiA9IG5ldyBBdWRpb0J1dHRvbih0aGlzPy5zdHJlYW0pO1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXM/LnN0cmVhbT8udmlkZW9FbGVtZW50UGFyZW50O1xuICAgIGNvbnN0IHBsYXllclVJID0gdmlkZW9FbGVtZW50UGFyZW50IS5wYXJlbnRFbGVtZW50O1xuICAgIC8vIEFwcGVuZCB0aGUgYnV0dG9uIHRvIHRoZSB2aWRlb0VsZW1lbnRQYXJlbnRcbiAgICBpZiAocGxheWVyVUkpIHtcbiAgICAgIGNvbnN0IHVpRmVhdHVyZXMgPSBwbGF5ZXJVST8ucXVlcnlTZWxlY3RvcihcIiN1aUZlYXR1cmVzXCIpO1xuICAgICAgaWYgKHVpRmVhdHVyZXMpIHtcbiAgICAgICAgY29uc3QgdWlDb250cm9scyA9IHVpRmVhdHVyZXM/LnF1ZXJ5U2VsZWN0b3IoXCIjY29udHJvbHNcIik7XG4gICAgICAgIGlmICh1aUNvbnRyb2xzKSB7XG4gICAgICAgICAgdWlDb250cm9scz8uYXBwZW5kQ2hpbGQoYXVkaW9CdXR0b24/LmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaWNUb2dnbGVCdXR0b24oKTogdm9pZCB7XG4gICAgY29uc3QgbWljQnV0dG9uID0gbmV3IE1pY0J1dHRvbih0aGlzPy5zdHJlYW0pO1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXM/LnN0cmVhbT8udmlkZW9FbGVtZW50UGFyZW50O1xuICAgIGNvbnN0IHBsYXllclVJID0gdmlkZW9FbGVtZW50UGFyZW50IS5wYXJlbnRFbGVtZW50O1xuICAgIC8vIEFwcGVuZCB0aGUgYnV0dG9uIHRvIHRoZSB2aWRlb0VsZW1lbnRQYXJlbnRcbiAgICBpZiAocGxheWVyVUkpIHtcbiAgICAgIGNvbnN0IHVpRmVhdHVyZXMgPSBwbGF5ZXJVST8ucXVlcnlTZWxlY3RvcihcIiN1aUZlYXR1cmVzXCIpO1xuICAgICAgaWYgKHVpRmVhdHVyZXMpIHtcbiAgICAgICAgY29uc3QgdWlDb250cm9scyA9IHVpRmVhdHVyZXM/LnF1ZXJ5U2VsZWN0b3IoXCIjY29udHJvbHNcIik7XG4gICAgICAgIGlmICh1aUNvbnRyb2xzKSB7XG4gICAgICAgICAgdWlDb250cm9scz8uYXBwZW5kQ2hpbGQobWljQnV0dG9uPy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RvcEJ1dHRvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdHJlYW0/LmNvbmZpZz8uc2V0dGluZ3M/LnN0b3BCdXR0b24gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHN0b3BCdXR0b24gPSBuZXcgU3RvcEJ1dHRvbih0aGlzPy5zdHJlYW0pO1xuICAgICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcz8uc3RyZWFtPy52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgICBjb25zdCBwbGF5ZXJVSSA9IHZpZGVvRWxlbWVudFBhcmVudCEucGFyZW50RWxlbWVudDtcbiAgICAgIC8vIEFwcGVuZCB0aGUgYnV0dG9uIHRvIHRoZSB2aWRlb0VsZW1lbnRQYXJlbnRcbiAgICAgIGlmIChwbGF5ZXJVSSkge1xuICAgICAgICBjb25zdCB1aUZlYXR1cmVzID0gcGxheWVyVUk/LnF1ZXJ5U2VsZWN0b3IoXCIjdWlGZWF0dXJlc1wiKTtcbiAgICAgICAgaWYgKHVpRmVhdHVyZXMpIHtcbiAgICAgICAgICBjb25zdCB1aUNvbnRyb2xzID0gdWlGZWF0dXJlcz8ucXVlcnlTZWxlY3RvcihcIiNjb250cm9sc1wiKTtcbiAgICAgICAgICBpZiAodWlDb250cm9scykge1xuICAgICAgICAgICAgdWlDb250cm9scz8uYXBwZW5kQ2hpbGQoc3RvcEJ1dHRvbj8uZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoYnV0dG9uVHlwZToga2V5b2YgdHlwZW9mIHRoaXMuc3RyZWFtLmNvbmZpZy5zZXR0aW5ncywgaWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzPy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBjb25zdCBidXR0b24gPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKGlkKTtcbiAgICAgIGlmICh0aGlzPy5zdHJlYW0/LmNvbmZpZz8uc2V0dGluZ3NbYnV0dG9uVHlwZV0gPT09IGZhbHNlKSB7XG4gICAgICAgIGlmIChidXR0b24pIHtcbiAgICAgICAgICBidXR0b24/LnJlbW92ZSgpO1xuICAgICAgICAgIGNvbnN0IHVpRmVhdHVyZXNFbGVtZW50ID0gdGhpcy51aUZlYXR1cmVzRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBzdGF0c1BhbmVsID0gdWlGZWF0dXJlc0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNzdGF0cy1wYW5lbFwiKTtcbiAgICAgICAgICBjb25zdCBzZXR0aW5nc1BhbmVsID0gdWlGZWF0dXJlc0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNzZXR0aW5ncy1wYW5lbFwiKTtcbiAgICAgICAgICBpZiAodWlGZWF0dXJlc0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChidXR0b25UeXBlID09PSBcImluZm9CdXR0b25cIikge1xuICAgICAgICAgICAgICBzdGF0c1BhbmVsPy5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidXR0b25UeXBlID09PSBcInNldHRpbmdzQnV0dG9uXCIpIHtcbiAgICAgICAgICAgICAgc2V0dGluZ3NQYW5lbD8ucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpc0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvcj8udXNlckFnZW50KTtcbiAgICAgIGlmIChidXR0b25UeXBlID09PSBcImZ1bGxzY3JlZW5CdXR0b25cIiAmJiBpc0lPUyAmJiBidXR0b24pIHtcbiAgICAgICAgYnV0dG9uPy5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByZXZlbnREZWZhdWx0S2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMudmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBcImtleWRvd25cIixcbiAgICAgICAgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIiB8fCBldmVudC5rZXkgPT09IFwiIFwiIHx8IGV2ZW50LmtleSA9PT0gXCJTcGFjZWJhclwiKSB7XG4gICAgICAgICAgICAvLyBQcmV2ZW50IHRoZSBkZWZhdWx0IGFjdGlvbiBhbmQgc3RvcCBwcm9wYWdhdGlvblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTsgLy8gVXNlIGNhcHR1cmluZyBpbnN0ZWFkIG9mIGJ1YmJsaW5nXG5cbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSB0aGlzLnVpRmVhdHVyZXNFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJidXR0b25cIik7XG4gICAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCIgXCIgfHwgZXZlbnQua2V5ID09PSBcIlNwYWNlYmFyXCIpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBidXR0b24uYmx1cigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF1dG9QbGF5SGFuZGxlcihzdHJlYW1JbmZvOiBNZXNzYWdlcy5TdHJlYW1JbmZvKSB7XG4gICAgY29uc3QgeyB2aWRlb1BsYXllciB9ID0gdGhpcz8ud2ViUnRjQ29udHJvbGxlcjtcbiAgICBjb25zdCBhdXRvUGxheSA9IHN0cmVhbUluZm8/LnN0cmVhbUluZm8/LmF1dG9QbGF5O1xuICAgIGNvbnN0IGlzUGF1c2VkID0gdmlkZW9QbGF5ZXI/LmlzUGF1c2VkKCk7XG4gICAgaWYgKGF1dG9QbGF5ICYmIGlzUGF1c2VkKSB7XG4gICAgICBpZiAodmlkZW9QbGF5ZXIpIHtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdmlkZW9QbGF5ZXI/LmdldFZpZGVvRWxlbWVudCgpO1xuICAgICAgICBpZiAodmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHZpZGVvRWxlbWVudD8ucGFyZW50RWxlbWVudDtcbiAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcGxheU92ZXJsYXkgPSBwYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiI3BsYXlPdmVybGF5XCIpO1xuICAgICAgICAgICAgaWYgKHBsYXlPdmVybGF5KSBwbGF5T3ZlcmxheT8ucmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZpZGVvRWxlbWVudD8ucGxheSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlcXVlc3QgYSByZXNwb25zZSBmcm9tIHlvdSBVRSBBcHBsaWNhdGlvbi5cbiAgICogVGhlIHJldHVybmVkIHJlc3BvbnNlIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHlvdXIgVUUgQXBwbGljYXRpb24uXG4gICAqIEl0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgYXBwbGljYXRpb24sIHN1Y2ggYXM6XG4gICAqIC0gYSBzdGF0ZSB0byB1cGRhdGUgeW91ciBjdXN0b20gdWlcbiAgICogLSBnZXQgdGhlIHVybCB0byB0aGUgcGRmIGl0IHVwbG9hZGVkIHRvIHNvbWUgcmVtb3RlIHNlcnZpY2Ugb2YgeW91cnNcbiAgICogLSB0aGUgaWQgb2YgdGhlIHNhdmUtZ2FtZVxuICAgKiAuLiBhbnl0aGluZyBlbHNlIHlvdSBjb3VsZCBpbWFnaW5lLlxuICAgKi9cbiAgcHVibGljIGdldEFwcGxpY2F0aW9uUmVzcG9uc2UoY2FsbGJhY2s6IChyZXNwb25zZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcz8uc3RyZWFtPy5hZGRSZXNwb25zZUV2ZW50TGlzdGVuZXIoXCJ1ZS1yZXNwb25zZVwiLCAocmVzcG9uc2UpID0+IHtcbiAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBsaWNhdGlvblJlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcz8ucmVzcG9uc2VDYWxsYmFjaykge1xuICAgICAgdGhpcz8ucmVzcG9uc2VDYWxsYmFjayhyZXNwb25zZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUFyY3dhcmVTdHlsZXMoKSB7XG4gICAgY29uc3QgUGl4ZWxTdHJlYW1pbmdBcHBsaWNhdGlvblN0eWxlcyA9IG5ldyBQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGUoQXJjd2FyZVN0eWxlcyk7XG4gICAgUGl4ZWxTdHJlYW1pbmdBcHBsaWNhdGlvblN0eWxlcz8uYXBwbHlTdHlsZVNoZWV0KCk7XG4gIH1cblxuICAvKiogRW1pdCBhbiBldmVudCB0b3dhcmRzIHRoZSBVRSBBcHBsaWNhdGlvbi5cbiAgICogTWFpbmx5IHVzZWQgdG8gYnViYmxlIGV2ZW50cyBsaWtlIGEgYnV0dG9uIHByZXNzIG9yIG90aGVyIGNvbW1hbmQgaW5wdXRzIHRvd2FyZHMgdGhlIFVFIEFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcHVibGljIGVtaXRVSUludGVyYWN0aW9uKGRlc2NyaXB0b3I6IG9iamVjdCB8IHN0cmluZykge1xuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICB0aGlzPy53ZWJSdGNDb250cm9sbGVyPy5lbWl0VUlJbnRlcmFjdGlvbihkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGVzIGEgaGVscGVyIHRleHQgZm9yIHRoZSBDb25uZWN0aW9uIE92ZXJsYXlcbiAgcHJpdmF0ZSBhZGRUZXh0VG9Db25uZWN0T3ZlcmxheSgpIHtcbiAgICBpZiAoIXRoaXM/LnN0cmVhbT8uY29uZmlnPy5pbml0aWFsU2V0dGluZ3M/LkF1dG9Db25uZWN0KSB7XG4gICAgICBpZiAodGhpcy52aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdE92ZXJsYXkgPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiI2Nvbm5lY3RPdmVybGF5XCIpO1xuICAgICAgICBpZiAoY29ubmVjdE92ZXJsYXkpIHtcbiAgICAgICAgICBjb25zdCBjb25uZWN0aW9uVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgY29ubmVjdGlvblRleHQuY2xhc3NOYW1lID0gXCJjb25uZWN0aW9uLXRleHRcIjtcbiAgICAgICAgICBjb25uZWN0T3ZlcmxheS5hcHBlbmRDaGlsZChjb25uZWN0aW9uVGV4dCk7XG5cbiAgICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xuICAgICAgICAgIHRpdGxlLmNsYXNzTmFtZSA9IFwidGl0bGVcIjtcbiAgICAgICAgICB0aXRsZS50ZXh0Q29udGVudCA9IFwiQ2xpY2sgb24gdGhlIGJ1dHRvbiBiZWxvdyB0byBzdGFydCB0aGUgY29ubmVjdGlvbiB0byB0aGUgc3RyZWFtaW5nLlwiO1xuICAgICAgICAgIGNvbm5lY3Rpb25UZXh0LmFwcGVuZENoaWxkKHRpdGxlKTtcblxuICAgICAgICAgIGNvbnN0IHN1YnRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgICAgc3VidGl0bGUuY2xhc3NOYW1lID0gXCJzdWJ0aXRsZVwiO1xuICAgICAgICAgIHN1YnRpdGxlLnRleHRDb250ZW50ID1cbiAgICAgICAgICAgIFwiQWZ0ZXIgY2xpY2tpbmcgdGhlIGJ1dHRvbiwgaXQgbWF5IHRha2UgYSBmZXcgc2Vjb25kcyBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gc3RhcnQuIERvbid0IHdvcnJ5IGlmIHlvdSBkb24ndCBzZWUgYW4gaW1tZWRpYXRlIHJlYWN0aW9uLlwiO1xuXG4gICAgICAgICAgY29ubmVjdGlvblRleHQuYXBwZW5kQ2hpbGQoc3VidGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgQ29uZmlnLCBGbGFncywgTG9nZ2VyLCBDb25maWdQYXJhbXMsIG92ZXJyaWRlTG9nZ2VyIH0gZnJvbSBcIkBlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjVcIjtcbmltcG9ydCB7IFNlc3Npb24gfSBmcm9tIFwiLi9kb21haW4vU2Vzc2lvblwiO1xuaW1wb3J0IHsgQXJjd2FyZVNldHRpbmdzU2NoZW1hLCBTZXR0aW5ncyB9IGZyb20gXCIuL2RvbWFpbi9BcmN3YXJlU2V0dGluZ3NTY2hlbWFcIjtcblxuLyoqIERlZmF1bHQgYXJjd2FyZSBzaWduYWxsaW5nIGVuZHBvaW50LiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRVcmwgPSBgd3NzOi8vc2lnbmFsbGluZy1jbGllbnQucmFnbmFyb2suYXJjd2FyZS5jbG91ZGAgYXMgY29uc3Q7XG5cbi8vIFRoZSBiZWxvdyBMb2dnZXIgb3ZlcnJpZGVzIGNhbiBsaWtlbHkgYmUgcmVtb3ZlZCBhcyBQU0luZnJhIDUuNSBsb2dnZXIgc3VwcG9ydHMgc2V0dGluZyBsb2cgdmVyYm9zaXR5XG4vLyBhbmQgdGhlc2Ugb3ZlcnJpZGVzIGFyZSBtYXRjaGluZyB0aGUgZGVmYXVsdCBsb2dnaW5nIGJlaGF2aW91ciBhbnl3YXkgKGV4Y2VwdCBpbmZvKS5cbi8qTG9nZ2VyLkluZm8gPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gIC8vIGNvbnNvbGUuaW5mbyhtZXNzYWdlKTtcbn07XG5Mb2dnZXIuV2FybmluZyA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xufTtcbkxvZ2dlci5FcnJvciA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgaWYgKG1lc3NhZ2U/LnN0YXJ0c1dpdGgoXCJ1bmhhbmRsZWQgU3RhdCBUeXBlXCIpKSByZXR1cm47XG4gIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG59OyovXG5Mb2dnZXIuSW5pdExvZ2dpbmcoMiwgZmFsc2UpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFyY3dhcmVDb25maWdQYXJhbXMgZXh0ZW5kcyBDb25maWdQYXJhbXMge1xuICBzZXR0aW5nczogU2V0dGluZ3M7XG59XG5cbmV4cG9ydCBjbGFzcyBBcmN3YXJlQ29uZmlnIGV4dGVuZHMgQ29uZmlnIHtcbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIGZldGNoIHByb2plY3RJZCBhbmQgc2hhcmVJZCBmcm9tIHRoZSBjdXJyZW50IHVybC5cbiAgICogRXhhbXBsZTpcbiAgICogL3NvbWV0aGluZy86cHJvamVjdElkLzpzaGFyZUlkL3NvbWV0aGluZz9zb21ldGhpbmcgPT4geyBwcm9qZWN0SWQsIHNoYXJlSWQgfVxuICAgKiAvOnByb2plY3RJZCA9PiB7IHByb2plY3RJZCB9XG4gICAqIC86c2hhcmVJZCA9PiB7IHNoYXJlSWQgfVxuICAgKiAvOnNoYXJlSWQvOnByb2plY3RJZCA9PiB7IHByb2plY3RJZCwgc2hhcmVJZCB9XG4gICAqXG4gICAqIFRoZSBwcm9qZWN0SWQgbXVzdCBiZSB1dWlkdjQuXG4gICAqIFRoZSBzaGFyZUlkIG11c3QgYmUgXCJzaGFyZUlkLVwiIHByZWZpeGVkLlxuICAgKlxuICAgKiBVc2FnZTpcbiAgICogLy8gVGhpcyB3aWxsIHNwcmVhZCB0aGUgcHJvamVjdElkIGFuZCB0aGUgc2hhcmVJZCBpbnRvIHRoZSBzZXR0aW5ncy4gRGVmaW5lIGFueXRoaW5nIHlvdSB3YW50IHRvIG92ZXJyaWRlIGFmdGVyIHRoZSBzcHJlYWQgb3BlcmF0aW9uLlxuICAgKiBuZXcgQXJjd2FyZUNvbmZpZyh7IHNldHRpbmdzOiB7IC4uLkFyY3dhcmVDb25maWcuUGlja0lkc09mVXJsKCkgfSB9KTtcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgUGlja0lkc09mVXJsKCk6IFBpY2s8U2V0dGluZ3MsIFwic2hhcmVJZFwiIHwgXCJwcm9qZWN0SWRcIj4ge1xuICAgIGNvbnN0IHsgcGF0aG5hbWUgfSA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGNvbnN0IHNlY3Rpb25zID0gcGF0aG5hbWUuc3BsaXQoXCIvXCIpO1xuICAgIGNvbnN0IHByb2plY3RJZCA9IHNlY3Rpb25zLmZpbmQoKHNlY3Rpb24pID0+IHouc3RyaW5nKCkudXVpZCgpLnNhZmVQYXJzZShzZWN0aW9uKS5zdWNjZXNzKTtcbiAgICBjb25zdCBzaGFyZUlkID0gc2VjdGlvbnMuZmluZCgoc2VjdGlvbikgPT4gei5zdHJpbmcoKS5zdGFydHNXaXRoKFwic2hhcmUtXCIpLnNhZmVQYXJzZShzZWN0aW9uKS5zdWNjZXNzKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvamVjdElkLFxuICAgICAgc2hhcmVJZFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvbjogU2Vzc2lvbjtcblxuICBwdWJsaWMgcmVhZG9ubHkgc2V0dGluZ3M6IFNldHRpbmdzO1xuXG4gIHByaXZhdGUgX2luaXRpYWxTZXR0aW5ncztcblxuICBwdWJsaWMgcmVhZG9ubHkgVkVSU0lPTiA9IFwiMS4yLjEzXCI7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBBcmN3YXJlQ29uZmlnUGFyYW1zKSB7XG4gICAgY29uc3QgZGZUb2tlbiA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFxuICAgICAgLnNsaWNlKDEpXG4gICAgICAuc3BsaXQoXCImXCIpXG4gICAgICAuZmluZCgocXApID0+IHFwLnN0YXJ0c1dpdGgoXCJkZi1cIikpO1xuICAgIGlmICghZGZUb2tlbiAmJiAhY29uZmlnLnNldHRpbmdzLnNoYXJlSWQgJiYgIWNvbmZpZy5zZXR0aW5ncy5wcm9qZWN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2hhcmVJZCBvciBQcm9qZWN0SWQgbXVzdCBiZSBzcGVjaWZpZWQuYCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgc2V0dGluZ3MgaW5wdXQuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBBcmN3YXJlU2V0dGluZ3NTY2hlbWEucGFyc2UoY29uZmlnLnNldHRpbmdzKTtcblxuICAgIC8vIFNldHVwIGFyY3dhcmUgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICBpZiAoIWNvbmZpZy5pbml0aWFsU2V0dGluZ3MpIGNvbmZpZy5pbml0aWFsU2V0dGluZ3MgPSB7fTtcbiAgICBpZiAoIWNvbmZpZy5pbml0aWFsU2V0dGluZ3M/Lmhhc093blByb3BlcnR5KFwiQXV0b0Nvbm5lY3RcIikpIGNvbmZpZy5pbml0aWFsU2V0dGluZ3MuQXV0b0Nvbm5lY3QgPSBmYWxzZTtcbiAgICAvLyBpZiAoIWNvbmZpZy5pbml0aWFsU2V0dGluZ3M/Lmhhc093blByb3BlcnR5KFwiSG92ZXJpbmdNb3VzZVwiKSkgY29uZmlnLmluaXRpYWxTZXR0aW5ncy5Ib3ZlcmluZ01vdXNlID0gdHJ1ZTtcbiAgICBpZiAoIWNvbmZpZy5pbml0aWFsU2V0dGluZ3M/Lmhhc093blByb3BlcnR5KFwiQUZLVGltZW91dFwiKSkgY29uZmlnLmluaXRpYWxTZXR0aW5ncy5BRktUaW1lb3V0ID0gNjAwO1xuICAgIGlmICghY29uZmlnLmluaXRpYWxTZXR0aW5ncy5zcykgY29uZmlnLmluaXRpYWxTZXR0aW5ncy5zcyA9IERlZmF1bHRVcmw7XG5cbiAgICBzdXBlcihjb25maWcpO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLnNlc3Npb24gPSBuZXcgU2Vzc2lvbigpO1xuICAgIHRoaXMuX2luaXRpYWxTZXR0aW5ncyA9IGNvbmZpZy5pbml0aWFsU2V0dGluZ3M7XG5cbiAgICAvLyBTZXR1cCBhcmN3YXJlIGRlZmF1bHQgc2V0dGluZ3MuXG5cbiAgICB0aGlzLnNldEZsYWdFbmFibGVkKEZsYWdzLkFGS0RldGVjdGlvbiwgdHJ1ZSk7XG5cbiAgICAvLyBJTVBPUlRBTlQgTk9URTogVGhlIGZlYXR1cmUgQnJvd3NlclNlbmRPZmZlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFBTSW5mcmEgNS41LlxuICAgIC8vIFRoZSBvZmZlciBpcyBub3cgZXhwZWN0ZWQgdG8gY29tZSBmcm9tIFVFLiBFbnN1cmUgdGhhdCB5b3VyIHNpZ25hbGxpbmcgc2VydmVyIHN1cHBvcnRzIHRoaXMgYmVoYXZpb3VyLlxuXG4gICAgLy90aGlzLnNldEZsYWdFbmFibGVkKEZsYWdzLkJyb3dzZXJTZW5kT2ZmZXIsIHRydWUpO1xuICB9XG5cbiAgLyoqIFNldHVwIGNvbm5lY3Rpb24gc3RyaW5nLiAqL1xuICBwdWJsaWMgZ2V0IHVybEZsYWdzKCk6IHN0cmluZyB7XG4gICAgbGV0IGZsYWdzID0gXCJcIjtcblxuICAgIC8vIFNldHVwIGNvbm5lY3Rpb24gdmlhIHNoYXJlSWQuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Muc2hhcmVJZCkgZmxhZ3MgKz0gYCZzaD0ke3RoaXMuc2V0dGluZ3Muc2hhcmVJZH1gO1xuICAgIC8vIEFkZGl0aW9uYWxseSBzZXR1cCB0aGUgcHJvamVjdElkIHByb3BlcnR5IGlmIHRoZSBzaGFyZUlkIGlzIHNldCB1cCB3aXRoIG11bHRpcGxlIHByb2plY3RzLlxuICAgIGlmICh0aGlzLnNldHRpbmdzLnByb2plY3RJZCkgZmxhZ3MgKz0gYCZwPSR7dGhpcy5zZXR0aW5ncy5wcm9qZWN0SWR9YDtcblxuICAgIC8vIFNldHVwIGRpcmVjdCBzZXNzaW9uIGNvbm5lY3Rpb24uXG4gICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzLnNlc3Npb24gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGZsYWdzICs9IGAmcz0ke3RoaXMuc2V0dGluZ3Muc2Vzc2lvbn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXR1cCBzZXNzaW9uIHJlY29ubmVjdC5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHRoaXMuc2Vzc2lvbi5pZDtcbiAgICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgICAgZmxhZ3MgKz0gYCZzPSR7c2Vzc2lvbklkfWA7XG4gICAgICAgIC8vIElmIGEgc2Vzc2lvbklkIGlzIGZldGNoZWQgb3V0IG9mIHRoZSBTZXNzaW9uIGNsYXNzLCBpdCdzIGEgcmVjb25uZWN0aW9uIGF0dGVtcHQuXG4gICAgICAgIGZsYWdzICs9IGAmcj10cnVlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXR1cCBieXBhc3MgZmxhZy5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5ieXBhc3MpIGZsYWdzICs9IGAmYj10cnVlYDtcblxuICAgIC8vIFNldHVwIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvciBwbGF0Zm9ybSBpbnRlcm5hbCBwcmV2aWV3aW5nLlxuICAgIGlmICh0aGlzLnNldHRpbmdzLnRva2VuKSBmbGFncyArPSBgJnQ9JHt0aGlzLnNldHRpbmdzLnRva2VufWA7XG5cbiAgICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICAvLyBGZXRjaCBySWQgcGFyYW1ldGVyIGZyb20gdGhlIHVybCBhbmQgcGFzcyBpdCB0byB0aGUgY29ubmVjdGlvbiBzdHJpbmcuXG4gICAgY29uc3QgcklkID0gcXVlcnkuZ2V0KFwicklkXCIpID8/IHVuZGVmaW5lZDtcbiAgICBpZiAocklkKSBmbGFncyArPSBgJnJJZD0ke3JJZH1gO1xuXG4gICAgLy8gU2V0dXAgRGlyZWN0Rmxvdy5cbiAgICBjb25zdCBkZlRva2VuID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoXG4gICAgICAuc2xpY2UoMSlcbiAgICAgIC5zcGxpdChcIiZcIilcbiAgICAgIC5maW5kKChxcCkgPT4gcXAuc3RhcnRzV2l0aChcImRmLVwiKSk7XG4gICAgaWYgKGRmVG9rZW4pIGZsYWdzICs9IGAmJHtkZlRva2VufWA7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zdGFydEhlaWdodCAmJiB0aGlzLnNldHRpbmdzLnN0YXJ0SGVpZ2h0ID4gMjAwKSBmbGFncyArPSBgJmg9JHt0aGlzLnNldHRpbmdzLnN0YXJ0SGVpZ2h0fWA7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zdGFydFdpZHRoICYmIHRoaXMuc2V0dGluZ3Muc3RhcnRXaWR0aCA+IDIwMCkgZmxhZ3MgKz0gYCZ3PSR7dGhpcy5zZXR0aW5ncy5zdGFydFdpZHRofWA7XG5cbiAgICByZXR1cm4gZmxhZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluaXRpYWxTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbFNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIG1vZGlmeUluaXRpYWxTZXR0aW5ncyhtb3VzZUxvY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNldEZsYWdFbmFibGVkKEZsYWdzLkhvdmVyaW5nTW91c2VNb2RlLCBtb3VzZUxvY2spO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBcmN3YXJlQ29uZmlnLCBBcmN3YXJlQ29uZmlnUGFyYW1zLCBEZWZhdWx0VXJsIH0gZnJvbSBcIi4vQXJjd2FyZUNvbmZpZ1wiO1xuaW1wb3J0IHsgQXJjd2FyZVBpeGVsU3RyZWFtaW5nIH0gZnJvbSBcIi4vQXJjd2FyZVBpeGVsU3RyZWFtaW5nXCI7XG5pbXBvcnQgeyBBcmN3YXJlQXBwbGljYXRpb24gfSBmcm9tIFwiLi9BcmN3YXJlQXBwbGljYXRpb25cIjtcbmltcG9ydCB7IFdlYnNvY2tldFN0YXRlIH0gZnJvbSBcIi4vZG9tYWluL0Nvbm5lY3Rpb25JZGVudGlmaWVyXCI7XG5cbnR5cGUgRGVlcFBhcnRpYWw8VD4gPSBUIGV4dGVuZHMgRnVuY3Rpb24gPyBUIDogVCBleHRlbmRzIG9iamVjdCA/IHsgW1AgaW4ga2V5b2YgVF0/OiBEZWVwUGFydGlhbDxUW1BdPiB9IDogVDtcblxubGV0IGdsb2JhbFBpeGVsU3RyZWFtaW5nOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfCBudWxsID0gbnVsbDtcbmxldCBnbG9iYWxDb25maWc6IEFyY3dhcmVDb25maWcgfCBudWxsID0gbnVsbDtcbmxldCBnbG9iYWxBcHBsaWNhdGlvbjogQXJjd2FyZUFwcGxpY2F0aW9uIHwgbnVsbCA9IG51bGw7XG5sZXQgcHJldmlvdXNTaGFyZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbmxldCBwcmV2aW91c1Byb2plY3RJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBBcmN3YXJlSW5pdChcbiAgeyBzaGFyZUlkLCBwcm9qZWN0SWQgfTogeyBzaGFyZUlkPzogc3RyaW5nOyBwcm9qZWN0SWQ/OiBzdHJpbmcgfSxcbiAgY29uZmlndXJhdGlvbj86IERlZXBQYXJ0aWFsPEFyY3dhcmVDb25maWdQYXJhbXM+LFxuICBmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIGlmIChzaGFyZUlkICYmICFzaGFyZUlkLnN0YXJ0c1dpdGgoXCJzaGFyZS1cIikpIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBzaGFyZUlkLWZvcm1hdDogJyR7c2hhcmVJZH0nLmApO1xuXG4gIGlmIChzaGFyZUlkICYmIHByZXZpb3VzU2hhcmVJZCAhPT0gc2hhcmVJZCkge1xuICAgIGdsb2JhbENvbmZpZyA9IG51bGw7XG4gICAgZ2xvYmFsUGl4ZWxTdHJlYW1pbmcgPSBudWxsO1xuICAgIGdsb2JhbEFwcGxpY2F0aW9uID0gbnVsbDtcbiAgICBwcmV2aW91c1NoYXJlSWQgPSBzaGFyZUlkO1xuICB9XG4gIGlmIChwcm9qZWN0SWQgJiYgcHJldmlvdXNQcm9qZWN0SWQgIT09IHByb2plY3RJZCkge1xuICAgIGdsb2JhbENvbmZpZyA9IG51bGw7XG4gICAgZ2xvYmFsUGl4ZWxTdHJlYW1pbmcgPSBudWxsO1xuICAgIGdsb2JhbEFwcGxpY2F0aW9uID0gbnVsbDtcbiAgICBwcmV2aW91c1Byb2plY3RJZCA9IHByb2plY3RJZDtcbiAgfVxuICBpZiAoZm9yY2VSZWZyZXNoKSB7XG4gICAgZ2xvYmFsQ29uZmlnID0gbnVsbDtcbiAgICBnbG9iYWxQaXhlbFN0cmVhbWluZyA9IG51bGw7XG4gICAgZ2xvYmFsQXBwbGljYXRpb24gPSBudWxsO1xuICAgIGNvbnNvbGUuaW5mbyhcIkFyY3dhcmVJbml0OiBGb3JjZWQgcmUtaW5pdGlhbGl6YXRpb25cIik7XG4gIH1cblxuICBpZiAoZ2xvYmFsUGl4ZWxTdHJlYW1pbmcgJiYgZ2xvYmFsQ29uZmlnICYmIGdsb2JhbEFwcGxpY2F0aW9uKSB7XG4gICAgY29uc29sZS53YXJuKFwiQXJjd2FyZUluaXQ6IFJldHVybmluZyBleGlzdGluZyBpbnN0YW5jZSB0byBwcmV2ZW50IG11bHRpcGxlIFdlYlNvY2tldCBjb25uZWN0aW9ucy5cIik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgQ29uZmlnOiBnbG9iYWxDb25maWcsXG4gICAgICBQaXhlbFN0cmVhbWluZzogZ2xvYmFsUGl4ZWxTdHJlYW1pbmcsXG4gICAgICBBcHBsaWNhdGlvbjogZ2xvYmFsQXBwbGljYXRpb25cbiAgICB9O1xuICB9XG5cbiAgY29uc3QgQ29uZmlnID0gbmV3IEFyY3dhcmVDb25maWcoe1xuICAgIHVzZVVybFBhcmFtczogY29uZmlndXJhdGlvbj8udXNlVXJsUGFyYW1zID09PSB0cnVlLFxuICAgIGluaXRpYWxTZXR0aW5nczoge1xuICAgICAgc3M6IERlZmF1bHRVcmwsXG4gICAgICBBdXRvQ29ubmVjdDogZmFsc2UsXG4gICAgICBTdGFydFZpZGVvTXV0ZWQ6IHRydWUsXG4gICAgICBBdXRvUGxheVZpZGVvOiB0cnVlLFxuICAgICAgS2V5Ym9hcmRJbnB1dDogdHJ1ZSxcbiAgICAgIE1vdXNlSW5wdXQ6IHRydWUsXG4gICAgICBHYW1lcGFkSW5wdXQ6IHRydWUsXG4gICAgICBUb3VjaElucHV0OiB0cnVlLFxuICAgICAgWFJDb250cm9sbGVySW5wdXQ6IHRydWUsXG4gICAgICBVc2VNaWM6IHRydWUsXG4gICAgICBTdXBwcmVzc0Jyb3dzZXJLZXlzOiB0cnVlLFxuICAgICAgRmFrZU1vdXNlV2l0aFRvdWNoZXM6IGZhbHNlLFxuICAgICAgRm9yY2VNb25vQXVkaW86IGZhbHNlLFxuICAgICAgSG92ZXJpbmdNb3VzZTogdHJ1ZSxcbiAgICAgIC4uLmNvbmZpZ3VyYXRpb24/LmluaXRpYWxTZXR0aW5nc1xuICAgIH0sXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIHNoYXJlSWQsXG4gICAgICBwcm9qZWN0SWQsXG4gICAgICBmdWxsc2NyZWVuQnV0dG9uOiB0cnVlLFxuICAgICAgYXVkaW9CdXR0b246IHRydWUsXG4gICAgICBzdG9wQnV0dG9uOiBmYWxzZSxcbiAgICAgIGluZm9CdXR0b246IGZhbHNlLFxuICAgICAgbWljQnV0dG9uOiBmYWxzZSxcbiAgICAgIHNldHRpbmdzQnV0dG9uOiBmYWxzZSxcbiAgICAgIGNvbm5lY3Rpb25TdHJlbmd0aEljb246IGZhbHNlLFxuICAgICAgY29ubmVjdGlvbklkZW50aWZpZXJMb2dnaW5nRGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9ySGFuZGxlcjogdW5kZWZpbmVkLFxuICAgICAgbG92ZUxldHRlckhhbmRsZXI6IHVuZGVmaW5lZCxcbiAgICAgIGxvdmVMZXR0ZXJMb2dnaW5nOiB1bmRlZmluZWQsXG4gICAgICBxdWV1ZUhhbmRsZXI6IHVuZGVmaW5lZCxcbiAgICAgIHNlc3Npb25JZEhhbmRsZXI6IHVuZGVmaW5lZCxcbiAgICAgIHN0YXJ0SGVpZ2h0OiB1bmRlZmluZWQsXG4gICAgICBzdGFydFdpZHRoOiB1bmRlZmluZWQsXG4gICAgICAuLi5jb25maWd1cmF0aW9uPy5zZXR0aW5nc1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgUGl4ZWxTdHJlYW1pbmcgPSBuZXcgQXJjd2FyZVBpeGVsU3RyZWFtaW5nKENvbmZpZyk7XG4gIGNvbnN0IEFwcGxpY2F0aW9uID0gbmV3IEFyY3dhcmVBcHBsaWNhdGlvbih7IHN0cmVhbTogUGl4ZWxTdHJlYW1pbmcgfSk7XG5cbiAgLy8gU3RvcmUgZ2xvYmFsbHkgdG8gcHJldmVudCBtdWx0aXBsZSBpbnN0YW5jZXNcbiAgZ2xvYmFsQ29uZmlnID0gQ29uZmlnO1xuICBnbG9iYWxQaXhlbFN0cmVhbWluZyA9IFBpeGVsU3RyZWFtaW5nO1xuICBnbG9iYWxBcHBsaWNhdGlvbiA9IEFwcGxpY2F0aW9uO1xuXG4gIHJldHVybiB7XG4gICAgQ29uZmlnLFxuICAgIFBpeGVsU3RyZWFtaW5nLFxuICAgIEFwcGxpY2F0aW9uXG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlcyB9IGZyb20gXCJAYXJjd2FyZS1jbG91ZC9zaGFyZWQtcGl4ZWxzdHJlYW1pbmctd2Vic2RrXCI7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGVkU3RhdHMsXG4gIEJhc2VNZXNzYWdlLFxuICBGbGFncyxcbiAgTG9nZ2VyLFxuICBOdW1lcmljUGFyYW1ldGVycyxcbiAgUGl4ZWxTdHJlYW1pbmcsXG4gIFdlYlNvY2tldFRyYW5zcG9ydCxcbiAgUGl4ZWxTdHJlYW1pbmdPdmVycmlkZXNcbn0gZnJvbSBcIkBlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjVcIjtcblxuaW1wb3J0IHsgeiwgWm9kVHlwZSB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IEFyY3dhcmVDb25maWcgfSBmcm9tIFwiLi9BcmN3YXJlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcHBseVVybEhhY2sgfSBmcm9tIFwiLi9BcHBseVVybEhhY2tcIjtcbmltcG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gXCIuL2RvbWFpbi9FdmVudEhhbmRsZXJcIjtcbmltcG9ydCB7IFNlc3Npb24gfSBmcm9tIFwiLi9kb21haW4vU2Vzc2lvblwiO1xuaW1wb3J0IHsgU3RhdHMgfSBmcm9tIFwiLi9kb21haW4vU3RhdHNcIjtcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiLi9kb21haW4vZGVib3VuY2VcIjtcbmltcG9ydCB7IExvdmVMZXR0ZXJzIH0gZnJvbSBcIi4vdWkvTG92ZUxldHRlcnNcIjtcbmltcG9ydCB7IEFyY3dhcmVMb2dvTG9hZGVyIH0gZnJvbSBcIi4vdWkvQXJjd2FyZUxvZ29Mb2FkZXJcIjtcbmltcG9ydCB7IE1pY3JvcGhvbmVPdmVybGF5IH0gZnJvbSBcIi4vdWkvTWljcm9waG9uZU92ZXJsYXlcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25JZGVudGlmaWVyLCBXZWJzb2NrZXRTdGF0ZSB9IGZyb20gXCIuL2RvbWFpbi9Db25uZWN0aW9uSWRlbnRpZmllclwiO1xuXG5leHBvcnQgY2xhc3MgQXJjd2FyZVBpeGVsU3RyZWFtaW5nIGV4dGVuZHMgUGl4ZWxTdHJlYW1pbmcge1xuICAvKiogT3ZlcnJpZGUgZGVmYXVsdCBjb25maWcgd2l0aCBBcmN3YXJlQ29uZmlnLiAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgY29uZmlnOiBBcmN3YXJlQ29uZmlnO1xuICBwdWJsaWMgc3RyZWFtSW5mbz86IE1lc3NhZ2VzLlN0cmVhbUluZm87XG4gIHB1YmxpYyBsb3ZlTGV0dGVyc0NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbG92ZUxldHRlcnNMaXN0OiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBsb3ZlTGV0dGVyc1F1ZXVlOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGlzUHJvY2Vzc2luZ1F1ZXVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbWljcm9waG9uZU92ZXJsYXk6IE1pY3JvcGhvbmVPdmVybGF5O1xuXG4gIC8qKiBSZXR1cm5zIGEgbGlzdCBvZiBXZWJTb2NrZXRTdGF0ZXMgb2YgYWxsIFBpeGVsU3RyZWFtaW5nIEluc3RhbmNlcyBnZW5lcmF0ZWQuICovXG4gIHB1YmxpYyBnZXQgV2Vic29ja2V0U3RhdGVzKCkge1xuICAgIHJldHVybiBDb25uZWN0aW9uSWRlbnRpZmllci5JbnN0YW5jZS5HZXRXZWJTb2NrZXRTdGF0ZXMoKTtcbiAgfVxuXG4gIC8qKiBDb3VudHMgYWxsIGFjdGl2ZSBQaXhlbFN0cmVhbWluZyBJbnN0YW5jZXMgZ2VuZXJhdGVkLiAoQ09OTkVDVElORyAmIENPTk5FQ1RFRCkgKi9cbiAgcHVibGljIGdldCBBY3RpdmVJbnN0YW5jZXMoKSB7XG4gICAgcmV0dXJuIENvbm5lY3Rpb25JZGVudGlmaWVyLkluc3RhbmNlLkFjdGl2ZUluc3RhbmNlcztcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoaXMgUGl4ZWxTdHJlYW1pbmcgSW5zdGFuY2VzIHdlYnNvY2tldCBzdGF0ZS4gKi9cbiAgcHVibGljIGdldCB3ZWJzb2NrZXRTdGF0ZSgpOiBXZWJzb2NrZXRTdGF0ZSB7XG4gICAgbGV0IHN0YXRlOiBhbnkgPSAodGhpcy53ZWJSdGNDb250cm9sbGVyPy50cmFuc3BvcnQgYXMgV2ViU29ja2V0VHJhbnNwb3J0KT8ud2ViU29ja2V0Py5yZWFkeVN0YXRlO1xuICAgIHJldHVybiBzdGF0ZSAhPT0gdW5kZWZpbmVkID8gKHN0YXRlIGFzIFdlYnNvY2tldFN0YXRlKSA6IFdlYlNvY2tldC5DTE9TRUQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEFyY3dhcmVDb25maWcsIG92ZXJyaWRlcz86IFBpeGVsU3RyZWFtaW5nT3ZlcnJpZGVzKSB7XG4gICAgLyoqIEFzIHNvb24gYXMgdXBzdHJlYW0gaXMgZml4ZWQsIHdlIGdvdCB0byBhZGp1c3QgdGhlIHVybCBidWlsZGluZyBwcm9jZXNzLiAqL1xuICAgIEFwcGx5VXJsSGFjaygpO1xuXG4gICAgc3VwZXIoY29uZmlnLCBvdmVycmlkZXMpO1xuXG4gICAgLyoqIFRoZW9yZXRpY2FsbHkgdGhpcyBjYWxsIHNob3VsZCBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgc2lnbmFsbGluZyB1cmwsIGJ1dCB0aGlzIHdvdWxkIG5vdCB3b3JrIGF0IGFsbCwgaWYgY29uZmlnIGlzIHNldHVwIGZvciBcIkF1dG9Db25uZWN0PXRydWVcIlxuICAgICAqIEluc3RlYWQgd2UgdXNlIEFwcGx5VXJsSGFjaygpO1xuICAgICAqL1xuICAgIC8vIHRoaXMuc2V0U2lnbmFsbGluZ1VybEJ1aWxkZXIoKCkgPT4ge1xuICAgIC8vICAgY29uc3QgcmVnZXggPSAvKD88PVxcPy4qKVxcPy9nO1xuICAgIC8vICAgY29uc3Qgc2lnbmFsbGluZ1NlcnZlclVybCA9IHRoaXMuY29uZmlnLmdldFRleHRTZXR0aW5nVmFsdWUoVGV4dFBhcmFtZXRlcnMuU2lnbmFsbGluZ1NlcnZlclVybCk7XG4gICAgLy8gICByZXR1cm4gc2lnbmFsbGluZ1NlcnZlclVybCArIFwiP1wiICsgdGhpcy5jb25maWcudXJsRmxhZ3M7XG4gICAgLy8gfSk7XG5cbiAgICAvLyBTZXQgb3ZlcnJpZGUgY29uZmlnLlxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMubG92ZUxldHRlcnNMaXN0ID0gW107XG4gICAgdGhpcy5taWNyb3Bob25lT3ZlcmxheSA9IG5ldyBNaWNyb3Bob25lT3ZlcmxheSh0aGlzKTtcblxuICAgIC8vIHRoaXMubG92ZUxldHRlcnNDb250YWluZXIgPSBudWxsO1xuXG4gICAgdGhpcy53cmFwV2ViU29ja2V0T25DbG9zZUhhbmRsZXIoKTtcblxuICAgIC8vIEJpbmQgdGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uIHRvIHRoZSBjbGFzcyBpbnN0YW5jZVxuICAgIHRoaXMuaGFuZGxlUmVzb2x1dGlvbkNoYW5nZSA9IHRoaXMuaGFuZGxlUmVzb2x1dGlvbkNoYW5nZS5iaW5kKHRoaXMpO1xuXG4gICAgLy8gUmVnaXN0ZXIgbWVzc2FnZSBoYW5kbGVycy5cbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFwibGV0dGVyXCIsIE1lc3NhZ2VzLlpMb3ZlTGV0dGVyLCB0aGlzLm9uTG92ZUxldHRlcik7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcInN0cmVhbUluZm9cIiwgTWVzc2FnZXMuWlN0cmVhbUluZm8sIHRoaXMub25TdHJlYW1JbmZvKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFwic2Vzc2lvbklkXCIsIE1lc3NhZ2VzLlpTZXNzaW9uSWQsIHRoaXMub25TZXNzaW9uSWQpO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXCJlcnJvclwiLCBNZXNzYWdlcy5aRXJyb3JNZXNzYWdlLCB0aGlzLm9uRXJyb3IpO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXCJwaW5nXCIsIE1lc3NhZ2VzLlpQaW5nLCB0aGlzLm9uUGluZyk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcInF1ZXVlXCIsIE1lc3NhZ2VzLlpRdWV1ZSwgdGhpcy5vblF1ZXVlKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFwidmVyc2lvblwiLCBNZXNzYWdlcy5aVmVyc2lvbiwgdGhpcy5vblZlcnNpb24pO1xuXG4gICAgLy8gQ3JlYXRlIGEgZGVib3VuY2VkIHZlcnNpb24gb2YgdGhlIGhhbmRsZVJlc29sdXRpb25DaGFuZ2UgZnVuY3Rpb25cbiAgICBjb25zdCBkZWJvdW5jZWRSZXNvbHV0aW9uQ2hhbmdlID0gZGVib3VuY2UoKCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCk7XG4gICAgfSwgMCk7XG5cbiAgICAvLyBSZWdpc3RlciBldmVudCBsaXN0ZW5lcnMuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwidmlkZW9Jbml0aWFsaXplZFwiLCB0aGlzLm9uVmlkZW9Jbml0aWFsaXplZC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJzdGF0c1JlY2VpdmVkXCIsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5zZW5kU3RhdHMoZXZlbnQuZGF0YS5hZ2dyZWdhdGVkU3RhdHMpO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIHRoZSB3aW5kb3cgcmVzaXplIGV2ZW50IGxpc3RlbmVyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgZGVib3VuY2VkUmVzb2x1dGlvbkNoYW5nZSk7XG5cbiAgICB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihcbiAgICAgIDAsIC8vIE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lcixcbiAgICAgIFwiVGV4dGJveEVudHJ5XCIsXG4gICAgICAobWVzc2FnZURhdGE/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy53ZWJSdGNDb250cm9sbGVyLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoXG4gICAgICAgICAgICAnVGV4dGJveEVudHJ5JyxcbiAgICAgICAgICAgIG1lc3NhZ2VEYXRhIGFzIEFycmF5PG51bWJlciB8IHN0cmluZz5cbiAgICAgICAgICApXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogVG9TdHJlYW1lci5UZXh0Ym94RW50cnlgLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLmluaXRMb3ZlTGV0dGVyc0NvbnRhaW5lcigpO1xuICAgIHRoaXMuY3JlYXRlTWljcm9waG9uZU92ZXJsYXkoKTtcblxuICAgIC8vIFNldCBwcmUgY29uZmlndXJlZCBoYW5kbGVycy5cbiAgICBpZiAodGhpcy5jb25maWcuc2V0dGluZ3MuZXJyb3JIYW5kbGVyKSB0aGlzLmVycm9ySGFuZGxlci5hZGQodGhpcy5jb25maWcuc2V0dGluZ3MuZXJyb3JIYW5kbGVyKTtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0dGluZ3MucXVldWVIYW5kbGVyKSB0aGlzLnF1ZXVlSGFuZGxlci5hZGQodGhpcy5jb25maWcuc2V0dGluZ3MucXVldWVIYW5kbGVyKTtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0dGluZ3Muc2Vzc2lvbklkSGFuZGxlcikgdGhpcy5zZXNzaW9uSWRIYW5kbGVyLmFkZCh0aGlzLmNvbmZpZy5zZXR0aW5ncy5zZXNzaW9uSWRIYW5kbGVyKTtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0dGluZ3MubG92ZUxldHRlckhhbmRsZXIpIHRoaXMubG92ZUxldHRlckhhbmRsZXIuYWRkKHRoaXMuY29uZmlnLnNldHRpbmdzLmxvdmVMZXR0ZXJIYW5kbGVyKTtcblxuICAgIENvbm5lY3Rpb25JZGVudGlmaWVyLkluc3RhbmNlLnJlZ2lzdGVyKHRoaXMpO1xuXG4gICAgdGhpcy5yZW1vdmVYUkljb25JZkRpc2FibGVkKCk7XG5cbiAgICB0aGlzLmhhbmRsZU1vdXNlTG9jaygpO1xuICB9XG5cbiAgLyoqIEdldHRlciBmb3IgdGhlIHNlc3Npb24gb2JqZWN0LiAqL1xuICBwdWJsaWMgZ2V0IHNlc3Npb24oKTogU2Vzc2lvbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogKiAqICogKiAqICpcbiAgICogIExpc3RlbiAgICpcbiAgICogKiAqICogKiAqICpcbiAgICovXG4gIC8qKiBPbiB2ZXJzaW9uIHJlcXVlc3RlZCwgdGhlIHZlcnNpb24gb2YgdGhlIFdlYlNESyB3b3VsZCBiZSByZXR1cm5lZC4gKi9cbiAgcHJpdmF0ZSBvblZlcnNpb24obWVzc2FnZTogTWVzc2FnZXMuVmVyc2lvbikge1xuICAgIHRoaXMuc2VuZCh7IHR5cGU6IFwidmVyc2lvblwiLCB2ZXJzaW9uOiB0aGlzLmNvbmZpZy5WRVJTSU9OIH0pO1xuICB9XG5cbiAgLyoqIE9uIHBpbmcgdGhlIHNlc3Npb24gY3JlYXRpb24gdGltZXN0YW1wIHdpbGwgYmUgdXBkYXRlZC4gKi9cbiAgcHJpdmF0ZSBvblBpbmcobWVzc2FnZTogTWVzc2FnZXMuUGluZykge1xuICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKFwiSG92ZXJpbmdNb3VzZVwiKSAhPT0gIXRoaXM/LnN0cmVhbUluZm8/LnN0cmVhbUluZm8ubWV0YT8ubW91c2VMb2NrKVxuICAgICAgdGhpcy5oYW5kbGVNb3VzZUxvY2soKTtcbiAgICBpZiAodGhpcy5zZXNzaW9uLmN1cnJlbnQpIHRoaXMuc2Vzc2lvbi5zZXQodGhpcy5zZXNzaW9uLmN1cnJlbnQpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBpbmNvbWluZyBjb25maWd1cmF0aW9ucy4gKi9cbiAgLy8gcHVibGljIHJlYWRvbmx5IHN0cmVhbUluZm9IYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcjxuZXZlcj4oKTtcbiAgcHJpdmF0ZSBvblN0cmVhbUluZm8oc3RyZWFtSW5mbzogTWVzc2FnZXMuU3RyZWFtSW5mbykge1xuICAgIExvZ2dlci5JbmZvKGBTdHJlYW1JbmZvIHJlY2VpdmVkLmApO1xuXG4gICAgLy8gU2F2ZSB0aGUgc3RyZWFtSW5mbyB0byB0aGUgaW5zdGFuY2UgdmFyaWFibGVcbiAgICB0aGlzLnN0cmVhbUluZm8gPSBzdHJlYW1JbmZvO1xuXG4gICAgLy8gQnkgc2V0dGluZyB0aGlzIGhpZGRlbiBmbGFnLCB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgc3RyZWFtSW5mbyBjYW4gYmUgY3V0IG9mZi5cbiAgICAvLyBDdXR0aW5nIG9mIHRoZSBzdHJlYW1JbmZvIGNhbiBsZWFkIHRvIHVud2FudGVkIGJlaGF2aW9yLCB0aGVyZWZvcmUgaXQncyBub3QgYWR2ZXJ0aXNlZC5cbiAgICBpZiAoISh0aGlzLmNvbmZpZz8uc2V0dGluZ3MgYXMgeyBcImRvLW5vdC1ldmFsLXN0cmVhbUluZm9cIj86IHRydWUgfSk/LltcImRvLW5vdC1ldmFsLXN0cmVhbUluZm9cIl0pIHtcbiAgICAgIGNvbnN0IHsgYWZrIH0gPSBzdHJlYW1JbmZvLnN0cmVhbUluZm87XG4gICAgICBpZiAoYWZrKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldEZsYWdFbmFibGVkKEZsYWdzLkFGS0RldGVjdGlvbiwgYWZrLmVuYWJsZWQpO1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcywgYWZrLndhcm4gKyBhZmsuZXJyb3IpO1xuICAgICAgICAvLyBIYWNrXG4gICAgICAgIGNvbnN0IHsgYWZrQ29udHJvbGxlciB9ID0gdGhpcy53ZWJSdGNDb250cm9sbGVyO1xuICAgICAgICBhZmtDb250cm9sbGVyLmNvdW50RG93biA9IGFmay5hY3Rpb247XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbGV2YW50IHNldHRpbmdzIG5lZWQgdG8gYmUgaW50ZXJwcmV0ZWQgd2hlbiB0aGV5IGNvbWUgdGhyb3VnaCB0aGUgc3RyZWFtSW5mbyB0byB0aGUgY2xpZW50LlxuICAgICAgaWYgKHN0cmVhbUluZm8uc3RyZWFtSW5mby53ZWJTZGtTZXR0aW5ncz8uaW5pdCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXRTZXR0aW5ncyhzdHJlYW1JbmZvLnN0cmVhbUluZm8ud2ViU2RrU2V0dGluZ3MuaW5pdCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJlYW1JbmZvLnN0cmVhbUluZm8ud2ViU2RrU2V0dGluZ3M/LmNvbmYpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc3RyZWFtSW5mby5zdHJlYW1JbmZvLndlYlNka1NldHRpbmdzLmNvbmYpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGsgPSBrZXkgYXMga2V5b2YgdHlwZW9mIHRoaXMuY29uZmlnLnNldHRpbmdzO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnNldHRpbmdzW2tdID0gdmFsdWUgYXMgbmV2ZXI7XG5cbiAgICAgICAgICBpZiAoa2V5ID09PSBcImNvbm5lY3Rpb25JZGVudGlmaWVyTG9nZ2luZ0Rpc2FibGVkXCIgJiYgdmFsdWUgPT09IHRydWUpIENvbm5lY3Rpb25JZGVudGlmaWVyLkluc3RhbmNlLmRpc2FibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVNb3VzZUxvY2soKTtcbiAgICB0aGlzLmluamVjdEN1c3RvbVVJKCk7XG5cbiAgICAvLyBFdmVudEhhbmRsZXIuRW1pdCh0aGlzLnN0cmVhbUluZm9IYW5kbGVyLCB1bmRlZmluZWQgYXMgbmV2ZXIpO1xuICB9XG5cbiAgLy8gRXh0ZXJuYWxpemVkXG5cbiAgLyoqIE9uIHBpbmcgdGhlIHNlc3Npb24gY3JlYXRpb24gdGltZXN0YW1wIHdpbGwgYmUgdXBkYXRlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHF1ZXVlSGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXI8TWVzc2FnZXMuUXVldWU+KCk7XG4gIHByaXZhdGUgb25RdWV1ZShtZXNzYWdlOiBNZXNzYWdlcy5RdWV1ZSkge1xuICAgIExvZ2dlci5JbmZvKGBRdWV1ZUluZm8gcmVjZWl2ZWQuYCk7XG4gICAgRXZlbnRIYW5kbGVyLkVtaXQodGhpcy5xdWV1ZUhhbmRsZXIsIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqIEVycm9yIHJlY2VpdmVyLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcjxNZXNzYWdlcy5FcnJvck1lc3NhZ2U+KCk7XG4gIHByaXZhdGUgb25FcnJvcihlcnJvcjogTWVzc2FnZXMuRXJyb3JNZXNzYWdlKSB7XG4gICAgTG9nZ2VyLkVycm9yKGVycm9yLnR5cGUpO1xuICAgIEV2ZW50SGFuZGxlci5FbWl0KHRoaXMuZXJyb3JIYW5kbGVyLCBlcnJvcik7XG4gIH1cblxuICAvKiogTG92ZUxldHRlciAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG92ZUxldHRlckhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPE1lc3NhZ2VzLkxvdmVMZXR0ZXI+KCk7XG4gIHByaXZhdGUgb25Mb3ZlTGV0dGVyKGxvdmVMZXR0ZXI6IE1lc3NhZ2VzLkxvdmVMZXR0ZXIpIHtcbiAgICAvLyBMb2dnZXIuSW5mbyhMb2dnZXIuR2V0U3RhY2tUcmFjZSgpLCBsb3ZlTGV0dGVyLnJlYXNvbik7XG4gICAgaWYgKHRoaXMuY29uZmlnLnNldHRpbmdzLmxvdmVMZXR0ZXJMb2dnaW5nKSBjb25zb2xlLmluZm8obG92ZUxldHRlci5yZWFzb24pO1xuICAgIEV2ZW50SGFuZGxlci5FbWl0KHRoaXMubG92ZUxldHRlckhhbmRsZXIsIGxvdmVMZXR0ZXIpO1xuICAgIHRoaXMucHVzaExldHRlcihsb3ZlTGV0dGVyLnJlYXNvbik7XG4gIH1cblxuICAvKiogU2Vzc2lvbklkICovXG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uSWRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcjxzdHJpbmc+KCk7XG4gIHByaXZhdGUgb25TZXNzaW9uSWQobWVzc2FnZTogTWVzc2FnZXMuU2Vzc2lvbklkKSB7XG4gICAgTG9nZ2VyLkluZm8obWVzc2FnZS5zZXNzaW9uSWQpO1xuICAgIC8vIGNvbnNvbGUuaW5mbyhgU2Vzc2lvbjogJHttZXNzYWdlLnNlc3Npb25JZH1gKTtcbiAgICB0aGlzLnNlc3Npb24uc2V0KG1lc3NhZ2Uuc2Vzc2lvbklkKTtcblxuICAgIEV2ZW50SGFuZGxlci5FbWl0KHRoaXMuc2Vzc2lvbklkSGFuZGxlciwgbWVzc2FnZS5zZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqIFZpZGVvSW5pdGlhbGl6ZWQgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZpZGVvSW5pdGlhbGl6ZWRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcjxuZXZlcj4oKTtcbiAgcHJpdmF0ZSBvblZpZGVvSW5pdGlhbGl6ZWQoKTogdm9pZCB7XG4gICAgLyoqIFRoZSB2aWRlb0luaXRpYWxpemVkIGV2ZW50IGlzIGltcG9ydGFudCBmb3IgdGhlIEFyY3dhcmUgQ2xvdWQgQkFja2VuZCwgc2luY2Ugd2l0aG91dCB0aGF0IGV2ZW50IHRoZSBpbnN0YW5jZSB3aWxsIGJlIGNsZWFuZWQgdXAgKGtpbGxlZCkuICovXG4gICAgdGhpcy5oYW5kbGVNb3VzZUxvY2soKTtcbiAgICB0aGlzLnNlbmQoeyB0eXBlOiBcIm9uVmlkZW9Jbml0aWFsaXplZFwiIH0pO1xuICAgIEV2ZW50SGFuZGxlci5FbWl0KHRoaXMudmlkZW9Jbml0aWFsaXplZEhhbmRsZXIsIHVuZGVmaW5lZCBhcyBuZXZlcik7XG4gICAgdGhpcy5oYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCk7XG4gICAgdGhpcy5oYW5kbGVSZW1vdmVMb3ZlTGV0dGVycygpO1xuICAgIHRoaXMubWljcm9waG9uZU92ZXJsYXkudG9nZ2xlVmlzaWJpbGl0eShmYWxzZSk7XG4gICAgdGhpcy5hcHBseVJlc29sdXRpb25JZlBsYXlpbmcoKTtcbiAgICB0aGlzLnJlbW92ZVhSSWNvbklmRGlzYWJsZWQoKTtcbiAgfVxuXG4gIC8vIEludGVybmFsXG4gIC8qKiBXZWJTb2NrZXQgQ2xvc2UgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdlYnNvY2tldE9uQ2xvc2VIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcjxDbG9zZUV2ZW50PigpO1xuXG4gIC8qKiBBZGRpbmcgYSB6b2Qtc2FmZSBoYW5kbGVyLiAqL1xuICBwcml2YXRlIGFkZE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyB7IHR5cGU/OiBzdHJpbmcgfT4oXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHpvZDogWm9kVHlwZTxUPixcbiAgICBib3VuZE1ldGhvZDogKHRoaXM6IHRoaXMsIHBheWxvYWQ6IHouaW5mZXI8dHlwZW9mIHpvZD4pID0+IHZvaWRcbiAgKSB7XG4gICAgdGhpcy5zaWduYWxsaW5nUHJvdG9jb2wuYWRkTGlzdGVuZXIodHlwZSwgKHBheWxvYWQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkID0gem9kLnNhZmVQYXJzZShwYXlsb2FkKTtcbiAgICAgIGlmIChwYXJzZWQuc3VjY2VzcykgYm91bmRNZXRob2QuY2FsbCh0aGlzLCBwYXJzZWQuZGF0YSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBjYXN0IGhhcyB0byBiZSBkb25lLCBzaW5jZSBGcm9udGVuZCBkb2VzIG5vdCB1c2UgdHlwZXNjcmlwdC1zdHJpY3Qgc2V0dGluZy5cbiAgICAgICAgY29uc3QgcGFyc2VkRXJyb3IgPSBwYXJzZWQgYXMgdW5rbm93biBhcyB6LlNhZmVQYXJzZUVycm9yPFQ+O1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBtZXNzYWdlIGNvbnRlbnQuIEV2ZW50Oicke3R5cGV9JywgWm9kRXJyb3I6ICR7cGFyc2VkRXJyb3IuZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgTG9nZ2VyLkVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqICogKiAqICpcbiAgICogIFNlbmQgICAqXG4gICAqICogKiAqICogKlxuICAgKi9cbiAgcHJpdmF0ZSBzZW5kU3RhdHMoc3RhdHM6IEFnZ3JlZ2F0ZWRTdGF0cykge1xuICAgIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VzLlN0YXRzID0geyB0eXBlOiBcInN0YXRzXCIsIHN0YXRzOiBTdGF0cyhzdGF0cykgfTtcbiAgICAvLyBUaGlzIGNhc3QgaGFzIHRvIGJlIGRvbmUsIHNpbmNlIEZyb250ZW5kIGRvZXMgbm90IHVzZSB0eXBlc2NyaXB0LXN0cmljdCBzZXR0aW5nLlxuICAgIHRoaXMuc2VuZChtZXNzYWdlIGFzIHsgdHlwZTogc3RyaW5nIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kPFQgZXh0ZW5kcyB7IHR5cGU6IHN0cmluZyB9PihtZXNzYWdlOiBUKTogdm9pZDtcbiAgcHJpdmF0ZSBzZW5kPEsgZXh0ZW5kcyBrZXlvZiB0eXBlb2YgTWVzc2FnZXMuU2VuZD4obWVzc2FnZTogeyB0eXBlOiBLIH0gJiB6LmluZmVyPCh0eXBlb2YgTWVzc2FnZXMuU2VuZClbS10+KTogdm9pZDtcbiAgcHJpdmF0ZSBzZW5kPFQgZXh0ZW5kcyB7IHR5cGU6IHN0cmluZyB9LCBLIGV4dGVuZHMga2V5b2YgdHlwZW9mIE1lc3NhZ2VzLlNlbmQ+KFxuICAgIG1lc3NhZ2U6IFQgfCAoeyB0eXBlOiBLIH0gJiB6LmluZmVyPCh0eXBlb2YgTWVzc2FnZXMuU2VuZClbS10+KVxuICApIHtcbiAgICBpZiAoTWVzc2FnZXMuU2VuZFttZXNzYWdlLnR5cGUgYXMgS10pIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IE1lc3NhZ2VzLlNlbmRbbWVzc2FnZS50eXBlIGFzIEtdIS5zYWZlUGFyc2UobWVzc2FnZSk7XG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHRoaXMuc2lnbmFsbGluZ1Byb3RvY29sLnNlbmRNZXNzYWdlKHJlc3VsdC5kYXRhIGFzIEJhc2VNZXNzYWdlKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGNhc3QgaGFzIHRvIGJlIGRvbmUsIHNpbmNlIEZyb250ZW5kIGRvZXMgbm90IHVzZSB0eXBlc2NyaXB0LXN0cmljdCBzZXR0aW5nLlxuICAgICAgICBjb25zdCBwYXJzZWRFcnJvciA9IHJlc3VsdCBhcyB1bmtub3duIGFzIHouU2FmZVBhcnNlRXJyb3I8VD47XG4gICAgICAgIExvZ2dlci5FcnJvcihgRmFpbGVkIHRvIHNlbmQuICR7cGFyc2VkRXJyb3IuZXJyb3J9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2lnbmFsbGluZ1Byb3RvY29sLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVzb2x1dGlvbkNoYW5nZSgpIHtcbiAgICAvLyBHZXQgdGhlIHJlc29sdXRpb24gZnJvbSB0aGUgc3RyZWFtSW5mbyBpZiBhdmFpbGFibGVcbiAgICBpZiAoIXRoaXM/LnN0cmVhbUluZm8gfHwgIXRoaXM/LndlYlJ0Y0NvbnRyb2xsZXIgfHwgIXRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI/LnZpZGVvUGxheWVyPy5nZXRWaWRlb0VsZW1lbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIHJlc29sdXRpb24gZnJvbSB0aGUgc3RyZWFtSW5mbyBpZiBhdmFpbGFibGVcbiAgICBjb25zdCByZXNvbHV0aW9uID0gdGhpcz8uc3RyZWFtSW5mbz8uc3RyZWFtSW5mbz8ucmVzb2x1dGlvbjtcbiAgICBjb25zdCB1bnJlYWxWZXJzaW9uID0gdGhpcz8uc3RyZWFtSW5mbz8uc3RyZWFtSW5mbz8ubWV0YT8udmVyc2lvbjtcbiAgICAvLyBDaGVjayBpZiByZXNvbHV0aW9uLmR5bmFtaWMgaXMgdHJ1ZVxuICAgIGlmIChyZXNvbHV0aW9uICYmIHJlc29sdXRpb24/LmR5bmFtaWMpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHZpZGVvUGxheWVyIH0gPSB0aGlzPy53ZWJSdGNDb250cm9sbGVyO1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB2aWRlb1BsYXllcj8uZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJXaWR0aCA9IHZpZGVvRWxlbWVudFBhcmVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJIZWlnaHQgPSB2aWRlb0VsZW1lbnRQYXJlbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAvLyBEZWZpbmUgbWF4aW11bSBhbGxvd2VkIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSByZXNvbHV0aW9uPy53aWR0aDtcbiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gcmVzb2x1dGlvbj8uaGVpZ2h0O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBicm93c2VyIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gYnJvd3NlcldpZHRoISAvIGJyb3dzZXJIZWlnaHQhO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHdpZHRoIGFuZCBoZWlnaHQgYmFzZWQgb24gdGhlIGFzcGVjdCByYXRpb1xuICAgICAgICBsZXQgbGltaXRlZFdpZHRoLCBsaW1pdGVkSGVpZ2h0O1xuICAgICAgICBpZiAoYXNwZWN0UmF0aW8gPiBtYXhXaWR0aCAvIG1heEhlaWdodCkge1xuICAgICAgICAgIC8vIFdpZHRoIGlzIHRoZSBsaW1pdGluZyBmYWN0b3JcbiAgICAgICAgICBsaW1pdGVkV2lkdGggPSBtYXhXaWR0aDtcbiAgICAgICAgICBsaW1pdGVkSGVpZ2h0ID0gbWF4V2lkdGggLyBhc3BlY3RSYXRpbztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBIZWlnaHQgaXMgdGhlIGxpbWl0aW5nIGZhY3RvclxuICAgICAgICAgIGxpbWl0ZWRIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgICAgbGltaXRlZFdpZHRoID0gbWF4SGVpZ2h0ICogYXNwZWN0UmF0aW87XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlkZW9QbGF5ZXIpIHtcbiAgICAgICAgICAvLyBDaGVjayBVbnJlYWwgRW5naW5lIHZlcnNpb25cbiAgICAgICAgICBpZiAoIXVucmVhbFZlcnNpb24gfHwgdW5yZWFsVmVyc2lvbj8uc3RhcnRzV2l0aChcIjQuMjdcIikpIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgYXNwZWN0IHJhdGlvIGxpbWl0ZWQgcmVzb2x1dGlvbiBmb3IgdGhlIHIuc2V0cmVzIGNvbW1hbmRcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7IENvbnNvbGU6IGByLnNldHJlcyAke01hdGgucm91bmQobGltaXRlZFdpZHRoKX14JHtNYXRoLnJvdW5kKGxpbWl0ZWRIZWlnaHQpfXdgIH07XG4gICAgICAgICAgICB0aGlzPy53ZWJSdGNDb250cm9sbGVyPy5lbWl0VUlJbnRlcmFjdGlvbihkZXNjcmlwdG9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlIHRoZSBhc3BlY3QgcmF0aW8gbGltaXRlZCByZXNvbHV0aW9uIGZvciB0aGUgb25NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbkNhbGxiYWNrXG4gICAgICAgICAgICB2aWRlb1BsYXllci5vbk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uQ2FsbGJhY2soTWF0aC5yb3VuZChsaW1pdGVkV2lkdGgpLCBNYXRoLnJvdW5kKGxpbWl0ZWRIZWlnaHQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlSZXNvbHV0aW9uSWZQbGF5aW5nKCkge1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI/LnZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpO1xuICAgIGlmICh2aWRlb0VsZW1lbnQpIHtcbiAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicGxheWluZ1wiLCAoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXM/LmhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlUGxheWVyKCkge1xuICAgIC8vdGhpcy5zaWduYWxsaW5nUHJvdG9jb2wuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZUxvY2soKSB7XG4gICAgdGhpcz8uY29uZmlnPy5tb2RpZnlJbml0aWFsU2V0dGluZ3MoIXRoaXM/LnN0cmVhbUluZm8/LnN0cmVhbUluZm8ubWV0YT8ubW91c2VMb2NrKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0TG92ZUxldHRlcnNDb250YWluZXIoKSB7XG4gICAgY29uc3QgbG9nb0xvYWRlciA9IG5ldyBBcmN3YXJlTG9nb0xvYWRlcigpO1xuICAgIGlmICghdGhpcy5sb3ZlTGV0dGVyc0NvbnRhaW5lcikge1xuICAgICAgY29uc3QgbG92ZUxldHRlcnNDb250YWluZXIgPSBkb2N1bWVudD8uY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbnN0IHsgdmlkZW9QbGF5ZXIgfSA9IHRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI7XG4gICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB2aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgIGxvdmVMZXR0ZXJzQ29udGFpbmVyPy5jbGFzc0xpc3Q/LmFkZChcImxvdmUtbGV0dGVycy1ib3gtcm9vdFwiKTtcbiAgICAgIHZpZGVvRWxlbWVudFBhcmVudD8uYXBwZW5kQ2hpbGQobG92ZUxldHRlcnNDb250YWluZXIpO1xuICAgICAgY29uc3QgbGV0dGVyc0Jsb2NrID0gZG9jdW1lbnQ/LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBsZXR0ZXJzQmxvY2suaWQgPSBcImxldHRlcnMtYmxvY2tcIjtcbiAgICAgIGNvbnN0IGxldHRlcnNXcmFwcGVyID0gZG9jdW1lbnQ/LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBsZXR0ZXJzV3JhcHBlci5pZCA9IFwibGV0dGVycy13cmFwcGVyXCI7XG4gICAgICBpZiAobG92ZUxldHRlcnNDb250YWluZXIpIHtcbiAgICAgICAgbGV0dGVyc0Jsb2NrPy5hcHBlbmRDaGlsZChsb2dvTG9hZGVyPy5hcmN3YXJlTG9nb0xvYWRlcik7XG4gICAgICAgIGxvdmVMZXR0ZXJzQ29udGFpbmVyPy5hcHBlbmRDaGlsZChsZXR0ZXJzQmxvY2spO1xuICAgICAgICBsZXR0ZXJzQmxvY2s/LmFwcGVuZENoaWxkKGxldHRlcnNXcmFwcGVyKTtcbiAgICAgIH1cblxuICAgICAgbGV0dGVyc0Jsb2NrLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICBpZiAobGV0dGVyc0Jsb2NrKSB7XG4gICAgICAgIGxldHRlcnNCbG9jaz8uYXBwZW5kQ2hpbGQobG9nb0xvYWRlcj8uYXJjd2FyZUxvZ29Mb2FkZXIpO1xuICAgICAgICBsZXR0ZXJzQmxvY2s/LmFwcGVuZENoaWxkKGxldHRlcnNXcmFwcGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHB1c2hMZXR0ZXIobGV0dGVyOiBzdHJpbmcpIHtcbiAgICAvLyBBZGQgdGhlIGxldHRlciB0byB0aGUgcXVldWVcbiAgICB0aGlzPy5sb3ZlTGV0dGVyc1F1ZXVlPy5wdXNoKGxldHRlcik7XG5cbiAgICAvLyBJZiBub3QgYWxyZWFkeSBwcm9jZXNzaW5nIHRoZSBxdWV1ZSwgc3RhcnQgcHJvY2Vzc2luZ1xuICAgIGlmICghdGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSkge1xuICAgICAgdGhpcz8ucHJvY2Vzc0xvdmVMZXR0ZXJRdWV1ZSgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHByb2Nlc3NMb3ZlTGV0dGVyUXVldWUoKSB7XG4gICAgLy8gU2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIHF1ZXVlXG4gICAgdGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSA9IHRydWU7XG4gICAgLy8gVGFrZSB0aGUgZmlyc3QgaXRlbSBmcm9tIHRoZSBxdWV1ZVxuICAgIGNvbnN0IGxldHRlciA9IHRoaXMubG92ZUxldHRlcnNRdWV1ZS5zaGlmdCgpO1xuICAgIGlmIChsZXR0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZm9ybWF0dGVkTG92ZUxldHRlcjogc3RyaW5nID0gbGV0dGVyPy5yZXBsYWNlKC9MTDogfFxcLiQvZywgXCJcIik7XG4gICAgICB0aGlzPy5sb3ZlTGV0dGVyc0xpc3Q/LnB1c2goZm9ybWF0dGVkTG92ZUxldHRlcik7XG4gICAgICBjb25zdCBsb3ZlTGV0dGVyc0JveCA9IG5ldyBMb3ZlTGV0dGVycygpO1xuICAgICAgbG92ZUxldHRlcnNCb3g/LmFkZExldHRlcihmb3JtYXR0ZWRMb3ZlTGV0dGVyLCB0aGlzPy5sb3ZlTGV0dGVyc0xpc3Q/Lmxlbmd0aCk7XG4gICAgICAvLyBQcm9jZXNzIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHF1ZXVlIGFmdGVyIGEgZGVsYXlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnByb2Nlc3NMb3ZlTGV0dGVyUXVldWUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgcXVldWUgaXMgZW1wdHksIHJlc2V0IHRoZSBmbGFnXG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZ1F1ZXVlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW1vdmVMb3ZlTGV0dGVycygpIHtcbiAgICBjb25zdCBsb3ZlTGV0dGVyc0NvbnRhaW5lciA9IGRvY3VtZW50Py5xdWVyeVNlbGVjdG9yKFwiLmxvdmUtbGV0dGVycy1ib3gtcm9vdFwiKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChsb3ZlTGV0dGVyc0NvbnRhaW5lcikge1xuICAgICAgICBsb3ZlTGV0dGVyc0NvbnRhaW5lcj8uY2xhc3NMaXN0Py5hZGQoXCJmYWRlLW91dFwiKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChsb3ZlTGV0dGVyc0NvbnRhaW5lciAmJiBsb3ZlTGV0dGVyc0NvbnRhaW5lcj8ucGFyZW50Tm9kZSkge1xuICAgICAgICBsb3ZlTGV0dGVyc0NvbnRhaW5lcj8ucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQobG92ZUxldHRlcnNDb250YWluZXIpO1xuICAgICAgfVxuICAgIH0sIDE2MDApO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUF1ZGlvKHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgZW5hYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc3RyZWFtQ29udHJvbGxlciB9ID0gdGhpcy53ZWJSdGNDb250cm9sbGVyO1xuICAgIGlmICh2aWRlb0VsZW1lbnQpIHtcbiAgICAgIHZpZGVvRWxlbWVudC5tdXRlZCA9IGVuYWJsZWQ7XG4gICAgICBpZiAoc3RyZWFtQ29udHJvbGxlcikge1xuICAgICAgICBzdHJlYW1Db250cm9sbGVyLmF1ZGlvRWxlbWVudC5tdXRlZCA9IGVuYWJsZWQ7XG4gICAgICAgIGlmICh2aWRlb0VsZW1lbnQ/LmN1cnJlbnRUaW1lID4gMCAmJiAhdmlkZW9FbGVtZW50Py5wYXVzZWQgJiYgc3RyZWFtQ29udHJvbGxlcj8uYXVkaW9FbGVtZW50Py5wYXVzZWQpXG4gICAgICAgICAgc3RyZWFtQ29udHJvbGxlcj8uYXVkaW9FbGVtZW50Py5wbGF5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaWNyb3Bob25lT3ZlcmxheSgpIHtcbiAgICB0aGlzPy5taWNyb3Bob25lT3ZlcmxheT8uY3JlYXRlT3ZlcmxheSgpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZU1pYyhlbmFibGU6IGJvb2xlYW4sIGlzRGVmYXVsdDogYm9vbGVhbikge1xuICAgIHRoaXM/LmNvbmZpZz8uc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuVXNlTWljLCBlbmFibGUpO1xuICAgIGlmICghaXNEZWZhdWx0KSB7XG4gICAgICB0aGlzPy5taWNyb3Bob25lT3ZlcmxheT8udG9nZ2xlTWVzc2FnZShlbmFibGUpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXM/Lm1pY3JvcGhvbmVPdmVybGF5Py50b2dnbGVWaXNpYmlsaXR5KHRydWUpO1xuICAgICAgfSwgMjAwKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVjb25uZWN0KCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdyYXBXZWJTb2NrZXRPbkNsb3NlSGFuZGxlcigpIHtcbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy53ZWJSdGNDb250cm9sbGVyPy50cmFuc3BvcnQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoZXZlbnQpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci5FbWl0KHNlbGYud2Vic29ja2V0T25DbG9zZUhhbmRsZXIsIGV2ZW50IGFzIENsb3NlRXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uU3RyZWFtaW5nU3RhdGVDaGFuZ2UoY2FsbGJhY2s6IChpc1N0cmVhbWluZzogYm9vbGVhbikgPT4gdm9pZCk6IHZvaWQge1xuICAgIC8vIExpc3RlbiB0byB2aWRlbyBlbGVtZW50IGV2ZW50c1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI/LnZpZGVvUGxheWVyPy5nZXRWaWRlb0VsZW1lbnQoKTtcbiAgICB2aWRlb0VsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJwbGF5XCIsICgpID0+IGNhbGxiYWNrKHRydWUpKTtcbiAgICB2aWRlb0VsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJwYXVzZVwiLCAoKSA9PiBjYWxsYmFjayhmYWxzZSkpO1xuICAgIHZpZGVvRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcihcImVuZGVkXCIsICgpID0+IGNhbGxiYWNrKGZhbHNlKSk7XG5cbiAgICAvLyBMaXN0ZW4gdG8gV2ViU29ja2V0IGV2ZW50c1xuICAgIHRoaXMud2ViUnRjQ29udHJvbGxlcj8udHJhbnNwb3J0LmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsICgpID0+IHtcbiAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgIH0pO1xuICAgIHRoaXMud2ViUnRjQ29udHJvbGxlcj8udHJhbnNwb3J0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICBjYWxsYmFjayhmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVhSSWNvbklmRGlzYWJsZWQoKSB7XG4gICAgaWYgKCF0aGlzPy5jb25maWc/LmluaXRpYWxTZXR0aW5ncz8uWFJDb250cm9sbGVySW5wdXQpIHtcbiAgICAgIHRoaXM/LmNvbmZpZz8uc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuWFJDb250cm9sbGVySW5wdXQsIGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICBpZiAodGhpcz8udmlkZW9FbGVtZW50UGFyZW50Py5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgeHJCdG4gPSB0aGlzPy52aWRlb0VsZW1lbnRQYXJlbnQ/LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcihcIiN4ckJ0blwiKTtcbiAgICAgICAgICB4ckJ0bj8ucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluamVjdEN1c3RvbVVJKCkge1xuICAgIGNvbnN0IGN1c3RvbVVJID0gZG9jdW1lbnQ/LmdldEVsZW1lbnRCeUlkKFwic3RyZWFtLXVpXCIpO1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXM/LnZpZGVvRWxlbWVudFBhcmVudD8ucGFyZW50RWxlbWVudDtcbiAgICBpZiAoY3VzdG9tVUkgJiYgdmlkZW9FbGVtZW50UGFyZW50KSB2aWRlb0VsZW1lbnRQYXJlbnQ/LmFwcGVuZENoaWxkKGN1c3RvbVVJKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IE1lc3NhZ2VzIH0gZnJvbSBcIkBhcmN3YXJlLWNsb3VkL3NoYXJlZC1waXhlbHN0cmVhbWluZy13ZWJzZGtcIjtcblxuLyoqIEFyY3dhcmUgU2V0dGluZ3MuICovXG5leHBvcnQgY29uc3QgQXJjd2FyZVNldHRpbmdzU2NoZW1hID0gei5vYmplY3Qoe1xuICAvKiogT3ZlcndyaXRlcyB0aGUgU2Vzc2lvbi1Ub29sIGFuZCB1c2VzIHRoZSBwcm92aWRlZCBzZXNzaW9uIGluc3RlYWQuICovXG4gIHNlc3Npb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgLyoqIENhbiBiZSB1c2VkIHRvIGJlIGFkZGVkIHRvIHRoZSByZXF1ZXN0IGluIG9yZGVyIHRvIHZlcmlmeSBhY2Nlc3MgdG8gcHJpdmF0ZSBwcm9qZWN0cy5cbiAgICogRm9yIGludGVybmFsIHVzZSBvbmx5LiA9PiBQcmV2aWV3IHBhZ2UuXG4gICAqL1xuICB0b2tlbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvKiogQGRlcHJlY2F0ZWQgaW4gdGhlcmUgZm9yIGxlZ2FjeSB1c2UuIENhbiBvbmx5IGJlIHVzZWQgd2hlbiB0b2tlbiBpcyBwcm92aWRlZC4gKi9cbiAgYnlwYXNzOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvLyAvKiogQ29uZmlndXJlIERpcmVjdEZsb3cgVG9rZW4uICovXG4gIC8vIGRpcmVjdEZsb3c6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgLyoqIEhhbmRsZXIgZm9yIHNlcnZlciBzaWRlIGVycm9yIG1lc3NhZ2VzLiAqL1xuICBlcnJvckhhbmRsZXI6IHouZnVuY3Rpb24oKS5hcmdzKE1lc3NhZ2VzLlpFcnJvck1lc3NhZ2UpLnJldHVybnMoei52b2lkKCkpLm9wdGlvbmFsKCksXG4gIC8qKiBIYW5kbGVyIGZvciBxdWV1ZSBldmVudHMuICovXG4gIHF1ZXVlSGFuZGxlcjogei5mdW5jdGlvbigpLmFyZ3MoTWVzc2FnZXMuWlF1ZXVlKS5yZXR1cm5zKHoudm9pZCgpKS5vcHRpb25hbCgpLFxuICAvKiogSGFuZGxlciBmb3Igc2Vzc2lvbklkIG1lc3NhZ2UuICovXG4gIHNlc3Npb25JZEhhbmRsZXI6IHouZnVuY3Rpb24oKS5hcmdzKHouc3RyaW5nKCkpLnJldHVybnMoei52b2lkKCkpLm9wdGlvbmFsKCksXG4gIC8qKiBIYW5kbGVyIGZvciBsb3ZlIGxldHRlcnMuXG4gICAqIFwiTG92ZUxldHRlcnNcIiBhcmUgc2VuZCBmcm9tIGJhY2tlbmQgdG8gdGhlIFNESyB0byBzdGF0ZSB3aGF0IHBoYXNlIHRoZSBjb25uZWN0aW9uIGN1cnJlbnRseSBpcyBpbi4gKi9cbiAgbG92ZUxldHRlckhhbmRsZXI6IHouZnVuY3Rpb24oKS5hcmdzKE1lc3NhZ2VzLlpMb3ZlTGV0dGVyKS5yZXR1cm5zKHoudm9pZCgpKS5vcHRpb25hbCgpLFxuICAvKiogU2hvdyBvciBoaWRlIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbi4gKi9cbiAgZnVsbHNjcmVlbkJ1dHRvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgc2V0dGluZ3MgYnV0dG9uLiAqL1xuICBzZXR0aW5nc0J1dHRvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgaW5mbyBidXR0b24uICovXG4gIGluZm9CdXR0b246IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIC8qKiBTaG93IG9yIGhpZGUgdGhlIGF1ZGlvIGJ1dHRvbi4gKi9cbiAgYXVkaW9CdXR0b246IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIC8qKiBTaG93IG9yIGhpZGUgdGhlIG1pY3JvcGhvbmUgYnV0dG9uLiAqL1xuICBtaWNCdXR0b246IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIC8qKiBTaG93IG9yIGhpZGUgdGhlIG1pY3JvcGhvbmUgYnV0dG9uLiAqL1xuICBzdG9wQnV0dG9uOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogU2hvdyBvciBoaWRlIHRoZSBjb25uZWN0aW9uU3RyZW5ndGhJY29uIGJ1dHRvbi4gKi9cbiAgY29ubmVjdGlvblN0cmVuZ3RoSWNvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcblxuICAvKiogU2hhcmVJZCwgdXNlZCBmb3Igc2hhcmluZyB5b3VyIHByb2plY3QuXG4gICAqIFVzaW5nIEFyY3dhcmVJbml0IHdpbGwgc2V0IHRoaXMgcmVxdWlyZWQgcHJvcGVydHkgZm9yIHlvdS4gKi9cbiAgc2hhcmVJZDogei5zdHJpbmcoKS5zdGFydHNXaXRoKFwic2hhcmUtXCIpLm9wdGlvbmFsKCksXG4gIC8qKiBJZCBvZiB5b3VyIHByb2plY3QsIG9ubHkgcmVxdWlyZWQgaWYgeW91ciBzaGFyZUlkIHJlZmVycyB0byBtdWx0aXBsZSBwcm9qZWN0cy5cbiAgICogVXNpbmcgQXJjd2FyZUluaXQgd2lsbCBzZXQgdGhpcyByZXF1aXJlZCBwcm9wZXJ0eSBmb3IgeW91LiAqL1xuICBwcm9qZWN0SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcblxuICAvKiogRW5hYmxlL0Rpc2FibGUgTG92ZUxldHRlciBsb2dnaW5nIHRvIHRoZSBjb25zb2xlLiAqL1xuICBsb3ZlTGV0dGVyTG9nZ2luZzogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIEVuYWJsZS9EaXNhYmxlIENvbm5lY3Rpb24gSWRlbnRpZmllciBsb2dnaW5nIHRvIHRoZSBjb25zb2xlLiAqL1xuICBjb25uZWN0aW9uSWRlbnRpZmllckxvZ2dpbmdEaXNhYmxlZDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIFdpZHRoIHdpdGggd2hpY2ggaW5zdGFuY2Ugc2hvdWxkIGJlIHN0YXJ0ZWQgKi9cbiAgc3RhcnRXaWR0aDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAvKiogSGVpZ2h0IHdpdGggd2hpY2ggaW5zdGFuY2Ugc2hvdWxkIGJlIHN0YXJ0ZWQgKi9cbiAgc3RhcnRIZWlnaHQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKVxufSk7XG5cbmV4cG9ydCB0eXBlIFNldHRpbmdzID0gei5pbmZlcjx0eXBlb2YgQXJjd2FyZVNldHRpbmdzU2NoZW1hPjtcbiIsImltcG9ydCB7IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB9IGZyb20gXCIuLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcblxuZXhwb3J0IGVudW0gV2Vic29ja2V0U3RhdGUge1xuICAvLyBTb2NrZXQgaGFzIGJlZW4gY3JlYXRlZC4gVGhlIGNvbm5lY3Rpb24gaXMgbm90IHlldCBvcGVuLlxuICBDT05ORUNUSU5HID0gMCxcbiAgLy8gVGhlIGNvbm5lY3Rpb24gaXMgb3BlbiBhbmQgcmVhZHkgdG8gY29tbXVuaWNhdGUuXG4gIE9QRU4gPSAxLFxuICAvLyBUaGUgY29ubmVjdGlvbiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjbG9zaW5nLlxuICBDTE9TSU5HID0gMixcbiAgLy8gVGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIG9yIGNvdWxkbid0IGJlIG9wZW5lZC5cbiAgQ0xPU0VEID0gMyxcbn1cblxuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25JZGVudGlmaWVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbm5lY3Rpb25JZGVudGlmaWVyO1xuICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgQ29ubmVjdGlvbklkZW50aWZpZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJ2YWw6IGFueTtcblxuICBwcml2YXRlIGFwczogQXJjd2FyZVBpeGVsU3RyZWFtaW5nW10gPSBbXTtcblxuICBwdWJsaWMgZ2V0IFdlYnNvY2tldFN0YXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5hcHMubWFwKChwcykgPT4gcHMud2Vic29ja2V0U3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHVibGljIHJlZ2lzdGVyKHBzOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXBzLmluY2x1ZGVzKHBzKSkge1xuICAgICAgdGhpcy5hcHMucHVzaChwcyk7XG5cbiAgICAgIGlmIChwcy5jb25maWcuc2V0dGluZ3M/LmNvbm5lY3Rpb25JZGVudGlmaWVyTG9nZ2luZ0Rpc2FibGVkKSB0aGlzLmRpc2FibGUoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmludGVydmFsKSB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwodGhpcy5jb25uZWN0aW9uV2F0Y2hlci5iaW5kKHRoaXMpLCAxMCAqIDEwMDApO1xuICB9XG5cbiAgcHVibGljIEdldFdlYlNvY2tldFN0YXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5hcHMubWFwKChwcykgPT4gcHMud2Vic29ja2V0U3RhdGUpO1xuICB9XG5cbiAgcHVibGljIEFjdGl2ZUluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5HZXRXZWJTb2NrZXRTdGF0ZXMoKS5maWx0ZXIoKHN0YXRlKSA9PiBzdGF0ZSA8PSBXZWJzb2NrZXRTdGF0ZS5PUEVOKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZWQgPSB0cnVlO1xuICBwdWJsaWMgZGlzYWJsZSgpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBwZXJpb2RpY2FsbHkgdGVsbCB0aGUgZGV2ZWxvcGVyIHRoZSBhbW91bnQgb2YgY29ubmVjdGVkIGluc3RhbmNlcy5cbiAgICogVGhpcyB3YXkgdGhlIGRldmVsb3BlciBjYW4gZmlndXJlIG91dCwgd2hlbiB0aGV5IG1lc3NlZCB1cCB0aGUgaW1wbGVtZW50YXRpb24gYW5kIHRoZXJlJ3Mgc2hhZG93IGluc3RhbmNlcyBzdGlsbCBydW5uaW5nLlxuICAgKiBPciB3aGVuIHRoZXkgYWNjaWRlbnRhbGx5IHNldCB1cCBtdWx0aXBsZSBjb25uZWN0aW9ucyFcbiAgICogVGhpbmdzIGxpa2UgdGhhdCBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSBpZiB0aGUgUmVhY3QudXNlRWZmZWN0IHdhcyBub3Qgc2V0dXAgcGVyZmVjdGx5IVxuICAgKi9cbiAgcHJpdmF0ZSBjb25uZWN0aW9uV2F0Y2hlcigpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgIGNvbnN0IGFjdGl2ZVN0YXRlcyA9IHRoaXMuR2V0V2ViU29ja2V0U3RhdGVzKCkuZmlsdGVyKChzdGF0ZSkgPT4gc3RhdGUgPD0gV2Vic29ja2V0U3RhdGUuT1BFTik7XG5cbiAgICBpZiAoYWN0aXZlU3RhdGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc29sZS5sb2coYFBpeGVsU3RyZWFtaW5nIEluc3RhbmNlIGlzIGNvbm5lY3RlZC5gKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2ZVN0YXRlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHthY3RpdmVTdGF0ZXMubGVuZ3RofSBQaXhlbFN0cmVhbWluZyBJbnN0YW5jZXMgYXJlIGNvbm5lY3RlZCFgKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKiBBIGhlbHBlciBjbGFzcyB0byBzcHJlYWQgdGhlIGV2ZW50IHRvIGFkZGl0aW9uYWwgZXZlbnQgaGFuZGxlcnMgYWRkZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VzLiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50SGFuZGxlcjxUeXBlPiB7XG4gIHByaXZhdGUgY2FsbGJhY2tzOiBBcnJheTwoYXJnOiBUeXBlKSA9PiB2b2lkPjtcblxuICAvKiogUmV0dXJucyB0aGUgYWRkZWQgY2FsbGJhY2sgb24gc3VjY2VzcyBvciBudWxsLCBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4gKi9cbiAgcHVibGljIGFkZDxDYWxsYmFjayBleHRlbmRzIChhcmc6IFR5cGUpID0+IHZvaWQ+KGNhbGxiYWNrOiBDYWxsYmFjayk6IENhbGxiYWNrIHwgbnVsbCB7XG4gICAgY29uc3QgY2IgPSB0aGlzLmNhbGxiYWNrcy5maW5kKChjYikgPT4gY2IgPT09IGNhbGxiYWNrKTtcbiAgICBpZiAoY2IpIHJldHVybiBudWxsO1xuICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IGNhbGxiYWNrIGhhcyBiZWVuIGZvdW5kIGFuZCByZW1vdmVkIGFuZCBmYWxzZSBpZiBub3QuICovXG4gIHB1YmxpYyByZW1vdmU8Q2FsbGJhY2sgZXh0ZW5kcyAoYXJnOiBUeXBlKSA9PiB2b2lkPihjYWxsYmFjazogQ2FsbGJhY2spOiBib29sZWFuIHtcbiAgICBjb25zdCBjYiA9IHRoaXMuY2FsbGJhY2tzLmZpbmQoKGNiKSA9PiBjYiA9PT0gY2FsbGJhY2spO1xuICAgIGlmIChjYikgdGhpcy5jYWxsYmFja3Muc3BsaWNlKHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoY2IpLCAxKTtcbiAgICByZXR1cm4gISFjYjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IEFycmF5PChhcmc6IFR5cGUpID0+IHZvaWQ+KCk7XG4gIH1cblxuICAvKiogRW1pdHMgdGhlIGV2ZW50LWRhdGEgZm9yIGVhY2ggb2YgdGhlIGV4aXN0aW5nIGhhbmRsZXJzLiAqL1xuICBwdWJsaWMgc3RhdGljIEVtaXQ8VHlwZT4oaGFuZGxlcjogRXZlbnRIYW5kbGVyPFR5cGU+LCBldmVudDogVHlwZSk6IHZvaWQge1xuICAgIGhhbmRsZXIuY2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayhldmVudCkpO1xuICB9XG59XG4iLCJpbXBvcnQgYWRkU2Vjb25kcyBmcm9tICdkYXRlLWZucy9hZGRTZWNvbmRzJztcbmltcG9ydCBpc0JlZm9yZSBmcm9tICdkYXRlLWZucy9pc0JlZm9yZSc7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBaU2Vzc2lvbiA9IHpcbiAgLm9iamVjdCh7XG4gICAgaWQ6IHouc3RyaW5nKCkubWluKDEpLFxuICAgIGNyZWF0ZWQ6IHpcbiAgICAgIC5kYXRlKClcbiAgICAgIC5vcih6LnN0cmluZygpKVxuICAgICAgLnRyYW5zZm9ybSgoYXJnKSA9PiBuZXcgRGF0ZShhcmcpKSxcbiAgICBleHBpcmU6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgWk9wdGlvbnMgPSB6Lm9iamVjdCh7XG4gIGxvY2FsU3RvcmFnZUtleTogei5zdHJpbmcoKS5taW4oMykuZGVmYXVsdChcInB4c3NcIiksXG4gIGtlZXBTZXNzaW9uOiB6XG4gICAgLm51bWJlcigpXG4gICAgLmludCgpXG4gICAgLm1pbigzKVxuICAgIC8qKiBEZWZhdWx0IGtlZXAgaXMgMTAsIHNpbmNlIHRoaXMgaXMgaG93IGxvbmcgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBhbGl2ZSBieSBkZWZhdWx0LiAqL1xuICAgIC5kZWZhdWx0KDEwKSxcbn0pO1xuXG50eXBlIE9wdGlvbnMgPSB6LmluZmVyPHR5cGVvZiBaT3B0aW9ucz47XG5cbi8qKiBUaGUgc2Vzc2lvbklkIGlzIHN0b3JlZCBpbiB0aGUgbG9jYWxTdG9yYWdlIHRvIGFsbG93IGZvciByZWNvbm5lY3Rpb24gYW5kXG4gKiB0byBwcmV2ZW50IHNwYW1taW5nIHN0YXJ0IHJlcXVlc3RzIG9mIGluc3RhbmNlcywgd2hlbiBzbWFzaGluZyBGNS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb24ge1xuICBwcml2YXRlIF9jdXJyZW50Pzogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5vU2Vzc2lvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5oYXMoXCJub1Nlc3Npb25cIik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIElmIHRoZSBxdWVyeS1wYXJhbWV0ZXIgXCJub1Nlc3Npb25cIiBvciBcIm5vc2Vzc2lvblwiIGlzIHNldCwgaXQgd2lsbCBiZSBza2lwcGVkLlxuICAgIGlmICh0aGlzLm5vU2Vzc2lvbikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBzZXNzaW9uU3RyaW5nID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KTtcbiAgICAvLyBObyBzZXNzaW9uIHlldCBzZXQuXG4gICAgaWYgKHNlc3Npb25TdHJpbmcgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IFpTZXNzaW9uLnNhZmVQYXJzZShKU09OLnBhcnNlKHNlc3Npb25TdHJpbmcpKTtcbiAgICAvLyBDbGVhciB0aGUgc2Vzc2lvbiBpZiBpdCdzIG5vdCB2YWxpZC5cbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICB0aGlzLnVuc2V0KCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uID0gcGFyc2VkLmRhdGE7XG4gICAgY29uc3QgZXhwaXJhdGlvblRpbWUgPSBhZGRTZWNvbmRzKG5ldyBEYXRlKHNlc3Npb24uY3JlYXRlZCksIHRoaXMub3B0aW9ucy5rZWVwU2Vzc2lvbik7XG4gICAgaWYgKGlzQmVmb3JlKGV4cGlyYXRpb25UaW1lLCBuZXcgRGF0ZSgpKSkge1xuICAgICAgdGhpcy51bnNldCgpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBzZXNzaW9uSWQuXG4gICAgcmV0dXJuIHNlc3Npb24uaWQ7XG4gIH1cblxuICBwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnM7XG5cbiAgcHJpdmF0ZSBnZXQgbG9jYWxTdG9yYWdlS2V5KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9jYWxTdG9yYWdlS2V5O1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBaT3B0aW9ucy5wYXJzZShvcHRpb25zIHx8IHt9KTtcbiAgfVxuXG4gIC8qKiBTZXQncyB0aGUgc2Vzc2lvbiB3aXRoIGNyZWF0aW9uIGRhdGUgZm9yIHRoZSBnaXZlbiBzdG9yYWdlIGtleSB0byB0aGUgbG9jYWxTdG9yYWdlLiAqL1xuICBwdWJsaWMgc2V0KHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgWlNlc3Npb24uc2hhcGUuaWQucGFyc2Uoc2Vzc2lvbklkKTtcbiAgICB0aGlzLl9jdXJyZW50ID0gc2Vzc2lvbklkO1xuXG4gICAgY29uc3Qgc2Vzc2lvbjogei5pbmZlcjx0eXBlb2YgWlNlc3Npb24+ID0ge1xuICAgICAgaWQ6IHNlc3Npb25JZCxcbiAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICBleHBpcmU6IGZhbHNlLFxuICAgIH07XG5cbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KHNlc3Npb24pKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIGEgc2Vzc2lvbiBmcm9tIHRoZSBsb2NhbFN0b3JhZ2UuICovXG4gIHB1YmxpYyB1bnNldCgpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlcyB9IGZyb20gXCJAYXJjd2FyZS1jbG91ZC9zaGFyZWQtcGl4ZWxzdHJlYW1pbmctd2Vic2RrXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGVkU3RhdHMsIENhbmRpZGF0ZVBhaXJTdGF0cyB9IGZyb20gXCJAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBTdGF0cyhzdGF0czogQWdncmVnYXRlZFN0YXRzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IE1lc3NhZ2VzLlpTdGF0cy5zaGFwZS5zdGF0cy5wYXJzZSh7XG4gICAgLyoqXG4gICAgICogT3RoZXIga25vd24gcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBjb2RlY3M6IHN0YXRzLmNvZGVjcyxcbiAgICBjYW5kaWRhdGVQYWlyOiBzdGF0cy5jYW5kaWRhdGVQYWlycyxcbiAgICBsb2NhbENhbmRpZGF0ZXM6IHN0YXRzLmxvY2FsQ2FuZGlkYXRlcyxcbiAgICByZW1vdGVDYW5kaWRhdGVzOiBzdGF0cy5yZW1vdGVDYW5kaWRhdGVzLFxuICAgIERhdGFDaGFubmVsU3RhdHM6IHN0YXRzLmRhdGFjaGFubmVsU3RhdHMsXG5cbiAgICAvLyBSZWNlaXZlZCAobGFzdCkgZm9yIHRpY2tldFxuICAgIGJ5dGVzUmVjZWl2ZWQ6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmJ5dGVzUmVjZWl2ZWQpLFxuICAgIC8vIFBhY2tldHMgTG9zdCAobGFzdCkgZm9yIHRpY2tldFxuICAgIHBhY2tldHNMb3N0OiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5wYWNrZXRzTG9zdCksXG4gICAgLy8gVmlkZW8gcmVzb2x1dGlvbjogaGlnaGVzdCBsb3dlc3QgYXZlcmFnZSAocG9ydHJhaXQpIGFuZCBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChsYW5kc2NhcGUpIGZvciB0aWNrZXRcbiAgICBmcmFtZVdpZHRoOiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZVdpZHRoISksXG4gICAgLy8gVmlkZW8gcmVzb2x1dGlvbjogaGlnaGVzdCBsb3dlc3QgYXZlcmFnZSAocG9ydHJhaXQpIGFuZCBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChsYW5kc2NhcGUpIGZvciB0aWNrZXRcbiAgICBmcmFtZUhlaWdodDogZm9yY2VOdW1iZXIoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVIZWlnaHQhKSxcbiAgICAvLyBGcmFtZXMgZGVjb2RlZCAoTGFzdCkgZm9yIHRpY2tldFxuICAgIGZyYW1lc0RlY29kZWQ6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQhKSxcbiAgICAvLyBGcmFtZXJhdGUgKGxvdyAvIGhpZ2gsIGF2ZykgZm9yIHRpY2tldFxuICAgIGZyYW1lc1BlclNlY29uZDogZm9yY2VOdW1iZXIoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzUGVyU2Vjb25kISksXG4gICAgLy8gZnJhbWVzIGRyb3BwZWQgKGxhc3QpIGZvciB0aWNrZXRcbiAgICBmcmFtZXNEcm9wcGVkOiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEcm9wcGVkISksXG4gICAgLy8gVmlkZW9jb2RlYyAob25jZSkgZm9yIHRpY2tldFxuICAgIHZpZGVvQ29kZWM6IHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmNvZGVjSWQsXG4gICAgLy8gYXVkaW9jb2RlYyAob25jZSkgZm9yIHRpY2tldFxuICAgIGF1ZGlvQ29kZWM6IHN0YXRzLmluYm91bmRBdWRpb1N0YXRzLmNvZGVjSWQsXG4gICAgLy8gYnJvd3NlciB0eXBlIGFuZCB2ZXJzaW9uIGZvciB0aWNrZXQgKGFyY3dhcmUgLyBhZGRpdGlvbilcbiAgICBicm93c2VySW5mbzoge1xuICAgICAgLy8gdG8gYmUgcmVjZWl2ZWQhXG4gICAgICB1c2VyQWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICBwbGF0Zm9ybTogKG5hdmlnYXRvciBhcyBhbnkpLm9zY3B1IHx8IG5hdmlnYXRvci5wbGF0Zm9ybSB8fCBudWxsLCAvLyBuYXZpZ2F0b3Iub3NjcHUsXG4gICAgICBsYW5ndWFnZTogbmF2aWdhdG9yLmxhbmd1YWdlLFxuICAgIH0sXG4gICAgLy8gTmV0IFJUVCAobG93LCBoaWdoLCBhdmcpXG4gICAgLy8gQkVHSU4gVFcgQ0hBTkdFXG4gICAgY3VycmVudFJUVDogY2FsY1JUVChzdGF0cy5jYW5kaWRhdGVQYWlycyksXG4gICAgLy8gRU5EIFRXIENIQU5HRVxuICAgIC8vIER1cmF0aW9uIChsYXN0KVxuICAgIHNlc3Npb25SdW5UaW1lOiBzdGF0cy5zZXNzaW9uU3RhdHMucnVuVGltZSxcbiAgICAvLyBDb250cm9scyBzdHJlYW0gaW5wdXQgKD8/KVxuICAgIGNvbnRyb2xzU3RyZWFtSW5wdXQ6IHN0YXRzLnNlc3Npb25TdGF0cy5jb250cm9sc1N0cmVhbUlucHV0LFxuICAgIC8vIHZpZGVvIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKGxvdyAvIGhpZ2ggLyBhdmcgaWYgYXBwbGljYWJsZSlcbiAgICB2aWRlb0VuY29kZXJBdmdRUDogZm9yY2VOdW1iZXIoc3RhdHMuc2Vzc2lvblN0YXRzLnZpZGVvRW5jb2RlckF2Z1FQKSxcbiAgICAvLyBWaWRlbyBiaXRyYXRlIChtaW4gLyBtYXggLyBhdmcpXG4gICAgdmlkZW9CaXRyYXRlOiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5iaXRyYXRlISksXG4gICAgLy8gQXVkaW8gYml0cmF0ZSAobWluIC8gbWF4IC8gYXZnKVxuICAgIGF1ZGlvQml0cmF0ZTogZm9yY2VOdW1iZXIoc3RhdHMuaW5ib3VuZEF1ZGlvU3RhdHMuYml0cmF0ZSEpLFxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGNhbmRpZGF0ZSBwYWlycyB0aGlzIGZ1bmN0aW9uIHdpbGwgZmluZCB0aGUgaGlnaGVzdCBSVFQgZm9yIHRoZSBzZWxlY3RlZCBwYWlyXG4gKiBAcGFyYW0gcGFpcnMgLSBBbiBhcnJheSBvZiBjYW5kaWRhdGUgcGFpcnNcbiAqIEByZXR1cm5zIFRoZSBoaWdoZXN0IHJvdW5kIHRyaXAgdGltZSBvZiBhIHNlbGVjdGVkIGNhbmRpZGF0ZSBwYWlyXG4gKi9cbmZ1bmN0aW9uIGNhbGNSVFQocGFpcnM6IENhbmRpZGF0ZVBhaXJTdGF0c1tdKTogTnVtYmVyIHtcblxuICBsZXQgcnR0ID0gMDtcbiAgcGFpcnMuZm9yRWFjaCgocGFpcjogQ2FuZGlkYXRlUGFpclN0YXRzKSA9PiB7XG5cbiAgICBpZiAocGFpci5zZWxlY3RlZCAmJiBwYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lID4gcnR0KSB7XG4gICAgICBydHQgPSBwYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lO1xuICAgIH1cbiAgfSlcblxuICByZXR1cm4gcnR0O1xufVxuXG4vKipcbiAqIFRha2VzIGEgbnVtYmVyIGFuZCBmb3JjZXMgaXQgdG8gcmV0dXJuIGEgbnVtYmVyLiBJZiB0aGUgdmFsdWUgcGFzc2VkIGluIGlzIE5hTiwgMCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIHZhbHVlIC0gQSBudW1iZXJcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgcGFzc2VkIGluIGFzIHZhbHVlIG9yIDAgaWYgdmxhdWUgd2FzIE5hTlxuICovXG5mdW5jdGlvbiBmb3JjZU51bWJlcih2YWx1ZTogbnVtYmVyKTogTnVtYmVyIHtcbiAgcmV0dXJuIGlzTmFOKHZhbHVlKSA/IDAgOiB2YWx1ZTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IHZvaWQ+KFxuICBmdW5jOiBULFxuICB3YWl0OiBudW1iZXJcbik6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiB2b2lkIHtcbiAgbGV0IHRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBmdW5jKC4uLmFyZ3MpLCB3YWl0KTtcbiAgfTtcbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL0FyY3dhcmVBcHBsaWNhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQXJjd2FyZUNvbmZpZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vQXJjd2FyZVBpeGVsU3RyZWFtaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9BcmN3YXJlSW5pdFwiO1xuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi9NZXNzYWdlVHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlcy9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdBcHBsaWNhdGlvblN0eWxlc1wiO1xuIiwiZXhwb3J0IGNvbnN0IEFyY3dhcmVTdHlsZXMgPSB7XG4gIGN1c3RvbVN0eWxlczoge1xuICAgIFwiOnJvb3RcIjoge1xuICAgICAgXCItLWNvbG9yMFwiOiBcIiMxODE4MUEgIWltcG9ydGFudFwiLFxuICAgICAgXCItLWNvbG9yMVwiOiBcIiMwMDAwMDBcIixcbiAgICAgIFwiLS1jb2xvcjJcIjogXCIjRkZGRkZGXCIsXG4gICAgICBcIi0tY29sb3IzXCI6IFwiI0RBRjY5MyAhaW1wb3J0YW50XCIsXG4gICAgICBcIi0tY29sb3I0XCI6IFwiIzM1YjM1MFwiLFxuICAgICAgXCItLWNvbG9yNVwiOiBcIiNmZmFiMDBcIixcbiAgICAgIFwiLS1jb2xvcjZcIjogXCIjODU4NTg4ICFpbXBvcnRhbnRcIixcbiAgICAgIFwiLS1jb2xvcjdcIjogXCIjQjVCNUI3ICFpbXBvcnRhbnRcIixcbiAgICAgIFwiLS1jb2xvcjhcIjogXCIjNDEwMDhjXCIsXG4gICAgICBcIi0tY29sb3I5XCI6IFwiIzNlMDA3MFwiLFxuICAgICAgXCItLWNvbG9yMTBcIjogXCIjMmUwMDUyXCIsXG4gICAgICBcIi0tY29sb3IxMVwiOiBcInJnYmEoNjUsMCwxMzksMSkgIWltcG9ydGFudFwiLFxuICAgICAgXCItLWNvbG9yMTJcIjogXCIjMjIyMjI0ICFpbXBvcnRhbnRcIixcbiAgICAgIFwiLS1jb2xvcjEzXCI6IFwiI2YwZjBmMiAhaW1wb3J0YW50XCIsXG4gICAgICBcIi0tY29sb3JCb3hTaGFkb3dcIjogXCJyZ2JhKDAsIDAsIDAsIDAuMjApICFpbXBvcnRhbnRcIixcbiAgICB9LFxuICAgIFwiI3BsYXllclVJICpcIjoge1xuICAgICAgZm9udEZhbWlseTogXCJzeXN0ZW0tdWlcIixcbiAgICB9LFxuICAgIFwiI3NoYXJlZC1zdHJlYW0tY29udGFpbmVyXCI6IHtcbiAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgfSxcbiAgICBcIiNzaGFyZWQtc3RyZWFtLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXJcIjoge1xuICAgICAgd2lkdGg6IFwiMTBweFwiLFxuICAgIH0sXG4gICAgXCIjc2hhcmVkLXN0cmVhbS1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrXCI6IHtcbiAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tY29sb3IxMylcIixcbiAgICAgIG9wYWNpdHk6IFwiMC41XCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiMzBweFwiLFxuICAgICAgYm9yZGVyVG9wOiBcIjIwcHggc29saWQgdmFyKC0tY29sb3IwKVwiLFxuICAgICAgYm9yZGVyUmlnaHQ6IFwiNXB4IHNvbGlkIHZhcigtLWNvbG9yMClcIixcbiAgICAgIGJvcmRlckJvdHRvbTogXCIyMHB4IHNvbGlkIHZhcigtLWNvbG9yMClcIixcbiAgICAgIGJvcmRlckxlZnQ6IFwiNXB4IHNvbGlkIHZhcigtLWNvbG9yMClcIixcbiAgICB9LFxuICAgIFwiI3NoYXJlZC1zdHJlYW0tY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZVwiOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgfSxcbiAgICBcIiNzaGFyZWQtc3RyZWFtLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJcIjoge1xuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjEzKVwiLFxuICAgICAgd2lkdGg6IFwiOHB4XCIsXG4gICAgICBib3JkZXJSaWdodDogXCIycHggc29saWQgdmFyKC0tY29sb3IwKVwiLFxuICAgICAgYm9yZGVyTGVmdDogXCIycHggc29saWQgdmFyKC0tY29sb3IwKVwiLFxuICAgICAgdHJhbnNpdGlvbjogXCJhbGwgZWFzZS1pbi1vdXQgMC4zc1wiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjdweFwiLFxuICAgIH0sXG4gICAgXCIjc2hhcmVkLXN0cmVhbS1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyXCI6IHtcbiAgICAgIHRyYW5zaXRpb246IFwiYWxsIGVhc2UtaW4tb3V0IDAuM3NcIixcbiAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tY29sb3IzKVwiLFxuICAgIH0sXG4gICAgXCIjcGxheWVyVUksICN2aWRlb0VsZW1lbnRQYXJlbnRcIjoge1xuICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICBtYXhXaWR0aDogXCIxMDAlXCIsXG4gICAgICBtYXhIZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgdG9wOiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgbWFyZ2luOiBcImF1dG9cIixcbiAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICBwb2ludGVyRXZlbnRzOiBcImFsbFwiLFxuICAgIH0sXG4gICAgXCIjc3RyZWFtaW5nVmlkZW9cIjoge1xuICAgICAgbWF4V2lkdGg6IFwiMTAwJVwiLFxuICAgICAgbWF4SGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICBiYWNrZ3JvdW5kOiBcIiMxODE4MUFcIixcbiAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgI2NvbnRyb2xzXCI6IHtcbiAgICAgIHRvcDogXCJhdXRvXCIsXG4gICAgICBsZWZ0OiBcImF1dG9cIixcbiAgICAgIGJvdHRvbTogXCIxMHB4XCIsXG4gICAgICByaWdodDogXCIyMHB4XCIsXG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uLXJldmVyc2VcIixcbiAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgI2Nvbm5lY3Rpb25cIjoge1xuICAgICAgYm90dG9tOiBcIjVweFwiLFxuICAgICAgbGVmdDogXCIxMHB4XCIsXG4gICAgICB3aWR0aDogXCIyLjVyZW1cIixcbiAgICAgIGhlaWhndDogXCIyLjVyZW1cIixcbiAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgYnV0dG9uXCI6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1jb2xvcjEyKVwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICB3aWR0aDogXCI0NXB4XCIsXG4gICAgICBoZWlnaHQ6IFwiNDVweFwiLFxuICAgICAgcGFkZGluZzogXCIwLjVyZW1cIixcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwicm93XCIsXG4gICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICBib3hTaGFkb3c6IFwiMHB4IDBweCAyNHB4IDBweCB2YXIoLS1jb2xvckJveFNoYWRvdylcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIzcHhcIixcbiAgICAgIG91dGxpbmU6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyBidXR0b246aG92ZXIsICN1aUZlYXR1cmVzIGJ1dHRvbjphY3RpdmVcIjoge1xuICAgICAgcGFkZGluZzogXCIwICFpbXBvcnRhbnRcIixcbiAgICAgIGJvcmRlcjogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIiN1aUZlYXR1cmVzIGJ1dHRvbiAjYXVkaW9JY29uTXV0ZWQsICN1aUZlYXR1cmVzIGJ1dHRvbiAjYXVkaW9JY29uVW5tdXRlZCwgI3VpRmVhdHVyZXMgYnV0dG9uICNtaWNJY29uTXV0ZWQsICN1aUZlYXR1cmVzIGJ1dHRvbiAjbWljSWNvblVubXV0ZWRcIjpcbiAgICAgIHtcbiAgICAgICAgd2lkdGg6IFwiMzFweFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMjhweFwiLFxuICAgICAgfSxcbiAgICBcIiN1aUZlYXR1cmVzIGJ1dHRvbiAjbWF4aW1pemVJY29uLCAjdWlGZWF0dXJlcyBidXR0b24gI21pbmltaXplSWNvblwiOiB7XG4gICAgICB3aWR0aDogXCIyNXB4XCIsXG4gICAgICBoZWlnaHQ6IFwiMjVweFwiLFxuICAgIH0sXG4gICAgXCIjc3RvcEljb24sICNwbGF5SWNvblwiOiB7XG4gICAgICB3aWR0aDogXCIzMHB4XCIsXG4gICAgICBoZWlnaHQ6IFwiMzBweFwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyBidXR0b24gLnRvb2x0aXB0ZXh0XCI6IHtcbiAgICAgIHJpZ2h0OiBcIjEyNSVcIixcbiAgICAgIGxlZnQ6IFwiYXV0b1wiLFxuICAgICAgYm94U2hhZG93OiBcIjBweCAwcHggMjRweCAwcHggdmFyKC0tY29sb3JCb3hTaGFkb3cpXCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiM3B4XCIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tY29sb3IxMilcIixcbiAgICAgIHdpZHRoOiBcIjk1cHhcIixcbiAgICAgIHZpc2liaWxpdHk6IFwiaGlkZGVuIWltcG9ydGFudFwiLFxuICAgIH0sXG4gICAgXCJAbWVkaWEgKGhvdmVyOiBob3ZlcikgYW5kIChwb2ludGVyOiBmaW5lKVwiOiB7XG4gICAgICBcIiN1aUZlYXR1cmVzIGJ1dHRvbjpob3ZlciAudG9vbHRpcHRleHRcIjoge1xuICAgICAgICB2aXNpYmlsaXR5OiBcInZpc2libGUhaW1wb3J0YW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgXCIjY29udHJvbHM+KlwiOiB7XG4gICAgICBtYXJnaW5Cb3R0b206IFwiMC41cmVtXCIsXG4gICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICBsaW5lSGVpZ2h0OiBcIjEuNzVyZW1cIixcbiAgICAgIHBhZGRpbmc6IFwiMC41cmVtXCIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tY29sb3IxMilcIixcbiAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgI3NldHRpbmdzSWNvbiwgI3VpRmVhdHVyZXMgI3N0YXRzSWNvblwiOiB7XG4gICAgICB3aWR0aDogXCIyN3B4XCIsXG4gICAgICBoZWlnaHQ6IFwiMjdweFwiLFxuICAgIH0sXG4gICAgXCIuc3ZnSWNvblwiOiB7XG4gICAgICBmaWxsOiBcInZhcigtLWNvbG9yMTMpXCIsXG4gICAgfSxcbiAgICBcIiN1aUZlYXR1cmVzIGJ1dHRvbjpob3ZlciAuc3ZnSWNvbiwgI3VpRmVhdHVyZXMgYnV0dG9uOmFjdGl2ZSAuc3ZnSWNvblwiOiB7XG4gICAgICBmaWxsOiBcInZhcigtLWNvbG9yMTIpXCIsXG4gICAgfSxcbiAgICBcIi50Z2wtc3dpdGNoIC50Z2wtc2xpZGVyLCAudGdsLWZsYXQ6Y2hlY2tlZCsudGdsLXNsaWRlclwiOiB7XG4gICAgICBib3JkZXI6IFwiM3B4IHNvbGlkIHRyYW5zcGFyZW50XCIsXG4gICAgfSxcbiAgICBcIi50Z2wtc3dpdGNoIC50Z2wtc2xpZGVyXCI6IHtcbiAgICAgIGJhY2tncm91bmQ6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIudGdsLXN3aXRjaCAudGdsLXNsaWRlcjo6YmVmb3JlXCI6IHtcbiAgICAgIGNvbnRlbnQ6IFwiJydcIixcbiAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tY29sb3I2KVwiLFxuICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgIGhlaWdodDogXCI1MCVcIixcbiAgICAgIHdpZHRoOiBcIjkwJVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiLFxuICAgICAgbWFyZ2luOiBcImF1dG9cIixcbiAgICAgIHRvcDogXCIwXCIsXG4gICAgICBib3R0b206IFwiMFwiLFxuICAgICAgbGVmdDogXCIwXCIsXG4gICAgICByaWdodDogXCIwXCIsXG4gICAgfSxcbiAgICBcIi50Z2wtc3dpdGNoIC50Z2wtc2xpZGVyOjphZnRlclwiOiB7XG4gICAgICBoZWlnaHQ6IFwiMTNweFwiLFxuICAgICAgd2lkdGg6IFwiMTNweFwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjUwJVwiLFxuICAgICAgdG9wOiBcIi0ycHhcIixcbiAgICAgIGxlZnQ6IFwiLTElXCIsXG4gICAgfSxcbiAgICBcIi50Z2wtZmxhdDpjaGVja2VkKy50Z2wtc2xpZGVyOmFmdGVyXCI6IHtcbiAgICAgIGxlZnQ6IFwiNjIlXCIsXG4gICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWNvbG9yMylcIixcbiAgICB9LFxuICAgIFwiLmZvcm0tY29udHJvbFwiOiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIGJvcmRlcjogXCIxcHggc29saWQgdmFyKC0tY29sb3IxMylcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIycHhcIixcbiAgICAgIGNvbG9yOiBcInZhcigtLWNvbG9yMTMpXCIsXG4gICAgICB0ZXh0QWxpZ246IFwibGVmdFwiLFxuICAgICAgZm9udEZhbWlseTogXCJpbmhlcml0XCIsXG4gICAgICBwYWRkaW5nOiBcIjVweCAxNXB4IFwiLFxuICAgIH0sXG4gICAgXCIuYnRuLWZsYXRcIjoge1xuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjMpXCIsXG4gICAgICBjb2xvcjogXCJ2YXIoLS1jb2xvcjEyKVwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIHBhZGRpbmc6IFwiN3B4IDUwcHhcIixcbiAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiNHB4XCIsXG4gICAgICB0ZXh0VHJhbnNmb3JtOiBcInVwcGVyY2FzZVwiLFxuICAgICAgbWluV2lkdGg6IFwiMTc1cHhcIixcbiAgICB9LFxuICAgIFwiLmJ0bi1mbGF0OmRpc2FibGVkXCI6IHtcbiAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tY29sb3I3KVwiLFxuICAgICAgYm9yZGVyQ29sb3I6IFwidmFyKC0tY29sb3IzKVwiLFxuICAgICAgY29sb3I6IFwidmFyKC0tY29sb3IzKVwiLFxuICAgICAgY3Vyc29yOiBcImRlZmF1bHRcIixcbiAgICB9LFxuICAgIFwiLmJ0bi1mbGF0OmZvY3VzXCI6IHtcbiAgICAgIG91dGxpbmU6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIuYXJjd2FyZS1sb2dvLWxvYWRlclwiOiB7XG4gICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgZGlzcGxheTogXCJibG9ja1wiLFxuICAgICAgd2lkdGg6IFwiMTIuNSVcIixcbiAgICAgIGhlaWdodDogXCIxMi41JVwiLFxuICAgIH0sXG4gICAgXCIjcGxheU92ZXJsYXkgaW1nI3BsYXlCdXR0b25cIjoge1xuICAgICAgd2lkdGg6IFwiNSVcIixcbiAgICB9LFxuICAgIFwiI2Rpc2Nvbm5lY3RPdmVybGF5LCAjZXJyb3JPdmVybGF5XCI6IHtcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgZm9udFNpemU6IFwiMjBweFwiLFxuICAgICAgbGluZUhlaWdodDogMi41LFxuICAgIH0sXG4gICAgXCIjZGlzY29ubmVjdE92ZXJsYXkgLmNsaWNrYWJsZVN0YXRlXCI6IHtcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgY29sb3I6IFwiI0RBRjY5M1wiLFxuICAgICAgcGFkZGluZzogXCI1cHhcIixcbiAgICAgIGZvbnRTaXplOiBcIjE4cHhcIixcbiAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI0RBRjY5M1wiLFxuICAgICAgbWFyZ2luOiBcIjI1cHggYXV0byAwXCIsXG4gICAgICB3aWR0aDogXCIxODBweFwiLFxuICAgIH0sXG4gICAgXCIjYWZrT3ZlcmxheVwiOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBcIm5vbmVcIixcbiAgICAgIHRyYW5zaXRpb246IFwiYWxsIGVhc2UtaW4tb3V0IDAuNXNcIixcbiAgICAgIG9wYWNpdHk6IDEsXG4gICAgICBwb2ludGVyRXZlbnRzOiBcImluaXRpYWxcIixcbiAgICB9LFxuICAgIFwiI2Fma092ZXJsYXlJbm5lclwiOiB7XG4gICAgICB0ZXh0VHJhbnNmb3JtOiBcImluaXRpYWxcIixcbiAgICAgIGJhY2tncm91bmQ6IFwiIzE4MTgxQVwiLFxuICAgICAgcGFkZGluZzogXCIyMHB4IDEwcHggMzBweFwiLFxuICAgICAgZm9udFNpemU6IFwiMThweFwiLFxuICAgICAgd2lkdGg6IFwiMzYwcHhcIixcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIGxpbmVIZWlnaHQ6IDIuNSxcbiAgICB9LFxuICAgIFwiI2Fma092ZXJsYXlJbm5lciBjZW50ZXI6OmZpcnN0LWxpbmVcIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJ1cHBlcmNhc2VcIixcbiAgICAgIGNvbG9yOiBcIiNGRjg0NjFcIixcbiAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuICAgICAgZm9udFNpemU6IFwiMjRweFwiLFxuICAgIH0sXG4gICAgXCIjYWZrT3ZlcmxheUlubmVyICNhZmtDb3VudERvd25OdW1iZXJcIjoge1xuICAgICAgY29sb3I6IFwiI0RBRjY5M1wiLFxuICAgICAgZm9udFNpemU6IFwiMjZweFwiLFxuICAgICAgbGluZUhlaWdodDogXCIyMnB4XCIsXG4gICAgfSxcbiAgICBcIiNhZmtPdmVybGF5SW5uZXIgY2VudGVyIC5yZXRyeS1idXR0b25cIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJpbml0aWFsXCIsXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICBjb2xvcjogXCIjREFGNjkzXCIsXG4gICAgICBwYWRkaW5nOiBcIjVweFwiLFxuICAgICAgZm9udFNpemU6IFwiMThweFwiLFxuICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjREFGNjkzXCIsXG4gICAgICBtYXJnaW46IFwiMjVweCBhdXRvIDBcIixcbiAgICAgIHdpZHRoOiBcIjE4MHB4XCIsXG4gICAgfSxcbiAgICBcIiNjb25uZWN0T3ZlcmxheSAjY29ubmVjdEJ1dHRvblwiOiB7XG4gICAgICB0ZXh0VHJhbnNmb3JtOiBcImluaXRpYWxcIixcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIGNvbG9yOiBcIiNEQUY2OTNcIixcbiAgICAgIHBhZGRpbmc6IFwiNXB4IDVweCA4cHhcIixcbiAgICAgIGZvbnRTaXplOiBcIjE4cHhcIixcbiAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI0RBRjY5M1wiLFxuICAgICAgbWFyZ2luOiBcIjI1cHggYXV0byAwXCIsXG4gICAgICB3aWR0aDogXCIxODBweFwiLFxuICAgIH0sXG5cbiAgICBcIiNjb25uZWN0T3ZlcmxheSAuY29ubmVjdGlvbi10ZXh0XCI6IHtcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgbWFyZ2luOiBcIjI1cHggYXV0byAwXCIsXG4gICAgfSxcbiAgICBcIiNjb25uZWN0T3ZlcmxheSAuY29ubmVjdGlvbi10ZXh0IC50aXRsZVwiOiB7XG4gICAgICBjb2xvcjogXCIjZmZmZmZmXCIsXG4gICAgICBmb250U2l6ZTogXCIxOHB4XCIsXG4gICAgICBtYXJnaW46IFwiNXB4IDBcIixcbiAgICB9LFxuICAgIFwiI2Nvbm5lY3RPdmVybGF5IC5jb25uZWN0aW9uLXRleHQgLnN1YnRpdGxlXCI6IHtcbiAgICAgIGNvbG9yOiBcIiNmZmZmZmZcIixcbiAgICAgIG9wYWNpdHk6IDAuNSxcbiAgICAgIGZvbnRTaXplOiBcIjEycHhcIixcbiAgICAgIG1hcmdpbjogXCIxMHB4IDBcIixcbiAgICB9LFxuICAgIFwiI2luZm9PdmVybGF5LmhpZGRlblN0YXRlXCI6IHtcbiAgICAgIGRpc3BsYXk6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIjZGlzY29ubmVjdE92ZXJsYXksICNwbGF5T3ZlcmxheSwgI2Vycm9yT3ZlcmxheSwgI21pY3JvcGhvbmVPdmVybGF5LCAjY29ubmVjdE92ZXJsYXlcIjoge1xuICAgICAgYmFja2dyb3VuZDogXCIjMTgxODFBXCIsXG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIHRyYW5zaXRpb246IFwiYWxsIGVhc2UtaW4tb3V0IDAuNXNcIixcbiAgICAgIG9wYWNpdHk6IDEsXG4gICAgICBwb2ludGVyRXZlbnRzOiBcImluaXRpYWxcIixcbiAgICB9LFxuICAgIFwiI21pY3JvcGhvbmVPdmVybGF5XCI6IHtcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgcGFkZGluZzogXCIyMHB4IDMwcHhcIixcbiAgICAgIGZvbnRTaXplOiBcIjE0cHhcIixcbiAgICAgIGhlaWdodDogXCIyMzBweFwiLFxuICAgICAgd2lkdGg6IFwiMzYwcHhcIixcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIGxpbmVIZWlnaHQ6IDEuMjUsXG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgbWFyZ2luOiBcImF1dG9cIixcbiAgICAgIHRvcDogXCIwXCIsXG4gICAgICBib3R0b206IFwiMFwiLFxuICAgICAgbGVmdDogXCIwXCIsXG4gICAgICByaWdodDogXCIwXCIsXG4gICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgekluZGV4OiA5OTk5OSxcbiAgICB9LFxuICAgIFwiI21pY3JvcGhvbmVPdmVybGF5IC50aXRsZVwiOiB7XG4gICAgICBmb250U2l6ZTogXCIyNHB4XCIsXG4gICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgbWFyZ2luQm90dG9tOiBcIjIwcHhcIixcbiAgICAgIGNvbG9yOiBcIiNGMEYwRjJcIixcbiAgICB9LFxuICAgIFwiI21pY3JvcGhvbmVPdmVybGF5IC50aXRsZTphZnRlclwiOiB7XG4gICAgICBjb250ZW50OiBcIicnXCIsXG4gICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgYW5pbWF0aW9uOiBcImRvdHR5IHN0ZXBzKDEsZW5kKSAxcyBpbmZpbml0ZVwiLFxuICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICB9LFxuICAgIFwiI21pY3JvcGhvbmVPdmVybGF5IHBcIjoge1xuICAgICAgbWFyZ2luOiAwLFxuICAgICAgY29sb3I6IFwiIzg1ODU4OFwiLFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXkgc3ZnXCI6IHtcbiAgICAgIGhlaWdodDogXCI2NXB4XCIsXG4gICAgICBtYXJnaW5Cb3R0b206IFwiMTVweFwiLFxuICAgICAgbWFyZ2luVG9wOiBcIi01cHhcIixcbiAgICB9LFxuICAgIFwiI21pY3JvcGhvbmVPdmVybGF5IC5zdmdJY29uXCI6IHtcbiAgICAgIGZpbGw6IFwiI0RBRjY5M1wiLFxuICAgIH0sXG4gICAgXCIjZGlzY29ubmVjdE92ZXJsYXkuaGlkZGVuU3RhdGUsICNwbGF5T3ZlcmxheS5oaWRkZW5TdGF0ZSwgI2Vycm9yT3ZlcmxheS5oaWRkZW5TdGF0ZSwgI2Fma092ZXJsYXkuaGlkZGVuU3RhdGUsICNtaWNyb3Bob25lT3ZlcmxheS5oaWRkZW5TdGF0ZVwiOlxuICAgICAge1xuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICAgIH0sXG4gICAgXCIjZGlzY29ubmVjdE92ZXJsYXkubWljLW92ZXJsYXktaXMtdmlzaWJsZSwgI2Vycm9yT3ZlcmxheS5taWMtb3ZlcmxheS1pcy12aXNpYmxlLCAjaW5mb092ZXJsYXkubWljLW92ZXJsYXktaXMtdmlzaWJsZVwiOlxuICAgICAge1xuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICAgIH0sXG4gICAgXCIjaW5mb092ZXJsYXkuaGlkZGVuU3RhdGUsICNjb25uZWN0T3ZlcmxheS5oaWRkZW5TdGF0ZVwiOiB7XG4gICAgICBkaXNwbGF5OiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiI2Nvbm5lY3RPdmVybGF5XCI6IHtcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW4tcmV2ZXJzZVwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgIH0sXG4gICAgXCIjaW5mb092ZXJsYXlcIjoge1xuICAgICAgZGlzcGxheTogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIi5sb3ZlLWxldHRlcnMtYm94LXJvb3RcIjoge1xuICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgIGNvbG9yOiBcIiNmZmZmZmZcIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICBiYWNrZ3JvdW5kOiBcIiMxODE4MUFcIixcbiAgICAgIHpJbmRleDogMSxcbiAgICB9LFxuICAgIFwiLmxvdmUtbGV0dGVycy1ib3gtcm9vdC5mYWRlLW91dFwiOiB7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgdHJhbnNpdGlvbjogXCJvcGFjaXR5IDAuNXNcIixcbiAgICB9LFxuICAgIFwiI2xldHRlcnMtYmxvY2tcIjoge1xuICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIG1hcmdpbjogXCJhdXRvXCIsXG4gICAgICBjb2xvcjogXCIjZmZmZmZmXCIsXG4gICAgICB6SW5kZXg6IDQsXG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICBmb250U2l6ZTogXCIxNnB4XCIsXG4gICAgICB0ZXh0VHJhbnNmb3JtOiBcImluaXRpYWxcIixcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICB9LFxuICAgIFwiI2xldHRlcnMtd3JhcHBlclwiOiB7XG4gICAgICBoZWlnaHQ6IFwiNzdweFwiLFxuICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImZsZXgtZW5kXCIsXG4gICAgICBtYXJnaW5Ub3A6IFwiMTBweFwiLFxuICAgICAgcGFkZGluZ0JvdHRvbTogXCIycHhcIixcbiAgICB9LFxuICAgIFwiI2xldHRlcnMtd3JhcHBlciBwXCI6IHtcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIGxpbmVIZWlnaHQ6IDEuMjUsXG4gICAgICBmb250U2l6ZTogXCIxNnB4XCIsXG4gICAgfSxcbiAgICBcIi5sZXR0ZXItYW5pbWF0aW9uOm50aC1sYXN0LW9mLXR5cGUoMSk6OmFmdGVyXCI6IHtcbiAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICBhbmltYXRpb246IFwiZG90dHkgc3RlcHMoMSxlbmQpIDFzIGluZmluaXRlXCIsXG4gICAgICBjb250ZW50OiBcIicnXCIsXG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIH0sXG4gICAgXCIubGV0dGVyLWFuaW1hdGlvblwiOiB7XG4gICAgICB0cmFuc2l0aW9uOiBcImFsbCAwLjVzIGVhc2UtaW4tb3V0XCIsXG4gICAgICB0cmFuc2Zvcm1PcmlnaW46IFwiYm90dG9tXCIsXG4gICAgICBtYXJnaW46IFwiMCBhdXRvXCIsXG4gICAgfSxcblxuICAgIFwiLmxldHRlci1hbmltYXRpb24tZW50ZXJcIjoge1xuICAgICAgYW5pbWF0aW9uOiBcImZhZGVJblVwIDAuNzVzIGVhc2Utb3V0XCIsXG4gICAgfSxcbiAgICBcIi5sZXR0ZXItYW5pbWF0aW9uLWV4aXRcIjoge1xuICAgICAgb3BhY2l0eTogMCxcbiAgICAgIHNjYWxlOiAwLjksXG4gICAgICB0cmFuc2l0aW9uOiBcImFsbCBlYXNlLWluLW91dCAxc1wiLFxuICAgICAgbWFyZ2luOiAwLFxuICAgIH0sXG4gICAgXCJAa2V5ZnJhbWVzIGRvdHR5XCI6IHtcbiAgICAgIFwiMCVcIjogeyBjb250ZW50OiBcIicnXCIgfSxcbiAgICAgIFwiMjUlXCI6IHsgY29udGVudDogXCInLidcIiB9LFxuICAgICAgXCI1MCVcIjogeyBjb250ZW50OiBcIicuLidcIiB9LFxuICAgICAgXCI3NSVcIjogeyBjb250ZW50OiBcIicuLi4nXCIgfSxcbiAgICAgIFwiMTAwJVwiOiB7IGNvbnRlbnQ6IFwiJydcIiB9LFxuICAgIH0sXG4gICAgXCJAa2V5ZnJhbWVzIGZhZGVJblVwXCI6IHtcbiAgICAgIGZyb206IHtcbiAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgdHJhbnNmb3JtOiBcIiB0cmFuc2xhdGVZKDVweClcIixcbiAgICAgICAgc2NhbGU6IDAuOSxcbiAgICAgIH0sXG4gICAgICB0bzoge1xuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWSgwKVwiLFxuICAgICAgICBzY2FsZTogMSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcIi5oaWRkZW5cIjoge1xuICAgICAgZGlzcGxheTogXCJub25lXCIsXG4gICAgICBvcGFjaXR5OiAwLFxuICAgIH0sXG4gICAgXCIudmlzaWJsZVwiOiB7XG4gICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICBvcGFjaXR5OiAxLFxuICAgICAgdHJhbnNpdGlvbjogXCJvcGFjaXR5IDFzIGVhc2Utb3V0XCIsXG4gICAgfSxcbiAgfSxcbn07XG4iLCJleHBvcnQgY2xhc3MgQXJjd2FyZUxvZ29Mb2FkZXIge1xuICBwdWJsaWMgYXJjd2FyZUxvZ29Mb2FkZXI6IEhUTUxEaXZFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYXJjd2FyZUxvZ29Mb2FkZXIgPSB0aGlzLmNyZWF0ZUFyY3dhcmVMb2dvTG9hZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUFyY3dhcmVMb2dvTG9hZGVyKCk6IEhUTUxEaXZFbGVtZW50IHtcbiAgICBjb25zdCBhcmN3YXJlTG9nb0xvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgYXJjd2FyZUxvZ29Mb2FkZXIuY2xhc3NMaXN0LmFkZChcImFyY3dhcmUtbG9nby1sb2FkZXJcIik7XG4gICAgYXJjd2FyZUxvZ29Mb2FkZXIuaW5uZXJIVE1MID0gdGhpcy5nZXRTdmcoKTtcbiAgICByZXR1cm4gYXJjd2FyZUxvZ29Mb2FkZXI7XG4gIH1cblxuICBwcml2YXRlIGdldFN2ZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXG4gICAgICA8c3ZnIHdpZHRoPVwiNDJcIiBoZWlnaHQ9XCI4MFwiIHZpZXdCb3g9XCIwIDAgNDIgODBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxzdHlsZT5cbiAgICAgICAgICBAa2V5ZnJhbWVzIHJpcHBsZS0xLWRvd24ge1xuICAgICAgICAgICAgMCUsIDUwJSB7IHRyYW5zbGF0ZTogMCAwOyB9XG4gICAgICAgICAgICA2MCUsIDEwMCUgeyB0cmFuc2xhdGU6IDAgNXB4OyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBrZXlmcmFtZXMgcmlwcGxlLTEtdXAge1xuICAgICAgICAgICAgMCUsIDUwJSB7IHRyYW5zbGF0ZTogMCAwOyB9XG4gICAgICAgICAgICA2MCUsIDEwMCUgeyB0cmFuc2xhdGU6IDAgLTVweDsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBAa2V5ZnJhbWVzIHJpcHBsZS0yLWRvd24ge1xuICAgICAgICAgICAgMCUsIDU1JSB7IHRyYW5zbGF0ZTogMCAwOyB9XG4gICAgICAgICAgICA2NSUsIDEwMCUgeyB0cmFuc2xhdGU6IDAgNXB4OyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBrZXlmcmFtZXMgcmlwcGxlLTMtZG93biB7XG4gICAgICAgICAgICAwJSwgNjAlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDcwJSwgMTAwJSB7IHRyYW5zbGF0ZTogMCA1cHg7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGtleWZyYW1lcyByaXBwbGUtMy11cCB7XG4gICAgICAgICAgICAwJSwgNjAlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDcwJSwgMTAwJSB7IHRyYW5zbGF0ZTogMCAtNXB4OyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBrZXlmcmFtZXMgcmlwcGxlLTQtdXAge1xuICAgICAgICAgICAgMCUsIDY1JSB7IHRyYW5zbGF0ZTogMCAwOyB9XG4gICAgICAgICAgICA3NSUsIDEwMCUgeyB0cmFuc2xhdGU6IDAgLTVweDsgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC5yaXBwbGUtMS1kb3duIHsgYW5pbWF0aW9uOiByaXBwbGUtMS1kb3duIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlOyB9XG4gICAgICAgICAgLnJpcHBsZS0xLXVwICAgeyBhbmltYXRpb246IHJpcHBsZS0xLXVwIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlOyB9XG4gICAgICAgICAgLnJpcHBsZS0yLWRvd24geyBhbmltYXRpb246IHJpcHBsZS0yLWRvd24gMC42cyBpbmZpbml0ZSBhbHRlcm5hdGU7IH1cbiAgICAgICAgICAucmlwcGxlLTMtZG93biB7IGFuaW1hdGlvbjogcmlwcGxlLTMtZG93biAwLjZzIGluZmluaXRlIGFsdGVybmF0ZTsgfVxuICAgICAgICAgIC5yaXBwbGUtMy11cCAgIHsgYW5pbWF0aW9uOiByaXBwbGUtMy11cCAwLjZzIGluZmluaXRlIGFsdGVybmF0ZTsgfVxuICAgICAgICAgIC5yaXBwbGUtNC11cCAgIHsgYW5pbWF0aW9uOiByaXBwbGUtNC11cCAwLjZzIGluZmluaXRlIGFsdGVybmF0ZTsgfVxuICAgICAgICA8L3N0eWxlPlxuXG4gICAgICAgIDxnIGNsYXNzPVwicmlwcGxlLTEtZG93blwiIGZpbGw9XCIjZjFmMWYxXCI+XG4gICAgICAgICAgPHJlY3QgeT1cIjM4XCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiMjJcIiAvPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnIGNsYXNzPVwicmlwcGxlLTEtdXBcIiBmaWxsPVwiI2YxZjFmMVwiPlxuICAgICAgICAgIDxyZWN0IHk9XCIxMFwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjIyXCIgLz5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyBjbGFzcz1cInJpcHBsZS0yLWRvd25cIiBmaWxsPVwiI2YxZjFmMVwiPlxuICAgICAgICAgIDxyZWN0IHg9XCIxMlwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjMyXCIgLz5cbiAgICAgICAgICA8cmVjdCB4PVwiMTJcIiB5PVwiMzhcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCIyMlwiIC8+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgY2xhc3M9XCJyaXBwbGUtMy1kb3duXCIgZmlsbD1cIiNmMWYxZjFcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiMjRcIiB5PVwiMzhcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCIyMlwiIC8+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgY2xhc3M9XCJyaXBwbGUtMy11cFwiIGZpbGw9XCIjZjFmMWYxXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjI0XCIgeT1cIjEwXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiMjJcIiAvPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnIGNsYXNzPVwicmlwcGxlLTQtdXBcIiBmaWxsPVwiI2YxZjFmMVwiPlxuICAgICAgICAgIDxyZWN0IHg9XCIzNlwiIHk9XCIxMFwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjIyXCIgLz5cbiAgICAgICAgICA8cmVjdCB4PVwiMzZcIiB5PVwiMzhcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCIzMlwiIC8+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPlxuICAgIGA7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBBdWRpb0ljb24ge1xuICBwdWJsaWMgYXVkaW9JY29uVW5tdXRlZDogU1ZHRWxlbWVudDtcbiAgcHVibGljIGF1ZGlvSWNvbk11dGVkOiBTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYXVkaW9JY29uVW5tdXRlZCA9IHRoaXMuY3JlYXRlQXVkaW9JY29uVW5tdXRlZCgpO1xuICAgIHRoaXMuYXVkaW9JY29uTXV0ZWQgPSB0aGlzLmNyZWF0ZUF1ZGlvSWNvbk11dGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUF1ZGlvSWNvblVubXV0ZWQoKTogU1ZHRWxlbWVudCB7XG4gICAgY29uc3QgYXVkaW9JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgXCJhdWRpb0ljb25Vbm11dGVkXCIpO1xuICAgIGF1ZGlvSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIzMXB4XCIpO1xuICAgIGF1ZGlvSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIyOHB4XCIpO1xuICAgIGF1ZGlvSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInZpZXdCb3hcIiwgXCIwIDAgMzEgMjhcIik7XG5cbiAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgICBzdmdHcm91cD8uY2xhc3NMaXN0Py5hZGQoXCJzdmdJY29uXCIpO1xuICAgIGF1ZGlvSWNvbi5hcHBlbmRDaGlsZChzdmdHcm91cCk7XG5cbiAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgIG51bGwsXG4gICAgICBcImRcIixcbiAgICAgIFwiTTIxLjAwMDgsMC4wNzIwMzE4QzIwLjU1NiwtMC4xMTc4MTEsMjAuMDM3OSwwLjA4MDU1NjksMTkuODQzNSwwLjUxNDgyN0MxOS42NDkyLDAuOTQ5MDk4LDE5Ljg1MjIsMS40NTUxMiwyMC4yOTcsMS42NDQ5QzI1LjEyMzMsMy43MDQzNCwyOC4yNDIsOC4zNTc2MSwyOC4yNDIyLDEzLjQ5OThDMjguMjQyMiwxOC42NDIzLDI1LjEyMzQsMjMuMjk1NywyMC4yOTY2LDI1LjM1NTFDMTkuODUxOCwyNS41NDQ4LDE5LjY0ODgsMjYuMDUwOCwxOS44NDMxLDI2LjQ4NTJDMTkuOTg3NCwyNi44MDc3LDIwLjMxMDIsMjcsMjAuNjQ5LDI3QzIwLjc2NjQsMjcsMjAuODg1OSwyNi45NzY5LDIxLjAwMDQsMjYuOTI4QzI2LjQ2NzQsMjQuNTk1NCwzMCwxOS4zMjQ2LDMwLDEzLjQ5OTdDMjkuOTk5OCw3LjY3NTMxLDI2LjQ2NzQsMi40MDQ2MiwyMS4wMDA4LDAuMDcyMDMxOFpcIlxuICAgICk7XG5cbiAgICBjb25zdCBwYXRoMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBwYXRoMi5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgIG51bGwsXG4gICAgICBcImRcIixcbiAgICAgIFwiTTIxLjIzNTEsNi42OTQzNEMyMC44NzM1LDYuMzc4MjIsMjAuMzE3OSw2LjQwODIsMTkuOTk0MSw2Ljc2MTM0QzE5LjY3MDMsNy4xMTQ1NCwxOS43MDEsNy42NTcwNiwyMC4wNjI3LDcuOTczMjRDMjEuNjcxMiw5LjM3OTMyLDIyLjU5MzcsMTEuMzkzNywyMi41OTM3LDEzLjVDMjIuNTkzNywxNS42MDYyLDIxLjY3MTEsMTcuNjIwNiwyMC4wNjI3LDE5LjAyNjdDMTkuNzAxLDE5LjM0MjgsMTkuNjcwMywxOS44ODU0LDE5Ljk5NDEsMjAuMjM4NkMyMC4xNjc3LDIwLjQyNzksMjAuNDA3OSwyMC41MjQ0LDIwLjY0OTIsMjAuNTI0NEMyMC44NTc5LDIwLjUyNDQsMjEuMDY3NCwyMC40NTIyLDIxLjIzNTEsMjAuMzA1NkMyMy4yMTU3LDE4LjU3NDQsMjQuMzUxNSwxNi4wOTM3LDI0LjM1MTUsMTMuNDk5OUMyNC4zNTE1LDEwLjkwNjEsMjMuMjE1Niw4LjQyNTUzLDIxLjIzNTEsNi42OTQzNFpcIlxuICAgICk7XG5cbiAgICBjb25zdCBwYXRoMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBwYXRoMy5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgIG51bGwsXG4gICAgICBcImRcIixcbiAgICAgIFwiTTE1LjM5NzMsMi4xNjI3N0MxNS4xMDE4LDIuMDE2NTgsMTQuNzQ3MywyLjA0NTAyLDE0LjQ4MDMsMi4yMzYyM0w3LjY1MTc2LDcuMTI1OThIMC44Nzg5MDZDMC4zOTM1MTYsNy4xMjU5OCwwLDcuNTEwMjQsMCw3Ljk4NDIyVjE5LjAxNTVDMCwxOS40ODk1LDAuMzkzNTE2LDE5Ljg3MzgsMC44Nzg5MDYsMTkuODczOEg3LjY1MTdMMTQuNDgwMiwyNC43NjM3QzE0LjYzMzksMjQuODczNywxNC44MTY0LDI0LjkyOTgsMTUuMDAwMSwyNC45Mjk4QzE1LjEzNTYsMjQuOTI5OCwxNS4yNzE4LDI0Ljg5OTIsMTUuMzk3MywyNC44MzcxQzE1LjY5MjcsMjQuNjkwOSwxNS44Nzg5LDI0LjM5NSwxNS44Nzg5LDI0LjA3MTZWMi45MjgyQzE1Ljg3ODksMi42MDQ4MiwxNS42OTI3LDIuMzA4ODQsMTUuMzk3MywyLjE2Mjc3Wk0xNC4xMjEsMjIuMzc3OEw4LjQ1OTE4LDE4LjMyMzRDOC4zMDg0MiwxOC4yMTU0LDguMTI2MzcsMTguMTU3Miw3LjkzOTM5LDE4LjE1NzJIMS43NTc4MVY4Ljg0MjQ2SDcuOTM5MzlDOC4xMjYzMSw4Ljg0MjQ2LDguMzA4NDIsOC43ODQyMiw4LjQ1OTEyLDguNjc2MzZMMTQuMTIxLDQuNjIxOTdWMjIuMzc3OFpcIlxuICAgICk7XG5cbiAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMSk7XG4gICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDIpO1xuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgzKTtcblxuICAgIHJldHVybiBhdWRpb0ljb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUF1ZGlvSWNvbk11dGVkKCk6IFNWR0VsZW1lbnQge1xuICAgIGNvbnN0IGF1ZGlvSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xuICAgIGF1ZGlvSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIFwiYXVkaW9JY29uTXV0ZWRcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjMxcHhcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjI4cHhcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidmlld0JveFwiLCBcIjAgLTEgMzEgMjhcIik7XG5cbiAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgICBzdmdHcm91cC5jbGFzc0xpc3Q/LmFkZChcInN2Z0ljb25cIik7XG4gICAgYXVkaW9JY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcblxuICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgxLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMTYuMzUwMSwwLjgyOTI4NkMxNi4wNDYsMC42Nzg3OTksMTUuNjgxMSwwLjcwODA3MiwxNS40MDYyLDAuOTA0OTEyTDguMzc2ODEsNS45Mzg0OEgxLjQwNDc2QzAuOTA1MDksNS45Mzg0OCwwLjUsNi4zMzQwNCwwLjUsNi44MjE5NlYxOC4xNzc3QzAuNSwxOC42NjU3LDAuOTA1MDksMTkuMDYxMiwxLjQwNDc2LDE5LjA2MTJIOC4zNzY3NUwxNS40MDYxLDI0LjA5NDlDMTUuNTY0MywyNC4yMDgyLDE1Ljc1MjIsMjQuMjY1OSwxNS45NDEyLDI0LjI2NTlDMTYuMDgwOCwyNC4yNjU5LDE2LjIyMSwyNC4yMzQ0LDE2LjM1MDEsMjQuMTcwNUMxNi42NTQyLDI0LjAyLDE2Ljg0NTksMjMuNzE1NCwxNi44NDU5LDIzLjM4MjVWMS42MTcyNEMxNi44NDU5LDEuMjg0MzQsMTYuNjU0MiwwLjk3OTY1NSwxNi4zNTAxLDAuODI5Mjg2Wk0xNS4wMzY0LDIxLjYzODlMOS4yMDc5OCwxNy40NjUyQzkuMDUyNzgsMTcuMzU0MSw4Ljg2NTM4LDE3LjI5NDIsOC42NzI5LDE3LjI5NDJIMi4zMDk1MVY3LjcwNTQ0SDguNjcyOUM4Ljg2NTMyLDcuNzA1NDQsOS4wNTI3OCw3LjY0NTQ4LDkuMjA3OTIsNy41MzQ0NkwxNS4wMzY0LDMuMzYwODJWMjEuNjM4OVpcIlxuICAgICk7XG5cbiAgICBjb25zdCBwYXRoMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBwYXRoMi5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgIG51bGwsXG4gICAgICBcImRcIixcbiAgICAgIFwiTTI1LjI3OTksMTEuNzYzNEwyMS44NDQyLDguMzI3NDhDMjEuNjIwNiw4LjEwMzk5LDIxLjYyMDYsNy43NDI2NCwyMS44NDQyLDcuNTE5MTVDMjIuMDY3Niw3LjI5NTY2LDIyLjQyOSw3LjI5NTY2LDIyLjY1MjUsNy41MTkxNUwyNi4wODgzLDEwLjk1NUwyOS41MjQsNy41MTkxNUMyOS43NDc2LDcuMjk1NjYsMzAuMTA4OCw3LjI5NTY2LDMwLjMzMjMsNy41MTkxNUMzMC41NTU5LDcuNzQyNjQsMzAuNTU1OSw4LjEwMzk5LDMwLjMzMjMsOC4zMjc0OEwyNi44OTY2LDExLjc2MzRMMzAuMzMyMywxNS4xOTkyQzMwLjU1NTksMTUuNDIyNywzMC41NTU5LDE1Ljc4NDEsMzAuMzMyMywxNi4wMDc2QzMwLjIyMDksMTYuMTE5MSwzMC4wNzQ1LDE2LjE3NTEsMjkuOTI4MSwxNi4xNzUxQzI5Ljc4MTgsMTYuMTc1MSwyOS42MzU1LDE2LjExOTEsMjkuNTI0LDE2LjAwNzZMMjYuMDg4MywxMi41NzE3TDIyLjY1MjUsMTYuMDA3NkMyMi41NDEsMTYuMTE5MSwyMi4zOTQ3LDE2LjE3NTEsMjIuMjQ4MywxNi4xNzUxQzIyLjEwMiwxNi4xNzUxLDIxLjk1NTYsMTYuMTE5MSwyMS44NDQyLDE2LjAwNzZDMjEuNjIwNiwxNS43ODQxLDIxLjYyMDYsMTUuNDIyNywyMS44NDQyLDE1LjE5OTJMMjUuMjc5OSwxMS43NjM0WlwiXG4gICAgKTtcblxuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcbiAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMik7XG5cbiAgICByZXR1cm4gYXVkaW9JY29uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSBmcm9tIFwiLi4vLi4vQXJjd2FyZVBpeGVsU3RyZWFtaW5nXCI7XG5pbXBvcnQgeyBBdWRpb0ljb24gfSBmcm9tIFwiLi9BdWRpb0ljb25cIjtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvQnV0dG9uIHtcbiAgcHJpdmF0ZSBidXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICBwcml2YXRlIHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nO1xuICBwcml2YXRlIGF1ZGlvSWNvbjogQXVkaW9JY29uO1xuICBwcml2YXRlIHRvb2x0aXBUZXh0OiBIVE1MRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihzdHJlYW06IEFyY3dhcmVQaXhlbFN0cmVhbWluZykge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuc2V0QXVkaW9NdXRlZEJ5RGVmYXVsdCgpO1xuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5jcmVhdGVCdXR0b24oKTtcbiAgICB0aGlzLmF1ZGlvSWNvbiA9IG5ldyBBdWRpb0ljb24oKTtcbiAgICB0aGlzLnRvb2x0aXBUZXh0ID0gdGhpcy5jcmVhdGVUb29sdGlwVGV4dCgpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcFRleHQpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvbk11dGVkKTtcbiAgICB0aGlzLmJ1dHRvbi5hcHBlbmRDaGlsZCh0aGlzLmF1ZGlvSWNvbi5hdWRpb0ljb25Vbm11dGVkKTtcbiAgICB0aGlzLmF1ZGlvSWNvbi5hdWRpb0ljb25Vbm11dGVkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB0aGlzLmJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy50b2dnbGVBdWRpby5iaW5kKHRoaXMpKTtcblxuICAgIC8vIEJpbmQgdGhlIG9uVm9sdW1lQ2hhbmdlIG1ldGhvZCB0byB0aGUgY3VycmVudCBpbnN0YW5jZVxuICAgIHRoaXMub25Wb2x1bWVDaGFuZ2UgPSB0aGlzLm9uVm9sdW1lQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB0aGlzLnN0cmVhbVtcIndlYlJ0Y0NvbnRyb2xsZXJcIl0udmlkZW9QbGF5ZXJbXCJ2aWRlb0VsZW1lbnRcIl07XG4gICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2b2x1bWVjaGFuZ2VcIiwgdGhpcy5vblZvbHVtZUNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QXVkaW9NdXRlZEJ5RGVmYXVsdCgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgaWYgKHZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdmlkZW9FbGVtZW50UGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCJ2aWRlb1wiKTtcbiAgICAgIGlmICh2aWRlb0VsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0udG9nZ2xlQXVkaW8odmlkZW9FbGVtZW50LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJ1dHRvbigpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICBidXR0b24/LnNldEF0dHJpYnV0ZShcImlkXCIsIFwiYXVkaW9CdG5cIik7XG4gICAgYnV0dG9uPy5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbj8uY2xhc3NMaXN0Py5hZGQoXCJVaVRvb2xcIik7XG4gICAgcmV0dXJuIGJ1dHRvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVG9vbHRpcFRleHQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgdG9vbHRpcFRleHQ/LmNsYXNzTGlzdD8uYWRkKFwidG9vbHRpcHRleHRcIik7XG4gICAgdG9vbHRpcFRleHQuaW5uZXJIVE1MID0gXCJNdXRlL1VubXV0ZVwiO1xuICAgIHJldHVybiB0b29sdGlwVGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgdG9nZ2xlQXVkaW8oKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy5zdHJlYW0udmlkZW9FbGVtZW50UGFyZW50O1xuICAgIGlmICh2aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHZpZGVvRWxlbWVudFBhcmVudC5xdWVyeVNlbGVjdG9yKFwidmlkZW9cIik7XG4gICAgICBpZiAodmlkZW9FbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IG11dGVkID0gIXZpZGVvRWxlbWVudC5tdXRlZDtcbiAgICAgICAgdGhpcy5zdHJlYW0udG9nZ2xlQXVkaW8odmlkZW9FbGVtZW50LCBtdXRlZCk7XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9JY29uKG11dGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUF1ZGlvSWNvbihtdXRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChtdXRlZCkge1xuICAgICAgdGhpcy5hdWRpb0ljb24uYXVkaW9JY29uVW5tdXRlZC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB0aGlzLmF1ZGlvSWNvbi5hdWRpb0ljb25NdXRlZC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF1ZGlvSWNvbi5hdWRpb0ljb25NdXRlZC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB0aGlzLmF1ZGlvSWNvbi5hdWRpb0ljb25Vbm11dGVkLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBlbGVtZW50KCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5idXR0b247XG4gIH1cblxuICBwcml2YXRlIG9uVm9sdW1lQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MTWVkaWFFbGVtZW50O1xuICAgIHRoaXMudXBkYXRlQXVkaW9JY29uKHZpZGVvRWxlbWVudC5tdXRlZCk7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBMb3ZlTGV0dGVycyB7XG4gIGxvdmVMZXR0ZXJzUm9vdDogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubG92ZUxldHRlcnNSb290ID0gbnVsbDtcbiAgfVxuXG4gIGFkZExldHRlcihsZXR0ZXI6IHN0cmluZywgbGlzdExlbmd0aDogbnVtYmVyKSB7XG4gICAgY29uc3QgbGV0dGVyc0Jsb2NrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNsZXR0ZXJzLXdyYXBwZXJcIik7XG5cbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgcC50ZXh0Q29udGVudCA9IGxldHRlcjtcbiAgICBwPy5jbGFzc0xpc3Q/LmFkZChcImxldHRlci1hbmltYXRpb25cIiwgXCJsZXR0ZXItYW5pbWF0aW9uLWVudGVyXCIpO1xuXG4gICAgaWYgKGxldHRlcnNCbG9jaykge1xuICAgICAgbGV0dGVyc0Jsb2NrLmFwcGVuZENoaWxkKHApO1xuICAgICAgdGhpcy51cGRhdGVPcGFjaXR5KGxpc3RMZW5ndGgpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcD8uY2xhc3NMaXN0Py5yZW1vdmUoXCJsZXR0ZXItYW5pbWF0aW9uLWVudGVyXCIpO1xuICAgICAgcD8uYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lZFwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlT3BhY2l0eShsaXN0TGVuZ3RoKTtcbiAgICAgIH0pO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgdXBkYXRlT3BhY2l0eShsaXN0TGVuZ3RoOiBudW1iZXIpIHtcbiAgICBjb25zdCBsZXR0ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIiNsZXR0ZXJzLWJsb2NrIHBcIik7XG4gICAgY29uc3QgbWF4T3BhY2l0eSA9IDAuNjtcbiAgICBjb25zdCBtaW5PcGFjaXR5ID0gMDtcbiAgICBjb25zdCBtdWx0aXBseUNvZWZpY2llbnQgPSAxLjIgLyBsZXR0ZXJzLmxlbmd0aDtcblxuICAgIGxldHRlcnMuZm9yRWFjaCgobGV0dGVyLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaHRtbExldHRlciA9IGxldHRlciBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IHJldmVyc2VJbmRleCA9IGxldHRlcnMubGVuZ3RoIC0gMSAtIGluZGV4O1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IG1heE9wYWNpdHkgLSByZXZlcnNlSW5kZXggKiBtdWx0aXBseUNvZWZpY2llbnQgKiAobWF4T3BhY2l0eSAtIG1pbk9wYWNpdHkpO1xuICAgICAgaWYgKGxpc3RMZW5ndGggIT09IGluZGV4ICsgMSkge1xuICAgICAgICBodG1sTGV0dGVyLnN0eWxlLm9wYWNpdHkgPSBNYXRoLm1heChtaW5PcGFjaXR5LCBvcGFjaXR5KS50b1N0cmluZygpO1xuICAgICAgICBodG1sTGV0dGVyPy5jbGFzc0xpc3Q/LmFkZChcImxldHRlci1hbmltYXRpb24tZXhpdFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWxMZXR0ZXIuc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBGbGFncyB9IGZyb20gXCJAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41XCI7XG5pbXBvcnQgeyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSBmcm9tIFwiLi4vLi4vQXJjd2FyZVBpeGVsU3RyZWFtaW5nXCI7XG5pbXBvcnQgeyBNaWNJY29uIH0gZnJvbSBcIi4uL01pY0ljb25cIjtcblxuZXhwb3J0IGNsYXNzIE1pY0J1dHRvbiB7XG4gIHByaXZhdGUgYnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgcHJpdmF0ZSBzdHJlYW06IEFyY3dhcmVQaXhlbFN0cmVhbWluZztcbiAgcHJpdmF0ZSBtaWNJY29uOiBNaWNJY29uO1xuICBwcml2YXRlIHRvb2x0aXBUZXh0OiBIVE1MRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihzdHJlYW06IEFyY3dhcmVQaXhlbFN0cmVhbWluZykge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuc2V0TWljTXV0ZWRCeURlZmF1bHQoKTtcbiAgICB0aGlzLmJ1dHRvbiA9IHRoaXMuY3JlYXRlQnV0dG9uKCk7XG4gICAgdGhpcy5taWNJY29uID0gbmV3IE1pY0ljb24oKTtcbiAgICB0aGlzLnRvb2x0aXBUZXh0ID0gdGhpcy5jcmVhdGVUb29sdGlwVGV4dCgpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcFRleHQpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMubWljSWNvbi5taWNJY29uTXV0ZWQpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMubWljSWNvbi5taWNJY29uVW5tdXRlZCk7XG4gICAgdGhpcy5taWNJY29uLm1pY0ljb25Vbm11dGVkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB0aGlzLmJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy50b2dnbGVNaWMuYmluZCh0aGlzKSk7XG4gIH1cblxuICBwcml2YXRlIHNldE1pY011dGVkQnlEZWZhdWx0KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudDtcbiAgICBpZiAodmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB2aWRlb0VsZW1lbnRQYXJlbnQucXVlcnlTZWxlY3RvcihcInZpZGVvXCIpO1xuICAgICAgaWYgKHZpZGVvRWxlbWVudCkge1xuICAgICAgICB0aGlzLnN0cmVhbS50b2dnbGVNaWMoZmFsc2UsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnV0dG9uKCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcIm1pY0J0blwiKTtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICBidXR0b24/LmNsYXNzTGlzdD8uYWRkKFwiVWlUb29sXCIpO1xuICAgIHJldHVybiBidXR0b247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRvb2x0aXBUZXh0KCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCB0b29sdGlwVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIHRvb2x0aXBUZXh0Py5jbGFzc0xpc3Q/LmFkZChcInRvb2x0aXB0ZXh0XCIpO1xuICAgIHRvb2x0aXBUZXh0LmlubmVySFRNTCA9IFwiTWljIG9uL29mZlwiO1xuICAgIHJldHVybiB0b29sdGlwVGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgdG9nZ2xlTWljKCk6IHZvaWQge1xuICAgIGNvbnN0IG1pY0ZsYWcgPSB0aGlzPy5zdHJlYW0/LmNvbmZpZz8uaXNGbGFnRW5hYmxlZChGbGFncy5Vc2VNaWMpO1xuICAgIHRoaXMuc3RyZWFtLnRvZ2dsZU1pYyghbWljRmxhZywgZmFsc2UpO1xuICAgIHRoaXMudXBkYXRlTWljSWNvbighbWljRmxhZyk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1pY0ljb24obWljQWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFtaWNBY3RpdmUpIHtcbiAgICAgIHRoaXMubWljSWNvbi5taWNJY29uVW5tdXRlZC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB0aGlzLm1pY0ljb24ubWljSWNvbk11dGVkLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWljSWNvbi5taWNJY29uTXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgdGhpcy5taWNJY29uLm1pY0ljb25Vbm11dGVkLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBlbGVtZW50KCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5idXR0b247XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBNaWNJY29uIHtcbiAgcHVibGljIG1pY0ljb25Vbm11dGVkOiBTVkdFbGVtZW50O1xuICBwdWJsaWMgbWljSWNvbk11dGVkOiBTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubWljSWNvblVubXV0ZWQgPSB0aGlzLmNyZWF0ZU1pY0ljb25Vbm11dGVkKCk7XG4gICAgdGhpcy5taWNJY29uTXV0ZWQgPSB0aGlzLmNyZWF0ZU1pY0ljb25NdXRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaWNJY29uVW5tdXRlZCgpOiBTVkdFbGVtZW50IHtcbiAgICBjb25zdCBtaWNJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgbWljSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIFwibWljSWNvblVubXV0ZWRcIik7XG4gICAgbWljSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIyNHB4XCIpO1xuICAgIG1pY0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMjRweFwiKTtcbiAgICBtaWNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidmlld0JveFwiLCBcIjAgLTEgMjQgMjRcIik7XG5cbiAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgICBzdmdHcm91cD8uY2xhc3NMaXN0Py5hZGQoXCJzdmdJY29uXCIpO1xuICAgIG1pY0ljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuXG4gICAgY29uc3QgcGF0aDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG4gICAgcGF0aDEuc2V0QXR0cmlidXRlTlMoXG4gICAgICBudWxsLFxuICAgICAgXCJkXCIsXG4gICAgICBcIk0xMiAxNGMxLjY2LDAsMi45OS0xLjM0LDIuOTktM0wxNSw1YzAtMS42Ni0xLjM0LTMtMy0zUzksMy4zNCw5LDV2NmMwLDEuNjYsMS4zNCwzLDMsM3ptNS4zLTNjMCwzLTIuNTQsNS4xLTUuMyw1LjFTNi43LDE0LDYuNywxMUg1YzAsMy40MSwyLjcyLDYuMjMsNiw2LjcyVjIxaDJ2LTMuMjhjMy4yOC0uNDgsNi0zLjMsNi02LjcyaC0xLjd6XCJcbiAgICApO1xuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcblxuICAgIHJldHVybiBtaWNJY29uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaWNJY29uTXV0ZWQoKTogU1ZHRWxlbWVudCB7XG4gICAgY29uc3QgbWljSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xuICAgIG1pY0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBcIm1pY0ljb25NdXRlZFwiKTtcbiAgICBtaWNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjI0cHhcIik7XG4gICAgbWljSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIyNHB4XCIpO1xuICAgIG1pY0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ2aWV3Qm94XCIsIFwiMCAtMSAyNCAyNFwiKTtcblxuICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgIHN2Z0dyb3VwPy5jbGFzc0xpc3Q/LmFkZChcInN2Z0ljb25cIik7XG4gICAgbWljSWNvbi5hcHBlbmRDaGlsZChzdmdHcm91cCk7XG5cbiAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgIG51bGwsXG4gICAgICBcImRcIixcbiAgICAgIFwiTTE5LDExaC0xLjdjMCwuNzQtLjE2LDEuNDMtLjQzLDIuMDVsMS4yMywxLjIzYy41Ni0uOTguOS0yLjA5LjktMy4yOHptLTQuMDIuMTdjMC0uMDYuMDItLjExLjAyLS4xN1Y1YzAtMS42Ni0xLjM0LTMtMy0zUzksMy4zNCw5LDV2LjE4bDUuOTgsNS45OXpNNC4yNywzLDMsNC4yN2w2LjAxLDYuMDFWMTFjMCwxLjY2LDEuMzMsMywyLjk5LDMsLjIyLDAsLjQ0LS4wMy42NS0uMDhsMS42NiwxLjY2Yy0uNzEuMzMtMS41LjUyLTIuMzEuNTItMi43NiwwLTUuMy0yLjEtNS4zLTUuMUg1YzAsMy40MSwyLjcyLDYuMjMsNiw2LjcyVjIxaDJ2LTMuMjhjLjkxLS4xMywxLjc3LS40NSwyLjU0LS45TDE5LjczLDIxLDIxLDE5LjczLDQuMjcsM3pcIlxuICAgICk7XG5cbiAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMSk7XG5cbiAgICByZXR1cm4gbWljSWNvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTWljSWNvbiB9IGZyb20gXCIuLi9NaWNJY29uXCI7XG5pbXBvcnQgeyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSBmcm9tIFwiLi4vLi4vQXJjd2FyZVBpeGVsU3RyZWFtaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBNaWNyb3Bob25lT3ZlcmxheSB7XG4gIHByaXZhdGUgb3ZlcmxheTogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIHByaXZhdGUgbWljSWNvbjogTWljSWNvbjtcbiAgcHJpdmF0ZSBzdHJlYW06IEFyY3dhcmVQaXhlbFN0cmVhbWluZztcblxuICBjb25zdHJ1Y3RvcihzdHJlYW06IEFyY3dhcmVQaXhlbFN0cmVhbWluZykge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMubWljSWNvbiA9IG5ldyBNaWNJY29uKCk7XG4gICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gc3RyZWFtPy52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy5vdmVybGF5KSB7XG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLm92ZXJsYXkpO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgdGhlIG92ZXJsYXkgZWxlbWVudFxuICAgICAgdGhpcy5vdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRoaXMub3ZlcmxheS5pZCA9IFwibWljcm9waG9uZU92ZXJsYXlcIjtcbiAgICAgIHRoaXMub3ZlcmxheT8uY2xhc3NMaXN0Py5hZGQoXCJoaWRkZW5TdGF0ZVwiKTtcblxuICAgICAgLy8gQXBwZW5kIHRoZSBpY29ucyB0byB0aGUgb3ZlcmxheVxuICAgICAgdGhpcy5vdmVybGF5LmFwcGVuZENoaWxkKHRoaXMubWljSWNvbi5taWNJY29uVW5tdXRlZCk7XG4gICAgICB0aGlzLm92ZXJsYXkuYXBwZW5kQ2hpbGQodGhpcy5taWNJY29uLm1pY0ljb25NdXRlZCk7XG4gICAgICB0aGlzLm1pY0ljb24ubWljSWNvbk11dGVkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSB0aXRsZSBkaXYgZWxlbWVudFxuICAgICAgY29uc3QgdGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGl0bGVEaXYuY2xhc3NOYW1lID0gXCJ0aXRsZVwiO1xuICAgICAgdGl0bGVEaXYudGV4dENvbnRlbnQgPSBcIkVuYWJsaW5nIG1pY3JvcGhvbmUuLi5cIjsgLy8gRGVmYXVsdCB0ZXh0XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgcGFyYWdyYXBoIGVsZW1lbnRcbiAgICAgIGNvbnN0IHBhcmFncmFwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xuICAgICAgcGFyYWdyYXBoLnRleHRDb250ZW50ID1cbiAgICAgICAgXCJQbGVhc2UgY2hlY2sgeW91ciBicm93c2VyJ3MgcHJvbXB0IHRvIGFsbG93IG1pY3JvcGhvbmUgYWNjZXNzLiBZb3UgbWF5IGFsc28gbmVlZCB0byByZS1lbmFibGUgdGhlIHNvdW5kLlwiOyAvLyBEZWZhdWx0IHRleHRcblxuICAgICAgLy8gQXBwZW5kIHRoZSB0aXRsZSBhbmQgcGFyYWdyYXBoIHRvIHRoZSBvdmVybGF5XG4gICAgICB0aGlzLm92ZXJsYXkuYXBwZW5kQ2hpbGQodGl0bGVEaXYpO1xuICAgICAgdGhpcy5vdmVybGF5LmFwcGVuZENoaWxkKHBhcmFncmFwaCk7XG5cbiAgICAgIC8vIEFwcGVuZCB0aGUgb3ZlcmxheSB0byB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm92ZXJsYXkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVNZXNzYWdlKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy5vdmVybGF5KSB7XG4gICAgICAgIC8vIEZpbmQgdGhlIHRpdGxlIGFuZCBwYXJhZ3JhcGggZWxlbWVudHNcbiAgICAgICAgY29uc3QgdGl0bGVFbGVtZW50ID0gdGhpcy5vdmVybGF5LnF1ZXJ5U2VsZWN0b3IoXCIudGl0bGVcIik7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaEVsZW1lbnQgPSB0aGlzLm92ZXJsYXkucXVlcnlTZWxlY3RvcihcInBcIik7XG5cbiAgICAgICAgdGhpcy5taWNJY29uLm1pY0ljb25NdXRlZC5zdHlsZS5kaXNwbGF5ID0gZW5hYmxlZCA/IFwibm9uZVwiIDogXCJibG9ja1wiO1xuICAgICAgICB0aGlzLm1pY0ljb24ubWljSWNvblVubXV0ZWQuc3R5bGUuZGlzcGxheSA9IGVuYWJsZWQgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHRpdGxlIGFuZCBwYXJhZ3JhcGggdGV4dFxuICAgICAgICBpZiAodGl0bGVFbGVtZW50KSB0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBlbmFibGVkID8gXCJFbmFibGluZyBtaWNyb3Bob25lXCIgOiBcIkRpc2FibGluZyBtaWNyb3Bob25lXCI7XG4gICAgICAgIGlmIChwYXJhZ3JhcGhFbGVtZW50KVxuICAgICAgICAgIHBhcmFncmFwaEVsZW1lbnQudGV4dENvbnRlbnQgPSBlbmFibGVkXG4gICAgICAgICAgICA/IFwiUGxlYXNlIGNoZWNrIHlvdXIgYnJvd3NlcidzIHByb21wdCB0byBhbGxvdyBtaWNyb3Bob25lIGFjY2Vzcy4gWW91IG1heSBhbHNvIG5lZWQgdG8gcmUtZW5hYmxlIHRoZSBzb3VuZC5cIlxuICAgICAgICAgICAgOiBcIlBsZWFzZSB3YWl0LiBZb3UgbWF5IG5lZWQgdG8gcmUtZW5hYmxlIHRoZSBzb3VuZC5cIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlVmlzaWJpbGl0eSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkge1xuICAgICAgY29uc3QgaW5mb092ZXJsYXkgPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiI2luZm9PdmVybGF5XCIpO1xuICAgICAgY29uc3QgZGlzY29ubmVjdE92ZXJsYXkgPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiI2Rpc2Nvbm5lY3RPdmVybGF5XCIpO1xuICAgICAgY29uc3QgZXJyb3JPdmVybGF5ID0gdGhpcz8ucGFyZW50RWxlbWVudD8ucXVlcnlTZWxlY3RvcihcIiNlcnJvck92ZXJsYXlcIik7XG5cbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IFwibWljLW92ZXJsYXktaXMtdmlzaWJsZVwiO1xuXG4gICAgICBpZiAodGhpcy5vdmVybGF5ICYmIGluZm9PdmVybGF5ICYmIGRpc2Nvbm5lY3RPdmVybGF5ICYmIGVycm9yT3ZlcmxheSkge1xuICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgIGluZm9PdmVybGF5Py5jbGFzc0xpc3Q/LmFkZChjbGFzc05hbWUpO1xuICAgICAgICAgIGRpc2Nvbm5lY3RPdmVybGF5Py5jbGFzc0xpc3Q/LmFkZChjbGFzc05hbWUpO1xuICAgICAgICAgIGVycm9yT3ZlcmxheT8uY2xhc3NMaXN0Py5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICB0aGlzPy5vdmVybGF5Py5jbGFzc0xpc3Q/LnJlbW92ZShcImhpZGRlblN0YXRlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXM/Lm92ZXJsYXk/LmNsYXNzTGlzdD8uYWRkKFwiaGlkZGVuU3RhdGVcIik7XG4gICAgICAgICAgaW5mb092ZXJsYXk/LmNsYXNzTGlzdD8ucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgICAgZGlzY29ubmVjdE92ZXJsYXk/LmNsYXNzTGlzdD8ucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgICAgZXJyb3JPdmVybGF5Py5jbGFzc0xpc3Q/LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgUGxheUljb24ge1xuICBwdWJsaWMgcGxheUljb246IFNWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wbGF5SWNvbiA9IHRoaXMuY3JlYXRlUGxheUljb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGxheUljb24oKTogU1ZHRWxlbWVudCB7XG4gICAgY29uc3QgcGxheUljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInN2Z1wiKTtcbiAgICBwbGF5SWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIFwicGxheUljb25cIik7XG4gICAgcGxheUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMjRweFwiKTtcbiAgICBwbGF5SWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIyNHB4XCIpO1xuICAgIHBsYXlJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidmlld0JveFwiLCBcIjAgMCAyNCAyNFwiKTtcblxuICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgIHN2Z0dyb3VwPy5jbGFzc0xpc3Q/LmFkZChcInN2Z0ljb25cIik7XG4gICAgcGxheUljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuXG4gICAgY29uc3QgcGF0aDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG4gICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIFwiTTggNXYxNGwxMS03elwiKTtcbiAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMSk7XG5cbiAgICByZXR1cm4gcGxheUljb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB9IGZyb20gXCIuLi8uLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmltcG9ydCB7IFN0b3BJY29uIH0gZnJvbSBcIi4uL1N0b3BJY29uXCI7XG5pbXBvcnQgeyBQbGF5SWNvbiB9IGZyb20gXCIuLi9QbGF5SWNvblwiO1xuXG5leHBvcnQgY2xhc3MgU3RvcEJ1dHRvbiB7XG4gIHByaXZhdGUgYnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgcHJpdmF0ZSBzdHJlYW06IEFyY3dhcmVQaXhlbFN0cmVhbWluZztcbiAgcHJpdmF0ZSBzdG9wSWNvbjogU3RvcEljb247XG4gIHByaXZhdGUgcGxheUljb246IFBsYXlJY29uO1xuICBwcml2YXRlIHRvb2x0aXBUZXh0OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBpc1N0cmVhbWluZzogYm9vbGVhbiA9IHRydWU7IC8vIEFzc3VtaW5nIHN0cmVhbWluZyBzdGFydHMgYnkgZGVmYXVsdFxuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5idXR0b24gPSB0aGlzLmNyZWF0ZUJ1dHRvbigpO1xuICAgIHRoaXMuc3RvcEljb24gPSBuZXcgU3RvcEljb24oKTtcbiAgICB0aGlzLnBsYXlJY29uID0gbmV3IFBsYXlJY29uKCk7XG4gICAgdGhpcy50b29sdGlwVGV4dCA9IHRoaXMuY3JlYXRlVG9vbHRpcFRleHQoKTtcbiAgICB0aGlzLmJ1dHRvbi5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBUZXh0KTtcbiAgICB0aGlzLmJ1dHRvbi5hcHBlbmRDaGlsZCh0aGlzLnN0b3BJY29uLnN0b3BJY29uKTtcbiAgICB0aGlzLmJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy50b2dnbGVTdHJlYW1pbmcuYmluZCh0aGlzKSk7XG4gICAgc3RyZWFtLm9uU3RyZWFtaW5nU3RhdGVDaGFuZ2UodGhpcy51cGRhdGVCdXR0b25TdGF0ZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnV0dG9uKCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbj8uc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzdG9wQnRuXCIpO1xuICAgIGJ1dHRvbj8uc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICBidXR0b24/LmNsYXNzTGlzdD8uYWRkKFwiVWlUb29sXCIpO1xuICAgIHJldHVybiBidXR0b247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRvb2x0aXBUZXh0KCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCB0b29sdGlwVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIHRvb2x0aXBUZXh0Py5jbGFzc0xpc3Q/LmFkZChcInRvb2x0aXB0ZXh0XCIpO1xuICAgIHRvb2x0aXBUZXh0LmlubmVySFRNTCA9IFwiRGlzY29ubmVjdFwiO1xuICAgIHJldHVybiB0b29sdGlwVGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgdG9nZ2xlU3RyZWFtaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTdHJlYW1pbmcgPSAhdGhpcy5pc1N0cmVhbWluZztcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvbkljb24oKTtcbiAgICBpZiAodGhpcy5pc1N0cmVhbWluZykge1xuICAgICAgdGhpcy5zdHJlYW0ucmVjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RyZWFtLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUJ1dHRvbkljb24oKTogdm9pZCB7XG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGljb24gKyB0b29sdGlwIHNob3VsZCBiZSBjdXJyZW50bHkgZGlzcGxheWVkXG4gICAgY29uc3QgY3VycmVudEljb24gPSB0aGlzLmlzU3RyZWFtaW5nID8gdGhpcy5zdG9wSWNvbi5zdG9wSWNvbiA6IHRoaXMucGxheUljb24ucGxheUljb247XG4gICAgY29uc3QgY3VycmVudFRvb2x0aXBUZXh0ID0gdGhpcy5pc1N0cmVhbWluZyA/IFwiRGlzY29ubmVjdFwiIDogXCJSZWNvbm5lY3RcIjtcblxuICAgIC8vIFVwZGF0ZSB0b29sdGlwIHRleHRcbiAgICB0aGlzLnRvb2x0aXBUZXh0LmlubmVySFRNTCA9IGN1cnJlbnRUb29sdGlwVGV4dDtcbiAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IGNoaWxkIGlmIGl0IGV4aXN0c1xuICAgIGlmICh0aGlzLmJ1dHRvbi5maXJzdENoaWxkKSB7XG4gICAgICB0aGlzLmJ1dHRvbi5yZW1vdmVDaGlsZCh0aGlzLmJ1dHRvbi5jaGlsZHJlblsxXSk7XG4gICAgfVxuICAgIC8vIEFwcGVuZCB0aGUgbmV3IGljb25cbiAgICB0aGlzLmJ1dHRvbi5hcHBlbmRDaGlsZChjdXJyZW50SWNvbik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmJ1dHRvbjtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQnV0dG9uU3RhdGUoaXNTdHJlYW1pbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzU3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7XG4gICAgdGhpcy51cGRhdGVCdXR0b25JY29uKCk7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTdG9wSWNvbiB7XG4gIHB1YmxpYyBzdG9wSWNvbjogU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnN0b3BJY29uID0gdGhpcy5jcmVhdGVTdG9wSWNvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdG9wSWNvbigpOiBTVkdFbGVtZW50IHtcbiAgICBjb25zdCBzdG9wSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xuICAgIHN0b3BJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgXCJzdG9wSWNvblwiKTtcbiAgICBzdG9wSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIyNHB4XCIpO1xuICAgIHN0b3BJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjI0cHhcIik7XG4gICAgc3RvcEljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ2aWV3Qm94XCIsIFwiMCAtMSAyNCAyNFwiKTtcblxuICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgIHN2Z0dyb3VwPy5jbGFzc0xpc3Q/LmFkZChcInN2Z0ljb25cIik7XG4gICAgc3RvcEljb24/LmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcblxuICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgxLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZFwiLCBcIk02IDZoMTJ2MTJINnpcIik7XG4gICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuXG4gICAgcmV0dXJuIHN0b3BJY29uO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9saWJcIjtcbiIsImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBaRXJyb3JNZXNzYWdlID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJlcnJvclwiKSxcbiAgY29kZTogei5udW1iZXIoKS5pbnQoKSxcbiAgcmVhc29uOiB6LnN0cmluZygpLFxuICB2ZXJib3NpdHk6IHoubnVtYmVyKCksXG59KTtcbmV4cG9ydCB0eXBlIEVycm9yTWVzc2FnZSA9IHouaW5mZXI8dHlwZW9mIFpFcnJvck1lc3NhZ2U+O1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IFpMb3ZlTGV0dGVyID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJsZXR0ZXJcIiksXG4gIHJlYXNvbjogei5zdHJpbmcoKS5zdGFydHNXaXRoKFwiTEw6IFwiKSxcbiAgY29kZTogei5udW1iZXIoKSxcbiAgdmVyYm9zaXR5OiB6Lm51bWJlcigpLFxufSk7XG5leHBvcnQgdHlwZSBMb3ZlTGV0dGVyID0gei5pbmZlcjx0eXBlb2YgWkxvdmVMZXR0ZXI+O1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IFpQaW5nID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJwaW5nXCIpLFxuICBtZXNzYWdlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRpbWU6IHoubnVtYmVyKClcbn0pO1xuZXhwb3J0IHR5cGUgUGluZyA9IHouaW5mZXI8dHlwZW9mIFpQaW5nPjtcbiIsImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBaUXVldWUgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInF1ZXVlXCIpLFxuICBxdWV1ZTogei5vYmplY3Qoe1xuICAgIC8qKiBUaWNrZXQuX2lkIC0gd2lsbCBub3QgYmUgZXhwb3NlZCB0byBmcm9udGVuZC4gKi9cbiAgICAvLyBfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgIC8qKiBQb3NpdGlvbiBpbiBxdWV1ZSAoemVybyBiYXNlZCkuICovXG4gICAgaW5kZXg6IHoubnVtYmVyKCkuaW50KCkub3B0aW9uYWwoKSxcbiAgICAvKiogTGVuZ3RoIG9mIHRoZSBxdWV1ZS4gKi9cbiAgICBxdWV1ZUxlbmd0aDogei5udW1iZXIoKS5pbnQoKS5vcHRpb25hbCgpLFxuICAgIC8qKiBBbHJlYWR5IHdhaXRlZCBmb3IuICovXG4gICAgd2FpdGVkOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgLyoqIEJhc2VkIG9uIEF2ZXJhZ2UgV2F0Y2ggVGltZSxcbiAgICAgKiB3ZSBjYWxjdWxhdGUgYW4gYXZlcmFnZSBpbnRlcnZhbCBvZiBleHBlY3RlZCBjb25uZWN0aW9uIGNsb3NpbmdzIGFuZCBiYXNlZCBvbiB0aGUgYW1vdW50IG9mIGNvbmN1cnJlbnQgc2Vzc2lvbnMsXG4gICAgICogd2UgY2FuIGNhbGN1bGF0ZSB0aGUgZXN0aW1hdGVkIHRpbWUgdW50aWwgYW5vdGhlciBzbG90IHdpbGwgYmUgZnJlZWQgdXAuICovXG4gICAgZXN0aW1hdGVkV2FpdFRpbWU6IHoubnVtYmVyKCkub3B0aW9uYWwoKS5udWxsYWJsZSgpLFxuICAgIC8qKiBUaGUgYXZlcmFnZSB0aW1lIGFsbCBjdXJyZW50IHNlc3Npb25zLlxuICAgICAqIChIb3cgbG9uZyBkaWQgaXQgYWN0dWFsbHkgdGFrZSB0aG9zZSB0aGF0IHdhaXRlZCBmb3IgdGhlbSB0aGF0IHJlY2VpdmVkIGEgY29ubmVjdGlvbiB0byB0aGUgY3VycmVudGx5IHJ1bm5pbmcgaW5zdGFuY2VzLilcbiAgICAgKi9cbiAgICBhdmVyYWdlV2FpdFRpbWU6IHoubnVtYmVyKCkub3B0aW9uYWwoKS5udWxsYWJsZSgpLFxuICAgIC8qKiBUeXBlIG9mIGFsbCB0aW1lLXZhbHVlcyBpbiB0aGUgcXVlLiAqL1xuICAgIHZhbHVlVHlwZTogei5lbnVtKFtcIm1pbGxpc2Vjb25kc1wiLCBcInNlY29uZHNcIiwgXCJtaW51dGVzXCIsIFwiaG91cnNcIiwgXCJkYXlzXCJdKSxcbiAgfSksXG59KTtcbmV4cG9ydCB0eXBlIFF1ZXVlID0gei5pbmZlcjx0eXBlb2YgWlF1ZXVlPjtcbiIsImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBaU2Vzc2lvbklkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJzZXNzaW9uSWRcIiksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IHR5cGUgU2Vzc2lvbklkID0gei5pbmZlcjx0eXBlb2YgWlNlc3Npb25JZD47XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgQWdncmVnYXRlZFN0YXRzIH0gZnJvbSBcIkBlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjVcIjtcblxuZXhwb3J0IGNvbnN0IFpTdGF0cyA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKFwic3RhdHNcIiksXG4gIHN0YXRzOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICAvKipcbiAgICAgICAqIE90aGVyIGtub3duIHByb3BlcnRpZXMuXG4gICAgICAgKi9cbiAgICAgIGNvZGVjczogei5jdXN0b208QWdncmVnYXRlZFN0YXRzW1wiY29kZWNzXCJdPigpLFxuICAgICAgY2FuZGlkYXRlUGFpcjogei5jdXN0b208QWdncmVnYXRlZFN0YXRzW1wiY2FuZGlkYXRlUGFpcnNcIl0+KCksXG4gICAgICBsb2NhbENhbmRpZGF0ZXM6IHouY3VzdG9tPEFnZ3JlZ2F0ZWRTdGF0c1tcImxvY2FsQ2FuZGlkYXRlc1wiXT4oKSxcbiAgICAgIHJlbW90ZUNhbmRpZGF0ZXM6IHouY3VzdG9tPEFnZ3JlZ2F0ZWRTdGF0c1tcInJlbW90ZUNhbmRpZGF0ZXNcIl0+KCksXG4gICAgICBEYXRhQ2hhbm5lbFN0YXRzOiB6LmN1c3RvbTxBZ2dyZWdhdGVkU3RhdHNbXCJkYXRhY2hhbm5lbFN0YXRzXCJdPigpLFxuXG5cbiAgICAgIC8vIFJlY2VpdmVkIChsYXN0KSBmb3IgdGlja2V0XG4gICAgICBieXRlc1JlY2VpdmVkOiB6Lm51bWJlcigpLFxuICAgICAgLy8gUGFja2V0cyBMb3N0IChsYXN0KSBmb3IgdGlja2V0XG4gICAgICBwYWNrZXRzTG9zdDogei5udW1iZXIoKSxcbiAgICAgIC8vIFZpZGVvIHJlc29sdXRpb246IGhpZ2hlc3QgbG93ZXN0IGF2ZXJhZ2UgKHBvcnRyYWl0KSBhbmQgaGlnaGVzdCBsb3dlc3QgYXZlcmFnZSAobGFuZHNjYXBlKSBmb3IgdGlja2V0XG4gICAgICBmcmFtZVdpZHRoOiB6Lm51bWJlcigpLFxuICAgICAgLy8gVmlkZW8gcmVzb2x1dGlvbjogaGlnaGVzdCBsb3dlc3QgYXZlcmFnZSAocG9ydHJhaXQpIGFuZCBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChsYW5kc2NhcGUpIGZvciB0aWNrZXRcbiAgICAgIGZyYW1lSGVpZ2h0OiB6Lm51bWJlcigpLFxuICAgICAgLy8gRnJhbWVzIGRlY29kZWQgKExhc3QpIGZvciB0aWNrZXRcbiAgICAgIGZyYW1lc0RlY29kZWQ6IHoubnVtYmVyKCksXG4gICAgICAvLyBGcmFtZXJhdGUgKGxvdyAvIGhpZ2gsIGF2ZykgZm9yIHRpY2tldFxuICAgICAgZnJhbWVzUGVyU2Vjb25kOiB6Lm51bWJlcigpLFxuICAgICAgLy8gZnJhbWVzIGRyb3BwZWQgKGxhc3QpIGZvciB0aWNrZXRcbiAgICAgIGZyYW1lc0Ryb3BwZWQ6IHoubnVtYmVyKCksXG4gICAgICAvLyBWaWRlb2NvZGVjIChvbmNlKSBmb3IgdGlja2V0XG4gICAgICB2aWRlb0NvZGVjOiB6LnN0cmluZygpLFxuICAgICAgLy8gYXVkaW9jb2RlYyAob25jZSkgZm9yIHRpY2tldFxuICAgICAgYXVkaW9Db2RlYzogei5zdHJpbmcoKSxcbiAgICAgIC8vIGJyb3dzZXIgdHlwZSBhbmQgdmVyc2lvbiBmb3IgdGlja2V0IChhcmN3YXJlIC8gYWRkaXRpb24pXG4gICAgICBicm93c2VySW5mbzogelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICB1c2VyQWdlbnQ6IHouc3RyaW5nKCksXG4gICAgICAgICAgcGxhdGZvcm06IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgICAgICBsYW5ndWFnZTogei5zdHJpbmcoKSxcbiAgICAgICAgfSlcbiAgICAgICAgLnBhc3N0aHJvdWdoKClcbiAgICAgICAgLnBhcnRpYWwoKSxcbiAgICAgIC8vIE5ldCBSVFQgKGxvdywgaGlnaCwgYXZnKVxuICAgICAgY3VycmVudFJUVDogei5udW1iZXIoKSxcbiAgICAgIC8vIER1cmF0aW9uIChsYXN0KVxuICAgICAgc2Vzc2lvblJ1blRpbWU6IHouc3RyaW5nKCksXG4gICAgICAvLyBDb250cm9scyBzdHJlYW0gaW5wdXQgKD8/KVxuICAgICAgY29udHJvbHNTdHJlYW1JbnB1dDogei5zdHJpbmcoKS5yZWZpbmUoKGFyZykgPT4gYXJnID09PSBcInRydWVcIiB8fCBhcmcgPT09IFwiZmFsc2VcIiksXG4gICAgICAvLyB2aWRlbyBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChsb3cgLyBoaWdoIC8gYXZnIGlmIGFwcGxpY2FibGUpXG4gICAgICB2aWRlb0VuY29kZXJBdmdRUDogei5udW1iZXIoKSxcbiAgICAgIC8vIFZpZGVvIGJpdHJhdGUgKG1pbiAvIG1heCAvIGF2ZylcbiAgICAgIHZpZGVvQml0cmF0ZTogei5udW1iZXIoKSxcbiAgICAgIC8vIEF1ZGlvIGJpdHJhdGUgKG1pbiAvIG1heCAvIGF2ZylcbiAgICAgIGF1ZGlvQml0cmF0ZTogei5udW1iZXIoKSxcbiAgICB9KVxuICAgIC5wYXNzdGhyb3VnaCgpXG4gICAgLnBhcnRpYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgU3RhdHMgPSB6LmluZmVyPHR5cGVvZiBaU3RhdHM+O1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFdlYlNka1NldHRpbmdzIH0gZnJvbSBcIi4vV2ViU2RrU2V0dGluZ3NcIjtcblxuZXhwb3J0IGNvbnN0IFpTdHJlYW1JbmZvID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJzdHJlYW1JbmZvXCIpLFxuICBzdHJlYW1JbmZvOiB6Lm9iamVjdCh7XG4gICAgZ3VpZDogei5zdHJpbmcoKSxcbiAgICBhdXRvUGxheTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICB0b3VjaENhcGFibGU6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgcmVzb2x1dGlvbjogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIHdpZHRoOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gICAgICAgIGhlaWdodDogei5udW1iZXIoKS5pbnQoKS5ub25uZWdhdGl2ZSgpLFxuICAgICAgICBkeW5hbWljOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICBmaXhlZDogei5ib29sZWFuKCkub3B0aW9uYWwoKVxuICAgICAgfSlcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIG1ldGE6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBmcmllbmRseU5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgaXNUcmlhbDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbW91c2VMb2NrOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICBwb3dlcmVkQnk6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgIHZlcnNpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgfSlcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIHdlYlNka1NldHRpbmdzOiBXZWJTZGtTZXR0aW5ncy5vcHRpb25hbCgpLFxuICAgIGFmazogelxuICAgICAgLm9iamVjdChcbiAgICAgICAge1xuICAgICAgICAgIGVuYWJsZWQ6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiRW5hYmxlcyAvIERpc2FibGVzIEFGSyBmdW5jdGlvbmFsaXR5LlwiKSxcbiAgICAgICAgICB3YXJuOiB6XG4gICAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAgIC5pbnQoKVxuICAgICAgICAgICAgLm5vbm5lZ2F0aXZlKClcbiAgICAgICAgICAgIC5kZXNjcmliZShcIlRpbWUgaW4gc2Vjb25kcywgYWZ0ZXIgbGFzdCBpbnRlcmFjdGlvbiwgd2hlbiB0aGUgZmlyc3Qgd2FybmluZyB3aWxsIGJlIHRyaWdnZXJlZC5cIiksXG4gICAgICAgICAgZXJyb3I6IHpcbiAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAubm9ubmVnYXRpdmUoKVxuICAgICAgICAgICAgLmRlc2NyaWJlKFwiVGltZSBpbiBzZWNvbmRzLCBhZnRlciB3YXJuIHRyaWdnZXIsIHdoZW4gYSBtb3JlIHB1c2h5IHdhcm5pbmcgd2lsbCBiZSB0cmlnZ2VyZWQuXCIpLFxuICAgICAgICAgIGFjdGlvbjogelxuICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgIC5ub25uZWdhdGl2ZSgpXG4gICAgICAgICAgICAuZGVzY3JpYmUoXCJUaW1lIGluIHNlY29uZHMsIGFmdGVyIGVycm9yIHRyaWdnZXIsIHRoZSBhY3R1YWwgZGlzY29ubmVjdGlvbiBhY3Rpb24gd2lsbCB0YWtlIHBsYWNlLlwiKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIkFGSyBzdGFuZHMgZm9yICdhd2F5IGZyb20ga2V5Ym9hcmQnIGFuZCBkZXNjcmliZXMgYSB0aW1lb3V0IGJhc2VkIG9uIGFjdGl2aXR5IG9mIHRoZSBhY3R1YWwgcHJvamVjdC4gQWxsIGV4ZWN1dGlvbiBvZiB0aGVzZSBzZXR0aW5ncyBhcmUgcHJvbmUgdG8gZnJvbnRlbmQgYW5kIHRoZXJlZm9yZSBubyBmdWxsIHNlY3VyaXR5IG1lYXN1cmUgZm9yIGFidXNlISBUaGVzZSBzZXR0aW5ncyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgc2hhcmVJZCwgYnV0IHdvdWxkIG92ZXJ3cml0ZSB0aGUgc2V0dGluZ3MgZ2l2ZW4gdGhyb3VnaCBmcm9udGVuZCBjb25maWd1cmF0aW9uLlwiXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIC5vcHRpb25hbCgpXG4gIH0pXG59KTtcbmV4cG9ydCB0eXBlIFN0cmVhbUluZm8gPSB6LmluZmVyPHR5cGVvZiBaU3RyZWFtSW5mbz47XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgWlZlcnNpb24gPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInZlcnNpb25cIiksXG4gIHZlcnNpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgVmVyc2lvbiA9IHouaW5mZXI8dHlwZW9mIFpWZXJzaW9uPjtcbiIsImltcG9ydCB7IFpvZFR5cGUsIHogfSBmcm9tIFwiem9kXCI7XG5cbmNvbnN0IGRpc2FibGVkRGlzY2xhaW1lciA9XG4gIFwiRGlzYWJsZWQ6IFRvIHB1cmNoYXNlIHRoaXMgb3B0aW9uLCBwbGVhc2UgY29udGFjdCBvdXIgc2FsZXMgZGVwYXJ0bWVudCBieSBjbGlja2luZyB0aGUgJ0NyZWF0ZSBTdXBwb3J0IFRpY2tldCcgYnV0dG9uIG9uIHRoZSBIZWxwIENlbnRlciBwYWdlLlwiO1xuXG5leHBvcnQgY29uc3QgV2ViU2RrU2V0dGluZ3MgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGNvbmY6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBmdWxsc2NyZWVuQnV0dG9uOiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIkZ1bGwtU2NyZWVuIEJ1dHRvbnxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSBFbmFibGUvRGlzYWJsZSBFbmFibGUvRGlzYWJsZSB0aGUgZnVsbC1zY3JlZW4gYnV0dG9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IFBsZWFzZSBiZSBhd2FyZSB0aGF0IGlPUyAoaVBob25lIGRldmljZXMpIGRvZXMgbm90IHN1cHBvcnQgZnVsbC1zY3JlZW4gbW9kZSwgYW5kIGFzIGEgcmVzdWx0LCB0aGUgYnV0dG9uIHdpbGwgbm90IGJlIGRpc3BsYXllZCBvbiB0aGVzZSBkZXZpY2VzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBzdG9wQnV0dG9uOiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIlN0b3AgQnV0dG9ufFwiLFxuICAgICAgICAgICAgICBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIHRoZSBzdG9wIG92ZXJsYXktYnV0dG9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IE1hbnVhbGx5IHN0b3BzIHRoZSBjb25uZWN0aW9uLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICAvLyBEZWZhdWx0OiBmYWxzZSwgZm9yIGNsZWFuZXIgVUkuXG4gICAgICAgIGF1ZGlvQnV0dG9uOiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCJBdWRpbyBCdXR0b258XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgRW5hYmxlL0Rpc2FibGUgdGhlIGF1ZGlvIG92ZXJsYXktYnV0dG9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IERpc3BsYXlzIHRoZSBhdWRpbyBidXR0b24gaWYgeW91ciBVbnJlYWwgRW5naW5lIGFwcGxpY2F0aW9uIGluY2x1ZGVzIGF1ZGlvLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICAvLyBFdmVuIHRob3VnaCBpdCdzIGRlZmF1bHRlZCB0byBmYWxzZSwgaXQgY2FuIHN0aWxsIGJlIGVuYWJsZWQgd2hpbGUgYmVpbmcgZmFsc2UgYnkgdXNpbmcgdGhlIFwiaVwiIHF1ZXJ5IHBhcmFtZXRlcjogaHR0cHM6Ly9zb21lLXVybC8/aVxuICAgICAgICBpbmZvQnV0dG9uOiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAgIC5kZXNjcmliZShbXCJJbmZvIEJ1dHRvbnxcIiwgXCJPdmVycmlkZSBFbmFibGUvRGlzYWJsZSB0aGUgaW5mbyBvdmVybGF5LWJ1dHRvbi5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgbWljQnV0dG9uOiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCJNaWMgQnV0dG9ufFwiLFxuICAgICAgICAgICAgICBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIHRoZSBtaWNyb3Bob25lIG92ZXJsYXktYnV0dG9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IEVuYWJsZXMgdXNlcnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgVW5yZWFsIEVuZ2luZSBhcHBsaWNhdGlvbiB1c2luZyBhIG1pY3JvcGhvbmUsIHdoaWNoIG11c3QgYmUgbWFudWFsbHkgZW5hYmxlZCBieSB0aGUgdXNlci5cIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgc2V0dGluZ3NCdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgLmRlc2NyaWJlKFtcIlNldHRpbmdzIEJ1dHRvbnxcIiwgXCJPdmVycmlkZSBFbmFibGUvRGlzYWJsZSB0aGUgc2V0dGluZ3Mgb3ZlcmxheS1idXR0b24uXCJdLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIGNvbm5lY3Rpb25TdHJlbmd0aEljb246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1wiQ29ubmVjdGlvbiBTdHJlbmd0aHxcIiwgXCJPdmVycmlkZSBFbmFibGUvRGlzYWJsZSB0aGUgY29ubmVjdGlvbiBzdHJlbmd0aCBvdmVybGF5LWljb24uXCJdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG5cbiAgICAgICAgLy8gZXJyb3JIYW5kbGVyOiB6YXQoei5ib29sZWFuKCkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIGxvdmVMZXR0ZXJIYW5kbGVyOiB6YXQoei5ib29sZWFuKCkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIGxvdmVMZXR0ZXJMb2dnaW5nOiB6YXQoei5ib29sZWFuKCkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgICAgLy8gY29ubmVjdGlvbklkZW50aWZpZXJMb2dnaW5nRGlzYWJsZWQ6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gcXVldWVIYW5kbGVyOiB6YXQoei5ib29sZWFuKCkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIHNlc3Npb25JZEhhbmRsZXI6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAub3B0aW9uYWwoKSxcbiAgICBpbml0OiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgLy8gSW5wdXRcbiAgICAgICAgS2V5Ym9hcmRJbnB1dDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVmYXVsdCh0cnVlKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCJLZXlib2FyZCBJbnB1dHxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSAnS2V5Ym9hcmRJbnB1dCcgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi5cIixcbiAgICAgICAgICAgICAgXCJJbmZvOiBBbGxvd3Mga2V5Ym9hcmQgaW5wdXQgZXZlbnRzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBNb3VzZUlucHV0OiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIk1vdXNlIElucHV0fFwiLFxuICAgICAgICAgICAgICBcIk92ZXJyaWRlICdNb3VzZUlucHV0JyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IEFsbG93cyBtb3VzZSBpbnB1dCBldmVudHMuXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIEdhbWVwYWRJbnB1dDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiR2FtZSBwYWQgSW5wdXR8XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgJ0dhbWVwYWRJbnB1dCcgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi5cIixcbiAgICAgICAgICAgICAgXCJJbmZvOiBBbGxvd3MgaW5wdXQgZXZlbnRzIGZyb20gZ2FtZXBhZCBjb250cm9sbGVycy5cIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgVG91Y2hJbnB1dDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiVG91Y2ggSW5wdXR8XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgJ1RvdWNoSW5wdXQnIHByb3BlcnR5IG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogQWxsb3dzIHRvdWNoIGV2ZW50cyBvbiBtb2JpbGUgZGV2aWNlcyBhbmQgdGFibGV0cy5cIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgWFJDb250cm9sbGVySW5wdXQ6IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIlhSIENvbnRyb2xsZXIgSW5wdXR8XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgJ1hSQ29udHJvbGxlcklucHV0JyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IEFsbG93cyBpbnB1dCBldmVudHMgZnJvbSBYUiBjb250cm9sbGVycyBmb3IgdXNlIHdpdGggQVIgYW5kIFZSIHNldHVwcy5cIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gVXNlTWljOlxuICAgICAgICAvLyAgIHouYm9vbGVhbigpLmRlc2NyaWJlKFtcIlVzZU1pY3xcIiwgXCJPdmVycmlkZSB1c2UgbWljIHByb3BlcnR5IG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCJdLmpvaW4oXCJcXG5cIikpXG4gICAgICAgIC8vICAub3B0aW9uYWwoKSxcblxuICAgICAgICBGYWtlTW91c2VXaXRoVG91Y2hlczogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiRmFrZSBtb3VzZSB3aXRoIHRvdWNoZXMgfFwiLFxuICAgICAgICAgICAgICBcIk92ZXJyaWRlICdGYWtlTW91c2VXaXRoVG91Y2hlcycgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi4gV2hlbiBlbmFibGVkIHRoaXMgc2V0dGluZyB3aWxsIGNvbnZlcnQgc2luZ2xlLWZpbmdlciB0b3VjaCBpbnB1dCB0byBtb3VzZSBpbnB1dC5cIixcbiAgICAgICAgICAgICAgXCJJbmZvOiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIGFuZCB0aGUgdXNlciBpcyB2aWV3aW5nIHRoZSBzdHJlYW0gb24gYSBkZXZpY2Ugd2l0aCBhIHRvdWNoIHNjcmVlbiBzdWNoIGFzIGEgc21hcnRwaG9uZSBvciB0YWJsZXQsIHRoaXMgc2V0dGluZyBjYXVzZXMgc2luZ2xlLWZpbmdlciB0b3VjaCBldmVudHMgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIFVucmVhbCBFbmdpbmUgYXBwbGljYXRpb24gYXMgbW91c2UgY2xpY2tzIGFuZCBkcmFnIGV2ZW50cy4gRW5hYmxpbmcgdGhpcyBzZXR0aW5nIGNhbiBwcm92aWRlIHVzZXJzIG9uIG1vYmlsZSBkZXZpY2VzIHdpdGggdGhlIGFiaWxpdHkgdG8gcGFydGlhbGx5IGNvbnRyb2wgeW91ciBVbnJlYWwgRW5naW5lIGFwcGxpY2F0aW9uLCBldmVuIHdoZW4gdGhlIGFwcGxpY2F0aW9uJ3MgaW5wdXQgY29udHJvbGxlciBkb2VzIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlIHRvdWNoIGlucHV0IGV2ZW50cy5cIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgRm9yY2VNb25vQXVkaW86IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlc2NyaWJlKFtcIkZvcmNlIG1vbm8gYXVkaW98XCIsIFwiT3ZlcnJpZGUgJ0ZvcmNlTW9ub0F1ZGlvJyBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiXS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBIb3ZlcmluZ01vdXNlOiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZXNjcmliZShbXCJIb3ZlcmluZyBtb3VzZXxcIiwgXCJPdmVycmlkZSAnSG92ZXJpbmdNb3VzZScgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gTWF0Y2hWaWV3cG9ydFJlczogemF0KFxuICAgICAgICAvLyAgIHpcbiAgICAgICAgLy8gICAgIC5ib29sZWFuKClcbiAgICAgICAgLy8gICAgIC5kZXNjcmliZShbXCJNYXRjaFZpZXdwb3J0UmVzfFwiLCBcIk92ZXJyaWRlIG1hdGNoIHZpZXdwb3J0IHJlcyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiXS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAvLyApLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIFN1cHByZXNzQnJvd3NlcktleXM6IHphdChcbiAgICAgICAgLy8gICB6XG4gICAgICAgIC8vICAgICAuYm9vbGVhbigpXG4gICAgICAgIC8vICAgICAuZGVzY3JpYmUoXG4gICAgICAgIC8vICAgICAgIFtcIlN1cHByZXNzQnJvd3NlcktleXN8XCIsIFwiT3ZlcnJpZGUgc3VwcHJlc3MgYnJvd3NlciBrZXlzIHByb3BlcnR5IG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCJdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgLy8gICAgIClcbiAgICAgICAgLy8gKS5vcHRpb25hbCgpLFxuXG4gICAgICAgIC8vIFRoZXNlIG1ha2Ugbm8gc2Vuc2UsIHNpbmNlIHRoZSBkYXRhIGZsb3dzIG9ubHkgd2l0aCB0aGUgc3RyZWFtSW5mb1xuICAgICAgICAvLyBBdXRvQ29ubmVjdDogemF0KFxuICAgICAgICAvLyAgIHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLmRlc2NyaWJlKFtcIkF1dG9Db25uZWN0fFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgLy8gKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBTdGFydFZpZGVvTXV0ZWQ6IHphdChcbiAgICAgICAgLy8gICB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLmRlc2NyaWJlKFtcIlN0YXJ0VmlkZW9NdXRlZHxcIiwgXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpXG4gICAgICAgIC8vICkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gQXV0b1BsYXlWaWRlbzogemF0KFxuICAgICAgICAvLyAgIHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSkuZGVzY3JpYmUoW1wiQXV0b1BsYXlWaWRlb3xcIiwgXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpXG4gICAgICAgIC8vICkub3B0aW9uYWwoKSxcblxuICAgICAgICAvLyBObyBlZmZlY3Q6XG4gICAgICAgIC8vIEZvcmNlVFVSTjogemF0KHouYm9vbGVhbigpLmRlc2NyaWJlKFtcIkZvcmNlVFVSTnxcIiwgXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBBRktUaW1lb3V0OiB6YXQoei5udW1iZXIoKS5kZXNjcmliZShbXCJBRktUaW1lb3V0fFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIE1heFFQOiB6YXQoei5udW1iZXIoKS5pbnQoKS5taW4oKS5tYXgoKS5kZXNjcmliZShbXCJUb2RvIFRpdGxlfFwiLFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gTWluUVA6IHphdCh6Lm51bWJlcigpLmludCgpLm1pbigpLm1heCgpLmRlc2NyaWJlKFtcIlRvZG8gVGl0bGV8XCIsXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBPZmZlclRvUmVjZWl2ZTogemF0KHouYm9vbGVhbigpLmRlc2NyaWJlKFtcIlRvZG8gVGl0bGV8XCIsXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBQcmVmZXJyZWRDb2RlYzogemF0KHoubGl0ZXJhbCgpLmRlc2NyaWJlKFtcIlRvZG8gVGl0bGV8XCIsXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBwcmVmZXJTRlU6IHphdCh6LmJvb2xlYW4oKS5kZXNjcmliZShbXCJUb2RvIFRpdGxlfFwiLFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gU3RyZWFtZXJJZDogemF0KHouYm9vbGVhbigpLmRlc2NyaWJlKFtcIlRvZG8gVGl0bGV8XCIsXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBUaW1lb3V0SWZJZGxlOiB6YXQoei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiVG9kbyBUaXRsZXxcIixcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG5cbiAgICAgICAgLy8gRG9uJ3Qga25vdyB3aGV0aGVyIHdlIHdhbnQgdG8gaGF2ZSB0aGF0IG9yIG5vdC5cbiAgICAgICAgLy8gQ29udHJvbHNRdWFsaXR5OiB6YXQoei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiQ29udHJvbHNRdWFsaXR5fFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIFdlYlJUQ0ZQUzogemF0KHoubnVtYmVyKCkuZGVzY3JpYmUoW1wiV2ViUlRDRlBTfFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIFdlYlJUQ01heEJpdHJhdGU6IHphdCh6Lm51bWJlcigpLmRlc2NyaWJlKFtcIldlYlJUQ01heEJpdHJhdGV8XCIsIFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gV2ViUlRDTWluQml0cmF0ZTogemF0KHoubnVtYmVyKCkuZGVzY3JpYmUoW1wiV2ViUlRDTWluQml0cmF0ZXxcIiwgXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9FcnJvck1lc3NhZ2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xvdmVMZXR0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Nlc3Npb25JZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vU3RyZWFtSW5mb1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vU3RhdHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1BpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1F1ZXVlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9WZXJzaW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9XZWJTZGtTZXR0aW5nc1wiO1xuXG5pbXBvcnQgeyBaU3RhdHMgfSBmcm9tIFwiLi9TdGF0c1wiO1xuXG5leHBvcnQgY29uc3QgU2VuZCA9IHtcbiAgc3RhdHM6IFpTdGF0cyxcbn07XG5cbmV4cG9ydCB0eXBlIFNlbmQgPSBcIm9uVmlkZW9Jbml0aWFsaXplZFwiO1xuIiwiZXhwb3J0ICogYXMgTWVzc2FnZXMgZnJvbSBcIi4vTWVzc2FnZXNcIjtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy5wdXNoKF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnB1c2goXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd3cyBkb2VzIG5vdCB3b3JrIGluIHRoZSBicm93c2VyLiBCcm93c2VyIGNsaWVudHMgbXVzdCB1c2UgdGhlIG5hdGl2ZSAnICtcbiAgICAgICdXZWJTb2NrZXQgb2JqZWN0J1xuICApO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5ab2RFcnJvciA9IGV4cG9ydHMucXVvdGVsZXNzSnNvbiA9IGV4cG9ydHMuWm9kSXNzdWVDb2RlID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vaGVscGVycy91dGlsXCIpO1xuZXhwb3J0cy5ab2RJc3N1ZUNvZGUgPSB1dGlsXzEudXRpbC5hcnJheVRvRW51bShbXG4gICAgXCJpbnZhbGlkX3R5cGVcIixcbiAgICBcImludmFsaWRfbGl0ZXJhbFwiLFxuICAgIFwiY3VzdG9tXCIsXG4gICAgXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgXCJpbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3JcIixcbiAgICBcImludmFsaWRfZW51bV92YWx1ZVwiLFxuICAgIFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgICBcImludmFsaWRfYXJndW1lbnRzXCIsXG4gICAgXCJpbnZhbGlkX3JldHVybl90eXBlXCIsXG4gICAgXCJpbnZhbGlkX2RhdGVcIixcbiAgICBcImludmFsaWRfc3RyaW5nXCIsXG4gICAgXCJ0b29fc21hbGxcIixcbiAgICBcInRvb19iaWdcIixcbiAgICBcImludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzXCIsXG4gICAgXCJub3RfbXVsdGlwbGVfb2ZcIixcbiAgICBcIm5vdF9maW5pdGVcIixcbl0pO1xuY29uc3QgcXVvdGVsZXNzSnNvbiA9IChvYmopID0+IHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICByZXR1cm4ganNvbi5yZXBsYWNlKC9cIihbXlwiXSspXCI6L2csIFwiJDE6XCIpO1xufTtcbmV4cG9ydHMucXVvdGVsZXNzSnNvbiA9IHF1b3RlbGVzc0pzb247XG5jbGFzcyBab2RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihpc3N1ZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hZGRJc3N1ZSA9IChzdWIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCBzdWJdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZElzc3VlcyA9IChzdWJzID0gW10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCAuLi5zdWJzXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWN0dWFsUHJvdG8gPSBuZXcudGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJhbi9iYW5cbiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBhY3R1YWxQcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9fcHJvdG9fXyA9IGFjdHVhbFByb3RvO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWm9kRXJyb3JcIjtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBpc3N1ZXM7XG4gICAgfVxuICAgIGdldCBlcnJvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzc3VlcztcbiAgICB9XG4gICAgZm9ybWF0KF9tYXBwZXIpIHtcbiAgICAgICAgY29uc3QgbWFwcGVyID0gX21hcHBlciB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGlzc3VlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcykge1xuICAgICAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfdW5pb25cIikge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZS51bmlvbkVycm9ycy5tYXAocHJvY2Vzc0Vycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3JldHVybl90eXBlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLnJldHVyblR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9hcmd1bWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoaXNzdWUuYXJndW1lbnRzRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5wYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEVycm9ycy5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyciA9IGZpZWxkRXJyb3JzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaXNzdWUucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gaXNzdWUucGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gaXNzdWUucGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0eXBlb2YgZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodHlwZW9mIGVsID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zdCBlcnJvckFycmF5OiBhbnkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGVycm9yQXJyYXkuX2Vycm9ycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCBlcnJvckFycmF5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcHJvY2Vzc0Vycm9yKHRoaXMpO1xuICAgICAgICByZXR1cm4gZmllbGRFcnJvcnM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbiAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuaXNzdWVzLCB1dGlsXzEudXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIsIDIpO1xuICAgIH1cbiAgICBnZXQgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgZmxhdHRlbihtYXBwZXIgPSAoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybUVycm9ycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLmlzc3Vlcykge1xuICAgICAgICAgICAgaWYgKHN1Yi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gPSBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gfHwgW107XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybUVycm9ycy5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmb3JtRXJyb3JzLCBmaWVsZEVycm9ycyB9O1xuICAgIH1cbiAgICBnZXQgZm9ybUVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxhdHRlbigpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kRXJyb3IgPSBab2RFcnJvcjtcblpvZEVycm9yLmNyZWF0ZSA9IChpc3N1ZXMpID0+IHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihpc3N1ZXMpO1xuICAgIHJldHVybiBlcnJvcjtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RXJyb3JNYXAgPSBleHBvcnRzLnNldEVycm9yTWFwID0gZXhwb3J0cy5kZWZhdWx0RXJyb3JNYXAgPSB2b2lkIDA7XG5jb25zdCBlbl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xvY2FsZXMvZW5cIikpO1xuZXhwb3J0cy5kZWZhdWx0RXJyb3JNYXAgPSBlbl8xLmRlZmF1bHQ7XG5sZXQgb3ZlcnJpZGVFcnJvck1hcCA9IGVuXzEuZGVmYXVsdDtcbmZ1bmN0aW9uIHNldEVycm9yTWFwKG1hcCkge1xuICAgIG92ZXJyaWRlRXJyb3JNYXAgPSBtYXA7XG59XG5leHBvcnRzLnNldEVycm9yTWFwID0gc2V0RXJyb3JNYXA7XG5mdW5jdGlvbiBnZXRFcnJvck1hcCgpIHtcbiAgICByZXR1cm4gb3ZlcnJpZGVFcnJvck1hcDtcbn1cbmV4cG9ydHMuZ2V0RXJyb3JNYXAgPSBnZXRFcnJvck1hcDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZXJyb3JzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9oZWxwZXJzL3BhcnNlVXRpbFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaGVscGVycy90eXBlQWxpYXNlc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaGVscGVycy91dGlsXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90eXBlc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vWm9kRXJyb3JcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmVycm9yVXRpbCA9IHZvaWQgMDtcbnZhciBlcnJvclV0aWw7XG4oZnVuY3Rpb24gKGVycm9yVXRpbCkge1xuICAgIGVycm9yVXRpbC5lcnJUb09iaiA9IChtZXNzYWdlKSA9PiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZSB9IDogbWVzc2FnZSB8fCB7fTtcbiAgICBlcnJvclV0aWwudG9TdHJpbmcgPSAobWVzc2FnZSkgPT4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLm1lc3NhZ2U7XG59KShlcnJvclV0aWwgPSBleHBvcnRzLmVycm9yVXRpbCB8fCAoZXhwb3J0cy5lcnJvclV0aWwgPSB7fSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzQXN5bmMgPSBleHBvcnRzLmlzVmFsaWQgPSBleHBvcnRzLmlzRGlydHkgPSBleHBvcnRzLmlzQWJvcnRlZCA9IGV4cG9ydHMuT0sgPSBleHBvcnRzLkRJUlRZID0gZXhwb3J0cy5JTlZBTElEID0gZXhwb3J0cy5QYXJzZVN0YXR1cyA9IGV4cG9ydHMuYWRkSXNzdWVUb0NvbnRleHQgPSBleHBvcnRzLkVNUFRZX1BBVEggPSBleHBvcnRzLm1ha2VJc3N1ZSA9IHZvaWQgMDtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4uL2Vycm9yc1wiKTtcbmNvbnN0IGVuXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZXMvZW5cIikpO1xuY29uc3QgbWFrZUlzc3VlID0gKHBhcmFtcykgPT4ge1xuICAgIGNvbnN0IHsgZGF0YSwgcGF0aCwgZXJyb3JNYXBzLCBpc3N1ZURhdGEgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmdWxsUGF0aCA9IFsuLi5wYXRoLCAuLi4oaXNzdWVEYXRhLnBhdGggfHwgW10pXTtcbiAgICBjb25zdCBmdWxsSXNzdWUgPSB7XG4gICAgICAgIC4uLmlzc3VlRGF0YSxcbiAgICAgICAgcGF0aDogZnVsbFBhdGgsXG4gICAgfTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gXCJcIjtcbiAgICBjb25zdCBtYXBzID0gZXJyb3JNYXBzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSlcbiAgICAgICAgLnNsaWNlKClcbiAgICAgICAgLnJldmVyc2UoKTtcbiAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9IG1hcChmdWxsSXNzdWUsIHsgZGF0YSwgZGVmYXVsdEVycm9yOiBlcnJvck1lc3NhZ2UgfSkubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXNzdWVEYXRhLFxuICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICAgICAgbWVzc2FnZTogaXNzdWVEYXRhLm1lc3NhZ2UgfHwgZXJyb3JNZXNzYWdlLFxuICAgIH07XG59O1xuZXhwb3J0cy5tYWtlSXNzdWUgPSBtYWtlSXNzdWU7XG5leHBvcnRzLkVNUFRZX1BBVEggPSBbXTtcbmZ1bmN0aW9uIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgaXNzdWVEYXRhKSB7XG4gICAgY29uc3QgaXNzdWUgPSAoMCwgZXhwb3J0cy5tYWtlSXNzdWUpKHtcbiAgICAgICAgaXNzdWVEYXRhOiBpc3N1ZURhdGEsXG4gICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCxcbiAgICAgICAgICAgICgwLCBlcnJvcnNfMS5nZXRFcnJvck1hcCkoKSxcbiAgICAgICAgICAgIGVuXzEuZGVmYXVsdCwgLy8gdGhlbiBnbG9iYWwgZGVmYXVsdCBtYXBcbiAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgfSk7XG4gICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaChpc3N1ZSk7XG59XG5leHBvcnRzLmFkZElzc3VlVG9Db250ZXh0ID0gYWRkSXNzdWVUb0NvbnRleHQ7XG5jbGFzcyBQYXJzZVN0YXR1cyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcInZhbGlkXCI7XG4gICAgfVxuICAgIGRpcnR5KCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSA9PT0gXCJ2YWxpZFwiKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiZGlydHlcIjtcbiAgICB9XG4gICAgYWJvcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcImFib3J0ZWRcIjtcbiAgICB9XG4gICAgc3RhdGljIG1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IGFycmF5VmFsdWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgYXJyYXlWYWx1ZS5wdXNoKHMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogYXJyYXlWYWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKSB7XG4gICAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgIHN5bmNQYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IGF3YWl0IHBhaXIua2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBhd2FpdCBwYWlyLnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7XG4gICAgfVxuICAgIHN0YXRpYyBtZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycykge1xuICAgICAgICBjb25zdCBmaW5hbE9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcGFpcjtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5JTlZBTElEO1xuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBpZiAoa2V5LnZhbHVlICE9PSBcIl9fcHJvdG9fX1wiICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiB2YWx1ZS52YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiB8fCBwYWlyLmFsd2F5c1NldCkpIHtcbiAgICAgICAgICAgICAgICBmaW5hbE9iamVjdFtrZXkudmFsdWVdID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBmaW5hbE9iamVjdCB9O1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyc2VTdGF0dXMgPSBQYXJzZVN0YXR1cztcbmV4cG9ydHMuSU5WQUxJRCA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0YXR1czogXCJhYm9ydGVkXCIsXG59KTtcbmNvbnN0IERJUlRZID0gKHZhbHVlKSA9PiAoeyBzdGF0dXM6IFwiZGlydHlcIiwgdmFsdWUgfSk7XG5leHBvcnRzLkRJUlRZID0gRElSVFk7XG5jb25zdCBPSyA9ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlIH0pO1xuZXhwb3J0cy5PSyA9IE9LO1xuY29uc3QgaXNBYm9ydGVkID0gKHgpID0+IHguc3RhdHVzID09PSBcImFib3J0ZWRcIjtcbmV4cG9ydHMuaXNBYm9ydGVkID0gaXNBYm9ydGVkO1xuY29uc3QgaXNEaXJ0eSA9ICh4KSA9PiB4LnN0YXR1cyA9PT0gXCJkaXJ0eVwiO1xuZXhwb3J0cy5pc0RpcnR5ID0gaXNEaXJ0eTtcbmNvbnN0IGlzVmFsaWQgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwidmFsaWRcIjtcbmV4cG9ydHMuaXNWYWxpZCA9IGlzVmFsaWQ7XG5jb25zdCBpc0FzeW5jID0gKHgpID0+IHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHggaW5zdGFuY2VvZiBQcm9taXNlO1xuZXhwb3J0cy5pc0FzeW5jID0gaXNBc3luYztcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFBhcnNlZFR5cGUgPSBleHBvcnRzLlpvZFBhcnNlZFR5cGUgPSBleHBvcnRzLm9iamVjdFV0aWwgPSBleHBvcnRzLnV0aWwgPSB2b2lkIDA7XG52YXIgdXRpbDtcbihmdW5jdGlvbiAodXRpbCkge1xuICAgIHV0aWwuYXNzZXJ0RXF1YWwgPSAodmFsKSA9PiB2YWw7XG4gICAgZnVuY3Rpb24gYXNzZXJ0SXMoX2FyZykgeyB9XG4gICAgdXRpbC5hc3NlcnRJcyA9IGFzc2VydElzO1xuICAgIGZ1bmN0aW9uIGFzc2VydE5ldmVyKF94KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydE5ldmVyID0gYXNzZXJ0TmV2ZXI7XG4gICAgdXRpbC5hcnJheVRvRW51bSA9IChpdGVtcykgPT4ge1xuICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBvYmpbaXRlbV0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICB1dGlsLmdldFZhbGlkRW51bVZhbHVlcyA9IChvYmopID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRLZXlzID0gdXRpbC5vYmplY3RLZXlzKG9iaikuZmlsdGVyKChrKSA9PiB0eXBlb2Ygb2JqW29ialtrXV0gIT09IFwibnVtYmVyXCIpO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgdmFsaWRLZXlzKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFtrXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXRpbC5vYmplY3RWYWx1ZXMoZmlsdGVyZWQpO1xuICAgIH07XG4gICAgdXRpbC5vYmplY3RWYWx1ZXMgPSAob2JqKSA9PiB7XG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdEtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmpbZV07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdXRpbC5vYmplY3RLZXlzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSBcImZ1bmN0aW9uXCIgLy8gZXNsaW50LWRpc2FibGUtbGluZSBiYW4vYmFuXG4gICAgICAgID8gKG9iaikgPT4gT2JqZWN0LmtleXMob2JqKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgOiAob2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfTtcbiAgICB1dGlsLmZpbmQgPSAoYXJyLCBjaGVja2VyKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChjaGVja2VyKGl0ZW0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICB1dGlsLmlzSW50ZWdlciA9IHR5cGVvZiBOdW1iZXIuaXNJbnRlZ2VyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyAodmFsKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHZhbCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBiYW4vYmFuXG4gICAgICAgIDogKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiAmJiBpc0Zpbml0ZSh2YWwpICYmIE1hdGguZmxvb3IodmFsKSA9PT0gdmFsO1xuICAgIGZ1bmN0aW9uIGpvaW5WYWx1ZXMoYXJyYXksIHNlcGFyYXRvciA9IFwiIHwgXCIpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5XG4gICAgICAgICAgICAubWFwKCh2YWwpID0+ICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCcke3ZhbH0nYCA6IHZhbCkpXG4gICAgICAgICAgICAuam9pbihzZXBhcmF0b3IpO1xuICAgIH1cbiAgICB1dGlsLmpvaW5WYWx1ZXMgPSBqb2luVmFsdWVzO1xuICAgIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyID0gKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xufSkodXRpbCA9IGV4cG9ydHMudXRpbCB8fCAoZXhwb3J0cy51dGlsID0ge30pKTtcbnZhciBvYmplY3RVdGlsO1xuKGZ1bmN0aW9uIChvYmplY3RVdGlsKSB7XG4gICAgb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyA9IChmaXJzdCwgc2Vjb25kKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5maXJzdCxcbiAgICAgICAgICAgIC4uLnNlY29uZCwgLy8gc2Vjb25kIG92ZXJ3cml0ZXMgZmlyc3RcbiAgICAgICAgfTtcbiAgICB9O1xufSkob2JqZWN0VXRpbCA9IGV4cG9ydHMub2JqZWN0VXRpbCB8fCAoZXhwb3J0cy5vYmplY3RVdGlsID0ge30pKTtcbmV4cG9ydHMuWm9kUGFyc2VkVHlwZSA9IHV0aWwuYXJyYXlUb0VudW0oW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJuYW5cIixcbiAgICBcIm51bWJlclwiLFxuICAgIFwiaW50ZWdlclwiLFxuICAgIFwiZmxvYXRcIixcbiAgICBcImJvb2xlYW5cIixcbiAgICBcImRhdGVcIixcbiAgICBcImJpZ2ludFwiLFxuICAgIFwic3ltYm9sXCIsXG4gICAgXCJmdW5jdGlvblwiLFxuICAgIFwidW5kZWZpbmVkXCIsXG4gICAgXCJudWxsXCIsXG4gICAgXCJhcnJheVwiLFxuICAgIFwib2JqZWN0XCIsXG4gICAgXCJ1bmtub3duXCIsXG4gICAgXCJwcm9taXNlXCIsXG4gICAgXCJ2b2lkXCIsXG4gICAgXCJuZXZlclwiLFxuICAgIFwibWFwXCIsXG4gICAgXCJzZXRcIixcbl0pO1xuY29uc3QgZ2V0UGFyc2VkVHlwZSA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiBkYXRhO1xuICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLnVuZGVmaW5lZDtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuWm9kUGFyc2VkVHlwZS5zdHJpbmc7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBpc05hTihkYXRhKSA/IGV4cG9ydHMuWm9kUGFyc2VkVHlwZS5uYW4gOiBleHBvcnRzLlpvZFBhcnNlZFR5cGUubnVtYmVyO1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuWm9kUGFyc2VkVHlwZS5ib29sZWFuO1xuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUuZnVuY3Rpb247XG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUuYmlnaW50O1xuICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLnN5bWJvbDtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLmFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLm51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50aGVuICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGRhdGEudGhlbiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgZGF0YS5jYXRjaCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBkYXRhLmNhdGNoID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLnByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuWm9kUGFyc2VkVHlwZS5tYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIFNldCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuWm9kUGFyc2VkVHlwZS5zZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIERhdGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLmRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLm9iamVjdDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUudW5rbm93bjtcbiAgICB9XG59O1xuZXhwb3J0cy5nZXRQYXJzZWRUeXBlID0gZ2V0UGFyc2VkVHlwZTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy56ID0gdm9pZCAwO1xuY29uc3QgeiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9leHRlcm5hbFwiKSk7XG5leHBvcnRzLnogPSB6O1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpLCBleHBvcnRzKTtcbmV4cG9ydHMuZGVmYXVsdCA9IHo7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL3V0aWxcIik7XG5jb25zdCBab2RFcnJvcl8xID0gcmVxdWlyZShcIi4uL1pvZEVycm9yXCIpO1xuY29uc3QgZXJyb3JNYXAgPSAoaXNzdWUsIF9jdHgpID0+IHtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBzd2l0Y2ggKGlzc3VlLmNvZGUpIHtcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGU6XG4gICAgICAgICAgICBpZiAoaXNzdWUucmVjZWl2ZWQgPT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIlJlcXVpcmVkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEV4cGVjdGVkICR7aXNzdWUuZXhwZWN0ZWR9LCByZWNlaXZlZCAke2lzc3VlLnJlY2VpdmVkfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX2xpdGVyYWw6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgbGl0ZXJhbCB2YWx1ZSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShpc3N1ZS5leHBlY3RlZCwgdXRpbF8xLnV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudW5yZWNvZ25pemVkX2tleXM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYFVucmVjb2duaXplZCBrZXkocykgaW4gb2JqZWN0OiAke3V0aWxfMS51dGlsLmpvaW5WYWx1ZXMoaXNzdWUua2V5cywgXCIsIFwiKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3I6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZGlzY3JpbWluYXRvciB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsXzEudXRpbC5qb2luVmFsdWVzKGlzc3VlLm9wdGlvbnMpfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX2VudW1fdmFsdWU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsXzEudXRpbC5qb2luVmFsdWVzKGlzc3VlLm9wdGlvbnMpfSwgcmVjZWl2ZWQgJyR7aXNzdWUucmVjZWl2ZWR9J2A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX2FyZ3VtZW50czpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBmdW5jdGlvbiBhcmd1bWVudHNgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBmdW5jdGlvbiByZXR1cm4gdHlwZWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX2RhdGU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZGF0ZWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZzpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUudmFsaWRhdGlvbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChcImluY2x1ZGVzXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSBcIiR7aXNzdWUudmFsaWRhdGlvbi5pbmNsdWRlc31cImA7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUudmFsaWRhdGlvbi5wb3NpdGlvbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGAke21lc3NhZ2V9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9ufWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXCJzdGFydHNXaXRoXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3Qgc3RhcnQgd2l0aCBcIiR7aXNzdWUudmFsaWRhdGlvbi5zdGFydHNXaXRofVwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXCJlbmRzV2l0aFwiIGluIGlzc3VlLnZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoIFwiJHtpc3N1ZS52YWxpZGF0aW9uLmVuZHNXaXRofVwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHV0aWxfMS51dGlsLmFzc2VydE5ldmVyKGlzc3VlLnZhbGlkYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnZhbGlkYXRpb24gIT09IFwicmVnZXhcIikge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCAke2lzc3VlLnZhbGlkYXRpb259YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19zbWFsbDpcbiAgICAgICAgICAgIGlmIChpc3N1ZS50eXBlID09PSBcImFycmF5XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IFwiZXhhY3RseVwiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBtb3JlIHRoYW5gfSAke2lzc3VlLm1pbmltdW19IGVsZW1lbnQocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IFwiZXhhY3RseVwiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBvdmVyYH0gJHtpc3N1ZS5taW5pbXVtfSBjaGFyYWN0ZXIocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseSBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgZ3JlYXRlciB0aGFuIGB9JHtpc3N1ZS5taW5pbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImRhdGVcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHkgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGdyZWF0ZXIgdGhhbiBgfSR7bmV3IERhdGUoTnVtYmVyKGlzc3VlLm1pbmltdW0pKX1gO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19iaWc6XG4gICAgICAgICAgICBpZiAoaXNzdWUudHlwZSA9PT0gXCJhcnJheVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbW9zdGAgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfSBlbGVtZW50KHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbW9zdGAgOiBgdW5kZXJgfSAke2lzc3VlLm1heGltdW19IGNoYXJhY3RlcihzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5YFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImJpZ2ludFwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQmlnSW50IG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5YFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImRhdGVcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHlgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG9gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBzbWFsbGVyIHRoYW5gfSAke25ldyBEYXRlKE51bWJlcihpc3N1ZS5tYXhpbXVtKSl9YDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5jdXN0b206XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludGVyc2VjdGlvbiByZXN1bHRzIGNvdWxkIG5vdCBiZSBtZXJnZWRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7aXNzdWUubXVsdGlwbGVPZn1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUubm90X2Zpbml0ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBcIk51bWJlciBtdXN0IGJlIGZpbml0ZVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBtZXNzYWdlID0gX2N0eC5kZWZhdWx0RXJyb3I7XG4gICAgICAgICAgICB1dGlsXzEudXRpbC5hc3NlcnROZXZlcihpc3N1ZSk7XG4gICAgfVxuICAgIHJldHVybiB7IG1lc3NhZ2UgfTtcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBlcnJvck1hcDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kYXRlID0gZXhwb3J0cy5ib29sZWFuID0gZXhwb3J0cy5iaWdpbnQgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5hbnkgPSBleHBvcnRzLmNvZXJjZSA9IGV4cG9ydHMuWm9kRmlyc3RQYXJ0eVR5cGVLaW5kID0gZXhwb3J0cy5sYXRlID0gZXhwb3J0cy5ab2RTY2hlbWEgPSBleHBvcnRzLlNjaGVtYSA9IGV4cG9ydHMuY3VzdG9tID0gZXhwb3J0cy5ab2RSZWFkb25seSA9IGV4cG9ydHMuWm9kUGlwZWxpbmUgPSBleHBvcnRzLlpvZEJyYW5kZWQgPSBleHBvcnRzLkJSQU5EID0gZXhwb3J0cy5ab2ROYU4gPSBleHBvcnRzLlpvZENhdGNoID0gZXhwb3J0cy5ab2REZWZhdWx0ID0gZXhwb3J0cy5ab2ROdWxsYWJsZSA9IGV4cG9ydHMuWm9kT3B0aW9uYWwgPSBleHBvcnRzLlpvZFRyYW5zZm9ybWVyID0gZXhwb3J0cy5ab2RFZmZlY3RzID0gZXhwb3J0cy5ab2RQcm9taXNlID0gZXhwb3J0cy5ab2ROYXRpdmVFbnVtID0gZXhwb3J0cy5ab2RFbnVtID0gZXhwb3J0cy5ab2RMaXRlcmFsID0gZXhwb3J0cy5ab2RMYXp5ID0gZXhwb3J0cy5ab2RGdW5jdGlvbiA9IGV4cG9ydHMuWm9kU2V0ID0gZXhwb3J0cy5ab2RNYXAgPSBleHBvcnRzLlpvZFJlY29yZCA9IGV4cG9ydHMuWm9kVHVwbGUgPSBleHBvcnRzLlpvZEludGVyc2VjdGlvbiA9IGV4cG9ydHMuWm9kRGlzY3JpbWluYXRlZFVuaW9uID0gZXhwb3J0cy5ab2RVbmlvbiA9IGV4cG9ydHMuWm9kT2JqZWN0ID0gZXhwb3J0cy5ab2RBcnJheSA9IGV4cG9ydHMuWm9kVm9pZCA9IGV4cG9ydHMuWm9kTmV2ZXIgPSBleHBvcnRzLlpvZFVua25vd24gPSBleHBvcnRzLlpvZEFueSA9IGV4cG9ydHMuWm9kTnVsbCA9IGV4cG9ydHMuWm9kVW5kZWZpbmVkID0gZXhwb3J0cy5ab2RTeW1ib2wgPSBleHBvcnRzLlpvZERhdGUgPSBleHBvcnRzLlpvZEJvb2xlYW4gPSBleHBvcnRzLlpvZEJpZ0ludCA9IGV4cG9ydHMuWm9kTnVtYmVyID0gZXhwb3J0cy5ab2RTdHJpbmcgPSBleHBvcnRzLlpvZFR5cGUgPSB2b2lkIDA7XG5leHBvcnRzLk5FVkVSID0gZXhwb3J0cy52b2lkID0gZXhwb3J0cy51bmtub3duID0gZXhwb3J0cy51bmlvbiA9IGV4cG9ydHMudW5kZWZpbmVkID0gZXhwb3J0cy50dXBsZSA9IGV4cG9ydHMudHJhbnNmb3JtZXIgPSBleHBvcnRzLnN5bWJvbCA9IGV4cG9ydHMuc3RyaW5nID0gZXhwb3J0cy5zdHJpY3RPYmplY3QgPSBleHBvcnRzLnNldCA9IGV4cG9ydHMucmVjb3JkID0gZXhwb3J0cy5wcm9taXNlID0gZXhwb3J0cy5wcmVwcm9jZXNzID0gZXhwb3J0cy5waXBlbGluZSA9IGV4cG9ydHMub3N0cmluZyA9IGV4cG9ydHMub3B0aW9uYWwgPSBleHBvcnRzLm9udW1iZXIgPSBleHBvcnRzLm9ib29sZWFuID0gZXhwb3J0cy5vYmplY3QgPSBleHBvcnRzLm51bWJlciA9IGV4cG9ydHMubnVsbGFibGUgPSBleHBvcnRzLm51bGwgPSBleHBvcnRzLm5ldmVyID0gZXhwb3J0cy5uYXRpdmVFbnVtID0gZXhwb3J0cy5uYW4gPSBleHBvcnRzLm1hcCA9IGV4cG9ydHMubGl0ZXJhbCA9IGV4cG9ydHMubGF6eSA9IGV4cG9ydHMuaW50ZXJzZWN0aW9uID0gZXhwb3J0cy5pbnN0YW5jZW9mID0gZXhwb3J0cy5mdW5jdGlvbiA9IGV4cG9ydHMuZW51bSA9IGV4cG9ydHMuZWZmZWN0ID0gZXhwb3J0cy5kaXNjcmltaW5hdGVkVW5pb24gPSB2b2lkIDA7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGVycm9yVXRpbF8xID0gcmVxdWlyZShcIi4vaGVscGVycy9lcnJvclV0aWxcIik7XG5jb25zdCBwYXJzZVV0aWxfMSA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvcGFyc2VVdGlsXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vaGVscGVycy91dGlsXCIpO1xuY29uc3QgWm9kRXJyb3JfMSA9IHJlcXVpcmUoXCIuL1pvZEVycm9yXCIpO1xuY2xhc3MgUGFyc2VJbnB1dExhenlQYXRoIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHZhbHVlLCBwYXRoLCBrZXkpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkUGF0aCA9IFtdO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3BhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLl9rZXkgPSBrZXk7XG4gICAgfVxuICAgIGdldCBwYXRoKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlZFBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fa2V5IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgLi4udGhpcy5fa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCB0aGlzLl9rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRQYXRoO1xuICAgIH1cbn1cbmNvbnN0IGhhbmRsZVJlc3VsdCA9IChjdHgsIHJlc3VsdCkgPT4ge1xuICAgIGlmICgoMCwgcGFyc2VVdGlsXzEuaXNWYWxpZCkocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHQudmFsdWUgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Vycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3JfMS5ab2RFcnJvcihjdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykge1xuICAgIGlmICghcGFyYW1zKVxuICAgICAgICByZXR1cm4ge307XG4gICAgY29uc3QgeyBlcnJvck1hcCwgaW52YWxpZF90eXBlX2Vycm9yLCByZXF1aXJlZF9lcnJvciwgZGVzY3JpcHRpb24gfSA9IHBhcmFtcztcbiAgICBpZiAoZXJyb3JNYXAgJiYgKGludmFsaWRfdHlwZV9lcnJvciB8fCByZXF1aXJlZF9lcnJvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgXCJpbnZhbGlkX3R5cGVfZXJyb3JcIiBvciBcInJlcXVpcmVkX2Vycm9yXCIgaW4gY29uanVuY3Rpb24gd2l0aCBjdXN0b20gZXJyb3IgbWFwLmApO1xuICAgIH1cbiAgICBpZiAoZXJyb3JNYXApXG4gICAgICAgIHJldHVybiB7IGVycm9yTWFwOiBlcnJvck1hcCwgZGVzY3JpcHRpb24gfTtcbiAgICBjb25zdCBjdXN0b21NYXAgPSAoaXNzLCBjdHgpID0+IHtcbiAgICAgICAgaWYgKGlzcy5jb2RlICE9PSBcImludmFsaWRfdHlwZVwiKVxuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiByZXF1aXJlZF9lcnJvciAhPT0gbnVsbCAmJiByZXF1aXJlZF9lcnJvciAhPT0gdm9pZCAwID8gcmVxdWlyZWRfZXJyb3IgOiBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogaW52YWxpZF90eXBlX2Vycm9yICE9PSBudWxsICYmIGludmFsaWRfdHlwZV9lcnJvciAhPT0gdm9pZCAwID8gaW52YWxpZF90eXBlX2Vycm9yIDogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgIH07XG4gICAgcmV0dXJuIHsgZXJyb3JNYXA6IGN1c3RvbU1hcCwgZGVzY3JpcHRpb24gfTtcbn1cbmNsYXNzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGRlZikge1xuICAgICAgICAvKiogQWxpYXMgb2Ygc2FmZVBhcnNlQXN5bmMgKi9cbiAgICAgICAgdGhpcy5zcGEgPSB0aGlzLnNhZmVQYXJzZUFzeW5jO1xuICAgICAgICB0aGlzLl9kZWYgPSBkZWY7XG4gICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlID0gdGhpcy5zYWZlUGFyc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wYXJzZUFzeW5jID0gdGhpcy5wYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlQXN5bmMgPSB0aGlzLnNhZmVQYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3BhID0gdGhpcy5zcGEuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZpbmUgPSB0aGlzLnJlZmluZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZmluZW1lbnQgPSB0aGlzLnJlZmluZW1lbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zdXBlclJlZmluZSA9IHRoaXMuc3VwZXJSZWZpbmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IHRoaXMub3B0aW9uYWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsYWJsZSA9IHRoaXMubnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsaXNoID0gdGhpcy5udWxsaXNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYXJyYXkgPSB0aGlzLmFycmF5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IHRoaXMucHJvbWlzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9yID0gdGhpcy5vci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFuZCA9IHRoaXMuYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5icmFuZCA9IHRoaXMuYnJhbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZWZhdWx0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2F0Y2ggPSB0aGlzLmNhdGNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVzY3JpYmUgPSB0aGlzLmRlc2NyaWJlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGlwZSA9IHRoaXMucGlwZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSB0aGlzLmlzTnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc09wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgX2dldFR5cGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuICgwLCB1dGlsXzEuZ2V0UGFyc2VkVHlwZSkoaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIF9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KSB7XG4gICAgICAgIHJldHVybiAoY3R4IHx8IHtcbiAgICAgICAgICAgIGNvbW1vbjogaW5wdXQucGFyZW50LmNvbW1vbixcbiAgICAgICAgICAgIGRhdGE6IGlucHV0LmRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiAoMCwgdXRpbF8xLmdldFBhcnNlZFR5cGUpKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhdGg6IGlucHV0LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogbmV3IHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzKCksXG4gICAgICAgICAgICBjdHg6IHtcbiAgICAgICAgICAgICAgICBjb21tb246IGlucHV0LnBhcmVudC5jb21tb24sXG4gICAgICAgICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSxcbiAgICAgICAgICAgICAgICBwYXJzZWRUeXBlOiAoMCwgdXRpbF8xLmdldFBhcnNlZFR5cGUpKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9wYXJzZVN5bmMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAoKDAsIHBhcnNlVXRpbF8xLmlzQXN5bmMpKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNocm9ub3VzIHBhcnNlIGVuY291bnRlcmVkIHByb21pc2UuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIF9wYXJzZUFzeW5jKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlKGlucHV0KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cbiAgICBwYXJzZShkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zYWZlUGFyc2UoZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgfVxuICAgIHNhZmVQYXJzZShkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgIGFzeW5jOiAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuYXN5bmMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbnRleHR1YWxFcnJvck1hcDogcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmVycm9yTWFwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhdGg6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMucGF0aCkgfHwgW10sXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6ICgwLCB1dGlsXzEuZ2V0UGFyc2VkVHlwZSkoZGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlU3luYyh7IGRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3VsdChjdHgsIHJlc3VsdCk7XG4gICAgfVxuICAgIGFzeW5jIHBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgfVxuICAgIGFzeW5jIHNhZmVQYXJzZUFzeW5jKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgIGNvbnRleHR1YWxFcnJvck1hcDogcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmVycm9yTWFwLFxuICAgICAgICAgICAgICAgIGFzeW5jOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhdGg6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMucGF0aCkgfHwgW10sXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6ICgwLCB1dGlsXzEuZ2V0UGFyc2VkVHlwZSkoZGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1heWJlQXN5bmNSZXN1bHQgPSB0aGlzLl9wYXJzZSh7IGRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgKCgwLCBwYXJzZVV0aWxfMS5pc0FzeW5jKShtYXliZUFzeW5jUmVzdWx0KVxuICAgICAgICAgICAgPyBtYXliZUFzeW5jUmVzdWx0XG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShtYXliZUFzeW5jUmVzdWx0KSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpO1xuICAgIH1cbiAgICByZWZpbmUoY2hlY2ssIG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZ2V0SXNzdWVQcm9wZXJ0aWVzID0gKHZhbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBtZXNzYWdlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVjayh2YWwpO1xuICAgICAgICAgICAgY29uc3Qgc2V0RXJyb3IgPSAoKSA9PiBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgICAgICAuLi5nZXRJc3N1ZVByb3BlcnRpZXModmFsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZmluZW1lbnQoY2hlY2ssIHJlZmluZW1lbnREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KCh2YWwsIGN0eCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjaGVjayh2YWwpKSB7XG4gICAgICAgICAgICAgICAgY3R4LmFkZElzc3VlKHR5cGVvZiByZWZpbmVtZW50RGF0YSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVmaW5lbWVudERhdGEodmFsLCBjdHgpXG4gICAgICAgICAgICAgICAgICAgIDogcmVmaW5lbWVudERhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3JlZmluZW1lbnQocmVmaW5lbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicmVmaW5lbWVudFwiLCByZWZpbmVtZW50IH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdXBlclJlZmluZShyZWZpbmVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KHJlZmluZW1lbnQpO1xuICAgIH1cbiAgICBvcHRpb25hbCgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE9wdGlvbmFsLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsaXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udWxsYWJsZSgpLm9wdGlvbmFsKCk7XG4gICAgfVxuICAgIGFycmF5KCkge1xuICAgICAgICByZXR1cm4gWm9kQXJyYXkuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiBab2RQcm9taXNlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBvcihvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIFpvZFVuaW9uLmNyZWF0ZShbdGhpcywgb3B0aW9uXSwgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgYW5kKGluY29taW5nKSB7XG4gICAgICAgIHJldHVybiBab2RJbnRlcnNlY3Rpb24uY3JlYXRlKHRoaXMsIGluY29taW5nLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZhdWx0KGRlZikge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQnJhbmRlZCh7XG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJyYW5kZWQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2goZGVmKSB7XG4gICAgICAgIGNvbnN0IGNhdGNoVmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgICAgICAgIGNhdGNoVmFsdWU6IGNhdGNoVmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlc2NyaWJlKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IFRoaXMgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IFRoaXMoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaXBlKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gWm9kUGlwZWxpbmUuY3JlYXRlKHRoaXMsIHRhcmdldCk7XG4gICAgfVxuICAgIHJlYWRvbmx5KCkge1xuICAgICAgICByZXR1cm4gWm9kUmVhZG9ubHkuY3JlYXRlKHRoaXMpO1xuICAgIH1cbiAgICBpc09wdGlvbmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UodW5kZWZpbmVkKS5zdWNjZXNzO1xuICAgIH1cbiAgICBpc051bGxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2VzcztcbiAgICB9XG59XG5leHBvcnRzLlpvZFR5cGUgPSBab2RUeXBlO1xuZXhwb3J0cy5TY2hlbWEgPSBab2RUeXBlO1xuZXhwb3J0cy5ab2RTY2hlbWEgPSBab2RUeXBlO1xuY29uc3QgY3VpZFJlZ2V4ID0gL15jW15cXHMtXXs4LH0kL2k7XG5jb25zdCBjdWlkMlJlZ2V4ID0gL15bYS16XVthLXowLTldKiQvO1xuY29uc3QgdWxpZFJlZ2V4ID0gL15bMC05QS1ISktNTlAtVFYtWl17MjZ9JC87XG4vLyBjb25zdCB1dWlkUmVnZXggPVxuLy8gICAvXihbYS1mMC05XXs4fS1bYS1mMC05XXs0fS1bMS01XVthLWYwLTldezN9LVthLWYwLTldezR9LVthLWYwLTldezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO1xuY29uc3QgdXVpZFJlZ2V4ID0gL15bMC05YS1mQS1GXXs4fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXsxMn0kL2k7XG4vLyBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjE4MS8xNTUwMTU1XG4vLyBvbGQgdmVyc2lvbjogdG9vIHNsb3csIGRpZG4ndCBzdXBwb3J0IHVuaWNvZGVcbi8vIGNvbnN0IGVtYWlsUmVnZXggPSAvXigoKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSsoXFwuKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSspKil8KChcXHgyMikoKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPygoW1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4N2ZdfFxceDIxfFtcXHgyMy1cXHg1Yl18W1xceDVkLVxceDdlXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KFxcXFwoW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBkLVxceDdmXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSkqKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPyhcXHgyMikpKUAoKChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuKSsoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSkkL2k7XG4vL29sZCBlbWFpbCByZWdleFxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKChbXjw+KClbXFxdLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF0uLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoPyEtKShbXjw+KClbXFxdLiw7Olxcc0BcIl0rXFwuKStbXjw+KClbXFxdLiw7Olxcc0BcIl17MSx9KVteLTw+KClbXFxdLiw7Olxcc0BcIl0kL2k7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXigoW148PigpW1xcXVxcXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKSopfChcXFwiLitcXFwiKSlAKChcXFsoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXF0pfChcXFtJUHY2OigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSlcXF0pfChbQS1aYS16MC05XShbQS1aYS16MC05LV0qW0EtWmEtejAtOV0pKihcXC5bQS1aYS16XXsyLH0pKykpJC87XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL15bYS16QS1aMC05XFwuXFwhXFwjXFwkXFwlXFwmXFwnXFwqXFwrXFwvXFw9XFw/XFxeXFxfXFxgXFx7XFx8XFx9XFx+XFwtXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSokLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXig/OlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcXC5bYS16MC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKSp8XCIoPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMVxceDIzLVxceDViXFx4NWQtXFx4N2ZdfFxcXFxbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGUtXFx4N2ZdKSpcIilAKD86KD86W2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP1xcLikrW2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP3xcXFsoPzooPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldP3xbYS16MC05LV0qW2EtejAtOV06KD86W1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4MjEtXFx4NWFcXHg1My1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKylcXF0pJC9pO1xuY29uc3QgZW1haWxSZWdleCA9IC9eKD8hXFwuKSg/IS4qXFwuXFwuKShbQS1aMC05XystXFwuXSopW0EtWjAtOV8rLV1AKFtBLVowLTldW0EtWjAtOVxcLV0qXFwuKStbQS1aXXsyLH0kL2k7XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL15bYS16MC05LiEjJCUm4oCZKisvPT9eX2B7fH1+LV0rQFthLXowLTktXSsoPzpcXC5bYS16MC05XFwtXSspKiQvaTtcbi8vIGZyb20gaHR0cHM6Ly90aGVrZXZpbnNjb3R0LmNvbS9lbW9qaXMtaW4tamF2YXNjcmlwdC8jd3JpdGluZy1hLXJlZ3VsYXItZXhwcmVzc2lvblxuY29uc3QgX2Vtb2ppUmVnZXggPSBgXihcXFxccHtFeHRlbmRlZF9QaWN0b2dyYXBoaWN9fFxcXFxwe0Vtb2ppX0NvbXBvbmVudH0pKyRgO1xubGV0IGVtb2ppUmVnZXg7XG5jb25zdCBpcHY0UmVnZXggPSAvXigoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSQvO1xuY29uc3QgaXB2NlJlZ2V4ID0gL14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSkpJC87XG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMxNDMyMzFcbmNvbnN0IGRhdGV0aW1lUmVnZXggPSAoYXJncykgPT4ge1xuICAgIGlmIChhcmdzLnByZWNpc2lvbikge1xuICAgICAgICBpZiAoYXJncy5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn1cXFxcLlxcXFxkeyR7YXJncy5wcmVjaXNpb259fSgoWystXVxcXFxkezJ9KDo/XFxcXGR7Mn0pPyl8WikkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9XFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1aJGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3MucHJlY2lzaW9uID09PSAwKSB7XG4gICAgICAgIGlmIChhcmdzLm9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5cXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfVRcXFxcZHsyfTpcXFxcZHsyfTpcXFxcZHsyfSgoWystXVxcXFxkezJ9KDo/XFxcXGR7Mn0pPyl8WikkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9WiRgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGFyZ3Mub2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9KFxcXFwuXFxcXGQrKT8oKFsrLV1cXFxcZHsyfSg6P1xcXFxkezJ9KT8pfFopJGApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5cXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfVRcXFxcZHsyfTpcXFxcZHsyfTpcXFxcZHsyfShcXFxcLlxcXFxkKyk/WiRgKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5mdW5jdGlvbiBpc1ZhbGlkSVAoaXAsIHZlcnNpb24pIHtcbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjRcIiB8fCAhdmVyc2lvbikgJiYgaXB2NFJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjZcIiB8fCAhdmVyc2lvbikgJiYgaXB2NlJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jbGFzcyBab2RTdHJpbmcgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBTdHJpbmcoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuc3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUuc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEubGVuZ3RoID4gY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJlbWFpbFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbWFpbFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImVtYWlsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtb2ppXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1vamlSZWdleCA9IG5ldyBSZWdFeHAoX2Vtb2ppUmVnZXgsIFwidVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFlbW9qaVJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImVtb2ppXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInV1aWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdXVpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInV1aWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiY3VpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdWlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkMlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdWlkMlJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImN1aWQyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInVsaWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdWxpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInVsaWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidXJsXCIpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBuZXcgVVJMKGlucHV0LmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJyZWdleFwiKSB7XG4gICAgICAgICAgICAgICAgY2hlY2sucmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gY2hlY2sucmVnZXgudGVzdChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInJlZ2V4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRyaW1cIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiaW5jbHVkZXNcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5pbmNsdWRlcyhjaGVjay52YWx1ZSwgY2hlY2sucG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IGluY2x1ZGVzOiBjaGVjay52YWx1ZSwgcG9zaXRpb246IGNoZWNrLnBvc2l0aW9uIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0b0xvd2VyQ2FzZVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidG9VcHBlckNhc2VcIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInN0YXJ0c1dpdGhcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5zdGFydHNXaXRoKGNoZWNrLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBzdGFydHNXaXRoOiBjaGVjay52YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW5kc1dpdGhcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5lbmRzV2l0aChjaGVjay52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgZW5kc1dpdGg6IGNoZWNrLnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJkYXRldGltZVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBkYXRldGltZVJlZ2V4KGNoZWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImlwXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRJUChpbnB1dC5kYXRhLCBjaGVjay52ZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiaXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWxfMS51dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgX3JlZ2V4KHJlZ2V4LCB2YWxpZGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmluZW1lbnQoKGRhdGEpID0+IHJlZ2V4LnRlc3QoZGF0YSksIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb24sXG4gICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbWFpbChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1haWxcIiwgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1cmwobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVybFwiLCAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGVtb2ppKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJlbW9qaVwiLCAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHV1aWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInV1aWRcIiwgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBjdWlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJjdWlkXCIsIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgY3VpZDIobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWQyXCIsIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdWxpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwidWxpZFwiLCAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGlwKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJpcFwiLCAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucykgfSk7XG4gICAgfVxuICAgIGRhdGV0aW1lKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0eXBlb2YgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24pID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sXG4gICAgICAgICAgICBvZmZzZXQ6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vZmZzZXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZ2V4KHJlZ2V4LCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcInJlZ2V4XCIsXG4gICAgICAgICAgICByZWdleDogcmVnZXgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbmNsdWRlcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJpbmNsdWRlc1wiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgcG9zaXRpb246IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wb3NpdGlvbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGFydHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcInN0YXJ0c1dpdGhcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVuZHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImVuZHNXaXRoXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IG1pbkxlbmd0aCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhMZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogbWF4TGVuZ3RoLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGVuZ3RoKGxlbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJsZW5ndGhcIixcbiAgICAgICAgICAgIHZhbHVlOiBsZW4sXG4gICAgICAgICAgICAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Ugei5zdHJpbmcoKS5taW4oMSkgaW5zdGVhZC5cbiAgICAgKiBAc2VlIHtAbGluayBab2RTdHJpbmcubWlufVxuICAgICAqL1xuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIGVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSk7XG4gICAgfVxuICAgIHRyaW0oKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0cmltXCIgfV0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b0xvd2VyQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRvTG93ZXJDYXNlXCIgfV0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b1VwcGVyQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRvVXBwZXJDYXNlXCIgfV0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgaXNEYXRldGltZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJkYXRldGltZVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRW1haWwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZW1haWxcIik7XG4gICAgfVxuICAgIGdldCBpc1VSTCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1cmxcIik7XG4gICAgfVxuICAgIGdldCBpc0Vtb2ppKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtb2ppXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInV1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQ1VJRDIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZDJcIik7XG4gICAgfVxuICAgIGdldCBpc1VMSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidWxpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzSVAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiaXBcIik7XG4gICAgfVxuICAgIGdldCBtaW5MZW5ndGgoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heExlbmd0aCgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kU3RyaW5nID0gWm9kU3RyaW5nO1xuWm9kU3RyaW5nLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFN0cmluZyxcbiAgICAgICAgY29lcmNlOiAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM5NjY0ODQvd2h5LWRvZXMtbW9kdWx1cy1vcGVyYXRvci1yZXR1cm4tZnJhY3Rpb25hbC1udW1iZXItaW4tamF2YXNjcmlwdC8zMTcxMTAzNCMzMTcxMTAzNFxuZnVuY3Rpb24gZmxvYXRTYWZlUmVtYWluZGVyKHZhbCwgc3RlcCkge1xuICAgIGNvbnN0IHZhbERlY0NvdW50ID0gKHZhbC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3Qgc3RlcERlY0NvdW50ID0gKHN0ZXAudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoO1xuICAgIGNvbnN0IGRlY0NvdW50ID0gdmFsRGVjQ291bnQgPiBzdGVwRGVjQ291bnQgPyB2YWxEZWNDb3VudCA6IHN0ZXBEZWNDb3VudDtcbiAgICBjb25zdCB2YWxJbnQgPSBwYXJzZUludCh2YWwudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIGNvbnN0IHN0ZXBJbnQgPSBwYXJzZUludChzdGVwLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICByZXR1cm4gKHZhbEludCAlIHN0ZXBJbnQpIC8gTWF0aC5wb3coMTAsIGRlY0NvdW50KTtcbn1cbmNsYXNzIFpvZE51bWJlciBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm1pbiA9IHRoaXMuZ3RlO1xuICAgICAgICB0aGlzLm1heCA9IHRoaXMubHRlO1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLm11bHRpcGxlT2Y7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IE51bWJlcihpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5udW1iZXIsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJpbnRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdXRpbF8xLnV0aWwuaXNJbnRlZ2VyKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IFwiZmxvYXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhIDwgY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhIDw9IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmxvYXRTYWZlUmVtYWluZGVyKGlucHV0LmRhdGEsIGNoZWNrLnZhbHVlKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZixcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlT2Y6IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZmluaXRlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLm5vdF9maW5pdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbF8xLnV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBndGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGd0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHRlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIHNldExpbWl0KGtpbmQsIHZhbHVlLCBpbmNsdXNpdmUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLmNoZWNrcyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJpbnRcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ubmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbXVsdGlwbGVPZih2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtdWx0aXBsZU9mXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmaW5pdGUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJmaW5pdGVcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNhZmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSkuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuICAgIGdldCBpc0ludCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJpbnRcIiB8fFxuICAgICAgICAgICAgKGNoLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiICYmIHV0aWxfMS51dGlsLmlzSW50ZWdlcihjaC52YWx1ZSkpKTtcbiAgICB9XG4gICAgZ2V0IGlzRmluaXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbCwgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJmaW5pdGVcIiB8fFxuICAgICAgICAgICAgICAgIGNoLmtpbmQgPT09IFwiaW50XCIgfHxcbiAgICAgICAgICAgICAgICBjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobWluKSAmJiBOdW1iZXIuaXNGaW5pdGUobWF4KTtcbiAgICB9XG59XG5leHBvcnRzLlpvZE51bWJlciA9IFpvZE51bWJlcjtcblpvZE51bWJlci5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bWJlcixcbiAgICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RCaWdJbnQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5taW4gPSB0aGlzLmd0ZTtcbiAgICAgICAgdGhpcy5tYXggPSB0aGlzLmx0ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gQmlnSW50KGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmJpZ2ludCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmJpZ2ludCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBwYXJzZVV0aWxfMS5QYXJzZVN0YXR1cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaGVjay5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhIDwgY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhIDw9IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YSAlIGNoZWNrLnZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2YsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZU9mOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsXzEudXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgZ3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgc2V0TGltaXQoa2luZCwgdmFsdWUsIGluY2x1c2l2ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEJpZ0ludCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ubmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtdWx0aXBsZU9mKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pblZhbHVlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhWYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kQmlnSW50ID0gWm9kQmlnSW50O1xuWm9kQmlnSW50LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJpZ0ludCxcbiAgICAgICAgY29lcmNlOiAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEJvb2xlYW4gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBCb29sZWFuKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmJvb2xlYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5ib29sZWFuLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgwLCBwYXJzZVV0aWxfMS5PSykoaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RCb29sZWFuID0gWm9kQm9vbGVhbjtcblpvZEJvb2xlYW4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQm9vbGVhbih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQm9vbGVhbixcbiAgICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2REYXRlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gbmV3IERhdGUoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmRhdGUsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYU4oaW5wdXQuZGF0YS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5nZXRUaW1lKCkgPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA+IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbF8xLnV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cy52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShpbnB1dC5kYXRhLmdldFRpbWUoKSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkRhdGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogbWluRGF0ZS5nZXRUaW1lKCksXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4RGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBtYXhEYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5EYXRlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCA/IG5ldyBEYXRlKG1pbikgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbWF4RGF0ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4ICE9IG51bGwgPyBuZXcgRGF0ZShtYXgpIDogbnVsbDtcbiAgICB9XG59XG5leHBvcnRzLlpvZERhdGUgPSBab2REYXRlO1xuWm9kRGF0ZS5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2REYXRlKHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGF0ZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFN5bWJvbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5zeW1ib2wpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5zeW1ib2wsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZFN5bWJvbCA9IFpvZFN5bWJvbDtcblpvZFN5bWJvbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RTeW1ib2woe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFN5bWJvbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFVuZGVmaW5lZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS51bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZFVuZGVmaW5lZCA9IFpvZFVuZGVmaW5lZDtcblpvZFVuZGVmaW5lZC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmRlZmluZWQoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVuZGVmaW5lZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE51bGwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUubnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm51bGwsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZE51bGwgPSBab2ROdWxsO1xuWm9kTnVsbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdWxsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQW55IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHRvIHByZXZlbnQgaW5zdGFuY2VzIG9mIG90aGVyIGNsYXNzZXMgZnJvbSBleHRlbmRpbmcgWm9kQW55LiB0aGlzIGNhdXNlcyBpc3N1ZXMgd2l0aCBjYXRjaGFsbCBpbiBab2RPYmplY3QuXG4gICAgICAgIHRoaXMuX2FueSA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZEFueSA9IFpvZEFueTtcblpvZEFueS5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RBbnkoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFueSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFVua25vd24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLy8gcmVxdWlyZWRcbiAgICAgICAgdGhpcy5fdW5rbm93biA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZFVua25vd24gPSBab2RVbmtub3duO1xuWm9kVW5rbm93bi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmtub3duKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmtub3duLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTmV2ZXIgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm5ldmVyLFxuICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgfVxufVxuZXhwb3J0cy5ab2ROZXZlciA9IFpvZE5ldmVyO1xuWm9kTmV2ZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmV2ZXIoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5ldmVyLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVm9pZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS52b2lkLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgwLCBwYXJzZVV0aWxfMS5PSykoaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RWb2lkID0gWm9kVm9pZDtcblpvZFZvaWQuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVm9pZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVm9pZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEFycmF5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4LCBzdGF0dXMgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMuX2RlZjtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmFycmF5LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5leGFjdExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gY3R4LmRhdGEubGVuZ3RoID4gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjdHguZGF0YS5sZW5ndGggPCBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdG9vQmlnID8gWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX2JpZyA6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogKHRvb1NtYWxsID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogKHRvb0JpZyA/IGRlZi5leGFjdExlbmd0aC52YWx1ZSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLmV4YWN0TGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5taW5MZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCBkZWYubWluTGVuZ3RoLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluTGVuZ3RoLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWluTGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5tYXhMZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPiBkZWYubWF4TGVuZ3RoLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heExlbmd0aC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1heExlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlQXN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSk7XG4gICAgICAgICAgICB9KSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VTeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgIH1cbiAgICBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiB7IHZhbHVlOiBtaW5MZW5ndGgsIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heExlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1heExlbmd0aDogeyB2YWx1ZTogbWF4TGVuZ3RoLCBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBleGFjdExlbmd0aDogeyB2YWx1ZTogbGVuLCBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kQXJyYXkgPSBab2RBcnJheTtcblpvZEFycmF5LmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICB0eXBlOiBzY2hlbWEsXG4gICAgICAgIG1pbkxlbmd0aDogbnVsbCxcbiAgICAgICAgbWF4TGVuZ3RoOiBudWxsLFxuICAgICAgICBleGFjdExlbmd0aDogbnVsbCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYSkge1xuICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RPYmplY3QpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLnNoYXBlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHNjaGVtYS5zaGFwZVtrZXldO1xuICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IFpvZE9wdGlvbmFsLmNyZWF0ZShkZWVwUGFydGlhbGlmeShmaWVsZFNjaGVtYSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnNjaGVtYS5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi5zY2hlbWEuX2RlZixcbiAgICAgICAgICAgIHR5cGU6IGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS5lbGVtZW50KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZFR1cGxlKSB7XG4gICAgICAgIHJldHVybiBab2RUdXBsZS5jcmVhdGUoc2NoZW1hLml0ZW1zLm1hcCgoaXRlbSkgPT4gZGVlcFBhcnRpYWxpZnkoaXRlbSkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfVxufVxuY2xhc3MgWm9kT2JqZWN0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX2NhY2hlZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBJbiBtb3N0IGNhc2VzLCB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQgLSB1bmtub3duIHByb3BlcnRpZXMgYXJlIG5vdyBzaWxlbnRseSBzdHJpcHBlZC5cbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gcGFzcyB0aHJvdWdoIHVua25vd24gcHJvcGVydGllcywgdXNlIGAucGFzc3Rocm91Z2goKWAgaW5zdGVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaDtcbiAgICAgICAgLy8gZXh0ZW5kPFxuICAgICAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlLFxuICAgICAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX291dHB1dFwiXVxuICAgICAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAgICAgLy8gICAgICAgPyBPdXRwdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PixcbiAgICAgICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfaW5wdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAgICAgLy8gICAgICAgPyBJbnB1dFtrXVxuICAgICAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgICAgICAvLyAgIH0+XG4gICAgICAgIC8vID4oXG4gICAgICAgIC8vICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gKTogWm9kT2JqZWN0PFxuICAgICAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIEF1Z21lbnRhdGlvbj4sXG4gICAgICAgIC8vICAgVW5rbm93bktleXMsXG4gICAgICAgIC8vICAgQ2F0Y2hhbGwsXG4gICAgICAgIC8vICAgTmV3T3V0cHV0LFxuICAgICAgICAvLyAgIE5ld0lucHV0XG4gICAgICAgIC8vID4ge1xuICAgICAgICAvLyAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgLy8gICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgLy8gICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAvLyAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgLy8gICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgICAgICAvLyAgICAgfSksXG4gICAgICAgIC8vICAgfSkgYXMgYW55O1xuICAgICAgICAvLyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYC5leHRlbmRgIGluc3RlYWRcbiAgICAgICAgICogICovXG4gICAgICAgIHRoaXMuYXVnbWVudCA9IHRoaXMuZXh0ZW5kO1xuICAgIH1cbiAgICBfZ2V0Q2FjaGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLl9kZWYuc2hhcGUoKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IHV0aWxfMS51dGlsLm9iamVjdEtleXMoc2hhcGUpO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2NhY2hlZCA9IHsgc2hhcGUsIGtleXMgfSk7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5vYmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCB7IHNoYXBlLCBrZXlzOiBzaGFwZUtleXMgfSA9IHRoaXMuX2dldENhY2hlZCgpO1xuICAgICAgICBjb25zdCBleHRyYUtleXMgPSBbXTtcbiAgICAgICAgaWYgKCEodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIgJiZcbiAgICAgICAgICAgIHRoaXMuX2RlZi51bmtub3duS2V5cyA9PT0gXCJzdHJpcFwiKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXBlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXBlS2V5cykge1xuICAgICAgICAgICAgY29uc3Qga2V5VmFsaWRhdG9yID0gc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTtcbiAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGtleSB9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXlWYWxpZGF0b3IuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIFpvZE5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB1bmtub3duS2V5cyA9IHRoaXMuX2RlZi51bmtub3duS2V5cztcbiAgICAgICAgICAgIGlmICh1bmtub3duS2V5cyA9PT0gXCJwYXNzdGhyb3VnaFwiKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXh0cmFLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGN0eC5kYXRhW2tleV0gfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwic3RyaWN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmFLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnVucmVjb2duaXplZF9rZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5czogZXh0cmFLZXlzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwic3RyaXBcIikge1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBydW4gY2F0Y2hhbGwgdmFsaWRhdGlvblxuICAgICAgICAgICAgY29uc3QgY2F0Y2hhbGwgPSB0aGlzLl9kZWYuY2F0Y2hhbGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGN0eC5kYXRhW2tleV07XG4gICAgICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGtleSB9LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0Y2hhbGwuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIGtleSkgLy8sIGN0eC5jaGlsZChrZXkpLCB2YWx1ZSwgZ2V0UGFyc2VkVHlwZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzeW5jUGFpcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgICAgIHN5bmNQYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhd2FpdCBwYWlyLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBwYWlyLmFsd2F5c1NldCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzeW5jUGFpcnM7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKChzeW5jUGFpcnMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgc3luY1BhaXJzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc2hhcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2hhcGUoKTtcbiAgICB9XG4gICAgc3RyaWN0KG1lc3NhZ2UpIHtcbiAgICAgICAgZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgICAgICAgICAgIC4uLihtZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNYXA6IChpc3N1ZSwgY3R4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0RXJyb3IgPSAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLl9kZWYpLmVycm9yTWFwKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgaXNzdWUsIGN0eCkubWVzc2FnZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3R4LmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcInVucmVjb2duaXplZF9rZXlzXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogKF9kID0gZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLm1lc3NhZ2UpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGRlZmF1bHRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWZhdWx0RXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0cmlwKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGFzc3Rocm91Z2goKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInBhc3N0aHJvdWdoXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBjb25zdCBBdWdtZW50RmFjdG9yeSA9XG4gICAgLy8gICA8RGVmIGV4dGVuZHMgWm9kT2JqZWN0RGVmPihkZWY6IERlZikgPT5cbiAgICAvLyAgIDxBdWdtZW50YXRpb24gZXh0ZW5kcyBab2RSYXdTaGFwZT4oXG4gICAgLy8gICAgIGF1Z21lbnRhdGlvbjogQXVnbWVudGF0aW9uXG4gICAgLy8gICApOiBab2RPYmplY3Q8XG4gICAgLy8gICAgIGV4dGVuZFNoYXBlPFJldHVyblR5cGU8RGVmW1wic2hhcGVcIl0+LCBBdWdtZW50YXRpb24+LFxuICAgIC8vICAgICBEZWZbXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgICAgRGVmW1wiY2F0Y2hhbGxcIl1cbiAgICAvLyAgID4gPT4ge1xuICAgIC8vICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgICAgLi4uZGVmLFxuICAgIC8vICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgIC8vICAgICAgICAgLi4uZGVmLnNoYXBlKCksXG4gICAgLy8gICAgICAgICAuLi5hdWdtZW50YXRpb24sXG4gICAgLy8gICAgICAgfSksXG4gICAgLy8gICAgIH0pIGFzIGFueTtcbiAgICAvLyAgIH07XG4gICAgZXh0ZW5kKGF1Z21lbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgICAgICAgICAuLi5hdWdtZW50YXRpb24sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaW9yIHRvIHpvZEAxLjAuMTIgdGhlcmUgd2FzIGEgYnVnIGluIHRoZVxuICAgICAqIGluZmVycmVkIHR5cGUgb2YgbWVyZ2VkIG9iamVjdHMuIFBsZWFzZVxuICAgICAqIHVwZ3JhZGUgaWYgeW91IGFyZSBleHBlcmllbmNpbmcgaXNzdWVzLlxuICAgICAqL1xuICAgIG1lcmdlKG1lcmdpbmcpIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgICAgIC4uLm1lcmdpbmcuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIC8vIG1lcmdlPFxuICAgIC8vICAgSW5jb21pbmcgZXh0ZW5kcyBBbnlab2RPYmplY3QsXG4gICAgLy8gICBBdWdtZW50YXRpb24gZXh0ZW5kcyBJbmNvbWluZ1tcInNoYXBlXCJdLFxuICAgIC8vICAgTmV3T3V0cHV0IGV4dGVuZHMge1xuICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfb3V0cHV0XCJdXG4gICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgT3V0cHV0XG4gICAgLy8gICAgICAgPyBPdXRwdXRba11cbiAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgIC8vICAgfSxcbiAgICAvLyAgIE5ld0lucHV0IGV4dGVuZHMge1xuICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9pbnB1dFwiXVxuICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIElucHV0XG4gICAgLy8gICAgICAgPyBJbnB1dFtrXVxuICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgLy8gICB9XG4gICAgLy8gPihcbiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gICAgLy8gKTogWm9kT2JqZWN0PFxuICAgIC8vICAgZXh0ZW5kU2hhcGU8VCwgUmV0dXJuVHlwZTxJbmNvbWluZ1tcIl9kZWZcIl1bXCJzaGFwZVwiXT4+LFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJjYXRjaGFsbFwiXSxcbiAgICAvLyAgIE5ld091dHB1dCxcbiAgICAvLyAgIE5ld0lucHV0XG4gICAgLy8gPiB7XG4gICAgLy8gICBjb25zdCBtZXJnZWQ6IGFueSA9IG5ldyBab2RPYmplY3Qoe1xuICAgIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAgIC8vICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgIC8vICAgICBzaGFwZTogKCkgPT5cbiAgICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksXG4gICAgLy8gICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgIC8vICAgfSkgYXMgYW55O1xuICAgIC8vICAgcmV0dXJuIG1lcmdlZDtcbiAgICAvLyB9XG4gICAgc2V0S2V5KGtleSwgc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1Z21lbnQoeyBba2V5XTogc2NoZW1hIH0pO1xuICAgIH1cbiAgICAvLyBtZXJnZTxJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdD4oXG4gICAgLy8gICBtZXJnaW5nOiBJbmNvbWluZ1xuICAgIC8vICk6IC8vWm9kT2JqZWN0PFQgJiBJbmNvbWluZ1tcIl9zaGFwZVwiXSwgVW5rbm93bktleXMsIENhdGNoYWxsPiA9IChtZXJnaW5nKSA9PiB7XG4gICAgLy8gWm9kT2JqZWN0PFxuICAgIC8vICAgZXh0ZW5kU2hhcGU8VCwgUmV0dXJuVHlwZTxJbmNvbWluZ1tcIl9kZWZcIl1bXCJzaGFwZVwiXT4+LFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJjYXRjaGFsbFwiXVxuICAgIC8vID4ge1xuICAgIC8vICAgLy8gY29uc3QgbWVyZ2VkU2hhcGUgPSBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKFxuICAgIC8vICAgLy8gICB0aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAvLyAgIC8vICAgbWVyZ2luZy5fZGVmLnNoYXBlKClcbiAgICAvLyAgIC8vICk7XG4gICAgLy8gICBjb25zdCBtZXJnZWQ6IGFueSA9IG5ldyBab2RPYmplY3Qoe1xuICAgIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAgIC8vICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgIC8vICAgICBzaGFwZTogKCkgPT5cbiAgICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksXG4gICAgLy8gICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgIC8vICAgfSkgYXMgYW55O1xuICAgIC8vICAgcmV0dXJuIG1lcmdlZDtcbiAgICAvLyB9XG4gICAgY2F0Y2hhbGwoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IGluZGV4LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGljayhtYXNrKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0ge307XG4gICAgICAgIHV0aWxfMS51dGlsLm9iamVjdEtleXMobWFzaykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAobWFza1trZXldICYmIHRoaXMuc2hhcGVba2V5XSkge1xuICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvbWl0KG1hc2spIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbF8xLnV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZGVlcFBhcnRpYWwoKSB7XG4gICAgICAgIHJldHVybiBkZWVwUGFydGlhbGlmeSh0aGlzKTtcbiAgICB9XG4gICAgcGFydGlhbChtYXNrKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIHV0aWxfMS51dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gZmllbGRTY2hlbWE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gZmllbGRTY2hlbWEub3B0aW9uYWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVpcmVkKG1hc2spIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbF8xLnV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IG5ld0ZpZWxkID0gZmllbGRTY2hlbWE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld0ZpZWxkIGluc3RhbmNlb2YgWm9kT3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RmllbGQgPSBuZXdGaWVsZC5fZGVmLmlubmVyVHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IG5ld0ZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAga2V5b2YoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVab2RFbnVtKHV0aWxfMS51dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kT2JqZWN0ID0gWm9kT2JqZWN0O1xuWm9kT2JqZWN0LmNyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RPYmplY3Quc3RyaWN0Q3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaWN0XCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RPYmplY3QubGF6eWNyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFVuaW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdHMocmVzdWx0cykge1xuICAgICAgICAgICAgLy8gcmV0dXJuIGZpcnN0IGlzc3VlLWZyZWUgdmFsaWRhdGlvbiBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGlzc3VlcyBmcm9tIGRpcnR5IG9wdGlvblxuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKC4uLnJlc3VsdC5jdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiBpbnZhbGlkXG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IHJlc3VsdHMubWFwKChyZXN1bHQpID0+IG5ldyBab2RFcnJvcl8xLlpvZEVycm9yKHJlc3VsdC5jdHguY29tbW9uLmlzc3VlcykpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uLFxuICAgICAgICAgICAgICAgIHVuaW9uRXJyb3JzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEN0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IG9wdGlvbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGN0eDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKS50aGVuKGhhbmRsZVJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRpcnR5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgaXNzdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDdHggPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgIWRpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnR5ID0geyByZXN1bHQsIGN0eDogY2hpbGRDdHggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3Vlcy5wdXNoKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkaXJ0eSkge1xuICAgICAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4uZGlydHkuY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkaXJ0eS5yZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IGlzc3Vlcy5tYXAoKGlzc3VlcykgPT4gbmV3IFpvZEVycm9yXzEuWm9kRXJyb3IoaXNzdWVzKSk7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sXG4gICAgICAgICAgICAgICAgdW5pb25FcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RVbmlvbiA9IFpvZFVuaW9uO1xuWm9kVW5pb24uY3JlYXRlID0gKHR5cGVzLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuaW9uKHtcbiAgICAgICAgb3B0aW9uczogdHlwZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5pb24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgWm9kRGlzY3JpbWluYXRlZFVuaW9uICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuY29uc3QgZ2V0RGlzY3JpbWluYXRvciA9ICh0eXBlKSA9PiB7XG4gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMYXp5KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2NoZW1hKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVmZmVjdHMpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5pbm5lclR5cGUoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMaXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RFbnVtKSB7XG4gICAgICAgIHJldHVybiB0eXBlLm9wdGlvbnM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROYXRpdmVFbnVtKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBiYW4vYmFuXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0eXBlLmVudW0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsKSB7XG4gICAgICAgIHJldHVybiBbbnVsbF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xuY2xhc3MgWm9kRGlzY3JpbWluYXRlZFVuaW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSB0aGlzLmRpc2NyaW1pbmF0b3I7XG4gICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZSA9IGN0eC5kYXRhW2Rpc2NyaW1pbmF0b3JdO1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnNNYXAuZ2V0KGRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5mcm9tKHRoaXMub3B0aW9uc01hcC5rZXlzKCkpLFxuICAgICAgICAgICAgICAgIHBhdGg6IFtkaXNjcmltaW5hdG9yXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGRpc2NyaW1pbmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcjtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnNNYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uIHNjaGVtYS4gSXRzIGJlaGF2aW91ciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgbm9ybWFsIHoudW5pb24oKSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBIb3dldmVyLCBpdCBvbmx5IGFsbG93cyBhIHVuaW9uIG9mIG9iamVjdHMsIGFsbCBvZiB3aGljaCBuZWVkIHRvIHNoYXJlIGEgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBtdXN0XG4gICAgICogaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgZWFjaCBvYmplY3QgaW4gdGhlIHVuaW9uLlxuICAgICAqIEBwYXJhbSBkaXNjcmltaW5hdG9yIHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGVzIGFuIGFycmF5IG9mIG9iamVjdCBzY2hlbWFzXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZGlzY3JpbWluYXRvciwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICAgIC8vIEdldCBhbGwgdGhlIHZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWVzXG4gICAgICAgIGNvbnN0IG9wdGlvbnNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWVzID0gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnNoYXBlW2Rpc2NyaW1pbmF0b3JdKTtcbiAgICAgICAgICAgIGlmICghZGlzY3JpbWluYXRvclZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQSBkaXNjcmltaW5hdG9yIHZhbHVlIGZvciBrZXkgXFxgJHtkaXNjcmltaW5hdG9yfVxcYCBjb3VsZCBub3QgYmUgZXh0cmFjdGVkIGZyb20gYWxsIHNjaGVtYSBvcHRpb25zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGRpc2NyaW1pbmF0b3JWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc01hcC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlzY3JpbWluYXRvciBwcm9wZXJ0eSAke1N0cmluZyhkaXNjcmltaW5hdG9yKX0gaGFzIGR1cGxpY2F0ZSB2YWx1ZSAke1N0cmluZyh2YWx1ZSl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAuc2V0KHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZERpc2NyaW1pbmF0ZWRVbmlvbih7XG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERpc2NyaW1pbmF0ZWRVbmlvbixcbiAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9uc01hcCxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5ab2REaXNjcmltaW5hdGVkVW5pb24gPSBab2REaXNjcmltaW5hdGVkVW5pb247XG5mdW5jdGlvbiBtZXJnZVZhbHVlcyhhLCBiKSB7XG4gICAgY29uc3QgYVR5cGUgPSAoMCwgdXRpbF8xLmdldFBhcnNlZFR5cGUpKGEpO1xuICAgIGNvbnN0IGJUeXBlID0gKDAsIHV0aWxfMS5nZXRQYXJzZWRUeXBlKShiKTtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUub2JqZWN0ICYmIGJUeXBlID09PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5vYmplY3QpIHtcbiAgICAgICAgY29uc3QgYktleXMgPSB1dGlsXzEudXRpbC5vYmplY3RLZXlzKGIpO1xuICAgICAgICBjb25zdCBzaGFyZWRLZXlzID0gdXRpbF8xLnV0aWxcbiAgICAgICAgICAgIC5vYmplY3RLZXlzKGEpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IGJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpO1xuICAgICAgICBjb25zdCBuZXdPYmogPSB7IC4uLmEsIC4uLmIgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IG5ld09iaiB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuYXJyYXkgJiYgYlR5cGUgPT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0FycmF5ID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUEgPSBhW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1CID0gYltpbmRleF07XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGl0ZW1BLCBpdGVtQik7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdBcnJheS5wdXNoKHNoYXJlZFZhbHVlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBuZXdBcnJheSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuZGF0ZSAmJlxuICAgICAgICBiVHlwZSA9PT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuZGF0ZSAmJlxuICAgICAgICArYSA9PT0gK2IpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IGEgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgIH1cbn1cbmNsYXNzIFpvZEludGVyc2VjdGlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBoYW5kbGVQYXJzZWQgPSAocGFyc2VkTGVmdCwgcGFyc2VkUmlnaHQpID0+IHtcbiAgICAgICAgICAgIGlmICgoMCwgcGFyc2VVdGlsXzEuaXNBYm9ydGVkKShwYXJzZWRMZWZ0KSB8fCAoMCwgcGFyc2VVdGlsXzEuaXNBYm9ydGVkKShwYXJzZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVmFsdWVzKHBhcnNlZExlZnQudmFsdWUsIHBhcnNlZFJpZ2h0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghbWVyZ2VkLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKDAsIHBhcnNlVXRpbF8xLmlzRGlydHkpKHBhcnNlZExlZnQpIHx8ICgwLCBwYXJzZVV0aWxfMS5pc0RpcnR5KShwYXJzZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogbWVyZ2VkLmRhdGEgfTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmLmxlZnQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdKS50aGVuKChbbGVmdCwgcmlnaHRdKSA9PiBoYW5kbGVQYXJzZWQobGVmdCwgcmlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVQYXJzZWQodGhpcy5fZGVmLmxlZnQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KSwgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5ab2RJbnRlcnNlY3Rpb24gPSBab2RJbnRlcnNlY3Rpb247XG5ab2RJbnRlcnNlY3Rpb24uY3JlYXRlID0gKGxlZnQsIHJpZ2h0LCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEludGVyc2VjdGlvbih7XG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RJbnRlcnNlY3Rpb24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RUdXBsZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUuYXJyYXksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoIDwgdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgbWluaW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdCA9IHRoaXMuX2RlZi5yZXN0O1xuICAgICAgICBpZiAoIXJlc3QgJiYgY3R4LmRhdGEubGVuZ3RoID4gdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgIG1heGltdW06IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLmN0eC5kYXRhXVxuICAgICAgICAgICAgLm1hcCgoaXRlbSwgaXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLl9kZWYuaXRlbXNbaXRlbUluZGV4XSB8fCB0aGlzLl9kZWYucmVzdDtcbiAgICAgICAgICAgIGlmICghc2NoZW1hKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpdGVtSW5kZXgpKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+ICEheCk7IC8vIGZpbHRlciBudWxsc1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCBpdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLml0ZW1zO1xuICAgIH1cbiAgICByZXN0KHJlc3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICByZXN0LFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlpvZFR1cGxlID0gWm9kVHVwbGU7XG5ab2RUdXBsZS5jcmVhdGUgPSAoc2NoZW1hcywgcGFyYW1zKSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHtcbiAgICAgICAgaXRlbXM6IHNjaGVtYXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVHVwbGUsXG4gICAgICAgIHJlc3Q6IG51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RSZWNvcmQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQga2V5U2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgfVxuICAgIGdldCB2YWx1ZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHtcbiAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBjdHguZGF0YVtrZXldLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0QXN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBlbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShmaXJzdCwgc2Vjb25kLCB0aGlyZCkge1xuICAgICAgICBpZiAoc2Vjb25kIGluc3RhbmNlb2YgWm9kVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAgICAgIGtleVR5cGU6IGZpcnN0LFxuICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogc2Vjb25kLFxuICAgICAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcmQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAga2V5VHlwZTogWm9kU3RyaW5nLmNyZWF0ZSgpLFxuICAgICAgICAgICAgdmFsdWVUeXBlOiBmaXJzdCxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhzZWNvbmQpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlpvZFJlY29yZCA9IFpvZFJlY29yZDtcbmNsYXNzIFpvZE1hcCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGdldCBrZXlTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlU2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUubWFwKSB7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUubWFwLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5VHlwZSA9IHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgICAgICBjb25zdCBwYWlycyA9IFsuLi5jdHguZGF0YS5lbnRyaWVzKCldLm1hcCgoW2tleSwgdmFsdWVdLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBrZXksIGN0eC5wYXRoLCBbaW5kZXgsIFwia2V5XCJdKSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwgW2luZGV4LCBcInZhbHVlXCJdKSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImFib3J0ZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxNYXAuc2V0KGtleS52YWx1ZSwgdmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsTWFwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsTWFwIH07XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLlpvZE1hcCA9IFpvZE1hcDtcblpvZE1hcC5jcmVhdGUgPSAoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE1hcCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RNYXAsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RTZXQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5zZXQpIHtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5zZXQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWYgPSB0aGlzLl9kZWY7XG4gICAgICAgIGlmIChkZWYubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPCBkZWYubWluU2l6ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogZGVmLm1pblNpemUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWluU2l6ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWF4U2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPiBkZWYubWF4U2l6ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5tYXhTaXplLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1heFNpemUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgICAgICBmdW5jdGlvbiBmaW5hbGl6ZVNldChlbGVtZW50cykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkU2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIHBhcnNlZFNldC5hZGQoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHBhcnNlZFNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLmN0eC5kYXRhLnZhbHVlcygpXS5tYXAoKGl0ZW0sIGkpID0+IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSkpO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGVsZW1lbnRzKS50aGVuKChlbGVtZW50cykgPT4gZmluYWxpemVTZXQoZWxlbWVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbGl6ZVNldChlbGVtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWluKG1pblNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWluU2l6ZTogeyB2YWx1ZTogbWluU2l6ZSwgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4U2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtYXhTaXplOiB7IHZhbHVlOiBtYXhTaXplLCBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNpemUoc2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oc2l6ZSwgbWVzc2FnZSkubWF4KHNpemUsIG1lc3NhZ2UpO1xuICAgIH1cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBtZXNzYWdlKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZFNldCA9IFpvZFNldDtcblpvZFNldC5jcmVhdGUgPSAodmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgbWluU2l6ZTogbnVsbCxcbiAgICAgICAgbWF4U2l6ZTogbnVsbCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTZXQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RGdW5jdGlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnZhbGlkYXRlID0gdGhpcy5pbXBsZW1lbnQ7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5mdW5jdGlvbikge1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZUFyZ3NJc3N1ZShhcmdzLCBlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuICgwLCBwYXJzZVV0aWxfMS5tYWtlSXNzdWUpKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBhcmdzLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwczogW1xuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICAoMCwgZXJyb3JzXzEuZ2V0RXJyb3JNYXApKCksXG4gICAgICAgICAgICAgICAgICAgIGVycm9yc18xLmRlZmF1bHRFcnJvck1hcCxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICAgICAgICAgICAgICBpc3N1ZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c0Vycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZVJldHVybnNJc3N1ZShyZXR1cm5zLCBlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuICgwLCBwYXJzZVV0aWxfMS5tYWtlSXNzdWUpKHtcbiAgICAgICAgICAgICAgICBkYXRhOiByZXR1cm5zLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwczogW1xuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICAoMCwgZXJyb3JzXzEuZ2V0RXJyb3JNYXApKCksXG4gICAgICAgICAgICAgICAgICAgIGVycm9yc18xLmRlZmF1bHRFcnJvck1hcCxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICAgICAgICAgICAgICBpc3N1ZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZUVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAgfTtcbiAgICAgICAgY29uc3QgZm4gPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5yZXR1cm5zIGluc3RhbmNlb2YgWm9kUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gV291bGQgbG92ZSBhIHdheSB0byBhdm9pZCBkaXNhYmxpbmcgdGhpcyBydWxlLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYW4gYWxpYXMgKHVzaW5nIGFuIGFycm93IGZ1bmN0aW9uIHdhcyB3aGF0IGNhdXNlZCAyNjUxKS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuICgwLCBwYXJzZVV0aWxfMS5PSykoYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcl8xLlpvZEVycm9yKFtdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gYXdhaXQgbWUuX2RlZi5hcmdzXG4gICAgICAgICAgICAgICAgICAgIC5wYXJzZUFzeW5jKGFyZ3MsIHBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmFkZElzc3VlKG1ha2VBcmdzSXNzdWUoYXJncywgZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gYXdhaXQgbWUuX2RlZi5yZXR1cm5zLl9kZWYudHlwZVxuICAgICAgICAgICAgICAgICAgICAucGFyc2VBc3luYyhyZXN1bHQsIHBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmFkZElzc3VlKG1ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXR1cm5zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBXb3VsZCBsb3ZlIGEgd2F5IHRvIGF2b2lkIGRpc2FibGluZyB0aGlzIHJ1bGUsIGJ1dCB3ZSBuZWVkXG4gICAgICAgICAgICAvLyBhbiBhbGlhcyAodXNpbmcgYW4gYXJyb3cgZnVuY3Rpb24gd2FzIHdoYXQgY2F1c2VkIDI2NTEpLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgICAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBtZS5fZGVmLmFyZ3Muc2FmZVBhcnNlKGFyZ3MsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRBcmdzLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpvZEVycm9yXzEuWm9kRXJyb3IoW21ha2VBcmdzSXNzdWUoYXJncywgcGFyc2VkQXJncy5lcnJvcildKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShmbiwgdGhpcywgcGFyc2VkQXJncy5kYXRhKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gbWUuX2RlZi5yZXR1cm5zLnNhZmVQYXJzZShyZXN1bHQsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRSZXR1cm5zLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpvZEVycm9yXzEuWm9kRXJyb3IoW21ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBwYXJzZWRSZXR1cm5zLmVycm9yKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkUmV0dXJucy5kYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyYW1ldGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5hcmdzO1xuICAgIH1cbiAgICByZXR1cm5UeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnJldHVybnM7XG4gICAgfVxuICAgIGFyZ3MoLi4uaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBhcmdzOiBab2RUdXBsZS5jcmVhdGUoaXRlbXMpLnJlc3QoWm9kVW5rbm93bi5jcmVhdGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5zKHJldHVyblR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICByZXR1cm5zOiByZXR1cm5UeXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW1wbGVtZW50KGZ1bmMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jO1xuICAgIH1cbiAgICBzdHJpY3RJbXBsZW1lbnQoZnVuYykge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGdW5jID0gdGhpcy5wYXJzZShmdW5jKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZEZ1bmM7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoYXJncywgcmV0dXJucywgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgYXJnczogKGFyZ3NcbiAgICAgICAgICAgICAgICA/IGFyZ3NcbiAgICAgICAgICAgICAgICA6IFpvZFR1cGxlLmNyZWF0ZShbXSkucmVzdChab2RVbmtub3duLmNyZWF0ZSgpKSksXG4gICAgICAgICAgICByZXR1cm5zOiByZXR1cm5zIHx8IFpvZFVua25vd24uY3JlYXRlKCksXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEZ1bmN0aW9uLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlpvZEZ1bmN0aW9uID0gWm9kRnVuY3Rpb247XG5jbGFzcyBab2RMYXp5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBsYXp5U2NoZW1hID0gdGhpcy5fZGVmLmdldHRlcigpO1xuICAgICAgICByZXR1cm4gbGF6eVNjaGVtYS5fcGFyc2UoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kTGF6eSA9IFpvZExhenk7XG5ab2RMYXp5LmNyZWF0ZSA9IChnZXR0ZXIsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTGF6eSh7XG4gICAgICAgIGdldHRlcjogZ2V0dGVyLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZExhenksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RMaXRlcmFsIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5kYXRhICE9PSB0aGlzLl9kZWYudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfbGl0ZXJhbCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdGhpcy5fZGVmLnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kTGl0ZXJhbCA9IFpvZExpdGVyYWw7XG5ab2RMaXRlcmFsLmNyZWF0ZSA9ICh2YWx1ZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RMaXRlcmFsKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZExpdGVyYWwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBjcmVhdGVab2RFbnVtKHZhbHVlcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVudW0sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn1cbmNsYXNzIFpvZEVudW0gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dC5kYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEudXRpbC5qb2luVmFsdWVzKGV4cGVjdGVkVmFsdWVzKSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGVmLnZhbHVlcy5pbmRleE9mKGlucHV0LmRhdGEpID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB0aGlzLl9kZWYudmFsdWVzO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShpbnB1dC5kYXRhKTtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVzO1xuICAgIH1cbiAgICBnZXQgZW51bSgpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGdldCBWYWx1ZXMoKSB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykge1xuICAgICAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtVmFsdWVzO1xuICAgIH1cbiAgICBnZXQgRW51bSgpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGV4dHJhY3QodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh2YWx1ZXMpO1xuICAgIH1cbiAgICBleGNsdWRlKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gWm9kRW51bS5jcmVhdGUodGhpcy5vcHRpb25zLmZpbHRlcigob3B0KSA9PiAhdmFsdWVzLmluY2x1ZGVzKG9wdCkpKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZEVudW0gPSBab2RFbnVtO1xuWm9kRW51bS5jcmVhdGUgPSBjcmVhdGVab2RFbnVtO1xuY2xhc3MgWm9kTmF0aXZlRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBuYXRpdmVFbnVtVmFsdWVzID0gdXRpbF8xLnV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpO1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuc3RyaW5nICYmXG4gICAgICAgICAgICBjdHgucGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUubnVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHV0aWxfMS51dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS51dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXRpdmVFbnVtVmFsdWVzLmluZGV4T2YoaW5wdXQuZGF0YSkgPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHV0aWxfMS51dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBleHBlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgwLCBwYXJzZVV0aWxfMS5PSykoaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgICB9XG59XG5leHBvcnRzLlpvZE5hdGl2ZUVudW0gPSBab2ROYXRpdmVFbnVtO1xuWm9kTmF0aXZlRW51bS5jcmVhdGUgPSAodmFsdWVzLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE5hdGl2ZUVudW0oe1xuICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROYXRpdmVFbnVtLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kUHJvbWlzZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUucHJvbWlzZSAmJlxuICAgICAgICAgICAgY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5wcm9taXNlLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzaWZpZWQgPSBjdHgucGFyc2VkVHlwZSA9PT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUucHJvbWlzZVxuICAgICAgICAgICAgPyBjdHguZGF0YVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoY3R4LmRhdGEpO1xuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShwcm9taXNpZmllZC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhkYXRhLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXA6IGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZFByb21pc2UgPSBab2RQcm9taXNlO1xuWm9kUHJvbWlzZS5jcmVhdGUgPSAoc2NoZW1hLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFByb21pc2Uoe1xuICAgICAgICB0eXBlOiBzY2hlbWEsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUHJvbWlzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEVmZmVjdHMgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBpbm5lclR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hO1xuICAgIH1cbiAgICBzb3VyY2VUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0c1xuICAgICAgICAgICAgPyB0aGlzLl9kZWYuc2NoZW1hLnNvdXJjZVR5cGUoKVxuICAgICAgICAgICAgOiB0aGlzLl9kZWYuc2NoZW1hO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZWZmZWN0ID0gdGhpcy5fZGVmLmVmZmVjdCB8fCBudWxsO1xuICAgICAgICBjb25zdCBjaGVja0N0eCA9IHtcbiAgICAgICAgICAgIGFkZElzc3VlOiAoYXJnKSA9PiB7XG4gICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIGFyZyk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZy5mYXRhbCkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhdGg7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjaGVja0N0eC5hZGRJc3N1ZSA9IGNoZWNrQ3R4LmFkZElzc3VlLmJpbmQoY2hlY2tDdHgpO1xuICAgICAgICBpZiAoZWZmZWN0LnR5cGUgPT09IFwicHJlcHJvY2Vzc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBlZmZlY3QudHJhbnNmb3JtKGN0eC5kYXRhLCBjaGVja0N0eCk7XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImRpcnR5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2Nlc3NlZCkudGhlbigocHJvY2Vzc2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJyZWZpbmVtZW50XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVSZWZpbmVtZW50ID0gKGFjY1xuICAgICAgICAgICAgLy8gZWZmZWN0OiBSZWZpbmVtZW50RWZmZWN0PGFueT5cbiAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC5yZWZpbmVtZW50KGFjYywgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkXG4gICAgICAgICAgICAgICAgZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5uZXIudmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hXG4gICAgICAgICAgICAgICAgICAgIC5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGlubmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbm5lci52YWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZmZWN0LnR5cGUgPT09IFwidHJhbnNmb3JtXCIpIHtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghKDAsIHBhcnNlVXRpbF8xLmlzVmFsaWQpKGJhc2UpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBlZmZlY3QudHJhbnNmb3JtKGJhc2UudmFsdWUsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzeW5jaHJvbm91cyB0cmFuc2Zvcm0gZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcmVzdWx0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYVxuICAgICAgICAgICAgICAgICAgICAuX3BhcnNlQXN5bmMoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChiYXNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKDAsIHBhcnNlVXRpbF8xLmlzVmFsaWQpKGJhc2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZWZmZWN0LnRyYW5zZm9ybShiYXNlLnZhbHVlLCBjaGVja0N0eCkpLnRoZW4oKHJlc3VsdCkgPT4gKHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiByZXN1bHQgfSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHV0aWxfMS51dGlsLmFzc2VydE5ldmVyKGVmZmVjdCk7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RFZmZlY3RzID0gWm9kRWZmZWN0cztcbmV4cG9ydHMuWm9kVHJhbnNmb3JtZXIgPSBab2RFZmZlY3RzO1xuWm9kRWZmZWN0cy5jcmVhdGUgPSAoc2NoZW1hLCBlZmZlY3QsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICBlZmZlY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzID0gKHByZXByb2Nlc3MsIHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJwcmVwcm9jZXNzXCIsIHRyYW5zZm9ybTogcHJlcHJvY2VzcyB9LFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RPcHRpb25hbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlID09PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5leHBvcnRzLlpvZE9wdGlvbmFsID0gWm9kT3B0aW9uYWw7XG5ab2RPcHRpb25hbC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPcHRpb25hbCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPcHRpb25hbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE51bGxhYmxlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgPT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuZXhwb3J0cy5ab2ROdWxsYWJsZSA9IFpvZE51bGxhYmxlO1xuWm9kTnVsbGFibGUuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTnVsbGFibGUoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTnVsbGFibGUsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2REZWZhdWx0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBsZXQgZGF0YSA9IGN0eC5kYXRhO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgPT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMuX2RlZi5kZWZhdWx0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW1vdmVEZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5leHBvcnRzLlpvZERlZmF1bHQgPSBab2REZWZhdWx0O1xuWm9kRGVmYXVsdC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2REZWZhdWx0KHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERlZmF1bHQsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdHlwZW9mIHBhcmFtcy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gcGFyYW1zLmRlZmF1bHRcbiAgICAgICAgICAgIDogKCkgPT4gcGFyYW1zLmRlZmF1bHQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RDYXRjaCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgLy8gbmV3Q3R4IGlzIHVzZWQgdG8gbm90IGNvbGxlY3QgaXNzdWVzIGZyb20gaW5uZXIgdHlwZXMgaW4gY3R4XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IHtcbiAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtcbiAgICAgICAgICAgIGRhdGE6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgcGF0aDogbmV3Q3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICAuLi5uZXdDdHgsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCgwLCBwYXJzZVV0aWxfMS5pc0FzeW5jKShyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFpvZEVycm9yXzEuWm9kRXJyb3IobmV3Q3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwidmFsaWRcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9kRXJyb3JfMS5ab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlQ2F0Y2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kQ2F0Y2ggPSBab2RDYXRjaDtcblpvZENhdGNoLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZENhdGNoLFxuICAgICAgICBjYXRjaFZhbHVlOiB0eXBlb2YgcGFyYW1zLmNhdGNoID09PSBcImZ1bmN0aW9uXCIgPyBwYXJhbXMuY2F0Y2ggOiAoKSA9PiBwYXJhbXMuY2F0Y2gsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2ROYU4gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUubmFuKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUubmFuLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxufVxuZXhwb3J0cy5ab2ROYU4gPSBab2ROYU47XG5ab2ROYU4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmFOKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROYU4sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnRzLkJSQU5EID0gU3ltYm9sKFwiem9kX2JyYW5kXCIpO1xuY2xhc3MgWm9kQnJhbmRlZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGN0eC5kYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUuX3BhcnNlKHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RCcmFuZGVkID0gWm9kQnJhbmRlZDtcbmNsYXNzIFpvZFBpcGVsaW5lIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVBc3luYyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IGF3YWl0IHRoaXMuX2RlZi5pbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBwYXJzZVV0aWxfMS5ESVJUWSkoaW5SZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFzeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IHRoaXMuX2RlZi5pbi5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZGlydHlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm91dC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RQaXBlbGluZSh7XG4gICAgICAgICAgICBpbjogYSxcbiAgICAgICAgICAgIG91dDogYixcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUGlwZWxpbmUsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kUGlwZWxpbmUgPSBab2RQaXBlbGluZTtcbmNsYXNzIFpvZFJlYWRvbmx5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKCgwLCBwYXJzZVV0aWxfMS5pc1ZhbGlkKShyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXN1bHQudmFsdWUgPSBPYmplY3QuZnJlZXplKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlpvZFJlYWRvbmx5ID0gWm9kUmVhZG9ubHk7XG5ab2RSZWFkb25seS5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RSZWFkb25seSh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWFkb25seSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNvbnN0IGN1c3RvbSA9IChjaGVjaywgcGFyYW1zID0ge30sIFxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqIFBhc3MgYGZhdGFsYCBpbnRvIHRoZSBwYXJhbXMgb2JqZWN0IGluc3RlYWQ6XG4gKlxuICogYGBgdHNcbiAqIHouc3RyaW5nKCkuY3VzdG9tKCh2YWwpID0+IHZhbC5sZW5ndGggPiA1LCB7IGZhdGFsOiBmYWxzZSB9KVxuICogYGBgXG4gKlxuICovXG5mYXRhbCkgPT4ge1xuICAgIGlmIChjaGVjaylcbiAgICAgICAgcmV0dXJuIFpvZEFueS5jcmVhdGUoKS5zdXBlclJlZmluZSgoZGF0YSwgY3R4KSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgaWYgKCFjaGVjayhkYXRhKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSB0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJhbXMoZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgOiB0eXBlb2YgcGFyYW1zID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHsgbWVzc2FnZTogcGFyYW1zIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogcGFyYW1zO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9mYXRhbCA9IChfYiA9IChfYSA9IHAuZmF0YWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhdGFsKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAyID0gdHlwZW9mIHAgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2U6IHAgfSA6IHA7XG4gICAgICAgICAgICAgICAgY3R4LmFkZElzc3VlKHsgY29kZTogXCJjdXN0b21cIiwgLi4ucDIsIGZhdGFsOiBfZmF0YWwgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBab2RBbnkuY3JlYXRlKCk7XG59O1xuZXhwb3J0cy5jdXN0b20gPSBjdXN0b207XG5leHBvcnRzLmxhdGUgPSB7XG4gICAgb2JqZWN0OiBab2RPYmplY3QubGF6eWNyZWF0ZSxcbn07XG52YXIgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kO1xuKGZ1bmN0aW9uIChab2RGaXJzdFBhcnR5VHlwZUtpbmQpIHtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTdHJpbmdcIl0gPSBcIlpvZFN0cmluZ1wiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bWJlclwiXSA9IFwiWm9kTnVtYmVyXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmFOXCJdID0gXCJab2ROYU5cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCaWdJbnRcIl0gPSBcIlpvZEJpZ0ludFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJvb2xlYW5cIl0gPSBcIlpvZEJvb2xlYW5cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REYXRlXCJdID0gXCJab2REYXRlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU3ltYm9sXCJdID0gXCJab2RTeW1ib2xcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmRlZmluZWRcIl0gPSBcIlpvZFVuZGVmaW5lZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bGxcIl0gPSBcIlpvZE51bGxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RBbnlcIl0gPSBcIlpvZEFueVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVua25vd25cIl0gPSBcIlpvZFVua25vd25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROZXZlclwiXSA9IFwiWm9kTmV2ZXJcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RWb2lkXCJdID0gXCJab2RWb2lkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQXJyYXlcIl0gPSBcIlpvZEFycmF5XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kT2JqZWN0XCJdID0gXCJab2RPYmplY3RcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmlvblwiXSA9IFwiWm9kVW5pb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REaXNjcmltaW5hdGVkVW5pb25cIl0gPSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEludGVyc2VjdGlvblwiXSA9IFwiWm9kSW50ZXJzZWN0aW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVHVwbGVcIl0gPSBcIlpvZFR1cGxlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUmVjb3JkXCJdID0gXCJab2RSZWNvcmRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RNYXBcIl0gPSBcIlpvZE1hcFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFNldFwiXSA9IFwiWm9kU2V0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRnVuY3Rpb25cIl0gPSBcIlpvZEZ1bmN0aW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTGF6eVwiXSA9IFwiWm9kTGF6eVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZExpdGVyYWxcIl0gPSBcIlpvZExpdGVyYWxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RFbnVtXCJdID0gXCJab2RFbnVtXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRWZmZWN0c1wiXSA9IFwiWm9kRWZmZWN0c1wiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5hdGl2ZUVudW1cIl0gPSBcIlpvZE5hdGl2ZUVudW1cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RPcHRpb25hbFwiXSA9IFwiWm9kT3B0aW9uYWxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdWxsYWJsZVwiXSA9IFwiWm9kTnVsbGFibGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REZWZhdWx0XCJdID0gXCJab2REZWZhdWx0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQ2F0Y2hcIl0gPSBcIlpvZENhdGNoXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUHJvbWlzZVwiXSA9IFwiWm9kUHJvbWlzZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJyYW5kZWRcIl0gPSBcIlpvZEJyYW5kZWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RQaXBlbGluZVwiXSA9IFwiWm9kUGlwZWxpbmVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RSZWFkb25seVwiXSA9IFwiWm9kUmVhZG9ubHlcIjtcbn0pKFpvZEZpcnN0UGFydHlUeXBlS2luZCA9IGV4cG9ydHMuWm9kRmlyc3RQYXJ0eVR5cGVLaW5kIHx8IChleHBvcnRzLlpvZEZpcnN0UGFydHlUeXBlS2luZCA9IHt9KSk7XG4vLyByZXF1aXJlcyBUUyA0LjQrXG5jbGFzcyBDbGFzcyB7XG4gICAgY29uc3RydWN0b3IoLi4uXykgeyB9XG59XG5jb25zdCBpbnN0YW5jZU9mVHlwZSA9IChcbi8vIGNvbnN0IGluc3RhbmNlT2ZUeXBlID0gPFQgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuY2xzLCBwYXJhbXMgPSB7XG4gICAgbWVzc2FnZTogYElucHV0IG5vdCBpbnN0YW5jZSBvZiAke2Nscy5uYW1lfWAsXG59KSA9PiAoMCwgZXhwb3J0cy5jdXN0b20pKChkYXRhKSA9PiBkYXRhIGluc3RhbmNlb2YgY2xzLCBwYXJhbXMpO1xuZXhwb3J0cy5pbnN0YW5jZW9mID0gaW5zdGFuY2VPZlR5cGU7XG5jb25zdCBzdHJpbmdUeXBlID0gWm9kU3RyaW5nLmNyZWF0ZTtcbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nVHlwZTtcbmNvbnN0IG51bWJlclR5cGUgPSBab2ROdW1iZXIuY3JlYXRlO1xuZXhwb3J0cy5udW1iZXIgPSBudW1iZXJUeXBlO1xuY29uc3QgbmFuVHlwZSA9IFpvZE5hTi5jcmVhdGU7XG5leHBvcnRzLm5hbiA9IG5hblR5cGU7XG5jb25zdCBiaWdJbnRUeXBlID0gWm9kQmlnSW50LmNyZWF0ZTtcbmV4cG9ydHMuYmlnaW50ID0gYmlnSW50VHlwZTtcbmNvbnN0IGJvb2xlYW5UeXBlID0gWm9kQm9vbGVhbi5jcmVhdGU7XG5leHBvcnRzLmJvb2xlYW4gPSBib29sZWFuVHlwZTtcbmNvbnN0IGRhdGVUeXBlID0gWm9kRGF0ZS5jcmVhdGU7XG5leHBvcnRzLmRhdGUgPSBkYXRlVHlwZTtcbmNvbnN0IHN5bWJvbFR5cGUgPSBab2RTeW1ib2wuY3JlYXRlO1xuZXhwb3J0cy5zeW1ib2wgPSBzeW1ib2xUeXBlO1xuY29uc3QgdW5kZWZpbmVkVHlwZSA9IFpvZFVuZGVmaW5lZC5jcmVhdGU7XG5leHBvcnRzLnVuZGVmaW5lZCA9IHVuZGVmaW5lZFR5cGU7XG5jb25zdCBudWxsVHlwZSA9IFpvZE51bGwuY3JlYXRlO1xuZXhwb3J0cy5udWxsID0gbnVsbFR5cGU7XG5jb25zdCBhbnlUeXBlID0gWm9kQW55LmNyZWF0ZTtcbmV4cG9ydHMuYW55ID0gYW55VHlwZTtcbmNvbnN0IHVua25vd25UeXBlID0gWm9kVW5rbm93bi5jcmVhdGU7XG5leHBvcnRzLnVua25vd24gPSB1bmtub3duVHlwZTtcbmNvbnN0IG5ldmVyVHlwZSA9IFpvZE5ldmVyLmNyZWF0ZTtcbmV4cG9ydHMubmV2ZXIgPSBuZXZlclR5cGU7XG5jb25zdCB2b2lkVHlwZSA9IFpvZFZvaWQuY3JlYXRlO1xuZXhwb3J0cy52b2lkID0gdm9pZFR5cGU7XG5jb25zdCBhcnJheVR5cGUgPSBab2RBcnJheS5jcmVhdGU7XG5leHBvcnRzLmFycmF5ID0gYXJyYXlUeXBlO1xuY29uc3Qgb2JqZWN0VHlwZSA9IFpvZE9iamVjdC5jcmVhdGU7XG5leHBvcnRzLm9iamVjdCA9IG9iamVjdFR5cGU7XG5jb25zdCBzdHJpY3RPYmplY3RUeXBlID0gWm9kT2JqZWN0LnN0cmljdENyZWF0ZTtcbmV4cG9ydHMuc3RyaWN0T2JqZWN0ID0gc3RyaWN0T2JqZWN0VHlwZTtcbmNvbnN0IHVuaW9uVHlwZSA9IFpvZFVuaW9uLmNyZWF0ZTtcbmV4cG9ydHMudW5pb24gPSB1bmlvblR5cGU7XG5jb25zdCBkaXNjcmltaW5hdGVkVW5pb25UeXBlID0gWm9kRGlzY3JpbWluYXRlZFVuaW9uLmNyZWF0ZTtcbmV4cG9ydHMuZGlzY3JpbWluYXRlZFVuaW9uID0gZGlzY3JpbWluYXRlZFVuaW9uVHlwZTtcbmNvbnN0IGludGVyc2VjdGlvblR5cGUgPSBab2RJbnRlcnNlY3Rpb24uY3JlYXRlO1xuZXhwb3J0cy5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb25UeXBlO1xuY29uc3QgdHVwbGVUeXBlID0gWm9kVHVwbGUuY3JlYXRlO1xuZXhwb3J0cy50dXBsZSA9IHR1cGxlVHlwZTtcbmNvbnN0IHJlY29yZFR5cGUgPSBab2RSZWNvcmQuY3JlYXRlO1xuZXhwb3J0cy5yZWNvcmQgPSByZWNvcmRUeXBlO1xuY29uc3QgbWFwVHlwZSA9IFpvZE1hcC5jcmVhdGU7XG5leHBvcnRzLm1hcCA9IG1hcFR5cGU7XG5jb25zdCBzZXRUeXBlID0gWm9kU2V0LmNyZWF0ZTtcbmV4cG9ydHMuc2V0ID0gc2V0VHlwZTtcbmNvbnN0IGZ1bmN0aW9uVHlwZSA9IFpvZEZ1bmN0aW9uLmNyZWF0ZTtcbmV4cG9ydHMuZnVuY3Rpb24gPSBmdW5jdGlvblR5cGU7XG5jb25zdCBsYXp5VHlwZSA9IFpvZExhenkuY3JlYXRlO1xuZXhwb3J0cy5sYXp5ID0gbGF6eVR5cGU7XG5jb25zdCBsaXRlcmFsVHlwZSA9IFpvZExpdGVyYWwuY3JlYXRlO1xuZXhwb3J0cy5saXRlcmFsID0gbGl0ZXJhbFR5cGU7XG5jb25zdCBlbnVtVHlwZSA9IFpvZEVudW0uY3JlYXRlO1xuZXhwb3J0cy5lbnVtID0gZW51bVR5cGU7XG5jb25zdCBuYXRpdmVFbnVtVHlwZSA9IFpvZE5hdGl2ZUVudW0uY3JlYXRlO1xuZXhwb3J0cy5uYXRpdmVFbnVtID0gbmF0aXZlRW51bVR5cGU7XG5jb25zdCBwcm9taXNlVHlwZSA9IFpvZFByb21pc2UuY3JlYXRlO1xuZXhwb3J0cy5wcm9taXNlID0gcHJvbWlzZVR5cGU7XG5jb25zdCBlZmZlY3RzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlO1xuZXhwb3J0cy5lZmZlY3QgPSBlZmZlY3RzVHlwZTtcbmV4cG9ydHMudHJhbnNmb3JtZXIgPSBlZmZlY3RzVHlwZTtcbmNvbnN0IG9wdGlvbmFsVHlwZSA9IFpvZE9wdGlvbmFsLmNyZWF0ZTtcbmV4cG9ydHMub3B0aW9uYWwgPSBvcHRpb25hbFR5cGU7XG5jb25zdCBudWxsYWJsZVR5cGUgPSBab2ROdWxsYWJsZS5jcmVhdGU7XG5leHBvcnRzLm51bGxhYmxlID0gbnVsbGFibGVUeXBlO1xuY29uc3QgcHJlcHJvY2Vzc1R5cGUgPSBab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzO1xuZXhwb3J0cy5wcmVwcm9jZXNzID0gcHJlcHJvY2Vzc1R5cGU7XG5jb25zdCBwaXBlbGluZVR5cGUgPSBab2RQaXBlbGluZS5jcmVhdGU7XG5leHBvcnRzLnBpcGVsaW5lID0gcGlwZWxpbmVUeXBlO1xuY29uc3Qgb3N0cmluZyA9ICgpID0+IHN0cmluZ1R5cGUoKS5vcHRpb25hbCgpO1xuZXhwb3J0cy5vc3RyaW5nID0gb3N0cmluZztcbmNvbnN0IG9udW1iZXIgPSAoKSA9PiBudW1iZXJUeXBlKCkub3B0aW9uYWwoKTtcbmV4cG9ydHMub251bWJlciA9IG9udW1iZXI7XG5jb25zdCBvYm9vbGVhbiA9ICgpID0+IGJvb2xlYW5UeXBlKCkub3B0aW9uYWwoKTtcbmV4cG9ydHMub2Jvb2xlYW4gPSBvYm9vbGVhbjtcbmV4cG9ydHMuY29lcmNlID0ge1xuICAgIHN0cmluZzogKChhcmcpID0+IFpvZFN0cmluZy5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG4gICAgbnVtYmVyOiAoKGFyZykgPT4gWm9kTnVtYmVyLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBib29sZWFuOiAoKGFyZykgPT4gWm9kQm9vbGVhbi5jcmVhdGUoe1xuICAgICAgICAuLi5hcmcsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICB9KSksXG4gICAgYmlnaW50OiAoKGFyZykgPT4gWm9kQmlnSW50LmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBkYXRlOiAoKGFyZykgPT4gWm9kRGF0ZS5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG59O1xuZXhwb3J0cy5ORVZFUiA9IHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4iLCJmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGUpIHtcbiAgaWYgKHZvaWQgMCA9PT0gZSkgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICByZXR1cm4gZTtcbn1cbmV4cG9ydCB7IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHIpIHtcbiAgZm9yICh2YXIgdCA9IDA7IHQgPCByLmxlbmd0aDsgdCsrKSB7XG4gICAgdmFyIG8gPSByW3RdO1xuICAgIG8uZW51bWVyYWJsZSA9IG8uZW51bWVyYWJsZSB8fCAhMSwgby5jb25maWd1cmFibGUgPSAhMCwgXCJ2YWx1ZVwiIGluIG8gJiYgKG8ud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0b1Byb3BlcnR5S2V5KG8ua2V5KSwgbyk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhlLCByLCB0KSB7XG4gIHJldHVybiByICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLCByKSwgdCAmJiBfZGVmaW5lUHJvcGVydGllcyhlLCB0KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogITFcbiAgfSksIGU7XG59XG5leHBvcnQgeyBfY3JlYXRlQ2xhc3MgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikge1xuICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7XG4gICAgICB2YXIgdCA9IGFyZ3VtZW50c1tlXTtcbiAgICAgIGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IHsgX2V4dGVuZHMgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UodCwgbykge1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLCB0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHQsIHNldFByb3RvdHlwZU9mKHQsIG8pO1xufVxuZXhwb3J0IHsgX2luaGVyaXRzTG9vc2UgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHIsIGUpIHtcbiAgaWYgKG51bGwgPT0gcikgcmV0dXJuIHt9O1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBuIGluIHIpIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pKSB7XG4gICAgaWYgKC0xICE9PSBlLmluZGV4T2YobikpIGNvbnRpbnVlO1xuICAgIHRbbl0gPSByW25dO1xuICB9XG4gIHJldHVybiB0O1xufVxuZXhwb3J0IHsgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5leHBvcnQgeyBfc2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbmV4cG9ydCB7IHRvUHJpbWl0aXZlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5leHBvcnQgeyB0b1Byb3BlcnR5S2V5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBfdHlwZW9mKG8pO1xufVxuZXhwb3J0IHsgX3R5cGVvZiBhcyBkZWZhdWx0IH07IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTgwKTtcbiIsIiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
30980
|
+
;
|