1 | /******/ (() => { // webpackBootstrap
|
2 | /******/ "use strict";
|
3 | /******/ var __webpack_modules__ = ({
|
4 |
|
5 | /***/ "./conversion.ts":
|
6 | /*!***********************!*\
|
7 | !*** ./conversion.ts ***!
|
8 | \***********************/
|
9 | /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
10 |
|
11 |
|
12 |
|
13 | Object.defineProperty(exports, "__esModule", ({
|
14 | value: true
|
15 | }));
|
16 | exports.isLocalDateLike = isLocalDateLike;
|
17 | exports.isLocalTimeLike = isLocalTimeLike;
|
18 | exports.toDate = toDate;
|
19 | exports.toEpochDay = toEpochDay;
|
20 | exports.toLocalDate = toLocalDate;
|
21 | exports.toLocalDateTime = toLocalDateTime;
|
22 | exports.toLocalTime = toLocalTime;
|
23 |
|
24 | var _core = __webpack_require__(/*! @js-joda/core */ "@js-joda/core");
|
25 |
|
26 | function isLocalDateLike(date) {
|
27 | return date !== null && date !== undefined && typeof date === 'object' && typeof date._year !== 'undefined' && typeof date._month !== 'undefined' && typeof date._day !== 'undefined';
|
28 | }
|
29 |
|
30 | function isLocalTimeLike(time) {
|
31 | return time !== null && time !== undefined && typeof time === 'object' && typeof time._hour !== 'undefined' && typeof time._minute !== 'undefined' && typeof time._second !== 'undefined' && typeof time._nano !== 'undefined';
|
32 | } // const iso8601Regex = /^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([.,]\d+(?!:))?)?(\17[0-5]\d([.,]\d+)?)?([zZ]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
|
33 |
|
34 |
|
35 | const iso8601DateOnly = /^\d{4}-\d{2}-\d{2}$/;
|
36 | const iso8601ContainsZone = /(Z|[+-]\d{2}:\d{2})$/;
|
37 | const iso8601TimeOnly = /^\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?$/;
|
38 |
|
39 | function toLocalDate(date, zone = _core.ZoneId.SYSTEM) {
|
40 | if (date instanceof _core.LocalDate) {
|
41 | return date;
|
42 | }
|
43 |
|
44 | if (date instanceof _core.LocalDateTime) {
|
45 | // This chops the time off, because 'local' datetime === 'local date.
|
46 | return date.toLocalDate();
|
47 | }
|
48 |
|
49 | if (date instanceof _core.ZonedDateTime) {
|
50 | // Unsure of this
|
51 | return date.toLocalDate();
|
52 | }
|
53 |
|
54 | if (typeof date === 'number') {
|
55 | return _core.LocalDate.ofEpochDay(date);
|
56 | }
|
57 |
|
58 | if (date instanceof Date) {
|
59 | // Javascript dates are evil. They assume you are in SYSTEM zone when reading, but can set as any zone.
|
60 | return _core.LocalDate.from((0, _core.nativeJs)(date, zone));
|
61 | }
|
62 |
|
63 | if (isLocalDateLike(date)) {
|
64 | // eslint-disable-next-line no-underscore-dangle
|
65 | return _core.LocalDate.of(date._year, date._month, date._day);
|
66 | }
|
67 |
|
68 | if (typeof date === 'string') {
|
69 | if (iso8601DateOnly.test(date)) {
|
70 | return _core.LocalDate.parse(date);
|
71 | }
|
72 |
|
73 | if (iso8601ContainsZone.test(date)) {
|
74 | return _core.ZonedDateTime.parse(date).toLocalDate();
|
75 | }
|
76 |
|
77 | return _core.LocalDateTime.parse(date).toLocalDate();
|
78 | }
|
79 |
|
80 | throw new Error('Cannot convert value to LocalDate');
|
81 | }
|
82 |
|
83 | function toEpochDay(date, zone = _core.ZoneId.SYSTEM) {
|
84 | if (typeof date === 'number') {
|
85 | return date;
|
86 | }
|
87 |
|
88 | if (date instanceof _core.LocalDate) {
|
89 | return date.toEpochDay();
|
90 | }
|
91 |
|
92 | if (date instanceof _core.LocalDateTime || date instanceof _core.ZonedDateTime || date instanceof Date || isLocalDateLike(date) || typeof date === 'string') {
|
93 | return toLocalDate(date, zone).toEpochDay();
|
94 | }
|
95 |
|
96 | throw new Error('Cannot convert value to epoch integer');
|
97 | }
|
98 |
|
99 | function toLocalDateTime(date, zone = _core.ZoneId.SYSTEM) {
|
100 | if (date instanceof _core.LocalDateTime) {
|
101 | return date;
|
102 | }
|
103 |
|
104 | if (date instanceof _core.ZonedDateTime) {
|
105 | return date.toLocalDateTime();
|
106 | }
|
107 |
|
108 | if (date instanceof Date) {
|
109 | return _core.LocalDateTime.from((0, _core.nativeJs)(date, zone));
|
110 | }
|
111 |
|
112 | if (date instanceof _core.LocalDate || isLocalDateLike(date) || typeof date === 'number') {
|
113 | const localDate = toLocalDate(date);
|
114 | return _core.LocalDateTime.of(localDate.year(), localDate.monthValue(), localDate.dayOfMonth(), 0, 0, 0, 0);
|
115 | }
|
116 |
|
117 | if (typeof date === 'string') {
|
118 | if (iso8601DateOnly.test(date)) {
|
119 | return toLocalDateTime(_core.LocalDate.parse(date));
|
120 | }
|
121 |
|
122 | if (iso8601ContainsZone.test(date)) {
|
123 | return _core.ZonedDateTime.parse(date).toLocalDateTime();
|
124 | }
|
125 |
|
126 | return _core.LocalDateTime.parse(date);
|
127 | }
|
128 |
|
129 | throw new Error('Cannot convert value to LocalDateTime');
|
130 | }
|
131 |
|
132 | function toDate(date) {
|
133 | if (date instanceof Date) {
|
134 | return date;
|
135 | }
|
136 |
|
137 | if (date instanceof _core.LocalDate || date instanceof _core.ZonedDateTime) {
|
138 | return new Date(date.year(), date.monthValue() - 1, date.dayOfMonth());
|
139 | }
|
140 |
|
141 | if (date instanceof _core.LocalDateTime) {
|
142 | return new Date(date.year(), date.monthValue() - 1, date.dayOfMonth(), date.hour(), date.minute(), date.second(), date.nano() / 1000000);
|
143 | }
|
144 |
|
145 | if (date instanceof _core.LocalTime) {
|
146 | return new Date(1970, 1, 1, date.hour(), date.minute(), date.second(), date.nano() / 1000000);
|
147 | }
|
148 |
|
149 | if (typeof date === 'number' || isLocalDateLike(date)) {
|
150 | return toDate(toLocalDate(date));
|
151 | }
|
152 |
|
153 | if (typeof date === 'string') {
|
154 | return new Date(date);
|
155 | }
|
156 |
|
157 | throw new Error('Cannot convert value to Date');
|
158 | }
|
159 |
|
160 | function toLocalTime(time, zone = _core.ZoneId.SYSTEM) {
|
161 | if (time instanceof _core.LocalTime) {
|
162 | return time;
|
163 | }
|
164 |
|
165 | if (time instanceof _core.LocalDateTime) {
|
166 | return time.toLocalTime();
|
167 | }
|
168 |
|
169 | if (time instanceof _core.ZonedDateTime) {
|
170 | return time.toLocalTime();
|
171 | }
|
172 |
|
173 | if (time instanceof Date) {
|
174 | return _core.LocalTime.from((0, _core.nativeJs)(time, zone));
|
175 | }
|
176 |
|
177 | if (isLocalTimeLike(time)) {
|
178 | // eslint-disable-next-line no-underscore-dangle
|
179 | return _core.LocalTime.of(time._hour, time._minute, time._second, time._nano);
|
180 | }
|
181 |
|
182 | if (typeof time === 'number') {
|
183 | return _core.LocalTime.ofSecondOfDay(time);
|
184 | }
|
185 |
|
186 | if (typeof time === 'string') {
|
187 | if (iso8601TimeOnly.test(time)) {
|
188 | return _core.LocalTime.parse(time);
|
189 | }
|
190 |
|
191 | return toLocalDateTime(time, zone).toLocalTime();
|
192 | }
|
193 |
|
194 | throw new Error('Cannot convert value to LocalTime');
|
195 | }
|
196 |
|
197 | /***/ }),
|
198 |
|
199 | /***/ "./formatDate.ts":
|
200 | /*!***********************!*\
|
201 | !*** ./formatDate.ts ***!
|
202 | \***********************/
|
203 | /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
204 |
|
205 |
|
206 |
|
207 | Object.defineProperty(exports, "__esModule", ({
|
208 | value: true
|
209 | }));
|
210 | exports.FormatDateType = void 0;
|
211 | exports.formatDate = formatDate;
|
212 |
|
213 | var _core = __webpack_require__(/*! @js-joda/core */ "@js-joda/core");
|
214 |
|
215 | var _locale_en = __webpack_require__(/*! @js-joda/locale_en */ "@js-joda/locale_en");
|
216 |
|
217 | __webpack_require__(/*! @js-joda/timezone */ "@js-joda/timezone");
|
218 |
|
219 | var _conversion = __webpack_require__(/*! ./conversion */ "./conversion.ts");
|
220 |
|
221 | let FormatDateType;
|
222 | exports.FormatDateType = FormatDateType;
|
223 |
|
224 | (function (FormatDateType) {
|
225 | FormatDateType["short"] = "short";
|
226 | FormatDateType["medium"] = "medium";
|
227 | FormatDateType["long"] = "long";
|
228 | })(FormatDateType || (exports.FormatDateType = FormatDateType = {}));
|
229 |
|
230 | /**
|
231 | * Formats a date to a string
|
232 | * @param obj
|
233 | * @param params
|
234 | * @param zone
|
235 | */
|
236 | function formatDate(obj, {
|
237 | type = FormatDateType.short,
|
238 | time = false,
|
239 | date = true,
|
240 | format
|
241 | } = {
|
242 | type: FormatDateType.short,
|
243 | time: false,
|
244 | date: true
|
245 | }, zone = _core.ZoneId.SYSTEM) {
|
246 | let l;
|
247 | if (!obj) return '';
|
248 | if (typeof obj === 'number') l = (0, _conversion.toLocalDate)(obj);
|
249 | if (typeof obj === 'string' && time === false) l = (0, _conversion.toLocalDate)(obj);
|
250 | if (typeof obj === 'string') l = (0, _conversion.toLocalDateTime)(obj);
|
251 | if ((0, _conversion.isLocalDateLike)(obj)) l = (0, _conversion.toLocalDate)(obj);
|
252 | if (obj instanceof Date) l = (0, _conversion.toLocalDateTime)(obj, zone);
|
253 | if (obj instanceof _core.LocalDate) l = obj;
|
254 | if (obj instanceof _core.LocalDateTime) l = obj;
|
255 | if (obj instanceof _core.LocalTime) l = obj;
|
256 | if (obj instanceof _core.ZonedDateTime) l = obj;
|
257 | if (!l) throw new Error('Date could not be converted to a js-joda date');
|
258 | let dateFormat;
|
259 | let timeFormat;
|
260 |
|
261 | switch (type) {
|
262 | case FormatDateType.medium:
|
263 | dateFormat = 'MMM d, yyyy';
|
264 | timeFormat = 'h:mm a';
|
265 | break;
|
266 |
|
267 | case FormatDateType.long:
|
268 | dateFormat = 'MMMM d, yyyy';
|
269 | timeFormat = 'h:mm a';
|
270 | break;
|
271 |
|
272 | case FormatDateType.short:
|
273 | default:
|
274 | dateFormat = 'M/d/yyyy';
|
275 | timeFormat = 'h:mm a';
|
276 | break;
|
277 | }
|
278 |
|
279 | if (l instanceof _core.LocalDate) timeFormat = '';
|
280 | if (l instanceof _core.LocalTime) dateFormat = '';
|
281 | let formatString = !date ? '' : dateFormat;
|
282 |
|
283 | if (time) {
|
284 | formatString = `${formatString} ${timeFormat}`.trim();
|
285 | }
|
286 |
|
287 | const formatter = _core.DateTimeFormatter.ofPattern(format || formatString).withLocale(_locale_en.Locale.ENGLISH);
|
288 |
|
289 | return l.format(formatter).replace(/AM|PM/, x => x.toLowerCase());
|
290 | }
|
291 |
|
292 | /***/ }),
|
293 |
|
294 | /***/ "./getMonthNames.ts":
|
295 | /*!**************************!*\
|
296 | !*** ./getMonthNames.ts ***!
|
297 | \**************************/
|
298 | /***/ ((__unused_webpack_module, exports) => {
|
299 |
|
300 |
|
301 |
|
302 | Object.defineProperty(exports, "__esModule", ({
|
303 | value: true
|
304 | }));
|
305 | exports.getMonthNames = getMonthNames;
|
306 |
|
307 | /**
|
308 | * Returns an array of month name strings up to the current month.
|
309 | * @param year: {number}, The year to get the months for.
|
310 | * @param limitToCurrentMonth = false: {boolean}, If set to true returns all the months for the current year.
|
311 | */
|
312 | function getMonthNames({
|
313 | year,
|
314 | limitToCurrentMonth = true
|
315 | } = {}) {
|
316 | const array = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
317 | const date = new Date();
|
318 | const currentYear = date.getFullYear();
|
319 | const currentMonth = date.getMonth();
|
320 |
|
321 | if (year) {
|
322 | if (year > currentYear) return [];
|
323 |
|
324 | if (year === currentYear && limitToCurrentMonth) {
|
325 | return array.slice(0, currentMonth + 1);
|
326 | }
|
327 | }
|
328 |
|
329 | return array;
|
330 | }
|
331 |
|
332 | /***/ }),
|
333 |
|
334 | /***/ "./getNumberOfDaysInMonth.ts":
|
335 | /*!***********************************!*\
|
336 | !*** ./getNumberOfDaysInMonth.ts ***!
|
337 | \***********************************/
|
338 | /***/ ((__unused_webpack_module, exports) => {
|
339 |
|
340 |
|
341 |
|
342 | Object.defineProperty(exports, "__esModule", ({
|
343 | value: true
|
344 | }));
|
345 | exports.getNumberOfDaysInMonth = getNumberOfDaysInMonth;
|
346 |
|
347 | /**
|
348 | * Returns the number of days in a given month.
|
349 | * @param month: {number}, The number of the month to get where January = 1.
|
350 | * @param limitToCurrentDay = false: {boolean}, If set to true, returns number of days up to current day.
|
351 | * @param asArray = false: {boolean}, If set to true, returns array of days.
|
352 | */
|
353 | function getNumberOfDaysInMonth({
|
354 | month,
|
355 | limitToCurrentDay = false,
|
356 | asArray = false
|
357 | }) {
|
358 | const days = limitToCurrentDay && month === new Date().getMonth() + 1 ? new Date().getDate() : new Date(2019, month, 0).getDate();
|
359 | if (!asArray) return days;
|
360 | const daysArray = [];
|
361 |
|
362 | for (let i = 1; i <= days; i++) {
|
363 | daysArray.push(i);
|
364 | }
|
365 |
|
366 | return daysArray;
|
367 | }
|
368 |
|
369 | /***/ }),
|
370 |
|
371 | /***/ "./specialFormats.ts":
|
372 | /*!***************************!*\
|
373 | !*** ./specialFormats.ts ***!
|
374 | \***************************/
|
375 | /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
376 |
|
377 |
|
378 |
|
379 | Object.defineProperty(exports, "__esModule", ({
|
380 | value: true
|
381 | }));
|
382 | exports.getTimeOfDay = getTimeOfDay;
|
383 |
|
384 | var _core = __webpack_require__(/*! @js-joda/core */ "@js-joda/core");
|
385 |
|
386 | function getTimeOfDay(time) {
|
387 | return {
|
388 | time: time.get(_core.ChronoField.CLOCK_HOUR_OF_AMPM).toString().concat(':', time.minute() < 10 ? '0' : '', time.minute().toString()),
|
389 | timeOfDay: time.hour() < 12 ? 'morning' : 'afternoon'
|
390 | };
|
391 | }
|
392 |
|
393 | /***/ }),
|
394 |
|
395 | /***/ "@js-joda/core":
|
396 | /*!********************************!*\
|
397 | !*** external "@js-joda/core" ***!
|
398 | \********************************/
|
399 | /***/ ((module) => {
|
400 |
|
401 | module.exports = require("@js-joda/core");
|
402 |
|
403 | /***/ }),
|
404 |
|
405 | /***/ "@js-joda/locale_en":
|
406 | /*!*************************************!*\
|
407 | !*** external "@js-joda/locale_en" ***!
|
408 | \*************************************/
|
409 | /***/ ((module) => {
|
410 |
|
411 | module.exports = require("@js-joda/locale_en");
|
412 |
|
413 | /***/ }),
|
414 |
|
415 | /***/ "@js-joda/timezone":
|
416 | /*!************************************!*\
|
417 | !*** external "@js-joda/timezone" ***!
|
418 | \************************************/
|
419 | /***/ ((module) => {
|
420 |
|
421 | module.exports = require("@js-joda/timezone");
|
422 |
|
423 | /***/ })
|
424 |
|
425 | /******/ });
|
426 | /************************************************************************/
|
427 | /******/ // The module cache
|
428 | /******/ var __webpack_module_cache__ = {};
|
429 | /******/
|
430 | /******/ // The require function
|
431 | /******/ function __webpack_require__(moduleId) {
|
432 | /******/ // Check if module is in cache
|
433 | /******/ var cachedModule = __webpack_module_cache__[moduleId];
|
434 | /******/ if (cachedModule !== undefined) {
|
435 | /******/ return cachedModule.exports;
|
436 | /******/ }
|
437 | /******/ // Create a new module (and put it into the cache)
|
438 | /******/ var module = __webpack_module_cache__[moduleId] = {
|
439 | /******/ // no module.id needed
|
440 | /******/ // no module.loaded needed
|
441 | /******/ exports: {}
|
442 | /******/ };
|
443 | /******/
|
444 | /******/ // Execute the module function
|
445 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
446 | /******/
|
447 | /******/ // Return the exports of the module
|
448 | /******/ return module.exports;
|
449 | /******/ }
|
450 | /******/
|
451 | /************************************************************************/
|
452 | var __webpack_exports__ = {};
|
453 | // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
|
454 | (() => {
|
455 | var exports = __webpack_exports__;
|
456 | /*!******************!*\
|
457 | !*** ./index.ts ***!
|
458 | \******************/
|
459 |
|
460 |
|
461 | Object.defineProperty(exports, "__esModule", ({
|
462 | value: true
|
463 | }));
|
464 | Object.defineProperty(exports, "FormatDateType", ({
|
465 | enumerable: true,
|
466 | get: function () {
|
467 | return _formatDate.FormatDateType;
|
468 | }
|
469 | }));
|
470 | Object.defineProperty(exports, "formatDate", ({
|
471 | enumerable: true,
|
472 | get: function () {
|
473 | return _formatDate.formatDate;
|
474 | }
|
475 | }));
|
476 | Object.defineProperty(exports, "getMonthNames", ({
|
477 | enumerable: true,
|
478 | get: function () {
|
479 | return _getMonthNames.getMonthNames;
|
480 | }
|
481 | }));
|
482 | Object.defineProperty(exports, "getNumberOfDaysInMonth", ({
|
483 | enumerable: true,
|
484 | get: function () {
|
485 | return _getNumberOfDaysInMonth.getNumberOfDaysInMonth;
|
486 | }
|
487 | }));
|
488 | Object.defineProperty(exports, "getTimeOfDay", ({
|
489 | enumerable: true,
|
490 | get: function () {
|
491 | return _specialFormats.getTimeOfDay;
|
492 | }
|
493 | }));
|
494 | Object.defineProperty(exports, "toDate", ({
|
495 | enumerable: true,
|
496 | get: function () {
|
497 | return _conversion.toDate;
|
498 | }
|
499 | }));
|
500 | Object.defineProperty(exports, "toEpochDay", ({
|
501 | enumerable: true,
|
502 | get: function () {
|
503 | return _conversion.toEpochDay;
|
504 | }
|
505 | }));
|
506 | Object.defineProperty(exports, "toLocalDate", ({
|
507 | enumerable: true,
|
508 | get: function () {
|
509 | return _conversion.toLocalDate;
|
510 | }
|
511 | }));
|
512 | Object.defineProperty(exports, "toLocalDateTime", ({
|
513 | enumerable: true,
|
514 | get: function () {
|
515 | return _conversion.toLocalDateTime;
|
516 | }
|
517 | }));
|
518 | Object.defineProperty(exports, "toLocalTime", ({
|
519 | enumerable: true,
|
520 | get: function () {
|
521 | return _conversion.toLocalTime;
|
522 | }
|
523 | }));
|
524 |
|
525 | var _formatDate = __webpack_require__(/*! ./formatDate */ "./formatDate.ts");
|
526 |
|
527 | var _getMonthNames = __webpack_require__(/*! ./getMonthNames */ "./getMonthNames.ts");
|
528 |
|
529 | var _getNumberOfDaysInMonth = __webpack_require__(/*! ./getNumberOfDaysInMonth */ "./getNumberOfDaysInMonth.ts");
|
530 |
|
531 | var _conversion = __webpack_require__(/*! ./conversion */ "./conversion.ts");
|
532 |
|
533 | var _specialFormats = __webpack_require__(/*! ./specialFormats */ "./specialFormats.ts");
|
534 | })();
|
535 |
|
536 | module.exports = __webpack_exports__;
|
537 | /******/ })()
|
538 | ;
|
539 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxJQUFJSCxJQUFyQixFQUEyQkcsQ0FBQyxFQUE1QixFQUFnQztBQUMvQkQsSUFBQUEsU0FBUyxDQUFDRSxJQUFWLENBQWVELENBQWY7QUFDQTs7QUFDRCxTQUFPRCxTQUFQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEJEOztBQU9PLFNBQVNHLFlBQVQsQ0FBc0IzRSxJQUF0QixFQUFrRDtBQUN4RCxTQUFPO0FBQ05BLElBQUFBLElBQUksRUFBRUEsSUFBSSxDQUNSNEUsR0FESSxDQUNBQyxrQkFBWUMsa0JBRFosRUFFSkMsUUFGSSxHQUdKQyxNQUhJLENBR0csR0FISCxFQUdRaEYsSUFBSSxDQUFDOEIsTUFBTCxLQUFnQixFQUFoQixHQUFxQixHQUFyQixHQUEyQixFQUhuQyxFQUd1QzlCLElBQUksQ0FBQzhCLE1BQUwsR0FBY2lELFFBQWQsRUFIdkMsQ0FEQTtBQUtORSxJQUFBQSxTQUFTLEVBQUVqRixJQUFJLENBQUM2QixJQUFMLEtBQWMsRUFBZCxHQUFtQixTQUFuQixHQUErQjtBQUxwQyxHQUFQO0FBT0E7Ozs7Ozs7Ozs7QUNmRDs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7OztVQ0FBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0QkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0EseUYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb252ZXJzaW9uLnRzIiwid2VicGFjazovLy8uL2Zvcm1hdERhdGUudHMiLCJ3ZWJwYWNrOi8vLy4vZ2V0TW9udGhOYW1lcy50cyIsIndlYnBhY2s6Ly8vLi9nZXROdW1iZXJPZkRheXNJbk1vbnRoLnRzIiwid2VicGFjazovLy8uL3NwZWNpYWxGb3JtYXRzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBjb21tb25qcyBcIkBqcy1qb2RhL2NvcmVcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgY29tbW9uanMgXCJAanMtam9kYS9sb2NhbGVfZW5cIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgY29tbW9uanMgXCJAanMtam9kYS90aW1lem9uZVwiIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vLi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xvY2FsRGF0ZSwgTG9jYWxEYXRlVGltZSwgbmF0aXZlSnMsIFpvbmVkRGF0ZVRpbWUsIFpvbmVJZCwgTG9jYWxUaW1lfSBmcm9tICdAanMtam9kYS9jb3JlJztcblxuLypcbiAgUG9zc2libGUgRGF0ZSBUeXBlc1xuXG4gIExvY2FsRGF0ZSAtIGpzLWpvZGEgZGF0ZSB3aXRoIG5vIHRpbWVcbiAgT2JqZWN0IC0gT2JqZWN0IHdpdGggZmllbGRzIHRoYXQgbG9vayBsaWtlIExvY2FsRGF0ZSBpbnRlcm5hbHMuIFNlZSBJTG9jYWxEYXRlTGlrZSBiZWxvdy5cbiAgRXBvY2ggRGF5cyAtIGpzLWpvZGEgbnVtYmVyIG9mIGRheXMgc2luY2UgZXBvY2ggKEphbiAxLCAxOTcwKVxuICBMb2NhbERhdGVUaW1lIC0ganMtam9kYSBkYXRlIHdpdGggdGltZSAobm8gem9uZSlcbiAgWm9uZWREYXRlVGltZSAtIGpzLWpvZGEgZGF0ZSB3aXRoIHRpbWUgYW5kIHpvbmVcbiAgRGF0ZSAtIGphdmFzY3JpcHQgZGF0ZSB3aXRoIHRpbWUgKG5vIHpvbmUpXG4gIFN0cmluZyAtIElTTzg2MDEgZGF0ZSBzdHJpbmcgKHdpdGhvdXQgdGltZSwgd2l0aCB0aW1lLCB3aXRoIHRpbWUgYW5kIHpvbmUpXG4gIExvY2FsVGltZSAtIGpzLWpvZGEgdGltZSAobm8gem9uZSlcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIElMb2NhbERhdGVMaWtlIHtcblx0X3llYXI6IG51bWJlcjtcblx0X21vbnRoOiBudW1iZXI7XG5cdF9kYXk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYWxEYXRlTGlrZShkYXRlOiBhbnkpOiBkYXRlIGlzIElMb2NhbERhdGVMaWtlIHtcblx0cmV0dXJuIChcblx0XHRkYXRlICE9PSBudWxsICYmXG5cdFx0ZGF0ZSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0dHlwZW9mIGRhdGUgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIGRhdGUuX3llYXIgIT09ICd1bmRlZmluZWQnICYmXG5cdFx0dHlwZW9mIGRhdGUuX21vbnRoICE9PSAndW5kZWZpbmVkJyAmJlxuXHRcdHR5cGVvZiBkYXRlLl9kYXkgIT09ICd1bmRlZmluZWQnXG5cdCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvY2FsVGltZUxpa2Uge1xuXHRfaG91cjogbnVtYmVyO1xuXHRfbWludXRlOiBudW1iZXI7XG5cdF9zZWNvbmQ6IG51bWJlcjtcblx0X25hbm86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYWxUaW1lTGlrZSh0aW1lOiBhbnkpOiB0aW1lIGlzIElMb2NhbFRpbWVMaWtlIHtcblx0cmV0dXJuIChcblx0XHR0aW1lICE9PSBudWxsICYmXG5cdFx0dGltZSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0dHlwZW9mIHRpbWUgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIHRpbWUuX2hvdXIgIT09ICd1bmRlZmluZWQnICYmXG5cdFx0dHlwZW9mIHRpbWUuX21pbnV0ZSAhPT0gJ3VuZGVmaW5lZCcgJiZcblx0XHR0eXBlb2YgdGltZS5fc2Vjb25kICE9PSAndW5kZWZpbmVkJyAmJlxuXHRcdHR5cGVvZiB0aW1lLl9uYW5vICE9PSAndW5kZWZpbmVkJ1xuXHQpO1xufVxuXG4vLyBjb25zdCBpc284NjAxUmVnZXggPSAvXihbKy1dP1xcZHs0fSg/IVxcZHsyfVxcYikpKCgtPykoKDBbMS05XXwxWzAtMl0pKFxcMyhbMTJdXFxkfDBbMS05XXwzWzAxXSkpP3xXKFswLTRdXFxkfDVbMC0yXSkoLT9bMS03XSk/fCgwMFsxLTldfDBbMS05XVxcZHxbMTJdXFxkezJ9fDMoWzAtNV1cXGR8NlsxLTZdKSkpKFtUXFxzXSgoKFswMV1cXGR8MlswLTNdKSgoOj8pWzAtNV1cXGQpP3wyNDo/MDApKFsuLF1cXGQrKD8hOikpPyk/KFxcMTdbMC01XVxcZChbLixdXFxkKyk/KT8oW3paXXwoWystXSkoWzAxXVxcZHwyWzAtM10pOj8oWzAtNV1cXGQpPyk/KT8pPyQvO1xuY29uc3QgaXNvODYwMURhdGVPbmx5ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuY29uc3QgaXNvODYwMUNvbnRhaW5zWm9uZSA9IC8oWnxbKy1dXFxkezJ9OlxcZHsyfSkkLztcbmNvbnN0IGlzbzg2MDFUaW1lT25seSA9IC9eXFxkezJ9OlxcZHsyfSg6XFxkezJ9KFxcLlxcZHsxLDl9KT8pPyQvO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9Mb2NhbERhdGUoZGF0ZTogYW55LCB6b25lOiBab25lSWQgPSBab25lSWQuU1lTVEVNKTogTG9jYWxEYXRlIHtcblx0aWYgKGRhdGUgaW5zdGFuY2VvZiBMb2NhbERhdGUpIHtcblx0XHRyZXR1cm4gZGF0ZTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIHtcblx0XHQvLyBUaGlzIGNob3BzIHRoZSB0aW1lIG9mZiwgYmVjYXVzZSAnbG9jYWwnIGRhdGV0aW1lID09PSAnbG9jYWwgZGF0ZS5cblx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsRGF0ZSgpO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgWm9uZWREYXRlVGltZSkge1xuXHRcdC8vIFVuc3VyZSBvZiB0aGlzXG5cdFx0cmV0dXJuIGRhdGUudG9Mb2NhbERhdGUoKTtcblx0fVxuXHRpZiAodHlwZW9mIGRhdGUgPT09ICdudW1iZXInKSB7XG5cdFx0cmV0dXJuIExvY2FsRGF0ZS5vZkVwb2NoRGF5KGRhdGUpO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdC8vIEphdmFzY3JpcHQgZGF0ZXMgYXJlIGV2aWwuIFRoZXkgYXNzdW1lIHlvdSBhcmUgaW4gU1lTVEVNIHpvbmUgd2hlbiByZWFkaW5nLCBidXQgY2FuIHNldCBhcyBhbnkgem9uZS5cblx0XHRyZXR1cm4gTG9jYWxEYXRlLmZyb20obmF0aXZlSnMoZGF0ZSwgem9uZSkpO1xuXHR9XG5cdGlmIChpc0xvY2FsRGF0ZUxpa2UoZGF0ZSkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcblx0XHRyZXR1cm4gTG9jYWxEYXRlLm9mKGRhdGUuX3llYXIsIGRhdGUuX21vbnRoLCBkYXRlLl9kYXkpO1xuXHR9XG5cdGlmICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRpZiAoaXNvODYwMURhdGVPbmx5LnRlc3QoZGF0ZSkpIHtcblx0XHRcdHJldHVybiBMb2NhbERhdGUucGFyc2UoZGF0ZSk7XG5cdFx0fVxuXHRcdGlmIChpc284NjAxQ29udGFpbnNab25lLnRlc3QoZGF0ZSkpIHtcblx0XHRcdHJldHVybiBab25lZERhdGVUaW1lLnBhcnNlKGRhdGUpLnRvTG9jYWxEYXRlKCk7XG5cdFx0fVxuXHRcdHJldHVybiBMb2NhbERhdGVUaW1lLnBhcnNlKGRhdGUpLnRvTG9jYWxEYXRlKCk7XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCB2YWx1ZSB0byBMb2NhbERhdGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRXBvY2hEYXkoZGF0ZTogYW55LCB6b25lOiBab25lSWQgPSBab25lSWQuU1lTVEVNKTogbnVtYmVyIHtcblx0aWYgKHR5cGVvZiBkYXRlID09PSAnbnVtYmVyJykge1xuXHRcdHJldHVybiBkYXRlO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgTG9jYWxEYXRlKSB7XG5cdFx0cmV0dXJuIGRhdGUudG9FcG9jaERheSgpO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgTG9jYWxEYXRlVGltZSB8fCBkYXRlIGluc3RhbmNlb2YgWm9uZWREYXRlVGltZSB8fCBkYXRlIGluc3RhbmNlb2YgRGF0ZSB8fCBpc0xvY2FsRGF0ZUxpa2UoZGF0ZSkgfHwgdHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHRvTG9jYWxEYXRlKGRhdGUsIHpvbmUpLnRvRXBvY2hEYXkoKTtcblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gZXBvY2ggaW50ZWdlcicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Mb2NhbERhdGVUaW1lKGRhdGU6IGFueSwgem9uZTogWm9uZUlkID0gWm9uZUlkLlNZU1RFTSk6IExvY2FsRGF0ZVRpbWUge1xuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gZGF0ZTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIFpvbmVkRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsRGF0ZVRpbWUoKTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcblx0XHRyZXR1cm4gTG9jYWxEYXRlVGltZS5mcm9tKG5hdGl2ZUpzKGRhdGUsIHpvbmUpKTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZSB8fCBpc0xvY2FsRGF0ZUxpa2UoZGF0ZSkgfHwgdHlwZW9mIGRhdGUgPT09ICdudW1iZXInKSB7XG5cdFx0Y29uc3QgbG9jYWxEYXRlID0gdG9Mb2NhbERhdGUoZGF0ZSk7XG5cdFx0cmV0dXJuIExvY2FsRGF0ZVRpbWUub2YobG9jYWxEYXRlLnllYXIoKSwgbG9jYWxEYXRlLm1vbnRoVmFsdWUoKSwgbG9jYWxEYXRlLmRheU9mTW9udGgoKSwgMCwgMCwgMCwgMCk7XG5cdH1cblx0aWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuXHRcdGlmIChpc284NjAxRGF0ZU9ubHkudGVzdChkYXRlKSkge1xuXHRcdFx0cmV0dXJuIHRvTG9jYWxEYXRlVGltZShMb2NhbERhdGUucGFyc2UoZGF0ZSkpO1xuXHRcdH1cblx0XHRpZiAoaXNvODYwMUNvbnRhaW5zWm9uZS50ZXN0KGRhdGUpKSB7XG5cdFx0XHRyZXR1cm4gWm9uZWREYXRlVGltZS5wYXJzZShkYXRlKS50b0xvY2FsRGF0ZVRpbWUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIExvY2FsRGF0ZVRpbWUucGFyc2UoZGF0ZSk7XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCB2YWx1ZSB0byBMb2NhbERhdGVUaW1lJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGUoZGF0ZTogYW55KTogRGF0ZSB7XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdHJldHVybiBkYXRlO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgTG9jYWxEYXRlIHx8IGRhdGUgaW5zdGFuY2VvZiBab25lZERhdGVUaW1lKSB7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKGRhdGUueWVhcigpLCBkYXRlLm1vbnRoVmFsdWUoKSAtIDEsIGRhdGUuZGF5T2ZNb250aCgpKTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gbmV3IERhdGUoZGF0ZS55ZWFyKCksIGRhdGUubW9udGhWYWx1ZSgpIC0gMSwgZGF0ZS5kYXlPZk1vbnRoKCksIGRhdGUuaG91cigpLCBkYXRlLm1pbnV0ZSgpLCBkYXRlLnNlY29uZCgpLCBkYXRlLm5hbm8oKSAvIDEwMDAwMDApO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgTG9jYWxUaW1lKSB7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKDE5NzAsIDEsIDEsIGRhdGUuaG91cigpLCBkYXRlLm1pbnV0ZSgpLCBkYXRlLnNlY29uZCgpLCBkYXRlLm5hbm8oKSAvIDEwMDAwMDApO1xuXHR9XG5cdGlmICh0eXBlb2YgZGF0ZSA9PT0gJ251bWJlcicgfHwgaXNMb2NhbERhdGVMaWtlKGRhdGUpKSB7XG5cdFx0cmV0dXJuIHRvRGF0ZSh0b0xvY2FsRGF0ZShkYXRlKSk7XG5cdH1cblx0aWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiBuZXcgRGF0ZShkYXRlKTtcblx0fVxuXHR0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIERhdGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvTG9jYWxUaW1lKHRpbWU6IGFueSwgem9uZTogWm9uZUlkID0gWm9uZUlkLlNZU1RFTSk6IExvY2FsVGltZSB7XG5cdGlmICh0aW1lIGluc3RhbmNlb2YgTG9jYWxUaW1lKSB7XG5cdFx0cmV0dXJuIHRpbWU7XG5cdH1cblx0aWYgKHRpbWUgaW5zdGFuY2VvZiBMb2NhbERhdGVUaW1lKSB7XG5cdFx0cmV0dXJuIHRpbWUudG9Mb2NhbFRpbWUoKTtcblx0fVxuXHRpZiAodGltZSBpbnN0YW5jZW9mIFpvbmVkRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gdGltZS50b0xvY2FsVGltZSgpO1xuXHR9XG5cdGlmICh0aW1lIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdHJldHVybiBMb2NhbFRpbWUuZnJvbShuYXRpdmVKcyh0aW1lLCB6b25lKSk7XG5cdH1cblx0aWYgKGlzTG9jYWxUaW1lTGlrZSh0aW1lKSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuXHRcdHJldHVybiBMb2NhbFRpbWUub2YodGltZS5faG91ciwgdGltZS5fbWludXRlLCB0aW1lLl9zZWNvbmQsIHRpbWUuX25hbm8pO1xuXHR9XG5cdGlmICh0eXBlb2YgdGltZSA9PT0gJ251bWJlcicpIHtcblx0XHRyZXR1cm4gTG9jYWxUaW1lLm9mU2Vjb25kT2ZEYXkodGltZSk7XG5cdH1cblx0aWYgKHR5cGVvZiB0aW1lID09PSAnc3RyaW5nJykge1xuXHRcdGlmIChpc284NjAxVGltZU9ubHkudGVzdCh0aW1lKSkge1xuXHRcdFx0cmV0dXJuIExvY2FsVGltZS5wYXJzZSh0aW1lKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRvTG9jYWxEYXRlVGltZSh0aW1lLCB6b25lKS50b0xvY2FsVGltZSgpO1xuXHR9XG5cdHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gTG9jYWxUaW1lJyk7XG59XG4iLCJpbXBvcnQge0RhdGVUaW1lRm9ybWF0dGVyLCBMb2NhbERhdGUsIExvY2FsRGF0ZVRpbWUsIExvY2FsVGltZSwgWm9uZWREYXRlVGltZSwgWm9uZUlkfSBmcm9tICdAanMtam9kYS9jb3JlJztcbmltcG9ydCB7TG9jYWxlfSBmcm9tICdAanMtam9kYS9sb2NhbGVfZW4nO1xuaW1wb3J0ICdAanMtam9kYS90aW1lem9uZSc7XG5pbXBvcnQge3RvTG9jYWxEYXRlLCB0b0xvY2FsRGF0ZVRpbWUsIElMb2NhbERhdGVMaWtlLCBpc0xvY2FsRGF0ZUxpa2V9IGZyb20gJy4vY29udmVyc2lvbic7XG5cbmV4cG9ydCBlbnVtIEZvcm1hdERhdGVUeXBlIHtcblx0c2hvcnQgPSAnc2hvcnQnLFxuXHRtZWRpdW0gPSAnbWVkaXVtJyxcblx0bG9uZyA9ICdsb25nJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXREYXRlUGFyYW1zIHtcblx0dHlwZT86IEZvcm1hdERhdGVUeXBlIHwgJ3Nob3J0JyB8ICdtZWRpdW0nIHwgJ2xvbmcnO1xuXHR0aW1lPzogYm9vbGVhbjtcblx0ZGF0ZT86IGJvb2xlYW47XG5cdGZvcm1hdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBGb3JtYXRzIGEgZGF0ZSB0byBhIHN0cmluZ1xuICogQHBhcmFtIG9ialxuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIHpvbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoXG5cdG9iajogSUxvY2FsRGF0ZUxpa2UgfCBEYXRlIHwgTG9jYWxEYXRlIHwgbnVtYmVyIHwgc3RyaW5nIHwgTG9jYWxEYXRlVGltZSB8IExvY2FsVGltZSB8IFpvbmVkRGF0ZVRpbWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHR7dHlwZSA9IEZvcm1hdERhdGVUeXBlLnNob3J0LCB0aW1lID0gZmFsc2UsIGRhdGUgPSB0cnVlLCBmb3JtYXR9OiBGb3JtYXREYXRlUGFyYW1zID0ge3R5cGU6IEZvcm1hdERhdGVUeXBlLnNob3J0LCB0aW1lOiBmYWxzZSwgZGF0ZTogdHJ1ZX0sXG5cdHpvbmU6IFpvbmVJZCA9IFpvbmVJZC5TWVNURU0sXG4pIHtcblx0bGV0IGw6IExvY2FsRGF0ZSB8IExvY2FsRGF0ZVRpbWUgfCBMb2NhbFRpbWUgfCBab25lZERhdGVUaW1lIHwgdW5kZWZpbmVkO1xuXHRpZiAoIW9iaikgcmV0dXJuICcnO1xuXHRpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIGwgPSB0b0xvY2FsRGF0ZShvYmopO1xuXHRpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgJiYgdGltZSA9PT0gZmFsc2UpIGwgPSB0b0xvY2FsRGF0ZShvYmopO1xuXHRpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIGwgPSB0b0xvY2FsRGF0ZVRpbWUob2JqKTtcblx0aWYgKGlzTG9jYWxEYXRlTGlrZShvYmopKSBsID0gdG9Mb2NhbERhdGUob2JqKTtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIGwgPSB0b0xvY2FsRGF0ZVRpbWUob2JqLCB6b25lKTtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIExvY2FsRGF0ZSkgbCA9IG9iajtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIGwgPSBvYmo7XG5cdGlmIChvYmogaW5zdGFuY2VvZiBMb2NhbFRpbWUpIGwgPSBvYmo7XG5cdGlmIChvYmogaW5zdGFuY2VvZiBab25lZERhdGVUaW1lKSBsID0gb2JqO1xuXHRpZiAoIWwpIHRocm93IG5ldyBFcnJvcignRGF0ZSBjb3VsZCBub3QgYmUgY29udmVydGVkIHRvIGEganMtam9kYSBkYXRlJyk7XG5cblx0bGV0IGRhdGVGb3JtYXQ6IHN0cmluZztcblx0bGV0IHRpbWVGb3JtYXQ6IHN0cmluZztcblx0c3dpdGNoICh0eXBlKSB7XG5cdFx0Y2FzZSBGb3JtYXREYXRlVHlwZS5tZWRpdW06XG5cdFx0XHRkYXRlRm9ybWF0ID0gJ01NTSBkLCB5eXl5Jztcblx0XHRcdHRpbWVGb3JtYXQgPSAnaDptbSBhJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRm9ybWF0RGF0ZVR5cGUubG9uZzpcblx0XHRcdGRhdGVGb3JtYXQgPSAnTU1NTSBkLCB5eXl5Jztcblx0XHRcdHRpbWVGb3JtYXQgPSAnaDptbSBhJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRm9ybWF0RGF0ZVR5cGUuc2hvcnQ6XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGRhdGVGb3JtYXQgPSAnTS9kL3l5eXknO1xuXHRcdFx0dGltZUZvcm1hdCA9ICdoOm1tIGEnO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRpZiAobCBpbnN0YW5jZW9mIExvY2FsRGF0ZSkgdGltZUZvcm1hdCA9ICcnO1xuXHRpZiAobCBpbnN0YW5jZW9mIExvY2FsVGltZSkgZGF0ZUZvcm1hdCA9ICcnO1xuXG5cdGxldCBmb3JtYXRTdHJpbmcgPSAhZGF0ZSA/ICcnIDogZGF0ZUZvcm1hdDtcblx0aWYgKHRpbWUpIHtcblx0XHRmb3JtYXRTdHJpbmcgPSBgJHtmb3JtYXRTdHJpbmd9ICR7dGltZUZvcm1hdH1gLnRyaW0oKTtcblx0fVxuXG5cdGNvbnN0IGZvcm1hdHRlciA9IERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybihmb3JtYXQgfHwgZm9ybWF0U3RyaW5nKS53aXRoTG9jYWxlKExvY2FsZS5FTkdMSVNIKTtcblxuXHRyZXR1cm4gbC5mb3JtYXQoZm9ybWF0dGVyKS5yZXBsYWNlKC9BTXxQTS8sIHggPT4geC50b0xvd2VyQ2FzZSgpKTtcbn1cbiIsImludGVyZmFjZSBHZXRNb250aE5hbWVQYXJhbXMge1xuXHR5ZWFyPzogbnVtYmVyO1xuXHRsaW1pdFRvQ3VycmVudE1vbnRoPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1vbnRoIG5hbWUgc3RyaW5ncyB1cCB0byB0aGUgY3VycmVudCBtb250aC5cbiAqIEBwYXJhbSB5ZWFyOiB7bnVtYmVyfSwgVGhlIHllYXIgdG8gZ2V0IHRoZSBtb250aHMgZm9yLlxuICogQHBhcmFtIGxpbWl0VG9DdXJyZW50TW9udGggPSBmYWxzZToge2Jvb2xlYW59LCBJZiBzZXQgdG8gdHJ1ZSByZXR1cm5zIGFsbCB0aGUgbW9udGhzIGZvciB0aGUgY3VycmVudCB5ZWFyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9udGhOYW1lcyh7eWVhciwgbGltaXRUb0N1cnJlbnRNb250aCA9IHRydWV9OiBHZXRNb250aE5hbWVQYXJhbXMgPSB7fSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgYXJyYXkgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXTtcblx0Y29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG5cdGNvbnN0IGN1cnJlbnRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHRjb25zdCBjdXJyZW50TW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG5cblx0aWYgKHllYXIpIHtcblx0XHRpZiAoeWVhciA+IGN1cnJlbnRZZWFyKSByZXR1cm4gW107XG5cdFx0aWYgKHllYXIgPT09IGN1cnJlbnRZZWFyICYmIGxpbWl0VG9DdXJyZW50TW9udGgpIHtcblx0XHRcdHJldHVybiBhcnJheS5zbGljZSgwLCBjdXJyZW50TW9udGggKyAxKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFycmF5O1xufVxuIiwiaW50ZXJmYWNlIEdldE1vbnRoRGF5c1BhcmFtcyB7XG5cdG1vbnRoOiBudW1iZXI7XG5cdGxpbWl0VG9DdXJyZW50RGF5PzogYm9vbGVhbjtcblx0YXNBcnJheT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgaW4gYSBnaXZlbiBtb250aC5cbiAqIEBwYXJhbSBtb250aDoge251bWJlcn0sIFRoZSBudW1iZXIgb2YgdGhlIG1vbnRoIHRvIGdldCB3aGVyZSBKYW51YXJ5ID0gMS5cbiAqIEBwYXJhbSBsaW1pdFRvQ3VycmVudERheSA9IGZhbHNlOiB7Ym9vbGVhbn0sIElmIHNldCB0byB0cnVlLCByZXR1cm5zIG51bWJlciBvZiBkYXlzIHVwIHRvIGN1cnJlbnQgZGF5LlxuICogQHBhcmFtIGFzQXJyYXkgPSBmYWxzZToge2Jvb2xlYW59LCBJZiBzZXQgdG8gdHJ1ZSwgcmV0dXJucyBhcnJheSBvZiBkYXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyT2ZEYXlzSW5Nb250aCh7bW9udGgsIGxpbWl0VG9DdXJyZW50RGF5ID0gZmFsc2UsIGFzQXJyYXkgPSBmYWxzZX06IEdldE1vbnRoRGF5c1BhcmFtcykge1xuXHRjb25zdCBkYXlzID0gbGltaXRUb0N1cnJlbnREYXkgJiYgbW9udGggPT09IG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDEgPyBuZXcgRGF0ZSgpLmdldERhdGUoKSA6IG5ldyBEYXRlKDIwMTksIG1vbnRoLCAwKS5nZXREYXRlKCk7XG5cblx0aWYgKCFhc0FycmF5KSByZXR1cm4gZGF5cztcblxuXHRjb25zdCBkYXlzQXJyYXk6IG51bWJlcltdID0gW107XG5cdGZvciAobGV0IGkgPSAxOyBpIDw9IGRheXM7IGkrKykge1xuXHRcdGRheXNBcnJheS5wdXNoKGkpO1xuXHR9XG5cdHJldHVybiBkYXlzQXJyYXk7XG59XG4iLCJpbXBvcnQge0Nocm9ub0ZpZWxkLCBMb2NhbFRpbWV9IGZyb20gJ0Bqcy1qb2RhL2NvcmUnO1xuXG5pbnRlcmZhY2UgVGltZU9mRGF5IHtcblx0dGltZTogc3RyaW5nO1xuXHR0aW1lT2ZEYXk6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVPZkRheSh0aW1lOiBMb2NhbFRpbWUpOiBUaW1lT2ZEYXkge1xuXHRyZXR1cm4ge1xuXHRcdHRpbWU6IHRpbWVcblx0XHRcdC5nZXQoQ2hyb25vRmllbGQuQ0xPQ0tfSE9VUl9PRl9BTVBNKVxuXHRcdFx0LnRvU3RyaW5nKClcblx0XHRcdC5jb25jYXQoJzonLCB0aW1lLm1pbnV0ZSgpIDwgMTAgPyAnMCcgOiAnJywgdGltZS5taW51dGUoKS50b1N0cmluZygpKSxcblx0XHR0aW1lT2ZEYXk6IHRpbWUuaG91cigpIDwgMTIgPyAnbW9ybmluZycgOiAnYWZ0ZXJub29uJyxcblx0fTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBqcy1qb2RhL2NvcmVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGpzLWpvZGEvbG9jYWxlX2VuXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBqcy1qb2RhL3RpbWV6b25lXCIpOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCJleHBvcnQge2Zvcm1hdERhdGUsIEZvcm1hdERhdGVUeXBlfSBmcm9tICcuL2Zvcm1hdERhdGUnO1xuZXhwb3J0IHtnZXRNb250aE5hbWVzfSBmcm9tICcuL2dldE1vbnRoTmFtZXMnO1xuZXhwb3J0IHtnZXROdW1iZXJPZkRheXNJbk1vbnRofSBmcm9tICcuL2dldE51bWJlck9mRGF5c0luTW9udGgnO1xuZXhwb3J0IHt0b0xvY2FsRGF0ZSwgdG9Mb2NhbERhdGVUaW1lLCB0b0RhdGUsIHRvRXBvY2hEYXksIHRvTG9jYWxUaW1lfSBmcm9tICcuL2NvbnZlcnNpb24nO1xuZXhwb3J0IHtnZXRUaW1lT2ZEYXl9IGZyb20gJy4vc3BlY2lhbEZvcm1hdHMnO1xuIl0sIm5hbWVzIjpbImlzTG9jYWxEYXRlTGlrZSIsImRhdGUiLCJ1bmRlZmluZWQiLCJfeWVhciIsIl9tb250aCIsIl9kYXkiLCJpc0xvY2FsVGltZUxpa2UiLCJ0aW1lIiwiX2hvdXIiLCJfbWludXRlIiwiX3NlY29uZCIsIl9uYW5vIiwiaXNvODYwMURhdGVPbmx5IiwiaXNvODYwMUNvbnRhaW5zWm9uZSIsImlzbzg2MDFUaW1lT25seSIsInRvTG9jYWxEYXRlIiwiem9uZSIsIlpvbmVJZCIsIlNZU1RFTSIsIkxvY2FsRGF0ZSIsIkxvY2FsRGF0ZVRpbWUiLCJab25lZERhdGVUaW1lIiwib2ZFcG9jaERheSIsIkRhdGUiLCJmcm9tIiwib2YiLCJ0ZXN0IiwicGFyc2UiLCJFcnJvciIsInRvRXBvY2hEYXkiLCJ0b0xvY2FsRGF0ZVRpbWUiLCJsb2NhbERhdGUiLCJ5ZWFyIiwibW9udGhWYWx1ZSIsImRheU9mTW9udGgiLCJ0b0RhdGUiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibmFubyIsIkxvY2FsVGltZSIsInRvTG9jYWxUaW1lIiwib2ZTZWNvbmRPZkRheSIsIkZvcm1hdERhdGVUeXBlIiwiZm9ybWF0RGF0ZSIsIm9iaiIsInR5cGUiLCJzaG9ydCIsImZvcm1hdCIsImwiLCJkYXRlRm9ybWF0IiwidGltZUZvcm1hdCIsIm1lZGl1bSIsImxvbmciLCJmb3JtYXRTdHJpbmciLCJ0cmltIiwiZm9ybWF0dGVyIiwiRGF0ZVRpbWVGb3JtYXR0ZXIiLCJvZlBhdHRlcm4iLCJ3aXRoTG9jYWxlIiwiTG9jYWxlIiwiRU5HTElTSCIsInJlcGxhY2UiLCJ4IiwidG9Mb3dlckNhc2UiLCJnZXRNb250aE5hbWVzIiwibGltaXRUb0N1cnJlbnRNb250aCIsImFycmF5IiwiY3VycmVudFllYXIiLCJnZXRGdWxsWWVhciIsImN1cnJlbnRNb250aCIsImdldE1vbnRoIiwic2xpY2UiLCJnZXROdW1iZXJPZkRheXNJbk1vbnRoIiwibW9udGgiLCJsaW1pdFRvQ3VycmVudERheSIsImFzQXJyYXkiLCJkYXlzIiwiZ2V0RGF0ZSIsImRheXNBcnJheSIsImkiLCJwdXNoIiwiZ2V0VGltZU9mRGF5IiwiZ2V0IiwiQ2hyb25vRmllbGQiLCJDTE9DS19IT1VSX09GX0FNUE0iLCJ0b1N0cmluZyIsImNvbmNhdCIsInRpbWVPZkRheSJdLCJzb3VyY2VSb290IjoiIn0= |
\ | No newline at end of file |