signalk-binnacle 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,96 @@ All notable changes to Binnacle are documented here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project aims to follow
5
5
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ <a id="v062"></a>
8
+
9
+ ## [0.6.2] - 2026-06-13
10
+
11
+ A full-codebase reliability, correctness, and coherence pass, plus a weather-panel layer menu. It
12
+ hardens the weather overlays, the caching and history layers, the course and anchor logic, makes a
13
+ set of previously silent failures visible, and moves the weather layer toggles into a floating menu.
14
+
15
+ ### Changed
16
+
17
+ - The weather panel's layer toggles move from the header pill row, which ran out of room and
18
+ truncated, into a single layers menu opened from a floating button at the upper left of the
19
+ mini-map. The button lights and shows a count whenever layers are on, the menu groups the area
20
+ fill and the overlays and carries the source line, and it docks as a bottom sheet on a narrow
21
+ panel so it never covers the small map from the top. The one-tap Here conditions control stays
22
+ in the header.
23
+
24
+ ### Fixed
25
+
26
+ - Pressure isobars no longer stay blank after the base map style swaps (the offline fallback or a
27
+ style reload): the overlay rebuilds its recreated sources instead of seeing an unchanged grid.
28
+ - The in-memory cache no longer evicts a just-refreshed weather grid or tide entry before older
29
+ ones, so a refreshed view is not dropped early and refetched.
30
+ - A corrupted or legacy profile can no longer render a chart layer transparent or broken: a
31
+ restored opacity is clamped to a valid range, matching first-registration.
32
+ - A malformed history timestamp no longer disables gap-splitting for the rest of a 24 hour track.
33
+ - The Trends panel can tell a present-but-empty history provider from an unreachable one.
34
+ - An active course's route, next, and arrival geometry survives a cross-station activation even
35
+ when the continuously-updating calc values stream in before the one-time hydration completes.
36
+ - A dead data link (the worker failing to load, a rejected connect) shows a "Data link failed,
37
+ reload" indicator instead of sitting forever on a connecting state.
38
+ - One chunk-load failure no longer kills route editing for the rest of the session.
39
+ - A failed track save or delete, a refused anchor drop on a server that advertises the standard
40
+ Anchor API, a failed user chart registration, an empty-and-failed route fetch, and a chart that
41
+ did not sync to the server all surface an error or a log breadcrumb now instead of going silent.
42
+ - The arrival alarm is stopped on teardown, profile sync retries after a transient first failure
43
+ instead of staying local-only for the session, and a unit preset from a previous server is
44
+ cleared when reconnecting to a different one.
45
+ - The layer opacity slider is a full-size touch target again, panel error lines use the shared
46
+ alarm framing, and the chart action menu supports arrow-key navigation.
47
+
48
+ ### Internal
49
+
50
+ - IndexedDB and local-storage degrades, and an unavailable audible alarm, now log a one-line
51
+ breadcrumb so a field report is diagnosable.
52
+ - Shared cleanups: one safety-button gutter rule, the collision overlay on the shared layer
53
+ helpers, the tracking token on the alarms tag, anonymous access-request fetches, named collision
54
+ threshold constants, a once-computed day paint object, and a dropped redundant per-tick sort.
55
+ - New tests cover the stream connection and worker lifecycle, the unit conversion family, the
56
+ anchor acknowledge escalation, client-computed course VMG and time-to-go, and several boundary
57
+ and error paths the audit found untested.
58
+ - A shared rovingFocus arrow-key action and an overlay-backdrop utility class now back both the
59
+ chart context menu and the new weather layers menu, replacing duplicated handlers and CSS, and
60
+ the chart context menu moved onto the shared Escape dismiss stack. The now-unused scrollEdges
61
+ action was removed.
62
+
63
+ <a id="v061"></a>
64
+
65
+ ## [0.6.1] - 2026-06-12
66
+
67
+ Quick access from community feedback: the chart actions a navigator reaches for stay within one
68
+ or two taps, and the weather panel's layer row scrolls honestly instead of clipping its last pill.
69
+
70
+ ### Added
71
+
72
+ - Measure from the chart: the long-press and right-click menu gains "Measure from here", arming
73
+ the measure tool with its first point at the pressed position, so measuring starts where you
74
+ are looking instead of via the app menu. Re-arming mid-measurement deliberately starts fresh;
75
+ extending an in-progress measurement is a plain chart tap.
76
+ - A Charts pill on the bottom status strip opens Layers and charts in one tap, beside Center,
77
+ Follow, and Forecast, so switching charts no longer goes through the app menu.
78
+
79
+ ### Fixed
80
+
81
+ - The weather panel's layer pills no longer render the last label clipped: the edge fade shows
82
+ only while there is actually more to scroll, lifts at the end of the scroll, and the pills
83
+ keep their natural width instead of compressing when the panel narrows, so the row genuinely
84
+ scrolls.
85
+ - The chart context menu sizes itself to its longest label, so its edge-clamp math matches the
86
+ rendered box.
87
+ - Voice control can activate the Charts pill by its visible word, its expanded state is not
88
+ announced while it is still disabled during chart load, and its tooltip says the chart is
89
+ loading while it is.
90
+
91
+ ### Internal
92
+
93
+ - One armMeasure helper replaces the duplicated reveal-then-arm sequence, new measure tests pin
94
+ the seed-after-arm contract and the deliberate reset on re-arm, and CI test flakes from cold
95
+ ICU loading are prevented by a per-worker warm-up rather than per-test timeouts.
96
+
7
97
  <a id="v060"></a>
8
98
 
9
99
  ## [0.6.0] - 2026-06-12
package/README.md CHANGED
@@ -15,34 +15,22 @@ A WebGL chart plotter for [Signal K](https://signalk.org).
15
15
  > is also not certified for safety-of-life navigation. Always carry redundant means of navigation,
16
16
  > cross-check against your primary instruments, and treat every display as advisory.
17
17
 
18
- ## What's new in 0.6.0
19
-
20
- Offline that actually holds up, a launcher menu, your units everywhere, and 24 hour trends:
21
-
22
- - **Offline charts everywhere.** Viewed PMTiles chart areas are cached as blocks in browser
23
- storage at the protocol layer, so they render offline in every context, including the
24
- plain-http default where no service worker can run. Over https, plugin chart tiles, the
25
- overlays, the base style, and tide predictions gain service-worker caching, and when the base
26
- style itself is unreachable the map starts on a minimal water fallback instead of staying
27
- blank. Tides, chart notes, and the conditions panel survive an offline reload, each item
28
- declaring its own age.
29
- - **Your units, everywhere.** Every readout follows the Signal K server's imperial-or-metric
30
- unit preference, converting at the display edge; knots, nautical miles, and bearings stay
31
- nautical.
32
- - **A launcher menu and an Alarms panel.** The menu is now large icon tiles grouped Navigate,
33
- Conditions, Safety, and Settings, and a new Alarms panel collects every active alert on the
34
- boat with one-tap Silence and Acknowledge that propagate to every station.
35
- - **Trends and track history.** Depth, apparent wind, pressure, and speed over the last 24 hours
36
- as themed graphs from the server's v2 History API, falling back to live session sampling
37
- without a provider, plus a dashed 24 hour track-history chart layer.
38
- - **Standard waypoints, worldwide tides, AIS trails, and chart symbols.** Waypoints live in the
39
- server's own resources, tides ride the signalk-tides plugin with NOAA CO-OPS as the fallback,
40
- AIS targets get faded wakes from the tracks plugin, and signalk-symbol-manager artwork renders
41
- on notes and waypoints, remapped into the red band at night.
42
- - **Background-tab safety.** Delta batching and AIS pruning moved off the render loop, so live
43
- data, the collision watch, and the anchor alarm keep working while the browser tab is hidden.
44
-
45
- See the [changelog](CHANGELOG.md#v060) for the full list.
18
+ ## What's new in 0.6.2
19
+
20
+ A weather layers menu and a deep reliability pass:
21
+
22
+ - **A weather layers menu.** The weather panel's layer toggles move from the header, which ran out
23
+ of room, into a single menu opened from a floating button at the upper left of the mini-map. The
24
+ button lights and shows a count when layers are on, the menu groups the area fill and the
25
+ overlays, it stays open while you toggle several layers, and it docks as a bottom sheet on a
26
+ narrow screen. There is now room to add more options without crowding.
27
+ - **Reliability and correctness.** A full pass across the weather overlays, the caching and history
28
+ layers, and the course and anchor logic: pressure isobars no longer blank after a map style swap,
29
+ caches stop evicting just-refreshed entries, an active course keeps its route geometry across a
30
+ cross-station handoff, and a set of failures that used to fail silently (a dead data link, a
31
+ failed track or chart save, a refused anchor drop) now tell you.
32
+
33
+ See the [changelog](CHANGELOG.md#v062) for the full list.
46
34
 
47
35
  ## What it does
48
36
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "signalk-binnacle",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "WebGL chart plotter for Signal K",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -1,4 +1,4 @@
1
- import{C as e,D as t,E as n,O as r,S as i,T as a,_ as o,a as s,b as c,c as l,f as u,g as d,h as f,i as p,k as m,m as h,o as g,p as _,r as v,s as y,t as b,v as x,w as S,x as C,y as w}from"./index-NGypZbKU.js";var T=!0,E=`uplot`,ee=`u-hz`,te=`u-vt`,ne=`u-title`,re=`u-wrap`,ie=`u-under`,ae=`u-over`,oe=`u-axis`,se=`u-off`,ce=`u-select`,le=`u-cursor-x`,ue=`u-cursor-y`,de=`u-cursor-pt`,fe=`u-legend`,pe=`u-live`,me=`u-inline`,he=`u-series`,ge=`u-marker`,_e=`u-label`,ve=`u-value`,ye=`width`,be=`height`,xe=`top`,Se=`bottom`,Ce=`left`,we=`right`,Te=`#000`,Ee=`#0000`,De=`mousemove`,Oe=`mousedown`,ke=`mouseup`,Ae=`mouseenter`,je=`mouseleave`,Me=`dblclick`,D=`resize`,Ne=`scroll`,Pe=`change`,Fe=`dppxchange`,Ie=`--`,Le=typeof window<`u`,Re=Le?document:null,ze=Le?window:null,O=Le?navigator:null,k,Be;function Ve(){let e=devicePixelRatio;k!=e&&(k=e,Be&&et(Pe,Be,Ve),Be=matchMedia(`(min-resolution: ${k-.001}dppx) and (max-resolution: ${k+.001}dppx)`),$e(Pe,Be,Ve),ze.dispatchEvent(new CustomEvent(Fe)))}function He(e,t){if(t!=null){let n=e.classList;!n.contains(t)&&n.add(t)}}function Ue(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}function A(e,t,n){e.style[t]=n+`px`}function We(e,t,n,r){let i=Re.createElement(e);return t!=null&&He(i,t),n?.insertBefore(i,r),i}function Ge(e,t){return We(`div`,e,t)}var Ke=new WeakMap;function qe(e,t,n,r,i){let a=`translate(`+t+`px,`+n+`px)`;a!=Ke.get(e)&&(e.style.transform=a,Ke.set(e,a),t<0||n<0||t>r||n>i?He(e,se):Ue(e,se))}var Je=new WeakMap;function Ye(e,t,n){let r=t+n;r!=Je.get(e)&&(Je.set(e,r),e.style.background=t,e.style.borderColor=n)}var Xe=new WeakMap;function Ze(e,t,n,r){let i=t+``+n;i!=Xe.get(e)&&(Xe.set(e,i),e.style.height=n+`px`,e.style.width=t+`px`,e.style.marginLeft=r?-t/2+`px`:0,e.style.marginTop=r?-n/2+`px`:0)}var Qe={passive:!0},j={...Qe,capture:!0};function $e(e,t,n,r){t.addEventListener(e,n,r?j:Qe)}function et(e,t,n,r){t.removeEventListener(e,n,Qe)}Le&&Ve();function tt(e,t,n,r){let i;n||=0,r||=t.length-1;let a=r<=2147483647;for(;r-n>1;)i=a?n+r>>1:vt((n+r)/2),t[i]<e?n=i:r=i;return e-t[n]<=t[r]-e?n:r}function M(e){return(t,n,r)=>{let i=-1,a=-1;for(let a=n;a<=r;a++)if(e(t[a])){i=a;break}for(let i=r;i>=n;i--)if(e(t[i])){a=i;break}return[i,a]}}var nt=e=>e!=null,rt=e=>e!=null&&e>0,N=M(nt),it=M(rt);function at(e,t,n,r=0,i=!1){let a=i?it:N,o=i?rt:nt;[t,n]=a(e,t,n);let s=e[t],c=e[t];if(t>-1)if(r==1)s=e[t],c=e[n];else if(r==-1)s=e[n],c=e[t];else for(let r=t;r<=n;r++){let t=e[r];o(t)&&(t<s?s=t:t>c&&(c=t))}return[s??R,c??-R]}function ot(e,t,n,r){let i=Ct(e),a=Ct(t);e==t&&(i==-1?(e*=n,t/=n):(e/=n,t*=n));let o=n==10?wt:Tt,s=i==1?vt:yt,c=a==1?yt:vt,l=s(o(I(e))),u=c(o(I(t))),d=St(n,l),f=St(n,u);return n==10&&(l<0&&(d=B(d,-l)),u<0&&(f=B(f,-u))),r||n==2?(e=d*i,t=f*a):(e=Vt(e,d),t=Bt(t,f)),[e,t]}function st(e,t,n,r){let i=ot(e,t,n,r);return e==0&&(i[0]=0),t==0&&(i[1]=0),i}var ct=.1,lt={mode:3,pad:ct},ut={pad:0,soft:null,mode:0},dt={min:ut,max:ut};function ft(e,t,n,r){return Xt(n)?mt(e,t,n):(ut.pad=n,ut.soft=r?0:null,ut.mode=r?3:0,mt(e,t,dt))}function P(e,t){return e??t}function pt(e,t,n){for(t=P(t,0),n=P(n,e.length-1);t<=n;){if(e[t]!=null)return!0;t++}return!1}function mt(e,t,n){let r=n.min,i=n.max,a=P(r.pad,0),o=P(i.pad,0),s=P(r.hard,-R),c=P(i.hard,R),l=P(r.soft,R),u=P(i.soft,-R),d=P(r.mode,0),f=P(i.mode,0),p=t-e,m=wt(p),h=xt(I(e),I(t)),g=I(wt(h)-m);(p<1e-24||g>10)&&(p=0,(e==0||t==0)&&(p=1e-24,d==2&&l!=R&&(a=0),f==2&&u!=-R&&(o=0)));let _=p||h||1e3,v=St(10,vt(wt(_))),y=B(Vt(e-_*(p==0?e==0?.1:1:a),v/10),24),b=e>=l&&(d==1||d==3&&y<=l||d==2&&y>=l)?l:R,x=xt(s,y<b&&e>=b?b:bt(b,y)),S=B(Bt(t+_*(p==0?t==0?.1:1:o),v/10),24),C=t<=u&&(f==1||f==3&&S>=u||f==2&&S<=u)?u:-R,w=bt(c,S>C&&t<=C?C:xt(C,S));return x==w&&x==0&&(w=100),[x,w]}var ht=new Intl.NumberFormat(Le?O.language:`en-US`),gt=e=>ht.format(e),F=Math,_t=F.PI,I=F.abs,vt=F.floor,L=F.round,yt=F.ceil,bt=F.min,xt=F.max,St=F.pow,Ct=F.sign,wt=F.log10,Tt=F.log2,Et=(e,t=1)=>F.sinh(e)*t,Dt=(e,t=1)=>F.asinh(e/t),R=1/0;function Ot(e){return(wt((e^e>>31)-(e>>31))|0)+1}function kt(e,t,n){return bt(xt(e,t),n)}function At(e){return typeof e==`function`}function z(e){return At(e)?e:()=>e}var jt=()=>{},Mt=e=>e,Nt=(e,t)=>t,Pt=e=>null,Ft=e=>!0,It=(e,t)=>e==t,Lt=/\.\d*?(?=9{6,}|0{6,})/gm,Rt=e=>{if(H(e)||Ht.has(e))return e;let t=`${e}`,n=t.match(Lt);if(n==null)return e;let r=n[0].length-1;if(t.indexOf(`e-`)!=-1){let[e,n]=t.split(`e`);return+`${Rt(e)}e${n}`}return B(e,r)};function zt(e,t){return Rt(B(Rt(e/t))*t)}function Bt(e,t){return Rt(yt(Rt(e/t))*t)}function Vt(e,t){return Rt(vt(Rt(e/t))*t)}function B(e,t=0){if(H(e))return e;let n=10**t;return L(e*n*(1+2**-52))/n}var Ht=new Map;function Ut(e){return((``+e).split(`.`)[1]||``).length}function V(e,t,n,r){let i=[],a=r.map(Ut);for(let o=t;o<n;o++){let t=I(o),n=B(St(e,o),t);for(let s=0;s<r.length;s++){let c=e==10?+`${r[s]}e${o}`:r[s]*n,l=(o>=0?0:t)+(o>=a[s]?0:a[s]),u=e==10?c:B(c,l);i.push(u),Ht.set(u,l)}}return i}var Wt={},Gt=[],Kt=[null,null],qt=Array.isArray,H=Number.isInteger,Jt=e=>e===void 0;function Yt(e){return typeof e==`string`}function Xt(e){let t=!1;if(e!=null){let n=e.constructor;t=n==null||n==Object}return t}function Zt(e){return typeof e==`object`&&!!e}var Qt=Object.getPrototypeOf(Uint8Array),$t=`__proto__`;function en(e,t=Xt){let n;if(qt(e)){let r=e.find(e=>e!=null);if(qt(r)||t(r)){n=Array(e.length);for(let r=0;r<e.length;r++)n[r]=en(e[r],t)}else n=e.slice()}else if(e instanceof Qt)n=e.slice();else if(t(e)){n={};for(let r in e)r!=$t&&(n[r]=en(e[r],t))}else n=e;return n}function U(e){let t=arguments;for(let n=1;n<t.length;n++){let r=t[n];for(let t in r)t!=$t&&(Xt(e[t])?U(e[t],en(r[t])):e[t]=en(r[t]))}return e}var tn=0,nn=1,rn=2;function an(e,t,n){for(let r=0,i,a=-1;r<t.length;r++){let o=t[r];if(o>a){for(i=o-1;i>=0&&e[i]==null;)e[i--]=null;for(i=o+1;i<n&&e[i]==null;)e[a=i++]=null}}}function on(e,t){if(ln(e)){let t=e[0].slice();for(let n=1;n<e.length;n++)t.push(...e[n].slice(1));return un(t[0])||(t=cn(t)),t}let n=new Set;for(let t=0;t<e.length;t++){let r=e[t][0],i=r.length;for(let e=0;e<i;e++)n.add(r[e])}let r=[Array.from(n).sort((e,t)=>e-t)],i=r[0].length,a=new Map;for(let e=0;e<i;e++)a.set(r[0][e],e);for(let n=0;n<e.length;n++){let o=e[n],s=o[0];for(let e=1;e<o.length;e++){let c=o[e],l=Array(i).fill(void 0),u=t?t[n][e]:nn,d=[];for(let e=0;e<c.length;e++){let t=c[e],n=a.get(s[e]);t===null?u!=tn&&(l[n]=t,u==rn&&d.push(n)):l[n]=t}an(l,d,i),r.push(l)}}return r}var sn=typeof queueMicrotask>`u`?e=>Promise.resolve().then(e):queueMicrotask;function cn(e){let t=e[0],n=t.length,r=Array(n);for(let e=0;e<r.length;e++)r[e]=e;r.sort((e,n)=>t[e]-t[n]);let i=[];for(let t=0;t<e.length;t++){let a=e[t],o=Array(n);for(let e=0;e<n;e++)o[e]=a[r[e]];i.push(o)}return i}function ln(e){let t=e[0][0],n=t.length;for(let r=1;r<e.length;r++){let i=e[r][0];if(i.length!=n)return!1;if(i!=t){for(let e=0;e<n;e++)if(i[e]!=t[e])return!1}}return!0}function un(e,t=100){let n=e.length;if(n<=1)return!0;let r=0,i=n-1;for(;r<=i&&e[r]==null;)r++;for(;i>=r&&e[i]==null;)i--;if(i<=r)return!0;let a=xt(1,vt((i-r+1)/t));for(let t=e[r],n=r+a;n<=i;n+=a){let r=e[n];if(r!=null){if(r<=t)return!1;t=r}}return!0}var dn=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],fn=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function pn(e){return e.slice(0,3)}var mn=fn.map(pn),hn={MMMM:dn,MMM:dn.map(pn),WWWW:fn,WWW:mn};function gn(e){return(e<10?`0`:``)+e}function _n(e){return(e<10?`00`:e<100?`0`:``)+e}var vn={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+``).slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>gn(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>gn(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>gn(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return t==0?12:t>12?t-12:t},AA:e=>e.getHours()>=12?`PM`:`AM`,aa:e=>e.getHours()>=12?`pm`:`am`,a:e=>e.getHours()>=12?`p`:`a`,mm:e=>gn(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>gn(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>_n(e.getMilliseconds())};function yn(e,t){t||=hn;let n=[],r=/\{([a-z]+)\}|[^{]+/gi,i;for(;i=r.exec(e);)n.push(i[0][0]==`{`?vn[i[1]]:i[0]);return e=>{let r=``;for(let i=0;i<n.length;i++)r+=typeof n[i]==`string`?n[i]:n[i](e,t);return r}}var bn=new Intl.DateTimeFormat().resolvedOptions().timeZone;function xn(e,t){let n;return t==`UTC`||t==`Etc/UTC`?n=new Date(+e+e.getTimezoneOffset()*6e4):t==bn?n=e:(n=new Date(e.toLocaleString(`en-US`,{timeZone:t})),n.setMilliseconds(e.getMilliseconds())),n}var Sn=e=>e%1==0,Cn=[1,2,2.5,5],wn=V(10,-32,0,Cn),W=V(10,0,32,Cn),Tn=W.filter(Sn),En=wn.concat(W),Dn=`{YYYY}`,On=`
1
+ import{C as e,D as t,E as n,O as r,S as i,T as a,_ as o,a as s,b as c,c as l,f as u,g as d,h as f,i as p,k as m,m as h,o as g,p as _,r as v,s as y,t as b,v as x,w as S,x as C,y as w}from"./index-DtddKTWH.js";var T=!0,E=`uplot`,ee=`u-hz`,te=`u-vt`,ne=`u-title`,re=`u-wrap`,ie=`u-under`,ae=`u-over`,oe=`u-axis`,se=`u-off`,ce=`u-select`,le=`u-cursor-x`,ue=`u-cursor-y`,de=`u-cursor-pt`,fe=`u-legend`,pe=`u-live`,me=`u-inline`,he=`u-series`,ge=`u-marker`,_e=`u-label`,ve=`u-value`,ye=`width`,be=`height`,xe=`top`,Se=`bottom`,Ce=`left`,we=`right`,Te=`#000`,Ee=`#0000`,De=`mousemove`,Oe=`mousedown`,ke=`mouseup`,Ae=`mouseenter`,je=`mouseleave`,Me=`dblclick`,D=`resize`,Ne=`scroll`,Pe=`change`,Fe=`dppxchange`,Ie=`--`,Le=typeof window<`u`,Re=Le?document:null,ze=Le?window:null,O=Le?navigator:null,k,Be;function Ve(){let e=devicePixelRatio;k!=e&&(k=e,Be&&et(Pe,Be,Ve),Be=matchMedia(`(min-resolution: ${k-.001}dppx) and (max-resolution: ${k+.001}dppx)`),$e(Pe,Be,Ve),ze.dispatchEvent(new CustomEvent(Fe)))}function He(e,t){if(t!=null){let n=e.classList;!n.contains(t)&&n.add(t)}}function Ue(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}function A(e,t,n){e.style[t]=n+`px`}function We(e,t,n,r){let i=Re.createElement(e);return t!=null&&He(i,t),n?.insertBefore(i,r),i}function Ge(e,t){return We(`div`,e,t)}var Ke=new WeakMap;function qe(e,t,n,r,i){let a=`translate(`+t+`px,`+n+`px)`;a!=Ke.get(e)&&(e.style.transform=a,Ke.set(e,a),t<0||n<0||t>r||n>i?He(e,se):Ue(e,se))}var Je=new WeakMap;function Ye(e,t,n){let r=t+n;r!=Je.get(e)&&(Je.set(e,r),e.style.background=t,e.style.borderColor=n)}var Xe=new WeakMap;function Ze(e,t,n,r){let i=t+``+n;i!=Xe.get(e)&&(Xe.set(e,i),e.style.height=n+`px`,e.style.width=t+`px`,e.style.marginLeft=r?-t/2+`px`:0,e.style.marginTop=r?-n/2+`px`:0)}var Qe={passive:!0},j={...Qe,capture:!0};function $e(e,t,n,r){t.addEventListener(e,n,r?j:Qe)}function et(e,t,n,r){t.removeEventListener(e,n,Qe)}Le&&Ve();function tt(e,t,n,r){let i;n||=0,r||=t.length-1;let a=r<=2147483647;for(;r-n>1;)i=a?n+r>>1:vt((n+r)/2),t[i]<e?n=i:r=i;return e-t[n]<=t[r]-e?n:r}function M(e){return(t,n,r)=>{let i=-1,a=-1;for(let a=n;a<=r;a++)if(e(t[a])){i=a;break}for(let i=r;i>=n;i--)if(e(t[i])){a=i;break}return[i,a]}}var nt=e=>e!=null,rt=e=>e!=null&&e>0,N=M(nt),it=M(rt);function at(e,t,n,r=0,i=!1){let a=i?it:N,o=i?rt:nt;[t,n]=a(e,t,n);let s=e[t],c=e[t];if(t>-1)if(r==1)s=e[t],c=e[n];else if(r==-1)s=e[n],c=e[t];else for(let r=t;r<=n;r++){let t=e[r];o(t)&&(t<s?s=t:t>c&&(c=t))}return[s??R,c??-R]}function ot(e,t,n,r){let i=Ct(e),a=Ct(t);e==t&&(i==-1?(e*=n,t/=n):(e/=n,t*=n));let o=n==10?wt:Tt,s=i==1?vt:yt,c=a==1?yt:vt,l=s(o(I(e))),u=c(o(I(t))),d=St(n,l),f=St(n,u);return n==10&&(l<0&&(d=B(d,-l)),u<0&&(f=B(f,-u))),r||n==2?(e=d*i,t=f*a):(e=Vt(e,d),t=Bt(t,f)),[e,t]}function st(e,t,n,r){let i=ot(e,t,n,r);return e==0&&(i[0]=0),t==0&&(i[1]=0),i}var ct=.1,lt={mode:3,pad:ct},ut={pad:0,soft:null,mode:0},dt={min:ut,max:ut};function ft(e,t,n,r){return Xt(n)?mt(e,t,n):(ut.pad=n,ut.soft=r?0:null,ut.mode=r?3:0,mt(e,t,dt))}function P(e,t){return e??t}function pt(e,t,n){for(t=P(t,0),n=P(n,e.length-1);t<=n;){if(e[t]!=null)return!0;t++}return!1}function mt(e,t,n){let r=n.min,i=n.max,a=P(r.pad,0),o=P(i.pad,0),s=P(r.hard,-R),c=P(i.hard,R),l=P(r.soft,R),u=P(i.soft,-R),d=P(r.mode,0),f=P(i.mode,0),p=t-e,m=wt(p),h=xt(I(e),I(t)),g=I(wt(h)-m);(p<1e-24||g>10)&&(p=0,(e==0||t==0)&&(p=1e-24,d==2&&l!=R&&(a=0),f==2&&u!=-R&&(o=0)));let _=p||h||1e3,v=St(10,vt(wt(_))),y=B(Vt(e-_*(p==0?e==0?.1:1:a),v/10),24),b=e>=l&&(d==1||d==3&&y<=l||d==2&&y>=l)?l:R,x=xt(s,y<b&&e>=b?b:bt(b,y)),S=B(Bt(t+_*(p==0?t==0?.1:1:o),v/10),24),C=t<=u&&(f==1||f==3&&S>=u||f==2&&S<=u)?u:-R,w=bt(c,S>C&&t<=C?C:xt(C,S));return x==w&&x==0&&(w=100),[x,w]}var ht=new Intl.NumberFormat(Le?O.language:`en-US`),gt=e=>ht.format(e),F=Math,_t=F.PI,I=F.abs,vt=F.floor,L=F.round,yt=F.ceil,bt=F.min,xt=F.max,St=F.pow,Ct=F.sign,wt=F.log10,Tt=F.log2,Et=(e,t=1)=>F.sinh(e)*t,Dt=(e,t=1)=>F.asinh(e/t),R=1/0;function Ot(e){return(wt((e^e>>31)-(e>>31))|0)+1}function kt(e,t,n){return bt(xt(e,t),n)}function At(e){return typeof e==`function`}function z(e){return At(e)?e:()=>e}var jt=()=>{},Mt=e=>e,Nt=(e,t)=>t,Pt=e=>null,Ft=e=>!0,It=(e,t)=>e==t,Lt=/\.\d*?(?=9{6,}|0{6,})/gm,Rt=e=>{if(H(e)||Ht.has(e))return e;let t=`${e}`,n=t.match(Lt);if(n==null)return e;let r=n[0].length-1;if(t.indexOf(`e-`)!=-1){let[e,n]=t.split(`e`);return+`${Rt(e)}e${n}`}return B(e,r)};function zt(e,t){return Rt(B(Rt(e/t))*t)}function Bt(e,t){return Rt(yt(Rt(e/t))*t)}function Vt(e,t){return Rt(vt(Rt(e/t))*t)}function B(e,t=0){if(H(e))return e;let n=10**t;return L(e*n*(1+2**-52))/n}var Ht=new Map;function Ut(e){return((``+e).split(`.`)[1]||``).length}function V(e,t,n,r){let i=[],a=r.map(Ut);for(let o=t;o<n;o++){let t=I(o),n=B(St(e,o),t);for(let s=0;s<r.length;s++){let c=e==10?+`${r[s]}e${o}`:r[s]*n,l=(o>=0?0:t)+(o>=a[s]?0:a[s]),u=e==10?c:B(c,l);i.push(u),Ht.set(u,l)}}return i}var Wt={},Gt=[],Kt=[null,null],qt=Array.isArray,H=Number.isInteger,Jt=e=>e===void 0;function Yt(e){return typeof e==`string`}function Xt(e){let t=!1;if(e!=null){let n=e.constructor;t=n==null||n==Object}return t}function Zt(e){return typeof e==`object`&&!!e}var Qt=Object.getPrototypeOf(Uint8Array),$t=`__proto__`;function en(e,t=Xt){let n;if(qt(e)){let r=e.find(e=>e!=null);if(qt(r)||t(r)){n=Array(e.length);for(let r=0;r<e.length;r++)n[r]=en(e[r],t)}else n=e.slice()}else if(e instanceof Qt)n=e.slice();else if(t(e)){n={};for(let r in e)r!=$t&&(n[r]=en(e[r],t))}else n=e;return n}function U(e){let t=arguments;for(let n=1;n<t.length;n++){let r=t[n];for(let t in r)t!=$t&&(Xt(e[t])?U(e[t],en(r[t])):e[t]=en(r[t]))}return e}var tn=0,nn=1,rn=2;function an(e,t,n){for(let r=0,i,a=-1;r<t.length;r++){let o=t[r];if(o>a){for(i=o-1;i>=0&&e[i]==null;)e[i--]=null;for(i=o+1;i<n&&e[i]==null;)e[a=i++]=null}}}function on(e,t){if(ln(e)){let t=e[0].slice();for(let n=1;n<e.length;n++)t.push(...e[n].slice(1));return un(t[0])||(t=cn(t)),t}let n=new Set;for(let t=0;t<e.length;t++){let r=e[t][0],i=r.length;for(let e=0;e<i;e++)n.add(r[e])}let r=[Array.from(n).sort((e,t)=>e-t)],i=r[0].length,a=new Map;for(let e=0;e<i;e++)a.set(r[0][e],e);for(let n=0;n<e.length;n++){let o=e[n],s=o[0];for(let e=1;e<o.length;e++){let c=o[e],l=Array(i).fill(void 0),u=t?t[n][e]:nn,d=[];for(let e=0;e<c.length;e++){let t=c[e],n=a.get(s[e]);t===null?u!=tn&&(l[n]=t,u==rn&&d.push(n)):l[n]=t}an(l,d,i),r.push(l)}}return r}var sn=typeof queueMicrotask>`u`?e=>Promise.resolve().then(e):queueMicrotask;function cn(e){let t=e[0],n=t.length,r=Array(n);for(let e=0;e<r.length;e++)r[e]=e;r.sort((e,n)=>t[e]-t[n]);let i=[];for(let t=0;t<e.length;t++){let a=e[t],o=Array(n);for(let e=0;e<n;e++)o[e]=a[r[e]];i.push(o)}return i}function ln(e){let t=e[0][0],n=t.length;for(let r=1;r<e.length;r++){let i=e[r][0];if(i.length!=n)return!1;if(i!=t){for(let e=0;e<n;e++)if(i[e]!=t[e])return!1}}return!0}function un(e,t=100){let n=e.length;if(n<=1)return!0;let r=0,i=n-1;for(;r<=i&&e[r]==null;)r++;for(;i>=r&&e[i]==null;)i--;if(i<=r)return!0;let a=xt(1,vt((i-r+1)/t));for(let t=e[r],n=r+a;n<=i;n+=a){let r=e[n];if(r!=null){if(r<=t)return!1;t=r}}return!0}var dn=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],fn=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function pn(e){return e.slice(0,3)}var mn=fn.map(pn),hn={MMMM:dn,MMM:dn.map(pn),WWWW:fn,WWW:mn};function gn(e){return(e<10?`0`:``)+e}function _n(e){return(e<10?`00`:e<100?`0`:``)+e}var vn={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+``).slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>gn(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>gn(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>gn(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return t==0?12:t>12?t-12:t},AA:e=>e.getHours()>=12?`PM`:`AM`,aa:e=>e.getHours()>=12?`pm`:`am`,a:e=>e.getHours()>=12?`p`:`a`,mm:e=>gn(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>gn(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>_n(e.getMilliseconds())};function yn(e,t){t||=hn;let n=[],r=/\{([a-z]+)\}|[^{]+/gi,i;for(;i=r.exec(e);)n.push(i[0][0]==`{`?vn[i[1]]:i[0]);return e=>{let r=``;for(let i=0;i<n.length;i++)r+=typeof n[i]==`string`?n[i]:n[i](e,t);return r}}var bn=new Intl.DateTimeFormat().resolvedOptions().timeZone;function xn(e,t){let n;return t==`UTC`||t==`Etc/UTC`?n=new Date(+e+e.getTimezoneOffset()*6e4):t==bn?n=e:(n=new Date(e.toLocaleString(`en-US`,{timeZone:t})),n.setMilliseconds(e.getMilliseconds())),n}var Sn=e=>e%1==0,Cn=[1,2,2.5,5],wn=V(10,-32,0,Cn),W=V(10,0,32,Cn),Tn=W.filter(Sn),En=wn.concat(W),Dn=`{YYYY}`,On=`
2
2
  {YYYY}`,kn=`{M}/{D}`,An=`
3
3
  {M}/{D}`,jn=`
4
4
  {M}/{D}/{YY}`,Mn=`{h}:{mm}{aa}`,Nn=`