@dereekb/dbx-form 9.25.12 → 9.25.14
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/calendar/lib/calendar.schedule.selection.store.d.ts +42 -26
- package/esm2020/calendar/lib/calendar.schedule.selection.popover.button.component.mjs +4 -2
- package/esm2020/calendar/lib/calendar.schedule.selection.store.mjs +109 -34
- package/esm2020/calendar/lib/calendar.schedule.selection.toggle.button.component.mjs +21 -19
- package/esm2020/lib/validator/field.mjs +1 -1
- package/fesm2015/dereekb-dbx-form-calendar.mjs +131 -55
- package/fesm2015/dereekb-dbx-form-calendar.mjs.map +1 -1
- package/fesm2015/dereekb-dbx-form.mjs.map +1 -1
- package/fesm2020/dereekb-dbx-form-calendar.mjs +133 -54
- package/fesm2020/dereekb-dbx-form-calendar.mjs.map +1 -1
- package/fesm2020/dereekb-dbx-form.mjs.map +1 -1
- package/lib/extension/calendar/_calendar.scss +1 -0
- package/lib/validator/field.d.ts +2 -2
- package/mapbox/package.json +4 -4
- package/package.json +4 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { dateCellDayOfWeekFactory, dateCellTimingDateFactory, dateCellScheduleDateFilter, copyDateCellScheduleDateFilterConfig, DateCellScheduleDayCode, dateCellScheduleEncodedWeek, dateCellTimingRelativeIndexFactory, expandDateCellScheduleDayCodes, expandDateCellScheduleDayCodesToDayOfWeekSet, findMaxDate, findMinDate, isDateInDateRangeFunction, isDateWithinDateCellRangeFunction, isSameDate, isSameDateDay, isSameDateRange, dateCellTimingRelativeIndexArrayFactory, isInfiniteDateRange, dateTimezoneUtcNormal, expandDateCellScheduleRange, formatToISO8601DayString, dateCellScheduleDayCodesAreSetsEquivalent, simplifyDateCellScheduleDayCodes, fullWeekDateCellScheduleDayCodes, dateCellTimingStartDateFactory, dateCellTimingStartsAtForStartOfDay, isSameDateCellScheduleDateRange, fullDateCellScheduleRange, dateCellTimingTimezoneNormalInstance, changeDateCellScheduleDateRangeToTimezone, SYSTEM_DATE_TIMEZONE_UTC_NORMAL_INSTANCE } from '@dereekb/date';
|
|
3
3
|
import { distinctUntilHasDifferentValues, filterMaybe } from '@dereekb/rxjs';
|
|
4
|
-
import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, range, unique, mergeArrays,
|
|
4
|
+
import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, range, unique, mergeArrays, mapValuesToSet, isInAllowedDaysOfWeekSet, firstValueFromIterable, isIterable, removeFromSet } from '@dereekb/util';
|
|
5
5
|
import { ComponentStore } from '@ngrx/component-store';
|
|
6
6
|
import { startOfDay, endOfDay, isBefore } from 'date-fns';
|
|
7
7
|
import { distinctUntilChanged, map, shareReplay, switchMap, tap, first, combineLatestWith, of } from 'rxjs';
|
|
@@ -15,6 +15,7 @@ export function initialCalendarScheduleSelectionState() {
|
|
|
15
15
|
const indexFactory = dateCellTimingRelativeIndexFactory(defaultStartsAt);
|
|
16
16
|
const indexDayOfWeek = dateCellDayOfWeekFactory(startsAt);
|
|
17
17
|
return {
|
|
18
|
+
selectionMode: 'multiple',
|
|
18
19
|
start: startsAt,
|
|
19
20
|
systemTimezone,
|
|
20
21
|
indexFactory,
|
|
@@ -77,6 +78,7 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
|
|
|
77
78
|
}))));
|
|
78
79
|
});
|
|
79
80
|
// MARK: Accessors
|
|
81
|
+
this.selectionMode$ = this.state$.pipe(map((x) => x.selectionMode), distinctUntilChanged(), shareReplay(1));
|
|
80
82
|
this.filter$ = this.state$.pipe(map((x) => x.filter), distinctUntilChanged(), shareReplay(1));
|
|
81
83
|
this.minMaxDateRange$ = this.state$.pipe(map(calendarScheduleMinAndMaxDateRange), distinctUntilChanged(isSameDateRange), shareReplay(1));
|
|
82
84
|
this.minDate$ = this.minMaxDateRange$.pipe(map((x) => x?.start), distinctUntilChanged(isSameDateDay), shareReplay(1));
|
|
@@ -174,15 +176,19 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
|
|
|
174
176
|
this.addSelectedDates = this.updater((state, add) => updateStateWithChangedDates(state, { add }));
|
|
175
177
|
this.removeSelectedDates = this.updater((state, remove) => updateStateWithChangedDates(state, { remove }));
|
|
176
178
|
this.setSelectedDates = this.updater((state, set) => updateStateWithChangedDates(state, { set }));
|
|
179
|
+
this.selectAllDates = this.updater((state, selectAll = 'all') => updateStateWithChangedDates(state, { selectAll }));
|
|
177
180
|
// NOTE: Selected indexes are the typical/expected indexes that are selected or not.
|
|
178
181
|
this.setSelectedIndexes = this.updater((state, set) => updateStateWithChangedDates(state, { set, invertSetBehavior: true }));
|
|
179
|
-
this.selectAllDates = this.updater((state, selectAll = 'all') => updateStateWithChangedDates(state, { selectAll }));
|
|
180
182
|
this.setInitialSelectionState = this.updater(updateStateWithInitialSelectionState);
|
|
181
183
|
this.setDefaultScheduleDays = this.updater(updateStateWithChangedDefaultScheduleDays);
|
|
182
184
|
this.setScheduleDays = this.updater(updateStateWithChangedScheduleDays);
|
|
183
185
|
this.setAllowAllScheduleDays = this.updater((state) => updateStateWithChangedScheduleDays(state, [DateCellScheduleDayCode.WEEKDAY, DateCellScheduleDayCode.WEEKEND]));
|
|
184
186
|
this.setDateScheduleRangeValue = this.updater((state, value) => updateStateWithDateCellScheduleRangeValue(state, value));
|
|
185
187
|
this.setCellContentFactory = this.updater((state, cellContentFactory) => ({ ...state, cellContentFactory }));
|
|
188
|
+
/**
|
|
189
|
+
* Sets the selection mode.
|
|
190
|
+
*/
|
|
191
|
+
this.setSelectionMode = this.updater(updateStateWithSelectionMode);
|
|
186
192
|
/**
|
|
187
193
|
* Used by the parent view to propogate a readonly state.
|
|
188
194
|
*
|
|
@@ -246,20 +252,22 @@ export function updateStateWithExclusions(state, inputExclusions) {
|
|
|
246
252
|
return updateStateWithFilter(state, state.filter);
|
|
247
253
|
}
|
|
248
254
|
export function updateStateWithMinMaxDateRange(state, minMaxDateRange) {
|
|
249
|
-
state = { ...state };
|
|
250
255
|
if (minMaxDateRange != null && !isInfiniteDateRange(minMaxDateRange)) {
|
|
251
|
-
state
|
|
252
|
-
|
|
253
|
-
|
|
256
|
+
state = {
|
|
257
|
+
...state,
|
|
258
|
+
minMaxDateRange: {
|
|
259
|
+
start: minMaxDateRange.start != null ? startOfDay(minMaxDateRange.start) : undefined,
|
|
260
|
+
end: minMaxDateRange.end != null ? endOfDay(minMaxDateRange.end) : undefined
|
|
261
|
+
}
|
|
254
262
|
};
|
|
255
263
|
}
|
|
256
264
|
else {
|
|
257
|
-
|
|
265
|
+
state = { ...state, minMaxDateRange: undefined };
|
|
258
266
|
}
|
|
259
267
|
return updateStateWithFilter(state, state.filter);
|
|
260
268
|
}
|
|
261
|
-
export function updateStateWithFilter(
|
|
262
|
-
const { computedExclusions: exclusions, minMaxDateRange, systemTimezone } =
|
|
269
|
+
export function updateStateWithFilter(currentState, inputFilter) {
|
|
270
|
+
const { computedExclusions: exclusions, minMaxDateRange, systemTimezone } = currentState;
|
|
263
271
|
let isEnabledFilterDay = () => true;
|
|
264
272
|
let filter = null;
|
|
265
273
|
// create the filter using inputFilter, exclusions, and minMaxDateRange
|
|
@@ -328,11 +336,11 @@ export function updateStateWithFilter(state, inputFilter) {
|
|
|
328
336
|
// use the current state's start, but make sure it is in the proper timezone.
|
|
329
337
|
if (enabledFilter.timezone) {
|
|
330
338
|
const timezoneNormal = dateTimezoneUtcNormal(enabledFilter.timezone);
|
|
331
|
-
finalEnabledStart = timezoneNormal.startOfDayInTargetTimezone(
|
|
339
|
+
finalEnabledStart = timezoneNormal.startOfDayInTargetTimezone(currentState.start); // get the start of the day for the current start
|
|
332
340
|
finalEnabledTimezone = enabledFilter.timezone;
|
|
333
341
|
}
|
|
334
342
|
else {
|
|
335
|
-
finalEnabledStart =
|
|
343
|
+
finalEnabledStart = currentState.start;
|
|
336
344
|
finalEnabledTimezone = systemTimezone;
|
|
337
345
|
}
|
|
338
346
|
}
|
|
@@ -350,7 +358,7 @@ export function updateStateWithFilter(state, inputFilter) {
|
|
|
350
358
|
// create the filter
|
|
351
359
|
isEnabledFilterDay = dateCellScheduleDateFilter(enabledFilter);
|
|
352
360
|
}
|
|
353
|
-
|
|
361
|
+
let nextState = { ...currentState, filter, isEnabledFilterDay };
|
|
354
362
|
// For the same reason as above, use the filter's start date as the relative start if applicable.
|
|
355
363
|
if (filter && filter.start) {
|
|
356
364
|
let startForSystemTimezone = filter.start;
|
|
@@ -358,20 +366,20 @@ export function updateStateWithFilter(state, inputFilter) {
|
|
|
358
366
|
const timezoneNormal = dateTimezoneUtcNormal(filter.timezone);
|
|
359
367
|
startForSystemTimezone = timezoneNormal.systemDateToTargetDate(filter.start); // get the start of the day for the system timezone
|
|
360
368
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
369
|
+
nextState.start = startForSystemTimezone;
|
|
370
|
+
nextState.indexFactory = dateCellTimingRelativeIndexFactory({ startsAt: startForSystemTimezone, timezone: systemTimezone });
|
|
371
|
+
nextState.indexDayOfWeek = dateCellDayOfWeekFactory(startForSystemTimezone);
|
|
364
372
|
}
|
|
365
373
|
// attempt to re-apply the initial selection state once filter is applied
|
|
366
|
-
if (
|
|
367
|
-
|
|
374
|
+
if (nextState.initialSelectionState) {
|
|
375
|
+
nextState = updateStateWithInitialSelectionState(nextState, nextState.initialSelectionState);
|
|
368
376
|
}
|
|
369
377
|
// re-calculate the selection given the filter
|
|
370
|
-
const { inputStart, inputEnd } =
|
|
378
|
+
const { inputStart, inputEnd } = nextState;
|
|
371
379
|
if (inputStart && inputEnd) {
|
|
372
|
-
|
|
380
|
+
nextState = updateStateWithChangedRange(nextState, { inputStart, inputEnd });
|
|
373
381
|
}
|
|
374
|
-
return
|
|
382
|
+
return nextState;
|
|
375
383
|
}
|
|
376
384
|
export function updateStateWithTimezoneValue(state, timezone) {
|
|
377
385
|
const { currentSelectionValue } = state;
|
|
@@ -464,6 +472,22 @@ export function updateStateWithChangedScheduleDays(state, change) {
|
|
|
464
472
|
return finalizeUpdateStateWithChangedScheduleDays(state, { ...state, scheduleDays: newScheduleDays ?? undefined });
|
|
465
473
|
}
|
|
466
474
|
}
|
|
475
|
+
export function updateStateWithSelectionMode(state, selectionMode) {
|
|
476
|
+
const { selectionMode: currentSelectionMode } = state;
|
|
477
|
+
if (currentSelectionMode !== selectionMode) {
|
|
478
|
+
const nextState = { ...state, selectionMode };
|
|
479
|
+
if (selectionMode === 'multiple') {
|
|
480
|
+
return nextState;
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
const currentSelectionRange = computeCalendarScheduleSelectionDateCellRange(nextState);
|
|
484
|
+
return currentSelectionRange ? updateStateWithChangedDates(nextState, { set: [currentSelectionRange.i], invertSetBehavior: true }) : nextState;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
return state;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
467
491
|
export function finalizeUpdateStateWithChangedScheduleDays(previousState, nextState) {
|
|
468
492
|
const previousScheduleDays = previousState.effectiveScheduleDays;
|
|
469
493
|
const nextScheduleDays = nextState.scheduleDays ?? nextState.defaultScheduleDays;
|
|
@@ -482,8 +506,8 @@ export function finalizeUpdateStateWithChangedScheduleDays(previousState, nextSt
|
|
|
482
506
|
}
|
|
483
507
|
}
|
|
484
508
|
export function updateStateWithChangedDates(state, change) {
|
|
485
|
-
const { allowedDaysOfWeek, indexFactory, indexDayOfWeek, inputStart: currentInputStart, inputEnd: currentInputEnd, minMaxDateRange, filter } = state;
|
|
486
|
-
const { start:
|
|
509
|
+
const { selectionMode, allowedDaysOfWeek, indexFactory, indexDayOfWeek, inputStart: currentInputStart, inputEnd: currentInputEnd, minMaxDateRange, filter } = state;
|
|
510
|
+
const { start: minDateFromFilter, end: maxDateFromFilter } = calendarScheduleMinAndMaxDateRangeRelativeToFilter(state);
|
|
487
511
|
let inputStart = currentInputStart;
|
|
488
512
|
let inputEnd = currentInputEnd;
|
|
489
513
|
/**
|
|
@@ -495,14 +519,39 @@ export function updateStateWithChangedDates(state, change) {
|
|
|
495
519
|
function asIndexes(indexes) {
|
|
496
520
|
return iterableToArray(indexes).map(indexFactory);
|
|
497
521
|
}
|
|
522
|
+
// When using selection mode "single" we update the change to reflect the single selection.
|
|
523
|
+
if (selectionMode === 'single') {
|
|
524
|
+
function setFromFirstValue(input) {
|
|
525
|
+
const firstValue = isIterable(input) ? firstValueFromIterable(input) : input;
|
|
526
|
+
const set = new Set();
|
|
527
|
+
if (firstValue != null) {
|
|
528
|
+
set.add(firstValue);
|
|
529
|
+
}
|
|
530
|
+
return set;
|
|
531
|
+
}
|
|
532
|
+
if (change.set) {
|
|
533
|
+
change = { set: setFromFirstValue(change.set), invertSetBehavior: true };
|
|
534
|
+
}
|
|
535
|
+
else if (change.toggle) {
|
|
536
|
+
const nextSet = setFromFirstValue(change.toggle);
|
|
537
|
+
if (nextSet.size) {
|
|
538
|
+
const firstSetValueIndex = indexFactory(firstValueFromIterable(nextSet));
|
|
539
|
+
if (state.toggledIndexes.has(firstSetValueIndex) || (inputStart && indexFactory(inputStart) === firstSetValueIndex)) {
|
|
540
|
+
nextSet.clear(); // clear with the next set
|
|
541
|
+
}
|
|
542
|
+
change = { set: nextSet, invertSetBehavior: true };
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
// set, selectAll, add, and remove are treated as they normally are.
|
|
546
|
+
}
|
|
498
547
|
if (change.reset || change.selectAll != null || change.set != null) {
|
|
499
548
|
let set = change.set ?? [];
|
|
500
549
|
const selectAll = change.reset === true ? state.initialSelectionState : change.selectAll;
|
|
501
550
|
switch (selectAll) {
|
|
502
551
|
case 'all':
|
|
503
|
-
if (
|
|
504
|
-
inputStart =
|
|
505
|
-
inputEnd =
|
|
552
|
+
if (minDateFromFilter != null && maxDateFromFilter != null) {
|
|
553
|
+
inputStart = minDateFromFilter;
|
|
554
|
+
inputEnd = maxDateFromFilter;
|
|
506
555
|
set = [];
|
|
507
556
|
}
|
|
508
557
|
break;
|
|
@@ -512,17 +561,43 @@ export function updateStateWithChangedDates(state, change) {
|
|
|
512
561
|
set = [];
|
|
513
562
|
break;
|
|
514
563
|
}
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
564
|
+
const inputSetIndexes = asIndexes(set);
|
|
565
|
+
toggledIndexes = new Set(inputSetIndexes);
|
|
566
|
+
if (change.invertSetBehavior && !selectAll) {
|
|
567
|
+
let minIndex;
|
|
568
|
+
let maxIndex;
|
|
569
|
+
if (minDateFromFilter != null && maxDateFromFilter != null) {
|
|
570
|
+
// only applicable when the filter is set.
|
|
571
|
+
minIndex = indexFactory(minDateFromFilter);
|
|
572
|
+
maxIndex = indexFactory(maxDateFromFilter);
|
|
573
|
+
inputStart = minDateFromFilter;
|
|
574
|
+
inputEnd = maxDateFromFilter;
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
// when the filter is not set, use the least and greatest indexes from the input set.
|
|
578
|
+
const minAndMax = minAndMaxNumber(inputSetIndexes);
|
|
579
|
+
if (minAndMax != null) {
|
|
580
|
+
minIndex = minAndMax.min;
|
|
581
|
+
maxIndex = minAndMax.max;
|
|
582
|
+
const dateFactory = dateCellTimingStartDateFactory(indexFactory._timing);
|
|
583
|
+
inputStart = dateFactory(minAndMax.min);
|
|
584
|
+
inputEnd = minAndMax.min === minAndMax.max ? inputStart : dateFactory(minAndMax.max);
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
// equivalent to an empty set / using "none" with selectAll.
|
|
588
|
+
inputStart = null;
|
|
589
|
+
inputEnd = null;
|
|
590
|
+
toggledIndexes = new Set();
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
// toggledIndexes should not include any indexes we want to include
|
|
594
|
+
if (minIndex != null && maxIndex != null) {
|
|
595
|
+
toggledIndexes = new Set(range(minIndex, maxIndex + 1).filter((x) => !toggledIndexes.has(x)));
|
|
596
|
+
}
|
|
522
597
|
}
|
|
523
598
|
}
|
|
524
599
|
else {
|
|
525
|
-
toggledIndexes = new Set(state.toggledIndexes);
|
|
600
|
+
toggledIndexes = new Set(state.toggledIndexes); // copy the set
|
|
526
601
|
if (change.toggle) {
|
|
527
602
|
const allowedToToggle = asIndexes(change.toggle).filter((i) => allowedDaysOfWeek.has(indexDayOfWeek(i)));
|
|
528
603
|
toggleInSet(toggledIndexes, allowedToToggle);
|
|
@@ -736,4 +811,4 @@ export function computeCalendarScheduleSelectionDateCellRange(state) {
|
|
|
736
811
|
return undefined;
|
|
737
812
|
}
|
|
738
813
|
}
|
|
739
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwsd0JBQXdCLEVBR3hCLHlCQUF5QixFQUV6QiwwQkFBMEIsRUFDMUIsb0NBQW9DLEVBRXBDLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFHM0Isa0NBQWtDLEVBQ2xDLDhCQUE4QixFQUM5Qiw0Q0FBNEMsRUFDNUMsV0FBVyxFQUNYLFdBQVcsRUFDWCx5QkFBeUIsRUFFekIsaUNBQWlDLEVBQ2pDLFVBQVUsRUFDVixhQUFhLEVBQ2IsZUFBZSxFQUVmLHVDQUF1QyxFQUN2QyxtQkFBbUIsRUFFbkIscUJBQXFCLEVBRXJCLDJCQUEyQixFQUczQix3QkFBd0IsRUFFeEIseUNBQXlDLEVBQ3pDLGdDQUFnQyxFQUNoQyxnQ0FBZ0MsRUFDaEMsOEJBQThCLEVBRTlCLG1DQUFtQyxFQUNuQywrQkFBK0IsRUFFL0IseUJBQXlCLEVBQ3pCLG9DQUFvQyxFQUNwQyx5Q0FBeUMsRUFFekMsd0NBQXdDLEVBQ3pDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUE0RCxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBWSxlQUFlLEVBQWEsS0FBSyxFQUFzQixNQUFNLEVBQUUsV0FBVyxFQUFnQixhQUFhLEVBQW9CLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuVixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVC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QUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0tBQ2pGO0lBRUQsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7UUFDMUMsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDO1FBQ2xDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUU5QixzQkFBc0I7UUFDdEIsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUN2QixRQUFRLEdBQUcsU0FBUyxDQUFDO1FBRXJCLDhJQUE4STtRQUM5SSxLQUFLLElBQUksQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEQsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzVDLFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsTUFBTTthQUNQO1NBQ0Y7UUFFRCxvQkFBb0I7UUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RELElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM1QyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLE1BQU07YUFDUDtTQUNGO0tBQ0Y7SUFFRCxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtRQUMxQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7S0FDeEM7U0FBTTtRQUNMLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIERhdGVDZWxsRGF5T2ZXZWVrRmFjdG9yeSxcbiAgZGF0ZUNlbGxEYXlPZldlZWtGYWN0b3J5LFxuICBEYXRlQ2VsbEluZGV4LFxuICBEYXRlQ2VsbFJhbmdlV2l0aFJhbmdlLFxuICBkYXRlQ2VsbFRpbWluZ0RhdGVGYWN0b3J5LFxuICBEYXRlUmFuZ2UsXG4gIGRhdGVDZWxsU2NoZWR1bGVEYXRlRmlsdGVyLFxuICBjb3B5RGF0ZUNlbGxTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcsXG4gIERhdGVDZWxsU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnLFxuICBEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZSxcbiAgZGF0ZUNlbGxTY2hlZHVsZUVuY29kZWRXZWVrLFxuICBEYXRlQ2VsbFNjaGVkdWxlRW5jb2RlZFdlZWssXG4gIERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnksXG4gIGRhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnksXG4gIGV4cGFuZERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlcyxcbiAgZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQsXG4gIGZpbmRNYXhEYXRlLFxuICBmaW5kTWluRGF0ZSxcbiAgaXNEYXRlSW5EYXRlUmFuZ2VGdW5jdGlvbixcbiAgSXNEYXRlV2l0aGluRGF0ZUNlbGxSYW5nZUZ1bmN0aW9uLFxuICBpc0RhdGVXaXRoaW5EYXRlQ2VsbFJhbmdlRnVuY3Rpb24sXG4gIGlzU2FtZURhdGUsXG4gIGlzU2FtZURhdGVEYXksXG4gIGlzU2FtZURhdGVSYW5nZSxcbiAgRGF0ZU9yRGF0ZVJhbmdlT3JEYXRlQ2VsbEluZGV4T3JEYXRlQ2VsbFJhbmdlLFxuICBkYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhBcnJheUZhY3RvcnksXG4gIGlzSW5maW5pdGVEYXRlUmFuZ2UsXG4gIGNvcHlIb3Vyc0FuZE1pbnV0ZXNGcm9tRGF0ZSxcbiAgZGF0ZVRpbWV6b25lVXRjTm9ybWFsLFxuICBEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZSxcbiAgZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZVJhbmdlLFxuICBEYXRlQ2VsbCxcbiAgRGF0ZUNlbGxEdXJhdGlvblNwYW4sXG4gIGZvcm1hdFRvSVNPODYwMURheVN0cmluZyxcbiAgRGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0LFxuICBkYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXNBcmVTZXRzRXF1aXZhbGVudCxcbiAgc2ltcGxpZnlEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXMsXG4gIGZ1bGxXZWVrRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzLFxuICBkYXRlQ2VsbFRpbWluZ1N0YXJ0RGF0ZUZhY3RvcnksXG4gIERhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2UsXG4gIGRhdGVDZWxsVGltaW5nU3RhcnRzQXRGb3JTdGFydE9mRGF5LFxuICBpc1NhbWVEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlLFxuICBGdWxsRGF0ZUNlbGxTY2hlZHVsZVJhbmdlSW5wdXREYXRlUmFuZ2UsXG4gIGZ1bGxEYXRlQ2VsbFNjaGVkdWxlUmFuZ2UsXG4gIGRhdGVDZWxsVGltaW5nVGltZXpvbmVOb3JtYWxJbnN0YW5jZSxcbiAgY2hhbmdlRGF0ZUNlbGxTY2hlZHVsZURhdGVSYW5nZVRvVGltZXpvbmUsXG4gIHVwZGF0ZURhdGVDZWxsVGltaW5nVG9TeXN0ZW1UaW1lem9uZSxcbiAgU1lTVEVNX0RBVEVfVElNRVpPTkVfVVRDX05PUk1BTF9JTlNUQU5DRVxufSBmcm9tICdAZGVyZWVrYi9kYXRlJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxIYXNEaWZmZXJlbnRWYWx1ZXMsIGZpbHRlck1heWJlIH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBNYXliZSwgVGltZXpvbmVTdHJpbmcsIERlY2lzaW9uRnVuY3Rpb24sIEl0ZXJhYmxlT3JWYWx1ZSwgaXRlcmFibGVUb0FycmF5LCBhZGRUb1NldCwgdG9nZ2xlSW5TZXQsIGlzSW5kZXhOdW1iZXJJbkluZGV4UmFuZ2VGdW5jdGlvbiwgTWF5YmVNYXAsIG1pbkFuZE1heE51bWJlciwgRGF5T2ZXZWVrLCByYW5nZSwgQWxsT3JOb25lU2VsZWN0aW9uLCB1bmlxdWUsIG1lcmdlQXJyYXlzLCBBcnJheU9yVmFsdWUsIHJlbW92ZUZyb21TZXQsIElTTzg2MDFEYXlTdHJpbmcsIG1hcFZhbHVlc1RvU2V0LCBpc0luQWxsb3dlZERheXNPZldlZWtTZXQgfSBmcm9tICdAZGVyZWVrYi91dGlsJztcbmltcG9ydCB7IENvbXBvbmVudFN0b3JlIH0gZnJvbSAnQG5ncngvY29tcG9uZW50LXN0b3JlJztcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIGVuZE9mRGF5LCBpc0JlZm9yZSB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCwgZmlyc3QsIGNvbWJpbmVMYXRlc3RXaXRoLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSwgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlLCBkZWZhdWx0Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSB9IGZyb20gJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2Uge1xuICAvKipcbiAgICogSW5wdXQgU3RhcnQgRGF0ZVxuICAgKi9cbiAgaW5wdXRTdGFydDogRGF0ZTtcbiAgLyoqXG4gICAqIElucHV0IEVuZCBEYXRlXG4gICAqL1xuICBpbnB1dEVuZDogRGF0ZTtcbn1cblxuZXhwb3J0IHR5cGUgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSA9IFBhcnRpYWw8TWF5YmVNYXA8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIGV4dGVuZHMgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSB7XG4gIC8qKlxuICAgKiBSZWFkb25seSBzdGF0ZSBvZiB0aGUgdmlldy5cbiAgICpcbiAgICogRG9lcyBub3QgYWZmZWN0IHN0YXRlIGNoYW5nZXMgZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIGFjdHMgYXMgYSBmbGFnIGZvciB0aGUgcGFyZW50IHZpZXcgdG8gc2V0IGFuZCB0aGUgY29uc3VtaW5nIHZpZXdzIHRvIHVwZGF0ZSBvbi5cbiAgICovXG4gIGlzVmlld1JlYWRvbmx5PzogTWF5YmU8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBTZXQgb2YgdGhlIGRheXMgb2Ygd2VlayB0aGF0IGFyZSBhbGxvd2VkIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBkZWZhdWx0U2NoZWR1bGVEYXlzOiBTZXQ8RGF0ZUNlbGxTY2hlZHVsZURheUNvZGU+O1xuICAvKipcbiAgICogRmlsdGVycyB0aGUgZGF5cyBvZiB0aGUgc2NoZWR1bGUgdG8gb25seSBhbGxvdyBzZWxlY3RpbmcgZGF5cyBpbiB0aGUgc2NoZWR1bGUuXG4gICAqXG4gICAqIFRoZSBvdXRwdXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzIGZpbHRlciwgYW5kIGluIGl0J3MgdGltZXpvbmUgdW5sZXNzIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyIGlzIGZhbHNlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgY29weSBvZiBhbnkgc2V0L2NvbmZpZ3VyZWQgaW5wdXQgZmlsdGVyIGFuZCB3aWxsIGhhdmUgYSBzdGFydCBkYXRlIHNldCBmcm9tIHN0YXJ0IG9yIHN0YXJ0c0F0LlxuICAgKi9cbiAgZmlsdGVyPzogTWF5YmU8RGF0ZUNlbGxTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc+O1xuICAvKipcbiAgICogQWRkaXRpb25hbCBleGNsdXNpb25zIHRoYXQgbWF5IG5vdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgaW5wdXRFeGNsdXNpb25zPzogTWF5YmU8QXJyYXlPclZhbHVlPERhdGVPckRhdGVSYW5nZU9yRGF0ZUNlbGxJbmRleE9yRGF0ZUNlbGxSYW5nZT4+O1xuICAvKipcbiAgICogVGhlIGNvbXB1dGVkIGV4Y2x1c2lvbnMgZ2l2ZW4gdGhlIGlucHV0IGV4Y2x1c2lvbnMuXG4gICAqL1xuICBjb21wdXRlZEV4Y2x1c2lvbnM/OiBNYXliZTxEYXRlQ2VsbEluZGV4W10+O1xuICAvKipcbiAgICogVGhlIG1pbi9tYXggZGF0ZSByYW5nZS4gVXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIG1pbi9tYXggdmFsdWUuIFdvcmtzIHdpdGggdGhlIGZpbHRlci4gVGhlIGdyZWF0ZXIvbGVzc2VyIG9mIHRoZSBzdGFydC9lbmQgZGF0ZXMgYXJlIHVzZWQgaWYgYm90aCBhcmUgcHJvdmlkZWQuXG4gICAqL1xuICBtaW5NYXhEYXRlUmFuZ2U/OiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+O1xuICAvKipcbiAgICogU3RhcnQgZGF0ZS4gSXMgdXBkYXRlZCBhcyB0aGUgaW5wdXRTdGFydCBpcyBtb2RpZmllZCBvciBmaWx0ZXIgaXMgcHJvdmlkZWQgdGhhdCBwcm92aWRlcyB0aGUgc3RhcnQgZGF0ZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdG9kYXkgYW5kIHRoZSBjdXJyZW50IHRpbWV6b25lLlxuICAgKi9cbiAgc3RhcnQ6IERhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2VbJ3N0YXJ0J107XG4gIC8qKlxuICAgKiBTeXN0ZW0gVGltZXpvbmUuIERvZXMgbm90IGNoYW5nZS5cbiAgICovXG4gIHN5c3RlbVRpbWV6b25lOiBUaW1lem9uZVN0cmluZztcbiAgLyoqXG4gICAqIFRpbWV6b25lIHRvIHVzZSB3aGVuIG91dHB1dHRpbmcgdGhlIHZhbHVlLiBPbmx5IGluZmx1ZW5jZXMgdGhlIG91dHB1dCBzdGFydCBkYXRlLlxuICAgKi9cbiAgb3V0cHV0VGltZXpvbmU/OiBNYXliZTxUaW1lem9uZVN0cmluZz47XG4gIC8qKlxuICAgKiBDdXJyZW50IHRpbWV6b25lIG5vcm1hbCB3aXRoIHRoZSBjdXJyZW50IHRpbWV6b25lLlxuICAgKi9cbiAgb3V0cHV0VGltZXpvbmVOb3JtYWw/OiBNYXliZTxEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZT47XG4gIC8qKlxuICAgKiBEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5XG4gICAqL1xuICBpbmRleEZhY3Rvcnk6IERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3Rvcnk7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBtYW51YWxseSBzZWxlY3RlZCBkYXRlcyB3aXRoaW4gdGhlIHBpY2tlZCByYW5nZS4gVGhpcyBpcyBOT1QgdGhlIHNldCBvZiBhbGwgc2VsZWN0ZWQgaW5kZXhlcyBpbiB0ZXJtcyBvZiBvdXRwdXQuXG4gICAqXG4gICAqIFZhbHVlcyB0aGF0IGV4aXN0IG91dHNpZGUgb2YgdGhlIFwiaW5wdXRcIiByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9uLCB3aGlsZSB0aG9zZVxuICAgKiB0aGF0IGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIHJhbmdlIGFyZSBjb25zaWRlcmVkIHRvZ2dsZWQgb2ZmLlxuICAgKlxuICAgKiBJZiBkYXRlcyBhcmUgc2VsZWN0ZWQsIGFuZCB0aGVuIGEgcmFuZ2UgaXMgc2VsZWN0ZWQsIHRoZW4gdGhvc2UgZGF0ZXMgd2l0aGluIHRoZSByYW5nZSB0aGF0IGZhbGxcbiAgICogd2l0aGluIHRoZSByYW5nZSBhcmUgY2xlYXJlZCBmcm9tIHNlbGVjdGlvbi5cbiAgICpcbiAgICogVGhlc2UgaW5kZXhlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGRhdGUuXG4gICAqL1xuICB0b2dnbGVkSW5kZXhlczogU2V0PERhdGVDZWxsSW5kZXg+O1xuICAvKipcbiAgICogRGF5cyBvZiB0aGUgc2NoZWR1bGUgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwaWNrZWQuIElmIG5vdCBkZWZpbmVkLCBkZWZhdWx0cyB0byBkZWZhdWx0U2NoZWR1bGVEYXlzLlxuICAgKi9cbiAgc2NoZWR1bGVEYXlzPzogTWF5YmU8U2V0PERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlPj47XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZSB2YWx1ZS5cbiAgICovXG4gIGVmZmVjdGl2ZVNjaGVkdWxlRGF5czogU2V0PERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlPjtcbiAgLyoqXG4gICAqIFNldCBvZiB0aGUgZGF5cyBvZiB3ZWVrIHRoYXQgYXJlIGFsbG93ZWQuIERlcml2ZWQgZnJvbSB0aGUgY3VycmVudCBzY2hlZHVsZSBkYXlzIHZhbHVlLlxuICAgKi9cbiAgYWxsb3dlZERheXNPZldlZWs6IFNldDxEYXlPZldlZWs+O1xuICAvKipcbiAgICpcbiAgICovXG4gIGluZGV4RGF5T2ZXZWVrOiBEYXRlQ2VsbERheU9mV2Vla0ZhY3Rvcnk7XG4gIC8qKlxuICAgKiBEZWNpc2lvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIGlzIGVuYWJsZWQgZ2l2ZW4gdGhlIGN1cnJlbnQgZmlsdGVyLlxuICAgKi9cbiAgaXNFbmFibGVkRmlsdGVyRGF5OiBEZWNpc2lvbkZ1bmN0aW9uPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD47XG4gIC8qKlxuICAgKiBEZWNpc2lvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSB0aGUgY3VycmVudCBmaWx0ZXIgaW50byBhY2NvdW50LlxuICAgKi9cbiAgaXNFbmFibGVkRGF5OiBEZWNpc2lvbkZ1bmN0aW9uPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD47XG4gIC8qKlxuICAgKiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5IGZvciB0aGUgdmlldy5cbiAgICovXG4gIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeTtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc2VsZWN0aW9uIHZhbHVlLlxuICAgKi9cbiAgY3VycmVudFNlbGVjdGlvblZhbHVlPzogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgZmlsdGVyIGFzIHRoZSBzdGFydCBhbmQgZW5kIHJhbmdlIGluc3RlYWQgb2Ygb3B0aW1pemluZyBmb3IgdGhlIGN1cnJlbnQgaW5kZXguXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcj86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgc2VsZWN0aW9uIHN0YXRlIHdoZW4gdGhlIGNhbGVuZGFyIGlzIHJlc2V0LlxuICAgKi9cbiAgaW5pdGlhbFNlbGVjdGlvblN0YXRlPzogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgZGVmYXVsdFNjaGVkdWxlRGF5cyA9IG5ldyBTZXQoW0RhdGVDZWxsU2NoZWR1bGVEYXlDb2RlLldFRUtEQVksIERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlLldFRUtFTkRdKTtcbiAgY29uc3QgYWxsb3dlZERheXNPZldlZWsgPSBleHBhbmREYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXNUb0RheU9mV2Vla1NldChkZWZhdWx0U2NoZWR1bGVEYXlzKTtcbiAgY29uc3QgZGVmYXVsdFN0YXJ0c0F0ID0gZGF0ZUNlbGxUaW1pbmdTdGFydHNBdEZvclN0YXJ0T2ZEYXkoKTsgLy8gZ2V0IG1pZG5pZ2h0IG9mIHRoZSBjdXJyZW50IHRpbWV6b25lXG4gIGNvbnN0IHsgc3RhcnRzQXQsIHRpbWV6b25lOiBzeXN0ZW1UaW1lem9uZSB9ID0gZGVmYXVsdFN0YXJ0c0F0O1xuICBjb25zdCBpbmRleEZhY3RvcnkgPSBkYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5KGRlZmF1bHRTdGFydHNBdCk7XG4gIGNvbnN0IGluZGV4RGF5T2ZXZWVrID0gZGF0ZUNlbGxEYXlPZldlZWtGYWN0b3J5KHN0YXJ0c0F0KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydHNBdCxcbiAgICBzeXN0ZW1UaW1lem9uZSxcbiAgICBpbmRleEZhY3RvcnksXG4gICAgdG9nZ2xlZEluZGV4ZXM6IG5ldyBTZXQoKSxcbiAgICBkZWZhdWx0U2NoZWR1bGVEYXlzLFxuICAgIGVmZmVjdGl2ZVNjaGVkdWxlRGF5czogZGVmYXVsdFNjaGVkdWxlRGF5cyxcbiAgICBhbGxvd2VkRGF5c09mV2VlayxcbiAgICBpbmRleERheU9mV2VlayxcbiAgICBpc0VuYWJsZWRGaWx0ZXJEYXk6ICgpID0+IHRydWUsXG4gICAgaXNFbmFibGVkRGF5OiAoKSA9PiBmYWxzZSxcbiAgICBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcjogdHJ1ZSxcbiAgICBjZWxsQ29udGVudEZhY3Rvcnk6IGRlZmF1bHRDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5XG4gIH07XG59XG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIGluIGNhc2VzIHdoZXJlIHRoZSBkYXRlcyBpbiB0aGUgbWluL21heCBkYXRlIHJhbmdlIG5lZWQgdG8gYmUgc2hpZnRlZCB0byB0aGUgZmlsdGVyJ3MgdGltZXpvbmUuXG4gKlxuICogVGhpcyBpcyBiZWNhdXNlIHRoZSBpbmRleCBmYWN0b3J5IGlzIGFsd2F5cyBpbiBzeXN0ZW0gdGltZXpvbmUsIGJ1dCB3aGVuIHNlbGVjdGluZyBhbGwvbm9uZSB3aXRoIGEgZmlsdGVyIHdlIG5lZWQgdG8gdXNlIHRoZSBmaWx0ZXIncyB0aW1lem9uZS5cbiAqXG4gKiBAcGFyYW0geFxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZVJlbGF0aXZlVG9GaWx0ZXIoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ21pbk1heERhdGVSYW5nZSc+KTogUGFydGlhbDxEYXRlUmFuZ2U+IHtcbiAgbGV0IGlucHV0OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4gPSB4O1xuXG4gIGlmICh4LmZpbHRlcj8udGltZXpvbmUgJiYgeC5taW5NYXhEYXRlUmFuZ2UgIT0gbnVsbCkge1xuICAgIGNvbnN0IGZpbHRlck5vcm1hbCA9IGRhdGVUaW1lem9uZVV0Y05vcm1hbCh4LmZpbHRlci50aW1lem9uZSk7XG4gICAgY29uc3QgdHJhbnNmb3JtRm4gPSBmaWx0ZXJOb3JtYWwudHJhbnNmb3JtRnVuY3Rpb24oJ3N5c3RlbURhdGVUb1RhcmdldERhdGUnKTtcblxuICAgIGlucHV0ID0ge1xuICAgICAgZmlsdGVyOiB4LmZpbHRlcixcbiAgICAgIG1pbk1heERhdGVSYW5nZToge1xuICAgICAgICBzdGFydDogeC5taW5NYXhEYXRlUmFuZ2Uuc3RhcnQgPyB0cmFuc2Zvcm1Gbih4Lm1pbk1heERhdGVSYW5nZS5zdGFydCkgOiB1bmRlZmluZWQsXG4gICAgICAgIGVuZDogeC5taW5NYXhEYXRlUmFuZ2UuZW5kID8gdHJhbnNmb3JtRm4oeC5taW5NYXhEYXRlUmFuZ2UuZW5kKSA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZShpbnB1dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlKHg6IFBpY2s8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCAnZmlsdGVyJyB8ICdtaW5NYXhEYXRlUmFuZ2UnPik6IFBhcnRpYWw8RGF0ZVJhbmdlPiB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGNhbGVuZGFyU2NoZWR1bGVNaW5EYXRlKHgpIHx8IHVuZGVmaW5lZCxcbiAgICBlbmQ6IGNhbGVuZGFyU2NoZWR1bGVNYXhEYXRlKHgpIHx8IHVuZGVmaW5lZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1pbkRhdGUoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ21pbk1heERhdGVSYW5nZSc+KTogTWF5YmU8RGF0ZT4ge1xuICByZXR1cm4gZmluZE1heERhdGUoW3guZmlsdGVyPy5zdGFydCwgeC5taW5NYXhEYXRlUmFuZ2U/LnN0YXJ0XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWF4RGF0ZSh4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4pOiBNYXliZTxEYXRlPiB7XG4gIHJldHVybiBmaW5kTWluRGF0ZShbeC5maWx0ZXI/LmVuZCwgeC5taW5NYXhEYXRlUmFuZ2U/LmVuZF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcih4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXInPikge1xuICByZXR1cm4geC5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciAmJiB4LmZpbHRlcj8uc3RhcnQgIT0gbnVsbDsgLy8gbWF5IGJlIHVzaW5nIGVpdGhlclxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlIGV4dGVuZHMgQ29tcG9uZW50U3RvcmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGluaXRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoKSk7XG4gIH1cblxuICAvLyBNQVJLOlxuICByZWFkb25seSB0b2dnbGVTZWxlY3Rpb24gPSB0aGlzLmVmZmVjdCgoaW5wdXQ6IE9ic2VydmFibGU8dm9pZD4pID0+IHtcbiAgICByZXR1cm4gaW5wdXQucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICB0aGlzLm5leHRUb2dnbGVTZWxlY3Rpb24kLnBpcGUoXG4gICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICBmaWx0ZXJNYXliZSgpLFxuICAgICAgICAgIHRhcCgoeCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxEYXRlcyh4KTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gTUFSSzogQWNjZXNzb3JzXG4gIHJlYWRvbmx5IGZpbHRlciQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5maWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBtaW5NYXhEYXRlUmFuZ2UkID0gdGhpcy5zdGF0ZSQucGlwZShtYXAoY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVSYW5nZSksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBtaW5EYXRlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uc3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG4gIHJlYWRvbmx5IG1heERhdGUkID0gdGhpcy5taW5NYXhEYXRlUmFuZ2UkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5lbmQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaGFzQ29uZmlndXJlZE1pbk1heFJhbmdlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geCAhPSBudWxsICYmIHguc3RhcnQgIT0gbnVsbCAmJiB4LmVuZCAhPSBudWxsKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRTdGFydCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pbnB1dFN0YXJ0KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlucHV0RW5kJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlucHV0RW5kKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRJbnB1dFJhbmdlJDogT2JzZXJ2YWJsZTxNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0pID0+ICh7IHN0YXJ0OiBpbnB1dFN0YXJ0LCBlbmQ6IGlucHV0RW5kIH0pKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gaXNTYW1lRGF0ZVJhbmdlKGEgYXMgRGF0ZVJhbmdlLCBiIGFzIERhdGVSYW5nZSkpLFxuICAgIG1hcCgoeCkgPT4gKHsgaW5wdXRTdGFydDogeC5zdGFydCwgaW5wdXRFbmQ6IHguZW5kIH0pKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4LmlucHV0U3RhcnQgJiYgeC5pbnB1dEVuZCkge1xuICAgICAgICByZXR1cm4geCBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZSQ6IE9ic2VydmFibGU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPiA9IHRoaXMuY3VycmVudElucHV0UmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gdmFsdWUuIFRoaXMgaXMgdGhlIHNldCBvZiBtYW51YWxseSB0b2dnZWQgb2ZmIGRhdGVzLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdXBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWREYXRlcyQ6IE9ic2VydmFibGU8U2V0PERhdGVDZWxsSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnRvZ2dsZWRJbmRleGVzKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRmlsdGVyRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0Pj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pc0VuYWJsZWRGaWx0ZXJEYXkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0VuYWJsZWREYXlGdW5jdGlvbiQ6IE9ic2VydmFibGU8RGVjaXNpb25GdW5jdGlvbjxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzRW5hYmxlZERheSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGVSYW5nZShhLCBiKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciQ6IE9ic2VydmFibGU8TWF5YmU8Ym9vbGVhbj4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyJDogT2JzZXJ2YWJsZTxNYXliZTxib29sZWFuPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIC8vXG4gICAgbWFwKGNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVSYW5nZT4gPSB0aGlzLmN1cnJlbnREYXRlUmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGFsbG93ZWREYXlzT2ZXZWVrJDogT2JzZXJ2YWJsZTxTZXQ8RGF5T2ZXZWVrPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5hbGxvd2VkRGF5c09mV2VlayksXG4gICAgZGlzdGluY3RVbnRpbEhhc0RpZmZlcmVudFZhbHVlcygpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNJbkFsbG93ZWREYXlzT2ZXZWVrRnVuY3Rpb24kID0gdGhpcy5hbGxvd2VkRGF5c09mV2VlayQucGlwZShcbiAgICBtYXAoKHgpID0+IGlzSW5BbGxvd2VkRGF5c09mV2Vla1NldCh4KSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzY2hlZHVsZURheXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguZWZmZWN0aXZlU2NoZWR1bGVEYXlzKSxcbiAgICBkaXN0aW5jdFVudGlsSGFzRGlmZmVyZW50VmFsdWVzKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBvdXRwdXRUaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Lm91dHB1dFRpbWV6b25lKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lem9uZSBvZiB0aGUgb3V0cHV0IHZhbHVlcy5cbiAgICpcbiAgICogSWYgYW4gb3V0cHV0VGltZXpvbmUgaXMgbm90IHNwZWNpZmllZCwgdGhpcyBkZWZhdWx0cyB0byB0aGUgc3lzdGVtIHRpbWV6b25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0aXZlT3V0cHV0VGltZXpvbmUkOiBPYnNlcnZhYmxlPFRpbWV6b25lU3RyaW5nPiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Lm91dHB1dFRpbWV6b25lIHx8IHguc3lzdGVtVGltZXpvbmUpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvKipcbiAgICogQW4gb3V0cHV0VGltZXpvbmVOb3JtYWwgdG8gdXNlLlxuICAgKlxuICAgKiBJZiBhbiBvdXRwdXRUaW1lem9uZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGlzIGlzIHVuZGVmaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZU91dHB1dFRpbWV6b25lTm9ybWFsJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4Lm91dHB1dFRpbWV6b25lTm9ybWFsID8geC5vdXRwdXRUaW1lem9uZU5vcm1hbCA6IHVuZGVmaW5lZCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY3VycmVudFNlbGVjdGlvblZhbHVlKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlU3RhcnQkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5kYXRlU2NoZWR1bGVSYW5nZS5zdGFydCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQ2VsbFRpbWluZ0RhdGVGYWN0b3J5JCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKHggPyBkYXRlQ2VsbFRpbWluZ0RhdGVGYWN0b3J5KHsgc3RhcnRzQXQ6IHguZGF0ZVNjaGVkdWxlUmFuZ2Uuc3RhcnQsIHRpbWV6b25lOiB4LmRhdGVTY2hlZHVsZVJhbmdlLnRpbWV6b25lIH0pIDogdW5kZWZpbmVkKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQ2VsbER1cmF0aW9uU3BhbkV4cGFuc2lvbiQ6IE9ic2VydmFibGU8RGF0ZUNlbGxEdXJhdGlvblNwYW48RGF0ZUNlbGw+W10+ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IGV4cGFuZERhdGVDZWxsU2NoZWR1bGVSYW5nZSh7IGRhdGVDZWxsU2NoZWR1bGVSYW5nZTogeC5kYXRlU2NoZWR1bGVSYW5nZSB9KSA6IFtdKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZVNlbGVjdGVkSW5kZXhlcyQ6IE9ic2VydmFibGU8U2V0PERhdGVDZWxsSW5kZXg+PiA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlRGF0ZUNlbGxEdXJhdGlvblNwYW5FeHBhbnNpb24kLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBuZXcgU2V0KHgubWFwKCh5KSA9PiB5LmkpKSksXG4gICAgZGlzdGluY3RVbnRpbEhhc0RpZmZlcmVudFZhbHVlcygpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVTZWxlY3RlZERhdGVzJDogT2JzZXJ2YWJsZTxTZXQ8SVNPODYwMURheVN0cmluZz4+ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQ2VsbFRpbWluZ0RhdGVGYWN0b3J5JC5waXBlKFxuICAgIHN3aXRjaE1hcCgoZGF0ZUZhY3RvcnkpID0+IHtcbiAgICAgIHJldHVybiBkYXRlRmFjdG9yeSA/IHRoaXMuc2VsZWN0aW9uVmFsdWVTZWxlY3RlZEluZGV4ZXMkLnBpcGUobWFwKCh4KSA9PiBtYXBWYWx1ZXNUb1NldCh4LCAoeSkgPT4gZm9ybWF0VG9JU084NjAxRGF5U3RyaW5nKGRhdGVGYWN0b3J5KHkpKSkpKSA6IG9mKG5ldyBTZXQ8SVNPODYwMURheVN0cmluZz4oKSk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZSQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMuZWZmZWN0aXZlT3V0cHV0VGltZXpvbmVOb3JtYWwkKSxcbiAgICBtYXAoKFt4LCB0aW1lem9uZU5vcm1hbF0pID0+IHtcbiAgICAgIGxldCBjdXJyZW50VmFsdWVXaXRoVGltZXpvbmUgPSB4O1xuXG4gICAgICBpZiAoeCAmJiB0aW1lem9uZU5vcm1hbCkge1xuICAgICAgICBjdXJyZW50VmFsdWVXaXRoVGltZXpvbmUgPSB7XG4gICAgICAgICAgZGF0ZVNjaGVkdWxlUmFuZ2U6IGNoYW5nZURhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2VUb1RpbWV6b25lKHguZGF0ZVNjaGVkdWxlUmFuZ2UsIHRpbWV6b25lTm9ybWFsKSxcbiAgICAgICAgICBtaW5NYXhSYW5nZTogeC5taW5NYXhSYW5nZVxuICAgICAgICB9IGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZVdpdGhUaW1lem9uZTtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lRGF0ZUNlbGxEdXJhdGlvblNwYW5FeHBhbnNpb24kOiBPYnNlcnZhYmxlPERhdGVDZWxsRHVyYXRpb25TcGFuPERhdGVDZWxsPltdPiA9IHRoaXMuc2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBleHBhbmREYXRlQ2VsbFNjaGVkdWxlUmFuZ2UoeyBkYXRlQ2VsbFNjaGVkdWxlUmFuZ2U6IHguZGF0ZVNjaGVkdWxlUmFuZ2UgfSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgbmV4dFRvZ2dsZVNlbGVjdGlvbiQ6IE9ic2VydmFibGU8TWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPj4gPSB0aGlzLmhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSkgPT4ge1xuICAgICAgbGV0IG9iczogT2JzZXJ2YWJsZTxNYXliZTxBbGxPck5vbmVTZWxlY3Rpb24+PjtcblxuICAgICAgaWYgKGhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSkge1xuICAgICAgICBvYnMgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShtYXAoKHgpID0+ICh4ID8gJ25vbmUnIDogJ2FsbCcpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYnMgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShtYXAoKHgpID0+ICh4ID8gJ25vbmUnIDogdW5kZWZpbmVkKSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JzO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudERhdGVDZWxsU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2UpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZUNlbGxTY2hlZHVsZVJhbmdlVmFsdWUkID0gdGhpcy5jdXJyZW50RGF0ZUNlbGxTY2hlZHVsZVJhbmdlVmFsdWUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGNlbGxDb250ZW50RmFjdG9yeSQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5jZWxsQ29udGVudEZhY3RvcnkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0N1c3RvbWl6ZWQkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHgudG9nZ2xlZEluZGV4ZXMuc2l6ZSA+IDApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc1ZpZXdSZWFkb25seSQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pc1ZpZXdSZWFkb25seSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8vIE1BUks6IFN0YXRlIENoYW5nZXNcbiAgcmVhZG9ubHkgc2V0TWluTWF4RGF0ZVJhbmdlID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aE1pbk1heERhdGVSYW5nZSk7XG4gIHJlYWRvbmx5IHNldERlZmF1bHRXZWVrID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aE1pbk1heERhdGVSYW5nZSk7XG4gIHJlYWRvbmx5IHNldEZpbHRlciA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIpO1xuICByZWFkb25seSBzZXRFeGNsdXNpb25zID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aEV4Y2x1c2lvbnMpO1xuICByZWFkb25seSBzZXRDb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhDb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcik7XG4gIHJlYWRvbmx5IGNsZWFyRmlsdGVyID0gdGhpcy51cGRhdGVyKChzdGF0ZSkgPT4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCB1bmRlZmluZWQpKTtcblxuICByZWFkb25seSBzZXRPdXRwdXRUaW1lem9uZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhUaW1lem9uZVZhbHVlKTtcbiAgLyoqXG4gICAqIFNldHMgdGhlIFwiaW5wdXRcIiBkYXRlIHJhbmdlLiBUaGlzIGlzIHRoZSByYW5nZSB0aGF0IGdldHMgZGlzcGxheWVkIG9uIHRoZSBkYXRlIHJhbmdlIHBpY2tlci5cbiAgICovXG4gIHJlYWRvbmx5IHNldElucHV0UmFuZ2UgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFJhbmdlKTtcblxuICAvLyBOT1RFOiBTZWxlY3RlZCBkYXRlcyBhcmUgTk9UIHNlbGVjdGVkIGluZGV4ZXMuIFRoZXkgYXJlIHRoZSBpbnRlcm5hbCBzZWxlY3RlZCBkYXRlcyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHRoZSBzZWxlY3Rpb24uXG4gIHJlYWRvbmx5IHRvZ2dsZVNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCB0b2dnbGU6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgdG9nZ2xlIH0pKTtcbiAgcmVhZG9ubHkgYWRkU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGFkZDogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBhZGQgfSkpO1xuICByZWFkb25seSByZW1vdmVTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgcmVtb3ZlOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHJlbW92ZSB9KSk7XG4gIHJlYWRvbmx5IHNldFNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzZXQ6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2V0IH0pKTtcblxuICAvLyBOT1RFOiBTZWxlY3RlZCBpbmRleGVzIGFyZSB0aGUgdHlwaWNhbC9leHBlY3RlZCBpbmRleGVzIHRoYXQgYXJlIHNlbGVjdGVkIG9yIG5vdC5cbiAgcmVhZG9ubHkgc2V0U2VsZWN0ZWRJbmRleGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2V0OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNldCwgaW52ZXJ0U2V0QmVoYXZpb3I6IHRydWUgfSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdEFsbERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2VsZWN0QWxsOiBBbGxPck5vbmVTZWxlY3Rpb24gPSAnYWxsJykgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNlbGVjdEFsbCB9KSk7XG4gIHJlYWRvbmx5IHNldEluaXRpYWxTZWxlY3Rpb25TdGF0ZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhJbml0aWFsU2VsZWN0aW9uU3RhdGUpO1xuXG4gIHJlYWRvbmx5IHNldERlZmF1bHRTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERlZmF1bHRTY2hlZHVsZURheXMpO1xuICByZWFkb25seSBzZXRTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyk7XG4gIHJlYWRvbmx5IHNldEFsbG93QWxsU2NoZWR1bGVEYXlzID0gdGhpcy51cGRhdGVyKChzdGF0ZSkgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhzdGF0ZSwgW0RhdGVDZWxsU2NoZWR1bGVEYXlDb2RlLldFRUtEQVksIERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlLldFRUtFTkRdKSk7XG5cbiAgcmVhZG9ubHkgc2V0RGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHZhbHVlOiBNYXliZTxGdWxsRGF0ZUNlbGxTY2hlZHVsZVJhbmdlSW5wdXREYXRlUmFuZ2U+KSA9PiB1cGRhdGVTdGF0ZVdpdGhEYXRlQ2VsbFNjaGVkdWxlUmFuZ2VWYWx1ZShzdGF0ZSwgdmFsdWUpKTtcbiAgcmVhZG9ubHkgc2V0Q2VsbENvbnRlbnRGYWN0b3J5ID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgY2VsbENvbnRlbnRGYWN0b3J5OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5KSA9PiAoeyAuLi5zdGF0ZSwgY2VsbENvbnRlbnRGYWN0b3J5IH0pKTtcblxuICAvKipcbiAgICogVXNlZCBieSB0aGUgcGFyZW50IHZpZXcgdG8gcHJvcG9nYXRlIGEgcmVhZG9ubHkgc3RhdGUuXG4gICAqXG4gICAqIFNob3VsZCB0eXBpY2FsbHkgbm90IGJlIHVzZWQgYnkgdGhlIHVzZXIgZGlyZWN0bHkgd2l0aCB0aGUgaW50ZW50aW9uIG9mIHRoZSBwYXJlbnQgc3luY2hyb25pemluZyB0byB0aGlzIHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0Vmlld1JlYWRvbmx5U3RhdGUgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBpc1ZpZXdSZWFkb25seTogYm9vbGVhbikgPT4gKHsgLi4uc3RhdGUsIGlzVmlld1JlYWRvbmx5IH0pKTtcblxuICAvLyBNQVJLOiBDb21wYXRcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZXRPdXRwdXRUaW1lem9uZSBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0VGltZXpvbmUgPSB0aGlzLnNldE91dHB1dFRpbWV6b25lO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugb3VwdXRUaW1lem9uZSRcbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRUaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMub3V0cHV0VGltZXpvbmUkO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZWZmZWN0aXZlT3VwdXRUaW1lem9uZSRcbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZVRpbWV6b25lJDogT2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+ID0gdGhpcy5lZmZlY3RpdmVPdXRwdXRUaW1lem9uZSQ7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBlZmZlY3RpdmVPdXB1dFRpbWV6b25lTm9ybWFsJFxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0aXZlVGltZXpvbmVOb3JtYWwkID0gdGhpcy5lZmZlY3RpdmVPdXRwdXRUaW1lem9uZU5vcm1hbCQ7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBjdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQ2VsbER1cmF0aW9uU3BhbkV4cGFuc2lvbiRcbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZURhdGVCbG9ja0R1cmF0aW9uU3BhbiQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZURhdGVDZWxsRHVyYXRpb25TcGFuRXhwYW5zaW9uJDtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lRGF0ZUNlbGxEdXJhdGlvblNwYW5FeHBhbnNpb24kXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZURhdGVCbG9ja0R1cmF0aW9uU3BhbiQgPSB0aGlzLnNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lRGF0ZUNlbGxEdXJhdGlvblNwYW5FeHBhbnNpb24kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoSW5pdGlhbFNlbGVjdGlvblN0YXRlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGluaXRpYWxTZWxlY3Rpb25TdGF0ZTogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgdG9nZ2xlZEluZGV4ZXMgfSA9IHN0YXRlO1xuXG4gIGlmICh0b2dnbGVkSW5kZXhlcy5zaXplID09PSAwICYmIGluaXRpYWxTZWxlY3Rpb25TdGF0ZSA9PT0gJ2FsbCcpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBzZWxlY3RBbGw6IGluaXRpYWxTZWxlY3Rpb25TdGF0ZSB9KTtcbiAgfVxuXG4gIHJldHVybiB7IC4uLnN0YXRlLCBpbml0aWFsU2VsZWN0aW9uU3RhdGUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKGN1cnJlbnRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcjogTWF5YmU8Ym9vbGVhbj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBsZXQgc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSA9IHsgLi4uY3VycmVudFN0YXRlLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciB9O1xuXG4gIGlmIChCb29sZWFuKGN1cnJlbnRTdGF0ZS5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcikgIT09IEJvb2xlYW4oY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHt9KTsgLy8gcmVjYWxjdWxhdGUgaWYgY2hhbmdlIG9jY3VycyBhcyBpdCB3aWxsIGFmZmVjdCB0aGUgb3V0cHV0IHZhbHVlXG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhFeGNsdXNpb25zKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGlucHV0RXhjbHVzaW9uczogTWF5YmU8QXJyYXlPclZhbHVlPERhdGVPckRhdGVSYW5nZU9yRGF0ZUNlbGxJbmRleE9yRGF0ZUNlbGxSYW5nZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbGV0IGNvbXB1dGVkRXhjbHVzaW9uczogTWF5YmU8RGF0ZUNlbGxJbmRleFtdPjtcblxuICBpZiAoaW5wdXRFeGNsdXNpb25zKSB7XG4gICAgY29uc3QgeyBpbmRleEZhY3RvcnkgfSA9IHN0YXRlO1xuICAgIGNvbnN0IGluZGV4QXJyYXlGYWN0b3J5ID0gZGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4QXJyYXlGYWN0b3J5KGluZGV4RmFjdG9yeSk7XG4gICAgY29tcHV0ZWRFeGNsdXNpb25zID0gaW5kZXhBcnJheUZhY3RvcnkoaW5wdXRFeGNsdXNpb25zKTtcbiAgfVxuXG4gIHN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRFeGNsdXNpb25zLCBjb21wdXRlZEV4Y2x1c2lvbnMgfTtcbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZSwgc3RhdGUuZmlsdGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aE1pbk1heERhdGVSYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBtaW5NYXhEYXRlUmFuZ2U6IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBzdGF0ZSA9IHsgLi4uc3RhdGUgfTtcblxuICBpZiAobWluTWF4RGF0ZVJhbmdlICE9IG51bGwgJiYgIWlzSW5maW5pdGVEYXRlUmFuZ2UobWluTWF4RGF0ZVJhbmdlKSkge1xuICAgIHN0YXRlLm1pbk1heERhdGVSYW5nZSA9IHtcbiAgICAgIHN0YXJ0OiBtaW5NYXhEYXRlUmFuZ2Uuc3RhcnQgIT0gbnVsbCA/IHN0YXJ0T2ZEYXkobWluTWF4RGF0ZVJhbmdlLnN0YXJ0KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVuZDogbWluTWF4RGF0ZVJhbmdlLmVuZCAhPSBudWxsID8gZW5kT2ZEYXkobWluTWF4RGF0ZVJhbmdlLmVuZCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBzdGF0ZS5taW5NYXhEYXRlUmFuZ2U7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCBzdGF0ZS5maWx0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGlucHV0RmlsdGVyOiBNYXliZTxEYXRlQ2VsbFNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGNvbXB1dGVkRXhjbHVzaW9uczogZXhjbHVzaW9ucywgbWluTWF4RGF0ZVJhbmdlLCBzeXN0ZW1UaW1lem9uZSB9ID0gc3RhdGU7XG5cbiAgbGV0IGlzRW5hYmxlZEZpbHRlckRheTogTWF5YmU8RGVjaXNpb25GdW5jdGlvbjxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+PiA9ICgpID0+IHRydWU7XG4gIGxldCBmaWx0ZXI6IE1heWJlPERhdGVDZWxsU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPiA9IG51bGw7XG5cbiAgLy8gY3JlYXRlIHRoZSBmaWx0ZXIgdXNpbmcgaW5wdXRGaWx0ZXIsIGV4Y2x1c2lvbnMsIGFuZCBtaW5NYXhEYXRlUmFuZ2VcbiAgaWYgKGlucHV0RmlsdGVyIHx8IGV4Y2x1c2lvbnM/Lmxlbmd0aCB8fCBtaW5NYXhEYXRlUmFuZ2UpIHtcbiAgICBsZXQgZW5hYmxlZEZpbHRlcjogRGF0ZUNlbGxTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc7XG4gICAgbGV0IGZpbHRlclN0YXJ0OiBNYXliZTxEYXRlPiA9IG51bGw7IC8vIHRoZSBzdGFydCBkYXRlIHRoYXQgd2lsbCBiZSB1c2VkL3NldCBvbiB0aGUgZmlsdGVyLlxuXG4gICAgaWYgKGlucHV0RmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSBjb3B5RGF0ZUNlbGxTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcoaW5wdXRGaWx0ZXIpOyAvLyBjb3B5IGZpbHRlclxuXG4gICAgICBsZXQgbmV4dEZpbHRlclRpbWV6b25lOiBUaW1lem9uZVN0cmluZyB8IHVuZGVmaW5lZDsgLy8gb25seSBzZXQgaWYgaW5wdXRGaWx0ZXIuc3RhcnQgb3IgaW5wdXRGaWx0ZXIuc3RhcnRzQXRcblxuICAgICAgLy8gY29uZmlndXJlIGZpbHRlciBzdGFydFxuICAgICAgaWYgKGlucHV0RmlsdGVyLnN0YXJ0KSB7XG4gICAgICAgIGZpbHRlclN0YXJ0ID0gaW5wdXRGaWx0ZXIuc3RhcnQ7XG5cbiAgICAgICAgLy8gaWYgbm8gdGltZXpvbmUgaXMgc3BlY2lmaWVkLCB0aGVuIHVzZSB0aGUgc3lzdGVtIHRpbWV6b25lIGFuZCBhbGlnbiBmaWx0ZXJTdGFydCB0byB0aGUgc3RhcnQgb2YgdGhlIGRheS5cbiAgICAgICAgaWYgKCFpbnB1dEZpbHRlci50aW1lem9uZSkge1xuICAgICAgICAgIGZpbHRlclN0YXJ0ID0gU1lTVEVNX0RBVEVfVElNRVpPTkVfVVRDX05PUk1BTF9JTlNUQU5DRS5zdGFydE9mRGF5SW5UYXJnZXRUaW1lem9uZShpbnB1dEZpbHRlci5zdGFydHNBdCk7XG4gICAgICAgICAgbmV4dEZpbHRlclRpbWV6b25lID0gc3lzdGVtVGltZXpvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dEZpbHRlclRpbWV6b25lID0gaW5wdXRGaWx0ZXIudGltZXpvbmU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaW5wdXRGaWx0ZXIuc3RhcnRzQXQpIHtcbiAgICAgICAgaWYgKGlucHV0RmlsdGVyLnRpbWV6b25lKSB7XG4gICAgICAgICAgLy8gaWYgbm8gdGltZXpvbmUgaXMgcHJvdmlkZWQsIHVzZSBzdGFydHNBdCBhcy1pc1xuICAgICAgICAgIGNvbnN0IHRpbWV6b25lTm9ybWFsID0gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKGlucHV0RmlsdGVyLnRpbWV6b25lKTtcbiAgICAgICAgICBmaWx0ZXJTdGFydCA9IHRpbWV6b25lTm9ybWFsLnN0YXJ0T2ZEYXlJblRhcmdldFRpbWV6b25lKGlucHV0RmlsdGVyLnN0YXJ0c0F0KTtcbiAgICAgICAgICBuZXh0RmlsdGVyVGltZXpvbmUgPSBpbnB1dEZpbHRlci50aW1lem9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRvZGF5IGluIHRoZSBzeXN0ZW0gdGltZXpvbmUuXG4gICAgICAgICAgZmlsdGVyU3RhcnQgPSBTWVNURU1fREFURV9USU1FWk9ORV9VVENfTk9STUFMX0lOU1RBTkNFLnN0YXJ0T2ZEYXlJblRhcmdldFRpbWV6b25lKGlucHV0RmlsdGVyLnN0YXJ0c0F0KTtcbiAgICAgICAgICBuZXh0RmlsdGVyVGltZXpvbmUgPSBzeXN0ZW1UaW1lem9uZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWx0ZXIuc3RhcnQgPSBmaWx0ZXJTdGFydCA/PyB1bmRlZmluZWQ7XG4gICAgICBmaWx0ZXIudGltZXpvbmUgPSBuZXh0RmlsdGVyVGltZXpvbmU7XG5cbiAgICAgIC8vIGNvbmZpZ3VyZSBleGNsdXNpb25zXG4gICAgICBpZiAoZXhjbHVzaW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGVuYWJsZWRGaWx0ZXIgPSB7XG4gICAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICAgIGV4OiB1bmlxdWUobWVyZ2VBcnJheXMoW2ZpbHRlci5leCwgZXhjbHVzaW9uc10pKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5hYmxlZEZpbHRlciA9IGZpbHRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW5hYmxlZEZpbHRlciA9IHtcbiAgICAgICAgdzogJzg5JyxcbiAgICAgICAgZXg6IGV4Y2x1c2lvbnMgYXMgbnVtYmVyW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1pbk1heERhdGVSYW5nZSkge1xuICAgICAgZW5hYmxlZEZpbHRlci5taW5NYXhEYXRlUmFuZ2UgPSBtaW5NYXhEYXRlUmFuZ2U7XG4gICAgICBlbmFibGVkRmlsdGVyLnNldFN0YXJ0QXNNaW5EYXRlID0gZmlsdGVyU3RhcnQgPyB0cnVlIDogZmFsc2U7IC8vIElmIGEgc3RhcnQgZGF0ZSBpcyBzZXQsIHRoZW4gaXQgYmVjb21lcyB0aGUgZmxvb3IuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIGlucHV0IGZpbHRlciBoYXMgYSBzdGFydCBkYXRlLCB1c2UgdGhhdCBhcyB0aGUgcmVsYXRpdmUgc3RhcnQgdG8gZW5zdXJlIGluZGV4ZXMgYXJlIGNvbXBhcmVkIHRoZSBzYW1lLFxuICAgICAqIG90aGVyd2lzZSB1c2UgdGhlIHN0YXRlJ3Mgc3RhcnQuIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0aGUgaW5kZXggY2FsY3VsYXRpb25zLlxuICAgICAqL1xuICAgIGxldCBmaW5hbEVuYWJsZWRTdGFydDogRGF0ZTtcbiAgICBsZXQgZmluYWxFbmFibGVkVGltZXpvbmU6IFRpbWV6b25lU3RyaW5nO1xuICAgIC8vICBmaWx0ZXI/LnN0YXJ0ID8/IHN0YXRlLnN0YXJ0O1xuXG4gICAgaWYgKCFlbmFibGVkRmlsdGVyLnN0YXJ0KSB7XG4gICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgc3RhdGUncyBzdGFydCwgYnV0IG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgcHJvcGVyIHRpbWV6b25lLlxuICAgICAgaWYgKGVuYWJsZWRGaWx0ZXIudGltZXpvbmUpIHtcbiAgICAgICAgY29uc3QgdGltZXpvbmVOb3JtYWwgPSBkYXRlVGltZXpvbmVVdGNOb3JtYWwoZW5hYmxlZEZpbHRlci50aW1lem9uZSk7XG4gICAgICAgIGZpbmFsRW5hYmxlZFN0YXJ0ID0gdGltZXpvbmVOb3JtYWwuc3RhcnRPZkRheUluVGFyZ2V0VGltZXpvbmUoc3RhdGUuc3RhcnQpOyAvLyBnZXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXkgZm9yIHRoZSBjdXJyZW50IHN0YXJ0XG4gICAgICAgIGZpbmFsRW5hYmxlZFRpbWV6b25lID0gZW5hYmxlZEZpbHRlci50aW1lem9uZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFsRW5hYmxlZFN0YXJ0ID0gc3RhdGUuc3RhcnQ7XG4gICAgICAgIGZpbmFsRW5hYmxlZFRpbWV6b25lID0gc3lzdGVtVGltZXpvbmU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghZW5hYmxlZEZpbHRlci50aW1lem9uZSkge1xuICAgICAgZmluYWxFbmFibGVkVGltZXpvbmUgPSBzeXN0ZW1UaW1lem9uZTtcblxuICAgICAgY29uc3QgdGltZXpvbmVOb3JtYWwgPSBkYXRlVGltZXpvbmVVdGNOb3JtYWwoZmluYWxFbmFibGVkVGltZXpvbmUpO1xuICAgICAgZmluYWxFbmFibGVkU3RhcnQgPSB0aW1lem9uZU5vcm1hbC5zdGFydE9mRGF5SW5UYXJnZXRUaW1lem9uZShlbmFibGVkRmlsdGVyLnN0YXJ0KTsgLy8gZ2V0IHRoZSBzdGFydCBvZiB0aGUgZGF5IGZvciB0aGUgdGFyZ2V0IHRpbWV6b25lXG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmFsRW5hYmxlZFN0YXJ0ID0gZW5hYmxlZEZpbHRlci5zdGFydDtcbiAgICAgIGZpbmFsRW5hYmxlZFRpbWV6b25lID0gZW5hYmxlZEZpbHRlci50aW1lem9uZTtcbiAgICB9XG5cbiAgICBlbmFibGVkRmlsdGVyLnN0YXJ0ID0gZmluYWxFbmFibGVkU3RhcnQ7XG4gICAgZW5hYmxlZEZpbHRlci50aW1lem9uZSA9IGZpbmFsRW5hYmxlZFRpbWV6b25lO1xuXG4gICAgLy8gY3JlYXRlIHRoZSBmaWx0ZXJcbiAgICBpc0VuYWJsZWRGaWx0ZXJEYXkgPSBkYXRlQ2VsbFNjaGVkdWxlRGF0ZUZpbHRlcihlbmFibGVkRmlsdGVyKTtcbiAgfVxuXG4gIHN0YXRlID0geyAuLi5zdGF0ZSwgZmlsdGVyLCBpc0VuYWJsZWRGaWx0ZXJEYXkgfTtcblxuICAvLyBGb3IgdGhlIHNhbWUgcmVhc29uIGFzIGFib3ZlLCB1c2UgdGhlIGZpbHRlcidzIHN0YXJ0IGRhdGUgYXMgdGhlIHJlbGF0aXZlIHN0YXJ0IGlmIGFwcGxpY2FibGUuXG4gIGlmIChmaWx0ZXIgJiYgZmlsdGVyLnN0YXJ0KSB7XG4gICAgbGV0IHN0YXJ0Rm9yU3lzdGVtVGltZXpvbmU6IERhdGUgPSBmaWx0ZXIuc3RhcnQ7XG5cbiAgICBpZiAoZmlsdGVyLnRpbWV6b25lKSB7XG4gICAgICBjb25zdCB0aW1lem9uZU5vcm1hbCA9IGRhdGVUaW1lem9uZVV0Y05vcm1hbChmaWx0ZXIudGltZXpvbmUpO1xuICAgICAgc3RhcnRGb3JTeXN0ZW1UaW1lem9uZSA9IHRpbWV6b25lTm9ybWFsLnN5c3RlbURhdGVUb1RhcmdldERhdGUoZmlsdGVyLnN0YXJ0KTsgLy8gZ2V0IHRoZSBzdGFydCBvZiB0aGUgZGF5IGZvciB0aGUgc3lzdGVtIHRpbWV6b25lXG4gICAgfVxuXG4gICAgc3RhdGUuc3RhcnQgPSBzdGFydEZvclN5c3RlbVRpbWV6b25lO1xuICAgIHN0YXRlLmluZGV4RmFjdG9yeSA9IGRhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnkoeyBzdGFydHNBdDogc3RhcnRGb3JTeXN0ZW1UaW1lem9uZSwgdGltZXpvbmU6IHN5c3RlbVRpbWV6b25lIH0pO1xuICAgIHN0YXRlLmluZGV4RGF5T2ZXZWVrID0gZGF0ZUNlbGxEYXlPZldlZWtGYWN0b3J5KHN0YXJ0Rm9yU3lzdGVtVGltZXpvbmUpO1xuICB9XG5cbiAgLy8gYXR0ZW1wdCB0byByZS1hcHBseSB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gc3RhdGUgb25jZSBmaWx0ZXIgaXMgYXBwbGllZFxuICBpZiAoc3RhdGUuaW5pdGlhbFNlbGVjdGlvblN0YXRlKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhJbml0aWFsU2VsZWN0aW9uU3RhdGUoc3RhdGUsIHN0YXRlLmluaXRpYWxTZWxlY3Rpb25TdGF0ZSk7XG4gIH1cblxuICAvLyByZS1jYWxjdWxhdGUgdGhlIHNlbGVjdGlvbiBnaXZlbiB0aGUgZmlsdGVyXG4gIGNvbnN0IHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSA9IHN0YXRlO1xuXG4gIGlmIChpbnB1dFN0YXJ0ICYmIGlucHV0RW5kKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkUmFuZ2Uoc3RhdGUsIHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhUaW1lem9uZVZhbHVlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIHRpbWV6b25lOiBNYXliZTxUaW1lem9uZVN0cmluZz4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZSB9ID0gc3RhdGU7XG4gIGNvbnN0IHRpbWV6b25lTm9ybWFsID0gdGltZXpvbmUgPyBkYXRlVGltZXpvbmVVdGNOb3JtYWwoeyB0aW1lem9uZSB9KSA6IHVuZGVmaW5lZDtcblxuICBpZiAodGltZXpvbmVOb3JtYWwgJiYgY3VycmVudFNlbGVjdGlvblZhbHVlKSB7XG4gICAgLy8gdXBkYXRlIHRoZSBzZWxlY3Rpb24gdmFsdWUgdG8gcmVmbGVjdCB0aGUgdGltZXpvbmUgY2hhbmdlcy5cbiAgICBjb25zdCB7IGRhdGVTY2hlZHVsZVJhbmdlOiBjdXJyZW50RGF0ZUNlbGxTY2hlZHVsZVJhbmdlIH0gPSBjdXJyZW50U2VsZWN0aW9uVmFsdWU7XG4gICAgY29uc3Qgc3RhcnQgPSB0aW1lem9uZU5vcm1hbC50YXJnZXREYXRlVG9TeXN0ZW1EYXRlKGN1cnJlbnREYXRlQ2VsbFNjaGVkdWxlUmFuZ2Uuc3RhcnQpO1xuICAgIGNvbnN0IGVuZCA9IHRpbWV6b25lTm9ybWFsLnRhcmdldERhdGVUb1N5c3RlbURhdGUoY3VycmVudERhdGVDZWxsU2NoZWR1bGVSYW5nZS5lbmQpO1xuXG4gICAgY29uc3QgbmV3UmFuZ2U6IERhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2UgPSB7XG4gICAgICAuLi5jdXJyZW50U2VsZWN0aW9uVmFsdWUuZGF0ZVNjaGVkdWxlUmFuZ2UsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZFxuICAgIH07XG5cbiAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRGF0ZUNlbGxTY2hlZHVsZVJhbmdlVmFsdWUoeyAuLi5zdGF0ZSwgb3V0cHV0VGltZXpvbmU6IHRpbWV6b25lLCBvdXRwdXRUaW1lem9uZU5vcm1hbDogdGltZXpvbmVOb3JtYWwgfSwgbmV3UmFuZ2UpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IC4uLnN0YXRlLCBvdXRwdXRUaW1lem9uZTogdGltZXpvbmUsIG91dHB1dFRpbWV6b25lTm9ybWFsOiB0aW1lem9uZU5vcm1hbCB9OyAvLyBubyBjaGFuZ2UgaW4gdmFsdWVcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRGF0ZUNlbGxTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgaW5wdXRDaGFuZ2U6IE1heWJlPEZ1bGxEYXRlQ2VsbFNjaGVkdWxlUmFuZ2VJbnB1dERhdGVSYW5nZT4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZSwgc3lzdGVtVGltZXpvbmUgfSA9IHN0YXRlO1xuICBjb25zdCBjdXJyZW50RGF0ZUNlbGxTY2hlZHVsZVJhbmdlID0gY3VycmVudFNlbGVjdGlvblZhbHVlPy5kYXRlU2NoZWR1bGVSYW5nZTsgLy8gY3VycmVudCByYW5nZSBpcyBhbHdheXMgaW4gc3lzdGVtIHRpbWVcbiAgbGV0IGNoYW5nZTogTWF5YmU8UGljazxEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlLCAnc3RhcnQnIHwgJ2VuZCcgfCAnZXgnIHwgJ3cnIHwgJ3RpbWV6b25lJz4+O1xuXG4gIC8vIFdoZW4gdXNpbmcgdGltZXpvbmVzLCBhbHdheXMgcmV0dXJuIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkYXkuIElucHV0cyBhcmUgY29udmVydGVkIHRvIHRoZSBzeXN0ZW0gdGltZSBhbmQgdXNlZCBhcyB0aGUgc3RhcnQgb2YgdGhlIGRheS5cbiAgLy8gT3V0cHV0cyByZW1haW4gYWNjdXJhdGUuXG5cbiAgaWYgKGlucHV0Q2hhbmdlKSB7XG4gICAgLy8gbWFrZSBzdXJlIGEgdGltZXpvbmUgaXMgc2V0LiBJbnB1dCBtYXkgbm90IGhhdmUgYSB0aW1lem9uZSBhdHRhY2hlZC4gRGVmYXVsdCB0byBzeXN0ZW0gdGltZS5cbiAgICBjb25zdCBpbnB1dENoYW5nZVdpdGhUaW1lem9uZVNldCA9IHtcbiAgICAgIC4uLmlucHV0Q2hhbmdlLFxuICAgICAgdGltZXpvbmU6IGlucHV0Q2hhbmdlLnRpbWV6b25lID8/IHN5c3RlbVRpbWV6b25lXG4gICAgfTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgc2NoZWR1bGUgcmFuZ2VcbiAgICBjb25zdCBmdWxsQ2hhbmdlID0gZnVsbERhdGVDZWxsU2NoZWR1bGVSYW5nZSh7IGRhdGVDZWxsU2NoZWR1bGVSYW5nZTogaW5wdXRDaGFuZ2VXaXRoVGltZXpvbmVTZXQgfSk7XG4gICAgY29uc3QgaW5wdXROb3JtYWwgPSBkYXRlQ2VsbFRpbWluZ1RpbWV6b25lTm9ybWFsSW5zdGFuY2UoZnVsbENoYW5nZSk7XG5cbiAgICBjb25zdCBzdGFydEluU3lzdGVtVHogPSBpbnB1dE5vcm1hbC5zeXN0ZW1EYXRlVG9UYXJnZXREYXRlKGZ1bGxDaGFuZ2Uuc3RhcnQpO1xuICAgIGNvbnN0IGVuZEluU3lzdGVtVHogPSBzdGFydE9mRGF5KGlucHV0Tm9ybWFsLnN5c3RlbURhdGVUb1RhcmdldERhdGUoZnVsbENoYW5nZS5lbmQpKTtcblxuICAgIC8vIGNvbnZlcnQgdGhlIHN0YXJ0L2VuZCB0byBzeXN0ZW0gdGltZVxuICAgIGNoYW5nZSA9IHtcbiAgICAgIHN0YXJ0OiBzdGFydEluU3lzdGVtVHosXG4gICAgICBlbmQ6IGVuZEluU3lzdGVtVHosXG4gICAgICB3OiBmdWxsQ2hhbmdlLncsXG4gICAgICBleDogZnVsbENoYW5nZS5leCxcbiAgICAgIHRpbWV6b25lOiBmdWxsQ2hhbmdlLnRpbWV6b25lXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGlzU2FtZVZhbHVlID0gaXNTYW1lRGF0ZUNlbGxTY2hlZHVsZURhdGVSYW5nZShjdXJyZW50RGF0ZUNlbGxTY2hlZHVsZVJhbmdlLCBjaGFuZ2UpO1xuXG4gIGlmIChpc1NhbWVWYWx1ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoY2hhbmdlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRTdGFydDogY2hhbmdlLnN0YXJ0LCBpbnB1dEVuZDogY2hhbmdlLmVuZCwgdG9nZ2xlZEluZGV4ZXM6IG5ldyBTZXQoY2hhbmdlLmV4KSB9O1xuICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMoZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKSwgZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzKGNoYW5nZS53IHx8ICc4OScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vU2VsZWN0aW9uQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHN0YXRlKTsgLy8gY2xlYXIgc2VsZWN0aW9uLCByZXRhaW4gZGlzYWJsZWQgZGF5c1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERlZmF1bHRTY2hlZHVsZURheXMoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBNYXliZTxJdGVyYWJsZTxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBkZWZhdWx0U2NoZWR1bGVEYXlzOiBjdXJyZW50RGVmYXVsdFNjaGVkdWxlRGF5cyB9ID0gc3RhdGU7XG4gIGNvbnN0IGRlZmF1bHRTY2hlZHVsZURheXMgPSBuZXcgU2V0KGNoYW5nZSA/PyBmdWxsV2Vla0RhdGVDZWxsU2NoZWR1bGVEYXlDb2RlcygpKTtcblxuICBpZiAoZGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzQXJlU2V0c0VxdWl2YWxlbnQoZGVmYXVsdFNjaGVkdWxlRGF5cywgY3VycmVudERlZmF1bHRTY2hlZHVsZURheXMpKSB7XG4gICAgcmV0dXJuIHN0YXRlOyAvLyBubyBjaGFuZ2VcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmluYWxpemVVcGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCB7IC4uLnN0YXRlLCBkZWZhdWx0U2NoZWR1bGVEYXlzIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogTWF5YmU8SXRlcmFibGU8RGF0ZUNlbGxTY2hlZHVsZURheUNvZGU+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgc2NoZWR1bGVEYXlzOiBjdXJyZW50U2NoZWR1bGVEYXlzIH0gPSBzdGF0ZTtcbiAgY29uc3Qgc2NoZWR1bGVEYXlzID0gbmV3IFNldChjaGFuZ2UgPz8gW10pO1xuXG4gIGxldCBuZXdTY2hlZHVsZURheXM6IFNldDxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50U2NoZWR1bGVEYXlzICE9IG51bGwgJiYgY2hhbmdlICE9IG51bGwpIHtcbiAgICBpZiAoZGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzQXJlU2V0c0VxdWl2YWxlbnQoc2NoZWR1bGVEYXlzLCBjdXJyZW50U2NoZWR1bGVEYXlzKSkge1xuICAgICAgbmV3U2NoZWR1bGVEYXlzID0gdW5kZWZpbmVkOyAvL25vIGNoYW5nZVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTY2hlZHVsZURheXMgPSBzY2hlZHVsZURheXM7XG4gICAgfVxuICB9IGVsc2UgaWYgKGN1cnJlbnRTY2hlZHVsZURheXMgIT09IGNoYW5nZSkge1xuICAgIG5ld1NjaGVkdWxlRGF5cyA9IGNoYW5nZSA/IHNjaGVkdWxlRGF5cyA6IG51bGw7IC8vIHNldCB0aGUgbmV3IG9uZSwgb3IgY2xlYXIgaXRcbiAgfVxuXG4gIGlmIChuZXdTY2hlZHVsZURheXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmluYWxpemVVcGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCB7IC4uLnN0YXRlLCBzY2hlZHVsZURheXM6IG5ld1NjaGVkdWxlRGF5cyA/PyB1bmRlZmluZWQgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplVXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhwcmV2aW91c1N0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgcHJldmlvdXNTY2hlZHVsZURheXMgPSBwcmV2aW91c1N0YXRlLmVmZmVjdGl2ZVNjaGVkdWxlRGF5cztcbiAgY29uc3QgbmV4dFNjaGVkdWxlRGF5cyA9IG5leHRTdGF0ZS5zY2hlZHVsZURheXMgPz8gbmV4dFN0YXRlLmRlZmF1bHRTY2hlZHVsZURheXM7XG5cbiAgaWYgKGRhdGVDZWxsU2NoZWR1bGVEYXlDb2Rlc0FyZVNldHNFcXVpdmFsZW50KG5leHRTY2hlZHVsZURheXMsIHByZXZpb3VzU2NoZWR1bGVEYXlzKSkge1xuICAgIHJldHVybiBuZXh0U3RhdGU7IC8vIHRoZSBkZWZhdWx0IG9yIGlucHV0IHNjaGVkdWxlIGNoYW5nZWQgYnV0IHRoZSBzY2hlZHVsZSBpcyBzdGlsbCB0aGUgc2FtZSwgc28gbm8gbmVlZCBmb3IgYW4gdXBkYXRlLlxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVkdWxlRGF5cyA9IG5ldyBTZXQoc2ltcGxpZnlEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXMobmV4dFNjaGVkdWxlRGF5cykpO1xuICAgIGNvbnN0IGFsbG93ZWREYXlzT2ZXZWVrID0gZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQobmV4dFNjaGVkdWxlRGF5cyk7XG5cbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoe1xuICAgICAgLi4ubmV4dFN0YXRlLFxuICAgICAgLy8gdXBkYXRlIHRoZSBlZmZlY3RpdmUgc2NoZWR1bGUgZGF5cyBhbmQgYWxsb3dlZCBkYXlzIG9mIHdlZWtcbiAgICAgIGVmZmVjdGl2ZVNjaGVkdWxlRGF5cyxcbiAgICAgIGFsbG93ZWREYXlzT2ZXZWVrXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGVEYXRlc0NoYW5nZSB7XG4gIHJlc2V0PzogdHJ1ZTtcbiAgdG9nZ2xlPzogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD47XG4gIGFkZD86IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICByZW1vdmU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PjtcbiAgc2V0PzogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD47XG4gIHNlbGVjdEFsbD86IEFsbE9yTm9uZVNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEludmVydHMgdGhlIHNldCBkYXRlIGNoYW5naW5nIGJlaGF2aW9yIHNvIHRoYXQgdGhlIHNldCBpbnB1dCBpcyB0cmVhdGVkIGFzIGl0ZW1zIHRoYXQgc2hvdWxkIGJlIHJldGFpbmVkIGluc3RlYWQgb2YgZXhjbHVkZWQuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiBzZXQgaXMgbm90IHVzZWQuIElnbm9yZWQgZm9yIHNlbGVjdEFsbC5cbiAgICovXG4gIGludmVydFNldEJlaGF2aW9yPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZURhdGVzQ2hhbmdlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhGYWN0b3J5LCBpbmRleERheU9mV2VlaywgaW5wdXRTdGFydDogY3VycmVudElucHV0U3RhcnQsIGlucHV0RW5kOiBjdXJyZW50SW5wdXRFbmQsIG1pbk1heERhdGVSYW5nZSwgZmlsdGVyIH0gPSBzdGF0ZTtcbiAgY29uc3QgeyBzdGFydDogbWluRGF0ZSwgZW5kOiBtYXhEYXRlIH0gPSBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlUmVsYXRpdmVUb0ZpbHRlcihzdGF0ZSk7XG4gIGxldCBpbnB1dFN0YXJ0ID0gY3VycmVudElucHV0U3RhcnQ7XG4gIGxldCBpbnB1dEVuZCA9IGN1cnJlbnRJbnB1dEVuZDtcblxuICAvKipcbiAgICogVGhpcyBpcyBhIHNldCBvZiBpbmRleGVzIHRoYXQgYXJlIGludGVybmFsbHkgXCJzZWxlY3RlZFwiIHNvIHRoYXQgdGhleSBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgaW5wdXRTdGFydC9pbnB1dEVuZCBkYXRlIHJhbmdlLlxuICAgKlxuICAgKiBEbyBub3QgY29uZnVzZSB0aGlzIHdpdGggdGhlIGFjdHVhbCBpbmRleGVzIHRoYXQgYXJlIHNlbGVjdGVkLlxuICAgKi9cbiAgbGV0IHRvZ2dsZWRJbmRleGVzOiBTZXQ8RGF0ZUNlbGxJbmRleD47XG5cbiAgZnVuY3Rpb24gYXNJbmRleGVzKGluZGV4ZXM6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KTogRGF0ZUNlbGxJbmRleFtdIHtcbiAgICByZXR1cm4gaXRlcmFibGVUb0FycmF5KGluZGV4ZXMpLm1hcChpbmRleEZhY3RvcnkpO1xuICB9XG5cbiAgaWYgKGNoYW5nZS5yZXNldCB8fCBjaGFuZ2Uuc2VsZWN0QWxsICE9IG51bGwgfHwgY2hhbmdlLnNldCAhPSBudWxsKSB7XG4gICAgbGV0IHNldDogTWF5YmU8SXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4+ID0gY2hhbmdlLnNldCA/PyBbXTtcbiAgICBjb25zdCBzZWxlY3RBbGw6IE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj4gPSBjaGFuZ2UucmVzZXQgPT09IHRydWUgPyBzdGF0ZS5pbml0aWFsU2VsZWN0aW9uU3RhdGUgOiBjaGFuZ2Uuc2VsZWN0QWxsO1xuXG4gICAgc3dpdGNoIChzZWxlY3RBbGwpIHtcbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGlmIChtaW5EYXRlICE9IG51bGwgJiYgbWF4RGF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgaW5wdXRTdGFydCA9IG1pbkRhdGU7XG4gICAgICAgICAgaW5wdXRFbmQgPSBtYXhEYXRlO1xuICAgICAgICAgIHNldCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIGlucHV0U3RhcnQgPSBudWxsO1xuICAgICAgICBpbnB1dEVuZCA9IG51bGw7XG4gICAgICAgIHNldCA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQoYXNJbmRleGVzKHNldCkpO1xuXG4gICAgaWYgKGNoYW5nZS5pbnZlcnRTZXRCZWhhdmlvciAmJiBtaW5EYXRlICYmIG1heERhdGUgJiYgIXNlbGVjdEFsbCkge1xuICAgICAgY29uc3QgbWluSW5kZXggPSBpbmRleEZhY3RvcnkobWluRGF0ZSk7XG4gICAgICBjb25zdCBtYXhJbmRleCA9IGluZGV4RmFjdG9yeShtYXhEYXRlKTtcblxuICAgICAgaW5wdXRTdGFydCA9IG1pbkRhdGU7XG4gICAgICBpbnB1dEVuZCA9IG1heERhdGU7XG4gICAgICB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQocmFuZ2UobWluSW5kZXgsIG1heEluZGV4ICsgMSkuZmlsdGVyKCh4KSA9PiAhdG9nZ2xlZEluZGV4ZXMuaGFzKHgpKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRvZ2dsZWRJbmRleGVzID0gbmV3IFNldChzdGF0ZS50b2dnbGVkSW5kZXhlcyk7XG5cbiAgICBpZiAoY2hhbmdlLnRvZ2dsZSkge1xuICAgICAgY29uc3QgYWxsb3dlZFRvVG9nZ2xlID0gYXNJbmRleGVzKGNoYW5nZS50b2dnbGUpLmZpbHRlcigoaSkgPT4gYWxsb3dlZERheXNPZldlZWsuaGFzKGluZGV4RGF5T2ZXZWVrKGkpKSk7XG4gICAgICB0b2dnbGVJblNldCh0b2dnbGVkSW5kZXhlcywgYWxsb3dlZFRvVG9nZ2xlKTtcbiAgICB9XG5cbiAgICBsZXQgYWRkVG9FeGNsdXNpb246IE1heWJlPEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+PjtcbiAgICBsZXQgcmVtb3ZlRnJvbUV4Y2x1c2lvbjogTWF5YmU8SXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4+O1xuXG4gICAgaWYgKGNoYW5nZS5hZGQpIHtcbiAgICAgIGlmIChjaGFuZ2UuaW52ZXJ0U2V0QmVoYXZpb3IpIHtcbiAgICAgICAgYWRkVG9FeGNsdXNpb24gPSBjaGFuZ2UuYWRkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRnJvbUV4Y2x1c2lvbiA9IGNoYW5nZS5hZGQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZS5yZW1vdmUpIHtcbiAgICAgIGlmIChjaGFuZ2UuaW52ZXJ0U2V0QmVoYXZpb3IpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUV4Y2x1c2lvbiA9IGNoYW5nZS5yZW1vdmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRUb0V4Y2x1c2lvbiA9IGNoYW5nZS5yZW1vdmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFkZFRvRXhjbHVzaW9uKSB7XG4gICAgICByZW1vdmVGcm9tU2V0KHRvZ2dsZWRJbmRleGVzLCBhc0luZGV4ZXMoYWRkVG9FeGNsdXNpb24pKTtcbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlRnJvbUV4Y2x1c2lvbikge1xuICAgICAgYWRkVG9TZXQodG9nZ2xlZEluZGV4ZXMsIGFzSW5kZXhlcyhyZW1vdmVGcm9tRXhjbHVzaW9uKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRTdGFydCwgaW5wdXRFbmQsIHRvZ2dsZWRJbmRleGVzIH07XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuXG4gIC8vIFJlY2FsY3VsYXRlIHRoZSByYW5nZSBhbmQgc2ltcGxpZmllZCB0byBleGNsdXNpb25zXG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24obmV4dFN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24pIHtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoeyAuLi5uZXh0U3RhdGUsIHRvZ2dsZWRJbmRleGVzOiBuZXcgU2V0KHJhbmdlQW5kRXhjbHVzaW9uLmV4Y2x1ZGVkKSwgaW5wdXRTdGFydDogcmFuZ2VBbmRFeGNsdXNpb24uc3RhcnQsIGlucHV0RW5kOiByYW5nZUFuZEV4Y2x1c2lvbi5lbmQgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm8gc2VsZWN0ZWQgZGF5c1xuICAgIHJldHVybiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHsgLi4uc3RhdGUsIHRvZ2dsZWRJbmRleGVzOiBuZXcgU2V0KCksIGlucHV0U3RhcnQ6IG51bGwsIGlucHV0RW5kOiBudWxsIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBpbnB1dFN0YXJ0OiBjdXJyZW50SW5wdXRTdGFydCwgaW5wdXRFbmQ6IGN1cnJlbnRJbnB1dEVuZCwgaW5kZXhGYWN0b3J5IH0gPSBzdGF0ZTtcbiAgY29uc3QgeyBzdGFydDogbWluRGF0ZSwgZW5kOiBtYXhEYXRlIH0gPSBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlKHN0YXRlKTtcblxuICBjb25zdCBpbnB1dFN0YXJ0OiBEYXRlID0gc3RhcnRPZkRheShjaGFuZ2UuaW5wdXRTdGFydCk7XG4gIGNvbnN0IGlucHV0RW5kOiBEYXRlID0gc3RhcnRPZkRheShjaGFuZ2UuaW5wdXRFbmQpOyAvLyBtaWRuaWdodCBvZiB0aGUgbGFzdCBkYXlcblxuICBjb25zdCBpc1ZhbGlkUmFuZ2UgPSBtaW5EYXRlICE9IG51bGwgfHwgbWF4RGF0ZSAhPSBudWxsID8gaXNEYXRlSW5EYXRlUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBtaW5EYXRlID8/IHVuZGVmaW5lZCwgZW5kOiBtYXhEYXRlID8/IHVuZGVmaW5lZCB9KSA6ICgpID0+IHRydWU7XG5cbiAgaWYgKCFpc1ZhbGlkUmFuZ2UoaW5wdXRTdGFydCkgfHwgIWlzVmFsaWRSYW5nZShpbnB1dEVuZCkgfHwgKGlzU2FtZURhdGVEYXkoaW5wdXRTdGFydCwgY3VycmVudElucHV0U3RhcnQpICYmIGlzU2FtZURhdGVEYXkoaW5wdXRFbmQsIGN1cnJlbnRJbnB1dEVuZCkpKSB7XG4gICAgcmV0dXJuIHN0YXRlOyAvLyBpZiBubyBjaGFuZ2UsIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAgfVxuXG4gIC8vIHJldGFpbiBhbGwgaW5kZXhlcyB0aGF0IGFyZSB3aXRoaW4gdGhlIG5ldyByYW5nZVxuICBjb25zdCBtaW5JbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgY29uc3QgbWF4SW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRFbmQpICsgMTtcblxuICBjb25zdCBjdXJyZW50SW5kZXhlczogRGF0ZUNlbGxJbmRleFtdID0gQXJyYXkuZnJvbShzdGF0ZS50b2dnbGVkSW5kZXhlcyk7XG4gIGNvbnN0IGlzSW5DdXJyZW50UmFuZ2UgPSBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24oeyBtaW5JbmRleCwgbWF4SW5kZXggfSk7XG4gIGNvbnN0IGV4Y2x1ZGVkSW5kZXhlc0luTmV3UmFuZ2UgPSBjdXJyZW50SW5kZXhlcy5maWx0ZXIoaXNJbkN1cnJlbnRSYW5nZSk7XG4gIGNvbnN0IHRvZ2dsZWRJbmRleGVzID0gbmV3IFNldChleGNsdWRlZEluZGV4ZXNJbk5ld1JhbmdlKTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlLCB0b2dnbGVkSW5kZXhlcywgaW5wdXRTdGFydCwgaW5wdXRFbmQgfTtcbiAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuICBuZXh0U3RhdGUuY3VycmVudFNlbGVjdGlvblZhbHVlID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uVmFsdWUobmV4dFN0YXRlKTtcbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW5hYmxlZERheUluQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBEZWNpc2lvbkZ1bmN0aW9uPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4ge1xuICBjb25zdCB7IGFsbG93ZWREYXlzT2ZXZWVrLCBpbmRleEZhY3RvcnksIGlucHV0U3RhcnQsIGlucHV0RW5kLCBpbmRleERheU9mV2Vlaywgc3lzdGVtVGltZXpvbmUgfSA9IHN0YXRlO1xuICBsZXQgaXNJblN0YXJ0QW5kRW5kUmFuZ2U6IElzRGF0ZVdpdGhpbkRhdGVDZWxsUmFuZ2VGdW5jdGlvbjtcblxuICBpZiAoaW5wdXRTdGFydCAmJiBpbnB1dEVuZCkge1xuICAgIGlzSW5TdGFydEFuZEVuZFJhbmdlID0gaXNEYXRlV2l0aGluRGF0ZUNlbGxSYW5nZUZ1bmN0aW9uKHsgc3RhcnRzQXQ6IHsgc3RhcnRzQXQ6IHN0YXRlLnN0YXJ0LCB0aW1lem9uZTogc3lzdGVtVGltZXpvbmUgfSwgcmFuZ2U6IHsgc3RhcnQ6IGlucHV0U3RhcnQsIGVuZDogaW5wdXRFbmQgfSB9KTtcbiAgfSBlbHNlIHtcbiAgICBpc0luU3RhcnRBbmRFbmRSYW5nZSA9ICgpID0+IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChpbnB1dDogRGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0KSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXQpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGluZGV4RGF5T2ZXZWVrKGluZGV4KTtcblxuICAgIGNvbnN0IGlzSW5TZWxlY3RlZFJhbmdlID0gaXNJblN0YXJ0QW5kRW5kUmFuZ2UoaW5kZXgpO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBzdGF0ZS50b2dnbGVkSW5kZXhlcy5oYXMoaW5kZXgpO1xuICAgIGNvbnN0IGlzQWxsb3dlZERheU9mV2VlayA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhkYXlPZldlZWspO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gaXNBbGxvd2VkRGF5T2ZXZWVrICYmICgoaXNJblNlbGVjdGVkUmFuZ2UgJiYgIWlzU2VsZWN0ZWQpIHx8IChpc1NlbGVjdGVkICYmICFpc0luU2VsZWN0ZWRSYW5nZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPiB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5OiBzeXN0ZW1JbmRleEZhY3RvcnksIGFsbG93ZWREYXlzT2ZXZWVrLCBlZmZlY3RpdmVTY2hlZHVsZURheXMsIGluZGV4RGF5T2ZXZWVrLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciwgZmlsdGVyLCBzeXN0ZW1UaW1lem9uZSB9ID0gc3RhdGU7XG4gIGxldCB0aW1lem9uZSA9IHN5c3RlbVRpbWV6b25lO1xuICBjb25zdCByYW5nZUFuZEV4Y2x1c2lvbiA9IGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGFydDogcmFuZ2VTdGFydCwgZW5kOiByYW5nZUVuZCwgZXhjbHVkZWQ6IGFsbEV4Y2x1ZGVkLCBkYXRlQ2VsbFJhbmdlIH0gPSByYW5nZUFuZEV4Y2x1c2lvbjtcbiAgbGV0IGZpbHRlck9mZnNldEV4Y2x1ZGVkUmFuZ2U6IERhdGVDZWxsSW5kZXhbXSA9IFtdO1xuICBsZXQgaW5kZXhPZmZzZXQgPSBkYXRlQ2VsbFJhbmdlLmk7XG5cbiAgbGV0IHN0YXJ0ID0gcmFuZ2VTdGFydDtcbiAgbGV0IGVuZCA9IHJhbmdlRW5kO1xuXG4gIC8vIElmIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyIGlzIHRydWUsIHRoZW4gd2UgbmVlZCB0byBvZmZzZXQgdGhlIHZhbHVlcyB0byBiZSByZWxhdGl2ZSB0byB0aGF0IHN0YXJ0LlxuICBpZiAoY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgJiYgZmlsdGVyPy5zdGFydCkge1xuICAgIHN0YXJ0ID0gZmlsdGVyLnN0YXJ0OyAvLyBhbHdheXMgc3RhcnQgYXQgdGhlIGZpbHRlcidzIHN0YXJ0IGRhdGVcbiAgICBsZXQgc3RhcnRJblN5c3RlbVRpbWV6b25lID0gc3RhcnQ7XG5cbiAgICBpZiAoZmlsdGVyLnRpbWV6b25lKSB7XG4gICAgICB0aW1lem9uZSA9IGZpbHRlci50aW1lem9uZTtcbiAgICAgIGNvbnN0IGZpbHRlck5vcm1hbCA9IGRhdGVUaW1lem9uZVV0Y05vcm1hbCh0aW1lem9uZSk7XG4gICAgICBlbmQgPSBmaWx0ZXJOb3JtYWwuc3RhcnRPZkRheUluVGFyZ2V0VGltZXpvbmUoZW5kKTtcbiAgICAgIHN0YXJ0SW5TeXN0ZW1UaW1lem9uZSA9IGZpbHRlck5vcm1hbC5zeXN0ZW1EYXRlVG9UYXJnZXREYXRlKHN0YXJ0KTsgLy8gY29udmVydCB0aGUgc3RhcnQgdG8gdGhlIHN5c3RlbSB0aW1lem9uZSBub3JtYWwgZm9yIGRlcml2aW5nIHRoZSBpbmRleFxuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlU3RhcnRJbmRleCA9IHN5c3RlbUluZGV4RmFjdG9yeShyYW5nZVN0YXJ0KTtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gc3lzdGVtSW5kZXhGYWN0b3J5KHN0YXJ0SW5TeXN0ZW1UaW1lem9uZSk7XG4gICAgY29uc3QgZmlsdGVyU3RhcnRJbmRleE9mZnNldCA9IHJhbmdlU3RhcnRJbmRleCAtIHN0YXJ0SW5kZXg7XG4gICAgZmlsdGVyT2Zmc2V0RXhjbHVkZWRSYW5nZSA9IHJhbmdlKDAsIGZpbHRlclN0YXJ0SW5kZXhPZmZzZXQpO1xuICAgIGluZGV4T2Zmc2V0ID0gaW5kZXhPZmZzZXQgLSBmaWx0ZXJTdGFydEluZGV4T2Zmc2V0O1xuICB9XG5cbiAgY29uc3QgZXhjbHVkZWQgPSBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlclxuICAgID8gYWxsRXhjbHVkZWQuZmlsdGVyKCh4KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzRXhjbHVkZWRJbmRleCA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2Vlayh4KSk7IC8vID8/P1xuICAgICAgICByZXR1cm4gaXNFeGNsdWRlZEluZGV4O1xuICAgICAgfSlcbiAgICA6IGFsbEV4Y2x1ZGVkO1xuXG4gIGNvbnN0IG9mZnNldEV4Y2x1ZGVkOiBEYXRlQ2VsbEluZGV4W10gPSBleGNsdWRlZC5tYXAoKHgpID0+IHggLSBpbmRleE9mZnNldCk7IC8vIHNldCB0byB0aGUgcHJvcGVyIG9mZnNldFxuXG4gIGNvbnN0IGV4ID0gWy4uLmZpbHRlck9mZnNldEV4Y2x1ZGVkUmFuZ2UsIC4uLm9mZnNldEV4Y2x1ZGVkXTtcblxuICBjb25zdCB3OiBEYXRlQ2VsbFNjaGVkdWxlRW5jb2RlZFdlZWsgPSBkYXRlQ2VsbFNjaGVkdWxlRW5jb2RlZFdlZWsoZWZmZWN0aXZlU2NoZWR1bGVEYXlzKTtcbiAgY29uc3QgZDogRGF0ZUNlbGxJbmRleFtdID0gW107IC8vIFwiaW5jbHVkZWRcIiBibG9ja3MgYXJlIG5ldmVyIHVzZWQvY2FsY3VsYXRlZC5cblxuICAvLyBBbHdheXMgZW5zdXJlIHRoZSBlbmQgaXMgYWZ0ZXIgb3IgZXF1YWwgdG8gdGhlIHN0YXJ0LlxuICBpZiAoaXNCZWZvcmUoZW5kLCBzdGFydCkpIHtcbiAgICBlbmQgPSBzdGFydDsgLy8gZW5kIGlzIHN0YXJ0XG4gIH1cblxuICBjb25zdCBkYXRlU2NoZWR1bGVSYW5nZTogRGF0ZUNlbGxTY2hlZHVsZURhdGVSYW5nZSA9IHtcbiAgICB0aW1lem9uZSxcbiAgICBzdGFydCxcbiAgICBlbmQsXG4gICAgdyxcbiAgICBkLFxuICAgIGV4XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBkYXRlU2NoZWR1bGVSYW5nZSxcbiAgICBtaW5NYXhSYW5nZTogeyBzdGFydCwgZW5kIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgc2VsZWN0ZWQgZGF0ZSByYW5nZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2VsbCByYW5nZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24gZXh0ZW5kcyBEYXRlUmFuZ2Uge1xuICAvKipcbiAgICogQ29ycmVzcG9uZHMgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgaW5kZXhlcyBpbiB0aGUgZGF0ZSByYW5nZS5cbiAgICovXG4gIGRhdGVDZWxsUmFuZ2U6IERhdGVDZWxsUmFuZ2VXaXRoUmFuZ2U7XG4gIC8qKlxuICAgKiBBbGwgZXhjbHVkZWQgaW5kZXhlcy5cbiAgICovXG4gIGV4Y2x1ZGVkOiBEYXRlQ2VsbEluZGV4W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbihzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uPiB7XG4gIGNvbnN0IHsgc3RhcnQ6IGN1cnJlbnRTdGFydCwgaXNFbmFibGVkRGF5LCBpc0VuYWJsZWRGaWx0ZXJEYXksIHN5c3RlbVRpbWV6b25lIH0gPSBzdGF0ZTtcblxuICBjb25zdCBkYXRlRmFjdG9yeSA9IGRhdGVDZWxsVGltaW5nU3RhcnREYXRlRmFjdG9yeSh7IHN0YXJ0c0F0OiBjdXJyZW50U3RhcnQsIHRpbWV6b25lOiBzeXN0ZW1UaW1lem9uZSB9KTtcbiAgY29uc3QgZGF0ZUNlbGxSYW5nZSA9IGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUNlbGxSYW5nZShzdGF0ZSk7XG5cbiAgaWYgKGRhdGVDZWxsUmFuZ2UgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsOyAvLyByZXR1cm5zIG51bGwgaWYgbm8gaXRlbXMgYXJlIHNlbGVjdGVkLlxuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSBkYXRlRmFjdG9yeShkYXRlQ2VsbFJhbmdlLmkpO1xuICBjb25zdCBlbmQgPSBkYXRlRmFjdG9yeShkYXRlQ2VsbFJhbmdlLnRvKTtcblxuICBjb25zdCBleGNsdWRlZDogRGF0ZUNlbGxJbmRleFtdID0gcmFuZ2UoZGF0ZUNlbGxSYW5nZS5pLCBkYXRlQ2VsbFJhbmdlLnRvICsgMSkuZmlsdGVyKCh4KSA9PiB7XG4gICAgY29uc3QgaXNFeGNsdWRlZEluZGV4ID0gIWlzRW5hYmxlZERheSh4KSB8fCAhaXNFbmFibGVkRmlsdGVyRGF5KHgpO1xuICAgIHJldHVybiBpc0V4Y2x1ZGVkSW5kZXg7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdDogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uID0ge1xuICAgIGRhdGVDZWxsUmFuZ2UsXG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIGV4Y2x1ZGVkXG4gIH07XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPERhdGVSYW5nZT4ge1xuICBjb25zdCBkYXRlRmFjdG9yeSA9IGRhdGVDZWxsVGltaW5nRGF0ZUZhY3RvcnkoeyBzdGFydHNBdDogc3RhdGUuc3RhcnQsIHRpbWV6b25lOiBzdGF0ZS5zeXN0ZW1UaW1lem9uZSB9KTtcbiAgY29uc3QgZGF0ZUNlbGxSYW5nZSA9IGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUNlbGxSYW5nZShzdGF0ZSk7XG4gIGNvbnN0IGRhdGVSYW5nZTogTWF5YmU8RGF0ZVJhbmdlPiA9IGRhdGVDZWxsUmFuZ2UgIT0gbnVsbCA/IHsgc3RhcnQ6IGRhdGVGYWN0b3J5KGRhdGVDZWxsUmFuZ2UuaSksIGVuZDogZGF0ZUZhY3RvcnkoZGF0ZUNlbGxSYW5nZS50byBhcyBudW1iZXIpIH0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiBkYXRlUmFuZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVDZWxsUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPERhdGVDZWxsUmFuZ2VXaXRoUmFuZ2U+IHtcbiAgY29uc3QgeyBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhGYWN0b3J5LCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgaW5kZXhEYXlPZldlZWssIGlzRW5hYmxlZERheSwgaXNFbmFibGVkRmlsdGVyRGF5IH0gPSBzdGF0ZTtcbiAgY29uc3QgZW5hYmxlZEV4Y2x1c2lvbkluZGV4ZXMgPSBBcnJheS5mcm9tKHN0YXRlLnRvZ2dsZWRJbmRleGVzKS5maWx0ZXIoKGkpID0+IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2VlayhpKSkpO1xuICBjb25zdCBtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcyA9IG1pbkFuZE1heE51bWJlcihlbmFibGVkRXhjbHVzaW9uSW5kZXhlcyk7XG5cbiAgbGV0IHN0YXJ0UmFuZ2U6IE1heWJlPERhdGVDZWxsSW5kZXg+O1xuICBsZXQgZW5kUmFuZ2U6IE1heWJlPERhdGVDZWxsSW5kZXg+O1xuXG4gIGlmIChtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcykge1xuICAgIHN0YXJ0UmFuZ2UgPSBtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcy5taW47XG4gICAgZW5kUmFuZ2UgPSBtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcy5tYXg7XG4gIH1cblxuICBpZiAoaW5wdXRTdGFydCAhPSBudWxsICYmIGlucHV0RW5kICE9IG51bGwpIHtcbiAgICBjb25zdCBpbnB1dFN0YXJ0SW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRTdGFydCk7XG4gICAgY29uc3QgaW5wdXRFbmRJbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dEVuZCk7XG5cbiAgICBzdGFydFJhbmdlID0gc3RhcnRSYW5nZSAhPSBudWxsID8gTWF0aC5taW4oaW5wdXRTdGFydEluZGV4LCBzdGFydFJhbmdlKSA6IGlucHV0U3RhcnRJbmRleDtcbiAgICBlbmRSYW5nZSA9IGVuZFJhbmdlICE9IG51bGwgPyBNYXRoLm1heChpbnB1dEVuZEluZGV4LCBlbmRSYW5nZSkgOiBpbnB1dEVuZEluZGV4O1xuICB9XG5cbiAgaWYgKHN0YXJ0UmFuZ2UgIT0gbnVsbCAmJiBlbmRSYW5nZSAhPSBudWxsKSB7XG4gICAgY29uc3Qgc2NhblN0YXJ0SW5kZXggPSBzdGFydFJhbmdlO1xuICAgIGNvbnN0IHNjYW5FbmRJbmRleCA9IGVuZFJhbmdlO1xuXG4gICAgLy8gY2xlYXIgc3RhcnQgYW5kIGVuZFxuICAgIHN0YXJ0UmFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgZW5kUmFuZ2UgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBpZiB0aGUgbWluIGlzIGVxdWFsIHRvIHRoZSBzdGFydCBpbmRleCwgdGhlbiB3ZSBhcmUgaW4gdGhlIHJhbmdlIGFuZCBuZWVkIHRvIGl0ZXJhdGUgZGF0ZXMgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBpcyBub3Qgc2VsZWN0ZWQvZXhjbHVkZWQuXG4gICAgZm9yIChsZXQgaSA9IHNjYW5TdGFydEluZGV4OyBpIDw9IHNjYW5FbmRJbmRleDsgaSArPSAxKSB7XG4gICAgICBpZiAoaXNFbmFibGVkRmlsdGVyRGF5KGkpICYmIGlzRW5hYmxlZERheShpKSkge1xuICAgICAgICBzdGFydFJhbmdlID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2FtZSB3aXRoIHRoZSBtYXhcbiAgICBmb3IgKGxldCBpID0gc2NhbkVuZEluZGV4OyBpID49IHNjYW5TdGFydEluZGV4OyBpIC09IDEpIHtcbiAgICAgIGlmIChpc0VuYWJsZWRGaWx0ZXJEYXkoaSkgJiYgaXNFbmFibGVkRGF5KGkpKSB7XG4gICAgICAgIGVuZFJhbmdlID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXJ0UmFuZ2UgIT0gbnVsbCAmJiBlbmRSYW5nZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHsgaTogc3RhcnRSYW5nZSwgdG86IGVuZFJhbmdlIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
814
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwsd0JBQXdCLEVBR3hCLHlCQUF5QixFQUV6QiwwQkFBMEIsRUFDMUIsb0NBQW9DLEVBRXBDLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFHM0Isa0NBQWtDLEVBQ2xDLDhCQUE4QixFQUM5Qiw0Q0FBNEMsRUFDNUMsV0FBVyxFQUNYLFdBQVcsRUFDWCx5QkFBeUIsRUFFekIsaUNBQWlDLEVBQ2pDLFVBQVUsRUFDVixhQUFhLEVBQ2IsZUFBZSxFQUVmLHVDQUF1QyxFQUN2QyxtQkFBbUIsRUFFbkIscUJBQXFCLEVBRXJCLDJCQUEyQixFQUczQix3QkFBd0IsRUFFeEIseUNBQXlDLEVBQ3pDLGdDQUFnQyxFQUNoQyxnQ0FBZ0MsRUFDaEMsOEJBQThCLEVBRTlCLG1DQUFtQyxFQUNuQywrQkFBK0IsRUFFL0IseUJBQXlCLEVBQ3pCLG9DQUFvQyxFQUNwQyx5Q0FBeUMsRUFFekMsd0NBQXdDLEVBRXpDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUE0RCxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBWSxlQUFlLEVBQWEsS0FBSyxFQUFzQixNQUFNLEVBQUUsV0FBVyxFQUFrQyxjQUFjLEVBQUUsd0JBQXdCLEVBQXdCLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN1ksT0FBTyxFQUFF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QUFLLElBQUksQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEQsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzVDLFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsTUFBTTthQUNQO1NBQ0Y7UUFFRCxvQkFBb0I7UUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RELElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM1QyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLE1BQU07YUFDUDtTQUNGO0tBQ0Y7SUFFRCxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtRQUMxQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7S0FDeEM7U0FBTTtRQUNMLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIERhdGVDZWxsRGF5T2ZXZWVrRmFjdG9yeSxcbiAgZGF0ZUNlbGxEYXlPZldlZWtGYWN0b3J5LFxuICBEYXRlQ2VsbEluZGV4LFxuICBEYXRlQ2VsbFJhbmdlV2l0aFJhbmdlLFxuICBkYXRlQ2VsbFRpbWluZ0RhdGVGYWN0b3J5LFxuICBEYXRlUmFuZ2UsXG4gIGRhdGVDZWxsU2NoZWR1bGVEYXRlRmlsdGVyLFxuICBjb3B5RGF0ZUNlbGxTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcsXG4gIERhdGVDZWxsU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnLFxuICBEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZSxcbiAgZGF0ZUNlbGxTY2hlZHVsZUVuY29kZWRXZWVrLFxuICBEYXRlQ2VsbFNjaGVkdWxlRW5jb2RlZFdlZWssXG4gIERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnksXG4gIGRhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnksXG4gIGV4cGFuZERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlcyxcbiAgZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQsXG4gIGZpbmRNYXhEYXRlLFxuICBmaW5kTWluRGF0ZSxcbiAgaXNEYXRlSW5EYXRlUmFuZ2VGdW5jdGlvbixcbiAgSXNEYXRlV2l0aGluRGF0ZUNlbGxSYW5nZUZ1bmN0aW9uLFxuICBpc0RhdGVXaXRoaW5EYXRlQ2VsbFJhbmdlRnVuY3Rpb24sXG4gIGlzU2FtZURhdGUsXG4gIGlzU2FtZURhdGVEYXksXG4gIGlzU2FtZURhdGVSYW5nZSxcbiAgRGF0ZU9yRGF0ZVJhbmdlT3JEYXRlQ2VsbEluZGV4T3JEYXRlQ2VsbFJhbmdlLFxuICBkYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhBcnJheUZhY3RvcnksXG4gIGlzSW5maW5pdGVEYXRlUmFuZ2UsXG4gIGNvcHlIb3Vyc0FuZE1pbnV0ZXNGcm9tRGF0ZSxcbiAgZGF0ZVRpbWV6b25lVXRjTm9ybWFsLFxuICBEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZSxcbiAgZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZVJhbmdlLFxuICBEYXRlQ2VsbCxcbiAgRGF0ZUNlbGxEdXJhdGlvblNwYW4sXG4gIGZvcm1hdFRvSVNPODYwMURheVN0cmluZyxcbiAgRGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0LFxuICBkYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXNBcmVTZXRzRXF1aXZhbGVudCxcbiAgc2ltcGxpZnlEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXMsXG4gIGZ1bGxXZWVrRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzLFxuICBkYXRlQ2VsbFRpbWluZ1N0YXJ0RGF0ZUZhY3RvcnksXG4gIERhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2UsXG4gIGRhdGVDZWxsVGltaW5nU3RhcnRzQXRGb3JTdGFydE9mRGF5LFxuICBpc1NhbWVEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlLFxuICBGdWxsRGF0ZUNlbGxTY2hlZHVsZVJhbmdlSW5wdXREYXRlUmFuZ2UsXG4gIGZ1bGxEYXRlQ2VsbFNjaGVkdWxlUmFuZ2UsXG4gIGRhdGVDZWxsVGltaW5nVGltZXpvbmVOb3JtYWxJbnN0YW5jZSxcbiAgY2hhbmdlRGF0ZUNlbGxTY2hlZHVsZURhdGVSYW5nZVRvVGltZXpvbmUsXG4gIHVwZGF0ZURhdGVDZWxsVGltaW5nVG9TeXN0ZW1UaW1lem9uZSxcbiAgU1lTVEVNX0RBVEVfVElNRVpPTkVfVVRDX05PUk1BTF9JTlNUQU5DRSxcbiAgZ2V0TGVhc3RBbmRHcmVhdGVzdERhdGVDZWxsSW5kZXhJbkRhdGVDZWxsUmFuZ2VzXG59IGZyb20gJ0BkZXJlZWtiL2RhdGUnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbEhhc0RpZmZlcmVudFZhbHVlcywgZmlsdGVyTWF5YmUgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IE1heWJlLCBUaW1lem9uZVN0cmluZywgRGVjaXNpb25GdW5jdGlvbiwgSXRlcmFibGVPclZhbHVlLCBpdGVyYWJsZVRvQXJyYXksIGFkZFRvU2V0LCB0b2dnbGVJblNldCwgaXNJbmRleE51bWJlckluSW5kZXhSYW5nZUZ1bmN0aW9uLCBNYXliZU1hcCwgbWluQW5kTWF4TnVtYmVyLCBEYXlPZldlZWssIHJhbmdlLCBBbGxPck5vbmVTZWxlY3Rpb24sIHVuaXF1ZSwgbWVyZ2VBcnJheXMsIEFycmF5T3JWYWx1ZSwgSVNPODYwMURheVN0cmluZywgbWFwVmFsdWVzVG9TZXQsIGlzSW5BbGxvd2VkRGF5c09mV2Vla1NldCwgQnVpbGRpbmcsIGZpcnN0VmFsdWUsIGZpcnN0VmFsdWVGcm9tSXRlcmFibGUsIGlzSXRlcmFibGUsIHJlbW92ZUZyb21TZXQgfSBmcm9tICdAZGVyZWVrYi91dGlsJztcbmltcG9ydCB7IENvbXBvbmVudFN0b3JlIH0gZnJvbSAnQG5ncngvY29tcG9uZW50LXN0b3JlJztcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIGVuZE9mRGF5LCBpc0JlZm9yZSB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCwgZmlyc3QsIGNvbWJpbmVMYXRlc3RXaXRoLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSwgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlLCBkZWZhdWx0Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSB9IGZyb20gJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2Uge1xuICAvKipcbiAgICogSW5wdXQgU3RhcnQgRGF0ZVxuICAgKi9cbiAgaW5wdXRTdGFydDogRGF0ZTtcbiAgLyoqXG4gICAqIElucHV0IEVuZCBEYXRlXG4gICAqL1xuICBpbnB1dEVuZDogRGF0ZTtcbn1cblxuZXhwb3J0IHR5cGUgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSA9IFBhcnRpYWw8TWF5YmVNYXA8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPj47XG5cbi8qKlxuICogRGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlIHNlbGVjdGlvbiBtb2RlLlxuICpcbiAqIFdoZW4gaW4gc2luZ2xlIG1vZGUgdGhlIHRvZ2dsZSBmdW5jdGlvbiBpcyB0cmVhdGVkIGFzIGEgc2V0IHRoYXQgY2xlYXJzIGFsbCB2YWx1ZXMgYW5kIG9ubHkgc2VsZWN0cyB0aGUgdG9nZ2xlJ2QgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZVNlbGVjdGlvbk1vZGUgPSAnbXVsdGlwbGUnIHwgJ3NpbmdsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIGV4dGVuZHMgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSB7XG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gbW9kZSBmb3IgdGhpcyBjYWxlbmRhci4gRGVmYXVsdHMgdG8gXCJtdWx0aXBsZVwiXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rpb25Nb2RlOiBEYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmVTZWxlY3Rpb25Nb2RlO1xuICAvKipcbiAgICogUmVhZG9ubHkgc3RhdGUgb2YgdGhlIHZpZXcuXG4gICAqXG4gICAqIERvZXMgbm90IGFmZmVjdCBzdGF0ZSBjaGFuZ2VzIGRpcmVjdGx5LCBidXQgaW5zdGVhZCBhY3RzIGFzIGEgZmxhZyBmb3IgdGhlIHBhcmVudCB2aWV3IHRvIHNldCBhbmQgdGhlIGNvbnN1bWluZyB2aWV3cyB0byB1cGRhdGUgb24uXG4gICAqL1xuICByZWFkb25seSBpc1ZpZXdSZWFkb25seT86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogU2V0IG9mIHRoZSBkYXlzIG9mIHdlZWsgdGhhdCBhcmUgYWxsb3dlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFNjaGVkdWxlRGF5czogU2V0PERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlPjtcbiAgLyoqXG4gICAqIEZpbHRlcnMgdGhlIGRheXMgb2YgdGhlIHNjaGVkdWxlIHRvIG9ubHkgYWxsb3cgc2VsZWN0aW5nIGRheXMgaW4gdGhlIHNjaGVkdWxlLlxuICAgKlxuICAgKiBUaGUgb3V0cHV0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcyBmaWx0ZXIsIGFuZCBpbiBpdCdzIHRpbWV6b25lIHVubGVzcyBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciBpcyBmYWxzZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIGNvcHkgb2YgYW55IHNldC9jb25maWd1cmVkIGlucHV0IGZpbHRlciBhbmQgd2lsbCBoYXZlIGEgc3RhcnQgZGF0ZSBzZXQgZnJvbSBzdGFydCBvciBzdGFydHNBdC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcj86IE1heWJlPERhdGVDZWxsU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPjtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZXhjbHVzaW9ucyB0aGF0IG1heSBub3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0RXhjbHVzaW9ucz86IE1heWJlPEFycmF5T3JWYWx1ZTxEYXRlT3JEYXRlUmFuZ2VPckRhdGVDZWxsSW5kZXhPckRhdGVDZWxsUmFuZ2U+PjtcbiAgLyoqXG4gICAqIFRoZSBjb21wdXRlZCBleGNsdXNpb25zIGdpdmVuIHRoZSBpbnB1dCBleGNsdXNpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHV0ZWRFeGNsdXNpb25zPzogTWF5YmU8RGF0ZUNlbGxJbmRleFtdPjtcbiAgLyoqXG4gICAqIFRoZSBtaW4vbWF4IGRhdGUgcmFuZ2UuIFVzZWQgZm9yIHJlc3RyaWN0aW5nIHRoZSBtaW4vbWF4IHZhbHVlLiBXb3JrcyB3aXRoIHRoZSBmaWx0ZXIuIFRoZSBncmVhdGVyL2xlc3NlciBvZiB0aGUgc3RhcnQvZW5kIGRhdGVzIGFyZSB1c2VkIGlmIGJvdGggYXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluTWF4RGF0ZVJhbmdlPzogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+PjtcbiAgLyoqXG4gICAqIFN0YXJ0IGRhdGUuIElzIHVwZGF0ZWQgYXMgdGhlIGlucHV0U3RhcnQgaXMgbW9kaWZpZWQgb3IgZmlsdGVyIGlzIHByb3ZpZGVkIHRoYXQgcHJvdmlkZXMgdGhlIHN0YXJ0IGRhdGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRvZGF5IGFuZCB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0OiBEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlWydzdGFydCddO1xuICAvKipcbiAgICogU3lzdGVtIFRpbWV6b25lLiBEb2VzIG5vdCBjaGFuZ2UuXG4gICAqL1xuICByZWFkb25seSBzeXN0ZW1UaW1lem9uZTogVGltZXpvbmVTdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lem9uZSB0byB1c2Ugd2hlbiBvdXRwdXR0aW5nIHRoZSB2YWx1ZS4gT25seSBpbmZsdWVuY2VzIHRoZSBvdXRwdXQgc3RhcnQgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFRpbWV6b25lPzogTWF5YmU8VGltZXpvbmVTdHJpbmc+O1xuICAvKipcbiAgICogQ3VycmVudCB0aW1lem9uZSBub3JtYWwgd2l0aCB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFRpbWV6b25lTm9ybWFsPzogTWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+O1xuICAvKipcbiAgICogRGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXhGYWN0b3J5OiBEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5O1xuICAvKipcbiAgICogQXJyYXkgb2YgbWFudWFsbHkgc2VsZWN0ZWQgZGF0ZXMgd2l0aGluIHRoZSBwaWNrZWQgcmFuZ2UuIFRoaXMgaXMgTk9UIHRoZSBzZXQgb2YgYWxsIHNlbGVjdGVkIGluZGV4ZXMgaW4gdGVybXMgb2Ygb3V0cHV0LlxuICAgKlxuICAgKiBWYWx1ZXMgdGhhdCBleGlzdCBvdXRzaWRlIG9mIHRoZSBcImlucHV0XCIgcmFuZ2UgYXJlIGNvbnNpZGVyZWQgdG9nZ2xlZCBvbiwgd2hpbGUgdGhvc2VcbiAgICogdGhhdCBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9mZi5cbiAgICpcbiAgICogSWYgZGF0ZXMgYXJlIHNlbGVjdGVkLCBhbmQgdGhlbiBhIHJhbmdlIGlzIHNlbGVjdGVkLCB0aGVuIHRob3NlIGRhdGVzIHdpdGhpbiB0aGUgcmFuZ2UgdGhhdCBmYWxsXG4gICAqIHdpdGhpbiB0aGUgcmFuZ2UgYXJlIGNsZWFyZWQgZnJvbSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIFRoZXNlIGluZGV4ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9nZ2xlZEluZGV4ZXM6IFNldDxEYXRlQ2VsbEluZGV4PjtcbiAgLyoqXG4gICAqIERheXMgb2YgdGhlIHNjaGVkdWxlIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgcGlja2VkLiBJZiBub3QgZGVmaW5lZCwgZGVmYXVsdHMgdG8gZGVmYXVsdFNjaGVkdWxlRGF5cy5cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlRGF5cz86IE1heWJlPFNldDxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT4+O1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgRGF0ZUNlbGxTY2hlZHVsZURheUNvZGUgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSBlZmZlY3RpdmVTY2hlZHVsZURheXM6IFNldDxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT47XG4gIC8qKlxuICAgKiBTZXQgb2YgdGhlIGRheXMgb2Ygd2VlayB0aGF0IGFyZSBhbGxvd2VkLiBEZXJpdmVkIGZyb20gdGhlIGN1cnJlbnQgc2NoZWR1bGUgZGF5cyB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWREYXlzT2ZXZWVrOiBTZXQ8RGF5T2ZXZWVrPjtcbiAgLyoqXG4gICAqXG4gICAqL1xuICByZWFkb25seSBpbmRleERheU9mV2VlazogRGF0ZUNlbGxEYXlPZldlZWtGYWN0b3J5O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkIGdpdmVuIHRoZSBjdXJyZW50IGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZEZpbHRlckRheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgdGhlIGN1cnJlbnQgZmlsdGVyIGludG8gYWNjb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZERheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICAvKipcbiAgICogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSBmb3IgdGhlIHZpZXcuXG4gICAqL1xuICByZWFkb25seSBjZWxsQ29udGVudEZhY3Rvcnk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3Rvcnk7XG4gIC8qKlxuICAgKiBDdXJyZW50IHNlbGVjdGlvbiB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZT86IE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZT47XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIGZpbHRlciBhcyB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZSBpbnN0ZWFkIG9mIG9wdGltaXppbmcgZm9yIHRoZSBjdXJyZW50IGluZGV4LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXI/OiBNYXliZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHNlbGVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBjYWxlbmRhciBpcyByZXNldC5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxTZWxlY3Rpb25TdGF0ZT86IE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKCk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IGRlZmF1bHRTY2hlZHVsZURheXMgPSBuZXcgU2V0KFtEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZS5XRUVLREFZLCBEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZS5XRUVLRU5EXSk7XG4gIGNvbnN0IGFsbG93ZWREYXlzT2ZXZWVrID0gZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQoZGVmYXVsdFNjaGVkdWxlRGF5cyk7XG4gIGNvbnN0IGRlZmF1bHRTdGFydHNBdCA9IGRhdGVDZWxsVGltaW5nU3RhcnRzQXRGb3JTdGFydE9mRGF5KCk7IC8vIGdldCBtaWRuaWdodCBvZiB0aGUgY3VycmVudCB0aW1lem9uZVxuICBjb25zdCB7IHN0YXJ0c0F0LCB0aW1lem9uZTogc3lzdGVtVGltZXpvbmUgfSA9IGRlZmF1bHRTdGFydHNBdDtcbiAgY29uc3QgaW5kZXhGYWN0b3J5ID0gZGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeShkZWZhdWx0U3RhcnRzQXQpO1xuICBjb25zdCBpbmRleERheU9mV2VlayA9IGRhdGVDZWxsRGF5T2ZXZWVrRmFjdG9yeShzdGFydHNBdCk7XG5cbiAgcmV0dXJuIHtcbiAgICBzZWxlY3Rpb25Nb2RlOiAnbXVsdGlwbGUnLFxuICAgIHN0YXJ0OiBzdGFydHNBdCxcbiAgICBzeXN0ZW1UaW1lem9uZSxcbiAgICBpbmRleEZhY3RvcnksXG4gICAgdG9nZ2xlZEluZGV4ZXM6IG5ldyBTZXQoKSxcbiAgICBkZWZhdWx0U2NoZWR1bGVEYXlzLFxuICAgIGVmZmVjdGl2ZVNjaGVkdWxlRGF5czogZGVmYXVsdFNjaGVkdWxlRGF5cyxcbiAgICBhbGxvd2VkRGF5c09mV2VlayxcbiAgICBpbmRleERheU9mV2VlayxcbiAgICBpc0VuYWJsZWRGaWx0ZXJEYXk6ICgpID0+IHRydWUsXG4gICAgaXNFbmFibGVkRGF5OiAoKSA9PiBmYWxzZSxcbiAgICBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcjogdHJ1ZSxcbiAgICBjZWxsQ29udGVudEZhY3Rvcnk6IGRlZmF1bHRDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5XG4gIH07XG59XG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIGluIGNhc2VzIHdoZXJlIHRoZSBkYXRlcyBpbiB0aGUgbWluL21heCBkYXRlIHJhbmdlIG5lZWQgdG8gYmUgc2hpZnRlZCB0byB0aGUgZmlsdGVyJ3MgdGltZXpvbmUuXG4gKlxuICogVGhpcyBpcyBiZWNhdXNlIHRoZSBpbmRleCBmYWN0b3J5IGlzIGFsd2F5cyBpbiBzeXN0ZW0gdGltZXpvbmUsIGJ1dCB3aGVuIHNlbGVjdGluZyBhbGwvbm9uZSB3aXRoIGEgZmlsdGVyIHdlIG5lZWQgdG8gdXNlIHRoZSBmaWx0ZXIncyB0aW1lem9uZS5cbiAqXG4gKiBAcGFyYW0geFxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZVJlbGF0aXZlVG9GaWx0ZXIoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ21pbk1heERhdGVSYW5nZSc+KTogUGFydGlhbDxEYXRlUmFuZ2U+IHtcbiAgbGV0IGlucHV0OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4gPSB4O1xuXG4gIGlmICh4LmZpbHRlcj8udGltZXpvbmUgJiYgeC5taW5NYXhEYXRlUmFuZ2UgIT0gbnVsbCkge1xuICAgIGNvbnN0IGZpbHRlck5vcm1hbCA9IGRhdGVUaW1lem9uZVV0Y05vcm1hbCh4LmZpbHRlci50aW1lem9uZSk7XG4gICAgY29uc3QgdHJhbnNmb3JtRm4gPSBmaWx0ZXJOb3JtYWwudHJhbnNmb3JtRnVuY3Rpb24oJ3N5c3RlbURhdGVUb1RhcmdldERhdGUnKTtcblxuICAgIGlucHV0ID0ge1xuICAgICAgZmlsdGVyOiB4LmZpbHRlcixcbiAgICAgIG1pbk1heERhdGVSYW5nZToge1xuICAgICAgICBzdGFydDogeC5taW5NYXhEYXRlUmFuZ2Uuc3RhcnQgPyB0cmFuc2Zvcm1Gbih4Lm1pbk1heERhdGVSYW5nZS5zdGFydCkgOiB1bmRlZmluZWQsXG4gICAgICAgIGVuZDogeC5taW5NYXhEYXRlUmFuZ2UuZW5kID8gdHJhbnNmb3JtRm4oeC5taW5NYXhEYXRlUmFuZ2UuZW5kKSA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZShpbnB1dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlKHg6IFBpY2s8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCAnZmlsdGVyJyB8ICdtaW5NYXhEYXRlUmFuZ2UnPik6IFBhcnRpYWw8RGF0ZVJhbmdlPiB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGNhbGVuZGFyU2NoZWR1bGVNaW5EYXRlKHgpIHx8IHVuZGVmaW5lZCxcbiAgICBlbmQ6IGNhbGVuZGFyU2NoZWR1bGVNYXhEYXRlKHgpIHx8IHVuZGVmaW5lZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1pbkRhdGUoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ21pbk1heERhdGVSYW5nZSc+KTogTWF5YmU8RGF0ZT4ge1xuICByZXR1cm4gZmluZE1heERhdGUoW3guZmlsdGVyPy5zdGFydCwgeC5taW5NYXhEYXRlUmFuZ2U/LnN0YXJ0XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWF4RGF0ZSh4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4pOiBNYXliZTxEYXRlPiB7XG4gIHJldHVybiBmaW5kTWluRGF0ZShbeC5maWx0ZXI/LmVuZCwgeC5taW5NYXhEYXRlUmFuZ2U/LmVuZF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcih4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXInPikge1xuICByZXR1cm4geC5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciAmJiB4LmZpbHRlcj8uc3RhcnQgIT0gbnVsbDsgLy8gbWF5IGJlIHVzaW5nIGVpdGhlclxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlIGV4dGVuZHMgQ29tcG9uZW50U3RvcmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGluaXRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoKSk7XG4gIH1cblxuICAvLyBNQVJLOlxuICByZWFkb25seSB0b2dnbGVTZWxlY3Rpb24gPSB0aGlzLmVmZmVjdCgoaW5wdXQ6IE9ic2VydmFibGU8dm9pZD4pID0+IHtcbiAgICByZXR1cm4gaW5wdXQucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICB0aGlzLm5leHRUb2dnbGVTZWxlY3Rpb24kLnBpcGUoXG4gICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICBmaWx0ZXJNYXliZSgpLFxuICAgICAgICAgIHRhcCgoeCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxEYXRlcyh4KTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gTUFSSzogQWNjZXNzb3JzXG4gIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguc2VsZWN0aW9uTW9kZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGZpbHRlciQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5maWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBtaW5NYXhEYXRlUmFuZ2UkID0gdGhpcy5zdGF0ZSQucGlwZShtYXAoY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVSYW5nZSksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBtaW5EYXRlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uc3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG4gIHJlYWRvbmx5IG1heERhdGUkID0gdGhpcy5taW5NYXhEYXRlUmFuZ2UkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5lbmQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaGFzQ29uZmlndXJlZE1pbk1heFJhbmdlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geCAhPSBudWxsICYmIHguc3RhcnQgIT0gbnVsbCAmJiB4LmVuZCAhPSBudWxsKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRTdGFydCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pbnB1dFN0YXJ0KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlucHV0RW5kJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlucHV0RW5kKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRJbnB1dFJhbmdlJDogT2JzZXJ2YWJsZTxNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0pID0+ICh7IHN0YXJ0OiBpbnB1dFN0YXJ0LCBlbmQ6IGlucHV0RW5kIH0pKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gaXNTYW1lRGF0ZVJhbmdlKGEgYXMgRGF0ZVJhbmdlLCBiIGFzIERhdGVSYW5nZSkpLFxuICAgIG1hcCgoeCkgPT4gKHsgaW5wdXRTdGFydDogeC5zdGFydCwgaW5wdXRFbmQ6IHguZW5kIH0pKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4LmlucHV0U3RhcnQgJiYgeC5pbnB1dEVuZCkge1xuICAgICAgICByZXR1cm4geCBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZSQ6IE9ic2VydmFibGU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPiA9IHRoaXMuY3VycmVudElucHV0UmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gdmFsdWUuIFRoaXMgaXMgdGhlIHNldCBvZiBtYW51YWxseSB0b2dnZWQgb2ZmIGRhdGVzLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdXBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWREYXRlcyQ6IE9ic2VydmFibGU8U2V0PERhdGVDZWxsSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnRvZ2dsZWRJbmRleGVzKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRmlsdGVyRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0Pj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pc0VuYWJsZWRGaWx0ZXJEYXkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0VuYWJsZWREYXlGdW5jdGlvbiQ6IE9ic2VydmFibGU8RGVjaXNpb25GdW5jdGlvbjxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzRW5hYmxlZERheSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGVSYW5nZShhLCBiKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciQ6IE9ic2VydmFibGU8TWF5YmU8Ym9vbGVhbj4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyJDogT2JzZXJ2YWJsZTxNYXliZTxib29sZWFuPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIC8vXG4gICAgbWFwKGNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVSYW5nZT4gPSB0aGlzLmN1cnJlbnREYXRlUmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGFsbG93ZWREYXlzT2ZXZWVrJDogT2JzZXJ2YWJsZTxTZXQ8RGF5T2ZXZWVrPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5hbGxvd2VkRGF5c09mV2VlayksXG4gICAgZGlzdGluY3RVbnRpbEhhc0RpZmZlcmVudFZhbHVlcygpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNJbkFsbG93ZWREYXlzT2ZXZWVrRnVuY3Rpb24kID0gdGhpcy5hbGxvd2VkRGF5c09mV2VlayQucGlwZShcbiAgICBtYXAoKHgpID0+IGlzSW5BbGxvd2VkRGF5c09mV2Vla1NldCh4KSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzY2hlZHVsZURheXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguZWZmZWN0aXZlU2NoZWR1bGVEYXlzKSxcbiAgICBkaXN0aW5jdFVudGlsSGFzRGlmZmVyZW50VmFsdWVzKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBvdXRwdXRUaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Lm91dHB1dFRpbWV6b25lKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lem9uZSBvZiB0aGUgb3V0cHV0IHZhbHVlcy5cbiAgICpcbiAgICogSWYgYW4gb3V0cHV0VGltZXpvbmUgaXMgbm90IHNwZWNpZmllZCwgdGhpcyBkZWZhdWx0cyB0byB0aGUgc3lzdGVtIHRpbWV6b25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0aXZlT3V0cHV0VGltZXpvbmUkOiBPYnNlcnZhYmxlPFRpbWV6b25lU3RyaW5nPiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Lm91dHB1dFRpbWV6b25lIHx8IHguc3lzdGVtVGltZXpvbmUpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvKipcbiAgICogQW4gb3V0cHV0VGltZXpvbmVOb3JtYWwgdG8gdXNlLlxuICAgKlxuICAgKiBJZiBhbiBvdXRwdXRUaW1lem9uZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGlzIGlzIHVuZGVmaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZU91dHB1dFRpbWV6b25lTm9ybWFsJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4Lm91dHB1dFRpbWV6b25lTm9ybWFsID8geC5vdXRwdXRUaW1lem9uZU5vcm1hbCA6IHVuZGVmaW5lZCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY3VycmVudFNlbGVjdGlvblZhbHVlKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlU3RhcnQkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5kYXRlU2NoZWR1bGVSYW5nZS5zdGFydCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQ2VsbFRpbWluZ0RhdGVGYWN0b3J5JCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKHggPyBkYXRlQ2VsbFRpbWluZ0RhdGVGYWN0b3J5KHsgc3RhcnRzQXQ6IHguZGF0ZVNjaGVkdWxlUmFuZ2Uuc3RhcnQsIHRpbWV6b25lOiB4LmRhdGVTY2hlZHVsZVJhbmdlLnRpbWV6b25lIH0pIDogdW5kZWZpbmVkKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQ2VsbER1cmF0aW9uU3BhbkV4cGFuc2lvbiQ6IE9ic2VydmFibGU8RGF0ZUNlbGxEdXJhdGlvblNwYW48RGF0ZUNlbGw+W10+ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IGV4cGFuZERhdGVDZWxsU2NoZWR1bGVSYW5nZSh7IGRhdGVDZWxsU2NoZWR1bGVSYW5nZTogeC5kYXRlU2NoZWR1bGVSYW5nZSB9KSA6IFtdKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZVNlbGVjdGVkSW5kZXhlcyQ6IE9ic2VydmFibGU8U2V0PERhdGVDZWxsSW5kZXg+PiA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlRGF0ZUNlbGxEdXJhdGlvblNwYW5FeHBhbnNpb24kLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBuZXcgU2V0KHgubWFwKCh5KSA9PiB5LmkpKSksXG4gICAgZGlzdGluY3RVbnRpbEhhc0RpZmZlcmVudFZhbHVlcygpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVTZWxlY3RlZERhdGVzJDogT2JzZXJ2YWJsZTxTZXQ8SVNPODYwMURheVN0cmluZz4+ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQ2VsbFRpbWluZ0RhdGVGYWN0b3J5JC5waXBlKFxuICAgIHN3aXRjaE1hcCgoZGF0ZUZhY3RvcnkpID0+IHtcbiAgICAgIHJldHVybiBkYXRlRmFjdG9yeSA/IHRoaXMuc2VsZWN0aW9uVmFsdWVTZWxlY3RlZEluZGV4ZXMkLnBpcGUobWFwKCh4KSA9PiBtYXBWYWx1ZXNUb1NldCh4LCAoeSkgPT4gZm9ybWF0VG9JU084NjAxRGF5U3RyaW5nKGRhdGVGYWN0b3J5KHkpKSkpKSA6IG9mKG5ldyBTZXQ8SVNPODYwMURheVN0cmluZz4oKSk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZSQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMuZWZmZWN0aXZlT3V0cHV0VGltZXpvbmVOb3JtYWwkKSxcbiAgICBtYXAoKFt4LCB0aW1lem9uZU5vcm1hbF0pID0+IHtcbiAgICAgIGxldCBjdXJyZW50VmFsdWVXaXRoVGltZXpvbmUgPSB4O1xuXG4gICAgICBpZiAoeCAmJiB0aW1lem9uZU5vcm1hbCkge1xuICAgICAgICBjdXJyZW50VmFsdWVXaXRoVGltZXpvbmUgPSB7XG4gICAgICAgICAgZGF0ZVNjaGVkdWxlUmFuZ2U6IGNoYW5nZURhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2VUb1RpbWV6b25lKHguZGF0ZVNjaGVkdWxlUmFuZ2UsIHRpbWV6b25lTm9ybWFsKSxcbiAgICAgICAgICBtaW5NYXhSYW5nZTogeC5taW5NYXhSYW5nZVxuICAgICAgICB9IGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZVdpdGhUaW1lem9uZTtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lRGF0ZUNlbGxEdXJhdGlvblNwYW5FeHBhbnNpb24kOiBPYnNlcnZhYmxlPERhdGVDZWxsRHVyYXRpb25TcGFuPERhdGVDZWxsPltdPiA9IHRoaXMuc2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBleHBhbmREYXRlQ2VsbFNjaGVkdWxlUmFuZ2UoeyBkYXRlQ2VsbFNjaGVkdWxlUmFuZ2U6IHguZGF0ZVNjaGVkdWxlUmFuZ2UgfSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgbmV4dFRvZ2dsZVNlbGVjdGlvbiQ6IE9ic2VydmFibGU8TWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPj4gPSB0aGlzLmhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSkgPT4ge1xuICAgICAgbGV0IG9iczogT2JzZXJ2YWJsZTxNYXliZTxBbGxPck5vbmVTZWxlY3Rpb24+PjtcblxuICAgICAgaWYgKGhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSkge1xuICAgICAgICBvYnMgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShtYXAoKHgpID0+ICh4ID8gJ25vbmUnIDogJ2FsbCcpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYnMgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShtYXAoKHgpID0+ICh4ID8gJ25vbmUnIDogdW5kZWZpbmVkKSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JzO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudERhdGVDZWxsU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2UpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZUNlbGxTY2hlZHVsZVJhbmdlVmFsdWUkID0gdGhpcy5jdXJyZW50RGF0ZUNlbGxTY2hlZHVsZVJhbmdlVmFsdWUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGNlbGxDb250ZW50RmFjdG9yeSQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5jZWxsQ29udGVudEZhY3RvcnkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0N1c3RvbWl6ZWQkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHgudG9nZ2xlZEluZGV4ZXMuc2l6ZSA+IDApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc1ZpZXdSZWFkb25seSQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pc1ZpZXdSZWFkb25seSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8vIE1BUks6IFN0YXRlIENoYW5nZXNcbiAgcmVhZG9ubHkgc2V0TWluTWF4RGF0ZVJhbmdlID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aE1pbk1heERhdGVSYW5nZSk7XG4gIHJlYWRvbmx5IHNldERlZmF1bHRXZWVrID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aE1pbk1heERhdGVSYW5nZSk7XG4gIHJlYWRvbmx5IHNldEZpbHRlciA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIpO1xuICByZWFkb25seSBzZXRFeGNsdXNpb25zID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aEV4Y2x1c2lvbnMpO1xuICByZWFkb25seSBzZXRDb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhDb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcik7XG4gIHJlYWRvbmx5IGNsZWFyRmlsdGVyID0gdGhpcy51cGRhdGVyKChzdGF0ZSkgPT4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCB1bmRlZmluZWQpKTtcblxuICByZWFkb25seSBzZXRPdXRwdXRUaW1lem9uZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhUaW1lem9uZVZhbHVlKTtcbiAgLyoqXG4gICAqIFNldHMgdGhlIFwiaW5wdXRcIiBkYXRlIHJhbmdlLiBUaGlzIGlzIHRoZSByYW5nZSB0aGF0IGdldHMgZGlzcGxheWVkIG9uIHRoZSBkYXRlIHJhbmdlIHBpY2tlci5cbiAgICovXG4gIHJlYWRvbmx5IHNldElucHV0UmFuZ2UgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFJhbmdlKTtcblxuICAvLyBOT1RFOiBTZWxlY3RlZCBkYXRlcyBhcmUgTk9UIHNlbGVjdGVkIGluZGV4ZXMuIFRoZXkgYXJlIHRoZSBpbnRlcm5hbCBzZWxlY3RlZCBkYXRlcyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHRoZSBzZWxlY3Rpb24uXG4gIHJlYWRvbmx5IHRvZ2dsZVNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCB0b2dnbGU6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgdG9nZ2xlIH0pKTtcbiAgcmVhZG9ubHkgYWRkU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGFkZDogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBhZGQgfSkpO1xuICByZWFkb25seSByZW1vdmVTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgcmVtb3ZlOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHJlbW92ZSB9KSk7XG4gIHJlYWRvbmx5IHNldFNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzZXQ6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2V0IH0pKTtcbiAgcmVhZG9ubHkgc2VsZWN0QWxsRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzZWxlY3RBbGw6IEFsbE9yTm9uZVNlbGVjdGlvbiA9ICdhbGwnKSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2VsZWN0QWxsIH0pKTtcblxuICAvLyBOT1RFOiBTZWxlY3RlZCBpbmRleGVzIGFyZSB0aGUgdHlwaWNhbC9leHBlY3RlZCBpbmRleGVzIHRoYXQgYXJlIHNlbGVjdGVkIG9yIG5vdC5cbiAgcmVhZG9ubHkgc2V0U2VsZWN0ZWRJbmRleGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2V0OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNldCwgaW52ZXJ0U2V0QmVoYXZpb3I6IHRydWUgfSkpO1xuICByZWFkb25seSBzZXRJbml0aWFsU2VsZWN0aW9uU3RhdGUgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoSW5pdGlhbFNlbGVjdGlvblN0YXRlKTtcblxuICByZWFkb25seSBzZXREZWZhdWx0U2NoZWR1bGVEYXlzID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREZWZhdWx0U2NoZWR1bGVEYXlzKTtcbiAgcmVhZG9ubHkgc2V0U2NoZWR1bGVEYXlzID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMpO1xuICByZWFkb25seSBzZXRBbGxvd0FsbFNjaGVkdWxlRGF5cyA9IHRoaXMudXBkYXRlcigoc3RhdGUpID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMoc3RhdGUsIFtEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZS5XRUVLREFZLCBEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZS5XRUVLRU5EXSkpO1xuXG4gIHJlYWRvbmx5IHNldERhdGVTY2hlZHVsZVJhbmdlVmFsdWUgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCB2YWx1ZTogTWF5YmU8RnVsbERhdGVDZWxsU2NoZWR1bGVSYW5nZUlucHV0RGF0ZVJhbmdlPikgPT4gdXBkYXRlU3RhdGVXaXRoRGF0ZUNlbGxTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGUsIHZhbHVlKSk7XG4gIHJlYWRvbmx5IHNldENlbGxDb250ZW50RmFjdG9yeSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSkgPT4gKHsgLi4uc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeSB9KSk7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNlbGVjdGlvbiBtb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0U2VsZWN0aW9uTW9kZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhTZWxlY3Rpb25Nb2RlKTtcblxuICAvKipcbiAgICogVXNlZCBieSB0aGUgcGFyZW50IHZpZXcgdG8gcHJvcG9nYXRlIGEgcmVhZG9ubHkgc3RhdGUuXG4gICAqXG4gICAqIFNob3VsZCB0eXBpY2FsbHkgbm90IGJlIHVzZWQgYnkgdGhlIHVzZXIgZGlyZWN0bHkgd2l0aCB0aGUgaW50ZW50aW9uIG9mIHRoZSBwYXJlbnQgc3luY2hyb25pemluZyB0byB0aGlzIHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0Vmlld1JlYWRvbmx5U3RhdGUgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBpc1ZpZXdSZWFkb25seTogYm9vbGVhbikgPT4gKHsgLi4uc3RhdGUsIGlzVmlld1JlYWRvbmx5IH0pKTtcblxuICAvLyBNQVJLOiBDb21wYXRcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZXRPdXRwdXRUaW1lem9uZSBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0VGltZXpvbmUgPSB0aGlzLnNldE91dHB1dFRpbWV6b25lO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugb3VwdXRUaW1lem9uZSRcbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRUaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMub3V0cHV0VGltZXpvbmUkO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZWZmZWN0aXZlT3VwdXRUaW1lem9uZSRcbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZVRpbWV6b25lJDogT2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+ID0gdGhpcy5lZmZlY3RpdmVPdXRwdXRUaW1lem9uZSQ7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBlZmZlY3RpdmVPdXB1dFRpbWV6b25lTm9ybWFsJFxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0aXZlVGltZXpvbmVOb3JtYWwkID0gdGhpcy5lZmZlY3RpdmVPdXRwdXRUaW1lem9uZU5vcm1hbCQ7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBjdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQ2VsbER1cmF0aW9uU3BhbkV4cGFuc2lvbiRcbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZURhdGVCbG9ja0R1cmF0aW9uU3BhbiQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZURhdGVDZWxsRHVyYXRpb25TcGFuRXhwYW5zaW9uJDtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lRGF0ZUNlbGxEdXJhdGlvblNwYW5FeHBhbnNpb24kXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZURhdGVCbG9ja0R1cmF0aW9uU3BhbiQgPSB0aGlzLnNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lRGF0ZUNlbGxEdXJhdGlvblNwYW5FeHBhbnNpb24kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoSW5pdGlhbFNlbGVjdGlvblN0YXRlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGluaXRpYWxTZWxlY3Rpb25TdGF0ZTogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgdG9nZ2xlZEluZGV4ZXMgfSA9IHN0YXRlO1xuXG4gIGlmICh0b2dnbGVkSW5kZXhlcy5zaXplID09PSAwICYmIGluaXRpYWxTZWxlY3Rpb25TdGF0ZSA9PT0gJ2FsbCcpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBzZWxlY3RBbGw6IGluaXRpYWxTZWxlY3Rpb25TdGF0ZSB9KTtcbiAgfVxuXG4gIHJldHVybiB7IC4uLnN0YXRlLCBpbml0aWFsU2VsZWN0aW9uU3RhdGUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKGN1cnJlbnRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcjogTWF5YmU8Ym9vbGVhbj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBsZXQgc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSA9IHsgLi4uY3VycmVudFN0YXRlLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciB9O1xuXG4gIGlmIChCb29sZWFuKGN1cnJlbnRTdGF0ZS5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcikgIT09IEJvb2xlYW4oY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHt9KTsgLy8gcmVjYWxjdWxhdGUgaWYgY2hhbmdlIG9jY3VycyBhcyBpdCB3aWxsIGFmZmVjdCB0aGUgb3V0cHV0IHZhbHVlXG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhFeGNsdXNpb25zKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGlucHV0RXhjbHVzaW9uczogTWF5YmU8QXJyYXlPclZhbHVlPERhdGVPckRhdGVSYW5nZU9yRGF0ZUNlbGxJbmRleE9yRGF0ZUNlbGxSYW5nZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbGV0IGNvbXB1dGVkRXhjbHVzaW9uczogTWF5YmU8RGF0ZUNlbGxJbmRleFtdPjtcblxuICBpZiAoaW5wdXRFeGNsdXNpb25zKSB7XG4gICAgY29uc3QgeyBpbmRleEZhY3RvcnkgfSA9IHN0YXRlO1xuICAgIGNvbnN0IGluZGV4QXJyYXlGYWN0b3J5ID0gZGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4QXJyYXlGYWN0b3J5KGluZGV4RmFjdG9yeSk7XG4gICAgY29tcHV0ZWRFeGNsdXNpb25zID0gaW5kZXhBcnJheUZhY3RvcnkoaW5wdXRFeGNsdXNpb25zKTtcbiAgfVxuXG4gIHN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRFeGNsdXNpb25zLCBjb21wdXRlZEV4Y2x1c2lvbnMgfTtcbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZSwgc3RhdGUuZmlsdGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aE1pbk1heERhdGVSYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBtaW5NYXhEYXRlUmFuZ2U6IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBpZiAobWluTWF4RGF0ZVJhbmdlICE9IG51bGwgJiYgIWlzSW5maW5pdGVEYXRlUmFuZ2UobWluTWF4RGF0ZVJhbmdlKSkge1xuICAgIHN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBtaW5NYXhEYXRlUmFuZ2U6IHtcbiAgICAgICAgc3RhcnQ6IG1pbk1heERhdGVSYW5nZS5zdGFydCAhPSBudWxsID8gc3RhcnRPZkRheShtaW5NYXhEYXRlUmFuZ2Uuc3RhcnQpIDogdW5kZWZpbmVkLFxuICAgICAgICBlbmQ6IG1pbk1heERhdGVSYW5nZS5lbmQgIT0gbnVsbCA/IGVuZE9mRGF5KG1pbk1heERhdGVSYW5nZS5lbmQpIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZSA9IHsgLi4uc3RhdGUsIG1pbk1heERhdGVSYW5nZTogdW5kZWZpbmVkIH07XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCBzdGF0ZS5maWx0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKGN1cnJlbnRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBpbnB1dEZpbHRlcjogTWF5YmU8RGF0ZUNlbGxTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBjb21wdXRlZEV4Y2x1c2lvbnM6IGV4Y2x1c2lvbnMsIG1pbk1heERhdGVSYW5nZSwgc3lzdGVtVGltZXpvbmUgfSA9IGN1cnJlbnRTdGF0ZTtcblxuICBsZXQgaXNFbmFibGVkRmlsdGVyRGF5OiBNYXliZTxEZWNpc2lvbkZ1bmN0aW9uPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4+ID0gKCkgPT4gdHJ1ZTtcbiAgbGV0IGZpbHRlcjogTWF5YmU8RGF0ZUNlbGxTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc+ID0gbnVsbDtcblxuICAvLyBjcmVhdGUgdGhlIGZpbHRlciB1c2luZyBpbnB1dEZpbHRlciwgZXhjbHVzaW9ucywgYW5kIG1pbk1heERhdGVSYW5nZVxuICBpZiAoaW5wdXRGaWx0ZXIgfHwgZXhjbHVzaW9ucz8ubGVuZ3RoIHx8IG1pbk1heERhdGVSYW5nZSkge1xuICAgIGxldCBlbmFibGVkRmlsdGVyOiBEYXRlQ2VsbFNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZztcbiAgICBsZXQgZmlsdGVyU3RhcnQ6IE1heWJlPERhdGU+ID0gbnVsbDsgLy8gdGhlIHN0YXJ0IGRhdGUgdGhhdCB3aWxsIGJlIHVzZWQvc2V0IG9uIHRoZSBmaWx0ZXIuXG5cbiAgICBpZiAoaW5wdXRGaWx0ZXIpIHtcbiAgICAgIGZpbHRlciA9IGNvcHlEYXRlQ2VsbFNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZyhpbnB1dEZpbHRlcik7IC8vIGNvcHkgZmlsdGVyXG5cbiAgICAgIGxldCBuZXh0RmlsdGVyVGltZXpvbmU6IFRpbWV6b25lU3RyaW5nIHwgdW5kZWZpbmVkOyAvLyBvbmx5IHNldCBpZiBpbnB1dEZpbHRlci5zdGFydCBvciBpbnB1dEZpbHRlci5zdGFydHNBdFxuXG4gICAgICAvLyBjb25maWd1cmUgZmlsdGVyIHN0YXJ0XG4gICAgICBpZiAoaW5wdXRGaWx0ZXIuc3RhcnQpIHtcbiAgICAgICAgZmlsdGVyU3RhcnQgPSBpbnB1dEZpbHRlci5zdGFydDtcblxuICAgICAgICAvLyBpZiBubyB0aW1lem9uZSBpcyBzcGVjaWZpZWQsIHRoZW4gdXNlIHRoZSBzeXN0ZW0gdGltZXpvbmUgYW5kIGFsaWduIGZpbHRlclN0YXJ0IHRvIHRoZSBzdGFydCBvZiB0aGUgZGF5LlxuICAgICAgICBpZiAoIWlucHV0RmlsdGVyLnRpbWV6b25lKSB7XG4gICAgICAgICAgZmlsdGVyU3RhcnQgPSBTWVNURU1fREFURV9USU1FWk9ORV9VVENfTk9STUFMX0lOU1RBTkNFLnN0YXJ0T2ZEYXlJblRhcmdldFRpbWV6b25lKGlucHV0RmlsdGVyLnN0YXJ0c0F0KTtcbiAgICAgICAgICBuZXh0RmlsdGVyVGltZXpvbmUgPSBzeXN0ZW1UaW1lem9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0RmlsdGVyVGltZXpvbmUgPSBpbnB1dEZpbHRlci50aW1lem9uZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpbnB1dEZpbHRlci5zdGFydHNBdCkge1xuICAgICAgICBpZiAoaW5wdXRGaWx0ZXIudGltZXpvbmUpIHtcbiAgICAgICAgICAvLyBpZiBubyB0aW1lem9uZSBpcyBwcm92aWRlZCwgdXNlIHN0YXJ0c0F0IGFzLWlzXG4gICAgICAgICAgY29uc3QgdGltZXpvbmVOb3JtYWwgPSBkYXRlVGltZXpvbmVVdGNOb3JtYWwoaW5wdXRGaWx0ZXIudGltZXpvbmUpO1xuICAgICAgICAgIGZpbHRlclN0YXJ0ID0gdGltZXpvbmVOb3JtYWwuc3RhcnRPZkRheUluVGFyZ2V0VGltZXpvbmUoaW5wdXRGaWx0ZXIuc3RhcnRzQXQpO1xuICAgICAgICAgIG5leHRGaWx0ZXJUaW1lem9uZSA9IGlucHV0RmlsdGVyLnRpbWV6b25lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHNldCB0byB0aGUgc3RhcnQgb2YgdG9kYXkgaW4gdGhlIHN5c3RlbSB0aW1lem9uZS5cbiAgICAgICAgICBmaWx0ZXJTdGFydCA9IFNZU1RFTV9EQVRFX1RJTUVaT05FX1VUQ19OT1JNQUxfSU5TVEFOQ0Uuc3RhcnRPZkRheUluVGFyZ2V0VGltZXpvbmUoaW5wdXRGaWx0ZXIuc3RhcnRzQXQpO1xuICAgICAgICAgIG5leHRGaWx0ZXJUaW1lem9uZSA9IHN5c3RlbVRpbWV6b25lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZpbHRlci5zdGFydCA9IGZpbHRlclN0YXJ0ID8/IHVuZGVmaW5lZDtcbiAgICAgIGZpbHRlci50aW1lem9uZSA9IG5leHRGaWx0ZXJUaW1lem9uZTtcblxuICAgICAgLy8gY29uZmlndXJlIGV4Y2x1c2lvbnNcbiAgICAgIGlmIChleGNsdXNpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgZW5hYmxlZEZpbHRlciA9IHtcbiAgICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgICAgZXg6IHVuaXF1ZShtZXJnZUFycmF5cyhbZmlsdGVyLmV4LCBleGNsdXNpb25zXSkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmFibGVkRmlsdGVyID0gZmlsdGVyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbmFibGVkRmlsdGVyID0ge1xuICAgICAgICB3OiAnODknLFxuICAgICAgICBleDogZXhjbHVzaW9ucyBhcyBudW1iZXJbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWluTWF4RGF0ZVJhbmdlKSB7XG4gICAgICBlbmFibGVkRmlsdGVyLm1pbk1heERhdGVSYW5nZSA9IG1pbk1heERhdGVSYW5nZTtcbiAgICAgIGVuYWJsZWRGaWx0ZXIuc2V0U3RhcnRBc01pbkRhdGUgPSBmaWx0ZXJTdGFydCA/IHRydWUgOiBmYWxzZTsgLy8gSWYgYSBzdGFydCBkYXRlIGlzIHNldCwgdGhlbiBpdCBiZWNvbWVzIHRoZSBmbG9vci5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgaW5wdXQgZmlsdGVyIGhhcyBhIHN0YXJ0IGRhdGUsIHVzZSB0aGF0IGFzIHRoZSByZWxhdGl2ZSBzdGFydCB0byBlbnN1cmUgaW5kZXhlcyBhcmUgY29tcGFyZWQgdGhlIHNhbWUsXG4gICAgICogb3RoZXJ3aXNlIHVzZSB0aGUgc3RhdGUncyBzdGFydC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHRoZSBpbmRleCBjYWxjdWxhdGlvbnMuXG4gICAgICovXG4gICAgbGV0IGZpbmFsRW5hYmxlZFN0YXJ0OiBEYXRlO1xuICAgIGxldCBmaW5hbEVuYWJsZWRUaW1lem9uZTogVGltZXpvbmVTdHJpbmc7XG4gICAgLy8gIGZpbHRlcj8uc3RhcnQgPz8gc3RhdGUuc3RhcnQ7XG5cbiAgICBpZiAoIWVuYWJsZWRGaWx0ZXIuc3RhcnQpIHtcbiAgICAgIC8vIHVzZSB0aGUgY3VycmVudCBzdGF0ZSdzIHN0YXJ0LCBidXQgbWFrZSBzdXJlIGl0IGlzIGluIHRoZSBwcm9wZXIgdGltZXpvbmUuXG4gICAgICBpZiAoZW5hYmxlZEZpbHRlci50aW1lem9uZSkge1xuICAgICAgICBjb25zdCB0aW1lem9uZU5vcm1hbCA9IGRhdGVUaW1lem9uZVV0Y05vcm1hbChlbmFibGVkRmlsdGVyLnRpbWV6b25lKTtcbiAgICAgICAgZmluYWxFbmFibGVkU3RhcnQgPSB0aW1lem9uZU5vcm1hbC5zdGFydE9mRGF5SW5UYXJnZXRUaW1lem9uZShjdXJyZW50U3RhdGUuc3RhcnQpOyAvLyBnZXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXkgZm9yIHRoZSBjdXJyZW50IHN0YXJ0XG4gICAgICAgIGZpbmFsRW5hYmxlZFRpbWV6b25lID0gZW5hYmxlZEZpbHRlci50aW1lem9uZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFsRW5hYmxlZFN0YXJ0ID0gY3VycmVudFN0YXRlLnN0YXJ0O1xuICAgICAgICBmaW5hbEVuYWJsZWRUaW1lem9uZSA9IHN5c3RlbVRpbWV6b25lO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWVuYWJsZWRGaWx0ZXIudGltZXpvbmUpIHtcbiAgICAgIGZpbmFsRW5hYmxlZFRpbWV6b25lID0gc3lzdGVtVGltZXpvbmU7XG5cbiAgICAgIGNvbnN0IHRpbWV6b25lTm9ybWFsID0gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKGZpbmFsRW5hYmxlZFRpbWV6b25lKTtcbiAgICAgIGZpbmFsRW5hYmxlZFN0YXJ0ID0gdGltZXpvbmVOb3JtYWwuc3RhcnRPZkRheUluVGFyZ2V0VGltZXpvbmUoZW5hYmxlZEZpbHRlci5zdGFydCk7IC8vIGdldCB0aGUgc3RhcnQgb2YgdGhlIGRheSBmb3IgdGhlIHRhcmdldCB0aW1lem9uZVxuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbEVuYWJsZWRTdGFydCA9IGVuYWJsZWRGaWx0ZXIuc3RhcnQ7XG4gICAgICBmaW5hbEVuYWJsZWRUaW1lem9uZSA9IGVuYWJsZWRGaWx0ZXIudGltZXpvbmU7XG4gICAgfVxuXG4gICAgZW5hYmxlZEZpbHRlci5zdGFydCA9IGZpbmFsRW5hYmxlZFN0YXJ0O1xuICAgIGVuYWJsZWRGaWx0ZXIudGltZXpvbmUgPSBmaW5hbEVuYWJsZWRUaW1lem9uZTtcblxuICAgIC8vIGNyZWF0ZSB0aGUgZmlsdGVyXG4gICAgaXNFbmFibGVkRmlsdGVyRGF5ID0gZGF0ZUNlbGxTY2hlZHVsZURhdGVGaWx0ZXIoZW5hYmxlZEZpbHRlcik7XG4gIH1cblxuICBsZXQgbmV4dFN0YXRlOiBCdWlsZGluZzxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGU+ID0geyAuLi5jdXJyZW50U3RhdGUsIGZpbHRlciwgaXNFbmFibGVkRmlsdGVyRGF5IH07XG5cbiAgLy8gRm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBhYm92ZSwgdXNlIHRoZSBmaWx0ZXIncyBzdGFydCBkYXRlIGFzIHRoZSByZWxhdGl2ZSBzdGFydCBpZiBhcHBsaWNhYmxlLlxuICBpZiAoZmlsdGVyICYmIGZpbHRlci5zdGFydCkge1xuICAgIGxldCBzdGFydEZvclN5c3RlbVRpbWV6b25lOiBEYXRlID0gZmlsdGVyLnN0YXJ0O1xuXG4gICAgaWYgKGZpbHRlci50aW1lem9uZSkge1xuICAgICAgY29uc3QgdGltZXpvbmVOb3JtYWwgPSBkYXRlVGltZXpvbmVVdGNOb3JtYWwoZmlsdGVyLnRpbWV6b25lKTtcbiAgICAgIHN0YXJ0Rm9yU3lzdGVtVGltZXpvbmUgPSB0aW1lem9uZU5vcm1hbC5zeXN0ZW1EYXRlVG9UYXJnZXREYXRlKGZpbHRlci5zdGFydCk7IC8vIGdldCB0aGUgc3RhcnQgb2YgdGhlIGRheSBmb3IgdGhlIHN5c3RlbSB0aW1lem9uZVxuICAgIH1cblxuICAgIG5leHRTdGF0ZS5zdGFydCA9IHN0YXJ0Rm9yU3lzdGVtVGltZXpvbmU7XG4gICAgbmV4dFN0YXRlLmluZGV4RmFjdG9yeSA9IGRhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnkoeyBzdGFydHNBdDogc3RhcnRGb3JTeXN0ZW1UaW1lem9uZSwgdGltZXpvbmU6IHN5c3RlbVRpbWV6b25lIH0pO1xuICAgIG5leHRTdGF0ZS5pbmRleERheU9mV2VlayA9IGRhdGVDZWxsRGF5T2ZXZWVrRmFjdG9yeShzdGFydEZvclN5c3RlbVRpbWV6b25lKTtcbiAgfVxuXG4gIC8vIGF0dGVtcHQgdG8gcmUtYXBwbHkgdGhlIGluaXRpYWwgc2VsZWN0aW9uIHN0YXRlIG9uY2UgZmlsdGVyIGlzIGFwcGxpZWRcbiAgaWYgKG5leHRTdGF0ZS5pbml0aWFsU2VsZWN0aW9uU3RhdGUpIHtcbiAgICBuZXh0U3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhJbml0aWFsU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlIGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgbmV4dFN0YXRlLmluaXRpYWxTZWxlY3Rpb25TdGF0ZSk7XG4gIH1cblxuICAvLyByZS1jYWxjdWxhdGUgdGhlIHNlbGVjdGlvbiBnaXZlbiB0aGUgZmlsdGVyXG4gIGNvbnN0IHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSA9IG5leHRTdGF0ZTtcblxuICBpZiAoaW5wdXRTdGFydCAmJiBpbnB1dEVuZCkge1xuICAgIG5leHRTdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZShuZXh0U3RhdGUgYXMgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCB7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHRTdGF0ZSBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhUaW1lem9uZVZhbHVlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIHRpbWV6b25lOiBNYXliZTxUaW1lem9uZVN0cmluZz4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZSB9ID0gc3RhdGU7XG4gIGNvbnN0IHRpbWV6b25lTm9ybWFsID0gdGltZXpvbmUgPyBkYXRlVGltZXpvbmVVdGNOb3JtYWwoeyB0aW1lem9uZSB9KSA6IHVuZGVmaW5lZDtcblxuICBpZiAodGltZXpvbmVOb3JtYWwgJiYgY3VycmVudFNlbGVjdGlvblZhbHVlKSB7XG4gICAgLy8gdXBkYXRlIHRoZSBzZWxlY3Rpb24gdmFsdWUgdG8gcmVmbGVjdCB0aGUgdGltZXpvbmUgY2hhbmdlcy5cbiAgICBjb25zdCB7IGRhdGVTY2hlZHVsZVJhbmdlOiBjdXJyZW50RGF0ZUNlbGxTY2hlZHVsZVJhbmdlIH0gPSBjdXJyZW50U2VsZWN0aW9uVmFsdWU7XG4gICAgY29uc3Qgc3RhcnQgPSB0aW1lem9uZU5vcm1hbC50YXJnZXREYXRlVG9TeXN0ZW1EYXRlKGN1cnJlbnREYXRlQ2VsbFNjaGVkdWxlUmFuZ2Uuc3RhcnQpO1xuICAgIGNvbnN0IGVuZCA9IHRpbWV6b25lTm9ybWFsLnRhcmdldERhdGVUb1N5c3RlbURhdGUoY3VycmVudERhdGVDZWxsU2NoZWR1bGVSYW5nZS5lbmQpO1xuXG4gICAgY29uc3QgbmV3UmFuZ2U6IERhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2UgPSB7XG4gICAgICAuLi5jdXJyZW50U2VsZWN0aW9uVmFsdWUuZGF0ZVNjaGVkdWxlUmFuZ2UsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZFxuICAgIH07XG5cbiAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRGF0ZUNlbGxTY2hlZHVsZVJhbmdlVmFsdWUoeyAuLi5zdGF0ZSwgb3V0cHV0VGltZXpvbmU6IHRpbWV6b25lLCBvdXRwdXRUaW1lem9uZU5vcm1hbDogdGltZXpvbmVOb3JtYWwgfSwgbmV3UmFuZ2UpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IC4uLnN0YXRlLCBvdXRwdXRUaW1lem9uZTogdGltZXpvbmUsIG91dHB1dFRpbWV6b25lTm9ybWFsOiB0aW1lem9uZU5vcm1hbCB9OyAvLyBubyBjaGFuZ2UgaW4gdmFsdWVcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRGF0ZUNlbGxTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgaW5wdXRDaGFuZ2U6IE1heWJlPEZ1bGxEYXRlQ2VsbFNjaGVkdWxlUmFuZ2VJbnB1dERhdGVSYW5nZT4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZSwgc3lzdGVtVGltZXpvbmUgfSA9IHN0YXRlO1xuICBjb25zdCBjdXJyZW50RGF0ZUNlbGxTY2hlZHVsZVJhbmdlID0gY3VycmVudFNlbGVjdGlvblZhbHVlPy5kYXRlU2NoZWR1bGVSYW5nZTsgLy8gY3VycmVudCByYW5nZSBpcyBhbHdheXMgaW4gc3lzdGVtIHRpbWVcbiAgbGV0IGNoYW5nZTogTWF5YmU8UGljazxEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlLCAnc3RhcnQnIHwgJ2VuZCcgfCAnZXgnIHwgJ3cnIHwgJ3RpbWV6b25lJz4+O1xuXG4gIC8vIFdoZW4gdXNpbmcgdGltZXpvbmVzLCBhbHdheXMgcmV0dXJuIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkYXkuIElucHV0cyBhcmUgY29udmVydGVkIHRvIHRoZSBzeXN0ZW0gdGltZSBhbmQgdXNlZCBhcyB0aGUgc3RhcnQgb2YgdGhlIGRheS5cbiAgLy8gT3V0cHV0cyByZW1haW4gYWNjdXJhdGUuXG5cbiAgaWYgKGlucHV0Q2hhbmdlKSB7XG4gICAgLy8gbWFrZSBzdXJlIGEgdGltZXpvbmUgaXMgc2V0LiBJbnB1dCBtYXkgbm90IGhhdmUgYSB0aW1lem9uZSBhdHRhY2hlZC4gRGVmYXVsdCB0byBzeXN0ZW0gdGltZS5cbiAgICBjb25zdCBpbnB1dENoYW5nZVdpdGhUaW1lem9uZVNldCA9IHtcbiAgICAgIC4uLmlucHV0Q2hhbmdlLFxuICAgICAgdGltZXpvbmU6IGlucHV0Q2hhbmdlLnRpbWV6b25lID8/IHN5c3RlbVRpbWV6b25lXG4gICAgfTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgc2NoZWR1bGUgcmFuZ2VcbiAgICBjb25zdCBmdWxsQ2hhbmdlID0gZnVsbERhdGVDZWxsU2NoZWR1bGVSYW5nZSh7IGRhdGVDZWxsU2NoZWR1bGVSYW5nZTogaW5wdXRDaGFuZ2VXaXRoVGltZXpvbmVTZXQgfSk7XG4gICAgY29uc3QgaW5wdXROb3JtYWwgPSBkYXRlQ2VsbFRpbWluZ1RpbWV6b25lTm9ybWFsSW5zdGFuY2UoZnVsbENoYW5nZSk7XG5cbiAgICBjb25zdCBzdGFydEluU3lzdGVtVHogPSBpbnB1dE5vcm1hbC5zeXN0ZW1EYXRlVG9UYXJnZXREYXRlKGZ1bGxDaGFuZ2Uuc3RhcnQpO1xuICAgIGNvbnN0IGVuZEluU3lzdGVtVHogPSBzdGFydE9mRGF5KGlucHV0Tm9ybWFsLnN5c3RlbURhdGVUb1RhcmdldERhdGUoZnVsbENoYW5nZS5lbmQpKTtcblxuICAgIC8vIGNvbnZlcnQgdGhlIHN0YXJ0L2VuZCB0byBzeXN0ZW0gdGltZVxuICAgIGNoYW5nZSA9IHtcbiAgICAgIHN0YXJ0OiBzdGFydEluU3lzdGVtVHosXG4gICAgICBlbmQ6IGVuZEluU3lzdGVtVHosXG4gICAgICB3OiBmdWxsQ2hhbmdlLncsXG4gICAgICBleDogZnVsbENoYW5nZS5leCxcbiAgICAgIHRpbWV6b25lOiBmdWxsQ2hhbmdlLnRpbWV6b25lXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGlzU2FtZVZhbHVlID0gaXNTYW1lRGF0ZUNlbGxTY2hlZHVsZURhdGVSYW5nZShjdXJyZW50RGF0ZUNlbGxTY2hlZHVsZVJhbmdlLCBjaGFuZ2UpO1xuXG4gIGlmIChpc1NhbWVWYWx1ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoY2hhbmdlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRTdGFydDogY2hhbmdlLnN0YXJ0LCBpbnB1dEVuZDogY2hhbmdlLmVuZCwgdG9nZ2xlZEluZGV4ZXM6IG5ldyBTZXQoY2hhbmdlLmV4KSB9O1xuICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMoZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKSwgZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzKGNoYW5nZS53IHx8ICc4OScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vU2VsZWN0aW9uQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHN0YXRlKTsgLy8gY2xlYXIgc2VsZWN0aW9uLCByZXRhaW4gZGlzYWJsZWQgZGF5c1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERlZmF1bHRTY2hlZHVsZURheXMoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBNYXliZTxJdGVyYWJsZTxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBkZWZhdWx0U2NoZWR1bGVEYXlzOiBjdXJyZW50RGVmYXVsdFNjaGVkdWxlRGF5cyB9ID0gc3RhdGU7XG4gIGNvbnN0IGRlZmF1bHRTY2hlZHVsZURheXMgPSBuZXcgU2V0KGNoYW5nZSA/PyBmdWxsV2Vla0RhdGVDZWxsU2NoZWR1bGVEYXlDb2RlcygpKTtcblxuICBpZiAoZGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzQXJlU2V0c0VxdWl2YWxlbnQoZGVmYXVsdFNjaGVkdWxlRGF5cywgY3VycmVudERlZmF1bHRTY2hlZHVsZURheXMpKSB7XG4gICAgcmV0dXJuIHN0YXRlOyAvLyBubyBjaGFuZ2VcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmluYWxpemVVcGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCB7IC4uLnN0YXRlLCBkZWZhdWx0U2NoZWR1bGVEYXlzIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogTWF5YmU8SXRlcmFibGU8RGF0ZUNlbGxTY2hlZHVsZURheUNvZGU+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgc2NoZWR1bGVEYXlzOiBjdXJyZW50U2NoZWR1bGVEYXlzIH0gPSBzdGF0ZTtcbiAgY29uc3Qgc2NoZWR1bGVEYXlzID0gbmV3IFNldChjaGFuZ2UgPz8gW10pO1xuXG4gIGxldCBuZXdTY2hlZHVsZURheXM6IFNldDxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50U2NoZWR1bGVEYXlzICE9IG51bGwgJiYgY2hhbmdlICE9IG51bGwpIHtcbiAgICBpZiAoZGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzQXJlU2V0c0VxdWl2YWxlbnQoc2NoZWR1bGVEYXlzLCBjdXJyZW50U2NoZWR1bGVEYXlzKSkge1xuICAgICAgbmV3U2NoZWR1bGVEYXlzID0gdW5kZWZpbmVkOyAvL25vIGNoYW5nZVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTY2hlZHVsZURheXMgPSBzY2hlZHVsZURheXM7XG4gICAgfVxuICB9IGVsc2UgaWYgKGN1cnJlbnRTY2hlZHVsZURheXMgIT09IGNoYW5nZSkge1xuICAgIG5ld1NjaGVkdWxlRGF5cyA9IGNoYW5nZSA/IHNjaGVkdWxlRGF5cyA6IG51bGw7IC8vIHNldCB0aGUgbmV3IG9uZSwgb3IgY2xlYXIgaXRcbiAgfVxuXG4gIGlmIChuZXdTY2hlZHVsZURheXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmluYWxpemVVcGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCB7IC4uLnN0YXRlLCBzY2hlZHVsZURheXM6IG5ld1NjaGVkdWxlRGF5cyA/PyB1bmRlZmluZWQgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aFNlbGVjdGlvbk1vZGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgc2VsZWN0aW9uTW9kZTogRGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlU2VsZWN0aW9uTW9kZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgc2VsZWN0aW9uTW9kZTogY3VycmVudFNlbGVjdGlvbk1vZGUgfSA9IHN0YXRlO1xuXG4gIGlmIChjdXJyZW50U2VsZWN0aW9uTW9kZSAhPT0gc2VsZWN0aW9uTW9kZSkge1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHsgLi4uc3RhdGUsIHNlbGVjdGlvbk1vZGUgfTtcblxuICAgIGlmIChzZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVDZWxsUmFuZ2UobmV4dFN0YXRlKTtcbiAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uUmFuZ2UgPyB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMobmV4dFN0YXRlLCB7IHNldDogW2N1cnJlbnRTZWxlY3Rpb25SYW5nZS5pXSwgaW52ZXJ0U2V0QmVoYXZpb3I6IHRydWUgfSkgOiBuZXh0U3RhdGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVVcGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHByZXZpb3VzU3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgbmV4dFN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCBwcmV2aW91c1NjaGVkdWxlRGF5cyA9IHByZXZpb3VzU3RhdGUuZWZmZWN0aXZlU2NoZWR1bGVEYXlzO1xuICBjb25zdCBuZXh0U2NoZWR1bGVEYXlzID0gbmV4dFN0YXRlLnNjaGVkdWxlRGF5cyA/PyBuZXh0U3RhdGUuZGVmYXVsdFNjaGVkdWxlRGF5cztcblxuICBpZiAoZGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzQXJlU2V0c0VxdWl2YWxlbnQobmV4dFNjaGVkdWxlRGF5cywgcHJldmlvdXNTY2hlZHVsZURheXMpKSB7XG4gICAgcmV0dXJuIG5leHRTdGF0ZTsgLy8gdGhlIGRlZmF1bHQgb3IgaW5wdXQgc2NoZWR1bGUgY2hhbmdlZCBidXQgdGhlIHNjaGVkdWxlIGlzIHN0aWxsIHRoZSBzYW1lLCBzbyBubyBuZWVkIGZvciBhbiB1cGRhdGUuXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZWZmZWN0aXZlU2NoZWR1bGVEYXlzID0gbmV3IFNldChzaW1wbGlmeURhdGVDZWxsU2NoZWR1bGVEYXlDb2RlcyhuZXh0U2NoZWR1bGVEYXlzKSk7XG4gICAgY29uc3QgYWxsb3dlZERheXNPZldlZWsgPSBleHBhbmREYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXNUb0RheU9mV2Vla1NldChuZXh0U2NoZWR1bGVEYXlzKTtcblxuICAgIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSh7XG4gICAgICAuLi5uZXh0U3RhdGUsXG4gICAgICAvLyB1cGRhdGUgdGhlIGVmZmVjdGl2ZSBzY2hlZHVsZSBkYXlzIGFuZCBhbGxvd2VkIGRheXMgb2Ygd2Vla1xuICAgICAgZWZmZWN0aXZlU2NoZWR1bGVEYXlzLFxuICAgICAgYWxsb3dlZERheXNPZldlZWtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZURhdGVzQ2hhbmdlIHtcbiAgcmVzZXQ/OiB0cnVlO1xuICB0b2dnbGU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PjtcbiAgYWRkPzogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD47XG4gIHJlbW92ZT86IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICBzZXQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PjtcbiAgc2VsZWN0QWxsPzogQWxsT3JOb25lU2VsZWN0aW9uO1xuICAvKipcbiAgICogSW52ZXJ0cyB0aGUgc2V0IGRhdGUgY2hhbmdpbmcgYmVoYXZpb3Igc28gdGhhdCB0aGUgc2V0IGlucHV0IGlzIHRyZWF0ZWQgYXMgaXRlbXMgdGhhdCBzaG91bGQgYmUgcmV0YWluZWQgaW5zdGVhZCBvZiBleGNsdWRlZC5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIHNldCBpcyBub3QgdXNlZC4gSWdub3JlZCBmb3Igc2VsZWN0QWxsLlxuICAgKi9cbiAgaW52ZXJ0U2V0QmVoYXZpb3I/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlRGF0ZXNDaGFuZ2UpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IHNlbGVjdGlvbk1vZGUsIGFsbG93ZWREYXlzT2ZXZWVrLCBpbmRleEZhY3RvcnksIGluZGV4RGF5T2ZXZWVrLCBpbnB1dFN0YXJ0OiBjdXJyZW50SW5wdXRTdGFydCwgaW5wdXRFbmQ6IGN1cnJlbnRJbnB1dEVuZCwgbWluTWF4RGF0ZVJhbmdlLCBmaWx0ZXIgfSA9IHN0YXRlO1xuICBjb25zdCB7IHN0YXJ0OiBtaW5EYXRlRnJvbUZpbHRlciwgZW5kOiBtYXhEYXRlRnJvbUZpbHRlciB9ID0gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZVJlbGF0aXZlVG9GaWx0ZXIoc3RhdGUpO1xuICBsZXQgaW5wdXRTdGFydCA9IGN1cnJlbnRJbnB1dFN0YXJ0O1xuICBsZXQgaW5wdXRFbmQgPSBjdXJyZW50SW5wdXRFbmQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBzZXQgb2YgaW5kZXhlcyB0aGF0IGFyZSBpbnRlcm5hbGx5IFwic2VsZWN0ZWRcIiBzbyB0aGF0IHRoZXkgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGlucHV0U3RhcnQvaW5wdXRFbmQgZGF0ZSByYW5nZS5cbiAgICpcbiAgICogRG8gbm90IGNvbmZ1c2UgdGhpcyB3aXRoIHRoZSBhY3R1YWwgaW5kZXhlcyB0aGF0IGFyZSBzZWxlY3RlZC5cbiAgICovXG4gIGxldCB0b2dnbGVkSW5kZXhlczogU2V0PERhdGVDZWxsSW5kZXg+O1xuXG4gIGZ1bmN0aW9uIGFzSW5kZXhlcyhpbmRleGVzOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0Pik6IERhdGVDZWxsSW5kZXhbXSB7XG4gICAgcmV0dXJuIGl0ZXJhYmxlVG9BcnJheShpbmRleGVzKS5tYXAoaW5kZXhGYWN0b3J5KTtcbiAgfVxuXG4gIC8vIFdoZW4gdXNpbmcgc2VsZWN0aW9uIG1vZGUgXCJzaW5nbGVcIiB3ZSB1cGRhdGUgdGhlIGNoYW5nZSB0byByZWZsZWN0IHRoZSBzaW5nbGUgc2VsZWN0aW9uLlxuICBpZiAoc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICBmdW5jdGlvbiBzZXRGcm9tRmlyc3RWYWx1ZShpbnB1dDogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4pOiBTZXQ8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PiB7XG4gICAgICBjb25zdCBmaXJzdFZhbHVlID0gaXNJdGVyYWJsZShpbnB1dCkgPyBmaXJzdFZhbHVlRnJvbUl0ZXJhYmxlKGlucHV0KSA6IGlucHV0O1xuICAgICAgY29uc3Qgc2V0ID0gbmV3IFNldDxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KCk7XG5cbiAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgc2V0LmFkZChmaXJzdFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlLnNldCkge1xuICAgICAgY2hhbmdlID0geyBzZXQ6IHNldEZyb21GaXJzdFZhbHVlKGNoYW5nZS5zZXQpLCBpbnZlcnRTZXRCZWhhdmlvcjogdHJ1ZSB9O1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnRvZ2dsZSkge1xuICAgICAgY29uc3QgbmV4dFNldCA9IHNldEZyb21GaXJzdFZhbHVlKGNoYW5nZS50b2dnbGUpO1xuXG4gICAgICBpZiAobmV4dFNldC5zaXplKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0U2V0VmFsdWVJbmRleCA9IGluZGV4RmFjdG9yeShmaXJzdFZhbHVlRnJvbUl0ZXJhYmxlKG5leHRTZXQpIGFzIERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dCk7XG5cbiAgICAgICAgaWYgKHN0YXRlLnRvZ2dsZWRJbmRleGVzLmhhcyhmaXJzdFNldFZhbHVlSW5kZXgpIHx8IChpbnB1dFN0YXJ0ICYmIGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KSA9PT0gZmlyc3RTZXRWYWx1ZUluZGV4KSkge1xuICAgICAgICAgIG5leHRTZXQuY2xlYXIoKTsgLy8gY2xlYXIgd2l0aCB0aGUgbmV4dCBzZXRcbiAgICAgICAgfVxuXG4gICAgICAgIGNoYW5nZSA9IHsgc2V0OiBuZXh0U2V0LCBpbnZlcnRTZXRCZWhhdmlvcjogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCwgc2VsZWN0QWxsLCBhZGQsIGFuZCByZW1vdmUgYXJlIHRyZWF0ZWQgYXMgdGhleSBub3JtYWxseSBhcmUuXG4gIH1cblxuICBpZiAoY2hhbmdlLnJlc2V0IHx8IGNoYW5nZS5zZWxlY3RBbGwgIT0gbnVsbCB8fCBjaGFuZ2Uuc2V0ICE9IG51bGwpIHtcbiAgICBsZXQgc2V0OiBNYXliZTxJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0Pj4gPSBjaGFuZ2Uuc2V0ID8/IFtdO1xuICAgIGNvbnN0IHNlbGVjdEFsbDogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPiA9IGNoYW5nZS5yZXNldCA9PT0gdHJ1ZSA/IHN0YXRlLmluaXRpYWxTZWxlY3Rpb25TdGF0ZSA6IGNoYW5nZS5zZWxlY3RBbGw7XG5cbiAgICBzd2l0Y2ggKHNlbGVjdEFsbCkge1xuICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgaWYgKG1pbkRhdGVGcm9tRmlsdGVyICE9IG51bGwgJiYgbWF4RGF0ZUZyb21GaWx0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGlucHV0U3RhcnQgPSBtaW5EYXRlRnJvbUZpbHRlcjtcbiAgICAgICAgICBpbnB1dEVuZCA9IG1heERhdGVGcm9tRmlsdGVyO1xuICAgICAgICAgIHNldCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIGlucHV0U3RhcnQgPSBudWxsO1xuICAgICAgICBpbnB1dEVuZCA9IG51bGw7XG4gICAgICAgIHNldCA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dFNldEluZGV4ZXMgPSBhc0luZGV4ZXMoc2V0KTtcbiAgICB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQoaW5wdXRTZXRJbmRleGVzKTtcblxuICAgIGlmIChjaGFuZ2UuaW52ZXJ0U2V0QmVoYXZpb3IgJiYgIXNlbGVjdEFsbCkge1xuICAgICAgbGV0IG1pbkluZGV4OiBNYXliZTxudW1iZXI+O1xuICAgICAgbGV0IG1heEluZGV4OiBNYXliZTxudW1iZXI+O1xuXG4gICAgICBpZiAobWluRGF0ZUZyb21GaWx0ZXIgIT0gbnVsbCAmJiBtYXhEYXRlRnJvbUZpbHRlciAhPSBudWxsKSB7XG4gICAgICAgIC8vIG9ubHkgYXBwbGljYWJsZSB3aGVuIHRoZSBmaWx0ZXIgaXMgc2V0LlxuICAgICAgICBtaW5JbmRleCA9IGluZGV4RmFjdG9yeShtaW5EYXRlRnJvbUZpbHRlcik7XG4gICAgICAgIG1heEluZGV4ID0gaW5kZXhGYWN0b3J5KG1heERhdGVGcm9tRmlsdGVyKTtcblxuICAgICAgICBpbnB1dFN0YXJ0ID0gbWluRGF0ZUZyb21GaWx0ZXI7XG4gICAgICAgIGlucHV0RW5kID0gbWF4RGF0ZUZyb21GaWx0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3aGVuIHRoZSBmaWx0ZXIgaXMgbm90IHNldCwgdXNlIHRoZSBsZWFzdCBhbmQgZ3JlYXRlc3QgaW5kZXhlcyBmcm9tIHRoZSBpbnB1dCBzZXQuXG4gICAgICAgIGNvbnN0IG1pbkFuZE1heCA9IG1pbkFuZE1heE51bWJlcihpbnB1dFNldEluZGV4ZXMpO1xuXG4gICAgICAgIGlmIChtaW5BbmRNYXggIT0gbnVsbCkge1xuICAgICAgICAgIG1pbkluZGV4ID0gbWluQW5kTWF4Lm1pbjtcbiAgICAgICAgICBtYXhJbmRleCA9IG1pbkFuZE1heC5tYXg7XG4gICAgICAgICAgY29uc3QgZGF0ZUZhY3RvcnkgPSBkYXRlQ2VsbFRpbWluZ1N0YXJ0RGF0ZUZhY3RvcnkoaW5kZXhGYWN0b3J5Ll90aW1pbmcpO1xuXG4gICAgICAgICAgaW5wdXRTdGFydCA9IGRhdGVGYWN0b3J5KG1pbkFuZE1heC5taW4pO1xuICAgICAgICAgIGlucHV0RW5kID0gbWluQW5kTWF4Lm1pbiA9PT0gbWluQW5kTWF4Lm1heCA/IGlucHV0U3RhcnQgOiBkYXRlRmFjdG9yeShtaW5BbmRNYXgubWF4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIGFuIGVtcHR5IHNldCAvIHVzaW5nIFwibm9uZVwiIHdpdGggc2VsZWN0QWxsLlxuICAgICAgICAgIGlucHV0U3RhcnQgPSBudWxsO1xuICAgICAgICAgIGlucHV0RW5kID0gbnVsbDtcbiAgICAgICAgICB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyB0b2dnbGVkSW5kZXhlcyBzaG91bGQgbm90IGluY2x1ZGUgYW55IGluZGV4ZXMgd2Ugd2FudCB0byBpbmNsdWRlXG4gICAgICBpZiAobWluSW5kZXggIT0gbnVsbCAmJiBtYXhJbmRleCAhPSBudWxsKSB7XG4gICAgICAgIHRvZ2dsZWRJbmRleGVzID0gbmV3IFNldChyYW5nZShtaW5JbmRleCwgbWF4SW5kZXggKyAxKS5maWx0ZXIoKHgpID0+ICF0b2dnbGVkSW5kZXhlcy5oYXMoeCkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdG9nZ2xlZEluZGV4ZXMgPSBuZXcgU2V0KHN0YXRlLnRvZ2dsZWRJbmRleGVzKTsgLy8gY29weSB0aGUgc2V0XG5cbiAgICBpZiAoY2hhbmdlLnRvZ2dsZSkge1xuICAgICAgY29uc3QgYWxsb3dlZFRvVG9nZ2xlID0gYXNJbmRleGVzKGNoYW5nZS50b2dnbGUpLmZpbHRlcigoaSkgPT4gYWxsb3dlZERheXNPZldlZWsuaGFzKGluZGV4RGF5T2ZXZWVrKGkpKSk7XG4gICAgICB0b2dnbGVJblNldCh0b2dnbGVkSW5kZXhlcywgYWxsb3dlZFRvVG9nZ2xlKTtcbiAgICB9XG5cbiAgICBsZXQgYWRkVG9FeGNsdXNpb246IE1heWJlPEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+PjtcbiAgICBsZXQgcmVtb3ZlRnJvbUV4Y2x1c2lvbjogTWF5YmU8SXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4+O1xuXG4gICAgaWYgKGNoYW5nZS5hZGQpIHtcbiAgICAgIGlmIChjaGFuZ2UuaW52ZXJ0U2V0QmVoYXZpb3IpIHtcbiAgICAgICAgYWRkVG9FeGNsdXNpb24gPSBjaGFuZ2UuYWRkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRnJvbUV4Y2x1c2lvbiA9IGNoYW5nZS5hZGQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZS5yZW1vdmUpIHtcbiAgICAgIGlmIChjaGFuZ2UuaW52ZXJ0U2V0QmVoYXZpb3IpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUV4Y2x1c2lvbiA9IGNoYW5nZS5yZW1vdmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRUb0V4Y2x1c2lvbiA9IGNoYW5nZS5yZW1vdmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFkZFRvRXhjbHVzaW9uKSB7XG4gICAgICByZW1vdmVGcm9tU2V0KHRvZ2dsZWRJbmRleGVzLCBhc0luZGV4ZXMoYWRkVG9FeGNsdXNpb24pKTtcbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlRnJvbUV4Y2x1c2lvbikge1xuICAgICAgYWRkVG9TZXQodG9nZ2xlZEluZGV4ZXMsIGFzSW5kZXhlcyhyZW1vdmVGcm9tRXhjbHVzaW9uKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRTdGFydCwgaW5wdXRFbmQsIHRvZ2dsZWRJbmRleGVzIH07XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuXG4gIC8vIFJlY2FsY3VsYXRlIHRoZSByYW5nZSBhbmQgc2ltcGxpZmllZCB0byBleGNsdXNpb25zXG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24obmV4dFN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24pIHtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoeyAuLi5uZXh0U3RhdGUsIHRvZ2dsZWRJbmRleGVzOiBuZXcgU2V0KHJhbmdlQW5kRXhjbHVzaW9uLmV4Y2x1ZGVkKSwgaW5wdXRTdGFydDogcmFuZ2VBbmRFeGNsdXNpb24uc3RhcnQsIGlucHV0RW5kOiByYW5nZUFuZEV4Y2x1c2lvbi5lbmQgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm8gc2VsZWN0ZWQgZGF5c1xuICAgIHJldHVybiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHsgLi4uc3RhdGUsIHRvZ2dsZWRJbmRleGVzOiBuZXcgU2V0KCksIGlucHV0U3RhcnQ6IG51bGwsIGlucHV0RW5kOiBudWxsIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBpbnB1dFN0YXJ0OiBjdXJyZW50SW5wdXRTdGFydCwgaW5wdXRFbmQ6IGN1cnJlbnRJbnB1dEVuZCwgaW5kZXhGYWN0b3J5IH0gPSBzdGF0ZTtcbiAgY29uc3QgeyBzdGFydDogbWluRGF0ZSwgZW5kOiBtYXhEYXRlIH0gPSBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlKHN0YXRlKTtcblxuICBjb25zdCBpbnB1dFN0YXJ0OiBEYXRlID0gc3RhcnRPZkRheShjaGFuZ2UuaW5wdXRTdGFydCk7XG4gIGNvbnN0IGlucHV0RW5kOiBEYXRlID0gc3RhcnRPZkRheShjaGFuZ2UuaW5wdXRFbmQpOyAvLyBtaWRuaWdodCBvZiB0aGUgbGFzdCBkYXlcblxuICBjb25zdCBpc1ZhbGlkUmFuZ2UgPSBtaW5EYXRlICE9IG51bGwgfHwgbWF4RGF0ZSAhPSBudWxsID8gaXNEYXRlSW5EYXRlUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBtaW5EYXRlID8/IHVuZGVmaW5lZCwgZW5kOiBtYXhEYXRlID8/IHVuZGVmaW5lZCB9KSA6ICgpID0+IHRydWU7XG5cbiAgaWYgKCFpc1ZhbGlkUmFuZ2UoaW5wdXRTdGFydCkgfHwgIWlzVmFsaWRSYW5nZShpbnB1dEVuZCkgfHwgKGlzU2FtZURhdGVEYXkoaW5wdXRTdGFydCwgY3VycmVudElucHV0U3RhcnQpICYmIGlzU2FtZURhdGVEYXkoaW5wdXRFbmQsIGN1cnJlbnRJbnB1dEVuZCkpKSB7XG4gICAgcmV0dXJuIHN0YXRlOyAvLyBpZiBubyBjaGFuZ2UsIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAgfVxuXG4gIC8vIHJldGFpbiBhbGwgaW5kZXhlcyB0aGF0IGFyZSB3aXRoaW4gdGhlIG5ldyByYW5nZVxuICBjb25zdCBtaW5JbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgY29uc3QgbWF4SW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRFbmQpICsgMTtcblxuICBjb25zdCBjdXJyZW50SW5kZXhlczogRGF0ZUNlbGxJbmRleFtdID0gQXJyYXkuZnJvbShzdGF0ZS50b2dnbGVkSW5kZXhlcyk7XG4gIGNvbnN0IGlzSW5DdXJyZW50UmFuZ2UgPSBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24oeyBtaW5JbmRleCwgbWF4SW5kZXggfSk7XG4gIGNvbnN0IGV4Y2x1ZGVkSW5kZXhlc0luTmV3UmFuZ2UgPSBjdXJyZW50SW5kZXhlcy5maWx0ZXIoaXNJbkN1cnJlbnRSYW5nZSk7XG4gIGNvbnN0IHRvZ2dsZWRJbmRleGVzID0gbmV3IFNldChleGNsdWRlZEluZGV4ZXNJbk5ld1JhbmdlKTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlLCB0b2dnbGVkSW5kZXhlcywgaW5wdXRTdGFydCwgaW5wdXRFbmQgfTtcbiAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGU6IEJ1aWxkaW5nPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZT4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBuZXh0U3RhdGUuaXNFbmFibGVkRGF5ID0gaXNFbmFibGVkRGF5SW5DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlIGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk7XG4gIG5leHRTdGF0ZS5jdXJyZW50U2VsZWN0aW9uVmFsdWUgPSBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShuZXh0U3RhdGUgYXMgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTtcbiAgcmV0dXJuIG5leHRTdGF0ZSBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogRGVjaXNpb25GdW5jdGlvbjxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+IHtcbiAgY29uc3QgeyBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhGYWN0b3J5LCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgaW5kZXhEYXlPZldlZWssIHN5c3RlbVRpbWV6b25lIH0gPSBzdGF0ZTtcbiAgbGV0IGlzSW5TdGFydEFuZEVuZFJhbmdlOiBJc0RhdGVXaXRoaW5EYXRlQ2VsbFJhbmdlRnVuY3Rpb247XG5cbiAgaWYgKGlucHV0U3RhcnQgJiYgaW5wdXRFbmQpIHtcbiAgICBpc0luU3RhcnRBbmRFbmRSYW5nZSA9IGlzRGF0ZVdpdGhpbkRhdGVDZWxsUmFuZ2VGdW5jdGlvbih7IHN0YXJ0c0F0OiB7IHN0YXJ0c0F0OiBzdGF0ZS5zdGFydCwgdGltZXpvbmU6IHN5c3RlbVRpbWV6b25lIH0sIHJhbmdlOiB7IHN0YXJ0OiBpbnB1dFN0YXJ0LCBlbmQ6IGlucHV0RW5kIH0gfSk7XG4gIH0gZWxzZSB7XG4gICAgaXNJblN0YXJ0QW5kRW5kUmFuZ2UgPSAoKSA9PiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoaW5wdXQ6IERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dCkgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0KTtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBpbmRleERheU9mV2VlayhpbmRleCk7XG5cbiAgICBjb25zdCBpc0luU2VsZWN0ZWRSYW5nZSA9IGlzSW5TdGFydEFuZEVuZFJhbmdlKGluZGV4KTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gc3RhdGUudG9nZ2xlZEluZGV4ZXMuaGFzKGluZGV4KTtcbiAgICBjb25zdCBpc0FsbG93ZWREYXlPZldlZWsgPSBhbGxvd2VkRGF5c09mV2Vlay5oYXMoZGF5T2ZXZWVrKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGlzQWxsb3dlZERheU9mV2VlayAmJiAoKGlzSW5TZWxlY3RlZFJhbmdlICYmICFpc1NlbGVjdGVkKSB8fCAoaXNTZWxlY3RlZCAmJiAhaXNJblNlbGVjdGVkUmFuZ2UpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uVmFsdWUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZT4ge1xuICBjb25zdCB7IGluZGV4RmFjdG9yeTogc3lzdGVtSW5kZXhGYWN0b3J5LCBhbGxvd2VkRGF5c09mV2VlaywgZWZmZWN0aXZlU2NoZWR1bGVEYXlzLCBpbmRleERheU9mV2VlaywgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIsIGZpbHRlciwgc3lzdGVtVGltZXpvbmUgfSA9IHN0YXRlO1xuICBsZXQgdGltZXpvbmUgPSBzeXN0ZW1UaW1lem9uZTtcbiAgY29uc3QgcmFuZ2VBbmRFeGNsdXNpb24gPSBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbihzdGF0ZSk7XG5cbiAgaWYgKHJhbmdlQW5kRXhjbHVzaW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgc3RhcnQ6IHJhbmdlU3RhcnQsIGVuZDogcmFuZ2VFbmQsIGV4Y2x1ZGVkOiBhbGxFeGNsdWRlZCwgZGF0ZUNlbGxSYW5nZSB9ID0gcmFuZ2VBbmRFeGNsdXNpb247XG4gIGxldCBmaWx0ZXJPZmZzZXRFeGNsdWRlZFJhbmdlOiBEYXRlQ2VsbEluZGV4W10gPSBbXTtcbiAgbGV0IGluZGV4T2Zmc2V0ID0gZGF0ZUNlbGxSYW5nZS5pO1xuXG4gIGxldCBzdGFydCA9IHJhbmdlU3RhcnQ7XG4gIGxldCBlbmQgPSByYW5nZUVuZDtcblxuICAvLyBJZiBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciBpcyB0cnVlLCB0aGVuIHdlIG5lZWQgdG8gb2Zmc2V0IHRoZSB2YWx1ZXMgdG8gYmUgcmVsYXRpdmUgdG8gdGhhdCBzdGFydC5cbiAgaWYgKGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyICYmIGZpbHRlcj8uc3RhcnQpIHtcbiAgICBzdGFydCA9IGZpbHRlci5zdGFydDsgLy8gYWx3YXlzIHN0YXJ0IGF0IHRoZSBmaWx0ZXIncyBzdGFydCBkYXRlXG4gICAgbGV0IHN0YXJ0SW5TeXN0ZW1UaW1lem9uZSA9IHN0YXJ0O1xuXG4gICAgaWYgKGZpbHRlci50aW1lem9uZSkge1xuICAgICAgdGltZXpvbmUgPSBmaWx0ZXIudGltZXpvbmU7XG4gICAgICBjb25zdCBmaWx0ZXJOb3JtYWwgPSBkYXRlVGltZXpvbmVVdGNOb3JtYWwodGltZXpvbmUpO1xuICAgICAgZW5kID0gZmlsdGVyTm9ybWFsLnN0YXJ0T2ZEYXlJblRhcmdldFRpbWV6b25lKGVuZCk7XG4gICAgICBzdGFydEluU3lzdGVtVGltZXpvbmUgPSBmaWx0ZXJOb3JtYWwuc3lzdGVtRGF0ZVRvVGFyZ2V0RGF0ZShzdGFydCk7IC8vIGNvbnZlcnQgdGhlIHN0YXJ0IHRvIHRoZSBzeXN0ZW0gdGltZXpvbmUgbm9ybWFsIGZvciBkZXJpdmluZyB0aGUgaW5kZXhcbiAgICB9XG5cbiAgICBjb25zdCByYW5nZVN0YXJ0SW5kZXggPSBzeXN0ZW1JbmRleEZhY3RvcnkocmFuZ2VTdGFydCk7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHN5c3RlbUluZGV4RmFjdG9yeShzdGFydEluU3lzdGVtVGltZXpvbmUpO1xuICAgIGNvbnN0IGZpbHRlclN0YXJ0SW5kZXhPZmZzZXQgPSByYW5nZVN0YXJ0SW5kZXggLSBzdGFydEluZGV4O1xuICAgIGZpbHRlck9mZnNldEV4Y2x1ZGVkUmFuZ2UgPSByYW5nZSgwLCBmaWx0ZXJTdGFydEluZGV4T2Zmc2V0KTtcbiAgICBpbmRleE9mZnNldCA9IGluZGV4T2Zmc2V0IC0gZmlsdGVyU3RhcnRJbmRleE9mZnNldDtcbiAgfVxuXG4gIGNvbnN0IGV4Y2x1ZGVkID0gY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXJcbiAgICA/IGFsbEV4Y2x1ZGVkLmZpbHRlcigoeCkgPT4ge1xuICAgICAgICBjb25zdCBpc0V4Y2x1ZGVkSW5kZXggPSBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoeCkpOyAvLyA/Pz9cbiAgICAgICAgcmV0dXJuIGlzRXhjbHVkZWRJbmRleDtcbiAgICAgIH0pXG4gICAgOiBhbGxFeGNsdWRlZDtcblxuICBjb25zdCBvZmZzZXRFeGNsdWRlZDogRGF0ZUNlbGxJbmRleFtdID0gZXhjbHVkZWQubWFwKCh4KSA9PiB4IC0gaW5kZXhPZmZzZXQpOyAvLyBzZXQgdG8gdGhlIHByb3BlciBvZmZzZXRcblxuICBjb25zdCBleCA9IFsuLi5maWx0ZXJPZmZzZXRFeGNsdWRlZFJhbmdlLCAuLi5vZmZzZXRFeGNsdWRlZF07XG5cbiAgY29uc3QgdzogRGF0ZUNlbGxTY2hlZHVsZUVuY29kZWRXZWVrID0gZGF0ZUNlbGxTY2hlZHVsZUVuY29kZWRXZWVrKGVmZmVjdGl2ZVNjaGVkdWxlRGF5cyk7XG4gIGNvbnN0IGQ6IERhdGVDZWxsSW5kZXhbXSA9IFtdOyAvLyBcImluY2x1ZGVkXCIgYmxvY2tzIGFyZSBuZXZlciB1c2VkL2NhbGN1bGF0ZWQuXG5cbiAgLy8gQWx3YXlzIGVuc3VyZSB0aGUgZW5kIGlzIGFmdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydC5cbiAgaWYgKGlzQmVmb3JlKGVuZCwgc3RhcnQpKSB7XG4gICAgZW5kID0gc3RhcnQ7IC8vIGVuZCBpcyBzdGFydFxuICB9XG5cbiAgY29uc3QgZGF0ZVNjaGVkdWxlUmFuZ2U6IERhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2UgPSB7XG4gICAgdGltZXpvbmUsXG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIHcsXG4gICAgZCxcbiAgICBleFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZGF0ZVNjaGVkdWxlUmFuZ2UsXG4gICAgbWluTWF4UmFuZ2U6IHsgc3RhcnQsIGVuZCB9XG4gIH07XG59XG5cbi8qKlxuICogVGhlIHNlbGVjdGVkIGRhdGUgcmFuZ2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNlbGwgcmFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uIGV4dGVuZHMgRGF0ZVJhbmdlIHtcbiAgLyoqXG4gICAqIENvcnJlc3BvbmRzIHRvIHRoZSBzdGFydCBhbmQgZW5kIGluZGV4ZXMgaW4gdGhlIGRhdGUgcmFuZ2UuXG4gICAqL1xuICBkYXRlQ2VsbFJhbmdlOiBEYXRlQ2VsbFJhbmdlV2l0aFJhbmdlO1xuICAvKipcbiAgICogQWxsIGV4Y2x1ZGVkIGluZGV4ZXMuXG4gICAqL1xuICBleGNsdWRlZDogRGF0ZUNlbGxJbmRleFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24oc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbj4ge1xuICBjb25zdCB7IHN0YXJ0OiBjdXJyZW50U3RhcnQsIGlzRW5hYmxlZERheSwgaXNFbmFibGVkRmlsdGVyRGF5LCBzeXN0ZW1UaW1lem9uZSB9ID0gc3RhdGU7XG5cbiAgY29uc3QgZGF0ZUZhY3RvcnkgPSBkYXRlQ2VsbFRpbWluZ1N0YXJ0RGF0ZUZhY3RvcnkoeyBzdGFydHNBdDogY3VycmVudFN0YXJ0LCB0aW1lem9uZTogc3lzdGVtVGltZXpvbmUgfSk7XG4gIGNvbnN0IGRhdGVDZWxsUmFuZ2UgPSBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVDZWxsUmFuZ2Uoc3RhdGUpO1xuXG4gIGlmIChkYXRlQ2VsbFJhbmdlID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gcmV0dXJucyBudWxsIGlmIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZC5cbiAgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gZGF0ZUZhY3RvcnkoZGF0ZUNlbGxSYW5nZS5pKTtcbiAgY29uc3QgZW5kID0gZGF0ZUZhY3RvcnkoZGF0ZUNlbGxSYW5nZS50byk7XG5cbiAgY29uc3QgZXhjbHVkZWQ6IERhdGVDZWxsSW5kZXhbXSA9IHJhbmdlKGRhdGVDZWxsUmFuZ2UuaSwgZGF0ZUNlbGxSYW5nZS50byArIDEpLmZpbHRlcigoeCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjbHVkZWRJbmRleCA9ICFpc0VuYWJsZWREYXkoeCkgfHwgIWlzRW5hYmxlZEZpbHRlckRheSh4KTtcbiAgICByZXR1cm4gaXNFeGNsdWRlZEluZGV4O1xuICB9KTtcblxuICBjb25zdCByZXN1bHQ6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbiA9IHtcbiAgICBkYXRlQ2VsbFJhbmdlLFxuICAgIHN0YXJ0LFxuICAgIGVuZCxcbiAgICBleGNsdWRlZFxuICB9O1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxEYXRlUmFuZ2U+IHtcbiAgY29uc3QgZGF0ZUZhY3RvcnkgPSBkYXRlQ2VsbFRpbWluZ0RhdGVGYWN0b3J5KHsgc3RhcnRzQXQ6IHN0YXRlLnN0YXJ0LCB0aW1lem9uZTogc3RhdGUuc3lzdGVtVGltZXpvbmUgfSk7XG4gIGNvbnN0IGRhdGVDZWxsUmFuZ2UgPSBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVDZWxsUmFuZ2Uoc3RhdGUpO1xuICBjb25zdCBkYXRlUmFuZ2U6IE1heWJlPERhdGVSYW5nZT4gPSBkYXRlQ2VsbFJhbmdlICE9IG51bGwgPyB7IHN0YXJ0OiBkYXRlRmFjdG9yeShkYXRlQ2VsbFJhbmdlLmkpLCBlbmQ6IGRhdGVGYWN0b3J5KGRhdGVDZWxsUmFuZ2UudG8gYXMgbnVtYmVyKSB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4gZGF0ZVJhbmdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXRlQ2VsbFJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxEYXRlQ2VsbFJhbmdlV2l0aFJhbmdlPiB7XG4gIGNvbnN0IHsgYWxsb3dlZERheXNPZldlZWssIGluZGV4RmFjdG9yeSwgaW5wdXRTdGFydCwgaW5wdXRFbmQsIGluZGV4RGF5T2ZXZWVrLCBpc0VuYWJsZWREYXksIGlzRW5hYmxlZEZpbHRlckRheSB9ID0gc3RhdGU7XG4gIGNvbnN0IGVuYWJsZWRFeGNsdXNpb25JbmRleGVzID0gQXJyYXkuZnJvbShzdGF0ZS50b2dnbGVkSW5kZXhlcykuZmlsdGVyKChpKSA9PiBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoaSkpKTtcbiAgY29uc3QgbWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMgPSBtaW5BbmRNYXhOdW1iZXIoZW5hYmxlZEV4Y2x1c2lvbkluZGV4ZXMpO1xuXG4gIGxldCBzdGFydFJhbmdlOiBNYXliZTxEYXRlQ2VsbEluZGV4PjtcbiAgbGV0IGVuZFJhbmdlOiBNYXliZTxEYXRlQ2VsbEluZGV4PjtcblxuICBpZiAobWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMpIHtcbiAgICBzdGFydFJhbmdlID0gbWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMubWluO1xuICAgIGVuZFJhbmdlID0gbWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMubWF4O1xuICB9XG5cbiAgaWYgKGlucHV0U3RhcnQgIT0gbnVsbCAmJiBpbnB1dEVuZCAhPSBudWxsKSB7XG4gICAgY29uc3QgaW5wdXRTdGFydEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0U3RhcnQpO1xuICAgIGNvbnN0IGlucHV0RW5kSW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRFbmQpO1xuXG4gICAgc3RhcnRSYW5nZSA9IHN0YXJ0UmFuZ2UgIT0gbnVsbCA/IE1hdGgubWluKGlucHV0U3RhcnRJbmRleCwgc3RhcnRSYW5nZSkgOiBpbnB1dFN0YXJ0SW5kZXg7XG4gICAgZW5kUmFuZ2UgPSBlbmRSYW5nZSAhPSBudWxsID8gTWF0aC5tYXgoaW5wdXRFbmRJbmRleCwgZW5kUmFuZ2UpIDogaW5wdXRFbmRJbmRleDtcbiAgfVxuXG4gIGlmIChzdGFydFJhbmdlICE9IG51bGwgJiYgZW5kUmFuZ2UgIT0gbnVsbCkge1xuICAgIGNvbnN0IHNjYW5TdGFydEluZGV4ID0gc3RhcnRSYW5nZTtcbiAgICBjb25zdCBzY2FuRW5kSW5kZXggPSBlbmRSYW5nZTtcblxuICAgIC8vIGNsZWFyIHN0YXJ0IGFuZCBlbmRcbiAgICBzdGFydFJhbmdlID0gdW5kZWZpbmVkO1xuICAgIGVuZFJhbmdlID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gaWYgdGhlIG1pbiBpcyBlcXVhbCB0byB0aGUgc3RhcnQgaW5kZXgsIHRoZW4gd2UgYXJlIGluIHRoZSByYW5nZSBhbmQgbmVlZCB0byBpdGVyYXRlIGRhdGVzIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgaXMgbm90IHNlbGVjdGVkL2V4Y2x1ZGVkLlxuICAgIGZvciAobGV0IGkgPSBzY2FuU3RhcnRJbmRleDsgaSA8PSBzY2FuRW5kSW5kZXg7IGkgKz0gMSkge1xuICAgICAgaWYgKGlzRW5hYmxlZEZpbHRlckRheShpKSAmJiBpc0VuYWJsZWREYXkoaSkpIHtcbiAgICAgICAgc3RhcnRSYW5nZSA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNhbWUgd2l0aCB0aGUgbWF4XG4gICAgZm9yIChsZXQgaSA9IHNjYW5FbmRJbmRleDsgaSA+PSBzY2FuU3RhcnRJbmRleDsgaSAtPSAxKSB7XG4gICAgICBpZiAoaXNFbmFibGVkRmlsdGVyRGF5KGkpICYmIGlzRW5hYmxlZERheShpKSkge1xuICAgICAgICBlbmRSYW5nZSA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdGFydFJhbmdlICE9IG51bGwgJiYgZW5kUmFuZ2UgIT0gbnVsbCkge1xuICAgIHJldHVybiB7IGk6IHN0YXJ0UmFuZ2UsIHRvOiBlbmRSYW5nZSB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|