air-monitor
Version:
Utilities for working with air quality monitoring data.
3 lines • 81.8 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("arquero"),require("air-monitor-algorithms")):"function"==typeof define&&define.amd?define(["arquero","air-monitor-algorithms"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).Monitor=t(e.aq,e.AirMonitorAlgorithms)}(this,function(e,t){"use strict";function n(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}}),t.default=e,Object.freeze(t)}var r=n(e);class s extends Error{}class i extends s{constructor(e){super(`Invalid DateTime: ${e.toMessage()}`)}}class a extends s{constructor(e){super(`Invalid Interval: ${e.toMessage()}`)}}class o extends s{constructor(e){super(`Invalid Duration: ${e.toMessage()}`)}}class u extends s{}class l extends s{constructor(e){super(`Invalid unit ${e}`)}}class c extends s{}class d extends s{constructor(){super("Zone is an abstract class")}}const h="numeric",m="short",f="long",y={year:h,month:h,day:h},g={year:h,month:m,day:h},p={year:h,month:m,day:h,weekday:m},w={year:h,month:f,day:h},v={year:h,month:f,day:h,weekday:f},k={hour:h,minute:h},S={hour:h,minute:h,second:h},D={hour:h,minute:h,second:h,timeZoneName:m},b={hour:h,minute:h,second:h,timeZoneName:f},T={hour:h,minute:h,hourCycle:"h23"},N={hour:h,minute:h,second:h,hourCycle:"h23"},O={hour:h,minute:h,second:h,hourCycle:"h23",timeZoneName:m},M={hour:h,minute:h,second:h,hourCycle:"h23",timeZoneName:f},I={year:h,month:h,day:h,hour:h,minute:h},$={year:h,month:h,day:h,hour:h,minute:h,second:h},E={year:h,month:m,day:h,hour:h,minute:h},V={year:h,month:m,day:h,hour:h,minute:h,second:h},x={year:h,month:m,day:h,weekday:m,hour:h,minute:h},C={year:h,month:f,day:h,hour:h,minute:h,timeZoneName:m},F={year:h,month:f,day:h,hour:h,minute:h,second:h,timeZoneName:m},Z={year:h,month:f,day:h,weekday:f,hour:h,minute:h,timeZoneName:f},W={year:h,month:f,day:h,weekday:f,hour:h,minute:h,second:h,timeZoneName:f};class L{get type(){throw new d}get name(){throw new d}get ianaName(){return this.name}get isUniversal(){throw new d}offsetName(e,t){throw new d}formatOffset(e,t){throw new d}offset(e){throw new d}equals(e){throw new d}get isValid(){throw new d}}let z=null;class j extends L{static get instance(){return null===z&&(z=new j),z}get type(){return"system"}get name(){return(new Intl.DateTimeFormat).resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(e,{format:t,locale:n}){return it(e,t,n)}formatOffset(e,t){return lt(this.offset(e),t)}offset(e){return-new Date(e).getTimezoneOffset()}equals(e){return"system"===e.type}get isValid(){return!0}}const A=new Map;const _={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};const q=new Map;class U extends L{static create(e){let t=q.get(e);return void 0===t&&q.set(e,t=new U(e)),t}static resetCache(){q.clear(),A.clear()}static isValidSpecifier(e){return this.isValidZone(e)}static isValidZone(e){if(!e)return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:e}).format(),!0}catch(e){return!1}}constructor(e){super(),this.zoneName=e,this.valid=U.isValidZone(e)}get type(){return"iana"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(e,{format:t,locale:n}){return it(e,t,n,this.name)}formatOffset(e,t){return lt(this.offset(e),t)}offset(e){if(!this.valid)return NaN;const t=new Date(e);if(isNaN(t))return NaN;const n=function(e){let t=A.get(e);return void 0===t&&(t=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"}),A.set(e,t)),t}(this.name);let[r,s,i,a,o,u,l]=n.formatToParts?function(e,t){const n=e.formatToParts(t),r=[];for(let e=0;e<n.length;e++){const{type:t,value:s}=n[e],i=_[t];"era"===t?r[i]=s:ze(i)||(r[i]=parseInt(s,10))}return r}(n,t):function(e,t){const n=e.format(t).replace(/\u200E/g,""),r=/(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(n),[,s,i,a,o,u,l,c]=r;return[a,s,i,o,u,l,c]}(n,t);"BC"===a&&(r=1-Math.abs(r));let c=+t;const d=c%1e3;return c-=d>=0?d:1e3+d,(tt({year:r,month:s,day:i,hour:24===o?0:o,minute:u,second:l,millisecond:0})-c)/6e4}equals(e){return"iana"===e.type&&e.name===this.name}get isValid(){return this.valid}}let R={};const P=new Map;function Y(e,t={}){const n=JSON.stringify([e,t]);let r=P.get(n);return void 0===r&&(r=new Intl.DateTimeFormat(e,t),P.set(n,r)),r}const H=new Map;const J=new Map;let G=null;const Q=new Map;function B(e){let t=Q.get(e);return void 0===t&&(t=new Intl.DateTimeFormat(e).resolvedOptions(),Q.set(e,t)),t}const K=new Map;function X(e,t,n,r){const s=e.listingMode();return"error"===s?null:"en"===s?n(t):r(t)}class ee{constructor(e,t,n){this.padTo=n.padTo||0,this.floor=n.floor||!1;const{padTo:r,floor:s,...i}=n;if(!t||Object.keys(i).length>0){const t={useGrouping:!1,...n};n.padTo>0&&(t.minimumIntegerDigits=n.padTo),this.inf=function(e,t={}){const n=JSON.stringify([e,t]);let r=H.get(n);return void 0===r&&(r=new Intl.NumberFormat(e,t),H.set(n,r)),r}(e,t)}}format(e){if(this.inf){const t=this.floor?Math.floor(e):e;return this.inf.format(t)}return He(this.floor?Math.floor(e):Be(e,3),this.padTo)}}class te{constructor(e,t,n){let r;if(this.opts=n,this.originalZone=void 0,this.opts.timeZone)this.dt=e;else if("fixed"===e.zone.type){const t=e.offset/60*-1,n=t>=0?`Etc/GMT+${t}`:`Etc/GMT${t}`;0!==e.offset&&U.create(n).valid?(r=n,this.dt=e):(r="UTC",this.dt=0===e.offset?e:e.setZone("UTC").plus({minutes:e.offset}),this.originalZone=e.zone)}else"system"===e.zone.type?this.dt=e:"iana"===e.zone.type?(this.dt=e,r=e.zone.name):(r="UTC",this.dt=e.setZone("UTC").plus({minutes:e.offset}),this.originalZone=e.zone);const s={...this.opts};s.timeZone=s.timeZone||r,this.dtf=Y(t,s)}format(){return this.originalZone?this.formatToParts().map(({value:e})=>e).join(""):this.dtf.format(this.dt.toJSDate())}formatToParts(){const e=this.dtf.formatToParts(this.dt.toJSDate());return this.originalZone?e.map(e=>{if("timeZoneName"===e.type){const t=this.originalZone.offsetName(this.dt.ts,{locale:this.dt.locale,format:this.opts.timeZoneName});return{...e,value:t}}return e}):e}resolvedOptions(){return this.dtf.resolvedOptions()}}class ne{constructor(e,t,n){this.opts={style:"long",...n},!t&&_e()&&(this.rtf=function(e,t={}){const{base:n,...r}=t,s=JSON.stringify([e,r]);let i=J.get(s);return void 0===i&&(i=new Intl.RelativeTimeFormat(e,t),J.set(s,i)),i}(e,n))}format(e,t){return this.rtf?this.rtf.format(e,t):function(e,t,n="always",r=!1){const 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"===n&&i){const n="days"===e;switch(t){case 1:return n?"tomorrow":`next ${s[e][0]}`;case-1:return n?"yesterday":`last ${s[e][0]}`;case 0:return n?"today":`this ${s[e][0]}`}}const a=Object.is(t,-0)||t<0,o=Math.abs(t),u=1===o,l=s[e],c=r?u?l[1]:l[2]||l[1]:u?s[e][0]:e;return a?`${o} ${c} ago`:`in ${o} ${c}`}(t,e,this.opts.numeric,"long"!==this.opts.style)}formatToParts(e,t){return this.rtf?this.rtf.formatToParts(e,t):[]}}const re={firstDay:1,minimalDays:4,weekend:[6,7]};class se{static fromOpts(e){return se.create(e.locale,e.numberingSystem,e.outputCalendar,e.weekSettings,e.defaultToEN)}static create(e,t,n,r,s=!1){const i=e||De.defaultLocale,a=i||(s?"en-US":G||(G=(new Intl.DateTimeFormat).resolvedOptions().locale,G)),o=t||De.defaultNumberingSystem,u=n||De.defaultOutputCalendar,l=Pe(r)||De.defaultWeekSettings;return new se(a,o,u,l,i)}static resetCache(){G=null,P.clear(),H.clear(),J.clear(),Q.clear(),K.clear()}static fromObject({locale:e,numberingSystem:t,outputCalendar:n,weekSettings:r}={}){return se.create(e,t,n,r)}constructor(e,t,n,r,s){const[i,a,o]=function(e){const t=e.indexOf("-x-");-1!==t&&(e=e.substring(0,t));const n=e.indexOf("-u-");if(-1===n)return[e];{let t,r;try{t=Y(e).resolvedOptions(),r=e}catch(s){const i=e.substring(0,n);t=Y(i).resolvedOptions(),r=i}const{numberingSystem:s,calendar:i}=t;return[r,s,i]}}(e);this.locale=i,this.numberingSystem=t||a||null,this.outputCalendar=n||o||null,this.weekSettings=r,this.intl=function(e,t,n){return n||t?(e.includes("-u-")||(e+="-u"),n&&(e+=`-ca-${n}`),t&&(e+=`-nu-${t}`),e):e}(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=s,this.fastNumbersCached=null}get fastNumbers(){var e;return null==this.fastNumbersCached&&(this.fastNumbersCached=(!(e=this).numberingSystem||"latn"===e.numberingSystem)&&("latn"===e.numberingSystem||!e.locale||e.locale.startsWith("en")||"latn"===B(e.locale).numberingSystem)),this.fastNumbersCached}listingMode(){const e=this.isEnglish(),t=!(null!==this.numberingSystem&&"latn"!==this.numberingSystem||null!==this.outputCalendar&&"gregory"!==this.outputCalendar);return e&&t?"en":"intl"}clone(e){return e&&0!==Object.getOwnPropertyNames(e).length?se.create(e.locale||this.specifiedLocale,e.numberingSystem||this.numberingSystem,e.outputCalendar||this.outputCalendar,Pe(e.weekSettings)||this.weekSettings,e.defaultToEN||!1):this}redefaultToEN(e={}){return this.clone({...e,defaultToEN:!0})}redefaultToSystem(e={}){return this.clone({...e,defaultToEN:!1})}months(e,t=!1){return X(this,e,ft,()=>{const n=t?{month:e,day:"numeric"}:{month:e},r=t?"format":"standalone";return this.monthsCache[r][e]||(this.monthsCache[r][e]=function(e){const t=[];for(let n=1;n<=12;n++){const r=wr.utc(2009,n,1);t.push(e(r))}return t}(e=>this.extract(e,n,"month"))),this.monthsCache[r][e]})}weekdays(e,t=!1){return X(this,e,wt,()=>{const n=t?{weekday:e,year:"numeric",month:"long",day:"numeric"}:{weekday:e},r=t?"format":"standalone";return this.weekdaysCache[r][e]||(this.weekdaysCache[r][e]=function(e){const t=[];for(let n=1;n<=7;n++){const r=wr.utc(2016,11,13+n);t.push(e(r))}return t}(e=>this.extract(e,n,"weekday"))),this.weekdaysCache[r][e]})}meridiems(){return X(this,void 0,()=>vt,()=>{if(!this.meridiemCache){const e={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[wr.utc(2016,11,13,9),wr.utc(2016,11,13,19)].map(t=>this.extract(t,e,"dayperiod"))}return this.meridiemCache})}eras(e){return X(this,e,bt,()=>{const t={era:e};return this.eraCache[e]||(this.eraCache[e]=[wr.utc(-40,1,1),wr.utc(2017,1,1)].map(e=>this.extract(e,t,"era"))),this.eraCache[e]})}extract(e,t,n){const r=this.dtFormatter(e,t).formatToParts().find(e=>e.type.toLowerCase()===n);return r?r.value:null}numberFormatter(e={}){return new ee(this.intl,e.forceSimple||this.fastNumbers,e)}dtFormatter(e,t={}){return new te(e,this.intl,t)}relFormatter(e={}){return new ne(this.intl,this.isEnglish(),e)}listFormatter(e={}){return function(e,t={}){const n=JSON.stringify([e,t]);let r=R[n];return r||(r=new Intl.ListFormat(e,t),R[n]=r),r}(this.intl,e)}isEnglish(){return"en"===this.locale||"en-us"===this.locale.toLowerCase()||B(this.intl).locale.startsWith("en-us")}getWeekSettings(){return this.weekSettings?this.weekSettings:qe()?function(e){let t=K.get(e);if(!t){const n=new Intl.Locale(e);t="getWeekInfo"in n?n.getWeekInfo():n.weekInfo,"minimalDays"in t||(t={...re,...t}),K.set(e,t)}return t}(this.locale):re}getStartOfWeek(){return this.getWeekSettings().firstDay}getMinDaysInFirstWeek(){return this.getWeekSettings().minimalDays}getWeekendDays(){return this.getWeekSettings().weekend}equals(e){return this.locale===e.locale&&this.numberingSystem===e.numberingSystem&&this.outputCalendar===e.outputCalendar}toString(){return`Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`}}let ie=null;class ae extends L{static get utcInstance(){return null===ie&&(ie=new ae(0)),ie}static instance(e){return 0===e?ae.utcInstance:new ae(e)}static parseSpecifier(e){if(e){const t=e.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(t)return new ae(at(t[1],t[2]))}return null}constructor(e){super(),this.fixed=e}get type(){return"fixed"}get name(){return 0===this.fixed?"UTC":`UTC${lt(this.fixed,"narrow")}`}get ianaName(){return 0===this.fixed?"Etc/UTC":`Etc/GMT${lt(-this.fixed,"narrow")}`}offsetName(){return this.name}formatOffset(e,t){return lt(this.fixed,t)}get isUniversal(){return!0}offset(){return this.fixed}equals(e){return"fixed"===e.type&&e.fixed===this.fixed}get isValid(){return!0}}class oe extends L{constructor(e){super(),this.zoneName=e}get type(){return"invalid"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(){return null}formatOffset(){return""}offset(){return NaN}equals(){return!1}get isValid(){return!1}}function ue(e,t){if(ze(e)||null===e)return t;if(e instanceof L)return e;if("string"==typeof e){const n=e.toLowerCase();return"default"===n?t:"local"===n||"system"===n?j.instance:"utc"===n||"gmt"===n?ae.utcInstance:ae.parseSpecifier(n)||U.create(e)}return je(e)?ae.instance(e):"object"==typeof e&&"offset"in e&&"function"==typeof e.offset?e:new oe(e)}const le={arab:"[٠-٩]",arabext:"[۰-۹]",bali:"[᭐-᭙]",beng:"[০-৯]",deva:"[०-९]",fullwide:"[0-9]",gujr:"[૦-૯]",hanidec:"[〇|一|二|三|四|五|六|七|八|九]",khmr:"[០-៩]",knda:"[೦-೯]",laoo:"[໐-໙]",limb:"[᥆-᥏]",mlym:"[൦-൯]",mong:"[᠐-᠙]",mymr:"[၀-၉]",orya:"[୦-୯]",tamldec:"[௦-௯]",telu:"[౦-౯]",thai:"[๐-๙]",tibt:"[༠-༩]",latn:"\\d"},ce={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},de=le.hanidec.replace(/[\[|\]]/g,"").split("");const he=new Map;function me({numberingSystem:e},t=""){const n=e||"latn";let r=he.get(n);void 0===r&&(r=new Map,he.set(n,r));let s=r.get(t);return void 0===s&&(s=new RegExp(`${le[n]}${t}`),r.set(t,s)),s}let fe,ye=()=>Date.now(),ge="system",pe=null,we=null,ve=null,ke=60,Se=null;class De{static get now(){return ye}static set now(e){ye=e}static set defaultZone(e){ge=e}static get defaultZone(){return ue(ge,j.instance)}static get defaultLocale(){return pe}static set defaultLocale(e){pe=e}static get defaultNumberingSystem(){return we}static set defaultNumberingSystem(e){we=e}static get defaultOutputCalendar(){return ve}static set defaultOutputCalendar(e){ve=e}static get defaultWeekSettings(){return Se}static set defaultWeekSettings(e){Se=Pe(e)}static get twoDigitCutoffYear(){return ke}static set twoDigitCutoffYear(e){ke=e%100}static get throwOnInvalid(){return fe}static set throwOnInvalid(e){fe=e}static resetCaches(){se.resetCache(),U.resetCache(),wr.resetCache(),he.clear()}}class be{constructor(e,t){this.reason=e,this.explanation=t}toMessage(){return this.explanation?`${this.reason}: ${this.explanation}`:this.reason}}const Te=[0,31,59,90,120,151,181,212,243,273,304,334],Ne=[0,31,60,91,121,152,182,213,244,274,305,335];function Oe(e,t){return new be("unit out of range",`you specified ${t} (of type ${typeof t}) as a ${e}, which is invalid`)}function Me(e,t,n){const r=new Date(Date.UTC(e,t-1,n));e<100&&e>=0&&r.setUTCFullYear(r.getUTCFullYear()-1900);const s=r.getUTCDay();return 0===s?7:s}function Ie(e,t,n){return n+(Ke(e)?Ne:Te)[t-1]}function $e(e,t){const n=Ke(e)?Ne:Te,r=n.findIndex(e=>e<t);return{month:r+1,day:t-n[r]}}function Ee(e,t){return(e-t+7)%7+1}function Ve(e,t=4,n=1){const{year:r,month:s,day:i}=e,a=Ie(r,s,i),o=Ee(Me(r,s,i),n);let u,l=Math.floor((a-o+14-t)/7);return l<1?(u=r-1,l=rt(u,t,n)):l>rt(r,t,n)?(u=r+1,l=1):u=r,{weekYear:u,weekNumber:l,weekday:o,...ct(e)}}function xe(e,t=4,n=1){const{weekYear:r,weekNumber:s,weekday:i}=e,a=Ee(Me(r,1,t),n),o=Xe(r);let u,l=7*s+i-a-7+t;l<1?(u=r-1,l+=Xe(u)):l>o?(u=r+1,l-=Xe(r)):u=r;const{month:c,day:d}=$e(u,l);return{year:u,month:c,day:d,...ct(e)}}function Ce(e){const{year:t,month:n,day:r}=e;return{year:t,ordinal:Ie(t,n,r),...ct(e)}}function Fe(e){const{year:t,ordinal:n}=e,{month:r,day:s}=$e(t,n);return{year:t,month:r,day:s,...ct(e)}}function Ze(e,t){if(!ze(e.localWeekday)||!ze(e.localWeekNumber)||!ze(e.localWeekYear)){if(!ze(e.weekday)||!ze(e.weekNumber)||!ze(e.weekYear))throw new u("Cannot mix locale-based week fields with ISO-based week fields");return ze(e.localWeekday)||(e.weekday=e.localWeekday),ze(e.localWeekNumber)||(e.weekNumber=e.localWeekNumber),ze(e.localWeekYear)||(e.weekYear=e.localWeekYear),delete e.localWeekday,delete e.localWeekNumber,delete e.localWeekYear,{minDaysInFirstWeek:t.getMinDaysInFirstWeek(),startOfWeek:t.getStartOfWeek()}}return{minDaysInFirstWeek:4,startOfWeek:1}}function We(e){const t=Ae(e.year),n=Ye(e.month,1,12),r=Ye(e.day,1,et(e.year,e.month));return t?n?!r&&Oe("day",e.day):Oe("month",e.month):Oe("year",e.year)}function Le(e){const{hour:t,minute:n,second:r,millisecond:s}=e,i=Ye(t,0,23)||24===t&&0===n&&0===r&&0===s,a=Ye(n,0,59),o=Ye(r,0,59),u=Ye(s,0,999);return i?a?o?!u&&Oe("millisecond",s):Oe("second",r):Oe("minute",n):Oe("hour",t)}function ze(e){return void 0===e}function je(e){return"number"==typeof e}function Ae(e){return"number"==typeof e&&e%1==0}function _e(){try{return"undefined"!=typeof Intl&&!!Intl.RelativeTimeFormat}catch(e){return!1}}function qe(){try{return"undefined"!=typeof Intl&&!!Intl.Locale&&("weekInfo"in Intl.Locale.prototype||"getWeekInfo"in Intl.Locale.prototype)}catch(e){return!1}}function Ue(e,t,n){if(0!==e.length)return e.reduce((e,r)=>{const s=[t(r),r];return e&&n(e[0],s[0])===e[0]?e:s},null)[1]}function Re(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Pe(e){if(null==e)return null;if("object"!=typeof e)throw new c("Week settings must be an object");if(!Ye(e.firstDay,1,7)||!Ye(e.minimalDays,1,7)||!Array.isArray(e.weekend)||e.weekend.some(e=>!Ye(e,1,7)))throw new c("Invalid week settings");return{firstDay:e.firstDay,minimalDays:e.minimalDays,weekend:Array.from(e.weekend)}}function Ye(e,t,n){return Ae(e)&&e>=t&&e<=n}function He(e,t=2){let n;return n=e<0?"-"+(""+-e).padStart(t,"0"):(""+e).padStart(t,"0"),n}function Je(e){return ze(e)||null===e||""===e?void 0:parseInt(e,10)}function Ge(e){return ze(e)||null===e||""===e?void 0:parseFloat(e)}function Qe(e){if(!ze(e)&&null!==e&&""!==e){const t=1e3*parseFloat("0."+e);return Math.floor(t)}}function Be(e,t,n=!1){const r=10**t;return(n?Math.trunc:Math.round)(e*r)/r}function Ke(e){return e%4==0&&(e%100!=0||e%400==0)}function Xe(e){return Ke(e)?366:365}function et(e,t){const n=function(e,t){return e-t*Math.floor(e/t)}(t-1,12)+1;return 2===n?Ke(e+(t-n)/12)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][n-1]}function tt(e){let t=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond);return e.year<100&&e.year>=0&&(t=new Date(t),t.setUTCFullYear(e.year,e.month-1,e.day)),+t}function nt(e,t,n){return-Ee(Me(e,1,t),n)+t-1}function rt(e,t=4,n=1){const r=nt(e,t,n),s=nt(e+1,t,n);return(Xe(e)-r+s)/7}function st(e){return e>99?e:e>De.twoDigitCutoffYear?1900+e:2e3+e}function it(e,t,n,r=null){const s=new Date(e),i={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};r&&(i.timeZone=r);const a={timeZoneName:t,...i},o=new Intl.DateTimeFormat(n,a).formatToParts(s).find(e=>"timezonename"===e.type.toLowerCase());return o?o.value:null}function at(e,t){let n=parseInt(e,10);Number.isNaN(n)&&(n=0);const r=parseInt(t,10)||0;return 60*n+(n<0||Object.is(n,-0)?-r:r)}function ot(e){const t=Number(e);if("boolean"==typeof e||""===e||Number.isNaN(t))throw new c(`Invalid unit value ${e}`);return t}function ut(e,t){const n={};for(const r in e)if(Re(e,r)){const s=e[r];if(null==s)continue;n[t(r)]=ot(s)}return n}function lt(e,t){const n=Math.trunc(Math.abs(e/60)),r=Math.trunc(Math.abs(e%60)),s=e>=0?"+":"-";switch(t){case"short":return`${s}${He(n,2)}:${He(r,2)}`;case"narrow":return`${s}${n}${r>0?`:${r}`:""}`;case"techie":return`${s}${He(n,2)}${He(r,2)}`;default:throw new RangeError(`Value format ${t} is out of range for property format`)}}function ct(e){return function(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}(e,["hour","minute","second","millisecond"])}const dt=["January","February","March","April","May","June","July","August","September","October","November","December"],ht=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],mt=["J","F","M","A","M","J","J","A","S","O","N","D"];function ft(e){switch(e){case"narrow":return[...mt];case"short":return[...ht];case"long":return[...dt];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 yt=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],gt=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],pt=["M","T","W","T","F","S","S"];function wt(e){switch(e){case"narrow":return[...pt];case"short":return[...gt];case"long":return[...yt];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}const vt=["AM","PM"],kt=["Before Christ","Anno Domini"],St=["BC","AD"],Dt=["B","A"];function bt(e){switch(e){case"narrow":return[...Dt];case"short":return[...St];case"long":return[...kt];default:return null}}function Tt(e,t){let n="";for(const r of e)r.literal?n+=r.val:n+=t(r.val);return n}const Nt={D:y,DD:g,DDD:w,DDDD:v,t:k,tt:S,ttt:D,tttt:b,T:T,TT:N,TTT:O,TTTT:M,f:I,ff:E,fff:C,ffff:Z,F:$,FF:V,FFF:F,FFFF:W};class Ot{static create(e,t={}){return new Ot(e,t)}static parseFormat(e){let t=null,n="",r=!1;const s=[];for(let i=0;i<e.length;i++){const a=e.charAt(i);"'"===a?(n.length>0&&s.push({literal:r||/^\s+$/.test(n),val:n}),t=null,n="",r=!r):r||a===t?n+=a:(n.length>0&&s.push({literal:/^\s+$/.test(n),val:n}),n=a,t=a)}return n.length>0&&s.push({literal:r||/^\s+$/.test(n),val:n}),s}static macroTokenToFormatOpts(e){return Nt[e]}constructor(e,t){this.opts=t,this.loc=e,this.systemLoc=null}formatWithSystemDefault(e,t){null===this.systemLoc&&(this.systemLoc=this.loc.redefaultToSystem());return this.systemLoc.dtFormatter(e,{...this.opts,...t}).format()}dtFormatter(e,t={}){return this.loc.dtFormatter(e,{...this.opts,...t})}formatDateTime(e,t){return this.dtFormatter(e,t).format()}formatDateTimeParts(e,t){return this.dtFormatter(e,t).formatToParts()}formatInterval(e,t){return this.dtFormatter(e.start,t).dtf.formatRange(e.start.toJSDate(),e.end.toJSDate())}resolvedOptions(e,t){return this.dtFormatter(e,t).resolvedOptions()}num(e,t=0){if(this.opts.forceSimple)return He(e,t);const n={...this.opts};return t>0&&(n.padTo=t),this.loc.numberFormatter(n).format(e)}formatDateTimeFromString(e,t){const n="en"===this.loc.listingMode(),r=this.loc.outputCalendar&&"gregory"!==this.loc.outputCalendar,s=(t,n)=>this.loc.extract(e,t,n),i=t=>e.isOffsetFixed&&0===e.offset&&t.allowZ?"Z":e.isValid?e.zone.formatOffset(e.ts,t.format):"",a=()=>n?function(e){return vt[e.hour<12?0:1]}(e):s({hour:"numeric",hourCycle:"h12"},"dayperiod"),o=(t,r)=>n?function(e,t){return ft(t)[e.month-1]}(e,t):s(r?{month:t}:{month:t,day:"numeric"},"month"),u=(t,r)=>n?function(e,t){return wt(t)[e.weekday-1]}(e,t):s(r?{weekday:t}:{weekday:t,month:"long",day:"numeric"},"weekday"),l=t=>{const n=Ot.macroTokenToFormatOpts(t);return n?this.formatWithSystemDefault(e,n):t},c=t=>n?function(e,t){return bt(t)[e.year<0?0:1]}(e,t):s({era:t},"era");return Tt(Ot.parseFormat(t),t=>{switch(t){case"S":return this.num(e.millisecond);case"u":case"SSS":return this.num(e.millisecond,3);case"s":return this.num(e.second);case"ss":return this.num(e.second,2);case"uu":return this.num(Math.floor(e.millisecond/10),2);case"uuu":return this.num(Math.floor(e.millisecond/100));case"m":return this.num(e.minute);case"mm":return this.num(e.minute,2);case"h":return this.num(e.hour%12==0?12:e.hour%12);case"hh":return this.num(e.hour%12==0?12:e.hour%12,2);case"H":return this.num(e.hour);case"HH":return this.num(e.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 e.zone.offsetName(e.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return e.zone.offsetName(e.ts,{format:"long",locale:this.loc.locale});case"z":return e.zoneName;case"a":return a();case"d":return r?s({day:"numeric"},"day"):this.num(e.day);case"dd":return r?s({day:"2-digit"},"day"):this.num(e.day,2);case"c":case"E":return this.num(e.weekday);case"ccc":return u("short",!0);case"cccc":return u("long",!0);case"ccccc":return u("narrow",!0);case"EEE":return u("short",!1);case"EEEE":return u("long",!1);case"EEEEE":return u("narrow",!1);case"L":return r?s({month:"numeric",day:"numeric"},"month"):this.num(e.month);case"LL":return r?s({month:"2-digit",day:"numeric"},"month"):this.num(e.month,2);case"LLL":return o("short",!0);case"LLLL":return o("long",!0);case"LLLLL":return o("narrow",!0);case"M":return r?s({month:"numeric"},"month"):this.num(e.month);case"MM":return r?s({month:"2-digit"},"month"):this.num(e.month,2);case"MMM":return o("short",!1);case"MMMM":return o("long",!1);case"MMMMM":return o("narrow",!1);case"y":return r?s({year:"numeric"},"year"):this.num(e.year);case"yy":return r?s({year:"2-digit"},"year"):this.num(e.year.toString().slice(-2),2);case"yyyy":return r?s({year:"numeric"},"year"):this.num(e.year,4);case"yyyyyy":return r?s({year:"numeric"},"year"):this.num(e.year,6);case"G":return c("short");case"GG":return c("long");case"GGGGG":return c("narrow");case"kk":return this.num(e.weekYear.toString().slice(-2),2);case"kkkk":return this.num(e.weekYear,4);case"W":return this.num(e.weekNumber);case"WW":return this.num(e.weekNumber,2);case"n":return this.num(e.localWeekNumber);case"nn":return this.num(e.localWeekNumber,2);case"ii":return this.num(e.localWeekYear.toString().slice(-2),2);case"iiii":return this.num(e.localWeekYear,4);case"o":return this.num(e.ordinal);case"ooo":return this.num(e.ordinal,3);case"q":return this.num(e.quarter);case"qq":return this.num(e.quarter,2);case"X":return this.num(Math.floor(e.ts/1e3));case"x":return this.num(e.ts);default:return l(t)}})}formatDurationFromString(e,t){const n=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}},r=Ot.parseFormat(t),s=r.reduce((e,{literal:t,val:n})=>t?e:e.concat(n),[]);return Tt(r,(e=>t=>{const r=n(t);return r?this.num(e.get(r),t.length):t})(e.shiftTo(...s.map(n).filter(e=>e))))}}const Mt=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;function It(...e){const t=e.reduce((e,t)=>e+t.source,"");return RegExp(`^${t}$`)}function $t(...e){return t=>e.reduce(([e,n,r],s)=>{const[i,a,o]=s(t,r);return[{...e,...i},a||n,o]},[{},null,1]).slice(0,2)}function Et(e,...t){if(null==e)return[null,null];for(const[n,r]of t){const t=n.exec(e);if(t)return r(t)}return[null,null]}function Vt(...e){return(t,n)=>{const r={};let s;for(s=0;s<e.length;s++)r[e[s]]=Je(t[n+s]);return[r,null,n+s]}}const xt=/(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/,Ct=/(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/,Ft=RegExp(`${Ct.source}${`(?:${xt.source}?(?:\\[(${Mt.source})\\])?)?`}`),Zt=RegExp(`(?:T${Ft.source})?`),Wt=Vt("weekYear","weekNumber","weekDay"),Lt=Vt("year","ordinal"),zt=RegExp(`${Ct.source} ?(?:${xt.source}|(${Mt.source}))?`),jt=RegExp(`(?: ${zt.source})?`);function At(e,t,n){const r=e[t];return ze(r)?n:Je(r)}function _t(e,t){return[{hours:At(e,t,0),minutes:At(e,t+1,0),seconds:At(e,t+2,0),milliseconds:Qe(e[t+3])},null,t+4]}function qt(e,t){const n=!e[t]&&!e[t+1],r=at(e[t+1],e[t+2]);return[{},n?null:ae.instance(r),t+3]}function Ut(e,t){return[{},e[t]?U.create(e[t]):null,t+1]}const Rt=RegExp(`^T?${Ct.source}$`),Pt=/^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/;function Yt(e){const[t,n,r,s,i,a,o,u,l]=e,c="-"===t[0],d=u&&"-"===u[0],h=(e,t=!1)=>void 0!==e&&(t||e&&c)?-e:e;return[{years:h(Ge(n)),months:h(Ge(r)),weeks:h(Ge(s)),days:h(Ge(i)),hours:h(Ge(a)),minutes:h(Ge(o)),seconds:h(Ge(u),"-0"===u),milliseconds:h(Qe(l),d)}]}const Ht={GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Jt(e,t,n,r,s,i,a){const o={year:2===t.length?st(Je(t)):Je(t),month:ht.indexOf(n)+1,day:Je(r),hour:Je(s),minute:Je(i)};return a&&(o.second=Je(a)),e&&(o.weekday=e.length>3?yt.indexOf(e)+1:gt.indexOf(e)+1),o}const Gt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function Qt(e){const[,t,n,r,s,i,a,o,u,l,c,d]=e,h=Jt(t,s,r,n,i,a,o);let m;return m=u?Ht[u]:l?0:at(c,d),[h,new ae(m)]}const Bt=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,Kt=/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,Xt=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function en(e){const[,t,n,r,s,i,a,o]=e;return[Jt(t,s,r,n,i,a,o),ae.utcInstance]}function tn(e){const[,t,n,r,s,i,a,o]=e;return[Jt(t,o,n,r,s,i,a),ae.utcInstance]}const nn=It(/([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,Zt),rn=It(/(\d{4})-?W(\d\d)(?:-?(\d))?/,Zt),sn=It(/(\d{4})-?(\d{3})/,Zt),an=It(Ft),on=$t(function(e,t){return[{year:At(e,t),month:At(e,t+1,1),day:At(e,t+2,1)},null,t+3]},_t,qt,Ut),un=$t(Wt,_t,qt,Ut),ln=$t(Lt,_t,qt,Ut),cn=$t(_t,qt,Ut);const dn=$t(_t);const hn=It(/(\d{4})-(\d\d)-(\d\d)/,jt),mn=It(zt),fn=$t(_t,qt,Ut);const yn="Invalid Duration",gn={weeks:{days:7,hours:168,minutes:10080,seconds:604800,milliseconds:6048e5},days:{hours:24,minutes:1440,seconds:86400,milliseconds:864e5},hours:{minutes:60,seconds:3600,milliseconds:36e5},minutes:{seconds:60,milliseconds:6e4},seconds:{milliseconds:1e3}},pn={years:{quarters:4,months:12,weeks:52,days:365,hours:8760,minutes:525600,seconds:31536e3,milliseconds:31536e6},quarters:{months:3,weeks:13,days:91,hours:2184,minutes:131040,seconds:7862400,milliseconds:78624e5},months:{weeks:4,days:30,hours:720,minutes:43200,seconds:2592e3,milliseconds:2592e6},...gn},wn=365.2425,vn=30.436875,kn={years:{quarters:4,months:12,weeks:52.1775,days:wn,hours:8765.82,minutes:525949.2,seconds:525949.2*60,milliseconds:525949.2*60*1e3},quarters:{months:3,weeks:13.044375,days:91.310625,hours:2191.455,minutes:131487.3,seconds:525949.2*60/4,milliseconds:7889237999.999999},months:{weeks:4.3481250000000005,days:vn,hours:730.485,minutes:43829.1,seconds:2629746,milliseconds:2629746e3},...gn},Sn=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],Dn=Sn.slice(0).reverse();function bn(e,t,n=!1){const r={values:n?t.values:{...e.values,...t.values||{}},loc:e.loc.clone(t.loc),conversionAccuracy:t.conversionAccuracy||e.conversionAccuracy,matrix:t.matrix||e.matrix};return new On(r)}function Tn(e,t){let n=t.milliseconds??0;for(const r of Dn.slice(1))t[r]&&(n+=t[r]*e[r].milliseconds);return n}function Nn(e,t){const n=Tn(e,t)<0?-1:1;Sn.reduceRight((r,s)=>{if(ze(t[s]))return r;if(r){const i=t[r]*n,a=e[s][r],o=Math.floor(i/a);t[s]+=o*n,t[r]-=o*a*n}return s},null),Sn.reduce((n,r)=>{if(ze(t[r]))return n;if(n){const s=t[n]%1;t[n]-=s,t[r]+=s*e[n][r]}return r},null)}class On{constructor(e){const t="longterm"===e.conversionAccuracy||!1;let n=t?kn:pn;e.matrix&&(n=e.matrix),this.values=e.values,this.loc=e.loc||se.create(),this.conversionAccuracy=t?"longterm":"casual",this.invalid=e.invalid||null,this.matrix=n,this.isLuxonDuration=!0}static fromMillis(e,t){return On.fromObject({milliseconds:e},t)}static fromObject(e,t={}){if(null==e||"object"!=typeof e)throw new c("Duration.fromObject: argument expected to be an object, got "+(null===e?"null":typeof e));return new On({values:ut(e,On.normalizeUnit),loc:se.fromObject(t),conversionAccuracy:t.conversionAccuracy,matrix:t.matrix})}static fromDurationLike(e){if(je(e))return On.fromMillis(e);if(On.isDuration(e))return e;if("object"==typeof e)return On.fromObject(e);throw new c(`Unknown duration argument ${e} of type ${typeof e}`)}static fromISO(e,t){const[n]=function(e){return Et(e,[Pt,Yt])}(e);return n?On.fromObject(n,t):On.invalid("unparsable",`the input "${e}" can't be parsed as ISO 8601`)}static fromISOTime(e,t){const[n]=function(e){return Et(e,[Rt,dn])}(e);return n?On.fromObject(n,t):On.invalid("unparsable",`the input "${e}" can't be parsed as ISO 8601`)}static invalid(e,t=null){if(!e)throw new c("need to specify a reason the Duration is invalid");const n=e instanceof be?e:new be(e,t);if(De.throwOnInvalid)throw new o(n);return new On({invalid:n})}static normalizeUnit(e){const 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():e];if(!t)throw new l(e);return t}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={}){const n={...t,floor:!1!==t.round&&!1!==t.floor};return this.isValid?Ot.create(this.loc,n).formatDurationFromString(this,e):yn}toHuman(e={}){if(!this.isValid)return yn;const t=Sn.map(t=>{const n=this.values[t];return ze(n)?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...e,unit:t.slice(0,-1)}).format(n)}).filter(e=>e);return this.loc.listFormatter({type:"conjunction",style:e.listStyle||"narrow",...e}).format(t)}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+=Be(this.seconds+this.milliseconds/1e3,3)+"S"),"P"===e&&(e+="T0S"),e}toISOTime(e={}){if(!this.isValid)return null;const t=this.toMillis();if(t<0||t>=864e5)return null;e={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...e,includeOffset:!1};return wr.fromMillis(t,{zone:"UTC"}).toISOTime(e)}toJSON(){return this.toISO()}toString(){return this.toISO()}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Duration { values: ${JSON.stringify(this.values)} }`:`Duration { Invalid, reason: ${this.invalidReason} }`}toMillis(){return this.isValid?Tn(this.matrix,this.values):NaN}valueOf(){return this.toMillis()}plus(e){if(!this.isValid)return this;const t=On.fromDurationLike(e),n={};for(const e of Sn)(Re(t.values,e)||Re(this.values,e))&&(n[e]=t.get(e)+this.get(e));return bn(this,{values:n},!0)}minus(e){if(!this.isValid)return this;const t=On.fromDurationLike(e);return this.plus(t.negate())}mapUnits(e){if(!this.isValid)return this;const t={};for(const n of Object.keys(this.values))t[n]=ot(e(this.values[n],n));return bn(this,{values:t},!0)}get(e){return this[On.normalizeUnit(e)]}set(e){if(!this.isValid)return this;return bn(this,{values:{...this.values,...ut(e,On.normalizeUnit)}})}reconfigure({locale:e,numberingSystem:t,conversionAccuracy:n,matrix:r}={}){return bn(this,{loc:this.loc.clone({locale:e,numberingSystem:t}),matrix:r,conversionAccuracy:n})}as(e){return this.isValid?this.shiftTo(e).get(e):NaN}normalize(){if(!this.isValid)return this;const e=this.toObject();return Nn(this.matrix,e),bn(this,{values:e},!0)}rescale(){if(!this.isValid)return this;return bn(this,{values:function(e){const t={};for(const[n,r]of Object.entries(e))0!==r&&(t[n]=r);return t}(this.normalize().shiftToAll().toObject())},!0)}shiftTo(...e){if(!this.isValid)return this;if(0===e.length)return this;e=e.map(e=>On.normalizeUnit(e));const t={},n={},r=this.toObject();let s;for(const i of Sn)if(e.indexOf(i)>=0){s=i;let e=0;for(const t in n)e+=this.matrix[t][i]*n[t],n[t]=0;je(r[i])&&(e+=r[i]);const a=Math.trunc(e);t[i]=a,n[i]=(1e3*e-1e3*a)/1e3}else je(r[i])&&(n[i]=r[i]);for(const e in n)0!==n[e]&&(t[s]+=e===s?n[e]:n[e]/this.matrix[s][e]);return Nn(this.matrix,t),bn(this,{values:t},!0)}shiftToAll(){return this.isValid?this.shiftTo("years","months","weeks","days","hours","minutes","seconds","milliseconds"):this}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 bn(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;function t(e,t){return void 0===e||0===e?void 0===t||0===t:e===t}for(const n of Sn)if(!t(this.values[n],e.values[n]))return!1;return!0}}const Mn="Invalid Interval";class In{constructor(e){this.s=e.start,this.e=e.end,this.invalid=e.invalid||null,this.isLuxonInterval=!0}static invalid(e,t=null){if(!e)throw new c("need to specify a reason the Interval is invalid");const n=e instanceof be?e:new be(e,t);if(De.throwOnInvalid)throw new a(n);return new In({invalid:n})}static fromDateTimes(e,t){const n=vr(e),r=vr(t),s=function(e,t){return e&&e.isValid?t&&t.isValid?t<e?In.invalid("end before start",`The end of an interval must be after its start, but you had start=${e.toISO()} and end=${t.toISO()}`):null:In.invalid("missing or invalid end"):In.invalid("missing or invalid start")}(n,r);return null==s?new In({start:n,end:r}):s}static after(e,t){const n=On.fromDurationLike(t),r=vr(e);return In.fromDateTimes(r,r.plus(n))}static before(e,t){const n=On.fromDurationLike(t),r=vr(e);return In.fromDateTimes(r.minus(n),r)}static fromISO(e,t){const[n,r]=(e||"").split("/",2);if(n&&r){let e,s,i,a;try{e=wr.fromISO(n,t),s=e.isValid}catch(r){s=!1}try{i=wr.fromISO(r,t),a=i.isValid}catch(r){a=!1}if(s&&a)return In.fromDateTimes(e,i);if(s){const n=On.fromISO(r,t);if(n.isValid)return In.after(e,n)}else if(a){const e=On.fromISO(n,t);if(e.isValid)return In.before(i,e)}}return In.invalid("unparsable",`the input "${e}" can't be parsed as ISO 8601`)}static isInterval(e){return e&&e.isLuxonInterval||!1}get start(){return this.isValid?this.s:null}get end(){return this.isValid?this.e:null}get lastDateTime(){return this.isValid&&this.e?this.e.minus(1):null}get isValid(){return null===this.invalidReason}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}length(e="milliseconds"){return this.isValid?this.toDuration(e).get(e):NaN}count(e="milliseconds",t){if(!this.isValid)return NaN;const n=this.start.startOf(e,t);let r;return r=t?.useLocaleWeeks?this.end.reconfigure({locale:n.locale}):this.end,r=r.startOf(e,t),Math.floor(r.diff(n,e).get(e))+(r.valueOf()!==this.end.valueOf())}hasSame(e){return!!this.isValid&&(this.isEmpty()||this.e.minus(1).hasSame(this.s,e))}isEmpty(){return this.s.valueOf()===this.e.valueOf()}isAfter(e){return!!this.isValid&&this.s>e}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?In.fromDateTimes(e||this.s,t||this.e):this}splitAt(...e){if(!this.isValid)return[];const t=e.map(vr).filter(e=>this.contains(e)).sort((e,t)=>e.toMillis()-t.toMillis()),n=[];let{s:r}=this,s=0;for(;r<this.e;){const e=t[s]||this.e,i=+e>+this.e?this.e:e;n.push(In.fromDateTimes(r,i)),r=i,s+=1}return n}splitBy(e){const t=On.fromDurationLike(e);if(!this.isValid||!t.isValid||0===t.as("milliseconds"))return[];let n,{s:r}=this,s=1;const i=[];for(;r<this.e;){const e=this.start.plus(t.mapUnits(e=>e*s));n=+e>+this.e?this.e:e,i.push(In.fromDateTimes(r,n)),r=n,s+=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}abutsStart(e){return!!this.isValid&&+this.e===+e.s}abutsEnd(e){return!!this.isValid&&+e.e===+this.s}engulfs(e){return!!this.isValid&&(this.s<=e.s&&this.e>=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;const t=this.s>e.s?this.s:e.s,n=this.e<e.e?this.e:e.e;return t>=n?null:In.fromDateTimes(t,n)}union(e){if(!this.isValid)return this;const t=this.s<e.s?this.s:e.s,n=this.e>e.e?this.e:e.e;return In.fromDateTimes(t,n)}static merge(e){const[t,n]=e.sort((e,t)=>e.s-t.s).reduce(([e,t],n)=>t?t.overlaps(n)||t.abutsStart(n)?[e,t.union(n)]:[e.concat([t]),n]:[e,n],[[],null]);return n&&t.push(n),t}static xor(e){let t=null,n=0;const r=[],s=e.map(e=>[{time:e.s,type:"s"},{time:e.e,type:"e"}]),i=Array.prototype.concat(...s).sort((e,t)=>e.time-t.time);for(const e of i)n+="s"===e.type?1:-1,1===n?t=e.time:(t&&+t!==+e.time&&r.push(In.fromDateTimes(t,e.time)),t=null);return In.merge(r)}difference(...e){return In.xor([this].concat(e)).map(e=>this.intersection(e)).filter(e=>e&&!e.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} – ${this.e.toISO()})`:Mn}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`:`Interval { Invalid, reason: ${this.invalidReason} }`}toLocaleString(e=y,t={}){return this.isValid?Ot.create(this.s.loc.clone(t),e).formatInterval(this):Mn}toISO(e){return this.isValid?`${this.s.toISO(e)}/${this.e.toISO(e)}`:Mn}toISODate(){return this.isValid?`${this.s.toISODate()}/${this.e.toISODate()}`:Mn}toISOTime(e){return this.isValid?`${this.s.toISOTime(e)}/${this.e.toISOTime(e)}`:Mn}toFormat(e,{separator:t=" – "}={}){return this.isValid?`${this.s.toFormat(e)}${t}${this.e.toFormat(e)}`:Mn}toDuration(e,t){return this.isValid?this.e.diff(this.s,e,t):On.invalid(this.invalidReason)}mapEndpoints(e){return In.fromDateTimes(e(this.s),e(this.e))}}class $n{static hasDST(e=De.defaultZone){const t=wr.now().setZone(e).set({month:12});return!e.isUniversal&&t.offset!==t.set({month:6}).offset}static isValidIANAZone(e){return U.isValidZone(e)}static normalizeZone(e){return ue(e,De.defaultZone)}static getStartOfWeek({locale:e=null,locObj:t=null}={}){return(t||se.create(e)).getStartOfWeek()}static getMinimumDaysInFirstWeek({locale:e=null,locObj:t=null}={}){return(t||se.create(e)).getMinDaysInFirstWeek()}static getWeekendWeekdays({locale:e=null,locObj:t=null}={}){return(t||se.create(e)).getWeekendDays().slice()}static months(e="long",{locale:t=null,numberingSystem:n=null,locObj:r=null,outputCalendar:s="gregory"}={}){return(r||se.create(t,n,s)).months(e)}static monthsFormat(e="long",{locale:t=null,numberingSystem:n=null,locObj:r=null,outputCalendar:s="gregory"}={}){return(r||se.create(t,n,s)).months(e,!0)}static weekdays(e="long",{locale:t=null,numberingSystem:n=null,locObj:r=null}={}){return(r||se.create(t,n,null)).weekdays(e)}static weekdaysFormat(e="long",{locale:t=null,numberingSystem:n=null,locObj:r=null}={}){return(r||se.create(t,n,null)).weekdays(e,!0)}static meridiems({locale:e=null}={}){return se.create(e).meridiems()}static eras(e="short",{locale:t=null}={}){return se.create(t,null,"gregory").eras(e)}static features(){return{relative:_e(),localeWeek:qe()}}}function En(e,t){const n=e=>e.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),r=n(t)-n(e);return Math.floor(On.fromMillis(r).as("days"))}function Vn(e,t,n,r){let[s,i,a,o]=function(e,t,n){const r=[["years",(e,t)=>t.year-e.year],["quarters",(e,t)=>t.quarter-e.quarter+4*(t.year-e.year)],["months",(e,t)=>t.month-e.month+12*(t.year-e.year)],["weeks",(e,t)=>{const n=En(e,t);return(n-n%7)/7}],["days",En]],s={},i=e;let a,o;for(const[u,l]of r)n.indexOf(u)>=0&&(a=u,s[u]=l(e,t),o=i.plus(s),o>t?(s[u]--,(e=i.plus(s))>t&&(o=e,s[u]--,e=i.plus(s))):e=o);return[e,s,o,a]}(e,t,n);const u=t-s,l=n.filter(e=>["hours","minutes","seconds","milliseconds"].indexOf(e)>=0);0===l.length&&(a<t&&(a=s.plus({[o]:1})),a!==s&&(i[o]=(i[o]||0)+u/(a-s)));const c=On.fromObject(i,r);return l.length>0?On.fromMillis(u,r).shiftTo(...l).plus(c):c}function xn(e,t=e=>e){return{regex:e,deser:([e])=>t(function(e){let t=parseInt(e,10);if(isNaN(t)){t="";for(let n=0;n<e.length;n++){const r=e.charCodeAt(n);if(-1!==e[n].search(le.hanidec))t+=de.indexOf(e[n]);else for(const e in ce){const[n,s]=ce[e];r>=n&&r<=s&&(t+=r-n)}}return parseInt(t,10)}return t}(e))}}const Cn=`[ ${String.fromCharCode(160)}]`,Fn=new RegExp(Cn,"g");function Zn(e){return e.replace(/\./g,"\\.?").replace(Fn,Cn)}function Wn(e){return e.replace(/\./g,"").replace(Fn," ").toLowerCase()}function Ln(e,t){return null===e?null:{regex:RegExp(e.map(Zn).join("|")),deser:([n])=>e.findIndex(e=>Wn(n)===Wn(e))+t}}function zn(e,t){return{regex:e,deser:([,e,t])=>at(e,t),groups:t}}function jn(e){return{regex:e,deser:([e])=>e}}const An={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",hour12:{numeric:"h","2-digit":"hh"},hour24:{numeric:"H","2-digit":"HH"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"},timeZoneName:{long:"ZZZZZ",short:"ZZZ"}};let _n=null;function qn(e,t){return Array.prototype.concat(...e.map(e=>function(e,t){if(e.literal)return e;const n=Pn(Ot.macroTokenToFormatOpts(e.val),t);return null==n||n.includes(void 0)?e:n}(e,t)))}class Un{constructor(e,t){if(this.locale=e,this.format=t,this.tokens=qn(Ot.parseFormat(t),e),this.units=this.tokens.map(t=>function(e,t){const n=me(t),r=me(t,"{2}"),s=me(t,"{3}"),i=me(t,"{4}"),a=me(t,"{6}"),o=me(t,"{1,2}"),u=me(t,"{1,3}"),l=me(t,"{1,6}"),c=me(t,"{1,9}"),d=me(t,"{2,4}"),h=me(t,"{4,6}"),m=e=>{return{regex:RegExp((t=e.val,t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"))),deser:([e])=>e,literal:!0};var t},f=(f=>{if(e.literal)return m(f);switch(f.val){case"G":return Ln(t.eras("short"),0);case"GG":return Ln(t.eras("long"),0);case"y":return xn(l);case"yy":case"kk":return xn(d,st);case"yyyy":case"kkkk":return xn(i);case"yyyyy":return xn(h);case"yyyyyy":return xn(a);case"M":case"L":case"d":case"H":case"h":case"m":case"q":case"s":case"W":return xn(o);case"MM":case"LL":case"dd":case"HH":case"hh":case"mm":case"qq":case"ss":case"WW":return xn(r);case"MMM":return Ln(t.months("short",!0),1);case"MMMM":return Ln(t.months("long",!0),1);case"LLL":return Ln(t.months("short",!1),1);case"LLLL":return Ln(t.months("long",!1),1);case"o":case"S":return xn(u);case"ooo":case"SSS":return xn(s);case"u":return jn(c);case"uu":return jn(o);case"uuu":case"E":case"c":return xn(n);case"a":return Ln(t.meridiems(),0);case"EEE":return Ln(t.weekdays("short",!1),1);case"EEEE":return Ln(t.weekdays("long",!1),1);case"ccc":return Ln(t.weekdays("short",!0),1);case"cccc":return Ln(t.weekdays("long",!0),1);case"Z":case"ZZ":return zn(new RegExp(`([+-]${o.source})(?::(${r.source}))?`),2);case"ZZZ":return zn(new RegExp(`([+-]${o.source})(${r.source})?`),2);case"z":return jn(/[a-z_+-/]{1,256}?/i);case" ":return jn(/[^\S\n\r]/);default:return m(f)}})(e)||{invalidReason:"missing Intl.DateTimeFormat.formatToParts support"};return f.token=e,f}(t,e)),this.disqualifyingUnit=this.units.find(e=>e.invalidReason),!this.disqualifyingUnit){const[e,t]=[`^${(n=this.units).map(e=>e.regex).reduce((e,t)=>`${e}(${t.source})`,"")}$`,n];this.regex=RegExp(e,"i"),this.handlers=t}var n}explainFromTokens(e){if(this.isValid){const[t,n]=function(e,t,n){const r=e.match(t);if(r){const e={};let t=1;for(const s in n)if(Re(n,s)){const i=n[s],a=i.groups?i.groups+1:1;!i.literal&&i.token&&(e[i.token.val[0]]=i.deser(r.slice(t,t+a))),t+=a}return[r,e]}return[r,{}]}(e,this.regex,this.handlers),[r,s,i]=n?function(e){let t,n=null;return ze(e.z)||(n=U.create(e.z)),ze(e.Z)||(n||(n=new ae(e.Z)),t=e.Z),ze(e.q)||(e.M=3*(e.q-1)+1),ze(e.h)||(e.h<12&&1===e.a?e.h+=12:12===e.h&&0===e.a&&(e.h=0)),0===e.G&&e.y&&(e.y=-e.y),ze(e.u)||(e.S=Qe(e.u)),[Object.keys(e).reduce((t,n)=>{const 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}})(n);return r&&(t[r]=e[n]),t},{}),n,t]}(n):[null,null,void 0];if(Re(n,"a")&&Re(n,"H"))throw new u("Can't include meridiem when specifying 24-hour format");return{input:e,tokens:this.tokens,regex:this.regex,rawMatches:t,matches:n,result:r,zone:s,specificOffset:i}}return{input:e,tokens:this.tokens,invalidReason:this.invalidReason}}get isValid(){return!this.disqualifyingUnit}get invalidReason(){return this.disqualifyingUnit?this.disqualifyingUnit.invalidReason:null}}function Rn(e,t,n){return new Un(e,n).explainFromTokens(t)}function Pn(e,t){if(!e)return null;const n=Ot.create(t,e).dtFormatter((_n||(_n=wr.fromMillis(1555555555555)),_n)),r=n.formatToParts(),s=n.resolvedOptions();return r.map(t=>function(e,t,n){const{type:r,value:s}=e;if("literal"===r){const e=/^\s+$/.test(s);return{literal:!e,val:e?" ":s}}const i=t[r];let a=r;"hour"===r&&(a=null!=t.hour12?t.hour12?"hour12":"hour24":null!=t.hourCycle?"h11"===t.hourCycle||"h12"===t.hourCycle?"hour12":"hour24":n.hour12?"hour12":"hour24");let o=An[a];if("object"==typeof o&&(o=o[i]),o)return{literal:!1,val:o}}(t,e,s))}const Yn="Invalid DateTime",Hn=864e13;function Jn(e){return new be("unsupported zone",`the zone "${e.name}" is not supported`)}function Gn(e){return null===e.weekData&&(e.weekData=Ve(e.c)),e.weekData}function Qn(e){return null===e.localWeekData&&(e.localWeekData=Ve(e.c,e.loc.getMinDaysInFirstWeek(),e.loc.getStartOfWeek())),e.localWeekData}function Bn(e,t){const n={ts:e.ts,zone:e.zone,c:e.c,o:e.o,loc:e.loc,invalid:e.invalid};return new wr({...n,...t,old:n})}function Kn(e,t,n){let r=e-60*t*1e3;const s=n.offset(r);if(t===s)return[r,t];r-=60*(s-t)*1e3;const i=n.offset(r);return s===i?[r,s]:[e-60*Math.min(s,i)*1e3,Math.max(s,i)]}function Xn(e,t){const n=new Date(e+=60*t*1e3);return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate(),hour:n.getUTCHours(),minute:n.getUTCMinutes(),second:n.getUTCSeconds(),millisecond:n.getUTCMilliseconds()}}function er(e,t,n){return Kn(tt(e),t,n)}function tr(e,t){const n=e.o,r=e.c.year+Math.trunc(t.years),s=e.c.month+Math.trunc(t.months)+3*Math.trunc(t.quarters),i={...e.c,year:r,month:s,day:Math.min(e.c.day,et(r,s))+Math.trunc(t.days)+7*Math.trunc(t.weeks)},a=On.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"),o=tt(i);let[u,l]=Kn(o,n,e.zone);return 0!==a&&(u+=a,l=e.zone.offset(u)),{ts:u,o:l}}function nr(e,t,n,r,s,i){const{setZone:a,zone:o}=n;if(e&&0!==Object.keys(e).length||t){const r=t||o,s=wr.fromObject(e,{...n,zone:r,specificOffset:i});return a?s:s.setZone(o)}return wr.invalid(new be("unparsable",`the input "${s}" can't be parsed as ${r}`))}function rr(e,t,n=!0){return e.isValid?Ot.create(se.create("en-US"),{allowZ:n,forceSimple:!0}).formatDateTimeFromString(e,t):null}function sr(e,t){const n=e.c.year>9999||e.c.year<0;let r="";return n&&e.c.year>=0&&(r+="+"),r+=He(e.c.year,n?6:4),t?(r+="-",r+=He(e.c.month),r+="-",r+=He(e.c.day)):(r+=He(e.c.month),r+=He(e.c.day)),r}function ir(e,t,n,r,s,i){let a=He(e.c.hour);return t?(a+=":",a+=He(e.c.minute),0===e.c.millisecond&&0===e.c.second&&n||(a+=":")):a+=He(e.c.minute),0===e.c.millisecond&&0===e.c.second&&n||(a+=He(e.c.second),0===e.c.millisecond&&r||(a+=".",a+=He(e.c.millisecond,3))),s&&(e.isOffsetFixed&&0===e.offset&&!i?a+="Z":e.o<0?(a+="-",a+=He(Math.trunc(-e.o/60)),a+=":",a+=He(Math.trunc(-e.o%60))):(a+="+",a+=He(Math.trunc(e.o/60)),a+=":",a+=He(Math.trunc(e.o%60)))),i&&(a+="["+e.zone.ianaName+"]"),a}const ar={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},or={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},ur={ordinal:1,hour:0,minute:0,second:0,millisecond:0},lr=["year","month","day","hour","minute","second","millisecond"],cr=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],dr=["year","ordinal","hour","minute","second","millisecond"];function hr(e){switch(e.toLowerCase()){case"localweekday":case"localweekdays":return"localWeekday";case"localweeknumber":case"localweeknumbers":return"localWeekNumber";case"localweekyear":case"localweekyears":return"localWeekYear";default:return function(e){const t={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[e.toLowerCase()];if(!t)throw new l(e);return t}(e)}}function mr(e,t){const n=ue(t.zone,De.defaultZone);if(!n.isValid)return wr.invalid(Jn(n));const r=se.fromObject(t);let s,i;if(ze(e.year))s=De.now();else{for(const t of lr)ze(e[t])&&(e[t]=ar[t]);const t=We(e)||Le(e);if(t)return wr.invalid(t);const r=function(e){if(void 0===gr&&(gr=De.now()),"iana"!==e.type)return e.offset(gr);const t=e.name;let n=pr.get(t);return void 0===n&&(n=e.offset(gr),pr.set(t,n)),n}(n);[s,i]=er(e,r,n)}return new wr({ts:s,zone:n,loc:r,o:i})}function fr(e,t,n){const r=!!ze(n.round)||n.round,s=(e,s)=>{e=Be(e,r||n.calendary?0:2,!0);return t.loc.clone(n).relFormatter(n).format(e,s)},i=r=>n.calendary?t.hasSame(e,r)?0:t.startOf(r).diff(e.startOf(r),r).get(r):t.diff(e,r).get(r);if(n.unit)return s(i(n.unit),n.unit);for(const e of n.units){const t=i(e);if(Math.abs(t)>=1)return s(t,e)}return s(e>t?-0:0,n.units[n.units.length-1])}function yr(e){let t,n={};return e.length>0&&"object"==typeof e[e.length-1]?(n=e[e.length-1],t=Array.from(e).slice(0,e.length-1)):t=Array.from(e),[n,t]}let gr;const pr=new Map;class wr{constructor(e){const t=e.zone||De.defaultZone;let n=e.invalid||(Number.isNaN(e.ts)?new be("invalid input"):null)||(t.isValid?null:Jn(t));this.ts=ze(e.ts)?De.now():e.ts;let r=null,s=null;if(!n){if(e.old&&e.old.ts===this.ts&&e.old.zone.equals(t))[r,s]=[e.old.c,e.old.o];else{const i=je(e.o)&&!e.old?e.o:t.offset(this.ts);r=Xn(this.ts,i),n=Number.isNaN(r.year)?new be("invalid input"):null,r=n?null:r,s=n?null:i}}this._zone=t,this.loc=e.loc||se.create(),this.invalid=n,this.weekData=null,this.localWeekData=null,this.c=r,this.o=s,this.isLuxonDateTime=!0}static now(){return new wr({})}static local(){const[e,t]=yr(arguments),[n,r,s,i,a,o,u]=t;return mr({year:n,month:r,day:s,hour:i,minute:a,second:o,millisecond:u},e)}static utc(){const[e,t]=yr(arguments),[n,r,s,i,a,o,u]=t;return e.zone=ae.utcInstance,mr({year:n,month:r,day:s,hour:i,minute:a,second:o,millisecond:u},e)}static fromJSDate(e,t={}){const n=(r=e,"[object Date]"===Object.prototype.toString.call(r)?e.valueOf():NaN);var r;if(Number.isNaN(n))return wr.invalid("invalid input");const s=ue(t.zone,De.defaultZone);return s.isValid?new wr({ts:n,zone:s,loc:se.fromObject(t)}):wr.invalid(Jn(s))}static fromMillis(e,t={}){if(je(e))return e<-Hn||e>Hn?wr.invalid("Timestamp out of range"):new wr({ts:e,zone:ue(t.zone,De.defaultZone),loc:se.fromObject(t)});throw new c(`fromMillis requires a numerical input, but received a ${typeof e} with value ${e}`)}static fromSeconds(e,t={}){if(je(e))return new wr({ts:1e3*e,zone:ue(t.zone,De.defaultZone),loc:se.fromObject(t)});throw new c("fromSeconds requires a numerical input")}static fromObject(e,t={}){e=e||{};const n=ue(t.zone,De.defaultZone);if(!n.isValid)return wr.invalid(Jn(n));const r=se.fromObject(t),s=ut(e,hr),{minDaysInFirstWeek:i,startOfWeek:a}=Ze(s,r),o=De.now(),l=ze(t.specificOffset)?n.offset(o):t.specificOffset,c=!ze(s.ordinal),d=!ze(s.year),h=!ze(s.month)||!ze(s.day),m=d||h,f=s.weekYear||s.weekNumber;if((m||c)&&f)throw new u("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(h&&c)throw new u("Can't mix ordinal dates with month/day");const y=f||s.weekday&&!m;let g,p,w=Xn(o,l);y?(g=cr,p=or,w=Ve(w,i,a)):c?(g=dr,p=ur,w=Ce(w)):(g=lr,p=ar);let v=!1;for(const e of g){ze(s[e])?s[e]=v?p[e]:w[e]:v=!0}const k=y?function(e,t=4,n=1){const r=Ae(e.weekYear),s=Ye(e.weekNumber,1,rt(e.weekYear,t,n)),i=Ye(e.weekday,1,7);return r?s?!i&&Oe("weekday",e.weekday):Oe("week",e.weekNumber):Oe("weekYear",e.weekYear)}(s,i,a):c?function(e){const t=Ae(e.year),n=Ye(e.ordinal,1,Xe(e.year));return t?!n&&Oe("ordinal",e.ordinal):Oe("year",e.year)}(s):We(s),S=k||Le(s);if(S)return wr.invalid(S);const D=y?xe(s,i,a):c?Fe(s):s,[b,T]=er(D,l,n),N=new wr({ts:b,zone:n,o:T,loc:r});return s.weekday&&m&&e.weekday!==N.weekday?wr.invalid("mismatched weekday",`you can't specify both a weekday of ${s.weekday} and a date of ${N.toISO()}`):N.isValid?N:wr.invalid(N.invalid)}static fromISO(e,t={}){const[n,r]=function(e){return Et(e,[nn,on],[rn,un],[sn,ln],[an,cn])}(e);return nr(n,r,t,"ISO 8601",e)}static fromRFC2822(e,t={}){const[n,r]=function(e){return Et(function(e){return e.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}(e),[Gt,Qt])}(e);return nr(n,r,t,"RFC 2822",e)}static fromHTTP(e,t={}){const[n,r]=function(e){return Et(e,[Bt,en],[Kt,en],[Xt,tn])}(e);return nr(n,r,t,"HTTP",t)}static fromFormat(e,t,n={}){if(ze(e)||ze(t))throw new c("fromFormat requires an input string and a format");const{locale:r=null,numberingSystem:s=null}=n,i=se.fromOpts({locale:r,numberingSystem:s,defaultToEN:!0}),[a,o,u,l]=function(e,t,n){const{result:r,zone:s,specificOffset:i,invalidReason:a}=Rn(e,t,n);return[r,s,i,a]}(i,e,t);return l?wr.invalid(l):nr(a,o,n,`format ${t}`,e,u)}static fromString(e,t,n={}){return wr.fromFormat(e,t,n)}static fromSQL(e,t={}){const[n,r]=function(e){return Et(e,[hn,on],[mn,fn])}(e);return nr(n,r,t,"SQL",e)}static invalid(e,t=null){if(!e)throw new c("need to specify a reason the DateTime is invalid");const n=e instanceof be?e:new be(e,t);if(De.throwOnInvalid)throw new i(n);return new wr({invalid:n})}static isDateTime(e){return e&&e.isLuxonDateTime||!1}static parseFormatForOpts(e,t={}){const n=Pn(e,se.fromObject(t));return n?n.map(e=>e?e.val:null).join(""):null}static expandFormat(e,t={}){return qn(Ot.parseFormat(e),se.fromObject(t)).map(e=>e.val).join("")}static resetCache(){gr=void 0,pr.clear()}get(e){return this[e]}get isValid(){return null===this.invalid}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}get outputCalendar(){return this.isValid?this.loc.outputCalendar:null}get zone(){return this._zone}get zoneName(){return this.isValid?this.zone.name:null}get year(){return this.isValid?this.c.year:NaN}get quarter(){return this.isValid?Math.ceil(this.c.month/3):NaN}get month(){return this.isValid?this.c.month:NaN}get day(){return this.isValid?this.c.day:NaN}get hour(){return this.isValid?this.c.hour:NaN}get minute(){return this.isValid?this.c.minute:NaN}get second(){return this.isValid?this.c.second:NaN}get millisecond(){return this.isValid?this.c.millisecond:NaN}get weekYear(){return this.isValid?Gn(this).weekYear:NaN}get weekNumber(){return this.isValid?Gn(this).weekNumber:NaN}get weekday(){return this.isValid?Gn(this).weekday:NaN}get isWeekend(){return this.isValid&&this.loc.getWeekendDays().includes(this.weekday)}get localWeekday(){return this.isValid?Qn(this).weekday:NaN}get localWeekNumber(){return this.isValid?Qn(this).weekNumber:NaN}get localWeekYear(){return this.isValid?Qn(this).weekYear:NaN}get ordinal(){return this.isValid?Ce(this.c).ordinal:NaN}get monthShort(){return this.isValid?$n.months("short",{locObj:this.loc})[this.month-1]:null}get monthLong(){return this.isValid?$n.months("long",{locObj:this.loc})[this.month-1]:null}get weekdayShort(){return this.isValid?$n.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}get weekdayLong(){return this.isValid?$n.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}get offset(){return this.isValid?+this.o:NaN}get offsetNameShort(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}get offsetNameLong(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}get isOffsetFixed(){return this.isValid?this.zone.isUniversal:null}get isInDST(){return!this.isOffsetFixed&&(this.offset>this.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset)}getPossibleOffsets(){if(!this.isValid||this.isOffsetFixed)return[this];const e=864e5,t=6e4,n=tt(this.c),r=this.zone.offset(n-e),s=this.zone.offset(n+e),i=this.zone.offset(n-r*t),a=this.zone.offset(n-s*t);if(i===a)return[this];const o=n-i*t,u=n-a*t,l=Xn(o,i),c=Xn(u,a);return l.hour===c.hour&&l.minute===c.minute&&l.second===c.second&&l.millisecond===c.millisecond?[Bn(this,{ts:o}),Bn(this,{ts:u})]:[this]}get isInLeapYear(){return Ke(this.year)}get daysInMonth(){return et(this.year,this.month)}get daysInYear(){return this.isValid?Xe(this.year):NaN}get weeksInWeekYear(){return this.isValid?rt(this.weekYear):NaN}get weeksInLocalWeekYear(){return this.isValid?rt(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}resolvedLocaleOptions(e={}){const{locale:t,numberingSystem:n,calendar:r}=Ot.create(this.loc.clone(e),e).resolvedOptions(this);return{locale:t,numberingSystem:n,outputCalendar:r}}toUTC(e=0,t={}){return this.setZone(ae.instance(e),t)}toLocal(){return this.setZone(De.defaultZone)}setZone(e,{keepLocalTime:t=!1,keepCalendarTime:n=!1}={}){if((e=ue(e,De.defaultZone)).equals(this.zone))return this;if(e.isValid){let r=this.ts;if(t||n){const t=e.offset(this.ts),n=this.toObject();[r]=er(n,t,e)}return Bn(this,{ts:r,zone:e})}return wr.invalid(Jn(e))}reconfigure({locale:e,numberingSystem:t,outputCalendar:n}={}){return Bn(this,{loc:this.loc.clone({locale:e,numberingSystem:t,outputCalendar:n})})}setLocale(e){return this.reconfigure({locale:e})}set(e){if(!this.isValid)return this;const t=ut(e,hr),{minDaysInFirstWeek:n,startOfWeek:r}=Ze(t,this.loc),s=!ze(t.weekYear)||!ze(t.weekNumber)||!ze(t.weekday),i=!ze(t.ordinal),a=!ze(t.year),o=!ze(t.month)||!ze(t.day),l=a||o,c=t.weekYear||t.weekNumber;if((l||i)&&c)throw new u("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(o&&i)throw new u("Can't mix ordinal dates with month/day");let d;s?d=xe({...Ve(this.c,n,r),...t},n,r):ze(t.ordinal)?(d={...this.toObject(),...t},ze(t.day)&&(d.day=Math.min(et(d.year,d.month),d.day))):d=Fe({...Ce(this.c),...t});const[h,m]=er(d,this.o,this.zone);return Bn(this,{ts:h,o:m})}plus(e){if(!this.isValid)return this;return Bn(this,tr(this,On.fromDurationLike(e)))}minus(e){if(!this.isValid)return this;return Bn(this,tr(this,On.fromDurationLike(e).negate()))}startOf(e,{useLocaleWeeks:t=!1}={}){if(!this.isValid)return this;const n={},r=On.normalizeUnit(e);switch(r){case"years":n.month=1;case"quarters":case"months":n.day=1;case"weeks":case"days":n.hour=0;case"hours":n.minute=0;case"minutes":n.second=0;case"seconds":n.millisecond=0}if("weeks"===r)if(t){const e=this.loc.getStartOfWeek(),{weekday:t}=this;t<e&&(n.weekNumber=this.weekNumber-1),n.weekday=e}else n.weekday=1;if("quarters"===r){const e=Math.ceil(this.month/3);n.month=3*(e-1)+1}return this.set(n)}endOf(e,t){return this.isValid?this.plus({[e]:1}).startOf(e,t).minus(1):this}toFormat(e,t={}){return this.isValid?Ot.create(this.loc.redefaultToEN(t)).formatDateTimeFromString(this,e):Yn}toLocaleString(e=y,t={}){return this.isValid?Ot.create(this.loc.clone(t),e).formatDateTime(this):Yn}toLocaleParts(e={}){return this.isValid?Ot.create(this.loc.clone(e),e).formatDateTimeParts(this):[]}toISO({format:e="extended",suppressSeconds:t=!1,suppressMilliseconds:n=!1,includeOffset:r=!0,extendedZone:s=!1}={}){if(!this.isValid)return null;const i="extended"===e;let a=sr(this,i);return a+="T",a+=ir(this,i,t,n,r,s),a}toISODate({format:e="extended"}={}){return this.isValid?sr(this,"extended"===e):null}toISOWeekDate(){return rr(this,"kkkk-'W'WW-c")}toISOTime({suppressMilliseconds:e=!1,suppressSeconds:t=!1,includeOffset:n=!0,includePrefix:r=!1,extendedZone:s=!1,format:i="extended"}={}){if(!this.isValid)return null;return(r?"T":"")+ir(this,"extended"===i,t,e,n,s)}toRFC2822(){return rr(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)}toHTTP(){return rr(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")}toSQLDate(){return this.isValid?sr(this,!0):null}toSQLTime({includeOffset:e=!0,includeZone:t=!1,includeOffsetSpace:n=!0}={}){let r="HH:mm:ss.SSS";return(t||e)&&(n&&(r+=" "),t?r+="z":e&&(r+="ZZ")),rr(this,r,!0)}toSQL(e={}){return this.isValid?`${this.toSQLDate()} ${this.toSQLTime(e)}`:null}toString(){return this.isValid?this.toISO():Yn}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`:`DateTime { Invalid, reason: ${this.invalidReason} }`}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",n={}){if(!this.isValid||!e.isValid)return On.invalid("created by diffing an invalid DateTime");const r={locale:this.locale,numberingSystem:this.numberingSystem,...n},s=(o=t,Array.isArray(o)?o:[o]).map(On.normalizeUnit),i=e.valueOf()>this.valueOf(),a=Vn(i?this:e,i?e:this,s,r);var o;return i?a.negate():a}diffNow(e="milliseconds",t={}){return this.diff(wr.now(),e,t)}until(e){return this.isValid?In.fromDateTimes(this,e):this}hasSame(e,t,n){if(!this.isValid)return!1;const r=e.valueOf(),s=this.setZone(e.zone,{keepLocalTime:!0});return s.startOf(t,n)<=r&&r<=s.endOf(t,n)}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;const t=e.base||wr.fromObject({},{zone:this.zone}),n=e.padding?this<t?-e.padding:e.padding:0;let r=["years","months","days","hours","minutes","seconds"],s=e.unit;return Array.isArray(e.unit)&&(r=e.unit,s=void 0),fr(t,this.plus(n),{...e,numeric:"always",units:r,unit:s})}toRelativeCalendar(e={}){return this.isValid?fr(e.base||wr.fromObject({},{zone:this.zone}),this,{...e,numeric:"auto",units:["years","months","days"],calendary:!0}):null}static min(...e){if(!e.every(wr.isDateTime))throw new c("min requires all arguments be DateTimes");return Ue(e,e=>e.valueOf(),Math.min)}static max(...e){if(!e.every(wr.isDateTime))throw new c("max requires all arguments be DateTimes");return Ue(e,e=>e.valueOf(),Math.max)}static fromFormatExplain(e,t,n={}){const{locale:r=null,numberingSystem:s=null}=n;return Rn(se.fromOpts({locale:r,numberingSystem:s,defaultToEN:!0}),e,t)}static fromStringExplain(e,t,n={}){return wr.fromFormatExplain(e,t,n)}static buildFormatParser(e,t={}){const{locale:n=null,numberingSystem:r=null}=t,s=se.fromOpts({locale:n,numberingSystem:r,defaultToEN:!0});return new Un(s,e)}static fromFormatParser(e,t,n={}){if(ze(e)||ze(t))throw new c("fromFormatParser requires an input string and a format parser");const{locale:r=null,numberingSystem:s=null}=n,i=se.fromOpts({locale:r,numberingSystem:s,defaultToEN:!0});if(!i.equals(t.locale))throw new c(`fromFormatParser called with a locale of ${i}, but the format parser was created for ${t.locale}`);const{result:a,zone:o,specificOffset:u,invalidReason:l}=t.explainFromTokens(e);return l?wr.invalid(l):nr(a,o,n,`format ${t.format}`,e,u)}static get DATE_SHORT(){return y}static get DATE_MED(){return g}static get DATE_MED_WITH_WEEKDAY(){return p}static get DATE_FULL(){return w}static get DATE_HUGE(){return v}static get TIME_SIMPLE(){return k}static get TIME_WITH_SECONDS(){return S}static get TIME_WITH_SHORT_OFFSET(){return D}static get TIME_WITH_LONG_OFFSET(){return b}static get TIME_24_SIMPLE(){return T}static get TIME_24_WITH_SECONDS(){return N}static get TIME_24_WITH_SHORT_OFFSET(){return O}static get TIME_24_WITH_LONG_OFFSET(){return M}static get DATETIME_SHORT(){return I}static get DATETIME_SHORT_WITH_SECONDS(){return $}static get DATETIME_MED(){return E}static get DATETIME_MED_WITH_SECONDS(){return V}static get DATETIME_MED_WITH_WEEKDAY(){return x}static get DATETIME_FULL(){return C}static get DATETIME_FULL_WITH_SECONDS(){return F}static get DATETIME_HUGE(){return Z}static get DATETIME_HUGE_WITH_SECONDS(){return W}}function vr(e){if(wr.isDateTime(e))return e;if(e&&e.valueOf&&je(e.valueOf()))return wr.fromJSDate(e);if(e&&"object"==typeof e)return wr.fromObject(e);throw new c(`Unknown datetime argument: ${e}, of type ${typeof e}`)}function kr(e){const t=e.filter(e=>"number"==typeof e&&Number.isFinite(e)),n=t.reduce((e,t)=>e+t,0);return t.length>0?n/t.length:null}function Sr(e){const t=e.columnNames().filter(e=>"datetime"!==e),n=Object.fromEntries(t.map(e=>[e,`d => op.is_finite(d['${e}']) ? op.round(d['${e}'] * 10) / 10 : null`]));return e.derive(n)}function Dr(e,t){let n;if("string"==typeof t)n=t;else{if(!Array.isArray(t)||1!==t.length||"string"!=typeof t[0])throw new Error(`Expected deviceDeploymentID to be a string or a single-element string array. Received: ${JSON.stringify(t)}`);n=t[0]}if(!e.data.columnNames().includes(n))throw new Error(`Device ID '${n}' not found in monitor.data`);return n}function br(e,t="unknown"){if(!(e instanceof jr))throw new Error(`${t}() must return a Monitor instance`)}function Tr(e,t){if(!e)throw new Error(t)}const Nr=["longitude","latitude","elevation"];function Or(e,t=!1,n=[]){const s=e.columnNames(),i=t?s:n,a={};s.forEach(e=>{a[e]=r.escape(t=>"NA"===t[e]?null:t[e])});const o={};return Nr.filter(e=>s.includes(e)).forEach(e=>{o[e]=r.escape(t=>parseFloat(t[e]))}),e.derive(a).derive(o).select(i)}function Mr(e){const t=e.columnNames().slice(1),n={};t.forEach(e=>{n[e]=`d => d['${e}'] === 'NA' ? null : op.parse_float(d['${e}'])`});const r={};t.forEach(e=>{r[e]=`d => d['${e}'] < 0 ? 0 : d['${e}']`});const s={};t.forEach(e=>{s[e]=`d => d['${e}'] != null && !op.is_finite(d['${e}']) ? null : d['${e}']`});const i=e.derive(n).derive(r).derive(s);return function(e){Tr(e.columnNames().includes("datetime"),"'datetime' column is missing");const t=e.array("datetime"),n=t.length;for(let e=0;e<n;e++){const n=t[e];Tr(wr.isDateTime(n),`Row ${e}: datetime is not a Luxon DateTime`),Tr(n.isValid,`Row ${e}: datetime is invalid: ${n.invalidReason}`),Tr("UTC"===n.zoneName,`Row ${e}: datetime is not in UTC`)}for(let e=1;e<n;e++){const n=t[e-1],r=t[e].diff(n,"hours").hours;Tr(1===r,`Row ${e}: datetime gap is ${r} hours (expected 1 hour)`)}for(const t of e.columnNames()){if("datetime"===t)continue;const n=e.array(t);for(let e=0;e<n.length;e++){const r=n[e];Tr(null===r||"number"==typeof r&&Number.isFinite(r),`Row ${e}, column '${t}': value is not numeric or null`)}}}(i),i}const Ir="https://airfire-data-exports.s3.us-west-2.amazonaws.com/monitoring/v2",$r=["deviceDeploymentID","deviceID","deviceType","deploymentType","deviceDescription","pollutant","units","dataIngestSource","locationID","locationName","longitude","latitude","elevation","countryCode","stateCode","countyName","timezone","AQSID","fullAQSID"],Er=["deviceDeploymentID","deviceID","deviceType","deviceDescription","pollutant","units","dataIngestSource","locationID","locationName","longitude","latitude","elevation","countryCode","stateCode","countyName","timezone","AQSID"];async function Vr(e,t=2){let n=0;for(;n<t;)try{return await r.loadCSV(e,{parse:{datetime:e=>wr.fromISO(e,{zone:"UTC"})}})}catch(r){if(n++,n>=t)throw r;console.warn(`Retrying (${n}/${t}) for: ${e}`)}}async function xr(e,t,n,r){const s=`${r}/${n}/data/${t}_PM2.5_${n}_meta.csv`,i=`${r}/${n}/data/${t}_PM2.5_${n}_data.csv`,a=await Promise.allSettled([Vr(s),Vr(i)]),[o,u]=a;if("fulfilled"!==o.status||"fulfilled"!==u.status)throw"rejected"===o.status&&console.error("Failed to load meta CSV after retry:",o.reason),"rejected"===u.status&&console.error("Failed to load data CSV after retry:",u.reason),new Error("Failed to load data from URL.");{const t=o.value,n=u.value;e.meta=Or(t,!1,$r),e.data=Mr(n)}}async function Cr(e,t=String((new Date).getFullYear()),n=Ir){return async function(e,t,n){const r=`${n}/airnow/${t}/data/airnow_PM2.5_${t}_meta.csv`,s=`${n}/airnow/${t}/data/airnow_PM2.5_${t}_data.csv`,i=await Promise.allSettled([Vr(r),Vr(s)]),[a,o]=i;if("fulfilled"!==a.status||"fulfilled"!==o.status)throw"rejected"===a.status&&console.error("Failed to load meta CSV after retry:",a.reason),"rejected"===o.status&&console.error("Failed to load data CSV after retry:",o.reason),new Error("Failed to load data from URL.");{const t=a.value,n=o.value;e.meta=Or(t,!1,Er),e.data=Mr(n)}}(e,t,n)}function Fr(e,t){let n;if("string"==typeof t)n=t;else{if(!Array.isArray(t)||1!==t.length||"string"!=typeof t[0])throw new Error(`Expected deviceDeploymentID to be a string or a single-element string array. Received: ${JSON.stringify(t)}`);n=t[0]}const r=e.meta.array("deviceDeploymentID"),s=e.meta.array("timezone"),i=r.indexOf(n);if(-1===i)throw new Error(`Device ID '${n}' not found in metadata.`);return s[i]}function Zr(e,t){const n=Dr(e,t),r=e.data.array(n);if(!Array.isArray(r))throw new Error(`Device ID '${n}' not found in monitor.data`);return r.map(e=>null==e||isNaN(e)?null:Math.round(10*e)/10)}const Wr=r.op;const Lr=r.op;function zr(e){const{data:t,meta:n}=e,s=e.getIDs(),i=t.select(r.not("datetime")).derive({index:e=>Lr.row_number()-1}),a={};s.forEach(e=>{a[e]=`d => op.is_finite(d['${e}']) ? d.index : 0`});const o={};s.forEach(e=>{o[e]=`d => op.max(d['${e}'])`});const u=i.derive(a).rollup(o).object(0),l=Object.values(u),c=l.map(e=>t.array("datetime")[e]),d=s.map((e,n)=>t.get(e,l[n])),h=r.table({lastValidDatetime:c,lastValidPM_25:d});return n.assign(h)}class jr{constructor(e=r.table({deviceDeploymentID:[],deviceID:[],deviceType:[],deploymentType:[],deviceDescription:[],pollutant:[],units:[],dataIngestSource:[],locationID:[],locationName:[],longitude:[],latitude:[],elevation:[],countryCode:[],stateCode:[],countyName:[],timezone:[],AQSID:[],fullAQSID:[]}),t=r.table({datetime:[]})){this.meta=e,this.data=t}async loadLatest(e,t){return async function(e,t="airnow",n=Ir){return xr(e,t,"latest",n)}(this,e,t)}async loadDaily(e,t){return async function(e,t="airnow",n=Ir){return xr(e,t,"daily",n)}(this,e,t)}async loadAnnual(e,t){return Cr(this,e,t)}async loadCustom(e,t,n=!0){return async function(e,t="",n="",r=!0){const s=`${n}/${t}_meta.csv`,i=`${n}/${t}_data.csv`,a=await Promise.allSettled([Vr(s),Vr(i)]),[o,u]=a;if("fulfilled"!==o.status||"fulfilled"!==u.status)throw"rejected"===o.status&&console.error("Failed to load meta CSV after retry:",o.reason),"rejected"===u.status&&console.error("Failed to load data CSV after retry:",u.reason),new Error("Failed to load data from URL.");{const t=o.value,n=u.value;e.meta=Or(t,r),e.data=Mr(n)}}(this,e,t,n)}getIDs(){return this.meta.array("deviceDeploymentID")}count(){return this.meta.numRows()}getDatetime(){return this.data.array("datetime")}getMetadata(e,t){const n=Dr(this,e),r=this.getIDs().indexOf(n);return this.meta.array(t)[r]}getMetaObject(e){const t=Dr(this,e);return this.select(t).meta.object()}getTimezone(e){return Fr(this,e)}getPM25(e){return Zr(this,e)}getNowcast(e){return function(e,n){const r=Dr(e,n),s=e.data.array(r);if(!Array.isArray(s))throw new Error(`Column for device ID '${r}' is not a valid array`);return t.pm_nowcast(s)}(this,e)}getDailyStats(e){return function(e,n){const r=Dr(e,n),s=e.data.array("datetime"),i=Zr(e,r),a=Fr(e,r);if(s.length!==i.length)throw new Error(`Datetime and PM2.5 arrays are misaligned for device '${r}'`);const o=t.dailyStats(s,i,a);return{datetime:o.datetime,count:o.count,min:o.min,mean:o.mean,max:o.max}}(this,e)}getDiurnalStats(e,n){return function(e,n,r=7){const s=e.data.array("datetime"),i=Zr(e,n),a=Fr(e,n);if(s.length!==i.length)throw new Error(`Datetime and PM2.5 arrays are misaligned for device '${n}'`);const o=t.diurnalStats(s,i,a,r);return{hour:o.hour,count:o.count,min:o.min,mean:o.mean,max:o.max}}(this,e,n)}collapse(e,t,n){const{meta:s,data:i}=function(e,t="generatedID",n="mean",s=.8){const i=e.meta,a=e.data,o=kr(i.array("longitude")),u=kr(i.array("latitude")),l=`xxx_${t}`;let c=i.slice(0,1).derive({locationID:r.escape("xxx"),locationName:r.escape(t),longitude:r.escape(o),latitude:r.escape(u),elevation:r.escape(null),houseNumber:r.escape(null),street:r.escape(null),city:r.escape(null),zip:r.escape(null),deviceDeploymentID:r.escape(l),deviceType:r.escape(null),deploymentType:r.escape(null)});const d=e.getIDs();e.getDatetime();let h=a.derive({utcDatestamp:"d => op.format_utcdate(d.datetime)"}).select(r.not("datetime"));const m=h.array("utcDatestamp");let f;return f="count"===n?"() => op.count()":"quantile"===n?`d => op.quantile(d.value, ${s})`:`d => op.${n}(d.value)`,{meta:c,data:Sr(h.fold(d).pivot({key:"d => d.utcDatestamp"},{value:f}).fold(m).derive({datetime:r.escape(e=>wr.fromISO(e.key,{zone:"utc"}))}).rename({value:t}).select(["datetime",t]))}}(this,e,t,n),a=new jr(s,i);return br(a,"collapse"),a}combine(e){const{meta:t,data:n}=function(e,t){const n=new Set(e.meta.array("deviceDeploymentID")),r=t.meta.array("deviceDeploymentID");r.filter(e=>n.has(e));const s=r.filter(e=>!n.has(e)),i=t.meta.params({ids:s}).filter("op.includes(ids, d.deviceDeploymentID)"),a=t.data.select(["datetime",...s]);return{meta:e.meta.concat(i),data:Sr(e.data.join_full(a,"datetime").orderby("datetime"))}}(this,e),r=new jr(t,n);return br(r,"combine"),r}select(e){const{meta:t,data:n}=function(e,t){if("string"==typeof t&&(t=[t]),!Array.isArray(t)||0===t.length)throw new Error("ids must be a non-empty string or array of deviceDeploymentIDs");if(new Set(t).size!==t.length)throw new Error("Duplicate deviceDeploymentID values are not allowed in select()");const n=t.map(t=>{const n=e.meta.objects().find(e=>e.deviceDeploymentID===t);if(!n)throw new Error(`deviceDeploymentID '${t}' not found in metadata`);return n});return{meta:r.from(n),data:Sr(e.data.select(["datetime",...t]))}}(this,e),s=new jr(t,n);return br(s,"select"),s}filterByValue(e,t){const{meta:n,data:r}=function(e,t,n){if(!e.meta.columnNames().includes(t))throw new Error(`Column '${t}' not found in metadata`);const r=typeof e.meta.get(t);let s;if("number"===r){const e=parseFloat(n);if(isNaN(e))throw new Error(`Value '${n}' could not be parsed as a number`);s=`d => op.equal(d.${t}, ${e})`}else{if("string"!==r)throw new Error(`Unsupported column type for filtering: ${r}`);s=`d => op.equal(d.${t}, '${n.toString().replace(/'/g,"\\'")}')`}const i=e.meta.filter(s),a=i.array("deviceDeploymentID");return{meta:i,data:Sr(e.data.select(["datetime",...a]))}}(this,e,t),s=new jr(n,r);return br(s,"filterByValue"),s}dropEmpty(){const{meta:e,data:t}=function(e){const t=e.data,n=t.columnNames().filter(e=>"datetime"!==e),r=t.rollup(Object.fromEntries(n.map(e=>[e,"d => op.valid(d['"+e+"'])"]))).object(0),s=Object.entries(r).filter(([e,t])=>t>0).map(([e])=>e),i=t.select(["datetime",...s]);return{meta:e.meta.params({ids:s}).filter((e,t)=>Wr.includes(t.ids,e.deviceDeploymentID)),data:Sr(i)}}(this),n=new jr(e,t);return br(n,"dropEmpty"),n}trimDate(e){const{meta:t,data:n}=function(e,t,n=!0){const r=e.data.array("datetime");if(!r||0===r.length)throw new Error("No datetime values found in monitor.data");const s=r[0].setZone(t);if(!s.isValid||s.zoneName!==t)throw new Error(`Invalid or unrecognized timezone: '${t}'`);const i=r[0].setZone(t),a=r[r.length-1].setZone(t),o=0===i.hour?0:24-i.hour,u=23===a.hour?0:a.hour+1;let l=o,c=r.length-u;if(n){const t=e.data.columnNames().filter(e=>"datetime"!==e),n=e.data.slice(l,l+24);t.every(e=>n.array(e).every(e=>null==e))&&(l+=24);const r=e.data.slice(c-24,c);t.every(e=>r.array(e).every(e=>null==e))&&(c-=24)}const d=e.data.slice(l,c);return{meta:e.meta,data:Sr(d)}}(this,e),r=new jr(t,n);return br(r,"trimDate"),r}getCurrentStatus(){return zr(this)}createGeoJSON(){return function(e){const t=zr(e),n=[],r=e=>e?.toFormat?.("yyyy-MM-dd HH:mm:ss ZZZZ")??null;for(let e=0;e<t.numRows();e++){const s=t.slice(e,e+1).object();n.push({type:"Feature",geometry:{type:"Point",coordinates:[s.longitude,s.latitude]},properties:{deviceDeploymentID:s.deviceDeploymentID,locationName:s.locationName,last_time:r(s.lastValidDatetime),last_pm25:s.lastValidPM_25?.toString()??null}})}return{type:"FeatureCollection",features:n}}(this)}}return jr});
//# sourceMappingURL=air-monitor.umd.js.map