@sbb-esta/lyne-elements-experimental-dev 4.7.0-dev.1773333596 → 4.7.0-dev.1773388997
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +65 -76
- package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +72 -52
- package/autocomplete-grid/autocomplete-grid-button.js +3 -6
- package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +2 -17
- package/autocomplete-grid/autocomplete-grid-cell.js +4 -7
- package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +20 -21
- package/autocomplete-grid/autocomplete-grid-optgroup.js +3 -6
- package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +2 -33
- package/autocomplete-grid/autocomplete-grid-option.js +4 -9
- package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +2 -22
- package/autocomplete-grid/autocomplete-grid-row.js +4 -7
- package/autocomplete-grid/autocomplete-grid.js +3 -6
- package/autocomplete-grid-cell.component-Dak9wlBr.js +24 -0
- package/autocomplete-grid-option.component-DNRFHOwc.js +37 -0
- package/autocomplete-grid-row.component-DBHZQ0GQ.js +27 -0
- package/autocomplete-grid.js +9 -21
- package/autocomplete-grid.pure.js +7 -15
- package/core/datetime/date-helper.js +2 -191
- package/core/datetime.js +2 -5
- package/core/timetable/access-leg-helper.js +76 -71
- package/core/timetable/timetable-helper.js +9 -11
- package/core/timetable/timetable-properties.js +0 -1
- package/core/timetable.js +3 -7
- package/date-helper-CGproP5d.js +185 -0
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +114 -122
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +92 -70
- package/development/autocomplete-grid/autocomplete-grid-button.js +6 -4
- package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +2 -29
- package/development/autocomplete-grid/autocomplete-grid-cell.js +7 -5
- package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +27 -22
- package/development/autocomplete-grid/autocomplete-grid-optgroup.js +6 -4
- package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +2 -109
- package/development/autocomplete-grid/autocomplete-grid-option.js +7 -7
- package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +2 -91
- package/development/autocomplete-grid/autocomplete-grid-row.js +7 -5
- package/development/autocomplete-grid/autocomplete-grid.js +6 -4
- package/development/autocomplete-grid-cell.component-BBvM4o2H.js +42 -0
- package/development/autocomplete-grid-option.component-QzfM5eIE.js +123 -0
- package/development/autocomplete-grid-row.component-H8sCTCkT.js +104 -0
- package/development/autocomplete-grid.js +10 -14
- package/development/autocomplete-grid.pure.js +4 -13
- package/development/core/datetime/date-helper.js +2 -285
- package/development/core/datetime.js +2 -6
- package/development/core/timetable/access-leg-helper.js +104 -82
- package/development/core/timetable/timetable-helper.js +16 -17
- package/development/core/timetable/timetable-properties.js +0 -2
- package/development/core/timetable.js +3 -8
- package/development/date-helper-8_Y-PuHh.js +520 -0
- package/development/differenceInMinutes-DN_1Rk3O.js +110 -0
- package/development/format-Bbrn2bgo.js +1848 -0
- package/development/isValid-C-HzKv4v.js +178 -0
- package/development/journey-summary/journey-summary.component.js +2 -288
- package/development/journey-summary.component-uGhZvA4p.js +385 -0
- package/development/journey-summary.js +8 -5
- package/development/journey-summary.pure.js +2 -5
- package/development/pearl-chain/pearl-chain.component.js +2 -634
- package/development/pearl-chain-time/pearl-chain-time.component.js +2 -306
- package/development/pearl-chain-time.component-B8mayTWD.js +415 -0
- package/development/pearl-chain-time.js +8 -5
- package/development/pearl-chain-time.pure.js +2 -5
- package/development/pearl-chain-vertical/pearl-chain-vertical.component.js +2 -28
- package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +2 -393
- package/development/pearl-chain-vertical-item.component-BDzbcIaf.js +435 -0
- package/development/pearl-chain-vertical-item.js +8 -5
- package/development/pearl-chain-vertical-item.pure.js +2 -5
- package/development/pearl-chain-vertical.component-CswE7b3M.js +39 -0
- package/development/pearl-chain-vertical.js +8 -5
- package/development/pearl-chain-vertical.pure.js +2 -5
- package/development/pearl-chain.component-wpsTvoSe.js +704 -0
- package/development/pearl-chain.js +8 -5
- package/development/pearl-chain.pure.js +2 -5
- package/development/seat-reservation/common/mapper/icon-mapper.js +168 -71
- package/development/seat-reservation/common/mapper/mapper.js +153 -122
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.js +570 -559
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.js +992 -972
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-giruno.js +20334 -20367
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.js +1731 -1738
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.js +9741 -9782
- package/development/seat-reservation/common/mapper.js +1 -8
- package/development/seat-reservation/common/svgs.js +2 -46
- package/development/seat-reservation/common/translations/i18n.js +1118 -900
- package/development/seat-reservation/common/translations.js +1 -4
- package/development/seat-reservation/common/types.js +0 -2
- package/development/seat-reservation/common.js +7 -11
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +1305 -1230
- package/development/seat-reservation/seat-reservation/seat-reservation.component.js +2 -859
- package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +2 -106
- package/development/seat-reservation/seat-reservation-area.js +7 -5
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +35 -34
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +2 -162
- package/development/seat-reservation/seat-reservation-graphic.js +7 -5
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +2 -713
- package/development/seat-reservation/seat-reservation-navigation-coach.js +7 -5
- package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +2 -131
- package/development/seat-reservation/seat-reservation-navigation-services.js +7 -5
- package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +2 -601
- package/development/seat-reservation/seat-reservation-place-control.js +7 -5
- package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +2 -22
- package/development/seat-reservation/seat-reservation-scoped.js +7 -5
- package/development/seat-reservation/seat-reservation.js +7 -6
- package/development/seat-reservation-area.component-BK92ZtFo.js +138 -0
- package/development/seat-reservation-graphic.component-cUnsHh5x.js +193 -0
- package/development/seat-reservation-navigation-coach.component-D6Bglus8.js +828 -0
- package/development/seat-reservation-navigation-services.component-DYJ6Ddkg.js +179 -0
- package/development/seat-reservation-place-control.component-Bg9evKBW.js +726 -0
- package/development/seat-reservation-scoped.component-DRQ_I702.js +31 -0
- package/development/seat-reservation.component-Cq_aJKR0.js +818 -0
- package/development/seat-reservation.js +15 -28
- package/development/seat-reservation.pure.js +10 -28
- package/development/svgs-C3JMWR26.js +28 -0
- package/development/timetable-duration/timetable-duration.component.js +2 -108
- package/development/timetable-duration.component-DI0lET17.js +125 -0
- package/development/timetable-duration.js +8 -5
- package/development/timetable-duration.pure.js +2 -5
- package/development/timetable-row/timetable-row.component.js +2 -781
- package/development/timetable-row.component-CAED6Zwc.js +932 -0
- package/development/timetable-row.js +8 -13
- package/development/timetable-row.pure.js +2 -12
- package/development/toDate-Biiv3kyf.js +150 -0
- package/differenceInMinutes-Dr9gRqtu.js +27 -0
- package/format-CM5exOsN.js +1103 -0
- package/isValid-B9oVW3lA.js +36 -0
- package/journey-summary/journey-summary.component.js +2 -194
- package/journey-summary.component-Cq_4kaOp.js +264 -0
- package/journey-summary.js +5 -4
- package/journey-summary.pure.js +2 -4
- package/package.json +2 -2
- package/pearl-chain/pearl-chain.component.js +2 -165
- package/pearl-chain-time/pearl-chain-time.component.js +2 -157
- package/pearl-chain-time.component-DGDW5S1c.js +239 -0
- package/pearl-chain-time.js +5 -4
- package/pearl-chain-time.pure.js +2 -4
- package/pearl-chain-vertical/pearl-chain-vertical.component.js +2 -17
- package/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +2 -77
- package/pearl-chain-vertical-item.component-G22bWhLU.js +108 -0
- package/pearl-chain-vertical-item.js +5 -4
- package/pearl-chain-vertical-item.pure.js +2 -4
- package/pearl-chain-vertical.component-CXIDT5RD.js +21 -0
- package/pearl-chain-vertical.js +5 -4
- package/pearl-chain-vertical.pure.js +2 -4
- package/pearl-chain.component-DmjkVIva.js +194 -0
- package/pearl-chain.js +5 -4
- package/pearl-chain.pure.js +2 -4
- package/seat-reservation/common/mapper/icon-mapper.js +71 -71
- package/seat-reservation/common/mapper/mapper.js +95 -89
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.js +568 -558
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.js +989 -970
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-giruno.js +20332 -20366
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.js +1729 -1737
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.js +9739 -9781
- package/seat-reservation/common/mapper.js +3 -9
- package/seat-reservation/common/svgs.js +2 -243
- package/seat-reservation/common/translations/i18n.js +1084 -891
- package/seat-reservation/common/translations.js +2 -4
- package/seat-reservation/common/types.js +0 -1
- package/seat-reservation/common.js +9 -15
- package/seat-reservation/seat-reservation/seat-reservation-base-element.js +832 -810
- package/seat-reservation/seat-reservation/seat-reservation.component.js +2 -420
- package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +2 -51
- package/seat-reservation/seat-reservation-area.js +4 -7
- package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +68 -71
- package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +2 -75
- package/seat-reservation/seat-reservation-graphic.js +4 -7
- package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +2 -234
- package/seat-reservation/seat-reservation-navigation-coach.js +4 -7
- package/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +2 -85
- package/seat-reservation/seat-reservation-navigation-services.js +4 -7
- package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +2 -203
- package/seat-reservation/seat-reservation-place-control.js +4 -7
- package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +2 -13
- package/seat-reservation/seat-reservation-scoped.js +4 -7
- package/seat-reservation/seat-reservation.js +5 -9
- package/seat-reservation-area.component-n-9rGn_y.js +75 -0
- package/seat-reservation-graphic.component-YTXRmKt0.js +102 -0
- package/seat-reservation-navigation-coach.component-YJ0vaYmO.js +333 -0
- package/seat-reservation-navigation-services.component-C3xnLJg2.js +127 -0
- package/seat-reservation-place-control.component-DmBAfM6K.js +322 -0
- package/seat-reservation-scoped.component-DPkz6u17.js +17 -0
- package/seat-reservation.component-C_anMkgw.js +364 -0
- package/seat-reservation.js +17 -39
- package/seat-reservation.pure.js +15 -32
- package/svgs-D9arBcqr.js +26 -0
- package/timetable-duration/timetable-duration.component.js +2 -57
- package/timetable-duration.component-DCu8Phts.js +65 -0
- package/timetable-duration.js +5 -4
- package/timetable-duration.pure.js +2 -4
- package/timetable-row/timetable-row.component.js +2 -427
- package/timetable-row.component-BVRCB3xK.js +559 -0
- package/timetable-row.js +6 -13
- package/timetable-row.pure.js +2 -11
- package/toDate-p-Tpkb7t.js +16 -0
- package/development/differenceInMinutes-B0dawX-5.js +0 -26
- package/development/format-BMkeaqaF.js +0 -1433
- package/development/isValid-BYRch7pV.js +0 -53
- package/development/toDate-BWb6Z1JD.js +0 -24
- package/differenceInMinutes-COvvdYsJ.js +0 -23
- package/format-CmKROkbc.js +0 -1186
- package/isValid-m3_OsPaB.js +0 -45
- package/toDate-Bw2KTWeq.js +0 -15
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
import { a as millisecondsInMinute, i as millisecondsInHour, n as constructFrom, t as toDate } from "./toDate-Biiv3kyf.js";
|
|
2
|
+
import { n as differenceInCalendarDays, r as normalizeDates, t as isValid } from "./isValid-C-HzKv4v.js";
|
|
3
|
+
import { n as getRoundingMethod, r as addMinutes, t as differenceInMinutes } from "./differenceInMinutes-DN_1Rk3O.js";
|
|
4
|
+
import { i18nDurationDay, i18nDurationHour, i18nDurationMinute } from "@sbb-esta/lyne-elements/core/i18n.js";
|
|
5
|
+
//#region node_modules/date-fns/addDays.js
|
|
6
|
+
/**
|
|
7
|
+
* The {@link addDays} function options.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @name addDays
|
|
11
|
+
* @category Day Helpers
|
|
12
|
+
* @summary Add the specified number of days to the given date.
|
|
13
|
+
*
|
|
14
|
+
* @description
|
|
15
|
+
* Add the specified number of days to the given date.
|
|
16
|
+
*
|
|
17
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
18
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
19
|
+
*
|
|
20
|
+
* @param date - The date to be changed
|
|
21
|
+
* @param amount - The amount of days to be added.
|
|
22
|
+
* @param options - An object with options
|
|
23
|
+
*
|
|
24
|
+
* @returns The new date with the days added
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // Add 10 days to 1 September 2014:
|
|
28
|
+
* const result = addDays(new Date(2014, 8, 1), 10)
|
|
29
|
+
* //=> Thu Sep 11 2014 00:00:00
|
|
30
|
+
*/
|
|
31
|
+
function addDays(date, amount, options) {
|
|
32
|
+
const _date = toDate(date, options?.in);
|
|
33
|
+
if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
|
|
34
|
+
if (!amount) return _date;
|
|
35
|
+
_date.setDate(_date.getDate() + amount);
|
|
36
|
+
return _date;
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region node_modules/date-fns/addMilliseconds.js
|
|
40
|
+
/**
|
|
41
|
+
* The {@link addMilliseconds} function options.
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* @name addMilliseconds
|
|
45
|
+
* @category Millisecond Helpers
|
|
46
|
+
* @summary Add the specified number of milliseconds to the given date.
|
|
47
|
+
*
|
|
48
|
+
* @description
|
|
49
|
+
* Add the specified number of milliseconds to the given date.
|
|
50
|
+
*
|
|
51
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
52
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
53
|
+
*
|
|
54
|
+
* @param date - The date to be changed
|
|
55
|
+
* @param amount - The amount of milliseconds to be added.
|
|
56
|
+
* @param options - The options object
|
|
57
|
+
*
|
|
58
|
+
* @returns The new date with the milliseconds added
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* // Add 750 milliseconds to 10 July 2014 12:45:30.000:
|
|
62
|
+
* const result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)
|
|
63
|
+
* //=> Thu Jul 10 2014 12:45:30.750
|
|
64
|
+
*/
|
|
65
|
+
function addMilliseconds(date, amount, options) {
|
|
66
|
+
return constructFrom(options?.in || date, +toDate(date) + amount);
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
//#region node_modules/date-fns/addHours.js
|
|
70
|
+
/**
|
|
71
|
+
* The {@link addHours} function options.
|
|
72
|
+
*/
|
|
73
|
+
/**
|
|
74
|
+
* @name addHours
|
|
75
|
+
* @category Hour Helpers
|
|
76
|
+
* @summary Add the specified number of hours to the given date.
|
|
77
|
+
*
|
|
78
|
+
* @description
|
|
79
|
+
* Add the specified number of hours to the given date.
|
|
80
|
+
*
|
|
81
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
82
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
83
|
+
*
|
|
84
|
+
* @param date - The date to be changed
|
|
85
|
+
* @param amount - The amount of hours to be added
|
|
86
|
+
* @param options - An object with options
|
|
87
|
+
*
|
|
88
|
+
* @returns The new date with the hours added
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* // Add 2 hours to 10 July 2014 23:00:00:
|
|
92
|
+
* const result = addHours(new Date(2014, 6, 10, 23, 0), 2)
|
|
93
|
+
* //=> Fri Jul 11 2014 01:00:00
|
|
94
|
+
*/
|
|
95
|
+
function addHours(date, amount, options) {
|
|
96
|
+
return addMilliseconds(date, amount * millisecondsInHour, options);
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region node_modules/date-fns/differenceInDays.js
|
|
100
|
+
/**
|
|
101
|
+
* The {@link differenceInDays} function options.
|
|
102
|
+
*/
|
|
103
|
+
/**
|
|
104
|
+
* @name differenceInDays
|
|
105
|
+
* @category Day Helpers
|
|
106
|
+
* @summary Get the number of full days between the given dates.
|
|
107
|
+
*
|
|
108
|
+
* @description
|
|
109
|
+
* Get the number of full day periods between two dates. Fractional days are
|
|
110
|
+
* truncated towards zero.
|
|
111
|
+
*
|
|
112
|
+
* One "full day" is the distance between a local time in one day to the same
|
|
113
|
+
* local time on the next or previous day. A full day can sometimes be less than
|
|
114
|
+
* or more than 24 hours if a daylight savings change happens between two dates.
|
|
115
|
+
*
|
|
116
|
+
* To ignore DST and only measure exact 24-hour periods, use this instead:
|
|
117
|
+
* `Math.trunc(differenceInHours(dateLeft, dateRight)/24)|0`.
|
|
118
|
+
*
|
|
119
|
+
* @param laterDate - The later date
|
|
120
|
+
* @param earlierDate - The earlier date
|
|
121
|
+
* @param options - An object with options
|
|
122
|
+
*
|
|
123
|
+
* @returns The number of full days according to the local timezone
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* // How many full days are between
|
|
127
|
+
* // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?
|
|
128
|
+
* const result = differenceInDays(
|
|
129
|
+
* new Date(2012, 6, 2, 0, 0),
|
|
130
|
+
* new Date(2011, 6, 2, 23, 0)
|
|
131
|
+
* )
|
|
132
|
+
* //=> 365
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* // How many full days are between
|
|
136
|
+
* // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?
|
|
137
|
+
* const result = differenceInDays(
|
|
138
|
+
* new Date(2011, 6, 3, 0, 1),
|
|
139
|
+
* new Date(2011, 6, 2, 23, 59)
|
|
140
|
+
* )
|
|
141
|
+
* //=> 0
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* // How many full days are between
|
|
145
|
+
* // 1 March 2020 0:00 and 1 June 2020 0:00 ?
|
|
146
|
+
* // Note: because local time is used, the
|
|
147
|
+
* // result will always be 92 days, even in
|
|
148
|
+
* // time zones where DST starts and the
|
|
149
|
+
* // period has only 92*24-1 hours.
|
|
150
|
+
* const result = differenceInDays(
|
|
151
|
+
* new Date(2020, 5, 1),
|
|
152
|
+
* new Date(2020, 2, 1)
|
|
153
|
+
* )
|
|
154
|
+
* //=> 92
|
|
155
|
+
*/
|
|
156
|
+
function differenceInDays(laterDate, earlierDate, options) {
|
|
157
|
+
const [laterDate_, earlierDate_] = normalizeDates(options?.in, laterDate, earlierDate);
|
|
158
|
+
const sign = compareLocalAsc(laterDate_, earlierDate_);
|
|
159
|
+
const difference = Math.abs(differenceInCalendarDays(laterDate_, earlierDate_));
|
|
160
|
+
laterDate_.setDate(laterDate_.getDate() - sign * difference);
|
|
161
|
+
const result = sign * (difference - Number(compareLocalAsc(laterDate_, earlierDate_) === -sign));
|
|
162
|
+
return result === 0 ? 0 : result;
|
|
163
|
+
}
|
|
164
|
+
function compareLocalAsc(laterDate, earlierDate) {
|
|
165
|
+
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();
|
|
166
|
+
if (diff < 0) return -1;
|
|
167
|
+
if (diff > 0) return 1;
|
|
168
|
+
return diff;
|
|
169
|
+
}
|
|
170
|
+
//#endregion
|
|
171
|
+
//#region node_modules/date-fns/differenceInHours.js
|
|
172
|
+
/**
|
|
173
|
+
* The {@link differenceInHours} function options.
|
|
174
|
+
*/
|
|
175
|
+
/**
|
|
176
|
+
* @name differenceInHours
|
|
177
|
+
* @category Hour Helpers
|
|
178
|
+
* @summary Get the number of hours between the given dates.
|
|
179
|
+
*
|
|
180
|
+
* @description
|
|
181
|
+
* Get the number of hours between the given dates.
|
|
182
|
+
*
|
|
183
|
+
* @param laterDate - The later date
|
|
184
|
+
* @param earlierDate - The earlier date
|
|
185
|
+
* @param options - An object with options.
|
|
186
|
+
*
|
|
187
|
+
* @returns The number of hours
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00?
|
|
191
|
+
* const result = differenceInHours(
|
|
192
|
+
* new Date(2014, 6, 2, 19, 0),
|
|
193
|
+
* new Date(2014, 6, 2, 6, 50)
|
|
194
|
+
* )
|
|
195
|
+
* //=> 12
|
|
196
|
+
*/
|
|
197
|
+
function differenceInHours(laterDate, earlierDate, options) {
|
|
198
|
+
const [laterDate_, earlierDate_] = normalizeDates(options?.in, laterDate, earlierDate);
|
|
199
|
+
const diff = (+laterDate_ - +earlierDate_) / millisecondsInHour;
|
|
200
|
+
return getRoundingMethod(options?.roundingMethod)(diff);
|
|
201
|
+
}
|
|
202
|
+
//#endregion
|
|
203
|
+
//#region node_modules/date-fns/subDays.js
|
|
204
|
+
/**
|
|
205
|
+
* The {@link subDays} function options.
|
|
206
|
+
*/
|
|
207
|
+
/**
|
|
208
|
+
* @name subDays
|
|
209
|
+
* @category Day Helpers
|
|
210
|
+
* @summary Subtract the specified number of days from the given date.
|
|
211
|
+
*
|
|
212
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
213
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
214
|
+
*
|
|
215
|
+
* @param date - The date to be changed
|
|
216
|
+
* @param amount - The amount of days to be subtracted.
|
|
217
|
+
* @param options - An object with options
|
|
218
|
+
*
|
|
219
|
+
* @returns The new date with the days subtracted
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* // Subtract 10 days from 1 September 2014:
|
|
223
|
+
* const result = subDays(new Date(2014, 8, 1), 10)
|
|
224
|
+
* //=> Fri Aug 22 2014 00:00:00
|
|
225
|
+
*/
|
|
226
|
+
function subDays(date, amount, options) {
|
|
227
|
+
return addDays(date, -amount, options);
|
|
228
|
+
}
|
|
229
|
+
//#endregion
|
|
230
|
+
//#region node_modules/date-fns/parseISO.js
|
|
231
|
+
/**
|
|
232
|
+
* The {@link parseISO} function options.
|
|
233
|
+
*/
|
|
234
|
+
/**
|
|
235
|
+
* @name parseISO
|
|
236
|
+
* @category Common Helpers
|
|
237
|
+
* @summary Parse ISO string
|
|
238
|
+
*
|
|
239
|
+
* @description
|
|
240
|
+
* Parse the given string in ISO 8601 format and return an instance of Date.
|
|
241
|
+
*
|
|
242
|
+
* Function accepts complete ISO 8601 formats as well as partial implementations.
|
|
243
|
+
* ISO 8601: http://en.wikipedia.org/wiki/ISO_8601
|
|
244
|
+
*
|
|
245
|
+
* If the argument isn't a string, the function cannot parse the string or
|
|
246
|
+
* the values are invalid, it returns Invalid Date.
|
|
247
|
+
*
|
|
248
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
249
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
250
|
+
*
|
|
251
|
+
* @param argument - The value to convert
|
|
252
|
+
* @param options - An object with options
|
|
253
|
+
*
|
|
254
|
+
* @returns The parsed date in the local time zone
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* // Convert string '2014-02-11T11:30:30' to date:
|
|
258
|
+
* const result = parseISO('2014-02-11T11:30:30')
|
|
259
|
+
* //=> Tue Feb 11 2014 11:30:30
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* // Convert string '+02014101' to date,
|
|
263
|
+
* // if the additional number of digits in the extended year format is 1:
|
|
264
|
+
* const result = parseISO('+02014101', { additionalDigits: 1 })
|
|
265
|
+
* //=> Fri Apr 11 2014 00:00:00
|
|
266
|
+
*/
|
|
267
|
+
function parseISO(argument, options) {
|
|
268
|
+
const invalidDate = () => constructFrom(options?.in, NaN);
|
|
269
|
+
const additionalDigits = options?.additionalDigits ?? 2;
|
|
270
|
+
const dateStrings = splitDateString(argument);
|
|
271
|
+
let date;
|
|
272
|
+
if (dateStrings.date) {
|
|
273
|
+
const parseYearResult = parseYear(dateStrings.date, additionalDigits);
|
|
274
|
+
date = parseDate(parseYearResult.restDateString, parseYearResult.year);
|
|
275
|
+
}
|
|
276
|
+
if (!date || isNaN(+date)) return invalidDate();
|
|
277
|
+
const timestamp = +date;
|
|
278
|
+
let time = 0;
|
|
279
|
+
let offset;
|
|
280
|
+
if (dateStrings.time) {
|
|
281
|
+
time = parseTime(dateStrings.time);
|
|
282
|
+
if (isNaN(time)) return invalidDate();
|
|
283
|
+
}
|
|
284
|
+
if (dateStrings.timezone) {
|
|
285
|
+
offset = parseTimezone(dateStrings.timezone);
|
|
286
|
+
if (isNaN(offset)) return invalidDate();
|
|
287
|
+
} else {
|
|
288
|
+
const tmpDate = new Date(timestamp + time);
|
|
289
|
+
const result = toDate(0, options?.in);
|
|
290
|
+
result.setFullYear(tmpDate.getUTCFullYear(), tmpDate.getUTCMonth(), tmpDate.getUTCDate());
|
|
291
|
+
result.setHours(tmpDate.getUTCHours(), tmpDate.getUTCMinutes(), tmpDate.getUTCSeconds(), tmpDate.getUTCMilliseconds());
|
|
292
|
+
return result;
|
|
293
|
+
}
|
|
294
|
+
return toDate(timestamp + time + offset, options?.in);
|
|
295
|
+
}
|
|
296
|
+
var patterns = {
|
|
297
|
+
dateTimeDelimiter: /[T ]/,
|
|
298
|
+
timeZoneDelimiter: /[Z ]/i,
|
|
299
|
+
timezone: /([Z+-].*)$/
|
|
300
|
+
};
|
|
301
|
+
var dateRegex = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/;
|
|
302
|
+
var timeRegex = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/;
|
|
303
|
+
var timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/;
|
|
304
|
+
function splitDateString(dateString) {
|
|
305
|
+
const dateStrings = {};
|
|
306
|
+
const array = dateString.split(patterns.dateTimeDelimiter);
|
|
307
|
+
let timeString;
|
|
308
|
+
if (array.length > 2) return dateStrings;
|
|
309
|
+
if (/:/.test(array[0])) timeString = array[0];
|
|
310
|
+
else {
|
|
311
|
+
dateStrings.date = array[0];
|
|
312
|
+
timeString = array[1];
|
|
313
|
+
if (patterns.timeZoneDelimiter.test(dateStrings.date)) {
|
|
314
|
+
dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];
|
|
315
|
+
timeString = dateString.substr(dateStrings.date.length, dateString.length);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (timeString) {
|
|
319
|
+
const token = patterns.timezone.exec(timeString);
|
|
320
|
+
if (token) {
|
|
321
|
+
dateStrings.time = timeString.replace(token[1], "");
|
|
322
|
+
dateStrings.timezone = token[1];
|
|
323
|
+
} else dateStrings.time = timeString;
|
|
324
|
+
}
|
|
325
|
+
return dateStrings;
|
|
326
|
+
}
|
|
327
|
+
function parseYear(dateString, additionalDigits) {
|
|
328
|
+
const regex = new RegExp("^(?:(\\d{4}|[+-]\\d{" + (4 + additionalDigits) + "})|(\\d{2}|[+-]\\d{" + (2 + additionalDigits) + "})$)");
|
|
329
|
+
const captures = dateString.match(regex);
|
|
330
|
+
if (!captures) return {
|
|
331
|
+
year: NaN,
|
|
332
|
+
restDateString: ""
|
|
333
|
+
};
|
|
334
|
+
const year = captures[1] ? parseInt(captures[1]) : null;
|
|
335
|
+
const century = captures[2] ? parseInt(captures[2]) : null;
|
|
336
|
+
return {
|
|
337
|
+
year: century === null ? year : century * 100,
|
|
338
|
+
restDateString: dateString.slice((captures[1] || captures[2]).length)
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function parseDate(dateString, year) {
|
|
342
|
+
if (year === null) return /* @__PURE__ */ new Date(NaN);
|
|
343
|
+
const captures = dateString.match(dateRegex);
|
|
344
|
+
if (!captures) return /* @__PURE__ */ new Date(NaN);
|
|
345
|
+
const isWeekDate = !!captures[4];
|
|
346
|
+
const dayOfYear = parseDateUnit(captures[1]);
|
|
347
|
+
const month = parseDateUnit(captures[2]) - 1;
|
|
348
|
+
const day = parseDateUnit(captures[3]);
|
|
349
|
+
const week = parseDateUnit(captures[4]);
|
|
350
|
+
const dayOfWeek = parseDateUnit(captures[5]) - 1;
|
|
351
|
+
if (isWeekDate) {
|
|
352
|
+
if (!validateWeekDate(year, week, dayOfWeek)) return /* @__PURE__ */ new Date(NaN);
|
|
353
|
+
return dayOfISOWeekYear(year, week, dayOfWeek);
|
|
354
|
+
} else {
|
|
355
|
+
const date = /* @__PURE__ */ new Date(0);
|
|
356
|
+
if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) return /* @__PURE__ */ new Date(NaN);
|
|
357
|
+
date.setUTCFullYear(year, month, Math.max(dayOfYear, day));
|
|
358
|
+
return date;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
function parseDateUnit(value) {
|
|
362
|
+
return value ? parseInt(value) : 1;
|
|
363
|
+
}
|
|
364
|
+
function parseTime(timeString) {
|
|
365
|
+
const captures = timeString.match(timeRegex);
|
|
366
|
+
if (!captures) return NaN;
|
|
367
|
+
const hours = parseTimeUnit(captures[1]);
|
|
368
|
+
const minutes = parseTimeUnit(captures[2]);
|
|
369
|
+
const seconds = parseTimeUnit(captures[3]);
|
|
370
|
+
if (!validateTime(hours, minutes, seconds)) return NaN;
|
|
371
|
+
return hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1e3;
|
|
372
|
+
}
|
|
373
|
+
function parseTimeUnit(value) {
|
|
374
|
+
return value && parseFloat(value.replace(",", ".")) || 0;
|
|
375
|
+
}
|
|
376
|
+
function parseTimezone(timezoneString) {
|
|
377
|
+
if (timezoneString === "Z") return 0;
|
|
378
|
+
const captures = timezoneString.match(timezoneRegex);
|
|
379
|
+
if (!captures) return 0;
|
|
380
|
+
const sign = captures[1] === "+" ? -1 : 1;
|
|
381
|
+
const hours = parseInt(captures[2]);
|
|
382
|
+
const minutes = captures[3] && parseInt(captures[3]) || 0;
|
|
383
|
+
if (!validateTimezone(hours, minutes)) return NaN;
|
|
384
|
+
return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);
|
|
385
|
+
}
|
|
386
|
+
function dayOfISOWeekYear(isoWeekYear, week, day) {
|
|
387
|
+
const date = /* @__PURE__ */ new Date(0);
|
|
388
|
+
date.setUTCFullYear(isoWeekYear, 0, 4);
|
|
389
|
+
const fourthOfJanuaryDay = date.getUTCDay() || 7;
|
|
390
|
+
const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;
|
|
391
|
+
date.setUTCDate(date.getUTCDate() + diff);
|
|
392
|
+
return date;
|
|
393
|
+
}
|
|
394
|
+
var daysInMonths = [
|
|
395
|
+
31,
|
|
396
|
+
null,
|
|
397
|
+
31,
|
|
398
|
+
30,
|
|
399
|
+
31,
|
|
400
|
+
30,
|
|
401
|
+
31,
|
|
402
|
+
31,
|
|
403
|
+
30,
|
|
404
|
+
31,
|
|
405
|
+
30,
|
|
406
|
+
31
|
|
407
|
+
];
|
|
408
|
+
function isLeapYearIndex(year) {
|
|
409
|
+
return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;
|
|
410
|
+
}
|
|
411
|
+
function validateDate(year, month, date) {
|
|
412
|
+
return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28));
|
|
413
|
+
}
|
|
414
|
+
function validateDayOfYearDate(year, dayOfYear) {
|
|
415
|
+
return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);
|
|
416
|
+
}
|
|
417
|
+
function validateWeekDate(_year, week, day) {
|
|
418
|
+
return week >= 1 && week <= 53 && day >= 0 && day <= 6;
|
|
419
|
+
}
|
|
420
|
+
function validateTime(hours, minutes, seconds) {
|
|
421
|
+
if (hours === 24) return minutes === 0 && seconds === 0;
|
|
422
|
+
return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25;
|
|
423
|
+
}
|
|
424
|
+
function validateTimezone(_hours, minutes) {
|
|
425
|
+
return minutes >= 0 && minutes <= 59;
|
|
426
|
+
}
|
|
427
|
+
//#endregion
|
|
428
|
+
//#region node_modules/date-fns/subHours.js
|
|
429
|
+
/**
|
|
430
|
+
* The {@link subHours} function options.
|
|
431
|
+
*/
|
|
432
|
+
/**
|
|
433
|
+
* @name subHours
|
|
434
|
+
* @category Hour Helpers
|
|
435
|
+
* @summary Subtract the specified number of hours from the given date.
|
|
436
|
+
*
|
|
437
|
+
* @description
|
|
438
|
+
* Subtract the specified number of hours from the given date.
|
|
439
|
+
*
|
|
440
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
441
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
442
|
+
*
|
|
443
|
+
* @param date - The date to be changed
|
|
444
|
+
* @param amount - The amount of hours to be subtracted.
|
|
445
|
+
* @param options - The options
|
|
446
|
+
*
|
|
447
|
+
* @returns The new date with the hours subtracted
|
|
448
|
+
*
|
|
449
|
+
* @example
|
|
450
|
+
* // Subtract 2 hours from 11 July 2014 01:00:00:
|
|
451
|
+
* const result = subHours(new Date(2014, 6, 11, 1, 0), 2)
|
|
452
|
+
* //=> Thu Jul 10 2014 23:00:00
|
|
453
|
+
*/
|
|
454
|
+
function subHours(date, amount, options) {
|
|
455
|
+
return addHours(date, -amount, options);
|
|
456
|
+
}
|
|
457
|
+
//#endregion
|
|
458
|
+
//#region src/elements-experimental/core/datetime/date-helper.ts
|
|
459
|
+
/**
|
|
460
|
+
* This function removes the offset of a ISO date string. This needs to be done to make sure that the offset is ignored.
|
|
461
|
+
* If it is not removed the time would be converted to the browsers local time.
|
|
462
|
+
* Example: "2022-08-29T09:30:00+03:00" would be changed to "2022-08-29T08:30:00+02:00" --> not the desired outcome, as we want to use the time in the timezone and not the local time.
|
|
463
|
+
*
|
|
464
|
+
* After the offset is removed a new date is created in the browsers local time. This ensures that the time of the ISO date string is displayed and not a converted time.
|
|
465
|
+
* Example: "2022-08-29T09:30:00+03:00" would be changed to "2022-08-29T09:30:00+02:00" --> desired outcome
|
|
466
|
+
* Attention: This function does not convert the time to the correct time in the local timezone. It is a workaround to make sure, that the given time is displayed without being converted.
|
|
467
|
+
*
|
|
468
|
+
* Offset: Difference between the timezone and Coordinated Universal Time.
|
|
469
|
+
*
|
|
470
|
+
* @param isoTime - the iso time with the timezone offset
|
|
471
|
+
* @returns a new date with the local timezone with the local offset
|
|
472
|
+
*/
|
|
473
|
+
function removeTimezoneFromISOTimeString(isoTime) {
|
|
474
|
+
if (!isoTime) return;
|
|
475
|
+
if (!isValid(parseISO(isoTime))) return;
|
|
476
|
+
if (isoTime.includes("Z")) return new Date(isoTime.replace("Z", ""));
|
|
477
|
+
if (isoTime.includes("T")) {
|
|
478
|
+
const dateTime = isoTime.split("T");
|
|
479
|
+
if (dateTime[1] && (dateTime[1].includes("+") || dateTime[1].includes("-"))) return /* @__PURE__ */ new Date(`${dateTime[0]}T${dateTime[1].split(/[+-]/)[0]}`);
|
|
480
|
+
}
|
|
481
|
+
return new Date(isoTime);
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* This function converts a duration number to date string with specific format
|
|
485
|
+
*
|
|
486
|
+
* @param duration - duration in minutes
|
|
487
|
+
* @param currentLanguage - currentLanguage
|
|
488
|
+
* @returns an Object with two strings in the format "dd hh mm" (short) an "x Day(s) x Hour(s) x Minute(s) (long)"
|
|
489
|
+
* */
|
|
490
|
+
var durationToTime = (duration, currentLanguage) => {
|
|
491
|
+
const short = [];
|
|
492
|
+
const long = [];
|
|
493
|
+
const now = 0;
|
|
494
|
+
let future = addMinutes(now, duration);
|
|
495
|
+
const days = differenceInDays(future, now);
|
|
496
|
+
if (days > 0) {
|
|
497
|
+
short.push(`${days} d`);
|
|
498
|
+
if (currentLanguage) long.push(`${days} ${days > 1 ? i18nDurationDay.multiple.long[currentLanguage] : i18nDurationDay.single.long[currentLanguage]}`);
|
|
499
|
+
future = subDays(future, days);
|
|
500
|
+
}
|
|
501
|
+
const hours = differenceInHours(future, now);
|
|
502
|
+
if (hours > 0) {
|
|
503
|
+
short.push(`${hours} h`);
|
|
504
|
+
if (currentLanguage) long.push(`${hours} ${hours > 1 ? i18nDurationHour.multiple.long[currentLanguage] : i18nDurationHour.single.long[currentLanguage]}`);
|
|
505
|
+
future = subHours(future, hours);
|
|
506
|
+
}
|
|
507
|
+
const minutes = differenceInMinutes(future, now);
|
|
508
|
+
if (minutes > 0) {
|
|
509
|
+
short.push(`${minutes} min`);
|
|
510
|
+
if (currentLanguage) long.push(`${minutes} ${minutes > 1 ? i18nDurationMinute.multiple.long[currentLanguage] : i18nDurationMinute.single.long[currentLanguage]}`);
|
|
511
|
+
}
|
|
512
|
+
return {
|
|
513
|
+
short: short.join(" "),
|
|
514
|
+
long: long.join(" ")
|
|
515
|
+
};
|
|
516
|
+
};
|
|
517
|
+
//#endregion
|
|
518
|
+
export { removeTimezoneFromISOTimeString as n, durationToTime as t };
|
|
519
|
+
|
|
520
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1oZWxwZXItOF9ZLVB1SGguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZERheXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWlsbGlzZWNvbmRzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZEhvdXJzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkRheXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluSG91cnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViRGF5cy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUlTTy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJIb3Vycy5qcyIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvY29yZS9kYXRldGltZS9kYXRlLWhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBhZGREYXlzfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgYWRkRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGRheXMgdG8gYmUgYWRkZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5cyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMTAgZGF5cyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IFRodSBTZXAgMTEgMjAxNCAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGF5cyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTtcblxuICAvLyBJZiAwIGRheXMsIG5vLW9wIHRvIGF2b2lkIGNoYW5naW5nIHRpbWVzIGluIHRoZSBob3VyIGJlZm9yZSBlbmQgb2YgRFNUXG4gIGlmICghYW1vdW50KSByZXR1cm4gX2RhdGU7XG5cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBhbW91bnQpO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgYWRkRGF5cztcbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGFkZE1pbGxpc2Vjb25kc30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGFkZE1pbGxpc2Vjb25kc1xuICogQGNhdGVnb3J5IE1pbGxpc2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBiZSBhZGRlZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0XG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1pbGxpc2Vjb25kcyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNzUwIG1pbGxpc2Vjb25kcyB0byAxMCBKdWx5IDIwMTQgMTI6NDU6MzAuMDAwOlxuICogY29uc3QgcmVzdWx0ID0gYWRkTWlsbGlzZWNvbmRzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAxMiwgNDUsIDMwLCAwKSwgNzUwKVxuICogLy89PiBUaHUgSnVsIDEwIDIwMTQgMTI6NDU6MzAuNzUwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7XG4gIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsICt0b0RhdGUoZGF0ZSkgKyBhbW91bnQpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGFkZE1pbGxpc2Vjb25kcztcbiIsImltcG9ydCB7IGFkZE1pbGxpc2Vjb25kcyB9IGZyb20gXCIuL2FkZE1pbGxpc2Vjb25kcy5qc1wiO1xuaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5Ib3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBhZGRIb3Vyc30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGFkZEhvdXJzXG4gKiBAY2F0ZWdvcnkgSG91ciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaG91cnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaG91cnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgaG91cnMgdG8gYmUgYWRkZWRcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBob3VycyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMiBob3VycyB0byAxMCBKdWx5IDIwMTQgMjM6MDA6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRIb3VycyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMjMsIDApLCAyKVxuICogLy89PiBGcmkgSnVsIDExIDIwMTQgMDE6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEhvdXJzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykge1xuICByZXR1cm4gYWRkTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCAqIG1pbGxpc2Vjb25kc0luSG91ciwgb3B0aW9ucyk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgYWRkSG91cnM7XG4iLCJpbXBvcnQgeyBub3JtYWxpemVEYXRlcyB9IGZyb20gXCIuL19saWIvbm9ybWFsaXplRGF0ZXMuanNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyB9IGZyb20gXCIuL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cy5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZGlmZmVyZW5jZUluRGF5c30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgZnVsbCBkYXlzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgZnVsbCBkYXkgcGVyaW9kcyBiZXR3ZWVuIHR3byBkYXRlcy4gRnJhY3Rpb25hbCBkYXlzIGFyZVxuICogdHJ1bmNhdGVkIHRvd2FyZHMgemVyby5cbiAqXG4gKiBPbmUgXCJmdWxsIGRheVwiIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGEgbG9jYWwgdGltZSBpbiBvbmUgZGF5IHRvIHRoZSBzYW1lXG4gKiBsb2NhbCB0aW1lIG9uIHRoZSBuZXh0IG9yIHByZXZpb3VzIGRheS4gQSBmdWxsIGRheSBjYW4gc29tZXRpbWVzIGJlIGxlc3MgdGhhblxuICogb3IgbW9yZSB0aGFuIDI0IGhvdXJzIGlmIGEgZGF5bGlnaHQgc2F2aW5ncyBjaGFuZ2UgaGFwcGVucyBiZXR3ZWVuIHR3byBkYXRlcy5cbiAqXG4gKiBUbyBpZ25vcmUgRFNUIGFuZCBvbmx5IG1lYXN1cmUgZXhhY3QgMjQtaG91ciBwZXJpb2RzLCB1c2UgdGhpcyBpbnN0ZWFkOlxuICogYE1hdGgudHJ1bmMoZGlmZmVyZW5jZUluSG91cnMoZGF0ZUxlZnQsIGRhdGVSaWdodCkvMjQpfDBgLlxuICpcbiAqIEBwYXJhbSBsYXRlckRhdGUgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGVhcmxpZXJEYXRlIC0gVGhlIGVhcmxpZXIgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBmdWxsIGRheXMgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCB0aW1lem9uZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBmdWxsIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjAwOjAwIGFuZCAyIEp1bHkgMjAxMiAwMDowMDowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkRheXMoXG4gKiAgIG5ldyBEYXRlKDIwMTIsIDYsIDIsIDAsIDApLFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAyLCAyMywgMClcbiAqIClcbiAqIC8vPT4gMzY1XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGZ1bGwgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6NTk6MDAgYW5kIDMgSnVseSAyMDExIDAwOjAxOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMywgMCwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCA1OSlcbiAqIClcbiAqIC8vPT4gMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBmdWxsIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDEgTWFyY2ggMjAyMCAwOjAwIGFuZCAxIEp1bmUgMjAyMCAwOjAwID9cbiAqIC8vIE5vdGU6IGJlY2F1c2UgbG9jYWwgdGltZSBpcyB1c2VkLCB0aGVcbiAqIC8vIHJlc3VsdCB3aWxsIGFsd2F5cyBiZSA5MiBkYXlzLCBldmVuIGluXG4gKiAvLyB0aW1lIHpvbmVzIHdoZXJlIERTVCBzdGFydHMgYW5kIHRoZVxuICogLy8gcGVyaW9kIGhhcyBvbmx5IDkyKjI0LTEgaG91cnMuXG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5EYXlzKFxuICogICBuZXcgRGF0ZSgyMDIwLCA1LCAxKSxcbiAqICAgbmV3IERhdGUoMjAyMCwgMiwgMSlcbiAqIClcbiAqIC8vPT4gOTJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJbkRheXMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKFxuICAgIG9wdGlvbnM/LmluLFxuICAgIGxhdGVyRGF0ZSxcbiAgICBlYXJsaWVyRGF0ZSxcbiAgKTtcblxuICBjb25zdCBzaWduID0gY29tcGFyZUxvY2FsQXNjKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7XG4gIGNvbnN0IGRpZmZlcmVuY2UgPSBNYXRoLmFicyhcbiAgICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSxcbiAgKTtcblxuICBsYXRlckRhdGVfLnNldERhdGUobGF0ZXJEYXRlXy5nZXREYXRlKCkgLSBzaWduICogZGlmZmVyZW5jZSk7XG5cbiAgLy8gTWF0aC5hYnMoZGlmZiBpbiBmdWxsIGRheXMgLSBkaWZmIGluIGNhbGVuZGFyIGRheXMpID09PSAxIGlmIGxhc3QgY2FsZW5kYXIgZGF5IGlzIG5vdCBmdWxsXG4gIC8vIElmIHNvLCByZXN1bHQgbXVzdCBiZSBkZWNyZWFzZWQgYnkgMSBpbiBhYnNvbHV0ZSB2YWx1ZVxuICBjb25zdCBpc0xhc3REYXlOb3RGdWxsID0gTnVtYmVyKFxuICAgIGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pID09PSAtc2lnbixcbiAgKTtcblxuICBjb25zdCByZXN1bHQgPSBzaWduICogKGRpZmZlcmVuY2UgLSBpc0xhc3REYXlOb3RGdWxsKTtcbiAgLy8gUHJldmVudCBuZWdhdGl2ZSB6ZXJvXG4gIHJldHVybiByZXN1bHQgPT09IDAgPyAwIDogcmVzdWx0O1xufVxuXG4vLyBMaWtlIGBjb21wYXJlQXNjYCBidXQgdXNlcyBsb2NhbCB0aW1lIG5vdCBVVEMsIHdoaWNoIGlzIG5lZWRlZFxuLy8gZm9yIGFjY3VyYXRlIGVxdWFsaXR5IGNvbXBhcmlzb25zIG9mIFVUQyB0aW1lc3RhbXBzIHRoYXQgZW5kIHVwXG4vLyBoYXZpbmcgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gaW4gbG9jYWwgdGltZSwgZS5nLiBvbmUgaG91ciBiZWZvcmVcbi8vIERTVCBlbmRzIHZzLiB0aGUgaW5zdGFudCB0aGF0IERTVCBlbmRzLlxuZnVuY3Rpb24gY29tcGFyZUxvY2FsQXNjKGxhdGVyRGF0ZSwgZWFybGllckRhdGUpIHtcbiAgY29uc3QgZGlmZiA9XG4gICAgbGF0ZXJEYXRlLmdldEZ1bGxZZWFyKCkgLSBlYXJsaWVyRGF0ZS5nZXRGdWxsWWVhcigpIHx8XG4gICAgbGF0ZXJEYXRlLmdldE1vbnRoKCkgLSBlYXJsaWVyRGF0ZS5nZXRNb250aCgpIHx8XG4gICAgbGF0ZXJEYXRlLmdldERhdGUoKSAtIGVhcmxpZXJEYXRlLmdldERhdGUoKSB8fFxuICAgIGxhdGVyRGF0ZS5nZXRIb3VycygpIC0gZWFybGllckRhdGUuZ2V0SG91cnMoKSB8fFxuICAgIGxhdGVyRGF0ZS5nZXRNaW51dGVzKCkgLSBlYXJsaWVyRGF0ZS5nZXRNaW51dGVzKCkgfHxcbiAgICBsYXRlckRhdGUuZ2V0U2Vjb25kcygpIC0gZWFybGllckRhdGUuZ2V0U2Vjb25kcygpIHx8XG4gICAgbGF0ZXJEYXRlLmdldE1pbGxpc2Vjb25kcygpIC0gZWFybGllckRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG5cbiAgaWYgKGRpZmYgPCAwKSByZXR1cm4gLTE7XG4gIGlmIChkaWZmID4gMCkgcmV0dXJuIDE7XG5cbiAgLy8gUmV0dXJuIDAgaWYgZGlmZiBpcyAwOyByZXR1cm4gTmFOIGlmIGRpZmYgaXMgTmFOXG4gIHJldHVybiBkaWZmO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2VJbkRheXM7XG4iLCJpbXBvcnQgeyBnZXRSb3VuZGluZ01ldGhvZCB9IGZyb20gXCIuL19saWIvZ2V0Um91bmRpbmdNZXRob2QuanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vX2xpYi9ub3JtYWxpemVEYXRlcy5qc1wiO1xuaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5Ib3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBkaWZmZXJlbmNlSW5Ib3Vyc30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkhvdXJzXG4gKiBAY2F0ZWdvcnkgSG91ciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBob3VycyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGhvdXJzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBwYXJhbSBsYXRlckRhdGUgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGVhcmxpZXJEYXRlIC0gVGhlIGVhcmxpZXIgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgaG91cnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgaG91cnMgYXJlIGJldHdlZW4gMiBKdWx5IDIwMTQgMDY6NTA6MDAgYW5kIDIgSnVseSAyMDE0IDE5OjAwOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluSG91cnMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIsIDE5LCAwKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgNiwgNTApXG4gKiApXG4gKiAvLz0+IDEyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXJlbmNlSW5Ib3VycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoXG4gICAgb3B0aW9ucz8uaW4sXG4gICAgbGF0ZXJEYXRlLFxuICAgIGVhcmxpZXJEYXRlLFxuICApO1xuICBjb25zdCBkaWZmID0gKCtsYXRlckRhdGVfIC0gK2VhcmxpZXJEYXRlXykgLyBtaWxsaXNlY29uZHNJbkhvdXI7XG4gIHJldHVybiBnZXRSb3VuZGluZ01ldGhvZChvcHRpb25zPy5yb3VuZGluZ01ldGhvZCkoZGlmZik7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZUluSG91cnM7XG4iLCJpbXBvcnQgeyBhZGREYXlzIH0gZnJvbSBcIi4vYWRkRGF5cy5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3ViRGF5c30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN1YkRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGRheXMgdG8gYmUgc3VidHJhY3RlZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXlzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgMTAgZGF5cyBmcm9tIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJEYXlzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAxMClcbiAqIC8vPT4gRnJpIEF1ZyAyMiAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJEYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykge1xuICByZXR1cm4gYWRkRGF5cyhkYXRlLCAtYW1vdW50LCBvcHRpb25zKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdWJEYXlzO1xuIiwiaW1wb3J0IHtcbiAgbWlsbGlzZWNvbmRzSW5Ib3VyLFxuICBtaWxsaXNlY29uZHNJbk1pbnV0ZSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5pbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBwYXJzZUlTT30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHBhcnNlSVNPXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFBhcnNlIElTTyBzdHJpbmdcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFBhcnNlIHRoZSBnaXZlbiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0IGFuZCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBGdW5jdGlvbiBhY2NlcHRzIGNvbXBsZXRlIElTTyA4NjAxIGZvcm1hdHMgYXMgd2VsbCBhcyBwYXJ0aWFsIGltcGxlbWVudGF0aW9ucy5cbiAqIElTTyA4NjAxOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzbid0IGEgc3RyaW5nLCB0aGUgZnVuY3Rpb24gY2Fubm90IHBhcnNlIHRoZSBzdHJpbmcgb3JcbiAqIHRoZSB2YWx1ZXMgYXJlIGludmFsaWQsIGl0IHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBzdHJpbmcgJzIwMTQtMDItMTFUMTE6MzA6MzAnIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZUlTTygnMjAxNC0wMi0xMVQxMTozMDozMCcpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHN0cmluZyAnKzAyMDE0MTAxJyB0byBkYXRlLFxuICogLy8gaWYgdGhlIGFkZGl0aW9uYWwgbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgZXh0ZW5kZWQgeWVhciBmb3JtYXQgaXMgMTpcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlSVNPKCcrMDIwMTQxMDEnLCB7IGFkZGl0aW9uYWxEaWdpdHM6IDEgfSlcbiAqIC8vPT4gRnJpIEFwciAxMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlTTyhhcmd1bWVudCwgb3B0aW9ucykge1xuICBjb25zdCBpbnZhbGlkRGF0ZSA9ICgpID0+IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4sIE5hTik7XG5cbiAgY29uc3QgYWRkaXRpb25hbERpZ2l0cyA9IG9wdGlvbnM/LmFkZGl0aW9uYWxEaWdpdHMgPz8gMjtcbiAgY29uc3QgZGF0ZVN0cmluZ3MgPSBzcGxpdERhdGVTdHJpbmcoYXJndW1lbnQpO1xuXG4gIGxldCBkYXRlO1xuICBpZiAoZGF0ZVN0cmluZ3MuZGF0ZSkge1xuICAgIGNvbnN0IHBhcnNlWWVhclJlc3VsdCA9IHBhcnNlWWVhcihkYXRlU3RyaW5ncy5kYXRlLCBhZGRpdGlvbmFsRGlnaXRzKTtcbiAgICBkYXRlID0gcGFyc2VEYXRlKHBhcnNlWWVhclJlc3VsdC5yZXN0RGF0ZVN0cmluZywgcGFyc2VZZWFyUmVzdWx0LnllYXIpO1xuICB9XG5cbiAgaWYgKCFkYXRlIHx8IGlzTmFOKCtkYXRlKSkgcmV0dXJuIGludmFsaWREYXRlKCk7XG5cbiAgY29uc3QgdGltZXN0YW1wID0gK2RhdGU7XG4gIGxldCB0aW1lID0gMDtcbiAgbGV0IG9mZnNldDtcblxuICBpZiAoZGF0ZVN0cmluZ3MudGltZSkge1xuICAgIHRpbWUgPSBwYXJzZVRpbWUoZGF0ZVN0cmluZ3MudGltZSk7XG4gICAgaWYgKGlzTmFOKHRpbWUpKSByZXR1cm4gaW52YWxpZERhdGUoKTtcbiAgfVxuXG4gIGlmIChkYXRlU3RyaW5ncy50aW1lem9uZSkge1xuICAgIG9mZnNldCA9IHBhcnNlVGltZXpvbmUoZGF0ZVN0cmluZ3MudGltZXpvbmUpO1xuICAgIGlmIChpc05hTihvZmZzZXQpKSByZXR1cm4gaW52YWxpZERhdGUoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0bXBEYXRlID0gbmV3IERhdGUodGltZXN0YW1wICsgdGltZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdG9EYXRlKDAsIG9wdGlvbnM/LmluKTtcbiAgICByZXN1bHQuc2V0RnVsbFllYXIoXG4gICAgICB0bXBEYXRlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICB0bXBEYXRlLmdldFVUQ01vbnRoKCksXG4gICAgICB0bXBEYXRlLmdldFVUQ0RhdGUoKSxcbiAgICApO1xuICAgIHJlc3VsdC5zZXRIb3VycyhcbiAgICAgIHRtcERhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgIHRtcERhdGUuZ2V0VVRDTWludXRlcygpLFxuICAgICAgdG1wRGF0ZS5nZXRVVENTZWNvbmRzKCksXG4gICAgICB0bXBEYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiB0b0RhdGUodGltZXN0YW1wICsgdGltZSArIG9mZnNldCwgb3B0aW9ucz8uaW4pO1xufVxuXG5jb25zdCBwYXR0ZXJucyA9IHtcbiAgZGF0ZVRpbWVEZWxpbWl0ZXI6IC9bVCBdLyxcbiAgdGltZVpvbmVEZWxpbWl0ZXI6IC9bWiBdL2ksXG4gIHRpbWV6b25lOiAvKFtaKy1dLiopJC8sXG59O1xuXG5jb25zdCBkYXRlUmVnZXggPVxuICAvXi0/KD86KFxcZHszfSl8KFxcZHsyfSkoPzotPyhcXGR7Mn0pKT98VyhcXGR7Mn0pKD86LT8oXFxkezF9KSk/fCkkLztcbmNvbnN0IHRpbWVSZWdleCA9XG4gIC9eKFxcZHsyfSg/OlsuLF1cXGQqKT8pKD86Oj8oXFxkezJ9KD86Wy4sXVxcZCopPykpPyg/Ojo/KFxcZHsyfSg/OlsuLF1cXGQqKT8pKT8kLztcbmNvbnN0IHRpbWV6b25lUmVnZXggPSAvXihbKy1dKShcXGR7Mn0pKD86Oj8oXFxkezJ9KSk/JC87XG5cbmZ1bmN0aW9uIHNwbGl0RGF0ZVN0cmluZyhkYXRlU3RyaW5nKSB7XG4gIGNvbnN0IGRhdGVTdHJpbmdzID0ge307XG4gIGNvbnN0IGFycmF5ID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy5kYXRlVGltZURlbGltaXRlcik7XG4gIGxldCB0aW1lU3RyaW5nO1xuXG4gIC8vIFRoZSByZWdleCBtYXRjaCBzaG91bGQgb25seSByZXR1cm4gYXQgbWF4aW11bSB0d28gYXJyYXkgZWxlbWVudHMuXG4gIC8vIFtkYXRlXSwgW3RpbWVdLCBvciBbZGF0ZSwgdGltZV0uXG4gIGlmIChhcnJheS5sZW5ndGggPiAyKSB7XG4gICAgcmV0dXJuIGRhdGVTdHJpbmdzO1xuICB9XG5cbiAgaWYgKC86Ly50ZXN0KGFycmF5WzBdKSkge1xuICAgIHRpbWVTdHJpbmcgPSBhcnJheVswXTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlU3RyaW5ncy5kYXRlID0gYXJyYXlbMF07XG4gICAgdGltZVN0cmluZyA9IGFycmF5WzFdO1xuICAgIGlmIChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlci50ZXN0KGRhdGVTdHJpbmdzLmRhdGUpKSB7XG4gICAgICBkYXRlU3RyaW5ncy5kYXRlID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlcilbMF07XG4gICAgICB0aW1lU3RyaW5nID0gZGF0ZVN0cmluZy5zdWJzdHIoXG4gICAgICAgIGRhdGVTdHJpbmdzLmRhdGUubGVuZ3RoLFxuICAgICAgICBkYXRlU3RyaW5nLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRpbWVTdHJpbmcpIHtcbiAgICBjb25zdCB0b2tlbiA9IHBhdHRlcm5zLnRpbWV6b25lLmV4ZWModGltZVN0cmluZyk7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lID0gdGltZVN0cmluZy5yZXBsYWNlKHRva2VuWzFdLCBcIlwiKTtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWV6b25lID0gdG9rZW5bMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRlU3RyaW5ncztcbn1cblxuZnVuY3Rpb24gcGFyc2VZZWFyKGRhdGVTdHJpbmcsIGFkZGl0aW9uYWxEaWdpdHMpIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIFwiXig/OihcXFxcZHs0fXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDQgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pfChcXFxcZHsyfXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDIgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pJClcIixcbiAgKTtcblxuICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2gocmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgeWVhclxuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4geyB5ZWFyOiBOYU4sIHJlc3REYXRlU3RyaW5nOiBcIlwiIH07XG5cbiAgY29uc3QgeWVhciA9IGNhcHR1cmVzWzFdID8gcGFyc2VJbnQoY2FwdHVyZXNbMV0pIDogbnVsbDtcbiAgY29uc3QgY2VudHVyeSA9IGNhcHR1cmVzWzJdID8gcGFyc2VJbnQoY2FwdHVyZXNbMl0pIDogbnVsbDtcblxuICAvLyBlaXRoZXIgeWVhciBvciBjZW50dXJ5IGlzIG51bGwsIG5vdCBib3RoXG4gIHJldHVybiB7XG4gICAgeWVhcjogY2VudHVyeSA9PT0gbnVsbCA/IHllYXIgOiBjZW50dXJ5ICogMTAwLFxuICAgIHJlc3REYXRlU3RyaW5nOiBkYXRlU3RyaW5nLnNsaWNlKChjYXB0dXJlc1sxXSB8fCBjYXB0dXJlc1syXSkubGVuZ3RoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlKGRhdGVTdHJpbmcsIHllYXIpIHtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHllYXJcbiAgaWYgKHllYXIgPT09IG51bGwpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGNhcHR1cmVzID0gZGF0ZVN0cmluZy5tYXRjaChkYXRlUmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgc3RyaW5nXG4gIGlmICghY2FwdHVyZXMpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGlzV2Vla0RhdGUgPSAhIWNhcHR1cmVzWzRdO1xuICBjb25zdCBkYXlPZlllYXIgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzFdKTtcbiAgY29uc3QgbW9udGggPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzJdKSAtIDE7XG4gIGNvbnN0IGRheSA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbM10pO1xuICBjb25zdCB3ZWVrID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1s0XSk7XG4gIGNvbnN0IGRheU9mV2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNV0pIC0gMTtcblxuICBpZiAoaXNXZWVrRGF0ZSkge1xuICAgIGlmICghdmFsaWRhdGVXZWVrRGF0ZSh5ZWFyLCB3ZWVrLCBkYXlPZldlZWspKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgcmV0dXJuIGRheU9mSVNPV2Vla1llYXIoeWVhciwgd2VlaywgZGF5T2ZXZWVrKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgaWYgKFxuICAgICAgIXZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSB8fFxuICAgICAgIXZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyLCBtb250aCwgTWF0aC5tYXgoZGF5T2ZZZWFyLCBkYXkpKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZURhdGVVbml0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IHBhcnNlSW50KHZhbHVlKSA6IDE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZSh0aW1lU3RyaW5nKSB7XG4gIGNvbnN0IGNhcHR1cmVzID0gdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gTmFOOyAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgdGltZVxuXG4gIGNvbnN0IGhvdXJzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1sxXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzJdKTtcbiAgY29uc3Qgc2Vjb25kcyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbM10pO1xuXG4gIGlmICghdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGhvdXJzICogbWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlICsgc2Vjb25kcyAqIDEwMDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lVW5pdCh2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHBhcnNlRmxvYXQodmFsdWUucmVwbGFjZShcIixcIiwgXCIuXCIpKSkgfHwgMDtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lem9uZSh0aW1lem9uZVN0cmluZykge1xuICBpZiAodGltZXpvbmVTdHJpbmcgPT09IFwiWlwiKSByZXR1cm4gMDtcblxuICBjb25zdCBjYXB0dXJlcyA9IHRpbWV6b25lU3RyaW5nLm1hdGNoKHRpbWV6b25lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gMDtcblxuICBjb25zdCBzaWduID0gY2FwdHVyZXNbMV0gPT09IFwiK1wiID8gLTEgOiAxO1xuICBjb25zdCBob3VycyA9IHBhcnNlSW50KGNhcHR1cmVzWzJdKTtcbiAgY29uc3QgbWludXRlcyA9IChjYXB0dXJlc1szXSAmJiBwYXJzZUludChjYXB0dXJlc1szXSkpIHx8IDA7XG5cbiAgaWYgKCF2YWxpZGF0ZVRpbWV6b25lKGhvdXJzLCBtaW51dGVzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gc2lnbiAqIChob3VycyAqIG1pbGxpc2Vjb25kc0luSG91ciArIG1pbnV0ZXMgKiBtaWxsaXNlY29uZHNJbk1pbnV0ZSk7XG59XG5cbmZ1bmN0aW9uIGRheU9mSVNPV2Vla1llYXIoaXNvV2Vla1llYXIsIHdlZWssIGRheSkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gIGRhdGUuc2V0VVRDRnVsbFllYXIoaXNvV2Vla1llYXIsIDAsIDQpO1xuICBjb25zdCBmb3VydGhPZkphbnVhcnlEYXkgPSBkYXRlLmdldFVUQ0RheSgpIHx8IDc7XG4gIGNvbnN0IGRpZmYgPSAod2VlayAtIDEpICogNyArIGRheSArIDEgLSBmb3VydGhPZkphbnVhcnlEYXk7XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIGRpZmYpO1xuICByZXR1cm4gZGF0ZTtcbn1cblxuLy8gVmFsaWRhdGlvbiBmdW5jdGlvbnNcblxuLy8gRmVicnVhcnkgaXMgbnVsbCB0byBoYW5kbGUgdGhlIGxlYXAgeWVhciAodXNpbmcgfHwpXG5jb25zdCBkYXlzSW5Nb250aHMgPSBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcblxuZnVuY3Rpb24gaXNMZWFwWWVhckluZGV4KHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0MDAgPT09IDAgfHwgKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURhdGUoeWVhciwgbW9udGgsIGRhdGUpIHtcbiAgcmV0dXJuIChcbiAgICBtb250aCA+PSAwICYmXG4gICAgbW9udGggPD0gMTEgJiZcbiAgICBkYXRlID49IDEgJiZcbiAgICBkYXRlIDw9IChkYXlzSW5Nb250aHNbbW9udGhdIHx8IChpc0xlYXBZZWFySW5kZXgoeWVhcikgPyAyOSA6IDI4KSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEYXlPZlllYXJEYXRlKHllYXIsIGRheU9mWWVhcikge1xuICByZXR1cm4gZGF5T2ZZZWFyID49IDEgJiYgZGF5T2ZZZWFyIDw9IChpc0xlYXBZZWFySW5kZXgoeWVhcikgPyAzNjYgOiAzNjUpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVdlZWtEYXRlKF95ZWFyLCB3ZWVrLCBkYXkpIHtcbiAgcmV0dXJuIHdlZWsgPj0gMSAmJiB3ZWVrIDw9IDUzICYmIGRheSA+PSAwICYmIGRheSA8PSA2O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpIHtcbiAgaWYgKGhvdXJzID09PSAyNCkge1xuICAgIHJldHVybiBtaW51dGVzID09PSAwICYmIHNlY29uZHMgPT09IDA7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHNlY29uZHMgPj0gMCAmJlxuICAgIHNlY29uZHMgPCA2MCAmJlxuICAgIG1pbnV0ZXMgPj0gMCAmJlxuICAgIG1pbnV0ZXMgPCA2MCAmJlxuICAgIGhvdXJzID49IDAgJiZcbiAgICBob3VycyA8IDI1XG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGltZXpvbmUoX2hvdXJzLCBtaW51dGVzKSB7XG4gIHJldHVybiBtaW51dGVzID49IDAgJiYgbWludXRlcyA8PSA1OTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBwYXJzZUlTTztcbiIsImltcG9ydCB7IGFkZEhvdXJzIH0gZnJvbSBcIi4vYWRkSG91cnMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN1YkhvdXJzfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3ViSG91cnNcbiAqIEBjYXRlZ29yeSBIb3VyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBob3VycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGhvdXJzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGhvdXJzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgMiBob3VycyBmcm9tIDExIEp1bHkgMjAxNCAwMTowMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YkhvdXJzKG5ldyBEYXRlKDIwMTQsIDYsIDExLCAxLCAwKSwgMilcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDIzOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJIb3VycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFkZEhvdXJzKGRhdGUsIC1hbW91bnQsIG9wdGlvbnMpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN1YkhvdXJzO1xuIiwiaW1wb3J0IHtcbiAgaTE4bkR1cmF0aW9uSG91cixcbiAgaTE4bkR1cmF0aW9uTWludXRlLFxuICBpMThuRHVyYXRpb25EYXksXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvaTE4bi5qcyc7XG5pbXBvcnQge1xuICBpc1ZhbGlkLFxuICBwYXJzZUlTTyxcbiAgZGlmZmVyZW5jZUluRGF5cyxcbiAgZGlmZmVyZW5jZUluSG91cnMsXG4gIGRpZmZlcmVuY2VJbk1pbnV0ZXMsXG4gIGFkZE1pbnV0ZXMsXG4gIHN1YkhvdXJzLFxuICBzdWJEYXlzLFxufSBmcm9tICdkYXRlLWZucyc7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBvZmZzZXQgb2YgYSBJU08gZGF0ZSBzdHJpbmcuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb2Zmc2V0IGlzIGlnbm9yZWQuXG4gKiBJZiBpdCBpcyBub3QgcmVtb3ZlZCB0aGUgdGltZSB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGJyb3dzZXJzIGxvY2FsIHRpbWUuXG4gKiBFeGFtcGxlOiBcIjIwMjItMDgtMjlUMDk6MzA6MDArMDM6MDBcIiB3b3VsZCBiZSBjaGFuZ2VkIHRvIFwiMjAyMi0wOC0yOVQwODozMDowMCswMjowMFwiIC0tPiBub3QgdGhlIGRlc2lyZWQgb3V0Y29tZSwgYXMgd2Ugd2FudCB0byB1c2UgdGhlIHRpbWUgaW4gdGhlIHRpbWV6b25lIGFuZCBub3QgdGhlIGxvY2FsIHRpbWUuXG4gKlxuICogQWZ0ZXIgdGhlIG9mZnNldCBpcyByZW1vdmVkIGEgbmV3IGRhdGUgaXMgY3JlYXRlZCBpbiB0aGUgYnJvd3NlcnMgbG9jYWwgdGltZS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHRpbWUgb2YgdGhlIElTTyBkYXRlIHN0cmluZyBpcyBkaXNwbGF5ZWQgYW5kIG5vdCBhIGNvbnZlcnRlZCB0aW1lLlxuICogRXhhbXBsZTogXCIyMDIyLTA4LTI5VDA5OjMwOjAwKzAzOjAwXCIgd291bGQgYmUgY2hhbmdlZCB0byBcIjIwMjItMDgtMjlUMDk6MzA6MDArMDI6MDBcIiAtLT4gZGVzaXJlZCBvdXRjb21lXG4gKiBBdHRlbnRpb246IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY29udmVydCB0aGUgdGltZSB0byB0aGUgY29ycmVjdCB0aW1lIGluIHRoZSBsb2NhbCB0aW1lem9uZS4gSXQgaXMgYSB3b3JrYXJvdW5kIHRvIG1ha2Ugc3VyZSwgdGhhdCB0aGUgZ2l2ZW4gdGltZSBpcyBkaXNwbGF5ZWQgd2l0aG91dCBiZWluZyBjb252ZXJ0ZWQuXG4gKlxuICogT2Zmc2V0OiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRpbWV6b25lIGFuZCBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZS5cbiAqXG4gKiBAcGFyYW0gaXNvVGltZSAtIHRoZSBpc28gdGltZSB3aXRoIHRoZSB0aW1lem9uZSBvZmZzZXRcbiAqIEByZXR1cm5zIGEgbmV3IGRhdGUgd2l0aCB0aGUgbG9jYWwgdGltZXpvbmUgd2l0aCB0aGUgbG9jYWwgb2Zmc2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVUaW1lem9uZUZyb21JU09UaW1lU3RyaW5nKGlzb1RpbWU/OiBzdHJpbmcpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpc29UaW1lKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBwYXJzZWREYXRlID0gcGFyc2VJU08oaXNvVGltZSk7XG5cbiAgaWYgKCFpc1ZhbGlkKHBhcnNlZERhdGUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChpc29UaW1lLmluY2x1ZGVzKCdaJykpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoaXNvVGltZS5yZXBsYWNlKCdaJywgJycpKTtcbiAgfVxuXG4gIGlmIChpc29UaW1lLmluY2x1ZGVzKCdUJykpIHtcbiAgICBjb25zdCBkYXRlVGltZSA9IGlzb1RpbWUuc3BsaXQoJ1QnKTtcblxuICAgIGlmIChkYXRlVGltZVsxXSAmJiAoZGF0ZVRpbWVbMV0uaW5jbHVkZXMoJysnKSB8fCBkYXRlVGltZVsxXS5pbmNsdWRlcygnLScpKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKGAke2RhdGVUaW1lWzBdfVQke2RhdGVUaW1lWzFdLnNwbGl0KC9bKy1dLylbMF19YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgRGF0ZShpc29UaW1lKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgZHVyYXRpb24gbnVtYmVyIHRvIGRhdGUgc3RyaW5nIHdpdGggc3BlY2lmaWMgZm9ybWF0XG4gKlxuICogQHBhcmFtIGR1cmF0aW9uIC0gZHVyYXRpb24gaW4gbWludXRlc1xuICogQHBhcmFtIGN1cnJlbnRMYW5ndWFnZSAtIGN1cnJlbnRMYW5ndWFnZVxuICogQHJldHVybnMgYW4gT2JqZWN0IHdpdGggdHdvIHN0cmluZ3MgaW4gdGhlIGZvcm1hdCBcImRkIGhoIG1tXCIgKHNob3J0KSBhbiBcInggRGF5KHMpIHggSG91cihzKSB4IE1pbnV0ZShzKSAobG9uZylcIlxuICogKi9cblxuZXhwb3J0IGNvbnN0IGR1cmF0aW9uVG9UaW1lID0gKFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICBjdXJyZW50TGFuZ3VhZ2U/OiBzdHJpbmcsXG4pOiB7IHNob3J0OiBzdHJpbmc7IGxvbmc6IHN0cmluZyB9ID0+IHtcbiAgY29uc3Qgc2hvcnQgPSBbXTtcbiAgY29uc3QgbG9uZyA9IFtdO1xuXG4gIGNvbnN0IG5vdyA9IDA7XG4gIGxldCBmdXR1cmUgPSBhZGRNaW51dGVzKG5vdywgZHVyYXRpb24pO1xuXG4gIGNvbnN0IGRheXMgPSBkaWZmZXJlbmNlSW5EYXlzKGZ1dHVyZSwgbm93KTtcbiAgaWYgKGRheXMgPiAwKSB7XG4gICAgc2hvcnQucHVzaChgJHtkYXlzfSBkYCk7XG4gICAgaWYgKGN1cnJlbnRMYW5ndWFnZSkge1xuICAgICAgbG9uZy5wdXNoKFxuICAgICAgICBgJHtkYXlzfSAke1xuICAgICAgICAgIGRheXMgPiAxXG4gICAgICAgICAgICA/IGkxOG5EdXJhdGlvbkRheS5tdWx0aXBsZS5sb25nW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgICAgIDogaTE4bkR1cmF0aW9uRGF5LnNpbmdsZS5sb25nW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBmdXR1cmUgPSBzdWJEYXlzKGZ1dHVyZSwgZGF5cyk7XG4gIH1cblxuICBjb25zdCBob3VycyA9IGRpZmZlcmVuY2VJbkhvdXJzKGZ1dHVyZSwgbm93KTtcbiAgaWYgKGhvdXJzID4gMCkge1xuICAgIHNob3J0LnB1c2goYCR7aG91cnN9IGhgKTtcbiAgICBpZiAoY3VycmVudExhbmd1YWdlKSB7XG4gICAgICBsb25nLnB1c2goXG4gICAgICAgIGAke2hvdXJzfSAke1xuICAgICAgICAgIGhvdXJzID4gMVxuICAgICAgICAgICAgPyBpMThuRHVyYXRpb25Ib3VyLm11bHRpcGxlLmxvbmdbY3VycmVudExhbmd1YWdlXVxuICAgICAgICAgICAgOiBpMThuRHVyYXRpb25Ib3VyLnNpbmdsZS5sb25nW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBmdXR1cmUgPSBzdWJIb3VycyhmdXR1cmUsIGhvdXJzKTtcbiAgfVxuXG4gIGNvbnN0IG1pbnV0ZXMgPSBkaWZmZXJlbmNlSW5NaW51dGVzKGZ1dHVyZSwgbm93KTtcbiAgaWYgKG1pbnV0ZXMgPiAwKSB7XG4gICAgc2hvcnQucHVzaChgJHttaW51dGVzfSBtaW5gKTtcbiAgICBpZiAoY3VycmVudExhbmd1YWdlKSB7XG4gICAgICBsb25nLnB1c2goXG4gICAgICAgIGAke21pbnV0ZXN9ICR7XG4gICAgICAgICAgbWludXRlcyA+IDFcbiAgICAgICAgICAgID8gaTE4bkR1cmF0aW9uTWludXRlLm11bHRpcGxlLmxvbmdbY3VycmVudExhbmd1YWdlXVxuICAgICAgICAgICAgOiBpMThuRHVyYXRpb25NaW51dGUuc2luZ2xlLmxvbmdbY3VycmVudExhbmd1YWdlXVxuICAgICAgICB9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaG9ydDogc2hvcnQuam9pbignICcpLFxuICAgIGxvbmc6IGxvbmcuam9pbignICcpLFxuICB9O1xufTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3XSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxTQUFnQixRQUFRLE1BQU0sUUFBUSxTQUFTO0NBQzdDLE1BQU0sUUFBUSxPQUFPLE1BQU0sU0FBUyxHQUFHO0FBQ3ZDLEtBQUksTUFBTSxPQUFPLENBQUUsUUFBTyxjQUFjLFNBQVMsTUFBTSxNQUFNLElBQUk7QUFHakUsS0FBSSxDQUFDLE9BQVEsUUFBTztBQUVwQixPQUFNLFFBQVEsTUFBTSxTQUFTLEdBQUcsT0FBTztBQUN2QyxRQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1JULFNBQWdCLGdCQUFnQixNQUFNLFFBQVEsU0FBUztBQUNyRCxRQUFPLGNBQWMsU0FBUyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEtBQUssR0FBRyxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0RuRSxTQUFnQixTQUFTLE1BQU0sUUFBUSxTQUFTO0FBQzlDLFFBQU8sZ0JBQWdCLE1BQU0sU0FBUyxvQkFBb0IsUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOEJwRSxTQUFnQixpQkFBaUIsV0FBVyxhQUFhLFNBQVM7Q0FDaEUsTUFBTSxDQUFDLFlBQVksZ0JBQWdCLGVBQ2pDLFNBQVMsSUFDVCxXQUNBLFlBQ0Q7Q0FFRCxNQUFNLE9BQU8sZ0JBQWdCLFlBQVksYUFBYTtDQUN0RCxNQUFNLGFBQWEsS0FBSyxJQUN0Qix5QkFBeUIsWUFBWSxhQUFhLENBQ25EO0FBRUQsWUFBVyxRQUFRLFdBQVcsU0FBUyxHQUFHLE9BQU8sV0FBVztDQVE1RCxNQUFNLFNBQVMsUUFBUSxhQUpFLE9BQ3ZCLGdCQUFnQixZQUFZLGFBQWEsS0FBSyxDQUFDLEtBQ2hEO0FBSUQsUUFBTyxXQUFXLElBQUksSUFBSTs7QUFPNUIsU0FBUyxnQkFBZ0IsV0FBVyxhQUFhO0NBQy9DLE1BQU0sT0FDSixVQUFVLGFBQWEsR0FBRyxZQUFZLGFBQWEsSUFDbkQsVUFBVSxVQUFVLEdBQUcsWUFBWSxVQUFVLElBQzdDLFVBQVUsU0FBUyxHQUFHLFlBQVksU0FBUyxJQUMzQyxVQUFVLFVBQVUsR0FBRyxZQUFZLFVBQVUsSUFDN0MsVUFBVSxZQUFZLEdBQUcsWUFBWSxZQUFZLElBQ2pELFVBQVUsWUFBWSxHQUFHLFlBQVksWUFBWSxJQUNqRCxVQUFVLGlCQUFpQixHQUFHLFlBQVksaUJBQWlCO0FBRTdELEtBQUksT0FBTyxFQUFHLFFBQU87QUFDckIsS0FBSSxPQUFPLEVBQUcsUUFBTztBQUdyQixRQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pFVCxTQUFnQixrQkFBa0IsV0FBVyxhQUFhLFNBQVM7Q0FDakUsTUFBTSxDQUFDLFlBQVksZ0JBQWdCLGVBQ2pDLFNBQVMsSUFDVCxXQUNBLFlBQ0Q7Q0FDRCxNQUFNLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCO0FBQzdDLFFBQU8sa0JBQWtCLFNBQVMsZUFBZSxDQUFDLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWnpELFNBQWdCLFFBQVEsTUFBTSxRQUFRLFNBQVM7QUFDN0MsUUFBTyxRQUFRLE1BQU0sQ0FBQyxRQUFRLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNrQnhDLFNBQWdCLFNBQVMsVUFBVSxTQUFTO0NBQzFDLE1BQU0sb0JBQW9CLGNBQWMsU0FBUyxJQUFJLElBQUk7Q0FFekQsTUFBTSxtQkFBbUIsU0FBUyxvQkFBb0I7Q0FDdEQsTUFBTSxjQUFjLGdCQUFnQixTQUFTO0NBRTdDLElBQUk7QUFDSixLQUFJLFlBQVksTUFBTTtFQUNwQixNQUFNLGtCQUFrQixVQUFVLFlBQVksTUFBTSxpQkFBaUI7QUFDckUsU0FBTyxVQUFVLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLEtBQUs7O0FBR3hFLEtBQUksQ0FBQyxRQUFRLE1BQU0sQ0FBQyxLQUFLLENBQUUsUUFBTyxhQUFhO0NBRS9DLE1BQU0sWUFBWSxDQUFDO0NBQ25CLElBQUksT0FBTztDQUNYLElBQUk7QUFFSixLQUFJLFlBQVksTUFBTTtBQUNwQixTQUFPLFVBQVUsWUFBWSxLQUFLO0FBQ2xDLE1BQUksTUFBTSxLQUFLLENBQUUsUUFBTyxhQUFhOztBQUd2QyxLQUFJLFlBQVksVUFBVTtBQUN4QixXQUFTLGNBQWMsWUFBWSxTQUFTO0FBQzVDLE1BQUksTUFBTSxPQUFPLENBQUUsUUFBTyxhQUFhO1FBQ2xDO0VBQ0wsTUFBTSxVQUFVLElBQUksS0FBSyxZQUFZLEtBQUs7RUFDMUMsTUFBTSxTQUFTLE9BQU8sR0FBRyxTQUFTLEdBQUc7QUFDckMsU0FBTyxZQUNMLFFBQVEsZ0JBQWdCLEVBQ3hCLFFBQVEsYUFBYSxFQUNyQixRQUFRLFlBQVksQ0FDckI7QUFDRCxTQUFPLFNBQ0wsUUFBUSxhQUFhLEVBQ3JCLFFBQVEsZUFBZSxFQUN2QixRQUFRLGVBQWUsRUFDdkIsUUFBUSxvQkFBb0IsQ0FDN0I7QUFDRCxTQUFPOztBQUdULFFBQU8sT0FBTyxZQUFZLE9BQU8sUUFBUSxTQUFTLEdBQUc7O0FBR3ZELElBQU0sV0FBVztDQUNmLG1CQUFtQjtDQUNuQixtQkFBbUI7Q0FDbkIsVUFBVTtDQUNYO0FBRUQsSUFBTSxZQUNKO0FBQ0YsSUFBTSxZQUNKO0FBQ0YsSUFBTSxnQkFBZ0I7QUFFdEIsU0FBUyxnQkFBZ0IsWUFBWTtDQUNuQyxNQUFNLGNBQWMsRUFBRTtDQUN0QixNQUFNLFFBQVEsV0FBVyxNQUFNLFNBQVMsa0JBQWtCO0NBQzFELElBQUk7QUFJSixLQUFJLE1BQU0sU0FBUyxFQUNqQixRQUFPO0FBR1QsS0FBSSxJQUFJLEtBQUssTUFBTSxHQUFHLENBQ3BCLGNBQWEsTUFBTTtNQUNkO0FBQ0wsY0FBWSxPQUFPLE1BQU07QUFDekIsZUFBYSxNQUFNO0FBQ25CLE1BQUksU0FBUyxrQkFBa0IsS0FBSyxZQUFZLEtBQUssRUFBRTtBQUNyRCxlQUFZLE9BQU8sV0FBVyxNQUFNLFNBQVMsa0JBQWtCLENBQUM7QUFDaEUsZ0JBQWEsV0FBVyxPQUN0QixZQUFZLEtBQUssUUFDakIsV0FBVyxPQUNaOzs7QUFJTCxLQUFJLFlBQVk7RUFDZCxNQUFNLFFBQVEsU0FBUyxTQUFTLEtBQUssV0FBVztBQUNoRCxNQUFJLE9BQU87QUFDVCxlQUFZLE9BQU8sV0FBVyxRQUFRLE1BQU0sSUFBSSxHQUFHO0FBQ25ELGVBQVksV0FBVyxNQUFNO1FBRTdCLGFBQVksT0FBTzs7QUFJdkIsUUFBTzs7QUFHVCxTQUFTLFVBQVUsWUFBWSxrQkFBa0I7Q0FDL0MsTUFBTSxRQUFRLElBQUksT0FDaEIsMEJBQ0csSUFBSSxvQkFDTCx5QkFDQyxJQUFJLG9CQUNMLE9BQ0g7Q0FFRCxNQUFNLFdBQVcsV0FBVyxNQUFNLE1BQU07QUFFeEMsS0FBSSxDQUFDLFNBQVUsUUFBTztFQUFFLE1BQU07RUFBSyxnQkFBZ0I7RUFBSTtDQUV2RCxNQUFNLE9BQU8sU0FBUyxLQUFLLFNBQVMsU0FBUyxHQUFHLEdBQUc7Q0FDbkQsTUFBTSxVQUFVLFNBQVMsS0FBSyxTQUFTLFNBQVMsR0FBRyxHQUFHO0FBR3RELFFBQU87RUFDTCxNQUFNLFlBQVksT0FBTyxPQUFPLFVBQVU7RUFDMUMsZ0JBQWdCLFdBQVcsT0FBTyxTQUFTLE1BQU0sU0FBUyxJQUFJLE9BQU87RUFDdEU7O0FBR0gsU0FBUyxVQUFVLFlBQVksTUFBTTtBQUVuQyxLQUFJLFNBQVMsS0FBTSx3QkFBTyxJQUFJLEtBQUssSUFBSTtDQUV2QyxNQUFNLFdBQVcsV0FBVyxNQUFNLFVBQVU7QUFFNUMsS0FBSSxDQUFDLFNBQVUsd0JBQU8sSUFBSSxLQUFLLElBQUk7Q0FFbkMsTUFBTSxhQUFhLENBQUMsQ0FBQyxTQUFTO0NBQzlCLE1BQU0sWUFBWSxjQUFjLFNBQVMsR0FBRztDQUM1QyxNQUFNLFFBQVEsY0FBYyxTQUFTLEdBQUcsR0FBRztDQUMzQyxNQUFNLE1BQU0sY0FBYyxTQUFTLEdBQUc7Q0FDdEMsTUFBTSxPQUFPLGNBQWMsU0FBUyxHQUFHO0NBQ3ZDLE1BQU0sWUFBWSxjQUFjLFNBQVMsR0FBRyxHQUFHO0FBRS9DLEtBQUksWUFBWTtBQUNkLE1BQUksQ0FBQyxpQkFBaUIsTUFBTSxNQUFNLFVBQVUsQ0FDMUMsd0JBQU8sSUFBSSxLQUFLLElBQUk7QUFFdEIsU0FBTyxpQkFBaUIsTUFBTSxNQUFNLFVBQVU7UUFDekM7RUFDTCxNQUFNLHVCQUFPLElBQUksS0FBSyxFQUFFO0FBQ3hCLE1BQ0UsQ0FBQyxhQUFhLE1BQU0sT0FBTyxJQUFJLElBQy9CLENBQUMsc0JBQXNCLE1BQU0sVUFBUyxDQUV0Qyx3QkFBTyxJQUFJLEtBQUssSUFBSTtBQUV0QixPQUFLLGVBQWUsTUFBTSxPQUFPLEtBQUssSUFBSSxXQUFXLElBQUksQ0FBQztBQUMxRCxTQUFPOzs7QUFJWCxTQUFTLGNBQWMsT0FBTztBQUM1QixRQUFPLFFBQVEsU0FBUyxNQUFNLEdBQUc7O0FBR25DLFNBQVMsVUFBVSxZQUFZO0NBQzdCLE1BQU0sV0FBVyxXQUFXLE1BQU0sVUFBVTtBQUM1QyxLQUFJLENBQUMsU0FBVSxRQUFPO0NBRXRCLE1BQU0sUUFBUSxjQUFjLFNBQVMsR0FBRztDQUN4QyxNQUFNLFVBQVUsY0FBYyxTQUFTLEdBQUc7Q0FDMUMsTUFBTSxVQUFVLGNBQWMsU0FBUyxHQUFHO0FBRTFDLEtBQUksQ0FBQyxhQUFhLE9BQU8sU0FBUyxRQUFRLENBQ3hDLFFBQU87QUFHVCxRQUNFLFFBQVEscUJBQXFCLFVBQVUsdUJBQXVCLFVBQVU7O0FBSTVFLFNBQVMsY0FBYyxPQUFPO0FBQzVCLFFBQVEsU0FBUyxXQUFXLE1BQU0sUUFBUSxLQUFLLElBQUksQ0FBQyxJQUFLOztBQUczRCxTQUFTLGNBQWMsZ0JBQWdCO0FBQ3JDLEtBQUksbUJBQW1CLElBQUssUUFBTztDQUVuQyxNQUFNLFdBQVcsZUFBZSxNQUFNLGNBQWM7QUFDcEQsS0FBSSxDQUFDLFNBQVUsUUFBTztDQUV0QixNQUFNLE9BQU8sU0FBUyxPQUFPLE1BQU0sS0FBSztDQUN4QyxNQUFNLFFBQVEsU0FBUyxTQUFTLEdBQUc7Q0FDbkMsTUFBTSxVQUFXLFNBQVMsTUFBTSxTQUFTLFNBQVMsR0FBRyxJQUFLO0FBRTFELEtBQUksQ0FBQyxpQkFBaUIsT0FBTyxRQUFRLENBQ25DLFFBQU87QUFHVCxRQUFPLFFBQVEsUUFBUSxxQkFBcUIsVUFBVTs7QUFHeEQsU0FBUyxpQkFBaUIsYUFBYSxNQUFNLEtBQUs7Q0FDaEQsTUFBTSx1QkFBTyxJQUFJLEtBQUssRUFBRTtBQUN4QixNQUFLLGVBQWUsYUFBYSxHQUFHLEVBQUU7Q0FDdEMsTUFBTSxxQkFBcUIsS0FBSyxXQUFXLElBQUk7Q0FDL0MsTUFBTSxRQUFRLE9BQU8sS0FBSyxJQUFJLE1BQU0sSUFBSTtBQUN4QyxNQUFLLFdBQVcsS0FBSyxZQUFZLEdBQUcsS0FBSztBQUN6QyxRQUFPOztBQU1ULElBQU0sZUFBZTtDQUFDO0NBQUk7Q0FBTTtDQUFJO0NBQUk7Q0FBSTtDQUFJO0NBQUk7Q0FBSTtDQUFJO0NBQUk7Q0FBSTtDQUFHO0FBRXZFLFNBQVMsZ0JBQWdCLE1BQU07QUFDN0IsUUFBTyxPQUFPLFFBQVEsS0FBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLFFBQVE7O0FBRy9ELFNBQVMsYUFBYSxNQUFNLE9BQU8sTUFBTTtBQUN2QyxRQUNFLFNBQVMsS0FDVCxTQUFTLE1BQ1QsUUFBUSxLQUNSLFNBQVMsYUFBYSxXQUFXLGdCQUFnQixLQUFLLEdBQUcsS0FBSzs7QUFJbEUsU0FBUyxzQkFBc0IsTUFBTSxXQUFXO0FBQzlDLFFBQU8sYUFBYSxLQUFLLGNBQWMsZ0JBQWdCLEtBQUssR0FBRyxNQUFNOztBQUd2RSxTQUFTLGlCQUFpQixPQUFPLE1BQU0sS0FBSztBQUMxQyxRQUFPLFFBQVEsS0FBSyxRQUFRLE1BQU0sT0FBTyxLQUFLLE9BQU87O0FBR3ZELFNBQVMsYUFBYSxPQUFPLFNBQVMsU0FBUztBQUM3QyxLQUFJLFVBQVUsR0FDWixRQUFPLFlBQVksS0FBSyxZQUFZO0FBR3RDLFFBQ0UsV0FBVyxLQUNYLFVBQVUsTUFDVixXQUFXLEtBQ1gsVUFBVSxNQUNWLFNBQVMsS0FDVCxRQUFROztBQUlaLFNBQVMsaUJBQWlCLFFBQVEsU0FBUztBQUN6QyxRQUFPLFdBQVcsS0FBSyxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JRcEMsU0FBZ0IsU0FBUyxNQUFNLFFBQVEsU0FBUztBQUM5QyxRQUFPLFNBQVMsTUFBTSxDQUFDLFFBQVEsUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQ3pDLFNBQWdCLGdDQUFnQyxTQUFnQjtBQUM5RCxLQUFJLENBQUMsUUFDSDtBQUlGLEtBQUksQ0FBQyxRQUZjLFNBQVMsUUFBUSxDQUVaLENBQ3RCO0FBR0YsS0FBSSxRQUFRLFNBQVMsSUFBSSxDQUN2QixRQUFPLElBQUksS0FBSyxRQUFRLFFBQVEsS0FBSyxHQUFHLENBQUM7QUFHM0MsS0FBSSxRQUFRLFNBQVMsSUFBSSxFQUFFO0VBQ3pCLE1BQU0sV0FBVyxRQUFRLE1BQU0sSUFBSTtBQUVuQyxNQUFJLFNBQVMsT0FBTyxTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksU0FBUyxHQUFHLFNBQVMsSUFBSSxFQUN4RSx3QkFBTyxJQUFJLEtBQUssR0FBRyxTQUFTLEdBQUUsR0FBSSxTQUFTLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSzs7QUFHckUsUUFBTyxJQUFJLEtBQUssUUFBUTs7Ozs7Ozs7O0FBVzFCLElBQWEsa0JBQ1gsVUFDQSxvQkFDbUM7Q0FDbkMsTUFBTSxRQUFRLEVBQUU7Q0FDaEIsTUFBTSxPQUFPLEVBQUU7Q0FFZixNQUFNLE1BQU07Q0FDWixJQUFJLFNBQVMsV0FBVyxLQUFLLFNBQVM7Q0FFdEMsTUFBTSxPQUFPLGlCQUFpQixRQUFRLElBQUk7QUFDMUMsS0FBSSxPQUFPLEdBQUc7QUFDWixRQUFNLEtBQUssR0FBRyxLQUFJLElBQUs7QUFDdkIsTUFBSSxnQkFDRixNQUFLLEtBQ0gsR0FBRyxLQUFJLEdBQ0wsT0FBTyxJQUNILGdCQUFnQixTQUFTLEtBQUssbUJBQzlCLGdCQUFnQixPQUFPLEtBQUssbUJBRW5DO0FBRUgsV0FBUyxRQUFRLFFBQVEsS0FBSzs7Q0FHaEMsTUFBTSxRQUFRLGtCQUFrQixRQUFRLElBQUk7QUFDNUMsS0FBSSxRQUFRLEdBQUc7QUFDYixRQUFNLEtBQUssR0FBRyxNQUFLLElBQUs7QUFDeEIsTUFBSSxnQkFDRixNQUFLLEtBQ0gsR0FBRyxNQUFLLEdBQ04sUUFBUSxJQUNKLGlCQUFpQixTQUFTLEtBQUssbUJBQy9CLGlCQUFpQixPQUFPLEtBQUssbUJBRXBDO0FBRUgsV0FBUyxTQUFTLFFBQVEsTUFBTTs7Q0FHbEMsTUFBTSxVQUFVLG9CQUFvQixRQUFRLElBQUk7QUFDaEQsS0FBSSxVQUFVLEdBQUc7QUFDZixRQUFNLEtBQUssR0FBRyxRQUFPLE1BQU87QUFDNUIsTUFBSSxnQkFDRixNQUFLLEtBQ0gsR0FBRyxRQUFPLEdBQ1IsVUFBVSxJQUNOLG1CQUFtQixTQUFTLEtBQUssbUJBQ2pDLG1CQUFtQixPQUFPLEtBQUssbUJBRXRDOztBQUlMLFFBQU87RUFDTCxPQUFPLE1BQU0sS0FBSyxJQUFJO0VBQ3RCLE1BQU0sS0FBSyxLQUFLLElBQUE7RUFDakIifQ==
|