galadrim-feedback 0.0.42 → 0.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +5 -2563
- package/dist/index.es.js +8 -2548
- package/dist/styles.css +8 -2548
- package/package.json +1 -1
- package/src/index.tsx +0 -2
package/dist/index.cjs.js
CHANGED
|
@@ -5,2565 +5,7 @@ var reactQuery = require('@tanstack/react-query');
|
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var globalAxios = require('axios');
|
|
7
7
|
var moment = require('moment');
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
function _interopNamespaceDefault(e) {
|
|
11
|
-
var n = Object.create(null);
|
|
12
|
-
if (e) {
|
|
13
|
-
Object.keys(e).forEach(function (k) {
|
|
14
|
-
if (k !== 'default') {
|
|
15
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
get: function () { return e[k]; }
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
n.default = e;
|
|
24
|
-
return Object.freeze(n);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
28
|
-
|
|
29
|
-
var global$1 = typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
|
|
30
|
-
|
|
31
|
-
// shim for using process in browser
|
|
32
|
-
// based off https://github.com/defunctzombie/node-process/blob/master/browser.js
|
|
33
|
-
|
|
34
|
-
function defaultSetTimout() {
|
|
35
|
-
throw new Error('setTimeout has not been defined');
|
|
36
|
-
}
|
|
37
|
-
function defaultClearTimeout() {
|
|
38
|
-
throw new Error('clearTimeout has not been defined');
|
|
39
|
-
}
|
|
40
|
-
var cachedSetTimeout = defaultSetTimout;
|
|
41
|
-
var cachedClearTimeout = defaultClearTimeout;
|
|
42
|
-
if (typeof global$1.setTimeout === 'function') {
|
|
43
|
-
cachedSetTimeout = setTimeout;
|
|
44
|
-
}
|
|
45
|
-
if (typeof global$1.clearTimeout === 'function') {
|
|
46
|
-
cachedClearTimeout = clearTimeout;
|
|
47
|
-
}
|
|
48
|
-
function runTimeout(fun) {
|
|
49
|
-
if (cachedSetTimeout === setTimeout) {
|
|
50
|
-
//normal enviroments in sane situations
|
|
51
|
-
return setTimeout(fun, 0);
|
|
52
|
-
}
|
|
53
|
-
// if setTimeout wasn't available but was latter defined
|
|
54
|
-
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
|
55
|
-
cachedSetTimeout = setTimeout;
|
|
56
|
-
return setTimeout(fun, 0);
|
|
57
|
-
}
|
|
58
|
-
try {
|
|
59
|
-
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
60
|
-
return cachedSetTimeout(fun, 0);
|
|
61
|
-
} catch (e) {
|
|
62
|
-
try {
|
|
63
|
-
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
64
|
-
return cachedSetTimeout.call(null, fun, 0);
|
|
65
|
-
} catch (e) {
|
|
66
|
-
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
|
67
|
-
return cachedSetTimeout.call(this, fun, 0);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
function runClearTimeout(marker) {
|
|
72
|
-
if (cachedClearTimeout === clearTimeout) {
|
|
73
|
-
//normal enviroments in sane situations
|
|
74
|
-
return clearTimeout(marker);
|
|
75
|
-
}
|
|
76
|
-
// if clearTimeout wasn't available but was latter defined
|
|
77
|
-
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
|
78
|
-
cachedClearTimeout = clearTimeout;
|
|
79
|
-
return clearTimeout(marker);
|
|
80
|
-
}
|
|
81
|
-
try {
|
|
82
|
-
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
83
|
-
return cachedClearTimeout(marker);
|
|
84
|
-
} catch (e) {
|
|
85
|
-
try {
|
|
86
|
-
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
87
|
-
return cachedClearTimeout.call(null, marker);
|
|
88
|
-
} catch (e) {
|
|
89
|
-
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
|
90
|
-
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
|
91
|
-
return cachedClearTimeout.call(this, marker);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
var queue = [];
|
|
96
|
-
var draining = false;
|
|
97
|
-
var currentQueue;
|
|
98
|
-
var queueIndex = -1;
|
|
99
|
-
function cleanUpNextTick() {
|
|
100
|
-
if (!draining || !currentQueue) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
draining = false;
|
|
104
|
-
if (currentQueue.length) {
|
|
105
|
-
queue = currentQueue.concat(queue);
|
|
106
|
-
} else {
|
|
107
|
-
queueIndex = -1;
|
|
108
|
-
}
|
|
109
|
-
if (queue.length) {
|
|
110
|
-
drainQueue();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
function drainQueue() {
|
|
114
|
-
if (draining) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
var timeout = runTimeout(cleanUpNextTick);
|
|
118
|
-
draining = true;
|
|
119
|
-
var len = queue.length;
|
|
120
|
-
while (len) {
|
|
121
|
-
currentQueue = queue;
|
|
122
|
-
queue = [];
|
|
123
|
-
while (++queueIndex < len) {
|
|
124
|
-
if (currentQueue) {
|
|
125
|
-
currentQueue[queueIndex].run();
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
queueIndex = -1;
|
|
129
|
-
len = queue.length;
|
|
130
|
-
}
|
|
131
|
-
currentQueue = null;
|
|
132
|
-
draining = false;
|
|
133
|
-
runClearTimeout(timeout);
|
|
134
|
-
}
|
|
135
|
-
function nextTick(fun) {
|
|
136
|
-
var args = new Array(arguments.length - 1);
|
|
137
|
-
if (arguments.length > 1) {
|
|
138
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
139
|
-
args[i - 1] = arguments[i];
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
queue.push(new Item(fun, args));
|
|
143
|
-
if (queue.length === 1 && !draining) {
|
|
144
|
-
runTimeout(drainQueue);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// v8 likes predictible objects
|
|
148
|
-
function Item(fun, array) {
|
|
149
|
-
this.fun = fun;
|
|
150
|
-
this.array = array;
|
|
151
|
-
}
|
|
152
|
-
_c$1 = Item;
|
|
153
|
-
Item.prototype.run = function () {
|
|
154
|
-
this.fun.apply(null, this.array);
|
|
155
|
-
};
|
|
156
|
-
var title = 'browser';
|
|
157
|
-
var platform = 'browser';
|
|
158
|
-
var browser = true;
|
|
159
|
-
var env = {};
|
|
160
|
-
var argv = [];
|
|
161
|
-
var version = ''; // empty string to avoid regexp issues
|
|
162
|
-
var versions = {};
|
|
163
|
-
var release = {};
|
|
164
|
-
var config = {};
|
|
165
|
-
function noop() {}
|
|
166
|
-
var on = noop;
|
|
167
|
-
var addListener = noop;
|
|
168
|
-
var once = noop;
|
|
169
|
-
var off = noop;
|
|
170
|
-
var removeListener = noop;
|
|
171
|
-
var removeAllListeners = noop;
|
|
172
|
-
var emit = noop;
|
|
173
|
-
function binding(name) {
|
|
174
|
-
throw new Error('process.binding is not supported');
|
|
175
|
-
}
|
|
176
|
-
function cwd() {
|
|
177
|
-
return '/';
|
|
178
|
-
}
|
|
179
|
-
function chdir(dir) {
|
|
180
|
-
throw new Error('process.chdir is not supported');
|
|
181
|
-
}
|
|
182
|
-
function umask() {
|
|
183
|
-
return 0;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js
|
|
187
|
-
var performance = global$1.performance || {};
|
|
188
|
-
var performanceNow = performance.now || performance.mozNow || performance.msNow || performance.oNow || performance.webkitNow || function () {
|
|
189
|
-
return new Date().getTime();
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
// generate timestamp or delta
|
|
193
|
-
// see http://nodejs.org/api/process.html#process_process_hrtime
|
|
194
|
-
function hrtime(previousTimestamp) {
|
|
195
|
-
var clocktime = performanceNow.call(performance) * 1e-3;
|
|
196
|
-
var seconds = Math.floor(clocktime);
|
|
197
|
-
var nanoseconds = Math.floor(clocktime % 1 * 1e9);
|
|
198
|
-
if (previousTimestamp) {
|
|
199
|
-
seconds = seconds - previousTimestamp[0];
|
|
200
|
-
nanoseconds = nanoseconds - previousTimestamp[1];
|
|
201
|
-
if (nanoseconds < 0) {
|
|
202
|
-
seconds--;
|
|
203
|
-
nanoseconds += 1e9;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return [seconds, nanoseconds];
|
|
207
|
-
}
|
|
208
|
-
var startTime = new Date();
|
|
209
|
-
function uptime() {
|
|
210
|
-
var currentTime = new Date();
|
|
211
|
-
var dif = currentTime - startTime;
|
|
212
|
-
return dif / 1000;
|
|
213
|
-
}
|
|
214
|
-
var browser$1 = {
|
|
215
|
-
nextTick: nextTick,
|
|
216
|
-
title: title,
|
|
217
|
-
browser: browser,
|
|
218
|
-
env: env,
|
|
219
|
-
argv: argv,
|
|
220
|
-
version: version,
|
|
221
|
-
versions: versions,
|
|
222
|
-
on: on,
|
|
223
|
-
addListener: addListener,
|
|
224
|
-
once: once,
|
|
225
|
-
off: off,
|
|
226
|
-
removeListener: removeListener,
|
|
227
|
-
removeAllListeners: removeAllListeners,
|
|
228
|
-
emit: emit,
|
|
229
|
-
binding: binding,
|
|
230
|
-
cwd: cwd,
|
|
231
|
-
chdir: chdir,
|
|
232
|
-
umask: umask,
|
|
233
|
-
hrtime: hrtime,
|
|
234
|
-
platform: platform,
|
|
235
|
-
release: release,
|
|
236
|
-
config: config,
|
|
237
|
-
uptime: uptime
|
|
238
|
-
};
|
|
239
|
-
var _c$1;
|
|
240
|
-
$RefreshReg$(_c$1, "Item");
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* @remix-run/router v1.19.2
|
|
244
|
-
*
|
|
245
|
-
* Copyright (c) Remix Software Inc.
|
|
246
|
-
*
|
|
247
|
-
* This source code is licensed under the MIT license found in the
|
|
248
|
-
* LICENSE.md file in the root directory of this source tree.
|
|
249
|
-
*
|
|
250
|
-
* @license MIT
|
|
251
|
-
*/
|
|
252
|
-
function _extends$1() {
|
|
253
|
-
_extends$1 = Object.assign ? Object.assign.bind() : function (target) {
|
|
254
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
255
|
-
var source = arguments[i];
|
|
256
|
-
for (var key in source) {
|
|
257
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
258
|
-
target[key] = source[key];
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
return target;
|
|
263
|
-
};
|
|
264
|
-
return _extends$1.apply(this, arguments);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
////////////////////////////////////////////////////////////////////////////////
|
|
268
|
-
//#region Types and Constants
|
|
269
|
-
////////////////////////////////////////////////////////////////////////////////
|
|
270
|
-
/**
|
|
271
|
-
* Actions represent the type of change to a location value.
|
|
272
|
-
*/
|
|
273
|
-
var Action;
|
|
274
|
-
(function (Action) {
|
|
275
|
-
/**
|
|
276
|
-
* A POP indicates a change to an arbitrary index in the history stack, such
|
|
277
|
-
* as a back or forward navigation. It does not describe the direction of the
|
|
278
|
-
* navigation, only that the current index changed.
|
|
279
|
-
*
|
|
280
|
-
* Note: This is the default action for newly created history objects.
|
|
281
|
-
*/
|
|
282
|
-
Action["Pop"] = "POP";
|
|
283
|
-
/**
|
|
284
|
-
* A PUSH indicates a new entry being added to the history stack, such as when
|
|
285
|
-
* a link is clicked and a new page loads. When this happens, all subsequent
|
|
286
|
-
* entries in the stack are lost.
|
|
287
|
-
*/
|
|
288
|
-
Action["Push"] = "PUSH";
|
|
289
|
-
/**
|
|
290
|
-
* A REPLACE indicates the entry at the current index in the history stack
|
|
291
|
-
* being replaced by a new one.
|
|
292
|
-
*/
|
|
293
|
-
Action["Replace"] = "REPLACE";
|
|
294
|
-
})(Action || (Action = {}));
|
|
295
|
-
/**
|
|
296
|
-
* Memory history stores the current location in memory. It is designed for use
|
|
297
|
-
* in stateful non-browser environments like tests and React Native.
|
|
298
|
-
*/
|
|
299
|
-
function createMemoryHistory(options) {
|
|
300
|
-
if (options === undefined) {
|
|
301
|
-
options = {};
|
|
302
|
-
}
|
|
303
|
-
let {
|
|
304
|
-
initialEntries = ["/"],
|
|
305
|
-
initialIndex,
|
|
306
|
-
v5Compat = false
|
|
307
|
-
} = options;
|
|
308
|
-
let entries; // Declare so we can access from createMemoryLocation
|
|
309
|
-
entries = initialEntries.map((entry, index) => createMemoryLocation(entry, typeof entry === "string" ? null : entry.state, index === 0 ? "default" : undefined));
|
|
310
|
-
let index = clampIndex(initialIndex == null ? entries.length - 1 : initialIndex);
|
|
311
|
-
let action = Action.Pop;
|
|
312
|
-
let listener = null;
|
|
313
|
-
function clampIndex(n) {
|
|
314
|
-
return Math.min(Math.max(n, 0), entries.length - 1);
|
|
315
|
-
}
|
|
316
|
-
function getCurrentLocation() {
|
|
317
|
-
return entries[index];
|
|
318
|
-
}
|
|
319
|
-
function createMemoryLocation(to, state, key) {
|
|
320
|
-
if (state === undefined) {
|
|
321
|
-
state = null;
|
|
322
|
-
}
|
|
323
|
-
let location = createLocation(entries ? getCurrentLocation().pathname : "/", to, state, key);
|
|
324
|
-
warning(location.pathname.charAt(0) === "/", "relative pathnames are not supported in memory history: " + JSON.stringify(to));
|
|
325
|
-
return location;
|
|
326
|
-
}
|
|
327
|
-
function createHref(to) {
|
|
328
|
-
return typeof to === "string" ? to : createPath(to);
|
|
329
|
-
}
|
|
330
|
-
let history = {
|
|
331
|
-
get index() {
|
|
332
|
-
return index;
|
|
333
|
-
},
|
|
334
|
-
get action() {
|
|
335
|
-
return action;
|
|
336
|
-
},
|
|
337
|
-
get location() {
|
|
338
|
-
return getCurrentLocation();
|
|
339
|
-
},
|
|
340
|
-
createHref,
|
|
341
|
-
createURL(to) {
|
|
342
|
-
return new URL(createHref(to), "http://localhost");
|
|
343
|
-
},
|
|
344
|
-
encodeLocation(to) {
|
|
345
|
-
let path = typeof to === "string" ? parsePath(to) : to;
|
|
346
|
-
return {
|
|
347
|
-
pathname: path.pathname || "",
|
|
348
|
-
search: path.search || "",
|
|
349
|
-
hash: path.hash || ""
|
|
350
|
-
};
|
|
351
|
-
},
|
|
352
|
-
push(to, state) {
|
|
353
|
-
action = Action.Push;
|
|
354
|
-
let nextLocation = createMemoryLocation(to, state);
|
|
355
|
-
index += 1;
|
|
356
|
-
entries.splice(index, entries.length, nextLocation);
|
|
357
|
-
if (v5Compat && listener) {
|
|
358
|
-
listener({
|
|
359
|
-
action,
|
|
360
|
-
location: nextLocation,
|
|
361
|
-
delta: 1
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
},
|
|
365
|
-
replace(to, state) {
|
|
366
|
-
action = Action.Replace;
|
|
367
|
-
let nextLocation = createMemoryLocation(to, state);
|
|
368
|
-
entries[index] = nextLocation;
|
|
369
|
-
if (v5Compat && listener) {
|
|
370
|
-
listener({
|
|
371
|
-
action,
|
|
372
|
-
location: nextLocation,
|
|
373
|
-
delta: 0
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
},
|
|
377
|
-
go(delta) {
|
|
378
|
-
action = Action.Pop;
|
|
379
|
-
let nextIndex = clampIndex(index + delta);
|
|
380
|
-
let nextLocation = entries[nextIndex];
|
|
381
|
-
index = nextIndex;
|
|
382
|
-
if (listener) {
|
|
383
|
-
listener({
|
|
384
|
-
action,
|
|
385
|
-
location: nextLocation,
|
|
386
|
-
delta
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
},
|
|
390
|
-
listen(fn) {
|
|
391
|
-
listener = fn;
|
|
392
|
-
return () => {
|
|
393
|
-
listener = null;
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
};
|
|
397
|
-
return history;
|
|
398
|
-
}
|
|
399
|
-
function invariant(value, message) {
|
|
400
|
-
if (value === false || value === null || typeof value === "undefined") {
|
|
401
|
-
throw new Error(message);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
function warning(cond, message) {
|
|
405
|
-
if (!cond) {
|
|
406
|
-
// eslint-disable-next-line no-console
|
|
407
|
-
if (typeof console !== "undefined") console.warn(message);
|
|
408
|
-
try {
|
|
409
|
-
// Welcome to debugging history!
|
|
410
|
-
//
|
|
411
|
-
// This error is thrown as a convenience, so you can more easily
|
|
412
|
-
// find the source for a warning that appears in the console by
|
|
413
|
-
// enabling "pause on exceptions" in your JavaScript debugger.
|
|
414
|
-
throw new Error(message);
|
|
415
|
-
// eslint-disable-next-line no-empty
|
|
416
|
-
} catch (e) {}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
function createKey() {
|
|
420
|
-
return Math.random().toString(36).substr(2, 8);
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* Creates a Location object with a unique key from the given Path
|
|
424
|
-
*/
|
|
425
|
-
function createLocation(current, to, state, key) {
|
|
426
|
-
if (state === undefined) {
|
|
427
|
-
state = null;
|
|
428
|
-
}
|
|
429
|
-
let location = _extends$1({
|
|
430
|
-
pathname: typeof current === "string" ? current : current.pathname,
|
|
431
|
-
search: "",
|
|
432
|
-
hash: ""
|
|
433
|
-
}, typeof to === "string" ? parsePath(to) : to, {
|
|
434
|
-
state,
|
|
435
|
-
// TODO: This could be cleaned up. push/replace should probably just take
|
|
436
|
-
// full Locations now and avoid the need to run through this flow at all
|
|
437
|
-
// But that's a pretty big refactor to the current test suite so going to
|
|
438
|
-
// keep as is for the time being and just let any incoming keys take precedence
|
|
439
|
-
key: to && to.key || key || createKey()
|
|
440
|
-
});
|
|
441
|
-
return location;
|
|
442
|
-
}
|
|
443
|
-
/**
|
|
444
|
-
* Creates a string URL path from the given pathname, search, and hash components.
|
|
445
|
-
*/
|
|
446
|
-
function createPath(_ref) {
|
|
447
|
-
let {
|
|
448
|
-
pathname = "/",
|
|
449
|
-
search = "",
|
|
450
|
-
hash = ""
|
|
451
|
-
} = _ref;
|
|
452
|
-
if (search && search !== "?") pathname += search.charAt(0) === "?" ? search : "?" + search;
|
|
453
|
-
if (hash && hash !== "#") pathname += hash.charAt(0) === "#" ? hash : "#" + hash;
|
|
454
|
-
return pathname;
|
|
455
|
-
}
|
|
456
|
-
/**
|
|
457
|
-
* Parses a string URL path into its separate pathname, search, and hash components.
|
|
458
|
-
*/
|
|
459
|
-
function parsePath(path) {
|
|
460
|
-
let parsedPath = {};
|
|
461
|
-
if (path) {
|
|
462
|
-
let hashIndex = path.indexOf("#");
|
|
463
|
-
if (hashIndex >= 0) {
|
|
464
|
-
parsedPath.hash = path.substr(hashIndex);
|
|
465
|
-
path = path.substr(0, hashIndex);
|
|
466
|
-
}
|
|
467
|
-
let searchIndex = path.indexOf("?");
|
|
468
|
-
if (searchIndex >= 0) {
|
|
469
|
-
parsedPath.search = path.substr(searchIndex);
|
|
470
|
-
path = path.substr(0, searchIndex);
|
|
471
|
-
}
|
|
472
|
-
if (path) {
|
|
473
|
-
parsedPath.pathname = path;
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
return parsedPath;
|
|
477
|
-
}
|
|
478
|
-
//#endregion
|
|
479
|
-
|
|
480
|
-
var ResultType;
|
|
481
|
-
(function (ResultType) {
|
|
482
|
-
ResultType["data"] = "data";
|
|
483
|
-
ResultType["deferred"] = "deferred";
|
|
484
|
-
ResultType["redirect"] = "redirect";
|
|
485
|
-
ResultType["error"] = "error";
|
|
486
|
-
})(ResultType || (ResultType = {}));
|
|
487
|
-
/**
|
|
488
|
-
* Matches the given routes to a location and returns the match data.
|
|
489
|
-
*
|
|
490
|
-
* @see https://reactrouter.com/utils/match-routes
|
|
491
|
-
*/
|
|
492
|
-
function matchRoutes(routes, locationArg, basename) {
|
|
493
|
-
if (basename === undefined) {
|
|
494
|
-
basename = "/";
|
|
495
|
-
}
|
|
496
|
-
return matchRoutesImpl(routes, locationArg, basename);
|
|
497
|
-
}
|
|
498
|
-
function matchRoutesImpl(routes, locationArg, basename, allowPartial) {
|
|
499
|
-
let location = typeof locationArg === "string" ? parsePath(locationArg) : locationArg;
|
|
500
|
-
let pathname = stripBasename(location.pathname || "/", basename);
|
|
501
|
-
if (pathname == null) {
|
|
502
|
-
return null;
|
|
503
|
-
}
|
|
504
|
-
let branches = flattenRoutes(routes);
|
|
505
|
-
rankRouteBranches(branches);
|
|
506
|
-
let matches = null;
|
|
507
|
-
for (let i = 0; matches == null && i < branches.length; ++i) {
|
|
508
|
-
// Incoming pathnames are generally encoded from either window.location
|
|
509
|
-
// or from router.navigate, but we want to match against the unencoded
|
|
510
|
-
// paths in the route definitions. Memory router locations won't be
|
|
511
|
-
// encoded here but there also shouldn't be anything to decode so this
|
|
512
|
-
// should be a safe operation. This avoids needing matchRoutes to be
|
|
513
|
-
// history-aware.
|
|
514
|
-
let decoded = decodePath(pathname);
|
|
515
|
-
matches = matchRouteBranch(branches[i], decoded);
|
|
516
|
-
}
|
|
517
|
-
return matches;
|
|
518
|
-
}
|
|
519
|
-
function convertRouteMatchToUiMatch(match, loaderData) {
|
|
520
|
-
let {
|
|
521
|
-
route,
|
|
522
|
-
pathname,
|
|
523
|
-
params
|
|
524
|
-
} = match;
|
|
525
|
-
return {
|
|
526
|
-
id: route.id,
|
|
527
|
-
pathname,
|
|
528
|
-
params,
|
|
529
|
-
data: loaderData[route.id],
|
|
530
|
-
handle: route.handle
|
|
531
|
-
};
|
|
532
|
-
}
|
|
533
|
-
function flattenRoutes(routes, branches, parentsMeta, parentPath) {
|
|
534
|
-
if (branches === undefined) {
|
|
535
|
-
branches = [];
|
|
536
|
-
}
|
|
537
|
-
if (parentsMeta === undefined) {
|
|
538
|
-
parentsMeta = [];
|
|
539
|
-
}
|
|
540
|
-
if (parentPath === undefined) {
|
|
541
|
-
parentPath = "";
|
|
542
|
-
}
|
|
543
|
-
let flattenRoute = (route, index, relativePath) => {
|
|
544
|
-
let meta = {
|
|
545
|
-
relativePath: relativePath === undefined ? route.path || "" : relativePath,
|
|
546
|
-
caseSensitive: route.caseSensitive === true,
|
|
547
|
-
childrenIndex: index,
|
|
548
|
-
route
|
|
549
|
-
};
|
|
550
|
-
if (meta.relativePath.startsWith("/")) {
|
|
551
|
-
invariant(meta.relativePath.startsWith(parentPath), "Absolute route path \"" + meta.relativePath + "\" nested under path " + ("\"" + parentPath + "\" is not valid. An absolute child route path ") + "must start with the combined path of all its parent routes.");
|
|
552
|
-
meta.relativePath = meta.relativePath.slice(parentPath.length);
|
|
553
|
-
}
|
|
554
|
-
let path = joinPaths([parentPath, meta.relativePath]);
|
|
555
|
-
let routesMeta = parentsMeta.concat(meta);
|
|
556
|
-
// Add the children before adding this route to the array, so we traverse the
|
|
557
|
-
// route tree depth-first and child routes appear before their parents in
|
|
558
|
-
// the "flattened" version.
|
|
559
|
-
if (route.children && route.children.length > 0) {
|
|
560
|
-
invariant(
|
|
561
|
-
// Our types know better, but runtime JS may not!
|
|
562
|
-
// @ts-expect-error
|
|
563
|
-
route.index !== true, "Index routes must not have child routes. Please remove " + ("all child routes from route path \"" + path + "\"."));
|
|
564
|
-
flattenRoutes(route.children, branches, routesMeta, path);
|
|
565
|
-
}
|
|
566
|
-
// Routes without a path shouldn't ever match by themselves unless they are
|
|
567
|
-
// index routes, so don't add them to the list of possible branches.
|
|
568
|
-
if (route.path == null && !route.index) {
|
|
569
|
-
return;
|
|
570
|
-
}
|
|
571
|
-
branches.push({
|
|
572
|
-
path,
|
|
573
|
-
score: computeScore(path, route.index),
|
|
574
|
-
routesMeta
|
|
575
|
-
});
|
|
576
|
-
};
|
|
577
|
-
routes.forEach((route, index) => {
|
|
578
|
-
var _route$path;
|
|
579
|
-
// coarse-grain check for optional params
|
|
580
|
-
if (route.path === "" || !((_route$path = route.path) != null && _route$path.includes("?"))) {
|
|
581
|
-
flattenRoute(route, index);
|
|
582
|
-
} else {
|
|
583
|
-
for (let exploded of explodeOptionalSegments(route.path)) {
|
|
584
|
-
flattenRoute(route, index, exploded);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
});
|
|
588
|
-
return branches;
|
|
589
|
-
}
|
|
590
|
-
/**
|
|
591
|
-
* Computes all combinations of optional path segments for a given path,
|
|
592
|
-
* excluding combinations that are ambiguous and of lower priority.
|
|
593
|
-
*
|
|
594
|
-
* For example, `/one/:two?/three/:four?/:five?` explodes to:
|
|
595
|
-
* - `/one/three`
|
|
596
|
-
* - `/one/:two/three`
|
|
597
|
-
* - `/one/three/:four`
|
|
598
|
-
* - `/one/three/:five`
|
|
599
|
-
* - `/one/:two/three/:four`
|
|
600
|
-
* - `/one/:two/three/:five`
|
|
601
|
-
* - `/one/three/:four/:five`
|
|
602
|
-
* - `/one/:two/three/:four/:five`
|
|
603
|
-
*/
|
|
604
|
-
function explodeOptionalSegments(path) {
|
|
605
|
-
let segments = path.split("/");
|
|
606
|
-
if (segments.length === 0) return [];
|
|
607
|
-
let [first, ...rest] = segments;
|
|
608
|
-
// Optional path segments are denoted by a trailing `?`
|
|
609
|
-
let isOptional = first.endsWith("?");
|
|
610
|
-
// Compute the corresponding required segment: `foo?` -> `foo`
|
|
611
|
-
let required = first.replace(/\?$/, "");
|
|
612
|
-
if (rest.length === 0) {
|
|
613
|
-
// Intepret empty string as omitting an optional segment
|
|
614
|
-
// `["one", "", "three"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`
|
|
615
|
-
return isOptional ? [required, ""] : [required];
|
|
616
|
-
}
|
|
617
|
-
let restExploded = explodeOptionalSegments(rest.join("/"));
|
|
618
|
-
let result = [];
|
|
619
|
-
// All child paths with the prefix. Do this for all children before the
|
|
620
|
-
// optional version for all children, so we get consistent ordering where the
|
|
621
|
-
// parent optional aspect is preferred as required. Otherwise, we can get
|
|
622
|
-
// child sections interspersed where deeper optional segments are higher than
|
|
623
|
-
// parent optional segments, where for example, /:two would explode _earlier_
|
|
624
|
-
// then /:one. By always including the parent as required _for all children_
|
|
625
|
-
// first, we avoid this issue
|
|
626
|
-
result.push(...restExploded.map(subpath => subpath === "" ? required : [required, subpath].join("/")));
|
|
627
|
-
// Then, if this is an optional value, add all child versions without
|
|
628
|
-
if (isOptional) {
|
|
629
|
-
result.push(...restExploded);
|
|
630
|
-
}
|
|
631
|
-
// for absolute paths, ensure `/` instead of empty segment
|
|
632
|
-
return result.map(exploded => path.startsWith("/") && exploded === "" ? "/" : exploded);
|
|
633
|
-
}
|
|
634
|
-
function rankRouteBranches(branches) {
|
|
635
|
-
branches.sort((a, b) => a.score !== b.score ? b.score - a.score // Higher score first
|
|
636
|
-
: compareIndexes(a.routesMeta.map(meta => meta.childrenIndex), b.routesMeta.map(meta => meta.childrenIndex)));
|
|
637
|
-
}
|
|
638
|
-
const paramRe = /^:[\w-]+$/;
|
|
639
|
-
const dynamicSegmentValue = 3;
|
|
640
|
-
const indexRouteValue = 2;
|
|
641
|
-
const emptySegmentValue = 1;
|
|
642
|
-
const staticSegmentValue = 10;
|
|
643
|
-
const splatPenalty = -2;
|
|
644
|
-
const isSplat = s => s === "*";
|
|
645
|
-
function computeScore(path, index) {
|
|
646
|
-
let segments = path.split("/");
|
|
647
|
-
let initialScore = segments.length;
|
|
648
|
-
if (segments.some(isSplat)) {
|
|
649
|
-
initialScore += splatPenalty;
|
|
650
|
-
}
|
|
651
|
-
if (index) {
|
|
652
|
-
initialScore += indexRouteValue;
|
|
653
|
-
}
|
|
654
|
-
return segments.filter(s => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === "" ? emptySegmentValue : staticSegmentValue), initialScore);
|
|
655
|
-
}
|
|
656
|
-
function compareIndexes(a, b) {
|
|
657
|
-
let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);
|
|
658
|
-
return siblings ?
|
|
659
|
-
// If two routes are siblings, we should try to match the earlier sibling
|
|
660
|
-
// first. This allows people to have fine-grained control over the matching
|
|
661
|
-
// behavior by simply putting routes with identical paths in the order they
|
|
662
|
-
// want them tried.
|
|
663
|
-
a[a.length - 1] - b[b.length - 1] :
|
|
664
|
-
// Otherwise, it doesn't really make sense to rank non-siblings by index,
|
|
665
|
-
// so they sort equally.
|
|
666
|
-
0;
|
|
667
|
-
}
|
|
668
|
-
function matchRouteBranch(branch, pathname, allowPartial) {
|
|
669
|
-
let {
|
|
670
|
-
routesMeta
|
|
671
|
-
} = branch;
|
|
672
|
-
let matchedParams = {};
|
|
673
|
-
let matchedPathname = "/";
|
|
674
|
-
let matches = [];
|
|
675
|
-
for (let i = 0; i < routesMeta.length; ++i) {
|
|
676
|
-
let meta = routesMeta[i];
|
|
677
|
-
let end = i === routesMeta.length - 1;
|
|
678
|
-
let remainingPathname = matchedPathname === "/" ? pathname : pathname.slice(matchedPathname.length) || "/";
|
|
679
|
-
let match = matchPath({
|
|
680
|
-
path: meta.relativePath,
|
|
681
|
-
caseSensitive: meta.caseSensitive,
|
|
682
|
-
end
|
|
683
|
-
}, remainingPathname);
|
|
684
|
-
let route = meta.route;
|
|
685
|
-
if (!match) {
|
|
686
|
-
return null;
|
|
687
|
-
}
|
|
688
|
-
Object.assign(matchedParams, match.params);
|
|
689
|
-
matches.push({
|
|
690
|
-
// TODO: Can this as be avoided?
|
|
691
|
-
params: matchedParams,
|
|
692
|
-
pathname: joinPaths([matchedPathname, match.pathname]),
|
|
693
|
-
pathnameBase: normalizePathname(joinPaths([matchedPathname, match.pathnameBase])),
|
|
694
|
-
route
|
|
695
|
-
});
|
|
696
|
-
if (match.pathnameBase !== "/") {
|
|
697
|
-
matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
return matches;
|
|
701
|
-
}
|
|
702
|
-
/**
|
|
703
|
-
* Performs pattern matching on a URL pathname and returns information about
|
|
704
|
-
* the match.
|
|
705
|
-
*
|
|
706
|
-
* @see https://reactrouter.com/utils/match-path
|
|
707
|
-
*/
|
|
708
|
-
function matchPath(pattern, pathname) {
|
|
709
|
-
if (typeof pattern === "string") {
|
|
710
|
-
pattern = {
|
|
711
|
-
path: pattern,
|
|
712
|
-
caseSensitive: false,
|
|
713
|
-
end: true
|
|
714
|
-
};
|
|
715
|
-
}
|
|
716
|
-
let [matcher, compiledParams] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);
|
|
717
|
-
let match = pathname.match(matcher);
|
|
718
|
-
if (!match) return null;
|
|
719
|
-
let matchedPathname = match[0];
|
|
720
|
-
let pathnameBase = matchedPathname.replace(/(.)\/+$/, "$1");
|
|
721
|
-
let captureGroups = match.slice(1);
|
|
722
|
-
let params = compiledParams.reduce((memo, _ref, index) => {
|
|
723
|
-
let {
|
|
724
|
-
paramName,
|
|
725
|
-
isOptional
|
|
726
|
-
} = _ref;
|
|
727
|
-
// We need to compute the pathnameBase here using the raw splat value
|
|
728
|
-
// instead of using params["*"] later because it will be decoded then
|
|
729
|
-
if (paramName === "*") {
|
|
730
|
-
let splatValue = captureGroups[index] || "";
|
|
731
|
-
pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\/+$/, "$1");
|
|
732
|
-
}
|
|
733
|
-
const value = captureGroups[index];
|
|
734
|
-
if (isOptional && !value) {
|
|
735
|
-
memo[paramName] = undefined;
|
|
736
|
-
} else {
|
|
737
|
-
memo[paramName] = (value || "").replace(/%2F/g, "/");
|
|
738
|
-
}
|
|
739
|
-
return memo;
|
|
740
|
-
}, {});
|
|
741
|
-
return {
|
|
742
|
-
params,
|
|
743
|
-
pathname: matchedPathname,
|
|
744
|
-
pathnameBase,
|
|
745
|
-
pattern
|
|
746
|
-
};
|
|
747
|
-
}
|
|
748
|
-
function compilePath(path, caseSensitive, end) {
|
|
749
|
-
if (caseSensitive === undefined) {
|
|
750
|
-
caseSensitive = false;
|
|
751
|
-
}
|
|
752
|
-
if (end === undefined) {
|
|
753
|
-
end = true;
|
|
754
|
-
}
|
|
755
|
-
warning(path === "*" || !path.endsWith("*") || path.endsWith("/*"), "Route path \"" + path + "\" will be treated as if it were " + ("\"" + path.replace(/\*$/, "/*") + "\" because the `*` character must ") + "always follow a `/` in the pattern. To get rid of this warning, " + ("please change the route path to \"" + path.replace(/\*$/, "/*") + "\"."));
|
|
756
|
-
let params = [];
|
|
757
|
-
let regexpSource = "^" + path.replace(/\/*\*?$/, "") // Ignore trailing / and /*, we'll handle it below
|
|
758
|
-
.replace(/^\/*/, "/") // Make sure it has a leading /
|
|
759
|
-
.replace(/[\\.*+^${}|()[\]]/g, "\\$&") // Escape special regex chars
|
|
760
|
-
.replace(/\/:([\w-]+)(\?)?/g, (_, paramName, isOptional) => {
|
|
761
|
-
params.push({
|
|
762
|
-
paramName,
|
|
763
|
-
isOptional: isOptional != null
|
|
764
|
-
});
|
|
765
|
-
return isOptional ? "/?([^\\/]+)?" : "/([^\\/]+)";
|
|
766
|
-
});
|
|
767
|
-
if (path.endsWith("*")) {
|
|
768
|
-
params.push({
|
|
769
|
-
paramName: "*"
|
|
770
|
-
});
|
|
771
|
-
regexpSource += path === "*" || path === "/*" ? "(.*)$" // Already matched the initial /, just match the rest
|
|
772
|
-
: "(?:\\/(.+)|\\/*)$"; // Don't include the / in params["*"]
|
|
773
|
-
} else if (end) {
|
|
774
|
-
// When matching to the end, ignore trailing slashes
|
|
775
|
-
regexpSource += "\\/*$";
|
|
776
|
-
} else if (path !== "" && path !== "/") {
|
|
777
|
-
// If our path is non-empty and contains anything beyond an initial slash,
|
|
778
|
-
// then we have _some_ form of path in our regex, so we should expect to
|
|
779
|
-
// match only if we find the end of this path segment. Look for an optional
|
|
780
|
-
// non-captured trailing slash (to match a portion of the URL) or the end
|
|
781
|
-
// of the path (if we've matched to the end). We used to do this with a
|
|
782
|
-
// word boundary but that gives false positives on routes like
|
|
783
|
-
// /user-preferences since `-` counts as a word boundary.
|
|
784
|
-
regexpSource += "(?:(?=\\/|$))";
|
|
785
|
-
} else ;
|
|
786
|
-
let matcher = new RegExp(regexpSource, caseSensitive ? undefined : "i");
|
|
787
|
-
return [matcher, params];
|
|
788
|
-
}
|
|
789
|
-
function decodePath(value) {
|
|
790
|
-
try {
|
|
791
|
-
return value.split("/").map(v => decodeURIComponent(v).replace(/\//g, "%2F")).join("/");
|
|
792
|
-
} catch (error) {
|
|
793
|
-
warning(false, "The URL path \"" + value + "\" could not be decoded because it is is a " + "malformed URL segment. This is probably due to a bad percent " + ("encoding (" + error + ")."));
|
|
794
|
-
return value;
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
/**
|
|
798
|
-
* @private
|
|
799
|
-
*/
|
|
800
|
-
function stripBasename(pathname, basename) {
|
|
801
|
-
if (basename === "/") return pathname;
|
|
802
|
-
if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {
|
|
803
|
-
return null;
|
|
804
|
-
}
|
|
805
|
-
// We want to leave trailing slash behavior in the user's control, so if they
|
|
806
|
-
// specify a basename with a trailing slash, we should support it
|
|
807
|
-
let startIndex = basename.endsWith("/") ? basename.length - 1 : basename.length;
|
|
808
|
-
let nextChar = pathname.charAt(startIndex);
|
|
809
|
-
if (nextChar && nextChar !== "/") {
|
|
810
|
-
// pathname does not start with basename/
|
|
811
|
-
return null;
|
|
812
|
-
}
|
|
813
|
-
return pathname.slice(startIndex) || "/";
|
|
814
|
-
}
|
|
815
|
-
/**
|
|
816
|
-
* Returns a resolved path object relative to the given pathname.
|
|
817
|
-
*
|
|
818
|
-
* @see https://reactrouter.com/utils/resolve-path
|
|
819
|
-
*/
|
|
820
|
-
function resolvePath(to, fromPathname) {
|
|
821
|
-
if (fromPathname === undefined) {
|
|
822
|
-
fromPathname = "/";
|
|
823
|
-
}
|
|
824
|
-
let {
|
|
825
|
-
pathname: toPathname,
|
|
826
|
-
search = "",
|
|
827
|
-
hash = ""
|
|
828
|
-
} = typeof to === "string" ? parsePath(to) : to;
|
|
829
|
-
let pathname = toPathname ? toPathname.startsWith("/") ? toPathname : resolvePathname(toPathname, fromPathname) : fromPathname;
|
|
830
|
-
return {
|
|
831
|
-
pathname,
|
|
832
|
-
search: normalizeSearch(search),
|
|
833
|
-
hash: normalizeHash(hash)
|
|
834
|
-
};
|
|
835
|
-
}
|
|
836
|
-
function resolvePathname(relativePath, fromPathname) {
|
|
837
|
-
let segments = fromPathname.replace(/\/+$/, "").split("/");
|
|
838
|
-
let relativeSegments = relativePath.split("/");
|
|
839
|
-
relativeSegments.forEach(segment => {
|
|
840
|
-
if (segment === "..") {
|
|
841
|
-
// Keep the root "" segment so the pathname starts at /
|
|
842
|
-
if (segments.length > 1) segments.pop();
|
|
843
|
-
} else if (segment !== ".") {
|
|
844
|
-
segments.push(segment);
|
|
845
|
-
}
|
|
846
|
-
});
|
|
847
|
-
return segments.length > 1 ? segments.join("/") : "/";
|
|
848
|
-
}
|
|
849
|
-
function getInvalidPathError(char, field, dest, path) {
|
|
850
|
-
return "Cannot include a '" + char + "' character in a manually specified " + ("`to." + field + "` field [" + JSON.stringify(path) + "]. Please separate it out to the ") + ("`to." + dest + "` field. Alternatively you may provide the full path as ") + "a string in <Link to=\"...\"> and the router will parse it for you.";
|
|
851
|
-
}
|
|
852
|
-
/**
|
|
853
|
-
* @private
|
|
854
|
-
*
|
|
855
|
-
* When processing relative navigation we want to ignore ancestor routes that
|
|
856
|
-
* do not contribute to the path, such that index/pathless layout routes don't
|
|
857
|
-
* interfere.
|
|
858
|
-
*
|
|
859
|
-
* For example, when moving a route element into an index route and/or a
|
|
860
|
-
* pathless layout route, relative link behavior contained within should stay
|
|
861
|
-
* the same. Both of the following examples should link back to the root:
|
|
862
|
-
*
|
|
863
|
-
* <Route path="/">
|
|
864
|
-
* <Route path="accounts" element={<Link to=".."}>
|
|
865
|
-
* </Route>
|
|
866
|
-
*
|
|
867
|
-
* <Route path="/">
|
|
868
|
-
* <Route path="accounts">
|
|
869
|
-
* <Route element={<AccountsLayout />}> // <-- Does not contribute
|
|
870
|
-
* <Route index element={<Link to=".."} /> // <-- Does not contribute
|
|
871
|
-
* </Route
|
|
872
|
-
* </Route>
|
|
873
|
-
* </Route>
|
|
874
|
-
*/
|
|
875
|
-
function getPathContributingMatches(matches) {
|
|
876
|
-
return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);
|
|
877
|
-
}
|
|
878
|
-
// Return the array of pathnames for the current route matches - used to
|
|
879
|
-
// generate the routePathnames input for resolveTo()
|
|
880
|
-
function getResolveToMatches(matches, v7_relativeSplatPath) {
|
|
881
|
-
let pathMatches = getPathContributingMatches(matches);
|
|
882
|
-
// When v7_relativeSplatPath is enabled, use the full pathname for the leaf
|
|
883
|
-
// match so we include splat values for "." links. See:
|
|
884
|
-
// https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329
|
|
885
|
-
if (v7_relativeSplatPath) {
|
|
886
|
-
return pathMatches.map((match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase);
|
|
887
|
-
}
|
|
888
|
-
return pathMatches.map(match => match.pathnameBase);
|
|
889
|
-
}
|
|
890
|
-
/**
|
|
891
|
-
* @private
|
|
892
|
-
*/
|
|
893
|
-
function resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {
|
|
894
|
-
if (isPathRelative === undefined) {
|
|
895
|
-
isPathRelative = false;
|
|
896
|
-
}
|
|
897
|
-
let to;
|
|
898
|
-
if (typeof toArg === "string") {
|
|
899
|
-
to = parsePath(toArg);
|
|
900
|
-
} else {
|
|
901
|
-
to = _extends$1({}, toArg);
|
|
902
|
-
invariant(!to.pathname || !to.pathname.includes("?"), getInvalidPathError("?", "pathname", "search", to));
|
|
903
|
-
invariant(!to.pathname || !to.pathname.includes("#"), getInvalidPathError("#", "pathname", "hash", to));
|
|
904
|
-
invariant(!to.search || !to.search.includes("#"), getInvalidPathError("#", "search", "hash", to));
|
|
905
|
-
}
|
|
906
|
-
let isEmptyPath = toArg === "" || to.pathname === "";
|
|
907
|
-
let toPathname = isEmptyPath ? "/" : to.pathname;
|
|
908
|
-
let from;
|
|
909
|
-
// Routing is relative to the current pathname if explicitly requested.
|
|
910
|
-
//
|
|
911
|
-
// If a pathname is explicitly provided in `to`, it should be relative to the
|
|
912
|
-
// route context. This is explained in `Note on `<Link to>` values` in our
|
|
913
|
-
// migration guide from v5 as a means of disambiguation between `to` values
|
|
914
|
-
// that begin with `/` and those that do not. However, this is problematic for
|
|
915
|
-
// `to` values that do not provide a pathname. `to` can simply be a search or
|
|
916
|
-
// hash string, in which case we should assume that the navigation is relative
|
|
917
|
-
// to the current location's pathname and *not* the route pathname.
|
|
918
|
-
if (toPathname == null) {
|
|
919
|
-
from = locationPathname;
|
|
920
|
-
} else {
|
|
921
|
-
let routePathnameIndex = routePathnames.length - 1;
|
|
922
|
-
// With relative="route" (the default), each leading .. segment means
|
|
923
|
-
// "go up one route" instead of "go up one URL segment". This is a key
|
|
924
|
-
// difference from how <a href> works and a major reason we call this a
|
|
925
|
-
// "to" value instead of a "href".
|
|
926
|
-
if (!isPathRelative && toPathname.startsWith("..")) {
|
|
927
|
-
let toSegments = toPathname.split("/");
|
|
928
|
-
while (toSegments[0] === "..") {
|
|
929
|
-
toSegments.shift();
|
|
930
|
-
routePathnameIndex -= 1;
|
|
931
|
-
}
|
|
932
|
-
to.pathname = toSegments.join("/");
|
|
933
|
-
}
|
|
934
|
-
from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : "/";
|
|
935
|
-
}
|
|
936
|
-
let path = resolvePath(to, from);
|
|
937
|
-
// Ensure the pathname has a trailing slash if the original "to" had one
|
|
938
|
-
let hasExplicitTrailingSlash = toPathname && toPathname !== "/" && toPathname.endsWith("/");
|
|
939
|
-
// Or if this was a link to the current path which has a trailing slash
|
|
940
|
-
let hasCurrentTrailingSlash = (isEmptyPath || toPathname === ".") && locationPathname.endsWith("/");
|
|
941
|
-
if (!path.pathname.endsWith("/") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {
|
|
942
|
-
path.pathname += "/";
|
|
943
|
-
}
|
|
944
|
-
return path;
|
|
945
|
-
}
|
|
946
|
-
/**
|
|
947
|
-
* @private
|
|
948
|
-
*/
|
|
949
|
-
const joinPaths = paths => paths.join("/").replace(/\/\/+/g, "/");
|
|
950
|
-
/**
|
|
951
|
-
* @private
|
|
952
|
-
*/
|
|
953
|
-
const normalizePathname = pathname => pathname.replace(/\/+$/, "").replace(/^\/*/, "/");
|
|
954
|
-
/**
|
|
955
|
-
* @private
|
|
956
|
-
*/
|
|
957
|
-
const normalizeSearch = search => !search || search === "?" ? "" : search.startsWith("?") ? search : "?" + search;
|
|
958
|
-
/**
|
|
959
|
-
* @private
|
|
960
|
-
*/
|
|
961
|
-
const normalizeHash = hash => !hash || hash === "#" ? "" : hash.startsWith("#") ? hash : "#" + hash;
|
|
962
|
-
class AbortedDeferredError extends Error {}
|
|
963
|
-
/**
|
|
964
|
-
* Check if the given error is an ErrorResponse generated from a 4xx/5xx
|
|
965
|
-
* Response thrown from an action/loader
|
|
966
|
-
*/
|
|
967
|
-
function isRouteErrorResponse(error) {
|
|
968
|
-
return error != null && typeof error.status === "number" && typeof error.statusText === "string" && typeof error.internal === "boolean" && "data" in error;
|
|
969
|
-
}
|
|
970
|
-
const validMutationMethodsArr = ["post", "put", "patch", "delete"];
|
|
971
|
-
new Set(validMutationMethodsArr);
|
|
972
|
-
const validRequestMethodsArr = ["get", ...validMutationMethodsArr];
|
|
973
|
-
new Set(validRequestMethodsArr);
|
|
974
|
-
const IDLE_BLOCKER = {
|
|
975
|
-
state: "unblocked",
|
|
976
|
-
proceed: undefined,
|
|
977
|
-
reset: undefined,
|
|
978
|
-
location: undefined
|
|
979
|
-
};
|
|
980
|
-
|
|
981
|
-
var _s = $RefreshSig$(),
|
|
982
|
-
_s2 = $RefreshSig$(),
|
|
983
|
-
_s3 = $RefreshSig$(),
|
|
984
|
-
_s4 = $RefreshSig$(),
|
|
985
|
-
_s5 = $RefreshSig$(),
|
|
986
|
-
_s6 = $RefreshSig$(),
|
|
987
|
-
_s7 = $RefreshSig$(),
|
|
988
|
-
_s8 = $RefreshSig$(),
|
|
989
|
-
_s9 = $RefreshSig$(),
|
|
990
|
-
_s10 = $RefreshSig$(),
|
|
991
|
-
_s11 = $RefreshSig$(),
|
|
992
|
-
_s12 = $RefreshSig$(),
|
|
993
|
-
_s13 = $RefreshSig$(),
|
|
994
|
-
_s14 = $RefreshSig$(),
|
|
995
|
-
_s15 = $RefreshSig$(),
|
|
996
|
-
_s16 = $RefreshSig$(),
|
|
997
|
-
_s17 = $RefreshSig$(),
|
|
998
|
-
_s18 = $RefreshSig$(),
|
|
999
|
-
_s19 = $RefreshSig$(),
|
|
1000
|
-
_s20 = $RefreshSig$(),
|
|
1001
|
-
_s21 = $RefreshSig$(),
|
|
1002
|
-
_s22 = $RefreshSig$(),
|
|
1003
|
-
_s23 = $RefreshSig$(),
|
|
1004
|
-
_s24 = $RefreshSig$(),
|
|
1005
|
-
_s25 = $RefreshSig$(),
|
|
1006
|
-
_s26 = $RefreshSig$(),
|
|
1007
|
-
_s27 = $RefreshSig$(),
|
|
1008
|
-
_s28 = $RefreshSig$(),
|
|
1009
|
-
_s29 = $RefreshSig$(),
|
|
1010
|
-
_s30 = $RefreshSig$(),
|
|
1011
|
-
_s31 = $RefreshSig$(),
|
|
1012
|
-
_s32 = $RefreshSig$(),
|
|
1013
|
-
_s33 = $RefreshSig$(),
|
|
1014
|
-
_s34 = $RefreshSig$(),
|
|
1015
|
-
_s35 = $RefreshSig$(),
|
|
1016
|
-
_s36 = $RefreshSig$(),
|
|
1017
|
-
_s37 = $RefreshSig$(),
|
|
1018
|
-
_s38 = $RefreshSig$(),
|
|
1019
|
-
_s39 = $RefreshSig$(),
|
|
1020
|
-
_s40 = $RefreshSig$();
|
|
1021
|
-
function _extends() {
|
|
1022
|
-
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
|
1023
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
1024
|
-
var source = arguments[i];
|
|
1025
|
-
for (var key in source) {
|
|
1026
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
1027
|
-
target[key] = source[key];
|
|
1028
|
-
}
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
return target;
|
|
1032
|
-
};
|
|
1033
|
-
return _extends.apply(this, arguments);
|
|
1034
|
-
}
|
|
1035
|
-
|
|
1036
|
-
// Create react-specific types from the agnostic types in @remix-run/router to
|
|
1037
|
-
// export from react-router
|
|
1038
|
-
const DataRouterContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
1039
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1040
|
-
DataRouterContext.displayName = "DataRouter";
|
|
1041
|
-
}
|
|
1042
|
-
const DataRouterStateContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
1043
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1044
|
-
DataRouterStateContext.displayName = "DataRouterState";
|
|
1045
|
-
}
|
|
1046
|
-
const AwaitContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
1047
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1048
|
-
AwaitContext.displayName = "Await";
|
|
1049
|
-
}
|
|
1050
|
-
|
|
1051
|
-
/**
|
|
1052
|
-
* A Navigator is a "location changer"; it's how you get to different locations.
|
|
1053
|
-
*
|
|
1054
|
-
* Every history instance conforms to the Navigator interface, but the
|
|
1055
|
-
* distinction is useful primarily when it comes to the low-level `<Router>` API
|
|
1056
|
-
* where both the location and a navigator must be provided separately in order
|
|
1057
|
-
* to avoid "tearing" that may occur in a suspense-enabled app if the action
|
|
1058
|
-
* and/or location were to be read directly from the history instance.
|
|
1059
|
-
*/
|
|
1060
|
-
|
|
1061
|
-
const NavigationContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
1062
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1063
|
-
NavigationContext.displayName = "Navigation";
|
|
1064
|
-
}
|
|
1065
|
-
const LocationContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
1066
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1067
|
-
LocationContext.displayName = "Location";
|
|
1068
|
-
}
|
|
1069
|
-
const RouteContext = /*#__PURE__*/React__namespace.createContext({
|
|
1070
|
-
outlet: null,
|
|
1071
|
-
matches: [],
|
|
1072
|
-
isDataRoute: false
|
|
1073
|
-
});
|
|
1074
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1075
|
-
RouteContext.displayName = "Route";
|
|
1076
|
-
}
|
|
1077
|
-
const RouteErrorContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
1078
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1079
|
-
RouteErrorContext.displayName = "RouteError";
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
/**
|
|
1083
|
-
* Returns the full href for the given "to" value. This is useful for building
|
|
1084
|
-
* custom links that are also accessible and preserve right-click behavior.
|
|
1085
|
-
*
|
|
1086
|
-
* @see https://reactrouter.com/hooks/use-href
|
|
1087
|
-
*/
|
|
1088
|
-
function useHref(to, _temp) {
|
|
1089
|
-
_s();
|
|
1090
|
-
let {
|
|
1091
|
-
relative
|
|
1092
|
-
} = _temp === undefined ? {} : _temp;
|
|
1093
|
-
!useInRouterContext() ? browser$1.env.NODE_ENV !== "production" ? invariant(false,
|
|
1094
|
-
// TODO: This error is probably because they somehow have 2 versions of the
|
|
1095
|
-
// router loaded. We can help them understand how to avoid that.
|
|
1096
|
-
"useHref() may be used only in the context of a <Router> component.") : invariant(false) : undefined;
|
|
1097
|
-
let {
|
|
1098
|
-
basename,
|
|
1099
|
-
navigator
|
|
1100
|
-
} = React__namespace.useContext(NavigationContext);
|
|
1101
|
-
let {
|
|
1102
|
-
hash,
|
|
1103
|
-
pathname,
|
|
1104
|
-
search
|
|
1105
|
-
} = useResolvedPath(to, {
|
|
1106
|
-
relative
|
|
1107
|
-
});
|
|
1108
|
-
let joinedPathname = pathname;
|
|
1109
|
-
|
|
1110
|
-
// If we're operating within a basename, prepend it to the pathname prior
|
|
1111
|
-
// to creating the href. If this is a root navigation, then just use the raw
|
|
1112
|
-
// basename which allows the basename to have full control over the presence
|
|
1113
|
-
// of a trailing slash on root links
|
|
1114
|
-
if (basename !== "/") {
|
|
1115
|
-
joinedPathname = pathname === "/" ? basename : joinPaths([basename, pathname]);
|
|
1116
|
-
}
|
|
1117
|
-
return navigator.createHref({
|
|
1118
|
-
pathname: joinedPathname,
|
|
1119
|
-
search,
|
|
1120
|
-
hash
|
|
1121
|
-
});
|
|
1122
|
-
}
|
|
1123
|
-
|
|
1124
|
-
/**
|
|
1125
|
-
* Returns true if this component is a descendant of a `<Router>`.
|
|
1126
|
-
*
|
|
1127
|
-
* @see https://reactrouter.com/hooks/use-in-router-context
|
|
1128
|
-
*/
|
|
1129
|
-
_s(useHref, "rGGf6evAqoN3mWGkxXhzdvQMWyw=", false, function () {
|
|
1130
|
-
return [useInRouterContext, useResolvedPath];
|
|
1131
|
-
});
|
|
1132
|
-
function useInRouterContext() {
|
|
1133
|
-
_s2();
|
|
1134
|
-
return React__namespace.useContext(LocationContext) != null;
|
|
1135
|
-
}
|
|
1136
|
-
|
|
1137
|
-
/**
|
|
1138
|
-
* Returns the current location object, which represents the current URL in web
|
|
1139
|
-
* browsers.
|
|
1140
|
-
*
|
|
1141
|
-
* Note: If you're using this it may mean you're doing some of your own
|
|
1142
|
-
* "routing" in your app, and we'd like to know what your use case is. We may
|
|
1143
|
-
* be able to provide something higher-level to better suit your needs.
|
|
1144
|
-
*
|
|
1145
|
-
* @see https://reactrouter.com/hooks/use-location
|
|
1146
|
-
*/
|
|
1147
|
-
_s2(useInRouterContext, "gDsCjeeItUuvgOWf1v4qoK9RF6k=");
|
|
1148
|
-
function useLocation() {
|
|
1149
|
-
_s3();
|
|
1150
|
-
!useInRouterContext() ? browser$1.env.NODE_ENV !== "production" ? invariant(false,
|
|
1151
|
-
// TODO: This error is probably because they somehow have 2 versions of the
|
|
1152
|
-
// router loaded. We can help them understand how to avoid that.
|
|
1153
|
-
"useLocation() may be used only in the context of a <Router> component.") : invariant(false) : undefined;
|
|
1154
|
-
return React__namespace.useContext(LocationContext).location;
|
|
1155
|
-
}
|
|
1156
|
-
|
|
1157
|
-
/**
|
|
1158
|
-
* Returns the current navigation action which describes how the router came to
|
|
1159
|
-
* the current location, either by a pop, push, or replace on the history stack.
|
|
1160
|
-
*
|
|
1161
|
-
* @see https://reactrouter.com/hooks/use-navigation-type
|
|
1162
|
-
*/
|
|
1163
|
-
_s3(useLocation, "pnBsrBzOSKrTAsifUkfhXR0cM+Y=", false, function () {
|
|
1164
|
-
return [useInRouterContext];
|
|
1165
|
-
});
|
|
1166
|
-
function useNavigationType() {
|
|
1167
|
-
_s4();
|
|
1168
|
-
return React__namespace.useContext(LocationContext).navigationType;
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
/**
|
|
1172
|
-
* Returns a PathMatch object if the given pattern matches the current URL.
|
|
1173
|
-
* This is useful for components that need to know "active" state, e.g.
|
|
1174
|
-
* `<NavLink>`.
|
|
1175
|
-
*
|
|
1176
|
-
* @see https://reactrouter.com/hooks/use-match
|
|
1177
|
-
*/
|
|
1178
|
-
_s4(useNavigationType, "gDsCjeeItUuvgOWf1v4qoK9RF6k=");
|
|
1179
|
-
function useMatch(pattern) {
|
|
1180
|
-
_s5();
|
|
1181
|
-
!useInRouterContext() ? browser$1.env.NODE_ENV !== "production" ? invariant(false,
|
|
1182
|
-
// TODO: This error is probably because they somehow have 2 versions of the
|
|
1183
|
-
// router loaded. We can help them understand how to avoid that.
|
|
1184
|
-
"useMatch() may be used only in the context of a <Router> component.") : invariant(false) : undefined;
|
|
1185
|
-
let {
|
|
1186
|
-
pathname
|
|
1187
|
-
} = useLocation();
|
|
1188
|
-
return React__namespace.useMemo(() => matchPath(pattern, decodePath(pathname)), [pathname, pattern]);
|
|
1189
|
-
}
|
|
1190
|
-
|
|
1191
|
-
/**
|
|
1192
|
-
* The interface for the navigate() function returned from useNavigate().
|
|
1193
|
-
*/
|
|
1194
|
-
_s5(useMatch, "nQeQy8ml7gNYO2EbpP3HWNGpSDs=", false, function () {
|
|
1195
|
-
return [useInRouterContext, useLocation];
|
|
1196
|
-
});
|
|
1197
|
-
const navigateEffectWarning = "You should call navigate() in a React.useEffect(), not when " + "your component is first rendered.";
|
|
1198
|
-
|
|
1199
|
-
// Mute warnings for calls to useNavigate in SSR environments
|
|
1200
|
-
function useIsomorphicLayoutEffect(cb) {
|
|
1201
|
-
_s6();
|
|
1202
|
-
let isStatic = React__namespace.useContext(NavigationContext).static;
|
|
1203
|
-
if (!isStatic) {
|
|
1204
|
-
// We should be able to get rid of this once react 18.3 is released
|
|
1205
|
-
// See: https://github.com/facebook/react/pull/26395
|
|
1206
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
1207
|
-
React__namespace.useLayoutEffect(cb);
|
|
1208
|
-
}
|
|
1209
|
-
}
|
|
1210
|
-
|
|
1211
|
-
/**
|
|
1212
|
-
* Returns an imperative method for changing the location. Used by `<Link>`s, but
|
|
1213
|
-
* may also be used by other elements to change the location.
|
|
1214
|
-
*
|
|
1215
|
-
* @see https://reactrouter.com/hooks/use-navigate
|
|
1216
|
-
*/
|
|
1217
|
-
_s6(useIsomorphicLayoutEffect, "3HnvgRejhFHSzSK/8CfZqnQRfE8=");
|
|
1218
|
-
function useNavigate() {
|
|
1219
|
-
_s7();
|
|
1220
|
-
let {
|
|
1221
|
-
isDataRoute
|
|
1222
|
-
} = React__namespace.useContext(RouteContext);
|
|
1223
|
-
// Conditional usage is OK here because the usage of a data router is static
|
|
1224
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
1225
|
-
return isDataRoute ? useNavigateStable() : useNavigateUnstable();
|
|
1226
|
-
}
|
|
1227
|
-
_s7(useNavigate, "3i7MQnPpiPAGSiIiwm8rZLKRF8w=", false, function () {
|
|
1228
|
-
return [useNavigateStable, useNavigateUnstable];
|
|
1229
|
-
});
|
|
1230
|
-
function useNavigateUnstable() {
|
|
1231
|
-
_s8();
|
|
1232
|
-
!useInRouterContext() ? browser$1.env.NODE_ENV !== "production" ? invariant(false,
|
|
1233
|
-
// TODO: This error is probably because they somehow have 2 versions of the
|
|
1234
|
-
// router loaded. We can help them understand how to avoid that.
|
|
1235
|
-
"useNavigate() may be used only in the context of a <Router> component.") : invariant(false) : undefined;
|
|
1236
|
-
let dataRouterContext = React__namespace.useContext(DataRouterContext);
|
|
1237
|
-
let {
|
|
1238
|
-
basename,
|
|
1239
|
-
future,
|
|
1240
|
-
navigator
|
|
1241
|
-
} = React__namespace.useContext(NavigationContext);
|
|
1242
|
-
let {
|
|
1243
|
-
matches
|
|
1244
|
-
} = React__namespace.useContext(RouteContext);
|
|
1245
|
-
let {
|
|
1246
|
-
pathname: locationPathname
|
|
1247
|
-
} = useLocation();
|
|
1248
|
-
let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));
|
|
1249
|
-
let activeRef = React__namespace.useRef(false);
|
|
1250
|
-
useIsomorphicLayoutEffect(() => {
|
|
1251
|
-
activeRef.current = true;
|
|
1252
|
-
});
|
|
1253
|
-
let navigate = React__namespace.useCallback(function (to, options) {
|
|
1254
|
-
if (options === undefined) {
|
|
1255
|
-
options = {};
|
|
1256
|
-
}
|
|
1257
|
-
browser$1.env.NODE_ENV !== "production" ? warning(activeRef.current, navigateEffectWarning) : undefined;
|
|
1258
|
-
|
|
1259
|
-
// Short circuit here since if this happens on first render the navigate
|
|
1260
|
-
// is useless because we haven't wired up our history listener yet
|
|
1261
|
-
if (!activeRef.current) return;
|
|
1262
|
-
if (typeof to === "number") {
|
|
1263
|
-
navigator.go(to);
|
|
1264
|
-
return;
|
|
1265
|
-
}
|
|
1266
|
-
let path = resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, options.relative === "path");
|
|
1267
|
-
|
|
1268
|
-
// If we're operating within a basename, prepend it to the pathname prior
|
|
1269
|
-
// to handing off to history (but only if we're not in a data router,
|
|
1270
|
-
// otherwise it'll prepend the basename inside of the router).
|
|
1271
|
-
// If this is a root navigation, then we navigate to the raw basename
|
|
1272
|
-
// which allows the basename to have full control over the presence of a
|
|
1273
|
-
// trailing slash on root links
|
|
1274
|
-
if (dataRouterContext == null && basename !== "/") {
|
|
1275
|
-
path.pathname = path.pathname === "/" ? basename : joinPaths([basename, path.pathname]);
|
|
1276
|
-
}
|
|
1277
|
-
(!!options.replace ? navigator.replace : navigator.push)(path, options.state, options);
|
|
1278
|
-
}, [basename, navigator, routePathnamesJson, locationPathname, dataRouterContext]);
|
|
1279
|
-
return navigate;
|
|
1280
|
-
}
|
|
1281
|
-
_s8(useNavigateUnstable, "tUQDCcinF6M4+U0yp9u8DvP9joE=", false, function () {
|
|
1282
|
-
return [useInRouterContext, useLocation, useIsomorphicLayoutEffect];
|
|
1283
|
-
});
|
|
1284
|
-
const OutletContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
1285
|
-
|
|
1286
|
-
/**
|
|
1287
|
-
* Returns the context (if provided) for the child route at this level of the route
|
|
1288
|
-
* hierarchy.
|
|
1289
|
-
* @see https://reactrouter.com/hooks/use-outlet-context
|
|
1290
|
-
*/
|
|
1291
|
-
function useOutletContext() {
|
|
1292
|
-
_s9();
|
|
1293
|
-
return React__namespace.useContext(OutletContext);
|
|
1294
|
-
}
|
|
1295
|
-
|
|
1296
|
-
/**
|
|
1297
|
-
* Returns the element for the child route at this level of the route
|
|
1298
|
-
* hierarchy. Used internally by `<Outlet>` to render child routes.
|
|
1299
|
-
*
|
|
1300
|
-
* @see https://reactrouter.com/hooks/use-outlet
|
|
1301
|
-
*/
|
|
1302
|
-
_s9(useOutletContext, "gDsCjeeItUuvgOWf1v4qoK9RF6k=");
|
|
1303
|
-
function useOutlet(context) {
|
|
1304
|
-
_s10();
|
|
1305
|
-
let outlet = React__namespace.useContext(RouteContext).outlet;
|
|
1306
|
-
if (outlet) {
|
|
1307
|
-
return /*#__PURE__*/React__namespace.createElement(OutletContext.Provider, {
|
|
1308
|
-
value: context
|
|
1309
|
-
}, outlet);
|
|
1310
|
-
}
|
|
1311
|
-
return outlet;
|
|
1312
|
-
}
|
|
1313
|
-
|
|
1314
|
-
/**
|
|
1315
|
-
* Returns an object of key/value pairs of the dynamic params from the current
|
|
1316
|
-
* URL that were matched by the route path.
|
|
1317
|
-
*
|
|
1318
|
-
* @see https://reactrouter.com/hooks/use-params
|
|
1319
|
-
*/
|
|
1320
|
-
_s10(useOutlet, "gDsCjeeItUuvgOWf1v4qoK9RF6k=");
|
|
1321
|
-
function useParams() {
|
|
1322
|
-
_s11();
|
|
1323
|
-
let {
|
|
1324
|
-
matches
|
|
1325
|
-
} = React__namespace.useContext(RouteContext);
|
|
1326
|
-
let routeMatch = matches[matches.length - 1];
|
|
1327
|
-
return routeMatch ? routeMatch.params : {};
|
|
1328
|
-
}
|
|
1329
|
-
|
|
1330
|
-
/**
|
|
1331
|
-
* Resolves the pathname of the given `to` value against the current location.
|
|
1332
|
-
*
|
|
1333
|
-
* @see https://reactrouter.com/hooks/use-resolved-path
|
|
1334
|
-
*/
|
|
1335
|
-
_s11(useParams, "KZfdG8ZL0oSOy0/P9JYAG6JDDJw=");
|
|
1336
|
-
function useResolvedPath(to, _temp2) {
|
|
1337
|
-
_s12();
|
|
1338
|
-
let {
|
|
1339
|
-
relative
|
|
1340
|
-
} = _temp2 === undefined ? {} : _temp2;
|
|
1341
|
-
let {
|
|
1342
|
-
future
|
|
1343
|
-
} = React__namespace.useContext(NavigationContext);
|
|
1344
|
-
let {
|
|
1345
|
-
matches
|
|
1346
|
-
} = React__namespace.useContext(RouteContext);
|
|
1347
|
-
let {
|
|
1348
|
-
pathname: locationPathname
|
|
1349
|
-
} = useLocation();
|
|
1350
|
-
let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));
|
|
1351
|
-
return React__namespace.useMemo(() => resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, relative === "path"), [to, routePathnamesJson, locationPathname, relative]);
|
|
1352
|
-
}
|
|
1353
|
-
|
|
1354
|
-
/**
|
|
1355
|
-
* Returns the element of the route that matched the current location, prepared
|
|
1356
|
-
* with the correct context to render the remainder of the route tree. Route
|
|
1357
|
-
* elements in the tree must render an `<Outlet>` to render their child route's
|
|
1358
|
-
* element.
|
|
1359
|
-
*
|
|
1360
|
-
* @see https://reactrouter.com/hooks/use-routes
|
|
1361
|
-
*/
|
|
1362
|
-
_s12(useResolvedPath, "wVXBIr+VW78mZc8lDu4RuR6aKjE=", false, function () {
|
|
1363
|
-
return [useLocation];
|
|
1364
|
-
});
|
|
1365
|
-
function useRoutes(routes, locationArg) {
|
|
1366
|
-
_s13();
|
|
1367
|
-
return useRoutesImpl(routes, locationArg);
|
|
1368
|
-
}
|
|
1369
|
-
|
|
1370
|
-
// Internal implementation with accept optional param for RouterProvider usage
|
|
1371
|
-
_s13(useRoutes, "bxXQ1PjoUitFHQG/730mCYNdT00=", false, function () {
|
|
1372
|
-
return [useRoutesImpl];
|
|
1373
|
-
});
|
|
1374
|
-
function useRoutesImpl(routes, locationArg, dataRouterState, future) {
|
|
1375
|
-
_s14();
|
|
1376
|
-
!useInRouterContext() ? browser$1.env.NODE_ENV !== "production" ? invariant(false,
|
|
1377
|
-
// TODO: This error is probably because they somehow have 2 versions of the
|
|
1378
|
-
// router loaded. We can help them understand how to avoid that.
|
|
1379
|
-
"useRoutes() may be used only in the context of a <Router> component.") : invariant(false) : undefined;
|
|
1380
|
-
let {
|
|
1381
|
-
navigator
|
|
1382
|
-
} = React__namespace.useContext(NavigationContext);
|
|
1383
|
-
let {
|
|
1384
|
-
matches: parentMatches
|
|
1385
|
-
} = React__namespace.useContext(RouteContext);
|
|
1386
|
-
let routeMatch = parentMatches[parentMatches.length - 1];
|
|
1387
|
-
let parentParams = routeMatch ? routeMatch.params : {};
|
|
1388
|
-
let parentPathname = routeMatch ? routeMatch.pathname : "/";
|
|
1389
|
-
let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : "/";
|
|
1390
|
-
let parentRoute = routeMatch && routeMatch.route;
|
|
1391
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1392
|
-
// You won't get a warning about 2 different <Routes> under a <Route>
|
|
1393
|
-
// without a trailing *, but this is a best-effort warning anyway since we
|
|
1394
|
-
// cannot even give the warning unless they land at the parent route.
|
|
1395
|
-
//
|
|
1396
|
-
// Example:
|
|
1397
|
-
//
|
|
1398
|
-
// <Routes>
|
|
1399
|
-
// {/* This route path MUST end with /* because otherwise
|
|
1400
|
-
// it will never match /blog/post/123 */}
|
|
1401
|
-
// <Route path="blog" element={<Blog />} />
|
|
1402
|
-
// <Route path="blog/feed" element={<BlogFeed />} />
|
|
1403
|
-
// </Routes>
|
|
1404
|
-
//
|
|
1405
|
-
// function Blog() {
|
|
1406
|
-
// return (
|
|
1407
|
-
// <Routes>
|
|
1408
|
-
// <Route path="post/:id" element={<Post />} />
|
|
1409
|
-
// </Routes>
|
|
1410
|
-
// );
|
|
1411
|
-
// }
|
|
1412
|
-
let parentPath = parentRoute && parentRoute.path || "";
|
|
1413
|
-
warningOnce(parentPathname, !parentRoute || parentPath.endsWith("*"), "You rendered descendant <Routes> (or called `useRoutes()`) at " + ("\"" + parentPathname + "\" (under <Route path=\"" + parentPath + "\">) but the ") + "parent route path has no trailing \"*\". This means if you navigate " + "deeper, the parent won't match anymore and therefore the child " + "routes will never render.\n\n" + ("Please change the parent <Route path=\"" + parentPath + "\"> to <Route ") + ("path=\"" + (parentPath === "/" ? "*" : parentPath + "/*") + "\">."));
|
|
1414
|
-
}
|
|
1415
|
-
let locationFromContext = useLocation();
|
|
1416
|
-
let location;
|
|
1417
|
-
if (locationArg) {
|
|
1418
|
-
var _parsedLocationArg$pa;
|
|
1419
|
-
let parsedLocationArg = typeof locationArg === "string" ? parsePath(locationArg) : locationArg;
|
|
1420
|
-
!(parentPathnameBase === "/" || ((_parsedLocationArg$pa = parsedLocationArg.pathname) == null ? undefined : _parsedLocationArg$pa.startsWith(parentPathnameBase))) ? browser$1.env.NODE_ENV !== "production" ? invariant(false, "When overriding the location using `<Routes location>` or `useRoutes(routes, location)`, " + "the location pathname must begin with the portion of the URL pathname that was " + ("matched by all parent routes. The current pathname base is \"" + parentPathnameBase + "\" ") + ("but pathname \"" + parsedLocationArg.pathname + "\" was given in the `location` prop.")) : invariant(false) : undefined;
|
|
1421
|
-
location = parsedLocationArg;
|
|
1422
|
-
} else {
|
|
1423
|
-
location = locationFromContext;
|
|
1424
|
-
}
|
|
1425
|
-
let pathname = location.pathname || "/";
|
|
1426
|
-
let remainingPathname = pathname;
|
|
1427
|
-
if (parentPathnameBase !== "/") {
|
|
1428
|
-
// Determine the remaining pathname by removing the # of URL segments the
|
|
1429
|
-
// parentPathnameBase has, instead of removing based on character count.
|
|
1430
|
-
// This is because we can't guarantee that incoming/outgoing encodings/
|
|
1431
|
-
// decodings will match exactly.
|
|
1432
|
-
// We decode paths before matching on a per-segment basis with
|
|
1433
|
-
// decodeURIComponent(), but we re-encode pathnames via `new URL()` so they
|
|
1434
|
-
// match what `window.location.pathname` would reflect. Those don't 100%
|
|
1435
|
-
// align when it comes to encoded URI characters such as % and &.
|
|
1436
|
-
//
|
|
1437
|
-
// So we may end up with:
|
|
1438
|
-
// pathname: "/descendant/a%25b/match"
|
|
1439
|
-
// parentPathnameBase: "/descendant/a%b"
|
|
1440
|
-
//
|
|
1441
|
-
// And the direct substring removal approach won't work :/
|
|
1442
|
-
let parentSegments = parentPathnameBase.replace(/^\//, "").split("/");
|
|
1443
|
-
let segments = pathname.replace(/^\//, "").split("/");
|
|
1444
|
-
remainingPathname = "/" + segments.slice(parentSegments.length).join("/");
|
|
1445
|
-
}
|
|
1446
|
-
let matches = matchRoutes(routes, {
|
|
1447
|
-
pathname: remainingPathname
|
|
1448
|
-
});
|
|
1449
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1450
|
-
browser$1.env.NODE_ENV !== "production" ? warning(parentRoute || matches != null, "No routes matched location \"" + location.pathname + location.search + location.hash + "\" ") : undefined;
|
|
1451
|
-
browser$1.env.NODE_ENV !== "production" ? warning(matches == null || matches[matches.length - 1].route.element !== undefined || matches[matches.length - 1].route.Component !== undefined || matches[matches.length - 1].route.lazy !== undefined, "Matched leaf route at location \"" + location.pathname + location.search + location.hash + "\" " + "does not have an element or Component. This means it will render an <Outlet /> with a " + "null value by default resulting in an \"empty\" page.") : undefined;
|
|
1452
|
-
}
|
|
1453
|
-
let renderedMatches = _renderMatches(matches && matches.map(match => Object.assign({}, match, {
|
|
1454
|
-
params: Object.assign({}, parentParams, match.params),
|
|
1455
|
-
pathname: joinPaths([parentPathnameBase,
|
|
1456
|
-
// Re-encode pathnames that were decoded inside matchRoutes
|
|
1457
|
-
navigator.encodeLocation ? navigator.encodeLocation(match.pathname).pathname : match.pathname]),
|
|
1458
|
-
pathnameBase: match.pathnameBase === "/" ? parentPathnameBase : joinPaths([parentPathnameBase,
|
|
1459
|
-
// Re-encode pathnames that were decoded inside matchRoutes
|
|
1460
|
-
navigator.encodeLocation ? navigator.encodeLocation(match.pathnameBase).pathname : match.pathnameBase])
|
|
1461
|
-
})), parentMatches, dataRouterState, future);
|
|
1462
|
-
|
|
1463
|
-
// When a user passes in a `locationArg`, the associated routes need to
|
|
1464
|
-
// be wrapped in a new `LocationContext.Provider` in order for `useLocation`
|
|
1465
|
-
// to use the scoped location instead of the global location.
|
|
1466
|
-
if (locationArg && renderedMatches) {
|
|
1467
|
-
return /*#__PURE__*/React__namespace.createElement(LocationContext.Provider, {
|
|
1468
|
-
value: {
|
|
1469
|
-
location: _extends({
|
|
1470
|
-
pathname: "/",
|
|
1471
|
-
search: "",
|
|
1472
|
-
hash: "",
|
|
1473
|
-
state: null,
|
|
1474
|
-
key: "default"
|
|
1475
|
-
}, location),
|
|
1476
|
-
navigationType: Action.Pop
|
|
1477
|
-
}
|
|
1478
|
-
}, renderedMatches);
|
|
1479
|
-
}
|
|
1480
|
-
return renderedMatches;
|
|
1481
|
-
}
|
|
1482
|
-
_s14(useRoutesImpl, "50L/Aw/rSNnE0T4921HQ7wCgOK0=", false, function () {
|
|
1483
|
-
return [useInRouterContext, useLocation];
|
|
1484
|
-
});
|
|
1485
|
-
function DefaultErrorComponent() {
|
|
1486
|
-
_s15();
|
|
1487
|
-
let error = useRouteError();
|
|
1488
|
-
let message = isRouteErrorResponse(error) ? error.status + " " + error.statusText : error instanceof Error ? error.message : JSON.stringify(error);
|
|
1489
|
-
let stack = error instanceof Error ? error.stack : null;
|
|
1490
|
-
let lightgrey = "rgba(200,200,200, 0.5)";
|
|
1491
|
-
let preStyles = {
|
|
1492
|
-
padding: "0.5rem",
|
|
1493
|
-
backgroundColor: lightgrey
|
|
1494
|
-
};
|
|
1495
|
-
let codeStyles = {
|
|
1496
|
-
padding: "2px 4px",
|
|
1497
|
-
backgroundColor: lightgrey
|
|
1498
|
-
};
|
|
1499
|
-
let devInfo = null;
|
|
1500
|
-
if (browser$1.env.NODE_ENV !== "production") {
|
|
1501
|
-
console.error("Error handled by React Router default ErrorBoundary:", error);
|
|
1502
|
-
devInfo = /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement("p", null, "\uD83D\uDCBF Hey developer \uD83D\uDC4B"), /*#__PURE__*/React__namespace.createElement("p", null, "You can provide a way better UX than this when your app throws errors by providing your own ", /*#__PURE__*/React__namespace.createElement("code", {
|
|
1503
|
-
style: codeStyles
|
|
1504
|
-
}, "ErrorBoundary"), " or", " ", /*#__PURE__*/React__namespace.createElement("code", {
|
|
1505
|
-
style: codeStyles
|
|
1506
|
-
}, "errorElement"), " prop on your route."));
|
|
1507
|
-
}
|
|
1508
|
-
return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement("h2", null, "Unexpected Application Error!"), /*#__PURE__*/React__namespace.createElement("h3", {
|
|
1509
|
-
style: {
|
|
1510
|
-
fontStyle: "italic"
|
|
1511
|
-
}
|
|
1512
|
-
}, message), stack ? /*#__PURE__*/React__namespace.createElement("pre", {
|
|
1513
|
-
style: preStyles
|
|
1514
|
-
}, stack) : null, devInfo);
|
|
1515
|
-
}
|
|
1516
|
-
_s15(DefaultErrorComponent, "oAgjgbJzsRXlB89+MoVumxMQqKM=", false, function () {
|
|
1517
|
-
return [useRouteError];
|
|
1518
|
-
});
|
|
1519
|
-
_c = DefaultErrorComponent;
|
|
1520
|
-
const defaultErrorElement = /*#__PURE__*/React__namespace.createElement(DefaultErrorComponent, null);
|
|
1521
|
-
class RenderErrorBoundary extends React__namespace.Component {
|
|
1522
|
-
constructor(props) {
|
|
1523
|
-
super(props);
|
|
1524
|
-
this.state = {
|
|
1525
|
-
location: props.location,
|
|
1526
|
-
revalidation: props.revalidation,
|
|
1527
|
-
error: props.error
|
|
1528
|
-
};
|
|
1529
|
-
}
|
|
1530
|
-
static getDerivedStateFromError(error) {
|
|
1531
|
-
return {
|
|
1532
|
-
error: error
|
|
1533
|
-
};
|
|
1534
|
-
}
|
|
1535
|
-
static getDerivedStateFromProps(props, state) {
|
|
1536
|
-
// When we get into an error state, the user will likely click "back" to the
|
|
1537
|
-
// previous page that didn't have an error. Because this wraps the entire
|
|
1538
|
-
// application, that will have no effect--the error page continues to display.
|
|
1539
|
-
// This gives us a mechanism to recover from the error when the location changes.
|
|
1540
|
-
//
|
|
1541
|
-
// Whether we're in an error state or not, we update the location in state
|
|
1542
|
-
// so that when we are in an error state, it gets reset when a new location
|
|
1543
|
-
// comes in and the user recovers from the error.
|
|
1544
|
-
if (state.location !== props.location || state.revalidation !== "idle" && props.revalidation === "idle") {
|
|
1545
|
-
return {
|
|
1546
|
-
error: props.error,
|
|
1547
|
-
location: props.location,
|
|
1548
|
-
revalidation: props.revalidation
|
|
1549
|
-
};
|
|
1550
|
-
}
|
|
1551
|
-
|
|
1552
|
-
// If we're not changing locations, preserve the location but still surface
|
|
1553
|
-
// any new errors that may come through. We retain the existing error, we do
|
|
1554
|
-
// this because the error provided from the app state may be cleared without
|
|
1555
|
-
// the location changing.
|
|
1556
|
-
return {
|
|
1557
|
-
error: props.error !== undefined ? props.error : state.error,
|
|
1558
|
-
location: state.location,
|
|
1559
|
-
revalidation: props.revalidation || state.revalidation
|
|
1560
|
-
};
|
|
1561
|
-
}
|
|
1562
|
-
componentDidCatch(error, errorInfo) {
|
|
1563
|
-
console.error("React Router caught the following error during render", error, errorInfo);
|
|
1564
|
-
}
|
|
1565
|
-
render() {
|
|
1566
|
-
return this.state.error !== undefined ? /*#__PURE__*/React__namespace.createElement(RouteContext.Provider, {
|
|
1567
|
-
value: this.props.routeContext
|
|
1568
|
-
}, /*#__PURE__*/React__namespace.createElement(RouteErrorContext.Provider, {
|
|
1569
|
-
value: this.state.error,
|
|
1570
|
-
children: this.props.component
|
|
1571
|
-
})) : this.props.children;
|
|
1572
|
-
}
|
|
1573
|
-
}
|
|
1574
|
-
function RenderedRoute(_ref) {
|
|
1575
|
-
_s16();
|
|
1576
|
-
let {
|
|
1577
|
-
routeContext,
|
|
1578
|
-
match,
|
|
1579
|
-
children
|
|
1580
|
-
} = _ref;
|
|
1581
|
-
let dataRouterContext = React__namespace.useContext(DataRouterContext);
|
|
1582
|
-
|
|
1583
|
-
// Track how deep we got in our render pass to emulate SSR componentDidCatch
|
|
1584
|
-
// in a DataStaticRouter
|
|
1585
|
-
if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {
|
|
1586
|
-
dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;
|
|
1587
|
-
}
|
|
1588
|
-
return /*#__PURE__*/React__namespace.createElement(RouteContext.Provider, {
|
|
1589
|
-
value: routeContext
|
|
1590
|
-
}, children);
|
|
1591
|
-
}
|
|
1592
|
-
_s16(RenderedRoute, "CDKlwIqxcpySUP3IDCQMJZjTo1Q=");
|
|
1593
|
-
_c2 = RenderedRoute;
|
|
1594
|
-
function _renderMatches(matches, parentMatches, dataRouterState, future) {
|
|
1595
|
-
var _dataRouterState;
|
|
1596
|
-
if (parentMatches === undefined) {
|
|
1597
|
-
parentMatches = [];
|
|
1598
|
-
}
|
|
1599
|
-
if (dataRouterState === undefined) {
|
|
1600
|
-
dataRouterState = null;
|
|
1601
|
-
}
|
|
1602
|
-
if (future === undefined) {
|
|
1603
|
-
future = null;
|
|
1604
|
-
}
|
|
1605
|
-
if (matches == null) {
|
|
1606
|
-
var _future;
|
|
1607
|
-
if (!dataRouterState) {
|
|
1608
|
-
return null;
|
|
1609
|
-
}
|
|
1610
|
-
if (dataRouterState.errors) {
|
|
1611
|
-
// Don't bail if we have data router errors so we can render them in the
|
|
1612
|
-
// boundary. Use the pre-matched (or shimmed) matches
|
|
1613
|
-
matches = dataRouterState.matches;
|
|
1614
|
-
} else if ((_future = future) != null && _future.v7_partialHydration && parentMatches.length === 0 && !dataRouterState.initialized && dataRouterState.matches.length > 0) {
|
|
1615
|
-
// Don't bail if we're initializing with partial hydration and we have
|
|
1616
|
-
// router matches. That means we're actively running `patchRoutesOnNavigation`
|
|
1617
|
-
// so we should render down the partial matches to the appropriate
|
|
1618
|
-
// `HydrateFallback`. We only do this if `parentMatches` is empty so it
|
|
1619
|
-
// only impacts the root matches for `RouterProvider` and no descendant
|
|
1620
|
-
// `<Routes>`
|
|
1621
|
-
matches = dataRouterState.matches;
|
|
1622
|
-
} else {
|
|
1623
|
-
return null;
|
|
1624
|
-
}
|
|
1625
|
-
}
|
|
1626
|
-
let renderedMatches = matches;
|
|
1627
|
-
|
|
1628
|
-
// If we have data errors, trim matches to the highest error boundary
|
|
1629
|
-
let errors = (_dataRouterState = dataRouterState) == null ? undefined : _dataRouterState.errors;
|
|
1630
|
-
if (errors != null) {
|
|
1631
|
-
let errorIndex = renderedMatches.findIndex(m => m.route.id && (errors == null ? undefined : errors[m.route.id]) !== undefined);
|
|
1632
|
-
!(errorIndex >= 0) ? browser$1.env.NODE_ENV !== "production" ? invariant(false, "Could not find a matching route for errors on route IDs: " + Object.keys(errors).join(",")) : invariant(false) : undefined;
|
|
1633
|
-
renderedMatches = renderedMatches.slice(0, Math.min(renderedMatches.length, errorIndex + 1));
|
|
1634
|
-
}
|
|
1635
|
-
|
|
1636
|
-
// If we're in a partial hydration mode, detect if we need to render down to
|
|
1637
|
-
// a given HydrateFallback while we load the rest of the hydration data
|
|
1638
|
-
let renderFallback = false;
|
|
1639
|
-
let fallbackIndex = -1;
|
|
1640
|
-
if (dataRouterState && future && future.v7_partialHydration) {
|
|
1641
|
-
for (let i = 0; i < renderedMatches.length; i++) {
|
|
1642
|
-
let match = renderedMatches[i];
|
|
1643
|
-
// Track the deepest fallback up until the first route without data
|
|
1644
|
-
if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {
|
|
1645
|
-
fallbackIndex = i;
|
|
1646
|
-
}
|
|
1647
|
-
if (match.route.id) {
|
|
1648
|
-
let {
|
|
1649
|
-
loaderData,
|
|
1650
|
-
errors
|
|
1651
|
-
} = dataRouterState;
|
|
1652
|
-
let needsToRunLoader = match.route.loader && loaderData[match.route.id] === undefined && (!errors || errors[match.route.id] === undefined);
|
|
1653
|
-
if (match.route.lazy || needsToRunLoader) {
|
|
1654
|
-
// We found the first route that's not ready to render (waiting on
|
|
1655
|
-
// lazy, or has a loader that hasn't run yet). Flag that we need to
|
|
1656
|
-
// render a fallback and render up until the appropriate fallback
|
|
1657
|
-
renderFallback = true;
|
|
1658
|
-
if (fallbackIndex >= 0) {
|
|
1659
|
-
renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);
|
|
1660
|
-
} else {
|
|
1661
|
-
renderedMatches = [renderedMatches[0]];
|
|
1662
|
-
}
|
|
1663
|
-
break;
|
|
1664
|
-
}
|
|
1665
|
-
}
|
|
1666
|
-
}
|
|
1667
|
-
}
|
|
1668
|
-
return renderedMatches.reduceRight((outlet, match, index) => {
|
|
1669
|
-
// Only data routers handle errors/fallbacks
|
|
1670
|
-
let error;
|
|
1671
|
-
let shouldRenderHydrateFallback = false;
|
|
1672
|
-
let errorElement = null;
|
|
1673
|
-
let hydrateFallbackElement = null;
|
|
1674
|
-
if (dataRouterState) {
|
|
1675
|
-
error = errors && match.route.id ? errors[match.route.id] : undefined;
|
|
1676
|
-
errorElement = match.route.errorElement || defaultErrorElement;
|
|
1677
|
-
if (renderFallback) {
|
|
1678
|
-
if (fallbackIndex < 0 && index === 0) {
|
|
1679
|
-
warningOnce("route-fallback", false, "No `HydrateFallback` element provided to render during initial hydration");
|
|
1680
|
-
shouldRenderHydrateFallback = true;
|
|
1681
|
-
hydrateFallbackElement = null;
|
|
1682
|
-
} else if (fallbackIndex === index) {
|
|
1683
|
-
shouldRenderHydrateFallback = true;
|
|
1684
|
-
hydrateFallbackElement = match.route.hydrateFallbackElement || null;
|
|
1685
|
-
}
|
|
1686
|
-
}
|
|
1687
|
-
}
|
|
1688
|
-
let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));
|
|
1689
|
-
let getChildren = () => {
|
|
1690
|
-
let children;
|
|
1691
|
-
if (error) {
|
|
1692
|
-
children = errorElement;
|
|
1693
|
-
} else if (shouldRenderHydrateFallback) {
|
|
1694
|
-
children = hydrateFallbackElement;
|
|
1695
|
-
} else if (match.route.Component) {
|
|
1696
|
-
// Note: This is a de-optimized path since React won't re-use the
|
|
1697
|
-
// ReactElement since it's identity changes with each new
|
|
1698
|
-
// React.createElement call. We keep this so folks can use
|
|
1699
|
-
// `<Route Component={...}>` in `<Routes>` but generally `Component`
|
|
1700
|
-
// usage is only advised in `RouterProvider` when we can convert it to
|
|
1701
|
-
// `element` ahead of time.
|
|
1702
|
-
children = /*#__PURE__*/React__namespace.createElement(match.route.Component, null);
|
|
1703
|
-
} else if (match.route.element) {
|
|
1704
|
-
children = match.route.element;
|
|
1705
|
-
} else {
|
|
1706
|
-
children = outlet;
|
|
1707
|
-
}
|
|
1708
|
-
return /*#__PURE__*/React__namespace.createElement(RenderedRoute, {
|
|
1709
|
-
match: match,
|
|
1710
|
-
routeContext: {
|
|
1711
|
-
outlet,
|
|
1712
|
-
matches,
|
|
1713
|
-
isDataRoute: dataRouterState != null
|
|
1714
|
-
},
|
|
1715
|
-
children: children
|
|
1716
|
-
});
|
|
1717
|
-
};
|
|
1718
|
-
// Only wrap in an error boundary within data router usages when we have an
|
|
1719
|
-
// ErrorBoundary/errorElement on this route. Otherwise let it bubble up to
|
|
1720
|
-
// an ancestor ErrorBoundary/errorElement
|
|
1721
|
-
return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /*#__PURE__*/React__namespace.createElement(RenderErrorBoundary, {
|
|
1722
|
-
location: dataRouterState.location,
|
|
1723
|
-
revalidation: dataRouterState.revalidation,
|
|
1724
|
-
component: errorElement,
|
|
1725
|
-
error: error,
|
|
1726
|
-
children: getChildren(),
|
|
1727
|
-
routeContext: {
|
|
1728
|
-
outlet: null,
|
|
1729
|
-
matches,
|
|
1730
|
-
isDataRoute: true
|
|
1731
|
-
}
|
|
1732
|
-
}) : getChildren();
|
|
1733
|
-
}, null);
|
|
1734
|
-
}
|
|
1735
|
-
var DataRouterHook = /*#__PURE__*/function (DataRouterHook) {
|
|
1736
|
-
DataRouterHook["UseBlocker"] = "useBlocker";
|
|
1737
|
-
DataRouterHook["UseRevalidator"] = "useRevalidator";
|
|
1738
|
-
DataRouterHook["UseNavigateStable"] = "useNavigate";
|
|
1739
|
-
return DataRouterHook;
|
|
1740
|
-
}(DataRouterHook || {});
|
|
1741
|
-
var DataRouterStateHook = /*#__PURE__*/function (DataRouterStateHook) {
|
|
1742
|
-
DataRouterStateHook["UseBlocker"] = "useBlocker";
|
|
1743
|
-
DataRouterStateHook["UseLoaderData"] = "useLoaderData";
|
|
1744
|
-
DataRouterStateHook["UseActionData"] = "useActionData";
|
|
1745
|
-
DataRouterStateHook["UseRouteError"] = "useRouteError";
|
|
1746
|
-
DataRouterStateHook["UseNavigation"] = "useNavigation";
|
|
1747
|
-
DataRouterStateHook["UseRouteLoaderData"] = "useRouteLoaderData";
|
|
1748
|
-
DataRouterStateHook["UseMatches"] = "useMatches";
|
|
1749
|
-
DataRouterStateHook["UseRevalidator"] = "useRevalidator";
|
|
1750
|
-
DataRouterStateHook["UseNavigateStable"] = "useNavigate";
|
|
1751
|
-
DataRouterStateHook["UseRouteId"] = "useRouteId";
|
|
1752
|
-
return DataRouterStateHook;
|
|
1753
|
-
}(DataRouterStateHook || {});
|
|
1754
|
-
function getDataRouterConsoleError(hookName) {
|
|
1755
|
-
return hookName + " must be used within a data router. See https://reactrouter.com/routers/picking-a-router.";
|
|
1756
|
-
}
|
|
1757
|
-
function useDataRouterContext(hookName) {
|
|
1758
|
-
_s17();
|
|
1759
|
-
let ctx = React__namespace.useContext(DataRouterContext);
|
|
1760
|
-
!ctx ? browser$1.env.NODE_ENV !== "production" ? invariant(false, getDataRouterConsoleError(hookName)) : invariant(false) : undefined;
|
|
1761
|
-
return ctx;
|
|
1762
|
-
}
|
|
1763
|
-
_s17(useDataRouterContext, "/dMy7t63NXD4eYACoT93CePwGrg=");
|
|
1764
|
-
function useDataRouterState(hookName) {
|
|
1765
|
-
_s18();
|
|
1766
|
-
let state = React__namespace.useContext(DataRouterStateContext);
|
|
1767
|
-
!state ? browser$1.env.NODE_ENV !== "production" ? invariant(false, getDataRouterConsoleError(hookName)) : invariant(false) : undefined;
|
|
1768
|
-
return state;
|
|
1769
|
-
}
|
|
1770
|
-
_s18(useDataRouterState, "kdLImxeHm3898p7tqgy8Fclg5s8=");
|
|
1771
|
-
function useRouteContext(hookName) {
|
|
1772
|
-
_s19();
|
|
1773
|
-
let route = React__namespace.useContext(RouteContext);
|
|
1774
|
-
!route ? browser$1.env.NODE_ENV !== "production" ? invariant(false, getDataRouterConsoleError(hookName)) : invariant(false) : undefined;
|
|
1775
|
-
return route;
|
|
1776
|
-
}
|
|
1777
|
-
|
|
1778
|
-
// Internal version with hookName-aware debugging
|
|
1779
|
-
_s19(useRouteContext, "+p67gHdeicVxIDd5SykDKMiYfaw=");
|
|
1780
|
-
function useCurrentRouteId(hookName) {
|
|
1781
|
-
_s20();
|
|
1782
|
-
let route = useRouteContext(hookName);
|
|
1783
|
-
let thisRoute = route.matches[route.matches.length - 1];
|
|
1784
|
-
!thisRoute.route.id ? browser$1.env.NODE_ENV !== "production" ? invariant(false, hookName + " can only be used on routes that contain a unique \"id\"") : invariant(false) : undefined;
|
|
1785
|
-
return thisRoute.route.id;
|
|
1786
|
-
}
|
|
1787
|
-
|
|
1788
|
-
/**
|
|
1789
|
-
* Returns the ID for the nearest contextual route
|
|
1790
|
-
*/
|
|
1791
|
-
_s20(useCurrentRouteId, "wASpERyQLx+zgcw/PyUNGa0MV3E=", false, function () {
|
|
1792
|
-
return [useRouteContext];
|
|
1793
|
-
});
|
|
1794
|
-
function useRouteId() {
|
|
1795
|
-
_s21();
|
|
1796
|
-
return useCurrentRouteId(DataRouterStateHook.UseRouteId);
|
|
1797
|
-
}
|
|
1798
|
-
|
|
1799
|
-
/**
|
|
1800
|
-
* Returns the current navigation, defaulting to an "idle" navigation when
|
|
1801
|
-
* no navigation is in progress
|
|
1802
|
-
*/
|
|
1803
|
-
_s21(useRouteId, "pD4QEmuO4Ll++v9bSotMnGBlCbU=", false, function () {
|
|
1804
|
-
return [useCurrentRouteId];
|
|
1805
|
-
});
|
|
1806
|
-
function useNavigation() {
|
|
1807
|
-
_s22();
|
|
1808
|
-
let state = useDataRouterState(DataRouterStateHook.UseNavigation);
|
|
1809
|
-
return state.navigation;
|
|
1810
|
-
}
|
|
1811
|
-
|
|
1812
|
-
/**
|
|
1813
|
-
* Returns a revalidate function for manually triggering revalidation, as well
|
|
1814
|
-
* as the current state of any manual revalidations
|
|
1815
|
-
*/
|
|
1816
|
-
_s22(useNavigation, "ksx0pUFe0Qs5FOQ3bx/kwJ/n1pg=", false, function () {
|
|
1817
|
-
return [useDataRouterState];
|
|
1818
|
-
});
|
|
1819
|
-
function useRevalidator() {
|
|
1820
|
-
_s23();
|
|
1821
|
-
let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);
|
|
1822
|
-
let state = useDataRouterState(DataRouterStateHook.UseRevalidator);
|
|
1823
|
-
return React__namespace.useMemo(() => ({
|
|
1824
|
-
revalidate: dataRouterContext.router.revalidate,
|
|
1825
|
-
state: state.revalidation
|
|
1826
|
-
}), [dataRouterContext.router.revalidate, state.revalidation]);
|
|
1827
|
-
}
|
|
1828
|
-
|
|
1829
|
-
/**
|
|
1830
|
-
* Returns the active route matches, useful for accessing loaderData for
|
|
1831
|
-
* parent/child routes or the route "handle" property
|
|
1832
|
-
*/
|
|
1833
|
-
_s23(useRevalidator, "EZWIzOxYWjhEC35mfDgj9WeuX0E=", false, function () {
|
|
1834
|
-
return [useDataRouterContext, useDataRouterState];
|
|
1835
|
-
});
|
|
1836
|
-
function useMatches() {
|
|
1837
|
-
_s24();
|
|
1838
|
-
let {
|
|
1839
|
-
matches,
|
|
1840
|
-
loaderData
|
|
1841
|
-
} = useDataRouterState(DataRouterStateHook.UseMatches);
|
|
1842
|
-
return React__namespace.useMemo(() => matches.map(m => convertRouteMatchToUiMatch(m, loaderData)), [matches, loaderData]);
|
|
1843
|
-
}
|
|
1844
|
-
|
|
1845
|
-
/**
|
|
1846
|
-
* Returns the loader data for the nearest ancestor Route loader
|
|
1847
|
-
*/
|
|
1848
|
-
_s24(useMatches, "NOMFGVHPHfWiEFTcfvlVcUixXmw=", false, function () {
|
|
1849
|
-
return [useDataRouterState];
|
|
1850
|
-
});
|
|
1851
|
-
function useLoaderData() {
|
|
1852
|
-
_s25();
|
|
1853
|
-
let state = useDataRouterState(DataRouterStateHook.UseLoaderData);
|
|
1854
|
-
let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);
|
|
1855
|
-
if (state.errors && state.errors[routeId] != null) {
|
|
1856
|
-
console.error("You cannot `useLoaderData` in an errorElement (routeId: " + routeId + ")");
|
|
1857
|
-
return undefined;
|
|
1858
|
-
}
|
|
1859
|
-
return state.loaderData[routeId];
|
|
1860
|
-
}
|
|
1861
|
-
|
|
1862
|
-
/**
|
|
1863
|
-
* Returns the loaderData for the given routeId
|
|
1864
|
-
*/
|
|
1865
|
-
_s25(useLoaderData, "9OzlB4eTxA/d/duIIR6ygqOjcHs=", false, function () {
|
|
1866
|
-
return [useDataRouterState, useCurrentRouteId];
|
|
1867
|
-
});
|
|
1868
|
-
function useRouteLoaderData(routeId) {
|
|
1869
|
-
_s26();
|
|
1870
|
-
let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);
|
|
1871
|
-
return state.loaderData[routeId];
|
|
1872
|
-
}
|
|
1873
|
-
|
|
1874
|
-
/**
|
|
1875
|
-
* Returns the action data for the nearest ancestor Route action
|
|
1876
|
-
*/
|
|
1877
|
-
_s26(useRouteLoaderData, "ksx0pUFe0Qs5FOQ3bx/kwJ/n1pg=", false, function () {
|
|
1878
|
-
return [useDataRouterState];
|
|
1879
|
-
});
|
|
1880
|
-
function useActionData() {
|
|
1881
|
-
_s27();
|
|
1882
|
-
let state = useDataRouterState(DataRouterStateHook.UseActionData);
|
|
1883
|
-
let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);
|
|
1884
|
-
return state.actionData ? state.actionData[routeId] : undefined;
|
|
1885
|
-
}
|
|
1886
|
-
|
|
1887
|
-
/**
|
|
1888
|
-
* Returns the nearest ancestor Route error, which could be a loader/action
|
|
1889
|
-
* error or a render error. This is intended to be called from your
|
|
1890
|
-
* ErrorBoundary/errorElement to display a proper error message.
|
|
1891
|
-
*/
|
|
1892
|
-
_s27(useActionData, "9OzlB4eTxA/d/duIIR6ygqOjcHs=", false, function () {
|
|
1893
|
-
return [useDataRouterState, useCurrentRouteId];
|
|
1894
|
-
});
|
|
1895
|
-
function useRouteError() {
|
|
1896
|
-
_s28();
|
|
1897
|
-
var _state$errors;
|
|
1898
|
-
let error = React__namespace.useContext(RouteErrorContext);
|
|
1899
|
-
let state = useDataRouterState(DataRouterStateHook.UseRouteError);
|
|
1900
|
-
let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);
|
|
1901
|
-
|
|
1902
|
-
// If this was a render error, we put it in a RouteError context inside
|
|
1903
|
-
// of RenderErrorBoundary
|
|
1904
|
-
if (error !== undefined) {
|
|
1905
|
-
return error;
|
|
1906
|
-
}
|
|
1907
|
-
|
|
1908
|
-
// Otherwise look for errors from our data router state
|
|
1909
|
-
return (_state$errors = state.errors) == null ? undefined : _state$errors[routeId];
|
|
1910
|
-
}
|
|
1911
|
-
|
|
1912
|
-
/**
|
|
1913
|
-
* Returns the happy-path data from the nearest ancestor `<Await />` value
|
|
1914
|
-
*/
|
|
1915
|
-
_s28(useRouteError, "MKznRPOFPCBNjzCcIHhUV3MxLu8=", false, function () {
|
|
1916
|
-
return [useDataRouterState, useCurrentRouteId];
|
|
1917
|
-
});
|
|
1918
|
-
function useAsyncValue() {
|
|
1919
|
-
_s29();
|
|
1920
|
-
let value = React__namespace.useContext(AwaitContext);
|
|
1921
|
-
return value == null ? undefined : value._data;
|
|
1922
|
-
}
|
|
1923
|
-
|
|
1924
|
-
/**
|
|
1925
|
-
* Returns the error from the nearest ancestor `<Await />` value
|
|
1926
|
-
*/
|
|
1927
|
-
_s29(useAsyncValue, "ksutO2/Ix3UeCrGnhyM+QEP505Y=");
|
|
1928
|
-
function useAsyncError() {
|
|
1929
|
-
_s30();
|
|
1930
|
-
let value = React__namespace.useContext(AwaitContext);
|
|
1931
|
-
return value == null ? undefined : value._error;
|
|
1932
|
-
}
|
|
1933
|
-
_s30(useAsyncError, "ksutO2/Ix3UeCrGnhyM+QEP505Y=");
|
|
1934
|
-
let blockerId = 0;
|
|
1935
|
-
|
|
1936
|
-
/**
|
|
1937
|
-
* Allow the application to block navigations within the SPA and present the
|
|
1938
|
-
* user a confirmation dialog to confirm the navigation. Mostly used to avoid
|
|
1939
|
-
* using half-filled form data. This does not handle hard-reloads or
|
|
1940
|
-
* cross-origin navigations.
|
|
1941
|
-
*/
|
|
1942
|
-
function useBlocker(shouldBlock) {
|
|
1943
|
-
_s31();
|
|
1944
|
-
let {
|
|
1945
|
-
router,
|
|
1946
|
-
basename
|
|
1947
|
-
} = useDataRouterContext(DataRouterHook.UseBlocker);
|
|
1948
|
-
let state = useDataRouterState(DataRouterStateHook.UseBlocker);
|
|
1949
|
-
let [blockerKey, setBlockerKey] = React__namespace.useState("");
|
|
1950
|
-
let blockerFunction = React__namespace.useCallback(arg => {
|
|
1951
|
-
if (typeof shouldBlock !== "function") {
|
|
1952
|
-
return !!shouldBlock;
|
|
1953
|
-
}
|
|
1954
|
-
if (basename === "/") {
|
|
1955
|
-
return shouldBlock(arg);
|
|
1956
|
-
}
|
|
1957
|
-
|
|
1958
|
-
// If they provided us a function and we've got an active basename, strip
|
|
1959
|
-
// it from the locations we expose to the user to match the behavior of
|
|
1960
|
-
// useLocation
|
|
1961
|
-
let {
|
|
1962
|
-
currentLocation,
|
|
1963
|
-
nextLocation,
|
|
1964
|
-
historyAction
|
|
1965
|
-
} = arg;
|
|
1966
|
-
return shouldBlock({
|
|
1967
|
-
currentLocation: _extends({}, currentLocation, {
|
|
1968
|
-
pathname: stripBasename(currentLocation.pathname, basename) || currentLocation.pathname
|
|
1969
|
-
}),
|
|
1970
|
-
nextLocation: _extends({}, nextLocation, {
|
|
1971
|
-
pathname: stripBasename(nextLocation.pathname, basename) || nextLocation.pathname
|
|
1972
|
-
}),
|
|
1973
|
-
historyAction
|
|
1974
|
-
});
|
|
1975
|
-
}, [basename, shouldBlock]);
|
|
1976
|
-
|
|
1977
|
-
// This effect is in charge of blocker key assignment and deletion (which is
|
|
1978
|
-
// tightly coupled to the key)
|
|
1979
|
-
React__namespace.useEffect(() => {
|
|
1980
|
-
let key = String(++blockerId);
|
|
1981
|
-
setBlockerKey(key);
|
|
1982
|
-
return () => router.deleteBlocker(key);
|
|
1983
|
-
}, [router]);
|
|
1984
|
-
|
|
1985
|
-
// This effect handles assigning the blockerFunction. This is to handle
|
|
1986
|
-
// unstable blocker function identities, and happens only after the prior
|
|
1987
|
-
// effect so we don't get an orphaned blockerFunction in the router with a
|
|
1988
|
-
// key of "". Until then we just have the IDLE_BLOCKER.
|
|
1989
|
-
React__namespace.useEffect(() => {
|
|
1990
|
-
if (blockerKey !== "") {
|
|
1991
|
-
router.getBlocker(blockerKey, blockerFunction);
|
|
1992
|
-
}
|
|
1993
|
-
}, [router, blockerKey, blockerFunction]);
|
|
1994
|
-
|
|
1995
|
-
// Prefer the blocker from `state` not `router.state` since DataRouterContext
|
|
1996
|
-
// is memoized so this ensures we update on blocker state updates
|
|
1997
|
-
return blockerKey && state.blockers.has(blockerKey) ? state.blockers.get(blockerKey) : IDLE_BLOCKER;
|
|
1998
|
-
}
|
|
1999
|
-
|
|
2000
|
-
/**
|
|
2001
|
-
* Stable version of useNavigate that is used when we are in the context of
|
|
2002
|
-
* a RouterProvider.
|
|
2003
|
-
*/
|
|
2004
|
-
_s31(useBlocker, "AOVsd8P3GKIpZMz2QSJilxLW7HY=", false, function () {
|
|
2005
|
-
return [useDataRouterContext, useDataRouterState];
|
|
2006
|
-
});
|
|
2007
|
-
function useNavigateStable() {
|
|
2008
|
-
_s32();
|
|
2009
|
-
let {
|
|
2010
|
-
router
|
|
2011
|
-
} = useDataRouterContext(DataRouterHook.UseNavigateStable);
|
|
2012
|
-
let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);
|
|
2013
|
-
let activeRef = React__namespace.useRef(false);
|
|
2014
|
-
useIsomorphicLayoutEffect(() => {
|
|
2015
|
-
activeRef.current = true;
|
|
2016
|
-
});
|
|
2017
|
-
let navigate = React__namespace.useCallback(function (to, options) {
|
|
2018
|
-
if (options === undefined) {
|
|
2019
|
-
options = {};
|
|
2020
|
-
}
|
|
2021
|
-
browser$1.env.NODE_ENV !== "production" ? warning(activeRef.current, navigateEffectWarning) : undefined;
|
|
2022
|
-
|
|
2023
|
-
// Short circuit here since if this happens on first render the navigate
|
|
2024
|
-
// is useless because we haven't wired up our router subscriber yet
|
|
2025
|
-
if (!activeRef.current) return;
|
|
2026
|
-
if (typeof to === "number") {
|
|
2027
|
-
router.navigate(to);
|
|
2028
|
-
} else {
|
|
2029
|
-
router.navigate(to, _extends({
|
|
2030
|
-
fromRouteId: id
|
|
2031
|
-
}, options));
|
|
2032
|
-
}
|
|
2033
|
-
}, [router, id]);
|
|
2034
|
-
return navigate;
|
|
2035
|
-
}
|
|
2036
|
-
_s32(useNavigateStable, "XnEoyWrHBFr+eR9tWx9eMWjlblI=", false, function () {
|
|
2037
|
-
return [useDataRouterContext, useCurrentRouteId, useIsomorphicLayoutEffect];
|
|
2038
|
-
});
|
|
2039
|
-
const alreadyWarned = {};
|
|
2040
|
-
function warningOnce(key, cond, message) {
|
|
2041
|
-
if (!cond && !alreadyWarned[key]) {
|
|
2042
|
-
alreadyWarned[key] = true;
|
|
2043
|
-
browser$1.env.NODE_ENV !== "production" ? warning(false, message) : undefined;
|
|
2044
|
-
}
|
|
2045
|
-
}
|
|
2046
|
-
|
|
2047
|
-
/**
|
|
2048
|
-
Webpack + React 17 fails to compile on any of the following because webpack
|
|
2049
|
-
complains that `startTransition` doesn't exist in `React`:
|
|
2050
|
-
* import { startTransition } from "react"
|
|
2051
|
-
* import * as React from from "react";
|
|
2052
|
-
"startTransition" in React ? React.startTransition(() => setState()) : setState()
|
|
2053
|
-
* import * as React from from "react";
|
|
2054
|
-
"startTransition" in React ? React["startTransition"](() => setState()) : setState()
|
|
2055
|
-
|
|
2056
|
-
Moving it to a constant such as the following solves the Webpack/React 17 issue:
|
|
2057
|
-
* import * as React from from "react";
|
|
2058
|
-
const START_TRANSITION = "startTransition";
|
|
2059
|
-
START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()
|
|
2060
|
-
|
|
2061
|
-
However, that introduces webpack/terser minification issues in production builds
|
|
2062
|
-
in React 18 where minification/obfuscation ends up removing the call of
|
|
2063
|
-
React.startTransition entirely from the first half of the ternary. Grabbing
|
|
2064
|
-
this exported reference once up front resolves that issue.
|
|
2065
|
-
|
|
2066
|
-
See https://github.com/remix-run/react-router/issues/10579
|
|
2067
|
-
*/
|
|
2068
|
-
const START_TRANSITION = "startTransition";
|
|
2069
|
-
const startTransitionImpl = React__namespace[START_TRANSITION];
|
|
2070
|
-
|
|
2071
|
-
/**
|
|
2072
|
-
* Given a Remix Router instance, render the appropriate UI
|
|
2073
|
-
*/
|
|
2074
|
-
function RouterProvider(_ref) {
|
|
2075
|
-
_s33();
|
|
2076
|
-
let {
|
|
2077
|
-
fallbackElement,
|
|
2078
|
-
router,
|
|
2079
|
-
future
|
|
2080
|
-
} = _ref;
|
|
2081
|
-
let [state, setStateImpl] = React__namespace.useState(router.state);
|
|
2082
|
-
let {
|
|
2083
|
-
v7_startTransition
|
|
2084
|
-
} = future || {};
|
|
2085
|
-
let setState = React__namespace.useCallback(newState => {
|
|
2086
|
-
if (v7_startTransition && startTransitionImpl) {
|
|
2087
|
-
startTransitionImpl(() => setStateImpl(newState));
|
|
2088
|
-
} else {
|
|
2089
|
-
setStateImpl(newState);
|
|
2090
|
-
}
|
|
2091
|
-
}, [setStateImpl, v7_startTransition]);
|
|
2092
|
-
|
|
2093
|
-
// Need to use a layout effect here so we are subscribed early enough to
|
|
2094
|
-
// pick up on any render-driven redirects/navigations (useEffect/<Navigate>)
|
|
2095
|
-
React__namespace.useLayoutEffect(() => router.subscribe(setState), [router, setState]);
|
|
2096
|
-
React__namespace.useEffect(() => {
|
|
2097
|
-
browser$1.env.NODE_ENV !== "production" ? warning(fallbackElement == null || !router.future.v7_partialHydration, "`<RouterProvider fallbackElement>` is deprecated when using " + "`v7_partialHydration`, use a `HydrateFallback` component instead") : undefined;
|
|
2098
|
-
// Only log this once on initial mount
|
|
2099
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
2100
|
-
}, []);
|
|
2101
|
-
let navigator = React__namespace.useMemo(() => {
|
|
2102
|
-
return {
|
|
2103
|
-
createHref: router.createHref,
|
|
2104
|
-
encodeLocation: router.encodeLocation,
|
|
2105
|
-
go: n => router.navigate(n),
|
|
2106
|
-
push: (to, state, opts) => router.navigate(to, {
|
|
2107
|
-
state,
|
|
2108
|
-
preventScrollReset: opts == null ? undefined : opts.preventScrollReset
|
|
2109
|
-
}),
|
|
2110
|
-
replace: (to, state, opts) => router.navigate(to, {
|
|
2111
|
-
replace: true,
|
|
2112
|
-
state,
|
|
2113
|
-
preventScrollReset: opts == null ? undefined : opts.preventScrollReset
|
|
2114
|
-
})
|
|
2115
|
-
};
|
|
2116
|
-
}, [router]);
|
|
2117
|
-
let basename = router.basename || "/";
|
|
2118
|
-
let dataRouterContext = React__namespace.useMemo(() => ({
|
|
2119
|
-
router,
|
|
2120
|
-
navigator,
|
|
2121
|
-
static: false,
|
|
2122
|
-
basename
|
|
2123
|
-
}), [router, navigator, basename]);
|
|
2124
|
-
|
|
2125
|
-
// The fragment and {null} here are important! We need them to keep React 18's
|
|
2126
|
-
// useId happy when we are server-rendering since we may have a <script> here
|
|
2127
|
-
// containing the hydrated server-side staticContext (from StaticRouterProvider).
|
|
2128
|
-
// useId relies on the component tree structure to generate deterministic id's
|
|
2129
|
-
// so we need to ensure it remains the same on the client even though
|
|
2130
|
-
// we don't need the <script> tag
|
|
2131
|
-
return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement(DataRouterContext.Provider, {
|
|
2132
|
-
value: dataRouterContext
|
|
2133
|
-
}, /*#__PURE__*/React__namespace.createElement(DataRouterStateContext.Provider, {
|
|
2134
|
-
value: state
|
|
2135
|
-
}, /*#__PURE__*/React__namespace.createElement(Router, {
|
|
2136
|
-
basename: basename,
|
|
2137
|
-
location: state.location,
|
|
2138
|
-
navigationType: state.historyAction,
|
|
2139
|
-
navigator: navigator,
|
|
2140
|
-
future: {
|
|
2141
|
-
v7_relativeSplatPath: router.future.v7_relativeSplatPath
|
|
2142
|
-
}
|
|
2143
|
-
}, state.initialized || router.future.v7_partialHydration ? /*#__PURE__*/React__namespace.createElement(DataRoutes, {
|
|
2144
|
-
routes: router.routes,
|
|
2145
|
-
future: router.future,
|
|
2146
|
-
state: state
|
|
2147
|
-
}) : fallbackElement))), null);
|
|
2148
|
-
}
|
|
2149
|
-
_s33(RouterProvider, "kUUDDYbee7ULQBMEitmsnqmH1Mo=");
|
|
2150
|
-
_c3 = RouterProvider;
|
|
2151
|
-
function DataRoutes(_ref2) {
|
|
2152
|
-
_s34();
|
|
2153
|
-
let {
|
|
2154
|
-
routes,
|
|
2155
|
-
future,
|
|
2156
|
-
state
|
|
2157
|
-
} = _ref2;
|
|
2158
|
-
return useRoutesImpl(routes, undefined, state, future);
|
|
2159
|
-
}
|
|
2160
|
-
/**
|
|
2161
|
-
* A `<Router>` that stores all entries in memory.
|
|
2162
|
-
*
|
|
2163
|
-
* @see https://reactrouter.com/router-components/memory-router
|
|
2164
|
-
*/
|
|
2165
|
-
_s34(DataRoutes, "bxXQ1PjoUitFHQG/730mCYNdT00=", false, function () {
|
|
2166
|
-
return [useRoutesImpl];
|
|
2167
|
-
});
|
|
2168
|
-
_c4 = DataRoutes;
|
|
2169
|
-
function MemoryRouter(_ref3) {
|
|
2170
|
-
_s35();
|
|
2171
|
-
let {
|
|
2172
|
-
basename,
|
|
2173
|
-
children,
|
|
2174
|
-
initialEntries,
|
|
2175
|
-
initialIndex,
|
|
2176
|
-
future
|
|
2177
|
-
} = _ref3;
|
|
2178
|
-
let historyRef = React__namespace.useRef();
|
|
2179
|
-
if (historyRef.current == null) {
|
|
2180
|
-
historyRef.current = createMemoryHistory({
|
|
2181
|
-
initialEntries,
|
|
2182
|
-
initialIndex,
|
|
2183
|
-
v5Compat: true
|
|
2184
|
-
});
|
|
2185
|
-
}
|
|
2186
|
-
let history = historyRef.current;
|
|
2187
|
-
let [state, setStateImpl] = React__namespace.useState({
|
|
2188
|
-
action: history.action,
|
|
2189
|
-
location: history.location
|
|
2190
|
-
});
|
|
2191
|
-
let {
|
|
2192
|
-
v7_startTransition
|
|
2193
|
-
} = future || {};
|
|
2194
|
-
let setState = React__namespace.useCallback(newState => {
|
|
2195
|
-
v7_startTransition && startTransitionImpl ? startTransitionImpl(() => setStateImpl(newState)) : setStateImpl(newState);
|
|
2196
|
-
}, [setStateImpl, v7_startTransition]);
|
|
2197
|
-
React__namespace.useLayoutEffect(() => history.listen(setState), [history, setState]);
|
|
2198
|
-
return /*#__PURE__*/React__namespace.createElement(Router, {
|
|
2199
|
-
basename: basename,
|
|
2200
|
-
children: children,
|
|
2201
|
-
location: state.location,
|
|
2202
|
-
navigationType: state.action,
|
|
2203
|
-
navigator: history,
|
|
2204
|
-
future: future
|
|
2205
|
-
});
|
|
2206
|
-
}
|
|
2207
|
-
/**
|
|
2208
|
-
* Changes the current location.
|
|
2209
|
-
*
|
|
2210
|
-
* Note: This API is mostly useful in React.Component subclasses that are not
|
|
2211
|
-
* able to use hooks. In functional components, we recommend you use the
|
|
2212
|
-
* `useNavigate` hook instead.
|
|
2213
|
-
*
|
|
2214
|
-
* @see https://reactrouter.com/components/navigate
|
|
2215
|
-
*/
|
|
2216
|
-
_s35(MemoryRouter, "4hUJUqHydkgNqll0yBdcphm8IwU=");
|
|
2217
|
-
_c5 = MemoryRouter;
|
|
2218
|
-
function Navigate(_ref4) {
|
|
2219
|
-
_s36();
|
|
2220
|
-
let {
|
|
2221
|
-
to,
|
|
2222
|
-
replace,
|
|
2223
|
-
state,
|
|
2224
|
-
relative
|
|
2225
|
-
} = _ref4;
|
|
2226
|
-
!useInRouterContext() ? browser$1.env.NODE_ENV !== "production" ? invariant(false,
|
|
2227
|
-
// TODO: This error is probably because they somehow have 2 versions of
|
|
2228
|
-
// the router loaded. We can help them understand how to avoid that.
|
|
2229
|
-
"<Navigate> may be used only in the context of a <Router> component.") : invariant(false) : undefined;
|
|
2230
|
-
let {
|
|
2231
|
-
future,
|
|
2232
|
-
static: isStatic
|
|
2233
|
-
} = React__namespace.useContext(NavigationContext);
|
|
2234
|
-
browser$1.env.NODE_ENV !== "production" ? warning(!isStatic, "<Navigate> must not be used on the initial render in a <StaticRouter>. " + "This is a no-op, but you should modify your code so the <Navigate> is " + "only ever rendered in response to some user interaction or state change.") : undefined;
|
|
2235
|
-
let {
|
|
2236
|
-
matches
|
|
2237
|
-
} = React__namespace.useContext(RouteContext);
|
|
2238
|
-
let {
|
|
2239
|
-
pathname: locationPathname
|
|
2240
|
-
} = useLocation();
|
|
2241
|
-
let navigate = useNavigate();
|
|
2242
|
-
|
|
2243
|
-
// Resolve the path outside of the effect so that when effects run twice in
|
|
2244
|
-
// StrictMode they navigate to the same place
|
|
2245
|
-
let path = resolveTo(to, getResolveToMatches(matches, future.v7_relativeSplatPath), locationPathname, relative === "path");
|
|
2246
|
-
let jsonPath = JSON.stringify(path);
|
|
2247
|
-
React__namespace.useEffect(() => navigate(JSON.parse(jsonPath), {
|
|
2248
|
-
replace,
|
|
2249
|
-
state,
|
|
2250
|
-
relative
|
|
2251
|
-
}), [navigate, jsonPath, relative, replace, state]);
|
|
2252
|
-
return null;
|
|
2253
|
-
}
|
|
2254
|
-
/**
|
|
2255
|
-
* Renders the child route's element, if there is one.
|
|
2256
|
-
*
|
|
2257
|
-
* @see https://reactrouter.com/components/outlet
|
|
2258
|
-
*/
|
|
2259
|
-
_s36(Navigate, "n37Mzi87sVJPNmCniRUSXZEDIfY=", false, function () {
|
|
2260
|
-
return [useInRouterContext, useLocation, useNavigate];
|
|
2261
|
-
});
|
|
2262
|
-
_c6 = Navigate;
|
|
2263
|
-
function Outlet(props) {
|
|
2264
|
-
_s37();
|
|
2265
|
-
return useOutlet(props.context);
|
|
2266
|
-
}
|
|
2267
|
-
/**
|
|
2268
|
-
* Declares an element that should be rendered at a certain URL path.
|
|
2269
|
-
*
|
|
2270
|
-
* @see https://reactrouter.com/components/route
|
|
2271
|
-
*/
|
|
2272
|
-
_s37(Outlet, "UOsMKhZRqBWgnX+NkNBlxu0sfe8=", false, function () {
|
|
2273
|
-
return [useOutlet];
|
|
2274
|
-
});
|
|
2275
|
-
_c7 = Outlet;
|
|
2276
|
-
function Route(_props) {
|
|
2277
|
-
browser$1.env.NODE_ENV !== "production" ? invariant(false, "A <Route> is only ever to be used as the child of <Routes> element, " + "never rendered directly. Please wrap your <Route> in a <Routes>.") : invariant(false);
|
|
2278
|
-
}
|
|
2279
|
-
/**
|
|
2280
|
-
* Provides location context for the rest of the app.
|
|
2281
|
-
*
|
|
2282
|
-
* Note: You usually won't render a `<Router>` directly. Instead, you'll render a
|
|
2283
|
-
* router that is more specific to your environment such as a `<BrowserRouter>`
|
|
2284
|
-
* in web browsers or a `<StaticRouter>` for server rendering.
|
|
2285
|
-
*
|
|
2286
|
-
* @see https://reactrouter.com/router-components/router
|
|
2287
|
-
*/
|
|
2288
|
-
_c8 = Route;
|
|
2289
|
-
function Router(_ref5) {
|
|
2290
|
-
_s38();
|
|
2291
|
-
let {
|
|
2292
|
-
basename: basenameProp = "/",
|
|
2293
|
-
children = null,
|
|
2294
|
-
location: locationProp,
|
|
2295
|
-
navigationType = Action.Pop,
|
|
2296
|
-
navigator,
|
|
2297
|
-
static: staticProp = false,
|
|
2298
|
-
future
|
|
2299
|
-
} = _ref5;
|
|
2300
|
-
!!useInRouterContext() ? browser$1.env.NODE_ENV !== "production" ? invariant(false, "You cannot render a <Router> inside another <Router>." + " You should never have more than one in your app.") : invariant(false) : undefined;
|
|
2301
|
-
|
|
2302
|
-
// Preserve trailing slashes on basename, so we can let the user control
|
|
2303
|
-
// the enforcement of trailing slashes throughout the app
|
|
2304
|
-
let basename = basenameProp.replace(/^\/*/, "/");
|
|
2305
|
-
let navigationContext = React__namespace.useMemo(() => ({
|
|
2306
|
-
basename,
|
|
2307
|
-
navigator,
|
|
2308
|
-
static: staticProp,
|
|
2309
|
-
future: _extends({
|
|
2310
|
-
v7_relativeSplatPath: false
|
|
2311
|
-
}, future)
|
|
2312
|
-
}), [basename, future, navigator, staticProp]);
|
|
2313
|
-
if (typeof locationProp === "string") {
|
|
2314
|
-
locationProp = parsePath(locationProp);
|
|
2315
|
-
}
|
|
2316
|
-
let {
|
|
2317
|
-
pathname = "/",
|
|
2318
|
-
search = "",
|
|
2319
|
-
hash = "",
|
|
2320
|
-
state = null,
|
|
2321
|
-
key = "default"
|
|
2322
|
-
} = locationProp;
|
|
2323
|
-
let locationContext = React__namespace.useMemo(() => {
|
|
2324
|
-
let trailingPathname = stripBasename(pathname, basename);
|
|
2325
|
-
if (trailingPathname == null) {
|
|
2326
|
-
return null;
|
|
2327
|
-
}
|
|
2328
|
-
return {
|
|
2329
|
-
location: {
|
|
2330
|
-
pathname: trailingPathname,
|
|
2331
|
-
search,
|
|
2332
|
-
hash,
|
|
2333
|
-
state,
|
|
2334
|
-
key
|
|
2335
|
-
},
|
|
2336
|
-
navigationType
|
|
2337
|
-
};
|
|
2338
|
-
}, [basename, pathname, search, hash, state, key, navigationType]);
|
|
2339
|
-
browser$1.env.NODE_ENV !== "production" ? warning(locationContext != null, "<Router basename=\"" + basename + "\"> is not able to match the URL " + ("\"" + pathname + search + hash + "\" because it does not start with the ") + "basename, so the <Router> won't render anything.") : undefined;
|
|
2340
|
-
if (locationContext == null) {
|
|
2341
|
-
return null;
|
|
2342
|
-
}
|
|
2343
|
-
return /*#__PURE__*/React__namespace.createElement(NavigationContext.Provider, {
|
|
2344
|
-
value: navigationContext
|
|
2345
|
-
}, /*#__PURE__*/React__namespace.createElement(LocationContext.Provider, {
|
|
2346
|
-
children: children,
|
|
2347
|
-
value: locationContext
|
|
2348
|
-
}));
|
|
2349
|
-
}
|
|
2350
|
-
/**
|
|
2351
|
-
* A container for a nested tree of `<Route>` elements that renders the branch
|
|
2352
|
-
* that best matches the current location.
|
|
2353
|
-
*
|
|
2354
|
-
* @see https://reactrouter.com/components/routes
|
|
2355
|
-
*/
|
|
2356
|
-
_s38(Router, "cWELrQ0qrnJGlFKBUy43aV+1NAk=", false, function () {
|
|
2357
|
-
return [useInRouterContext];
|
|
2358
|
-
});
|
|
2359
|
-
_c9 = Router;
|
|
2360
|
-
function Routes(_ref6) {
|
|
2361
|
-
_s39();
|
|
2362
|
-
let {
|
|
2363
|
-
children,
|
|
2364
|
-
location
|
|
2365
|
-
} = _ref6;
|
|
2366
|
-
return useRoutes(createRoutesFromChildren(children), location);
|
|
2367
|
-
}
|
|
2368
|
-
/**
|
|
2369
|
-
* Component to use for rendering lazily loaded data from returning defer()
|
|
2370
|
-
* in a loader function
|
|
2371
|
-
*/
|
|
2372
|
-
_s39(Routes, "mNBMh7IZrKf5fDyw9x3t8azefmI=", false, function () {
|
|
2373
|
-
return [useRoutes];
|
|
2374
|
-
});
|
|
2375
|
-
_c10 = Routes;
|
|
2376
|
-
function Await(_ref7) {
|
|
2377
|
-
let {
|
|
2378
|
-
children,
|
|
2379
|
-
errorElement,
|
|
2380
|
-
resolve
|
|
2381
|
-
} = _ref7;
|
|
2382
|
-
return /*#__PURE__*/React__namespace.createElement(AwaitErrorBoundary, {
|
|
2383
|
-
resolve: resolve,
|
|
2384
|
-
errorElement: errorElement
|
|
2385
|
-
}, /*#__PURE__*/React__namespace.createElement(ResolveAwait, null, children));
|
|
2386
|
-
}
|
|
2387
|
-
_c11 = Await;
|
|
2388
|
-
var AwaitRenderStatus = /*#__PURE__*/function (AwaitRenderStatus) {
|
|
2389
|
-
AwaitRenderStatus[AwaitRenderStatus["pending"] = 0] = "pending";
|
|
2390
|
-
AwaitRenderStatus[AwaitRenderStatus["success"] = 1] = "success";
|
|
2391
|
-
AwaitRenderStatus[AwaitRenderStatus["error"] = 2] = "error";
|
|
2392
|
-
return AwaitRenderStatus;
|
|
2393
|
-
}(AwaitRenderStatus || {});
|
|
2394
|
-
const neverSettledPromise = new Promise(() => {});
|
|
2395
|
-
class AwaitErrorBoundary extends React__namespace.Component {
|
|
2396
|
-
constructor(props) {
|
|
2397
|
-
super(props);
|
|
2398
|
-
this.state = {
|
|
2399
|
-
error: null
|
|
2400
|
-
};
|
|
2401
|
-
}
|
|
2402
|
-
static getDerivedStateFromError(error) {
|
|
2403
|
-
return {
|
|
2404
|
-
error
|
|
2405
|
-
};
|
|
2406
|
-
}
|
|
2407
|
-
componentDidCatch(error, errorInfo) {
|
|
2408
|
-
console.error("<Await> caught the following error during render", error, errorInfo);
|
|
2409
|
-
}
|
|
2410
|
-
render() {
|
|
2411
|
-
let {
|
|
2412
|
-
children,
|
|
2413
|
-
errorElement,
|
|
2414
|
-
resolve
|
|
2415
|
-
} = this.props;
|
|
2416
|
-
let promise = null;
|
|
2417
|
-
let status = AwaitRenderStatus.pending;
|
|
2418
|
-
if (!(resolve instanceof Promise)) {
|
|
2419
|
-
// Didn't get a promise - provide as a resolved promise
|
|
2420
|
-
status = AwaitRenderStatus.success;
|
|
2421
|
-
promise = Promise.resolve();
|
|
2422
|
-
Object.defineProperty(promise, "_tracked", {
|
|
2423
|
-
get: () => true
|
|
2424
|
-
});
|
|
2425
|
-
Object.defineProperty(promise, "_data", {
|
|
2426
|
-
get: () => resolve
|
|
2427
|
-
});
|
|
2428
|
-
} else if (this.state.error) {
|
|
2429
|
-
// Caught a render error, provide it as a rejected promise
|
|
2430
|
-
status = AwaitRenderStatus.error;
|
|
2431
|
-
let renderError = this.state.error;
|
|
2432
|
-
promise = Promise.reject().catch(() => {}); // Avoid unhandled rejection warnings
|
|
2433
|
-
Object.defineProperty(promise, "_tracked", {
|
|
2434
|
-
get: () => true
|
|
2435
|
-
});
|
|
2436
|
-
Object.defineProperty(promise, "_error", {
|
|
2437
|
-
get: () => renderError
|
|
2438
|
-
});
|
|
2439
|
-
} else if (resolve._tracked) {
|
|
2440
|
-
// Already tracked promise - check contents
|
|
2441
|
-
promise = resolve;
|
|
2442
|
-
status = "_error" in promise ? AwaitRenderStatus.error : "_data" in promise ? AwaitRenderStatus.success : AwaitRenderStatus.pending;
|
|
2443
|
-
} else {
|
|
2444
|
-
// Raw (untracked) promise - track it
|
|
2445
|
-
status = AwaitRenderStatus.pending;
|
|
2446
|
-
Object.defineProperty(resolve, "_tracked", {
|
|
2447
|
-
get: () => true
|
|
2448
|
-
});
|
|
2449
|
-
promise = resolve.then(data => Object.defineProperty(resolve, "_data", {
|
|
2450
|
-
get: () => data
|
|
2451
|
-
}), error => Object.defineProperty(resolve, "_error", {
|
|
2452
|
-
get: () => error
|
|
2453
|
-
}));
|
|
2454
|
-
}
|
|
2455
|
-
if (status === AwaitRenderStatus.error && promise._error instanceof AbortedDeferredError) {
|
|
2456
|
-
// Freeze the UI by throwing a never resolved promise
|
|
2457
|
-
throw neverSettledPromise;
|
|
2458
|
-
}
|
|
2459
|
-
if (status === AwaitRenderStatus.error && !errorElement) {
|
|
2460
|
-
// No errorElement, throw to the nearest route-level error boundary
|
|
2461
|
-
throw promise._error;
|
|
2462
|
-
}
|
|
2463
|
-
if (status === AwaitRenderStatus.error) {
|
|
2464
|
-
// Render via our errorElement
|
|
2465
|
-
return /*#__PURE__*/React__namespace.createElement(AwaitContext.Provider, {
|
|
2466
|
-
value: promise,
|
|
2467
|
-
children: errorElement
|
|
2468
|
-
});
|
|
2469
|
-
}
|
|
2470
|
-
if (status === AwaitRenderStatus.success) {
|
|
2471
|
-
// Render children with resolved value
|
|
2472
|
-
return /*#__PURE__*/React__namespace.createElement(AwaitContext.Provider, {
|
|
2473
|
-
value: promise,
|
|
2474
|
-
children: children
|
|
2475
|
-
});
|
|
2476
|
-
}
|
|
2477
|
-
|
|
2478
|
-
// Throw to the suspense boundary
|
|
2479
|
-
throw promise;
|
|
2480
|
-
}
|
|
2481
|
-
}
|
|
2482
|
-
|
|
2483
|
-
/**
|
|
2484
|
-
* @private
|
|
2485
|
-
* Indirection to leverage useAsyncValue for a render-prop API on `<Await>`
|
|
2486
|
-
*/
|
|
2487
|
-
function ResolveAwait(_ref8) {
|
|
2488
|
-
_s40();
|
|
2489
|
-
let {
|
|
2490
|
-
children
|
|
2491
|
-
} = _ref8;
|
|
2492
|
-
let data = useAsyncValue();
|
|
2493
|
-
let toRender = typeof children === "function" ? children(data) : children;
|
|
2494
|
-
return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, toRender);
|
|
2495
|
-
}
|
|
2496
|
-
|
|
2497
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
2498
|
-
// UTILS
|
|
2499
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
2500
|
-
|
|
2501
|
-
/**
|
|
2502
|
-
* Creates a route config from a React "children" object, which is usually
|
|
2503
|
-
* either a `<Route>` element or an array of them. Used internally by
|
|
2504
|
-
* `<Routes>` to create a route config from its children.
|
|
2505
|
-
*
|
|
2506
|
-
* @see https://reactrouter.com/utils/create-routes-from-children
|
|
2507
|
-
*/
|
|
2508
|
-
_s40(ResolveAwait, "EqArxLHTnAt9aJ6B4STzn3Bic5A=", false, function () {
|
|
2509
|
-
return [useAsyncValue];
|
|
2510
|
-
});
|
|
2511
|
-
_c12 = ResolveAwait;
|
|
2512
|
-
function createRoutesFromChildren(children, parentPath) {
|
|
2513
|
-
if (parentPath === undefined) {
|
|
2514
|
-
parentPath = [];
|
|
2515
|
-
}
|
|
2516
|
-
let routes = [];
|
|
2517
|
-
React__namespace.Children.forEach(children, (element, index) => {
|
|
2518
|
-
if (! /*#__PURE__*/React__namespace.isValidElement(element)) {
|
|
2519
|
-
// Ignore non-elements. This allows people to more easily inline
|
|
2520
|
-
// conditionals in their route config.
|
|
2521
|
-
return;
|
|
2522
|
-
}
|
|
2523
|
-
let treePath = [...parentPath, index];
|
|
2524
|
-
if (element.type === React__namespace.Fragment) {
|
|
2525
|
-
// Transparently support React.Fragment and its children.
|
|
2526
|
-
routes.push.apply(routes, createRoutesFromChildren(element.props.children, treePath));
|
|
2527
|
-
return;
|
|
2528
|
-
}
|
|
2529
|
-
!(element.type === Route) ? browser$1.env.NODE_ENV !== "production" ? invariant(false, "[" + (typeof element.type === "string" ? element.type : element.type.name) + "] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>") : invariant(false) : undefined;
|
|
2530
|
-
!(!element.props.index || !element.props.children) ? browser$1.env.NODE_ENV !== "production" ? invariant(false, "An index route cannot have child routes.") : invariant(false) : undefined;
|
|
2531
|
-
let route = {
|
|
2532
|
-
id: element.props.id || treePath.join("-"),
|
|
2533
|
-
caseSensitive: element.props.caseSensitive,
|
|
2534
|
-
element: element.props.element,
|
|
2535
|
-
Component: element.props.Component,
|
|
2536
|
-
index: element.props.index,
|
|
2537
|
-
path: element.props.path,
|
|
2538
|
-
loader: element.props.loader,
|
|
2539
|
-
action: element.props.action,
|
|
2540
|
-
errorElement: element.props.errorElement,
|
|
2541
|
-
ErrorBoundary: element.props.ErrorBoundary,
|
|
2542
|
-
hasErrorBoundary: element.props.ErrorBoundary != null || element.props.errorElement != null,
|
|
2543
|
-
shouldRevalidate: element.props.shouldRevalidate,
|
|
2544
|
-
handle: element.props.handle,
|
|
2545
|
-
lazy: element.props.lazy
|
|
2546
|
-
};
|
|
2547
|
-
if (element.props.children) {
|
|
2548
|
-
route.children = createRoutesFromChildren(element.props.children, treePath);
|
|
2549
|
-
}
|
|
2550
|
-
routes.push(route);
|
|
2551
|
-
});
|
|
2552
|
-
return routes;
|
|
2553
|
-
}
|
|
2554
|
-
var _c, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11, _c12;
|
|
2555
|
-
$RefreshReg$(_c, "DefaultErrorComponent");
|
|
2556
|
-
$RefreshReg$(_c2, "RenderedRoute");
|
|
2557
|
-
$RefreshReg$(_c3, "RouterProvider");
|
|
2558
|
-
$RefreshReg$(_c4, "DataRoutes");
|
|
2559
|
-
$RefreshReg$(_c5, "MemoryRouter");
|
|
2560
|
-
$RefreshReg$(_c6, "Navigate");
|
|
2561
|
-
$RefreshReg$(_c7, "Outlet");
|
|
2562
|
-
$RefreshReg$(_c8, "Route");
|
|
2563
|
-
$RefreshReg$(_c9, "Router");
|
|
2564
|
-
$RefreshReg$(_c10, "Routes");
|
|
2565
|
-
$RefreshReg$(_c11, "Await");
|
|
2566
|
-
$RefreshReg$(_c12, "ResolveAwait");
|
|
8
|
+
var reactDom = require('react-dom');
|
|
2567
9
|
|
|
2568
10
|
/* tslint:disable */
|
|
2569
11
|
/* eslint-disable */
|
|
@@ -3864,7 +1306,7 @@ const FeedbackPositioner = React.forwardRef(({ feedback, feedbackHeight = 0, isE
|
|
|
3864
1306
|
if (!targetElement || !targetElement.current || !isInitialized) {
|
|
3865
1307
|
return null;
|
|
3866
1308
|
}
|
|
3867
|
-
return
|
|
1309
|
+
return reactDom.createPortal(jsxRuntime.jsx("div", { ref: ref, style: {
|
|
3868
1310
|
position: "absolute",
|
|
3869
1311
|
bottom: position.bottom,
|
|
3870
1312
|
left: position.left,
|
|
@@ -4144,13 +1586,13 @@ const SideBar = () => {
|
|
|
4144
1586
|
const isConnected = !!me;
|
|
4145
1587
|
if (!isOpen)
|
|
4146
1588
|
return null;
|
|
4147
|
-
return
|
|
1589
|
+
return reactDom.createPortal(jsxRuntime.jsx("div", { id: "feedback-sidebar", className: `fixed top-0 transition-all w-[320px] h-screen z-[10000000] bg-gray-feedback-800 text-white px-3 py-4 ${isCollapsed ? "right-[-320px]" : "right-0"}`, children: jsxRuntime.jsxs("div", { className: "flex h-full w-full items-center flex-col", children: [jsxRuntime.jsxs("div", { className: "w-full flex flex-row justify-between items-center", children: [jsxRuntime.jsx("img", { src: "/feedback/logo-feedback-light.svg", className: "z-10" }), jsxRuntime.jsx(CloseButton, { onClick: closeFeedbackOverlay, size: "large" })] }), isConnected ? jsxRuntime.jsx(ConnectedPanel, {}) : jsxRuntime.jsx(ConnectionPanel, {}), jsxRuntime.jsx(CollapseButton, { isCollapsed: isCollapsed, setIsCollapsed: setIsCollapsed })] }) }), document.body);
|
|
4148
1590
|
};
|
|
4149
1591
|
|
|
4150
1592
|
const queryClient = new reactQuery.QueryClient();
|
|
4151
1593
|
function FeedbackRoot(props) {
|
|
4152
|
-
return (jsxRuntime.
|
|
1594
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(reactQuery.QueryClientProvider, { client: queryClient, children: jsxRuntime.jsxs(FeedbackProvider, Object.assign({}, props, { children: [jsxRuntime.jsx(FeedbackInput, {}), jsxRuntime.jsx(SideBar, {}), jsxRuntime.jsx(OpenFeedbackButton, {}), jsxRuntime.jsx(FeedbackPins, {})] })) }) }));
|
|
4153
1595
|
}
|
|
4154
1596
|
|
|
4155
1597
|
module.exports = FeedbackRoot;
|
|
4156
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLXBvbHlmaWxscy9wb2x5ZmlsbHMvZ2xvYmFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvcG9seWZpbGxzL3Byb2Nlc3MtZXM2LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0ByZW1peC1ydW4vcm91dGVyL2Rpc3Qvcm91dGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9kaXN0L2luZGV4LmpzIiwiLi4vLi4vbGlicy9iYWNrZW5kLWNsaWVudC9iYXNlLnRzIiwiLi4vLi4vbGlicy9iYWNrZW5kLWNsaWVudC9jb21tb24udHMiLCIuLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50L2FwaS50cyIsIi4uLy4uL2xpYnMvYmFja2VuZC1jbGllbnQvY29uZmlndXJhdGlvbi50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9hcGkudHMiLCIuLi8uLi9zcmMvc2VydmljZXMvZmVlZGJhY2sudHMiLCIuLi8uLi9zcmMvc2VydmljZXMvdXNlci50cyIsIi4uLy4uL3NyYy9jb250ZXh0cy9GZWVkYmFja0NvbnRleHQudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvYnV0dG9ucy9CdXR0b24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvYnV0dG9ucy9PcGVuRmVlZGJhY2tCdXR0b24udHN4IiwiLi4vLi4vc3JjL3V0aWxzL2dldEluaXRpYWxzLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL2ZlZWRiYWNrcy9pdGVtL0ZlZWRiYWNrSXRlbUhvdmVyZWQudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvYnV0dG9ucy9DbG9zZUJ1dHRvbi50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvcmVwbGllcy9SZXBseUl0ZW0udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL2ZlZWRiYWNrcy9zaGFyZWQvRmVlZGJhY2tUZXh0QXJlYS50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL21lbnUvTWVudUl0ZW0udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL2ZlZWRiYWNrcy9tZW51L01lbnVCdXR0b24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL2ZlZWRiYWNrcy9pdGVtL0ZlZWRiYWNrSXRlbVNlbGVjdGVkLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9mZWVkYmFja3Mvc2hhcmVkL0ZlZWRiYWNrUG9zaXRpb25lci50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL2l0ZW0vRmVlZGJhY2tQaW4udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL2ZlZWRiYWNrcy9ncm91cC9GZWVkYmFja1BpbnMudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvaWNvbnMvQ29tbWVudEljb24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL2ZlZWRiYWNrcy9pdGVtL0ZlZWRiYWNrSW5wdXQudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvYnV0dG9ucy9Db2xsYXBzZUJ1dHRvbi50c3giLCIuLi8uLi9zcmMvc2VydmljZXMvYXV0aC50cyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9Db25uZWN0ZWRVc2VyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL2lucHV0cy9TZWFyY2hJbnB1dC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL2l0ZW0vRmVlZGJhY2tMaXN0SXRlbS50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL2dyb3VwL0ZlZWRiYWNrTGlzdC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9vcmdhbmlzbXMvQ29ubmVjdGVkUGFuZWwudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvaW5wdXRzL0lucHV0LnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9mb3Jtcy9TaWduVXBGb3JtLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9mb3Jtcy9TaWduSW5Gb3JtLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL29yZ2FuaXNtcy9Db25uZWN0aW9uLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL21vZGFscy9Nb2RhbC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9tb2RhbHMvQ29ubmVjdGlvbk1vZGFsLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL29yZ2FuaXNtcy9Db25uZWN0aW9uUGFuZWwudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL1NpZGVCYXIudHN4IiwiLi4vLi4vc3JjL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6XG4gIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6XG4gIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSk7IiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG4vLyBiYXNlZCBvZmYgaHR0cHM6Ly9naXRodWIuY29tL2RlZnVuY3R6b21iaWUvbm9kZS1wcm9jZXNzL2Jsb2IvbWFzdGVyL2Jyb3dzZXIuanNcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG52YXIgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbmlmICh0eXBlb2YgZ2xvYmFsLnNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbn1cbmlmICh0eXBlb2YgZ2xvYmFsLmNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbn1cblxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuZnVuY3Rpb24gbmV4dFRpY2soZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn1cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG52YXIgdGl0bGUgPSAnYnJvd3Nlcic7XG52YXIgcGxhdGZvcm0gPSAnYnJvd3Nlcic7XG52YXIgYnJvd3NlciA9IHRydWU7XG52YXIgZW52ID0ge307XG52YXIgYXJndiA9IFtdO1xudmFyIHZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnZhciB2ZXJzaW9ucyA9IHt9O1xudmFyIHJlbGVhc2UgPSB7fTtcbnZhciBjb25maWcgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBvbiA9IG5vb3A7XG52YXIgYWRkTGlzdGVuZXIgPSBub29wO1xudmFyIG9uY2UgPSBub29wO1xudmFyIG9mZiA9IG5vb3A7XG52YXIgcmVtb3ZlTGlzdGVuZXIgPSBub29wO1xudmFyIHJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG52YXIgZW1pdCA9IG5vb3A7XG5cbmZ1bmN0aW9uIGJpbmRpbmcobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cblxuZnVuY3Rpb24gY3dkICgpIHsgcmV0dXJuICcvJyB9XG5mdW5jdGlvbiBjaGRpciAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1mdW5jdGlvbiB1bWFzaygpIHsgcmV0dXJuIDA7IH1cblxuLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20va3VtYXZpcy9icm93c2VyLXByb2Nlc3MtaHJ0aW1lL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG52YXIgcGVyZm9ybWFuY2UgPSBnbG9iYWwucGVyZm9ybWFuY2UgfHwge307XG52YXIgcGVyZm9ybWFuY2VOb3cgPVxuICBwZXJmb3JtYW5jZS5ub3cgICAgICAgIHx8XG4gIHBlcmZvcm1hbmNlLm1vek5vdyAgICAgfHxcbiAgcGVyZm9ybWFuY2UubXNOb3cgICAgICB8fFxuICBwZXJmb3JtYW5jZS5vTm93ICAgICAgIHx8XG4gIHBlcmZvcm1hbmNlLndlYmtpdE5vdyAgfHxcbiAgZnVuY3Rpb24oKXsgcmV0dXJuIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgfTtcblxuLy8gZ2VuZXJhdGUgdGltZXN0YW1wIG9yIGRlbHRhXG4vLyBzZWUgaHR0cDovL25vZGVqcy5vcmcvYXBpL3Byb2Nlc3MuaHRtbCNwcm9jZXNzX3Byb2Nlc3NfaHJ0aW1lXG5mdW5jdGlvbiBocnRpbWUocHJldmlvdXNUaW1lc3RhbXApe1xuICB2YXIgY2xvY2t0aW1lID0gcGVyZm9ybWFuY2VOb3cuY2FsbChwZXJmb3JtYW5jZSkqMWUtMztcbiAgdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKGNsb2NrdGltZSk7XG4gIHZhciBuYW5vc2Vjb25kcyA9IE1hdGguZmxvb3IoKGNsb2NrdGltZSUxKSoxZTkpO1xuICBpZiAocHJldmlvdXNUaW1lc3RhbXApIHtcbiAgICBzZWNvbmRzID0gc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzBdO1xuICAgIG5hbm9zZWNvbmRzID0gbmFub3NlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFsxXTtcbiAgICBpZiAobmFub3NlY29uZHM8MCkge1xuICAgICAgc2Vjb25kcy0tO1xuICAgICAgbmFub3NlY29uZHMgKz0gMWU5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gW3NlY29uZHMsbmFub3NlY29uZHNdXG59XG5cbnZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuZnVuY3Rpb24gdXB0aW1lKCkge1xuICB2YXIgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpO1xuICB2YXIgZGlmID0gY3VycmVudFRpbWUgLSBzdGFydFRpbWU7XG4gIHJldHVybiBkaWYgLyAxMDAwO1xufVxuXG52YXIgYnJvd3NlciQxID0ge1xuICBuZXh0VGljazogbmV4dFRpY2ssXG4gIHRpdGxlOiB0aXRsZSxcbiAgYnJvd3NlcjogYnJvd3NlcixcbiAgZW52OiBlbnYsXG4gIGFyZ3Y6IGFyZ3YsXG4gIHZlcnNpb246IHZlcnNpb24sXG4gIHZlcnNpb25zOiB2ZXJzaW9ucyxcbiAgb246IG9uLFxuICBhZGRMaXN0ZW5lcjogYWRkTGlzdGVuZXIsXG4gIG9uY2U6IG9uY2UsXG4gIG9mZjogb2ZmLFxuICByZW1vdmVMaXN0ZW5lcjogcmVtb3ZlTGlzdGVuZXIsXG4gIHJlbW92ZUFsbExpc3RlbmVyczogcmVtb3ZlQWxsTGlzdGVuZXJzLFxuICBlbWl0OiBlbWl0LFxuICBiaW5kaW5nOiBiaW5kaW5nLFxuICBjd2Q6IGN3ZCxcbiAgY2hkaXI6IGNoZGlyLFxuICB1bWFzazogdW1hc2ssXG4gIGhydGltZTogaHJ0aW1lLFxuICBwbGF0Zm9ybTogcGxhdGZvcm0sXG4gIHJlbGVhc2U6IHJlbGVhc2UsXG4gIGNvbmZpZzogY29uZmlnLFxuICB1cHRpbWU6IHVwdGltZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgYnJvd3NlciQxO1xuZXhwb3J0IHsgYWRkTGlzdGVuZXIsIGFyZ3YsIGJpbmRpbmcsIGJyb3dzZXIsIGNoZGlyLCBjb25maWcsIGN3ZCwgZW1pdCwgZW52LCBocnRpbWUsIG5leHRUaWNrLCBvZmYsIG9uLCBvbmNlLCBwbGF0Zm9ybSwgcmVsZWFzZSwgcmVtb3ZlQWxsTGlzdGVuZXJzLCByZW1vdmVMaXN0ZW5lciwgdGl0bGUsIHVtYXNrLCB1cHRpbWUsIHZlcnNpb24sIHZlcnNpb25zIH07XG4iLCIvKipcbiAqIEByZW1peC1ydW4vcm91dGVyIHYxLjE5LjJcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyNyZWdpb24gVHlwZXMgYW5kIENvbnN0YW50c1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qKlxuICogQWN0aW9ucyByZXByZXNlbnQgdGhlIHR5cGUgb2YgY2hhbmdlIHRvIGEgbG9jYXRpb24gdmFsdWUuXG4gKi9cbnZhciBBY3Rpb247XG4oZnVuY3Rpb24gKEFjdGlvbikge1xuICAvKipcbiAgICogQSBQT1AgaW5kaWNhdGVzIGEgY2hhbmdlIHRvIGFuIGFyYml0cmFyeSBpbmRleCBpbiB0aGUgaGlzdG9yeSBzdGFjaywgc3VjaFxuICAgKiBhcyBhIGJhY2sgb3IgZm9yd2FyZCBuYXZpZ2F0aW9uLiBJdCBkb2VzIG5vdCBkZXNjcmliZSB0aGUgZGlyZWN0aW9uIG9mIHRoZVxuICAgKiBuYXZpZ2F0aW9uLCBvbmx5IHRoYXQgdGhlIGN1cnJlbnQgaW5kZXggY2hhbmdlZC5cbiAgICpcbiAgICogTm90ZTogVGhpcyBpcyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIG5ld2x5IGNyZWF0ZWQgaGlzdG9yeSBvYmplY3RzLlxuICAgKi9cbiAgQWN0aW9uW1wiUG9wXCJdID0gXCJQT1BcIjtcbiAgLyoqXG4gICAqIEEgUFVTSCBpbmRpY2F0ZXMgYSBuZXcgZW50cnkgYmVpbmcgYWRkZWQgdG8gdGhlIGhpc3Rvcnkgc3RhY2ssIHN1Y2ggYXMgd2hlblxuICAgKiBhIGxpbmsgaXMgY2xpY2tlZCBhbmQgYSBuZXcgcGFnZSBsb2Fkcy4gV2hlbiB0aGlzIGhhcHBlbnMsIGFsbCBzdWJzZXF1ZW50XG4gICAqIGVudHJpZXMgaW4gdGhlIHN0YWNrIGFyZSBsb3N0LlxuICAgKi9cbiAgQWN0aW9uW1wiUHVzaFwiXSA9IFwiUFVTSFwiO1xuICAvKipcbiAgICogQSBSRVBMQUNFIGluZGljYXRlcyB0aGUgZW50cnkgYXQgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGhpc3Rvcnkgc3RhY2tcbiAgICogYmVpbmcgcmVwbGFjZWQgYnkgYSBuZXcgb25lLlxuICAgKi9cbiAgQWN0aW9uW1wiUmVwbGFjZVwiXSA9IFwiUkVQTEFDRVwiO1xufSkoQWN0aW9uIHx8IChBY3Rpb24gPSB7fSkpO1xuY29uc3QgUG9wU3RhdGVFdmVudFR5cGUgPSBcInBvcHN0YXRlXCI7XG4vKipcbiAqIE1lbW9yeSBoaXN0b3J5IHN0b3JlcyB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBtZW1vcnkuIEl0IGlzIGRlc2lnbmVkIGZvciB1c2VcbiAqIGluIHN0YXRlZnVsIG5vbi1icm93c2VyIGVudmlyb25tZW50cyBsaWtlIHRlc3RzIGFuZCBSZWFjdCBOYXRpdmUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUhpc3Rvcnkob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGxldCB7XG4gICAgaW5pdGlhbEVudHJpZXMgPSBbXCIvXCJdLFxuICAgIGluaXRpYWxJbmRleCxcbiAgICB2NUNvbXBhdCA9IGZhbHNlXG4gIH0gPSBvcHRpb25zO1xuICBsZXQgZW50cmllczsgLy8gRGVjbGFyZSBzbyB3ZSBjYW4gYWNjZXNzIGZyb20gY3JlYXRlTWVtb3J5TG9jYXRpb25cbiAgZW50cmllcyA9IGluaXRpYWxFbnRyaWVzLm1hcCgoZW50cnksIGluZGV4KSA9PiBjcmVhdGVNZW1vcnlMb2NhdGlvbihlbnRyeSwgdHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiID8gbnVsbCA6IGVudHJ5LnN0YXRlLCBpbmRleCA9PT0gMCA/IFwiZGVmYXVsdFwiIDogdW5kZWZpbmVkKSk7XG4gIGxldCBpbmRleCA9IGNsYW1wSW5kZXgoaW5pdGlhbEluZGV4ID09IG51bGwgPyBlbnRyaWVzLmxlbmd0aCAtIDEgOiBpbml0aWFsSW5kZXgpO1xuICBsZXQgYWN0aW9uID0gQWN0aW9uLlBvcDtcbiAgbGV0IGxpc3RlbmVyID0gbnVsbDtcbiAgZnVuY3Rpb24gY2xhbXBJbmRleChuKSB7XG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG4sIDApLCBlbnRyaWVzLmxlbmd0aCAtIDEpO1xuICB9XG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRMb2NhdGlvbigpIHtcbiAgICByZXR1cm4gZW50cmllc1tpbmRleF07XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlTWVtb3J5TG9jYXRpb24odG8sIHN0YXRlLCBrZXkpIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSBudWxsO1xuICAgIH1cbiAgICBsZXQgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihlbnRyaWVzID8gZ2V0Q3VycmVudExvY2F0aW9uKCkucGF0aG5hbWUgOiBcIi9cIiwgdG8sIHN0YXRlLCBrZXkpO1xuICAgIHdhcm5pbmcobG9jYXRpb24ucGF0aG5hbWUuY2hhckF0KDApID09PSBcIi9cIiwgXCJyZWxhdGl2ZSBwYXRobmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gbWVtb3J5IGhpc3Rvcnk6IFwiICsgSlNPTi5zdHJpbmdpZnkodG8pKTtcbiAgICByZXR1cm4gbG9jYXRpb247XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlSHJlZih0bykge1xuICAgIHJldHVybiB0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIgPyB0byA6IGNyZWF0ZVBhdGgodG8pO1xuICB9XG4gIGxldCBoaXN0b3J5ID0ge1xuICAgIGdldCBpbmRleCgpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9LFxuICAgIGdldCBhY3Rpb24oKSB7XG4gICAgICByZXR1cm4gYWN0aW9uO1xuICAgIH0sXG4gICAgZ2V0IGxvY2F0aW9uKCkge1xuICAgICAgcmV0dXJuIGdldEN1cnJlbnRMb2NhdGlvbigpO1xuICAgIH0sXG4gICAgY3JlYXRlSHJlZixcbiAgICBjcmVhdGVVUkwodG8pIHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGNyZWF0ZUhyZWYodG8pLCBcImh0dHA6Ly9sb2NhbGhvc3RcIik7XG4gICAgfSxcbiAgICBlbmNvZGVMb2NhdGlvbih0bykge1xuICAgICAgbGV0IHBhdGggPSB0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIgPyBwYXJzZVBhdGgodG8pIDogdG87XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRobmFtZTogcGF0aC5wYXRobmFtZSB8fCBcIlwiLFxuICAgICAgICBzZWFyY2g6IHBhdGguc2VhcmNoIHx8IFwiXCIsXG4gICAgICAgIGhhc2g6IHBhdGguaGFzaCB8fCBcIlwiXG4gICAgICB9O1xuICAgIH0sXG4gICAgcHVzaCh0bywgc3RhdGUpIHtcbiAgICAgIGFjdGlvbiA9IEFjdGlvbi5QdXNoO1xuICAgICAgbGV0IG5leHRMb2NhdGlvbiA9IGNyZWF0ZU1lbW9yeUxvY2F0aW9uKHRvLCBzdGF0ZSk7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIGVudHJpZXMubGVuZ3RoLCBuZXh0TG9jYXRpb24pO1xuICAgICAgaWYgKHY1Q29tcGF0ICYmIGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVyKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgbG9jYXRpb246IG5leHRMb2NhdGlvbixcbiAgICAgICAgICBkZWx0YTogMVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlcGxhY2UodG8sIHN0YXRlKSB7XG4gICAgICBhY3Rpb24gPSBBY3Rpb24uUmVwbGFjZTtcbiAgICAgIGxldCBuZXh0TG9jYXRpb24gPSBjcmVhdGVNZW1vcnlMb2NhdGlvbih0bywgc3RhdGUpO1xuICAgICAgZW50cmllc1tpbmRleF0gPSBuZXh0TG9jYXRpb247XG4gICAgICBpZiAodjVDb21wYXQgJiYgbGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXIoe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBsb2NhdGlvbjogbmV4dExvY2F0aW9uLFxuICAgICAgICAgIGRlbHRhOiAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ28oZGVsdGEpIHtcbiAgICAgIGFjdGlvbiA9IEFjdGlvbi5Qb3A7XG4gICAgICBsZXQgbmV4dEluZGV4ID0gY2xhbXBJbmRleChpbmRleCArIGRlbHRhKTtcbiAgICAgIGxldCBuZXh0TG9jYXRpb24gPSBlbnRyaWVzW25leHRJbmRleF07XG4gICAgICBpbmRleCA9IG5leHRJbmRleDtcbiAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGxvY2F0aW9uOiBuZXh0TG9jYXRpb24sXG4gICAgICAgICAgZGVsdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsaXN0ZW4oZm4pIHtcbiAgICAgIGxpc3RlbmVyID0gZm47XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBsaXN0ZW5lciA9IG51bGw7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhpc3Rvcnk7XG59XG4vKipcbiAqIEJyb3dzZXIgaGlzdG9yeSBzdG9yZXMgdGhlIGxvY2F0aW9uIGluIHJlZ3VsYXIgVVJMcy4gVGhpcyBpcyB0aGUgc3RhbmRhcmQgZm9yXG4gKiBtb3N0IHdlYiBhcHBzLCBidXQgaXQgcmVxdWlyZXMgc29tZSBjb25maWd1cmF0aW9uIG9uIHRoZSBzZXJ2ZXIgdG8gZW5zdXJlIHlvdVxuICogc2VydmUgdGhlIHNhbWUgYXBwIGF0IG11bHRpcGxlIFVSTHMuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVtaXgtcnVuL2hpc3RvcnkvdHJlZS9tYWluL2RvY3MvYXBpLXJlZmVyZW5jZS5tZCNjcmVhdGVicm93c2VyaGlzdG9yeVxuICovXG5mdW5jdGlvbiBjcmVhdGVCcm93c2VySGlzdG9yeShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlQnJvd3NlckxvY2F0aW9uKHdpbmRvdywgZ2xvYmFsSGlzdG9yeSkge1xuICAgIGxldCB7XG4gICAgICBwYXRobmFtZSxcbiAgICAgIHNlYXJjaCxcbiAgICAgIGhhc2hcbiAgICB9ID0gd2luZG93LmxvY2F0aW9uO1xuICAgIHJldHVybiBjcmVhdGVMb2NhdGlvbihcIlwiLCB7XG4gICAgICBwYXRobmFtZSxcbiAgICAgIHNlYXJjaCxcbiAgICAgIGhhc2hcbiAgICB9LFxuICAgIC8vIHN0YXRlIGRlZmF1bHRzIHRvIGBudWxsYCBiZWNhdXNlIGB3aW5kb3cuaGlzdG9yeS5zdGF0ZWAgZG9lc1xuICAgIGdsb2JhbEhpc3Rvcnkuc3RhdGUgJiYgZ2xvYmFsSGlzdG9yeS5zdGF0ZS51c3IgfHwgbnVsbCwgZ2xvYmFsSGlzdG9yeS5zdGF0ZSAmJiBnbG9iYWxIaXN0b3J5LnN0YXRlLmtleSB8fCBcImRlZmF1bHRcIik7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlQnJvd3NlckhyZWYod2luZG93LCB0bykge1xuICAgIHJldHVybiB0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIgPyB0byA6IGNyZWF0ZVBhdGgodG8pO1xuICB9XG4gIHJldHVybiBnZXRVcmxCYXNlZEhpc3RvcnkoY3JlYXRlQnJvd3NlckxvY2F0aW9uLCBjcmVhdGVCcm93c2VySHJlZiwgbnVsbCwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEhhc2ggaGlzdG9yeSBzdG9yZXMgdGhlIGxvY2F0aW9uIGluIHdpbmRvdy5sb2NhdGlvbi5oYXNoLiBUaGlzIG1ha2VzIGl0IGlkZWFsXG4gKiBmb3Igc2l0dWF0aW9ucyB3aGVyZSB5b3UgZG9uJ3Qgd2FudCB0byBzZW5kIHRoZSBsb2NhdGlvbiB0byB0aGUgc2VydmVyIGZvclxuICogc29tZSByZWFzb24sIGVpdGhlciBiZWNhdXNlIHlvdSBkbyBjYW5ub3QgY29uZmlndXJlIGl0IG9yIHRoZSBVUkwgc3BhY2UgaXNcbiAqIHJlc2VydmVkIGZvciBzb21ldGhpbmcgZWxzZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZW1peC1ydW4vaGlzdG9yeS90cmVlL21haW4vZG9jcy9hcGktcmVmZXJlbmNlLm1kI2NyZWF0ZWhhc2hoaXN0b3J5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUhhc2hIaXN0b3J5KG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVIYXNoTG9jYXRpb24od2luZG93LCBnbG9iYWxIaXN0b3J5KSB7XG4gICAgbGV0IHtcbiAgICAgIHBhdGhuYW1lID0gXCIvXCIsXG4gICAgICBzZWFyY2ggPSBcIlwiLFxuICAgICAgaGFzaCA9IFwiXCJcbiAgICB9ID0gcGFyc2VQYXRoKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cigxKSk7XG4gICAgLy8gSGFzaCBVUkwgc2hvdWxkIGFsd2F5cyBoYXZlIGEgbGVhZGluZyAvIGp1c3QgbGlrZSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWVcbiAgICAvLyBkb2VzLCBzbyBpZiBhbiBhcHAgZW5kcyB1cCBhdCBhIHJvdXRlIGxpa2UgLyNzb21ldGhpbmcgdGhlbiB3ZSBhZGQgYVxuICAgIC8vIGxlYWRpbmcgc2xhc2ggc28gYWxsIG9mIG91ciBwYXRoLW1hdGNoaW5nIGJlaGF2ZXMgdGhlIHNhbWUgYXMgaWYgaXQgd291bGRcbiAgICAvLyBpbiBhIGJyb3dzZXIgcm91dGVyLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHdoZW4gdGhlcmUgZXhpc3RzIGFcbiAgICAvLyByb290IHNwbGF0IHJvdXRlICg8Um91dGUgcGF0aD1cIipcIj4pIHNpbmNlIHRoYXQgbWF0Y2hlcyBpbnRlcm5hbGx5IGFnYWluc3RcbiAgICAvLyBcIi8qXCIgYW5kIHdlJ2QgZXhwZWN0IC8jc29tZXRoaW5nIHRvIDQwNCBpbiBhIGhhc2ggcm91dGVyIGFwcC5cbiAgICBpZiAoIXBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvXCIpICYmICFwYXRobmFtZS5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgcGF0aG5hbWUgPSBcIi9cIiArIHBhdGhuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTG9jYXRpb24oXCJcIiwge1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBzZWFyY2gsXG4gICAgICBoYXNoXG4gICAgfSxcbiAgICAvLyBzdGF0ZSBkZWZhdWx0cyB0byBgbnVsbGAgYmVjYXVzZSBgd2luZG93Lmhpc3Rvcnkuc3RhdGVgIGRvZXNcbiAgICBnbG9iYWxIaXN0b3J5LnN0YXRlICYmIGdsb2JhbEhpc3Rvcnkuc3RhdGUudXNyIHx8IG51bGwsIGdsb2JhbEhpc3Rvcnkuc3RhdGUgJiYgZ2xvYmFsSGlzdG9yeS5zdGF0ZS5rZXkgfHwgXCJkZWZhdWx0XCIpO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUhhc2hIcmVmKHdpbmRvdywgdG8pIHtcbiAgICBsZXQgYmFzZSA9IHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiYmFzZVwiKTtcbiAgICBsZXQgaHJlZiA9IFwiXCI7XG4gICAgaWYgKGJhc2UgJiYgYmFzZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICBsZXQgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBsZXQgaGFzaEluZGV4ID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuICAgICAgaHJlZiA9IGhhc2hJbmRleCA9PT0gLTEgPyB1cmwgOiB1cmwuc2xpY2UoMCwgaGFzaEluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGhyZWYgKyBcIiNcIiArICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIgPyB0byA6IGNyZWF0ZVBhdGgodG8pKTtcbiAgfVxuICBmdW5jdGlvbiB2YWxpZGF0ZUhhc2hMb2NhdGlvbihsb2NhdGlvbiwgdG8pIHtcbiAgICB3YXJuaW5nKGxvY2F0aW9uLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gXCIvXCIsIFwicmVsYXRpdmUgcGF0aG5hbWVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGhhc2ggaGlzdG9yeS5wdXNoKFwiICsgSlNPTi5zdHJpbmdpZnkodG8pICsgXCIpXCIpO1xuICB9XG4gIHJldHVybiBnZXRVcmxCYXNlZEhpc3RvcnkoY3JlYXRlSGFzaExvY2F0aW9uLCBjcmVhdGVIYXNoSHJlZiwgdmFsaWRhdGVIYXNoTG9jYXRpb24sIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gaW52YXJpYW50KHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuaW5nKGNvbmQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIpIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICB0cnkge1xuICAgICAgLy8gV2VsY29tZSB0byBkZWJ1Z2dpbmcgaGlzdG9yeSFcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGVycm9yIGlzIHRocm93biBhcyBhIGNvbnZlbmllbmNlLCBzbyB5b3UgY2FuIG1vcmUgZWFzaWx5XG4gICAgICAvLyBmaW5kIHRoZSBzb3VyY2UgZm9yIGEgd2FybmluZyB0aGF0IGFwcGVhcnMgaW4gdGhlIGNvbnNvbGUgYnlcbiAgICAgIC8vIGVuYWJsaW5nIFwicGF1c2Ugb24gZXhjZXB0aW9uc1wiIGluIHlvdXIgSmF2YVNjcmlwdCBkZWJ1Z2dlci5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUtleSgpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA4KTtcbn1cbi8qKlxuICogRm9yIGJyb3dzZXItYmFzZWQgaGlzdG9yaWVzLCB3ZSBjb21iaW5lIHRoZSBzdGF0ZSBhbmQga2V5IGludG8gYW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGdldEhpc3RvcnlTdGF0ZShsb2NhdGlvbiwgaW5kZXgpIHtcbiAgcmV0dXJuIHtcbiAgICB1c3I6IGxvY2F0aW9uLnN0YXRlLFxuICAgIGtleTogbG9jYXRpb24ua2V5LFxuICAgIGlkeDogaW5kZXhcbiAgfTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIExvY2F0aW9uIG9iamVjdCB3aXRoIGEgdW5pcXVlIGtleSBmcm9tIHRoZSBnaXZlbiBQYXRoXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxvY2F0aW9uKGN1cnJlbnQsIHRvLCBzdGF0ZSwga2V5KSB7XG4gIGlmIChzdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgc3RhdGUgPSBudWxsO1xuICB9XG4gIGxldCBsb2NhdGlvbiA9IF9leHRlbmRzKHtcbiAgICBwYXRobmFtZTogdHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIgPyBjdXJyZW50IDogY3VycmVudC5wYXRobmFtZSxcbiAgICBzZWFyY2g6IFwiXCIsXG4gICAgaGFzaDogXCJcIlxuICB9LCB0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIgPyBwYXJzZVBhdGgodG8pIDogdG8sIHtcbiAgICBzdGF0ZSxcbiAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIGJlIGNsZWFuZWQgdXAuICBwdXNoL3JlcGxhY2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgdGFrZVxuICAgIC8vIGZ1bGwgTG9jYXRpb25zIG5vdyBhbmQgYXZvaWQgdGhlIG5lZWQgdG8gcnVuIHRocm91Z2ggdGhpcyBmbG93IGF0IGFsbFxuICAgIC8vIEJ1dCB0aGF0J3MgYSBwcmV0dHkgYmlnIHJlZmFjdG9yIHRvIHRoZSBjdXJyZW50IHRlc3Qgc3VpdGUgc28gZ29pbmcgdG9cbiAgICAvLyBrZWVwIGFzIGlzIGZvciB0aGUgdGltZSBiZWluZyBhbmQganVzdCBsZXQgYW55IGluY29taW5nIGtleXMgdGFrZSBwcmVjZWRlbmNlXG4gICAga2V5OiB0byAmJiB0by5rZXkgfHwga2V5IHx8IGNyZWF0ZUtleSgpXG4gIH0pO1xuICByZXR1cm4gbG9jYXRpb247XG59XG4vKipcbiAqIENyZWF0ZXMgYSBzdHJpbmcgVVJMIHBhdGggZnJvbSB0aGUgZ2l2ZW4gcGF0aG5hbWUsIHNlYXJjaCwgYW5kIGhhc2ggY29tcG9uZW50cy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUGF0aChfcmVmKSB7XG4gIGxldCB7XG4gICAgcGF0aG5hbWUgPSBcIi9cIixcbiAgICBzZWFyY2ggPSBcIlwiLFxuICAgIGhhc2ggPSBcIlwiXG4gIH0gPSBfcmVmO1xuICBpZiAoc2VhcmNoICYmIHNlYXJjaCAhPT0gXCI/XCIpIHBhdGhuYW1lICs9IHNlYXJjaC5jaGFyQXQoMCkgPT09IFwiP1wiID8gc2VhcmNoIDogXCI/XCIgKyBzZWFyY2g7XG4gIGlmIChoYXNoICYmIGhhc2ggIT09IFwiI1wiKSBwYXRobmFtZSArPSBoYXNoLmNoYXJBdCgwKSA9PT0gXCIjXCIgPyBoYXNoIDogXCIjXCIgKyBoYXNoO1xuICByZXR1cm4gcGF0aG5hbWU7XG59XG4vKipcbiAqIFBhcnNlcyBhIHN0cmluZyBVUkwgcGF0aCBpbnRvIGl0cyBzZXBhcmF0ZSBwYXRobmFtZSwgc2VhcmNoLCBhbmQgaGFzaCBjb21wb25lbnRzLlxuICovXG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aCkge1xuICBsZXQgcGFyc2VkUGF0aCA9IHt9O1xuICBpZiAocGF0aCkge1xuICAgIGxldCBoYXNoSW5kZXggPSBwYXRoLmluZGV4T2YoXCIjXCIpO1xuICAgIGlmIChoYXNoSW5kZXggPj0gMCkge1xuICAgICAgcGFyc2VkUGF0aC5oYXNoID0gcGF0aC5zdWJzdHIoaGFzaEluZGV4KTtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLCBoYXNoSW5kZXgpO1xuICAgIH1cbiAgICBsZXQgc2VhcmNoSW5kZXggPSBwYXRoLmluZGV4T2YoXCI/XCIpO1xuICAgIGlmIChzZWFyY2hJbmRleCA+PSAwKSB7XG4gICAgICBwYXJzZWRQYXRoLnNlYXJjaCA9IHBhdGguc3Vic3RyKHNlYXJjaEluZGV4KTtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLCBzZWFyY2hJbmRleCk7XG4gICAgfVxuICAgIGlmIChwYXRoKSB7XG4gICAgICBwYXJzZWRQYXRoLnBhdGhuYW1lID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcnNlZFBhdGg7XG59XG5mdW5jdGlvbiBnZXRVcmxCYXNlZEhpc3RvcnkoZ2V0TG9jYXRpb24sIGNyZWF0ZUhyZWYsIHZhbGlkYXRlTG9jYXRpb24sIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBsZXQge1xuICAgIHdpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LFxuICAgIHY1Q29tcGF0ID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGxldCBnbG9iYWxIaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XG4gIGxldCBhY3Rpb24gPSBBY3Rpb24uUG9wO1xuICBsZXQgbGlzdGVuZXIgPSBudWxsO1xuICBsZXQgaW5kZXggPSBnZXRJbmRleCgpO1xuICAvLyBJbmRleCBzaG91bGQgb25seSBiZSBudWxsIHdoZW4gd2UgaW5pdGlhbGl6ZS4gSWYgbm90LCBpdCdzIGJlY2F1c2UgdGhlXG4gIC8vIHVzZXIgY2FsbGVkIGhpc3RvcnkucHVzaFN0YXRlIG9yIGhpc3RvcnkucmVwbGFjZVN0YXRlIGRpcmVjdGx5LCBpbiB3aGljaFxuICAvLyBjYXNlIHdlIHNob3VsZCBsb2cgYSB3YXJuaW5nIGFzIGl0IHdpbGwgcmVzdWx0IGluIGJ1Z3MuXG4gIGlmIChpbmRleCA9PSBudWxsKSB7XG4gICAgaW5kZXggPSAwO1xuICAgIGdsb2JhbEhpc3RvcnkucmVwbGFjZVN0YXRlKF9leHRlbmRzKHt9LCBnbG9iYWxIaXN0b3J5LnN0YXRlLCB7XG4gICAgICBpZHg6IGluZGV4XG4gICAgfSksIFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGdldEluZGV4KCkge1xuICAgIGxldCBzdGF0ZSA9IGdsb2JhbEhpc3Rvcnkuc3RhdGUgfHwge1xuICAgICAgaWR4OiBudWxsXG4gICAgfTtcbiAgICByZXR1cm4gc3RhdGUuaWR4O1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZVBvcCgpIHtcbiAgICBhY3Rpb24gPSBBY3Rpb24uUG9wO1xuICAgIGxldCBuZXh0SW5kZXggPSBnZXRJbmRleCgpO1xuICAgIGxldCBkZWx0YSA9IG5leHRJbmRleCA9PSBudWxsID8gbnVsbCA6IG5leHRJbmRleCAtIGluZGV4O1xuICAgIGluZGV4ID0gbmV4dEluZGV4O1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgbGlzdGVuZXIoe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgICAgICBkZWx0YVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHB1c2godG8sIHN0YXRlKSB7XG4gICAgYWN0aW9uID0gQWN0aW9uLlB1c2g7XG4gICAgbGV0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHN0YXRlKTtcbiAgICBpZiAodmFsaWRhdGVMb2NhdGlvbikgdmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbiwgdG8pO1xuICAgIGluZGV4ID0gZ2V0SW5kZXgoKSArIDE7XG4gICAgbGV0IGhpc3RvcnlTdGF0ZSA9IGdldEhpc3RvcnlTdGF0ZShsb2NhdGlvbiwgaW5kZXgpO1xuICAgIGxldCB1cmwgPSBoaXN0b3J5LmNyZWF0ZUhyZWYobG9jYXRpb24pO1xuICAgIC8vIHRyeS4uLmNhdGNoIGJlY2F1c2UgaU9TIGxpbWl0cyB1cyB0byAxMDAgcHVzaFN0YXRlIGNhbGxzIDovXG4gICAgdHJ5IHtcbiAgICAgIGdsb2JhbEhpc3RvcnkucHVzaFN0YXRlKGhpc3RvcnlTdGF0ZSwgXCJcIiwgdXJsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgdGhlIGV4Y2VwdGlvbiBpcyBiZWNhdXNlIGBzdGF0ZWAgY2FuJ3QgYmUgc2VyaWFsaXplZCwgbGV0IHRoYXQgdGhyb3dcbiAgICAgIC8vIG91dHdhcmRzIGp1c3QgbGlrZSBhIHJlcGxhY2UgY2FsbCB3b3VsZCBzbyB0aGUgZGV2IGtub3dzIHRoZSBjYXVzZVxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvbmF2LWhpc3RvcnktYXBpcy5odG1sI3NoYXJlZC1oaXN0b3J5LXB1c2gvcmVwbGFjZS1zdGF0ZS1zdGVwc1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3RydWN0dXJlZC1kYXRhLmh0bWwjc3RydWN0dXJlZHNlcmlhbGl6ZWludGVybmFsXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgZXJyb3IubmFtZSA9PT0gXCJEYXRhQ2xvbmVFcnJvclwiKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgLy8gVGhleSBhcmUgZ29pbmcgdG8gbG9zZSBzdGF0ZSBoZXJlLCBidXQgdGhlcmUgaXMgbm8gcmVhbFxuICAgICAgLy8gd2F5IHRvIHdhcm4gdGhlbSBhYm91dCBpdCBzaW5jZSB0aGUgcGFnZSB3aWxsIHJlZnJlc2guLi5cbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsKTtcbiAgICB9XG4gICAgaWYgKHY1Q29tcGF0ICYmIGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgICAgIGRlbHRhOiAxXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVwbGFjZSh0bywgc3RhdGUpIHtcbiAgICBhY3Rpb24gPSBBY3Rpb24uUmVwbGFjZTtcbiAgICBsZXQgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihoaXN0b3J5LmxvY2F0aW9uLCB0bywgc3RhdGUpO1xuICAgIGlmICh2YWxpZGF0ZUxvY2F0aW9uKSB2YWxpZGF0ZUxvY2F0aW9uKGxvY2F0aW9uLCB0byk7XG4gICAgaW5kZXggPSBnZXRJbmRleCgpO1xuICAgIGxldCBoaXN0b3J5U3RhdGUgPSBnZXRIaXN0b3J5U3RhdGUobG9jYXRpb24sIGluZGV4KTtcbiAgICBsZXQgdXJsID0gaGlzdG9yeS5jcmVhdGVIcmVmKGxvY2F0aW9uKTtcbiAgICBnbG9iYWxIaXN0b3J5LnJlcGxhY2VTdGF0ZShoaXN0b3J5U3RhdGUsIFwiXCIsIHVybCk7XG4gICAgaWYgKHY1Q29tcGF0ICYmIGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgICAgIGRlbHRhOiAwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlVVJMKHRvKSB7XG4gICAgLy8gd2luZG93LmxvY2F0aW9uLm9yaWdpbiBpcyBcIm51bGxcIiAodGhlIGxpdGVyYWwgc3RyaW5nIHZhbHVlKSBpbiBGaXJlZm94XG4gICAgLy8gdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCBub3RhYmx5IHdoZW4gc2VydmluZyBmcm9tIGEgbG9jYWwgSFRNTCBmaWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg3ODI5N1xuICAgIGxldCBiYXNlID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiAhPT0gXCJudWxsXCIgPyB3aW5kb3cubG9jYXRpb24ub3JpZ2luIDogd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgbGV0IGhyZWYgPSB0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIgPyB0byA6IGNyZWF0ZVBhdGgodG8pO1xuICAgIC8vIFRyZWF0aW5nIHRoaXMgYXMgYSBmdWxsIFVSTCB3aWxsIHN0cmlwIGFueSB0cmFpbGluZyBzcGFjZXMgc28gd2UgbmVlZCB0b1xuICAgIC8vIHByZS1lbmNvZGUgdGhlbSBzaW5jZSB0aGV5IG1pZ2h0IGJlIHBhcnQgb2YgYSBtYXRjaGluZyBzcGxhdCBwYXJhbSBmcm9tXG4gICAgLy8gYW4gYW5jZXN0b3Igcm91dGVcbiAgICBocmVmID0gaHJlZi5yZXBsYWNlKC8gJC8sIFwiJTIwXCIpO1xuICAgIGludmFyaWFudChiYXNlLCBcIk5vIHdpbmRvdy5sb2NhdGlvbi4ob3JpZ2lufGhyZWYpIGF2YWlsYWJsZSB0byBjcmVhdGUgVVJMIGZvciBocmVmOiBcIiArIGhyZWYpO1xuICAgIHJldHVybiBuZXcgVVJMKGhyZWYsIGJhc2UpO1xuICB9XG4gIGxldCBoaXN0b3J5ID0ge1xuICAgIGdldCBhY3Rpb24oKSB7XG4gICAgICByZXR1cm4gYWN0aW9uO1xuICAgIH0sXG4gICAgZ2V0IGxvY2F0aW9uKCkge1xuICAgICAgcmV0dXJuIGdldExvY2F0aW9uKHdpbmRvdywgZ2xvYmFsSGlzdG9yeSk7XG4gICAgfSxcbiAgICBsaXN0ZW4oZm4pIHtcbiAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGhpc3Rvcnkgb25seSBhY2NlcHRzIG9uZSBhY3RpdmUgbGlzdGVuZXJcIik7XG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihQb3BTdGF0ZUV2ZW50VHlwZSwgaGFuZGxlUG9wKTtcbiAgICAgIGxpc3RlbmVyID0gZm47XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihQb3BTdGF0ZUV2ZW50VHlwZSwgaGFuZGxlUG9wKTtcbiAgICAgICAgbGlzdGVuZXIgPSBudWxsO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGNyZWF0ZUhyZWYodG8pIHtcbiAgICAgIHJldHVybiBjcmVhdGVIcmVmKHdpbmRvdywgdG8pO1xuICAgIH0sXG4gICAgY3JlYXRlVVJMLFxuICAgIGVuY29kZUxvY2F0aW9uKHRvKSB7XG4gICAgICAvLyBFbmNvZGUgYSBMb2NhdGlvbiB0aGUgc2FtZSB3YXkgd2luZG93LmxvY2F0aW9uIHdvdWxkXG4gICAgICBsZXQgdXJsID0gY3JlYXRlVVJMKHRvKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogdXJsLnNlYXJjaCxcbiAgICAgICAgaGFzaDogdXJsLmhhc2hcbiAgICAgIH07XG4gICAgfSxcbiAgICBwdXNoLFxuICAgIHJlcGxhY2UsXG4gICAgZ28obikge1xuICAgICAgcmV0dXJuIGdsb2JhbEhpc3RvcnkuZ28obik7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGlzdG9yeTtcbn1cbi8vI2VuZHJlZ2lvblxuXG52YXIgUmVzdWx0VHlwZTtcbihmdW5jdGlvbiAoUmVzdWx0VHlwZSkge1xuICBSZXN1bHRUeXBlW1wiZGF0YVwiXSA9IFwiZGF0YVwiO1xuICBSZXN1bHRUeXBlW1wiZGVmZXJyZWRcIl0gPSBcImRlZmVycmVkXCI7XG4gIFJlc3VsdFR5cGVbXCJyZWRpcmVjdFwiXSA9IFwicmVkaXJlY3RcIjtcbiAgUmVzdWx0VHlwZVtcImVycm9yXCJdID0gXCJlcnJvclwiO1xufSkoUmVzdWx0VHlwZSB8fCAoUmVzdWx0VHlwZSA9IHt9KSk7XG5jb25zdCBpbW11dGFibGVSb3V0ZUtleXMgPSBuZXcgU2V0KFtcImxhenlcIiwgXCJjYXNlU2Vuc2l0aXZlXCIsIFwicGF0aFwiLCBcImlkXCIsIFwiaW5kZXhcIiwgXCJjaGlsZHJlblwiXSk7XG5mdW5jdGlvbiBpc0luZGV4Um91dGUocm91dGUpIHtcbiAgcmV0dXJuIHJvdXRlLmluZGV4ID09PSB0cnVlO1xufVxuLy8gV2FsayB0aGUgcm91dGUgdHJlZSBnZW5lcmF0aW5nIHVuaXF1ZSBJRHMgd2hlcmUgbmVjZXNzYXJ5LCBzbyB3ZSBhcmUgd29ya2luZ1xuLy8gc29sZWx5IHdpdGggQWdub3N0aWNEYXRhUm91dGVPYmplY3QncyB3aXRoaW4gdGhlIFJvdXRlclxuZnVuY3Rpb24gY29udmVydFJvdXRlc1RvRGF0YVJvdXRlcyhyb3V0ZXMsIG1hcFJvdXRlUHJvcGVydGllcywgcGFyZW50UGF0aCwgbWFuaWZlc3QpIHtcbiAgaWYgKHBhcmVudFBhdGggPT09IHZvaWQgMCkge1xuICAgIHBhcmVudFBhdGggPSBbXTtcbiAgfVxuICBpZiAobWFuaWZlc3QgPT09IHZvaWQgMCkge1xuICAgIG1hbmlmZXN0ID0ge307XG4gIH1cbiAgcmV0dXJuIHJvdXRlcy5tYXAoKHJvdXRlLCBpbmRleCkgPT4ge1xuICAgIGxldCB0cmVlUGF0aCA9IFsuLi5wYXJlbnRQYXRoLCBTdHJpbmcoaW5kZXgpXTtcbiAgICBsZXQgaWQgPSB0eXBlb2Ygcm91dGUuaWQgPT09IFwic3RyaW5nXCIgPyByb3V0ZS5pZCA6IHRyZWVQYXRoLmpvaW4oXCItXCIpO1xuICAgIGludmFyaWFudChyb3V0ZS5pbmRleCAhPT0gdHJ1ZSB8fCAhcm91dGUuY2hpbGRyZW4sIFwiQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGVcIik7XG4gICAgaW52YXJpYW50KCFtYW5pZmVzdFtpZF0sIFwiRm91bmQgYSByb3V0ZSBpZCBjb2xsaXNpb24gb24gaWQgXFxcIlwiICsgaWQgKyBcIlxcXCIuICBSb3V0ZSBcIiArIFwiaWQncyBtdXN0IGJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gRGF0YSBSb3V0ZXIgdXNhZ2VzXCIpO1xuICAgIGlmIChpc0luZGV4Um91dGUocm91dGUpKSB7XG4gICAgICBsZXQgaW5kZXhSb3V0ZSA9IF9leHRlbmRzKHt9LCByb3V0ZSwgbWFwUm91dGVQcm9wZXJ0aWVzKHJvdXRlKSwge1xuICAgICAgICBpZFxuICAgICAgfSk7XG4gICAgICBtYW5pZmVzdFtpZF0gPSBpbmRleFJvdXRlO1xuICAgICAgcmV0dXJuIGluZGV4Um91dGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwYXRoT3JMYXlvdXRSb3V0ZSA9IF9leHRlbmRzKHt9LCByb3V0ZSwgbWFwUm91dGVQcm9wZXJ0aWVzKHJvdXRlKSwge1xuICAgICAgICBpZCxcbiAgICAgICAgY2hpbGRyZW46IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICBtYW5pZmVzdFtpZF0gPSBwYXRoT3JMYXlvdXRSb3V0ZTtcbiAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICBwYXRoT3JMYXlvdXRSb3V0ZS5jaGlsZHJlbiA9IGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMocm91dGUuY2hpbGRyZW4sIG1hcFJvdXRlUHJvcGVydGllcywgdHJlZVBhdGgsIG1hbmlmZXN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoT3JMYXlvdXRSb3V0ZTtcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBNYXRjaGVzIHRoZSBnaXZlbiByb3V0ZXMgdG8gYSBsb2NhdGlvbiBhbmQgcmV0dXJucyB0aGUgbWF0Y2ggZGF0YS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3V0aWxzL21hdGNoLXJvdXRlc1xuICovXG5mdW5jdGlvbiBtYXRjaFJvdXRlcyhyb3V0ZXMsIGxvY2F0aW9uQXJnLCBiYXNlbmFtZSkge1xuICBpZiAoYmFzZW5hbWUgPT09IHZvaWQgMCkge1xuICAgIGJhc2VuYW1lID0gXCIvXCI7XG4gIH1cbiAgcmV0dXJuIG1hdGNoUm91dGVzSW1wbChyb3V0ZXMsIGxvY2F0aW9uQXJnLCBiYXNlbmFtZSwgZmFsc2UpO1xufVxuZnVuY3Rpb24gbWF0Y2hSb3V0ZXNJbXBsKHJvdXRlcywgbG9jYXRpb25BcmcsIGJhc2VuYW1lLCBhbGxvd1BhcnRpYWwpIHtcbiAgbGV0IGxvY2F0aW9uID0gdHlwZW9mIGxvY2F0aW9uQXJnID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKGxvY2F0aW9uQXJnKSA6IGxvY2F0aW9uQXJnO1xuICBsZXQgcGF0aG5hbWUgPSBzdHJpcEJhc2VuYW1lKGxvY2F0aW9uLnBhdGhuYW1lIHx8IFwiL1wiLCBiYXNlbmFtZSk7XG4gIGlmIChwYXRobmFtZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgbGV0IGJyYW5jaGVzID0gZmxhdHRlblJvdXRlcyhyb3V0ZXMpO1xuICByYW5rUm91dGVCcmFuY2hlcyhicmFuY2hlcyk7XG4gIGxldCBtYXRjaGVzID0gbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IG1hdGNoZXMgPT0gbnVsbCAmJiBpIDwgYnJhbmNoZXMubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBJbmNvbWluZyBwYXRobmFtZXMgYXJlIGdlbmVyYWxseSBlbmNvZGVkIGZyb20gZWl0aGVyIHdpbmRvdy5sb2NhdGlvblxuICAgIC8vIG9yIGZyb20gcm91dGVyLm5hdmlnYXRlLCBidXQgd2Ugd2FudCB0byBtYXRjaCBhZ2FpbnN0IHRoZSB1bmVuY29kZWRcbiAgICAvLyBwYXRocyBpbiB0aGUgcm91dGUgZGVmaW5pdGlvbnMuICBNZW1vcnkgcm91dGVyIGxvY2F0aW9ucyB3b24ndCBiZVxuICAgIC8vIGVuY29kZWQgaGVyZSBidXQgdGhlcmUgYWxzbyBzaG91bGRuJ3QgYmUgYW55dGhpbmcgdG8gZGVjb2RlIHNvIHRoaXNcbiAgICAvLyBzaG91bGQgYmUgYSBzYWZlIG9wZXJhdGlvbi4gIFRoaXMgYXZvaWRzIG5lZWRpbmcgbWF0Y2hSb3V0ZXMgdG8gYmVcbiAgICAvLyBoaXN0b3J5LWF3YXJlLlxuICAgIGxldCBkZWNvZGVkID0gZGVjb2RlUGF0aChwYXRobmFtZSk7XG4gICAgbWF0Y2hlcyA9IG1hdGNoUm91dGVCcmFuY2goYnJhbmNoZXNbaV0sIGRlY29kZWQsIGFsbG93UGFydGlhbCk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXM7XG59XG5mdW5jdGlvbiBjb252ZXJ0Um91dGVNYXRjaFRvVWlNYXRjaChtYXRjaCwgbG9hZGVyRGF0YSkge1xuICBsZXQge1xuICAgIHJvdXRlLFxuICAgIHBhdGhuYW1lLFxuICAgIHBhcmFtc1xuICB9ID0gbWF0Y2g7XG4gIHJldHVybiB7XG4gICAgaWQ6IHJvdXRlLmlkLFxuICAgIHBhdGhuYW1lLFxuICAgIHBhcmFtcyxcbiAgICBkYXRhOiBsb2FkZXJEYXRhW3JvdXRlLmlkXSxcbiAgICBoYW5kbGU6IHJvdXRlLmhhbmRsZVxuICB9O1xufVxuZnVuY3Rpb24gZmxhdHRlblJvdXRlcyhyb3V0ZXMsIGJyYW5jaGVzLCBwYXJlbnRzTWV0YSwgcGFyZW50UGF0aCkge1xuICBpZiAoYnJhbmNoZXMgPT09IHZvaWQgMCkge1xuICAgIGJyYW5jaGVzID0gW107XG4gIH1cbiAgaWYgKHBhcmVudHNNZXRhID09PSB2b2lkIDApIHtcbiAgICBwYXJlbnRzTWV0YSA9IFtdO1xuICB9XG4gIGlmIChwYXJlbnRQYXRoID09PSB2b2lkIDApIHtcbiAgICBwYXJlbnRQYXRoID0gXCJcIjtcbiAgfVxuICBsZXQgZmxhdHRlblJvdXRlID0gKHJvdXRlLCBpbmRleCwgcmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgbGV0IG1ldGEgPSB7XG4gICAgICByZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCA9PT0gdW5kZWZpbmVkID8gcm91dGUucGF0aCB8fCBcIlwiIDogcmVsYXRpdmVQYXRoLFxuICAgICAgY2FzZVNlbnNpdGl2ZTogcm91dGUuY2FzZVNlbnNpdGl2ZSA9PT0gdHJ1ZSxcbiAgICAgIGNoaWxkcmVuSW5kZXg6IGluZGV4LFxuICAgICAgcm91dGVcbiAgICB9O1xuICAgIGlmIChtZXRhLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgaW52YXJpYW50KG1ldGEucmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgocGFyZW50UGF0aCksIFwiQWJzb2x1dGUgcm91dGUgcGF0aCBcXFwiXCIgKyBtZXRhLnJlbGF0aXZlUGF0aCArIFwiXFxcIiBuZXN0ZWQgdW5kZXIgcGF0aCBcIiArIChcIlxcXCJcIiArIHBhcmVudFBhdGggKyBcIlxcXCIgaXMgbm90IHZhbGlkLiBBbiBhYnNvbHV0ZSBjaGlsZCByb3V0ZSBwYXRoIFwiKSArIFwibXVzdCBzdGFydCB3aXRoIHRoZSBjb21iaW5lZCBwYXRoIG9mIGFsbCBpdHMgcGFyZW50IHJvdXRlcy5cIik7XG4gICAgICBtZXRhLnJlbGF0aXZlUGF0aCA9IG1ldGEucmVsYXRpdmVQYXRoLnNsaWNlKHBhcmVudFBhdGgubGVuZ3RoKTtcbiAgICB9XG4gICAgbGV0IHBhdGggPSBqb2luUGF0aHMoW3BhcmVudFBhdGgsIG1ldGEucmVsYXRpdmVQYXRoXSk7XG4gICAgbGV0IHJvdXRlc01ldGEgPSBwYXJlbnRzTWV0YS5jb25jYXQobWV0YSk7XG4gICAgLy8gQWRkIHRoZSBjaGlsZHJlbiBiZWZvcmUgYWRkaW5nIHRoaXMgcm91dGUgdG8gdGhlIGFycmF5LCBzbyB3ZSB0cmF2ZXJzZSB0aGVcbiAgICAvLyByb3V0ZSB0cmVlIGRlcHRoLWZpcnN0IGFuZCBjaGlsZCByb3V0ZXMgYXBwZWFyIGJlZm9yZSB0aGVpciBwYXJlbnRzIGluXG4gICAgLy8gdGhlIFwiZmxhdHRlbmVkXCIgdmVyc2lvbi5cbiAgICBpZiAocm91dGUuY2hpbGRyZW4gJiYgcm91dGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgaW52YXJpYW50KFxuICAgICAgLy8gT3VyIHR5cGVzIGtub3cgYmV0dGVyLCBidXQgcnVudGltZSBKUyBtYXkgbm90IVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgcm91dGUuaW5kZXggIT09IHRydWUsIFwiSW5kZXggcm91dGVzIG11c3Qgbm90IGhhdmUgY2hpbGQgcm91dGVzLiBQbGVhc2UgcmVtb3ZlIFwiICsgKFwiYWxsIGNoaWxkIHJvdXRlcyBmcm9tIHJvdXRlIHBhdGggXFxcIlwiICsgcGF0aCArIFwiXFxcIi5cIikpO1xuICAgICAgZmxhdHRlblJvdXRlcyhyb3V0ZS5jaGlsZHJlbiwgYnJhbmNoZXMsIHJvdXRlc01ldGEsIHBhdGgpO1xuICAgIH1cbiAgICAvLyBSb3V0ZXMgd2l0aG91dCBhIHBhdGggc2hvdWxkbid0IGV2ZXIgbWF0Y2ggYnkgdGhlbXNlbHZlcyB1bmxlc3MgdGhleSBhcmVcbiAgICAvLyBpbmRleCByb3V0ZXMsIHNvIGRvbid0IGFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGJyYW5jaGVzLlxuICAgIGlmIChyb3V0ZS5wYXRoID09IG51bGwgJiYgIXJvdXRlLmluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGJyYW5jaGVzLnB1c2goe1xuICAgICAgcGF0aCxcbiAgICAgIHNjb3JlOiBjb21wdXRlU2NvcmUocGF0aCwgcm91dGUuaW5kZXgpLFxuICAgICAgcm91dGVzTWV0YVxuICAgIH0pO1xuICB9O1xuICByb3V0ZXMuZm9yRWFjaCgocm91dGUsIGluZGV4KSA9PiB7XG4gICAgdmFyIF9yb3V0ZSRwYXRoO1xuICAgIC8vIGNvYXJzZS1ncmFpbiBjaGVjayBmb3Igb3B0aW9uYWwgcGFyYW1zXG4gICAgaWYgKHJvdXRlLnBhdGggPT09IFwiXCIgfHwgISgoX3JvdXRlJHBhdGggPSByb3V0ZS5wYXRoKSAhPSBudWxsICYmIF9yb3V0ZSRwYXRoLmluY2x1ZGVzKFwiP1wiKSkpIHtcbiAgICAgIGZsYXR0ZW5Sb3V0ZShyb3V0ZSwgaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBleHBsb2RlZCBvZiBleHBsb2RlT3B0aW9uYWxTZWdtZW50cyhyb3V0ZS5wYXRoKSkge1xuICAgICAgICBmbGF0dGVuUm91dGUocm91dGUsIGluZGV4LCBleHBsb2RlZCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGJyYW5jaGVzO1xufVxuLyoqXG4gKiBDb21wdXRlcyBhbGwgY29tYmluYXRpb25zIG9mIG9wdGlvbmFsIHBhdGggc2VnbWVudHMgZm9yIGEgZ2l2ZW4gcGF0aCxcbiAqIGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgdGhhdCBhcmUgYW1iaWd1b3VzIGFuZCBvZiBsb3dlciBwcmlvcml0eS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgYC9vbmUvOnR3bz8vdGhyZWUvOmZvdXI/LzpmaXZlP2AgZXhwbG9kZXMgdG86XG4gKiAtIGAvb25lL3RocmVlYFxuICogLSBgL29uZS86dHdvL3RocmVlYFxuICogLSBgL29uZS90aHJlZS86Zm91cmBcbiAqIC0gYC9vbmUvdGhyZWUvOmZpdmVgXG4gKiAtIGAvb25lLzp0d28vdGhyZWUvOmZvdXJgXG4gKiAtIGAvb25lLzp0d28vdGhyZWUvOmZpdmVgXG4gKiAtIGAvb25lL3RocmVlLzpmb3VyLzpmaXZlYFxuICogLSBgL29uZS86dHdvL3RocmVlLzpmb3VyLzpmaXZlYFxuICovXG5mdW5jdGlvbiBleHBsb2RlT3B0aW9uYWxTZWdtZW50cyhwYXRoKSB7XG4gIGxldCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGxldCBbZmlyc3QsIC4uLnJlc3RdID0gc2VnbWVudHM7XG4gIC8vIE9wdGlvbmFsIHBhdGggc2VnbWVudHMgYXJlIGRlbm90ZWQgYnkgYSB0cmFpbGluZyBgP2BcbiAgbGV0IGlzT3B0aW9uYWwgPSBmaXJzdC5lbmRzV2l0aChcIj9cIik7XG4gIC8vIENvbXB1dGUgdGhlIGNvcnJlc3BvbmRpbmcgcmVxdWlyZWQgc2VnbWVudDogYGZvbz9gIC0+IGBmb29gXG4gIGxldCByZXF1aXJlZCA9IGZpcnN0LnJlcGxhY2UoL1xcPyQvLCBcIlwiKTtcbiAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gSW50ZXByZXQgZW1wdHkgc3RyaW5nIGFzIG9taXR0aW5nIGFuIG9wdGlvbmFsIHNlZ21lbnRcbiAgICAvLyBgW1wib25lXCIsIFwiXCIsIFwidGhyZWVcIl1gIGNvcnJlc3BvbmRzIHRvIG9taXR0aW5nIGA6dHdvYCBmcm9tIGAvb25lLzp0d28/L3RocmVlYCAtPiBgL29uZS90aHJlZWBcbiAgICByZXR1cm4gaXNPcHRpb25hbCA/IFtyZXF1aXJlZCwgXCJcIl0gOiBbcmVxdWlyZWRdO1xuICB9XG4gIGxldCByZXN0RXhwbG9kZWQgPSBleHBsb2RlT3B0aW9uYWxTZWdtZW50cyhyZXN0LmpvaW4oXCIvXCIpKTtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuICAvLyBBbGwgY2hpbGQgcGF0aHMgd2l0aCB0aGUgcHJlZml4LiAgRG8gdGhpcyBmb3IgYWxsIGNoaWxkcmVuIGJlZm9yZSB0aGVcbiAgLy8gb3B0aW9uYWwgdmVyc2lvbiBmb3IgYWxsIGNoaWxkcmVuLCBzbyB3ZSBnZXQgY29uc2lzdGVudCBvcmRlcmluZyB3aGVyZSB0aGVcbiAgLy8gcGFyZW50IG9wdGlvbmFsIGFzcGVjdCBpcyBwcmVmZXJyZWQgYXMgcmVxdWlyZWQuICBPdGhlcndpc2UsIHdlIGNhbiBnZXRcbiAgLy8gY2hpbGQgc2VjdGlvbnMgaW50ZXJzcGVyc2VkIHdoZXJlIGRlZXBlciBvcHRpb25hbCBzZWdtZW50cyBhcmUgaGlnaGVyIHRoYW5cbiAgLy8gcGFyZW50IG9wdGlvbmFsIHNlZ21lbnRzLCB3aGVyZSBmb3IgZXhhbXBsZSwgLzp0d28gd291bGQgZXhwbG9kZSBfZWFybGllcl9cbiAgLy8gdGhlbiAvOm9uZS4gIEJ5IGFsd2F5cyBpbmNsdWRpbmcgdGhlIHBhcmVudCBhcyByZXF1aXJlZCBfZm9yIGFsbCBjaGlsZHJlbl9cbiAgLy8gZmlyc3QsIHdlIGF2b2lkIHRoaXMgaXNzdWVcbiAgcmVzdWx0LnB1c2goLi4ucmVzdEV4cGxvZGVkLm1hcChzdWJwYXRoID0+IHN1YnBhdGggPT09IFwiXCIgPyByZXF1aXJlZCA6IFtyZXF1aXJlZCwgc3VicGF0aF0uam9pbihcIi9cIikpKTtcbiAgLy8gVGhlbiwgaWYgdGhpcyBpcyBhbiBvcHRpb25hbCB2YWx1ZSwgYWRkIGFsbCBjaGlsZCB2ZXJzaW9ucyB3aXRob3V0XG4gIGlmIChpc09wdGlvbmFsKSB7XG4gICAgcmVzdWx0LnB1c2goLi4ucmVzdEV4cGxvZGVkKTtcbiAgfVxuICAvLyBmb3IgYWJzb2x1dGUgcGF0aHMsIGVuc3VyZSBgL2AgaW5zdGVhZCBvZiBlbXB0eSBzZWdtZW50XG4gIHJldHVybiByZXN1bHQubWFwKGV4cGxvZGVkID0+IHBhdGguc3RhcnRzV2l0aChcIi9cIikgJiYgZXhwbG9kZWQgPT09IFwiXCIgPyBcIi9cIiA6IGV4cGxvZGVkKTtcbn1cbmZ1bmN0aW9uIHJhbmtSb3V0ZUJyYW5jaGVzKGJyYW5jaGVzKSB7XG4gIGJyYW5jaGVzLnNvcnQoKGEsIGIpID0+IGEuc2NvcmUgIT09IGIuc2NvcmUgPyBiLnNjb3JlIC0gYS5zY29yZSAvLyBIaWdoZXIgc2NvcmUgZmlyc3RcbiAgOiBjb21wYXJlSW5kZXhlcyhhLnJvdXRlc01ldGEubWFwKG1ldGEgPT4gbWV0YS5jaGlsZHJlbkluZGV4KSwgYi5yb3V0ZXNNZXRhLm1hcChtZXRhID0+IG1ldGEuY2hpbGRyZW5JbmRleCkpKTtcbn1cbmNvbnN0IHBhcmFtUmUgPSAvXjpbXFx3LV0rJC87XG5jb25zdCBkeW5hbWljU2VnbWVudFZhbHVlID0gMztcbmNvbnN0IGluZGV4Um91dGVWYWx1ZSA9IDI7XG5jb25zdCBlbXB0eVNlZ21lbnRWYWx1ZSA9IDE7XG5jb25zdCBzdGF0aWNTZWdtZW50VmFsdWUgPSAxMDtcbmNvbnN0IHNwbGF0UGVuYWx0eSA9IC0yO1xuY29uc3QgaXNTcGxhdCA9IHMgPT4gcyA9PT0gXCIqXCI7XG5mdW5jdGlvbiBjb21wdXRlU2NvcmUocGF0aCwgaW5kZXgpIHtcbiAgbGV0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gIGxldCBpbml0aWFsU2NvcmUgPSBzZWdtZW50cy5sZW5ndGg7XG4gIGlmIChzZWdtZW50cy5zb21lKGlzU3BsYXQpKSB7XG4gICAgaW5pdGlhbFNjb3JlICs9IHNwbGF0UGVuYWx0eTtcbiAgfVxuICBpZiAoaW5kZXgpIHtcbiAgICBpbml0aWFsU2NvcmUgKz0gaW5kZXhSb3V0ZVZhbHVlO1xuICB9XG4gIHJldHVybiBzZWdtZW50cy5maWx0ZXIocyA9PiAhaXNTcGxhdChzKSkucmVkdWNlKChzY29yZSwgc2VnbWVudCkgPT4gc2NvcmUgKyAocGFyYW1SZS50ZXN0KHNlZ21lbnQpID8gZHluYW1pY1NlZ21lbnRWYWx1ZSA6IHNlZ21lbnQgPT09IFwiXCIgPyBlbXB0eVNlZ21lbnRWYWx1ZSA6IHN0YXRpY1NlZ21lbnRWYWx1ZSksIGluaXRpYWxTY29yZSk7XG59XG5mdW5jdGlvbiBjb21wYXJlSW5kZXhlcyhhLCBiKSB7XG4gIGxldCBzaWJsaW5ncyA9IGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLnNsaWNlKDAsIC0xKS5ldmVyeSgobiwgaSkgPT4gbiA9PT0gYltpXSk7XG4gIHJldHVybiBzaWJsaW5ncyA/XG4gIC8vIElmIHR3byByb3V0ZXMgYXJlIHNpYmxpbmdzLCB3ZSBzaG91bGQgdHJ5IHRvIG1hdGNoIHRoZSBlYXJsaWVyIHNpYmxpbmdcbiAgLy8gZmlyc3QuIFRoaXMgYWxsb3dzIHBlb3BsZSB0byBoYXZlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIG1hdGNoaW5nXG4gIC8vIGJlaGF2aW9yIGJ5IHNpbXBseSBwdXR0aW5nIHJvdXRlcyB3aXRoIGlkZW50aWNhbCBwYXRocyBpbiB0aGUgb3JkZXIgdGhleVxuICAvLyB3YW50IHRoZW0gdHJpZWQuXG4gIGFbYS5sZW5ndGggLSAxXSAtIGJbYi5sZW5ndGggLSAxXSA6XG4gIC8vIE90aGVyd2lzZSwgaXQgZG9lc24ndCByZWFsbHkgbWFrZSBzZW5zZSB0byByYW5rIG5vbi1zaWJsaW5ncyBieSBpbmRleCxcbiAgLy8gc28gdGhleSBzb3J0IGVxdWFsbHkuXG4gIDA7XG59XG5mdW5jdGlvbiBtYXRjaFJvdXRlQnJhbmNoKGJyYW5jaCwgcGF0aG5hbWUsIGFsbG93UGFydGlhbCkge1xuICBpZiAoYWxsb3dQYXJ0aWFsID09PSB2b2lkIDApIHtcbiAgICBhbGxvd1BhcnRpYWwgPSBmYWxzZTtcbiAgfVxuICBsZXQge1xuICAgIHJvdXRlc01ldGFcbiAgfSA9IGJyYW5jaDtcbiAgbGV0IG1hdGNoZWRQYXJhbXMgPSB7fTtcbiAgbGV0IG1hdGNoZWRQYXRobmFtZSA9IFwiL1wiO1xuICBsZXQgbWF0Y2hlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlc01ldGEubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgbWV0YSA9IHJvdXRlc01ldGFbaV07XG4gICAgbGV0IGVuZCA9IGkgPT09IHJvdXRlc01ldGEubGVuZ3RoIC0gMTtcbiAgICBsZXQgcmVtYWluaW5nUGF0aG5hbWUgPSBtYXRjaGVkUGF0aG5hbWUgPT09IFwiL1wiID8gcGF0aG5hbWUgOiBwYXRobmFtZS5zbGljZShtYXRjaGVkUGF0aG5hbWUubGVuZ3RoKSB8fCBcIi9cIjtcbiAgICBsZXQgbWF0Y2ggPSBtYXRjaFBhdGgoe1xuICAgICAgcGF0aDogbWV0YS5yZWxhdGl2ZVBhdGgsXG4gICAgICBjYXNlU2Vuc2l0aXZlOiBtZXRhLmNhc2VTZW5zaXRpdmUsXG4gICAgICBlbmRcbiAgICB9LCByZW1haW5pbmdQYXRobmFtZSk7XG4gICAgbGV0IHJvdXRlID0gbWV0YS5yb3V0ZTtcbiAgICBpZiAoIW1hdGNoICYmIGVuZCAmJiBhbGxvd1BhcnRpYWwgJiYgIXJvdXRlc01ldGFbcm91dGVzTWV0YS5sZW5ndGggLSAxXS5yb3V0ZS5pbmRleCkge1xuICAgICAgbWF0Y2ggPSBtYXRjaFBhdGgoe1xuICAgICAgICBwYXRoOiBtZXRhLnJlbGF0aXZlUGF0aCxcbiAgICAgICAgY2FzZVNlbnNpdGl2ZTogbWV0YS5jYXNlU2Vuc2l0aXZlLFxuICAgICAgICBlbmQ6IGZhbHNlXG4gICAgICB9LCByZW1haW5pbmdQYXRobmFtZSk7XG4gICAgfVxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKG1hdGNoZWRQYXJhbXMsIG1hdGNoLnBhcmFtcyk7XG4gICAgbWF0Y2hlcy5wdXNoKHtcbiAgICAgIC8vIFRPRE86IENhbiB0aGlzIGFzIGJlIGF2b2lkZWQ/XG4gICAgICBwYXJhbXM6IG1hdGNoZWRQYXJhbXMsXG4gICAgICBwYXRobmFtZTogam9pblBhdGhzKFttYXRjaGVkUGF0aG5hbWUsIG1hdGNoLnBhdGhuYW1lXSksXG4gICAgICBwYXRobmFtZUJhc2U6IG5vcm1hbGl6ZVBhdGhuYW1lKGpvaW5QYXRocyhbbWF0Y2hlZFBhdGhuYW1lLCBtYXRjaC5wYXRobmFtZUJhc2VdKSksXG4gICAgICByb3V0ZVxuICAgIH0pO1xuICAgIGlmIChtYXRjaC5wYXRobmFtZUJhc2UgIT09IFwiL1wiKSB7XG4gICAgICBtYXRjaGVkUGF0aG5hbWUgPSBqb2luUGF0aHMoW21hdGNoZWRQYXRobmFtZSwgbWF0Y2gucGF0aG5hbWVCYXNlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcGF0aCB3aXRoIHBhcmFtcyBpbnRlcnBvbGF0ZWQuXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS91dGlscy9nZW5lcmF0ZS1wYXRoXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUGF0aChvcmlnaW5hbFBhdGgsIHBhcmFtcykge1xuICBpZiAocGFyYW1zID09PSB2b2lkIDApIHtcbiAgICBwYXJhbXMgPSB7fTtcbiAgfVxuICBsZXQgcGF0aCA9IG9yaWdpbmFsUGF0aDtcbiAgaWYgKHBhdGguZW5kc1dpdGgoXCIqXCIpICYmIHBhdGggIT09IFwiKlwiICYmICFwYXRoLmVuZHNXaXRoKFwiLypcIikpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCBcIlJvdXRlIHBhdGggXFxcIlwiICsgcGF0aCArIFwiXFxcIiB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBcIiArIChcIlxcXCJcIiArIHBhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIikgKyBcIlxcXCIgYmVjYXVzZSB0aGUgYCpgIGNoYXJhY3RlciBtdXN0IFwiKSArIFwiYWx3YXlzIGZvbGxvdyBhIGAvYCBpbiB0aGUgcGF0dGVybi4gVG8gZ2V0IHJpZCBvZiB0aGlzIHdhcm5pbmcsIFwiICsgKFwicGxlYXNlIGNoYW5nZSB0aGUgcm91dGUgcGF0aCB0byBcXFwiXCIgKyBwYXRoLnJlcGxhY2UoL1xcKiQvLCBcIi8qXCIpICsgXCJcXFwiLlwiKSk7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIik7XG4gIH1cbiAgLy8gZW5zdXJlIGAvYCBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlXG4gIGNvbnN0IHByZWZpeCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBcIi9cIiA6IFwiXCI7XG4gIGNvbnN0IHN0cmluZ2lmeSA9IHAgPT4gcCA9PSBudWxsID8gXCJcIiA6IHR5cGVvZiBwID09PSBcInN0cmluZ1wiID8gcCA6IFN0cmluZyhwKTtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KC9cXC8rLykubWFwKChzZWdtZW50LCBpbmRleCwgYXJyYXkpID0+IHtcbiAgICBjb25zdCBpc0xhc3RTZWdtZW50ID0gaW5kZXggPT09IGFycmF5Lmxlbmd0aCAtIDE7XG4gICAgLy8gb25seSBhcHBseSB0aGUgc3BsYXQgaWYgaXQncyB0aGUgbGFzdCBzZWdtZW50XG4gICAgaWYgKGlzTGFzdFNlZ21lbnQgJiYgc2VnbWVudCA9PT0gXCIqXCIpIHtcbiAgICAgIGNvbnN0IHN0YXIgPSBcIipcIjtcbiAgICAgIC8vIEFwcGx5IHRoZSBzcGxhdFxuICAgICAgcmV0dXJuIHN0cmluZ2lmeShwYXJhbXNbc3Rhcl0pO1xuICAgIH1cbiAgICBjb25zdCBrZXlNYXRjaCA9IHNlZ21lbnQubWF0Y2goL146KFtcXHctXSspKFxcPz8pJC8pO1xuICAgIGlmIChrZXlNYXRjaCkge1xuICAgICAgY29uc3QgWywga2V5LCBvcHRpb25hbF0gPSBrZXlNYXRjaDtcbiAgICAgIGxldCBwYXJhbSA9IHBhcmFtc1trZXldO1xuICAgICAgaW52YXJpYW50KG9wdGlvbmFsID09PSBcIj9cIiB8fCBwYXJhbSAhPSBudWxsLCBcIk1pc3NpbmcgXFxcIjpcIiArIGtleSArIFwiXFxcIiBwYXJhbVwiKTtcbiAgICAgIHJldHVybiBzdHJpbmdpZnkocGFyYW0pO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgYW55IG9wdGlvbmFsIG1hcmtlcnMgZnJvbSBvcHRpb25hbCBzdGF0aWMgc2VnbWVudHNcbiAgICByZXR1cm4gc2VnbWVudC5yZXBsYWNlKC9cXD8kL2csIFwiXCIpO1xuICB9KVxuICAvLyBSZW1vdmUgZW1wdHkgc2VnbWVudHNcbiAgLmZpbHRlcihzZWdtZW50ID0+ICEhc2VnbWVudCk7XG4gIHJldHVybiBwcmVmaXggKyBzZWdtZW50cy5qb2luKFwiL1wiKTtcbn1cbi8qKlxuICogUGVyZm9ybXMgcGF0dGVybiBtYXRjaGluZyBvbiBhIFVSTCBwYXRobmFtZSBhbmQgcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dFxuICogdGhlIG1hdGNoLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vdXRpbHMvbWF0Y2gtcGF0aFxuICovXG5mdW5jdGlvbiBtYXRjaFBhdGgocGF0dGVybiwgcGF0aG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSBcInN0cmluZ1wiKSB7XG4gICAgcGF0dGVybiA9IHtcbiAgICAgIHBhdGg6IHBhdHRlcm4sXG4gICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgIGVuZDogdHJ1ZVxuICAgIH07XG4gIH1cbiAgbGV0IFttYXRjaGVyLCBjb21waWxlZFBhcmFtc10gPSBjb21waWxlUGF0aChwYXR0ZXJuLnBhdGgsIHBhdHRlcm4uY2FzZVNlbnNpdGl2ZSwgcGF0dGVybi5lbmQpO1xuICBsZXQgbWF0Y2ggPSBwYXRobmFtZS5tYXRjaChtYXRjaGVyKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG4gIGxldCBtYXRjaGVkUGF0aG5hbWUgPSBtYXRjaFswXTtcbiAgbGV0IHBhdGhuYW1lQmFzZSA9IG1hdGNoZWRQYXRobmFtZS5yZXBsYWNlKC8oLilcXC8rJC8sIFwiJDFcIik7XG4gIGxldCBjYXB0dXJlR3JvdXBzID0gbWF0Y2guc2xpY2UoMSk7XG4gIGxldCBwYXJhbXMgPSBjb21waWxlZFBhcmFtcy5yZWR1Y2UoKG1lbW8sIF9yZWYsIGluZGV4KSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHBhcmFtTmFtZSxcbiAgICAgIGlzT3B0aW9uYWxcbiAgICB9ID0gX3JlZjtcbiAgICAvLyBXZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHBhdGhuYW1lQmFzZSBoZXJlIHVzaW5nIHRoZSByYXcgc3BsYXQgdmFsdWVcbiAgICAvLyBpbnN0ZWFkIG9mIHVzaW5nIHBhcmFtc1tcIipcIl0gbGF0ZXIgYmVjYXVzZSBpdCB3aWxsIGJlIGRlY29kZWQgdGhlblxuICAgIGlmIChwYXJhbU5hbWUgPT09IFwiKlwiKSB7XG4gICAgICBsZXQgc3BsYXRWYWx1ZSA9IGNhcHR1cmVHcm91cHNbaW5kZXhdIHx8IFwiXCI7XG4gICAgICBwYXRobmFtZUJhc2UgPSBtYXRjaGVkUGF0aG5hbWUuc2xpY2UoMCwgbWF0Y2hlZFBhdGhuYW1lLmxlbmd0aCAtIHNwbGF0VmFsdWUubGVuZ3RoKS5yZXBsYWNlKC8oLilcXC8rJC8sIFwiJDFcIik7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gY2FwdHVyZUdyb3Vwc1tpbmRleF07XG4gICAgaWYgKGlzT3B0aW9uYWwgJiYgIXZhbHVlKSB7XG4gICAgICBtZW1vW3BhcmFtTmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lbW9bcGFyYW1OYW1lXSA9ICh2YWx1ZSB8fCBcIlwiKS5yZXBsYWNlKC8lMkYvZywgXCIvXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbWVtbztcbiAgfSwge30pO1xuICByZXR1cm4ge1xuICAgIHBhcmFtcyxcbiAgICBwYXRobmFtZTogbWF0Y2hlZFBhdGhuYW1lLFxuICAgIHBhdGhuYW1lQmFzZSxcbiAgICBwYXR0ZXJuXG4gIH07XG59XG5mdW5jdGlvbiBjb21waWxlUGF0aChwYXRoLCBjYXNlU2Vuc2l0aXZlLCBlbmQpIHtcbiAgaWYgKGNhc2VTZW5zaXRpdmUgPT09IHZvaWQgMCkge1xuICAgIGNhc2VTZW5zaXRpdmUgPSBmYWxzZTtcbiAgfVxuICBpZiAoZW5kID09PSB2b2lkIDApIHtcbiAgICBlbmQgPSB0cnVlO1xuICB9XG4gIHdhcm5pbmcocGF0aCA9PT0gXCIqXCIgfHwgIXBhdGguZW5kc1dpdGgoXCIqXCIpIHx8IHBhdGguZW5kc1dpdGgoXCIvKlwiKSwgXCJSb3V0ZSBwYXRoIFxcXCJcIiArIHBhdGggKyBcIlxcXCIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgXCIgKyAoXCJcXFwiXCIgKyBwYXRoLnJlcGxhY2UoL1xcKiQvLCBcIi8qXCIpICsgXCJcXFwiIGJlY2F1c2UgdGhlIGAqYCBjaGFyYWN0ZXIgbXVzdCBcIikgKyBcImFsd2F5cyBmb2xsb3cgYSBgL2AgaW4gdGhlIHBhdHRlcm4uIFRvIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nLCBcIiArIChcInBsZWFzZSBjaGFuZ2UgdGhlIHJvdXRlIHBhdGggdG8gXFxcIlwiICsgcGF0aC5yZXBsYWNlKC9cXCokLywgXCIvKlwiKSArIFwiXFxcIi5cIikpO1xuICBsZXQgcGFyYW1zID0gW107XG4gIGxldCByZWdleHBTb3VyY2UgPSBcIl5cIiArIHBhdGgucmVwbGFjZSgvXFwvKlxcKj8kLywgXCJcIikgLy8gSWdub3JlIHRyYWlsaW5nIC8gYW5kIC8qLCB3ZSdsbCBoYW5kbGUgaXQgYmVsb3dcbiAgLnJlcGxhY2UoL15cXC8qLywgXCIvXCIpIC8vIE1ha2Ugc3VyZSBpdCBoYXMgYSBsZWFkaW5nIC9cbiAgLnJlcGxhY2UoL1tcXFxcLiorXiR7fXwoKVtcXF1dL2csIFwiXFxcXCQmXCIpIC8vIEVzY2FwZSBzcGVjaWFsIHJlZ2V4IGNoYXJzXG4gIC5yZXBsYWNlKC9cXC86KFtcXHctXSspKFxcPyk/L2csIChfLCBwYXJhbU5hbWUsIGlzT3B0aW9uYWwpID0+IHtcbiAgICBwYXJhbXMucHVzaCh7XG4gICAgICBwYXJhbU5hbWUsXG4gICAgICBpc09wdGlvbmFsOiBpc09wdGlvbmFsICE9IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gaXNPcHRpb25hbCA/IFwiLz8oW15cXFxcL10rKT9cIiA6IFwiLyhbXlxcXFwvXSspXCI7XG4gIH0pO1xuICBpZiAocGF0aC5lbmRzV2l0aChcIipcIikpIHtcbiAgICBwYXJhbXMucHVzaCh7XG4gICAgICBwYXJhbU5hbWU6IFwiKlwiXG4gICAgfSk7XG4gICAgcmVnZXhwU291cmNlICs9IHBhdGggPT09IFwiKlwiIHx8IHBhdGggPT09IFwiLypcIiA/IFwiKC4qKSRcIiAvLyBBbHJlYWR5IG1hdGNoZWQgdGhlIGluaXRpYWwgLywganVzdCBtYXRjaCB0aGUgcmVzdFxuICAgIDogXCIoPzpcXFxcLyguKyl8XFxcXC8qKSRcIjsgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgLyBpbiBwYXJhbXNbXCIqXCJdXG4gIH0gZWxzZSBpZiAoZW5kKSB7XG4gICAgLy8gV2hlbiBtYXRjaGluZyB0byB0aGUgZW5kLCBpZ25vcmUgdHJhaWxpbmcgc2xhc2hlc1xuICAgIHJlZ2V4cFNvdXJjZSArPSBcIlxcXFwvKiRcIjtcbiAgfSBlbHNlIGlmIChwYXRoICE9PSBcIlwiICYmIHBhdGggIT09IFwiL1wiKSB7XG4gICAgLy8gSWYgb3VyIHBhdGggaXMgbm9uLWVtcHR5IGFuZCBjb250YWlucyBhbnl0aGluZyBiZXlvbmQgYW4gaW5pdGlhbCBzbGFzaCxcbiAgICAvLyB0aGVuIHdlIGhhdmUgX3NvbWVfIGZvcm0gb2YgcGF0aCBpbiBvdXIgcmVnZXgsIHNvIHdlIHNob3VsZCBleHBlY3QgdG9cbiAgICAvLyBtYXRjaCBvbmx5IGlmIHdlIGZpbmQgdGhlIGVuZCBvZiB0aGlzIHBhdGggc2VnbWVudC4gIExvb2sgZm9yIGFuIG9wdGlvbmFsXG4gICAgLy8gbm9uLWNhcHR1cmVkIHRyYWlsaW5nIHNsYXNoICh0byBtYXRjaCBhIHBvcnRpb24gb2YgdGhlIFVSTCkgb3IgdGhlIGVuZFxuICAgIC8vIG9mIHRoZSBwYXRoIChpZiB3ZSd2ZSBtYXRjaGVkIHRvIHRoZSBlbmQpLiAgV2UgdXNlZCB0byBkbyB0aGlzIHdpdGggYVxuICAgIC8vIHdvcmQgYm91bmRhcnkgYnV0IHRoYXQgZ2l2ZXMgZmFsc2UgcG9zaXRpdmVzIG9uIHJvdXRlcyBsaWtlXG4gICAgLy8gL3VzZXItcHJlZmVyZW5jZXMgc2luY2UgYC1gIGNvdW50cyBhcyBhIHdvcmQgYm91bmRhcnkuXG4gICAgcmVnZXhwU291cmNlICs9IFwiKD86KD89XFxcXC98JCkpXCI7XG4gIH0gZWxzZSA7XG4gIGxldCBtYXRjaGVyID0gbmV3IFJlZ0V4cChyZWdleHBTb3VyY2UsIGNhc2VTZW5zaXRpdmUgPyB1bmRlZmluZWQgOiBcImlcIik7XG4gIHJldHVybiBbbWF0Y2hlciwgcGFyYW1zXTtcbn1cbmZ1bmN0aW9uIGRlY29kZVBhdGgodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoXCIvXCIpLm1hcCh2ID0+IGRlY29kZVVSSUNvbXBvbmVudCh2KS5yZXBsYWNlKC9cXC8vZywgXCIlMkZcIikpLmpvaW4oXCIvXCIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHdhcm5pbmcoZmFsc2UsIFwiVGhlIFVSTCBwYXRoIFxcXCJcIiArIHZhbHVlICsgXCJcXFwiIGNvdWxkIG5vdCBiZSBkZWNvZGVkIGJlY2F1c2UgaXQgaXMgaXMgYSBcIiArIFwibWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5IGR1ZSB0byBhIGJhZCBwZXJjZW50IFwiICsgKFwiZW5jb2RpbmcgKFwiICsgZXJyb3IgKyBcIikuXCIpKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc3RyaXBCYXNlbmFtZShwYXRobmFtZSwgYmFzZW5hbWUpIHtcbiAgaWYgKGJhc2VuYW1lID09PSBcIi9cIikgcmV0dXJuIHBhdGhuYW1lO1xuICBpZiAoIXBhdGhuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChiYXNlbmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFdlIHdhbnQgdG8gbGVhdmUgdHJhaWxpbmcgc2xhc2ggYmVoYXZpb3IgaW4gdGhlIHVzZXIncyBjb250cm9sLCBzbyBpZiB0aGV5XG4gIC8vIHNwZWNpZnkgYSBiYXNlbmFtZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2gsIHdlIHNob3VsZCBzdXBwb3J0IGl0XG4gIGxldCBzdGFydEluZGV4ID0gYmFzZW5hbWUuZW5kc1dpdGgoXCIvXCIpID8gYmFzZW5hbWUubGVuZ3RoIC0gMSA6IGJhc2VuYW1lLmxlbmd0aDtcbiAgbGV0IG5leHRDaGFyID0gcGF0aG5hbWUuY2hhckF0KHN0YXJ0SW5kZXgpO1xuICBpZiAobmV4dENoYXIgJiYgbmV4dENoYXIgIT09IFwiL1wiKSB7XG4gICAgLy8gcGF0aG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCBiYXNlbmFtZS9cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcGF0aG5hbWUuc2xpY2Uoc3RhcnRJbmRleCkgfHwgXCIvXCI7XG59XG4vKipcbiAqIFJldHVybnMgYSByZXNvbHZlZCBwYXRoIG9iamVjdCByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gcGF0aG5hbWUuXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS91dGlscy9yZXNvbHZlLXBhdGhcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVBhdGgodG8sIGZyb21QYXRobmFtZSkge1xuICBpZiAoZnJvbVBhdGhuYW1lID09PSB2b2lkIDApIHtcbiAgICBmcm9tUGF0aG5hbWUgPSBcIi9cIjtcbiAgfVxuICBsZXQge1xuICAgIHBhdGhuYW1lOiB0b1BhdGhuYW1lLFxuICAgIHNlYXJjaCA9IFwiXCIsXG4gICAgaGFzaCA9IFwiXCJcbiAgfSA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aCh0bykgOiB0bztcbiAgbGV0IHBhdGhuYW1lID0gdG9QYXRobmFtZSA/IHRvUGF0aG5hbWUuc3RhcnRzV2l0aChcIi9cIikgPyB0b1BhdGhuYW1lIDogcmVzb2x2ZVBhdGhuYW1lKHRvUGF0aG5hbWUsIGZyb21QYXRobmFtZSkgOiBmcm9tUGF0aG5hbWU7XG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWUsXG4gICAgc2VhcmNoOiBub3JtYWxpemVTZWFyY2goc2VhcmNoKSxcbiAgICBoYXNoOiBub3JtYWxpemVIYXNoKGhhc2gpXG4gIH07XG59XG5mdW5jdGlvbiByZXNvbHZlUGF0aG5hbWUocmVsYXRpdmVQYXRoLCBmcm9tUGF0aG5hbWUpIHtcbiAgbGV0IHNlZ21lbnRzID0gZnJvbVBhdGhuYW1lLnJlcGxhY2UoL1xcLyskLywgXCJcIikuc3BsaXQoXCIvXCIpO1xuICBsZXQgcmVsYXRpdmVTZWdtZW50cyA9IHJlbGF0aXZlUGF0aC5zcGxpdChcIi9cIik7XG4gIHJlbGF0aXZlU2VnbWVudHMuZm9yRWFjaChzZWdtZW50ID0+IHtcbiAgICBpZiAoc2VnbWVudCA9PT0gXCIuLlwiKSB7XG4gICAgICAvLyBLZWVwIHRoZSByb290IFwiXCIgc2VnbWVudCBzbyB0aGUgcGF0aG5hbWUgc3RhcnRzIGF0IC9cbiAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggPiAxKSBzZWdtZW50cy5wb3AoKTtcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnQgIT09IFwiLlwiKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzZWdtZW50cy5sZW5ndGggPiAxID8gc2VnbWVudHMuam9pbihcIi9cIikgOiBcIi9cIjtcbn1cbmZ1bmN0aW9uIGdldEludmFsaWRQYXRoRXJyb3IoY2hhciwgZmllbGQsIGRlc3QsIHBhdGgpIHtcbiAgcmV0dXJuIFwiQ2Fubm90IGluY2x1ZGUgYSAnXCIgKyBjaGFyICsgXCInIGNoYXJhY3RlciBpbiBhIG1hbnVhbGx5IHNwZWNpZmllZCBcIiArIChcImB0by5cIiArIGZpZWxkICsgXCJgIGZpZWxkIFtcIiArIEpTT04uc3RyaW5naWZ5KHBhdGgpICsgXCJdLiAgUGxlYXNlIHNlcGFyYXRlIGl0IG91dCB0byB0aGUgXCIpICsgKFwiYHRvLlwiICsgZGVzdCArIFwiYCBmaWVsZC4gQWx0ZXJuYXRpdmVseSB5b3UgbWF5IHByb3ZpZGUgdGhlIGZ1bGwgcGF0aCBhcyBcIikgKyBcImEgc3RyaW5nIGluIDxMaW5rIHRvPVxcXCIuLi5cXFwiPiBhbmQgdGhlIHJvdXRlciB3aWxsIHBhcnNlIGl0IGZvciB5b3UuXCI7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKlxuICogV2hlbiBwcm9jZXNzaW5nIHJlbGF0aXZlIG5hdmlnYXRpb24gd2Ugd2FudCB0byBpZ25vcmUgYW5jZXN0b3Igcm91dGVzIHRoYXRcbiAqIGRvIG5vdCBjb250cmlidXRlIHRvIHRoZSBwYXRoLCBzdWNoIHRoYXQgaW5kZXgvcGF0aGxlc3MgbGF5b3V0IHJvdXRlcyBkb24ndFxuICogaW50ZXJmZXJlLlxuICpcbiAqIEZvciBleGFtcGxlLCB3aGVuIG1vdmluZyBhIHJvdXRlIGVsZW1lbnQgaW50byBhbiBpbmRleCByb3V0ZSBhbmQvb3IgYVxuICogcGF0aGxlc3MgbGF5b3V0IHJvdXRlLCByZWxhdGl2ZSBsaW5rIGJlaGF2aW9yIGNvbnRhaW5lZCB3aXRoaW4gc2hvdWxkIHN0YXlcbiAqIHRoZSBzYW1lLiAgQm90aCBvZiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3VsZCBsaW5rIGJhY2sgdG8gdGhlIHJvb3Q6XG4gKlxuICogICA8Um91dGUgcGF0aD1cIi9cIj5cbiAqICAgICA8Um91dGUgcGF0aD1cImFjY291bnRzXCIgZWxlbWVudD17PExpbmsgdG89XCIuLlwifT5cbiAqICAgPC9Sb3V0ZT5cbiAqXG4gKiAgIDxSb3V0ZSBwYXRoPVwiL1wiPlxuICogICAgIDxSb3V0ZSBwYXRoPVwiYWNjb3VudHNcIj5cbiAqICAgICAgIDxSb3V0ZSBlbGVtZW50PXs8QWNjb3VudHNMYXlvdXQgLz59PiAgICAgICAvLyA8LS0gRG9lcyBub3QgY29udHJpYnV0ZVxuICogICAgICAgICA8Um91dGUgaW5kZXggZWxlbWVudD17PExpbmsgdG89XCIuLlwifSAvPiAgLy8gPC0tIERvZXMgbm90IGNvbnRyaWJ1dGVcbiAqICAgICAgIDwvUm91dGVcbiAqICAgICA8L1JvdXRlPlxuICogICA8L1JvdXRlPlxuICovXG5mdW5jdGlvbiBnZXRQYXRoQ29udHJpYnV0aW5nTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHJldHVybiBtYXRjaGVzLmZpbHRlcigobWF0Y2gsIGluZGV4KSA9PiBpbmRleCA9PT0gMCB8fCBtYXRjaC5yb3V0ZS5wYXRoICYmIG1hdGNoLnJvdXRlLnBhdGgubGVuZ3RoID4gMCk7XG59XG4vLyBSZXR1cm4gdGhlIGFycmF5IG9mIHBhdGhuYW1lcyBmb3IgdGhlIGN1cnJlbnQgcm91dGUgbWF0Y2hlcyAtIHVzZWQgdG9cbi8vIGdlbmVyYXRlIHRoZSByb3V0ZVBhdGhuYW1lcyBpbnB1dCBmb3IgcmVzb2x2ZVRvKClcbmZ1bmN0aW9uIGdldFJlc29sdmVUb01hdGNoZXMobWF0Y2hlcywgdjdfcmVsYXRpdmVTcGxhdFBhdGgpIHtcbiAgbGV0IHBhdGhNYXRjaGVzID0gZ2V0UGF0aENvbnRyaWJ1dGluZ01hdGNoZXMobWF0Y2hlcyk7XG4gIC8vIFdoZW4gdjdfcmVsYXRpdmVTcGxhdFBhdGggaXMgZW5hYmxlZCwgdXNlIHRoZSBmdWxsIHBhdGhuYW1lIGZvciB0aGUgbGVhZlxuICAvLyBtYXRjaCBzbyB3ZSBpbmNsdWRlIHNwbGF0IHZhbHVlcyBmb3IgXCIuXCIgbGlua3MuICBTZWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZW1peC1ydW4vcmVhY3Qtcm91dGVyL2lzc3Vlcy8xMTA1MiNpc3N1ZWNvbW1lbnQtMTgzNjU4OTMyOVxuICBpZiAodjdfcmVsYXRpdmVTcGxhdFBhdGgpIHtcbiAgICByZXR1cm4gcGF0aE1hdGNoZXMubWFwKChtYXRjaCwgaWR4KSA9PiBpZHggPT09IHBhdGhNYXRjaGVzLmxlbmd0aCAtIDEgPyBtYXRjaC5wYXRobmFtZSA6IG1hdGNoLnBhdGhuYW1lQmFzZSk7XG4gIH1cbiAgcmV0dXJuIHBhdGhNYXRjaGVzLm1hcChtYXRjaCA9PiBtYXRjaC5wYXRobmFtZUJhc2UpO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZXNvbHZlVG8odG9BcmcsIHJvdXRlUGF0aG5hbWVzLCBsb2NhdGlvblBhdGhuYW1lLCBpc1BhdGhSZWxhdGl2ZSkge1xuICBpZiAoaXNQYXRoUmVsYXRpdmUgPT09IHZvaWQgMCkge1xuICAgIGlzUGF0aFJlbGF0aXZlID0gZmFsc2U7XG4gIH1cbiAgbGV0IHRvO1xuICBpZiAodHlwZW9mIHRvQXJnID09PSBcInN0cmluZ1wiKSB7XG4gICAgdG8gPSBwYXJzZVBhdGgodG9BcmcpO1xuICB9IGVsc2Uge1xuICAgIHRvID0gX2V4dGVuZHMoe30sIHRvQXJnKTtcbiAgICBpbnZhcmlhbnQoIXRvLnBhdGhuYW1lIHx8ICF0by5wYXRobmFtZS5pbmNsdWRlcyhcIj9cIiksIGdldEludmFsaWRQYXRoRXJyb3IoXCI/XCIsIFwicGF0aG5hbWVcIiwgXCJzZWFyY2hcIiwgdG8pKTtcbiAgICBpbnZhcmlhbnQoIXRvLnBhdGhuYW1lIHx8ICF0by5wYXRobmFtZS5pbmNsdWRlcyhcIiNcIiksIGdldEludmFsaWRQYXRoRXJyb3IoXCIjXCIsIFwicGF0aG5hbWVcIiwgXCJoYXNoXCIsIHRvKSk7XG4gICAgaW52YXJpYW50KCF0by5zZWFyY2ggfHwgIXRvLnNlYXJjaC5pbmNsdWRlcyhcIiNcIiksIGdldEludmFsaWRQYXRoRXJyb3IoXCIjXCIsIFwic2VhcmNoXCIsIFwiaGFzaFwiLCB0bykpO1xuICB9XG4gIGxldCBpc0VtcHR5UGF0aCA9IHRvQXJnID09PSBcIlwiIHx8IHRvLnBhdGhuYW1lID09PSBcIlwiO1xuICBsZXQgdG9QYXRobmFtZSA9IGlzRW1wdHlQYXRoID8gXCIvXCIgOiB0by5wYXRobmFtZTtcbiAgbGV0IGZyb207XG4gIC8vIFJvdXRpbmcgaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcGF0aG5hbWUgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gIC8vXG4gIC8vIElmIGEgcGF0aG5hbWUgaXMgZXhwbGljaXRseSBwcm92aWRlZCBpbiBgdG9gLCBpdCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlXG4gIC8vIHJvdXRlIGNvbnRleHQuIFRoaXMgaXMgZXhwbGFpbmVkIGluIGBOb3RlIG9uIGA8TGluayB0bz5gIHZhbHVlc2AgaW4gb3VyXG4gIC8vIG1pZ3JhdGlvbiBndWlkZSBmcm9tIHY1IGFzIGEgbWVhbnMgb2YgZGlzYW1iaWd1YXRpb24gYmV0d2VlbiBgdG9gIHZhbHVlc1xuICAvLyB0aGF0IGJlZ2luIHdpdGggYC9gIGFuZCB0aG9zZSB0aGF0IGRvIG5vdC4gSG93ZXZlciwgdGhpcyBpcyBwcm9ibGVtYXRpYyBmb3JcbiAgLy8gYHRvYCB2YWx1ZXMgdGhhdCBkbyBub3QgcHJvdmlkZSBhIHBhdGhuYW1lLiBgdG9gIGNhbiBzaW1wbHkgYmUgYSBzZWFyY2ggb3JcbiAgLy8gaGFzaCBzdHJpbmcsIGluIHdoaWNoIGNhc2Ugd2Ugc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBuYXZpZ2F0aW9uIGlzIHJlbGF0aXZlXG4gIC8vIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uJ3MgcGF0aG5hbWUgYW5kICpub3QqIHRoZSByb3V0ZSBwYXRobmFtZS5cbiAgaWYgKHRvUGF0aG5hbWUgPT0gbnVsbCkge1xuICAgIGZyb20gPSBsb2NhdGlvblBhdGhuYW1lO1xuICB9IGVsc2Uge1xuICAgIGxldCByb3V0ZVBhdGhuYW1lSW5kZXggPSByb3V0ZVBhdGhuYW1lcy5sZW5ndGggLSAxO1xuICAgIC8vIFdpdGggcmVsYXRpdmU9XCJyb3V0ZVwiICh0aGUgZGVmYXVsdCksIGVhY2ggbGVhZGluZyAuLiBzZWdtZW50IG1lYW5zXG4gICAgLy8gXCJnbyB1cCBvbmUgcm91dGVcIiBpbnN0ZWFkIG9mIFwiZ28gdXAgb25lIFVSTCBzZWdtZW50XCIuICBUaGlzIGlzIGEga2V5XG4gICAgLy8gZGlmZmVyZW5jZSBmcm9tIGhvdyA8YSBocmVmPiB3b3JrcyBhbmQgYSBtYWpvciByZWFzb24gd2UgY2FsbCB0aGlzIGFcbiAgICAvLyBcInRvXCIgdmFsdWUgaW5zdGVhZCBvZiBhIFwiaHJlZlwiLlxuICAgIGlmICghaXNQYXRoUmVsYXRpdmUgJiYgdG9QYXRobmFtZS5zdGFydHNXaXRoKFwiLi5cIikpIHtcbiAgICAgIGxldCB0b1NlZ21lbnRzID0gdG9QYXRobmFtZS5zcGxpdChcIi9cIik7XG4gICAgICB3aGlsZSAodG9TZWdtZW50c1swXSA9PT0gXCIuLlwiKSB7XG4gICAgICAgIHRvU2VnbWVudHMuc2hpZnQoKTtcbiAgICAgICAgcm91dGVQYXRobmFtZUluZGV4IC09IDE7XG4gICAgICB9XG4gICAgICB0by5wYXRobmFtZSA9IHRvU2VnbWVudHMuam9pbihcIi9cIik7XG4gICAgfVxuICAgIGZyb20gPSByb3V0ZVBhdGhuYW1lSW5kZXggPj0gMCA/IHJvdXRlUGF0aG5hbWVzW3JvdXRlUGF0aG5hbWVJbmRleF0gOiBcIi9cIjtcbiAgfVxuICBsZXQgcGF0aCA9IHJlc29sdmVQYXRoKHRvLCBmcm9tKTtcbiAgLy8gRW5zdXJlIHRoZSBwYXRobmFtZSBoYXMgYSB0cmFpbGluZyBzbGFzaCBpZiB0aGUgb3JpZ2luYWwgXCJ0b1wiIGhhZCBvbmVcbiAgbGV0IGhhc0V4cGxpY2l0VHJhaWxpbmdTbGFzaCA9IHRvUGF0aG5hbWUgJiYgdG9QYXRobmFtZSAhPT0gXCIvXCIgJiYgdG9QYXRobmFtZS5lbmRzV2l0aChcIi9cIik7XG4gIC8vIE9yIGlmIHRoaXMgd2FzIGEgbGluayB0byB0aGUgY3VycmVudCBwYXRoIHdoaWNoIGhhcyBhIHRyYWlsaW5nIHNsYXNoXG4gIGxldCBoYXNDdXJyZW50VHJhaWxpbmdTbGFzaCA9IChpc0VtcHR5UGF0aCB8fCB0b1BhdGhuYW1lID09PSBcIi5cIikgJiYgbG9jYXRpb25QYXRobmFtZS5lbmRzV2l0aChcIi9cIik7XG4gIGlmICghcGF0aC5wYXRobmFtZS5lbmRzV2l0aChcIi9cIikgJiYgKGhhc0V4cGxpY2l0VHJhaWxpbmdTbGFzaCB8fCBoYXNDdXJyZW50VHJhaWxpbmdTbGFzaCkpIHtcbiAgICBwYXRoLnBhdGhuYW1lICs9IFwiL1wiO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRUb1BhdGhuYW1lKHRvKSB7XG4gIC8vIEVtcHR5IHN0cmluZ3Mgc2hvdWxkIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgLyBwYXRoc1xuICByZXR1cm4gdG8gPT09IFwiXCIgfHwgdG8ucGF0aG5hbWUgPT09IFwiXCIgPyBcIi9cIiA6IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aCh0bykucGF0aG5hbWUgOiB0by5wYXRobmFtZTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgam9pblBhdGhzID0gcGF0aHMgPT4gcGF0aHMuam9pbihcIi9cIikucmVwbGFjZSgvXFwvXFwvKy9nLCBcIi9cIik7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVBhdGhuYW1lID0gcGF0aG5hbWUgPT4gcGF0aG5hbWUucmVwbGFjZSgvXFwvKyQvLCBcIlwiKS5yZXBsYWNlKC9eXFwvKi8sIFwiL1wiKTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgbm9ybWFsaXplU2VhcmNoID0gc2VhcmNoID0+ICFzZWFyY2ggfHwgc2VhcmNoID09PSBcIj9cIiA/IFwiXCIgOiBzZWFyY2guc3RhcnRzV2l0aChcIj9cIikgPyBzZWFyY2ggOiBcIj9cIiArIHNlYXJjaDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgbm9ybWFsaXplSGFzaCA9IGhhc2ggPT4gIWhhc2ggfHwgaGFzaCA9PT0gXCIjXCIgPyBcIlwiIDogaGFzaC5zdGFydHNXaXRoKFwiI1wiKSA/IGhhc2ggOiBcIiNcIiArIGhhc2g7XG4vKipcbiAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IgY3JlYXRpbmcgYGFwcGxpY2F0aW9uL2pzb25gIHJlc3BvbnNlcy4gQ29udmVydHMgYGRhdGFgXG4gKiB0byBKU09OIGFuZCBzZXRzIHRoZSBgQ29udGVudC1UeXBlYCBoZWFkZXIuXG4gKi9cbmNvbnN0IGpzb24gPSBmdW5jdGlvbiBqc29uKGRhdGEsIGluaXQpIHtcbiAgaWYgKGluaXQgPT09IHZvaWQgMCkge1xuICAgIGluaXQgPSB7fTtcbiAgfVxuICBsZXQgcmVzcG9uc2VJbml0ID0gdHlwZW9mIGluaXQgPT09IFwibnVtYmVyXCIgPyB7XG4gICAgc3RhdHVzOiBpbml0XG4gIH0gOiBpbml0O1xuICBsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlc3BvbnNlSW5pdC5oZWFkZXJzKTtcbiAgaWYgKCFoZWFkZXJzLmhhcyhcIkNvbnRlbnQtVHlwZVwiKSkge1xuICAgIGhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgfVxuICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpLCBfZXh0ZW5kcyh7fSwgcmVzcG9uc2VJbml0LCB7XG4gICAgaGVhZGVyc1xuICB9KSk7XG59O1xuY2xhc3MgRGF0YVdpdGhSZXNwb25zZUluaXQge1xuICBjb25zdHJ1Y3RvcihkYXRhLCBpbml0KSB7XG4gICAgdGhpcy50eXBlID0gXCJEYXRhV2l0aFJlc3BvbnNlSW5pdFwiO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5pbml0ID0gaW5pdCB8fCBudWxsO1xuICB9XG59XG4vKipcbiAqIENyZWF0ZSBcInJlc3BvbnNlc1wiIHRoYXQgY29udGFpbiBgc3RhdHVzYC9gaGVhZGVyc2Agd2l0aG91dCBmb3JjaW5nXG4gKiBzZXJpYWxpemF0aW9uIGludG8gYW4gYWN0dWFsIGBSZXNwb25zZWAgLSB1c2VkIGJ5IFJlbWl4IHNpbmdsZSBmZXRjaFxuICovXG5mdW5jdGlvbiBkYXRhKGRhdGEsIGluaXQpIHtcbiAgcmV0dXJuIG5ldyBEYXRhV2l0aFJlc3BvbnNlSW5pdChkYXRhLCB0eXBlb2YgaW5pdCA9PT0gXCJudW1iZXJcIiA/IHtcbiAgICBzdGF0dXM6IGluaXRcbiAgfSA6IGluaXQpO1xufVxuY2xhc3MgQWJvcnRlZERlZmVycmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuY2xhc3MgRGVmZXJyZWREYXRhIHtcbiAgY29uc3RydWN0b3IoZGF0YSwgcmVzcG9uc2VJbml0KSB7XG4gICAgdGhpcy5wZW5kaW5nS2V5c1NldCA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnN1YnNjcmliZXJzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuZGVmZXJyZWRLZXlzID0gW107XG4gICAgaW52YXJpYW50KGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSksIFwiZGVmZXIoKSBvbmx5IGFjY2VwdHMgcGxhaW4gb2JqZWN0c1wiKTtcbiAgICAvLyBTZXQgdXAgYW4gQWJvcnRDb250cm9sbGVyICsgUHJvbWlzZSB3ZSBjYW4gcmFjZSBhZ2FpbnN0IHRvIGV4aXQgZWFybHlcbiAgICAvLyBjYW5jZWxsYXRpb25cbiAgICBsZXQgcmVqZWN0O1xuICAgIHRoaXMuYWJvcnRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHIpID0+IHJlamVjdCA9IHIpO1xuICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsZXQgb25BYm9ydCA9ICgpID0+IHJlamVjdChuZXcgQWJvcnRlZERlZmVycmVkRXJyb3IoXCJEZWZlcnJlZCBkYXRhIGFib3J0ZWRcIikpO1xuICAgIHRoaXMudW5saXN0ZW5BYm9ydFNpZ25hbCA9ICgpID0+IHRoaXMuY29udHJvbGxlci5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgIHRoaXMuY29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgIHRoaXMuZGF0YSA9IE9iamVjdC5lbnRyaWVzKGRhdGEpLnJlZHVjZSgoYWNjLCBfcmVmMikgPT4ge1xuICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IF9yZWYyO1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7XG4gICAgICAgIFtrZXldOiB0aGlzLnRyYWNrUHJvbWlzZShrZXksIHZhbHVlKVxuICAgICAgfSk7XG4gICAgfSwge30pO1xuICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgIC8vIEFsbCBpbmNvbWluZyB2YWx1ZXMgd2VyZSByZXNvbHZlZFxuICAgICAgdGhpcy51bmxpc3RlbkFib3J0U2lnbmFsKCk7XG4gICAgfVxuICAgIHRoaXMuaW5pdCA9IHJlc3BvbnNlSW5pdDtcbiAgfVxuICB0cmFja1Byb21pc2Uoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5kZWZlcnJlZEtleXMucHVzaChrZXkpO1xuICAgIHRoaXMucGVuZGluZ0tleXNTZXQuYWRkKGtleSk7XG4gICAgLy8gV2Ugc3RvcmUgYSBsaXR0bGUgd3JhcHBlciBwcm9taXNlIHRoYXQgd2lsbCBiZSBleHRlbmRlZCB3aXRoXG4gICAgLy8gX2RhdGEvX2Vycm9yIHByb3BzIHVwb24gcmVzb2x2ZS9yZWplY3RcbiAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmFjZShbdmFsdWUsIHRoaXMuYWJvcnRQcm9taXNlXSkudGhlbihkYXRhID0+IHRoaXMub25TZXR0bGUocHJvbWlzZSwga2V5LCB1bmRlZmluZWQsIGRhdGEpLCBlcnJvciA9PiB0aGlzLm9uU2V0dGxlKHByb21pc2UsIGtleSwgZXJyb3IpKTtcbiAgICAvLyBSZWdpc3RlciByZWplY3Rpb24gbGlzdGVuZXJzIHRvIGF2b2lkIHVuY2F1Z2h0IHByb21pc2UgcmVqZWN0aW9ucyBvblxuICAgIC8vIGVycm9ycyBvciBhYm9ydGVkIGRlZmVycmVkIHZhbHVlc1xuICAgIHByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl90cmFja2VkXCIsIHtcbiAgICAgIGdldDogKCkgPT4gdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIG9uU2V0dGxlKHByb21pc2UsIGtleSwgZXJyb3IsIGRhdGEpIHtcbiAgICBpZiAodGhpcy5jb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkICYmIGVycm9yIGluc3RhbmNlb2YgQWJvcnRlZERlZmVycmVkRXJyb3IpIHtcbiAgICAgIHRoaXMudW5saXN0ZW5BYm9ydFNpZ25hbCgpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX2Vycm9yXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiBlcnJvclxuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdLZXlzU2V0LmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBhYm9ydCFcbiAgICAgIHRoaXMudW5saXN0ZW5BYm9ydFNpZ25hbCgpO1xuICAgIH1cbiAgICAvLyBJZiB0aGUgcHJvbWlzZSB3YXMgcmVzb2x2ZWQvcmVqZWN0ZWQgd2l0aCB1bmRlZmluZWQsIHdlJ2xsIHRocm93IGFuIGVycm9yIGFzIHlvdVxuICAgIC8vIHNob3VsZCBhbHdheXMgcmVzb2x2ZSB3aXRoIGEgdmFsdWUgb3IgbnVsbFxuICAgIGlmIChlcnJvciA9PT0gdW5kZWZpbmVkICYmIGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IHVuZGVmaW5lZEVycm9yID0gbmV3IEVycm9yKFwiRGVmZXJyZWQgZGF0YSBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXNvbHZlZC9yZWplY3RlZCB3aXRoIGB1bmRlZmluZWRgLCBcIiArIFwieW91IG11c3QgcmVzb2x2ZS9yZWplY3Qgd2l0aCBhIHZhbHVlIG9yIGBudWxsYC5cIik7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvbWlzZSwgXCJfZXJyb3JcIiwge1xuICAgICAgICBnZXQ6ICgpID0+IHVuZGVmaW5lZEVycm9yXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW1pdChmYWxzZSwga2V5KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh1bmRlZmluZWRFcnJvcik7XG4gICAgfVxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl9lcnJvclwiLCB7XG4gICAgICAgIGdldDogKCkgPT4gZXJyb3JcbiAgICAgIH0pO1xuICAgICAgdGhpcy5lbWl0KGZhbHNlLCBrZXkpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX2RhdGFcIiwge1xuICAgICAgZ2V0OiAoKSA9PiBkYXRhXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0KGZhbHNlLCBrZXkpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGVtaXQoYWJvcnRlZCwgc2V0dGxlZEtleSkge1xuICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaChzdWJzY3JpYmVyID0+IHN1YnNjcmliZXIoYWJvcnRlZCwgc2V0dGxlZEtleSkpO1xuICB9XG4gIHN1YnNjcmliZShmbikge1xuICAgIHRoaXMuc3Vic2NyaWJlcnMuYWRkKGZuKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoZm4pO1xuICB9XG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB0aGlzLnBlbmRpbmdLZXlzU2V0LmZvckVhY2goKHYsIGspID0+IHRoaXMucGVuZGluZ0tleXNTZXQuZGVsZXRlKGspKTtcbiAgICB0aGlzLmVtaXQodHJ1ZSk7XG4gIH1cbiAgYXN5bmMgcmVzb2x2ZURhdGEoc2lnbmFsKSB7XG4gICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuZG9uZSkge1xuICAgICAgbGV0IG9uQWJvcnQgPSAoKSA9PiB0aGlzLmNhbmNlbCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIGFib3J0ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoYWJvcnRlZCA9PiB7XG4gICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgICAgICBpZiAoYWJvcnRlZCB8fCB0aGlzLmRvbmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUoYWJvcnRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYWJvcnRlZDtcbiAgfVxuICBnZXQgZG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nS2V5c1NldC5zaXplID09PSAwO1xuICB9XG4gIGdldCB1bndyYXBwZWREYXRhKCkge1xuICAgIGludmFyaWFudCh0aGlzLmRhdGEgIT09IG51bGwgJiYgdGhpcy5kb25lLCBcIkNhbiBvbmx5IHVud3JhcCBkYXRhIG9uIGluaXRpYWxpemVkIGFuZCBzZXR0bGVkIGRlZmVycmVkc1wiKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5kYXRhKS5yZWR1Y2UoKGFjYywgX3JlZjMpID0+IHtcbiAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSBfcmVmMztcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICBba2V5XTogdW53cmFwVHJhY2tlZFByb21pc2UodmFsdWUpXG4gICAgICB9KTtcbiAgICB9LCB7fSk7XG4gIH1cbiAgZ2V0IHBlbmRpbmdLZXlzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucGVuZGluZ0tleXNTZXQpO1xuICB9XG59XG5mdW5jdGlvbiBpc1RyYWNrZWRQcm9taXNlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgJiYgdmFsdWUuX3RyYWNrZWQgPT09IHRydWU7XG59XG5mdW5jdGlvbiB1bndyYXBUcmFja2VkUHJvbWlzZSh2YWx1ZSkge1xuICBpZiAoIWlzVHJhY2tlZFByb21pc2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZS5fZXJyb3IpIHtcbiAgICB0aHJvdyB2YWx1ZS5fZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLl9kYXRhO1xufVxuY29uc3QgZGVmZXIgPSBmdW5jdGlvbiBkZWZlcihkYXRhLCBpbml0KSB7XG4gIGlmIChpbml0ID09PSB2b2lkIDApIHtcbiAgICBpbml0ID0ge307XG4gIH1cbiAgbGV0IHJlc3BvbnNlSW5pdCA9IHR5cGVvZiBpbml0ID09PSBcIm51bWJlclwiID8ge1xuICAgIHN0YXR1czogaW5pdFxuICB9IDogaW5pdDtcbiAgcmV0dXJuIG5ldyBEZWZlcnJlZERhdGEoZGF0YSwgcmVzcG9uc2VJbml0KTtcbn07XG4vKipcbiAqIEEgcmVkaXJlY3QgcmVzcG9uc2UuIFNldHMgdGhlIHN0YXR1cyBjb2RlIGFuZCB0aGUgYExvY2F0aW9uYCBoZWFkZXIuXG4gKiBEZWZhdWx0cyB0byBcIjMwMiBGb3VuZFwiLlxuICovXG5jb25zdCByZWRpcmVjdCA9IGZ1bmN0aW9uIHJlZGlyZWN0KHVybCwgaW5pdCkge1xuICBpZiAoaW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgaW5pdCA9IDMwMjtcbiAgfVxuICBsZXQgcmVzcG9uc2VJbml0ID0gaW5pdDtcbiAgaWYgKHR5cGVvZiByZXNwb25zZUluaXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXNwb25zZUluaXQgPSB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlSW5pdFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlc3BvbnNlSW5pdC5zdGF0dXMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXNwb25zZUluaXQuc3RhdHVzID0gMzAyO1xuICB9XG4gIGxldCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2VJbml0LmhlYWRlcnMpO1xuICBoZWFkZXJzLnNldChcIkxvY2F0aW9uXCIsIHVybCk7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwgX2V4dGVuZHMoe30sIHJlc3BvbnNlSW5pdCwge1xuICAgIGhlYWRlcnNcbiAgfSkpO1xufTtcbi8qKlxuICogQSByZWRpcmVjdCByZXNwb25zZSB0aGF0IHdpbGwgZm9yY2UgYSBkb2N1bWVudCByZWxvYWQgdG8gdGhlIG5ldyBsb2NhdGlvbi5cbiAqIFNldHMgdGhlIHN0YXR1cyBjb2RlIGFuZCB0aGUgYExvY2F0aW9uYCBoZWFkZXIuXG4gKiBEZWZhdWx0cyB0byBcIjMwMiBGb3VuZFwiLlxuICovXG5jb25zdCByZWRpcmVjdERvY3VtZW50ID0gKHVybCwgaW5pdCkgPT4ge1xuICBsZXQgcmVzcG9uc2UgPSByZWRpcmVjdCh1cmwsIGluaXQpO1xuICByZXNwb25zZS5oZWFkZXJzLnNldChcIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50XCIsIFwidHJ1ZVwiKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufTtcbi8qKlxuICogQSByZWRpcmVjdCByZXNwb25zZSB0aGF0IHdpbGwgcGVyZm9ybSBhIGBoaXN0b3J5LnJlcGxhY2VTdGF0ZWAgaW5zdGVhZCBvZiBhXG4gKiBgaGlzdG9yeS5wdXNoU3RhdGVgIGZvciBjbGllbnQtc2lkZSBuYXZpZ2F0aW9uIHJlZGlyZWN0cy5cbiAqIFNldHMgdGhlIHN0YXR1cyBjb2RlIGFuZCB0aGUgYExvY2F0aW9uYCBoZWFkZXIuXG4gKiBEZWZhdWx0cyB0byBcIjMwMiBGb3VuZFwiLlxuICovXG5jb25zdCByZXBsYWNlID0gKHVybCwgaW5pdCkgPT4ge1xuICBsZXQgcmVzcG9uc2UgPSByZWRpcmVjdCh1cmwsIGluaXQpO1xuICByZXNwb25zZS5oZWFkZXJzLnNldChcIlgtUmVtaXgtUmVwbGFjZVwiLCBcInRydWVcIik7XG4gIHJldHVybiByZXNwb25zZTtcbn07XG4vKipcbiAqIEBwcml2YXRlXG4gKiBVdGlsaXR5IGNsYXNzIHdlIHVzZSB0byBob2xkIGF1dG8tdW53cmFwcGVkIDR4eC81eHggUmVzcG9uc2UgYm9kaWVzXG4gKlxuICogV2UgZG9uJ3QgZXhwb3J0IHRoZSBjbGFzcyBmb3IgcHVibGljIHVzZSBzaW5jZSBpdCdzIGFuIGltcGxlbWVudGF0aW9uXG4gKiBkZXRhaWwsIGJ1dCB3ZSBleHBvcnQgdGhlIGludGVyZmFjZSBhYm92ZSBzbyBmb2xrcyBjYW4gYnVpbGQgdGhlaXIgb3duXG4gKiBhYnN0cmFjdGlvbnMgYXJvdW5kIGluc3RhbmNlcyB2aWEgaXNSb3V0ZUVycm9yUmVzcG9uc2UoKVxuICovXG5jbGFzcyBFcnJvclJlc3BvbnNlSW1wbCB7XG4gIGNvbnN0cnVjdG9yKHN0YXR1cywgc3RhdHVzVGV4dCwgZGF0YSwgaW50ZXJuYWwpIHtcbiAgICBpZiAoaW50ZXJuYWwgPT09IHZvaWQgMCkge1xuICAgICAgaW50ZXJuYWwgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gc3RhdHVzVGV4dCB8fCBcIlwiO1xuICAgIHRoaXMuaW50ZXJuYWwgPSBpbnRlcm5hbDtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLmVycm9yID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGVycm9yIGlzIGFuIEVycm9yUmVzcG9uc2UgZ2VuZXJhdGVkIGZyb20gYSA0eHgvNXh4XG4gKiBSZXNwb25zZSB0aHJvd24gZnJvbSBhbiBhY3Rpb24vbG9hZGVyXG4gKi9cbmZ1bmN0aW9uIGlzUm91dGVFcnJvclJlc3BvbnNlKGVycm9yKSB7XG4gIHJldHVybiBlcnJvciAhPSBudWxsICYmIHR5cGVvZiBlcnJvci5zdGF0dXMgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGVycm9yLnN0YXR1c1RleHQgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGVycm9yLmludGVybmFsID09PSBcImJvb2xlYW5cIiAmJiBcImRhdGFcIiBpbiBlcnJvcjtcbn1cblxuY29uc3QgdmFsaWRNdXRhdGlvbk1ldGhvZHNBcnIgPSBbXCJwb3N0XCIsIFwicHV0XCIsIFwicGF0Y2hcIiwgXCJkZWxldGVcIl07XG5jb25zdCB2YWxpZE11dGF0aW9uTWV0aG9kcyA9IG5ldyBTZXQodmFsaWRNdXRhdGlvbk1ldGhvZHNBcnIpO1xuY29uc3QgdmFsaWRSZXF1ZXN0TWV0aG9kc0FyciA9IFtcImdldFwiLCAuLi52YWxpZE11dGF0aW9uTWV0aG9kc0Fycl07XG5jb25zdCB2YWxpZFJlcXVlc3RNZXRob2RzID0gbmV3IFNldCh2YWxpZFJlcXVlc3RNZXRob2RzQXJyKTtcbmNvbnN0IHJlZGlyZWN0U3RhdHVzQ29kZXMgPSBuZXcgU2V0KFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0pO1xuY29uc3QgcmVkaXJlY3RQcmVzZXJ2ZU1ldGhvZFN0YXR1c0NvZGVzID0gbmV3IFNldChbMzA3LCAzMDhdKTtcbmNvbnN0IElETEVfTkFWSUdBVElPTiA9IHtcbiAgc3RhdGU6IFwiaWRsZVwiLFxuICBsb2NhdGlvbjogdW5kZWZpbmVkLFxuICBmb3JtTWV0aG9kOiB1bmRlZmluZWQsXG4gIGZvcm1BY3Rpb246IHVuZGVmaW5lZCxcbiAgZm9ybUVuY1R5cGU6IHVuZGVmaW5lZCxcbiAgZm9ybURhdGE6IHVuZGVmaW5lZCxcbiAganNvbjogdW5kZWZpbmVkLFxuICB0ZXh0OiB1bmRlZmluZWRcbn07XG5jb25zdCBJRExFX0ZFVENIRVIgPSB7XG4gIHN0YXRlOiBcImlkbGVcIixcbiAgZGF0YTogdW5kZWZpbmVkLFxuICBmb3JtTWV0aG9kOiB1bmRlZmluZWQsXG4gIGZvcm1BY3Rpb246IHVuZGVmaW5lZCxcbiAgZm9ybUVuY1R5cGU6IHVuZGVmaW5lZCxcbiAgZm9ybURhdGE6IHVuZGVmaW5lZCxcbiAganNvbjogdW5kZWZpbmVkLFxuICB0ZXh0OiB1bmRlZmluZWRcbn07XG5jb25zdCBJRExFX0JMT0NLRVIgPSB7XG4gIHN0YXRlOiBcInVuYmxvY2tlZFwiLFxuICBwcm9jZWVkOiB1bmRlZmluZWQsXG4gIHJlc2V0OiB1bmRlZmluZWQsXG4gIGxvY2F0aW9uOiB1bmRlZmluZWRcbn07XG5jb25zdCBBQlNPTFVURV9VUkxfUkVHRVggPSAvXig/OlthLXpdW2EtejAtOSsuLV0qOnxcXC9cXC8pL2k7XG5jb25zdCBkZWZhdWx0TWFwUm91dGVQcm9wZXJ0aWVzID0gcm91dGUgPT4gKHtcbiAgaGFzRXJyb3JCb3VuZGFyeTogQm9vbGVhbihyb3V0ZS5oYXNFcnJvckJvdW5kYXJ5KVxufSk7XG5jb25zdCBUUkFOU0lUSU9OU19TVE9SQUdFX0tFWSA9IFwicmVtaXgtcm91dGVyLXRyYW5zaXRpb25zXCI7XG4vLyNlbmRyZWdpb25cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyNyZWdpb24gY3JlYXRlUm91dGVyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLyoqXG4gKiBDcmVhdGUgYSByb3V0ZXIgYW5kIGxpc3RlbiB0byBoaXN0b3J5IFBPUCBuYXZpZ2F0aW9uc1xuICovXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZXIoaW5pdCkge1xuICBjb25zdCByb3V0ZXJXaW5kb3cgPSBpbml0LndpbmRvdyA/IGluaXQud2luZG93IDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHJvdXRlcldpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygcm91dGVyV2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiByb3V0ZXJXaW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgY29uc3QgaXNTZXJ2ZXIgPSAhaXNCcm93c2VyO1xuICBpbnZhcmlhbnQoaW5pdC5yb3V0ZXMubGVuZ3RoID4gMCwgXCJZb3UgbXVzdCBwcm92aWRlIGEgbm9uLWVtcHR5IHJvdXRlcyBhcnJheSB0byBjcmVhdGVSb3V0ZXJcIik7XG4gIGxldCBtYXBSb3V0ZVByb3BlcnRpZXM7XG4gIGlmIChpbml0Lm1hcFJvdXRlUHJvcGVydGllcykge1xuICAgIG1hcFJvdXRlUHJvcGVydGllcyA9IGluaXQubWFwUm91dGVQcm9wZXJ0aWVzO1xuICB9IGVsc2UgaWYgKGluaXQuZGV0ZWN0RXJyb3JCb3VuZGFyeSkge1xuICAgIC8vIElmIHRoZXkgYXJlIHN0aWxsIHVzaW5nIHRoZSBkZXByZWNhdGVkIHZlcnNpb24sIHdyYXAgaXQgd2l0aCB0aGUgbmV3IEFQSVxuICAgIGxldCBkZXRlY3RFcnJvckJvdW5kYXJ5ID0gaW5pdC5kZXRlY3RFcnJvckJvdW5kYXJ5O1xuICAgIG1hcFJvdXRlUHJvcGVydGllcyA9IHJvdXRlID0+ICh7XG4gICAgICBoYXNFcnJvckJvdW5kYXJ5OiBkZXRlY3RFcnJvckJvdW5kYXJ5KHJvdXRlKVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG1hcFJvdXRlUHJvcGVydGllcyA9IGRlZmF1bHRNYXBSb3V0ZVByb3BlcnRpZXM7XG4gIH1cbiAgLy8gUm91dGVzIGtleWVkIGJ5IElEXG4gIGxldCBtYW5pZmVzdCA9IHt9O1xuICAvLyBSb3V0ZXMgaW4gdHJlZSBmb3JtYXQgZm9yIG1hdGNoaW5nXG4gIGxldCBkYXRhUm91dGVzID0gY29udmVydFJvdXRlc1RvRGF0YVJvdXRlcyhpbml0LnJvdXRlcywgbWFwUm91dGVQcm9wZXJ0aWVzLCB1bmRlZmluZWQsIG1hbmlmZXN0KTtcbiAgbGV0IGluRmxpZ2h0RGF0YVJvdXRlcztcbiAgbGV0IGJhc2VuYW1lID0gaW5pdC5iYXNlbmFtZSB8fCBcIi9cIjtcbiAgbGV0IGRhdGFTdHJhdGVneUltcGwgPSBpbml0LnVuc3RhYmxlX2RhdGFTdHJhdGVneSB8fCBkZWZhdWx0RGF0YVN0cmF0ZWd5O1xuICBsZXQgcGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb25JbXBsID0gaW5pdC51bnN0YWJsZV9wYXRjaFJvdXRlc09uTmF2aWdhdGlvbjtcbiAgLy8gQ29uZmlnIGRyaXZlbiBiZWhhdmlvciBmbGFnc1xuICBsZXQgZnV0dXJlID0gX2V4dGVuZHMoe1xuICAgIHY3X2ZldGNoZXJQZXJzaXN0OiBmYWxzZSxcbiAgICB2N19ub3JtYWxpemVGb3JtTWV0aG9kOiBmYWxzZSxcbiAgICB2N19wYXJ0aWFsSHlkcmF0aW9uOiBmYWxzZSxcbiAgICB2N19wcmVwZW5kQmFzZW5hbWU6IGZhbHNlLFxuICAgIHY3X3JlbGF0aXZlU3BsYXRQYXRoOiBmYWxzZSxcbiAgICB2N19za2lwQWN0aW9uRXJyb3JSZXZhbGlkYXRpb246IGZhbHNlXG4gIH0sIGluaXQuZnV0dXJlKTtcbiAgLy8gQ2xlYW51cCBmdW5jdGlvbiBmb3IgaGlzdG9yeVxuICBsZXQgdW5saXN0ZW5IaXN0b3J5ID0gbnVsbDtcbiAgLy8gRXh0ZXJuYWxseS1wcm92aWRlZCBmdW5jdGlvbnMgdG8gY2FsbCBvbiBhbGwgc3RhdGUgY2hhbmdlc1xuICBsZXQgc3Vic2NyaWJlcnMgPSBuZXcgU2V0KCk7XG4gIC8vIEZJRk8gcXVldWUgb2YgcHJldmlvdXNseSBkaXNjb3ZlcmVkIHJvdXRlcyB0byBwcmV2ZW50IHJlLWNhbGxpbmcgb25cbiAgLy8gc3Vic2VxdWVudCBuYXZpZ2F0aW9ucyB0byB0aGUgc2FtZSBwYXRoXG4gIGxldCBkaXNjb3ZlcmVkUm91dGVzTWF4U2l6ZSA9IDEwMDA7XG4gIGxldCBkaXNjb3ZlcmVkUm91dGVzID0gbmV3IFNldCgpO1xuICAvLyBFeHRlcm5hbGx5LXByb3ZpZGVkIG9iamVjdCB0byBob2xkIHNjcm9sbCByZXN0b3JhdGlvbiBsb2NhdGlvbnMgZHVyaW5nIHJvdXRpbmdcbiAgbGV0IHNhdmVkU2Nyb2xsUG9zaXRpb25zID0gbnVsbDtcbiAgLy8gRXh0ZXJuYWxseS1wcm92aWRlZCBmdW5jdGlvbiB0byBnZXQgc2Nyb2xsIHJlc3RvcmF0aW9uIGtleXNcbiAgbGV0IGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5ID0gbnVsbDtcbiAgLy8gRXh0ZXJuYWxseS1wcm92aWRlZCBmdW5jdGlvbiB0byBnZXQgY3VycmVudCBzY3JvbGwgcG9zaXRpb25cbiAgbGV0IGdldFNjcm9sbFBvc2l0aW9uID0gbnVsbDtcbiAgLy8gT25lLXRpbWUgZmxhZyB0byBjb250cm9sIHRoZSBpbml0aWFsIGh5ZHJhdGlvbiBzY3JvbGwgcmVzdG9yYXRpb24uICBCZWNhdXNlXG4gIC8vIHdlIGRvbid0IGdldCB0aGUgc2F2ZWQgcG9zaXRpb25zIGZyb20gPFNjcm9sbFJlc3RvcmF0aW9uIC8+IHVudGlsIF9hZnRlcl9cbiAgLy8gdGhlIGluaXRpYWwgcmVuZGVyLCB3ZSBuZWVkIHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBzZXBhcmF0ZSB1cGRhdGVTdGF0ZSB0b1xuICAvLyBzZW5kIGFsb25nIHRoZSByZXN0b3JlU2Nyb2xsUG9zaXRpb25cbiAgLy8gU2V0IHRvIHRydWUgaWYgd2UgaGF2ZSBgaHlkcmF0aW9uRGF0YWAgc2luY2Ugd2UgYXNzdW1lIHdlIHdlcmUgU1NSJ2QgYW5kIHRoYXRcbiAgLy8gU1NSIGRpZCB0aGUgaW5pdGlhbCBzY3JvbGwgcmVzdG9yYXRpb24uXG4gIGxldCBpbml0aWFsU2Nyb2xsUmVzdG9yZWQgPSBpbml0Lmh5ZHJhdGlvbkRhdGEgIT0gbnVsbDtcbiAgbGV0IGluaXRpYWxNYXRjaGVzID0gbWF0Y2hSb3V0ZXMoZGF0YVJvdXRlcywgaW5pdC5oaXN0b3J5LmxvY2F0aW9uLCBiYXNlbmFtZSk7XG4gIGxldCBpbml0aWFsRXJyb3JzID0gbnVsbDtcbiAgaWYgKGluaXRpYWxNYXRjaGVzID09IG51bGwgJiYgIXBhdGNoUm91dGVzT25OYXZpZ2F0aW9uSW1wbCkge1xuICAgIC8vIElmIHdlIGRvIG5vdCBtYXRjaCBhIHVzZXItcHJvdmlkZWQtcm91dGUsIGZhbGwgYmFjayB0byB0aGUgcm9vdFxuICAgIC8vIHRvIGFsbG93IHRoZSBlcnJvciBib3VuZGFyeSB0byB0YWtlIG92ZXJcbiAgICBsZXQgZXJyb3IgPSBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwge1xuICAgICAgcGF0aG5hbWU6IGluaXQuaGlzdG9yeS5sb2NhdGlvbi5wYXRobmFtZVxuICAgIH0pO1xuICAgIGxldCB7XG4gICAgICBtYXRjaGVzLFxuICAgICAgcm91dGVcbiAgICB9ID0gZ2V0U2hvcnRDaXJjdWl0TWF0Y2hlcyhkYXRhUm91dGVzKTtcbiAgICBpbml0aWFsTWF0Y2hlcyA9IG1hdGNoZXM7XG4gICAgaW5pdGlhbEVycm9ycyA9IHtcbiAgICAgIFtyb3V0ZS5pZF06IGVycm9yXG4gICAgfTtcbiAgfVxuICAvLyBJbiBTUEEgYXBwcywgaWYgdGhlIHVzZXIgcHJvdmlkZWQgYSBwYXRjaFJvdXRlc09uTmF2aWdhdGlvbiBpbXBsZW1lbnRhdGlvbiBhbmRcbiAgLy8gb3VyIGluaXRpYWwgbWF0Y2ggaXMgYSBzcGxhdCByb3V0ZSwgY2xlYXIgdGhlbSBvdXQgc28gd2UgcnVuIHRocm91Z2ggbGF6eVxuICAvLyBkaXNjb3Zlcnkgb24gaHlkcmF0aW9uIGluIGNhc2UgdGhlcmUncyBhIG1vcmUgYWNjdXJhdGUgbGF6eSByb3V0ZSBtYXRjaC5cbiAgLy8gSW4gU1NSIGFwcHMgKHdpdGggYGh5ZHJhdGlvbkRhdGFgKSwgd2UgZXhwZWN0IHRoYXQgdGhlIHNlcnZlciB3aWxsIHNlbmRcbiAgLy8gdXAgdGhlIHByb3BlciBtYXRjaGVkIHJvdXRlcyBzbyB3ZSBkb24ndCB3YW50IHRvIHJ1biBsYXp5IGRpc2NvdmVyeSBvblxuICAvLyBpbml0aWFsIGh5ZHJhdGlvbiBhbmQgd2FudCB0byBoeWRyYXRlIGludG8gdGhlIHNwbGF0IHJvdXRlLlxuICBpZiAoaW5pdGlhbE1hdGNoZXMgJiYgIWluaXQuaHlkcmF0aW9uRGF0YSkge1xuICAgIGxldCBmb2dPZldhciA9IGNoZWNrRm9nT2ZXYXIoaW5pdGlhbE1hdGNoZXMsIGRhdGFSb3V0ZXMsIGluaXQuaGlzdG9yeS5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgaWYgKGZvZ09mV2FyLmFjdGl2ZSkge1xuICAgICAgaW5pdGlhbE1hdGNoZXMgPSBudWxsO1xuICAgIH1cbiAgfVxuICBsZXQgaW5pdGlhbGl6ZWQ7XG4gIGlmICghaW5pdGlhbE1hdGNoZXMpIHtcbiAgICBpbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGluaXRpYWxNYXRjaGVzID0gW107XG4gICAgLy8gSWYgcGFydGlhbCBoeWRyYXRpb24gYW5kIGZvZyBvZiB3YXIgaXMgZW5hYmxlZCwgd2Ugd2lsbCBiZSBydW5uaW5nXG4gICAgLy8gYHBhdGNoUm91dGVzT25OYXZpZ2F0aW9uYCBkdXJpbmcgaHlkcmF0aW9uIHNvIGluY2x1ZGUgYW55IHBhcnRpYWwgbWF0Y2hlcyBhc1xuICAgIC8vIHRoZSBpbml0aWFsIG1hdGNoZXMgc28gd2UgY2FuIHByb3Blcmx5IHJlbmRlciBgSHlkcmF0ZUZhbGxiYWNrYCdzXG4gICAgaWYgKGZ1dHVyZS52N19wYXJ0aWFsSHlkcmF0aW9uKSB7XG4gICAgICBsZXQgZm9nT2ZXYXIgPSBjaGVja0ZvZ09mV2FyKG51bGwsIGRhdGFSb3V0ZXMsIGluaXQuaGlzdG9yeS5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlICYmIGZvZ09mV2FyLm1hdGNoZXMpIHtcbiAgICAgICAgaW5pdGlhbE1hdGNoZXMgPSBmb2dPZldhci5tYXRjaGVzO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpbml0aWFsTWF0Y2hlcy5zb21lKG0gPT4gbS5yb3V0ZS5sYXp5KSkge1xuICAgIC8vIEFsbCBpbml0aWFsTWF0Y2hlcyBuZWVkIHRvIGJlIGxvYWRlZCBiZWZvcmUgd2UncmUgcmVhZHkuICBJZiB3ZSBoYXZlIGxhenlcbiAgICAvLyBmdW5jdGlvbnMgYXJvdW5kIHN0aWxsIHRoZW4gd2UnbGwgbmVlZCB0byBydW4gdGhlbSBpbiBpbml0aWFsaXplKClcbiAgICBpbml0aWFsaXplZCA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKCFpbml0aWFsTWF0Y2hlcy5zb21lKG0gPT4gbS5yb3V0ZS5sb2FkZXIpKSB7XG4gICAgLy8gSWYgd2UndmUgZ290IG5vIGxvYWRlcnMgdG8gcnVuLCB0aGVuIHdlJ3JlIGdvb2QgdG8gZ29cbiAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoZnV0dXJlLnY3X3BhcnRpYWxIeWRyYXRpb24pIHtcbiAgICAvLyBJZiBwYXJ0aWFsIGh5ZHJhdGlvbiBpcyBlbmFibGVkLCB3ZSdyZSBpbml0aWFsaXplZCBzbyBsb25nIGFzIHdlIHdlcmVcbiAgICAvLyBwcm92aWRlZCB3aXRoIGh5ZHJhdGlvbkRhdGEgZm9yIGV2ZXJ5IHJvdXRlIHdpdGggYSBsb2FkZXIsIGFuZCBubyBsb2FkZXJzXG4gICAgLy8gd2VyZSBtYXJrZWQgZm9yIGV4cGxpY2l0IGh5ZHJhdGlvblxuICAgIGxldCBsb2FkZXJEYXRhID0gaW5pdC5oeWRyYXRpb25EYXRhID8gaW5pdC5oeWRyYXRpb25EYXRhLmxvYWRlckRhdGEgOiBudWxsO1xuICAgIGxldCBlcnJvcnMgPSBpbml0Lmh5ZHJhdGlvbkRhdGEgPyBpbml0Lmh5ZHJhdGlvbkRhdGEuZXJyb3JzIDogbnVsbDtcbiAgICBsZXQgaXNSb3V0ZUluaXRpYWxpemVkID0gbSA9PiB7XG4gICAgICAvLyBObyBsb2FkZXIsIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZVxuICAgICAgaWYgKCFtLnJvdXRlLmxvYWRlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIEV4cGxpY2l0bHkgb3B0aW5nLWluIHRvIHJ1bm5pbmcgb24gaHlkcmF0aW9uXG4gICAgICBpZiAodHlwZW9mIG0ucm91dGUubG9hZGVyID09PSBcImZ1bmN0aW9uXCIgJiYgbS5yb3V0ZS5sb2FkZXIuaHlkcmF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGluaXRpYWxpemVkIGlmIGh5ZHJhdGVkIHdpdGggZGF0YSBvciBhbiBlcnJvclxuICAgICAgcmV0dXJuIGxvYWRlckRhdGEgJiYgbG9hZGVyRGF0YVttLnJvdXRlLmlkXSAhPT0gdW5kZWZpbmVkIHx8IGVycm9ycyAmJiBlcnJvcnNbbS5yb3V0ZS5pZF0gIT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8vIElmIGVycm9ycyBleGlzdCwgZG9uJ3QgY29uc2lkZXIgcm91dGVzIGJlbG93IHRoZSBib3VuZGFyeVxuICAgIGlmIChlcnJvcnMpIHtcbiAgICAgIGxldCBpZHggPSBpbml0aWFsTWF0Y2hlcy5maW5kSW5kZXgobSA9PiBlcnJvcnNbbS5yb3V0ZS5pZF0gIT09IHVuZGVmaW5lZCk7XG4gICAgICBpbml0aWFsaXplZCA9IGluaXRpYWxNYXRjaGVzLnNsaWNlKDAsIGlkeCArIDEpLmV2ZXJ5KGlzUm91dGVJbml0aWFsaXplZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluaXRpYWxpemVkID0gaW5pdGlhbE1hdGNoZXMuZXZlcnkoaXNSb3V0ZUluaXRpYWxpemVkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gV2l0aG91dCBwYXJ0aWFsIGh5ZHJhdGlvbiAtIHdlJ3JlIGluaXRpYWxpemVkIGlmIHdlIHdlcmUgcHJvdmlkZWQgYW55XG4gICAgLy8gaHlkcmF0aW9uRGF0YSAtIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIGNvbXBsZXRlXG4gICAgaW5pdGlhbGl6ZWQgPSBpbml0Lmh5ZHJhdGlvbkRhdGEgIT0gbnVsbDtcbiAgfVxuICBsZXQgcm91dGVyO1xuICBsZXQgc3RhdGUgPSB7XG4gICAgaGlzdG9yeUFjdGlvbjogaW5pdC5oaXN0b3J5LmFjdGlvbixcbiAgICBsb2NhdGlvbjogaW5pdC5oaXN0b3J5LmxvY2F0aW9uLFxuICAgIG1hdGNoZXM6IGluaXRpYWxNYXRjaGVzLFxuICAgIGluaXRpYWxpemVkLFxuICAgIG5hdmlnYXRpb246IElETEVfTkFWSUdBVElPTixcbiAgICAvLyBEb24ndCByZXN0b3JlIG9uIGluaXRpYWwgdXBkYXRlU3RhdGUoKSBpZiB3ZSB3ZXJlIFNTUidkXG4gICAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uOiBpbml0Lmh5ZHJhdGlvbkRhdGEgIT0gbnVsbCA/IGZhbHNlIDogbnVsbCxcbiAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IGZhbHNlLFxuICAgIHJldmFsaWRhdGlvbjogXCJpZGxlXCIsXG4gICAgbG9hZGVyRGF0YTogaW5pdC5oeWRyYXRpb25EYXRhICYmIGluaXQuaHlkcmF0aW9uRGF0YS5sb2FkZXJEYXRhIHx8IHt9LFxuICAgIGFjdGlvbkRhdGE6IGluaXQuaHlkcmF0aW9uRGF0YSAmJiBpbml0Lmh5ZHJhdGlvbkRhdGEuYWN0aW9uRGF0YSB8fCBudWxsLFxuICAgIGVycm9yczogaW5pdC5oeWRyYXRpb25EYXRhICYmIGluaXQuaHlkcmF0aW9uRGF0YS5lcnJvcnMgfHwgaW5pdGlhbEVycm9ycyxcbiAgICBmZXRjaGVyczogbmV3IE1hcCgpLFxuICAgIGJsb2NrZXJzOiBuZXcgTWFwKClcbiAgfTtcbiAgLy8gLS0gU3RhdGVmdWwgaW50ZXJuYWwgdmFyaWFibGVzIHRvIG1hbmFnZSBuYXZpZ2F0aW9ucyAtLVxuICAvLyBDdXJyZW50IG5hdmlnYXRpb24gaW4gcHJvZ3Jlc3MgKHRvIGJlIGNvbW1pdHRlZCBpbiBjb21wbGV0ZU5hdmlnYXRpb24pXG4gIGxldCBwZW5kaW5nQWN0aW9uID0gQWN0aW9uLlBvcDtcbiAgLy8gU2hvdWxkIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gcHJldmVudCB0aGUgc2Nyb2xsIHJlc2V0IGlmIHNjcm9sbCBjYW5ub3RcbiAgLy8gYmUgcmVzdG9yZWQ/XG4gIGxldCBwZW5kaW5nUHJldmVudFNjcm9sbFJlc2V0ID0gZmFsc2U7XG4gIC8vIEFib3J0Q29udHJvbGxlciBmb3IgdGhlIGFjdGl2ZSBuYXZpZ2F0aW9uXG4gIGxldCBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXI7XG4gIC8vIFNob3VsZCB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIGVuYWJsZSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uP1xuICBsZXQgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAvLyBTdG9yZSBhcHBsaWVkIHZpZXcgdHJhbnNpdGlvbnMgc28gd2UgY2FuIGFwcGx5IHRoZW0gb24gUE9QXG4gIGxldCBhcHBsaWVkVmlld1RyYW5zaXRpb25zID0gbmV3IE1hcCgpO1xuICAvLyBDbGVhbnVwIGZ1bmN0aW9uIGZvciBwZXJzaXN0aW5nIGFwcGxpZWQgdHJhbnNpdGlvbnMgdG8gc2Vzc2lvblN0b3JhZ2VcbiAgbGV0IHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lciA9IG51bGw7XG4gIC8vIFdlIHVzZSB0aGlzIHRvIGF2b2lkIHRvdWNoaW5nIGhpc3RvcnkgaW4gY29tcGxldGVOYXZpZ2F0aW9uIGlmIGFcbiAgLy8gcmV2YWxpZGF0aW9uIGlzIGVudGlyZWx5IHVuaW50ZXJydXB0ZWRcbiAgbGV0IGlzVW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbiA9IGZhbHNlO1xuICAvLyBVc2UgdGhpcyBpbnRlcm5hbCBmbGFnIHRvIGZvcmNlIHJldmFsaWRhdGlvbiBvZiBhbGwgbG9hZGVyczpcbiAgLy8gIC0gc3VibWlzc2lvbnMgKGNvbXBsZXRlZCBvciBpbnRlcnJ1cHRlZClcbiAgLy8gIC0gdXNlUmV2YWxpZGF0b3IoKVxuICAvLyAgLSBYLVJlbWl4LVJldmFsaWRhdGUgKGZyb20gcmVkaXJlY3QpXG4gIGxldCBpc1JldmFsaWRhdGlvblJlcXVpcmVkID0gZmFsc2U7XG4gIC8vIFVzZSB0aGlzIGludGVybmFsIGFycmF5IHRvIGNhcHR1cmUgcm91dGVzIHRoYXQgcmVxdWlyZSByZXZhbGlkYXRpb24gZHVlXG4gIC8vIHRvIGEgY2FuY2VsbGVkIGRlZmVycmVkIG9uIGFjdGlvbiBzdWJtaXNzaW9uXG4gIGxldCBjYW5jZWxsZWREZWZlcnJlZFJvdXRlcyA9IFtdO1xuICAvLyBVc2UgdGhpcyBpbnRlcm5hbCBhcnJheSB0byBjYXB0dXJlIGZldGNoZXIgbG9hZHMgdGhhdCB3ZXJlIGNhbmNlbGxlZCBieSBhblxuICAvLyBhY3Rpb24gbmF2aWdhdGlvbiBhbmQgcmVxdWlyZSByZXZhbGlkYXRpb25cbiAgbGV0IGNhbmNlbGxlZEZldGNoZXJMb2FkcyA9IG5ldyBTZXQoKTtcbiAgLy8gQWJvcnRDb250cm9sbGVycyBmb3IgYW55IGluLWZsaWdodCBmZXRjaGVyc1xuICBsZXQgZmV0Y2hDb250cm9sbGVycyA9IG5ldyBNYXAoKTtcbiAgLy8gVHJhY2sgbG9hZHMgYmFzZWQgb24gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgc3RhcnRlZFxuICBsZXQgaW5jcmVtZW50aW5nTG9hZElkID0gMDtcbiAgLy8gVHJhY2sgdGhlIG91dHN0YW5kaW5nIHBlbmRpbmcgbmF2aWdhdGlvbiBkYXRhIGxvYWQgdG8gYmUgY29tcGFyZWQgYWdhaW5zdFxuICAvLyB0aGUgZ2xvYmFsbHkgaW5jcmVtZW50aW5nIGxvYWQgd2hlbiBhIGZldGNoZXIgbG9hZCBsYW5kcyBhZnRlciBhIGNvbXBsZXRlZFxuICAvLyBuYXZpZ2F0aW9uXG4gIGxldCBwZW5kaW5nTmF2aWdhdGlvbkxvYWRJZCA9IC0xO1xuICAvLyBGZXRjaGVycyB0aGF0IHRyaWdnZXJlZCBkYXRhIHJlbG9hZHMgYXMgYSByZXN1bHQgb2YgdGhlaXIgYWN0aW9uc1xuICBsZXQgZmV0Y2hSZWxvYWRJZHMgPSBuZXcgTWFwKCk7XG4gIC8vIEZldGNoZXJzIHRoYXQgdHJpZ2dlcmVkIHJlZGlyZWN0IG5hdmlnYXRpb25zXG4gIGxldCBmZXRjaFJlZGlyZWN0SWRzID0gbmV3IFNldCgpO1xuICAvLyBNb3N0IHJlY2VudCBocmVmL21hdGNoIGZvciBmZXRjaGVyLmxvYWQgY2FsbHMgZm9yIGZldGNoZXJzXG4gIGxldCBmZXRjaExvYWRNYXRjaGVzID0gbmV3IE1hcCgpO1xuICAvLyBSZWYtY291bnQgbW91bnRlZCBmZXRjaGVycyBzbyB3ZSBrbm93IHdoZW4gaXQncyBvayB0byBjbGVhbiB0aGVtIHVwXG4gIGxldCBhY3RpdmVGZXRjaGVycyA9IG5ldyBNYXAoKTtcbiAgLy8gRmV0Y2hlcnMgdGhhdCBoYXZlIHJlcXVlc3RlZCBhIGRlbGV0ZSB3aGVuIHVzaW5nIHY3X2ZldGNoZXJQZXJzaXN0LFxuICAvLyB0aGV5J2xsIGJlIG9mZmljaWFsbHkgcmVtb3ZlZCBhZnRlciB0aGV5IHJldHVybiB0byBpZGxlXG4gIGxldCBkZWxldGVkRmV0Y2hlcnMgPSBuZXcgU2V0KCk7XG4gIC8vIFN0b3JlIERlZmVycmVkRGF0YSBpbnN0YW5jZXMgZm9yIGFjdGl2ZSByb3V0ZSBtYXRjaGVzLiAgV2hlbiBhXG4gIC8vIHJvdXRlIGxvYWRlciByZXR1cm5zIGRlZmVyKCkgd2Ugc3RpY2sgb25lIGluIGhlcmUuICBUaGVuLCB3aGVuIGEgbmVzdGVkXG4gIC8vIHByb21pc2UgcmVzb2x2ZXMgd2UgdXBkYXRlIGxvYWRlckRhdGEuICBJZiBhIG5ldyBuYXZpZ2F0aW9uIHN0YXJ0cyB3ZVxuICAvLyBjYW5jZWwgYWN0aXZlIGRlZmVycmVkcyBmb3IgZWxpbWluYXRlZCByb3V0ZXMuXG4gIGxldCBhY3RpdmVEZWZlcnJlZHMgPSBuZXcgTWFwKCk7XG4gIC8vIFN0b3JlIGJsb2NrZXIgZnVuY3Rpb25zIGluIGEgc2VwYXJhdGUgTWFwIG91dHNpZGUgb2Ygcm91dGVyIHN0YXRlIHNpbmNlXG4gIC8vIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIFVJIHN0YXRlIGlmIHRoZXkgY2hhbmdlXG4gIGxldCBibG9ja2VyRnVuY3Rpb25zID0gbmV3IE1hcCgpO1xuICAvLyBNYXAgb2YgcGVuZGluZyBwYXRjaFJvdXRlc09uTmF2aWdhdGlvbigpIHByb21pc2VzIChrZXllZCBieSBwYXRoL21hdGNoZXMpIHNvXG4gIC8vIHRoYXQgd2Ugb25seSBraWNrIHRoZW0gb2ZmIG9uY2UgZm9yIGEgZ2l2ZW4gY29tYm9cbiAgbGV0IHBlbmRpbmdQYXRjaFJvdXRlcyA9IG5ldyBNYXAoKTtcbiAgLy8gRmxhZyB0byBpZ25vcmUgdGhlIG5leHQgaGlzdG9yeSB1cGRhdGUsIHNvIHdlIGNhbiByZXZlcnQgdGhlIFVSTCBjaGFuZ2Ugb25cbiAgLy8gYSBQT1AgbmF2aWdhdGlvbiB0aGF0IHdhcyBibG9ja2VkIGJ5IHRoZSB1c2VyIHdpdGhvdXQgdG91Y2hpbmcgcm91dGVyIHN0YXRlXG4gIGxldCB1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUgPSB1bmRlZmluZWQ7XG4gIC8vIEluaXRpYWxpemUgdGhlIHJvdXRlciwgYWxsIHNpZGUgZWZmZWN0cyBzaG91bGQgYmUga2lja2VkIG9mZiBmcm9tIGhlcmUuXG4gIC8vIEltcGxlbWVudGVkIGFzIGEgRmx1ZW50IEFQSSBmb3IgZWFzZSBvZjpcbiAgLy8gICBsZXQgcm91dGVyID0gY3JlYXRlUm91dGVyKGluaXQpLmluaXRpYWxpemUoKTtcbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICAvLyBJZiBoaXN0b3J5IGluZm9ybXMgdXMgb2YgYSBQT1AgbmF2aWdhdGlvbiwgc3RhcnQgdGhlIG5hdmlnYXRpb24gYnV0IGRvIG5vdCB1cGRhdGVcbiAgICAvLyBzdGF0ZS4gIFdlJ2xsIHVwZGF0ZSBvdXIgb3duIHN0YXRlIG9uY2UgdGhlIG5hdmlnYXRpb24gY29tcGxldGVzXG4gICAgdW5saXN0ZW5IaXN0b3J5ID0gaW5pdC5oaXN0b3J5Lmxpc3RlbihfcmVmID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGFjdGlvbjogaGlzdG9yeUFjdGlvbixcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIGRlbHRhXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIC8vIElnbm9yZSB0aGlzIGV2ZW50IGlmIGl0IHdhcyBqdXN0IHVzIHJlc2V0dGluZyB0aGUgVVJMIGZyb20gYVxuICAgICAgLy8gYmxvY2tlZCBQT1AgbmF2aWdhdGlvblxuICAgICAgaWYgKHVuYmxvY2tCbG9ja2VySGlzdG9yeVVwZGF0ZSkge1xuICAgICAgICB1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUoKTtcbiAgICAgICAgdW5ibG9ja0Jsb2NrZXJIaXN0b3J5VXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3YXJuaW5nKGJsb2NrZXJGdW5jdGlvbnMuc2l6ZSA9PT0gMCB8fCBkZWx0YSAhPSBudWxsLCBcIllvdSBhcmUgdHJ5aW5nIHRvIHVzZSBhIGJsb2NrZXIgb24gYSBQT1AgbmF2aWdhdGlvbiB0byBhIGxvY2F0aW9uIFwiICsgXCJ0aGF0IHdhcyBub3QgY3JlYXRlZCBieSBAcmVtaXgtcnVuL3JvdXRlci4gVGhpcyB3aWxsIGZhaWwgc2lsZW50bHkgaW4gXCIgKyBcInByb2R1Y3Rpb24uIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgYXJlIG5hdmlnYXRpbmcgb3V0c2lkZSB0aGUgcm91dGVyIFwiICsgXCJ2aWEgYHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZWAvYHdpbmRvdy5sb2NhdGlvbi5oYXNoYCBpbnN0ZWFkIG9mIHVzaW5nIFwiICsgXCJyb3V0ZXIgbmF2aWdhdGlvbiBBUElzLiAgVGhpcyBjYW4gYWxzbyBoYXBwZW4gaWYgeW91IGFyZSB1c2luZyBcIiArIFwiY3JlYXRlSGFzaFJvdXRlciBhbmQgdGhlIHVzZXIgbWFudWFsbHkgY2hhbmdlcyB0aGUgVVJMLlwiKTtcbiAgICAgIGxldCBibG9ja2VyS2V5ID0gc2hvdWxkQmxvY2tOYXZpZ2F0aW9uKHtcbiAgICAgICAgY3VycmVudExvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgICAgbmV4dExvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgaGlzdG9yeUFjdGlvblxuICAgICAgfSk7XG4gICAgICBpZiAoYmxvY2tlcktleSAmJiBkZWx0YSAhPSBudWxsKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIFVSTCB0byBtYXRjaCB0aGUgY3VycmVudCBVSSwgYnV0IGRvbid0IHVwZGF0ZSByb3V0ZXIgc3RhdGVcbiAgICAgICAgbGV0IG5leHRIaXN0b3J5VXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgIHVuYmxvY2tCbG9ja2VySGlzdG9yeVVwZGF0ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICBpbml0Lmhpc3RvcnkuZ28oZGVsdGEgKiAtMSk7XG4gICAgICAgIC8vIFB1dCB0aGUgYmxvY2tlciBpbnRvIGEgYmxvY2tlZCBzdGF0ZVxuICAgICAgICB1cGRhdGVCbG9ja2VyKGJsb2NrZXJLZXksIHtcbiAgICAgICAgICBzdGF0ZTogXCJibG9ja2VkXCIsXG4gICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgcHJvY2VlZCgpIHtcbiAgICAgICAgICAgIHVwZGF0ZUJsb2NrZXIoYmxvY2tlcktleSwge1xuICAgICAgICAgICAgICBzdGF0ZTogXCJwcm9jZWVkaW5nXCIsXG4gICAgICAgICAgICAgIHByb2NlZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmVzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgbG9jYXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gUmUtZG8gdGhlIHNhbWUgUE9QIG5hdmlnYXRpb24gd2UganVzdCBibG9ja2VkLCBhZnRlciB0aGUgdXJsXG4gICAgICAgICAgICAvLyByZXN0b3JhdGlvbiBpcyBhbHNvIGNvbXBsZXRlLiAgU2VlOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlbWl4LXJ1bi9yZWFjdC1yb3V0ZXIvaXNzdWVzLzExNjEzXG4gICAgICAgICAgICBuZXh0SGlzdG9yeVVwZGF0ZVByb21pc2UudGhlbigoKSA9PiBpbml0Lmhpc3RvcnkuZ28oZGVsdGEpKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc2V0KCkge1xuICAgICAgICAgICAgbGV0IGJsb2NrZXJzID0gbmV3IE1hcChzdGF0ZS5ibG9ja2Vycyk7XG4gICAgICAgICAgICBibG9ja2Vycy5zZXQoYmxvY2tlcktleSwgSURMRV9CTE9DS0VSKTtcbiAgICAgICAgICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgICAgICAgICAgYmxvY2tlcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGFydE5hdmlnYXRpb24oaGlzdG9yeUFjdGlvbiwgbG9jYXRpb24pO1xuICAgIH0pO1xuICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgIC8vIEZJWE1FOiBUaGlzIGZlZWxzIGdyb3NzLiAgSG93IGNhbiB3ZSBjbGVhbnVwIHRoZSBsaW5lcyBiZXR3ZWVuXG4gICAgICAvLyBzY3JvbGxSZXN0b3JhdGlvbi9hcHBsaWVkVHJhbnNpdGlvbnMgcGVyc2lzdGFuY2U/XG4gICAgICByZXN0b3JlQXBwbGllZFRyYW5zaXRpb25zKHJvdXRlcldpbmRvdywgYXBwbGllZFZpZXdUcmFuc2l0aW9ucyk7XG4gICAgICBsZXQgX3NhdmVBcHBsaWVkVHJhbnNpdGlvbnMgPSAoKSA9PiBwZXJzaXN0QXBwbGllZFRyYW5zaXRpb25zKHJvdXRlcldpbmRvdywgYXBwbGllZFZpZXdUcmFuc2l0aW9ucyk7XG4gICAgICByb3V0ZXJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIF9zYXZlQXBwbGllZFRyYW5zaXRpb25zKTtcbiAgICAgIHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lciA9ICgpID0+IHJvdXRlcldpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgX3NhdmVBcHBsaWVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgICAvLyBLaWNrIG9mZiBpbml0aWFsIGRhdGEgbG9hZCBpZiBuZWVkZWQuICBVc2UgUG9wIHRvIGF2b2lkIG1vZGlmeWluZyBoaXN0b3J5XG4gICAgLy8gTm90ZSB3ZSBkb24ndCBkbyBhbnkgaGFuZGxpbmcgb2YgbGF6eSBoZXJlLiAgRm9yIFNQQSdzIGl0J2xsIGdldCBoYW5kbGVkXG4gICAgLy8gaW4gdGhlIG5vcm1hbCBuYXZpZ2F0aW9uIGZsb3cuICBGb3IgU1NSIGl0J3MgZXhwZWN0ZWQgdGhhdCBsYXp5IG1vZHVsZXMgYXJlXG4gICAgLy8gcmVzb2x2ZWQgcHJpb3IgdG8gcm91dGVyIGNyZWF0aW9uIHNpbmNlIHdlIGNhbid0IGdvIGludG8gYSBmYWxsYmFja0VsZW1lbnRcbiAgICAvLyBVSSBmb3IgU1NSJ2QgYXBwc1xuICAgIGlmICghc3RhdGUuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHN0YXJ0TmF2aWdhdGlvbihBY3Rpb24uUG9wLCBzdGF0ZS5sb2NhdGlvbiwge1xuICAgICAgICBpbml0aWFsSHlkcmF0aW9uOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfVxuICAvLyBDbGVhbiB1cCBhIHJvdXRlciBhbmQgaXQncyBzaWRlIGVmZmVjdHNcbiAgZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICBpZiAodW5saXN0ZW5IaXN0b3J5KSB7XG4gICAgICB1bmxpc3Rlbkhpc3RvcnkoKTtcbiAgICB9XG4gICAgaWYgKHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgcmVtb3ZlUGFnZUhpZGVFdmVudExpc3RlbmVyKCk7XG4gICAgfVxuICAgIHN1YnNjcmliZXJzLmNsZWFyKCk7XG4gICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyICYmIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlci5hYm9ydCgpO1xuICAgIHN0YXRlLmZldGNoZXJzLmZvckVhY2goKF8sIGtleSkgPT4gZGVsZXRlRmV0Y2hlcihrZXkpKTtcbiAgICBzdGF0ZS5ibG9ja2Vycy5mb3JFYWNoKChfLCBrZXkpID0+IGRlbGV0ZUJsb2NrZXIoa2V5KSk7XG4gIH1cbiAgLy8gU3Vic2NyaWJlIHRvIHN0YXRlIHVwZGF0ZXMgZm9yIHRoZSByb3V0ZXJcbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGZuKSB7XG4gICAgc3Vic2NyaWJlcnMuYWRkKGZuKTtcbiAgICByZXR1cm4gKCkgPT4gc3Vic2NyaWJlcnMuZGVsZXRlKGZuKTtcbiAgfVxuICAvLyBVcGRhdGUgb3VyIHN0YXRlIGFuZCBub3RpZnkgdGhlIGNhbGxpbmcgY29udGV4dCBvZiB0aGUgY2hhbmdlXG4gIGZ1bmN0aW9uIHVwZGF0ZVN0YXRlKG5ld1N0YXRlLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBzdGF0ZSA9IF9leHRlbmRzKHt9LCBzdGF0ZSwgbmV3U3RhdGUpO1xuICAgIC8vIFByZXAgZmV0Y2hlciBjbGVhbnVwIHNvIHdlIGNhbiB0ZWxsIHRoZSBVSSB3aGljaCBmZXRjaGVyIGRhdGEgZW50cmllc1xuICAgIC8vIGNhbiBiZSByZW1vdmVkXG4gICAgbGV0IGNvbXBsZXRlZEZldGNoZXJzID0gW107XG4gICAgbGV0IGRlbGV0ZWRGZXRjaGVyc0tleXMgPSBbXTtcbiAgICBpZiAoZnV0dXJlLnY3X2ZldGNoZXJQZXJzaXN0KSB7XG4gICAgICBzdGF0ZS5mZXRjaGVycy5mb3JFYWNoKChmZXRjaGVyLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGZldGNoZXIuc3RhdGUgPT09IFwiaWRsZVwiKSB7XG4gICAgICAgICAgaWYgKGRlbGV0ZWRGZXRjaGVycy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgLy8gVW5tb3VudGVkIGZyb20gdGhlIFVJIGFuZCBjYW4gYmUgdG90YWxseSByZW1vdmVkXG4gICAgICAgICAgICBkZWxldGVkRmV0Y2hlcnNLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmV0dXJuZWQgdG8gaWRsZSBidXQgc3RpbGwgbW91bnRlZCBpbiB0aGUgVUksIHNvIHNlbWktcmVtYWlucyBmb3JcbiAgICAgICAgICAgIC8vIHJldmFsaWRhdGlvbnMgYW5kIHN1Y2hcbiAgICAgICAgICAgIGNvbXBsZXRlZEZldGNoZXJzLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBJdGVyYXRlIG92ZXIgYSBsb2NhbCBjb3B5IHNvIHRoYXQgaWYgZmx1c2hTeW5jIGlzIHVzZWQgYW5kIHdlIGVuZCB1cFxuICAgIC8vIHJlbW92aW5nIGFuZCBhZGRpbmcgYSBuZXcgc3Vic2NyaWJlciBkdWUgdG8gdGhlIHVzZUNhbGxiYWNrIGRlcGVuZGVuY2llcyxcbiAgICAvLyB3ZSBkb24ndCBnZXQgb3Vyc2VsdmVzIGludG8gYSBsb29wIGNhbGxpbmcgdGhlIG5ldyBzdWJzY3JpYmVyIGltbWVkaWF0ZWx5XG4gICAgWy4uLnN1YnNjcmliZXJzXS5mb3JFYWNoKHN1YnNjcmliZXIgPT4gc3Vic2NyaWJlcihzdGF0ZSwge1xuICAgICAgZGVsZXRlZEZldGNoZXJzOiBkZWxldGVkRmV0Y2hlcnNLZXlzLFxuICAgICAgdW5zdGFibGVfdmlld1RyYW5zaXRpb25PcHRzOiBvcHRzLnZpZXdUcmFuc2l0aW9uT3B0cyxcbiAgICAgIHVuc3RhYmxlX2ZsdXNoU3luYzogb3B0cy5mbHVzaFN5bmMgPT09IHRydWVcbiAgICB9KSk7XG4gICAgLy8gUmVtb3ZlIGlkbGUgZmV0Y2hlcnMgZnJvbSBzdGF0ZSBzaW5jZSB3ZSBvbmx5IGNhcmUgYWJvdXQgaW4tZmxpZ2h0IGZldGNoZXJzLlxuICAgIGlmIChmdXR1cmUudjdfZmV0Y2hlclBlcnNpc3QpIHtcbiAgICAgIGNvbXBsZXRlZEZldGNoZXJzLmZvckVhY2goa2V5ID0+IHN0YXRlLmZldGNoZXJzLmRlbGV0ZShrZXkpKTtcbiAgICAgIGRlbGV0ZWRGZXRjaGVyc0tleXMuZm9yRWFjaChrZXkgPT4gZGVsZXRlRmV0Y2hlcihrZXkpKTtcbiAgICB9XG4gIH1cbiAgLy8gQ29tcGxldGUgYSBuYXZpZ2F0aW9uIHJldHVybmluZyB0aGUgc3RhdGUubmF2aWdhdGlvbiBiYWNrIHRvIHRoZSBJRExFX05BVklHQVRJT05cbiAgLy8gYW5kIHNldHRpbmcgc3RhdGUuW2hpc3RvcnlBY3Rpb24vbG9jYXRpb24vbWF0Y2hlc10gdG8gdGhlIG5ldyByb3V0ZS5cbiAgLy8gLSBMb2NhdGlvbiBpcyBhIHJlcXVpcmVkIHBhcmFtXG4gIC8vIC0gTmF2aWdhdGlvbiB3aWxsIGFsd2F5cyBiZSBzZXQgdG8gSURMRV9OQVZJR0FUSU9OXG4gIC8vIC0gQ2FuIHBhc3MgYW55IG90aGVyIHN0YXRlIGluIG5ld1N0YXRlXG4gIGZ1bmN0aW9uIGNvbXBsZXRlTmF2aWdhdGlvbihsb2NhdGlvbiwgbmV3U3RhdGUsIF90ZW1wKSB7XG4gICAgdmFyIF9sb2NhdGlvbiRzdGF0ZSwgX2xvY2F0aW9uJHN0YXRlMjtcbiAgICBsZXQge1xuICAgICAgZmx1c2hTeW5jXG4gICAgfSA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wO1xuICAgIC8vIERlZHVjZSBpZiB3ZSdyZSBpbiBhIGxvYWRpbmcvYWN0aW9uUmVsb2FkIHN0YXRlOlxuICAgIC8vIC0gV2UgaGF2ZSBjb21taXR0ZWQgYWN0aW9uRGF0YSBpbiB0aGUgc3RvcmVcbiAgICAvLyAtIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gd2FzIGEgbXV0YXRpb24gc3VibWlzc2lvblxuICAgIC8vIC0gV2UncmUgcGFzdCB0aGUgc3VibWl0dGluZyBzdGF0ZSBhbmQgaW50byB0aGUgbG9hZGluZyBzdGF0ZVxuICAgIC8vIC0gVGhlIGxvY2F0aW9uIGJlaW5nIGxvYWRlZCBpcyBub3QgdGhlIHJlc3VsdCBvZiBhIHJlZGlyZWN0XG4gICAgbGV0IGlzQWN0aW9uUmVsb2FkID0gc3RhdGUuYWN0aW9uRGF0YSAhPSBudWxsICYmIHN0YXRlLm5hdmlnYXRpb24uZm9ybU1ldGhvZCAhPSBudWxsICYmIGlzTXV0YXRpb25NZXRob2Qoc3RhdGUubmF2aWdhdGlvbi5mb3JtTWV0aG9kKSAmJiBzdGF0ZS5uYXZpZ2F0aW9uLnN0YXRlID09PSBcImxvYWRpbmdcIiAmJiAoKF9sb2NhdGlvbiRzdGF0ZSA9IGxvY2F0aW9uLnN0YXRlKSA9PSBudWxsID8gdm9pZCAwIDogX2xvY2F0aW9uJHN0YXRlLl9pc1JlZGlyZWN0KSAhPT0gdHJ1ZTtcbiAgICBsZXQgYWN0aW9uRGF0YTtcbiAgICBpZiAobmV3U3RhdGUuYWN0aW9uRGF0YSkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKG5ld1N0YXRlLmFjdGlvbkRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWN0aW9uRGF0YSA9IG5ld1N0YXRlLmFjdGlvbkRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFbXB0eSBhY3Rpb25EYXRhIC0+IGNsZWFyIHByaW9yIGFjdGlvbkRhdGEgZHVlIHRvIGFuIGFjdGlvbiBlcnJvclxuICAgICAgICBhY3Rpb25EYXRhID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQWN0aW9uUmVsb2FkKSB7XG4gICAgICAvLyBLZWVwIHRoZSBjdXJyZW50IGRhdGEgaWYgd2UncmUgd3JhcHBpbmcgdXAgdGhlIGFjdGlvbiByZWxvYWRcbiAgICAgIGFjdGlvbkRhdGEgPSBzdGF0ZS5hY3Rpb25EYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDbGVhciBhY3Rpb25EYXRhIG9uIGFueSBvdGhlciBjb21wbGV0ZWQgbmF2aWdhdGlvbnNcbiAgICAgIGFjdGlvbkRhdGEgPSBudWxsO1xuICAgIH1cbiAgICAvLyBBbHdheXMgcHJlc2VydmUgYW55IGV4aXN0aW5nIGxvYWRlckRhdGEgZnJvbSByZS11c2VkIHJvdXRlc1xuICAgIGxldCBsb2FkZXJEYXRhID0gbmV3U3RhdGUubG9hZGVyRGF0YSA/IG1lcmdlTG9hZGVyRGF0YShzdGF0ZS5sb2FkZXJEYXRhLCBuZXdTdGF0ZS5sb2FkZXJEYXRhLCBuZXdTdGF0ZS5tYXRjaGVzIHx8IFtdLCBuZXdTdGF0ZS5lcnJvcnMpIDogc3RhdGUubG9hZGVyRGF0YTtcbiAgICAvLyBPbiBhIHN1Y2Nlc3NmdWwgbmF2aWdhdGlvbiB3ZSBjYW4gYXNzdW1lIHdlIGdvdCB0aHJvdWdoIGFsbCBibG9ja2Vyc1xuICAgIC8vIHNvIHdlIGNhbiBzdGFydCBmcmVzaFxuICAgIGxldCBibG9ja2VycyA9IHN0YXRlLmJsb2NrZXJzO1xuICAgIGlmIChibG9ja2Vycy5zaXplID4gMCkge1xuICAgICAgYmxvY2tlcnMgPSBuZXcgTWFwKGJsb2NrZXJzKTtcbiAgICAgIGJsb2NrZXJzLmZvckVhY2goKF8sIGspID0+IGJsb2NrZXJzLnNldChrLCBJRExFX0JMT0NLRVIpKTtcbiAgICB9XG4gICAgLy8gQWx3YXlzIHJlc3BlY3QgdGhlIHVzZXIgZmxhZy4gIE90aGVyd2lzZSBkb24ndCByZXNldCBvbiBtdXRhdGlvblxuICAgIC8vIHN1Ym1pc3Npb24gbmF2aWdhdGlvbnMgdW5sZXNzIHRoZXkgcmVkaXJlY3RcbiAgICBsZXQgcHJldmVudFNjcm9sbFJlc2V0ID0gcGVuZGluZ1ByZXZlbnRTY3JvbGxSZXNldCA9PT0gdHJ1ZSB8fCBzdGF0ZS5uYXZpZ2F0aW9uLmZvcm1NZXRob2QgIT0gbnVsbCAmJiBpc011dGF0aW9uTWV0aG9kKHN0YXRlLm5hdmlnYXRpb24uZm9ybU1ldGhvZCkgJiYgKChfbG9jYXRpb24kc3RhdGUyID0gbG9jYXRpb24uc3RhdGUpID09IG51bGwgPyB2b2lkIDAgOiBfbG9jYXRpb24kc3RhdGUyLl9pc1JlZGlyZWN0KSAhPT0gdHJ1ZTtcbiAgICAvLyBDb21taXQgYW55IGluLWZsaWdodCByb3V0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgSE1SIHJldmFsaWRhdGlvbiBcIm5hdmlnYXRpb25cIlxuICAgIGlmIChpbkZsaWdodERhdGFSb3V0ZXMpIHtcbiAgICAgIGRhdGFSb3V0ZXMgPSBpbkZsaWdodERhdGFSb3V0ZXM7XG4gICAgICBpbkZsaWdodERhdGFSb3V0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpc1VuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24pIDsgZWxzZSBpZiAocGVuZGluZ0FjdGlvbiA9PT0gQWN0aW9uLlBvcCkgOyBlbHNlIGlmIChwZW5kaW5nQWN0aW9uID09PSBBY3Rpb24uUHVzaCkge1xuICAgICAgaW5pdC5oaXN0b3J5LnB1c2gobG9jYXRpb24sIGxvY2F0aW9uLnN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKHBlbmRpbmdBY3Rpb24gPT09IEFjdGlvbi5SZXBsYWNlKSB7XG4gICAgICBpbml0Lmhpc3RvcnkucmVwbGFjZShsb2NhdGlvbiwgbG9jYXRpb24uc3RhdGUpO1xuICAgIH1cbiAgICBsZXQgdmlld1RyYW5zaXRpb25PcHRzO1xuICAgIC8vIE9uIFBPUCwgZW5hYmxlIHRyYW5zaXRpb25zIGlmIHRoZXkgd2VyZSBlbmFibGVkIG9uIHRoZSBvcmlnaW5hbCBuYXZpZ2F0aW9uXG4gICAgaWYgKHBlbmRpbmdBY3Rpb24gPT09IEFjdGlvbi5Qb3ApIHtcbiAgICAgIC8vIEZvcndhcmQgdGFrZXMgcHJlY2VkZW5jZSBzbyB0aGV5IGJlaGF2ZSBsaWtlIHRoZSBvcmlnaW5hbCBuYXZpZ2F0aW9uXG4gICAgICBsZXQgcHJpb3JQYXRocyA9IGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuZ2V0KHN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIGlmIChwcmlvclBhdGhzICYmIHByaW9yUGF0aHMuaGFzKGxvY2F0aW9uLnBhdGhuYW1lKSkge1xuICAgICAgICB2aWV3VHJhbnNpdGlvbk9wdHMgPSB7XG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgICAgICBuZXh0TG9jYXRpb246IGxvY2F0aW9uXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuaGFzKGxvY2F0aW9uLnBhdGhuYW1lKSkge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcHJldmlvdXMgZm9yd2FyZCBuYXYsIGFzc3VtZSB3ZSdyZSBwb3BwaW5nIGJhY2sgdG9cbiAgICAgICAgLy8gdGhlIG5ldyBsb2NhdGlvbiBhbmQgZW5hYmxlIGlmIHRoYXQgbG9jYXRpb24gcHJldmlvdXNseSBlbmFibGVkXG4gICAgICAgIHZpZXdUcmFuc2l0aW9uT3B0cyA9IHtcbiAgICAgICAgICBjdXJyZW50TG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICAgIG5leHRMb2NhdGlvbjogc3RhdGUubG9jYXRpb25cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQpIHtcbiAgICAgIC8vIFN0b3JlIHRoZSBhcHBsaWVkIHRyYW5zaXRpb24gb24gUFVTSC9SRVBMQUNFXG4gICAgICBsZXQgdG9QYXRocyA9IGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuZ2V0KHN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIGlmICh0b1BhdGhzKSB7XG4gICAgICAgIHRvUGF0aHMuYWRkKGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvUGF0aHMgPSBuZXcgU2V0KFtsb2NhdGlvbi5wYXRobmFtZV0pO1xuICAgICAgICBhcHBsaWVkVmlld1RyYW5zaXRpb25zLnNldChzdGF0ZS5sb2NhdGlvbi5wYXRobmFtZSwgdG9QYXRocyk7XG4gICAgICB9XG4gICAgICB2aWV3VHJhbnNpdGlvbk9wdHMgPSB7XG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgICAgIG5leHRMb2NhdGlvbjogbG9jYXRpb25cbiAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZVN0YXRlKF9leHRlbmRzKHt9LCBuZXdTdGF0ZSwge1xuICAgICAgYWN0aW9uRGF0YSxcbiAgICAgIGxvYWRlckRhdGEsXG4gICAgICBoaXN0b3J5QWN0aW9uOiBwZW5kaW5nQWN0aW9uLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBpbml0aWFsaXplZDogdHJ1ZSxcbiAgICAgIG5hdmlnYXRpb246IElETEVfTkFWSUdBVElPTixcbiAgICAgIHJldmFsaWRhdGlvbjogXCJpZGxlXCIsXG4gICAgICByZXN0b3JlU2Nyb2xsUG9zaXRpb246IGdldFNhdmVkU2Nyb2xsUG9zaXRpb24obG9jYXRpb24sIG5ld1N0YXRlLm1hdGNoZXMgfHwgc3RhdGUubWF0Y2hlcyksXG4gICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICBibG9ja2Vyc1xuICAgIH0pLCB7XG4gICAgICB2aWV3VHJhbnNpdGlvbk9wdHMsXG4gICAgICBmbHVzaFN5bmM6IGZsdXNoU3luYyA9PT0gdHJ1ZVxuICAgIH0pO1xuICAgIC8vIFJlc2V0IHN0YXRlZnVsIG5hdmlnYXRpb24gdmFyc1xuICAgIHBlbmRpbmdBY3Rpb24gPSBBY3Rpb24uUG9wO1xuICAgIHBlbmRpbmdQcmV2ZW50U2Nyb2xsUmVzZXQgPSBmYWxzZTtcbiAgICBwZW5kaW5nVmlld1RyYW5zaXRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgaXNVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uID0gZmFsc2U7XG4gICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCA9IGZhbHNlO1xuICAgIGNhbmNlbGxlZERlZmVycmVkUm91dGVzID0gW107XG4gIH1cbiAgLy8gVHJpZ2dlciBhIG5hdmlnYXRpb24gZXZlbnQsIHdoaWNoIGNhbiBlaXRoZXIgYmUgYSBudW1lcmljYWwgUE9QIG9yIGEgUFVTSFxuICAvLyByZXBsYWNlIHdpdGggYW4gb3B0aW9uYWwgc3VibWlzc2lvblxuICBhc3luYyBmdW5jdGlvbiBuYXZpZ2F0ZSh0bywgb3B0cykge1xuICAgIGlmICh0eXBlb2YgdG8gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGluaXQuaGlzdG9yeS5nbyh0byk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVRvKHN0YXRlLmxvY2F0aW9uLCBzdGF0ZS5tYXRjaGVzLCBiYXNlbmFtZSwgZnV0dXJlLnY3X3ByZXBlbmRCYXNlbmFtZSwgdG8sIGZ1dHVyZS52N19yZWxhdGl2ZVNwbGF0UGF0aCwgb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5mcm9tUm91dGVJZCwgb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5yZWxhdGl2ZSk7XG4gICAgbGV0IHtcbiAgICAgIHBhdGgsXG4gICAgICBzdWJtaXNzaW9uLFxuICAgICAgZXJyb3JcbiAgICB9ID0gbm9ybWFsaXplTmF2aWdhdGVPcHRpb25zKGZ1dHVyZS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCBmYWxzZSwgbm9ybWFsaXplZFBhdGgsIG9wdHMpO1xuICAgIGxldCBjdXJyZW50TG9jYXRpb24gPSBzdGF0ZS5sb2NhdGlvbjtcbiAgICBsZXQgbmV4dExvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oc3RhdGUubG9jYXRpb24sIHBhdGgsIG9wdHMgJiYgb3B0cy5zdGF0ZSk7XG4gICAgLy8gV2hlbiB1c2luZyBuYXZpZ2F0ZSBhcyBhIFBVU0gvUkVQTEFDRSB3ZSBhcmVuJ3QgcmVhZGluZyBhbiBhbHJlYWR5LWVuY29kZWRcbiAgICAvLyBVUkwgZnJvbSB3aW5kb3cubG9jYXRpb24sIHNvIHdlIG5lZWQgdG8gZW5jb2RlIGl0IGhlcmUgc28gdGhlIGJlaGF2aW9yXG4gICAgLy8gcmVtYWlucyB0aGUgc2FtZSBhcyBQT1AgYW5kIG5vbi1kYXRhLXJvdXRlciB1c2FnZXMuICBuZXcgVVJMKCkgZG9lcyBhbGxcbiAgICAvLyB0aGUgc2FtZSBlbmNvZGluZyB3ZSdkIGdldCBmcm9tIGEgaGlzdG9yeS5wdXNoU3RhdGUvd2luZG93LmxvY2F0aW9uIHJlYWRcbiAgICAvLyB3aXRob3V0IGhhdmluZyB0byB0b3VjaCBoaXN0b3J5XG4gICAgbmV4dExvY2F0aW9uID0gX2V4dGVuZHMoe30sIG5leHRMb2NhdGlvbiwgaW5pdC5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKG5leHRMb2NhdGlvbikpO1xuICAgIGxldCB1c2VyUmVwbGFjZSA9IG9wdHMgJiYgb3B0cy5yZXBsYWNlICE9IG51bGwgPyBvcHRzLnJlcGxhY2UgOiB1bmRlZmluZWQ7XG4gICAgbGV0IGhpc3RvcnlBY3Rpb24gPSBBY3Rpb24uUHVzaDtcbiAgICBpZiAodXNlclJlcGxhY2UgPT09IHRydWUpIHtcbiAgICAgIGhpc3RvcnlBY3Rpb24gPSBBY3Rpb24uUmVwbGFjZTtcbiAgICB9IGVsc2UgaWYgKHVzZXJSZXBsYWNlID09PSBmYWxzZSkgOyBlbHNlIGlmIChzdWJtaXNzaW9uICE9IG51bGwgJiYgaXNNdXRhdGlvbk1ldGhvZChzdWJtaXNzaW9uLmZvcm1NZXRob2QpICYmIHN1Ym1pc3Npb24uZm9ybUFjdGlvbiA9PT0gc3RhdGUubG9jYXRpb24ucGF0aG5hbWUgKyBzdGF0ZS5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgIC8vIEJ5IGRlZmF1bHQgb24gc3VibWlzc2lvbnMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gd2UgUkVQTEFDRSBzbyB0aGF0XG4gICAgICAvLyB1c2VycyBkb24ndCBoYXZlIHRvIGRvdWJsZS1jbGljayB0aGUgYmFjayBidXR0b24gdG8gZ2V0IHRvIHRoZSBwcmlvclxuICAgICAgLy8gbG9jYXRpb24uICBJZiB0aGUgdXNlciByZWRpcmVjdHMgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gZnJvbSB0aGVcbiAgICAgIC8vIGFjdGlvbi9sb2FkZXIgdGhpcyB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZSByZWRpcmVjdCB3aWxsIGJlIGEgUFVTSFxuICAgICAgaGlzdG9yeUFjdGlvbiA9IEFjdGlvbi5SZXBsYWNlO1xuICAgIH1cbiAgICBsZXQgcHJldmVudFNjcm9sbFJlc2V0ID0gb3B0cyAmJiBcInByZXZlbnRTY3JvbGxSZXNldFwiIGluIG9wdHMgPyBvcHRzLnByZXZlbnRTY3JvbGxSZXNldCA9PT0gdHJ1ZSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgZmx1c2hTeW5jID0gKG9wdHMgJiYgb3B0cy51bnN0YWJsZV9mbHVzaFN5bmMpID09PSB0cnVlO1xuICAgIGxldCBibG9ja2VyS2V5ID0gc2hvdWxkQmxvY2tOYXZpZ2F0aW9uKHtcbiAgICAgIGN1cnJlbnRMb2NhdGlvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICB9KTtcbiAgICBpZiAoYmxvY2tlcktleSkge1xuICAgICAgLy8gUHV0IHRoZSBibG9ja2VyIGludG8gYSBibG9ja2VkIHN0YXRlXG4gICAgICB1cGRhdGVCbG9ja2VyKGJsb2NrZXJLZXksIHtcbiAgICAgICAgc3RhdGU6IFwiYmxvY2tlZFwiLFxuICAgICAgICBsb2NhdGlvbjogbmV4dExvY2F0aW9uLFxuICAgICAgICBwcm9jZWVkKCkge1xuICAgICAgICAgIHVwZGF0ZUJsb2NrZXIoYmxvY2tlcktleSwge1xuICAgICAgICAgICAgc3RhdGU6IFwicHJvY2VlZGluZ1wiLFxuICAgICAgICAgICAgcHJvY2VlZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxvY2F0aW9uOiBuZXh0TG9jYXRpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBTZW5kIHRoZSBzYW1lIG5hdmlnYXRpb24gdGhyb3VnaFxuICAgICAgICAgIG5hdmlnYXRlKHRvLCBvcHRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzZXQoKSB7XG4gICAgICAgICAgbGV0IGJsb2NrZXJzID0gbmV3IE1hcChzdGF0ZS5ibG9ja2Vycyk7XG4gICAgICAgICAgYmxvY2tlcnMuc2V0KGJsb2NrZXJLZXksIElETEVfQkxPQ0tFUik7XG4gICAgICAgICAgdXBkYXRlU3RhdGUoe1xuICAgICAgICAgICAgYmxvY2tlcnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzdGFydE5hdmlnYXRpb24oaGlzdG9yeUFjdGlvbiwgbmV4dExvY2F0aW9uLCB7XG4gICAgICBzdWJtaXNzaW9uLFxuICAgICAgLy8gU2VuZCB0aHJvdWdoIHRoZSBmb3JtRGF0YSBzZXJpYWxpemF0aW9uIGVycm9yIGlmIHdlIGhhdmUgb25lIHNvIHdlIGNhblxuICAgICAgLy8gcmVuZGVyIGF0IHRoZSByaWdodCBlcnJvciBib3VuZGFyeSBhZnRlciB3ZSBtYXRjaCByb3V0ZXNcbiAgICAgIHBlbmRpbmdFcnJvcjogZXJyb3IsXG4gICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICByZXBsYWNlOiBvcHRzICYmIG9wdHMucmVwbGFjZSxcbiAgICAgIGVuYWJsZVZpZXdUcmFuc2l0aW9uOiBvcHRzICYmIG9wdHMudW5zdGFibGVfdmlld1RyYW5zaXRpb24sXG4gICAgICBmbHVzaFN5bmNcbiAgICB9KTtcbiAgfVxuICAvLyBSZXZhbGlkYXRlIGFsbCBjdXJyZW50IGxvYWRlcnMuICBJZiBhIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3Mgb3IgaWYgdGhpc1xuICAvLyBpcyBpbnRlcnJ1cHRlZCBieSBhIG5hdmlnYXRpb24sIGFsbG93IHRoaXMgdG8gXCJzdWNjZWVkXCIgYnkgY2FsbGluZyBhbGxcbiAgLy8gbG9hZGVycyBkdXJpbmcgdGhlIG5leHQgbG9hZGVyIHJvdW5kXG4gIGZ1bmN0aW9uIHJldmFsaWRhdGUoKSB7XG4gICAgaW50ZXJydXB0QWN0aXZlTG9hZHMoKTtcbiAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICByZXZhbGlkYXRpb246IFwibG9hZGluZ1wiXG4gICAgfSk7XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IHN1Ym1pdHRpbmcgYW4gYWN0aW9uLCB3ZSBkb24ndCBuZWVkIHRvIHN0YXJ0IGEgbmV3XG4gICAgLy8gbmF2aWdhdGlvbiwgd2UnbGwganVzdCBsZXQgdGhlIGZvbGxvdyB1cCBsb2FkZXIgZXhlY3V0aW9uIGNhbGwgYWxsIGxvYWRlcnNcbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJzdWJtaXR0aW5nXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGluIGFuIGlkbGUgc3RhdGUsIHN0YXJ0IGEgbmV3IG5hdmlnYXRpb24gZm9yIHRoZSBjdXJyZW50XG4gICAgLy8gYWN0aW9uL2xvY2F0aW9uIGFuZCBtYXJrIGl0IGFzIHVuaW50ZXJydXB0ZWQsIHdoaWNoIHdpbGwgc2tpcCB0aGUgaGlzdG9yeVxuICAgIC8vIHVwZGF0ZSBpbiBjb21wbGV0ZU5hdmlnYXRpb25cbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJpZGxlXCIpIHtcbiAgICAgIHN0YXJ0TmF2aWdhdGlvbihzdGF0ZS5oaXN0b3J5QWN0aW9uLCBzdGF0ZS5sb2NhdGlvbiwge1xuICAgICAgICBzdGFydFVuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb246IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIGlmIHdlJ3JlIGN1cnJlbnRseSBpbiBhIGxvYWRpbmcgc3RhdGUsIGp1c3Qgc3RhcnQgYSBuZXdcbiAgICAvLyBuYXZpZ2F0aW9uIHRvIHRoZSBuYXZpZ2F0aW9uLmxvY2F0aW9uIGJ1dCBkbyBub3QgdHJpZ2dlciBhbiB1bmludGVycnVwdGVkXG4gICAgLy8gcmV2YWxpZGF0aW9uIHNvIHRoYXQgaGlzdG9yeSBjb3JyZWN0bHkgdXBkYXRlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGNvbXBsZXRlc1xuICAgIHN0YXJ0TmF2aWdhdGlvbihwZW5kaW5nQWN0aW9uIHx8IHN0YXRlLmhpc3RvcnlBY3Rpb24sIHN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24sIHtcbiAgICAgIG92ZXJyaWRlTmF2aWdhdGlvbjogc3RhdGUubmF2aWdhdGlvbixcbiAgICAgIC8vIFByb3h5IHRocm91Z2ggYW55IHJlbmRpbmcgdmlldyB0cmFuc2l0aW9uXG4gICAgICBlbmFibGVWaWV3VHJhbnNpdGlvbjogcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRW5hYmxlZCA9PT0gdHJ1ZVxuICAgIH0pO1xuICB9XG4gIC8vIFN0YXJ0IGEgbmF2aWdhdGlvbiB0byB0aGUgZ2l2ZW4gYWN0aW9uL2xvY2F0aW9uLiAgQ2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhXG4gIC8vIG92ZXJyaWRlTmF2aWdhdGlvbiB3aGljaCB3aWxsIG92ZXJyaWRlIHRoZSBub3JtYWxMb2FkIGluIHRoZSBjYXNlIG9mIGEgcmVkaXJlY3RcbiAgLy8gbmF2aWdhdGlvblxuICBhc3luYyBmdW5jdGlvbiBzdGFydE5hdmlnYXRpb24oaGlzdG9yeUFjdGlvbiwgbG9jYXRpb24sIG9wdHMpIHtcbiAgICAvLyBBYm9ydCBhbnkgaW4tcHJvZ3Jlc3MgbmF2aWdhdGlvbnMgYW5kIHN0YXJ0IGEgbmV3IG9uZS4gVW5zZXQgYW55IG9uZ29pbmdcbiAgICAvLyB1bmludGVycnVwdGVkIHJldmFsaWRhdGlvbnMgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLCBzaW5jZSB3ZSB3YW50IHRoaXNcbiAgICAvLyBuZXcgbmF2aWdhdGlvbiB0byB1cGRhdGUgaGlzdG9yeSBub3JtYWxseVxuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciAmJiBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgIHBlbmRpbmdBY3Rpb24gPSBoaXN0b3J5QWN0aW9uO1xuICAgIGlzVW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbiA9IChvcHRzICYmIG9wdHMuc3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKSA9PT0gdHJ1ZTtcbiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBldmVyeSB0aW1lIHdlIHN0YXJ0IGEgbmV3IG5hdmlnYXRpb24sXG4gICAgLy8gYW5kIHRyYWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHJlc2V0IHNjcm9sbCBvbiBjb21wbGV0aW9uXG4gICAgc2F2ZVNjcm9sbFBvc2l0aW9uKHN0YXRlLmxvY2F0aW9uLCBzdGF0ZS5tYXRjaGVzKTtcbiAgICBwZW5kaW5nUHJldmVudFNjcm9sbFJlc2V0ID0gKG9wdHMgJiYgb3B0cy5wcmV2ZW50U2Nyb2xsUmVzZXQpID09PSB0cnVlO1xuICAgIHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgPSAob3B0cyAmJiBvcHRzLmVuYWJsZVZpZXdUcmFuc2l0aW9uKSA9PT0gdHJ1ZTtcbiAgICBsZXQgcm91dGVzVG9Vc2UgPSBpbkZsaWdodERhdGFSb3V0ZXMgfHwgZGF0YVJvdXRlcztcbiAgICBsZXQgbG9hZGluZ05hdmlnYXRpb24gPSBvcHRzICYmIG9wdHMub3ZlcnJpZGVOYXZpZ2F0aW9uO1xuICAgIGxldCBtYXRjaGVzID0gbWF0Y2hSb3V0ZXMocm91dGVzVG9Vc2UsIGxvY2F0aW9uLCBiYXNlbmFtZSk7XG4gICAgbGV0IGZsdXNoU3luYyA9IChvcHRzICYmIG9wdHMuZmx1c2hTeW5jKSA9PT0gdHJ1ZTtcbiAgICBsZXQgZm9nT2ZXYXIgPSBjaGVja0ZvZ09mV2FyKG1hdGNoZXMsIHJvdXRlc1RvVXNlLCBsb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgaWYgKGZvZ09mV2FyLmFjdGl2ZSAmJiBmb2dPZldhci5tYXRjaGVzKSB7XG4gICAgICBtYXRjaGVzID0gZm9nT2ZXYXIubWF0Y2hlcztcbiAgICB9XG4gICAgLy8gU2hvcnQgY2lyY3VpdCB3aXRoIGEgNDA0IG9uIHRoZSByb290IGVycm9yIGJvdW5kYXJ5IGlmIHdlIG1hdGNoIG5vdGhpbmdcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIGVycm9yLFxuICAgICAgICBub3RGb3VuZE1hdGNoZXMsXG4gICAgICAgIHJvdXRlXG4gICAgICB9ID0gaGFuZGxlTmF2aWdhdGlvbmFsNDA0KGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIGNvbXBsZXRlTmF2aWdhdGlvbihsb2NhdGlvbiwge1xuICAgICAgICBtYXRjaGVzOiBub3RGb3VuZE1hdGNoZXMsXG4gICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBbcm91dGUuaWRdOiBlcnJvclxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZsdXNoU3luY1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFNob3J0IGNpcmN1aXQgaWYgaXQncyBvbmx5IGEgaGFzaCBjaGFuZ2UgYW5kIG5vdCBhIHJldmFsaWRhdGlvbiBvclxuICAgIC8vIG11dGF0aW9uIHN1Ym1pc3Npb24uXG4gICAgLy9cbiAgICAvLyBJZ25vcmUgb24gaW5pdGlhbCBwYWdlIGxvYWRzIGJlY2F1c2Ugc2luY2UgdGhlIGluaXRpYWwgbG9hZCB3aWxsIGFsd2F5c1xuICAgIC8vIGJlIFwic2FtZSBoYXNoXCIuICBGb3IgZXhhbXBsZSwgb24gL3BhZ2UjaGFzaCBhbmQgc3VibWl0IGEgPEZvcm0gbWV0aG9kPVwicG9zdFwiPlxuICAgIC8vIHdoaWNoIHdpbGwgZGVmYXVsdCB0byBhIG5hdmlnYXRpb24gdG8gL3BhZ2VcbiAgICBpZiAoc3RhdGUuaW5pdGlhbGl6ZWQgJiYgIWlzUmV2YWxpZGF0aW9uUmVxdWlyZWQgJiYgaXNIYXNoQ2hhbmdlT25seShzdGF0ZS5sb2NhdGlvbiwgbG9jYXRpb24pICYmICEob3B0cyAmJiBvcHRzLnN1Ym1pc3Npb24gJiYgaXNNdXRhdGlvbk1ldGhvZChvcHRzLnN1Ym1pc3Npb24uZm9ybU1ldGhvZCkpKSB7XG4gICAgICBjb21wbGV0ZU5hdmlnYXRpb24obG9jYXRpb24sIHtcbiAgICAgICAgbWF0Y2hlc1xuICAgICAgfSwge1xuICAgICAgICBmbHVzaFN5bmNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBjb250cm9sbGVyL1JlcXVlc3QgZm9yIHRoaXMgbmF2aWdhdGlvblxuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsZXQgcmVxdWVzdCA9IGNyZWF0ZUNsaWVudFNpZGVSZXF1ZXN0KGluaXQuaGlzdG9yeSwgbG9jYXRpb24sIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlci5zaWduYWwsIG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uKTtcbiAgICBsZXQgcGVuZGluZ0FjdGlvblJlc3VsdDtcbiAgICBpZiAob3B0cyAmJiBvcHRzLnBlbmRpbmdFcnJvcikge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHBlbmRpbmdFcnJvciwgaXQgbWVhbnMgdGhlIHVzZXIgYXR0ZW1wdGVkIGEgR0VUIHN1Ym1pc3Npb25cbiAgICAgIC8vIHdpdGggYmluYXJ5IEZvcm1EYXRhIHNvIGFzc2lnbiBoZXJlIGFuZCBza2lwIHRvIGhhbmRsZUxvYWRlcnMuICBUaGF0XG4gICAgICAvLyB3YXkgd2UgaGFuZGxlIGNhbGxpbmcgbG9hZGVycyBhYm92ZSB0aGUgYm91bmRhcnkgZXRjLiAgSXQncyBub3QgcmVhbGx5XG4gICAgICAvLyBkaWZmZXJlbnQgZnJvbSBhbiBhY3Rpb25FcnJvciBpbiB0aGF0IHNlbnNlLlxuICAgICAgcGVuZGluZ0FjdGlvblJlc3VsdCA9IFtmaW5kTmVhcmVzdEJvdW5kYXJ5KG1hdGNoZXMpLnJvdXRlLmlkLCB7XG4gICAgICAgIHR5cGU6IFJlc3VsdFR5cGUuZXJyb3IsXG4gICAgICAgIGVycm9yOiBvcHRzLnBlbmRpbmdFcnJvclxuICAgICAgfV07XG4gICAgfSBlbHNlIGlmIChvcHRzICYmIG9wdHMuc3VibWlzc2lvbiAmJiBpc011dGF0aW9uTWV0aG9kKG9wdHMuc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkge1xuICAgICAgLy8gQ2FsbCBhY3Rpb24gaWYgd2UgcmVjZWl2ZWQgYW4gYWN0aW9uIHN1Ym1pc3Npb25cbiAgICAgIGxldCBhY3Rpb25SZXN1bHQgPSBhd2FpdCBoYW5kbGVBY3Rpb24ocmVxdWVzdCwgbG9jYXRpb24sIG9wdHMuc3VibWlzc2lvbiwgbWF0Y2hlcywgZm9nT2ZXYXIuYWN0aXZlLCB7XG4gICAgICAgIHJlcGxhY2U6IG9wdHMucmVwbGFjZSxcbiAgICAgICAgZmx1c2hTeW5jXG4gICAgICB9KTtcbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuc2hvcnRDaXJjdWl0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UgcmVjZWl2ZWQgYSA0MDQgZnJvbSBoYW5kbGVBY3Rpb24sIGl0J3MgYmVjYXVzZSB3ZSBjb3VsZG4ndCBsYXppbHlcbiAgICAgIC8vIGRpc2NvdmVyIHRoZSBkZXN0aW5hdGlvbiByb3V0ZSBzbyB3ZSBkb24ndCB3YW50IHRvIGNhbGwgbG9hZGVyc1xuICAgICAgaWYgKGFjdGlvblJlc3VsdC5wZW5kaW5nQWN0aW9uUmVzdWx0KSB7XG4gICAgICAgIGxldCBbcm91dGVJZCwgcmVzdWx0XSA9IGFjdGlvblJlc3VsdC5wZW5kaW5nQWN0aW9uUmVzdWx0O1xuICAgICAgICBpZiAoaXNFcnJvclJlc3VsdChyZXN1bHQpICYmIGlzUm91dGVFcnJvclJlc3BvbnNlKHJlc3VsdC5lcnJvcikgJiYgcmVzdWx0LmVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyID0gbnVsbDtcbiAgICAgICAgICBjb21wbGV0ZU5hdmlnYXRpb24obG9jYXRpb24sIHtcbiAgICAgICAgICAgIG1hdGNoZXM6IGFjdGlvblJlc3VsdC5tYXRjaGVzLFxuICAgICAgICAgICAgbG9hZGVyRGF0YToge30sXG4gICAgICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICAgICAgW3JvdXRlSWRdOiByZXN1bHQuZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1hdGNoZXMgPSBhY3Rpb25SZXN1bHQubWF0Y2hlcyB8fCBtYXRjaGVzO1xuICAgICAgcGVuZGluZ0FjdGlvblJlc3VsdCA9IGFjdGlvblJlc3VsdC5wZW5kaW5nQWN0aW9uUmVzdWx0O1xuICAgICAgbG9hZGluZ05hdmlnYXRpb24gPSBnZXRMb2FkaW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgb3B0cy5zdWJtaXNzaW9uKTtcbiAgICAgIGZsdXNoU3luYyA9IGZhbHNlO1xuICAgICAgLy8gTm8gbmVlZCB0byBkbyBmb2cgb2Ygd2FyIG1hdGNoaW5nIGFnYWluIG9uIGxvYWRlciBleGVjdXRpb25cbiAgICAgIGZvZ09mV2FyLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgLy8gQ3JlYXRlIGEgR0VUIHJlcXVlc3QgZm9yIHRoZSBsb2FkZXJzXG4gICAgICByZXF1ZXN0ID0gY3JlYXRlQ2xpZW50U2lkZVJlcXVlc3QoaW5pdC5oaXN0b3J5LCByZXF1ZXN0LnVybCwgcmVxdWVzdC5zaWduYWwpO1xuICAgIH1cbiAgICAvLyBDYWxsIGxvYWRlcnNcbiAgICBsZXQge1xuICAgICAgc2hvcnRDaXJjdWl0ZWQsXG4gICAgICBtYXRjaGVzOiB1cGRhdGVkTWF0Y2hlcyxcbiAgICAgIGxvYWRlckRhdGEsXG4gICAgICBlcnJvcnNcbiAgICB9ID0gYXdhaXQgaGFuZGxlTG9hZGVycyhyZXF1ZXN0LCBsb2NhdGlvbiwgbWF0Y2hlcywgZm9nT2ZXYXIuYWN0aXZlLCBsb2FkaW5nTmF2aWdhdGlvbiwgb3B0cyAmJiBvcHRzLnN1Ym1pc3Npb24sIG9wdHMgJiYgb3B0cy5mZXRjaGVyU3VibWlzc2lvbiwgb3B0cyAmJiBvcHRzLnJlcGxhY2UsIG9wdHMgJiYgb3B0cy5pbml0aWFsSHlkcmF0aW9uID09PSB0cnVlLCBmbHVzaFN5bmMsIHBlbmRpbmdBY3Rpb25SZXN1bHQpO1xuICAgIGlmIChzaG9ydENpcmN1aXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDbGVhbiB1cCBub3cgdGhhdCB0aGUgYWN0aW9uL2xvYWRlcnMgaGF2ZSBjb21wbGV0ZWQuICBEb24ndCBjbGVhbiB1cCBpZlxuICAgIC8vIHdlIHNob3J0IGNpcmN1aXRlZCBiZWNhdXNlIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciB3aWxsIGhhdmUgYWxyZWFkeVxuICAgIC8vIGJlZW4gYXNzaWduZWQgdG8gYSBuZXcgY29udHJvbGxlciBmb3IgdGhlIG5leHQgbmF2aWdhdGlvblxuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciA9IG51bGw7XG4gICAgY29tcGxldGVOYXZpZ2F0aW9uKGxvY2F0aW9uLCBfZXh0ZW5kcyh7XG4gICAgICBtYXRjaGVzOiB1cGRhdGVkTWF0Y2hlcyB8fCBtYXRjaGVzXG4gICAgfSwgZ2V0QWN0aW9uRGF0YUZvckNvbW1pdChwZW5kaW5nQWN0aW9uUmVzdWx0KSwge1xuICAgICAgbG9hZGVyRGF0YSxcbiAgICAgIGVycm9yc1xuICAgIH0pKTtcbiAgfVxuICAvLyBDYWxsIHRoZSBhY3Rpb24gbWF0Y2hlZCBieSB0aGUgbGVhZiByb3V0ZSBmb3IgdGhpcyBuYXZpZ2F0aW9uIGFuZCBoYW5kbGVcbiAgLy8gcmVkaXJlY3RzL2Vycm9yc1xuICBhc3luYyBmdW5jdGlvbiBoYW5kbGVBY3Rpb24ocmVxdWVzdCwgbG9jYXRpb24sIHN1Ym1pc3Npb24sIG1hdGNoZXMsIGlzRm9nT2ZXYXIsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIGludGVycnVwdEFjdGl2ZUxvYWRzKCk7XG4gICAgLy8gUHV0IHVzIGluIGEgc3VibWl0dGluZyBzdGF0ZVxuICAgIGxldCBuYXZpZ2F0aW9uID0gZ2V0U3VibWl0dGluZ05hdmlnYXRpb24obG9jYXRpb24sIHN1Ym1pc3Npb24pO1xuICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgIG5hdmlnYXRpb25cbiAgICB9LCB7XG4gICAgICBmbHVzaFN5bmM6IG9wdHMuZmx1c2hTeW5jID09PSB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGlzRm9nT2ZXYXIpIHtcbiAgICAgIGxldCBkaXNjb3ZlclJlc3VsdCA9IGF3YWl0IGRpc2NvdmVyUm91dGVzKG1hdGNoZXMsIGxvY2F0aW9uLnBhdGhuYW1lLCByZXF1ZXN0LnNpZ25hbCk7XG4gICAgICBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzaG9ydENpcmN1aXRlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChkaXNjb3ZlclJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBib3VuZGFyeUlkLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgIH0gPSBoYW5kbGVEaXNjb3ZlclJvdXRlRXJyb3IobG9jYXRpb24ucGF0aG5hbWUsIGRpc2NvdmVyUmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYXRjaGVzOiBkaXNjb3ZlclJlc3VsdC5wYXJ0aWFsTWF0Y2hlcyxcbiAgICAgICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0OiBbYm91bmRhcnlJZCwge1xuICAgICAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoIWRpc2NvdmVyUmVzdWx0Lm1hdGNoZXMpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBub3RGb3VuZE1hdGNoZXMsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgcm91dGVcbiAgICAgICAgfSA9IGhhbmRsZU5hdmlnYXRpb25hbDQwNChsb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWF0Y2hlczogbm90Rm91bmRNYXRjaGVzLFxuICAgICAgICAgIHBlbmRpbmdBY3Rpb25SZXN1bHQ6IFtyb3V0ZS5pZCwge1xuICAgICAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdGNoZXMgPSBkaXNjb3ZlclJlc3VsdC5tYXRjaGVzO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxsIG91ciBhY3Rpb24gYW5kIGdldCB0aGUgcmVzdWx0XG4gICAgbGV0IHJlc3VsdDtcbiAgICBsZXQgYWN0aW9uTWF0Y2ggPSBnZXRUYXJnZXRNYXRjaChtYXRjaGVzLCBsb2NhdGlvbik7XG4gICAgaWYgKCFhY3Rpb25NYXRjaC5yb3V0ZS5hY3Rpb24gJiYgIWFjdGlvbk1hdGNoLnJvdXRlLmxhenkpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgICAgZXJyb3I6IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA1LCB7XG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgcm91dGVJZDogYWN0aW9uTWF0Y2gucm91dGUuaWRcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgY2FsbERhdGFTdHJhdGVneShcImFjdGlvblwiLCBzdGF0ZSwgcmVxdWVzdCwgW2FjdGlvbk1hdGNoXSwgbWF0Y2hlcywgbnVsbCk7XG4gICAgICByZXN1bHQgPSByZXN1bHRzW2FjdGlvbk1hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2hvcnRDaXJjdWl0ZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUmVkaXJlY3RSZXN1bHQocmVzdWx0KSkge1xuICAgICAgbGV0IHJlcGxhY2U7XG4gICAgICBpZiAob3B0cyAmJiBvcHRzLnJlcGxhY2UgIT0gbnVsbCkge1xuICAgICAgICByZXBsYWNlID0gb3B0cy5yZXBsYWNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgZGlkbid0IGV4cGxpY2l0eSBpbmRpY2F0ZSByZXBsYWNlIGJlaGF2aW9yLCByZXBsYWNlIGlmXG4gICAgICAgIC8vIHdlIHJlZGlyZWN0ZWQgdG8gdGhlIGV4YWN0IHNhbWUgbG9jYXRpb24gd2UncmUgY3VycmVudGx5IGF0IHRvIGF2b2lkXG4gICAgICAgIC8vIGRvdWJsZSBiYWNrLWJ1dHRvbnNcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gbm9ybWFsaXplUmVkaXJlY3RMb2NhdGlvbihyZXN1bHQucmVzcG9uc2UuaGVhZGVycy5nZXQoXCJMb2NhdGlvblwiKSwgbmV3IFVSTChyZXF1ZXN0LnVybCksIGJhc2VuYW1lKTtcbiAgICAgICAgcmVwbGFjZSA9IGxvY2F0aW9uID09PSBzdGF0ZS5sb2NhdGlvbi5wYXRobmFtZSArIHN0YXRlLmxvY2F0aW9uLnNlYXJjaDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKHJlcXVlc3QsIHJlc3VsdCwgdHJ1ZSwge1xuICAgICAgICBzdWJtaXNzaW9uLFxuICAgICAgICByZXBsYWNlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNob3J0Q2lyY3VpdGVkOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoaXNEZWZlcnJlZFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwMCwge1xuICAgICAgICB0eXBlOiBcImRlZmVyLWFjdGlvblwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgLy8gU3RvcmUgb2ZmIHRoZSBwZW5kaW5nIGVycm9yIC0gd2UgdXNlIGl0IHRvIGRldGVybWluZSB3aGljaCBsb2FkZXJzXG4gICAgICAvLyB0byBjYWxsIGFuZCB3aWxsIGNvbW1pdCBpdCB3aGVuIHdlIGNvbXBsZXRlIHRoZSBuYXZpZ2F0aW9uXG4gICAgICBsZXQgYm91bmRhcnlNYXRjaCA9IGZpbmROZWFyZXN0Qm91bmRhcnkobWF0Y2hlcywgYWN0aW9uTWF0Y2gucm91dGUuaWQpO1xuICAgICAgLy8gQnkgZGVmYXVsdCwgYWxsIHN1Ym1pc3Npb25zIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFyZSBSRVBMQUNFXG4gICAgICAvLyBuYXZpZ2F0aW9ucywgYnV0IGlmIHRoZSBhY3Rpb24gdGhyZXcgYW4gZXJyb3IgdGhhdCdsbCBiZSByZW5kZXJlZCBpblxuICAgICAgLy8gYW4gZXJyb3JFbGVtZW50LCB3ZSBmYWxsIGJhY2sgdG8gUFVTSCBzbyB0aGF0IHRoZSB1c2VyIGNhbiB1c2UgdGhlXG4gICAgICAvLyBiYWNrIGJ1dHRvbiB0byBnZXQgYmFjayB0byB0aGUgcHJlLXN1Ym1pc3Npb24gZm9ybSBsb2NhdGlvbiB0byB0cnlcbiAgICAgIC8vIGFnYWluXG4gICAgICBpZiAoKG9wdHMgJiYgb3B0cy5yZXBsYWNlKSAhPT0gdHJ1ZSkge1xuICAgICAgICBwZW5kaW5nQWN0aW9uID0gQWN0aW9uLlB1c2g7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0OiBbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZCwgcmVzdWx0XVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hdGNoZXMsXG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0OiBbYWN0aW9uTWF0Y2gucm91dGUuaWQsIHJlc3VsdF1cbiAgICB9O1xuICB9XG4gIC8vIENhbGwgYWxsIGFwcGxpY2FibGUgbG9hZGVycyBmb3IgdGhlIGdpdmVuIG1hdGNoZXMsIGhhbmRsaW5nIHJlZGlyZWN0cyxcbiAgLy8gZXJyb3JzLCBldGMuXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUxvYWRlcnMocmVxdWVzdCwgbG9jYXRpb24sIG1hdGNoZXMsIGlzRm9nT2ZXYXIsIG92ZXJyaWRlTmF2aWdhdGlvbiwgc3VibWlzc2lvbiwgZmV0Y2hlclN1Ym1pc3Npb24sIHJlcGxhY2UsIGluaXRpYWxIeWRyYXRpb24sIGZsdXNoU3luYywgcGVuZGluZ0FjdGlvblJlc3VsdCkge1xuICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHJpZ2h0IG5hdmlnYXRpb24gd2Ugd2FudCB0byB1c2UgZm9yIGRhdGEgbG9hZGluZ1xuICAgIGxldCBsb2FkaW5nTmF2aWdhdGlvbiA9IG92ZXJyaWRlTmF2aWdhdGlvbiB8fCBnZXRMb2FkaW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgc3VibWlzc2lvbik7XG4gICAgLy8gSWYgdGhpcyB3YXMgYSByZWRpcmVjdCBmcm9tIGFuIGFjdGlvbiB3ZSBkb24ndCBoYXZlIGEgXCJzdWJtaXNzaW9uXCIgYnV0XG4gICAgLy8gd2UgaGF2ZSBpdCBvbiB0aGUgbG9hZGluZyBuYXZpZ2F0aW9uIHNvIHVzZSB0aGF0IGlmIGF2YWlsYWJsZVxuICAgIGxldCBhY3RpdmVTdWJtaXNzaW9uID0gc3VibWlzc2lvbiB8fCBmZXRjaGVyU3VibWlzc2lvbiB8fCBnZXRTdWJtaXNzaW9uRnJvbU5hdmlnYXRpb24obG9hZGluZ05hdmlnYXRpb24pO1xuICAgIC8vIElmIHRoaXMgaXMgYW4gdW5pbnRlcnJ1cHRlZCByZXZhbGlkYXRpb24sIHdlIHJlbWFpbiBpbiBvdXIgY3VycmVudCBpZGxlXG4gICAgLy8gc3RhdGUuICBJZiBub3QsIHdlIG5lZWQgdG8gc3dpdGNoIHRvIG91ciBsb2FkaW5nIHN0YXRlIGFuZCBsb2FkIGRhdGEsXG4gICAgLy8gcHJlc2VydmluZyBhbnkgbmV3IGFjdGlvbiBkYXRhIG9yIGV4aXN0aW5nIGFjdGlvbiBkYXRhIChpbiB0aGUgY2FzZSBvZlxuICAgIC8vIGEgcmV2YWxpZGF0aW9uIGludGVycnVwdGluZyBhbiBhY3Rpb25SZWxvYWQpXG4gICAgLy8gSWYgd2UgaGF2ZSBwYXJ0aWFsSHlkcmF0aW9uIGVuYWJsZWQsIHRoZW4gZG9uJ3QgdXBkYXRlIHRoZSBzdGF0ZSBmb3IgdGhlXG4gICAgLy8gaW5pdGlhbCBkYXRhIGxvYWQgc2luY2UgaXQncyBub3QgYSBcIm5hdmlnYXRpb25cIlxuICAgIGxldCBzaG91bGRVcGRhdGVOYXZpZ2F0aW9uU3RhdGUgPSAhaXNVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uICYmICghZnV0dXJlLnY3X3BhcnRpYWxIeWRyYXRpb24gfHwgIWluaXRpYWxIeWRyYXRpb24pO1xuICAgIC8vIFdoZW4gZm9nIG9mIHdhciBpcyBlbmFibGVkLCB3ZSBlbnRlciBvdXIgYGxvYWRpbmdgIHN0YXRlIGVhcmxpZXIgc28gd2VcbiAgICAvLyBjYW4gZGlzY292ZXIgbmV3IHJvdXRlcyBkdXJpbmcgdGhlIGBsb2FkaW5nYCBzdGF0ZS4gIFdlIHNraXAgdGhpcyBpZlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgcnVuIGFjdGlvbnMgc2luY2Ugd2Ugd291bGQgaGF2ZSBkb25lIG91ciBtYXRjaGluZyBhbHJlYWR5LlxuICAgIC8vIElmIHRoZSBjaGlsZHJlbigpIGZ1bmN0aW9uIHRocmV3IHRoZW4sIHdlIHdhbnQgdG8gcHJvY2VlZCB3aXRoIHRoZVxuICAgIC8vIHBhcnRpYWwgbWF0Y2hlcyBpdCBkaXNjb3ZlcmVkLlxuICAgIGlmIChpc0ZvZ09mV2FyKSB7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlTmF2aWdhdGlvblN0YXRlKSB7XG4gICAgICAgIGxldCBhY3Rpb25EYXRhID0gZ2V0VXBkYXRlZEFjdGlvbkRhdGEocGVuZGluZ0FjdGlvblJlc3VsdCk7XG4gICAgICAgIHVwZGF0ZVN0YXRlKF9leHRlbmRzKHtcbiAgICAgICAgICBuYXZpZ2F0aW9uOiBsb2FkaW5nTmF2aWdhdGlvblxuICAgICAgICB9LCBhY3Rpb25EYXRhICE9PSB1bmRlZmluZWQgPyB7XG4gICAgICAgICAgYWN0aW9uRGF0YVxuICAgICAgICB9IDoge30pLCB7XG4gICAgICAgICAgZmx1c2hTeW5jXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbGV0IGRpc2NvdmVyUmVzdWx0ID0gYXdhaXQgZGlzY292ZXJSb3V0ZXMobWF0Y2hlcywgbG9jYXRpb24ucGF0aG5hbWUsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGlmIChkaXNjb3ZlclJlc3VsdC50eXBlID09PSBcImFib3J0ZWRcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNob3J0Q2lyY3VpdGVkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGRpc2NvdmVyUmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGJvdW5kYXJ5SWQsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgfSA9IGhhbmRsZURpc2NvdmVyUm91dGVFcnJvcihsb2NhdGlvbi5wYXRobmFtZSwgZGlzY292ZXJSZXN1bHQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1hdGNoZXM6IGRpc2NvdmVyUmVzdWx0LnBhcnRpYWxNYXRjaGVzLFxuICAgICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAgIGVycm9yczoge1xuICAgICAgICAgICAgW2JvdW5kYXJ5SWRdOiBlcnJvclxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoIWRpc2NvdmVyUmVzdWx0Lm1hdGNoZXMpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBub3RGb3VuZE1hdGNoZXMsXG4gICAgICAgICAgcm91dGVcbiAgICAgICAgfSA9IGhhbmRsZU5hdmlnYXRpb25hbDQwNChsb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWF0Y2hlczogbm90Rm91bmRNYXRjaGVzLFxuICAgICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAgIGVycm9yczoge1xuICAgICAgICAgICAgW3JvdXRlLmlkXTogZXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXRjaGVzID0gZGlzY292ZXJSZXN1bHQubWF0Y2hlcztcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJvdXRlc1RvVXNlID0gaW5GbGlnaHREYXRhUm91dGVzIHx8IGRhdGFSb3V0ZXM7XG4gICAgbGV0IFttYXRjaGVzVG9Mb2FkLCByZXZhbGlkYXRpbmdGZXRjaGVyc10gPSBnZXRNYXRjaGVzVG9Mb2FkKGluaXQuaGlzdG9yeSwgc3RhdGUsIG1hdGNoZXMsIGFjdGl2ZVN1Ym1pc3Npb24sIGxvY2F0aW9uLCBmdXR1cmUudjdfcGFydGlhbEh5ZHJhdGlvbiAmJiBpbml0aWFsSHlkcmF0aW9uID09PSB0cnVlLCBmdXR1cmUudjdfc2tpcEFjdGlvbkVycm9yUmV2YWxpZGF0aW9uLCBpc1JldmFsaWRhdGlvblJlcXVpcmVkLCBjYW5jZWxsZWREZWZlcnJlZFJvdXRlcywgY2FuY2VsbGVkRmV0Y2hlckxvYWRzLCBkZWxldGVkRmV0Y2hlcnMsIGZldGNoTG9hZE1hdGNoZXMsIGZldGNoUmVkaXJlY3RJZHMsIHJvdXRlc1RvVXNlLCBiYXNlbmFtZSwgcGVuZGluZ0FjdGlvblJlc3VsdCk7XG4gICAgLy8gQ2FuY2VsIHBlbmRpbmcgZGVmZXJyZWRzIGZvciBuby1sb25nZXItbWF0Y2hlZCByb3V0ZXMgb3Igcm91dGVzIHdlJ3JlXG4gICAgLy8gYWJvdXQgdG8gcmVsb2FkLiAgTm90ZSB0aGF0IGlmIHRoaXMgaXMgYW4gYWN0aW9uIHJlbG9hZCB3ZSB3b3VsZCBoYXZlXG4gICAgLy8gYWxyZWFkeSBjYW5jZWxsZWQgYWxsIHBlbmRpbmcgZGVmZXJyZWRzIHNvIHRoaXMgd291bGQgYmUgYSBuby1vcFxuICAgIGNhbmNlbEFjdGl2ZURlZmVycmVkcyhyb3V0ZUlkID0+ICEobWF0Y2hlcyAmJiBtYXRjaGVzLnNvbWUobSA9PiBtLnJvdXRlLmlkID09PSByb3V0ZUlkKSkgfHwgbWF0Y2hlc1RvTG9hZCAmJiBtYXRjaGVzVG9Mb2FkLnNvbWUobSA9PiBtLnJvdXRlLmlkID09PSByb3V0ZUlkKSk7XG4gICAgcGVuZGluZ05hdmlnYXRpb25Mb2FkSWQgPSArK2luY3JlbWVudGluZ0xvYWRJZDtcbiAgICAvLyBTaG9ydCBjaXJjdWl0IGlmIHdlIGhhdmUgbm8gbG9hZGVycyB0byBydW5cbiAgICBpZiAobWF0Y2hlc1RvTG9hZC5sZW5ndGggPT09IDAgJiYgcmV2YWxpZGF0aW5nRmV0Y2hlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsZXQgdXBkYXRlZEZldGNoZXJzID0gbWFya0ZldGNoUmVkaXJlY3RzRG9uZSgpO1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKGxvY2F0aW9uLCBfZXh0ZW5kcyh7XG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAvLyBDb21taXQgcGVuZGluZyBlcnJvciBpZiB3ZSdyZSBzaG9ydCBjaXJjdWl0aW5nXG4gICAgICAgIGVycm9yczogcGVuZGluZ0FjdGlvblJlc3VsdCAmJiBpc0Vycm9yUmVzdWx0KHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0pID8ge1xuICAgICAgICAgIFtwZW5kaW5nQWN0aW9uUmVzdWx0WzBdXTogcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5lcnJvclxuICAgICAgICB9IDogbnVsbFxuICAgICAgfSwgZ2V0QWN0aW9uRGF0YUZvckNvbW1pdChwZW5kaW5nQWN0aW9uUmVzdWx0KSwgdXBkYXRlZEZldGNoZXJzID8ge1xuICAgICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICAgIH0gOiB7fSksIHtcbiAgICAgICAgZmx1c2hTeW5jXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNob3J0Q2lyY3VpdGVkOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoc2hvdWxkVXBkYXRlTmF2aWdhdGlvblN0YXRlKSB7XG4gICAgICBsZXQgdXBkYXRlcyA9IHt9O1xuICAgICAgaWYgKCFpc0ZvZ09mV2FyKSB7XG4gICAgICAgIC8vIE9ubHkgdXBkYXRlIG5hdmlnYXRpb24vYWN0aW9uTkRhdGEgaWYgd2UgZGlkbid0IGFscmVhZHkgZG8gaXQgYWJvdmVcbiAgICAgICAgdXBkYXRlcy5uYXZpZ2F0aW9uID0gbG9hZGluZ05hdmlnYXRpb247XG4gICAgICAgIGxldCBhY3Rpb25EYXRhID0gZ2V0VXBkYXRlZEFjdGlvbkRhdGEocGVuZGluZ0FjdGlvblJlc3VsdCk7XG4gICAgICAgIGlmIChhY3Rpb25EYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1cGRhdGVzLmFjdGlvbkRhdGEgPSBhY3Rpb25EYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmV2YWxpZGF0aW5nRmV0Y2hlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB1cGRhdGVzLmZldGNoZXJzID0gZ2V0VXBkYXRlZFJldmFsaWRhdGluZ0ZldGNoZXJzKHJldmFsaWRhdGluZ0ZldGNoZXJzKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVN0YXRlKHVwZGF0ZXMsIHtcbiAgICAgICAgZmx1c2hTeW5jXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMuZm9yRWFjaChyZiA9PiB7XG4gICAgICBpZiAoZmV0Y2hDb250cm9sbGVycy5oYXMocmYua2V5KSkge1xuICAgICAgICBhYm9ydEZldGNoZXIocmYua2V5KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZi5jb250cm9sbGVyKSB7XG4gICAgICAgIC8vIEZldGNoZXJzIHVzZSBhbiBpbmRlcGVuZGVudCBBYm9ydENvbnRyb2xsZXIgc28gdGhhdCBhYm9ydGluZyBhIGZldGNoZXJcbiAgICAgICAgLy8gKHZpYSBkZWxldGVGZXRjaGVyKSBkb2VzIG5vdCBhYm9ydCB0aGUgdHJpZ2dlcmluZyBuYXZpZ2F0aW9uIHRoYXRcbiAgICAgICAgLy8gdHJpZ2dlcmVkIHRoZSByZXZhbGlkYXRpb25cbiAgICAgICAgZmV0Y2hDb250cm9sbGVycy5zZXQocmYua2V5LCByZi5jb250cm9sbGVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBQcm94eSBuYXZpZ2F0aW9uIGFib3J0IHRocm91Z2ggdG8gcmV2YWxpZGF0aW9uIGZldGNoZXJzXG4gICAgbGV0IGFib3J0UGVuZGluZ0ZldGNoUmV2YWxpZGF0aW9ucyA9ICgpID0+IHJldmFsaWRhdGluZ0ZldGNoZXJzLmZvckVhY2goZiA9PiBhYm9ydEZldGNoZXIoZi5rZXkpKTtcbiAgICBpZiAocGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyKSB7XG4gICAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMpO1xuICAgIH1cbiAgICBsZXQge1xuICAgICAgbG9hZGVyUmVzdWx0cyxcbiAgICAgIGZldGNoZXJSZXN1bHRzXG4gICAgfSA9IGF3YWl0IGNhbGxMb2FkZXJzQW5kTWF5YmVSZXNvbHZlRGF0YShzdGF0ZSwgbWF0Y2hlcywgbWF0Y2hlc1RvTG9hZCwgcmV2YWxpZGF0aW5nRmV0Y2hlcnMsIHJlcXVlc3QpO1xuICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzaG9ydENpcmN1aXRlZDogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gQ2xlYW4gdXAgX2FmdGVyXyBsb2FkZXJzIGhhdmUgY29tcGxldGVkLiAgRG9uJ3QgY2xlYW4gdXAgaWYgd2Ugc2hvcnRcbiAgICAvLyBjaXJjdWl0ZWQgYmVjYXVzZSBmZXRjaENvbnRyb2xsZXJzIHdvdWxkIGhhdmUgYmVlbiBhYm9ydGVkIGFuZFxuICAgIC8vIHJlYXNzaWduZWQgdG8gbmV3IGNvbnRyb2xsZXJzIGZvciB0aGUgbmV4dCBuYXZpZ2F0aW9uXG4gICAgaWYgKHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlcikge1xuICAgICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRQZW5kaW5nRmV0Y2hSZXZhbGlkYXRpb25zKTtcbiAgICB9XG4gICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMuZm9yRWFjaChyZiA9PiBmZXRjaENvbnRyb2xsZXJzLmRlbGV0ZShyZi5rZXkpKTtcbiAgICAvLyBJZiBhbnkgbG9hZGVycyByZXR1cm5lZCBhIHJlZGlyZWN0IFJlc3BvbnNlLCBzdGFydCBhIG5ldyBSRVBMQUNFIG5hdmlnYXRpb25cbiAgICBsZXQgcmVkaXJlY3QgPSBmaW5kUmVkaXJlY3QobG9hZGVyUmVzdWx0cyk7XG4gICAgaWYgKHJlZGlyZWN0KSB7XG4gICAgICBhd2FpdCBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihyZXF1ZXN0LCByZWRpcmVjdC5yZXN1bHQsIHRydWUsIHtcbiAgICAgICAgcmVwbGFjZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzaG9ydENpcmN1aXRlZDogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgcmVkaXJlY3QgPSBmaW5kUmVkaXJlY3QoZmV0Y2hlclJlc3VsdHMpO1xuICAgIGlmIChyZWRpcmVjdCkge1xuICAgICAgLy8gSWYgdGhpcyByZWRpcmVjdCBjYW1lIGZyb20gYSBmZXRjaGVyIG1ha2Ugc3VyZSB3ZSBtYXJrIGl0IGluXG4gICAgICAvLyBmZXRjaFJlZGlyZWN0SWRzIHNvIGl0IGRvZXNuJ3QgZ2V0IHJldmFsaWRhdGVkIG9uIHRoZSBuZXh0IHNldCBvZlxuICAgICAgLy8gbG9hZGVyIGV4ZWN1dGlvbnNcbiAgICAgIGZldGNoUmVkaXJlY3RJZHMuYWRkKHJlZGlyZWN0LmtleSk7XG4gICAgICBhd2FpdCBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihyZXF1ZXN0LCByZWRpcmVjdC5yZXN1bHQsIHRydWUsIHtcbiAgICAgICAgcmVwbGFjZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzaG9ydENpcmN1aXRlZDogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gUHJvY2VzcyBhbmQgY29tbWl0IG91dHB1dCBmcm9tIGxvYWRlcnNcbiAgICBsZXQge1xuICAgICAgbG9hZGVyRGF0YSxcbiAgICAgIGVycm9yc1xuICAgIH0gPSBwcm9jZXNzTG9hZGVyRGF0YShzdGF0ZSwgbWF0Y2hlcywgbWF0Y2hlc1RvTG9hZCwgbG9hZGVyUmVzdWx0cywgcGVuZGluZ0FjdGlvblJlc3VsdCwgcmV2YWxpZGF0aW5nRmV0Y2hlcnMsIGZldGNoZXJSZXN1bHRzLCBhY3RpdmVEZWZlcnJlZHMpO1xuICAgIC8vIFdpcmUgdXAgc3Vic2NyaWJlcnMgdG8gdXBkYXRlIGxvYWRlckRhdGEgYXMgcHJvbWlzZXMgc2V0dGxlXG4gICAgYWN0aXZlRGVmZXJyZWRzLmZvckVhY2goKGRlZmVycmVkRGF0YSwgcm91dGVJZCkgPT4ge1xuICAgICAgZGVmZXJyZWREYXRhLnN1YnNjcmliZShhYm9ydGVkID0+IHtcbiAgICAgICAgLy8gTm90ZTogTm8gbmVlZCB0byB1cGRhdGVTdGF0ZSBoZXJlIHNpbmNlIHRoZSBUcmFja2VkUHJvbWlzZSBvblxuICAgICAgICAvLyBsb2FkZXJEYXRhIGlzIHN0YWJsZSBhY3Jvc3MgcmVzb2x2ZS9yZWplY3RcbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgaW5zdGFuY2UgaWYgd2Ugd2VyZSBhYm9ydGVkIG9yIGlmIHByb21pc2VzIGhhdmUgc2V0dGxlZFxuICAgICAgICBpZiAoYWJvcnRlZCB8fCBkZWZlcnJlZERhdGEuZG9uZSkge1xuICAgICAgICAgIGFjdGl2ZURlZmVycmVkcy5kZWxldGUocm91dGVJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIER1cmluZyBwYXJ0aWFsIGh5ZHJhdGlvbiwgcHJlc2VydmUgU1NSIGVycm9ycyBmb3Igcm91dGVzIHRoYXQgZG9uJ3QgcmUtcnVuXG4gICAgaWYgKGZ1dHVyZS52N19wYXJ0aWFsSHlkcmF0aW9uICYmIGluaXRpYWxIeWRyYXRpb24gJiYgc3RhdGUuZXJyb3JzKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhzdGF0ZS5lcnJvcnMpLmZpbHRlcihfcmVmMiA9PiB7XG4gICAgICAgIGxldCBbaWRdID0gX3JlZjI7XG4gICAgICAgIHJldHVybiAhbWF0Y2hlc1RvTG9hZC5zb21lKG0gPT4gbS5yb3V0ZS5pZCA9PT0gaWQpO1xuICAgICAgfSkuZm9yRWFjaChfcmVmMyA9PiB7XG4gICAgICAgIGxldCBbcm91dGVJZCwgZXJyb3JdID0gX3JlZjM7XG4gICAgICAgIGVycm9ycyA9IE9iamVjdC5hc3NpZ24oZXJyb3JzIHx8IHt9LCB7XG4gICAgICAgICAgW3JvdXRlSWRdOiBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgdXBkYXRlZEZldGNoZXJzID0gbWFya0ZldGNoUmVkaXJlY3RzRG9uZSgpO1xuICAgIGxldCBkaWRBYm9ydEZldGNoTG9hZHMgPSBhYm9ydFN0YWxlRmV0Y2hMb2FkcyhwZW5kaW5nTmF2aWdhdGlvbkxvYWRJZCk7XG4gICAgbGV0IHNob3VsZFVwZGF0ZUZldGNoZXJzID0gdXBkYXRlZEZldGNoZXJzIHx8IGRpZEFib3J0RmV0Y2hMb2FkcyB8fCByZXZhbGlkYXRpbmdGZXRjaGVycy5sZW5ndGggPiAwO1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICBtYXRjaGVzLFxuICAgICAgbG9hZGVyRGF0YSxcbiAgICAgIGVycm9yc1xuICAgIH0sIHNob3VsZFVwZGF0ZUZldGNoZXJzID8ge1xuICAgICAgZmV0Y2hlcnM6IG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpXG4gICAgfSA6IHt9KTtcbiAgfVxuICBmdW5jdGlvbiBnZXRVcGRhdGVkQWN0aW9uRGF0YShwZW5kaW5nQWN0aW9uUmVzdWx0KSB7XG4gICAgaWYgKHBlbmRpbmdBY3Rpb25SZXN1bHQgJiYgIWlzRXJyb3JSZXN1bHQocGVuZGluZ0FjdGlvblJlc3VsdFsxXSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgY2FzdCB0byBgYW55YCBjdXJyZW50bHkgYmVjYXVzZSBgUm91dGVEYXRhYHVzZXMgYW55IGFuZCBpdFxuICAgICAgLy8gd291bGQgYmUgYSBicmVha2luZyBjaGFuZ2UgdG8gdXNlIGFueS5cbiAgICAgIC8vIFRPRE86IHY3IC0gY2hhbmdlIGBSb3V0ZURhdGFgIHRvIHVzZSBgdW5rbm93bmAgaW5zdGVhZCBvZiBgYW55YFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW3BlbmRpbmdBY3Rpb25SZXN1bHRbMF1dOiBwZW5kaW5nQWN0aW9uUmVzdWx0WzFdLmRhdGFcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5hY3Rpb25EYXRhKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoc3RhdGUuYWN0aW9uRGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmFjdGlvbkRhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldFVwZGF0ZWRSZXZhbGlkYXRpbmdGZXRjaGVycyhyZXZhbGlkYXRpbmdGZXRjaGVycykge1xuICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZvckVhY2gocmYgPT4ge1xuICAgICAgbGV0IGZldGNoZXIgPSBzdGF0ZS5mZXRjaGVycy5nZXQocmYua2V5KTtcbiAgICAgIGxldCByZXZhbGlkYXRpbmdGZXRjaGVyID0gZ2V0TG9hZGluZ0ZldGNoZXIodW5kZWZpbmVkLCBmZXRjaGVyID8gZmV0Y2hlci5kYXRhIDogdW5kZWZpbmVkKTtcbiAgICAgIHN0YXRlLmZldGNoZXJzLnNldChyZi5rZXksIHJldmFsaWRhdGluZ0ZldGNoZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKTtcbiAgfVxuICAvLyBUcmlnZ2VyIGEgZmV0Y2hlciBsb2FkL3N1Ym1pdCBmb3IgdGhlIGdpdmVuIGZldGNoZXIga2V5XG4gIGZ1bmN0aW9uIGZldGNoKGtleSwgcm91dGVJZCwgaHJlZiwgb3B0cykge1xuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicm91dGVyLmZldGNoKCkgd2FzIGNhbGxlZCBkdXJpbmcgdGhlIHNlcnZlciByZW5kZXIsIGJ1dCBpdCBzaG91bGRuJ3QgYmUuIFwiICsgXCJZb3UgYXJlIGxpa2VseSBjYWxsaW5nIGEgdXNlRmV0Y2hlcigpIG1ldGhvZCBpbiB0aGUgYm9keSBvZiB5b3VyIGNvbXBvbmVudC4gXCIgKyBcIlRyeSBtb3ZpbmcgaXQgdG8gYSB1c2VFZmZlY3Qgb3IgYSBjYWxsYmFjay5cIik7XG4gICAgfVxuICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmhhcyhrZXkpKSBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICBsZXQgZmx1c2hTeW5jID0gKG9wdHMgJiYgb3B0cy51bnN0YWJsZV9mbHVzaFN5bmMpID09PSB0cnVlO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVRvKHN0YXRlLmxvY2F0aW9uLCBzdGF0ZS5tYXRjaGVzLCBiYXNlbmFtZSwgZnV0dXJlLnY3X3ByZXBlbmRCYXNlbmFtZSwgaHJlZiwgZnV0dXJlLnY3X3JlbGF0aXZlU3BsYXRQYXRoLCByb3V0ZUlkLCBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLnJlbGF0aXZlKTtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKHJvdXRlc1RvVXNlLCBub3JtYWxpemVkUGF0aCwgYmFzZW5hbWUpO1xuICAgIGxldCBmb2dPZldhciA9IGNoZWNrRm9nT2ZXYXIobWF0Y2hlcywgcm91dGVzVG9Vc2UsIG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlICYmIGZvZ09mV2FyLm1hdGNoZXMpIHtcbiAgICAgIG1hdGNoZXMgPSBmb2dPZldhci5tYXRjaGVzO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7XG4gICAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkUGF0aFxuICAgICAgfSksIHtcbiAgICAgICAgZmx1c2hTeW5jXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHtcbiAgICAgIHBhdGgsXG4gICAgICBzdWJtaXNzaW9uLFxuICAgICAgZXJyb3JcbiAgICB9ID0gbm9ybWFsaXplTmF2aWdhdGVPcHRpb25zKGZ1dHVyZS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCB0cnVlLCBub3JtYWxpemVkUGF0aCwgb3B0cyk7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBzZXRGZXRjaGVyRXJyb3Ioa2V5LCByb3V0ZUlkLCBlcnJvciwge1xuICAgICAgICBmbHVzaFN5bmNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgbWF0Y2ggPSBnZXRUYXJnZXRNYXRjaChtYXRjaGVzLCBwYXRoKTtcbiAgICBwZW5kaW5nUHJldmVudFNjcm9sbFJlc2V0ID0gKG9wdHMgJiYgb3B0cy5wcmV2ZW50U2Nyb2xsUmVzZXQpID09PSB0cnVlO1xuICAgIGlmIChzdWJtaXNzaW9uICYmIGlzTXV0YXRpb25NZXRob2Qoc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkge1xuICAgICAgaGFuZGxlRmV0Y2hlckFjdGlvbihrZXksIHJvdXRlSWQsIHBhdGgsIG1hdGNoLCBtYXRjaGVzLCBmb2dPZldhci5hY3RpdmUsIGZsdXNoU3luYywgc3VibWlzc2lvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFN0b3JlIG9mZiB0aGUgbWF0Y2ggc28gd2UgY2FuIGNhbGwgaXQncyBzaG91bGRSZXZhbGlkYXRlIG9uIHN1YnNlcXVlbnRcbiAgICAvLyByZXZhbGlkYXRpb25zXG4gICAgZmV0Y2hMb2FkTWF0Y2hlcy5zZXQoa2V5LCB7XG4gICAgICByb3V0ZUlkLFxuICAgICAgcGF0aFxuICAgIH0pO1xuICAgIGhhbmRsZUZldGNoZXJMb2FkZXIoa2V5LCByb3V0ZUlkLCBwYXRoLCBtYXRjaCwgbWF0Y2hlcywgZm9nT2ZXYXIuYWN0aXZlLCBmbHVzaFN5bmMsIHN1Ym1pc3Npb24pO1xuICB9XG4gIC8vIENhbGwgdGhlIGFjdGlvbiBmb3IgdGhlIG1hdGNoZWQgZmV0Y2hlci5zdWJtaXQoKSwgYW5kIHRoZW4gaGFuZGxlIHJlZGlyZWN0cyxcbiAgLy8gZXJyb3JzLCBhbmQgcmV2YWxpZGF0aW9uXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZldGNoZXJBY3Rpb24oa2V5LCByb3V0ZUlkLCBwYXRoLCBtYXRjaCwgcmVxdWVzdE1hdGNoZXMsIGlzRm9nT2ZXYXIsIGZsdXNoU3luYywgc3VibWlzc2lvbikge1xuICAgIGludGVycnVwdEFjdGl2ZUxvYWRzKCk7XG4gICAgZmV0Y2hMb2FkTWF0Y2hlcy5kZWxldGUoa2V5KTtcbiAgICBmdW5jdGlvbiBkZXRlY3RBbmRIYW5kbGU0MDVFcnJvcihtKSB7XG4gICAgICBpZiAoIW0ucm91dGUuYWN0aW9uICYmICFtLnJvdXRlLmxhenkpIHtcbiAgICAgICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgICBtZXRob2Q6IHN1Ym1pc3Npb24uZm9ybU1ldGhvZCxcbiAgICAgICAgICBwYXRobmFtZTogcGF0aCxcbiAgICAgICAgICByb3V0ZUlkOiByb3V0ZUlkXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRGZXRjaGVyRXJyb3Ioa2V5LCByb3V0ZUlkLCBlcnJvciwge1xuICAgICAgICAgIGZsdXNoU3luY1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghaXNGb2dPZldhciAmJiBkZXRlY3RBbmRIYW5kbGU0MDVFcnJvcihtYXRjaCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUHV0IHRoaXMgZmV0Y2hlciBpbnRvIGl0J3Mgc3VibWl0dGluZyBzdGF0ZVxuICAgIGxldCBleGlzdGluZ0ZldGNoZXIgPSBzdGF0ZS5mZXRjaGVycy5nZXQoa2V5KTtcbiAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXRTdWJtaXR0aW5nRmV0Y2hlcihzdWJtaXNzaW9uLCBleGlzdGluZ0ZldGNoZXIpLCB7XG4gICAgICBmbHVzaFN5bmNcbiAgICB9KTtcbiAgICBsZXQgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGxldCBmZXRjaFJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChpbml0Lmhpc3RvcnksIHBhdGgsIGFib3J0Q29udHJvbGxlci5zaWduYWwsIHN1Ym1pc3Npb24pO1xuICAgIGlmIChpc0ZvZ09mV2FyKSB7XG4gICAgICBsZXQgZGlzY292ZXJSZXN1bHQgPSBhd2FpdCBkaXNjb3ZlclJvdXRlcyhyZXF1ZXN0TWF0Y2hlcywgcGF0aCwgZmV0Y2hSZXF1ZXN0LnNpZ25hbCk7XG4gICAgICBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChkaXNjb3ZlclJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBlcnJvclxuICAgICAgICB9ID0gaGFuZGxlRGlzY292ZXJSb3V0ZUVycm9yKHBhdGgsIGRpc2NvdmVyUmVzdWx0KTtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZXJyb3IsIHtcbiAgICAgICAgICBmbHVzaFN5bmNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoIWRpc2NvdmVyUmVzdWx0Lm1hdGNoZXMpIHtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHtcbiAgICAgICAgICBwYXRobmFtZTogcGF0aFxuICAgICAgICB9KSwge1xuICAgICAgICAgIGZsdXNoU3luY1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWVzdE1hdGNoZXMgPSBkaXNjb3ZlclJlc3VsdC5tYXRjaGVzO1xuICAgICAgICBtYXRjaCA9IGdldFRhcmdldE1hdGNoKHJlcXVlc3RNYXRjaGVzLCBwYXRoKTtcbiAgICAgICAgaWYgKGRldGVjdEFuZEhhbmRsZTQwNUVycm9yKG1hdGNoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxsIHRoZSBhY3Rpb24gZm9yIHRoZSBmZXRjaGVyXG4gICAgZmV0Y2hDb250cm9sbGVycy5zZXQoa2V5LCBhYm9ydENvbnRyb2xsZXIpO1xuICAgIGxldCBvcmlnaW5hdGluZ0xvYWRJZCA9IGluY3JlbWVudGluZ0xvYWRJZDtcbiAgICBsZXQgYWN0aW9uUmVzdWx0cyA9IGF3YWl0IGNhbGxEYXRhU3RyYXRlZ3koXCJhY3Rpb25cIiwgc3RhdGUsIGZldGNoUmVxdWVzdCwgW21hdGNoXSwgcmVxdWVzdE1hdGNoZXMsIGtleSk7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IGFjdGlvblJlc3VsdHNbbWF0Y2gucm91dGUuaWRdO1xuICAgIGlmIChmZXRjaFJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIC8vIFdlIGNhbiBkZWxldGUgdGhpcyBzbyBsb25nIGFzIHdlIHdlcmVuJ3QgYWJvcnRlZCBieSBvdXIgb3duIGZldGNoZXJcbiAgICAgIC8vIHJlLXN1Ym1pdCB3aGljaCB3b3VsZCBoYXZlIHB1dCBfbmV3XyBjb250cm9sbGVyIGlzIGluIGZldGNoQ29udHJvbGxlcnNcbiAgICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmdldChrZXkpID09PSBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgICAgZmV0Y2hDb250cm9sbGVycy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2hlbiB1c2luZyB2N19mZXRjaGVyUGVyc2lzdCwgd2UgZG9uJ3Qgd2FudCBlcnJvcnMgYnViYmxpbmcgdXAgdG8gdGhlIFVJXG4gICAgLy8gb3IgcmVkaXJlY3RzIHByb2Nlc3NlZCBmb3IgdW5tb3VudGVkIGZldGNoZXJzIHNvIHdlIGp1c3QgcmV2ZXJ0IHRoZW0gdG9cbiAgICAvLyBpZGxlXG4gICAgaWYgKGZ1dHVyZS52N19mZXRjaGVyUGVyc2lzdCAmJiBkZWxldGVkRmV0Y2hlcnMuaGFzKGtleSkpIHtcbiAgICAgIGlmIChpc1JlZGlyZWN0UmVzdWx0KGFjdGlvblJlc3VsdCkgfHwgaXNFcnJvclJlc3VsdChhY3Rpb25SZXN1bHQpKSB7XG4gICAgICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldERvbmVGZXRjaGVyKHVuZGVmaW5lZCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBMZXQgU3VjY2Vzc1Jlc3VsdCdzIGZhbGwgdGhyb3VnaCBmb3IgcmV2YWxpZGF0aW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1JlZGlyZWN0UmVzdWx0KGFjdGlvblJlc3VsdCkpIHtcbiAgICAgICAgZmV0Y2hDb250cm9sbGVycy5kZWxldGUoa2V5KTtcbiAgICAgICAgaWYgKHBlbmRpbmdOYXZpZ2F0aW9uTG9hZElkID4gb3JpZ2luYXRpbmdMb2FkSWQpIHtcbiAgICAgICAgICAvLyBBIG5ldyBuYXZpZ2F0aW9uIHdhcyBraWNrZWQgb2ZmIGFmdGVyIG91ciBhY3Rpb24gc3RhcnRlZCwgc28gdGhhdFxuICAgICAgICAgIC8vIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGlzIHJlZGlyZWN0IG5hdmlnYXRpb24uICBXZSBhbHJlYWR5XG4gICAgICAgICAgLy8gc2V0IGlzUmV2YWxpZGF0aW9uUmVxdWlyZWQgc28gYWxsIGxvYWRlcnMgZm9yIHRoZSBuZXcgcm91dGUgc2hvdWxkXG4gICAgICAgICAgLy8gZmlyZSB1bmxlc3Mgb3B0ZWQgb3V0IHZpYSBzaG91bGRSZXZhbGlkYXRlXG4gICAgICAgICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0RG9uZUZldGNoZXIodW5kZWZpbmVkKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZldGNoUmVkaXJlY3RJZHMuYWRkKGtleSk7XG4gICAgICAgICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0TG9hZGluZ0ZldGNoZXIoc3VibWlzc2lvbikpO1xuICAgICAgICAgIHJldHVybiBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihmZXRjaFJlcXVlc3QsIGFjdGlvblJlc3VsdCwgZmFsc2UsIHtcbiAgICAgICAgICAgIGZldGNoZXJTdWJtaXNzaW9uOiBzdWJtaXNzaW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFByb2Nlc3MgYW55IG5vbi1yZWRpcmVjdCBlcnJvcnMgdGhyb3duXG4gICAgICBpZiAoaXNFcnJvclJlc3VsdChhY3Rpb25SZXN1bHQpKSB7XG4gICAgICAgIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIGFjdGlvblJlc3VsdC5lcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRGVmZXJyZWRSZXN1bHQoYWN0aW9uUmVzdWx0KSkge1xuICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDAsIHtcbiAgICAgICAgdHlwZTogXCJkZWZlci1hY3Rpb25cIlxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFN0YXJ0IHRoZSBkYXRhIGxvYWQgZm9yIGN1cnJlbnQgbWF0Y2hlcywgb3IgdGhlIG5leHQgbG9jYXRpb24gaWYgd2UncmVcbiAgICAvLyBpbiB0aGUgbWlkZGxlIG9mIGEgbmF2aWdhdGlvblxuICAgIGxldCBuZXh0TG9jYXRpb24gPSBzdGF0ZS5uYXZpZ2F0aW9uLmxvY2F0aW9uIHx8IHN0YXRlLmxvY2F0aW9uO1xuICAgIGxldCByZXZhbGlkYXRpb25SZXF1ZXN0ID0gY3JlYXRlQ2xpZW50U2lkZVJlcXVlc3QoaW5pdC5oaXN0b3J5LCBuZXh0TG9jYXRpb24sIGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCBtYXRjaGVzID0gc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSAhPT0gXCJpZGxlXCIgPyBtYXRjaFJvdXRlcyhyb3V0ZXNUb1VzZSwgc3RhdGUubmF2aWdhdGlvbi5sb2NhdGlvbiwgYmFzZW5hbWUpIDogc3RhdGUubWF0Y2hlcztcbiAgICBpbnZhcmlhbnQobWF0Y2hlcywgXCJEaWRuJ3QgZmluZCBhbnkgbWF0Y2hlcyBhZnRlciBmZXRjaGVyIGFjdGlvblwiKTtcbiAgICBsZXQgbG9hZElkID0gKytpbmNyZW1lbnRpbmdMb2FkSWQ7XG4gICAgZmV0Y2hSZWxvYWRJZHMuc2V0KGtleSwgbG9hZElkKTtcbiAgICBsZXQgbG9hZEZldGNoZXIgPSBnZXRMb2FkaW5nRmV0Y2hlcihzdWJtaXNzaW9uLCBhY3Rpb25SZXN1bHQuZGF0YSk7XG4gICAgc3RhdGUuZmV0Y2hlcnMuc2V0KGtleSwgbG9hZEZldGNoZXIpO1xuICAgIGxldCBbbWF0Y2hlc1RvTG9hZCwgcmV2YWxpZGF0aW5nRmV0Y2hlcnNdID0gZ2V0TWF0Y2hlc1RvTG9hZChpbml0Lmhpc3RvcnksIHN0YXRlLCBtYXRjaGVzLCBzdWJtaXNzaW9uLCBuZXh0TG9jYXRpb24sIGZhbHNlLCBmdXR1cmUudjdfc2tpcEFjdGlvbkVycm9yUmV2YWxpZGF0aW9uLCBpc1JldmFsaWRhdGlvblJlcXVpcmVkLCBjYW5jZWxsZWREZWZlcnJlZFJvdXRlcywgY2FuY2VsbGVkRmV0Y2hlckxvYWRzLCBkZWxldGVkRmV0Y2hlcnMsIGZldGNoTG9hZE1hdGNoZXMsIGZldGNoUmVkaXJlY3RJZHMsIHJvdXRlc1RvVXNlLCBiYXNlbmFtZSwgW21hdGNoLnJvdXRlLmlkLCBhY3Rpb25SZXN1bHRdKTtcbiAgICAvLyBQdXQgYWxsIHJldmFsaWRhdGluZyBmZXRjaGVycyBpbnRvIHRoZSBsb2FkaW5nIHN0YXRlLCBleGNlcHQgZm9yIHRoZVxuICAgIC8vIGN1cnJlbnQgZmV0Y2hlciB3aGljaCB3ZSB3YW50IHRvIGtlZXAgaW4gaXQncyBjdXJyZW50IGxvYWRpbmcgc3RhdGUgd2hpY2hcbiAgICAvLyBjb250YWlucyBpdCdzIGFjdGlvbiBzdWJtaXNzaW9uIGluZm8gKyBhY3Rpb24gZGF0YVxuICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZpbHRlcihyZiA9PiByZi5rZXkgIT09IGtleSkuZm9yRWFjaChyZiA9PiB7XG4gICAgICBsZXQgc3RhbGVLZXkgPSByZi5rZXk7XG4gICAgICBsZXQgZXhpc3RpbmdGZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KHN0YWxlS2V5KTtcbiAgICAgIGxldCByZXZhbGlkYXRpbmdGZXRjaGVyID0gZ2V0TG9hZGluZ0ZldGNoZXIodW5kZWZpbmVkLCBleGlzdGluZ0ZldGNoZXIgPyBleGlzdGluZ0ZldGNoZXIuZGF0YSA6IHVuZGVmaW5lZCk7XG4gICAgICBzdGF0ZS5mZXRjaGVycy5zZXQoc3RhbGVLZXksIHJldmFsaWRhdGluZ0ZldGNoZXIpO1xuICAgICAgaWYgKGZldGNoQ29udHJvbGxlcnMuaGFzKHN0YWxlS2V5KSkge1xuICAgICAgICBhYm9ydEZldGNoZXIoc3RhbGVLZXkpO1xuICAgICAgfVxuICAgICAgaWYgKHJmLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgZmV0Y2hDb250cm9sbGVycy5zZXQoc3RhbGVLZXksIHJmLmNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgIGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKVxuICAgIH0pO1xuICAgIGxldCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMgPSAoKSA9PiByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKHJmID0+IGFib3J0RmV0Y2hlcihyZi5rZXkpKTtcbiAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMpO1xuICAgIGxldCB7XG4gICAgICBsb2FkZXJSZXN1bHRzLFxuICAgICAgZmV0Y2hlclJlc3VsdHNcbiAgICB9ID0gYXdhaXQgY2FsbExvYWRlcnNBbmRNYXliZVJlc29sdmVEYXRhKHN0YXRlLCBtYXRjaGVzLCBtYXRjaGVzVG9Mb2FkLCByZXZhbGlkYXRpbmdGZXRjaGVycywgcmV2YWxpZGF0aW9uUmVxdWVzdCk7XG4gICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMpO1xuICAgIGZldGNoUmVsb2FkSWRzLmRlbGV0ZShrZXkpO1xuICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMuZm9yRWFjaChyID0+IGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKHIua2V5KSk7XG4gICAgbGV0IHJlZGlyZWN0ID0gZmluZFJlZGlyZWN0KGxvYWRlclJlc3VsdHMpO1xuICAgIGlmIChyZWRpcmVjdCkge1xuICAgICAgcmV0dXJuIHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKHJldmFsaWRhdGlvblJlcXVlc3QsIHJlZGlyZWN0LnJlc3VsdCwgZmFsc2UpO1xuICAgIH1cbiAgICByZWRpcmVjdCA9IGZpbmRSZWRpcmVjdChmZXRjaGVyUmVzdWx0cyk7XG4gICAgaWYgKHJlZGlyZWN0KSB7XG4gICAgICAvLyBJZiB0aGlzIHJlZGlyZWN0IGNhbWUgZnJvbSBhIGZldGNoZXIgbWFrZSBzdXJlIHdlIG1hcmsgaXQgaW5cbiAgICAgIC8vIGZldGNoUmVkaXJlY3RJZHMgc28gaXQgZG9lc24ndCBnZXQgcmV2YWxpZGF0ZWQgb24gdGhlIG5leHQgc2V0IG9mXG4gICAgICAvLyBsb2FkZXIgZXhlY3V0aW9uc1xuICAgICAgZmV0Y2hSZWRpcmVjdElkcy5hZGQocmVkaXJlY3Qua2V5KTtcbiAgICAgIHJldHVybiBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihyZXZhbGlkYXRpb25SZXF1ZXN0LCByZWRpcmVjdC5yZXN1bHQsIGZhbHNlKTtcbiAgICB9XG4gICAgLy8gUHJvY2VzcyBhbmQgY29tbWl0IG91dHB1dCBmcm9tIGxvYWRlcnNcbiAgICBsZXQge1xuICAgICAgbG9hZGVyRGF0YSxcbiAgICAgIGVycm9yc1xuICAgIH0gPSBwcm9jZXNzTG9hZGVyRGF0YShzdGF0ZSwgbWF0Y2hlcywgbWF0Y2hlc1RvTG9hZCwgbG9hZGVyUmVzdWx0cywgdW5kZWZpbmVkLCByZXZhbGlkYXRpbmdGZXRjaGVycywgZmV0Y2hlclJlc3VsdHMsIGFjdGl2ZURlZmVycmVkcyk7XG4gICAgLy8gU2luY2Ugd2UgbGV0IHJldmFsaWRhdGlvbnMgY29tcGxldGUgZXZlbiBpZiB0aGUgc3VibWl0dGluZyBmZXRjaGVyIHdhc1xuICAgIC8vIGRlbGV0ZWQsIG9ubHkgcHV0IGl0IGJhY2sgdG8gaWRsZSBpZiBpdCBoYXNuJ3QgYmVlbiBkZWxldGVkXG4gICAgaWYgKHN0YXRlLmZldGNoZXJzLmhhcyhrZXkpKSB7XG4gICAgICBsZXQgZG9uZUZldGNoZXIgPSBnZXREb25lRmV0Y2hlcihhY3Rpb25SZXN1bHQuZGF0YSk7XG4gICAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBkb25lRmV0Y2hlcik7XG4gICAgfVxuICAgIGFib3J0U3RhbGVGZXRjaExvYWRzKGxvYWRJZCk7XG4gICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbiBhIG5hdmlnYXRpb24gbG9hZGluZyBzdGF0ZSBhbmQgdGhpcyBmZXRjaGVyIGlzXG4gICAgLy8gbW9yZSByZWNlbnQgdGhhbiB0aGUgbmF2aWdhdGlvbiwgd2Ugd2FudCB0aGUgbmV3ZXIgZGF0YSBzbyBhYm9ydCB0aGVcbiAgICAvLyBuYXZpZ2F0aW9uIGFuZCBjb21wbGV0ZSBpdCB3aXRoIHRoZSBmZXRjaGVyIGRhdGFcbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJsb2FkaW5nXCIgJiYgbG9hZElkID4gcGVuZGluZ05hdmlnYXRpb25Mb2FkSWQpIHtcbiAgICAgIGludmFyaWFudChwZW5kaW5nQWN0aW9uLCBcIkV4cGVjdGVkIHBlbmRpbmcgYWN0aW9uXCIpO1xuICAgICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyICYmIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKHN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24sIHtcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9hZGVyRGF0YSxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2UganVzdCB1cGRhdGUgd2l0aCB0aGUgZmV0Y2hlciBkYXRhLCBwcmVzZXJ2aW5nIGFueSBleGlzdGluZ1xuICAgICAgLy8gbG9hZGVyRGF0YSBmb3IgbG9hZGVycyB0aGF0IGRpZCBub3QgbmVlZCB0byByZWxvYWQuICBXZSBoYXZlIHRvXG4gICAgICAvLyBtYW51YWxseSBtZXJnZSBoZXJlIHNpbmNlIHdlIGFyZW4ndCBnb2luZyB0aHJvdWdoIGNvbXBsZXRlTmF2aWdhdGlvblxuICAgICAgdXBkYXRlU3RhdGUoe1xuICAgICAgICBlcnJvcnMsXG4gICAgICAgIGxvYWRlckRhdGE6IG1lcmdlTG9hZGVyRGF0YShzdGF0ZS5sb2FkZXJEYXRhLCBsb2FkZXJEYXRhLCBtYXRjaGVzLCBlcnJvcnMpLFxuICAgICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICAgIH0pO1xuICAgICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICAvLyBDYWxsIHRoZSBtYXRjaGVkIGxvYWRlciBmb3IgZmV0Y2hlci5sb2FkKCksIGhhbmRsaW5nIHJlZGlyZWN0cywgZXJyb3JzLCBldGMuXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZldGNoZXJMb2FkZXIoa2V5LCByb3V0ZUlkLCBwYXRoLCBtYXRjaCwgbWF0Y2hlcywgaXNGb2dPZldhciwgZmx1c2hTeW5jLCBzdWJtaXNzaW9uKSB7XG4gICAgbGV0IGV4aXN0aW5nRmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldExvYWRpbmdGZXRjaGVyKHN1Ym1pc3Npb24sIGV4aXN0aW5nRmV0Y2hlciA/IGV4aXN0aW5nRmV0Y2hlci5kYXRhIDogdW5kZWZpbmVkKSwge1xuICAgICAgZmx1c2hTeW5jXG4gICAgfSk7XG4gICAgbGV0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsZXQgZmV0Y2hSZXF1ZXN0ID0gY3JlYXRlQ2xpZW50U2lkZVJlcXVlc3QoaW5pdC5oaXN0b3J5LCBwYXRoLCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICBpZiAoaXNGb2dPZldhcikge1xuICAgICAgbGV0IGRpc2NvdmVyUmVzdWx0ID0gYXdhaXQgZGlzY292ZXJSb3V0ZXMobWF0Y2hlcywgcGF0aCwgZmV0Y2hSZXF1ZXN0LnNpZ25hbCk7XG4gICAgICBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChkaXNjb3ZlclJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBlcnJvclxuICAgICAgICB9ID0gaGFuZGxlRGlzY292ZXJSb3V0ZUVycm9yKHBhdGgsIGRpc2NvdmVyUmVzdWx0KTtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZXJyb3IsIHtcbiAgICAgICAgICBmbHVzaFN5bmNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoIWRpc2NvdmVyUmVzdWx0Lm1hdGNoZXMpIHtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHtcbiAgICAgICAgICBwYXRobmFtZTogcGF0aFxuICAgICAgICB9KSwge1xuICAgICAgICAgIGZsdXNoU3luY1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF0Y2hlcyA9IGRpc2NvdmVyUmVzdWx0Lm1hdGNoZXM7XG4gICAgICAgIG1hdGNoID0gZ2V0VGFyZ2V0TWF0Y2gobWF0Y2hlcywgcGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENhbGwgdGhlIGxvYWRlciBmb3IgdGhpcyBmZXRjaGVyIHJvdXRlIG1hdGNoXG4gICAgZmV0Y2hDb250cm9sbGVycy5zZXQoa2V5LCBhYm9ydENvbnRyb2xsZXIpO1xuICAgIGxldCBvcmlnaW5hdGluZ0xvYWRJZCA9IGluY3JlbWVudGluZ0xvYWRJZDtcbiAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGNhbGxEYXRhU3RyYXRlZ3koXCJsb2FkZXJcIiwgc3RhdGUsIGZldGNoUmVxdWVzdCwgW21hdGNoXSwgbWF0Y2hlcywga2V5KTtcbiAgICBsZXQgcmVzdWx0ID0gcmVzdWx0c1ttYXRjaC5yb3V0ZS5pZF07XG4gICAgLy8gRGVmZXJyZWQgaXNuJ3Qgc3VwcG9ydGVkIGZvciBmZXRjaGVyIGxvYWRzLCBhd2FpdCBldmVyeXRoaW5nIGFuZCB0cmVhdCBpdFxuICAgIC8vIGFzIGEgbm9ybWFsIGxvYWQuICByZXNvbHZlRGVmZXJyZWREYXRhIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGlzXG4gICAgLy8gZmV0Y2hlciBnZXRzIGFib3J0ZWQsIHNvIHdlIGp1c3QgbGVhdmUgcmVzdWx0IHVudG91Y2hlZCBhbmQgc2hvcnQgY2lyY3VpdFxuICAgIC8vIGJlbG93IGlmIHRoYXQgaGFwcGVuc1xuICAgIGlmIChpc0RlZmVycmVkUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdCA9IChhd2FpdCByZXNvbHZlRGVmZXJyZWREYXRhKHJlc3VsdCwgZmV0Y2hSZXF1ZXN0LnNpZ25hbCwgdHJ1ZSkpIHx8IHJlc3VsdDtcbiAgICB9XG4gICAgLy8gV2UgY2FuIGRlbGV0ZSB0aGlzIHNvIGxvbmcgYXMgd2Ugd2VyZW4ndCBhYm9ydGVkIGJ5IG91ciBvdXIgb3duIGZldGNoZXJcbiAgICAvLyByZS1sb2FkIHdoaWNoIHdvdWxkIGhhdmUgcHV0IF9uZXdfIGNvbnRyb2xsZXIgaXMgaW4gZmV0Y2hDb250cm9sbGVyc1xuICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmdldChrZXkpID09PSBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmIChmZXRjaFJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2UgZG9uJ3Qgd2FudCBlcnJvcnMgYnViYmxpbmcgdXAgb3IgcmVkaXJlY3RzIGZvbGxvd2VkIGZvciB1bm1vdW50ZWRcbiAgICAvLyBmZXRjaGVycywgc28gc2hvcnQgY2lyY3VpdCBoZXJlIGlmIGl0IHdhcyByZW1vdmVkIGZyb20gdGhlIFVJXG4gICAgaWYgKGRlbGV0ZWRGZXRjaGVycy5oYXMoa2V5KSkge1xuICAgICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0RG9uZUZldGNoZXIodW5kZWZpbmVkKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIElmIHRoZSBsb2FkZXIgdGhyZXcgYSByZWRpcmVjdCBSZXNwb25zZSwgc3RhcnQgYSBuZXcgUkVQTEFDRSBuYXZpZ2F0aW9uXG4gICAgaWYgKGlzUmVkaXJlY3RSZXN1bHQocmVzdWx0KSkge1xuICAgICAgaWYgKHBlbmRpbmdOYXZpZ2F0aW9uTG9hZElkID4gb3JpZ2luYXRpbmdMb2FkSWQpIHtcbiAgICAgICAgLy8gQSBuZXcgbmF2aWdhdGlvbiB3YXMga2lja2VkIG9mZiBhZnRlciBvdXIgbG9hZGVyIHN0YXJ0ZWQsIHNvIHRoYXRcbiAgICAgICAgLy8gc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoaXMgcmVkaXJlY3QgbmF2aWdhdGlvblxuICAgICAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXREb25lRmV0Y2hlcih1bmRlZmluZWQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hSZWRpcmVjdElkcy5hZGQoa2V5KTtcbiAgICAgICAgYXdhaXQgc3RhcnRSZWRpcmVjdE5hdmlnYXRpb24oZmV0Y2hSZXF1ZXN0LCByZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBQcm9jZXNzIGFueSBub24tcmVkaXJlY3QgZXJyb3JzIHRocm93blxuICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIHJlc3VsdC5lcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGludmFyaWFudCghaXNEZWZlcnJlZFJlc3VsdChyZXN1bHQpLCBcIlVuaGFuZGxlZCBmZXRjaGVyIGRlZmVycmVkIGRhdGFcIik7XG4gICAgLy8gUHV0IHRoZSBmZXRjaGVyIGJhY2sgaW50byBhbiBpZGxlIHN0YXRlXG4gICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0RG9uZUZldGNoZXIocmVzdWx0LmRhdGEpKTtcbiAgfVxuICAvKipcbiAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBoYW5kbGUgcmVkaXJlY3RzIHJldHVybmVkIGZyb20gYW4gYWN0aW9uIG9yIGxvYWRlci5cbiAgICogTm9ybWFsbHksIGEgcmVkaXJlY3QgXCJyZXBsYWNlc1wiIHRoZSBuYXZpZ2F0aW9uIHRoYXQgdHJpZ2dlcmVkIGl0LiAgU28sIGZvclxuICAgKiBleGFtcGxlOlxuICAgKlxuICAgKiAgLSB1c2VyIGlzIG9uIC9hXG4gICAqICAtIHVzZXIgY2xpY2tzIGEgbGluayB0byAvYlxuICAgKiAgLSBsb2FkZXIgZm9yIC9iIHJlZGlyZWN0cyB0byAvY1xuICAgKlxuICAgKiBJbiBhIG5vbi1KUyBhcHAgdGhlIGJyb3dzZXIgd291bGQgdHJhY2sgdGhlIGluLWZsaWdodCBuYXZpZ2F0aW9uIHRvIC9iIGFuZFxuICAgKiB0aGVuIHJlcGxhY2UgaXQgd2l0aCAvYyB3aGVuIGl0IGVuY291bnRlcmVkIHRoZSByZWRpcmVjdCByZXNwb25zZS4gIEluXG4gICAqIHRoZSBlbmQgaXQgd291bGQgb25seSBldmVyIHVwZGF0ZSB0aGUgVVJMIGJhciB3aXRoIC9jLlxuICAgKlxuICAgKiBJbiBjbGllbnQtc2lkZSByb3V0aW5nIHVzaW5nIHB1c2hTdGF0ZS9yZXBsYWNlU3RhdGUsIHdlIGFpbSB0byBlbXVsYXRlXG4gICAqIHRoaXMgYmVoYXZpb3IgYW5kIHdlIGFsc28gZG8gbm90IHVwZGF0ZSBoaXN0b3J5IHVudGlsIHRoZSBlbmQgb2YgdGhlXG4gICAqIG5hdmlnYXRpb24gKGluY2x1ZGluZyBwcm9jZXNzZWQgcmVkaXJlY3RzKS4gIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZXZlclxuICAgKiBhY3R1YWxseSB0b3VjaCBoaXN0b3J5IHVudGlsIHdlJ3ZlIHByb2Nlc3NlZCByZWRpcmVjdHMsIHNvIHdlIGp1c3QgdXNlXG4gICAqIHRoZSBoaXN0b3J5IGFjdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCBuYXZpZ2F0aW9uIChQVVNIIG9yIFJFUExBQ0UpLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnRSZWRpcmVjdE5hdmlnYXRpb24ocmVxdWVzdCwgcmVkaXJlY3QsIGlzTmF2aWdhdGlvbiwgX3RlbXAyKSB7XG4gICAgbGV0IHtcbiAgICAgIHN1Ym1pc3Npb24sXG4gICAgICBmZXRjaGVyU3VibWlzc2lvbixcbiAgICAgIHJlcGxhY2VcbiAgICB9ID0gX3RlbXAyID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMjtcbiAgICBpZiAocmVkaXJlY3QucmVzcG9uc2UuaGVhZGVycy5oYXMoXCJYLVJlbWl4LVJldmFsaWRhdGVcIikpIHtcbiAgICAgIGlzUmV2YWxpZGF0aW9uUmVxdWlyZWQgPSB0cnVlO1xuICAgIH1cbiAgICBsZXQgbG9jYXRpb24gPSByZWRpcmVjdC5yZXNwb25zZS5oZWFkZXJzLmdldChcIkxvY2F0aW9uXCIpO1xuICAgIGludmFyaWFudChsb2NhdGlvbiwgXCJFeHBlY3RlZCBhIExvY2F0aW9uIGhlYWRlciBvbiB0aGUgcmVkaXJlY3QgUmVzcG9uc2VcIik7XG4gICAgbG9jYXRpb24gPSBub3JtYWxpemVSZWRpcmVjdExvY2F0aW9uKGxvY2F0aW9uLCBuZXcgVVJMKHJlcXVlc3QudXJsKSwgYmFzZW5hbWUpO1xuICAgIGxldCByZWRpcmVjdExvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oc3RhdGUubG9jYXRpb24sIGxvY2F0aW9uLCB7XG4gICAgICBfaXNSZWRpcmVjdDogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgIGxldCBpc0RvY3VtZW50UmVsb2FkID0gZmFsc2U7XG4gICAgICBpZiAocmVkaXJlY3QucmVzcG9uc2UuaGVhZGVycy5oYXMoXCJYLVJlbWl4LVJlbG9hZC1Eb2N1bWVudFwiKSkge1xuICAgICAgICAvLyBIYXJkIHJlbG9hZCBpZiB0aGUgcmVzcG9uc2UgY29udGFpbmVkIFgtUmVtaXgtUmVsb2FkLURvY3VtZW50XG4gICAgICAgIGlzRG9jdW1lbnRSZWxvYWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChBQlNPTFVURV9VUkxfUkVHRVgudGVzdChsb2NhdGlvbikpIHtcbiAgICAgICAgY29uc3QgdXJsID0gaW5pdC5oaXN0b3J5LmNyZWF0ZVVSTChsb2NhdGlvbik7XG4gICAgICAgIGlzRG9jdW1lbnRSZWxvYWQgPVxuICAgICAgICAvLyBIYXJkIHJlbG9hZCBpZiBpdCdzIGFuIGFic29sdXRlIFVSTCB0byBhIG5ldyBvcmlnaW5cbiAgICAgICAgdXJsLm9yaWdpbiAhPT0gcm91dGVyV2luZG93LmxvY2F0aW9uLm9yaWdpbiB8fFxuICAgICAgICAvLyBIYXJkIHJlbG9hZCBpZiBpdCdzIGFuIGFic29sdXRlIFVSTCB0aGF0IGRvZXMgbm90IG1hdGNoIG91ciBiYXNlbmFtZVxuICAgICAgICBzdHJpcEJhc2VuYW1lKHVybC5wYXRobmFtZSwgYmFzZW5hbWUpID09IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNEb2N1bWVudFJlbG9hZCkge1xuICAgICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICAgIHJvdXRlcldpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGxvY2F0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByb3V0ZXJXaW5kb3cubG9jYXRpb24uYXNzaWduKGxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBhYm9ydCBvbiByZWRpcmVjdHMsIHNpbmNlIHdlIGRvbid0IGRldGVjdCB0aGVcbiAgICAvLyByZWRpcmVjdCB1bnRpbCB0aGUgYWN0aW9uL2xvYWRlcnMgaGF2ZSBzZXR0bGVkXG4gICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyID0gbnVsbDtcbiAgICBsZXQgcmVkaXJlY3RIaXN0b3J5QWN0aW9uID0gcmVwbGFjZSA9PT0gdHJ1ZSB8fCByZWRpcmVjdC5yZXNwb25zZS5oZWFkZXJzLmhhcyhcIlgtUmVtaXgtUmVwbGFjZVwiKSA/IEFjdGlvbi5SZXBsYWNlIDogQWN0aW9uLlB1c2g7XG4gICAgLy8gVXNlIHRoZSBpbmNvbWluZyBzdWJtaXNzaW9uIGlmIHByb3ZpZGVkLCBmYWxsYmFjayBvbiB0aGUgYWN0aXZlIG9uZSBpblxuICAgIC8vIHN0YXRlLm5hdmlnYXRpb25cbiAgICBsZXQge1xuICAgICAgZm9ybU1ldGhvZCxcbiAgICAgIGZvcm1BY3Rpb24sXG4gICAgICBmb3JtRW5jVHlwZVxuICAgIH0gPSBzdGF0ZS5uYXZpZ2F0aW9uO1xuICAgIGlmICghc3VibWlzc2lvbiAmJiAhZmV0Y2hlclN1Ym1pc3Npb24gJiYgZm9ybU1ldGhvZCAmJiBmb3JtQWN0aW9uICYmIGZvcm1FbmNUeXBlKSB7XG4gICAgICBzdWJtaXNzaW9uID0gZ2V0U3VibWlzc2lvbkZyb21OYXZpZ2F0aW9uKHN0YXRlLm5hdmlnYXRpb24pO1xuICAgIH1cbiAgICAvLyBJZiB0aGlzIHdhcyBhIDMwNy8zMDggc3VibWlzc2lvbiB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZSBIVFRQIG1ldGhvZCBhbmRcbiAgICAvLyByZS1zdWJtaXQgdGhlIEdFVC9QT1NUL1BVVC9QQVRDSC9ERUxFVEUgYXMgYSBzdWJtaXNzaW9uIG5hdmlnYXRpb24gdG8gdGhlXG4gICAgLy8gcmVkaXJlY3RlZCBsb2NhdGlvblxuICAgIGxldCBhY3RpdmVTdWJtaXNzaW9uID0gc3VibWlzc2lvbiB8fCBmZXRjaGVyU3VibWlzc2lvbjtcbiAgICBpZiAocmVkaXJlY3RQcmVzZXJ2ZU1ldGhvZFN0YXR1c0NvZGVzLmhhcyhyZWRpcmVjdC5yZXNwb25zZS5zdGF0dXMpICYmIGFjdGl2ZVN1Ym1pc3Npb24gJiYgaXNNdXRhdGlvbk1ldGhvZChhY3RpdmVTdWJtaXNzaW9uLmZvcm1NZXRob2QpKSB7XG4gICAgICBhd2FpdCBzdGFydE5hdmlnYXRpb24ocmVkaXJlY3RIaXN0b3J5QWN0aW9uLCByZWRpcmVjdExvY2F0aW9uLCB7XG4gICAgICAgIHN1Ym1pc3Npb246IF9leHRlbmRzKHt9LCBhY3RpdmVTdWJtaXNzaW9uLCB7XG4gICAgICAgICAgZm9ybUFjdGlvbjogbG9jYXRpb25cbiAgICAgICAgfSksXG4gICAgICAgIC8vIFByZXNlcnZlIHRoZXNlIGZsYWdzIGFjcm9zcyByZWRpcmVjdHNcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBwZW5kaW5nUHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICBlbmFibGVWaWV3VHJhbnNpdGlvbjogaXNOYXZpZ2F0aW9uID8gcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRW5hYmxlZCA6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSBuYXZpZ2F0aW9uIHN1Ym1pc3Npb24sIHdlIHdpbGwgcHJlc2VydmUgaXQgdGhyb3VnaCB0aGVcbiAgICAgIC8vIHJlZGlyZWN0IG5hdmlnYXRpb25cbiAgICAgIGxldCBvdmVycmlkZU5hdmlnYXRpb24gPSBnZXRMb2FkaW5nTmF2aWdhdGlvbihyZWRpcmVjdExvY2F0aW9uLCBzdWJtaXNzaW9uKTtcbiAgICAgIGF3YWl0IHN0YXJ0TmF2aWdhdGlvbihyZWRpcmVjdEhpc3RvcnlBY3Rpb24sIHJlZGlyZWN0TG9jYXRpb24sIHtcbiAgICAgICAgb3ZlcnJpZGVOYXZpZ2F0aW9uLFxuICAgICAgICAvLyBTZW5kIGZldGNoZXIgc3VibWlzc2lvbnMgdGhyb3VnaCBmb3Igc2hvdWxkUmV2YWxpZGF0ZVxuICAgICAgICBmZXRjaGVyU3VibWlzc2lvbixcbiAgICAgICAgLy8gUHJlc2VydmUgdGhlc2UgZmxhZ3MgYWNyb3NzIHJlZGlyZWN0c1xuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IHBlbmRpbmdQcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICAgIGVuYWJsZVZpZXdUcmFuc2l0aW9uOiBpc05hdmlnYXRpb24gPyBwZW5kaW5nVmlld1RyYW5zaXRpb25FbmFibGVkIDogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLy8gVXRpbGl0eSB3cmFwcGVyIGZvciBjYWxsaW5nIGRhdGFTdHJhdGVneSBjbGllbnQtc2lkZSB3aXRob3V0IGhhdmluZyB0b1xuICAvLyBwYXNzIGFyb3VuZCB0aGUgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllcywgZXRjLlxuICBhc3luYyBmdW5jdGlvbiBjYWxsRGF0YVN0cmF0ZWd5KHR5cGUsIHN0YXRlLCByZXF1ZXN0LCBtYXRjaGVzVG9Mb2FkLCBtYXRjaGVzLCBmZXRjaGVyS2V5KSB7XG4gICAgbGV0IHJlc3VsdHM7XG4gICAgbGV0IGRhdGFSZXN1bHRzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5SW1wbChkYXRhU3RyYXRlZ3lJbXBsLCB0eXBlLCBzdGF0ZSwgcmVxdWVzdCwgbWF0Y2hlc1RvTG9hZCwgbWF0Y2hlcywgZmV0Y2hlcktleSwgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgdGhlIG91dGVyIGRhdGFTdHJhdGVneSBtZXRob2QgdGhyb3dzLCBqdXN0IHJldHVybiB0aGUgZXJyb3IgZm9yIGFsbFxuICAgICAgLy8gbWF0Y2hlcyAtIGFuZCBpdCdsbCBuYXR1cmFsbHkgYnViYmxlIHRvIHRoZSByb290XG4gICAgICBtYXRjaGVzVG9Mb2FkLmZvckVhY2gobSA9PiB7XG4gICAgICAgIGRhdGFSZXN1bHRzW20ucm91dGUuaWRdID0ge1xuICAgICAgICAgIHR5cGU6IFJlc3VsdFR5cGUuZXJyb3IsXG4gICAgICAgICAgZXJyb3I6IGVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRhdGFSZXN1bHRzO1xuICAgIH1cbiAgICBmb3IgKGxldCBbcm91dGVJZCwgcmVzdWx0XSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHRzKSkge1xuICAgICAgaWYgKGlzUmVkaXJlY3REYXRhU3RyYXRlZ3lSZXN1bHRSZXN1bHQocmVzdWx0KSkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSByZXN1bHQucmVzdWx0O1xuICAgICAgICBkYXRhUmVzdWx0c1tyb3V0ZUlkXSA9IHtcbiAgICAgICAgICB0eXBlOiBSZXN1bHRUeXBlLnJlZGlyZWN0LFxuICAgICAgICAgIHJlc3BvbnNlOiBub3JtYWxpemVSZWxhdGl2ZVJvdXRpbmdSZWRpcmVjdFJlc3BvbnNlKHJlc3BvbnNlLCByZXF1ZXN0LCByb3V0ZUlkLCBtYXRjaGVzLCBiYXNlbmFtZSwgZnV0dXJlLnY3X3JlbGF0aXZlU3BsYXRQYXRoKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVJlc3VsdHNbcm91dGVJZF0gPSBhd2FpdCBjb252ZXJ0RGF0YVN0cmF0ZWd5UmVzdWx0VG9EYXRhUmVzdWx0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhUmVzdWx0cztcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjYWxsTG9hZGVyc0FuZE1heWJlUmVzb2x2ZURhdGEoc3RhdGUsIG1hdGNoZXMsIG1hdGNoZXNUb0xvYWQsIGZldGNoZXJzVG9Mb2FkLCByZXF1ZXN0KSB7XG4gICAgbGV0IGN1cnJlbnRNYXRjaGVzID0gc3RhdGUubWF0Y2hlcztcbiAgICAvLyBLaWNrIG9mZiBsb2FkZXJzIGFuZCBmZXRjaGVycyBpbiBwYXJhbGxlbFxuICAgIGxldCBsb2FkZXJSZXN1bHRzUHJvbWlzZSA9IGNhbGxEYXRhU3RyYXRlZ3koXCJsb2FkZXJcIiwgc3RhdGUsIHJlcXVlc3QsIG1hdGNoZXNUb0xvYWQsIG1hdGNoZXMsIG51bGwpO1xuICAgIGxldCBmZXRjaGVyUmVzdWx0c1Byb21pc2UgPSBQcm9taXNlLmFsbChmZXRjaGVyc1RvTG9hZC5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICBpZiAoZi5tYXRjaGVzICYmIGYubWF0Y2ggJiYgZi5jb250cm9sbGVyKSB7XG4gICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgY2FsbERhdGFTdHJhdGVneShcImxvYWRlclwiLCBzdGF0ZSwgY3JlYXRlQ2xpZW50U2lkZVJlcXVlc3QoaW5pdC5oaXN0b3J5LCBmLnBhdGgsIGYuY29udHJvbGxlci5zaWduYWwpLCBbZi5tYXRjaF0sIGYubWF0Y2hlcywgZi5rZXkpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gcmVzdWx0c1tmLm1hdGNoLnJvdXRlLmlkXTtcbiAgICAgICAgLy8gRmV0Y2hlciByZXN1bHRzIGFyZSBrZXllZCBieSBmZXRjaGVyIGtleSBmcm9tIGhlcmUgb24gb3V0LCBub3Qgcm91dGVJZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtmLmtleV06IHJlc3VsdFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgW2Yua2V5XToge1xuICAgICAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgICAgICAgIGVycm9yOiBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwge1xuICAgICAgICAgICAgICBwYXRobmFtZTogZi5wYXRoXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIGxldCBsb2FkZXJSZXN1bHRzID0gYXdhaXQgbG9hZGVyUmVzdWx0c1Byb21pc2U7XG4gICAgbGV0IGZldGNoZXJSZXN1bHRzID0gKGF3YWl0IGZldGNoZXJSZXN1bHRzUHJvbWlzZSkucmVkdWNlKChhY2MsIHIpID0+IE9iamVjdC5hc3NpZ24oYWNjLCByKSwge30pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtyZXNvbHZlTmF2aWdhdGlvbkRlZmVycmVkUmVzdWx0cyhtYXRjaGVzLCBsb2FkZXJSZXN1bHRzLCByZXF1ZXN0LnNpZ25hbCwgY3VycmVudE1hdGNoZXMsIHN0YXRlLmxvYWRlckRhdGEpLCByZXNvbHZlRmV0Y2hlckRlZmVycmVkUmVzdWx0cyhtYXRjaGVzLCBmZXRjaGVyUmVzdWx0cywgZmV0Y2hlcnNUb0xvYWQpXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvYWRlclJlc3VsdHMsXG4gICAgICBmZXRjaGVyUmVzdWx0c1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gaW50ZXJydXB0QWN0aXZlTG9hZHMoKSB7XG4gICAgLy8gRXZlcnkgaW50ZXJydXB0aW9uIHRyaWdnZXJzIGEgcmV2YWxpZGF0aW9uXG4gICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCA9IHRydWU7XG4gICAgLy8gQ2FuY2VsIHBlbmRpbmcgcm91dGUtbGV2ZWwgZGVmZXJyZWRzIGFuZCBtYXJrIGNhbmNlbGxlZCByb3V0ZXMgZm9yXG4gICAgLy8gcmV2YWxpZGF0aW9uXG4gICAgY2FuY2VsbGVkRGVmZXJyZWRSb3V0ZXMucHVzaCguLi5jYW5jZWxBY3RpdmVEZWZlcnJlZHMoKSk7XG4gICAgLy8gQWJvcnQgaW4tZmxpZ2h0IGZldGNoZXIgbG9hZHNcbiAgICBmZXRjaExvYWRNYXRjaGVzLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgaWYgKGZldGNoQ29udHJvbGxlcnMuaGFzKGtleSkpIHtcbiAgICAgICAgY2FuY2VsbGVkRmV0Y2hlckxvYWRzLmFkZChrZXkpO1xuICAgICAgICBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBmZXRjaGVyLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBmZXRjaGVyKTtcbiAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICB9LCB7XG4gICAgICBmbHVzaFN5bmM6IChvcHRzICYmIG9wdHMuZmx1c2hTeW5jKSA9PT0gdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIGVycm9yLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBsZXQgYm91bmRhcnlNYXRjaCA9IGZpbmROZWFyZXN0Qm91bmRhcnkoc3RhdGUubWF0Y2hlcywgcm91dGVJZCk7XG4gICAgZGVsZXRlRmV0Y2hlcihrZXkpO1xuICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgIGVycm9yczoge1xuICAgICAgICBbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZF06IGVycm9yXG4gICAgICB9LFxuICAgICAgZmV0Y2hlcnM6IG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpXG4gICAgfSwge1xuICAgICAgZmx1c2hTeW5jOiAob3B0cyAmJiBvcHRzLmZsdXNoU3luYykgPT09IHRydWVcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBnZXRGZXRjaGVyKGtleSkge1xuICAgIGlmIChmdXR1cmUudjdfZmV0Y2hlclBlcnNpc3QpIHtcbiAgICAgIGFjdGl2ZUZldGNoZXJzLnNldChrZXksIChhY3RpdmVGZXRjaGVycy5nZXQoa2V5KSB8fCAwKSArIDEpO1xuICAgICAgLy8gSWYgdGhpcyBmZXRjaGVyIHdhcyBwcmV2aW91c2x5IG1hcmtlZCBmb3IgZGVsZXRpb24sIHVubWFyayBpdCBzaW5jZSB3ZVxuICAgICAgLy8gaGF2ZSBhIG5ldyBpbnN0YW5jZVxuICAgICAgaWYgKGRlbGV0ZWRGZXRjaGVycy5oYXMoa2V5KSkge1xuICAgICAgICBkZWxldGVkRmV0Y2hlcnMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZS5mZXRjaGVycy5nZXQoa2V5KSB8fCBJRExFX0ZFVENIRVI7XG4gIH1cbiAgZnVuY3Rpb24gZGVsZXRlRmV0Y2hlcihrZXkpIHtcbiAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgIC8vIERvbid0IGFib3J0IHRoZSBjb250cm9sbGVyIGlmIHRoaXMgaXMgYSBkZWxldGlvbiBvZiBhIGZldGNoZXIuc3VibWl0KClcbiAgICAvLyBpbiBpdCdzIGxvYWRpbmcgcGhhc2Ugc2luY2UgLSB3ZSBkb24ndCB3YW50IHRvIGFib3J0IHRoZSBjb3JyZXNwb25kaW5nXG4gICAgLy8gcmV2YWxpZGF0aW9uIGFuZCB3YW50IHRoZW0gdG8gY29tcGxldGUgYW5kIGxhbmRcbiAgICBpZiAoZmV0Y2hDb250cm9sbGVycy5oYXMoa2V5KSAmJiAhKGZldGNoZXIgJiYgZmV0Y2hlci5zdGF0ZSA9PT0gXCJsb2FkaW5nXCIgJiYgZmV0Y2hSZWxvYWRJZHMuaGFzKGtleSkpKSB7XG4gICAgICBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICB9XG4gICAgZmV0Y2hMb2FkTWF0Y2hlcy5kZWxldGUoa2V5KTtcbiAgICBmZXRjaFJlbG9hZElkcy5kZWxldGUoa2V5KTtcbiAgICBmZXRjaFJlZGlyZWN0SWRzLmRlbGV0ZShrZXkpO1xuICAgIGRlbGV0ZWRGZXRjaGVycy5kZWxldGUoa2V5KTtcbiAgICBjYW5jZWxsZWRGZXRjaGVyTG9hZHMuZGVsZXRlKGtleSk7XG4gICAgc3RhdGUuZmV0Y2hlcnMuZGVsZXRlKGtleSk7XG4gIH1cbiAgZnVuY3Rpb24gZGVsZXRlRmV0Y2hlckFuZFVwZGF0ZVN0YXRlKGtleSkge1xuICAgIGlmIChmdXR1cmUudjdfZmV0Y2hlclBlcnNpc3QpIHtcbiAgICAgIGxldCBjb3VudCA9IChhY3RpdmVGZXRjaGVycy5nZXQoa2V5KSB8fCAwKSAtIDE7XG4gICAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgICBhY3RpdmVGZXRjaGVycy5kZWxldGUoa2V5KTtcbiAgICAgICAgZGVsZXRlZEZldGNoZXJzLmFkZChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZlRmV0Y2hlcnMuc2V0KGtleSwgY291bnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVGZXRjaGVyKGtleSk7XG4gICAgfVxuICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgIGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGFib3J0RmV0Y2hlcihrZXkpIHtcbiAgICBsZXQgY29udHJvbGxlciA9IGZldGNoQ29udHJvbGxlcnMuZ2V0KGtleSk7XG4gICAgaW52YXJpYW50KGNvbnRyb2xsZXIsIFwiRXhwZWN0ZWQgZmV0Y2ggY29udHJvbGxlcjogXCIgKyBrZXkpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBmZXRjaENvbnRyb2xsZXJzLmRlbGV0ZShrZXkpO1xuICB9XG4gIGZ1bmN0aW9uIG1hcmtGZXRjaGVyc0RvbmUoa2V5cykge1xuICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICBsZXQgZmV0Y2hlciA9IGdldEZldGNoZXIoa2V5KTtcbiAgICAgIGxldCBkb25lRmV0Y2hlciA9IGdldERvbmVGZXRjaGVyKGZldGNoZXIuZGF0YSk7XG4gICAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBkb25lRmV0Y2hlcik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIG1hcmtGZXRjaFJlZGlyZWN0c0RvbmUoKSB7XG4gICAgbGV0IGRvbmVLZXlzID0gW107XG4gICAgbGV0IHVwZGF0ZWRGZXRjaGVycyA9IGZhbHNlO1xuICAgIGZvciAobGV0IGtleSBvZiBmZXRjaFJlZGlyZWN0SWRzKSB7XG4gICAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgICAgaW52YXJpYW50KGZldGNoZXIsIFwiRXhwZWN0ZWQgZmV0Y2hlcjogXCIgKyBrZXkpO1xuICAgICAgaWYgKGZldGNoZXIuc3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgIGZldGNoUmVkaXJlY3RJZHMuZGVsZXRlKGtleSk7XG4gICAgICAgIGRvbmVLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgdXBkYXRlZEZldGNoZXJzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbWFya0ZldGNoZXJzRG9uZShkb25lS2V5cyk7XG4gICAgcmV0dXJuIHVwZGF0ZWRGZXRjaGVycztcbiAgfVxuICBmdW5jdGlvbiBhYm9ydFN0YWxlRmV0Y2hMb2FkcyhsYW5kZWRJZCkge1xuICAgIGxldCB5ZWV0ZWRLZXlzID0gW107XG4gICAgZm9yIChsZXQgW2tleSwgaWRdIG9mIGZldGNoUmVsb2FkSWRzKSB7XG4gICAgICBpZiAoaWQgPCBsYW5kZWRJZCkge1xuICAgICAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgICAgICBpbnZhcmlhbnQoZmV0Y2hlciwgXCJFeHBlY3RlZCBmZXRjaGVyOiBcIiArIGtleSk7XG4gICAgICAgIGlmIChmZXRjaGVyLnN0YXRlID09PSBcImxvYWRpbmdcIikge1xuICAgICAgICAgIGFib3J0RmV0Y2hlcihrZXkpO1xuICAgICAgICAgIGZldGNoUmVsb2FkSWRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgIHllZXRlZEtleXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG1hcmtGZXRjaGVyc0RvbmUoeWVldGVkS2V5cyk7XG4gICAgcmV0dXJuIHllZXRlZEtleXMubGVuZ3RoID4gMDtcbiAgfVxuICBmdW5jdGlvbiBnZXRCbG9ja2VyKGtleSwgZm4pIHtcbiAgICBsZXQgYmxvY2tlciA9IHN0YXRlLmJsb2NrZXJzLmdldChrZXkpIHx8IElETEVfQkxPQ0tFUjtcbiAgICBpZiAoYmxvY2tlckZ1bmN0aW9ucy5nZXQoa2V5KSAhPT0gZm4pIHtcbiAgICAgIGJsb2NrZXJGdW5jdGlvbnMuc2V0KGtleSwgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gYmxvY2tlcjtcbiAgfVxuICBmdW5jdGlvbiBkZWxldGVCbG9ja2VyKGtleSkge1xuICAgIHN0YXRlLmJsb2NrZXJzLmRlbGV0ZShrZXkpO1xuICAgIGJsb2NrZXJGdW5jdGlvbnMuZGVsZXRlKGtleSk7XG4gIH1cbiAgLy8gVXRpbGl0eSBmdW5jdGlvbiB0byB1cGRhdGUgYmxvY2tlcnMsIGVuc3VyaW5nIHZhbGlkIHN0YXRlIHRyYW5zaXRpb25zXG4gIGZ1bmN0aW9uIHVwZGF0ZUJsb2NrZXIoa2V5LCBuZXdCbG9ja2VyKSB7XG4gICAgbGV0IGJsb2NrZXIgPSBzdGF0ZS5ibG9ja2Vycy5nZXQoa2V5KSB8fCBJRExFX0JMT0NLRVI7XG4gICAgLy8gUG9vciBtYW5zIHN0YXRlIG1hY2hpbmUgOilcbiAgICAvLyBodHRwczovL21lcm1haWQubGl2ZS9lZGl0I3Bha286ZU5xVmtjOU93ekFNeGw4bDhubmpBWXJFdERJT0hFQklnd3ZLSlRSZUd5M19sRHBJcU8yN2s2YXdNRzBYY3JMbG56ODdud2RvbkVTb2dLWFhCdUU3OXJxNzVYWk8zLXlIZHMwUkpWdXY3MFlyUGxVckNFZTJIZnJPUlMzcnVicVpmdWh0cGc1Qzl3azV0WjRWS2NSVXE4OHE5WjhSUzAtNDhjRTFpSEprTDB1Z2JIdUZMdXM5TDZzcFp5OG5YOU1QMkNOZG9tVmFwb3NxdTNmR2F5VDhUOC1qSlF3aGVwb19VdHBnQlFhREVVb20wNGRaaEFOMWFKQkRsVUtKQnhFMWNlQjJTbWowTWxuLUlCVzVBRlUyZHdVaWt0dF8yUWFxMmRCZmFLZEV1cDg1VVY3WWQtZEtqbG5rYWJsMlB2cjBEVGtUcmVNXG4gICAgaW52YXJpYW50KGJsb2NrZXIuc3RhdGUgPT09IFwidW5ibG9ja2VkXCIgJiYgbmV3QmxvY2tlci5zdGF0ZSA9PT0gXCJibG9ja2VkXCIgfHwgYmxvY2tlci5zdGF0ZSA9PT0gXCJibG9ja2VkXCIgJiYgbmV3QmxvY2tlci5zdGF0ZSA9PT0gXCJibG9ja2VkXCIgfHwgYmxvY2tlci5zdGF0ZSA9PT0gXCJibG9ja2VkXCIgJiYgbmV3QmxvY2tlci5zdGF0ZSA9PT0gXCJwcm9jZWVkaW5nXCIgfHwgYmxvY2tlci5zdGF0ZSA9PT0gXCJibG9ja2VkXCIgJiYgbmV3QmxvY2tlci5zdGF0ZSA9PT0gXCJ1bmJsb2NrZWRcIiB8fCBibG9ja2VyLnN0YXRlID09PSBcInByb2NlZWRpbmdcIiAmJiBuZXdCbG9ja2VyLnN0YXRlID09PSBcInVuYmxvY2tlZFwiLCBcIkludmFsaWQgYmxvY2tlciBzdGF0ZSB0cmFuc2l0aW9uOiBcIiArIGJsb2NrZXIuc3RhdGUgKyBcIiAtPiBcIiArIG5ld0Jsb2NrZXIuc3RhdGUpO1xuICAgIGxldCBibG9ja2VycyA9IG5ldyBNYXAoc3RhdGUuYmxvY2tlcnMpO1xuICAgIGJsb2NrZXJzLnNldChrZXksIG5ld0Jsb2NrZXIpO1xuICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgIGJsb2NrZXJzXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gc2hvdWxkQmxvY2tOYXZpZ2F0aW9uKF9yZWY0KSB7XG4gICAgbGV0IHtcbiAgICAgIGN1cnJlbnRMb2NhdGlvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICB9ID0gX3JlZjQ7XG4gICAgaWYgKGJsb2NrZXJGdW5jdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBXZSBvbnkgc3VwcG9ydCBhIHNpbmdsZSBhY3RpdmUgYmxvY2tlciBhdCB0aGUgbW9tZW50IHNpbmNlIHdlIGRvbid0IGhhdmVcbiAgICAvLyBhbnkgY29tcGVsbGluZyB1c2UgY2FzZXMgZm9yIG11bHRpLWJsb2NrZXIgeWV0XG4gICAgaWYgKGJsb2NrZXJGdW5jdGlvbnMuc2l6ZSA+IDEpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsIFwiQSByb3V0ZXIgb25seSBzdXBwb3J0cyBvbmUgYmxvY2tlciBhdCBhIHRpbWVcIik7XG4gICAgfVxuICAgIGxldCBlbnRyaWVzID0gQXJyYXkuZnJvbShibG9ja2VyRnVuY3Rpb25zLmVudHJpZXMoKSk7XG4gICAgbGV0IFtibG9ja2VyS2V5LCBibG9ja2VyRnVuY3Rpb25dID0gZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdO1xuICAgIGxldCBibG9ja2VyID0gc3RhdGUuYmxvY2tlcnMuZ2V0KGJsb2NrZXJLZXkpO1xuICAgIGlmIChibG9ja2VyICYmIGJsb2NrZXIuc3RhdGUgPT09IFwicHJvY2VlZGluZ1wiKSB7XG4gICAgICAvLyBJZiB0aGUgYmxvY2tlciBpcyBjdXJyZW50bHkgcHJvY2VlZGluZywgd2UgZG9uJ3QgbmVlZCB0byByZS1jaGVja1xuICAgICAgLy8gaXQgYW5kIGNhbiBsZXQgdGhpcyBuYXZpZ2F0aW9uIGNvbnRpbnVlXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgd2UncmUgdW5ibG9ja2VkL2Jsb2NrZWQgc28gd2UgbmVlZCB0byBjaGVjayB0aGVcbiAgICAvLyB1c2VyLXByb3ZpZGVkIGJsb2NrZXIgZnVuY3Rpb25cbiAgICBpZiAoYmxvY2tlckZ1bmN0aW9uKHtcbiAgICAgIGN1cnJlbnRMb2NhdGlvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICB9KSkge1xuICAgICAgcmV0dXJuIGJsb2NrZXJLZXk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZU5hdmlnYXRpb25hbDQwNChwYXRobmFtZSkge1xuICAgIGxldCBlcnJvciA9IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7XG4gICAgICBwYXRobmFtZVxuICAgIH0pO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCB7XG4gICAgICBtYXRjaGVzLFxuICAgICAgcm91dGVcbiAgICB9ID0gZ2V0U2hvcnRDaXJjdWl0TWF0Y2hlcyhyb3V0ZXNUb1VzZSk7XG4gICAgLy8gQ2FuY2VsIGFsbCBwZW5kaW5nIGRlZmVycmVkIG9uIDQwNHMgc2luY2Ugd2UgZG9uJ3Qga2VlcCBhbnkgcm91dGVzXG4gICAgY2FuY2VsQWN0aXZlRGVmZXJyZWRzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vdEZvdW5kTWF0Y2hlczogbWF0Y2hlcyxcbiAgICAgIHJvdXRlLFxuICAgICAgZXJyb3JcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZURpc2NvdmVyUm91dGVFcnJvcihwYXRobmFtZSwgZGlzY292ZXJSZXN1bHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYm91bmRhcnlJZDogZmluZE5lYXJlc3RCb3VuZGFyeShkaXNjb3ZlclJlc3VsdC5wYXJ0aWFsTWF0Y2hlcykucm91dGUuaWQsXG4gICAgICBlcnJvcjogZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDAsIHtcbiAgICAgICAgdHlwZTogXCJyb3V0ZS1kaXNjb3ZlcnlcIixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IGRpc2NvdmVyUmVzdWx0LmVycm9yICE9IG51bGwgJiYgXCJtZXNzYWdlXCIgaW4gZGlzY292ZXJSZXN1bHQuZXJyb3IgPyBkaXNjb3ZlclJlc3VsdC5lcnJvciA6IFN0cmluZyhkaXNjb3ZlclJlc3VsdC5lcnJvcilcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBjYW5jZWxBY3RpdmVEZWZlcnJlZHMocHJlZGljYXRlKSB7XG4gICAgbGV0IGNhbmNlbGxlZFJvdXRlSWRzID0gW107XG4gICAgYWN0aXZlRGVmZXJyZWRzLmZvckVhY2goKGRmZCwgcm91dGVJZCkgPT4ge1xuICAgICAgaWYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHJvdXRlSWQpKSB7XG4gICAgICAgIC8vIENhbmNlbCB0aGUgZGVmZXJyZWQgLSBidXQgZG8gbm90IHJlbW92ZSBmcm9tIGFjdGl2ZURlZmVycmVkcyBoZXJlIC1cbiAgICAgICAgLy8gd2UgcmVseSBvbiB0aGUgc3Vic2NyaWJlcnMgdG8gZG8gdGhhdCBzbyBvdXIgdGVzdHMgY2FuIGFzc2VydCBwcm9wZXJcbiAgICAgICAgLy8gY2xlYW51cCB2aWEgX2ludGVybmFsQWN0aXZlRGVmZXJyZWRzXG4gICAgICAgIGRmZC5jYW5jZWwoKTtcbiAgICAgICAgY2FuY2VsbGVkUm91dGVJZHMucHVzaChyb3V0ZUlkKTtcbiAgICAgICAgYWN0aXZlRGVmZXJyZWRzLmRlbGV0ZShyb3V0ZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2FuY2VsbGVkUm91dGVJZHM7XG4gIH1cbiAgLy8gT3B0IGluIHRvIGNhcHR1cmluZyBhbmQgcmVwb3J0aW5nIHNjcm9sbCBwb3NpdGlvbnMgZHVyaW5nIG5hdmlnYXRpb25zLFxuICAvLyB1c2VkIGJ5IHRoZSA8U2Nyb2xsUmVzdG9yYXRpb24+IGNvbXBvbmVudFxuICBmdW5jdGlvbiBlbmFibGVTY3JvbGxSZXN0b3JhdGlvbihwb3NpdGlvbnMsIGdldFBvc2l0aW9uLCBnZXRLZXkpIHtcbiAgICBzYXZlZFNjcm9sbFBvc2l0aW9ucyA9IHBvc2l0aW9ucztcbiAgICBnZXRTY3JvbGxQb3NpdGlvbiA9IGdldFBvc2l0aW9uO1xuICAgIGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5ID0gZ2V0S2V5IHx8IG51bGw7XG4gICAgLy8gUGVyZm9ybSBpbml0aWFsIGh5ZHJhdGlvbiBzY3JvbGwgcmVzdG9yYXRpb24sIHNpbmNlIHdlIG1pc3MgdGhlIGJvYXQgb25cbiAgICAvLyB0aGUgaW5pdGlhbCB1cGRhdGVTdGF0ZSgpIGJlY2F1c2Ugd2UndmUgbm90IHlldCByZW5kZXJlZCA8U2Nyb2xsUmVzdG9yYXRpb24vPlxuICAgIC8vIGFuZCB0aGVyZWZvcmUgaGF2ZSBubyBzYXZlZFNjcm9sbFBvc2l0aW9ucyBhdmFpbGFibGVcbiAgICBpZiAoIWluaXRpYWxTY3JvbGxSZXN0b3JlZCAmJiBzdGF0ZS5uYXZpZ2F0aW9uID09PSBJRExFX05BVklHQVRJT04pIHtcbiAgICAgIGluaXRpYWxTY3JvbGxSZXN0b3JlZCA9IHRydWU7XG4gICAgICBsZXQgeSA9IGdldFNhdmVkU2Nyb2xsUG9zaXRpb24oc3RhdGUubG9jYXRpb24sIHN0YXRlLm1hdGNoZXMpO1xuICAgICAgaWYgKHkgIT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uOiB5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc2F2ZWRTY3JvbGxQb3NpdGlvbnMgPSBudWxsO1xuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuICAgICAgZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U2Nyb2xsS2V5KGxvY2F0aW9uLCBtYXRjaGVzKSB7XG4gICAgaWYgKGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5KSB7XG4gICAgICBsZXQga2V5ID0gZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkobG9jYXRpb24sIG1hdGNoZXMubWFwKG0gPT4gY29udmVydFJvdXRlTWF0Y2hUb1VpTWF0Y2gobSwgc3RhdGUubG9hZGVyRGF0YSkpKTtcbiAgICAgIHJldHVybiBrZXkgfHwgbG9jYXRpb24ua2V5O1xuICAgIH1cbiAgICByZXR1cm4gbG9jYXRpb24ua2V5O1xuICB9XG4gIGZ1bmN0aW9uIHNhdmVTY3JvbGxQb3NpdGlvbihsb2NhdGlvbiwgbWF0Y2hlcykge1xuICAgIGlmIChzYXZlZFNjcm9sbFBvc2l0aW9ucyAmJiBnZXRTY3JvbGxQb3NpdGlvbikge1xuICAgICAgbGV0IGtleSA9IGdldFNjcm9sbEtleShsb2NhdGlvbiwgbWF0Y2hlcyk7XG4gICAgICBzYXZlZFNjcm9sbFBvc2l0aW9uc1trZXldID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U2F2ZWRTY3JvbGxQb3NpdGlvbihsb2NhdGlvbiwgbWF0Y2hlcykge1xuICAgIGlmIChzYXZlZFNjcm9sbFBvc2l0aW9ucykge1xuICAgICAgbGV0IGtleSA9IGdldFNjcm9sbEtleShsb2NhdGlvbiwgbWF0Y2hlcyk7XG4gICAgICBsZXQgeSA9IHNhdmVkU2Nyb2xsUG9zaXRpb25zW2tleV07XG4gICAgICBpZiAodHlwZW9mIHkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGNoZWNrRm9nT2ZXYXIobWF0Y2hlcywgcm91dGVzVG9Vc2UsIHBhdGhuYW1lKSB7XG4gICAgaWYgKHBhdGNoUm91dGVzT25OYXZpZ2F0aW9uSW1wbCkge1xuICAgICAgLy8gRG9uJ3QgYm90aGVyIHJlLWNhbGxpbmcgcGF0Y2hSb3V0ZU9uTWlzcyBmb3IgYSBwYXRoIHdlJ3ZlIGFscmVhZHlcbiAgICAgIC8vIHByb2Nlc3NlZC4gIHRoZSBsYXN0IGV4ZWN1dGlvbiB3b3VsZCBoYXZlIHBhdGNoZWQgdGhlIHJvdXRlIHRyZWVcbiAgICAgIC8vIGFjY29yZGluZ2x5IHNvIGBtYXRjaGVzYCBoZXJlIGFyZSBhbHJlYWR5IGFjY3VyYXRlLlxuICAgICAgaWYgKGRpc2NvdmVyZWRSb3V0ZXMuaGFzKHBhdGhuYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgbWF0Y2hlc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgIGxldCBmb2dNYXRjaGVzID0gbWF0Y2hSb3V0ZXNJbXBsKHJvdXRlc1RvVXNlLCBwYXRobmFtZSwgYmFzZW5hbWUsIHRydWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICBtYXRjaGVzOiBmb2dNYXRjaGVzIHx8IFtdXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWF0Y2hlc1swXS5wYXJhbXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBJZiB3ZSBtYXRjaGVkIGEgZHluYW1pYyBwYXJhbSBvciBhIHNwbGF0LCBpdCBtaWdodCBvbmx5IGJlIGJlY2F1c2VcbiAgICAgICAgICAvLyB3ZSBoYXZlbid0IHlldCBkaXNjb3ZlcmVkIG90aGVyIHJvdXRlcyB0aGF0IHdvdWxkIG1hdGNoIHdpdGggYVxuICAgICAgICAgIC8vIGhpZ2hlciBzY29yZS4gIENhbGwgcGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb24ganVzdCB0byBiZSBzdXJlXG4gICAgICAgICAgbGV0IHBhcnRpYWxNYXRjaGVzID0gbWF0Y2hSb3V0ZXNJbXBsKHJvdXRlc1RvVXNlLCBwYXRobmFtZSwgYmFzZW5hbWUsIHRydWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICBtYXRjaGVzOiBwYXJ0aWFsTWF0Y2hlc1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICBtYXRjaGVzOiBudWxsXG4gICAgfTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlclJvdXRlcyhtYXRjaGVzLCBwYXRobmFtZSwgc2lnbmFsKSB7XG4gICAgbGV0IHBhcnRpYWxNYXRjaGVzID0gbWF0Y2hlcztcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IGlzTm9uSE1SID0gaW5GbGlnaHREYXRhUm91dGVzID09IG51bGw7XG4gICAgICBsZXQgcm91dGVzVG9Vc2UgPSBpbkZsaWdodERhdGFSb3V0ZXMgfHwgZGF0YVJvdXRlcztcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGxvYWRMYXp5Um91dGVDaGlsZHJlbihwYXRjaFJvdXRlc09uTmF2aWdhdGlvbkltcGwsIHBhdGhuYW1lLCBwYXJ0aWFsTWF0Y2hlcywgcm91dGVzVG9Vc2UsIG1hbmlmZXN0LCBtYXBSb3V0ZVByb3BlcnRpZXMsIHBlbmRpbmdQYXRjaFJvdXRlcywgc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgZXJyb3I6IGUsXG4gICAgICAgICAgcGFydGlhbE1hdGNoZXNcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBub3QgaW4gdGhlIG1pZGRsZSBvZiBhbiBITVIgcmV2YWxpZGF0aW9uIGFuZCB3ZSBjaGFuZ2VkIHRoZVxuICAgICAgICAvLyByb3V0ZXMsIHByb3ZpZGUgYSBuZXcgaWRlbnRpdHkgc28gd2hlbiB3ZSBgdXBkYXRlU3RhdGVgIGF0IHRoZSBlbmQgb2ZcbiAgICAgICAgLy8gdGhpcyBuYXZpZ2F0aW9uL2ZldGNoIGByb3V0ZXIucm91dGVzYCB3aWxsIGJlIGEgbmV3IGlkZW50aXR5IGFuZFxuICAgICAgICAvLyB0cmlnZ2VyIGEgcmUtcnVuIG9mIG1lbW9pemVkIGByb3V0ZXIucm91dGVzYCBkZXBlbmRlbmNpZXMuXG4gICAgICAgIC8vIEhNUiB3aWxsIGFscmVhZHkgdXBkYXRlIHRoZSBpZGVudGl0eSBhbmQgcmVmbG93IHdoZW4gaXQgbGFuZHNcbiAgICAgICAgLy8gYGluRmxpZ2h0RGF0YVJvdXRlc2AgaW4gYGNvbXBsZXRlTmF2aWdhdGlvbmBcbiAgICAgICAgaWYgKGlzTm9uSE1SKSB7XG4gICAgICAgICAgZGF0YVJvdXRlcyA9IFsuLi5kYXRhUm91dGVzXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJhYm9ydGVkXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxldCBuZXdNYXRjaGVzID0gbWF0Y2hSb3V0ZXMocm91dGVzVG9Vc2UsIHBhdGhuYW1lLCBiYXNlbmFtZSk7XG4gICAgICBpZiAobmV3TWF0Y2hlcykge1xuICAgICAgICBhZGRUb0ZpZm9RdWV1ZShwYXRobmFtZSwgZGlzY292ZXJlZFJvdXRlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgbWF0Y2hlczogbmV3TWF0Y2hlc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgbGV0IG5ld1BhcnRpYWxNYXRjaGVzID0gbWF0Y2hSb3V0ZXNJbXBsKHJvdXRlc1RvVXNlLCBwYXRobmFtZSwgYmFzZW5hbWUsIHRydWUpO1xuICAgICAgLy8gQXZvaWQgbG9vcHMgaWYgdGhlIHNlY29uZCBwYXNzIHJlc3VsdHMgaW4gdGhlIHNhbWUgcGFydGlhbCBtYXRjaGVzXG4gICAgICBpZiAoIW5ld1BhcnRpYWxNYXRjaGVzIHx8IHBhcnRpYWxNYXRjaGVzLmxlbmd0aCA9PT0gbmV3UGFydGlhbE1hdGNoZXMubGVuZ3RoICYmIHBhcnRpYWxNYXRjaGVzLmV2ZXJ5KChtLCBpKSA9PiBtLnJvdXRlLmlkID09PSBuZXdQYXJ0aWFsTWF0Y2hlc1tpXS5yb3V0ZS5pZCkpIHtcbiAgICAgICAgYWRkVG9GaWZvUXVldWUocGF0aG5hbWUsIGRpc2NvdmVyZWRSb3V0ZXMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgIG1hdGNoZXM6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHBhcnRpYWxNYXRjaGVzID0gbmV3UGFydGlhbE1hdGNoZXM7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFkZFRvRmlmb1F1ZXVlKHBhdGgsIHF1ZXVlKSB7XG4gICAgaWYgKHF1ZXVlLnNpemUgPj0gZGlzY292ZXJlZFJvdXRlc01heFNpemUpIHtcbiAgICAgIGxldCBmaXJzdCA9IHF1ZXVlLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgIHF1ZXVlLmRlbGV0ZShmaXJzdCk7XG4gICAgfVxuICAgIHF1ZXVlLmFkZChwYXRoKTtcbiAgfVxuICBmdW5jdGlvbiBfaW50ZXJuYWxTZXRSb3V0ZXMobmV3Um91dGVzKSB7XG4gICAgbWFuaWZlc3QgPSB7fTtcbiAgICBpbkZsaWdodERhdGFSb3V0ZXMgPSBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzKG5ld1JvdXRlcywgbWFwUm91dGVQcm9wZXJ0aWVzLCB1bmRlZmluZWQsIG1hbmlmZXN0KTtcbiAgfVxuICBmdW5jdGlvbiBwYXRjaFJvdXRlcyhyb3V0ZUlkLCBjaGlsZHJlbikge1xuICAgIGxldCBpc05vbkhNUiA9IGluRmxpZ2h0RGF0YVJvdXRlcyA9PSBudWxsO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIHBhdGNoUm91dGVzSW1wbChyb3V0ZUlkLCBjaGlsZHJlbiwgcm91dGVzVG9Vc2UsIG1hbmlmZXN0LCBtYXBSb3V0ZVByb3BlcnRpZXMpO1xuICAgIC8vIElmIHdlIGFyZSBub3QgaW4gdGhlIG1pZGRsZSBvZiBhbiBITVIgcmV2YWxpZGF0aW9uIGFuZCB3ZSBjaGFuZ2VkIHRoZVxuICAgIC8vIHJvdXRlcywgcHJvdmlkZSBhIG5ldyBpZGVudGl0eSBhbmQgdHJpZ2dlciBhIHJlZmxvdyB2aWEgYHVwZGF0ZVN0YXRlYFxuICAgIC8vIHRvIHJlLXJ1biBtZW1vaXplZCBgcm91dGVyLnJvdXRlc2AgZGVwZW5kZW5jaWVzLlxuICAgIC8vIEhNUiB3aWxsIGFscmVhZHkgdXBkYXRlIHRoZSBpZGVudGl0eSBhbmQgcmVmbG93IHdoZW4gaXQgbGFuZHNcbiAgICAvLyBgaW5GbGlnaHREYXRhUm91dGVzYCBpbiBgY29tcGxldGVOYXZpZ2F0aW9uYFxuICAgIGlmIChpc05vbkhNUikge1xuICAgICAgZGF0YVJvdXRlcyA9IFsuLi5kYXRhUm91dGVzXTtcbiAgICAgIHVwZGF0ZVN0YXRlKHt9KTtcbiAgICB9XG4gIH1cbiAgcm91dGVyID0ge1xuICAgIGdldCBiYXNlbmFtZSgpIHtcbiAgICAgIHJldHVybiBiYXNlbmFtZTtcbiAgICB9LFxuICAgIGdldCBmdXR1cmUoKSB7XG4gICAgICByZXR1cm4gZnV0dXJlO1xuICAgIH0sXG4gICAgZ2V0IHN0YXRlKCkge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0sXG4gICAgZ2V0IHJvdXRlcygpIHtcbiAgICAgIHJldHVybiBkYXRhUm91dGVzO1xuICAgIH0sXG4gICAgZ2V0IHdpbmRvdygpIHtcbiAgICAgIHJldHVybiByb3V0ZXJXaW5kb3c7XG4gICAgfSxcbiAgICBpbml0aWFsaXplLFxuICAgIHN1YnNjcmliZSxcbiAgICBlbmFibGVTY3JvbGxSZXN0b3JhdGlvbixcbiAgICBuYXZpZ2F0ZSxcbiAgICBmZXRjaCxcbiAgICByZXZhbGlkYXRlLFxuICAgIC8vIFBhc3N0aHJvdWdoIHRvIGhpc3RvcnktYXdhcmUgY3JlYXRlSHJlZiB1c2VkIGJ5IHVzZUhyZWYgc28gd2UgZ2V0IHByb3BlclxuICAgIC8vIGhhc2gtYXdhcmUgVVJMcyBpbiBET00gcGF0aHNcbiAgICBjcmVhdGVIcmVmOiB0byA9PiBpbml0Lmhpc3RvcnkuY3JlYXRlSHJlZih0byksXG4gICAgZW5jb2RlTG9jYXRpb246IHRvID0+IGluaXQuaGlzdG9yeS5lbmNvZGVMb2NhdGlvbih0byksXG4gICAgZ2V0RmV0Y2hlcixcbiAgICBkZWxldGVGZXRjaGVyOiBkZWxldGVGZXRjaGVyQW5kVXBkYXRlU3RhdGUsXG4gICAgZGlzcG9zZSxcbiAgICBnZXRCbG9ja2VyLFxuICAgIGRlbGV0ZUJsb2NrZXIsXG4gICAgcGF0Y2hSb3V0ZXMsXG4gICAgX2ludGVybmFsRmV0Y2hDb250cm9sbGVyczogZmV0Y2hDb250cm9sbGVycyxcbiAgICBfaW50ZXJuYWxBY3RpdmVEZWZlcnJlZHM6IGFjdGl2ZURlZmVycmVkcyxcbiAgICAvLyBUT0RPOiBSZW1vdmUgc2V0Um91dGVzLCBpdCdzIHRlbXBvcmFyeSB0byBhdm9pZCBkZWFsaW5nIHdpdGhcbiAgICAvLyB1cGRhdGluZyB0aGUgdHJlZSB3aGlsZSB2YWxpZGF0aW5nIHRoZSB1cGRhdGUgYWxnb3JpdGhtLlxuICAgIF9pbnRlcm5hbFNldFJvdXRlc1xuICB9O1xuICByZXR1cm4gcm91dGVyO1xufVxuLy8jZW5kcmVnaW9uXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8jcmVnaW9uIGNyZWF0ZVN0YXRpY0hhbmRsZXJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5jb25zdCBVTlNBRkVfREVGRVJSRURfU1lNQk9MID0gU3ltYm9sKFwiZGVmZXJyZWRcIik7XG5mdW5jdGlvbiBjcmVhdGVTdGF0aWNIYW5kbGVyKHJvdXRlcywgb3B0cykge1xuICBpbnZhcmlhbnQocm91dGVzLmxlbmd0aCA+IDAsIFwiWW91IG11c3QgcHJvdmlkZSBhIG5vbi1lbXB0eSByb3V0ZXMgYXJyYXkgdG8gY3JlYXRlU3RhdGljSGFuZGxlclwiKTtcbiAgbGV0IG1hbmlmZXN0ID0ge307XG4gIGxldCBiYXNlbmFtZSA9IChvcHRzID8gb3B0cy5iYXNlbmFtZSA6IG51bGwpIHx8IFwiL1wiO1xuICBsZXQgbWFwUm91dGVQcm9wZXJ0aWVzO1xuICBpZiAob3B0cyAhPSBudWxsICYmIG9wdHMubWFwUm91dGVQcm9wZXJ0aWVzKSB7XG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzID0gb3B0cy5tYXBSb3V0ZVByb3BlcnRpZXM7XG4gIH0gZWxzZSBpZiAob3B0cyAhPSBudWxsICYmIG9wdHMuZGV0ZWN0RXJyb3JCb3VuZGFyeSkge1xuICAgIC8vIElmIHRoZXkgYXJlIHN0aWxsIHVzaW5nIHRoZSBkZXByZWNhdGVkIHZlcnNpb24sIHdyYXAgaXQgd2l0aCB0aGUgbmV3IEFQSVxuICAgIGxldCBkZXRlY3RFcnJvckJvdW5kYXJ5ID0gb3B0cy5kZXRlY3RFcnJvckJvdW5kYXJ5O1xuICAgIG1hcFJvdXRlUHJvcGVydGllcyA9IHJvdXRlID0+ICh7XG4gICAgICBoYXNFcnJvckJvdW5kYXJ5OiBkZXRlY3RFcnJvckJvdW5kYXJ5KHJvdXRlKVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG1hcFJvdXRlUHJvcGVydGllcyA9IGRlZmF1bHRNYXBSb3V0ZVByb3BlcnRpZXM7XG4gIH1cbiAgLy8gQ29uZmlnIGRyaXZlbiBiZWhhdmlvciBmbGFnc1xuICBsZXQgZnV0dXJlID0gX2V4dGVuZHMoe1xuICAgIHY3X3JlbGF0aXZlU3BsYXRQYXRoOiBmYWxzZSxcbiAgICB2N190aHJvd0Fib3J0UmVhc29uOiBmYWxzZVxuICB9LCBvcHRzID8gb3B0cy5mdXR1cmUgOiBudWxsKTtcbiAgbGV0IGRhdGFSb3V0ZXMgPSBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzKHJvdXRlcywgbWFwUm91dGVQcm9wZXJ0aWVzLCB1bmRlZmluZWQsIG1hbmlmZXN0KTtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSgpIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgZG9jdW1lbnQgcmVxdWVzdHMsIGluIHdoaWNoIHdlIHdhbnQgdG9cbiAgICogY2FsbCBhbiBvcHRpb25hbCBhY3Rpb24gYW5kIHBvdGVudGlhbGx5IG11bHRpcGxlIGxvYWRlcnMgZm9yIGFsbCBuZXN0ZWRcbiAgICogcm91dGVzLiAgSXQgcmV0dXJucyBhIFN0YXRpY0hhbmRsZXJDb250ZXh0IG9iamVjdCwgd2hpY2ggaXMgdmVyeSBzaW1pbGFyXG4gICAqIHRvIHRoZSByb3V0ZXIgc3RhdGUgKGxvY2F0aW9uLCBsb2FkZXJEYXRhLCBhY3Rpb25EYXRhLCBlcnJvcnMsIGV0Yy4pIGFuZFxuICAgKiBhbHNvIGFkZHMgU1NSLXNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YXR1c0NvZGUgYW5kIGhlYWRlcnNcbiAgICogZnJvbSBhY3Rpb24vbG9hZGVycyBSZXNwb25zZXMuXG4gICAqXG4gICAqIEl0IF9zaG91bGRfIG5ldmVyIHRocm93IGFuZCBzaG91bGQgcmVwb3J0IGFsbCBlcnJvcnMgdGhyb3VnaCB0aGVcbiAgICogcmV0dXJuZWQgY29udGV4dC5lcnJvcnMgb2JqZWN0LCBwcm9wZXJseSBhc3NvY2lhdGluZyBlcnJvcnMgdG8gdGhlaXIgZXJyb3JcbiAgICogYm91bmRhcnkuICBBZGRpdGlvbmFsbHksIGl0IHRyYWNrcyBfZGVlcGVzdFJlbmRlcmVkQm91bmRhcnlJZCB3aGljaCBjYW4gYmVcbiAgICogdXNlZCB0byBlbXVsYXRlIFJlYWN0IGVycm9yIGJvdW5kYXJpZXMgZHVyaW5nIFNTciBieSBwZXJmb3JtaW5nIGEgc2Vjb25kXG4gICAqIHBhc3Mgb25seSBkb3duIHRvIHRoZSBib3VuZGFyeUlkLlxuICAgKlxuICAgKiBUaGUgb25lIGV4Y2VwdGlvbiB3aGVyZSB3ZSBkbyBub3QgcmV0dXJuIGEgU3RhdGljSGFuZGxlckNvbnRleHQgaXMgd2hlbiBhXG4gICAqIHJlZGlyZWN0IHJlc3BvbnNlIGlzIHJldHVybmVkIG9yIHRocm93biBmcm9tIGFueSBhY3Rpb24vbG9hZGVyLiAgV2VcbiAgICogcHJvcGFnYXRlIHRoYXQgb3V0IGFuZCByZXR1cm4gdGhlIHJhdyBSZXNwb25zZSBzbyB0aGUgSFRUUCBzZXJ2ZXIgY2FuXG4gICAqIHJldHVybiBpdCBkaXJlY3RseS5cbiAgICpcbiAgICogLSBgb3B0cy5yZXF1ZXN0Q29udGV4dGAgaXMgYW4gb3B0aW9uYWwgc2VydmVyIGNvbnRleHQgdGhhdCB3aWxsIGJlIHBhc3NlZFxuICAgKiAgIHRvIGFjdGlvbnMvbG9hZGVycyBpbiB0aGUgYGNvbnRleHRgIHBhcmFtZXRlclxuICAgKiAtIGBvcHRzLnNraXBMb2FkZXJFcnJvckJ1YmJsaW5nYCBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCB3aWxsIHByZXZlbnRcbiAgICogICB0aGUgYnViYmxpbmcgb2YgZXJyb3JzIHdoaWNoIGFsbG93cyBzaW5nbGUtZmV0Y2gtdHlwZSBpbXBsZW1lbnRhdGlvbnNcbiAgICogICB3aGVyZSB0aGUgY2xpZW50IHdpbGwgaGFuZGxlIHRoZSBidWJibGluZyBhbmQgd2UgbWF5IG5lZWQgdG8gcmV0dXJuIGRhdGFcbiAgICogICBmb3IgdGhlIGhhbmRsaW5nIHJvdXRlXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBxdWVyeShyZXF1ZXN0LCBfdGVtcDMpIHtcbiAgICBsZXQge1xuICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICBza2lwTG9hZGVyRXJyb3JCdWJibGluZyxcbiAgICAgIHVuc3RhYmxlX2RhdGFTdHJhdGVneVxuICAgIH0gPSBfdGVtcDMgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAzO1xuICAgIGxldCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAgICBsZXQgbWV0aG9kID0gcmVxdWVzdC5tZXRob2Q7XG4gICAgbGV0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oXCJcIiwgY3JlYXRlUGF0aCh1cmwpLCBudWxsLCBcImRlZmF1bHRcIik7XG4gICAgbGV0IG1hdGNoZXMgPSBtYXRjaFJvdXRlcyhkYXRhUm91dGVzLCBsb2NhdGlvbiwgYmFzZW5hbWUpO1xuICAgIC8vIFNTUiBzdXBwb3J0cyBIRUFEIHJlcXVlc3RzIHdoaWxlIFNQQSBkb2Vzbid0XG4gICAgaWYgKCFpc1ZhbGlkTWV0aG9kKG1ldGhvZCkgJiYgbWV0aG9kICE9PSBcIkhFQURcIikge1xuICAgICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgbWV0aG9kXG4gICAgICB9KTtcbiAgICAgIGxldCB7XG4gICAgICAgIG1hdGNoZXM6IG1ldGhvZE5vdEFsbG93ZWRNYXRjaGVzLFxuICAgICAgICByb3V0ZVxuICAgICAgfSA9IGdldFNob3J0Q2lyY3VpdE1hdGNoZXMoZGF0YVJvdXRlcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIG1hdGNoZXM6IG1ldGhvZE5vdEFsbG93ZWRNYXRjaGVzLFxuICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgYWN0aW9uRGF0YTogbnVsbCxcbiAgICAgICAgZXJyb3JzOiB7XG4gICAgICAgICAgW3JvdXRlLmlkXTogZXJyb3JcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyb3Iuc3RhdHVzLFxuICAgICAgICBsb2FkZXJIZWFkZXJzOiB7fSxcbiAgICAgICAgYWN0aW9uSGVhZGVyczoge30sXG4gICAgICAgIGFjdGl2ZURlZmVycmVkczogbnVsbFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCFtYXRjaGVzKSB7XG4gICAgICBsZXQgZXJyb3IgPSBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwge1xuICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWVcbiAgICAgIH0pO1xuICAgICAgbGV0IHtcbiAgICAgICAgbWF0Y2hlczogbm90Rm91bmRNYXRjaGVzLFxuICAgICAgICByb3V0ZVxuICAgICAgfSA9IGdldFNob3J0Q2lyY3VpdE1hdGNoZXMoZGF0YVJvdXRlcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcyxcbiAgICAgICAgbG9hZGVyRGF0YToge30sXG4gICAgICAgIGFjdGlvbkRhdGE6IG51bGwsXG4gICAgICAgIGVycm9yczoge1xuICAgICAgICAgIFtyb3V0ZS5pZF06IGVycm9yXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1c0NvZGU6IGVycm9yLnN0YXR1cyxcbiAgICAgICAgbG9hZGVySGVhZGVyczoge30sXG4gICAgICAgIGFjdGlvbkhlYWRlcnM6IHt9LFxuICAgICAgICBhY3RpdmVEZWZlcnJlZHM6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBhd2FpdCBxdWVyeUltcGwocmVxdWVzdCwgbG9jYXRpb24sIG1hdGNoZXMsIHJlcXVlc3RDb250ZXh0LCB1bnN0YWJsZV9kYXRhU3RyYXRlZ3kgfHwgbnVsbCwgc2tpcExvYWRlckVycm9yQnViYmxpbmcgPT09IHRydWUsIG51bGwpO1xuICAgIGlmIChpc1Jlc3BvbnNlKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIFdoZW4gcmV0dXJuaW5nIFN0YXRpY0hhbmRsZXJDb250ZXh0LCB3ZSBwYXRjaCBiYWNrIGluIHRoZSBsb2NhdGlvbiBoZXJlXG4gICAgLy8gc2luY2Ugd2UgbmVlZCBpdCBmb3IgUmVhY3QgQ29udGV4dC4gIEJ1dCB0aGlzIGhlbHBzIGtlZXAgb3VyIHN1Ym1pdCBhbmRcbiAgICAvLyBsb2FkUm91dGVEYXRhIG9wZXJhdGluZyBvbiBhIFJlcXVlc3QgaW5zdGVhZCBvZiBhIExvY2F0aW9uXG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgYmFzZW5hbWVcbiAgICB9LCByZXN1bHQpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcXVlcnlSb3V0ZSgpIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdGFyZ2V0ZWQgcm91dGUgcmVxdWVzdHMsIGVpdGhlclxuICAgKiBmb3IgZmV0Y2ggP19kYXRhIHJlcXVlc3RzIG9yIHJlc291cmNlIHJvdXRlIHJlcXVlc3RzLiAgSW4gdGhpcyBjYXNlLCB3ZVxuICAgKiBhcmUgb25seSBldmVyIGNhbGxpbmcgYSBzaW5nbGUgYWN0aW9uIG9yIGxvYWRlciwgYW5kIHdlIGFyZSByZXR1cm5pbmcgdGhlXG4gICAqIHJldHVybmVkIHZhbHVlIGRpcmVjdGx5LiAgSW4gbW9zdCBjYXNlcywgdGhpcyB3aWxsIGJlIGEgUmVzcG9uc2UgcmV0dXJuZWRcbiAgICogZnJvbSB0aGUgYWN0aW9uL2xvYWRlciwgYnV0IGl0IG1heSBiZSBhIHByaW1pdGl2ZSBvciBvdGhlciB2YWx1ZSBhcyB3ZWxsIC1cbiAgICogYW5kIGluIHN1Y2ggY2FzZXMgdGhlIGNhbGxpbmcgY29udGV4dCBzaG91bGQgaGFuZGxlIHRoYXQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIFdlIGRvIHJlc3BlY3QgdGhlIHRocm93L3JldHVybiBkaWZmZXJlbnRpYXRpb24sIHNvIGlmIGFuIGFjdGlvbi9sb2FkZXJcbiAgICogdGhyb3dzLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgdGhlIHZhbHVlLiAgVGhpcyBpcyBpbXBvcnRhbnQgc28gd2VcbiAgICogY2FuIGRvIHByb3BlciBib3VuZGFyeSBpZGVudGlmaWNhdGlvbiBpbiBSZW1peCB3aGVyZSBhIHRocm93biBSZXNwb25zZVxuICAgKiBtdXN0IGdvIHRvIHRoZSBDYXRjaCBCb3VuZGFyeSBidXQgYSByZXR1cm5lZCBSZXNwb25zZSBpcyBoYXBweS1wYXRoLlxuICAgKlxuICAgKiBPbmUgdGhpbmcgdG8gbm90ZSBpcyB0aGF0IGFueSBSb3V0ZXItaW5pdGlhdGVkIEVycm9ycyB0aGF0IG1ha2Ugc2Vuc2VcbiAgICogdG8gYXNzb2NpYXRlIHdpdGggYSBzdGF0dXMgY29kZSB3aWxsIGJlIHRocm93biBhcyBhbiBFcnJvclJlc3BvbnNlXG4gICAqIGluc3RhbmNlIHdoaWNoIGluY2x1ZGUgdGhlIHJhdyBFcnJvciwgc3VjaCB0aGF0IHRoZSBjYWxsaW5nIGNvbnRleHQgY2FuXG4gICAqIHNlcmlhbGl6ZSB0aGUgZXJyb3IgYXMgdGhleSBzZWUgZml0IHdoaWxlIGluY2x1ZGluZyB0aGUgcHJvcGVyIHJlc3BvbnNlXG4gICAqIGNvZGUuICBFeGFtcGxlcyBoZXJlIGFyZSA0MDQgYW5kIDQwNSBlcnJvcnMgdGhhdCBvY2N1ciBwcmlvciB0byByZWFjaGluZ1xuICAgKiBhbnkgdXNlci1kZWZpbmVkIGxvYWRlcnMuXG4gICAqXG4gICAqIC0gYG9wdHMucm91dGVJZGAgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzcGVjaWZpYyByb3V0ZSBoYW5kbGVyIHRvIGNhbGwuXG4gICAqICAgSWYgbm90IHByb3ZpZGVkIHRoZSBoYW5kbGVyIHdpbGwgZGV0ZXJtaW5lIHRoZSBwcm9wZXIgcm91dGUgYnkgbWF0Y2hpbmdcbiAgICogICBhZ2FpbnN0IGByZXF1ZXN0LnVybGBcbiAgICogLSBgb3B0cy5yZXF1ZXN0Q29udGV4dGAgaXMgYW4gb3B0aW9uYWwgc2VydmVyIGNvbnRleHQgdGhhdCB3aWxsIGJlIHBhc3NlZFxuICAgKiAgICB0byBhY3Rpb25zL2xvYWRlcnMgaW4gdGhlIGBjb250ZXh0YCBwYXJhbWV0ZXJcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5Um91dGUocmVxdWVzdCwgX3RlbXA0KSB7XG4gICAgbGV0IHtcbiAgICAgIHJvdXRlSWQsXG4gICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgIHVuc3RhYmxlX2RhdGFTdHJhdGVneVxuICAgIH0gPSBfdGVtcDQgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA0O1xuICAgIGxldCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAgICBsZXQgbWV0aG9kID0gcmVxdWVzdC5tZXRob2Q7XG4gICAgbGV0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oXCJcIiwgY3JlYXRlUGF0aCh1cmwpLCBudWxsLCBcImRlZmF1bHRcIik7XG4gICAgbGV0IG1hdGNoZXMgPSBtYXRjaFJvdXRlcyhkYXRhUm91dGVzLCBsb2NhdGlvbiwgYmFzZW5hbWUpO1xuICAgIC8vIFNTUiBzdXBwb3J0cyBIRUFEIHJlcXVlc3RzIHdoaWxlIFNQQSBkb2Vzbid0XG4gICAgaWYgKCFpc1ZhbGlkTWV0aG9kKG1ldGhvZCkgJiYgbWV0aG9kICE9PSBcIkhFQURcIiAmJiBtZXRob2QgIT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICBtZXRob2RcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHRocm93IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7XG4gICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBtYXRjaCA9IHJvdXRlSWQgPyBtYXRjaGVzLmZpbmQobSA9PiBtLnJvdXRlLmlkID09PSByb3V0ZUlkKSA6IGdldFRhcmdldE1hdGNoKG1hdGNoZXMsIGxvY2F0aW9uKTtcbiAgICBpZiAocm91dGVJZCAmJiAhbWF0Y2gpIHtcbiAgICAgIHRocm93IGdldEludGVybmFsUm91dGVyRXJyb3IoNDAzLCB7XG4gICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgcm91dGVJZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghbWF0Y2gpIHtcbiAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhpdCBJIGRvbid0IHRoaW5rP1xuICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHtcbiAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICB9KTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5SW1wbChyZXF1ZXN0LCBsb2NhdGlvbiwgbWF0Y2hlcywgcmVxdWVzdENvbnRleHQsIHVuc3RhYmxlX2RhdGFTdHJhdGVneSB8fCBudWxsLCBmYWxzZSwgbWF0Y2gpO1xuICAgIGlmIChpc1Jlc3BvbnNlKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxldCBlcnJvciA9IHJlc3VsdC5lcnJvcnMgPyBPYmplY3QudmFsdWVzKHJlc3VsdC5lcnJvcnMpWzBdIDogdW5kZWZpbmVkO1xuICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiB3ZSBnb3QgYmFjayByZXN1bHQuZXJyb3JzLCB0aGF0IG1lYW5zIHRoZSBsb2FkZXIvYWN0aW9uIHRocmV3XG4gICAgICAvLyBfc29tZXRoaW5nXyB0aGF0IHdhc24ndCBhIFJlc3BvbnNlLCBidXQgaXQncyBub3QgZ3VhcmFudGVlZC9yZXF1aXJlZFxuICAgICAgLy8gdG8gYmUgYW4gYGluc3RhbmNlb2YgRXJyb3JgIGVpdGhlciwgc28gd2UgaGF2ZSB0byB1c2UgdGhyb3cgaGVyZSB0b1xuICAgICAgLy8gcHJlc2VydmUgdGhlIFwiZXJyb3JcIiBzdGF0ZSBvdXRzaWRlIG9mIHF1ZXJ5SW1wbC5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICAvLyBQaWNrIG9mZiB0aGUgcmlnaHQgc3RhdGUgdmFsdWUgdG8gcmV0dXJuXG4gICAgaWYgKHJlc3VsdC5hY3Rpb25EYXRhKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZXN1bHQuYWN0aW9uRGF0YSlbMF07XG4gICAgfVxuICAgIGlmIChyZXN1bHQubG9hZGVyRGF0YSkge1xuICAgICAgdmFyIF9yZXN1bHQkYWN0aXZlRGVmZXJyZTtcbiAgICAgIGxldCBkYXRhID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQubG9hZGVyRGF0YSlbMF07XG4gICAgICBpZiAoKF9yZXN1bHQkYWN0aXZlRGVmZXJyZSA9IHJlc3VsdC5hY3RpdmVEZWZlcnJlZHMpICE9IG51bGwgJiYgX3Jlc3VsdCRhY3RpdmVEZWZlcnJlW21hdGNoLnJvdXRlLmlkXSkge1xuICAgICAgICBkYXRhW1VOU0FGRV9ERUZFUlJFRF9TWU1CT0xdID0gcmVzdWx0LmFjdGl2ZURlZmVycmVkc1ttYXRjaC5yb3V0ZS5pZF07XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBxdWVyeUltcGwocmVxdWVzdCwgbG9jYXRpb24sIG1hdGNoZXMsIHJlcXVlc3RDb250ZXh0LCB1bnN0YWJsZV9kYXRhU3RyYXRlZ3ksIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nLCByb3V0ZU1hdGNoKSB7XG4gICAgaW52YXJpYW50KHJlcXVlc3Quc2lnbmFsLCBcInF1ZXJ5KCkvcXVlcnlSb3V0ZSgpIHJlcXVlc3RzIG11c3QgY29udGFpbiBhbiBBYm9ydENvbnRyb2xsZXIgc2lnbmFsXCIpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaXNNdXRhdGlvbk1ldGhvZChyZXF1ZXN0Lm1ldGhvZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3VibWl0KHJlcXVlc3QsIG1hdGNoZXMsIHJvdXRlTWF0Y2ggfHwgZ2V0VGFyZ2V0TWF0Y2gobWF0Y2hlcywgbG9jYXRpb24pLCByZXF1ZXN0Q29udGV4dCwgdW5zdGFibGVfZGF0YVN0cmF0ZWd5LCBza2lwTG9hZGVyRXJyb3JCdWJibGluZywgcm91dGVNYXRjaCAhPSBudWxsKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBsb2FkUm91dGVEYXRhKHJlcXVlc3QsIG1hdGNoZXMsIHJlcXVlc3RDb250ZXh0LCB1bnN0YWJsZV9kYXRhU3RyYXRlZ3ksIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nLCByb3V0ZU1hdGNoKTtcbiAgICAgIHJldHVybiBpc1Jlc3BvbnNlKHJlc3VsdCkgPyByZXN1bHQgOiBfZXh0ZW5kcyh7fSwgcmVzdWx0LCB7XG4gICAgICAgIGFjdGlvbkRhdGE6IG51bGwsXG4gICAgICAgIGFjdGlvbkhlYWRlcnM6IHt9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB0aHJldy9yZXR1cm5lZCBhIFJlc3BvbnNlIGluIGNhbGxMb2FkZXJPckFjdGlvbiBmb3IgYVxuICAgICAgLy8gYHF1ZXJ5Um91dGVgIGNhbGwsIHdlIHRocm93IHRoZSBgRGF0YVN0cmF0ZWd5UmVzdWx0YCB0byBiYWlsIG91dCBlYXJseVxuICAgICAgLy8gYW5kIHRoZW4gcmV0dXJuIG9yIHRocm93IHRoZSByYXcgUmVzcG9uc2UgaGVyZSBhY2NvcmRpbmdseVxuICAgICAgaWYgKGlzRGF0YVN0cmF0ZWd5UmVzdWx0KGUpICYmIGlzUmVzcG9uc2UoZS5yZXN1bHQpKSB7XG4gICAgICAgIGlmIChlLnR5cGUgPT09IFJlc3VsdFR5cGUuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZS5yZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBSZWRpcmVjdHMgYXJlIGFsd2F5cyByZXR1cm5lZCBzaW5jZSB0aGV5IGRvbid0IHByb3BhZ2F0ZSB0byBjYXRjaFxuICAgICAgLy8gYm91bmRhcmllc1xuICAgICAgaWYgKGlzUmVkaXJlY3RSZXNwb25zZShlKSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdChyZXF1ZXN0LCBtYXRjaGVzLCBhY3Rpb25NYXRjaCwgcmVxdWVzdENvbnRleHQsIHVuc3RhYmxlX2RhdGFTdHJhdGVneSwgc2tpcExvYWRlckVycm9yQnViYmxpbmcsIGlzUm91dGVSZXF1ZXN0KSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoIWFjdGlvbk1hdGNoLnJvdXRlLmFjdGlvbiAmJiAhYWN0aW9uTWF0Y2gucm91dGUubGF6eSkge1xuICAgICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgcGF0aG5hbWU6IG5ldyBVUkwocmVxdWVzdC51cmwpLnBhdGhuYW1lLFxuICAgICAgICByb3V0ZUlkOiBhY3Rpb25NYXRjaC5yb3V0ZS5pZFxuICAgICAgfSk7XG4gICAgICBpZiAoaXNSb3V0ZVJlcXVlc3QpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIHR5cGU6IFJlc3VsdFR5cGUuZXJyb3IsXG4gICAgICAgIGVycm9yXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGNhbGxEYXRhU3RyYXRlZ3koXCJhY3Rpb25cIiwgcmVxdWVzdCwgW2FjdGlvbk1hdGNoXSwgbWF0Y2hlcywgaXNSb3V0ZVJlcXVlc3QsIHJlcXVlc3RDb250ZXh0LCB1bnN0YWJsZV9kYXRhU3RyYXRlZ3kpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0c1thY3Rpb25NYXRjaC5yb3V0ZS5pZF07XG4gICAgICBpZiAocmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICB0aHJvd1N0YXRpY0hhbmRsZXJBYm9ydGVkRXJyb3IocmVxdWVzdCwgaXNSb3V0ZVJlcXVlc3QsIGZ1dHVyZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1JlZGlyZWN0UmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIC8vIFVoaGhoIC0gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCB3ZSBzaG91bGQgYWx3YXlzIHRocm93IHRoZXNlIGZyb21cbiAgICAgIC8vIGNhbGxMb2FkZXJPckFjdGlvbiwgYnV0IHRoZSB0eXBlIG5hcnJvd2luZyBoZXJlIGtlZXBzIFRTIGhhcHB5IGFuZCB3ZVxuICAgICAgLy8gY2FuIGdldCBiYWNrIG9uIHRoZSBcInRocm93IGFsbCByZWRpcmVjdCByZXNwb25zZXNcIiB0cmFpbiBoZXJlIHNob3VsZFxuICAgICAgLy8gdGhpcyBldmVyIGhhcHBlbiA6L1xuICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlKG51bGwsIHtcbiAgICAgICAgc3RhdHVzOiByZXN1bHQucmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgTG9jYXRpb246IHJlc3VsdC5yZXNwb25zZS5oZWFkZXJzLmdldChcIkxvY2F0aW9uXCIpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaXNEZWZlcnJlZFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICBsZXQgZXJyb3IgPSBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwMCwge1xuICAgICAgICB0eXBlOiBcImRlZmVyLWFjdGlvblwiXG4gICAgICB9KTtcbiAgICAgIGlmIChpc1JvdXRlUmVxdWVzdCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgICAgZXJyb3JcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc1JvdXRlUmVxdWVzdCkge1xuICAgICAgLy8gTm90ZTogVGhpcyBzaG91bGQgb25seSBiZSBub24tUmVzcG9uc2UgdmFsdWVzIGlmIHdlIGdldCBoZXJlLCBzaW5jZVxuICAgICAgLy8gaXNSb3V0ZVJlcXVlc3Qgc2hvdWxkIHRocm93IGFueSBSZXNwb25zZSByZWNlaXZlZCBpbiBjYWxsTG9hZGVyT3JBY3Rpb25cbiAgICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF0Y2hlczogW2FjdGlvbk1hdGNoXSxcbiAgICAgICAgbG9hZGVyRGF0YToge30sXG4gICAgICAgIGFjdGlvbkRhdGE6IHtcbiAgICAgICAgICBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuZGF0YVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcnM6IG51bGwsXG4gICAgICAgIC8vIE5vdGU6IHN0YXR1c0NvZGUgKyBoZWFkZXJzIGFyZSB1bnVzZWQgaGVyZSBzaW5jZSBxdWVyeVJvdXRlIHdpbGxcbiAgICAgICAgLy8gcmV0dXJuIHRoZSByYXcgUmVzcG9uc2Ugb3IgdmFsdWVcbiAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICBsb2FkZXJIZWFkZXJzOiB7fSxcbiAgICAgICAgYWN0aW9uSGVhZGVyczoge30sXG4gICAgICAgIGFjdGl2ZURlZmVycmVkczogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgR0VUIHJlcXVlc3QgZm9yIHRoZSBsb2FkZXJzXG4gICAgbGV0IGxvYWRlclJlcXVlc3QgPSBuZXcgUmVxdWVzdChyZXF1ZXN0LnVybCwge1xuICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsXG4gICAgfSk7XG4gICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgLy8gU3RvcmUgb2ZmIHRoZSBwZW5kaW5nIGVycm9yIC0gd2UgdXNlIGl0IHRvIGRldGVybWluZSB3aGljaCBsb2FkZXJzXG4gICAgICAvLyB0byBjYWxsIGFuZCB3aWxsIGNvbW1pdCBpdCB3aGVuIHdlIGNvbXBsZXRlIHRoZSBuYXZpZ2F0aW9uXG4gICAgICBsZXQgYm91bmRhcnlNYXRjaCA9IHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID8gYWN0aW9uTWF0Y2ggOiBmaW5kTmVhcmVzdEJvdW5kYXJ5KG1hdGNoZXMsIGFjdGlvbk1hdGNoLnJvdXRlLmlkKTtcbiAgICAgIGxldCBjb250ZXh0ID0gYXdhaXQgbG9hZFJvdXRlRGF0YShsb2FkZXJSZXF1ZXN0LCBtYXRjaGVzLCByZXF1ZXN0Q29udGV4dCwgdW5zdGFibGVfZGF0YVN0cmF0ZWd5LCBza2lwTG9hZGVyRXJyb3JCdWJibGluZywgbnVsbCwgW2JvdW5kYXJ5TWF0Y2gucm91dGUuaWQsIHJlc3VsdF0pO1xuICAgICAgLy8gYWN0aW9uIHN0YXR1cyBjb2RlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBsb2FkZXIgc3RhdHVzIGNvZGVzXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGNvbnRleHQsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogaXNSb3V0ZUVycm9yUmVzcG9uc2UocmVzdWx0LmVycm9yKSA/IHJlc3VsdC5lcnJvci5zdGF0dXMgOiByZXN1bHQuc3RhdHVzQ29kZSAhPSBudWxsID8gcmVzdWx0LnN0YXR1c0NvZGUgOiA1MDAsXG4gICAgICAgIGFjdGlvbkRhdGE6IG51bGwsXG4gICAgICAgIGFjdGlvbkhlYWRlcnM6IF9leHRlbmRzKHt9LCByZXN1bHQuaGVhZGVycyA/IHtcbiAgICAgICAgICBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuaGVhZGVyc1xuICAgICAgICB9IDoge30pXG4gICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGNvbnRleHQgPSBhd2FpdCBsb2FkUm91dGVEYXRhKGxvYWRlclJlcXVlc3QsIG1hdGNoZXMsIHJlcXVlc3RDb250ZXh0LCB1bnN0YWJsZV9kYXRhU3RyYXRlZ3ksIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nLCBudWxsKTtcbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIGNvbnRleHQsIHtcbiAgICAgIGFjdGlvbkRhdGE6IHtcbiAgICAgICAgW2FjdGlvbk1hdGNoLnJvdXRlLmlkXTogcmVzdWx0LmRhdGFcbiAgICAgIH1cbiAgICB9LCByZXN1bHQuc3RhdHVzQ29kZSA/IHtcbiAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5zdGF0dXNDb2RlXG4gICAgfSA6IHt9LCB7XG4gICAgICBhY3Rpb25IZWFkZXJzOiByZXN1bHQuaGVhZGVycyA/IHtcbiAgICAgICAgW2FjdGlvbk1hdGNoLnJvdXRlLmlkXTogcmVzdWx0LmhlYWRlcnNcbiAgICAgIH0gOiB7fVxuICAgIH0pO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRSb3V0ZURhdGEocmVxdWVzdCwgbWF0Y2hlcywgcmVxdWVzdENvbnRleHQsIHVuc3RhYmxlX2RhdGFTdHJhdGVneSwgc2tpcExvYWRlckVycm9yQnViYmxpbmcsIHJvdXRlTWF0Y2gsIHBlbmRpbmdBY3Rpb25SZXN1bHQpIHtcbiAgICBsZXQgaXNSb3V0ZVJlcXVlc3QgPSByb3V0ZU1hdGNoICE9IG51bGw7XG4gICAgLy8gU2hvcnQgY2lyY3VpdCBpZiB3ZSBoYXZlIG5vIGxvYWRlcnMgdG8gcnVuIChxdWVyeVJvdXRlKCkpXG4gICAgaWYgKGlzUm91dGVSZXF1ZXN0ICYmICEocm91dGVNYXRjaCAhPSBudWxsICYmIHJvdXRlTWF0Y2gucm91dGUubG9hZGVyKSAmJiAhKHJvdXRlTWF0Y2ggIT0gbnVsbCAmJiByb3V0ZU1hdGNoLnJvdXRlLmxhenkpKSB7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwMCwge1xuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBwYXRobmFtZTogbmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWUsXG4gICAgICAgIHJvdXRlSWQ6IHJvdXRlTWF0Y2ggPT0gbnVsbCA/IHZvaWQgMCA6IHJvdXRlTWF0Y2gucm91dGUuaWRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdE1hdGNoZXMgPSByb3V0ZU1hdGNoID8gW3JvdXRlTWF0Y2hdIDogcGVuZGluZ0FjdGlvblJlc3VsdCAmJiBpc0Vycm9yUmVzdWx0KHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0pID8gZ2V0TG9hZGVyTWF0Y2hlc1VudGlsQm91bmRhcnkobWF0Y2hlcywgcGVuZGluZ0FjdGlvblJlc3VsdFswXSkgOiBtYXRjaGVzO1xuICAgIGxldCBtYXRjaGVzVG9Mb2FkID0gcmVxdWVzdE1hdGNoZXMuZmlsdGVyKG0gPT4gbS5yb3V0ZS5sb2FkZXIgfHwgbS5yb3V0ZS5sYXp5KTtcbiAgICAvLyBTaG9ydCBjaXJjdWl0IGlmIHdlIGhhdmUgbm8gbG9hZGVycyB0byBydW4gKHF1ZXJ5KCkpXG4gICAgaWYgKG1hdGNoZXNUb0xvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaGVzLFxuICAgICAgICAvLyBBZGQgYSBudWxsIGZvciBhbGwgbWF0Y2hlZCByb3V0ZXMgZm9yIHByb3BlciByZXZhbGlkYXRpb24gb24gdGhlIGNsaWVudFxuICAgICAgICBsb2FkZXJEYXRhOiBtYXRjaGVzLnJlZHVjZSgoYWNjLCBtKSA9PiBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgIFttLnJvdXRlLmlkXTogbnVsbFxuICAgICAgICB9KSwge30pLFxuICAgICAgICBlcnJvcnM6IHBlbmRpbmdBY3Rpb25SZXN1bHQgJiYgaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSA/IHtcbiAgICAgICAgICBbcGVuZGluZ0FjdGlvblJlc3VsdFswXV06IHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0uZXJyb3JcbiAgICAgICAgfSA6IG51bGwsXG4gICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgbG9hZGVySGVhZGVyczoge30sXG4gICAgICAgIGFjdGl2ZURlZmVycmVkczogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5KFwibG9hZGVyXCIsIHJlcXVlc3QsIG1hdGNoZXNUb0xvYWQsIG1hdGNoZXMsIGlzUm91dGVSZXF1ZXN0LCByZXF1ZXN0Q29udGV4dCwgdW5zdGFibGVfZGF0YVN0cmF0ZWd5KTtcbiAgICBpZiAocmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgdGhyb3dTdGF0aWNIYW5kbGVyQWJvcnRlZEVycm9yKHJlcXVlc3QsIGlzUm91dGVSZXF1ZXN0LCBmdXR1cmUpO1xuICAgIH1cbiAgICAvLyBQcm9jZXNzIGFuZCBjb21taXQgb3V0cHV0IGZyb20gbG9hZGVyc1xuICAgIGxldCBhY3RpdmVEZWZlcnJlZHMgPSBuZXcgTWFwKCk7XG4gICAgbGV0IGNvbnRleHQgPSBwcm9jZXNzUm91dGVMb2FkZXJEYXRhKG1hdGNoZXMsIHJlc3VsdHMsIHBlbmRpbmdBY3Rpb25SZXN1bHQsIGFjdGl2ZURlZmVycmVkcywgc2tpcExvYWRlckVycm9yQnViYmxpbmcpO1xuICAgIC8vIEFkZCBhIG51bGwgZm9yIGFueSBub24tbG9hZGVyIG1hdGNoZXMgZm9yIHByb3BlciByZXZhbGlkYXRpb24gb24gdGhlIGNsaWVudFxuICAgIGxldCBleGVjdXRlZExvYWRlcnMgPSBuZXcgU2V0KG1hdGNoZXNUb0xvYWQubWFwKG1hdGNoID0+IG1hdGNoLnJvdXRlLmlkKSk7XG4gICAgbWF0Y2hlcy5mb3JFYWNoKG1hdGNoID0+IHtcbiAgICAgIGlmICghZXhlY3V0ZWRMb2FkZXJzLmhhcyhtYXRjaC5yb3V0ZS5pZCkpIHtcbiAgICAgICAgY29udGV4dC5sb2FkZXJEYXRhW21hdGNoLnJvdXRlLmlkXSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9leHRlbmRzKHt9LCBjb250ZXh0LCB7XG4gICAgICBtYXRjaGVzLFxuICAgICAgYWN0aXZlRGVmZXJyZWRzOiBhY3RpdmVEZWZlcnJlZHMuc2l6ZSA+IDAgPyBPYmplY3QuZnJvbUVudHJpZXMoYWN0aXZlRGVmZXJyZWRzLmVudHJpZXMoKSkgOiBudWxsXG4gICAgfSk7XG4gIH1cbiAgLy8gVXRpbGl0eSB3cmFwcGVyIGZvciBjYWxsaW5nIGRhdGFTdHJhdGVneSBzZXJ2ZXItc2lkZSB3aXRob3V0IGhhdmluZyB0b1xuICAvLyBwYXNzIGFyb3VuZCB0aGUgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllcywgZXRjLlxuICBhc3luYyBmdW5jdGlvbiBjYWxsRGF0YVN0cmF0ZWd5KHR5cGUsIHJlcXVlc3QsIG1hdGNoZXNUb0xvYWQsIG1hdGNoZXMsIGlzUm91dGVSZXF1ZXN0LCByZXF1ZXN0Q29udGV4dCwgdW5zdGFibGVfZGF0YVN0cmF0ZWd5KSB7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5SW1wbCh1bnN0YWJsZV9kYXRhU3RyYXRlZ3kgfHwgZGVmYXVsdERhdGFTdHJhdGVneSwgdHlwZSwgbnVsbCwgcmVxdWVzdCwgbWF0Y2hlc1RvTG9hZCwgbWF0Y2hlcywgbnVsbCwgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllcywgcmVxdWVzdENvbnRleHQpO1xuICAgIGxldCBkYXRhUmVzdWx0cyA9IHt9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKG1hdGNoZXMubWFwKGFzeW5jIG1hdGNoID0+IHtcbiAgICAgIGlmICghKG1hdGNoLnJvdXRlLmlkIGluIHJlc3VsdHMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCByZXN1bHQgPSByZXN1bHRzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGlmIChpc1JlZGlyZWN0RGF0YVN0cmF0ZWd5UmVzdWx0UmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gcmVzdWx0LnJlc3VsdDtcbiAgICAgICAgLy8gVGhyb3cgcmVkaXJlY3RzIGFuZCBsZXQgdGhlIHNlcnZlciBoYW5kbGUgdGhlbSB3aXRoIGFuIEhUVFAgcmVkaXJlY3RcbiAgICAgICAgdGhyb3cgbm9ybWFsaXplUmVsYXRpdmVSb3V0aW5nUmVkaXJlY3RSZXNwb25zZShyZXNwb25zZSwgcmVxdWVzdCwgbWF0Y2gucm91dGUuaWQsIG1hdGNoZXMsIGJhc2VuYW1lLCBmdXR1cmUudjdfcmVsYXRpdmVTcGxhdFBhdGgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVzcG9uc2UocmVzdWx0LnJlc3VsdCkgJiYgaXNSb3V0ZVJlcXVlc3QpIHtcbiAgICAgICAgLy8gRm9yIFNTUiBzaW5nbGUtcm91dGUgcmVxdWVzdHMsIHdlIHdhbnQgdG8gaGFuZCBSZXNwb25zZXMgYmFja1xuICAgICAgICAvLyBkaXJlY3RseSB3aXRob3V0IHVud3JhcHBpbmdcbiAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGF0YVJlc3VsdHNbbWF0Y2gucm91dGUuaWRdID0gYXdhaXQgY29udmVydERhdGFTdHJhdGVneVJlc3VsdFRvRGF0YVJlc3VsdChyZXN1bHQpO1xuICAgIH0pKTtcbiAgICByZXR1cm4gZGF0YVJlc3VsdHM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkYXRhUm91dGVzLFxuICAgIHF1ZXJ5LFxuICAgIHF1ZXJ5Um91dGVcbiAgfTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vI3JlZ2lvbiBIZWxwZXJzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLyoqXG4gKiBHaXZlbiBhbiBleGlzdGluZyBTdGF0aWNIYW5kbGVyQ29udGV4dCBhbmQgYW4gZXJyb3IgdGhyb3duIGF0IHJlbmRlciB0aW1lLFxuICogcHJvdmlkZSBhbiB1cGRhdGVkIFN0YXRpY0hhbmRsZXJDb250ZXh0IHN1aXRhYmxlIGZvciBhIHNlY29uZCBTU1IgcmVuZGVyXG4gKi9cbmZ1bmN0aW9uIGdldFN0YXRpY0NvbnRleHRGcm9tRXJyb3Iocm91dGVzLCBjb250ZXh0LCBlcnJvcikge1xuICBsZXQgbmV3Q29udGV4dCA9IF9leHRlbmRzKHt9LCBjb250ZXh0LCB7XG4gICAgc3RhdHVzQ29kZTogaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwLFxuICAgIGVycm9yczoge1xuICAgICAgW2NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQgfHwgcm91dGVzWzBdLmlkXTogZXJyb3JcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3Q29udGV4dDtcbn1cbmZ1bmN0aW9uIHRocm93U3RhdGljSGFuZGxlckFib3J0ZWRFcnJvcihyZXF1ZXN0LCBpc1JvdXRlUmVxdWVzdCwgZnV0dXJlKSB7XG4gIGlmIChmdXR1cmUudjdfdGhyb3dBYm9ydFJlYXNvbiAmJiByZXF1ZXN0LnNpZ25hbC5yZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IHJlcXVlc3Quc2lnbmFsLnJlYXNvbjtcbiAgfVxuICBsZXQgbWV0aG9kID0gaXNSb3V0ZVJlcXVlc3QgPyBcInF1ZXJ5Um91dGVcIiA6IFwicXVlcnlcIjtcbiAgdGhyb3cgbmV3IEVycm9yKG1ldGhvZCArIFwiKCkgY2FsbCBhYm9ydGVkOiBcIiArIHJlcXVlc3QubWV0aG9kICsgXCIgXCIgKyByZXF1ZXN0LnVybCk7XG59XG5mdW5jdGlvbiBpc1N1Ym1pc3Npb25OYXZpZ2F0aW9uKG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMgIT0gbnVsbCAmJiAoXCJmb3JtRGF0YVwiIGluIG9wdHMgJiYgb3B0cy5mb3JtRGF0YSAhPSBudWxsIHx8IFwiYm9keVwiIGluIG9wdHMgJiYgb3B0cy5ib2R5ICE9PSB1bmRlZmluZWQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVG8obG9jYXRpb24sIG1hdGNoZXMsIGJhc2VuYW1lLCBwcmVwZW5kQmFzZW5hbWUsIHRvLCB2N19yZWxhdGl2ZVNwbGF0UGF0aCwgZnJvbVJvdXRlSWQsIHJlbGF0aXZlKSB7XG4gIGxldCBjb250ZXh0dWFsTWF0Y2hlcztcbiAgbGV0IGFjdGl2ZVJvdXRlTWF0Y2g7XG4gIGlmIChmcm9tUm91dGVJZCkge1xuICAgIC8vIEdyYWIgbWF0Y2hlcyB1cCB0byB0aGUgY2FsbGluZyByb3V0ZSBzbyBvdXIgcm91dGUtcmVsYXRpdmUgbG9naWMgaXNcbiAgICAvLyByZWxhdGl2ZSB0byB0aGUgY29ycmVjdCBzb3VyY2Ugcm91dGVcbiAgICBjb250ZXh0dWFsTWF0Y2hlcyA9IFtdO1xuICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgIGNvbnRleHR1YWxNYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgICAgaWYgKG1hdGNoLnJvdXRlLmlkID09PSBmcm9tUm91dGVJZCkge1xuICAgICAgICBhY3RpdmVSb3V0ZU1hdGNoID0gbWF0Y2g7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0dWFsTWF0Y2hlcyA9IG1hdGNoZXM7XG4gICAgYWN0aXZlUm91dGVNYXRjaCA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgfVxuICAvLyBSZXNvbHZlIHRoZSByZWxhdGl2ZSBwYXRoXG4gIGxldCBwYXRoID0gcmVzb2x2ZVRvKHRvID8gdG8gOiBcIi5cIiwgZ2V0UmVzb2x2ZVRvTWF0Y2hlcyhjb250ZXh0dWFsTWF0Y2hlcywgdjdfcmVsYXRpdmVTcGxhdFBhdGgpLCBzdHJpcEJhc2VuYW1lKGxvY2F0aW9uLnBhdGhuYW1lLCBiYXNlbmFtZSkgfHwgbG9jYXRpb24ucGF0aG5hbWUsIHJlbGF0aXZlID09PSBcInBhdGhcIik7XG4gIC8vIFdoZW4gYHRvYCBpcyBub3Qgc3BlY2lmaWVkIHdlIGluaGVyaXQgc2VhcmNoL2hhc2ggZnJvbSB0aGUgY3VycmVudFxuICAvLyBsb2NhdGlvbiwgdW5saWtlIHdoZW4gdG89XCIuXCIgYW5kIHdlIGp1c3QgaW5oZXJpdCB0aGUgcGF0aC5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZW1peC1ydW4vcmVtaXgvaXNzdWVzLzkyN1xuICBpZiAodG8gPT0gbnVsbCkge1xuICAgIHBhdGguc2VhcmNoID0gbG9jYXRpb24uc2VhcmNoO1xuICAgIHBhdGguaGFzaCA9IGxvY2F0aW9uLmhhc2g7XG4gIH1cbiAgLy8gQWRkIGFuID9pbmRleCBwYXJhbSBmb3IgbWF0Y2hlZCBpbmRleCByb3V0ZXMgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZVxuICBpZiAoKHRvID09IG51bGwgfHwgdG8gPT09IFwiXCIgfHwgdG8gPT09IFwiLlwiKSAmJiBhY3RpdmVSb3V0ZU1hdGNoICYmIGFjdGl2ZVJvdXRlTWF0Y2gucm91dGUuaW5kZXggJiYgIWhhc05ha2VkSW5kZXhRdWVyeShwYXRoLnNlYXJjaCkpIHtcbiAgICBwYXRoLnNlYXJjaCA9IHBhdGguc2VhcmNoID8gcGF0aC5zZWFyY2gucmVwbGFjZSgvXlxcPy8sIFwiP2luZGV4JlwiKSA6IFwiP2luZGV4XCI7XG4gIH1cbiAgLy8gSWYgd2UncmUgb3BlcmF0aW5nIHdpdGhpbiBhIGJhc2VuYW1lLCBwcmVwZW5kIGl0IHRvIHRoZSBwYXRobmFtZS4gIElmXG4gIC8vIHRoaXMgaXMgYSByb290IG5hdmlnYXRpb24sIHRoZW4ganVzdCB1c2UgdGhlIHJhdyBiYXNlbmFtZSB3aGljaCBhbGxvd3NcbiAgLy8gdGhlIGJhc2VuYW1lIHRvIGhhdmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIHByZXNlbmNlIG9mIGEgdHJhaWxpbmcgc2xhc2hcbiAgLy8gb24gcm9vdCBhY3Rpb25zXG4gIGlmIChwcmVwZW5kQmFzZW5hbWUgJiYgYmFzZW5hbWUgIT09IFwiL1wiKSB7XG4gICAgcGF0aC5wYXRobmFtZSA9IHBhdGgucGF0aG5hbWUgPT09IFwiL1wiID8gYmFzZW5hbWUgOiBqb2luUGF0aHMoW2Jhc2VuYW1lLCBwYXRoLnBhdGhuYW1lXSk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVBhdGgocGF0aCk7XG59XG4vLyBOb3JtYWxpemUgbmF2aWdhdGlvbiBvcHRpb25zIGJ5IGNvbnZlcnRpbmcgZm9ybU1ldGhvZD1HRVQgZm9ybURhdGEgb2JqZWN0cyB0b1xuLy8gVVJMU2VhcmNoUGFyYW1zIHNvIHRoZXkgYmVoYXZlIGlkZW50aWNhbGx5IHRvIGxpbmtzIHdpdGggcXVlcnkgcGFyYW1zXG5mdW5jdGlvbiBub3JtYWxpemVOYXZpZ2F0ZU9wdGlvbnMobm9ybWFsaXplRm9ybU1ldGhvZCwgaXNGZXRjaGVyLCBwYXRoLCBvcHRzKSB7XG4gIC8vIFJldHVybiBsb2NhdGlvbiB2ZXJiYXRpbSBvbiBub24tc3VibWlzc2lvbiBuYXZpZ2F0aW9uc1xuICBpZiAoIW9wdHMgfHwgIWlzU3VibWlzc2lvbk5hdmlnYXRpb24ob3B0cykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aFxuICAgIH07XG4gIH1cbiAgaWYgKG9wdHMuZm9ybU1ldGhvZCAmJiAhaXNWYWxpZE1ldGhvZChvcHRzLmZvcm1NZXRob2QpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGgsXG4gICAgICBlcnJvcjogZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgbWV0aG9kOiBvcHRzLmZvcm1NZXRob2RcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuICBsZXQgZ2V0SW52YWxpZEJvZHlFcnJvciA9ICgpID0+ICh7XG4gICAgcGF0aCxcbiAgICBlcnJvcjogZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDAsIHtcbiAgICAgIHR5cGU6IFwiaW52YWxpZC1ib2R5XCJcbiAgICB9KVxuICB9KTtcbiAgLy8gQ3JlYXRlIGEgU3VibWlzc2lvbiBvbiBub24tR0VUIG5hdmlnYXRpb25zXG4gIGxldCByYXdGb3JtTWV0aG9kID0gb3B0cy5mb3JtTWV0aG9kIHx8IFwiZ2V0XCI7XG4gIGxldCBmb3JtTWV0aG9kID0gbm9ybWFsaXplRm9ybU1ldGhvZCA/IHJhd0Zvcm1NZXRob2QudG9VcHBlckNhc2UoKSA6IHJhd0Zvcm1NZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgbGV0IGZvcm1BY3Rpb24gPSBzdHJpcEhhc2hGcm9tUGF0aChwYXRoKTtcbiAgaWYgKG9wdHMuYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdHMuZm9ybUVuY1R5cGUgPT09IFwidGV4dC9wbGFpblwiKSB7XG4gICAgICAvLyB0ZXh0IG9ubHkgc3VwcG9ydCBQT1NUL1BVVC9QQVRDSC9ERUxFVEUgc3VibWlzc2lvbnNcbiAgICAgIGlmICghaXNNdXRhdGlvbk1ldGhvZChmb3JtTWV0aG9kKSkge1xuICAgICAgICByZXR1cm4gZ2V0SW52YWxpZEJvZHlFcnJvcigpO1xuICAgICAgfVxuICAgICAgbGV0IHRleHQgPSB0eXBlb2Ygb3B0cy5ib2R5ID09PSBcInN0cmluZ1wiID8gb3B0cy5ib2R5IDogb3B0cy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEgfHwgb3B0cy5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zID9cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm0tY29udHJvbC1pbmZyYXN0cnVjdHVyZS5odG1sI3BsYWluLXRleHQtZm9ybS1kYXRhXG4gICAgICBBcnJheS5mcm9tKG9wdHMuYm9keS5lbnRyaWVzKCkpLnJlZHVjZSgoYWNjLCBfcmVmNSkgPT4ge1xuICAgICAgICBsZXQgW25hbWUsIHZhbHVlXSA9IF9yZWY1O1xuICAgICAgICByZXR1cm4gXCJcIiArIGFjYyArIG5hbWUgKyBcIj1cIiArIHZhbHVlICsgXCJcXG5cIjtcbiAgICAgIH0sIFwiXCIpIDogU3RyaW5nKG9wdHMuYm9keSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoLFxuICAgICAgICBzdWJtaXNzaW9uOiB7XG4gICAgICAgICAgZm9ybU1ldGhvZCxcbiAgICAgICAgICBmb3JtQWN0aW9uLFxuICAgICAgICAgIGZvcm1FbmNUeXBlOiBvcHRzLmZvcm1FbmNUeXBlLFxuICAgICAgICAgIGZvcm1EYXRhOiB1bmRlZmluZWQsXG4gICAgICAgICAganNvbjogdW5kZWZpbmVkLFxuICAgICAgICAgIHRleHRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG9wdHMuZm9ybUVuY1R5cGUgPT09IFwiYXBwbGljYXRpb24vanNvblwiKSB7XG4gICAgICAvLyBqc29uIG9ubHkgc3VwcG9ydHMgUE9TVC9QVVQvUEFUQ0gvREVMRVRFIHN1Ym1pc3Npb25zXG4gICAgICBpZiAoIWlzTXV0YXRpb25NZXRob2QoZm9ybU1ldGhvZCkpIHtcbiAgICAgICAgcmV0dXJuIGdldEludmFsaWRCb2R5RXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBqc29uID0gdHlwZW9mIG9wdHMuYm9keSA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uob3B0cy5ib2R5KSA6IG9wdHMuYm9keTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHN1Ym1pc3Npb246IHtcbiAgICAgICAgICAgIGZvcm1NZXRob2QsXG4gICAgICAgICAgICBmb3JtQWN0aW9uLFxuICAgICAgICAgICAgZm9ybUVuY1R5cGU6IG9wdHMuZm9ybUVuY1R5cGUsXG4gICAgICAgICAgICBmb3JtRGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAganNvbixcbiAgICAgICAgICAgIHRleHQ6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGdldEludmFsaWRCb2R5RXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaW52YXJpYW50KHR5cGVvZiBGb3JtRGF0YSA9PT0gXCJmdW5jdGlvblwiLCBcIkZvcm1EYXRhIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudFwiKTtcbiAgbGV0IHNlYXJjaFBhcmFtcztcbiAgbGV0IGZvcm1EYXRhO1xuICBpZiAob3B0cy5mb3JtRGF0YSkge1xuICAgIHNlYXJjaFBhcmFtcyA9IGNvbnZlcnRGb3JtRGF0YVRvU2VhcmNoUGFyYW1zKG9wdHMuZm9ybURhdGEpO1xuICAgIGZvcm1EYXRhID0gb3B0cy5mb3JtRGF0YTtcbiAgfSBlbHNlIGlmIChvcHRzLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgIHNlYXJjaFBhcmFtcyA9IGNvbnZlcnRGb3JtRGF0YVRvU2VhcmNoUGFyYW1zKG9wdHMuYm9keSk7XG4gICAgZm9ybURhdGEgPSBvcHRzLmJvZHk7XG4gIH0gZWxzZSBpZiAob3B0cy5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgc2VhcmNoUGFyYW1zID0gb3B0cy5ib2R5O1xuICAgIGZvcm1EYXRhID0gY29udmVydFNlYXJjaFBhcmFtc1RvRm9ybURhdGEoc2VhcmNoUGFyYW1zKTtcbiAgfSBlbHNlIGlmIChvcHRzLmJvZHkgPT0gbnVsbCkge1xuICAgIHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdHMuYm9keSk7XG4gICAgICBmb3JtRGF0YSA9IGNvbnZlcnRTZWFyY2hQYXJhbXNUb0Zvcm1EYXRhKHNlYXJjaFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGdldEludmFsaWRCb2R5RXJyb3IoKTtcbiAgICB9XG4gIH1cbiAgbGV0IHN1Ym1pc3Npb24gPSB7XG4gICAgZm9ybU1ldGhvZCxcbiAgICBmb3JtQWN0aW9uLFxuICAgIGZvcm1FbmNUeXBlOiBvcHRzICYmIG9wdHMuZm9ybUVuY1R5cGUgfHwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcbiAgICBmb3JtRGF0YSxcbiAgICBqc29uOiB1bmRlZmluZWQsXG4gICAgdGV4dDogdW5kZWZpbmVkXG4gIH07XG4gIGlmIChpc011dGF0aW9uTWV0aG9kKHN1Ym1pc3Npb24uZm9ybU1ldGhvZCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aCxcbiAgICAgIHN1Ym1pc3Npb25cbiAgICB9O1xuICB9XG4gIC8vIEZsYXR0ZW4gc3VibWlzc2lvbiBvbnRvIFVSTFNlYXJjaFBhcmFtcyBmb3IgR0VUIHN1Ym1pc3Npb25zXG4gIGxldCBwYXJzZWRQYXRoID0gcGFyc2VQYXRoKHBhdGgpO1xuICAvLyBPbiBHRVQgbmF2aWdhdGlvbiBzdWJtaXNzaW9ucyB3ZSBjYW4gZHJvcCB0aGUgP2luZGV4IHBhcmFtIGZyb20gdGhlXG4gIC8vIHJlc3VsdGluZyBsb2NhdGlvbiBzaW5jZSBhbGwgbG9hZGVycyB3aWxsIHJ1bi4gIEJ1dCBmZXRjaGVyIEdFVCBzdWJtaXNzaW9uc1xuICAvLyBvbmx5IHJ1biBhIHNpbmdsZSBsb2FkZXIgc28gd2UgbmVlZCB0byBwcmVzZXJ2ZSBhbnkgaW5jb21pbmcgP2luZGV4IHBhcmFtc1xuICBpZiAoaXNGZXRjaGVyICYmIHBhcnNlZFBhdGguc2VhcmNoICYmIGhhc05ha2VkSW5kZXhRdWVyeShwYXJzZWRQYXRoLnNlYXJjaCkpIHtcbiAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKFwiaW5kZXhcIiwgXCJcIik7XG4gIH1cbiAgcGFyc2VkUGF0aC5zZWFyY2ggPSBcIj9cIiArIHNlYXJjaFBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBjcmVhdGVQYXRoKHBhcnNlZFBhdGgpLFxuICAgIHN1Ym1pc3Npb25cbiAgfTtcbn1cbi8vIEZpbHRlciBvdXQgYWxsIHJvdXRlcyBiZWxvdyBhbnkgY2F1Z2h0IGVycm9yIGFzIHRoZXkgYXJlbid0IGdvaW5nIHRvXG4vLyByZW5kZXIgc28gd2UgZG9uJ3QgbmVlZCB0byBsb2FkIHRoZW1cbmZ1bmN0aW9uIGdldExvYWRlck1hdGNoZXNVbnRpbEJvdW5kYXJ5KG1hdGNoZXMsIGJvdW5kYXJ5SWQpIHtcbiAgbGV0IGJvdW5kYXJ5TWF0Y2hlcyA9IG1hdGNoZXM7XG4gIGlmIChib3VuZGFyeUlkKSB7XG4gICAgbGV0IGluZGV4ID0gbWF0Y2hlcy5maW5kSW5kZXgobSA9PiBtLnJvdXRlLmlkID09PSBib3VuZGFyeUlkKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgYm91bmRhcnlNYXRjaGVzID0gbWF0Y2hlcy5zbGljZSgwLCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBib3VuZGFyeU1hdGNoZXM7XG59XG5mdW5jdGlvbiBnZXRNYXRjaGVzVG9Mb2FkKGhpc3RvcnksIHN0YXRlLCBtYXRjaGVzLCBzdWJtaXNzaW9uLCBsb2NhdGlvbiwgaXNJbml0aWFsTG9hZCwgc2tpcEFjdGlvbkVycm9yUmV2YWxpZGF0aW9uLCBpc1JldmFsaWRhdGlvblJlcXVpcmVkLCBjYW5jZWxsZWREZWZlcnJlZFJvdXRlcywgY2FuY2VsbGVkRmV0Y2hlckxvYWRzLCBkZWxldGVkRmV0Y2hlcnMsIGZldGNoTG9hZE1hdGNoZXMsIGZldGNoUmVkaXJlY3RJZHMsIHJvdXRlc1RvVXNlLCBiYXNlbmFtZSwgcGVuZGluZ0FjdGlvblJlc3VsdCkge1xuICBsZXQgYWN0aW9uUmVzdWx0ID0gcGVuZGluZ0FjdGlvblJlc3VsdCA/IGlzRXJyb3JSZXN1bHQocGVuZGluZ0FjdGlvblJlc3VsdFsxXSkgPyBwZW5kaW5nQWN0aW9uUmVzdWx0WzFdLmVycm9yIDogcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5kYXRhIDogdW5kZWZpbmVkO1xuICBsZXQgY3VycmVudFVybCA9IGhpc3RvcnkuY3JlYXRlVVJMKHN0YXRlLmxvY2F0aW9uKTtcbiAgbGV0IG5leHRVcmwgPSBoaXN0b3J5LmNyZWF0ZVVSTChsb2NhdGlvbik7XG4gIC8vIFBpY2sgbmF2aWdhdGlvbiBtYXRjaGVzIHRoYXQgYXJlIG5ldC1uZXcgb3IgcXVhbGlmeSBmb3IgcmV2YWxpZGF0aW9uXG4gIGxldCBib3VuZGFyeUlkID0gcGVuZGluZ0FjdGlvblJlc3VsdCAmJiBpc0Vycm9yUmVzdWx0KHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0pID8gcGVuZGluZ0FjdGlvblJlc3VsdFswXSA6IHVuZGVmaW5lZDtcbiAgbGV0IGJvdW5kYXJ5TWF0Y2hlcyA9IGJvdW5kYXJ5SWQgPyBnZXRMb2FkZXJNYXRjaGVzVW50aWxCb3VuZGFyeShtYXRjaGVzLCBib3VuZGFyeUlkKSA6IG1hdGNoZXM7XG4gIC8vIERvbid0IHJldmFsaWRhdGUgbG9hZGVycyBieSBkZWZhdWx0IGFmdGVyIGFjdGlvbiA0eHgvNXh4IHJlc3BvbnNlc1xuICAvLyB3aGVuIHRoZSBmbGFnIGlzIGVuYWJsZWQuICBUaGV5IGNhbiBzdGlsbCBvcHQtaW50byByZXZhbGlkYXRpb24gdmlhXG4gIC8vIGBzaG91bGRSZXZhbGlkYXRlYCB2aWEgYGFjdGlvblJlc3VsdGBcbiAgbGV0IGFjdGlvblN0YXR1cyA9IHBlbmRpbmdBY3Rpb25SZXN1bHQgPyBwZW5kaW5nQWN0aW9uUmVzdWx0WzFdLnN0YXR1c0NvZGUgOiB1bmRlZmluZWQ7XG4gIGxldCBzaG91bGRTa2lwUmV2YWxpZGF0aW9uID0gc2tpcEFjdGlvbkVycm9yUmV2YWxpZGF0aW9uICYmIGFjdGlvblN0YXR1cyAmJiBhY3Rpb25TdGF0dXMgPj0gNDAwO1xuICBsZXQgbmF2aWdhdGlvbk1hdGNoZXMgPSBib3VuZGFyeU1hdGNoZXMuZmlsdGVyKChtYXRjaCwgaW5kZXgpID0+IHtcbiAgICBsZXQge1xuICAgICAgcm91dGVcbiAgICB9ID0gbWF0Y2g7XG4gICAgaWYgKHJvdXRlLmxhenkpIHtcbiAgICAgIC8vIFdlIGhhdmVuJ3QgbG9hZGVkIHRoaXMgcm91dGUgeWV0IHNvIHdlIGRvbid0IGtub3cgaWYgaXQncyBnb3QgYSBsb2FkZXIhXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLmxvYWRlciA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc0luaXRpYWxMb2FkKSB7XG4gICAgICBpZiAodHlwZW9mIHJvdXRlLmxvYWRlciAhPT0gXCJmdW5jdGlvblwiIHx8IHJvdXRlLmxvYWRlci5oeWRyYXRlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlLmxvYWRlckRhdGFbcm91dGUuaWRdID09PSB1bmRlZmluZWQgJiYgKFxuICAgICAgLy8gRG9uJ3QgcmUtcnVuIGlmIHRoZSBsb2FkZXIgcmFuIGFuZCB0aHJldyBhbiBlcnJvclxuICAgICAgIXN0YXRlLmVycm9ycyB8fCBzdGF0ZS5lcnJvcnNbcm91dGUuaWRdID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAvLyBBbHdheXMgY2FsbCB0aGUgbG9hZGVyIG9uIG5ldyByb3V0ZSBpbnN0YW5jZXMgYW5kIHBlbmRpbmcgZGVmZXIgY2FuY2VsbGF0aW9uc1xuICAgIGlmIChpc05ld0xvYWRlcihzdGF0ZS5sb2FkZXJEYXRhLCBzdGF0ZS5tYXRjaGVzW2luZGV4XSwgbWF0Y2gpIHx8IGNhbmNlbGxlZERlZmVycmVkUm91dGVzLnNvbWUoaWQgPT4gaWQgPT09IG1hdGNoLnJvdXRlLmlkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHdoZW4gd2UgcmV2YWxpZGF0ZS4gIElmIHRoZSByb3V0ZVxuICAgIC8vIHByb3ZpZGVzIGl0J3Mgb3duIGltcGxlbWVudGF0aW9uLCB0aGVuIHdlIGdpdmUgdGhlbSBmdWxsIGNvbnRyb2wgYnV0XG4gICAgLy8gcHJvdmlkZSB0aGlzIHZhbHVlIHNvIHRoZXkgY2FuIGxldmVyYWdlIGl0IGlmIG5lZWRlZCBhZnRlciB0aGV5IGNoZWNrXG4gICAgLy8gdGhlaXIgb3duIHNwZWNpZmljIHVzZSBjYXNlc1xuICAgIGxldCBjdXJyZW50Um91dGVNYXRjaCA9IHN0YXRlLm1hdGNoZXNbaW5kZXhdO1xuICAgIGxldCBuZXh0Um91dGVNYXRjaCA9IG1hdGNoO1xuICAgIHJldHVybiBzaG91bGRSZXZhbGlkYXRlTG9hZGVyKG1hdGNoLCBfZXh0ZW5kcyh7XG4gICAgICBjdXJyZW50VXJsLFxuICAgICAgY3VycmVudFBhcmFtczogY3VycmVudFJvdXRlTWF0Y2gucGFyYW1zLFxuICAgICAgbmV4dFVybCxcbiAgICAgIG5leHRQYXJhbXM6IG5leHRSb3V0ZU1hdGNoLnBhcmFtc1xuICAgIH0sIHN1Ym1pc3Npb24sIHtcbiAgICAgIGFjdGlvblJlc3VsdCxcbiAgICAgIGFjdGlvblN0YXR1cyxcbiAgICAgIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlOiBzaG91bGRTa2lwUmV2YWxpZGF0aW9uID8gZmFsc2UgOlxuICAgICAgLy8gRm9yY2VkIHJldmFsaWRhdGlvbiBkdWUgdG8gc3VibWlzc2lvbiwgdXNlUmV2YWxpZGF0b3IsIG9yIFgtUmVtaXgtUmV2YWxpZGF0ZVxuICAgICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCB8fCBjdXJyZW50VXJsLnBhdGhuYW1lICsgY3VycmVudFVybC5zZWFyY2ggPT09IG5leHRVcmwucGF0aG5hbWUgKyBuZXh0VXJsLnNlYXJjaCB8fFxuICAgICAgLy8gU2VhcmNoIHBhcmFtcyBhZmZlY3QgYWxsIGxvYWRlcnNcbiAgICAgIGN1cnJlbnRVcmwuc2VhcmNoICE9PSBuZXh0VXJsLnNlYXJjaCB8fCBpc05ld1JvdXRlSW5zdGFuY2UoY3VycmVudFJvdXRlTWF0Y2gsIG5leHRSb3V0ZU1hdGNoKVxuICAgIH0pKTtcbiAgfSk7XG4gIC8vIFBpY2sgZmV0Y2hlci5sb2FkcyB0aGF0IG5lZWQgdG8gYmUgcmV2YWxpZGF0ZWRcbiAgbGV0IHJldmFsaWRhdGluZ0ZldGNoZXJzID0gW107XG4gIGZldGNoTG9hZE1hdGNoZXMuZm9yRWFjaCgoZiwga2V5KSA9PiB7XG4gICAgLy8gRG9uJ3QgcmV2YWxpZGF0ZTpcbiAgICAvLyAgLSBvbiBpbml0aWFsIGxvYWQgKHNob3VsZG4ndCBiZSBhbnkgZmV0Y2hlcnMgdGhlbiBhbnl3YXkpXG4gICAgLy8gIC0gaWYgZmV0Y2hlciB3b24ndCBiZSBwcmVzZW50IGluIHRoZSBzdWJzZXF1ZW50IHJlbmRlclxuICAgIC8vICAgIC0gbm8gbG9uZ2VyIG1hdGNoZXMgdGhlIFVSTCAodjdfZmV0Y2hlclBlcnNpc3Q9ZmFsc2UpXG4gICAgLy8gICAgLSB3YXMgdW5tb3VudGVkIGJ1dCBwZXJzaXN0ZWQgZHVlIHRvIHY3X2ZldGNoZXJQZXJzaXN0PXRydWVcbiAgICBpZiAoaXNJbml0aWFsTG9hZCB8fCAhbWF0Y2hlcy5zb21lKG0gPT4gbS5yb3V0ZS5pZCA9PT0gZi5yb3V0ZUlkKSB8fCBkZWxldGVkRmV0Y2hlcnMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGZldGNoZXJNYXRjaGVzID0gbWF0Y2hSb3V0ZXMocm91dGVzVG9Vc2UsIGYucGF0aCwgYmFzZW5hbWUpO1xuICAgIC8vIElmIHRoZSBmZXRjaGVyIHBhdGggbm8gbG9uZ2VyIG1hdGNoZXMsIHB1c2ggaXQgaW4gd2l0aCBudWxsIG1hdGNoZXMgc29cbiAgICAvLyB3ZSBjYW4gdHJpZ2dlciBhIDQwNCBpbiBjYWxsTG9hZGVyc0FuZE1heWJlUmVzb2x2ZURhdGEuICBOb3RlIHRoaXMgaXNcbiAgICAvLyBjdXJyZW50bHkgb25seSBhIHVzZS1jYXNlIGZvciBSZW1peCBITVIgd2hlcmUgdGhlIHJvdXRlIHRyZWUgY2FuIGNoYW5nZVxuICAgIC8vIGF0IHJ1bnRpbWUgYW5kIHJlbW92ZSBhIHJvdXRlIHByZXZpb3VzbHkgbG9hZGVkIHZpYSBhIGZldGNoZXJcbiAgICBpZiAoIWZldGNoZXJNYXRjaGVzKSB7XG4gICAgICByZXZhbGlkYXRpbmdGZXRjaGVycy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICByb3V0ZUlkOiBmLnJvdXRlSWQsXG4gICAgICAgIHBhdGg6IGYucGF0aCxcbiAgICAgICAgbWF0Y2hlczogbnVsbCxcbiAgICAgICAgbWF0Y2g6IG51bGwsXG4gICAgICAgIGNvbnRyb2xsZXI6IG51bGxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZXZhbGlkYXRpbmcgZmV0Y2hlcnMgYXJlIGRlY291cGxlZCBmcm9tIHRoZSByb3V0ZSBtYXRjaGVzIHNpbmNlIHRoZXlcbiAgICAvLyBsb2FkIGZyb20gYSBzdGF0aWMgaHJlZi4gIFRoZXkgcmV2YWxpZGF0ZSBiYXNlZCBvbiBleHBsaWNpdCByZXZhbGlkYXRpb25cbiAgICAvLyAoc3VibWlzc2lvbiwgdXNlUmV2YWxpZGF0b3IsIG9yIFgtUmVtaXgtUmV2YWxpZGF0ZSlcbiAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgIGxldCBmZXRjaGVyTWF0Y2ggPSBnZXRUYXJnZXRNYXRjaChmZXRjaGVyTWF0Y2hlcywgZi5wYXRoKTtcbiAgICBsZXQgc2hvdWxkUmV2YWxpZGF0ZSA9IGZhbHNlO1xuICAgIGlmIChmZXRjaFJlZGlyZWN0SWRzLmhhcyhrZXkpKSB7XG4gICAgICAvLyBOZXZlciB0cmlnZ2VyIGEgcmV2YWxpZGF0aW9uIG9mIGFuIGFjdGl2ZWx5IHJlZGlyZWN0aW5nIGZldGNoZXJcbiAgICAgIHNob3VsZFJldmFsaWRhdGUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNhbmNlbGxlZEZldGNoZXJMb2Fkcy5oYXMoa2V5KSkge1xuICAgICAgLy8gQWx3YXlzIG1hcmsgZm9yIHJldmFsaWRhdGlvbiBpZiB0aGUgZmV0Y2hlciB3YXMgY2FuY2VsbGVkXG4gICAgICBjYW5jZWxsZWRGZXRjaGVyTG9hZHMuZGVsZXRlKGtleSk7XG4gICAgICBzaG91bGRSZXZhbGlkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGZldGNoZXIgJiYgZmV0Y2hlci5zdGF0ZSAhPT0gXCJpZGxlXCIgJiYgZmV0Y2hlci5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIHRoZSBmZXRjaGVyIGhhc24ndCBldmVyIGNvbXBsZXRlZCBsb2FkaW5nIHlldCwgdGhlbiB0aGlzIGlzbid0IGFcbiAgICAgIC8vIHJldmFsaWRhdGlvbiwgaXQgd291bGQganVzdCBiZSBhIGJyYW5kIG5ldyBsb2FkIGlmIGFuIGV4cGxpY2l0XG4gICAgICAvLyByZXZhbGlkYXRpb24gaXMgcmVxdWlyZWRcbiAgICAgIHNob3VsZFJldmFsaWRhdGUgPSBpc1JldmFsaWRhdGlvblJlcXVpcmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlcndpc2UgZmFsbCBiYWNrIG9uIGFueSB1c2VyLWRlZmluZWQgc2hvdWxkUmV2YWxpZGF0ZSwgZGVmYXVsdGluZ1xuICAgICAgLy8gdG8gZXhwbGljaXQgcmV2YWxpZGF0aW9ucyBvbmx5XG4gICAgICBzaG91bGRSZXZhbGlkYXRlID0gc2hvdWxkUmV2YWxpZGF0ZUxvYWRlcihmZXRjaGVyTWF0Y2gsIF9leHRlbmRzKHtcbiAgICAgICAgY3VycmVudFVybCxcbiAgICAgICAgY3VycmVudFBhcmFtczogc3RhdGUubWF0Y2hlc1tzdGF0ZS5tYXRjaGVzLmxlbmd0aCAtIDFdLnBhcmFtcyxcbiAgICAgICAgbmV4dFVybCxcbiAgICAgICAgbmV4dFBhcmFtczogbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdLnBhcmFtc1xuICAgICAgfSwgc3VibWlzc2lvbiwge1xuICAgICAgICBhY3Rpb25SZXN1bHQsXG4gICAgICAgIGFjdGlvblN0YXR1cyxcbiAgICAgICAgZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6IHNob3VsZFNraXBSZXZhbGlkYXRpb24gPyBmYWxzZSA6IGlzUmV2YWxpZGF0aW9uUmVxdWlyZWRcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJldmFsaWRhdGUpIHtcbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHJvdXRlSWQ6IGYucm91dGVJZCxcbiAgICAgICAgcGF0aDogZi5wYXRoLFxuICAgICAgICBtYXRjaGVzOiBmZXRjaGVyTWF0Y2hlcyxcbiAgICAgICAgbWF0Y2g6IGZldGNoZXJNYXRjaCxcbiAgICAgICAgY29udHJvbGxlcjogbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW25hdmlnYXRpb25NYXRjaGVzLCByZXZhbGlkYXRpbmdGZXRjaGVyc107XG59XG5mdW5jdGlvbiBpc05ld0xvYWRlcihjdXJyZW50TG9hZGVyRGF0YSwgY3VycmVudE1hdGNoLCBtYXRjaCkge1xuICBsZXQgaXNOZXcgPVxuICAvLyBbYV0gLT4gW2EsIGJdXG4gICFjdXJyZW50TWF0Y2ggfHxcbiAgLy8gW2EsIGJdIC0+IFthLCBjXVxuICBtYXRjaC5yb3V0ZS5pZCAhPT0gY3VycmVudE1hdGNoLnJvdXRlLmlkO1xuICAvLyBIYW5kbGUgdGhlIGNhc2UgdGhhdCB3ZSBkb24ndCBoYXZlIGRhdGEgZm9yIGEgcmUtdXNlZCByb3V0ZSwgcG90ZW50aWFsbHlcbiAgLy8gZnJvbSBhIHByaW9yIGVycm9yIG9yIGZyb20gYSBjYW5jZWxsZWQgcGVuZGluZyBkZWZlcnJlZFxuICBsZXQgaXNNaXNzaW5nRGF0YSA9IGN1cnJlbnRMb2FkZXJEYXRhW21hdGNoLnJvdXRlLmlkXSA9PT0gdW5kZWZpbmVkO1xuICAvLyBBbHdheXMgbG9hZCBpZiB0aGlzIGlzIGEgbmV0LW5ldyByb3V0ZSBvciB3ZSBkb24ndCB5ZXQgaGF2ZSBkYXRhXG4gIHJldHVybiBpc05ldyB8fCBpc01pc3NpbmdEYXRhO1xufVxuZnVuY3Rpb24gaXNOZXdSb3V0ZUluc3RhbmNlKGN1cnJlbnRNYXRjaCwgbWF0Y2gpIHtcbiAgbGV0IGN1cnJlbnRQYXRoID0gY3VycmVudE1hdGNoLnJvdXRlLnBhdGg7XG4gIHJldHVybiAoXG4gICAgLy8gcGFyYW0gY2hhbmdlIGZvciB0aGlzIG1hdGNoLCAvdXNlcnMvMTIzIC0+IC91c2Vycy80NTZcbiAgICBjdXJyZW50TWF0Y2gucGF0aG5hbWUgIT09IG1hdGNoLnBhdGhuYW1lIHx8XG4gICAgLy8gc3BsYXQgcGFyYW0gY2hhbmdlZCwgd2hpY2ggaXMgbm90IHByZXNlbnQgaW4gbWF0Y2gucGF0aFxuICAgIC8vIGUuZy4gL2ZpbGVzL2ltYWdlcy9hdmF0YXIuanBnIC0+IGZpbGVzL2ZpbmFuY2VzLnhsc1xuICAgIGN1cnJlbnRQYXRoICE9IG51bGwgJiYgY3VycmVudFBhdGguZW5kc1dpdGgoXCIqXCIpICYmIGN1cnJlbnRNYXRjaC5wYXJhbXNbXCIqXCJdICE9PSBtYXRjaC5wYXJhbXNbXCIqXCJdXG4gICk7XG59XG5mdW5jdGlvbiBzaG91bGRSZXZhbGlkYXRlTG9hZGVyKGxvYWRlck1hdGNoLCBhcmcpIHtcbiAgaWYgKGxvYWRlck1hdGNoLnJvdXRlLnNob3VsZFJldmFsaWRhdGUpIHtcbiAgICBsZXQgcm91dGVDaG9pY2UgPSBsb2FkZXJNYXRjaC5yb3V0ZS5zaG91bGRSZXZhbGlkYXRlKGFyZyk7XG4gICAgaWYgKHR5cGVvZiByb3V0ZUNob2ljZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiByb3V0ZUNob2ljZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFyZy5kZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTtcbn1cbi8qKlxuICogSWRlbXBvdGVudCB1dGlsaXR5IHRvIGV4ZWN1dGUgcGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb24oKSB0byBsYXppbHkgbG9hZCByb3V0ZVxuICogZGVmaW5pdGlvbnMgYW5kIHVwZGF0ZSB0aGUgcm91dGVzL3JvdXRlTWFuaWZlc3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZExhenlSb3V0ZUNoaWxkcmVuKHBhdGNoUm91dGVzT25OYXZpZ2F0aW9uSW1wbCwgcGF0aCwgbWF0Y2hlcywgcm91dGVzLCBtYW5pZmVzdCwgbWFwUm91dGVQcm9wZXJ0aWVzLCBwZW5kaW5nUm91dGVDaGlsZHJlbiwgc2lnbmFsKSB7XG4gIGxldCBrZXkgPSBbcGF0aCwgLi4ubWF0Y2hlcy5tYXAobSA9PiBtLnJvdXRlLmlkKV0uam9pbihcIi1cIik7XG4gIHRyeSB7XG4gICAgbGV0IHBlbmRpbmcgPSBwZW5kaW5nUm91dGVDaGlsZHJlbi5nZXQoa2V5KTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBwYXRjaFJvdXRlc09uTmF2aWdhdGlvbkltcGwoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBwYXRjaDogKHJvdXRlSWQsIGNoaWxkcmVuKSA9PiB7XG4gICAgICAgICAgaWYgKCFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgcGF0Y2hSb3V0ZXNJbXBsKHJvdXRlSWQsIGNoaWxkcmVuLCByb3V0ZXMsIG1hbmlmZXN0LCBtYXBSb3V0ZVByb3BlcnRpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwZW5kaW5nUm91dGVDaGlsZHJlbi5zZXQoa2V5LCBwZW5kaW5nKTtcbiAgICB9XG4gICAgaWYgKHBlbmRpbmcgJiYgaXNQcm9taXNlKHBlbmRpbmcpKSB7XG4gICAgICBhd2FpdCBwZW5kaW5nO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBwZW5kaW5nUm91dGVDaGlsZHJlbi5kZWxldGUoa2V5KTtcbiAgfVxufVxuZnVuY3Rpb24gcGF0Y2hSb3V0ZXNJbXBsKHJvdXRlSWQsIGNoaWxkcmVuLCByb3V0ZXNUb1VzZSwgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllcykge1xuICBpZiAocm91dGVJZCkge1xuICAgIHZhciBfcm91dGUkY2hpbGRyZW47XG4gICAgbGV0IHJvdXRlID0gbWFuaWZlc3Rbcm91dGVJZF07XG4gICAgaW52YXJpYW50KHJvdXRlLCBcIk5vIHJvdXRlIGZvdW5kIHRvIHBhdGNoIGNoaWxkcmVuIGludG86IHJvdXRlSWQgPSBcIiArIHJvdXRlSWQpO1xuICAgIGxldCBkYXRhQ2hpbGRyZW4gPSBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzKGNoaWxkcmVuLCBtYXBSb3V0ZVByb3BlcnRpZXMsIFtyb3V0ZUlkLCBcInBhdGNoXCIsIFN0cmluZygoKF9yb3V0ZSRjaGlsZHJlbiA9IHJvdXRlLmNoaWxkcmVuKSA9PSBudWxsID8gdm9pZCAwIDogX3JvdXRlJGNoaWxkcmVuLmxlbmd0aCkgfHwgXCIwXCIpXSwgbWFuaWZlc3QpO1xuICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgcm91dGUuY2hpbGRyZW4ucHVzaCguLi5kYXRhQ2hpbGRyZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3V0ZS5jaGlsZHJlbiA9IGRhdGFDaGlsZHJlbjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGRhdGFDaGlsZHJlbiA9IGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMoY2hpbGRyZW4sIG1hcFJvdXRlUHJvcGVydGllcywgW1wicGF0Y2hcIiwgU3RyaW5nKHJvdXRlc1RvVXNlLmxlbmd0aCB8fCBcIjBcIildLCBtYW5pZmVzdCk7XG4gICAgcm91dGVzVG9Vc2UucHVzaCguLi5kYXRhQ2hpbGRyZW4pO1xuICB9XG59XG4vKipcbiAqIEV4ZWN1dGUgcm91dGUubGF6eSgpIG1ldGhvZHMgdG8gbGF6aWx5IGxvYWQgcm91dGUgbW9kdWxlcyAobG9hZGVyLCBhY3Rpb24sXG4gKiBzaG91bGRSZXZhbGlkYXRlKSBhbmQgdXBkYXRlIHRoZSByb3V0ZU1hbmlmZXN0IGluIHBsYWNlIHdoaWNoIHNoYXJlcyBvYmplY3RzXG4gKiB3aXRoIGRhdGFSb3V0ZXMgc28gdGhvc2UgZ2V0IHVwZGF0ZWQgYXMgd2VsbC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZExhenlSb3V0ZU1vZHVsZShyb3V0ZSwgbWFwUm91dGVQcm9wZXJ0aWVzLCBtYW5pZmVzdCkge1xuICBpZiAoIXJvdXRlLmxhenkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGxhenlSb3V0ZSA9IGF3YWl0IHJvdXRlLmxhenkoKTtcbiAgLy8gSWYgdGhlIGxhenkgcm91dGUgZnVuY3Rpb24gd2FzIGV4ZWN1dGVkIGFuZCByZW1vdmVkIGJ5IGFub3RoZXIgcGFyYWxsZWxcbiAgLy8gY2FsbCB0aGVuIHdlIGNhbiByZXR1cm4gLSBmaXJzdCBsYXp5KCkgdG8gZmluaXNoIHdpbnMgYmVjYXVzZSB0aGUgcmV0dXJuXG4gIC8vIHZhbHVlIG9mIGxhenkgaXMgZXhwZWN0ZWQgdG8gYmUgc3RhdGljXG4gIGlmICghcm91dGUubGF6eSkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgcm91dGVUb1VwZGF0ZSA9IG1hbmlmZXN0W3JvdXRlLmlkXTtcbiAgaW52YXJpYW50KHJvdXRlVG9VcGRhdGUsIFwiTm8gcm91dGUgZm91bmQgaW4gbWFuaWZlc3RcIik7XG4gIC8vIFVwZGF0ZSB0aGUgcm91dGUgaW4gcGxhY2UuICBUaGlzIHNob3VsZCBiZSBzYWZlIGJlY2F1c2UgdGhlcmUncyBubyB3YXlcbiAgLy8gd2UgY291bGQgeWV0IGJlIHNpdHRpbmcgb24gdGhpcyByb3V0ZSBhcyB3ZSBjYW4ndCBnZXQgdGhlcmUgd2l0aG91dFxuICAvLyByZXNvbHZpbmcgbGF6eSgpIGZpcnN0LlxuICAvL1xuICAvLyBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBITVIgXCJ1cGRhdGVcIiB1c2UtY2FzZSB3aGVyZSB3ZSBtYXkgYWN0aXZlbHkgYmVcbiAgLy8gb24gdGhlIHJvdXRlIGJlaW5nIHVwZGF0ZWQuICBUaGUgbWFpbiBjb25jZXJuIGJvaWxzIGRvd24gdG8gXCJkb2VzIHRoaXNcbiAgLy8gbXV0YXRpb24gYWZmZWN0IGFueSBvbmdvaW5nIG5hdmlnYXRpb25zIG9yIGFueSBjdXJyZW50IHN0YXRlLm1hdGNoZXNcbiAgLy8gdmFsdWVzP1wiLiAgSWYgbm90LCBpdCBzaG91bGQgYmUgc2FmZSB0byB1cGRhdGUgaW4gcGxhY2UuXG4gIGxldCByb3V0ZVVwZGF0ZXMgPSB7fTtcbiAgZm9yIChsZXQgbGF6eVJvdXRlUHJvcGVydHkgaW4gbGF6eVJvdXRlKSB7XG4gICAgbGV0IHN0YXRpY1JvdXRlVmFsdWUgPSByb3V0ZVRvVXBkYXRlW2xhenlSb3V0ZVByb3BlcnR5XTtcbiAgICBsZXQgaXNQcm9wZXJ0eVN0YXRpY2FsbHlEZWZpbmVkID0gc3RhdGljUm91dGVWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBpc24ndCBzdGF0aWMgc2luY2UgaXQgc2hvdWxkIGFsd2F5cyBiZSB1cGRhdGVkIGJhc2VkXG4gICAgLy8gb24gdGhlIHJvdXRlIHVwZGF0ZXNcbiAgICBsYXp5Um91dGVQcm9wZXJ0eSAhPT0gXCJoYXNFcnJvckJvdW5kYXJ5XCI7XG4gICAgd2FybmluZyghaXNQcm9wZXJ0eVN0YXRpY2FsbHlEZWZpbmVkLCBcIlJvdXRlIFxcXCJcIiArIHJvdXRlVG9VcGRhdGUuaWQgKyBcIlxcXCIgaGFzIGEgc3RhdGljIHByb3BlcnR5IFxcXCJcIiArIGxhenlSb3V0ZVByb3BlcnR5ICsgXCJcXFwiIFwiICsgXCJkZWZpbmVkIGJ1dCBpdHMgbGF6eSBmdW5jdGlvbiBpcyBhbHNvIHJldHVybmluZyBhIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5LiBcIiArIChcIlRoZSBsYXp5IHJvdXRlIHByb3BlcnR5IFxcXCJcIiArIGxhenlSb3V0ZVByb3BlcnR5ICsgXCJcXFwiIHdpbGwgYmUgaWdub3JlZC5cIikpO1xuICAgIGlmICghaXNQcm9wZXJ0eVN0YXRpY2FsbHlEZWZpbmVkICYmICFpbW11dGFibGVSb3V0ZUtleXMuaGFzKGxhenlSb3V0ZVByb3BlcnR5KSkge1xuICAgICAgcm91dGVVcGRhdGVzW2xhenlSb3V0ZVByb3BlcnR5XSA9IGxhenlSb3V0ZVtsYXp5Um91dGVQcm9wZXJ0eV07XG4gICAgfVxuICB9XG4gIC8vIE11dGF0ZSB0aGUgcm91dGUgd2l0aCB0aGUgcHJvdmlkZWQgdXBkYXRlcy4gIERvIHRoaXMgZmlyc3Qgc28gd2UgcGFzc1xuICAvLyB0aGUgdXBkYXRlZCB2ZXJzaW9uIHRvIG1hcFJvdXRlUHJvcGVydGllc1xuICBPYmplY3QuYXNzaWduKHJvdXRlVG9VcGRhdGUsIHJvdXRlVXBkYXRlcyk7XG4gIC8vIE11dGF0ZSB0aGUgYGhhc0Vycm9yQm91bmRhcnlgIHByb3BlcnR5IG9uIHRoZSByb3V0ZSBiYXNlZCBvbiB0aGUgcm91dGVcbiAgLy8gdXBkYXRlcyBhbmQgcmVtb3ZlIHRoZSBgbGF6eWAgZnVuY3Rpb24gc28gd2UgZG9uJ3QgcmVzb2x2ZSB0aGUgbGF6eVxuICAvLyByb3V0ZSBhZ2Fpbi5cbiAgT2JqZWN0LmFzc2lnbihyb3V0ZVRvVXBkYXRlLCBfZXh0ZW5kcyh7fSwgbWFwUm91dGVQcm9wZXJ0aWVzKHJvdXRlVG9VcGRhdGUpLCB7XG4gICAgbGF6eTogdW5kZWZpbmVkXG4gIH0pKTtcbn1cbi8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYGRhdGFTdHJhdGVneWAgd2hpY2ggZmV0Y2hlcyBhbGwgbG9hZGVycyBpbiBwYXJhbGxlbFxuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdERhdGFTdHJhdGVneShfcmVmNikge1xuICBsZXQge1xuICAgIG1hdGNoZXNcbiAgfSA9IF9yZWY2O1xuICBsZXQgbWF0Y2hlc1RvTG9hZCA9IG1hdGNoZXMuZmlsdGVyKG0gPT4gbS5zaG91bGRMb2FkKTtcbiAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChtYXRjaGVzVG9Mb2FkLm1hcChtID0+IG0ucmVzb2x2ZSgpKSk7XG4gIHJldHVybiByZXN1bHRzLnJlZHVjZSgoYWNjLCByZXN1bHQsIGkpID0+IE9iamVjdC5hc3NpZ24oYWNjLCB7XG4gICAgW21hdGNoZXNUb0xvYWRbaV0ucm91dGUuaWRdOiByZXN1bHRcbiAgfSksIHt9KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNhbGxEYXRhU3RyYXRlZ3lJbXBsKGRhdGFTdHJhdGVneUltcGwsIHR5cGUsIHN0YXRlLCByZXF1ZXN0LCBtYXRjaGVzVG9Mb2FkLCBtYXRjaGVzLCBmZXRjaGVyS2V5LCBtYW5pZmVzdCwgbWFwUm91dGVQcm9wZXJ0aWVzLCByZXF1ZXN0Q29udGV4dCkge1xuICBsZXQgbG9hZFJvdXRlRGVmaW5pdGlvbnNQcm9taXNlcyA9IG1hdGNoZXMubWFwKG0gPT4gbS5yb3V0ZS5sYXp5ID8gbG9hZExhenlSb3V0ZU1vZHVsZShtLnJvdXRlLCBtYXBSb3V0ZVByb3BlcnRpZXMsIG1hbmlmZXN0KSA6IHVuZGVmaW5lZCk7XG4gIGxldCBkc01hdGNoZXMgPSBtYXRjaGVzLm1hcCgobWF0Y2gsIGkpID0+IHtcbiAgICBsZXQgbG9hZFJvdXRlUHJvbWlzZSA9IGxvYWRSb3V0ZURlZmluaXRpb25zUHJvbWlzZXNbaV07XG4gICAgbGV0IHNob3VsZExvYWQgPSBtYXRjaGVzVG9Mb2FkLnNvbWUobSA9PiBtLnJvdXRlLmlkID09PSBtYXRjaC5yb3V0ZS5pZCk7XG4gICAgLy8gYHJlc29sdmVgIGVuY2Fwc3VsYXRlcyByb3V0ZS5sYXp5KCksIGV4ZWN1dGluZyB0aGUgbG9hZGVyL2FjdGlvbixcbiAgICAvLyBhbmQgbWFwcGluZyByZXR1cm4gdmFsdWVzL3Rocm93biBlcnJvcnMgdG8gYSBgRGF0YVN0cmF0ZWd5UmVzdWx0YC4gIFVzZXJzXG4gICAgLy8gY2FuIHBhc3MgYSBjYWxsYmFjayB0byB0YWtlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIGV4ZWN1dGlvblxuICAgIC8vIG9mIHRoZSBsb2FkZXIvYWN0aW9uXG4gICAgbGV0IHJlc29sdmUgPSBhc3luYyBoYW5kbGVyT3ZlcnJpZGUgPT4ge1xuICAgICAgaWYgKGhhbmRsZXJPdmVycmlkZSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJHRVRcIiAmJiAobWF0Y2gucm91dGUubGF6eSB8fCBtYXRjaC5yb3V0ZS5sb2FkZXIpKSB7XG4gICAgICAgIHNob3VsZExvYWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNob3VsZExvYWQgPyBjYWxsTG9hZGVyT3JBY3Rpb24odHlwZSwgcmVxdWVzdCwgbWF0Y2gsIGxvYWRSb3V0ZVByb21pc2UsIGhhbmRsZXJPdmVycmlkZSwgcmVxdWVzdENvbnRleHQpIDogUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5kYXRhLFxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIG1hdGNoLCB7XG4gICAgICBzaG91bGRMb2FkLFxuICAgICAgcmVzb2x2ZVxuICAgIH0pO1xuICB9KTtcbiAgLy8gU2VuZCBhbGwgbWF0Y2hlcyBoZXJlIHRvIGFsbG93IGZvciBhIG1pZGRsZXdhcmUtdHlwZSBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gaGFuZGxlciB3aWxsIGJlIGEgbm8tb3AgZm9yIHVubmVlZGVkIHJvdXRlcyBhbmQgd2UgZmlsdGVyIHRob3NlIHJlc3VsdHNcbiAgLy8gYmFjayBvdXQgYmVsb3cuXG4gIGxldCByZXN1bHRzID0gYXdhaXQgZGF0YVN0cmF0ZWd5SW1wbCh7XG4gICAgbWF0Y2hlczogZHNNYXRjaGVzLFxuICAgIHJlcXVlc3QsXG4gICAgcGFyYW1zOiBtYXRjaGVzWzBdLnBhcmFtcyxcbiAgICBmZXRjaGVyS2V5LFxuICAgIGNvbnRleHQ6IHJlcXVlc3RDb250ZXh0XG4gIH0pO1xuICAvLyBXYWl0IGZvciBhbGwgcm91dGVzIHRvIGxvYWQgaGVyZSBidXQgJ3N3YWxsb3cgdGhlIGVycm9yIHNpbmNlIHdlIHdhbnRcbiAgLy8gaXQgdG8gYnViYmxlIHVwIGZyb20gdGhlIGBhd2FpdCBsb2FkUm91dGVQcm9taXNlYCBpbiBgY2FsbExvYWRlck9yQWN0aW9uYCAtXG4gIC8vIGNhbGxlZCBmcm9tIGBtYXRjaC5yZXNvbHZlKClgXG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwobG9hZFJvdXRlRGVmaW5pdGlvbnNQcm9taXNlcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBOby1vcFxuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuLy8gRGVmYXVsdCBsb2dpYyBmb3IgY2FsbGluZyBhIGxvYWRlci9hY3Rpb24gaXMgdGhlIHVzZXIgaGFzIG5vIHNwZWNpZmllZCBhIGRhdGFTdHJhdGVneVxuYXN5bmMgZnVuY3Rpb24gY2FsbExvYWRlck9yQWN0aW9uKHR5cGUsIHJlcXVlc3QsIG1hdGNoLCBsb2FkUm91dGVQcm9taXNlLCBoYW5kbGVyT3ZlcnJpZGUsIHN0YXRpY0NvbnRleHQpIHtcbiAgbGV0IHJlc3VsdDtcbiAgbGV0IG9uUmVqZWN0O1xuICBsZXQgcnVuSGFuZGxlciA9IGhhbmRsZXIgPT4ge1xuICAgIC8vIFNldHVwIGEgcHJvbWlzZSB3ZSBjYW4gcmFjZSBhZ2FpbnN0IHNvIHRoYXQgYWJvcnQgc2lnbmFscyBzaG9ydCBjaXJjdWl0XG4gICAgbGV0IHJlamVjdDtcbiAgICAvLyBUaGlzIHdpbGwgbmV2ZXIgcmVzb2x2ZSBzbyBzYWZlIHRvIHR5cGUgaXQgYXMgUHJvbWlzZTxEYXRhU3RyYXRlZ3lSZXN1bHQ+IHRvXG4gICAgLy8gc2F0aXNmeSB0aGUgZnVuY3Rpb24gcmV0dXJuIHZhbHVlXG4gICAgbGV0IGFib3J0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChfLCByKSA9PiByZWplY3QgPSByKTtcbiAgICBvblJlamVjdCA9ICgpID0+IHJlamVjdCgpO1xuICAgIHJlcXVlc3Quc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvblJlamVjdCk7XG4gICAgbGV0IGFjdHVhbEhhbmRsZXIgPSBjdHggPT4ge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIllvdSBjYW5ub3QgY2FsbCB0aGUgaGFuZGxlciBmb3IgYSByb3V0ZSB3aGljaCBkZWZpbmVzIGEgYm9vbGVhbiBcIiArIChcIlxcXCJcIiArIHR5cGUgKyBcIlxcXCIgW3JvdXRlSWQ6IFwiICsgbWF0Y2gucm91dGUuaWQgKyBcIl1cIikpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGVyKHtcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcGFyYW1zOiBtYXRjaC5wYXJhbXMsXG4gICAgICAgIGNvbnRleHQ6IHN0YXRpY0NvbnRleHRcbiAgICAgIH0sIC4uLihjdHggIT09IHVuZGVmaW5lZCA/IFtjdHhdIDogW10pKTtcbiAgICB9O1xuICAgIGxldCBoYW5kbGVyUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgdmFsID0gYXdhaXQgKGhhbmRsZXJPdmVycmlkZSA/IGhhbmRsZXJPdmVycmlkZShjdHggPT4gYWN0dWFsSGFuZGxlcihjdHgpKSA6IGFjdHVhbEhhbmRsZXIoKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJkYXRhXCIsXG4gICAgICAgICAgcmVzdWx0OiB2YWxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgcmVzdWx0OiBlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtoYW5kbGVyUHJvbWlzZSwgYWJvcnRQcm9taXNlXSk7XG4gIH07XG4gIHRyeSB7XG4gICAgbGV0IGhhbmRsZXIgPSBtYXRjaC5yb3V0ZVt0eXBlXTtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgcm91dGUubGF6eSBwcm9taXNlLCBhd2FpdCB0aGF0IGZpcnN0XG4gICAgaWYgKGxvYWRSb3V0ZVByb21pc2UpIHtcbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgIC8vIFJ1biBzdGF0aWNhbGx5IGRlZmluZWQgaGFuZGxlciBpbiBwYXJhbGxlbCB3aXRoIGxhenkoKVxuICAgICAgICBsZXQgaGFuZGxlckVycm9yO1xuICAgICAgICBsZXQgW3ZhbHVlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLy8gSWYgdGhlIGhhbmRsZXIgdGhyb3dzLCBkb24ndCBsZXQgaXQgaW1tZWRpYXRlbHkgYnViYmxlIG91dCxcbiAgICAgICAgLy8gc2luY2Ugd2UgbmVlZCB0byBsZXQgdGhlIGxhenkoKSBleGVjdXRpb24gZmluaXNoIHNvIHdlIGtub3cgaWYgdGhpc1xuICAgICAgICAvLyByb3V0ZSBoYXMgYSBib3VuZGFyeSB0aGF0IGNhbiBoYW5kbGUgdGhlIGVycm9yXG4gICAgICAgIHJ1bkhhbmRsZXIoaGFuZGxlcikuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgaGFuZGxlckVycm9yID0gZTtcbiAgICAgICAgfSksIGxvYWRSb3V0ZVByb21pc2VdKTtcbiAgICAgICAgaWYgKGhhbmRsZXJFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgaGFuZGxlckVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTG9hZCBsYXp5IHJvdXRlIG1vZHVsZSwgdGhlbiBydW4gYW55IHJldHVybmVkIGhhbmRsZXJcbiAgICAgICAgYXdhaXQgbG9hZFJvdXRlUHJvbWlzZTtcbiAgICAgICAgaGFuZGxlciA9IG1hdGNoLnJvdXRlW3R5cGVdO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIC8vIEhhbmRsZXIgc3RpbGwgcnVucyBldmVuIGlmIHdlIGdvdCBpbnRlcnJ1cHRlZCB0byBtYWludGFpbiBjb25zaXN0ZW5jeVxuICAgICAgICAgIC8vIHdpdGggdW4tYWJvcnRhYmxlIGJlaGF2aW9yIG9mIGhhbmRsZXIgZXhlY3V0aW9uIG9uIG5vbi1sYXp5IG9yXG4gICAgICAgICAgLy8gcHJldmlvdXNseS1sYXp5LWxvYWRlZCByb3V0ZXNcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBydW5IYW5kbGVyKGhhbmRsZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiYWN0aW9uXCIpIHtcbiAgICAgICAgICBsZXQgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gICAgICAgICAgbGV0IHBhdGhuYW1lID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaDtcbiAgICAgICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGhuYW1lLFxuICAgICAgICAgICAgcm91dGVJZDogbWF0Y2gucm91dGUuaWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBsYXp5KCkgcm91dGUgaGFzIG5vIGxvYWRlciB0byBydW4uICBTaG9ydCBjaXJjdWl0IGhlcmUgc28gd2UgZG9uJ3RcbiAgICAgICAgICAvLyBoaXQgdGhlIGludmFyaWFudCBiZWxvdyB0aGF0IGVycm9ycyBvbiByZXR1cm5pbmcgdW5kZWZpbmVkLlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBSZXN1bHRUeXBlLmRhdGEsXG4gICAgICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFoYW5kbGVyKSB7XG4gICAgICBsZXQgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gICAgICBsZXQgcGF0aG5hbWUgPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoO1xuICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHtcbiAgICAgICAgcGF0aG5hbWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBydW5IYW5kbGVyKGhhbmRsZXIpO1xuICAgIH1cbiAgICBpbnZhcmlhbnQocmVzdWx0LnJlc3VsdCAhPT0gdW5kZWZpbmVkLCBcIllvdSBkZWZpbmVkIFwiICsgKHR5cGUgPT09IFwiYWN0aW9uXCIgPyBcImFuIGFjdGlvblwiIDogXCJhIGxvYWRlclwiKSArIFwiIGZvciByb3V0ZSBcIiArIChcIlxcXCJcIiArIG1hdGNoLnJvdXRlLmlkICsgXCJcXFwiIGJ1dCBkaWRuJ3QgcmV0dXJuIGFueXRoaW5nIGZyb20geW91ciBgXCIgKyB0eXBlICsgXCJgIFwiKSArIFwiZnVuY3Rpb24uIFBsZWFzZSByZXR1cm4gYSB2YWx1ZSBvciBgbnVsbGAuXCIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gV2Ugc2hvdWxkIGFscmVhZHkgYmUgY2F0Y2hpbmcgYW5kIGNvbnZlcnRpbmcgbm9ybWFsIGhhbmRsZXIgZXhlY3V0aW9ucyB0b1xuICAgIC8vIERhdGFTdHJhdGVneVJlc3VsdHMgYW5kIHJldHVybmluZyB0aGVtLCBzbyBhbnl0aGluZyB0aGF0IHRocm93cyBoZXJlIGlzIGFuXG4gICAgLy8gdW5leHBlY3RlZCBlcnJvciB3ZSBzdGlsbCBuZWVkIHRvIHdyYXBcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgIHJlc3VsdDogZVxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKG9uUmVqZWN0KSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25SZWplY3QpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuYXN5bmMgZnVuY3Rpb24gY29udmVydERhdGFTdHJhdGVneVJlc3VsdFRvRGF0YVJlc3VsdChkYXRhU3RyYXRlZ3lSZXN1bHQpIHtcbiAgbGV0IHtcbiAgICByZXN1bHQsXG4gICAgdHlwZVxuICB9ID0gZGF0YVN0cmF0ZWd5UmVzdWx0O1xuICBpZiAoaXNSZXNwb25zZShyZXN1bHQpKSB7XG4gICAgbGV0IGRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50VHlwZSA9IHJlc3VsdC5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKTtcbiAgICAgIC8vIENoZWNrIGJldHdlZW4gd29yZCBib3VuZGFyaWVzIGluc3RlYWQgb2Ygc3RhcnRzV2l0aCgpIGR1ZSB0byB0aGUgbGFzdFxuICAgICAgLy8gcGFyYWdyYXBoIG9mIGh0dHBzOi8vaHR0cHdnLm9yZy9zcGVjcy9yZmM5MTEwLmh0bWwjZmllbGQuY29udGVudC10eXBlXG4gICAgICBpZiAoY29udGVudFR5cGUgJiYgL1xcYmFwcGxpY2F0aW9uXFwvanNvblxcYi8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5ib2R5ID09IG51bGwpIHtcbiAgICAgICAgICBkYXRhID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhID0gYXdhaXQgcmVzdWx0Lmpzb24oKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IHJlc3VsdC50ZXh0KCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgICAgZXJyb3I6IGVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBSZXN1bHRUeXBlLmVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBSZXN1bHRUeXBlLmVycm9yLFxuICAgICAgICBlcnJvcjogbmV3IEVycm9yUmVzcG9uc2VJbXBsKHJlc3VsdC5zdGF0dXMsIHJlc3VsdC5zdGF0dXNUZXh0LCBkYXRhKSxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgaGVhZGVyczogcmVzdWx0LmhlYWRlcnNcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBSZXN1bHRUeXBlLmRhdGEsXG4gICAgICBkYXRhLFxuICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnN0YXR1cyxcbiAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZSA9PT0gUmVzdWx0VHlwZS5lcnJvcikge1xuICAgIGlmIChpc0RhdGFXaXRoUmVzcG9uc2VJbml0KHJlc3VsdCkpIHtcbiAgICAgIHZhciBfcmVzdWx0JGluaXQyO1xuICAgICAgaWYgKHJlc3VsdC5kYXRhIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdmFyIF9yZXN1bHQkaW5pdDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBSZXN1bHRUeXBlLmVycm9yLFxuICAgICAgICAgIGVycm9yOiByZXN1bHQuZGF0YSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAoX3Jlc3VsdCRpbml0ID0gcmVzdWx0LmluaXQpID09IG51bGwgPyB2b2lkIDAgOiBfcmVzdWx0JGluaXQuc3RhdHVzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IHRocm93biB1bnN0YWJsZV9kYXRhKCkgdG8gRXJyb3JSZXNwb25zZSBpbnN0YW5jZXNcbiAgICAgIHJlc3VsdCA9IG5ldyBFcnJvclJlc3BvbnNlSW1wbCgoKF9yZXN1bHQkaW5pdDIgPSByZXN1bHQuaW5pdCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9yZXN1bHQkaW5pdDIuc3RhdHVzKSB8fCA1MDAsIHVuZGVmaW5lZCwgcmVzdWx0LmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgIGVycm9yOiByZXN1bHQsXG4gICAgICBzdGF0dXNDb2RlOiBpc1JvdXRlRXJyb3JSZXNwb25zZShyZXN1bHQpID8gcmVzdWx0LnN0YXR1cyA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cbiAgaWYgKGlzRGVmZXJyZWREYXRhKHJlc3VsdCkpIHtcbiAgICB2YXIgX3Jlc3VsdCRpbml0MywgX3Jlc3VsdCRpbml0NDtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogUmVzdWx0VHlwZS5kZWZlcnJlZCxcbiAgICAgIGRlZmVycmVkRGF0YTogcmVzdWx0LFxuICAgICAgc3RhdHVzQ29kZTogKF9yZXN1bHQkaW5pdDMgPSByZXN1bHQuaW5pdCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9yZXN1bHQkaW5pdDMuc3RhdHVzLFxuICAgICAgaGVhZGVyczogKChfcmVzdWx0JGluaXQ0ID0gcmVzdWx0LmluaXQpID09IG51bGwgPyB2b2lkIDAgOiBfcmVzdWx0JGluaXQ0LmhlYWRlcnMpICYmIG5ldyBIZWFkZXJzKHJlc3VsdC5pbml0LmhlYWRlcnMpXG4gICAgfTtcbiAgfVxuICBpZiAoaXNEYXRhV2l0aFJlc3BvbnNlSW5pdChyZXN1bHQpKSB7XG4gICAgdmFyIF9yZXN1bHQkaW5pdDUsIF9yZXN1bHQkaW5pdDY7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFJlc3VsdFR5cGUuZGF0YSxcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLFxuICAgICAgc3RhdHVzQ29kZTogKF9yZXN1bHQkaW5pdDUgPSByZXN1bHQuaW5pdCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9yZXN1bHQkaW5pdDUuc3RhdHVzLFxuICAgICAgaGVhZGVyczogKF9yZXN1bHQkaW5pdDYgPSByZXN1bHQuaW5pdCkgIT0gbnVsbCAmJiBfcmVzdWx0JGluaXQ2LmhlYWRlcnMgPyBuZXcgSGVhZGVycyhyZXN1bHQuaW5pdC5oZWFkZXJzKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBSZXN1bHRUeXBlLmRhdGEsXG4gICAgZGF0YTogcmVzdWx0XG4gIH07XG59XG4vLyBTdXBwb3J0IHJlbGF0aXZlIHJvdXRpbmcgaW4gaW50ZXJuYWwgcmVkaXJlY3RzXG5mdW5jdGlvbiBub3JtYWxpemVSZWxhdGl2ZVJvdXRpbmdSZWRpcmVjdFJlc3BvbnNlKHJlc3BvbnNlLCByZXF1ZXN0LCByb3V0ZUlkLCBtYXRjaGVzLCBiYXNlbmFtZSwgdjdfcmVsYXRpdmVTcGxhdFBhdGgpIHtcbiAgbGV0IGxvY2F0aW9uID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJMb2NhdGlvblwiKTtcbiAgaW52YXJpYW50KGxvY2F0aW9uLCBcIlJlZGlyZWN0cyByZXR1cm5lZC90aHJvd24gZnJvbSBsb2FkZXJzL2FjdGlvbnMgbXVzdCBoYXZlIGEgTG9jYXRpb24gaGVhZGVyXCIpO1xuICBpZiAoIUFCU09MVVRFX1VSTF9SRUdFWC50ZXN0KGxvY2F0aW9uKSkge1xuICAgIGxldCB0cmltbWVkTWF0Y2hlcyA9IG1hdGNoZXMuc2xpY2UoMCwgbWF0Y2hlcy5maW5kSW5kZXgobSA9PiBtLnJvdXRlLmlkID09PSByb3V0ZUlkKSArIDEpO1xuICAgIGxvY2F0aW9uID0gbm9ybWFsaXplVG8obmV3IFVSTChyZXF1ZXN0LnVybCksIHRyaW1tZWRNYXRjaGVzLCBiYXNlbmFtZSwgdHJ1ZSwgbG9jYXRpb24sIHY3X3JlbGF0aXZlU3BsYXRQYXRoKTtcbiAgICByZXNwb25zZS5oZWFkZXJzLnNldChcIkxvY2F0aW9uXCIsIGxvY2F0aW9uKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5mdW5jdGlvbiBub3JtYWxpemVSZWRpcmVjdExvY2F0aW9uKGxvY2F0aW9uLCBjdXJyZW50VXJsLCBiYXNlbmFtZSkge1xuICBpZiAoQUJTT0xVVEVfVVJMX1JFR0VYLnRlc3QobG9jYXRpb24pKSB7XG4gICAgLy8gU3RyaXAgb2ZmIHRoZSBwcm90b2NvbCtvcmlnaW4gZm9yIHNhbWUtb3JpZ2luICsgc2FtZS1iYXNlbmFtZSBhYnNvbHV0ZSByZWRpcmVjdHNcbiAgICBsZXQgbm9ybWFsaXplZExvY2F0aW9uID0gbG9jYXRpb247XG4gICAgbGV0IHVybCA9IG5vcm1hbGl6ZWRMb2NhdGlvbi5zdGFydHNXaXRoKFwiLy9cIikgPyBuZXcgVVJMKGN1cnJlbnRVcmwucHJvdG9jb2wgKyBub3JtYWxpemVkTG9jYXRpb24pIDogbmV3IFVSTChub3JtYWxpemVkTG9jYXRpb24pO1xuICAgIGxldCBpc1NhbWVCYXNlbmFtZSA9IHN0cmlwQmFzZW5hbWUodXJsLnBhdGhuYW1lLCBiYXNlbmFtZSkgIT0gbnVsbDtcbiAgICBpZiAodXJsLm9yaWdpbiA9PT0gY3VycmVudFVybC5vcmlnaW4gJiYgaXNTYW1lQmFzZW5hbWUpIHtcbiAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoICsgdXJsLmhhc2g7XG4gICAgfVxuICB9XG4gIHJldHVybiBsb2NhdGlvbjtcbn1cbi8vIFV0aWxpdHkgbWV0aG9kIGZvciBjcmVhdGluZyB0aGUgUmVxdWVzdCBpbnN0YW5jZXMgZm9yIGxvYWRlcnMvYWN0aW9ucyBkdXJpbmdcbi8vIGNsaWVudC1zaWRlIG5hdmlnYXRpb25zIGFuZCBmZXRjaGVzLiAgRHVyaW5nIFNTUiB3ZSB3aWxsIGFsd2F5cyBoYXZlIGFcbi8vIFJlcXVlc3QgaW5zdGFuY2UgZnJvbSB0aGUgc3RhdGljIGhhbmRsZXIgKHF1ZXJ5L3F1ZXJ5Um91dGUpXG5mdW5jdGlvbiBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChoaXN0b3J5LCBsb2NhdGlvbiwgc2lnbmFsLCBzdWJtaXNzaW9uKSB7XG4gIGxldCB1cmwgPSBoaXN0b3J5LmNyZWF0ZVVSTChzdHJpcEhhc2hGcm9tUGF0aChsb2NhdGlvbikpLnRvU3RyaW5nKCk7XG4gIGxldCBpbml0ID0ge1xuICAgIHNpZ25hbFxuICB9O1xuICBpZiAoc3VibWlzc2lvbiAmJiBpc011dGF0aW9uTWV0aG9kKHN1Ym1pc3Npb24uZm9ybU1ldGhvZCkpIHtcbiAgICBsZXQge1xuICAgICAgZm9ybU1ldGhvZCxcbiAgICAgIGZvcm1FbmNUeXBlXG4gICAgfSA9IHN1Ym1pc3Npb247XG4gICAgLy8gRGlkbid0IHRoaW5rIHdlIG5lZWRlZCB0aGlzIGJ1dCBpdCB0dXJucyBvdXQgdW5saWtlIG90aGVyIG1ldGhvZHMsIHBhdGNoXG4gICAgLy8gd29uJ3QgYmUgcHJvcGVybHkgbm9ybWFsaXplZCB0byB1cHBlcmNhc2UgYW5kIHJlc3VsdHMgaW4gYSA0MDUgZXJyb3IuXG4gICAgLy8gU2VlOiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tZXRob2RcbiAgICBpbml0Lm1ldGhvZCA9IGZvcm1NZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoZm9ybUVuY1R5cGUgPT09IFwiYXBwbGljYXRpb24vanNvblwiKSB7XG4gICAgICBpbml0LmhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IGZvcm1FbmNUeXBlXG4gICAgICB9KTtcbiAgICAgIGluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KHN1Ym1pc3Npb24uanNvbik7XG4gICAgfSBlbHNlIGlmIChmb3JtRW5jVHlwZSA9PT0gXCJ0ZXh0L3BsYWluXCIpIHtcbiAgICAgIC8vIENvbnRlbnQtVHlwZSBpcyBpbmZlcnJlZCAoaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yZXF1ZXN0KVxuICAgICAgaW5pdC5ib2R5ID0gc3VibWlzc2lvbi50ZXh0O1xuICAgIH0gZWxzZSBpZiAoZm9ybUVuY1R5cGUgPT09IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgJiYgc3VibWlzc2lvbi5mb3JtRGF0YSkge1xuICAgICAgLy8gQ29udGVudC1UeXBlIGlzIGluZmVycmVkIChodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlcXVlc3QpXG4gICAgICBpbml0LmJvZHkgPSBjb252ZXJ0Rm9ybURhdGFUb1NlYXJjaFBhcmFtcyhzdWJtaXNzaW9uLmZvcm1EYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udGVudC1UeXBlIGlzIGluZmVycmVkIChodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlcXVlc3QpXG4gICAgICBpbml0LmJvZHkgPSBzdWJtaXNzaW9uLmZvcm1EYXRhO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IFJlcXVlc3QodXJsLCBpbml0KTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRGb3JtRGF0YVRvU2VhcmNoUGFyYW1zKGZvcm1EYXRhKSB7XG4gIGxldCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpIHtcbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNjb252ZXJ0aW5nLWFuLWVudHJ5LWxpc3QtdG8tYS1saXN0LW9mLW5hbWUtdmFsdWUtcGFpcnNcbiAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS5uYW1lKTtcbiAgfVxuICByZXR1cm4gc2VhcmNoUGFyYW1zO1xufVxuZnVuY3Rpb24gY29udmVydFNlYXJjaFBhcmFtc1RvRm9ybURhdGEoc2VhcmNoUGFyYW1zKSB7XG4gIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2Ygc2VhcmNoUGFyYW1zLmVudHJpZXMoKSkge1xuICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gZm9ybURhdGE7XG59XG5mdW5jdGlvbiBwcm9jZXNzUm91dGVMb2FkZXJEYXRhKG1hdGNoZXMsIHJlc3VsdHMsIHBlbmRpbmdBY3Rpb25SZXN1bHQsIGFjdGl2ZURlZmVycmVkcywgc2tpcExvYWRlckVycm9yQnViYmxpbmcpIHtcbiAgLy8gRmlsbCBpbiBsb2FkZXJEYXRhL2Vycm9ycyBmcm9tIG91ciBsb2FkZXJzXG4gIGxldCBsb2FkZXJEYXRhID0ge307XG4gIGxldCBlcnJvcnMgPSBudWxsO1xuICBsZXQgc3RhdHVzQ29kZTtcbiAgbGV0IGZvdW5kRXJyb3IgPSBmYWxzZTtcbiAgbGV0IGxvYWRlckhlYWRlcnMgPSB7fTtcbiAgbGV0IHBlbmRpbmdFcnJvciA9IHBlbmRpbmdBY3Rpb25SZXN1bHQgJiYgaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSA/IHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0uZXJyb3IgOiB1bmRlZmluZWQ7XG4gIC8vIFByb2Nlc3MgbG9hZGVyIHJlc3VsdHMgaW50byBzdGF0ZS5sb2FkZXJEYXRhL3N0YXRlLmVycm9yc1xuICBtYXRjaGVzLmZvckVhY2gobWF0Y2ggPT4ge1xuICAgIGlmICghKG1hdGNoLnJvdXRlLmlkIGluIHJlc3VsdHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBpZCA9IG1hdGNoLnJvdXRlLmlkO1xuICAgIGxldCByZXN1bHQgPSByZXN1bHRzW2lkXTtcbiAgICBpbnZhcmlhbnQoIWlzUmVkaXJlY3RSZXN1bHQocmVzdWx0KSwgXCJDYW5ub3QgaGFuZGxlIHJlZGlyZWN0IHJlc3VsdHMgaW4gcHJvY2Vzc0xvYWRlckRhdGFcIik7XG4gICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgbGV0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHBlbmRpbmcgYWN0aW9uIGVycm9yLCB3ZSByZXBvcnQgaXQgYXQgdGhlIGhpZ2hlc3Qtcm91dGVcbiAgICAgIC8vIHRoYXQgdGhyb3dzIGEgbG9hZGVyIGVycm9yLCBhbmQgdGhlbiBjbGVhciBpdCBvdXQgdG8gaW5kaWNhdGUgdGhhdFxuICAgICAgLy8gaXQgd2FzIGNvbnN1bWVkXG4gICAgICBpZiAocGVuZGluZ0Vycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IgPSBwZW5kaW5nRXJyb3I7XG4gICAgICAgIHBlbmRpbmdFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGVycm9ycyA9IGVycm9ycyB8fCB7fTtcbiAgICAgIGlmIChza2lwTG9hZGVyRXJyb3JCdWJibGluZykge1xuICAgICAgICBlcnJvcnNbaWRdID0gZXJyb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMb29rIHVwd2FyZHMgZnJvbSB0aGUgbWF0Y2hlZCByb3V0ZSBmb3IgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgZXJyb3JcbiAgICAgICAgLy8gYm91bmRhcnksIGRlZmF1bHRpbmcgdG8gdGhlIHJvb3QgbWF0Y2guICBQcmVmZXIgaGlnaGVyIGVycm9yIHZhbHVlc1xuICAgICAgICAvLyBpZiBsb3dlciBlcnJvcnMgYnViYmxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5XG4gICAgICAgIGxldCBib3VuZGFyeU1hdGNoID0gZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCBpZCk7XG4gICAgICAgIGlmIChlcnJvcnNbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgIGVycm9yc1tib3VuZGFyeU1hdGNoLnJvdXRlLmlkXSA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDbGVhciBvdXIgYW55IHByaW9yIGxvYWRlckRhdGEgZm9yIHRoZSB0aHJvd2luZyByb3V0ZVxuICAgICAgbG9hZGVyRGF0YVtpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAvLyBPbmNlIHdlIGZpbmQgb3VyIGZpcnN0IChoaWdoZXN0KSBlcnJvciwgd2Ugc2V0IHRoZSBzdGF0dXMgY29kZSBhbmRcbiAgICAgIC8vIHByZXZlbnQgZGVlcGVyIHN0YXR1cyBjb2RlcyBmcm9tIG92ZXJyaWRpbmdcbiAgICAgIGlmICghZm91bmRFcnJvcikge1xuICAgICAgICBmb3VuZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgc3RhdHVzQ29kZSA9IGlzUm91dGVFcnJvclJlc3BvbnNlKHJlc3VsdC5lcnJvcikgPyByZXN1bHQuZXJyb3Iuc3RhdHVzIDogNTAwO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgIGxvYWRlckhlYWRlcnNbaWRdID0gcmVzdWx0LmhlYWRlcnM7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc0RlZmVycmVkUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgICAgYWN0aXZlRGVmZXJyZWRzLnNldChpZCwgcmVzdWx0LmRlZmVycmVkRGF0YSk7XG4gICAgICAgIGxvYWRlckRhdGFbaWRdID0gcmVzdWx0LmRlZmVycmVkRGF0YS5kYXRhO1xuICAgICAgICAvLyBFcnJvciBzdGF0dXMgY29kZXMgYWx3YXlzIG92ZXJyaWRlIHN1Y2Nlc3Mgc3RhdHVzIGNvZGVzLCBidXQgaWYgYWxsXG4gICAgICAgIC8vIGxvYWRlcnMgYXJlIHN1Y2Nlc3NmdWwgd2UgdGFrZSB0aGUgZGVlcGVzdCBzdGF0dXMgY29kZS5cbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXNDb2RlICE9IG51bGwgJiYgcmVzdWx0LnN0YXR1c0NvZGUgIT09IDIwMCAmJiAhZm91bmRFcnJvcikge1xuICAgICAgICAgIHN0YXR1c0NvZGUgPSByZXN1bHQuc3RhdHVzQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICBsb2FkZXJIZWFkZXJzW2lkXSA9IHJlc3VsdC5oZWFkZXJzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkZXJEYXRhW2lkXSA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAvLyBFcnJvciBzdGF0dXMgY29kZXMgYWx3YXlzIG92ZXJyaWRlIHN1Y2Nlc3Mgc3RhdHVzIGNvZGVzLCBidXQgaWYgYWxsXG4gICAgICAgIC8vIGxvYWRlcnMgYXJlIHN1Y2Nlc3NmdWwgd2UgdGFrZSB0aGUgZGVlcGVzdCBzdGF0dXMgY29kZS5cbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXNDb2RlICYmIHJlc3VsdC5zdGF0dXNDb2RlICE9PSAyMDAgJiYgIWZvdW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGF0dXNDb2RlID0gcmVzdWx0LnN0YXR1c0NvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgbG9hZGVySGVhZGVyc1tpZF0gPSByZXN1bHQuaGVhZGVycztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIC8vIElmIHdlIGRpZG4ndCBjb25zdW1lIHRoZSBwZW5kaW5nIGFjdGlvbiBlcnJvciAoaS5lLiwgYWxsIGxvYWRlcnNcbiAgLy8gcmVzb2x2ZWQpLCB0aGVuIGNvbnN1bWUgaXQgaGVyZS4gIEFsc28gY2xlYXIgb3V0IGFueSBsb2FkZXJEYXRhIGZvciB0aGVcbiAgLy8gdGhyb3dpbmcgcm91dGVcbiAgaWYgKHBlbmRpbmdFcnJvciAhPT0gdW5kZWZpbmVkICYmIHBlbmRpbmdBY3Rpb25SZXN1bHQpIHtcbiAgICBlcnJvcnMgPSB7XG4gICAgICBbcGVuZGluZ0FjdGlvblJlc3VsdFswXV06IHBlbmRpbmdFcnJvclxuICAgIH07XG4gICAgbG9hZGVyRGF0YVtwZW5kaW5nQWN0aW9uUmVzdWx0WzBdXSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4ge1xuICAgIGxvYWRlckRhdGEsXG4gICAgZXJyb3JzLFxuICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUgfHwgMjAwLFxuICAgIGxvYWRlckhlYWRlcnNcbiAgfTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NMb2FkZXJEYXRhKHN0YXRlLCBtYXRjaGVzLCBtYXRjaGVzVG9Mb2FkLCByZXN1bHRzLCBwZW5kaW5nQWN0aW9uUmVzdWx0LCByZXZhbGlkYXRpbmdGZXRjaGVycywgZmV0Y2hlclJlc3VsdHMsIGFjdGl2ZURlZmVycmVkcykge1xuICBsZXQge1xuICAgIGxvYWRlckRhdGEsXG4gICAgZXJyb3JzXG4gIH0gPSBwcm9jZXNzUm91dGVMb2FkZXJEYXRhKG1hdGNoZXMsIHJlc3VsdHMsIHBlbmRpbmdBY3Rpb25SZXN1bHQsIGFjdGl2ZURlZmVycmVkcywgZmFsc2UgLy8gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgY2xpZW50IHNpZGUgc28gd2UgYWx3YXlzIHdhbnQgdG8gYnViYmxlXG4gICk7XG4gIC8vIFByb2Nlc3MgcmVzdWx0cyBmcm9tIG91ciByZXZhbGlkYXRpbmcgZmV0Y2hlcnNcbiAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMuZm9yRWFjaChyZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGtleSxcbiAgICAgIG1hdGNoLFxuICAgICAgY29udHJvbGxlclxuICAgIH0gPSByZjtcbiAgICBsZXQgcmVzdWx0ID0gZmV0Y2hlclJlc3VsdHNba2V5XTtcbiAgICBpbnZhcmlhbnQocmVzdWx0LCBcIkRpZCBub3QgZmluZCBjb3JyZXNwb25kaW5nIGZldGNoZXIgcmVzdWx0XCIpO1xuICAgIC8vIFByb2Nlc3MgZmV0Y2hlciBub24tcmVkaXJlY3QgZXJyb3JzXG4gICAgaWYgKGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgYWJvcnRlZCBmZXRjaGVyc1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoaXNFcnJvclJlc3VsdChyZXN1bHQpKSB7XG4gICAgICBsZXQgYm91bmRhcnlNYXRjaCA9IGZpbmROZWFyZXN0Qm91bmRhcnkoc3RhdGUubWF0Y2hlcywgbWF0Y2ggPT0gbnVsbCA/IHZvaWQgMCA6IG1hdGNoLnJvdXRlLmlkKTtcbiAgICAgIGlmICghKGVycm9ycyAmJiBlcnJvcnNbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZF0pKSB7XG4gICAgICAgIGVycm9ycyA9IF9leHRlbmRzKHt9LCBlcnJvcnMsIHtcbiAgICAgICAgICBbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5lcnJvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmZldGNoZXJzLmRlbGV0ZShrZXkpO1xuICAgIH0gZWxzZSBpZiAoaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIHJlZGlyZWN0cyBzaG91bGQgZ2V0IHByb2Nlc3NlZCBhYm92ZSwgYnV0IHdlXG4gICAgICAvLyBrZWVwIHRoaXMgdG8gdHlwZSBuYXJyb3cgdG8gYSBzdWNjZXNzIHJlc3VsdCBpbiB0aGUgZWxzZVxuICAgICAgaW52YXJpYW50KGZhbHNlLCBcIlVuaGFuZGxlZCBmZXRjaGVyIHJldmFsaWRhdGlvbiByZWRpcmVjdFwiKTtcbiAgICB9IGVsc2UgaWYgKGlzRGVmZXJyZWRSZXN1bHQocmVzdWx0KSkge1xuICAgICAgLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlLCBkZWZlcnJlZCBkYXRhIHNob3VsZCBiZSBhd2FpdGVkIGZvciBmZXRjaGVyc1xuICAgICAgLy8gaW4gcmVzb2x2ZURlZmVycmVkUmVzdWx0c1xuICAgICAgaW52YXJpYW50KGZhbHNlLCBcIlVuaGFuZGxlZCBmZXRjaGVyIGRlZmVycmVkIGRhdGFcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkb25lRmV0Y2hlciA9IGdldERvbmVGZXRjaGVyKHJlc3VsdC5kYXRhKTtcbiAgICAgIHN0YXRlLmZldGNoZXJzLnNldChrZXksIGRvbmVGZXRjaGVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGxvYWRlckRhdGEsXG4gICAgZXJyb3JzXG4gIH07XG59XG5mdW5jdGlvbiBtZXJnZUxvYWRlckRhdGEobG9hZGVyRGF0YSwgbmV3TG9hZGVyRGF0YSwgbWF0Y2hlcywgZXJyb3JzKSB7XG4gIGxldCBtZXJnZWRMb2FkZXJEYXRhID0gX2V4dGVuZHMoe30sIG5ld0xvYWRlckRhdGEpO1xuICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgbGV0IGlkID0gbWF0Y2gucm91dGUuaWQ7XG4gICAgaWYgKG5ld0xvYWRlckRhdGEuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICBpZiAobmV3TG9hZGVyRGF0YVtpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXJnZWRMb2FkZXJEYXRhW2lkXSA9IG5ld0xvYWRlckRhdGFbaWRdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobG9hZGVyRGF0YVtpZF0gIT09IHVuZGVmaW5lZCAmJiBtYXRjaC5yb3V0ZS5sb2FkZXIpIHtcbiAgICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIGtleXMgbm90IGluY2x1ZGVkIGluIG5ld0xvYWRlckRhdGEgYW5kIHdoZXJlIGEgbG9hZGVyXG4gICAgICAvLyB3YXNuJ3QgcmVtb3ZlZCBieSBITVJcbiAgICAgIG1lcmdlZExvYWRlckRhdGFbaWRdID0gbG9hZGVyRGF0YVtpZF07XG4gICAgfVxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgLy8gRG9uJ3Qga2VlcCBhbnkgbG9hZGVyIGRhdGEgYmVsb3cgdGhlIGJvdW5kYXJ5XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZExvYWRlckRhdGE7XG59XG5mdW5jdGlvbiBnZXRBY3Rpb25EYXRhRm9yQ29tbWl0KHBlbmRpbmdBY3Rpb25SZXN1bHQpIHtcbiAgaWYgKCFwZW5kaW5nQWN0aW9uUmVzdWx0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiBpc0Vycm9yUmVzdWx0KHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0pID8ge1xuICAgIC8vIENsZWFyIG91dCBwcmlvciBhY3Rpb25EYXRhIG9uIGVycm9yc1xuICAgIGFjdGlvbkRhdGE6IHt9XG4gIH0gOiB7XG4gICAgYWN0aW9uRGF0YToge1xuICAgICAgW3BlbmRpbmdBY3Rpb25SZXN1bHRbMF1dOiBwZW5kaW5nQWN0aW9uUmVzdWx0WzFdLmRhdGFcbiAgICB9XG4gIH07XG59XG4vLyBGaW5kIHRoZSBuZWFyZXN0IGVycm9yIGJvdW5kYXJ5LCBsb29raW5nIHVwd2FyZHMgZnJvbSB0aGUgbGVhZiByb3V0ZSAob3IgdGhlXG4vLyByb3V0ZSBzcGVjaWZpZWQgYnkgcm91dGVJZCkgZm9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVycm9yIGJvdW5kYXJ5LFxuLy8gZGVmYXVsdGluZyB0byB0aGUgcm9vdCBtYXRjaFxuZnVuY3Rpb24gZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCByb3V0ZUlkKSB7XG4gIGxldCBlbGlnaWJsZU1hdGNoZXMgPSByb3V0ZUlkID8gbWF0Y2hlcy5zbGljZSgwLCBtYXRjaGVzLmZpbmRJbmRleChtID0+IG0ucm91dGUuaWQgPT09IHJvdXRlSWQpICsgMSkgOiBbLi4ubWF0Y2hlc107XG4gIHJldHVybiBlbGlnaWJsZU1hdGNoZXMucmV2ZXJzZSgpLmZpbmQobSA9PiBtLnJvdXRlLmhhc0Vycm9yQm91bmRhcnkgPT09IHRydWUpIHx8IG1hdGNoZXNbMF07XG59XG5mdW5jdGlvbiBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKHJvdXRlcykge1xuICAvLyBQcmVmZXIgYSByb290IGxheW91dCByb3V0ZSBpZiBwcmVzZW50LCBvdGhlcndpc2Ugc2hpbSBpbiBhIHJvdXRlIG9iamVjdFxuICBsZXQgcm91dGUgPSByb3V0ZXMubGVuZ3RoID09PSAxID8gcm91dGVzWzBdIDogcm91dGVzLmZpbmQociA9PiByLmluZGV4IHx8ICFyLnBhdGggfHwgci5wYXRoID09PSBcIi9cIikgfHwge1xuICAgIGlkOiBcIl9fc2hpbS1lcnJvci1yb3V0ZV9fXCJcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVzOiBbe1xuICAgICAgcGFyYW1zOiB7fSxcbiAgICAgIHBhdGhuYW1lOiBcIlwiLFxuICAgICAgcGF0aG5hbWVCYXNlOiBcIlwiLFxuICAgICAgcm91dGVcbiAgICB9XSxcbiAgICByb3V0ZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcihzdGF0dXMsIF90ZW1wNSkge1xuICBsZXQge1xuICAgIHBhdGhuYW1lLFxuICAgIHJvdXRlSWQsXG4gICAgbWV0aG9kLFxuICAgIHR5cGUsXG4gICAgbWVzc2FnZVxuICB9ID0gX3RlbXA1ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNTtcbiAgbGV0IHN0YXR1c1RleHQgPSBcIlVua25vd24gU2VydmVyIEVycm9yXCI7XG4gIGxldCBlcnJvck1lc3NhZ2UgPSBcIlVua25vd24gQHJlbWl4LXJ1bi9yb3V0ZXIgZXJyb3JcIjtcbiAgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiQmFkIFJlcXVlc3RcIjtcbiAgICBpZiAodHlwZSA9PT0gXCJyb3V0ZS1kaXNjb3ZlcnlcIikge1xuICAgICAgZXJyb3JNZXNzYWdlID0gXCJVbmFibGUgdG8gbWF0Y2ggVVJMIFxcXCJcIiArIHBhdGhuYW1lICsgXCJcXFwiIC0gdGhlIGB1bnN0YWJsZV9wYXRjaFJvdXRlc09uTmF2aWdhdGlvbigpYCBcIiArIChcImZ1bmN0aW9uIHRocmV3IHRoZSBmb2xsb3dpbmcgZXJyb3I6XFxuXCIgKyBtZXNzYWdlKTtcbiAgICB9IGVsc2UgaWYgKG1ldGhvZCAmJiBwYXRobmFtZSAmJiByb3V0ZUlkKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIllvdSBtYWRlIGEgXCIgKyBtZXRob2QgKyBcIiByZXF1ZXN0IHRvIFxcXCJcIiArIHBhdGhuYW1lICsgXCJcXFwiIGJ1dCBcIiArIChcImRpZCBub3QgcHJvdmlkZSBhIGBsb2FkZXJgIGZvciByb3V0ZSBcXFwiXCIgKyByb3V0ZUlkICsgXCJcXFwiLCBcIikgKyBcInNvIHRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUgdGhlIHJlcXVlc3QuXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImRlZmVyLWFjdGlvblwiKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcImRlZmVyKCkgaXMgbm90IHN1cHBvcnRlZCBpbiBhY3Rpb25zXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImludmFsaWQtYm9keVwiKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIlVuYWJsZSB0byBlbmNvZGUgc3VibWlzc2lvbiBib2R5XCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiRm9yYmlkZGVuXCI7XG4gICAgZXJyb3JNZXNzYWdlID0gXCJSb3V0ZSBcXFwiXCIgKyByb3V0ZUlkICsgXCJcXFwiIGRvZXMgbm90IG1hdGNoIFVSTCBcXFwiXCIgKyBwYXRobmFtZSArIFwiXFxcIlwiO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiTm90IEZvdW5kXCI7XG4gICAgZXJyb3JNZXNzYWdlID0gXCJObyByb3V0ZSBtYXRjaGVzIFVSTCBcXFwiXCIgKyBwYXRobmFtZSArIFwiXFxcIlwiO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA1KSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiTWV0aG9kIE5vdCBBbGxvd2VkXCI7XG4gICAgaWYgKG1ldGhvZCAmJiBwYXRobmFtZSAmJiByb3V0ZUlkKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIllvdSBtYWRlIGEgXCIgKyBtZXRob2QudG9VcHBlckNhc2UoKSArIFwiIHJlcXVlc3QgdG8gXFxcIlwiICsgcGF0aG5hbWUgKyBcIlxcXCIgYnV0IFwiICsgKFwiZGlkIG5vdCBwcm92aWRlIGFuIGBhY3Rpb25gIGZvciByb3V0ZSBcXFwiXCIgKyByb3V0ZUlkICsgXCJcXFwiLCBcIikgKyBcInNvIHRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUgdGhlIHJlcXVlc3QuXCI7XG4gICAgfSBlbHNlIGlmIChtZXRob2QpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IFwiSW52YWxpZCByZXF1ZXN0IG1ldGhvZCBcXFwiXCIgKyBtZXRob2QudG9VcHBlckNhc2UoKSArIFwiXFxcIlwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IEVycm9yUmVzcG9uc2VJbXBsKHN0YXR1cyB8fCA1MDAsIHN0YXR1c1RleHQsIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpLCB0cnVlKTtcbn1cbi8vIEZpbmQgYW55IHJldHVybmVkIHJlZGlyZWN0IGVycm9ycywgc3RhcnRpbmcgZnJvbSB0aGUgbG93ZXN0IG1hdGNoXG5mdW5jdGlvbiBmaW5kUmVkaXJlY3QocmVzdWx0cykge1xuICBsZXQgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHJlc3VsdHMpO1xuICBmb3IgKGxldCBpID0gZW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxldCBba2V5LCByZXN1bHRdID0gZW50cmllc1tpXTtcbiAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXksXG4gICAgICAgIHJlc3VsdFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHN0cmlwSGFzaEZyb21QYXRoKHBhdGgpIHtcbiAgbGV0IHBhcnNlZFBhdGggPSB0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aChwYXRoKSA6IHBhdGg7XG4gIHJldHVybiBjcmVhdGVQYXRoKF9leHRlbmRzKHt9LCBwYXJzZWRQYXRoLCB7XG4gICAgaGFzaDogXCJcIlxuICB9KSk7XG59XG5mdW5jdGlvbiBpc0hhc2hDaGFuZ2VPbmx5KGEsIGIpIHtcbiAgaWYgKGEucGF0aG5hbWUgIT09IGIucGF0aG5hbWUgfHwgYS5zZWFyY2ggIT09IGIuc2VhcmNoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhLmhhc2ggPT09IFwiXCIpIHtcbiAgICAvLyAvcGFnZSAtPiAvcGFnZSNoYXNoXG4gICAgcmV0dXJuIGIuaGFzaCAhPT0gXCJcIjtcbiAgfSBlbHNlIGlmIChhLmhhc2ggPT09IGIuaGFzaCkge1xuICAgIC8vIC9wYWdlI2hhc2ggLT4gL3BhZ2UjaGFzaFxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGIuaGFzaCAhPT0gXCJcIikge1xuICAgIC8vIC9wYWdlI2hhc2ggLT4gL3BhZ2Ujb3RoZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBJZiB0aGUgaGFzaCBpcyByZW1vdmVkIHRoZSBicm93c2VyIHdpbGwgcmUtcGVyZm9ybSBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlclxuICAvLyAvcGFnZSNoYXNoIC0+IC9wYWdlXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzUHJvbWlzZSh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgdmFsICE9IG51bGwgJiYgXCJ0aGVuXCIgaW4gdmFsO1xufVxuZnVuY3Rpb24gaXNEYXRhU3RyYXRlZ3lSZXN1bHQocmVzdWx0KSB7XG4gIHJldHVybiByZXN1bHQgIT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIFwidHlwZVwiIGluIHJlc3VsdCAmJiBcInJlc3VsdFwiIGluIHJlc3VsdCAmJiAocmVzdWx0LnR5cGUgPT09IFJlc3VsdFR5cGUuZGF0YSB8fCByZXN1bHQudHlwZSA9PT0gUmVzdWx0VHlwZS5lcnJvcik7XG59XG5mdW5jdGlvbiBpc1JlZGlyZWN0RGF0YVN0cmF0ZWd5UmVzdWx0UmVzdWx0KHJlc3VsdCkge1xuICByZXR1cm4gaXNSZXNwb25zZShyZXN1bHQucmVzdWx0KSAmJiByZWRpcmVjdFN0YXR1c0NvZGVzLmhhcyhyZXN1bHQucmVzdWx0LnN0YXR1cyk7XG59XG5mdW5jdGlvbiBpc0RlZmVycmVkUmVzdWx0KHJlc3VsdCkge1xuICByZXR1cm4gcmVzdWx0LnR5cGUgPT09IFJlc3VsdFR5cGUuZGVmZXJyZWQ7XG59XG5mdW5jdGlvbiBpc0Vycm9yUmVzdWx0KHJlc3VsdCkge1xuICByZXR1cm4gcmVzdWx0LnR5cGUgPT09IFJlc3VsdFR5cGUuZXJyb3I7XG59XG5mdW5jdGlvbiBpc1JlZGlyZWN0UmVzdWx0KHJlc3VsdCkge1xuICByZXR1cm4gKHJlc3VsdCAmJiByZXN1bHQudHlwZSkgPT09IFJlc3VsdFR5cGUucmVkaXJlY3Q7XG59XG5mdW5jdGlvbiBpc0RhdGFXaXRoUmVzcG9uc2VJbml0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiBcInR5cGVcIiBpbiB2YWx1ZSAmJiBcImRhdGFcIiBpbiB2YWx1ZSAmJiBcImluaXRcIiBpbiB2YWx1ZSAmJiB2YWx1ZS50eXBlID09PSBcIkRhdGFXaXRoUmVzcG9uc2VJbml0XCI7XG59XG5mdW5jdGlvbiBpc0RlZmVycmVkRGF0YSh2YWx1ZSkge1xuICBsZXQgZGVmZXJyZWQgPSB2YWx1ZTtcbiAgcmV0dXJuIGRlZmVycmVkICYmIHR5cGVvZiBkZWZlcnJlZCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZGVmZXJyZWQuZGF0YSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZGVmZXJyZWQuc3Vic2NyaWJlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGRlZmVycmVkLmNhbmNlbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBkZWZlcnJlZC5yZXNvbHZlRGF0YSA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUuc3RhdHVzID09PSBcIm51bWJlclwiICYmIHR5cGVvZiB2YWx1ZS5zdGF0dXNUZXh0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZS5oZWFkZXJzID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZS5ib2R5ICE9PSBcInVuZGVmaW5lZFwiO1xufVxuZnVuY3Rpb24gaXNSZWRpcmVjdFJlc3BvbnNlKHJlc3VsdCkge1xuICBpZiAoIWlzUmVzcG9uc2UocmVzdWx0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgc3RhdHVzID0gcmVzdWx0LnN0YXR1cztcbiAgbGV0IGxvY2F0aW9uID0gcmVzdWx0LmhlYWRlcnMuZ2V0KFwiTG9jYXRpb25cIik7XG4gIHJldHVybiBzdGF0dXMgPj0gMzAwICYmIHN0YXR1cyA8PSAzOTkgJiYgbG9jYXRpb24gIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRNZXRob2QobWV0aG9kKSB7XG4gIHJldHVybiB2YWxpZFJlcXVlc3RNZXRob2RzLmhhcyhtZXRob2QudG9Mb3dlckNhc2UoKSk7XG59XG5mdW5jdGlvbiBpc011dGF0aW9uTWV0aG9kKG1ldGhvZCkge1xuICByZXR1cm4gdmFsaWRNdXRhdGlvbk1ldGhvZHMuaGFzKG1ldGhvZC50b0xvd2VyQ2FzZSgpKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVOYXZpZ2F0aW9uRGVmZXJyZWRSZXN1bHRzKG1hdGNoZXMsIHJlc3VsdHMsIHNpZ25hbCwgY3VycmVudE1hdGNoZXMsIGN1cnJlbnRMb2FkZXJEYXRhKSB7XG4gIGxldCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMocmVzdWx0cyk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGxldCBbcm91dGVJZCwgcmVzdWx0XSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIGxldCBtYXRjaCA9IG1hdGNoZXMuZmluZChtID0+IChtID09IG51bGwgPyB2b2lkIDAgOiBtLnJvdXRlLmlkKSA9PT0gcm91dGVJZCk7XG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIG1hdGNoLCB0aGVuIHdlIGNhbiBoYXZlIGEgZGVmZXJyZWQgcmVzdWx0IHRvIGRvXG4gICAgLy8gYW55dGhpbmcgd2l0aC4gIFRoaXMgaXMgZm9yIHJldmFsaWRhdGluZyBmZXRjaGVycyB3aGVyZSB0aGUgcm91dGUgd2FzXG4gICAgLy8gcmVtb3ZlZCBkdXJpbmcgSE1SXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCBjdXJyZW50TWF0Y2ggPSBjdXJyZW50TWF0Y2hlcy5maW5kKG0gPT4gbS5yb3V0ZS5pZCA9PT0gbWF0Y2gucm91dGUuaWQpO1xuICAgIGxldCBpc1JldmFsaWRhdGluZ0xvYWRlciA9IGN1cnJlbnRNYXRjaCAhPSBudWxsICYmICFpc05ld1JvdXRlSW5zdGFuY2UoY3VycmVudE1hdGNoLCBtYXRjaCkgJiYgKGN1cnJlbnRMb2FkZXJEYXRhICYmIGN1cnJlbnRMb2FkZXJEYXRhW21hdGNoLnJvdXRlLmlkXSkgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNEZWZlcnJlZFJlc3VsdChyZXN1bHQpICYmIGlzUmV2YWxpZGF0aW5nTG9hZGVyKSB7XG4gICAgICAvLyBOb3RlOiB3ZSBkbyBub3QgaGF2ZSB0byB0b3VjaCBhY3RpdmVEZWZlcnJlZHMgaGVyZSBzaW5jZSB3ZSByYWNlIHRoZW1cbiAgICAgIC8vIGFnYWluc3QgdGhlIHNpZ25hbCBpbiByZXNvbHZlRGVmZXJyZWREYXRhIGFuZCB0aGV5J2xsIGdldCBhYm9ydGVkXG4gICAgICAvLyB0aGVyZSBpZiBuZWVkZWRcbiAgICAgIGF3YWl0IHJlc29sdmVEZWZlcnJlZERhdGEocmVzdWx0LCBzaWduYWwsIGZhbHNlKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHRzW3JvdXRlSWRdID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVGZXRjaGVyRGVmZXJyZWRSZXN1bHRzKG1hdGNoZXMsIHJlc3VsdHMsIHJldmFsaWRhdGluZ0ZldGNoZXJzKSB7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByZXZhbGlkYXRpbmdGZXRjaGVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBsZXQge1xuICAgICAga2V5LFxuICAgICAgcm91dGVJZCxcbiAgICAgIGNvbnRyb2xsZXJcbiAgICB9ID0gcmV2YWxpZGF0aW5nRmV0Y2hlcnNbaW5kZXhdO1xuICAgIGxldCByZXN1bHQgPSByZXN1bHRzW2tleV07XG4gICAgbGV0IG1hdGNoID0gbWF0Y2hlcy5maW5kKG0gPT4gKG0gPT0gbnVsbCA/IHZvaWQgMCA6IG0ucm91dGUuaWQpID09PSByb3V0ZUlkKTtcbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgbWF0Y2gsIHRoZW4gd2UgY2FuIGhhdmUgYSBkZWZlcnJlZCByZXN1bHQgdG8gZG9cbiAgICAvLyBhbnl0aGluZyB3aXRoLiAgVGhpcyBpcyBmb3IgcmV2YWxpZGF0aW5nIGZldGNoZXJzIHdoZXJlIHRoZSByb3V0ZSB3YXNcbiAgICAvLyByZW1vdmVkIGR1cmluZyBITVJcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGlzRGVmZXJyZWRSZXN1bHQocmVzdWx0KSkge1xuICAgICAgLy8gTm90ZTogd2UgZG8gbm90IGhhdmUgdG8gdG91Y2ggYWN0aXZlRGVmZXJyZWRzIGhlcmUgc2luY2Ugd2UgcmFjZSB0aGVtXG4gICAgICAvLyBhZ2FpbnN0IHRoZSBzaWduYWwgaW4gcmVzb2x2ZURlZmVycmVkRGF0YSBhbmQgdGhleSdsbCBnZXQgYWJvcnRlZFxuICAgICAgLy8gdGhlcmUgaWYgbmVlZGVkXG4gICAgICBpbnZhcmlhbnQoY29udHJvbGxlciwgXCJFeHBlY3RlZCBhbiBBYm9ydENvbnRyb2xsZXIgZm9yIHJldmFsaWRhdGluZyBmZXRjaGVyIGRlZmVycmVkIHJlc3VsdFwiKTtcbiAgICAgIGF3YWl0IHJlc29sdmVEZWZlcnJlZERhdGEocmVzdWx0LCBjb250cm9sbGVyLnNpZ25hbCwgdHJ1ZSkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmVzdWx0c1trZXldID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEZWZlcnJlZERhdGEocmVzdWx0LCBzaWduYWwsIHVud3JhcCkge1xuICBpZiAodW53cmFwID09PSB2b2lkIDApIHtcbiAgICB1bndyYXAgPSBmYWxzZTtcbiAgfVxuICBsZXQgYWJvcnRlZCA9IGF3YWl0IHJlc3VsdC5kZWZlcnJlZERhdGEucmVzb2x2ZURhdGEoc2lnbmFsKTtcbiAgaWYgKGFib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHVud3JhcCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBSZXN1bHRUeXBlLmRhdGEsXG4gICAgICAgIGRhdGE6IHJlc3VsdC5kZWZlcnJlZERhdGEudW53cmFwcGVkRGF0YVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBIYW5kbGUgYW55IFRyYWNrZWRQcm9taXNlLl9lcnJvciB2YWx1ZXMgZW5jb3VudGVyZWQgd2hpbGUgdW53cmFwcGluZ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgICAgZXJyb3I6IGVcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogUmVzdWx0VHlwZS5kYXRhLFxuICAgIGRhdGE6IHJlc3VsdC5kZWZlcnJlZERhdGEuZGF0YVxuICB9O1xufVxuZnVuY3Rpb24gaGFzTmFrZWRJbmRleFF1ZXJ5KHNlYXJjaCkge1xuICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyhzZWFyY2gpLmdldEFsbChcImluZGV4XCIpLnNvbWUodiA9PiB2ID09PSBcIlwiKTtcbn1cbmZ1bmN0aW9uIGdldFRhcmdldE1hdGNoKG1hdGNoZXMsIGxvY2F0aW9uKSB7XG4gIGxldCBzZWFyY2ggPSB0eXBlb2YgbG9jYXRpb24gPT09IFwic3RyaW5nXCIgPyBwYXJzZVBhdGgobG9jYXRpb24pLnNlYXJjaCA6IGxvY2F0aW9uLnNlYXJjaDtcbiAgaWYgKG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXS5yb3V0ZS5pbmRleCAmJiBoYXNOYWtlZEluZGV4UXVlcnkoc2VhcmNoIHx8IFwiXCIpKSB7XG4gICAgLy8gUmV0dXJuIHRoZSBsZWFmIGluZGV4IHJvdXRlIHdoZW4gaW5kZXggaXMgcHJlc2VudFxuICAgIHJldHVybiBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV07XG4gIH1cbiAgLy8gT3RoZXJ3aXNlIGdyYWIgdGhlIGRlZXBlc3QgXCJwYXRoIGNvbnRyaWJ1dGluZ1wiIG1hdGNoIChpZ25vcmluZyBpbmRleCBhbmRcbiAgLy8gcGF0aGxlc3MgbGF5b3V0IHJvdXRlcylcbiAgbGV0IHBhdGhNYXRjaGVzID0gZ2V0UGF0aENvbnRyaWJ1dGluZ01hdGNoZXMobWF0Y2hlcyk7XG4gIHJldHVybiBwYXRoTWF0Y2hlc1twYXRoTWF0Y2hlcy5sZW5ndGggLSAxXTtcbn1cbmZ1bmN0aW9uIGdldFN1Ym1pc3Npb25Gcm9tTmF2aWdhdGlvbihuYXZpZ2F0aW9uKSB7XG4gIGxldCB7XG4gICAgZm9ybU1ldGhvZCxcbiAgICBmb3JtQWN0aW9uLFxuICAgIGZvcm1FbmNUeXBlLFxuICAgIHRleHQsXG4gICAgZm9ybURhdGEsXG4gICAganNvblxuICB9ID0gbmF2aWdhdGlvbjtcbiAgaWYgKCFmb3JtTWV0aG9kIHx8ICFmb3JtQWN0aW9uIHx8ICFmb3JtRW5jVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGV4dCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1NZXRob2QsXG4gICAgICBmb3JtQWN0aW9uLFxuICAgICAgZm9ybUVuY1R5cGUsXG4gICAgICBmb3JtRGF0YTogdW5kZWZpbmVkLFxuICAgICAganNvbjogdW5kZWZpbmVkLFxuICAgICAgdGV4dFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZm9ybURhdGEgIT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtTWV0aG9kLFxuICAgICAgZm9ybUFjdGlvbixcbiAgICAgIGZvcm1FbmNUeXBlLFxuICAgICAgZm9ybURhdGEsXG4gICAgICBqc29uOiB1bmRlZmluZWQsXG4gICAgICB0ZXh0OiB1bmRlZmluZWRcbiAgICB9O1xuICB9IGVsc2UgaWYgKGpzb24gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtTWV0aG9kLFxuICAgICAgZm9ybUFjdGlvbixcbiAgICAgIGZvcm1FbmNUeXBlLFxuICAgICAgZm9ybURhdGE6IHVuZGVmaW5lZCxcbiAgICAgIGpzb24sXG4gICAgICB0ZXh0OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRMb2FkaW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgc3VibWlzc2lvbikge1xuICBpZiAoc3VibWlzc2lvbikge1xuICAgIGxldCBuYXZpZ2F0aW9uID0ge1xuICAgICAgc3RhdGU6IFwibG9hZGluZ1wiLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBmb3JtTWV0aG9kOiBzdWJtaXNzaW9uLmZvcm1NZXRob2QsXG4gICAgICBmb3JtQWN0aW9uOiBzdWJtaXNzaW9uLmZvcm1BY3Rpb24sXG4gICAgICBmb3JtRW5jVHlwZTogc3VibWlzc2lvbi5mb3JtRW5jVHlwZSxcbiAgICAgIGZvcm1EYXRhOiBzdWJtaXNzaW9uLmZvcm1EYXRhLFxuICAgICAganNvbjogc3VibWlzc2lvbi5qc29uLFxuICAgICAgdGV4dDogc3VibWlzc2lvbi50ZXh0XG4gICAgfTtcbiAgICByZXR1cm4gbmF2aWdhdGlvbjtcbiAgfSBlbHNlIHtcbiAgICBsZXQgbmF2aWdhdGlvbiA9IHtcbiAgICAgIHN0YXRlOiBcImxvYWRpbmdcIixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgZm9ybU1ldGhvZDogdW5kZWZpbmVkLFxuICAgICAgZm9ybUFjdGlvbjogdW5kZWZpbmVkLFxuICAgICAgZm9ybUVuY1R5cGU6IHVuZGVmaW5lZCxcbiAgICAgIGZvcm1EYXRhOiB1bmRlZmluZWQsXG4gICAgICBqc29uOiB1bmRlZmluZWQsXG4gICAgICB0ZXh0OiB1bmRlZmluZWRcbiAgICB9O1xuICAgIHJldHVybiBuYXZpZ2F0aW9uO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTdWJtaXR0aW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgc3VibWlzc2lvbikge1xuICBsZXQgbmF2aWdhdGlvbiA9IHtcbiAgICBzdGF0ZTogXCJzdWJtaXR0aW5nXCIsXG4gICAgbG9jYXRpb24sXG4gICAgZm9ybU1ldGhvZDogc3VibWlzc2lvbi5mb3JtTWV0aG9kLFxuICAgIGZvcm1BY3Rpb246IHN1Ym1pc3Npb24uZm9ybUFjdGlvbixcbiAgICBmb3JtRW5jVHlwZTogc3VibWlzc2lvbi5mb3JtRW5jVHlwZSxcbiAgICBmb3JtRGF0YTogc3VibWlzc2lvbi5mb3JtRGF0YSxcbiAgICBqc29uOiBzdWJtaXNzaW9uLmpzb24sXG4gICAgdGV4dDogc3VibWlzc2lvbi50ZXh0XG4gIH07XG4gIHJldHVybiBuYXZpZ2F0aW9uO1xufVxuZnVuY3Rpb24gZ2V0TG9hZGluZ0ZldGNoZXIoc3VibWlzc2lvbiwgZGF0YSkge1xuICBpZiAoc3VibWlzc2lvbikge1xuICAgIGxldCBmZXRjaGVyID0ge1xuICAgICAgc3RhdGU6IFwibG9hZGluZ1wiLFxuICAgICAgZm9ybU1ldGhvZDogc3VibWlzc2lvbi5mb3JtTWV0aG9kLFxuICAgICAgZm9ybUFjdGlvbjogc3VibWlzc2lvbi5mb3JtQWN0aW9uLFxuICAgICAgZm9ybUVuY1R5cGU6IHN1Ym1pc3Npb24uZm9ybUVuY1R5cGUsXG4gICAgICBmb3JtRGF0YTogc3VibWlzc2lvbi5mb3JtRGF0YSxcbiAgICAgIGpzb246IHN1Ym1pc3Npb24uanNvbixcbiAgICAgIHRleHQ6IHN1Ym1pc3Npb24udGV4dCxcbiAgICAgIGRhdGFcbiAgICB9O1xuICAgIHJldHVybiBmZXRjaGVyO1xuICB9IGVsc2Uge1xuICAgIGxldCBmZXRjaGVyID0ge1xuICAgICAgc3RhdGU6IFwibG9hZGluZ1wiLFxuICAgICAgZm9ybU1ldGhvZDogdW5kZWZpbmVkLFxuICAgICAgZm9ybUFjdGlvbjogdW5kZWZpbmVkLFxuICAgICAgZm9ybUVuY1R5cGU6IHVuZGVmaW5lZCxcbiAgICAgIGZvcm1EYXRhOiB1bmRlZmluZWQsXG4gICAgICBqc29uOiB1bmRlZmluZWQsXG4gICAgICB0ZXh0OiB1bmRlZmluZWQsXG4gICAgICBkYXRhXG4gICAgfTtcbiAgICByZXR1cm4gZmV0Y2hlcjtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VibWl0dGluZ0ZldGNoZXIoc3VibWlzc2lvbiwgZXhpc3RpbmdGZXRjaGVyKSB7XG4gIGxldCBmZXRjaGVyID0ge1xuICAgIHN0YXRlOiBcInN1Ym1pdHRpbmdcIixcbiAgICBmb3JtTWV0aG9kOiBzdWJtaXNzaW9uLmZvcm1NZXRob2QsXG4gICAgZm9ybUFjdGlvbjogc3VibWlzc2lvbi5mb3JtQWN0aW9uLFxuICAgIGZvcm1FbmNUeXBlOiBzdWJtaXNzaW9uLmZvcm1FbmNUeXBlLFxuICAgIGZvcm1EYXRhOiBzdWJtaXNzaW9uLmZvcm1EYXRhLFxuICAgIGpzb246IHN1Ym1pc3Npb24uanNvbixcbiAgICB0ZXh0OiBzdWJtaXNzaW9uLnRleHQsXG4gICAgZGF0YTogZXhpc3RpbmdGZXRjaGVyID8gZXhpc3RpbmdGZXRjaGVyLmRhdGEgOiB1bmRlZmluZWRcbiAgfTtcbiAgcmV0dXJuIGZldGNoZXI7XG59XG5mdW5jdGlvbiBnZXREb25lRmV0Y2hlcihkYXRhKSB7XG4gIGxldCBmZXRjaGVyID0ge1xuICAgIHN0YXRlOiBcImlkbGVcIixcbiAgICBmb3JtTWV0aG9kOiB1bmRlZmluZWQsXG4gICAgZm9ybUFjdGlvbjogdW5kZWZpbmVkLFxuICAgIGZvcm1FbmNUeXBlOiB1bmRlZmluZWQsXG4gICAgZm9ybURhdGE6IHVuZGVmaW5lZCxcbiAgICBqc29uOiB1bmRlZmluZWQsXG4gICAgdGV4dDogdW5kZWZpbmVkLFxuICAgIGRhdGFcbiAgfTtcbiAgcmV0dXJuIGZldGNoZXI7XG59XG5mdW5jdGlvbiByZXN0b3JlQXBwbGllZFRyYW5zaXRpb25zKF93aW5kb3csIHRyYW5zaXRpb25zKSB7XG4gIHRyeSB7XG4gICAgbGV0IHNlc3Npb25Qb3NpdGlvbnMgPSBfd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oVFJBTlNJVElPTlNfU1RPUkFHRV9LRVkpO1xuICAgIGlmIChzZXNzaW9uUG9zaXRpb25zKSB7XG4gICAgICBsZXQganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblBvc2l0aW9ucyk7XG4gICAgICBmb3IgKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoanNvbiB8fCB7fSkpIHtcbiAgICAgICAgaWYgKHYgJiYgQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICAgIHRyYW5zaXRpb25zLnNldChrLCBuZXcgU2V0KHYgfHwgW10pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIG5vLW9wLCB1c2UgZGVmYXVsdCBlbXB0eSBvYmplY3RcbiAgfVxufVxuZnVuY3Rpb24gcGVyc2lzdEFwcGxpZWRUcmFuc2l0aW9ucyhfd2luZG93LCB0cmFuc2l0aW9ucykge1xuICBpZiAodHJhbnNpdGlvbnMuc2l6ZSA+IDApIHtcbiAgICBsZXQganNvbiA9IHt9O1xuICAgIGZvciAobGV0IFtrLCB2XSBvZiB0cmFuc2l0aW9ucykge1xuICAgICAganNvbltrXSA9IFsuLi52XTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIF93aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShUUkFOU0lUSU9OU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoanNvbikpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB3YXJuaW5nKGZhbHNlLCBcIkZhaWxlZCB0byBzYXZlIGFwcGxpZWQgdmlldyB0cmFuc2l0aW9ucyBpbiBzZXNzaW9uU3RvcmFnZSAoXCIgKyBlcnJvciArIFwiKS5cIik7XG4gICAgfVxuICB9XG59XG4vLyNlbmRyZWdpb25cblxuZXhwb3J0IHsgQWJvcnRlZERlZmVycmVkRXJyb3IsIEFjdGlvbiwgSURMRV9CTE9DS0VSLCBJRExFX0ZFVENIRVIsIElETEVfTkFWSUdBVElPTiwgVU5TQUZFX0RFRkVSUkVEX1NZTUJPTCwgRGVmZXJyZWREYXRhIGFzIFVOU0FGRV9EZWZlcnJlZERhdGEsIEVycm9yUmVzcG9uc2VJbXBsIGFzIFVOU0FGRV9FcnJvclJlc3BvbnNlSW1wbCwgY29udmVydFJvdXRlTWF0Y2hUb1VpTWF0Y2ggYXMgVU5TQUZFX2NvbnZlcnRSb3V0ZU1hdGNoVG9VaU1hdGNoLCBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzIGFzIFVOU0FGRV9jb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzLCBkZWNvZGVQYXRoIGFzIFVOU0FGRV9kZWNvZGVQYXRoLCBnZXRSZXNvbHZlVG9NYXRjaGVzIGFzIFVOU0FGRV9nZXRSZXNvbHZlVG9NYXRjaGVzLCBpbnZhcmlhbnQgYXMgVU5TQUZFX2ludmFyaWFudCwgd2FybmluZyBhcyBVTlNBRkVfd2FybmluZywgY3JlYXRlQnJvd3Nlckhpc3RvcnksIGNyZWF0ZUhhc2hIaXN0b3J5LCBjcmVhdGVNZW1vcnlIaXN0b3J5LCBjcmVhdGVQYXRoLCBjcmVhdGVSb3V0ZXIsIGNyZWF0ZVN0YXRpY0hhbmRsZXIsIGRlZmVyLCBnZW5lcmF0ZVBhdGgsIGdldFN0YXRpY0NvbnRleHRGcm9tRXJyb3IsIGdldFRvUGF0aG5hbWUsIGlzRGF0YVdpdGhSZXNwb25zZUluaXQsIGlzRGVmZXJyZWREYXRhLCBpc1JvdXRlRXJyb3JSZXNwb25zZSwgam9pblBhdGhzLCBqc29uLCBtYXRjaFBhdGgsIG1hdGNoUm91dGVzLCBub3JtYWxpemVQYXRobmFtZSwgcGFyc2VQYXRoLCByZWRpcmVjdCwgcmVkaXJlY3REb2N1bWVudCwgcmVwbGFjZSwgcmVzb2x2ZVBhdGgsIHJlc29sdmVUbywgc3RyaXBCYXNlbmFtZSwgZGF0YSBhcyB1bnN0YWJsZV9kYXRhIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yb3V0ZXIuanMubWFwXG4iLCIvKipcbiAqIFJlYWN0IFJvdXRlciB2Ni4yNi4yXG4gKlxuICogQ29weXJpZ2h0IChjKSBSZW1peCBTb2Z0d2FyZSBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFLm1kIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFVOU0FGRV9pbnZhcmlhbnQsIGpvaW5QYXRocywgbWF0Y2hQYXRoLCBVTlNBRkVfZGVjb2RlUGF0aCwgVU5TQUZFX2dldFJlc29sdmVUb01hdGNoZXMsIFVOU0FGRV93YXJuaW5nLCByZXNvbHZlVG8sIHBhcnNlUGF0aCwgbWF0Y2hSb3V0ZXMsIEFjdGlvbiwgVU5TQUZFX2NvbnZlcnRSb3V0ZU1hdGNoVG9VaU1hdGNoLCBzdHJpcEJhc2VuYW1lLCBJRExFX0JMT0NLRVIsIGlzUm91dGVFcnJvclJlc3BvbnNlLCBjcmVhdGVNZW1vcnlIaXN0b3J5LCBBYm9ydGVkRGVmZXJyZWRFcnJvciwgY3JlYXRlUm91dGVyIH0gZnJvbSAnQHJlbWl4LXJ1bi9yb3V0ZXInO1xuZXhwb3J0IHsgQWJvcnRlZERlZmVycmVkRXJyb3IsIEFjdGlvbiBhcyBOYXZpZ2F0aW9uVHlwZSwgY3JlYXRlUGF0aCwgZGVmZXIsIGdlbmVyYXRlUGF0aCwgaXNSb3V0ZUVycm9yUmVzcG9uc2UsIGpzb24sIG1hdGNoUGF0aCwgbWF0Y2hSb3V0ZXMsIHBhcnNlUGF0aCwgcmVkaXJlY3QsIHJlZGlyZWN0RG9jdW1lbnQsIHJlcGxhY2UsIHJlc29sdmVQYXRoIH0gZnJvbSAnQHJlbWl4LXJ1bi9yb3V0ZXInO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuLy8gQ3JlYXRlIHJlYWN0LXNwZWNpZmljIHR5cGVzIGZyb20gdGhlIGFnbm9zdGljIHR5cGVzIGluIEByZW1peC1ydW4vcm91dGVyIHRvXG4vLyBleHBvcnQgZnJvbSByZWFjdC1yb3V0ZXJcbmNvbnN0IERhdGFSb3V0ZXJDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIERhdGFSb3V0ZXJDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJEYXRhUm91dGVyXCI7XG59XG5jb25zdCBEYXRhUm91dGVyU3RhdGVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkRhdGFSb3V0ZXJTdGF0ZVwiO1xufVxuY29uc3QgQXdhaXRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIEF3YWl0Q29udGV4dC5kaXNwbGF5TmFtZSA9IFwiQXdhaXRcIjtcbn1cblxuLyoqXG4gKiBBIE5hdmlnYXRvciBpcyBhIFwibG9jYXRpb24gY2hhbmdlclwiOyBpdCdzIGhvdyB5b3UgZ2V0IHRvIGRpZmZlcmVudCBsb2NhdGlvbnMuXG4gKlxuICogRXZlcnkgaGlzdG9yeSBpbnN0YW5jZSBjb25mb3JtcyB0byB0aGUgTmF2aWdhdG9yIGludGVyZmFjZSwgYnV0IHRoZVxuICogZGlzdGluY3Rpb24gaXMgdXNlZnVsIHByaW1hcmlseSB3aGVuIGl0IGNvbWVzIHRvIHRoZSBsb3ctbGV2ZWwgYDxSb3V0ZXI+YCBBUElcbiAqIHdoZXJlIGJvdGggdGhlIGxvY2F0aW9uIGFuZCBhIG5hdmlnYXRvciBtdXN0IGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgaW4gb3JkZXJcbiAqIHRvIGF2b2lkIFwidGVhcmluZ1wiIHRoYXQgbWF5IG9jY3VyIGluIGEgc3VzcGVuc2UtZW5hYmxlZCBhcHAgaWYgdGhlIGFjdGlvblxuICogYW5kL29yIGxvY2F0aW9uIHdlcmUgdG8gYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBoaXN0b3J5IGluc3RhbmNlLlxuICovXG5cbmNvbnN0IE5hdmlnYXRpb25Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIE5hdmlnYXRpb25Db250ZXh0LmRpc3BsYXlOYW1lID0gXCJOYXZpZ2F0aW9uXCI7XG59XG5jb25zdCBMb2NhdGlvbkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgTG9jYXRpb25Db250ZXh0LmRpc3BsYXlOYW1lID0gXCJMb2NhdGlvblwiO1xufVxuY29uc3QgUm91dGVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBvdXRsZXQ6IG51bGwsXG4gIG1hdGNoZXM6IFtdLFxuICBpc0RhdGFSb3V0ZTogZmFsc2Vcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBSb3V0ZUNvbnRleHQuZGlzcGxheU5hbWUgPSBcIlJvdXRlXCI7XG59XG5jb25zdCBSb3V0ZUVycm9yQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBSb3V0ZUVycm9yQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiUm91dGVFcnJvclwiO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZ1bGwgaHJlZiBmb3IgdGhlIGdpdmVuIFwidG9cIiB2YWx1ZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nXG4gKiBjdXN0b20gbGlua3MgdGhhdCBhcmUgYWxzbyBhY2Nlc3NpYmxlIGFuZCBwcmVzZXJ2ZSByaWdodC1jbGljayBiZWhhdmlvci5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1ocmVmXG4gKi9cbmZ1bmN0aW9uIHVzZUhyZWYodG8sIF90ZW1wKSB7XG4gIGxldCB7XG4gICAgcmVsYXRpdmVcbiAgfSA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wO1xuICAhdXNlSW5Sb3V0ZXJDb250ZXh0KCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCAvLyBUT0RPOiBUaGlzIGVycm9yIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhleSBzb21laG93IGhhdmUgMiB2ZXJzaW9ucyBvZiB0aGVcbiAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICBcInVzZUhyZWYoKSBtYXkgYmUgdXNlZCBvbmx5IGluIHRoZSBjb250ZXh0IG9mIGEgPFJvdXRlcj4gY29tcG9uZW50LlwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBsZXQge1xuICAgIGJhc2VuYW1lLFxuICAgIG5hdmlnYXRvclxuICB9ID0gUmVhY3QudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCB7XG4gICAgaGFzaCxcbiAgICBwYXRobmFtZSxcbiAgICBzZWFyY2hcbiAgfSA9IHVzZVJlc29sdmVkUGF0aCh0bywge1xuICAgIHJlbGF0aXZlXG4gIH0pO1xuICBsZXQgam9pbmVkUGF0aG5hbWUgPSBwYXRobmFtZTtcblxuICAvLyBJZiB3ZSdyZSBvcGVyYXRpbmcgd2l0aGluIGEgYmFzZW5hbWUsIHByZXBlbmQgaXQgdG8gdGhlIHBhdGhuYW1lIHByaW9yXG4gIC8vIHRvIGNyZWF0aW5nIHRoZSBocmVmLiAgSWYgdGhpcyBpcyBhIHJvb3QgbmF2aWdhdGlvbiwgdGhlbiBqdXN0IHVzZSB0aGUgcmF3XG4gIC8vIGJhc2VuYW1lIHdoaWNoIGFsbG93cyB0aGUgYmFzZW5hbWUgdG8gaGF2ZSBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgcHJlc2VuY2VcbiAgLy8gb2YgYSB0cmFpbGluZyBzbGFzaCBvbiByb290IGxpbmtzXG4gIGlmIChiYXNlbmFtZSAhPT0gXCIvXCIpIHtcbiAgICBqb2luZWRQYXRobmFtZSA9IHBhdGhuYW1lID09PSBcIi9cIiA/IGJhc2VuYW1lIDogam9pblBhdGhzKFtiYXNlbmFtZSwgcGF0aG5hbWVdKTtcbiAgfVxuICByZXR1cm4gbmF2aWdhdG9yLmNyZWF0ZUhyZWYoe1xuICAgIHBhdGhuYW1lOiBqb2luZWRQYXRobmFtZSxcbiAgICBzZWFyY2gsXG4gICAgaGFzaFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaXMgYSBkZXNjZW5kYW50IG9mIGEgYDxSb3V0ZXI+YC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1pbi1yb3V0ZXItY29udGV4dFxuICovXG5mdW5jdGlvbiB1c2VJblJvdXRlckNvbnRleHQoKSB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KExvY2F0aW9uQ29udGV4dCkgIT0gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9iamVjdCwgd2hpY2ggcmVwcmVzZW50cyB0aGUgY3VycmVudCBVUkwgaW4gd2ViXG4gKiBicm93c2Vycy5cbiAqXG4gKiBOb3RlOiBJZiB5b3UncmUgdXNpbmcgdGhpcyBpdCBtYXkgbWVhbiB5b3UncmUgZG9pbmcgc29tZSBvZiB5b3VyIG93blxuICogXCJyb3V0aW5nXCIgaW4geW91ciBhcHAsIGFuZCB3ZSdkIGxpa2UgdG8ga25vdyB3aGF0IHlvdXIgdXNlIGNhc2UgaXMuIFdlIG1heVxuICogYmUgYWJsZSB0byBwcm92aWRlIHNvbWV0aGluZyBoaWdoZXItbGV2ZWwgdG8gYmV0dGVyIHN1aXQgeW91ciBuZWVkcy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1sb2NhdGlvblxuICovXG5mdW5jdGlvbiB1c2VMb2NhdGlvbigpIHtcbiAgIXVzZUluUm91dGVyQ29udGV4dCgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgLy8gVE9ETzogVGhpcyBlcnJvciBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZXkgc29tZWhvdyBoYXZlIDIgdmVyc2lvbnMgb2YgdGhlXG4gIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgXCJ1c2VMb2NhdGlvbigpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KExvY2F0aW9uQ29udGV4dCkubG9jYXRpb247XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIGFjdGlvbiB3aGljaCBkZXNjcmliZXMgaG93IHRoZSByb3V0ZXIgY2FtZSB0b1xuICogdGhlIGN1cnJlbnQgbG9jYXRpb24sIGVpdGhlciBieSBhIHBvcCwgcHVzaCwgb3IgcmVwbGFjZSBvbiB0aGUgaGlzdG9yeSBzdGFjay5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1uYXZpZ2F0aW9uLXR5cGVcbiAqL1xuZnVuY3Rpb24gdXNlTmF2aWdhdGlvblR5cGUoKSB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KExvY2F0aW9uQ29udGV4dCkubmF2aWdhdGlvblR5cGU7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIFBhdGhNYXRjaCBvYmplY3QgaWYgdGhlIGdpdmVuIHBhdHRlcm4gbWF0Y2hlcyB0aGUgY3VycmVudCBVUkwuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY29tcG9uZW50cyB0aGF0IG5lZWQgdG8ga25vdyBcImFjdGl2ZVwiIHN0YXRlLCBlLmcuXG4gKiBgPE5hdkxpbms+YC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1tYXRjaFxuICovXG5mdW5jdGlvbiB1c2VNYXRjaChwYXR0ZXJuKSB7XG4gICF1c2VJblJvdXRlckNvbnRleHQoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAvLyByb3V0ZXIgbG9hZGVkLiBXZSBjYW4gaGVscCB0aGVtIHVuZGVyc3RhbmQgaG93IHRvIGF2b2lkIHRoYXQuXG4gIFwidXNlTWF0Y2goKSBtYXkgYmUgdXNlZCBvbmx5IGluIHRoZSBjb250ZXh0IG9mIGEgPFJvdXRlcj4gY29tcG9uZW50LlwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBsZXQge1xuICAgIHBhdGhuYW1lXG4gIH0gPSB1c2VMb2NhdGlvbigpO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBtYXRjaFBhdGgocGF0dGVybiwgVU5TQUZFX2RlY29kZVBhdGgocGF0aG5hbWUpKSwgW3BhdGhuYW1lLCBwYXR0ZXJuXSk7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIG5hdmlnYXRlKCkgZnVuY3Rpb24gcmV0dXJuZWQgZnJvbSB1c2VOYXZpZ2F0ZSgpLlxuICovXG5cbmNvbnN0IG5hdmlnYXRlRWZmZWN0V2FybmluZyA9IFwiWW91IHNob3VsZCBjYWxsIG5hdmlnYXRlKCkgaW4gYSBSZWFjdC51c2VFZmZlY3QoKSwgbm90IHdoZW4gXCIgKyBcInlvdXIgY29tcG9uZW50IGlzIGZpcnN0IHJlbmRlcmVkLlwiO1xuXG4vLyBNdXRlIHdhcm5pbmdzIGZvciBjYWxscyB0byB1c2VOYXZpZ2F0ZSBpbiBTU1IgZW52aXJvbm1lbnRzXG5mdW5jdGlvbiB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGNiKSB7XG4gIGxldCBpc1N0YXRpYyA9IFJlYWN0LnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpLnN0YXRpYztcbiAgaWYgKCFpc1N0YXRpYykge1xuICAgIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIGdldCByaWQgb2YgdGhpcyBvbmNlIHJlYWN0IDE4LjMgaXMgcmVsZWFzZWRcbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzI2Mzk1XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzXG4gICAgUmVhY3QudXNlTGF5b3V0RWZmZWN0KGNiKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gaW1wZXJhdGl2ZSBtZXRob2QgZm9yIGNoYW5naW5nIHRoZSBsb2NhdGlvbi4gVXNlZCBieSBgPExpbms+YHMsIGJ1dFxuICogbWF5IGFsc28gYmUgdXNlZCBieSBvdGhlciBlbGVtZW50cyB0byBjaGFuZ2UgdGhlIGxvY2F0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLW5hdmlnYXRlXG4gKi9cbmZ1bmN0aW9uIHVzZU5hdmlnYXRlKCkge1xuICBsZXQge1xuICAgIGlzRGF0YVJvdXRlXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIC8vIENvbmRpdGlvbmFsIHVzYWdlIGlzIE9LIGhlcmUgYmVjYXVzZSB0aGUgdXNhZ2Ugb2YgYSBkYXRhIHJvdXRlciBpcyBzdGF0aWNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzXG4gIHJldHVybiBpc0RhdGFSb3V0ZSA/IHVzZU5hdmlnYXRlU3RhYmxlKCkgOiB1c2VOYXZpZ2F0ZVVuc3RhYmxlKCk7XG59XG5mdW5jdGlvbiB1c2VOYXZpZ2F0ZVVuc3RhYmxlKCkge1xuICAhdXNlSW5Sb3V0ZXJDb250ZXh0KCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCAvLyBUT0RPOiBUaGlzIGVycm9yIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhleSBzb21laG93IGhhdmUgMiB2ZXJzaW9ucyBvZiB0aGVcbiAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICBcInVzZU5hdmlnYXRlKCkgbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgbGV0IGRhdGFSb3V0ZXJDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChEYXRhUm91dGVyQ29udGV4dCk7XG4gIGxldCB7XG4gICAgYmFzZW5hbWUsXG4gICAgZnV0dXJlLFxuICAgIG5hdmlnYXRvclxuICB9ID0gUmVhY3QudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCB7XG4gICAgbWF0Y2hlc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQge1xuICAgIHBhdGhuYW1lOiBsb2NhdGlvblBhdGhuYW1lXG4gIH0gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgcm91dGVQYXRobmFtZXNKc29uID0gSlNPTi5zdHJpbmdpZnkoVU5TQUZFX2dldFJlc29sdmVUb01hdGNoZXMobWF0Y2hlcywgZnV0dXJlLnY3X3JlbGF0aXZlU3BsYXRQYXRoKSk7XG4gIGxldCBhY3RpdmVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVSZWYuY3VycmVudCA9IHRydWU7XG4gIH0pO1xuICBsZXQgbmF2aWdhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodG8sIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGFjdGl2ZVJlZi5jdXJyZW50LCBuYXZpZ2F0ZUVmZmVjdFdhcm5pbmcpIDogdm9pZCAwO1xuXG4gICAgLy8gU2hvcnQgY2lyY3VpdCBoZXJlIHNpbmNlIGlmIHRoaXMgaGFwcGVucyBvbiBmaXJzdCByZW5kZXIgdGhlIG5hdmlnYXRlXG4gICAgLy8gaXMgdXNlbGVzcyBiZWNhdXNlIHdlIGhhdmVuJ3Qgd2lyZWQgdXAgb3VyIGhpc3RvcnkgbGlzdGVuZXIgeWV0XG4gICAgaWYgKCFhY3RpdmVSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgdG8gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG5hdmlnYXRvci5nbyh0byk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBwYXRoID0gcmVzb2x2ZVRvKHRvLCBKU09OLnBhcnNlKHJvdXRlUGF0aG5hbWVzSnNvbiksIGxvY2F0aW9uUGF0aG5hbWUsIG9wdGlvbnMucmVsYXRpdmUgPT09IFwicGF0aFwiKTtcblxuICAgIC8vIElmIHdlJ3JlIG9wZXJhdGluZyB3aXRoaW4gYSBiYXNlbmFtZSwgcHJlcGVuZCBpdCB0byB0aGUgcGF0aG5hbWUgcHJpb3JcbiAgICAvLyB0byBoYW5kaW5nIG9mZiB0byBoaXN0b3J5IChidXQgb25seSBpZiB3ZSdyZSBub3QgaW4gYSBkYXRhIHJvdXRlcixcbiAgICAvLyBvdGhlcndpc2UgaXQnbGwgcHJlcGVuZCB0aGUgYmFzZW5hbWUgaW5zaWRlIG9mIHRoZSByb3V0ZXIpLlxuICAgIC8vIElmIHRoaXMgaXMgYSByb290IG5hdmlnYXRpb24sIHRoZW4gd2UgbmF2aWdhdGUgdG8gdGhlIHJhdyBiYXNlbmFtZVxuICAgIC8vIHdoaWNoIGFsbG93cyB0aGUgYmFzZW5hbWUgdG8gaGF2ZSBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgcHJlc2VuY2Ugb2YgYVxuICAgIC8vIHRyYWlsaW5nIHNsYXNoIG9uIHJvb3QgbGlua3NcbiAgICBpZiAoZGF0YVJvdXRlckNvbnRleHQgPT0gbnVsbCAmJiBiYXNlbmFtZSAhPT0gXCIvXCIpIHtcbiAgICAgIHBhdGgucGF0aG5hbWUgPSBwYXRoLnBhdGhuYW1lID09PSBcIi9cIiA/IGJhc2VuYW1lIDogam9pblBhdGhzKFtiYXNlbmFtZSwgcGF0aC5wYXRobmFtZV0pO1xuICAgIH1cbiAgICAoISFvcHRpb25zLnJlcGxhY2UgPyBuYXZpZ2F0b3IucmVwbGFjZSA6IG5hdmlnYXRvci5wdXNoKShwYXRoLCBvcHRpb25zLnN0YXRlLCBvcHRpb25zKTtcbiAgfSwgW2Jhc2VuYW1lLCBuYXZpZ2F0b3IsIHJvdXRlUGF0aG5hbWVzSnNvbiwgbG9jYXRpb25QYXRobmFtZSwgZGF0YVJvdXRlckNvbnRleHRdKTtcbiAgcmV0dXJuIG5hdmlnYXRlO1xufVxuY29uc3QgT3V0bGV0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgKGlmIHByb3ZpZGVkKSBmb3IgdGhlIGNoaWxkIHJvdXRlIGF0IHRoaXMgbGV2ZWwgb2YgdGhlIHJvdXRlXG4gKiBoaWVyYXJjaHkuXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1vdXRsZXQtY29udGV4dFxuICovXG5mdW5jdGlvbiB1c2VPdXRsZXRDb250ZXh0KCkge1xuICByZXR1cm4gUmVhY3QudXNlQ29udGV4dChPdXRsZXRDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50IGZvciB0aGUgY2hpbGQgcm91dGUgYXQgdGhpcyBsZXZlbCBvZiB0aGUgcm91dGVcbiAqIGhpZXJhcmNoeS4gVXNlZCBpbnRlcm5hbGx5IGJ5IGA8T3V0bGV0PmAgdG8gcmVuZGVyIGNoaWxkIHJvdXRlcy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1vdXRsZXRcbiAqL1xuZnVuY3Rpb24gdXNlT3V0bGV0KGNvbnRleHQpIHtcbiAgbGV0IG91dGxldCA9IFJlYWN0LnVzZUNvbnRleHQoUm91dGVDb250ZXh0KS5vdXRsZXQ7XG4gIGlmIChvdXRsZXQpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3V0bGV0Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IGNvbnRleHRcbiAgICB9LCBvdXRsZXQpO1xuICB9XG4gIHJldHVybiBvdXRsZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIG9mIHRoZSBkeW5hbWljIHBhcmFtcyBmcm9tIHRoZSBjdXJyZW50XG4gKiBVUkwgdGhhdCB3ZXJlIG1hdGNoZWQgYnkgdGhlIHJvdXRlIHBhdGguXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9ob29rcy91c2UtcGFyYW1zXG4gKi9cbmZ1bmN0aW9uIHVzZVBhcmFtcygpIHtcbiAgbGV0IHtcbiAgICBtYXRjaGVzXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIGxldCByb3V0ZU1hdGNoID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdO1xuICByZXR1cm4gcm91dGVNYXRjaCA/IHJvdXRlTWF0Y2gucGFyYW1zIDoge307XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBnaXZlbiBgdG9gIHZhbHVlIGFnYWluc3QgdGhlIGN1cnJlbnQgbG9jYXRpb24uXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9ob29rcy91c2UtcmVzb2x2ZWQtcGF0aFxuICovXG5mdW5jdGlvbiB1c2VSZXNvbHZlZFBhdGgodG8sIF90ZW1wMikge1xuICBsZXQge1xuICAgIHJlbGF0aXZlXG4gIH0gPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyO1xuICBsZXQge1xuICAgIGZ1dHVyZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCB7XG4gICAgbWF0Y2hlc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQge1xuICAgIHBhdGhuYW1lOiBsb2NhdGlvblBhdGhuYW1lXG4gIH0gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgcm91dGVQYXRobmFtZXNKc29uID0gSlNPTi5zdHJpbmdpZnkoVU5TQUZFX2dldFJlc29sdmVUb01hdGNoZXMobWF0Y2hlcywgZnV0dXJlLnY3X3JlbGF0aXZlU3BsYXRQYXRoKSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IHJlc29sdmVUbyh0bywgSlNPTi5wYXJzZShyb3V0ZVBhdGhuYW1lc0pzb24pLCBsb2NhdGlvblBhdGhuYW1lLCByZWxhdGl2ZSA9PT0gXCJwYXRoXCIpLCBbdG8sIHJvdXRlUGF0aG5hbWVzSnNvbiwgbG9jYXRpb25QYXRobmFtZSwgcmVsYXRpdmVdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50IG9mIHRoZSByb3V0ZSB0aGF0IG1hdGNoZWQgdGhlIGN1cnJlbnQgbG9jYXRpb24sIHByZXBhcmVkXG4gKiB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHQgdG8gcmVuZGVyIHRoZSByZW1haW5kZXIgb2YgdGhlIHJvdXRlIHRyZWUuIFJvdXRlXG4gKiBlbGVtZW50cyBpbiB0aGUgdHJlZSBtdXN0IHJlbmRlciBhbiBgPE91dGxldD5gIHRvIHJlbmRlciB0aGVpciBjaGlsZCByb3V0ZSdzXG4gKiBlbGVtZW50LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLXJvdXRlc1xuICovXG5mdW5jdGlvbiB1c2VSb3V0ZXMocm91dGVzLCBsb2NhdGlvbkFyZykge1xuICByZXR1cm4gdXNlUm91dGVzSW1wbChyb3V0ZXMsIGxvY2F0aW9uQXJnKTtcbn1cblxuLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gd2l0aCBhY2NlcHQgb3B0aW9uYWwgcGFyYW0gZm9yIFJvdXRlclByb3ZpZGVyIHVzYWdlXG5mdW5jdGlvbiB1c2VSb3V0ZXNJbXBsKHJvdXRlcywgbG9jYXRpb25BcmcsIGRhdGFSb3V0ZXJTdGF0ZSwgZnV0dXJlKSB7XG4gICF1c2VJblJvdXRlckNvbnRleHQoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAvLyByb3V0ZXIgbG9hZGVkLiBXZSBjYW4gaGVscCB0aGVtIHVuZGVyc3RhbmQgaG93IHRvIGF2b2lkIHRoYXQuXG4gIFwidXNlUm91dGVzKCkgbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgbGV0IHtcbiAgICBuYXZpZ2F0b3JcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpO1xuICBsZXQge1xuICAgIG1hdGNoZXM6IHBhcmVudE1hdGNoZXNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgbGV0IHJvdXRlTWF0Y2ggPSBwYXJlbnRNYXRjaGVzW3BhcmVudE1hdGNoZXMubGVuZ3RoIC0gMV07XG4gIGxldCBwYXJlbnRQYXJhbXMgPSByb3V0ZU1hdGNoID8gcm91dGVNYXRjaC5wYXJhbXMgOiB7fTtcbiAgbGV0IHBhcmVudFBhdGhuYW1lID0gcm91dGVNYXRjaCA/IHJvdXRlTWF0Y2gucGF0aG5hbWUgOiBcIi9cIjtcbiAgbGV0IHBhcmVudFBhdGhuYW1lQmFzZSA9IHJvdXRlTWF0Y2ggPyByb3V0ZU1hdGNoLnBhdGhuYW1lQmFzZSA6IFwiL1wiO1xuICBsZXQgcGFyZW50Um91dGUgPSByb3V0ZU1hdGNoICYmIHJvdXRlTWF0Y2gucm91dGU7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAvLyBZb3Ugd29uJ3QgZ2V0IGEgd2FybmluZyBhYm91dCAyIGRpZmZlcmVudCA8Um91dGVzPiB1bmRlciBhIDxSb3V0ZT5cbiAgICAvLyB3aXRob3V0IGEgdHJhaWxpbmcgKiwgYnV0IHRoaXMgaXMgYSBiZXN0LWVmZm9ydCB3YXJuaW5nIGFueXdheSBzaW5jZSB3ZVxuICAgIC8vIGNhbm5vdCBldmVuIGdpdmUgdGhlIHdhcm5pbmcgdW5sZXNzIHRoZXkgbGFuZCBhdCB0aGUgcGFyZW50IHJvdXRlLlxuICAgIC8vXG4gICAgLy8gRXhhbXBsZTpcbiAgICAvL1xuICAgIC8vIDxSb3V0ZXM+XG4gICAgLy8gICB7LyogVGhpcyByb3V0ZSBwYXRoIE1VU1QgZW5kIHdpdGggLyogYmVjYXVzZSBvdGhlcndpc2VcbiAgICAvLyAgICAgICBpdCB3aWxsIG5ldmVyIG1hdGNoIC9ibG9nL3Bvc3QvMTIzICovfVxuICAgIC8vICAgPFJvdXRlIHBhdGg9XCJibG9nXCIgZWxlbWVudD17PEJsb2cgLz59IC8+XG4gICAgLy8gICA8Um91dGUgcGF0aD1cImJsb2cvZmVlZFwiIGVsZW1lbnQ9ezxCbG9nRmVlZCAvPn0gLz5cbiAgICAvLyA8L1JvdXRlcz5cbiAgICAvL1xuICAgIC8vIGZ1bmN0aW9uIEJsb2coKSB7XG4gICAgLy8gICByZXR1cm4gKFxuICAgIC8vICAgICA8Um91dGVzPlxuICAgIC8vICAgICAgIDxSb3V0ZSBwYXRoPVwicG9zdC86aWRcIiBlbGVtZW50PXs8UG9zdCAvPn0gLz5cbiAgICAvLyAgICAgPC9Sb3V0ZXM+XG4gICAgLy8gICApO1xuICAgIC8vIH1cbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhcmVudFJvdXRlICYmIHBhcmVudFJvdXRlLnBhdGggfHwgXCJcIjtcbiAgICB3YXJuaW5nT25jZShwYXJlbnRQYXRobmFtZSwgIXBhcmVudFJvdXRlIHx8IHBhcmVudFBhdGguZW5kc1dpdGgoXCIqXCIpLCBcIllvdSByZW5kZXJlZCBkZXNjZW5kYW50IDxSb3V0ZXM+IChvciBjYWxsZWQgYHVzZVJvdXRlcygpYCkgYXQgXCIgKyAoXCJcXFwiXCIgKyBwYXJlbnRQYXRobmFtZSArIFwiXFxcIiAodW5kZXIgPFJvdXRlIHBhdGg9XFxcIlwiICsgcGFyZW50UGF0aCArIFwiXFxcIj4pIGJ1dCB0aGUgXCIpICsgXCJwYXJlbnQgcm91dGUgcGF0aCBoYXMgbm8gdHJhaWxpbmcgXFxcIipcXFwiLiBUaGlzIG1lYW5zIGlmIHlvdSBuYXZpZ2F0ZSBcIiArIFwiZGVlcGVyLCB0aGUgcGFyZW50IHdvbid0IG1hdGNoIGFueW1vcmUgYW5kIHRoZXJlZm9yZSB0aGUgY2hpbGQgXCIgKyBcInJvdXRlcyB3aWxsIG5ldmVyIHJlbmRlci5cXG5cXG5cIiArIChcIlBsZWFzZSBjaGFuZ2UgdGhlIHBhcmVudCA8Um91dGUgcGF0aD1cXFwiXCIgKyBwYXJlbnRQYXRoICsgXCJcXFwiPiB0byA8Um91dGUgXCIpICsgKFwicGF0aD1cXFwiXCIgKyAocGFyZW50UGF0aCA9PT0gXCIvXCIgPyBcIipcIiA6IHBhcmVudFBhdGggKyBcIi8qXCIpICsgXCJcXFwiPi5cIikpO1xuICB9XG4gIGxldCBsb2NhdGlvbkZyb21Db250ZXh0ID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IGxvY2F0aW9uO1xuICBpZiAobG9jYXRpb25BcmcpIHtcbiAgICB2YXIgX3BhcnNlZExvY2F0aW9uQXJnJHBhO1xuICAgIGxldCBwYXJzZWRMb2NhdGlvbkFyZyA9IHR5cGVvZiBsb2NhdGlvbkFyZyA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aChsb2NhdGlvbkFyZykgOiBsb2NhdGlvbkFyZztcbiAgICAhKHBhcmVudFBhdGhuYW1lQmFzZSA9PT0gXCIvXCIgfHwgKChfcGFyc2VkTG9jYXRpb25BcmckcGEgPSBwYXJzZWRMb2NhdGlvbkFyZy5wYXRobmFtZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9wYXJzZWRMb2NhdGlvbkFyZyRwYS5zdGFydHNXaXRoKHBhcmVudFBhdGhuYW1lQmFzZSkpKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiV2hlbiBvdmVycmlkaW5nIHRoZSBsb2NhdGlvbiB1c2luZyBgPFJvdXRlcyBsb2NhdGlvbj5gIG9yIGB1c2VSb3V0ZXMocm91dGVzLCBsb2NhdGlvbilgLCBcIiArIFwidGhlIGxvY2F0aW9uIHBhdGhuYW1lIG11c3QgYmVnaW4gd2l0aCB0aGUgcG9ydGlvbiBvZiB0aGUgVVJMIHBhdGhuYW1lIHRoYXQgd2FzIFwiICsgKFwibWF0Y2hlZCBieSBhbGwgcGFyZW50IHJvdXRlcy4gVGhlIGN1cnJlbnQgcGF0aG5hbWUgYmFzZSBpcyBcXFwiXCIgKyBwYXJlbnRQYXRobmFtZUJhc2UgKyBcIlxcXCIgXCIpICsgKFwiYnV0IHBhdGhuYW1lIFxcXCJcIiArIHBhcnNlZExvY2F0aW9uQXJnLnBhdGhuYW1lICsgXCJcXFwiIHdhcyBnaXZlbiBpbiB0aGUgYGxvY2F0aW9uYCBwcm9wLlwiKSkgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBsb2NhdGlvbiA9IHBhcnNlZExvY2F0aW9uQXJnO1xuICB9IGVsc2Uge1xuICAgIGxvY2F0aW9uID0gbG9jYXRpb25Gcm9tQ29udGV4dDtcbiAgfVxuICBsZXQgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSB8fCBcIi9cIjtcbiAgbGV0IHJlbWFpbmluZ1BhdGhuYW1lID0gcGF0aG5hbWU7XG4gIGlmIChwYXJlbnRQYXRobmFtZUJhc2UgIT09IFwiL1wiKSB7XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSByZW1haW5pbmcgcGF0aG5hbWUgYnkgcmVtb3ZpbmcgdGhlICMgb2YgVVJMIHNlZ21lbnRzIHRoZVxuICAgIC8vIHBhcmVudFBhdGhuYW1lQmFzZSBoYXMsIGluc3RlYWQgb2YgcmVtb3ZpbmcgYmFzZWQgb24gY2hhcmFjdGVyIGNvdW50LlxuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBndWFyYW50ZWUgdGhhdCBpbmNvbWluZy9vdXRnb2luZyBlbmNvZGluZ3MvXG4gICAgLy8gZGVjb2RpbmdzIHdpbGwgbWF0Y2ggZXhhY3RseS5cbiAgICAvLyBXZSBkZWNvZGUgcGF0aHMgYmVmb3JlIG1hdGNoaW5nIG9uIGEgcGVyLXNlZ21lbnQgYmFzaXMgd2l0aFxuICAgIC8vIGRlY29kZVVSSUNvbXBvbmVudCgpLCBidXQgd2UgcmUtZW5jb2RlIHBhdGhuYW1lcyB2aWEgYG5ldyBVUkwoKWAgc28gdGhleVxuICAgIC8vIG1hdGNoIHdoYXQgYHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZWAgd291bGQgcmVmbGVjdC4gIFRob3NlIGRvbid0IDEwMCVcbiAgICAvLyBhbGlnbiB3aGVuIGl0IGNvbWVzIHRvIGVuY29kZWQgVVJJIGNoYXJhY3RlcnMgc3VjaCBhcyAlIGFuZCAmLlxuICAgIC8vXG4gICAgLy8gU28gd2UgbWF5IGVuZCB1cCB3aXRoOlxuICAgIC8vICAgcGF0aG5hbWU6ICAgICAgICAgICBcIi9kZXNjZW5kYW50L2ElMjViL21hdGNoXCJcbiAgICAvLyAgIHBhcmVudFBhdGhuYW1lQmFzZTogXCIvZGVzY2VuZGFudC9hJWJcIlxuICAgIC8vXG4gICAgLy8gQW5kIHRoZSBkaXJlY3Qgc3Vic3RyaW5nIHJlbW92YWwgYXBwcm9hY2ggd29uJ3Qgd29yayA6L1xuICAgIGxldCBwYXJlbnRTZWdtZW50cyA9IHBhcmVudFBhdGhuYW1lQmFzZS5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCIvXCIpO1xuICAgIGxldCBzZWdtZW50cyA9IHBhdGhuYW1lLnJlcGxhY2UoL15cXC8vLCBcIlwiKS5zcGxpdChcIi9cIik7XG4gICAgcmVtYWluaW5nUGF0aG5hbWUgPSBcIi9cIiArIHNlZ21lbnRzLnNsaWNlKHBhcmVudFNlZ21lbnRzLmxlbmd0aCkuam9pbihcIi9cIik7XG4gIH1cbiAgbGV0IG1hdGNoZXMgPSBtYXRjaFJvdXRlcyhyb3V0ZXMsIHtcbiAgICBwYXRobmFtZTogcmVtYWluaW5nUGF0aG5hbWVcbiAgfSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhwYXJlbnRSb3V0ZSB8fCBtYXRjaGVzICE9IG51bGwsIFwiTm8gcm91dGVzIG1hdGNoZWQgbG9jYXRpb24gXFxcIlwiICsgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2ggKyBsb2NhdGlvbi5oYXNoICsgXCJcXFwiIFwiKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhtYXRjaGVzID09IG51bGwgfHwgbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLmVsZW1lbnQgIT09IHVuZGVmaW5lZCB8fCBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0ucm91dGUuQ29tcG9uZW50ICE9PSB1bmRlZmluZWQgfHwgbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLmxhenkgIT09IHVuZGVmaW5lZCwgXCJNYXRjaGVkIGxlYWYgcm91dGUgYXQgbG9jYXRpb24gXFxcIlwiICsgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2ggKyBsb2NhdGlvbi5oYXNoICsgXCJcXFwiIFwiICsgXCJkb2VzIG5vdCBoYXZlIGFuIGVsZW1lbnQgb3IgQ29tcG9uZW50LiBUaGlzIG1lYW5zIGl0IHdpbGwgcmVuZGVyIGFuIDxPdXRsZXQgLz4gd2l0aCBhIFwiICsgXCJudWxsIHZhbHVlIGJ5IGRlZmF1bHQgcmVzdWx0aW5nIGluIGFuIFxcXCJlbXB0eVxcXCIgcGFnZS5cIikgOiB2b2lkIDA7XG4gIH1cbiAgbGV0IHJlbmRlcmVkTWF0Y2hlcyA9IF9yZW5kZXJNYXRjaGVzKG1hdGNoZXMgJiYgbWF0Y2hlcy5tYXAobWF0Y2ggPT4gT2JqZWN0LmFzc2lnbih7fSwgbWF0Y2gsIHtcbiAgICBwYXJhbXM6IE9iamVjdC5hc3NpZ24oe30sIHBhcmVudFBhcmFtcywgbWF0Y2gucGFyYW1zKSxcbiAgICBwYXRobmFtZTogam9pblBhdGhzKFtwYXJlbnRQYXRobmFtZUJhc2UsXG4gICAgLy8gUmUtZW5jb2RlIHBhdGhuYW1lcyB0aGF0IHdlcmUgZGVjb2RlZCBpbnNpZGUgbWF0Y2hSb3V0ZXNcbiAgICBuYXZpZ2F0b3IuZW5jb2RlTG9jYXRpb24gPyBuYXZpZ2F0b3IuZW5jb2RlTG9jYXRpb24obWF0Y2gucGF0aG5hbWUpLnBhdGhuYW1lIDogbWF0Y2gucGF0aG5hbWVdKSxcbiAgICBwYXRobmFtZUJhc2U6IG1hdGNoLnBhdGhuYW1lQmFzZSA9PT0gXCIvXCIgPyBwYXJlbnRQYXRobmFtZUJhc2UgOiBqb2luUGF0aHMoW3BhcmVudFBhdGhuYW1lQmFzZSxcbiAgICAvLyBSZS1lbmNvZGUgcGF0aG5hbWVzIHRoYXQgd2VyZSBkZWNvZGVkIGluc2lkZSBtYXRjaFJvdXRlc1xuICAgIG5hdmlnYXRvci5lbmNvZGVMb2NhdGlvbiA/IG5hdmlnYXRvci5lbmNvZGVMb2NhdGlvbihtYXRjaC5wYXRobmFtZUJhc2UpLnBhdGhuYW1lIDogbWF0Y2gucGF0aG5hbWVCYXNlXSlcbiAgfSkpLCBwYXJlbnRNYXRjaGVzLCBkYXRhUm91dGVyU3RhdGUsIGZ1dHVyZSk7XG5cbiAgLy8gV2hlbiBhIHVzZXIgcGFzc2VzIGluIGEgYGxvY2F0aW9uQXJnYCwgdGhlIGFzc29jaWF0ZWQgcm91dGVzIG5lZWQgdG9cbiAgLy8gYmUgd3JhcHBlZCBpbiBhIG5ldyBgTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyYCBpbiBvcmRlciBmb3IgYHVzZUxvY2F0aW9uYFxuICAvLyB0byB1c2UgdGhlIHNjb3BlZCBsb2NhdGlvbiBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgbG9jYXRpb24uXG4gIGlmIChsb2NhdGlvbkFyZyAmJiByZW5kZXJlZE1hdGNoZXMpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZToge1xuICAgICAgICBsb2NhdGlvbjogX2V4dGVuZHMoe1xuICAgICAgICAgIHBhdGhuYW1lOiBcIi9cIixcbiAgICAgICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICAgICAgaGFzaDogXCJcIixcbiAgICAgICAgICBzdGF0ZTogbnVsbCxcbiAgICAgICAgICBrZXk6IFwiZGVmYXVsdFwiXG4gICAgICAgIH0sIGxvY2F0aW9uKSxcbiAgICAgICAgbmF2aWdhdGlvblR5cGU6IEFjdGlvbi5Qb3BcbiAgICAgIH1cbiAgICB9LCByZW5kZXJlZE1hdGNoZXMpO1xuICB9XG4gIHJldHVybiByZW5kZXJlZE1hdGNoZXM7XG59XG5mdW5jdGlvbiBEZWZhdWx0RXJyb3JDb21wb25lbnQoKSB7XG4gIGxldCBlcnJvciA9IHVzZVJvdXRlRXJyb3IoKTtcbiAgbGV0IG1lc3NhZ2UgPSBpc1JvdXRlRXJyb3JSZXNwb25zZShlcnJvcikgPyBlcnJvci5zdGF0dXMgKyBcIiBcIiArIGVycm9yLnN0YXR1c1RleHQgOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgbGV0IHN0YWNrID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogbnVsbDtcbiAgbGV0IGxpZ2h0Z3JleSA9IFwicmdiYSgyMDAsMjAwLDIwMCwgMC41KVwiO1xuICBsZXQgcHJlU3R5bGVzID0ge1xuICAgIHBhZGRpbmc6IFwiMC41cmVtXCIsXG4gICAgYmFja2dyb3VuZENvbG9yOiBsaWdodGdyZXlcbiAgfTtcbiAgbGV0IGNvZGVTdHlsZXMgPSB7XG4gICAgcGFkZGluZzogXCIycHggNHB4XCIsXG4gICAgYmFja2dyb3VuZENvbG9yOiBsaWdodGdyZXlcbiAgfTtcbiAgbGV0IGRldkluZm8gPSBudWxsO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGhhbmRsZWQgYnkgUmVhY3QgUm91dGVyIGRlZmF1bHQgRXJyb3JCb3VuZGFyeTpcIiwgZXJyb3IpO1xuICAgIGRldkluZm8gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIFwiXFx1RDgzRFxcdURDQkYgSGV5IGRldmVsb3BlciBcXHVEODNEXFx1REM0QlwiKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIFwiWW91IGNhbiBwcm92aWRlIGEgd2F5IGJldHRlciBVWCB0aGFuIHRoaXMgd2hlbiB5b3VyIGFwcCB0aHJvd3MgZXJyb3JzIGJ5IHByb3ZpZGluZyB5b3VyIG93biBcIiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtcbiAgICAgIHN0eWxlOiBjb2RlU3R5bGVzXG4gICAgfSwgXCJFcnJvckJvdW5kYXJ5XCIpLCBcIiBvclwiLCBcIiBcIiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtcbiAgICAgIHN0eWxlOiBjb2RlU3R5bGVzXG4gICAgfSwgXCJlcnJvckVsZW1lbnRcIiksIFwiIHByb3Agb24geW91ciByb3V0ZS5cIikpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCBudWxsLCBcIlVuZXhwZWN0ZWQgQXBwbGljYXRpb24gRXJyb3IhXCIpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgZm9udFN0eWxlOiBcIml0YWxpY1wiXG4gICAgfVxuICB9LCBtZXNzYWdlKSwgc3RhY2sgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInByZVwiLCB7XG4gICAgc3R5bGU6IHByZVN0eWxlc1xuICB9LCBzdGFjaykgOiBudWxsLCBkZXZJbmZvKTtcbn1cbmNvbnN0IGRlZmF1bHRFcnJvckVsZW1lbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWZhdWx0RXJyb3JDb21wb25lbnQsIG51bGwpO1xuY2xhc3MgUmVuZGVyRXJyb3JCb3VuZGFyeSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24sXG4gICAgICByZXZhbGlkYXRpb246IHByb3BzLnJldmFsaWRhdGlvbixcbiAgICAgIGVycm9yOiBwcm9wcy5lcnJvclxuICAgIH07XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgLy8gV2hlbiB3ZSBnZXQgaW50byBhbiBlcnJvciBzdGF0ZSwgdGhlIHVzZXIgd2lsbCBsaWtlbHkgY2xpY2sgXCJiYWNrXCIgdG8gdGhlXG4gICAgLy8gcHJldmlvdXMgcGFnZSB0aGF0IGRpZG4ndCBoYXZlIGFuIGVycm9yLiBCZWNhdXNlIHRoaXMgd3JhcHMgdGhlIGVudGlyZVxuICAgIC8vIGFwcGxpY2F0aW9uLCB0aGF0IHdpbGwgaGF2ZSBubyBlZmZlY3QtLXRoZSBlcnJvciBwYWdlIGNvbnRpbnVlcyB0byBkaXNwbGF5LlxuICAgIC8vIFRoaXMgZ2l2ZXMgdXMgYSBtZWNoYW5pc20gdG8gcmVjb3ZlciBmcm9tIHRoZSBlcnJvciB3aGVuIHRoZSBsb2NhdGlvbiBjaGFuZ2VzLlxuICAgIC8vXG4gICAgLy8gV2hldGhlciB3ZSdyZSBpbiBhbiBlcnJvciBzdGF0ZSBvciBub3QsIHdlIHVwZGF0ZSB0aGUgbG9jYXRpb24gaW4gc3RhdGVcbiAgICAvLyBzbyB0aGF0IHdoZW4gd2UgYXJlIGluIGFuIGVycm9yIHN0YXRlLCBpdCBnZXRzIHJlc2V0IHdoZW4gYSBuZXcgbG9jYXRpb25cbiAgICAvLyBjb21lcyBpbiBhbmQgdGhlIHVzZXIgcmVjb3ZlcnMgZnJvbSB0aGUgZXJyb3IuXG4gICAgaWYgKHN0YXRlLmxvY2F0aW9uICE9PSBwcm9wcy5sb2NhdGlvbiB8fCBzdGF0ZS5yZXZhbGlkYXRpb24gIT09IFwiaWRsZVwiICYmIHByb3BzLnJldmFsaWRhdGlvbiA9PT0gXCJpZGxlXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBwcm9wcy5lcnJvcixcbiAgICAgICAgbG9jYXRpb246IHByb3BzLmxvY2F0aW9uLFxuICAgICAgICByZXZhbGlkYXRpb246IHByb3BzLnJldmFsaWRhdGlvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSdyZSBub3QgY2hhbmdpbmcgbG9jYXRpb25zLCBwcmVzZXJ2ZSB0aGUgbG9jYXRpb24gYnV0IHN0aWxsIHN1cmZhY2VcbiAgICAvLyBhbnkgbmV3IGVycm9ycyB0aGF0IG1heSBjb21lIHRocm91Z2guIFdlIHJldGFpbiB0aGUgZXhpc3RpbmcgZXJyb3IsIHdlIGRvXG4gICAgLy8gdGhpcyBiZWNhdXNlIHRoZSBlcnJvciBwcm92aWRlZCBmcm9tIHRoZSBhcHAgc3RhdGUgbWF5IGJlIGNsZWFyZWQgd2l0aG91dFxuICAgIC8vIHRoZSBsb2NhdGlvbiBjaGFuZ2luZy5cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHByb3BzLmVycm9yICE9PSB1bmRlZmluZWQgPyBwcm9wcy5lcnJvciA6IHN0YXRlLmVycm9yLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgcmV2YWxpZGF0aW9uOiBwcm9wcy5yZXZhbGlkYXRpb24gfHwgc3RhdGUucmV2YWxpZGF0aW9uXG4gICAgfTtcbiAgfVxuICBjb21wb25lbnREaWRDYXRjaChlcnJvciwgZXJyb3JJbmZvKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlJlYWN0IFJvdXRlciBjYXVnaHQgdGhlIGZvbGxvd2luZyBlcnJvciBkdXJpbmcgcmVuZGVyXCIsIGVycm9yLCBlcnJvckluZm8pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5lcnJvciAhPT0gdW5kZWZpbmVkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogdGhpcy5wcm9wcy5yb3V0ZUNvbnRleHRcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZUVycm9yQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHRoaXMuc3RhdGUuZXJyb3IsXG4gICAgICBjaGlsZHJlbjogdGhpcy5wcm9wcy5jb21wb25lbnRcbiAgICB9KSkgOiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICB9XG59XG5mdW5jdGlvbiBSZW5kZXJlZFJvdXRlKF9yZWYpIHtcbiAgbGV0IHtcbiAgICByb3V0ZUNvbnRleHQsXG4gICAgbWF0Y2gsXG4gICAgY2hpbGRyZW5cbiAgfSA9IF9yZWY7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRGF0YVJvdXRlckNvbnRleHQpO1xuXG4gIC8vIFRyYWNrIGhvdyBkZWVwIHdlIGdvdCBpbiBvdXIgcmVuZGVyIHBhc3MgdG8gZW11bGF0ZSBTU1IgY29tcG9uZW50RGlkQ2F0Y2hcbiAgLy8gaW4gYSBEYXRhU3RhdGljUm91dGVyXG4gIGlmIChkYXRhUm91dGVyQ29udGV4dCAmJiBkYXRhUm91dGVyQ29udGV4dC5zdGF0aWMgJiYgZGF0YVJvdXRlckNvbnRleHQuc3RhdGljQ29udGV4dCAmJiAobWF0Y2gucm91dGUuZXJyb3JFbGVtZW50IHx8IG1hdGNoLnJvdXRlLkVycm9yQm91bmRhcnkpKSB7XG4gICAgZGF0YVJvdXRlckNvbnRleHQuc3RhdGljQ29udGV4dC5fZGVlcGVzdFJlbmRlcmVkQm91bmRhcnlJZCA9IG1hdGNoLnJvdXRlLmlkO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcm91dGVDb250ZXh0XG4gIH0sIGNoaWxkcmVuKTtcbn1cbmZ1bmN0aW9uIF9yZW5kZXJNYXRjaGVzKG1hdGNoZXMsIHBhcmVudE1hdGNoZXMsIGRhdGFSb3V0ZXJTdGF0ZSwgZnV0dXJlKSB7XG4gIHZhciBfZGF0YVJvdXRlclN0YXRlO1xuICBpZiAocGFyZW50TWF0Y2hlcyA9PT0gdm9pZCAwKSB7XG4gICAgcGFyZW50TWF0Y2hlcyA9IFtdO1xuICB9XG4gIGlmIChkYXRhUm91dGVyU3RhdGUgPT09IHZvaWQgMCkge1xuICAgIGRhdGFSb3V0ZXJTdGF0ZSA9IG51bGw7XG4gIH1cbiAgaWYgKGZ1dHVyZSA9PT0gdm9pZCAwKSB7XG4gICAgZnV0dXJlID0gbnVsbDtcbiAgfVxuICBpZiAobWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgdmFyIF9mdXR1cmU7XG4gICAgaWYgKCFkYXRhUm91dGVyU3RhdGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZGF0YVJvdXRlclN0YXRlLmVycm9ycykge1xuICAgICAgLy8gRG9uJ3QgYmFpbCBpZiB3ZSBoYXZlIGRhdGEgcm91dGVyIGVycm9ycyBzbyB3ZSBjYW4gcmVuZGVyIHRoZW0gaW4gdGhlXG4gICAgICAvLyBib3VuZGFyeS4gIFVzZSB0aGUgcHJlLW1hdGNoZWQgKG9yIHNoaW1tZWQpIG1hdGNoZXNcbiAgICAgIG1hdGNoZXMgPSBkYXRhUm91dGVyU3RhdGUubWF0Y2hlcztcbiAgICB9IGVsc2UgaWYgKChfZnV0dXJlID0gZnV0dXJlKSAhPSBudWxsICYmIF9mdXR1cmUudjdfcGFydGlhbEh5ZHJhdGlvbiAmJiBwYXJlbnRNYXRjaGVzLmxlbmd0aCA9PT0gMCAmJiAhZGF0YVJvdXRlclN0YXRlLmluaXRpYWxpemVkICYmIGRhdGFSb3V0ZXJTdGF0ZS5tYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIERvbid0IGJhaWwgaWYgd2UncmUgaW5pdGlhbGl6aW5nIHdpdGggcGFydGlhbCBoeWRyYXRpb24gYW5kIHdlIGhhdmVcbiAgICAgIC8vIHJvdXRlciBtYXRjaGVzLiAgVGhhdCBtZWFucyB3ZSdyZSBhY3RpdmVseSBydW5uaW5nIGBwYXRjaFJvdXRlc09uTmF2aWdhdGlvbmBcbiAgICAgIC8vIHNvIHdlIHNob3VsZCByZW5kZXIgZG93biB0aGUgcGFydGlhbCBtYXRjaGVzIHRvIHRoZSBhcHByb3ByaWF0ZVxuICAgICAgLy8gYEh5ZHJhdGVGYWxsYmFja2AuICBXZSBvbmx5IGRvIHRoaXMgaWYgYHBhcmVudE1hdGNoZXNgIGlzIGVtcHR5IHNvIGl0XG4gICAgICAvLyBvbmx5IGltcGFjdHMgdGhlIHJvb3QgbWF0Y2hlcyBmb3IgYFJvdXRlclByb3ZpZGVyYCBhbmQgbm8gZGVzY2VuZGFudFxuICAgICAgLy8gYDxSb3V0ZXM+YFxuICAgICAgbWF0Y2hlcyA9IGRhdGFSb3V0ZXJTdGF0ZS5tYXRjaGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgbGV0IHJlbmRlcmVkTWF0Y2hlcyA9IG1hdGNoZXM7XG5cbiAgLy8gSWYgd2UgaGF2ZSBkYXRhIGVycm9ycywgdHJpbSBtYXRjaGVzIHRvIHRoZSBoaWdoZXN0IGVycm9yIGJvdW5kYXJ5XG4gIGxldCBlcnJvcnMgPSAoX2RhdGFSb3V0ZXJTdGF0ZSA9IGRhdGFSb3V0ZXJTdGF0ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhUm91dGVyU3RhdGUuZXJyb3JzO1xuICBpZiAoZXJyb3JzICE9IG51bGwpIHtcbiAgICBsZXQgZXJyb3JJbmRleCA9IHJlbmRlcmVkTWF0Y2hlcy5maW5kSW5kZXgobSA9PiBtLnJvdXRlLmlkICYmIChlcnJvcnMgPT0gbnVsbCA/IHZvaWQgMCA6IGVycm9yc1ttLnJvdXRlLmlkXSkgIT09IHVuZGVmaW5lZCk7XG4gICAgIShlcnJvckluZGV4ID49IDApID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIHJvdXRlIGZvciBlcnJvcnMgb24gcm91dGUgSURzOiBcIiArIE9iamVjdC5rZXlzKGVycm9ycykuam9pbihcIixcIikpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgcmVuZGVyZWRNYXRjaGVzID0gcmVuZGVyZWRNYXRjaGVzLnNsaWNlKDAsIE1hdGgubWluKHJlbmRlcmVkTWF0Y2hlcy5sZW5ndGgsIGVycm9ySW5kZXggKyAxKSk7XG4gIH1cblxuICAvLyBJZiB3ZSdyZSBpbiBhIHBhcnRpYWwgaHlkcmF0aW9uIG1vZGUsIGRldGVjdCBpZiB3ZSBuZWVkIHRvIHJlbmRlciBkb3duIHRvXG4gIC8vIGEgZ2l2ZW4gSHlkcmF0ZUZhbGxiYWNrIHdoaWxlIHdlIGxvYWQgdGhlIHJlc3Qgb2YgdGhlIGh5ZHJhdGlvbiBkYXRhXG4gIGxldCByZW5kZXJGYWxsYmFjayA9IGZhbHNlO1xuICBsZXQgZmFsbGJhY2tJbmRleCA9IC0xO1xuICBpZiAoZGF0YVJvdXRlclN0YXRlICYmIGZ1dHVyZSAmJiBmdXR1cmUudjdfcGFydGlhbEh5ZHJhdGlvbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWRNYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbWF0Y2ggPSByZW5kZXJlZE1hdGNoZXNbaV07XG4gICAgICAvLyBUcmFjayB0aGUgZGVlcGVzdCBmYWxsYmFjayB1cCB1bnRpbCB0aGUgZmlyc3Qgcm91dGUgd2l0aG91dCBkYXRhXG4gICAgICBpZiAobWF0Y2gucm91dGUuSHlkcmF0ZUZhbGxiYWNrIHx8IG1hdGNoLnJvdXRlLmh5ZHJhdGVGYWxsYmFja0VsZW1lbnQpIHtcbiAgICAgICAgZmFsbGJhY2tJbmRleCA9IGk7XG4gICAgICB9XG4gICAgICBpZiAobWF0Y2gucm91dGUuaWQpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBsb2FkZXJEYXRhLFxuICAgICAgICAgIGVycm9yc1xuICAgICAgICB9ID0gZGF0YVJvdXRlclN0YXRlO1xuICAgICAgICBsZXQgbmVlZHNUb1J1bkxvYWRlciA9IG1hdGNoLnJvdXRlLmxvYWRlciAmJiBsb2FkZXJEYXRhW21hdGNoLnJvdXRlLmlkXSA9PT0gdW5kZWZpbmVkICYmICghZXJyb3JzIHx8IGVycm9yc1ttYXRjaC5yb3V0ZS5pZF0gPT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChtYXRjaC5yb3V0ZS5sYXp5IHx8IG5lZWRzVG9SdW5Mb2FkZXIpIHtcbiAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgZmlyc3Qgcm91dGUgdGhhdCdzIG5vdCByZWFkeSB0byByZW5kZXIgKHdhaXRpbmcgb25cbiAgICAgICAgICAvLyBsYXp5LCBvciBoYXMgYSBsb2FkZXIgdGhhdCBoYXNuJ3QgcnVuIHlldCkuICBGbGFnIHRoYXQgd2UgbmVlZCB0b1xuICAgICAgICAgIC8vIHJlbmRlciBhIGZhbGxiYWNrIGFuZCByZW5kZXIgdXAgdW50aWwgdGhlIGFwcHJvcHJpYXRlIGZhbGxiYWNrXG4gICAgICAgICAgcmVuZGVyRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgICAgIGlmIChmYWxsYmFja0luZGV4ID49IDApIHtcbiAgICAgICAgICAgIHJlbmRlcmVkTWF0Y2hlcyA9IHJlbmRlcmVkTWF0Y2hlcy5zbGljZSgwLCBmYWxsYmFja0luZGV4ICsgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlcmVkTWF0Y2hlcyA9IFtyZW5kZXJlZE1hdGNoZXNbMF1dO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVuZGVyZWRNYXRjaGVzLnJlZHVjZVJpZ2h0KChvdXRsZXQsIG1hdGNoLCBpbmRleCkgPT4ge1xuICAgIC8vIE9ubHkgZGF0YSByb3V0ZXJzIGhhbmRsZSBlcnJvcnMvZmFsbGJhY2tzXG4gICAgbGV0IGVycm9yO1xuICAgIGxldCBzaG91bGRSZW5kZXJIeWRyYXRlRmFsbGJhY2sgPSBmYWxzZTtcbiAgICBsZXQgZXJyb3JFbGVtZW50ID0gbnVsbDtcbiAgICBsZXQgaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCA9IG51bGw7XG4gICAgaWYgKGRhdGFSb3V0ZXJTdGF0ZSkge1xuICAgICAgZXJyb3IgPSBlcnJvcnMgJiYgbWF0Y2gucm91dGUuaWQgPyBlcnJvcnNbbWF0Y2gucm91dGUuaWRdIDogdW5kZWZpbmVkO1xuICAgICAgZXJyb3JFbGVtZW50ID0gbWF0Y2gucm91dGUuZXJyb3JFbGVtZW50IHx8IGRlZmF1bHRFcnJvckVsZW1lbnQ7XG4gICAgICBpZiAocmVuZGVyRmFsbGJhY2spIHtcbiAgICAgICAgaWYgKGZhbGxiYWNrSW5kZXggPCAwICYmIGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgd2FybmluZ09uY2UoXCJyb3V0ZS1mYWxsYmFja1wiLCBmYWxzZSwgXCJObyBgSHlkcmF0ZUZhbGxiYWNrYCBlbGVtZW50IHByb3ZpZGVkIHRvIHJlbmRlciBkdXJpbmcgaW5pdGlhbCBoeWRyYXRpb25cIik7XG4gICAgICAgICAgc2hvdWxkUmVuZGVySHlkcmF0ZUZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICBoeWRyYXRlRmFsbGJhY2tFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChmYWxsYmFja0luZGV4ID09PSBpbmRleCkge1xuICAgICAgICAgIHNob3VsZFJlbmRlckh5ZHJhdGVGYWxsYmFjayA9IHRydWU7XG4gICAgICAgICAgaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCA9IG1hdGNoLnJvdXRlLmh5ZHJhdGVGYWxsYmFja0VsZW1lbnQgfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbWF0Y2hlcyA9IHBhcmVudE1hdGNoZXMuY29uY2F0KHJlbmRlcmVkTWF0Y2hlcy5zbGljZSgwLCBpbmRleCArIDEpKTtcbiAgICBsZXQgZ2V0Q2hpbGRyZW4gPSAoKSA9PiB7XG4gICAgICBsZXQgY2hpbGRyZW47XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBlcnJvckVsZW1lbnQ7XG4gICAgICB9IGVsc2UgaWYgKHNob3VsZFJlbmRlckh5ZHJhdGVGYWxsYmFjaykge1xuICAgICAgICBjaGlsZHJlbiA9IGh5ZHJhdGVGYWxsYmFja0VsZW1lbnQ7XG4gICAgICB9IGVsc2UgaWYgKG1hdGNoLnJvdXRlLkNvbXBvbmVudCkge1xuICAgICAgICAvLyBOb3RlOiBUaGlzIGlzIGEgZGUtb3B0aW1pemVkIHBhdGggc2luY2UgUmVhY3Qgd29uJ3QgcmUtdXNlIHRoZVxuICAgICAgICAvLyBSZWFjdEVsZW1lbnQgc2luY2UgaXQncyBpZGVudGl0eSBjaGFuZ2VzIHdpdGggZWFjaCBuZXdcbiAgICAgICAgLy8gUmVhY3QuY3JlYXRlRWxlbWVudCBjYWxsLiAgV2Uga2VlcCB0aGlzIHNvIGZvbGtzIGNhbiB1c2VcbiAgICAgICAgLy8gYDxSb3V0ZSBDb21wb25lbnQ9ey4uLn0+YCBpbiBgPFJvdXRlcz5gIGJ1dCBnZW5lcmFsbHkgYENvbXBvbmVudGBcbiAgICAgICAgLy8gdXNhZ2UgaXMgb25seSBhZHZpc2VkIGluIGBSb3V0ZXJQcm92aWRlcmAgd2hlbiB3ZSBjYW4gY29udmVydCBpdCB0b1xuICAgICAgICAvLyBgZWxlbWVudGAgYWhlYWQgb2YgdGltZS5cbiAgICAgICAgY2hpbGRyZW4gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChtYXRjaC5yb3V0ZS5Db21wb25lbnQsIG51bGwpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaC5yb3V0ZS5lbGVtZW50KSB7XG4gICAgICAgIGNoaWxkcmVuID0gbWF0Y2gucm91dGUuZWxlbWVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkcmVuID0gb3V0bGV0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlbmRlcmVkUm91dGUsIHtcbiAgICAgICAgbWF0Y2g6IG1hdGNoLFxuICAgICAgICByb3V0ZUNvbnRleHQ6IHtcbiAgICAgICAgICBvdXRsZXQsXG4gICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICBpc0RhdGFSb3V0ZTogZGF0YVJvdXRlclN0YXRlICE9IG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8vIE9ubHkgd3JhcCBpbiBhbiBlcnJvciBib3VuZGFyeSB3aXRoaW4gZGF0YSByb3V0ZXIgdXNhZ2VzIHdoZW4gd2UgaGF2ZSBhblxuICAgIC8vIEVycm9yQm91bmRhcnkvZXJyb3JFbGVtZW50IG9uIHRoaXMgcm91dGUuICBPdGhlcndpc2UgbGV0IGl0IGJ1YmJsZSB1cCB0b1xuICAgIC8vIGFuIGFuY2VzdG9yIEVycm9yQm91bmRhcnkvZXJyb3JFbGVtZW50XG4gICAgcmV0dXJuIGRhdGFSb3V0ZXJTdGF0ZSAmJiAobWF0Y2gucm91dGUuRXJyb3JCb3VuZGFyeSB8fCBtYXRjaC5yb3V0ZS5lcnJvckVsZW1lbnQgfHwgaW5kZXggPT09IDApID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVuZGVyRXJyb3JCb3VuZGFyeSwge1xuICAgICAgbG9jYXRpb246IGRhdGFSb3V0ZXJTdGF0ZS5sb2NhdGlvbixcbiAgICAgIHJldmFsaWRhdGlvbjogZGF0YVJvdXRlclN0YXRlLnJldmFsaWRhdGlvbixcbiAgICAgIGNvbXBvbmVudDogZXJyb3JFbGVtZW50LFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgY2hpbGRyZW46IGdldENoaWxkcmVuKCksXG4gICAgICByb3V0ZUNvbnRleHQ6IHtcbiAgICAgICAgb3V0bGV0OiBudWxsLFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBpc0RhdGFSb3V0ZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pIDogZ2V0Q2hpbGRyZW4oKTtcbiAgfSwgbnVsbCk7XG59XG52YXIgRGF0YVJvdXRlckhvb2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKERhdGFSb3V0ZXJIb29rKSB7XG4gIERhdGFSb3V0ZXJIb29rW1wiVXNlQmxvY2tlclwiXSA9IFwidXNlQmxvY2tlclwiO1xuICBEYXRhUm91dGVySG9va1tcIlVzZVJldmFsaWRhdG9yXCJdID0gXCJ1c2VSZXZhbGlkYXRvclwiO1xuICBEYXRhUm91dGVySG9va1tcIlVzZU5hdmlnYXRlU3RhYmxlXCJdID0gXCJ1c2VOYXZpZ2F0ZVwiO1xuICByZXR1cm4gRGF0YVJvdXRlckhvb2s7XG59KERhdGFSb3V0ZXJIb29rIHx8IHt9KTtcbnZhciBEYXRhUm91dGVyU3RhdGVIb29rID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChEYXRhUm91dGVyU3RhdGVIb29rKSB7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VCbG9ja2VyXCJdID0gXCJ1c2VCbG9ja2VyXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VMb2FkZXJEYXRhXCJdID0gXCJ1c2VMb2FkZXJEYXRhXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VBY3Rpb25EYXRhXCJdID0gXCJ1c2VBY3Rpb25EYXRhXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VSb3V0ZUVycm9yXCJdID0gXCJ1c2VSb3V0ZUVycm9yXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VOYXZpZ2F0aW9uXCJdID0gXCJ1c2VOYXZpZ2F0aW9uXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VSb3V0ZUxvYWRlckRhdGFcIl0gPSBcInVzZVJvdXRlTG9hZGVyRGF0YVwiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlTWF0Y2hlc1wiXSA9IFwidXNlTWF0Y2hlc1wiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlUmV2YWxpZGF0b3JcIl0gPSBcInVzZVJldmFsaWRhdG9yXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VOYXZpZ2F0ZVN0YWJsZVwiXSA9IFwidXNlTmF2aWdhdGVcIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZVJvdXRlSWRcIl0gPSBcInVzZVJvdXRlSWRcIjtcbiAgcmV0dXJuIERhdGFSb3V0ZXJTdGF0ZUhvb2s7XG59KERhdGFSb3V0ZXJTdGF0ZUhvb2sgfHwge30pO1xuZnVuY3Rpb24gZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkge1xuICByZXR1cm4gaG9va05hbWUgKyBcIiBtdXN0IGJlIHVzZWQgd2l0aGluIGEgZGF0YSByb3V0ZXIuICBTZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vcm91dGVycy9waWNraW5nLWEtcm91dGVyLlwiO1xufVxuZnVuY3Rpb24gdXNlRGF0YVJvdXRlckNvbnRleHQoaG9va05hbWUpIHtcbiAgbGV0IGN0eCA9IFJlYWN0LnVzZUNvbnRleHQoRGF0YVJvdXRlckNvbnRleHQpO1xuICAhY3R4ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHJldHVybiBjdHg7XG59XG5mdW5jdGlvbiB1c2VEYXRhUm91dGVyU3RhdGUoaG9va05hbWUpIHtcbiAgbGV0IHN0YXRlID0gUmVhY3QudXNlQ29udGV4dChEYXRhUm91dGVyU3RhdGVDb250ZXh0KTtcbiAgIXN0YXRlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIHVzZVJvdXRlQ29udGV4dChob29rTmFtZSkge1xuICBsZXQgcm91dGUgPSBSZWFjdC51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gICFyb3V0ZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IoaG9va05hbWUpKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICByZXR1cm4gcm91dGU7XG59XG5cbi8vIEludGVybmFsIHZlcnNpb24gd2l0aCBob29rTmFtZS1hd2FyZSBkZWJ1Z2dpbmdcbmZ1bmN0aW9uIHVzZUN1cnJlbnRSb3V0ZUlkKGhvb2tOYW1lKSB7XG4gIGxldCByb3V0ZSA9IHVzZVJvdXRlQ29udGV4dChob29rTmFtZSk7XG4gIGxldCB0aGlzUm91dGUgPSByb3V0ZS5tYXRjaGVzW3JvdXRlLm1hdGNoZXMubGVuZ3RoIC0gMV07XG4gICF0aGlzUm91dGUucm91dGUuaWQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBob29rTmFtZSArIFwiIGNhbiBvbmx5IGJlIHVzZWQgb24gcm91dGVzIHRoYXQgY29udGFpbiBhIHVuaXF1ZSBcXFwiaWRcXFwiXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHJldHVybiB0aGlzUm91dGUucm91dGUuaWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgSUQgZm9yIHRoZSBuZWFyZXN0IGNvbnRleHR1YWwgcm91dGVcbiAqL1xuZnVuY3Rpb24gdXNlUm91dGVJZCgpIHtcbiAgcmV0dXJuIHVzZUN1cnJlbnRSb3V0ZUlkKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlUm91dGVJZCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLCBkZWZhdWx0aW5nIHRvIGFuIFwiaWRsZVwiIG5hdmlnYXRpb24gd2hlblxuICogbm8gbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzc1xuICovXG5mdW5jdGlvbiB1c2VOYXZpZ2F0aW9uKCkge1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VOYXZpZ2F0aW9uKTtcbiAgcmV0dXJuIHN0YXRlLm5hdmlnYXRpb247XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJldmFsaWRhdGUgZnVuY3Rpb24gZm9yIG1hbnVhbGx5IHRyaWdnZXJpbmcgcmV2YWxpZGF0aW9uLCBhcyB3ZWxsXG4gKiBhcyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbnkgbWFudWFsIHJldmFsaWRhdGlvbnNcbiAqL1xuZnVuY3Rpb24gdXNlUmV2YWxpZGF0b3IoKSB7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KERhdGFSb3V0ZXJIb29rLlVzZVJldmFsaWRhdG9yKTtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlUmV2YWxpZGF0b3IpO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJldmFsaWRhdGU6IGRhdGFSb3V0ZXJDb250ZXh0LnJvdXRlci5yZXZhbGlkYXRlLFxuICAgIHN0YXRlOiBzdGF0ZS5yZXZhbGlkYXRpb25cbiAgfSksIFtkYXRhUm91dGVyQ29udGV4dC5yb3V0ZXIucmV2YWxpZGF0ZSwgc3RhdGUucmV2YWxpZGF0aW9uXSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWN0aXZlIHJvdXRlIG1hdGNoZXMsIHVzZWZ1bCBmb3IgYWNjZXNzaW5nIGxvYWRlckRhdGEgZm9yXG4gKiBwYXJlbnQvY2hpbGQgcm91dGVzIG9yIHRoZSByb3V0ZSBcImhhbmRsZVwiIHByb3BlcnR5XG4gKi9cbmZ1bmN0aW9uIHVzZU1hdGNoZXMoKSB7XG4gIGxldCB7XG4gICAgbWF0Y2hlcyxcbiAgICBsb2FkZXJEYXRhXG4gIH0gPSB1c2VEYXRhUm91dGVyU3RhdGUoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VNYXRjaGVzKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gbWF0Y2hlcy5tYXAobSA9PiBVTlNBRkVfY29udmVydFJvdXRlTWF0Y2hUb1VpTWF0Y2gobSwgbG9hZGVyRGF0YSkpLCBbbWF0Y2hlcywgbG9hZGVyRGF0YV0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvYWRlciBkYXRhIGZvciB0aGUgbmVhcmVzdCBhbmNlc3RvciBSb3V0ZSBsb2FkZXJcbiAqL1xuZnVuY3Rpb24gdXNlTG9hZGVyRGF0YSgpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlTG9hZGVyRGF0YSk7XG4gIGxldCByb3V0ZUlkID0gdXNlQ3VycmVudFJvdXRlSWQoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VMb2FkZXJEYXRhKTtcbiAgaWYgKHN0YXRlLmVycm9ycyAmJiBzdGF0ZS5lcnJvcnNbcm91dGVJZF0gIT0gbnVsbCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgY2Fubm90IGB1c2VMb2FkZXJEYXRhYCBpbiBhbiBlcnJvckVsZW1lbnQgKHJvdXRlSWQ6IFwiICsgcm91dGVJZCArIFwiKVwiKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sb2FkZXJEYXRhW3JvdXRlSWRdO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvYWRlckRhdGEgZm9yIHRoZSBnaXZlbiByb3V0ZUlkXG4gKi9cbmZ1bmN0aW9uIHVzZVJvdXRlTG9hZGVyRGF0YShyb3V0ZUlkKSB7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZVJvdXRlTG9hZGVyRGF0YSk7XG4gIHJldHVybiBzdGF0ZS5sb2FkZXJEYXRhW3JvdXRlSWRdO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGlvbiBkYXRhIGZvciB0aGUgbmVhcmVzdCBhbmNlc3RvciBSb3V0ZSBhY3Rpb25cbiAqL1xuZnVuY3Rpb24gdXNlQWN0aW9uRGF0YSgpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlQWN0aW9uRGF0YSk7XG4gIGxldCByb3V0ZUlkID0gdXNlQ3VycmVudFJvdXRlSWQoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VMb2FkZXJEYXRhKTtcbiAgcmV0dXJuIHN0YXRlLmFjdGlvbkRhdGEgPyBzdGF0ZS5hY3Rpb25EYXRhW3JvdXRlSWRdIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG5lYXJlc3QgYW5jZXN0b3IgUm91dGUgZXJyb3IsIHdoaWNoIGNvdWxkIGJlIGEgbG9hZGVyL2FjdGlvblxuICogZXJyb3Igb3IgYSByZW5kZXIgZXJyb3IuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIHlvdXJcbiAqIEVycm9yQm91bmRhcnkvZXJyb3JFbGVtZW50IHRvIGRpc3BsYXkgYSBwcm9wZXIgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gdXNlUm91dGVFcnJvcigpIHtcbiAgdmFyIF9zdGF0ZSRlcnJvcnM7XG4gIGxldCBlcnJvciA9IFJlYWN0LnVzZUNvbnRleHQoUm91dGVFcnJvckNvbnRleHQpO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VSb3V0ZUVycm9yKTtcbiAgbGV0IHJvdXRlSWQgPSB1c2VDdXJyZW50Um91dGVJZChEYXRhUm91dGVyU3RhdGVIb29rLlVzZVJvdXRlRXJyb3IpO1xuXG4gIC8vIElmIHRoaXMgd2FzIGEgcmVuZGVyIGVycm9yLCB3ZSBwdXQgaXQgaW4gYSBSb3V0ZUVycm9yIGNvbnRleHQgaW5zaWRlXG4gIC8vIG9mIFJlbmRlckVycm9yQm91bmRhcnlcbiAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICAvLyBPdGhlcndpc2UgbG9vayBmb3IgZXJyb3JzIGZyb20gb3VyIGRhdGEgcm91dGVyIHN0YXRlXG4gIHJldHVybiAoX3N0YXRlJGVycm9ycyA9IHN0YXRlLmVycm9ycykgPT0gbnVsbCA/IHZvaWQgMCA6IF9zdGF0ZSRlcnJvcnNbcm91dGVJZF07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaGFwcHktcGF0aCBkYXRhIGZyb20gdGhlIG5lYXJlc3QgYW5jZXN0b3IgYDxBd2FpdCAvPmAgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdXNlQXN5bmNWYWx1ZSgpIHtcbiAgbGV0IHZhbHVlID0gUmVhY3QudXNlQ29udGV4dChBd2FpdENvbnRleHQpO1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHZvaWQgMCA6IHZhbHVlLl9kYXRhO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVycm9yIGZyb20gdGhlIG5lYXJlc3QgYW5jZXN0b3IgYDxBd2FpdCAvPmAgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdXNlQXN5bmNFcnJvcigpIHtcbiAgbGV0IHZhbHVlID0gUmVhY3QudXNlQ29udGV4dChBd2FpdENvbnRleHQpO1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHZvaWQgMCA6IHZhbHVlLl9lcnJvcjtcbn1cbmxldCBibG9ja2VySWQgPSAwO1xuXG4vKipcbiAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBibG9jayBuYXZpZ2F0aW9ucyB3aXRoaW4gdGhlIFNQQSBhbmQgcHJlc2VudCB0aGVcbiAqIHVzZXIgYSBjb25maXJtYXRpb24gZGlhbG9nIHRvIGNvbmZpcm0gdGhlIG5hdmlnYXRpb24uICBNb3N0bHkgdXNlZCB0byBhdm9pZFxuICogdXNpbmcgaGFsZi1maWxsZWQgZm9ybSBkYXRhLiAgVGhpcyBkb2VzIG5vdCBoYW5kbGUgaGFyZC1yZWxvYWRzIG9yXG4gKiBjcm9zcy1vcmlnaW4gbmF2aWdhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHVzZUJsb2NrZXIoc2hvdWxkQmxvY2spIHtcbiAgbGV0IHtcbiAgICByb3V0ZXIsXG4gICAgYmFzZW5hbWVcbiAgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KERhdGFSb3V0ZXJIb29rLlVzZUJsb2NrZXIpO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VCbG9ja2VyKTtcbiAgbGV0IFtibG9ja2VyS2V5LCBzZXRCbG9ja2VyS2V5XSA9IFJlYWN0LnVzZVN0YXRlKFwiXCIpO1xuICBsZXQgYmxvY2tlckZ1bmN0aW9uID0gUmVhY3QudXNlQ2FsbGJhY2soYXJnID0+IHtcbiAgICBpZiAodHlwZW9mIHNob3VsZEJsb2NrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAhIXNob3VsZEJsb2NrO1xuICAgIH1cbiAgICBpZiAoYmFzZW5hbWUgPT09IFwiL1wiKSB7XG4gICAgICByZXR1cm4gc2hvdWxkQmxvY2soYXJnKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGV5IHByb3ZpZGVkIHVzIGEgZnVuY3Rpb24gYW5kIHdlJ3ZlIGdvdCBhbiBhY3RpdmUgYmFzZW5hbWUsIHN0cmlwXG4gICAgLy8gaXQgZnJvbSB0aGUgbG9jYXRpb25zIHdlIGV4cG9zZSB0byB0aGUgdXNlciB0byBtYXRjaCB0aGUgYmVoYXZpb3Igb2ZcbiAgICAvLyB1c2VMb2NhdGlvblxuICAgIGxldCB7XG4gICAgICBjdXJyZW50TG9jYXRpb24sXG4gICAgICBuZXh0TG9jYXRpb24sXG4gICAgICBoaXN0b3J5QWN0aW9uXG4gICAgfSA9IGFyZztcbiAgICByZXR1cm4gc2hvdWxkQmxvY2soe1xuICAgICAgY3VycmVudExvY2F0aW9uOiBfZXh0ZW5kcyh7fSwgY3VycmVudExvY2F0aW9uLCB7XG4gICAgICAgIHBhdGhuYW1lOiBzdHJpcEJhc2VuYW1lKGN1cnJlbnRMb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IGN1cnJlbnRMb2NhdGlvbi5wYXRobmFtZVxuICAgICAgfSksXG4gICAgICBuZXh0TG9jYXRpb246IF9leHRlbmRzKHt9LCBuZXh0TG9jYXRpb24sIHtcbiAgICAgICAgcGF0aG5hbWU6IHN0cmlwQmFzZW5hbWUobmV4dExvY2F0aW9uLnBhdGhuYW1lLCBiYXNlbmFtZSkgfHwgbmV4dExvY2F0aW9uLnBhdGhuYW1lXG4gICAgICB9KSxcbiAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICB9KTtcbiAgfSwgW2Jhc2VuYW1lLCBzaG91bGRCbG9ja10pO1xuXG4gIC8vIFRoaXMgZWZmZWN0IGlzIGluIGNoYXJnZSBvZiBibG9ja2VyIGtleSBhc3NpZ25tZW50IGFuZCBkZWxldGlvbiAod2hpY2ggaXNcbiAgLy8gdGlnaHRseSBjb3VwbGVkIHRvIHRoZSBrZXkpXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGtleSA9IFN0cmluZygrK2Jsb2NrZXJJZCk7XG4gICAgc2V0QmxvY2tlcktleShrZXkpO1xuICAgIHJldHVybiAoKSA9PiByb3V0ZXIuZGVsZXRlQmxvY2tlcihrZXkpO1xuICB9LCBbcm91dGVyXSk7XG5cbiAgLy8gVGhpcyBlZmZlY3QgaGFuZGxlcyBhc3NpZ25pbmcgdGhlIGJsb2NrZXJGdW5jdGlvbi4gIFRoaXMgaXMgdG8gaGFuZGxlXG4gIC8vIHVuc3RhYmxlIGJsb2NrZXIgZnVuY3Rpb24gaWRlbnRpdGllcywgYW5kIGhhcHBlbnMgb25seSBhZnRlciB0aGUgcHJpb3JcbiAgLy8gZWZmZWN0IHNvIHdlIGRvbid0IGdldCBhbiBvcnBoYW5lZCBibG9ja2VyRnVuY3Rpb24gaW4gdGhlIHJvdXRlciB3aXRoIGFcbiAgLy8ga2V5IG9mIFwiXCIuICBVbnRpbCB0aGVuIHdlIGp1c3QgaGF2ZSB0aGUgSURMRV9CTE9DS0VSLlxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChibG9ja2VyS2V5ICE9PSBcIlwiKSB7XG4gICAgICByb3V0ZXIuZ2V0QmxvY2tlcihibG9ja2VyS2V5LCBibG9ja2VyRnVuY3Rpb24pO1xuICAgIH1cbiAgfSwgW3JvdXRlciwgYmxvY2tlcktleSwgYmxvY2tlckZ1bmN0aW9uXSk7XG5cbiAgLy8gUHJlZmVyIHRoZSBibG9ja2VyIGZyb20gYHN0YXRlYCBub3QgYHJvdXRlci5zdGF0ZWAgc2luY2UgRGF0YVJvdXRlckNvbnRleHRcbiAgLy8gaXMgbWVtb2l6ZWQgc28gdGhpcyBlbnN1cmVzIHdlIHVwZGF0ZSBvbiBibG9ja2VyIHN0YXRlIHVwZGF0ZXNcbiAgcmV0dXJuIGJsb2NrZXJLZXkgJiYgc3RhdGUuYmxvY2tlcnMuaGFzKGJsb2NrZXJLZXkpID8gc3RhdGUuYmxvY2tlcnMuZ2V0KGJsb2NrZXJLZXkpIDogSURMRV9CTE9DS0VSO1xufVxuXG4vKipcbiAqIFN0YWJsZSB2ZXJzaW9uIG9mIHVzZU5hdmlnYXRlIHRoYXQgaXMgdXNlZCB3aGVuIHdlIGFyZSBpbiB0aGUgY29udGV4dCBvZlxuICogYSBSb3V0ZXJQcm92aWRlci5cbiAqL1xuZnVuY3Rpb24gdXNlTmF2aWdhdGVTdGFibGUoKSB7XG4gIGxldCB7XG4gICAgcm91dGVyXG4gIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dChEYXRhUm91dGVySG9vay5Vc2VOYXZpZ2F0ZVN0YWJsZSk7XG4gIGxldCBpZCA9IHVzZUN1cnJlbnRSb3V0ZUlkKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlTmF2aWdhdGVTdGFibGUpO1xuICBsZXQgYWN0aXZlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgYWN0aXZlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9KTtcbiAgbGV0IG5hdmlnYXRlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHRvLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhhY3RpdmVSZWYuY3VycmVudCwgbmF2aWdhdGVFZmZlY3RXYXJuaW5nKSA6IHZvaWQgMDtcblxuICAgIC8vIFNob3J0IGNpcmN1aXQgaGVyZSBzaW5jZSBpZiB0aGlzIGhhcHBlbnMgb24gZmlyc3QgcmVuZGVyIHRoZSBuYXZpZ2F0ZVxuICAgIC8vIGlzIHVzZWxlc3MgYmVjYXVzZSB3ZSBoYXZlbid0IHdpcmVkIHVwIG91ciByb3V0ZXIgc3Vic2NyaWJlciB5ZXRcbiAgICBpZiAoIWFjdGl2ZVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB0byA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcm91dGVyLm5hdmlnYXRlKHRvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm91dGVyLm5hdmlnYXRlKHRvLCBfZXh0ZW5kcyh7XG4gICAgICAgIGZyb21Sb3V0ZUlkOiBpZFxuICAgICAgfSwgb3B0aW9ucykpO1xuICAgIH1cbiAgfSwgW3JvdXRlciwgaWRdKTtcbiAgcmV0dXJuIG5hdmlnYXRlO1xufVxuY29uc3QgYWxyZWFkeVdhcm5lZCA9IHt9O1xuZnVuY3Rpb24gd2FybmluZ09uY2Uoa2V5LCBjb25kLCBtZXNzYWdlKSB7XG4gIGlmICghY29uZCAmJiAhYWxyZWFkeVdhcm5lZFtrZXldKSB7XG4gICAgYWxyZWFkeVdhcm5lZFtrZXldID0gdHJ1ZTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhmYWxzZSwgbWVzc2FnZSkgOiB2b2lkIDA7XG4gIH1cbn1cblxuLyoqXG4gIFdlYnBhY2sgKyBSZWFjdCAxNyBmYWlscyB0byBjb21waWxlIG9uIGFueSBvZiB0aGUgZm9sbG93aW5nIGJlY2F1c2Ugd2VicGFja1xuICBjb21wbGFpbnMgdGhhdCBgc3RhcnRUcmFuc2l0aW9uYCBkb2Vzbid0IGV4aXN0IGluIGBSZWFjdGA6XG4gICogaW1wb3J0IHsgc3RhcnRUcmFuc2l0aW9uIH0gZnJvbSBcInJlYWN0XCJcbiAgKiBpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIGZyb20gXCJyZWFjdFwiO1xuICAgIFwic3RhcnRUcmFuc2l0aW9uXCIgaW4gUmVhY3QgPyBSZWFjdC5zdGFydFRyYW5zaXRpb24oKCkgPT4gc2V0U3RhdGUoKSkgOiBzZXRTdGF0ZSgpXG4gICogaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBmcm9tIFwicmVhY3RcIjtcbiAgICBcInN0YXJ0VHJhbnNpdGlvblwiIGluIFJlYWN0ID8gUmVhY3RbXCJzdGFydFRyYW5zaXRpb25cIl0oKCkgPT4gc2V0U3RhdGUoKSkgOiBzZXRTdGF0ZSgpXG5cbiAgTW92aW5nIGl0IHRvIGEgY29uc3RhbnQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNvbHZlcyB0aGUgV2VicGFjay9SZWFjdCAxNyBpc3N1ZTpcbiAgKiBpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIGZyb20gXCJyZWFjdFwiO1xuICAgIGNvbnN0IFNUQVJUX1RSQU5TSVRJT04gPSBcInN0YXJ0VHJhbnNpdGlvblwiO1xuICAgIFNUQVJUX1RSQU5TSVRJT04gaW4gUmVhY3QgPyBSZWFjdFtTVEFSVF9UUkFOU0lUSU9OXSgoKSA9PiBzZXRTdGF0ZSgpKSA6IHNldFN0YXRlKClcblxuICBIb3dldmVyLCB0aGF0IGludHJvZHVjZXMgd2VicGFjay90ZXJzZXIgbWluaWZpY2F0aW9uIGlzc3VlcyBpbiBwcm9kdWN0aW9uIGJ1aWxkc1xuICBpbiBSZWFjdCAxOCB3aGVyZSBtaW5pZmljYXRpb24vb2JmdXNjYXRpb24gZW5kcyB1cCByZW1vdmluZyB0aGUgY2FsbCBvZlxuICBSZWFjdC5zdGFydFRyYW5zaXRpb24gZW50aXJlbHkgZnJvbSB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgdGVybmFyeS4gIEdyYWJiaW5nXG4gIHRoaXMgZXhwb3J0ZWQgcmVmZXJlbmNlIG9uY2UgdXAgZnJvbnQgcmVzb2x2ZXMgdGhhdCBpc3N1ZS5cblxuICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlbWl4LXJ1bi9yZWFjdC1yb3V0ZXIvaXNzdWVzLzEwNTc5XG4qL1xuY29uc3QgU1RBUlRfVFJBTlNJVElPTiA9IFwic3RhcnRUcmFuc2l0aW9uXCI7XG5jb25zdCBzdGFydFRyYW5zaXRpb25JbXBsID0gUmVhY3RbU1RBUlRfVFJBTlNJVElPTl07XG5cbi8qKlxuICogR2l2ZW4gYSBSZW1peCBSb3V0ZXIgaW5zdGFuY2UsIHJlbmRlciB0aGUgYXBwcm9wcmlhdGUgVUlcbiAqL1xuZnVuY3Rpb24gUm91dGVyUHJvdmlkZXIoX3JlZikge1xuICBsZXQge1xuICAgIGZhbGxiYWNrRWxlbWVudCxcbiAgICByb3V0ZXIsXG4gICAgZnV0dXJlXG4gIH0gPSBfcmVmO1xuICBsZXQgW3N0YXRlLCBzZXRTdGF0ZUltcGxdID0gUmVhY3QudXNlU3RhdGUocm91dGVyLnN0YXRlKTtcbiAgbGV0IHtcbiAgICB2N19zdGFydFRyYW5zaXRpb25cbiAgfSA9IGZ1dHVyZSB8fCB7fTtcbiAgbGV0IHNldFN0YXRlID0gUmVhY3QudXNlQ2FsbGJhY2sobmV3U3RhdGUgPT4ge1xuICAgIGlmICh2N19zdGFydFRyYW5zaXRpb24gJiYgc3RhcnRUcmFuc2l0aW9uSW1wbCkge1xuICAgICAgc3RhcnRUcmFuc2l0aW9uSW1wbCgoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U3RhdGVJbXBsKG5ld1N0YXRlKTtcbiAgICB9XG4gIH0sIFtzZXRTdGF0ZUltcGwsIHY3X3N0YXJ0VHJhbnNpdGlvbl0pO1xuXG4gIC8vIE5lZWQgdG8gdXNlIGEgbGF5b3V0IGVmZmVjdCBoZXJlIHNvIHdlIGFyZSBzdWJzY3JpYmVkIGVhcmx5IGVub3VnaCB0b1xuICAvLyBwaWNrIHVwIG9uIGFueSByZW5kZXItZHJpdmVuIHJlZGlyZWN0cy9uYXZpZ2F0aW9ucyAodXNlRWZmZWN0LzxOYXZpZ2F0ZT4pXG4gIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiByb3V0ZXIuc3Vic2NyaWJlKHNldFN0YXRlKSwgW3JvdXRlciwgc2V0U3RhdGVdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhmYWxsYmFja0VsZW1lbnQgPT0gbnVsbCB8fCAhcm91dGVyLmZ1dHVyZS52N19wYXJ0aWFsSHlkcmF0aW9uLCBcImA8Um91dGVyUHJvdmlkZXIgZmFsbGJhY2tFbGVtZW50PmAgaXMgZGVwcmVjYXRlZCB3aGVuIHVzaW5nIFwiICsgXCJgdjdfcGFydGlhbEh5ZHJhdGlvbmAsIHVzZSBhIGBIeWRyYXRlRmFsbGJhY2tgIGNvbXBvbmVudCBpbnN0ZWFkXCIpIDogdm9pZCAwO1xuICAgIC8vIE9ubHkgbG9nIHRoaXMgb25jZSBvbiBpbml0aWFsIG1vdW50XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG4gIGxldCBuYXZpZ2F0b3IgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY3JlYXRlSHJlZjogcm91dGVyLmNyZWF0ZUhyZWYsXG4gICAgICBlbmNvZGVMb2NhdGlvbjogcm91dGVyLmVuY29kZUxvY2F0aW9uLFxuICAgICAgZ286IG4gPT4gcm91dGVyLm5hdmlnYXRlKG4pLFxuICAgICAgcHVzaDogKHRvLCBzdGF0ZSwgb3B0cykgPT4gcm91dGVyLm5hdmlnYXRlKHRvLCB7XG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMucHJldmVudFNjcm9sbFJlc2V0XG4gICAgICB9KSxcbiAgICAgIHJlcGxhY2U6ICh0bywgc3RhdGUsIG9wdHMpID0+IHJvdXRlci5uYXZpZ2F0ZSh0bywge1xuICAgICAgICByZXBsYWNlOiB0cnVlLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLnByZXZlbnRTY3JvbGxSZXNldFxuICAgICAgfSlcbiAgICB9O1xuICB9LCBbcm91dGVyXSk7XG4gIGxldCBiYXNlbmFtZSA9IHJvdXRlci5iYXNlbmFtZSB8fCBcIi9cIjtcbiAgbGV0IGRhdGFSb3V0ZXJDb250ZXh0ID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJvdXRlcixcbiAgICBuYXZpZ2F0b3IsXG4gICAgc3RhdGljOiBmYWxzZSxcbiAgICBiYXNlbmFtZVxuICB9KSwgW3JvdXRlciwgbmF2aWdhdG9yLCBiYXNlbmFtZV0pO1xuXG4gIC8vIFRoZSBmcmFnbWVudCBhbmQge251bGx9IGhlcmUgYXJlIGltcG9ydGFudCEgIFdlIG5lZWQgdGhlbSB0byBrZWVwIFJlYWN0IDE4J3NcbiAgLy8gdXNlSWQgaGFwcHkgd2hlbiB3ZSBhcmUgc2VydmVyLXJlbmRlcmluZyBzaW5jZSB3ZSBtYXkgaGF2ZSBhIDxzY3JpcHQ+IGhlcmVcbiAgLy8gY29udGFpbmluZyB0aGUgaHlkcmF0ZWQgc2VydmVyLXNpZGUgc3RhdGljQ29udGV4dCAoZnJvbSBTdGF0aWNSb3V0ZXJQcm92aWRlcikuXG4gIC8vIHVzZUlkIHJlbGllcyBvbiB0aGUgY29tcG9uZW50IHRyZWUgc3RydWN0dXJlIHRvIGdlbmVyYXRlIGRldGVybWluaXN0aWMgaWQnc1xuICAvLyBzbyB3ZSBuZWVkIHRvIGVuc3VyZSBpdCByZW1haW5zIHRoZSBzYW1lIG9uIHRoZSBjbGllbnQgZXZlbiB0aG91Z2hcbiAgLy8gd2UgZG9uJ3QgbmVlZCB0aGUgPHNjcmlwdD4gdGFnXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGF0YVJvdXRlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZGF0YVJvdXRlckNvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGF0YVJvdXRlclN0YXRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBzdGF0ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXIsIHtcbiAgICBiYXNlbmFtZTogYmFzZW5hbWUsXG4gICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgIG5hdmlnYXRpb25UeXBlOiBzdGF0ZS5oaXN0b3J5QWN0aW9uLFxuICAgIG5hdmlnYXRvcjogbmF2aWdhdG9yLFxuICAgIGZ1dHVyZToge1xuICAgICAgdjdfcmVsYXRpdmVTcGxhdFBhdGg6IHJvdXRlci5mdXR1cmUudjdfcmVsYXRpdmVTcGxhdFBhdGhcbiAgICB9XG4gIH0sIHN0YXRlLmluaXRpYWxpemVkIHx8IHJvdXRlci5mdXR1cmUudjdfcGFydGlhbEh5ZHJhdGlvbiA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGFSb3V0ZXMsIHtcbiAgICByb3V0ZXM6IHJvdXRlci5yb3V0ZXMsXG4gICAgZnV0dXJlOiByb3V0ZXIuZnV0dXJlLFxuICAgIHN0YXRlOiBzdGF0ZVxuICB9KSA6IGZhbGxiYWNrRWxlbWVudCkpKSwgbnVsbCk7XG59XG5mdW5jdGlvbiBEYXRhUm91dGVzKF9yZWYyKSB7XG4gIGxldCB7XG4gICAgcm91dGVzLFxuICAgIGZ1dHVyZSxcbiAgICBzdGF0ZVxuICB9ID0gX3JlZjI7XG4gIHJldHVybiB1c2VSb3V0ZXNJbXBsKHJvdXRlcywgdW5kZWZpbmVkLCBzdGF0ZSwgZnV0dXJlKTtcbn1cbi8qKlxuICogQSBgPFJvdXRlcj5gIHRoYXQgc3RvcmVzIGFsbCBlbnRyaWVzIGluIG1lbW9yeS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3JvdXRlci1jb21wb25lbnRzL21lbW9yeS1yb3V0ZXJcbiAqL1xuZnVuY3Rpb24gTWVtb3J5Um91dGVyKF9yZWYzKSB7XG4gIGxldCB7XG4gICAgYmFzZW5hbWUsXG4gICAgY2hpbGRyZW4sXG4gICAgaW5pdGlhbEVudHJpZXMsXG4gICAgaW5pdGlhbEluZGV4LFxuICAgIGZ1dHVyZVxuICB9ID0gX3JlZjM7XG4gIGxldCBoaXN0b3J5UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGlmIChoaXN0b3J5UmVmLmN1cnJlbnQgPT0gbnVsbCkge1xuICAgIGhpc3RvcnlSZWYuY3VycmVudCA9IGNyZWF0ZU1lbW9yeUhpc3Rvcnkoe1xuICAgICAgaW5pdGlhbEVudHJpZXMsXG4gICAgICBpbml0aWFsSW5kZXgsXG4gICAgICB2NUNvbXBhdDogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGxldCBoaXN0b3J5ID0gaGlzdG9yeVJlZi5jdXJyZW50O1xuICBsZXQgW3N0YXRlLCBzZXRTdGF0ZUltcGxdID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIGFjdGlvbjogaGlzdG9yeS5hY3Rpb24sXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb25cbiAgfSk7XG4gIGxldCB7XG4gICAgdjdfc3RhcnRUcmFuc2l0aW9uXG4gIH0gPSBmdXR1cmUgfHwge307XG4gIGxldCBzZXRTdGF0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5ld1N0YXRlID0+IHtcbiAgICB2N19zdGFydFRyYW5zaXRpb24gJiYgc3RhcnRUcmFuc2l0aW9uSW1wbCA/IHN0YXJ0VHJhbnNpdGlvbkltcGwoKCkgPT4gc2V0U3RhdGVJbXBsKG5ld1N0YXRlKSkgOiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpO1xuICB9LCBbc2V0U3RhdGVJbXBsLCB2N19zdGFydFRyYW5zaXRpb25dKTtcbiAgUmVhY3QudXNlTGF5b3V0RWZmZWN0KCgpID0+IGhpc3RvcnkubGlzdGVuKHNldFN0YXRlKSwgW2hpc3RvcnksIHNldFN0YXRlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXIsIHtcbiAgICBiYXNlbmFtZTogYmFzZW5hbWUsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIGxvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICBuYXZpZ2F0aW9uVHlwZTogc3RhdGUuYWN0aW9uLFxuICAgIG5hdmlnYXRvcjogaGlzdG9yeSxcbiAgICBmdXR1cmU6IGZ1dHVyZVxuICB9KTtcbn1cbi8qKlxuICogQ2hhbmdlcyB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAqXG4gKiBOb3RlOiBUaGlzIEFQSSBpcyBtb3N0bHkgdXNlZnVsIGluIFJlYWN0LkNvbXBvbmVudCBzdWJjbGFzc2VzIHRoYXQgYXJlIG5vdFxuICogYWJsZSB0byB1c2UgaG9va3MuIEluIGZ1bmN0aW9uYWwgY29tcG9uZW50cywgd2UgcmVjb21tZW5kIHlvdSB1c2UgdGhlXG4gKiBgdXNlTmF2aWdhdGVgIGhvb2sgaW5zdGVhZC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2NvbXBvbmVudHMvbmF2aWdhdGVcbiAqL1xuZnVuY3Rpb24gTmF2aWdhdGUoX3JlZjQpIHtcbiAgbGV0IHtcbiAgICB0byxcbiAgICByZXBsYWNlLFxuICAgIHN0YXRlLFxuICAgIHJlbGF0aXZlXG4gIH0gPSBfcmVmNDtcbiAgIXVzZUluUm91dGVyQ29udGV4dCgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgLy8gVE9ETzogVGhpcyBlcnJvciBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZXkgc29tZWhvdyBoYXZlIDIgdmVyc2lvbnMgb2ZcbiAgLy8gdGhlIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgXCI8TmF2aWdhdGU+IG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGxldCB7XG4gICAgZnV0dXJlLFxuICAgIHN0YXRpYzogaXNTdGF0aWNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyghaXNTdGF0aWMsIFwiPE5hdmlnYXRlPiBtdXN0IG5vdCBiZSB1c2VkIG9uIHRoZSBpbml0aWFsIHJlbmRlciBpbiBhIDxTdGF0aWNSb3V0ZXI+LiBcIiArIFwiVGhpcyBpcyBhIG5vLW9wLCBidXQgeW91IHNob3VsZCBtb2RpZnkgeW91ciBjb2RlIHNvIHRoZSA8TmF2aWdhdGU+IGlzIFwiICsgXCJvbmx5IGV2ZXIgcmVuZGVyZWQgaW4gcmVzcG9uc2UgdG8gc29tZSB1c2VyIGludGVyYWN0aW9uIG9yIHN0YXRlIGNoYW5nZS5cIikgOiB2b2lkIDA7XG4gIGxldCB7XG4gICAgbWF0Y2hlc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQge1xuICAgIHBhdGhuYW1lOiBsb2NhdGlvblBhdGhuYW1lXG4gIH0gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuXG4gIC8vIFJlc29sdmUgdGhlIHBhdGggb3V0c2lkZSBvZiB0aGUgZWZmZWN0IHNvIHRoYXQgd2hlbiBlZmZlY3RzIHJ1biB0d2ljZSBpblxuICAvLyBTdHJpY3RNb2RlIHRoZXkgbmF2aWdhdGUgdG8gdGhlIHNhbWUgcGxhY2VcbiAgbGV0IHBhdGggPSByZXNvbHZlVG8odG8sIFVOU0FGRV9nZXRSZXNvbHZlVG9NYXRjaGVzKG1hdGNoZXMsIGZ1dHVyZS52N19yZWxhdGl2ZVNwbGF0UGF0aCksIGxvY2F0aW9uUGF0aG5hbWUsIHJlbGF0aXZlID09PSBcInBhdGhcIik7XG4gIGxldCBqc29uUGF0aCA9IEpTT04uc3RyaW5naWZ5KHBhdGgpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gbmF2aWdhdGUoSlNPTi5wYXJzZShqc29uUGF0aCksIHtcbiAgICByZXBsYWNlLFxuICAgIHN0YXRlLFxuICAgIHJlbGF0aXZlXG4gIH0pLCBbbmF2aWdhdGUsIGpzb25QYXRoLCByZWxhdGl2ZSwgcmVwbGFjZSwgc3RhdGVdKTtcbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIFJlbmRlcnMgdGhlIGNoaWxkIHJvdXRlJ3MgZWxlbWVudCwgaWYgdGhlcmUgaXMgb25lLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vY29tcG9uZW50cy9vdXRsZXRcbiAqL1xuZnVuY3Rpb24gT3V0bGV0KHByb3BzKSB7XG4gIHJldHVybiB1c2VPdXRsZXQocHJvcHMuY29udGV4dCk7XG59XG4vKipcbiAqIERlY2xhcmVzIGFuIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgYXQgYSBjZXJ0YWluIFVSTCBwYXRoLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vY29tcG9uZW50cy9yb3V0ZVxuICovXG5mdW5jdGlvbiBSb3V0ZShfcHJvcHMpIHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJBIDxSb3V0ZT4gaXMgb25seSBldmVyIHRvIGJlIHVzZWQgYXMgdGhlIGNoaWxkIG9mIDxSb3V0ZXM+IGVsZW1lbnQsIFwiICsgXCJuZXZlciByZW5kZXJlZCBkaXJlY3RseS4gUGxlYXNlIHdyYXAgeW91ciA8Um91dGU+IGluIGEgPFJvdXRlcz4uXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgO1xufVxuLyoqXG4gKiBQcm92aWRlcyBsb2NhdGlvbiBjb250ZXh0IGZvciB0aGUgcmVzdCBvZiB0aGUgYXBwLlxuICpcbiAqIE5vdGU6IFlvdSB1c3VhbGx5IHdvbid0IHJlbmRlciBhIGA8Um91dGVyPmAgZGlyZWN0bHkuIEluc3RlYWQsIHlvdSdsbCByZW5kZXIgYVxuICogcm91dGVyIHRoYXQgaXMgbW9yZSBzcGVjaWZpYyB0byB5b3VyIGVudmlyb25tZW50IHN1Y2ggYXMgYSBgPEJyb3dzZXJSb3V0ZXI+YFxuICogaW4gd2ViIGJyb3dzZXJzIG9yIGEgYDxTdGF0aWNSb3V0ZXI+YCBmb3Igc2VydmVyIHJlbmRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3JvdXRlci1jb21wb25lbnRzL3JvdXRlclxuICovXG5mdW5jdGlvbiBSb3V0ZXIoX3JlZjUpIHtcbiAgbGV0IHtcbiAgICBiYXNlbmFtZTogYmFzZW5hbWVQcm9wID0gXCIvXCIsXG4gICAgY2hpbGRyZW4gPSBudWxsLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvblByb3AsXG4gICAgbmF2aWdhdGlvblR5cGUgPSBBY3Rpb24uUG9wLFxuICAgIG5hdmlnYXRvcixcbiAgICBzdGF0aWM6IHN0YXRpY1Byb3AgPSBmYWxzZSxcbiAgICBmdXR1cmVcbiAgfSA9IF9yZWY1O1xuICAhIXVzZUluUm91dGVyQ29udGV4dCgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJZb3UgY2Fubm90IHJlbmRlciBhIDxSb3V0ZXI+IGluc2lkZSBhbm90aGVyIDxSb3V0ZXI+LlwiICsgXCIgWW91IHNob3VsZCBuZXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgaW4geW91ciBhcHAuXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgLy8gUHJlc2VydmUgdHJhaWxpbmcgc2xhc2hlcyBvbiBiYXNlbmFtZSwgc28gd2UgY2FuIGxldCB0aGUgdXNlciBjb250cm9sXG4gIC8vIHRoZSBlbmZvcmNlbWVudCBvZiB0cmFpbGluZyBzbGFzaGVzIHRocm91Z2hvdXQgdGhlIGFwcFxuICBsZXQgYmFzZW5hbWUgPSBiYXNlbmFtZVByb3AucmVwbGFjZSgvXlxcLyovLCBcIi9cIik7XG4gIGxldCBuYXZpZ2F0aW9uQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBiYXNlbmFtZSxcbiAgICBuYXZpZ2F0b3IsXG4gICAgc3RhdGljOiBzdGF0aWNQcm9wLFxuICAgIGZ1dHVyZTogX2V4dGVuZHMoe1xuICAgICAgdjdfcmVsYXRpdmVTcGxhdFBhdGg6IGZhbHNlXG4gICAgfSwgZnV0dXJlKVxuICB9KSwgW2Jhc2VuYW1lLCBmdXR1cmUsIG5hdmlnYXRvciwgc3RhdGljUHJvcF0pO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uUHJvcCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGxvY2F0aW9uUHJvcCA9IHBhcnNlUGF0aChsb2NhdGlvblByb3ApO1xuICB9XG4gIGxldCB7XG4gICAgcGF0aG5hbWUgPSBcIi9cIixcbiAgICBzZWFyY2ggPSBcIlwiLFxuICAgIGhhc2ggPSBcIlwiLFxuICAgIHN0YXRlID0gbnVsbCxcbiAgICBrZXkgPSBcImRlZmF1bHRcIlxuICB9ID0gbG9jYXRpb25Qcm9wO1xuICBsZXQgbG9jYXRpb25Db250ZXh0ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IHRyYWlsaW5nUGF0aG5hbWUgPSBzdHJpcEJhc2VuYW1lKHBhdGhuYW1lLCBiYXNlbmFtZSk7XG4gICAgaWYgKHRyYWlsaW5nUGF0aG5hbWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvbjoge1xuICAgICAgICBwYXRobmFtZTogdHJhaWxpbmdQYXRobmFtZSxcbiAgICAgICAgc2VhcmNoLFxuICAgICAgICBoYXNoLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAga2V5XG4gICAgICB9LFxuICAgICAgbmF2aWdhdGlvblR5cGVcbiAgICB9O1xuICB9LCBbYmFzZW5hbWUsIHBhdGhuYW1lLCBzZWFyY2gsIGhhc2gsIHN0YXRlLCBrZXksIG5hdmlnYXRpb25UeXBlXSk7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGxvY2F0aW9uQ29udGV4dCAhPSBudWxsLCBcIjxSb3V0ZXIgYmFzZW5hbWU9XFxcIlwiICsgYmFzZW5hbWUgKyBcIlxcXCI+IGlzIG5vdCBhYmxlIHRvIG1hdGNoIHRoZSBVUkwgXCIgKyAoXCJcXFwiXCIgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2ggKyBcIlxcXCIgYmVjYXVzZSBpdCBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBcIikgKyBcImJhc2VuYW1lLCBzbyB0aGUgPFJvdXRlcj4gd29uJ3QgcmVuZGVyIGFueXRoaW5nLlwiKSA6IHZvaWQgMDtcbiAgaWYgKGxvY2F0aW9uQ29udGV4dCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5hdmlnYXRpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG5hdmlnYXRpb25Db250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciwge1xuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICB2YWx1ZTogbG9jYXRpb25Db250ZXh0XG4gIH0pKTtcbn1cbi8qKlxuICogQSBjb250YWluZXIgZm9yIGEgbmVzdGVkIHRyZWUgb2YgYDxSb3V0ZT5gIGVsZW1lbnRzIHRoYXQgcmVuZGVycyB0aGUgYnJhbmNoXG4gKiB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2NvbXBvbmVudHMvcm91dGVzXG4gKi9cbmZ1bmN0aW9uIFJvdXRlcyhfcmVmNikge1xuICBsZXQge1xuICAgIGNoaWxkcmVuLFxuICAgIGxvY2F0aW9uXG4gIH0gPSBfcmVmNjtcbiAgcmV0dXJuIHVzZVJvdXRlcyhjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4pLCBsb2NhdGlvbik7XG59XG4vKipcbiAqIENvbXBvbmVudCB0byB1c2UgZm9yIHJlbmRlcmluZyBsYXppbHkgbG9hZGVkIGRhdGEgZnJvbSByZXR1cm5pbmcgZGVmZXIoKVxuICogaW4gYSBsb2FkZXIgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gQXdhaXQoX3JlZjcpIHtcbiAgbGV0IHtcbiAgICBjaGlsZHJlbixcbiAgICBlcnJvckVsZW1lbnQsXG4gICAgcmVzb2x2ZVxuICB9ID0gX3JlZjc7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBd2FpdEVycm9yQm91bmRhcnksIHtcbiAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgIGVycm9yRWxlbWVudDogZXJyb3JFbGVtZW50XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc29sdmVBd2FpdCwgbnVsbCwgY2hpbGRyZW4pKTtcbn1cbnZhciBBd2FpdFJlbmRlclN0YXR1cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoQXdhaXRSZW5kZXJTdGF0dXMpIHtcbiAgQXdhaXRSZW5kZXJTdGF0dXNbQXdhaXRSZW5kZXJTdGF0dXNbXCJwZW5kaW5nXCJdID0gMF0gPSBcInBlbmRpbmdcIjtcbiAgQXdhaXRSZW5kZXJTdGF0dXNbQXdhaXRSZW5kZXJTdGF0dXNbXCJzdWNjZXNzXCJdID0gMV0gPSBcInN1Y2Nlc3NcIjtcbiAgQXdhaXRSZW5kZXJTdGF0dXNbQXdhaXRSZW5kZXJTdGF0dXNbXCJlcnJvclwiXSA9IDJdID0gXCJlcnJvclwiO1xuICByZXR1cm4gQXdhaXRSZW5kZXJTdGF0dXM7XG59KEF3YWl0UmVuZGVyU3RhdHVzIHx8IHt9KTtcbmNvbnN0IG5ldmVyU2V0dGxlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgoKSA9PiB7fSk7XG5jbGFzcyBBd2FpdEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZXJyb3I6IG51bGxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JcbiAgICB9O1xuICB9XG4gIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBlcnJvckluZm8pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiPEF3YWl0PiBjYXVnaHQgdGhlIGZvbGxvd2luZyBlcnJvciBkdXJpbmcgcmVuZGVyXCIsIGVycm9yLCBlcnJvckluZm8pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBsZXQge1xuICAgICAgY2hpbGRyZW4sXG4gICAgICBlcnJvckVsZW1lbnQsXG4gICAgICByZXNvbHZlXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHByb21pc2UgPSBudWxsO1xuICAgIGxldCBzdGF0dXMgPSBBd2FpdFJlbmRlclN0YXR1cy5wZW5kaW5nO1xuICAgIGlmICghKHJlc29sdmUgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgLy8gRGlkbid0IGdldCBhIHByb21pc2UgLSBwcm92aWRlIGFzIGEgcmVzb2x2ZWQgcHJvbWlzZVxuICAgICAgc3RhdHVzID0gQXdhaXRSZW5kZXJTdGF0dXMuc3VjY2VzcztcbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl90cmFja2VkXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl9kYXRhXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIC8vIENhdWdodCBhIHJlbmRlciBlcnJvciwgcHJvdmlkZSBpdCBhcyBhIHJlamVjdGVkIHByb21pc2VcbiAgICAgIHN0YXR1cyA9IEF3YWl0UmVuZGVyU3RhdHVzLmVycm9yO1xuICAgICAgbGV0IHJlbmRlckVycm9yID0gdGhpcy5zdGF0ZS5lcnJvcjtcbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlamVjdCgpLmNhdGNoKCgpID0+IHt9KTsgLy8gQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbiB3YXJuaW5nc1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX3RyYWNrZWRcIiwge1xuICAgICAgICBnZXQ6ICgpID0+IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX2Vycm9yXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiByZW5kZXJFcnJvclxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyZXNvbHZlLl90cmFja2VkKSB7XG4gICAgICAvLyBBbHJlYWR5IHRyYWNrZWQgcHJvbWlzZSAtIGNoZWNrIGNvbnRlbnRzXG4gICAgICBwcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgIHN0YXR1cyA9IFwiX2Vycm9yXCIgaW4gcHJvbWlzZSA/IEF3YWl0UmVuZGVyU3RhdHVzLmVycm9yIDogXCJfZGF0YVwiIGluIHByb21pc2UgPyBBd2FpdFJlbmRlclN0YXR1cy5zdWNjZXNzIDogQXdhaXRSZW5kZXJTdGF0dXMucGVuZGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmF3ICh1bnRyYWNrZWQpIHByb21pc2UgLSB0cmFjayBpdFxuICAgICAgc3RhdHVzID0gQXdhaXRSZW5kZXJTdGF0dXMucGVuZGluZztcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNvbHZlLCBcIl90cmFja2VkXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHByb21pc2UgPSByZXNvbHZlLnRoZW4oZGF0YSA9PiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzb2x2ZSwgXCJfZGF0YVwiLCB7XG4gICAgICAgIGdldDogKCkgPT4gZGF0YVxuICAgICAgfSksIGVycm9yID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNvbHZlLCBcIl9lcnJvclwiLCB7XG4gICAgICAgIGdldDogKCkgPT4gZXJyb3JcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gQXdhaXRSZW5kZXJTdGF0dXMuZXJyb3IgJiYgcHJvbWlzZS5fZXJyb3IgaW5zdGFuY2VvZiBBYm9ydGVkRGVmZXJyZWRFcnJvcikge1xuICAgICAgLy8gRnJlZXplIHRoZSBVSSBieSB0aHJvd2luZyBhIG5ldmVyIHJlc29sdmVkIHByb21pc2VcbiAgICAgIHRocm93IG5ldmVyU2V0dGxlZFByb21pc2U7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IEF3YWl0UmVuZGVyU3RhdHVzLmVycm9yICYmICFlcnJvckVsZW1lbnQpIHtcbiAgICAgIC8vIE5vIGVycm9yRWxlbWVudCwgdGhyb3cgdG8gdGhlIG5lYXJlc3Qgcm91dGUtbGV2ZWwgZXJyb3IgYm91bmRhcnlcbiAgICAgIHRocm93IHByb21pc2UuX2Vycm9yO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSBBd2FpdFJlbmRlclN0YXR1cy5lcnJvcikge1xuICAgICAgLy8gUmVuZGVyIHZpYSBvdXIgZXJyb3JFbGVtZW50XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQXdhaXRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiBwcm9taXNlLFxuICAgICAgICBjaGlsZHJlbjogZXJyb3JFbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gQXdhaXRSZW5kZXJTdGF0dXMuc3VjY2Vzcykge1xuICAgICAgLy8gUmVuZGVyIGNoaWxkcmVuIHdpdGggcmVzb2x2ZWQgdmFsdWVcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBd2FpdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHByb21pc2UsXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhyb3cgdG8gdGhlIHN1c3BlbnNlIGJvdW5kYXJ5XG4gICAgdGhyb3cgcHJvbWlzZTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBJbmRpcmVjdGlvbiB0byBsZXZlcmFnZSB1c2VBc3luY1ZhbHVlIGZvciBhIHJlbmRlci1wcm9wIEFQSSBvbiBgPEF3YWl0PmBcbiAqL1xuZnVuY3Rpb24gUmVzb2x2ZUF3YWl0KF9yZWY4KSB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW5cbiAgfSA9IF9yZWY4O1xuICBsZXQgZGF0YSA9IHVzZUFzeW5jVmFsdWUoKTtcbiAgbGV0IHRvUmVuZGVyID0gdHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIgPyBjaGlsZHJlbihkYXRhKSA6IGNoaWxkcmVuO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHRvUmVuZGVyKTtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gVVRJTFNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBDcmVhdGVzIGEgcm91dGUgY29uZmlnIGZyb20gYSBSZWFjdCBcImNoaWxkcmVuXCIgb2JqZWN0LCB3aGljaCBpcyB1c3VhbGx5XG4gKiBlaXRoZXIgYSBgPFJvdXRlPmAgZWxlbWVudCBvciBhbiBhcnJheSBvZiB0aGVtLiBVc2VkIGludGVybmFsbHkgYnlcbiAqIGA8Um91dGVzPmAgdG8gY3JlYXRlIGEgcm91dGUgY29uZmlnIGZyb20gaXRzIGNoaWxkcmVuLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vdXRpbHMvY3JlYXRlLXJvdXRlcy1mcm9tLWNoaWxkcmVuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgcGFyZW50UGF0aCkge1xuICBpZiAocGFyZW50UGF0aCA9PT0gdm9pZCAwKSB7XG4gICAgcGFyZW50UGF0aCA9IFtdO1xuICB9XG4gIGxldCByb3V0ZXMgPSBbXTtcbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAvLyBJZ25vcmUgbm9uLWVsZW1lbnRzLiBUaGlzIGFsbG93cyBwZW9wbGUgdG8gbW9yZSBlYXNpbHkgaW5saW5lXG4gICAgICAvLyBjb25kaXRpb25hbHMgaW4gdGhlaXIgcm91dGUgY29uZmlnLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdHJlZVBhdGggPSBbLi4ucGFyZW50UGF0aCwgaW5kZXhdO1xuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJlYWN0LkZyYWdtZW50KSB7XG4gICAgICAvLyBUcmFuc3BhcmVudGx5IHN1cHBvcnQgUmVhY3QuRnJhZ21lbnQgYW5kIGl0cyBjaGlsZHJlbi5cbiAgICAgIHJvdXRlcy5wdXNoLmFwcGx5KHJvdXRlcywgY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuKGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIHRyZWVQYXRoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICEoZWxlbWVudC50eXBlID09PSBSb3V0ZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcIltcIiArICh0eXBlb2YgZWxlbWVudC50eXBlID09PSBcInN0cmluZ1wiID8gZWxlbWVudC50eXBlIDogZWxlbWVudC50eXBlLm5hbWUpICsgXCJdIGlzIG5vdCBhIDxSb3V0ZT4gY29tcG9uZW50LiBBbGwgY29tcG9uZW50IGNoaWxkcmVuIG9mIDxSb3V0ZXM+IG11c3QgYmUgYSA8Um91dGU+IG9yIDxSZWFjdC5GcmFnbWVudD5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAhKCFlbGVtZW50LnByb3BzLmluZGV4IHx8ICFlbGVtZW50LnByb3BzLmNoaWxkcmVuKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiQW4gaW5kZXggcm91dGUgY2Fubm90IGhhdmUgY2hpbGQgcm91dGVzLlwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGxldCByb3V0ZSA9IHtcbiAgICAgIGlkOiBlbGVtZW50LnByb3BzLmlkIHx8IHRyZWVQYXRoLmpvaW4oXCItXCIpLFxuICAgICAgY2FzZVNlbnNpdGl2ZTogZWxlbWVudC5wcm9wcy5jYXNlU2Vuc2l0aXZlLFxuICAgICAgZWxlbWVudDogZWxlbWVudC5wcm9wcy5lbGVtZW50LFxuICAgICAgQ29tcG9uZW50OiBlbGVtZW50LnByb3BzLkNvbXBvbmVudCxcbiAgICAgIGluZGV4OiBlbGVtZW50LnByb3BzLmluZGV4LFxuICAgICAgcGF0aDogZWxlbWVudC5wcm9wcy5wYXRoLFxuICAgICAgbG9hZGVyOiBlbGVtZW50LnByb3BzLmxvYWRlcixcbiAgICAgIGFjdGlvbjogZWxlbWVudC5wcm9wcy5hY3Rpb24sXG4gICAgICBlcnJvckVsZW1lbnQ6IGVsZW1lbnQucHJvcHMuZXJyb3JFbGVtZW50LFxuICAgICAgRXJyb3JCb3VuZGFyeTogZWxlbWVudC5wcm9wcy5FcnJvckJvdW5kYXJ5LFxuICAgICAgaGFzRXJyb3JCb3VuZGFyeTogZWxlbWVudC5wcm9wcy5FcnJvckJvdW5kYXJ5ICE9IG51bGwgfHwgZWxlbWVudC5wcm9wcy5lcnJvckVsZW1lbnQgIT0gbnVsbCxcbiAgICAgIHNob3VsZFJldmFsaWRhdGU6IGVsZW1lbnQucHJvcHMuc2hvdWxkUmV2YWxpZGF0ZSxcbiAgICAgIGhhbmRsZTogZWxlbWVudC5wcm9wcy5oYW5kbGUsXG4gICAgICBsYXp5OiBlbGVtZW50LnByb3BzLmxhenlcbiAgICB9O1xuICAgIGlmIChlbGVtZW50LnByb3BzLmNoaWxkcmVuKSB7XG4gICAgICByb3V0ZS5jaGlsZHJlbiA9IGNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbihlbGVtZW50LnByb3BzLmNoaWxkcmVuLCB0cmVlUGF0aCk7XG4gICAgfVxuICAgIHJvdXRlcy5wdXNoKHJvdXRlKTtcbiAgfSk7XG4gIHJldHVybiByb3V0ZXM7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgcmVzdWx0IG9mIGBtYXRjaFJvdXRlcygpYCBpbnRvIGEgUmVhY3QgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHJldHVybiBfcmVuZGVyTWF0Y2hlcyhtYXRjaGVzKTtcbn1cblxuZnVuY3Rpb24gbWFwUm91dGVQcm9wZXJ0aWVzKHJvdXRlKSB7XG4gIGxldCB1cGRhdGVzID0ge1xuICAgIC8vIE5vdGU6IHRoaXMgY2hlY2sgYWxzbyBvY2N1cnMgaW4gY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuIHNvIHVwZGF0ZVxuICAgIC8vIHRoZXJlIGlmIHlvdSBjaGFuZ2UgdGhpcyAtLSBwbGVhc2UgYW5kIHRoYW5rIHlvdSFcbiAgICBoYXNFcnJvckJvdW5kYXJ5OiByb3V0ZS5FcnJvckJvdW5kYXJ5ICE9IG51bGwgfHwgcm91dGUuZXJyb3JFbGVtZW50ICE9IG51bGxcbiAgfTtcbiAgaWYgKHJvdXRlLkNvbXBvbmVudCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmIChyb3V0ZS5lbGVtZW50KSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGZhbHNlLCBcIllvdSBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBgQ29tcG9uZW50YCBhbmQgYGVsZW1lbnRgIG9uIHlvdXIgcm91dGUgLSBcIiArIFwiYENvbXBvbmVudGAgd2lsbCBiZSB1c2VkLlwiKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih1cGRhdGVzLCB7XG4gICAgICBlbGVtZW50OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChyb3V0ZS5Db21wb25lbnQpLFxuICAgICAgQ29tcG9uZW50OiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfVxuICBpZiAocm91dGUuSHlkcmF0ZUZhbGxiYWNrKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKHJvdXRlLmh5ZHJhdGVGYWxsYmFja0VsZW1lbnQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcoZmFsc2UsIFwiWW91IHNob3VsZCBub3QgaW5jbHVkZSBib3RoIGBIeWRyYXRlRmFsbGJhY2tgIGFuZCBgaHlkcmF0ZUZhbGxiYWNrRWxlbWVudGAgb24geW91ciByb3V0ZSAtIFwiICsgXCJgSHlkcmF0ZUZhbGxiYWNrYCB3aWxsIGJlIHVzZWQuXCIpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHVwZGF0ZXMsIHtcbiAgICAgIGh5ZHJhdGVGYWxsYmFja0VsZW1lbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KHJvdXRlLkh5ZHJhdGVGYWxsYmFjayksXG4gICAgICBIeWRyYXRlRmFsbGJhY2s6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9XG4gIGlmIChyb3V0ZS5FcnJvckJvdW5kYXJ5KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKHJvdXRlLmVycm9yRWxlbWVudCkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhmYWxzZSwgXCJZb3Ugc2hvdWxkIG5vdCBpbmNsdWRlIGJvdGggYEVycm9yQm91bmRhcnlgIGFuZCBgZXJyb3JFbGVtZW50YCBvbiB5b3VyIHJvdXRlIC0gXCIgKyBcImBFcnJvckJvdW5kYXJ5YCB3aWxsIGJlIHVzZWQuXCIpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHVwZGF0ZXMsIHtcbiAgICAgIGVycm9yRWxlbWVudDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQocm91dGUuRXJyb3JCb3VuZGFyeSksXG4gICAgICBFcnJvckJvdW5kYXJ5OiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdXBkYXRlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVJvdXRlcihyb3V0ZXMsIG9wdHMpIHtcbiAgcmV0dXJuIGNyZWF0ZVJvdXRlcih7XG4gICAgYmFzZW5hbWU6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuYmFzZW5hbWUsXG4gICAgZnV0dXJlOiBfZXh0ZW5kcyh7fSwgb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5mdXR1cmUsIHtcbiAgICAgIHY3X3ByZXBlbmRCYXNlbmFtZTogdHJ1ZVxuICAgIH0pLFxuICAgIGhpc3Rvcnk6IGNyZWF0ZU1lbW9yeUhpc3Rvcnkoe1xuICAgICAgaW5pdGlhbEVudHJpZXM6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuaW5pdGlhbEVudHJpZXMsXG4gICAgICBpbml0aWFsSW5kZXg6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuaW5pdGlhbEluZGV4XG4gICAgfSksXG4gICAgaHlkcmF0aW9uRGF0YTogb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5oeWRyYXRpb25EYXRhLFxuICAgIHJvdXRlcyxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXMsXG4gICAgdW5zdGFibGVfZGF0YVN0cmF0ZWd5OiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLnVuc3RhYmxlX2RhdGFTdHJhdGVneSxcbiAgICB1bnN0YWJsZV9wYXRjaFJvdXRlc09uTmF2aWdhdGlvbjogb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy51bnN0YWJsZV9wYXRjaFJvdXRlc09uTmF2aWdhdGlvblxuICB9KS5pbml0aWFsaXplKCk7XG59XG5cbmV4cG9ydCB7IEF3YWl0LCBNZW1vcnlSb3V0ZXIsIE5hdmlnYXRlLCBPdXRsZXQsIFJvdXRlLCBSb3V0ZXIsIFJvdXRlclByb3ZpZGVyLCBSb3V0ZXMsIERhdGFSb3V0ZXJDb250ZXh0IGFzIFVOU0FGRV9EYXRhUm91dGVyQ29udGV4dCwgRGF0YVJvdXRlclN0YXRlQ29udGV4dCBhcyBVTlNBRkVfRGF0YVJvdXRlclN0YXRlQ29udGV4dCwgTG9jYXRpb25Db250ZXh0IGFzIFVOU0FGRV9Mb2NhdGlvbkNvbnRleHQsIE5hdmlnYXRpb25Db250ZXh0IGFzIFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCwgUm91dGVDb250ZXh0IGFzIFVOU0FGRV9Sb3V0ZUNvbnRleHQsIG1hcFJvdXRlUHJvcGVydGllcyBhcyBVTlNBRkVfbWFwUm91dGVQcm9wZXJ0aWVzLCB1c2VSb3V0ZUlkIGFzIFVOU0FGRV91c2VSb3V0ZUlkLCB1c2VSb3V0ZXNJbXBsIGFzIFVOU0FGRV91c2VSb3V0ZXNJbXBsLCBjcmVhdGVNZW1vcnlSb3V0ZXIsIGNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbiwgY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuIGFzIGNyZWF0ZVJvdXRlc0Zyb21FbGVtZW50cywgcmVuZGVyTWF0Y2hlcywgdXNlQWN0aW9uRGF0YSwgdXNlQXN5bmNFcnJvciwgdXNlQXN5bmNWYWx1ZSwgdXNlQmxvY2tlciwgdXNlSHJlZiwgdXNlSW5Sb3V0ZXJDb250ZXh0LCB1c2VMb2FkZXJEYXRhLCB1c2VMb2NhdGlvbiwgdXNlTWF0Y2gsIHVzZU1hdGNoZXMsIHVzZU5hdmlnYXRlLCB1c2VOYXZpZ2F0aW9uLCB1c2VOYXZpZ2F0aW9uVHlwZSwgdXNlT3V0bGV0LCB1c2VPdXRsZXRDb250ZXh0LCB1c2VQYXJhbXMsIHVzZVJlc29sdmVkUGF0aCwgdXNlUmV2YWxpZGF0b3IsIHVzZVJvdXRlRXJyb3IsIHVzZVJvdXRlTG9hZGVyRGF0YSwgdXNlUm91dGVzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBHYWxhZHJpbSBGZWVkYmFjayBBUElcbiAqIEFQSSBmb3IgR2FsYWRyaW0gRmVlZGJhY2ssIGEgZmVlZGJhY2sgcGxhdGZvcm0gZm9yIEdhbGFkcmltIHByb2plY3RzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAxLjBcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbic7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB0eXBlIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlLCBSYXdBeGlvc1JlcXVlc3RDb25maWcgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgZ2xvYmFsQXhpb3MgZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwOi8vbG9jYWxob3N0XCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWc7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCA/PyBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBSZXF1aXJlZEVycm9yXG4gKiBAZXh0ZW5kcyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1aXJlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBmaWVsZDogc3RyaW5nLCBtc2c/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobXNnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSZXF1aXJlZEVycm9yXCJcbiAgICB9XG59XG5cbmludGVyZmFjZSBTZXJ2ZXJNYXAge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgICAgdXJsOiBzdHJpbmcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgfVtdO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBvcGVyYXRpb25TZXJ2ZXJNYXA6IFNlcnZlck1hcCA9IHtcbn1cbiIsIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBHYWxhZHJpbSBGZWVkYmFjayBBUElcbiAqIEFQSSBmb3IgR2FsYWRyaW0gRmVlZGJhY2ssIGEgZmVlZGJhY2sgcGxhdGZvcm0gZm9yIEdhbGFkcmltIHByb2plY3RzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAxLjBcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IEF4aW9zSW5zdGFuY2UsIEF4aW9zUmVzcG9uc2UgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBSZXF1aXJlZEVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldEZsYXR0ZW5lZFF1ZXJ5UGFyYW1zKHVybFNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zLCBwYXJhbWV0ZXI6IGFueSwga2V5OiBzdHJpbmcgPSBcIlwiKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtZXRlciA9PSBudWxsKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXIgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1ldGVyKSkge1xuICAgICAgICAgICAgKHBhcmFtZXRlciBhcyBhbnlbXSkuZm9yRWFjaChpdGVtID0+IHNldEZsYXR0ZW5lZFF1ZXJ5UGFyYW1zKHVybFNlYXJjaFBhcmFtcywgaXRlbSwga2V5KSk7XG4gICAgICAgIH0gXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyYW1ldGVyKS5mb3JFYWNoKGN1cnJlbnRLZXkgPT4gXG4gICAgICAgICAgICAgICAgc2V0RmxhdHRlbmVkUXVlcnlQYXJhbXModXJsU2VhcmNoUGFyYW1zLCBwYXJhbWV0ZXJbY3VycmVudEtleV0sIGAke2tleX0ke2tleSAhPT0gJycgPyAnLicgOiAnJ30ke2N1cnJlbnRLZXl9YClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IFxuICAgIGVsc2Uge1xuICAgICAgICBpZiAodXJsU2VhcmNoUGFyYW1zLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB1cmxTZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgcGFyYW1ldGVyKTtcbiAgICAgICAgfSBcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cmxTZWFyY2hQYXJhbXMuc2V0KGtleSwgcGFyYW1ldGVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0U2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHVybDogVVJMLCAuLi5vYmplY3RzOiBhbnlbXSkge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgc2V0RmxhdHRlbmVkUXVlcnlQYXJhbXMoc2VhcmNoUGFyYW1zLCBvYmplY3RzKTtcbiAgICB1cmwuc2VhcmNoID0gc2VhcmNoUGFyYW1zLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCA9IGZ1bmN0aW9uICh2YWx1ZTogYW55LCByZXF1ZXN0T3B0aW9uczogYW55LCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IG5vblN0cmluZyA9IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZyc7XG4gICAgY29uc3QgbmVlZHNTZXJpYWxpemF0aW9uID0gbm9uU3RyaW5nICYmIGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5pc0pzb25NaW1lXG4gICAgICAgID8gY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKHJlcXVlc3RPcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKVxuICAgICAgICA6IG5vblN0cmluZztcbiAgICByZXR1cm4gbmVlZHNTZXJpYWxpemF0aW9uXG4gICAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pXG4gICAgICAgIDogKHZhbHVlIHx8IFwiXCIpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCB0b1BhdGhTdHJpbmcgPSBmdW5jdGlvbiAodXJsOiBVUkwpIHtcbiAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaCArIHVybC5oYXNoXG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiA9IGZ1bmN0aW9uIChheGlvc0FyZ3M6IFJlcXVlc3RBcmdzLCBnbG9iYWxBeGlvczogQXhpb3NJbnN0YW5jZSwgQkFTRV9QQVRIOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIDxUID0gdW5rbm93biwgUiA9IEF4aW9zUmVzcG9uc2U8VD4+KGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MsIGJhc2VQYXRoOiBzdHJpbmcgPSBCQVNFX1BBVEgpID0+IHtcbiAgICAgICAgY29uc3QgYXhpb3NSZXF1ZXN0QXJncyA9IHsuLi5heGlvc0FyZ3Mub3B0aW9ucywgdXJsOiAoYXhpb3MuZGVmYXVsdHMuYmFzZVVSTCA/ICcnIDogY29uZmlndXJhdGlvbj8uYmFzZVBhdGggPz8gYmFzZVBhdGgpICsgYXhpb3NBcmdzLnVybH07XG4gICAgICAgIHJldHVybiBheGlvcy5yZXF1ZXN0PFQsIFI+KGF4aW9zUmVxdWVzdEFyZ3MpO1xuICAgIH07XG59XG4iLCIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogR2FsYWRyaW0gRmVlZGJhY2sgQVBJXG4gKiBBUEkgZm9yIEdhbGFkcmltIEZlZWRiYWNrLCBhIGZlZWRiYWNrIHBsYXRmb3JtIGZvciBHYWxhZHJpbSBwcm9qZWN0cy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMS4wXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UsIFJhd0F4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCBnbG9iYWxBeGlvcyBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEFyZ3MgfSBmcm9tICcuL2Jhc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMsIEJhc2VBUEksIFJlcXVpcmVkRXJyb3IsIG9wZXJhdGlvblNlcnZlck1hcCB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbGxhYm9yYXRpb25zUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3VzZXJJZCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3Byb2plY3RJZCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvamVjdFJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3Byb2plY3QnOiBQcm9qZWN0UmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29sbGFib3JhdGlvbnNSZXNwb25zZVxuICAgICAqL1xuICAgICdyb2xlJzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmVlZGJhY2tDcmVhdGVEdG9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZWVkYmFja0NyZWF0ZUR0byB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tDcmVhdGVEdG9cbiAgICAgKi9cbiAgICAnZWxlbWVudElkJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQ3JlYXRlRHRvXG4gICAgICovXG4gICAgJ2VsZW1lbnRJbmRleCc6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja0NyZWF0ZUR0b1xuICAgICAqL1xuICAgICdlbGVtZW50V2lkdGgnOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tDcmVhdGVEdG9cbiAgICAgKi9cbiAgICAnZWxlbWVudEhlaWdodCc6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja0NyZWF0ZUR0b1xuICAgICAqL1xuICAgICd4JzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQ3JlYXRlRHRvXG4gICAgICovXG4gICAgJ3knOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tDcmVhdGVEdG9cbiAgICAgKi9cbiAgICAnY29tbWVudCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja0NyZWF0ZUR0b1xuICAgICAqL1xuICAgICdwYXRoJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQ3JlYXRlRHRvXG4gICAgICovXG4gICAgJ3Byb2plY3RJZCc6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZlZWRiYWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZWVkYmFja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ2lkJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnY3JlYXRlZEF0Jzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAndXBkYXRlZEF0Jzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZWxlbWVudElkJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZWxlbWVudEluZGV4JzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZWxlbWVudFdpZHRoJzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZWxlbWVudEhlaWdodCc6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3gnOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tSZXNwb25zZVxuICAgICAqL1xuICAgICd5JzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ2lzUmVzb2x2ZWQnOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnY29tbWVudCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3BhdGgnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFJlcGx5UmVzcG9uc2U+fVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3JlcGxpZXMnOiBBcnJheTxSZXBseVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlclN1bW1hcnlSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tSZXNwb25zZVxuICAgICAqL1xuICAgICd1c2VyJzogVXNlclN1bW1hcnlSZXNwb25zZTtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZlZWRiYWNrVXBkYXRlRHRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVlZGJhY2tVcGRhdGVEdG8ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ2VsZW1lbnRJZCc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tVcGRhdGVEdG9cbiAgICAgKi9cbiAgICAnZWxlbWVudEluZGV4Jz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1VwZGF0ZUR0b1xuICAgICAqL1xuICAgICdlbGVtZW50V2lkdGgnPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ2VsZW1lbnRIZWlnaHQnPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ3gnPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ3knPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ2NvbW1lbnQnPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ3BhdGgnPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ3Byb2plY3RJZCc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ2lzUmVzb2x2ZWQnOiBib29sZWFuO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvamVjdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICAnaWQnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvamVjdFJlc3BvbnNlXG4gICAgICovXG4gICAgJ25hbWUnOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXBseVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbHlSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVwbHlSZXNwb25zZVxuICAgICAqL1xuICAgICdpZCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXBseVJlc3BvbnNlXG4gICAgICovXG4gICAgJ2NyZWF0ZWRBdCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXBseVJlc3BvbnNlXG4gICAgICovXG4gICAgJ3VwZGF0ZWRBdCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXBseVJlc3BvbnNlXG4gICAgICovXG4gICAgJ2ZlZWRiYWNrSWQnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVwbHlSZXNwb25zZVxuICAgICAqL1xuICAgICd1c2VySWQnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVwbHlSZXNwb25zZVxuICAgICAqL1xuICAgICdjb21tZW50Jzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3VtbWFyeVJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZXBseVJlc3BvbnNlXG4gICAgICovXG4gICAgJ3VzZXInOiBVc2VyU3VtbWFyeVJlc3BvbnNlO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbkluRHRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluRHRvIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduSW5EdG9cbiAgICAgKi9cbiAgICAnZW1haWwnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbkluRHRvXG4gICAgICovXG4gICAgJ3Bhc3N3b3JkJzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbkluUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduSW5SZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbkluUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnYWNjZXNzVG9rZW4nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbkluUmVzcG9uc2VcbiAgICAgKi9cbiAgICAncmVmcmVzaFRva2VuJzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnblVwRHRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblVwRHRvIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduVXBEdG9cbiAgICAgKi9cbiAgICAnZW1haWwnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnblVwRHRvXG4gICAgICovXG4gICAgJ3Bhc3N3b3JkJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25VcER0b1xuICAgICAqL1xuICAgICdmaXJzdE5hbWUnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnblVwRHRvXG4gICAgICovXG4gICAgJ2xhc3ROYW1lJzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnblVwUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduVXBSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnblVwUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnYWNjZXNzVG9rZW4nOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyU3VtbWFyeVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclN1bW1hcnlSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclN1bW1hcnlSZXNwb25zZVxuICAgICAqL1xuICAgICdpZCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyU3VtbWFyeVJlc3BvbnNlXG4gICAgICovXG4gICAgJ2VtYWlsJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJTdW1tYXJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZmlyc3ROYW1lJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJTdW1tYXJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICAnbGFzdE5hbWUnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclN1bW1hcnlSZXNwb25zZVxuICAgICAqL1xuICAgICdmdWxsTmFtZSc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyU3VtbWFyeVJlc3BvbnNlXG4gICAgICovXG4gICAgJ2F2YXRhclVybCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29sbGFib3JhdGlvbnNSZXNwb25zZT59XG4gICAgICogQG1lbWJlcm9mIFVzZXJTdW1tYXJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICAnY29sbGFib3JhdGlvbnMnOiBBcnJheTxDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlPjtcbn1cblxuLyoqXG4gKiBBcHBBcGkgLSBheGlvcyBwYXJhbWV0ZXIgY3JlYXRvclxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQXBwQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBDb250cm9sbGVyR2V0SGVsbG86IGFzeW5jIChvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIEFwcEFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBBcHBBcGlGcCA9IGZ1bmN0aW9uKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvciA9IEFwcEFwaUF4aW9zUGFyYW1DcmVhdG9yKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXBwQ29udHJvbGxlckdldEhlbGxvKG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8dm9pZD4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hcHBDb250cm9sbGVyR2V0SGVsbG8ob3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4ID0gY29uZmlndXJhdGlvbj8uc2VydmVySW5kZXggPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggPSBvcGVyYXRpb25TZXJ2ZXJNYXBbJ0FwcEFwaS5hcHBDb250cm9sbGVyR2V0SGVsbG8nXT8uW2xvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXhdPy51cmw7XG4gICAgICAgICAgICByZXR1cm4gKGF4aW9zLCBiYXNlUGF0aCkgPT4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKShheGlvcywgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCB8fCBiYXNlUGF0aCk7XG4gICAgICAgIH0sXG4gICAgfVxufTtcblxuLyoqXG4gKiBBcHBBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQXBwQXBpRmFjdG9yeSA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbiwgYmFzZVBhdGg/OiBzdHJpbmcsIGF4aW9zPzogQXhpb3NJbnN0YW5jZSkge1xuICAgIGNvbnN0IGxvY2FsVmFyRnAgPSBBcHBBcGlGcChjb25maWd1cmF0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcENvbnRyb2xsZXJHZXRIZWxsbyhvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFwcENvbnRyb2xsZXJHZXRIZWxsbyhvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgIH07XG59O1xuXG4vKipcbiAqIEFwcEFwaSAtIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBBcHBBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgQXBwQXBpIGV4dGVuZHMgQmFzZUFQSSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBcHBBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwQ29udHJvbGxlckdldEhlbGxvKG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIEFwcEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXBwQ29udHJvbGxlckdldEhlbGxvKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cbn1cblxuXG5cbi8qKlxuICogQXV0aEFwaSAtIGF4aW9zIHBhcmFtZXRlciBjcmVhdG9yXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBBdXRoQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWRpcmVjdFVybCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhDb250cm9sbGVyR2l0aHViQ2FsbGJhY2s6IGFzeW5jIChyZWRpcmVjdFVybDogc3RyaW5nLCBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlZGlyZWN0VXJsJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhdXRoQ29udHJvbGxlckdpdGh1YkNhbGxiYWNrJywgJ3JlZGlyZWN0VXJsJywgcmVkaXJlY3RVcmwpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2F1dGgvZ2l0aHViL2NhbGxiYWNrYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgaWYgKHJlZGlyZWN0VXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyWydyZWRpcmVjdFVybCddID0gcmVkaXJlY3RVcmw7XG4gICAgICAgICAgICB9XG5cblxuICAgIFxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhDb250cm9sbGVyR2l0aHViTG9naW46IGFzeW5jIChvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXV0aC9naXRodWJgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbkluRHRvfSBzaWduSW5EdG8gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoQ29udHJvbGxlclNpZ25JbjogYXN5bmMgKHNpZ25JbkR0bzogU2lnbkluRHRvLCBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25JbkR0bycgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXV0aENvbnRyb2xsZXJTaWduSW4nLCAnc2lnbkluRHRvJywgc2lnbkluRHRvKVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hdXRoL3NpZ25pbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduSW5EdG8sIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7U2lnblVwRHRvfSBzaWduVXBEdG8gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoQ29udHJvbGxlclNpZ25VcDogYXN5bmMgKHNpZ25VcER0bzogU2lnblVwRHRvLCBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25VcER0bycgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXV0aENvbnRyb2xsZXJTaWduVXAnLCAnc2lnblVwRHRvJywgc2lnblVwRHRvKVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hdXRoL3NpZ251cGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduVXBEdG8sIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogQXV0aEFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBBdXRoQXBpRnAgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IgPSBBdXRoQXBpQXhpb3NQYXJhbUNyZWF0b3IoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWRpcmVjdFVybCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhDb250cm9sbGVyR2l0aHViQ2FsbGJhY2socmVkaXJlY3RVcmw6IHN0cmluZywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmF1dGhDb250cm9sbGVyR2l0aHViQ2FsbGJhY2socmVkaXJlY3RVcmwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleCA9IGNvbmZpZ3VyYXRpb24/LnNlcnZlckluZGV4ID8/IDA7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoID0gb3BlcmF0aW9uU2VydmVyTWFwWydBdXRoQXBpLmF1dGhDb250cm9sbGVyR2l0aHViQ2FsbGJhY2snXT8uW2xvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXhdPy51cmw7XG4gICAgICAgICAgICByZXR1cm4gKGF4aW9zLCBiYXNlUGF0aCkgPT4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKShheGlvcywgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCB8fCBiYXNlUGF0aCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhDb250cm9sbGVyR2l0aHViTG9naW4ob3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmF1dGhDb250cm9sbGVyR2l0aHViTG9naW4ob3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4ID0gY29uZmlndXJhdGlvbj8uc2VydmVySW5kZXggPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggPSBvcGVyYXRpb25TZXJ2ZXJNYXBbJ0F1dGhBcGkuYXV0aENvbnRyb2xsZXJHaXRodWJMb2dpbiddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25JbkR0b30gc2lnbkluRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXV0aENvbnRyb2xsZXJTaWduSW4oc2lnbkluRHRvOiBTaWduSW5EdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbkluUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXV0aENvbnRyb2xsZXJTaWduSW4oc2lnbkluRHRvLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXggPSBjb25maWd1cmF0aW9uPy5zZXJ2ZXJJbmRleCA/PyAwO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCA9IG9wZXJhdGlvblNlcnZlck1hcFsnQXV0aEFwaS5hdXRoQ29udHJvbGxlclNpZ25JbiddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25VcER0b30gc2lnblVwRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXV0aENvbnRyb2xsZXJTaWduVXAoc2lnblVwRHRvOiBTaWduVXBEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnblVwUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXV0aENvbnRyb2xsZXJTaWduVXAoc2lnblVwRHRvLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXggPSBjb25maWd1cmF0aW9uPy5zZXJ2ZXJJbmRleCA/PyAwO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCA9IG9wZXJhdGlvblNlcnZlck1hcFsnQXV0aEFwaS5hdXRoQ29udHJvbGxlclNpZ25VcCddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIEF1dGhBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQXV0aEFwaUZhY3RvcnkgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24sIGJhc2VQYXRoPzogc3RyaW5nLCBheGlvcz86IEF4aW9zSW5zdGFuY2UpIHtcbiAgICBjb25zdCBsb2NhbFZhckZwID0gQXV0aEFwaUZwKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVkaXJlY3RVcmwgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoQ29udHJvbGxlckdpdGh1YkNhbGxiYWNrKHJlZGlyZWN0VXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXV0aENvbnRyb2xsZXJHaXRodWJDYWxsYmFjayhyZWRpcmVjdFVybCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aENvbnRyb2xsZXJHaXRodWJMb2dpbihvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmF1dGhDb250cm9sbGVyR2l0aHViTG9naW4ob3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25JbkR0b30gc2lnbkluRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aENvbnRyb2xsZXJTaWduSW4oc2lnbkluRHRvOiBTaWduSW5EdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2U8U2lnbkluUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmF1dGhDb250cm9sbGVyU2lnbkluKHNpZ25JbkR0bywgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25VcER0b30gc2lnblVwRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aENvbnRyb2xsZXJTaWduVXAoc2lnblVwRHRvOiBTaWduVXBEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2U8U2lnblVwUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmF1dGhDb250cm9sbGVyU2lnblVwKHNpZ25VcER0bywgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICB9O1xufTtcblxuLyoqXG4gKiBBdXRoQXBpIC0gb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZVxuICogQGV4cG9ydFxuICogQGNsYXNzIEF1dGhBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgQXV0aEFwaSBleHRlbmRzIEJhc2VBUEkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWRpcmVjdFVybCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEF1dGhBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0aENvbnRyb2xsZXJHaXRodWJDYWxsYmFjayhyZWRpcmVjdFVybDogc3RyaW5nLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBBdXRoQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoQ29udHJvbGxlckdpdGh1YkNhbGxiYWNrKHJlZGlyZWN0VXJsLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEF1dGhBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0aENvbnRyb2xsZXJHaXRodWJMb2dpbihvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBBdXRoQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoQ29udHJvbGxlckdpdGh1YkxvZ2luKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7U2lnbkluRHRvfSBzaWduSW5EdG8gXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoQXBpXG4gICAgICovXG4gICAgcHVibGljIGF1dGhDb250cm9sbGVyU2lnbkluKHNpZ25JbkR0bzogU2lnbkluRHRvLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBBdXRoQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoQ29udHJvbGxlclNpZ25JbihzaWduSW5EdG8sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7U2lnblVwRHRvfSBzaWduVXBEdG8gXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoQXBpXG4gICAgICovXG4gICAgcHVibGljIGF1dGhDb250cm9sbGVyU2lnblVwKHNpZ25VcER0bzogU2lnblVwRHRvLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBBdXRoQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoQ29udHJvbGxlclNpZ25VcChzaWduVXBEdG8sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cbn1cblxuXG5cbi8qKlxuICogRmVlZGJhY2tBcGkgLSBheGlvcyBwYXJhbWV0ZXIgY3JlYXRvclxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgRmVlZGJhY2tBcGlBeGlvc1BhcmFtQ3JlYXRvciA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtGZWVkYmFja0NyZWF0ZUR0b30gZmVlZGJhY2tDcmVhdGVEdG8gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZWVkYmFja0NvbnRyb2xsZXJDcmVhdGU6IGFzeW5jIChmZWVkYmFja0NyZWF0ZUR0bzogRmVlZGJhY2tDcmVhdGVEdG8sIG9wdGlvbnM6IFJhd0F4aW9zUmVxdWVzdENvbmZpZyA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZmVlZGJhY2tDcmVhdGVEdG8nIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZScsICdmZWVkYmFja0NyZWF0ZUR0bycsIGZlZWRiYWNrQ3JlYXRlRHRvKVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZWVkYmFja2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChmZWVkYmFja0NyZWF0ZUR0bywgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZVJlcGx5OiBhc3luYyAoaWQ6IHN0cmluZywgYm9keTogb2JqZWN0LCBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZWVkYmFja0NvbnRyb2xsZXJDcmVhdGVSZXBseScsICdpZCcsIGlkKVxuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHknLCAnYm9keScsIGJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZlZWRiYWNrL3tpZH0vcmVwbGllc2BcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgeyR7XCJpZFwifX1gLCBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGlkKSkpO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYm9keSwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmVlZGJhY2tDb250cm9sbGVyRGVsZXRlOiBhc3luYyAoaWQ6IHN0cmluZywgb3B0aW9uczogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZmVlZGJhY2tDb250cm9sbGVyRGVsZXRlJywgJ2lkJywgaWQpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZlZWRiYWNrL3tpZH1gXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYHske1wiaWRcIn19YCwgZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhpZCkpKTtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0RFTEVURScsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQ6IGFzeW5jIChwcm9qZWN0SWQ6IHN0cmluZywgb3B0aW9uczogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9qZWN0SWQnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZlZWRiYWNrQ29udHJvbGxlckZpbmRGZWVkYmFja0J5UHJvamVjdElkJywgJ3Byb2plY3RJZCcsIHByb2plY3RJZClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmVlZGJhY2sve3Byb2plY3RJZH1gXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYHske1wicHJvamVjdElkXCJ9fWAsIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcocHJvamVjdElkKSkpO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBcbiAgICAgICAgICogQHBhcmFtIHtGZWVkYmFja1VwZGF0ZUR0b30gZmVlZGJhY2tVcGRhdGVEdG8gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZWVkYmFja0NvbnRyb2xsZXJVcGRhdGU6IGFzeW5jIChpZDogc3RyaW5nLCBmZWVkYmFja1VwZGF0ZUR0bzogRmVlZGJhY2tVcGRhdGVEdG8sIG9wdGlvbnM6IFJhd0F4aW9zUmVxdWVzdENvbmZpZyA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWQnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZScsICdpZCcsIGlkKVxuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZmVlZGJhY2tVcGRhdGVEdG8nIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZScsICdmZWVkYmFja1VwZGF0ZUR0bycsIGZlZWRiYWNrVXBkYXRlRHRvKVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZWVkYmFjay97aWR9YFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGB7JHtcImlkXCJ9fWAsIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQQVRDSCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZmVlZGJhY2tVcGRhdGVEdG8sIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogRmVlZGJhY2tBcGkgLSBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgRmVlZGJhY2tBcGlGcCA9IGZ1bmN0aW9uKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvciA9IEZlZWRiYWNrQXBpQXhpb3NQYXJhbUNyZWF0b3IoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7RmVlZGJhY2tDcmVhdGVEdG99IGZlZWRiYWNrQ3JlYXRlRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlKGZlZWRiYWNrQ3JlYXRlRHRvOiBGZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZShmZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4ID0gY29uZmlndXJhdGlvbj8uc2VydmVySW5kZXggPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggPSBvcGVyYXRpb25TZXJ2ZXJNYXBbJ0ZlZWRiYWNrQXBpLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZSddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHkoaWQ6IHN0cmluZywgYm9keTogb2JqZWN0LCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHkoaWQsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleCA9IGNvbmZpZ3VyYXRpb24/LnNlcnZlckluZGV4ID8/IDA7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoID0gb3BlcmF0aW9uU2VydmVyTWFwWydGZWVkYmFja0FwaS5mZWVkYmFja0NvbnRyb2xsZXJDcmVhdGVSZXBseSddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZWVkYmFja0NvbnRyb2xsZXJEZWxldGUoaWQ6IHN0cmluZywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmZlZWRiYWNrQ29udHJvbGxlckRlbGV0ZShpZCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4ID0gY29uZmlndXJhdGlvbj8uc2VydmVySW5kZXggPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggPSBvcGVyYXRpb25TZXJ2ZXJNYXBbJ0ZlZWRiYWNrQXBpLmZlZWRiYWNrQ29udHJvbGxlckRlbGV0ZSddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQocHJvamVjdElkOiBzdHJpbmcsIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXJyYXk8RmVlZGJhY2tSZXNwb25zZT4+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQocHJvamVjdElkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXggPSBjb25maWd1cmF0aW9uPy5zZXJ2ZXJJbmRleCA/PyAwO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCA9IG9wZXJhdGlvblNlcnZlck1hcFsnRmVlZGJhY2tBcGkuZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQnXT8uW2xvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXhdPy51cmw7XG4gICAgICAgICAgICByZXR1cm4gKGF4aW9zLCBiYXNlUGF0aCkgPT4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKShheGlvcywgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCB8fCBiYXNlUGF0aCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0ge0ZlZWRiYWNrVXBkYXRlRHRvfSBmZWVkYmFja1VwZGF0ZUR0byBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZShpZDogc3RyaW5nLCBmZWVkYmFja1VwZGF0ZUR0bzogRmVlZGJhY2tVcGRhdGVEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8dm9pZD4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5mZWVkYmFja0NvbnRyb2xsZXJVcGRhdGUoaWQsIGZlZWRiYWNrVXBkYXRlRHRvLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXggPSBjb25maWd1cmF0aW9uPy5zZXJ2ZXJJbmRleCA/PyAwO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCA9IG9wZXJhdGlvblNlcnZlck1hcFsnRmVlZGJhY2tBcGkuZmVlZGJhY2tDb250cm9sbGVyVXBkYXRlJ10/Lltsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4XT8udXJsO1xuICAgICAgICAgICAgcmV0dXJuIChheGlvcywgYmFzZVBhdGgpID0+IGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbikoYXhpb3MsIGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggfHwgYmFzZVBhdGgpO1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogRmVlZGJhY2tBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgRmVlZGJhY2tBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IEZlZWRiYWNrQXBpRnAoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7RmVlZGJhY2tDcmVhdGVEdG99IGZlZWRiYWNrQ3JlYXRlRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlKGZlZWRiYWNrQ3JlYXRlRHRvOiBGZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZWVkYmFja0NvbnRyb2xsZXJDcmVhdGUoZmVlZGJhY2tDcmVhdGVEdG8sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZVJlcGx5KGlkOiBzdHJpbmcsIGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZWVkYmFja0NvbnRyb2xsZXJDcmVhdGVSZXBseShpZCwgYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZWVkYmFja0NvbnRyb2xsZXJEZWxldGUoaWQ6IHN0cmluZywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZWVkYmFja0NvbnRyb2xsZXJEZWxldGUoaWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZlZWRiYWNrQ29udHJvbGxlckZpbmRGZWVkYmFja0J5UHJvamVjdElkKHByb2plY3RJZDogc3RyaW5nLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NQcm9taXNlPEFycmF5PEZlZWRiYWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZWVkYmFja0NvbnRyb2xsZXJGaW5kRmVlZGJhY2tCeVByb2plY3RJZChwcm9qZWN0SWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0ge0ZlZWRiYWNrVXBkYXRlRHRvfSBmZWVkYmFja1VwZGF0ZUR0byBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZShpZDogc3RyaW5nLCBmZWVkYmFja1VwZGF0ZUR0bzogRmVlZGJhY2tVcGRhdGVEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZmVlZGJhY2tDb250cm9sbGVyVXBkYXRlKGlkLCBmZWVkYmFja1VwZGF0ZUR0bywgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICB9O1xufTtcblxuLyoqXG4gKiBGZWVkYmFja0FwaSAtIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBGZWVkYmFja0FwaVxuICogQGV4dGVuZHMge0Jhc2VBUEl9XG4gKi9cbmV4cG9ydCBjbGFzcyBGZWVkYmFja0FwaSBleHRlbmRzIEJhc2VBUEkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7RmVlZGJhY2tDcmVhdGVEdG99IGZlZWRiYWNrQ3JlYXRlRHRvIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlKGZlZWRiYWNrQ3JlYXRlRHRvOiBGZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gRmVlZGJhY2tBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZShmZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHkoaWQ6IHN0cmluZywgYm9keTogb2JqZWN0LCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBGZWVkYmFja0FwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHkoaWQsIGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQXBpXG4gICAgICovXG4gICAgcHVibGljIGZlZWRiYWNrQ29udHJvbGxlckRlbGV0ZShpZDogc3RyaW5nLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBGZWVkYmFja0FwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZmVlZGJhY2tDb250cm9sbGVyRGVsZXRlKGlkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQocHJvamVjdElkOiBzdHJpbmcsIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIEZlZWRiYWNrQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5mZWVkYmFja0NvbnRyb2xsZXJGaW5kRmVlZGJhY2tCeVByb2plY3RJZChwcm9qZWN0SWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBcbiAgICAgKiBAcGFyYW0ge0ZlZWRiYWNrVXBkYXRlRHRvfSBmZWVkYmFja1VwZGF0ZUR0byBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQXBpXG4gICAgICovXG4gICAgcHVibGljIGZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZShpZDogc3RyaW5nLCBmZWVkYmFja1VwZGF0ZUR0bzogRmVlZGJhY2tVcGRhdGVEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIEZlZWRiYWNrQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5mZWVkYmFja0NvbnRyb2xsZXJVcGRhdGUoaWQsIGZlZWRiYWNrVXBkYXRlRHRvLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG59XG5cblxuXG4vKipcbiAqIFVzZXJBcGkgLSBheGlvcyBwYXJhbWV0ZXIgY3JlYXRvclxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgVXNlckFwaUF4aW9zUGFyYW1DcmVhdG9yID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckNvbnRyb2xsZXJHZXRNZTogYXN5bmMgKG9wdGlvbnM6IFJhd0F4aW9zUmVxdWVzdENvbmZpZyA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL21lYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gYmVhcmVyIHJlcXVpcmVkXG4gICAgICAgICAgICAvLyBodHRwIGJlYXJlciBhdXRoZW50aWNhdGlvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QmVhcmVyQXV0aFRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogVXNlckFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBVc2VyQXBpRnAgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IgPSBVc2VyQXBpQXhpb3NQYXJhbUNyZWF0b3IoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyQ29udHJvbGxlckdldE1lKG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclN1bW1hcnlSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyQ29udHJvbGxlckdldE1lKG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleCA9IGNvbmZpZ3VyYXRpb24/LnNlcnZlckluZGV4ID8/IDA7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoID0gb3BlcmF0aW9uU2VydmVyTWFwWydVc2VyQXBpLnVzZXJDb250cm9sbGVyR2V0TWUnXT8uW2xvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXhdPy51cmw7XG4gICAgICAgICAgICByZXR1cm4gKGF4aW9zLCBiYXNlUGF0aCkgPT4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKShheGlvcywgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCB8fCBiYXNlUGF0aCk7XG4gICAgICAgIH0sXG4gICAgfVxufTtcblxuLyoqXG4gKiBVc2VyQXBpIC0gZmFjdG9yeSBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFVzZXJBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IFVzZXJBcGlGcChjb25maWd1cmF0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJDb250cm9sbGVyR2V0TWUob3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUHJvbWlzZTxVc2VyU3VtbWFyeVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyQ29udHJvbGxlckdldE1lKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5cbi8qKlxuICogVXNlckFwaSAtIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBVc2VyQXBpXG4gKiBAZXh0ZW5kcyB7QmFzZUFQSX1cbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJBcGkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckNvbnRyb2xsZXJHZXRNZShvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBVc2VyQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyQ29udHJvbGxlckdldE1lKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cbn1cblxuXG5cbiIsIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBHYWxhZHJpbSBGZWVkYmFjayBBUElcbiAqIEFQSSBmb3IgR2FsYWRyaW0gRmVlZGJhY2ssIGEgZmVlZGJhY2sgcGxhdGZvcm0gZm9yIEdhbGFkcmltIHByb2plY3RzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAxLjBcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJhdGlvblBhcmFtZXRlcnMge1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBzZXJ2ZXJJbmRleD86IG51bWJlcjtcbiAgICBiYXNlT3B0aW9ucz86IGFueTtcbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBhcGlLZXkgc2VjdXJpdHlcbiAgICAgKiBAcGFyYW0gbmFtZSBzZWN1cml0eSBuYW1lXG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBhcGlLZXk/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nKSB8ICgobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGJhc2ljIHNlY3VyaXR5XG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBvYXV0aDIgc2VjdXJpdHlcbiAgICAgKiBAcGFyYW0gbmFtZSBzZWN1cml0eSBuYW1lXG4gICAgICogQHBhcmFtIHNjb3BlcyBvYXV0aDIgc2NvcGVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gc3RyaW5nKSB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogb3ZlcnJpZGUgYmFzZSBwYXRoXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogb3ZlcnJpZGUgc2VydmVyIGluZGV4XG4gICAgICpcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgc2VydmVySW5kZXg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYmFzZSBvcHRpb25zIGZvciBheGlvcyBjYWxsc1xuICAgICAqXG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGJhc2VPcHRpb25zPzogYW55O1xuICAgIC8qKlxuICAgICAqIFRoZSBGb3JtRGF0YSBjb25zdHJ1Y3RvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgbXVsdGlwYXJ0IGZvcm0gZGF0YVxuICAgICAqIHJlcXVlc3RzLiBZb3UgY2FuIGluamVjdCB0aGlzIGhlcmUgc28gdGhhdCBleGVjdXRpb24gZW52aXJvbm1lbnRzIHRoYXRcbiAgICAgKiBkbyBub3Qgc3VwcG9ydCB0aGUgRm9ybURhdGEgY2xhc3MgY2FuIHN0aWxsIHJ1biB0aGUgZ2VuZXJhdGVkIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtuZXcgKCkgPT4gRm9ybURhdGF9XG4gICAgICovXG4gICAgZm9ybURhdGFDdG9yPzogbmV3ICgpID0+IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtOiBDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IHt9KSB7XG4gICAgICAgIHRoaXMuYXBpS2V5ID0gcGFyYW0uYXBpS2V5O1xuICAgICAgICB0aGlzLnVzZXJuYW1lID0gcGFyYW0udXNlcm5hbWU7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXJhbS5wYXNzd29yZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IHBhcmFtLmFjY2Vzc1Rva2VuO1xuICAgICAgICB0aGlzLmJhc2VQYXRoID0gcGFyYW0uYmFzZVBhdGg7XG4gICAgICAgIHRoaXMuc2VydmVySW5kZXggPSBwYXJhbS5zZXJ2ZXJJbmRleDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAuLi5wYXJhbS5iYXNlT3B0aW9ucz8uaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IFwiT3BlbkFQSS1HZW5lcmF0b3IvdHlwZXNjcmlwdC1heGlvc1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4ucGFyYW0uYmFzZU9wdGlvbnNcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb3JtRGF0YUN0b3IgPSBwYXJhbS5mb3JtRGF0YUN0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIE1JTUUgaXMgYSBKU09OIE1JTUUuXG4gICAgICogSlNPTiBNSU1FIGV4YW1wbGVzOlxuICAgICAqICAgYXBwbGljYXRpb24vanNvblxuICAgICAqICAgYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEY4XG4gICAgICogICBBUFBMSUNBVElPTi9KU09OXG4gICAgICogICBhcHBsaWNhdGlvbi92bmQuY29tcGFueStqc29uXG4gICAgICogQHBhcmFtIG1pbWUgLSBNSU1FIChNdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbCBFeHRlbnNpb25zKVxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gTUlNRSBpcyBKU09OLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGlzSnNvbk1pbWUobWltZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGpzb25NaW1lOiBSZWdFeHAgPSBuZXcgUmVnRXhwKCdeKGFwcGxpY2F0aW9uXFwvanNvbnxbXjsvIFxcdF0rXFwvW147LyBcXHRdK1srXWpzb24pWyBcXHRdKig7LiopPyQnLCAnaScpO1xuICAgICAgICByZXR1cm4gbWltZSAhPT0gbnVsbCAmJiAoanNvbk1pbWUudGVzdChtaW1lKSB8fCBtaW1lLnRvTG93ZXJDYXNlKCkgPT09ICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQge1xuICBBdXRoQXBpLFxuICBDb25maWd1cmF0aW9uLFxuICBGZWVkYmFja0FwaSxcbiAgVXNlckFwaSxcbn0gZnJvbSBcIi4uLy4uL2xpYnMvYmFja2VuZC1jbGllbnRcIjtcblxuY29uc3QgYXBpVXJsID0gXCJodHRwOi8vZWMyLTEzLTM4LTIxNC0xOTEuZXUtd2VzdC0zLmNvbXB1dGUuYW1hem9uYXdzLmNvbToxNDc4XCI7XG5cbmNvbnN0IGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbih7XG4gIGJhc2VQYXRoOiBhcGlVcmwsXG59KTtcblxuY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSh7XG4gIGJhc2VVUkw6IGFwaVVybCxcbn0pO1xuXG5jb25zdCBhcGkgPSB7XG4gIHVzZXI6IG5ldyBVc2VyQXBpKGNvbmZpZ3VyYXRpb24sIGFwaVVybCwgYXhpb3NJbnN0YW5jZSksXG4gIGZlZWRiYWNrOiBuZXcgRmVlZGJhY2tBcGkoY29uZmlndXJhdGlvbiwgYXBpVXJsLCBheGlvc0luc3RhbmNlKSxcbiAgYXV0aDogbmV3IEF1dGhBcGkoY29uZmlndXJhdGlvbiwgYXBpVXJsLCBheGlvc0luc3RhbmNlKSxcbn07XG5cbmF4aW9zSW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKFxuICBhc3luYyAoY29uZmlnKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImdhbGFkcmltRmVlZGJhY2tUb2tlblwiKTtcbiAgICBpZiAodG9rZW4gJiYgY29uZmlnLmhlYWRlcnMpIHtcbiAgICAgIGNvbmZpZy5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGF4aW9zSW5zdGFuY2UuZGVmYXVsdHMuaGVhZGVycy5jb21tb24uQXV0aG9yaXphdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfSxcbiAgKGVycm9yKSA9PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgfVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgYXBpO1xuIiwiaW1wb3J0IHsgdXNlTXV0YXRpb24sIHVzZVF1ZXJ5LCB1c2VRdWVyeUNsaWVudCB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCBhcGkgZnJvbSBcIi4vYXBpXCI7XG5pbXBvcnQge1xuICBGZWVkYmFja0NyZWF0ZUR0byxcbiAgRmVlZGJhY2tSZXNwb25zZSxcbiAgRmVlZGJhY2tVcGRhdGVEdG8sXG59IGZyb20gXCIuLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBmZXRjaEZlZWRiYWNrcyA9IGFzeW5jIChwcm9qZWN0SWQ/OiBzdHJpbmcpID0+IHtcbiAgaWYgKCFwcm9qZWN0SWQpIHJldHVybiBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9XG4gICAgICBhd2FpdCBhcGkuZmVlZGJhY2suZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQocHJvamVjdElkKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRmVlZGJhY2sgPSBhc3luYyAoZmVlZGJhY2s6IEZlZWRiYWNrQ3JlYXRlRHRvKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLmZlZWRiYWNrLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZShmZWVkYmFjayk7XG4gIHJldHVybiByZXNwb25zZS5kYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcGx5ID0gYXN5bmMgKGZlZWRiYWNrSWQ6IHN0cmluZywgY29tbWVudDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLmZlZWRiYWNrLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZVJlcGx5KFxuICAgIGZlZWRiYWNrSWQsXG4gICAge1xuICAgICAgY29tbWVudCxcbiAgICB9XG4gICk7XG4gIHJldHVybiByZXNwb25zZS5kYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUZlZWRiYWNrID0gYXN5bmMgKHtcbiAgZmVlZGJhY2tJZCxcbiAgcGF5bG9hZCxcbn06IHtcbiAgZmVlZGJhY2tJZDogc3RyaW5nO1xuICBwYXlsb2FkOiBGZWVkYmFja1VwZGF0ZUR0bztcbn0pID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGkuZmVlZGJhY2suZmVlZGJhY2tDb250cm9sbGVyVXBkYXRlKGZlZWRiYWNrSWQsIHtcbiAgICAuLi5wYXlsb2FkLFxuICB9KTtcbiAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlRmVlZGJhY2sgPSBhc3luYyAoZmVlZGJhY2s6IEZlZWRiYWNrUmVzcG9uc2UpID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGkuZmVlZGJhY2suZmVlZGJhY2tDb250cm9sbGVyRGVsZXRlKGZlZWRiYWNrLmlkKTtcbiAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlRmVlZGJhY2tzID0gKHByb2plY3RJZD86IHN0cmluZykgPT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBbXCJmZWVkYmFja3NcIl0sXG4gICAgcXVlcnlGbjogKCkgPT4gZmV0Y2hGZWVkYmFja3MocHJvamVjdElkKSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQ3JlYXRlRmVlZGJhY2sgPSAoKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBjcmVhdGVGZWVkYmFjayxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRmVlZGJhY2sgY3JlYXRlZFwiKTtcblxuICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IFtcImZlZWRiYWNrc1wiXSB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VDcmVhdGVSZXBseSA9IChmZWVkYmFja0lkOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IChjb21tZW50OiBzdHJpbmcpID0+IGNyZWF0ZVJlcGx5KGZlZWRiYWNrSWQsIGNvbW1lbnQpLFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IFtcImZlZWRiYWNrc1wiXSB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VVcGRhdGVGZWVkYmFjayA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IHVwZGF0ZUZlZWRiYWNrLFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IFtcImZlZWRiYWNrc1wiXSB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VEZWxldGVGZWVkYmFjayA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGRlbGV0ZUZlZWRiYWNrLFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IFtcImZlZWRiYWNrc1wiXSB9KTtcbiAgICB9LFxuICB9KTtcbn07XG4iLCJpbXBvcnQgeyB1c2VRdWVyeSB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCBhcGkgZnJvbSBcIi4vYXBpXCI7XG5cbmV4cG9ydCBjb25zdCBmZXRjaE1lID0gYXN5bmMgKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLnVzZXIudXNlckNvbnRyb2xsZXJHZXRNZSgpO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVzZU1lID0gKCkgPT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBbXCJtZVwiXSxcbiAgICBxdWVyeUZuOiBmZXRjaE1lLFxuICB9KTtcbn07XG4iLCJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgRGlzcGF0Y2gsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VFZmZlY3QsXG4gIHVzZVN0YXRlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEZlZWRiYWNrQ3JlYXRlRHRvLCBGZWVkYmFja1Jlc3BvbnNlIH0gZnJvbSBcIi4uLy4uL2xpYnMvYmFja2VuZC1jbGllbnRcIjtcbmltcG9ydCB7IHVzZUZlZWRiYWNrcyB9IGZyb20gXCIuLi9zZXJ2aWNlcy9mZWVkYmFja1wiO1xuaW1wb3J0IHsgdXNlTWUgfSBmcm9tIFwiLi4vc2VydmljZXMvdXNlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlZWRiYWNrU3RhdGUge1xuICBpc09wZW46IGJvb2xlYW47XG4gIGZlZWRiYWNrcz86IEZlZWRiYWNrUmVzcG9uc2VbXTtcbiAgbmV3RmVlZGJhY2s6IEZlZWRiYWNrQ3JlYXRlRHRvIHwgbnVsbDtcbiAgbmV3RmVlZGJhY2tSZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+O1xuICBzZWxlY3RlZEZlZWRiYWNrOiBGZWVkYmFja1Jlc3BvbnNlIHwgbnVsbDtcbiAgc2V0U2VsZWN0ZWRGZWVkYmFjazogRGlzcGF0Y2g8UmVhY3QuU2V0U3RhdGVBY3Rpb248RmVlZGJhY2tSZXNwb25zZSB8IG51bGw+PjtcbiAgcmVzZXRGZWVkYmFjazogKCkgPT4gdm9pZDtcbiAgb3BlbkZlZWRiYWNrT3ZlcmxheTogKCkgPT4gdm9pZDtcbiAgY2xvc2VGZWVkYmFja092ZXJsYXk6ICgpID0+IHZvaWQ7XG4gIGFjdGl2YXRlRmVlZGJhY2tNb2RlOiAoKSA9PiB2b2lkO1xuICBkZWFjdGl2YXRlRmVlZGJhY2tNb2RlOiAoKSA9PiB2b2lkO1xuICBuYXZpZ2F0ZTogKHBhdGg6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLy8gQ3JlYXRlIHRoZSBjb250ZXh0XG5jb25zdCBGZWVkYmFja0NvbnRleHQgPSBjcmVhdGVDb250ZXh0KHtcbiAgaXNPcGVuOiBmYWxzZSxcbiAgZmVlZGJhY2tzOiBbXSBhcyBGZWVkYmFja1Jlc3BvbnNlW10gfCB1bmRlZmluZWQsXG4gIG5ld0ZlZWRiYWNrOiBudWxsIGFzIEZlZWRiYWNrQ3JlYXRlRHRvIHwgbnVsbCxcbiAgbmV3RmVlZGJhY2tSZWY6IFJlYWN0LmNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KCksXG4gIHNlbGVjdGVkRmVlZGJhY2s6IHt9IGFzIEZlZWRiYWNrUmVzcG9uc2UgfCBudWxsLFxuICBzZXRTZWxlY3RlZEZlZWRiYWNrOiB7fSBhcyBEaXNwYXRjaDxcbiAgICBSZWFjdC5TZXRTdGF0ZUFjdGlvbjxGZWVkYmFja1Jlc3BvbnNlIHwgbnVsbD5cbiAgPixcbiAgcmVzZXRGZWVkYmFjazogKCkgPT4ge30sXG4gIGFjdGl2YXRlRmVlZGJhY2tNb2RlOiAoKSA9PiB7fSxcbiAgZGVhY3RpdmF0ZUZlZWRiYWNrTW9kZTogKCkgPT4ge30sXG4gIG9wZW5GZWVkYmFja092ZXJsYXk6ICgpID0+IHt9LFxuICBjbG9zZUZlZWRiYWNrT3ZlcmxheTogKCkgPT4ge30sXG4gIHJvb3REaXI6IFwiXCIsXG4gIG5hdmlnYXRlOiAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgdm9pZCBwYXRoO1xuICAgIHJldHVybjtcbiAgfSxcbn0pO1xuXG4vLyBQcm92aWRlciBjb21wb25lbnRcbmV4cG9ydCBjb25zdCBGZWVkYmFja1Byb3ZpZGVyID0gKHtcbiAgcm9vdERpcixcbiAgcHJvamVjdElkLFxuICBuYXZpZ2F0ZSxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIHJvb3REaXI6IHN0cmluZztcbiAgcHJvamVjdElkOiBzdHJpbmc7XG4gIG5hdmlnYXRlOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkgPT4ge1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbbmV3RmVlZGJhY2ssIHNldE5ld0ZlZWRiYWNrXSA9IHVzZVN0YXRlPEZlZWRiYWNrQ3JlYXRlRHRvIHwgbnVsbD4oXG4gICAgbnVsbFxuICApO1xuICBjb25zdCBuZXdGZWVkYmFja1JlZiA9IFJlYWN0LnVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbc2VsZWN0ZWRGZWVkYmFjaywgc2V0U2VsZWN0ZWRGZWVkYmFja10gPVxuICAgIHVzZVN0YXRlPEZlZWRiYWNrUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgY29uc3QgeyBkYXRhOiBmZWVkYmFja3MgfSA9IHVzZUZlZWRiYWNrcyhwcm9qZWN0SWQpO1xuICBjb25zdCB7IGRhdGE6IG1lIH0gPSB1c2VNZSgpO1xuXG4gIGNvbnN0IGlzQ29ubmVjdGVkID0gISFtZTtcblxuICBjb25zdCBvcGVuRmVlZGJhY2tPdmVybGF5ID0gKCkgPT4ge1xuICAgIHNldElzT3Blbih0cnVlKTtcbiAgICBpZiAoaXNDb25uZWN0ZWQpIGFjdGl2YXRlRmVlZGJhY2tNb2RlKCk7XG4gIH07XG5cbiAgY29uc3QgY2xvc2VGZWVkYmFja092ZXJsYXkgPSAoKSA9PiB7XG4gICAgc2V0SXNPcGVuKGZhbHNlKTtcbiAgICBkZWFjdGl2YXRlRmVlZGJhY2tNb2RlKCk7XG4gIH07XG5cbiAgY29uc3QgcmVzZXRGZWVkYmFjayA9ICgpID0+IHtcbiAgICBzZXROZXdGZWVkYmFjayhudWxsKTtcbiAgICBhY3RpdmF0ZUZlZWRiYWNrTW9kZSgpO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZUZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgZWxlbWVudElkID0gdGFyZ2V0Py5kYXRhc2V0LnBhdGggfHwgXCJcIjtcbiAgICAgIGNvbnN0IGFsbEVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgICAgIGBbZGF0YS1wYXRoPVwiJHtlbGVtZW50SWR9XCJdYFxuICAgICAgKTtcblxuICAgICAgY29uc3QgYXJyQWxsRWxlbWVudHMgPSBBcnJheS5mcm9tKGFsbEVsZW1lbnRzKTtcblxuICAgICAgY29uc3QgZWxlbWVudEluZGV4ID0gYXJyQWxsRWxlbWVudHMuaW5kZXhPZih0YXJnZXQpO1xuXG4gICAgICBjb25zdCB4ID0gZS5vZmZzZXRYO1xuICAgICAgY29uc3QgeSA9IGUub2Zmc2V0WTtcbiAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRhcmdldD8uY2xpZW50V2lkdGggfHwgMDtcbiAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0YXJnZXQ/LmNsaWVudEhlaWdodCB8fCAwO1xuXG4gICAgICBzZXROZXdGZWVkYmFjayh7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIGVsZW1lbnRXaWR0aCxcbiAgICAgICAgZWxlbWVudEhlaWdodCxcbiAgICAgICAgY29tbWVudDogXCJcIixcbiAgICAgICAgcGF0aDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBlbGVtZW50SWQsXG4gICAgICAgIGVsZW1lbnRJbmRleCxcbiAgICAgICAgcHJvamVjdElkLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbcHJvamVjdElkXVxuICApO1xuXG4gIGNvbnN0IGlzU2lkZUJhck9yRmVlZGJhY2tJdGVtID0gdXNlQ2FsbGJhY2soKHRhcmdldDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBzaWRlYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmZWVkYmFjay1zaWRlYmFyXCIpO1xuXG4gICAgaWYgKCFzaWRlYmFyIHx8IHNpZGViYXIuY29udGFpbnModGFyZ2V0IGFzIE5vZGUpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudHMgPSBkb2N1bWVudFxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGAuZmVlZGJhY2staXRlbWApXG4gICAgICAudmFsdWVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGZlZWRiYWNrRWxlbWVudCBvZiBmZWVkYmFja0VsZW1lbnRzKSB7XG4gICAgICBpZiAoZmVlZGJhY2tFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IHNob3VsZENyZWF0ZUZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKG5ld0ZlZWRiYWNrUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgaWYgKCFuZXdGZWVkYmFja1JlZi5jdXJyZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICBzZXROZXdGZWVkYmFjayhudWxsKTtcbiAgICAgICAgICBpZiAoaXNTaWRlQmFyT3JGZWVkYmFja0l0ZW0odGFyZ2V0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc1NpZGVCYXJPckZlZWRiYWNrSXRlbSh0YXJnZXQpO1xuICAgIH0sXG4gICAgW2lzU2lkZUJhck9yRmVlZGJhY2tJdGVtXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZU5ld0ZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghc2hvdWxkQ3JlYXRlRmVlZGJhY2soZSkpIHJldHVybjtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHNldFNlbGVjdGVkRmVlZGJhY2sobnVsbCk7XG4gICAgICBjcmVhdGVGZWVkYmFjayhlKTtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZU5ld0ZlZWRiYWNrKTtcbiAgICB9LFxuICAgIFtzaG91bGRDcmVhdGVGZWVkYmFjaywgY3JlYXRlRmVlZGJhY2tdXG4gICk7XG5cbiAgY29uc3QgYWN0aXZhdGVGZWVkYmFja01vZGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwiY29tbWVudC1jdXJzb3JcIik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZU5ld0ZlZWRiYWNrLCB0cnVlKTtcbiAgfSwgW2hhbmRsZU5ld0ZlZWRiYWNrXSk7XG5cbiAgY29uc3QgZGVhY3RpdmF0ZUZlZWRiYWNrTW9kZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlTmV3RmVlZGJhY2spO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcImNvbW1lbnQtY3Vyc29yXCIpO1xuICB9LCBbaGFuZGxlTmV3RmVlZGJhY2tdKTtcblxuICBjb25zdCBoYW5kbGVFc2NhcGVQcmVzcyA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBpZiAobmV3RmVlZGJhY2spIHtcbiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlTmV3RmVlZGJhY2spO1xuICAgICAgICAgIHNldE5ld0ZlZWRiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlYWN0aXZhdGVGZWVkYmFja01vZGUoKTtcbiAgICAgICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbbmV3RmVlZGJhY2ssIGRlYWN0aXZhdGVGZWVkYmFja01vZGUsIGhhbmRsZU5ld0ZlZWRiYWNrXVxuICApO1xuICBjb25zdCByZW1vdmVRdWVyeVBhcmFtID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICBwYXJhbXMuZGVsZXRlKG5hbWUpO1xuICAgIGNvbnN0IG5ld1VybCA9IGAke3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX0ke1xuICAgICAgcGFyYW1zLnRvU3RyaW5nKCkgPyBcIj9cIiA6IFwiXCJcbiAgICB9JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBcIlwiLCBuZXdVcmwpO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUVzY2FwZVByZXNzKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUVzY2FwZVByZXNzKTtcbiAgICB9O1xuICB9LCBbaGFuZGxlRXNjYXBlUHJlc3NdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICBjb25zdCBnYWxhZHJpbUZlZWRiYWNrVG9rZW4gPSBwYXJhbXMuZ2V0KFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIpO1xuICAgIGlmIChnYWxhZHJpbUZlZWRiYWNrVG9rZW4pIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIsIGdhbGFkcmltRmVlZGJhY2tUb2tlbik7XG4gICAgICByZW1vdmVRdWVyeVBhcmFtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIpO1xuICAgIH1cbiAgfSwgW2ZlZWRiYWNrcywgYWN0aXZhdGVGZWVkYmFja01vZGVdKTtcblxuICBjb25zdCB2YWx1ZSA9IHtcbiAgICBpc09wZW4sXG4gICAgZmVlZGJhY2tzLFxuICAgIG5ld0ZlZWRiYWNrLFxuICAgIG5ld0ZlZWRiYWNrUmVmLFxuICAgIHNlbGVjdGVkRmVlZGJhY2ssXG4gICAgc2V0U2VsZWN0ZWRGZWVkYmFjayxcbiAgICByZXNldEZlZWRiYWNrLFxuICAgIGFjdGl2YXRlRmVlZGJhY2tNb2RlLFxuICAgIGRlYWN0aXZhdGVGZWVkYmFja01vZGUsXG4gICAgb3BlbkZlZWRiYWNrT3ZlcmxheSxcbiAgICBjbG9zZUZlZWRiYWNrT3ZlcmxheSxcbiAgICByb290RGlyLFxuICAgIG5hdmlnYXRlLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxGZWVkYmFja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0ZlZWRiYWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VGZWVkYmFja0NvbnRleHQgPSAoKSA9PiB1c2VDb250ZXh0KEZlZWRiYWNrQ29udGV4dCk7XG4iLCJleHBvcnQgY29uc3QgQnV0dG9uID0gKHtcbiAgdGV4dCxcbiAgb25DbGljayxcbiAgaWNvblBhdGgsXG4gIHNpemUsXG59OiB7XG4gIG9uQ2xpY2s6IChlOiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4gdm9pZDtcbiAgdGV4dD86IHN0cmluZztcbiAgaWNvblBhdGg/OiBzdHJpbmc7XG4gIHNpemU/OiBcInNtYWxsXCIgfCBcIm1lZGl1bVwiIHwgXCJsYXJnZVwiO1xufSkgPT4ge1xuICBjb25zdCBwYWRkaW5nID0gZ2V0UGFkZGluZyhzaXplKTtcbiAgY29uc3QgZm9udFNpemUgPSBzaXplID09PSBcInNtYWxsXCIgPyBcInRleHQteHNcIiA6IFwidGV4dC1zbVwiO1xuICBjb25zdCBib3JkZXJSYWRpdXMgPSBzaXplID09PSBcInNtYWxsXCIgPyBcInJvdW5kZWQtbGdcIiA6IFwicm91bmRlZC1bMTJweF1cIjtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgY2xhc3NOYW1lPXtgZmxleC1zaHJpbmstMCBmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciAgZ2FwLTIgJHtwYWRkaW5nfSAke2JvcmRlclJhZGl1c30gYmctYmx1ZS01MDAgaG92ZXI6Ymctb3BhY2l0eS04MGB9XG4gICAgPlxuICAgICAge2ljb25QYXRoICYmIDxpbWcgc3JjPXtpY29uUGF0aH0gY2xhc3NOYW1lPVwidy02IGgtNlwiIC8+fVxuICAgICAge3RleHQgJiYgPHNwYW4gY2xhc3NOYW1lPXtgJHtmb250U2l6ZX0gZm9udC1zZW1pYm9sZGB9Pnt0ZXh0fTwvc3Bhbj59XG4gICAgPC9idXR0b24+XG4gICk7XG59O1xuXG5jb25zdCBnZXRQYWRkaW5nID0gKHNpemU/OiBcInNtYWxsXCIgfCBcIm1lZGl1bVwiIHwgXCJsYXJnZVwiKSA9PiB7XG4gIHN3aXRjaCAoc2l6ZSkge1xuICAgIGNhc2UgXCJzbWFsbFwiOlxuICAgICAgcmV0dXJuIFwicHgtMyBweS0yXCI7XG4gICAgY2FzZSBcIm1lZGl1bVwiOlxuICAgICAgcmV0dXJuIFwicC0zXCI7XG4gICAgY2FzZSBcImxhcmdlXCI6XG4gICAgICByZXR1cm4gXCJwLTNcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwicC0zXCI7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi9CdXR0b25cIjtcblxuZXhwb3J0IGNvbnN0IE9wZW5GZWVkYmFja0J1dHRvbiA9ICgpID0+IHtcbiAgY29uc3QgeyBpc09wZW4sIG9wZW5GZWVkYmFja092ZXJsYXkgfSA9IHVzZUZlZWRiYWNrQ29udGV4dCgpO1xuXG4gIGlmIChpc09wZW4pIHJldHVybiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgdG9wOiBcImNhbGMoMTAwdmggLSA3MnB4KVwiLFxuICAgICAgICBsZWZ0OiBcImNhbGMoMTAwdncgLSA3MnB4KVwiLFxuICAgICAgICB6SW5kZXg6IDEwMDAwMDAsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgaWNvblBhdGg9XCIvZmVlZGJhY2svZWRpdC0wNC5zdmdcIlxuICAgICAgICBvbkNsaWNrPXtvcGVuRmVlZGJhY2tPdmVybGF5fVxuICAgICAgICBzaXplPVwibWVkaXVtXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGdldEluaXRpYWxzID0gKHVzZXI6IHtcbiAgZnVsbE5hbWU/OiBzdHJpbmc7XG4gIGZpcnN0TmFtZT86IHN0cmluZztcbiAgbGFzdE5hbWU/OiBzdHJpbmc7XG59KSA9PiB7XG4gIGlmICh1c2VyLmZ1bGxOYW1lKSB7XG4gICAgY29uc3QgZnVsbE5hbWUgPSB1c2VyLmZ1bGxOYW1lLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gZnVsbE5hbWVbMF0uY2hhckF0KDApICsgZnVsbE5hbWVbMV0uY2hhckF0KDApO1xuICB9XG4gIGlmICghdXNlci5maXJzdE5hbWUgfHwgIXVzZXIubGFzdE5hbWUpIHJldHVybiBcIlwiO1xuICBjb25zdCBmaXJzdE5hbWUgPSB1c2VyLmZpcnN0TmFtZS5jaGFyQXQoMCk7XG4gIGNvbnN0IGxhc3ROYW1lID0gdXNlci5sYXN0TmFtZS5jaGFyQXQoMCk7XG5cbiAgcmV0dXJuIGAke2ZpcnN0TmFtZS50b1VwcGVyQ2FzZSgpfSR7bGFzdE5hbWUudG9VcHBlckNhc2UoKX1gO1xufTtcbiIsImltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuaW1wb3J0IHsgRmVlZGJhY2tSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja0l0ZW1Ib3ZlcmVkID0gKHtcbiAgZmVlZGJhY2ssXG59OiB7XG4gIGZlZWRiYWNrOiBGZWVkYmFja1Jlc3BvbnNlO1xufSkgPT4ge1xuICBjb25zdCB7IHVzZXIsIGNyZWF0ZWRBdCwgY29tbWVudCB9ID0gZmVlZGJhY2s7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInAtM1wiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWJhc2VsaW5lIGdhcC0yIHotMTBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtbWVkaXVtIHRleHQtc20gdGV4dC1ncmF5LWZlZWRiYWNrLTIwMCB3aGl0ZXNwYWNlLW5vd3JhcCB6LTEwXCI+XG4gICAgICAgICAge3VzZXI/LmZ1bGxOYW1lIHx8IGAke3VzZXI/LmZpcnN0TmFtZX0gJHt1c2VyPy5sYXN0TmFtZX1gfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImt1bWJoLXJlZ3VsYXIgdGV4dC1bMTBweF0gbGVhZGluZy1bMTJweF0gdGV4dC1ncmF5LWZlZWRiYWNrLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgIHttb21lbnQoY3JlYXRlZEF0KS5mcm9tTm93KCl9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIG92ZXJmbG93LWhpZGRlbiB3LVsyNDBweF1cIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LVsxNnB4XSBsZWFkaW5nLTUgdGV4dC13aGl0ZSBsaW5lLWNsYW1wLTJcIj5cbiAgICAgICAgICB7Y29tbWVudH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IENsb3NlQnV0dG9uID0gKHtcbiAgc2l6ZSxcbiAgb25DbGljayxcbn06IHtcbiAgc2l6ZTogXCJzbWFsbFwiIHwgXCJsYXJnZVwiO1xuICBvbkNsaWNrOiAoKSA9PiB2b2lkO1xufSkgPT4ge1xuICBjb25zdCBzaXplQ2xhc3MgPSBzaXplID09PSBcInNtYWxsXCIgPyBcInctNSBoLTVcIiA6IFwidy02IGgtNlwiO1xuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25DbGljaygpO1xuICAgICAgfX1cbiAgICA+XG4gICAgICA8aW1nIHNyYz1cIi9mZWVkYmFjay9jbG9zZS5zdmdcIiBjbGFzc05hbWU9e3NpemVDbGFzc30gLz5cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn07XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcbmltcG9ydCB7XG4gIEZlZWRiYWNrUmVzcG9uc2UsXG4gIFJlcGx5UmVzcG9uc2UsXG59IGZyb20gXCIuLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBSZXBseUl0ZW0gPSAoe1xuICByZXBseSxcbn06IHtcbiAgcmVwbHk6IFJlcGx5UmVzcG9uc2UgfCBGZWVkYmFja1Jlc3BvbnNlO1xufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBmbGV4LWJhc2VsaW5lIGdhcC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImt1bWJoLW1lZGl1bSB0ZXh0LXNtIHRleHQtZ3JheS1mZWVkYmFjay0yMDAgd2hpdGVzcGFjZS1ub3dyYXAgei0xMFwiPlxuICAgICAgICAgIHtyZXBseS51c2VyLmZpcnN0TmFtZX0ge3JlcGx5LnVzZXIubGFzdE5hbWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LVsxMHB4XSBsZWFkaW5nLVsxMnB4XSB0ZXh0LWdyYXktZmVlZGJhY2stMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAge21vbWVudChyZXBseS5jcmVhdGVkQXQpLmZyb21Ob3coKX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJrdW1iaC1yZWd1bGFyIHRleHQtWzE0cHhdIGxlYWRpbmctNSB0ZXh0LXdoaXRlXCI+XG4gICAgICAgIHtyZXBseS5jb21tZW50fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCB7IENoYW5nZUV2ZW50LCBLZXlib2FyZEV2ZW50LCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuZXhwb3J0IGNvbnN0IEZlZWRiYWNrVGV4dEFyZWEgPSAoe1xuICB2YWx1ZSxcbiAgc2V0VmFsdWUsXG4gIG9uU3VibWl0LFxuICBoYW5kbGVSZXNpemUsXG4gIGlzQW5pbWF0ZWQsXG4gIGlzRGFyayxcbn06IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgc2V0VmFsdWU6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICBvblN1Ym1pdDogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGhhbmRsZVJlc2l6ZT86ICgpID0+IHZvaWQ7XG4gIGlzQW5pbWF0ZWQ/OiBib29sZWFuO1xuICBpc0Rhcms/OiBib29sZWFuO1xufSkgPT4ge1xuICBjb25zdCB0ZXh0YXJlYVJlZiA9IHVzZVJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PihudWxsKTtcblxuICBjb25zdCBbaXNPcGVuaW5nLCBzZXRJc09wZW5pbmddID0gdXNlU3RhdGUoaXNBbmltYXRlZCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNBbmltYXRlZCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRleHRhcmVhUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgIHNldElzT3BlbmluZyhmYWxzZSk7XG4gICAgICB9LCAzMDApO1xuICAgIH1cbiAgfSwgW2lzQW5pbWF0ZWRdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgc2V0VmFsdWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcblxuICAgIGlmICh0ZXh0YXJlYVJlZi5jdXJyZW50KSB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBcImF1dG9cIjsgLy8gUmVzZXQgaGVpZ2h0IHRvIGNhbGN1bGF0ZSBzY3JvbGxIZWlnaHRcbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBgJHt0ZXh0YXJlYVJlZi5jdXJyZW50LnNjcm9sbEhlaWdodH1weGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0YXJlYVJlZi5jdXJyZW50LnN0eWxlLmhlaWdodCA9IFwiMjlweFwiO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFuZGxlUmVzaXplKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaGFuZGxlUmVzaXplKCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgJiYgZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICgpID0+IHtcbiAgICBvblN1Ym1pdCh2YWx1ZSk7XG4gICAgc2V0VmFsdWUoXCJcIik7XG4gICAgaWYgKCF0ZXh0YXJlYVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgdGV4dGFyZWFSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBcIjI5cHhcIjtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17YFxuICAgICAgICAke2lzRGFyayA/IFwiYmctZ3JheS1mZWVkYmFjay03NTBcIiA6IFwiYmctZ3JheS1mZWVkYmFjay03MDBcIn1cbiAgICAgICAgJHtcbiAgICAgICAgICB2YWx1ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IFwiY29tbWVudC1pbnB1dC1jb250YWluZXJcIlxuICAgICAgICAgICAgOiBcImNvbW1lbnQtaW5wdXQtY29udGFpbmVyLWVtcHR5XCJcbiAgICAgICAgfSAgJHtpc09wZW5pbmcgPyBcImNvbW1lbnQtaW5wdXQtY29udGFpbmVyLW9wZW5pbmdcIiA6IFwiXCJ9YH1cbiAgICA+XG4gICAgICA8dGV4dGFyZWFcbiAgICAgICAgcmVmPXt0ZXh0YXJlYVJlZn1cbiAgICAgICAgY2xhc3NOYW1lPXtgY29tbWVudC1pbnB1dCAke1xuICAgICAgICAgIHZhbHVlLmxlbmd0aCA+IDAgPyBcImNvbW1lbnQtaW5wdXQtZmlsbGVkXCIgOiBcIlwiXG4gICAgICAgIH1gfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgcGxhY2Vob2xkZXI9XCJBam91dGVyIHVuIGNvbW1lbnRhaXJlXCJcbiAgICAgICAgcm93cz17MX1cbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7dmFsdWUubGVuZ3RoID4gMCA/IFwiYnV0dG9ucy1jb250YWluZXJcIiA6IFwiXCJ9YH0+XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnV0dG9uLXNlbmRcIiBvbkNsaWNrPXtoYW5kbGVTdWJtaXR9PlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIGZpbGw9e3ZhbHVlLmxlbmd0aCA+IDAgPyBcIiMwMDg1RkZcIiA6IFwiI2ZmZlwifVxuICAgICAgICAgICAgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuOTY0LjY4NmEuNS41IDAgMCAwLS42NS0uNjVMLjc2NyA1Ljg1NUguNzY2bC0uNDUyLjE4YS41LjUgMCAwIDAtLjA4Mi44ODdsLjQxLjI2LjAwMS4wMDIgNC45OTUgMy4xNzggMy4xNzggNC45OTUuMDAyLjAwMi4yNi40MWEuNS41IDAgMCAwIC44ODYtLjA4M2w2LTE1Wm0tMS44MzMgMS44OUw2LjYzNyAxMC4wN2wtLjIxNS0uMzM4YS41LjUgMCAwIDAtLjE1NC0uMTU0bC0uMzM4LS4yMTUgNy40OTQtNy40OTQgMS4xNzgtLjQ3MS0uNDcgMS4xNzhaXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iLCJleHBvcnQgY29uc3QgTWVudUl0ZW0gPSAoe1xuICBsYWJlbCxcbiAgb25DbGljayxcbn06IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgb25DbGljazogKCkgPT4gdm9pZDtcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICBjbGFzc05hbWU9XCJ6LTEgbS0xIHB4LTIgcHktMSBob3ZlcjpiZy1wcmltYXJ5LWZlZWRiYWNrLTQwMCBob3ZlcjpvcGFjaXR5LTEwMCByb3VuZGVkLWxnXCJcbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LXNtIHRleHQtd2hpdGVcIj57bGFiZWx9PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gXCIuL01lbnVJdGVtXCI7XG5pbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQge1xuICB1c2VEZWxldGVGZWVkYmFjayxcbiAgdXNlVXBkYXRlRmVlZGJhY2ssXG59IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9mZWVkYmFja1wiO1xuaW1wb3J0IHsgRmVlZGJhY2tSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBNZW51QnV0dG9uID0gKHtcbiAgZmVlZGJhY2ssXG4gIHNldElzSG92ZXJlZCxcbn06IHtcbiAgZmVlZGJhY2s6IEZlZWRiYWNrUmVzcG9uc2U7XG4gIHNldElzSG92ZXJlZDogKGlzSG92ZXJlZDogYm9vbGVhbikgPT4gdm9pZDtcbn0pID0+IHtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgeyByb290RGlyLCBzZXRTZWxlY3RlZEZlZWRiYWNrIH0gPSB1c2VGZWVkYmFja0NvbnRleHQoKTtcbiAgY29uc3QgeyBtdXRhdGU6IGRlbGV0ZUZlZWRiYWNrIH0gPSB1c2VEZWxldGVGZWVkYmFjaygpO1xuICBjb25zdCB7IG11dGF0ZTogdXBkYXRlRmVlZGJhY2sgfSA9IHVzZVVwZGF0ZUZlZWRiYWNrKCk7XG5cbiAgY29uc3QgcGF0aCA9IGB2c2NvZGU6Ly9maWxlJHtyb290RGlyICsgZmVlZGJhY2suZWxlbWVudElkfWA7XG5cbiAgY29uc3QgaGFuZGxlUmVzb2x2ZUZlZWRiYWNrID0gKCkgPT4ge1xuICAgIHVwZGF0ZUZlZWRiYWNrKFxuICAgICAge1xuICAgICAgICBmZWVkYmFja0lkOiBmZWVkYmFjay5pZCxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIGlzUmVzb2x2ZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgICAgICAgIHNldElzSG92ZXJlZChmYWxzZSk7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRGZWVkYmFjayhudWxsKTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxpbWdcbiAgICAgICAgc3JjPVwiL2ZlZWRiYWNrL2RvdHMtaG9yaXpvbnRhbC5zdmdcIlxuICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00XCJcbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNPcGVuKChvKSA9PiAhbyl9XG4gICAgICAvPlxuICAgICAge2lzT3BlbiAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTggcmlnaHQtMiB6LTExIGZsZXggZmxleC1jb2wgICBiZy1ncmF5LWZlZWRiYWNrLTgwMCByb3VuZGVkLWxnXCI+XG4gICAgICAgICAgPE1lbnVJdGVtXG4gICAgICAgICAgICBsYWJlbD1cIk91dnJpciBkYW5zIFZTY29kZVwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHBhdGgsIFwiX2JsYW5rXCIpO1xuICAgICAgICAgICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxNZW51SXRlbSBsYWJlbD1cIlLDqXNvbHVcIiBvbkNsaWNrPXtoYW5kbGVSZXNvbHZlRmVlZGJhY2t9IC8+XG4gICAgICAgICAgPE1lbnVJdGVtXG4gICAgICAgICAgICBsYWJlbD1cIlN1cHByaW1lclwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgIGRlbGV0ZUZlZWRiYWNrKGZlZWRiYWNrLCB7XG4gICAgICAgICAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC8+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VDcmVhdGVSZXBseSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9mZWVkYmFja1wiO1xuaW1wb3J0IHsgQ2xvc2VCdXR0b24gfSBmcm9tIFwiLi4vLi4vLi4vYXRvbXMvYnV0dG9ucy9DbG9zZUJ1dHRvblwiO1xuaW1wb3J0IHsgUmVwbHlJdGVtIH0gZnJvbSBcIi4uLy4uL3JlcGxpZXMvUmVwbHlJdGVtXCI7XG5pbXBvcnQgeyBGZWVkYmFja1RleHRBcmVhIH0gZnJvbSBcIi4uL3NoYXJlZC9GZWVkYmFja1RleHRBcmVhXCI7XG5pbXBvcnQgeyBNZW51QnV0dG9uIH0gZnJvbSBcIi4uL21lbnUvTWVudUJ1dHRvblwiO1xuaW1wb3J0IHsgRmVlZGJhY2tSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja0l0ZW1TZWxlY3RlZCA9ICh7XG4gIGZlZWRiYWNrLFxuICBzZXRGZWVkYmFja0hlaWdodCxcbiAgc2V0SXNIb3ZlcmVkLFxufToge1xuICBmZWVkYmFjazogRmVlZGJhY2tSZXNwb25zZTtcbiAgc2V0RmVlZGJhY2tIZWlnaHQ6IChoZWlnaHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgc2V0SXNIb3ZlcmVkOiAoaXNIb3ZlcmVkOiBib29sZWFuKSA9PiB2b2lkO1xufSkgPT4ge1xuICBjb25zdCBbcmVwbHksIHNldFJlcGx5XSA9IHVzZVN0YXRlKFwiXCIpO1xuXG4gIGNvbnN0IGZlZWRiYWNrUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgeyBtdXRhdGU6IGNyZWF0ZVJlcGx5IH0gPSB1c2VDcmVhdGVSZXBseShmZWVkYmFjay5pZCk7XG4gIGNvbnN0IHsgc2V0U2VsZWN0ZWRGZWVkYmFjayB9ID0gdXNlRmVlZGJhY2tDb250ZXh0KCk7XG5cbiAgY29uc3QgaGFuZGxlUmVzaXplID0gKCkgPT4ge1xuICAgIGlmICghZmVlZGJhY2tSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIHNldEZlZWRiYWNrSGVpZ2h0KGZlZWRiYWNrUmVmLmN1cnJlbnQuY2xpZW50SGVpZ2h0KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gICAgY3JlYXRlUmVwbHkocmVwbHkpO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGZlZWRiYWNrUmVmLmN1cnJlbnQpIHtcbiAgICAgIHNldEZlZWRiYWNrSGVpZ2h0KGZlZWRiYWNrUmVmLmN1cnJlbnQuY2xpZW50SGVpZ2h0KTtcbiAgICB9XG4gIH0sIFtmZWVkYmFjaywgc2V0RmVlZGJhY2tIZWlnaHRdKTtcblxuICBjb25zdCBoYW5kbGVDbG9zZSA9ICgpID0+IHtcbiAgICBzZXRJc0hvdmVyZWQoZmFsc2UpO1xuICAgIHNldFNlbGVjdGVkRmVlZGJhY2sobnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IHJlZj17ZmVlZGJhY2tSZWZ9IGNsYXNzTmFtZT1cInctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgcC0zICByZWxhdGl2ZSB6LTIwXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImt1bWJoLW1lZGl1bSB0ZXh0LXNtIHRleHQtd2hpdGVcIj5Db21tZW50YWlyZTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxNZW51QnV0dG9uIGZlZWRiYWNrPXtmZWVkYmFja30gc2V0SXNIb3ZlcmVkPXtzZXRJc0hvdmVyZWR9IC8+XG4gICAgICAgICAgPENsb3NlQnV0dG9uIG9uQ2xpY2s9e2hhbmRsZUNsb3NlfSBzaXplPVwic21hbGxcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIG92ZXJmbG93LXktYXV0byBvdmVyZmxvdy14LWhpZGRlbiBtYXgtaC1bMjIwcHhdIHNjcm9sbGJhci1kYXJrIGdhcC0yIHAtM1wiPlxuICAgICAgICAgIHtbZmVlZGJhY2ssIC4uLmZlZWRiYWNrLnJlcGxpZXNdLm1hcCgocmVwbHkpID0+IChcbiAgICAgICAgICAgIDxSZXBseUl0ZW0ga2V5PXtyZXBseS5pZH0gcmVwbHk9e3JlcGx5fSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtLTNcIj5cbiAgICAgICAgICA8RmVlZGJhY2tUZXh0QXJlYVxuICAgICAgICAgICAgdmFsdWU9e3JlcGx5fVxuICAgICAgICAgICAgc2V0VmFsdWU9e3NldFJlcGx5fVxuICAgICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgICAgIGhhbmRsZVJlc2l6ZT17aGFuZGxlUmVzaXplfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgZm9yd2FyZFJlZiwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQge1xuICBGZWVkYmFja0NyZWF0ZUR0byxcbiAgRmVlZGJhY2tSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2xpYnMvYmFja2VuZC1jbGllbnRcIjtcblxuY29uc3QgRkVFREJBQ0tfSU5QVVRfV0lEVEggPSAzNDg7XG5jb25zdCBGRUVEQkFDS19JVEVNX1dJRFRIID0gMjU0O1xuY29uc3QgTUFSR0lOID0gMjQ7XG5jb25zdCBJQ09OX1dJRFRIID0gNDg7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja1Bvc2l0aW9uZXIgPSBmb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCB8IG51bGwsXG4gIHtcbiAgICBmZWVkYmFjazogRmVlZGJhY2tSZXNwb25zZSB8IEZlZWRiYWNrQ3JlYXRlRHRvO1xuICAgIGlzRWRpdGluZz86IGJvb2xlYW47XG4gICAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG4gICAgaXNIb3ZlcmVkPzogYm9vbGVhbjtcbiAgICBmZWVkYmFja0hlaWdodD86IG51bWJlcjtcbiAgICBzZXRTaG91bGRSZXZlcnNlPzogKHNob3VsZFJldmVyc2U6IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgfVxuPihcbiAgKFxuICAgIHtcbiAgICAgIGZlZWRiYWNrLFxuICAgICAgZmVlZGJhY2tIZWlnaHQgPSAwLFxuICAgICAgaXNFZGl0aW5nLFxuICAgICAgaXNTZWxlY3RlZCxcbiAgICAgIGlzSG92ZXJlZCxcbiAgICAgIHNldFNob3VsZFJldmVyc2UsXG4gICAgICBjaGlsZHJlbixcbiAgICB9LFxuICAgIHJlZlxuICApID0+IHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdXNlUmVmPEhUTUxFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgW3Bvc2l0aW9uLCBzZXRQb3NpdGlvbl0gPSB1c2VTdGF0ZSh7XG4gICAgICBib3R0b206IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgfSk7XG4gICAgY29uc3QgW2lzSW5pdGlhbGl6ZWQsIHNldElzSW5pdGlhbGl6ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZVJlc2l6ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0YXJnZXRFbGVtZW50IHx8ICF0YXJnZXRFbGVtZW50LmN1cnJlbnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHRhcmdldEVsZW1lbnQuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBjb25zdCB7IGJvdHRvbSwgbGVmdCwgaXNPdmVyZmxvd2luZ1ggfSA9IGdldFBvc2l0aW9uSW5mb3Moe1xuICAgICAgICAgIGZlZWRiYWNrLFxuICAgICAgICAgIGZlZWRiYWNrSGVpZ2h0LFxuICAgICAgICAgIGlzU2VsZWN0ZWQsXG4gICAgICAgICAgaXNIb3ZlcmVkLFxuICAgICAgICAgIGlzRWRpdGluZyxcbiAgICAgICAgICBkaW1lbnNpb25zLFxuICAgICAgICB9KTtcblxuICAgICAgICBzZXRQb3NpdGlvbih7XG4gICAgICAgICAgYm90dG9tLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzZXRTaG91bGRSZXZlcnNlKSBzZXRTaG91bGRSZXZlcnNlKGlzT3ZlcmZsb3dpbmdYKTtcbiAgICAgICAgc2V0SXNJbml0aWFsaXplZCh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgICAgIGBbZGF0YS1wYXRoPVwiJHtmZWVkYmFjay5lbGVtZW50SWR9XCJdYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tmZWVkYmFjay5lbGVtZW50SW5kZXhdO1xuXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB0YXJnZXRFbGVtZW50LmN1cnJlbnQgPSBlbGVtZW50O1xuICAgICAgICBoYW5kbGVSZXNpemUoKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgaGFuZGxlUmVzaXplKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgaGFuZGxlUmVzaXplKTtcbiAgICAgIH07XG4gICAgfSwgW1xuICAgICAgaXNTZWxlY3RlZCxcbiAgICAgIGlzRWRpdGluZyxcbiAgICAgIGlzSG92ZXJlZCxcbiAgICAgIGZlZWRiYWNrLFxuICAgICAgc2V0U2hvdWxkUmV2ZXJzZSxcbiAgICAgIGZlZWRiYWNrSGVpZ2h0LFxuICAgIF0pO1xuXG4gICAgaWYgKCF0YXJnZXRFbGVtZW50IHx8ICF0YXJnZXRFbGVtZW50LmN1cnJlbnQgfHwgIWlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVQb3J0YWwoXG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgYm90dG9tOiBwb3NpdGlvbi5ib3R0b20sXG4gICAgICAgICAgbGVmdDogcG9zaXRpb24ubGVmdCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBcImFsbCAwLjI1cyBlYXNlLWluLW91dFwiLFxuICAgICAgICAgIHpJbmRleDogaXNTZWxlY3RlZCB8fCBpc0hvdmVyZWQgPyAxMDAwMDAxIDogMTAwMDAwMCxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9kaXY+LFxuICAgICAgZG9jdW1lbnQuYm9keVxuICAgICk7XG4gIH1cbik7XG5cbmNvbnN0IGdldFBvc2l0aW9uSW5mb3MgPSAoe1xuICBmZWVkYmFjayxcbiAgZGltZW5zaW9ucyxcbiAgZmVlZGJhY2tIZWlnaHQsXG4gIGlzU2VsZWN0ZWQsXG4gIGlzSG92ZXJlZCxcbiAgaXNFZGl0aW5nLFxufToge1xuICBmZWVkYmFjazogRmVlZGJhY2tSZXNwb25zZSB8IEZlZWRiYWNrQ3JlYXRlRHRvO1xuICBkaW1lbnNpb25zOiBET01SZWN0O1xuICBmZWVkYmFja0hlaWdodDogbnVtYmVyO1xuICBpc1NlbGVjdGVkPzogYm9vbGVhbjtcbiAgaXNIb3ZlcmVkPzogYm9vbGVhbjtcbiAgaXNFZGl0aW5nPzogYm9vbGVhbjtcbn0pID0+IHtcbiAgY29uc3QgdGFyZ2V0V2lkdGggPSBkaW1lbnNpb25zLndpZHRoIHx8IDA7XG4gIGNvbnN0IHRhcmdldEhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0IHx8IDA7XG5cbiAgY29uc3Qgd2lkdGhSYXRpbyA9IGZlZWRiYWNrLmVsZW1lbnRXaWR0aFxuICAgID8gZmVlZGJhY2suZWxlbWVudFdpZHRoIC8gdGFyZ2V0V2lkdGhcbiAgICA6IDE7XG4gIGNvbnN0IGhlaWdodFJhdGlvID0gZmVlZGJhY2suZWxlbWVudEhlaWdodFxuICAgID8gZmVlZGJhY2suZWxlbWVudEhlaWdodCAvIHRhcmdldEhlaWdodFxuICAgIDogMTtcblxuICBjb25zdCByZWZlcmVuY2VQb3NpdGlvbkxlZnQgPVxuICAgIGZlZWRiYWNrLnggLyB3aWR0aFJhdGlvICsgZGltZW5zaW9ucy5sZWZ0ICsgd2luZG93LnNjcm9sbFg7XG4gIGNvbnN0IHJlZmVyZW5jZVBvc2l0aW9uQm90dG9tID1cbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IC1cbiAgICAoZmVlZGJhY2sueSAvIGhlaWdodFJhdGlvICsgZGltZW5zaW9ucy50b3AgKyB3aW5kb3cuc2Nyb2xsWSk7XG5cbiAgY29uc3QgZmVlZGJhY2tXaWR0aCA9IGlzRWRpdGluZyA/IEZFRURCQUNLX0lOUFVUX1dJRFRIIDogRkVFREJBQ0tfSVRFTV9XSURUSDtcblxuICBjb25zdCBpc092ZXJmbG93aW5nWCA9XG4gICAgcmVmZXJlbmNlUG9zaXRpb25MZWZ0ICsgZmVlZGJhY2tXaWR0aCArIE1BUkdJTiA+XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuXG4gIGNvbnN0IGlzT3ZlcmZsb3dpbmdZID1cbiAgICByZWZlcmVuY2VQb3NpdGlvbkJvdHRvbSArIGZlZWRiYWNrSGVpZ2h0ID5cbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gIGNvbnN0IG9mZnNldEVkaXRpbmcgPSBpc0VkaXRpbmcgPyBGRUVEQkFDS19JTlBVVF9XSURUSCAtIElDT05fV0lEVEggOiAwO1xuICBjb25zdCBvZmZzZXRBY3RpdmUgPVxuICAgIGlzSG92ZXJlZCB8fCBpc1NlbGVjdGVkID8gRkVFREJBQ0tfSVRFTV9XSURUSCAtIElDT05fV0lEVEggOiAwO1xuXG4gIGNvbnN0IHBvc2l0aW9uQm90dG9tID1cbiAgICBpc092ZXJmbG93aW5nWSAmJiBpc1NlbGVjdGVkXG4gICAgICA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgLSBmZWVkYmFja0hlaWdodCAtIE1BUkdJTlxuICAgICAgOiByZWZlcmVuY2VQb3NpdGlvbkJvdHRvbTtcblxuICBjb25zdCBwb3NpdGlvbkxlZnQgPSBpc092ZXJmbG93aW5nWFxuICAgID8gcmVmZXJlbmNlUG9zaXRpb25MZWZ0IC0gb2Zmc2V0RWRpdGluZyAtIG9mZnNldEFjdGl2ZVxuICAgIDogcmVmZXJlbmNlUG9zaXRpb25MZWZ0O1xuXG4gIHJldHVybiB7XG4gICAgYm90dG9tOiBwb3NpdGlvbkJvdHRvbSxcbiAgICBsZWZ0OiBwb3NpdGlvbkxlZnQsXG4gICAgaXNPdmVyZmxvd2luZ1gsXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUZlZWRiYWNrQ29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb250ZXh0cy9GZWVkYmFja0NvbnRleHRcIjtcbmltcG9ydCB7IGdldEluaXRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWxzL2dldEluaXRpYWxzXCI7XG5pbXBvcnQgeyBGZWVkYmFja0l0ZW1Ib3ZlcmVkIH0gZnJvbSBcIi4vRmVlZGJhY2tJdGVtSG92ZXJlZFwiO1xuaW1wb3J0IHsgRmVlZGJhY2tJdGVtU2VsZWN0ZWQgfSBmcm9tIFwiLi9GZWVkYmFja0l0ZW1TZWxlY3RlZFwiO1xuaW1wb3J0IHsgRmVlZGJhY2tQb3NpdGlvbmVyIH0gZnJvbSBcIi4uL3NoYXJlZC9GZWVkYmFja1Bvc2l0aW9uZXJcIjtcbmltcG9ydCB7IEZlZWRiYWNrUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vbGlicy9iYWNrZW5kLWNsaWVudFwiO1xuXG5leHBvcnQgY29uc3QgRmVlZGJhY2tQaW4gPSAoeyBmZWVkYmFjayB9OiB7IGZlZWRiYWNrOiBGZWVkYmFja1Jlc3BvbnNlIH0pID0+IHtcbiAgY29uc3QgW2lzSG92ZXJlZCwgc2V0SXNIb3ZlcmVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2ZlZWRiYWNrSGVpZ2h0LCBzZXRGZWVkYmFja0hlaWdodF0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgeyBzZWxlY3RlZEZlZWRiYWNrLCBzZXRTZWxlY3RlZEZlZWRiYWNrIH0gPSB1c2VGZWVkYmFja0NvbnRleHQoKTtcblxuICBjb25zdCBpbml0aWFscyA9IGdldEluaXRpYWxzKGZlZWRiYWNrLnVzZXIpO1xuXG4gIGNvbnN0IGlzU2VsZWN0ZWQgPSBzZWxlY3RlZEZlZWRiYWNrICYmIGZlZWRiYWNrLmlkID09PSBzZWxlY3RlZEZlZWRiYWNrLmlkO1xuXG4gIHJldHVybiAoXG4gICAgPEZlZWRiYWNrUG9zaXRpb25lclxuICAgICAgZmVlZGJhY2s9e2ZlZWRiYWNrfVxuICAgICAgaXNTZWxlY3RlZD17ISFpc1NlbGVjdGVkfVxuICAgICAgaXNIb3ZlcmVkPXtpc0hvdmVyZWR9XG4gICAgICBmZWVkYmFja0hlaWdodD17aXNIb3ZlcmVkICYmICFpc1NlbGVjdGVkID8gOTYgOiBmZWVkYmFja0hlaWdodH1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIG9uTW91c2VFbnRlcj17KCkgPT4gc2V0SXNIb3ZlcmVkKHRydWUpfVxuICAgICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldElzSG92ZXJlZChmYWxzZSl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNlbGVjdGVkRmVlZGJhY2soZmVlZGJhY2spfVxuICAgICAgICBjbGFzc05hbWU9e2BmZWVkYmFjay1pdGVtICR7aXNTZWxlY3RlZCAmJiBcInNlbGVjdGVkXCJ9ICR7XG4gICAgICAgICAgZmVlZGJhY2suaXNSZXNvbHZlZCAmJiAhaXNIb3ZlcmVkICYmICFpc1NlbGVjdGVkICYmIFwib3BhY2l0eS01MFwiXG4gICAgICAgIH1gfVxuICAgICAgPlxuICAgICAgICB7aXNTZWxlY3RlZCA/IChcbiAgICAgICAgICA8RmVlZGJhY2tJdGVtU2VsZWN0ZWRcbiAgICAgICAgICAgIGZlZWRiYWNrPXtmZWVkYmFja31cbiAgICAgICAgICAgIHNldEZlZWRiYWNrSGVpZ2h0PXtzZXRGZWVkYmFja0hlaWdodH1cbiAgICAgICAgICAgIHNldElzSG92ZXJlZD17c2V0SXNIb3ZlcmVkfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBpc0hvdmVyZWQgPyAoXG4gICAgICAgICAgPEZlZWRiYWNrSXRlbUhvdmVyZWQgZmVlZGJhY2s9e2ZlZWRiYWNrfSAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXNocmluay0wIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB3LTYgaC02IG0tM1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC13aGl0ZSBmb250LW1lZGl1bVwiPntpbml0aWFsc308L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L0ZlZWRiYWNrUG9zaXRpb25lcj5cbiAgKTtcbn07XG4iLCJpbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQgeyBGZWVkYmFja1BpbiB9IGZyb20gXCIuLi9pdGVtL0ZlZWRiYWNrUGluXCI7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja1BpbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHsgaXNPcGVuLCBmZWVkYmFja3MgfSA9IHVzZUZlZWRiYWNrQ29udGV4dCgpO1xuXG4gIGlmICghaXNPcGVuIHx8ICFmZWVkYmFja3MpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBmZWVkYmFja3NcbiAgICAuZmlsdGVyKChmZWVkYmFjaykgPT4gZmVlZGJhY2sucGF0aCA9PT0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKVxuICAgIC5tYXAoKGZlZWRiYWNrKSA9PiA8RmVlZGJhY2tQaW4ga2V5PXtmZWVkYmFjay5pZH0gZmVlZGJhY2s9e2ZlZWRiYWNrfSAvPik7XG59O1xuIiwiZXhwb3J0IGNvbnN0IENvbW1lbnRJY29uID0gKHsgYWN0aXZlIH06IHsgYWN0aXZlOiBib29sZWFuIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Bjb21tZW50LWljb24gJHthY3RpdmUgPyBcImNvbW1lbnQtaWNvbi1hY3RpdmVcIiA6IFwiXCJ9YH1cbiAgICA+PC9kaXY+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUZlZWRiYWNrQ29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb250ZXh0cy9GZWVkYmFja0NvbnRleHRcIjtcbmltcG9ydCB7IHVzZUNyZWF0ZUZlZWRiYWNrIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NlcnZpY2VzL2ZlZWRiYWNrXCI7XG5pbXBvcnQgeyBDb21tZW50SWNvbiB9IGZyb20gXCIuLi8uLi8uLi9hdG9tcy9pY29ucy9Db21tZW50SWNvblwiO1xuaW1wb3J0IHsgRmVlZGJhY2tQb3NpdGlvbmVyIH0gZnJvbSBcIi4uL3NoYXJlZC9GZWVkYmFja1Bvc2l0aW9uZXJcIjtcbmltcG9ydCB7IEZlZWRiYWNrVGV4dEFyZWEgfSBmcm9tIFwiLi4vc2hhcmVkL0ZlZWRiYWNrVGV4dEFyZWFcIjtcblxuZXhwb3J0IGNvbnN0IEZlZWRiYWNrSW5wdXQgPSAoKSA9PiB7XG4gIGNvbnN0IHsgbmV3RmVlZGJhY2ssIHJlc2V0RmVlZGJhY2ssIG5ld0ZlZWRiYWNrUmVmIH0gPSB1c2VGZWVkYmFja0NvbnRleHQoKTtcbiAgY29uc3QgW2NvbW1lbnQsIHNldENvbW1lbnRdID0gdXNlU3RhdGUobmV3RmVlZGJhY2s/LmNvbW1lbnQgfHwgXCJcIik7XG4gIGNvbnN0IFtzaG91bGRSZXZlcnNlLCBzZXRTaG91bGRSZXZlcnNlXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCB7IG11dGF0ZTogY3JlYXRlRmVlZGJhY2sgfSA9IHVzZUNyZWF0ZUZlZWRiYWNrKCk7XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCkgPT4ge1xuICAgIGlmICghbmV3RmVlZGJhY2spIHJldHVybjtcbiAgICBjcmVhdGVGZWVkYmFjayh7XG4gICAgICAuLi5uZXdGZWVkYmFjayxcbiAgICAgIHg6IG5ld0ZlZWRiYWNrLngsXG4gICAgICB5OiBuZXdGZWVkYmFjay55LFxuICAgICAgY29tbWVudCxcbiAgICB9KTtcbiAgICByZXNldEZlZWRiYWNrKCk7XG4gIH07XG5cbiAgaWYgKCFuZXdGZWVkYmFjaykgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8RmVlZGJhY2tQb3NpdGlvbmVyXG4gICAgICByZWY9e25ld0ZlZWRiYWNrUmVmfVxuICAgICAgZmVlZGJhY2s9e25ld0ZlZWRiYWNrfVxuICAgICAgc2V0U2hvdWxkUmV2ZXJzZT17c2V0U2hvdWxkUmV2ZXJzZX1cbiAgICAgIGlzRWRpdGluZz17dHJ1ZX1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImNvbW1lbnQtY29udGFpbmVyXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBzaG91bGRSZXZlcnNlID8gXCJyb3ctcmV2ZXJzZVwiIDogXCJyb3dcIixcbiAgICAgICAgICBhbGlnbkl0ZW1zOiBjb21tZW50Lmxlbmd0aCA+IDAgPyBcImZsZXgtc3RhcnRcIiA6IFwiZmxleC1lbmRcIixcbiAgICAgICAgICB0b3A6IGNvbW1lbnQubGVuZ3RoID4gMCA/IFwiNTFweFwiIDogXCIwcHhcIixcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPENvbW1lbnRJY29uIGFjdGl2ZT17Y29tbWVudC5sZW5ndGggPiAwfSAvPlxuICAgICAgICA8RmVlZGJhY2tUZXh0QXJlYVxuICAgICAgICAgIHZhbHVlPXtjb21tZW50fVxuICAgICAgICAgIHNldFZhbHVlPXtzZXRDb21tZW50fVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgICAgaXNBbmltYXRlZFxuICAgICAgICAgIGlzRGFya1xuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9GZWVkYmFja1Bvc2l0aW9uZXI+XG4gICk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IENvbGxhcHNlQnV0dG9uID0gKHtcbiAgaXNDb2xsYXBzZWQsXG4gIHNldElzQ29sbGFwc2VkLFxufToge1xuICBpc0NvbGxhcHNlZDogYm9vbGVhbjtcbiAgc2V0SXNDb2xsYXBzZWQ6IFJlYWN0LkRpc3BhdGNoPFJlYWN0LlNldFN0YXRlQWN0aW9uPGJvb2xlYW4+Pjtcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBzZXRJc0NvbGxhcHNlZCgoYykgPT4gIWMpO1xuICAgICAgfX1cbiAgICAgIGNsYXNzTmFtZT1cImgtMTYgdy0xNiByb3VuZGVkLWZ1bGwgYWJzb2x1dGUgbGVmdC1bLTMycHhdIGJvdHRvbS0wIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHByLTYgYmctZ3JheS1mZWVkYmFjay04MDBcIlxuICAgID5cbiAgICAgIDxpbWdcbiAgICAgICAgc3JjPXtcbiAgICAgICAgICBpc0NvbGxhcHNlZFxuICAgICAgICAgICAgPyBcIi9mZWVkYmFjay9jaGV2cm9uLWxlZnQuc3ZnXCJcbiAgICAgICAgICAgIDogXCIvZmVlZGJhY2svY2hldnJvbi1yaWdodC5zdmdcIlxuICAgICAgICB9XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZU11dGF0aW9uLCB1c2VRdWVyeUNsaWVudCB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCBhcGkgZnJvbSBcIi4vYXBpXCI7XG5pbXBvcnQgeyBTaWduSW5EdG8sIFNpZ25VcER0byB9IGZyb20gXCIuLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBzaWduSW4gPSBhc3luYyAocGF5bG9hZDogU2lnbkluRHRvKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLmF1dGguYXV0aENvbnRyb2xsZXJTaWduSW4ocGF5bG9hZCk7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIsIHJlc3BvbnNlLmRhdGEuYWNjZXNzVG9rZW4pO1xuICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduVXAgPSBhc3luYyAocGF5bG9hZDogU2lnblVwRHRvKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLmF1dGguYXV0aENvbnRyb2xsZXJTaWduVXAocGF5bG9hZCk7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIsIHJlc3BvbnNlLmRhdGEuYWNjZXNzVG9rZW4pO1xuICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2dvdXQgPSBhc3luYyAoKSA9PiB7XG4gIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVNpZ25JbiA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IHNpZ25JbixcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIHJldHVybiBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcygpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVNpZ25VcCA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IHNpZ25VcCxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIHJldHVybiBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcygpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUxvZ291dCA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGxvZ291dCxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIHJldHVybiBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcygpO1xuICAgIH0sXG4gIH0pO1xufTtcbiIsImltcG9ydCB7IHVzZUxvZ291dCB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9hdXRoXCI7XG5pbXBvcnQgeyB1c2VNZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy91c2VyXCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi4vYXRvbXMvYnV0dG9ucy9CdXR0b25cIjtcblxuZXhwb3J0IGNvbnN0IENvbm5lY3RlZFVzZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHsgZGF0YTogbWUgfSA9IHVzZU1lKCk7XG4gIGNvbnN0IHsgbXV0YXRlOiBsb2dvdXQgfSA9IHVzZUxvZ291dCgpO1xuXG4gIGNvbnN0IGhhbmRsZUxvZ291dCA9ICgpID0+IHtcbiAgICBsb2dvdXQoKTtcbiAgfTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiB0ZXh0LWdyYXktZmVlZGJhY2stMjAwIHotMTBcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cImt1bWJoLW1lZGl1bSB0ZXh0LXNtIHRleHQtZ3JheS1mZWVkYmFjay0zMDBcIj5cbiAgICAgICAgICB7bWU/LmZ1bGxOYW1lIHx8IGAke21lPy5maXJzdE5hbWV9ICR7bWU/Lmxhc3ROYW1lfWB9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LXhzIGxlYWRpbmctWzEycHhdIHRleHQtZ3JheS1mZWVkYmFjay0zMDBcIj5cbiAgICAgICAgICB7bWU/LmVtYWlsfVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxpbWdcbiAgICAgICAgb25DbGljaz17aGFuZGxlTG9nb3V0fVxuICAgICAgICBzcmM9XCIvZmVlZGJhY2svbG9nLW91dC0wMi5zdmdcIlxuICAgICAgICBjbGFzc05hbWU9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImV4cG9ydCBjb25zdCBTZWFyY2hJbnB1dCA9ICh7XG4gIHZhbHVlLFxuICBzZXRWYWx1ZSxcbn06IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgc2V0VmFsdWU6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGJnLWdyYXktZmVlZGJhY2stNzAwIGJvcmRlci1ncmF5LWZlZWRiYWNrLTUwMCByb3VuZGVkLWxnIHB4LTMgcHktMiBmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPGltZyBzcmM9e1wiL2ZlZWRiYWNrL3NlYXJjaC5zdmdcIn0gY2xhc3NOYW1lPVwidy02IGgtNlwiIC8+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT17XCJ0ZXh0XCJ9XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBiZy1ncmF5LWZlZWRiYWNrLTcwMCBvdXRsaW5lLW5vbmUgYm9yZGVyLW5vbmUgdGV4dC13aGl0ZVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuaW1wb3J0IHsgdXNlRmVlZGJhY2tDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvbnRleHRzL0ZlZWRiYWNrQ29udGV4dFwiO1xuaW1wb3J0IHsgRmVlZGJhY2tSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja0xpc3RJdGVtID0gKHtcbiAgZmVlZGJhY2ssXG59OiB7XG4gIGZlZWRiYWNrOiBGZWVkYmFja1Jlc3BvbnNlO1xufSkgPT4ge1xuICBjb25zdCB7IHVzZXIsIGNyZWF0ZWRBdCwgY29tbWVudCwgcGF0aCwgcmVwbGllcyB9ID0gZmVlZGJhY2s7XG4gIGNvbnN0IHsgc2VsZWN0ZWRGZWVkYmFjaywgc2V0U2VsZWN0ZWRGZWVkYmFjaywgbmF2aWdhdGUgfSA9XG4gICAgdXNlRmVlZGJhY2tDb250ZXh0KCk7XG5cbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSBhc3luYyAoKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWRGZWVkYmFjayhmZWVkYmFjayk7XG4gICAgbmF2aWdhdGUoZmVlZGJhY2sucGF0aCk7XG4gIH07XG5cbiAgY29uc3QgcmVwbGllc0NvdW50ID0gcmVwbGllcy5sZW5ndGg7XG5cbiAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkRmVlZGJhY2sgJiYgZmVlZGJhY2suaWQgPT09IHNlbGVjdGVkRmVlZGJhY2suaWQ7XG5cbiAgY29uc3QgaXNTZWxlY3RlZENsYXNzID0gaXNTZWxlY3RlZFxuICAgID8gXCJiZy1wcmltYXJ5LWZlZWRiYWNrLTYwMFwiXG4gICAgOiBcIiBob3ZlcjpiZy1ncmF5LWZlZWRiYWNrLTcwMFwiO1xuXG4gIGNvbnN0IHRleHRDb2xvckNsYXNzID0gaXNTZWxlY3RlZFxuICAgID8gXCJ0ZXh0LXdoaXRlXCJcbiAgICA6IFwidGV4dC1wcmltYXJ5LWZlZWRiYWNrLTQwMFwiO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtgZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCByb3VuZGVkLWxnICR7aXNTZWxlY3RlZENsYXNzfSBwLTJgfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJrdW1iaC1tZWRpdW0gdGV4dC1zbSB0ZXh0LWdyYXktZmVlZGJhY2stMjAwXCI+XG4gICAgICAgICAge3VzZXI/LmZ1bGxOYW1lIHx8IGAke3VzZXI/LmZpcnN0TmFtZX0gJHt1c2VyPy5sYXN0TmFtZX1gfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImt1bWJoLXJlZ3VsYXIgdGV4dC1bMTBweF0gbGVhZGluZy1bMTJweF0gdGV4dC1ncmF5LWZlZWRiYWNrLTMwMFwiPlxuICAgICAgICAgIHttb21lbnQoY3JlYXRlZEF0KS5mcm9tTm93KCl9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LXhzIHRleHQtd2hpdGVcIj57cGF0aH08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJtdC0yIGt1bWJoLXJlZ3VsYXIgdGV4dC1iYXNlIHRleHQtd2hpdGVcIj57Y29tbWVudH08L3NwYW4+XG4gICAgICB7cmVwbGllc0NvdW50ID4gMCAmJiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17YG10LTIga3VtYmgtcmVndWxhciB0ZXh0LXhzICR7dGV4dENvbG9yQ2xhc3N9YH0+XG4gICAgICAgICAge3JlcGxpZXNDb3VudH0gcsOpcG9uc2V7cmVwbGllc0NvdW50ID4gMSA/IFwic1wiIDogXCJcIn1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlRmVlZGJhY2tDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvbnRleHRzL0ZlZWRiYWNrQ29udGV4dFwiO1xuaW1wb3J0IHsgU2VhcmNoSW5wdXQgfSBmcm9tIFwiLi4vLi4vLi4vYXRvbXMvaW5wdXRzL1NlYXJjaElucHV0XCI7XG5pbXBvcnQgeyBGZWVkYmFja0xpc3RJdGVtIH0gZnJvbSBcIi4uL2l0ZW0vRmVlZGJhY2tMaXN0SXRlbVwiO1xuXG5leHBvcnQgY29uc3QgRmVlZGJhY2tMaXN0ID0gKCkgPT4ge1xuICBjb25zdCB7IGZlZWRiYWNrcyB9ID0gdXNlRmVlZGJhY2tDb250ZXh0KCk7XG4gIGNvbnN0IFtzZWFyY2gsIHNldFNlYXJjaF0gPSB1c2VTdGF0ZShcIlwiKTtcblxuICBjb25zdCBmaWx0ZXJlZEZlZWRiYWNrcyA9IGZlZWRiYWNrcz8uZmlsdGVyKFxuICAgIChmZWVkYmFjaykgPT5cbiAgICAgICFzZWFyY2ggfHxcbiAgICAgIGZlZWRiYWNrLnBhdGguaW5jbHVkZXMoc2VhcmNoKSB8fFxuICAgICAgZmVlZGJhY2suY29tbWVudC5pbmNsdWRlcyhzZWFyY2gpXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBmbGV4LTEgZmxleCBmbGV4LWNvbCAgcHQtOCBvdmVyZmxvdy1oaWRkZW4gei0xMFwiPlxuICAgICAgPFNlYXJjaElucHV0IHZhbHVlPXtzZWFyY2h9IHNldFZhbHVlPXtzZXRTZWFyY2h9IC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBmbGV4IGZsZXgtY29sIGdhcC00IG10LTQgb3ZlcmZsb3cteS1hdXRvIHNjcm9sbGJhci1oaWRlXCI+XG4gICAgICAgIHtmaWx0ZXJlZEZlZWRiYWNrcyAmJlxuICAgICAgICAgIGZpbHRlcmVkRmVlZGJhY2tzLm1hcCgoZmVlZGJhY2spID0+IChcbiAgICAgICAgICAgIDxGZWVkYmFja0xpc3RJdGVtIGtleT17ZmVlZGJhY2suaWR9IGZlZWRiYWNrPXtmZWVkYmFja30gLz5cbiAgICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCB7IENvbm5lY3RlZFVzZXIgfSBmcm9tIFwiLi4vbW9sZWN1bGVzL0Nvbm5lY3RlZFVzZXJcIjtcbmltcG9ydCB7IEZlZWRiYWNrTGlzdCB9IGZyb20gXCIuLi9tb2xlY3VsZXMvZmVlZGJhY2tzL2dyb3VwL0ZlZWRiYWNrTGlzdFwiO1xuXG5leHBvcnQgY29uc3QgQ29ubmVjdGVkUGFuZWwgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgZmxleC0xIGZsZXggZmxleC1jb2wgaXRlbXMtc3RyZXRjaCBqdXN0aWZ5LWJldHdlZW4gXCI+XG4gICAgICA8RmVlZGJhY2tMaXN0IC8+XG4gICAgICA8Q29ubmVjdGVkVXNlciAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImV4cG9ydCBjb25zdCBJbnB1dCA9ICh7XG4gIGxhYmVsLFxuICBwbGFjZWhvbGRlcixcbiAgdHlwZSxcbiAgdmFsdWUsXG4gIHNldFZhbHVlLFxufToge1xuICBsYWJlbDogc3RyaW5nO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHNldFZhbHVlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJrdW1iaC1tZWRpdW0gdGV4dC1zbSB0ZXh0LWdyYXktZmVlZGJhY2stNDAwIG1iLVs2cHhdXCI+XG4gICAgICAgIHtsYWJlbH1cbiAgICAgIDwvbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT17dHlwZX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0VmFsdWUoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZCB0ZXh0LWJsYWNrIGJvcmRlciBib3JkZXItZ3JheS1mZWVkYmFjay00MDAgcHktMiBweC0zIG1iLTQgcGxhY2Vob2xkZXI6dGV4dC1ncmF5LWZlZWRiYWNrLTMwMFwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gXCIuLi8uLi9hdG9tcy9pbnB1dHMvSW5wdXRcIjtcbmltcG9ydCB7IHVzZVNpZ25VcCB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoXCI7XG5pbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5cbmV4cG9ydCBjb25zdCBTaWduVXBGb3JtID0gKHtcbiAgY2xvc2VNb2RhbCxcbiAgc2V0SXNTaWduaW5nVXAsXG59OiB7XG4gIGNsb3NlTW9kYWw6ICgpID0+IHZvaWQ7XG4gIHNldElzU2lnbmluZ1VwOiAoaXNTaWduaW5nVXA6IGJvb2xlYW4pID0+IHZvaWQ7XG59KSA9PiB7XG4gIGNvbnN0IFtmaXJzdE5hbWUsIHNldEZpcnN0TmFtZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2xhc3ROYW1lLCBzZXRMYXN0TmFtZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2VtYWlsLCBzZXRFbWFpbF0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3Bhc3N3b3JkLCBzZXRQYXNzd29yZF0gPSB1c2VTdGF0ZShcIlwiKTtcblxuICBjb25zdCB7IG11dGF0ZTogc2lnblVwIH0gPSB1c2VTaWduVXAoKTtcbiAgY29uc3QgeyBhY3RpdmF0ZUZlZWRiYWNrTW9kZSB9ID0gdXNlRmVlZGJhY2tDb250ZXh0KCk7XG5cbiAgY29uc3QgaGFuZGxlU2lnblVwID0gKCkgPT4ge1xuICAgIHNpZ25VcChcbiAgICAgIHsgZmlyc3ROYW1lLCBsYXN0TmFtZSwgZW1haWwsIHBhc3N3b3JkIH0sXG4gICAgICB7XG4gICAgICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgICAgIGNsb3NlTW9kYWwoKTtcbiAgICAgICAgICBhY3RpdmF0ZUZlZWRiYWNrTW9kZSgpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgei0xMCBmbGV4IGZsZXgtY29sIGp1c3RpZnktc3RhcnRcIj5cbiAgICAgIDxpbWdcbiAgICAgICAgc3JjPVwiL2ZlZWRiYWNrL2xvZ28tZmVlZGJhY2stZGFyay5zdmdcIlxuICAgICAgICBjbGFzc05hbWU9XCJtYi0xMiBoLVs0M3B4XSB3LW1pblwiXG4gICAgICAvPlxuICAgICAgPGgxIGNsYXNzTmFtZT1cImt1bWJoLXNlbWlib2xkIHRleHQtM3hsIHRleHQtZ3JheS1mZWVkYmFjay05MDAgbWItM1wiPlxuICAgICAgICBJbnNjcmlwdGlvblxuICAgICAgPC9oMT5cblxuICAgICAgPElucHV0XG4gICAgICAgIGxhYmVsPVwiUHLDqW5vbVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiUHLDqW5vbVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgdmFsdWU9e2ZpcnN0TmFtZX1cbiAgICAgICAgc2V0VmFsdWU9e3NldEZpcnN0TmFtZX1cbiAgICAgIC8+XG4gICAgICA8SW5wdXRcbiAgICAgICAgbGFiZWw9XCJOb21cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIk5vbVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgdmFsdWU9e2xhc3ROYW1lfVxuICAgICAgICBzZXRWYWx1ZT17c2V0TGFzdE5hbWV9XG4gICAgICAvPlxuICAgICAgPElucHV0XG4gICAgICAgIGxhYmVsPVwiRS1tYWlsXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJFLW1haWxcIlxuICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICB2YWx1ZT17ZW1haWx9XG4gICAgICAgIHNldFZhbHVlPXtzZXRFbWFpbH1cbiAgICAgIC8+XG4gICAgICA8SW5wdXRcbiAgICAgICAgbGFiZWw9XCJNb3QgZGUgcGFzc2VcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIk1vdCBkZSBwYXNzZVwiXG4gICAgICAgIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICAgIHZhbHVlPXtwYXNzd29yZH1cbiAgICAgICAgc2V0VmFsdWU9e3NldFBhc3N3b3JkfVxuICAgICAgLz5cbiAgICAgIDxidXR0b25cbiAgICAgICAgb25DbGljaz17aGFuZGxlU2lnblVwfVxuICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtNCBweS0yIGJnLWJsdWUtNTAwIGt1bWJoLW1lZGl1bSB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgbXQtMiAgZGlzYWJsZWQ6YmctYmx1ZS0xMDAgZGlzYWJsZWQ6dGV4dC1ibHVlLTMwMFwiXG4gICAgICA+XG4gICAgICAgIFMnaW5zY3JpcmVcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc1NpZ25pbmdVcChmYWxzZSl9XG4gICAgICAgIGNsYXNzTmFtZT1cImZvbnQtYm9sZCB0ZXh0LWNlbnRlciB0ZXh0LWJsYWNrIHRleHQtc20gbXQtMlwiXG4gICAgICA+XG4gICAgICAgIFNlIGNvbm5lY3RlclxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlU2lnbkluIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2F1dGhcIjtcbmltcG9ydCB7IElucHV0IH0gZnJvbSBcIi4uLy4uL2F0b21zL2lucHV0cy9JbnB1dFwiO1xuaW1wb3J0IHsgdXNlRmVlZGJhY2tDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL0ZlZWRiYWNrQ29udGV4dFwiO1xuXG5jb25zdCBTaWduSW5Gb3JtID0gKHtcbiAgc2V0SXNTaWduaW5nVXAsXG4gIGNsb3NlTW9kYWwsXG59OiB7XG4gIHNldElzU2lnbmluZ1VwOiAoaXNTaWduaW5nVXA6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGNsb3NlTW9kYWw6ICgpID0+IHZvaWQ7XG59KSA9PiB7XG4gIGNvbnN0IFtlbWFpbCwgc2V0RW1haWxdID0gUmVhY3QudXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gUmVhY3QudXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gUmVhY3QudXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IHsgbXV0YXRlOiBzaWduSW4gfSA9IHVzZVNpZ25JbigpO1xuICBjb25zdCB7IGFjdGl2YXRlRmVlZGJhY2tNb2RlIH0gPSB1c2VGZWVkYmFja0NvbnRleHQoKTtcblxuICBjb25zdCBoYW5kbGVMb2dpbiA9ICgpID0+IHtcbiAgICBzaWduSW4oXG4gICAgICB7IGVtYWlsLCBwYXNzd29yZCB9LFxuICAgICAge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICBjbG9zZU1vZGFsKCk7XG4gICAgICAgICAgYWN0aXZhdGVGZWVkYmFja01vZGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSA9PT0gXCJOZXR3b3JrIEVycm9yXCIpIHtcbiAgICAgICAgICAgIHNldEVycm9yKFwiVW5lIGVycmV1ciByw6lzZWF1IGVzdCBzdXJ2ZW51ZVwiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2UgPT09IFwiSW52YWxpZCBjcmVkZW50aWFsc1wiKSB7XG4gICAgICAgICAgICBzZXRFcnJvcihcIkVtYWlsIG91IG1vdCBkZSBwYXNzZSBpbnZhbGlkZVwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0RXJyb3IoXCJVbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICAvLyBjb25zdCBoYW5kbGVHaXRodWJMb2dpbiA9ICgpID0+IHtcbiAgLy8gICBjb25zdCBjdXJyZW50VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIC8vICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgaHR0cDovL2xvY2FsaG9zdDozMDAwL2F1dGgvZ2l0aHViP3JlZGlyZWN0VXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAvLyAgICAgY3VycmVudFVybFxuICAvLyAgICl9YDtcbiAgLy8gfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIHotMTAgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LXN0YXJ0XCI+XG4gICAgICA8aW1nXG4gICAgICAgIHNyYz1cIi9mZWVkYmFjay9sb2dvLWZlZWRiYWNrLWRhcmsuc3ZnXCJcbiAgICAgICAgY2xhc3NOYW1lPVwibWItMTIgaC1bNDNweF0gdy1taW5cIlxuICAgICAgLz5cbiAgICAgIDxoMSBjbGFzc05hbWU9XCJrdW1iaC1zZW1pYm9sZCB0ZXh0LTN4bCB0ZXh0LWdyYXktZmVlZGJhY2stOTAwIG1iLTNcIj5cbiAgICAgICAgQ29ubmV4aW9uXG4gICAgICA8L2gxPlxuICAgICAgPElucHV0XG4gICAgICAgIGxhYmVsPVwiRW1haWxcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkVtYWlsXCJcbiAgICAgICAgdHlwZT1cImVtYWlsXCJcbiAgICAgICAgdmFsdWU9e2VtYWlsfVxuICAgICAgICBzZXRWYWx1ZT17c2V0RW1haWx9XG4gICAgICAvPlxuICAgICAgPElucHV0XG4gICAgICAgIGxhYmVsPVwiTW90IGRlIHBhc3NlXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJNb3QgZGUgcGFzc2VcIlxuICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICB2YWx1ZT17cGFzc3dvcmR9XG4gICAgICAgIHNldFZhbHVlPXtzZXRQYXNzd29yZH1cbiAgICAgIC8+XG4gICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXJlZC01MDAgdGV4dC14cyBoLTQgdGV4dC1jZW50ZXJcIj57ZXJyb3J9PC9wPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZUxvZ2lufVxuICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtNCBweS0yIGJnLWJsdWUtNTAwIGt1bWJoLW1lZGl1bSB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgbXQtMiAgZGlzYWJsZWQ6YmctYmx1ZS0xMDAgZGlzYWJsZWQ6dGV4dC1ibHVlLTMwMFwiXG4gICAgICA+XG4gICAgICAgIFNlIGNvbm5lY3RlclxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzU2lnbmluZ1VwKHRydWUpfVxuICAgICAgICBjbGFzc05hbWU9XCJmb250LWJvbGQgdGV4dC1jZW50ZXIgdGV4dC1ibGFjayB0ZXh0LXNtIG10LTJcIlxuICAgICAgPlxuICAgICAgICBTJ2luc2NyaXJlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNpZ25JbkZvcm07XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU2lnblVwRm9ybSB9IGZyb20gXCIuLi9tb2xlY3VsZXMvZm9ybXMvU2lnblVwRm9ybVwiO1xuaW1wb3J0IFNpZ25JbkZvcm0gZnJvbSBcIi4uL21vbGVjdWxlcy9mb3Jtcy9TaWduSW5Gb3JtXCI7XG5cbmV4cG9ydCBjb25zdCBDb25uZWN0aW9uID0gKHsgY2xvc2VNb2RhbCB9OiB7IGNsb3NlTW9kYWw6ICgpID0+IHZvaWQgfSkgPT4ge1xuICBjb25zdCBbaXNTaWduaW5nVXAsIHNldElzU2lnbmluZ1VwXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicC04XCI+XG4gICAgICB7aXNTaWduaW5nVXAgPyAoXG4gICAgICAgIDxTaWduVXBGb3JtIGNsb3NlTW9kYWw9e2Nsb3NlTW9kYWx9IHNldElzU2lnbmluZ1VwPXtzZXRJc1NpZ25pbmdVcH0gLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxTaWduSW5Gb3JtIHNldElzU2lnbmluZ1VwPXtzZXRJc1NpZ25pbmdVcH0gY2xvc2VNb2RhbD17Y2xvc2VNb2RhbH0gLz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCBjb25zdCBNb2RhbCA9ICh7XG4gIGlzVmlzaWJsZSxcbiAgY2xvc2VNb2RhbCxcbiAgbGltaXRXaWR0aCA9IHRydWUsXG4gIGNoaWxkcmVuLFxufToge1xuICBpc1Zpc2libGU6IGJvb2xlYW47XG4gIGNsb3NlTW9kYWw/OiAoKSA9PiB2b2lkO1xuICBsaW1pdFdpZHRoPzogYm9vbGVhbjtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pID0+IHtcbiAgY29uc3QgcmVzaXppbmcgPSB1c2VSZWYoZmFsc2UpO1xuXG4gIGlmICghaXNWaXNpYmxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgd2lkdGggPSBsaW1pdFdpZHRoID8gXCJ3LVs0MDBweF1cIiA6IFwiXCI7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwibW9kYWxcIlxuICAgICAgb25Nb3VzZURvd249eyhlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgICAgICAgIHJlc2l6aW5nLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25Nb3VzZVVwPXsoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc2l6aW5nLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH19XG4gICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICBpZiAoY2xvc2VNb2RhbCAmJiBlLnRhcmdldCA9PT0gZS5jdXJyZW50VGFyZ2V0ICYmICFyZXNpemluZy5jdXJyZW50KSB7XG4gICAgICAgICAgY2xvc2VNb2RhbCgpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHt3aWR0aH0gYmctd2hpdGUgcm91bmRlZC1sZ2B9PntjaGlsZHJlbn08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uLy4uL29yZ2FuaXNtcy9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gXCIuL01vZGFsXCI7XG5cbmV4cG9ydCBjb25zdCBDb25uZWN0aW9uTW9kYWwgPSAoe1xuICBpc1Zpc2libGUsXG4gIGNsb3NlTW9kYWwsXG59OiB7XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbiAgY2xvc2VNb2RhbDogKCkgPT4gdm9pZDtcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8TW9kYWwgaXNWaXNpYmxlPXtpc1Zpc2libGV9IGNsb3NlTW9kYWw9e2Nsb3NlTW9kYWx9PlxuICAgICAgPENvbm5lY3Rpb24gY2xvc2VNb2RhbD17Y2xvc2VNb2RhbH0gLz5cbiAgICA8L01vZGFsPlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi4vYXRvbXMvYnV0dG9ucy9CdXR0b25cIjtcbmltcG9ydCB7IENvbm5lY3Rpb25Nb2RhbCB9IGZyb20gXCIuLi9hdG9tcy9tb2RhbHMvQ29ubmVjdGlvbk1vZGFsXCI7XG5cbmV4cG9ydCBjb25zdCBDb25uZWN0aW9uUGFuZWwgPSAoKSA9PiB7XG4gIGNvbnN0IFtjb25uZWN0aW9uTW9kYWxPcGVuLCBzZXRDb25uZWN0aW9uTW9kYWxPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtNFwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciB0ZXh0LWdyYXktZmVlZGJhY2stMjAwIHRleHQtc21cIj5cbiAgICAgICAgICBDb25uZWN0ZXogdm91cyBwb3VyIGFjY8OpZGVyIGF1eCBjb21tZW50YWlyZXNcbiAgICAgICAgPC9wPlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgdGV4dD1cIlNlIGNvbm5lY3RlclwiXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Q29ubmVjdGlvbk1vZGFsT3Blbih0cnVlKX1cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8Q29ubmVjdGlvbk1vZGFsXG4gICAgICAgIGlzVmlzaWJsZT17Y29ubmVjdGlvbk1vZGFsT3Blbn1cbiAgICAgICAgY2xvc2VNb2RhbD17KCkgPT4gc2V0Q29ubmVjdGlvbk1vZGFsT3BlbihmYWxzZSl9XG4gICAgICAvPlxuICAgIDwvPlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VNZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy91c2VyXCI7XG5pbXBvcnQgeyBDbG9zZUJ1dHRvbiB9IGZyb20gXCIuLi9hdG9tcy9idXR0b25zL0Nsb3NlQnV0dG9uXCI7XG5pbXBvcnQgeyBDb2xsYXBzZUJ1dHRvbiB9IGZyb20gXCIuLi9hdG9tcy9idXR0b25zL0NvbGxhcHNlQnV0dG9uXCI7XG5pbXBvcnQgeyBDb25uZWN0ZWRQYW5lbCB9IGZyb20gXCIuL0Nvbm5lY3RlZFBhbmVsXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uUGFuZWwgfSBmcm9tIFwiLi9Db25uZWN0aW9uUGFuZWxcIjtcblxuZXhwb3J0IGNvbnN0IFNpZGVCYXIgPSAoKSA9PiB7XG4gIGNvbnN0IFtpc0NvbGxhcHNlZCwgc2V0SXNDb2xsYXBzZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCB7IGRhdGE6IG1lIH0gPSB1c2VNZSgpO1xuXG4gIGNvbnN0IHsgaXNPcGVuLCBjbG9zZUZlZWRiYWNrT3ZlcmxheSB9ID0gdXNlRmVlZGJhY2tDb250ZXh0KCk7XG5cbiAgY29uc3QgaXNDb25uZWN0ZWQgPSAhIW1lO1xuXG4gIGlmICghaXNPcGVuKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKFxuICAgIDxkaXZcbiAgICAgIGlkPVwiZmVlZGJhY2stc2lkZWJhclwiXG4gICAgICBjbGFzc05hbWU9e2BmaXhlZCB0b3AtMCB0cmFuc2l0aW9uLWFsbCB3LVszMjBweF0gaC1zY3JlZW4gei1bMTAwMDAwMDBdIGJnLWdyYXktZmVlZGJhY2stODAwIHRleHQtd2hpdGUgcHgtMyBweS00ICR7XG4gICAgICAgIGlzQ29sbGFwc2VkID8gXCJyaWdodC1bLTMyMHB4XVwiIDogXCJyaWdodC0wXCJcbiAgICAgIH1gfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBoLWZ1bGwgdy1mdWxsICBpdGVtcy1jZW50ZXIgZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGltZyBzcmM9XCIvZmVlZGJhY2svbG9nby1mZWVkYmFjay1saWdodC5zdmdcIiBjbGFzc05hbWU9XCJ6LTEwXCIgLz5cbiAgICAgICAgICA8Q2xvc2VCdXR0b24gb25DbGljaz17Y2xvc2VGZWVkYmFja092ZXJsYXl9IHNpemU9XCJsYXJnZVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7aXNDb25uZWN0ZWQgPyA8Q29ubmVjdGVkUGFuZWwgLz4gOiA8Q29ubmVjdGlvblBhbmVsIC8+fVxuICAgICAgICA8Q29sbGFwc2VCdXR0b25cbiAgICAgICAgICBpc0NvbGxhcHNlZD17aXNDb2xsYXBzZWR9XG4gICAgICAgICAgc2V0SXNDb2xsYXBzZWQ9e3NldElzQ29sbGFwc2VkfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+LFxuICAgIGRvY3VtZW50LmJvZHlcbiAgKTtcbn07XG4iLCJpbXBvcnQgeyBRdWVyeUNsaWVudCwgUXVlcnlDbGllbnRQcm92aWRlciB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCB7IE91dGxldCB9IGZyb20gXCJyZWFjdC1yb3V0ZXItZG9tXCI7XG5pbXBvcnQgeyBPcGVuRmVlZGJhY2tCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL2F0b21zL2J1dHRvbnMvT3BlbkZlZWRiYWNrQnV0dG9uXCI7XG5pbXBvcnQgeyBGZWVkYmFja1BpbnMgfSBmcm9tIFwiLi9jb21wb25lbnRzL21vbGVjdWxlcy9mZWVkYmFja3MvZ3JvdXAvRmVlZGJhY2tQaW5zXCI7XG5pbXBvcnQgeyBGZWVkYmFja0lucHV0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL2l0ZW0vRmVlZGJhY2tJbnB1dFwiO1xuaW1wb3J0IHsgU2lkZUJhciB9IGZyb20gXCIuL2NvbXBvbmVudHMvb3JnYW5pc21zL1NpZGVCYXJcIjtcbmltcG9ydCB7IEZlZWRiYWNrUHJvdmlkZXIgfSBmcm9tIFwiLi9jb250ZXh0cy9GZWVkYmFja0NvbnRleHRcIjtcbmltcG9ydCBcIi4vaW5kZXguY3NzXCI7XG5pbXBvcnQgdHlwZSB7IEZlZWRiYWNrUm9vdFByb3BzIH0gZnJvbSBcIi4uL2luZGV4LmQudHNcIjtcblxuY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnQoKTtcblxuZnVuY3Rpb24gRmVlZGJhY2tSb290KHByb3BzOiBGZWVkYmFja1Jvb3RQcm9wcykge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8T3V0bGV0IC8+XG4gICAgICA8UXVlcnlDbGllbnRQcm92aWRlciBjbGllbnQ9e3F1ZXJ5Q2xpZW50fT5cbiAgICAgICAgPEZlZWRiYWNrUHJvdmlkZXIgey4uLnByb3BzfT5cbiAgICAgICAgICA8RmVlZGJhY2tJbnB1dCAvPlxuICAgICAgICAgIDxTaWRlQmFyIC8+XG4gICAgICAgICAgPE9wZW5GZWVkYmFja0J1dHRvbiAvPlxuICAgICAgICAgIDxGZWVkYmFja1BpbnMgLz5cbiAgICAgICAgPC9GZWVkYmFja1Byb3ZpZGVyPlxuICAgICAgPC9RdWVyeUNsaWVudFByb3ZpZGVyPlxuICAgIDwvPlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBGZWVkYmFja1Jvb3Q7XG4iXSwibmFtZXMiOlsiZ2xvYmFsIiwic2VsZiIsIndpbmRvdyIsImRlZmF1bHRTZXRUaW1vdXQiLCJFcnJvciIsImRlZmF1bHRDbGVhclRpbWVvdXQiLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsInJ1blRpbWVvdXQiLCJmdW4iLCJlIiwiY2FsbCIsInJ1bkNsZWFyVGltZW91dCIsIm1hcmtlciIsInF1ZXVlIiwiZHJhaW5pbmciLCJjdXJyZW50UXVldWUiLCJxdWV1ZUluZGV4IiwiY2xlYW5VcE5leHRUaWNrIiwibGVuZ3RoIiwiY29uY2F0IiwiZHJhaW5RdWV1ZSIsInRpbWVvdXQiLCJsZW4iLCJydW4iLCJuZXh0VGljayIsImFyZ3MiLCJBcnJheSIsImFyZ3VtZW50cyIsImkiLCJwdXNoIiwiSXRlbSIsImFycmF5IiwiX2MiLCJwcm90b3R5cGUiLCJhcHBseSIsInRpdGxlIiwicGxhdGZvcm0iLCJicm93c2VyIiwiZW52IiwiYXJndiIsInZlcnNpb24iLCJ2ZXJzaW9ucyIsInJlbGVhc2UiLCJjb25maWciLCJub29wIiwib24iLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJiaW5kaW5nIiwibmFtZSIsImN3ZCIsImNoZGlyIiwiZGlyIiwidW1hc2siLCJwZXJmb3JtYW5jZSIsInBlcmZvcm1hbmNlTm93Iiwibm93IiwibW96Tm93IiwibXNOb3ciLCJvTm93Iiwid2Via2l0Tm93IiwiRGF0ZSIsImdldFRpbWUiLCJocnRpbWUiLCJwcmV2aW91c1RpbWVzdGFtcCIsImNsb2NrdGltZSIsInNlY29uZHMiLCJNYXRoIiwiZmxvb3IiLCJuYW5vc2Vjb25kcyIsInN0YXJ0VGltZSIsInVwdGltZSIsImN1cnJlbnRUaW1lIiwiZGlmIiwiYnJvd3NlciQxIiwiJFJlZnJlc2hSZWckIiwiQWN0aW9uIiwiY3JlYXRlTWVtb3J5SGlzdG9yeSIsIm9wdGlvbnMiLCJpbml0aWFsRW50cmllcyIsImluaXRpYWxJbmRleCIsInY1Q29tcGF0IiwiZW50cmllcyIsIm1hcCIsImVudHJ5IiwiaW5kZXgiLCJjcmVhdGVNZW1vcnlMb2NhdGlvbiIsInN0YXRlIiwidW5kZWZpbmVkIiwiY2xhbXBJbmRleCIsImFjdGlvbiIsIlBvcCIsImxpc3RlbmVyIiwibiIsIm1pbiIsIm1heCIsImdldEN1cnJlbnRMb2NhdGlvbiIsInRvIiwia2V5IiwibG9jYXRpb24iLCJjcmVhdGVMb2NhdGlvbiIsInBhdGhuYW1lIiwid2FybmluZyIsImNoYXJBdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJjcmVhdGVIcmVmIiwiY3JlYXRlUGF0aCIsImhpc3RvcnkiLCJjcmVhdGVVUkwiLCJVUkwiLCJlbmNvZGVMb2NhdGlvbiIsInBhdGgiLCJwYXJzZVBhdGgiLCJzZWFyY2giLCJoYXNoIiwiUHVzaCIsIm5leHRMb2NhdGlvbiIsInNwbGljZSIsImRlbHRhIiwicmVwbGFjZSIsIlJlcGxhY2UiLCJnbyIsIm5leHRJbmRleCIsImxpc3RlbiIsImZuIiwiaW52YXJpYW50IiwidmFsdWUiLCJtZXNzYWdlIiwiY29uZCIsImNvbnNvbGUiLCJ3YXJuIiwiY3JlYXRlS2V5IiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHIiLCJjdXJyZW50IiwiX2V4dGVuZHMiLCJfcmVmIiwicGFyc2VkUGF0aCIsImhhc2hJbmRleCIsImluZGV4T2YiLCJzZWFyY2hJbmRleCIsIkRhdGFSb3V0ZXJDb250ZXh0IiwiUmVhY3QiLCJjcmVhdGVDb250ZXh0IiwicHJvY2VzcyIsIk5PREVfRU5WIiwiZGlzcGxheU5hbWUiLCJEYXRhUm91dGVyU3RhdGVDb250ZXh0IiwiQXdhaXRDb250ZXh0IiwiTmF2aWdhdGlvbkNvbnRleHQiLCJMb2NhdGlvbkNvbnRleHQiLCJSb3V0ZUNvbnRleHQiLCJvdXRsZXQiLCJtYXRjaGVzIiwiaXNEYXRhUm91dGUiLCJSb3V0ZUVycm9yQ29udGV4dCIsImF4aW9zIiwidXNlUXVlcnkiLCJ1c2VRdWVyeUNsaWVudCIsInVzZU11dGF0aW9uIiwidXNlU3RhdGUiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsIl9qc3giLCJ1c2VDb250ZXh0IiwiX2pzeHMiLCJ1c2VSZWYiLCJmb3J3YXJkUmVmIiwiY3JlYXRlUG9ydGFsIiwiX0ZyYWdtZW50IiwiUXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudFByb3ZpZGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZUFBZ0IsT0FBT0EsTUFBTSxLQUFLLFdBQVcsR0FBR0EsTUFBTSxHQUNwRCxPQUFPQyxJQUFJLEtBQUssV0FBVyxHQUFHQSxJQUFJLEdBQ2xDLE9BQU9DLE1BQU0sS0FBSyxXQUFXLEdBQUdBLE1BQU0sR0FBRyxFQUFFOztBQ0Y3QztBQUNBOztBQUVBLFNBQVNDLGdCQUFnQkEsR0FBRztBQUN4QixFQUFBLE1BQU0sSUFBSUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDO0FBQ3REO0FBQ0EsU0FBU0MsbUJBQW1CQSxHQUFJO0FBQzVCLEVBQUEsTUFBTSxJQUFJRCxLQUFLLENBQUMsbUNBQW1DLENBQUM7QUFDeEQ7QUFDQSxJQUFJRSxnQkFBZ0IsR0FBR0gsZ0JBQWdCO0FBQ3ZDLElBQUlJLGtCQUFrQixHQUFHRixtQkFBbUI7QUFDNUMsSUFBSSxPQUFPTCxRQUFNLENBQUNRLFVBQVUsS0FBSyxVQUFVLEVBQUU7QUFDekNGLEVBQUFBLGdCQUFnQixHQUFHRSxVQUFVO0FBQ2pDO0FBQ0EsSUFBSSxPQUFPUixRQUFNLENBQUNTLFlBQVksS0FBSyxVQUFVLEVBQUU7QUFDM0NGLEVBQUFBLGtCQUFrQixHQUFHRSxZQUFZO0FBQ3JDO0FBRUEsU0FBU0MsVUFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|
|
1598
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzLmpzIiwic291cmNlcyI6WyIuLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50L2Jhc2UudHMiLCIuLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50L2NvbW1vbi50cyIsIi4uLy4uL2xpYnMvYmFja2VuZC1jbGllbnQvYXBpLnRzIiwiLi4vLi4vbGlicy9iYWNrZW5kLWNsaWVudC9jb25maWd1cmF0aW9uLnRzIiwiLi4vLi4vc3JjL3NlcnZpY2VzL2FwaS50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9mZWVkYmFjay50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy91c2VyLnRzIiwiLi4vLi4vc3JjL2NvbnRleHRzL0ZlZWRiYWNrQ29udGV4dC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9idXR0b25zL0J1dHRvbi50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9idXR0b25zL09wZW5GZWVkYmFja0J1dHRvbi50c3giLCIuLi8uLi9zcmMvdXRpbHMvZ2V0SW5pdGlhbHMudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL2l0ZW0vRmVlZGJhY2tJdGVtSG92ZXJlZC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9idXR0b25zL0Nsb3NlQnV0dG9uLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9yZXBsaWVzL1JlcGx5SXRlbS50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL3NoYXJlZC9GZWVkYmFja1RleHRBcmVhLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9mZWVkYmFja3MvbWVudS9NZW51SXRlbS50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL21lbnUvTWVudUJ1dHRvbi50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL2l0ZW0vRmVlZGJhY2tJdGVtU2VsZWN0ZWQudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL2ZlZWRiYWNrcy9zaGFyZWQvRmVlZGJhY2tQb3NpdGlvbmVyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9mZWVkYmFja3MvaXRlbS9GZWVkYmFja1Bpbi50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL2dyb3VwL0ZlZWRiYWNrUGlucy50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9pY29ucy9Db21tZW50SWNvbi50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvZmVlZGJhY2tzL2l0ZW0vRmVlZGJhY2tJbnB1dC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9idXR0b25zL0NvbGxhcHNlQnV0dG9uLnRzeCIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9hdXRoLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0Nvbm5lY3RlZFVzZXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvaW5wdXRzL1NlYXJjaElucHV0LnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9mZWVkYmFja3MvaXRlbS9GZWVkYmFja0xpc3RJdGVtLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9mZWVkYmFja3MvZ3JvdXAvRmVlZGJhY2tMaXN0LnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL29yZ2FuaXNtcy9Db25uZWN0ZWRQYW5lbC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9pbnB1dHMvSW5wdXQudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL2Zvcm1zL1NpZ25VcEZvcm0udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL2Zvcm1zL1NpZ25JbkZvcm0udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0Nvbm5lY3Rpb24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvbW9kYWxzL01vZGFsLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL21vZGFscy9Db25uZWN0aW9uTW9kYWwudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0Nvbm5lY3Rpb25QYW5lbC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9vcmdhbmlzbXMvU2lkZUJhci50c3giLCIuLi8uLi9zcmMvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBHYWxhZHJpbSBGZWVkYmFjayBBUElcbiAqIEFQSSBmb3IgR2FsYWRyaW0gRmVlZGJhY2ssIGEgZmVlZGJhY2sgcGxhdGZvcm0gZm9yIEdhbGFkcmltIHByb2plY3RzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAxLjBcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbic7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB0eXBlIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlLCBSYXdBeGlvc1JlcXVlc3RDb25maWcgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgZ2xvYmFsQXhpb3MgZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwOi8vbG9jYWxob3N0XCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWc7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCA/PyBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBSZXF1aXJlZEVycm9yXG4gKiBAZXh0ZW5kcyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1aXJlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBmaWVsZDogc3RyaW5nLCBtc2c/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobXNnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSZXF1aXJlZEVycm9yXCJcbiAgICB9XG59XG5cbmludGVyZmFjZSBTZXJ2ZXJNYXAge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgICAgdXJsOiBzdHJpbmcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgfVtdO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBvcGVyYXRpb25TZXJ2ZXJNYXA6IFNlcnZlck1hcCA9IHtcbn1cbiIsIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBHYWxhZHJpbSBGZWVkYmFjayBBUElcbiAqIEFQSSBmb3IgR2FsYWRyaW0gRmVlZGJhY2ssIGEgZmVlZGJhY2sgcGxhdGZvcm0gZm9yIEdhbGFkcmltIHByb2plY3RzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAxLjBcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IEF4aW9zSW5zdGFuY2UsIEF4aW9zUmVzcG9uc2UgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBSZXF1aXJlZEVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldEZsYXR0ZW5lZFF1ZXJ5UGFyYW1zKHVybFNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zLCBwYXJhbWV0ZXI6IGFueSwga2V5OiBzdHJpbmcgPSBcIlwiKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtZXRlciA9PSBudWxsKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXIgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1ldGVyKSkge1xuICAgICAgICAgICAgKHBhcmFtZXRlciBhcyBhbnlbXSkuZm9yRWFjaChpdGVtID0+IHNldEZsYXR0ZW5lZFF1ZXJ5UGFyYW1zKHVybFNlYXJjaFBhcmFtcywgaXRlbSwga2V5KSk7XG4gICAgICAgIH0gXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyYW1ldGVyKS5mb3JFYWNoKGN1cnJlbnRLZXkgPT4gXG4gICAgICAgICAgICAgICAgc2V0RmxhdHRlbmVkUXVlcnlQYXJhbXModXJsU2VhcmNoUGFyYW1zLCBwYXJhbWV0ZXJbY3VycmVudEtleV0sIGAke2tleX0ke2tleSAhPT0gJycgPyAnLicgOiAnJ30ke2N1cnJlbnRLZXl9YClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IFxuICAgIGVsc2Uge1xuICAgICAgICBpZiAodXJsU2VhcmNoUGFyYW1zLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB1cmxTZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgcGFyYW1ldGVyKTtcbiAgICAgICAgfSBcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cmxTZWFyY2hQYXJhbXMuc2V0KGtleSwgcGFyYW1ldGVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0U2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHVybDogVVJMLCAuLi5vYmplY3RzOiBhbnlbXSkge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgc2V0RmxhdHRlbmVkUXVlcnlQYXJhbXMoc2VhcmNoUGFyYW1zLCBvYmplY3RzKTtcbiAgICB1cmwuc2VhcmNoID0gc2VhcmNoUGFyYW1zLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCA9IGZ1bmN0aW9uICh2YWx1ZTogYW55LCByZXF1ZXN0T3B0aW9uczogYW55LCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IG5vblN0cmluZyA9IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZyc7XG4gICAgY29uc3QgbmVlZHNTZXJpYWxpemF0aW9uID0gbm9uU3RyaW5nICYmIGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5pc0pzb25NaW1lXG4gICAgICAgID8gY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKHJlcXVlc3RPcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKVxuICAgICAgICA6IG5vblN0cmluZztcbiAgICByZXR1cm4gbmVlZHNTZXJpYWxpemF0aW9uXG4gICAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pXG4gICAgICAgIDogKHZhbHVlIHx8IFwiXCIpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCB0b1BhdGhTdHJpbmcgPSBmdW5jdGlvbiAodXJsOiBVUkwpIHtcbiAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaCArIHVybC5oYXNoXG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiA9IGZ1bmN0aW9uIChheGlvc0FyZ3M6IFJlcXVlc3RBcmdzLCBnbG9iYWxBeGlvczogQXhpb3NJbnN0YW5jZSwgQkFTRV9QQVRIOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIDxUID0gdW5rbm93biwgUiA9IEF4aW9zUmVzcG9uc2U8VD4+KGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MsIGJhc2VQYXRoOiBzdHJpbmcgPSBCQVNFX1BBVEgpID0+IHtcbiAgICAgICAgY29uc3QgYXhpb3NSZXF1ZXN0QXJncyA9IHsuLi5heGlvc0FyZ3Mub3B0aW9ucywgdXJsOiAoYXhpb3MuZGVmYXVsdHMuYmFzZVVSTCA/ICcnIDogY29uZmlndXJhdGlvbj8uYmFzZVBhdGggPz8gYmFzZVBhdGgpICsgYXhpb3NBcmdzLnVybH07XG4gICAgICAgIHJldHVybiBheGlvcy5yZXF1ZXN0PFQsIFI+KGF4aW9zUmVxdWVzdEFyZ3MpO1xuICAgIH07XG59XG4iLCIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogR2FsYWRyaW0gRmVlZGJhY2sgQVBJXG4gKiBBUEkgZm9yIEdhbGFkcmltIEZlZWRiYWNrLCBhIGZlZWRiYWNrIHBsYXRmb3JtIGZvciBHYWxhZHJpbSBwcm9qZWN0cy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMS4wXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UsIFJhd0F4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCBnbG9iYWxBeGlvcyBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEFyZ3MgfSBmcm9tICcuL2Jhc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMsIEJhc2VBUEksIFJlcXVpcmVkRXJyb3IsIG9wZXJhdGlvblNlcnZlck1hcCB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbGxhYm9yYXRpb25zUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3VzZXJJZCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3Byb2plY3RJZCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvamVjdFJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3Byb2plY3QnOiBQcm9qZWN0UmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29sbGFib3JhdGlvbnNSZXNwb25zZVxuICAgICAqL1xuICAgICdyb2xlJzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmVlZGJhY2tDcmVhdGVEdG9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZWVkYmFja0NyZWF0ZUR0byB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tDcmVhdGVEdG9cbiAgICAgKi9cbiAgICAnZWxlbWVudElkJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQ3JlYXRlRHRvXG4gICAgICovXG4gICAgJ2VsZW1lbnRJbmRleCc6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja0NyZWF0ZUR0b1xuICAgICAqL1xuICAgICdlbGVtZW50V2lkdGgnOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tDcmVhdGVEdG9cbiAgICAgKi9cbiAgICAnZWxlbWVudEhlaWdodCc6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja0NyZWF0ZUR0b1xuICAgICAqL1xuICAgICd4JzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQ3JlYXRlRHRvXG4gICAgICovXG4gICAgJ3knOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tDcmVhdGVEdG9cbiAgICAgKi9cbiAgICAnY29tbWVudCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja0NyZWF0ZUR0b1xuICAgICAqL1xuICAgICdwYXRoJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQ3JlYXRlRHRvXG4gICAgICovXG4gICAgJ3Byb2plY3RJZCc6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZlZWRiYWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZWVkYmFja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ2lkJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnY3JlYXRlZEF0Jzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAndXBkYXRlZEF0Jzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZWxlbWVudElkJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZWxlbWVudEluZGV4JzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZWxlbWVudFdpZHRoJzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZWxlbWVudEhlaWdodCc6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3gnOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tSZXNwb25zZVxuICAgICAqL1xuICAgICd5JzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ2lzUmVzb2x2ZWQnOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnY29tbWVudCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3BhdGgnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFJlcGx5UmVzcG9uc2U+fVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1Jlc3BvbnNlXG4gICAgICovXG4gICAgJ3JlcGxpZXMnOiBBcnJheTxSZXBseVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlclN1bW1hcnlSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tSZXNwb25zZVxuICAgICAqL1xuICAgICd1c2VyJzogVXNlclN1bW1hcnlSZXNwb25zZTtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZlZWRiYWNrVXBkYXRlRHRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVlZGJhY2tVcGRhdGVEdG8ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ2VsZW1lbnRJZCc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tVcGRhdGVEdG9cbiAgICAgKi9cbiAgICAnZWxlbWVudEluZGV4Jz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGZWVkYmFja1VwZGF0ZUR0b1xuICAgICAqL1xuICAgICdlbGVtZW50V2lkdGgnPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ2VsZW1lbnRIZWlnaHQnPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ3gnPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ3knPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ2NvbW1lbnQnPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ3BhdGgnPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ3Byb2plY3RJZCc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrVXBkYXRlRHRvXG4gICAgICovXG4gICAgJ2lzUmVzb2x2ZWQnOiBib29sZWFuO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvamVjdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICAnaWQnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvamVjdFJlc3BvbnNlXG4gICAgICovXG4gICAgJ25hbWUnOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXBseVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbHlSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVwbHlSZXNwb25zZVxuICAgICAqL1xuICAgICdpZCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXBseVJlc3BvbnNlXG4gICAgICovXG4gICAgJ2NyZWF0ZWRBdCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXBseVJlc3BvbnNlXG4gICAgICovXG4gICAgJ3VwZGF0ZWRBdCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXBseVJlc3BvbnNlXG4gICAgICovXG4gICAgJ2ZlZWRiYWNrSWQnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVwbHlSZXNwb25zZVxuICAgICAqL1xuICAgICd1c2VySWQnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVwbHlSZXNwb25zZVxuICAgICAqL1xuICAgICdjb21tZW50Jzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3VtbWFyeVJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZXBseVJlc3BvbnNlXG4gICAgICovXG4gICAgJ3VzZXInOiBVc2VyU3VtbWFyeVJlc3BvbnNlO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbkluRHRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluRHRvIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduSW5EdG9cbiAgICAgKi9cbiAgICAnZW1haWwnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbkluRHRvXG4gICAgICovXG4gICAgJ3Bhc3N3b3JkJzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbkluUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduSW5SZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbkluUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnYWNjZXNzVG9rZW4nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbkluUmVzcG9uc2VcbiAgICAgKi9cbiAgICAncmVmcmVzaFRva2VuJzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnblVwRHRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblVwRHRvIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduVXBEdG9cbiAgICAgKi9cbiAgICAnZW1haWwnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnblVwRHRvXG4gICAgICovXG4gICAgJ3Bhc3N3b3JkJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25VcER0b1xuICAgICAqL1xuICAgICdmaXJzdE5hbWUnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnblVwRHRvXG4gICAgICovXG4gICAgJ2xhc3ROYW1lJzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnblVwUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduVXBSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnblVwUmVzcG9uc2VcbiAgICAgKi9cbiAgICAnYWNjZXNzVG9rZW4nOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyU3VtbWFyeVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclN1bW1hcnlSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclN1bW1hcnlSZXNwb25zZVxuICAgICAqL1xuICAgICdpZCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyU3VtbWFyeVJlc3BvbnNlXG4gICAgICovXG4gICAgJ2VtYWlsJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJTdW1tYXJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICAnZmlyc3ROYW1lJzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJTdW1tYXJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICAnbGFzdE5hbWUnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclN1bW1hcnlSZXNwb25zZVxuICAgICAqL1xuICAgICdmdWxsTmFtZSc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyU3VtbWFyeVJlc3BvbnNlXG4gICAgICovXG4gICAgJ2F2YXRhclVybCc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29sbGFib3JhdGlvbnNSZXNwb25zZT59XG4gICAgICogQG1lbWJlcm9mIFVzZXJTdW1tYXJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICAnY29sbGFib3JhdGlvbnMnOiBBcnJheTxDb2xsYWJvcmF0aW9uc1Jlc3BvbnNlPjtcbn1cblxuLyoqXG4gKiBBcHBBcGkgLSBheGlvcyBwYXJhbWV0ZXIgY3JlYXRvclxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQXBwQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBDb250cm9sbGVyR2V0SGVsbG86IGFzeW5jIChvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIEFwcEFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBBcHBBcGlGcCA9IGZ1bmN0aW9uKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvciA9IEFwcEFwaUF4aW9zUGFyYW1DcmVhdG9yKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXBwQ29udHJvbGxlckdldEhlbGxvKG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8dm9pZD4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hcHBDb250cm9sbGVyR2V0SGVsbG8ob3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4ID0gY29uZmlndXJhdGlvbj8uc2VydmVySW5kZXggPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggPSBvcGVyYXRpb25TZXJ2ZXJNYXBbJ0FwcEFwaS5hcHBDb250cm9sbGVyR2V0SGVsbG8nXT8uW2xvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXhdPy51cmw7XG4gICAgICAgICAgICByZXR1cm4gKGF4aW9zLCBiYXNlUGF0aCkgPT4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKShheGlvcywgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCB8fCBiYXNlUGF0aCk7XG4gICAgICAgIH0sXG4gICAgfVxufTtcblxuLyoqXG4gKiBBcHBBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQXBwQXBpRmFjdG9yeSA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbiwgYmFzZVBhdGg/OiBzdHJpbmcsIGF4aW9zPzogQXhpb3NJbnN0YW5jZSkge1xuICAgIGNvbnN0IGxvY2FsVmFyRnAgPSBBcHBBcGlGcChjb25maWd1cmF0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcENvbnRyb2xsZXJHZXRIZWxsbyhvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFwcENvbnRyb2xsZXJHZXRIZWxsbyhvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgIH07XG59O1xuXG4vKipcbiAqIEFwcEFwaSAtIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBBcHBBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgQXBwQXBpIGV4dGVuZHMgQmFzZUFQSSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBcHBBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwQ29udHJvbGxlckdldEhlbGxvKG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIEFwcEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXBwQ29udHJvbGxlckdldEhlbGxvKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cbn1cblxuXG5cbi8qKlxuICogQXV0aEFwaSAtIGF4aW9zIHBhcmFtZXRlciBjcmVhdG9yXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBBdXRoQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWRpcmVjdFVybCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhDb250cm9sbGVyR2l0aHViQ2FsbGJhY2s6IGFzeW5jIChyZWRpcmVjdFVybDogc3RyaW5nLCBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlZGlyZWN0VXJsJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhdXRoQ29udHJvbGxlckdpdGh1YkNhbGxiYWNrJywgJ3JlZGlyZWN0VXJsJywgcmVkaXJlY3RVcmwpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2F1dGgvZ2l0aHViL2NhbGxiYWNrYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgaWYgKHJlZGlyZWN0VXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyWydyZWRpcmVjdFVybCddID0gcmVkaXJlY3RVcmw7XG4gICAgICAgICAgICB9XG5cblxuICAgIFxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhDb250cm9sbGVyR2l0aHViTG9naW46IGFzeW5jIChvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXV0aC9naXRodWJgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbkluRHRvfSBzaWduSW5EdG8gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoQ29udHJvbGxlclNpZ25JbjogYXN5bmMgKHNpZ25JbkR0bzogU2lnbkluRHRvLCBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25JbkR0bycgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXV0aENvbnRyb2xsZXJTaWduSW4nLCAnc2lnbkluRHRvJywgc2lnbkluRHRvKVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hdXRoL3NpZ25pbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduSW5EdG8sIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7U2lnblVwRHRvfSBzaWduVXBEdG8gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoQ29udHJvbGxlclNpZ25VcDogYXN5bmMgKHNpZ25VcER0bzogU2lnblVwRHRvLCBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25VcER0bycgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXV0aENvbnRyb2xsZXJTaWduVXAnLCAnc2lnblVwRHRvJywgc2lnblVwRHRvKVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hdXRoL3NpZ251cGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduVXBEdG8sIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogQXV0aEFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBBdXRoQXBpRnAgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IgPSBBdXRoQXBpQXhpb3NQYXJhbUNyZWF0b3IoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWRpcmVjdFVybCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhDb250cm9sbGVyR2l0aHViQ2FsbGJhY2socmVkaXJlY3RVcmw6IHN0cmluZywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmF1dGhDb250cm9sbGVyR2l0aHViQ2FsbGJhY2socmVkaXJlY3RVcmwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleCA9IGNvbmZpZ3VyYXRpb24/LnNlcnZlckluZGV4ID8/IDA7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoID0gb3BlcmF0aW9uU2VydmVyTWFwWydBdXRoQXBpLmF1dGhDb250cm9sbGVyR2l0aHViQ2FsbGJhY2snXT8uW2xvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXhdPy51cmw7XG4gICAgICAgICAgICByZXR1cm4gKGF4aW9zLCBiYXNlUGF0aCkgPT4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKShheGlvcywgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCB8fCBiYXNlUGF0aCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhDb250cm9sbGVyR2l0aHViTG9naW4ob3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmF1dGhDb250cm9sbGVyR2l0aHViTG9naW4ob3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4ID0gY29uZmlndXJhdGlvbj8uc2VydmVySW5kZXggPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggPSBvcGVyYXRpb25TZXJ2ZXJNYXBbJ0F1dGhBcGkuYXV0aENvbnRyb2xsZXJHaXRodWJMb2dpbiddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25JbkR0b30gc2lnbkluRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXV0aENvbnRyb2xsZXJTaWduSW4oc2lnbkluRHRvOiBTaWduSW5EdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbkluUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXV0aENvbnRyb2xsZXJTaWduSW4oc2lnbkluRHRvLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXggPSBjb25maWd1cmF0aW9uPy5zZXJ2ZXJJbmRleCA/PyAwO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCA9IG9wZXJhdGlvblNlcnZlck1hcFsnQXV0aEFwaS5hdXRoQ29udHJvbGxlclNpZ25JbiddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25VcER0b30gc2lnblVwRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXV0aENvbnRyb2xsZXJTaWduVXAoc2lnblVwRHRvOiBTaWduVXBEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnblVwUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXV0aENvbnRyb2xsZXJTaWduVXAoc2lnblVwRHRvLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXggPSBjb25maWd1cmF0aW9uPy5zZXJ2ZXJJbmRleCA/PyAwO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCA9IG9wZXJhdGlvblNlcnZlck1hcFsnQXV0aEFwaS5hdXRoQ29udHJvbGxlclNpZ25VcCddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIEF1dGhBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQXV0aEFwaUZhY3RvcnkgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24sIGJhc2VQYXRoPzogc3RyaW5nLCBheGlvcz86IEF4aW9zSW5zdGFuY2UpIHtcbiAgICBjb25zdCBsb2NhbFZhckZwID0gQXV0aEFwaUZwKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVkaXJlY3RVcmwgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoQ29udHJvbGxlckdpdGh1YkNhbGxiYWNrKHJlZGlyZWN0VXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXV0aENvbnRyb2xsZXJHaXRodWJDYWxsYmFjayhyZWRpcmVjdFVybCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aENvbnRyb2xsZXJHaXRodWJMb2dpbihvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmF1dGhDb250cm9sbGVyR2l0aHViTG9naW4ob3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25JbkR0b30gc2lnbkluRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aENvbnRyb2xsZXJTaWduSW4oc2lnbkluRHRvOiBTaWduSW5EdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2U8U2lnbkluUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmF1dGhDb250cm9sbGVyU2lnbkluKHNpZ25JbkR0bywgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25VcER0b30gc2lnblVwRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aENvbnRyb2xsZXJTaWduVXAoc2lnblVwRHRvOiBTaWduVXBEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2U8U2lnblVwUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmF1dGhDb250cm9sbGVyU2lnblVwKHNpZ25VcER0bywgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICB9O1xufTtcblxuLyoqXG4gKiBBdXRoQXBpIC0gb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZVxuICogQGV4cG9ydFxuICogQGNsYXNzIEF1dGhBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgQXV0aEFwaSBleHRlbmRzIEJhc2VBUEkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWRpcmVjdFVybCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEF1dGhBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0aENvbnRyb2xsZXJHaXRodWJDYWxsYmFjayhyZWRpcmVjdFVybDogc3RyaW5nLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBBdXRoQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoQ29udHJvbGxlckdpdGh1YkNhbGxiYWNrKHJlZGlyZWN0VXJsLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEF1dGhBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0aENvbnRyb2xsZXJHaXRodWJMb2dpbihvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBBdXRoQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoQ29udHJvbGxlckdpdGh1YkxvZ2luKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7U2lnbkluRHRvfSBzaWduSW5EdG8gXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoQXBpXG4gICAgICovXG4gICAgcHVibGljIGF1dGhDb250cm9sbGVyU2lnbkluKHNpZ25JbkR0bzogU2lnbkluRHRvLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBBdXRoQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoQ29udHJvbGxlclNpZ25JbihzaWduSW5EdG8sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7U2lnblVwRHRvfSBzaWduVXBEdG8gXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoQXBpXG4gICAgICovXG4gICAgcHVibGljIGF1dGhDb250cm9sbGVyU2lnblVwKHNpZ25VcER0bzogU2lnblVwRHRvLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBBdXRoQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoQ29udHJvbGxlclNpZ25VcChzaWduVXBEdG8sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cbn1cblxuXG5cbi8qKlxuICogRmVlZGJhY2tBcGkgLSBheGlvcyBwYXJhbWV0ZXIgY3JlYXRvclxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgRmVlZGJhY2tBcGlBeGlvc1BhcmFtQ3JlYXRvciA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtGZWVkYmFja0NyZWF0ZUR0b30gZmVlZGJhY2tDcmVhdGVEdG8gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZWVkYmFja0NvbnRyb2xsZXJDcmVhdGU6IGFzeW5jIChmZWVkYmFja0NyZWF0ZUR0bzogRmVlZGJhY2tDcmVhdGVEdG8sIG9wdGlvbnM6IFJhd0F4aW9zUmVxdWVzdENvbmZpZyA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZmVlZGJhY2tDcmVhdGVEdG8nIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZScsICdmZWVkYmFja0NyZWF0ZUR0bycsIGZlZWRiYWNrQ3JlYXRlRHRvKVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZWVkYmFja2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyKTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChmZWVkYmFja0NyZWF0ZUR0bywgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZVJlcGx5OiBhc3luYyAoaWQ6IHN0cmluZywgYm9keTogb2JqZWN0LCBvcHRpb25zOiBSYXdBeGlvc1JlcXVlc3RDb25maWcgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZWVkYmFja0NvbnRyb2xsZXJDcmVhdGVSZXBseScsICdpZCcsIGlkKVxuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHknLCAnYm9keScsIGJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZlZWRiYWNrL3tpZH0vcmVwbGllc2BcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgeyR7XCJpZFwifX1gLCBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGlkKSkpO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYm9keSwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmVlZGJhY2tDb250cm9sbGVyRGVsZXRlOiBhc3luYyAoaWQ6IHN0cmluZywgb3B0aW9uczogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZmVlZGJhY2tDb250cm9sbGVyRGVsZXRlJywgJ2lkJywgaWQpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZlZWRiYWNrL3tpZH1gXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYHske1wiaWRcIn19YCwgZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhpZCkpKTtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0RFTEVURScsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQ6IGFzeW5jIChwcm9qZWN0SWQ6IHN0cmluZywgb3B0aW9uczogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9qZWN0SWQnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZlZWRiYWNrQ29udHJvbGxlckZpbmRGZWVkYmFja0J5UHJvamVjdElkJywgJ3Byb2plY3RJZCcsIHByb2plY3RJZClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmVlZGJhY2sve3Byb2plY3RJZH1gXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYHske1wicHJvamVjdElkXCJ9fWAsIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcocHJvamVjdElkKSkpO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBcbiAgICAgICAgICogQHBhcmFtIHtGZWVkYmFja1VwZGF0ZUR0b30gZmVlZGJhY2tVcGRhdGVEdG8gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZWVkYmFja0NvbnRyb2xsZXJVcGRhdGU6IGFzeW5jIChpZDogc3RyaW5nLCBmZWVkYmFja1VwZGF0ZUR0bzogRmVlZGJhY2tVcGRhdGVEdG8sIG9wdGlvbnM6IFJhd0F4aW9zUmVxdWVzdENvbmZpZyA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWQnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZScsICdpZCcsIGlkKVxuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZmVlZGJhY2tVcGRhdGVEdG8nIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZScsICdmZWVkYmFja1VwZGF0ZUR0bycsIGZlZWRiYWNrVXBkYXRlRHRvKVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZWVkYmFjay97aWR9YFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGB7JHtcImlkXCJ9fWAsIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQQVRDSCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZmVlZGJhY2tVcGRhdGVEdG8sIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogRmVlZGJhY2tBcGkgLSBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgRmVlZGJhY2tBcGlGcCA9IGZ1bmN0aW9uKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvciA9IEZlZWRiYWNrQXBpQXhpb3NQYXJhbUNyZWF0b3IoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7RmVlZGJhY2tDcmVhdGVEdG99IGZlZWRiYWNrQ3JlYXRlRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlKGZlZWRiYWNrQ3JlYXRlRHRvOiBGZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZShmZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4ID0gY29uZmlndXJhdGlvbj8uc2VydmVySW5kZXggPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggPSBvcGVyYXRpb25TZXJ2ZXJNYXBbJ0ZlZWRiYWNrQXBpLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZSddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHkoaWQ6IHN0cmluZywgYm9keTogb2JqZWN0LCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHkoaWQsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleCA9IGNvbmZpZ3VyYXRpb24/LnNlcnZlckluZGV4ID8/IDA7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoID0gb3BlcmF0aW9uU2VydmVyTWFwWydGZWVkYmFja0FwaS5mZWVkYmFja0NvbnRyb2xsZXJDcmVhdGVSZXBseSddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZWVkYmFja0NvbnRyb2xsZXJEZWxldGUoaWQ6IHN0cmluZywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmZlZWRiYWNrQ29udHJvbGxlckRlbGV0ZShpZCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4ID0gY29uZmlndXJhdGlvbj8uc2VydmVySW5kZXggPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggPSBvcGVyYXRpb25TZXJ2ZXJNYXBbJ0ZlZWRiYWNrQXBpLmZlZWRiYWNrQ29udHJvbGxlckRlbGV0ZSddPy5bbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleF0/LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoYXhpb3MsIGJhc2VQYXRoKSA9PiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pKGF4aW9zLCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoIHx8IGJhc2VQYXRoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQocHJvamVjdElkOiBzdHJpbmcsIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXJyYXk8RmVlZGJhY2tSZXNwb25zZT4+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQocHJvamVjdElkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXggPSBjb25maWd1cmF0aW9uPy5zZXJ2ZXJJbmRleCA/PyAwO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCA9IG9wZXJhdGlvblNlcnZlck1hcFsnRmVlZGJhY2tBcGkuZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQnXT8uW2xvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXhdPy51cmw7XG4gICAgICAgICAgICByZXR1cm4gKGF4aW9zLCBiYXNlUGF0aCkgPT4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKShheGlvcywgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCB8fCBiYXNlUGF0aCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0ge0ZlZWRiYWNrVXBkYXRlRHRvfSBmZWVkYmFja1VwZGF0ZUR0byBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZShpZDogc3RyaW5nLCBmZWVkYmFja1VwZGF0ZUR0bzogRmVlZGJhY2tVcGRhdGVEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8dm9pZD4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5mZWVkYmFja0NvbnRyb2xsZXJVcGRhdGUoaWQsIGZlZWRiYWNrVXBkYXRlRHRvLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXggPSBjb25maWd1cmF0aW9uPy5zZXJ2ZXJJbmRleCA/PyAwO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCA9IG9wZXJhdGlvblNlcnZlck1hcFsnRmVlZGJhY2tBcGkuZmVlZGJhY2tDb250cm9sbGVyVXBkYXRlJ10/Lltsb2NhbFZhck9wZXJhdGlvblNlcnZlckluZGV4XT8udXJsO1xuICAgICAgICAgICAgcmV0dXJuIChheGlvcywgYmFzZVBhdGgpID0+IGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbikoYXhpb3MsIGxvY2FsVmFyT3BlcmF0aW9uU2VydmVyQmFzZVBhdGggfHwgYmFzZVBhdGgpO1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogRmVlZGJhY2tBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgRmVlZGJhY2tBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IEZlZWRiYWNrQXBpRnAoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7RmVlZGJhY2tDcmVhdGVEdG99IGZlZWRiYWNrQ3JlYXRlRHRvIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlKGZlZWRiYWNrQ3JlYXRlRHRvOiBGZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZWVkYmFja0NvbnRyb2xsZXJDcmVhdGUoZmVlZGJhY2tDcmVhdGVEdG8sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZVJlcGx5KGlkOiBzdHJpbmcsIGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZWVkYmFja0NvbnRyb2xsZXJDcmVhdGVSZXBseShpZCwgYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZWVkYmFja0NvbnRyb2xsZXJEZWxldGUoaWQ6IHN0cmluZywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZWVkYmFja0NvbnRyb2xsZXJEZWxldGUoaWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZlZWRiYWNrQ29udHJvbGxlckZpbmRGZWVkYmFja0J5UHJvamVjdElkKHByb2plY3RJZDogc3RyaW5nLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NQcm9taXNlPEFycmF5PEZlZWRiYWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZWVkYmFja0NvbnRyb2xsZXJGaW5kRmVlZGJhY2tCeVByb2plY3RJZChwcm9qZWN0SWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAgICAgKiBAcGFyYW0ge0ZlZWRiYWNrVXBkYXRlRHRvfSBmZWVkYmFja1VwZGF0ZUR0byBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZShpZDogc3RyaW5nLCBmZWVkYmFja1VwZGF0ZUR0bzogRmVlZGJhY2tVcGRhdGVEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZmVlZGJhY2tDb250cm9sbGVyVXBkYXRlKGlkLCBmZWVkYmFja1VwZGF0ZUR0bywgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICB9O1xufTtcblxuLyoqXG4gKiBGZWVkYmFja0FwaSAtIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBGZWVkYmFja0FwaVxuICogQGV4dGVuZHMge0Jhc2VBUEl9XG4gKi9cbmV4cG9ydCBjbGFzcyBGZWVkYmFja0FwaSBleHRlbmRzIEJhc2VBUEkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7RmVlZGJhY2tDcmVhdGVEdG99IGZlZWRiYWNrQ3JlYXRlRHRvIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlKGZlZWRiYWNrQ3JlYXRlRHRvOiBGZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gRmVlZGJhY2tBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZShmZWVkYmFja0NyZWF0ZUR0bywgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHkoaWQ6IHN0cmluZywgYm9keTogb2JqZWN0LCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBGZWVkYmFja0FwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZmVlZGJhY2tDb250cm9sbGVyQ3JlYXRlUmVwbHkoaWQsIGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQXBpXG4gICAgICovXG4gICAgcHVibGljIGZlZWRiYWNrQ29udHJvbGxlckRlbGV0ZShpZDogc3RyaW5nLCBvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBGZWVkYmFja0FwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZmVlZGJhY2tDb250cm9sbGVyRGVsZXRlKGlkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRmVlZGJhY2tBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQocHJvamVjdElkOiBzdHJpbmcsIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIEZlZWRiYWNrQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5mZWVkYmFja0NvbnRyb2xsZXJGaW5kRmVlZGJhY2tCeVByb2plY3RJZChwcm9qZWN0SWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBcbiAgICAgKiBAcGFyYW0ge0ZlZWRiYWNrVXBkYXRlRHRvfSBmZWVkYmFja1VwZGF0ZUR0byBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEZlZWRiYWNrQXBpXG4gICAgICovXG4gICAgcHVibGljIGZlZWRiYWNrQ29udHJvbGxlclVwZGF0ZShpZDogc3RyaW5nLCBmZWVkYmFja1VwZGF0ZUR0bzogRmVlZGJhY2tVcGRhdGVEdG8sIG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIEZlZWRiYWNrQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5mZWVkYmFja0NvbnRyb2xsZXJVcGRhdGUoaWQsIGZlZWRiYWNrVXBkYXRlRHRvLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG59XG5cblxuXG4vKipcbiAqIFVzZXJBcGkgLSBheGlvcyBwYXJhbWV0ZXIgY3JlYXRvclxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgVXNlckFwaUF4aW9zUGFyYW1DcmVhdG9yID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckNvbnRyb2xsZXJHZXRNZTogYXN5bmMgKG9wdGlvbnM6IFJhd0F4aW9zUmVxdWVzdENvbmZpZyA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL21lYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gYmVhcmVyIHJlcXVpcmVkXG4gICAgICAgICAgICAvLyBodHRwIGJlYXJlciBhdXRoZW50aWNhdGlvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QmVhcmVyQXV0aFRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcik7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogVXNlckFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBVc2VyQXBpRnAgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IgPSBVc2VyQXBpQXhpb3NQYXJhbUNyZWF0b3IoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyQ29udHJvbGxlckdldE1lKG9wdGlvbnM/OiBSYXdBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclN1bW1hcnlSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyQ29udHJvbGxlckdldE1lKG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJJbmRleCA9IGNvbmZpZ3VyYXRpb24/LnNlcnZlckluZGV4ID8/IDA7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhck9wZXJhdGlvblNlcnZlckJhc2VQYXRoID0gb3BlcmF0aW9uU2VydmVyTWFwWydVc2VyQXBpLnVzZXJDb250cm9sbGVyR2V0TWUnXT8uW2xvY2FsVmFyT3BlcmF0aW9uU2VydmVySW5kZXhdPy51cmw7XG4gICAgICAgICAgICByZXR1cm4gKGF4aW9zLCBiYXNlUGF0aCkgPT4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKShheGlvcywgbG9jYWxWYXJPcGVyYXRpb25TZXJ2ZXJCYXNlUGF0aCB8fCBiYXNlUGF0aCk7XG4gICAgICAgIH0sXG4gICAgfVxufTtcblxuLyoqXG4gKiBVc2VyQXBpIC0gZmFjdG9yeSBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFVzZXJBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IFVzZXJBcGlGcChjb25maWd1cmF0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJDb250cm9sbGVyR2V0TWUob3B0aW9ucz86IFJhd0F4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUHJvbWlzZTxVc2VyU3VtbWFyeVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyQ29udHJvbGxlckdldE1lKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5cbi8qKlxuICogVXNlckFwaSAtIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBVc2VyQXBpXG4gKiBAZXh0ZW5kcyB7QmFzZUFQSX1cbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJBcGkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckNvbnRyb2xsZXJHZXRNZShvcHRpb25zPzogUmF3QXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBVc2VyQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyQ29udHJvbGxlckdldE1lKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cbn1cblxuXG5cbiIsIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBHYWxhZHJpbSBGZWVkYmFjayBBUElcbiAqIEFQSSBmb3IgR2FsYWRyaW0gRmVlZGJhY2ssIGEgZmVlZGJhY2sgcGxhdGZvcm0gZm9yIEdhbGFkcmltIHByb2plY3RzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAxLjBcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJhdGlvblBhcmFtZXRlcnMge1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBzZXJ2ZXJJbmRleD86IG51bWJlcjtcbiAgICBiYXNlT3B0aW9ucz86IGFueTtcbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBhcGlLZXkgc2VjdXJpdHlcbiAgICAgKiBAcGFyYW0gbmFtZSBzZWN1cml0eSBuYW1lXG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBhcGlLZXk/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nKSB8ICgobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGJhc2ljIHNlY3VyaXR5XG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBvYXV0aDIgc2VjdXJpdHlcbiAgICAgKiBAcGFyYW0gbmFtZSBzZWN1cml0eSBuYW1lXG4gICAgICogQHBhcmFtIHNjb3BlcyBvYXV0aDIgc2NvcGVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gc3RyaW5nKSB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogb3ZlcnJpZGUgYmFzZSBwYXRoXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogb3ZlcnJpZGUgc2VydmVyIGluZGV4XG4gICAgICpcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgc2VydmVySW5kZXg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYmFzZSBvcHRpb25zIGZvciBheGlvcyBjYWxsc1xuICAgICAqXG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGJhc2VPcHRpb25zPzogYW55O1xuICAgIC8qKlxuICAgICAqIFRoZSBGb3JtRGF0YSBjb25zdHJ1Y3RvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgbXVsdGlwYXJ0IGZvcm0gZGF0YVxuICAgICAqIHJlcXVlc3RzLiBZb3UgY2FuIGluamVjdCB0aGlzIGhlcmUgc28gdGhhdCBleGVjdXRpb24gZW52aXJvbm1lbnRzIHRoYXRcbiAgICAgKiBkbyBub3Qgc3VwcG9ydCB0aGUgRm9ybURhdGEgY2xhc3MgY2FuIHN0aWxsIHJ1biB0aGUgZ2VuZXJhdGVkIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtuZXcgKCkgPT4gRm9ybURhdGF9XG4gICAgICovXG4gICAgZm9ybURhdGFDdG9yPzogbmV3ICgpID0+IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtOiBDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IHt9KSB7XG4gICAgICAgIHRoaXMuYXBpS2V5ID0gcGFyYW0uYXBpS2V5O1xuICAgICAgICB0aGlzLnVzZXJuYW1lID0gcGFyYW0udXNlcm5hbWU7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXJhbS5wYXNzd29yZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IHBhcmFtLmFjY2Vzc1Rva2VuO1xuICAgICAgICB0aGlzLmJhc2VQYXRoID0gcGFyYW0uYmFzZVBhdGg7XG4gICAgICAgIHRoaXMuc2VydmVySW5kZXggPSBwYXJhbS5zZXJ2ZXJJbmRleDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAuLi5wYXJhbS5iYXNlT3B0aW9ucz8uaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IFwiT3BlbkFQSS1HZW5lcmF0b3IvdHlwZXNjcmlwdC1heGlvc1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4ucGFyYW0uYmFzZU9wdGlvbnNcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb3JtRGF0YUN0b3IgPSBwYXJhbS5mb3JtRGF0YUN0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIE1JTUUgaXMgYSBKU09OIE1JTUUuXG4gICAgICogSlNPTiBNSU1FIGV4YW1wbGVzOlxuICAgICAqICAgYXBwbGljYXRpb24vanNvblxuICAgICAqICAgYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEY4XG4gICAgICogICBBUFBMSUNBVElPTi9KU09OXG4gICAgICogICBhcHBsaWNhdGlvbi92bmQuY29tcGFueStqc29uXG4gICAgICogQHBhcmFtIG1pbWUgLSBNSU1FIChNdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbCBFeHRlbnNpb25zKVxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gTUlNRSBpcyBKU09OLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGlzSnNvbk1pbWUobWltZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGpzb25NaW1lOiBSZWdFeHAgPSBuZXcgUmVnRXhwKCdeKGFwcGxpY2F0aW9uXFwvanNvbnxbXjsvIFxcdF0rXFwvW147LyBcXHRdK1srXWpzb24pWyBcXHRdKig7LiopPyQnLCAnaScpO1xuICAgICAgICByZXR1cm4gbWltZSAhPT0gbnVsbCAmJiAoanNvbk1pbWUudGVzdChtaW1lKSB8fCBtaW1lLnRvTG93ZXJDYXNlKCkgPT09ICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQge1xuICBBdXRoQXBpLFxuICBDb25maWd1cmF0aW9uLFxuICBGZWVkYmFja0FwaSxcbiAgVXNlckFwaSxcbn0gZnJvbSBcIi4uLy4uL2xpYnMvYmFja2VuZC1jbGllbnRcIjtcblxuY29uc3QgYXBpVXJsID0gXCJodHRwOi8vZWMyLTEzLTM4LTIxNC0xOTEuZXUtd2VzdC0zLmNvbXB1dGUuYW1hem9uYXdzLmNvbToxNDc4XCI7XG5cbmNvbnN0IGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbih7XG4gIGJhc2VQYXRoOiBhcGlVcmwsXG59KTtcblxuY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSh7XG4gIGJhc2VVUkw6IGFwaVVybCxcbn0pO1xuXG5jb25zdCBhcGkgPSB7XG4gIHVzZXI6IG5ldyBVc2VyQXBpKGNvbmZpZ3VyYXRpb24sIGFwaVVybCwgYXhpb3NJbnN0YW5jZSksXG4gIGZlZWRiYWNrOiBuZXcgRmVlZGJhY2tBcGkoY29uZmlndXJhdGlvbiwgYXBpVXJsLCBheGlvc0luc3RhbmNlKSxcbiAgYXV0aDogbmV3IEF1dGhBcGkoY29uZmlndXJhdGlvbiwgYXBpVXJsLCBheGlvc0luc3RhbmNlKSxcbn07XG5cbmF4aW9zSW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKFxuICBhc3luYyAoY29uZmlnKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImdhbGFkcmltRmVlZGJhY2tUb2tlblwiKTtcbiAgICBpZiAodG9rZW4gJiYgY29uZmlnLmhlYWRlcnMpIHtcbiAgICAgIGNvbmZpZy5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGF4aW9zSW5zdGFuY2UuZGVmYXVsdHMuaGVhZGVycy5jb21tb24uQXV0aG9yaXphdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfSxcbiAgKGVycm9yKSA9PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgfVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgYXBpO1xuIiwiaW1wb3J0IHsgdXNlTXV0YXRpb24sIHVzZVF1ZXJ5LCB1c2VRdWVyeUNsaWVudCB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCBhcGkgZnJvbSBcIi4vYXBpXCI7XG5pbXBvcnQge1xuICBGZWVkYmFja0NyZWF0ZUR0byxcbiAgRmVlZGJhY2tSZXNwb25zZSxcbiAgRmVlZGJhY2tVcGRhdGVEdG8sXG59IGZyb20gXCIuLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBmZXRjaEZlZWRiYWNrcyA9IGFzeW5jIChwcm9qZWN0SWQ/OiBzdHJpbmcpID0+IHtcbiAgaWYgKCFwcm9qZWN0SWQpIHJldHVybiBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9XG4gICAgICBhd2FpdCBhcGkuZmVlZGJhY2suZmVlZGJhY2tDb250cm9sbGVyRmluZEZlZWRiYWNrQnlQcm9qZWN0SWQocHJvamVjdElkKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRmVlZGJhY2sgPSBhc3luYyAoZmVlZGJhY2s6IEZlZWRiYWNrQ3JlYXRlRHRvKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLmZlZWRiYWNrLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZShmZWVkYmFjayk7XG4gIHJldHVybiByZXNwb25zZS5kYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcGx5ID0gYXN5bmMgKGZlZWRiYWNrSWQ6IHN0cmluZywgY29tbWVudDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLmZlZWRiYWNrLmZlZWRiYWNrQ29udHJvbGxlckNyZWF0ZVJlcGx5KFxuICAgIGZlZWRiYWNrSWQsXG4gICAge1xuICAgICAgY29tbWVudCxcbiAgICB9XG4gICk7XG4gIHJldHVybiByZXNwb25zZS5kYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUZlZWRiYWNrID0gYXN5bmMgKHtcbiAgZmVlZGJhY2tJZCxcbiAgcGF5bG9hZCxcbn06IHtcbiAgZmVlZGJhY2tJZDogc3RyaW5nO1xuICBwYXlsb2FkOiBGZWVkYmFja1VwZGF0ZUR0bztcbn0pID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGkuZmVlZGJhY2suZmVlZGJhY2tDb250cm9sbGVyVXBkYXRlKGZlZWRiYWNrSWQsIHtcbiAgICAuLi5wYXlsb2FkLFxuICB9KTtcbiAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlRmVlZGJhY2sgPSBhc3luYyAoZmVlZGJhY2s6IEZlZWRiYWNrUmVzcG9uc2UpID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGkuZmVlZGJhY2suZmVlZGJhY2tDb250cm9sbGVyRGVsZXRlKGZlZWRiYWNrLmlkKTtcbiAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlRmVlZGJhY2tzID0gKHByb2plY3RJZD86IHN0cmluZykgPT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBbXCJmZWVkYmFja3NcIl0sXG4gICAgcXVlcnlGbjogKCkgPT4gZmV0Y2hGZWVkYmFja3MocHJvamVjdElkKSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQ3JlYXRlRmVlZGJhY2sgPSAoKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBjcmVhdGVGZWVkYmFjayxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRmVlZGJhY2sgY3JlYXRlZFwiKTtcblxuICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IFtcImZlZWRiYWNrc1wiXSB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VDcmVhdGVSZXBseSA9IChmZWVkYmFja0lkOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IChjb21tZW50OiBzdHJpbmcpID0+IGNyZWF0ZVJlcGx5KGZlZWRiYWNrSWQsIGNvbW1lbnQpLFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IFtcImZlZWRiYWNrc1wiXSB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VVcGRhdGVGZWVkYmFjayA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IHVwZGF0ZUZlZWRiYWNrLFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IFtcImZlZWRiYWNrc1wiXSB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VEZWxldGVGZWVkYmFjayA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGRlbGV0ZUZlZWRiYWNrLFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IFtcImZlZWRiYWNrc1wiXSB9KTtcbiAgICB9LFxuICB9KTtcbn07XG4iLCJpbXBvcnQgeyB1c2VRdWVyeSB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCBhcGkgZnJvbSBcIi4vYXBpXCI7XG5cbmV4cG9ydCBjb25zdCBmZXRjaE1lID0gYXN5bmMgKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLnVzZXIudXNlckNvbnRyb2xsZXJHZXRNZSgpO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVzZU1lID0gKCkgPT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBbXCJtZVwiXSxcbiAgICBxdWVyeUZuOiBmZXRjaE1lLFxuICB9KTtcbn07XG4iLCJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgRGlzcGF0Y2gsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VFZmZlY3QsXG4gIHVzZVN0YXRlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEZlZWRiYWNrQ3JlYXRlRHRvLCBGZWVkYmFja1Jlc3BvbnNlIH0gZnJvbSBcIi4uLy4uL2xpYnMvYmFja2VuZC1jbGllbnRcIjtcbmltcG9ydCB7IHVzZUZlZWRiYWNrcyB9IGZyb20gXCIuLi9zZXJ2aWNlcy9mZWVkYmFja1wiO1xuaW1wb3J0IHsgdXNlTWUgfSBmcm9tIFwiLi4vc2VydmljZXMvdXNlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlZWRiYWNrU3RhdGUge1xuICBpc09wZW46IGJvb2xlYW47XG4gIGZlZWRiYWNrcz86IEZlZWRiYWNrUmVzcG9uc2VbXTtcbiAgbmV3RmVlZGJhY2s6IEZlZWRiYWNrQ3JlYXRlRHRvIHwgbnVsbDtcbiAgbmV3RmVlZGJhY2tSZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+O1xuICBzZWxlY3RlZEZlZWRiYWNrOiBGZWVkYmFja1Jlc3BvbnNlIHwgbnVsbDtcbiAgc2V0U2VsZWN0ZWRGZWVkYmFjazogRGlzcGF0Y2g8UmVhY3QuU2V0U3RhdGVBY3Rpb248RmVlZGJhY2tSZXNwb25zZSB8IG51bGw+PjtcbiAgcmVzZXRGZWVkYmFjazogKCkgPT4gdm9pZDtcbiAgb3BlbkZlZWRiYWNrT3ZlcmxheTogKCkgPT4gdm9pZDtcbiAgY2xvc2VGZWVkYmFja092ZXJsYXk6ICgpID0+IHZvaWQ7XG4gIGFjdGl2YXRlRmVlZGJhY2tNb2RlOiAoKSA9PiB2b2lkO1xuICBkZWFjdGl2YXRlRmVlZGJhY2tNb2RlOiAoKSA9PiB2b2lkO1xuICBuYXZpZ2F0ZTogKHBhdGg6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLy8gQ3JlYXRlIHRoZSBjb250ZXh0XG5jb25zdCBGZWVkYmFja0NvbnRleHQgPSBjcmVhdGVDb250ZXh0KHtcbiAgaXNPcGVuOiBmYWxzZSxcbiAgZmVlZGJhY2tzOiBbXSBhcyBGZWVkYmFja1Jlc3BvbnNlW10gfCB1bmRlZmluZWQsXG4gIG5ld0ZlZWRiYWNrOiBudWxsIGFzIEZlZWRiYWNrQ3JlYXRlRHRvIHwgbnVsbCxcbiAgbmV3RmVlZGJhY2tSZWY6IFJlYWN0LmNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KCksXG4gIHNlbGVjdGVkRmVlZGJhY2s6IHt9IGFzIEZlZWRiYWNrUmVzcG9uc2UgfCBudWxsLFxuICBzZXRTZWxlY3RlZEZlZWRiYWNrOiB7fSBhcyBEaXNwYXRjaDxcbiAgICBSZWFjdC5TZXRTdGF0ZUFjdGlvbjxGZWVkYmFja1Jlc3BvbnNlIHwgbnVsbD5cbiAgPixcbiAgcmVzZXRGZWVkYmFjazogKCkgPT4ge30sXG4gIGFjdGl2YXRlRmVlZGJhY2tNb2RlOiAoKSA9PiB7fSxcbiAgZGVhY3RpdmF0ZUZlZWRiYWNrTW9kZTogKCkgPT4ge30sXG4gIG9wZW5GZWVkYmFja092ZXJsYXk6ICgpID0+IHt9LFxuICBjbG9zZUZlZWRiYWNrT3ZlcmxheTogKCkgPT4ge30sXG4gIHJvb3REaXI6IFwiXCIsXG4gIG5hdmlnYXRlOiAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgdm9pZCBwYXRoO1xuICAgIHJldHVybjtcbiAgfSxcbn0pO1xuXG4vLyBQcm92aWRlciBjb21wb25lbnRcbmV4cG9ydCBjb25zdCBGZWVkYmFja1Byb3ZpZGVyID0gKHtcbiAgcm9vdERpcixcbiAgcHJvamVjdElkLFxuICBuYXZpZ2F0ZSxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIHJvb3REaXI6IHN0cmluZztcbiAgcHJvamVjdElkOiBzdHJpbmc7XG4gIG5hdmlnYXRlOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkgPT4ge1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbbmV3RmVlZGJhY2ssIHNldE5ld0ZlZWRiYWNrXSA9IHVzZVN0YXRlPEZlZWRiYWNrQ3JlYXRlRHRvIHwgbnVsbD4oXG4gICAgbnVsbFxuICApO1xuICBjb25zdCBuZXdGZWVkYmFja1JlZiA9IFJlYWN0LnVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbc2VsZWN0ZWRGZWVkYmFjaywgc2V0U2VsZWN0ZWRGZWVkYmFja10gPVxuICAgIHVzZVN0YXRlPEZlZWRiYWNrUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgY29uc3QgeyBkYXRhOiBmZWVkYmFja3MgfSA9IHVzZUZlZWRiYWNrcyhwcm9qZWN0SWQpO1xuICBjb25zdCB7IGRhdGE6IG1lIH0gPSB1c2VNZSgpO1xuXG4gIGNvbnN0IGlzQ29ubmVjdGVkID0gISFtZTtcblxuICBjb25zdCBvcGVuRmVlZGJhY2tPdmVybGF5ID0gKCkgPT4ge1xuICAgIHNldElzT3Blbih0cnVlKTtcbiAgICBpZiAoaXNDb25uZWN0ZWQpIGFjdGl2YXRlRmVlZGJhY2tNb2RlKCk7XG4gIH07XG5cbiAgY29uc3QgY2xvc2VGZWVkYmFja092ZXJsYXkgPSAoKSA9PiB7XG4gICAgc2V0SXNPcGVuKGZhbHNlKTtcbiAgICBkZWFjdGl2YXRlRmVlZGJhY2tNb2RlKCk7XG4gIH07XG5cbiAgY29uc3QgcmVzZXRGZWVkYmFjayA9ICgpID0+IHtcbiAgICBzZXROZXdGZWVkYmFjayhudWxsKTtcbiAgICBhY3RpdmF0ZUZlZWRiYWNrTW9kZSgpO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZUZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgZWxlbWVudElkID0gdGFyZ2V0Py5kYXRhc2V0LnBhdGggfHwgXCJcIjtcbiAgICAgIGNvbnN0IGFsbEVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgICAgIGBbZGF0YS1wYXRoPVwiJHtlbGVtZW50SWR9XCJdYFxuICAgICAgKTtcblxuICAgICAgY29uc3QgYXJyQWxsRWxlbWVudHMgPSBBcnJheS5mcm9tKGFsbEVsZW1lbnRzKTtcblxuICAgICAgY29uc3QgZWxlbWVudEluZGV4ID0gYXJyQWxsRWxlbWVudHMuaW5kZXhPZih0YXJnZXQpO1xuXG4gICAgICBjb25zdCB4ID0gZS5vZmZzZXRYO1xuICAgICAgY29uc3QgeSA9IGUub2Zmc2V0WTtcbiAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRhcmdldD8uY2xpZW50V2lkdGggfHwgMDtcbiAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0YXJnZXQ/LmNsaWVudEhlaWdodCB8fCAwO1xuXG4gICAgICBzZXROZXdGZWVkYmFjayh7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIGVsZW1lbnRXaWR0aCxcbiAgICAgICAgZWxlbWVudEhlaWdodCxcbiAgICAgICAgY29tbWVudDogXCJcIixcbiAgICAgICAgcGF0aDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBlbGVtZW50SWQsXG4gICAgICAgIGVsZW1lbnRJbmRleCxcbiAgICAgICAgcHJvamVjdElkLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbcHJvamVjdElkXVxuICApO1xuXG4gIGNvbnN0IGlzU2lkZUJhck9yRmVlZGJhY2tJdGVtID0gdXNlQ2FsbGJhY2soKHRhcmdldDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBzaWRlYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmZWVkYmFjay1zaWRlYmFyXCIpO1xuXG4gICAgaWYgKCFzaWRlYmFyIHx8IHNpZGViYXIuY29udGFpbnModGFyZ2V0IGFzIE5vZGUpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudHMgPSBkb2N1bWVudFxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGAuZmVlZGJhY2staXRlbWApXG4gICAgICAudmFsdWVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGZlZWRiYWNrRWxlbWVudCBvZiBmZWVkYmFja0VsZW1lbnRzKSB7XG4gICAgICBpZiAoZmVlZGJhY2tFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IHNob3VsZENyZWF0ZUZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKG5ld0ZlZWRiYWNrUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgaWYgKCFuZXdGZWVkYmFja1JlZi5jdXJyZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICBzZXROZXdGZWVkYmFjayhudWxsKTtcbiAgICAgICAgICBpZiAoaXNTaWRlQmFyT3JGZWVkYmFja0l0ZW0odGFyZ2V0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc1NpZGVCYXJPckZlZWRiYWNrSXRlbSh0YXJnZXQpO1xuICAgIH0sXG4gICAgW2lzU2lkZUJhck9yRmVlZGJhY2tJdGVtXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZU5ld0ZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghc2hvdWxkQ3JlYXRlRmVlZGJhY2soZSkpIHJldHVybjtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHNldFNlbGVjdGVkRmVlZGJhY2sobnVsbCk7XG4gICAgICBjcmVhdGVGZWVkYmFjayhlKTtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZU5ld0ZlZWRiYWNrKTtcbiAgICB9LFxuICAgIFtzaG91bGRDcmVhdGVGZWVkYmFjaywgY3JlYXRlRmVlZGJhY2tdXG4gICk7XG5cbiAgY29uc3QgYWN0aXZhdGVGZWVkYmFja01vZGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwiY29tbWVudC1jdXJzb3JcIik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZU5ld0ZlZWRiYWNrLCB0cnVlKTtcbiAgfSwgW2hhbmRsZU5ld0ZlZWRiYWNrXSk7XG5cbiAgY29uc3QgZGVhY3RpdmF0ZUZlZWRiYWNrTW9kZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlTmV3RmVlZGJhY2spO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcImNvbW1lbnQtY3Vyc29yXCIpO1xuICB9LCBbaGFuZGxlTmV3RmVlZGJhY2tdKTtcblxuICBjb25zdCBoYW5kbGVFc2NhcGVQcmVzcyA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBpZiAobmV3RmVlZGJhY2spIHtcbiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlTmV3RmVlZGJhY2spO1xuICAgICAgICAgIHNldE5ld0ZlZWRiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlYWN0aXZhdGVGZWVkYmFja01vZGUoKTtcbiAgICAgICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbbmV3RmVlZGJhY2ssIGRlYWN0aXZhdGVGZWVkYmFja01vZGUsIGhhbmRsZU5ld0ZlZWRiYWNrXVxuICApO1xuICBjb25zdCByZW1vdmVRdWVyeVBhcmFtID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICBwYXJhbXMuZGVsZXRlKG5hbWUpO1xuICAgIGNvbnN0IG5ld1VybCA9IGAke3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX0ke1xuICAgICAgcGFyYW1zLnRvU3RyaW5nKCkgPyBcIj9cIiA6IFwiXCJcbiAgICB9JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBcIlwiLCBuZXdVcmwpO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUVzY2FwZVByZXNzKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUVzY2FwZVByZXNzKTtcbiAgICB9O1xuICB9LCBbaGFuZGxlRXNjYXBlUHJlc3NdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICBjb25zdCBnYWxhZHJpbUZlZWRiYWNrVG9rZW4gPSBwYXJhbXMuZ2V0KFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIpO1xuICAgIGlmIChnYWxhZHJpbUZlZWRiYWNrVG9rZW4pIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIsIGdhbGFkcmltRmVlZGJhY2tUb2tlbik7XG4gICAgICByZW1vdmVRdWVyeVBhcmFtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIpO1xuICAgIH1cbiAgfSwgW2ZlZWRiYWNrcywgYWN0aXZhdGVGZWVkYmFja01vZGVdKTtcblxuICBjb25zdCB2YWx1ZSA9IHtcbiAgICBpc09wZW4sXG4gICAgZmVlZGJhY2tzLFxuICAgIG5ld0ZlZWRiYWNrLFxuICAgIG5ld0ZlZWRiYWNrUmVmLFxuICAgIHNlbGVjdGVkRmVlZGJhY2ssXG4gICAgc2V0U2VsZWN0ZWRGZWVkYmFjayxcbiAgICByZXNldEZlZWRiYWNrLFxuICAgIGFjdGl2YXRlRmVlZGJhY2tNb2RlLFxuICAgIGRlYWN0aXZhdGVGZWVkYmFja01vZGUsXG4gICAgb3BlbkZlZWRiYWNrT3ZlcmxheSxcbiAgICBjbG9zZUZlZWRiYWNrT3ZlcmxheSxcbiAgICByb290RGlyLFxuICAgIG5hdmlnYXRlLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxGZWVkYmFja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0ZlZWRiYWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VGZWVkYmFja0NvbnRleHQgPSAoKSA9PiB1c2VDb250ZXh0KEZlZWRiYWNrQ29udGV4dCk7XG4iLCJleHBvcnQgY29uc3QgQnV0dG9uID0gKHtcbiAgdGV4dCxcbiAgb25DbGljayxcbiAgaWNvblBhdGgsXG4gIHNpemUsXG59OiB7XG4gIG9uQ2xpY2s6IChlOiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4gdm9pZDtcbiAgdGV4dD86IHN0cmluZztcbiAgaWNvblBhdGg/OiBzdHJpbmc7XG4gIHNpemU/OiBcInNtYWxsXCIgfCBcIm1lZGl1bVwiIHwgXCJsYXJnZVwiO1xufSkgPT4ge1xuICBjb25zdCBwYWRkaW5nID0gZ2V0UGFkZGluZyhzaXplKTtcbiAgY29uc3QgZm9udFNpemUgPSBzaXplID09PSBcInNtYWxsXCIgPyBcInRleHQteHNcIiA6IFwidGV4dC1zbVwiO1xuICBjb25zdCBib3JkZXJSYWRpdXMgPSBzaXplID09PSBcInNtYWxsXCIgPyBcInJvdW5kZWQtbGdcIiA6IFwicm91bmRlZC1bMTJweF1cIjtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgY2xhc3NOYW1lPXtgZmxleC1zaHJpbmstMCBmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciAgZ2FwLTIgJHtwYWRkaW5nfSAke2JvcmRlclJhZGl1c30gYmctYmx1ZS01MDAgaG92ZXI6Ymctb3BhY2l0eS04MGB9XG4gICAgPlxuICAgICAge2ljb25QYXRoICYmIDxpbWcgc3JjPXtpY29uUGF0aH0gY2xhc3NOYW1lPVwidy02IGgtNlwiIC8+fVxuICAgICAge3RleHQgJiYgPHNwYW4gY2xhc3NOYW1lPXtgJHtmb250U2l6ZX0gZm9udC1zZW1pYm9sZGB9Pnt0ZXh0fTwvc3Bhbj59XG4gICAgPC9idXR0b24+XG4gICk7XG59O1xuXG5jb25zdCBnZXRQYWRkaW5nID0gKHNpemU/OiBcInNtYWxsXCIgfCBcIm1lZGl1bVwiIHwgXCJsYXJnZVwiKSA9PiB7XG4gIHN3aXRjaCAoc2l6ZSkge1xuICAgIGNhc2UgXCJzbWFsbFwiOlxuICAgICAgcmV0dXJuIFwicHgtMyBweS0yXCI7XG4gICAgY2FzZSBcIm1lZGl1bVwiOlxuICAgICAgcmV0dXJuIFwicC0zXCI7XG4gICAgY2FzZSBcImxhcmdlXCI6XG4gICAgICByZXR1cm4gXCJwLTNcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwicC0zXCI7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi9CdXR0b25cIjtcblxuZXhwb3J0IGNvbnN0IE9wZW5GZWVkYmFja0J1dHRvbiA9ICgpID0+IHtcbiAgY29uc3QgeyBpc09wZW4sIG9wZW5GZWVkYmFja092ZXJsYXkgfSA9IHVzZUZlZWRiYWNrQ29udGV4dCgpO1xuXG4gIGlmIChpc09wZW4pIHJldHVybiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgdG9wOiBcImNhbGMoMTAwdmggLSA3MnB4KVwiLFxuICAgICAgICBsZWZ0OiBcImNhbGMoMTAwdncgLSA3MnB4KVwiLFxuICAgICAgICB6SW5kZXg6IDEwMDAwMDAsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgaWNvblBhdGg9XCIvZmVlZGJhY2svZWRpdC0wNC5zdmdcIlxuICAgICAgICBvbkNsaWNrPXtvcGVuRmVlZGJhY2tPdmVybGF5fVxuICAgICAgICBzaXplPVwibWVkaXVtXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGdldEluaXRpYWxzID0gKHVzZXI6IHtcbiAgZnVsbE5hbWU/OiBzdHJpbmc7XG4gIGZpcnN0TmFtZT86IHN0cmluZztcbiAgbGFzdE5hbWU/OiBzdHJpbmc7XG59KSA9PiB7XG4gIGlmICh1c2VyLmZ1bGxOYW1lKSB7XG4gICAgY29uc3QgZnVsbE5hbWUgPSB1c2VyLmZ1bGxOYW1lLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gZnVsbE5hbWVbMF0uY2hhckF0KDApICsgZnVsbE5hbWVbMV0uY2hhckF0KDApO1xuICB9XG4gIGlmICghdXNlci5maXJzdE5hbWUgfHwgIXVzZXIubGFzdE5hbWUpIHJldHVybiBcIlwiO1xuICBjb25zdCBmaXJzdE5hbWUgPSB1c2VyLmZpcnN0TmFtZS5jaGFyQXQoMCk7XG4gIGNvbnN0IGxhc3ROYW1lID0gdXNlci5sYXN0TmFtZS5jaGFyQXQoMCk7XG5cbiAgcmV0dXJuIGAke2ZpcnN0TmFtZS50b1VwcGVyQ2FzZSgpfSR7bGFzdE5hbWUudG9VcHBlckNhc2UoKX1gO1xufTtcbiIsImltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuaW1wb3J0IHsgRmVlZGJhY2tSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja0l0ZW1Ib3ZlcmVkID0gKHtcbiAgZmVlZGJhY2ssXG59OiB7XG4gIGZlZWRiYWNrOiBGZWVkYmFja1Jlc3BvbnNlO1xufSkgPT4ge1xuICBjb25zdCB7IHVzZXIsIGNyZWF0ZWRBdCwgY29tbWVudCB9ID0gZmVlZGJhY2s7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInAtM1wiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWJhc2VsaW5lIGdhcC0yIHotMTBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtbWVkaXVtIHRleHQtc20gdGV4dC1ncmF5LWZlZWRiYWNrLTIwMCB3aGl0ZXNwYWNlLW5vd3JhcCB6LTEwXCI+XG4gICAgICAgICAge3VzZXI/LmZ1bGxOYW1lIHx8IGAke3VzZXI/LmZpcnN0TmFtZX0gJHt1c2VyPy5sYXN0TmFtZX1gfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImt1bWJoLXJlZ3VsYXIgdGV4dC1bMTBweF0gbGVhZGluZy1bMTJweF0gdGV4dC1ncmF5LWZlZWRiYWNrLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgIHttb21lbnQoY3JlYXRlZEF0KS5mcm9tTm93KCl9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIG92ZXJmbG93LWhpZGRlbiB3LVsyNDBweF1cIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LVsxNnB4XSBsZWFkaW5nLTUgdGV4dC13aGl0ZSBsaW5lLWNsYW1wLTJcIj5cbiAgICAgICAgICB7Y29tbWVudH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IENsb3NlQnV0dG9uID0gKHtcbiAgc2l6ZSxcbiAgb25DbGljayxcbn06IHtcbiAgc2l6ZTogXCJzbWFsbFwiIHwgXCJsYXJnZVwiO1xuICBvbkNsaWNrOiAoKSA9PiB2b2lkO1xufSkgPT4ge1xuICBjb25zdCBzaXplQ2xhc3MgPSBzaXplID09PSBcInNtYWxsXCIgPyBcInctNSBoLTVcIiA6IFwidy02IGgtNlwiO1xuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25DbGljaygpO1xuICAgICAgfX1cbiAgICA+XG4gICAgICA8aW1nIHNyYz1cIi9mZWVkYmFjay9jbG9zZS5zdmdcIiBjbGFzc05hbWU9e3NpemVDbGFzc30gLz5cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn07XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcbmltcG9ydCB7XG4gIEZlZWRiYWNrUmVzcG9uc2UsXG4gIFJlcGx5UmVzcG9uc2UsXG59IGZyb20gXCIuLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBSZXBseUl0ZW0gPSAoe1xuICByZXBseSxcbn06IHtcbiAgcmVwbHk6IFJlcGx5UmVzcG9uc2UgfCBGZWVkYmFja1Jlc3BvbnNlO1xufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBmbGV4LWJhc2VsaW5lIGdhcC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImt1bWJoLW1lZGl1bSB0ZXh0LXNtIHRleHQtZ3JheS1mZWVkYmFjay0yMDAgd2hpdGVzcGFjZS1ub3dyYXAgei0xMFwiPlxuICAgICAgICAgIHtyZXBseS51c2VyLmZpcnN0TmFtZX0ge3JlcGx5LnVzZXIubGFzdE5hbWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LVsxMHB4XSBsZWFkaW5nLVsxMnB4XSB0ZXh0LWdyYXktZmVlZGJhY2stMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAge21vbWVudChyZXBseS5jcmVhdGVkQXQpLmZyb21Ob3coKX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJrdW1iaC1yZWd1bGFyIHRleHQtWzE0cHhdIGxlYWRpbmctNSB0ZXh0LXdoaXRlXCI+XG4gICAgICAgIHtyZXBseS5jb21tZW50fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCB7IENoYW5nZUV2ZW50LCBLZXlib2FyZEV2ZW50LCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuZXhwb3J0IGNvbnN0IEZlZWRiYWNrVGV4dEFyZWEgPSAoe1xuICB2YWx1ZSxcbiAgc2V0VmFsdWUsXG4gIG9uU3VibWl0LFxuICBoYW5kbGVSZXNpemUsXG4gIGlzQW5pbWF0ZWQsXG4gIGlzRGFyayxcbn06IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgc2V0VmFsdWU6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICBvblN1Ym1pdDogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGhhbmRsZVJlc2l6ZT86ICgpID0+IHZvaWQ7XG4gIGlzQW5pbWF0ZWQ/OiBib29sZWFuO1xuICBpc0Rhcms/OiBib29sZWFuO1xufSkgPT4ge1xuICBjb25zdCB0ZXh0YXJlYVJlZiA9IHVzZVJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PihudWxsKTtcblxuICBjb25zdCBbaXNPcGVuaW5nLCBzZXRJc09wZW5pbmddID0gdXNlU3RhdGUoaXNBbmltYXRlZCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNBbmltYXRlZCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRleHRhcmVhUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgIHNldElzT3BlbmluZyhmYWxzZSk7XG4gICAgICB9LCAzMDApO1xuICAgIH1cbiAgfSwgW2lzQW5pbWF0ZWRdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgc2V0VmFsdWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcblxuICAgIGlmICh0ZXh0YXJlYVJlZi5jdXJyZW50KSB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBcImF1dG9cIjsgLy8gUmVzZXQgaGVpZ2h0IHRvIGNhbGN1bGF0ZSBzY3JvbGxIZWlnaHRcbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBgJHt0ZXh0YXJlYVJlZi5jdXJyZW50LnNjcm9sbEhlaWdodH1weGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0YXJlYVJlZi5jdXJyZW50LnN0eWxlLmhlaWdodCA9IFwiMjlweFwiO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFuZGxlUmVzaXplKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaGFuZGxlUmVzaXplKCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgJiYgZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICgpID0+IHtcbiAgICBvblN1Ym1pdCh2YWx1ZSk7XG4gICAgc2V0VmFsdWUoXCJcIik7XG4gICAgaWYgKCF0ZXh0YXJlYVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgdGV4dGFyZWFSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBcIjI5cHhcIjtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17YFxuICAgICAgICAke2lzRGFyayA/IFwiYmctZ3JheS1mZWVkYmFjay03NTBcIiA6IFwiYmctZ3JheS1mZWVkYmFjay03MDBcIn1cbiAgICAgICAgJHtcbiAgICAgICAgICB2YWx1ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IFwiY29tbWVudC1pbnB1dC1jb250YWluZXJcIlxuICAgICAgICAgICAgOiBcImNvbW1lbnQtaW5wdXQtY29udGFpbmVyLWVtcHR5XCJcbiAgICAgICAgfSAgJHtpc09wZW5pbmcgPyBcImNvbW1lbnQtaW5wdXQtY29udGFpbmVyLW9wZW5pbmdcIiA6IFwiXCJ9YH1cbiAgICA+XG4gICAgICA8dGV4dGFyZWFcbiAgICAgICAgcmVmPXt0ZXh0YXJlYVJlZn1cbiAgICAgICAgY2xhc3NOYW1lPXtgY29tbWVudC1pbnB1dCAke1xuICAgICAgICAgIHZhbHVlLmxlbmd0aCA+IDAgPyBcImNvbW1lbnQtaW5wdXQtZmlsbGVkXCIgOiBcIlwiXG4gICAgICAgIH1gfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgcGxhY2Vob2xkZXI9XCJBam91dGVyIHVuIGNvbW1lbnRhaXJlXCJcbiAgICAgICAgcm93cz17MX1cbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7dmFsdWUubGVuZ3RoID4gMCA/IFwiYnV0dG9ucy1jb250YWluZXJcIiA6IFwiXCJ9YH0+XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnV0dG9uLXNlbmRcIiBvbkNsaWNrPXtoYW5kbGVTdWJtaXR9PlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIGZpbGw9e3ZhbHVlLmxlbmd0aCA+IDAgPyBcIiMwMDg1RkZcIiA6IFwiI2ZmZlwifVxuICAgICAgICAgICAgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuOTY0LjY4NmEuNS41IDAgMCAwLS42NS0uNjVMLjc2NyA1Ljg1NUguNzY2bC0uNDUyLjE4YS41LjUgMCAwIDAtLjA4Mi44ODdsLjQxLjI2LjAwMS4wMDIgNC45OTUgMy4xNzggMy4xNzggNC45OTUuMDAyLjAwMi4yNi40MWEuNS41IDAgMCAwIC44ODYtLjA4M2w2LTE1Wm0tMS44MzMgMS44OUw2LjYzNyAxMC4wN2wtLjIxNS0uMzM4YS41LjUgMCAwIDAtLjE1NC0uMTU0bC0uMzM4LS4yMTUgNy40OTQtNy40OTQgMS4xNzgtLjQ3MS0uNDcgMS4xNzhaXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iLCJleHBvcnQgY29uc3QgTWVudUl0ZW0gPSAoe1xuICBsYWJlbCxcbiAgb25DbGljayxcbn06IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgb25DbGljazogKCkgPT4gdm9pZDtcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICBjbGFzc05hbWU9XCJ6LTEgbS0xIHB4LTIgcHktMSBob3ZlcjpiZy1wcmltYXJ5LWZlZWRiYWNrLTQwMCBob3ZlcjpvcGFjaXR5LTEwMCByb3VuZGVkLWxnXCJcbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LXNtIHRleHQtd2hpdGVcIj57bGFiZWx9PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gXCIuL01lbnVJdGVtXCI7XG5pbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQge1xuICB1c2VEZWxldGVGZWVkYmFjayxcbiAgdXNlVXBkYXRlRmVlZGJhY2ssXG59IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9mZWVkYmFja1wiO1xuaW1wb3J0IHsgRmVlZGJhY2tSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBNZW51QnV0dG9uID0gKHtcbiAgZmVlZGJhY2ssXG4gIHNldElzSG92ZXJlZCxcbn06IHtcbiAgZmVlZGJhY2s6IEZlZWRiYWNrUmVzcG9uc2U7XG4gIHNldElzSG92ZXJlZDogKGlzSG92ZXJlZDogYm9vbGVhbikgPT4gdm9pZDtcbn0pID0+IHtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgeyByb290RGlyLCBzZXRTZWxlY3RlZEZlZWRiYWNrIH0gPSB1c2VGZWVkYmFja0NvbnRleHQoKTtcbiAgY29uc3QgeyBtdXRhdGU6IGRlbGV0ZUZlZWRiYWNrIH0gPSB1c2VEZWxldGVGZWVkYmFjaygpO1xuICBjb25zdCB7IG11dGF0ZTogdXBkYXRlRmVlZGJhY2sgfSA9IHVzZVVwZGF0ZUZlZWRiYWNrKCk7XG5cbiAgY29uc3QgcGF0aCA9IGB2c2NvZGU6Ly9maWxlJHtyb290RGlyICsgZmVlZGJhY2suZWxlbWVudElkfWA7XG5cbiAgY29uc3QgaGFuZGxlUmVzb2x2ZUZlZWRiYWNrID0gKCkgPT4ge1xuICAgIHVwZGF0ZUZlZWRiYWNrKFxuICAgICAge1xuICAgICAgICBmZWVkYmFja0lkOiBmZWVkYmFjay5pZCxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIGlzUmVzb2x2ZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgICAgICAgIHNldElzSG92ZXJlZChmYWxzZSk7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRGZWVkYmFjayhudWxsKTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxpbWdcbiAgICAgICAgc3JjPVwiL2ZlZWRiYWNrL2RvdHMtaG9yaXpvbnRhbC5zdmdcIlxuICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00XCJcbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNPcGVuKChvKSA9PiAhbyl9XG4gICAgICAvPlxuICAgICAge2lzT3BlbiAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTggcmlnaHQtMiB6LTExIGZsZXggZmxleC1jb2wgICBiZy1ncmF5LWZlZWRiYWNrLTgwMCByb3VuZGVkLWxnXCI+XG4gICAgICAgICAgPE1lbnVJdGVtXG4gICAgICAgICAgICBsYWJlbD1cIk91dnJpciBkYW5zIFZTY29kZVwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHBhdGgsIFwiX2JsYW5rXCIpO1xuICAgICAgICAgICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxNZW51SXRlbSBsYWJlbD1cIlLDqXNvbHVcIiBvbkNsaWNrPXtoYW5kbGVSZXNvbHZlRmVlZGJhY2t9IC8+XG4gICAgICAgICAgPE1lbnVJdGVtXG4gICAgICAgICAgICBsYWJlbD1cIlN1cHByaW1lclwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgIGRlbGV0ZUZlZWRiYWNrKGZlZWRiYWNrLCB7XG4gICAgICAgICAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZXRJc09wZW4oZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC8+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VDcmVhdGVSZXBseSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9mZWVkYmFja1wiO1xuaW1wb3J0IHsgQ2xvc2VCdXR0b24gfSBmcm9tIFwiLi4vLi4vLi4vYXRvbXMvYnV0dG9ucy9DbG9zZUJ1dHRvblwiO1xuaW1wb3J0IHsgUmVwbHlJdGVtIH0gZnJvbSBcIi4uLy4uL3JlcGxpZXMvUmVwbHlJdGVtXCI7XG5pbXBvcnQgeyBGZWVkYmFja1RleHRBcmVhIH0gZnJvbSBcIi4uL3NoYXJlZC9GZWVkYmFja1RleHRBcmVhXCI7XG5pbXBvcnQgeyBNZW51QnV0dG9uIH0gZnJvbSBcIi4uL21lbnUvTWVudUJ1dHRvblwiO1xuaW1wb3J0IHsgRmVlZGJhY2tSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja0l0ZW1TZWxlY3RlZCA9ICh7XG4gIGZlZWRiYWNrLFxuICBzZXRGZWVkYmFja0hlaWdodCxcbiAgc2V0SXNIb3ZlcmVkLFxufToge1xuICBmZWVkYmFjazogRmVlZGJhY2tSZXNwb25zZTtcbiAgc2V0RmVlZGJhY2tIZWlnaHQ6IChoZWlnaHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgc2V0SXNIb3ZlcmVkOiAoaXNIb3ZlcmVkOiBib29sZWFuKSA9PiB2b2lkO1xufSkgPT4ge1xuICBjb25zdCBbcmVwbHksIHNldFJlcGx5XSA9IHVzZVN0YXRlKFwiXCIpO1xuXG4gIGNvbnN0IGZlZWRiYWNrUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgeyBtdXRhdGU6IGNyZWF0ZVJlcGx5IH0gPSB1c2VDcmVhdGVSZXBseShmZWVkYmFjay5pZCk7XG4gIGNvbnN0IHsgc2V0U2VsZWN0ZWRGZWVkYmFjayB9ID0gdXNlRmVlZGJhY2tDb250ZXh0KCk7XG5cbiAgY29uc3QgaGFuZGxlUmVzaXplID0gKCkgPT4ge1xuICAgIGlmICghZmVlZGJhY2tSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIHNldEZlZWRiYWNrSGVpZ2h0KGZlZWRiYWNrUmVmLmN1cnJlbnQuY2xpZW50SGVpZ2h0KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gICAgY3JlYXRlUmVwbHkocmVwbHkpO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGZlZWRiYWNrUmVmLmN1cnJlbnQpIHtcbiAgICAgIHNldEZlZWRiYWNrSGVpZ2h0KGZlZWRiYWNrUmVmLmN1cnJlbnQuY2xpZW50SGVpZ2h0KTtcbiAgICB9XG4gIH0sIFtmZWVkYmFjaywgc2V0RmVlZGJhY2tIZWlnaHRdKTtcblxuICBjb25zdCBoYW5kbGVDbG9zZSA9ICgpID0+IHtcbiAgICBzZXRJc0hvdmVyZWQoZmFsc2UpO1xuICAgIHNldFNlbGVjdGVkRmVlZGJhY2sobnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IHJlZj17ZmVlZGJhY2tSZWZ9IGNsYXNzTmFtZT1cInctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgcC0zICByZWxhdGl2ZSB6LTIwXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImt1bWJoLW1lZGl1bSB0ZXh0LXNtIHRleHQtd2hpdGVcIj5Db21tZW50YWlyZTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxNZW51QnV0dG9uIGZlZWRiYWNrPXtmZWVkYmFja30gc2V0SXNIb3ZlcmVkPXtzZXRJc0hvdmVyZWR9IC8+XG4gICAgICAgICAgPENsb3NlQnV0dG9uIG9uQ2xpY2s9e2hhbmRsZUNsb3NlfSBzaXplPVwic21hbGxcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIG92ZXJmbG93LXktYXV0byBvdmVyZmxvdy14LWhpZGRlbiBtYXgtaC1bMjIwcHhdIHNjcm9sbGJhci1kYXJrIGdhcC0yIHAtM1wiPlxuICAgICAgICAgIHtbZmVlZGJhY2ssIC4uLmZlZWRiYWNrLnJlcGxpZXNdLm1hcCgocmVwbHkpID0+IChcbiAgICAgICAgICAgIDxSZXBseUl0ZW0ga2V5PXtyZXBseS5pZH0gcmVwbHk9e3JlcGx5fSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtLTNcIj5cbiAgICAgICAgICA8RmVlZGJhY2tUZXh0QXJlYVxuICAgICAgICAgICAgdmFsdWU9e3JlcGx5fVxuICAgICAgICAgICAgc2V0VmFsdWU9e3NldFJlcGx5fVxuICAgICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgICAgIGhhbmRsZVJlc2l6ZT17aGFuZGxlUmVzaXplfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgZm9yd2FyZFJlZiwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQge1xuICBGZWVkYmFja0NyZWF0ZUR0byxcbiAgRmVlZGJhY2tSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2xpYnMvYmFja2VuZC1jbGllbnRcIjtcblxuY29uc3QgRkVFREJBQ0tfSU5QVVRfV0lEVEggPSAzNDg7XG5jb25zdCBGRUVEQkFDS19JVEVNX1dJRFRIID0gMjU0O1xuY29uc3QgTUFSR0lOID0gMjQ7XG5jb25zdCBJQ09OX1dJRFRIID0gNDg7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja1Bvc2l0aW9uZXIgPSBmb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCB8IG51bGwsXG4gIHtcbiAgICBmZWVkYmFjazogRmVlZGJhY2tSZXNwb25zZSB8IEZlZWRiYWNrQ3JlYXRlRHRvO1xuICAgIGlzRWRpdGluZz86IGJvb2xlYW47XG4gICAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG4gICAgaXNIb3ZlcmVkPzogYm9vbGVhbjtcbiAgICBmZWVkYmFja0hlaWdodD86IG51bWJlcjtcbiAgICBzZXRTaG91bGRSZXZlcnNlPzogKHNob3VsZFJldmVyc2U6IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgfVxuPihcbiAgKFxuICAgIHtcbiAgICAgIGZlZWRiYWNrLFxuICAgICAgZmVlZGJhY2tIZWlnaHQgPSAwLFxuICAgICAgaXNFZGl0aW5nLFxuICAgICAgaXNTZWxlY3RlZCxcbiAgICAgIGlzSG92ZXJlZCxcbiAgICAgIHNldFNob3VsZFJldmVyc2UsXG4gICAgICBjaGlsZHJlbixcbiAgICB9LFxuICAgIHJlZlxuICApID0+IHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdXNlUmVmPEhUTUxFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgW3Bvc2l0aW9uLCBzZXRQb3NpdGlvbl0gPSB1c2VTdGF0ZSh7XG4gICAgICBib3R0b206IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgfSk7XG4gICAgY29uc3QgW2lzSW5pdGlhbGl6ZWQsIHNldElzSW5pdGlhbGl6ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZVJlc2l6ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0YXJnZXRFbGVtZW50IHx8ICF0YXJnZXRFbGVtZW50LmN1cnJlbnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHRhcmdldEVsZW1lbnQuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBjb25zdCB7IGJvdHRvbSwgbGVmdCwgaXNPdmVyZmxvd2luZ1ggfSA9IGdldFBvc2l0aW9uSW5mb3Moe1xuICAgICAgICAgIGZlZWRiYWNrLFxuICAgICAgICAgIGZlZWRiYWNrSGVpZ2h0LFxuICAgICAgICAgIGlzU2VsZWN0ZWQsXG4gICAgICAgICAgaXNIb3ZlcmVkLFxuICAgICAgICAgIGlzRWRpdGluZyxcbiAgICAgICAgICBkaW1lbnNpb25zLFxuICAgICAgICB9KTtcblxuICAgICAgICBzZXRQb3NpdGlvbih7XG4gICAgICAgICAgYm90dG9tLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzZXRTaG91bGRSZXZlcnNlKSBzZXRTaG91bGRSZXZlcnNlKGlzT3ZlcmZsb3dpbmdYKTtcbiAgICAgICAgc2V0SXNJbml0aWFsaXplZCh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgICAgIGBbZGF0YS1wYXRoPVwiJHtmZWVkYmFjay5lbGVtZW50SWR9XCJdYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tmZWVkYmFjay5lbGVtZW50SW5kZXhdO1xuXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB0YXJnZXRFbGVtZW50LmN1cnJlbnQgPSBlbGVtZW50O1xuICAgICAgICBoYW5kbGVSZXNpemUoKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgaGFuZGxlUmVzaXplKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgaGFuZGxlUmVzaXplKTtcbiAgICAgIH07XG4gICAgfSwgW1xuICAgICAgaXNTZWxlY3RlZCxcbiAgICAgIGlzRWRpdGluZyxcbiAgICAgIGlzSG92ZXJlZCxcbiAgICAgIGZlZWRiYWNrLFxuICAgICAgc2V0U2hvdWxkUmV2ZXJzZSxcbiAgICAgIGZlZWRiYWNrSGVpZ2h0LFxuICAgIF0pO1xuXG4gICAgaWYgKCF0YXJnZXRFbGVtZW50IHx8ICF0YXJnZXRFbGVtZW50LmN1cnJlbnQgfHwgIWlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVQb3J0YWwoXG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgYm90dG9tOiBwb3NpdGlvbi5ib3R0b20sXG4gICAgICAgICAgbGVmdDogcG9zaXRpb24ubGVmdCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBcImFsbCAwLjI1cyBlYXNlLWluLW91dFwiLFxuICAgICAgICAgIHpJbmRleDogaXNTZWxlY3RlZCB8fCBpc0hvdmVyZWQgPyAxMDAwMDAxIDogMTAwMDAwMCxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9kaXY+LFxuICAgICAgZG9jdW1lbnQuYm9keVxuICAgICk7XG4gIH1cbik7XG5cbmNvbnN0IGdldFBvc2l0aW9uSW5mb3MgPSAoe1xuICBmZWVkYmFjayxcbiAgZGltZW5zaW9ucyxcbiAgZmVlZGJhY2tIZWlnaHQsXG4gIGlzU2VsZWN0ZWQsXG4gIGlzSG92ZXJlZCxcbiAgaXNFZGl0aW5nLFxufToge1xuICBmZWVkYmFjazogRmVlZGJhY2tSZXNwb25zZSB8IEZlZWRiYWNrQ3JlYXRlRHRvO1xuICBkaW1lbnNpb25zOiBET01SZWN0O1xuICBmZWVkYmFja0hlaWdodDogbnVtYmVyO1xuICBpc1NlbGVjdGVkPzogYm9vbGVhbjtcbiAgaXNIb3ZlcmVkPzogYm9vbGVhbjtcbiAgaXNFZGl0aW5nPzogYm9vbGVhbjtcbn0pID0+IHtcbiAgY29uc3QgdGFyZ2V0V2lkdGggPSBkaW1lbnNpb25zLndpZHRoIHx8IDA7XG4gIGNvbnN0IHRhcmdldEhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0IHx8IDA7XG5cbiAgY29uc3Qgd2lkdGhSYXRpbyA9IGZlZWRiYWNrLmVsZW1lbnRXaWR0aFxuICAgID8gZmVlZGJhY2suZWxlbWVudFdpZHRoIC8gdGFyZ2V0V2lkdGhcbiAgICA6IDE7XG4gIGNvbnN0IGhlaWdodFJhdGlvID0gZmVlZGJhY2suZWxlbWVudEhlaWdodFxuICAgID8gZmVlZGJhY2suZWxlbWVudEhlaWdodCAvIHRhcmdldEhlaWdodFxuICAgIDogMTtcblxuICBjb25zdCByZWZlcmVuY2VQb3NpdGlvbkxlZnQgPVxuICAgIGZlZWRiYWNrLnggLyB3aWR0aFJhdGlvICsgZGltZW5zaW9ucy5sZWZ0ICsgd2luZG93LnNjcm9sbFg7XG4gIGNvbnN0IHJlZmVyZW5jZVBvc2l0aW9uQm90dG9tID1cbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IC1cbiAgICAoZmVlZGJhY2sueSAvIGhlaWdodFJhdGlvICsgZGltZW5zaW9ucy50b3AgKyB3aW5kb3cuc2Nyb2xsWSk7XG5cbiAgY29uc3QgZmVlZGJhY2tXaWR0aCA9IGlzRWRpdGluZyA/IEZFRURCQUNLX0lOUFVUX1dJRFRIIDogRkVFREJBQ0tfSVRFTV9XSURUSDtcblxuICBjb25zdCBpc092ZXJmbG93aW5nWCA9XG4gICAgcmVmZXJlbmNlUG9zaXRpb25MZWZ0ICsgZmVlZGJhY2tXaWR0aCArIE1BUkdJTiA+XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuXG4gIGNvbnN0IGlzT3ZlcmZsb3dpbmdZID1cbiAgICByZWZlcmVuY2VQb3NpdGlvbkJvdHRvbSArIGZlZWRiYWNrSGVpZ2h0ID5cbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gIGNvbnN0IG9mZnNldEVkaXRpbmcgPSBpc0VkaXRpbmcgPyBGRUVEQkFDS19JTlBVVF9XSURUSCAtIElDT05fV0lEVEggOiAwO1xuICBjb25zdCBvZmZzZXRBY3RpdmUgPVxuICAgIGlzSG92ZXJlZCB8fCBpc1NlbGVjdGVkID8gRkVFREJBQ0tfSVRFTV9XSURUSCAtIElDT05fV0lEVEggOiAwO1xuXG4gIGNvbnN0IHBvc2l0aW9uQm90dG9tID1cbiAgICBpc092ZXJmbG93aW5nWSAmJiBpc1NlbGVjdGVkXG4gICAgICA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgLSBmZWVkYmFja0hlaWdodCAtIE1BUkdJTlxuICAgICAgOiByZWZlcmVuY2VQb3NpdGlvbkJvdHRvbTtcblxuICBjb25zdCBwb3NpdGlvbkxlZnQgPSBpc092ZXJmbG93aW5nWFxuICAgID8gcmVmZXJlbmNlUG9zaXRpb25MZWZ0IC0gb2Zmc2V0RWRpdGluZyAtIG9mZnNldEFjdGl2ZVxuICAgIDogcmVmZXJlbmNlUG9zaXRpb25MZWZ0O1xuXG4gIHJldHVybiB7XG4gICAgYm90dG9tOiBwb3NpdGlvbkJvdHRvbSxcbiAgICBsZWZ0OiBwb3NpdGlvbkxlZnQsXG4gICAgaXNPdmVyZmxvd2luZ1gsXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUZlZWRiYWNrQ29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb250ZXh0cy9GZWVkYmFja0NvbnRleHRcIjtcbmltcG9ydCB7IGdldEluaXRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWxzL2dldEluaXRpYWxzXCI7XG5pbXBvcnQgeyBGZWVkYmFja0l0ZW1Ib3ZlcmVkIH0gZnJvbSBcIi4vRmVlZGJhY2tJdGVtSG92ZXJlZFwiO1xuaW1wb3J0IHsgRmVlZGJhY2tJdGVtU2VsZWN0ZWQgfSBmcm9tIFwiLi9GZWVkYmFja0l0ZW1TZWxlY3RlZFwiO1xuaW1wb3J0IHsgRmVlZGJhY2tQb3NpdGlvbmVyIH0gZnJvbSBcIi4uL3NoYXJlZC9GZWVkYmFja1Bvc2l0aW9uZXJcIjtcbmltcG9ydCB7IEZlZWRiYWNrUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vbGlicy9iYWNrZW5kLWNsaWVudFwiO1xuXG5leHBvcnQgY29uc3QgRmVlZGJhY2tQaW4gPSAoeyBmZWVkYmFjayB9OiB7IGZlZWRiYWNrOiBGZWVkYmFja1Jlc3BvbnNlIH0pID0+IHtcbiAgY29uc3QgW2lzSG92ZXJlZCwgc2V0SXNIb3ZlcmVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2ZlZWRiYWNrSGVpZ2h0LCBzZXRGZWVkYmFja0hlaWdodF0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgeyBzZWxlY3RlZEZlZWRiYWNrLCBzZXRTZWxlY3RlZEZlZWRiYWNrIH0gPSB1c2VGZWVkYmFja0NvbnRleHQoKTtcblxuICBjb25zdCBpbml0aWFscyA9IGdldEluaXRpYWxzKGZlZWRiYWNrLnVzZXIpO1xuXG4gIGNvbnN0IGlzU2VsZWN0ZWQgPSBzZWxlY3RlZEZlZWRiYWNrICYmIGZlZWRiYWNrLmlkID09PSBzZWxlY3RlZEZlZWRiYWNrLmlkO1xuXG4gIHJldHVybiAoXG4gICAgPEZlZWRiYWNrUG9zaXRpb25lclxuICAgICAgZmVlZGJhY2s9e2ZlZWRiYWNrfVxuICAgICAgaXNTZWxlY3RlZD17ISFpc1NlbGVjdGVkfVxuICAgICAgaXNIb3ZlcmVkPXtpc0hvdmVyZWR9XG4gICAgICBmZWVkYmFja0hlaWdodD17aXNIb3ZlcmVkICYmICFpc1NlbGVjdGVkID8gOTYgOiBmZWVkYmFja0hlaWdodH1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIG9uTW91c2VFbnRlcj17KCkgPT4gc2V0SXNIb3ZlcmVkKHRydWUpfVxuICAgICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldElzSG92ZXJlZChmYWxzZSl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNlbGVjdGVkRmVlZGJhY2soZmVlZGJhY2spfVxuICAgICAgICBjbGFzc05hbWU9e2BmZWVkYmFjay1pdGVtICR7aXNTZWxlY3RlZCAmJiBcInNlbGVjdGVkXCJ9ICR7XG4gICAgICAgICAgZmVlZGJhY2suaXNSZXNvbHZlZCAmJiAhaXNIb3ZlcmVkICYmICFpc1NlbGVjdGVkICYmIFwib3BhY2l0eS01MFwiXG4gICAgICAgIH1gfVxuICAgICAgPlxuICAgICAgICB7aXNTZWxlY3RlZCA/IChcbiAgICAgICAgICA8RmVlZGJhY2tJdGVtU2VsZWN0ZWRcbiAgICAgICAgICAgIGZlZWRiYWNrPXtmZWVkYmFja31cbiAgICAgICAgICAgIHNldEZlZWRiYWNrSGVpZ2h0PXtzZXRGZWVkYmFja0hlaWdodH1cbiAgICAgICAgICAgIHNldElzSG92ZXJlZD17c2V0SXNIb3ZlcmVkfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBpc0hvdmVyZWQgPyAoXG4gICAgICAgICAgPEZlZWRiYWNrSXRlbUhvdmVyZWQgZmVlZGJhY2s9e2ZlZWRiYWNrfSAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXNocmluay0wIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB3LTYgaC02IG0tM1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC13aGl0ZSBmb250LW1lZGl1bVwiPntpbml0aWFsc308L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L0ZlZWRiYWNrUG9zaXRpb25lcj5cbiAgKTtcbn07XG4iLCJpbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQgeyBGZWVkYmFja1BpbiB9IGZyb20gXCIuLi9pdGVtL0ZlZWRiYWNrUGluXCI7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja1BpbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHsgaXNPcGVuLCBmZWVkYmFja3MgfSA9IHVzZUZlZWRiYWNrQ29udGV4dCgpO1xuXG4gIGlmICghaXNPcGVuIHx8ICFmZWVkYmFja3MpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBmZWVkYmFja3NcbiAgICAuZmlsdGVyKChmZWVkYmFjaykgPT4gZmVlZGJhY2sucGF0aCA9PT0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKVxuICAgIC5tYXAoKGZlZWRiYWNrKSA9PiA8RmVlZGJhY2tQaW4ga2V5PXtmZWVkYmFjay5pZH0gZmVlZGJhY2s9e2ZlZWRiYWNrfSAvPik7XG59O1xuIiwiZXhwb3J0IGNvbnN0IENvbW1lbnRJY29uID0gKHsgYWN0aXZlIH06IHsgYWN0aXZlOiBib29sZWFuIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Bjb21tZW50LWljb24gJHthY3RpdmUgPyBcImNvbW1lbnQtaWNvbi1hY3RpdmVcIiA6IFwiXCJ9YH1cbiAgICA+PC9kaXY+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUZlZWRiYWNrQ29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb250ZXh0cy9GZWVkYmFja0NvbnRleHRcIjtcbmltcG9ydCB7IHVzZUNyZWF0ZUZlZWRiYWNrIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NlcnZpY2VzL2ZlZWRiYWNrXCI7XG5pbXBvcnQgeyBDb21tZW50SWNvbiB9IGZyb20gXCIuLi8uLi8uLi9hdG9tcy9pY29ucy9Db21tZW50SWNvblwiO1xuaW1wb3J0IHsgRmVlZGJhY2tQb3NpdGlvbmVyIH0gZnJvbSBcIi4uL3NoYXJlZC9GZWVkYmFja1Bvc2l0aW9uZXJcIjtcbmltcG9ydCB7IEZlZWRiYWNrVGV4dEFyZWEgfSBmcm9tIFwiLi4vc2hhcmVkL0ZlZWRiYWNrVGV4dEFyZWFcIjtcblxuZXhwb3J0IGNvbnN0IEZlZWRiYWNrSW5wdXQgPSAoKSA9PiB7XG4gIGNvbnN0IHsgbmV3RmVlZGJhY2ssIHJlc2V0RmVlZGJhY2ssIG5ld0ZlZWRiYWNrUmVmIH0gPSB1c2VGZWVkYmFja0NvbnRleHQoKTtcbiAgY29uc3QgW2NvbW1lbnQsIHNldENvbW1lbnRdID0gdXNlU3RhdGUobmV3RmVlZGJhY2s/LmNvbW1lbnQgfHwgXCJcIik7XG4gIGNvbnN0IFtzaG91bGRSZXZlcnNlLCBzZXRTaG91bGRSZXZlcnNlXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCB7IG11dGF0ZTogY3JlYXRlRmVlZGJhY2sgfSA9IHVzZUNyZWF0ZUZlZWRiYWNrKCk7XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCkgPT4ge1xuICAgIGlmICghbmV3RmVlZGJhY2spIHJldHVybjtcbiAgICBjcmVhdGVGZWVkYmFjayh7XG4gICAgICAuLi5uZXdGZWVkYmFjayxcbiAgICAgIHg6IG5ld0ZlZWRiYWNrLngsXG4gICAgICB5OiBuZXdGZWVkYmFjay55LFxuICAgICAgY29tbWVudCxcbiAgICB9KTtcbiAgICByZXNldEZlZWRiYWNrKCk7XG4gIH07XG5cbiAgaWYgKCFuZXdGZWVkYmFjaykgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8RmVlZGJhY2tQb3NpdGlvbmVyXG4gICAgICByZWY9e25ld0ZlZWRiYWNrUmVmfVxuICAgICAgZmVlZGJhY2s9e25ld0ZlZWRiYWNrfVxuICAgICAgc2V0U2hvdWxkUmV2ZXJzZT17c2V0U2hvdWxkUmV2ZXJzZX1cbiAgICAgIGlzRWRpdGluZz17dHJ1ZX1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImNvbW1lbnQtY29udGFpbmVyXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBzaG91bGRSZXZlcnNlID8gXCJyb3ctcmV2ZXJzZVwiIDogXCJyb3dcIixcbiAgICAgICAgICBhbGlnbkl0ZW1zOiBjb21tZW50Lmxlbmd0aCA+IDAgPyBcImZsZXgtc3RhcnRcIiA6IFwiZmxleC1lbmRcIixcbiAgICAgICAgICB0b3A6IGNvbW1lbnQubGVuZ3RoID4gMCA/IFwiNTFweFwiIDogXCIwcHhcIixcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPENvbW1lbnRJY29uIGFjdGl2ZT17Y29tbWVudC5sZW5ndGggPiAwfSAvPlxuICAgICAgICA8RmVlZGJhY2tUZXh0QXJlYVxuICAgICAgICAgIHZhbHVlPXtjb21tZW50fVxuICAgICAgICAgIHNldFZhbHVlPXtzZXRDb21tZW50fVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgICAgaXNBbmltYXRlZFxuICAgICAgICAgIGlzRGFya1xuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9GZWVkYmFja1Bvc2l0aW9uZXI+XG4gICk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IENvbGxhcHNlQnV0dG9uID0gKHtcbiAgaXNDb2xsYXBzZWQsXG4gIHNldElzQ29sbGFwc2VkLFxufToge1xuICBpc0NvbGxhcHNlZDogYm9vbGVhbjtcbiAgc2V0SXNDb2xsYXBzZWQ6IFJlYWN0LkRpc3BhdGNoPFJlYWN0LlNldFN0YXRlQWN0aW9uPGJvb2xlYW4+Pjtcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBzZXRJc0NvbGxhcHNlZCgoYykgPT4gIWMpO1xuICAgICAgfX1cbiAgICAgIGNsYXNzTmFtZT1cImgtMTYgdy0xNiByb3VuZGVkLWZ1bGwgYWJzb2x1dGUgbGVmdC1bLTMycHhdIGJvdHRvbS0wIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHByLTYgYmctZ3JheS1mZWVkYmFjay04MDBcIlxuICAgID5cbiAgICAgIDxpbWdcbiAgICAgICAgc3JjPXtcbiAgICAgICAgICBpc0NvbGxhcHNlZFxuICAgICAgICAgICAgPyBcIi9mZWVkYmFjay9jaGV2cm9uLWxlZnQuc3ZnXCJcbiAgICAgICAgICAgIDogXCIvZmVlZGJhY2svY2hldnJvbi1yaWdodC5zdmdcIlxuICAgICAgICB9XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZU11dGF0aW9uLCB1c2VRdWVyeUNsaWVudCB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCBhcGkgZnJvbSBcIi4vYXBpXCI7XG5pbXBvcnQgeyBTaWduSW5EdG8sIFNpZ25VcER0byB9IGZyb20gXCIuLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBzaWduSW4gPSBhc3luYyAocGF5bG9hZDogU2lnbkluRHRvKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLmF1dGguYXV0aENvbnRyb2xsZXJTaWduSW4ocGF5bG9hZCk7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIsIHJlc3BvbnNlLmRhdGEuYWNjZXNzVG9rZW4pO1xuICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduVXAgPSBhc3luYyAocGF5bG9hZDogU2lnblVwRHRvKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpLmF1dGguYXV0aENvbnRyb2xsZXJTaWduVXAocGF5bG9hZCk7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIsIHJlc3BvbnNlLmRhdGEuYWNjZXNzVG9rZW4pO1xuICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2dvdXQgPSBhc3luYyAoKSA9PiB7XG4gIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiZ2FsYWRyaW1GZWVkYmFja1Rva2VuXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVNpZ25JbiA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IHNpZ25JbixcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIHJldHVybiBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcygpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVNpZ25VcCA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IHNpZ25VcCxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIHJldHVybiBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcygpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUxvZ291dCA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGxvZ291dCxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIHJldHVybiBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcygpO1xuICAgIH0sXG4gIH0pO1xufTtcbiIsImltcG9ydCB7IHVzZUxvZ291dCB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9hdXRoXCI7XG5pbXBvcnQgeyB1c2VNZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy91c2VyXCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi4vYXRvbXMvYnV0dG9ucy9CdXR0b25cIjtcblxuZXhwb3J0IGNvbnN0IENvbm5lY3RlZFVzZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHsgZGF0YTogbWUgfSA9IHVzZU1lKCk7XG4gIGNvbnN0IHsgbXV0YXRlOiBsb2dvdXQgfSA9IHVzZUxvZ291dCgpO1xuXG4gIGNvbnN0IGhhbmRsZUxvZ291dCA9ICgpID0+IHtcbiAgICBsb2dvdXQoKTtcbiAgfTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiB0ZXh0LWdyYXktZmVlZGJhY2stMjAwIHotMTBcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cImt1bWJoLW1lZGl1bSB0ZXh0LXNtIHRleHQtZ3JheS1mZWVkYmFjay0zMDBcIj5cbiAgICAgICAgICB7bWU/LmZ1bGxOYW1lIHx8IGAke21lPy5maXJzdE5hbWV9ICR7bWU/Lmxhc3ROYW1lfWB9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LXhzIGxlYWRpbmctWzEycHhdIHRleHQtZ3JheS1mZWVkYmFjay0zMDBcIj5cbiAgICAgICAgICB7bWU/LmVtYWlsfVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxpbWdcbiAgICAgICAgb25DbGljaz17aGFuZGxlTG9nb3V0fVxuICAgICAgICBzcmM9XCIvZmVlZGJhY2svbG9nLW91dC0wMi5zdmdcIlxuICAgICAgICBjbGFzc05hbWU9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImV4cG9ydCBjb25zdCBTZWFyY2hJbnB1dCA9ICh7XG4gIHZhbHVlLFxuICBzZXRWYWx1ZSxcbn06IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgc2V0VmFsdWU6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGJnLWdyYXktZmVlZGJhY2stNzAwIGJvcmRlci1ncmF5LWZlZWRiYWNrLTUwMCByb3VuZGVkLWxnIHB4LTMgcHktMiBmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPGltZyBzcmM9e1wiL2ZlZWRiYWNrL3NlYXJjaC5zdmdcIn0gY2xhc3NOYW1lPVwidy02IGgtNlwiIC8+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT17XCJ0ZXh0XCJ9XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBiZy1ncmF5LWZlZWRiYWNrLTcwMCBvdXRsaW5lLW5vbmUgYm9yZGVyLW5vbmUgdGV4dC13aGl0ZVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuaW1wb3J0IHsgdXNlRmVlZGJhY2tDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvbnRleHRzL0ZlZWRiYWNrQ29udGV4dFwiO1xuaW1wb3J0IHsgRmVlZGJhY2tSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9saWJzL2JhY2tlbmQtY2xpZW50XCI7XG5cbmV4cG9ydCBjb25zdCBGZWVkYmFja0xpc3RJdGVtID0gKHtcbiAgZmVlZGJhY2ssXG59OiB7XG4gIGZlZWRiYWNrOiBGZWVkYmFja1Jlc3BvbnNlO1xufSkgPT4ge1xuICBjb25zdCB7IHVzZXIsIGNyZWF0ZWRBdCwgY29tbWVudCwgcGF0aCwgcmVwbGllcyB9ID0gZmVlZGJhY2s7XG4gIGNvbnN0IHsgc2VsZWN0ZWRGZWVkYmFjaywgc2V0U2VsZWN0ZWRGZWVkYmFjaywgbmF2aWdhdGUgfSA9XG4gICAgdXNlRmVlZGJhY2tDb250ZXh0KCk7XG5cbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSBhc3luYyAoKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWRGZWVkYmFjayhmZWVkYmFjayk7XG4gICAgbmF2aWdhdGUoZmVlZGJhY2sucGF0aCk7XG4gIH07XG5cbiAgY29uc3QgcmVwbGllc0NvdW50ID0gcmVwbGllcy5sZW5ndGg7XG5cbiAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkRmVlZGJhY2sgJiYgZmVlZGJhY2suaWQgPT09IHNlbGVjdGVkRmVlZGJhY2suaWQ7XG5cbiAgY29uc3QgaXNTZWxlY3RlZENsYXNzID0gaXNTZWxlY3RlZFxuICAgID8gXCJiZy1wcmltYXJ5LWZlZWRiYWNrLTYwMFwiXG4gICAgOiBcIiBob3ZlcjpiZy1ncmF5LWZlZWRiYWNrLTcwMFwiO1xuXG4gIGNvbnN0IHRleHRDb2xvckNsYXNzID0gaXNTZWxlY3RlZFxuICAgID8gXCJ0ZXh0LXdoaXRlXCJcbiAgICA6IFwidGV4dC1wcmltYXJ5LWZlZWRiYWNrLTQwMFwiO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtgZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCByb3VuZGVkLWxnICR7aXNTZWxlY3RlZENsYXNzfSBwLTJgfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJrdW1iaC1tZWRpdW0gdGV4dC1zbSB0ZXh0LWdyYXktZmVlZGJhY2stMjAwXCI+XG4gICAgICAgICAge3VzZXI/LmZ1bGxOYW1lIHx8IGAke3VzZXI/LmZpcnN0TmFtZX0gJHt1c2VyPy5sYXN0TmFtZX1gfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImt1bWJoLXJlZ3VsYXIgdGV4dC1bMTBweF0gbGVhZGluZy1bMTJweF0gdGV4dC1ncmF5LWZlZWRiYWNrLTMwMFwiPlxuICAgICAgICAgIHttb21lbnQoY3JlYXRlZEF0KS5mcm9tTm93KCl9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwia3VtYmgtcmVndWxhciB0ZXh0LXhzIHRleHQtd2hpdGVcIj57cGF0aH08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJtdC0yIGt1bWJoLXJlZ3VsYXIgdGV4dC1iYXNlIHRleHQtd2hpdGVcIj57Y29tbWVudH08L3NwYW4+XG4gICAgICB7cmVwbGllc0NvdW50ID4gMCAmJiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17YG10LTIga3VtYmgtcmVndWxhciB0ZXh0LXhzICR7dGV4dENvbG9yQ2xhc3N9YH0+XG4gICAgICAgICAge3JlcGxpZXNDb3VudH0gcsOpcG9uc2V7cmVwbGllc0NvdW50ID4gMSA/IFwic1wiIDogXCJcIn1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlRmVlZGJhY2tDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvbnRleHRzL0ZlZWRiYWNrQ29udGV4dFwiO1xuaW1wb3J0IHsgU2VhcmNoSW5wdXQgfSBmcm9tIFwiLi4vLi4vLi4vYXRvbXMvaW5wdXRzL1NlYXJjaElucHV0XCI7XG5pbXBvcnQgeyBGZWVkYmFja0xpc3RJdGVtIH0gZnJvbSBcIi4uL2l0ZW0vRmVlZGJhY2tMaXN0SXRlbVwiO1xuXG5leHBvcnQgY29uc3QgRmVlZGJhY2tMaXN0ID0gKCkgPT4ge1xuICBjb25zdCB7IGZlZWRiYWNrcyB9ID0gdXNlRmVlZGJhY2tDb250ZXh0KCk7XG4gIGNvbnN0IFtzZWFyY2gsIHNldFNlYXJjaF0gPSB1c2VTdGF0ZShcIlwiKTtcblxuICBjb25zdCBmaWx0ZXJlZEZlZWRiYWNrcyA9IGZlZWRiYWNrcz8uZmlsdGVyKFxuICAgIChmZWVkYmFjaykgPT5cbiAgICAgICFzZWFyY2ggfHxcbiAgICAgIGZlZWRiYWNrLnBhdGguaW5jbHVkZXMoc2VhcmNoKSB8fFxuICAgICAgZmVlZGJhY2suY29tbWVudC5pbmNsdWRlcyhzZWFyY2gpXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBmbGV4LTEgZmxleCBmbGV4LWNvbCAgcHQtOCBvdmVyZmxvdy1oaWRkZW4gei0xMFwiPlxuICAgICAgPFNlYXJjaElucHV0IHZhbHVlPXtzZWFyY2h9IHNldFZhbHVlPXtzZXRTZWFyY2h9IC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBmbGV4IGZsZXgtY29sIGdhcC00IG10LTQgb3ZlcmZsb3cteS1hdXRvIHNjcm9sbGJhci1oaWRlXCI+XG4gICAgICAgIHtmaWx0ZXJlZEZlZWRiYWNrcyAmJlxuICAgICAgICAgIGZpbHRlcmVkRmVlZGJhY2tzLm1hcCgoZmVlZGJhY2spID0+IChcbiAgICAgICAgICAgIDxGZWVkYmFja0xpc3RJdGVtIGtleT17ZmVlZGJhY2suaWR9IGZlZWRiYWNrPXtmZWVkYmFja30gLz5cbiAgICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCB7IENvbm5lY3RlZFVzZXIgfSBmcm9tIFwiLi4vbW9sZWN1bGVzL0Nvbm5lY3RlZFVzZXJcIjtcbmltcG9ydCB7IEZlZWRiYWNrTGlzdCB9IGZyb20gXCIuLi9tb2xlY3VsZXMvZmVlZGJhY2tzL2dyb3VwL0ZlZWRiYWNrTGlzdFwiO1xuXG5leHBvcnQgY29uc3QgQ29ubmVjdGVkUGFuZWwgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgZmxleC0xIGZsZXggZmxleC1jb2wgaXRlbXMtc3RyZXRjaCBqdXN0aWZ5LWJldHdlZW4gXCI+XG4gICAgICA8RmVlZGJhY2tMaXN0IC8+XG4gICAgICA8Q29ubmVjdGVkVXNlciAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImV4cG9ydCBjb25zdCBJbnB1dCA9ICh7XG4gIGxhYmVsLFxuICBwbGFjZWhvbGRlcixcbiAgdHlwZSxcbiAgdmFsdWUsXG4gIHNldFZhbHVlLFxufToge1xuICBsYWJlbDogc3RyaW5nO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHNldFZhbHVlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJrdW1iaC1tZWRpdW0gdGV4dC1zbSB0ZXh0LWdyYXktZmVlZGJhY2stNDAwIG1iLVs2cHhdXCI+XG4gICAgICAgIHtsYWJlbH1cbiAgICAgIDwvbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT17dHlwZX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0VmFsdWUoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZCB0ZXh0LWJsYWNrIGJvcmRlciBib3JkZXItZ3JheS1mZWVkYmFjay00MDAgcHktMiBweC0zIG1iLTQgcGxhY2Vob2xkZXI6dGV4dC1ncmF5LWZlZWRiYWNrLTMwMFwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gXCIuLi8uLi9hdG9tcy9pbnB1dHMvSW5wdXRcIjtcbmltcG9ydCB7IHVzZVNpZ25VcCB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoXCI7XG5pbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5cbmV4cG9ydCBjb25zdCBTaWduVXBGb3JtID0gKHtcbiAgY2xvc2VNb2RhbCxcbiAgc2V0SXNTaWduaW5nVXAsXG59OiB7XG4gIGNsb3NlTW9kYWw6ICgpID0+IHZvaWQ7XG4gIHNldElzU2lnbmluZ1VwOiAoaXNTaWduaW5nVXA6IGJvb2xlYW4pID0+IHZvaWQ7XG59KSA9PiB7XG4gIGNvbnN0IFtmaXJzdE5hbWUsIHNldEZpcnN0TmFtZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2xhc3ROYW1lLCBzZXRMYXN0TmFtZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2VtYWlsLCBzZXRFbWFpbF0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3Bhc3N3b3JkLCBzZXRQYXNzd29yZF0gPSB1c2VTdGF0ZShcIlwiKTtcblxuICBjb25zdCB7IG11dGF0ZTogc2lnblVwIH0gPSB1c2VTaWduVXAoKTtcbiAgY29uc3QgeyBhY3RpdmF0ZUZlZWRiYWNrTW9kZSB9ID0gdXNlRmVlZGJhY2tDb250ZXh0KCk7XG5cbiAgY29uc3QgaGFuZGxlU2lnblVwID0gKCkgPT4ge1xuICAgIHNpZ25VcChcbiAgICAgIHsgZmlyc3ROYW1lLCBsYXN0TmFtZSwgZW1haWwsIHBhc3N3b3JkIH0sXG4gICAgICB7XG4gICAgICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgICAgIGNsb3NlTW9kYWwoKTtcbiAgICAgICAgICBhY3RpdmF0ZUZlZWRiYWNrTW9kZSgpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgei0xMCBmbGV4IGZsZXgtY29sIGp1c3RpZnktc3RhcnRcIj5cbiAgICAgIDxpbWdcbiAgICAgICAgc3JjPVwiL2ZlZWRiYWNrL2xvZ28tZmVlZGJhY2stZGFyay5zdmdcIlxuICAgICAgICBjbGFzc05hbWU9XCJtYi0xMiBoLVs0M3B4XSB3LW1pblwiXG4gICAgICAvPlxuICAgICAgPGgxIGNsYXNzTmFtZT1cImt1bWJoLXNlbWlib2xkIHRleHQtM3hsIHRleHQtZ3JheS1mZWVkYmFjay05MDAgbWItM1wiPlxuICAgICAgICBJbnNjcmlwdGlvblxuICAgICAgPC9oMT5cblxuICAgICAgPElucHV0XG4gICAgICAgIGxhYmVsPVwiUHLDqW5vbVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiUHLDqW5vbVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgdmFsdWU9e2ZpcnN0TmFtZX1cbiAgICAgICAgc2V0VmFsdWU9e3NldEZpcnN0TmFtZX1cbiAgICAgIC8+XG4gICAgICA8SW5wdXRcbiAgICAgICAgbGFiZWw9XCJOb21cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIk5vbVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgdmFsdWU9e2xhc3ROYW1lfVxuICAgICAgICBzZXRWYWx1ZT17c2V0TGFzdE5hbWV9XG4gICAgICAvPlxuICAgICAgPElucHV0XG4gICAgICAgIGxhYmVsPVwiRS1tYWlsXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJFLW1haWxcIlxuICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICB2YWx1ZT17ZW1haWx9XG4gICAgICAgIHNldFZhbHVlPXtzZXRFbWFpbH1cbiAgICAgIC8+XG4gICAgICA8SW5wdXRcbiAgICAgICAgbGFiZWw9XCJNb3QgZGUgcGFzc2VcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIk1vdCBkZSBwYXNzZVwiXG4gICAgICAgIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICAgIHZhbHVlPXtwYXNzd29yZH1cbiAgICAgICAgc2V0VmFsdWU9e3NldFBhc3N3b3JkfVxuICAgICAgLz5cbiAgICAgIDxidXR0b25cbiAgICAgICAgb25DbGljaz17aGFuZGxlU2lnblVwfVxuICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtNCBweS0yIGJnLWJsdWUtNTAwIGt1bWJoLW1lZGl1bSB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgbXQtMiAgZGlzYWJsZWQ6YmctYmx1ZS0xMDAgZGlzYWJsZWQ6dGV4dC1ibHVlLTMwMFwiXG4gICAgICA+XG4gICAgICAgIFMnaW5zY3JpcmVcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc1NpZ25pbmdVcChmYWxzZSl9XG4gICAgICAgIGNsYXNzTmFtZT1cImZvbnQtYm9sZCB0ZXh0LWNlbnRlciB0ZXh0LWJsYWNrIHRleHQtc20gbXQtMlwiXG4gICAgICA+XG4gICAgICAgIFNlIGNvbm5lY3RlclxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlU2lnbkluIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2F1dGhcIjtcbmltcG9ydCB7IElucHV0IH0gZnJvbSBcIi4uLy4uL2F0b21zL2lucHV0cy9JbnB1dFwiO1xuaW1wb3J0IHsgdXNlRmVlZGJhY2tDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL0ZlZWRiYWNrQ29udGV4dFwiO1xuXG5jb25zdCBTaWduSW5Gb3JtID0gKHtcbiAgc2V0SXNTaWduaW5nVXAsXG4gIGNsb3NlTW9kYWwsXG59OiB7XG4gIHNldElzU2lnbmluZ1VwOiAoaXNTaWduaW5nVXA6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGNsb3NlTW9kYWw6ICgpID0+IHZvaWQ7XG59KSA9PiB7XG4gIGNvbnN0IFtlbWFpbCwgc2V0RW1haWxdID0gUmVhY3QudXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gUmVhY3QudXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gUmVhY3QudXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IHsgbXV0YXRlOiBzaWduSW4gfSA9IHVzZVNpZ25JbigpO1xuICBjb25zdCB7IGFjdGl2YXRlRmVlZGJhY2tNb2RlIH0gPSB1c2VGZWVkYmFja0NvbnRleHQoKTtcblxuICBjb25zdCBoYW5kbGVMb2dpbiA9ICgpID0+IHtcbiAgICBzaWduSW4oXG4gICAgICB7IGVtYWlsLCBwYXNzd29yZCB9LFxuICAgICAge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICBjbG9zZU1vZGFsKCk7XG4gICAgICAgICAgYWN0aXZhdGVGZWVkYmFja01vZGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSA9PT0gXCJOZXR3b3JrIEVycm9yXCIpIHtcbiAgICAgICAgICAgIHNldEVycm9yKFwiVW5lIGVycmV1ciByw6lzZWF1IGVzdCBzdXJ2ZW51ZVwiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2UgPT09IFwiSW52YWxpZCBjcmVkZW50aWFsc1wiKSB7XG4gICAgICAgICAgICBzZXRFcnJvcihcIkVtYWlsIG91IG1vdCBkZSBwYXNzZSBpbnZhbGlkZVwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0RXJyb3IoXCJVbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICAvLyBjb25zdCBoYW5kbGVHaXRodWJMb2dpbiA9ICgpID0+IHtcbiAgLy8gICBjb25zdCBjdXJyZW50VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIC8vICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgaHR0cDovL2xvY2FsaG9zdDozMDAwL2F1dGgvZ2l0aHViP3JlZGlyZWN0VXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAvLyAgICAgY3VycmVudFVybFxuICAvLyAgICl9YDtcbiAgLy8gfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIHotMTAgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LXN0YXJ0XCI+XG4gICAgICA8aW1nXG4gICAgICAgIHNyYz1cIi9mZWVkYmFjay9sb2dvLWZlZWRiYWNrLWRhcmsuc3ZnXCJcbiAgICAgICAgY2xhc3NOYW1lPVwibWItMTIgaC1bNDNweF0gdy1taW5cIlxuICAgICAgLz5cbiAgICAgIDxoMSBjbGFzc05hbWU9XCJrdW1iaC1zZW1pYm9sZCB0ZXh0LTN4bCB0ZXh0LWdyYXktZmVlZGJhY2stOTAwIG1iLTNcIj5cbiAgICAgICAgQ29ubmV4aW9uXG4gICAgICA8L2gxPlxuICAgICAgPElucHV0XG4gICAgICAgIGxhYmVsPVwiRW1haWxcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkVtYWlsXCJcbiAgICAgICAgdHlwZT1cImVtYWlsXCJcbiAgICAgICAgdmFsdWU9e2VtYWlsfVxuICAgICAgICBzZXRWYWx1ZT17c2V0RW1haWx9XG4gICAgICAvPlxuICAgICAgPElucHV0XG4gICAgICAgIGxhYmVsPVwiTW90IGRlIHBhc3NlXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJNb3QgZGUgcGFzc2VcIlxuICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICB2YWx1ZT17cGFzc3dvcmR9XG4gICAgICAgIHNldFZhbHVlPXtzZXRQYXNzd29yZH1cbiAgICAgIC8+XG4gICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXJlZC01MDAgdGV4dC14cyBoLTQgdGV4dC1jZW50ZXJcIj57ZXJyb3J9PC9wPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZUxvZ2lufVxuICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtNCBweS0yIGJnLWJsdWUtNTAwIGt1bWJoLW1lZGl1bSB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgbXQtMiAgZGlzYWJsZWQ6YmctYmx1ZS0xMDAgZGlzYWJsZWQ6dGV4dC1ibHVlLTMwMFwiXG4gICAgICA+XG4gICAgICAgIFNlIGNvbm5lY3RlclxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzU2lnbmluZ1VwKHRydWUpfVxuICAgICAgICBjbGFzc05hbWU9XCJmb250LWJvbGQgdGV4dC1jZW50ZXIgdGV4dC1ibGFjayB0ZXh0LXNtIG10LTJcIlxuICAgICAgPlxuICAgICAgICBTJ2luc2NyaXJlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNpZ25JbkZvcm07XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU2lnblVwRm9ybSB9IGZyb20gXCIuLi9tb2xlY3VsZXMvZm9ybXMvU2lnblVwRm9ybVwiO1xuaW1wb3J0IFNpZ25JbkZvcm0gZnJvbSBcIi4uL21vbGVjdWxlcy9mb3Jtcy9TaWduSW5Gb3JtXCI7XG5cbmV4cG9ydCBjb25zdCBDb25uZWN0aW9uID0gKHsgY2xvc2VNb2RhbCB9OiB7IGNsb3NlTW9kYWw6ICgpID0+IHZvaWQgfSkgPT4ge1xuICBjb25zdCBbaXNTaWduaW5nVXAsIHNldElzU2lnbmluZ1VwXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicC04XCI+XG4gICAgICB7aXNTaWduaW5nVXAgPyAoXG4gICAgICAgIDxTaWduVXBGb3JtIGNsb3NlTW9kYWw9e2Nsb3NlTW9kYWx9IHNldElzU2lnbmluZ1VwPXtzZXRJc1NpZ25pbmdVcH0gLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxTaWduSW5Gb3JtIHNldElzU2lnbmluZ1VwPXtzZXRJc1NpZ25pbmdVcH0gY2xvc2VNb2RhbD17Y2xvc2VNb2RhbH0gLz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCBjb25zdCBNb2RhbCA9ICh7XG4gIGlzVmlzaWJsZSxcbiAgY2xvc2VNb2RhbCxcbiAgbGltaXRXaWR0aCA9IHRydWUsXG4gIGNoaWxkcmVuLFxufToge1xuICBpc1Zpc2libGU6IGJvb2xlYW47XG4gIGNsb3NlTW9kYWw/OiAoKSA9PiB2b2lkO1xuICBsaW1pdFdpZHRoPzogYm9vbGVhbjtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pID0+IHtcbiAgY29uc3QgcmVzaXppbmcgPSB1c2VSZWYoZmFsc2UpO1xuXG4gIGlmICghaXNWaXNpYmxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgd2lkdGggPSBsaW1pdFdpZHRoID8gXCJ3LVs0MDBweF1cIiA6IFwiXCI7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwibW9kYWxcIlxuICAgICAgb25Nb3VzZURvd249eyhlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgICAgICAgIHJlc2l6aW5nLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25Nb3VzZVVwPXsoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc2l6aW5nLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH19XG4gICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICBpZiAoY2xvc2VNb2RhbCAmJiBlLnRhcmdldCA9PT0gZS5jdXJyZW50VGFyZ2V0ICYmICFyZXNpemluZy5jdXJyZW50KSB7XG4gICAgICAgICAgY2xvc2VNb2RhbCgpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHt3aWR0aH0gYmctd2hpdGUgcm91bmRlZC1sZ2B9PntjaGlsZHJlbn08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uLy4uL29yZ2FuaXNtcy9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gXCIuL01vZGFsXCI7XG5cbmV4cG9ydCBjb25zdCBDb25uZWN0aW9uTW9kYWwgPSAoe1xuICBpc1Zpc2libGUsXG4gIGNsb3NlTW9kYWwsXG59OiB7XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbiAgY2xvc2VNb2RhbDogKCkgPT4gdm9pZDtcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8TW9kYWwgaXNWaXNpYmxlPXtpc1Zpc2libGV9IGNsb3NlTW9kYWw9e2Nsb3NlTW9kYWx9PlxuICAgICAgPENvbm5lY3Rpb24gY2xvc2VNb2RhbD17Y2xvc2VNb2RhbH0gLz5cbiAgICA8L01vZGFsPlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi4vYXRvbXMvYnV0dG9ucy9CdXR0b25cIjtcbmltcG9ydCB7IENvbm5lY3Rpb25Nb2RhbCB9IGZyb20gXCIuLi9hdG9tcy9tb2RhbHMvQ29ubmVjdGlvbk1vZGFsXCI7XG5cbmV4cG9ydCBjb25zdCBDb25uZWN0aW9uUGFuZWwgPSAoKSA9PiB7XG4gIGNvbnN0IFtjb25uZWN0aW9uTW9kYWxPcGVuLCBzZXRDb25uZWN0aW9uTW9kYWxPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtNFwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciB0ZXh0LWdyYXktZmVlZGJhY2stMjAwIHRleHQtc21cIj5cbiAgICAgICAgICBDb25uZWN0ZXogdm91cyBwb3VyIGFjY8OpZGVyIGF1eCBjb21tZW50YWlyZXNcbiAgICAgICAgPC9wPlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgdGV4dD1cIlNlIGNvbm5lY3RlclwiXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Q29ubmVjdGlvbk1vZGFsT3Blbih0cnVlKX1cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8Q29ubmVjdGlvbk1vZGFsXG4gICAgICAgIGlzVmlzaWJsZT17Y29ubmVjdGlvbk1vZGFsT3Blbn1cbiAgICAgICAgY2xvc2VNb2RhbD17KCkgPT4gc2V0Q29ubmVjdGlvbk1vZGFsT3BlbihmYWxzZSl9XG4gICAgICAvPlxuICAgIDwvPlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyB1c2VGZWVkYmFja0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vY29udGV4dHMvRmVlZGJhY2tDb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VNZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy91c2VyXCI7XG5pbXBvcnQgeyBDbG9zZUJ1dHRvbiB9IGZyb20gXCIuLi9hdG9tcy9idXR0b25zL0Nsb3NlQnV0dG9uXCI7XG5pbXBvcnQgeyBDb2xsYXBzZUJ1dHRvbiB9IGZyb20gXCIuLi9hdG9tcy9idXR0b25zL0NvbGxhcHNlQnV0dG9uXCI7XG5pbXBvcnQgeyBDb25uZWN0ZWRQYW5lbCB9IGZyb20gXCIuL0Nvbm5lY3RlZFBhbmVsXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uUGFuZWwgfSBmcm9tIFwiLi9Db25uZWN0aW9uUGFuZWxcIjtcblxuZXhwb3J0IGNvbnN0IFNpZGVCYXIgPSAoKSA9PiB7XG4gIGNvbnN0IFtpc0NvbGxhcHNlZCwgc2V0SXNDb2xsYXBzZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCB7IGRhdGE6IG1lIH0gPSB1c2VNZSgpO1xuXG4gIGNvbnN0IHsgaXNPcGVuLCBjbG9zZUZlZWRiYWNrT3ZlcmxheSB9ID0gdXNlRmVlZGJhY2tDb250ZXh0KCk7XG5cbiAgY29uc3QgaXNDb25uZWN0ZWQgPSAhIW1lO1xuXG4gIGlmICghaXNPcGVuKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKFxuICAgIDxkaXZcbiAgICAgIGlkPVwiZmVlZGJhY2stc2lkZWJhclwiXG4gICAgICBjbGFzc05hbWU9e2BmaXhlZCB0b3AtMCB0cmFuc2l0aW9uLWFsbCB3LVszMjBweF0gaC1zY3JlZW4gei1bMTAwMDAwMDBdIGJnLWdyYXktZmVlZGJhY2stODAwIHRleHQtd2hpdGUgcHgtMyBweS00ICR7XG4gICAgICAgIGlzQ29sbGFwc2VkID8gXCJyaWdodC1bLTMyMHB4XVwiIDogXCJyaWdodC0wXCJcbiAgICAgIH1gfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBoLWZ1bGwgdy1mdWxsICBpdGVtcy1jZW50ZXIgZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGltZyBzcmM9XCIvZmVlZGJhY2svbG9nby1mZWVkYmFjay1saWdodC5zdmdcIiBjbGFzc05hbWU9XCJ6LTEwXCIgLz5cbiAgICAgICAgICA8Q2xvc2VCdXR0b24gb25DbGljaz17Y2xvc2VGZWVkYmFja092ZXJsYXl9IHNpemU9XCJsYXJnZVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7aXNDb25uZWN0ZWQgPyA8Q29ubmVjdGVkUGFuZWwgLz4gOiA8Q29ubmVjdGlvblBhbmVsIC8+fVxuICAgICAgICA8Q29sbGFwc2VCdXR0b25cbiAgICAgICAgICBpc0NvbGxhcHNlZD17aXNDb2xsYXBzZWR9XG4gICAgICAgICAgc2V0SXNDb2xsYXBzZWQ9e3NldElzQ29sbGFwc2VkfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+LFxuICAgIGRvY3VtZW50LmJvZHlcbiAgKTtcbn07XG4iLCJpbXBvcnQgeyBRdWVyeUNsaWVudCwgUXVlcnlDbGllbnRQcm92aWRlciB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCB7IE9wZW5GZWVkYmFja0J1dHRvbiB9IGZyb20gXCIuL2NvbXBvbmVudHMvYXRvbXMvYnV0dG9ucy9PcGVuRmVlZGJhY2tCdXR0b25cIjtcbmltcG9ydCB7IEZlZWRiYWNrUGlucyB9IGZyb20gXCIuL2NvbXBvbmVudHMvbW9sZWN1bGVzL2ZlZWRiYWNrcy9ncm91cC9GZWVkYmFja1BpbnNcIjtcbmltcG9ydCB7IEZlZWRiYWNrSW5wdXQgfSBmcm9tIFwiLi9jb21wb25lbnRzL21vbGVjdWxlcy9mZWVkYmFja3MvaXRlbS9GZWVkYmFja0lucHV0XCI7XG5pbXBvcnQgeyBTaWRlQmFyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9vcmdhbmlzbXMvU2lkZUJhclwiO1xuaW1wb3J0IHsgRmVlZGJhY2tQcm92aWRlciB9IGZyb20gXCIuL2NvbnRleHRzL0ZlZWRiYWNrQ29udGV4dFwiO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbmltcG9ydCB0eXBlIHsgRmVlZGJhY2tSb290UHJvcHMgfSBmcm9tIFwiLi4vaW5kZXguZC50c1wiO1xuXG5jb25zdCBxdWVyeUNsaWVudCA9IG5ldyBRdWVyeUNsaWVudCgpO1xuXG5mdW5jdGlvbiBGZWVkYmFja1Jvb3QocHJvcHM6IEZlZWRiYWNrUm9vdFByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxRdWVyeUNsaWVudFByb3ZpZGVyIGNsaWVudD17cXVlcnlDbGllbnR9PlxuICAgICAgICA8RmVlZGJhY2tQcm92aWRlciB7Li4ucHJvcHN9PlxuICAgICAgICAgIDxGZWVkYmFja0lucHV0IC8+XG4gICAgICAgICAgPFNpZGVCYXIgLz5cbiAgICAgICAgICA8T3BlbkZlZWRiYWNrQnV0dG9uIC8+XG4gICAgICAgICAgPEZlZWRiYWNrUGlucyAvPlxuICAgICAgICA8L0ZlZWRiYWNrUHJvdmlkZXI+XG4gICAgICA8L1F1ZXJ5Q2xpZW50UHJvdmlkZXI+XG4gICAgPC8+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZlZWRiYWNrUm9vdDtcbiJdLCJuYW1lcyI6WyJheGlvcyIsInVzZVF1ZXJ5IiwidXNlUXVlcnlDbGllbnQiLCJ1c2VNdXRhdGlvbiIsImNyZWF0ZUNvbnRleHQiLCJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwiX2pzeCIsInVzZUNvbnRleHQiLCJfanN4cyIsInVzZVJlZiIsImZvcndhcmRSZWYiLCJjcmVhdGVQb3J0YWwiLCJfRnJhZ21lbnQiLCJRdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50UHJvdmlkZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FB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
|