@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
152 lines • 20.2 kB
JavaScript
/**
* Convert a single dimension array to a double dimension array
* @param items the single dimension array to convert
* @param columns the number of items each array should have
*/
export function gridify(items, columns) {
// create a copy of array so not to effect the original
items = items.slice(0);
const grid = [];
while (items.length) {
grid.push(items.splice(0, columns));
}
return grid;
}
/**
* Create an array of numbers between two limits
* @param start the lower limit
* @param end the upper limit
*/
export function range(start, end) {
const list = [];
for (let idx = start; idx <= end; idx++) {
list.push(idx);
}
return list;
}
/**
* Create an array of dates between two points
* @param start the date to start the array
* @param end the date to end the array
*/
export function dateRange(start, end) {
// don't alter the start date object
start = new Date(start);
const dates = [];
// loop through all the days between the date range
while (start <= end) {
// add the date to the array
dates.push(new Date(start));
// move to the next day
start.setDate(start.getDate() + 1);
}
return dates;
}
/**
* Compare two dates to see if they are on the same day
* @param day1 the first date to compare
* @param day2 the second date to compare
*/
export function compareDays(day1, day2) {
return day1.getDate() === day2.getDate() &&
day1.getMonth() === day2.getMonth() &&
day1.getFullYear() === day2.getFullYear();
}
/**
* Date comparison for use primarily with distinctUntilChanged
*/
export function dateComparator(dateOne, dateTwo) {
if (!dateOne && dateTwo || dateOne && !dateTwo) {
return false;
}
if (!dateOne && !dateTwo) {
return true;
}
return dateOne.getTime() === dateTwo.getTime();
}
/**
* Calculate the number of days between two dates
* @param start The start date
* @param end The end date
* @param fullDay Whether or not we should take from 00:00 on the start date and 23:59 on the end date
*/
export function differenceBetweenDates(start, end, fullDay = true) {
if (!start || !end) {
return null;
}
const millisecondsInDay = 86400000;
const startDay = new Date(start.getTime() < end.getTime() ? start : end);
const endDay = new Date(start.getTime() > end.getTime() ? start : end);
// get the start of day
if (fullDay) {
startDay.setHours(0, 0, 0, 0);
endDay.setHours(23, 59, 59, 0);
}
return Math.round((endDay.getTime() - startDay.getTime()) / millisecondsInDay);
}
/**
* Timezone comparison for use primarily with distinctUntilChanged
*/
export function timezoneComparator(zoneOne, zoneTwo) {
return zoneOne.name === zoneTwo.name && zoneOne.offset === zoneTwo.offset;
}
/**
* Get a date object with the time of the start of the given day
* @param date The date to get the start of day
*/
export function getStartOfDay(date) {
const startOfDay = new Date(date);
startOfDay.setHours(0, 0, 0, 0);
return startOfDay;
}
export function isDateAfter(date, after, isEqual = false) {
return isEqual ? getStartOfDay(date).getTime() >= getStartOfDay(after).getTime() : getStartOfDay(date).getTime() > getStartOfDay(after).getTime();
}
export function isDateBefore(date, before, isEqual = false) {
return isEqual ? getStartOfDay(date).getTime() <= getStartOfDay(before).getTime() : getStartOfDay(date).getTime() < getStartOfDay(before).getTime();
}
/**
* Export an array of all the available months
*/
export const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
export const monthsShort = getShortMonthNames();
function getShortMonthNames() {
return months.map(month => month.substring(0, 3));
}
/**
* Export an array of all the available days of the week
*/
export const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
export const weekdaysShort = getShortWeekdayNames();
export const meridians = ['AM', 'PM'];
function getShortWeekdayNames() {
return weekdays.map(weekday => weekday.substring(0, 3));
}
/** Export the default set of time zone */
export const timezones = [
{ name: 'GMT-11', offset: 660 },
{ name: 'GMT-10', offset: 600 },
{ name: 'GMT-9', offset: 540 },
{ name: 'GMT-8', offset: 480 },
{ name: 'GMT-7', offset: 420 },
{ name: 'GMT-6', offset: 360 },
{ name: 'GMT-5', offset: 300 },
{ name: 'GMT-4', offset: 240 },
{ name: 'GMT-3', offset: 180 },
{ name: 'GMT-2', offset: 120 },
{ name: 'GMT-1', offset: 60 },
{ name: 'GMT', offset: 0 },
{ name: 'GMT+1', offset: -60 },
{ name: 'GMT+2', offset: -120 },
{ name: 'GMT+3', offset: -180 },
{ name: 'GMT+4', offset: -240 },
{ name: 'GMT+5', offset: -300 },
{ name: 'GMT+6', offset: -360 },
{ name: 'GMT+7', offset: -420 },
{ name: 'GMT+8', offset: -480 },
{ name: 'GMT+9', offset: -540 },
{ name: 'GMT+10', offset: -600 },
{ name: 'GMT+11', offset: -660 },
{ name: 'GMT+12', offset: -720 }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBSSxLQUFVLEVBQUUsT0FBZTtJQUVsRCx1REFBdUQ7SUFDdkQsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkIsTUFBTSxJQUFJLEdBQVUsRUFBRSxDQUFDO0lBRXZCLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQWEsRUFBRSxHQUFXO0lBQzVDLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUUxQixLQUFLLElBQUksR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQVcsRUFBRSxHQUFTO0lBRTVDLG9DQUFvQztJQUNwQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEIsTUFBTSxLQUFLLEdBQVcsRUFBRSxDQUFDO0lBRXpCLG1EQUFtRDtJQUNuRCxPQUFPLEtBQUssSUFBSSxHQUFH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RUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtJQUM5QixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUM3QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTtJQUMxQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQzlCLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUU7SUFDL0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRTtJQUMvQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO0lBQy9CLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUU7SUFDL0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRTtJQUMvQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO0lBQy9CLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUU7SUFDL0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRTtJQUMvQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO0lBQ2hDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUU7SUFDaEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRTtDQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb252ZXJ0IGEgc2luZ2xlIGRpbWVuc2lvbiBhcnJheSB0byBhIGRvdWJsZSBkaW1lbnNpb24gYXJyYXlcbiAqIEBwYXJhbSBpdGVtcyB0aGUgc2luZ2xlIGRpbWVuc2lvbiBhcnJheSB0byBjb252ZXJ0XG4gKiBAcGFyYW0gY29sdW1ucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGVhY2ggYXJyYXkgc2hvdWxkIGhhdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyaWRpZnk8VD4oaXRlbXM6IFRbXSwgY29sdW1uczogbnVtYmVyKTogVFtdW10ge1xuXG4gICAgLy8gY3JlYXRlIGEgY29weSBvZiBhcnJheSBzbyBub3QgdG8gZWZmZWN0IHRoZSBvcmlnaW5hbFxuICAgIGl0ZW1zID0gaXRlbXMuc2xpY2UoMCk7XG5cbiAgICBjb25zdCBncmlkOiBUW11bXSA9IFtdO1xuXG4gICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICBncmlkLnB1c2goaXRlbXMuc3BsaWNlKDAsIGNvbHVtbnMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JpZDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gYXJyYXkgb2YgbnVtYmVycyBiZXR3ZWVuIHR3byBsaW1pdHNcbiAqIEBwYXJhbSBzdGFydCB0aGUgbG93ZXIgbGltaXRcbiAqIEBwYXJhbSBlbmQgdGhlIHVwcGVyIGxpbWl0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICBjb25zdCBsaXN0OiBudW1iZXJbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaWR4ID0gc3RhcnQ7IGlkeCA8PSBlbmQ7IGlkeCsrKSB7XG4gICAgICAgIGxpc3QucHVzaChpZHgpO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBhcnJheSBvZiBkYXRlcyBiZXR3ZWVuIHR3byBwb2ludHNcbiAqIEBwYXJhbSBzdGFydCB0aGUgZGF0ZSB0byBzdGFydCB0aGUgYXJyYXlcbiAqIEBwYXJhbSBlbmQgdGhlIGRhdGUgdG8gZW5kIHRoZSBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZVJhbmdlKHN0YXJ0OiBEYXRlLCBlbmQ6IERhdGUpOiBEYXRlW10ge1xuXG4gICAgLy8gZG9uJ3QgYWx0ZXIgdGhlIHN0YXJ0IGRhdGUgb2JqZWN0XG4gICAgc3RhcnQgPSBuZXcgRGF0ZShzdGFydCk7XG5cbiAgICBjb25zdCBkYXRlczogRGF0ZVtdID0gW107XG5cbiAgICAvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBkYXlzIGJldHdlZW4gdGhlIGRhdGUgcmFuZ2VcbiAgICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG5cbiAgICAgICAgLy8gYWRkIHRoZSBkYXRlIHRvIHRoZSBhcnJheVxuICAgICAgICBkYXRlcy5wdXNoKG5ldyBEYXRlKHN0YXJ0KSk7XG5cbiAgICAgICAgLy8gbW92ZSB0byB0aGUgbmV4dCBkYXlcbiAgICAgICAgc3RhcnQuc2V0RGF0ZShzdGFydC5nZXREYXRlKCkgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZXM7XG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gZGF0ZXMgdG8gc2VlIGlmIHRoZXkgYXJlIG9uIHRoZSBzYW1lIGRheVxuICogQHBhcmFtIGRheTEgdGhlIGZpcnN0IGRhdGUgdG8gY29tcGFyZVxuICogQHBhcmFtIGRheTIgdGhlIHNlY29uZCBkYXRlIHRvIGNvbXBhcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVEYXlzKGRheTE6IERhdGUsIGRheTI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGF5MS5nZXREYXRlKCkgPT09IGRheTIuZ2V0RGF0ZSgpICYmXG4gICAgICAgIGRheTEuZ2V0TW9udGgoKSA9PT0gZGF5Mi5nZXRNb250aCgpICYmXG4gICAgICAgIGRheTEuZ2V0RnVsbFllYXIoKSA9PT0gZGF5Mi5nZXRGdWxsWWVhcigpO1xufVxuXG4vKipcbiAqIERhdGUgY29tcGFyaXNvbiBmb3IgdXNlIHByaW1hcmlseSB3aXRoIGRpc3RpbmN0VW50aWxDaGFuZ2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQ29tcGFyYXRvcihkYXRlT25lOiBEYXRlLCBkYXRlVHdvOiBEYXRlKTogYm9vbGVhbiB7XG5cbiAgICBpZiAoIWRhdGVPbmUgJiYgZGF0ZVR3byB8fCBkYXRlT25lICYmICFkYXRlVHdvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGVPbmUgJiYgIWRhdGVUd28pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGVPbmUuZ2V0VGltZSgpID09PSBkYXRlVHdvLmdldFRpbWUoKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gdHdvIGRhdGVzXG4gKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IGRhdGVcbiAqIEBwYXJhbSBlbmQgVGhlIGVuZCBkYXRlXG4gKiBAcGFyYW0gZnVsbERheSBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgdGFrZSBmcm9tIDAwOjAwIG9uIHRoZSBzdGFydCBkYXRlIGFuZCAyMzo1OSBvbiB0aGUgZW5kIGRhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VCZXR3ZWVuRGF0ZXMoc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSwgZnVsbERheTogYm9vbGVhbiA9IHRydWUpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbWlsbGlzZWNvbmRzSW5EYXkgPSA4NjQwMDAwMDtcbiAgICBjb25zdCBzdGFydERheSA9IG5ldyBEYXRlKHN0YXJ0LmdldFRpbWUoKSA8IGVuZC5nZXRUaW1lKCkgPyBzdGFydCA6IGVuZCk7XG4gICAgY29uc3QgZW5kRGF5ID0gbmV3IERhdGUoc3RhcnQuZ2V0VGltZSgpID4gZW5kLmdldFRpbWUoKSA/IHN0YXJ0IDogZW5kKTtcblxuICAgIC8vIGdldCB0aGUgc3RhcnQgb2YgZGF5XG4gICAgaWYgKGZ1bGxEYXkpIHtcbiAgICAgICAgc3RhcnREYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICAgIGVuZERheS5zZXRIb3VycygyMywgNTksIDU5LCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoZW5kRGF5LmdldFRpbWUoKSAtIHN0YXJ0RGF5LmdldFRpbWUoKSkgLyBtaWxsaXNlY29uZHNJbkRheSk7XG59XG5cbi8qKlxuICogVGltZXpvbmUgY29tcGFyaXNvbiBmb3IgdXNlIHByaW1hcmlseSB3aXRoIGRpc3RpbmN0VW50aWxDaGFuZ2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lem9uZUNvbXBhcmF0b3Ioem9uZU9uZTogRGF0ZVRpbWVQaWNrZXJUaW1lem9uZSwgem9uZVR3bzogRGF0ZVRpbWVQaWNrZXJUaW1lem9uZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB6b25lT25lLm5hbWUgPT09IHpvbmVUd28ubmFtZSAmJiB6b25lT25lLm9mZnNldCA9PT0gem9uZVR3by5vZmZzZXQ7XG59XG5cbi8qKlxuICogR2V0IGEgZGF0ZSBvYmplY3Qgd2l0aCB0aGUgdGltZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGdpdmVuIGRheVxuICogQHBhcmFtIGRhdGUgVGhlIGRhdGUgdG8gZ2V0IHRoZSBzdGFydCBvZiBkYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXJ0T2ZEYXkoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIGNvbnN0IHN0YXJ0T2ZEYXkgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBzdGFydE9mRGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBzdGFydE9mRGF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlQWZ0ZXIoZGF0ZTogRGF0ZSwgYWZ0ZXI6IERhdGUsIGlzRXF1YWw6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0VxdWFsID8gZ2V0U3RhcnRPZkRheShkYXRlKS5nZXRUaW1lKCkgPj0gZ2V0U3RhcnRPZkRheShhZnRlcikuZ2V0VGltZSgpIDogZ2V0U3RhcnRPZkRheShkYXRlKS5nZXRUaW1lKCkgPiBnZXRTdGFydE9mRGF5KGFmdGVyKS5nZXRUaW1lKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVCZWZvcmUoZGF0ZTogRGF0ZSwgYmVmb3JlOiBEYXRlLCBpc0VxdWFsOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNFcXVhbCA/IGdldFN0YXJ0T2ZEYXkoZGF0ZSkuZ2V0VGltZSgpIDw9IGdldFN0YXJ0T2ZEYXkoYmVmb3JlKS5nZXRUaW1lKCkgOiBnZXRTdGFydE9mRGF5KGRhdGUpLmdldFRpbWUoKSA8IGdldFN0YXJ0T2ZEYXkoYmVmb3JlKS5nZXRUaW1lKCk7XG59XG5cbi8qKlxuICogRXhwb3J0IGFuIGFycmF5IG9mIGFsbCB0aGUgYXZhaWxhYmxlIG1vbnRoc1xuICovXG5leHBvcnQgY29uc3QgbW9udGhzID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG5leHBvcnQgY29uc3QgbW9udGhzU2hvcnQgPSBnZXRTaG9ydE1vbnRoTmFtZXMoKTtcblxuZnVuY3Rpb24gZ2V0U2hvcnRNb250aE5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gbW9udGhzLm1hcChtb250aCA9PiBtb250aC5zdWJzdHJpbmcoMCwgMykpO1xufVxuXG4vKipcbiAqIEV4cG9ydCBhbiBhcnJheSBvZiBhbGwgdGhlIGF2YWlsYWJsZSBkYXlzIG9mIHRoZSB3ZWVrXG4gKi9cbmV4cG9ydCBjb25zdCB3ZWVrZGF5cyA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTtcbmV4cG9ydCBjb25zdCB3ZWVrZGF5c1Nob3J0ID0gZ2V0U2hvcnRXZWVrZGF5TmFtZXMoKTtcbmV4cG9ydCBjb25zdCBtZXJpZGlhbnMgPSBbJ0FNJywgJ1BNJ107XG5cbmZ1bmN0aW9uIGdldFNob3J0V2Vla2RheU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gd2Vla2RheXMubWFwKHdlZWtkYXkgPT4gd2Vla2RheS5zdWJzdHJpbmcoMCwgMykpO1xufVxuXG4vKiogRXhwb3J0IHRoZSBkZWZhdWx0IHNldCBvZiB0aW1lIHpvbmUgKi9cbmV4cG9ydCBjb25zdCB0aW1lem9uZXM6IERhdGVUaW1lUGlja2VyVGltZXpvbmVbXSA9IFtcbiAgICB7IG5hbWU6ICdHTVQtMTEnLCBvZmZzZXQ6IDY2MCB9LFxuICAgIHsgbmFtZTogJ0dNVC0xMCcsIG9mZnNldDogNjAwIH0sXG4gICAgeyBuYW1lOiAnR01ULTknLCBvZmZzZXQ6IDU0MCB9LFxuICAgIHsgbmFtZTogJ0dNVC04Jywgb2Zmc2V0OiA0ODAgfSxcbiAgICB7IG5hbWU6ICdHTVQtNycsIG9mZnNldDogNDIwIH0sXG4gICAgeyBuYW1lOiAnR01ULTYnLCBvZmZzZXQ6IDM2MCB9LFxuICAgIHsgbmFtZTogJ0dNVC01Jywgb2Zmc2V0OiAzMDAgfSxcbiAgICB7IG5hbWU6ICdHTVQtNCcsIG9mZnNldDogMjQwIH0sXG4gICAgeyBuYW1lOiAnR01ULTMnLCBvZmZzZXQ6IDE4MCB9LFxuICAgIHsgbmFtZTogJ0dNVC0yJywgb2Zmc2V0OiAxMjAgfSxcbiAgICB7IG5hbWU6ICdHTVQtMScsIG9mZnNldDogNjAgfSxcbiAgICB7IG5hbWU6ICdHTVQnLCBvZmZzZXQ6IDAgfSxcbiAgICB7IG5hbWU6ICdHTVQrMScsIG9mZnNldDogLTYwIH0sXG4gICAgeyBuYW1lOiAnR01UKzInLCBvZmZzZXQ6IC0xMjAgfSxcbiAgICB7IG5hbWU6ICdHTVQrMycsIG9mZnNldDogLTE4MCB9LFxuICAgIHsgbmFtZTogJ0dNVCs0Jywgb2Zmc2V0OiAtMjQwIH0sXG4gICAgeyBuYW1lOiAnR01UKzUnLCBvZmZzZXQ6IC0zMDAgfSxcbiAgICB7IG5hbWU6ICdHTVQrNicsIG9mZnNldDogLTM2MCB9LFxuICAgIHsgbmFtZTogJ0dNVCs3Jywgb2Zmc2V0OiAtNDIwIH0sXG4gICAgeyBuYW1lOiAnR01UKzgnLCBvZmZzZXQ6IC00ODAgfSxcbiAgICB7IG5hbWU6ICdHTVQrOScsIG9mZnNldDogLTU0MCB9LFxuICAgIHsgbmFtZTogJ0dNVCsxMCcsIG9mZnNldDogLTYwMCB9LFxuICAgIHsgbmFtZTogJ0dNVCsxMScsIG9mZnNldDogLTY2MCB9LFxuICAgIHsgbmFtZTogJ0dNVCsxMicsIG9mZnNldDogLTcyMCB9XG5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVUaW1lUGlja2VyVGltZXpvbmUge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBvZmZzZXQ6IG51bWJlcjtcbn1cbiJdfQ==