nmce-func 1.3.2 → 1.4.1

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,175 @@
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();
153
+ }
154
+ static addMonths(dt, months) {
155
+ const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
156
+ const r = dat.plus({ months: months });
157
+ return r.toJSDate();
158
+ }
159
+ static addYears(dt, years) {
160
+ const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
161
+ const r = dat.plus({ years: years });
162
+ return r.toJSDate();
163
+ }
164
+ static addHours(dt, hours) {
165
+ const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
166
+ const r = dat.plus({ hours: hours });
167
+ return r.toJSDate();
168
+ }
169
+ static addMinutes(dt, minutes) {
170
+ const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
171
+ const r = dat.plus({ minutes: minutes });
172
+ return r.toJSDate();
97
173
  }
98
174
  /**
99
175
  * Start of today
@@ -104,104 +180,119 @@ export class DateFunc {
104
180
  static get now() {
105
181
  return new Date(Date.now());
106
182
  }
183
+ /**
184
+ * From now, next 5 minute mark. For example 2:23:44 will be 2:25:00;
185
+ * @returns
186
+ */
107
187
  static getNext5MinuteMark() {
108
- const m = moment().set('second', 0).set('millisecond', 0);
109
- const minute = m.minute();
188
+ const m = DateTime.now().set({ second: 0, millisecond: 0 });
189
+ const minute = m.minute;
110
190
  const mod = minute % 5;
111
191
  if (mod) {
112
192
  const delta = 5 - mod;
113
- return m.add(delta, 'm').toDate();
193
+ return m.plus({ minutes: delta }).toJSDate();
114
194
  }
115
- return m.toDate();
195
+ return m.toJSDate();
116
196
  }
117
197
  static getYMD(d) {
118
- return moment(d).format('YYYYMMDD');
198
+ const dt = DateTime.fromJSDate(this.dateDataToDate(d));
199
+ return dt.toFormat('yyyyMMdd');
119
200
  }
120
201
  static getDMYWithSlash(d) {
121
- return moment(d).format('DD/MM/YYYY');
202
+ const dt = DateTime.fromJSDate(this.dateDataToDate(d));
203
+ return dt.toFormat('dd/MM/yyyy');
122
204
  }
123
205
  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');
206
+ const dt = DateTime.fromJSDate(this.dateDataToDate(d));
207
+ return dt.toFormat('dd/MM/yyyy HH:mm');
128
208
  }
129
209
  /**
130
- * In 24 hour format
131
- * @param dtUtc
210
+ *
211
+ * @param dtUtc In 24 hour format, and the date separator depending on the system or Luxon default locale
212
+ * @returns
132
213
  */
133
- static getLocalDMYHmWithSlash(dtUtc) {
134
- const d = DateFunc.dateTimeUtcToLocalDateTime(dtUtc);
135
- return moment(d).format('DD/MM/YYYY HH:mm');
214
+ static getDateTime24Simple(dtUtc) {
215
+ if (dtUtc == null) {
216
+ return dtUtc;
217
+ }
218
+ const d = this.dateDataToDate(dtUtc);
219
+ const dt = DateTime.fromJSDate(d);
220
+ return dt.toLocaleString(DateTime.DATE_SHORT) + ' ' + dt.toLocaleString(DateTime.TIME_24_SIMPLE);
221
+ }
222
+ static setDefaultLocale(locale) {
223
+ Settings.defaultLocale = locale;
224
+ }
225
+ static getDefaultLocale() {
226
+ return Settings.defaultLocale;
227
+ }
228
+ static setDefaultZone(zone) {
229
+ Settings.defaultZone = zone;
230
+ }
231
+ static getDefaultZone() {
232
+ return Settings.defaultZone.name;
233
+ }
234
+ static isZoneValid() {
235
+ return Settings.defaultZone.isValid;
136
236
  }
137
237
  /**
138
- * Offset minutes comparing with today
238
+ * For example, in AEST, it is -600.
239
+ * @returns
139
240
  */
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');
241
+ static getLocalTimezoneOffset() {
242
+ const dt = new Date(Date.now());
243
+ return dt.getTimezoneOffset();
149
244
  }
150
245
  /**
151
246
  * Get hour of the date. If Date is not defined, the hour will be current hour.
152
247
  * @param dtUtc
153
248
  */
154
249
  static getHour(dtUtc) {
155
- const m = moment(dtUtc);
156
- return m.hours();
250
+ const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
251
+ return dt.hour;
157
252
  }
158
253
  static getMinute(dtUtc) {
159
- const m = moment(dtUtc);
160
- return m.minutes();
254
+ const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
255
+ return dt.minute;
161
256
  }
162
- static composeDateTime(dt, h = 0, minute = 0) {
163
- const mt = moment(dt);
164
- return new Date(mt.toDate().setHours(h, minute, 0, 0));
257
+ static GetHM(dtUtc) {
258
+ const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
259
+ return { h: dt.hour, m: dt.minute };
165
260
  }
166
- static olderThan24Hours(d) {
167
- const m = moment(d);
168
- return moment().diff(m, 'hours') >= 24;
261
+ static composeDateTime(dt, h = 0, minute = 0, second = 0) {
262
+ return new Date(this.dateDataToDate(dt).setHours(h, minute, second, 0));
169
263
  }
170
- static olderThan24HoursUtc(dtUtc) {
171
- return DateFunc.getHourAgeUtc(dtUtc) >= 24;
264
+ static olderThan24Hours(d) {
265
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
266
+ return DateTime.now().diff(m, 'hours') >= Duration.fromISO('PT24H');
172
267
  }
173
268
  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;
269
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
270
+ const diff = DateTime.now().diff(m, 'hours');
271
+ const duration = Duration.fromISO(`PT${hours}H`);
272
+ console.debug('diff: ' + diff.hours + ' duration: ' + duration.hours);
273
+ return diff.hours >= duration.hours;
179
274
  }
180
275
  static olderThanMinutes(d, minutes) {
181
- const m = moment(d);
182
- return moment().diff(m, 'minutes') >= minutes;
276
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
277
+ return DateTime.now().diff(m, 'minutes') >= Duration.fromMillis(minutes * 60 * 1000);
183
278
  }
184
279
  /**
185
280
  * It could be 11PM yesterday, and 1 AM today. Actually based on local today.
186
281
  */
187
282
  static olderThan1Day(dtUtc) {
188
- return DateFunc.getDayAgeUtc(dtUtc) > 0;
283
+ return DateFunc.getDayAge(dtUtc) > 0;
189
284
  }
190
285
  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');
286
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
287
+ return DateTime.now().diff(m, 'hours').hours;
197
288
  }
198
289
  /**
199
- * Compare utc date with utc now.
290
+ * Compare date with now.
200
291
  * @param dtUtc
201
292
  */
202
- static getDayAgeUtc(dtUtc) {
203
- const m = moment.utc(dtUtc);
204
- return moment.utc().diff(m, 'days');
293
+ static getDayAge(d) {
294
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
295
+ return DateTime.now().diff(m, 'days').days;
205
296
  }
206
297
  /**
207
298
  * How many years from now.
@@ -209,108 +300,29 @@ export class DateFunc {
209
300
  * @returns
210
301
  */
211
302
  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));
303
+ const m = DateTime.fromJSDate(this.dateDataToDate(d));
304
+ return DateTime.now().diff(m, 'years').years;
237
305
  }
238
306
  /**
239
307
  * Convert minutes from midnight to HH:mm text
240
- * @param mins
308
+ * @param minutes
241
309
  */
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) {
310
+ static getHMFromMins(minutes) {
311
+ if (minutes >= 24 * 60 || minutes < 0) {
246
312
  throw new RangeError('Valid input should be greater than or equal to 0 and less than 1440.');
247
313
  }
248
- const h = mins / 60 | 0, m = mins % 60 | 0;
249
- return moment.utc().hours(h).minutes(m).format('HH:mm');
314
+ const h = minutes / 60 | 0, m = minutes % 60 | 0;
315
+ return DateTime.utc().set({ hour: h, minute: m }).toFormat('HH:mm');
250
316
  }
251
317
  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');
318
+ const dt = DateTime.fromJSDate(this.dateDataToDate(d));
319
+ const midnight = dt.startOf('day');
320
+ return dt.diff(midnight, 'minutes').minutes;
255
321
  }
256
322
  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;
323
+ const m = DateTime.fromJSDate(this.dateDataToDate(start));
324
+ const m2 = DateTime.fromJSDate(this.dateDataToDate(end));
325
+ return m2.diff(m, 'minutes').minutes;
314
326
  }
315
327
  }
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZUZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2RhdGVGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixNQUFNLE9BQU8sUUFBUTtJQUVwQjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEtBQThCO1FBQ2pFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNaLE9BQU8sQ0FBQyxDQUFDLENBQUMsNkNBQTZDO1FBQ3hELENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvQyxPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQThCO1FBQzNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUE4QjtRQUN2RCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFN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QUcsQ0FBQztJQUNsQixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRlRnVuYyB7XG5cblx0LyoqXG5cdCAqIFRyYW5zZm9ybSBVVEMgRGF0ZVRpbWUgdG8gbG9jYWwgZGF0ZSB3aXRob3V0IEgsIE0gYW5kIFMuIEZvciBleGFtcGxlLCB0aGUgbW9udGggZGF5IG9mIDIwMTgtMDEtMjNUMjI6MDA6MDBaIGlzIDI0IGluIEF1c3RyYWxpYS5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqIEBwYXJhbSBvZmZzZXRNaW51dGVzIGlmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGJlIG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKS4gLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlL2dldFRpbWV6b25lT2Zmc2V0XG5cdCAqL1xuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZU51bWJlcihkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuXHRcdGlmICghZHRVdGMpIHtcblx0XHRcdHJldHVybiAwOyAvLzAgaXMgYmV0dGVyIGZvciBjYWxjdWxhdGlvbiBieSB0aGUgY2xpZW50cy5cblx0XHR9XG5cblx0XHRjb25zdCBsb2NhbER0ID0gRGF0ZUZ1bmMuZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZVRpbWUoZHRVdGMpO1xuXHRcdGNvbnN0IGxvY2FsRE51bSA9IGxvY2FsRHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cblx0XHRyZXR1cm4gbG9jYWxETnVtO1xuXHR9XG5cblx0LyoqXG5cdCAqIERhdGUgb25seS4gSG93ZXZlciwgdGhlIGRhdGUgbWF5IHN0aWxsIGJlIGluIFVUQy5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqL1xuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZShkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHtcblx0XHRjb25zdCBsb2NhbER0ID0gRGF0ZUZ1bmMuZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZVRpbWUoZHRVdGMpO1xuXHRcdGNvbnN0IGxvY2FsRCA9IGxvY2FsRHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKGxvY2FsRCk7XG5cdH1cblxuXHRzdGF0aWMgbG9jYWxJU09EYXRlU3RyaW5nKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZHQgPSBtb21lbnQoZHRVdGMpLmxvY2FsKCk7XG5cdFx0cmV0dXJuIGR0LmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGxvY2F0ZSBkYXRlIE9OTFkgKG5vIHRpbWUpIHRvIFVUQyBkYXRlLlxuXHQgKiBAcGFyYW0gZHQgaWYgZHQgY29udGFpbiB0aW1lIGluZm8sIGl0IHdpbGwgYmVjb21lIGR0LnNldEhvdXJzKDAsIDAsIDAsIDApXG5cdCAqL1xuXHRzdGF0aWMgbG9jYWxEYXRlVG9VdGMoZDogRGF0ZSB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcpOiBEYXRlIHtcblx0XHRjb25zdCBkdCA9IG1vbWVudChkKS50b0RhdGUoKTtcblx0XHRjb25zdCBuID0gZHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cdFx0Y29uc3Qgb2Zmc2V0ID0gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xuXHRcdHJldHVybiBuZXcgRGF0ZShuICsgb2Zmc2V0KTtcblx0fVxuXG5cdHN0YXRpYyBnZXRUaW1lem9uZU9mZnNldCgpOiBudW1iZXIge1xuXHRcdGNvbnN0IGR0ID0gdGhpcy50b2RheTtcblx0XHRyZXR1cm4gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2Zvcm0gVVRDIERhdGVUaW1lIHRvIGxvY2FsIGRhdGVUaW1lLlxuXHQgKiBAcGFyYW0gZHRVdGNcblx0ICogQHBhcmFtIG9mZnNldE1pbnV0ZXMgaWYgbm90IGRlZmluZWQsIGl0IHdpbGwgYmUgbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpLiAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvZ2V0VGltZXpvbmVPZmZzZXRcblx0ICovXG5cdHN0YXRpYyBkYXRlVGltZVV0Y1RvTG9jYWxEYXRlVGltZShkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHtcblx0XHRjb25zdCBzdGlsbFV0YyA9IG1vbWVudC51dGMoZHRVdGMpLnRvRGF0ZSgpO1xuXHRcdHJldHVybiBtb21lbnQoc3RpbGxVdGMpLmxvY2FsKCkudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FNb21lbnQoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogbW9tZW50Lk1vbWVudCB7XG5cdFx0Y29uc3Qgc3RpbGxVdGMgPSBtb21lbnQudXRjKGR0VXRjKTtcblx0XHRyZXR1cm4gc3RpbGxVdGMubG9jYWwoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRFbmRPZldlZWsoZHQ6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHwgbnVtYmVyKSB7XG5cdFx0cmV0dXJuIG1vbWVudChkdCkuZW5kT2YoJ2lzb1dlZWsnKS50b0RhdGUoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRTdGFydE9mV2VlayhkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpIHtcblx0XHRyZXR1cm4gbW9tZW50KGR0KS5zdGFydE9mKCdpc29XZWVrJykudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RW5kT2ZNb250aChkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpIHtcblx0XHQvLyAgcmV0dXJuIG5ldyBEYXRlKGR0LmdldEZ1bGxZZWFyKCksIGR0LmdldE1vbnRoKCkgKyAxLCAwLCAyMywgNTksIDU5LCA5OTkpO1xuXHRcdHJldHVybiBtb21lbnQoZHQpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpO1xuXHR9XG5cblx0c3RhdGljIGdldFN0YXJ0T2ZNb250aChkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpIHtcblx0XHRyZXR1cm4gbW9tZW50KGR0KS5zdGFydE9mKCdtb250aCcpLnRvRGF0ZSgpO1xuXHR9XG5cblx0c3RhdGljIGdldERheXNCZXR3ZWVuRGF0ZXMoZHQxOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZHQyOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB0aGlzLmdldERheXNCZXR3ZWVuKGR0MSwgZHQyKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRFbmRPZkRhdGUoZHQ6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB7XG5cdFx0cmV0dXJuIGR0ID8gbmV3IERhdGUoZHQuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KSkgOlxuXHRcdFx0bmV3IERhdGUodGhpcy5ub3cuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KSk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0U3RhcnRPZkRhdGUoZHQ6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB7XG5cdFx0cmV0dXJuIG1vbWVudChkdCkuc3RhcnRPZignZGF5JykudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RW5kT2ZUb2RheSgpOiBEYXRlIHtcblx0XHQvL1x0cmV0dXJuIG5ldyBEYXRlKChuZXcgRGF0ZShEYXRlLm5vdygpKSkuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KSk7XG5cdFx0cmV0dXJuIG1vbWVudChEYXRlLm5vdygpKS5lbmRPZignZGF5JykudG9EYXRlKCk7XG5cblx0fVxuXG5cdHN0YXRpYyBnZXRTdGFydE9mVG9kYXkoKTogRGF0ZSB7XG5cdFx0Ly9cdHJldHVybiBuZXcgRGF0ZSgobmV3IERhdGUoRGF0ZS5ub3coKSkpLnNldEhvdXJzKDAsIDAsIDAsIDApKTtcblx0XHRyZXR1cm4gbW9tZW50KERhdGUubm93KCkpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpO1xuXHR9XG5cblx0Ly9pbnNwaXJlZCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjM0MDYvYWRkLWRheXMtdG8tamF2YXNjcmlwdC1kYXRlXG5cdHN0YXRpYyBhZGREYXlzKGR0OiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGF5czogbnVtYmVyID0gMCkge1xuXHRcdGNvbnN0IGRhdCA9IG1vbWVudChkdCk7XG5cdFx0ZGF0LmFkZChkYXlzLCAnZGF5cycpO1xuXHRcdHJldHVybiBkYXQudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgc3VidHJhY3REYXlzKGR0OiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGF5czogbnVtYmVyID0gMCkge1xuXHRcdGNvbnN0IGRhdCA9IG1vbWVudChkdCk7XG5cdFx0ZGF0LnN1YnRyYWN0KGRheXMsICdkYXlzJyk7XG5cdFx0cmV0dXJuIGRhdC50b0RhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCBvZiB0b2RheVxuXHQgKi9cblx0c3RhdGljIGdldCB0b2RheSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGFydE9mVG9kYXkoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXQgbm93KCk6IERhdGUge1xuXHRcdHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpKTtcblx0fVxuXG5cdHN0YXRpYyBnZXROZXh0NU1pbnV0ZU1hcmsoKTogRGF0ZSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudCgpLnNldCgnc2Vjb25kJywgMCkuc2V0KCdtaWxsaXNlY29uZCcsIDApO1xuXHRcdGNvbnN0IG1pbnV0ZSA9IG0ubWludXRlKCk7XG5cdFx0Y29uc3QgbW9kID0gbWludXRlICUgNTtcblx0XHRpZiAobW9kKSB7XG5cdFx0XHRjb25zdCBkZWx0YSA9IDUgLSBtb2Q7XG5cdFx0XHRyZXR1cm4gbS5hZGQoZGVsdGEsICdtJykudG9EYXRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG0udG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0WU1EKGQ6IERhdGUpIHtcblx0XHRyZXR1cm4gbW9tZW50KGQpLmZvcm1hdCgnWVlZWU1NREQnKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRETVlXaXRoU2xhc2goZDogRGF0ZSkge1xuXHRcdHJldHVybiBtb21lbnQoZCkuZm9ybWF0KCdERC9NTS9ZWVlZJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RE1ZSG1XaXRoU2xhc2goZDogRGF0ZSkge1xuXHRcdHJldHVybiBtb21lbnQoZCkuZm9ybWF0KCdERC9NTS9ZWVlZIEhIOm1tJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TWNwVGltZShkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gbW9tZW50KGR0KS5mb3JtYXQoJ0hIOm1tOnNzLlNTU1onKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbiAyNCBob3VyIGZvcm1hdFxuXHQgKiBAcGFyYW0gZHRVdGNcblx0ICovXG5cdHN0YXRpYyBnZXRMb2NhbERNWUhtV2l0aFNsYXNoKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGQgPSBEYXRlRnVuYy5kYXRlVGltZVV0Y1RvTG9jYWxEYXRlVGltZShkdFV0Yyk7XG5cdFx0cmV0dXJuIG1vbWVudChkKS5mb3JtYXQoJ0REL01NL1lZWVkgSEg6bW0nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPZmZzZXQgbWludXRlcyBjb21wYXJpbmcgd2l0aCB0b2RheVxuXHQgKi9cblx0c3RhdGljIGdldE9mZnNldE1pbnV0ZXMoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHwgbnVtYmVyKTogbnVtYmVyIHtcblx0XHRjb25zdCBkbTEgPSBtb21lbnQoZHRVdGMpO1xuXHRcdGNvbnN0IGRtMiA9IG1vbWVudChuZXcgRGF0ZSgpLnNldEhvdXJzKDAsIDAsIDAsIDApKTtcblx0XHRyZXR1cm4gZG0xLmRpZmYoZG0yLCAnbWludXRlcycpO1xuXHR9XG5cblx0c3RhdGljIGdldERheXNCZXR3ZWVuKGQxPzogRGF0ZSB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGQyPzogRGF0ZSB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuXHRcdGNvbnN0IGRtMSA9IG1vbWVudChkMSk7XG5cdFx0Y29uc3QgZG0yID0gbW9tZW50KGQyKTtcblx0XHRyZXR1cm4gZG0yLmRpZmYoZG0xLCAnZGF5cycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBob3VyIG9mIHRoZSBkYXRlLiBJZiBEYXRlIGlzIG5vdCBkZWZpbmVkLCB0aGUgaG91ciB3aWxsIGJlIGN1cnJlbnQgaG91ci5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqL1xuXHRzdGF0aWMgZ2V0SG91cihkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpOiBudW1iZXIge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZHRVdGMpO1xuXHRcdHJldHVybiBtLmhvdXJzKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TWludXRlKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB8IG51bWJlcik6IG51bWJlciB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudChkdFV0Yyk7XG5cdFx0cmV0dXJuIG0ubWludXRlcygpO1xuXHR9XG5cblx0c3RhdGljIGNvbXBvc2VEYXRlVGltZShkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIGg6IG51bWJlciA9IDAsIG1pbnV0ZTogbnVtYmVyID0gMCk6IERhdGUge1xuXHRcdGNvbnN0IG10ID0gbW9tZW50KGR0KTtcblx0XHRyZXR1cm4gbmV3IERhdGUobXQudG9EYXRlKCkuc2V0SG91cnMoaCwgbWludXRlLCAwLCAwKSk7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuMjRIb3VycyhkOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZCk7XG5cdFx0cmV0dXJuIG1vbWVudCgpLmRpZmYobSwgJ2hvdXJzJykgPj0gMjQ7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuMjRIb3Vyc1V0YyhkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gRGF0ZUZ1bmMuZ2V0SG91ckFnZVV0YyhkdFV0YykgPj0gMjQ7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuSG91cnMoZDogRGF0ZSwgaG91cnM6IG51bWJlcikge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZCk7XG5cdFx0cmV0dXJuIG1vbWVudCgpLmRpZmYobSwgJ2hvdXJzJykgPj0gaG91cnM7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuSG91cnNVdGMoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBob3VyczogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIERhdGVGdW5jLmdldEhvdXJBZ2VVdGMoZHRVdGMpID49IGhvdXJzO1xuXHR9XG5cblx0c3RhdGljIG9sZGVyVGhhbk1pbnV0ZXMoZDogRGF0ZSwgbWludXRlczogbnVtYmVyKSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudChkKTtcblx0XHRyZXR1cm4gbW9tZW50KCkuZGlmZihtLCAnbWludXRlcycpID49IG1pbnV0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogSXQgY291bGQgYmUgMTFQTSB5ZXN0ZXJkYXksIGFuZCAxIEFNIHRvZGF5LiBBY3R1YWxseSBiYXNlZCBvbiBsb2NhbCB0b2RheS5cblx0ICovXG5cdHN0YXRpYyBvbGRlclRoYW4xRGF5KGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBEYXRlRnVuYy5nZXREYXlBZ2VVdGMoZHRVdGMpID4gMDtcblx0fVxuXG5cdHN0YXRpYyBnZXRIb3VyQWdlKGQ6IERhdGUpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KGQpO1xuXHRcdHJldHVybiBtb21lbnQoKS5kaWZmKG0sICdob3VycycpO1xuXHR9XG5cblx0c3RhdGljIGdldEhvdXJBZ2VVdGMoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudC51dGMoZHRVdGMpO1xuXHRcdHJldHVybiBtb21lbnQudXRjKCkuZGlmZihtLCAnaG91cnMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wYXJlIHV0YyBkYXRlIHdpdGggdXRjIG5vdy5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqL1xuXHRzdGF0aWMgZ2V0RGF5QWdlVXRjKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQudXRjKGR0VXRjKTtcblx0XHRyZXR1cm4gbW9tZW50LnV0YygpLmRpZmYobSwgJ2RheXMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIb3cgbWFueSB5ZWFycyBmcm9tIG5vdy5cblx0ICogQHBhcmFtIGQgXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0c3RhdGljIGdldEFnZShkOiBEYXRlKSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudChkKTtcblx0XHRyZXR1cm4gbW9tZW50KCkuZGlmZihtLCAneWVhcnMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBZZWFyIG9mIGRhdGUuXG5cdCAqIEBwYXJhbSBkIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHN0YXRpYyBnZXRZZWFyKGQ6IERhdGUpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KGQpO1xuXHRcdHJldHVybiBtLnllYXIoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRVdGNOb3coKTogRGF0ZSB7XG5cdFx0cmV0dXJuIG1vbWVudC51dGMoKS50b0RhdGUoKTtcblx0fVxuXG5cdHN0YXRpYyBhZGRNaW51dGVzKGQ6IERhdGUsIG06IG51bWJlcik6IERhdGUge1xuXHRcdHJldHVybiBtb21lbnQoZCkuYWRkKG0sICdtJykudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgYWRkTW9udGgoZDogRGF0ZSwgbTogbnVtYmVyKTogRGF0ZSB7XG5cdFx0cmV0dXJuIG1vbWVudChkKS5hZGQobSwgJ00nKS50b0RhdGUoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXREdXJhdGlvbihkMTogRGF0ZSwgZDI6IERhdGUpIHtcblx0XHRjb25zdCBtZDEgPSBtb21lbnQoZDEpO1xuXHRcdGNvbnN0IG1kMiA9IG1vbWVudChkMik7XG5cdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbihtZDIuZGlmZihtZDEpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IG1pbnV0ZXMgZnJvbSBtaWRuaWdodCB0byBISDptbSB0ZXh0XG5cdCAqIEBwYXJhbSBtaW5zXG5cdCAqL1xuXHRzdGF0aWMgZ2V0SE1Gcm9tTWlucyhtaW5zOiBudW1iZXIpOiBzdHJpbmcge1xuXHRcdC8vIGRvIG5vdCBpbmNsdWRlIHRoZSBmaXJzdCB2YWxpZGF0aW9uIGNoZWNrIGlmIHlvdSB3YW50LCBmb3IgZXhhbXBsZSxcblx0XHQvLyBnZXRUaW1lRnJvbU1pbnMoMTUzMCkgdG8gZXF1YWwgZ2V0VGltZUZyb21NaW5zKDkwKSAoaS5lLiBtaW5zIHJvbGxvdmVyKVxuXHRcdGlmIChtaW5zID49IDI0ICogNjAgfHwgbWlucyA8IDApIHtcblx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdWYWxpZCBpbnB1dCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiAxNDQwLicpO1xuXHRcdH1cblx0XHRjb25zdCBoID0gbWlucyAvIDYwIHwgMCxcblx0XHRcdG0gPSBtaW5zICUgNjAgfCAwO1xuXHRcdHJldHVybiBtb21lbnQudXRjKCkuaG91cnMoaCkubWludXRlcyhtKS5mb3JtYXQoJ0hIOm1tJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TWludXRlc1NpbmNlTWlkbmlnaHQoZDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KGQpO1xuXHRcdGNvbnN0IG1pZG5pZ2h0ID0gbW9tZW50KGQpLnN0YXJ0T2YoJ2RheScpOyAvL011dGF0ZXMgdGhlIG9yaWdpbmFsIG1vbWVudCBieSBzZXR0aW5nIGl0IHRvIHRoZSBzdGFydCBvZiBhIHVuaXQgb2YgdGltZS4gU28gSSBoYXZlIGJldHRlciBub3QgdG8gdXNlIG0gd2hpY2ggd2lsIGJlIGNoYW5nZWQgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uXG5cdFx0cmV0dXJuIG0uZGlmZihtaWRuaWdodCwgJ21pbnV0ZXMnKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRNaW51dGVzQmV0d2VlbihzdGFydDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIGVuZDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KHN0YXJ0KTtcblx0XHRjb25zdCBtMiA9IG1vbWVudChlbmQpO1xuXHRcdHJldHVybiBtMi5kaWZmKG0sICdtaW51dGVzJyk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UganNvbiBzdHJpbmcgd2l0aCBkYXRlIHNlcmlhbGl6ZWQgaW50byBzdHJpbmcsIGFuZCBnZXQgcHJvcGVyIGRhdGUgb2JqZWN0IGJhY2tcblx0ICogQHBhcmFtIHNcblx0ICovXG5cdHN0YXRpYyBkYXRlU2FmZUpzb25QYXJzZShzOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShzLCB0aGlzLmRhdGVSZXZpdmVyKTtcblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIGRhdGVSZXZpdmVyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0aWYgKERhdGVGdW5jLmlzU2VyaWFsaXplZERhdGUodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gKG5ldyBEYXRlKHZhbHVlKSk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgaXQncyBub3QgYSBkYXRlLXN0cmluZywgd2Ugd2FudCB0byByZXR1cm4gdGhlIHZhbHVlIGFzLWlzLiBJZiB3ZSBmYWlsIHRvIHJldHVyblxuXHRcdC8vIGEgdmFsdWUsIGl0IHdpbGwgYmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHRhbnQgZGF0YSBzdHJ1Y3R1cmUuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cblx0fVxuXG5cblx0Ly8gSSBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgc2VyaWFsaXplZC1kYXRlIHBhdHRlcm4uXG5cdHByaXZhdGUgc3RhdGljIGlzU2VyaWFsaXplZERhdGUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuXHRcdC8vIERhdGVzIGFyZSBzZXJpYWxpemVkIGluIFRaIGZvcm1hdCwgZXhhbXBsZTogJzE5ODEtMTItMjBUMDQ6MDA6MTQuMDAwWicuXG5cdFx0Y29uc3QgZGF0ZVBhdHRlcm4gPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9XFwuXFxkezN9WiQvO1xuXHRcdHJldHVybiAoRGF0ZUZ1bmMuaXNTdHJpbmcodmFsdWUpICYmIGRhdGVQYXR0ZXJuLnRlc3QodmFsdWUpKTtcblx0fVxuXG5cblx0Ly8gSSBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgU3RyaW5nLlxuXHRwcml2YXRlIHN0YXRpYyBpc1N0cmluZyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICh7fS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgU3RyaW5nXScpO1xuXHR9XG5cblx0c3RhdGljIGRhdGVTYWZlUGFyc2Uoczogc3RyaW5nIHwgRGF0ZSkge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQocyk7XG5cdFx0cmV0dXJuIG0udG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgY29tcG9zZURhdGVXaXRoTWludXRlcyhkOiBEYXRlLCBtaW51dGU6IG51bWJlcik6IERhdGUge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZCk7XG5cdFx0Y29uc3QgbWlkbmlnaHQgPSBtb21lbnQoZCkuc3RhcnRPZignZGF5Jyk7IC8vIE11dGF0ZXMgdGhlIG9yaWdpbmFsIG1vbWVudCBieSBzZXR0aW5nIGl0IHRvIHRoZSBzdGFydCBvZiBhIHVuaXQgb2YgdGltZS4gU28gSSBoYXZlIGJldHRlciBub3QgdG8gdXNlIG0gd2hpY2ggd2lsIGJlIGNoYW5nZWQgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uXG5cdFx0bWlkbmlnaHQuYWRkKG1pbnV0ZSwgJ21pbnV0ZXMnKTtcblx0XHRyZXR1cm4gbWlkbmlnaHQudG9EYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2FmZSBjb21wYXJlIHNpbmNlIGRhdGUgZGF0YSBtYXkgYmUgY29uc2lkZXJlZCBhcyBzdHJpbmcgcmF0aGVyIHRoYW4gZGF0ZS5cblx0ICogQHBhcmFtIGQxXG5cdCAqIEBwYXJhbSBkMlxuXHQgKi9cblx0c3RhdGljIGNvbXBhcmUoZDE6IERhdGUgfCB1bmRlZmluZWQsIGQyOiBEYXRlIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0XHRpZiAoIWQxICYmICFkMikge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0aWYgKCFkMSkge1xuXHRcdFx0cmV0dXJuIC1OYU5cblx0XHR9XG5cblx0XHRpZiAoIWQyKSB7XG5cdFx0XHRyZXR1cm4gTmFOO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRkMSA9IChuZXcgRGF0ZShkMSkpLnZhbHVlT2YoKTtcblx0XHRjb25zdCBkZDIgPSAobmV3IERhdGUoZDIpKS52YWx1ZU9mKCk7XG5cdFx0cmV0dXJuIGRkMSAtIGRkMjtcblx0fVxufVxuXG4iXX0=
328
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZUZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2RhdGVGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVyRCxNQUFNLE9BQU8sUUFBUTtJQUNwQjs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQTBCO1FBQy9DLElBQUksRUFBRSxZQUFZLElBQUksRUFBQyxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO2dCQUNiLE1BQU0sSUFBSSxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUMsQ0FBQztZQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxPQUFPLEVBQUUsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLElBQUksU0FBUyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMs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QUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDdEMsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVRpbWUsIER1cmF0aW9uLCBTZXR0aW5ncyB9IGZyb20gJ2x1eG9uJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRlRnVuYyB7XHJcblx0LyoqXHJcblx0ICogQXQgcnVudGltZSwgdGhlcmUncyBubyBzaW1wbGUgZ3VhcmFudGVlIHRoYXQgdGhlIGlucHV0IGlzIERhdGUuIFNvbWV0aW1lcyB5b3UgY29kZXMgZXhwZWN0IGRhdGUsIGJ1dCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgV2ViIHNlcnZpY2UgbWF5IGdpdmUgeW91IHN0cmluZyBvciBudW1iZXIuXHJcblx0ICogVGhpcyBmdW5jdGlvbiBnaXZlIHlvdSBzYWZlIHBhcnNlIG9mIGRhdGUgZGF0YSBmcm9tIEkvTywgbm90IG9mIHlvdXIgY29udHJvbC5cclxuXHQgKiBJZiB0aGUgZGF0YSBpcyBpbnZhbGlkLCB0aHJvd3MgUmFuZ2VFcnJvciBvciBUeXBlRXJyb3IuXHJcblx0ICogQHBhcmFtIGR0IFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBkYXRlRGF0YVRvRGF0ZShkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGlmIChkdCBpbnN0YW5jZW9mIERhdGUpe1xyXG5cdFx0XHRyZXR1cm4gZHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ3N0cmluZycpe1xyXG5cdFx0XHRjb25zdCByID0gRGF0ZS5wYXJzZShkdCk7XHJcblx0XHRcdGlmIChpc05hTihyKSl7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RyaW5nIGZvciBEYXRlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBuZXcgRGF0ZShyKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodHlwZW9mIGR0ID09PSAnbnVtYmVyJyl7XHJcblx0XHRcdGNvbnN0IHJkID0gbmV3IERhdGUoZHQpXHJcblx0XHRcdGlmIChOdW1iZXIuaXNOYU4ocmQudmFsdWVPZigpKSl7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgbnVtYmVyIGZvciBEYXRlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiByZDtcclxuXHRcdH1cclxuXHJcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3QgRGF0ZSwgc3RyaW5nIG9yIG51bWJlcicpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2ltaWxhciB0byBkYXRlRGF0YVRvRGF0ZSwgYnV0IGFsbG93IG51bGwgYW5kIGRlZmluZWQgc2VtYW50aWNhbGx5LlxyXG5cdCAqIEBwYXJhbSBkdCBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZURhdGFUb0RhdGVPck51bGwoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKSA6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuXHRcdGlmIChkdCBpbnN0YW5jZW9mIERhdGUpe1xyXG5cdFx0XHRyZXR1cm4gZHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ3N0cmluZycpe1xyXG5cdFx0XHRjb25zdCByID0gRGF0ZS5wYXJzZShkdCk7XHJcblx0XHRcdGlmIChpc05hTihyKSl7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RyaW5nIGZvciBEYXRlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBuZXcgRGF0ZShyKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodHlwZW9mIGR0ID09PSAnbnVtYmVyJyl7XHJcblx0XHRcdGNvbnN0IHJkID0gbmV3IERhdGUoZHQpXHJcblx0XHRcdGlmIChOdW1iZXIuaXNOYU4ocmQudmFsdWVPZigpKSl7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgbnVtYmVyIGZvciBEYXRlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiByZDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoZHQgPT0gbnVsbCl7IFxyXG5cdFx0XHRyZXR1cm4gZHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0IERhdGUsIHN0cmluZyBvciBudW1iZXInKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybSBVVEMgRGF0ZVRpbWUgdG8gbG9jYWwgZGF0ZSB3aXRob3V0IEgsIE0gYW5kIFMuIEZvciBleGFtcGxlLCB0aGUgbW9udGggZGF5IG9mIDIwMTgtMDEtMjNUMjI6MDA6MDBaIGlzIDI0IGluIEF1c3RyYWxpYS5cclxuXHQgKiBAcGFyYW0gZHRVdGNcclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZU51bWJlcihkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuXHRcdGlmIChkdFV0YyA9PSBudWxsKSB7XHJcblx0XHRcdHJldHVybiBkdFV0YztcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBsb2NhbER0ID0gdGhpcy5kYXRlRGF0YVRvRGF0ZShkdFV0Yyk7XHJcblx0XHRjb25zdCBsb2NhbEROdW0gPSBsb2NhbER0LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG5cclxuXHRcdHJldHVybiBsb2NhbEROdW07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEYXRlIG9ubHkuIEhvd2V2ZXIsIHRoZSBkYXRlIG1heSBzdGlsbCBiZSBpbiBVVEMuXHJcblx0ICogQHBhcmFtIGR0VXRjXHJcblx0ICogQHJldHVybnMgbmV3IERhdGUgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBkYXRlVGltZVV0Y1RvTG9jYWxEYXRlKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuXHRcdGlmIChkdFV0YyA9PSBudWxsKSB7XHJcblx0XHRcdHJldHVybiBkdFV0YztcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBsb2NhbER0ID0gdGhpcy5kYXRlRGF0YVRvRGF0ZShkdFV0Yyk7XHJcblx0XHRjb25zdCBsb2NhbE51bSA9IGxvY2FsRHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUobG9jYWxOdW0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogJzIwMTgtMDEtMjNUMjI6MDA6MDBaJyB3aWxsIGJlY29tZSAnMjAxOC0wMS0yNCcgaW4gQXVzdHJhbGlhLlxyXG5cdCAqIEBwYXJhbSBkdFV0YyBcclxuXHQgKiBAcmV0dXJucyAgbmV3IERhdGUgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBsb2NhbElTT0RhdGVTdHJpbmcoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHRcdFxyXG5cdCAgICBjb25zdCBkdCA9IHRoaXMuZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZShkdFV0Yyk7XHJcblx0XHRpZiAoZHQgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZD0gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkdCk7XHJcblx0XHRyZXR1cm4gZC50b0lTT0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGxvY2FsIGRhdGUgT05MWSAobm8gdGltZSkgdG8gVVRDIGRhdGUuXHJcblx0ICogVGhlIGlucHV0IGNvdWxkIGJlIGEgc3RyaW5nIG9mIHl5eXktTU0tZGQsIG9yIGEgRGF0ZSBPYmplY3QuXHJcblx0ICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVxyXG5cdCAqIFdoaWxlIHRoZSB0aW1lIHZhbHVlIGF0IHRoZSBoZWFydCBvZiBhIERhdGUgb2JqZWN0IGlzIFVUQywgdGhlIGJhc2ljIG1ldGhvZHMgdG8gZmV0Y2ggdGhlIGRhdGUgYW5kIHRpbWUgXHJcblx0ICogb3IgaXRzIGNvbXBvbmVudHMgYWxsIHdvcmsgaW4gdGhlIGxvY2FsIChpLmUuIGhvc3Qgc3lzdGVtKSB0aW1lIHpvbmUgYW5kIG9mZnNldC5cclxuXHQgKiBAcGFyYW0gZHQgaWYgZHQgY29udGFpbiB0aW1lIGluZm8sIGl0IHdpbGwgYmVjb21lIGR0LnNldEhvdXJzKDAsIDAsIDAsIDApXHJcblx0ICovXHJcblx0c3RhdGljIGxvY2FsRGF0ZVRvVXRjKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nKTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQge1xyXG5cdFx0aWYgKGQgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZDtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkdCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZCk7XHJcblx0XHRjb25zdCBuID0gZHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcblx0XHRjb25zdCBvZmZzZXQgPSBkdC5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDA7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUobiArIG9mZnNldCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RW5kT2ZXZWVrKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5lbmRPZignd2VlaycpLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0U3RhcnRPZldlZWsoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXRlVGltZSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0cmV0dXJuIGRhdGVUaW1lLnN0YXJ0T2YoJ3dlZWsnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mTW9udGgoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXRlVGltZSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0cmV0dXJuIGRhdGVUaW1lLmVuZE9mKCdtb250aCcpLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0U3RhcnRPZk1vbnRoKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5zdGFydE9mKCdtb250aCcpLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RW5kT2ZEYXRlKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXRlVGltZSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0cmV0dXJuIGRhdGVUaW1lLmVuZE9mKCdkYXknKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZEYXRlKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXRlVGltZSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0cmV0dXJuIGRhdGVUaW1lLnN0YXJ0T2YoJ2RheScpLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RW5kT2ZUb2RheSgpOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRFbmRPZkRhdGUoRGF0ZS5ub3coKSk7XHJcblxyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZUb2RheSgpOiBEYXRlIHtcclxuXHRcdHJldHVybiB0aGlzLmdldFN0YXJ0T2ZEYXRlKERhdGUubm93KCkpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldERheXNCZXR3ZWVuKGQxOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBkMjogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRjb25zdCBkbTEgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZDEpKTtcclxuXHRcdGNvbnN0IGRtMiA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkMSkpO1xyXG5cdFx0cmV0dXJuIGRtMi5kaWZmKGRtMSwgJ2RheXMnKS5kYXlzO1xyXG5cdH1cclxuXHJcblx0Ly9pbnNwaXJlZCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjM0MDYvYWRkLWRheXMtdG8tamF2YXNjcmlwdC1kYXRlXHJcblx0c3RhdGljIGFkZERheXMoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIGRheXM6IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGNvbnN0IGRhdCA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0Y29uc3QgciA9IGRhdC5wbHVzKHtkYXlzOiBkYXlzfSk7XHJcblx0XHRyZXR1cm4gci50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFkZE1vbnRocyhkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgbW9udGhzOiBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdGNvbnN0IHIgPSBkYXQucGx1cyh7bW9udGhzOiBtb250aHN9KTtcclxuXHRcdHJldHVybiByLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWRkWWVhcnMoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIHllYXJzOiBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdGNvbnN0IHIgPSBkYXQucGx1cyh7eWVhcnM6IHllYXJzfSk7XHJcblx0XHRyZXR1cm4gci50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFkZEhvdXJzKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBob3VyczogbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KSk7XHJcblx0XHRjb25zdCByID0gZGF0LnBsdXMoe2hvdXJzOiBob3Vyc30pO1xyXG5cdFx0cmV0dXJuIHIudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhZGRNaW51dGVzKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBtaW51dGVzOiBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdGNvbnN0IHIgPSBkYXQucGx1cyh7bWludXRlczogbWludXRlc30pO1xyXG5cdFx0cmV0dXJuIHIudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydCBvZiB0b2RheVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXQgdG9kYXkoKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGFydE9mVG9kYXkoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgbm93KCk6IERhdGUge1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJvbSBub3csIG5leHQgNSBtaW51dGUgbWFyay4gRm9yIGV4YW1wbGUgMjoyMzo0NCB3aWxsIGJlIDI6MjU6MDA7XHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIGdldE5leHQ1TWludXRlTWFyaygpOiBEYXRlIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5ub3coKS5zZXQoe3NlY29uZDogMCwgbWlsbGlzZWNvbmQ6MH0pO1xyXG5cdFx0Y29uc3QgbWludXRlID0gbS5taW51dGU7XHJcblx0XHRjb25zdCBtb2QgPSBtaW51dGUgJSA1O1xyXG5cdFx0aWYgKG1vZCkge1xyXG5cdFx0XHRjb25zdCBkZWx0YSA9IDUgLSBtb2Q7XHJcblx0XHRcdHJldHVybiBtLnBsdXMoe21pbnV0ZXM6IGRlbHRhfSkudG9KU0RhdGUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFlNRChkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBkdCA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRyZXR1cm4gZHQudG9Gb3JtYXQoJ3l5eXlNTWRkJyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RE1ZV2l0aFNsYXNoKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBkdC50b0Zvcm1hdCgnZGQvTU0veXl5eScpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldERNWUhtV2l0aFNsYXNoKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBkdC50b0Zvcm1hdCgnZGQvTU0veXl5eSBISDptbScpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGR0VXRjIEluIDI0IGhvdXIgZm9ybWF0LCBhbmQgdGhlIGRhdGUgc2VwYXJhdG9yIGRlcGVuZGluZyBvbiB0aGUgc3lzdGVtIG9yIEx1eG9uIGRlZmF1bHQgbG9jYWxlXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIGdldERhdGVUaW1lMjRTaW1wbGUoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKSB7XHJcblx0XHRpZiAoZHRVdGMgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHRVdGM7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdGNvbnN0IGQgPSB0aGlzLmRhdGVEYXRhVG9EYXRlKGR0VXRjKTtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkKTtcclxuXHRcdHJldHVybiBkdC50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX1NIT1JUKSArICcgJyArIGR0LnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfMjRfU0lNUExFKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBzZXREZWZhdWx0TG9jYWxlKGxvY2FsZTogc3RyaW5nKXtcclxuXHRcdFNldHRpbmdzLmRlZmF1bHRMb2NhbGU9bG9jYWxlO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldERlZmF1bHRMb2NhbGUoKXtcclxuXHRcdHJldHVybiBTZXR0aW5ncy5kZWZhdWx0TG9jYWxlO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNldERlZmF1bHRab25lKHpvbmU6IHN0cmluZyl7XHJcblx0XHRTZXR0aW5ncy5kZWZhdWx0Wm9uZT16b25lO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldERlZmF1bHRab25lKCkgOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFNldHRpbmdzLmRlZmF1bHRab25lLm5hbWU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgaXNab25lVmFsaWQoKTogYm9vbGVhbntcclxuXHRcdHJldHVybiBTZXR0aW5ncy5kZWZhdWx0Wm9uZS5pc1ZhbGlkO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9yIGV4YW1wbGUsIGluIEFFU1QsIGl0IGlzIC02MDAuXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIGdldExvY2FsVGltZXpvbmVPZmZzZXQoKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IGR0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSk7XHJcblx0XHRyZXR1cm4gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCBob3VyIG9mIHRoZSBkYXRlLiBJZiBEYXRlIGlzIG5vdCBkZWZpbmVkLCB0aGUgaG91ciB3aWxsIGJlIGN1cnJlbnQgaG91ci5cclxuXHQgKiBAcGFyYW0gZHRVdGNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0SG91cihkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRjb25zdCBkdCA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdFV0YykpO1xyXG5cdFx0cmV0dXJuIGR0LmhvdXI7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0TWludXRlKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0VXRjKSk7XHJcblx0XHRyZXR1cm4gZHQubWludXRlO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIEdldEhNKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKToge2g6IG51bWJlciwgbTogbnVtYmVyfXtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0VXRjKSk7XHJcblx0XHRyZXR1cm4ge2g6IGR0LmhvdXIsIG06IGR0Lm1pbnV0ZX07XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY29tcG9zZURhdGVUaW1lKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBoOiBudW1iZXIgPSAwLCBtaW51dGU6IG51bWJlciA9IDAsIHNlY29uZDogbnVtYmVyID0gMCk6IERhdGUge1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKCB0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KS5zZXRIb3VycyhoLCBtaW51dGUsIHNlY29uZCwgMCkpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG9sZGVyVGhhbjI0SG91cnMoZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRyZXR1cm4gRGF0ZVRpbWUubm93KCkuZGlmZihtLCAnaG91cnMnKSA+PSBEdXJhdGlvbi5mcm9tSVNPKCdQVDI0SCcpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG9sZGVyVGhhbkhvdXJzKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIGhvdXJzOiBudW1iZXIpIDogYm9vbGVhbiB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdGNvbnN0IGRpZmYgPSBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdob3VycycpOyBcclxuXHRcdGNvbnN0IGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbUlTTyhgUFQke2hvdXJzfUhgKTtcclxuXHRcdGNvbnNvbGUuZGVidWcoJ2RpZmY6ICcgKyBkaWZmLmhvdXJzICsgJyAgIGR1cmF0aW9uOiAnICsgZHVyYXRpb24uaG91cnMpO1xyXG5cdFx0cmV0dXJuIGRpZmYuaG91cnMgPj0gZHVyYXRpb24uaG91cnM7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgb2xkZXJUaGFuTWludXRlcyhkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBtaW51dGVzOiBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ21pbnV0ZXMnKSA+PSBEdXJhdGlvbi5mcm9tTWlsbGlzKG1pbnV0ZXMqNjAqMTAwMCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCBjb3VsZCBiZSAxMVBNIHllc3RlcmRheSwgYW5kIDEgQU0gdG9kYXkuIEFjdHVhbGx5IGJhc2VkIG9uIGxvY2FsIHRvZGF5LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBvbGRlclRoYW4xRGF5KGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gRGF0ZUZ1bmMuZ2V0RGF5QWdlKGR0VXRjKSA+IDA7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0SG91ckFnZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdob3VycycpLmhvdXJzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcGFyZSBkYXRlIHdpdGggbm93LlxyXG5cdCAqIEBwYXJhbSBkdFV0Y1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXREYXlBZ2UoZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRyZXR1cm4gRGF0ZVRpbWUubm93KCkuZGlmZihtLCAnZGF5cycpLmRheXM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIb3cgbWFueSB5ZWFycyBmcm9tIG5vdy5cclxuXHQgKiBAcGFyYW0gZFxyXG5cdCAqIEByZXR1cm5zXHJcblx0ICovXHJcblx0c3RhdGljIGdldEFnZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICd5ZWFycycpLnllYXJzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydCBtaW51dGVzIGZyb20gbWlkbmlnaHQgdG8gSEg6bW0gdGV4dFxyXG5cdCAqIEBwYXJhbSBtaW51dGVzXHJcblx0ICovXHJcblx0c3RhdGljIGdldEhNRnJvbU1pbnMobWludXRlczogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRcdGlmIChtaW51dGVzID49IDI0ICogNjAgfHwgbWludXRlcyA8IDApIHtcclxuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1ZhbGlkIGlucHV0IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIDE0NDAuJyk7XHJcblx0XHR9XHJcblx0XHRjb25zdCBoID0gbWludXRlcyAvIDYwIHwgMCxcclxuXHRcdFx0bSA9IG1pbnV0ZXMgJSA2MCB8IDA7XHJcblx0XHRyZXR1cm4gRGF0ZVRpbWUudXRjKCkuc2V0KHtob3VyOiBoLCBtaW51dGU6IG19KS50b0Zvcm1hdCgnSEg6bW0nKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRNaW51dGVzU2luY2VNaWRuaWdodChkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBkdCA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRjb25zdCBtaWRuaWdodCA9IGR0LnN0YXJ0T2YoJ2RheScpO1xyXG5cdFx0cmV0dXJuIGR0LmRpZmYobWlkbmlnaHQsICdtaW51dGVzJykubWludXRlcztcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRNaW51dGVzQmV0d2VlbihzdGFydDogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgZW5kOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKHN0YXJ0KSk7XHJcblx0XHRjb25zdCBtMiA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShlbmQpKTtcclxuXHRcdHJldHVybiBtMi5kaWZmKG0sICdtaW51dGVzJykubWludXRlcztcclxuXHR9XHJcbn1cclxuXHJcbiJdfQ==