@sbb-esta/lyne-elements-experimental 1.9.0 → 1.11.0

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.
Files changed (52) hide show
  1. package/core/datetime.js +116 -105
  2. package/core/timetable/access-leg-helper.d.ts +2 -1
  3. package/core/timetable/access-leg-helper.d.ts.map +1 -1
  4. package/core/timetable.js +111 -76
  5. package/custom-elements.json +44 -0
  6. package/development/core/datetime.js +53 -51
  7. package/development/core/timetable/access-leg-helper.d.ts +2 -1
  8. package/development/core/timetable/access-leg-helper.d.ts.map +1 -1
  9. package/development/core/timetable.js +57 -22
  10. package/development/differenceInMinutes-Cmyza6nm.js +26 -0
  11. package/development/format-DTy5_IOt.js +1371 -0
  12. package/development/isValid-DO_pHwcW.js +53 -0
  13. package/development/journey-summary.js +4 -17
  14. package/development/pearl-chain/pearl-chain.sample-data.d.ts +1 -0
  15. package/development/pearl-chain/pearl-chain.sample-data.d.ts.map +1 -1
  16. package/development/pearl-chain-time/pearl-chain-time.d.ts +2 -0
  17. package/development/pearl-chain-time/pearl-chain-time.d.ts.map +1 -1
  18. package/development/pearl-chain-time.js +21 -21
  19. package/development/pearl-chain-vertical-item.js +2 -15
  20. package/development/pearl-chain-vertical.js +2 -15
  21. package/development/pearl-chain.js +8 -25
  22. package/development/timetable-duration.js +2 -15
  23. package/development/timetable-row/timetable-row.d.ts +7 -0
  24. package/development/timetable-row/timetable-row.d.ts.map +1 -1
  25. package/development/timetable-row/timetable-row.sample-data.d.ts +2 -0
  26. package/development/timetable-row/timetable-row.sample-data.d.ts.map +1 -1
  27. package/development/timetable-row.js +9 -17
  28. package/development/toDate-B6IBgPYH.js +24 -0
  29. package/differenceInMinutes-BI2zjbtS.js +23 -0
  30. package/{format-fWxoS2xH.js → format-oBQcGL50.js} +343 -344
  31. package/isValid-mroh13Xp.js +45 -0
  32. package/journey-summary.js +2 -2
  33. package/package.json +2 -2
  34. package/pearl-chain/pearl-chain.sample-data.d.ts +1 -0
  35. package/pearl-chain/pearl-chain.sample-data.d.ts.map +1 -1
  36. package/pearl-chain-time/pearl-chain-time.d.ts +2 -0
  37. package/pearl-chain-time/pearl-chain-time.d.ts.map +1 -1
  38. package/pearl-chain-time.js +38 -34
  39. package/pearl-chain.js +57 -59
  40. package/timetable-row/timetable-row.d.ts +7 -0
  41. package/timetable-row/timetable-row.d.ts.map +1 -1
  42. package/timetable-row/timetable-row.sample-data.d.ts +2 -0
  43. package/timetable-row/timetable-row.sample-data.d.ts.map +1 -1
  44. package/timetable-row.js +41 -36
  45. package/toDate-DQg4ZFnf.js +15 -0
  46. package/constants-DSR8hPvP.js +0 -16
  47. package/development/constants-BMGwMkN3.js +0 -30
  48. package/development/differenceInMinutes-DHtPDiUE.js +0 -30
  49. package/development/format-DkbylFCM.js +0 -1373
  50. package/development/isValid-BVccOlli.js +0 -44
  51. package/differenceInMinutes-BhHyuJc4.js +0 -28
  52. package/isValid-DSjxf8eh.js +0 -36
@@ -1,49 +1,57 @@
1
1
  import { i18nDurationDay, i18nDurationHour, i18nDurationMinute } from "@sbb-esta/lyne-elements/core/i18n.js";
2
- import { t as toDate, c as constructFrom, a as millisecondsInHour, b as millisecondsInMinute } from "../constants-BMGwMkN3.js";
3
- import { d as differenceInCalendarDays, i as isValid } from "../isValid-BVccOlli.js";
4
- import { b as addMilliseconds, c as differenceInMilliseconds, g as getRoundingMethod, a as addMinutes, d as differenceInMinutes } from "../differenceInMinutes-DHtPDiUE.js";
5
- function addDays(date, amount) {
6
- const _date = toDate(date);
2
+ import { t as toDate, c as constructFrom, a as millisecondsInHour, b as millisecondsInMinute } from "../toDate-B6IBgPYH.js";
3
+ import { n as normalizeDates, d as differenceInCalendarDays, i as isValid } from "../isValid-DO_pHwcW.js";
4
+ import { g as getRoundingMethod, a as addMinutes, d as differenceInMinutes } from "../differenceInMinutes-Cmyza6nm.js";
5
+ function addDays(date, amount, options) {
6
+ const _date = toDate(date, options == null ? void 0 : options.in);
7
7
  if (isNaN(amount)) return constructFrom(date, NaN);
8
- if (!amount) {
9
- return _date;
10
- }
8
+ if (!amount) return _date;
11
9
  _date.setDate(_date.getDate() + amount);
12
10
  return _date;
13
11
  }
14
- function addHours(date, amount) {
12
+ function addMilliseconds(date, amount, options) {
13
+ return constructFrom(date, +toDate(date) + amount);
14
+ }
15
+ function addHours(date, amount, options) {
15
16
  return addMilliseconds(date, amount * millisecondsInHour);
16
17
  }
17
- function differenceInDays(dateLeft, dateRight) {
18
- const _dateLeft = toDate(dateLeft);
19
- const _dateRight = toDate(dateRight);
20
- const sign = compareLocalAsc(_dateLeft, _dateRight);
21
- const difference = Math.abs(differenceInCalendarDays(_dateLeft, _dateRight));
22
- _dateLeft.setDate(_dateLeft.getDate() - sign * difference);
18
+ function differenceInDays(laterDate, earlierDate, options) {
19
+ const [laterDate_, earlierDate_] = normalizeDates(
20
+ options == null ? void 0 : options.in,
21
+ laterDate,
22
+ earlierDate
23
+ );
24
+ const sign = compareLocalAsc(laterDate_, earlierDate_);
25
+ const difference = Math.abs(
26
+ differenceInCalendarDays(laterDate_, earlierDate_)
27
+ );
28
+ laterDate_.setDate(laterDate_.getDate() - sign * difference);
23
29
  const isLastDayNotFull = Number(
24
- compareLocalAsc(_dateLeft, _dateRight) === -sign
30
+ compareLocalAsc(laterDate_, earlierDate_) === -sign
25
31
  );
26
32
  const result = sign * (difference - isLastDayNotFull);
27
33
  return result === 0 ? 0 : result;
28
34
  }
29
- function compareLocalAsc(dateLeft, dateRight) {
30
- const diff = dateLeft.getFullYear() - dateRight.getFullYear() || dateLeft.getMonth() - dateRight.getMonth() || dateLeft.getDate() - dateRight.getDate() || dateLeft.getHours() - dateRight.getHours() || dateLeft.getMinutes() - dateRight.getMinutes() || dateLeft.getSeconds() - dateRight.getSeconds() || dateLeft.getMilliseconds() - dateRight.getMilliseconds();
31
- if (diff < 0) {
32
- return -1;
33
- } else if (diff > 0) {
34
- return 1;
35
- } else {
36
- return diff;
37
- }
35
+ function compareLocalAsc(laterDate, earlierDate) {
36
+ const diff = laterDate.getFullYear() - earlierDate.getFullYear() || laterDate.getMonth() - earlierDate.getMonth() || laterDate.getDate() - earlierDate.getDate() || laterDate.getHours() - earlierDate.getHours() || laterDate.getMinutes() - earlierDate.getMinutes() || laterDate.getSeconds() - earlierDate.getSeconds() || laterDate.getMilliseconds() - earlierDate.getMilliseconds();
37
+ if (diff < 0) return -1;
38
+ if (diff > 0) return 1;
39
+ return diff;
38
40
  }
39
- function differenceInHours(dateLeft, dateRight, options) {
40
- const diff = differenceInMilliseconds(dateLeft, dateRight) / millisecondsInHour;
41
+ function differenceInHours(laterDate, earlierDate, options) {
42
+ const [laterDate_, earlierDate_] = normalizeDates(
43
+ options == null ? void 0 : options.in,
44
+ laterDate,
45
+ earlierDate
46
+ );
47
+ const diff = (+laterDate_ - +earlierDate_) / millisecondsInHour;
41
48
  return getRoundingMethod(options == null ? void 0 : options.roundingMethod)(diff);
42
49
  }
43
- function subDays(date, amount) {
44
- return addDays(date, -amount);
50
+ function subDays(date, amount, options) {
51
+ return addDays(date, -amount, options);
45
52
  }
46
53
  function parseISO(argument, options) {
54
+ const invalidDate = () => constructFrom(options == null ? void 0 : options.in, NaN);
47
55
  const additionalDigits = 2;
48
56
  const dateStrings = splitDateString(argument);
49
57
  let date;
@@ -51,40 +59,34 @@ function parseISO(argument, options) {
51
59
  const parseYearResult = parseYear(dateStrings.date, additionalDigits);
52
60
  date = parseDate(parseYearResult.restDateString, parseYearResult.year);
53
61
  }
54
- if (!date || isNaN(date.getTime())) {
55
- return /* @__PURE__ */ new Date(NaN);
56
- }
57
- const timestamp = date.getTime();
62
+ if (!date || isNaN(+date)) return invalidDate();
63
+ const timestamp = +date;
58
64
  let time = 0;
59
65
  let offset;
60
66
  if (dateStrings.time) {
61
67
  time = parseTime(dateStrings.time);
62
- if (isNaN(time)) {
63
- return /* @__PURE__ */ new Date(NaN);
64
- }
68
+ if (isNaN(time)) return invalidDate();
65
69
  }
66
70
  if (dateStrings.timezone) {
67
71
  offset = parseTimezone(dateStrings.timezone);
68
- if (isNaN(offset)) {
69
- return /* @__PURE__ */ new Date(NaN);
70
- }
72
+ if (isNaN(offset)) return invalidDate();
71
73
  } else {
72
- const dirtyDate = new Date(timestamp + time);
73
- const result = /* @__PURE__ */ new Date(0);
74
+ const tmpDate = new Date(timestamp + time);
75
+ const result = toDate(0, options == null ? void 0 : options.in);
74
76
  result.setFullYear(
75
- dirtyDate.getUTCFullYear(),
76
- dirtyDate.getUTCMonth(),
77
- dirtyDate.getUTCDate()
77
+ tmpDate.getUTCFullYear(),
78
+ tmpDate.getUTCMonth(),
79
+ tmpDate.getUTCDate()
78
80
  );
79
81
  result.setHours(
80
- dirtyDate.getUTCHours(),
81
- dirtyDate.getUTCMinutes(),
82
- dirtyDate.getUTCSeconds(),
83
- dirtyDate.getUTCMilliseconds()
82
+ tmpDate.getUTCHours(),
83
+ tmpDate.getUTCMinutes(),
84
+ tmpDate.getUTCSeconds(),
85
+ tmpDate.getUTCMilliseconds()
84
86
  );
85
87
  return result;
86
88
  }
87
- return new Date(timestamp + time + offset);
89
+ return toDate(timestamp + time + offset, options == null ? void 0 : options.in);
88
90
  }
89
91
  const patterns = {
90
92
  dateTimeDelimiter: /[T ]/,
@@ -221,7 +223,7 @@ function validateTime(hours, minutes, seconds) {
221
223
  function validateTimezone(_hours, minutes) {
222
224
  return minutes >= 0 && minutes <= 59;
223
225
  }
224
- function subHours(date, amount) {
226
+ function subHours(date, amount, options) {
225
227
  return addHours(date, -amount);
226
228
  }
227
229
  function removeTimezoneFromISOTimeString(isoTime) {
@@ -286,4 +288,4 @@ export {
286
288
  durationToTime,
287
289
  removeTimezoneFromISOTimeString
288
290
  };
289
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGREYXlzLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRIb3Vycy5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluRGF5cy5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluSG91cnMubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkRheXMubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlSVNPLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJIb3Vycy5tanMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL2NvcmUvZGF0ZXRpbWUvZGF0ZS1oZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLm1qc1wiO1xuaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20ubWpzXCI7XG5cbi8qKlxuICogQG5hbWUgYWRkRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgZGF5cyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5cyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMTAgZGF5cyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IFRodSBTZXAgMTEgMjAxNCAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGF5cyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSk7XG4gIGlmIChpc05hTihhbW91bnQpKSByZXR1cm4gY29uc3RydWN0RnJvbShkYXRlLCBOYU4pO1xuICBpZiAoIWFtb3VudCkge1xuICAgIC8vIElmIDAgZGF5cywgbm8tb3AgdG8gYXZvaWQgY2hhbmdpbmcgdGltZXMgaW4gdGhlIGhvdXIgYmVmb3JlIGVuZCBvZiBEU1RcbiAgICByZXR1cm4gX2RhdGU7XG4gIH1cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBhbW91bnQpO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgYWRkRGF5cztcbiIsImltcG9ydCB7IGFkZE1pbGxpc2Vjb25kcyB9IGZyb20gXCIuL2FkZE1pbGxpc2Vjb25kcy5tanNcIjtcbmltcG9ydCB7IG1pbGxpc2Vjb25kc0luSG91ciB9IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcblxuLyoqXG4gKiBAbmFtZSBhZGRIb3Vyc1xuICogQGNhdGVnb3J5IEhvdXIgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgaG91cnMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGhvdXJzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAyIGhvdXJzIHRvIDEwIEp1bHkgMjAxNCAyMzowMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZEhvdXJzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAyMywgMCksIDIpXG4gKiAvLz0+IEZyaSBKdWwgMTEgMjAxNCAwMTowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkSG91cnMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgYW1vdW50ICogbWlsbGlzZWNvbmRzSW5Ib3VyKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBhZGRIb3VycztcbiIsImltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyB9IGZyb20gXCIuL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cy5tanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5tanNcIjtcblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5EYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgZGF5IHBlcmlvZHMgYmV0d2VlbiB0d28gZGF0ZXMuIEZyYWN0aW9uYWwgZGF5cyBhcmVcbiAqIHRydW5jYXRlZCB0b3dhcmRzIHplcm8uXG4gKlxuICogT25lIFwiZnVsbCBkYXlcIiBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBhIGxvY2FsIHRpbWUgaW4gb25lIGRheSB0byB0aGUgc2FtZVxuICogbG9jYWwgdGltZSBvbiB0aGUgbmV4dCBvciBwcmV2aW91cyBkYXkuIEEgZnVsbCBkYXkgY2FuIHNvbWV0aW1lcyBiZSBsZXNzIHRoYW5cbiAqIG9yIG1vcmUgdGhhbiAyNCBob3VycyBpZiBhIGRheWxpZ2h0IHNhdmluZ3MgY2hhbmdlIGhhcHBlbnMgYmV0d2VlbiB0d28gZGF0ZXMuXG4gKlxuICogVG8gaWdub3JlIERTVCBhbmQgb25seSBtZWFzdXJlIGV4YWN0IDI0LWhvdXIgcGVyaW9kcywgdXNlIHRoaXMgaW5zdGVhZDpcbiAqIGBNYXRoLnRydW5jKGRpZmZlcmVuY2VJbkhvdXJzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpLzI0KXwwYC5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGZ1bGwgZGF5cyBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsIHRpbWV6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGZ1bGwgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6MDA6MDAgYW5kIDIgSnVseSAyMDEyIDAwOjAwOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMiwgNiwgMiwgMCwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCAwKVxuICogKVxuICogLy89PiAzNjVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZnVsbCBkYXlzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxMSAyMzo1OTowMCBhbmQgMyBKdWx5IDIwMTEgMDA6MDE6MDA/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5EYXlzKFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAzLCAwLCAxKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDU5KVxuICogKVxuICogLy89PiAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGZ1bGwgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMSBNYXJjaCAyMDIwIDA6MDAgYW5kIDEgSnVuZSAyMDIwIDA6MDAgP1xuICogLy8gTm90ZTogYmVjYXVzZSBsb2NhbCB0aW1lIGlzIHVzZWQsIHRoZVxuICogLy8gcmVzdWx0IHdpbGwgYWx3YXlzIGJlIDkyIGRheXMsIGV2ZW4gaW5cbiAqIC8vIHRpbWUgem9uZXMgd2hlcmUgRFNUIHN0YXJ0cyBhbmQgdGhlXG4gKiAvLyBwZXJpb2QgaGFzIG9ubHkgOTIqMjQtMSBob3Vycy5cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkRheXMoXG4gKiAgIG5ldyBEYXRlKDIwMjAsIDUsIDEpLFxuICogICBuZXcgRGF0ZSgyMDIwLCAyLCAxKVxuICogKVxuICogLy89PiA5MlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZmVyZW5jZUluRGF5cyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9IHRvRGF0ZShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSB0b0RhdGUoZGF0ZVJpZ2h0KTtcblxuICBjb25zdCBzaWduID0gY29tcGFyZUxvY2FsQXNjKF9kYXRlTGVmdCwgX2RhdGVSaWdodCk7XG4gIGNvbnN0IGRpZmZlcmVuY2UgPSBNYXRoLmFicyhkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoX2RhdGVMZWZ0LCBfZGF0ZVJpZ2h0KSk7XG5cbiAgX2RhdGVMZWZ0LnNldERhdGUoX2RhdGVMZWZ0LmdldERhdGUoKSAtIHNpZ24gKiBkaWZmZXJlbmNlKTtcblxuICAvLyBNYXRoLmFicyhkaWZmIGluIGZ1bGwgZGF5cyAtIGRpZmYgaW4gY2FsZW5kYXIgZGF5cykgPT09IDEgaWYgbGFzdCBjYWxlbmRhciBkYXkgaXMgbm90IGZ1bGxcbiAgLy8gSWYgc28sIHJlc3VsdCBtdXN0IGJlIGRlY3JlYXNlZCBieSAxIGluIGFic29sdXRlIHZhbHVlXG4gIGNvbnN0IGlzTGFzdERheU5vdEZ1bGwgPSBOdW1iZXIoXG4gICAgY29tcGFyZUxvY2FsQXNjKF9kYXRlTGVmdCwgX2RhdGVSaWdodCkgPT09IC1zaWduLFxuICApO1xuICBjb25zdCByZXN1bHQgPSBzaWduICogKGRpZmZlcmVuY2UgLSBpc0xhc3REYXlOb3RGdWxsKTtcbiAgLy8gUHJldmVudCBuZWdhdGl2ZSB6ZXJvXG4gIHJldHVybiByZXN1bHQgPT09IDAgPyAwIDogcmVzdWx0O1xufVxuXG4vLyBMaWtlIGBjb21wYXJlQXNjYCBidXQgdXNlcyBsb2NhbCB0aW1lIG5vdCBVVEMsIHdoaWNoIGlzIG5lZWRlZFxuLy8gZm9yIGFjY3VyYXRlIGVxdWFsaXR5IGNvbXBhcmlzb25zIG9mIFVUQyB0aW1lc3RhbXBzIHRoYXQgZW5kIHVwXG4vLyBoYXZpbmcgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gaW4gbG9jYWwgdGltZSwgZS5nLiBvbmUgaG91ciBiZWZvcmVcbi8vIERTVCBlbmRzIHZzLiB0aGUgaW5zdGFudCB0aGF0IERTVCBlbmRzLlxuZnVuY3Rpb24gY29tcGFyZUxvY2FsQXNjKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgZGlmZiA9XG4gICAgZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSAtIGRhdGVSaWdodC5nZXRGdWxsWWVhcigpIHx8XG4gICAgZGF0ZUxlZnQuZ2V0TW9udGgoKSAtIGRhdGVSaWdodC5nZXRNb250aCgpIHx8XG4gICAgZGF0ZUxlZnQuZ2V0RGF0ZSgpIC0gZGF0ZVJpZ2h0LmdldERhdGUoKSB8fFxuICAgIGRhdGVMZWZ0LmdldEhvdXJzKCkgLSBkYXRlUmlnaHQuZ2V0SG91cnMoKSB8fFxuICAgIGRhdGVMZWZ0LmdldE1pbnV0ZXMoKSAtIGRhdGVSaWdodC5nZXRNaW51dGVzKCkgfHxcbiAgICBkYXRlTGVmdC5nZXRTZWNvbmRzKCkgLSBkYXRlUmlnaHQuZ2V0U2Vjb25kcygpIHx8XG4gICAgZGF0ZUxlZnQuZ2V0TWlsbGlzZWNvbmRzKCkgLSBkYXRlUmlnaHQuZ2V0TWlsbGlzZWNvbmRzKCk7XG5cbiAgaWYgKGRpZmYgPCAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2UgaWYgKGRpZmYgPiAwKSB7XG4gICAgcmV0dXJuIDE7XG4gICAgLy8gUmV0dXJuIDAgaWYgZGlmZiBpcyAwOyByZXR1cm4gTmFOIGlmIGRpZmYgaXMgTmFOXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRpZmY7XG4gIH1cbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlSW5EYXlzO1xuIiwiaW1wb3J0IHsgZ2V0Um91bmRpbmdNZXRob2QgfSBmcm9tIFwiLi9fbGliL2dldFJvdW5kaW5nTWV0aG9kLm1qc1wiO1xuaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5Ib3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzIH0gZnJvbSBcIi4vZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzLm1qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZGlmZmVyZW5jZUluSG91cnN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5Ib3Vyc1xuICogQGNhdGVnb3J5IEhvdXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgaG91cnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBob3VycyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGhvdXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGhvdXJzIGFyZSBiZXR3ZWVuIDIgSnVseSAyMDE0IDA2OjUwOjAwIGFuZCAyIEp1bHkgMjAxNCAxOTowMDowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkhvdXJzKFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxOSwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIsIDYsIDUwKVxuICogKVxuICogLy89PiAxMlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZmVyZW5jZUluSG91cnMoZGF0ZUxlZnQsIGRhdGVSaWdodCwgb3B0aW9ucykge1xuICBjb25zdCBkaWZmID1cbiAgICBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMoZGF0ZUxlZnQsIGRhdGVSaWdodCkgLyBtaWxsaXNlY29uZHNJbkhvdXI7XG4gIHJldHVybiBnZXRSb3VuZGluZ01ldGhvZChvcHRpb25zPy5yb3VuZGluZ01ldGhvZCkoZGlmZik7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZUluSG91cnM7XG4iLCJpbXBvcnQgeyBhZGREYXlzIH0gZnJvbSBcIi4vYWRkRGF5cy5tanNcIjtcblxuLyoqXG4gKiBAbmFtZSBzdWJEYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGRheXMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5cyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDEwIGRheXMgZnJvbSAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc3ViRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IEZyaSBBdWcgMjIgMjAxNCAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViRGF5cyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuIGFkZERheXMoZGF0ZSwgLWFtb3VudCk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgc3ViRGF5cztcbiIsImltcG9ydCB7IG1pbGxpc2Vjb25kc0luSG91ciwgbWlsbGlzZWNvbmRzSW5NaW51dGUgfSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBwYXJzZUlTT30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHBhcnNlSVNPXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFBhcnNlIElTTyBzdHJpbmdcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFBhcnNlIHRoZSBnaXZlbiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0IGFuZCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBGdW5jdGlvbiBhY2NlcHRzIGNvbXBsZXRlIElTTyA4NjAxIGZvcm1hdHMgYXMgd2VsbCBhcyBwYXJ0aWFsIGltcGxlbWVudGF0aW9ucy5cbiAqIElTTyA4NjAxOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzbid0IGEgc3RyaW5nLCB0aGUgZnVuY3Rpb24gY2Fubm90IHBhcnNlIHRoZSBzdHJpbmcgb3JcbiAqIHRoZSB2YWx1ZXMgYXJlIGludmFsaWQsIGl0IHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBhcmd1bWVudCAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHN0cmluZyAnMjAxNC0wMi0xMVQxMTozMDozMCcgdG8gZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlSVNPKCcyMDE0LTAyLTExVDExOjMwOjMwJylcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgc3RyaW5nICcrMDIwMTQxMDEnIHRvIGRhdGUsXG4gKiAvLyBpZiB0aGUgYWRkaXRpb25hbCBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBleHRlbmRlZCB5ZWFyIGZvcm1hdCBpcyAxOlxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VJU08oJyswMjAxNDEwMScsIHsgYWRkaXRpb25hbERpZ2l0czogMSB9KVxuICogLy89PiBGcmkgQXByIDExIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSVNPKGFyZ3VtZW50LCBvcHRpb25zKSB7XG4gIGNvbnN0IGFkZGl0aW9uYWxEaWdpdHMgPSBvcHRpb25zPy5hZGRpdGlvbmFsRGlnaXRzID8/IDI7XG4gIGNvbnN0IGRhdGVTdHJpbmdzID0gc3BsaXREYXRlU3RyaW5nKGFyZ3VtZW50KTtcblxuICBsZXQgZGF0ZTtcbiAgaWYgKGRhdGVTdHJpbmdzLmRhdGUpIHtcbiAgICBjb25zdCBwYXJzZVllYXJSZXN1bHQgPSBwYXJzZVllYXIoZGF0ZVN0cmluZ3MuZGF0ZSwgYWRkaXRpb25hbERpZ2l0cyk7XG4gICAgZGF0ZSA9IHBhcnNlRGF0ZShwYXJzZVllYXJSZXN1bHQucmVzdERhdGVTdHJpbmcsIHBhcnNlWWVhclJlc3VsdC55ZWFyKTtcbiAgfVxuXG4gIGlmICghZGF0ZSB8fCBpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxuXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICBsZXQgdGltZSA9IDA7XG4gIGxldCBvZmZzZXQ7XG5cbiAgaWYgKGRhdGVTdHJpbmdzLnRpbWUpIHtcbiAgICB0aW1lID0gcGFyc2VUaW1lKGRhdGVTdHJpbmdzLnRpbWUpO1xuICAgIGlmIChpc05hTih0aW1lKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRhdGVTdHJpbmdzLnRpbWV6b25lKSB7XG4gICAgb2Zmc2V0ID0gcGFyc2VUaW1lem9uZShkYXRlU3RyaW5ncy50aW1lem9uZSk7XG4gICAgaWYgKGlzTmFOKG9mZnNldCkpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaXJ0eURhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXAgKyB0aW1lKTtcbiAgICAvLyBKUyBwYXJzZWQgc3RyaW5nIGFzc3VtaW5nIGl0J3MgaW4gVVRDIHRpbWV6b25lXG4gICAgLy8gYnV0IHdlIG5lZWQgaXQgdG8gYmUgcGFyc2VkIGluIG91ciB0aW1lem9uZVxuICAgIC8vIHNvIHdlIHVzZSB1dGMgdmFsdWVzIHRvIGJ1aWxkIGRhdGUgaW4gb3VyIHRpbWV6b25lLlxuICAgIC8vIFllYXIgdmFsdWVzIGZyb20gMCB0byA5OSBtYXAgdG8gdGhlIHllYXJzIDE5MDAgdG8gMTk5OVxuICAgIC8vIHNvIHNldCB5ZWFyIGV4cGxpY2l0bHkgd2l0aCBzZXRGdWxsWWVhci5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRGF0ZSgwKTtcbiAgICByZXN1bHQuc2V0RnVsbFllYXIoXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENNb250aCgpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ0RhdGUoKSxcbiAgICApO1xuICAgIHJlc3VsdC5zZXRIb3VycyhcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENIb3VycygpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENTZWNvbmRzKCksXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcCArIHRpbWUgKyBvZmZzZXQpO1xufVxuXG5jb25zdCBwYXR0ZXJucyA9IHtcbiAgZGF0ZVRpbWVEZWxpbWl0ZXI6IC9bVCBdLyxcbiAgdGltZVpvbmVEZWxpbWl0ZXI6IC9bWiBdL2ksXG4gIHRpbWV6b25lOiAvKFtaKy1dLiopJC8sXG59O1xuXG5jb25zdCBkYXRlUmVnZXggPVxuICAvXi0/KD86KFxcZHszfSl8KFxcZHsyfSkoPzotPyhcXGR7Mn0pKT98VyhcXGR7Mn0pKD86LT8oXFxkezF9KSk/fCkkLztcbmNvbnN0IHRpbWVSZWdleCA9XG4gIC9eKFxcZHsyfSg/OlsuLF1cXGQqKT8pKD86Oj8oXFxkezJ9KD86Wy4sXVxcZCopPykpPyg/Ojo/KFxcZHsyfSg/OlsuLF1cXGQqKT8pKT8kLztcbmNvbnN0IHRpbWV6b25lUmVnZXggPSAvXihbKy1dKShcXGR7Mn0pKD86Oj8oXFxkezJ9KSk/JC87XG5cbmZ1bmN0aW9uIHNwbGl0RGF0ZVN0cmluZyhkYXRlU3RyaW5nKSB7XG4gIGNvbnN0IGRhdGVTdHJpbmdzID0ge307XG4gIGNvbnN0IGFycmF5ID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy5kYXRlVGltZURlbGltaXRlcik7XG4gIGxldCB0aW1lU3RyaW5nO1xuXG4gIC8vIFRoZSByZWdleCBtYXRjaCBzaG91bGQgb25seSByZXR1cm4gYXQgbWF4aW11bSB0d28gYXJyYXkgZWxlbWVudHMuXG4gIC8vIFtkYXRlXSwgW3RpbWVdLCBvciBbZGF0ZSwgdGltZV0uXG4gIGlmIChhcnJheS5sZW5ndGggPiAyKSB7XG4gICAgcmV0dXJuIGRhdGVTdHJpbmdzO1xuICB9XG5cbiAgaWYgKC86Ly50ZXN0KGFycmF5WzBdKSkge1xuICAgIHRpbWVTdHJpbmcgPSBhcnJheVswXTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlU3RyaW5ncy5kYXRlID0gYXJyYXlbMF07XG4gICAgdGltZVN0cmluZyA9IGFycmF5WzFdO1xuICAgIGlmIChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlci50ZXN0KGRhdGVTdHJpbmdzLmRhdGUpKSB7XG4gICAgICBkYXRlU3RyaW5ncy5kYXRlID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlcilbMF07XG4gICAgICB0aW1lU3RyaW5nID0gZGF0ZVN0cmluZy5zdWJzdHIoXG4gICAgICAgIGRhdGVTdHJpbmdzLmRhdGUubGVuZ3RoLFxuICAgICAgICBkYXRlU3RyaW5nLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRpbWVTdHJpbmcpIHtcbiAgICBjb25zdCB0b2tlbiA9IHBhdHRlcm5zLnRpbWV6b25lLmV4ZWModGltZVN0cmluZyk7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lID0gdGltZVN0cmluZy5yZXBsYWNlKHRva2VuWzFdLCBcIlwiKTtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWV6b25lID0gdG9rZW5bMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRlU3RyaW5ncztcbn1cblxuZnVuY3Rpb24gcGFyc2VZZWFyKGRhdGVTdHJpbmcsIGFkZGl0aW9uYWxEaWdpdHMpIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIFwiXig/OihcXFxcZHs0fXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDQgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pfChcXFxcZHsyfXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDIgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pJClcIixcbiAgKTtcblxuICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2gocmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgeWVhclxuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4geyB5ZWFyOiBOYU4sIHJlc3REYXRlU3RyaW5nOiBcIlwiIH07XG5cbiAgY29uc3QgeWVhciA9IGNhcHR1cmVzWzFdID8gcGFyc2VJbnQoY2FwdHVyZXNbMV0pIDogbnVsbDtcbiAgY29uc3QgY2VudHVyeSA9IGNhcHR1cmVzWzJdID8gcGFyc2VJbnQoY2FwdHVyZXNbMl0pIDogbnVsbDtcblxuICAvLyBlaXRoZXIgeWVhciBvciBjZW50dXJ5IGlzIG51bGwsIG5vdCBib3RoXG4gIHJldHVybiB7XG4gICAgeWVhcjogY2VudHVyeSA9PT0gbnVsbCA/IHllYXIgOiBjZW50dXJ5ICogMTAwLFxuICAgIHJlc3REYXRlU3RyaW5nOiBkYXRlU3RyaW5nLnNsaWNlKChjYXB0dXJlc1sxXSB8fCBjYXB0dXJlc1syXSkubGVuZ3RoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlKGRhdGVTdHJpbmcsIHllYXIpIHtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHllYXJcbiAgaWYgKHllYXIgPT09IG51bGwpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGNhcHR1cmVzID0gZGF0ZVN0cmluZy5tYXRjaChkYXRlUmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgc3RyaW5nXG4gIGlmICghY2FwdHVyZXMpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGlzV2Vla0RhdGUgPSAhIWNhcHR1cmVzWzRdO1xuICBjb25zdCBkYXlPZlllYXIgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzFdKTtcbiAgY29uc3QgbW9udGggPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzJdKSAtIDE7XG4gIGNvbnN0IGRheSA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbM10pO1xuICBjb25zdCB3ZWVrID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1s0XSk7XG4gIGNvbnN0IGRheU9mV2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNV0pIC0gMTtcblxuICBpZiAoaXNXZWVrRGF0ZSkge1xuICAgIGlmICghdmFsaWRhdGVXZWVrRGF0ZSh5ZWFyLCB3ZWVrLCBkYXlPZldlZWspKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgcmV0dXJuIGRheU9mSVNPV2Vla1llYXIoeWVhciwgd2VlaywgZGF5T2ZXZWVrKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgaWYgKFxuICAgICAgIXZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSB8fFxuICAgICAgIXZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyLCBtb250aCwgTWF0aC5tYXgoZGF5T2ZZZWFyLCBkYXkpKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZURhdGVVbml0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IHBhcnNlSW50KHZhbHVlKSA6IDE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZSh0aW1lU3RyaW5nKSB7XG4gIGNvbnN0IGNhcHR1cmVzID0gdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gTmFOOyAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgdGltZVxuXG4gIGNvbnN0IGhvdXJzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1sxXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzJdKTtcbiAgY29uc3Qgc2Vjb25kcyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbM10pO1xuXG4gIGlmICghdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGhvdXJzICogbWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlICsgc2Vjb25kcyAqIDEwMDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lVW5pdCh2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHBhcnNlRmxvYXQodmFsdWUucmVwbGFjZShcIixcIiwgXCIuXCIpKSkgfHwgMDtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lem9uZSh0aW1lem9uZVN0cmluZykge1xuICBpZiAodGltZXpvbmVTdHJpbmcgPT09IFwiWlwiKSByZXR1cm4gMDtcblxuICBjb25zdCBjYXB0dXJlcyA9IHRpbWV6b25lU3RyaW5nLm1hdGNoKHRpbWV6b25lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gMDtcblxuICBjb25zdCBzaWduID0gY2FwdHVyZXNbMV0gPT09IFwiK1wiID8gLTEgOiAxO1xuICBjb25zdCBob3VycyA9IHBhcnNlSW50KGNhcHR1cmVzWzJdKTtcbiAgY29uc3QgbWludXRlcyA9IChjYXB0dXJlc1szXSAmJiBwYXJzZUludChjYXB0dXJlc1szXSkpIHx8IDA7XG5cbiAgaWYgKCF2YWxpZGF0ZVRpbWV6b25lKGhvdXJzLCBtaW51dGVzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gc2lnbiAqIChob3VycyAqIG1pbGxpc2Vjb25kc0luSG91ciArIG1pbnV0ZXMgKiBtaWxsaXNlY29uZHNJbk1pbnV0ZSk7XG59XG5cbmZ1bmN0aW9uIGRheU9mSVNPV2Vla1llYXIoaXNvV2Vla1llYXIsIHdlZWssIGRheSkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gIGRhdGUuc2V0VVRDRnVsbFllYXIoaXNvV2Vla1llYXIsIDAsIDQpO1xuICBjb25zdCBmb3VydGhPZkphbnVhcnlEYXkgPSBkYXRlLmdldFVUQ0RheSgpIHx8IDc7XG4gIGNvbnN0IGRpZmYgPSAod2VlayAtIDEpICogNyArIGRheSArIDEgLSBmb3VydGhPZkphbnVhcnlEYXk7XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIGRpZmYpO1xuICByZXR1cm4gZGF0ZTtcbn1cblxuLy8gVmFsaWRhdGlvbiBmdW5jdGlvbnNcblxuLy8gRmVicnVhcnkgaXMgbnVsbCB0byBoYW5kbGUgdGhlIGxlYXAgeWVhciAodXNpbmcgfHwpXG5jb25zdCBkYXlzSW5Nb250aHMgPSBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcblxuZnVuY3Rpb24gaXNMZWFwWWVhckluZGV4KHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0MDAgPT09IDAgfHwgKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURhdGUoeWVhciwgbW9udGgsIGRhdGUpIHtcbiAgcmV0dXJuIChcbiAgICBtb250aCA+PSAwICYmXG4gICAgbW9udGggPD0gMTEgJiZcbiAgICBkYXRlID49IDEgJiZcbiAgICBkYXRlIDw9IChkYXlzSW5Nb250aHNbbW9udGhdIHx8IChpc0xlYXBZZWFySW5kZXgoeWVhcikgPyAyOSA6IDI4KSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEYXlPZlllYXJEYXRlKHllYXIsIGRheU9mWWVhcikge1xuICByZXR1cm4gZGF5T2ZZZWFyID49IDEgJiYgZGF5T2ZZZWFyIDw9IChpc0xlYXBZZWFySW5kZXgoeWVhcikgPyAzNjYgOiAzNjUpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVdlZWtEYXRlKF95ZWFyLCB3ZWVrLCBkYXkpIHtcbiAgcmV0dXJuIHdlZWsgPj0gMSAmJiB3ZWVrIDw9IDUzICYmIGRheSA+PSAwICYmIGRheSA8PSA2O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpIHtcbiAgaWYgKGhvdXJzID09PSAyNCkge1xuICAgIHJldHVybiBtaW51dGVzID09PSAwICYmIHNlY29uZHMgPT09IDA7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHNlY29uZHMgPj0gMCAmJlxuICAgIHNlY29uZHMgPCA2MCAmJlxuICAgIG1pbnV0ZXMgPj0gMCAmJlxuICAgIG1pbnV0ZXMgPCA2MCAmJlxuICAgIGhvdXJzID49IDAgJiZcbiAgICBob3VycyA8IDI1XG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGltZXpvbmUoX2hvdXJzLCBtaW51dGVzKSB7XG4gIHJldHVybiBtaW51dGVzID49IDAgJiYgbWludXRlcyA8PSA1OTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBwYXJzZUlTTztcbiIsImltcG9ydCB7IGFkZEhvdXJzIH0gZnJvbSBcIi4vYWRkSG91cnMubWpzXCI7XG5cbi8qKlxuICogQG5hbWUgc3ViSG91cnNcbiAqIEBjYXRlZ29yeSBIb3VyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBob3VycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgaG91cnMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgaG91cnMgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCAyIGhvdXJzIGZyb20gMTEgSnVseSAyMDE0IDAxOjAwOjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3ViSG91cnMobmV3IERhdGUoMjAxNCwgNiwgMTEsIDEsIDApLCAyKVxuICogLy89PiBUaHUgSnVsIDEwIDIwMTQgMjM6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YkhvdXJzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gYWRkSG91cnMoZGF0ZSwgLWFtb3VudCk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgc3ViSG91cnM7XG4iLCJpbXBvcnQge1xuICBpMThuRHVyYXRpb25Ib3VyLFxuICBpMThuRHVyYXRpb25NaW51dGUsXG4gIGkxOG5EdXJhdGlvbkRheSxcbn0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9pMThuLmpzJztcbmltcG9ydCB7XG4gIGlzVmFsaWQsXG4gIHBhcnNlSVNPLFxuICBkaWZmZXJlbmNlSW5EYXlzLFxuICBkaWZmZXJlbmNlSW5Ib3VycyxcbiAgZGlmZmVyZW5jZUluTWludXRlcyxcbiAgYWRkTWludXRlcyxcbiAgc3ViSG91cnMsXG4gIHN1YkRheXMsXG59IGZyb20gJ2RhdGUtZm5zJztcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIG9mZnNldCBvZiBhIElTTyBkYXRlIHN0cmluZy4gVGhpcyBuZWVkcyB0byBiZSBkb25lIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvZmZzZXQgaXMgaWdub3JlZC5cbiAqIElmIGl0IGlzIG5vdCByZW1vdmVkIHRoZSB0aW1lIHdvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgYnJvd3NlcnMgbG9jYWwgdGltZS5cbiAqIEV4YW1wbGU6IFwiMjAyMi0wOC0yOVQwOTozMDowMCswMzowMFwiIHdvdWxkIGJlIGNoYW5nZWQgdG8gXCIyMDIyLTA4LTI5VDA4OjMwOjAwKzAyOjAwXCIgLS0+IG5vdCB0aGUgZGVzaXJlZCBvdXRjb21lLCBhcyB3ZSB3YW50IHRvIHVzZSB0aGUgdGltZSBpbiB0aGUgdGltZXpvbmUgYW5kIG5vdCB0aGUgbG9jYWwgdGltZS5cbiAqXG4gKiBBZnRlciB0aGUgb2Zmc2V0IGlzIHJlbW92ZWQgYSBuZXcgZGF0ZSBpcyBjcmVhdGVkIGluIHRoZSBicm93c2VycyBsb2NhbCB0aW1lLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdGltZSBvZiB0aGUgSVNPIGRhdGUgc3RyaW5nIGlzIGRpc3BsYXllZCBhbmQgbm90IGEgY29udmVydGVkIHRpbWUuXG4gKiBFeGFtcGxlOiBcIjIwMjItMDgtMjlUMDk6MzA6MDArMDM6MDBcIiB3b3VsZCBiZSBjaGFuZ2VkIHRvIFwiMjAyMi0wOC0yOVQwOTozMDowMCswMjowMFwiIC0tPiBkZXNpcmVkIG91dGNvbWVcbiAqIEF0dGVudGlvbjogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoZSBjb3JyZWN0IHRpbWUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLiBJdCBpcyBhIHdvcmthcm91bmQgdG8gbWFrZSBzdXJlLCB0aGF0IHRoZSBnaXZlbiB0aW1lIGlzIGRpc3BsYXllZCB3aXRob3V0IGJlaW5nIGNvbnZlcnRlZC5cbiAqXG4gKiBPZmZzZXQ6IERpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdGltZXpvbmUgYW5kIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lLlxuICpcbiAqIEBwYXJhbSBpc29UaW1lIC0gdGhlIGlzbyB0aW1lIHdpdGggdGhlIHRpbWV6b25lIG9mZnNldFxuICogQHJldHVybnMgYSBuZXcgZGF0ZSB3aXRoIHRoZSBsb2NhbCB0aW1lem9uZSB3aXRoIHRoZSBsb2NhbCBvZmZzZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRpbWV6b25lRnJvbUlTT1RpbWVTdHJpbmcoaXNvVGltZT86IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzb1RpbWUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHBhcnNlZERhdGUgPSBwYXJzZUlTTyhpc29UaW1lKTtcblxuICBpZiAoIWlzVmFsaWQocGFyc2VkRGF0ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGlzb1RpbWUuaW5jbHVkZXMoJ1onKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShpc29UaW1lLnJlcGxhY2UoJ1onLCAnJykpO1xuICB9XG5cbiAgaWYgKGlzb1RpbWUuaW5jbHVkZXMoJ1QnKSkge1xuICAgIGNvbnN0IGRhdGVUaW1lID0gaXNvVGltZS5zcGxpdCgnVCcpO1xuXG4gICAgaWYgKGRhdGVUaW1lWzFdICYmIChkYXRlVGltZVsxXS5pbmNsdWRlcygnKycpIHx8IGRhdGVUaW1lWzFdLmluY2x1ZGVzKCctJykpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoYCR7ZGF0ZVRpbWVbMF19VCR7ZGF0ZVRpbWVbMV0uc3BsaXQoL1srLV0vKVswXX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRlKGlzb1RpbWUpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBkdXJhdGlvbiBudW1iZXIgdG8gZGF0ZSBzdHJpbmcgd2l0aCBzcGVjaWZpYyBmb3JtYXRcbiAqXG4gKiBAcGFyYW0gZHVyYXRpb24gLSBkdXJhdGlvbiBpbiBtaW51dGVzXG4gKiBAcGFyYW0gY3VycmVudExhbmd1YWdlIC0gY3VycmVudExhbmd1YWdlXG4gKiBAcmV0dXJucyBhbiBPYmplY3Qgd2l0aCB0d28gc3RyaW5ncyBpbiB0aGUgZm9ybWF0IFwiZGQgaGggbW1cIiAoc2hvcnQpIGFuIFwieCBEYXkocykgeCBIb3VyKHMpIHggTWludXRlKHMpIChsb25nKVwiXG4gKiAqL1xuXG5leHBvcnQgY29uc3QgZHVyYXRpb25Ub1RpbWUgPSAoXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGN1cnJlbnRMYW5ndWFnZT86IHN0cmluZyxcbik6IHsgc2hvcnQ6IHN0cmluZzsgbG9uZzogc3RyaW5nIH0gPT4ge1xuICBjb25zdCBzaG9ydCA9IFtdO1xuICBjb25zdCBsb25nID0gW107XG5cbiAgY29uc3Qgbm93ID0gMDtcbiAgbGV0IGZ1dHVyZSA9IGFkZE1pbnV0ZXMobm93LCBkdXJhdGlvbik7XG5cbiAgY29uc3QgZGF5cyA9IGRpZmZlcmVuY2VJbkRheXMoZnV0dXJlLCBub3cpO1xuICBpZiAoZGF5cyA+IDApIHtcbiAgICBzaG9ydC5wdXNoKGAke2RheXN9IGRgKTtcbiAgICBpZiAoY3VycmVudExhbmd1YWdlKSB7XG4gICAgICBsb25nLnB1c2goXG4gICAgICAgIGAke2RheXN9ICR7XG4gICAgICAgICAgZGF5cyA+IDFcbiAgICAgICAgICAgID8gaTE4bkR1cmF0aW9uRGF5Lm11bHRpcGxlLmxvbmdbY3VycmVudExhbmd1YWdlXVxuICAgICAgICAgICAgOiBpMThuRHVyYXRpb25EYXkuc2luZ2xlLmxvbmdbY3VycmVudExhbmd1YWdlXVxuICAgICAgICB9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1dHVyZSA9IHN1YkRheXMoZnV0dXJlLCBkYXlzKTtcbiAgfVxuXG4gIGNvbnN0IGhvdXJzID0gZGlmZmVyZW5jZUluSG91cnMoZnV0dXJlLCBub3cpO1xuICBpZiAoaG91cnMgPiAwKSB7XG4gICAgc2hvcnQucHVzaChgJHtob3Vyc30gaGApO1xuICAgIGlmIChjdXJyZW50TGFuZ3VhZ2UpIHtcbiAgICAgIGxvbmcucHVzaChcbiAgICAgICAgYCR7aG91cnN9ICR7XG4gICAgICAgICAgaG91cnMgPiAxXG4gICAgICAgICAgICA/IGkxOG5EdXJhdGlvbkhvdXIubXVsdGlwbGUubG9uZ1tjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgICAgICA6IGkxOG5EdXJhdGlvbkhvdXIuc2luZ2xlLmxvbmdbY3VycmVudExhbmd1YWdlXVxuICAgICAgICB9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1dHVyZSA9IHN1YkhvdXJzKGZ1dHVyZSwgaG91cnMpO1xuICB9XG5cbiAgY29uc3QgbWludXRlcyA9IGRpZmZlcmVuY2VJbk1pbnV0ZXMoZnV0dXJlLCBub3cpO1xuICBpZiAobWludXRlcyA+IDApIHtcbiAgICBzaG9ydC5wdXNoKGAke21pbnV0ZXN9IG1pbmApO1xuICAgIGlmIChjdXJyZW50TGFuZ3VhZ2UpIHtcbiAgICAgIGxvbmcucHVzaChcbiAgICAgICAgYCR7bWludXRlc30gJHtcbiAgICAgICAgICBtaW51dGVzID4gMVxuICAgICAgICAgICAgPyBpMThuRHVyYXRpb25NaW51dGUubXVsdGlwbGUubG9uZ1tjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgICAgICA6IGkxOG5EdXJhdGlvbk1pbnV0ZS5zaW5nbGUubG9uZ1tjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNob3J0OiBzaG9ydC5qb2luKCcgJyksXG4gICAgbG9uZzogbG9u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
291
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGREYXlzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1pbGxpc2Vjb25kcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRIb3Vycy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5EYXlzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkhvdXJzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkRheXMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2VJU08uanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViSG91cnMuanMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL2NvcmUvZGF0ZXRpbWUvZGF0ZS1oZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgYWRkRGF5c30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGFkZERheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBkYXlzIHRvIGJlIGFkZGVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheXMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDEwIGRheXMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZERheXMobmV3IERhdGUoMjAxNCwgOCwgMSksIDEwKVxuICogLy89PiBUaHUgU2VwIDExIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERheXMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgaWYgKGlzTmFOKGFtb3VudCkpIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIE5hTik7XG5cbiAgLy8gSWYgMCBkYXlzLCBuby1vcCB0byBhdm9pZCBjaGFuZ2luZyB0aW1lcyBpbiB0aGUgaG91ciBiZWZvcmUgZW5kIG9mIERTVFxuICBpZiAoIWFtb3VudCkgcmV0dXJuIF9kYXRlO1xuXG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGFkZERheXM7XG4iLCJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBhZGRNaWxsaXNlY29uZHN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBhZGRNaWxsaXNlY29uZHNcbiAqIEBjYXRlZ29yeSBNaWxsaXNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgYWRkZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDc1MCBtaWxsaXNlY29uZHMgdG8gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwLjc1MFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykge1xuICByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCArdG9EYXRlKGRhdGUpICsgYW1vdW50KTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBhZGRNaWxsaXNlY29uZHM7XG4iLCJpbXBvcnQgeyBhZGRNaWxsaXNlY29uZHMgfSBmcm9tIFwiLi9hZGRNaWxsaXNlY29uZHMuanNcIjtcbmltcG9ydCB7IG1pbGxpc2Vjb25kc0luSG91ciB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgYWRkSG91cnN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBhZGRIb3Vyc1xuICogQGNhdGVnb3J5IEhvdXIgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGhvdXJzIHRvIGJlIGFkZGVkXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgaG91cnMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDIgaG91cnMgdG8gMTAgSnVseSAyMDE0IDIzOjAwOjAwOlxuICogY29uc3QgcmVzdWx0ID0gYWRkSG91cnMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDIzLCAwKSwgMilcbiAqIC8vPT4gRnJpIEp1bCAxMSAyMDE0IDAxOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRIb3VycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFkZE1pbGxpc2Vjb25kcyhkYXRlLCBhbW91bnQgKiBtaWxsaXNlY29uZHNJbkhvdXIsIG9wdGlvbnMpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGFkZEhvdXJzO1xuIiwiaW1wb3J0IHsgbm9ybWFsaXplRGF0ZXMgfSBmcm9tIFwiLi9fbGliL25vcm1hbGl6ZURhdGVzLmpzXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGRpZmZlcmVuY2VJbkRheXN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5EYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgZGF5IHBlcmlvZHMgYmV0d2VlbiB0d28gZGF0ZXMuIEZyYWN0aW9uYWwgZGF5cyBhcmVcbiAqIHRydW5jYXRlZCB0b3dhcmRzIHplcm8uXG4gKlxuICogT25lIFwiZnVsbCBkYXlcIiBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBhIGxvY2FsIHRpbWUgaW4gb25lIGRheSB0byB0aGUgc2FtZVxuICogbG9jYWwgdGltZSBvbiB0aGUgbmV4dCBvciBwcmV2aW91cyBkYXkuIEEgZnVsbCBkYXkgY2FuIHNvbWV0aW1lcyBiZSBsZXNzIHRoYW5cbiAqIG9yIG1vcmUgdGhhbiAyNCBob3VycyBpZiBhIGRheWxpZ2h0IHNhdmluZ3MgY2hhbmdlIGhhcHBlbnMgYmV0d2VlbiB0d28gZGF0ZXMuXG4gKlxuICogVG8gaWdub3JlIERTVCBhbmQgb25seSBtZWFzdXJlIGV4YWN0IDI0LWhvdXIgcGVyaW9kcywgdXNlIHRoaXMgaW5zdGVhZDpcbiAqIGBNYXRoLnRydW5jKGRpZmZlcmVuY2VJbkhvdXJzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpLzI0KXwwYC5cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgZnVsbCBkYXlzIGFjY29yZGluZyB0byB0aGUgbG9jYWwgdGltZXpvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZnVsbCBkYXlzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxMSAyMzowMDowMCBhbmQgMiBKdWx5IDIwMTIgMDA6MDA6MDA/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5EYXlzKFxuICogICBuZXcgRGF0ZSgyMDEyLCA2LCAyLCAwLCAwKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDApXG4gKiApXG4gKiAvLz0+IDM2NVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBmdWxsIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjU5OjAwIGFuZCAzIEp1bHkgMjAxMSAwMDowMTowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkRheXMoXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDMsIDAsIDEpLFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAyLCAyMywgNTkpXG4gKiApXG4gKiAvLz0+IDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZnVsbCBkYXlzIGFyZSBiZXR3ZWVuXG4gKiAvLyAxIE1hcmNoIDIwMjAgMDowMCBhbmQgMSBKdW5lIDIwMjAgMDowMCA/XG4gKiAvLyBOb3RlOiBiZWNhdXNlIGxvY2FsIHRpbWUgaXMgdXNlZCwgdGhlXG4gKiAvLyByZXN1bHQgd2lsbCBhbHdheXMgYmUgOTIgZGF5cywgZXZlbiBpblxuICogLy8gdGltZSB6b25lcyB3aGVyZSBEU1Qgc3RhcnRzIGFuZCB0aGVcbiAqIC8vIHBlcmlvZCBoYXMgb25seSA5MioyNC0xIGhvdXJzLlxuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluRGF5cyhcbiAqICAgbmV3IERhdGUoMjAyMCwgNSwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMjAsIDIsIDEpXG4gKiApXG4gKiAvLz0+IDkyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXJlbmNlSW5EYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcyhcbiAgICBvcHRpb25zPy5pbixcbiAgICBsYXRlckRhdGUsXG4gICAgZWFybGllckRhdGUsXG4gICk7XG5cbiAgY29uc3Qgc2lnbiA9IGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pO1xuICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoXG4gICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyksXG4gICk7XG5cbiAgbGF0ZXJEYXRlXy5zZXREYXRlKGxhdGVyRGF0ZV8uZ2V0RGF0ZSgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpO1xuXG4gIC8vIE1hdGguYWJzKGRpZmYgaW4gZnVsbCBkYXlzIC0gZGlmZiBpbiBjYWxlbmRhciBkYXlzKSA9PT0gMSBpZiBsYXN0IGNhbGVuZGFyIGRheSBpcyBub3QgZnVsbFxuICAvLyBJZiBzbywgcmVzdWx0IG11c3QgYmUgZGVjcmVhc2VkIGJ5IDEgaW4gYWJzb2x1dGUgdmFsdWVcbiAgY29uc3QgaXNMYXN0RGF5Tm90RnVsbCA9IE51bWJlcihcbiAgICBjb21wYXJlTG9jYWxBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSA9PT0gLXNpZ24sXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmZXJlbmNlIC0gaXNMYXN0RGF5Tm90RnVsbCk7XG4gIC8vIFByZXZlbnQgbmVnYXRpdmUgemVyb1xuICByZXR1cm4gcmVzdWx0ID09PSAwID8gMCA6IHJlc3VsdDtcbn1cblxuLy8gTGlrZSBgY29tcGFyZUFzY2AgYnV0IHVzZXMgbG9jYWwgdGltZSBub3QgVVRDLCB3aGljaCBpcyBuZWVkZWRcbi8vIGZvciBhY2N1cmF0ZSBlcXVhbGl0eSBjb21wYXJpc29ucyBvZiBVVEMgdGltZXN0YW1wcyB0aGF0IGVuZCB1cFxuLy8gaGF2aW5nIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGluIGxvY2FsIHRpbWUsIGUuZy4gb25lIGhvdXIgYmVmb3JlXG4vLyBEU1QgZW5kcyB2cy4gdGhlIGluc3RhbnQgdGhhdCBEU1QgZW5kcy5cbmZ1bmN0aW9uIGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7XG4gIGNvbnN0IGRpZmYgPVxuICAgIGxhdGVyRGF0ZS5nZXRGdWxsWWVhcigpIC0gZWFybGllckRhdGUuZ2V0RnVsbFllYXIoKSB8fFxuICAgIGxhdGVyRGF0ZS5nZXRNb250aCgpIC0gZWFybGllckRhdGUuZ2V0TW9udGgoKSB8fFxuICAgIGxhdGVyRGF0ZS5nZXREYXRlKCkgLSBlYXJsaWVyRGF0ZS5nZXREYXRlKCkgfHxcbiAgICBsYXRlckRhdGUuZ2V0SG91cnMoKSAtIGVhcmxpZXJEYXRlLmdldEhvdXJzKCkgfHxcbiAgICBsYXRlckRhdGUuZ2V0TWludXRlcygpIC0gZWFybGllckRhdGUuZ2V0TWludXRlcygpIHx8XG4gICAgbGF0ZXJEYXRlLmdldFNlY29uZHMoKSAtIGVhcmxpZXJEYXRlLmdldFNlY29uZHMoKSB8fFxuICAgIGxhdGVyRGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuXG4gIGlmIChkaWZmIDwgMCkgcmV0dXJuIC0xO1xuICBpZiAoZGlmZiA+IDApIHJldHVybiAxO1xuXG4gIC8vIFJldHVybiAwIGlmIGRpZmYgaXMgMDsgcmV0dXJuIE5hTiBpZiBkaWZmIGlzIE5hTlxuICByZXR1cm4gZGlmZjtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlSW5EYXlzO1xuIiwiaW1wb3J0IHsgZ2V0Um91bmRpbmdNZXRob2QgfSBmcm9tIFwiLi9fbGliL2dldFJvdW5kaW5nTWV0aG9kLmpzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVEYXRlcyB9IGZyb20gXCIuL19saWIvbm9ybWFsaXplRGF0ZXMuanNcIjtcbmltcG9ydCB7IG1pbGxpc2Vjb25kc0luSG91ciB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZGlmZmVyZW5jZUluSG91cnN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5Ib3Vyc1xuICogQGNhdGVnb3J5IEhvdXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgaG91cnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBob3VycyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGhvdXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGhvdXJzIGFyZSBiZXR3ZWVuIDIgSnVseSAyMDE0IDA2OjUwOjAwIGFuZCAyIEp1bHkgMjAxNCAxOTowMDowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkhvdXJzKFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxOSwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIsIDYsIDUwKVxuICogKVxuICogLy89PiAxMlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZmVyZW5jZUluSG91cnMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKFxuICAgIG9wdGlvbnM/LmluLFxuICAgIGxhdGVyRGF0ZSxcbiAgICBlYXJsaWVyRGF0ZSxcbiAgKTtcbiAgY29uc3QgZGlmZiA9ICgrbGF0ZXJEYXRlXyAtICtlYXJsaWVyRGF0ZV8pIC8gbWlsbGlzZWNvbmRzSW5Ib3VyO1xuICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2VJbkhvdXJzO1xuIiwiaW1wb3J0IHsgYWRkRGF5cyB9IGZyb20gXCIuL2FkZERheXMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN1YkRheXN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdWJEYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBkYXlzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5cyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDEwIGRheXMgZnJvbSAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc3ViRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IEZyaSBBdWcgMjIgMjAxNCAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViRGF5cyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFkZERheXMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgc3ViRGF5cztcbiIsImltcG9ydCB7XG4gIG1pbGxpc2Vjb25kc0luSG91cixcbiAgbWlsbGlzZWNvbmRzSW5NaW51dGUsXG59IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgcGFyc2VJU099IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBwYXJzZUlTT1xuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBQYXJzZSBJU08gc3RyaW5nXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCBhbmQgcmV0dXJuIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogRnVuY3Rpb24gYWNjZXB0cyBjb21wbGV0ZSBJU08gODYwMSBmb3JtYXRzIGFzIHdlbGwgYXMgcGFydGlhbCBpbXBsZW1lbnRhdGlvbnMuXG4gKiBJU08gODYwMTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMVxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpc24ndCBhIHN0cmluZywgdGhlIGZ1bmN0aW9uIGNhbm5vdCBwYXJzZSB0aGUgc3RyaW5nIG9yXG4gKiB0aGUgdmFsdWVzIGFyZSBpbnZhbGlkLCBpdCByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGFyZ3VtZW50IC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgc3RyaW5nICcyMDE0LTAyLTExVDExOjMwOjMwJyB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VJU08oJzIwMTQtMDItMTFUMTE6MzA6MzAnKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBzdHJpbmcgJyswMjAxNDEwMScgdG8gZGF0ZSxcbiAqIC8vIGlmIHRoZSBhZGRpdGlvbmFsIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGV4dGVuZGVkIHllYXIgZm9ybWF0IGlzIDE6XG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZUlTTygnKzAyMDE0MTAxJywgeyBhZGRpdGlvbmFsRGlnaXRzOiAxIH0pXG4gKiAvLz0+IEZyaSBBcHIgMTEgMjAxNCAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJU08oYXJndW1lbnQsIG9wdGlvbnMpIHtcbiAgY29uc3QgaW52YWxpZERhdGUgPSAoKSA9PiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluLCBOYU4pO1xuXG4gIGNvbnN0IGFkZGl0aW9uYWxEaWdpdHMgPSBvcHRpb25zPy5hZGRpdGlvbmFsRGlnaXRzID8/IDI7XG4gIGNvbnN0IGRhdGVTdHJpbmdzID0gc3BsaXREYXRlU3RyaW5nKGFyZ3VtZW50KTtcblxuICBsZXQgZGF0ZTtcbiAgaWYgKGRhdGVTdHJpbmdzLmRhdGUpIHtcbiAgICBjb25zdCBwYXJzZVllYXJSZXN1bHQgPSBwYXJzZVllYXIoZGF0ZVN0cmluZ3MuZGF0ZSwgYWRkaXRpb25hbERpZ2l0cyk7XG4gICAgZGF0ZSA9IHBhcnNlRGF0ZShwYXJzZVllYXJSZXN1bHQucmVzdERhdGVTdHJpbmcsIHBhcnNlWWVhclJlc3VsdC55ZWFyKTtcbiAgfVxuXG4gIGlmICghZGF0ZSB8fCBpc05hTigrZGF0ZSkpIHJldHVybiBpbnZhbGlkRGF0ZSgpO1xuXG4gIGNvbnN0IHRpbWVzdGFtcCA9ICtkYXRlO1xuICBsZXQgdGltZSA9IDA7XG4gIGxldCBvZmZzZXQ7XG5cbiAgaWYgKGRhdGVTdHJpbmdzLnRpbWUpIHtcbiAgICB0aW1lID0gcGFyc2VUaW1lKGRhdGVTdHJpbmdzLnRpbWUpO1xuICAgIGlmIChpc05hTih0aW1lKSkgcmV0dXJuIGludmFsaWREYXRlKCk7XG4gIH1cblxuICBpZiAoZGF0ZVN0cmluZ3MudGltZXpvbmUpIHtcbiAgICBvZmZzZXQgPSBwYXJzZVRpbWV6b25lKGRhdGVTdHJpbmdzLnRpbWV6b25lKTtcbiAgICBpZiAoaXNOYU4ob2Zmc2V0KSkgcmV0dXJuIGludmFsaWREYXRlKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdG1wRGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCArIHRpbWUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRvRGF0ZSgwLCBvcHRpb25zPy5pbik7XG4gICAgcmVzdWx0LnNldEZ1bGxZZWFyKFxuICAgICAgdG1wRGF0ZS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgdG1wRGF0ZS5nZXRVVENNb250aCgpLFxuICAgICAgdG1wRGF0ZS5nZXRVVENEYXRlKCksXG4gICAgKTtcbiAgICByZXN1bHQuc2V0SG91cnMoXG4gICAgICB0bXBEYXRlLmdldFVUQ0hvdXJzKCksXG4gICAgICB0bXBEYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgIHRtcERhdGUuZ2V0VVRDU2Vjb25kcygpLFxuICAgICAgdG1wRGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gdG9EYXRlKHRpbWVzdGFtcCArIHRpbWUgKyBvZmZzZXQsIG9wdGlvbnM/LmluKTtcbn1cblxuY29uc3QgcGF0dGVybnMgPSB7XG4gIGRhdGVUaW1lRGVsaW1pdGVyOiAvW1QgXS8sXG4gIHRpbWVab25lRGVsaW1pdGVyOiAvW1ogXS9pLFxuICB0aW1lem9uZTogLyhbWistXS4qKSQvLFxufTtcblxuY29uc3QgZGF0ZVJlZ2V4ID1cbiAgL14tPyg/OihcXGR7M30pfChcXGR7Mn0pKD86LT8oXFxkezJ9KSk/fFcoXFxkezJ9KSg/Oi0/KFxcZHsxfSkpP3wpJC87XG5jb25zdCB0aW1lUmVnZXggPVxuICAvXihcXGR7Mn0oPzpbLixdXFxkKik/KSg/Ojo/KFxcZHsyfSg/OlsuLF1cXGQqKT8pKT8oPzo6PyhcXGR7Mn0oPzpbLixdXFxkKik/KSk/JC87XG5jb25zdCB0aW1lem9uZVJlZ2V4ID0gL14oWystXSkoXFxkezJ9KSg/Ojo/KFxcZHsyfSkpPyQvO1xuXG5mdW5jdGlvbiBzcGxpdERhdGVTdHJpbmcoZGF0ZVN0cmluZykge1xuICBjb25zdCBkYXRlU3RyaW5ncyA9IHt9O1xuICBjb25zdCBhcnJheSA9IGRhdGVTdHJpbmcuc3BsaXQocGF0dGVybnMuZGF0ZVRpbWVEZWxpbWl0ZXIpO1xuICBsZXQgdGltZVN0cmluZztcblxuICAvLyBUaGUgcmVnZXggbWF0Y2ggc2hvdWxkIG9ubHkgcmV0dXJuIGF0IG1heGltdW0gdHdvIGFycmF5IGVsZW1lbnRzLlxuICAvLyBbZGF0ZV0sIFt0aW1lXSwgb3IgW2RhdGUsIHRpbWVdLlxuICBpZiAoYXJyYXkubGVuZ3RoID4gMikge1xuICAgIHJldHVybiBkYXRlU3RyaW5ncztcbiAgfVxuXG4gIGlmICgvOi8udGVzdChhcnJheVswXSkpIHtcbiAgICB0aW1lU3RyaW5nID0gYXJyYXlbMF07XG4gIH0gZWxzZSB7XG4gICAgZGF0ZVN0cmluZ3MuZGF0ZSA9IGFycmF5WzBdO1xuICAgIHRpbWVTdHJpbmcgPSBhcnJheVsxXTtcbiAgICBpZiAocGF0dGVybnMudGltZVpvbmVEZWxpbWl0ZXIudGVzdChkYXRlU3RyaW5ncy5kYXRlKSkge1xuICAgICAgZGF0ZVN0cmluZ3MuZGF0ZSA9IGRhdGVTdHJpbmcuc3BsaXQocGF0dGVybnMudGltZVpvbmVEZWxpbWl0ZXIpWzBdO1xuICAgICAgdGltZVN0cmluZyA9IGRhdGVTdHJpbmcuc3Vic3RyKFxuICAgICAgICBkYXRlU3RyaW5ncy5kYXRlLmxlbmd0aCxcbiAgICAgICAgZGF0ZVN0cmluZy5sZW5ndGgsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aW1lU3RyaW5nKSB7XG4gICAgY29uc3QgdG9rZW4gPSBwYXR0ZXJucy50aW1lem9uZS5leGVjKHRpbWVTdHJpbmcpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgZGF0ZVN0cmluZ3MudGltZSA9IHRpbWVTdHJpbmcucmVwbGFjZSh0b2tlblsxXSwgXCJcIik7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lem9uZSA9IHRva2VuWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lID0gdGltZVN0cmluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0ZVN0cmluZ3M7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWWVhcihkYXRlU3RyaW5nLCBhZGRpdGlvbmFsRGlnaXRzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBcIl4oPzooXFxcXGR7NH18WystXVxcXFxke1wiICtcbiAgICAgICg0ICsgYWRkaXRpb25hbERpZ2l0cykgK1xuICAgICAgXCJ9KXwoXFxcXGR7Mn18WystXVxcXFxke1wiICtcbiAgICAgICgyICsgYWRkaXRpb25hbERpZ2l0cykgK1xuICAgICAgXCJ9KSQpXCIsXG4gICk7XG5cbiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKHJlZ2V4KTtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHllYXJcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIHsgeWVhcjogTmFOLCByZXN0RGF0ZVN0cmluZzogXCJcIiB9O1xuXG4gIGNvbnN0IHllYXIgPSBjYXB0dXJlc1sxXSA/IHBhcnNlSW50KGNhcHR1cmVzWzFdKSA6IG51bGw7XG4gIGNvbnN0IGNlbnR1cnkgPSBjYXB0dXJlc1syXSA/IHBhcnNlSW50KGNhcHR1cmVzWzJdKSA6IG51bGw7XG5cbiAgLy8gZWl0aGVyIHllYXIgb3IgY2VudHVyeSBpcyBudWxsLCBub3QgYm90aFxuICByZXR1cm4ge1xuICAgIHllYXI6IGNlbnR1cnkgPT09IG51bGwgPyB5ZWFyIDogY2VudHVyeSAqIDEwMCxcbiAgICByZXN0RGF0ZVN0cmluZzogZGF0ZVN0cmluZy5zbGljZSgoY2FwdHVyZXNbMV0gfHwgY2FwdHVyZXNbMl0pLmxlbmd0aCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF0ZShkYXRlU3RyaW5nLCB5ZWFyKSB7XG4gIC8vIEludmFsaWQgSVNPLWZvcm1hdHRlZCB5ZWFyXG4gIGlmICh5ZWFyID09PSBudWxsKSByZXR1cm4gbmV3IERhdGUoTmFOKTtcblxuICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2goZGF0ZVJlZ2V4KTtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHN0cmluZ1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gbmV3IERhdGUoTmFOKTtcblxuICBjb25zdCBpc1dlZWtEYXRlID0gISFjYXB0dXJlc1s0XTtcbiAgY29uc3QgZGF5T2ZZZWFyID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1sxXSk7XG4gIGNvbnN0IG1vbnRoID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1syXSkgLSAxO1xuICBjb25zdCBkYXkgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzNdKTtcbiAgY29uc3Qgd2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNF0pO1xuICBjb25zdCBkYXlPZldlZWsgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzVdKSAtIDE7XG5cbiAgaWYgKGlzV2Vla0RhdGUpIHtcbiAgICBpZiAoIXZhbGlkYXRlV2Vla0RhdGUoeWVhciwgd2VlaywgZGF5T2ZXZWVrKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICAgIHJldHVybiBkYXlPZklTT1dlZWtZZWFyKHllYXIsIHdlZWssIGRheU9mV2Vlayk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDApO1xuICAgIGlmIChcbiAgICAgICF2YWxpZGF0ZURhdGUoeWVhciwgbW9udGgsIGRheSkgfHxcbiAgICAgICF2YWxpZGF0ZURheU9mWWVhckRhdGUoeWVhciwgZGF5T2ZZZWFyKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeWVhciwgbW9udGgsIE1hdGgubWF4KGRheU9mWWVhciwgZGF5KSk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlVW5pdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPyBwYXJzZUludCh2YWx1ZSkgOiAxO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRpbWUodGltZVN0cmluZykge1xuICBjb25zdCBjYXB0dXJlcyA9IHRpbWVTdHJpbmcubWF0Y2godGltZVJlZ2V4KTtcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIE5hTjsgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHRpbWVcblxuICBjb25zdCBob3VycyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbMV0pO1xuICBjb25zdCBtaW51dGVzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1syXSk7XG4gIGNvbnN0IHNlY29uZHMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzNdKTtcblxuICBpZiAoIXZhbGlkYXRlVGltZShob3VycywgbWludXRlcywgc2Vjb25kcykpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBob3VycyAqIG1pbGxpc2Vjb25kc0luSG91ciArIG1pbnV0ZXMgKiBtaWxsaXNlY29uZHNJbk1pbnV0ZSArIHNlY29uZHMgKiAxMDAwXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZVVuaXQodmFsdWUpIHtcbiAgcmV0dXJuICh2YWx1ZSAmJiBwYXJzZUZsb2F0KHZhbHVlLnJlcGxhY2UoXCIsXCIsIFwiLlwiKSkpIHx8IDA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZXpvbmUodGltZXpvbmVTdHJpbmcpIHtcbiAgaWYgKHRpbWV6b25lU3RyaW5nID09PSBcIlpcIikgcmV0dXJuIDA7XG5cbiAgY29uc3QgY2FwdHVyZXMgPSB0aW1lem9uZVN0cmluZy5tYXRjaCh0aW1lem9uZVJlZ2V4KTtcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIDA7XG5cbiAgY29uc3Qgc2lnbiA9IGNhcHR1cmVzWzFdID09PSBcIitcIiA/IC0xIDogMTtcbiAgY29uc3QgaG91cnMgPSBwYXJzZUludChjYXB0dXJlc1syXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSAoY2FwdHVyZXNbM10gJiYgcGFyc2VJbnQoY2FwdHVyZXNbM10pKSB8fCAwO1xuXG4gIGlmICghdmFsaWRhdGVUaW1lem9uZShob3VycywgbWludXRlcykpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgcmV0dXJuIHNpZ24gKiAoaG91cnMgKiBtaWxsaXNlY29uZHNJbkhvdXIgKyBtaW51dGVzICogbWlsbGlzZWNvbmRzSW5NaW51dGUpO1xufVxuXG5mdW5jdGlvbiBkYXlPZklTT1dlZWtZZWFyKGlzb1dlZWtZZWFyLCB3ZWVrLCBkYXkpIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDApO1xuICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGlzb1dlZWtZZWFyLCAwLCA0KTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5RGF5ID0gZGF0ZS5nZXRVVENEYXkoKSB8fCA3O1xuICBjb25zdCBkaWZmID0gKHdlZWsgLSAxKSAqIDcgKyBkYXkgKyAxIC0gZm91cnRoT2ZKYW51YXJ5RGF5O1xuICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBkaWZmKTtcbiAgcmV0dXJuIGRhdGU7XG59XG5cbi8vIFZhbGlkYXRpb24gZnVuY3Rpb25zXG5cbi8vIEZlYnJ1YXJ5IGlzIG51bGwgdG8gaGFuZGxlIHRoZSBsZWFwIHllYXIgKHVzaW5nIHx8KVxuY29uc3QgZGF5c0luTW9udGhzID0gWzMxLCBudWxsLCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5cbmZ1bmN0aW9uIGlzTGVhcFllYXJJbmRleCh5ZWFyKSB7XG4gIHJldHVybiB5ZWFyICUgNDAwID09PSAwIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXRlKSB7XG4gIHJldHVybiAoXG4gICAgbW9udGggPj0gMCAmJlxuICAgIG1vbnRoIDw9IDExICYmXG4gICAgZGF0ZSA+PSAxICYmXG4gICAgZGF0ZSA8PSAoZGF5c0luTW9udGhzW21vbnRoXSB8fCAoaXNMZWFwWWVhckluZGV4KHllYXIpID8gMjkgOiAyOCkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpIHtcbiAgcmV0dXJuIGRheU9mWWVhciA+PSAxICYmIGRheU9mWWVhciA8PSAoaXNMZWFwWWVhckluZGV4KHllYXIpID8gMzY2IDogMzY1KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVXZWVrRGF0ZShfeWVhciwgd2VlaywgZGF5KSB7XG4gIHJldHVybiB3ZWVrID49IDEgJiYgd2VlayA8PSA1MyAmJiBkYXkgPj0gMCAmJiBkYXkgPD0gNjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSB7XG4gIGlmIChob3VycyA9PT0gMjQpIHtcbiAgICByZXR1cm4gbWludXRlcyA9PT0gMCAmJiBzZWNvbmRzID09PSAwO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBzZWNvbmRzID49IDAgJiZcbiAgICBzZWNvbmRzIDwgNjAgJiZcbiAgICBtaW51dGVzID49IDAgJiZcbiAgICBtaW51dGVzIDwgNjAgJiZcbiAgICBob3VycyA+PSAwICYmXG4gICAgaG91cnMgPCAyNVxuICApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRpbWV6b25lKF9ob3VycywgbWludXRlcykge1xuICByZXR1cm4gbWludXRlcyA+PSAwICYmIG1pbnV0ZXMgPD0gNTk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgcGFyc2VJU087XG4iLCJpbXBvcnQgeyBhZGRIb3VycyB9IGZyb20gXCIuL2FkZEhvdXJzLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdWJIb3Vyc30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN1YkhvdXJzXG4gKiBAY2F0ZWdvcnkgSG91ciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBob3VycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaG91cnMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBob3VycyB0byBiZSBzdWJ0cmFjdGVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBob3VycyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDIgaG91cnMgZnJvbSAxMSBKdWx5IDIwMTQgMDE6MDA6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJIb3VycyhuZXcgRGF0ZSgyMDE0LCA2LCAxMSwgMSwgMCksIDIpXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAyMzowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViSG91cnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7XG4gIHJldHVybiBhZGRIb3VycyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdWJIb3VycztcbiIsImltcG9ydCB7XG4gIGkxOG5EdXJhdGlvbkhvdXIsXG4gIGkxOG5EdXJhdGlvbk1pbnV0ZSxcbiAgaTE4bkR1cmF0aW9uRGF5LFxufSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2kxOG4uanMnO1xuaW1wb3J0IHtcbiAgaXNWYWxpZCxcbiAgcGFyc2VJU08sXG4gIGRpZmZlcmVuY2VJbkRheXMsXG4gIGRpZmZlcmVuY2VJbkhvdXJzLFxuICBkaWZmZXJlbmNlSW5NaW51dGVzLFxuICBhZGRNaW51dGVzLFxuICBzdWJIb3VycyxcbiAgc3ViRGF5cyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgb2Zmc2V0IG9mIGEgSVNPIGRhdGUgc3RyaW5nLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG9mZnNldCBpcyBpZ25vcmVkLlxuICogSWYgaXQgaXMgbm90IHJlbW92ZWQgdGhlIHRpbWUgd291bGQgYmUgY29udmVydGVkIHRvIHRoZSBicm93c2VycyBsb2NhbCB0aW1lLlxuICogRXhhbXBsZTogXCIyMDIyLTA4LTI5VDA5OjMwOjAwKzAzOjAwXCIgd291bGQgYmUgY2hhbmdlZCB0byBcIjIwMjItMDgtMjlUMDg6MzA6MDArMDI6MDBcIiAtLT4gbm90IHRoZSBkZXNpcmVkIG91dGNvbWUsIGFzIHdlIHdhbnQgdG8gdXNlIHRoZSB0aW1lIGluIHRoZSB0aW1lem9uZSBhbmQgbm90IHRoZSBsb2NhbCB0aW1lLlxuICpcbiAqIEFmdGVyIHRoZSBvZmZzZXQgaXMgcmVtb3ZlZCBhIG5ldyBkYXRlIGlzIGNyZWF0ZWQgaW4gdGhlIGJyb3dzZXJzIGxvY2FsIHRpbWUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB0aW1lIG9mIHRoZSBJU08gZGF0ZSBzdHJpbmcgaXMgZGlzcGxheWVkIGFuZCBub3QgYSBjb252ZXJ0ZWQgdGltZS5cbiAqIEV4YW1wbGU6IFwiMjAyMi0wOC0yOVQwOTozMDowMCswMzowMFwiIHdvdWxkIGJlIGNoYW5nZWQgdG8gXCIyMDIyLTA4LTI5VDA5OjMwOjAwKzAyOjAwXCIgLS0+IGRlc2lyZWQgb3V0Y29tZVxuICogQXR0ZW50aW9uOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhlIGNvcnJlY3QgdGltZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuIEl0IGlzIGEgd29ya2Fyb3VuZCB0byBtYWtlIHN1cmUsIHRoYXQgdGhlIGdpdmVuIHRpbWUgaXMgZGlzcGxheWVkIHdpdGhvdXQgYmVpbmcgY29udmVydGVkLlxuICpcbiAqIE9mZnNldDogRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0aW1lem9uZSBhbmQgQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUuXG4gKlxuICogQHBhcmFtIGlzb1RpbWUgLSB0aGUgaXNvIHRpbWUgd2l0aCB0aGUgdGltZXpvbmUgb2Zmc2V0XG4gKiBAcmV0dXJucyBhIG5ldyBkYXRlIHdpdGggdGhlIGxvY2FsIHRpbWV6b25lIHdpdGggdGhlIGxvY2FsIG9mZnNldFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhpc29UaW1lPzogc3RyaW5nKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNvVGltZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcGFyc2VkRGF0ZSA9IHBhcnNlSVNPKGlzb1RpbWUpO1xuXG4gIGlmICghaXNWYWxpZChwYXJzZWREYXRlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoaXNvVGltZS5pbmNsdWRlcygnWicpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGlzb1RpbWUucmVwbGFjZSgnWicsICcnKSk7XG4gIH1cblxuICBpZiAoaXNvVGltZS5pbmNsdWRlcygnVCcpKSB7XG4gICAgY29uc3QgZGF0ZVRpbWUgPSBpc29UaW1lLnNwbGl0KCdUJyk7XG5cbiAgICBpZiAoZGF0ZVRpbWVbMV0gJiYgKGRhdGVUaW1lWzFdLmluY2x1ZGVzKCcrJykgfHwgZGF0ZVRpbWVbMV0uaW5jbHVkZXMoJy0nKSkpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShgJHtkYXRlVGltZVswXX1UJHtkYXRlVGltZVsxXS5zcGxpdCgvWystXS8pWzBdfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IERhdGUoaXNvVGltZSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIGR1cmF0aW9uIG51bWJlciB0byBkYXRlIHN0cmluZyB3aXRoIHNwZWNpZmljIGZvcm1hdFxuICpcbiAqIEBwYXJhbSBkdXJhdGlvbiAtIGR1cmF0aW9uIGluIG1pbnV0ZXNcbiAqIEBwYXJhbSBjdXJyZW50TGFuZ3VhZ2UgLSBjdXJyZW50TGFuZ3VhZ2VcbiAqIEByZXR1cm5zIGFuIE9iamVjdCB3aXRoIHR3byBzdHJpbmdzIGluIHRoZSBmb3JtYXQgXCJkZCBoaCBtbVwiIChzaG9ydCkgYW4gXCJ4IERheShzKSB4IEhvdXIocykgeCBNaW51dGUocykgKGxvbmcpXCJcbiAqICovXG5cbmV4cG9ydCBjb25zdCBkdXJhdGlvblRvVGltZSA9IChcbiAgZHVyYXRpb246IG51bWJlcixcbiAgY3VycmVudExhbmd1YWdlPzogc3RyaW5nLFxuKTogeyBzaG9ydDogc3RyaW5nOyBsb25nOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IHNob3J0ID0gW107XG4gIGNvbnN0IGxvbmcgPSBbXTtcblxuICBjb25zdCBub3cgPSAwO1xuICBsZXQgZnV0dXJlID0gYWRkTWludXRlcyhub3csIGR1cmF0aW9uKTtcblxuICBjb25zdCBkYXlzID0gZGlmZmVyZW5jZUluRGF5cyhmdXR1cmUsIG5vdyk7XG4gIGlmIChkYXlzID4gMCkge1xuICAgIHNob3J0LnB1c2goYCR7ZGF5c30gZGApO1xuICAgIGlmIChjdXJyZW50TGFuZ3VhZ2UpIHtcbiAgICAgIGxvbmcucHVzaChcbiAgICAgICAgYCR7ZGF5c30gJHtcbiAgICAgICAgICBkYXlzID4gMVxuICAgICAgICAgICAgPyBpMThuRHVyYXRpb25EYXkubXVsdGlwbGUubG9uZ1tjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgICAgICA6IGkxOG5EdXJhdGlvbkRheS5zaW5nbGUubG9uZ1tjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgZnV0dXJlID0gc3ViRGF5cyhmdXR1cmUsIGRheXMpO1xuICB9XG5cbiAgY29uc3QgaG91cnMgPSBkaWZmZXJlbmNlSW5Ib3VycyhmdXR1cmUsIG5vdyk7XG4gIGlmIChob3VycyA+IDApIHtcbiAgICBzaG9ydC5wdXNoKGAke2hvdXJzfSBoYCk7XG4gICAgaWYgKGN1cnJlbnRMYW5ndWFnZSkge1xuICAgICAgbG9uZy5wdXNoKFxuICAgICAgICBgJHtob3Vyc30gJHtcbiAgICAgICAgICBob3VycyA+IDFcbiAgICAgICAgICAgID8gaTE4bkR1cmF0aW9uSG91ci5tdWx0aXBsZS5sb25nW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgICAgIDogaTE4bkR1cmF0aW9uSG91ci5zaW5nbGUubG9uZ1tjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgZnV0dXJlID0gc3ViSG91cnMoZnV0dXJlLCBob3Vycyk7XG4gIH1cblxuICBjb25zdCBtaW51dGVzID0gZGlmZmVyZW5jZUluTWludXRlcyhmdXR1cmUsIG5vdyk7XG4gIGlmIChtaW51dGVzID4gMCkge1xuICAgIHNob3J0LnB1c2goYCR7bWludXRlc30gbWluYCk7XG4gICAgaWYgKGN1cnJlbnRMYW5ndWFnZSkge1xuICAgICAgbG9uZy5wdXNoKFxuICAgICAgICBgJHttaW51dGVzfSAke1xuICAgICAgICAgIG1pbnV0ZXMgPiAxXG4gICAgICAgICAgICA/IGkxOG5EdXJhdGlvbk1pbnV0ZS5tdWx0aXBsZS5sb25nW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgICAgIDogaTE4bkR1cmF0aW9uTWludXRlLnNpbmdsZS5sb25nW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2hvcnQ6IHNob3J0LmpvaW4oJyAnKSxcbiAgICBsb25nOiBsb25nLmpvaW4oJyAnKSxcbiAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQTZCTyxTQUFTLFFBQVEsTUFBTSxRQUFRLFNBQVM7QUFDN0MsUUFBTSxRQUFRLE9BQU8sTUFBTSxtQ0FBUyxFQUFFO0FBQ3RDLE1BQUksTUFBTSxNQUFNLEVBQUcsUUFBTyxjQUE2QixNQUFNLEdBQUc7QUFHaEUsTUFBSSxDQUFDLE9BQVEsUUFBTztBQUVwQixRQUFNLFFBQVEsTUFBTSxRQUFTLElBQUcsTUFBTTtBQUN0QyxTQUFPO0FBQ1Q7QUNUTyxTQUFTLGdCQUFnQixNQUFNLFFBQVEsU0FBUztBQUNyRCxTQUFPLGNBQTZCLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxNQUFNO0FBQ2xFO0FDRk8sU0FBUyxTQUFTLE1BQU0sUUFBUSxTQUFTO0FBQzlDLFNBQU8sZ0JBQWdCLE1BQU0sU0FBUyxrQkFBMkI7QUFDbkU7QUM2Qk8sU0FBUyxpQkFBaUIsV0FBVyxhQUFhLFNBQVM7QUFDaEUsUUFBTSxDQUFDLFlBQVksWUFBWSxJQUFJO0FBQUEsSUFDakMs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
@@ -10,12 +10,13 @@ interface IAccessAttribute {
10
10
  * @param departureWalk: The walking distance in minutes from the departure point to the first leg.
11
11
  * @param arrivalWalk: The walking distance in minutes from the last leg to the arrival point.
12
12
  * @param currentLanguage: The current language for localization.
13
+ * @param a11yFootpath: Whether the a11y-icon should be shown.
13
14
  * @returns renderDepartureTimeAttribute: A function that renders the element for the departure time attribute.
14
15
  * @returns renderArrivalTimeAttribute: A function that renders the element for the arrival time attribute.
15
16
  * @returns arrivalTimeAttribute: The access attribute for the arrival time.
16
17
  * @returns departureTimeAttribute: The access attribute for the departure time.
17
18
  */
18
- export declare function getDepartureArrivalTimeAttribute(legs: Leg[], departureWalk: number, arrivalWalk: number, currentLanguage: string): {
19
+ export declare function getDepartureArrivalTimeAttribute(legs: Leg[], departureWalk: number, arrivalWalk: number, currentLanguage: string, a11yFootpath?: boolean): {
19
20
  renderDepartureTimeAttribute: () => TemplateResult;
20
21
  renderArrivalTimeAttribute: () => TemplateResult;
21
22
  departureTimeAttribute: IAccessAttribute | null;
@@ -1 +1 @@
1
- {"version":3,"file":"access-leg-helper.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/core/timetable/access-leg-helper.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAQ1C,OAAO,KAAK,EAAE,GAAG,EAA8B,MAAM,2BAA2B,CAAC;AAEjF,OAAO,iCAAiC,CAAC;AAEzC,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AA2HD;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,GAAG,EAAE,EACX,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,GACtB;IACD,4BAA4B,EAAE,MAAM,cAAc,CAAC;IACnD,0BAA0B,EAAE,MAAM,cAAc,CAAC;IACjD,sBAAsB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChD,oBAAoB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC/C,CAyGA"}
1
+ {"version":3,"file":"access-leg-helper.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/core/timetable/access-leg-helper.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAQ1C,OAAO,KAAK,EAAE,GAAG,EAA8B,MAAM,2BAA2B,CAAC;AAEjF,OAAO,iCAAiC,CAAC;AAEzC,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAuID;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,GAAG,EAAE,EACX,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,OAAO,GACrB;IACD,4BAA4B,EAAE,MAAM,cAAc,CAAC;IACnD,0BAA0B,EAAE,MAAM,cAAc,CAAC;IACjD,sBAAsB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChD,oBAAoB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC/C,CAiJA"}
@@ -29,7 +29,7 @@ function getPTConnectionAttribute(leg, connectionLegNotice) {
29
29
  icon: "walk-small"
30
30
  } : null;
31
31
  }
32
- function getFirstExtendedLegAttribute(leg, departureWalk) {
32
+ function getFirstExtendedLegAttribute(leg, departureWalk, a11yFootpath, currentLanguage) {
33
33
  var _a, _b, _c;
34
34
  const extendedFirstLeg = isRideLeg(leg) ? (_b = (_a = leg == null ? void 0 : leg.serviceJourney) == null ? void 0 : _a.notices) == null ? void 0 : _b.filter(
35
35
  (notice) => ["CI"].includes(notice.name)
@@ -37,11 +37,11 @@ function getFirstExtendedLegAttribute(leg, departureWalk) {
37
37
  const extractTimeAndString = extendedFirstLeg && extractTimeAndStringFromNoticeText(extendedFirstLeg);
38
38
  return extendedFirstLeg ? {
39
39
  duration: ((extractTimeAndString == null ? void 0 : extractTimeAndString.duration) || 0) + (departureWalk || 0),
40
- text: (extractTimeAndString == null ? void 0 : extractTimeAndString.text) || "",
41
- icon: `sa-${(_c = extendedFirstLeg == null ? void 0 : extendedFirstLeg.name) == null ? void 0 : _c.toLowerCase()}`
40
+ text: a11yFootpath ? i18nWalkingDistanceDeparture[currentLanguage] : (extractTimeAndString == null ? void 0 : extractTimeAndString.text) || "",
41
+ icon: a11yFootpath ? "wheelchair-small" : `sa-${(_c = extendedFirstLeg == null ? void 0 : extendedFirstLeg.name) == null ? void 0 : _c.toLowerCase()}`
42
42
  } : null;
43
43
  }
44
- function getLastExtendedLegAttribute(leg, arrivalWalk) {
44
+ function getLastExtendedLegAttribute(leg, arrivalWalk, a11yFootpath, currentLanguage) {
45
45
  var _a, _b, _c;
46
46
  const extendedLastLeg = isRideLeg(leg) ? (_b = (_a = leg == null ? void 0 : leg.serviceJourney) == null ? void 0 : _a.notices) == null ? void 0 : _b.filter(
47
47
  (notice) => ["CO"].includes(notice.name)
@@ -49,13 +49,13 @@ function getLastExtendedLegAttribute(leg, arrivalWalk) {
49
49
  const extractTimeAndString = extendedLastLeg && extractTimeAndStringFromNoticeText(extendedLastLeg);
50
50
  return extendedLastLeg ? {
51
51
  duration: ((extractTimeAndString == null ? void 0 : extractTimeAndString.duration) || 0) + (arrivalWalk || 0),
52
- text: (extractTimeAndString == null ? void 0 : extractTimeAndString.text) || "",
53
- icon: `sa-${(_c = extendedLastLeg == null ? void 0 : extendedLastLeg.name) == null ? void 0 : _c.toLowerCase()}`
52
+ text: a11yFootpath ? i18nWalkingDistanceArrival[currentLanguage] : (extractTimeAndString == null ? void 0 : extractTimeAndString.text) || "",
53
+ icon: a11yFootpath ? "wheelchair-small" : `sa-${(_c = extendedLastLeg == null ? void 0 : extendedLastLeg.name) == null ? void 0 : _c.toLowerCase()}`
54
54
  } : null;
55
55
  }
56
56
  function renderTransferTime(duration, icon, currentLanguage, label, type) {
57
57
  return html`
58
- <span class="sbb-pearl-chain__time-transfer sbb-pearl-chain__time-transfer--${type}">
58
+ <span class="sbb-pearl-chain__time-transfer sbb-pearl-chain__time-transfer--${icon}-${type}">
59
59
  <sbb-icon name=${icon}></sbb-icon>
60
60
  <time datetime=${duration + "M"}>
61
61
  <span class="sbb-screen-reader-only">
@@ -69,10 +69,10 @@ function renderTransferTime(duration, icon, currentLanguage, label, type) {
69
69
  </span>
70
70
  `;
71
71
  }
72
- function renderWalkTime(duration, label, variant) {
72
+ function renderWalkTime(duration, label, variant, icon) {
73
73
  return html`
74
- <span class="sbb-pearl-chain__time-walktime sbb-pearl-chain__time-walktime--${variant}">
75
- <sbb-icon name="walk-small"></sbb-icon>
74
+ <span class="sbb-pearl-chain__time-walktime sbb-pearl-chain__time-walktime--${icon}-${variant}">
75
+ <sbb-icon name=${icon}></sbb-icon>
76
76
  <time datetime=${duration + "M"}>
77
77
  <span class="sbb-screen-reader-only">${label}</span>
78
78
  ${duration}
@@ -81,15 +81,20 @@ function renderWalkTime(duration, label, variant) {
81
81
  </span>
82
82
  `;
83
83
  }
84
- function getDepartureArrivalTimeAttribute(legs, departureWalk, arrivalWalk, currentLanguage) {
84
+ function getDepartureArrivalTimeAttribute(legs, departureWalk, arrivalWalk, currentLanguage, a11yFootpath) {
85
85
  const connectionRideLeg = legs && legs.filter((leg) => isRideLeg(leg) || isConnectionLeg(leg))[0];
86
86
  const connectionLegNotice = ["YM", "YB", "Y", "YT"];
87
87
  const connectionFirstLeg = getPTConnectionAttribute(connectionRideLeg, connectionLegNotice);
88
- const extendedFirstLeg = getFirstExtendedLegAttribute(connectionRideLeg, departureWalk);
88
+ const extendedFirstLeg = getFirstExtendedLegAttribute(
89
+ connectionRideLeg,
90
+ departureWalk,
91
+ a11yFootpath,
92
+ currentLanguage
93
+ );
89
94
  const departureWalkAttribute = departureWalk ? {
90
95
  text: i18nWalkingDistanceDeparture[currentLanguage],
91
96
  duration: departureWalk,
92
- icon: "walk-small"
97
+ icon: a11yFootpath ? "wheelchair-small" : "walk-small"
93
98
  } : null;
94
99
  const getDepartureType = () => {
95
100
  if (connectionFirstLeg) {
@@ -104,9 +109,24 @@ function getDepartureArrivalTimeAttribute(legs, departureWalk, arrivalWalk, curr
104
109
  };
105
110
  function renderDepartureTimeAttribute() {
106
111
  return html`
107
- ${connectionFirstLeg ? renderWalkTime(connectionFirstLeg.duration, connectionFirstLeg.text, "left") : nothing}
108
- ${departureWalkAttribute && !extendedFirstLeg && !connectionFirstLeg ? renderWalkTime(departureWalkAttribute.duration, departureWalkAttribute.text, "left") : nothing}
109
- ${extendedFirstLeg ? renderTransferTime(
112
+ ${connectionFirstLeg ? renderWalkTime(
113
+ connectionFirstLeg.duration,
114
+ connectionFirstLeg.text,
115
+ "left",
116
+ connectionFirstLeg.icon
117
+ ) : nothing}
118
+ ${departureWalkAttribute && !extendedFirstLeg && !connectionFirstLeg ? renderWalkTime(
119
+ departureWalkAttribute.duration,
120
+ departureWalkAttribute.text,
121
+ "left",
122
+ departureWalkAttribute.icon
123
+ ) : nothing}
124
+ ${extendedFirstLeg ? a11yFootpath ? renderWalkTime(
125
+ extendedFirstLeg.duration,
126
+ extendedFirstLeg.text,
127
+ "left",
128
+ extendedFirstLeg.icon
129
+ ) : renderTransferTime(
110
130
  extendedFirstLeg.duration,
111
131
  extendedFirstLeg.icon,
112
132
  currentLanguage,
@@ -118,11 +138,11 @@ function getDepartureArrivalTimeAttribute(legs, departureWalk, arrivalWalk, curr
118
138
  const lastLeg = legs && legs[legs.length - 1];
119
139
  const lastConnectionRideLeg = (isConnectionLeg(lastLeg) || isRideLeg(lastLeg)) && lastLeg;
120
140
  const connectionLastLeg = lastConnectionRideLeg && getPTConnectionAttribute(lastConnectionRideLeg, connectionLegNotice);
121
- const extendedLastLeg = lastConnectionRideLeg && getLastExtendedLegAttribute(lastConnectionRideLeg, arrivalWalk);
141
+ const extendedLastLeg = lastConnectionRideLeg && getLastExtendedLegAttribute(lastConnectionRideLeg, arrivalWalk, a11yFootpath, currentLanguage);
122
142
  const arrivalWalkAttribute = arrivalWalk ? {
123
143
  text: i18nWalkingDistanceArrival[currentLanguage],
124
144
  duration: arrivalWalk,
125
- icon: "walk-small"
145
+ icon: a11yFootpath ? "wheelchair-small" : "walk-small"
126
146
  } : null;
127
147
  const getArrivalType = () => {
128
148
  if (connectionLastLeg) {
@@ -137,9 +157,24 @@ function getDepartureArrivalTimeAttribute(legs, departureWalk, arrivalWalk, curr
137
157
  };
138
158
  function renderArrivalTimeAttribute() {
139
159
  return html`
140
- ${connectionLastLeg ? renderWalkTime(connectionLastLeg.duration, connectionLastLeg.text, "right") : nothing}
141
- ${arrivalWalkAttribute && !extendedLastLeg && !connectionLastLeg ? renderWalkTime(arrivalWalkAttribute.duration, arrivalWalkAttribute.text, "right") : nothing}
142
- ${extendedLastLeg ? renderTransferTime(
160
+ ${connectionLastLeg ? renderWalkTime(
161
+ connectionLastLeg.duration,
162
+ connectionLastLeg.text,
163
+ "right",
164
+ connectionLastLeg.icon
165
+ ) : nothing}
166
+ ${arrivalWalkAttribute && !extendedLastLeg && !connectionLastLeg ? renderWalkTime(
167
+ arrivalWalkAttribute.duration,
168
+ arrivalWalkAttribute.text,
169
+ "right",
170
+ arrivalWalkAttribute.icon
171
+ ) : nothing}
172
+ ${extendedLastLeg ? a11yFootpath ? renderWalkTime(
173
+ extendedLastLeg.duration,
174
+ extendedLastLeg.text,
175
+ "right",
176
+ extendedLastLeg.icon
177
+ ) : renderTransferTime(
143
178
  extendedLastLeg.duration,
144
179
  extendedLastLeg.icon,
145
180
  currentLanguage,
@@ -161,4 +196,4 @@ export {
161
196
  isConnectionLeg,
162
197
  isRideLeg
163
198
  };
164
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL2NvcmUvdGltZXRhYmxlL3RpbWV0YWJsZS1oZWxwZXIudHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL2NvcmUvdGltZXRhYmxlL2FjY2Vzcy1sZWctaGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExlZywgTm90aWNlIH0gZnJvbSAnLi90aW1ldGFibGUtcHJvcGVydGllcy5qcyc7XG5cbmV4cG9ydCBjb25zdCBpc1JpZGVMZWcgPSAobGVnOiBhbnkpOiBsZWcgaXMgRXh0cmFjdDxMZWcsIHsgX190eXBlbmFtZTogJ1BUUmlkZUxlZycgfT4gPT4ge1xuICByZXR1cm4gbGVnPy5fX3R5cGVuYW1lID09PSAnUFRSaWRlTGVnJztcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Nvbm5lY3Rpb25MZWcgPSAoXG4gIGxlZzogYW55LFxuKTogbGVnIGlzIEV4dHJhY3Q8TGVnLCB7IF9fdHlwZW5hbWU6ICdQVENvbm5lY3Rpb25MZWcnIH0+ID0+IHtcbiAgcmV0dXJuIGxlZz8uX190eXBlbmFtZSA9PT0gJ1BUQ29ubmVjdGlvbkxlZyc7XG59O1xuXG5leHBvcnQgY29uc3QgZXh0cmFjdFRpbWVBbmRTdHJpbmdGcm9tTm90aWNlVGV4dCA9IChcbiAgbm90aWNlPzogTm90aWNlLFxuKTogeyBkdXJhdGlvbjogbnVtYmVyOyB0ZXh0OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGZpcnN0SW5kZXggPSBub3RpY2U/LnRleHQ/LnRlbXBsYXRlICYmIG5vdGljZS50ZXh0LnRlbXBsYXRlLmluZGV4T2YoJygnKSArIDE7XG4gIGNvbnN0IG5vdGljZUR1cmF0aW9uID0gbm90aWNlPy50ZXh0Py50ZW1wbGF0ZT8uc3Vic3RyaW5nKFxuICAgIGZpcnN0SW5kZXggfHwgMCxcbiAgICBub3RpY2U/LnRleHQ/LnRlbXBsYXRlLmluZGV4T2YoJyknKSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGR1cmF0aW9uOiAobm90aWNlRHVyYXRpb24gJiYgK25vdGljZUR1cmF0aW9uLnN1YnN0cmluZygwLCBub3RpY2VEdXJhdGlvbi5sZW5ndGggLSAxKSkgfHwgMCxcbiAgICB0ZXh0OiBub3RpY2U/LnRleHQ/LnRlbXBsYXRlPy5zcGxpdCgnKCcpWzBdIHx8ICcnLFxuICB9O1xufTtcbiIsIi8vIFRoaXMgaGVscGVyIGZpbGUgY29udGFpbnMgc2V2ZXJhbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhY2Nlc3NpbmcgYXR0cmlidXRlcyBmb3IgdGhlIGNvbm5lY3Rpb25zLlxuXG5pbXBvcnQge1xuICBpMThuV2Fsa2luZ0Rpc3RhbmNlQXJyaXZhbCxcbiAgaTE4bldhbGtpbmdEaXN0YW5jZURlcGFydHVyZSxcbn0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9pMThuLmpzJztcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB7XG4gIGV4dHJhY3RUaW1lQW5kU3RyaW5nRnJvbU5vdGljZVRleHQsXG4gIGlzQ29ubmVjdGlvbkxlZyxcbiAgaXNSaWRlTGVnLFxufSBmcm9tICcuL3RpbWV0YWJsZS1oZWxwZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBMZWcsIFB0Q29ubmVjdGlvbkxlZywgUHRSaWRlTGVnIH0gZnJvbSAnLi90aW1ldGFibGUtcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvaWNvbi5qcyc7XG5cbmludGVyZmFjZSBJQWNjZXNzQXR0cmlidXRlIHtcbiAgZHVyYXRpb246IG51bWJlcjtcbiAgdGV4dDogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQHJldHVybnMgdGhlIGF0dHJpYnV0ZSBvZiBhIENvbm5lY3Rpb25MZWdcbiAqL1xuZnVuY3Rpb24gZ2V0UFRDb25uZWN0aW9uQXR0cmlidXRlKFxuICBsZWc6IFB0UmlkZUxlZyB8IFB0Q29ubmVjdGlvbkxlZyxcbiAgY29ubmVjdGlvbkxlZ05vdGljZTogc3RyaW5nW10sXG4pOiBJQWNjZXNzQXR0cmlidXRlIHwgbnVsbCB7XG4gIGNvbnN0IGNvbm5lY3Rpb25GaXJzdExlZyA9IGlzQ29ubmVjdGlvbkxlZyhsZWcpID8gKGxlZyBhcyBQdENvbm5lY3Rpb25MZWcpIDogbnVsbDtcblxuICBjb25zdCBjb25uZWN0aW9uRmlyc3RMZWdOb3RpY2UgPSBjb25uZWN0aW9uRmlyc3RMZWdcbiAgICA/IGNvbm5lY3Rpb25GaXJzdExlZz8ubm90aWNlcz8uZmlsdGVyKChub3RpY2UpID0+IGNvbm5lY3Rpb25MZWdOb3RpY2UuaW5jbHVkZXMobm90aWNlLm5hbWUpKVswXVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gY29ubmVjdGlvbkZpcnN0TGVnTm90aWNlXG4gICAgPyB7XG4gICAgICAgIGR1cmF0aW9uOiBjb25uZWN0aW9uRmlyc3RMZWc/LmR1cmF0aW9uIHx8IDAsXG4gICAgICAgIHRleHQ6IGNvbm5lY3Rpb25GaXJzdExlZ05vdGljZT8udGV4dD8udGVtcGxhdGUgfHwgJycsXG4gICAgICAgIGljb246ICd3YWxrLXNtYWxsJyxcbiAgICAgIH1cbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogQHJldHVybnMgdGhlIGV4dGVuZGVkIGVudGVyIGF0dHJpYnV0ZSBvZiB0aGUgUFRSaWRlTGVnXG4gKi9cbmZ1bmN0aW9uIGdldEZpcnN0RXh0ZW5kZWRMZWdBdHRyaWJ1dGUoXG4gIGxlZzogUHRSaWRlTGVnIHwgUHRDb25uZWN0aW9uTGVnLFxuICBkZXBhcnR1cmVXYWxrOiBudW1iZXIsXG4pOiBJQWNjZXNzQXR0cmlidXRlIHwgbnVsbCB7XG4gIC8vIEV4dGVuZGVkIGVudGVyXG4gIGNvbnN0IGV4dGVuZGVkRmlyc3RMZWcgPSBpc1JpZGVMZWcobGVnKVxuICAgID8gKGxlZyBhcyBQdFJpZGVMZWcpPy5zZXJ2aWNlSm91cm5leT8ubm90aWNlcz8uZmlsdGVyKChub3RpY2UpID0+XG4gICAgICAgIFsnQ0knXS5pbmNsdWRlcyhub3RpY2UubmFtZSksXG4gICAgICApWzBdXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IGV4dHJhY3RUaW1lQW5kU3RyaW5nID1cbiAgICBleHRlbmRlZEZpcnN0TGVnICYmIGV4dHJhY3RUaW1lQW5kU3RyaW5nRnJvbU5vdGljZVRleHQoZXh0ZW5kZWRGaXJzdExlZyk7XG5cbiAgcmV0dXJuIGV4dGVuZGVkRmlyc3RMZWdcbiAgICA/IHtcbiAgICAgICAgZHVyYXRpb246IChleHRyYWN0VGltZUFuZFN0cmluZz8uZHVyYXRpb24gfHwgMCkgKyAoZGVwYXJ0dXJlV2FsayB8fCAwKSxcbiAgICAgICAgdGV4dDogZXh0cmFjdFRpbWVBbmRTdHJpbmc/LnRleHQgfHwgJycsXG4gICAgICAgIGljb246IGBzYS0ke2V4dGVuZGVkRmlyc3RMZWc/Lm5hbWU/LnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgIH1cbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogQHJldHVybnMgdGhlIGV4dGVuZGVkIGV4aXQgYXR0cmlidXRlIG9mIHRoZSBQVFJpZGVMZWdcbiAqL1xuZnVuY3Rpb24gZ2V0TGFzdEV4dGVuZGVkTGVnQXR0cmlidXRlKGxlZzogTGVnLCBhcnJpdmFsV2FsazogbnVtYmVyKTogSUFjY2Vzc0F0dHJpYnV0ZSB8IG51bGwge1xuICAvLyBFeHRlbmRlZCBleGl0XG4gIGNvbnN0IGV4dGVuZGVkTGFzdExlZyA9IGlzUmlkZUxlZyhsZWcpXG4gICAgPyAobGVnIGFzIFB0UmlkZUxlZyk/LnNlcnZpY2VKb3VybmV5Py5ub3RpY2VzPy5maWx0ZXIoKG5vdGljZSkgPT5cbiAgICAgICAgWydDTyddLmluY2x1ZGVzKG5vdGljZS5uYW1lKSxcbiAgICAgIClbMF1cbiAgICA6IG51bGw7XG5cbiAgY29uc3QgZXh0cmFjdFRpbWVBbmRTdHJpbmcgPVxuICAgIGV4dGVuZGVkTGFzdExlZyAmJiBleHRyYWN0VGltZUFuZFN0cmluZ0Zyb21Ob3RpY2VUZXh0KGV4dGVuZGVkTGFzdExlZyk7XG5cbiAgcmV0dXJuIGV4dGVuZGVkTGFzdExlZ1xuICAgID8ge1xuICAgICAgICBkdXJhdGlvbjogKGV4dHJhY3RUaW1lQW5kU3RyaW5nPy5kdXJhdGlvbiB8fCAwKSArIChhcnJpdmFsV2FsayB8fCAwKSxcbiAgICAgICAgdGV4dDogZXh0cmFjdFRpbWVBbmRTdHJpbmc/LnRleHQgfHwgJycsXG4gICAgICAgIGljb246IGBzYS0ke2V4dGVuZGVkTGFzdExlZz8ubmFtZT8udG9Mb3dlckNhc2UoKX1gLFxuICAgICAgfVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiByZW5kZXJzIHRoZSBleHRlbmRlZCBleGl0L2VudGVyIGljb24gd2l0aCB0aGUgZHVyYXRpb25cbiAqL1xuZnVuY3Rpb24gcmVuZGVyVHJhbnNmZXJUaW1lKFxuICBkdXJhdGlvbjogbnVtYmVyIHwgc3RyaW5nLFxuICBpY29uOiBzdHJpbmcsXG4gIGN1cnJlbnRMYW5ndWFnZTogc3RyaW5nLFxuICBsYWJlbD86IHN0cmluZyxcbiAgdHlwZT86ICdkZXBhcnR1cmUnIHwgJ2Fycml2YWwnLFxuKTogVGVtcGxhdGVSZXN1bHQge1xuICByZXR1cm4gaHRtbGBcbiAgICA8c3BhbiBjbGFzcz1cInNiYi1wZWFybC1jaGFpbl9fdGltZS10cmFuc2ZlciBzYmItcGVhcmwtY2hhaW5fX3RpbWUtdHJhbnNmZXItLSR7dHlwZX1cIj5cbiAgICAgIDxzYmItaWNvbiBuYW1lPSR7aWNvbn0+PC9zYmItaWNvbj5cbiAgICAgIDx0aW1lIGRhdGV0aW1lPSR7ZHVyYXRpb24gKyAnTSd9PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAkeyFsYWJlbCAmJiB0eXBlXG4gICAgICAgICAgICA/IHR5cGUgPT09ICdkZXBhcnR1cmUnXG4gICAgICAgICAgICAgID8gaTE4bldhbGtpbmdEaXN0YW5jZURlcGFydHVyZVtjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgICAgICAgIDogaTE4bldhbGtpbmdEaXN0YW5jZUFycml2YWxbY3VycmVudExhbmd1YWdlXVxuICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICR7bGFiZWwgPyBodG1sYDxzcGFuPiR7bGFiZWx9PC9zcGFuPmAgOiBub3RoaW5nfSZuYnNwO1xuICAgICAgICA8L3NwYW4+XG4gICAgICAgICR7ZHVyYXRpb259XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXBlYXJsLWNoYWluX190aW1lLXdhbGt0aW1lLXByaW1lLXN5bWJvbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPic8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPm1pbjwvc3Bhbj5cbiAgICAgIDwvdGltZT5cbiAgICA8L3NwYW4+XG4gIGA7XG59XG5cbi8qKlxuICogcmVuZGVycyBhIHdhbGstdGltZSBpY29uIHdpdGggdGhlIHdhbGsgZHVyYXRpb25cbiAqL1xuZnVuY3Rpb24gcmVuZGVyV2Fsa1RpbWUoXG4gIGR1cmF0aW9uOiBudW1iZXIgfCBzdHJpbmcsXG4gIGxhYmVsOiBzdHJpbmcsXG4gIHZhcmlhbnQ6ICdsZWZ0JyB8ICdyaWdodCcsXG4pOiBUZW1wbGF0ZVJlc3VsdCB7XG4gIHJldHVybiBodG1sYFxuICAgIDxzcGFuIGNsYXNzPVwic2JiLXBlYXJsLWNoYWluX190aW1lLXdhbGt0aW1lIHNiYi1wZWFybC1jaGFpbl9fdGltZS13YWxrdGltZS0tJHt2YXJpYW50fVwiPlxuICAgICAgPHNiYi1pY29uIG5hbWU9XCJ3YWxrLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDx0aW1lIGRhdGV0aW1lPSR7ZHVyYXRpb24gKyAnTSd9PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4ke2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgJHtkdXJhdGlvbn1cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItcGVhcmwtY2hhaW5fX3RpbWUtd2Fsa3RpbWUtcHJpbWUtc3ltYm9sXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+Jzwvc3Bhbj5cbiAgICAgIDwvdGltZT5cbiAgICA8L3NwYW4+XG4gIGA7XG59XG5cbi8qKlxuICogQHBhcmFtIGxlZ3M6IEFuIGFycmF5IG9mIExlZyBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgam91cm5leSBsZWdzLlxuICogQHBhcmFtIGRlcGFydHVyZVdhbGs6IFRoZSB3YWxraW5nIGRpc3RhbmNlIGluIG1pbnV0ZXMgZnJvbSB0aGUgZGVwYXJ0dXJlIHBvaW50IHRvIHRoZSBmaXJzdCBsZWcuXG4gKiBAcGFyYW0gYXJyaXZhbFdhbGs6IFRoZSB3YWxraW5nIGRpc3RhbmNlIGluIG1pbnV0ZXMgZnJvbSB0aGUgbGFzdCBsZWcgdG8gdGhlIGFycml2YWwgcG9pbnQuXG4gKiBAcGFyYW0gY3VycmVudExhbmd1YWdlOiBUaGUgY3VycmVudCBsYW5ndWFnZSBmb3IgbG9jYWxpemF0aW9uLlxuICogQHJldHVybnMgcmVuZGVyRGVwYXJ0dXJlVGltZUF0dHJpYnV0ZTogQSBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIGVsZW1lbnQgZm9yIHRoZSBkZXBhcnR1cmUgdGltZSBhdHRyaWJ1dGUuXG4gKiBAcmV0dXJucyByZW5kZXJBcnJpdmFsVGltZUF0dHJpYnV0ZTogQSBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIGVsZW1lbnQgZm9yIHRoZSBhcnJpdmFsIHRpbWUgYXR0cmlidXRlLlxuICogQHJldHVybnMgYXJyaXZhbFRpbWVBdHRyaWJ1dGU6IFRoZSBhY2Nlc3MgYXR0cmlidXRlIGZvciB0aGUgYXJyaXZhbCB0aW1lLlxuICogQHJldHVybnMgZGVwYXJ0dXJlVGltZUF0dHJpYnV0ZTogVGhlIGFjY2VzcyBhdHRyaWJ1dGUgZm9yIHRoZSBkZXBhcnR1cmUgdGltZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlcGFydHVyZUFycml2YWxUaW1lQXR0cmlidXRlKFxuICBsZWdzOiBMZWdbXSxcbiAgZGVwYXJ0dXJlV2FsazogbnVtYmVyLFxuICBhcnJpdmFsV2FsazogbnVtYmVyLFxuICBjdXJyZW50TGFuZ3VhZ2U6IHN0cmluZyxcbik6IHtcbiAgcmVuZGVyRGVwYXJ0dXJlVGltZUF0dHJpYnV0ZTogKCkgPT4gVGVtcGxhdGVSZXN1bHQ7XG4gIHJlbmRlckFycml2YWxUaW1lQXR0cmlidXRlOiAoKSA9PiBUZW1wbGF0ZVJlc3VsdDtcbiAgZGVwYXJ0dXJlVGltZUF0dHJpYnV0ZTogSUFjY2Vzc0F0dHJpYnV0ZSB8IG51bGw7XG4gIGFycml2YWxUaW1lQXR0cmlidXRlOiBJQWNjZXNzQXR0cmlidXRlIHwgbnVsbDtcbn0ge1xuICBjb25zdCBjb25uZWN0aW9uUmlkZUxlZyA9XG4gICAgbGVncyAmJlxuICAgIChsZWdzLmZpbHRlcigobGVnKSA9PiBpc1JpZGVMZWcobGVnKSB8fCBpc0Nvbm5lY3Rpb25MZWcobGVnKSlbMF0gYXNcbiAgICAgIHwgUHRSaWRlTGVnXG4gICAgICB8IFB0Q29ubmVjdGlvbkxlZyk7XG5cbiAgY29uc3QgY29ubmVjdGlvbkxlZ05vdGljZSA9IFsnWU0nLCAnWUInLCAnWScsICdZVCddO1xuXG4gIGNvbnN0IGNvbm5lY3Rpb25GaXJzdExlZyA9IGdldFBUQ29ubmVjdGlvbkF0dHJpYnV0ZShjb25uZWN0aW9uUmlkZUxlZywgY29ubmVjdGlvbkxlZ05vdGljZSk7XG4gIGNvbnN0IGV4dGVuZGVkRmlyc3RMZWcgPSBnZXRGaXJzdEV4dGVuZGVkTGVnQXR0cmlidXRlKGNvbm5lY3Rpb25SaWRlTGVnLCBkZXBhcnR1cmVXYWxrKTtcbiAgY29uc3QgZGVwYXJ0dXJlV2Fsa0F0dHJpYnV0ZSA9IGRlcGFydHVyZVdhbGtcbiAgICA/IHtcbiAgICAgICAgdGV4dDogaTE4bldhbGtpbmdEaXN0YW5jZURlcGFydHVyZVtjdXJyZW50TGFuZ3VhZ2VdLFxuICAgICAgICBkdXJhdGlvbjogZGVwYXJ0dXJlV2FsayxcbiAgICAgICAgaWNvbjogJ3dhbGstc21hbGwnLFxuICAgICAgfVxuICAgIDogbnVsbDtcblxuICBjb25zdCBnZXREZXBhcnR1cmVUeXBlID0gKCk6IElBY2Nlc3NBdHRyaWJ1dGUgfCBudWxsID0+IHtcbiAgICBpZiAoY29ubmVjdGlvbkZpcnN0TGVnKSB7XG4gICAgICByZXR1cm4gY29ubmVjdGlvbkZpcnN0TGVnO1xuICAgIH0gZWxzZSBpZiAoZGVwYXJ0dXJlV2Fsa0F0dHJpYnV0ZSAmJiAhZXh0ZW5kZWRGaXJzdExlZyAmJiAhY29ubmVjdGlvbkZpcnN0TGVnKSB7XG4gICAgICByZXR1cm4gZGVwYXJ0dXJlV2Fsa0F0dHJpYnV0ZTtcbiAgICB9IGVsc2UgaWYgKGV4dGVuZGVkRmlyc3RMZWcpIHtcbiAgICAgIHJldHVybiBleHRlbmRlZEZpcnN0TGVnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVuZGVyRGVwYXJ0dXJlVGltZUF0dHJpYnV0ZSgpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICAke2Nvbm5lY3Rpb25GaXJzdExlZ1xuICAgICAgICA/IHJlbmRlcldhbGtUaW1lKGNvbm5lY3Rpb25GaXJzdExlZy5kdXJhdGlvbiwgY29ubmVjdGlvbkZpcnN0TGVnLnRleHQsICdsZWZ0JylcbiAgICAgICAgOiBub3RoaW5nfVxuICAgICAgJHtkZXBhcnR1cmVXYWxrQXR0cmlidXRlICYmICFleHRlbmRlZEZpcnN0TGVnICYmICFjb25uZWN0aW9uRmlyc3RMZWdcbiAgICAgICAgPyByZW5kZXJXYWxrVGltZShkZXBhcnR1cmVXYWxrQXR0cmlidXRlLmR1cmF0aW9uLCBkZXBhcnR1cmVXYWxrQXR0cmlidXRlLnRleHQsICdsZWZ0JylcbiAgICAgICAgOiBub3RoaW5nfVxuICAgICAgJHtleHRlbmRlZEZpcnN0TGVnXG4gICAgICAgID8gcmVuZGVyVHJhbnNmZXJUaW1lKFxuICAgICAgICAgICAgZXh0ZW5kZWRGaXJzdExlZy5kdXJhdGlvbixcbiAgICAgICAgICAgIGV4dGVuZGVkRmlyc3RMZWcuaWNvbixcbiAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZSxcbiAgICAgICAgICAgIGV4dGVuZGVkRmlyc3RMZWcudGV4dCxcbiAgICAgICAgICAgICdkZXBhcnR1cmUnLFxuICAgICAgICAgIClcbiAgICAgICAgOiBub3RoaW5nfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBsYXN0TGVnID0gbGVncyAmJiBsZWdzW2xlZ3MubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGxhc3RDb25uZWN0aW9uUmlkZUxlZyA9XG4gICAgKGlzQ29ubmVjdGlvbkxlZyhsYXN0TGVnKSB8fCBpc1JpZGVMZWcobGFzdExlZykpICYmIChsYXN0TGVnIGFzIFB0Q29ubmVjdGlvbkxlZyB8IFB0UmlkZUxlZyk7XG5cbiAgY29uc3QgY29ubmVjdGlvbkxhc3RMZWcgPVxuICAgIGxhc3RDb25uZWN0aW9uUmlkZUxlZyAmJiBnZXRQVENvbm5lY3Rpb25BdHRyaWJ1dGUobGFzdENvbm5lY3Rpb25SaWRlTGVnLCBjb25uZWN0aW9uTGVnTm90aWNlKTtcbiAgY29uc3QgZXh0ZW5kZWRMYXN0TGVnID1cbiAgICBsYXN0Q29ubmVjdGlvblJpZGVMZWcgJiYgZ2V0TGFzdEV4dGVuZGVkTGVnQXR0cmlidXRlKGxhc3RDb25uZWN0aW9uUmlkZUxlZywgYXJyaXZhbFdhbGspO1xuICBjb25zdCBhcnJpdmFsV2Fsa0F0dHJpYnV0ZSA9IGFycml2YWxXYWxrXG4gICAgPyB7XG4gICAgICAgIHRleHQ6IGkxOG5XYWxraW5nRGlzdGFuY2VBcnJpdmFsW2N1cnJlbnRMYW5ndWFnZV0sXG4gICAgICAgIGR1cmF0aW9uOiBhcnJpdmFsV2FsayxcbiAgICAgICAgaWNvbjogJ3dhbGstc21hbGwnLFxuICAgICAgfVxuICAgIDogbnVsbDtcblxuICBjb25zdCBnZXRBcnJpdmFsVHlwZSA9ICgpOiBJQWNjZXNzQXR0cmlidXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb25MYXN0TGVnKSB7XG4gICAgICByZXR1cm4gY29ubmVjdGlvbkxhc3RMZWc7XG4gICAgfSBlbHNlIGlmIChhcnJpdmFsV2Fsa0F0dHJpYnV0ZSAmJiAhZXh0ZW5kZWRMYXN0TGVnICYmICFjb25uZWN0aW9uTGFzdExlZykge1xuICAgICAgcmV0dXJuIGFycml2YWxXYWxrQXR0cmlidXRlO1xuICAgIH0gZWxzZSBpZiAoZXh0ZW5kZWRMYXN0TGVnKSB7XG4gICAgICByZXR1cm4gZXh0ZW5kZWRMYXN0TGVnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVuZGVyQXJyaXZhbFRpbWVBdHRyaWJ1dGUoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgJHtjb25uZWN0aW9uTGFzdExlZ1xuICAgICAgICA/IHJlbmRlcldhbGtUaW1lKGNvbm5lY3Rpb25MYXN0TGVnLmR1cmF0aW9uLCBjb25uZWN0aW9uTGFzdExlZy50ZXh0LCAncmlnaHQnKVxuICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAke2Fycml2YWxXYWxrQXR0cmlidXRlICYmICFleHRlbmRlZExhc3RMZWcgJiYgIWNvbm5lY3Rpb25MYXN0TGVnXG4gICAgICAgID8gcmVuZGVyV2Fsa1RpbWUoYXJyaXZhbFdhbGtBdHRyaWJ1dGUuZHVyYXRpb24sIGFycml2YWxXYWxrQXR0cmlidXRlLnRleHQsICdyaWdodCcpXG4gICAgICAgIDogbm90aGluZ31cbiAgICAgICR7ZXh0ZW5kZWRMYXN0TGVnXG4gICAgICAgID8gcmVuZGVyVHJhbnNmZXJUaW1lKFxuICAgICAgICAgICAgZXh0ZW5kZWRMYXN0TGVnLmR1cmF0aW9uLFxuICAgICAgICAgICAgZXh0ZW5kZWRMYXN0TGVnLmljb24sXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2UsXG4gICAgICAgICAgICBleHRlbmRlZExhc3RMZWcudGV4dCxcbiAgICAgICAgICAgICdhcnJpdmFsJyxcbiAgICAgICAgICApXG4gICAgICAgIDogbm90aGluZ31cbiAgICBgO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZW5kZXJEZXBhcnR1cmVUaW1lQXR0cmlidXRlLFxuICAgIHJlbmRlckFycml2YWxUaW1lQXR0cmlidXRlLFxuICAgIGRlcGFydHVyZVRpbWVBdHRyaWJ1dGU6IGdldERlcGFydHVyZVR5cGUoKSxcbiAgICBhcnJpdmFsVGltZUF0dHJpYnV0ZTogZ2V0QXJyaXZhbFR5cGUoKSxcbiAgfTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJYSxNQUFBLFlBQVksQ0FBQyxRQUErRDtBQUN2RixVQUFPLDJCQUFLLGdCQUFlO0FBQzdCO0FBRWEsTUFBQSxrQkFBa0IsQ0FDN0IsUUFDMkQ7QUFDM0QsVUFBTywyQkFBSyxnQkFBZTtBQUM3QjtBQUVhLE1BQUEscUNBQXFDLENBQ2hELFdBQ3VDOztBQUNqQyxRQUFBLGVBQWEsc0NBQVEsU0FBUixtQkFBYyxhQUFZLE9BQU8sS0FBSyxTQUFTLFFBQVEsR0FBRyxJQUFJO0FBQzNFLFFBQUEsa0JBQWlCLDRDQUFRLFNBQVIsbUJBQWMsYUFBZCxtQkFBd0I7QUFBQSxJQUM3QyxjQUFjO0FBQUEsS0FDZCxzQ0FBUSxTQUFSLG1CQUFjLFNBQVMsUUFBUTtBQUFBO0FBRzFCLFNBQUE7QUFBQSxJQUNMLFVBQVcsa0JBQWtCLENBQUMsZUFBZSxVQUFVLEdBQUcsZUFBZSxTQUFTLENBQUMsS0FBTTtBQUFBLElBQ3pGLFFBQU0sNENBQVEsU0FBUixtQkFBYyxhQUFkLG1CQUF3QixNQUFNLEtBQUssT0FBTTtBQUFBLEVBQUE7QUFFbkQ7QUNBQSxTQUFTLHlCQUNQLEtBQ0EscUJBQ3lCOztBQUN6QixRQUFNLHFCQUFxQixnQkFBZ0IsR0FBRyxJQUFLLE1BQTBCO0FBRTdFLFFBQU0sMkJBQTJCLHNCQUM3Qiw4REFBb0IsWUFBcEIsbUJBQTZCLE9BQU8sQ0FBQyxX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
199
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL2NvcmUvdGltZXRhYmxlL3RpbWV0YWJsZS1oZWxwZXIudHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL2NvcmUvdGltZXRhYmxlL2FjY2Vzcy1sZWctaGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExlZywgTm90aWNlIH0gZnJvbSAnLi90aW1ldGFibGUtcHJvcGVydGllcy5qcyc7XG5cbmV4cG9ydCBjb25zdCBpc1JpZGVMZWcgPSAobGVnOiBhbnkpOiBsZWcgaXMgRXh0cmFjdDxMZWcsIHsgX190eXBlbmFtZTogJ1BUUmlkZUxlZycgfT4gPT4ge1xuICByZXR1cm4gbGVnPy5fX3R5cGVuYW1lID09PSAnUFRSaWRlTGVnJztcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Nvbm5lY3Rpb25MZWcgPSAoXG4gIGxlZzogYW55LFxuKTogbGVnIGlzIEV4dHJhY3Q8TGVnLCB7IF9fdHlwZW5hbWU6ICdQVENvbm5lY3Rpb25MZWcnIH0+ID0+IHtcbiAgcmV0dXJuIGxlZz8uX190eXBlbmFtZSA9PT0gJ1BUQ29ubmVjdGlvbkxlZyc7XG59O1xuXG5leHBvcnQgY29uc3QgZXh0cmFjdFRpbWVBbmRTdHJpbmdGcm9tTm90aWNlVGV4dCA9IChcbiAgbm90aWNlPzogTm90aWNlLFxuKTogeyBkdXJhdGlvbjogbnVtYmVyOyB0ZXh0OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGZpcnN0SW5kZXggPSBub3RpY2U/LnRleHQ/LnRlbXBsYXRlICYmIG5vdGljZS50ZXh0LnRlbXBsYXRlLmluZGV4T2YoJygnKSArIDE7XG4gIGNvbnN0IG5vdGljZUR1cmF0aW9uID0gbm90aWNlPy50ZXh0Py50ZW1wbGF0ZT8uc3Vic3RyaW5nKFxuICAgIGZpcnN0SW5kZXggfHwgMCxcbiAgICBub3RpY2U/LnRleHQ/LnRlbXBsYXRlLmluZGV4T2YoJyknKSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGR1cmF0aW9uOiAobm90aWNlRHVyYXRpb24gJiYgK25vdGljZUR1cmF0aW9uLnN1YnN0cmluZygwLCBub3RpY2VEdXJhdGlvbi5sZW5ndGggLSAxKSkgfHwgMCxcbiAgICB0ZXh0OiBub3RpY2U/LnRleHQ/LnRlbXBsYXRlPy5zcGxpdCgnKCcpWzBdIHx8ICcnLFxuICB9O1xufTtcbiIsIi8vIFRoaXMgaGVscGVyIGZpbGUgY29udGFpbnMgc2V2ZXJhbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhY2Nlc3NpbmcgYXR0cmlidXRlcyBmb3IgdGhlIGNvbm5lY3Rpb25zLlxuXG5pbXBvcnQge1xuICBpMThuV2Fsa2luZ0Rpc3RhbmNlQXJyaXZhbCxcbiAgaTE4bldhbGtpbmdEaXN0YW5jZURlcGFydHVyZSxcbn0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9pMThuLmpzJztcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB7XG4gIGV4dHJhY3RUaW1lQW5kU3RyaW5nRnJvbU5vdGljZVRleHQsXG4gIGlzQ29ubmVjdGlvbkxlZyxcbiAgaXNSaWRlTGVnLFxufSBmcm9tICcuL3RpbWV0YWJsZS1oZWxwZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBMZWcsIFB0Q29ubmVjdGlvbkxlZywgUHRSaWRlTGVnIH0gZnJvbSAnLi90aW1ldGFibGUtcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvaWNvbi5qcyc7XG5cbmludGVyZmFjZSBJQWNjZXNzQXR0cmlidXRlIHtcbiAgZHVyYXRpb246IG51bWJlcjtcbiAgdGV4dDogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQHJldHVybnMgdGhlIGF0dHJpYnV0ZSBvZiBhIENvbm5lY3Rpb25MZWdcbiAqL1xuZnVuY3Rpb24gZ2V0UFRDb25uZWN0aW9uQXR0cmlidXRlKFxuICBsZWc6IFB0UmlkZUxlZyB8IFB0Q29ubmVjdGlvbkxlZyxcbiAgY29ubmVjdGlvbkxlZ05vdGljZTogc3RyaW5nW10sXG4pOiBJQWNjZXNzQXR0cmlidXRlIHwgbnVsbCB7XG4gIGNvbnN0IGNvbm5lY3Rpb25GaXJzdExlZyA9IGlzQ29ubmVjdGlvbkxlZyhsZWcpID8gKGxlZyBhcyBQdENvbm5lY3Rpb25MZWcpIDogbnVsbDtcblxuICBjb25zdCBjb25uZWN0aW9uRmlyc3RMZWdOb3RpY2UgPSBjb25uZWN0aW9uRmlyc3RMZWdcbiAgICA/IGNvbm5lY3Rpb25GaXJzdExlZz8ubm90aWNlcz8uZmlsdGVyKChub3RpY2UpID0+IGNvbm5lY3Rpb25MZWdOb3RpY2UuaW5jbHVkZXMobm90aWNlLm5hbWUpKVswXVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gY29ubmVjdGlvbkZpcnN0TGVnTm90aWNlXG4gICAgPyB7XG4gICAgICAgIGR1cmF0aW9uOiBjb25uZWN0aW9uRmlyc3RMZWc/LmR1cmF0aW9uIHx8IDAsXG4gICAgICAgIHRleHQ6IGNvbm5lY3Rpb25GaXJzdExlZ05vdGljZT8udGV4dD8udGVtcGxhdGUgfHwgJycsXG4gICAgICAgIGljb246ICd3YWxrLXNtYWxsJyxcbiAgICAgIH1cbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogQHJldHVybnMgdGhlIGV4dGVuZGVkIGVudGVyIGF0dHJpYnV0ZSBvZiB0aGUgUFRSaWRlTGVnXG4gKi9cbmZ1bmN0aW9uIGdldEZpcnN0RXh0ZW5kZWRMZWdBdHRyaWJ1dGUoXG4gIGxlZzogUHRSaWRlTGVnIHwgUHRDb25uZWN0aW9uTGVnLFxuICBkZXBhcnR1cmVXYWxrOiBudW1iZXIsXG4gIGExMXlGb290cGF0aDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgY3VycmVudExhbmd1YWdlOiBzdHJpbmcsXG4pOiBJQWNjZXNzQXR0cmlidXRlIHwgbnVsbCB7XG4gIC8vIEV4dGVuZGVkIGVudGVyXG4gIGNvbnN0IGV4dGVuZGVkRmlyc3RMZWcgPSBpc1JpZGVMZWcobGVnKVxuICAgID8gKGxlZyBhcyBQdFJpZGVMZWcpPy5zZXJ2aWNlSm91cm5leT8ubm90aWNlcz8uZmlsdGVyKChub3RpY2UpID0+XG4gICAgICAgIFsnQ0knXS5pbmNsdWRlcyhub3RpY2UubmFtZSksXG4gICAgICApWzBdXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IGV4dHJhY3RUaW1lQW5kU3RyaW5nID1cbiAgICBleHRlbmRlZEZpcnN0TGVnICYmIGV4dHJhY3RUaW1lQW5kU3RyaW5nRnJvbU5vdGljZVRleHQoZXh0ZW5kZWRGaXJzdExlZyk7XG5cbiAgcmV0dXJuIGV4dGVuZGVkRmlyc3RMZWdcbiAgICA/IHtcbiAgICAgICAgZHVyYXRpb246IChleHRyYWN0VGltZUFuZFN0cmluZz8uZHVyYXRpb24gfHwgMCkgKyAoZGVwYXJ0dXJlV2FsayB8fCAwKSxcbiAgICAgICAgdGV4dDogYTExeUZvb3RwYXRoXG4gICAgICAgICAgPyBpMThuV2Fsa2luZ0Rpc3RhbmNlRGVwYXJ0dXJlW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgICA6IGV4dHJhY3RUaW1lQW5kU3RyaW5nPy50ZXh0IHx8ICcnLFxuICAgICAgICBpY29uOiBhMTF5Rm9vdHBhdGggPyAnd2hlZWxjaGFpci1zbWFsbCcgOiBgc2EtJHtleHRlbmRlZEZpcnN0TGVnPy5uYW1lPy50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICB9XG4gICAgOiBudWxsO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHRoZSBleHRlbmRlZCBleGl0IGF0dHJpYnV0ZSBvZiB0aGUgUFRSaWRlTGVnXG4gKi9cbmZ1bmN0aW9uIGdldExhc3RFeHRlbmRlZExlZ0F0dHJpYnV0ZShcbiAgbGVnOiBMZWcsXG4gIGFycml2YWxXYWxrOiBudW1iZXIsXG4gIGExMXlGb290cGF0aDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgY3VycmVudExhbmd1YWdlOiBzdHJpbmcsXG4pOiBJQWNjZXNzQXR0cmlidXRlIHwgbnVsbCB7XG4gIC8vIEV4dGVuZGVkIGV4aXRcbiAgY29uc3QgZXh0ZW5kZWRMYXN0TGVnID0gaXNSaWRlTGVnKGxlZylcbiAgICA/IChsZWcgYXMgUHRSaWRlTGVnKT8uc2VydmljZUpvdXJuZXk/Lm5vdGljZXM/LmZpbHRlcigobm90aWNlKSA9PlxuICAgICAgICBbJ0NPJ10uaW5jbHVkZXMobm90aWNlLm5hbWUpLFxuICAgICAgKVswXVxuICAgIDogbnVsbDtcblxuICBjb25zdCBleHRyYWN0VGltZUFuZFN0cmluZyA9XG4gICAgZXh0ZW5kZWRMYXN0TGVnICYmIGV4dHJhY3RUaW1lQW5kU3RyaW5nRnJvbU5vdGljZVRleHQoZXh0ZW5kZWRMYXN0TGVnKTtcblxuICByZXR1cm4gZXh0ZW5kZWRMYXN0TGVnXG4gICAgPyB7XG4gICAgICAgIGR1cmF0aW9uOiAoZXh0cmFjdFRpbWVBbmRTdHJpbmc/LmR1cmF0aW9uIHx8IDApICsgKGFycml2YWxXYWxrIHx8IDApLFxuICAgICAgICB0ZXh0OiBhMTF5Rm9vdHBhdGhcbiAgICAgICAgICA/IGkxOG5XYWxraW5nRGlzdGFuY2VBcnJpdmFsW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgICA6IGV4dHJhY3RUaW1lQW5kU3RyaW5nPy50ZXh0IHx8ICcnLFxuICAgICAgICBpY29uOiBhMTF5Rm9vdHBhdGggPyAnd2hlZWxjaGFpci1zbWFsbCcgOiBgc2EtJHtleHRlbmRlZExhc3RMZWc/Lm5hbWU/LnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgIH1cbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogcmVuZGVycyB0aGUgZXh0ZW5kZWQgZXhpdC9lbnRlciBpY29uIHdpdGggdGhlIGR1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclRyYW5zZmVyVGltZShcbiAgZHVyYXRpb246IG51bWJlciB8IHN0cmluZyxcbiAgaWNvbjogc3RyaW5nLFxuICBjdXJyZW50TGFuZ3VhZ2U6IHN0cmluZyxcbiAgbGFiZWw/OiBzdHJpbmcsXG4gIHR5cGU/OiAnZGVwYXJ0dXJlJyB8ICdhcnJpdmFsJyxcbik6IFRlbXBsYXRlUmVzdWx0IHtcbiAgcmV0dXJuIGh0bWxgXG4gICAgPHNwYW4gY2xhc3M9XCJzYmItcGVhcmwtY2hhaW5fX3RpbWUtdHJhbnNmZXIgc2JiLXBlYXJsLWNoYWluX190aW1lLXRyYW5zZmVyLS0ke2ljb259LSR7dHlwZX1cIj5cbiAgICAgIDxzYmItaWNvbiBuYW1lPSR7aWNvbn0+PC9zYmItaWNvbj5cbiAgICAgIDx0aW1lIGRhdGV0aW1lPSR7ZHVyYXRpb24gKyAnTSd9PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAkeyFsYWJlbCAmJiB0eXBlXG4gICAgICAgICAgICA/IHR5cGUgPT09ICdkZXBhcnR1cmUnXG4gICAgICAgICAgICAgID8gaTE4bldhbGtpbmdEaXN0YW5jZURlcGFydHVyZVtjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgICAgICAgIDogaTE4bldhbGtpbmdEaXN0YW5jZUFycml2YWxbY3VycmVudExhbmd1YWdlXVxuICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICR7bGFiZWwgPyBodG1sYDxzcGFuPiR7bGFiZWx9PC9zcGFuPmAgOiBub3RoaW5nfSZuYnNwO1xuICAgICAgICA8L3NwYW4+XG4gICAgICAgICR7ZHVyYXRpb259XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXBlYXJsLWNoYWluX190aW1lLXdhbGt0aW1lLXByaW1lLXN5bWJvbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPic8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPm1pbjwvc3Bhbj5cbiAgICAgIDwvdGltZT5cbiAgICA8L3NwYW4+XG4gIGA7XG59XG5cbi8qKlxuICogcmVuZGVycyBhIHdhbGstdGltZSBpY29uIHdpdGggdGhlIHdhbGsgZHVyYXRpb25cbiAqL1xuZnVuY3Rpb24gcmVuZGVyV2Fsa1RpbWUoXG4gIGR1cmF0aW9uOiBudW1iZXIgfCBzdHJpbmcsXG4gIGxhYmVsOiBzdHJpbmcsXG4gIHZhcmlhbnQ6ICdsZWZ0JyB8ICdyaWdodCcsXG4gIGljb246IHN0cmluZyxcbik6IFRlbXBsYXRlUmVzdWx0IHtcbiAgcmV0dXJuIGh0bWxgXG4gICAgPHNwYW4gY2xhc3M9XCJzYmItcGVhcmwtY2hhaW5fX3RpbWUtd2Fsa3RpbWUgc2JiLXBlYXJsLWNoYWluX190aW1lLXdhbGt0aW1lLS0ke2ljb259LSR7dmFyaWFudH1cIj5cbiAgICAgIDxzYmItaWNvbiBuYW1lPSR7aWNvbn0+PC9zYmItaWNvbj5cbiAgICAgIDx0aW1lIGRhdGV0aW1lPSR7ZHVyYXRpb24gKyAnTSd9PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4ke2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgJHtkdXJhdGlvbn1cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItcGVhcmwtY2hhaW5fX3RpbWUtd2Fsa3RpbWUtcHJpbWUtc3ltYm9sXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+Jzwvc3Bhbj5cbiAgICAgIDwvdGltZT5cbiAgICA8L3NwYW4+XG4gIGA7XG59XG5cbi8qKlxuICogQHBhcmFtIGxlZ3M6IEFuIGFycmF5IG9mIExlZyBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgam91cm5leSBsZWdzLlxuICogQHBhcmFtIGRlcGFydHVyZVdhbGs6IFRoZSB3YWxraW5nIGRpc3RhbmNlIGluIG1pbnV0ZXMgZnJvbSB0aGUgZGVwYXJ0dXJlIHBvaW50IHRvIHRoZSBmaXJzdCBsZWcuXG4gKiBAcGFyYW0gYXJyaXZhbFdhbGs6IFRoZSB3YWxraW5nIGRpc3RhbmNlIGluIG1pbnV0ZXMgZnJvbSB0aGUgbGFzdCBsZWcgdG8gdGhlIGFycml2YWwgcG9pbnQuXG4gKiBAcGFyYW0gY3VycmVudExhbmd1YWdlOiBUaGUgY3VycmVudCBsYW5ndWFnZSBmb3IgbG9jYWxpemF0aW9uLlxuICogQHBhcmFtIGExMXlGb290cGF0aDogV2hldGhlciB0aGUgYTExeS1pY29uIHNob3VsZCBiZSBzaG93bi5cbiAqIEByZXR1cm5zIHJlbmRlckRlcGFydHVyZVRpbWVBdHRyaWJ1dGU6IEEgZnVuY3Rpb24gdGhhdCByZW5kZXJzIHRoZSBlbGVtZW50IGZvciB0aGUgZGVwYXJ0dXJlIHRpbWUgYXR0cmlidXRlLlxuICogQHJldHVybnMgcmVuZGVyQXJyaXZhbFRpbWVBdHRyaWJ1dGU6IEEgZnVuY3Rpb24gdGhhdCByZW5kZXJzIHRoZSBlbGVtZW50IGZvciB0aGUgYXJyaXZhbCB0aW1lIGF0dHJpYnV0ZS5cbiAqIEByZXR1cm5zIGFycml2YWxUaW1lQXR0cmlidXRlOiBUaGUgYWNjZXNzIGF0dHJpYnV0ZSBmb3IgdGhlIGFycml2YWwgdGltZS5cbiAqIEByZXR1cm5zIGRlcGFydHVyZVRpbWVBdHRyaWJ1dGU6IFRoZSBhY2Nlc3MgYXR0cmlidXRlIGZvciB0aGUgZGVwYXJ0dXJlIHRpbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXBhcnR1cmVBcnJpdmFsVGltZUF0dHJpYnV0ZShcbiAgbGVnczogTGVnW10sXG4gIGRlcGFydHVyZVdhbGs6IG51bWJlcixcbiAgYXJyaXZhbFdhbGs6IG51bWJlcixcbiAgY3VycmVudExhbmd1YWdlOiBzdHJpbmcsXG4gIGExMXlGb290cGF0aD86IGJvb2xlYW4sXG4pOiB7XG4gIHJlbmRlckRlcGFydHVyZVRpbWVBdHRyaWJ1dGU6ICgpID0+IFRlbXBsYXRlUmVzdWx0O1xuICByZW5kZXJBcnJpdmFsVGltZUF0dHJpYnV0ZTogKCkgPT4gVGVtcGxhdGVSZXN1bHQ7XG4gIGRlcGFydHVyZVRpbWVBdHRyaWJ1dGU6IElBY2Nlc3NBdHRyaWJ1dGUgfCBudWxsO1xuICBhcnJpdmFsVGltZUF0dHJpYnV0ZTogSUFjY2Vzc0F0dHJpYnV0ZSB8IG51bGw7XG59IHtcbiAgY29uc3QgY29ubmVjdGlvblJpZGVMZWcgPVxuICAgIGxlZ3MgJiZcbiAgICAobGVncy5maWx0ZXIoKGxlZykgPT4gaXNSaWRlTGVnKGxlZykgfHwgaXNDb25uZWN0aW9uTGVnKGxlZykpWzBdIGFzXG4gICAgICB8IFB0UmlkZUxlZ1xuICAgICAgfCBQdENvbm5lY3Rpb25MZWcpO1xuXG4gIGNvbnN0IGNvbm5lY3Rpb25MZWdOb3RpY2UgPSBbJ1lNJywgJ1lCJywgJ1knLCAnWVQnXTtcblxuICBjb25zdCBjb25uZWN0aW9uRmlyc3RMZWcgPSBnZXRQVENvbm5lY3Rpb25BdHRyaWJ1dGUoY29ubmVjdGlvblJpZGVMZWcsIGNvbm5lY3Rpb25MZWdOb3RpY2UpO1xuICBjb25zdCBleHRlbmRlZEZpcnN0TGVnID0gZ2V0Rmlyc3RFeHRlbmRlZExlZ0F0dHJpYnV0ZShcbiAgICBjb25uZWN0aW9uUmlkZUxlZyxcbiAgICBkZXBhcnR1cmVXYWxrLFxuICAgIGExMXlGb290cGF0aCxcbiAgICBjdXJyZW50TGFuZ3VhZ2UsXG4gICk7XG4gIGNvbnN0IGRlcGFydHVyZVdhbGtBdHRyaWJ1dGUgPSBkZXBhcnR1cmVXYWxrXG4gICAgPyB7XG4gICAgICAgIHRleHQ6IGkxOG5XYWxraW5nRGlzdGFuY2VEZXBhcnR1cmVbY3VycmVudExhbmd1YWdlXSxcbiAgICAgICAgZHVyYXRpb246IGRlcGFydHVyZVdhbGssXG4gICAgICAgIGljb246IGExMXlGb290cGF0aCA/ICd3aGVlbGNoYWlyLXNtYWxsJyA6ICd3YWxrLXNtYWxsJyxcbiAgICAgIH1cbiAgICA6IG51bGw7XG5cbiAgY29uc3QgZ2V0RGVwYXJ0dXJlVHlwZSA9ICgpOiBJQWNjZXNzQXR0cmlidXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb25GaXJzdExlZykge1xuICAgICAgcmV0dXJuIGNvbm5lY3Rpb25GaXJzdExlZztcbiAgICB9IGVsc2UgaWYgKGRlcGFydHVyZVdhbGtBdHRyaWJ1dGUgJiYgIWV4dGVuZGVkRmlyc3RMZWcgJiYgIWNvbm5lY3Rpb25GaXJzdExlZykge1xuICAgICAgcmV0dXJuIGRlcGFydHVyZVdhbGtBdHRyaWJ1dGU7XG4gICAgfSBlbHNlIGlmIChleHRlbmRlZEZpcnN0TGVnKSB7XG4gICAgICByZXR1cm4gZXh0ZW5kZWRGaXJzdExlZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHJlbmRlckRlcGFydHVyZVRpbWVBdHRyaWJ1dGUoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgJHtjb25uZWN0aW9uRmlyc3RMZWdcbiAgICAgICAgPyByZW5kZXJXYWxrVGltZShcbiAgICAgICAgICAgIGNvbm5lY3Rpb25GaXJzdExlZy5kdXJhdGlvbixcbiAgICAgICAgICAgIGNvbm5lY3Rpb25GaXJzdExlZy50ZXh0LFxuICAgICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICAgY29ubmVjdGlvbkZpcnN0TGVnLmljb24sXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAke2RlcGFydHVyZVdhbGtBdHRyaWJ1dGUgJiYgIWV4dGVuZGVkRmlyc3RMZWcgJiYgIWNvbm5lY3Rpb25GaXJzdExlZ1xuICAgICAgICA/IHJlbmRlcldhbGtUaW1lKFxuICAgICAgICAgICAgZGVwYXJ0dXJlV2Fsa0F0dHJpYnV0ZS5kdXJhdGlvbixcbiAgICAgICAgICAgIGRlcGFydHVyZVdhbGtBdHRyaWJ1dGUudGV4dCxcbiAgICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAgIGRlcGFydHVyZVdhbGtBdHRyaWJ1dGUuaWNvbixcbiAgICAgICAgICApXG4gICAgICAgIDogbm90aGluZ31cbiAgICAgICR7ZXh0ZW5kZWRGaXJzdExlZ1xuICAgICAgICA/IGExMXlGb290cGF0aFxuICAgICAgICAgID8gcmVuZGVyV2Fsa1RpbWUoXG4gICAgICAgICAgICAgIGV4dGVuZGVkRmlyc3RMZWcuZHVyYXRpb24sXG4gICAgICAgICAgICAgIGV4dGVuZGVkRmlyc3RMZWcudGV4dCxcbiAgICAgICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICAgICBleHRlbmRlZEZpcnN0TGVnLmljb24sXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiByZW5kZXJUcmFuc2ZlclRpbWUoXG4gICAgICAgICAgICAgIGV4dGVuZGVkRmlyc3RMZWcuZHVyYXRpb24sXG4gICAgICAgICAgICAgIGV4dGVuZGVkRmlyc3RMZWcuaWNvbixcbiAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlLFxuICAgICAgICAgICAgICBleHRlbmRlZEZpcnN0TGVnLnRleHQsXG4gICAgICAgICAgICAgICdkZXBhcnR1cmUnLFxuICAgICAgICAgICAgKVxuICAgICAgICA6IG5vdGhpbmd9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IGxhc3RMZWcgPSBsZWdzICYmIGxlZ3NbbGVncy5sZW5ndGggLSAxXTtcbiAgY29uc3QgbGFzdENvbm5lY3Rpb25SaWRlTGVnID1cbiAgICAoaXNDb25uZWN0aW9uTGVnKGxhc3RMZWcpIHx8IGlzUmlkZUxlZyhsYXN0TGVnKSkgJiYgKGxhc3RMZWcgYXMgUHRDb25uZWN0aW9uTGVnIHwgUHRSaWRlTGVnKTtcblxuICBjb25zdCBjb25uZWN0aW9uTGFzdExlZyA9XG4gICAgbGFzdENvbm5lY3Rpb25SaWRlTGVnICYmIGdldFBUQ29ubmVjdGlvbkF0dHJpYnV0ZShsYXN0Q29ubmVjdGlvblJpZGVMZWcsIGNvbm5lY3Rpb25MZWdOb3RpY2UpO1xuICBjb25zdCBleHRlbmRlZExhc3RMZWcgPVxuICAgIGxhc3RDb25uZWN0aW9uUmlkZUxlZyAmJlxuICAgIGdldExhc3RFeHRlbmRlZExlZ0F0dHJpYnV0ZShsYXN0Q29ubmVjdGlvblJpZGVMZWcsIGFycml2YWxXYWxrLCBhMTF5Rm9vdHBhdGgsIGN1cnJlbnRMYW5ndWFnZSk7XG4gIGNvbnN0IGFycml2YWxXYWxrQXR0cmlidXRlID0gYXJyaXZhbFdhbGtcbiAgICA/IHtcbiAgICAgICAgdGV4dDogaTE4bldhbGtpbmdEaXN0YW5jZUFycml2YWxbY3VycmVudExhbmd1YWdlXSxcbiAgICAgICAgZHVyYXRpb246IGFycml2YWxXYWxrLFxuICAgICAgICBpY29uOiBhMTF5Rm9vdHBhdGggPyAnd2hlZWxjaGFpci1zbWFsbCcgOiAnd2Fsay1zbWFsbCcsXG4gICAgICB9XG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IGdldEFycml2YWxUeXBlID0gKCk6IElBY2Nlc3NBdHRyaWJ1dGUgfCBudWxsID0+IHtcbiAgICBpZiAoY29ubmVjdGlvbkxhc3RMZWcpIHtcbiAgICAgIHJldHVybiBjb25uZWN0aW9uTGFzdExlZztcbiAgICB9IGVsc2UgaWYgKGFycml2YWxXYWxrQXR0cmlidXRlICYmICFleHRlbmRlZExhc3RMZWcgJiYgIWNvbm5lY3Rpb25MYXN0TGVnKSB7XG4gICAgICByZXR1cm4gYXJyaXZhbFdhbGtBdHRyaWJ1dGU7XG4gICAgfSBlbHNlIGlmIChleHRlbmRlZExhc3RMZWcpIHtcbiAgICAgIHJldHVybiBleHRlbmRlZExhc3RMZWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiByZW5kZXJBcnJpdmFsVGltZUF0dHJpYnV0ZSgpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICAke2Nvbm5lY3Rpb25MYXN0TGVnXG4gICAgICAgID8gcmVuZGVyV2Fsa1RpbWUoXG4gICAgICAgICAgICBjb25uZWN0aW9uTGFzdExlZy5kdXJhdGlvbixcbiAgICAgICAgICAgIGNvbm5lY3Rpb25MYXN0TGVnLnRleHQsXG4gICAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICAgY29ubmVjdGlvbkxhc3RMZWcuaWNvbixcbiAgICAgICAgICApXG4gICAgICAgIDogbm90aGluZ31cbiAgICAgICR7YXJyaXZhbFdhbGtBdHRyaWJ1dGUgJiYgIWV4dGVuZGVkTGFzdExlZyAmJiAhY29ubmVjdGlvbkxhc3RMZWdcbiAgICAgICAgPyByZW5kZXJXYWxrVGltZShcbiAgICAgICAgICAgIGFycml2YWxXYWxrQXR0cmlidXRlLmR1cmF0aW9uLFxuICAgICAgICAgICAgYXJyaXZhbFdhbGtBdHRyaWJ1dGUudGV4dCxcbiAgICAgICAgICAgICdyaWdodCcsXG4gICAgICAgICAgICBhcnJpdmFsV2Fsa0F0dHJpYnV0ZS5pY29uLFxuICAgICAgICAgIClcbiAgICAgICAgOiBub3RoaW5nfVxuICAgICAgJHtleHRlbmRlZExhc3RMZWdcbiAgICAgICAgPyBhMTF5Rm9vdHBhdGhcbiAgICAgICAgICA/IHJlbmRlcldhbGtUaW1lKFxuICAgICAgICAgICAgICBleHRlbmRlZExhc3RMZWcuZHVyYXRpb24sXG4gICAgICAgICAgICAgIGV4dGVuZGVkTGFzdExlZy50ZXh0LFxuICAgICAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICAgICBleHRlbmRlZExhc3RMZWcuaWNvbixcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHJlbmRlclRyYW5zZmVyVGltZShcbiAgICAgICAgICAgICAgZXh0ZW5kZWRMYXN0TGVnLmR1cmF0aW9uLFxuICAgICAgICAgICAgICBleHRlbmRlZExhc3RMZWcuaWNvbixcbiAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlLFxuICAgICAgICAgICAgICBleHRlbmRlZExhc3RMZWcudGV4dCxcbiAgICAgICAgICAgICAgJ2Fycml2YWwnLFxuICAgICAgICAgICAgKVxuICAgICAgICA6IG5vdGhpbmd9XG4gICAgYDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVuZGVyRGVwYXJ0dXJlVGltZUF0dHJpYnV0ZSxcbiAgICByZW5kZXJBcnJpdmFsVGltZUF0dHJpYnV0ZSxcbiAgICBkZXBhcnR1cmVUaW1lQXR0cmlidXRlOiBnZXREZXBhcnR1cmVUeXBlKCksXG4gICAgYXJyaXZhbFRpbWVBdHRyaWJ1dGU6IGdldEFycml2YWxUeXBlKCksXG4gIH07XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSWEsTUFBQSxZQUFZ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