@matheo/datepicker
Version:
Angular material date+time picker
275 lines • 33.8 kB
JavaScript
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { Inject, Injectable, Optional, InjectionToken } from '@angular/core';
import { MAT_DATE_LOCALE } from '@angular/material/core';
import { DateAdapter } from '@matheo/datepicker/core';
import { addDays, addMonths, addYears, format, getDate, getDay, getDaysInMonth, getMonth, getYear, parse, parseISO, setDay, setMonth, toDate, parseJSON, getHours, getMinutes, getMilliseconds, setMinutes, getSeconds, setSeconds, setHours, addHours, addMinutes, addSeconds, } from 'date-fns';
import { zonedTimeToUtc } from 'date-fns-tz/esm';
import { enUS } from 'date-fns/esm/locale';
import { MAT_DATE_FNS_LOCALES } from './date-fns-locales';
import * as i0 from "@angular/core";
const UTC_TIMEZONE = 'UTC';
/** InjectionToken for DateFnsAdapter to configure options. */
export const MAT_DATE_FNS_ADAPTER_OPTIONS = new InjectionToken('MAT_DATE_FNS_ADAPTER_OPTIONS', {
providedIn: 'root',
factory: MAT_DATE_FNS_ADAPTER_OPTIONS_FACTORY,
});
/** @docs-private */
export function MAT_DATE_FNS_ADAPTER_OPTIONS_FACTORY() {
return {
useUtc: false,
};
}
/** Creates an array of numbers. */
function range(start, end) {
const arr = [];
for (let i = start; i <= end; i++) {
arr.push(i);
}
return arr;
}
/** Adapts date-fns Dates for use with Angular Material. */
export class DateFnsAdapter extends DateAdapter {
constructor(dateLocale, locales, options) {
super();
this.locales = locales;
this.options = options;
this.getLocale = (localeCodeOrLocale) => {
if (localeCodeOrLocale && localeCodeOrLocale.code) {
return localeCodeOrLocale;
}
if (!this.locales || !this.locales.length) {
throw new Error('locales array does not provided or is empty');
}
const locale = this.locales.find((item) => item.code === localeCodeOrLocale);
if (!locale) {
throw new Error(`locale '${localeCodeOrLocale}' does not exist`);
}
return locale;
};
try {
this.setLocale(dateLocale || enUS);
}
catch (err) {
this.setLocale(enUS);
}
}
setLocale(locale) {
if (!locale) {
throw new Error('setLocale should be called with the string locale code or date-fns Locale object');
}
this._dateFnsLocale = this.getLocale(locale);
super.setLocale(locale);
}
getYear(date) {
return getYear(date);
}
getMonth(date) {
return getMonth(date);
}
getDate(date) {
return getDate(date);
}
getHours(date) {
return getHours(date);
}
setHours(date, hours) {
return setHours(date, hours);
}
getMinutes(date) {
return getMinutes(date);
}
setMinutes(date, minutes) {
return setMinutes(date, minutes);
}
getSeconds(date) {
return getSeconds(date);
}
setSeconds(date, seconds, ms) {
return setSeconds(date, seconds);
}
getMilliseconds(date) {
return getMilliseconds(date);
}
getDayOfWeek(date) {
return getDay(date);
}
getMonthNames(style) {
const map = {
long: 'LLLL',
short: 'LLL',
narrow: 'LLLLL',
};
const formatStr = map[style];
const date = new Date();
return range(0, 11).map((month) => format(setMonth(date, month), formatStr, {
locale: this._dateFnsLocale,
}));
}
getDateNames() {
return range(1, 31).map((day) => String(day));
}
getHourNames() {
return range(0, 23).map((i) => (i === 0 ? '00' : String(i)));
}
getMinuteNames() {
return range(0, 59).map(String);
}
getDayOfWeekNames(style) {
const map = {
long: 'EEEE',
short: 'EEE',
narrow: 'EEEEE',
};
const formatStr = map[style];
const date = new Date();
return range(0, 6).map((month) => format(setDay(date, month), formatStr, {
locale: this._dateFnsLocale,
}));
}
getYearName(date) {
return format(date, 'yyyy', {
locale: this._dateFnsLocale,
});
}
getFirstDayOfWeek() {
return this._dateFnsLocale.options.weekStartsOn;
}
getNumDaysInMonth(date) {
return getDaysInMonth(date);
}
clone(date) {
return toDate(date);
}
createDate(year, month, date, hours = 0, minutes = 0, seconds = 0, ms = 0) {
if (month < 0 || month > 11) {
throw Error(`Invalid month index "${month}". Month index has to be between 0 and 11.`);
}
if (date < 1) {
throw Error(`Invalid date "${date}". Date has to be greater than 0.`);
}
const result = this._createDateWithOverflow(year, month, date, hours, minutes, seconds, ms);
// Check that the date wasn't above the upper bound for the month, causing the month to overflow
if (result.getMonth() !== month) {
throw Error(`Invalid date "${date}" for month with index "${month}".`);
}
return result;
}
today() {
return new Date();
}
parse(value, parseFormat) {
if (value) {
if (typeof value === 'string') {
if (this.options.useUtc) {
const d = parse(value.trim(), parseFormat, new Date(), {
locale: this._dateFnsLocale,
});
return zonedTimeToUtc(d, UTC_TIMEZONE);
}
return parse(value.trim(), parseFormat, new Date(), {
locale: this._dateFnsLocale,
});
}
if (typeof value === 'number') {
return toDate(value);
}
if (value instanceof Date) {
return this.clone(value);
}
return null;
}
return null;
}
format(date, displayFormat) {
return format(date, displayFormat, { locale: this._dateFnsLocale });
}
addCalendarYears(date, years) {
return addYears(date, years);
}
addCalendarMonths(date, months) {
return addMonths(date, months);
}
addCalendarDays(date, days) {
return addDays(date, days);
}
addCalendarHours(date, hours) {
return addHours(date, hours);
}
addCalendarMinutes(date, minutes) {
return addMinutes(date, minutes);
}
addCalendarSeconds(date, seconds, ms) {
return addSeconds(date, seconds);
}
toIso8601(date) {
return date.toISOString();
}
deserialize(value) {
if (value) {
if (typeof value === 'string') {
if (this.options.useUtc) {
return parseJSON(value);
}
return parseISO(value);
}
if (typeof value === 'number') {
return toDate(value);
}
if (value instanceof Date) {
return this.clone(value);
}
return null;
}
return null;
}
isDateInstance(obj) {
return obj instanceof Date;
}
isValid(date) {
return date instanceof Date && !isNaN(date.getTime());
}
invalid() {
return new Date(NaN);
}
/** Creates a date but allows the month and date to overflow. */
_createDateWithOverflow(year, month, date, hours = 0, minutes = 0, seconds = 0, ms = 0) {
const result = this._createDateInternal(year, month, date, hours, minutes, seconds, ms);
// We need to correct for the fact that JS native Date treats years in range [0, 99] as
// abbreviations for 19xx.
if (year >= 0 && year < 100) {
result.setFullYear(this.getYear(result) - 1900);
}
return result;
}
_createDateInternal(year, month, date, hours, minutes, seconds, ms) {
if (this.options.useUtc) {
return zonedTimeToUtc(new Date(year, month, date, hours, minutes, seconds, ms), UTC_TIMEZONE);
}
return new Date(year, month, date, hours, minutes, seconds, ms);
}
}
/** @nocollapse */ /** @nocollapse */ DateFnsAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DateFnsAdapter, deps: [{ token: MAT_DATE_LOCALE, optional: true }, { token: MAT_DATE_FNS_LOCALES }, { token: MAT_DATE_FNS_ADAPTER_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ /** @nocollapse */ DateFnsAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DateFnsAdapter });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DateFnsAdapter, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [MAT_DATE_LOCALE]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [MAT_DATE_FNS_LOCALES]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [MAT_DATE_FNS_ADAPTER_OPTIONS]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1mbnMtYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvZGF0ZXBpY2tlci9kYXRlLWZucy9kYXRlLWZucy1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsT0FBTyxFQUNQLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLE9BQU8sRUFDUCxNQUFNLEVBQ04sY0FBYyxFQUNkLFFBQVEsRUFDUixPQUFPLEVBRVAsS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixlQUFlLEVBQ2YsVUFBVSxFQUNWLFVBQVUsRUFDVixVQUFVLEVBQ1YsUUFBUSxFQUNSLFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxHQUNYLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBRTFELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQztBQVkzQiw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxjQUFjLENBQzVELDhCQUE4QixFQUM5QjtJQUNFLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxvQ0FBb0M7Q0FDOUMsQ0FDRixD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MEJBS04sUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxlQUFlOzswQkFDbEMsTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixRQUFROzswQkFDUixNQUFNOzJCQUFDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUX0RBVEVfTE9DQUxFIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ0BtYXRoZW8vZGF0ZXBpY2tlci9jb3JlJztcbmltcG9ydCB7XG4gIGFkZERheXMsXG4gIGFkZE1vbnRocyxcbiAgYWRkWWVhcnMsXG4gIGZvcm1hdCxcbiAgZ2V0RGF0ZSxcbiAgZ2V0RGF5LFxuICBnZXREYXlzSW5Nb250aCxcbiAgZ2V0TW9udGgsXG4gIGdldFllYXIsXG4gIExvY2FsZSxcbiAgcGFyc2UsXG4gIHBhcnNlSVNPLFxuICBzZXREYXksXG4gIHNldE1vbnRoLFxuICB0b0RhdGUsXG4gIHBhcnNlSlNPTixcbiAgZ2V0SG91cnMsXG4gIGdldE1pbnV0ZXMsXG4gIGdldE1pbGxpc2Vjb25kcyxcbiAgc2V0TWludXRlcyxcbiAgZ2V0U2Vjb25kcyxcbiAgc2V0U2Vjb25kcyxcbiAgc2V0SG91cnMsXG4gIGFkZEhvdXJzLFxuICBhZGRNaW51dGVzLFxuICBhZGRTZWNvbmRzLFxufSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyB6b25lZFRpbWVUb1V0YyB9IGZyb20gJ2RhdGUtZm5zLXR6L2VzbSc7XG5pbXBvcnQgeyBlblVTIH0gZnJvbSAnZGF0ZS1mbnMvZXNtL2xvY2FsZSc7XG5pbXBvcnQgeyBNQVRfREFURV9GTlNfTE9DQUxFUyB9IGZyb20gJy4vZGF0ZS1mbnMtbG9jYWxlcyc7XG5cbmNvbnN0IFVUQ19USU1FWk9ORSA9ICdVVEMnO1xuXG4vKiogQ29uZmlndXJhYmxlIG9wdGlvbnMgZm9yIHtAc2VlIERhdGVGbnNBZGFwdGVyfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWF0RGF0ZUZuc0FkYXB0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFR1cm5zIHRoZSB1c2Ugb2YgdXRjIGRhdGVzIG9uIG9yIG9mZi5cbiAgICogQ2hhbmdpbmcgdGhpcyB3aWxsIGNoYW5nZSBob3cgQW5ndWxhciBNYXRlcmlhbCBjb21wb25lbnRzIGxpa2UgRGF0ZVBpY2tlciBvdXRwdXQgZGF0ZXMuXG4gICAqIHtAZGVmYXVsdCBmYWxzZX1cbiAgICovXG4gIHVzZVV0YzogYm9vbGVhbjtcbn1cblxuLyoqIEluamVjdGlvblRva2VuIGZvciBEYXRlRm5zQWRhcHRlciB0byBjb25maWd1cmUgb3B0aW9ucy4gKi9cbmV4cG9ydCBjb25zdCBNQVRfREFURV9GTlNfQURBUFRFUl9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuPE1hdERhdGVGbnNBZGFwdGVyT3B0aW9ucz4oXG4gICdNQVRfREFURV9GTlNfQURBUFRFUl9PUFRJT05TJyxcbiAge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiBNQVRfREFURV9GTlNfQURBUFRFUl9PUFRJT05TX0ZBQ1RPUlksXG4gIH1cbik7XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgZnVuY3Rpb24gTUFUX0RBVEVfRk5TX0FEQVBURVJfT1BUSU9OU19GQUNUT1JZKCk6IE1hdERhdGVGbnNBZGFwdGVyT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgdXNlVXRjOiBmYWxzZSxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycy4gKi9cbmZ1bmN0aW9uIHJhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCBhcnI6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgIGFyci5wdXNoKGkpO1xuICB9XG4gIHJldHVybiBhcnI7XG59XG5cbi8qKiBBZGFwdHMgZGF0ZS1mbnMgRGF0ZXMgZm9yIHVzZSB3aXRoIEFuZ3VsYXIgTWF0ZXJpYWwuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZUZuc0FkYXB0ZXIgZXh0ZW5kcyBEYXRlQWRhcHRlcjxEYXRlPiB7XG4gIHByaXZhdGUgX2RhdGVGbnNMb2NhbGU6IExvY2FsZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9EQVRFX0xPQ0FMRSkgZGF0ZUxvY2FsZTogc3RyaW5nLFxuICAgIEBJbmplY3QoTUFUX0RBVEVfRk5TX0xPQ0FMRVMpIHByaXZhdGUgbG9jYWxlczogTG9jYWxlW10sXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE1BVF9EQVRFX0ZOU19BREFQVEVSX09QVElPTlMpXG4gICAgcHJpdmF0ZSBvcHRpb25zPzogTWF0RGF0ZUZuc0FkYXB0ZXJPcHRpb25zXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5zZXRMb2NhbGUoZGF0ZUxvY2FsZSB8fCBlblVTKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2V0TG9jYWxlKGVuVVMpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvY2FsZShsb2NhbGU6IHN0cmluZyB8IExvY2FsZSkge1xuICAgIGlmICghbG9jYWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdzZXRMb2NhbGUgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBzdHJpbmcgbG9jYWxlIGNvZGUgb3IgZGF0ZS1mbnMgTG9jYWxlIG9iamVjdCdcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGVGbnNMb2NhbGUgPSB0aGlzLmdldExvY2FsZShsb2NhbGUpO1xuICAgIHN1cGVyLnNldExvY2FsZShsb2NhbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhbGUgPSAobG9jYWxlQ29kZU9yTG9jYWxlOiBzdHJpbmcgfCBMb2NhbGUpOiBMb2NhbGUgPT4ge1xuICAgIGlmIChsb2NhbGVDb2RlT3JMb2NhbGUgJiYgKGxvY2FsZUNvZGVPckxvY2FsZSBhcyBMb2NhbGUpLmNvZGUpIHtcbiAgICAgIHJldHVybiBsb2NhbGVDb2RlT3JMb2NhbGUgYXMgTG9jYWxlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubG9jYWxlcyB8fCAhdGhpcy5sb2NhbGVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2NhbGVzIGFycmF5IGRvZXMgbm90IHByb3ZpZGVkIG9yIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMubG9jYWxlcy5maW5kKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0gbG9jYWxlQ29kZU9yTG9jYWxlXG4gICAgKTtcbiAgICBpZiAoIWxvY2FsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBsb2NhbGUgJyR7bG9jYWxlQ29kZU9yTG9jYWxlfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZTtcbiAgfTtcblxuICBnZXRZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBnZXRZZWFyKGRhdGUpO1xuICB9XG5cbiAgZ2V0TW9udGgoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldE1vbnRoKGRhdGUpO1xuICB9XG5cbiAgZ2V0RGF0ZShkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0RGF0ZShkYXRlKTtcbiAgfVxuXG4gIGdldEhvdXJzKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBnZXRIb3VycyhkYXRlKTtcbiAgfVxuXG4gIHNldEhvdXJzKGRhdGU6IERhdGUsIGhvdXJzOiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gc2V0SG91cnMoZGF0ZSwgaG91cnMpO1xuICB9XG5cbiAgZ2V0TWludXRlcyhkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0TWludXRlcyhkYXRlKTtcbiAgfVxuXG4gIHNldE1pbnV0ZXMoZGF0ZTogRGF0ZSwgbWludXRlczogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIHNldE1pbnV0ZXMoZGF0ZSwgbWludXRlcyk7XG4gIH1cblxuICBnZXRTZWNvbmRzKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBnZXRTZWNvbmRzKGRhdGUpO1xuICB9XG5cbiAgc2V0U2Vjb25kcyhkYXRlOiBEYXRlLCBzZWNvbmRzOiBudW1iZXIsIG1zPzogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIHNldFNlY29uZHMoZGF0ZSwgc2Vjb25kcyk7XG4gIH1cblxuICBnZXRNaWxsaXNlY29uZHMoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldE1pbGxpc2Vjb25kcyhkYXRlKTtcbiAgfVxuXG4gIGdldERheU9mV2VlayhkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0RGF5KGRhdGUpO1xuICB9XG5cbiAgZ2V0TW9udGhOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgIGxvbmc6ICdMTExMJyxcbiAgICAgIHNob3J0OiAnTExMJyxcbiAgICAgIG5hcnJvdzogJ0xMTExMJyxcbiAgICB9O1xuXG4gICAgY29uc3QgZm9ybWF0U3RyID0gbWFwW3N0eWxlXTtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcblxuICAgIHJldHVybiByYW5nZSgwLCAxMSkubWFwKChtb250aCkgPT5cbiAgICAgIGZvcm1hdChzZXRNb250aChkYXRlLCBtb250aCksIGZvcm1hdFN0ciwge1xuICAgICAgICBsb2NhbGU6IHRoaXMuX2RhdGVGbnNMb2NhbGUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXREYXRlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiByYW5nZSgxLCAzMSkubWFwKChkYXkpID0+IFN0cmluZyhkYXkpKTtcbiAgfVxuXG4gIGdldEhvdXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHJhbmdlKDAsIDIzKS5tYXAoKGkpID0+IChpID09PSAwID8gJzAwJyA6IFN0cmluZyhpKSkpO1xuICB9XG5cbiAgZ2V0TWludXRlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiByYW5nZSgwLCA1OSkubWFwKFN0cmluZyk7XG4gIH1cblxuICBnZXREYXlPZldlZWtOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgIGxvbmc6ICdFRUVFJyxcbiAgICAgIHNob3J0OiAnRUVFJyxcbiAgICAgIG5hcnJvdzogJ0VFRUVFJyxcbiAgICB9O1xuXG4gICAgY29uc3QgZm9ybWF0U3RyID0gbWFwW3N0eWxlXTtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcblxuICAgIHJldHVybiByYW5nZSgwLCA2KS5tYXAoKG1vbnRoKSA9PlxuICAgICAgZm9ybWF0KHNldERheShkYXRlLCBtb250aCksIGZvcm1hdFN0ciwge1xuICAgICAgICBsb2NhbGU6IHRoaXMuX2RhdGVGbnNMb2NhbGUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRZZWFyTmFtZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0KGRhdGUsICd5eXl5Jywge1xuICAgICAgbG9jYWxlOiB0aGlzLl9kYXRlRm5zTG9jYWxlLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Rmlyc3REYXlPZldlZWsoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZUZuc0xvY2FsZS5vcHRpb25zLndlZWtTdGFydHNPbjtcbiAgfVxuXG4gIGdldE51bURheXNJbk1vbnRoKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBnZXREYXlzSW5Nb250aChkYXRlKTtcbiAgfVxuXG4gIGNsb25lKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gdG9EYXRlKGRhdGUpO1xuICB9XG5cbiAgY3JlYXRlRGF0ZShcbiAgICB5ZWFyOiBudW1iZXIsXG4gICAgbW9udGg6IG51bWJlcixcbiAgICBkYXRlOiBudW1iZXIsXG4gICAgaG91cnM6IG51bWJlciA9IDAsXG4gICAgbWludXRlczogbnVtYmVyID0gMCxcbiAgICBzZWNvbmRzOiBudW1iZXIgPSAwLFxuICAgIG1zOiBudW1iZXIgPSAwXG4gICk6IERhdGUge1xuICAgIGlmIChtb250aCA8IDAgfHwgbW9udGggPiAxMSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIG1vbnRoIGluZGV4IFwiJHttb250aH1cIi4gTW9udGggaW5kZXggaGFzIHRvIGJlIGJldHdlZW4gMCBhbmQgMTEuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZSA8IDEpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGRhdGUgXCIke2RhdGV9XCIuIERhdGUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3coXG4gICAgICB5ZWFyLFxuICAgICAgbW9udGgsXG4gICAgICBkYXRlLFxuICAgICAgaG91cnMsXG4gICAgICBtaW51dGVzLFxuICAgICAgc2Vjb25kcyxcbiAgICAgIG1zXG4gICAgKTtcbiAgICAvLyBDaGVjayB0aGF0IHRoZSBkYXRlIHdhc24ndCBhYm92ZSB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZSBtb250aCwgY2F1c2luZyB0aGUgbW9udGggdG8gb3ZlcmZsb3dcbiAgICBpZiAocmVzdWx0LmdldE1vbnRoKCkgIT09IG1vbnRoKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkYXRlIFwiJHtkYXRlfVwiIGZvciBtb250aCB3aXRoIGluZGV4IFwiJHttb250aH1cIi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdG9kYXkoKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gIH1cblxuICBwYXJzZSh2YWx1ZTogYW55LCBwYXJzZUZvcm1hdDogYW55KTogRGF0ZSB8IG51bGwge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VVdGMpIHtcbiAgICAgICAgICBjb25zdCBkID0gcGFyc2UodmFsdWUudHJpbSgpLCBwYXJzZUZvcm1hdCwgbmV3IERhdGUoKSwge1xuICAgICAgICAgICAgbG9jYWxlOiB0aGlzLl9kYXRlRm5zTG9jYWxlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB6b25lZFRpbWVUb1V0YyhkLCBVVENfVElNRVpPTkUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZSh2YWx1ZS50cmltKCksIHBhcnNlRm9ybWF0LCBuZXcgRGF0ZSgpLCB7XG4gICAgICAgICAgbG9jYWxlOiB0aGlzLl9kYXRlRm5zTG9jYWxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB0b0RhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvcm1hdChkYXRlOiBEYXRlLCBkaXNwbGF5Rm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXQoZGF0ZSwgZGlzcGxheUZvcm1hdCwgeyBsb2NhbGU6IHRoaXMuX2RhdGVGbnNMb2NhbGUgfSk7XG4gIH1cblxuICBhZGRDYWxlbmRhclllYXJzKGRhdGU6IERhdGUsIHllYXJzOiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gYWRkWWVhcnMoZGF0ZSwgeWVhcnMpO1xuICB9XG5cbiAgYWRkQ2FsZW5kYXJNb250aHMoZGF0ZTogRGF0ZSwgbW9udGhzOiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gYWRkTW9udGhzKGRhdGUsIG1vbnRocyk7XG4gIH1cblxuICBhZGRDYWxlbmRhckRheXMoZGF0ZTogRGF0ZSwgZGF5czogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIGFkZERheXMoZGF0ZSwgZGF5cyk7XG4gIH1cblxuICBhZGRDYWxlbmRhckhvdXJzKGRhdGU6IERhdGUsIGhvdXJzOiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gYWRkSG91cnMoZGF0ZSwgaG91cnMpO1xuICB9XG5cbiAgYWRkQ2FsZW5kYXJNaW51dGVzKGRhdGU6IERhdGUsIG1pbnV0ZXM6IG51bWJlcik6IERhdGUge1xuICAgIHJldHVybiBhZGRNaW51dGVzKGRhdGUsIG1pbnV0ZXMpO1xuICB9XG5cbiAgYWRkQ2FsZW5kYXJTZWNvbmRzKGRhdGU6IERhdGUsIHNlY29uZHM6IG51bWJlciwgbXM/OiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gYWRkU2Vjb25kcyhkYXRlLCBzZWNvbmRzKTtcbiAgfVxuXG4gIHRvSXNvODYwMShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpO1xuICB9XG5cbiAgZGVzZXJpYWxpemUodmFsdWU6IGFueSk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlVXRjKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlSlNPTih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlSVNPKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB0b0RhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlzRGF0ZUluc3RhbmNlKG9iajogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIERhdGU7XG4gIH1cblxuICBpc1ZhbGlkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKGRhdGUuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIGludmFsaWQoKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cblxuICAvKiogQ3JlYXRlcyBhIGRhdGUgYnV0IGFsbG93cyB0aGUgbW9udGggYW5kIGRhdGUgdG8gb3ZlcmZsb3cuICovXG4gIHByaXZhdGUgX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3coXG4gICAgeWVhcjogbnVtYmVyLFxuICAgIG1vbnRoOiBudW1iZXIsXG4gICAgZGF0ZTogbnVtYmVyLFxuICAgIGhvdXJzOiBudW1iZXIgPSAwLFxuICAgIG1pbnV0ZXM6IG51bWJlciA9IDAsXG4gICAgc2Vjb25kczogbnVtYmVyID0gMCxcbiAgICBtczogbnVtYmVyID0gMFxuICApOiBEYXRlIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9jcmVhdGVEYXRlSW50ZXJuYWwoXG4gICAgICB5ZWFyLFxuICAgICAgbW9udGgsXG4gICAgICBkYXRlLFxuICAgICAgaG91cnMsXG4gICAgICBtaW51dGVzLFxuICAgICAgc2Vjb25kcyxcbiAgICAgIG1zXG4gICAgKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gY29ycmVjdCBmb3IgdGhlIGZhY3QgdGhhdCBKUyBuYXRpdmUgRGF0ZSB0cmVhdHMgeWVhcnMgaW4gcmFuZ2UgWzAsIDk5XSBhc1xuICAgIC8vIGFiYnJldmlhdGlvbnMgZm9yIDE5eHguXG4gICAgaWYgKHllYXIgPj0gMCAmJiB5ZWFyIDwgMTAwKSB7XG4gICAgICByZXN1bHQuc2V0RnVsbFllYXIodGhpcy5nZXRZZWFyKHJlc3VsdCkgLSAxOTAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURhdGVJbnRlcm5hbChcbiAgICB5ZWFyOiBudW1iZXIsXG4gICAgbW9udGg6IG51bWJlcixcbiAgICBkYXRlOiBudW1iZXIsXG4gICAgaG91cnM/OiBudW1iZXIsXG4gICAgbWludXRlcz86IG51bWJlcixcbiAgICBzZWNvbmRzPzogbnVtYmVyLFxuICAgIG1zPzogbnVtYmVyXG4gICk6IERhdGUge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudXNlVXRjKSB7XG4gICAgICByZXR1cm4gem9uZWRUaW1lVG9VdGMoXG4gICAgICAgIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXRlLCBob3VycywgbWludXRlcywgc2Vjb25kcywgbXMpLFxuICAgICAgICBVVENfVElNRVpPTkVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1zKTtcbiAgfVxufVxuIl19