UNPKG

@wizco/fenixds-ngx

Version:

Componentes fenix design system para Angular.

201 lines 27.5 kB
export function isValidDate(date) { return date instanceof Date && !Number.isNaN(date.getTime()); } export function toDateOnly(date) { return new Date(date.getFullYear(), date.getMonth(), date.getDate()); } export function clampToMinute(date) { return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), 0, 0); } export function pad2(value) { return String(value).padStart(2, '0'); } export function formatDate(date, format) { const yyyy = date.getFullYear(); const MM = pad2(date.getMonth() + 1); const dd = pad2(date.getDate()); const HH = pad2(date.getHours()); const mm = pad2(date.getMinutes()); switch (format) { case 'dd/MM/yyyy': return `${dd}/${MM}/${yyyy}`; case 'dd/MM/yyyy HH:mm': return `${dd}/${MM}/${yyyy} ${HH}:${mm}`; case 'yyyy-MM-dd': return `${yyyy}-${MM}-${dd}`; case "yyyy-MM-dd'T'HH:mm": return `${yyyy}-${MM}-${dd}T${HH}:${mm}`; case 'MM/yyyy': return `${MM}/${yyyy}`; case 'yyyy-MM': return `${yyyy}-${MM}`; } } export function parseDate(value, format) { const trimmed = value.trim(); if (!trimmed) return null; const asInt = (s) => Number.parseInt(s, 10); if (format === 'dd/MM/yyyy') { const match = /^(\d{2})\/(\d{2})\/(\d{4})$/.exec(trimmed); if (!match) return null; const day = asInt(match[1]); const month = asInt(match[2]); const year = asInt(match[3]); const date = new Date(year, month - 1, day); if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) { return null; } return date; } if (format === 'dd/MM/yyyy HH:mm') { const match = /^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})$/.exec(trimmed); if (!match) return null; const day = asInt(match[1]); const month = asInt(match[2]); const year = asInt(match[3]); const hour = asInt(match[4]); const minute = asInt(match[5]); if (hour > 23 || minute > 59) return null; const date = new Date(year, month - 1, day, hour, minute, 0, 0); if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day || date.getHours() !== hour || date.getMinutes() !== minute) { return null; } return date; } if (format === 'yyyy-MM-dd') { const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(trimmed); if (!match) return null; const year = asInt(match[1]); const month = asInt(match[2]); const day = asInt(match[3]); const date = new Date(year, month - 1, day); if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) { return null; } return date; } if (format === "yyyy-MM-dd'T'HH:mm") { const match = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/.exec(trimmed); if (!match) return null; const year = asInt(match[1]); const month = asInt(match[2]); const day = asInt(match[3]); const hour = asInt(match[4]); const minute = asInt(match[5]); if (hour > 23 || minute > 59) return null; const date = new Date(year, month - 1, day, hour, minute, 0, 0); if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day || date.getHours() !== hour || date.getMinutes() !== minute) { return null; } return date; } if (format === 'MM/yyyy') { const match = /^(\d{2})\/(\d{4})$/.exec(trimmed); if (!match) return null; const month = asInt(match[1]); const year = asInt(match[2]); if (month < 1 || month > 12) return null; return new Date(year, month - 1, 1); } if (format === 'yyyy-MM') { const match = /^(\d{4})-(\d{2})$/.exec(trimmed); if (!match) return null; const year = asInt(match[1]); const month = asInt(match[2]); if (month < 1 || month > 12) return null; return new Date(year, month - 1, 1); } return null; } export function coerceDate(value) { if (!value) return null; if (value instanceof Date) return isValidDate(value) ? value : null; if (typeof value !== 'string') return null; const trimmed = value.trim(); if (!trimmed) return null; // Accept common API formats by default. const apiDate = parseDate(trimmed, 'yyyy-MM-dd'); if (apiDate) return apiDate; const apiDateTime = parseDate(trimmed, "yyyy-MM-dd'T'HH:mm"); if (apiDateTime) return apiDateTime; const brDate = parseDate(trimmed, 'dd/MM/yyyy'); if (brDate) return brDate; const brDateTime = parseDate(trimmed, 'dd/MM/yyyy HH:mm'); if (brDateTime) return brDateTime; const monthYear = parseDate(trimmed, 'MM/yyyy'); if (monthYear) return monthYear; const apiMonth = parseDate(trimmed, 'yyyy-MM'); if (apiMonth) return apiMonth; return null; } export function toIsoDateKey(date) { return formatDate(toDateOnly(date), 'yyyy-MM-dd'); } export function buildDisabledPredicate(options) { const today = toDateOnly(new Date()); return (date) => { const day = toDateOnly(date); if (options.disableFuture && day.getTime() > today.getTime()) { return { disabled: true, reason: 'future' }; } if (options.disablePast && day.getTime() < today.getTime()) { return { disabled: true, reason: 'past' }; } if (options.minDate && day.getTime() < toDateOnly(options.minDate).getTime()) { return { disabled: true, reason: 'minDate' }; } if (options.maxDate && day.getTime() > toDateOnly(options.maxDate).getTime()) { return { disabled: true, reason: 'maxDate' }; } if (options.disableWeekends) { const dow = day.getDay(); if (dow === 0 || dow === 6) { return { disabled: true, reason: 'weekend' }; } } if (options.disableHolidays) { const key = toIsoDateKey(day); if (options.holidaySet.has(key)) { return { disabled: true, reason: 'holiday' }; } } if (options.dateFilter && options.dateFilter(day) === false) { return { disabled: true, reason: 'custom' }; } return { disabled: false }; }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb25lbnRzL3NyYy9saWIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBYTtJQUN2QyxPQUFPLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVU7SUFDbkMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQVU7SUFDdEMsT0FBTyxJQUFJLElBQUksQ0FDYixJQUFJLENBQUMsV0FBVyxFQUFFLEVBQ2xCLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDZixJQUFJLENBQUMsT0FBTyxFQUFFLEVBQ2QsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNmLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFDakIsQ0FBQyxFQUNELENBQUMsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxJQUFJLENBQUMsS0FBYTtJQUNoQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVUsRUFBRSxNQUF1QjtJQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUks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LEVBQUUsQ0FBQztJQUM3QixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2NvRGF0ZUlucHV0LCBXY29EYXRlcGlja2VyRGlzYWJsZWRSZWFzb24gfSBmcm9tICcuL2RhdGVwaWNrZXIudHlwZXMnO1xuXG50eXBlIFN1cHBvcnRlZEZvcm1hdCA9XG4gIHwgJ2RkL01NL3l5eXknXG4gIHwgJ2RkL01NL3l5eXkgSEg6bW0nXG4gIHwgJ3l5eXktTU0tZGQnXG4gIHwgXCJ5eXl5LU1NLWRkJ1QnSEg6bW1cIlxuICB8ICdNTS95eXl5J1xuICB8ICd5eXl5LU1NJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKGRhdGU6IHVua25vd24pOiBkYXRlIGlzIERhdGUge1xuICByZXR1cm4gZGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgIU51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGVPbmx5KGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcFRvTWludXRlKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKFxuICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICBkYXRlLmdldE1vbnRoKCksXG4gICAgZGF0ZS5nZXREYXRlKCksXG4gICAgZGF0ZS5nZXRIb3VycygpLFxuICAgIGRhdGUuZ2V0TWludXRlcygpLFxuICAgIDAsXG4gICAgMFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkMih2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSwgZm9ybWF0OiBTdXBwb3J0ZWRGb3JtYXQpOiBzdHJpbmcge1xuICBjb25zdCB5eXl5ID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSk7XG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSk7XG4gIGNvbnN0IEhIID0gcGFkMihkYXRlLmdldEhvdXJzKCkpO1xuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpO1xuXG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnZGQvTU0veXl5eSc6XG4gICAgICByZXR1cm4gYCR7ZGR9LyR7TU19LyR7eXl5eX1gO1xuICAgIGNhc2UgJ2RkL01NL3l5eXkgSEg6bW0nOlxuICAgICAgcmV0dXJuIGAke2RkfS8ke01NfS8ke3l5eXl9ICR7SEh9OiR7bW19YDtcbiAgICBjYXNlICd5eXl5LU1NLWRkJzpcbiAgICAgIHJldHVybiBgJHt5eXl5fS0ke01NfS0ke2RkfWA7XG4gICAgY2FzZSBcInl5eXktTU0tZGQnVCdISDptbVwiOlxuICAgICAgcmV0dXJuIGAke3l5eXl9LSR7TU19LSR7ZGR9VCR7SEh9OiR7bW19YDtcbiAgICBjYXNlICdNTS95eXl5JzpcbiAgICAgIHJldHVybiBgJHtNTX0vJHt5eXl5fWA7XG4gICAgY2FzZSAneXl5eS1NTSc6XG4gICAgICByZXR1cm4gYCR7eXl5eX0tJHtNTX1gO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGUoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIGZvcm1hdDogU3VwcG9ydGVkRm9ybWF0XG4pOiBEYXRlIHwgbnVsbCB7XG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgYXNJbnQgPSAoczogc3RyaW5nKSA9PiBOdW1iZXIucGFyc2VJbnQocywgMTApO1xuXG4gIGlmIChmb3JtYXQgPT09ICdkZC9NTS95eXl5Jykge1xuICAgIGNvbnN0IG1hdGNoID0gL14oXFxkezJ9KVxcLyhcXGR7Mn0pXFwvKFxcZHs0fSkkLy5leGVjKHRyaW1tZWQpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGRheSA9IGFzSW50KG1hdGNoWzFdKTtcbiAgICBjb25zdCBtb250aCA9IGFzSW50KG1hdGNoWzJdKTtcbiAgICBjb25zdCB5ZWFyID0gYXNJbnQobWF0Y2hbM10pO1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XG4gICAgaWYgKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpICE9PSB5ZWFyIHx8XG4gICAgICBkYXRlLmdldE1vbnRoKCkgIT09IG1vbnRoIC0gMSB8fFxuICAgICAgZGF0ZS5nZXREYXRlKCkgIT09IGRheVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaWYgKGZvcm1hdCA9PT0gJ2RkL01NL3l5eXkgSEg6bW0nKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXihcXGR7Mn0pXFwvKFxcZHsyfSlcXC8oXFxkezR9KSAoXFxkezJ9KTooXFxkezJ9KSQvLmV4ZWMoXG4gICAgICB0cmltbWVkXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkYXkgPSBhc0ludChtYXRjaFsxXSk7XG4gICAgY29uc3QgbW9udGggPSBhc0ludChtYXRjaFsyXSk7XG4gICAgY29uc3QgeWVhciA9IGFzSW50KG1hdGNoWzNdKTtcbiAgICBjb25zdCBob3VyID0gYXNJbnQobWF0Y2hbNF0pO1xuICAgIGNvbnN0IG1pbnV0ZSA9IGFzSW50KG1hdGNoWzVdKTtcbiAgICBpZiAoaG91ciA+IDIzIHx8IG1pbnV0ZSA+IDU5KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZSwgMCwgMCk7XG4gICAgaWYgKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpICE9PSB5ZWFyIHx8XG4gICAgICBkYXRlLmdldE1vbnRoKCkgIT09IG1vbnRoIC0gMSB8fFxuICAgICAgZGF0ZS5nZXREYXRlKCkgIT09IGRheSB8fFxuICAgICAgZGF0ZS5nZXRIb3VycygpICE9PSBob3VyIHx8XG4gICAgICBkYXRlLmdldE1pbnV0ZXMoKSAhPT0gbWludXRlXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpZiAoZm9ybWF0ID09PSAneXl5eS1NTS1kZCcpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLy5leGVjKHRyaW1tZWQpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHllYXIgPSBhc0ludChtYXRjaFsxXSk7XG4gICAgY29uc3QgbW9udGggPSBhc0ludChtYXRjaFsyXSk7XG4gICAgY29uc3QgZGF5ID0gYXNJbnQobWF0Y2hbM10pO1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XG4gICAgaWYgKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpICE9PSB5ZWFyIHx8XG4gICAgICBkYXRlLmdldE1vbnRoKCkgIT09IG1vbnRoIC0gMSB8fFxuICAgICAgZGF0ZS5nZXREYXRlKCkgIT09IGRheVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaWYgKGZvcm1hdCA9PT0gXCJ5eXl5LU1NLWRkJ1QnSEg6bW1cIikge1xuICAgIGNvbnN0IG1hdGNoID1cbiAgICAgIC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSlUKFxcZHsyfSk6KFxcZHsyfSkkLy5leGVjKHRyaW1tZWQpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHllYXIgPSBhc0ludChtYXRjaFsxXSk7XG4gICAgY29uc3QgbW9udGggPSBhc0ludChtYXRjaFsyXSk7XG4gICAgY29uc3QgZGF5ID0gYXNJbnQobWF0Y2hbM10pO1xuICAgIGNvbnN0IGhvdXIgPSBhc0ludChtYXRjaFs0XSk7XG4gICAgY29uc3QgbWludXRlID0gYXNJbnQobWF0Y2hbNV0pO1xuICAgIGlmIChob3VyID4gMjMgfHwgbWludXRlID4gNTkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91ciwgbWludXRlLCAwLCAwKTtcbiAgICBpZiAoXG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCkgIT09IHllYXIgfHxcbiAgICAgIGRhdGUuZ2V0TW9udGgoKSAhPT0gbW9udGggLSAxIHx8XG4gICAgICBkYXRlLmdldERhdGUoKSAhPT0gZGF5IHx8XG4gICAgICBkYXRlLmdldEhvdXJzKCkgIT09IGhvdXIgfHxcbiAgICAgIGRhdGUuZ2V0TWludXRlcygpICE9PSBtaW51dGVcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09ICdNTS95eXl5Jykge1xuICAgIGNvbnN0IG1hdGNoID0gL14oXFxkezJ9KVxcLyhcXGR7NH0pJC8uZXhlYyh0cmltbWVkKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtb250aCA9IGFzSW50KG1hdGNoWzFdKTtcbiAgICBjb25zdCB5ZWFyID0gYXNJbnQobWF0Y2hbMl0pO1xuICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgMSk7XG4gIH1cblxuICBpZiAoZm9ybWF0ID09PSAneXl5eS1NTScpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9eKFxcZHs0fSktKFxcZHsyfSkkLy5leGVjKHRyaW1tZWQpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHllYXIgPSBhc0ludChtYXRjaFsxXSk7XG4gICAgY29uc3QgbW9udGggPSBhc0ludChtYXRjaFsyXSk7XG4gICAgaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCAxKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlRGF0ZSh2YWx1ZTogV2NvRGF0ZUlucHV0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBpc1ZhbGlkRGF0ZSh2YWx1ZSkgPyB2YWx1ZSA6IG51bGw7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiBudWxsO1xuXG4gIC8vIEFjY2VwdCBjb21tb24gQVBJIGZvcm1hdHMgYnkgZGVmYXVsdC5cbiAgY29uc3QgYXBpRGF0ZSA9IHBhcnNlRGF0ZSh0cmltbWVkLCAneXl5eS1NTS1kZCcpO1xuICBpZiAoYXBpRGF0ZSkgcmV0dXJuIGFwaURhdGU7XG5cbiAgY29uc3QgYXBpRGF0ZVRpbWUgPSBwYXJzZURhdGUodHJpbW1lZCwgXCJ5eXl5LU1NLWRkJ1QnSEg6bW1cIik7XG4gIGlmIChhcGlEYXRlVGltZSkgcmV0dXJuIGFwaURhdGVUaW1lO1xuXG4gIGNvbnN0IGJyRGF0ZSA9IHBhcnNlRGF0ZSh0cmltbWVkLCAnZGQvTU0veXl5eScpO1xuICBpZiAoYnJEYXRlKSByZXR1cm4gYnJEYXRlO1xuXG4gIGNvbnN0IGJyRGF0ZVRpbWUgPSBwYXJzZURhdGUodHJpbW1lZCwgJ2RkL01NL3l5eXkgSEg6bW0nKTtcbiAgaWYgKGJyRGF0ZVRpbWUpIHJldHVybiBickRhdGVUaW1lO1xuXG4gIGNvbnN0IG1vbnRoWWVhciA9IHBhcnNlRGF0ZSh0cmltbWVkLCAnTU0veXl5eScpO1xuICBpZiAobW9udGhZZWFyKSByZXR1cm4gbW9udGhZZWFyO1xuXG4gIGNvbnN0IGFwaU1vbnRoID0gcGFyc2VEYXRlKHRyaW1tZWQsICd5eXl5LU1NJyk7XG4gIGlmIChhcGlNb250aCkgcmV0dXJuIGFwaU1vbnRoO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Jc29EYXRlS2V5KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICByZXR1cm4gZm9ybWF0RGF0ZSh0b0RhdGVPbmx5KGRhdGUpLCAneXl5eS1NTS1kZCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREaXNhYmxlZFByZWRpY2F0ZShvcHRpb25zOiB7XG4gIGRpc2FibGVGdXR1cmU6IGJvb2xlYW47XG4gIGRpc2FibGVQYXN0OiBib29sZWFuO1xuICBtaW5EYXRlPzogRGF0ZSB8IG51bGw7XG4gIG1heERhdGU/OiBEYXRlIHwgbnVsbDtcbiAgZGlzYWJsZVdlZWtlbmRzOiBib29sZWFuO1xuICBkaXNhYmxlSG9saWRheXM6IGJvb2xlYW47XG4gIGhvbGlkYXlTZXQ6IFNldDxzdHJpbmc+O1xuICBkYXRlRmlsdGVyPzogKChkYXRlOiBEYXRlKSA9PiBib29sZWFuKSB8IG51bGw7XG59KTogKGRhdGU6IERhdGUpID0+IHsgZGlzYWJsZWQ6IGJvb2xlYW47IHJlYXNvbj86IFdjb0RhdGVwaWNrZXJEaXNhYmxlZFJlYXNvbiB9IHtcbiAgY29uc3QgdG9kYXkgPSB0b0RhdGVPbmx5KG5ldyBEYXRlKCkpO1xuXG4gIHJldHVybiAoZGF0ZTogRGF0ZSkgPT4ge1xuICAgIGNvbnN0IGRheSA9IHRvRGF0ZU9ubHkoZGF0ZSk7XG5cbiAgICBpZiAob3B0aW9ucy5kaXNhYmxlRnV0dXJlICYmIGRheS5nZXRUaW1lKCkgPiB0b2RheS5nZXRUaW1lKCkpIHtcbiAgICAgIHJldHVybiB7IGRpc2FibGVkOiB0cnVlLCByZWFzb246ICdmdXR1cmUnIH07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGlzYWJsZVBhc3QgJiYgZGF5LmdldFRpbWUoKSA8IHRvZGF5LmdldFRpbWUoKSkge1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IHRydWUsIHJlYXNvbjogJ3Bhc3QnIH07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWluRGF0ZSAmJiBkYXkuZ2V0VGltZSgpIDwgdG9EYXRlT25seShvcHRpb25zLm1pbkRhdGUpLmdldFRpbWUoKSkge1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IHRydWUsIHJlYXNvbjogJ21pbkRhdGUnIH07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWF4RGF0ZSAmJiBkYXkuZ2V0VGltZSgpID4gdG9EYXRlT25seShvcHRpb25zLm1heERhdGUpLmdldFRpbWUoKSkge1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IHRydWUsIHJlYXNvbjogJ21heERhdGUnIH07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGlzYWJsZVdlZWtlbmRzKSB7XG4gICAgICBjb25zdCBkb3cgPSBkYXkuZ2V0RGF5KCk7XG4gICAgICBpZiAoZG93ID09PSAwIHx8IGRvdyA9PT0gNikge1xuICAgICAgICByZXR1cm4geyBkaXNhYmxlZDogdHJ1ZSwgcmVhc29uOiAnd2Vla2VuZCcgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5kaXNhYmxlSG9saWRheXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRvSXNvRGF0ZUtleShkYXkpO1xuICAgICAgaWYgKG9wdGlvbnMuaG9saWRheVNldC5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4geyBkaXNhYmxlZDogdHJ1ZSwgcmVhc29uOiAnaG9saWRheScgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5kYXRlRmlsdGVyICYmIG9wdGlvbnMuZGF0ZUZpbHRlcihkYXkpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IHRydWUsIHJlYXNvbjogJ2N1c3RvbScgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgfTtcbn1cblxuIl19