UNPKG

angular-l10n

Version:

Angular library to translate texts, dates and numbers

167 lines 25.3 kB
import { l10nError } from './l10n-error'; export function validateLanguage(language) { const regExp = new RegExp(/^([a-z]{2,3})(\-[A-Z][a-z]{3})?(\-[A-Z]{2})?(-u.+)?$/); return regExp.test(language); } export function formatLanguage(language, format) { if (language == null || language === '') return ''; if (!validateLanguage(language)) throw l10nError(formatLanguage, 'Invalid language'); const [, LANGUAGE = '', SCRIPT = '', REGION = ''] = language.match(/^([a-z]{2,3})(\-[A-Z][a-z]{3})?(\-[A-Z]{2})?/) || []; switch (format) { case 'language': return LANGUAGE; case 'language-script': return LANGUAGE + SCRIPT; case 'language-region': return LANGUAGE + REGION; case 'language-script-region': return LANGUAGE + SCRIPT + REGION; } } export function parseLanguage(language) { const groups = language.match(/^([a-z]{2,3})(\-([A-Z][a-z]{3}))?(\-([A-Z]{2}))?(-u.+)?$/); if (groups == null) throw l10nError(parseLanguage, 'Invalid language'); return { language: groups[1], script: groups[3], region: groups[5], extension: groups[6] }; } export function getBrowserLanguage(format) { let browserLanguage = null; if (typeof navigator !== 'undefined' && navigator.language) { switch (format) { case 'language-region': case 'language-script-region': browserLanguage = navigator.language; break; default: browserLanguage = navigator.language.split('-')[0]; } } return browserLanguage; } export function getSchema(schema, language, format) { const element = schema.find(item => formatLanguage(item.locale.language, format) === language); return element; } export function getValue(key, data, keySeparator) { if (data) { if (keySeparator) { return key.split(keySeparator).reduce((acc, cur) => (acc && acc[cur]) != null ? acc[cur] : null, data); } return data[key] != null ? data[key] : null; } return null; } export function handleParams(value, params) { const replacedValue = value.replace(/{{\s?([^{}\s]*)\s?}}/g, (substring, parsedKey) => { const replacer = params[parsedKey]; return replacer !== undefined ? replacer : substring; }); return replacedValue; } export function mergeDeep(target, source) { const output = Object.assign({}, target); if (isObject(target) && isObject(source)) { Object.keys(source).forEach((key) => { if (isObject(source[key])) { if (!(key in target)) { Object.assign(output, { [key]: source[key] }); } else { output[key] = mergeDeep(target[key], source[key]); } } else { Object.assign(output, { [key]: source[key] }); } }); } return output; } export function toNumber(value) { const parsedValue = typeof value === 'string' && !isNaN(+value - parseFloat(value)) ? +value : value; return parsedValue; } export function toDate(value) { if (isDate(value)) { return value; } if (typeof value === 'number' && !isNaN(value)) { return new Date(value); } if (typeof value === 'string') { value = value.trim(); if (!isNaN(value - parseFloat(value))) { return new Date(parseFloat(value)); } if (/^(\d{4}-\d{1,2}-\d{1,2})$/.test(value)) { const [y, m, d] = value.split('-').map((val) => +val); return new Date(y, m - 1, d); } const match = value.match(/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/); if (match) { return isoStringToDate(match); } } const date = new Date(value); if (!isDate(date)) { throw l10nError(toDate, 'Invalid date'); } return date; } export const PARSE_DATE_STYLE = { full: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }, long: { year: 'numeric', month: 'long', day: 'numeric' }, medium: { year: 'numeric', month: 'short', day: 'numeric' }, short: { year: '2-digit', month: 'numeric', day: 'numeric' } }; export const PARSE_TIME_STYLE = { full: { hour: 'numeric', minute: 'numeric', second: 'numeric', timeZoneName: 'long' }, long: { hour: 'numeric', minute: 'numeric', second: 'numeric', timeZoneName: 'short' }, medium: { hour: 'numeric', minute: 'numeric', second: 'numeric' }, short: { hour: 'numeric', minute: 'numeric' } }; export function parseDigits(digits) { const groups = digits.match(/^(\d+)?\.((\d+)(\-(\d+))?)?$/); if (groups == null) throw l10nError(parseDigits, 'Invalid digits'); return { minimumIntegerDigits: groups[1] ? parseInt(groups[1]) : undefined, minimumFractionDigits: groups[3] ? parseInt(groups[3]) : undefined, maximumFractionDigits: groups[5] ? parseInt(groups[5]) : undefined, }; } function isObject(item) { return typeof item === 'object' && !Array.isArray(item); } function isDate(value) { return value instanceof Date && !isNaN(value.valueOf()); } /** * Converts a date in ISO 8601 to a Date. */ function isoStringToDate(match) { const date = new Date(0); let tzHour = 0; let tzMin = 0; const dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear; const timeSetter = match[8] ? date.setUTCHours : date.setHours; if (match[9]) { tzHour = Number(match[9] + match[10]); tzMin = Number(match[9] + match[11]); } dateSetter.call(date, Number(match[1]), Number(match[2]) - 1, Number(match[3])); const h = Number(match[4] || 0) - tzHour; const m = Number(match[5] || 0) - tzMin; const s = Number(match[6] || 0); const ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); timeSetter.call(date, h, m, s, ms); return date; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWwxMG4vc3JjL2xpYi9tb2RlbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV6QyxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUNsRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBZ0IsRUFBRSxNQUFrQjtJQUMvRCxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksUUFBUSxLQUFLLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNuRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQUUsTUFBTSxTQUFTLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFckYsTUFBTSxDQUFDLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pILFFBQVEsTUFBTSxFQUFFO1FBQ1osS0FBSyxVQUFVO1lBQ1gsT0FBTyxRQUFRLENBQUM7UUFDcEIsS0FBSyxpQkFBaUI7WUFDbEIsT0FBTyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQzdCLEtBQUssaUJBQWlCO1lBQ2xCLE9BQU8sUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUM3QixLQUFLLHdCQUF3QjtZQUN6QixPQUFPLFFBQVEsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0tBQ3pDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsUUFBZ0I7SUFDMUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0lBQzFGLElBQUksTUFBTSxJQUFJLElBQUk7UUFBRSxNQUFNLFNBQVMsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUV2RSxPQUFPO1FBQ0gsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDdkIsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBa0I7SUFDakQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzNCLElBQUksT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUU7UUFDeEQsUUFBUSxNQUFNLEVBQUU7WUFDWixLQUFLLGlCQUFpQixDQUFDO1lBQ3ZCLEtBQUssd0JBQXdCO2dCQUN6QixlQUFlLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztnQkFDckMsTUFBTTtZQUNWO2dCQUNJLGVBQWUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxRDtLQUNKO0lBQ0QsT0FBTyxlQUFlLENBQUM7QUFDM0IsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBb0IsRUFBRSxRQUFnQixFQUFFLE1BQWtCO0lBQ2hGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDL0YsT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBVyxFQUFFLElBQTRCLEVBQUUsWUFBb0I7SUFDcEYsSUFBSSxJQUFJLEVBQUU7UUFDTixJQUFJLFlBQVksRUFBRTtZQUNkLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFHO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUMvQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWEsRUFBRSxNQUFXO0lBQ25ELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxTQUFpQixFQUFFLFNBQWlCLEVBQUUsRUFBRTtRQUNsRyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsT0FBTyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sYUFBYSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQThCLEVBQUUsTUFBOEI7SUFDcEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFekMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDaEMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsRUFBRTtvQkFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2pEO3FCQUFNO29CQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUNyRDthQUNKO2lCQUFNO2dCQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2pEO1FBQ0wsQ0FBQyxDQUFDLENBQUM7S0FDTjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQVU7SUFDL0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JHLE9BQU8sV0FBVyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQVU7SUFDN0IsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDZixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzVDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDMUI7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUMzQixLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLDJCQUEyQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5RCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxzR0FBc0csQ0FBQyxDQUFDO1FBQ2xJLElBQUksS0FBSyxFQUFFO1lBQ1AsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDakM7S0FDSjtJQUVELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQVksQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDZixNQUFNLFNBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7S0FDM0M7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQThCO0lBQ3ZELElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7SUFDekUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7SUFDeEQsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7SUFDM0QsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7Q0FDL0QsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE4QjtJQUN2RCxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFO0lBQ3JGLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7SUFDdEYsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDakUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0NBQ2hELENBQUM7QUFFRixNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQWM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQzVELElBQUksTUFBTSxJQUFJLElBQUk7UUFBRSxNQUFNLFNBQVMsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUVuRSxPQUFPO1FBQ0gsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbEUscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDckUsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFTO0lBQ3ZCLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBVTtJQUN0QixPQUFPLEtBQUssWUFBWSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBdUI7SUFDNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3JFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUMvRCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNWLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3hDO0lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEYsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDekMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDeEMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNqRSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuQyxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTDEwbkZvcm1hdCwgTDEwblNjaGVtYSB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBsMTBuRXJyb3IgfSBmcm9tICcuL2wxMG4tZXJyb3InO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cCgvXihbYS16XXsyLDN9KShcXC1bQS1aXVthLXpdezN9KT8oXFwtW0EtWl17Mn0pPygtdS4rKT8kLyk7XHJcbiAgICByZXR1cm4gcmVnRXhwLnRlc3QobGFuZ3VhZ2UpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZywgZm9ybWF0OiBMMTBuRm9ybWF0KTogc3RyaW5nIHtcclxuICAgIGlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGxhbmd1YWdlID09PSAnJykgcmV0dXJuICcnO1xyXG4gICAgaWYgKCF2YWxpZGF0ZUxhbmd1YWdlKGxhbmd1YWdlKSkgdGhyb3cgbDEwbkVycm9yKGZvcm1hdExhbmd1YWdlLCAnSW52YWxpZCBsYW5ndWFnZScpO1xyXG5cclxuICAgIGNvbnN0IFssIExBTkdVQUdFID0gJycsIFNDUklQVCA9ICcnLCBSRUdJT04gPSAnJ10gPSBsYW5ndWFnZS5tYXRjaCgvXihbYS16XXsyLDN9KShcXC1bQS1aXVthLXpdezN9KT8oXFwtW0EtWl17Mn0pPy8pIHx8IFtdO1xyXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcclxuICAgICAgICBjYXNlICdsYW5ndWFnZSc6XHJcbiAgICAgICAgICAgIHJldHVybiBMQU5HVUFHRTtcclxuICAgICAgICBjYXNlICdsYW5ndWFnZS1zY3JpcHQnOlxyXG4gICAgICAgICAgICByZXR1cm4gTEFOR1VBR0UgKyBTQ1JJUFQ7XHJcbiAgICAgICAgY2FzZSAnbGFuZ3VhZ2UtcmVnaW9uJzpcclxuICAgICAgICAgICAgcmV0dXJuIExBTkdVQUdFICsgUkVHSU9OO1xyXG4gICAgICAgIGNhc2UgJ2xhbmd1YWdlLXNjcmlwdC1yZWdpb24nOlxyXG4gICAgICAgICAgICByZXR1cm4gTEFOR1VBR0UgKyBTQ1JJUFQgKyBSRUdJT047XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxhbmd1YWdlKGxhbmd1YWdlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyb3VwcyA9IGxhbmd1YWdlLm1hdGNoKC9eKFthLXpdezIsM30pKFxcLShbQS1aXVthLXpdezN9KSk/KFxcLShbQS1aXXsyfSkpPygtdS4rKT8kLyk7XHJcbiAgICBpZiAoZ3JvdXBzID09IG51bGwpIHRocm93IGwxMG5FcnJvcihwYXJzZUxhbmd1YWdlLCAnSW52YWxpZCBsYW5ndWFnZScpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbGFuZ3VhZ2U6IGdyb3Vwc1sxXSxcclxuICAgICAgICBzY3JpcHQ6IGdyb3Vwc1szXSxcclxuICAgICAgICByZWdpb246IGdyb3Vwc1s1XSxcclxuICAgICAgICBleHRlbnNpb246IGdyb3Vwc1s2XVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJMYW5ndWFnZShmb3JtYXQ6IEwxMG5Gb3JtYXQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGxldCBicm93c2VyTGFuZ3VhZ2UgPSBudWxsO1xyXG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5sYW5ndWFnZSkge1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2xhbmd1YWdlLXJlZ2lvbic6XHJcbiAgICAgICAgICAgIGNhc2UgJ2xhbmd1YWdlLXNjcmlwdC1yZWdpb24nOlxyXG4gICAgICAgICAgICAgICAgYnJvd3Nlckxhbmd1YWdlID0gbmF2aWdhdG9yLmxhbmd1YWdlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicm93c2VyTGFuZ3VhZ2UgPSBuYXZpZ2F0b3IubGFuZ3VhZ2Uuc3BsaXQoJy0nKVswXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnJvd3Nlckxhbmd1YWdlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hKHNjaGVtYTogTDEwblNjaGVtYVtdLCBsYW5ndWFnZTogc3RyaW5nLCBmb3JtYXQ6IEwxMG5Gb3JtYXQpOiBMMTBuU2NoZW1hIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSBzY2hlbWEuZmluZChpdGVtID0+IGZvcm1hdExhbmd1YWdlKGl0ZW0ubG9jYWxlLmxhbmd1YWdlLCBmb3JtYXQpID09PSBsYW5ndWFnZSk7XHJcbiAgICByZXR1cm4gZWxlbWVudDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlKGtleTogc3RyaW5nLCBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBrZXlTZXBhcmF0b3I6IHN0cmluZyk6IHN0cmluZyB8IGFueSB8IG51bGwge1xyXG4gICAgaWYgKGRhdGEpIHtcclxuICAgICAgICBpZiAoa2V5U2VwYXJhdG9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXkuc3BsaXQoa2V5U2VwYXJhdG9yKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjICYmIGFjY1tjdXJdKSAhPSBudWxsID8gYWNjW2N1cl0gOiBudWxsLCBkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRhdGFba2V5XSAhPSBudWxsID8gZGF0YVtrZXldIDogbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUGFyYW1zKHZhbHVlOiBzdHJpbmcsIHBhcmFtczogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlcGxhY2VkVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC97e1xccz8oW157fVxcc10qKVxccz99fS9nLCAoc3Vic3RyaW5nOiBzdHJpbmcsIHBhcnNlZEtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVwbGFjZXIgPSBwYXJhbXNbcGFyc2VkS2V5XTtcclxuICAgICAgICByZXR1cm4gcmVwbGFjZXIgIT09IHVuZGVmaW5lZCA/IHJlcGxhY2VyIDogc3Vic3RyaW5nO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVwbGFjZWRWYWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcCh0YXJnZXQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIHNvdXJjZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IGFueSB7XHJcbiAgICBjb25zdCBvdXRwdXQgPSBPYmplY3QuYXNzaWduKHt9LCB0YXJnZXQpO1xyXG5cclxuICAgIGlmIChpc09iamVjdCh0YXJnZXQpICYmIGlzT2JqZWN0KHNvdXJjZSkpIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gdGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBtZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogYW55KTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oK3ZhbHVlIC0gcGFyc2VGbG9hdCh2YWx1ZSkpID8gK3ZhbHVlIDogdmFsdWU7XHJcbiAgICByZXR1cm4gcGFyc2VkVmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGUodmFsdWU6IGFueSk6IERhdGUge1xyXG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xyXG4gICAgICAgIGlmICghaXNOYU4odmFsdWUgLSBwYXJzZUZsb2F0KHZhbHVlKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHBhcnNlRmxvYXQodmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKC9eKFxcZHs0fS1cXGR7MSwyfS1cXGR7MSwyfSkkLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICBjb25zdCBbeSwgbSwgZF0gPSB2YWx1ZS5zcGxpdCgnLScpLm1hcCgodmFsOiBzdHJpbmcpID0+ICt2YWwpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSwgbSAtIDEsIGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKC9eKFxcZHs0fSktPyhcXGRcXGQpLT8oXFxkXFxkKSg/OlQoXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86XFwuKFxcZCspKT8pPyk/KFp8KFsrLV0pKFxcZFxcZCk6PyhcXGRcXGQpKT8pPyQvKTtcclxuICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlzb1N0cmluZ1RvRGF0ZShtYXRjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBhbnkpO1xyXG4gICAgaWYgKCFpc0RhdGUoZGF0ZSkpIHtcclxuICAgICAgICB0aHJvdyBsMTBuRXJyb3IodG9EYXRlLCAnSW52YWxpZCBkYXRlJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFBBUlNFX0RBVEVfU1RZTEU6IHsgW2Zvcm1hdDogc3RyaW5nXTogYW55IH0gPSB7XHJcbiAgICBmdWxsOiB7IHdlZWtkYXk6ICdsb25nJywgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9LFxyXG4gICAgbG9uZzogeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH0sXHJcbiAgICBtZWRpdW06IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycgfSxcclxuICAgIHNob3J0OiB7IHllYXI6ICcyLWRpZ2l0JywgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IFBBUlNFX1RJTUVfU1RZTEU6IHsgW2Zvcm1hdDogc3RyaW5nXTogYW55IH0gPSB7XHJcbiAgICBmdWxsOiB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnbnVtZXJpYycsIHNlY29uZDogJ251bWVyaWMnLCB0aW1lWm9uZU5hbWU6ICdsb25nJyB9LFxyXG4gICAgbG9uZzogeyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJ251bWVyaWMnLCBzZWNvbmQ6ICdudW1lcmljJywgdGltZVpvbmVOYW1lOiAnc2hvcnQnIH0sXHJcbiAgICBtZWRpdW06IHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICdudW1lcmljJywgc2Vjb25kOiAnbnVtZXJpYycgfSxcclxuICAgIHNob3J0OiB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnbnVtZXJpYycgfVxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGlnaXRzKGRpZ2l0czogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBncm91cHMgPSBkaWdpdHMubWF0Y2goL14oXFxkKyk/XFwuKChcXGQrKShcXC0oXFxkKykpPyk/JC8pO1xyXG4gICAgaWYgKGdyb3VwcyA9PSBudWxsKSB0aHJvdyBsMTBuRXJyb3IocGFyc2VEaWdpdHMsICdJbnZhbGlkIGRpZ2l0cycpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbWluaW11bUludGVnZXJEaWdpdHM6IGdyb3Vwc1sxXSA/IHBhcnNlSW50KGdyb3Vwc1sxXSkgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBncm91cHNbM10gPyBwYXJzZUludChncm91cHNbM10pIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZ3JvdXBzWzVdID8gcGFyc2VJbnQoZ3JvdXBzWzVdKSA6IHVuZGVmaW5lZCxcclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzT2JqZWN0KGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpdGVtKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNEYXRlKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBEYXRlIHtcclxuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLnZhbHVlT2YoKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhIGRhdGUgaW4gSVNPIDg2MDEgdG8gYSBEYXRlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNvU3RyaW5nVG9EYXRlKG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5KTogRGF0ZSB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XHJcbiAgICBsZXQgdHpIb3VyID0gMDtcclxuICAgIGxldCB0ek1pbiA9IDA7XHJcbiAgICBjb25zdCBkYXRlU2V0dGVyID0gbWF0Y2hbOF0gPyBkYXRlLnNldFVUQ0Z1bGxZZWFyIDogZGF0ZS5zZXRGdWxsWWVhcjtcclxuICAgIGNvbnN0IHRpbWVTZXR0ZXIgPSBtYXRjaFs4XSA/IGRhdGUuc2V0VVRDSG91cnMgOiBkYXRlLnNldEhvdXJzO1xyXG4gICAgaWYgKG1hdGNoWzldKSB7XHJcbiAgICAgICAgdHpIb3VyID0gTnVtYmVyKG1hdGNoWzldICsgbWF0Y2hbMTBdKTtcclxuICAgICAgICB0ek1pbiA9IE51bWJlcihtYXRjaFs5XSArIG1hdGNoWzExXSk7XHJcbiAgICB9XHJcbiAgICBkYXRlU2V0dGVyLmNhbGwoZGF0ZSwgTnVtYmVyKG1hdGNoWzFdKSwgTnVtYmVyKG1hdGNoWzJdKSAtIDEsIE51bWJlcihtYXRjaFszXSkpO1xyXG4gICAgY29uc3QgaCA9IE51bWJlcihtYXRjaFs0XSB8fCAwKSAtIHR6SG91cjtcclxuICAgIGNvbnN0IG0gPSBOdW1iZXIobWF0Y2hbNV0gfHwgMCkgLSB0ek1pbjtcclxuICAgIGNvbnN0IHMgPSBOdW1iZXIobWF0Y2hbNl0gfHwgMCk7XHJcbiAgICBjb25zdCBtcyA9IE1hdGgucm91bmQocGFyc2VGbG9hdCgnMC4nICsgKG1hdGNoWzddIHx8IDApKSAqIDEwMDApO1xyXG4gICAgdGltZVNldHRlci5jYWxsKGRhdGUsIGgsIG0sIHMsIG1zKTtcclxuICAgIHJldHVybiBkYXRlO1xyXG59XHJcbiJdfQ==