diff --git a/.idea/runConfigurations/bin_www.xml b/.idea/runConfigurations/bin_www.xml index 6872346..08fa16d 100644 --- a/.idea/runConfigurations/bin_www.xml +++ b/.idea/runConfigurations/bin_www.xml @@ -4,7 +4,7 @@ - + diff --git a/app.js b/app.js index aff6cc2..d5183fc 100644 --- a/app.js +++ b/app.js @@ -3,7 +3,11 @@ import logger from 'morgan' import express from 'express' import cookieParser from 'cookie-parser' import path from 'path' -import { fileURLToPath } from 'url'; +import { fileURLToPath } from 'url' +import i18next from 'i18next' +import i18nextMiddleware from 'i18next-http-middleware' +import Backend from 'i18next-node-fs-backend' + const app = express() export let url2call @@ -14,6 +18,20 @@ const __dirname = path.dirname(__filename); import indexRouter from './routes/index.js' import apiRouter from './routes/api.js' +i18next + .use(Backend) + .use(i18nextMiddleware.LanguageDetector) + .init({ + backend: { + loadPath: __dirname + '/locales/{{lng}}/{{ns}}.json' + }, + fallbackLng: 'en', +// debug: true, + preload: ['en', 'de'] + }); + +app.use(i18nextMiddleware.handle(i18next)); + // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); diff --git a/charts/preparecharts.js b/charts/preparecharts.js index c6b7658..a6eb822 100644 --- a/charts/preparecharts.js +++ b/charts/preparecharts.js @@ -9,7 +9,7 @@ import * as utils from '../charts/utilities.js' * @returns {{options: {plotOptions: {series: {marker: {enabled: boolean}, turboThreshold: number, animation: boolean}}, xAxis: {gridLineWidth: number, type: string, title: {text: string}, labels: {formatter: function(): (string|*)}}, legend: {layout: string, borderWidth: number, align: string, enabled: boolean}, subtitle: {align: string}, tooltip: {backgroundColor: number, valueDecimals: number, borderRadius: number, useHTML: boolean, borderWidth: number}, title: {useHTML: boolean, style: {fontSize: string}, align: string}, chart: {backgroundColor: {linearGradient: number[], stops: [[number,string],[number,string]]}, spacingTop: number, borderWidth: string, spacingLeft: number, type: string, spacingRight: number, events: {selection: function(*): void}, height: number}}, params}} * ***********************************************/ -export const liveData = (params, values) => { +export const liveData = (params, values, req) => { let series1 = [] let series2 = [] let series3 = [] @@ -38,7 +38,7 @@ export const liveData = (params, values) => { // InfoTafel füllen infoTafel = '' + - '' + + '' + '' + '' infoTafel += @@ -137,7 +137,7 @@ export const liveData = (params, values) => { options.yAxis = [] options.series[0] = series_LAeq options.series[1] = series_LAMin - options.title.text = 'Noise levels last 24 hours' + options.title.text = req.i18n.t('Noise_levels_last_24_hours') options.subtitle.useHTML = true options.subtitle.text = '2.5min log. average values
 ' options.series[2] = series_LAMax diff --git a/locales/de/translation.json b/locales/de/translation.json new file mode 100644 index 0000000..4e96406 --- /dev/null +++ b/locales/de/translation.json @@ -0,0 +1,20 @@ +{ + "Noise_Measurement": "Lärm-Messung", + "Settings": "Einstellungen", + "Info": "Info", + "Start_date": "Start Datum", + "Number_of_days": "Anzahl Tage", + "Only_for_live_chart": "Nur bei 'live' Grafik", + "Count_peaks_over": "Zähle Spitzen über", + "Close": "Schließen", + "Save_changes": "Änderungen speichern", + "Language": "Sprache", + "Map": "Karte", + "Live": "Live", + "Hour_AVG": "Stundenmittel", + "Day_AVG": "Tagesmittel", + "Day_Night": "Tag/Nacht-Werte", + "doReset": "Bitte die Seite neu laden um die Sprache zu übernehmen", + "ActualValues": "Aktuelle Werte", + "Noise_levels_last_24_hours": "Schallpegel der letzten 24 Stunden" +} \ No newline at end of file diff --git a/locales/dev/translation.json b/locales/dev/translation.json new file mode 100644 index 0000000..88d2cd2 --- /dev/null +++ b/locales/dev/translation.json @@ -0,0 +1 @@ +{"Noise Measurement": "Lärmus messus" } diff --git a/locales/en/translation.json b/locales/en/translation.json new file mode 100644 index 0000000..5308afb --- /dev/null +++ b/locales/en/translation.json @@ -0,0 +1,21 @@ +{ + "Noise_Measurement": "Noise Measurement", + "Settings": "Settings", + "Info": "Info", + "Start_date": "Start date:", + "Number_of_days": "Number of days", + "Only_for_live_chart": "Only for 'live' chart", + "Count_peaks_over": "Count peaks over", + "Close": "Close", + "Save_changes": "Save changes", + "Language": "Language", + "Map": "Map", + "Live": "Live", + "Hour_AVG": "Hour_AVG", + "Day_AVG": "Day_AVG", + "Day_Night": "Day_Night" + "doReset": "Please reload page to change language.", + "ActualValues": "Actual Values", + "Noise_levels_last_24_hours": "Noise levels last 24 hours" + +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ff073ad..7e3949c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,10 @@ "debug": "~2.6.9", "express": "^4.18.2", "http-errors": "~1.6.3", + "i18next": "^22.4.14", + "i18next-express-middleware": "^2.0.0", + "i18next-http-middleware": "^3.3.0", + "i18next-node-fs-backend": "^1.2.1", "morgan": "~1.9.1", "pug": "^3.0.2", "sass": "^1.58.3" @@ -49,6 +53,17 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.21.3", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", @@ -97,6 +112,14 @@ "node": ">= 8" } }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -297,6 +320,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/coffeescript": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", + "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -380,6 +415,18 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cookies": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.1.tgz", + "integrity": "sha512-VX3KKCWrKjPnCwF78P60rnMfy1piVeObnjuKO4rBUyiSRYDgY/EqXbw3jX/uXmmdAPmayVJqdbLfJ0BRSfRZFg==", + "dependencies": { + "depd": "~1.1.1", + "keygrip": "~1.0.2" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -392,6 +439,14 @@ "node": ">= 0.10" } }, + "node_modules/cson-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cson-parser/-/cson-parser-3.0.0.tgz", + "integrity": "sha512-khmLtNmwe6SSlWz5vrhay9yWd/Fwwyiel+vt+1vIcCT9AsdqNuLXuK9tYhhAw1FdSSHjLc56PW8xa565/x73XQ==", + "dependencies": { + "coffeescript": "^1.10.0" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -448,6 +503,18 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -763,6 +830,53 @@ "node": ">= 0.6" } }, + "node_modules/i18next": { + "version": "22.4.14", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.14.tgz", + "integrity": "sha512-VtLPtbdwGn0+DAeE00YkiKKXadkwg+rBUV+0v8v0ikEjwdiJ0gmYChVE4GIa9HXymY6wKapkL93vGT7xpq6aTw==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.20.6" + } + }, + "node_modules/i18next-express-middleware": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/i18next-express-middleware/-/i18next-express-middleware-2.0.0.tgz", + "integrity": "sha512-TGlSkYsQHikggv4mIp5B+CiXsZzwbpHaZgmOkRNGStLOdKHABH5cHr136g2PC1+p2VPMf3y3UoQZ1TfPfVOrgg==", + "deprecated": "replaced by i18next-http-middleware", + "dependencies": { + "cookies": "0.7.1" + } + }, + "node_modules/i18next-http-middleware": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.3.0.tgz", + "integrity": "sha512-WX6uqxNwXccdNm/md5VJ+Q47DF2gjqLvygvgNzb2tCJWPM86FCi2LIvKco70EttlpV9IkfkCVNVF07/56EsSEw==" + }, + "node_modules/i18next-node-fs-backend": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/i18next-node-fs-backend/-/i18next-node-fs-backend-1.2.1.tgz", + "integrity": "sha512-lMd/tWsdgDFb158FwXHff63WZpTXggO3j8YOFEko+EvzRPzoIWkvfqdU5Oogn/p4nYfOMnCeEns29ksPF6rZBQ==", + "deprecated": "replaced by i18next-fs-backend", + "dependencies": { + "cson-parser": "3.0.0", + "js-yaml": "3.5.4", + "json5": "0.5.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -875,6 +989,26 @@ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" }, + "node_modules/js-yaml": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.4.tgz", + "integrity": "sha512-XBGnYi4i/XkEeSclkcRmBKOR9t7SLViumIhaIqwHSkO7FU0F3xW/sqAQ1/y+AcYX2EcnwdKFY1nXWzjJHqBRoA==", + "dependencies": { + "argparse": "^1.0.2", + "esprima": "^2.6.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json5": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.0.tgz", + "integrity": "sha512-WDgahySBucTVnQuzQHoVh6BKKg3TFBUExSwYOPwA4it9xtspn3erHYkdEx1AXXkHN38L7O6v6lmqLiXh/GnxhA==", + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -884,6 +1018,14 @@ "promise": "^7.0.1" } }, + "node_modules/keygrip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", + "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1260,6 +1402,11 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -1422,6 +1569,11 @@ "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, "node_modules/statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", diff --git a/package.json b/package.json index 3cf038e..12de2de 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,10 @@ "debug": "~2.6.9", "express": "^4.18.2", "http-errors": "~1.6.3", + "i18next": "^22.4.14", + "i18next-express-middleware": "^2.0.0", + "i18next-http-middleware": "^3.3.0", + "i18next-node-fs-backend": "^1.2.1", "morgan": "~1.9.1", "pug": "^3.0.2", "sass": "^1.58.3" diff --git a/public/javascripts/chart_utilities.js b/public/javascripts/chart_utilities.js index 9ceb7d1..0c6aaeb 100644 --- a/public/javascripts/chart_utilities.js +++ b/public/javascripts/chart_utilities.js @@ -162,9 +162,7 @@ export function calcDays(data, isyear) { }; export async function addSensorID2chart(chart, sensor, width) { - console.log('widht: ',width); let indoor = sensor.indoor || false - console.log('indoor: ',indoor) let sens = chart.renderer.label( `Sensor: ${sensor.sid} ${indoor ? ' (indoor)' : ''}`, width / 2 - 100, 65, @@ -184,6 +182,11 @@ export const showError = (err) => { myModal.show() } +export const showReset = () => { + let myModal = new bootstrap.Modal(document.getElementById('dialogReset')) + myModal.show() +} + // remove the taps (if shownig the map) export const removeTabs = () => { document.querySelector('#navi').style.display = 'none' diff --git a/public/javascripts/checklang.js b/public/javascripts/checklang.js new file mode 100644 index 0000000..bbb61f4 --- /dev/null +++ b/public/javascripts/checklang.js @@ -0,0 +1,11 @@ +// set correct language +let currentLang +const navLang = navigator.language.slice(0,2) +const selectedLang = localStorage.getItem('curlang') +if (!selectedLang) { + currentLang = navLang +} else { + currentLang = selectedLang +} +window.location.href = '/?lng=' + currentLang + diff --git a/public/javascripts/global.js b/public/javascripts/global.js index 407049f..976f557 100644 --- a/public/javascripts/global.js +++ b/public/javascripts/global.js @@ -6,7 +6,7 @@ import * as dt from './datetime.js' import {logerror, logit} from './logit.js' import {tabtable, loadAll, showChart} from './showcharts.js' import { DateTime } from './luxon.min.js' - +import {showReset} from "./chart_utilities.js"; (async () => { @@ -26,30 +26,43 @@ import { DateTime } from './luxon.min.js' seldate: 'today', refresh: 0, } + let currentTab = '' // END global variables + + + // Register events document.querySelector('#btnSave').addEventListener('click', async () => { const selDate = document.getElementById('startday').value let starttime if (selDate === 'today') { starttime = DateTime.now().toISO() + params.datetime = '' } else { starttime = DateTime.fromFormat(selDate, 'yyyy-MM-dd').toISO() + params.datetime = starttime } params.seldate = selDate const span = document.getElementById('nbrofdays').value const peak = document.getElementById('peaklim').value console.log(starttime, span, peak) - params.datetime = starttime if(span < 10) { params.span = span } if(peak < 130 ) { params.peak = peak } - await loadAll(params) + let newlng = document.querySelector('#sellan input:checked').id + let oldlng = localStorage.getItem('curlang') + localStorage.setItem('curlang', newlng) + if(newlng !== oldlng) { + location.reload() + } + if(params.sid !== undefined) { + await loadAll(params) + } }) @@ -66,10 +79,21 @@ import { DateTime } from './luxon.min.js' myModal.show() }) + // main function: - // show the map if calle w/o any parameter + // show the map if called w/o any parameter // if called with a sensor-ID, show the live chart for this sensor async function main() { + // set correct language + const currentLang = localStorage.getItem('curlang') + if(currentLang === 'en') { + document.querySelector('#en').checked = true + } else { + document.querySelector('#de').checked = true + } + console.log(currentLang) + history.pushState({}, '', '/') + // initialise tabs let triggerTabList = [].slice.call(document.querySelectorAll('.nav-link')) triggerTabList.forEach(function (triggerEl) { @@ -78,6 +102,11 @@ import { DateTime } from './luxon.min.js' triggerEl.addEventListener('click', function (event) { event.preventDefault() tabTrigger.show() + currentTab = event.currentTarget.id + if (currentTab === 'maptab') { + map.showMap(params) + document.querySelector('#sellan').style.display = 'inline' + } }) }) @@ -100,6 +129,7 @@ import { DateTime } from './luxon.min.js' } } else { // show the map + document.querySelector('#sellan').style.display = 'inline' map.showMap(params) } } diff --git a/public/javascripts/luxon.min.js b/public/javascripts/luxon.min.js index 845bad7..30ced14 100644 --- a/public/javascripts/luxon.min.js +++ b/public/javascripts/luxon.min.js @@ -1 +1 @@ -class e extends Error{}class z extends e{constructor(e){super("Invalid DateTime: "+e.toMessage())}}class q extends e{constructor(e){super("Invalid Interval: "+e.toMessage())}}class A extends e{constructor(e){super("Invalid Duration: "+e.toMessage())}}class j extends e{}class _ extends e{constructor(e){super("Invalid unit "+e)}}class o extends e{}class r extends e{constructor(){super("Zone is an abstract class")}}var t="numeric",n="short",s="long";const U={year:t,month:t,day:t},$={year:t,month:n,day:t},H={year:t,month:n,day:t,weekday:n},W={year:t,month:s,day:t},R={year:t,month:s,day:t,weekday:s},J={hour:t,minute:t},Y={hour:t,minute:t,second:t},P={hour:t,minute:t,second:t,timeZoneName:n},G={hour:t,minute:t,second:t,timeZoneName:s},B={hour:t,minute:t,hourCycle:"h23"},Q={hour:t,minute:t,second:t,hourCycle:"h23"},K={hour:t,minute:t,second:t,hourCycle:"h23",timeZoneName:n},X={hour:t,minute:t,second:t,hourCycle:"h23",timeZoneName:s},ee={year:t,month:t,day:t,hour:t,minute:t},te={year:t,month:t,day:t,hour:t,minute:t,second:t},re={year:t,month:n,day:t,hour:t,minute:t},ne={year:t,month:n,day:t,hour:t,minute:t,second:t},se={year:t,month:n,day:t,weekday:n,hour:t,minute:t},ie={year:t,month:s,day:t,hour:t,minute:t,timeZoneName:n},ae={year:t,month:s,day:t,hour:t,minute:t,second:t,timeZoneName:n},oe={year:t,month:s,day:t,weekday:s,hour:t,minute:t,timeZoneName:s},ue={year:t,month:s,day:t,weekday:s,hour:t,minute:t,second:t,timeZoneName:s};function O(e){return void 0===e}function c(e){return"number"==typeof e}function le(e){return"number"==typeof e&&e%1==0}function ce(e){return"[object Date]"===Object.prototype.toString.call(e)}function he(){try{return"undefined"!=typeof Intl&&!!Intl.RelativeTimeFormat}catch(e){return!1}}function de(e){return Array.isArray(e)?e:[e]}function me(e,r,n){if(0!==e.length)return e.reduce((e,t)=>{t=[r(t),t];return e&&n(e[0],t[0])===e[0]?e:t},null)[1]}function h(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function u(e,t,r){return le(e)&&t<=e&&e<=r}function l(e,t=2){let r;return r=e<0?"-"+(""+-e).padStart(t,"0"):(""+e).padStart(t,"0")}function d(e){if(!O(e)&&null!==e&&""!==e)return parseInt(e,10)}function m(e){if(!O(e)&&null!==e&&""!==e)return parseFloat(e)}function fe(e){if(!O(e)&&null!==e&&""!==e)return e=1e3*parseFloat("0."+e),Math.floor(e)}function ye(e,t,r=!1){const n=10**t,s=r?Math.trunc:Math.round;return s(e*n)/n}function ge(e){return e%4==0&&(e%100!=0||e%400==0)}function we(e){return ge(e)?366:365}function ve(e,t){var r,n=(n=t-1)-(r=12)*Math.floor(n/r)+1;return 2==n?ge(e+(t-n)/12)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][n-1]}function pe(e){let t=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond);return e.year<100&&0<=e.year&&(t=new Date(t)).setUTCFullYear(t.getUTCFullYear()-1900),+t}function Te(e){var t=(e+Math.floor(e/4)-Math.floor(e/100)+Math.floor(e/400))%7,e=e-1,e=(e+Math.floor(e/4)-Math.floor(e/100)+Math.floor(e/400))%7;return 4==t||3==e?53:52}function Se(e){return 99"timezonename"===e.type.toLowerCase());return n?n.value:null}function be(e,t){let r=parseInt(e,10);Number.isNaN(r)&&(r=0);e=parseInt(t,10)||0,t=r<0||Object.is(r,-0)?-e:e;return 60*r+t}function ke(e){var t=Number(e);if("boolean"==typeof e||""===e||Number.isNaN(t))throw new o("Invalid unit value "+e);return t}function Me(e,t){const r={};for(const s in e){var n;!h(e,s)||null!=(n=e[s])&&(r[t(s)]=ke(n))}return r}function Ne(e,t){var r=Math.trunc(Math.abs(e/60)),n=Math.trunc(Math.abs(e%60)),s=0<=e?"+":"-";switch(t){case"short":return s+l(r,2)+":"+l(n,2);case"narrow":return s+r+(0(e[t]=r[t],e),{});var r}n=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;const Ee=["January","February","March","April","May","June","July","August","September","October","November","December"],Ve=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Ie=["J","F","M","A","M","J","J","A","S","O","N","D"];function xe(e){switch(e){case"narrow":return[...Ie];case"short":return[...Ve];case"long":return[...Ee];case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}const Ce=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],Fe=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],Ze=["M","T","W","T","F","S","S"];function Le(e){switch(e){case"narrow":return[...Ze];case"short":return[...Fe];case"long":return[...Ce];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}const ze=["AM","PM"],qe=["Before Christ","Anno Domini"],Ae=["BC","AD"],je=["B","A"];function _e(e){switch(e){case"narrow":return[...je];case"short":return[...Ae];case"long":return[...qe];default:return null}}function Ue(e){return ze[e.hour<12?0:1]}function $e(e,t){return Le(t)[e.weekday-1]}function He(e,t){return xe(t)[e.month-1]}function We(e,t){return _e(t)[e.year<0?0:1]}function Re(e,t,r="always",n=!1){var s={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},i=-1===["hours","minutes","seconds"].indexOf(e);if("auto"===r&&i){var a="days"===e;switch(t){case 1:return a?"tomorrow":"next "+s[e][0];case-1:return a?"yesterday":"last "+s[e][0];case 0:return a?"today":"this "+s[e][0]}}var r=Object.is(t,-0)||t<0,i=Math.abs(t),t=1===i,o=s[e],n=n?!t&&o[2]||o[1]:t?s[e][0]:e;return r?i+` ${n} ago`:`in ${i} `+n}function Je(e,t){let r="";for(const n of e)n.literal?r+=n.val:r+=t(n.val);return r}const Ye={D:U,DD:$,DDD:W,DDDD:R,t:J,tt:Y,ttt:P,tttt:G,T:B,TT:Q,TTT:K,TTTT:X,f:ee,ff:re,fff:ie,ffff:oe,F:te,FF:ne,FFF:ae,FFFF:ue};class f{static create(e,t={}){return new f(e,t)}static parseFormat(t){let r=null,n="",s=!1;const i=[];for(let e=0;ethis.loc.extract(r,e,t),i=e=>r.isOffsetFixed&&0===r.offset&&e.allowZ?"Z":r.isValid?r.zone.formatOffset(r.ts,e.format):"",a=()=>n?Ue(r):s({hour:"numeric",hourCycle:"h12"},"dayperiod"),o=(e,t)=>n?He(r,e):s(t?{month:e}:{month:e,day:"numeric"},"month"),u=(e,t)=>n?$e(r,e):s(t?{weekday:e}:{weekday:e,month:"long",day:"numeric"},"weekday"),l=e=>{var t=f.macroTokenToFormatOpts(e);return t?this.formatWithSystemDefault(r,t):e},c=e=>n?We(r,e):s({era:e},"era");return Je(f.parseFormat(e),e=>{switch(e){case"S":return this.num(r.millisecond);case"u":case"SSS":return this.num(r.millisecond,3);case"s":return this.num(r.second);case"ss":return this.num(r.second,2);case"uu":return this.num(Math.floor(r.millisecond/10),2);case"uuu":return this.num(Math.floor(r.millisecond/100));case"m":return this.num(r.minute);case"mm":return this.num(r.minute,2);case"h":return this.num(r.hour%12==0?12:r.hour%12);case"hh":return this.num(r.hour%12==0?12:r.hour%12,2);case"H":return this.num(r.hour);case"HH":return this.num(r.hour,2);case"Z":return i({format:"narrow",allowZ:this.opts.allowZ});case"ZZ":return i({format:"short",allowZ:this.opts.allowZ});case"ZZZ":return i({format:"techie",allowZ:this.opts.allowZ});case"ZZZZ":return r.zone.offsetName(r.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return r.zone.offsetName(r.ts,{format:"long",locale:this.loc.locale});case"z":return r.zoneName;case"a":return a();case"d":return t?s({day:"numeric"},"day"):this.num(r.day);case"dd":return t?s({day:"2-digit"},"day"):this.num(r.day,2);case"c":return this.num(r.weekday);case"ccc":return u("short",!0);case"cccc":return u("long",!0);case"ccccc":return u("narrow",!0);case"E":return this.num(r.weekday);case"EEE":return u("short",!1);case"EEEE":return u("long",!1);case"EEEEE":return u("narrow",!1);case"L":return t?s({month:"numeric",day:"numeric"},"month"):this.num(r.month);case"LL":return t?s({month:"2-digit",day:"numeric"},"month"):this.num(r.month,2);case"LLL":return o("short",!0);case"LLLL":return o("long",!0);case"LLLLL":return o("narrow",!0);case"M":return t?s({month:"numeric"},"month"):this.num(r.month);case"MM":return t?s({month:"2-digit"},"month"):this.num(r.month,2);case"MMM":return o("short",!1);case"MMMM":return o("long",!1);case"MMMMM":return o("narrow",!1);case"y":return t?s({year:"numeric"},"year"):this.num(r.year);case"yy":return t?s({year:"2-digit"},"year"):this.num(r.year.toString().slice(-2),2);case"yyyy":return t?s({year:"numeric"},"year"):this.num(r.year,4);case"yyyyyy":return t?s({year:"numeric"},"year"):this.num(r.year,6);case"G":return c("short");case"GG":return c("long");case"GGGGG":return c("narrow");case"kk":return this.num(r.weekYear.toString().slice(-2),2);case"kkkk":return this.num(r.weekYear,4);case"W":return this.num(r.weekNumber);case"WW":return this.num(r.weekNumber,2);case"o":return this.num(r.ordinal);case"ooo":return this.num(r.ordinal,3);case"q":return this.num(r.quarter);case"qq":return this.num(r.quarter,2);case"X":return this.num(Math.floor(r.ts/1e3));case"x":return this.num(r.ts);default:return l(e)}})}formatDurationFromString(e,t){const r=e=>{switch(e[0]){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":return"hour";case"d":return"day";case"w":return"week";case"M":return"month";case"y":return"year";default:return null}},n=f.parseFormat(t),s=n.reduce((e,{literal:t,val:r})=>t?e:e.concat(r),[]),i=e.shiftTo(...s.map(r).filter(e=>e));return Je(n,(a=i,e=>{var t=r(e);return t?this.num(a.get(t),e.length):e}));var a}}class y{constructor(e,t){this.reason=e,this.explanation=t}toMessage(){return this.explanation?this.reason+": "+this.explanation:this.reason}}class i{get type(){throw new r}get name(){throw new r}get ianaName(){return this.name}get isUniversal(){throw new r}offsetName(e,t){throw new r}formatOffset(e,t){throw new r}offset(e){throw new r}equals(e){throw new r}get isValid(){throw new r}}let Pe=null;class Ge extends i{static get instance(){return Pe=null===Pe?new Ge:Pe}get type(){return"system"}get name(){return(new Intl.DateTimeFormat).resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(e,{format:t,locale:r}){return Oe(e,t,r)}formatOffset(e,t){return Ne(this.offset(e),t)}offset(e){return-new Date(e).getTimezoneOffset()}equals(e){return"system"===e.type}get isValid(){return!0}}let Be={};function Qe(e){return Be[e]||(Be[e]=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"})),Be[e]}const Ke={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};function Xe(e,t){var e=e.format(t).replace(/\u200E/g,""),[,t,e,r,n,s,i,a]=/(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(e);return[r,t,e,n,s,i,a]}function et(e,t){var r=e.formatToParts(t);const n=[];for(let e=0;eDate.now(),it="system",at=null,ot=null,ut=null,lt;class k{static get now(){return st}static set now(e){st=e}static set defaultZone(e){it=e}static get defaultZone(){return b(it,Ge.instance)}static get defaultLocale(){return at}static set defaultLocale(e){at=e}static get defaultNumberingSystem(){return ot}static set defaultNumberingSystem(e){ot=e}static get defaultOutputCalendar(){return ut}static set defaultOutputCalendar(e){ut=e}static get throwOnInvalid(){return lt}static set throwOnInvalid(e){lt=e}static resetCaches(){M.resetCache(),w.resetCache()}}let ct={};function ht(e,t={}){var r=JSON.stringify([e,t]);let n=ct[r];return n||(n=new Intl.ListFormat(e,t),ct[r]=n),n}let dt={};function mt(e,t={}){var r=JSON.stringify([e,t]);let n=dt[r];return n||(n=new Intl.DateTimeFormat(e,t),dt[r]=n),n}let ft={};function yt(e,t={}){var r=JSON.stringify([e,t]);let n=ft[r];return n||(n=new Intl.NumberFormat(e,t),ft[r]=n),n}let gt={};function wt(e,t={}){const{base:r,...n}=t;var s=JSON.stringify([e,n]);let i=gt[s];return i||(i=new Intl.RelativeTimeFormat(e,t),gt[s]=i),i}let vt=null;function pt(){return vt=vt||(new Intl.DateTimeFormat).resolvedOptions().locale}function Tt(e){var r=e.indexOf("-u-");if(-1===r)return[e];{let t;r=e.substring(0,r);try{t=mt(e).resolvedOptions()}catch(e){t=mt(r).resolvedOptions()}var{numberingSystem:e,calendar:n}=t;return[r,e,n]}}function St(e,t,r){return(r||t)&&(e+="-u",r&&(e+="-ca-"+r),t&&(e+="-nu-"+t)),e}function Ot(t){const r=[];for(let e=1;e<=12;e++){var n=L.utc(2016,e,1);r.push(t(n))}return r}function bt(t){const r=[];for(let e=1;e<=7;e++){var n=L.utc(2016,11,13+e);r.push(t(n))}return r}function kt(e,t,r,n,s){e=e.listingMode(r);return"error"===e?null:("en"===e?n:s)(t)}function Mt(e){return(!e.numberingSystem||"latn"===e.numberingSystem)&&("latn"===e.numberingSystem||!e.locale||e.locale.startsWith("en")||"latn"===new Intl.DateTimeFormat(e.intl).resolvedOptions().numberingSystem)}class Nt{constructor(e,t,r){this.padTo=r.padTo||0,this.floor=r.floor||!1;const{padTo:n,floor:s,...i}=r;if(!t||0{const t=n?{month:r,day:"numeric"}:{month:r},e=n?"format":"standalone";return this.monthsCache[e][r]||(this.monthsCache[e][r]=Ot(e=>this.extract(e,t,"month"))),this.monthsCache[e][r]})}weekdays(r,n=!1,e=!0){return kt(this,r,e,Le,()=>{const t=n?{weekday:r,year:"numeric",month:"long",day:"numeric"}:{weekday:r},e=n?"format":"standalone";return this.weekdaysCache[e][r]||(this.weekdaysCache[e][r]=bt(e=>this.extract(e,t,"weekday"))),this.weekdaysCache[e][r]})}meridiems(e=!0){return kt(this,void 0,e,()=>ze,()=>{if(!this.meridiemCache){const t={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[L.utc(2016,11,13,9),L.utc(2016,11,13,19)].map(e=>this.extract(e,t,"dayperiod"))}return this.meridiemCache})}eras(e,t=!0){return kt(this,e,t,_e,()=>{const t={era:e};return this.eraCache[e]||(this.eraCache[e]=[L.utc(-40,1,1),L.utc(2017,1,1)].map(e=>this.extract(e,t,"era"))),this.eraCache[e]})}extract(e,t,r){const n=this.dtFormatter(e,t),s=n.formatToParts(),i=s.find(e=>e.type.toLowerCase()===r);return i?i.value:null}numberFormatter(e={}){return new Nt(this.intl,e.forceSimple||this.fastNumbers,e)}dtFormatter(e,t={}){return new Dt(e,this.intl,t)}relFormatter(e={}){return new Et(this.intl,this.isEnglish(),e)}listFormatter(e={}){return ht(this.intl,e)}isEnglish(){return"en"===this.locale||"en-us"===this.locale.toLowerCase()||new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us")}equals(e){return this.locale===e.locale&&this.numberingSystem===e.numberingSystem&&this.outputCalendar===e.outputCalendar}}function a(...e){e=e.reduce((e,t)=>e+t.source,"");return RegExp(`^${e}$`)}function g(...e){return i=>e.reduce(([e,t,r],n)=>{var[n,r,s]=n(i,r);return[{...e,...n},r||t,s]},[{},null,1]).slice(0,2)}function p(e,...t){if(null!=e)for(var[r,n]of t){r=r.exec(e);if(r)return n(r)}return[null,null]}function Vt(...s){return(e,t)=>{const r={};let n;for(n=0;nvoid 0!==e&&(t||e&&l)?-e:e;return[{years:c(m(t)),months:c(m(r)),weeks:c(m(n)),days:c(m(s)),hours:c(m(i)),minutes:c(m(a)),seconds:c(m(o),"-0"===o),milliseconds:c(fe(u),e)}]}const jt={GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function _t(e,t,r,n,s,i,a){const o={year:2===t.length?Se(d(t)):d(t),month:Ve.indexOf(r)+1,day:d(n),hour:d(s),minute:d(i)};return a&&(o.second=d(a)),e&&(o.weekday=3O(n[t])?e:(e&&wr(r,n,e,n,t),t),null)}class V{constructor(e){var t="longterm"===e.conversionAccuracy||!1;this.values=e.values,this.loc=e.loc||M.create(),this.conversionAccuracy=t?"longterm":"casual",this.invalid=e.invalid||null,this.matrix=t?yr:mr,this.isLuxonDuration=!0}static fromMillis(e,t){return V.fromObject({milliseconds:e},t)}static fromObject(e,t={}){if(null==e||"object"!=typeof e)throw new o("Duration.fromObject: argument expected to be an object, got "+(null===e?"null":typeof e));return new V({values:Me(e,V.normalizeUnit),loc:M.fromObject(t),conversionAccuracy:t.conversionAccuracy})}static fromDurationLike(e){if(c(e))return V.fromMillis(e);if(V.isDuration(e))return e;if("object"==typeof e)return V.fromObject(e);throw new o(`Unknown duration argument ${e} of type `+typeof e)}static fromISO(e,t){var[r]=ir(e);return r?V.fromObject(r,t):V.invalid("unparsable",`the input "${e}" can't be parsed as ISO 8601`)}static fromISOTime(e,t){var[r]=or(e);return r?V.fromObject(r,t):V.invalid("unparsable",`the input "${e}" can't be parsed as ISO 8601`)}static invalid(e,t=null){if(!e)throw new o("need to specify a reason the Duration is invalid");e=e instanceof y?e:new y(e,t);if(k.throwOnInvalid)throw new A(e);return new V({invalid:e})}static normalizeUnit(e){var t={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[e&&e.toLowerCase()];if(t)return t;throw new _(e)}static isDuration(e){return e&&e.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(e,t={}){t={...t,floor:!1!==t.round&&!1!==t.floor};return this.isValid?f.create(this.loc,t).formatDurationFromString(this,e):"Invalid Duration"}toHuman(r={}){var e=D.map(e=>{var t=this.values[e];return O(t)?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...r,unit:e.slice(0,-1)}).format(t)}).filter(e=>e);return this.loc.listFormatter({type:"conjunction",style:r.listStyle||"narrow",...r}).format(e)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let e="P";return 0!==this.years&&(e+=this.years+"Y"),0===this.months&&0===this.quarters||(e+=this.months+3*this.quarters+"M"),0!==this.weeks&&(e+=this.weeks+"W"),0!==this.days&&(e+=this.days+"D"),0===this.hours&&0===this.minutes&&0===this.seconds&&0===this.milliseconds||(e+="T"),0!==this.hours&&(e+=this.hours+"H"),0!==this.minutes&&(e+=this.minutes+"M"),0===this.seconds&&0===this.milliseconds||(e+=ye(this.seconds+this.milliseconds/1e3,3)+"S"),"P"===e&&(e+="T0S"),e}toISOTime(e={}){if(!this.isValid)return null;var t=this.toMillis();if(t<0||864e5<=t)return null;e={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...e};const r=this.shiftTo("hours","minutes","seconds","milliseconds");let n="basic"===e.format?"hhmm":"hh:mm",s=(e.suppressSeconds&&0===r.seconds&&0===r.milliseconds||(n+="basic"===e.format?"ss":":ss",e.suppressMilliseconds&&0===r.milliseconds||(n+=".SSS")),r.toFormat(n));return s=e.includePrefix?"T"+s:s}toJSON(){return this.toISO()}toString(){return this.toISO()}toMillis(){return this.as("milliseconds")}valueOf(){return this.toMillis()}plus(e){if(!this.isValid)return this;const t=V.fromDurationLike(e),r={};for(const n of D)(h(t.values,n)||h(this.values,n))&&(r[n]=t.get(n)+this.get(n));return E(this,{values:r},!0)}minus(e){if(!this.isValid)return this;const t=V.fromDurationLike(e);return this.plus(t.negate())}mapUnits(e){if(!this.isValid)return this;const t={};for(const r of Object.keys(this.values))t[r]=ke(e(this.values[r],r));return E(this,{values:t},!0)}get(e){return this[V.normalizeUnit(e)]}set(e){return this.isValid?E(this,{values:{...this.values,...Me(e,V.normalizeUnit)}}):this}reconfigure({locale:e,numberingSystem:t,conversionAccuracy:r}={}){const n=this.loc.clone({locale:e,numberingSystem:t}),s={loc:n};return r&&(s.conversionAccuracy=r),E(this,s)}as(e){return this.isValid?this.shiftTo(e).get(e):NaN}normalize(){if(!this.isValid)return this;var e=this.toObject();return vr(this.matrix,e),E(this,{values:e},!0)}shiftTo(...e){if(!this.isValid)return this;if(0===e.length)return this;e=e.map(e=>V.normalizeUnit(e));const t={},r={},n=this.toObject();let s;for(const a of D)if(0<=e.indexOf(a)){s=a;let e=0;for(const o in r)e+=this.matrix[o][a]*r[o],r[o]=0;c(n[a])&&(e+=n[a]);var i=Math.trunc(e);t[a]=i,r[a]=(1e3*e-1e3*i)/1e3;for(const u in n)D.indexOf(u)>D.indexOf(a)&&wr(this.matrix,n,u,t,a)}else c(n[a])&&(r[a]=n[a]);for(const l in r)0!==r[l]&&(t[s]+=l===s?r[l]:r[l]/this.matrix[s][l]);return E(this,{values:t},!0).normalize()}negate(){if(!this.isValid)return this;const e={};for(const t of Object.keys(this.values))e[t]=0===this.values[t]?0:-this.values[t];return E(this,{values:e},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return null===this.invalid}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(e){if(!this.isValid||!e.isValid)return!1;if(!this.loc.equals(e.loc))return!1;for(const n of D)if(t=this.values[n],r=e.values[n],!(void 0===t||0===t?void 0===r||0===r:t===r))return!1;var t,r;return!0}}const pr="Invalid Interval";function Tr(e,t){return e&&e.isValid?t&&t.isValid?te}isBefore(e){return!!this.isValid&&this.e<=e}contains(e){return!!this.isValid&&(this.s<=e&&this.e>e)}set({start:e,end:t}={}){return this.isValid?I.fromDateTimes(e||this.s,t||this.e):this}splitAt(...e){if(!this.isValid)return[];const t=e.map(Sn).filter(e=>this.contains(e)).sort(),r=[];let n=this["s"],s=0;for(;n+this.e?this.e:i;r.push(I.fromDateTimes(n,i)),n=i,s+=1}return r}splitBy(e){const t=V.fromDurationLike(e);if(!this.isValid||!t.isValid||0===t.as("milliseconds"))return[];let r=this["s"],n=1,s;const i=[];for(;re*n));s=+a>+this.e?this.e:a,i.push(I.fromDateTimes(r,s)),r=s,n+=1}return i}divideEqually(e){return this.isValid?this.splitBy(this.length()/e).slice(0,e):[]}overlaps(e){return this.e>e.s&&this.s=e.e)}equals(e){return!(!this.isValid||!e.isValid)&&(this.s.equals(e.s)&&this.e.equals(e.e))}intersection(e){if(!this.isValid)return this;var t=(this.s>e.s?this:e).s,e=(this.ee.e?this:e).e;return I.fromDateTimes(t,e)}static merge(e){const[t,r]=e.sort((e,t)=>e.s-t.s).reduce(([e,t],r)=>t?t.overlaps(r)||t.abutsStart(r)?[e,t.union(r)]:[e.concat([t]),r]:[e,r],[[],null]);return r&&t.push(r),t}static xor(e){let t=null,r=0;const n=[],s=e.map(e=>[{time:e.s,type:"s"},{time:e.e,type:"e"}]),i=Array.prototype.concat(...s),a=i.sort((e,t)=>e.time-t.time);for(const o of a)r+="s"===o.type?1:-1,t=1===r?o.time:(t&&+t!=+o.time&&n.push(I.fromDateTimes(t,o.time)),null);return I.merge(n)}difference(...e){return I.xor([this].concat(e)).map(e=>this.intersection(e)).filter(e=>e&&!e.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} – ${this.e.toISO()})`:pr}toISO(e){return this.isValid?this.s.toISO(e)+"/"+this.e.toISO(e):pr}toISODate(){return this.isValid?this.s.toISODate()+"/"+this.e.toISODate():pr}toISOTime(e){return this.isValid?this.s.toISOTime(e)+"/"+this.e.toISOTime(e):pr}toFormat(e,{separator:t=" – "}={}){return this.isValid?""+this.s.toFormat(e)+t+this.e.toFormat(e):pr}toDuration(e,t){return this.isValid?this.e.diff(this.s,e,t):V.invalid(this.invalidReason)}mapEndpoints(e){return I.fromDateTimes(e(this.s),e(this.e))}}class Sr{static hasDST(e=k.defaultZone){const t=L.now().setZone(e).set({month:12});return!e.isUniversal&&t.offset!==t.set({month:6}).offset}static isValidIANAZone(e){return w.isValidZone(e)}static normalizeZone(e){return b(e,k.defaultZone)}static months(e="long",{locale:t=null,numberingSystem:r=null,locObj:n=null,outputCalendar:s="gregory"}={}){return(n||M.create(t,r,s)).months(e)}static monthsFormat(e="long",{locale:t=null,numberingSystem:r=null,locObj:n=null,outputCalendar:s="gregory"}={}){return(n||M.create(t,r,s)).months(e,!0)}static weekdays(e="long",{locale:t=null,numberingSystem:r=null,locObj:n=null}={}){return(n||M.create(t,r,null)).weekdays(e)}static weekdaysFormat(e="long",{locale:t=null,numberingSystem:r=null,locObj:n=null}={}){return(n||M.create(t,r,null)).weekdays(e,!0)}static meridiems({locale:e=null}={}){return M.create(e).meridiems()}static eras(e="short",{locale:t=null}={}){return M.create(t,null,"gregory").eras(e)}static features(){return{relative:he()}}}function Or(e,t){var r=e=>e.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),t=r(t)-r(e);return Math.floor(V.fromMillis(t).as("days"))}function br(e,t,r,n){let[s,i,a,o]=function(t,r,e){var n,s;const i={};let a,o;for([n,s]of[["years",(e,t)=>t.year-e.year],["quarters",(e,t)=>t.quarter-e.quarter],["months",(e,t)=>t.month-e.month+12*(t.year-e.year)],["weeks",(e,t)=>{e=Or(e,t);return(e-e%7)/7}],["days",Or]])if(0<=e.indexOf(n)){a=n;let e=s(t,r);(o=t.plus({[n]:e}))>r?(t=t.plus({[n]:e-1}),--e):t=o,i[n]=e}return[t,i,o,a]}(e,t,r);e=t-s,r=r.filter(e=>0<=["hours","minutes","seconds","milliseconds"].indexOf(e)),0===r.length&&(a=ae){return{regex:e,deser:([e])=>t(function(t){let r=parseInt(t,10);if(isNaN(r)){r="";for(let e=0;ee.findIndex(e=>xr(t)===xr(e))+r}}function Cr(e,t){return{regex:e,deser:([,e,t])=>be(e,t),groups:t}}function Fr(e){return{regex:e,deser:([e])=>e}}const Zr={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour:{numeric:"h","2-digit":"hh"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"}};let Lr=null;function zr(e,t){if(e.literal)return e;const s=f.macroTokenToFormatOpts(e.val);if(!s)return e;const r=f.create(t,s),n=r.formatDateTimeParts(Lr=Lr||L.fromMillis(1555555555555)),i=n.map(t=>{{var r=s,{type:t,value:n}=t;if("literal"===t)return{literal:!0,val:n};n=r[t];let e=Zr[t];return(e="object"==typeof e?e[n]:e)?{literal:!1,val:e}:void 0}});return i.includes(void 0)?e:i}function qr(g,e,t){t=f.parseFormat(t),i=g;const r=Array.prototype.concat(...t.map(e=>zr(e,i))),n=r.map(e=>{{var t=e,r=g;const n=x(r),s=x(r,"{2}"),i=x(r,"{3}"),a=x(r,"{4}"),o=x(r,"{6}"),u=x(r,"{1,2}"),l=x(r,"{1,3}"),c=x(r,"{1,6}"),h=x(r,"{1,9}"),d=x(r,"{2,4}"),m=x(r,"{4,6}"),f=e=>({regex:RegExp(e.val.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")),deser:([e])=>e,literal:!0}),y=(e=>{if(t.literal)return f(e);switch(e.val){case"G":return F(r.eras("short",!1),0);case"GG":return F(r.eras("long",!1),0);case"y":return C(c);case"yy":return C(d,Se);case"yyyy":return C(a);case"yyyyy":return C(m);case"yyyyyy":return C(o);case"M":return C(u);case"MM":return C(s);case"MMM":return F(r.months("short",!0,!1),1);case"MMMM":return F(r.months("long",!0,!1),1);case"L":return C(u);case"LL":return C(s);case"LLL":return F(r.months("short",!1,!1),1);case"LLLL":return F(r.months("long",!1,!1),1);case"d":return C(u);case"dd":return C(s);case"o":return C(l);case"ooo":return C(i);case"HH":return C(s);case"H":return C(u);case"hh":return C(s);case"h":return C(u);case"mm":return C(s);case"m":case"q":return C(u);case"qq":return C(s);case"s":return C(u);case"ss":return C(s);case"S":return C(l);case"SSS":return C(i);case"u":return Fr(h);case"uu":return Fr(u);case"uuu":return C(n);case"a":return F(r.meridiems(),0);case"kkkk":return C(a);case"kk":return C(d,Se);case"W":return C(u);case"WW":return C(s);case"E":case"c":return C(n);case"EEE":return F(r.weekdays("short",!1,!1),1);case"EEEE":return F(r.weekdays("long",!1,!1),1);case"ccc":return F(r.weekdays("short",!0,!1),1);case"cccc":return F(r.weekdays("long",!0,!1),1);case"Z":case"ZZ":return Cr(new RegExp(`([+-]${u.source})(?::(${s.source}))?`),2);case"ZZZ":return Cr(new RegExp(`([+-]${u.source})(${s.source})?`),2);case"z":return Fr(/[a-z_+-/]{1,256}?/i);default:return f(e)}})(t)||{invalidReason:Dr};return y.token=t,y}}),s=n.find(e=>e.invalidReason);var i;if(s)return{input:e,tokens:r,invalidReason:s.invalidReason};var[t,a]=[`^${(t=n).map(e=>e.regex).reduce((e,t)=>`${e}(${t.source})`,"")}$`,t],t=RegExp(t,"i"),[a,o]=function(e,t,r){const n=e.match(t);if(n){const s={};let e=1;for(const i in r)if(h(r,i)){const a=r[i],o=a.groups?a.groups+1:1;!a.literal&&a.token&&(s[a.token.val[0]]=a.deser(n.slice(e,e+o))),e+=o}return[n,s]}return[n,{}]}(e,t,a),[u,l,c]=o?function(n){let e=null,t;return O(n.z)||(e=w.create(n.z)),O(n.Z)||(e=e||new v(n.Z),t=n.Z),O(n.q)||(n.M=3*(n.q-1)+1),O(n.h)||(n.h<12&&1===n.a?n.h+=12:12===n.h&&0===n.a&&(n.h=0)),0===n.G&&n.y&&(n.y=-n.y),O(n.u)||(n.S=fe(n.u)),[Object.keys(n).reduce((e,t)=>{var r=(e=>{switch(e){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}})(t);return r&&(e[r]=n[t]),e},{}),e,t]}(o):[null,null,void 0];if(h(o,"a")&&h(o,"H"))throw new j("Can't include meridiem when specifying 24-hour format");return{input:e,tokens:r,regex:t,rawMatches:a,matches:o,result:u,zone:l,specificOffset:c}}function Ar(e,t,r){var{result:e,zone:t,specificOffset:r,invalidReason:n}=qr(e,t,r);return[e,t,r,n]}const jr=[0,31,59,90,120,151,181,212,243,273,304,334],_r=[0,31,60,91,121,152,182,213,244,274,305,335];function Z(e,t){return new y("unit out of range",`you specified ${t} (of type ${typeof t}) as a ${e}, which is invalid`)}function Ur(e,t,r){const n=new Date(Date.UTC(e,t-1,r));e<100&&0<=e&&n.setUTCFullYear(n.getUTCFullYear()-1900);t=n.getUTCDay();return 0===t?7:t}function $r(e,t,r){return r+(ge(e)?_r:jr)[t-1]}function Hr(e,t){const r=ge(e)?_r:jr,n=r.findIndex(e=>eTe(t)?(a=t+1,i=1):a=t,{weekYear:a,weekNumber:i,weekday:r,...De(e)}}function Rr(e){var{weekYear:t,weekNumber:r,weekday:n}=e,s=Ur(t,1,4),i=we(t);let a=7*r+n-s-3,o;a<1?(o=t-1,a+=we(o)):a>i?(o=t+1,a-=we(t)):o=t;var{month:r,day:n}=Hr(o,a);return{year:o,month:r,day:n,...De(e)}}function Jr(e){var{year:t,month:r,day:n}=e;return{year:t,ordinal:$r(t,r,n),...De(e)}}function Yr(e){var{year:t,ordinal:r}=e,{month:r,day:n}=Hr(t,r);return{year:t,month:r,day:n,...De(e)}}function Pr(e){var t=le(e.weekYear),r=u(e.weekNumber,1,Te(e.weekYear)),n=u(e.weekday,1,7);return t?r?!n&&Z("weekday",e.weekday):Z("week",e.week):Z("weekYear",e.weekYear)}function Gr(e){var t=le(e.year),r=u(e.ordinal,1,we(e.year));return t?!r&&Z("ordinal",e.ordinal):Z("year",e.year)}function Br(e){var t=le(e.year),r=u(e.month,1,12),n=u(e.day,1,ve(e.year,e.month));return t?r?!n&&Z("day",e.day):Z("month",e.month):Z("year",e.year)}function Qr(e){var{hour:e,minute:t,second:r,millisecond:n}=e,s=u(e,0,23)||24===e&&0===t&&0===r&&0===n,i=u(t,0,59),a=u(r,0,59),o=u(n,0,999);return s?i?a?!o&&Z("millisecond",n):Z("second",r):Z("minute",t):Z("hour",e)}const Kr="Invalid DateTime";function Xr(e){return new y("unsupported zone",`the zone "${e.name}" is not supported`)}function en(e){return null===e.weekData&&(e.weekData=Wr(e.c)),e.weekData}function tn(e,t){e={ts:e.ts,zone:e.zone,c:e.c,o:e.o,loc:e.loc,invalid:e.invalid};return new L({...e,...t,old:e})}function rn(e,t,r){let n=e-60*t*1e3;var s=r.offset(n);if(t===s)return[n,t];n-=60*(s-t)*1e3;t=r.offset(n);return s===t?[n,s]:[e-60*Math.min(s,t)*1e3,Math.max(s,t)]}function nn(e,t){e+=60*t*1e3;const r=new Date(e);return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate(),hour:r.getUTCHours(),minute:r.getUTCMinutes(),second:r.getUTCSeconds(),millisecond:r.getUTCMilliseconds()}}function sn(e,t,r){return rn(pe(e),t,r)}function an(e,t){var r=e.o,n=e.c.year+Math.trunc(t.years),s=e.c.month+Math.trunc(t.months)+3*Math.trunc(t.quarters),n={...e.c,year:n,month:s,day:Math.min(e.c.day,ve(n,s))+Math.trunc(t.days)+7*Math.trunc(t.weeks)},s=V.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as("milliseconds");let[i,a]=rn(pe(n),r,e.zone);return 0!==s&&(i+=s,a=e.zone.offset(i)),{ts:i,o:a}}function on(e,t,r,n,s,i){var{setZone:a,zone:o}=r;if(e&&0!==Object.keys(e).length){const u=t||o,l=L.fromObject(e,{...r,zone:u,specificOffset:i});return a?l:l.setZone(o)}return L.invalid(new y("unparsable",`the input "${s}" can't be parsed as `+n))}function un(e,t,r=!0){return e.isValid?f.create(M.create("en-US"),{allowZ:r,forceSimple:!0}).formatDateTimeFromString(e,t):null}function ln(e,t){var r=9999{e=ye(e,i||s.calendary?0:2,!0);const r=n.loc.clone(s).relFormatter(s);return r.format(e,t)},r=e=>s.calendary?n.hasSame(t,e)?0:n.startOf(e).diff(t.startOf(e),e).get(e):n.diff(t,e).get(e);if(s.unit)return e(r(s.unit),s.unit);for(const o of s.units){var a=r(o);if(1<=Math.abs(a))return e(a,o)}return e(nthis.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset)}get isInLeapYear(){return ge(this.year)}get daysInMonth(){return ve(this.year,this.month)}get daysInYear(){return this.isValid?we(this.year):NaN}get weeksInWeekYear(){return this.isValid?Te(this.weekYear):NaN}resolvedLocaleOptions(e={}){var{locale:e,numberingSystem:t,calendar:r}=f.create(this.loc.clone(e),e).resolvedOptions(this);return{locale:e,numberingSystem:t,outputCalendar:r}}toUTC(e=0,t={}){return this.setZone(v.instance(e),t)}toLocal(){return this.setZone(k.defaultZone)}setZone(t,{keepLocalTime:r=!1,keepCalendarTime:n=!1}={}){if((t=b(t,k.defaultZone)).equals(this.zone))return this;if(t.isValid){let e=this.ts;return(r||n)&&(r=t.offset(this.ts),n=this.toObject(),[e]=sn(n,r,t)),tn(this,{ts:e,zone:t})}return L.invalid(Xr(t))}reconfigure({locale:e,numberingSystem:t,outputCalendar:r}={}){e=this.loc.clone({locale:e,numberingSystem:t,outputCalendar:r});return tn(this,{loc:e})}setLocale(e){return this.reconfigure({locale:e})}set(e){if(!this.isValid)return this;var e=Me(e,wn),t=!O(e.weekYear)||!O(e.weekNumber)||!O(e.weekday),r=!O(e.ordinal),n=!O(e.year),s=!O(e.month)||!O(e.day),i=e.weekYear||e.weekNumber;if((n||s||r)&&i)throw new j("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(s&&r)throw new j("Can't mix ordinal dates with month/day");let a;t?a=Rr({...Wr(this.c),...e}):O(e.ordinal)?(a={...this.toObject(),...e},O(e.day)&&(a.day=Math.min(ve(a.year,a.month),a.day))):a=Yr({...Jr(this.c),...e});var[n,i]=sn(a,this.o,this.zone);return tn(this,{ts:n,o:i})}plus(e){return this.isValid?tn(this,an(this,V.fromDurationLike(e))):this}minus(e){return this.isValid?tn(this,an(this,V.fromDurationLike(e).negate())):this}startOf(e){if(!this.isValid)return this;const t={},r=V.normalizeUnit(e);switch(r){case"years":t.month=1;case"quarters":case"months":t.day=1;case"weeks":case"days":t.hour=0;case"hours":t.minute=0;case"minutes":t.second=0;case"seconds":t.millisecond=0}return"weeks"===r&&(t.weekday=1),"quarters"===r&&(e=Math.ceil(this.month/3),t.month=3*(e-1)+1),this.set(t)}endOf(e){return this.isValid?this.plus({[e]:1}).startOf(e).minus(1):this}toFormat(e,t={}){return this.isValid?f.create(this.loc.redefaultToEN(t)).formatDateTimeFromString(this,e):Kr}toLocaleString(e=U,t={}){return this.isValid?f.create(this.loc.clone(t),e).formatDateTime(this):Kr}toLocaleParts(e={}){return this.isValid?f.create(this.loc.clone(e),e).formatDateTimeParts(this):[]}toISO({format:e="extended",suppressSeconds:t=!1,suppressMilliseconds:r=!1,includeOffset:n=!0,extendedZone:s=!1}={}){if(!this.isValid)return null;var e="extended"===e,i=ln(this,e);return(i+="T")+cn(this,e,t,r,n,s)}toISODate({format:e="extended"}={}){return this.isValid?ln(this,"extended"===e):null}toISOWeekDate(){return un(this,"kkkk-'W'WW-c")}toISOTime({suppressMilliseconds:e=!1,suppressSeconds:t=!1,includeOffset:r=!0,includePrefix:n=!1,extendedZone:s=!1,format:i="extended"}={}){return this.isValid?(n?"T":"")+cn(this,"extended"===i,t,e,r,s):null}toRFC2822(){return un(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)}toHTTP(){return un(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")}toSQLDate(){return this.isValid?ln(this,!0):null}toSQLTime({includeOffset:e=!0,includeZone:t=!1,includeOffsetSpace:r=!0}={}){let n="HH:mm:ss.SSS";return(t||e)&&(r&&(n+=" "),t?n+="z":e&&(n+="ZZ")),un(this,n,!0)}toSQL(e={}){return this.isValid?this.toSQLDate()+" "+this.toSQLTime(e):null}toString(){return this.isValid?this.toISO():Kr}valueOf(){return this.toMillis()}toMillis(){return this.isValid?this.ts:NaN}toSeconds(){return this.isValid?this.ts/1e3:NaN}toUnixInteger(){return this.isValid?Math.floor(this.ts/1e3):NaN}toJSON(){return this.toISO()}toBSON(){return this.toJSDate()}toObject(e={}){if(!this.isValid)return{};const t={...this.c};return e.includeConfig&&(t.outputCalendar=this.outputCalendar,t.numberingSystem=this.loc.numberingSystem,t.locale=this.loc.locale),t}toJSDate(){return new Date(this.isValid?this.ts:NaN)}diff(e,t="milliseconds",r={}){if(!this.isValid||!e.isValid)return V.invalid("created by diffing an invalid DateTime");r={locale:this.locale,numberingSystem:this.numberingSystem,...r};const n=de(t).map(V.normalizeUnit),s=e.valueOf()>this.valueOf(),i=s?this:e,a=s?e:this,o=br(i,a,n,r);return s?o.negate():o}diffNow(e="milliseconds",t={}){return this.diff(L.now(),e,t)}until(e){return this.isValid?I.fromDateTimes(this,e):this}hasSame(e,t){if(!this.isValid)return!1;var r=e.valueOf();const n=this.setZone(e.zone,{keepLocalTime:!0});return n.startOf(t)<=r&&r<=n.endOf(t)}equals(e){return this.isValid&&e.isValid&&this.valueOf()===e.valueOf()&&this.zone.equals(e.zone)&&this.loc.equals(e.loc)}toRelative(e={}){if(!this.isValid)return null;var t=e.base||L.fromObject({},{zone:this.zone}),r=e.padding?thise.valueOf(),Math.min);throw new o("min requires all arguments be DateTimes")}static max(...e){if(e.every(L.isDateTime))return me(e,e=>e.valueOf(),Math.max);throw new o("max requires all arguments be DateTimes")}static fromFormatExplain(e,t,r={}){var{locale:r=null,numberingSystem:n=null}=r;return qr(M.fromOpts({locale:r,numberingSystem:n,defaultToEN:!0}),e,t)}static fromStringExplain(e,t,r={}){return L.fromFormatExplain(e,t,r)}static get DATE_SHORT(){return U}static get DATE_MED(){return $}static get DATE_MED_WITH_WEEKDAY(){return H}static get DATE_FULL(){return W}static get DATE_HUGE(){return R}static get TIME_SIMPLE(){return J}static get TIME_WITH_SECONDS(){return Y}static get TIME_WITH_SHORT_OFFSET(){return P}static get TIME_WITH_LONG_OFFSET(){return G}static get TIME_24_SIMPLE(){return B}static get TIME_24_WITH_SECONDS(){return Q}static get TIME_24_WITH_SHORT_OFFSET(){return K}static get TIME_24_WITH_LONG_OFFSET(){return X}static get DATETIME_SHORT(){return ee}static get DATETIME_SHORT_WITH_SECONDS(){return te}static get DATETIME_MED(){return re}static get DATETIME_MED_WITH_SECONDS(){return ne}static get DATETIME_MED_WITH_WEEKDAY(){return se}static get DATETIME_FULL(){return ie}static get DATETIME_FULL_WITH_SECONDS(){return ae}static get DATETIME_HUGE(){return oe}static get DATETIME_HUGE_WITH_SECONDS(){return ue}}function Sn(e){if(L.isDateTime(e))return e;if(e&&e.valueOf&&c(e.valueOf()))return L.fromJSDate(e);if(e&&"object"==typeof e)return L.fromObject(e);throw new o(`Unknown datetime argument: ${e}, of type `+typeof e)}s="2.5.2";export{L as DateTime,V as Duration,v as FixedOffsetZone,w as IANAZone,Sr as Info,I as Interval,nt as InvalidZone,k as Settings,Ge as SystemZone,s as VERSION,i as Zone}; \ No newline at end of file +class e extends Error{}class z extends e{constructor(e){super("Invalid DateTime: "+e.toMessage())}}class q extends e{constructor(e){super("Invalid Interval: "+e.toMessage())}}class A extends e{constructor(e){super("Invalid Duration: "+e.toMessage())}}class j extends e{}class _ extends e{constructor(e){super("Invalid unit "+e)}}class o extends e{}class r extends e{constructor(){super("Zone is an abstract class")}}var t="numeric",n="short",s="long";const U={year:t,month:t,day:t},$={year:t,month:n,day:t},H={year:t,month:n,day:t,weekday:n},W={year:t,month:s,day:t},R={year:t,month:s,day:t,weekday:s},J={hour:t,minute:t},Y={hour:t,minute:t,second:t},P={hour:t,minute:t,second:t,timeZoneName:n},G={hour:t,minute:t,second:t,timeZoneName:s},B={hour:t,minute:t,hourCycle:"h23"},Q={hour:t,minute:t,second:t,hourCycle:"h23"},K={hour:t,minute:t,second:t,hourCycle:"h23",timeZoneName:n},X={hour:t,minute:t,second:t,hourCycle:"h23",timeZoneName:s},ee={year:t,month:t,day:t,hour:t,minute:t},te={year:t,month:t,day:t,hour:t,minute:t,second:t},re={year:t,month:n,day:t,hour:t,minute:t},ne={year:t,month:n,day:t,hour:t,minute:t,second:t},se={year:t,month:n,day:t,weekday:n,hour:t,minute:t},ie={year:t,month:s,day:t,hour:t,minute:t,timeZoneName:n},ae={year:t,month:s,day:t,hour:t,minute:t,second:t,timeZoneName:n},oe={year:t,month:s,day:t,weekday:s,hour:t,minute:t,timeZoneName:s},ue={year:t,month:s,day:t,weekday:s,hour:t,minute:t,second:t,timeZoneName:s};function O(e){return void 0===e}function c(e){return"number"==typeof e}function le(e){return"number"==typeof e&&e%1==0}function ce(e){return"[object Date]"===Object.prototype.toString.call(e)}function he(){try{return"undefined"!=typeof Intl&&!!Intl.RelativeTimeFormat}catch(e){return!1}}function de(e){return Array.isArray(e)?e:[e]}function me(e,r,n){if(0!==e.length)return e.reduce((e,t)=>{t=[r(t),t];return e&&n(e[0],t[0])===e[0]?e:t},null)[1]}function h(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function u(e,t,r){return le(e)&&t<=e&&e<=r}function l(e,t=2){let r;return r=e<0?"-"+(""+-e).padStart(t,"0"):(""+e).padStart(t,"0")}function d(e){if(!O(e)&&null!==e&&""!==e)return parseInt(e,10)}function m(e){if(!O(e)&&null!==e&&""!==e)return parseFloat(e)}function fe(e){if(!O(e)&&null!==e&&""!==e)return e=1e3*parseFloat("0."+e),Math.floor(e)}function ye(e,t,r=!1){const n=10**t,s=r?Math.trunc:Math.round;return s(e*n)/n}function ge(e){return e%4==0&&(e%100!=0||e%400==0)}function we(e){return ge(e)?366:365}function ve(e,t){var r,n=(n=t-1)-(r=12)*Math.floor(n/r)+1;return 2==n?ge(e+(t-n)/12)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][n-1]}function pe(e){let t=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond);return e.year<100&&0<=e.year&&(t=new Date(t)).setUTCFullYear(t.getUTCFullYear()-1900),+t}function Te(e){var t=(e+Math.floor(e/4)-Math.floor(e/100)+Math.floor(e/400))%7,e=e-1,e=(e+Math.floor(e/4)-Math.floor(e/100)+Math.floor(e/400))%7;return 4==t||3==e?53:52}function Se(e){return 99"timezonename"===e.type.toLowerCase());return n?n.value:null}function be(e,t){let r=parseInt(e,10);Number.isNaN(r)&&(r=0);e=parseInt(t,10)||0,t=r<0||Object.is(r,-0)?-e:e;return 60*r+t}function ke(e){var t=Number(e);if("boolean"==typeof e||""===e||Number.isNaN(t))throw new o("Invalid unit value "+e);return t}function Me(e,t){const r={};for(const s in e){var n;!h(e,s)||null!=(n=e[s])&&(r[t(s)]=ke(n))}return r}function Ne(e,t){var r=Math.trunc(Math.abs(e/60)),n=Math.trunc(Math.abs(e%60)),s=0<=e?"+":"-";switch(t){case"short":return s+l(r,2)+":"+l(n,2);case"narrow":return s+r+(0(e[t]=r[t],e),{});var r}n=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;const Ee=["January","February","March","April","May","June","July","August","September","October","November","December"],Ve=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Ie=["J","F","M","A","M","J","J","A","S","O","N","D"];function xe(e){switch(e){case"narrow":return[...Ie];case"short":return[...Ve];case"long":return[...Ee];case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}const Ce=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],Fe=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],Ze=["M","T","W","T","F","S","S"];function Le(e){switch(e){case"narrow":return[...Ze];case"short":return[...Fe];case"long":return[...Ce];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}const ze=["AM","PM"],qe=["Before Christ","Anno Domini"],Ae=["BC","AD"],je=["B","A"];function _e(e){switch(e){case"narrow":return[...je];case"short":return[...Ae];case"long":return[...qe];default:return null}}function Ue(e){return ze[e.hour<12?0:1]}function $e(e,t){return Le(t)[e.weekday-1]}function He(e,t){return xe(t)[e.month-1]}function We(e,t){return _e(t)[e.year<0?0:1]}function Re(e,t,r="always",n=!1){var s={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},i=-1===["hours","minutes","seconds"].indexOf(e);if("auto"===r&&i){var a="days"===e;switch(t){case 1:return a?"tomorrow":"next "+s[e][0];case-1:return a?"yesterday":"last "+s[e][0];case 0:return a?"today":"this "+s[e][0]}}var r=Object.is(t,-0)||t<0,i=Math.abs(t),t=1===i,o=s[e],n=n?!t&&o[2]||o[1]:t?s[e][0]:e;return r?i+` ${n} ago`:`in ${i} `+n}function Je(e,t){let r="";for(const n of e)n.literal?r+=n.val:r+=t(n.val);return r}const Ye={D:U,DD:$,DDD:W,DDDD:R,t:J,tt:Y,ttt:P,tttt:G,T:B,TT:Q,TTT:K,TTTT:X,f:ee,ff:re,fff:ie,ffff:oe,F:te,FF:ne,FFF:ae,FFFF:ue};class f{static create(e,t={}){return new f(e,t)}static parseFormat(t){let r=null,n="",s=!1;const i=[];for(let e=0;ethis.loc.extract(r,e,t),i=e=>r.isOffsetFixed&&0===r.offset&&e.allowZ?"Z":r.isValid?r.zone.formatOffset(r.ts,e.format):"",a=()=>n?Ue(r):s({hour:"numeric",hourCycle:"h12"},"dayperiod"),o=(e,t)=>n?He(r,e):s(t?{month:e}:{month:e,day:"numeric"},"month"),u=(e,t)=>n?$e(r,e):s(t?{weekday:e}:{weekday:e,month:"long",day:"numeric"},"weekday"),l=e=>{var t=f.macroTokenToFormatOpts(e);return t?this.formatWithSystemDefault(r,t):e},c=e=>n?We(r,e):s({era:e},"era");return Je(f.parseFormat(e),e=>{switch(e){case"S":return this.num(r.millisecond);case"u":case"SSS":return this.num(r.millisecond,3);case"s":return this.num(r.second);case"ss":return this.num(r.second,2);case"uu":return this.num(Math.floor(r.millisecond/10),2);case"uuu":return this.num(Math.floor(r.millisecond/100));case"m":return this.num(r.minute);case"mm":return this.num(r.minute,2);case"h":return this.num(r.hour%12==0?12:r.hour%12);case"hh":return this.num(r.hour%12==0?12:r.hour%12,2);case"H":return this.num(r.hour);case"HH":return this.num(r.hour,2);case"Z":return i({format:"narrow",allowZ:this.opts.allowZ});case"ZZ":return i({format:"short",allowZ:this.opts.allowZ});case"ZZZ":return i({format:"techie",allowZ:this.opts.allowZ});case"ZZZZ":return r.zone.offsetName(r.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return r.zone.offsetName(r.ts,{format:"long",locale:this.loc.locale});case"z":return r.zoneName;case"a":return a();case"d":return t?s({day:"numeric"},"day"):this.num(r.day);case"dd":return t?s({day:"2-digit"},"day"):this.num(r.day,2);case"c":return this.num(r.weekday);case"ccc":return u("short",!0);case"cccc":return u("long",!0);case"ccccc":return u("narrow",!0);case"E":return this.num(r.weekday);case"EEE":return u("short",!1);case"EEEE":return u("long",!1);case"EEEEE":return u("narrow",!1);case"L":return t?s({month:"numeric",day:"numeric"},"month"):this.num(r.month);case"LL":return t?s({month:"2-digit",day:"numeric"},"month"):this.num(r.month,2);case"LLL":return o("short",!0);case"LLLL":return o("long",!0);case"LLLLL":return o("narrow",!0);case"M":return t?s({month:"numeric"},"month"):this.num(r.month);case"MM":return t?s({month:"2-digit"},"month"):this.num(r.month,2);case"MMM":return o("short",!1);case"MMMM":return o("long",!1);case"MMMMM":return o("narrow",!1);case"y":return t?s({year:"numeric"},"year"):this.num(r.year);case"yy":return t?s({year:"2-digit"},"year"):this.num(r.year.toString().slice(-2),2);case"yyyy":return t?s({year:"numeric"},"year"):this.num(r.year,4);case"yyyyyy":return t?s({year:"numeric"},"year"):this.num(r.year,6);case"G":return c("short");case"GG":return c("long");case"GGGGG":return c("narrow");case"kk":return this.num(r.weekYear.toString().slice(-2),2);case"kkkk":return this.num(r.weekYear,4);case"W":return this.num(r.weekNumber);case"WW":return this.num(r.weekNumber,2);case"o":return this.num(r.ordinal);case"ooo":return this.num(r.ordinal,3);case"q":return this.num(r.quarter);case"qq":return this.num(r.quarter,2);case"X":return this.num(Math.floor(r.ts/1e3));case"x":return this.num(r.ts);default:return l(e)}})}formatDurationFromString(e,t){const r=e=>{switch(e[0]){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":return"hour";case"d":return"day";case"w":return"week";case"M":return"month";case"y":return"year";default:return null}},n=f.parseFormat(t),s=n.reduce((e,{literal:t,val:r})=>t?e:e.concat(r),[]),i=e.shiftTo(...s.map(r).filter(e=>e));return Je(n,(a=i,e=>{var t=r(e);return t?this.num(a.get(t),e.length):e}));var a}}class y{constructor(e,t){this.reason=e,this.explanation=t}toMessage(){return this.explanation?this.reason+": "+this.explanation:this.reason}}class i{get type(){throw new r}get name(){throw new r}get ianaName(){return this.name}get isUniversal(){throw new r}offsetName(e,t){throw new r}formatOffset(e,t){throw new r}offset(e){throw new r}equals(e){throw new r}get isValid(){throw new r}}let Pe=null;class Ge extends i{static get instance(){return Pe=null===Pe?new Ge:Pe}get type(){return"system"}get name(){return(new Intl.DateTimeFormat).resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(e,{format:t,locale:r}){return Oe(e,t,r)}formatOffset(e,t){return Ne(this.offset(e),t)}offset(e){return-new Date(e).getTimezoneOffset()}equals(e){return"system"===e.type}get isValid(){return!0}}let Be={};function Qe(e){return Be[e]||(Be[e]=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"})),Be[e]}const Ke={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};function Xe(e,t){var e=e.format(t).replace(/\u200E/g,""),[,t,e,r,n,s,i,a]=/(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(e);return[r,t,e,n,s,i,a]}function et(e,t){var r=e.formatToParts(t);const n=[];for(let e=0;eDate.now(),it="system",at=null,ot=null,ut=null,lt;class k{static get now(){return st}static set now(e){st=e}static set defaultZone(e){it=e}static get defaultZone(){return b(it,Ge.instance)}static get defaultLocale(){return at}static set defaultLocale(e){at=e}static get defaultNumberingSystem(){return ot}static set defaultNumberingSystem(e){ot=e}static get defaultOutputCalendar(){return ut}static set defaultOutputCalendar(e){ut=e}static get throwOnInvalid(){return lt}static set throwOnInvalid(e){lt=e}static resetCaches(){M.resetCache(),w.resetCache()}}let ct={};function ht(e,t={}){var r=JSON.stringify([e,t]);let n=ct[r];return n||(n=new Intl.ListFormat(e,t),ct[r]=n),n}let dt={};function mt(e,t={}){var r=JSON.stringify([e,t]);let n=dt[r];return n||(n=new Intl.DateTimeFormat(e,t),dt[r]=n),n}let ft={};function yt(e,t={}){var r=JSON.stringify([e,t]);let n=ft[r];return n||(n=new Intl.NumberFormat(e,t),ft[r]=n),n}let gt={};function wt(e,t={}){const{base:r,...n}=t;var s=JSON.stringify([e,n]);let i=gt[s];return i||(i=new Intl.RelativeTimeFormat(e,t),gt[s]=i),i}let vt=null;function pt(){return vt=vt||(new Intl.DateTimeFormat).resolvedOptions().locale}function Tt(e){var r=e.indexOf("-u-");if(-1===r)return[e];{let t;r=e.substring(0,r);try{t=mt(e).resolvedOptions()}catch(e){t=mt(r).resolvedOptions()}var{numberingSystem:e,calendar:n}=t;return[r,e,n]}}function St(e,t,r){return(r||t)&&(e+="-u",r&&(e+="-ca-"+r),t&&(e+="-nu-"+t)),e}function Ot(t){const r=[];for(let e=1;e<=12;e++){var n=L.utc(2016,e,1);r.push(t(n))}return r}function bt(t){const r=[];for(let e=1;e<=7;e++){var n=L.utc(2016,11,13+e);r.push(t(n))}return r}function kt(e,t,r,n,s){e=e.listingMode(r);return"error"===e?null:("en"===e?n:s)(t)}function Mt(e){return(!e.numberingSystem||"latn"===e.numberingSystem)&&("latn"===e.numberingSystem||!e.locale||e.locale.startsWith("en")||"latn"===new Intl.DateTimeFormat(e.intl).resolvedOptions().numberingSystem)}class Nt{constructor(e,t,r){this.padTo=r.padTo||0,this.floor=r.floor||!1;const{padTo:n,floor:s,...i}=r;if(!t||0{const t=n?{month:r,day:"numeric"}:{month:r},e=n?"format":"standalone";return this.monthsCache[e][r]||(this.monthsCache[e][r]=Ot(e=>this.extract(e,t,"month"))),this.monthsCache[e][r]})}weekdays(r,n=!1,e=!0){return kt(this,r,e,Le,()=>{const t=n?{weekday:r,year:"numeric",month:"long",day:"numeric"}:{weekday:r},e=n?"format":"standalone";return this.weekdaysCache[e][r]||(this.weekdaysCache[e][r]=bt(e=>this.extract(e,t,"weekday"))),this.weekdaysCache[e][r]})}meridiems(e=!0){return kt(this,void 0,e,()=>ze,()=>{if(!this.meridiemCache){const t={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[L.utc(2016,11,13,9),L.utc(2016,11,13,19)].map(e=>this.extract(e,t,"dayperiod"))}return this.meridiemCache})}eras(e,t=!0){return kt(this,e,t,_e,()=>{const t={era:e};return this.eraCache[e]||(this.eraCache[e]=[L.utc(-40,1,1),L.utc(2017,1,1)].map(e=>this.extract(e,t,"era"))),this.eraCache[e]})}extract(e,t,r){const n=this.dtFormatter(e,t),s=n.formatToParts(),i=s.find(e=>e.type.toLowerCase()===r);return i?i.value:null}numberFormatter(e={}){return new Nt(this.intl,e.forceSimple||this.fastNumbers,e)}dtFormatter(e,t={}){return new Dt(e,this.intl,t)}relFormatter(e={}){return new Et(this.intl,this.isEnglish(),e)}listFormatter(e={}){return ht(this.intl,e)}isEnglish(){return"en"===this.locale||"dev-us"===this.locale.toLowerCase()||new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("dev-us")}equals(e){return this.locale===e.locale&&this.numberingSystem===e.numberingSystem&&this.outputCalendar===e.outputCalendar}}function a(...e){e=e.reduce((e,t)=>e+t.source,"");return RegExp(`^${e}$`)}function g(...e){return i=>e.reduce(([e,t,r],n)=>{var[n,r,s]=n(i,r);return[{...e,...n},r||t,s]},[{},null,1]).slice(0,2)}function p(e,...t){if(null!=e)for(var[r,n]of t){r=r.exec(e);if(r)return n(r)}return[null,null]}function Vt(...s){return(e,t)=>{const r={};let n;for(n=0;nvoid 0!==e&&(t||e&&l)?-e:e;return[{years:c(m(t)),months:c(m(r)),weeks:c(m(n)),days:c(m(s)),hours:c(m(i)),minutes:c(m(a)),seconds:c(m(o),"-0"===o),milliseconds:c(fe(u),e)}]}const jt={GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function _t(e,t,r,n,s,i,a){const o={year:2===t.length?Se(d(t)):d(t),month:Ve.indexOf(r)+1,day:d(n),hour:d(s),minute:d(i)};return a&&(o.second=d(a)),e&&(o.weekday=3O(n[t])?e:(e&&wr(r,n,e,n,t),t),null)}class V{constructor(e){var t="longterm"===e.conversionAccuracy||!1;this.values=e.values,this.loc=e.loc||M.create(),this.conversionAccuracy=t?"longterm":"casual",this.invalid=e.invalid||null,this.matrix=t?yr:mr,this.isLuxonDuration=!0}static fromMillis(e,t){return V.fromObject({milliseconds:e},t)}static fromObject(e,t={}){if(null==e||"object"!=typeof e)throw new o("Duration.fromObject: argument expected to be an object, got "+(null===e?"null":typeof e));return new V({values:Me(e,V.normalizeUnit),loc:M.fromObject(t),conversionAccuracy:t.conversionAccuracy})}static fromDurationLike(e){if(c(e))return V.fromMillis(e);if(V.isDuration(e))return e;if("object"==typeof e)return V.fromObject(e);throw new o(`Unknown duration argument ${e} of type `+typeof e)}static fromISO(e,t){var[r]=ir(e);return r?V.fromObject(r,t):V.invalid("unparsable",`the input "${e}" can't be parsed as ISO 8601`)}static fromISOTime(e,t){var[r]=or(e);return r?V.fromObject(r,t):V.invalid("unparsable",`the input "${e}" can't be parsed as ISO 8601`)}static invalid(e,t=null){if(!e)throw new o("need to specify a reason the Duration is invalid");e=e instanceof y?e:new y(e,t);if(k.throwOnInvalid)throw new A(e);return new V({invalid:e})}static normalizeUnit(e){var t={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[e&&e.toLowerCase()];if(t)return t;throw new _(e)}static isDuration(e){return e&&e.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(e,t={}){t={...t,floor:!1!==t.round&&!1!==t.floor};return this.isValid?f.create(this.loc,t).formatDurationFromString(this,e):"Invalid Duration"}toHuman(r={}){var e=D.map(e=>{var t=this.values[e];return O(t)?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...r,unit:e.slice(0,-1)}).format(t)}).filter(e=>e);return this.loc.listFormatter({type:"conjunction",style:r.listStyle||"narrow",...r}).format(e)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let e="P";return 0!==this.years&&(e+=this.years+"Y"),0===this.months&&0===this.quarters||(e+=this.months+3*this.quarters+"M"),0!==this.weeks&&(e+=this.weeks+"W"),0!==this.days&&(e+=this.days+"D"),0===this.hours&&0===this.minutes&&0===this.seconds&&0===this.milliseconds||(e+="T"),0!==this.hours&&(e+=this.hours+"H"),0!==this.minutes&&(e+=this.minutes+"M"),0===this.seconds&&0===this.milliseconds||(e+=ye(this.seconds+this.milliseconds/1e3,3)+"S"),"P"===e&&(e+="T0S"),e}toISOTime(e={}){if(!this.isValid)return null;var t=this.toMillis();if(t<0||864e5<=t)return null;e={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...e};const r=this.shiftTo("hours","minutes","seconds","milliseconds");let n="basic"===e.format?"hhmm":"hh:mm",s=(e.suppressSeconds&&0===r.seconds&&0===r.milliseconds||(n+="basic"===e.format?"ss":":ss",e.suppressMilliseconds&&0===r.milliseconds||(n+=".SSS")),r.toFormat(n));return s=e.includePrefix?"T"+s:s}toJSON(){return this.toISO()}toString(){return this.toISO()}toMillis(){return this.as("milliseconds")}valueOf(){return this.toMillis()}plus(e){if(!this.isValid)return this;const t=V.fromDurationLike(e),r={};for(const n of D)(h(t.values,n)||h(this.values,n))&&(r[n]=t.get(n)+this.get(n));return E(this,{values:r},!0)}minus(e){if(!this.isValid)return this;const t=V.fromDurationLike(e);return this.plus(t.negate())}mapUnits(e){if(!this.isValid)return this;const t={};for(const r of Object.keys(this.values))t[r]=ke(e(this.values[r],r));return E(this,{values:t},!0)}get(e){return this[V.normalizeUnit(e)]}set(e){return this.isValid?E(this,{values:{...this.values,...Me(e,V.normalizeUnit)}}):this}reconfigure({locale:e,numberingSystem:t,conversionAccuracy:r}={}){const n=this.loc.clone({locale:e,numberingSystem:t}),s={loc:n};return r&&(s.conversionAccuracy=r),E(this,s)}as(e){return this.isValid?this.shiftTo(e).get(e):NaN}normalize(){if(!this.isValid)return this;var e=this.toObject();return vr(this.matrix,e),E(this,{values:e},!0)}shiftTo(...e){if(!this.isValid)return this;if(0===e.length)return this;e=e.map(e=>V.normalizeUnit(e));const t={},r={},n=this.toObject();let s;for(const a of D)if(0<=e.indexOf(a)){s=a;let e=0;for(const o in r)e+=this.matrix[o][a]*r[o],r[o]=0;c(n[a])&&(e+=n[a]);var i=Math.trunc(e);t[a]=i,r[a]=(1e3*e-1e3*i)/1e3;for(const u in n)D.indexOf(u)>D.indexOf(a)&&wr(this.matrix,n,u,t,a)}else c(n[a])&&(r[a]=n[a]);for(const l in r)0!==r[l]&&(t[s]+=l===s?r[l]:r[l]/this.matrix[s][l]);return E(this,{values:t},!0).normalize()}negate(){if(!this.isValid)return this;const e={};for(const t of Object.keys(this.values))e[t]=0===this.values[t]?0:-this.values[t];return E(this,{values:e},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return null===this.invalid}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(e){if(!this.isValid||!e.isValid)return!1;if(!this.loc.equals(e.loc))return!1;for(const n of D)if(t=this.values[n],r=e.values[n],!(void 0===t||0===t?void 0===r||0===r:t===r))return!1;var t,r;return!0}}const pr="Invalid Interval";function Tr(e,t){return e&&e.isValid?t&&t.isValid?te}isBefore(e){return!!this.isValid&&this.e<=e}contains(e){return!!this.isValid&&(this.s<=e&&this.e>e)}set({start:e,end:t}={}){return this.isValid?I.fromDateTimes(e||this.s,t||this.e):this}splitAt(...e){if(!this.isValid)return[];const t=e.map(Sn).filter(e=>this.contains(e)).sort(),r=[];let n=this["s"],s=0;for(;n+this.e?this.e:i;r.push(I.fromDateTimes(n,i)),n=i,s+=1}return r}splitBy(e){const t=V.fromDurationLike(e);if(!this.isValid||!t.isValid||0===t.as("milliseconds"))return[];let r=this["s"],n=1,s;const i=[];for(;re*n));s=+a>+this.e?this.e:a,i.push(I.fromDateTimes(r,s)),r=s,n+=1}return i}divideEqually(e){return this.isValid?this.splitBy(this.length()/e).slice(0,e):[]}overlaps(e){return this.e>e.s&&this.s=e.e)}equals(e){return!(!this.isValid||!e.isValid)&&(this.s.equals(e.s)&&this.e.equals(e.e))}intersection(e){if(!this.isValid)return this;var t=(this.s>e.s?this:e).s,e=(this.ee.e?this:e).e;return I.fromDateTimes(t,e)}static merge(e){const[t,r]=e.sort((e,t)=>e.s-t.s).reduce(([e,t],r)=>t?t.overlaps(r)||t.abutsStart(r)?[e,t.union(r)]:[e.concat([t]),r]:[e,r],[[],null]);return r&&t.push(r),t}static xor(e){let t=null,r=0;const n=[],s=e.map(e=>[{time:e.s,type:"s"},{time:e.e,type:"e"}]),i=Array.prototype.concat(...s),a=i.sort((e,t)=>e.time-t.time);for(const o of a)r+="s"===o.type?1:-1,t=1===r?o.time:(t&&+t!=+o.time&&n.push(I.fromDateTimes(t,o.time)),null);return I.merge(n)}difference(...e){return I.xor([this].concat(e)).map(e=>this.intersection(e)).filter(e=>e&&!e.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} – ${this.e.toISO()})`:pr}toISO(e){return this.isValid?this.s.toISO(e)+"/"+this.e.toISO(e):pr}toISODate(){return this.isValid?this.s.toISODate()+"/"+this.e.toISODate():pr}toISOTime(e){return this.isValid?this.s.toISOTime(e)+"/"+this.e.toISOTime(e):pr}toFormat(e,{separator:t=" – "}={}){return this.isValid?""+this.s.toFormat(e)+t+this.e.toFormat(e):pr}toDuration(e,t){return this.isValid?this.e.diff(this.s,e,t):V.invalid(this.invalidReason)}mapEndpoints(e){return I.fromDateTimes(e(this.s),e(this.e))}}class Sr{static hasDST(e=k.defaultZone){const t=L.now().setZone(e).set({month:12});return!e.isUniversal&&t.offset!==t.set({month:6}).offset}static isValidIANAZone(e){return w.isValidZone(e)}static normalizeZone(e){return b(e,k.defaultZone)}static months(e="long",{locale:t=null,numberingSystem:r=null,locObj:n=null,outputCalendar:s="gregory"}={}){return(n||M.create(t,r,s)).months(e)}static monthsFormat(e="long",{locale:t=null,numberingSystem:r=null,locObj:n=null,outputCalendar:s="gregory"}={}){return(n||M.create(t,r,s)).months(e,!0)}static weekdays(e="long",{locale:t=null,numberingSystem:r=null,locObj:n=null}={}){return(n||M.create(t,r,null)).weekdays(e)}static weekdaysFormat(e="long",{locale:t=null,numberingSystem:r=null,locObj:n=null}={}){return(n||M.create(t,r,null)).weekdays(e,!0)}static meridiems({locale:e=null}={}){return M.create(e).meridiems()}static eras(e="short",{locale:t=null}={}){return M.create(t,null,"gregory").eras(e)}static features(){return{relative:he()}}}function Or(e,t){var r=e=>e.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),t=r(t)-r(e);return Math.floor(V.fromMillis(t).as("days"))}function br(e,t,r,n){let[s,i,a,o]=function(t,r,e){var n,s;const i={};let a,o;for([n,s]of[["years",(e,t)=>t.year-e.year],["quarters",(e,t)=>t.quarter-e.quarter],["months",(e,t)=>t.month-e.month+12*(t.year-e.year)],["weeks",(e,t)=>{e=Or(e,t);return(e-e%7)/7}],["days",Or]])if(0<=e.indexOf(n)){a=n;let e=s(t,r);(o=t.plus({[n]:e}))>r?(t=t.plus({[n]:e-1}),--e):t=o,i[n]=e}return[t,i,o,a]}(e,t,r);e=t-s,r=r.filter(e=>0<=["hours","minutes","seconds","milliseconds"].indexOf(e)),0===r.length&&(a=ae){return{regex:e,deser:([e])=>t(function(t){let r=parseInt(t,10);if(isNaN(r)){r="";for(let e=0;ee.findIndex(e=>xr(t)===xr(e))+r}}function Cr(e,t){return{regex:e,deser:([,e,t])=>be(e,t),groups:t}}function Fr(e){return{regex:e,deser:([e])=>e}}const Zr={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour:{numeric:"h","2-digit":"hh"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"}};let Lr=null;function zr(e,t){if(e.literal)return e;const s=f.macroTokenToFormatOpts(e.val);if(!s)return e;const r=f.create(t,s),n=r.formatDateTimeParts(Lr=Lr||L.fromMillis(1555555555555)),i=n.map(t=>{{var r=s,{type:t,value:n}=t;if("literal"===t)return{literal:!0,val:n};n=r[t];let e=Zr[t];return(e="object"==typeof e?e[n]:e)?{literal:!1,val:e}:void 0}});return i.includes(void 0)?e:i}function qr(g,e,t){t=f.parseFormat(t),i=g;const r=Array.prototype.concat(...t.map(e=>zr(e,i))),n=r.map(e=>{{var t=e,r=g;const n=x(r),s=x(r,"{2}"),i=x(r,"{3}"),a=x(r,"{4}"),o=x(r,"{6}"),u=x(r,"{1,2}"),l=x(r,"{1,3}"),c=x(r,"{1,6}"),h=x(r,"{1,9}"),d=x(r,"{2,4}"),m=x(r,"{4,6}"),f=e=>({regex:RegExp(e.val.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")),deser:([e])=>e,literal:!0}),y=(e=>{if(t.literal)return f(e);switch(e.val){case"G":return F(r.eras("short",!1),0);case"GG":return F(r.eras("long",!1),0);case"y":return C(c);case"yy":return C(d,Se);case"yyyy":return C(a);case"yyyyy":return C(m);case"yyyyyy":return C(o);case"M":return C(u);case"MM":return C(s);case"MMM":return F(r.months("short",!0,!1),1);case"MMMM":return F(r.months("long",!0,!1),1);case"L":return C(u);case"LL":return C(s);case"LLL":return F(r.months("short",!1,!1),1);case"LLLL":return F(r.months("long",!1,!1),1);case"d":return C(u);case"dd":return C(s);case"o":return C(l);case"ooo":return C(i);case"HH":return C(s);case"H":return C(u);case"hh":return C(s);case"h":return C(u);case"mm":return C(s);case"m":case"q":return C(u);case"qq":return C(s);case"s":return C(u);case"ss":return C(s);case"S":return C(l);case"SSS":return C(i);case"u":return Fr(h);case"uu":return Fr(u);case"uuu":return C(n);case"a":return F(r.meridiems(),0);case"kkkk":return C(a);case"kk":return C(d,Se);case"W":return C(u);case"WW":return C(s);case"E":case"c":return C(n);case"EEE":return F(r.weekdays("short",!1,!1),1);case"EEEE":return F(r.weekdays("long",!1,!1),1);case"ccc":return F(r.weekdays("short",!0,!1),1);case"cccc":return F(r.weekdays("long",!0,!1),1);case"Z":case"ZZ":return Cr(new RegExp(`([+-]${u.source})(?::(${s.source}))?`),2);case"ZZZ":return Cr(new RegExp(`([+-]${u.source})(${s.source})?`),2);case"z":return Fr(/[a-z_+-/]{1,256}?/i);default:return f(e)}})(t)||{invalidReason:Dr};return y.token=t,y}}),s=n.find(e=>e.invalidReason);var i;if(s)return{input:e,tokens:r,invalidReason:s.invalidReason};var[t,a]=[`^${(t=n).map(e=>e.regex).reduce((e,t)=>`${e}(${t.source})`,"")}$`,t],t=RegExp(t,"i"),[a,o]=function(e,t,r){const n=e.match(t);if(n){const s={};let e=1;for(const i in r)if(h(r,i)){const a=r[i],o=a.groups?a.groups+1:1;!a.literal&&a.token&&(s[a.token.val[0]]=a.deser(n.slice(e,e+o))),e+=o}return[n,s]}return[n,{}]}(e,t,a),[u,l,c]=o?function(n){let e=null,t;return O(n.z)||(e=w.create(n.z)),O(n.Z)||(e=e||new v(n.Z),t=n.Z),O(n.q)||(n.M=3*(n.q-1)+1),O(n.h)||(n.h<12&&1===n.a?n.h+=12:12===n.h&&0===n.a&&(n.h=0)),0===n.G&&n.y&&(n.y=-n.y),O(n.u)||(n.S=fe(n.u)),[Object.keys(n).reduce((e,t)=>{var r=(e=>{switch(e){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}})(t);return r&&(e[r]=n[t]),e},{}),e,t]}(o):[null,null,void 0];if(h(o,"a")&&h(o,"H"))throw new j("Can't include meridiem when specifying 24-hour format");return{input:e,tokens:r,regex:t,rawMatches:a,matches:o,result:u,zone:l,specificOffset:c}}function Ar(e,t,r){var{result:e,zone:t,specificOffset:r,invalidReason:n}=qr(e,t,r);return[e,t,r,n]}const jr=[0,31,59,90,120,151,181,212,243,273,304,334],_r=[0,31,60,91,121,152,182,213,244,274,305,335];function Z(e,t){return new y("unit out of range",`you specified ${t} (of type ${typeof t}) as a ${e}, which is invalid`)}function Ur(e,t,r){const n=new Date(Date.UTC(e,t-1,r));e<100&&0<=e&&n.setUTCFullYear(n.getUTCFullYear()-1900);t=n.getUTCDay();return 0===t?7:t}function $r(e,t,r){return r+(ge(e)?_r:jr)[t-1]}function Hr(e,t){const r=ge(e)?_r:jr,n=r.findIndex(e=>eTe(t)?(a=t+1,i=1):a=t,{weekYear:a,weekNumber:i,weekday:r,...De(e)}}function Rr(e){var{weekYear:t,weekNumber:r,weekday:n}=e,s=Ur(t,1,4),i=we(t);let a=7*r+n-s-3,o;a<1?(o=t-1,a+=we(o)):a>i?(o=t+1,a-=we(t)):o=t;var{month:r,day:n}=Hr(o,a);return{year:o,month:r,day:n,...De(e)}}function Jr(e){var{year:t,month:r,day:n}=e;return{year:t,ordinal:$r(t,r,n),...De(e)}}function Yr(e){var{year:t,ordinal:r}=e,{month:r,day:n}=Hr(t,r);return{year:t,month:r,day:n,...De(e)}}function Pr(e){var t=le(e.weekYear),r=u(e.weekNumber,1,Te(e.weekYear)),n=u(e.weekday,1,7);return t?r?!n&&Z("weekday",e.weekday):Z("week",e.week):Z("weekYear",e.weekYear)}function Gr(e){var t=le(e.year),r=u(e.ordinal,1,we(e.year));return t?!r&&Z("ordinal",e.ordinal):Z("year",e.year)}function Br(e){var t=le(e.year),r=u(e.month,1,12),n=u(e.day,1,ve(e.year,e.month));return t?r?!n&&Z("day",e.day):Z("month",e.month):Z("year",e.year)}function Qr(e){var{hour:e,minute:t,second:r,millisecond:n}=e,s=u(e,0,23)||24===e&&0===t&&0===r&&0===n,i=u(t,0,59),a=u(r,0,59),o=u(n,0,999);return s?i?a?!o&&Z("millisecond",n):Z("second",r):Z("minute",t):Z("hour",e)}const Kr="Invalid DateTime";function Xr(e){return new y("unsupported zone",`the zone "${e.name}" is not supported`)}function en(e){return null===e.weekData&&(e.weekData=Wr(e.c)),e.weekData}function tn(e,t){e={ts:e.ts,zone:e.zone,c:e.c,o:e.o,loc:e.loc,invalid:e.invalid};return new L({...e,...t,old:e})}function rn(e,t,r){let n=e-60*t*1e3;var s=r.offset(n);if(t===s)return[n,t];n-=60*(s-t)*1e3;t=r.offset(n);return s===t?[n,s]:[e-60*Math.min(s,t)*1e3,Math.max(s,t)]}function nn(e,t){e+=60*t*1e3;const r=new Date(e);return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate(),hour:r.getUTCHours(),minute:r.getUTCMinutes(),second:r.getUTCSeconds(),millisecond:r.getUTCMilliseconds()}}function sn(e,t,r){return rn(pe(e),t,r)}function an(e,t){var r=e.o,n=e.c.year+Math.trunc(t.years),s=e.c.month+Math.trunc(t.months)+3*Math.trunc(t.quarters),n={...e.c,year:n,month:s,day:Math.min(e.c.day,ve(n,s))+Math.trunc(t.days)+7*Math.trunc(t.weeks)},s=V.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as("milliseconds");let[i,a]=rn(pe(n),r,e.zone);return 0!==s&&(i+=s,a=e.zone.offset(i)),{ts:i,o:a}}function on(e,t,r,n,s,i){var{setZone:a,zone:o}=r;if(e&&0!==Object.keys(e).length){const u=t||o,l=L.fromObject(e,{...r,zone:u,specificOffset:i});return a?l:l.setZone(o)}return L.invalid(new y("unparsable",`the input "${s}" can't be parsed as `+n))}function un(e,t,r=!0){return e.isValid?f.create(M.create("en-US"),{allowZ:r,forceSimple:!0}).formatDateTimeFromString(e,t):null}function ln(e,t){var r=9999{e=ye(e,i||s.calendary?0:2,!0);const r=n.loc.clone(s).relFormatter(s);return r.format(e,t)},r=e=>s.calendary?n.hasSame(t,e)?0:n.startOf(e).diff(t.startOf(e),e).get(e):n.diff(t,e).get(e);if(s.unit)return e(r(s.unit),s.unit);for(const o of s.units){var a=r(o);if(1<=Math.abs(a))return e(a,o)}return e(nthis.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset)}get isInLeapYear(){return ge(this.year)}get daysInMonth(){return ve(this.year,this.month)}get daysInYear(){return this.isValid?we(this.year):NaN}get weeksInWeekYear(){return this.isValid?Te(this.weekYear):NaN}resolvedLocaleOptions(e={}){var{locale:e,numberingSystem:t,calendar:r}=f.create(this.loc.clone(e),e).resolvedOptions(this);return{locale:e,numberingSystem:t,outputCalendar:r}}toUTC(e=0,t={}){return this.setZone(v.instance(e),t)}toLocal(){return this.setZone(k.defaultZone)}setZone(t,{keepLocalTime:r=!1,keepCalendarTime:n=!1}={}){if((t=b(t,k.defaultZone)).equals(this.zone))return this;if(t.isValid){let e=this.ts;return(r||n)&&(r=t.offset(this.ts),n=this.toObject(),[e]=sn(n,r,t)),tn(this,{ts:e,zone:t})}return L.invalid(Xr(t))}reconfigure({locale:e,numberingSystem:t,outputCalendar:r}={}){e=this.loc.clone({locale:e,numberingSystem:t,outputCalendar:r});return tn(this,{loc:e})}setLocale(e){return this.reconfigure({locale:e})}set(e){if(!this.isValid)return this;var e=Me(e,wn),t=!O(e.weekYear)||!O(e.weekNumber)||!O(e.weekday),r=!O(e.ordinal),n=!O(e.year),s=!O(e.month)||!O(e.day),i=e.weekYear||e.weekNumber;if((n||s||r)&&i)throw new j("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(s&&r)throw new j("Can't mix ordinal dates with month/day");let a;t?a=Rr({...Wr(this.c),...e}):O(e.ordinal)?(a={...this.toObject(),...e},O(e.day)&&(a.day=Math.min(ve(a.year,a.month),a.day))):a=Yr({...Jr(this.c),...e});var[n,i]=sn(a,this.o,this.zone);return tn(this,{ts:n,o:i})}plus(e){return this.isValid?tn(this,an(this,V.fromDurationLike(e))):this}minus(e){return this.isValid?tn(this,an(this,V.fromDurationLike(e).negate())):this}startOf(e){if(!this.isValid)return this;const t={},r=V.normalizeUnit(e);switch(r){case"years":t.month=1;case"quarters":case"months":t.day=1;case"weeks":case"days":t.hour=0;case"hours":t.minute=0;case"minutes":t.second=0;case"seconds":t.millisecond=0}return"weeks"===r&&(t.weekday=1),"quarters"===r&&(e=Math.ceil(this.month/3),t.month=3*(e-1)+1),this.set(t)}endOf(e){return this.isValid?this.plus({[e]:1}).startOf(e).minus(1):this}toFormat(e,t={}){return this.isValid?f.create(this.loc.redefaultToEN(t)).formatDateTimeFromString(this,e):Kr}toLocaleString(e=U,t={}){return this.isValid?f.create(this.loc.clone(t),e).formatDateTime(this):Kr}toLocaleParts(e={}){return this.isValid?f.create(this.loc.clone(e),e).formatDateTimeParts(this):[]}toISO({format:e="extended",suppressSeconds:t=!1,suppressMilliseconds:r=!1,includeOffset:n=!0,extendedZone:s=!1}={}){if(!this.isValid)return null;var e="extended"===e,i=ln(this,e);return(i+="T")+cn(this,e,t,r,n,s)}toISODate({format:e="extended"}={}){return this.isValid?ln(this,"extended"===e):null}toISOWeekDate(){return un(this,"kkkk-'W'WW-c")}toISOTime({suppressMilliseconds:e=!1,suppressSeconds:t=!1,includeOffset:r=!0,includePrefix:n=!1,extendedZone:s=!1,format:i="extended"}={}){return this.isValid?(n?"T":"")+cn(this,"extended"===i,t,e,r,s):null}toRFC2822(){return un(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)}toHTTP(){return un(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")}toSQLDate(){return this.isValid?ln(this,!0):null}toSQLTime({includeOffset:e=!0,includeZone:t=!1,includeOffsetSpace:r=!0}={}){let n="HH:mm:ss.SSS";return(t||e)&&(r&&(n+=" "),t?n+="z":e&&(n+="ZZ")),un(this,n,!0)}toSQL(e={}){return this.isValid?this.toSQLDate()+" "+this.toSQLTime(e):null}toString(){return this.isValid?this.toISO():Kr}valueOf(){return this.toMillis()}toMillis(){return this.isValid?this.ts:NaN}toSeconds(){return this.isValid?this.ts/1e3:NaN}toUnixInteger(){return this.isValid?Math.floor(this.ts/1e3):NaN}toJSON(){return this.toISO()}toBSON(){return this.toJSDate()}toObject(e={}){if(!this.isValid)return{};const t={...this.c};return e.includeConfig&&(t.outputCalendar=this.outputCalendar,t.numberingSystem=this.loc.numberingSystem,t.locale=this.loc.locale),t}toJSDate(){return new Date(this.isValid?this.ts:NaN)}diff(e,t="milliseconds",r={}){if(!this.isValid||!e.isValid)return V.invalid("created by diffing an invalid DateTime");r={locale:this.locale,numberingSystem:this.numberingSystem,...r};const n=de(t).map(V.normalizeUnit),s=e.valueOf()>this.valueOf(),i=s?this:e,a=s?e:this,o=br(i,a,n,r);return s?o.negate():o}diffNow(e="milliseconds",t={}){return this.diff(L.now(),e,t)}until(e){return this.isValid?I.fromDateTimes(this,e):this}hasSame(e,t){if(!this.isValid)return!1;var r=e.valueOf();const n=this.setZone(e.zone,{keepLocalTime:!0});return n.startOf(t)<=r&&r<=n.endOf(t)}equals(e){return this.isValid&&e.isValid&&this.valueOf()===e.valueOf()&&this.zone.equals(e.zone)&&this.loc.equals(e.loc)}toRelative(e={}){if(!this.isValid)return null;var t=e.base||L.fromObject({},{zone:this.zone}),r=e.padding?thise.valueOf(),Math.min);throw new o("min requires all arguments be DateTimes")}static max(...e){if(e.every(L.isDateTime))return me(e,e=>e.valueOf(),Math.max);throw new o("max requires all arguments be DateTimes")}static fromFormatExplain(e,t,r={}){var{locale:r=null,numberingSystem:n=null}=r;return qr(M.fromOpts({locale:r,numberingSystem:n,defaultToEN:!0}),e,t)}static fromStringExplain(e,t,r={}){return L.fromFormatExplain(e,t,r)}static get DATE_SHORT(){return U}static get DATE_MED(){return $}static get DATE_MED_WITH_WEEKDAY(){return H}static get DATE_FULL(){return W}static get DATE_HUGE(){return R}static get TIME_SIMPLE(){return J}static get TIME_WITH_SECONDS(){return Y}static get TIME_WITH_SHORT_OFFSET(){return P}static get TIME_WITH_LONG_OFFSET(){return G}static get TIME_24_SIMPLE(){return B}static get TIME_24_WITH_SECONDS(){return Q}static get TIME_24_WITH_SHORT_OFFSET(){return K}static get TIME_24_WITH_LONG_OFFSET(){return X}static get DATETIME_SHORT(){return ee}static get DATETIME_SHORT_WITH_SECONDS(){return te}static get DATETIME_MED(){return re}static get DATETIME_MED_WITH_SECONDS(){return ne}static get DATETIME_MED_WITH_WEEKDAY(){return se}static get DATETIME_FULL(){return ie}static get DATETIME_FULL_WITH_SECONDS(){return ae}static get DATETIME_HUGE(){return oe}static get DATETIME_HUGE_WITH_SECONDS(){return ue}}function Sn(e){if(L.isDateTime(e))return e;if(e&&e.valueOf&&c(e.valueOf()))return L.fromJSDate(e);if(e&&"object"==typeof e)return L.fromObject(e);throw new o(`Unknown datetime argument: ${e}, of type `+typeof e)}s="2.5.2";export{L as DateTime,V as Duration,v as FixedOffsetZone,w as IANAZone,Sr as Info,I as Interval,nt as InvalidZone,k as Settings,Ge as SystemZone,s as VERSION,i as Zone}; \ No newline at end of file diff --git a/public/javascripts/map.js b/public/javascripts/map.js index f9a09bb..8e3a61c 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -12,10 +12,10 @@ let clickedcoords = {} const colorscale = ['#d53e4f', '#fc8d59', '#fee08b', '#e6f598', '#99d594', '#3288bd', '#808080']; const dba = [100, 80, 60, 40, 20, 0, -999]; +const APIURL = '/api/getmapdata?' export async function showMap(params) { utils.removeTabs() - if(map && map.remove) { map.off(); map.remove(); @@ -58,11 +58,14 @@ export async function showMap(params) { params.sid = clickedSensor let triggerEl = document.querySelector('#livetab') bootstrap.Tab.getInstance(triggerEl).show() // Select tab by name + localStorage.setItem('activeTab', 'livetab') let ok = await showChart(params, 'live', 'dlive') if (ok) { await loadAll(params) } - map.setView([clickedcoords.lat, clickedcoords.lng]); + params.center = [clickedcoords.lat, clickedcoords.lng] +// map.setView([clickedcoords.lat, clickedcoords.lng]); + document.querySelector('#sellan').style.display = 'none' }) }) } @@ -164,7 +167,7 @@ export async function buildMarkers() { west: bounds.getWest(), south: bounds.getSouth(), east: bounds.getEast(), north: bounds.getNorth() } - const url = `/api/getmapdata?type=noise&box=${bounds.toBBoxString()}` + const url = APIURL + `type=noise&box=${bounds.toBBoxString()}` let ret = await fetch(url) .catch(e => { @@ -264,7 +267,7 @@ async function setCenter(adr) { // Show the last date below tha map grafics async function showLastDate(ld) { - const url = `/api/getmapdata?type=noise` + const url = APIURL + 'type=noise' let ret = await fetch(url) .catch(e => { console.log(e) diff --git a/public/javascripts/showcharts.js b/public/javascripts/showcharts.js index 8ad0313..c34547f 100644 --- a/public/javascripts/showcharts.js +++ b/public/javascripts/showcharts.js @@ -55,8 +55,8 @@ export async function showChart(params, typ, container) { return this.axis.defaultLabelFormatter.call(this); } } - - const url = `/api/getsensordata?sensorid=${params.sid}&data=${typ}&span=${params.span}&datetime=${params.datetime.slice(0,-10)}&peak=${params.peak}` + const curlang = localStorage.getItem('curlang') + const url = `/api/getsensordata?sensorid=${params.sid}&data=${typ}&span=${params.span}&datetime=${params.datetime.slice(0,-10)}&peak=${params.peak}&lng=en` let ret = await fetch(url) .catch(e => { logerror(e) diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index b161019..42b812b 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -244,4 +244,8 @@ footer #author #versn { background-color: #FFFFFF; } +#sellan { + display: none; +} + /*# sourceMappingURL=style.css.map */ diff --git a/public/stylesheets/style.css.map b/public/stylesheets/style.css.map index 16bdb3b..88ad663 100644 --- a/public/stylesheets/style.css.map +++ b/public/stylesheets/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["style.sass"],"names":[],"mappings":"AAYA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EAEA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE,kBA9BoB;;AAgCpB;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;;;AAEJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEF;EACE;EACA;;AACA;EACE;;;AAEN;EACE;EAEA;EACA;EACA,eA5Ec;EA6Ed;EACA;EACA;;AAEA;EACE;EACA;EACA;;AACF;EACE;EACA;;;AAEJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AACF;EACE;EACA;;;AAEJ;EACE,kBAhGoB;;AAkGpB;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;;;AAGN;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;;;AAGF;EAEE;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;IACE;;;AAEJ;EACE,kBAnNa;EAoNb;;;AAEF;EACE,OAvNa;EAwNb","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["style.sass"],"names":[],"mappings":"AAYA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EAEA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE,kBA9BoB;;AAgCpB;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;;;AAEJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEF;EACE;EACA;;AACA;EACE;;;AAEN;EACE;EAEA;EACA;EACA,eA5Ec;EA6Ed;EACA;EACA;;AAEA;EACE;EACA;EACA;;AACF;EACE;EACA;;;AAEJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AACF;EACE;EACA;;;AAEJ;EACE,kBAhGoB;;AAkGpB;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;;;AAGN;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;;;AAGF;EAEE;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;IACE;;;AAEJ;EACE,kBAnNa;EAoNb;;;AAEF;EACE,OAvNa;EAwNb;;;AAEF;EACE","file":"style.css"} \ No newline at end of file diff --git a/public/stylesheets/style.sass b/public/stylesheets/style.sass index b13e046..2848eae 100644 --- a/public/stylesheets/style.sass +++ b/public/stylesheets/style.sass @@ -225,3 +225,6 @@ footer .nav-tabs .nav-item .nav-link.active color: $navtab-color background-color: #FFFFFF + +#sellan + display: none \ No newline at end of file diff --git a/routes/api.js b/routes/api.js index b7750c4..a98daf9 100644 --- a/routes/api.js +++ b/routes/api.js @@ -17,6 +17,9 @@ let APIHOST = process.env.APIHOST || 'http://localhost:3004' /* GET home page. */ router.get('/:cmd', async function(req, res, next) { + req.i18n.changeLanguage(req.query.lng) + let l = req.i18n.resolvedLanguage + let txt = req.i18n.t('Settings') const cmd = req.params.cmd let url = APIHOST if(isNaN(cmd)) { @@ -37,7 +40,7 @@ router.get('/:cmd', async function(req, res, next) { const options = response.data.options for(let x of disttable) { if (x.type === options.data) { - let ret = x.func(options, response.data.values) + let ret = x.func(options, response.data.values, req) res.json(ret) break; } diff --git a/routes/index.js b/routes/index.js index 0003c94..0c09a03 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,39 +1,42 @@ import express from 'express' import pkg from '../package.json' assert { type: "json" } -import axios from "axios"; const router = express.Router() const { name, version, date } = pkg -let APIHOST = process.env.APIHOST || 'http://localhost:3004' - -/* GET home page. */ -router.get('/', function(req, res, next) { - res.render('index', { +const renderOpts = (sid) => { + return { title: name, version: version, date: date, - csensor: -1 - }) + csensor: sid + } +} + +/* GET home page. */ +router.get('/', function(req, res, next) { +// req.i18n.changeLanguage('de') + if(req.query.lng === undefined) { + res.render('chglang') + } else { + res.render('index', renderOpts(-1)) + } }) +// +// router.get('/', function(req, res, next) { +// // req.i18n.changeLanguage('de') +// res.render('index', renderOpts(-1)) +// }) + router.get('/:sid', async function(req, res, next) { const sid = req.params.sid - if(!isNaN(sid)) { - res.render('index', { - title: name, - version: version, - date: date, - csensor: sid - }) + if(isNaN(sid)) { + res.render('index', renderOpts(-1)) + } else { + res.render('index', renderOpts(sid)) } }) export default router - - - -// ToDo -// Hier : getsensordata und getmapdata unterbringen und damit den externen Server aufrufen - diff --git a/views/chglang.pug b/views/chglang.pug new file mode 100644 index 0000000..79f16fc --- /dev/null +++ b/views/chglang.pug @@ -0,0 +1,8 @@ +doctype html +html + head + title= title + meta(name="viewport" content="width=device-width, initial-scale=1" charset="utf-8") + body + h1 Haloole + script(type="module" src="/javascripts/checklang.js") \ No newline at end of file diff --git a/views/index.pug b/views/index.pug index a803b55..67520e4 100644 --- a/views/index.pug +++ b/views/index.pug @@ -1,29 +1,36 @@ extends layout block content + script. + function chglang(x) { + // localStorage.setItem('curlang', x.slice(-2)) + // location.href = x + // history.pushState({}, '', '/') + } + header #hline1 - #h1name Noise Measurement + #h1name #{t("Noise_Measurement")} #h1datum #fenster #navi ul.nav.nav-tabs#tablist li.nav-item(role='presentation') - button.nav-link.active#kartentab(data-bs-toggle="tab" data-bs-target="#t_map" type="button" role="tab" aria-controls="map" aria-selected="true") Map + button.nav-link.active#maptab(data-bs-toggle="tab" data-bs-target="#t_map" type="button" role="tab" aria-controls="map" aria-selected="true") #{t("Map")} li.nav-item(role='presentation') - button.nav-link#livetab(data-bs-toggle="tab" data-bs-target="#t_live" type="button" role="tab" aria-controls="live" aria-selected="true") Live + button.nav-link#livetab(data-bs-toggle="tab" data-bs-target="#t_live" type="button" role="tab" aria-controls="live" aria-selected="true") #{t("Live")} li.nav-item(role='presentation') - button.nav-link#houravgtab(data-bs-toggle="tab" data-bs-target="#t_houravg" type="button" role="tab" aria-controls="houravg" aria-selected="true") Hour_AVG + button.nav-link#houravgtab(data-bs-toggle="tab" data-bs-target="#t_houravg" type="button" role="tab" aria-controls="houravg" aria-selected="true") #{t("Hour_AVG")} li.nav-item(role='presentation') - button.nav-link#dayavgtab(data-bs-toggle="tab" data-bs-target="#t_dayavg" type="button" role="tab" aria-controls="dayavg" aria-selected="true") Day_AVG + button.nav-link#dayavgtab(data-bs-toggle="tab" data-bs-target="#t_dayavg" type="button" role="tab" aria-controls="dayavg" aria-selected="true") #{t("Day_AVG")} li.nav-item(role='presentation') - button.nav-link#daynighttab(data-bs-toggle="tab" data-bs-target="#t_daynight" type="button" role="tab" aria-controls="daynight" aria-selected="true") Day_Night + button.nav-link#daynighttab(data-bs-toggle="tab" data-bs-target="#t_daynight" type="button" role="tab" aria-controls="daynight" aria-selected="true") #{t("Day_Night")} li.nav-item(role='presentation') button.nav-link#ldentab(data-bs-toggle="tab" data-bs-target="#t_lden" type="button" role="tab" aria-controls="lden" aria-selected="true") LDEN-Index #buttonsRight - button.btn.btn-primary#btnSet(value='set') Settings - button.btn.btn-primary#btnHelp(value='help') Info + button.btn.btn-primary#btnSet(value='set') #{t("Settings")} + button.btn.btn-primary#btnHelp(value='help') #{t("Info")} .tab-content#thetabs .tab-pane.fade.show.active#t_map(role="tabpanel" aria-labelledby="map-tab") @@ -62,26 +69,48 @@ block content .modal-dialog.modal-dialog-centered(role="document") .modal-content .modal-header - h5.modal-title.dialogErrorTitle Settings + h5.modal-title.dialogErrorTitle #{t("Settings")} button(type="button" class="close" data-bs-dismiss="modal" aria-label="Close") span(aria-hidden="true") × .modal-body.settings .rows .column - label.thelabels(for='startday') - | Start date: + label.thelabels(for='startday') #{t("Start_date")}: input.theInputs#startday(name='startday' ) .column label.thelabels(for='nbrofdays') - | Number of days:
- span#klein (Only for live chart) + | #{t("Number_of_days")}:
+ span#klein (#{t("Only_for_live_chart")}) input.theInputs#nbrofdays(type = 'number' name = 'nbrofdays') |   (max. 10) .column label.thelabels(for='peaklim') - | Count peaks over + | #{t("Count_peaks_over")} input.theInputs#peaklim(type = 'number' name = 'peaklim') |   dbA + .column#sellan + label.thelabels + | #{t("Language")}: + .form-check.form-check-inline + input#en.form-check-input(type="radio" name="lanbut" onchange='chglang("lng/?lng=en")', checked) + label.form-check-label(for="en") English + .form-check.form-check-inline + input#de.form-check-input(type="radio" name="lanbut" onchange='chglang("lng/?lng=de")') + label.form-check-label(for='de') Deutsch .modal-footer - button.btn.btn-secondary(type="button" data-bs-dismiss="modal") Close - button#btnSave.btn.btn-primary(type="button" data-bs-dismiss="modal") Save changes + button.btn.btn-secondary(type="button" data-bs-dismiss="modal") #{t("Close")} + button#btnSave.btn.btn-primary(type="button" data-bs-dismiss="modal") #{t("Save_changes")} + + + // Error-Dialog + .modal.fade#dialogReset(tabindex="-1" role="dialog" aria-labelledby="Error" aria-hidden="true") + .modal-dialog.modal-dialog-centered(role="document") + .modal-content + .modal-header + h5.modal-title.dialogErrorTitle Info + button(type="button" class="close" data-bs-dismiss="modal" aria-label="Close") + span(aria-hidden="true") × + .modal-body #{t("doReset")} + .modal-footer + //button(type="button" class="btn btn-secondary" data-bs-dismiss="modal") Close + button(type="button" class="btn btn-primary" data-bs-dismiss="modal") OK
Aktuelle Werte' + req.t("ActualValues") + '
LAeq' + (aktVal.LAeq).toFixed(1) + 'dbA