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 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 ReactDOM = require('react-dom');
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 ReactDOM.createPortal(jsxRuntime.jsx("div", { ref: ref, style: {
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 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);
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.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Outlet, {}), 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, {})] })) })] }));
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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