nmce-func 1.3.2 → 1.4.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.
@@ -1,99 +1,155 @@
1
- import moment from 'moment';
1
+ import { DateTime, Duration, Settings } from 'luxon';
2
2
  export class DateFunc {
3
+ /**
4
+ * At runtime, there's no simple guarantee that the input is Date. Sometimes you codes expect date, but the response from the Web service may give you string or number.
5
+ * This function give you safe parse of date data from I/O, not of your control.
6
+ * If the data is invalid, throws RangeError or TypeError.
7
+ * @param dt
8
+ * @returns
9
+ */
10
+ static dateDataToDate(dt) {
11
+ if (dt instanceof Date) {
12
+ return dt;
13
+ }
14
+ if (typeof dt === 'string') {
15
+ const r = Date.parse(dt);
16
+ if (isNaN(r)) {
17
+ throw new RangeError('Invalid string for Date');
18
+ }
19
+ return new Date(r);
20
+ }
21
+ if (typeof dt === 'number') {
22
+ const rd = new Date(dt);
23
+ if (Number.isNaN(rd.valueOf())) {
24
+ throw new RangeError('Invalid number for Date');
25
+ }
26
+ return rd;
27
+ }
28
+ throw new TypeError('Expect Date, string or number');
29
+ }
30
+ /**
31
+ * Similar to dateDataToDate, but allow null and defined semantically.
32
+ * @param dt
33
+ * @returns
34
+ */
35
+ static dateDataToDateOrNull(dt) {
36
+ if (dt instanceof Date) {
37
+ return dt;
38
+ }
39
+ if (typeof dt === 'string') {
40
+ const r = Date.parse(dt);
41
+ if (isNaN(r)) {
42
+ throw new RangeError('Invalid string for Date');
43
+ }
44
+ return new Date(r);
45
+ }
46
+ if (typeof dt === 'number') {
47
+ const rd = new Date(dt);
48
+ if (Number.isNaN(rd.valueOf())) {
49
+ throw new RangeError('Invalid number for Date');
50
+ }
51
+ return rd;
52
+ }
53
+ if (dt == null) {
54
+ return dt;
55
+ }
56
+ throw new TypeError('Expect Date, string or number');
57
+ }
3
58
  /**
4
59
  * Transform UTC DateTime to local date without H, M and S. For example, the month day of 2018-01-23T22:00:00Z is 24 in Australia.
5
60
  * @param dtUtc
6
- * @param offsetMinutes if not defined, it will be new Date().getTimezoneOffset(). //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
7
61
  */
8
62
  static dateTimeUtcToLocalDateNumber(dtUtc) {
9
- if (!dtUtc) {
10
- return 0; //0 is better for calculation by the clients.
63
+ if (dtUtc == null) {
64
+ return dtUtc;
11
65
  }
12
- const localDt = DateFunc.dateTimeUtcToLocalDateTime(dtUtc);
66
+ const localDt = this.dateDataToDate(dtUtc);
13
67
  const localDNum = localDt.setHours(0, 0, 0, 0);
14
68
  return localDNum;
15
69
  }
16
70
  /**
17
71
  * Date only. However, the date may still be in UTC.
18
72
  * @param dtUtc
73
+ * @returns new Date object.
19
74
  */
20
75
  static dateTimeUtcToLocalDate(dtUtc) {
21
- const localDt = DateFunc.dateTimeUtcToLocalDateTime(dtUtc);
22
- const localD = localDt.setHours(0, 0, 0, 0);
23
- return new Date(localD);
76
+ if (dtUtc == null) {
77
+ return dtUtc;
78
+ }
79
+ const localDt = this.dateDataToDate(dtUtc);
80
+ const localNum = localDt.setHours(0, 0, 0, 0);
81
+ return new Date(localNum);
24
82
  }
83
+ /**
84
+ * '2018-01-23T22:00:00Z' will become '2018-01-24' in Australia.
85
+ * @param dtUtc
86
+ * @returns new Date object.
87
+ */
25
88
  static localISODateString(dtUtc) {
26
- const dt = moment(dtUtc).local();
27
- return dt.format('YYYY-MM-DD');
89
+ const dt = this.dateTimeUtcToLocalDate(dtUtc);
90
+ if (dt == null) {
91
+ return dt;
92
+ }
93
+ const d = DateTime.fromJSDate(dt);
94
+ return d.toISODate();
28
95
  }
29
96
  /**
30
- * locate date ONLY (no time) to UTC date.
97
+ * local date ONLY (no time) to UTC date.
98
+ * The input could be a string of yyyy-MM-dd, or a Date Object.
99
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
100
+ * While the time value at the heart of a Date object is UTC, the basic methods to fetch the date and time
101
+ * or its components all work in the local (i.e. host system) time zone and offset.
31
102
  * @param dt if dt contain time info, it will become dt.setHours(0, 0, 0, 0)
32
103
  */
33
104
  static localDateToUtc(d) {
34
- const dt = moment(d).toDate();
105
+ if (d == null) {
106
+ return d;
107
+ }
108
+ const dt = this.dateDataToDate(d);
35
109
  const n = dt.setHours(0, 0, 0, 0);
36
110
  const offset = dt.getTimezoneOffset() * 60000;
37
111
  return new Date(n + offset);
38
112
  }
39
- static getTimezoneOffset() {
40
- const dt = this.today;
41
- return dt.getTimezoneOffset();
42
- }
43
- /**
44
- * Transform UTC DateTime to local dateTime.
45
- * @param dtUtc
46
- * @param offsetMinutes if not defined, it will be new Date().getTimezoneOffset(). //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
47
- */
48
- static dateTimeUtcToLocalDateTime(dtUtc) {
49
- const stillUtc = moment.utc(dtUtc).toDate();
50
- return moment(stillUtc).local().toDate();
51
- }
52
- static dateTimeUtcToLocaMoment(dtUtc) {
53
- const stillUtc = moment.utc(dtUtc);
54
- return stillUtc.local();
55
- }
56
113
  static getEndOfWeek(dt) {
57
- return moment(dt).endOf('isoWeek').toDate();
114
+ const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
115
+ return dateTime.endOf('week').toJSDate();
58
116
  }
59
117
  static getStartOfWeek(dt) {
60
- return moment(dt).startOf('isoWeek').toDate();
118
+ const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
119
+ return dateTime.startOf('week').toJSDate();
61
120
  }
62
121
  static getEndOfMonth(dt) {
63
- // return new Date(dt.getFullYear(), dt.getMonth() + 1, 0, 23, 59, 59, 999);
64
- return moment(dt).endOf('month').toDate();
122
+ const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
123
+ return dateTime.endOf('month').toJSDate();
65
124
  }
66
125
  static getStartOfMonth(dt) {
67
- return moment(dt).startOf('month').toDate();
68
- }
69
- static getDaysBetweenDates(dt1, dt2) {
70
- return this.getDaysBetween(dt1, dt2);
126
+ const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
127
+ return dateTime.startOf('month').toJSDate();
71
128
  }
72
129
  static getEndOfDate(dt) {
73
- return dt ? new Date(dt.setHours(23, 59, 59, 999)) :
74
- new Date(this.now.setHours(23, 59, 59, 999));
130
+ const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
131
+ return dateTime.endOf('day').toJSDate();
75
132
  }
76
133
  static getStartOfDate(dt) {
77
- return moment(dt).startOf('day').toDate();
134
+ const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
135
+ return dateTime.startOf('day').toJSDate();
78
136
  }
79
137
  static getEndOfToday() {
80
- // return new Date((new Date(Date.now())).setHours(23, 59, 59, 999));
81
- return moment(Date.now()).endOf('day').toDate();
138
+ return this.getEndOfDate(Date.now());
82
139
  }
83
140
  static getStartOfToday() {
84
- // return new Date((new Date(Date.now())).setHours(0, 0, 0, 0));
85
- return moment(Date.now()).startOf('day').toDate();
141
+ return this.getStartOfDate(Date.now());
86
142
  }
87
- //inspired https://stackoverflow.com/questions/563406/add-days-to-javascript-date
88
- static addDays(dt, days = 0) {
89
- const dat = moment(dt);
90
- dat.add(days, 'days');
91
- return dat.toDate();
143
+ static getDaysBetween(d1, d2) {
144
+ const dm1 = DateTime.fromJSDate(this.dateDataToDate(d1));
145
+ const dm2 = DateTime.fromJSDate(this.dateDataToDate(d1));
146
+ return dm2.diff(dm1, 'days').days;
92
147
  }
93
- static subtractDays(dt, days = 0) {
94
- const dat = moment(dt);
95
- dat.subtract(days, 'days');
96
- return dat.toDate();
148
+ //inspired https://stackoverflow.com/questions/563406/add-days-to-javascript-date
149
+ static addDays(dt, days) {
150
+ const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
151
+ const r = dat.plus({ days: days });
152
+ return r.toJSDate();
97
153
  }
98
154
  /**
99
155
  * Start of today
@@ -104,104 +160,119 @@ export class DateFunc {
104
160
  static get now() {
105
161
  return new Date(Date.now());
106
162
  }
163
+ /**
164
+ * From now, next 5 minute mark. For example 2:23:44 will be 2:25:00;
165
+ * @returns
166
+ */
107
167
  static getNext5MinuteMark() {
108
- const m = moment().set('second', 0).set('millisecond', 0);
109
- const minute = m.minute();
168
+ const m = DateTime.now().set({ second: 0, millisecond: 0 });
169
+ const minute = m.minute;
110
170
  const mod = minute % 5;
111
171
  if (mod) {
112
172
  const delta = 5 - mod;
113
- return m.add(delta, 'm').toDate();
173
+ return m.plus({ minutes: delta }).toJSDate();
114
174
  }
115
- return m.toDate();
175
+ return m.toJSDate();
116
176
  }
117
177
  static getYMD(d) {
118
- return moment(d).format('YYYYMMDD');
178
+ const dt = DateTime.fromJSDate(this.dateDataToDate(d));
179
+ return dt.toFormat('yyyyMMdd');
119
180
  }
120
181
  static getDMYWithSlash(d) {
121
- return moment(d).format('DD/MM/YYYY');
182
+ const dt = DateTime.fromJSDate(this.dateDataToDate(d));
183
+ return dt.toFormat('dd/MM/yyyy');
122
184
  }
123
185
  static getDMYHmWithSlash(d) {
124
- return moment(d).format('DD/MM/YYYY HH:mm');
125
- }
126
- static getMcpTime(dt) {
127
- return moment(dt).format('HH:mm:ss.SSSZ');
186
+ const dt = DateTime.fromJSDate(this.dateDataToDate(d));
187
+ return dt.toFormat('dd/MM/yyyy HH:mm');
128
188
  }
129
189
  /**
130
- * In 24 hour format
131
- * @param dtUtc
190
+ *
191
+ * @param dtUtc In 24 hour format, and the date separator depending on the system or Luxon default locale
192
+ * @returns
132
193
  */
133
- static getLocalDMYHmWithSlash(dtUtc) {
134
- const d = DateFunc.dateTimeUtcToLocalDateTime(dtUtc);
135
- return moment(d).format('DD/MM/YYYY HH:mm');
194
+ static getDateTime24Simple(dtUtc) {
195
+ if (dtUtc == null) {
196
+ return dtUtc;
197
+ }
198
+ const d = this.dateDataToDate(dtUtc);
199
+ const dt = DateTime.fromJSDate(d);
200
+ return dt.toLocaleString(DateTime.DATE_SHORT) + ' ' + dt.toLocaleString(DateTime.TIME_24_SIMPLE);
201
+ }
202
+ static setDefaultLocale(locale) {
203
+ Settings.defaultLocale = locale;
204
+ }
205
+ static getDefaultLocale() {
206
+ return Settings.defaultLocale;
207
+ }
208
+ static setDefaultZone(zone) {
209
+ Settings.defaultZone = zone;
210
+ }
211
+ static getDefaultZone() {
212
+ return Settings.defaultZone.name;
213
+ }
214
+ static isZoneValid() {
215
+ return Settings.defaultZone.isValid;
136
216
  }
137
217
  /**
138
- * Offset minutes comparing with today
218
+ * For example, in AEST, it is -600.
219
+ * @returns
139
220
  */
140
- static getOffsetMinutes(dtUtc) {
141
- const dm1 = moment(dtUtc);
142
- const dm2 = moment(new Date().setHours(0, 0, 0, 0));
143
- return dm1.diff(dm2, 'minutes');
144
- }
145
- static getDaysBetween(d1, d2) {
146
- const dm1 = moment(d1);
147
- const dm2 = moment(d2);
148
- return dm2.diff(dm1, 'days');
221
+ static getLocalTimezoneOffset() {
222
+ const dt = new Date(Date.now());
223
+ return dt.getTimezoneOffset();
149
224
  }
150
225
  /**
151
226
  * Get hour of the date. If Date is not defined, the hour will be current hour.
152
227
  * @param dtUtc
153
228
  */
154
229
  static getHour(dtUtc) {
155
- const m = moment(dtUtc);
156
- return m.hours();
230
+ const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
231
+ return dt.hour;
157
232
  }
158
233
  static getMinute(dtUtc) {
159
- const m = moment(dtUtc);
160
- return m.minutes();
234
+ const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
235
+ return dt.minute;
161
236
  }
162
- static composeDateTime(dt, h = 0, minute = 0) {
163
- const mt = moment(dt);
164
- return new Date(mt.toDate().setHours(h, minute, 0, 0));
237
+ static GetHM(dtUtc) {
238
+ const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
239
+ return { h: dt.hour, m: dt.minute };
165
240
  }
166
- static olderThan24Hours(d) {
167
- const m = moment(d);
168
- return moment().diff(m, 'hours') >= 24;
241
+ static composeDateTime(dt, h = 0, minute = 0, second = 0) {
242
+ return new Date(this.dateDataToDate(dt).setHours(h, minute, second, 0));
169
243
  }
170
- static olderThan24HoursUtc(dtUtc) {
171
- return DateFunc.getHourAgeUtc(dtUtc) >= 24;
244
+ static olderThan24Hours(d) {
245
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
246
+ return DateTime.now().diff(m, 'hours') >= Duration.fromISO('PT24H');
172
247
  }
173
248
  static olderThanHours(d, hours) {
174
- const m = moment(d);
175
- return moment().diff(m, 'hours') >= hours;
176
- }
177
- static olderThanHoursUtc(dtUtc, hours) {
178
- return DateFunc.getHourAgeUtc(dtUtc) >= hours;
249
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
250
+ const diff = DateTime.now().diff(m, 'hours');
251
+ const duration = Duration.fromISO(`PT${hours}H`);
252
+ console.debug('diff: ' + diff.hours + ' duration: ' + duration.hours);
253
+ return diff.hours >= duration.hours;
179
254
  }
180
255
  static olderThanMinutes(d, minutes) {
181
- const m = moment(d);
182
- return moment().diff(m, 'minutes') >= minutes;
256
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
257
+ return DateTime.now().diff(m, 'minutes') >= Duration.fromMillis(minutes * 60 * 1000);
183
258
  }
184
259
  /**
185
260
  * It could be 11PM yesterday, and 1 AM today. Actually based on local today.
186
261
  */
187
262
  static olderThan1Day(dtUtc) {
188
- return DateFunc.getDayAgeUtc(dtUtc) > 0;
263
+ return DateFunc.getDayAge(dtUtc) > 0;
189
264
  }
190
265
  static getHourAge(d) {
191
- const m = moment(d);
192
- return moment().diff(m, 'hours');
193
- }
194
- static getHourAgeUtc(dtUtc) {
195
- const m = moment.utc(dtUtc);
196
- return moment.utc().diff(m, 'hours');
266
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
267
+ return DateTime.now().diff(m, 'hours').hours;
197
268
  }
198
269
  /**
199
- * Compare utc date with utc now.
270
+ * Compare date with now.
200
271
  * @param dtUtc
201
272
  */
202
- static getDayAgeUtc(dtUtc) {
203
- const m = moment.utc(dtUtc);
204
- return moment.utc().diff(m, 'days');
273
+ static getDayAge(d) {
274
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
275
+ return DateTime.now().diff(m, 'days').days;
205
276
  }
206
277
  /**
207
278
  * How many years from now.
@@ -209,108 +280,29 @@ export class DateFunc {
209
280
  * @returns
210
281
  */
211
282
  static getAge(d) {
212
- const m = moment(d);
213
- return moment().diff(m, 'years');
214
- }
215
- /**
216
- * Year of date.
217
- * @param d
218
- * @returns
219
- */
220
- static getYear(d) {
221
- const m = moment(d);
222
- return m.year();
223
- }
224
- static getUtcNow() {
225
- return moment.utc().toDate();
226
- }
227
- static addMinutes(d, m) {
228
- return moment(d).add(m, 'm').toDate();
229
- }
230
- static addMonth(d, m) {
231
- return moment(d).add(m, 'M').toDate();
232
- }
233
- static getDuration(d1, d2) {
234
- const md1 = moment(d1);
235
- const md2 = moment(d2);
236
- return moment.duration(md2.diff(md1));
283
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
284
+ return DateTime.now().diff(m, 'years').years;
237
285
  }
238
286
  /**
239
287
  * Convert minutes from midnight to HH:mm text
240
- * @param mins
288
+ * @param minutes
241
289
  */
242
- static getHMFromMins(mins) {
243
- // do not include the first validation check if you want, for example,
244
- // getTimeFromMins(1530) to equal getTimeFromMins(90) (i.e. mins rollover)
245
- if (mins >= 24 * 60 || mins < 0) {
290
+ static getHMFromMins(minutes) {
291
+ if (minutes >= 24 * 60 || minutes < 0) {
246
292
  throw new RangeError('Valid input should be greater than or equal to 0 and less than 1440.');
247
293
  }
248
- const h = mins / 60 | 0, m = mins % 60 | 0;
249
- return moment.utc().hours(h).minutes(m).format('HH:mm');
294
+ const h = minutes / 60 | 0, m = minutes % 60 | 0;
295
+ return DateTime.utc().set({ hour: h, minute: m }).toFormat('HH:mm');
250
296
  }
251
297
  static getMinutesSinceMidnight(d) {
252
- const m = moment(d);
253
- const midnight = moment(d).startOf('day'); //Mutates the original moment by setting it to the start of a unit of time. So I have better not to use m which wil be changed by calling this function
254
- return m.diff(midnight, 'minutes');
298
+ const dt = DateTime.fromJSDate(this.dateDataToDate(d));
299
+ const midnight = dt.startOf('day');
300
+ return dt.diff(midnight, 'minutes').minutes;
255
301
  }
256
302
  static getMinutesBetween(start, end) {
257
- const m = moment(start);
258
- const m2 = moment(end);
259
- return m2.diff(m, 'minutes');
260
- }
261
- /**
262
- * Parse json string with date serialized into string, and get proper date object back
263
- * @param s
264
- */
265
- static dateSafeJsonParse(s) {
266
- return JSON.parse(s, this.dateReviver);
267
- }
268
- static dateReviver(key, value) {
269
- if (DateFunc.isSerializedDate(value)) {
270
- return (new Date(value));
271
- }
272
- // If it's not a date-string, we want to return the value as-is. If we fail to return
273
- // a value, it will be omitted from the resultant data structure.
274
- return (value);
275
- }
276
- // I determine if the given value is a string that matches the serialized-date pattern.
277
- static isSerializedDate(value) {
278
- // Dates are serialized in TZ format, example: '1981-12-20T04:00:14.000Z'.
279
- const datePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
280
- return (DateFunc.isString(value) && datePattern.test(value));
281
- }
282
- // I determine if the given value is a String.
283
- static isString(value) {
284
- return ({}.toString.call(value) === '[object String]');
285
- }
286
- static dateSafeParse(s) {
287
- const m = moment(s);
288
- return m.toDate();
289
- }
290
- static composeDateWithMinutes(d, minute) {
291
- const m = moment(d);
292
- const midnight = moment(d).startOf('day'); // Mutates the original moment by setting it to the start of a unit of time. So I have better not to use m which wil be changed by calling this function
293
- midnight.add(minute, 'minutes');
294
- return midnight.toDate();
295
- }
296
- /**
297
- * Safe compare since date data may be considered as string rather than date.
298
- * @param d1
299
- * @param d2
300
- */
301
- static compare(d1, d2) {
302
- if (!d1 && !d2) {
303
- return 0;
304
- }
305
- if (!d1) {
306
- return -NaN;
307
- }
308
- if (!d2) {
309
- return NaN;
310
- }
311
- const dd1 = (new Date(d1)).valueOf();
312
- const dd2 = (new Date(d2)).valueOf();
313
- return dd1 - dd2;
303
+ const m = DateTime.fromJSDate(this.dateDataToDate(start));
304
+ const m2 = DateTime.fromJSDate(this.dateDataToDate(end));
305
+ return m2.diff(m, 'minutes').minutes;
314
306
  }
315
307
  }
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZUZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2RhdGVGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixNQUFNLE9BQU8sUUFBUTtJQUVwQjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEtBQThCO1FBQ2pFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNaLE9BQU8sQ0FBQyxDQUFDLENBQUMsNkNBQTZDO1FBQ3hELENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvQyxPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQThCO1FBQzNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUE4QjtRQUN2RCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFN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QUcsQ0FBQztJQUNsQixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRlRnVuYyB7XG5cblx0LyoqXG5cdCAqIFRyYW5zZm9ybSBVVEMgRGF0ZVRpbWUgdG8gbG9jYWwgZGF0ZSB3aXRob3V0IEgsIE0gYW5kIFMuIEZvciBleGFtcGxlLCB0aGUgbW9udGggZGF5IG9mIDIwMTgtMDEtMjNUMjI6MDA6MDBaIGlzIDI0IGluIEF1c3RyYWxpYS5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqIEBwYXJhbSBvZmZzZXRNaW51dGVzIGlmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGJlIG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKS4gLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlL2dldFRpbWV6b25lT2Zmc2V0XG5cdCAqL1xuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZU51bWJlcihkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuXHRcdGlmICghZHRVdGMpIHtcblx0XHRcdHJldHVybiAwOyAvLzAgaXMgYmV0dGVyIGZvciBjYWxjdWxhdGlvbiBieSB0aGUgY2xpZW50cy5cblx0XHR9XG5cblx0XHRjb25zdCBsb2NhbER0ID0gRGF0ZUZ1bmMuZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZVRpbWUoZHRVdGMpO1xuXHRcdGNvbnN0IGxvY2FsRE51bSA9IGxvY2FsRHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cblx0XHRyZXR1cm4gbG9jYWxETnVtO1xuXHR9XG5cblx0LyoqXG5cdCAqIERhdGUgb25seS4gSG93ZXZlciwgdGhlIGRhdGUgbWF5IHN0aWxsIGJlIGluIFVUQy5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqL1xuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZShkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHtcblx0XHRjb25zdCBsb2NhbER0ID0gRGF0ZUZ1bmMuZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZVRpbWUoZHRVdGMpO1xuXHRcdGNvbnN0IGxvY2FsRCA9IGxvY2FsRHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKGxvY2FsRCk7XG5cdH1cblxuXHRzdGF0aWMgbG9jYWxJU09EYXRlU3RyaW5nKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZHQgPSBtb21lbnQoZHRVdGMpLmxvY2FsKCk7XG5cdFx0cmV0dXJuIGR0LmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGxvY2F0ZSBkYXRlIE9OTFkgKG5vIHRpbWUpIHRvIFVUQyBkYXRlLlxuXHQgKiBAcGFyYW0gZHQgaWYgZHQgY29udGFpbiB0aW1lIGluZm8sIGl0IHdpbGwgYmVjb21lIGR0LnNldEhvdXJzKDAsIDAsIDAsIDApXG5cdCAqL1xuXHRzdGF0aWMgbG9jYWxEYXRlVG9VdGMoZDogRGF0ZSB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcpOiBEYXRlIHtcblx0XHRjb25zdCBkdCA9IG1vbWVudChkKS50b0RhdGUoKTtcblx0XHRjb25zdCBuID0gZHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cdFx0Y29uc3Qgb2Zmc2V0ID0gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xuXHRcdHJldHVybiBuZXcgRGF0ZShuICsgb2Zmc2V0KTtcblx0fVxuXG5cdHN0YXRpYyBnZXRUaW1lem9uZU9mZnNldCgpOiBudW1iZXIge1xuXHRcdGNvbnN0IGR0ID0gdGhpcy50b2RheTtcblx0XHRyZXR1cm4gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2Zvcm0gVVRDIERhdGVUaW1lIHRvIGxvY2FsIGRhdGVUaW1lLlxuXHQgKiBAcGFyYW0gZHRVdGNcblx0ICogQHBhcmFtIG9mZnNldE1pbnV0ZXMgaWYgbm90IGRlZmluZWQsIGl0IHdpbGwgYmUgbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpLiAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvZ2V0VGltZXpvbmVPZmZzZXRcblx0ICovXG5cdHN0YXRpYyBkYXRlVGltZVV0Y1RvTG9jYWxEYXRlVGltZShkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHtcblx0XHRjb25zdCBzdGlsbFV0YyA9IG1vbWVudC51dGMoZHRVdGMpLnRvRGF0ZSgpO1xuXHRcdHJldHVybiBtb21lbnQoc3RpbGxVdGMpLmxvY2FsKCkudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FNb21lbnQoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogbW9tZW50Lk1vbWVudCB7XG5cdFx0Y29uc3Qgc3RpbGxVdGMgPSBtb21lbnQudXRjKGR0VXRjKTtcblx0XHRyZXR1cm4gc3RpbGxVdGMubG9jYWwoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRFbmRPZldlZWsoZHQ6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHwgbnVtYmVyKSB7XG5cdFx0cmV0dXJuIG1vbWVudChkdCkuZW5kT2YoJ2lzb1dlZWsnKS50b0RhdGUoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRTdGFydE9mV2VlayhkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpIHtcblx0XHRyZXR1cm4gbW9tZW50KGR0KS5zdGFydE9mKCdpc29XZWVrJykudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RW5kT2ZNb250aChkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpIHtcblx0XHQvLyAgcmV0dXJuIG5ldyBEYXRlKGR0LmdldEZ1bGxZZWFyKCksIGR0LmdldE1vbnRoKCkgKyAxLCAwLCAyMywgNTksIDU5LCA5OTkpO1xuXHRcdHJldHVybiBtb21lbnQoZHQpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpO1xuXHR9XG5cblx0c3RhdGljIGdldFN0YXJ0T2ZNb250aChkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpIHtcblx0XHRyZXR1cm4gbW9tZW50KGR0KS5zdGFydE9mKCdtb250aCcpLnRvRGF0ZSgpO1xuXHR9XG5cblx0c3RhdGljIGdldERheXNCZXR3ZWVuRGF0ZXMoZHQxOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZHQyOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB0aGlzLmdldERheXNCZXR3ZWVuKGR0MSwgZHQyKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRFbmRPZkRhdGUoZHQ6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB7XG5cdFx0cmV0dXJuIGR0ID8gbmV3IERhdGUoZHQuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KSkgOlxuXHRcdFx0bmV3IERhdGUodGhpcy5ub3cuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KSk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0U3RhcnRPZkRhdGUoZHQ6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB7XG5cdFx0cmV0dXJuIG1vbWVudChkdCkuc3RhcnRPZignZGF5JykudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RW5kT2ZUb2RheSgpOiBEYXRlIHtcblx0XHQvL1x0cmV0dXJuIG5ldyBEYXRlKChuZXcgRGF0ZShEYXRlLm5vdygpKSkuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KSk7XG5cdFx0cmV0dXJuIG1vbWVudChEYXRlLm5vdygpKS5lbmRPZignZGF5JykudG9EYXRlKCk7XG5cblx0fVxuXG5cdHN0YXRpYyBnZXRTdGFydE9mVG9kYXkoKTogRGF0ZSB7XG5cdFx0Ly9cdHJldHVybiBuZXcgRGF0ZSgobmV3IERhdGUoRGF0ZS5ub3coKSkpLnNldEhvdXJzKDAsIDAsIDAsIDApKTtcblx0XHRyZXR1cm4gbW9tZW50KERhdGUubm93KCkpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpO1xuXHR9XG5cblx0Ly9pbnNwaXJlZCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjM0MDYvYWRkLWRheXMtdG8tamF2YXNjcmlwdC1kYXRlXG5cdHN0YXRpYyBhZGREYXlzKGR0OiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGF5czogbnVtYmVyID0gMCkge1xuXHRcdGNvbnN0IGRhdCA9IG1vbWVudChkdCk7XG5cdFx0ZGF0LmFkZChkYXlzLCAnZGF5cycpO1xuXHRcdHJldHVybiBkYXQudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgc3VidHJhY3REYXlzKGR0OiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGF5czogbnVtYmVyID0gMCkge1xuXHRcdGNvbnN0IGRhdCA9IG1vbWVudChkdCk7XG5cdFx0ZGF0LnN1YnRyYWN0KGRheXMsICdkYXlzJyk7XG5cdFx0cmV0dXJuIGRhdC50b0RhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCBvZiB0b2RheVxuXHQgKi9cblx0c3RhdGljIGdldCB0b2RheSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGFydE9mVG9kYXkoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXQgbm93KCk6IERhdGUge1xuXHRcdHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpKTtcblx0fVxuXG5cdHN0YXRpYyBnZXROZXh0NU1pbnV0ZU1hcmsoKTogRGF0ZSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudCgpLnNldCgnc2Vjb25kJywgMCkuc2V0KCdtaWxsaXNlY29uZCcsIDApO1xuXHRcdGNvbnN0IG1pbnV0ZSA9IG0ubWludXRlKCk7XG5cdFx0Y29uc3QgbW9kID0gbWludXRlICUgNTtcblx0XHRpZiAobW9kKSB7XG5cdFx0XHRjb25zdCBkZWx0YSA9IDUgLSBtb2Q7XG5cdFx0XHRyZXR1cm4gbS5hZGQoZGVsdGEsICdtJykudG9EYXRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG0udG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0WU1EKGQ6IERhdGUpIHtcblx0XHRyZXR1cm4gbW9tZW50KGQpLmZvcm1hdCgnWVlZWU1NREQnKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRETVlXaXRoU2xhc2goZDogRGF0ZSkge1xuXHRcdHJldHVybiBtb21lbnQoZCkuZm9ybWF0KCdERC9NTS9ZWVlZJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RE1ZSG1XaXRoU2xhc2goZDogRGF0ZSkge1xuXHRcdHJldHVybiBtb21lbnQoZCkuZm9ybWF0KCdERC9NTS9ZWVlZIEhIOm1tJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TWNwVGltZShkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gbW9tZW50KGR0KS5mb3JtYXQoJ0hIOm1tOnNzLlNTU1onKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbiAyNCBob3VyIGZvcm1hdFxuXHQgKiBAcGFyYW0gZHRVdGNcblx0ICovXG5cdHN0YXRpYyBnZXRMb2NhbERNWUhtV2l0aFNsYXNoKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGQgPSBEYXRlRnVuYy5kYXRlVGltZVV0Y1RvTG9jYWxEYXRlVGltZShkdFV0Yyk7XG5cdFx0cmV0dXJuIG1vbWVudChkKS5mb3JtYXQoJ0REL01NL1lZWVkgSEg6bW0nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPZmZzZXQgbWludXRlcyBjb21wYXJpbmcgd2l0aCB0b2RheVxuXHQgKi9cblx0c3RhdGljIGdldE9mZnNldE1pbnV0ZXMoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHwgbnVtYmVyKTogbnVtYmVyIHtcblx0XHRjb25zdCBkbTEgPSBtb21lbnQoZHRVdGMpO1xuXHRcdGNvbnN0IGRtMiA9IG1vbWVudChuZXcgRGF0ZSgpLnNldEhvdXJzKDAsIDAsIDAsIDApKTtcblx0XHRyZXR1cm4gZG0xLmRpZmYoZG0yLCAnbWludXRlcycpO1xuXHR9XG5cblx0c3RhdGljIGdldERheXNCZXR3ZWVuKGQxPzogRGF0ZSB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGQyPzogRGF0ZSB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuXHRcdGNvbnN0IGRtMSA9IG1vbWVudChkMSk7XG5cdFx0Y29uc3QgZG0yID0gbW9tZW50KGQyKTtcblx0XHRyZXR1cm4gZG0yLmRpZmYoZG0xLCAnZGF5cycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBob3VyIG9mIHRoZSBkYXRlLiBJZiBEYXRlIGlzIG5vdCBkZWZpbmVkLCB0aGUgaG91ciB3aWxsIGJlIGN1cnJlbnQgaG91ci5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqL1xuXHRzdGF0aWMgZ2V0SG91cihkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpOiBudW1iZXIge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZHRVdGMpO1xuXHRcdHJldHVybiBtLmhvdXJzKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TWludXRlKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB8IG51bWJlcik6IG51bWJlciB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudChkdFV0Yyk7XG5cdFx0cmV0dXJuIG0ubWludXRlcygpO1xuXHR9XG5cblx0c3RhdGljIGNvbXBvc2VEYXRlVGltZShkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIGg6IG51bWJlciA9IDAsIG1pbnV0ZTogbnVtYmVyID0gMCk6IERhdGUge1xuXHRcdGNvbnN0IG10ID0gbW9tZW50KGR0KTtcblx0XHRyZXR1cm4gbmV3IERhdGUobXQudG9EYXRlKCkuc2V0SG91cnMoaCwgbWludXRlLCAwLCAwKSk7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuMjRIb3VycyhkOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZCk7XG5cdFx0cmV0dXJuIG1vbWVudCgpLmRpZmYobSwgJ2hvdXJzJykgPj0gMjQ7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuMjRIb3Vyc1V0YyhkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gRGF0ZUZ1bmMuZ2V0SG91ckFnZVV0YyhkdFV0YykgPj0gMjQ7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuSG91cnMoZDogRGF0ZSwgaG91cnM6IG51bWJlcikge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZCk7XG5cdFx0cmV0dXJuIG1vbWVudCgpLmRpZmYobSwgJ2hvdXJzJykgPj0gaG91cnM7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuSG91cnNVdGMoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBob3VyczogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIERhdGVGdW5jLmdldEhvdXJBZ2VVdGMoZHRVdGMpID49IGhvdXJzO1xuXHR9XG5cblx0c3RhdGljIG9sZGVyVGhhbk1pbnV0ZXMoZDogRGF0ZSwgbWludXRlczogbnVtYmVyKSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudChkKTtcblx0XHRyZXR1cm4gbW9tZW50KCkuZGlmZihtLCAnbWludXRlcycpID49IG1pbnV0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogSXQgY291bGQgYmUgMTFQTSB5ZXN0ZXJkYXksIGFuZCAxIEFNIHRvZGF5LiBBY3R1YWxseSBiYXNlZCBvbiBsb2NhbCB0b2RheS5cblx0ICovXG5cdHN0YXRpYyBvbGRlclRoYW4xRGF5KGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBEYXRlRnVuYy5nZXREYXlBZ2VVdGMoZHRVdGMpID4gMDtcblx0fVxuXG5cdHN0YXRpYyBnZXRIb3VyQWdlKGQ6IERhdGUpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KGQpO1xuXHRcdHJldHVybiBtb21lbnQoKS5kaWZmKG0sICdob3VycycpO1xuXHR9XG5cblx0c3RhdGljIGdldEhvdXJBZ2VVdGMoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudC51dGMoZHRVdGMpO1xuXHRcdHJldHVybiBtb21lbnQudXRjKCkuZGlmZihtLCAnaG91cnMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wYXJlIHV0YyBkYXRlIHdpdGggdXRjIG5vdy5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqL1xuXHRzdGF0aWMgZ2V0RGF5QWdlVXRjKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQudXRjKGR0VXRjKTtcblx0XHRyZXR1cm4gbW9tZW50LnV0YygpLmRpZmYobSwgJ2RheXMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIb3cgbWFueSB5ZWFycyBmcm9tIG5vdy5cblx0ICogQHBhcmFtIGQgXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0c3RhdGljIGdldEFnZShkOiBEYXRlKSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudChkKTtcblx0XHRyZXR1cm4gbW9tZW50KCkuZGlmZihtLCAneWVhcnMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBZZWFyIG9mIGRhdGUuXG5cdCAqIEBwYXJhbSBkIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHN0YXRpYyBnZXRZZWFyKGQ6IERhdGUpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KGQpO1xuXHRcdHJldHVybiBtLnllYXIoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRVdGNOb3coKTogRGF0ZSB7XG5cdFx0cmV0dXJuIG1vbWVudC51dGMoKS50b0RhdGUoKTtcblx0fVxuXG5cdHN0YXRpYyBhZGRNaW51dGVzKGQ6IERhdGUsIG06IG51bWJlcik6IERhdGUge1xuXHRcdHJldHVybiBtb21lbnQoZCkuYWRkKG0sICdtJykudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgYWRkTW9udGgoZDogRGF0ZSwgbTogbnVtYmVyKTogRGF0ZSB7XG5cdFx0cmV0dXJuIG1vbWVudChkKS5hZGQobSwgJ00nKS50b0RhdGUoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXREdXJhdGlvbihkMTogRGF0ZSwgZDI6IERhdGUpIHtcblx0XHRjb25zdCBtZDEgPSBtb21lbnQoZDEpO1xuXHRcdGNvbnN0IG1kMiA9IG1vbWVudChkMik7XG5cdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbihtZDIuZGlmZihtZDEpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IG1pbnV0ZXMgZnJvbSBtaWRuaWdodCB0byBISDptbSB0ZXh0XG5cdCAqIEBwYXJhbSBtaW5zXG5cdCAqL1xuXHRzdGF0aWMgZ2V0SE1Gcm9tTWlucyhtaW5zOiBudW1iZXIpOiBzdHJpbmcge1xuXHRcdC8vIGRvIG5vdCBpbmNsdWRlIHRoZSBmaXJzdCB2YWxpZGF0aW9uIGNoZWNrIGlmIHlvdSB3YW50LCBmb3IgZXhhbXBsZSxcblx0XHQvLyBnZXRUaW1lRnJvbU1pbnMoMTUzMCkgdG8gZXF1YWwgZ2V0VGltZUZyb21NaW5zKDkwKSAoaS5lLiBtaW5zIHJvbGxvdmVyKVxuXHRcdGlmIChtaW5zID49IDI0ICogNjAgfHwgbWlucyA8IDApIHtcblx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdWYWxpZCBpbnB1dCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiAxNDQwLicpO1xuXHRcdH1cblx0XHRjb25zdCBoID0gbWlucyAvIDYwIHwgMCxcblx0XHRcdG0gPSBtaW5zICUgNjAgfCAwO1xuXHRcdHJldHVybiBtb21lbnQudXRjKCkuaG91cnMoaCkubWludXRlcyhtKS5mb3JtYXQoJ0hIOm1tJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TWludXRlc1NpbmNlTWlkbmlnaHQoZDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KGQpO1xuXHRcdGNvbnN0IG1pZG5pZ2h0ID0gbW9tZW50KGQpLnN0YXJ0T2YoJ2RheScpOyAvL011dGF0ZXMgdGhlIG9yaWdpbmFsIG1vbWVudCBieSBzZXR0aW5nIGl0IHRvIHRoZSBzdGFydCBvZiBhIHVuaXQgb2YgdGltZS4gU28gSSBoYXZlIGJldHRlciBub3QgdG8gdXNlIG0gd2hpY2ggd2lsIGJlIGNoYW5nZWQgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uXG5cdFx0cmV0dXJuIG0uZGlmZihtaWRuaWdodCwgJ21pbnV0ZXMnKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRNaW51dGVzQmV0d2VlbihzdGFydDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIGVuZDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KHN0YXJ0KTtcblx0XHRjb25zdCBtMiA9IG1vbWVudChlbmQpO1xuXHRcdHJldHVybiBtMi5kaWZmKG0sICdtaW51dGVzJyk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UganNvbiBzdHJpbmcgd2l0aCBkYXRlIHNlcmlhbGl6ZWQgaW50byBzdHJpbmcsIGFuZCBnZXQgcHJvcGVyIGRhdGUgb2JqZWN0IGJhY2tcblx0ICogQHBhcmFtIHNcblx0ICovXG5cdHN0YXRpYyBkYXRlU2FmZUpzb25QYXJzZShzOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShzLCB0aGlzLmRhdGVSZXZpdmVyKTtcblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIGRhdGVSZXZpdmVyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0aWYgKERhdGVGdW5jLmlzU2VyaWFsaXplZERhdGUodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gKG5ldyBEYXRlKHZhbHVlKSk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgaXQncyBub3QgYSBkYXRlLXN0cmluZywgd2Ugd2FudCB0byByZXR1cm4gdGhlIHZhbHVlIGFzLWlzLiBJZiB3ZSBmYWlsIHRvIHJldHVyblxuXHRcdC8vIGEgdmFsdWUsIGl0IHdpbGwgYmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHRhbnQgZGF0YSBzdHJ1Y3R1cmUuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cblx0fVxuXG5cblx0Ly8gSSBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgc2VyaWFsaXplZC1kYXRlIHBhdHRlcm4uXG5cdHByaXZhdGUgc3RhdGljIGlzU2VyaWFsaXplZERhdGUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuXHRcdC8vIERhdGVzIGFyZSBzZXJpYWxpemVkIGluIFRaIGZvcm1hdCwgZXhhbXBsZTogJzE5ODEtMTItMjBUMDQ6MDA6MTQuMDAwWicuXG5cdFx0Y29uc3QgZGF0ZVBhdHRlcm4gPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9XFwuXFxkezN9WiQvO1xuXHRcdHJldHVybiAoRGF0ZUZ1bmMuaXNTdHJpbmcodmFsdWUpICYmIGRhdGVQYXR0ZXJuLnRlc3QodmFsdWUpKTtcblx0fVxuXG5cblx0Ly8gSSBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgU3RyaW5nLlxuXHRwcml2YXRlIHN0YXRpYyBpc1N0cmluZyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICh7fS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgU3RyaW5nXScpO1xuXHR9XG5cblx0c3RhdGljIGRhdGVTYWZlUGFyc2Uoczogc3RyaW5nIHwgRGF0ZSkge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQocyk7XG5cdFx0cmV0dXJuIG0udG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgY29tcG9zZURhdGVXaXRoTWludXRlcyhkOiBEYXRlLCBtaW51dGU6IG51bWJlcik6IERhdGUge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZCk7XG5cdFx0Y29uc3QgbWlkbmlnaHQgPSBtb21lbnQoZCkuc3RhcnRPZignZGF5Jyk7IC8vIE11dGF0ZXMgdGhlIG9yaWdpbmFsIG1vbWVudCBieSBzZXR0aW5nIGl0IHRvIHRoZSBzdGFydCBvZiBhIHVuaXQgb2YgdGltZS4gU28gSSBoYXZlIGJldHRlciBub3QgdG8gdXNlIG0gd2hpY2ggd2lsIGJlIGNoYW5nZWQgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uXG5cdFx0bWlkbmlnaHQuYWRkKG1pbnV0ZSwgJ21pbnV0ZXMnKTtcblx0XHRyZXR1cm4gbWlkbmlnaHQudG9EYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2FmZSBjb21wYXJlIHNpbmNlIGRhdGUgZGF0YSBtYXkgYmUgY29uc2lkZXJlZCBhcyBzdHJpbmcgcmF0aGVyIHRoYW4gZGF0ZS5cblx0ICogQHBhcmFtIGQxXG5cdCAqIEBwYXJhbSBkMlxuXHQgKi9cblx0c3RhdGljIGNvbXBhcmUoZDE6IERhdGUgfCB1bmRlZmluZWQsIGQyOiBEYXRlIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0XHRpZiAoIWQxICYmICFkMikge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0aWYgKCFkMSkge1xuXHRcdFx0cmV0dXJuIC1OYU5cblx0XHR9XG5cblx0XHRpZiAoIWQyKSB7XG5cdFx0XHRyZXR1cm4gTmFOO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRkMSA9IChuZXcgRGF0ZShkMSkpLnZhbHVlT2YoKTtcblx0XHRjb25zdCBkZDIgPSAobmV3IERhdGUoZDIpKS52YWx1ZU9mKCk7XG5cdFx0cmV0dXJuIGRkMSAtIGRkMjtcblx0fVxufVxuXG4iXX0=
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZUZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2RhdGVGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVyRCxNQUFNLE9BQU8sUUFBUTtJQUNwQjs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQTBCO1FBQy9DLElBQUksRUFBRSxZQUFZLElBQUksRUFBQyxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO2dCQUNiLE1BQU0sSUFBSSxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUMsQ0FBQztZQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxPQUFPLEVBQUUsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLElBQUksU0FBUyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMs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QUFDLENBQUMsT0FBTyxDQUFDO0lBQ3RDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVUaW1lLCBEdXJhdGlvbiwgU2V0dGluZ3MgfSBmcm9tICdsdXhvbic7XHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZUZ1bmMge1xyXG5cdC8qKlxyXG5cdCAqIEF0IHJ1bnRpbWUsIHRoZXJlJ3Mgbm8gc2ltcGxlIGd1YXJhbnRlZSB0aGF0IHRoZSBpbnB1dCBpcyBEYXRlLiBTb21ldGltZXMgeW91IGNvZGVzIGV4cGVjdCBkYXRlLCBidXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIFdlYiBzZXJ2aWNlIG1heSBnaXZlIHlvdSBzdHJpbmcgb3IgbnVtYmVyLlxyXG5cdCAqIFRoaXMgZnVuY3Rpb24gZ2l2ZSB5b3Ugc2FmZSBwYXJzZSBvZiBkYXRlIGRhdGEgZnJvbSBJL08sIG5vdCBvZiB5b3VyIGNvbnRyb2wuXHJcblx0ICogSWYgdGhlIGRhdGEgaXMgaW52YWxpZCwgdGhyb3dzIFJhbmdlRXJyb3Igb3IgVHlwZUVycm9yLlxyXG5cdCAqIEBwYXJhbSBkdCBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZURhdGFUb0RhdGUoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRpZiAoZHQgaW5zdGFuY2VvZiBEYXRlKXtcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgZHQgPT09ICdzdHJpbmcnKXtcclxuXHRcdFx0Y29uc3QgciA9IERhdGUucGFyc2UoZHQpO1xyXG5cdFx0XHRpZiAoaXNOYU4ocikpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0cmluZyBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IERhdGUocik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ251bWJlcicpe1xyXG5cdFx0XHRjb25zdCByZCA9IG5ldyBEYXRlKGR0KVxyXG5cdFx0XHRpZiAoTnVtYmVyLmlzTmFOKHJkLnZhbHVlT2YoKSkpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIG51bWJlciBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmQ7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0IERhdGUsIHN0cmluZyBvciBudW1iZXInKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNpbWlsYXIgdG8gZGF0ZURhdGFUb0RhdGUsIGJ1dCBhbGxvdyBudWxsIGFuZCBkZWZpbmVkIHNlbWFudGljYWxseS5cclxuXHQgKiBAcGFyYW0gZHQgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIGRhdGVEYXRhVG9EYXRlT3JOdWxsKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCkgOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAoZHQgaW5zdGFuY2VvZiBEYXRlKXtcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgZHQgPT09ICdzdHJpbmcnKXtcclxuXHRcdFx0Y29uc3QgciA9IERhdGUucGFyc2UoZHQpO1xyXG5cdFx0XHRpZiAoaXNOYU4ocikpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0cmluZyBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IERhdGUocik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ251bWJlcicpe1xyXG5cdFx0XHRjb25zdCByZCA9IG5ldyBEYXRlKGR0KVxyXG5cdFx0XHRpZiAoTnVtYmVyLmlzTmFOKHJkLnZhbHVlT2YoKSkpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIG51bWJlciBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGR0ID09IG51bGwpeyBcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdCBEYXRlLCBzdHJpbmcgb3IgbnVtYmVyJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2Zvcm0gVVRDIERhdGVUaW1lIHRvIGxvY2FsIGRhdGUgd2l0aG91dCBILCBNIGFuZCBTLiBGb3IgZXhhbXBsZSwgdGhlIG1vbnRoIGRheSBvZiAyMDE4LTAxLTIzVDIyOjAwOjAwWiBpcyAyNCBpbiBBdXN0cmFsaWEuXHJcblx0ICogQHBhcmFtIGR0VXRjXHJcblx0ICovXHJcblx0c3RhdGljIGRhdGVUaW1lVXRjVG9Mb2NhbERhdGVOdW1iZXIoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAoZHRVdGMgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHRVdGM7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxEdCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpO1xyXG5cdFx0Y29uc3QgbG9jYWxETnVtID0gbG9jYWxEdC5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuXHJcblx0XHRyZXR1cm4gbG9jYWxETnVtO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGF0ZSBvbmx5LiBIb3dldmVyLCB0aGUgZGF0ZSBtYXkgc3RpbGwgYmUgaW4gVVRDLlxyXG5cdCAqIEBwYXJhbSBkdFV0Y1xyXG5cdCAqIEByZXR1cm5zIG5ldyBEYXRlIG9iamVjdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZShkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAoZHRVdGMgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHRVdGM7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxEdCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpO1xyXG5cdFx0Y29uc3QgbG9jYWxOdW0gPSBsb2NhbER0LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKGxvY2FsTnVtKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqICcyMDE4LTAxLTIzVDIyOjAwOjAwWicgd2lsbCBiZWNvbWUgJzIwMTgtMDEtMjQnIGluIEF1c3RyYWxpYS5cclxuXHQgKiBAcGFyYW0gZHRVdGMgXHJcblx0ICogQHJldHVybnMgIG5ldyBEYXRlIG9iamVjdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgbG9jYWxJU09EYXRlU3RyaW5nKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1x0XHRcclxuXHQgICAgY29uc3QgZHQgPSB0aGlzLmRhdGVUaW1lVXRjVG9Mb2NhbERhdGUoZHRVdGMpO1xyXG5cdFx0aWYgKGR0ID09IG51bGwpIHtcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGQ9IERhdGVUaW1lLmZyb21KU0RhdGUoZHQpO1xyXG5cdFx0cmV0dXJuIGQudG9JU09EYXRlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBsb2NhbCBkYXRlIE9OTFkgKG5vIHRpbWUpIHRvIFVUQyBkYXRlLlxyXG5cdCAqIFRoZSBpbnB1dCBjb3VsZCBiZSBhIHN0cmluZyBvZiB5eXl5LU1NLWRkLCBvciBhIERhdGUgT2JqZWN0LlxyXG5cdCAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVcclxuXHQgKiBXaGlsZSB0aGUgdGltZSB2YWx1ZSBhdCB0aGUgaGVhcnQgb2YgYSBEYXRlIG9iamVjdCBpcyBVVEMsIHRoZSBiYXNpYyBtZXRob2RzIHRvIGZldGNoIHRoZSBkYXRlIGFuZCB0aW1lIFxyXG5cdCAqIG9yIGl0cyBjb21wb25lbnRzIGFsbCB3b3JrIGluIHRoZSBsb2NhbCAoaS5lLiBob3N0IHN5c3RlbSkgdGltZSB6b25lIGFuZCBvZmZzZXQuXHJcblx0ICogQHBhcmFtIGR0IGlmIGR0IGNvbnRhaW4gdGltZSBpbmZvLCBpdCB3aWxsIGJlY29tZSBkdC5zZXRIb3VycygwLCAwLCAwLCAwKVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBsb2NhbERhdGVUb1V0YyhkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZyk6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuXHRcdGlmIChkID09IG51bGwpIHtcclxuXHRcdFx0cmV0dXJuIGQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZHQgPSB0aGlzLmRhdGVEYXRhVG9EYXRlKGQpO1xyXG5cdFx0Y29uc3QgbiA9IGR0LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKG4gKyBvZmZzZXQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mV2VlayhkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGNvbnN0IGRhdGVUaW1lID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KSk7XHJcblx0XHRyZXR1cm4gZGF0ZVRpbWUuZW5kT2YoJ3dlZWsnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZXZWVrKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5zdGFydE9mKCd3ZWVrJykudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRFbmRPZk1vbnRoKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5lbmRPZignbW9udGgnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZNb250aChkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGNvbnN0IGRhdGVUaW1lID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KSk7XHJcblx0XHRyZXR1cm4gZGF0ZVRpbWUuc3RhcnRPZignbW9udGgnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mRGF0ZShkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5lbmRPZignZGF5JykudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRTdGFydE9mRGF0ZShkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5zdGFydE9mKCdkYXknKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mVG9kYXkoKTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQge1xyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RW5kT2ZEYXRlKERhdGUubm93KCkpO1xyXG5cclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRTdGFydE9mVG9kYXkoKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGFydE9mRGF0ZShEYXRlLm5vdygpKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXREYXlzQmV0d2VlbihkMTogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgZDI6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgZG0xID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQxKSk7XHJcblx0XHRjb25zdCBkbTIgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZDEpKTtcclxuXHRcdHJldHVybiBkbTIuZGlmZihkbTEsICdkYXlzJykuZGF5cztcclxuXHR9XHJcblxyXG5cdC8vaW5zcGlyZWQgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTYzNDA2L2FkZC1kYXlzLXRvLWphdmFzY3JpcHQtZGF0ZVxyXG5cdHN0YXRpYyBhZGREYXlzKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBkYXlzOiBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdGNvbnN0IHIgPSBkYXQucGx1cyh7ZGF5czogZGF5c30pO1xyXG5cdFx0cmV0dXJuIHIudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0IG9mIHRvZGF5XHJcblx0ICovXHJcblx0c3RhdGljIGdldCB0b2RheSgpOiBEYXRlIHtcclxuXHRcdHJldHVybiB0aGlzLmdldFN0YXJ0T2ZUb2RheSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldCBub3coKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcm9tIG5vdywgbmV4dCA1IG1pbnV0ZSBtYXJrLiBGb3IgZXhhbXBsZSAyOjIzOjQ0IHdpbGwgYmUgMjoyNTowMDtcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0TmV4dDVNaW51dGVNYXJrKCk6IERhdGUge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLm5vdygpLnNldCh7c2Vjb25kOiAwLCBtaWxsaXNlY29uZDowfSk7XHJcblx0XHRjb25zdCBtaW51dGUgPSBtLm1pbnV0ZTtcclxuXHRcdGNvbnN0IG1vZCA9IG1pbnV0ZSAlIDU7XHJcblx0XHRpZiAobW9kKSB7XHJcblx0XHRcdGNvbnN0IGRlbHRhID0gNSAtIG1vZDtcclxuXHRcdFx0cmV0dXJuIG0ucGx1cyh7bWludXRlczogZGVsdGF9KS50b0pTRGF0ZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0WU1EKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBkdC50b0Zvcm1hdCgneXl5eU1NZGQnKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRETVlXaXRoU2xhc2goZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIGR0LnRvRm9ybWF0KCdkZC9NTS95eXl5Jyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RE1ZSG1XaXRoU2xhc2goZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIGR0LnRvRm9ybWF0KCdkZC9NTS95eXl5IEhIOm1tJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZHRVdGMgSW4gMjQgaG91ciBmb3JtYXQsIGFuZCB0aGUgZGF0ZSBzZXBhcmF0b3IgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0gb3IgTHV4b24gZGVmYXVsdCBsb2NhbGVcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0RGF0ZVRpbWUyNFNpbXBsZShkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkdFV0YyA9PSBudWxsKSB7XHJcblx0XHRcdHJldHVybiBkdFV0YztcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Y29uc3QgZCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpO1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKGQpO1xyXG5cdFx0cmV0dXJuIGR0LnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpICsgJyAnICsgZHQudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuVElNRV8yNF9TSU1QTEUpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNldERlZmF1bHRMb2NhbGUobG9jYWxlOiBzdHJpbmcpe1xyXG5cdFx0U2V0dGluZ3MuZGVmYXVsdExvY2FsZT1sb2NhbGU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RGVmYXVsdExvY2FsZSgpe1xyXG5cdFx0cmV0dXJuIFNldHRpbmdzLmRlZmF1bHRMb2NhbGU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc2V0RGVmYXVsdFpvbmUoem9uZTogc3RyaW5nKXtcclxuXHRcdFNldHRpbmdzLmRlZmF1bHRab25lPXpvbmU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RGVmYXVsdFpvbmUoKSA6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gU2V0dGluZ3MuZGVmYXVsdFpvbmUubmFtZTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBpc1pvbmVWYWxpZCgpOiBib29sZWFue1xyXG5cdFx0cmV0dXJuIFNldHRpbmdzLmRlZmF1bHRab25lLmlzVmFsaWQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGb3IgZXhhbXBsZSwgaW4gQUVTVCwgaXQgaXMgLTYwMC5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0TG9jYWxUaW1lem9uZU9mZnNldCgpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgZHQgPSBuZXcgRGF0ZShEYXRlLm5vdygpKTtcclxuXHRcdHJldHVybiBkdC5nZXRUaW1lem9uZU9mZnNldCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IGhvdXIgb2YgdGhlIGRhdGUuIElmIERhdGUgaXMgbm90IGRlZmluZWQsIHRoZSBob3VyIHdpbGwgYmUgY3VycmVudCBob3VyLlxyXG5cdCAqIEBwYXJhbSBkdFV0Y1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRIb3VyKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0VXRjKSk7XHJcblx0XHRyZXR1cm4gZHQuaG91cjtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRNaW51dGUoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpKTtcclxuXHRcdHJldHVybiBkdC5taW51dGU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgR2V0SE0oZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiB7aDogbnVtYmVyLCBtOiBudW1iZXJ9e1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpKTtcclxuXHRcdHJldHVybiB7aDogZHQuaG91ciwgbTogZHQubWludXRlfTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjb21wb3NlRGF0ZVRpbWUoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIGg6IG51bWJlciA9IDAsIG1pbnV0ZTogbnVtYmVyID0gMCwgc2Vjb25kOiBudW1iZXIgPSAwKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUoIHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpLnNldEhvdXJzKGgsIG1pbnV0ZSwgc2Vjb25kLCAwKSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgb2xkZXJUaGFuMjRIb3VycyhkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdob3VycycpID49IER1cmF0aW9uLmZyb21JU08oJ1BUMjRIJyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgb2xkZXJUaGFuSG91cnMoZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgaG91cnM6IG51bWJlcikgOiBib29sZWFuIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0Y29uc3QgZGlmZiA9IERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ2hvdXJzJyk7IFxyXG5cdFx0Y29uc3QgZHVyYXRpb24gPSBEdXJhdGlvbi5mcm9tSVNPKGBQVCR7aG91cnN9SGApO1xyXG5cdFx0Y29uc29sZS5kZWJ1ZygnZGlmZjogJyArIGRpZmYuaG91cnMgKyAnICAgZHVyYXRpb246ICcgKyBkdXJhdGlvbi5ob3Vycyk7XHJcblx0XHRyZXR1cm4gZGlmZi5ob3VycyA+PSBkdXJhdGlvbi5ob3VycztcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBvbGRlclRoYW5NaW51dGVzKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIG1pbnV0ZXM6IG51bWJlcikge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRyZXR1cm4gRGF0ZVRpbWUubm93KCkuZGlmZihtLCAnbWludXRlcycpID49IER1cmF0aW9uLmZyb21NaWxsaXMobWludXRlcyo2MCoxMDAwKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IGNvdWxkIGJlIDExUE0geWVzdGVyZGF5LCBhbmQgMSBBTSB0b2RheS4gQWN0dWFsbHkgYmFzZWQgb24gbG9jYWwgdG9kYXkuXHJcblx0ICovXHJcblx0c3RhdGljIG9sZGVyVGhhbjFEYXkoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBEYXRlRnVuYy5nZXREYXlBZ2UoZHRVdGMpID4gMDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRIb3VyQWdlKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ2hvdXJzJykuaG91cnM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wYXJlIGRhdGUgd2l0aCBub3cuXHJcblx0ICogQHBhcmFtIGR0VXRjXHJcblx0ICovXHJcblx0c3RhdGljIGdldERheUFnZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdkYXlzJykuZGF5cztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhvdyBtYW55IHllYXJzIGZyb20gbm93LlxyXG5cdCAqIEBwYXJhbSBkXHJcblx0ICogQHJldHVybnNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0QWdlKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ3llYXJzJykueWVhcnM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IG1pbnV0ZXMgZnJvbSBtaWRuaWdodCB0byBISDptbSB0ZXh0XHJcblx0ICogQHBhcmFtIG1pbnV0ZXNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0SE1Gcm9tTWlucyhtaW51dGVzOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cdFx0aWYgKG1pbnV0ZXMgPj0gMjQgKiA2MCB8fCBtaW51dGVzIDwgMCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcignVmFsaWQgaW5wdXQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzIHRoYW4gMTQ0MC4nKTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGggPSBtaW51dGVzIC8gNjAgfCAwLFxyXG5cdFx0XHRtID0gbWludXRlcyAlIDYwIHwgMDtcclxuXHRcdHJldHVybiBEYXRlVGltZS51dGMoKS5zZXQoe2hvdXI6IGgsIG1pbnV0ZTogbX0pLnRvRm9ybWF0KCdISDptbScpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldE1pbnV0ZXNTaW5jZU1pZG5pZ2h0KGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdGNvbnN0IG1pZG5pZ2h0ID0gZHQuc3RhcnRPZignZGF5Jyk7XHJcblx0XHRyZXR1cm4gZHQuZGlmZihtaWRuaWdodCwgJ21pbnV0ZXMnKS5taW51dGVzO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldE1pbnV0ZXNCZXR3ZWVuKHN0YXJ0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBlbmQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoc3RhcnQpKTtcclxuXHRcdGNvbnN0IG0yID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGVuZCkpO1xyXG5cdFx0cmV0dXJuIG0yLmRpZmYobSwgJ21pbnV0ZXMnKS5taW51dGVzO1xyXG5cdH1cclxufVxyXG5cclxuIl19