UNPKG

systelab-components

Version:

systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.

144 lines 20.1 kB
import { Injectable } from '@angular/core'; import { addDays, addMonths, addWeeks, addYears, getDaysInMonth } from 'date-fns'; import * as i0 from "@angular/core"; export class DataTransformerService { processShortcuts(date, fromDateForRelative) { const regExp = new RegExp('^[\-]?[0-9]+[DWSMYA]$', 'i'); if (regExp.test(date)) { const shortcut = date.substr(-1) .toUpperCase(); const amount = Number(date.slice(0, -1)); const fromDate = fromDateForRelative ? fromDateForRelative : new Date(); switch (shortcut) { case 'D': return addDays(fromDate, amount); case 'W': case 'S': return addWeeks(fromDate, amount); case 'M': return addMonths(fromDate, amount); case 'Y': case 'A': return addYears(fromDate, amount); } } return undefined; } infereDate(date, dateFormat) { let dateTmp = date.trim(); const dayPosition = dateFormat.lastIndexOf('d'); const monthPosition = dateFormat.lastIndexOf('m'); const yearPosition = dateFormat.lastIndexOf('y'); const dayBefore = dayPosition < monthPosition; const yearBefore = yearPosition < dayPosition; let firstSeparatorPosition; let secondSeparatorPosition; const separator = this.getDateSeparator(dateFormat); if (separator) { // Get separator positions before removing them firstSeparatorPosition = dateTmp.indexOf(separator); secondSeparatorPosition = dateTmp.lastIndexOf(separator); dateTmp = this.removeSeparator(dateTmp, separator); // After removing the desired separator, no other separator is expected if (this.getDateSeparator(dateTmp)) { return undefined; } } const dayLength = this.getDayLength(dateTmp, dayBefore, yearBefore, firstSeparatorPosition, secondSeparatorPosition); const monthLength = [4, 6, 8].some(length => dateTmp.length === length) ? dayLength : 2 / dayLength; const yearLength = [7, 8].some(length => dateTmp.length === length) ? 4 : 2; if (dayLength && monthLength && yearLength) { return this.getFormattedDate(dateTmp, dayBefore, yearBefore, dayLength, monthLength, yearLength); } return undefined; } getDayLength(date, dayBefore, yearBefore, firstSeparatorPosition, secondSeparatorPosition) { switch (date.length) { case 4: return 1; case 6: case 8: return 2; case 5: case 7: if (firstSeparatorPosition > 0 && secondSeparatorPosition !== firstSeparatorPosition) { let dayLength; if (secondSeparatorPosition - firstSeparatorPosition === 2) { dayLength = 1; } else { dayLength = 2; } if (!dayBefore) { dayLength = 2 / dayLength; } if (!yearBefore) { dayLength = 2 / dayLength; } return dayLength; } } } getFormattedDate(dateTmp, dayBefore, yearBefore, dayLength, monthLength, yearLength) { let dayInDate; let monthInDate; let yearInDate; if (yearBefore) { yearInDate = +dateTmp.substring(0, yearLength); if (dayBefore) { dayInDate = +dateTmp.substring(yearLength, yearLength + dayLength); monthInDate = +dateTmp.substring(yearLength + dayLength) - 1; } else { monthInDate = +dateTmp.substring(yearLength, yearLength + monthLength) - 1; dayInDate = +dateTmp.substring(yearLength + monthLength); } } else { if (dayBefore) { dayInDate = +dateTmp.substring(0, dayLength); monthInDate = +dateTmp.substring(dayLength, dayLength + monthLength) - 1; } else { monthInDate = +dateTmp.substring(0, monthLength) - 1; dayInDate = +dateTmp.substring(monthLength, monthLength + dayLength); } yearInDate = +dateTmp.substring(monthLength + dayLength); } if (yearInDate < 100) { yearInDate = 2000 + yearInDate; } return (this.checkMonthNumber(monthInDate) && this.checkDayNumber(yearInDate, monthInDate, dayInDate)) ? new Date(yearInDate, monthInDate, dayInDate) : null; } checkMonthNumber(monthInDate) { return (monthInDate >= 0 && monthInDate <= 11); // Months go from 0 to 11 } checkDayNumber(yearInDate, monthInDate, dayInDate) { return (dayInDate >= 1 && dayInDate <= getDaysInMonth(new Date(yearInDate, monthInDate))); } getDateSeparator(dateFormat) { let dateSeparator; if (dateFormat.includes('/')) { dateSeparator = '/'; } else if (dateFormat.includes('-')) { dateSeparator = '-'; } else if (dateFormat.includes('.')) { dateSeparator = '.'; } return dateSeparator; } removeSeparator(dateTmp, dateSeparator) { return dateTmp.split(dateSeparator) .join(''); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DataTransformerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DataTransformerService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DataTransformerService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10cmFuc2Zvcm1lci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZS10cmFuc2Zvcm1lci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBR2xGLE1BQU0sT0FBTyxzQkFBc0I7SUFFM0IsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLG1CQUF5QjtRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUIsV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekUsUUFBUSxRQUFRLEVBQUU7Z0JBQ2pCLEtBQUssR0FBRztvQkFDUCxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLEtBQUssR0FBRyxDQUFDO2dCQUNULEtBQUssR0FBRztvQkFDUCxPQUFPLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7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Q0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUMxQyxJQUFJLGFBQXFCLENBQUM7UUFDMUIsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLGFBQWEsR0FBRyxHQUFHLENBQUM7U0FDcEI7YUFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEMsYUFBYSxHQUFHLEdBQUcsQ0FBQztTQUNwQjthQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdEIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUFlLEVBQUUsYUFBcUI7UUFDN0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQzthQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDWixDQUFDOzhHQWpKVyxzQkFBc0I7a0hBQXRCLHNCQUFzQjs7MkZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGFkZERheXMsIGFkZE1vbnRocywgYWRkV2Vla3MsIGFkZFllYXJzLCBnZXREYXlzSW5Nb250aCB9IGZyb20gJ2RhdGUtZm5zJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERhdGFUcmFuc2Zvcm1lclNlcnZpY2Uge1xuXG5cdHB1YmxpYyBwcm9jZXNzU2hvcnRjdXRzKGRhdGU6IHN0cmluZywgZnJvbURhdGVGb3JSZWxhdGl2ZTogRGF0ZSk6IERhdGUge1xuXHRcdGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAoJ15bXFwtXT9bMC05XStbRFdTTVlBXSQnLCAnaScpO1xuXHRcdGlmIChyZWdFeHAudGVzdChkYXRlKSkge1xuXHRcdFx0Y29uc3Qgc2hvcnRjdXQgPSBkYXRlLnN1YnN0cigtMSlcblx0XHRcdFx0LnRvVXBwZXJDYXNlKCk7XG5cdFx0XHRjb25zdCBhbW91bnQgPSBOdW1iZXIoZGF0ZS5zbGljZSgwLCAtMSkpO1xuXHRcdFx0Y29uc3QgZnJvbURhdGUgPSBmcm9tRGF0ZUZvclJlbGF0aXZlID8gIGZyb21EYXRlRm9yUmVsYXRpdmUgOiBuZXcgRGF0ZSgpO1xuXHRcdFx0c3dpdGNoIChzaG9ydGN1dCkge1xuXHRcdFx0XHRjYXNlICdEJzpcblx0XHRcdFx0XHRyZXR1cm4gYWRkRGF5cyhmcm9tRGF0ZSwgYW1vdW50KTtcblx0XHRcdFx0Y2FzZSAnVyc6XG5cdFx0XHRcdGNhc2UgJ1MnOlxuXHRcdFx0XHRcdHJldHVybiBhZGRXZWVrcyhmcm9tRGF0ZSwgYW1vdW50KTtcblx0XHRcdFx0Y2FzZSAnTSc6XG5cdFx0XHRcdFx0cmV0dXJuIGFkZE1vbnRocyhmcm9tRGF0ZSwgYW1vdW50KTtcblx0XHRcdFx0Y2FzZSAnWSc6XG5cdFx0XHRcdGNhc2UgJ0EnOlxuXHRcdFx0XHRcdHJldHVybiBhZGRZZWFycyhmcm9tRGF0ZSwgYW1vdW50KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpbmZlcmVEYXRlKGRhdGU6IHN0cmluZywgZGF0ZUZvcm1hdDogc3RyaW5nKTogRGF0ZSB7XG5cdFx0bGV0IGRhdGVUbXAgPSBkYXRlLnRyaW0oKTtcblxuXHRcdGNvbnN0IGRheVBvc2l0aW9uID0gZGF0ZUZvcm1hdC5sYXN0SW5kZXhPZignZCcpO1xuXHRcdGNvbnN0IG1vbnRoUG9zaXRpb24gPSBkYXRlRm9ybWF0Lmxhc3RJbmRleE9mKCdtJyk7XG5cdFx0Y29uc3QgeWVhclBvc2l0aW9uID0gZGF0ZUZvcm1hdC5sYXN0SW5kZXhPZigneScpO1xuXG5cdFx0Y29uc3QgZGF5QmVmb3JlID0gZGF5UG9zaXRpb24gPCBtb250aFBvc2l0aW9uO1xuXHRcdGNvbnN0IHllYXJCZWZvcmUgPSB5ZWFyUG9zaXRpb24gPCBkYXlQb3NpdGlvbjtcblxuXHRcdGxldCBmaXJzdFNlcGFyYXRvclBvc2l0aW9uOiBudW1iZXI7XG5cdFx0bGV0IHNlY29uZFNlcGFyYXRvclBvc2l0aW9uOiBudW1iZXI7XG5cblx0XHRjb25zdCBzZXBhcmF0b3IgPSB0aGlzLmdldERhdGVTZXBhcmF0b3IoZGF0ZUZvcm1hdCk7XG5cdFx0aWYgKHNlcGFyYXRvcikge1xuXHRcdFx0Ly8gR2V0IHNlcGFyYXRvciBwb3NpdGlvbnMgYmVmb3JlIHJlbW92aW5nIHRoZW1cblx0XHRcdGZpcnN0U2VwYXJhdG9yUG9zaXRpb24gPSBkYXRlVG1wLmluZGV4T2Yoc2VwYXJhdG9yKTtcblx0XHRcdHNlY29uZFNlcGFyYXRvclBvc2l0aW9uID0gZGF0ZVRtcC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuXG5cdFx0XHRkYXRlVG1wID0gdGhpcy5yZW1vdmVTZXBhcmF0b3IoZGF0ZVRtcCwgc2VwYXJhdG9yKTtcblx0XHRcdC8vIEFmdGVyIHJlbW92aW5nIHRoZSBkZXNpcmVkIHNlcGFyYXRvciwgbm8gb3RoZXIgc2VwYXJhdG9yIGlzIGV4cGVjdGVkXG5cdFx0XHRpZiAodGhpcy5nZXREYXRlU2VwYXJhdG9yKGRhdGVUbXApKSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGF5TGVuZ3RoID0gdGhpcy5nZXREYXlMZW5ndGgoZGF0ZVRtcCwgZGF5QmVmb3JlLCB5ZWFyQmVmb3JlLCBmaXJzdFNlcGFyYXRvclBvc2l0aW9uLCBzZWNvbmRTZXBhcmF0b3JQb3NpdGlvbik7XG5cdFx0Y29uc3QgbW9udGhMZW5ndGggPSBbNCwgNiwgOF0uc29tZShsZW5ndGggPT4gZGF0ZVRtcC5sZW5ndGggPT09IGxlbmd0aCkgPyBkYXlMZW5ndGggOiAyIC8gZGF5TGVuZ3RoO1xuXHRcdGNvbnN0IHllYXJMZW5ndGggPSBbNywgOF0uc29tZShsZW5ndGggPT4gZGF0ZVRtcC5sZW5ndGggPT09IGxlbmd0aCkgPyA0IDogMjtcblxuXHRcdGlmIChkYXlMZW5ndGggJiYgbW9udGhMZW5ndGggJiYgeWVhckxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0Rm9ybWF0dGVkRGF0ZShkYXRlVG1wLCBkYXlCZWZvcmUsIHllYXJCZWZvcmUsIGRheUxlbmd0aCwgbW9udGhMZW5ndGgsIHllYXJMZW5ndGgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwcml2YXRlIGdldERheUxlbmd0aChkYXRlOiBzdHJpbmcsIGRheUJlZm9yZTogYm9vbGVhbiwgeWVhckJlZm9yZTogYm9vbGVhbiwgZmlyc3RTZXBhcmF0b3JQb3NpdGlvbjogbnVtYmVyLCBzZWNvbmRTZXBhcmF0b3JQb3NpdGlvbjogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRzd2l0Y2ggKGRhdGUubGVuZ3RoKSB7XG5cdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0Y2FzZSA2OlxuXHRcdFx0Y2FzZSA4OlxuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdGNhc2UgNTpcblx0XHRcdGNhc2UgNzpcblx0XHRcdFx0aWYgKGZpcnN0U2VwYXJhdG9yUG9zaXRpb24gPiAwICYmIHNlY29uZFNlcGFyYXRvclBvc2l0aW9uICE9PSBmaXJzdFNlcGFyYXRvclBvc2l0aW9uKSB7XG5cdFx0XHRcdFx0bGV0IGRheUxlbmd0aDogbnVtYmVyO1xuXHRcdFx0XHRcdGlmIChzZWNvbmRTZXBhcmF0b3JQb3NpdGlvbiAtIGZpcnN0U2VwYXJhdG9yUG9zaXRpb24gPT09IDIpIHtcblx0XHRcdFx0XHRcdGRheUxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRheUxlbmd0aCA9IDI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghZGF5QmVmb3JlKSB7XG5cdFx0XHRcdFx0XHRkYXlMZW5ndGggPSAyIC8gZGF5TGVuZ3RoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXllYXJCZWZvcmUpIHtcblx0XHRcdFx0XHRcdGRheUxlbmd0aCA9IDIgLyBkYXlMZW5ndGg7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGRheUxlbmd0aDtcblx0XHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0Rm9ybWF0dGVkRGF0ZShkYXRlVG1wOiBzdHJpbmcsIGRheUJlZm9yZTogYm9vbGVhbiwgeWVhckJlZm9yZTogYm9vbGVhbiwgZGF5TGVuZ3RoOiBudW1iZXIsIG1vbnRoTGVuZ3RoOiBudW1iZXIsIHllYXJMZW5ndGgpOiBEYXRlIHtcblx0XHRsZXQgZGF5SW5EYXRlOiBudW1iZXI7XG5cdFx0bGV0IG1vbnRoSW5EYXRlOiBudW1iZXI7XG5cdFx0bGV0IHllYXJJbkRhdGU6IG51bWJlcjtcblx0XHRpZiAoeWVhckJlZm9yZSkge1xuXHRcdFx0eWVhckluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZygwLCB5ZWFyTGVuZ3RoKTtcblx0XHRcdGlmIChkYXlCZWZvcmUpIHtcblx0XHRcdFx0ZGF5SW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKHllYXJMZW5ndGgsIHllYXJMZW5ndGggKyBkYXlMZW5ndGgpO1xuXHRcdFx0XHRtb250aEluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZyh5ZWFyTGVuZ3RoICsgZGF5TGVuZ3RoKSAtIDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb250aEluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZyh5ZWFyTGVuZ3RoLCB5ZWFyTGVuZ3RoICsgbW9udGhMZW5ndGgpIC0gMTtcblx0XHRcdFx0ZGF5SW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKHllYXJMZW5ndGggKyBtb250aExlbmd0aCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChkYXlCZWZvcmUpIHtcblx0XHRcdFx0ZGF5SW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKDAsIGRheUxlbmd0aCk7XG5cdFx0XHRcdG1vbnRoSW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKGRheUxlbmd0aCwgZGF5TGVuZ3RoICsgbW9udGhMZW5ndGgpIC0gMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1vbnRoSW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKDAsIG1vbnRoTGVuZ3RoKSAtIDE7XG5cdFx0XHRcdGRheUluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZyhtb250aExlbmd0aCwgbW9udGhMZW5ndGggKyBkYXlMZW5ndGgpO1xuXHRcdFx0fVxuXHRcdFx0eWVhckluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZyhtb250aExlbmd0aCArIGRheUxlbmd0aCk7XG5cdFx0fVxuXG5cdFx0aWYgKHllYXJJbkRhdGUgPCAxMDApIHtcblx0XHRcdHllYXJJbkRhdGUgPSAyMDAwICsgeWVhckluRGF0ZTtcblx0XHR9XG5cdFx0cmV0dXJuICh0aGlzLmNoZWNrTW9udGhOdW1iZXIobW9udGhJbkRhdGUpICYmIHRoaXMuY2hlY2tEYXlOdW1iZXIoeWVhckluRGF0ZSxtb250aEluRGF0ZSxkYXlJbkRhdGUpKVxuXHRcdFx0PyBuZXcgRGF0ZSh5ZWFySW5EYXRlLCBtb250aEluRGF0ZSwgZGF5SW5EYXRlKVxuXHRcdFx0OiBudWxsO1xuXHR9XG5cblx0cHJpdmF0ZSBjaGVja01vbnRoTnVtYmVyKG1vbnRoSW5EYXRlOiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKG1vbnRoSW5EYXRlID49IDAgJiYgbW9udGhJbkRhdGUgPD0gMTEpOyAvLyBNb250aHMgZ28gZnJvbSAwIHRvIDExXG5cdH1cblxuXHRwcml2YXRlIGNoZWNrRGF5TnVtYmVyKHllYXJJbkRhdGU6IG51bWJlciwgbW9udGhJbkRhdGU6IG51bWJlciwgZGF5SW5EYXRlOiBudW1iZXIpOiBib29sZWFue1xuXHRcdHJldHVybiAoZGF5SW5EYXRlID49IDEgJiYgZGF5SW5EYXRlIDw9IGdldERheXNJbk1vbnRoKG5ldyBEYXRlKHllYXJJbkRhdGUsIG1vbnRoSW5EYXRlKSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXREYXRlU2VwYXJhdG9yKGRhdGVGb3JtYXQ6IHN0cmluZykge1xuXHRcdGxldCBkYXRlU2VwYXJhdG9yOiBzdHJpbmc7XG5cdFx0aWYgKGRhdGVGb3JtYXQuaW5jbHVkZXMoJy8nKSkge1xuXHRcdFx0ZGF0ZVNlcGFyYXRvciA9ICcvJztcblx0XHR9IGVsc2UgaWYgKGRhdGVGb3JtYXQuaW5jbHVkZXMoJy0nKSkge1xuXHRcdFx0ZGF0ZVNlcGFyYXRvciA9ICctJztcblx0XHR9IGVsc2UgaWYgKGRhdGVGb3JtYXQuaW5jbHVkZXMoJy4nKSkge1xuXHRcdFx0ZGF0ZVNlcGFyYXRvciA9ICcuJztcblx0XHR9XG5cdFx0cmV0dXJuIGRhdGVTZXBhcmF0b3I7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVNlcGFyYXRvcihkYXRlVG1wOiBzdHJpbmcsIGRhdGVTZXBhcmF0b3I6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGRhdGVUbXAuc3BsaXQoZGF0ZVNlcGFyYXRvcilcblx0XHRcdC5qb2luKCcnKTtcblx0fVxufVxuIl19