UNPKG

asa-date-picker

Version:

An Angular date picker component supporting Gregorian and Persian (Jalali/Shamsi) calendars, powered by Asa Co.

365 lines 48.4 kB
import { format as formatJalali, parse as parseJalali, addDays as addDaysJalali, addMonths as addMonthsJalali, addYears as addYearsJalali, addHours as addHoursJalali, startOfWeek as startOfWeekJalali, startOfMonth as startOfMonthJalali, endOfMonth as endOfMonthJalali, isSameDay as isSameDayJalali, isSameMonth as isSameMonthJalali, isSameYear as isSameYearJalali, isAfter as isAfterJalali, isBefore as isBeforeJalali, isValid as isValidJalali, max as maxJalali, setYear as setYearJalali, getDaysInMonth as getDaysInMonthJalali } from 'date-fns-jalali'; import { format as formatGregorian, parse as parseGregorian, addDays as addDaysGregorian, addMonths as addMonthsGregorian, addYears as addYearsGregorian, addHours as addHoursGregorian, startOfWeek as startOfWeekGregorian, startOfMonth as startOfMonthGregorian, endOfMonth as endOfMonthGregorian, isSameDay as isSameDayGregorian, isSameMonth as isSameMonthGregorian, isSameYear as isSameYearGregorian, isAfter as isAfterGregorian, isBefore as isBeforeGregorian, isValid as isValidGregorian, max as maxGregorian, setYear as setYearGregorian, getDaysInMonth as getDaysInMonthGregorian, parseISO, startOfDay, isEqual, addMinutes } from 'date-fns'; import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class JalaliDateAdapter { today() { return new Date(); } parse(value, formatString) { if (typeof value === 'string') { // Check if it's in ISO 8601 format if (value.includes('T')) { const parsedDate = parseISO(value); return isValidJalali(parsedDate) ? parsedDate : null; } try { const parsedDate = parseJalali(value, formatString, new Date()); return isValidJalali(parsedDate) ? parsedDate : null; } catch (error) { console.error('Error parsing date:', error); return null; } } else if (value instanceof Date) { return isValidJalali(value) ? value : null; } return null; } format(date, formatString) { return formatJalali(date, formatString); } addDays(date, amount) { return addDaysJalali(date, amount); } addMonths(date, amount) { return addMonthsJalali(date, amount); } addYears(date, amount) { return addYearsJalali(date, amount); } addHours(date, amount) { return addHoursJalali(date, amount); } getYear(date) { return date ? parseInt(formatJalali(date, 'yyyy')) : null; } getMonth(date) { // Jalali months are 1-indexed in date-fns-jalali return date ? parseInt(formatJalali(date, 'M')) - 1 : null; } getDate(date) { return date ? parseInt(formatJalali(date, 'dd')) : null; } getDayOfWeek(date) { return parseInt(formatJalali(date, 'i')) - 1; } getMonthNames(style) { const jalaliMonths = [ 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند' ]; switch (style) { case 'long': return jalaliMonths; case 'short': return jalaliMonths.map(month => month.substring(0, 3)); case 'narrow': return jalaliMonths.map(month => month.substring(0, 1)); default: return jalaliMonths; } } getDateNames() { return Array.from({ length: 31 }, (_, i) => (i + 1).toString()); } getDayOfWeekNames(style) { const formats = { long: 'EEEE', short: 'EEEEE', narrow: 'EEEEEE' }; return Array.from({ length: 7 }, (_, i) => formatJalali(addDaysJalali(startOfWeekJalali(new Date()), i), formats[style])); } getFirstDayOfWeek() { return 6; // Saturday is the first day of the week in the Jalali calendar } getNumDaysInMonth(date) { return parseInt(formatJalali(endOfMonthJalali(date), 'd')); } clone(date) { return new Date(date.getTime()); } createDate(year, month, date) { // Adjust for 0-indexed months in the interface vs 1-indexed months in date-fns-jalali return parseJalali(`${year}/${month + 1}/${date}`, 'yyyy/M/d', new Date()); } isSameDay(date1, date2) { return isSameDayJalali(date1, date2); } isSameMonth(date1, date2) { return isSameMonthJalali(date1, date2); } isSameYear(date1, date2) { return isSameYearJalali(date1, date2); } isAfter(date1, date2) { return isAfterJalali(date1, date2); } isBefore(date1, date2) { return isBeforeJalali(date1, date2); } isEqual(date1, date2) { return isEqual(date1, date2); } startOfMonth(date) { return startOfMonthJalali(date); } endOfMonth(date) { return endOfMonthJalali(date); } startOfWeek(date) { return startOfWeekJalali(date, { weekStartsOn: this.getFirstDayOfWeek() }); } isValidFormat(dateString, formatString) { try { const parsedDate = parseJalali(dateString, formatString, new Date()); if (!isValidJalali(parsedDate)) { return false; } // Check if the formatted parsed date matches the original date string const formattedDate = formatJalali(parsedDate, formatString); return formattedDate === dateString; } catch (error) { return false; } } max(dates) { return maxJalali(dates); } setYear(date, year) { return setYearJalali(date, year); } startOfDay(date) { return startOfDay(date); } getHours(date) { return date ? parseInt(formatJalali(date, 'HH')) : null; } getMinutes(date) { return date ? parseInt(formatJalali(date, 'mm')) : null; } getSeconds(date) { return date ? parseInt(formatJalali(date, 'ss')) : null; } setHours(date, hours) { const newDate = this.clone(date); newDate.setHours(hours); return newDate; } setMinutes(date, minutes) { const newDate = this.clone(date); newDate.setMinutes(minutes); return newDate; } setSeconds(date, seconds) { const newDate = this.clone(date); newDate.setSeconds(seconds); return newDate; } getDaysInMonth(date) { return getDaysInMonthJalali(date); } addMinutes(date, amount) { return addMinutes(date, amount); } } JalaliDateAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JalaliDateAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); JalaliDateAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JalaliDateAdapter, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JalaliDateAdapter, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); export class GregorianDateAdapter { today() { return new Date(); } parse(value, formatString) { if (typeof value === 'string') { // Check if it's in ISO 8601 format if (value.includes('T')) { const parsedDate = parseISO(value); return isValidGregorian(parsedDate) ? parsedDate : null; } try { let parsedDate; if (formatString === "ISO") { parsedDate = parseISO(value); } else { parsedDate = parseGregorian(value, formatString, new Date()); } return isValidGregorian(parsedDate) ? parsedDate : null; } catch (error) { console.error('Error parsing date:', error); return null; } } else if (value instanceof Date) { return isValidGregorian(value) ? value : null; } return null; } format(date, formatString) { return formatGregorian(date, formatString); } addDays(date, amount) { return addDaysGregorian(date, amount); } addMonths(date, amount) { return addMonthsGregorian(date, amount); } addYears(date, amount) { return addYearsGregorian(date, amount); } addHours(date, amount) { return addHoursGregorian(date, amount); } getYear(date) { return date.getFullYear(); } getMonth(date) { return date.getMonth(); } getDate(date) { return date.getDate(); } getDayOfWeek(date) { return date.getDay(); } getMonthNames(style) { const formats = { long: 'MMMM', short: 'MMM', narrow: 'MMMMM' }; return Array.from({ length: 12 }, (_, i) => formatGregorian(new Date(2000, i, 1), formats[style])); } getDateNames() { return Array.from({ length: 31 }, (_, i) => (i + 1).toString()); } getDayOfWeekNames(style) { const formats = { long: 'EEEE', short: 'EEE', narrow: 'EEEEE' }; return Array.from({ length: 7 }, (_, i) => formatGregorian(addDaysGregorian(startOfWeekGregorian(new Date()), i), formats[style])); } getFirstDayOfWeek() { return 0; // Sunday is the first day of the week in the Gregorian calendar } getNumDaysInMonth(date) { return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate(); } clone(date) { return new Date(date.getTime()); } createDate(year, month, date) { return new Date(year, month, date); } isSameDay(date1, date2) { return isSameDayGregorian(date1, date2); } isSameMonth(date1, date2) { return isSameMonthGregorian(date1, date2); } isSameYear(date1, date2) { return isSameYearGregorian(date1, date2); } isAfter(date1, date2) { return isAfterGregorian(date1, date2); } isBefore(date1, date2) { return isBeforeGregorian(date1, date2); } isEqual(date1, date2) { return isEqual(date1, date2); } startOfMonth(date) { return startOfMonthGregorian(date); } endOfMonth(date) { return endOfMonthGregorian(date); } startOfWeek(date) { return startOfWeekGregorian(date, { weekStartsOn: this.getFirstDayOfWeek() }); } isValidFormat(dateString, formatString) { try { const parsedDate = parseGregorian(dateString, formatString, new Date()); if (!isValidGregorian(parsedDate)) { return false; } // Check if the formatted parsed date matches the original date string const formattedDate = formatGregorian(parsedDate, formatString); return formattedDate === dateString; } catch (error) { return false; } } max(dates) { return maxGregorian(dates); } setYear(date, year) { return setYearGregorian(date, year); } startOfDay(date) { return startOfDay(date); } getHours(date) { return date ? date.getHours() : null; } getMinutes(date) { return date ? date.getMinutes() : null; } getSeconds(date) { return date ? date.getSeconds() : null; } setHours(date, hours) { const newDate = this.clone(date); newDate.setHours(hours); return newDate; } setMinutes(date, minutes) { const newDate = this.clone(date); newDate.setMinutes(minutes); return newDate; } setSeconds(date, seconds) { const newDate = this.clone(date); newDate.setSeconds(seconds); return newDate; } getDaysInMonth(date) { return getDaysInMonthGregorian(date); } addMinutes(date, amount) { return addMinutes(date, amount); } } GregorianDateAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GregorianDateAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); GregorianDateAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GregorianDateAdapter, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GregorianDateAdapter, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNhLWRhdGUtYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FzYS1kYXRlLXBpY2tlci9zcmMvYXNhLWRhdGUtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsTUFBTSxJQUFJLFlBQVksRUFDdEIsS0FBSyxJQUFJLFdBQVcsRUFDcEIsT0FBTyxJQUFJLGFBQWEsRUFDeEIsU0FBUyxJQUFJLGVBQWUsRUFDNUIsUUFBUSxJQUFJLGNBQWMsRUFDMUIsUUFBUSxJQUFJLGNBQWMsRUFDMUIsV0FBVyxJQUFJLGlCQUFpQixFQUNoQyxZQUFZLElBQUksa0JBQWtCLEVBQ2xDLFVBQVUsSUFBSSxnQkFBZ0IsRUFDOUIsU0FBUyxJQUFJLGVBQWUsRUFDNUIsV0FBVyxJQUFJLGlCQUFpQixFQUNoQyxVQUFVLElBQUksZ0JBQWdCLEVBQzlCLE9BQU8sSUFBSSxhQUFhLEVBQ3hCLFFBQVEsSUFBSSxjQUFjLEVBQzFCLE9BQU8sSUFBSSxhQUFhLEVBQ3hCLEdBQUcsSUFBSSxTQUFTLEVBQ2hCLE9BQU8sSUFBSSxhQUFhLEVBQ3hCLGNBQWMsSUFBSSxvQkFBb0IsRUFDdkMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQ0wsTUFBTSxJQUFJLGVBQWUsRUFDekIsS0FBSyxJQUFJLGNBQWMsRUFDdkIsT0FBTyxJQUFJLGdCQUFnQixFQUMzQixTQUFTLElBQUksa0JBQWtCLEVBQy9CLFFBQVEsSUFBSSxpQkFBaUIsRUFDN0IsUUFBUSxJQUFJLGlCQUFpQixFQUM3QixXQUFXLElBQUksb0JBQW9CLEVBQ25DLFlBQVksSUFBSSxxQkFBcUIsRUFDckMsVUFBVSxJQUFJLG1CQUFtQixFQUNqQyxTQUFTLElBQUksa0JBQWtCLEVBQy9CLFdBQVcsSUFBSSxvQkFBb0IsRUFDbkMsVUFBVSxJQUFJLG1CQUFtQixFQUNqQyxPQUFPLElBQUksZ0JBQWdCLEVBQzNCLFFBQVEsSUFBSSxpQkFB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QUFDO0lBQ3ZDLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBVSxFQUFFLE1BQWM7UUFDbkMsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7O2lIQS9NVSxvQkFBb0I7cUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBmb3JtYXQgYXMgZm9ybWF0SmFsYWxpLFxuICBwYXJzZSBhcyBwYXJzZUphbGFsaSxcbiAgYWRkRGF5cyBhcyBhZGREYXlzSmFsYWxpLFxuICBhZGRNb250aHMgYXMgYWRkTW9udGhzSmFsYWxpLFxuICBhZGRZZWFycyBhcyBhZGRZZWFyc0phbGFsaSxcbiAgYWRkSG91cnMgYXMgYWRkSG91cnNKYWxhbGksXG4gIHN0YXJ0T2ZXZWVrIGFzIHN0YXJ0T2ZXZWVrSmFsYWxpLFxuICBzdGFydE9mTW9udGggYXMgc3RhcnRPZk1vbnRoSmFsYWxpLFxuICBlbmRPZk1vbnRoIGFzIGVuZE9mTW9udGhKYWxhbGksXG4gIGlzU2FtZURheSBhcyBpc1NhbWVEYXlKYWxhbGksXG4gIGlzU2FtZU1vbnRoIGFzIGlzU2FtZU1vbnRoSmFsYWxpLFxuICBpc1NhbWVZZWFyIGFzIGlzU2FtZVllYXJKYWxhbGksXG4gIGlzQWZ0ZXIgYXMgaXNBZnRlckphbGFsaSxcbiAgaXNCZWZvcmUgYXMgaXNCZWZvcmVKYWxhbGksXG4gIGlzVmFsaWQgYXMgaXNWYWxpZEphbGFsaSxcbiAgbWF4IGFzIG1heEphbGFsaSxcbiAgc2V0WWVhciBhcyBzZXRZZWFySmFsYWxpLFxuICBnZXREYXlzSW5Nb250aCBhcyBnZXREYXlzSW5Nb250aEphbGFsaVxufSBmcm9tICdkYXRlLWZucy1qYWxhbGknO1xuXG5pbXBvcnQge1xuICBmb3JtYXQgYXMgZm9ybWF0R3JlZ29yaWFuLFxuICBwYXJzZSBhcyBwYXJzZUdyZWdvcmlhbixcbiAgYWRkRGF5cyBhcyBhZGREYXlzR3JlZ29yaWFuLFxuICBhZGRNb250aHMgYXMgYWRkTW9udGhzR3JlZ29yaWFuLFxuICBhZGRZZWFycyBhcyBhZGRZZWFyc0dyZWdvcmlhbixcbiAgYWRkSG91cnMgYXMgYWRkSG91cnNHcmVnb3JpYW4sXG4gIHN0YXJ0T2ZXZWVrIGFzIHN0YXJ0T2ZXZWVrR3JlZ29yaWFuLFxuICBzdGFydE9mTW9udGggYXMgc3RhcnRPZk1vbnRoR3JlZ29yaWFuLFxuICBlbmRPZk1vbnRoIGFzIGVuZE9mTW9udGhHcmVnb3JpYW4sXG4gIGlzU2FtZURheSBhcyBpc1NhbWVEYXlHcmVnb3JpYW4sXG4gIGlzU2FtZU1vbnRoIGFzIGlzU2FtZU1vbnRoR3JlZ29yaWFuLFxuICBpc1NhbWVZZWFyIGFzIGlzU2FtZVllYXJHcmVnb3JpYW4sXG4gIGlzQWZ0ZXIgYXMgaXNBZnRlckdyZWdvcmlhbixcbiAgaXNCZWZvcmUgYXMgaXNCZWZvcmVHcmVnb3JpYW4sXG4gIGlzVmFsaWQgYXMgaXNWYWxpZEdyZWdvcmlhbixcbiAgbWF4IGFzIG1heEdyZWdvcmlhbixcbiAgc2V0WWVhciBhcyBzZXRZZWFyR3JlZ29yaWFuLFxuICBnZXREYXlzSW5Nb250aCBhcyBnZXREYXlzSW5Nb250aEdyZWdvcmlhbixcbiAgcGFyc2VJU08sXG4gIHN0YXJ0T2ZEYXksXG4gIGlzRXF1YWwsXG4gIGFkZE1pbnV0ZXNcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzYURhdGVBZGFwdGVyPEQ+IHtcbiAgdG9kYXkoKTogRDtcbiAgcGFyc2UodmFsdWU6IGFueSwgZm9ybWF0U3RyaW5nOiBzdHJpbmcpOiBEIHwgbnVsbDtcbiAgZm9ybWF0KGRhdGU6IEQsIGZvcm1hdFN0cmluZzogc3RyaW5nKTogc3RyaW5nO1xuICBhZGREYXlzKGRhdGU6IEQsIGFtb3VudDogbnVtYmVyKTogRDtcbiAgYWRkTW9udGhzKGRhdGU6IEQsIGFtb3VudDogbnVtYmVyKTogRDtcbiAgYWRkWWVhcnMoZGF0ZTogRCwgYW1vdW50OiBudW1iZXIpOiBEO1xuICBhZGRIb3VycyhkYXRlOiBELCBhbW91bnQ6IG51bWJlcik6IEQ7XG4gIGdldFllYXIoZGF0ZTogRCk6IG51bWJlcnxudWxsO1xuICBnZXRNb250aChkYXRlOiBEKTogbnVtYmVyfG51bGw7XG4gIGdldERhdGUoZGF0ZTogRCk6IG51bWJlcnxudWxsO1xuICBnZXREYXlPZldlZWsoZGF0ZTogRCk6IG51bWJlcjtcbiAgZ2V0TW9udGhOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW107XG4gIGdldERhdGVOYW1lcygpOiBzdHJpbmdbXTtcbiAgZ2V0RGF5T2ZXZWVrTmFtZXMoc3R5bGU6ICdsb25nJyB8ICdzaG9ydCcgfCAnbmFycm93Jyk6IHN0cmluZ1tdO1xuICBnZXRGaXJzdERheU9mV2VlaygpOiBudW1iZXI7XG4gIGdldE51bURheXNJbk1vbnRoKGRhdGU6IEQpOiBudW1iZXI7XG4gIGNsb25lKGRhdGU6IEQpOiBEO1xuICBjcmVhdGVEYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF0ZTogbnVtYmVyKTogRDtcbiAgaXNTYW1lRGF5KGRhdGUxOiBELCBkYXRlMjogRCk6IGJvb2xlYW47XG4gIGlzU2FtZU1vbnRoKGRhdGUxOiBELCBkYXRlMjogRCk6IGJvb2xlYW47XG4gIGlzU2FtZVllYXIoZGF0ZTE6IEQsIGRhdGUyOiBEKTogYm9vbGVhbjtcbiAgaXNBZnRlcihkYXRlMTogRCwgZGF0ZTI6IEQpOiBib29sZWFuO1xuICBpc0JlZm9yZShkYXRlMTogRCwgZGF0ZTI6IEQpOiBib29sZWFuO1xuICBpc0VxdWFsKGRhdGUxOiBELCBkYXRlMjogRCk6IGJvb2xlYW47XG4gIHN0YXJ0T2ZNb250aChkYXRlOiBEKTogRDtcbiAgZW5kT2ZNb250aChkYXRlOiBEKTogRDtcbiAgc3RhcnRPZldlZWsoZGF0ZTogRCk6IEQ7XG4gIGlzVmFsaWRGb3JtYXQoZGF0ZVN0cmluZzogc3RyaW5nLCBmb3JtYXRTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW47XG4gIG1heChkYXRlczogRFtdKTogRDtcbiAgc2V0WWVhcihkYXRlOiBELCB5ZWFyOiBudW1iZXIpOiBEO1xuICBzdGFydE9mRGF5IChkYXRlOiBEKTogRDtcbiAgZ2V0SG91cnMoZGF0ZTogRCk6IG51bWJlcnxudWxsO1xuICBnZXRNaW51dGVzKGRhdGU6IEQpOiBudW1iZXJ8bnVsbDtcbiAgZ2V0U2Vjb25kcyhkYXRlOiBEKTogbnVtYmVyfG51bGw7XG4gIHNldEhvdXJzKGRhdGU6IEQsIGhvdXJzOiBudW1iZXIpOiBEO1xuICBzZXRNaW51dGVzKGRhdGU6IEQsIG1pbnV0ZXM6IG51bWJlcik6IEQ7XG4gIHNldFNlY29uZHMoZGF0ZTogRCwgc2Vjb25kczogbnVtYmVyKTogRDtcbiAgZ2V0RGF5c0luTW9udGgoZGF0ZTogRCk6IG51bWJlcjtcbiAgYWRkTWludXRlcyhkYXRlOiBELCBhbW91bnQ6IG51bWJlcik6IEQ7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEphbGFsaURhdGVBZGFwdGVyIGltcGxlbWVudHMgQXNhRGF0ZUFkYXB0ZXI8RGF0ZT4ge1xuICB0b2RheSgpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKTtcbiAgfVxuXG4gIHBhcnNlKHZhbHVlOiBhbnksIGZvcm1hdFN0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGluIElTTyA4NjAxIGZvcm1hdFxuICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCdUJykpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHBhcnNlSVNPKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWRKYWxhbGkocGFyc2VkRGF0ZSkgPyBwYXJzZWREYXRlIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHBhcnNlSmFsYWxpKHZhbHVlLCBmb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpO1xuICAgICAgICByZXR1cm4gaXNWYWxpZEphbGFsaShwYXJzZWREYXRlKSA/IHBhcnNlZERhdGUgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBkYXRlOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBpc1ZhbGlkSmFsYWxpKHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmb3JtYXQoZGF0ZTogRGF0ZSwgZm9ybWF0U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXRKYWxhbGkoZGF0ZSwgZm9ybWF0U3RyaW5nKTtcbiAgfVxuXG4gIGFkZERheXMoZGF0ZTogRGF0ZSwgYW1vdW50OiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gYWRkRGF5c0phbGFsaShkYXRlLCBhbW91bnQpO1xuICB9XG5cbiAgYWRkTW9udGhzKGRhdGU6IERhdGUsIGFtb3VudDogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIGFkZE1vbnRoc0phbGFsaShkYXRlLCBhbW91bnQpO1xuICB9XG5cbiAgYWRkWWVhcnMoZGF0ZTogRGF0ZSwgYW1vdW50OiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gYWRkWWVhcnNKYWxhbGkoZGF0ZSwgYW1vdW50KTtcbiAgfVxuXG4gIGFkZEhvdXJzKGRhdGU6IERhdGUsIGFtb3VudDogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIGFkZEhvdXJzSmFsYWxpKGRhdGUsIGFtb3VudCk7XG4gIH1cblxuICBnZXRZZWFyKGRhdGU6IERhdGUpOiBudW1iZXJ8bnVsbCB7XG4gICAgcmV0dXJuIGRhdGU/IHBhcnNlSW50KGZvcm1hdEphbGFsaShkYXRlLCAneXl5eScpKTogbnVsbDtcbiAgfVxuXG4gIGdldE1vbnRoKGRhdGU6IERhdGUpOiBudW1iZXJ8bnVsbCB7XG4gICAgLy8gSmFsYWxpIG1vbnRocyBhcmUgMS1pbmRleGVkIGluIGRhdGUtZm5zLWphbGFsaVxuICAgIHJldHVybiBkYXRlPyBwYXJzZUludChmb3JtYXRKYWxhbGkoZGF0ZSwgJ00nKSkgLSAxOiBudWxsO1xuICB9XG5cbiAgZ2V0RGF0ZShkYXRlOiBEYXRlKTogbnVtYmVyfG51bGwge1xuICAgIHJldHVybiBkYXRlPyBwYXJzZUludChmb3JtYXRKYWxhbGkoZGF0ZSwgJ2RkJykpOiBudWxsO1xuICB9XG5cbiAgZ2V0RGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBwYXJzZUludChmb3JtYXRKYWxhbGkoZGF0ZSwgJ2knKSkgLSAxO1xuICB9XG5cbiAgZ2V0TW9udGhOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGphbGFsaU1vbnRocyA9IFtcbiAgICAgICfZgdix2YjYsdiv24zZhicsICfYp9ix2K/bjNio2YfYtNiqJywgJ9iu2LHYr9in2K8nLCAn2KrbjNixJywgJ9mF2LHYr9in2K8nLCAn2LTZh9ix24zZiNixJyxcbiAgICAgICfZhdmH2LEnLCAn2KLYqNin2YYnLCAn2KLYsNixJywgJ9iv24wnLCAn2KjZh9mF2YYnLCAn2KfYs9mB2YbYrydcbiAgICBdO1xuXG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG9uZyc6XG4gICAgICAgIHJldHVybiBqYWxhbGlNb250aHM7XG4gICAgICBjYXNlICdzaG9ydCc6XG4gICAgICAgIHJldHVybiBqYWxhbGlNb250aHMubWFwKG1vbnRoID0+IG1vbnRoLnN1YnN0cmluZygwLCAzKSk7XG4gICAgICBjYXNlICduYXJyb3cnOlxuICAgICAgICByZXR1cm4gamFsYWxpTW9udGhzLm1hcChtb250aCA9PiBtb250aC5zdWJzdHJpbmcoMCwgMSkpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGphbGFsaU1vbnRocztcbiAgICB9XG4gIH1cblxuICBnZXREYXRlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAzMSB9LCAoXywgaSkgPT4gKGkgKyAxKS50b1N0cmluZygpKTtcbiAgfVxuXG4gIGdldERheU9mV2Vla05hbWVzKHN0eWxlOiAnbG9uZycgfCAnc2hvcnQnIHwgJ25hcnJvdycpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZm9ybWF0cyA9IHtcbiAgICAgIGxvbmc6ICdFRUVFJyxcbiAgICAgIHNob3J0OiAnRUVFRUUnLFxuICAgICAgbmFycm93OiAnRUVFRUVFJ1xuICAgIH07XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDcgfSwgKF8sIGkpID0+XG4gICAgICBmb3JtYXRKYWxhbGkoYWRkRGF5c0phbGFsaShzdGFydE9mV2Vla0phbGFsaShuZXcgRGF0ZSgpKSwgaSksIGZvcm1hdHNbc3R5bGVdKVxuICAgICk7XG4gIH1cblxuICBnZXRGaXJzdERheU9mV2VlaygpOiBudW1iZXIge1xuICAgIHJldHVybiA2OyAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGluIHRoZSBKYWxhbGkgY2FsZW5kYXJcbiAgfVxuXG4gIGdldE51bURheXNJbk1vbnRoKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBwYXJzZUludChmb3JtYXRKYWxhbGkoZW5kT2ZNb250aEphbGFsaShkYXRlKSwgJ2QnKSk7XG4gIH1cblxuICBjbG9uZShkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIGNyZWF0ZURhdGUoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXRlOiBudW1iZXIpOiBEYXRlIHtcbiAgICAvLyBBZGp1c3QgZm9yIDAtaW5kZXhlZCBtb250aHMgaW4gdGhlIGludGVyZmFjZSB2cyAxLWluZGV4ZWQgbW9udGhzIGluIGRhdGUtZm5zLWphbGFsaVxuICAgIHJldHVybiBwYXJzZUphbGFsaShgJHt5ZWFyfS8ke21vbnRoICsgMX0vJHtkYXRlfWAsICd5eXl5L00vZCcsIG5ldyBEYXRlKCkpO1xuICB9XG5cbiAgaXNTYW1lRGF5KGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1NhbWVEYXlKYWxhbGkoZGF0ZTEsIGRhdGUyKTtcbiAgfVxuXG4gIGlzU2FtZU1vbnRoKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1NhbWVNb250aEphbGFsaShkYXRlMSwgZGF0ZTIpO1xuICB9XG5cbiAgaXNTYW1lWWVhcihkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNTYW1lWWVhckphbGFsaShkYXRlMSwgZGF0ZTIpO1xuICB9XG5cbiAgaXNBZnRlcihkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNBZnRlckphbGFsaShkYXRlMSwgZGF0ZTIpO1xuICB9XG5cbiAgaXNCZWZvcmUoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQmVmb3JlSmFsYWxpKGRhdGUxLCBkYXRlMik7XG4gIH1cblxuICBpc0VxdWFsKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0VxdWFsKGRhdGUxLCBkYXRlMik7XG4gIH1cblxuICBzdGFydE9mTW9udGgoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBzdGFydE9mTW9udGhKYWxhbGkoZGF0ZSk7XG4gIH1cblxuICBlbmRPZk1vbnRoKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gZW5kT2ZNb250aEphbGFsaShkYXRlKTtcbiAgfVxuXG4gIHN0YXJ0T2ZXZWVrKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gc3RhcnRPZldlZWtKYWxhbGkoZGF0ZSwgeyB3ZWVrU3RhcnRzT246IHRoaXMuZ2V0Rmlyc3REYXlPZldlZWsoKSBhcyAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IH0pO1xuICB9XG5cbiAgaXNWYWxpZEZvcm1hdChkYXRlU3RyaW5nOiBzdHJpbmcsIGZvcm1hdFN0cmluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSBwYXJzZUphbGFsaShkYXRlU3RyaW5nLCBmb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpO1xuICAgICAgaWYgKCFpc1ZhbGlkSmFsYWxpKHBhcnNlZERhdGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmb3JtYXR0ZWQgcGFyc2VkIGRhdGUgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgZGF0ZSBzdHJpbmdcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBmb3JtYXRKYWxhbGkocGFyc2VkRGF0ZSwgZm9ybWF0U3RyaW5nKTtcbiAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRlID09PSBkYXRlU3RyaW5nO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbWF4KGRhdGVzOiBEYXRlW10pOiBEYXRlIHtcbiAgICByZXR1cm4gbWF4SmFsYWxpKGRhdGVzKTtcbiAgfVxuXG4gIHNldFllYXIoZGF0ZTogRGF0ZSwgeWVhcjogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIHNldFllYXJKYWxhbGkoZGF0ZSwgeWVhcilcbiAgfVxuXG4gIHN0YXJ0T2ZEYXkoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBzdGFydE9mRGF5KGRhdGUpO1xuICB9XG5cbiAgZ2V0SG91cnMoZGF0ZTogRGF0ZSk6IG51bWJlcnxudWxsIHtcbiAgICByZXR1cm4gZGF0ZT8gcGFyc2VJbnQoZm9ybWF0SmFsYWxpKGRhdGUsICdISCcpKTogbnVsbDtcbiAgfVxuXG4gIGdldE1pbnV0ZXMoZGF0ZTogRGF0ZSk6IG51bWJlcnxudWxsIHtcbiAgICByZXR1cm4gZGF0ZT8gcGFyc2VJbnQoZm9ybWF0SmFsYWxpKGRhdGUsICdtbScpKTogbnVsbDtcbiAgfVxuXG4gIGdldFNlY29uZHMoZGF0ZTogRGF0ZSk6IG51bWJlcnxudWxsIHtcbiAgICByZXR1cm4gZGF0ZT8gcGFyc2VJbnQoZm9ybWF0SmFsYWxpKGRhdGUsICdzcycpKTogbnVsbDtcbiAgfVxuXG4gIHNldEhvdXJzKGRhdGU6IERhdGUsIGhvdXJzOiBudW1iZXIpOiBEYXRlIHtcbiAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5jbG9uZShkYXRlKTtcbiAgICBuZXdEYXRlLnNldEhvdXJzKGhvdXJzKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfVxuXG4gIHNldE1pbnV0ZXMoZGF0ZTogRGF0ZSwgbWludXRlczogbnVtYmVyKTogRGF0ZSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuY2xvbmUoZGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXRNaW51dGVzKG1pbnV0ZXMpO1xuICAgIHJldHVybiBuZXdEYXRlO1xuICB9XG5cbiAgc2V0U2Vjb25kcyhkYXRlOiBEYXRlLCBzZWNvbmRzOiBudW1iZXIpOiBEYXRlIHtcbiAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5jbG9uZShkYXRlKTtcbiAgICBuZXdEYXRlLnNldFNlY29uZHMoc2Vjb25kcyk7XG4gICAgcmV0dXJuIG5ld0RhdGU7XG4gIH1cblxuICBnZXREYXlzSW5Nb250aChkYXRlOiBEYXRlKSB7XG4gICAgcmV0dXJuIGdldERheXNJbk1vbnRoSmFsYWxpKGRhdGUpO1xuICB9XG5cbiAgYWRkTWludXRlcyhkYXRlOiBEYXRlLCBhbW91bnQ6IG51bWJlcikge1xuICAgIHJldHVybiBhZGRNaW51dGVzKGRhdGUsIGFtb3VudCk7XG4gIH1cbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR3JlZ29yaWFuRGF0ZUFkYXB0ZXIgaW1wbGVtZW50cyBBc2FEYXRlQWRhcHRlcjxEYXRlPiB7XG4gIHRvZGF5KCk6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICB9XG5cbiAgcGFyc2UodmFsdWU6IGFueSwgZm9ybWF0U3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAvLyBDaGVjayBpZiBpdCdzIGluIElTTyA4NjAxIGZvcm1hdFxuICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnVCcpKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSBwYXJzZUlTTyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkR3JlZ29yaWFuKHBhcnNlZERhdGUpID8gcGFyc2VkRGF0ZSA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBwYXJzZWREYXRlOiBEYXRlO1xuICAgICAgICBpZiAoZm9ybWF0U3RyaW5nID09PSBcIklTT1wiKSB7XG4gICAgICAgICAgcGFyc2VkRGF0ZSA9IHBhcnNlSVNPKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJzZWREYXRlID0gcGFyc2VHcmVnb3JpYW4odmFsdWUsIGZvcm1hdFN0cmluZywgbmV3IERhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmFsaWRHcmVnb3JpYW4ocGFyc2VkRGF0ZSkgPyBwYXJzZWREYXRlIDogbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgZGF0ZTonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gaXNWYWxpZEdyZWdvcmlhbih2YWx1ZSkgPyB2YWx1ZSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9ybWF0KGRhdGU6IERhdGUsIGZvcm1hdFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0R3JlZ29yaWFuKGRhdGUsIGZvcm1hdFN0cmluZyk7XG4gIH1cblxuICBhZGREYXlzKGRhdGU6IERhdGUsIGFtb3VudDogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIGFkZERheXNHcmVnb3JpYW4oZGF0ZSwgYW1vdW50KTtcbiAgfVxuXG4gIGFkZE1vbnRocyhkYXRlOiBEYXRlLCBhbW91bnQ6IG51bWJlcik6IERhdGUge1xuICAgIHJldHVybiBhZGRNb250aHNHcmVnb3JpYW4oZGF0ZSwgYW1vdW50KTtcbiAgfVxuXG4gIGFkZFllYXJzKGRhdGU6IERhdGUsIGFtb3VudDogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIGFkZFllYXJzR3JlZ29yaWFuKGRhdGUsIGFtb3VudCk7XG4gIH1cblxuICBhZGRIb3VycyhkYXRlOiBEYXRlLCBhbW91bnQ6IG51bWJlcik6IERhdGUge1xuICAgIHJldHVybiBhZGRIb3Vyc0dyZWdvcmlhbihkYXRlLCBhbW91bnQpO1xuICB9XG5cbiAgZ2V0WWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICB9XG5cbiAgZ2V0TW9udGgoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTtcbiAgfVxuXG4gIGdldERhdGUoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpO1xuICB9XG5cbiAgZ2V0RGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRlLmdldERheSgpO1xuICB9XG5cbiAgZ2V0TW9udGhOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZvcm1hdHMgPSB7XG4gICAgICBsb25nOiAnTU1NTScsXG4gICAgICBzaG9ydDogJ01NTScsXG4gICAgICBuYXJyb3c6ICdNTU1NTSdcbiAgICB9O1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMiB9LCAoXywgaSkgPT5cbiAgICAgIGZvcm1hdEdyZWdvcmlhbihuZXcgRGF0ZSgyMDAwLCBpLCAxKSwgZm9ybWF0c1tzdHlsZV0pXG4gICAgKTtcbiAgfVxuXG4gIGdldERhdGVOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDMxIH0sIChfLCBpKSA9PiAoaSArIDEpLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgZ2V0RGF5T2ZXZWVrTmFtZXMoc3R5bGU6ICdsb25nJyB8ICdzaG9ydCcgfCAnbmFycm93Jyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmb3JtYXRzID0ge1xuICAgICAgbG9uZzogJ0VFRUUnLFxuICAgICAgc2hvcnQ6ICdFRUUnLFxuICAgICAgbmFycm93OiAnRUVFRUUnXG4gICAgfTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogNyB9LCAoXywgaSkgPT5cbiAgICAgIGZvcm1hdEdyZWdvcmlhbihhZGREYXlzR3JlZ29yaWFuKHN0YXJ0T2ZXZWVrR3JlZ29yaWFuKG5ldyBEYXRlKCkpLCBpKSwgZm9ybWF0c1tzdHlsZV0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEZpcnN0RGF5T2ZXZWVrKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDA7IC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGluIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXJcbiAgfVxuXG4gIGdldE51bURheXNJbk1vbnRoKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSArIDEsIDApLmdldERhdGUoKTtcbiAgfVxuXG4gIGNsb25lKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICB9XG5cbiAgY3JlYXRlRGF0ZSh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRhdGU6IG51bWJlcik6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSk7XG4gIH1cblxuICBpc1NhbWVEYXkoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU2FtZURheUdyZWdvcmlhbihkYXRlMSwgZGF0ZTIpO1xuICB9XG5cbiAgaXNTYW1lTW9udGgoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU2FtZU1vbnRoR3JlZ29yaWFuKGRhdGUxLCBkYXRlMik7XG4gIH1cblxuICBpc1NhbWVZZWFyKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1NhbWVZZWFyR3JlZ29yaWFuKGRhdGUxLCBkYXRlMik7XG4gIH1cblxuICBpc0FmdGVyKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0FmdGVyR3JlZ29yaWFuKGRhdGUxLCBkYXRlMik7XG4gIH1cblxuICBpc0JlZm9yZShkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNCZWZvcmVHcmVnb3JpYW4oZGF0ZTEsIGRhdGUyKTtcbiAgfVxuXG4gIGlzRXF1YWwoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzRXF1YWwoZGF0ZTEsIGRhdGUyKTtcbiAgfVxuXG4gIHN0YXJ0T2ZNb250aChkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgcmV0dXJuIHN0YXJ0T2ZNb250aEdyZWdvcmlhbihkYXRlKTtcbiAgfVxuXG4gIGVuZE9mTW9udGgoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBlbmRPZk1vbnRoR3JlZ29yaWFuKGRhdGUpO1xuICB9XG5cbiAgc3RhcnRPZldlZWsoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBzdGFydE9mV2Vla0dyZWdvcmlhbihkYXRlLCB7IHdlZWtTdGFydHNPbjogdGhpcy5nZXRGaXJzdERheU9mV2VlaygpIGFzIDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfSk7XG4gIH1cblxuICBpc1ZhbGlkRm9ybWF0KGRhdGVTdHJpbmc6IHN0cmluZywgZm9ybWF0U3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHBhcnNlR3JlZ29yaWFuKGRhdGVTdHJpbmcsIGZvcm1hdFN0cmluZywgbmV3IERhdGUoKSk7XG4gICAgICBpZiAoIWlzVmFsaWRHcmVnb3JpYW4ocGFyc2VkRGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZvcm1hdHRlZCBwYXJzZWQgZGF0ZSBtYXRjaGVzIHRoZSBvcmlnaW5hbCBkYXRlIHN0cmluZ1xuICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IGZvcm1hdEdyZWdvcmlhbihwYXJzZWREYXRlLCBmb3JtYXRTdHJpbmcpO1xuICAgICAgcmV0dXJuIGZvcm1hdHRlZERhdGUgPT09IGRhdGVTdHJpbmc7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBtYXgoZGF0ZXM6IERhdGVbXSk6IERhdGUge1xuICAgIHJldHVybiBtYXhHcmVnb3JpYW4oZGF0ZXMpO1xuICB9XG5cbiAgc2V0WWVhcihkYXRlOiBEYXRlLCB5ZWFyOiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gc2V0WWVhckdyZWdvcmlhbihkYXRlLCB5ZWFyKTtcbiAgfVxuXG4gIHN0YXJ0T2ZEYXkoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBzdGFydE9mRGF5KGRhdGUpO1xuICB9XG5cbiAgZ2V0SG91cnMoZGF0ZTogRGF0ZSk6IG51bWJlcnxudWxsIHtcbiAgICByZXR1cm4gZGF0ZT8gZGF0ZS5nZXRIb3VycygpOiBudWxsO1xuICB9XG5cbiAgZ2V0TWludXRlcyhkYXRlOiBEYXRlKTogbnVtYmVyfG51bGwge1xuICAgIHJldHVybiBkYXRlPyBkYXRlLmdldE1pbnV0ZXMoKTogbnVsbDtcbiAgfVxuXG4gIGdldFNlY29uZHMoZGF0ZTogRGF0ZSk6IG51bWJlcnxudWxsIHtcbiAgICByZXR1cm4gZGF0ZT8gZGF0ZS5nZXRTZWNvbmRzKCk6IG51bGw7XG4gIH1cblxuICBzZXRIb3VycyhkYXRlOiBEYXRlLCBob3VyczogbnVtYmVyKTogRGF0ZSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuY2xvbmUoZGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXRIb3Vycyhob3Vycyk7XG4gICAgcmV0dXJuIG5ld0RhdGU7XG4gIH1cblxuICBzZXRNaW51dGVzKGRhdGU6IERhdGUsIG1pbnV0ZXM6IG51bWJlcik6IERhdGUge1xuICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmNsb25lKGRhdGUpO1xuICAgIG5ld0RhdGUuc2V0TWludXRlcyhtaW51dGVzKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfVxuXG4gIHNldFNlY29uZHMoZGF0ZTogRGF0ZSwgc2Vjb25kczogbnVtYmVyKTogRGF0ZSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuY2xvbmUoZGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXRTZWNvbmRzKHNlY29uZHMpO1xuICAgIHJldHVybiBuZXdEYXRlO1xuICB9XG5cbiAgZ2V0RGF5c0luTW9udGgoZGF0ZTogRGF0ZSkge1xuICAgIHJldHVybiBnZXREYXlzSW5Nb250aEdyZWdvcmlhbihkYXRlKTtcbiAgfVxuXG4gIGFkZE1pbnV0ZXMoZGF0ZTogRGF0ZSwgYW1vdW50OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYWRkTWludXRlcyhkYXRlLCBhbW91bnQpO1xuICB9XG59XG4iXX0=