@lucaismyname/ginger 0.0.25 → 0.0.28
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/README.md +34 -68
- package/dist/GingerSplitContexts-BzBExb95.js.map +1 -1
- package/dist/GingerSplitContexts-C7puo0M7.cjs.map +1 -1
- package/dist/analyzer/liveAudioGraph.d.ts.map +1 -1
- package/dist/analyzer/liveAudioGraph.test.d.ts +2 -0
- package/dist/analyzer/liveAudioGraph.test.d.ts.map +1 -0
- package/dist/analyzer/useGingerLiveAnalyzer.d.ts.map +1 -1
- package/dist/analyzer/useGingerLiveAnalyzer.test.d.ts +2 -0
- package/dist/analyzer/useGingerLiveAnalyzer.test.d.ts.map +1 -0
- package/dist/audio/GingerPlayer.d.ts.map +1 -1
- package/dist/client.cjs +1 -1
- package/dist/client.js +2 -2
- package/dist/components/controls/Controls.d.ts.map +1 -1
- package/dist/components/current/Artwork.d.ts.map +1 -1
- package/dist/components/current/Chapters.d.ts +1 -1
- package/dist/components/current/Chapters.d.ts.map +1 -1
- package/dist/components/current/FileUrl.d.ts +1 -1
- package/dist/components/current/FileUrl.d.ts.map +1 -1
- package/dist/components/current/Lyrics.d.ts +3 -1
- package/dist/components/current/Lyrics.d.ts.map +1 -1
- package/dist/components/current/LyricsSynced.d.ts +1 -1
- package/dist/components/current/LyricsSynced.d.ts.map +1 -1
- package/dist/components/current/Playback.d.ts +2 -2
- package/dist/components/current/Playback.d.ts.map +1 -1
- package/dist/components/current/QueueMeta.d.ts +2 -2
- package/dist/components/current/QueueMeta.d.ts.map +1 -1
- package/dist/components/current/Time.d.ts +2 -2
- package/dist/components/current/Time.d.ts.map +1 -1
- package/dist/components/current/Year.d.ts +1 -1
- package/dist/components/current/Year.d.ts.map +1 -1
- package/dist/components/current/createTextDisplay.d.ts.map +1 -1
- package/dist/components/current/texts.d.ts.map +1 -1
- package/dist/components/icons/Pause.d.ts +2 -0
- package/dist/components/icons/Pause.d.ts.map +1 -0
- package/dist/components/icons/Play.d.ts +2 -0
- package/dist/components/icons/Play.d.ts.map +1 -0
- package/dist/components/icons/Wrapper.d.ts +14 -0
- package/dist/components/icons/Wrapper.d.ts.map +1 -0
- package/dist/components/playlist/GingerPlaylist.d.ts.map +1 -1
- package/dist/components/queue/QueueDisplay.d.ts +1 -1
- package/dist/components/queue/QueueDisplay.d.ts.map +1 -1
- package/dist/context/GingerContext.d.ts.map +1 -1
- package/dist/context/GingerLocaleContext.d.ts.map +1 -1
- package/dist/context/GingerProvider.d.ts +1 -1
- package/dist/context/GingerProvider.d.ts.map +1 -1
- package/dist/context/GingerSplitContexts.d.ts.map +1 -1
- package/dist/core/playbackReducer.d.ts.map +1 -1
- package/dist/core/queue.d.ts.map +1 -1
- package/dist/core/transitions.d.ts.map +1 -1
- package/dist/ginger-CVwaVLpC.cjs +2 -0
- package/dist/ginger-CVwaVLpC.cjs.map +1 -0
- package/dist/ginger-G5-3BYSb.js +2165 -0
- package/dist/ginger-G5-3BYSb.js.map +1 -0
- package/dist/ginger.d.ts +1 -1
- package/dist/ginger.d.ts.map +1 -1
- package/dist/hooks/useControlBindings.d.ts.map +1 -1
- package/dist/hooks/useGinger.d.ts.map +1 -1
- package/dist/hooks/useGingerKeyboardShortcuts.d.ts.map +1 -1
- package/dist/hooks/useGingerLyricsSync.d.ts.map +1 -1
- package/dist/hooks/useSeekDrag.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +2 -2
- package/dist/internal/selectors.d.ts.map +1 -1
- package/dist/testing/helpers.d.ts +1 -1
- package/dist/testing/helpers.d.ts.map +1 -1
- package/dist/testing/index.cjs +1 -1
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/mockWebAudio.d.ts +47 -0
- package/dist/testing/mockWebAudio.d.ts.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/{useNextTrackPrefetch-iqM3_D0L.cjs → useNextTrackPrefetch-CtZp7EgH.cjs} +2 -2
- package/dist/useNextTrackPrefetch-CtZp7EgH.cjs.map +1 -0
- package/dist/{useNextTrackPrefetch-CmfCP_Vz.js → useNextTrackPrefetch-Mj8dQLYR.js} +53 -45
- package/dist/useNextTrackPrefetch-Mj8dQLYR.js.map +1 -0
- package/dist/waveform/analyzeAudioFile.d.ts.map +1 -1
- package/dist/waveform/index.cjs +1 -1
- package/dist/waveform/index.cjs.map +1 -1
- package/dist/waveform/index.js +91 -84
- package/dist/waveform/index.js.map +1 -1
- package/dist/waveform/useAudioFileAnalysis.d.ts.map +1 -1
- package/dist/waveform/useAudioPeaks.d.ts.map +1 -1
- package/package.json +5 -5
- package/dist/ginger-Dj-zM_lq.js +0 -1826
- package/dist/ginger-Dj-zM_lq.js.map +0 -1
- package/dist/ginger-R_CXoaE2.cjs +0 -2
- package/dist/ginger-R_CXoaE2.cjs.map +0 -1
- package/dist/useNextTrackPrefetch-CmfCP_Vz.js.map +0 -1
- package/dist/useNextTrackPrefetch-iqM3_D0L.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerProvider.d.ts","sourceRoot":"","sources":["../../src/context/GingerProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GingerProvider.d.ts","sourceRoot":"","sources":["../../src/context/GingerProvider.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAEV,mBAAmB,EAKpB,MAAM,UAAU,CAAC;AAuBlB,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,aAAkB,EAClB,YAAgB,EAChB,mBAA0B,EAC1B,cAAsB,EACtB,iBAAyB,EACzB,mBAAgC,EAChC,aAAoB,EACpB,aAAiB,EACjB,YAAoB,EACpB,mBAAuB,EACvB,eAAe,EACf,MAAM,EACN,YAAoB,EACpB,UAAU,EACV,aAAa,EACb,WAAW,EACX,cAAsB,EACtB,mBAA2B,EAC3B,QAAgB,EAChB,OAAe,EACf,SAAS,EACT,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,GACR,EAAE,mBAAmB,2CAqiBrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerSplitContexts.d.ts","sourceRoot":"","sources":["../../src/context/GingerSplitContexts.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"GingerSplitContexts.d.ts","sourceRoot":"","sources":["../../src/context/GingerSplitContexts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playbackReducer.d.ts","sourceRoot":"","sources":["../../src/core/playbackReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAY7E,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,WAAW,CA0Bd;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"playbackReducer.d.ts","sourceRoot":"","sources":["../../src/core/playbackReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAY7E,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,WAAW,CA0Bd;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CA2OnF"}
|
package/dist/core/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,CAU/E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGrE;AAED,wBAAgB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,CAU/E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGrE;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,KAAK,EAAE,EACf,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,CAyBR;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAKpF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAKrE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAetF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,CAEzF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/core/transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,gGAAgG;AAChG,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,WAAW,EACX,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,cAAc,CAC1D,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,6BAA6B,GAAG,eAAe,CAS5F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,CAQ7E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,CAQ7E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAI5D;AAED,wBAAgB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/core/transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,gGAAgG;AAChG,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,WAAW,EACX,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,cAAc,CAC1D,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,6BAA6B,GAAG,eAAe,CAS5F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,CAQ7E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,CAQ7E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAI5D;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAC/B,MAAM,GAAG,SAAS,CAEpB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const l=require("react/jsx-runtime"),f=require("react"),b=require("./GingerSplitContexts-C7puo0M7.cjs"),Be=f.createContext(null);function wr(){const e=f.useContext(Be);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function Ue(e){const{buffered:r,duration:n}=e;return!(n>0)||r.length===0?0:Math.min(1,r.end(r.length-1)/n)}function Dr({className:e,style:r,preload:n="metadata",crossOrigin:a,respectReducedMotion:t=!1}){var E;const{audioRef:i,dispatch:o,state:u,notifyEnded:c}=wr(),s=((E=u.tracks[u.currentIndex])==null?void 0:E.fileUrl)??"",m=f.useRef({currentTime:-1,duration:-1,bufferedFraction:-1}),y=f.useRef(""),[v,h]=f.useState(!1);f.useEffect(()=>{if(!t||typeof window>"u")return;const p=window.matchMedia("(prefers-reduced-motion: reduce)"),S=()=>h(p.matches);return S(),p.addEventListener("change",S),()=>p.removeEventListener("change",S)},[t]);const k=(p,S=!1)=>{const A={currentTime:p.currentTime,duration:p.duration,bufferedFraction:Ue(p)},C=m.current,q=v?.5:.25,z=Math.abs(A.currentTime-C.currentTime)>=q||Math.abs(A.duration-C.duration)>=.01||Math.abs(A.bufferedFraction-C.bufferedFraction)>=.01;!S&&!z||(m.current=A,o({type:"MEDIA_TIME_UPDATE",payload:A}))};return f.useEffect(()=>{const p=i.current;p&&(p.volume=u.volume,p.muted=u.muted)},[i,u.volume,u.muted]),f.useEffect(()=>{const p=i.current;if(p){if(!s){p.removeAttribute("src"),m.current={currentTime:-1,duration:-1,bufferedFraction:-1},y.current!==""&&o({type:"MEDIA_SOURCE_CLEARED"}),y.current="";return}p.getAttribute("src")!==s&&(p.src=s,p.load(),m.current={currentTime:-1,duration:-1,bufferedFraction:-1}),y.current=s}},[i,o,u.currentIndex,u.tracks,s]),f.useEffect(()=>{const p=i.current;p&&(p.playbackRate=u.playbackRate)},[i,u.playbackRate,s]),l.jsx("audio",{"data-ginger-component":"Player",ref:i,className:e,style:r,preload:n,crossOrigin:a,controls:!1,playsInline:!0,onTimeUpdate:p=>{k(p.currentTarget)},onLoadedMetadata:p=>{const S=p.currentTarget;m.current={currentTime:-1,duration:-1,bufferedFraction:-1},o({type:"MEDIA_LOADED_METADATA",payload:{duration:S.duration,bufferedFraction:Ue(S)}})},onSeeking:p=>k(p.currentTarget,!0),onSeeked:p=>k(p.currentTarget,!0),onEnded:()=>c(),onPlay:()=>o({type:"MEDIA_PLAY"}),onPause:()=>o({type:"MEDIA_PAUSE"}),onWaiting:()=>o({type:"MEDIA_WAITING"}),onCanPlay:()=>o({type:"MEDIA_CANPLAY"}),onProgress:p=>k(p.currentTarget,!0),onVolumeChange:p=>{const S=p.currentTarget;o({type:"MEDIA_VOLUME_SYNC",payload:{volume:S.volume,muted:S.muted}})},onError:()=>{var C;const p=i.current,S=(C=p==null?void 0:p.error)==null?void 0:C.code;o({type:"MEDIA_ERROR",payload:{message:S===1?"MEDIA_ERR_ABORTED":S===2?"MEDIA_ERR_NETWORK":S===3?"MEDIA_ERR_DECODE":S===4?"MEDIA_ERR_SRC_NOT_SUPPORTED":"MEDIA_ERR_UNKNOWN"}})}})}const Q={seek:"Seek",volume:"Volume",playbackSpeed:"Playback speed",chaptersList:"Chapters",syncedLyricsList:"Synced lyrics",nextTrack:"Next track",previousTrack:"Previous track",shuffle:"Shuffle",mute:"Mute",unmute:"Unmute",play:"Play",pause:"Pause",repeat:{off:"Repeat off",all:"Repeat all",one:"Repeat one"},playbackRateNormal:"1× normal",playbackRateTimes:e=>`${e}×`};function Fr(e){return e?{...Q,...e,repeat:{...Q.repeat,...e.repeat}}:Q}const $e=f.createContext(Q);function Ur({locale:e,children:r}){const n=Fr(e);return l.jsx($e.Provider,{value:n,children:r})}function I(){return f.useContext($e)}function H(e){if(!Number.isFinite(e)||e<0)return"0:00";const r=Math.floor(e%60);return`${Math.floor(e/60)}:${r.toString().padStart(2,"0")}`}function P(e,r){return r<=0?0:Math.max(0,Math.min(r-1,e))}function Oe(e,r){if(e.length<=1)return[...e];const n=e[r];if(!n)return[...e];const a=e.filter((t,i)=>i!==r);for(let t=a.length-1;t>0;t--){const i=Math.floor(Math.random()*(t+1));[a[t],a[i]]=[a[i],a[t]]}return[n,...a]}function K(e){return e?e.id!=null&&e.id!==""?`id:${e.id}`:`file:${e.fileUrl}`:""}function Vr(e,r){var o,u;if(!r)return 0;const n=e.findIndex(c=>c===r);if(n!==-1)return n;const a=K(r);if(!a)return 0;const t=[];for(let c=0;c<e.length;c+=1)K(e[c])===a&&t.push(c);if(t.length===0)return 0;if(t.length===1)return t[0];const i=typeof globalThis<"u"&&"process"in globalThis?(u=(o=globalThis.process)==null?void 0:o.env)==null?void 0:u.NODE_ENV:void 0;return i!=null&&i!=="production"&&console.warn("[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match."),t[0]}function Ye(e,r,n){const a=[...e],t=Math.max(0,Math.min(a.length,n??a.length));return a.splice(t,0,r),a}function Br(e,r){if(r<0||r>=e.length)return[...e];const n=[...e];return n.splice(r,1),n}function $r(e,r,n){if(r===n||r<0||r>=e.length||n<0||n>=e.length)return[...e];const a=[...e],[t]=a.splice(r,1);return t?(a.splice(n,0,t),a):[...e]}function Or(e,r,n){return Ye(e,n,Math.max(0,Math.min(e.length,r+1)))}function Yr(e){const{tracks:r,currentIndex:n,repeatMode:a,playbackMode:t}=e,i=r.length;return i===0?{kind:"stop",nextIndex:0}:a==="one"?{kind:"replay_same"}:t==="single"?{kind:"stop",nextIndex:P(n,i)}:n<i-1?{kind:"advance",nextIndex:n+1}:a==="all"?{kind:"wrap",nextIndex:0}:{kind:"stop",nextIndex:P(n,i)}}function Qe(e){const{tracks:r,currentIndex:n,repeatMode:a,playbackMode:t}=e,i=r.length;return i===0?0:t==="single"?P(n,i):n<i-1?n+1:a==="all"?0:P(n,i)}function Qr(e){const{tracks:r,currentIndex:n,repeatMode:a,playbackMode:t}=e,i=r.length;return i===0?0:t==="single"?P(n,i):n>0?n-1:a==="all"?i-1:0}function Hr(e){return e==="off"?"all":e==="all"?"one":"off"}function He(e,r){return(e==null?void 0:e.artworkUrl)??r??void 0}function Kr(e,r){return(e==null?void 0:e.album)??r??void 0}function N(e){return e.tracks[e.currentIndex]??null}function Ae(e){return e.errorMessage?"error":e.tracks.length===0?"idle":e.isBuffering?"loading":e.isPaused?Number.isFinite(e.duration)&&e.duration>0&&e.currentTime>=e.duration-.05?"ended":"paused":"playing"}function O(e){var a;const r=e.duration;if(Number.isFinite(r)&&r>0)return r;const n=(a=e.tracks[e.currentIndex])==null?void 0:a.durationSeconds;return typeof n=="number"&&Number.isFinite(n)&&n>0?n:0}function Ke(e){const n=O(e)-e.currentTime;return Number.isFinite(n)?Math.max(0,n):0}function Re(e){const r=O(e);return r>0?Math.min(1,Math.max(0,e.currentTime/r)):0}function Xe(e){var n;const r=N(e);return He(r,(n=e.playlistMeta)==null?void 0:n.artworkUrl)}function qe(e){var n;const r=N(e);return Kr(r,(n=e.playlistMeta)==null?void 0:n.subtitle)}function ze(){const e=b.useGingerPlayback(),r=b.useGingerMedia(),n=I(),a=f.useMemo(()=>b.gingerStateFromContextValues(e,r),[e,r]),t=O(a),i=t>0?a.currentTime:0,o=Number.isFinite(i)?i:0,u=t>0?`${H(o)} of ${H(t)}`:H(o),c=s=>{r.seek(Number(s.currentTarget.value))};return{state:a,value:o,min:0,max:t>0?t:1,step:"any",ariaValueText:u,ariaLabel:n.seek,onSeekInput:c,onSeekChange:c}}function We(){const e=b.useGingerPlayback(),r=b.useGingerMedia(),n=I(),a=f.useMemo(()=>b.gingerStateFromContextValues(e,r),[e,r]),t=i=>{r.setVolume(Number(i.currentTarget.value))};return{state:a,value:a.volume,min:0,max:1,step:"any",ariaValueText:`${Math.round(a.volume*100)}%`,ariaLabel:n.volume,onVolumeInput:t,onVolumeChange:t}}function Je(e){const r=b.useGingerPlayback(),n=I(),a=(e==null?void 0:e.playAriaLabel)??n.play,t=(e==null?void 0:e.pauseAriaLabel)??n.pause;return{isPaused:r.isPaused,toggle:r.togglePlayPause,ariaLabel:r.isPaused?a:t}}function Ze({playLabel:e="Play",pauseLabel:r="Pause",playAriaLabel:n,pauseAriaLabel:a,children:t,type:i="button",onClick:o,...u}){const c=I(),s=typeof e=="string"?e:c.play,m=typeof r=="string"?r:c.pause,y=Je({playAriaLabel:n??s,pauseAriaLabel:a??m});return l.jsx("button",{"data-ginger-component":"PlayPause",...u,type:i,"aria-label":y.ariaLabel,onClick:v=>{y.toggle(),o==null||o(v)},children:t??(y.isPaused?e:r)})}Ze.displayName="Ginger.Control.PlayPause";function er({type:e="button",ariaLabel:r,onClick:n,children:a,...t}){const{repeatMode:i,cycleRepeat:o}=b.useGingerPlayback(),c=I().repeat[i];return l.jsx("button",{"data-ginger-component":"Repeat",...t,type:e,"aria-label":r??c,onClick:s=>{o(),n==null||n(s)},children:a??c})}er.displayName="Ginger.Control.Repeat";function rr({type:e="button",children:r="Next",ariaLabel:n,onClick:a,...t}){const{next:i}=b.useGingerPlayback(),o=I();return l.jsx("button",{"data-ginger-component":"Next",...t,type:e,"aria-label":n??o.nextTrack,onClick:u=>{i(),a==null||a(u)},children:r??o.nextTrack})}rr.displayName="Ginger.Control.Next";function nr({type:e="button",children:r="Previous",ariaLabel:n,onClick:a,...t}){const{prev:i}=b.useGingerPlayback(),o=I();return l.jsx("button",{"data-ginger-component":"Previous",...t,type:e,"aria-label":n??o.previousTrack,onClick:u=>{i(),a==null||a(u)},children:r})}nr.displayName="Ginger.Control.Previous";function tr({type:e="button",children:r="Shuffle",ariaLabel:n,onClick:a,...t}){const{isShuffled:i,toggleShuffle:o}=b.useGingerPlayback(),u=I();return l.jsx("button",{"data-ginger-component":"Shuffle",...t,type:e,"aria-pressed":i,"aria-label":n??u.shuffle,onClick:c=>{o(),a==null||a(c)},children:r??u.shuffle})}tr.displayName="Ginger.Control.Shuffle";function ar({inputStyle:e,style:r,unstyled:n=!1,ariaLabel:a,...t}){const i=ze(),o=n?{...r,...e}:{width:"100%",...r,...e};return l.jsx("input",{"data-ginger-component":"SeekBar",...t,type:"range",min:i.min,max:i.max,step:i.step,value:i.value,"aria-label":a??i.ariaLabel,"aria-valuetext":i.ariaValueText,onInput:i.onSeekInput,onChange:i.onSeekChange,style:o})}ar.displayName="Ginger.Control.SeekBar";function ir({inputStyle:e,style:r,unstyled:n=!1,ariaLabel:a,...t}){const i=We(),o=n?{...r,...e}:{width:"100%",...r,...e};return l.jsx("input",{"data-ginger-component":"Volume",...t,type:"range",min:i.min,max:i.max,step:i.step,value:i.value,"aria-label":a??i.ariaLabel,"aria-valuetext":i.ariaValueText,onInput:i.onVolumeInput,onChange:i.onVolumeChange,style:o})}ir.displayName="Ginger.Control.Volume";function or({ariaLabel:e,muteLabel:r,unmuteLabel:n,type:a="button",onClick:t,children:i,...o}){const{muted:u,toggleMute:c}=b.useGingerMedia(),s=I(),m=r??s.mute,y=n??s.unmute;return l.jsx("button",{"data-ginger-component":"Mute",...o,type:a,"aria-pressed":u,"aria-label":e??(u?s.unmute:s.mute),onClick:v=>{c(),t==null||t(v)},children:i??(u?y:m)})}or.displayName="Ginger.Control.Mute";const Xr=[.5,.75,1,1.25,1.5,2];function ur({rates:e=Xr,style:r,ariaLabel:n,children:a,...t}){const{playbackRate:i,setPlaybackRate:o}=b.useGingerMedia(),u=I(),c=f.useMemo(()=>Array.from(new Set([...e,i])).sort((s,m)=>s-m),[e,i]);return l.jsx("select",{"data-ginger-component":"PlaybackRate",...t,"aria-label":n??u.playbackSpeed,value:String(i),style:r,onChange:s=>o(Number(s.currentTarget.value)),children:a??c.map(s=>l.jsx("option",{value:String(s),children:s===1?u.playbackRateNormal:u.playbackRateTimes(s)},s))})}ur.displayName="Ginger.Control.PlaybackRate";function U(e,r){function n(a){const t=b.useGingerState(),o=(r(t)??"").trim(),{className:u,style:c,fallback:s,empty:m,children:y}=a;if(!o){const v=m??s??null;return v?l.jsx("span",{className:u,style:c,children:v}):null}return y?l.jsx("span",{className:u,style:c,children:y(o,t)}):l.jsx("span",{className:u,style:c,children:o})}return n.displayName=e,n}function V(e,r){return U(e,n=>r(N(n)))}const qr=V("Ginger.Current.Title",e=>e==null?void 0:e.title),zr=V("Ginger.Current.Artist",e=>e==null?void 0:e.artist),Wr=U("Ginger.Current.Album",e=>qe(e)),Jr=V("Ginger.Current.Description",e=>e==null?void 0:e.description),Zr=U("Ginger.Current.Copyright",e=>{var n;const r=N(e);return(r==null?void 0:r.copyright)??((n=e.playlistMeta)==null?void 0:n.copyright)}),en=V("Ginger.Current.Genre",e=>e==null?void 0:e.genre),rn=V("Ginger.Current.Label",e=>e==null?void 0:e.label),nn=V("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),tn=V("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function sr({className:e,style:r,fallback:n,empty:a,children:t,format:i}){var s;const o=b.useGingerState(),u=(s=N(o))==null?void 0:s.year;if(typeof u!="number"||!Number.isFinite(u)){const m=a??n??null;return m?l.jsx("span",{"data-ginger-component":"Year",className:e,style:r,children:m}):null}const c=i?i(u):String(u);return t?l.jsx("span",{"data-ginger-component":"Year",className:e,style:r,children:t(c,o)}):l.jsx("span",{"data-ginger-component":"Year",className:e,style:r,children:c})}sr.displayName="Ginger.Current.Year";function cr({className:e,style:r,fallback:n,empty:a,children:t,preserveWhitespace:i=!0,unstyled:o=!1}){var y;const u=b.useGingerState(),c=((y=N(u))==null?void 0:y.lyrics)??"",s=i?c.replace(/^\s+|\s+$/g,""):c.trim();if(!s){const v=a??n??null;return v?l.jsx("span",{"data-ginger-component":"Lyrics",className:e,style:r,children:v}):null}const m=!o&&i?{whiteSpace:"pre-wrap"}:void 0;return t?l.jsx("span",{className:e,style:{...m,...r},children:t(s,u)}):l.jsx("span",{className:e,style:{...m,...r},children:s})}cr.displayName="Ginger.Current.Lyrics";const Ve=/\[(\d{1,2}):(\d{2})(?:\.(\d{1,3}))?\]/g;function lr(e){const r=[];for(const n of e.split(/\r?\n/)){const a=[...n.matchAll(Ve)];if(a.length===0)continue;const t=n.replace(Ve,"").trim();for(const i of a){const o=Number(i[1]??0),u=Number(i[2]??0),c=Number((i[3]??"0").padEnd(3,"0")),s=o*60+u+c/1e3;Number.isFinite(s)&&s>=0&&r.push({time:s,text:t})}}return r.sort((n,a)=>n.time-a.time)}function dr(){const{tracks:e,currentIndex:r}=b.useGingerPlayback(),{currentTime:n}=b.useGingerMedia(),a=e[r],t=f.useMemo(()=>a?Array.isArray(a.lyricsTimed)&&a.lyricsTimed.length>0?[...a.lyricsTimed].filter(o=>Number.isFinite(o.time)&&o.time>=0).sort((o,u)=>o.time-u.time):typeof a.lyrics=="string"?lr(a.lyrics):[]:[],[a]),i=f.useMemo(()=>{for(let o=t.length-1;o>=0;o-=1)if(n>=t[o].time)return o;return-1},[n,t]);return{lines:t,activeIndex:i,activeLine:i>=0?t[i]??null:null}}function Ge({className:e,style:r,fallback:n,empty:a,unstyled:t=!1,activeClassName:i,lineClassName:o,children:u}){const c=b.useGingerState(),s=I(),{lines:m,activeIndex:y}=dr();if(m.length===0){const h=a??n??null;return h?l.jsx("span",{"data-ginger-component":"LyricsSynced",className:e,style:r,children:h}):null}const v=t?{}:{listStyle:"none",margin:0,padding:0,fontFamily:"var(--ginger-font-family, system-ui, sans-serif)",fontSize:"var(--ginger-font-size, 14px)",color:"var(--ginger-primary-color, #111827)"};return l.jsx("ul",{className:e,style:{...v,...r},"aria-label":s.syncedLyricsList,children:m.map((h,k)=>{const E=k===y;return l.jsx("li",{"aria-current":E?"true":void 0,"data-ginger-active":E||void 0,className:[o,E?i:void 0].filter(Boolean).join(" ")||void 0,style:t?void 0:{padding:"var(--ginger-playlist-row-padding, 4px 8px)",fontWeight:E?600:400,opacity:E?1:.75},children:u?u(h,k,E,c):h.text},`${h.time}-${k}`)})})}Ge.displayName="Ginger.Current.LyricsSynced";function fr(){const{tracks:e,currentIndex:r}=b.useGingerPlayback(),{currentTime:n,seek:a}=b.useGingerMedia(),t=f.useMemo(()=>{var u;return[...((u=e[r])==null?void 0:u.chapters)??[]].filter(c=>c&&Number.isFinite(c.startSeconds)&&c.startSeconds>=0).sort((c,s)=>c.startSeconds-s.startSeconds)},[r,e]),i=f.useMemo(()=>{if(t.length===0)return-1;for(let o=t.length-1;o>=0;o-=1)if(n>=t[o].startSeconds)return o;return-1},[n,t]);return{list:t,activeIndex:i,active:i>=0?t[i]??null:null,seekTo:o=>{const u=t[o];u&&a(u.startSeconds)}}}function Ce({className:e,style:r,fallback:n,empty:a,unstyled:t=!1,formatStart:i=H,children:o}){const u=b.useGingerState(),c=I(),{list:s,activeIndex:m,seekTo:y}=fr();if(s.length===0){const h=a??n??null;return h?l.jsx("span",{"data-ginger-component":"Chapters",className:e,style:r,children:h}):null}const v=t?{}:{listStyle:"none",margin:0,padding:0,fontFamily:"var(--ginger-font-family, system-ui, sans-serif)",fontSize:"var(--ginger-font-size, 14px)",color:"var(--ginger-primary-color, #111827)"};return l.jsx("ul",{className:e,style:{...v,...r},"aria-label":c.chaptersList,children:s.map((h,k)=>{const E=k===m;return l.jsx("li",{children:l.jsx("button",{type:"button","aria-current":E?"true":void 0,"data-ginger-active":E||void 0,onClick:()=>y(k),style:{width:t?void 0:"100%",textAlign:t?void 0:"left",border:t?void 0:"none",background:t?void 0:E?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:t?void 0:"inherit",font:t?void 0:"inherit",cursor:t?void 0:"pointer",padding:t?void 0:"var(--ginger-playlist-row-padding, 6px 8px)"},children:o?o(h,k,E,u):t?l.jsxs(l.Fragment,{children:[i(h.startSeconds)," ",h.title]}):l.jsxs("span",{children:[l.jsx("span",{style:{opacity:.75,marginRight:"0.35em"},children:i(h.startSeconds)}),h.title]})})},`${h.startSeconds}-${h.title}`)})})}Ce.displayName="Ginger.Current.Chapters";function gr({visible:e=!1,className:r,style:n,fallback:a,empty:t,children:i}){var c;const o=b.useGingerState();if(!e)return null;const u=((c=N(o))==null?void 0:c.fileUrl)??"";if(!u){const s=t??a??null;return s?l.jsx("span",{className:r,style:n,children:s}):null}return i?l.jsx("span",{"data-ginger-component":"FileUrl",className:r,style:n,children:i(u,o)}):l.jsx("span",{className:r,style:n,children:u})}gr.displayName="Ginger.Current.FileUrl";function pr({className:e,style:r,fallback:n,empty:a,sizes:t,loading:i,onError:o,decoding:u,unstyled:c=!1,imgStyle:s}){const m=b.useGingerState(),y=N(m),v=Xe(m);if(!v){const k=a??n??null;return k?l.jsx("span",{className:e,style:r,children:k}):null}const h=[y==null?void 0:y.title,y==null?void 0:y.artist].filter(Boolean).join(" — ")||"Artwork";return l.jsx("div",{"data-ginger-component":"Artwork",className:e,style:c?{...r}:{background:"var(--ginger-artwork-bg, transparent)",borderRadius:"var(--ginger-artwork-radius, 0)",overflow:"hidden",...r},children:l.jsx("img",{src:v,alt:h,sizes:t,loading:i,decoding:u,onError:o,style:{display:c?void 0:"block",width:c?void 0:"100%",height:c?void 0:"100%",objectFit:c?void 0:"cover",...s}})})}pr.displayName="Ginger.Current.Artwork";function mr({base:e=0,className:r,style:n,fallback:a,empty:t,children:i}){const o=b.useGingerState();if(o.tracks.length===0){const s=t??a??null;return s?l.jsx("span",{"data-ginger-component":"QueueIndex",className:r,style:n,children:s}):null}const c=String(o.currentIndex+e);return i?l.jsx("span",{"data-ginger-component":"QueueIndex",className:r,style:n,children:i(c,o)}):l.jsx("span",{"data-ginger-component":"QueueIndex",className:r,style:n,children:c})}mr.displayName="Ginger.Current.QueueIndex";function yr({className:e,style:r,fallback:n,empty:a,children:t}){const i=b.useGingerState(),o=String(i.tracks.length);if(i.tracks.length===0){const u=a??n??null;return u?l.jsx("span",{className:e,style:r,children:u}):null}return t?l.jsx("span",{"data-ginger-component":"QueueLength",className:e,style:r,children:t(o,i)}):l.jsx("span",{"data-ginger-component":"QueueLength",className:e,style:r,children:o})}yr.displayName="Ginger.Current.QueueLength";function br({base:e=0,separator:r=" / ",className:n,style:a,fallback:t,empty:i,children:o}){const u=b.useGingerState(),c=u.tracks.length;if(c===0){const v=i??t??null;return v?l.jsx("span",{className:n,style:a,children:v}):null}const s=String(u.currentIndex+e),m=String(c),y=`${s}${r}${m}`;return o?l.jsx("span",{"data-ginger-component":"QueuePosition",className:n,style:a,children:o({index:s,length:m,label:y},u)}):l.jsx("span",{"data-ginger-component":"QueuePosition",className:n,style:a,children:y})}br.displayName="Ginger.Current.QueuePosition";function je(e,r,n){const{className:a,style:t,fallback:i,empty:o,children:u,format:c=H}=n;if(!(e>=0)||!Number.isFinite(e)){const m=o??i??null;return m?l.jsx("span",{"data-ginger-component":"TimeText",className:a,style:t,children:m}):null}const s=c(e);return u?l.jsx("span",{"data-ginger-component":"TimeText",className:a,style:t,children:u(s,r)}):l.jsx("span",{"data-ginger-component":"TimeText",className:a,style:t,children:s})}function xr(e){const r=b.useGingerState();return je(r.currentTime,r,e)}xr.displayName="Ginger.Current.Elapsed";function hr(e){const r=b.useGingerState();return je(O(r),r,e)}hr.displayName="Ginger.Current.Duration";function vr(e){const r=b.useGingerState();return je(Ke(r),r,e)}vr.displayName="Ginger.Current.Remaining";function kr({className:e,style:r,fallback:n,empty:a,children:t}){const i=b.useGingerState(),o=O(i),u=Re(i);if(!(o>0)){const c=a??n??null;return c?l.jsx("span",{"data-ginger-component":"Progress",className:e,style:r,children:c}):null}return t?l.jsx("span",{"data-ginger-component":"Progress",className:e,style:r,children:t({fraction:u,currentTime:i.currentTime,duration:o},i)}):l.jsx("span",{"data-ginger-component":"Progress",className:e,style:r,children:`${Math.round(u*100)}%`})}kr.displayName="Ginger.Current.Progress";function Mr({className:e,style:r,height:n=4,showBuffered:a=!1,unstyled:t=!1}){const i=b.useGingerState(),o=`${Math.round(Re(i)*100)}%`,u=`${Math.round(Math.min(1,Math.max(0,i.bufferedFraction))*100)}%`;return l.jsxs("div",{"data-ginger-component":"TimeRail",className:e,style:t?{...r}:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",position:"relative",...r},"aria-hidden":!0,children:[a?l.jsx("div",{"data-ginger-component":"TimeRail",style:{position:t?void 0:"absolute",left:t?void 0:0,top:t?void 0:0,height:t?void 0:"100%",width:u,background:t?void 0:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}}):null,l.jsx("div",{"data-ginger-component":"TimeRail",style:{position:t?void 0:"relative",width:o,height:t?void 0:"100%",background:t?void 0:"var(--ginger-primary-color, #111827)"}})]})}Mr.displayName="Ginger.Current.TimeRail";function Tr({className:e,style:r,height:n=4,unstyled:a=!1}){const t=b.useGingerState(),i=`${Math.round(Math.min(1,Math.max(0,t.bufferedFraction))*100)}%`;return l.jsx("div",{"data-ginger-component":"BufferRail",className:e,style:a?{...r}:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",...r},"aria-hidden":!0,children:l.jsx("div",{"data-ginger-component":"BufferRail",style:{width:i,height:a?void 0:"100%",background:a?void 0:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}})})}Tr.displayName="Ginger.Current.BufferRail";function Er({className:e,style:r,fallback:n,empty:a,children:t}){const i=b.useGingerState(),o=Ae(i);return t?l.jsx("span",{"data-ginger-component":"PlaybackState",className:e,style:r,children:t(o,i)}):l.jsx("span",{"data-ginger-component":"PlaybackState",className:e,style:r,children:o})}Er.displayName="Ginger.Current.PlaybackState";function Sr({className:e,style:r,fallback:n,empty:a,live:t="polite",children:i}){const o=b.useGingerState(),u=o.errorMessage??"";if(!u){const c=a??n??null;return c?l.jsx("span",{"data-ginger-component":"ErrorMessage",className:e,style:r,children:c}):null}return i?l.jsx("span",{"data-ginger-component":"ErrorMessage",className:e,style:r,"aria-live":t,children:i(u,o)}):l.jsx("span",{"data-ginger-component":"ErrorMessage",className:e,style:r,"aria-live":t,children:u})}Sr.displayName="Ginger.Current.ErrorMessage";const Ie=f.createContext(null);function an(){const e=f.useContext(Ie);if(!e)throw new Error("Ginger.Playlist.Track must be used inside <Ginger.Playlist>");return e}function Pr({children:e,unstyled:r=!1,rowStyle:n,renderTrack:a,playOnSelect:t=!0,style:i,...o}){const{tracks:u,currentIndex:c,playTrackAt:s,selectTrackAt:m}=b.useGingerPlayback(),y=r?{...i}:{listStyle:"none",margin:0,padding:0,fontFamily:"var(--ginger-font-family, system-ui, sans-serif)",fontSize:"var(--ginger-font-size, 14px)",color:"var(--ginger-primary-color, #111827)",...i};return e!==void 0?l.jsx(Ie.Provider,{value:{playOnSelect:t},children:l.jsx("ul",{style:y,...o,children:e})}):l.jsx(Ie.Provider,{value:{playOnSelect:t},children:l.jsx("ul",{"data-ginger-component":"Playlist",style:y,...o,children:u.map((h,k)=>{const E=k===c;return l.jsx("li",{children:l.jsx("button",{type:"button",onClick:()=>{t?s(k):m(k)},style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:E?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:r?void 0:"inherit",font:r?void 0:"inherit",cursor:r?void 0:"pointer",padding:r?void 0:"var(--ginger-playlist-row-padding, 6px 8px)",...n},children:a?a(h,k,E):l.jsxs("span",{children:[h.title,h.artist?` — ${h.artist}`:""]})})},`${k}-${K(h)}`)})})})}Pr.displayName="Ginger.Playlist";function Ir({index:e,unstyled:r=!1,className:n,style:a,children:t,liProps:i,onClick:o,...u}){const{playOnSelect:c}=an(),{tracks:s,currentIndex:m,playTrackAt:y,selectTrackAt:v}=b.useGingerPlayback(),h=e===m,k=s[e],E=k!=null?l.jsxs("span",{children:[k.title,k.artist?` — ${k.artist}`:""]}):null;return l.jsx("li",{...i,children:l.jsx("button",{type:"button","aria-current":h?"true":void 0,"data-ginger-active":h||void 0,className:n,style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:h?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:r?void 0:"inherit",font:r?void 0:"inherit",cursor:r?void 0:"pointer",padding:r?void 0:"var(--ginger-playlist-row-padding, 6px 8px)",...a},...u,onClick:p=>{o==null||o(p),!p.defaultPrevented&&(c?y(e):v(e))},children:t??E})})}Ir.displayName="Ginger.Playlist.Track";const on=Object.assign(Pr,{Track:Ir}),un=U("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),sn=U("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),cn=U("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),ln=U("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function Ar({className:e,style:r,fallback:n,empty:a,unstyled:t=!1,imgStyle:i}){var s,m;const o=b.useGingerState(),u=(s=o.playlistMeta)==null?void 0:s.artworkUrl;if(!u){const y=a??n??null;return y?l.jsx("span",{className:e,style:r,children:y}):null}const c=((m=o.playlistMeta)==null?void 0:m.title)??"Playlist artwork";return l.jsx("span",{"data-ginger-component":"Artwork",className:e,style:t?{...r}:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:l.jsx("img",{src:u,alt:c,style:{display:t?void 0:"block",width:t?void 0:"100%",height:t?void 0:"100%",objectFit:t?void 0:"cover",...i}})})}Ar.displayName="Ginger.Queue.Artwork";function X(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):1}function Te(e){return Number.isFinite(e)?Math.min(4,Math.max(.25,e)):1}const D={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null},dn={...D,volume:1,muted:!1,playbackRate:1};function Rr(e){const r=[...e.tracks];let n=P(e.currentIndex??0,r.length),a=null,t=r;return e.isShuffled&&r.length>1&&(a=[...r],t=Oe(r,n),n=0),{tracks:t,currentIndex:n,playbackMode:e.playbackMode??"playlist",isPaused:e.isPaused??!0,isShuffled:!!(e.isShuffled&&t.length>1),repeatMode:e.repeatMode??"off",originalTracks:a,playlistMeta:e.playlistMeta??null,...dn,volume:X(e.volume??1),muted:e.muted??!1,playbackRate:Te(e.playbackRate??1)}}function fn(e,r){switch(r.type){case"INIT":{const{tracks:n,currentIndex:a,playlistMeta:t,isPaused:i,isShuffled:o,repeatMode:u,playbackMode:c,volume:s,muted:m,playbackRate:y}=r.payload;return Rr({tracks:n,currentIndex:a,playlistMeta:t??null,isPaused:i??!0,isShuffled:o??!1,repeatMode:u??"off",playbackMode:c??"playlist",volume:s,muted:m,playbackRate:y})}case"SET_QUEUE":{const{tracks:n,currentIndex:a}=r.payload,t=[...n],i=P(a??e.currentIndex,t.length);return{...e,tracks:t,currentIndex:i,isShuffled:!1,originalTracks:null,...D}}case"INSERT_TRACK":{const n=r.payload.index??e.tracks.length,a=Ye(e.tracks,r.payload.track,n);if(r.payload.autoPlay){const i=P(n,a.length);return{...e,tracks:a,currentIndex:i,isShuffled:!1,originalTracks:null,isPaused:!1,...D}}const t=n<=e.currentIndex?e.currentIndex+1:e.currentIndex;return{...e,tracks:a,isShuffled:!1,originalTracks:null,currentIndex:P(t,a.length)}}case"REMOVE_TRACK":{const n=r.payload.index,a=Br(e.tracks,n),t=n<e.currentIndex?e.currentIndex-1:n===e.currentIndex?Math.min(e.currentIndex,Math.max(0,a.length-1)):e.currentIndex;return{...e,tracks:a,isShuffled:!1,originalTracks:null,currentIndex:P(t,a.length),...n===e.currentIndex?D:{}}}case"MOVE_TRACK":{const{fromIndex:n,toIndex:a}=r.payload,t=$r(e.tracks,n,a);let i=e.currentIndex;return e.currentIndex===n?i=a:n<e.currentIndex&&a>=e.currentIndex?i-=1:n>e.currentIndex&&a<=e.currentIndex&&(i+=1),{...e,tracks:t,isShuffled:!1,originalTracks:null,currentIndex:P(i,t.length)}}case"ADD_NEXT":{const n=Or(e.tracks,e.currentIndex,r.payload.track);return{...e,tracks:n,isShuffled:!1,originalTracks:null}}case"SET_INDEX":{const n=P(r.payload.index,e.tracks.length),a=r.payload.autoPlay,t=a===!0?!1:a===!1?!0:e.isPaused;return{...e,currentIndex:n,...D,isPaused:t}}case"PLAY":return{...e,isPaused:!1};case"PAUSE":return{...e,isPaused:!0};case"TOGGLE_PAUSE":return{...e,isPaused:!e.isPaused};case"SET_REPEAT":return{...e,repeatMode:r.payload};case"CYCLE_REPEAT":return{...e,repeatMode:Hr(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const i=[...e.tracks],o=Oe(i,e.currentIndex);return{...e,isShuffled:!0,originalTracks:i,tracks:o,currentIndex:0}}const n=e.originalTracks?[...e.originalTracks]:[...e.tracks],a=e.tracks[e.currentIndex],t=Vr(n,a);return{...e,isShuffled:!1,originalTracks:null,tracks:n,currentIndex:P(t,n.length)}}case"NEXT":{const n=Qe(e),a=n===e.currentIndex;return{...e,currentIndex:n,...a?{}:D,isPaused:a?e.isPaused:!1}}case"PREV":{const n=Qr(e),a=n===e.currentIndex;return{...e,currentIndex:n,...a?{}:D,isPaused:a?e.isPaused:!1}}case"MEDIA_TIME_UPDATE":return{...e,currentTime:r.payload.currentTime,duration:Number.isFinite(r.payload.duration)?r.payload.duration:e.duration,bufferedFraction:r.payload.bufferedFraction,isBuffering:!1};case"MEDIA_LOADED_METADATA":return{...e,duration:Number.isFinite(r.payload.duration)?r.payload.duration:e.duration,bufferedFraction:r.payload.bufferedFraction,errorMessage:null};case"SET_PLAYLIST_META":return{...e,playlistMeta:r.payload};case"SET_PLAYBACK_MODE":return{...e,playbackMode:r.payload};case"MEDIA_ERROR":return{...e,errorMessage:r.payload.message,isPaused:!0,isBuffering:!1};case"MEDIA_WAITING":return{...e,isBuffering:!0};case"MEDIA_CANPLAY":return{...e,isBuffering:!1,errorMessage:null};case"MEDIA_PLAY":return{...e,isPaused:!1,isBuffering:!1};case"MEDIA_PAUSE":return{...e,isPaused:!0};case"RESET_MEDIA_TIMES":return{...e,currentTime:0,duration:0,bufferedFraction:0};case"MEDIA_SOURCE_CLEARED":return{...e,...D};case"SET_VOLUME":return{...e,volume:X(r.payload)};case"SET_MUTED":return{...e,muted:r.payload};case"TOGGLE_MUTE":return{...e,muted:!e.muted};case"SET_PLAYBACK_RATE":return{...e,playbackRate:Te(r.payload)};case"MEDIA_VOLUME_SYNC":{const{volume:n,muted:a}=r.payload,t=X(n);return t===e.volume&&a===e.muted?e:{...e,volume:t,muted:a}}default:return e}}function Pe(){return typeof navigator>"u"||!("mediaSession"in navigator)?null:navigator.mediaSession}function gn(e,r,n){var c;const a=r.tracks[r.currentIndex],t=a==null?void 0:a.title,i=a==null?void 0:a.artist,o=a==null?void 0:a.album,u=He(a,(c=r.playlistMeta)==null?void 0:c.artworkUrl);f.useEffect(()=>{const s=Pe();!e||!s||(s.metadata=new MediaMetadata({title:t??"Unknown track",artist:i,album:o,artwork:u?[{src:u}]:void 0}))},[e,t,i,o,u]),f.useEffect(()=>{const s=Pe();!e||!s||(s.playbackState=r.isPaused?"paused":"playing")},[e,r.isPaused]),f.useEffect(()=>{const s=Pe();if(!(!e||!s)){try{s.setActionHandler("play",n.play),s.setActionHandler("pause",n.pause),s.setActionHandler("nexttrack",n.next),s.setActionHandler("previoustrack",n.prev),s.setActionHandler("seekto",m=>{typeof m.seekTime=="number"&&Number.isFinite(m.seekTime)&&n.seek(m.seekTime)})}catch{}return()=>{try{s.setActionHandler("play",null),s.setActionHandler("pause",null),s.setActionHandler("nexttrack",null),s.setActionHandler("previoustrack",null),s.setActionHandler("seekto",null)}catch{}}}},[e,n])}const pn={"--ginger-primary-color":"#111827","--ginger-muted-color":"#6b7280","--ginger-font-size":"14px","--ginger-font-family":"system-ui, sans-serif","--ginger-playlist-row-padding":"6px 8px","--ginger-artwork-radius":"6px","--ginger-artwork-bg":"#f3f4f6","--ginger-playlist-active-bg":"rgba(17, 24, 39, 0.06)","--ginger-buffer-color":"rgba(107, 114, 128, 0.35)","--ginger-focus-ring":"0 0 0 2px rgba(59, 130, 246, 0.45)"};function mn({children:e,initialTracks:r=[],initialIndex:n=0,initialPlaylistMeta:a=null,initialShuffle:t=!1,initialRepeatMode:i="off",initialPlaybackMode:o="playlist",initialPaused:u=!0,initialVolume:c=1,initialMuted:s=!1,initialPlaybackRate:m=1,initialStateKey:y,locale:v,mediaSession:h=!1,beforePlay:k,onPlayBlocked:E,persistence:p,hydrateOnMount:S=!1,resumeOnTrackChange:A=!1,unstyled:C=!1,asChild:q=!1,className:z,style:Ee,onTrackChange:W,onPlay:J,onPause:Z,onQueueEnd:ee,onError:re}){var Fe;const F=f.useRef(null),[d,x]=f.useReducer(fn,void 0,()=>Rr({tracks:r,currentIndex:n,playlistMeta:a,isPaused:u,isShuffled:t,repeatMode:i,playbackMode:o,volume:c,muted:s,playbackRate:m})),Ne=f.useRef(d),Se=f.useRef({tracks:r,currentIndex:n,playlistMeta:a,isPaused:u,isShuffled:t,repeatMode:i,playbackMode:o,volume:c,muted:s,playbackRate:m});Se.current={tracks:r,currentIndex:n,playlistMeta:a,isPaused:u,isShuffled:t,repeatMode:i,playbackMode:o,volume:c,muted:s,playbackRate:m};const Y=f.useRef(void 0);f.useEffect(()=>{if(y===void 0){Y.current=void 0;return}if(Y.current===void 0){Y.current=y;return}if(Y.current===y)return;Y.current=y;const g=Se.current;x({type:"INIT",payload:{tracks:g.tracks,currentIndex:g.currentIndex,playlistMeta:g.playlistMeta,isPaused:g.isPaused,isShuffled:g.isShuffled,repeatMode:g.repeatMode,playbackMode:g.playbackMode,volume:g.volume,muted:g.muted,playbackRate:g.playbackRate}})},[y,x]),f.useEffect(()=>{Ne.current=d},[d]);const _e=d.tracks[d.currentIndex]??null;f.useEffect(()=>{W==null||W(_e,d.currentIndex)},[_e,d.currentIndex,W]),f.useEffect(()=>{d.errorMessage&&(re==null||re(d.errorMessage))},[d.errorMessage,re]);const ne=f.useRef(void 0);f.useEffect(()=>{if(ne.current===void 0){ne.current=d.isPaused;return}ne.current!==d.isPaused&&(d.isPaused?Z==null||Z():J==null||J()),ne.current=d.isPaused},[d.isPaused,Z,J]);const _=f.useCallback(()=>{x({type:"PLAY"})},[]),L=f.useCallback(()=>{var g;x({type:"PAUSE"}),(g=F.current)==null||g.pause()},[]),te=f.useCallback(()=>{d.isPaused?_():L()},[L,_,d.isPaused]),w=f.useCallback(g=>{const M=F.current;M&&Number.isFinite(g)&&(M.currentTime=Math.max(0,g))},[]),ae=f.useCallback(g=>{x({type:"SET_VOLUME",payload:X(g)})},[]),ie=f.useCallback(g=>{x({type:"SET_MUTED",payload:g})},[]),oe=f.useCallback(()=>{x({type:"TOGGLE_MUTE"})},[]),ue=f.useCallback(g=>{x({type:"SET_PLAYBACK_RATE",payload:Te(g)})},[]),B=f.useCallback(()=>{x({type:"NEXT"})},[]),$=f.useCallback(()=>{x({type:"PREV"})},[]),se=f.useCallback(g=>{x({type:"SET_REPEAT",payload:g})},[]),ce=f.useCallback(()=>{x({type:"CYCLE_REPEAT"})},[]),le=f.useCallback(()=>{x({type:"TOGGLE_SHUFFLE"})},[]),de=f.useCallback((g,M)=>{x({type:"SET_QUEUE",payload:{tracks:g,currentIndex:M}})},[]),fe=f.useCallback((g,M,T)=>{x({type:"INSERT_TRACK",payload:{track:g,index:M,autoPlay:T}})},[]),ge=f.useCallback(g=>{x({type:"REMOVE_TRACK",payload:{index:g}})},[]),pe=f.useCallback((g,M)=>{x({type:"MOVE_TRACK",payload:{fromIndex:g,toIndex:M}})},[]),me=f.useCallback(g=>{x({type:"ADD_NEXT",payload:{track:g}})},[]),ye=f.useCallback(g=>{x({type:"SET_INDEX",payload:{index:g,autoPlay:!0}})},[]),be=f.useCallback(g=>{x({type:"SET_INDEX",payload:{index:g,autoPlay:!1}})},[]),xe=f.useCallback(g=>{x({type:"SET_PLAYLIST_META",payload:g})},[]),he=f.useCallback(g=>{x({type:"SET_PLAYBACK_MODE",payload:g})},[]),ve=f.useCallback(g=>{x({type:"INIT",payload:g})},[]);f.useEffect(()=>{if(!p||!S)return;const g=p.get("ginger:volume"),M=p.get("ginger:muted"),T=p.get("ginger:playbackRate"),j=p.get("ginger:repeatMode"),Me=p.get("ginger:currentIndex"),G=Se.current;x({type:"INIT",payload:{tracks:G.tracks,playlistMeta:G.playlistMeta,isPaused:G.isPaused,isShuffled:G.isShuffled,playbackMode:G.playbackMode,currentIndex:typeof Me=="number"?Me:G.currentIndex,repeatMode:j==="off"||j==="all"||j==="one"?j:G.repeatMode,volume:typeof g=="number"?g:G.volume,muted:typeof M=="boolean"?M:G.muted,playbackRate:typeof T=="number"?T:G.playbackRate}})},[S,p]),f.useEffect(()=>{p&&(p.set("ginger:volume",d.volume),p.set("ginger:muted",d.muted),p.set("ginger:playbackRate",d.playbackRate),p.set("ginger:repeatMode",d.repeatMode),p.set("ginger:currentIndex",d.currentIndex))},[p,d.volume,d.muted,d.playbackRate,d.repeatMode,d.currentIndex]),f.useEffect(()=>{if(!p||!A)return;const g=d.tracks[d.currentIndex];if(!g)return;const M=`ginger:resume:${K(g)}`,T=p.get(M);typeof T=="number"&&Number.isFinite(T)&&w(T)},[p,A,d.currentIndex,d.tracks,w]),f.useEffect(()=>{if(!p||!A)return;const g=d.tracks[d.currentIndex];if(!g||!(d.currentTime>=0))return;const M=`ginger:resume:${K(g)}`,T=setTimeout(()=>p.set(M,d.currentTime),250);return()=>clearTimeout(T)},[p,A,d.currentIndex,d.tracks,d.currentTime]);const Gr=(Fe=d.tracks[d.currentIndex])==null?void 0:Fe.fileUrl;f.useEffect(()=>{const g=F.current;if(!g)return;if(d.isPaused){g.pause();return}let M=!1;return(async()=>{if(k){let T=!1;try{T=await k()}catch(j){const Me=j instanceof Error?j.message:"beforePlay rejected";x({type:"MEDIA_ERROR",payload:{message:Me}});return}if(!T){M||(x({type:"PAUSE"}),E==null||E());return}}M||g.play().catch(T=>{const j=T instanceof Error?T.message:typeof T=="string"?T:"Playback failed (e.g. autoplay blocked or unavailable source)";x({type:"MEDIA_ERROR",payload:{message:j}})})})(),()=>{M=!0}},[k,Gr,E,d.isPaused]);const ke=f.useCallback(()=>{const g=Yr(Ne.current);if(g.kind==="replay_same"){const T=F.current;T&&(T.currentTime=0),x({type:"PLAY"});return}if(g.kind==="stop"){x({type:"PAUSE"}),ee==null||ee();return}const M=g.nextIndex;x({type:"SET_INDEX",payload:{index:M,autoPlay:!0}})},[ee]),Cr=f.useMemo(()=>({play:_,pause:L,next:B,prev:$,seek:w}),[_,L,B,$,w]);gn(!!h,d,Cr);const Le=v!=null&&v.seek&&/[\u0590-\u08FF]/.test(v.seek)?"rtl":"ltr",jr=f.useMemo(()=>({state:d,dispatch:x,audioRef:F,notifyEnded:ke,init:ve,play:_,pause:L,togglePlayPause:te,seek:w,setVolume:ae,setMuted:ie,toggleMute:oe,setPlaybackRate:ue,next:B,prev:$,setRepeatMode:se,cycleRepeat:ce,toggleShuffle:le,setQueue:de,insertTrackAt:fe,removeTrackAt:ge,moveTrack:pe,enqueueNext:me,playTrackAt:ye,selectTrackAt:be,setPlaylistMeta:xe,setPlaybackMode:he}),[ce,x,ve,B,ke,L,_,ye,fe,ge,pe,me,be,$,w,ie,ue,de,se,xe,he,ae,d,oe,te,le]),Nr=f.useMemo(()=>({tracks:d.tracks,currentIndex:d.currentIndex,isPaused:d.isPaused,isShuffled:d.isShuffled,repeatMode:d.repeatMode,originalTracks:d.originalTracks,playlistMeta:d.playlistMeta,init:ve,play:_,pause:L,togglePlayPause:te,next:B,prev:$,setRepeatMode:se,cycleRepeat:ce,toggleShuffle:le,playbackMode:d.playbackMode,setQueue:de,insertTrackAt:fe,removeTrackAt:ge,moveTrack:pe,enqueueNext:me,playTrackAt:ye,selectTrackAt:be,setPlaylistMeta:xe,setPlaybackMode:he,dispatch:x}),[d.tracks,d.currentIndex,d.isPaused,d.isShuffled,d.repeatMode,d.playbackMode,d.originalTracks,d.playlistMeta,ve,_,L,te,B,$,se,ce,le,de,fe,ge,pe,me,ye,be,xe,he,x]),_r=f.useMemo(()=>({currentTime:d.currentTime,duration:d.duration,bufferedFraction:d.bufferedFraction,isBuffering:d.isBuffering,errorMessage:d.errorMessage,volume:d.volume,muted:d.muted,playbackRate:d.playbackRate,seek:w,setVolume:ae,setMuted:ie,toggleMute:oe,setPlaybackRate:ue,audioRef:F,notifyEnded:ke,dispatch:x}),[d.currentTime,d.duration,d.bufferedFraction,d.isBuffering,d.errorMessage,d.volume,d.muted,d.playbackRate,w,ae,ie,oe,ue,F,ke,x]),we=Ae(d),De=f.useMemo(()=>C?Ee:{...pn,...Ee},[Ee,C]),R=f.useMemo(()=>({className:z,style:De,"data-ginger-playback":we,dir:Le}),[z,De,we,Le]),Lr=f.useMemo(()=>{if(!q)return l.jsx("div",{className:R.className,style:R.style,"data-ginger-playback":R["data-ginger-playback"],dir:R.dir,children:e});const g=f.Children.only(e);if(!f.isValidElement(g))throw new Error("Ginger.Provider asChild expects a single React element child.");const M=g,T=M.props.style;return f.cloneElement(M,{className:yn(M.props.className,R.className),style:T&&typeof T=="object"?{...T,...R.style}:R.style,"data-ginger-playback":R["data-ginger-playback"],dir:R.dir})},[q,e,R]);return l.jsx(Ur,{locale:v,children:l.jsx(b.GingerPlaybackContext.Provider,{value:Nr,children:l.jsx(b.GingerMediaContext.Provider,{value:_r,children:l.jsx(Be.Provider,{value:jr,children:Lr})})})})}function yn(e,r){const n=[e,r].filter(Boolean).join(" ");return n===""?void 0:n}const bn={Provider:mn,Player:Dr,Current:{Title:qr,Artist:zr,Album:Wr,Description:Jr,Copyright:Zr,Genre:en,Label:rn,Isrc:nn,TrackNumber:tn,Year:sr,Lyrics:cr,LyricsSynced:Ge,Chapters:Ce,FileUrl:gr,Artwork:pr,QueueIndex:mr,QueueLength:yr,QueuePosition:br,Elapsed:xr,Duration:hr,Remaining:vr,Progress:kr,TimeRail:Mr,BufferRail:Tr,PlaybackState:Er,ErrorMessage:Sr},Queue:{Title:un,Subtitle:sn,Description:cn,Copyright:ln,Artwork:Ar},Control:{PlayPause:Ze,Repeat:er,Next:rr,Previous:nr,Shuffle:tr,SeekBar:ar,Volume:ir,Mute:or,PlaybackRate:ur},Playlist:on};exports.Chapters=Ce;exports.Ginger=bn;exports.LyricsSynced=Ge;exports.clampPlaybackRate=Te;exports.clampVolume=X;exports.computeNextIndex=Qe;exports.defaultGingerLocale=Q;exports.derivePlaybackUiState=Ae;exports.effectiveDuration=O;exports.effectiveRemaining=Ke;exports.getCurrentTrack=N;exports.parseLrc=lr;exports.progressFraction=Re;exports.resolvedAlbumLine=qe;exports.resolvedArtwork=Xe;exports.useGingerChapters=fr;exports.useGingerLocale=I;exports.useGingerLyricsSync=dr;exports.usePlayPauseBinding=Je;exports.useSeekBarBinding=ze;exports.useVolumeSlider=We;
|
|
2
|
+
//# sourceMappingURL=ginger-CVwaVLpC.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ginger-CVwaVLpC.cjs","sources":["../src/context/GingerContext.tsx","../src/audio/GingerPlayer.tsx","../src/context/GingerLocaleContext.tsx","../src/internal/formatTime.ts","../src/core/queue.ts","../src/core/transitions.ts","../src/internal/selectors.ts","../src/hooks/useControlBindings.ts","../src/components/controls/Controls.tsx","../src/components/current/createTextDisplay.tsx","../src/components/current/texts.ts","../src/components/current/Year.tsx","../src/components/current/Lyrics.tsx","../src/internal/lyrics.ts","../src/hooks/useGingerLyricsSync.ts","../src/components/current/LyricsSynced.tsx","../src/hooks/useGingerChapters.ts","../src/components/current/Chapters.tsx","../src/components/current/FileUrl.tsx","../src/components/current/Artwork.tsx","../src/components/current/QueueMeta.tsx","../src/components/current/Time.tsx","../src/components/current/Playback.tsx","../src/components/playlist/GingerPlaylist.tsx","../src/components/queue/QueueDisplay.tsx","../src/core/playbackReducer.ts","../src/media/useMediaSession.ts","../src/context/GingerProvider.tsx","../src/ginger.ts"],"sourcesContent":["import { type Dispatch, type MutableRefObject, createContext, useContext } from \"react\";\nimport type {\n GingerAction,\n GingerInitPayload,\n GingerState,\n PlaybackMode,\n PlaylistMeta,\n RepeatMode,\n Track,\n} from \"../types\";\n\nexport type GingerContextValue = {\n state: GingerState;\n dispatch: Dispatch<GingerAction>;\n audioRef: MutableRefObject<HTMLAudioElement | null>;\n notifyEnded: () => void;\n /** Full reset to match `createInitialState` / provider `initial*` props. */\n init: (payload: GingerInitPayload) => void;\n play: () => void;\n pause: () => void;\n togglePlayPause: () => void;\n seek: (timeSeconds: number) => void;\n setVolume: (volume: number) => void;\n setMuted: (muted: boolean) => void;\n toggleMute: () => void;\n setPlaybackRate: (rate: number) => void;\n next: () => void;\n prev: () => void;\n setRepeatMode: (mode: RepeatMode) => void;\n cycleRepeat: () => void;\n toggleShuffle: () => void;\n setQueue: (tracks: Track[], currentIndex?: number) => void;\n insertTrackAt: (track: Track, index?: number, autoPlay?: boolean) => void;\n removeTrackAt: (index: number) => void;\n moveTrack: (fromIndex: number, toIndex: number) => void;\n enqueueNext: (track: Track) => void;\n playTrackAt: (index: number) => void;\n selectTrackAt: (index: number) => void;\n setPlaylistMeta: (meta: PlaylistMeta | null) => void;\n setPlaybackMode: (mode: PlaybackMode) => void;\n};\n\nconst GingerContext = createContext<GingerContextValue | null>(null);\n\nexport function useGingerContext(): GingerContextValue {\n const ctx = useContext(GingerContext);\n if (!ctx) throw new Error(\"Ginger components must be used within <Ginger.Provider>\");\n return ctx;\n}\n\nexport { GingerContext };\n","import { type AudioHTMLAttributes, type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { useGingerContext } from \"../context/GingerContext\";\n\nexport type GingerPlayerProps = {\n className?: string;\n style?: CSSProperties;\n preload?: AudioHTMLAttributes<HTMLAudioElement>[\"preload\"];\n crossOrigin?: AudioHTMLAttributes<HTMLAudioElement>[\"crossOrigin\"];\n respectReducedMotion?: boolean;\n};\n\nfunction readBufferedFraction(el: HTMLAudioElement): number {\n const { buffered, duration } = el;\n if (!(duration > 0) || buffered.length === 0) return 0;\n return Math.min(1, buffered.end(buffered.length - 1) / duration);\n}\n\nexport function GingerPlayer({\n className,\n style,\n preload = \"metadata\",\n crossOrigin,\n respectReducedMotion = false,\n}: GingerPlayerProps) {\n const { audioRef, dispatch, state, notifyEnded } = useGingerContext();\n const url = state.tracks[state.currentIndex]?.fileUrl ?? \"\";\n const lastTimeSnapshotRef = useRef({\n currentTime: -1,\n duration: -1,\n bufferedFraction: -1,\n });\n /** Avoid MEDIA_SOURCE_CLEARED on first paint with an empty queue (no prior media). */\n const lastActiveUrlRef = useRef(\"\");\n\n const [reducedMotion, setReducedMotion] = useState(false);\n\n useEffect(() => {\n if (!respectReducedMotion || typeof window === \"undefined\") return;\n const mql = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const sync = () => setReducedMotion(mql.matches);\n sync();\n mql.addEventListener(\"change\", sync);\n return () => mql.removeEventListener(\"change\", sync);\n }, [respectReducedMotion]);\n\n const syncTime = (el: HTMLAudioElement, force = false) => {\n const next = {\n currentTime: el.currentTime,\n duration: el.duration,\n bufferedFraction: readBufferedFraction(el),\n };\n const prev = lastTimeSnapshotRef.current;\n const timeThreshold = reducedMotion ? 0.5 : 0.25;\n const changedEnough =\n Math.abs(next.currentTime - prev.currentTime) >= timeThreshold ||\n Math.abs(next.duration - prev.duration) >= 0.01 ||\n Math.abs(next.bufferedFraction - prev.bufferedFraction) >= 0.01;\n if (!force && !changedEnough) return;\n lastTimeSnapshotRef.current = next;\n dispatch({\n type: \"MEDIA_TIME_UPDATE\",\n payload: next,\n });\n };\n\n useEffect(() => {\n const el = audioRef.current;\n if (!el) return;\n el.volume = state.volume;\n el.muted = state.muted;\n }, [audioRef, state.volume, state.muted]);\n\n useEffect(() => {\n const el = audioRef.current;\n if (!el) return;\n if (!url) {\n el.removeAttribute(\"src\");\n lastTimeSnapshotRef.current = { currentTime: -1, duration: -1, bufferedFraction: -1 };\n if (lastActiveUrlRef.current !== \"\") {\n dispatch({ type: \"MEDIA_SOURCE_CLEARED\" });\n }\n lastActiveUrlRef.current = \"\";\n return;\n }\n if (el.getAttribute(\"src\") !== url) {\n el.src = url;\n el.load();\n lastTimeSnapshotRef.current = { currentTime: -1, duration: -1, bufferedFraction: -1 };\n }\n lastActiveUrlRef.current = url;\n }, [audioRef, dispatch, state.currentIndex, state.tracks, url]);\n\n useEffect(() => {\n const el = audioRef.current;\n if (!el) return;\n // Browsers reset playbackRate to 1.0 when source changes + load() runs.\n el.playbackRate = state.playbackRate;\n }, [audioRef, state.playbackRate, url]);\n\n return (\n <audio\n data-ginger-component=\"Player\"\n ref={audioRef}\n className={className}\n style={style}\n preload={preload}\n crossOrigin={crossOrigin}\n controls={false}\n playsInline\n onTimeUpdate={(e) => {\n syncTime(e.currentTarget);\n }}\n onLoadedMetadata={(e) => {\n const el = e.currentTarget;\n lastTimeSnapshotRef.current = { currentTime: -1, duration: -1, bufferedFraction: -1 };\n dispatch({\n type: \"MEDIA_LOADED_METADATA\",\n payload: {\n duration: el.duration,\n bufferedFraction: readBufferedFraction(el),\n },\n });\n }}\n onSeeking={(e) => syncTime(e.currentTarget, true)}\n onSeeked={(e) => syncTime(e.currentTarget, true)}\n onEnded={() => notifyEnded()}\n onPlay={() => dispatch({ type: \"MEDIA_PLAY\" })}\n onPause={() => dispatch({ type: \"MEDIA_PAUSE\" })}\n onWaiting={() => dispatch({ type: \"MEDIA_WAITING\" })}\n onCanPlay={() => dispatch({ type: \"MEDIA_CANPLAY\" })}\n onProgress={(e) => syncTime(e.currentTarget, true)}\n onVolumeChange={(e) => {\n const el = e.currentTarget;\n dispatch({\n type: \"MEDIA_VOLUME_SYNC\",\n payload: { volume: el.volume, muted: el.muted },\n });\n }}\n onError={() => {\n const el = audioRef.current;\n const code = el?.error?.code;\n const message =\n code === 1\n ? \"MEDIA_ERR_ABORTED\"\n : code === 2\n ? \"MEDIA_ERR_NETWORK\"\n : code === 3\n ? \"MEDIA_ERR_DECODE\"\n : code === 4\n ? \"MEDIA_ERR_SRC_NOT_SUPPORTED\"\n : \"MEDIA_ERR_UNKNOWN\";\n dispatch({ type: \"MEDIA_ERROR\", payload: { message } });\n }}\n />\n );\n}\n","import { type ReactNode, createContext, useContext } from \"react\";\nimport type { GingerLocaleMessages } from \"../types\";\n\nexport const defaultGingerLocale: GingerLocaleMessages = {\n seek: \"Seek\",\n volume: \"Volume\",\n playbackSpeed: \"Playback speed\",\n chaptersList: \"Chapters\",\n syncedLyricsList: \"Synced lyrics\",\n nextTrack: \"Next track\",\n previousTrack: \"Previous track\",\n shuffle: \"Shuffle\",\n mute: \"Mute\",\n unmute: \"Unmute\",\n play: \"Play\",\n pause: \"Pause\",\n repeat: {\n off: \"Repeat off\",\n all: \"Repeat all\",\n one: \"Repeat one\",\n },\n playbackRateNormal: \"1× normal\",\n playbackRateTimes: (rate) => `${rate}×`,\n};\n\nfunction mergeLocale(partial?: Partial<GingerLocaleMessages>): GingerLocaleMessages {\n if (!partial) return defaultGingerLocale;\n return {\n ...defaultGingerLocale,\n ...partial,\n repeat: { ...defaultGingerLocale.repeat, ...partial.repeat },\n };\n}\n\nconst GingerLocaleContext = createContext<GingerLocaleMessages>(defaultGingerLocale);\n\nexport function GingerLocaleProvider({\n locale,\n children,\n}: {\n locale?: Partial<GingerLocaleMessages>;\n children: ReactNode;\n}) {\n const value = mergeLocale(locale);\n return <GingerLocaleContext.Provider value={value}>{children}</GingerLocaleContext.Provider>;\n}\n\nexport function useGingerLocale(): GingerLocaleMessages {\n return useContext(GingerLocaleContext);\n}\n","export function formatMmSs(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return \"0:00\";\n const s = Math.floor(seconds % 60);\n const m = Math.floor(seconds / 60);\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n}\n","import type { Track } from \"../types\";\n\nexport function clampIndex(index: number, length: number): number {\n if (length <= 0) return 0;\n return Math.max(0, Math.min(length - 1, index));\n}\n\nexport function shuffleWithAnchor(tracks: Track[], anchorIndex: number): Track[] {\n if (tracks.length <= 1) return [...tracks];\n const anchor = tracks[anchorIndex];\n if (!anchor) return [...tracks];\n const rest = tracks.filter((_, i) => i !== anchorIndex);\n for (let i = rest.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [rest[i], rest[j]] = [rest[j]!, rest[i]!];\n }\n return [anchor, ...rest];\n}\n\nexport function trackIdentity(track: Track | null | undefined): string {\n if (!track) return \"\";\n return track.id != null && track.id !== \"\" ? `id:${track.id}` : `file:${track.fileUrl}`;\n}\n\nexport function findIndexByTrackIdentity(\n tracks: Track[],\n target: Track | null | undefined,\n): number {\n if (!target) return 0;\n const byRef = tracks.findIndex((t) => t === target);\n if (byRef !== -1) return byRef;\n\n const identity = trackIdentity(target);\n if (!identity) return 0;\n\n const matches: number[] = [];\n for (let i = 0; i < tracks.length; i += 1) {\n if (trackIdentity(tracks[i]) === identity) matches.push(i);\n }\n if (matches.length === 0) return 0;\n if (matches.length === 1) return matches[0]!;\n\n const nodeEnv =\n typeof globalThis !== \"undefined\" && \"process\" in globalThis\n ? (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV\n : undefined;\n if (nodeEnv != null && nodeEnv !== \"production\") {\n console.warn(\n \"[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match.\",\n );\n }\n return matches[0]!;\n}\n\nexport function insertTrackAt(tracks: Track[], track: Track, index?: number): Track[] {\n const next = [...tracks];\n const at = Math.max(0, Math.min(next.length, index ?? next.length));\n next.splice(at, 0, track);\n return next;\n}\n\nexport function removeTrackAt(tracks: Track[], index: number): Track[] {\n if (index < 0 || index >= tracks.length) return [...tracks];\n const next = [...tracks];\n next.splice(index, 1);\n return next;\n}\n\nexport function moveTrack(tracks: Track[], fromIndex: number, toIndex: number): Track[] {\n if (\n fromIndex === toIndex ||\n fromIndex < 0 ||\n fromIndex >= tracks.length ||\n toIndex < 0 ||\n toIndex >= tracks.length\n ) {\n return [...tracks];\n }\n const next = [...tracks];\n const [item] = next.splice(fromIndex, 1);\n if (!item) return [...tracks];\n next.splice(toIndex, 0, item);\n return next;\n}\n\nexport function addNextTrack(tracks: Track[], currentIndex: number, track: Track): Track[] {\n return insertTrackAt(tracks, track, Math.max(0, Math.min(tracks.length, currentIndex + 1)));\n}\n","import type { GingerState, RepeatMode, Track } from \"../types\";\nimport { clampIndex } from \"./queue\";\n\n/** Fields used by next/prev/ended navigation; avoids coupling helpers to full `GingerState`. */\nexport type GingerPlaybackNavigationSlice = Pick<\n GingerState,\n \"tracks\" | \"currentIndex\" | \"repeatMode\" | \"playbackMode\"\n>;\n\nexport type EndedTransition =\n | { kind: \"replay_same\" }\n | { kind: \"advance\"; nextIndex: number }\n | { kind: \"wrap\"; nextIndex: number }\n | { kind: \"stop\"; nextIndex: number };\n\nexport function computeEndedTransition(state: GingerPlaybackNavigationSlice): EndedTransition {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return { kind: \"stop\", nextIndex: 0 };\n if (repeatMode === \"one\") return { kind: \"replay_same\" };\n if (playbackMode === \"single\") return { kind: \"stop\", nextIndex: clampIndex(currentIndex, len) };\n if (currentIndex < len - 1) return { kind: \"advance\", nextIndex: currentIndex + 1 };\n if (repeatMode === \"all\") return { kind: \"wrap\", nextIndex: 0 };\n return { kind: \"stop\", nextIndex: clampIndex(currentIndex, len) };\n}\n\nexport function computeNextIndex(state: GingerPlaybackNavigationSlice): number {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return 0;\n if (playbackMode === \"single\") return clampIndex(currentIndex, len);\n if (currentIndex < len - 1) return currentIndex + 1;\n if (repeatMode === \"all\") return 0;\n return clampIndex(currentIndex, len);\n}\n\nexport function computePrevIndex(state: GingerPlaybackNavigationSlice): number {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return 0;\n if (playbackMode === \"single\") return clampIndex(currentIndex, len);\n if (currentIndex > 0) return currentIndex - 1;\n if (repeatMode === \"all\") return len - 1;\n return 0;\n}\n\nexport function cycleRepeatMode(mode: RepeatMode): RepeatMode {\n if (mode === \"off\") return \"all\";\n if (mode === \"all\") return \"one\";\n return \"off\";\n}\n\nexport function resolveArtworkUrl(\n track: Track | null,\n playlistArtwork?: string | null,\n): string | undefined {\n return track?.artworkUrl ?? playlistArtwork ?? undefined;\n}\n\nexport function resolveAlbumLine(\n track: Track | null,\n playlistSubtitle?: string | null,\n): string | undefined {\n return track?.album ?? playlistSubtitle ?? undefined;\n}\n","import { resolveAlbumLine, resolveArtworkUrl } from \"../core/transitions\";\nimport type { GingerState, PlaybackUiState, Track } from \"../types\";\n\nexport function getCurrentTrack(state: GingerState): Track | null {\n const t = state.tracks[state.currentIndex];\n return t ?? null;\n}\n\nexport function derivePlaybackUiState(state: GingerState): PlaybackUiState {\n if (state.errorMessage) return \"error\";\n if (state.tracks.length === 0) return \"idle\";\n if (state.isBuffering) return \"loading\";\n if (!state.isPaused) return \"playing\";\n if (\n Number.isFinite(state.duration) &&\n state.duration > 0 &&\n state.currentTime >= state.duration - 0.05\n ) {\n return \"ended\";\n }\n return \"paused\";\n}\n\nexport function effectiveDuration(state: GingerState): number {\n const d = state.duration;\n if (Number.isFinite(d) && d > 0) return d;\n const hint = state.tracks[state.currentIndex]?.durationSeconds;\n if (typeof hint === \"number\" && Number.isFinite(hint) && hint > 0) return hint;\n return 0;\n}\n\nexport function effectiveRemaining(state: GingerState): number {\n const dur = effectiveDuration(state);\n const rem = dur - state.currentTime;\n return Number.isFinite(rem) ? Math.max(0, rem) : 0;\n}\n\nexport function progressFraction(state: GingerState): number {\n const dur = effectiveDuration(state);\n if (!(dur > 0)) return 0;\n return Math.min(1, Math.max(0, state.currentTime / dur));\n}\n\nexport function resolvedArtwork(state: GingerState): string | undefined {\n const track = getCurrentTrack(state);\n return resolveArtworkUrl(track, state.playlistMeta?.artworkUrl);\n}\n\nexport function resolvedAlbumLine(state: GingerState): string | undefined {\n const track = getCurrentTrack(state);\n return resolveAlbumLine(track, state.playlistMeta?.subtitle);\n}\n","import { useMemo } from \"react\";\nimport type { FormEvent } from \"react\";\nimport { useGingerLocale } from \"../context/GingerLocaleContext\";\nimport {\n gingerStateFromContextValues,\n useGingerMedia,\n useGingerPlayback,\n} from \"../context/GingerSplitContexts\";\nimport { formatMmSs } from \"../internal/formatTime\";\nimport { effectiveDuration } from \"../internal/selectors\";\nimport type { GingerState } from \"../types\";\n\nexport type SeekBarBinding = {\n state: GingerState;\n value: number;\n min: number;\n max: number;\n step: \"any\";\n ariaValueText: string;\n ariaLabel: string;\n onSeekInput: (e: FormEvent<HTMLInputElement>) => void;\n onSeekChange: (e: FormEvent<HTMLInputElement>) => void;\n};\n\n/** Headless seek slider: bind return value to `<input type=\"range\" />` or your own component. */\nexport function useSeekBarBinding(): SeekBarBinding {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n const locale = useGingerLocale();\n const state = useMemo(() => gingerStateFromContextValues(pb, md), [pb, md]);\n const duration = effectiveDuration(state);\n const value = duration > 0 ? state.currentTime : 0;\n const numericValue = Number.isFinite(value) ? value : 0;\n const ariaValueText =\n duration > 0\n ? `${formatMmSs(numericValue)} of ${formatMmSs(duration)}`\n : formatMmSs(numericValue);\n\n const onSeekInput = (e: FormEvent<HTMLInputElement>) => {\n md.seek(Number(e.currentTarget.value));\n };\n\n return {\n state,\n value: numericValue,\n min: 0,\n max: duration > 0 ? duration : 1,\n step: \"any\",\n ariaValueText,\n ariaLabel: locale.seek,\n onSeekInput,\n onSeekChange: onSeekInput,\n };\n}\n\nexport type VolumeBinding = {\n state: GingerState;\n value: number;\n min: number;\n max: number;\n step: \"any\";\n ariaValueText: string;\n ariaLabel: string;\n onVolumeInput: (e: FormEvent<HTMLInputElement>) => void;\n onVolumeChange: (e: FormEvent<HTMLInputElement>) => void;\n};\n\n/** Headless volume slider. */\nexport function useVolumeSlider(): VolumeBinding {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n const locale = useGingerLocale();\n const state = useMemo(() => gingerStateFromContextValues(pb, md), [pb, md]);\n\n const onVolumeInput = (e: FormEvent<HTMLInputElement>) => {\n md.setVolume(Number(e.currentTarget.value));\n };\n\n return {\n state,\n value: state.volume,\n min: 0,\n max: 1,\n step: \"any\",\n ariaValueText: `${Math.round(state.volume * 100)}%`,\n ariaLabel: locale.volume,\n onVolumeInput,\n onVolumeChange: onVolumeInput,\n };\n}\n\nexport type PlayPauseBinding = {\n isPaused: boolean;\n toggle: () => void;\n /** Resolved aria label for the button’s *next* action (play vs pause). */\n ariaLabel: string;\n};\n\n/** Headless play/pause control; use with `playAriaLabel` / `pauseAriaLabel` from locale or custom strings. */\nexport function usePlayPauseBinding(options?: {\n playAriaLabel?: string;\n pauseAriaLabel?: string;\n}): PlayPauseBinding {\n const pb = useGingerPlayback();\n const locale = useGingerLocale();\n const playL = options?.playAriaLabel ?? locale.play;\n const pauseL = options?.pauseAriaLabel ?? locale.pause;\n return {\n isPaused: pb.isPaused,\n toggle: pb.togglePlayPause,\n ariaLabel: pb.isPaused ? playL : pauseL,\n };\n}\n","import { useMemo } from \"react\";\nimport type {\n ButtonHTMLAttributes,\n CSSProperties,\n InputHTMLAttributes,\n ReactNode,\n SelectHTMLAttributes,\n} from \"react\";\nimport { useGingerLocale } from \"../../context/GingerLocaleContext\";\nimport {\n useGingerMedia,\n useGingerPlayback,\n} from \"../../context/GingerSplitContexts\";\nimport {\n usePlayPauseBinding,\n useSeekBarBinding,\n useVolumeSlider,\n} from \"../../hooks/useControlBindings\";\n\nexport type PlayPauseProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Optional labels; still headless—defaults are text for a11y */\n playLabel?: ReactNode;\n pauseLabel?: ReactNode;\n /** Screen-reader label when paused (playing would start); defaults to match `playLabel` when it is a string */\n playAriaLabel?: string;\n /** Screen-reader label when playing (action would pause); defaults to match `pauseLabel` when it is a string */\n pauseAriaLabel?: string;\n children?: ReactNode;\n};\n\nexport function PlayPause({\n playLabel = \"Play\",\n pauseLabel = \"Pause\",\n playAriaLabel,\n pauseAriaLabel,\n children,\n type = \"button\",\n onClick,\n ...rest\n}: PlayPauseProps) {\n const locale = useGingerLocale();\n const defaultPlayAria =\n typeof playLabel === \"string\" ? playLabel : locale.play;\n const defaultPauseAria =\n typeof pauseLabel === \"string\" ? pauseLabel : locale.pause;\n const b = usePlayPauseBinding({\n playAriaLabel: playAriaLabel ?? defaultPlayAria,\n pauseAriaLabel: pauseAriaLabel ?? defaultPauseAria,\n });\n return (\n <button\n data-ginger-component=\"PlayPause\"\n {...rest}\n type={type}\n aria-label={b.ariaLabel}\n onClick={(e) => {\n b.toggle();\n onClick?.(e);\n }}\n >\n {children ?? (b.isPaused ? playLabel : pauseLabel)}\n </button>\n );\n}\n\nPlayPause.displayName = \"Ginger.Control.PlayPause\";\n\nexport type RepeatProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n children?: ReactNode;\n};\n\nexport function Repeat({\n type = \"button\",\n ariaLabel,\n onClick,\n children,\n ...rest\n}: RepeatProps) {\n const { repeatMode, cycleRepeat } = useGingerPlayback();\n const locale = useGingerLocale();\n const label = locale.repeat[repeatMode];\n return (\n <button\n data-ginger-component=\"Repeat\"\n {...rest}\n type={type}\n aria-label={ariaLabel ?? label}\n onClick={(e) => {\n cycleRepeat();\n onClick?.(e);\n }}\n >\n {children ?? label}\n </button>\n );\n}\n\nRepeat.displayName = \"Ginger.Control.Repeat\";\n\nexport type NextProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n};\nexport function Next({\n type = \"button\",\n children = \"Next\",\n ariaLabel,\n onClick,\n ...rest\n}: NextProps) {\n const { next } = useGingerPlayback();\n const locale = useGingerLocale();\n return (\n <button\n data-ginger-component=\"Next\"\n {...rest}\n type={type}\n aria-label={ariaLabel ?? locale.nextTrack}\n onClick={(e) => {\n next();\n onClick?.(e);\n }}\n >\n {children ?? locale.nextTrack}\n </button>\n );\n}\nNext.displayName = \"Ginger.Control.Next\";\n\nexport type PreviousProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n};\nexport function Previous({\n type = \"button\",\n children = \"Previous\",\n ariaLabel,\n onClick,\n ...rest\n}: PreviousProps) {\n const { prev } = useGingerPlayback();\n const locale = useGingerLocale();\n return (\n <button\n data-ginger-component=\"Previous\"\n {...rest}\n type={type}\n aria-label={ariaLabel ?? locale.previousTrack}\n onClick={(e) => {\n prev();\n onClick?.(e);\n }}\n >\n {children}\n </button>\n );\n}\nPrevious.displayName = \"Ginger.Control.Previous\";\n\nexport type ShuffleProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n};\nexport function Shuffle({\n type = \"button\",\n children = \"Shuffle\",\n ariaLabel,\n onClick,\n ...rest\n}: ShuffleProps) {\n const { isShuffled, toggleShuffle } = useGingerPlayback();\n const locale = useGingerLocale();\n return (\n <button\n data-ginger-component=\"Shuffle\"\n {...rest}\n type={type}\n aria-pressed={isShuffled}\n aria-label={ariaLabel ?? locale.shuffle}\n onClick={(e) => {\n toggleShuffle();\n onClick?.(e);\n }}\n >\n {children ?? locale.shuffle}\n </button>\n );\n}\nShuffle.displayName = \"Ginger.Control.Shuffle\";\n\nexport type SeekBarProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"value\" | \"onChange\" | \"onInput\" | \"min\" | \"max\" | \"step\"\n> & {\n /** Remove default width style for fully custom styling. */\n unstyled?: boolean;\n ariaLabel?: string;\n inputStyle?: CSSProperties;\n};\n\nexport function SeekBar({\n inputStyle,\n style,\n unstyled = false,\n ariaLabel,\n ...rest\n}: SeekBarProps) {\n const b = useSeekBarBinding();\n const mergedStyle = unstyled\n ? { ...style, ...inputStyle }\n : { width: \"100%\", ...style, ...inputStyle };\n return (\n <input\n data-ginger-component=\"SeekBar\"\n {...rest}\n type=\"range\"\n min={b.min}\n max={b.max}\n step={b.step}\n value={b.value}\n aria-label={ariaLabel ?? b.ariaLabel}\n aria-valuetext={b.ariaValueText}\n onInput={b.onSeekInput}\n onChange={b.onSeekChange}\n style={mergedStyle}\n />\n );\n}\n\nSeekBar.displayName = \"Ginger.Control.SeekBar\";\n\nexport type VolumeProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"value\" | \"onChange\" | \"onInput\" | \"min\" | \"max\" | \"step\"\n> & {\n /** Remove default width style for fully custom styling. */\n unstyled?: boolean;\n ariaLabel?: string;\n inputStyle?: CSSProperties;\n};\n\nexport function Volume({\n inputStyle,\n style,\n unstyled = false,\n ariaLabel,\n ...rest\n}: VolumeProps) {\n const b = useVolumeSlider();\n const mergedStyle = unstyled\n ? { ...style, ...inputStyle }\n : { width: \"100%\", ...style, ...inputStyle };\n return (\n <input\n data-ginger-component=\"Volume\"\n {...rest}\n type=\"range\"\n min={b.min}\n max={b.max}\n step={b.step}\n value={b.value}\n aria-label={ariaLabel ?? b.ariaLabel}\n aria-valuetext={b.ariaValueText}\n onInput={b.onVolumeInput}\n onChange={b.onVolumeChange}\n style={mergedStyle}\n />\n );\n}\n\nVolume.displayName = \"Ginger.Control.Volume\";\n\nexport type MuteProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n muteLabel?: ReactNode;\n unmuteLabel?: ReactNode;\n children?: ReactNode;\n};\n\nexport function Mute({\n ariaLabel,\n muteLabel,\n unmuteLabel,\n type = \"button\",\n onClick,\n children,\n ...rest\n}: MuteProps) {\n const { muted, toggleMute } = useGingerMedia();\n const locale = useGingerLocale();\n const m = muteLabel ?? locale.mute;\n const u = unmuteLabel ?? locale.unmute;\n return (\n <button\n data-ginger-component=\"Mute\"\n {...rest}\n type={type}\n aria-pressed={muted}\n aria-label={ariaLabel ?? (muted ? locale.unmute : locale.mute)}\n onClick={(e) => {\n toggleMute();\n onClick?.(e);\n }}\n >\n {children ?? (muted ? u : m)}\n </button>\n );\n}\n\nMute.displayName = \"Ginger.Control.Mute\";\n\nconst defaultRates = [0.5, 0.75, 1, 1.25, 1.5, 2] as const;\n\nexport type PlaybackRateProps = Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"value\" | \"onChange\"\n> & {\n /** Playback speed options (default: 0.5 … 2) */\n rates?: readonly number[];\n ariaLabel?: string;\n children?: ReactNode;\n};\n\nexport function PlaybackRate({\n rates = defaultRates,\n style,\n ariaLabel,\n children,\n ...rest\n}: PlaybackRateProps) {\n const { playbackRate, setPlaybackRate } = useGingerMedia();\n const locale = useGingerLocale();\n const options = useMemo(\n () => Array.from(new Set([...rates, playbackRate])).sort((a, b) => a - b),\n [rates, playbackRate],\n );\n return (\n <select\n data-ginger-component=\"PlaybackRate\"\n {...rest}\n aria-label={ariaLabel ?? locale.playbackSpeed}\n value={String(playbackRate)}\n style={style}\n onChange={(e) => setPlaybackRate(Number(e.currentTarget.value))}\n >\n {children ??\n options.map((r) => (\n <option key={r} value={String(r)}>\n {r === 1 ? locale.playbackRateNormal : locale.playbackRateTimes(r)}\n </option>\n ))}\n </select>\n );\n}\n\nPlaybackRate.displayName = \"Ginger.Control.PlaybackRate\";\n","import type { ReactElement, ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack } from \"../../internal/selectors\";\nimport type { DisplayBaseProps, GingerState, Track } from \"../../types\";\n\nexport type TextDisplayProps = DisplayBaseProps & {\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nexport function createTextDisplay(\n displayName: string,\n select: (state: GingerState) => string | undefined,\n): (props: TextDisplayProps) => ReactElement | null {\n function Comp(props: TextDisplayProps) {\n const state = useGingerState();\n const raw = select(state) ?? \"\";\n const value = raw.trim();\n const { className, style, fallback, empty, children } = props;\n if (!value) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children)\n return (\n <span className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {value}\n </span>\n );\n }\n Comp.displayName = displayName;\n return Comp;\n}\n\nexport function createTrackFieldDisplay(\n displayName: string,\n select: (track: Track | null) => string | undefined,\n): (props: TextDisplayProps) => ReactElement | null {\n return createTextDisplay(displayName, (state) => select(getCurrentTrack(state)));\n}\n","import { getCurrentTrack, resolvedAlbumLine } from \"../../internal/selectors\";\nimport { createTextDisplay, createTrackFieldDisplay } from \"./createTextDisplay\";\n\nexport const Title = createTrackFieldDisplay(\"Ginger.Current.Title\", (t) => t?.title);\nexport const Artist = createTrackFieldDisplay(\"Ginger.Current.Artist\", (t) => t?.artist);\nexport const Album = createTextDisplay(\"Ginger.Current.Album\", (s) => resolvedAlbumLine(s));\nexport const Description = createTrackFieldDisplay(\n \"Ginger.Current.Description\",\n (t) => t?.description,\n);\nexport const Copyright = createTextDisplay(\"Ginger.Current.Copyright\", (s) => {\n const t = getCurrentTrack(s);\n return t?.copyright ?? s.playlistMeta?.copyright;\n});\nexport const Genre = createTrackFieldDisplay(\"Ginger.Current.Genre\", (t) => t?.genre);\nexport const Label = createTrackFieldDisplay(\"Ginger.Current.Label\", (t) => t?.label);\nexport const Isrc = createTrackFieldDisplay(\"Ginger.Current.Isrc\", (t) => t?.isrc);\nexport const TrackNumber = createTrackFieldDisplay(\"Ginger.Current.TrackNumber\", (t) =>\n t?.trackNumber != null ? String(t.trackNumber) : undefined,\n);\n","import { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack } from \"../../internal/selectors\";\nimport type { TextDisplayProps } from \"./createTextDisplay\";\n\nexport type YearProps = TextDisplayProps & {\n format?: (year: number) => string;\n};\n\nexport function Year({\n className,\n style,\n fallback,\n empty,\n children,\n format,\n}: YearProps) {\n const state = useGingerState();\n const y = getCurrentTrack(state)?.year;\n if (typeof y !== \"number\" || !Number.isFinite(y)) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span data-ginger-component=\"Year\" className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const text = format ? format(y) : String(y);\n if (children)\n return (\n <span data-ginger-component=\"Year\" className={className} style={style}>\n {children(text, state)}\n </span>\n );\n return (\n <span data-ginger-component=\"Year\" className={className} style={style}>\n {text}\n </span>\n );\n}\n\nYear.displayName = \"Ginger.Current.Year\";\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack } from \"../../internal/selectors\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type LyricsProps = DisplayBaseProps & {\n children?: (value: string, state: GingerState) => ReactNode;\n /** When true, preserves internal newlines; trims only leading/trailing whitespace */\n preserveWhitespace?: boolean;\n /** When true, skips default `whiteSpace: pre-wrap` when `preserveWhitespace` is true (use `className` / `style` instead). */\n unstyled?: boolean;\n};\n\nexport function Lyrics({\n className,\n style,\n fallback,\n empty,\n children,\n preserveWhitespace = true,\n unstyled = false,\n}: LyricsProps) {\n const state = useGingerState();\n const raw = getCurrentTrack(state)?.lyrics ?? \"\";\n const value = preserveWhitespace ? raw.replace(/^\\s+|\\s+$/g, \"\") : raw.trim();\n if (!value) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span\n data-ginger-component=\"Lyrics\"\n className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const whiteStyle: CSSProperties | undefined =\n !unstyled && preserveWhitespace ? { whiteSpace: \"pre-wrap\" } : undefined;\n if (children)\n return (\n <span className={className} style={{ ...whiteStyle, ...style }}>\n {children(value, state)}\n </span>\n );\n return (\n <span className={className} style={{ ...whiteStyle, ...style }}>\n {value}\n </span>\n );\n}\n\nLyrics.displayName = \"Ginger.Current.Lyrics\";\n","export type TimedLyricLine = {\n time: number;\n text: string;\n};\n\nconst lrcTag = /\\[(\\d{1,2}):(\\d{2})(?:\\.(\\d{1,3}))?\\]/g;\n\nexport function parseLrc(lrc: string): TimedLyricLine[] {\n const lines: TimedLyricLine[] = [];\n for (const rawLine of lrc.split(/\\r?\\n/)) {\n const matches = [...rawLine.matchAll(lrcTag)];\n if (matches.length === 0) continue;\n const text = rawLine.replace(lrcTag, \"\").trim();\n for (const m of matches) {\n const minutes = Number(m[1] ?? 0);\n const seconds = Number(m[2] ?? 0);\n const millis = Number((m[3] ?? \"0\").padEnd(3, \"0\"));\n const time = minutes * 60 + seconds + millis / 1000;\n if (Number.isFinite(time) && time >= 0) {\n lines.push({ time, text });\n }\n }\n }\n return lines.sort((a, b) => a.time - b.time);\n}\n","import { useMemo } from \"react\";\nimport { useGingerMedia, useGingerPlayback } from \"../context/GingerSplitContexts\";\nimport { type TimedLyricLine, parseLrc } from \"../internal/lyrics\";\n\nexport type GingerLyricsSyncState = {\n lines: TimedLyricLine[];\n activeIndex: number;\n activeLine: TimedLyricLine | null;\n};\n\nexport function useGingerLyricsSync(): GingerLyricsSyncState {\n const { tracks, currentIndex } = useGingerPlayback();\n const { currentTime } = useGingerMedia();\n const currentTrack = tracks[currentIndex];\n\n const lines = useMemo(() => {\n if (!currentTrack) return [];\n if (Array.isArray(currentTrack.lyricsTimed) && currentTrack.lyricsTimed.length > 0) {\n return [...currentTrack.lyricsTimed]\n .filter((line) => Number.isFinite(line.time) && line.time >= 0)\n .sort((a, b) => a.time - b.time);\n }\n if (typeof currentTrack.lyrics === \"string\") {\n return parseLrc(currentTrack.lyrics);\n }\n return [];\n }, [currentTrack]);\n\n const activeIndex = useMemo(() => {\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n if (currentTime >= lines[i]!.time) return i;\n }\n return -1;\n }, [currentTime, lines]);\n\n return {\n lines,\n activeIndex,\n activeLine: activeIndex >= 0 ? (lines[activeIndex] ?? null) : null,\n };\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { useGingerLocale } from \"../../context/GingerLocaleContext\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { useGingerLyricsSync } from \"../../hooks/useGingerLyricsSync\";\nimport type { TimedLyricLine } from \"../../internal/lyrics\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type LyricsSyncedProps = Omit<DisplayBaseProps, \"children\"> & {\n unstyled?: boolean;\n /** Class applied to the line that matches the current playback time. */\n activeClassName?: string;\n /** Class applied to every line. */\n lineClassName?: string;\n children?: (\n line: TimedLyricLine,\n index: number,\n active: boolean,\n state: GingerState,\n ) => ReactNode;\n};\n\nexport function LyricsSynced({\n className,\n style,\n fallback,\n empty,\n unstyled = false,\n activeClassName,\n lineClassName,\n children,\n}: LyricsSyncedProps) {\n const state = useGingerState();\n const locale = useGingerLocale();\n const { lines, activeIndex } = useGingerLyricsSync();\n\n if (lines.length === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span \n data-ginger-component=\"LyricsSynced\"\n className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n\n const listStyle: CSSProperties = unstyled\n ? {}\n : {\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n fontFamily: \"var(--ginger-font-family, system-ui, sans-serif)\",\n fontSize: \"var(--ginger-font-size, 14px)\",\n color: \"var(--ginger-primary-color, #111827)\",\n };\n\n return (\n <ul\n className={className}\n style={{ ...listStyle, ...style }}\n aria-label={locale.syncedLyricsList}\n >\n {lines.map((line, index) => {\n const active = index === activeIndex;\n return (\n <li\n key={`${line.time}-${index}`}\n aria-current={active ? \"true\" : undefined}\n data-ginger-active={active || undefined}\n className={\n [lineClassName, active ? activeClassName : undefined].filter(Boolean).join(\" \") ||\n undefined\n }\n style={\n unstyled\n ? undefined\n : {\n padding: \"var(--ginger-playlist-row-padding, 4px 8px)\",\n fontWeight: active ? 600 : 400,\n opacity: active ? 1 : 0.75,\n }\n }\n >\n {children ? children(line, index, active, state) : line.text}\n </li>\n );\n })}\n </ul>\n );\n}\n\nLyricsSynced.displayName = \"Ginger.Current.LyricsSynced\";\n","import { useMemo } from \"react\";\nimport { useGingerMedia, useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type GingerChapter = {\n title: string;\n startSeconds: number;\n};\n\nexport type GingerChapterState = {\n list: GingerChapter[];\n activeIndex: number;\n active: GingerChapter | null;\n seekTo: (index: number) => void;\n};\n\nexport function useGingerChapters(): GingerChapterState {\n const { tracks, currentIndex } = useGingerPlayback();\n const { currentTime, seek } = useGingerMedia();\n\n const list = useMemo(() => {\n const chapters = tracks[currentIndex]?.chapters ?? [];\n return [...chapters]\n .filter((item) => item && Number.isFinite(item.startSeconds) && item.startSeconds >= 0)\n .sort((a, b) => a.startSeconds - b.startSeconds);\n }, [currentIndex, tracks]);\n\n const activeIndex = useMemo(() => {\n if (list.length === 0) return -1;\n for (let i = list.length - 1; i >= 0; i -= 1) {\n if (currentTime >= list[i]!.startSeconds) return i;\n }\n return -1;\n }, [currentTime, list]);\n\n return {\n list,\n activeIndex,\n active: activeIndex >= 0 ? (list[activeIndex] ?? null) : null,\n seekTo: (index: number) => {\n const chapter = list[index];\n if (chapter) seek(chapter.startSeconds);\n },\n };\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { useGingerLocale } from \"../../context/GingerLocaleContext\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport {\n type GingerChapter,\n useGingerChapters,\n} from \"../../hooks/useGingerChapters\";\nimport { formatMmSs } from \"../../internal/formatTime\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type ChaptersProps = Omit<DisplayBaseProps, \"children\"> & {\n /** Remove default list/row styles for fully custom styling. */\n unstyled?: boolean;\n /** Prefix before each chapter title (default: `formatMmSs(startSeconds)`). */\n formatStart?: (startSeconds: number) => string;\n children?: (\n chapter: GingerChapter,\n index: number,\n active: boolean,\n state: GingerState,\n ) => ReactNode;\n};\n\nexport function Chapters({\n className,\n style,\n fallback,\n empty,\n unstyled = false,\n formatStart = formatMmSs,\n children,\n}: ChaptersProps) {\n const state = useGingerState();\n const locale = useGingerLocale();\n const { list, activeIndex, seekTo } = useGingerChapters();\n\n if (list.length === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span\n data-ginger-component=\"Chapters\"\n className={className}\n style={style}\n >\n {node}\n </span>\n ) : null;\n }\n\n const listStyle: CSSProperties = unstyled\n ? {}\n : {\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n fontFamily: \"var(--ginger-font-family, system-ui, sans-serif)\",\n fontSize: \"var(--ginger-font-size, 14px)\",\n color: \"var(--ginger-primary-color, #111827)\",\n };\n\n return (\n <ul\n className={className}\n style={{ ...listStyle, ...style }}\n aria-label={locale.chaptersList}\n >\n {list.map((chapter, index) => {\n const active = index === activeIndex;\n return (\n <li key={`${chapter.startSeconds}-${chapter.title}`}>\n <button\n type=\"button\"\n aria-current={active ? \"true\" : undefined}\n data-ginger-active={active || undefined}\n onClick={() => seekTo(index)}\n style={{\n width: unstyled ? undefined : \"100%\",\n textAlign: unstyled ? undefined : \"left\",\n border: unstyled ? undefined : \"none\",\n background: unstyled\n ? undefined\n : active\n ? \"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))\"\n : \"transparent\",\n color: unstyled ? undefined : \"inherit\",\n font: unstyled ? undefined : \"inherit\",\n cursor: unstyled ? undefined : \"pointer\",\n padding: unstyled\n ? undefined\n : \"var(--ginger-playlist-row-padding, 6px 8px)\",\n }}\n >\n {children ? (\n children(chapter, index, active, state)\n ) : unstyled ? (\n <>\n {formatStart(chapter.startSeconds)} {chapter.title}\n </>\n ) : (\n <span>\n <span style={{ opacity: 0.75, marginRight: \"0.35em\" }}>\n {formatStart(chapter.startSeconds)}\n </span>\n {chapter.title}\n </span>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n );\n}\n\nChapters.displayName = \"Ginger.Current.Chapters\";\n","import { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack } from \"../../internal/selectors\";\nimport type { TextDisplayProps } from \"./createTextDisplay\";\n\nexport type FileUrlProps = TextDisplayProps & {\n /** When false (default), renders nothing unless you explicitly opt in */\n visible?: boolean;\n};\n\nexport function FileUrl({\n visible = false,\n className,\n style,\n fallback,\n empty,\n children,\n}: FileUrlProps) {\n const state = useGingerState();\n if (!visible) return null;\n const value = getCurrentTrack(state)?.fileUrl ?? \"\";\n if (!value) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children)\n return (\n <span data-ginger-component=\"FileUrl\" className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {value}\n </span>\n );\n}\n\nFileUrl.displayName = \"Ginger.Current.FileUrl\";\n","import type { CSSProperties, ImgHTMLAttributes } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack, resolvedArtwork } from \"../../internal/selectors\";\nimport type { DisplayBaseProps } from \"../../types\";\n\nexport type ArtworkProps = DisplayBaseProps &\n Pick<ImgHTMLAttributes<HTMLImageElement>, \"sizes\" | \"loading\" | \"onError\" | \"decoding\"> & {\n /** Remove default wrapper/image styles for fully custom layout. */\n unstyled?: boolean;\n imgStyle?: CSSProperties;\n };\n\nexport function Artwork({\n className,\n style,\n fallback,\n empty,\n sizes,\n loading,\n onError,\n decoding,\n unstyled = false,\n imgStyle,\n}: ArtworkProps) {\n const state = useGingerState();\n const track = getCurrentTrack(state);\n const src = resolvedArtwork(state);\n if (!src) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span\n className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const alt = [track?.title, track?.artist].filter(Boolean).join(\" — \") || \"Artwork\";\n return (\n <div\n data-ginger-component=\"Artwork\"\n className={className}\n style={\n unstyled\n ? { ...style }\n : {\n background: \"var(--ginger-artwork-bg, transparent)\",\n borderRadius: \"var(--ginger-artwork-radius, 0)\",\n overflow: \"hidden\",\n ...style,\n }\n }\n >\n <img\n src={src}\n alt={alt}\n sizes={sizes}\n loading={loading}\n decoding={decoding}\n onError={onError}\n style={{\n display: unstyled ? undefined : \"block\",\n width: unstyled ? undefined : \"100%\",\n height: unstyled ? undefined : \"100%\",\n objectFit: unstyled ? undefined : \"cover\",\n ...imgStyle,\n }}\n />\n </div>\n );\n}\n\nArtwork.displayName = \"Ginger.Current.Artwork\";\n","import type { ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type QueueIndexProps = DisplayBaseProps & {\n base?: 0 | 1;\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nexport function QueueIndex({\n base = 0,\n className,\n style,\n fallback,\n empty,\n children,\n}: QueueIndexProps) {\n const state = useGingerState();\n const len = state.tracks.length;\n if (len === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span\n data-ginger-component=\"QueueIndex\"\n className={className}\n style={style}\n >\n {node}\n </span>\n ) : null;\n }\n const value = String(state.currentIndex + base);\n if (children)\n return (\n <span\n data-ginger-component=\"QueueIndex\"\n className={className}\n style={style}\n >\n {children(value, state)}\n </span>\n );\n return (\n <span\n data-ginger-component=\"QueueIndex\"\n className={className}\n style={style}\n >\n {value}\n </span>\n );\n}\n\nQueueIndex.displayName = \"Ginger.Current.QueueIndex\";\n\nexport type QueueLengthProps = DisplayBaseProps & {\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nexport function QueueLength({\n className,\n style,\n fallback,\n empty,\n children,\n}: QueueLengthProps) {\n const state = useGingerState();\n const value = String(state.tracks.length);\n if (state.tracks.length === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children)\n return (\n <span\n data-ginger-component=\"QueueLength\"\n className={className}\n style={style}\n >\n {children(value, state)}\n </span>\n );\n return (\n <span\n data-ginger-component=\"QueueLength\"\n className={className}\n style={style}\n >\n {value}\n </span>\n );\n}\n\nQueueLength.displayName = \"Ginger.Current.QueueLength\";\n\nexport type QueuePositionProps = DisplayBaseProps & {\n base?: 0 | 1;\n separator?: string;\n children?: (\n value: { index: string; length: string; label: string },\n state: GingerState,\n ) => ReactNode;\n};\n\nexport function QueuePosition({\n base = 0,\n separator = \" / \",\n className,\n style,\n fallback,\n empty,\n children,\n}: QueuePositionProps) {\n const state = useGingerState();\n const len = state.tracks.length;\n if (len === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const index = String(state.currentIndex + base);\n const length = String(len);\n const label = `${index}${separator}${length}`;\n if (children)\n return (\n <span\n data-ginger-component=\"QueuePosition\"\n className={className}\n style={style}\n >\n {children({ index, length, label }, state)}\n </span>\n );\n return (\n <span\n data-ginger-component=\"QueuePosition\"\n className={className}\n style={style}\n >\n {label}\n </span>\n );\n}\n\nQueuePosition.displayName = \"Ginger.Current.QueuePosition\";\n","import type { ReactElement, ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { formatMmSs } from \"../../internal/formatTime\";\nimport {\n effectiveDuration,\n effectiveRemaining,\n progressFraction,\n} from \"../../internal/selectors\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type TimeTextProps = DisplayBaseProps & {\n format?: (seconds: number) => string;\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nfunction renderTime(\n valueSeconds: number,\n state: GingerState,\n props: TimeTextProps,\n): ReactElement | null {\n const {\n className,\n style,\n fallback,\n empty,\n children,\n format = formatMmSs,\n } = props;\n if (!(valueSeconds >= 0) || !Number.isFinite(valueSeconds)) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span\n data-ginger-component=\"TimeText\"\n className={className}\n style={style}\n >\n {node}\n </span>\n ) : null;\n }\n const text = format(valueSeconds);\n if (children)\n return (\n <span\n data-ginger-component=\"TimeText\"\n className={className}\n style={style}\n >\n {children(text, state)}\n </span>\n );\n return (\n <span data-ginger-component=\"TimeText\" className={className} style={style}>\n {text}\n </span>\n );\n}\n\nexport function Elapsed(props: TimeTextProps) {\n const state = useGingerState();\n return renderTime(state.currentTime, state, props);\n}\n\nElapsed.displayName = \"Ginger.Current.Elapsed\";\n\nexport function Duration(props: TimeTextProps) {\n const state = useGingerState();\n return renderTime(effectiveDuration(state), state, props);\n}\n\nDuration.displayName = \"Ginger.Current.Duration\";\n\nexport function Remaining(props: TimeTextProps) {\n const state = useGingerState();\n return renderTime(effectiveRemaining(state), state, props);\n}\n\nRemaining.displayName = \"Ginger.Current.Remaining\";\n\nexport type ProgressProps = DisplayBaseProps & {\n children?: (\n value: { fraction: number; currentTime: number; duration: number },\n state: GingerState,\n ) => ReactNode;\n};\n\nexport function Progress({\n className,\n style,\n fallback,\n empty,\n children,\n}: ProgressProps) {\n const state = useGingerState();\n const duration = effectiveDuration(state);\n const fraction = progressFraction(state);\n if (!(duration > 0)) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span\n data-ginger-component=\"Progress\"\n className={className}\n style={style}\n >\n {node}\n </span>\n ) : null;\n }\n if (children)\n return (\n <span\n data-ginger-component=\"Progress\"\n className={className}\n style={style}\n >\n {children(\n { fraction, currentTime: state.currentTime, duration },\n state,\n )}\n </span>\n );\n return (\n <span data-ginger-component=\"Progress\" className={className} style={style}>\n {`${Math.round(fraction * 100)}%`}\n </span>\n );\n}\n\nProgress.displayName = \"Ginger.Current.Progress\";\n\nexport type TimeRailProps = DisplayBaseProps & {\n /** 0-1 height in px for the rail */\n height?: number;\n /** When true, shows a buffered range behind the progress fill (uses `bufferedFraction`). */\n showBuffered?: boolean;\n /** Remove default rail styles and render only inline width values. */\n unstyled?: boolean;\n};\n\nexport function TimeRail({\n className,\n style,\n height = 4,\n showBuffered = false,\n unstyled = false,\n}: TimeRailProps) {\n const state = useGingerState();\n const progressPct = `${Math.round(progressFraction(state) * 100)}%`;\n const bufPct = `${Math.round(Math.min(1, Math.max(0, state.bufferedFraction)) * 100)}%`;\n return (\n <div\n data-ginger-component=\"TimeRail\"\n className={className}\n style={\n unstyled\n ? { ...style }\n : {\n width: \"100%\",\n height,\n background: \"var(--ginger-muted-color, #e5e7eb)\",\n borderRadius: 999,\n overflow: \"hidden\",\n position: \"relative\",\n ...style,\n }\n }\n aria-hidden\n >\n {showBuffered ? (\n <div\n data-ginger-component=\"TimeRail\"\n style={{\n position: unstyled ? undefined : \"absolute\",\n left: unstyled ? undefined : 0,\n top: unstyled ? undefined : 0,\n height: unstyled ? undefined : \"100%\",\n width: bufPct,\n background: unstyled\n ? undefined\n : \"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))\",\n }}\n />\n ) : null}\n <div\n data-ginger-component=\"TimeRail\"\n style={{\n position: unstyled ? undefined : \"relative\",\n width: progressPct,\n height: unstyled ? undefined : \"100%\",\n background: unstyled\n ? undefined\n : \"var(--ginger-primary-color, #111827)\",\n }}\n />\n </div>\n );\n}\n\nTimeRail.displayName = \"Ginger.Current.TimeRail\";\n\nexport type BufferRailProps = DisplayBaseProps & {\n height?: number;\n /** Remove default rail styles and render only buffered width value. */\n unstyled?: boolean;\n};\n\n/** Buffered portion of the timeline (0…`bufferedFraction`); pair with `TimeRail` or use alone. */\nexport function BufferRail({\n className,\n style,\n height = 4,\n unstyled = false,\n}: BufferRailProps) {\n const state = useGingerState();\n const bufPct = `${Math.round(Math.min(1, Math.max(0, state.bufferedFraction)) * 100)}%`;\n return (\n <div\n data-ginger-component=\"BufferRail\"\n className={className}\n style={\n unstyled\n ? { ...style }\n : {\n width: \"100%\",\n height,\n background: \"var(--ginger-muted-color, #e5e7eb)\",\n borderRadius: 999,\n overflow: \"hidden\",\n ...style,\n }\n }\n aria-hidden\n >\n <div\n data-ginger-component=\"BufferRail\"\n style={{\n width: bufPct,\n height: unstyled ? undefined : \"100%\",\n background: unstyled\n ? undefined\n : \"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))\",\n }}\n />\n </div>\n );\n}\n\nBufferRail.displayName = \"Ginger.Current.BufferRail\";\n","import type { ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { derivePlaybackUiState } from \"../../internal/selectors\";\nimport type {\n DisplayBaseProps,\n GingerState,\n PlaybackUiState,\n} from \"../../types\";\n\nexport type PlaybackStateProps = DisplayBaseProps & {\n children?: (value: PlaybackUiState, state: GingerState) => ReactNode;\n};\n\nexport function PlaybackState({\n className,\n style,\n fallback,\n empty,\n children,\n}: PlaybackStateProps) {\n const state = useGingerState();\n const value = derivePlaybackUiState(state);\n if (children)\n return (\n <span\n data-ginger-component=\"PlaybackState\"\n className={className}\n style={style}\n >\n {children(value, state)}\n </span>\n );\n return (\n <span\n data-ginger-component=\"PlaybackState\"\n className={className}\n style={style}\n >\n {value}\n </span>\n );\n}\n\nPlaybackState.displayName = \"Ginger.Current.PlaybackState\";\n\nexport type ErrorMessageProps = DisplayBaseProps & {\n live?: \"polite\" | \"assertive\" | \"off\";\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nexport function ErrorMessage({\n className,\n style,\n fallback,\n empty,\n live = \"polite\",\n children,\n}: ErrorMessageProps) {\n const state = useGingerState();\n const value = state.errorMessage ?? \"\";\n if (!value) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span\n data-ginger-component=\"ErrorMessage\"\n className={className}\n style={style}\n >\n {node}\n </span>\n ) : null;\n }\n if (children) {\n return (\n <span\n data-ginger-component=\"ErrorMessage\"\n className={className}\n style={style}\n aria-live={live}\n >\n {children(value, state)}\n </span>\n );\n }\n return (\n <span\n data-ginger-component=\"ErrorMessage\"\n className={className}\n style={style}\n aria-live={live}\n >\n {value}\n </span>\n );\n}\n\nErrorMessage.displayName = \"Ginger.Current.ErrorMessage\";\n","import {\n type ButtonHTMLAttributes,\n type CSSProperties,\n type HTMLAttributes,\n type LiHTMLAttributes,\n type ReactNode,\n createContext,\n useContext,\n} from \"react\";\nimport { useGingerPlayback } from \"../../context/GingerSplitContexts\";\nimport { trackIdentity } from \"../../core/queue\";\nimport type { Track } from \"../../types\";\n\nexport type GingerPlaylistConfig = {\n playOnSelect: boolean;\n};\n\nconst GingerPlaylistConfigContext = createContext<GingerPlaylistConfig | null>(null);\n\nfunction usePlaylistConfig(): GingerPlaylistConfig {\n const ctx = useContext(GingerPlaylistConfigContext);\n if (!ctx) {\n throw new Error(\"Ginger.Playlist.Track must be used inside <Ginger.Playlist>\");\n }\n return ctx;\n}\n\nexport type GingerPlaylistProps = Omit<HTMLAttributes<HTMLUListElement>, \"children\"> & {\n children?: ReactNode;\n /** Remove default list/row styles for fully custom playlist styling. */\n unstyled?: boolean;\n rowStyle?: CSSProperties;\n /**\n * Used only in **auto** mode (no custom `children`). Ignored when you pass custom `children`\n * (manual mode); use `Ginger.Playlist.Track` for each row instead.\n */\n renderTrack?: (track: Track, index: number, isActive: boolean) => ReactNode;\n /** When true (default), clicking a row selects that index and starts playback */\n playOnSelect?: boolean;\n};\n\n/**\n * - **Auto mode** (no `children`): maps `state.tracks` to rows (optional `renderTrack`).\n * - **Manual mode** (`children` defined): renders `<ul>{children}</ul>`; map `state.tracks` yourself\n * with `Ginger.Playlist.Track` for each index.\n */\nexport function GingerPlaylist({\n children,\n unstyled = false,\n rowStyle,\n renderTrack,\n playOnSelect = true,\n style,\n ...rest\n}: GingerPlaylistProps) {\n const { tracks, currentIndex, playTrackAt, selectTrackAt } = useGingerPlayback();\n\n const listStyle: CSSProperties = unstyled\n ? { ...style }\n : {\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n fontFamily: \"var(--ginger-font-family, system-ui, sans-serif)\",\n fontSize: \"var(--ginger-font-size, 14px)\",\n color: \"var(--ginger-primary-color, #111827)\",\n ...style,\n };\n\n const manual = children !== undefined;\n\n if (manual) {\n return (\n <GingerPlaylistConfigContext.Provider value={{ playOnSelect }}>\n <ul style={listStyle} {...rest}>\n {children}\n </ul>\n </GingerPlaylistConfigContext.Provider>\n );\n }\n\n return (\n <GingerPlaylistConfigContext.Provider value={{ playOnSelect }}>\n <ul data-ginger-component=\"Playlist\" style={listStyle} {...rest}>\n {tracks.map((track, index) => {\n const active = index === currentIndex;\n return (\n <li key={`${index}-${trackIdentity(track)}`}>\n <button\n type=\"button\"\n onClick={() => {\n if (playOnSelect) playTrackAt(index);\n else selectTrackAt(index);\n }}\n style={{\n width: unstyled ? undefined : \"100%\",\n textAlign: unstyled ? undefined : \"left\",\n border: unstyled ? undefined : \"none\",\n background: unstyled\n ? undefined\n : active\n ? \"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))\"\n : \"transparent\",\n color: unstyled ? undefined : \"inherit\",\n font: unstyled ? undefined : \"inherit\",\n cursor: unstyled ? undefined : \"pointer\",\n padding: unstyled ? undefined : \"var(--ginger-playlist-row-padding, 6px 8px)\",\n ...rowStyle,\n }}\n >\n {renderTrack ? (\n renderTrack(track, index, active)\n ) : (\n <span>\n {track.title}\n {track.artist ? ` — ${track.artist}` : \"\"}\n </span>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n </GingerPlaylistConfigContext.Provider>\n );\n}\n\nGingerPlaylist.displayName = \"Ginger.Playlist\";\n\nexport type GingerPlaylistTrackProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> & {\n index: number;\n /** Remove default row button styles for fully custom styling. */\n unstyled?: boolean;\n /** Optional wrapper for the row; defaults to a plain `<li>` */\n liProps?: LiHTMLAttributes<HTMLLIElement>;\n};\n\nexport function GingerPlaylistTrack({\n index,\n unstyled = false,\n className,\n style,\n children,\n liProps,\n onClick,\n ...buttonRest\n}: GingerPlaylistTrackProps) {\n const { playOnSelect } = usePlaylistConfig();\n const { tracks, currentIndex, playTrackAt, selectTrackAt } = useGingerPlayback();\n const active = index === currentIndex;\n const track = tracks[index];\n const defaultLabel =\n track != null ? (\n <span>\n {track.title}\n {track.artist ? ` — ${track.artist}` : \"\"}\n </span>\n ) : null;\n\n return (\n <li {...liProps}>\n <button\n type=\"button\"\n aria-current={active ? \"true\" : undefined}\n data-ginger-active={active || undefined}\n className={className}\n style={{\n width: unstyled ? undefined : \"100%\",\n textAlign: unstyled ? undefined : \"left\",\n border: unstyled ? undefined : \"none\",\n background: unstyled\n ? undefined\n : active\n ? \"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))\"\n : \"transparent\",\n color: unstyled ? undefined : \"inherit\",\n font: unstyled ? undefined : \"inherit\",\n cursor: unstyled ? undefined : \"pointer\",\n padding: unstyled ? undefined : \"var(--ginger-playlist-row-padding, 6px 8px)\",\n ...style,\n }}\n {...buttonRest}\n onClick={(e) => {\n onClick?.(e);\n if (e.defaultPrevented) return;\n if (playOnSelect) playTrackAt(index);\n else selectTrackAt(index);\n }}\n >\n {children ?? defaultLabel}\n </button>\n </li>\n );\n}\n\nGingerPlaylistTrack.displayName = \"Ginger.Playlist.Track\";\n\nexport const GingerPlaylistCompound = Object.assign(GingerPlaylist, {\n Track: GingerPlaylistTrack,\n});\n","import type { CSSProperties } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport type { DisplayBaseProps } from \"../../types\";\nimport { createTextDisplay } from \"../current/createTextDisplay\";\n\nexport const Title = createTextDisplay(\n \"Ginger.Queue.Title\",\n (s) => s.playlistMeta?.title,\n);\nexport const Subtitle = createTextDisplay(\n \"Ginger.Queue.Subtitle\",\n (s) => s.playlistMeta?.subtitle,\n);\nexport const Description = createTextDisplay(\n \"Ginger.Queue.Description\",\n (s) => s.playlistMeta?.description,\n);\nexport const Copyright = createTextDisplay(\n \"Ginger.Queue.Copyright\",\n (s) => s.playlistMeta?.copyright,\n);\n\nexport type QueueArtworkProps = DisplayBaseProps & {\n /** Remove default wrapper/image styles for fully custom layout. */\n unstyled?: boolean;\n imgStyle?: CSSProperties;\n};\n\nexport function Artwork({\n className,\n style,\n fallback,\n empty,\n unstyled = false,\n imgStyle,\n}: QueueArtworkProps) {\n const state = useGingerState();\n const src = state.playlistMeta?.artworkUrl;\n if (!src) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const alt = state.playlistMeta?.title ?? \"Playlist artwork\";\n return (\n <span\n data-ginger-component=\"Artwork\"\n className={className}\n style={\n unstyled\n ? { ...style }\n : {\n display: \"inline-block\",\n background: \"var(--ginger-artwork-bg, #f3f4f6)\",\n borderRadius: \"var(--ginger-artwork-radius, 6px)\",\n overflow: \"hidden\",\n ...style,\n }\n }\n >\n <img\n src={src}\n alt={alt}\n style={{\n display: unstyled ? undefined : \"block\",\n width: unstyled ? undefined : \"100%\",\n height: unstyled ? undefined : \"100%\",\n objectFit: unstyled ? undefined : \"cover\",\n ...imgStyle,\n }}\n />\n </span>\n );\n}\n\nArtwork.displayName = \"Ginger.Queue.Artwork\";\n","import type { GingerAction, GingerState, RepeatMode, Track } from \"../types\";\nimport {\n addNextTrack,\n clampIndex,\n findIndexByTrackIdentity,\n insertTrackAt,\n moveTrack,\n removeTrackAt,\n shuffleWithAnchor,\n} from \"./queue\";\nimport { computeNextIndex, computePrevIndex, cycleRepeatMode } from \"./transitions\";\n\nexport function clampVolume(v: number): number {\n if (!Number.isFinite(v)) return 1;\n return Math.min(1, Math.max(0, v));\n}\n\nexport function clampPlaybackRate(r: number): number {\n if (!Number.isFinite(r)) return 1;\n return Math.min(4, Math.max(0.25, r));\n}\n\n/** Reset when the active track / position changes; keeps volume / mute / speed */\nconst resetTimingOnly = {\n currentTime: 0,\n duration: 0,\n bufferedFraction: 0,\n isBuffering: false,\n errorMessage: null as string | null,\n};\n\nconst defaultMedia = {\n ...resetTimingOnly,\n volume: 1,\n muted: false,\n playbackRate: 1,\n};\n\nexport function createInitialState(params: {\n tracks: Track[];\n currentIndex?: number;\n playlistMeta?: GingerState[\"playlistMeta\"];\n isPaused?: boolean;\n isShuffled?: boolean;\n repeatMode?: RepeatMode;\n playbackMode?: GingerState[\"playbackMode\"];\n volume?: number;\n muted?: boolean;\n playbackRate?: number;\n}): GingerState {\n const tracks = [...params.tracks];\n let currentIndex = clampIndex(params.currentIndex ?? 0, tracks.length);\n let originalTracks: Track[] | null = null;\n let ordered = tracks;\n\n if (params.isShuffled && tracks.length > 1) {\n originalTracks = [...tracks];\n ordered = shuffleWithAnchor(tracks, currentIndex);\n currentIndex = 0;\n }\n\n return {\n tracks: ordered,\n currentIndex,\n playbackMode: params.playbackMode ?? \"playlist\",\n isPaused: params.isPaused ?? true,\n isShuffled: Boolean(params.isShuffled && ordered.length > 1),\n repeatMode: params.repeatMode ?? \"off\",\n originalTracks,\n playlistMeta: params.playlistMeta ?? null,\n ...defaultMedia,\n volume: clampVolume(params.volume ?? 1),\n muted: params.muted ?? false,\n playbackRate: clampPlaybackRate(params.playbackRate ?? 1),\n };\n}\n\nexport function gingerReducer(state: GingerState, action: GingerAction): GingerState {\n switch (action.type) {\n case \"INIT\": {\n const {\n tracks,\n currentIndex,\n playlistMeta,\n isPaused,\n isShuffled,\n repeatMode,\n playbackMode,\n volume,\n muted,\n playbackRate,\n } = action.payload;\n return createInitialState({\n tracks,\n currentIndex,\n playlistMeta: playlistMeta ?? null,\n isPaused: isPaused ?? true,\n isShuffled: isShuffled ?? false,\n repeatMode: repeatMode ?? \"off\",\n playbackMode: playbackMode ?? \"playlist\",\n volume,\n muted,\n playbackRate,\n });\n }\n case \"SET_QUEUE\": {\n const { tracks, currentIndex } = action.payload;\n const next = [...tracks];\n const idx = clampIndex(currentIndex ?? state.currentIndex, next.length);\n return {\n ...state,\n tracks: next,\n currentIndex: idx,\n isShuffled: false,\n originalTracks: null,\n ...resetTimingOnly,\n };\n }\n case \"INSERT_TRACK\": {\n const insertIndex = action.payload.index ?? state.tracks.length;\n const tracks = insertTrackAt(state.tracks, action.payload.track, insertIndex);\n if (action.payload.autoPlay) {\n const idx = clampIndex(insertIndex, tracks.length);\n return {\n ...state,\n tracks,\n currentIndex: idx,\n isShuffled: false,\n originalTracks: null,\n isPaused: false,\n ...resetTimingOnly,\n };\n }\n const currentIndex =\n insertIndex <= state.currentIndex ? state.currentIndex + 1 : state.currentIndex;\n return {\n ...state,\n tracks,\n isShuffled: false,\n originalTracks: null,\n currentIndex: clampIndex(currentIndex, tracks.length),\n };\n }\n case \"REMOVE_TRACK\": {\n const index = action.payload.index;\n const tracks = removeTrackAt(state.tracks, index);\n const currentIndex =\n index < state.currentIndex\n ? state.currentIndex - 1\n : index === state.currentIndex\n ? Math.min(state.currentIndex, Math.max(0, tracks.length - 1))\n : state.currentIndex;\n return {\n ...state,\n tracks,\n isShuffled: false,\n originalTracks: null,\n currentIndex: clampIndex(currentIndex, tracks.length),\n ...(index === state.currentIndex ? resetTimingOnly : {}),\n };\n }\n case \"MOVE_TRACK\": {\n const { fromIndex, toIndex } = action.payload;\n const tracks = moveTrack(state.tracks, fromIndex, toIndex);\n let currentIndex = state.currentIndex;\n if (state.currentIndex === fromIndex) currentIndex = toIndex;\n else if (fromIndex < state.currentIndex && toIndex >= state.currentIndex) currentIndex -= 1;\n else if (fromIndex > state.currentIndex && toIndex <= state.currentIndex) currentIndex += 1;\n return {\n ...state,\n tracks,\n isShuffled: false,\n originalTracks: null,\n currentIndex: clampIndex(currentIndex, tracks.length),\n };\n }\n case \"ADD_NEXT\": {\n const tracks = addNextTrack(state.tracks, state.currentIndex, action.payload.track);\n return {\n ...state,\n tracks,\n isShuffled: false,\n originalTracks: null,\n };\n }\n case \"SET_INDEX\": {\n const idx = clampIndex(action.payload.index, state.tracks.length);\n const ap = action.payload.autoPlay;\n const isPaused = ap === true ? false : ap === false ? true : state.isPaused;\n return {\n ...state,\n currentIndex: idx,\n ...resetTimingOnly,\n isPaused,\n };\n }\n case \"PLAY\":\n return { ...state, isPaused: false };\n case \"PAUSE\":\n return { ...state, isPaused: true };\n case \"TOGGLE_PAUSE\":\n return { ...state, isPaused: !state.isPaused };\n case \"SET_REPEAT\":\n return { ...state, repeatMode: action.payload };\n case \"CYCLE_REPEAT\":\n return { ...state, repeatMode: cycleRepeatMode(state.repeatMode) };\n case \"TOGGLE_SHUFFLE\": {\n if (state.tracks.length <= 1) return { ...state, isShuffled: false, originalTracks: null };\n if (!state.isShuffled) {\n const snapshot = [...state.tracks];\n const shuffled = shuffleWithAnchor(snapshot, state.currentIndex);\n return {\n ...state,\n isShuffled: true,\n originalTracks: snapshot,\n tracks: shuffled,\n currentIndex: 0,\n };\n }\n const restored = state.originalTracks ? [...state.originalTracks] : [...state.tracks];\n const current = state.tracks[state.currentIndex];\n const newIndex = findIndexByTrackIdentity(restored, current);\n return {\n ...state,\n isShuffled: false,\n originalTracks: null,\n tracks: restored,\n currentIndex: clampIndex(newIndex, restored.length),\n };\n }\n case \"NEXT\": {\n const nextIndex = computeNextIndex(state);\n const same = nextIndex === state.currentIndex;\n return {\n ...state,\n currentIndex: nextIndex,\n ...(same ? {} : resetTimingOnly),\n isPaused: same ? state.isPaused : false,\n };\n }\n case \"PREV\": {\n const prevIndex = computePrevIndex(state);\n const same = prevIndex === state.currentIndex;\n return {\n ...state,\n currentIndex: prevIndex,\n ...(same ? {} : resetTimingOnly),\n isPaused: same ? state.isPaused : false,\n };\n }\n case \"MEDIA_TIME_UPDATE\":\n return {\n ...state,\n currentTime: action.payload.currentTime,\n duration: Number.isFinite(action.payload.duration)\n ? action.payload.duration\n : state.duration,\n bufferedFraction: action.payload.bufferedFraction,\n isBuffering: false,\n };\n case \"MEDIA_LOADED_METADATA\":\n return {\n ...state,\n duration: Number.isFinite(action.payload.duration)\n ? action.payload.duration\n : state.duration,\n bufferedFraction: action.payload.bufferedFraction,\n errorMessage: null,\n };\n case \"SET_PLAYLIST_META\":\n return { ...state, playlistMeta: action.payload };\n case \"SET_PLAYBACK_MODE\":\n return { ...state, playbackMode: action.payload };\n case \"MEDIA_ERROR\":\n return {\n ...state,\n errorMessage: action.payload.message,\n isPaused: true,\n isBuffering: false,\n };\n case \"MEDIA_WAITING\":\n return { ...state, isBuffering: true };\n case \"MEDIA_CANPLAY\":\n return { ...state, isBuffering: false, errorMessage: null };\n case \"MEDIA_PLAY\":\n return { ...state, isPaused: false, isBuffering: false };\n case \"MEDIA_PAUSE\":\n return { ...state, isPaused: true };\n case \"RESET_MEDIA_TIMES\":\n return { ...state, currentTime: 0, duration: 0, bufferedFraction: 0 };\n case \"MEDIA_SOURCE_CLEARED\":\n return { ...state, ...resetTimingOnly };\n case \"SET_VOLUME\":\n return { ...state, volume: clampVolume(action.payload) };\n case \"SET_MUTED\":\n return { ...state, muted: action.payload };\n case \"TOGGLE_MUTE\":\n return { ...state, muted: !state.muted };\n case \"SET_PLAYBACK_RATE\":\n return { ...state, playbackRate: clampPlaybackRate(action.payload) };\n case \"MEDIA_VOLUME_SYNC\": {\n const { volume, muted } = action.payload;\n const v = clampVolume(volume);\n if (v === state.volume && muted === state.muted) return state;\n return { ...state, volume: v, muted };\n }\n default: {\n const _exhaustive: never = action;\n void _exhaustive;\n return state;\n }\n }\n}\n","import { useEffect } from \"react\";\nimport { resolveArtworkUrl } from \"../core/transitions\";\nimport type { GingerState } from \"../types\";\n\nexport type MediaSessionBridgeActions = {\n play: () => void;\n pause: () => void;\n next: () => void;\n prev: () => void;\n seek: (timeSeconds: number) => void;\n};\n\nfunction getMediaSession(): MediaSession | null {\n if (typeof navigator === \"undefined\" || !(\"mediaSession\" in navigator)) return null;\n return navigator.mediaSession;\n}\n\nexport function useMediaSessionBridge(\n enabled: boolean,\n state: GingerState,\n actions: MediaSessionBridgeActions,\n): void {\n const track = state.tracks[state.currentIndex];\n const title = track?.title;\n const artist = track?.artist;\n const album = track?.album;\n const artworkUrl = resolveArtworkUrl(track, state.playlistMeta?.artworkUrl);\n\n useEffect(() => {\n const ms = getMediaSession();\n if (!enabled || !ms) return;\n ms.metadata = new MediaMetadata({\n title: title ?? \"Unknown track\",\n artist,\n album,\n artwork: artworkUrl ? [{ src: artworkUrl }] : undefined,\n });\n }, [enabled, title, artist, album, artworkUrl]);\n\n useEffect(() => {\n const ms = getMediaSession();\n if (!enabled || !ms) return;\n ms.playbackState = state.isPaused ? \"paused\" : \"playing\";\n }, [enabled, state.isPaused]);\n\n useEffect(() => {\n const ms = getMediaSession();\n if (!enabled || !ms) return;\n try {\n ms.setActionHandler(\"play\", actions.play);\n ms.setActionHandler(\"pause\", actions.pause);\n ms.setActionHandler(\"nexttrack\", actions.next);\n ms.setActionHandler(\"previoustrack\", actions.prev);\n ms.setActionHandler(\"seekto\", (details) => {\n if (typeof details.seekTime === \"number\" && Number.isFinite(details.seekTime)) {\n actions.seek(details.seekTime);\n }\n });\n } catch {\n // Best-effort API support differs across browsers.\n }\n return () => {\n try {\n ms.setActionHandler(\"play\", null);\n ms.setActionHandler(\"pause\", null);\n ms.setActionHandler(\"nexttrack\", null);\n ms.setActionHandler(\"previoustrack\", null);\n ms.setActionHandler(\"seekto\", null);\n } catch {\n // Ignore platforms that do not support clearing handlers.\n }\n };\n }, [enabled, actions]);\n}\n","import {\n type CSSProperties,\n Children,\n type ReactElement,\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from \"react\";\nimport {\n clampPlaybackRate,\n clampVolume,\n createInitialState,\n gingerReducer,\n} from \"../core/playbackReducer\";\nimport { trackIdentity } from \"../core/queue\";\nimport { computeEndedTransition } from \"../core/transitions\";\nimport { derivePlaybackUiState } from \"../internal/selectors\";\nimport { useMediaSessionBridge } from \"../media/useMediaSession\";\nimport type {\n GingerInitPayload,\n GingerProviderProps,\n PlaybackMode,\n PlaylistMeta,\n RepeatMode,\n Track,\n} from \"../types\";\nimport { GingerContext, type GingerContextValue } from \"./GingerContext\";\nimport { GingerLocaleProvider } from \"./GingerLocaleContext\";\nimport {\n GingerMediaContext,\n type GingerMediaContextValue,\n GingerPlaybackContext,\n type GingerPlaybackContextValue,\n} from \"./GingerSplitContexts\";\n\nconst defaultProviderStyle: CSSProperties = {\n [\"--ginger-primary-color\" as string]: \"#111827\",\n [\"--ginger-muted-color\" as string]: \"#6b7280\",\n [\"--ginger-font-size\" as string]: \"14px\",\n [\"--ginger-font-family\" as string]: \"system-ui, sans-serif\",\n [\"--ginger-playlist-row-padding\" as string]: \"6px 8px\",\n [\"--ginger-artwork-radius\" as string]: \"6px\",\n [\"--ginger-artwork-bg\" as string]: \"#f3f4f6\",\n [\"--ginger-playlist-active-bg\" as string]: \"rgba(17, 24, 39, 0.06)\",\n [\"--ginger-buffer-color\" as string]: \"rgba(107, 114, 128, 0.35)\",\n [\"--ginger-focus-ring\" as string]: \"0 0 0 2px rgba(59, 130, 246, 0.45)\",\n};\n\nexport function GingerProvider({\n children,\n initialTracks = [],\n initialIndex = 0,\n initialPlaylistMeta = null,\n initialShuffle = false,\n initialRepeatMode = \"off\",\n initialPlaybackMode = \"playlist\",\n initialPaused = true,\n initialVolume = 1,\n initialMuted = false,\n initialPlaybackRate = 1,\n initialStateKey,\n locale,\n mediaSession = false,\n beforePlay,\n onPlayBlocked,\n persistence,\n hydrateOnMount = false,\n resumeOnTrackChange = false,\n unstyled = false,\n asChild = false,\n className,\n style,\n onTrackChange,\n onPlay,\n onPause,\n onQueueEnd,\n onError,\n}: GingerProviderProps) {\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const [state, dispatch] = useReducer(gingerReducer, undefined, () =>\n createInitialState({\n tracks: initialTracks,\n currentIndex: initialIndex,\n playlistMeta: initialPlaylistMeta,\n isPaused: initialPaused,\n isShuffled: initialShuffle,\n repeatMode: initialRepeatMode,\n playbackMode: initialPlaybackMode,\n volume: initialVolume,\n muted: initialMuted,\n playbackRate: initialPlaybackRate,\n }),\n );\n const stateRef = useRef(state);\n\n const latestInitRef = useRef({\n tracks: initialTracks,\n currentIndex: initialIndex,\n playlistMeta: initialPlaylistMeta,\n isPaused: initialPaused,\n isShuffled: initialShuffle,\n repeatMode: initialRepeatMode,\n playbackMode: initialPlaybackMode,\n volume: initialVolume,\n muted: initialMuted,\n playbackRate: initialPlaybackRate,\n });\n latestInitRef.current = {\n tracks: initialTracks,\n currentIndex: initialIndex,\n playlistMeta: initialPlaylistMeta,\n isPaused: initialPaused,\n isShuffled: initialShuffle,\n repeatMode: initialRepeatMode,\n playbackMode: initialPlaybackMode,\n volume: initialVolume,\n muted: initialMuted,\n playbackRate: initialPlaybackRate,\n };\n\n const prevInitialStateKeyRef = useRef<typeof initialStateKey>(undefined);\n\n useEffect(() => {\n if (initialStateKey === undefined) {\n prevInitialStateKeyRef.current = undefined;\n return;\n }\n if (prevInitialStateKeyRef.current === undefined) {\n prevInitialStateKeyRef.current = initialStateKey;\n return;\n }\n if (prevInitialStateKeyRef.current === initialStateKey) return;\n prevInitialStateKeyRef.current = initialStateKey;\n const p = latestInitRef.current;\n dispatch({\n type: \"INIT\",\n payload: {\n tracks: p.tracks,\n currentIndex: p.currentIndex,\n playlistMeta: p.playlistMeta,\n isPaused: p.isPaused,\n isShuffled: p.isShuffled,\n repeatMode: p.repeatMode,\n playbackMode: p.playbackMode,\n volume: p.volume,\n muted: p.muted,\n playbackRate: p.playbackRate,\n },\n });\n }, [initialStateKey, dispatch]);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n const currentTrack = state.tracks[state.currentIndex] ?? null;\n\n useEffect(() => {\n onTrackChange?.(currentTrack, state.currentIndex);\n }, [currentTrack, state.currentIndex, onTrackChange]);\n\n useEffect(() => {\n if (state.errorMessage) onError?.(state.errorMessage);\n }, [state.errorMessage, onError]);\n\n const prevPausedRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n if (prevPausedRef.current === undefined) {\n prevPausedRef.current = state.isPaused;\n return;\n }\n if (prevPausedRef.current !== state.isPaused) {\n if (state.isPaused) onPause?.();\n else onPlay?.();\n }\n prevPausedRef.current = state.isPaused;\n }, [state.isPaused, onPause, onPlay]);\n\n const play = useCallback(() => {\n dispatch({ type: \"PLAY\" });\n }, []);\n\n const pause = useCallback(() => {\n dispatch({ type: \"PAUSE\" });\n audioRef.current?.pause();\n }, []);\n\n const togglePlayPause = useCallback(() => {\n if (state.isPaused) play();\n else pause();\n }, [pause, play, state.isPaused]);\n\n const seek = useCallback((timeSeconds: number) => {\n const el = audioRef.current;\n if (!el) return;\n if (!Number.isFinite(timeSeconds)) return;\n el.currentTime = Math.max(0, timeSeconds);\n }, []);\n\n const setVolume = useCallback((volume: number) => {\n dispatch({ type: \"SET_VOLUME\", payload: clampVolume(volume) });\n }, []);\n\n const setMuted = useCallback((muted: boolean) => {\n dispatch({ type: \"SET_MUTED\", payload: muted });\n }, []);\n\n const toggleMute = useCallback(() => {\n dispatch({ type: \"TOGGLE_MUTE\" });\n }, []);\n\n const setPlaybackRate = useCallback((rate: number) => {\n dispatch({ type: \"SET_PLAYBACK_RATE\", payload: clampPlaybackRate(rate) });\n }, []);\n\n const next = useCallback(() => {\n dispatch({ type: \"NEXT\" });\n }, []);\n\n const prev = useCallback(() => {\n dispatch({ type: \"PREV\" });\n }, []);\n\n const setRepeatMode = useCallback((mode: RepeatMode) => {\n dispatch({ type: \"SET_REPEAT\", payload: mode });\n }, []);\n\n const cycleRepeat = useCallback(() => {\n dispatch({ type: \"CYCLE_REPEAT\" });\n }, []);\n\n const toggleShuffle = useCallback(() => {\n dispatch({ type: \"TOGGLE_SHUFFLE\" });\n }, []);\n\n const setQueue = useCallback((tracks: Track[], currentIndex?: number) => {\n dispatch({ type: \"SET_QUEUE\", payload: { tracks, currentIndex } });\n }, []);\n\n const insertTrackAt = useCallback((track: Track, index?: number, autoPlay?: boolean) => {\n dispatch({ type: \"INSERT_TRACK\", payload: { track, index, autoPlay } });\n }, []);\n\n const removeTrackAt = useCallback((index: number) => {\n dispatch({ type: \"REMOVE_TRACK\", payload: { index } });\n }, []);\n\n const moveTrack = useCallback((fromIndex: number, toIndex: number) => {\n dispatch({ type: \"MOVE_TRACK\", payload: { fromIndex, toIndex } });\n }, []);\n\n const enqueueNext = useCallback((track: Track) => {\n dispatch({ type: \"ADD_NEXT\", payload: { track } });\n }, []);\n\n const playTrackAt = useCallback((index: number) => {\n dispatch({ type: \"SET_INDEX\", payload: { index, autoPlay: true } });\n }, []);\n\n const selectTrackAt = useCallback((index: number) => {\n dispatch({ type: \"SET_INDEX\", payload: { index, autoPlay: false } });\n }, []);\n\n const setPlaylistMeta = useCallback((meta: PlaylistMeta | null) => {\n dispatch({ type: \"SET_PLAYLIST_META\", payload: meta });\n }, []);\n\n const setPlaybackMode = useCallback((mode: PlaybackMode) => {\n dispatch({ type: \"SET_PLAYBACK_MODE\", payload: mode });\n }, []);\n\n const init = useCallback((payload: GingerInitPayload) => {\n dispatch({ type: \"INIT\", payload });\n }, []);\n\n useEffect(() => {\n if (!persistence || !hydrateOnMount) return;\n const volume = persistence.get(\"ginger:volume\");\n const muted = persistence.get(\"ginger:muted\");\n const playbackRate = persistence.get(\"ginger:playbackRate\");\n const repeatMode = persistence.get(\"ginger:repeatMode\");\n const currentIndex = persistence.get(\"ginger:currentIndex\");\n const p = latestInitRef.current;\n dispatch({\n type: \"INIT\",\n payload: {\n tracks: p.tracks,\n playlistMeta: p.playlistMeta,\n isPaused: p.isPaused,\n isShuffled: p.isShuffled,\n playbackMode: p.playbackMode,\n currentIndex: typeof currentIndex === \"number\" ? currentIndex : p.currentIndex,\n repeatMode:\n repeatMode === \"off\" || repeatMode === \"all\" || repeatMode === \"one\"\n ? repeatMode\n : p.repeatMode,\n volume: typeof volume === \"number\" ? volume : p.volume,\n muted: typeof muted === \"boolean\" ? muted : p.muted,\n playbackRate: typeof playbackRate === \"number\" ? playbackRate : p.playbackRate,\n },\n });\n }, [hydrateOnMount, persistence]);\n\n useEffect(() => {\n if (!persistence) return;\n persistence.set(\"ginger:volume\", state.volume);\n persistence.set(\"ginger:muted\", state.muted);\n persistence.set(\"ginger:playbackRate\", state.playbackRate);\n persistence.set(\"ginger:repeatMode\", state.repeatMode);\n persistence.set(\"ginger:currentIndex\", state.currentIndex);\n }, [\n persistence,\n state.volume,\n state.muted,\n state.playbackRate,\n state.repeatMode,\n state.currentIndex,\n ]);\n\n useEffect(() => {\n if (!persistence || !resumeOnTrackChange) return;\n const track = state.tracks[state.currentIndex];\n if (!track) return;\n const key = `ginger:resume:${trackIdentity(track)}`;\n const saved = persistence.get(key);\n if (typeof saved === \"number\" && Number.isFinite(saved)) {\n seek(saved);\n }\n }, [persistence, resumeOnTrackChange, state.currentIndex, state.tracks, seek]);\n\n useEffect(() => {\n if (!persistence || !resumeOnTrackChange) return;\n const track = state.tracks[state.currentIndex];\n if (!track || !(state.currentTime >= 0)) return;\n const key = `ginger:resume:${trackIdentity(track)}`;\n const id = setTimeout(() => persistence.set(key, state.currentTime), 250);\n return () => clearTimeout(id);\n }, [persistence, resumeOnTrackChange, state.currentIndex, state.tracks, state.currentTime]);\n\n const currentUrl = state.tracks[state.currentIndex]?.fileUrl;\n\n useEffect(() => {\n const el = audioRef.current;\n if (!el) return;\n if (state.isPaused) {\n el.pause();\n return;\n }\n let cancelled = false;\n void (async () => {\n if (beforePlay) {\n let allowed = false;\n try {\n allowed = await beforePlay();\n } catch (error) {\n const message = error instanceof Error ? error.message : \"beforePlay rejected\";\n dispatch({ type: \"MEDIA_ERROR\", payload: { message } });\n return;\n }\n if (!allowed) {\n if (!cancelled) {\n dispatch({ type: \"PAUSE\" });\n onPlayBlocked?.();\n }\n return;\n }\n }\n if (cancelled) return;\n void el.play().catch((e: unknown) => {\n const msg =\n e instanceof Error\n ? e.message\n : typeof e === \"string\"\n ? e\n : \"Playback failed (e.g. autoplay blocked or unavailable source)\";\n dispatch({ type: \"MEDIA_ERROR\", payload: { message: msg } });\n });\n })();\n return () => {\n cancelled = true;\n };\n }, [beforePlay, currentUrl, onPlayBlocked, state.isPaused]);\n\n const notifyEnded = useCallback(() => {\n const transition = computeEndedTransition(stateRef.current);\n if (transition.kind === \"replay_same\") {\n const el = audioRef.current;\n if (el) {\n el.currentTime = 0;\n }\n dispatch({ type: \"PLAY\" });\n return;\n }\n if (transition.kind === \"stop\") {\n dispatch({ type: \"PAUSE\" });\n onQueueEnd?.();\n return;\n }\n const nextIndex = transition.nextIndex;\n dispatch({ type: \"SET_INDEX\", payload: { index: nextIndex, autoPlay: true } });\n }, [onQueueEnd]);\n\n const mediaSessionActions = useMemo(\n () => ({ play, pause, next, prev, seek }),\n [play, pause, next, prev, seek],\n );\n useMediaSessionBridge(Boolean(mediaSession), state, mediaSessionActions);\n\n const providerDir = locale?.seek && /[\\u0590-\\u08FF]/.test(locale.seek) ? \"rtl\" : \"ltr\";\n\n const value = useMemo<GingerContextValue>(\n () => ({\n state,\n dispatch,\n audioRef,\n notifyEnded,\n init,\n play,\n pause,\n togglePlayPause,\n seek,\n setVolume,\n setMuted,\n toggleMute,\n setPlaybackRate,\n next,\n prev,\n setRepeatMode,\n cycleRepeat,\n toggleShuffle,\n setQueue,\n insertTrackAt,\n removeTrackAt,\n moveTrack,\n enqueueNext,\n playTrackAt,\n selectTrackAt,\n setPlaylistMeta,\n setPlaybackMode,\n }),\n [\n cycleRepeat,\n dispatch,\n init,\n next,\n notifyEnded,\n pause,\n play,\n playTrackAt,\n insertTrackAt,\n removeTrackAt,\n moveTrack,\n enqueueNext,\n selectTrackAt,\n prev,\n seek,\n setMuted,\n setPlaybackRate,\n setQueue,\n setRepeatMode,\n setPlaylistMeta,\n setPlaybackMode,\n setVolume,\n state,\n toggleMute,\n togglePlayPause,\n toggleShuffle,\n ],\n );\n\n const playbackValue = useMemo<GingerPlaybackContextValue>(\n () => ({\n tracks: state.tracks,\n currentIndex: state.currentIndex,\n isPaused: state.isPaused,\n isShuffled: state.isShuffled,\n repeatMode: state.repeatMode,\n originalTracks: state.originalTracks,\n playlistMeta: state.playlistMeta,\n init,\n play,\n pause,\n togglePlayPause,\n next,\n prev,\n setRepeatMode,\n cycleRepeat,\n toggleShuffle,\n playbackMode: state.playbackMode,\n setQueue,\n insertTrackAt,\n removeTrackAt,\n moveTrack,\n enqueueNext,\n playTrackAt,\n selectTrackAt,\n setPlaylistMeta,\n setPlaybackMode,\n dispatch,\n }),\n [\n state.tracks,\n state.currentIndex,\n state.isPaused,\n state.isShuffled,\n state.repeatMode,\n state.playbackMode,\n state.originalTracks,\n state.playlistMeta,\n init,\n play,\n pause,\n togglePlayPause,\n next,\n prev,\n setRepeatMode,\n cycleRepeat,\n toggleShuffle,\n setQueue,\n insertTrackAt,\n removeTrackAt,\n moveTrack,\n enqueueNext,\n playTrackAt,\n selectTrackAt,\n setPlaylistMeta,\n setPlaybackMode,\n dispatch,\n ],\n );\n\n const mediaValue = useMemo<GingerMediaContextValue>(\n () => ({\n currentTime: state.currentTime,\n duration: state.duration,\n bufferedFraction: state.bufferedFraction,\n isBuffering: state.isBuffering,\n errorMessage: state.errorMessage,\n volume: state.volume,\n muted: state.muted,\n playbackRate: state.playbackRate,\n seek,\n setVolume,\n setMuted,\n toggleMute,\n setPlaybackRate,\n audioRef,\n notifyEnded,\n dispatch,\n }),\n [\n state.currentTime,\n state.duration,\n state.bufferedFraction,\n state.isBuffering,\n state.errorMessage,\n state.volume,\n state.muted,\n state.playbackRate,\n seek,\n setVolume,\n setMuted,\n toggleMute,\n setPlaybackRate,\n audioRef,\n notifyEnded,\n dispatch,\n ],\n );\n\n const playbackUi = derivePlaybackUiState(state);\n\n const mergedStyle = useMemo(\n () => (unstyled ? style : { ...defaultProviderStyle, ...style }),\n [style, unstyled],\n );\n\n const shellProps = useMemo(\n () => ({\n className,\n style: mergedStyle,\n \"data-ginger-playback\": playbackUi,\n dir: providerDir,\n }),\n [className, mergedStyle, playbackUi, providerDir],\n );\n\n const shell = useMemo(() => {\n if (!asChild) {\n return (\n <div\n className={shellProps.className}\n style={shellProps.style}\n data-ginger-playback={shellProps[\"data-ginger-playback\"]}\n dir={shellProps.dir}\n >\n {children}\n </div>\n );\n }\n const only = Children.only(children);\n if (!isValidElement(only)) {\n throw new Error(\"Ginger.Provider asChild expects a single React element child.\");\n }\n const child = only as ReactElement<{ className?: string; style?: CSSProperties }>;\n const childStyle = child.props.style;\n return cloneElement(child as ReactElement<Record<string, unknown>>, {\n className: mergeClassNames(child.props.className, shellProps.className),\n style:\n childStyle && typeof childStyle === \"object\"\n ? { ...childStyle, ...shellProps.style }\n : shellProps.style,\n \"data-ginger-playback\": shellProps[\"data-ginger-playback\"],\n dir: shellProps.dir,\n });\n }, [asChild, children, shellProps]);\n\n return (\n <GingerLocaleProvider locale={locale}>\n <GingerPlaybackContext.Provider value={playbackValue}>\n <GingerMediaContext.Provider value={mediaValue}>\n <GingerContext.Provider value={value}>{shell}</GingerContext.Provider>\n </GingerMediaContext.Provider>\n </GingerPlaybackContext.Provider>\n </GingerLocaleProvider>\n );\n}\n\nfunction mergeClassNames(a?: string, b?: string): string | undefined {\n const merged = [a, b].filter(Boolean).join(\" \");\n return merged === \"\" ? undefined : merged;\n}\n","import { GingerPlayer } from \"./audio/GingerPlayer\";\nimport * as Control from \"./components/controls/Controls\";\nimport * as Current from \"./components/current\";\nimport { GingerPlaylistCompound } from \"./components/playlist/GingerPlaylist\";\nimport * as Queue from \"./components/queue/QueueDisplay\";\nimport { GingerProvider } from \"./context/GingerProvider\";\n\nexport const Ginger = {\n Provider: GingerProvider,\n Player: GingerPlayer,\n Current: {\n Title: Current.Title,\n Artist: Current.Artist,\n Album: Current.Album,\n Description: Current.Description,\n Copyright: Current.Copyright,\n Genre: Current.Genre,\n Label: Current.Label,\n Isrc: Current.Isrc,\n TrackNumber: Current.TrackNumber,\n Year: Current.Year,\n Lyrics: Current.Lyrics,\n LyricsSynced: Current.LyricsSynced,\n Chapters: Current.Chapters,\n FileUrl: Current.FileUrl,\n Artwork: Current.Artwork,\n QueueIndex: Current.QueueIndex,\n QueueLength: Current.QueueLength,\n QueuePosition: Current.QueuePosition,\n Elapsed: Current.Elapsed,\n Duration: Current.Duration,\n Remaining: Current.Remaining,\n Progress: Current.Progress,\n TimeRail: Current.TimeRail,\n BufferRail: Current.BufferRail,\n PlaybackState: Current.PlaybackState,\n ErrorMessage: Current.ErrorMessage,\n },\n Queue: {\n Title: Queue.Title,\n Subtitle: Queue.Subtitle,\n Description: Queue.Description,\n Copyright: Queue.Copyright,\n Artwork: Queue.Artwork,\n },\n Control: {\n PlayPause: Control.PlayPause,\n Repeat: Control.Repeat,\n Next: Control.Next,\n Previous: Control.Previous,\n Shuffle: Control.Shuffle,\n SeekBar: Control.SeekBar,\n Volume: Control.Volume,\n Mute: Control.Mute,\n PlaybackRate: Control.PlaybackRate,\n },\n Playlist: GingerPlaylistCompound,\n};\n"],"names":["GingerContext","createContext","useGingerContext","ctx","useContext","readBufferedFraction","el","buffered","duration","GingerPlayer","className","style","preload","crossOrigin","respectReducedMotion","audioRef","dispatch","state","notifyEnded","url","_a","lastTimeSnapshotRef","useRef","lastActiveUrlRef","reducedMotion","setReducedMotion","useState","useEffect","mql","sync","syncTime","force","next","prev","timeThreshold","changedEnough","jsx","e","code","defaultGingerLocale","rate","mergeLocale","partial","GingerLocaleContext","GingerLocaleProvider","locale","children","value","useGingerLocale","formatMmSs","seconds","s","clampIndex","index","length","shuffleWithAnchor","tracks","anchorIndex","anchor","rest","_","i","j","trackIdentity","track","findIndexByTrackIdentity","target","byRef","t","identity","matches","nodeEnv","_b","insertTrackAt","at","removeTrackAt","moveTrack","fromIndex","toIndex","item","addNextTrack","currentIndex","computeEndedTransition","repeatMode","playbackMode","len","computeNextIndex","computePrevIndex","cycleRepeatMode","mode","resolveArtworkUrl","playlistArtwork","resolveAlbumLine","playlistSubtitle","getCurrentTrack","derivePlaybackUiState","effectiveDuration","d","hint","effectiveRemaining","rem","progressFraction","dur","resolvedArtwork","resolvedAlbumLine","useSeekBarBinding","pb","useGingerPlayback","md","useGingerMedia","useMemo","gingerStateFromContextValues","numericValue","ariaValueText","onSeekInput","useVolumeSlider","onVolumeInput","usePlayPauseBinding","options","playL","pauseL","PlayPause","playLabel","pauseLabel","playAriaLabel","pauseAriaLabel","type","onClick","defaultPlayAria","defaultPauseAria","b","Repeat","ariaLabel","cycleRepeat","label","Next","Previous","Shuffle","isShuffled","toggleShuffle","SeekBar","inputStyle","unstyled","mergedStyle","Volume","Mute","muteLabel","unmuteLabel","muted","toggleMute","u","defaultRates","PlaybackRate","rates","playbackRate","setPlaybackRate","a","r","createTextDisplay","displayName","select","Comp","props","useGingerState","fallback","empty","node","createTrackFieldDisplay","Title","Artist","Album","Description","Copyright","Genre","Label","Isrc","TrackNumber","Year","format","y","text","Lyrics","preserveWhitespace","raw","whiteStyle","lrcTag","parseLrc","lrc","lines","rawLine","m","minutes","millis","time","useGingerLyricsSync","currentTime","currentTrack","line","activeIndex","LyricsSynced","activeClassName","lineClassName","listStyle","active","useGingerChapters","seek","list","chapter","Chapters","formatStart","seekTo","jsxs","Fragment","FileUrl","visible","Artwork","sizes","loading","onError","decoding","imgStyle","src","alt","QueueIndex","base","QueueLength","QueuePosition","separator","renderTime","valueSeconds","Elapsed","Duration","Remaining","Progress","fraction","TimeRail","height","showBuffered","progressPct","bufPct","BufferRail","PlaybackState","ErrorMessage","live","GingerPlaylistConfigContext","usePlaylistConfig","GingerPlaylist","rowStyle","renderTrack","playOnSelect","playTrackAt","selectTrackAt","GingerPlaylistTrack","liProps","buttonRest","defaultLabel","GingerPlaylistCompound","Subtitle","clampVolume","v","clampPlaybackRate","resetTimingOnly","defaultMedia","createInitialState","params","originalTracks","ordered","gingerReducer","action","playlistMeta","isPaused","volume","idx","insertIndex","ap","snapshot","shuffled","restored","current","newIndex","nextIndex","same","prevIndex","getMediaSession","useMediaSessionBridge","enabled","actions","title","artist","album","artworkUrl","ms","details","defaultProviderStyle","GingerProvider","initialTracks","initialIndex","initialPlaylistMeta","initialShuffle","initialRepeatMode","initialPlaybackMode","initialPaused","initialVolume","initialMuted","initialPlaybackRate","initialStateKey","mediaSession","beforePlay","onPlayBlocked","persistence","hydrateOnMount","resumeOnTrackChange","asChild","onTrackChange","onPlay","onPause","onQueueEnd","useReducer","stateRef","latestInitRef","prevInitialStateKeyRef","p","prevPausedRef","play","useCallback","pause","togglePlayPause","timeSeconds","setVolume","setMuted","setRepeatMode","setQueue","autoPlay","enqueueNext","setPlaylistMeta","meta","setPlaybackMode","init","payload","key","saved","id","currentUrl","cancelled","allowed","error","message","msg","transition","mediaSessionActions","providerDir","playbackValue","mediaValue","playbackUi","shellProps","shell","only","Children","isValidElement","child","childStyle","cloneElement","mergeClassNames","GingerPlaybackContext","GingerMediaContext","merged","Ginger","Current.Title","Current.Artist","Current.Album","Current.Description","Current.Copyright","Current.Genre","Current.Label","Current.Isrc","Current.TrackNumber","Current.Year","Current.Lyrics","Current.LyricsSynced","Current.Chapters","Current.FileUrl","Current.Artwork","Current.QueueIndex","Current.QueueLength","Current.QueuePosition","Current.Elapsed","Current.Duration","Current.Remaining","Current.Progress","Current.TimeRail","Current.BufferRail","Current.PlaybackState","Current.ErrorMessage","Queue.Title","Queue.Subtitle","Queue.Description","Queue.Copyright","Queue.Artwork","Control.PlayPause","Control.Repeat","Control.Next","Control.Previous","Control.Shuffle","Control.SeekBar","Control.Volume","Control.Mute","Control.PlaybackRate"],"mappings":"qHA0CMA,GAAgBC,EAAAA,cAAyC,IAAI,EAE5D,SAASC,IAAuC,CACrD,MAAMC,EAAMC,EAAAA,WAAWJ,EAAa,EACpC,GAAI,CAACG,EAAK,MAAM,IAAI,MAAM,yDAAyD,EACnF,OAAOA,CACT,CCrCA,SAASE,GAAqBC,EAA8B,CAC1D,KAAM,CAAE,SAAAC,EAAU,SAAAC,CAAA,EAAaF,EAC/B,MAAI,EAAEE,EAAW,IAAMD,EAAS,SAAW,EAAU,EAC9C,KAAK,IAAI,EAAGA,EAAS,IAAIA,EAAS,OAAS,CAAC,EAAIC,CAAQ,CACjE,CAEO,SAASC,GAAa,CAC3B,UAAAC,EACA,MAAAC,EACA,QAAAC,EAAU,WACV,YAAAC,EACA,qBAAAC,EAAuB,EACzB,EAAsB,OACpB,KAAM,CAAE,SAAAC,EAAU,SAAAC,EAAU,MAAAC,EAAO,YAAAC,CAAA,EAAgBhB,GAAA,EAC7CiB,IAAMC,EAAAH,EAAM,OAAOA,EAAM,YAAY,IAA/B,YAAAG,EAAkC,UAAW,GACnDC,EAAsBC,EAAAA,OAAO,CACjC,YAAa,GACb,SAAU,GACV,iBAAkB,EAAA,CACnB,EAEKC,EAAmBD,EAAAA,OAAO,EAAE,EAE5B,CAACE,EAAeC,CAAgB,EAAIC,EAAAA,SAAS,EAAK,EAExDC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACb,GAAwB,OAAO,OAAW,IAAa,OAC5D,MAAMc,EAAM,OAAO,WAAW,kCAAkC,EAC1DC,EAAO,IAAMJ,EAAiBG,EAAI,OAAO,EAC/C,OAAAC,EAAA,EACAD,EAAI,iBAAiB,SAAUC,CAAI,EAC5B,IAAMD,EAAI,oBAAoB,SAAUC,CAAI,CACrD,EAAG,CAACf,CAAoB,CAAC,EAEzB,MAAMgB,EAAW,CAACxB,EAAsByB,EAAQ,KAAU,CACxD,MAAMC,EAAO,CACX,YAAa1B,EAAG,YAChB,SAAUA,EAAG,SACb,iBAAkBD,GAAqBC,CAAE,CAAA,EAErC2B,EAAOZ,EAAoB,QAC3Ba,EAAgBV,EAAgB,GAAM,IACtCW,EACJ,KAAK,IAAIH,EAAK,YAAcC,EAAK,WAAW,GAAKC,GACjD,KAAK,IAAIF,EAAK,SAAWC,EAAK,QAAQ,GAAK,KAC3C,KAAK,IAAID,EAAK,iBAAmBC,EAAK,gBAAgB,GAAK,IACzD,CAACF,GAAS,CAACI,IACfd,EAAoB,QAAUW,EAC9BhB,EAAS,CACP,KAAM,oBACN,QAASgB,CAAA,CACV,EACH,EAEAL,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMrB,EAAKS,EAAS,QACfT,IACLA,EAAG,OAASW,EAAM,OAClBX,EAAG,MAAQW,EAAM,MACnB,EAAG,CAACF,EAAUE,EAAM,OAAQA,EAAM,KAAK,CAAC,EAExCU,EAAAA,UAAU,IAAM,CACd,MAAMrB,EAAKS,EAAS,QACpB,GAAKT,EACL,IAAI,CAACa,EAAK,CACRb,EAAG,gBAAgB,KAAK,EACxBe,EAAoB,QAAU,CAAE,YAAa,GAAI,SAAU,GAAI,iBAAkB,EAAA,EAC7EE,EAAiB,UAAY,IAC/BP,EAAS,CAAE,KAAM,uBAAwB,EAE3CO,EAAiB,QAAU,GAC3B,MACF,CACIjB,EAAG,aAAa,KAAK,IAAMa,IAC7Bb,EAAG,IAAMa,EACTb,EAAG,KAAA,EACHe,EAAoB,QAAU,CAAE,YAAa,GAAI,SAAU,GAAI,iBAAkB,EAAA,GAEnFE,EAAiB,QAAUJ,EAC7B,EAAG,CAACJ,EAAUC,EAAUC,EAAM,aAAcA,EAAM,OAAQE,CAAG,CAAC,EAE9DQ,EAAAA,UAAU,IAAM,CACd,MAAMrB,EAAKS,EAAS,QACfT,IAELA,EAAG,aAAeW,EAAM,aAC1B,EAAG,CAACF,EAAUE,EAAM,aAAcE,CAAG,CAAC,EAGpCiB,EAAAA,IAAC,QAAA,CACC,wBAAsB,SACtB,IAAKrB,EACL,UAAAL,EACA,MAAAC,EACA,QAAAC,EACA,YAAAC,EACA,SAAU,GACV,YAAW,GACX,aAAewB,GAAM,CACnBP,EAASO,EAAE,aAAa,CAC1B,EACA,iBAAmBA,GAAM,CACvB,MAAM/B,EAAK+B,EAAE,cACbhB,EAAoB,QAAU,CAAE,YAAa,GAAI,SAAU,GAAI,iBAAkB,EAAA,EACjFL,EAAS,CACP,KAAM,wBACN,QAAS,CACP,SAAUV,EAAG,SACb,iBAAkBD,GAAqBC,CAAE,CAAA,CAC3C,CACD,CACH,EACA,UAAY+B,GAAMP,EAASO,EAAE,cAAe,EAAI,EAChD,SAAWA,GAAMP,EAASO,EAAE,cAAe,EAAI,EAC/C,QAAS,IAAMnB,EAAA,EACf,OAAQ,IAAMF,EAAS,CAAE,KAAM,aAAc,EAC7C,QAAS,IAAMA,EAAS,CAAE,KAAM,cAAe,EAC/C,UAAW,IAAMA,EAAS,CAAE,KAAM,gBAAiB,EACnD,UAAW,IAAMA,EAAS,CAAE,KAAM,gBAAiB,EACnD,WAAaqB,GAAMP,EAASO,EAAE,cAAe,EAAI,EACjD,eAAiBA,GAAM,CACrB,MAAM/B,EAAK+B,EAAE,cACbrB,EAAS,CACP,KAAM,oBACN,QAAS,CAAE,OAAQV,EAAG,OAAQ,MAAOA,EAAG,KAAA,CAAM,CAC/C,CACH,EACA,QAAS,IAAM,OACb,MAAMA,EAAKS,EAAS,QACduB,GAAOlB,EAAAd,GAAA,YAAAA,EAAI,QAAJ,YAAAc,EAAW,KAWxBJ,EAAS,CAAE,KAAM,cAAe,QAAS,CAAE,QATzCsB,IAAS,EACL,oBACAA,IAAS,EACP,oBACAA,IAAS,EACP,mBACAA,IAAS,EACP,8BACA,mBAC+B,EAAW,CACxD,CAAA,CAAA,CAGN,CCxJO,MAAMC,EAA4C,CACvD,KAAM,OACN,OAAQ,SACR,cAAe,iBACf,aAAc,WACd,iBAAkB,gBAClB,UAAW,aACX,cAAe,iBACf,QAAS,UACT,KAAM,OACN,OAAQ,SACR,KAAM,OACN,MAAO,QACP,OAAQ,CACN,IAAK,aACL,IAAK,aACL,IAAK,YAAA,EAEP,mBAAoB,YACpB,kBAAoBC,GAAS,GAAGA,CAAI,GACtC,EAEA,SAASC,GAAYC,EAA+D,CAClF,OAAKA,EACE,CACL,GAAGH,EACH,GAAGG,EACH,OAAQ,CAAE,GAAGH,EAAoB,OAAQ,GAAGG,EAAQ,MAAA,CAAO,EAJxCH,CAMvB,CAEA,MAAMI,GAAsB1C,EAAAA,cAAoCsC,CAAmB,EAE5E,SAASK,GAAqB,CACnC,OAAAC,EACA,SAAAC,CACF,EAGG,CACD,MAAMC,EAAQN,GAAYI,CAAM,EAChC,OAAOT,EAAAA,IAACO,GAAoB,SAApB,CAA6B,MAAAI,EAAe,SAAAD,CAAA,CAAS,CAC/D,CAEO,SAASE,GAAwC,CACtD,OAAO5C,EAAAA,WAAWuC,EAAmB,CACvC,CCjDO,SAASM,EAAWC,EAAyB,CAClD,GAAI,CAAC,OAAO,SAASA,CAAO,GAAKA,EAAU,EAAG,MAAO,OACrD,MAAMC,EAAI,KAAK,MAAMD,EAAU,EAAE,EAEjC,MAAO,GADG,KAAK,MAAMA,EAAU,EAAE,CACtB,IAAIC,EAAE,WAAW,SAAS,EAAG,GAAG,CAAC,EAC9C,CCHO,SAASC,EAAWC,EAAeC,EAAwB,CAChE,OAAIA,GAAU,EAAU,EACjB,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAS,EAAGD,CAAK,CAAC,CAChD,CAEO,SAASE,GAAkBC,EAAiBC,EAA8B,CAC/E,GAAID,EAAO,QAAU,EAAG,MAAO,CAAC,GAAGA,CAAM,EACzC,MAAME,EAASF,EAAOC,CAAW,EACjC,GAAI,CAACC,EAAQ,MAAO,CAAC,GAAGF,CAAM,EAC9B,MAAMG,EAAOH,EAAO,OAAO,CAACI,EAAG,IAAM,IAAMH,CAAW,EACtD,QAASI,EAAIF,EAAK,OAAS,EAAGE,EAAI,EAAGA,IAAK,CACxC,MAAMC,EAAI,KAAK,MAAM,KAAK,UAAYD,EAAI,EAAE,EAC5C,CAACF,EAAKE,CAAC,EAAGF,EAAKG,CAAC,CAAC,EAAI,CAACH,EAAKG,CAAC,EAAIH,EAAKE,CAAC,CAAE,CAC1C,CACA,MAAO,CAACH,EAAQ,GAAGC,CAAI,CACzB,CAEO,SAASI,EAAcC,EAAyC,CACrE,OAAKA,EACEA,EAAM,IAAM,MAAQA,EAAM,KAAO,GAAK,MAAMA,EAAM,EAAE,GAAK,QAAQA,EAAM,OAAO,GADlE,EAErB,CAEO,SAASC,GACdT,EACAU,EACQ,SACR,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAMC,EAAQX,EAAO,UAAWY,GAAMA,IAAMF,CAAM,EAClD,GAAIC,IAAU,GAAI,OAAOA,EAEzB,MAAME,EAAWN,EAAcG,CAAM,EACrC,GAAI,CAACG,EAAU,MAAO,GAEtB,MAAMC,EAAoB,CAAA,EAC1B,QAAST,EAAI,EAAGA,EAAIL,EAAO,OAAQK,GAAK,EAClCE,EAAcP,EAAOK,CAAC,CAAC,IAAMQ,GAAUC,EAAQ,KAAKT,CAAC,EAE3D,GAAIS,EAAQ,SAAW,EAAG,MAAO,GACjC,GAAIA,EAAQ,SAAW,EAAG,OAAOA,EAAQ,CAAC,EAE1C,MAAMC,EACJ,OAAO,WAAe,KAAe,YAAa,YAC7CC,GAAApD,EAAA,WAA6D,UAA7D,YAAAA,EAAsE,MAAtE,YAAAoD,EAA2E,SAC5E,OACN,OAAID,GAAW,MAAQA,IAAY,cACjC,QAAQ,KACN,kJAAA,EAGGD,EAAQ,CAAC,CAClB,CAEO,SAASG,GAAcjB,EAAiBQ,EAAcX,EAAyB,CACpF,MAAMrB,EAAO,CAAC,GAAGwB,CAAM,EACjBkB,EAAK,KAAK,IAAI,EAAG,KAAK,IAAI1C,EAAK,OAAQqB,GAASrB,EAAK,MAAM,CAAC,EAClE,OAAAA,EAAK,OAAO0C,EAAI,EAAGV,CAAK,EACjBhC,CACT,CAEO,SAAS2C,GAAcnB,EAAiBH,EAAwB,CACrE,GAAIA,EAAQ,GAAKA,GAASG,EAAO,OAAQ,MAAO,CAAC,GAAGA,CAAM,EAC1D,MAAMxB,EAAO,CAAC,GAAGwB,CAAM,EACvB,OAAAxB,EAAK,OAAOqB,EAAO,CAAC,EACbrB,CACT,CAEO,SAAS4C,GAAUpB,EAAiBqB,EAAmBC,EAA0B,CACtF,GACED,IAAcC,GACdD,EAAY,GACZA,GAAarB,EAAO,QACpBsB,EAAU,GACVA,GAAWtB,EAAO,OAElB,MAAO,CAAC,GAAGA,CAAM,EAEnB,MAAMxB,EAAO,CAAC,GAAGwB,CAAM,EACjB,CAACuB,CAAI,EAAI/C,EAAK,OAAO6C,EAAW,CAAC,EACvC,OAAKE,GACL/C,EAAK,OAAO8C,EAAS,EAAGC,CAAI,EACrB/C,GAFW,CAAC,GAAGwB,CAAM,CAG9B,CAEO,SAASwB,GAAaxB,EAAiByB,EAAsBjB,EAAuB,CACzF,OAAOS,GAAcjB,EAAQQ,EAAO,KAAK,IAAI,EAAG,KAAK,IAAIR,EAAO,OAAQyB,EAAe,CAAC,CAAC,CAAC,CAC5F,CCxEO,SAASC,GAAuBjE,EAAuD,CAC5F,KAAM,CAAE,OAAAuC,EAAQ,aAAAyB,EAAc,WAAAE,EAAY,aAAAC,GAAiBnE,EACrDoE,EAAM7B,EAAO,OACnB,OAAI6B,IAAQ,EAAU,CAAE,KAAM,OAAQ,UAAW,CAAA,EAC7CF,IAAe,MAAc,CAAE,KAAM,aAAA,EACrCC,IAAiB,SAAiB,CAAE,KAAM,OAAQ,UAAWhC,EAAW6B,EAAcI,CAAG,CAAA,EACzFJ,EAAeI,EAAM,EAAU,CAAE,KAAM,UAAW,UAAWJ,EAAe,CAAA,EAC5EE,IAAe,MAAc,CAAE,KAAM,OAAQ,UAAW,CAAA,EACrD,CAAE,KAAM,OAAQ,UAAW/B,EAAW6B,EAAcI,CAAG,CAAA,CAChE,CAEO,SAASC,GAAiBrE,EAA8C,CAC7E,KAAM,CAAE,OAAAuC,EAAQ,aAAAyB,EAAc,WAAAE,EAAY,aAAAC,GAAiBnE,EACrDoE,EAAM7B,EAAO,OACnB,OAAI6B,IAAQ,EAAU,EAClBD,IAAiB,SAAiBhC,EAAW6B,EAAcI,CAAG,EAC9DJ,EAAeI,EAAM,EAAUJ,EAAe,EAC9CE,IAAe,MAAc,EAC1B/B,EAAW6B,EAAcI,CAAG,CACrC,CAEO,SAASE,GAAiBtE,EAA8C,CAC7E,KAAM,CAAE,OAAAuC,EAAQ,aAAAyB,EAAc,WAAAE,EAAY,aAAAC,GAAiBnE,EACrDoE,EAAM7B,EAAO,OACnB,OAAI6B,IAAQ,EAAU,EAClBD,IAAiB,SAAiBhC,EAAW6B,EAAcI,CAAG,EAC9DJ,EAAe,EAAUA,EAAe,EACxCE,IAAe,MAAcE,EAAM,EAChC,CACT,CAEO,SAASG,GAAgBC,EAA8B,CAC5D,OAAIA,IAAS,MAAc,MACvBA,IAAS,MAAc,MACpB,KACT,CAEO,SAASC,GACd1B,EACA2B,EACoB,CACpB,OAAO3B,GAAA,YAAAA,EAAO,aAAc2B,GAAmB,MACjD,CAEO,SAASC,GACd5B,EACA6B,EACoB,CACpB,OAAO7B,GAAA,YAAAA,EAAO,QAAS6B,GAAoB,MAC7C,CC7DO,SAASC,EAAgB7E,EAAkC,CAEhE,OADUA,EAAM,OAAOA,EAAM,YAAY,GAC7B,IACd,CAEO,SAAS8E,GAAsB9E,EAAqC,CACzE,OAAIA,EAAM,aAAqB,QAC3BA,EAAM,OAAO,SAAW,EAAU,OAClCA,EAAM,YAAoB,UACzBA,EAAM,SAET,OAAO,SAASA,EAAM,QAAQ,GAC9BA,EAAM,SAAW,GACjBA,EAAM,aAAeA,EAAM,SAAW,IAE/B,QAEF,SARqB,SAS9B,CAEO,SAAS+E,EAAkB/E,EAA4B,OAC5D,MAAMgF,EAAIhF,EAAM,SAChB,GAAI,OAAO,SAASgF,CAAC,GAAKA,EAAI,EAAG,OAAOA,EACxC,MAAMC,GAAO9E,EAAAH,EAAM,OAAOA,EAAM,YAAY,IAA/B,YAAAG,EAAkC,gBAC/C,OAAI,OAAO8E,GAAS,UAAY,OAAO,SAASA,CAAI,GAAKA,EAAO,EAAUA,EACnE,CACT,CAEO,SAASC,GAAmBlF,EAA4B,CAE7D,MAAMmF,EADMJ,EAAkB/E,CAAK,EACjBA,EAAM,YACxB,OAAO,OAAO,SAASmF,CAAG,EAAI,KAAK,IAAI,EAAGA,CAAG,EAAI,CACnD,CAEO,SAASC,GAAiBpF,EAA4B,CAC3D,MAAMqF,EAAMN,EAAkB/E,CAAK,EACnC,OAAMqF,EAAM,EACL,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGrF,EAAM,YAAcqF,CAAG,CAAC,EADhC,CAEzB,CAEO,SAASC,GAAgBtF,EAAwC,OACtE,MAAM+C,EAAQ8B,EAAgB7E,CAAK,EACnC,OAAOyE,GAAkB1B,GAAO5C,EAAAH,EAAM,eAAN,YAAAG,EAAoB,UAAU,CAChE,CAEO,SAASoF,GAAkBvF,EAAwC,OACxE,MAAM+C,EAAQ8B,EAAgB7E,CAAK,EACnC,OAAO2E,GAAiB5B,GAAO5C,EAAAH,EAAM,eAAN,YAAAG,EAAoB,QAAQ,CAC7D,CC1BO,SAASqF,IAAoC,CAClD,MAAMC,EAAKC,EAAAA,kBAAA,EACLC,EAAKC,EAAAA,eAAA,EACLhE,EAASG,EAAA,EACT/B,EAAQ6F,UAAQ,IAAMC,+BAA6BL,EAAIE,CAAE,EAAG,CAACF,EAAIE,CAAE,CAAC,EACpEpG,EAAWwF,EAAkB/E,CAAK,EAClC8B,EAAQvC,EAAW,EAAIS,EAAM,YAAc,EAC3C+F,EAAe,OAAO,SAASjE,CAAK,EAAIA,EAAQ,EAChDkE,EACJzG,EAAW,EACP,GAAGyC,EAAW+D,CAAY,CAAC,OAAO/D,EAAWzC,CAAQ,CAAC,GACtDyC,EAAW+D,CAAY,EAEvBE,EAAe7E,GAAmC,CACtDuE,EAAG,KAAK,OAAOvE,EAAE,cAAc,KAAK,CAAC,CACvC,EAEA,MAAO,CACL,MAAApB,EACA,MAAO+F,EACP,IAAK,EACL,IAAKxG,EAAW,EAAIA,EAAW,EAC/B,KAAM,MACN,cAAAyG,EACA,UAAWpE,EAAO,KAClB,YAAAqE,EACA,aAAcA,CAAA,CAElB,CAeO,SAASC,IAAiC,CAC/C,MAAMT,EAAKC,EAAAA,kBAAA,EACLC,EAAKC,EAAAA,eAAA,EACLhE,EAASG,EAAA,EACT/B,EAAQ6F,UAAQ,IAAMC,+BAA6BL,EAAIE,CAAE,EAAG,CAACF,EAAIE,CAAE,CAAC,EAEpEQ,EAAiB/E,GAAmC,CACxDuE,EAAG,UAAU,OAAOvE,EAAE,cAAc,KAAK,CAAC,CAC5C,EAEA,MAAO,CACL,MAAApB,EACA,MAAOA,EAAM,OACb,IAAK,EACL,IAAK,EACL,KAAM,MACN,cAAe,GAAG,KAAK,MAAMA,EAAM,OAAS,GAAG,CAAC,IAChD,UAAW4B,EAAO,OAClB,cAAAuE,EACA,eAAgBA,CAAA,CAEpB,CAUO,SAASC,GAAoBC,EAGf,CACnB,MAAMZ,EAAKC,EAAAA,kBAAA,EACL9D,EAASG,EAAA,EACTuE,GAAQD,GAAA,YAAAA,EAAS,gBAAiBzE,EAAO,KACzC2E,GAASF,GAAA,YAAAA,EAAS,iBAAkBzE,EAAO,MACjD,MAAO,CACL,SAAU6D,EAAG,SACb,OAAQA,EAAG,gBACX,UAAWA,EAAG,SAAWa,EAAQC,CAAA,CAErC,CClFO,SAASC,GAAU,CACxB,UAAAC,EAAY,OACZ,WAAAC,EAAa,QACb,cAAAC,EACA,eAAAC,EACA,SAAA/E,EACA,KAAAgF,EAAO,SACP,QAAAC,EACA,GAAGpE,CACL,EAAmB,CACjB,MAAMd,EAASG,EAAA,EACTgF,EACJ,OAAON,GAAc,SAAWA,EAAY7E,EAAO,KAC/CoF,EACJ,OAAON,GAAe,SAAWA,EAAa9E,EAAO,MACjDqF,EAAIb,GAAoB,CAC5B,cAAeO,GAAiBI,EAChC,eAAgBH,GAAkBI,CAAA,CACnC,EACD,OACE7F,EAAAA,IAAC,SAAA,CACC,wBAAsB,YACrB,GAAGuB,EACJ,KAAAmE,EACA,aAAYI,EAAE,UACd,QAAU7F,GAAM,CACd6F,EAAE,OAAA,EACFH,GAAA,MAAAA,EAAU1F,EACZ,EAEC,SAAAS,IAAaoF,EAAE,SAAWR,EAAYC,EAAA,CAAA,CAG7C,CAEAF,GAAU,YAAc,2BAOjB,SAASU,GAAO,CACrB,KAAAL,EAAO,SACP,UAAAM,EACA,QAAAL,EACA,SAAAjF,EACA,GAAGa,CACL,EAAgB,CACd,KAAM,CAAE,WAAAwB,EAAY,YAAAkD,CAAA,EAAgB1B,oBAAA,EAE9B2B,EADStF,EAAA,EACM,OAAOmC,CAAU,EACtC,OACE/C,EAAAA,IAAC,SAAA,CACC,wBAAsB,SACrB,GAAGuB,EACJ,KAAAmE,EACA,aAAYM,GAAaE,EACzB,QAAUjG,GAAM,CACdgG,EAAA,EACAN,GAAA,MAAAA,EAAU1F,EACZ,EAEC,SAAAS,GAAYwF,CAAA,CAAA,CAGnB,CAEAH,GAAO,YAAc,wBAKd,SAASI,GAAK,CACnB,KAAAT,EAAO,SACP,SAAAhF,EAAW,OACX,UAAAsF,EACA,QAAAL,EACA,GAAGpE,CACL,EAAc,CACZ,KAAM,CAAE,KAAA3B,CAAA,EAAS2E,oBAAA,EACX9D,EAASG,EAAA,EACf,OACEZ,EAAAA,IAAC,SAAA,CACC,wBAAsB,OACrB,GAAGuB,EACJ,KAAAmE,EACA,aAAYM,GAAavF,EAAO,UAChC,QAAUR,GAAM,CACdL,EAAA,EACA+F,GAAA,MAAAA,EAAU1F,EACZ,EAEC,YAAYQ,EAAO,SAAA,CAAA,CAG1B,CACA0F,GAAK,YAAc,sBAKZ,SAASC,GAAS,CACvB,KAAAV,EAAO,SACP,SAAAhF,EAAW,WACX,UAAAsF,EACA,QAAAL,EACA,GAAGpE,CACL,EAAkB,CAChB,KAAM,CAAE,KAAA1B,CAAA,EAAS0E,oBAAA,EACX9D,EAASG,EAAA,EACf,OACEZ,EAAAA,IAAC,SAAA,CACC,wBAAsB,WACrB,GAAGuB,EACJ,KAAAmE,EACA,aAAYM,GAAavF,EAAO,cAChC,QAAUR,GAAM,CACdJ,EAAA,EACA8F,GAAA,MAAAA,EAAU1F,EACZ,EAEC,SAAAS,CAAA,CAAA,CAGP,CACA0F,GAAS,YAAc,0BAKhB,SAASC,GAAQ,CACtB,KAAAX,EAAO,SACP,SAAAhF,EAAW,UACX,UAAAsF,EACA,QAAAL,EACA,GAAGpE,CACL,EAAiB,CACf,KAAM,CAAE,WAAA+E,EAAY,cAAAC,CAAA,EAAkBhC,oBAAA,EAChC9D,EAASG,EAAA,EACf,OACEZ,EAAAA,IAAC,SAAA,CACC,wBAAsB,UACrB,GAAGuB,EACJ,KAAAmE,EACA,eAAcY,EACd,aAAYN,GAAavF,EAAO,QAChC,QAAUR,GAAM,CACdsG,EAAA,EACAZ,GAAA,MAAAA,EAAU1F,EACZ,EAEC,YAAYQ,EAAO,OAAA,CAAA,CAG1B,CACA4F,GAAQ,YAAc,yBAYf,SAASG,GAAQ,CACtB,WAAAC,EACA,MAAAlI,EACA,SAAAmI,EAAW,GACX,UAAAV,EACA,GAAGzE,CACL,EAAiB,CACf,MAAMuE,EAAIzB,GAAA,EACJsC,EAAcD,EAChB,CAAE,GAAGnI,EAAO,GAAGkI,GACf,CAAE,MAAO,OAAQ,GAAGlI,EAAO,GAAGkI,CAAA,EAClC,OACEzG,EAAAA,IAAC,QAAA,CACC,wBAAsB,UACrB,GAAGuB,EACJ,KAAK,QACL,IAAKuE,EAAE,IACP,IAAKA,EAAE,IACP,KAAMA,EAAE,KACR,MAAOA,EAAE,MACT,aAAYE,GAAaF,EAAE,UAC3B,iBAAgBA,EAAE,cAClB,QAASA,EAAE,YACX,SAAUA,EAAE,aACZ,MAAOa,CAAA,CAAA,CAGb,CAEAH,GAAQ,YAAc,yBAYf,SAASI,GAAO,CACrB,WAAAH,EACA,MAAAlI,EACA,SAAAmI,EAAW,GACX,UAAAV,EACA,GAAGzE,CACL,EAAgB,CACd,MAAMuE,EAAIf,GAAA,EACJ4B,EAAcD,EAChB,CAAE,GAAGnI,EAAO,GAAGkI,GACf,CAAE,MAAO,OAAQ,GAAGlI,EAAO,GAAGkI,CAAA,EAClC,OACEzG,EAAAA,IAAC,QAAA,CACC,wBAAsB,SACrB,GAAGuB,EACJ,KAAK,QACL,IAAKuE,EAAE,IACP,IAAKA,EAAE,IACP,KAAMA,EAAE,KACR,MAAOA,EAAE,MACT,aAAYE,GAAaF,EAAE,UAC3B,iBAAgBA,EAAE,cAClB,QAASA,EAAE,cACX,SAAUA,EAAE,eACZ,MAAOa,CAAA,CAAA,CAGb,CAEAC,GAAO,YAAc,wBASd,SAASC,GAAK,CACnB,UAAAb,EACA,UAAAc,EACA,YAAAC,EACA,KAAArB,EAAO,SACP,QAAAC,EACA,SAAAjF,EACA,GAAGa,CACL,EAAc,CACZ,KAAM,CAAE,MAAAyF,EAAO,WAAAC,CAAA,EAAexC,iBAAA,EACxBhE,EAASG,EAAA,EACT,EAAIkG,GAAarG,EAAO,KACxByG,EAAIH,GAAetG,EAAO,OAChC,OACET,EAAAA,IAAC,SAAA,CACC,wBAAsB,OACrB,GAAGuB,EACJ,KAAAmE,EACA,eAAcsB,EACd,aAAYhB,IAAcgB,EAAQvG,EAAO,OAASA,EAAO,MACzD,QAAUR,GAAM,CACdgH,EAAA,EACAtB,GAAA,MAAAA,EAAU1F,EACZ,EAEC,SAAAS,IAAasG,EAAQE,EAAI,EAAA,CAAA,CAGhC,CAEAL,GAAK,YAAc,sBAEnB,MAAMM,GAAe,CAAC,GAAK,IAAM,EAAG,KAAM,IAAK,CAAC,EAYzC,SAASC,GAAa,CAC3B,MAAAC,EAAQF,GACR,MAAA5I,EACA,UAAAyH,EACA,SAAAtF,EACA,GAAGa,CACL,EAAsB,CACpB,KAAM,CAAE,aAAA+F,EAAc,gBAAAC,CAAA,EAAoB9C,iBAAA,EACpChE,EAASG,EAAA,EACTsE,EAAUR,EAAAA,QACd,IAAM,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG2C,EAAOC,CAAY,CAAC,CAAC,EAAE,KAAK,CAACE,EAAG1B,IAAM0B,EAAI1B,CAAC,EACxE,CAACuB,EAAOC,CAAY,CAAA,EAEtB,OACEtH,EAAAA,IAAC,SAAA,CACC,wBAAsB,eACrB,GAAGuB,EACJ,aAAYyE,GAAavF,EAAO,cAChC,MAAO,OAAO6G,CAAY,EAC1B,MAAA/I,EACA,SAAW0B,GAAMsH,EAAgB,OAAOtH,EAAE,cAAc,KAAK,CAAC,EAE7D,SAAAS,GACCwE,EAAQ,IAAKuC,GACXzH,EAAAA,IAAC,SAAA,CAAe,MAAO,OAAOyH,CAAC,EAC5B,SAAAA,IAAM,EAAIhH,EAAO,mBAAqBA,EAAO,kBAAkBgH,CAAC,CAAA,EADtDA,CAEb,CACD,CAAA,CAAA,CAGT,CAEAL,GAAa,YAAc,8BCxVpB,SAASM,EACdC,EACAC,EACkD,CAClD,SAASC,EAAKC,EAAyB,CACrC,MAAMjJ,EAAQkJ,EAAAA,eAAA,EAERpH,GADMiH,EAAO/I,CAAK,GAAK,IACX,KAAA,EACZ,CAAE,UAAAP,EAAW,MAAAC,EAAO,SAAAyJ,EAAU,MAAAC,EAAO,SAAAvH,GAAaoH,EACxD,GAAI,CAACnH,EAAO,CACV,MAAMuH,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,MAAC,OAAA,CAAK,UAAA1B,EAAsB,MAAAC,EACzB,WACH,EACE,IACN,CACA,OAAImC,QAEC,OAAA,CAAK,UAAApC,EAAsB,MAAAC,EACzB,SAAAmC,EAASC,EAAO9B,CAAK,EACxB,EAGFmB,EAAAA,IAAC,OAAA,CAAK,UAAA1B,EAAsB,MAAAC,EACzB,SAAAoC,EACH,CAEJ,CACA,OAAAkH,EAAK,YAAcF,EACZE,CACT,CAEO,SAASM,EACdR,EACAC,EACkD,CAClD,OAAOF,EAAkBC,EAAc9I,GAAU+I,EAAOlE,EAAgB7E,CAAK,CAAC,CAAC,CACjF,CC5CO,MAAMuJ,GAAQD,EAAwB,uBAAyBnG,GAAMA,GAAA,YAAAA,EAAG,KAAK,EACvEqG,GAASF,EAAwB,wBAA0BnG,GAAMA,GAAA,YAAAA,EAAG,MAAM,EAC1EsG,GAAQZ,EAAkB,uBAAyB3G,GAAMqD,GAAkBrD,CAAC,CAAC,EAC7EwH,GAAcJ,EACzB,6BACCnG,GAAMA,GAAA,YAAAA,EAAG,WACZ,EACawG,GAAYd,EAAkB,2BAA6B3G,GAAM,OAC5E,MAAMiB,EAAI0B,EAAgB3C,CAAC,EAC3B,OAAOiB,GAAA,YAAAA,EAAG,cAAahD,EAAA+B,EAAE,eAAF,YAAA/B,EAAgB,UACzC,CAAC,EACYyJ,GAAQN,EAAwB,uBAAyBnG,GAAMA,GAAA,YAAAA,EAAG,KAAK,EACvE0G,GAAQP,EAAwB,uBAAyBnG,GAAMA,GAAA,YAAAA,EAAG,KAAK,EACvE2G,GAAOR,EAAwB,sBAAwBnG,GAAMA,GAAA,YAAAA,EAAG,IAAI,EACpE4G,GAAcT,EAAwB,6BAA+BnG,IAChFA,GAAA,YAAAA,EAAG,cAAe,KAAO,OAAOA,EAAE,WAAW,EAAI,MACnD,ECXO,SAAS6G,GAAK,CACnB,UAAAvK,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvH,EACA,OAAAoI,CACF,EAAc,OACZ,MAAMjK,EAAQkJ,EAAAA,eAAA,EACRgB,GAAI/J,EAAA0E,EAAgB7E,CAAK,IAArB,YAAAG,EAAwB,KAClC,GAAI,OAAO+J,GAAM,UAAY,CAAC,OAAO,SAASA,CAAC,EAAG,CAChD,MAAMb,EAAOD,GAASD,GAAY,KAClC,OAAOE,QACJ,OAAA,CAAK,wBAAsB,OAAO,UAAA5J,EAAsB,MAAAC,EACtD,WACH,EACE,IACN,CACA,MAAMyK,EAAOF,EAASA,EAAOC,CAAC,EAAI,OAAOA,CAAC,EAC1C,OAAIrI,EAEAV,MAAC,QAAK,wBAAsB,OAAO,UAAA1B,EAAsB,MAAAC,EACtD,SAAAmC,EAASsI,EAAMnK,CAAK,CAAA,CACvB,QAGD,OAAA,CAAK,wBAAsB,OAAO,UAAAP,EAAsB,MAAAC,EACtD,SAAAyK,EACH,CAEJ,CAEAH,GAAK,YAAc,sBC3BZ,SAASI,GAAO,CACrB,UAAA3K,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvH,EACA,mBAAAwI,EAAqB,GACrB,SAAAxC,EAAW,EACb,EAAgB,OACd,MAAM7H,EAAQkJ,EAAAA,eAAA,EACRoB,IAAMnK,EAAA0E,EAAgB7E,CAAK,IAArB,YAAAG,EAAwB,SAAU,GACxC2B,EAAQuI,EAAqBC,EAAI,QAAQ,aAAc,EAAE,EAAIA,EAAI,KAAA,EACvE,GAAI,CAACxI,EAAO,CACV,MAAMuH,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,EAAAA,IAAC,OAAA,CACD,wBAAsB,SACtB,UAAA1B,EAAsB,MAAAC,EACnB,SAAA2J,CAAA,CAAA,EAED,IACN,CACA,MAAMkB,EACJ,CAAC1C,GAAYwC,EAAqB,CAAE,WAAY,YAAe,OACjE,OAAIxI,EAEAV,EAAAA,IAAC,OAAA,CAAK,UAAA1B,EAAsB,MAAO,CAAE,GAAG8K,EAAY,GAAG7K,CAAA,EACpD,SAAAmC,EAASC,EAAO9B,CAAK,CAAA,CACxB,EAGFmB,MAAC,OAAA,CAAK,UAAA1B,EAAsB,MAAO,CAAE,GAAG8K,EAAY,GAAG7K,CAAA,EACpD,SAAAoC,CAAA,CACH,CAEJ,CAEAsI,GAAO,YAAc,wBC7CrB,MAAMI,GAAS,yCAER,SAASC,GAASC,EAA+B,CACtD,MAAMC,EAA0B,CAAA,EAChC,UAAWC,KAAWF,EAAI,MAAM,OAAO,EAAG,CACxC,MAAMrH,EAAU,CAAC,GAAGuH,EAAQ,SAASJ,EAAM,CAAC,EAC5C,GAAInH,EAAQ,SAAW,EAAG,SAC1B,MAAM8G,EAAOS,EAAQ,QAAQJ,GAAQ,EAAE,EAAE,KAAA,EACzC,UAAWK,KAAKxH,EAAS,CACvB,MAAMyH,EAAU,OAAOD,EAAE,CAAC,GAAK,CAAC,EAC1B5I,EAAU,OAAO4I,EAAE,CAAC,GAAK,CAAC,EAC1BE,EAAS,QAAQF,EAAE,CAAC,GAAK,KAAK,OAAO,EAAG,GAAG,CAAC,EAC5CG,EAAOF,EAAU,GAAK7I,EAAU8I,EAAS,IAC3C,OAAO,SAASC,CAAI,GAAKA,GAAQ,GACnCL,EAAM,KAAK,CAAE,KAAAK,EAAM,KAAAb,CAAA,CAAM,CAE7B,CACF,CACA,OAAOQ,EAAM,KAAK,CAAChC,EAAG1B,IAAM0B,EAAE,KAAO1B,EAAE,IAAI,CAC7C,CCdO,SAASgE,IAA6C,CAC3D,KAAM,CAAE,OAAA1I,EAAQ,aAAAyB,CAAA,EAAiB0B,oBAAA,EAC3B,CAAE,YAAAwF,CAAA,EAAgBtF,iBAAA,EAClBuF,EAAe5I,EAAOyB,CAAY,EAElC2G,EAAQ9E,EAAAA,QAAQ,IACfsF,EACD,MAAM,QAAQA,EAAa,WAAW,GAAKA,EAAa,YAAY,OAAS,EACxE,CAAC,GAAGA,EAAa,WAAW,EAChC,OAAQC,GAAS,OAAO,SAASA,EAAK,IAAI,GAAKA,EAAK,MAAQ,CAAC,EAC7D,KAAK,CAACzC,EAAG1B,IAAM0B,EAAE,KAAO1B,EAAE,IAAI,EAE/B,OAAOkE,EAAa,QAAW,SAC1BV,GAASU,EAAa,MAAM,EAE9B,CAAA,EATmB,CAAA,EAUzB,CAACA,CAAY,CAAC,EAEXE,EAAcxF,EAAAA,QAAQ,IAAM,CAChC,QAASjD,EAAI+H,EAAM,OAAS,EAAG/H,GAAK,EAAGA,GAAK,EAC1C,GAAIsI,GAAeP,EAAM/H,CAAC,EAAG,KAAM,OAAOA,EAE5C,MAAO,EACT,EAAG,CAACsI,EAAaP,CAAK,CAAC,EAEvB,MAAO,CACL,MAAAA,EACA,YAAAU,EACA,WAAYA,GAAe,EAAKV,EAAMU,CAAW,GAAK,KAAQ,IAAA,CAElE,CCnBO,SAASC,GAAa,CAC3B,UAAA7L,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvB,EAAW,GACX,gBAAA0D,EACA,cAAAC,EACA,SAAA3J,CACF,EAAsB,CACpB,MAAM7B,EAAQkJ,EAAAA,eAAA,EACRtH,EAASG,EAAA,EACT,CAAE,MAAA4I,EAAO,YAAAU,CAAA,EAAgBJ,GAAA,EAE/B,GAAIN,EAAM,SAAW,EAAG,CACtB,MAAMtB,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,EAAAA,IAAC,OAAA,CACD,wBAAsB,eACtB,UAAA1B,EAAsB,MAAAC,EACnB,SAAA2J,CAAA,CAAA,EAED,IACN,CAEA,MAAMoC,EAA2B5D,EAC7B,GACA,CACE,UAAW,OACX,OAAQ,EACR,QAAS,EACT,WAAY,mDACZ,SAAU,gCACV,MAAO,sCAAA,EAGb,OACE1G,EAAAA,IAAC,KAAA,CACC,UAAA1B,EACA,MAAO,CAAE,GAAGgM,EAAW,GAAG/L,CAAA,EAC1B,aAAYkC,EAAO,iBAElB,SAAA+I,EAAM,IAAI,CAACS,EAAMhJ,IAAU,CAC1B,MAAMsJ,EAAStJ,IAAUiJ,EACzB,OACElK,EAAAA,IAAC,KAAA,CAEC,eAAcuK,EAAS,OAAS,OAChC,qBAAoBA,GAAU,OAC9B,UACE,CAACF,EAAeE,EAASH,EAAkB,MAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC9E,OAEF,MACE1D,EACI,OACA,CACE,QAAS,8CACT,WAAY6D,EAAS,IAAM,IAC3B,QAASA,EAAS,EAAI,GAAA,EAI7B,WAAW7J,EAASuJ,EAAMhJ,EAAOsJ,EAAQ1L,CAAK,EAAIoL,EAAK,IAAA,EAjBnD,GAAGA,EAAK,IAAI,IAAIhJ,CAAK,EAAA,CAoBhC,CAAC,CAAA,CAAA,CAGP,CAEAkJ,GAAa,YAAc,8BC7EpB,SAASK,IAAwC,CACtD,KAAM,CAAE,OAAApJ,EAAQ,aAAAyB,CAAA,EAAiB0B,oBAAA,EAC3B,CAAE,YAAAwF,EAAa,KAAAU,CAAA,EAAShG,iBAAA,EAExBiG,EAAOhG,EAAAA,QAAQ,IAAM,OAEzB,MAAO,CAAC,KADS1F,EAAAoC,EAAOyB,CAAY,IAAnB,YAAA7D,EAAsB,WAAY,CAAA,CAChC,EAChB,OAAQ2D,GAASA,GAAQ,OAAO,SAASA,EAAK,YAAY,GAAKA,EAAK,cAAgB,CAAC,EACrF,KAAK,CAAC6E,EAAG1B,IAAM0B,EAAE,aAAe1B,EAAE,YAAY,CACnD,EAAG,CAACjD,EAAczB,CAAM,CAAC,EAEnB8I,EAAcxF,EAAAA,QAAQ,IAAM,CAChC,GAAIgG,EAAK,SAAW,EAAG,MAAO,GAC9B,QAASjJ,EAAIiJ,EAAK,OAAS,EAAGjJ,GAAK,EAAGA,GAAK,EACzC,GAAIsI,GAAeW,EAAKjJ,CAAC,EAAG,aAAc,OAAOA,EAEnD,MAAO,EACT,EAAG,CAACsI,EAAaW,CAAI,CAAC,EAEtB,MAAO,CACL,KAAAA,EACA,YAAAR,EACA,OAAQA,GAAe,EAAKQ,EAAKR,CAAW,GAAK,KAAQ,KACzD,OAASjJ,GAAkB,CACzB,MAAM0J,EAAUD,EAAKzJ,CAAK,EACtB0J,GAASF,EAAKE,EAAQ,YAAY,CACxC,CAAA,CAEJ,CCpBO,SAASC,GAAS,CACvB,UAAAtM,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvB,EAAW,GACX,YAAAmE,EAAchK,EACd,SAAAH,CACF,EAAkB,CAChB,MAAM7B,EAAQkJ,EAAAA,eAAA,EACRtH,EAASG,EAAA,EACT,CAAE,KAAA8J,EAAM,YAAAR,EAAa,OAAAY,CAAA,EAAWN,GAAA,EAEtC,GAAIE,EAAK,SAAW,EAAG,CACrB,MAAMxC,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,EAAAA,IAAC,OAAA,CACC,wBAAsB,WACtB,UAAA1B,EACA,MAAAC,EAEC,SAAA2J,CAAA,CAAA,EAED,IACN,CAEA,MAAMoC,EAA2B5D,EAC7B,GACA,CACE,UAAW,OACX,OAAQ,EACR,QAAS,EACT,WAAY,mDACZ,SAAU,gCACV,MAAO,sCAAA,EAGb,OACE1G,EAAAA,IAAC,KAAA,CACC,UAAA1B,EACA,MAAO,CAAE,GAAGgM,EAAW,GAAG/L,CAAA,EAC1B,aAAYkC,EAAO,aAElB,SAAAiK,EAAK,IAAI,CAACC,EAAS1J,IAAU,CAC5B,MAAMsJ,EAAStJ,IAAUiJ,EACzB,aACG,KAAA,CACC,SAAAlK,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,eAAcuK,EAAS,OAAS,OAChC,qBAAoBA,GAAU,OAC9B,QAAS,IAAMO,EAAO7J,CAAK,EAC3B,MAAO,CACL,MAAOyF,EAAW,OAAY,OAC9B,UAAWA,EAAW,OAAY,OAClC,OAAQA,EAAW,OAAY,OAC/B,WAAYA,EACR,OACA6D,EACE,2DACA,cACN,MAAO7D,EAAW,OAAY,UAC9B,KAAMA,EAAW,OAAY,UAC7B,OAAQA,EAAW,OAAY,UAC/B,QAASA,EACL,OACA,6CAAA,EAGL,SAAAhG,EACCA,EAASiK,EAAS1J,EAAOsJ,EAAQ1L,CAAK,EACpC6H,EACFqE,EAAAA,KAAAC,EAAAA,SAAA,CACG,SAAA,CAAAH,EAAYF,EAAQ,YAAY,EAAE,IAAEA,EAAQ,KAAA,CAAA,CAC/C,SAEC,OAAA,CACC,SAAA,CAAA3K,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,QAAS,IAAM,YAAa,QAAA,EACxC,SAAA6K,EAAYF,EAAQ,YAAY,CAAA,CACnC,EACCA,EAAQ,KAAA,CAAA,CACX,CAAA,CAAA,GAnCG,GAAGA,EAAQ,YAAY,IAAIA,EAAQ,KAAK,EAsCjD,CAEJ,CAAC,CAAA,CAAA,CAGP,CAEAC,GAAS,YAAc,0BCzGhB,SAASK,GAAQ,CACtB,QAAAC,EAAU,GACV,UAAA5M,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvH,CACF,EAAiB,OACf,MAAM7B,EAAQkJ,EAAAA,eAAA,EACd,GAAI,CAACmD,EAAS,OAAO,KACrB,MAAMvK,IAAQ3B,EAAA0E,EAAgB7E,CAAK,IAArB,YAAAG,EAAwB,UAAW,GACjD,GAAI,CAAC2B,EAAO,CACV,MAAMuH,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,MAAC,OAAA,CAAK,UAAA1B,EAAsB,MAAAC,EACzB,WACH,EACE,IACN,CACA,OAAImC,EAEAV,MAAC,QAAK,wBAAsB,UAAU,UAAA1B,EAAsB,MAAAC,EACzD,SAAAmC,EAASC,EAAO9B,CAAK,CAAA,CACxB,EAGFmB,EAAAA,IAAC,OAAA,CAAK,UAAA1B,EAAsB,MAAAC,EACzB,SAAAoC,EACH,CAEJ,CAEAsK,GAAQ,YAAc,yBC7Bf,SAASE,GAAQ,CACtB,UAAA7M,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,MAAAmD,EACA,QAAAC,EACA,QAAAC,EACA,SAAAC,EACA,SAAA7E,EAAW,GACX,SAAA8E,CACF,EAAiB,CACf,MAAM3M,EAAQkJ,EAAAA,eAAA,EACRnG,EAAQ8B,EAAgB7E,CAAK,EAC7B4M,EAAMtH,GAAgBtF,CAAK,EACjC,GAAI,CAAC4M,EAAK,CACR,MAAMvD,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,EAAAA,IAAC,OAAA,CACD,UAAA1B,EAAsB,MAAAC,EACnB,SAAA2J,CAAA,CAAA,EAED,IACN,CACA,MAAMwD,EAAM,CAAC9J,GAAA,YAAAA,EAAO,MAAOA,GAAA,YAAAA,EAAO,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK,GAAK,UACzE,OACE5B,EAAAA,IAAC,MAAA,CACC,wBAAsB,UACtB,UAAA1B,EACA,MACEoI,EACI,CAAE,GAAGnI,GACL,CACE,WAAY,wCACZ,aAAc,kCACd,SAAU,SACV,GAAGA,CAAA,EAIX,SAAAyB,EAAAA,IAAC,MAAA,CACC,IAAAyL,EACA,IAAAC,EACA,MAAAN,EACA,QAAAC,EACA,SAAAE,EACA,QAAAD,EACA,MAAO,CACL,QAAS5E,EAAW,OAAY,QAChC,MAAOA,EAAW,OAAY,OAC9B,OAAQA,EAAW,OAAY,OAC/B,UAAWA,EAAW,OAAY,QAClC,GAAG8E,CAAA,CACL,CAAA,CACF,CAAA,CAGN,CAEAL,GAAQ,YAAc,yBC9Df,SAASQ,GAAW,CACzB,KAAAC,EAAO,EACP,UAAAtN,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvH,CACF,EAAoB,CAClB,MAAM7B,EAAQkJ,EAAAA,eAAA,EAEd,GADYlJ,EAAM,OAAO,SACb,EAAG,CACb,MAAMqJ,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,EAAAA,IAAC,OAAA,CACC,wBAAsB,aACtB,UAAA1B,EACA,MAAAC,EAEC,SAAA2J,CAAA,CAAA,EAED,IACN,CACA,MAAMvH,EAAQ,OAAO9B,EAAM,aAAe+M,CAAI,EAC9C,OAAIlL,EAEAV,EAAAA,IAAC,OAAA,CACC,wBAAsB,aACtB,UAAA1B,EACA,MAAAC,EAEC,SAAAmC,EAASC,EAAO9B,CAAK,CAAA,CAAA,EAI1BmB,EAAAA,IAAC,OAAA,CACC,wBAAsB,aACtB,UAAA1B,EACA,MAAAC,EAEC,SAAAoC,CAAA,CAAA,CAGP,CAEAgL,GAAW,YAAc,4BAMlB,SAASE,GAAY,CAC1B,UAAAvN,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvH,CACF,EAAqB,CACnB,MAAM7B,EAAQkJ,EAAAA,eAAA,EACRpH,EAAQ,OAAO9B,EAAM,OAAO,MAAM,EACxC,GAAIA,EAAM,OAAO,SAAW,EAAG,CAC7B,MAAMqJ,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,MAAC,OAAA,CAAK,UAAA1B,EAAsB,MAAAC,EACzB,WACH,EACE,IACN,CACA,OAAImC,EAEAV,EAAAA,IAAC,OAAA,CACC,wBAAsB,cACtB,UAAA1B,EACA,MAAAC,EAEC,SAAAmC,EAASC,EAAO9B,CAAK,CAAA,CAAA,EAI1BmB,EAAAA,IAAC,OAAA,CACC,wBAAsB,cACtB,UAAA1B,EACA,MAAAC,EAEC,SAAAoC,CAAA,CAAA,CAGP,CAEAkL,GAAY,YAAc,6BAWnB,SAASC,GAAc,CAC5B,KAAAF,EAAO,EACP,UAAAG,EAAY,MACZ,UAAAzN,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvH,CACF,EAAuB,CACrB,MAAM7B,EAAQkJ,EAAAA,eAAA,EACR9E,EAAMpE,EAAM,OAAO,OACzB,GAAIoE,IAAQ,EAAG,CACb,MAAMiF,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,MAAC,OAAA,CAAK,UAAA1B,EAAsB,MAAAC,EACzB,WACH,EACE,IACN,CACA,MAAM0C,EAAQ,OAAOpC,EAAM,aAAe+M,CAAI,EACxC1K,EAAS,OAAO+B,CAAG,EACnBiD,EAAQ,GAAGjF,CAAK,GAAG8K,CAAS,GAAG7K,CAAM,GAC3C,OAAIR,EAEAV,EAAAA,IAAC,OAAA,CACC,wBAAsB,gBACtB,UAAA1B,EACA,MAAAC,EAEC,WAAS,CAAE,MAAA0C,EAAO,OAAAC,EAAQ,MAAAgF,CAAA,EAASrH,CAAK,CAAA,CAAA,EAI7CmB,EAAAA,IAAC,OAAA,CACC,wBAAsB,gBACtB,UAAA1B,EACA,MAAAC,EAEC,SAAA2H,CAAA,CAAA,CAGP,CAEA4F,GAAc,YAAc,+BCxI5B,SAASE,GACPC,EACApN,EACAiJ,EACqB,CACrB,KAAM,CACJ,UAAAxJ,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvH,EACA,OAAAoI,EAASjI,CAAA,EACPiH,EACJ,GAAI,EAAEmE,GAAgB,IAAM,CAAC,OAAO,SAASA,CAAY,EAAG,CAC1D,MAAM/D,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,EAAAA,IAAC,OAAA,CACC,wBAAsB,WACtB,UAAA1B,EACA,MAAAC,EAEC,SAAA2J,CAAA,CAAA,EAED,IACN,CACA,MAAMc,EAAOF,EAAOmD,CAAY,EAChC,OAAIvL,EAEAV,EAAAA,IAAC,OAAA,CACC,wBAAsB,WACtB,UAAA1B,EACA,MAAAC,EAEC,SAAAmC,EAASsI,EAAMnK,CAAK,CAAA,CAAA,QAIxB,OAAA,CAAK,wBAAsB,WAAW,UAAAP,EAAsB,MAAAC,EAC1D,SAAAyK,EACH,CAEJ,CAEO,SAASkD,GAAQpE,EAAsB,CAC5C,MAAMjJ,EAAQkJ,EAAAA,eAAA,EACd,OAAOiE,GAAWnN,EAAM,YAAaA,EAAOiJ,CAAK,CACnD,CAEAoE,GAAQ,YAAc,yBAEf,SAASC,GAASrE,EAAsB,CAC7C,MAAMjJ,EAAQkJ,EAAAA,eAAA,EACd,OAAOiE,GAAWpI,EAAkB/E,CAAK,EAAGA,EAAOiJ,CAAK,CAC1D,CAEAqE,GAAS,YAAc,0BAEhB,SAASC,GAAUtE,EAAsB,CAC9C,MAAMjJ,EAAQkJ,EAAAA,eAAA,EACd,OAAOiE,GAAWjI,GAAmBlF,CAAK,EAAGA,EAAOiJ,CAAK,CAC3D,CAEAsE,GAAU,YAAc,2BASjB,SAASC,GAAS,CACvB,UAAA/N,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvH,CACF,EAAkB,CAChB,MAAM7B,EAAQkJ,EAAAA,eAAA,EACR3J,EAAWwF,EAAkB/E,CAAK,EAClCyN,EAAWrI,GAAiBpF,CAAK,EACvC,GAAI,EAAET,EAAW,GAAI,CACnB,MAAM8J,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,EAAAA,IAAC,OAAA,CACC,wBAAsB,WACtB,UAAA1B,EACA,MAAAC,EAEC,SAAA2J,CAAA,CAAA,EAED,IACN,CACA,OAAIxH,EAEAV,EAAAA,IAAC,OAAA,CACC,wBAAsB,WACtB,UAAA1B,EACA,MAAAC,EAEC,SAAAmC,EACC,CAAE,SAAA4L,EAAU,YAAazN,EAAM,YAAa,SAAAT,CAAA,EAC5CS,CAAA,CACF,CAAA,EAIJmB,EAAAA,IAAC,OAAA,CAAK,wBAAsB,WAAW,UAAA1B,EAAsB,MAAAC,EAC1D,SAAA,GAAG,KAAK,MAAM+N,EAAW,GAAG,CAAC,IAChC,CAEJ,CAEAD,GAAS,YAAc,0BAWhB,SAASE,GAAS,CACvB,UAAAjO,EACA,MAAAC,EACA,OAAAiO,EAAS,EACT,aAAAC,EAAe,GACf,SAAA/F,EAAW,EACb,EAAkB,CAChB,MAAM7H,EAAQkJ,EAAAA,eAAA,EACR2E,EAAc,GAAG,KAAK,MAAMzI,GAAiBpF,CAAK,EAAI,GAAG,CAAC,IAC1D8N,EAAS,GAAG,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG9N,EAAM,gBAAgB,CAAC,EAAI,GAAG,CAAC,IACpF,OACEkM,EAAAA,KAAC,MAAA,CACC,wBAAsB,WACtB,UAAAzM,EACA,MACEoI,EACI,CAAE,GAAGnI,GACL,CACE,MAAO,OACP,OAAAiO,EACA,WAAY,qCACZ,aAAc,IACd,SAAU,SACV,SAAU,WACV,GAAGjO,CAAA,EAGX,cAAW,GAEV,SAAA,CAAAkO,EACCzM,EAAAA,IAAC,MAAA,CACC,wBAAsB,WACtB,MAAO,CACL,SAAU0G,EAAW,OAAY,WACjC,KAAMA,EAAW,OAAY,EAC7B,IAAKA,EAAW,OAAY,EAC5B,OAAQA,EAAW,OAAY,OAC/B,MAAOiG,EACP,WAAYjG,EACR,OACA,uDAAA,CACN,CAAA,EAEA,KACJ1G,EAAAA,IAAC,MAAA,CACC,wBAAsB,WACtB,MAAO,CACL,SAAU0G,EAAW,OAAY,WACjC,MAAOgG,EACP,OAAQhG,EAAW,OAAY,OAC/B,WAAYA,EACR,OACA,sCAAA,CACN,CAAA,CACF,CAAA,CAAA,CAGN,CAEA6F,GAAS,YAAc,0BAShB,SAASK,GAAW,CACzB,UAAAtO,EACA,MAAAC,EACA,OAAAiO,EAAS,EACT,SAAA9F,EAAW,EACb,EAAoB,CAClB,MAAM7H,EAAQkJ,EAAAA,eAAA,EACR4E,EAAS,GAAG,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG9N,EAAM,gBAAgB,CAAC,EAAI,GAAG,CAAC,IACpF,OACEmB,EAAAA,IAAC,MAAA,CACC,wBAAsB,aACtB,UAAA1B,EACA,MACEoI,EACI,CAAE,GAAGnI,GACL,CACE,MAAO,OACP,OAAAiO,EACA,WAAY,qCACZ,aAAc,IACd,SAAU,SACV,GAAGjO,CAAA,EAGX,cAAW,GAEX,SAAAyB,EAAAA,IAAC,MAAA,CACC,wBAAsB,aACtB,MAAO,CACL,MAAO2M,EACP,OAAQjG,EAAW,OAAY,OAC/B,WAAYA,EACR,OACA,uDAAA,CACN,CAAA,CACF,CAAA,CAGN,CAEAkG,GAAW,YAAc,4BC1OlB,SAASC,GAAc,CAC5B,UAAAvO,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvH,CACF,EAAuB,CACrB,MAAM7B,EAAQkJ,EAAAA,eAAA,EACRpH,EAAQgD,GAAsB9E,CAAK,EACzC,OAAI6B,EAEAV,EAAAA,IAAC,OAAA,CACC,wBAAsB,gBACtB,UAAA1B,EACA,MAAAC,EAEC,SAAAmC,EAASC,EAAO9B,CAAK,CAAA,CAAA,EAI1BmB,EAAAA,IAAC,OAAA,CACC,wBAAsB,gBACtB,UAAA1B,EACA,MAAAC,EAEC,SAAAoC,CAAA,CAAA,CAGP,CAEAkM,GAAc,YAAc,+BAOrB,SAASC,GAAa,CAC3B,UAAAxO,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,KAAA8E,EAAO,SACP,SAAArM,CACF,EAAsB,CACpB,MAAM7B,EAAQkJ,EAAAA,eAAA,EACRpH,EAAQ9B,EAAM,cAAgB,GACpC,GAAI,CAAC8B,EAAO,CACV,MAAMuH,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,EAAAA,IAAC,OAAA,CACC,wBAAsB,eACtB,UAAA1B,EACA,MAAAC,EAEC,SAAA2J,CAAA,CAAA,EAED,IACN,CACA,OAAIxH,EAEAV,EAAAA,IAAC,OAAA,CACC,wBAAsB,eACtB,UAAA1B,EACA,MAAAC,EACA,YAAWwO,EAEV,SAAArM,EAASC,EAAO9B,CAAK,CAAA,CAAA,EAK1BmB,EAAAA,IAAC,OAAA,CACC,wBAAsB,eACtB,UAAA1B,EACA,MAAAC,EACA,YAAWwO,EAEV,SAAApM,CAAA,CAAA,CAGP,CAEAmM,GAAa,YAAc,8BC/E3B,MAAME,GAA8BnP,EAAAA,cAA2C,IAAI,EAEnF,SAASoP,IAA0C,CACjD,MAAMlP,EAAMC,EAAAA,WAAWgP,EAA2B,EAClD,GAAI,CAACjP,EACH,MAAM,IAAI,MAAM,6DAA6D,EAE/E,OAAOA,CACT,CAqBO,SAASmP,GAAe,CAC7B,SAAAxM,EACA,SAAAgG,EAAW,GACX,SAAAyG,EACA,YAAAC,EACA,aAAAC,EAAe,GACf,MAAA9O,EACA,GAAGgD,CACL,EAAwB,CACtB,KAAM,CAAE,OAAAH,EAAQ,aAAAyB,EAAc,YAAAyK,EAAa,cAAAC,CAAA,EAAkBhJ,EAAAA,kBAAA,EAEvD+F,EAA2B5D,EAC7B,CAAE,GAAGnI,GACL,CACE,UAAW,OACX,OAAQ,EACR,QAAS,EACT,WAAY,mDACZ,SAAU,gCACV,MAAO,uCACP,GAAGA,CAAA,EAKT,OAFemC,IAAa,OAIxBV,EAAAA,IAACgN,GAA4B,SAA5B,CAAqC,MAAO,CAAE,aAAAK,CAAA,EAC7C,SAAArN,EAAAA,IAAC,MAAG,MAAOsK,EAAY,GAAG/I,EACvB,SAAAb,EACH,EACF,EAKFV,EAAAA,IAACgN,GAA4B,SAA5B,CAAqC,MAAO,CAAE,aAAAK,GAC7C,SAAArN,EAAAA,IAAC,KAAA,CAAG,wBAAsB,WAAW,MAAOsK,EAAY,GAAG/I,EACxD,WAAO,IAAI,CAACK,EAAOX,IAAU,CAC5B,MAAMsJ,EAAStJ,IAAU4B,EACzB,aACG,KAAA,CACC,SAAA7C,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,CACTqN,IAA0BpM,CAAK,IAChBA,CAAK,CAC1B,EACA,MAAO,CACL,MAAOyF,EAAW,OAAY,OAC9B,UAAWA,EAAW,OAAY,OAClC,OAAQA,EAAW,OAAY,OAC/B,WAAYA,EACR,OACA6D,EACE,2DACA,cACN,MAAO7D,EAAW,OAAY,UAC9B,KAAMA,EAAW,OAAY,UAC7B,OAAQA,EAAW,OAAY,UAC/B,QAASA,EAAW,OAAY,8CAChC,GAAGyG,CAAA,EAGJ,WACCC,EAAYxL,EAAOX,EAAOsJ,CAAM,SAE/B,OAAA,CACE,SAAA,CAAA3I,EAAM,MACNA,EAAM,OAAS,MAAMA,EAAM,MAAM,GAAK,EAAA,CAAA,CACzC,CAAA,CAAA,GA7BG,GAAGX,CAAK,IAAIU,EAAcC,CAAK,CAAC,EAgCzC,CAEJ,CAAC,EACH,EACF,CAEJ,CAEAsL,GAAe,YAAc,kBAUtB,SAASM,GAAoB,CAClC,MAAAvM,EACA,SAAAyF,EAAW,GACX,UAAApI,EACA,MAAAC,EACA,SAAAmC,EACA,QAAA+M,EACA,QAAA9H,EACA,GAAG+H,CACL,EAA6B,CAC3B,KAAM,CAAE,aAAAL,CAAA,EAAiBJ,GAAA,EACnB,CAAE,OAAA7L,EAAQ,aAAAyB,EAAc,YAAAyK,EAAa,cAAAC,CAAA,EAAkBhJ,EAAAA,kBAAA,EACvDgG,EAAStJ,IAAU4B,EACnBjB,EAAQR,EAAOH,CAAK,EACpB0M,EACJ/L,GAAS,KACPmJ,EAAAA,KAAC,OAAA,CACE,SAAA,CAAAnJ,EAAM,MACNA,EAAM,OAAS,MAAMA,EAAM,MAAM,GAAK,EAAA,CAAA,CACzC,EACE,KAEN,OACE5B,EAAAA,IAAC,KAAA,CAAI,GAAGyN,EACN,SAAAzN,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,eAAcuK,EAAS,OAAS,OAChC,qBAAoBA,GAAU,OAC9B,UAAAjM,EACA,MAAO,CACL,MAAOoI,EAAW,OAAY,OAC9B,UAAWA,EAAW,OAAY,OAClC,OAAQA,EAAW,OAAY,OAC/B,WAAYA,EACR,OACA6D,EACE,2DACA,cACN,MAAO7D,EAAW,OAAY,UAC9B,KAAMA,EAAW,OAAY,UAC7B,OAAQA,EAAW,OAAY,UAC/B,QAASA,EAAW,OAAY,8CAChC,GAAGnI,CAAA,EAEJ,GAAGmP,EACJ,QAAUzN,GAAM,CACd0F,GAAA,MAAAA,EAAU1F,GACN,CAAAA,EAAE,mBACFoN,IAA0BpM,CAAK,IAChBA,CAAK,EAC1B,EAEC,SAAAP,GAAYiN,CAAA,CAAA,EAEjB,CAEJ,CAEAH,GAAoB,YAAc,wBAE3B,MAAMI,GAAyB,OAAO,OAAOV,GAAgB,CAClE,MAAOM,EACT,CAAC,EClMYpF,GAAQV,EACnB,qBACC3G,GAAA,OAAM,OAAA/B,EAAA+B,EAAE,eAAF,YAAA/B,EAAgB,MACzB,EACa6O,GAAWnG,EACtB,wBACC3G,GAAA,OAAM,OAAA/B,EAAA+B,EAAE,eAAF,YAAA/B,EAAgB,SACzB,EACauJ,GAAcb,EACzB,2BACC3G,GAAA,OAAM,OAAA/B,EAAA+B,EAAE,eAAF,YAAA/B,EAAgB,YACzB,EACawJ,GAAYd,EACvB,yBACC3G,GAAA,OAAM,OAAA/B,EAAA+B,EAAE,eAAF,YAAA/B,EAAgB,UACzB,EAQO,SAASmM,GAAQ,CACtB,UAAA7M,EACA,MAAAC,EACA,SAAAyJ,EACA,MAAAC,EACA,SAAAvB,EAAW,GACX,SAAA8E,CACF,EAAsB,SACpB,MAAM3M,EAAQkJ,EAAAA,eAAA,EACR0D,GAAMzM,EAAAH,EAAM,eAAN,YAAAG,EAAoB,WAChC,GAAI,CAACyM,EAAK,CACR,MAAMvD,EAAOD,GAASD,GAAY,KAClC,OAAOE,EACLlI,MAAC,OAAA,CAAK,UAAA1B,EAAsB,MAAAC,EACzB,WACH,EACE,IACN,CACA,MAAMmN,IAAMtJ,EAAAvD,EAAM,eAAN,YAAAuD,EAAoB,QAAS,mBACzC,OACEpC,EAAAA,IAAC,OAAA,CACC,wBAAsB,UACtB,UAAA1B,EACA,MACEoI,EACI,CAAE,GAAGnI,GACL,CACE,QAAS,eACT,WAAY,oCACZ,aAAc,oCACd,SAAU,SACV,GAAGA,CAAA,EAIX,SAAAyB,EAAAA,IAAC,MAAA,CACC,IAAAyL,EACA,IAAAC,EACA,MAAO,CACL,QAAShF,EAAW,OAAY,QAChC,MAAOA,EAAW,OAAY,OAC9B,OAAQA,EAAW,OAAY,OAC/B,UAAWA,EAAW,OAAY,QAClC,GAAG8E,CAAA,CACL,CAAA,CACF,CAAA,CAGN,CAEAL,GAAQ,YAAc,uBClEf,SAAS2C,EAAYC,EAAmB,CAC7C,OAAK,OAAO,SAASA,CAAC,EACf,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGA,CAAC,CAAC,EADD,CAElC,CAEO,SAASC,GAAkBvG,EAAmB,CACnD,OAAK,OAAO,SAASA,CAAC,EACf,KAAK,IAAI,EAAG,KAAK,IAAI,IAAMA,CAAC,CAAC,EADJ,CAElC,CAGA,MAAMwG,EAAkB,CACtB,YAAa,EACb,SAAU,EACV,iBAAkB,EAClB,YAAa,GACb,aAAc,IAChB,EAEMC,GAAe,CACnB,GAAGD,EACH,OAAQ,EACR,MAAO,GACP,aAAc,CAChB,EAEO,SAASE,GAAmBC,EAWnB,CACd,MAAMhN,EAAS,CAAC,GAAGgN,EAAO,MAAM,EAChC,IAAIvL,EAAe7B,EAAWoN,EAAO,cAAgB,EAAGhN,EAAO,MAAM,EACjEiN,EAAiC,KACjCC,EAAUlN,EAEd,OAAIgN,EAAO,YAAchN,EAAO,OAAS,IACvCiN,EAAiB,CAAC,GAAGjN,CAAM,EAC3BkN,EAAUnN,GAAkBC,EAAQyB,CAAY,EAChDA,EAAe,GAGV,CACL,OAAQyL,EACR,aAAAzL,EACA,aAAcuL,EAAO,cAAgB,WACrC,SAAUA,EAAO,UAAY,GAC7B,WAAY,GAAQA,EAAO,YAAcE,EAAQ,OAAS,GAC1D,WAAYF,EAAO,YAAc,MACjC,eAAAC,EACA,aAAcD,EAAO,cAAgB,KACrC,GAAGF,GACH,OAAQJ,EAAYM,EAAO,QAAU,CAAC,EACtC,MAAOA,EAAO,OAAS,GACvB,aAAcJ,GAAkBI,EAAO,cAAgB,CAAC,CAAA,CAE5D,CAEO,SAASG,GAAc1P,EAAoB2P,EAAmC,CACnF,OAAQA,EAAO,KAAA,CACb,IAAK,OAAQ,CACX,KAAM,CACJ,OAAApN,EACA,aAAAyB,EACA,aAAA4L,EACA,SAAAC,EACA,WAAApI,EACA,WAAAvD,EACA,aAAAC,EACA,OAAA2L,EACA,MAAA3H,EACA,aAAAM,CAAA,EACEkH,EAAO,QACX,OAAOL,GAAmB,CACxB,OAAA/M,EACA,aAAAyB,EACA,aAAc4L,GAAgB,KAC9B,SAAUC,GAAY,GACtB,WAAYpI,GAAc,GAC1B,WAAYvD,GAAc,MAC1B,aAAcC,GAAgB,WAC9B,OAAA2L,EACA,MAAA3H,EACA,aAAAM,CAAA,CACD,CACH,CACA,IAAK,YAAa,CAChB,KAAM,CAAE,OAAAlG,EAAQ,aAAAyB,CAAA,EAAiB2L,EAAO,QAClC5O,EAAO,CAAC,GAAGwB,CAAM,EACjBwN,EAAM5N,EAAW6B,GAAgBhE,EAAM,aAAce,EAAK,MAAM,EACtE,MAAO,CACL,GAAGf,EACH,OAAQe,EACR,aAAcgP,EACd,WAAY,GACZ,eAAgB,KAChB,GAAGX,CAAA,CAEP,CACA,IAAK,eAAgB,CACnB,MAAMY,EAAcL,EAAO,QAAQ,OAAS3P,EAAM,OAAO,OACnDuC,EAASiB,GAAcxD,EAAM,OAAQ2P,EAAO,QAAQ,MAAOK,CAAW,EAC5E,GAAIL,EAAO,QAAQ,SAAU,CAC3B,MAAMI,EAAM5N,EAAW6N,EAAazN,EAAO,MAAM,EACjD,MAAO,CACL,GAAGvC,EACH,OAAAuC,EACA,aAAcwN,EACd,WAAY,GACZ,eAAgB,KAChB,SAAU,GACV,GAAGX,CAAA,CAEP,CACA,MAAMpL,EACJgM,GAAehQ,EAAM,aAAeA,EAAM,aAAe,EAAIA,EAAM,aACrE,MAAO,CACL,GAAGA,EACH,OAAAuC,EACA,WAAY,GACZ,eAAgB,KAChB,aAAcJ,EAAW6B,EAAczB,EAAO,MAAM,CAAA,CAExD,CACA,IAAK,eAAgB,CACnB,MAAMH,EAAQuN,EAAO,QAAQ,MACvBpN,EAASmB,GAAc1D,EAAM,OAAQoC,CAAK,EAC1C4B,EACJ5B,EAAQpC,EAAM,aACVA,EAAM,aAAe,EACrBoC,IAAUpC,EAAM,aACd,KAAK,IAAIA,EAAM,aAAc,KAAK,IAAI,EAAGuC,EAAO,OAAS,CAAC,CAAC,EAC3DvC,EAAM,aACd,MAAO,CACL,GAAGA,EACH,OAAAuC,EACA,WAAY,GACZ,eAAgB,KAChB,aAAcJ,EAAW6B,EAAczB,EAAO,MAAM,EACpD,GAAIH,IAAUpC,EAAM,aAAeoP,EAAkB,CAAA,CAAC,CAE1D,CACA,IAAK,aAAc,CACjB,KAAM,CAAE,UAAAxL,EAAW,QAAAC,CAAA,EAAY8L,EAAO,QAChCpN,EAASoB,GAAU3D,EAAM,OAAQ4D,EAAWC,CAAO,EACzD,IAAIG,EAAehE,EAAM,aACzB,OAAIA,EAAM,eAAiB4D,EAAWI,EAAeH,EAC5CD,EAAY5D,EAAM,cAAgB6D,GAAW7D,EAAM,aAAcgE,GAAgB,EACjFJ,EAAY5D,EAAM,cAAgB6D,GAAW7D,EAAM,eAAcgE,GAAgB,GACnF,CACL,GAAGhE,EACH,OAAAuC,EACA,WAAY,GACZ,eAAgB,KAChB,aAAcJ,EAAW6B,EAAczB,EAAO,MAAM,CAAA,CAExD,CACA,IAAK,WAAY,CACf,MAAMA,EAASwB,GAAa/D,EAAM,OAAQA,EAAM,aAAc2P,EAAO,QAAQ,KAAK,EAClF,MAAO,CACL,GAAG3P,EACH,OAAAuC,EACA,WAAY,GACZ,eAAgB,IAAA,CAEpB,CACA,IAAK,YAAa,CAChB,MAAMwN,EAAM5N,EAAWwN,EAAO,QAAQ,MAAO3P,EAAM,OAAO,MAAM,EAC1DiQ,EAAKN,EAAO,QAAQ,SACpBE,EAAWI,IAAO,GAAO,GAAQA,IAAO,GAAQ,GAAOjQ,EAAM,SACnE,MAAO,CACL,GAAGA,EACH,aAAc+P,EACd,GAAGX,EACH,SAAAS,CAAA,CAEJ,CACA,IAAK,OACH,MAAO,CAAE,GAAG7P,EAAO,SAAU,EAAA,EAC/B,IAAK,QACH,MAAO,CAAE,GAAGA,EAAO,SAAU,EAAA,EAC/B,IAAK,eACH,MAAO,CAAE,GAAGA,EAAO,SAAU,CAACA,EAAM,QAAA,EACtC,IAAK,aACH,MAAO,CAAE,GAAGA,EAAO,WAAY2P,EAAO,OAAA,EACxC,IAAK,eACH,MAAO,CAAE,GAAG3P,EAAO,WAAYuE,GAAgBvE,EAAM,UAAU,CAAA,EACjE,IAAK,iBAAkB,CACrB,GAAIA,EAAM,OAAO,QAAU,EAAG,MAAO,CAAE,GAAGA,EAAO,WAAY,GAAO,eAAgB,IAAA,EACpF,GAAI,CAACA,EAAM,WAAY,CACrB,MAAMkQ,EAAW,CAAC,GAAGlQ,EAAM,MAAM,EAC3BmQ,EAAW7N,GAAkB4N,EAAUlQ,EAAM,YAAY,EAC/D,MAAO,CACL,GAAGA,EACH,WAAY,GACZ,eAAgBkQ,EAChB,OAAQC,EACR,aAAc,CAAA,CAElB,CACA,MAAMC,EAAWpQ,EAAM,eAAiB,CAAC,GAAGA,EAAM,cAAc,EAAI,CAAC,GAAGA,EAAM,MAAM,EAC9EqQ,EAAUrQ,EAAM,OAAOA,EAAM,YAAY,EACzCsQ,EAAWtN,GAAyBoN,EAAUC,CAAO,EAC3D,MAAO,CACL,GAAGrQ,EACH,WAAY,GACZ,eAAgB,KAChB,OAAQoQ,EACR,aAAcjO,EAAWmO,EAAUF,EAAS,MAAM,CAAA,CAEtD,CACA,IAAK,OAAQ,CACX,MAAMG,EAAYlM,GAAiBrE,CAAK,EAClCwQ,EAAOD,IAAcvQ,EAAM,aACjC,MAAO,CACL,GAAGA,EACH,aAAcuQ,EACd,GAAIC,EAAO,CAAA,EAAKpB,EAChB,SAAUoB,EAAOxQ,EAAM,SAAW,EAAA,CAEtC,CACA,IAAK,OAAQ,CACX,MAAMyQ,EAAYnM,GAAiBtE,CAAK,EAClCwQ,EAAOC,IAAczQ,EAAM,aACjC,MAAO,CACL,GAAGA,EACH,aAAcyQ,EACd,GAAID,EAAO,CAAA,EAAKpB,EAChB,SAAUoB,EAAOxQ,EAAM,SAAW,EAAA,CAEtC,CACA,IAAK,oBACH,MAAO,CACL,GAAGA,EACH,YAAa2P,EAAO,QAAQ,YAC5B,SAAU,OAAO,SAASA,EAAO,QAAQ,QAAQ,EAC7CA,EAAO,QAAQ,SACf3P,EAAM,SACV,iBAAkB2P,EAAO,QAAQ,iBACjC,YAAa,EAAA,EAEjB,IAAK,wBACH,MAAO,CACL,GAAG3P,EACH,SAAU,OAAO,SAAS2P,EAAO,QAAQ,QAAQ,EAC7CA,EAAO,QAAQ,SACf3P,EAAM,SACV,iBAAkB2P,EAAO,QAAQ,iBACjC,aAAc,IAAA,EAElB,IAAK,oBACH,MAAO,CAAE,GAAG3P,EAAO,aAAc2P,EAAO,OAAA,EAC1C,IAAK,oBACH,MAAO,CAAE,GAAG3P,EAAO,aAAc2P,EAAO,OAAA,EAC1C,IAAK,cACH,MAAO,CACL,GAAG3P,EACH,aAAc2P,EAAO,QAAQ,QAC7B,SAAU,GACV,YAAa,EAAA,EAEjB,IAAK,gBACH,MAAO,CAAE,GAAG3P,EAAO,YAAa,EAAA,EAClC,IAAK,gBACH,MAAO,CAAE,GAAGA,EAAO,YAAa,GAAO,aAAc,IAAA,EACvD,IAAK,aACH,MAAO,CAAE,GAAGA,EAAO,SAAU,GAAO,YAAa,EAAA,EACnD,IAAK,cACH,MAAO,CAAE,GAAGA,EAAO,SAAU,EAAA,EAC/B,IAAK,oBACH,MAAO,CAAE,GAAGA,EAAO,YAAa,EAAG,SAAU,EAAG,iBAAkB,CAAA,EACpE,IAAK,uBACH,MAAO,CAAE,GAAGA,EAAO,GAAGoP,CAAA,EACxB,IAAK,aACH,MAAO,CAAE,GAAGpP,EAAO,OAAQiP,EAAYU,EAAO,OAAO,CAAA,EACvD,IAAK,YACH,MAAO,CAAE,GAAG3P,EAAO,MAAO2P,EAAO,OAAA,EACnC,IAAK,cACH,MAAO,CAAE,GAAG3P,EAAO,MAAO,CAACA,EAAM,KAAA,EACnC,IAAK,oBACH,MAAO,CAAE,GAAGA,EAAO,aAAcmP,GAAkBQ,EAAO,OAAO,CAAA,EACnE,IAAK,oBAAqB,CACxB,KAAM,CAAE,OAAAG,EAAQ,MAAA3H,CAAA,EAAUwH,EAAO,QAC3BT,EAAID,EAAYa,CAAM,EAC5B,OAAIZ,IAAMlP,EAAM,QAAUmI,IAAUnI,EAAM,MAAcA,EACjD,CAAE,GAAGA,EAAO,OAAQkP,EAAG,MAAA/G,CAAA,CAChC,CACA,QAGE,OAAOnI,CACT,CAEJ,CC5SA,SAAS0Q,IAAuC,CAC9C,OAAI,OAAO,UAAc,KAAe,EAAE,iBAAkB,WAAmB,KACxE,UAAU,YACnB,CAEO,SAASC,GACdC,EACA5Q,EACA6Q,EACM,OACN,MAAM9N,EAAQ/C,EAAM,OAAOA,EAAM,YAAY,EACvC8Q,EAAQ/N,GAAA,YAAAA,EAAO,MACfgO,EAAShO,GAAA,YAAAA,EAAO,OAChBiO,EAAQjO,GAAA,YAAAA,EAAO,MACfkO,EAAaxM,GAAkB1B,GAAO5C,EAAAH,EAAM,eAAN,YAAAG,EAAoB,UAAU,EAE1EO,EAAAA,UAAU,IAAM,CACd,MAAMwQ,EAAKR,GAAA,EACP,CAACE,GAAW,CAACM,IACjBA,EAAG,SAAW,IAAI,cAAc,CAC9B,MAAOJ,GAAS,gBAChB,OAAAC,EACA,MAAAC,EACA,QAASC,EAAa,CAAC,CAAE,IAAKA,CAAA,CAAY,EAAI,MAAA,CAC/C,EACH,EAAG,CAACL,EAASE,EAAOC,EAAQC,EAAOC,CAAU,CAAC,EAE9CvQ,EAAAA,UAAU,IAAM,CACd,MAAMwQ,EAAKR,GAAA,EACP,CAACE,GAAW,CAACM,IACjBA,EAAG,cAAgBlR,EAAM,SAAW,SAAW,UACjD,EAAG,CAAC4Q,EAAS5Q,EAAM,QAAQ,CAAC,EAE5BU,EAAAA,UAAU,IAAM,CACd,MAAMwQ,EAAKR,GAAA,EACX,GAAI,GAACE,GAAW,CAACM,GACjB,IAAI,CACFA,EAAG,iBAAiB,OAAQL,EAAQ,IAAI,EACxCK,EAAG,iBAAiB,QAASL,EAAQ,KAAK,EAC1CK,EAAG,iBAAiB,YAAaL,EAAQ,IAAI,EAC7CK,EAAG,iBAAiB,gBAAiBL,EAAQ,IAAI,EACjDK,EAAG,iBAAiB,SAAWC,GAAY,CACrC,OAAOA,EAAQ,UAAa,UAAY,OAAO,SAASA,EAAQ,QAAQ,GAC1EN,EAAQ,KAAKM,EAAQ,QAAQ,CAEjC,CAAC,CACH,MAAQ,CAER,CACA,MAAO,IAAM,CACX,GAAI,CACFD,EAAG,iBAAiB,OAAQ,IAAI,EAChCA,EAAG,iBAAiB,QAAS,IAAI,EACjCA,EAAG,iBAAiB,YAAa,IAAI,EACrCA,EAAG,iBAAiB,gBAAiB,IAAI,EACzCA,EAAG,iBAAiB,SAAU,IAAI,CACpC,MAAQ,CAER,CACF,EACF,EAAG,CAACN,EAASC,CAAO,CAAC,CACvB,CClCA,MAAMO,GAAsC,CACzC,yBAAqC,UACrC,uBAAmC,UACnC,qBAAiC,OACjC,uBAAmC,wBACnC,gCAA4C,UAC5C,0BAAsC,MACtC,sBAAkC,UAClC,8BAA0C,yBAC1C,wBAAoC,4BACpC,sBAAkC,oCACrC,EAEO,SAASC,GAAe,CAC7B,SAAAxP,EACA,cAAAyP,EAAgB,CAAA,EAChB,aAAAC,EAAe,EACf,oBAAAC,EAAsB,KACtB,eAAAC,EAAiB,GACjB,kBAAAC,EAAoB,MACpB,oBAAAC,EAAsB,WACtB,cAAAC,EAAgB,GAChB,cAAAC,EAAgB,EAChB,aAAAC,EAAe,GACf,oBAAAC,EAAsB,EACtB,gBAAAC,EACA,OAAApQ,EACA,aAAAqQ,EAAe,GACf,WAAAC,EACA,cAAAC,EACA,YAAAC,EACA,eAAAC,EAAiB,GACjB,oBAAAC,EAAsB,GACtB,SAAAzK,EAAW,GACX,QAAA0K,EAAU,GACV,UAAA9S,EACA,MAAAC,GACA,cAAA8S,EACA,OAAAC,EACA,QAAAC,EACA,WAAAC,GACA,QAAAlG,EACF,EAAwB,QACtB,MAAM3M,EAAWO,EAAAA,OAAgC,IAAI,EAC/C,CAACL,EAAOD,CAAQ,EAAI6S,EAAAA,WAAWlD,GAAe,OAAW,IAC7DJ,GAAmB,CACjB,OAAQgC,EACR,aAAcC,EACd,aAAcC,EACd,SAAUI,EACV,WAAYH,EACZ,WAAYC,EACZ,aAAcC,EACd,OAAQE,EACR,MAAOC,EACP,aAAcC,CAAA,CACf,CAAA,EAEGc,GAAWxS,EAAAA,OAAOL,CAAK,EAEvB8S,GAAgBzS,EAAAA,OAAO,CAC3B,OAAQiR,EACR,aAAcC,EACd,aAAcC,EACd,SAAUI,EACV,WAAYH,EACZ,WAAYC,EACZ,aAAcC,EACd,OAAQE,EACR,MAAOC,EACP,aAAcC,CAAA,CACf,EACDe,GAAc,QAAU,CACtB,OAAQxB,EACR,aAAcC,EACd,aAAcC,EACd,SAAUI,EACV,WAAYH,EACZ,WAAYC,EACZ,aAAcC,EACd,OAAQE,EACR,MAAOC,EACP,aAAcC,CAAA,EAGhB,MAAMgB,EAAyB1S,EAAAA,OAA+B,MAAS,EAEvEK,EAAAA,UAAU,IAAM,CACd,GAAIsR,IAAoB,OAAW,CACjCe,EAAuB,QAAU,OACjC,MACF,CACA,GAAIA,EAAuB,UAAY,OAAW,CAChDA,EAAuB,QAAUf,EACjC,MACF,CACA,GAAIe,EAAuB,UAAYf,EAAiB,OACxDe,EAAuB,QAAUf,EACjC,MAAMgB,EAAIF,GAAc,QACxB/S,EAAS,CACP,KAAM,OACN,QAAS,CACP,OAAQiT,EAAE,OACV,aAAcA,EAAE,aAChB,aAAcA,EAAE,aAChB,SAAUA,EAAE,SACZ,WAAYA,EAAE,WACd,WAAYA,EAAE,WACd,aAAcA,EAAE,aAChB,OAAQA,EAAE,OACV,MAAOA,EAAE,MACT,aAAcA,EAAE,YAAA,CAClB,CACD,CACH,EAAG,CAAChB,EAAiBjS,CAAQ,CAAC,EAE9BW,EAAAA,UAAU,IAAM,CACdmS,GAAS,QAAU7S,CACrB,EAAG,CAACA,CAAK,CAAC,EAEV,MAAMmL,GAAenL,EAAM,OAAOA,EAAM,YAAY,GAAK,KAEzDU,EAAAA,UAAU,IAAM,CACd8R,GAAA,MAAAA,EAAgBrH,GAAcnL,EAAM,aACtC,EAAG,CAACmL,GAAcnL,EAAM,aAAcwS,CAAa,CAAC,EAEpD9R,EAAAA,UAAU,IAAM,CACVV,EAAM,eAAcyM,IAAA,MAAAA,GAAUzM,EAAM,cAC1C,EAAG,CAACA,EAAM,aAAcyM,EAAO,CAAC,EAEhC,MAAMwG,GAAgB5S,EAAAA,OAA4B,MAAS,EAC3DK,EAAAA,UAAU,IAAM,CACd,GAAIuS,GAAc,UAAY,OAAW,CACvCA,GAAc,QAAUjT,EAAM,SAC9B,MACF,CACIiT,GAAc,UAAYjT,EAAM,WAC9BA,EAAM,SAAU0S,GAAA,MAAAA,IACfD,GAAA,MAAAA,KAEPQ,GAAc,QAAUjT,EAAM,QAChC,EAAG,CAACA,EAAM,SAAU0S,EAASD,CAAM,CAAC,EAEpC,MAAMS,EAAOC,EAAAA,YAAY,IAAM,CAC7BpT,EAAS,CAAE,KAAM,OAAQ,CAC3B,EAAG,CAAA,CAAE,EAECqT,EAAQD,EAAAA,YAAY,IAAM,OAC9BpT,EAAS,CAAE,KAAM,QAAS,GAC1BI,EAAAL,EAAS,UAAT,MAAAK,EAAkB,OACpB,EAAG,CAAA,CAAE,EAECkT,GAAkBF,EAAAA,YAAY,IAAM,CACpCnT,EAAM,SAAUkT,EAAA,EACfE,EAAA,CACP,EAAG,CAACA,EAAOF,EAAMlT,EAAM,QAAQ,CAAC,EAE1B4L,EAAOuH,cAAaG,GAAwB,CAChD,MAAMjU,EAAKS,EAAS,QACfT,GACA,OAAO,SAASiU,CAAW,IAChCjU,EAAG,YAAc,KAAK,IAAI,EAAGiU,CAAW,EAC1C,EAAG,CAAA,CAAE,EAECC,GAAYJ,cAAarD,GAAmB,CAChD/P,EAAS,CAAE,KAAM,aAAc,QAASkP,EAAYa,CAAM,EAAG,CAC/D,EAAG,CAAA,CAAE,EAEC0D,GAAWL,cAAahL,GAAmB,CAC/CpI,EAAS,CAAE,KAAM,YAAa,QAASoI,EAAO,CAChD,EAAG,CAAA,CAAE,EAECC,GAAa+K,EAAAA,YAAY,IAAM,CACnCpT,EAAS,CAAE,KAAM,cAAe,CAClC,EAAG,CAAA,CAAE,EAEC2I,GAAkByK,cAAa5R,GAAiB,CACpDxB,EAAS,CAAE,KAAM,oBAAqB,QAASoP,GAAkB5N,CAAI,EAAG,CAC1E,EAAG,CAAA,CAAE,EAECR,EAAOoS,EAAAA,YAAY,IAAM,CAC7BpT,EAAS,CAAE,KAAM,OAAQ,CAC3B,EAAG,CAAA,CAAE,EAECiB,EAAOmS,EAAAA,YAAY,IAAM,CAC7BpT,EAAS,CAAE,KAAM,OAAQ,CAC3B,EAAG,CAAA,CAAE,EAEC0T,GAAgBN,cAAa3O,GAAqB,CACtDzE,EAAS,CAAE,KAAM,aAAc,QAASyE,EAAM,CAChD,EAAG,CAAA,CAAE,EAEC4C,GAAc+L,EAAAA,YAAY,IAAM,CACpCpT,EAAS,CAAE,KAAM,eAAgB,CACnC,EAAG,CAAA,CAAE,EAEC2H,GAAgByL,EAAAA,YAAY,IAAM,CACtCpT,EAAS,CAAE,KAAM,iBAAkB,CACrC,EAAG,CAAA,CAAE,EAEC2T,GAAWP,EAAAA,YAAY,CAAC5Q,EAAiByB,IAA0B,CACvEjE,EAAS,CAAE,KAAM,YAAa,QAAS,CAAE,OAAAwC,EAAQ,aAAAyB,CAAA,EAAgB,CACnE,EAAG,CAAA,CAAE,EAECR,GAAgB2P,EAAAA,YAAY,CAACpQ,EAAcX,EAAgBuR,IAAuB,CACtF5T,EAAS,CAAE,KAAM,eAAgB,QAAS,CAAE,MAAAgD,EAAO,MAAAX,EAAO,SAAAuR,CAAA,EAAY,CACxE,EAAG,CAAA,CAAE,EAECjQ,GAAgByP,cAAa/Q,GAAkB,CACnDrC,EAAS,CAAE,KAAM,eAAgB,QAAS,CAAE,MAAAqC,CAAA,EAAS,CACvD,EAAG,CAAA,CAAE,EAECuB,GAAYwP,EAAAA,YAAY,CAACvP,EAAmBC,IAAoB,CACpE9D,EAAS,CAAE,KAAM,aAAc,QAAS,CAAE,UAAA6D,EAAW,QAAAC,CAAA,EAAW,CAClE,EAAG,CAAA,CAAE,EAEC+P,GAAcT,cAAapQ,GAAiB,CAChDhD,EAAS,CAAE,KAAM,WAAY,QAAS,CAAE,MAAAgD,CAAA,EAAS,CACnD,EAAG,CAAA,CAAE,EAEC0L,GAAc0E,cAAa/Q,GAAkB,CACjDrC,EAAS,CAAE,KAAM,YAAa,QAAS,CAAE,MAAAqC,EAAO,SAAU,EAAA,EAAQ,CACpE,EAAG,CAAA,CAAE,EAECsM,GAAgByE,cAAa/Q,GAAkB,CACnDrC,EAAS,CAAE,KAAM,YAAa,QAAS,CAAE,MAAAqC,EAAO,SAAU,EAAA,EAAS,CACrE,EAAG,CAAA,CAAE,EAECyR,GAAkBV,cAAaW,GAA8B,CACjE/T,EAAS,CAAE,KAAM,oBAAqB,QAAS+T,EAAM,CACvD,EAAG,CAAA,CAAE,EAECC,GAAkBZ,cAAa3O,GAAuB,CAC1DzE,EAAS,CAAE,KAAM,oBAAqB,QAASyE,EAAM,CACvD,EAAG,CAAA,CAAE,EAECwP,GAAOb,cAAac,GAA+B,CACvDlU,EAAS,CAAE,KAAM,OAAQ,QAAAkU,CAAA,CAAS,CACpC,EAAG,CAAA,CAAE,EAELvT,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC0R,GAAe,CAACC,EAAgB,OACrC,MAAMvC,EAASsC,EAAY,IAAI,eAAe,EACxCjK,EAAQiK,EAAY,IAAI,cAAc,EACtC3J,EAAe2J,EAAY,IAAI,qBAAqB,EACpDlO,EAAakO,EAAY,IAAI,mBAAmB,EAChDpO,GAAeoO,EAAY,IAAI,qBAAqB,EACpDY,EAAIF,GAAc,QACxB/S,EAAS,CACP,KAAM,OACN,QAAS,CACP,OAAQiT,EAAE,OACV,aAAcA,EAAE,aAChB,SAAUA,EAAE,SACZ,WAAYA,EAAE,WACd,aAAcA,EAAE,aAChB,aAAc,OAAOhP,IAAiB,SAAWA,GAAegP,EAAE,aAClE,WACE9O,IAAe,OAASA,IAAe,OAASA,IAAe,MAC3DA,EACA8O,EAAE,WACR,OAAQ,OAAOlD,GAAW,SAAWA,EAASkD,EAAE,OAChD,MAAO,OAAO7K,GAAU,UAAYA,EAAQ6K,EAAE,MAC9C,aAAc,OAAOvK,GAAiB,SAAWA,EAAeuK,EAAE,YAAA,CACpE,CACD,CACH,EAAG,CAACX,EAAgBD,CAAW,CAAC,EAEhC1R,EAAAA,UAAU,IAAM,CACT0R,IACLA,EAAY,IAAI,gBAAiBpS,EAAM,MAAM,EAC7CoS,EAAY,IAAI,eAAgBpS,EAAM,KAAK,EAC3CoS,EAAY,IAAI,sBAAuBpS,EAAM,YAAY,EACzDoS,EAAY,IAAI,oBAAqBpS,EAAM,UAAU,EACrDoS,EAAY,IAAI,sBAAuBpS,EAAM,YAAY,EAC3D,EAAG,CACDoS,EACApS,EAAM,OACNA,EAAM,MACNA,EAAM,aACNA,EAAM,WACNA,EAAM,YAAA,CACP,EAEDU,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC0R,GAAe,CAACE,EAAqB,OAC1C,MAAMvP,EAAQ/C,EAAM,OAAOA,EAAM,YAAY,EAC7C,GAAI,CAAC+C,EAAO,OACZ,MAAMmR,EAAM,iBAAiBpR,EAAcC,CAAK,CAAC,GAC3CoR,EAAQ/B,EAAY,IAAI8B,CAAG,EAC7B,OAAOC,GAAU,UAAY,OAAO,SAASA,CAAK,GACpDvI,EAAKuI,CAAK,CAEd,EAAG,CAAC/B,EAAaE,EAAqBtS,EAAM,aAAcA,EAAM,OAAQ4L,CAAI,CAAC,EAE7ElL,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC0R,GAAe,CAACE,EAAqB,OAC1C,MAAMvP,EAAQ/C,EAAM,OAAOA,EAAM,YAAY,EAC7C,GAAI,CAAC+C,GAAS,EAAE/C,EAAM,aAAe,GAAI,OACzC,MAAMkU,EAAM,iBAAiBpR,EAAcC,CAAK,CAAC,GAC3CqR,EAAK,WAAW,IAAMhC,EAAY,IAAI8B,EAAKlU,EAAM,WAAW,EAAG,GAAG,EACxE,MAAO,IAAM,aAAaoU,CAAE,CAC9B,EAAG,CAAChC,EAAaE,EAAqBtS,EAAM,aAAcA,EAAM,OAAQA,EAAM,WAAW,CAAC,EAE1F,MAAMqU,IAAalU,GAAAH,EAAM,OAAOA,EAAM,YAAY,IAA/B,YAAAG,GAAkC,QAErDO,EAAAA,UAAU,IAAM,CACd,MAAMrB,EAAKS,EAAS,QACpB,GAAI,CAACT,EAAI,OACT,GAAIW,EAAM,SAAU,CAClBX,EAAG,MAAA,EACH,MACF,CACA,IAAIiV,EAAY,GAChB,OAAM,SAAY,CAChB,GAAIpC,EAAY,CACd,IAAIqC,EAAU,GACd,GAAI,CACFA,EAAU,MAAMrC,EAAA,CAClB,OAASsC,EAAO,CACd,MAAMC,GAAUD,aAAiB,MAAQA,EAAM,QAAU,sBACzDzU,EAAS,CAAE,KAAM,cAAe,QAAS,CAAE,QAAA0U,EAAA,EAAW,EACtD,MACF,CACA,GAAI,CAACF,EAAS,CACPD,IACHvU,EAAS,CAAE,KAAM,QAAS,EAC1BoS,GAAA,MAAAA,KAEF,MACF,CACF,CACImC,GACCjV,EAAG,KAAA,EAAO,MAAO+B,GAAe,CACnC,MAAMsT,EACJtT,aAAa,MACTA,EAAE,QACF,OAAOA,GAAM,SACXA,EACA,gEACRrB,EAAS,CAAE,KAAM,cAAe,QAAS,CAAE,QAAS2U,CAAA,EAAO,CAC7D,CAAC,CACH,GAAA,EACO,IAAM,CACXJ,EAAY,EACd,CACF,EAAG,CAACpC,EAAYmC,GAAYlC,EAAenS,EAAM,QAAQ,CAAC,EAE1D,MAAMC,GAAckT,EAAAA,YAAY,IAAM,CACpC,MAAMwB,EAAa1Q,GAAuB4O,GAAS,OAAO,EAC1D,GAAI8B,EAAW,OAAS,cAAe,CACrC,MAAMtV,EAAKS,EAAS,QAChBT,IACFA,EAAG,YAAc,GAEnBU,EAAS,CAAE,KAAM,OAAQ,EACzB,MACF,CACA,GAAI4U,EAAW,OAAS,OAAQ,CAC9B5U,EAAS,CAAE,KAAM,QAAS,EAC1B4S,IAAA,MAAAA,KACA,MACF,CACA,MAAMpC,EAAYoE,EAAW,UAC7B5U,EAAS,CAAE,KAAM,YAAa,QAAS,CAAE,MAAOwQ,EAAW,SAAU,EAAA,EAAQ,CAC/E,EAAG,CAACoC,EAAU,CAAC,EAETiC,GAAsB/O,EAAAA,QAC1B,KAAO,CAAE,KAAAqN,EAAM,MAAAE,EAAO,KAAArS,EAAM,KAAAC,EAAM,KAAA4K,CAAA,GAClC,CAACsH,EAAME,EAAOrS,EAAMC,EAAM4K,CAAI,CAAA,EAEhC+E,GAAsB,EAAQsB,EAAejS,EAAO4U,EAAmB,EAEvE,MAAMC,GAAcjT,GAAA,MAAAA,EAAQ,MAAQ,kBAAkB,KAAKA,EAAO,IAAI,EAAI,MAAQ,MAE5EE,GAAQ+D,EAAAA,QACZ,KAAO,CACL,MAAA7F,EACA,SAAAD,EACA,SAAAD,EACA,YAAAG,GACA,KAAA+T,GACA,KAAAd,EACA,MAAAE,EACA,gBAAAC,GACA,KAAAzH,EACA,UAAA2H,GACA,SAAAC,GACA,WAAApL,GACA,gBAAAM,GACA,KAAA3H,EACA,KAAAC,EACA,cAAAyS,GACA,YAAArM,GACA,cAAAM,GACA,SAAAgM,GACA,cAAAlQ,GACA,cAAAE,GACA,UAAAC,GACA,YAAAiQ,GACA,YAAAnF,GACA,cAAAC,GACA,gBAAAmF,GACA,gBAAAE,EAAA,GAEF,CACE3M,GACArH,EACAiU,GACAjT,EACAd,GACAmT,EACAF,EACAzE,GACAjL,GACAE,GACAC,GACAiQ,GACAlF,GACA1N,EACA4K,EACA4H,GACA9K,GACAgL,GACAD,GACAI,GACAE,GACAR,GACAvT,EACAoI,GACAiL,GACA3L,EAAA,CACF,EAGIoN,GAAgBjP,EAAAA,QACpB,KAAO,CACL,OAAQ7F,EAAM,OACd,aAAcA,EAAM,aACpB,SAAUA,EAAM,SAChB,WAAYA,EAAM,WAClB,WAAYA,EAAM,WAClB,eAAgBA,EAAM,eACtB,aAAcA,EAAM,aACpB,KAAAgU,GACA,KAAAd,EACA,MAAAE,EACA,gBAAAC,GACA,KAAAtS,EACA,KAAAC,EACA,cAAAyS,GACA,YAAArM,GACA,cAAAM,GACA,aAAc1H,EAAM,aACpB,SAAA0T,GACA,cAAAlQ,GACA,cAAAE,GACA,UAAAC,GACA,YAAAiQ,GACA,YAAAnF,GACA,cAAAC,GACA,gBAAAmF,GACA,gBAAAE,GACA,SAAAhU,CAAA,GAEF,CACEC,EAAM,OACNA,EAAM,aACNA,EAAM,SACNA,EAAM,WACNA,EAAM,WACNA,EAAM,aACNA,EAAM,eACNA,EAAM,aACNgU,GACAd,EACAE,EACAC,GACAtS,EACAC,EACAyS,GACArM,GACAM,GACAgM,GACAlQ,GACAE,GACAC,GACAiQ,GACAnF,GACAC,GACAmF,GACAE,GACAhU,CAAA,CACF,EAGIgV,GAAalP,EAAAA,QACjB,KAAO,CACL,YAAa7F,EAAM,YACnB,SAAUA,EAAM,SAChB,iBAAkBA,EAAM,iBACxB,YAAaA,EAAM,YACnB,aAAcA,EAAM,aACpB,OAAQA,EAAM,OACd,MAAOA,EAAM,MACb,aAAcA,EAAM,aACpB,KAAA4L,EACA,UAAA2H,GACA,SAAAC,GACA,WAAApL,GACA,gBAAAM,GACA,SAAA5I,EACA,YAAAG,GACA,SAAAF,CAAA,GAEF,CACEC,EAAM,YACNA,EAAM,SACNA,EAAM,iBACNA,EAAM,YACNA,EAAM,aACNA,EAAM,OACNA,EAAM,MACNA,EAAM,aACN4L,EACA2H,GACAC,GACApL,GACAM,GACA5I,EACAG,GACAF,CAAA,CACF,EAGIiV,GAAalQ,GAAsB9E,CAAK,EAExC8H,GAAcjC,EAAAA,QAClB,IAAOgC,EAAWnI,GAAQ,CAAE,GAAG0R,GAAsB,GAAG1R,EAAA,EACxD,CAACA,GAAOmI,CAAQ,CAAA,EAGZoN,EAAapP,EAAAA,QACjB,KAAO,CACL,UAAApG,EACA,MAAOqI,GACP,uBAAwBkN,GACxB,IAAKH,EAAA,GAEP,CAACpV,EAAWqI,GAAakN,GAAYH,EAAW,CAAA,EAG5CK,GAAQrP,EAAAA,QAAQ,IAAM,CAC1B,GAAI,CAAC0M,EACH,OACEpR,EAAAA,IAAC,MAAA,CACC,UAAW8T,EAAW,UACtB,MAAOA,EAAW,MAClB,uBAAsBA,EAAW,sBAAsB,EACvD,IAAKA,EAAW,IAEf,SAAApT,CAAA,CAAA,EAIP,MAAMsT,EAAOC,EAAAA,SAAS,KAAKvT,CAAQ,EACnC,GAAI,CAACwT,EAAAA,eAAeF,CAAI,EACtB,MAAM,IAAI,MAAM,+DAA+D,EAEjF,MAAMG,EAAQH,EACRI,EAAaD,EAAM,MAAM,MAC/B,OAAOE,EAAAA,aAAaF,EAAgD,CAClE,UAAWG,GAAgBH,EAAM,MAAM,UAAWL,EAAW,SAAS,EACtE,MACEM,GAAc,OAAOA,GAAe,SAChC,CAAE,GAAGA,EAAY,GAAGN,EAAW,KAAA,EAC/BA,EAAW,MACjB,uBAAwBA,EAAW,sBAAsB,EACzD,IAAKA,EAAW,GAAA,CACjB,CACH,EAAG,CAAC1C,EAAS1Q,EAAUoT,CAAU,CAAC,EAElC,OACE9T,EAAAA,IAACQ,IAAqB,OAAAC,EACpB,SAAAT,EAAAA,IAACuU,wBAAsB,SAAtB,CAA+B,MAAOZ,GACrC,SAAA3T,EAAAA,IAACwU,EAAAA,mBAAmB,SAAnB,CAA4B,MAAOZ,GAClC,SAAA5T,EAAAA,IAACpC,GAAc,SAAd,CAAuB,MAAA+C,GAAe,SAAAoT,EAAA,CAAM,CAAA,CAC/C,CAAA,CACF,CAAA,CACF,CAEJ,CAEA,SAASO,GAAgB9M,EAAY1B,EAAgC,CACnE,MAAM2O,EAAS,CAACjN,EAAG1B,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC9C,OAAO2O,IAAW,GAAK,OAAYA,CACrC,CCpnBO,MAAMC,GAAS,CACpB,SAAUxE,GACV,OAAQ7R,GACR,QAAS,CACP,MAAOsW,GACP,OAAQC,GACR,MAAOC,GACP,YAAaC,GACb,UAAWC,GACX,MAAOC,GACP,MAAOC,GACP,KAAMC,GACN,YAAaC,GACb,KAAMC,GACN,OAAQC,GACR,aAAcC,GACd,SAAUC,GACV,QAASC,GACT,QAASC,GACT,WAAYC,GACZ,YAAaC,GACb,cAAeC,GACf,QAASC,GACT,SAAUC,GACV,UAAWC,GACX,SAAUC,GACV,SAAUC,GACV,WAAYC,GACZ,cAAeC,GACf,aAAcC,EAAQ,EAExB,MAAO,CACL,MAAOC,GACP,SAAUC,GACV,YAAaC,GACb,UAAWC,GACX,QAASC,EAAM,EAEjB,QAAS,CACP,UAAWC,GACX,OAAQC,GACR,KAAMC,GACN,SAAUC,GACV,QAASC,GACT,QAASC,GACT,OAAQC,GACR,KAAMC,GACN,aAAcC,EAAQ,EAExB,SAAUtJ,EACZ"}
|