UNPKG

@cute-dw/core

Version:

This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need

393 lines 64.7 kB
import { Objects } from "../../Objects"; import { Arrays } from "../../Arrays"; import { Strings } from "../../Strings"; import { Locale } from "../Locale"; import { Dates } from "../../Dates"; import { Time } from "../../type/Time"; import { DateFormat } from "./DateFormat"; const NUMBER_OF_PATTERNS = 2; // Regexes and supporting functions are cached through closure //const tokenRe = /d{1,4}|D{3,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|W{1,2}|[LlopSZN]|"[^"]*"|'[^']*'/g; const tokenRe = /d{1,2}|E{1,4}|M{1,4}|T{2,4}|yy(?:yy)?|([Hhms])\1?|w{1,2}|W{1,2}|S{1,3}|X{1,3}|[uaAzZD]|"[^"]*"|'[^']*'/g; const timezoneRe = /\b(?:[A-Z]{1,3}[A-Z][TC])(?:[-+]\d{4})?|((?:Australian )?(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time)\b/g; const timezoneClipRe = /[^-+\dA-Z]/g; // Internationalization strings export const i18n = { "de": { shortDayNames: ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."], longDayNames: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], shortMonthNames: ["Jan.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sept.", "Okt.", "Nov.", "Dez."], longMonthNames: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], }, "en": { shortDayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], longDayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], shortMonthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], longMonthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], }, "fr": { shortDayNames: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], longDayNames: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], shortMonthNames: ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], longMonthNames: ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"], }, "ru": { shortDayNames: ["вс", "пн", "вт", "ср", "чт", "пт", "сб"], longDayNames: ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"], shortMonthNames: ["янв.", "февр.", "март", "апр.", "май", "июнь", "июль", "авг.", "сент.", "окт.", "нояб.", "дек."], longMonthNames: ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"], }, }; const pad = (val, len = 2) => String(val).padStart(len, '0'); const parts = (date, utc) => { const _ = () => (utc ? "getUTC" : "get"); return { d: () => date[_() + "Date"](), D: () => date[_() + "Day"](), M: () => date[_() + "Month"](), y: () => date[_() + "FullYear"](), H: () => date[_() + "Hours"](), m: () => date[_() + "Minutes"](), s: () => date[_() + "Seconds"](), S: () => date[_() + "Milliseconds"](), o: () => (utc ? 0 : date.getTimezoneOffset()), w: () => Dates.getWeek(date), W: () => Dates.getWeekOfMonth(date), u: () => Dates.getDayOfWeek(date), V: () => Dates.getDayOfYear(date), }; }; const DIVISIONS = [ { amount: 60, name: 'seconds' }, { amount: 60, name: 'minutes' }, { amount: 24, name: 'hours' }, { amount: 7, name: 'days' }, { amount: 4.34524, name: 'weeks' }, { amount: 12, name: 'months' }, { amount: Number.POSITIVE_INFINITY, name: 'years' } ]; /* * This class is based on: https://github.com/felixge/node-dateformat and * Steven Levithan's excellent [dateFormat()](https://blog.stevenlevithan.com/archives/javascript-date-format) function * (c) 2007-2009 Steven Levithan stevenlevithan.com, MIT license */ /** * Java compatible class for date/time formatting subclasses which formats and parses dates and/or time in a language-independent manner. * Date and time formats are specified by date and time _pattern strings_. Within date and time pattern strings, unquoted letters from 'A' to 'Z' and from 'a' to 'z' are interpreted as pattern letters representing the components of a date or time string. * * Date and time display formats can have two sections. The first is required and contains the format for dates and times; the second is optional and specifies how to represent nulls: * `date-time-format;null-format` * * Characters with special meaning in _date_ section of display format: * |Character| Meaning | Example | * |--- | --- | --- | * | `d` | Day number with no leading zero | 9 | * | `dd` | Day number with leading zero if appropriate | 09 | * | `D` | Day number in year | 189 | * | `E` | Day name in week, gives starting 1 letter | M | * | `EEE` | Day name in week, gives starting 2 letters | Mo | * | `EEE` | Day name in week, gives starting 3 letters | Mon | * | `EEEE` | Day name in week | Monday | * | `M` | Month number with no leading zero | 6 | * | `MM` | Month number with leading zero if appropriate| 06 | * | `MMM` | Month name abbreviation | Jun | * | `MMMM` | Month name | June | * | `yy` | Two-digit year | 97 | * | `yyyy` | Four-digit year | 1997 | * | `u` | ISO 8601 day number of the week (1 = Monday, ..., 7 = Sunday) | 1 | * | `w` | ISO 8601 week number of the year | 8 | * | `ww` | ISO 8601 week number of the year, leading zero for single-digit | 08 | * | `W` | ISO 8601 week number of the month | 3 | * | `WW` | ISO 8601 week number of the month, leading zero for single-digit| 03 | * * Colons, slashes, and spaces display as entered in the mask. * * You can use the following keywords as date display formats when you want to determine a localized appropriate format to use: * - [Default] * - [ShortDate] * - [MediumDate] * - [LongDate] * - [FullDate] * - [IsoDate] * * Note that [Date] is not a valid display format. * * Character meaning in _time_ section of the display format: * * |Character| Meaning | Example | * |--- | --- | --- | * |`h` | Hours; no leading zero for single-digit hours (12-hour clock) | 1 | * |`hh` | Hours; leading zero for single-digit hours (12-hour clock) | 01 | * |`H` | Hours; no leading zero for single-digit hours (24-hour clock) | 3 | * |`HH` | Hours; leading zero for single-digit hours (24-hour clock) | 03 | * |`m` | Minute with no leading zero (must follow h or hh)| 5 | * |`mm` | Minute with leading zero if appropriate (must follow h or hh)| 05 | * |`s` | Second with no leading zero (must follow m or mm)| 7 | * |`ss` | Second with leading zero (must follow m or mm) | 07 | * |`S` | Milliseconds; gives 1 digits | 3 | * |`SS` | Milliseconds; gives 2 digits | 25 | * |`SSS` | Milliseconds; gives 3 digits | 248 | * |`a` | Am/pm marker in lower case | am | * |`A` | Am/pm marker in upper case | PM | * |`z` | Timezone abbreviation, e.g. GMT+0700, UTC | GMT-05:00 | * |`Z` | RFC 822 timezone offset, e.g. -0500 or +0230 | +0400 | * |`X` | ISO 8601 timezone offset, e.g. Z, +04 | +04 | * |`XX` | ISO 8601 timezone offset, e.g. Z, -0500 | +0400 | * |`XXX` | ISO 8601 timezone offset, e.g. Z, +02:30 | +04:00| * |`TT` | Time between the date and the current date (narrow style)| -8 h | * |`TTT` | Time between the date and the current date (short style) | in 10 hr. | * |`TTTT` | Time between the date and the current date (long style) | in 10 hours | * * Colons, slashes, and spaces display as entered in the mask. * * You can use the following keywords as a time display formats when you want to determine a localized appropriate format to use: * - [Time] * - [ShortTime] * - [LongTime] * - [IsoTime] * - [LongTimeAgo] * - [ShortTimeAgo] * * For display both date and time values apply the following keywords: * - [DateTime] * - [IsoDateTime] * - [IsoDateTimeTZ] * - [IsoDateTimeUTC] * @example * console.log( new DateTimeFormat("EEEE, MMMM dd, yyyy, h:mm:ss a").format(Date.now()) ); // Saturday, June 09, 2007, 5:46:21 PM * @since 0.5.0 * @license MIT, (c) 2022 ALEXANDER STRELKOV, alv.strelkov@gmail.com */ export class SimpleDateFormat extends DateFormat { constructor(pattern = "[Default]", options) { super(); this._rtFormatter = [undefined, undefined, undefined]; this._subpatterns = []; this._utcgmt = undefined; const locales = options?.locales instanceof Locale ? options.locales.fullName : options?.locales; this._locale = new Locale(locales, options); this._options = { ...options }; this._pattern = Strings.trimAll(pattern) || "[Default]"; this._subpatterns = Arrays.padEnd(this._pattern.split(";"), NUMBER_OF_PATTERNS, ""); this._subpatterns.map((val, idx, arr) => arr[idx] = val.trim()); if (this._subpatterns[0].charAt(0) == "[") { let keyword = this._subpatterns[0].toLowerCase(); keyword = Strings.replaceAll(keyword, " ", ""); switch (keyword) { //case "[date]": case DateFormat.SHORTDATE: this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "short" }); break; case DateFormat.MEDIUMDATE: this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "medium" }); break; case DateFormat.LONGDATE: this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "long" }); break; case DateFormat.FULLDATE: this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "full" }); break; case DateFormat.ISODATE: this._subpatterns[0] = "yyyy-MM-dd"; break; case DateFormat.TIME: this._subpatterns[0] = "HH:mm:ss.SSS"; break; case DateFormat.LONGTIMEAGO: this._subpatterns[0] = "TTTT"; break; case DateFormat.SHORTTIMEAGO: this._subpatterns[0] = "TTT"; break; case DateFormat.ISOTIME: case DateFormat.MEDIUMTIME: this._dtFormatter = new Intl.DateTimeFormat(locales, { timeStyle: "medium" }); break; case DateFormat.SHORTTIME: this._dtFormatter = new Intl.DateTimeFormat(locales, { timeStyle: "short" }); break; case DateFormat.LONGTIME: this._dtFormatter = new Intl.DateTimeFormat(locales, { timeStyle: "long" }); break; case DateFormat.FULLTIME: this._dtFormatter = new Intl.DateTimeFormat(locales, { timeStyle: "full" }); break; case DateFormat.DATETIME: this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "short", timeStyle: "medium" }); break; case DateFormat.ISODATETIME: this._subpatterns[0] = "yyyy-MM-dd'T'HH:mm:ss"; break; case DateFormat.ISODATETIMETZ: this._subpatterns[0] = "yyyy-MM-dd'T'HH:mm:ssXX"; break; case DateFormat.ISODATETIMEUTC: this._subpatterns[0] = "UTC:yyyy-MM-dd'T'HH:mm:ss'Z'"; break; case "[expiresheaderformat]": this._subpatterns[0] = "EEE, dd MMM yyyy HH:mm:ss Z"; break; default: this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "full", timeStyle: "full", ...this._options }); } } else { // Allow setting the utc/gmt argument via the mask const maskSlice = pattern.slice(0, 4); if (maskSlice === "UTC:" || maskSlice === "GMT:") { this._subpatterns[0] = pattern.slice(4); this._utcgmt = maskSlice.slice(0, 3); } } } _decompose(date) { const utc = this._utcgmt !== undefined; const $ = parts(date, utc); const localeName = this._locale.language || "en"; const I18N = (localeName in i18n) ? i18n[localeName] : i18n["en"]; return { d: () => $.d(), dd: () => pad($.d()), E: () => Strings.left(I18N.shortDayNames[$.D()], 1), EE: () => Strings.left(I18N.shortDayNames[$.D()], 2), EEE: () => I18N.shortDayNames[$.D()], EEEE: () => I18N.longDayNames[$.D()], TT: () => this.formatTimeAgo(date, "narrow"), TTT: () => this.formatTimeAgo(date, "short"), TTTT: () => this.formatTimeAgo(date, "long"), D: () => $.V(), M: () => $.M() + 1, MM: () => pad($.M() + 1), MMM: () => I18N.shortMonthNames[$.M()], MMMM: () => I18N.longMonthNames[$.M()], yy: () => String($.y()).slice(2), yyyy: () => pad($.y(), 4), h: () => $.H() % 12 || 12, hh: () => pad($.H() % 12 || 12), H: () => $.H(), HH: () => pad($.H()), m: () => $.m(), mm: () => pad($.m()), s: () => $.s(), ss: () => pad($.s()), S: () => Math.floor($.S() / 100), SS: () => pad(Math.floor($.S() / 10), 2), SSS: () => pad($.S(), 3), a: () => $.H() < 12 ? 'am' : 'pm', A: () => $.H() < 12 ? 'AM' : 'PM', z: () => utc ? this._utcgmt : SimpleDateFormat.formatTimezone(date), Z: () => { const tzo = $.o(); return (tzo > 0 ? "-" : "+") + pad(Math.floor(Math.abs(tzo) / 60) * 100 + (Math.abs(tzo) % 60), 4); }, X: () => { const tzo = $.o(); return tzo === 0 ? "Z" : (tzo > 0 ? "-" : "+") + pad(Math.floor(Math.abs(tzo) / 60), 2); }, XX: () => { const tzo = $.o(); return tzo === 0 ? "Z" : (tzo > 0 ? "-" : "+") + pad(Math.floor(Math.abs(tzo) / 60), 2) + pad(Math.floor(Math.abs(tzo) % 60), 2); }, XXX: () => { const tzo = $.o(); return tzo === 0 ? "Z" : (tzo > 0 ? "-" : "+") + pad(Math.floor(Math.abs(tzo) / 60), 2) + ":" + pad(Math.floor(Math.abs(tzo) % 60), 2); }, /* S: () => { const d = $.d(); return ["th", "st", "nd", "rd"][ d % 10 > 3 ? 0 : ((d % 100 - d % 10) != 10 ? 1 : 0) * d % 10 ] }, */ u: () => $.u(), w: () => $.w(), ww: () => pad($.w()), W: () => $.W(), WW: () => pad($.W()), }; } ; formatTimeAgo(date, style = "long") { let duration = (date.getTime() - Date.now()) / 1000; let formatter; switch (style) { case "short": if (!this._rtFormatter[1]) { this._rtFormatter[1] = new Intl.RelativeTimeFormat(this._locale.baseName, { numeric: "auto", style: "short" }); } formatter = this._rtFormatter[1]; break; case "narrow": if (!this._rtFormatter[2]) { this._rtFormatter[2] = new Intl.RelativeTimeFormat(this._locale.baseName, { numeric: "auto", style: "narrow" }); } formatter = this._rtFormatter[2]; break; default: if (!this._rtFormatter[0]) { this._rtFormatter[0] = new Intl.RelativeTimeFormat(this._locale.baseName, { numeric: "auto", style: "long" }); } formatter = this._rtFormatter[0]; break; } for (let i = 0; i < DIVISIONS.length; i++) { const division = DIVISIONS[i]; if (Math.abs(duration) < division.amount) { return formatter.format(Math.round(duration), division.name); } duration /= division.amount; } return "???"; } /** * Get proper timezone abbreviation or timezone offset. * * This will fall back to `GMT+xxxx` if it does not recognize the * timezone within the `timezone` RegEx above. Currently only common * American and Australian timezone abbreviations are supported. * * @param {String | Date} date * @return {String} */ static formatTimezone(date) { return (String(date).match(timezoneRe) || [""]) .pop() .replace(timezoneClipRe, "") .replace(/GMT\+0000/g, "UTC"); } ; /** * @override */ format(value) { if (value == null) { return this._subpatterns[1] || ""; } else if (Objects.isNumber(value) && !Number.isInteger(value)) { return this._subpatterns[1] || ""; } if (!(value instanceof Date)) { if (value instanceof Time) { value = value.toDate(); } else { value = new Date(value); } } if (this._dtFormatter) { return this._dtFormatter.format(value); } const funcs = this._decompose(value); const pattern = this._subpatterns[0]; return pattern.replace(tokenRe, (match) => { if (match in funcs) { return funcs[match](); } return match.slice(1, match.length - 1); }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2ltcGxlRGF0ZUZvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1dGUtY29yZS9zcmMvbGliL3V0aWwvaTE4bi90ZXh0L1NpbXBsZURhdGVGb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSTFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLDhEQUE4RDtBQUM5RCxtR0FBbUc7QUFDbkcsTUFBTSxPQUFPLEdBQUcseUdBQXlHLENBQUM7QUFDMUgsTUFBTSxVQUFVLEdBQUcsa0pBQWtKLENBQUM7QUFDdEssTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDO0FBRXJDLCtCQUErQjtBQUMvQixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUc7SUFDbEIsSUFBSSxFQUFFO1FBQ0osYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQ2hFLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUMvRixlQUFlLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxF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QUFDO1NBQ3hDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QyxJQUFJLEtBQUssSUFBSSxLQUFLLEVBQUU7Z0JBQ2xCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7YUFDdkI7WUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYmplY3RzIH0gZnJvbSBcIi4uLy4uL09iamVjdHNcIjtcbmltcG9ydCB7IEFycmF5cyB9IGZyb20gXCIuLi8uLi9BcnJheXNcIjtcbmltcG9ydCB7IFN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vU3RyaW5nc1wiO1xuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSBcIi4uL0xvY2FsZVwiO1xuaW1wb3J0IHsgRGF0ZXMgfSBmcm9tIFwiLi4vLi4vRGF0ZXNcIjtcbmltcG9ydCB7IFRpbWUgfSBmcm9tIFwiLi4vLi4vdHlwZS9UaW1lXCI7XG5pbXBvcnQgeyBEYXRlRm9ybWF0IH0gZnJvbSBcIi4vRGF0ZUZvcm1hdFwiO1xuXG5leHBvcnQgdHlwZSBEYXRlVGltZUZvcm1hdE9wdGlvbnMgPSBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyAmIHsgbG9jYWxlcz86IHN0cmluZyB8IExvY2FsZSB9O1xuXG5jb25zdCBOVU1CRVJfT0ZfUEFUVEVSTlMgPSAyO1xuXG4vLyBSZWdleGVzIGFuZCBzdXBwb3J0aW5nIGZ1bmN0aW9ucyBhcmUgY2FjaGVkIHRocm91Z2ggY2xvc3VyZVxuLy9jb25zdCB0b2tlblJlID0gL2R7MSw0fXxEezMsNH18bXsxLDR9fHl5KD86eXkpP3woW0hoTXNUdF0pXFwxP3xXezEsMn18W0xsb3BTWk5dfFwiW15cIl0qXCJ8J1teJ10qJy9nO1xuY29uc3QgdG9rZW5SZSA9IC9kezEsMn18RXsxLDR9fE17MSw0fXxUezIsNH18eXkoPzp5eSk/fChbSGhtc10pXFwxP3x3ezEsMn18V3sxLDJ9fFN7MSwzfXxYezEsM318W3VhQXpaRF18XCJbXlwiXSpcInwnW14nXSonL2c7XG5jb25zdCB0aW1lem9uZVJlID0gL1xcYig/OltBLVpdezEsM31bQS1aXVtUQ10pKD86Wy0rXVxcZHs0fSk/fCgoPzpBdXN0cmFsaWFuICk/KD86UGFjaWZpY3xNb3VudGFpbnxDZW50cmFsfEVhc3Rlcm58QXRsYW50aWMpICg/OlN0YW5kYXJkfERheWxpZ2h0fFByZXZhaWxpbmcpIFRpbWUpXFxiL2c7XG5jb25zdCB0aW1lem9uZUNsaXBSZSA9IC9bXi0rXFxkQS1aXS9nO1xuXG4vLyBJbnRlcm5hdGlvbmFsaXphdGlvbiBzdHJpbmdzXG5leHBvcnQgY29uc3QgaTE4biA9IHtcbiAgXCJkZVwiOiB7XG4gICAgc2hvcnREYXlOYW1lczogW1wiU28uXCIsIFwiTW8uXCIsIFwiRGkuXCIsIFwiTWkuXCIsIFwiRG8uXCIsIFwiRnIuXCIsIFwiU2EuXCJdLFxuICAgIGxvbmdEYXlOYW1lczogW1wiU29ubnRhZ1wiLCBcIk1vbnRhZ1wiLCBcIkRpZW5zdGFnXCIsIFwiTWl0dHdvY2hcIiwgXCJEb25uZXJzdGFnXCIsIFwiRnJlaXRhZ1wiLCBcIlNhbXN0YWdcIl0sXG4gICAgc2hvcnRNb250aE5hbWVzOiBbXCJKYW4uXCIsIFwiRmViLlwiLCBcIk3DpHJ6XCIsIFwiQXByLlwiLCBcIk1haVwiLCBcIkp1bmlcIiwgXCJKdWxpXCIsIFwiQXVnLlwiLCBcIlNlcHQuXCIsIFwiT2t0LlwiLCBcIk5vdi5cIiwgXCJEZXouXCJdLFxuICAgIGxvbmdNb250aE5hbWVzOiBbXCJKYW51YXJcIiwgXCJGZWJydWFyXCIsIFwiTcOkcnpcIiwgXCJBcHJpbFwiLCBcIk1haVwiLCBcIkp1bmlcIiwgXCJKdWxpXCIsIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2t0b2JlclwiLCBcIk5vdmVtYmVyXCIsIFwiRGV6ZW1iZXJcIl0sXG4gIH0sXG4gIFwiZW5cIjoge1xuICAgIHNob3J0RGF5TmFtZXM6IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXSxcbiAgICBsb25nRGF5TmFtZXM6IFtcIlN1bmRheVwiLCBcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCJdLFxuICAgIHNob3J0TW9udGhOYW1lczogW1wiSmFuXCIsIFwiRmViXCIsIFwiTWFyXCIsIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuXCIsIFwiSnVsXCIsIFwiQXVnXCIsIFwiU2VwXCIsIFwiT2N0XCIsIFwiTm92XCIsIFwiRGVjXCJdLFxuICAgIGxvbmdNb250aE5hbWVzOiBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXSxcbiAgfSxcbiAgXCJmclwiOiB7XG4gICAgc2hvcnREYXlOYW1lczogW1wiZGltLlwiLCBcImx1bi5cIiwgXCJtYXIuXCIsIFwibWVyLlwiLCBcImpldS5cIiwgXCJ2ZW4uXCIsIFwic2FtLlwiXSxcbiAgICBsb25nRGF5TmFtZXM6IFtcImRpbWFuY2hlXCIsIFwibHVuZGlcIiwgXCJtYXJkaVwiLCBcIm1lcmNyZWRpXCIsIFwiamV1ZGlcIiwgXCJ2ZW5kcmVkaVwiLCBcInNhbWVkaVwiXSxcbiAgICBzaG9ydE1vbnRoTmFtZXM6IFtcImphbnYuXCIsIFwiZsOpdnIuXCIsIFwibWFyc1wiLCBcImF2ci5cIiwgXCJtYWlcIiwgXCJqdWluXCIsIFwianVpbC5cIiwgXCJhb8O7dFwiLCBcInNlcHQuXCIsIFwib2N0LlwiLCBcIm5vdi5cIiwgXCJkw6ljLlwiXSxcbiAgICBsb25nTW9udGhOYW1lczogW1wiamFudmllclwiLCBcImbDqXZyaWVyXCIsIFwibWFyc1wiLCBcImF2cmlsXCIsIFwibWFpXCIsIFwianVpblwiLCBcImp1aWxsZXRcIiwgXCJhb8O7dFwiLCBcInNlcHRlbWJyZVwiLCBcIm9jdG9icmVcIiwgXCJub3ZlbWJyZVwiLCBcImTDqWNlbWJyZVwiXSxcbiAgfSxcbiAgXCJydVwiOiB7XG4gICAgc2hvcnREYXlOYW1lczogW1wi0LLRgVwiLCBcItC/0L1cIiwgXCLQstGCXCIsIFwi0YHRgFwiLCBcItGH0YJcIiwgXCLQv9GCXCIsIFwi0YHQsVwiXSxcbiAgICBsb25nRGF5TmFtZXM6IFtcItCy0L7RgdC60YDQtdGB0LXQvdGM0LVcIiwgXCLQv9C+0L3QtdC00LXQu9GM0L3QuNC6XCIsIFwi0LLRgtC+0YDQvdC40LpcIiwgXCLRgdGA0LXQtNCwXCIsIFwi0YfQtdGC0LLQtdGA0LNcIiwgXCLQv9GP0YLQvdC40YbQsFwiLCBcItGB0YPQsdCx0L7RgtCwXCJdLFxuICAgIHNob3J0TW9udGhOYW1lczogW1wi0Y/QvdCyLlwiLCBcItGE0LXQstGALlwiLCBcItC80LDRgNGCXCIsIFwi0LDQv9GALlwiLCBcItC80LDQuVwiLCBcItC40Y7QvdGMXCIsIFwi0LjRjtC70YxcIiwgXCLQsNCy0LMuXCIsIFwi0YHQtdC90YIuXCIsIFwi0L7QutGCLlwiLCBcItC90L7Rj9CxLlwiLCBcItC00LXQui5cIl0sXG4gICAgbG9uZ01vbnRoTmFtZXM6IFtcItGP0L3QstCw0YDRjFwiLCBcItGE0LXQstGA0LDQu9GMXCIsIFwi0LzQsNGA0YJcIiwgXCLQsNC/0YDQtdC70YxcIiwgXCLQvNCw0LlcIiwgXCLQuNGO0L3RjFwiLCBcItC40Y7Qu9GMXCIsIFwi0LDQstCz0YPRgdGCXCIsIFwi0YHQtdC90YLRj9Cx0YDRjFwiLCBcItC+0LrRgtGP0LHRgNGMXCIsIFwi0L3QvtGP0LHRgNGMXCIsIFwi0LTQtdC60LDQsdGA0YxcIl0sXG4gIH0sXG59O1xuXG5jb25zdCBwYWQ6IEZ1bmN0aW9uID0gKHZhbDogYW55LCBsZW4gPSAyKSA9PiBTdHJpbmcodmFsKS5wYWRTdGFydChsZW4sICcwJyk7XG5cbmNvbnN0IHBhcnRzOiBGdW5jdGlvbiA9IChkYXRlOiBhbnksIHV0YzogYm9vbGVhbik6IGFueSA9PiB7XG4gIGNvbnN0IF8gPSAoKSA9PiAodXRjID8gXCJnZXRVVENcIiA6IFwiZ2V0XCIpO1xuICByZXR1cm4ge1xuICAgIGQ6ICgpID0+IGRhdGVbXygpICsgXCJEYXRlXCJdKCksXG4gICAgRDogKCkgPT4gZGF0ZVtfKCkgKyBcIkRheVwiXSgpLFxuICAgIE06ICgpID0+IGRhdGVbXygpICsgXCJNb250aFwiXSgpLFxuICAgIHk6ICgpID0+IGRhdGVbXygpICsgXCJGdWxsWWVhclwiXSgpLFxuICAgIEg6ICgpID0+IGRhdGVbXygpICsgXCJIb3Vyc1wiXSgpLFxuICAgIG06ICgpID0+IGRhdGVbXygpICsgXCJNaW51dGVzXCJdKCksXG4gICAgczogKCkgPT4gZGF0ZVtfKCkgKyBcIlNlY29uZHNcIl0oKSxcbiAgICBTOiAoKSA9PiBkYXRlW18oKSArIFwiTWlsbGlzZWNvbmRzXCJdKCksXG4gICAgbzogKCkgPT4gKHV0YyA/IDAgOiBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpLFxuICAgIHc6ICgpID0+IERhdGVzLmdldFdlZWsoZGF0ZSksXG4gICAgVzogKCkgPT4gRGF0ZXMuZ2V0V2Vla09mTW9udGgoZGF0ZSksXG4gICAgdTogKCkgPT4gRGF0ZXMuZ2V0RGF5T2ZXZWVrKGRhdGUpLFxuICAgIFY6ICgpID0+IERhdGVzLmdldERheU9mWWVhcihkYXRlKSxcbiAgfTtcbn07XG5cbmNvbnN0IERJVklTSU9OUzogeyBhbW91bnQ6IG51bWJlciwgbmFtZTogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0IH1bXSA9IFtcbiAgeyBhbW91bnQ6IDYwLCBuYW1lOiAnc2Vjb25kcycgfSxcbiAgeyBhbW91bnQ6IDYwLCBuYW1lOiAnbWludXRlcycgfSxcbiAgeyBhbW91bnQ6IDI0LCBuYW1lOiAnaG91cnMnIH0sXG4gIHsgYW1vdW50OiA3LCBuYW1lOiAnZGF5cycgfSxcbiAgeyBhbW91bnQ6IDQuMzQ1MjQsIG5hbWU6ICd3ZWVrcycgfSxcbiAgeyBhbW91bnQ6IDEyLCBuYW1lOiAnbW9udGhzJyB9LFxuICB7IGFtb3VudDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBuYW1lOiAneWVhcnMnIH1cbl07XG5cbi8qXG4gKiBUaGlzIGNsYXNzIGlzIGJhc2VkIG9uOiBodHRwczovL2dpdGh1Yi5jb20vZmVsaXhnZS9ub2RlLWRhdGVmb3JtYXQgYW5kXG4gKiBTdGV2ZW4gTGV2aXRoYW4ncyBleGNlbGxlbnQgW2RhdGVGb3JtYXQoKV0oaHR0cHM6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy9qYXZhc2NyaXB0LWRhdGUtZm9ybWF0KSBmdW5jdGlvblxuICogKGMpIDIwMDctMjAwOSBTdGV2ZW4gTGV2aXRoYW4gc3RldmVubGV2aXRoYW4uY29tLCBNSVQgbGljZW5zZVxuICovXG4vKipcbiAqIEphdmEgY29tcGF0aWJsZSBjbGFzcyBmb3IgZGF0ZS90aW1lIGZvcm1hdHRpbmcgc3ViY2xhc3NlcyB3aGljaCBmb3JtYXRzIGFuZCBwYXJzZXMgZGF0ZXMgYW5kL29yIHRpbWUgaW4gYSBsYW5ndWFnZS1pbmRlcGVuZGVudCBtYW5uZXIuXG4gKiBEYXRlIGFuZCB0aW1lIGZvcm1hdHMgYXJlIHNwZWNpZmllZCBieSBkYXRlIGFuZCB0aW1lIF9wYXR0ZXJuIHN0cmluZ3NfLiBXaXRoaW4gZGF0ZSBhbmQgdGltZSBwYXR0ZXJuIHN0cmluZ3MsIHVucXVvdGVkIGxldHRlcnMgZnJvbSAnQScgdG8gJ1onIGFuZCBmcm9tICdhJyB0byAneicgYXJlIGludGVycHJldGVkIGFzIHBhdHRlcm4gbGV0dGVycyByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudHMgb2YgYSBkYXRlIG9yIHRpbWUgc3RyaW5nLlxuICpcbiAqIERhdGUgYW5kIHRpbWUgZGlzcGxheSBmb3JtYXRzIGNhbiBoYXZlIHR3byBzZWN0aW9ucy4gVGhlIGZpcnN0IGlzIHJlcXVpcmVkIGFuZCBjb250YWlucyB0aGUgZm9ybWF0IGZvciBkYXRlcyBhbmQgdGltZXM7IHRoZSBzZWNvbmQgaXMgb3B0aW9uYWwgYW5kIHNwZWNpZmllcyBob3cgdG8gcmVwcmVzZW50IG51bGxzOlxuICogYGRhdGUtdGltZS1mb3JtYXQ7bnVsbC1mb3JtYXRgXG4gKlxuICogQ2hhcmFjdGVycyB3aXRoIHNwZWNpYWwgbWVhbmluZyBpbiBfZGF0ZV8gc2VjdGlvbiBvZiBkaXNwbGF5IGZvcm1hdDpcbiAqIHxDaGFyYWN0ZXJ8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlIHxcbiAqIHwtLS0gICAgICB8IC0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0gICAgIHxcbiAqIHwgYGRgICAgICB8IERheSBudW1iZXIgd2l0aCBubyBsZWFkaW5nIHplcm8gICAgICAgICAgICAgfCA5ICAgICAgIHxcbiAqIHwgYGRkYCAgICB8IERheSBudW1iZXIgd2l0aCBsZWFkaW5nIHplcm8gaWYgYXBwcm9wcmlhdGUgfCAwOSAgICAgIHxcbiAqIHwgYERgICAgICB8IERheSBudW1iZXIgaW4geWVhciAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxODkgICAgIHxcbiAqIHwgYEVgICAgICB8IERheSBuYW1lIGluIHdlZWssIGdpdmVzIHN0YXJ0aW5nIDEgbGV0dGVyICAgfCBNICAgICAgIHxcbiAqIHwgYEVFRWAgICB8IERheSBuYW1lIGluIHdlZWssIGdpdmVzIHN0YXJ0aW5nIDIgbGV0dGVycyAgfCBNbyAgICAgIHxcbiAqIHwgYEVFRWAgICB8IERheSBuYW1lIGluIHdlZWssIGdpdmVzIHN0YXJ0aW5nIDMgbGV0dGVycyAgfCBNb24gICAgIHxcbiAqIHwgYEVFRUVgICB8IERheSBuYW1lIGluIHdlZWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNb25kYXkgIHxcbiAqIHwgYE1gICAgICB8IE1vbnRoIG51bWJlciB3aXRoIG5vIGxlYWRpbmcgemVybyAgICAgICAgICAgfCA2ICAgICAgIHxcbiAqIHwgYE1NYCAgICB8IE1vbnRoIG51bWJlciB3aXRoIGxlYWRpbmcgemVybyBpZiBhcHByb3ByaWF0ZXwgMDYgICAgIHxcbiAqIHwgYE1NTWAgICB8IE1vbnRoIG5hbWUgYWJicmV2aWF0aW9uICAgICAgICAgICAgICAgICAgICAgfCBKdW4gICAgIHxcbiAqIHwgYE1NTU1gICB8IE1vbnRoIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBKdW5lICAgIHxcbiAqIHwgYHl5YCAgICB8IFR3by1kaWdpdCB5ZWFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA5NyAgICAgIHxcbiAqIHwgYHl5eXlgICB8IEZvdXItZGlnaXQgeWVhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxOTk3ICAgIHxcbiAqIHwgYHVgICAgICB8IElTTyA4NjAxIGRheSBudW1iZXIgb2YgdGhlIHdlZWsgKDEgPSBNb25kYXksIC4uLiwgNyA9IFN1bmRheSkgICB8IDEgICAgICB8XG4gKiB8IGB3YCAgICAgfCBJU08gODYwMSB3ZWVrIG51bWJlciBvZiB0aGUgeWVhciAgICAgICAgICAgIHwgOCAgICAgICB8XG4gKiB8IGB3d2AgICAgfCBJU08gODYwMSB3ZWVrIG51bWJlciBvZiB0aGUgeWVhciwgbGVhZGluZyB6ZXJvIGZvciBzaW5nbGUtZGlnaXQgfCAwOCAgICAgfFxuICogfCBgV2AgICAgIHwgSVNPIDg2MDEgd2VlayBudW1iZXIgb2YgdGhlIG1vbnRoICAgICAgICAgICB8IDMgICAgICAgfFxuICogfCBgV1dgICAgIHwgSVNPIDg2MDEgd2VlayBudW1iZXIgb2YgdGhlIG1vbnRoLCBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdHwgMDMgICAgIHxcbiAqXG4gKiBDb2xvbnMsIHNsYXNoZXMsIGFuZCBzcGFjZXMgZGlzcGxheSBhcyBlbnRlcmVkIGluIHRoZSBtYXNrLlxuICpcbiAqIFlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcga2V5d29yZHMgYXMgZGF0ZSBkaXNwbGF5IGZvcm1hdHMgd2hlbiB5b3Ugd2FudCB0byBkZXRlcm1pbmUgYSBsb2NhbGl6ZWQgYXBwcm9wcmlhdGUgZm9ybWF0IHRvIHVzZTpcbiAqIC0gW0RlZmF1bHRdXG4gKiAtIFtTaG9ydERhdGVdXG4gKiAtIFtNZWRpdW1EYXRlXVxuICogLSBbTG9uZ0RhdGVdXG4gKiAtIFtGdWxsRGF0ZV1cbiAqIC0gW0lzb0RhdGVdXG4gKlxuICogTm90ZSB0aGF0IFtEYXRlXSBpcyBub3QgYSB2YWxpZCBkaXNwbGF5IGZvcm1hdC5cbiAqXG4gKiBDaGFyYWN0ZXIgbWVhbmluZyBpbiBfdGltZV8gc2VjdGlvbiBvZiB0aGUgZGlzcGxheSBmb3JtYXQ6XG4gKlxuICogfENoYXJhY3RlcnwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSB8XG4gKiB8LS0tICAgICAgfCAtLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0gICAgIHxcbiAqIHxgaGAgICAgICB8IEhvdXJzOyBubyBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdCBob3VycyAoMTItaG91ciBjbG9jaykgICAgfCAxICAgICAgIHxcbiAqIHxgaGhgICAgICB8IEhvdXJzOyBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdCBob3VycyAoMTItaG91ciBjbG9jaykgICAgICAgfCAwMSAgICAgIHxcbiAqIHxgSGAgICAgICB8IEhvdXJzOyBubyBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdCBob3VycyAoMjQtaG91ciBjbG9jaykgICAgfCAzICAgICAgIHxcbiAqIHxgSEhgICAgICB8IEhvdXJzOyBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdCBob3VycyAoMjQtaG91ciBjbG9jaykgICAgICAgfCAwMyAgICAgIHxcbiAqIHxgbWAgICAgICB8IE1pbnV0ZSB3aXRoIG5vIGxlYWRpbmcgemVybyAobXVzdCBmb2xsb3cgaCBvciBoaCl8IDUgICB8XG4gKiB8YG1tYCAgICAgfCBNaW51dGUgd2l0aCBsZWFkaW5nIHplcm8gaWYgYXBwcm9wcmlhdGUgKG11c3QgZm9sbG93IGggb3IgaGgpfCAwNSAgfFxuICogfGBzYCAgICAgIHwgU2Vjb25kIHdpdGggbm8gbGVhZGluZyB6ZXJvIChtdXN0IGZvbGxvdyBtIG9yIG1tKXwgNyAgIHxcbiAqIHxgc3NgICAgICB8IFNlY29uZCB3aXRoIGxlYWRpbmcgemVybyAobXVzdCBmb2xsb3cgbSBvciBtbSkgICB8IDA3ICB8XG4gKiB8YFNgICAgICAgfCBNaWxsaXNlY29uZHM7IGdpdmVzIDEgZGlnaXRzICAgICAgICAgICAgICAgICAgICAgfCAzICAgfFxuICogfGBTU2AgICAgIHwgTWlsbGlzZWNvbmRzOyBnaXZlcyAyIGRpZ2l0cyAgICAgICAgICAgICAgICAgICAgIHwg