@epic-web/workshop-app 6.76.4 → 6.76.6
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/build/client/assets/_layout-DWtIbdIZ.js +2 -0
- package/build/client/assets/_layout-DWtIbdIZ.js.map +1 -0
- package/build/client/assets/{manifest-67762d3f.js → manifest-e7d8287f.js} +1 -1
- package/build/client/assets/{root-BwYDIUyI.js → root-B-MkiU1r.js} +2 -2
- package/build/client/assets/{root-BwYDIUyI.js.map → root-B-MkiU1r.js.map} +1 -1
- package/build/client/assets/tailwind-KHNSKced.css +1 -0
- package/build/server/index.js +18 -6
- package/build/server/index.js.map +1 -1
- package/package.json +3 -3
- package/build/client/assets/_layout-BDFC2e7T.js +0 -2
- package/build/client/assets/_layout-BDFC2e7T.js.map +0 -1
- package/build/client/assets/tailwind-C8PqsZFp.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":";uhCAGA,IAAIA,EAAiB,CACnB,OAAQ,SAASC,EAAGC,EAAGC,EAAIC,EAAG,CAC5B,IAAIC,EAAIF,EAAKD,EACb,OAAOG,EAAIJ,EAAIG,EAAIF,CACvB,EACE,WAAY,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CAChC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,GAAKJ,GAAKG,GAAKH,EAAIC,CAC9B,EACE,YAAa,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,GAAKJ,GAAKG,IAAMH,EAAI,GAAKC,CACrC,EACE,cAAe,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,OAAKD,GAAKG,EAAI,GAAK,EACVC,EAAI,EAAIJ,EAAIA,EAAIC,EAEhB,CAACG,EAAI,GAAM,EAAEJ,GAAMA,EAAI,GAAK,GAAKC,CAE9C,EACE,YAAa,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,GAAKJ,GAAKG,GAAKH,EAAIA,EAAIC,CAClC,EACE,aAAc,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CAClC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,IAAMJ,EAAIA,EAAIG,EAAI,GAAKH,EAAIA,EAAI,GAAKC,CAC/C,EACE,eAAgB,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACpC,IAAIC,EAAIF,EAAKD,EACb,OAAKD,GAAKG,EAAI,GAAK,EACVC,EAAI,EAAIJ,EAAIA,EAAIA,EAAIC,EAEpBG,EAAI,IAAMJ,GAAK,GAAKA,EAAIA,EAAI,GAAKC,CAE9C,EACE,YAAa,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,GAAKJ,GAAKG,GAAKH,EAAIA,EAAIA,EAAIC,CACtC,EACE,aAAc,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CAClC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,IAAMJ,EAAIA,EAAIG,EAAI,GAAKH,EAAIA,EAAIA,EAAI,GAAKC,CACpD,EACE,eAAgB,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACpC,IAAIC,EAAIF,EAAKD,EACb,OAAKD,GAAKG,EAAI,GAAK,EACVC,EAAI,EAAIJ,EAAIA,EAAIA,EAAIA,EAAIC,EAExB,CAACG,EAAI,IAAMJ,GAAK,GAAKA,EAAIA,EAAIA,EAAI,GAAKC,CAEnD,EACE,YAAa,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,GAAKJ,GAAKG,GAAKH,EAAIA,EAAIA,EAAIA,EAAIC,CAC1C,EACE,aAAc,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CAClC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,IAAMJ,EAAIA,EAAIG,EAAI,GAAKH,EAAIA,EAAIA,EAAIA,EAAI,GAAKC,CACvD,EACE,eAAgB,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACpC,IAAIC,EAAIF,EAAKD,EACb,OAAKD,GAAKG,EAAI,GAAK,EACVC,EAAI,EAAIJ,EAAIA,EAAIA,EAAIA,EAAIA,EAAIC,EAE5BG,EAAI,IAAMJ,GAAK,GAAKA,EAAIA,EAAIA,EAAIA,EAAI,GAAKC,CAEtD,EACE,WAAY,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CAChC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,EAAI,KAAK,IAAIJ,EAAIG,GAAK,KAAK,GAAK,EAAE,EAAIC,EAAIH,CACtD,EACE,YAAa,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,EAAI,KAAK,IAAIJ,EAAIG,GAAK,KAAK,GAAK,EAAE,EAAIF,CACjD,EACE,cAAe,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,EAAI,GAAK,KAAK,IAAI,KAAK,GAAKJ,EAAIG,CAAC,EAAI,GAAKF,CACtD,EACE,WAAY,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CAChC,IAAIC,EAAIF,EAAKD,EACb,OAAQD,GAAG,EAAKC,EAAIG,EAAI,KAAK,IAAI,EAAG,IAAMJ,EAAEG,EAAI,EAAE,EAAIF,CAC1D,EACE,YAAa,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAQD,GAAGG,EAAKF,EAAEG,EAAIA,GAAK,CAAC,KAAK,IAAI,EAAG,IAAMJ,EAAEG,CAAC,EAAI,GAAKF,CAC9D,EACE,cAAe,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,OAAID,IAAM,EACDC,EAELD,IAAMG,EACDF,EAAIG,GAERJ,GAAKG,EAAI,GAAK,EACVC,EAAI,EAAI,KAAK,IAAI,EAAG,IAAMJ,EAAI,EAAE,EAAIC,EAEpCG,EAAI,GAAK,CAAC,KAAK,IAAI,EAAG,IAAM,EAAEJ,CAAC,EAAI,GAAKC,CAErD,EACE,WAAY,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CAChC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,GAAK,KAAK,KAAK,GAAKJ,GAAKG,GAAKH,CAAC,EAAI,GAAKC,CACpD,EACE,YAAa,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,EAAI,KAAK,KAAK,GAAKJ,EAAIA,EAAIG,EAAI,GAAKH,CAAC,EAAIC,CACpD,EACE,cAAe,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,OAAKD,GAAKG,EAAI,GAAK,EACV,CAACC,EAAI,GAAK,KAAK,KAAK,EAAIJ,EAAIA,CAAC,EAAI,GAAKC,EAEtCG,EAAI,GAAK,KAAK,KAAK,GAAKJ,GAAK,GAAKA,CAAC,EAAI,GAAKC,CAEzD,EACE,cAAe,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACTI,EAAGC,EAAGC,EAIV,OAHAA,EAAI,QACJD,EAAI,EACJD,EAAID,EACAJ,IAAM,EACDC,GACGD,GAAKG,KAAO,EACfF,EAAIG,GAERE,IACHA,EAAIH,EAAI,IAENE,EAAI,KAAK,IAAID,CAAC,GAChBC,EAAID,EACJG,EAAID,EAAI,GAERC,EAAID,GAAK,EAAI,KAAK,IAAM,KAAK,KAAKF,EAAIC,CAAC,EAElC,EAAEA,EAAI,KAAK,IAAI,EAAG,IAAML,GAAK,EAAE,EAAI,KAAK,KAAKA,EAAIG,EAAII,IAAM,EAAI,KAAK,IAAMD,CAAC,GAAKL,EAC3F,EACE,eAAgB,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACpC,IAAIC,EAAIF,EAAKD,EACTI,EAAGC,EAAGC,EAIV,OAHAA,EAAI,QACJD,EAAI,EACJD,EAAID,EACAJ,IAAM,EACDC,GACGD,GAAKG,KAAO,EACfF,EAAIG,GAERE,IACHA,EAAIH,EAAI,IAENE,EAAI,KAAK,IAAID,CAAC,GAChBC,EAAID,EACJG,EAAID,EAAI,GAERC,EAAID,GAAK,EAAI,KAAK,IAAM,KAAK,KAAKF,EAAIC,CAAC,EAElCA,EAAI,KAAK,IAAI,EAAG,IAAML,CAAC,EAAI,KAAK,KAAKA,EAAIG,EAAII,IAAM,EAAI,KAAK,IAAMD,CAAC,EAAIF,EAAIH,EACtF,EACE,iBAAkB,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACtC,IAAIC,EAAIF,EAAKD,EACTI,EAAGC,EAAGC,EAIV,OAHAA,EAAI,QACJD,EAAI,EACJD,EAAID,EACAJ,IAAM,EACDC,GACGD,GAAKG,EAAI,KAAO,EACnBF,EAAIG,GAERE,IACHA,EAAIH,GAAK,GAAM,MAEbE,EAAI,KAAK,IAAID,CAAC,GAChBC,EAAID,EACJG,EAAID,EAAI,GAERC,EAAID,GAAK,EAAI,KAAK,IAAM,KAAK,KAAKF,EAAIC,CAAC,EAErCL,EAAI,EACC,KAAQK,EAAI,KAAK,IAAI,EAAG,IAAML,GAAK,EAAE,EAAI,KAAK,KAAKA,EAAIG,EAAII,IAAM,EAAI,KAAK,IAAMD,CAAC,GAAKL,EAEtFI,EAAI,KAAK,IAAI,EAAG,KAAOL,GAAK,EAAE,EAAI,KAAK,KAAKA,EAAIG,EAAII,IAAM,EAAI,KAAK,IAAMD,CAAC,EAAI,GAAMF,EAAIH,EAErG,EACE,WAAY,SAASD,EAAGC,EAAGC,EAAIC,EAAGI,EAAG,CACnC,IAAIH,EAAIF,EAAKD,EACb,OAAIM,IAAM,SACRA,EAAI,SAECH,GAAKJ,GAAKG,GAAKH,IAAMO,EAAI,GAAKP,EAAIO,GAAKN,CAClD,EACE,YAAa,SAASD,EAAGC,EAAGC,EAAIC,EAAGI,EAAG,CACpC,IAAIH,EAAIF,EAAKD,EACb,OAAIM,IAAM,SACRA,EAAI,SAECH,IAAMJ,EAAIA,EAAIG,EAAI,GAAKH,IAAMO,EAAI,GAAKP,EAAIO,GAAK,GAAKN,CAC/D,EACE,cAAe,SAASD,EAAGC,EAAGC,EAAIC,EAAGI,EAAG,CACtC,IAAIH,EAAIF,EAAKD,EAIb,OAHIM,IAAM,SACRA,EAAI,UAEDP,GAAKG,EAAI,GAAK,EACVC,EAAI,GAAKJ,EAAIA,KAAOO,GAAK,OAAS,GAAKP,EAAIO,IAAMN,EAEjDG,EAAI,IAAMJ,GAAK,GAAKA,KAAOO,GAAK,OAAS,GAAKP,EAAIO,GAAK,GAAKN,CAEzE,EACE,aAAc,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CAClC,IAAIC,EAAIF,EAAKD,EACTO,EACJ,OAAAA,EAAIT,EAAe,cAAcI,EAAIH,EAAG,EAAGI,EAAGD,CAAC,EACxCC,EAAII,EAAIP,CACnB,EACE,cAAe,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,OAAKD,GAAKG,GAAK,EAAI,KACVC,GAAK,OAASJ,EAAIA,GAAKC,EACrBD,EAAI,EAAI,KACVI,GAAK,QAAUJ,GAAK,IAAM,MAAQA,EAAI,KAAQC,EAC5CD,EAAI,IAAM,KACZI,GAAK,QAAUJ,GAAK,KAAO,MAAQA,EAAI,OAAUC,EAEjDG,GAAK,QAAUJ,GAAK,MAAQ,MAAQA,EAAI,SAAYC,CAEjE,EACE,gBAAiB,SAASD,EAAGC,EAAGC,EAAIC,EAAG,CACrC,IAAIC,EAAIF,EAAKD,EACTO,EACJ,OAAIR,EAAIG,EAAI,GACVK,EAAIT,EAAe,aAAaC,EAAI,EAAG,EAAGI,EAAGD,CAAC,EACvCK,EAAI,GAAMP,IAEjBO,EAAIT,EAAe,cAAcC,EAAI,EAAIG,EAAG,EAAGC,EAAGD,CAAC,EAC5CK,EAAI,GAAMJ,EAAI,GAAMH,EAEjC,GAGA,OAAAQ,EAAiBV,gCCrPjB,SAASW,GAAkBC,EAAQC,EAAO,CACxC,QAASC,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAAK,CACrC,IAAIC,EAAaF,EAAMC,CAAC,EACxBC,EAAW,WAAaA,EAAW,YAAc,GACjDA,EAAW,aAAe,GACtB,UAAWA,IAAYA,EAAW,SAAW,IACjD,OAAO,eAAeH,EAAQG,EAAW,IAAKA,CAAU,CAC1D,CACF,CAEA,SAASC,GAAaC,EAAaC,EAAYC,EAAa,CAC1D,OAAID,GAAYP,GAAkBM,EAAY,UAAWC,CAAU,EAE5DD,CACT,CAEA,SAASG,GAAW,CAClB,OAAAA,EAAW,OAAO,QAAU,SAAUR,EAAQ,CAC5C,QAASE,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CACzC,IAAIO,EAAS,UAAUP,CAAC,EAExB,QAASQ,KAAOD,EACV,OAAO,UAAU,eAAe,KAAKA,EAAQC,CAAG,IAClDV,EAAOU,CAAG,EAAID,EAAOC,CAAG,EAG9B,CAEA,OAAOV,CACT,EAEOQ,EAAS,MAAM,KAAM,SAAS,CACvC,CAEA,SAASG,GAAeC,EAAUC,EAAY,CAC5CD,EAAS,UAAY,OAAO,OAAOC,EAAW,SAAS,EACvDD,EAAS,UAAU,YAAcA,EAEjCE,EAAgBF,EAAUC,CAAU,CACtC,CAEA,SAASC,EAAgBC,EAAGpB,EAAG,CAC7B,OAAAmB,EAAkB,OAAO,gBAAkB,SAAyBC,EAAGpB,EAAG,CACxE,OAAAoB,EAAE,UAAYpB,EACPoB,CACT,EAEOD,EAAgBC,EAAGpB,CAAC,CAC7B,CAEA,SAASqB,GAAcC,EAAS,CAC9B,OAAOA,EAAU,KAAK,GAAK,GAC7B,CACA,SAASC,EAAYC,EAAKC,EAAK,CAC7B,OAAOD,EAAM,KAAK,OAAM,GAAMC,EAAMD,EACtC,CACA,SAASE,GAAUF,EAAKC,EAAK,CAC3B,OAAO,KAAK,MAAMD,EAAM,KAAK,OAAM,GAAMC,EAAMD,EAAM,EAAE,CACzD,CAEA,IAAIG,GAEH,SAAUA,EAAe,CACxBA,EAAcA,EAAc,OAAY,CAAC,EAAI,SAC7CA,EAAcA,EAAc,OAAY,CAAC,EAAI,SAC7CA,EAAcA,EAAc,MAAW,CAAC,EAAI,OAC9C,GAAGA,IAAkBA,EAAgB,GAAG,EAExC,IAAIC,GAEH,SAAUA,EAAmB,CAC5BA,EAAkBA,EAAkB,SAAc,CAAC,EAAI,WACvDA,EAAkBA,EAAkB,SAAc,EAAE,EAAI,UAC1D,GAAGA,IAAsBA,EAAoB,GAAG,EAEhD,IAAIC,IAAwB,UAAY,CACtC,SAASA,EAASC,EAASC,EAAYC,EAAGC,EAAG,CAC3C,KAAK,WAAaF,EAElB,IAAIG,EAAmB,KAAK,WAAU,EAClCC,EAASD,EAAiB,OAC1BE,EAAmBF,EAAiB,iBACpCG,EAAmBH,EAAiB,iBAExC,KAAK,QAAUJ,EACf,KAAK,EAAIE,EACT,KAAK,EAAIC,EACT,KAAK,EAAIV,EAAY,EAAG,EAAE,EAC1B,KAAK,EAAIA,EAAY,EAAG,EAAE,EAC1B,KAAK,OAASA,EAAY,EAAG,EAAE,EAC/B,KAAK,GAAKA,EAAY,CAACa,EAAkBA,CAAgB,EACzD,KAAK,GAAKb,EAAY,CAACc,EAAkB,CAAC,EAC1C,KAAK,MAAQX,GAAU,EAAG,CAAC,EAC3B,KAAK,MAAQL,GAAcE,EAAY,EAAG,GAAG,CAAC,EAC9C,KAAK,YAAcA,EAAY,IAAM,EAAG,EACxC,KAAK,MAAQY,EAAO,KAAK,MAAM,KAAK,OAAM,EAAKA,EAAO,MAAM,CAAC,EAC7D,KAAK,QAAUZ,EAAY,EAAG,CAAC,EAC/B,KAAK,kBAAoBA,EAAY,EAAG,CAAC,EAAIK,EAAkB,SAAWA,EAAkB,QAC9F,CAEA,IAAIU,EAAST,EAAS,UAEtB,OAAAS,EAAO,OAAS,UAAkB,CAChC,IAAIC,EAAoB,KAAK,WAAU,EACnCC,EAAUD,EAAkB,QAC5BE,EAAOF,EAAkB,KACzBG,EAAWH,EAAkB,SAC7BI,EAAUJ,EAAkB,QAC5BK,EAAYL,EAAkB,UAElC,KAAK,GAAK,KAAK,GACf,KAAK,GAAK,KAAK,GACf,KAAK,IAAMC,EACX,KAAK,IAAMC,EACX,KAAK,IAAMC,EACX,KAAK,IAAMA,EAEP,KAAK,SAAW,GAAK,KAAK,oBAAsBd,EAAkB,SACpE,KAAK,kBAAoBA,EAAkB,SAClC,KAAK,SAAW,IAAM,KAAK,oBAAsBA,EAAkB,WAC5E,KAAK,kBAAoBA,EAAkB,UAG7C,IAAIiB,EAAc,GAAM,KAAK,kBAe7B,GAdA,KAAK,SAAWA,EAChB,KAAK,OAAS,KAAK,YACnB,KAAK,QAAQ,KAAI,EACjB,KAAK,QAAQ,UAAU,KAAK,EAAG,KAAK,CAAC,EACrC,KAAK,QAAQ,OAAO,KAAK,KAAK,EAC9B,KAAK,QAAQ,MAAM,EAAG,KAAK,OAAO,EAClC,KAAK,QAAQ,OAAO,KAAK,KAAK,EAC9B,KAAK,QAAQ,UAAS,EACtB,KAAK,QAAQ,UAAY,KAAK,MAC9B,KAAK,QAAQ,YAAc,KAAK,MAChC,KAAK,QAAQ,YAAcF,EAC3B,KAAK,QAAQ,QAAU,QACvB,KAAK,QAAQ,UAAY,EAErBC,GAAa,OAAOA,GAAc,WACpCA,EAAU,KAAK,KAAM,KAAK,OAAO,MAEjC,QAAQ,KAAK,MAAK,CAChB,KAAKjB,EAAc,OACjB,CACE,KAAK,QAAQ,UAAS,EACtB,KAAK,QAAQ,IAAI,EAAG,EAAG,KAAK,OAAQ,EAAG,EAAI,KAAK,EAAE,EAClD,KAAK,QAAQ,KAAI,EACjB,KACF,CAEF,KAAKA,EAAc,OACjB,CACE,KAAK,QAAQ,SAAS,CAAC,KAAK,EAAI,EAAG,CAAC,KAAK,EAAI,EAAG,KAAK,EAAG,KAAK,CAAC,EAC9D,KACF,CAEF,KAAKA,EAAc,MACjB,CACE,KAAK,QAAQ,SAAS,CAAC,KAAK,EAAI,EAAG,CAAC,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,CAAC,EAClE,KACF,CAEF,QAEI,MAAM,IAAI,MAAM,6BAA6B,CAEzD,CAGI,KAAK,QAAQ,UAAS,EACtB,KAAK,QAAQ,QAAO,CACtB,EAEOE,CACT,GAAC,EAEGiB,GAAyB,SAAgCC,EAAQhB,EAAY,CAC/E,IAAIiB,EAAQ,KAEZ,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,mBAAqB,EAC1B,KAAK,cAAgB,KAAK,IAAG,EAC7B,KAAK,UAAY,GACjB,KAAK,mBAAqB,EAE1B,KAAK,iBAAmB,SAAUzC,EAAG,CACnCyC,EAAM,UAAU,OAAOzC,EAAG,CAAC,CAC7B,EAEA,KAAK,YAAc,UAAY,CAC7B,IAAI0C,EAAe1B,EAAYyB,EAAM,EAAGA,EAAM,EAAIA,EAAM,CAAC,EACrDE,EAAe3B,EAAYyB,EAAM,EAAGA,EAAM,EAAIA,EAAM,CAAC,EACzD,OAAO,IAAInB,GAASmB,EAAM,QAASA,EAAM,WAAYC,EAAcC,CAAY,CACjF,EAEA,KAAK,QAAU,UAAY,CACzB,IAAIH,EAASC,EAAM,OACflB,EAAUkB,EAAM,QAChBG,EAAqBH,EAAM,mBAC3BI,EAAqBJ,EAAM,mBAE3Bd,EAAmBc,EAAM,WAAU,EACnCK,EAAMnB,EAAiB,IACvBoB,EAAUpB,EAAiB,QAC3BqB,EAAiBrB,EAAiB,eAClCsB,EAAQtB,EAAiB,MACzBuB,EAAgBvB,EAAiB,cACjCwB,EAAgBxB,EAAiB,cAErC,GAAI,CAACmB,EACH,MAAO,GAGT,IAAIM,EAAKX,EAAM,UAAU,OACrBY,EAAcN,EAAUK,EAAKR,EAC7BU,EAAM,KAAK,MAEf,GAAID,EAAcL,EAAgB,CAE5BH,IAAuBG,IACzBP,EAAM,cAAgBa,EACtBb,EAAM,mBAAqBO,GAU7B,QAPIO,EAAgBd,EAAM,cAGtBe,EAAeF,EAAMC,EAAgBJ,EAAgBA,EAAgB,KAAK,IAAI,EAAGG,EAAMC,CAAa,EACpGE,EAAaP,EAAcM,EAAcH,EAAaL,EAAgBG,CAAa,EACnFO,EAAW,KAAK,MAAMD,EAAaJ,CAAW,EAEzCrD,EAAI,EAAGA,EAAI0D,EAAU1D,GAAK,EACjCyC,EAAM,UAAU,KAAKA,EAAM,YAAW,CAAE,EAG1CA,EAAM,oBAAsBiB,CAC9B,CAEA,OAAIT,IAEF1B,EAAQ,KAAO,kBACfA,EAAQ,UAAY,OACpBA,EAAQ,UAAY,QACpBA,EAAQ,SAAS,cAAgB6B,EAAIZ,EAAO,MAAQ,GAAIA,EAAO,OAAS,EAAE,GAI5EC,EAAM,UAAU,QAAQ,SAAUhD,EAAGO,EAAG,CAEtCP,EAAE,OAAM,GAEJA,EAAE,EAAI+C,EAAO,QAAU/C,EAAE,EAAI,MAAQA,EAAE,EAAI+C,EAAO,MAAQ,KAAO/C,EAAE,EAAI,QACrEsD,GAAWM,GAAeL,EAE5BP,EAAM,UAAUzC,CAAC,EAAIyC,EAAM,YAAW,EAEtCA,EAAM,iBAAiBzC,CAAC,EAG9B,CAAC,EAEMoD,EAAK,GAAKC,EAAcL,CACjC,EAEA,KAAK,OAASR,EACd,IAAImB,EAAM,KAAK,OAAO,WAAW,IAAI,EAErC,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,8BAA8B,EAGhD,KAAK,QAAUA,EACf,KAAK,WAAanC,CACpB,EAEIoC,EAAmB,CACrB,MAAO,OAAO,OAAW,IAAc,OAAO,WAAa,IAC3D,OAAQ,OAAO,OAAW,IAAc,OAAO,YAAc,IAC7D,eAAgB,IAChB,SAAU,IACV,KAAM,EACN,QAAS,GACT,iBAAkB,EAClB,iBAAkB,GAClB,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAClM,QAAS,EACT,MAAO,GACP,cAAeC,GAAO,cACtB,cAAe,IACf,QAAS,GACT,IAAK,EACP,EACIC,IAAwB,UAAY,CACtC,SAASA,EAAStB,EAAQuB,EAAM,CAC9B,IAAItB,EAAQ,KAEZ,KAAK,uBAAyB,SAAUsB,EAAM,CAC5C,IAAIC,EAA2B,CAC7B,eAAgB,CACd,EAAG,EACH,EAAG,EACH,EAAGvB,EAAM,OAAO,MAChB,EAAG,CACb,CACA,EACMA,EAAM,SAAWnC,EAAS,GAAI0D,EAA0BJ,EAAkBG,CAAI,EAC9E,OAAO,OAAOtB,EAAOsB,EAAK,cAAc,CAC1C,EAEA,KAAK,OAAS,UAAY,CACxB,IAAIE,EAAgBxB,EAAM,QACtBK,EAAMmB,EAAc,IACpBC,EAAqBD,EAAc,mBACnCzB,EAASC,EAAM,OACflB,EAAUkB,EAAM,QAEhBK,IACFvB,EAAQ,UAAY,QACpBA,EAAQ,UAAU,EAAG,EAAGiB,EAAO,MAAOA,EAAO,MAAM,GAGjDC,EAAM,UAAU,UAClBA,EAAM,MAAQ,sBAAsBA,EAAM,MAAM,GAE5CyB,GAAsB,OAAOA,GAAuB,YAAczB,EAAM,UAAU,mBAAqB,GACzGyB,EAAmB,KAAKzB,EAAOA,CAAK,EAGtCA,EAAM,SAAS,IAAM,GAEzB,EAEA,KAAK,MAAQ,UAAY,CACnBA,EAAM,WAAaA,EAAM,UAAU,mBAAqB,IAC1DA,EAAM,UAAU,mBAAqB,EACrCA,EAAM,UAAU,UAAY,GAC5BA,EAAM,UAAU,mBAAqB,EAEzC,EAEA,KAAK,KAAO,UAAY,CACtBA,EAAM,QAAU,CACd,IAAK,EACb,EAEUA,EAAM,QACR,qBAAqBA,EAAM,KAAK,EAChCA,EAAM,MAAQ,OAElB,EAEA,KAAK,OAASD,EACd,IAAImB,EAAM,KAAK,OAAO,WAAW,IAAI,EAErC,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,8BAA8B,EAGhD,KAAK,QAAUA,EACf,KAAK,UAAY,IAAIpB,GAAuB,KAAK,OAAQ,UAAY,CACnE,OAAOE,EAAM,OACf,CAAC,EACD,KAAK,QAAUsB,EACf,KAAK,OAAM,CACb,CAEA,OAAA7D,GAAa4D,EAAU,CAAC,CACtB,IAAK,UACL,IAAK,UAAe,CAClB,OAAO,KAAK,QACd,EACA,IAAK,SAAaC,EAAM,CACtB,IAAII,EAAe,KAAK,UAAY,KAAK,SAAS,IAC9CC,EAAmB,KAAK,UAAY,KAAK,SAAS,QACtD,KAAK,uBAAuBL,CAAI,EAE5B,KAAK,YACP,OAAO,OAAO,KAAK,UAAW,KAAK,QAAQ,cAAc,EAErD,OAAOA,EAAK,SAAY,WAAaA,EAAK,SAAWK,IAAqB,KAC5E,KAAK,UAAU,mBAAqB,KAAK,UAAU,UAAU,SAI7D,OAAOL,EAAK,KAAQ,WAAaA,EAAK,KAAOI,IAAiB,IAChE,KAAK,OAAM,CAEf,CACJ,CAAG,CAAC,EAEKL,CACT,GAAC,EAEGO,EAAmBC,EAAM,UAAS,EAEtC,SAASC,EAAmBxE,EAAO,CACjC,IAAIyE,EAAkB,GAClBC,EAAO,GACPC,EAAO,GACPC,EAAqB,GAAG,OAAO,OAAO,KAAKf,CAAgB,EAAG,CAAC,iBAAkB,YAAa,oBAAoB,CAAC,EACnHgB,EAAW,CAAC,WAAW,EAC3B,cAAO,KAAK7E,CAAK,EAAE,QAAQ,SAAU8E,EAAM,CACzC,IAAIC,EAAM/E,EAAM8E,CAAI,EAEhBF,EAAmB,SAASE,CAAI,EAClCL,EAAgBK,CAAI,EAAIC,EACfF,EAAS,SAASC,CAAI,EAC/BD,EAASC,CAAI,EAAIC,EAEjBJ,EAAKG,CAAI,EAAIC,CAEjB,CAAC,EACM,CAACN,EAAiBE,EAAMD,CAAI,CACrC,CAEA,IAAIM,GAAqC,SAAUC,EAAY,CAC7DvE,GAAesE,EAAuBC,CAAU,EAEhD,SAASD,EAAsBhF,EAAO,CACpC,IAAI0C,EAEJ,OAAAA,EAAQuC,EAAW,KAAK,KAAMjF,CAAK,GAAK,KACxC0C,EAAM,OAAS6B,EAAM,UAAS,EAC9B7B,EAAM,OAAS1C,EAAM,WAAasE,EAC3B5B,CACT,CAEA,IAAIV,EAASgD,EAAsB,UAEnC,OAAAhD,EAAO,kBAAoB,UAA6B,CACtD,GAAI,KAAK,OAAO,QAAS,CACvB,IAAIgC,EAAOQ,EAAmB,KAAK,KAAK,EAAE,CAAC,EAC3C,KAAK,SAAW,IAAIT,GAAS,KAAK,OAAO,QAASC,CAAI,CACxD,CACF,EAEAhC,EAAO,mBAAqB,UAA8B,CACxD,IAAIyC,EAAkBD,EAAmB,KAAK,KAAK,EAAE,CAAC,EAElD,KAAK,WACP,KAAK,SAAS,QAAUC,EAE5B,EAEAzC,EAAO,qBAAuB,UAAgC,CACxD,KAAK,UACP,KAAK,SAAS,KAAI,EAGpB,KAAK,SAAW,MAClB,EAEAA,EAAO,OAAS,UAAkB,CAChC,IAAIkD,EAAsBV,EAAmB,KAAK,KAAK,EACnDC,EAAkBS,EAAoB,CAAC,EACvCC,EAAcD,EAAoB,CAAC,EAEnCE,EAAe7E,EAAS,CAC1B,OAAQ,EACR,SAAU,WACV,cAAe,OACf,IAAK,EACL,KAAM,EACN,OAAQ,EACR,MAAO,CACb,EAAO4E,EAAY,KAAK,EAEpB,OAAOZ,EAAM,cAAc,SAAU,OAAO,OAAO,CACjD,MAAOE,EAAgB,MACvB,OAAQA,EAAgB,OACxB,IAAK,KAAK,MAChB,EAAOU,EAAa,CACd,MAAOC,CACb,CAAK,CAAC,CACJ,EAEOJ,CACT,GAAEK,WAAS,EAEXL,EAAsB,aAA4BzE,EAAS,GAAIsD,CAAgB,EAC/EmB,EAAsB,YAAc,gBAEpC,IAAIM,GAAqBf,EAAM,WAAW,SAAUvE,EAAOuF,EAAM,CAC/D,OAAOhB,EAAM,cAAcS,EAAuB,OAAO,OAAO,CAC9D,UAAWV,CACf,EAAKtE,CAAK,CAAC,CACX,CAAC,ECzeM,SAAS+D,GAAS,CAAE,GAAAyB,GAA8B,CACxD,OAAKA,EAGJC,MAACC,IACC,aACAD,MAACE,GAAA,CAEA,IAAK,EAAQH,EACb,QAAS,GACT,eAAgB,IAChB,MAAO,OAAO,WACd,OAAQ,OAAO,aALVA,CAAA,EAQR,EAde,IAgBjB,CCjBO,SAASI,IAAwB,CACvC,aACE,OAAI,UAAU,6EACd,SAAAC,OAAC,OAAI,UAAU,sBAEd,UAAAJ,MAACK,EAAA,CACA,GAAG,uBACH,UAAU,4CACV,aAAW,yCAEZD,OAAC,OAAI,UAAU,2DACd,UAAAA,OAAC,OAAI,UAAU,0BACd,UAAAJ,MAACM,EAAA,CACA,KAAK,QACL,UAAU,+CAEV,OACA,UAAAN,MAAC,MAAG,UAAU,oDAAoD,4DAElE,EACAA,MAAC,KAAE,UAAU,yCAAyC,+FAGtD,GACD,GACD,EACAI,OAAC,OAAI,UAAU,8DACd,UAAAJ,MAAC,QAAK,sBAAU,EAChBA,MAACM,EAAA,CAAK,KAAK,aAAa,UAAU,UAAU,GAC7C,GACD,GACD,EACD,CAEF,CClBA,MAAMC,GAAyC,CAC9C,CACC,MAAO,aACP,UAAW,CACV,CAAE,KAAM,CAAC,IAAK,GAAG,EAAG,YAAa,cACjC,CACC,KAAM,CAAC,IAAK,KAAK,EACjB,YAAa,6CAEd,CACC,KAAM,CAAC,IAAK,MAAO,IAAK,KAAK,EAC7B,YACC,iEAEF,CACC,KAAM,CAAC,IAAK,MAAO,IAAK,GAAG,EAC3B,YACC,wEAEF,CAAE,KAAM,CAAC,IAAK,GAAG,EAAG,YAAa,4BACjC,CAAE,KAAM,CAAC,IAAK,GAAG,EAAG,YAAa,wBACjC,CAAE,KAAM,CAAC,IAAK,GAAG,EAAG,YAAa,sBACjC,CAAE,KAAM,CAAC,IAAK,GAAG,EAAG,YAAa,oBACjC,CAAE,KAAM,CAAC,IAAK,GAAG,EAAG,YAAa,gCACjC,CAAE,KAAM,CAAC,QAAQ,EAAG,YAAa,uCAAuC,CACzE,EAED,CACC,MAAO,oBACP,UAAW,CACV,CAAE,KAAM,CAAC,QAAS,GAAG,EAAG,YAAa,oBACrC,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,4BAC5B,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,2BAC5B,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,4BAC5B,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,0BAA0B,CACvD,EAED,CACC,MAAO,4BACP,UAAW,CACV,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,sCAC5B,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,iCAAiC,CAC9D,EAED,CACC,MAAO,iBACP,UAAW,CACV,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,0BAC5B,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,yBAAyB,CACtD,EAED,CACC,MAAO,iBACP,UAAW,CACV,CAAE,KAAM,CAAC,QAAS,GAAG,EAAG,YAAa,2BACrC,CAAE,KAAM,CAAC,QAAS,GAAG,EAAG,YAAa,0BAA0B,CAChE,EAED,CACC,MAAO,oCACP,UAAW,CACV,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,0BAC5B,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,iCAAiC,CAC9D,EAED,CACC,MAAO,WACP,UAAW,CAAC,CAAE,KAAM,CAAC,GAAG,EAAG,YAAa,4BAA6B,GAEtE,CACC,MAAO,aACP,UAAW,CACV,CACC,KAAM,CAAC,KAAK,EACZ,YACC,8DACF,CACD,CAEF,EAEA,SAASC,GAAwB,CAChC,KAAAC,EACA,aAAAC,CACD,EAGG,CACF,aACEC,GAAA,CAAO,KAAAF,EAAY,aAAAC,EACnB,SAAAN,OAACQ,GAAA,CAAc,UAAU,yCACxB,UAAAR,OAACS,GAAA,CACA,UAAAb,MAACc,IAAY,8BAAkB,SAC9BC,GAAA,CAAkB,yFAEJ,IACdf,MAAC,OAAI,UAAU,wEAAwE,aAEvF,EAAO,IAAI,yEAGZ,GACD,EACAA,MAAC,OAAI,UAAU,YACb,YAAmB,IAAKgB,GACxBZ,OAAC,OACA,UAAAJ,MAAC,MAAG,UAAU,6CACZ,SAAAgB,EAAS,MACX,EACAhB,MAAC,OAAI,UAAU,YACb,WAAS,UAAU,IAAI,CAACiB,EAAUC,IAClCd,OAAC,OAEA,UAAU,0CAEV,UAAAJ,MAAC,QAAK,UAAU,uCACd,SAAAiB,EAAS,YACX,EACAjB,MAAC,OAAI,UAAU,mCACb,SAAAiB,EAAS,KAAK,IAAI,CAACjG,EAAKmG,IACxBf,OAACgB,WAAA,CACA,UAAApB,MAAC,OAAI,UAAU,oEACb,SAAAhF,EACF,EACCmG,EAAWF,EAAS,KAAK,OAAS,GAClCjB,MAAC,QAAK,UAAU,wBAAwB,aAAC,IALtBmB,CAOrB,CACA,EACF,IAjBKD,CAAA,CAmBN,EACF,IA3BSF,EAAS,KA4BnB,CACA,EACF,QACC,OAAI,UAAU,mCACd,SAAAZ,OAAC,KAAE,UAAU,gCACZ,UAAAJ,MAAC,UAAO,iBAAK,EAAS,8FAC8B,IACpDA,MAAC,OAAI,UAAU,wEAAwE,aAEvF,EAAO,IAAI,0BAEZ,EACD,GACD,EACD,CAEF,CCpKO,SAASqB,GAAY,CAAE,MAAAC,GAAmC,CAChE,OACClB,OAAAmB,WAAA,CACC,UAAAvB,MAACwB,GAAA,CAAQ,YAAW,GAAC,SAAS,aAAa,EAC1CF,EAAQtB,MAACyB,GAAA,CAAU,MAAAH,CAAA,CAAc,EAAK,MACxC,CAEF,CAEA,SAASG,GAAU,OAAEH,GAA2B,CAC/C,KAAM,CAAE,GAAAvB,EAAI,KAAA2B,EAAM,MAAAC,EAAO,YAAAC,GAAgBN,EACzCO,mBAAU,IAAM,CACf,WAAW,IAAM,CAChBC,EAAUJ,CAAI,EAAEC,EAAO,CAAE,GAAA5B,EAAI,YAAA6B,EAAa,CAC3C,EAAG,CAAC,CACL,EAAG,CAACA,EAAa7B,EAAI4B,EAAOD,CAAI,CAAC,EAC1B,IACR,CCfO,SAASK,GAAY,CAC3B,YAAAC,CACD,EAEG,CACF,KAAM,CACL,iBAAAC,EACA,qBAAAC,EACA,wBAAAC,EACA,qBAAsBC,EACtB,SAAAC,CAAA,EACGL,EACEM,EAAUC,EAAA,EACVC,EAAaC,SAAOH,CAAO,EACjCT,YAAU,IAAM,CACfW,EAAW,QAAUF,CACtB,EAAG,CAACA,CAAO,CAAC,EAGZ,MAAMI,EAAoBD,SACzB,MAEKE,EAAgBF,SAA6C,IAAI,EACjEG,EAAmBH,SAAO,EAAK,EAErCZ,mBAAU,IAAM,CACf,GAAII,GAAoBG,EAAuB,CAE1CO,EAAc,UACjBrB,EAAM,QAAQqB,EAAc,OAAO,EACnCA,EAAc,QAAU,MAGzB,MAAMhB,EAAQO,EACX,iCACA,2BACGN,EAAcM,EACnB9B,OAAC,OACC,UAAA+B,EACE,oFACA,yDACFE,EACArC,MAAC,KACA,KAAMqC,EACN,OAAO,SACP,IAAI,aACJ,UAAU,oBACV,0BAGE,MACL,SAEC,OACC,+DACA,sDACF,EAGKtC,EAAKuB,EAAM,KAAKK,EAAO,CAC5B,SAAU,IACV,YAAAC,EACA,UAAW,IAAM,CAEjB,EACA,OAAQ,CACP,MAAO,SACP,QAAS,SAAY,CAUpB,GARIe,EAAc,UACjBrB,EAAM,QAAQqB,EAAc,OAAO,EACnCA,EAAc,QAAU,MAGpBD,EAAkB,UACtBA,EAAkB,QAAUpB,EAAM,QAAQ,uBAAuB,GAE9D,CAAAsB,EAAiB,QACrB,CAAAA,EAAiB,QAAU,GAC3B,GAAI,CACH,KAAM,CAAE,qBAAAC,EAAsB,sBAAAC,CAAA,EAC7B,OAAO,KAAO,GACf,GAAI,CAACD,GAAwB,CAACC,EAC7B,MAAM,IAAI,MAAM,0BAA0B,EAE3C,MAAMC,EAAM,MAAM,MACjB,oBAAoBF,CAAoB,sBACxC,CACC,OAAQ,OACR,QAAS,CACR,mBAAoBC,CAAA,CACrB,CACD,EAED,GAAI,CAACC,EAAI,GACR,MAAM,IAAI,MACT,sCAAsCA,EAAI,UAAU,IAGtD,MAAMC,EAAO,MAAMD,EAAI,OAAO,MAAM,KAAO,GAAG,EAKxCE,EAJSC,GAAS,CACvB,OAAQC,GAAO,CAAC,KAAM,OAAO,CAAC,EAC9B,QAASC,GAAE,EAAS,UAAS,CAC7B,EACqB,UAAUJ,CAAI,EACpC,GAAI,CAACC,EAAO,QACX,cAAQ,MAAM,mCAAoCD,CAAI,EAChD,IAAI,MAAM,kCAAkC,EAEnD,KAAM,CAAE,OAAAK,EAAQ,QAAAC,CAAA,EAAYL,EAAO,KACnC,GAAII,IAAW,KAAM,CACpB,IAAIE,EAAW,GACfjC,EAAM,QAAQ,mBAAoB,CACjC,YACC,8DACD,SAAU,IACV,OAAQ,CACP,MAAO,aACP,QAAS,IAAM,CACdiC,EAAW,GACX,OAAO,SAAS,QACjB,GAED,YAAa,IAAM,CACbA,GACJ,OAAO,SAAS,QAElB,EACA,CACF,MACCjC,EAAM,MAAM,4BAA6B,CACxC,YAAagC,GAAW,gBACxB,CAEH,OAASE,EAAK,CACblC,EAAM,MAAM,4BAA6B,CACxC,YAAakC,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAC5D,CACF,SACCZ,EAAiB,QAAU,GACvBF,EAAkB,UACrBpB,EAAM,QAAQoB,EAAkB,OAAO,EACvCA,EAAkB,QAAU,KAE9B,EACD,GAED,OAAQ,CACP,MAAO,UACP,QAAS,IAAM,CAEVC,EAAc,UACjBrB,EAAM,QAAQqB,EAAc,OAAO,EACnCA,EAAc,QAAU,MAGpBH,EAAW,QAAQ,OACvB,CAAE,OAAQ,OAAQ,GAAIJ,CAAA,EACtB,CAAE,OAAQ,OAAQ,OAAQ,uBAAuB,CAEnD,EACD,CACA,EACDO,EAAc,QAAU5C,CACzB,CACD,EAAG,CACFkC,EACAG,EACAF,EACAC,EACAE,CAAA,CACA,EAEM,IACR,CChKO,SAASoB,GAAc,CAC7BC,sBACD,EAEG,CACF,MAAMpB,EAAUC,EAAA,EACVC,EAAaC,SAAOH,CAAO,EAC3BqB,EAAalB,SAAoB,IAAImB,GAAK,EAEhD/B,mBAAU,IAAM,CACf,UAAWgC,KAAgBH,EACtBC,EAAWG,QAAQC,IAAIF,EAAa9D,EAAE,IAC1C4D,EAAWG,QAAQE,IAAIH,EAAa9D,EAAE,EAEtCuB,EAAM2C,KAAKJ,EAAalC,MAAO,CAC9B5B,GAAI8D,EAAa9D,GACjB6B,mBACE,OACAsC,SAAA,CAAAlE,MAAC,KAAGkE,WAAaZ,QAAQ,EACxBO,EAAaM,MACbnE,MAAC,KACAoE,KAAMP,EAAaM,KACnB7J,OAAO,SACP+J,UAAU,oBACVH,SAAA,aAED,GAEF,EAEDI,SAAUC,IACVC,OAAQ,CACPC,MAAO,UACPC,QAASA,IAAM,CACTlC,EAAWsB,QAAQa,OACvB,CAAEC,OAAQ,OAAQ7E,GAAI8D,EAAa9D,EAAG,EACtC,CAAE8E,OAAQ,OAAQL,OAAQ,sBAAuB,CAClD,CACD,CACD,CACD,CAAC,EAEH,EAAG,CAACd,CAAoB,CAAC,EAElB,IACR,CCjEqG,MAAAoB,GAAe,2BCAVC,GAAe,gCCUnHC,GAAgB,sBAEf,SAASC,GAAc,CAC7B,KAAAC,EACA,OAAAC,CACD,EAAwC,CACvC,MAAMpF,EAAKmF,GAAM,IAAMC,GAAQ,IAAM,OAC/BC,EACLF,GAAM,OAASA,EAAK,QAAUF,GAAgBE,EAAK,MAAQ,OAE5D,GAAI,CAACnF,GAAM,CAACqF,EAAO,OAAO,KAE1B,MAAMC,EAAyB,GAC/B,OAAItF,MAAe,GAAKA,GACpBqF,MAAkB,MAAQA,GACvBC,CACR,CCuCO,MAAMC,GAAuBA,IAC5B,CACN,CAAEC,IAAK,aAAcnB,KAAM,sBAAuB,EAClD,CACCmB,IAAK,aACLnB,KAAM,mHACP,EACA,CAAEmB,IAAK,aAAcnB,KAAMW,EAAsB,EACjD,CAAEQ,IAAK,aAAcnB,KAAMU,EAAiB,EAC5C,CACCS,IAAK,OACLnB,KAAM,eACNoB,MAAO,OACR,EACA,CAAED,IAAK,OAAQ7D,KAAM,gBAAiB0C,KAAM,cAAe,GAIhDqB,GAA2BA,CAAC,CAAEC,YAAW,IAChDA,EAEEC,GAAe,CACrBC,WAAYF,EAAWE,WACvBjE,MAAO+D,EAAWG,cAClBjE,YAAa8D,EAAWI,iBACxBC,YAAaL,EAAWK,WACzB,CAAC,EAPuB,GAoHzB,SAASC,EAAS,CACjB9B,WACA+B,MAAM,GACN5B,YACA6B,OACD,EAKG,CACF,OACC9F,OAAC,QAAK+F,KAAK,KAAK9B,YAAsB6B,QACrChC,SAAA,CAAA9D,OAAC,QACA8D,SAAA,CAAAlE,MAACoG,GAAA,EAAgB,QAChBC,EAAA,EAAK,EACNrG,MAAC,QAAKsG,QAAQ,QAAQ,EACtBtG,MAAC,QAAKuG,KAAK,WAAWC,QAAQ,qCAAqC,QAClEC,EAAA,EAAM,EACPzG,MAAC,UACA0G,wBAAyB,CACxBC,OAAQ,gBAAgBC,KAAKC,UAAUZ,CAAG,CAAC,EAC5C,EACD,GACD,EACA7F,OAAC,QAAKiE,UAAU,uFACdH,SAAA,CAAAA,QACA4C,EAAA,EAAkB,QAClBC,GAAA,EAAQ,GACV,GACD,CAEF,CAEA,SAASC,IAAM,CACd,MAAMhE,EAAOiE,EAAA,EACPC,EAAaC,EAAA,EACbC,EAAcC,gBAAaH,EAAWI,QAAU,OAAQ,CAC7DC,MAAO,IACPC,YAAa,GACd,CAAC,EACKC,EAAUC,GAAA,EACV,CAACC,EAAuBC,CAAwB,EACrD9I,WAAe,EAAK,EAErBA,YAAgB,IAAM,CACrB,MAAM+I,EAAeA,IAAM,CAC1BD,EAA0BE,GAAS,CAACA,CAAI,CACzC,EACAC,cAAOC,iBAAiB,4BAA6BH,CAAY,EAC1D,IAAM,CACZE,OAAOE,oBAAoB,4BAA6BJ,CAAY,CACrE,CACD,EAAG,EAAE,EAEL/I,YAAgB,IAAM,CACrB,GAAI,CAACoJ,IAAIC,sBAAuB,OAChC,MAAM9C,EAAaJ,GAAc,CAChCC,KAAMlC,EAAKkC,KACXC,OAAQnC,EAAKmC,MACd,CAAC,QACI,OAAO,4BAAsB,0BAChCiD,KAAMC,GAAW,CACbhD,EACHgD,EAAOC,QAAQjD,CAAU,EAEzBgD,EAAOC,QAAQ,IAAI,CAErB,CAAC,EACAC,MAAM,IAAM,CAAC,CAAC,CACjB,EAAG,CAACvF,EAAKkC,KAAMlC,EAAKmC,MAAM,CAAC,EAE3B,MAAMqD,EAAQC,GAAA,EACd,OACCrI,OAAC4F,EAAA,CACAE,MACClD,EAAK0F,aAAaC,SACf,CAAEA,SAAU,GAAG3F,EAAK0F,aAAaC,QAAQ,MACzC,GAEJtE,UAAWuE,GACV,4BACAJ,EACA,CAAE,kBAAmBpB,CAAY,EACjCK,EAAU,WAAa,IACxB,EACAxB,IAAKjD,EAAKkF,IAEThE,SAAA,CAAAlB,EAAK6F,iBACL,CAAC7F,EAAK0F,aAAaI,iBAAiBC,iBAClC5I,GAAA,EAAsB,QAExB6I,EAAA,EAAO,EACRhJ,MAAC1B,GAAA,CAASyB,GAAIiD,EAAKiG,UAAA,CAAY,EAC/BjJ,MAACqB,GAAA,CAAYC,MAAO0B,EAAK1B,KAAA,CAAO,EAChCtB,MAAC+B,GAAA,CAAYC,YAAagB,EAAKhB,WAAA,CAAa,QAC3CkH,GAAA,EAAa,EACdlJ,MAACyD,GAAA,CAAcC,qBAAsBV,EAAKU,oBAAA,CAAsB,EAChE1D,MAACQ,GAAA,CACAC,KAAMkH,EACNjH,aAAckH,CAAA,CACf,GACD,CAEF,CAEA,MAAAuB,GAAAC,EAAA,UAA2C,CAC1C,KAAM,CAAElE,QAAS+B,EAAA,EACjB,OACCjH,MAACqJ,IAASnE,OACThB,SAAAlE,MAACsJ,IACApF,SAAAlE,MAACgH,GAAA,EAAI,EACN,EACD,CAEF,GAEOuC,GAAAC,EAAA,UAAyB,CAC/B,aACExD,EAAA,CAAS3B,UAAU,gBACnBH,SAAAlE,MAACyJ,KAAqB,EACvB,CAEF","names":["tweenFunctions","t","b","_c","d","c","a","p","s","v","tweenFunctions_1","_defineProperties","target","props","i","descriptor","_createClass","Constructor","protoProps","staticProps","_extends","source","key","_inheritsLoose","subClass","superClass","_setPrototypeOf","o","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","Particle","context","getOptions","x","y","_this$getOptions","colors","initialVelocityX","initialVelocityY","_proto","_this$getOptions2","gravity","wind","friction","opacity","drawShape","rotateDelta","ParticleGeneratorClass","canvas","_this","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","now","tweenInitTime","progressTime","tweenedVal","numToAdd","ctx","confettiDefaults","tweens","Confetti","opts","computedConfettiDefaults","_this$options","onConfettiComplete","lastRunState","lastRecycleState","ref","React","extractCanvasProps","confettiOptions","refs","rest","confettiOptionKeys","refProps","prop","val","ConfettiReactInternal","_Component","_extractCanvasProps","passedProps","canvasStyles","Component","Index","_ref","id","jsx","ClientOnly","ConfettiShower","ExerciseWarningBanner","jsxs","Link","Icon","shortcutCategories","KeyboardShortcutsDialog","open","onOpenChange","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","category","shortcut","index","keyIndex","React.Fragment","EpicToaster","toast","Fragment","Toaster","ShowToast","type","title","description","useEffect","showToast","UpdateToast","repoUpdates","updatesAvailable","repoUpdatesAvailable","dependenciesNeedInstall","updateNotificationKey","diffLink","fetcher","useFetcher","fetcherRef","useRef","inProgressToastId","updateToastId","updateInProgress","EPICSHOP_PARENT_PORT","EPICSHOP_PARENT_TOKEN","res","data","parsed","z.object","z.enum","z.string","status","message","reloaded","err","Notifications","unmutedNotifications","toastedIds","Set","notification","current","has","add","info","children","link","href","className","duration","Infinity","action","label","onClick","submit","intent","method","appStylesheetUrl","tailwindStylesheetUrl","UNKNOWN_EMAIL","getSentryUser","user","userId","email","sentryUser","links","rel","sizes","meta","loaderData","getSeoMetaTags","instructor","workshopTitle","workshopSubtitle","requestInfo","Document","env","style","lang","ClientHintCheck","Meta","charSet","name","content","Links","dangerouslySetInnerHTML","__html","JSON","stringify","ScrollRestoration","Scripts","App","useLoaderData","navigation","useNavigation","showSpinner","useSpinDelay","state","delay","minDuration","altDown","useAltDown","showKeyboardShortcuts","setShowKeyboardShortcuts","handleToggle","prev","window","addEventListener","removeEventListener","ENV","EPICSHOP_IS_PUBLISHED","then","Sentry","setUser","catch","theme","useTheme","preferences","fontSize","cn","exerciseChanges","exerciseWarning","dismissed","Outlet","confettiId","EpicProgress","root","_UNSAFE_withComponentProps","Presence","TooltipProvider","ErrorBoundary","_UNSAFE_withErrorBoundaryProps","GeneralErrorBoundary"],"ignoreList":[0,1],"sources":["../../../../../node_modules/tween-functions/index.js","../../../../../node_modules/confetti-react/dist/confetti-react.esm.js","../../../app/components/confetti.tsx","../../../app/components/exercise-warning-banner.tsx","../../../app/components/keyboard-shortcuts-dialog.tsx","../../../app/components/toaster.tsx","../../../app/components/update-repo.tsx","../../../app/routes/admin+/notifications.tsx","../../../app/styles/app.css?url","../../../app/styles/tailwind.css?url","../../../app/utils/sentry-user.ts","../../../app/root.tsx"],"sourcesContent":["'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import React, { Component } from 'react';\nimport tweens from 'tween-functions';\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n\n _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nfunction degreesToRads(degrees) {\n return degrees * Math.PI / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\n\nvar RotationDirection;\n\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\n\nvar Particle = /*#__PURE__*/function () {\n function Particle(context, getOptions, x, y) {\n this.getOptions = getOptions;\n\n var _this$getOptions = this.getOptions(),\n colors = _this$getOptions.colors,\n initialVelocityX = _this$getOptions.initialVelocityX,\n initialVelocityY = _this$getOptions.initialVelocityY;\n\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx = randomRange(-initialVelocityX, initialVelocityX);\n this.vy = randomRange(-initialVelocityY, 0);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1) ? RotationDirection.Positive : RotationDirection.Negative;\n }\n\n var _proto = Particle.prototype;\n\n _proto.update = function update() {\n var _this$getOptions2 = this.getOptions(),\n gravity = _this$getOptions2.gravity,\n wind = _this$getOptions2.wind,\n friction = _this$getOptions2.friction,\n opacity = _this$getOptions2.opacity,\n drawShape = _this$getOptions2.drawShape;\n\n this.x += this.vx;\n this.y += this.vy;\n this.vy += gravity;\n this.vx += wind;\n this.vx *= friction;\n this.vy *= friction;\n\n if (this.rotateY >= 1 && this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n } else if (this.rotateY <= -1 && this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n\n var rotateDelta = 0.1 * this.rotationDirection;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n } else {\n switch (this.shape) {\n case ParticleShape.Circle:\n {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n\n case ParticleShape.Square:\n {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n\n case ParticleShape.Strip:\n {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n\n default:\n {\n throw new Error('Unknown type in Particle.ts');\n }\n }\n }\n\n this.context.closePath();\n this.context.restore();\n };\n\n return Particle;\n}();\n\nvar ParticleGeneratorClass = function ParticleGeneratorClass(canvas, getOptions) {\n var _this = this;\n\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenInitTime = Date.now();\n this.particles = [];\n this.particlesGenerated = 0;\n\n this.removeParticleAt = function (i) {\n _this.particles.splice(i, 1);\n };\n\n this.getParticle = function () {\n var newParticleX = randomRange(_this.x, _this.w + _this.x);\n var newParticleY = randomRange(_this.y, _this.h + _this.y);\n return new Particle(_this.context, _this.getOptions, newParticleX, newParticleY);\n };\n\n this.animate = function () {\n var canvas = _this.canvas,\n context = _this.context,\n particlesGenerated = _this.particlesGenerated,\n lastNumberOfPieces = _this.lastNumberOfPieces;\n\n var _this$getOptions = _this.getOptions(),\n run = _this$getOptions.run,\n recycle = _this$getOptions.recycle,\n numberOfPieces = _this$getOptions.numberOfPieces,\n debug = _this$getOptions.debug,\n tweenFunction = _this$getOptions.tweenFunction,\n tweenDuration = _this$getOptions.tweenDuration;\n\n if (!run) {\n return false;\n }\n\n var nP = _this.particles.length;\n var activeCount = recycle ? nP : particlesGenerated;\n var now = Date.now(); // Initial population\n\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n _this.tweenInitTime = now;\n _this.lastNumberOfPieces = numberOfPieces;\n }\n\n var tweenInitTime = _this.tweenInitTime; // Add more than one piece per loop, otherwise the number of pieces would\n // be limitted by the RAF framerate\n\n var progressTime = now - tweenInitTime > tweenDuration ? tweenDuration : Math.max(0, now - tweenInitTime);\n var tweenedVal = tweenFunction(progressTime, activeCount, numberOfPieces, tweenDuration);\n var numToAdd = Math.round(tweenedVal - activeCount);\n\n for (var i = 0; i < numToAdd; i += 1) {\n _this.particles.push(_this.getParticle());\n }\n\n _this.particlesGenerated += numToAdd;\n }\n\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(\"Particles: \" + nP, canvas.width - 10, canvas.height - 20);\n } // Maintain the population\n\n\n _this.particles.forEach(function (p, i) {\n // Update each particle's position\n p.update(); // Prune the off-canvas particles\n\n if (p.y > canvas.height || p.y < -100 || p.x > canvas.width + 100 || p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n _this.particles[i] = _this.getParticle();\n } else {\n _this.removeParticleAt(i);\n }\n }\n });\n\n return nP > 0 || activeCount < numberOfPieces;\n };\n\n this.canvas = canvas;\n var ctx = this.canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n\n this.context = ctx;\n this.getOptions = getOptions;\n};\n\nvar confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: ['#f44336', '#e91e63', '#9c27b0', '#673ab7', '#3f51b5', '#2196f3', '#03a9f4', '#00bcd4', '#009688', '#4CAF50', '#8BC34A', '#CDDC39', '#FFEB3B', '#FFC107', '#FF9800', '#FF5722', '#795548'],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true\n};\nvar Confetti = /*#__PURE__*/function () {\n function Confetti(canvas, opts) {\n var _this = this;\n\n this.setOptionsWithDefaults = function (opts) {\n var computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: _this.canvas.width,\n h: 0\n }\n };\n _this._options = _extends({}, computedConfettiDefaults, confettiDefaults, opts);\n Object.assign(_this, opts.confettiSource);\n };\n\n this.update = function () {\n var _this$options = _this.options,\n run = _this$options.run,\n onConfettiComplete = _this$options.onConfettiComplete,\n canvas = _this.canvas,\n context = _this.context;\n\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n if (_this.generator.animate()) {\n _this.rafId = requestAnimationFrame(_this.update);\n } else {\n if (onConfettiComplete && typeof onConfettiComplete === 'function' && _this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(_this, _this);\n }\n\n _this._options.run = false;\n }\n };\n\n this.reset = function () {\n if (_this.generator && _this.generator.particlesGenerated > 0) {\n _this.generator.particlesGenerated = 0;\n _this.generator.particles = [];\n _this.generator.lastNumberOfPieces = 0;\n }\n };\n\n this.stop = function () {\n _this.options = {\n run: false\n };\n\n if (_this.rafId) {\n cancelAnimationFrame(_this.rafId);\n _this.rafId = undefined;\n }\n };\n\n this.canvas = canvas;\n var ctx = this.canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n\n this.context = ctx;\n this.generator = new ParticleGeneratorClass(this.canvas, function () {\n return _this.options;\n });\n this.options = opts;\n this.update();\n }\n\n _createClass(Confetti, [{\n key: \"options\",\n get: function get() {\n return this._options;\n },\n set: function set(opts) {\n var lastRunState = this._options && this._options.run;\n var lastRecycleState = this._options && this._options.recycle;\n this.setOptionsWithDefaults(opts);\n\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n\n if (typeof opts.recycle === 'boolean' && opts.recycle && lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n }]);\n\n return Confetti;\n}();\n\nvar ref = /*#__PURE__*/React.createRef();\n\nfunction extractCanvasProps(props) {\n var confettiOptions = {};\n var refs = {};\n var rest = {};\n var confettiOptionKeys = [].concat(Object.keys(confettiDefaults), ['confettiSource', 'drawShape', 'onConfettiComplete']);\n var refProps = ['canvasRef'];\n Object.keys(props).forEach(function (prop) {\n var val = props[prop];\n\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n } else if (refProps.includes(prop)) {\n refProps[prop] = val;\n } else {\n rest[prop] = val;\n }\n });\n return [confettiOptions, rest, refs];\n}\n\nvar ConfettiReactInternal = /*#__PURE__*/function (_Component) {\n _inheritsLoose(ConfettiReactInternal, _Component);\n\n function ConfettiReactInternal(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.canvas = React.createRef();\n _this.canvas = props.canvasRef || ref;\n return _this;\n }\n\n var _proto = ConfettiReactInternal.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n if (this.canvas.current) {\n var opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n var confettiOptions = extractCanvasProps(this.props)[0];\n\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n\n this.confetti = undefined;\n };\n\n _proto.render = function render() {\n var _extractCanvasProps = extractCanvasProps(this.props),\n confettiOptions = _extractCanvasProps[0],\n passedProps = _extractCanvasProps[1];\n\n var canvasStyles = _extends({\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n }, passedProps.style);\n\n return React.createElement(\"canvas\", Object.assign({\n width: confettiOptions.width,\n height: confettiOptions.height,\n ref: this.canvas\n }, passedProps, {\n style: canvasStyles\n }));\n };\n\n return ConfettiReactInternal;\n}(Component);\n\nConfettiReactInternal.defaultProps = /*#__PURE__*/_extends({}, confettiDefaults);\nConfettiReactInternal.displayName = 'ConfettiReact'; // eslint-disable-next-line react/display-name\n\nvar Index = /*#__PURE__*/React.forwardRef(function (props, _ref) {\n return React.createElement(ConfettiReactInternal, Object.assign({\n canvasRef: ref\n }, props));\n});\n\nexport default Index;\nexport { Index };\n//# sourceMappingURL=confetti-react.esm.js.map\n","import { Index as ConfettiShower } from 'confetti-react'\nimport { ClientOnly } from 'remix-utils/client-only'\n\nexport function Confetti({ id }: { id?: string | null }) {\n\tif (!id) return null\n\n\treturn (\n\t\t<ClientOnly>\n\t\t\t{() => (\n\t\t\t\t<ConfettiShower\n\t\t\t\t\tkey={id}\n\t\t\t\t\trun={Boolean(id)}\n\t\t\t\t\trecycle={false}\n\t\t\t\t\tnumberOfPieces={800}\n\t\t\t\t\twidth={window.innerWidth}\n\t\t\t\t\theight={window.innerHeight}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</ClientOnly>\n\t)\n}\n","import { Link } from 'react-router'\nimport { Icon } from './icons.tsx'\n\nexport function ExerciseWarningBanner() {\n\treturn (\n\t\t<div className=\"border-destructive bg-destructive fixed top-0 right-0 left-0 z-50 border-b\">\n\t\t\t<div className=\"relative w-full p-4\">\n\t\t\t\t{/* Full-banner clickable link, visually hidden but covers the banner */}\n\t\t\t\t<Link\n\t\t\t\t\tto=\"/workspace-structure\"\n\t\t\t\t\tclassName=\"absolute inset-0 z-10 block h-full w-full\"\n\t\t\t\t\taria-label=\"Learn more about workspace structure\"\n\t\t\t\t/>\n\t\t\t\t<div className=\"relative z-0 container flex items-center justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tname=\"Error\"\n\t\t\t\t\t\t\tclassName=\"text-destructive-foreground h-5 w-5\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<h3 className=\"text-destructive-foreground text-sm font-semibold\">\n\t\t\t\t\t\t\t\tWarning: Changes detected in exercises directory\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t<p className=\"text-destructive-foreground/80 text-xs\">\n\t\t\t\t\t\t\t\tYou should typically work in the playground directory, not the\n\t\t\t\t\t\t\t\texercises directory.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-destructive-foreground flex items-center gap-2 text-xs\">\n\t\t\t\t\t\t<span>Learn more</span>\n\t\t\t\t\t\t<Icon name=\"ArrowRight\" className=\"h-3 w-3\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import * as React from 'react'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTitle,\n} from './ui/dialog'\n\ninterface KeyboardShortcut {\n\tkeys: string[]\n\tdescription: string\n}\n\ninterface ShortcutCategory {\n\ttitle: string\n\tshortcuts: KeyboardShortcut[]\n}\n\nconst shortcutCategories: ShortcutCategory[] = [\n\t{\n\t\ttitle: 'Navigation',\n\t\tshortcuts: [\n\t\t\t{ keys: ['g', 'h'], description: 'Go to home' },\n\t\t\t{\n\t\t\t\tkeys: ['g', '1-9'],\n\t\t\t\tdescription: 'Go to exercise (e.g., g+1 → /exercise/01)',\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeys: ['g', '1-9', '.', '1-9'],\n\t\t\t\tdescription:\n\t\t\t\t\t'Go to exercise step (e.g., g+1+.+2 → /exercise/01/02/problem)',\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeys: ['g', '1-9', '.', 'f'],\n\t\t\t\tdescription:\n\t\t\t\t\t'Go to exercise finished page (e.g., g+1+.+f → /exercise/01/finished)',\n\t\t\t},\n\t\t\t{ keys: ['g', 'p'], description: 'Go to previous step/page' },\n\t\t\t{ keys: ['g', 'n'], description: 'Go to next step/page' },\n\t\t\t{ keys: ['g', 'a'], description: 'Go to account page' },\n\t\t\t{ keys: ['g', 'd'], description: 'Go to admin page' },\n\t\t\t{ keys: ['g', 'l'], description: 'Go to last exercise solution' },\n\t\t\t{ keys: ['Escape'], description: 'Close sidebar navigation (when open)' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Playback Controls',\n\t\tshortcuts: [\n\t\t\t{ keys: ['Space', 'k'], description: 'Play/pause video' },\n\t\t\t{ keys: ['j'], description: 'Seek backward 10 seconds' },\n\t\t\t{ keys: ['l'], description: 'Seek forward 10 seconds' },\n\t\t\t{ keys: ['←'], description: 'Seek backward 10 seconds' },\n\t\t\t{ keys: ['→'], description: 'Seek forward 10 seconds' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Frame-by-Frame Navigation',\n\t\tshortcuts: [\n\t\t\t{ keys: [','], description: 'Go to previous frame (when paused)' },\n\t\t\t{ keys: ['.'], description: 'Go to next frame (when paused)' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Volume Control',\n\t\tshortcuts: [\n\t\t\t{ keys: ['↑'], description: 'Increase volume by 10%' },\n\t\t\t{ keys: ['↓'], description: 'Decrease volume by 10%' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Playback Speed',\n\t\tshortcuts: [\n\t\t\t{ keys: ['Shift', '>'], description: 'Increase playback speed' },\n\t\t\t{ keys: ['Shift', '<'], description: 'Decrease playback speed' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Fullscreen and Picture-in-Picture',\n\t\tshortcuts: [\n\t\t\t{ keys: ['f'], description: 'Toggle fullscreen mode' },\n\t\t\t{ keys: ['i'], description: 'Toggle picture-in-picture mode' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Captions',\n\t\tshortcuts: [{ keys: ['c'], description: 'Toggle captions/subtitles' }],\n\t},\n\t{\n\t\ttitle: 'Quick Seek',\n\t\tshortcuts: [\n\t\t\t{\n\t\t\t\tkeys: ['0-9'],\n\t\t\t\tdescription:\n\t\t\t\t\t'Seek to percentage of video (0 = 0%, 1 = 10%, ..., 9 = 90%)',\n\t\t\t},\n\t\t],\n\t},\n]\n\nfunction KeyboardShortcutsDialog({\n\topen,\n\tonOpenChange,\n}: {\n\topen: boolean\n\tonOpenChange: (open: boolean) => void\n}) {\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent className=\"max-h-[80vh] max-w-2xl overflow-y-auto\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Keyboard Shortcuts</DialogTitle>\n\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\tUse these keyboard shortcuts to navigate and control the video\n\t\t\t\t\t\tplayer. Press{' '}\n\t\t\t\t\t\t<kbd className=\"border-border bg-muted rounded border px-1.5 py-0.5 font-mono text-xs\">\n\t\t\t\t\t\t\t?\n\t\t\t\t\t\t</kbd>{' '}\n\t\t\t\t\t\tor select the question mark icon in the navigation to open this\n\t\t\t\t\t\tlist.\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t{shortcutCategories.map((category) => (\n\t\t\t\t\t\t<div key={category.title}>\n\t\t\t\t\t\t\t<h3 className=\"text-foreground mb-3 text-sm font-semibold\">\n\t\t\t\t\t\t\t\t{category.title}\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t{category.shortcuts.map((shortcut, index) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between gap-4\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground flex-1 text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t{shortcut.description}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex shrink-0 items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t{shortcut.keys.map((key, keyIndex) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<React.Fragment key={keyIndex}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<kbd className=\"border-border bg-muted rounded border px-2 py-1 font-mono text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</kbd>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{keyIndex < shortcut.keys.length - 1 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">+</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"border-border mt-4 border-t pt-4\">\n\t\t\t\t\t<p className=\"text-muted-foreground text-xs\">\n\t\t\t\t\t\t<strong>Note:</strong> Shortcuts are ignored when focus is on\n\t\t\t\t\t\tinteractive elements (inputs, buttons, etc.). Press{' '}\n\t\t\t\t\t\t<kbd className=\"border-border bg-muted rounded border px-1.5 py-0.5 font-mono text-xs\">\n\t\t\t\t\t\t\t?\n\t\t\t\t\t\t</kbd>{' '}\n\t\t\t\t\t\tto toggle this dialog.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n\nexport { KeyboardShortcutsDialog }\n","import { useEffect } from 'react'\nimport { Toaster, toast as showToast } from 'sonner'\nimport { type Toast } from '#app/utils/toast.server.ts'\n\nexport function EpicToaster({ toast }: { toast?: Toast | null }) {\n\treturn (\n\t\t<>\n\t\t\t<Toaster closeButton position=\"top-center\" />\n\t\t\t{toast ? <ShowToast toast={toast} /> : null}\n\t\t</>\n\t)\n}\n\nfunction ShowToast({ toast }: { toast: Toast }) {\n\tconst { id, type, title, description } = toast\n\tuseEffect(() => {\n\t\tsetTimeout(() => {\n\t\t\tshowToast[type](title, { id, description })\n\t\t}, 0)\n\t}, [description, id, title, type])\n\treturn null\n}\n","import { type checkForUpdatesCached } from '@epic-web/workshop-utils/git.server'\nimport { useEffect, useRef } from 'react'\nimport { useFetcher } from 'react-router'\nimport { toast } from 'sonner'\nimport { z } from 'zod'\n\nexport function UpdateToast({\n\trepoUpdates,\n}: {\n\trepoUpdates: Awaited<ReturnType<typeof checkForUpdatesCached>>\n}) {\n\tconst {\n\t\tupdatesAvailable,\n\t\trepoUpdatesAvailable,\n\t\tdependenciesNeedInstall,\n\t\tupdateNotificationId: updateNotificationKey,\n\t\tdiffLink,\n\t} = repoUpdates\n\tconst fetcher = useFetcher()\n\tconst fetcherRef = useRef(fetcher)\n\tuseEffect(() => {\n\t\tfetcherRef.current = fetcher\n\t}, [fetcher])\n\n\t// Track the in-progress toast id and update notification id\n\tconst inProgressToastId = useRef<ReturnType<typeof toast.loading> | null>(\n\t\tnull,\n\t)\n\tconst updateToastId = useRef<ReturnType<typeof toast.info> | null>(null)\n\tconst updateInProgress = useRef(false)\n\n\tuseEffect(() => {\n\t\tif (updatesAvailable && updateNotificationKey) {\n\t\t\t// Dismiss any existing toast before creating a new one\n\t\t\tif (updateToastId.current) {\n\t\t\t\ttoast.dismiss(updateToastId.current)\n\t\t\t\tupdateToastId.current = null\n\t\t\t}\n\n\t\t\tconst title = repoUpdatesAvailable\n\t\t\t\t? 'New workshop updates available'\n\t\t\t\t: 'Dependencies out of date'\n\t\t\tconst description = repoUpdatesAvailable ? (\n\t\t\t\t<div>\n\t\t\t\t\t{dependenciesNeedInstall\n\t\t\t\t\t\t? `Get the latest updates and reinstall dependencies by clicking the update button. `\n\t\t\t\t\t\t: `Get the latest updates by clicking the update button. `}\n\t\t\t\t\t{diffLink ? (\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={diffLink}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\tclassName=\"text-xs underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tView changes\n\t\t\t\t\t\t</a>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div>\n\t\t\t\t\t{`Your installed packages don't match package.json. `}\n\t\t\t\t\t{`Click the update button to reinstall dependencies.`}\n\t\t\t\t</div>\n\t\t\t)\n\n\t\t\tconst id = toast.info(title, {\n\t\t\t\tduration: Infinity,\n\t\t\t\tdescription,\n\t\t\t\tonDismiss: () => {\n\t\t\t\t\t// No-op for now, could call a dismiss endpoint if needed\n\t\t\t\t},\n\t\t\t\taction: {\n\t\t\t\t\tlabel: 'Update',\n\t\t\t\t\tonClick: async () => {\n\t\t\t\t\t\t// Dismiss the update notification immediately\n\t\t\t\t\t\tif (updateToastId.current) {\n\t\t\t\t\t\t\ttoast.dismiss(updateToastId.current)\n\t\t\t\t\t\t\tupdateToastId.current = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Show in-progress toast\n\t\t\t\t\t\tif (!inProgressToastId.current) {\n\t\t\t\t\t\t\tinProgressToastId.current = toast.loading('Update in progress...')\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (updateInProgress.current) return\n\t\t\t\t\t\tupdateInProgress.current = true\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { EPICSHOP_PARENT_PORT, EPICSHOP_PARENT_TOKEN } =\n\t\t\t\t\t\t\t\twindow.ENV || {}\n\t\t\t\t\t\t\tif (!EPICSHOP_PARENT_PORT || !EPICSHOP_PARENT_TOKEN) {\n\t\t\t\t\t\t\t\tthrow new Error('Update API not available')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst res = await fetch(\n\t\t\t\t\t\t\t\t`http://localhost:${EPICSHOP_PARENT_PORT}/__epicshop-restart`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t\t\t'x-epicshop-token': EPICSHOP_PARENT_TOKEN,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Request to update workshop failed: ${res.statusText}`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst data = await res.json().catch(() => ({}))\n\t\t\t\t\t\t\tconst schema = z.object({\n\t\t\t\t\t\t\t\tstatus: z.enum(['ok', 'error']),\n\t\t\t\t\t\t\t\tmessage: z.string().optional(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tconst parsed = schema.safeParse(data)\n\t\t\t\t\t\t\tif (!parsed.success) {\n\t\t\t\t\t\t\t\tconsole.error('Invalid response from update API', data)\n\t\t\t\t\t\t\t\tthrow new Error('Invalid response from update API')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst { status, message } = parsed.data\n\t\t\t\t\t\t\tif (status === 'ok') {\n\t\t\t\t\t\t\t\tlet reloaded = false\n\t\t\t\t\t\t\t\ttoast.success('Workshop updated', {\n\t\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\t'Reloading in 2 seconds... You can reload now if you prefer.',\n\t\t\t\t\t\t\t\t\tduration: 2000,\n\t\t\t\t\t\t\t\t\taction: {\n\t\t\t\t\t\t\t\t\t\tlabel: 'Reload now',\n\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\treloaded = true\n\t\t\t\t\t\t\t\t\t\t\twindow.location.reload()\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tonAutoClose: () => {\n\t\t\t\t\t\t\t\t\t\tif (!reloaded) {\n\t\t\t\t\t\t\t\t\t\t\twindow.location.reload()\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttoast.error('Failed to update workshop', {\n\t\t\t\t\t\t\t\t\tdescription: message || 'Unknown error',\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\ttoast.error('Failed to update workshop', {\n\t\t\t\t\t\t\t\tdescription: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tupdateInProgress.current = false\n\t\t\t\t\t\t\tif (inProgressToastId.current) {\n\t\t\t\t\t\t\t\ttoast.dismiss(inProgressToastId.current)\n\t\t\t\t\t\t\t\tinProgressToastId.current = null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\tlabel: 'Dismiss',\n\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t// Dismiss the notification toast\n\t\t\t\t\t\tif (updateToastId.current) {\n\t\t\t\t\t\t\ttoast.dismiss(updateToastId.current)\n\t\t\t\t\t\t\tupdateToastId.current = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Mute the notification persistently\n\t\t\t\t\t\tvoid fetcherRef.current.submit(\n\t\t\t\t\t\t\t{ intent: 'mute', id: updateNotificationKey },\n\t\t\t\t\t\t\t{ method: 'post', action: '/admin/notifications' },\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t\tupdateToastId.current = id\n\t\t}\n\t}, [\n\t\tupdatesAvailable,\n\t\tupdateNotificationKey,\n\t\trepoUpdatesAvailable,\n\t\tdependenciesNeedInstall,\n\t\tdiffLink,\n\t])\n\n\treturn null\n}\n","import { muteNotification } from '@epic-web/workshop-utils/db.server'\nimport { type getUnmutedNotifications } from '@epic-web/workshop-utils/notifications.server'\nimport { useEffect, useRef } from 'react'\nimport { data, type ActionFunctionArgs, useFetcher } from 'react-router'\nimport { toast } from 'sonner'\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tconst id = formData.get('id')\n\tif (typeof id !== 'string') {\n\t\treturn data({ error: 'Invalid notification id' }, { status: 400 })\n\t}\n\tif (intent === 'mute') {\n\t\tawait muteNotification(id)\n\t\treturn data({ success: true })\n\t}\n\treturn data({ error: 'Invalid intent' }, { status: 400 })\n}\n\nexport function Notifications({\n\tunmutedNotifications,\n}: {\n\tunmutedNotifications: Awaited<ReturnType<typeof getUnmutedNotifications>>\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst fetcherRef = useRef(fetcher)\n\tconst toastedIds = useRef<Set<string>>(new Set())\n\n\tuseEffect(() => {\n\t\tfor (const notification of unmutedNotifications) {\n\t\t\tif (toastedIds.current.has(notification.id)) continue\n\t\t\ttoastedIds.current.add(notification.id)\n\n\t\t\ttoast.info(notification.title, {\n\t\t\t\tid: notification.id,\n\t\t\t\tdescription: (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<p>{notification.message}</p>\n\t\t\t\t\t\t{notification.link && (\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={notification.link}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"text-xs underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tLearn more\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t),\n\t\t\t\tduration: Infinity,\n\t\t\t\taction: {\n\t\t\t\t\tlabel: 'Dismiss',\n\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\tvoid fetcherRef.current.submit(\n\t\t\t\t\t\t\t{ intent: 'mute', id: notification.id },\n\t\t\t\t\t\t\t{ method: 'post', action: '/admin/notifications' },\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}, [unmutedNotifications])\n\n\treturn null\n}\n","import \"/home/runner/work/epicshop/epicshop/packages/workshop-app/app/styles/app.css?transform-only\";export default \"__VITE_CSS_URL__2f686f6d652f72756e6e65722f776f726b2f6570696373686f702f6570696373686f702f7061636b616765732f776f726b73686f702d6170702f6170702f7374796c65732f6170702e6373733f7472616e73666f726d2d6f6e6c79__\"","import \"/home/runner/work/epicshop/epicshop/packages/workshop-app/app/styles/tailwind.css?transform-only\";export default \"__VITE_CSS_URL__2f686f6d652f72756e6e65722f776f726b2f6570696373686f702f6570696373686f702f7061636b616765732f776f726b73686f702d6170702f6170702f7374796c65732f7461696c77696e642e6373733f7472616e73666f726d2d6f6e6c79__\"","type SentryUser = {\n\tid?: string\n\temail?: string\n}\n\ntype SentryUserSource = {\n\tuser?: { id?: string | null; email?: string | null } | null\n\tuserId?: { id?: string | null } | null\n}\n\nconst UNKNOWN_EMAIL = 'unknown@example.com'\n\nexport function getSentryUser({\n\tuser,\n\tuserId,\n}: SentryUserSource): SentryUser | null {\n\tconst id = user?.id ?? userId?.id ?? undefined\n\tconst email =\n\t\tuser?.email && user.email !== UNKNOWN_EMAIL ? user.email : undefined\n\n\tif (!id && !email) return null\n\n\tconst sentryUser: SentryUser = {}\n\tif (id) sentryUser.id = id\n\tif (email) sentryUser.email = email\n\treturn sentryUser\n}\n","import path from 'node:path'\nimport { getPresentUsers } from '@epic-web/workshop-presence/presence.server'\nimport { getApps } from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tgetLoggedInProductHosts,\n\tgetPreferences,\n\tgetMutedNotifications,\n} from '@epic-web/workshop-utils/db.server'\nimport { getEnv } from '@epic-web/workshop-utils/env.server'\nimport {\n\tgetProgress,\n\tgetUserInfo,\n\tuserHasAccessToWorkshop,\n} from '@epic-web/workshop-utils/epic-api.server'\nimport {\n\tcheckForUpdatesCached,\n\tcheckForExerciseChanges,\n} from '@epic-web/workshop-utils/git.server'\nimport { getUnmutedNotifications } from '@epic-web/workshop-utils/notifications.server'\nimport { getOfflineVideoPlaybackIds } from '@epic-web/workshop-utils/offline-videos.server'\nimport { makeTimings } from '@epic-web/workshop-utils/timing.server'\nimport {\n\tgetSetClientIdCookieHeader,\n\tgetUserId,\n} from '@epic-web/workshop-utils/user.server'\nimport { checkConnection } from '@epic-web/workshop-utils/utils.server'\n\nimport * as React from 'react'\nimport {\n\tdata,\n\ttype LinksFunction,\n\tLinks,\n\tMeta,\n\tOutlet,\n\tScripts,\n\tScrollRestoration,\n\tuseLoaderData,\n\tuseNavigation,\n} from 'react-router'\nimport { promiseHash } from 'remix-utils/promise'\nimport { useSpinDelay } from 'spin-delay'\nimport { type Route } from './+types/root.tsx'\nimport { Confetti } from './components/confetti'\nimport { GeneralErrorBoundary } from './components/error-boundary'\nimport { ExerciseWarningBanner } from './components/exercise-warning-banner'\nimport { KeyboardShortcutsDialog } from './components/keyboard-shortcuts-dialog'\nimport { EpicProgress } from './components/progress-bar'\nimport { EpicToaster } from './components/toaster'\nimport { TooltipProvider } from './components/ui/tooltip'\nimport { UpdateToast } from './components/update-repo'\nimport { Notifications } from './routes/admin+/notifications'\nimport { useTheme } from './routes/theme/index'\nimport { getTheme } from './routes/theme/theme-session.server'\nimport appStylesheetUrl from './styles/app.css?url'\nimport tailwindStylesheetUrl from './styles/tailwind.css?url'\nimport { ClientHintCheck, getHints } from './utils/client-hints'\nimport { getConfetti } from './utils/confetti.server'\nimport { cn, combineHeaders, getDomainUrl, useAltDown } from './utils/misc'\nimport { getPracticePastLessonData } from './utils/practice-past-lesson'\nimport { Presence } from './utils/presence'\nimport { getSentryUser } from './utils/sentry-user'\nimport { getSeoMetaTags } from './utils/seo'\nimport { getToast } from './utils/toast.server'\n\nexport const links: LinksFunction = () => {\n\treturn [\n\t\t{ rel: 'stylesheet', href: '/neogrotesk-font.css' },\n\t\t{\n\t\t\trel: 'stylesheet',\n\t\t\thref: 'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,200;0,300;0,400;0,500;0,600;1,700&display=swap',\n\t\t},\n\t\t{ rel: 'stylesheet', href: tailwindStylesheetUrl },\n\t\t{ rel: 'stylesheet', href: appStylesheetUrl },\n\t\t{\n\t\t\trel: 'icon',\n\t\t\thref: '/favicon.ico',\n\t\t\tsizes: '48x48',\n\t\t},\n\t\t{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },\n\t]\n}\n\nexport const meta: Route.MetaFunction = ({ loaderData }) => {\n\tif (!loaderData) return []\n\n\treturn getSeoMetaTags({\n\t\tinstructor: loaderData.instructor,\n\t\ttitle: loaderData.workshopTitle,\n\t\tdescription: loaderData.workshopSubtitle,\n\t\trequestInfo: loaderData.requestInfo,\n\t})\n}\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tconst timings = makeTimings('rootLoader')\n\tconst workshopConfig = getWorkshopConfig()\n\tconst requestUrl = new URL(request.url)\n\tconst {\n\t\ttitle: workshopTitle,\n\t\tsubtitle: workshopSubtitle,\n\t\tinstructor,\n\t} = workshopConfig\n\n\tconst theme = getTheme(request)\n\tconst { confettiId, headers: confettiHeaders } = getConfetti(request)\n\tconst { toast, headers: toastHeaders } = await getToast(request)\n\tconst isOnlinePromise = checkConnection({ request, timings })\n\n\tconst asyncStuff = await promiseHash({\n\t\tuserId: getUserId({ request }),\n\t\tpreferences: getPreferences(),\n\t\tprogress: getProgress({ timings }).catch((e) => {\n\t\t\tconsole.error('Failed to get progress', e)\n\t\t\tconst emptyProgress: Awaited<ReturnType<typeof getProgress>> = []\n\t\t\treturn emptyProgress\n\t\t}),\n\t\tuser: getUserInfo(),\n\t\tuserHasAccess: userHasAccessToWorkshop({ request, timings }),\n\t\tapps: getApps({ request, timings }),\n\t\trepoUpdates: checkForUpdatesCached(),\n\t\tunmutedNotifications: getUnmutedNotifications(),\n\t\texerciseChanges: checkForExerciseChanges(),\n\t\tloggedInProductHosts: getLoggedInProductHosts(),\n\t\tofflineVideoPlaybackIds: getOfflineVideoPlaybackIds(),\n\t})\n\n\tconst presentUsers = await getPresentUsers({\n\t\trequest,\n\t\ttimings,\n\t})\n\n\t// Filter out repoUpdates if muted\n\tconst mutedNotifications = await getMutedNotifications()\n\tlet repoUpdates = asyncStuff.repoUpdates\n\tif (\n\t\trepoUpdates?.updateNotificationId &&\n\t\tmutedNotifications.includes(repoUpdates.updateNotificationId)\n\t) {\n\t\trepoUpdates = {\n\t\t\t...repoUpdates,\n\t\t\tupdatesAvailable: false,\n\t\t\trepoUpdatesAvailable: false,\n\t\t\tdependenciesNeedInstall: false,\n\t\t}\n\t}\n\n\tconst practicePastLesson = getPracticePastLessonData({\n\t\tprogress: asyncStuff.progress,\n\t\tcurrentPath: requestUrl.pathname,\n\t})\n\n\treturn data(\n\t\t{\n\t\t\t...asyncStuff,\n\t\t\tworkshopConfig,\n\t\t\tworkshopTitle,\n\t\t\tworkshopSubtitle,\n\t\t\tinstructor,\n\t\t\tapps: asyncStuff.apps.map(({ name, fullPath, relativePath }) => ({\n\t\t\t\tname,\n\t\t\t\tfullPath,\n\t\t\t\trelativePath,\n\t\t\t})),\n\t\t\tENV: getEnv(),\n\t\t\tpracticePastLesson,\n\t\t\trequestInfo: {\n\t\t\t\tprotocol: requestUrl.protocol,\n\t\t\t\thostname: requestUrl.hostname,\n\t\t\t\tport: requestUrl.port,\n\t\t\t\torigin: requestUrl.origin,\n\t\t\t\tdomain: getDomainUrl(request),\n\t\t\t\thints: getHints(request),\n\t\t\t\tpath: requestUrl.pathname,\n\t\t\t\tsession: { theme },\n\t\t\t\tseparator: path.sep,\n\t\t\t\tonline: await isOnlinePromise,\n\t\t\t},\n\t\t\ttoast,\n\t\t\tconfettiId,\n\t\t\tpresence: {\n\t\t\t\tusers: presentUsers,\n\t\t\t},\n\t\t\trepoUpdates,\n\t\t\texerciseChanges: asyncStuff.exerciseChanges,\n\t\t\tofflineVideoPlaybackIds: asyncStuff.offlineVideoPlaybackIds,\n\t\t},\n\t\t{\n\t\t\theaders: combineHeaders(\n\t\t\t\ttoastHeaders,\n\t\t\t\tconfettiHeaders,\n\t\t\t\t{ 'Server-Timing': timings.toString() },\n\t\t\t\tasyncStuff.userId?.type === 'cookie.randomId'\n\t\t\t\t\t? { 'Set-Cookie': getSetClientIdCookieHeader(asyncStuff.userId.id) }\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t},\n\t)\n}\n\nfunction Document({\n\tchildren,\n\tenv = {},\n\tclassName,\n\tstyle,\n}: {\n\tchildren: React.ReactNode\n\tenv?: Record<string, unknown>\n\tclassName: string\n\tstyle?: React.CSSProperties\n}) {\n\treturn (\n\t\t<html lang=\"en\" className={className} style={style}>\n\t\t\t<head>\n\t\t\t\t<ClientHintCheck />\n\t\t\t\t<Meta />\n\t\t\t\t<meta charSet=\"utf-8\" />\n\t\t\t\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n\t\t\t\t<Links />\n\t\t\t\t<script\n\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t__html: `window.ENV = ${JSON.stringify(env)}`,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</head>\n\t\t\t<body className=\"bg-background text-foreground scrollbar-thin scrollbar-thumb-scrollbar h-screen-safe\">\n\t\t\t\t{children}\n\t\t\t\t<ScrollRestoration />\n\t\t\t\t<Scripts />\n\t\t\t</body>\n\t\t</html>\n\t)\n}\n\nfunction App() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst navigation = useNavigation()\n\tconst showSpinner = useSpinDelay(navigation.state !== 'idle', {\n\t\tdelay: 400,\n\t\tminDuration: 200,\n\t})\n\tconst altDown = useAltDown()\n\tconst [showKeyboardShortcuts, setShowKeyboardShortcuts] =\n\t\tReact.useState(false)\n\n\tReact.useEffect(() => {\n\t\tconst handleToggle = () => {\n\t\t\tsetShowKeyboardShortcuts((prev) => !prev)\n\t\t}\n\t\twindow.addEventListener('toggle-keyboard-shortcuts', handleToggle)\n\t\treturn () => {\n\t\t\twindow.removeEventListener('toggle-keyboard-shortcuts', handleToggle)\n\t\t}\n\t}, [])\n\n\tReact.useEffect(() => {\n\t\tif (!ENV.EPICSHOP_IS_PUBLISHED) return\n\t\tconst sentryUser = getSentryUser({\n\t\t\tuser: data.user,\n\t\t\tuserId: data.userId,\n\t\t})\n\t\tvoid import('@sentry/react-router')\n\t\t\t.then((Sentry) => {\n\t\t\t\tif (sentryUser) {\n\t\t\t\t\tSentry.setUser(sentryUser)\n\t\t\t\t} else {\n\t\t\t\t\tSentry.setUser(null)\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => {})\n\t}, [data.user, data.userId])\n\n\tconst theme = useTheme()\n\treturn (\n\t\t<Document\n\t\t\tstyle={\n\t\t\t\tdata.preferences?.fontSize\n\t\t\t\t\t? { fontSize: `${data.preferences?.fontSize}px` }\n\t\t\t\t\t: {}\n\t\t\t}\n\t\t\tclassName={cn(\n\t\t\t\t'h-screen-safe antialiased',\n\t\t\t\ttheme,\n\t\t\t\t{ 'cursor-progress': showSpinner },\n\t\t\t\taltDown ? 'alt-down' : null,\n\t\t\t)}\n\t\t\tenv={data.ENV}\n\t\t>\n\t\t\t{data.exerciseChanges &&\n\t\t\t\t!data.preferences?.exerciseWarning?.dismissed && (\n\t\t\t\t\t<ExerciseWarningBanner />\n\t\t\t\t)}\n\t\t\t<Outlet />\n\t\t\t<Confetti id={data.confettiId} />\n\t\t\t<EpicToaster toast={data.toast} />\n\t\t\t<UpdateToast repoUpdates={data.repoUpdates} />\n\t\t\t<EpicProgress />\n\t\t\t<Notifications unmutedNotifications={data.unmutedNotifications} />\n\t\t\t<KeyboardShortcutsDialog\n\t\t\t\topen={showKeyboardShortcuts}\n\t\t\t\tonOpenChange={setShowKeyboardShortcuts}\n\t\t\t/>\n\t\t</Document>\n\t)\n}\n\nexport default function AppWithProviders() {\n\tconst { user } = useLoaderData<typeof loader>()\n\treturn (\n\t\t<Presence user={user}>\n\t\t\t<TooltipProvider>\n\t\t\t\t<App />\n\t\t\t</TooltipProvider>\n\t\t</Presence>\n\t)\n}\n\nexport function ErrorBoundary() {\n\treturn (\n\t\t<Document className=\"h-screen-safe\">\n\t\t\t<GeneralErrorBoundary />\n\t\t</Document>\n\t)\n}\n"],"file":"root-BwYDIUyI.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["tweenFunctions","t","b","_c","d","c","a","p","s","v","tweenFunctions_1","_defineProperties","target","props","i","descriptor","_createClass","Constructor","protoProps","staticProps","_extends","source","key","_inheritsLoose","subClass","superClass","_setPrototypeOf","o","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","Particle","context","getOptions","x","y","_this$getOptions","colors","initialVelocityX","initialVelocityY","_proto","_this$getOptions2","gravity","wind","friction","opacity","drawShape","rotateDelta","ParticleGeneratorClass","canvas","_this","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","now","tweenInitTime","progressTime","tweenedVal","numToAdd","ctx","confettiDefaults","tweens","Confetti","opts","computedConfettiDefaults","_this$options","onConfettiComplete","lastRunState","lastRecycleState","ref","React","extractCanvasProps","confettiOptions","refs","rest","confettiOptionKeys","refProps","prop","val","ConfettiReactInternal","_Component","_extractCanvasProps","passedProps","canvasStyles","Component","Index","_ref","id","jsx","ClientOnly","ConfettiShower","ExerciseWarningBanner","jsxs","Link","Icon","shortcutCategories","KeyboardShortcutsDialog","open","onOpenChange","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","category","shortcut","index","keyIndex","React.Fragment","EpicToaster","toast","Fragment","Toaster","ShowToast","type","title","description","useEffect","showToast","UpdateToast","repoUpdates","updatesAvailable","repoUpdatesAvailable","dependenciesNeedInstall","updateNotificationKey","diffLink","fetcher","useFetcher","fetcherRef","useRef","inProgressToastId","updateToastId","updateInProgress","EPICSHOP_PARENT_PORT","EPICSHOP_PARENT_TOKEN","res","data","parsed","z.object","z.enum","z.string","status","message","reloaded","err","Notifications","unmutedNotifications","toastedIds","Set","notification","current","has","add","info","children","link","href","className","duration","Infinity","action","label","onClick","submit","intent","method","appStylesheetUrl","tailwindStylesheetUrl","UNKNOWN_EMAIL","getSentryUser","user","userId","email","sentryUser","links","rel","sizes","meta","loaderData","getSeoMetaTags","instructor","workshopTitle","workshopSubtitle","requestInfo","Document","env","style","lang","ClientHintCheck","Meta","charSet","name","content","Links","dangerouslySetInnerHTML","__html","JSON","stringify","ScrollRestoration","Scripts","App","useLoaderData","navigation","useNavigation","showSpinner","useSpinDelay","state","delay","minDuration","altDown","useAltDown","showKeyboardShortcuts","setShowKeyboardShortcuts","handleToggle","prev","window","addEventListener","removeEventListener","ENV","EPICSHOP_IS_PUBLISHED","then","Sentry","setUser","catch","theme","useTheme","preferences","fontSize","cn","exerciseChanges","exerciseWarning","dismissed","Outlet","confettiId","EpicProgress","root","_UNSAFE_withComponentProps","Presence","TooltipProvider","ErrorBoundary","_UNSAFE_withErrorBoundaryProps","GeneralErrorBoundary"],"ignoreList":[0,1],"sources":["../../../../../node_modules/tween-functions/index.js","../../../../../node_modules/confetti-react/dist/confetti-react.esm.js","../../../app/components/confetti.tsx","../../../app/components/exercise-warning-banner.tsx","../../../app/components/keyboard-shortcuts-dialog.tsx","../../../app/components/toaster.tsx","../../../app/components/update-repo.tsx","../../../app/routes/admin+/notifications.tsx","../../../app/styles/app.css?url","../../../app/styles/tailwind.css?url","../../../app/utils/sentry-user.ts","../../../app/root.tsx"],"sourcesContent":["'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import React, { Component } from 'react';\nimport tweens from 'tween-functions';\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n\n _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nfunction degreesToRads(degrees) {\n return degrees * Math.PI / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\n\nvar RotationDirection;\n\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\n\nvar Particle = /*#__PURE__*/function () {\n function Particle(context, getOptions, x, y) {\n this.getOptions = getOptions;\n\n var _this$getOptions = this.getOptions(),\n colors = _this$getOptions.colors,\n initialVelocityX = _this$getOptions.initialVelocityX,\n initialVelocityY = _this$getOptions.initialVelocityY;\n\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx = randomRange(-initialVelocityX, initialVelocityX);\n this.vy = randomRange(-initialVelocityY, 0);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1) ? RotationDirection.Positive : RotationDirection.Negative;\n }\n\n var _proto = Particle.prototype;\n\n _proto.update = function update() {\n var _this$getOptions2 = this.getOptions(),\n gravity = _this$getOptions2.gravity,\n wind = _this$getOptions2.wind,\n friction = _this$getOptions2.friction,\n opacity = _this$getOptions2.opacity,\n drawShape = _this$getOptions2.drawShape;\n\n this.x += this.vx;\n this.y += this.vy;\n this.vy += gravity;\n this.vx += wind;\n this.vx *= friction;\n this.vy *= friction;\n\n if (this.rotateY >= 1 && this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n } else if (this.rotateY <= -1 && this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n\n var rotateDelta = 0.1 * this.rotationDirection;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n } else {\n switch (this.shape) {\n case ParticleShape.Circle:\n {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n\n case ParticleShape.Square:\n {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n\n case ParticleShape.Strip:\n {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n\n default:\n {\n throw new Error('Unknown type in Particle.ts');\n }\n }\n }\n\n this.context.closePath();\n this.context.restore();\n };\n\n return Particle;\n}();\n\nvar ParticleGeneratorClass = function ParticleGeneratorClass(canvas, getOptions) {\n var _this = this;\n\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenInitTime = Date.now();\n this.particles = [];\n this.particlesGenerated = 0;\n\n this.removeParticleAt = function (i) {\n _this.particles.splice(i, 1);\n };\n\n this.getParticle = function () {\n var newParticleX = randomRange(_this.x, _this.w + _this.x);\n var newParticleY = randomRange(_this.y, _this.h + _this.y);\n return new Particle(_this.context, _this.getOptions, newParticleX, newParticleY);\n };\n\n this.animate = function () {\n var canvas = _this.canvas,\n context = _this.context,\n particlesGenerated = _this.particlesGenerated,\n lastNumberOfPieces = _this.lastNumberOfPieces;\n\n var _this$getOptions = _this.getOptions(),\n run = _this$getOptions.run,\n recycle = _this$getOptions.recycle,\n numberOfPieces = _this$getOptions.numberOfPieces,\n debug = _this$getOptions.debug,\n tweenFunction = _this$getOptions.tweenFunction,\n tweenDuration = _this$getOptions.tweenDuration;\n\n if (!run) {\n return false;\n }\n\n var nP = _this.particles.length;\n var activeCount = recycle ? nP : particlesGenerated;\n var now = Date.now(); // Initial population\n\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n _this.tweenInitTime = now;\n _this.lastNumberOfPieces = numberOfPieces;\n }\n\n var tweenInitTime = _this.tweenInitTime; // Add more than one piece per loop, otherwise the number of pieces would\n // be limitted by the RAF framerate\n\n var progressTime = now - tweenInitTime > tweenDuration ? tweenDuration : Math.max(0, now - tweenInitTime);\n var tweenedVal = tweenFunction(progressTime, activeCount, numberOfPieces, tweenDuration);\n var numToAdd = Math.round(tweenedVal - activeCount);\n\n for (var i = 0; i < numToAdd; i += 1) {\n _this.particles.push(_this.getParticle());\n }\n\n _this.particlesGenerated += numToAdd;\n }\n\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(\"Particles: \" + nP, canvas.width - 10, canvas.height - 20);\n } // Maintain the population\n\n\n _this.particles.forEach(function (p, i) {\n // Update each particle's position\n p.update(); // Prune the off-canvas particles\n\n if (p.y > canvas.height || p.y < -100 || p.x > canvas.width + 100 || p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n _this.particles[i] = _this.getParticle();\n } else {\n _this.removeParticleAt(i);\n }\n }\n });\n\n return nP > 0 || activeCount < numberOfPieces;\n };\n\n this.canvas = canvas;\n var ctx = this.canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n\n this.context = ctx;\n this.getOptions = getOptions;\n};\n\nvar confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: ['#f44336', '#e91e63', '#9c27b0', '#673ab7', '#3f51b5', '#2196f3', '#03a9f4', '#00bcd4', '#009688', '#4CAF50', '#8BC34A', '#CDDC39', '#FFEB3B', '#FFC107', '#FF9800', '#FF5722', '#795548'],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true\n};\nvar Confetti = /*#__PURE__*/function () {\n function Confetti(canvas, opts) {\n var _this = this;\n\n this.setOptionsWithDefaults = function (opts) {\n var computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: _this.canvas.width,\n h: 0\n }\n };\n _this._options = _extends({}, computedConfettiDefaults, confettiDefaults, opts);\n Object.assign(_this, opts.confettiSource);\n };\n\n this.update = function () {\n var _this$options = _this.options,\n run = _this$options.run,\n onConfettiComplete = _this$options.onConfettiComplete,\n canvas = _this.canvas,\n context = _this.context;\n\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n if (_this.generator.animate()) {\n _this.rafId = requestAnimationFrame(_this.update);\n } else {\n if (onConfettiComplete && typeof onConfettiComplete === 'function' && _this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(_this, _this);\n }\n\n _this._options.run = false;\n }\n };\n\n this.reset = function () {\n if (_this.generator && _this.generator.particlesGenerated > 0) {\n _this.generator.particlesGenerated = 0;\n _this.generator.particles = [];\n _this.generator.lastNumberOfPieces = 0;\n }\n };\n\n this.stop = function () {\n _this.options = {\n run: false\n };\n\n if (_this.rafId) {\n cancelAnimationFrame(_this.rafId);\n _this.rafId = undefined;\n }\n };\n\n this.canvas = canvas;\n var ctx = this.canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n\n this.context = ctx;\n this.generator = new ParticleGeneratorClass(this.canvas, function () {\n return _this.options;\n });\n this.options = opts;\n this.update();\n }\n\n _createClass(Confetti, [{\n key: \"options\",\n get: function get() {\n return this._options;\n },\n set: function set(opts) {\n var lastRunState = this._options && this._options.run;\n var lastRecycleState = this._options && this._options.recycle;\n this.setOptionsWithDefaults(opts);\n\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n\n if (typeof opts.recycle === 'boolean' && opts.recycle && lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n }]);\n\n return Confetti;\n}();\n\nvar ref = /*#__PURE__*/React.createRef();\n\nfunction extractCanvasProps(props) {\n var confettiOptions = {};\n var refs = {};\n var rest = {};\n var confettiOptionKeys = [].concat(Object.keys(confettiDefaults), ['confettiSource', 'drawShape', 'onConfettiComplete']);\n var refProps = ['canvasRef'];\n Object.keys(props).forEach(function (prop) {\n var val = props[prop];\n\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n } else if (refProps.includes(prop)) {\n refProps[prop] = val;\n } else {\n rest[prop] = val;\n }\n });\n return [confettiOptions, rest, refs];\n}\n\nvar ConfettiReactInternal = /*#__PURE__*/function (_Component) {\n _inheritsLoose(ConfettiReactInternal, _Component);\n\n function ConfettiReactInternal(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.canvas = React.createRef();\n _this.canvas = props.canvasRef || ref;\n return _this;\n }\n\n var _proto = ConfettiReactInternal.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n if (this.canvas.current) {\n var opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n var confettiOptions = extractCanvasProps(this.props)[0];\n\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n\n this.confetti = undefined;\n };\n\n _proto.render = function render() {\n var _extractCanvasProps = extractCanvasProps(this.props),\n confettiOptions = _extractCanvasProps[0],\n passedProps = _extractCanvasProps[1];\n\n var canvasStyles = _extends({\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n }, passedProps.style);\n\n return React.createElement(\"canvas\", Object.assign({\n width: confettiOptions.width,\n height: confettiOptions.height,\n ref: this.canvas\n }, passedProps, {\n style: canvasStyles\n }));\n };\n\n return ConfettiReactInternal;\n}(Component);\n\nConfettiReactInternal.defaultProps = /*#__PURE__*/_extends({}, confettiDefaults);\nConfettiReactInternal.displayName = 'ConfettiReact'; // eslint-disable-next-line react/display-name\n\nvar Index = /*#__PURE__*/React.forwardRef(function (props, _ref) {\n return React.createElement(ConfettiReactInternal, Object.assign({\n canvasRef: ref\n }, props));\n});\n\nexport default Index;\nexport { Index };\n//# sourceMappingURL=confetti-react.esm.js.map\n","import { Index as ConfettiShower } from 'confetti-react'\nimport { ClientOnly } from 'remix-utils/client-only'\n\nexport function Confetti({ id }: { id?: string | null }) {\n\tif (!id) return null\n\n\treturn (\n\t\t<ClientOnly>\n\t\t\t{() => (\n\t\t\t\t<ConfettiShower\n\t\t\t\t\tkey={id}\n\t\t\t\t\trun={Boolean(id)}\n\t\t\t\t\trecycle={false}\n\t\t\t\t\tnumberOfPieces={800}\n\t\t\t\t\twidth={window.innerWidth}\n\t\t\t\t\theight={window.innerHeight}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</ClientOnly>\n\t)\n}\n","import { Link } from 'react-router'\nimport { Icon } from './icons.tsx'\n\nexport function ExerciseWarningBanner() {\n\treturn (\n\t\t<div className=\"border-destructive bg-destructive fixed top-0 right-0 left-0 z-50 border-b\">\n\t\t\t<div className=\"relative w-full p-4\">\n\t\t\t\t{/* Full-banner clickable link, visually hidden but covers the banner */}\n\t\t\t\t<Link\n\t\t\t\t\tto=\"/workspace-structure\"\n\t\t\t\t\tclassName=\"absolute inset-0 z-10 block h-full w-full\"\n\t\t\t\t\taria-label=\"Learn more about workspace structure\"\n\t\t\t\t/>\n\t\t\t\t<div className=\"relative z-0 container flex items-center justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tname=\"Error\"\n\t\t\t\t\t\t\tclassName=\"text-destructive-foreground h-5 w-5\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<h3 className=\"text-destructive-foreground text-sm font-semibold\">\n\t\t\t\t\t\t\t\tWarning: Changes detected in exercises directory\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t<p className=\"text-destructive-foreground/80 text-xs\">\n\t\t\t\t\t\t\t\tYou should typically work in the playground directory, not the\n\t\t\t\t\t\t\t\texercises directory.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-destructive-foreground flex items-center gap-2 text-xs\">\n\t\t\t\t\t\t<span>Learn more</span>\n\t\t\t\t\t\t<Icon name=\"ArrowRight\" className=\"h-3 w-3\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import * as React from 'react'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTitle,\n} from './ui/dialog'\n\ninterface KeyboardShortcut {\n\tkeys: string[]\n\tdescription: string\n}\n\ninterface ShortcutCategory {\n\ttitle: string\n\tshortcuts: KeyboardShortcut[]\n}\n\nconst shortcutCategories: ShortcutCategory[] = [\n\t{\n\t\ttitle: 'Navigation',\n\t\tshortcuts: [\n\t\t\t{ keys: ['g', 'h'], description: 'Go to home' },\n\t\t\t{\n\t\t\t\tkeys: ['g', '1-9'],\n\t\t\t\tdescription: 'Go to exercise (e.g., g+1 → /exercise/01)',\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeys: ['g', '1-9', '.', '1-9'],\n\t\t\t\tdescription:\n\t\t\t\t\t'Go to exercise step (e.g., g+1+.+2 → /exercise/01/02/problem)',\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeys: ['g', '1-9', '.', 'f'],\n\t\t\t\tdescription:\n\t\t\t\t\t'Go to exercise finished page (e.g., g+1+.+f → /exercise/01/finished)',\n\t\t\t},\n\t\t\t{ keys: ['g', 'p'], description: 'Go to previous step/page' },\n\t\t\t{ keys: ['g', 'n'], description: 'Go to next step/page' },\n\t\t\t{ keys: ['g', 'a'], description: 'Go to account page' },\n\t\t\t{ keys: ['g', 'd'], description: 'Go to admin page' },\n\t\t\t{ keys: ['g', 'l'], description: 'Go to last exercise solution' },\n\t\t\t{ keys: ['Escape'], description: 'Close sidebar navigation (when open)' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Playback Controls',\n\t\tshortcuts: [\n\t\t\t{ keys: ['Space', 'k'], description: 'Play/pause video' },\n\t\t\t{ keys: ['j'], description: 'Seek backward 10 seconds' },\n\t\t\t{ keys: ['l'], description: 'Seek forward 10 seconds' },\n\t\t\t{ keys: ['←'], description: 'Seek backward 10 seconds' },\n\t\t\t{ keys: ['→'], description: 'Seek forward 10 seconds' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Frame-by-Frame Navigation',\n\t\tshortcuts: [\n\t\t\t{ keys: [','], description: 'Go to previous frame (when paused)' },\n\t\t\t{ keys: ['.'], description: 'Go to next frame (when paused)' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Volume Control',\n\t\tshortcuts: [\n\t\t\t{ keys: ['↑'], description: 'Increase volume by 10%' },\n\t\t\t{ keys: ['↓'], description: 'Decrease volume by 10%' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Playback Speed',\n\t\tshortcuts: [\n\t\t\t{ keys: ['Shift', '>'], description: 'Increase playback speed' },\n\t\t\t{ keys: ['Shift', '<'], description: 'Decrease playback speed' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Fullscreen and Picture-in-Picture',\n\t\tshortcuts: [\n\t\t\t{ keys: ['f'], description: 'Toggle fullscreen mode' },\n\t\t\t{ keys: ['i'], description: 'Toggle picture-in-picture mode' },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Captions',\n\t\tshortcuts: [{ keys: ['c'], description: 'Toggle captions/subtitles' }],\n\t},\n\t{\n\t\ttitle: 'Quick Seek',\n\t\tshortcuts: [\n\t\t\t{\n\t\t\t\tkeys: ['0-9'],\n\t\t\t\tdescription:\n\t\t\t\t\t'Seek to percentage of video (0 = 0%, 1 = 10%, ..., 9 = 90%)',\n\t\t\t},\n\t\t],\n\t},\n]\n\nfunction KeyboardShortcutsDialog({\n\topen,\n\tonOpenChange,\n}: {\n\topen: boolean\n\tonOpenChange: (open: boolean) => void\n}) {\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent className=\"max-h-[80vh] max-w-2xl overflow-y-auto\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Keyboard Shortcuts</DialogTitle>\n\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\tUse these keyboard shortcuts to navigate and control the video\n\t\t\t\t\t\tplayer. Press{' '}\n\t\t\t\t\t\t<kbd className=\"border-border bg-muted rounded border px-1.5 py-0.5 font-mono text-xs\">\n\t\t\t\t\t\t\t?\n\t\t\t\t\t\t</kbd>{' '}\n\t\t\t\t\t\tor select the question mark icon in the navigation to open this\n\t\t\t\t\t\tlist.\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t{shortcutCategories.map((category) => (\n\t\t\t\t\t\t<div key={category.title}>\n\t\t\t\t\t\t\t<h3 className=\"text-foreground mb-3 text-sm font-semibold\">\n\t\t\t\t\t\t\t\t{category.title}\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t{category.shortcuts.map((shortcut, index) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between gap-4\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground flex-1 text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t{shortcut.description}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex shrink-0 items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t{shortcut.keys.map((key, keyIndex) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<React.Fragment key={keyIndex}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<kbd className=\"border-border bg-muted rounded border px-2 py-1 font-mono text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</kbd>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{keyIndex < shortcut.keys.length - 1 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">+</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"border-border mt-4 border-t pt-4\">\n\t\t\t\t\t<p className=\"text-muted-foreground text-xs\">\n\t\t\t\t\t\t<strong>Note:</strong> Shortcuts are ignored when focus is on\n\t\t\t\t\t\tinteractive elements (inputs, buttons, etc.). Press{' '}\n\t\t\t\t\t\t<kbd className=\"border-border bg-muted rounded border px-1.5 py-0.5 font-mono text-xs\">\n\t\t\t\t\t\t\t?\n\t\t\t\t\t\t</kbd>{' '}\n\t\t\t\t\t\tto toggle this dialog.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n\nexport { KeyboardShortcutsDialog }\n","import { useEffect } from 'react'\nimport { Toaster, toast as showToast } from 'sonner'\nimport { type Toast } from '#app/utils/toast.server.ts'\n\nexport function EpicToaster({ toast }: { toast?: Toast | null }) {\n\treturn (\n\t\t<>\n\t\t\t<Toaster closeButton position=\"top-center\" />\n\t\t\t{toast ? <ShowToast toast={toast} /> : null}\n\t\t</>\n\t)\n}\n\nfunction ShowToast({ toast }: { toast: Toast }) {\n\tconst { id, type, title, description } = toast\n\tuseEffect(() => {\n\t\tsetTimeout(() => {\n\t\t\tshowToast[type](title, { id, description })\n\t\t}, 0)\n\t}, [description, id, title, type])\n\treturn null\n}\n","import { type checkForUpdatesCached } from '@epic-web/workshop-utils/git.server'\nimport { useEffect, useRef } from 'react'\nimport { useFetcher } from 'react-router'\nimport { toast } from 'sonner'\nimport { z } from 'zod'\n\nexport function UpdateToast({\n\trepoUpdates,\n}: {\n\trepoUpdates: Awaited<ReturnType<typeof checkForUpdatesCached>>\n}) {\n\tconst {\n\t\tupdatesAvailable,\n\t\trepoUpdatesAvailable,\n\t\tdependenciesNeedInstall,\n\t\tupdateNotificationId: updateNotificationKey,\n\t\tdiffLink,\n\t} = repoUpdates\n\tconst fetcher = useFetcher()\n\tconst fetcherRef = useRef(fetcher)\n\tuseEffect(() => {\n\t\tfetcherRef.current = fetcher\n\t}, [fetcher])\n\n\t// Track the in-progress toast id and update notification id\n\tconst inProgressToastId = useRef<ReturnType<typeof toast.loading> | null>(\n\t\tnull,\n\t)\n\tconst updateToastId = useRef<ReturnType<typeof toast.info> | null>(null)\n\tconst updateInProgress = useRef(false)\n\n\tuseEffect(() => {\n\t\tif (updatesAvailable && updateNotificationKey) {\n\t\t\t// Dismiss any existing toast before creating a new one\n\t\t\tif (updateToastId.current) {\n\t\t\t\ttoast.dismiss(updateToastId.current)\n\t\t\t\tupdateToastId.current = null\n\t\t\t}\n\n\t\t\tconst title = repoUpdatesAvailable\n\t\t\t\t? 'New workshop updates available'\n\t\t\t\t: 'Dependencies out of date'\n\t\t\tconst description = repoUpdatesAvailable ? (\n\t\t\t\t<div>\n\t\t\t\t\t{dependenciesNeedInstall\n\t\t\t\t\t\t? `Get the latest updates and reinstall dependencies by clicking the update button. `\n\t\t\t\t\t\t: `Get the latest updates by clicking the update button. `}\n\t\t\t\t\t{diffLink ? (\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={diffLink}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\tclassName=\"text-xs underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tView changes\n\t\t\t\t\t\t</a>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div>\n\t\t\t\t\t{`Your installed packages don't match package.json. `}\n\t\t\t\t\t{`Click the update button to reinstall dependencies.`}\n\t\t\t\t</div>\n\t\t\t)\n\n\t\t\tconst id = toast.info(title, {\n\t\t\t\tduration: Infinity,\n\t\t\t\tdescription,\n\t\t\t\tonDismiss: () => {\n\t\t\t\t\t// No-op for now, could call a dismiss endpoint if needed\n\t\t\t\t},\n\t\t\t\taction: {\n\t\t\t\t\tlabel: 'Update',\n\t\t\t\t\tonClick: async () => {\n\t\t\t\t\t\t// Dismiss the update notification immediately\n\t\t\t\t\t\tif (updateToastId.current) {\n\t\t\t\t\t\t\ttoast.dismiss(updateToastId.current)\n\t\t\t\t\t\t\tupdateToastId.current = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Show in-progress toast\n\t\t\t\t\t\tif (!inProgressToastId.current) {\n\t\t\t\t\t\t\tinProgressToastId.current = toast.loading('Update in progress...')\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (updateInProgress.current) return\n\t\t\t\t\t\tupdateInProgress.current = true\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { EPICSHOP_PARENT_PORT, EPICSHOP_PARENT_TOKEN } =\n\t\t\t\t\t\t\t\twindow.ENV || {}\n\t\t\t\t\t\t\tif (!EPICSHOP_PARENT_PORT || !EPICSHOP_PARENT_TOKEN) {\n\t\t\t\t\t\t\t\tthrow new Error('Update API not available')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst res = await fetch(\n\t\t\t\t\t\t\t\t`http://localhost:${EPICSHOP_PARENT_PORT}/__epicshop-restart`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t\t\t'x-epicshop-token': EPICSHOP_PARENT_TOKEN,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Request to update workshop failed: ${res.statusText}`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst data = await res.json().catch(() => ({}))\n\t\t\t\t\t\t\tconst schema = z.object({\n\t\t\t\t\t\t\t\tstatus: z.enum(['ok', 'error']),\n\t\t\t\t\t\t\t\tmessage: z.string().optional(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tconst parsed = schema.safeParse(data)\n\t\t\t\t\t\t\tif (!parsed.success) {\n\t\t\t\t\t\t\t\tconsole.error('Invalid response from update API', data)\n\t\t\t\t\t\t\t\tthrow new Error('Invalid response from update API')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst { status, message } = parsed.data\n\t\t\t\t\t\t\tif (status === 'ok') {\n\t\t\t\t\t\t\t\tlet reloaded = false\n\t\t\t\t\t\t\t\ttoast.success('Workshop updated', {\n\t\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\t'Reloading in 2 seconds... You can reload now if you prefer.',\n\t\t\t\t\t\t\t\t\tduration: 2000,\n\t\t\t\t\t\t\t\t\taction: {\n\t\t\t\t\t\t\t\t\t\tlabel: 'Reload now',\n\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\treloaded = true\n\t\t\t\t\t\t\t\t\t\t\twindow.location.reload()\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tonAutoClose: () => {\n\t\t\t\t\t\t\t\t\t\tif (!reloaded) {\n\t\t\t\t\t\t\t\t\t\t\twindow.location.reload()\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttoast.error('Failed to update workshop', {\n\t\t\t\t\t\t\t\t\tdescription: message || 'Unknown error',\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\ttoast.error('Failed to update workshop', {\n\t\t\t\t\t\t\t\tdescription: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tupdateInProgress.current = false\n\t\t\t\t\t\t\tif (inProgressToastId.current) {\n\t\t\t\t\t\t\t\ttoast.dismiss(inProgressToastId.current)\n\t\t\t\t\t\t\t\tinProgressToastId.current = null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\tlabel: 'Dismiss',\n\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t// Dismiss the notification toast\n\t\t\t\t\t\tif (updateToastId.current) {\n\t\t\t\t\t\t\ttoast.dismiss(updateToastId.current)\n\t\t\t\t\t\t\tupdateToastId.current = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Mute the notification persistently\n\t\t\t\t\t\tvoid fetcherRef.current.submit(\n\t\t\t\t\t\t\t{ intent: 'mute', id: updateNotificationKey },\n\t\t\t\t\t\t\t{ method: 'post', action: '/admin/notifications' },\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t\tupdateToastId.current = id\n\t\t}\n\t}, [\n\t\tupdatesAvailable,\n\t\tupdateNotificationKey,\n\t\trepoUpdatesAvailable,\n\t\tdependenciesNeedInstall,\n\t\tdiffLink,\n\t])\n\n\treturn null\n}\n","import { muteNotification } from '@epic-web/workshop-utils/db.server'\nimport { type getUnmutedNotifications } from '@epic-web/workshop-utils/notifications.server'\nimport { useEffect, useRef } from 'react'\nimport { data, type ActionFunctionArgs, useFetcher } from 'react-router'\nimport { toast } from 'sonner'\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tconst id = formData.get('id')\n\tif (typeof id !== 'string') {\n\t\treturn data({ error: 'Invalid notification id' }, { status: 400 })\n\t}\n\tif (intent === 'mute') {\n\t\tawait muteNotification(id)\n\t\treturn data({ success: true })\n\t}\n\treturn data({ error: 'Invalid intent' }, { status: 400 })\n}\n\nexport function Notifications({\n\tunmutedNotifications,\n}: {\n\tunmutedNotifications: Awaited<ReturnType<typeof getUnmutedNotifications>>\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst fetcherRef = useRef(fetcher)\n\tconst toastedIds = useRef<Set<string>>(new Set())\n\n\tuseEffect(() => {\n\t\tfor (const notification of unmutedNotifications) {\n\t\t\tif (toastedIds.current.has(notification.id)) continue\n\t\t\ttoastedIds.current.add(notification.id)\n\n\t\t\ttoast.info(notification.title, {\n\t\t\t\tid: notification.id,\n\t\t\t\tdescription: (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<p>{notification.message}</p>\n\t\t\t\t\t\t{notification.link && (\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={notification.link}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"text-xs underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tLearn more\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t),\n\t\t\t\tduration: Infinity,\n\t\t\t\taction: {\n\t\t\t\t\tlabel: 'Dismiss',\n\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\tvoid fetcherRef.current.submit(\n\t\t\t\t\t\t\t{ intent: 'mute', id: notification.id },\n\t\t\t\t\t\t\t{ method: 'post', action: '/admin/notifications' },\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}, [unmutedNotifications])\n\n\treturn null\n}\n","import \"/home/runner/work/epicshop/epicshop/packages/workshop-app/app/styles/app.css?transform-only\";export default \"__VITE_CSS_URL__2f686f6d652f72756e6e65722f776f726b2f6570696373686f702f6570696373686f702f7061636b616765732f776f726b73686f702d6170702f6170702f7374796c65732f6170702e6373733f7472616e73666f726d2d6f6e6c79__\"","import \"/home/runner/work/epicshop/epicshop/packages/workshop-app/app/styles/tailwind.css?transform-only\";export default \"__VITE_CSS_URL__2f686f6d652f72756e6e65722f776f726b2f6570696373686f702f6570696373686f702f7061636b616765732f776f726b73686f702d6170702f6170702f7374796c65732f7461696c77696e642e6373733f7472616e73666f726d2d6f6e6c79__\"","type SentryUser = {\n\tid?: string\n\temail?: string\n}\n\ntype SentryUserSource = {\n\tuser?: { id?: string | null; email?: string | null } | null\n\tuserId?: { id?: string | null } | null\n}\n\nconst UNKNOWN_EMAIL = 'unknown@example.com'\n\nexport function getSentryUser({\n\tuser,\n\tuserId,\n}: SentryUserSource): SentryUser | null {\n\tconst id = user?.id ?? userId?.id ?? undefined\n\tconst email =\n\t\tuser?.email && user.email !== UNKNOWN_EMAIL ? user.email : undefined\n\n\tif (!id && !email) return null\n\n\tconst sentryUser: SentryUser = {}\n\tif (id) sentryUser.id = id\n\tif (email) sentryUser.email = email\n\treturn sentryUser\n}\n","import path from 'node:path'\nimport { getPresentUsers } from '@epic-web/workshop-presence/presence.server'\nimport { getApps } from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tgetLoggedInProductHosts,\n\tgetPreferences,\n\tgetMutedNotifications,\n} from '@epic-web/workshop-utils/db.server'\nimport { getEnv } from '@epic-web/workshop-utils/env.server'\nimport {\n\tgetProgress,\n\tgetUserInfo,\n\tuserHasAccessToWorkshop,\n} from '@epic-web/workshop-utils/epic-api.server'\nimport {\n\tcheckForUpdatesCached,\n\tcheckForExerciseChanges,\n} from '@epic-web/workshop-utils/git.server'\nimport { getUnmutedNotifications } from '@epic-web/workshop-utils/notifications.server'\nimport { getOfflineVideoPlaybackIds } from '@epic-web/workshop-utils/offline-videos.server'\nimport { makeTimings } from '@epic-web/workshop-utils/timing.server'\nimport {\n\tgetSetClientIdCookieHeader,\n\tgetUserId,\n} from '@epic-web/workshop-utils/user.server'\nimport { checkConnection } from '@epic-web/workshop-utils/utils.server'\n\nimport * as React from 'react'\nimport {\n\tdata,\n\ttype LinksFunction,\n\tLinks,\n\tMeta,\n\tOutlet,\n\tScripts,\n\tScrollRestoration,\n\tuseLoaderData,\n\tuseNavigation,\n} from 'react-router'\nimport { promiseHash } from 'remix-utils/promise'\nimport { useSpinDelay } from 'spin-delay'\nimport { type Route } from './+types/root.tsx'\nimport { Confetti } from './components/confetti'\nimport { GeneralErrorBoundary } from './components/error-boundary'\nimport { ExerciseWarningBanner } from './components/exercise-warning-banner'\nimport { KeyboardShortcutsDialog } from './components/keyboard-shortcuts-dialog'\nimport { EpicProgress } from './components/progress-bar'\nimport { EpicToaster } from './components/toaster'\nimport { TooltipProvider } from './components/ui/tooltip'\nimport { UpdateToast } from './components/update-repo'\nimport { Notifications } from './routes/admin+/notifications'\nimport { useTheme } from './routes/theme/index'\nimport { getTheme } from './routes/theme/theme-session.server'\nimport appStylesheetUrl from './styles/app.css?url'\nimport tailwindStylesheetUrl from './styles/tailwind.css?url'\nimport { ClientHintCheck, getHints } from './utils/client-hints'\nimport { getConfetti } from './utils/confetti.server'\nimport { cn, combineHeaders, getDomainUrl, useAltDown } from './utils/misc'\nimport { getPracticePastLessonData } from './utils/practice-past-lesson'\nimport { Presence } from './utils/presence'\nimport { getSentryUser } from './utils/sentry-user'\nimport { getSeoMetaTags } from './utils/seo'\nimport { getToast } from './utils/toast.server'\n\nexport const links: LinksFunction = () => {\n\treturn [\n\t\t{ rel: 'stylesheet', href: '/neogrotesk-font.css' },\n\t\t{\n\t\t\trel: 'stylesheet',\n\t\t\thref: 'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,200;0,300;0,400;0,500;0,600;1,700&display=swap',\n\t\t},\n\t\t{ rel: 'stylesheet', href: tailwindStylesheetUrl },\n\t\t{ rel: 'stylesheet', href: appStylesheetUrl },\n\t\t{\n\t\t\trel: 'icon',\n\t\t\thref: '/favicon.ico',\n\t\t\tsizes: '48x48',\n\t\t},\n\t\t{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },\n\t]\n}\n\nexport const meta: Route.MetaFunction = ({ loaderData }) => {\n\tif (!loaderData) return []\n\n\treturn getSeoMetaTags({\n\t\tinstructor: loaderData.instructor,\n\t\ttitle: loaderData.workshopTitle,\n\t\tdescription: loaderData.workshopSubtitle,\n\t\trequestInfo: loaderData.requestInfo,\n\t})\n}\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tconst timings = makeTimings('rootLoader')\n\tconst workshopConfig = getWorkshopConfig()\n\tconst requestUrl = new URL(request.url)\n\tconst {\n\t\ttitle: workshopTitle,\n\t\tsubtitle: workshopSubtitle,\n\t\tinstructor,\n\t} = workshopConfig\n\n\tconst theme = getTheme(request)\n\tconst { confettiId, headers: confettiHeaders } = getConfetti(request)\n\tconst { toast, headers: toastHeaders } = await getToast(request)\n\tconst isOnlinePromise = checkConnection({ request, timings })\n\n\tconst asyncStuff = await promiseHash({\n\t\tuserId: getUserId({ request }),\n\t\tpreferences: getPreferences(),\n\t\tprogress: getProgress({ timings }).catch((e) => {\n\t\t\tconsole.error('Failed to get progress', e)\n\t\t\tconst emptyProgress: Awaited<ReturnType<typeof getProgress>> = []\n\t\t\treturn emptyProgress\n\t\t}),\n\t\tuser: getUserInfo(),\n\t\tuserHasAccess: userHasAccessToWorkshop({ request, timings }),\n\t\tapps: getApps({ request, timings }),\n\t\trepoUpdates: checkForUpdatesCached(),\n\t\tunmutedNotifications: getUnmutedNotifications(),\n\t\texerciseChanges: checkForExerciseChanges(),\n\t\tloggedInProductHosts: getLoggedInProductHosts(),\n\t\tofflineVideoPlaybackIds: getOfflineVideoPlaybackIds(),\n\t})\n\n\tconst presentUsers = await getPresentUsers({\n\t\trequest,\n\t\ttimings,\n\t})\n\n\t// Filter out repoUpdates if muted\n\tconst mutedNotifications = await getMutedNotifications()\n\tlet repoUpdates = asyncStuff.repoUpdates\n\tif (\n\t\trepoUpdates?.updateNotificationId &&\n\t\tmutedNotifications.includes(repoUpdates.updateNotificationId)\n\t) {\n\t\trepoUpdates = {\n\t\t\t...repoUpdates,\n\t\t\tupdatesAvailable: false,\n\t\t\trepoUpdatesAvailable: false,\n\t\t\tdependenciesNeedInstall: false,\n\t\t}\n\t}\n\n\tconst practicePastLesson = getPracticePastLessonData({\n\t\tprogress: asyncStuff.progress,\n\t\tcurrentPath: requestUrl.pathname,\n\t})\n\n\treturn data(\n\t\t{\n\t\t\t...asyncStuff,\n\t\t\tworkshopConfig,\n\t\t\tworkshopTitle,\n\t\t\tworkshopSubtitle,\n\t\t\tinstructor,\n\t\t\tapps: asyncStuff.apps.map(({ name, fullPath, relativePath }) => ({\n\t\t\t\tname,\n\t\t\t\tfullPath,\n\t\t\t\trelativePath,\n\t\t\t})),\n\t\t\tENV: getEnv(),\n\t\t\tpracticePastLesson,\n\t\t\trequestInfo: {\n\t\t\t\tprotocol: requestUrl.protocol,\n\t\t\t\thostname: requestUrl.hostname,\n\t\t\t\tport: requestUrl.port,\n\t\t\t\torigin: requestUrl.origin,\n\t\t\t\tdomain: getDomainUrl(request),\n\t\t\t\thints: getHints(request),\n\t\t\t\tpath: requestUrl.pathname,\n\t\t\t\tsession: { theme },\n\t\t\t\tseparator: path.sep,\n\t\t\t\tonline: await isOnlinePromise,\n\t\t\t},\n\t\t\ttoast,\n\t\t\tconfettiId,\n\t\t\tpresence: {\n\t\t\t\tusers: presentUsers,\n\t\t\t},\n\t\t\trepoUpdates,\n\t\t\texerciseChanges: asyncStuff.exerciseChanges,\n\t\t\tofflineVideoPlaybackIds: asyncStuff.offlineVideoPlaybackIds,\n\t\t},\n\t\t{\n\t\t\theaders: combineHeaders(\n\t\t\t\ttoastHeaders,\n\t\t\t\tconfettiHeaders,\n\t\t\t\t{ 'Server-Timing': timings.toString() },\n\t\t\t\tasyncStuff.userId?.type === 'cookie.randomId'\n\t\t\t\t\t? { 'Set-Cookie': getSetClientIdCookieHeader(asyncStuff.userId.id) }\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t},\n\t)\n}\n\nfunction Document({\n\tchildren,\n\tenv = {},\n\tclassName,\n\tstyle,\n}: {\n\tchildren: React.ReactNode\n\tenv?: Record<string, unknown>\n\tclassName: string\n\tstyle?: React.CSSProperties\n}) {\n\treturn (\n\t\t<html lang=\"en\" className={className} style={style}>\n\t\t\t<head>\n\t\t\t\t<ClientHintCheck />\n\t\t\t\t<Meta />\n\t\t\t\t<meta charSet=\"utf-8\" />\n\t\t\t\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n\t\t\t\t<Links />\n\t\t\t\t<script\n\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t__html: `window.ENV = ${JSON.stringify(env)}`,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</head>\n\t\t\t<body className=\"bg-background text-foreground scrollbar-thin scrollbar-thumb-scrollbar h-screen-safe\">\n\t\t\t\t{children}\n\t\t\t\t<ScrollRestoration />\n\t\t\t\t<Scripts />\n\t\t\t</body>\n\t\t</html>\n\t)\n}\n\nfunction App() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst navigation = useNavigation()\n\tconst showSpinner = useSpinDelay(navigation.state !== 'idle', {\n\t\tdelay: 400,\n\t\tminDuration: 200,\n\t})\n\tconst altDown = useAltDown()\n\tconst [showKeyboardShortcuts, setShowKeyboardShortcuts] =\n\t\tReact.useState(false)\n\n\tReact.useEffect(() => {\n\t\tconst handleToggle = () => {\n\t\t\tsetShowKeyboardShortcuts((prev) => !prev)\n\t\t}\n\t\twindow.addEventListener('toggle-keyboard-shortcuts', handleToggle)\n\t\treturn () => {\n\t\t\twindow.removeEventListener('toggle-keyboard-shortcuts', handleToggle)\n\t\t}\n\t}, [])\n\n\tReact.useEffect(() => {\n\t\tif (!ENV.EPICSHOP_IS_PUBLISHED) return\n\t\tconst sentryUser = getSentryUser({\n\t\t\tuser: data.user,\n\t\t\tuserId: data.userId,\n\t\t})\n\t\tvoid import('@sentry/react-router')\n\t\t\t.then((Sentry) => {\n\t\t\t\tif (sentryUser) {\n\t\t\t\t\tSentry.setUser(sentryUser)\n\t\t\t\t} else {\n\t\t\t\t\tSentry.setUser(null)\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => {})\n\t}, [data.user, data.userId])\n\n\tconst theme = useTheme()\n\treturn (\n\t\t<Document\n\t\t\tstyle={\n\t\t\t\tdata.preferences?.fontSize\n\t\t\t\t\t? { fontSize: `${data.preferences?.fontSize}px` }\n\t\t\t\t\t: {}\n\t\t\t}\n\t\t\tclassName={cn(\n\t\t\t\t'h-screen-safe antialiased',\n\t\t\t\ttheme,\n\t\t\t\t{ 'cursor-progress': showSpinner },\n\t\t\t\taltDown ? 'alt-down' : null,\n\t\t\t)}\n\t\t\tenv={data.ENV}\n\t\t>\n\t\t\t{data.exerciseChanges &&\n\t\t\t\t!data.preferences?.exerciseWarning?.dismissed && (\n\t\t\t\t\t<ExerciseWarningBanner />\n\t\t\t\t)}\n\t\t\t<Outlet />\n\t\t\t<Confetti id={data.confettiId} />\n\t\t\t<EpicToaster toast={data.toast} />\n\t\t\t<UpdateToast repoUpdates={data.repoUpdates} />\n\t\t\t<EpicProgress />\n\t\t\t<Notifications unmutedNotifications={data.unmutedNotifications} />\n\t\t\t<KeyboardShortcutsDialog\n\t\t\t\topen={showKeyboardShortcuts}\n\t\t\t\tonOpenChange={setShowKeyboardShortcuts}\n\t\t\t/>\n\t\t</Document>\n\t)\n}\n\nexport default function AppWithProviders() {\n\tconst { user } = useLoaderData<typeof loader>()\n\treturn (\n\t\t<Presence user={user}>\n\t\t\t<TooltipProvider>\n\t\t\t\t<App />\n\t\t\t</TooltipProvider>\n\t\t</Presence>\n\t)\n}\n\nexport function ErrorBoundary() {\n\treturn (\n\t\t<Document className=\"h-screen-safe\">\n\t\t\t<GeneralErrorBoundary />\n\t\t</Document>\n\t)\n}\n"],"file":"root-B-MkiU1r.js"}
|