@epic-web/workshop-app 5.1.1 → 5.2.0
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/{_-ZHCWB__B.js → _-CWSCXcBv.js} +2 -2
- package/build/client/assets/{_-ZHCWB__B.js.map → _-CWSCXcBv.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber-BFTlBdr4.js → _exerciseNumber-D6KsriIk.js} +2 -2
- package/build/client/assets/_exerciseNumber-D6KsriIk.js.map +1 -0
- package/build/client/assets/{_exerciseNumber_._stepNumber-_687iGFh.js → _exerciseNumber_._stepNumber-BA2Xhzqs.js} +2 -2
- package/build/client/assets/_exerciseNumber_._stepNumber-BA2Xhzqs.js.map +1 -0
- package/build/client/assets/{_exerciseNumber_.finished-BEfn-nJi.js → _exerciseNumber_.finished-DEzaS_Ji.js} +2 -2
- package/build/client/assets/_exerciseNumber_.finished-DEzaS_Ji.js.map +1 -0
- package/build/client/assets/{_layout-Cfbi6StB.js → _layout-88n0To1b.js} +2 -2
- package/build/client/assets/{_layout-Cfbi6StB.js.map → _layout-88n0To1b.js.map} +1 -1
- package/build/client/assets/{_layout-BriOqd2R.js → _layout-C5yGKUmm.js} +2 -2
- package/build/client/assets/_layout-C5yGKUmm.js.map +1 -0
- package/build/client/assets/{_layout-frPHZWgR.js → _layout-T2hZtl0D.js} +2 -2
- package/build/client/assets/_layout-T2hZtl0D.js.map +1 -0
- package/build/client/assets/{_layout-BLJr2x2F.js → _layout-gyrNluke.js} +2 -2
- package/build/client/assets/_layout-gyrNluke.js.map +1 -0
- package/build/client/assets/{accordion-DuE9VejZ.js → accordion-DC885Li1.js} +2 -2
- package/build/client/assets/{accordion-DuE9VejZ.js.map → accordion-DC885Li1.js.map} +1 -1
- package/build/client/assets/{account-DDuV9rZX.js → account-CPFwPYf1.js} +2 -2
- package/build/client/assets/account-CPFwPYf1.js.map +1 -0
- package/build/client/assets/app-CM8yuYni.js +2 -0
- package/build/client/assets/app-CM8yuYni.js.map +1 -0
- package/build/client/assets/{button-CMkJ8p0a.js → button-DQ001ob0.js} +2 -2
- package/build/client/assets/{button-CMkJ8p0a.js.map → button-DQ001ob0.js.map} +1 -1
- package/build/client/assets/components-9EGYHTc_.js +158 -0
- package/build/client/assets/components-9EGYHTc_.js.map +1 -0
- package/build/client/assets/{diff-B6thd_Sf.js → diff-assn_bSK.js} +2 -2
- package/build/client/assets/{diff-B6thd_Sf.js.map → diff-assn_bSK.js.map} +1 -1
- package/build/client/assets/diff-jlCv3hv0.js +2 -0
- package/build/client/assets/diff-jlCv3hv0.js.map +1 -0
- package/build/client/assets/{discord-C9bVfiZ6.js → discord-CHsbqaqM.js} +2 -2
- package/build/client/assets/discord-CHsbqaqM.js.map +1 -0
- package/build/client/assets/discord-DoeazikD.js +2 -0
- package/build/client/assets/discord-DoeazikD.js.map +1 -0
- package/build/client/assets/entry.client-BTYTUpFV.js +44 -0
- package/build/client/assets/entry.client-BTYTUpFV.js.map +1 -0
- package/build/client/assets/epic-video-GDpD7_Qt.js +3053 -0
- package/build/client/assets/epic-video-GDpD7_Qt.js.map +1 -0
- package/build/client/assets/{error-boundary-BcGxKpte.js → error-boundary-1-dmC941.js} +2 -2
- package/build/client/assets/{error-boundary-BcGxKpte.js.map → error-boundary-1-dmC941.js.map} +1 -1
- package/build/client/assets/{finished-C2dgX1d-.js → finished-DVV0zwmP.js} +2 -2
- package/build/client/assets/finished-DVV0zwmP.js.map +1 -0
- package/build/client/assets/{index-DBrRQJxF.js → index-BCxBKsqT.js} +2 -2
- package/build/client/assets/{index-DBrRQJxF.js.map → index-BCxBKsqT.js.map} +1 -1
- package/build/client/assets/index-BFGhCX_U.js +38 -0
- package/build/client/assets/index-BFGhCX_U.js.map +1 -0
- package/build/client/assets/index-BuA_RWlU.js +2 -0
- package/build/client/assets/index-BuA_RWlU.js.map +1 -0
- package/build/client/assets/index-BuoaxPEj.js +42 -0
- package/build/client/assets/index-BuoaxPEj.js.map +1 -0
- package/build/client/assets/index-CmmC-_8P.js +2 -0
- package/build/client/assets/index-CmmC-_8P.js.map +1 -0
- package/build/client/assets/{index-YtpQLUzj.js → index-DRH72MzK.js} +2 -2
- package/build/client/assets/{index-YtpQLUzj.js.map → index-DRH72MzK.js.map} +1 -1
- package/build/client/assets/{index-CuV1bRbu.js → index-KgMLc41c.js} +2 -2
- package/build/client/assets/index-KgMLc41c.js.map +1 -0
- package/build/client/assets/index-_J-F_Dnc.js +36 -0
- package/build/client/assets/index-_J-F_Dnc.js.map +1 -0
- package/build/client/assets/{loading-Br41_Pbf.js → loading-Dk0n07O3.js} +2 -2
- package/build/client/assets/{loading-Br41_Pbf.js.map → loading-Dk0n07O3.js.map} +1 -1
- package/build/client/assets/{login-kjV7hrVt.js → login-pZYDEC_l.js} +2 -2
- package/build/client/assets/login-pZYDEC_l.js.map +1 -0
- package/build/client/assets/{manifest-b22910a7.js → manifest-c9f53a94.js} +1 -1
- package/build/client/assets/mdx-hW1uYjc1.js +2 -0
- package/build/client/assets/mdx-hW1uYjc1.js.map +1 -0
- package/build/client/assets/misc-BJtHv_Jh.js +2 -0
- package/build/client/assets/misc-BJtHv_Jh.js.map +1 -0
- package/build/client/assets/{nav-chevrons-DYiI8EMU.js → nav-chevrons-CgbSMLeb.js} +2 -2
- package/build/client/assets/{nav-chevrons-DYiI8EMU.js.map → nav-chevrons-CgbSMLeb.js.map} +1 -1
- package/build/client/assets/{onboarding-B4Z_yevk.js → onboarding-DCuSqnkZ.js} +2 -2
- package/build/client/assets/onboarding-DCuSqnkZ.js.map +1 -0
- package/build/client/assets/{pe-CvPIToj6.js → pe-ChIwTk8v.js} +2 -2
- package/build/client/assets/pe-ChIwTk8v.js.map +1 -0
- package/build/client/assets/presence-CdyMdOKk.js +28 -0
- package/build/client/assets/presence-CdyMdOKk.js.map +1 -0
- package/build/client/assets/{preview-DZcdG4kw.js → preview-CW_12I0i.js} +2 -2
- package/build/client/assets/preview-CW_12I0i.js.map +1 -0
- package/build/client/assets/{product-mjsTrqXs.js → product-C1ynnrN_.js} +2 -2
- package/build/client/assets/{product-mjsTrqXs.js.map → product-C1ynnrN_.js.map} +1 -1
- package/build/client/assets/progress-DAB3nDa2.js +2 -0
- package/build/client/assets/progress-DAB3nDa2.js.map +1 -0
- package/build/client/assets/{progress-bar-F8_2mvYp.js → progress-bar-Cj5R4Zk7.js} +2 -2
- package/build/client/assets/{progress-bar-F8_2mvYp.js.map → progress-bar-Cj5R4Zk7.js.map} +1 -1
- package/build/client/assets/{request-info-DGnmXtfj.js → request-info-DCIQLE6H.js} +2 -2
- package/build/client/assets/{request-info-DGnmXtfj.js.map → request-info-DCIQLE6H.js.map} +1 -1
- package/build/client/assets/{revalidation-ws-DcvYvzyj.js → revalidation-ws-DU-PzW-_.js} +2 -2
- package/build/client/assets/{revalidation-ws-DcvYvzyj.js.map → revalidation-ws-DU-PzW-_.js.map} +1 -1
- package/build/client/assets/{root-Cl86OUog.js → root-DojjHZlY.js} +4 -4
- package/build/client/assets/root-DojjHZlY.js.map +1 -0
- package/build/client/assets/set-playground-S_rIwJAa.js +2 -0
- package/build/client/assets/set-playground-S_rIwJAa.js.map +1 -0
- package/build/client/assets/{support-B0E_F4Zh.js → support-BNS-kEhc.js} +2 -2
- package/build/client/assets/{support-B0E_F4Zh.js.map → support-BNS-kEhc.js.map} +1 -1
- package/build/client/assets/tailwind-B5AAMtGC.css +1 -0
- package/build/client/assets/test-CtH75Laz.js +2 -0
- package/build/client/assets/test-CtH75Laz.js.map +1 -0
- package/build/client/assets/{tests-BeAEgPAw.js → tests-CTs57UUU.js} +2 -2
- package/build/client/assets/tests-CTs57UUU.js.map +1 -0
- package/build/client/assets/tooltip-BgynKV2c.js +2 -0
- package/build/client/assets/tooltip-BgynKV2c.js.map +1 -0
- package/build/client/assets/use-event-source-x59d4R2Z.js +2 -0
- package/build/client/assets/use-event-source-x59d4R2Z.js.map +1 -0
- package/build/client/assets/{user-Boua6jiU.js → user-BBryXlM_.js} +2 -2
- package/build/client/assets/{user-Boua6jiU.js.map → user-BBryXlM_.js.map} +1 -1
- package/build/client/assets/{workshop-config-Ce9sSc3I.js → workshop-config-DJY2cXU_.js} +2 -2
- package/build/client/assets/{workshop-config-Ce9sSc3I.js.map → workshop-config-DJY2cXU_.js.map} +1 -1
- package/build/server/index.js +253 -238
- package/build/server/index.js.map +1 -1
- package/dist/server/index.js +7 -14
- package/package.json +68 -73
- package/build/client/assets/_exerciseNumber-BFTlBdr4.js.map +0 -1
- package/build/client/assets/_exerciseNumber_._stepNumber-_687iGFh.js.map +0 -1
- package/build/client/assets/_exerciseNumber_.finished-BEfn-nJi.js.map +0 -1
- package/build/client/assets/_layout-BLJr2x2F.js.map +0 -1
- package/build/client/assets/_layout-BriOqd2R.js.map +0 -1
- package/build/client/assets/_layout-frPHZWgR.js.map +0 -1
- package/build/client/assets/account-DDuV9rZX.js.map +0 -1
- package/build/client/assets/app-wbMCZEiv.js +0 -2
- package/build/client/assets/app-wbMCZEiv.js.map +0 -1
- package/build/client/assets/components-DZ8XIeZ3.js +0 -166
- package/build/client/assets/components-DZ8XIeZ3.js.map +0 -1
- package/build/client/assets/diff-BEk79KPK.js +0 -2
- package/build/client/assets/diff-BEk79KPK.js.map +0 -1
- package/build/client/assets/discord-C9bVfiZ6.js.map +0 -1
- package/build/client/assets/discord-DYeU0QX6.js +0 -2
- package/build/client/assets/discord-DYeU0QX6.js.map +0 -1
- package/build/client/assets/entry.client-CW5CUf_W.js +0 -43
- package/build/client/assets/entry.client-CW5CUf_W.js.map +0 -1
- package/build/client/assets/epic-video-bs7WmhbC.js +0 -2988
- package/build/client/assets/epic-video-bs7WmhbC.js.map +0 -1
- package/build/client/assets/finished-C2dgX1d-.js.map +0 -1
- package/build/client/assets/index-BczhSZ3e.js +0 -2
- package/build/client/assets/index-BczhSZ3e.js.map +0 -1
- package/build/client/assets/index-BjNhezSK.js +0 -42
- package/build/client/assets/index-BjNhezSK.js.map +0 -1
- package/build/client/assets/index-BvihEwfB.js +0 -36
- package/build/client/assets/index-BvihEwfB.js.map +0 -1
- package/build/client/assets/index-C2yr7Uiu.js +0 -2
- package/build/client/assets/index-C2yr7Uiu.js.map +0 -1
- package/build/client/assets/index-CuV1bRbu.js.map +0 -1
- package/build/client/assets/index-DF_XBInP.js +0 -37
- package/build/client/assets/index-DF_XBInP.js.map +0 -1
- package/build/client/assets/login-kjV7hrVt.js.map +0 -1
- package/build/client/assets/mdx-CRxPouxB.js +0 -2
- package/build/client/assets/mdx-CRxPouxB.js.map +0 -1
- package/build/client/assets/misc-BE75ioh8.js +0 -2
- package/build/client/assets/misc-BE75ioh8.js.map +0 -1
- package/build/client/assets/onboarding-B4Z_yevk.js.map +0 -1
- package/build/client/assets/pe-CvPIToj6.js.map +0 -1
- package/build/client/assets/presence-Dd98AJ_5.js +0 -28
- package/build/client/assets/presence-Dd98AJ_5.js.map +0 -1
- package/build/client/assets/preview-DZcdG4kw.js.map +0 -1
- package/build/client/assets/progress-Co-59mG2.js +0 -2
- package/build/client/assets/progress-Co-59mG2.js.map +0 -1
- package/build/client/assets/root-Cl86OUog.js.map +0 -1
- package/build/client/assets/set-playground-pMKmtPtz.js +0 -2
- package/build/client/assets/set-playground-pMKmtPtz.js.map +0 -1
- package/build/client/assets/tailwind-B9pSujyx.css +0 -1
- package/build/client/assets/test-B6zIK2V6.js +0 -2
- package/build/client/assets/test-B6zIK2V6.js.map +0 -1
- package/build/client/assets/tests-BeAEgPAw.js.map +0 -1
- package/build/client/assets/tooltip-6-WS-Xux.js +0 -2
- package/build/client/assets/tooltip-6-WS-Xux.js.map +0 -1
- package/build/client/assets/use-event-source-CCGBLG92.js +0 -2
- package/build/client/assets/use-event-source-CCGBLG92.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"root-Cl86OUog.js","sources":["../../../../../node_modules/@remix-run/react/dist/esm/scroll-restoration.js","../../../../../node_modules/tween-functions/index.js","../../../../../node_modules/confetti-react/dist/confetti-react.esm.js","../../../../../node_modules/remix-utils/build/react/client-only.js","../../../app/components/confetti.tsx","../../../app/components/toaster.tsx","../../../app/styles/app.css?url","../../../app/styles/tailwind.css?url","../../../app/root.tsx"],"sourcesContent":["/**\n * @remix-run/react v2.10.0\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.js';\nimport * as React from 'react';\nimport { useLocation, useMatches, UNSAFE_useScrollRestoration } from 'react-router-dom';\nimport { useRemixContext } from './components.js';\n\nlet STORAGE_KEY = \"positions\";\n\n/**\n * This component will emulate the browser's scroll restoration on location\n * changes.\n *\n * @see https://remix.run/components/scroll-restoration\n */\nfunction ScrollRestoration({\n getKey,\n ...props\n}) {\n let {\n isSpaMode\n } = useRemixContext();\n let location = useLocation();\n let matches = useMatches();\n UNSAFE_useScrollRestoration({\n getKey,\n storageKey: STORAGE_KEY\n });\n\n // In order to support `getKey`, we need to compute a \"key\" here so we can\n // hydrate that up so that SSR scroll restoration isn't waiting on React to\n // hydrate. *However*, our key on the server is not the same as our key on\n // the client! So if the user's getKey implementation returns the SSR\n // location key, then let's ignore it and let our inline <script> below pick\n // up the client side history state key\n let key = React.useMemo(() => {\n if (!getKey) return null;\n let userKey = getKey(location, matches);\n return userKey !== location.key ? userKey : null;\n },\n // Nah, we only need this the first time for the SSR render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []);\n\n // In SPA Mode, there's nothing to restore on initial render since we didn't\n // render anything on the server\n if (isSpaMode) {\n return null;\n }\n let restoreScroll = ((STORAGE_KEY, restoreKey) => {\n if (!window.history.state || !window.history.state.key) {\n let key = Math.random().toString(32).slice(2);\n window.history.replaceState({\n key\n }, \"\");\n }\n try {\n let positions = JSON.parse(sessionStorage.getItem(STORAGE_KEY) || \"{}\");\n let storedY = positions[restoreKey || window.history.state.key];\n if (typeof storedY === \"number\") {\n window.scrollTo(0, storedY);\n }\n } catch (error) {\n console.error(error);\n sessionStorage.removeItem(STORAGE_KEY);\n }\n }).toString();\n return /*#__PURE__*/React.createElement(\"script\", _extends({}, props, {\n suppressHydrationWarning: true,\n dangerouslySetInnerHTML: {\n __html: `(${restoreScroll})(${JSON.stringify(STORAGE_KEY)}, ${JSON.stringify(key)})`\n }\n }));\n}\n\nexport { ScrollRestoration };\n","'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 for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n rest[_key - 1] = arguments[_key];\n }\n\n _this = _Component.call.apply(_Component, [this, props].concat(rest)) || 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 * as React from \"react\";\nimport { useHydrated } from \"./use-hydrated.js\";\n/**\n * Render the children only after the JS has loaded client-side. Use an optional\n * fallback component if the JS is not yet loaded.\n *\n * Example: Render a Chart component if JS loads, renders a simple FakeChart\n * component server-side or if there is no JS. The FakeChart can have only the\n * UI without the behavior or be a loading spinner or skeleton.\n * ```tsx\n * return (\n * <ClientOnly fallback={<FakeChart />}>\n * {() => <Chart />}\n * </ClientOnly>\n * );\n * ```\n */\nexport function ClientOnly({ children, fallback = null }) {\n return useHydrated() ? React.createElement(React.Fragment, null, children()) : React.createElement(React.Fragment, null, fallback);\n}\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 { 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 \"/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__\"","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\tgetDiscordMember,\n\tgetPreferences,\n\tgetUserInfo,\n\treadOnboardingData,\n} from '@epic-web/workshop-utils/db.server'\nimport { getEnv } from '@epic-web/workshop-utils/env.server'\nimport { makeTimings } from '@epic-web/workshop-utils/timing.server'\nimport { cssBundleHref } from '@remix-run/css-bundle'\nimport {\n\tjson,\n\tredirect,\n\ttype HeadersFunction,\n\ttype LinksFunction,\n\ttype LoaderFunctionArgs,\n\ttype MetaFunction,\n} from '@remix-run/node'\nimport {\n\tLinks,\n\tMeta,\n\tOutlet,\n\tScripts,\n\tScrollRestoration,\n\tuseLoaderData,\n\tuseNavigation,\n} from '@remix-run/react'\nimport { promiseHash } from 'remix-utils/promise'\nimport { useSpinDelay } from 'spin-delay'\nimport { Confetti } from './components/confetti.tsx'\nimport { GeneralErrorBoundary } from './components/error-boundary.tsx'\nimport { EpicProgress } from './components/progress-bar.tsx'\nimport { EpicToaster } from './components/toaster.tsx'\nimport { TooltipProvider } from './components/ui/tooltip.tsx'\nimport { useTheme } from './routes/theme/index.tsx'\nimport { getTheme } from './routes/theme/theme-session.server.ts'\nimport appStylesheetUrl from './styles/app.css?url'\nimport tailwindStylesheetUrl from './styles/tailwind.css?url'\nimport { ClientHintCheck, getHints } from './utils/client-hints.tsx'\nimport { getConfetti } from './utils/confetti.server.ts'\nimport { getProgress, userHasAccessToWorkshop } from './utils/epic-api.ts'\nimport { cn, combineHeaders, getDomainUrl, useAltDown } from './utils/misc.tsx'\nimport { Presence } from './utils/presence.tsx'\nimport { getSeoMetaTags } from './utils/seo.ts'\nimport { getToast } from './utils/toast.server.ts'\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...(cssBundleHref ? [{ rel: 'stylesheet', href: cssBundleHref }] : []),\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: MetaFunction<typeof loader> = ({ data }) => {\n\tif (!data) return []\n\n\treturn getSeoMetaTags({\n\t\tinstructor: data.instructor,\n\t\ttitle: data.workshopTitle,\n\t\tdescription: data.workshopSubtitle,\n\t\trequestInfo: data.requestInfo,\n\t})\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('rootLoader')\n\tconst workshopConfig = getWorkshopConfig()\n\tconst {\n\t\ttitle: workshopTitle,\n\t\tsubtitle: workshopSubtitle,\n\t\tinstructor,\n\t\tonboardingVideo,\n\t} = workshopConfig\n\n\tconst onboarding = await readOnboardingData()\n\tif (\n\t\t!ENV.EPICSHOP_DEPLOYED &&\n\t\t!onboarding?.tourVideosWatched.includes(onboardingVideo)\n\t) {\n\t\tif (new URL(request.url).pathname !== '/onboarding') {\n\t\t\tthrow redirect('/onboarding')\n\t\t}\n\t}\n\tconst theme = getTheme(request)\n\tconst { confettiId, headers: confettiHeaders } = getConfetti(request)\n\tconst { toast, headers: toastHeaders } = await getToast(request)\n\n\tconst asyncStuff = await promiseHash({\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\tdiscordMember: getDiscordMember(),\n\t\tuser: getUserInfo(),\n\t\tuserHasAccess: userHasAccessToWorkshop({ request, timings }),\n\t\tapps: getApps({ request, timings }),\n\t})\n\n\tconst presentUsers = await getPresentUsers(asyncStuff.user, {\n\t\trequest,\n\t\ttimings,\n\t})\n\n\treturn json(\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\trequestInfo: {\n\t\t\t\tprotocol: new URL(request.url).protocol,\n\t\t\t\thostname: new URL(request.url).hostname,\n\t\t\t\tport: new URL(request.url).port,\n\t\t\t\torigin: new URL(request.url).origin,\n\t\t\t\tdomain: getDomainUrl(request),\n\t\t\t\thints: getHints(request),\n\t\t\t\tpath: new URL(request.url).pathname,\n\t\t\t\tsession: { theme },\n\t\t\t\tseparator: path.sep,\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},\n\t\t{\n\t\t\theaders: combineHeaders(toastHeaders, confettiHeaders, {\n\t\t\t\t'Server-Timing': timings.toString(),\n\t\t\t}),\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\t'Server-Timing': loaderHeaders.get('Server-Timing') ?? '',\n\t}\n\treturn headers\n}\n\nfunction Document({\n\tchildren,\n\tenv = {},\n\tclassName,\n}: {\n\tchildren: React.ReactNode\n\tenv?: Record<string, unknown>\n\tclassName: string\n}) {\n\treturn (\n\t\t<html lang=\"en\" className={className}>\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\n\tconst theme = useTheme()\n\treturn (\n\t\t<Document\n\t\t\tclassName={cn(\n\t\t\t\t'antialiased h-screen-safe',\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<Outlet />\n\t\t\t<Confetti id={data.confettiId} />\n\t\t\t<EpicToaster toast={data.toast} />\n\t\t\t<EpicProgress />\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"],"names":["STORAGE_KEY","ScrollRestoration","getKey","props","isSpaMode","useRemixContext","location","useLocation","matches","useMatches","UNSAFE_useScrollRestoration","key","React.useMemo","userKey","restoreScroll","restoreKey","storedY","error","React.createElement","_extends","tweenFunctions","b","_c","d","c","a","p","s","v","tweenFunctions_1","_defineProperties","target","i","descriptor","_createClass","Constructor","protoProps","staticProps","source","_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","_len","_key","_extractCanvasProps","passedProps","canvasStyles","Component","Index","_ref","ClientOnly","children","fallback","useHydrated","React.Fragment","id","jsx","ConfettiShower","EpicToaster","toast","jsxs","Fragment","Toaster","ShowToast","type","title","description","useEffect","showToast","appStylesheetUrl","tailwindStylesheetUrl","links","rel","href","sizes","meta","data","getSeoMetaTags","instructor","workshopTitle","workshopSubtitle","requestInfo","Document","env","className","lang","ClientHintCheck","Meta","charSet","name","content","Links","dangerouslySetInnerHTML","__html","JSON","stringify","Scripts","App","useLoaderData","navigation","useNavigation","showSpinner","useSpinDelay","state","delay","minDuration","altDown","useAltDown","theme","useTheme","cn","ENV","Outlet","confettiId","EpicProgress","AppWithProviders","user","Presence","TooltipProvider","ErrorBoundary","GeneralErrorBoundary"],"mappings":"knBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAeA,IAAIA,EAAc,YAQlB,SAASC,GAAkB,CACzB,OAAAC,EACA,GAAGC,CACL,EAAG,CACD,GAAI,CACF,UAAAC,CACD,EAAGC,GAAe,EACfC,EAAWC,IACXC,EAAUC,IACdC,GAA4B,CAC1B,OAAAR,EACA,WAAYF,CAChB,CAAG,EAQD,IAAIW,EAAMC,EAAAA,QAAc,IAAM,CAC5B,GAAI,CAACV,EAAQ,OAAO,KACpB,IAAIW,EAAUX,EAAOI,EAAUE,CAAO,EACtC,OAAOK,IAAYP,EAAS,IAAMO,EAAU,IAC7C,EAGD,CAAA,CAAE,EAIF,GAAIT,EACF,OAAO,KAET,IAAIU,GAAiB,CAACd,EAAae,IAAe,CAChD,GAAI,CAAC,OAAO,QAAQ,OAAS,CAAC,OAAO,QAAQ,MAAM,IAAK,CACtD,IAAIJ,EAAM,KAAK,OAAQ,EAAC,SAAS,EAAE,EAAE,MAAM,CAAC,EAC5C,OAAO,QAAQ,aAAa,CAC1B,IAAAA,CACD,EAAE,EAAE,CACN,CACD,GAAI,CAEF,IAAIK,EADY,KAAK,MAAM,eAAe,QAAQhB,CAAW,GAAK,IAAI,EAC9Ce,GAAc,OAAO,QAAQ,MAAM,GAAG,EAC1D,OAAOC,GAAY,UACrB,OAAO,SAAS,EAAGA,CAAO,CAE7B,OAAQC,EAAO,CACd,QAAQ,MAAMA,CAAK,EACnB,eAAe,WAAWjB,CAAW,CACtC,CACF,GAAE,SAAQ,EACX,OAAoBkB,EAAmB,cAAC,SAAUC,GAAS,CAAA,EAAIhB,EAAO,CACpE,yBAA0B,GAC1B,wBAAyB,CACvB,OAAQ,IAAIW,CAAa,KAAK,KAAK,UAAUd,CAAW,CAAC,KAAK,KAAK,UAAUW,CAAG,CAAC,GAClF,CACF,CAAA,CAAC,CACJ,CC9EA,IAAIS,EAAiB,CACnB,OAAQ,SAAS,EAAGC,EAAGC,EAAIC,EAAG,CAC5B,IAAIC,EAAIF,EAAKD,EACb,OAAOG,EAAI,EAAID,EAAIF,CACpB,EACD,WAAY,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CAChC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,GAAK,GAAKD,GAAK,EAAIF,CAC3B,EACD,YAAa,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,GAAK,GAAKD,IAAM,EAAI,GAAKF,CAClC,EACD,cAAe,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,OAAK,GAAKE,EAAI,GAAK,EACVC,EAAI,EAAI,EAAI,EAAIH,EAEhB,CAACG,EAAI,GAAM,EAAE,GAAM,EAAI,GAAK,GAAKH,CAE3C,EACD,YAAa,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,GAAK,GAAKD,GAAK,EAAI,EAAIF,CAC/B,EACD,aAAc,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CAClC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,IAAM,EAAI,EAAID,EAAI,GAAK,EAAI,EAAI,GAAKF,CAC5C,EACD,eAAgB,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACpC,IAAIC,EAAIF,EAAKD,EACb,OAAK,GAAKE,EAAI,GAAK,EACVC,EAAI,EAAI,EAAI,EAAI,EAAIH,EAEpBG,EAAI,IAAM,GAAK,GAAK,EAAI,EAAI,GAAKH,CAE3C,EACD,YAAa,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,GAAK,GAAKD,GAAK,EAAI,EAAI,EAAIF,CACnC,EACD,aAAc,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CAClC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,IAAM,EAAI,EAAID,EAAI,GAAK,EAAI,EAAI,EAAI,GAAKF,CACjD,EACD,eAAgB,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACpC,IAAIC,EAAIF,EAAKD,EACb,OAAK,GAAKE,EAAI,GAAK,EACVC,EAAI,EAAI,EAAI,EAAI,EAAI,EAAIH,EAExB,CAACG,EAAI,IAAM,GAAK,GAAK,EAAI,EAAI,EAAI,GAAKH,CAEhD,EACD,YAAa,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,GAAK,GAAKD,GAAK,EAAI,EAAI,EAAI,EAAIF,CACvC,EACD,aAAc,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CAClC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,IAAM,EAAI,EAAID,EAAI,GAAK,EAAI,EAAI,EAAI,EAAI,GAAKF,CACpD,EACD,eAAgB,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACpC,IAAIC,EAAIF,EAAKD,EACb,OAAK,GAAKE,EAAI,GAAK,EACVC,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAIH,EAE5BG,EAAI,IAAM,GAAK,GAAK,EAAI,EAAI,EAAI,EAAI,GAAKH,CAEnD,EACD,WAAY,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CAChC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,EAAI,KAAK,IAAI,EAAID,GAAK,KAAK,GAAK,EAAE,EAAIC,EAAIH,CACnD,EACD,YAAa,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,EAAI,KAAK,IAAI,EAAID,GAAK,KAAK,GAAK,EAAE,EAAIF,CAC9C,EACD,cAAe,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,EAAI,GAAK,KAAK,IAAI,KAAK,GAAK,EAAID,CAAC,EAAI,GAAKF,CACnD,EACD,WAAY,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CAChC,IAAIC,EAAIF,EAAKD,EACb,OAAQ,GAAG,EAAKA,EAAIG,EAAI,KAAK,IAAI,EAAG,IAAM,EAAED,EAAI,EAAE,EAAIF,CACvD,EACD,YAAa,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAQ,GAAGE,EAAKF,EAAEG,EAAIA,GAAK,CAAC,KAAK,IAAI,EAAG,IAAM,EAAED,CAAC,EAAI,GAAKF,CAC3D,EACD,cAAe,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,OAAI,IAAM,EACDA,EAEL,IAAME,EACDF,EAAIG,GAER,GAAKD,EAAI,GAAK,EACVC,EAAI,EAAI,KAAK,IAAI,EAAG,IAAM,EAAI,EAAE,EAAIH,EAEpCG,EAAI,GAAK,CAAC,KAAK,IAAI,EAAG,IAAM,EAAE,CAAC,EAAI,GAAKH,CAElD,EACD,WAAY,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CAChC,IAAIC,EAAIF,EAAKD,EACb,MAAO,CAACG,GAAK,KAAK,KAAK,GAAK,GAAKD,GAAK,CAAC,EAAI,GAAKF,CACjD,EACD,YAAa,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACjC,IAAIC,EAAIF,EAAKD,EACb,OAAOG,EAAI,KAAK,KAAK,GAAK,EAAI,EAAID,EAAI,GAAK,CAAC,EAAIF,CACjD,EACD,cAAe,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,OAAK,GAAKE,EAAI,GAAK,EACV,CAACC,EAAI,GAAK,KAAK,KAAK,EAAI,EAAI,CAAC,EAAI,GAAKH,EAEtCG,EAAI,GAAK,KAAK,KAAK,GAAK,GAAK,GAAK,CAAC,EAAI,GAAKH,CAEtD,EACD,cAAe,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACTI,EAAGC,EAAGC,EAIV,OAHAA,EAAI,QACJD,EAAI,EACJD,EAAID,EACA,IAAM,EACDH,GACG,GAAKE,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,IAAM,GAAK,EAAE,EAAI,KAAK,KAAK,EAAIF,EAAII,IAAM,EAAI,KAAK,IAAMD,CAAC,GAAKL,EACxF,EACD,eAAgB,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACpC,IAAIC,EAAIF,EAAKD,EACTI,EAAGC,EAAGC,EAIV,OAHAA,EAAI,QACJD,EAAI,EACJD,EAAID,EACA,IAAM,EACDH,GACG,GAAKE,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,IAAM,CAAC,EAAI,KAAK,KAAK,EAAIF,EAAII,IAAM,EAAI,KAAK,IAAMD,CAAC,EAAIF,EAAIH,EACnF,EACD,iBAAkB,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACtC,IAAIC,EAAIF,EAAKD,EACTI,EAAGC,EAAGC,EAIV,OAHAA,EAAI,QACJD,EAAI,EACJD,EAAID,EACA,IAAM,EACDH,GACG,GAAKE,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,EAErC,EAAI,EACC,KAAQA,EAAI,KAAK,IAAI,EAAG,IAAM,GAAK,EAAE,EAAI,KAAK,KAAK,EAAIF,EAAII,IAAM,EAAI,KAAK,IAAMD,CAAC,GAAKL,EAEtFI,EAAI,KAAK,IAAI,EAAG,KAAO,GAAK,EAAE,EAAI,KAAK,KAAK,EAAIF,EAAII,IAAM,EAAI,KAAK,IAAMD,CAAC,EAAI,GAAMF,EAAIH,EAElG,EACD,WAAY,SAAS,EAAGA,EAAGC,EAAIC,EAAGI,EAAG,CACnC,IAAIH,EAAIF,EAAKD,EACb,OAAIM,IAAM,SACRA,EAAI,SAECH,GAAK,GAAKD,GAAK,IAAMI,EAAI,GAAK,EAAIA,GAAKN,CAC/C,EACD,YAAa,SAAS,EAAGA,EAAGC,EAAIC,EAAGI,EAAG,CACpC,IAAIH,EAAIF,EAAKD,EACb,OAAIM,IAAM,SACRA,EAAI,SAECH,IAAM,EAAI,EAAID,EAAI,GAAK,IAAMI,EAAI,GAAK,EAAIA,GAAK,GAAKN,CAC5D,EACD,cAAe,SAAS,EAAGA,EAAGC,EAAIC,EAAGI,EAAG,CACtC,IAAIH,EAAIF,EAAKD,EAIb,OAHIM,IAAM,SACRA,EAAI,UAED,GAAKJ,EAAI,GAAK,EACVC,EAAI,GAAK,EAAI,KAAOG,GAAK,OAAS,GAAK,EAAIA,IAAMN,EAEjDG,EAAI,IAAM,GAAK,GAAK,KAAOG,GAAK,OAAS,GAAK,EAAIA,GAAK,GAAKN,CAEtE,EACD,aAAc,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CAClC,IAAIC,EAAIF,EAAKD,EACTO,EACJ,OAAAA,EAAIR,EAAe,cAAcG,EAAI,EAAG,EAAGC,EAAGD,CAAC,EACxCC,EAAII,EAAIP,CAChB,EACD,cAAe,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACnC,IAAIC,EAAIF,EAAKD,EACb,OAAK,GAAKE,GAAK,EAAI,KACVC,GAAK,OAAS,EAAI,GAAKH,EACrB,EAAI,EAAI,KACVG,GAAK,QAAU,GAAK,IAAM,MAAQ,EAAI,KAAQH,EAC5C,EAAI,IAAM,KACZG,GAAK,QAAU,GAAK,KAAO,MAAQ,EAAI,OAAUH,EAEjDG,GAAK,QAAU,GAAK,MAAQ,MAAQ,EAAI,SAAYH,CAE9D,EACD,gBAAiB,SAAS,EAAGA,EAAGC,EAAIC,EAAG,CACrC,IAAIC,EAAIF,EAAKD,EACTO,EACJ,OAAI,EAAIL,EAAI,GACVK,EAAIR,EAAe,aAAa,EAAI,EAAG,EAAGI,EAAGD,CAAC,EACvCK,EAAI,GAAMP,IAEjBO,EAAIR,EAAe,cAAc,EAAI,EAAIG,EAAG,EAAGC,EAAGD,CAAC,EAC5CK,EAAI,GAAMJ,EAAI,GAAMH,EAE9B,CACH,EAEAQ,GAAiBT,iBCrPjB,SAASU,GAAkBC,EAAQ5B,EAAO,CACxC,QAAS6B,EAAI,EAAGA,EAAI7B,EAAM,OAAQ6B,IAAK,CACrC,IAAIC,EAAa9B,EAAM6B,CAAC,EACxBC,EAAW,WAAaA,EAAW,YAAc,GACjDA,EAAW,aAAe,GACtB,UAAWA,IAAYA,EAAW,SAAW,IACjD,OAAO,eAAeF,EAAQE,EAAW,IAAKA,CAAU,CACzD,CACH,CAEA,SAASC,GAAaC,EAAaC,EAAYC,EAAa,CAC1D,OAAID,GAAYN,GAAkBK,EAAY,UAAWC,CAAU,EAE5DD,CACT,CAEA,SAAShB,GAAW,CAClB,OAAAA,EAAW,OAAO,QAAU,SAAUY,EAAQ,CAC5C,QAASC,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CACzC,IAAIM,EAAS,UAAUN,CAAC,EAExB,QAASrB,KAAO2B,EACV,OAAO,UAAU,eAAe,KAAKA,EAAQ3B,CAAG,IAClDoB,EAAOpB,CAAG,EAAI2B,EAAO3B,CAAG,EAG7B,CAED,OAAOoB,CACX,EAESZ,EAAS,MAAM,KAAM,SAAS,CACvC,CAEA,SAASoB,GAAeC,EAAUC,EAAY,CAC5CD,EAAS,UAAY,OAAO,OAAOC,EAAW,SAAS,EACvDD,EAAS,UAAU,YAAcA,EAEjCE,EAAgBF,EAAUC,CAAU,CACtC,CAEA,SAASC,EAAgBC,EAAGjB,EAAG,CAC7B,OAAAgB,EAAkB,OAAO,gBAAkB,SAAyBC,EAAGjB,EAAG,CACxE,OAAAiB,EAAE,UAAYjB,EACPiB,CACX,EAESD,EAAgBC,EAAGjB,CAAC,CAC7B,CAEA,SAASkB,GAAcC,EAAS,CAC9B,OAAOA,EAAU,KAAK,GAAK,GAC7B,CACA,SAASC,EAAYC,EAAKC,EAAK,CAC7B,OAAOD,EAAM,KAAK,OAAQ,GAAIC,EAAMD,EACtC,CACA,SAASE,GAAUF,EAAKC,EAAK,CAC3B,OAAO,KAAK,MAAMD,EAAM,KAAK,OAAQ,GAAIC,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,CAAE,EAAC,EAExC,IAAIC,GAEH,SAAUA,EAAmB,CAC5BA,EAAkBA,EAAkB,SAAc,CAAC,EAAI,WACvDA,EAAkBA,EAAkB,SAAc,EAAE,EAAI,UAC1D,GAAGA,IAAsBA,EAAoB,CAAE,EAAC,EAEhD,IAAIC,GAAwB,UAAY,CACtC,SAASA,EAASC,EAASC,EAAYC,EAAGC,EAAG,CAC3C,KAAK,WAAaF,EAElB,IAAIG,EAAmB,KAAK,WAAY,EACpCC,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,SAAWA,EAAO,MAAM,CAAC,EAC7D,KAAK,QAAUZ,EAAY,EAAG,CAAC,EAC/B,KAAK,kBAAoBA,EAAY,EAAG,CAAC,EAAIK,EAAkB,SAAWA,EAAkB,QAC7F,CAED,IAAIU,EAAST,EAAS,UAEtB,OAAAS,EAAO,OAAS,UAAkB,CAChC,IAAIC,EAAoB,KAAK,WAAY,EACrCC,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,OACb,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,YACb,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,YACb,KAAK,QAAQ,IAAI,EAAG,EAAG,KAAK,OAAQ,EAAG,EAAI,KAAK,EAAE,EAClD,KAAK,QAAQ,OACb,KACD,CAEH,KAAKA,EAAc,OACjB,CACE,KAAK,QAAQ,SAAS,CAAC,KAAK,EAAI,EAAG,CAAC,KAAK,EAAI,EAAG,KAAK,EAAG,KAAK,CAAC,EAC9D,KACD,CAEH,KAAKA,EAAc,MACjB,CACE,KAAK,QAAQ,SAAS,CAAC,KAAK,EAAI,EAAG,CAAC,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,CAAC,EAClE,KACD,CAEH,QAEI,MAAM,IAAI,MAAM,6BAA6B,CAElD,CAGH,KAAK,QAAQ,YACb,KAAK,QAAQ,SACjB,EAESE,CACT,IAEIiB,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,MAC1B,KAAK,UAAY,GACjB,KAAK,mBAAqB,EAE1B,KAAK,iBAAmB,SAAUvC,EAAG,CACnCuC,EAAM,UAAU,OAAOvC,EAAG,CAAC,CAC/B,EAEE,KAAK,YAAc,UAAY,CAC7B,IAAIwC,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,CACnF,EAEE,KAAK,QAAU,UAAY,CACzB,IAAIH,EAASC,EAAM,OACflB,EAAUkB,EAAM,QAChBG,EAAqBH,EAAM,mBAC3BI,EAAqBJ,EAAM,mBAE3Bd,EAAmBc,EAAM,WAAY,EACrCK,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,EAEzCnD,EAAI,EAAGA,EAAIwD,EAAUxD,GAAK,EACjCuC,EAAM,UAAU,KAAKA,EAAM,YAAa,CAAA,EAG1CA,EAAM,oBAAsBiB,CAC7B,CAED,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,SAAU7C,EAAGM,EAAG,CAEtCN,EAAE,OAAM,GAEJA,EAAE,EAAI4C,EAAO,QAAU5C,EAAE,EAAI,MAAQA,EAAE,EAAI4C,EAAO,MAAQ,KAAO5C,EAAE,EAAI,QACrEmD,GAAWM,GAAeL,EAE5BP,EAAM,UAAUvC,CAAC,EAAIuC,EAAM,YAAW,EAEtCA,EAAM,iBAAiBvC,CAAC,EAGlC,CAAK,EAEMkD,EAAK,GAAKC,EAAcL,CACnC,EAEE,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,GAAwB,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,CACJ,CACT,EACMA,EAAM,SAAWpD,EAAS,CAAA,EAAI2E,EAA0BJ,EAAkBG,CAAI,EAC9E,OAAO,OAAOtB,EAAOsB,EAAK,cAAc,CAC9C,EAEI,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,GAE7B,EAEI,KAAK,MAAQ,UAAY,CACnBA,EAAM,WAAaA,EAAM,UAAU,mBAAqB,IAC1DA,EAAM,UAAU,mBAAqB,EACrCA,EAAM,UAAU,UAAY,GAC5BA,EAAM,UAAU,mBAAqB,EAE7C,EAEI,KAAK,KAAO,UAAY,CACtBA,EAAM,QAAU,CACd,IAAK,EACb,EAEUA,EAAM,QACR,qBAAqBA,EAAM,KAAK,EAChCA,EAAM,MAAQ,OAEtB,EAEI,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,OACnB,CAAK,EACD,KAAK,QAAUsB,EACf,KAAK,OAAM,CACZ,CAED,OAAA3D,GAAa0D,EAAU,CAAC,CACtB,IAAK,UACL,IAAK,UAAe,CAClB,OAAO,KAAK,QACb,EACD,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,CAEd,CACF,CAAA,CAAC,EAEKL,CACT,IAEIO,EAAmBC,EAAM,YAE7B,SAASC,EAAmBlG,EAAO,CACjC,IAAImG,EAAkB,CAAA,EAClBC,EAAO,CAAA,EACPC,EAAO,CAAA,EACPC,EAAqB,CAAA,EAAG,OAAO,OAAO,KAAKf,CAAgB,EAAG,CAAC,iBAAkB,YAAa,oBAAoB,CAAC,EACnHgB,EAAW,CAAC,WAAW,EAC3B,cAAO,KAAKvG,CAAK,EAAE,QAAQ,SAAUwG,EAAM,CACzC,IAAIC,EAAMzG,EAAMwG,CAAI,EAEhBF,EAAmB,SAASE,CAAI,EAClCL,EAAgBK,CAAI,EAAIC,EACfF,EAAS,SAASC,CAAI,EAC/BD,EAASC,CAAI,EAAIC,EAEjBJ,EAAKG,CAAI,EAAIC,CAEnB,CAAG,EACM,CAACN,EAAiBE,EAAMD,CAAI,CACrC,CAEA,IAAIM,EAAqC,SAAUC,EAAY,CAC7DvE,GAAesE,EAAuBC,CAAU,EAEhD,SAASD,EAAsB1G,EAAO,CAGpC,QAFIoE,EAEKwC,EAAO,UAAU,OAAQP,EAAO,IAAI,MAAMO,EAAO,EAAIA,EAAO,EAAI,CAAC,EAAGC,EAAO,EAAGA,EAAOD,EAAMC,IAClGR,EAAKQ,EAAO,CAAC,EAAI,UAAUA,CAAI,EAGjC,OAAAzC,EAAQuC,EAAW,KAAK,MAAMA,EAAY,CAAC,KAAM3G,CAAK,EAAE,OAAOqG,CAAI,CAAC,GAAK,KACzEjC,EAAM,OAAS6B,EAAM,YACrB7B,EAAM,OAASpE,EAAM,WAAagG,EAC3B5B,CACR,CAED,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,CACvD,CACL,EAEEhC,EAAO,mBAAqB,UAA8B,CACxD,IAAIyC,EAAkBD,EAAmB,KAAK,KAAK,EAAE,CAAC,EAElD,KAAK,WACP,KAAK,SAAS,QAAUC,EAE9B,EAEEzC,EAAO,qBAAuB,UAAgC,CACxD,KAAK,UACP,KAAK,SAAS,OAGhB,KAAK,SAAW,MACpB,EAEEA,EAAO,OAAS,UAAkB,CAChC,IAAIoD,EAAsBZ,EAAmB,KAAK,KAAK,EACnDC,EAAkBW,EAAoB,CAAC,EACvCC,EAAcD,EAAoB,CAAC,EAEnCE,EAAehG,EAAS,CAC1B,OAAQ,EACR,SAAU,WACV,cAAe,OACf,IAAK,EACL,KAAM,EACN,OAAQ,EACR,MAAO,CACb,EAAO+F,EAAY,KAAK,EAEpB,OAAOd,EAAM,cAAc,SAAU,OAAO,OAAO,CACjD,MAAOE,EAAgB,MACvB,OAAQA,EAAgB,OACxB,IAAK,KAAK,MACX,EAAEY,EAAa,CACd,MAAOC,CACR,CAAA,CAAC,CACN,EAESN,CACT,EAAEO,EAAS,SAAA,EAEXP,EAAsB,aAA4B1F,EAAS,CAAE,EAAEuE,CAAgB,EAC/EmB,EAAsB,YAAc,gBAEpC,IAAIQ,GAAqBjB,EAAM,WAAW,SAAUjG,EAAOmH,EAAM,CAC/D,OAAOlB,EAAM,cAAcS,EAAuB,OAAO,OAAO,CAC9D,UAAWV,CACf,EAAKhG,CAAK,CAAC,CACX,CAAC,EC/dM,SAASoH,GAAW,CAAE,SAAAC,EAAU,SAAAC,EAAW,IAAI,EAAI,CACtD,OAAOC,EAAa,EAAGxG,gBAAoByG,EAAAA,SAAgB,KAAMH,GAAU,EAAItG,gBAAoByG,EAAAA,SAAgB,KAAMF,CAAQ,CACrI,CChBgB,SAAA7B,GAAS,CAAE,GAAAgC,GAA8B,CACpD,OAACA,EAGJC,MAACN,IACC,SACA,IAAAM,EAAA,IAACC,GAAA,CAEA,IAAK,EAAQF,EACb,QAAS,GACT,eAAgB,IAChB,MAAO,OAAO,WACd,OAAQ,OAAO,WAAA,EALVA,CAQR,CAAA,CAAA,EAde,IAgBjB,CChBgB,SAAAG,GAAY,CAAE,MAAAC,GAAmC,CAChE,OAEEC,EAAA,KAAAC,WAAA,CAAA,SAAA,CAAAL,EAAA,IAACM,EAAQ,CAAA,YAAW,GAAC,SAAS,aAAa,EAC1CH,EAAQH,EAAAA,IAACO,GAAU,CAAA,MAAAJ,CAAA,CAAc,EAAK,IACxC,CAAA,CAAA,CAEF,CAEA,SAASI,GAAU,CAAE,MAAAJ,GAA2B,CAC/C,KAAM,CAAE,GAAAJ,EAAI,KAAAS,EAAM,MAAAC,EAAO,YAAAC,GAAgBP,EACzCQ,OAAAA,EAAAA,UAAU,IAAM,CACf,WAAW,IAAM,CAChBC,GAAUJ,CAAI,EAAEC,EAAO,CAAE,GAAAV,EAAI,YAAAW,EAAa,GACxC,CAAC,GACF,CAACA,EAAaX,EAAIU,EAAOD,CAAI,CAAC,EAC1B,IACR,CCrBqG,MAAeK,GAAA,2BCAKC,GAAA,gCCiD5GC,GAAuBA,IAC5B,CACN,CAAEC,IAAK,aAAcC,KAAM,sBAAuB,EAClD,CACCD,IAAK,aACLC,KAAM,mHACP,EACA,CAAED,IAAK,aAAcC,KAAMH,EAAsB,EACjD,CAAEE,IAAK,aAAcC,KAAMJ,EAAiB,EAE5C,CACCG,IAAK,OACLC,KAAM,eACNC,MAAO,OACR,EACA,CAAEF,IAAK,OAAQR,KAAM,gBAAiBS,KAAM,cAAe,CAAA,EAIhDE,GAAoCA,CAAC,CAAEC,KAAAA,CAAK,IACnDA,EAEEC,GAAe,CACrBC,WAAYF,EAAKE,WACjBb,MAAOW,EAAKG,cACZb,YAAaU,EAAKI,iBAClBC,YAAaL,EAAKK,WACnB,CAAC,EAPiB,GAiGnB,SAASC,EAAS,CACjB/B,SAAAA,EACAgC,IAAAA,EAAM,CAAC,EACPC,UAAAA,CACD,EAIG,CACF,OACExB,EAAAA,KAAA,OAAA,CAAKyB,KAAK,KAAKD,UAAAA,EACfjC,SAAA,CAAAS,EAAA,KAAC,OACA,CAAAT,SAAA,CAAAK,EAAAA,IAAC8B,GAAgB,EAAA,QAChBC,GAAK,CAAA,CAAA,EACN/B,EAAA,IAAC,OAAK,CAAAgC,QAAQ,OAAQ,CAAA,EACrBhC,EAAA,IAAA,OAAA,CAAKiC,KAAK,WAAWC,QAAQ,oCAAqC,CAAA,QAClEC,GAAM,CAAA,CAAA,EACPnC,EAAAA,IAAC,SAAA,CACAoC,wBAAyB,CACxBC,OAAQ,gBAAgBC,KAAKC,UAAUZ,CAAG,CAAC,EAC5C,CAAA,CACD,CAAA,CACD,CAAA,EACAvB,EAAA,KAAC,OAAK,CAAAwB,UAAU,uFACdjC,SAAA,CAAAA,QACAvH,GAAkB,CAAA,CAAA,QAClBoK,GAAQ,CAAA,CAAA,CAAA,CACV,CAAA,CAAA,CACD,CAAA,CAEF,CAEA,SAASC,IAAM,CACd,MAAMrB,EAAOsB,IACPC,EAAaC,IACbC,EAAcC,EAAA,aAAaH,EAAWI,QAAU,OAAQ,CAC7DC,MAAO,IACPC,YAAa,GACd,CAAC,EACKC,EAAUC,IAEVC,EAAQC,KAEb,OAAAjD,EAAAA,KAACsB,EAAA,CACAE,UAAW0B,EACV,4BACAF,EACA,CAAE,kBAAmBP,CAAY,EACjCK,EAAU,WAAa,IACxB,EACAvB,IAAKP,EAAKmC,IAEV5D,SAAA,CAAAK,EAAAA,IAACwD,EAAO,CAAA,CAAA,EACPxD,EAAA,IAAAjC,GAAA,CAASgC,GAAIqB,EAAKqC,UAAY,CAAA,EAC9BzD,EAAA,IAAAE,GAAA,CAAYC,MAAOiB,EAAKjB,KAAO,CAAA,QAC/BuD,EAAa,CAAA,CAAA,CAAA,CAAA,CACf,CAEF,CAEA,SAAwBC,IAAmB,CACpC,KAAA,CAAEC,KAAAA,CAAK,EAAIlB,EAA6B,EAE7C,OAAA1C,EAAAA,IAAC6D,IAASD,KAAAA,EACTjE,SAAAK,EAAA,IAAC8D,IACAnE,SAACK,EAAAA,IAAAyC,GAAA,EAAI,EACN,CACD,CAAA,CAEF,CAEO,SAASsB,IAAgB,CAC/B,aACErC,EAAS,CAAAE,UAAU,gBACnBjC,SAAAK,EAAAA,IAACgE,IAAqB,CACvB,CAAA,CAEF","x_google_ignoreList":[0,1,2,3]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./index-DF_XBInP.js";import{R as m,T as p,V as x,I as h,P as f,C as j,S as g,a as y,G as N,L as b,b as S,c as w,d as P,e as v}from"./index-BczhSZ3e.js";import{I as l,c}from"./misc-BE75ioh8.js";import{s as I}from"./progress-bar-F8_2mvYp.js";import{S as C}from"./tooltip-6-WS-Xux.js";import{u as T}from"./pe-CvPIToj6.js";import{a as u}from"./components-DZ8XIeZ3.js";function k({appName:t,reset:r=!1,tooltipText:a,...n}){var i;const s=u(),d=T(),o=e.jsx("button",{type:"submit",...n,className:c(n.className,s.state!=="idle"?"cursor-progress":null,((i=s.data)==null?void 0:i.status)==="error"?"cursor-not-allowed":null)});return e.jsxs(s.Form,{action:"/set-playground",method:"POST",className:"inline-flex items-center justify-center",children:[d,e.jsx("input",{type:"hidden",name:"appName",value:t}),r?e.jsx("input",{type:"hidden",name:"reset",value:"true"}):null,I,a?e.jsx(C,{content:a,children:o}):o]})}function U({playgroundAppName:t,allApps:r}){var n;const a=u();return e.jsxs(m,{name:"appName",value:t,onValueChange:s=>{a.submit({appName:s},{method:"POST",action:"/set-playground"})},children:[e.jsxs(p,{"aria-label":"Select app for playground",className:c("flex h-full w-full items-center justify-between text-left radix-placeholder:text-gray-500 focus-visible:outline-none",a.state!=="idle"?"cursor-progress":null,((n=a.data)==null?void 0:n.status)==="error"?"cursor-not-allowed":null),children:[e.jsx("span",{className:"w-80 flex-1 overflow-hidden text-ellipsis whitespace-nowrap scrollbar-thin scrollbar-thumb-scrollbar",children:e.jsx(x,{placeholder:"Select current app",className:"inline-block w-40 text-ellipsis"})}),e.jsx(h,{children:e.jsx(l,{name:"TriangleDownSmall"})})]}),e.jsx(f,{children:e.jsxs(j,{position:"popper",align:"start",className:"z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]",children:[e.jsx(g,{className:"flex h-5 cursor-default items-center justify-center ",children:e.jsx(l,{name:"ChevronUp"})}),e.jsx(y,{className:"p-3",children:e.jsxs(N,{children:[e.jsx(b,{className:"px-5 pb-3 font-mono uppercase",children:"App"}),r.filter(s=>s.name!=="playground").map(s=>e.jsx(E,{value:s.name,children:s.displayName},s.name))]})}),e.jsx(S,{className:"flex h-5 cursor-default items-center justify-center ",children:e.jsx(l,{name:"ChevronDown"})})]})})]})}function E({value:t,children:r}){return e.jsxs(w,{value:t,className:"relative flex cursor-pointer select-none items-center rounded px-10 py-2 leading-none opacity-80 radix-disabled:text-red-500 radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100",children:[e.jsx(P,{children:r}),e.jsx(v,{className:"absolute left-0 inline-flex w-[25px] items-center justify-center",children:e.jsx(l,{name:"CheckSmall"})})]})}function A({appName:t}){return ENV.EPICSHOP_DEPLOYED?null:e.jsx(k,{appName:t,tooltipText:"Playground is not set to the right app. Click to set Playground.",children:e.jsxs("span",{className:"flex items-center justify-center gap-1 text-foreground-danger hover:underline",children:[e.jsx(l,{name:"Unlinked",className:"animate-ping"})," ",e.jsx("span",{className:"uppercase",children:"Set to Playground"})]})})}export{U as P,A as S,k as a};
|
|
2
|
-
//# sourceMappingURL=set-playground-pMKmtPtz.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"set-playground-pMKmtPtz.js","sources":["../../../app/routes/set-playground.tsx"],"sourcesContent":["import {\n\tgetAppByName,\n\tgetApps,\n\tisPlaygroundApp,\n\tisProblemApp,\n\tisSolutionApp,\n\tsetPlayground,\n} from '@epic-web/workshop-utils/apps.server'\nimport * as Select from '@radix-ui/react-select'\nimport { json, type ActionFunctionArgs } from '@remix-run/node'\nimport { useFetcher } from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport { z } from 'zod'\nimport { Icon } from '#app/components/icons.tsx'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { getDiffCode } from '#app/utils/diff.server.ts'\nimport { ensureUndeployed, getErrorMessage } from '#app/utils/misc.tsx'\nimport { jsonWithPE, usePERedirectInput } from '#app/utils/pe.js'\nimport { createToastHeaders } from '#app/utils/toast.server.ts'\n\nconst SetPlaygroundSchema = z.object({\n\tappName: z.string(),\n\treset: z\n\t\t.string()\n\t\t.nullable()\n\t\t.optional()\n\t\t.transform((v) => v === 'true'),\n})\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst rawData = {\n\t\tappName: formData.get('appName'),\n\t\tredirectTo: formData.get('redirectTo'),\n\t}\n\tconst result = SetPlaygroundSchema.safeParse(rawData)\n\tif (!result.success) {\n\t\treturn jsonWithPE(\n\t\t\tformData,\n\t\t\t{ status: 'error', error: result.error.message } as const,\n\t\t\t{ status: 400 },\n\t\t)\n\t}\n\tconst form = result.data\n\tconst app = await getAppByName(form.appName)\n\tif (!app) {\n\t\treturn jsonWithPE(\n\t\t\tformData,\n\t\t\t{ status: 'error', error: `App ${form.appName} not found` } as const,\n\t\t\t{ status: 404 },\n\t\t)\n\t}\n\tconst converseApp =\n\t\tisProblemApp(app) && app.solutionName\n\t\t\t? await getAppByName(app.solutionName)\n\t\t\t: isSolutionApp(app) && app.problemName\n\t\t\t\t? await getAppByName(app.problemName)\n\t\t\t\t: undefined\n\ttry {\n\t\tawait setPlayground(app.fullPath, { reset: form.reset })\n\t} catch (error: unknown) {\n\t\tconst message = getErrorMessage(error)\n\t\tconsole.error('Error setting playground', message)\n\t\treturn json({ status: 'error', error: message } as const, {\n\t\t\tstatus: 500,\n\t\t\theaders: await createToastHeaders({\n\t\t\t\ttype: 'error',\n\t\t\t\ttitle: 'Error',\n\t\t\t\tdescription:\n\t\t\t\t\t'There was an error setting the playground. Check the terminal for details.',\n\t\t\t}),\n\t\t})\n\t}\n\tconst apps = await getApps({ forceFresh: true })\n\tconst playground = apps.find(isPlaygroundApp)\n\tif (playground && converseApp) {\n\t\tvoid getDiffCode(playground, converseApp, { forceFresh: true })\n\t}\n\treturn jsonWithPE(formData, { status: 'success' } as const)\n}\n\nexport function SetPlayground({\n\tappName,\n\treset = false,\n\ttooltipText,\n\t...buttonProps\n}: {\n\tappName: string\n\ttooltipText?: string\n\treset?: boolean\n} & React.ComponentProps<'button'>) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\n\tconst submitButton = (\n\t\t<button\n\t\t\ttype=\"submit\"\n\t\t\t{...buttonProps}\n\t\t\tclassName={clsx(\n\t\t\t\tbuttonProps.className,\n\t\t\t\tfetcher.state !== 'idle' ? 'cursor-progress' : null,\n\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t)}\n\t\t/>\n\t)\n\treturn (\n\t\t<fetcher.Form\n\t\t\taction=\"/set-playground\"\n\t\t\tmethod=\"POST\"\n\t\t\tclassName=\"inline-flex items-center justify-center\"\n\t\t>\n\t\t\t{peRedirectInput}\n\t\t\t<input type=\"hidden\" name=\"appName\" value={appName} />\n\t\t\t{reset ? <input type=\"hidden\" name=\"reset\" value=\"true\" /> : null}\n\t\t\t{showProgressBarField}\n\t\t\t{tooltipText ? (\n\t\t\t\t<SimpleTooltip content={tooltipText}>{submitButton}</SimpleTooltip>\n\t\t\t) : (\n\t\t\t\tsubmitButton\n\t\t\t)}\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function PlaygroundChooser({\n\tplaygroundAppName,\n\tallApps,\n}: {\n\tplaygroundAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\treturn (\n\t\t<Select.Root\n\t\t\tname=\"appName\"\n\t\t\tvalue={playgroundAppName}\n\t\t\tonValueChange={(appName) => {\n\t\t\t\tfetcher.submit(\n\t\t\t\t\t{ appName },\n\t\t\t\t\t{ method: 'POST', action: '/set-playground' },\n\t\t\t\t)\n\t\t\t}}\n\t\t>\n\t\t\t<Select.Trigger\n\t\t\t\taria-label=\"Select app for playground\"\n\t\t\t\tclassName={clsx(\n\t\t\t\t\t'flex h-full w-full items-center justify-between text-left radix-placeholder:text-gray-500 focus-visible:outline-none',\n\t\t\t\t\tfetcher.state !== 'idle' ? 'cursor-progress' : null,\n\t\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span className=\"w-80 flex-1 overflow-hidden text-ellipsis whitespace-nowrap scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t<Select.Value\n\t\t\t\t\t\tplaceholder=\"Select current app\"\n\t\t\t\t\t\tclassName=\"inline-block w-40 text-ellipsis\"\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t\t<Select.Icon>\n\t\t\t\t\t<Icon name=\"TriangleDownSmall\" />\n\t\t\t\t</Select.Icon>\n\t\t\t</Select.Trigger>\n\t\t\t<Select.Portal>\n\t\t\t\t<Select.Content\n\t\t\t\t\tposition=\"popper\"\n\t\t\t\t\talign=\"start\"\n\t\t\t\t\tclassName=\"z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]\"\n\t\t\t\t>\n\t\t\t\t\t<Select.ScrollUpButton className=\"flex h-5 cursor-default items-center justify-center \">\n\t\t\t\t\t\t<Icon name=\"ChevronUp\" />\n\t\t\t\t\t</Select.ScrollUpButton>\n\t\t\t\t\t<Select.Viewport className=\"p-3\">\n\t\t\t\t\t\t<Select.Group>\n\t\t\t\t\t\t\t<Select.Label className=\"px-5 pb-3 font-mono uppercase\">\n\t\t\t\t\t\t\t\tApp\n\t\t\t\t\t\t\t</Select.Label>\n\t\t\t\t\t\t\t{allApps\n\t\t\t\t\t\t\t\t.filter((app) => app.name !== 'playground')\n\t\t\t\t\t\t\t\t.map((app) => {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<SelectItem key={app.name} value={app.name}>\n\t\t\t\t\t\t\t\t\t\t\t{app.displayName}\n\t\t\t\t\t\t\t\t\t\t</SelectItem>\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</Select.Group>\n\t\t\t\t\t</Select.Viewport>\n\t\t\t\t\t<Select.ScrollDownButton className=\"flex h-5 cursor-default items-center justify-center \">\n\t\t\t\t\t\t<Icon name=\"ChevronDown\" />\n\t\t\t\t\t</Select.ScrollDownButton>\n\t\t\t\t</Select.Content>\n\t\t\t</Select.Portal>\n\t\t</Select.Root>\n\t)\n}\n\nfunction SelectItem({\n\tvalue,\n\tchildren,\n}: {\n\tvalue: string\n\tchildren: React.ReactNode\n}) {\n\treturn (\n\t\t<Select.Item\n\t\t\tvalue={value}\n\t\t\tclassName=\"relative flex cursor-pointer select-none items-center rounded px-10 py-2 leading-none opacity-80 radix-disabled:text-red-500 radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100\"\n\t\t>\n\t\t\t<Select.ItemText>{children}</Select.ItemText>\n\t\t\t<Select.ItemIndicator className=\"absolute left-0 inline-flex w-[25px] items-center justify-center\">\n\t\t\t\t<Icon name=\"CheckSmall\" />\n\t\t\t</Select.ItemIndicator>\n\t\t</Select.Item>\n\t)\n}\n\nexport function SetAppToPlayground({ appName }: { appName: string }) {\n\tif (ENV.EPICSHOP_DEPLOYED) return null\n\treturn (\n\t\t<SetPlayground\n\t\t\tappName={appName}\n\t\t\ttooltipText=\"Playground is not set to the right app. Click to set Playground.\"\n\t\t>\n\t\t\t<span className=\"flex items-center justify-center gap-1 text-foreground-danger hover:underline\">\n\t\t\t\t<Icon name=\"Unlinked\" className=\"animate-ping\" />{' '}\n\t\t\t\t<span className=\"uppercase\">Set to Playground</span>\n\t\t\t</span>\n\t\t</SetPlayground>\n\t)\n}\n"],"names":["SetPlayground","appName","reset","tooltipText","buttonProps","fetcher","useFetcher","peRedirectInput","usePERedirectInput","submitButton","jsx","type","className","clsx","state","data","status","jsxs","Form","action","method","children","name","value","showProgressBarField","SimpleTooltip","content","PlaygroundChooser","playgroundAppName","allApps","Select","onValueChange","submit","placeholder","Icon","position","align","filter","app","map","SelectItem","displayName","SetAppToPlayground","ENV","EPICSHOP_DEPLOYED"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e5e5}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#a3a3a3}input::placeholder,textarea::placeholder{opacity:1;color:#a3a3a3}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*{scrollbar-color:initial;scrollbar-width:initial}:root,.dark .invert-theme,.dark .invert-theme .invert-theme .invert-theme{--font-sans: Neogrotesk;--font-mono: IBM Plex Mono;--background: 0 0% 100%;--foreground: 0 0% 0%;--foreground-danger: 345 82.7% 40.8%;--highlight: 220 85% 60%;--muted: 210 40% 96.1%;--muted-foreground: 215.4 16.3% 46.9%;--scrollbar: #e5e5e5;--popover: 0 0% 100%;--popover-foreground: 222.2 47.4% 11.2%;--card: 0 0% 100%;--card-foreground: 222.2 47.4% 11.2%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--primary: 224 71% 4%;--primary-foreground: 213 31% 91%;--secondary: 210 40% 96.1%;--secondary-foreground: 222.2 47.4% 11.2%;--accent: 210 40% 96.1%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 100% 50%;--destructive-foreground: 210 40% 98%;--ring: 215 20.2% 65.1%;--radius: .5rem}.dark,.light .invert-theme,.light .invert-theme .invert-theme .invert-theme{--background: 230 16% 14%;--foreground: 230 20% 96%;--foreground-danger: -4 68% 52%;--highlight: 220 90% 75%;--muted: 223 47% 11%;--muted-foreground: 215.4 16.3% 56.9%;--scrollbar: #3a3a3a;--popover: 224 71% 4%;--popover-foreground: 215 20.2% 65.1%;--card: 224 71% 4%;--card-foreground: 213 31% 91%;--border: 230 6% 30%;--input: 216 34% 17%;--primary: 0 0% 100%;--primary-foreground: 222.2 47.4% 11.2%;--secondary: 222.2 47.4% 11.2%;--secondary-foreground: 210 40% 98%;--accent: 216 34% 17%;--accent-foreground: 210 40% 98%;--destructive: 0 63% 31%;--destructive-foreground: 210 40% 98%;--ring: 216 34% 17%;--radius: .5rem}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-feature-settings:"rlig" 1,"calt" 1}html,body{height:-webkit-fill-available}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%;margin-right:auto;margin-left:auto;padding-right:2rem;padding-left:2rem}@media (min-width: 1400px){.container{max-width:1400px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%),0 3px rgb(var(--tw-prose-kbd-shadows) / 10%);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;text-align:start;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: 17 24 39;--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: 255 255 255;--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose :where(.prose>ul>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:unset}.prose :where(.prose>ul>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:unset}.prose :where(.prose>ol>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:unset}.prose :where(.prose>ol>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:unset}.prose :where(*):not(:where([class~=not-prose],[class~=not-prose] *)){color:hsl(var(--foreground))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.bottom-5{bottom:1.25rem}.left-0{left:0}.left-\[50\%\]{left:50%}.right-0{right:0}.right-3{right:.75rem}.right-4{right:1rem}.right-5{right:1.25rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-1{grid-column:span 1 / span 1}.row-span-1{grid-row:span 1 / span 1}.m-0{margin:0}.m-2{margin:.5rem}.m-5{margin:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.box-content{box-sizing:content-box}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.aspect-video{aspect-ratio:16 / 9}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-28{height:7rem}.h-3{height:.75rem}.h-36{height:9rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[0\.20rem\]{height:.2rem}.h-\[1em\]{height:1em}.h-\[32px\]{height:32px}.h-\[calc\(100vh-128px-env\(safe-area-inset-top\)-env\(safe-area-inset-bottom\)\)\]{height:calc(100vh - 128px - env(safe-area-inset-top) - env(safe-area-inset-bottom))}.h-\[calc\(100vh-64px-env\(safe-area-inset-top\)-env\(safe-area-inset-bottom\)\)\]{height:calc(100vh - 64px - env(safe-area-inset-top) - env(safe-area-inset-bottom))}.h-\[unset\]{height:unset}.h-full{height:100%}.max-h-48{max-height:12rem}.max-h-72{max-height:18rem}.max-h-\[50vh\]{max-height:50vh}.min-h-14{min-height:3.5rem}.min-h-96{min-height:24rem}.min-h-\[420px\]{min-height:420px}.min-h-full{min-height:100%}.w-0{width:0px}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-28{width:7rem}.w-3{width:.75rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-5\/12{width:41.666667%}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-8\/12{width:66.666667%}.w-80{width:20rem}.w-\[1em\]{width:1em}.w-\[25px\]{width:25px}.w-\[780px\]{width:780px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-full{min-width:100%}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[50\%\]{max-width:50%}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-10{--tw-translate-y: -2.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-progress{cursor:progress}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.scroll-pt-6{scroll-padding-top:1.5rem}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-\[1fr\,auto\]{grid-template-rows:1fr auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.375rem * var(--tw-space-x-reverse));margin-left:calc(.375rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:hsl(var(--border))}.self-start{align-self:flex-start}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-scroll{overflow-y:scroll}.overflow-ellipsis,.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-x{border-left-width:1px;border-right-width:1px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-b-4{border-bottom-width:4px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity))}.border-border{border-color:hsl(var(--border))}.border-foreground{border-color:hsl(var(--foreground))}.border-b-gray-50{--tw-border-opacity: 1;border-bottom-color:rgb(250 250 250 / var(--tw-border-opacity))}.border-opacity-50{--tw-border-opacity: .5}.bg-\[var\(--shiki-background\)\]{background-color:var(--shiki-background)}.bg-accent{background-color:hsl(var(--accent))}.bg-background{background-color:hsl(var(--background))}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity))}.bg-blue-500\/20{background-color:#3b82f633}.bg-foreground{background-color:hsl(var(--foreground))}.bg-foreground\/20{background-color:hsl(var(--foreground) / .2)}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(115 115 115 / var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity))}.bg-highlight{background-color:hsl(var(--highlight))}.bg-popover{background-color:hsl(var(--popover))}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity))}.bg-sky-400{--tw-bg-opacity: 1;background-color:rgb(56 189 248 / var(--tw-bg-opacity))}.bg-sky-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-white\/20{background-color:#fff3}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity))}.bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-indigo-500{--tw-gradient-to: #6366f1 var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-20{padding:5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.px-\[5px\]{padding-left:5px;padding-right:5px}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[0\.5px\]{padding-top:.5px;padding-bottom:.5px}.py-\[21px\]{padding-top:21px;padding-bottom:21px}.py-\[6px\]{padding-top:6px;padding-bottom:6px}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-\[18px\]{padding-left:18px}.pr-3{padding-right:.75rem}.pr-3\.5{padding-right:.875rem}.pr-5{padding-right:1.25rem}.pt-10{padding-top:2.5rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-\[15px\]{padding-top:15px}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.font-sans{font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[clamp\(3rem\,6vw\,7\.5rem\)\]{font-size:clamp(3rem,6vw,7.5rem)}.text-base{font-size:1rem;line-height:1.5rem}.text-body-lg{font-size:1.5rem;line-height:2rem}.text-body-md{font-size:1.25rem;line-height:1.75rem}.text-h2{font-size:2.5rem;line-height:3rem;font-weight:700}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-3{line-height:.75rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.\!text-foreground-danger{color:hsl(var(--foreground-danger))!important}.text-\[\#10b981\]{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity))}.text-\[\#ef4444\]{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.text-\[\#fb923c\]{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity))}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-background{color:hsl(var(--background))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity))}.text-foreground{color:hsl(var(--foreground))}.text-foreground-danger{color:hsl(var(--foreground-danger))}.text-gray-700{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.underline{text-decoration-line:underline}.\!no-underline{text-decoration-line:none!important}.no-underline{text-decoration-line:none}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow-\[0_0_10px_0_rgba\(0\,0\,0\,0\.3\)\]{--tw-shadow: 0 0 10px 0 rgba(0,0,0,.3);--tw-shadow-colored: 0 0 10px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_2px_0_rgba\(0\,0\,0\,0\.3\)\]{--tw-shadow: 0 0 2px 0 rgba(0,0,0,.3);--tw-shadow-colored: 0 0 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_4px_0_rgba\(0\,0\,0\,0\.3\)\]{--tw-shadow: 0 0 4px 0 rgba(0,0,0,.3);--tw-shadow-colored: 0 0 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_7px_0_rgba\(0\,0\,0\,0\.3\)\]{--tw-shadow: 0 0 7px 0 rgba(0,0,0,.3);--tw-shadow-colored: 0 0 7px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-purple-700{--tw-shadow-color: #7e22ce;--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-sm{--tw-drop-shadow: drop-shadow(0 1px 1px rgb(0 0 0 / .05));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[height\]{transition-property:height;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-none{transition-property:none}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-1000{transition-duration:1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.scrollbar::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.scrollbar::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track-hover, var(--scrollbar-track))}.scrollbar::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track-active, var(--scrollbar-track-hover, var(--scrollbar-track)))}.scrollbar::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.scrollbar::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-hover, var(--scrollbar-thumb))}.scrollbar::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb-active, var(--scrollbar-thumb-hover, var(--scrollbar-thumb)))}.scrollbar::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}.scrollbar::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner-hover, var(--scrollbar-corner))}.scrollbar::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner-active, var(--scrollbar-corner-hover, var(--scrollbar-corner)))}.scrollbar{scrollbar-width:auto;scrollbar-color:var(--scrollbar-thumb, initial) var(--scrollbar-track, initial)}.scrollbar::-webkit-scrollbar{display:block;width:var(--scrollbar-width, 16px);height:var(--scrollbar-height, 16px)}.scrollbar-thin::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.scrollbar-thin::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track-hover, var(--scrollbar-track))}.scrollbar-thin::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track-active, var(--scrollbar-track-hover, var(--scrollbar-track)))}.scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-hover, var(--scrollbar-thumb))}.scrollbar-thin::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb-active, var(--scrollbar-thumb-hover, var(--scrollbar-thumb)))}.scrollbar-thin::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}.scrollbar-thin::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner-hover, var(--scrollbar-corner))}.scrollbar-thin::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner-active, var(--scrollbar-corner-hover, var(--scrollbar-corner)))}.scrollbar-thin{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb, initial) var(--scrollbar-track, initial)}.scrollbar-thin::-webkit-scrollbar{display:block;width:8px;height:8px}.scrollbar-thumb-scrollbar{--scrollbar-thumb: var(--scrollbar) !important}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.duration-100{animation-duration:.1s}.duration-1000{animation-duration:1s}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-500{animation-duration:.5s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.running{animation-play-state:running}.paused{animation-play-state:paused}.h-screen-safe{height:calc(100vh - (env(safe-area-inset-top) + env(safe-area-inset-bottom)));height:-webkit-fill-available}.slideRightContent{transform-origin:var(--radix-popover-content-transform-origin);animation:slideRight .25s ease-out}@keyframes slideRight{0%{opacity:0;transform:translate(-100%)}to{opacity:1;transform:translateY(0)}}@keyframes slideUp{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.dark\:prose-invert:is(.dark *){--tw-prose-body: var(--tw-prose-invert-body);--tw-prose-headings: var(--tw-prose-invert-headings);--tw-prose-lead: var(--tw-prose-invert-lead);--tw-prose-links: var(--tw-prose-invert-links);--tw-prose-bold: var(--tw-prose-invert-bold);--tw-prose-counters: var(--tw-prose-invert-counters);--tw-prose-bullets: var(--tw-prose-invert-bullets);--tw-prose-hr: var(--tw-prose-invert-hr);--tw-prose-quotes: var(--tw-prose-invert-quotes);--tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);--tw-prose-captions: var(--tw-prose-invert-captions);--tw-prose-kbd: var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);--tw-prose-code: var(--tw-prose-invert-code);--tw-prose-pre-code: var(--tw-prose-invert-pre-code);--tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);--tw-prose-th-borders: var(--tw-prose-invert-th-borders);--tw-prose-td-borders: var(--tw-prose-invert-td-borders)}@media (min-width: 640px){.sm\:prose-lg{font-size:1.125rem;line-height:1.7777778}.sm\:prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em}.sm\:prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.sm\:prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6666667em;margin-bottom:1.6666667em;padding-inline-start:1em}.sm\:prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.sm\:prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.sm\:prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.sm\:prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.sm\:prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.sm\:prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.sm\:prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.sm\:prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.sm\:prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;border-radius:.3125rem;padding-top:.2222222em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-inline-start:.4444444em}.sm\:prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.sm\:prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.sm\:prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.sm\:prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding-top:1em;padding-inline-end:1.5em;padding-bottom:1em;padding-inline-start:1.5em}.sm\:prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.5555556em}.sm\:prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.5555556em}.sm\:prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;margin-bottom:.6666667em}.sm\:prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.sm\:prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.sm\:prose-lg :where(.sm\:prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8888889em;margin-bottom:.8888889em}.sm\:prose-lg :where(.sm\:prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.sm\:prose-lg :where(.sm\:prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.sm\:prose-lg :where(.sm\:prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.sm\:prose-lg :where(.sm\:prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.sm\:prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.8888889em;margin-bottom:.8888889em}.sm\:prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em}.sm\:prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.sm\:prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.sm\:prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:3.1111111em;margin-bottom:3.1111111em}.sm\:prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.sm\:prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.sm\:prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.sm\:prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.sm\:prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.sm\:prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.sm\:prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.sm\:prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.sm\:prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.75em;padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.sm\:prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.sm\:prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.sm\:prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7777778em;margin-bottom:1.7777778em}.sm\:prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.sm\:prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.sm\:prose-lg :where(.sm\:prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.sm\:prose-lg :where(.sm\:prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.sm\:prose-lg :where(.sm\:prose-lg>ul>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:unset}.sm\:prose-lg :where(.sm\:prose-lg>ul>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:unset}.sm\:prose-lg :where(.sm\:prose-lg>ol>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:unset}.sm\:prose-lg :where(.sm\:prose-lg>ol>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:unset}.sm\:prose-lg :where(*):not(:where([class~=not-prose],[class~=not-prose] *)){color:hsl(var(--foreground))}.sm\:prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.sm\:prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:left-0:before{content:var(--tw-content);left:0}.before\:top-0:before{content:var(--tw-content);top:0}.before\:h-\[10\%\]:before{content:var(--tw-content);height:10%}.before\:h-\[100\%\]:before{content:var(--tw-content);height:100%}.before\:h-\[20\%\]:before{content:var(--tw-content);height:20%}.before\:h-\[30\%\]:before{content:var(--tw-content);height:30%}.before\:h-\[40\%\]:before{content:var(--tw-content);height:40%}.before\:h-\[50\%\]:before{content:var(--tw-content);height:50%}.before\:h-\[60\%\]:before{content:var(--tw-content);height:60%}.before\:h-\[70\%\]:before{content:var(--tw-content);height:70%}.before\:h-\[80\%\]:before{content:var(--tw-content);height:80%}.before\:h-\[90\%\]:before{content:var(--tw-content);height:90%}.before\:w-\[4px\]:before{content:var(--tw-content);width:4px}.before\:border-t:before{content:var(--tw-content);border-top-width:1px}.before\:bg-highlight:before{content:var(--tw-content);background-color:hsl(var(--highlight))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-bottom-2:after{content:var(--tw-content);bottom:-.5rem}.after\:-bottom-2\.5:after{content:var(--tw-content);bottom:-.625rem}.after\:-right-2:after{content:var(--tw-content);right:-.5rem}.after\:-right-2\.5:after{content:var(--tw-content);right:-.625rem}.after\:right-10:after{content:var(--tw-content);right:2.5rem}.after\:h-5:after{content:var(--tw-content);height:1.25rem}.after\:w-5:after{content:var(--tw-content);width:1.25rem}.after\:-translate-x-2:after{content:var(--tw-content);--tw-translate-x: -.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.after\:rotate-45:after{content:var(--tw-content);--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.after\:scale-75:after{content:var(--tw-content);--tw-scale-x: .75;--tw-scale-y: .75;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.after\:bg-background:after{content:var(--tw-content);background-color:hsl(var(--background))}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition:after{content:var(--tw-content);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\"\"\]:after{--tw-content: "";content:var(--tw-content)}.after\:content-\[\'→\'\]:after{--tw-content: "→";content:var(--tw-content)}.first\:pt-3:first-child{padding-top:.75rem}.last\:pb-3:last-child{padding-bottom:.75rem}.focus-within\:-translate-y-1:focus-within{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.focus-within\:opacity-100:focus-within{opacity:1}.focus-within\:shadow-lg:focus-within{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:translate-y-10{--tw-translate-y: 2.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:bg-background{background-color:hsl(var(--background))}.group:hover .group-hover\:opacity-0{opacity:0}.group:hover .group-hover\:opacity-100{opacity:1}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.prose-pre\:m-0 :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *))){margin:0}.prose-pre\:mb-1 :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *))){margin-bottom:.25rem}.prose-pre\:rounded-none :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *))){border-radius:0}.radix-disabled\:text-red-500[data-disabled]{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.radix-highlighted\:opacity-100[data-highlighted]{opacity:1}.radix-highlighted\:outline-none[data-highlighted]{outline:2px solid transparent;outline-offset:2px}.radix-placeholder\:text-gray-500[data-placeholder]{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity))}.radix-state-active\:z-10[data-state=active]{z-index:10}.radix-state-active\:bg-foreground[data-state=active]{background-color:hsl(var(--foreground))}.radix-state-active\:text-background[data-state=active]{color:hsl(var(--background))}.radix-state-checked\:opacity-100[data-state=checked]{opacity:1}.radix-state-closed\:hidden[data-state=closed],.radix-state-inactive\:hidden[data-state=inactive]{display:none}.group[data-state=open] .group-radix-state-open\:rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:-translate-y-1:hover{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:animate-none:hover{animation:none}.hover\:bg-\[hsl\(var\(--foreground\)\/0\.02\)\]:hover{background-color:hsl(var(--foreground)/.02)}.hover\:bg-background:hover{background-color:hsl(var(--background))}.hover\:bg-foreground\/20:hover{background-color:hsl(var(--foreground) / .2)}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity))}.hover\:bg-white\/30:hover{background-color:#ffffff4d}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:after\:translate-x-0:hover:after{content:var(--tw-content);--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:after\:opacity-100:hover:after{content:var(--tw-content);opacity:1}.radix-state-active\:hover\:bg-foreground\/80:hover[data-state=active]{background-color:hsl(var(--foreground) / .8)}.radix-state-active\:hover\:text-background\/80:hover[data-state=active]{color:hsl(var(--background) / .8)}.radix-state-inactive\:hover\:bg-foreground\/20:hover[data-state=inactive]{background-color:hsl(var(--foreground) / .2)}.radix-state-inactive\:hover\:text-foreground\/80:hover[data-state=inactive]{color:hsl(var(--foreground) / .8)}.focus\:animate-none:focus{animation:none}.focus\:bg-\[hsl\(var\(--foreground\)\/0\.02\)\]:focus{background-color:hsl(var(--foreground)/.02)}.focus\:bg-background:focus{background-color:hsl(var(--background))}.focus\:bg-foreground\/80:focus{background-color:hsl(var(--foreground) / .8)}.focus\:text-background\/80:focus{color:hsl(var(--background) / .8)}.focus\:text-foreground:focus{color:hsl(var(--foreground))}.focus\:underline:focus{text-decoration-line:underline}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.active\:bg-foreground\/30:active{background-color:hsl(var(--foreground) / .3)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-40:disabled{opacity:.4}@media (prefers-reduced-motion: no-preference){.motion-safe\:transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}}.dark\:divide-border\/50:is(.dark *)>:not([hidden])~:not([hidden]){border-color:hsl(var(--border) / .5)}.dark\:bg-black\/40:is(.dark *){background-color:#0006}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity))}.dark\:bg-white:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity))}.dark\:shadow-gray-800:is(.dark *){--tw-shadow-color: #262626;--tw-shadow: var(--tw-shadow-colored)}.dark\:shadow-purple-200:is(.dark *){--tw-shadow-color: #e9d5ff;--tw-shadow: var(--tw-shadow-colored)}.dark\:hover\:bg-white\/5:hover:is(.dark *){background-color:#ffffff0d}.hover\:dark\:bg-gray-600:is(.dark *):hover{--tw-bg-opacity: 1;background-color:rgb(82 82 82 / var(--tw-bg-opacity))}@media (min-width: 640px){.sm\:col-span-1{grid-column:span 1 / span 1}.sm\:row-span-1{grid-row:span 1 / span 1}.sm\:mb-4{margin-bottom:1rem}.sm\:flex{display:flex}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:h-\[calc\(100vh-64px-env\(safe-area-inset-top\)-env\(safe-area-inset-bottom\)\)\]{height:calc(100vh - 64px - env(safe-area-inset-top) - env(safe-area-inset-bottom))}.sm\:h-\[calc\(100vh-env\(safe-area-inset-top\)-env\(safe-area-inset-bottom\)\)\]{height:calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom))}.sm\:h-full{height:100%}.sm\:min-h-\[800px\]{min-height:800px}.sm\:min-h-\[unset\]{min-height:unset}.sm\:w-full{width:100%}.sm\:max-w-\[calc\(100\%-56px\)\]{max-width:calc(100% - 56px)}.sm\:flex-shrink-0{flex-shrink:0}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:border-b{border-bottom-width:1px}.sm\:border-r-0{border-right-width:0px}.sm\:p-10{padding:2.5rem}.sm\:pt-8{padding-top:2rem}.sm\:text-left{text-align:left}}@media (min-width: 768px){.md\:block{display:block}.md\:hidden{display:none}.md\:min-h-\[unset\]{min-height:unset}.md\:w-3\/4{width:75%}.md\:w-full{width:100%}.md\:flex-row{flex-direction:row}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:pt-16{padding-top:4rem}.md\:pt-8{padding-top:2rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}}@media (min-width: 1024px){.lg\:max-h-\[70vh\]{max-height:70vh}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.lg\:justify-center{justify-content:center}.lg\:gap-4{gap:1rem}.lg\:border-b-0{border-bottom-width:0px}.lg\:border-r{border-right-width:1px}.lg\:text-xl{font-size:1.25rem;line-height:1.75rem}.lg\:slideUpContent{transform-origin:var(--radix-popover-content-transform-origin);animation:slideUp .25s ease-out}}@media (min-width: 1280px){.xl\:w-2\/3{width:66.666667%}.xl\:p-12{padding:3rem}}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as t}from"./index-DF_XBInP.js";import{T as r}from"./tests-BeAEgPAw.js";import{u as p}from"./components-DZ8XIeZ3.js";import"./epic-video-bs7WmhbC.js";import"./index-BvihEwfB.js";import"./request-info-DGnmXtfj.js";import"./misc-BE75ioh8.js";import"./tooltip-6-WS-Xux.js";import"./pe-CvPIToj6.js";import"./loading-Br41_Pbf.js";import"./user-Boua6jiU.js";import"./workshop-config-Ce9sSc3I.js";import"./accordion-DuE9VejZ.js";import"./index-BczhSZ3e.js";import"./index-BjNhezSK.js";import"./use-event-source-CCGBLG92.js";import"./set-playground-pMKmtPtz.js";import"./progress-bar-F8_2mvYp.js";function A(){const{appInfo:o}=p();return t.jsx(r,{playgroundAppInfo:o})}export{A as default};
|
|
2
|
-
//# sourceMappingURL=test-B6zIK2V6.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-B6zIK2V6.js","sources":["../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test.tsx"],"sourcesContent":["import { requireExerciseApp } from '@epic-web/workshop-utils/apps.server'\nimport {\n\tcombineServerTimings,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport {\n\ttype HeadersFunction,\n\tjson,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport { useLoaderData } from '@remix-run/react'\nimport { TestUI } from './__shared/tests.tsx'\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exercise-step-test')\n\tconst exerciseStepApp = await requireExerciseApp(params, { request, timings })\n\n\treturn json({\n\t\tappInfo: {\n\t\t\tname: exerciseStepApp?.name,\n\t\t\ttest: exerciseStepApp?.test,\n\t\t},\n\t})\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nexport default function TestsList() {\n\tconst { appInfo } = useLoaderData<typeof loader>()\n\n\treturn <TestUI playgroundAppInfo={appInfo} />\n}\n"],"names":["TestsList","appInfo","useLoaderData","jsx","TestUI","playgroundAppInfo"],"mappings":"qlBAiCA,SAAwBA,GAAY,CAC7B,KAAA,CAAEC,QAAAA,CAAQ,EAAIC,EAA6B,EAE1C,OAAAC,EAAAA,IAACC,EAAO,CAAAC,kBAAmBJ,CAAS,CAAA,CAC5C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tests-BeAEgPAw.js","sources":["../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/playground-window.tsx","../../../../../node_modules/entities/lib/decode_codepoint.js","../../../../../node_modules/entities/lib/decode.js","../../../../../node_modules/entities/lib/encode.js","../../../../../node_modules/entities/lib/index.js","../../../../../node_modules/ansi-to-html/lib/ansi_to_html.js","../../../app/utils/ansi-text.ts","../../../app/components/in-browser-test-runner.tsx","../../../app/routes/test.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/tests.tsx"],"sourcesContent":["import { Icon } from '#app/components/icons'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.js'\nimport { PlaygroundChooser, SetPlayground } from '#app/routes/set-playground'\n\nexport function PlaygroundWindow({\n\tplaygroundAppName,\n\tproblemAppName,\n\tisUpToDate,\n\tallApps,\n\tchildren,\n}: {\n\tplaygroundAppName?: string\n\tproblemAppName?: string\n\tisUpToDate: boolean\n\tallApps: Array<{ name: string; displayName: string }>\n\tchildren: React.ReactNode\n}) {\n\tconst isCorrectApp = playgroundAppName === problemAppName\n\tconst playgroundLinkedUI =\n\t\tisCorrectApp && isUpToDate ? (\n\t\t\t<Icon size=\"xl\" name=\"Linked\" />\n\t\t) : (\n\t\t\t<Icon\n\t\t\t\tsize=\"xl\"\n\t\t\t\tname=\"Unlinked\"\n\t\t\t\tclassName=\"animate-pulse text-foreground-danger\"\n\t\t\t/>\n\t\t)\n\tlet setPlaygroundTooltipText = 'Click to reset Playground.'\n\tif (!isUpToDate) {\n\t\tsetPlaygroundTooltipText =\n\t\t\t'Playground is out of date. Click to reset Playground.'\n\t}\n\tif (!isCorrectApp) {\n\t\tsetPlaygroundTooltipText =\n\t\t\t'Playground is not set to the right app. Click to set Playground.'\n\t}\n\treturn (\n\t\t<div className=\"flex h-full w-full flex-col justify-between\">\n\t\t\t<div className=\"flex h-14 flex-shrink-0 items-center justify-start gap-2 border-b px-3\">\n\t\t\t\t<div className=\"display-alt-up\">\n\t\t\t\t\t{problemAppName ? (\n\t\t\t\t\t\t<SetPlayground\n\t\t\t\t\t\t\tappName={problemAppName}\n\t\t\t\t\t\t\ttooltipText={setPlaygroundTooltipText}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{playgroundLinkedUI}\n\t\t\t\t\t\t</SetPlayground>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<SimpleTooltip content=\"No problem app available for this step\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"display-alt-down\">\n\t\t\t\t\t{playgroundAppName ? (\n\t\t\t\t\t\t<SetPlayground\n\t\t\t\t\t\t\tappName={playgroundAppName}\n\t\t\t\t\t\t\treset\n\t\t\t\t\t\t\ttooltipText=\"Reset Playground\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex h-7 w-7 items-center justify-center\">\n\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SetPlayground>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"h-7 w-7\" />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<PlaygroundChooser\n\t\t\t\t\tallApps={allApps}\n\t\t\t\t\tplaygroundAppName={playgroundAppName}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"flex h-full flex-1 flex-grow items-center justify-center\">\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault(require(\"./maps/decode.json\"));\n// Adapted from https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nvar fromCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nString.fromCodePoint ||\n function (codePoint) {\n var output = \"\";\n if (codePoint > 0xffff) {\n codePoint -= 0x10000;\n output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n codePoint = 0xdc00 | (codePoint & 0x3ff);\n }\n output += String.fromCharCode(codePoint);\n return output;\n };\nfunction decodeCodePoint(codePoint) {\n if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n return \"\\uFFFD\";\n }\n if (codePoint in decode_json_1.default) {\n codePoint = decode_json_1.default[codePoint];\n }\n return fromCodePoint(codePoint);\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"./maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nvar strictEntityRe = /&(?:[a-zA-Z0-9]+|#[xX][\\da-fA-F]+|#\\d+);/g;\nexports.decodeXML = getStrictDecoder(xml_json_1.default);\nexports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\nfunction getStrictDecoder(map) {\n var replace = getReplacer(map);\n return function (str) { return String(str).replace(strictEntityRe, replace); };\n}\nvar sorter = function (a, b) { return (a < b ? 1 : -1); };\nexports.decodeHTML = (function () {\n var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n var keys = Object.keys(entities_json_1.default).sort(sorter);\n for (var i = 0, j = 0; i < keys.length; i++) {\n if (legacy[j] === keys[i]) {\n keys[i] += \";?\";\n j++;\n }\n else {\n keys[i] += \";\";\n }\n }\n var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n var replace = getReplacer(entities_json_1.default);\n function replacer(str) {\n if (str.substr(-1) !== \";\")\n str += \";\";\n return replace(str);\n }\n // TODO consider creating a merged map\n return function (str) { return String(str).replace(re, replacer); };\n})();\nfunction getReplacer(map) {\n return function replace(str) {\n if (str.charAt(1) === \"#\") {\n var secondChar = str.charAt(2);\n if (secondChar === \"X\" || secondChar === \"x\") {\n return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n }\n return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n }\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n return map[str.slice(1, -1)] || str;\n };\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = void 0;\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using XML entities.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `ü`) will be used.\n */\nexports.encodeXML = getASCIIEncoder(inverseXML);\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\n/**\n * Encodes all entities and non-ASCII characters in the input.\n *\n * This includes characters that are valid ASCII characters in HTML documents.\n * For example `#` will be encoded as `#`. To get a more compact output,\n * consider using the `encodeNonAsciiHTML` function.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `ü`) will be used.\n */\nexports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in HTML\n * documents using HTML entities.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `ü`) will be used.\n */\nexports.encodeNonAsciiHTML = getASCIIEncoder(inverseHTML);\nfunction getInverseObj(obj) {\n return Object.keys(obj)\n .sort()\n .reduce(function (inverse, name) {\n inverse[obj[name]] = \"&\" + name + \";\";\n return inverse;\n }, {});\n}\nfunction getInverseReplacer(inverse) {\n var single = [];\n var multiple = [];\n for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {\n var k = _a[_i];\n if (k.length === 1) {\n // Add value to single array\n single.push(\"\\\\\" + k);\n }\n else {\n // Add value to multiple array\n multiple.push(k);\n }\n }\n // Add ranges to single characters.\n single.sort();\n for (var start = 0; start < single.length - 1; start++) {\n // Find the end of a run of characters\n var end = start;\n while (end < single.length - 1 &&\n single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {\n end += 1;\n }\n var count = 1 + end - start;\n // We want to replace at least three characters\n if (count < 3)\n continue;\n single.splice(start, count, single[start] + \"-\" + single[end]);\n }\n multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n return new RegExp(multiple.join(\"|\"), \"g\");\n}\n// /[^\\0-\\x7F]/gu\nvar reNonASCII = /(?:[\\x80-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/g;\nvar getCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nString.prototype.codePointAt != null\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n function (str) { return str.codePointAt(0); }\n : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n function (c) {\n return (c.charCodeAt(0) - 0xd800) * 0x400 +\n c.charCodeAt(1) -\n 0xdc00 +\n 0x10000;\n };\nfunction singleCharReplacer(c) {\n return \"&#x\" + (c.length > 1 ? getCodePoint(c) : c.charCodeAt(0))\n .toString(16)\n .toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n return function (data) {\n return data\n .replace(re, function (name) { return inverse[name]; })\n .replace(reNonASCII, singleCharReplacer);\n };\n}\nvar reEscapeChars = new RegExp(xmlReplacer.source + \"|\" + reNonASCII.source, \"g\");\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using numeric hexadecimal reference (eg. `ü`).\n *\n * Have a look at `escapeUTF8` if you want a more concise output at the expense\n * of reduced transportability.\n *\n * @param data String to escape.\n */\nfunction escape(data) {\n return data.replace(reEscapeChars, singleCharReplacer);\n}\nexports.escape = escape;\n/**\n * Encodes all characters not valid in XML documents using numeric hexadecimal\n * reference (eg. `ü`).\n *\n * Note that the output will be character-set dependent.\n *\n * @param data String to escape.\n */\nfunction escapeUTF8(data) {\n return data.replace(xmlReplacer, singleCharReplacer);\n}\nexports.escapeUTF8 = escapeUTF8;\nfunction getASCIIEncoder(obj) {\n return function (data) {\n return data.replace(reEscapeChars, function (c) { return obj[c] || singleCharReplacer(c); });\n };\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = void 0;\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\n/**\n * Decodes a string with entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n * @deprecated Use `decodeXML` or `decodeHTML` directly.\n */\nfunction decode(data, level) {\n return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n}\nexports.decode = decode;\n/**\n * Decodes a string with entities. Does not allow missing trailing semicolons for entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n * @deprecated Use `decodeHTMLStrict` or `decodeXML` directly.\n */\nfunction decodeStrict(data, level) {\n return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n}\nexports.decodeStrict = decodeStrict;\n/**\n * Encodes a string with entities.\n *\n * @param data String to encode.\n * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.\n * @deprecated Use `encodeHTML`, `encodeXML` or `encodeNonAsciiHTML` directly.\n */\nfunction encode(data, level) {\n return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nObject.defineProperty(exports, \"encodeXML\", { enumerable: true, get: function () { return encode_2.encodeXML; } });\nObject.defineProperty(exports, \"encodeHTML\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeNonAsciiHTML\", { enumerable: true, get: function () { return encode_2.encodeNonAsciiHTML; } });\nObject.defineProperty(exports, \"escape\", { enumerable: true, get: function () { return encode_2.escape; } });\nObject.defineProperty(exports, \"escapeUTF8\", { enumerable: true, get: function () { return encode_2.escapeUTF8; } });\n// Legacy aliases (deprecated)\nObject.defineProperty(exports, \"encodeHTML4\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeHTML5\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nvar decode_2 = require(\"./decode\");\nObject.defineProperty(exports, \"decodeXML\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\nObject.defineProperty(exports, \"decodeHTML\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTMLStrict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\n// Legacy aliases (deprecated)\nObject.defineProperty(exports, \"decodeHTML4\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML5\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML4Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeHTML5Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeXMLStrict\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\n","'use strict';\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nvar entities = require('entities');\n\nvar defaults = {\n fg: '#FFF',\n bg: '#000',\n newline: false,\n escapeXML: false,\n stream: false,\n colors: getDefaultColors()\n};\n\nfunction getDefaultColors() {\n var colors = {\n 0: '#000',\n 1: '#A00',\n 2: '#0A0',\n 3: '#A50',\n 4: '#00A',\n 5: '#A0A',\n 6: '#0AA',\n 7: '#AAA',\n 8: '#555',\n 9: '#F55',\n 10: '#5F5',\n 11: '#FF5',\n 12: '#55F',\n 13: '#F5F',\n 14: '#5FF',\n 15: '#FFF'\n };\n range(0, 5).forEach(function (red) {\n range(0, 5).forEach(function (green) {\n range(0, 5).forEach(function (blue) {\n return setStyleColor(red, green, blue, colors);\n });\n });\n });\n range(0, 23).forEach(function (gray) {\n var c = gray + 232;\n var l = toHexString(gray * 10 + 8);\n colors[c] = '#' + l + l + l;\n });\n return colors;\n}\n/**\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n * @param {object} colors\n */\n\n\nfunction setStyleColor(red, green, blue, colors) {\n var c = 16 + red * 36 + green * 6 + blue;\n var r = red > 0 ? red * 40 + 55 : 0;\n var g = green > 0 ? green * 40 + 55 : 0;\n var b = blue > 0 ? blue * 40 + 55 : 0;\n colors[c] = toColorHexString([r, g, b]);\n}\n/**\n * Converts from a number like 15 to a hex string like 'F'\n * @param {number} num\n * @returns {string}\n */\n\n\nfunction toHexString(num) {\n var str = num.toString(16);\n\n while (str.length < 2) {\n str = '0' + str;\n }\n\n return str;\n}\n/**\n * Converts from an array of numbers like [15, 15, 15] to a hex string like 'FFF'\n * @param {[red, green, blue]} ref\n * @returns {string}\n */\n\n\nfunction toColorHexString(ref) {\n var results = [];\n\n var _iterator = _createForOfIteratorHelper(ref),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var r = _step.value;\n results.push(toHexString(r));\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return '#' + results.join('');\n}\n/**\n * @param {Array} stack\n * @param {string} token\n * @param {*} data\n * @param {object} options\n */\n\n\nfunction generateOutput(stack, token, data, options) {\n var result;\n\n if (token === 'text') {\n result = pushText(data, options);\n } else if (token === 'display') {\n result = handleDisplay(stack, data, options);\n } else if (token === 'xterm256Foreground') {\n result = pushForegroundColor(stack, options.colors[data]);\n } else if (token === 'xterm256Background') {\n result = pushBackgroundColor(stack, options.colors[data]);\n } else if (token === 'rgb') {\n result = handleRgb(stack, data);\n }\n\n return result;\n}\n/**\n * @param {Array} stack\n * @param {string} data\n * @returns {*}\n */\n\n\nfunction handleRgb(stack, data) {\n data = data.substring(2).slice(0, -1);\n var operation = +data.substr(0, 2);\n var color = data.substring(5).split(';');\n var rgb = color.map(function (value) {\n return ('0' + Number(value).toString(16)).substr(-2);\n }).join('');\n return pushStyle(stack, (operation === 38 ? 'color:#' : 'background-color:#') + rgb);\n}\n/**\n * @param {Array} stack\n * @param {number} code\n * @param {object} options\n * @returns {*}\n */\n\n\nfunction handleDisplay(stack, code, options) {\n code = parseInt(code, 10);\n var codeMap = {\n '-1': function _() {\n return '<br/>';\n },\n 0: function _() {\n return stack.length && resetStyles(stack);\n },\n 1: function _() {\n return pushTag(stack, 'b');\n },\n 3: function _() {\n return pushTag(stack, 'i');\n },\n 4: function _() {\n return pushTag(stack, 'u');\n },\n 8: function _() {\n return pushStyle(stack, 'display:none');\n },\n 9: function _() {\n return pushTag(stack, 'strike');\n },\n 22: function _() {\n return pushStyle(stack, 'font-weight:normal;text-decoration:none;font-style:normal');\n },\n 23: function _() {\n return closeTag(stack, 'i');\n },\n 24: function _() {\n return closeTag(stack, 'u');\n },\n 39: function _() {\n return pushForegroundColor(stack, options.fg);\n },\n 49: function _() {\n return pushBackgroundColor(stack, options.bg);\n },\n 53: function _() {\n return pushStyle(stack, 'text-decoration:overline');\n }\n };\n var result;\n\n if (codeMap[code]) {\n result = codeMap[code]();\n } else if (4 < code && code < 7) {\n result = pushTag(stack, 'blink');\n } else if (29 < code && code < 38) {\n result = pushForegroundColor(stack, options.colors[code - 30]);\n } else if (39 < code && code < 48) {\n result = pushBackgroundColor(stack, options.colors[code - 40]);\n } else if (89 < code && code < 98) {\n result = pushForegroundColor(stack, options.colors[8 + (code - 90)]);\n } else if (99 < code && code < 108) {\n result = pushBackgroundColor(stack, options.colors[8 + (code - 100)]);\n }\n\n return result;\n}\n/**\n * Clear all the styles\n * @returns {string}\n */\n\n\nfunction resetStyles(stack) {\n var stackClone = stack.slice(0);\n stack.length = 0;\n return stackClone.reverse().map(function (tag) {\n return '</' + tag + '>';\n }).join('');\n}\n/**\n * Creates an array of numbers ranging from low to high\n * @param {number} low\n * @param {number} high\n * @returns {Array}\n * @example range(3, 7); // creates [3, 4, 5, 6, 7]\n */\n\n\nfunction range(low, high) {\n var results = [];\n\n for (var j = low; j <= high; j++) {\n results.push(j);\n }\n\n return results;\n}\n/**\n * Returns a new function that is true if value is NOT the same category\n * @param {string} category\n * @returns {function}\n */\n\n\nfunction notCategory(category) {\n return function (e) {\n return (category === null || e.category !== category) && category !== 'all';\n };\n}\n/**\n * Converts a code into an ansi token type\n * @param {number} code\n * @returns {string}\n */\n\n\nfunction categoryForCode(code) {\n code = parseInt(code, 10);\n var result = null;\n\n if (code === 0) {\n result = 'all';\n } else if (code === 1) {\n result = 'bold';\n } else if (2 < code && code < 5) {\n result = 'underline';\n } else if (4 < code && code < 7) {\n result = 'blink';\n } else if (code === 8) {\n result = 'hide';\n } else if (code === 9) {\n result = 'strike';\n } else if (29 < code && code < 38 || code === 39 || 89 < code && code < 98) {\n result = 'foreground-color';\n } else if (39 < code && code < 48 || code === 49 || 99 < code && code < 108) {\n result = 'background-color';\n }\n\n return result;\n}\n/**\n * @param {string} text\n * @param {object} options\n * @returns {string}\n */\n\n\nfunction pushText(text, options) {\n if (options.escapeXML) {\n return entities.encodeXML(text);\n }\n\n return text;\n}\n/**\n * @param {Array} stack\n * @param {string} tag\n * @param {string} [style='']\n * @returns {string}\n */\n\n\nfunction pushTag(stack, tag, style) {\n if (!style) {\n style = '';\n }\n\n stack.push(tag);\n return \"<\".concat(tag).concat(style ? \" style=\\\"\".concat(style, \"\\\"\") : '', \">\");\n}\n/**\n * @param {Array} stack\n * @param {string} style\n * @returns {string}\n */\n\n\nfunction pushStyle(stack, style) {\n return pushTag(stack, 'span', style);\n}\n\nfunction pushForegroundColor(stack, color) {\n return pushTag(stack, 'span', 'color:' + color);\n}\n\nfunction pushBackgroundColor(stack, color) {\n return pushTag(stack, 'span', 'background-color:' + color);\n}\n/**\n * @param {Array} stack\n * @param {string} style\n * @returns {string}\n */\n\n\nfunction closeTag(stack, style) {\n var last;\n\n if (stack.slice(-1)[0] === style) {\n last = stack.pop();\n }\n\n if (last) {\n return '</' + style + '>';\n }\n}\n/**\n * @param {string} text\n * @param {object} options\n * @param {function} callback\n * @returns {Array}\n */\n\n\nfunction tokenize(text, options, callback) {\n var ansiMatch = false;\n var ansiHandler = 3;\n\n function remove() {\n return '';\n }\n\n function removeXterm256Foreground(m, g1) {\n callback('xterm256Foreground', g1);\n return '';\n }\n\n function removeXterm256Background(m, g1) {\n callback('xterm256Background', g1);\n return '';\n }\n\n function newline(m) {\n if (options.newline) {\n callback('display', -1);\n } else {\n callback('text', m);\n }\n\n return '';\n }\n\n function ansiMess(m, g1) {\n ansiMatch = true;\n\n if (g1.trim().length === 0) {\n g1 = '0';\n }\n\n g1 = g1.trimRight(';').split(';');\n\n var _iterator2 = _createForOfIteratorHelper(g1),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var g = _step2.value;\n callback('display', g);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n return '';\n }\n\n function realText(m) {\n callback('text', m);\n return '';\n }\n\n function rgb(m) {\n callback('rgb', m);\n return '';\n }\n /* eslint no-control-regex:0 */\n\n\n var tokens = [{\n pattern: /^\\x08+/,\n sub: remove\n }, {\n pattern: /^\\x1b\\[[012]?K/,\n sub: remove\n }, {\n pattern: /^\\x1b\\[\\(B/,\n sub: remove\n }, {\n pattern: /^\\x1b\\[[34]8;2;\\d+;\\d+;\\d+m/,\n sub: rgb\n }, {\n pattern: /^\\x1b\\[38;5;(\\d+)m/,\n sub: removeXterm256Foreground\n }, {\n pattern: /^\\x1b\\[48;5;(\\d+)m/,\n sub: removeXterm256Background\n }, {\n pattern: /^\\n/,\n sub: newline\n }, {\n pattern: /^\\r+\\n/,\n sub: newline\n }, {\n pattern: /^\\r/,\n sub: newline\n }, {\n pattern: /^\\x1b\\[((?:\\d{1,3};?)+|)m/,\n sub: ansiMess\n }, {\n // CSI n J\n // ED - Erase in Display Clears part of the screen.\n // If n is 0 (or missing), clear from cursor to end of screen.\n // If n is 1, clear from cursor to beginning of the screen.\n // If n is 2, clear entire screen (and moves cursor to upper left on DOS ANSI.SYS).\n // If n is 3, clear entire screen and delete all lines saved in the scrollback buffer\n // (this feature was added for xterm and is supported by other terminal applications).\n pattern: /^\\x1b\\[\\d?J/,\n sub: remove\n }, {\n // CSI n ; m f\n // HVP - Horizontal Vertical Position Same as CUP\n pattern: /^\\x1b\\[\\d{0,3};\\d{0,3}f/,\n sub: remove\n }, {\n // catch-all for CSI sequences?\n pattern: /^\\x1b\\[?[\\d;]{0,3}/,\n sub: remove\n }, {\n /**\n * extracts real text - not containing:\n * - `\\x1b' - ESC - escape (Ascii 27)\n * - '\\x08' - BS - backspace (Ascii 8)\n * - `\\n` - Newline - linefeed (LF) (ascii 10)\n * - `\\r` - Windows Carriage Return (CR)\n */\n pattern: /^(([^\\x1b\\x08\\r\\n])+)/,\n sub: realText\n }];\n\n function process(handler, i) {\n if (i > ansiHandler && ansiMatch) {\n return;\n }\n\n ansiMatch = false;\n text = text.replace(handler.pattern, handler.sub);\n }\n\n var results1 = [];\n var _text = text,\n length = _text.length;\n\n outer: while (length > 0) {\n for (var i = 0, o = 0, len = tokens.length; o < len; i = ++o) {\n var handler = tokens[i];\n process(handler, i);\n\n if (text.length !== length) {\n // We matched a token and removed it from the text. We need to\n // start matching *all* tokens against the new text.\n length = text.length;\n continue outer;\n }\n }\n\n if (text.length === length) {\n break;\n }\n\n results1.push(0);\n length = text.length;\n }\n\n return results1;\n}\n/**\n * If streaming, then the stack is \"sticky\"\n *\n * @param {Array} stickyStack\n * @param {string} token\n * @param {*} data\n * @returns {Array}\n */\n\n\nfunction updateStickyStack(stickyStack, token, data) {\n if (token !== 'text') {\n stickyStack = stickyStack.filter(notCategory(categoryForCode(data)));\n stickyStack.push({\n token: token,\n data: data,\n category: categoryForCode(data)\n });\n }\n\n return stickyStack;\n}\n\nvar Filter = /*#__PURE__*/function () {\n /**\n * @param {object} options\n * @param {string=} options.fg The default foreground color used when reset color codes are encountered.\n * @param {string=} options.bg The default background color used when reset color codes are encountered.\n * @param {boolean=} options.newline Convert newline characters to `<br/>`.\n * @param {boolean=} options.escapeXML Generate HTML/XML entities.\n * @param {boolean=} options.stream Save style state across invocations of `toHtml()`.\n * @param {(string[] | {[code: number]: string})=} options.colors Can override specific colors or the entire ANSI palette.\n */\n function Filter(options) {\n _classCallCheck(this, Filter);\n\n options = options || {};\n\n if (options.colors) {\n options.colors = Object.assign({}, defaults.colors, options.colors);\n }\n\n this.options = Object.assign({}, defaults, options);\n this.stack = [];\n this.stickyStack = [];\n }\n /**\n * @param {string | string[]} input\n * @returns {string}\n */\n\n\n _createClass(Filter, [{\n key: \"toHtml\",\n value: function toHtml(input) {\n var _this = this;\n\n input = typeof input === 'string' ? [input] : input;\n var stack = this.stack,\n options = this.options;\n var buf = [];\n this.stickyStack.forEach(function (element) {\n var output = generateOutput(stack, element.token, element.data, options);\n\n if (output) {\n buf.push(output);\n }\n });\n tokenize(input.join(''), options, function (token, data) {\n var output = generateOutput(stack, token, data, options);\n\n if (output) {\n buf.push(output);\n }\n\n if (options.stream) {\n _this.stickyStack = updateStickyStack(_this.stickyStack, token, data);\n }\n });\n\n if (stack.length) {\n buf.push(resetStyles(stack));\n }\n\n return buf.join('');\n }\n }]);\n\n return Filter;\n}();\n\nmodule.exports = Filter;\n//# sourceMappingURL=ansi_to_html.js.map","import AnsiToHTML from 'ansi-to-html'\nimport { useMemo } from 'react'\nimport { useTheme } from '#app/routes/theme/index.js'\n\nexport function useAnsiToHtml() {\n\tconst theme = useTheme()\n\tconst ansi = useMemo(\n\t\t() =>\n\t\t\tnew AnsiToHTML(\n\t\t\t\ttheme === 'dark'\n\t\t\t\t\t? { fg: '#d6deeb', bg: '#121318', escapeXML: true }\n\t\t\t\t\t: { fg: '#000000', bg: '#f3f3f3', escapeXML: true },\n\t\t\t),\n\t\t[theme],\n\t)\n\treturn ansi\n}\n\n// remove this when this is fixed: https://github.com/rburns/ansi-to-html/issues/112\nexport function stripCursorMovements(data: string) {\n\treturn data.replace(/\\u001b\\[\\d+A/g, '').replace(/\\u001b\\[\\d+K/g, '')\n}\n","import * as Accordion from '@radix-ui/react-accordion'\nimport { useEffect, useRef, useState } from 'react'\nimport { z } from 'zod'\nimport AccordionComponent from '#app/components/accordion.tsx'\nimport { stripCursorMovements, useAnsiToHtml } from '#app/utils/ansi-text.js'\nimport { AnimatedBars, Icon } from './icons.tsx'\n\nconst testRunnerStatusDataSchema = z.intersection(\n\tz.object({\n\t\ttype: z.literal('epicshop:test-status-update'),\n\t\ttimestamp: z.number(),\n\t}),\n\tz.union([\n\t\tz.object({ status: z.literal('pending') }),\n\t\tz.object({ status: z.literal('pass') }),\n\t\tz.object({ status: z.literal('fail'), error: z.string() }),\n\t]),\n)\n\nconst testRunnerTestStepDataSchema = z.object({\n\ttype: z.literal('epicshop:test-step-update'),\n\tstatus: z.literal('pass'),\n\ttitle: z.string(),\n\ttimestamp: z.number(),\n})\n\nconst testRunnerDataSchema = z.union([\n\ttestRunnerTestStepDataSchema,\n\ttestRunnerStatusDataSchema,\n])\n\ntype TestRunnerStatusData = z.infer<typeof testRunnerStatusDataSchema>\ntype TestRunnerTestStepData = z.infer<typeof testRunnerTestStepDataSchema>\n\nexport function InBrowserTestRunner({\n\tpathname,\n\ttestFile,\n}: {\n\tpathname: string\n\ttestFile: string\n}) {\n\tconst ansi = useAnsiToHtml()\n\tconst iframeRef = useRef<HTMLIFrameElement>(null)\n\tconst [message, setMessage] = useState<TestRunnerStatusData | null>(null)\n\tconst [testSteps, setTestSteps] = useState<Array<TestRunnerTestStepData>>([])\n\n\tuseEffect(() => {\n\t\tfunction handleMessage(messageEvent: MessageEvent) {\n\t\t\tif (messageEvent.source !== iframeRef.current?.contentWindow) return\n\t\t\tif ('request' in messageEvent.data) return\n\n\t\t\tconst result = testRunnerDataSchema.safeParse(messageEvent.data, {\n\t\t\t\tpath: ['messageEvent', 'data'],\n\t\t\t})\n\t\t\tif (!result.success) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Invalid message from test iframe`,\n\t\t\t\t\tmessageEvent.data,\n\t\t\t\t\tresult.error,\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst { data } = result\n\t\t\tif (data.type === 'epicshop:test-status-update') {\n\t\t\t\tif (data.status === 'pending') {\n\t\t\t\t\tsetTestSteps([])\n\t\t\t\t}\n\t\t\t\tsetMessage(data)\n\t\t\t}\n\t\t\tif (data.type === 'epicshop:test-step-update') {\n\t\t\t\tsetTestSteps((steps) => [...steps, data])\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener('message', handleMessage)\n\t\treturn () => {\n\t\t\twindow.removeEventListener('message', handleMessage)\n\t\t}\n\t}, [])\n\n\tconst statusEmoji = {\n\t\tpending: <AnimatedBars size={14} aria-label=\"Pending\" />,\n\t\tpass: (\n\t\t\t<Icon\n\t\t\t\tname=\"CheckSmall\"\n\t\t\t\taria-label=\"Passed\"\n\t\t\t\tclassName=\"text-emerald-700\"\n\t\t\t/>\n\t\t),\n\t\tfail: (\n\t\t\t<Icon\n\t\t\t\tname=\"Remove\"\n\t\t\t\taria-label=\"Failed\"\n\t\t\t\tclassName=\"text-foreground-danger\"\n\t\t\t/>\n\t\t),\n\t\tunknown: (\n\t\t\t<Icon name=\"Question\" aria-label=\"Unknown\" className=\"animate-pulse\" />\n\t\t),\n\t}[message?.status ?? 'unknown']\n\n\tconst sortedTestSteps = testSteps.sort((a, b) => a.timestamp - b.timestamp)\n\tconst testStepStatusEmojis = {\n\t\tpass: <Icon name=\"CheckSmall\" aria-label=\"Passed\" />,\n\t\tfail: <Icon name=\"Remove\" aria-label=\"Failed\" />,\n\t\tunknown: (\n\t\t\t<Icon name=\"Question\" aria-label=\"Unknown\" className=\"animate-pulse\" />\n\t\t),\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<Accordion.Root className=\"w-full\" type=\"multiple\">\n\t\t\t\t<AccordionComponent\n\t\t\t\t\ticon={statusEmoji}\n\t\t\t\t\ttitle={testFile}\n\t\t\t\t\tforceMount={true}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"not-prose\">\n\t\t\t\t\t\t<div className=\"flex flex-col gap-2 p-5 pt-3\">\n\t\t\t\t\t\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t{sortedTestSteps.map((testStep, index) => (\n\t\t\t\t\t\t\t\t\t// sometimes the steps come in so fast that the timestamp is the same\n\t\t\t\t\t\t\t\t\t<li key={testStep.timestamp + testStep.title}>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-baseline gap-2 text-emerald-700\">\n\t\t\t\t\t\t\t\t\t\t\t<span>{index + 1}.</span>\n\t\t\t\t\t\t\t\t\t\t\t<span>{testStepStatusEmojis[testStep.status]}</span>\n\t\t\t\t\t\t\t\t\t\t\t<pre className=\"max-h-48 overflow-y-auto p-4 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t\t\t\t\t\t\t\t{testStep.title}\n\t\t\t\t\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t{message?.status === 'fail' ? (\n\t\t\t\t\t\t\t\t<div className=\"flex items-baseline gap-2 text-foreground-danger\">\n\t\t\t\t\t\t\t\t\t<span>{sortedTestSteps.length + 1}.</span>\n\t\t\t\t\t\t\t\t\t<span>{testStepStatusEmojis.fail}</span>\n\t\t\t\t\t\t\t\t\t<pre\n\t\t\t\t\t\t\t\t\t\tclassName=\"max-h-48 overflow-y-auto p-4 scrollbar-thin scrollbar-thumb-scrollbar\"\n\t\t\t\t\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t\t\t\t\t__html: ansi.toHtml(stripCursorMovements(message.error)),\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</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<iframe\n\t\t\t\t\t\t\t\tref={iframeRef}\n\t\t\t\t\t\t\t\ttitle={testFile}\n\t\t\t\t\t\t\t\tsrc={pathname + testFile}\n\t\t\t\t\t\t\t\tclassName=\"mt-5 min-h-[420px] w-full border bg-white\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex border-y\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\tiframeRef.current?.contentWindow?.location.reload()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName=\"border-r p-3\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" aria-label=\"Rerun Tests\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={pathname + testFile}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\tclassName=\"border-r p-3\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" aria-label=\"Open in New Window\" />\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</AccordionComponent>\n\t\t\t</Accordion.Root>\n\t\t</>\n\t)\n}\n","import { getAppByName } from '@epic-web/workshop-utils/apps.server'\nimport {\n\tclearTestProcessEntry,\n\tgetTestProcessEntry,\n\tisTestRunning,\n\trunAppTests,\n} from '@epic-web/workshop-utils/process-manager.server'\nimport {\n\tjson,\n\ttype ActionFunctionArgs,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport { useFetcher } from '@remix-run/react'\nimport { useEffect, useReducer, useRef } from 'react'\nimport { useEventSource } from 'remix-utils/sse/react'\nimport { eventStream } from 'remix-utils/sse/server'\nimport { z } from 'zod'\nimport { AnimatedBars, Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { stripCursorMovements, useAnsiToHtml } from '#app/utils/ansi-text.js'\nimport { userHasAccessToWorkshop } from '#app/utils/epic-api.js'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\nimport { jsonWithPE, usePERedirectInput } from '#app/utils/pe.js'\nimport { createToastHeaders } from '#app/utils/toast.server.js'\n\nconst testActionSchema = z.union([\n\tz.object({\n\t\tintent: z.literal('run'),\n\t\tname: z.string(),\n\t}),\n\tz.object({\n\t\tintent: z.literal('stop'),\n\t\tname: z.string(),\n\t}),\n\tz.object({\n\t\tintent: z.literal('clear'),\n\t\tname: z.string(),\n\t}),\n])\n\nconst testEventSchema = z.union([\n\tz.object({\n\t\ttype: z.literal('init'),\n\t\texitCode: z.number().nullable().optional(),\n\t\tisRunning: z.boolean(),\n\t\toutput: z.array(\n\t\t\tz.object({\n\t\t\t\ttype: z.union([z.literal('stdout'), z.literal('stderr')]),\n\t\t\t\tcontent: z.string(),\n\t\t\t\ttimestamp: z.number(),\n\t\t\t}),\n\t\t),\n\t}),\n\tz.object({\n\t\ttype: z.union([z.literal('stdout'), z.literal('stderr')]),\n\t\tdata: z.string(),\n\t\ttimestamp: z.number(),\n\t}),\n\tz.object({\n\t\ttype: z.literal('exit'),\n\t\tisRunning: z.literal(false),\n\t\tcode: z.number().nullable(),\n\t}),\n])\nconst testEventQueueSchema = z.array(testEventSchema)\n\ntype TestEvent = z.infer<typeof testEventSchema>\ntype TestEventQueue = z.infer<typeof testEventQueueSchema>\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tensureUndeployed()\n\tconst url = new URL(request.url)\n\tconst name = url.searchParams.get('name')\n\tif (!name) {\n\t\treturn json({ error: 'Missing name' }, { status: 400 })\n\t}\n\tconst app = await getAppByName(name)\n\tif (!app) {\n\t\treturn json({ error: 'App not found' }, { status: 404 })\n\t}\n\tconst processEntry = getTestProcessEntry(app)\n\tif (!processEntry) {\n\t\treturn json({ error: 'App is not running tests' }, { status: 404 })\n\t}\n\treturn eventStream(request.signal, function setup(send) {\n\t\t// have to batch because the client may miss events if we send too many\n\t\t// too rapidly\n\t\tlet queue: TestEventQueue = []\n\t\tfunction sendEvent(event: TestEvent) {\n\t\t\tqueue.push(event)\n\t\t}\n\t\tconst interval = setInterval(() => {\n\t\t\tif (queue.length) {\n\t\t\t\tsend({ data: JSON.stringify(queue) })\n\t\t\t\tqueue = []\n\t\t\t}\n\t\t}, 10)\n\n\t\tconst isRunning = isTestRunning(app)\n\n\t\tsendEvent({\n\t\t\ttype: 'init',\n\t\t\texitCode: processEntry.exitCode,\n\t\t\tisRunning,\n\t\t\toutput: processEntry.output.map((line) => ({\n\t\t\t\ttype: line.type,\n\t\t\t\tcontent: line.content,\n\t\t\t\ttimestamp: line.timestamp,\n\t\t\t})),\n\t\t})\n\n\t\tconst testProcess = processEntry.process\n\t\tif (!testProcess) {\n\t\t\treturn () => {}\n\t\t}\n\n\t\tfunction handleStdOutData(data: Buffer) {\n\t\t\tsendEvent({\n\t\t\t\ttype: 'stdout',\n\t\t\t\tdata: data.toString('utf-8'),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t})\n\t\t}\n\t\tfunction handleStdErrData(data: Buffer) {\n\t\t\tsendEvent({\n\t\t\t\ttype: 'stderr',\n\t\t\t\tdata: data.toString('utf-8'),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t})\n\t\t}\n\t\tfunction handleExit(code: number) {\n\t\t\ttestProcess?.stdout?.off('data', handleStdOutData)\n\t\t\ttestProcess?.stderr?.off('data', handleStdErrData)\n\t\t\ttestProcess?.off('exit', handleExit)\n\t\t\tsendEvent({ type: 'exit', isRunning: false, code })\n\t\t}\n\t\ttestProcess.stdout?.on('data', handleStdOutData)\n\t\ttestProcess.stderr?.on('data', handleStdErrData)\n\t\ttestProcess.on('exit', handleExit)\n\t\treturn function cleanup() {\n\t\t\ttestProcess.stdout?.off('data', handleStdOutData)\n\t\t\ttestProcess.stderr?.off('data', handleStdErrData)\n\t\t\ttestProcess.off('exit', handleExit)\n\t\t\tclearInterval(interval)\n\t\t}\n\t})\n}\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst userHasAccess = await userHasAccessToWorkshop({\n\t\trequest,\n\t})\n\tif (!userHasAccess) {\n\t\treturn jsonWithPE(\n\t\t\tformData,\n\t\t\t{\n\t\t\t\tsuccess: false,\n\t\t\t\terror:\n\t\t\t\t\t'You do not have access to this workshop. Login or register for the workshop to be able to run the tests.',\n\t\t\t},\n\t\t\t{\n\t\t\t\tstatus: 403,\n\t\t\t\theaders: await createToastHeaders({\n\t\t\t\t\ttitle: 'Access denied',\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t'You do not have access to this workshop. Login or register for the workshop to be able to run the tests.',\n\t\t\t\t}),\n\t\t\t},\n\t\t)\n\t}\n\tconst result = testActionSchema.safeParse({\n\t\tintent: formData.get('intent'),\n\t\tname: formData.get('name'),\n\t})\n\tif (!result.success) {\n\t\treturn jsonWithPE(\n\t\t\tformData,\n\t\t\t{ success: false, error: result.error.flatten() },\n\t\t\t{ status: 400 },\n\t\t)\n\t}\n\tconst app = await getAppByName(result.data.name)\n\tif (!app) {\n\t\treturn jsonWithPE(\n\t\t\tformData,\n\t\t\t{ success: false, error: 'App not found' },\n\t\t\t{ status: 404 },\n\t\t)\n\t}\n\tswitch (result.data.intent) {\n\t\tcase 'run': {\n\t\t\tvoid runAppTests(app)\n\t\t\treturn jsonWithPE(formData, { success: true })\n\t\t}\n\t\tcase 'stop': {\n\t\t\tconst processEntry = getTestProcessEntry(app)\n\t\t\tif (processEntry) {\n\t\t\t\tprocessEntry.process?.kill()\n\t\t\t}\n\t\t\treturn jsonWithPE(formData, { success: true })\n\t\t}\n\t\tcase 'clear': {\n\t\t\tclearTestProcessEntry(app)\n\t\t\treturn jsonWithPE(formData, { success: true })\n\t\t}\n\t}\n}\n\nfunction simpleReducer<State>(prev: State, getNext: (prev: State) => State) {\n\treturn getNext(prev)\n}\n\nexport function TestOutput({ name }: { name: string }) {\n\ttype State = {\n\t\t/** version is used to trigger an unsubscribe and resubscribe to the event source */\n\t\tversion: number\n\t\tisRunning: boolean\n\t\texitCode: number | null | undefined\n\t\tlines: Array<{\n\t\t\ttype: 'stdout' | 'stderr'\n\t\t\tcontent: string\n\t\t\ttimestamp: number\n\t\t}>\n\t}\n\tconst [state, dispatch] = useReducer(simpleReducer<State>, {\n\t\tversion: 0,\n\t\tisRunning: false,\n\t\texitCode: undefined,\n\t\tlines: [],\n\t})\n\tconst ansi = useAnsiToHtml()\n\tconst { version, isRunning, exitCode, lines } = state\n\tconst lastMessage = useEventSource(\n\t\t`/test?${new URLSearchParams({ name })}&v=${version}`,\n\t)\n\tuseEffect(() => {\n\t\tif (!lastMessage) return\n\n\t\tconst parsed = JSON.parse(lastMessage)\n\t\tconst result = testEventQueueSchema.safeParse(parsed)\n\t\tif (!result.success) {\n\t\t\tconsole.error(result.error.flatten())\n\t\t\treturn\n\t\t}\n\t\tfor (const event of result.data) {\n\t\t\tswitch (event.type) {\n\t\t\t\tcase 'exit': {\n\t\t\t\t\tconst { isRunning, code: exitCode } = event\n\t\t\t\t\tdispatch((prev) => ({ ...prev, isRunning, exitCode }))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase 'init': {\n\t\t\t\t\tconst { output, exitCode, isRunning } = event\n\t\t\t\t\tdispatch((prev) => ({ ...prev, lines: output, exitCode, isRunning }))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase 'stderr':\n\t\t\t\tcase 'stdout': {\n\t\t\t\t\tconst { type, data: content, timestamp } = event\n\t\t\t\t\tdispatch((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tlines: [...prev.lines, { type, content, timestamp }].sort(\n\t\t\t\t\t\t\t(a, b) => a.timestamp - b.timestamp,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tisRunning: true,\n\t\t\t\t\t}))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [lastMessage])\n\n\treturn (\n\t\t<div className=\"relative flex h-full w-full flex-col overflow-y-auto\">\n\t\t\t<div className=\"flex h-12 w-full flex-shrink-0 items-center justify-between border-b\">\n\t\t\t\t<div className=\"flex h-full items-center\">\n\t\t\t\t\t{!isRunning && (\n\t\t\t\t\t\t<TestRunner\n\t\t\t\t\t\t\tname={name}\n\t\t\t\t\t\t\tonRun={() => {\n\t\t\t\t\t\t\t\tdispatch((prev) => ({\n\t\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t\texitCode: undefined,\n\t\t\t\t\t\t\t\t\tlines: [],\n\t\t\t\t\t\t\t\t\tversion: prev.version + 1,\n\t\t\t\t\t\t\t\t}))\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\t{isRunning ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div className=\"flex h-full flex-grow items-center justify-center border-r px-3.5\">\n\t\t\t\t\t\t\t\t<AnimatedBars role=\"status\" aria-label=\"Running Tests\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<StopTest name={name} />\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\n\t\t\t\t{!isRunning && exitCode !== undefined && (\n\t\t\t\t\t<p className=\"pr-3.5 leading-none\">\n\t\t\t\t\t\t{exitCode === 0\n\t\t\t\t\t\t\t? `Tests passed`\n\t\t\t\t\t\t\t: `Test failed (exit code ${String(exitCode)})`}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t{!isRunning && exitCode !== undefined && (\n\t\t\t\t\t<ClearTest\n\t\t\t\t\t\tname={name}\n\t\t\t\t\t\tonClear={() => {\n\t\t\t\t\t\t\tdispatch((prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\texitCode: undefined,\n\t\t\t\t\t\t\t\tlines: [],\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</div>\n\t\t\t<div className=\"flex h-full flex-col gap-5 p-5\">\n\t\t\t\t<p className=\"font-mono text-sm font-medium uppercase\">Test Output</p>\n\t\t\t\t<pre className=\"shadow-on-scrollbox flex-1 overflow-y-scroll scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t{lines.map((line) => (\n\t\t\t\t\t\t<code\n\t\t\t\t\t\t\tkey={line.timestamp}\n\t\t\t\t\t\t\tdata-type={line.type}\n\t\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t\t__html: ansi.toHtml(stripCursorMovements(line.content)),\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</pre>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nexport function TestRunner({\n\tname,\n\tonRun,\n}: {\n\tname: string\n\tonRun?: () => void\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\tconst latestOnRun = useRef(onRun)\n\tuseEffect(() => {\n\t\tlatestOnRun.current = onRun\n\t}, [onRun])\n\tuseEffect(() => {\n\t\tif (fetcher.data?.success) {\n\t\t\tlatestOnRun.current?.()\n\t\t}\n\t}, [fetcher.data])\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/test\" className=\"h-full\">\n\t\t\t{peRedirectInput}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<SimpleTooltip\n\t\t\t\tcontent={fetcher.state === 'idle' ? 'Run Tests' : 'Running Tests...'}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tname=\"intent\"\n\t\t\t\t\tvalue=\"run\"\n\t\t\t\t\tclassName=\"flex h-full flex-grow items-center justify-center border-r px-3.5\"\n\t\t\t\t>\n\t\t\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t\t\t<Icon name=\"TriangleSmall\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<AnimatedBars role=\"status\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</SimpleTooltip>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function ClearTest({\n\tname,\n\tonClear,\n}: {\n\tname: string\n\tonClear?: () => void\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\tconst latestOnClear = useRef(onClear)\n\tuseEffect(() => {\n\t\tlatestOnClear.current = onClear\n\t}, [onClear])\n\tuseEffect(() => {\n\t\tif (fetcher.data?.success) {\n\t\t\tlatestOnClear.current?.()\n\t\t}\n\t}, [fetcher.data])\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/test\" className=\"h-full\">\n\t\t\t{peRedirectInput}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<SimpleTooltip\n\t\t\t\tcontent={fetcher.state === 'idle' ? 'Clear Tests' : 'Clearing Tests...'}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tname=\"intent\"\n\t\t\t\t\tvalue=\"clear\"\n\t\t\t\t\tclassName=\"flex h-full flex-grow items-center justify-center border-l px-3.5\"\n\t\t\t\t>\n\t\t\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t\t\t<Icon name=\"Clear\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Icon name=\"Clear\" className=\"animate-pulse\" role=\"status\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</SimpleTooltip>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function StopTest({\n\tname,\n\tonStop,\n}: {\n\tname: string\n\tonStop?: () => void\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\tconst latestOnStop = useRef(onStop)\n\tuseEffect(() => {\n\t\tlatestOnStop.current = onStop\n\t}, [onStop])\n\tuseEffect(() => {\n\t\tif (fetcher.data?.success) {\n\t\t\tlatestOnStop.current?.()\n\t\t}\n\t}, [fetcher.data])\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/test\" className=\"h-full\">\n\t\t\t{peRedirectInput}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<SimpleTooltip\n\t\t\t\tcontent={fetcher.state === 'idle' ? 'Stop Tests' : 'Stopping Tests...'}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tname=\"intent\"\n\t\t\t\t\tvalue=\"stop\"\n\t\t\t\t\tclassName=\"flex h-full flex-grow items-center justify-center border-r px-3.5\"\n\t\t\t\t>\n\t\t\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t\t\t<Icon name=\"Stop\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Icon name=\"Stop\" className=\"animate-pulse\" role=\"status\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</SimpleTooltip>\n\t\t</fetcher.Form>\n\t)\n}\n","import { type PlaygroundApp } from '@epic-web/workshop-utils/apps.server'\nimport { useState } from 'react'\nimport { DeferredEpicVideo } from '#app/components/epic-video.js'\nimport { Icon } from '#app/components/icons'\nimport { InBrowserTestRunner } from '#app/components/in-browser-test-runner'\nimport { useUserHasAccess } from '#app/components/user.js'\nimport { TestOutput } from '#app/routes/test'\nimport { PlaygroundWindow } from './playground-window'\n\nexport function Tests({\n\tappInfo: playgroundAppInfo,\n\tproblemAppName,\n\tallApps,\n\tisUpToDate,\n}: {\n\tappInfo: Pick<PlaygroundApp, 'appName' | 'name' | 'test'> | null\n\tproblemAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n\tisUpToDate: boolean\n}) {\n\treturn (\n\t\t<PlaygroundWindow\n\t\t\tplaygroundAppName={playgroundAppInfo?.appName}\n\t\t\tproblemAppName={problemAppName}\n\t\t\tallApps={allApps}\n\t\t\tisUpToDate={isUpToDate}\n\t\t>\n\t\t\t<TestUI playgroundAppInfo={playgroundAppInfo} />\n\t\t</PlaygroundWindow>\n\t)\n}\n\nexport function TestUI({\n\tplaygroundAppInfo,\n}: {\n\tplaygroundAppInfo: Pick<PlaygroundApp, 'name' | 'test'> | null\n}) {\n\tconst [inBrowserTestKey, setInBrowserTestKey] = useState(0)\n\tconst userHasAccess = useUserHasAccess()\n\n\tif (!userHasAccess) {\n\t\treturn (\n\t\t\t<div className=\"w-full p-12\">\n\t\t\t\t<div className=\"flex w-full flex-col gap-4 text-center\">\n\t\t\t\t\t<p className=\"text-2xl font-bold\">Access Denied</p>\n\t\t\t\t\t<p className=\"text-lg\">\n\t\t\t\t\t\tYou must login or register for the workshop to view and run the\n\t\t\t\t\t\ttests.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"h-16\" />\n\t\t\t\t<p className=\"pb-4\">\n\t\t\t\t\tCheck out this video to see how the test tab works.\n\t\t\t\t</p>\n\t\t\t\t<DeferredEpicVideo url=\"https://www.epicweb.dev/tips/epic-workshop-test-tab-demo\" />\n\t\t\t</div>\n\t\t)\n\t}\n\n\tif (!playgroundAppInfo) {\n\t\treturn (\n\t\t\t<div className=\"flex h-full items-center justify-center text-lg\">\n\t\t\t\t<p>No tests here 😢 Sorry.</p>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tif (playgroundAppInfo.test.type === 'script') {\n\t\treturn <TestOutput name={playgroundAppInfo.name} />\n\t}\n\n\tif (playgroundAppInfo.test.type === 'browser') {\n\t\tconst { pathname } = playgroundAppInfo.test\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName=\"flex h-full w-full flex-grow flex-col overflow-y-auto\"\n\t\t\t\tkey={inBrowserTestKey}\n\t\t\t>\n\t\t\t\t{playgroundAppInfo.test.testFiles.map((testFile) => (\n\t\t\t\t\t<div key={testFile}>\n\t\t\t\t\t\t<InBrowserTestRunner pathname={pathname} testFile={testFile} />\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t\t<div className=\"px-3 py-[21px]\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => setInBrowserTestKey((c) => c + 1)}\n\t\t\t\t\t\tclassName=\"flex items-center gap-2 font-mono text-sm uppercase leading-none\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"Refresh\" aria-hidden /> Rerun All Tests\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n\n\treturn (\n\t\t<div className=\"flex h-full items-center justify-center text-lg\">\n\t\t\t<p>No tests here 😢 Sorry.</p>\n\t\t</div>\n\t)\n}\n"],"names":["PlaygroundWindow","playgroundAppName","problemAppName","isUpToDate","allApps","children","isCorrectApp","playgroundLinkedUI","jsx","Icon","setPlaygroundTooltipText","jsxs","SetPlayground","SimpleTooltip","PlaygroundChooser","__importDefault","this","mod","decode_codepoint","decode_json_1","require$$0","fromCodePoint","codePoint","output","decodeCodePoint","decode","entities_json_1","legacy_json_1","require$$1","xml_json_1","require$$2","decode_codepoint_1","require$$3","strictEntityRe","getStrictDecoder","map","replace","getReplacer","str","sorter","a","b","legacy","keys","i","j","re","replacer","secondChar","encode","inverseXML","getInverseObj","xmlReplacer","getInverseReplacer","getASCIIEncoder","inverseHTML","htmlReplacer","getInverse","obj","inverse","name","single","multiple","_i","_a","k","start","end","count","reNonASCII","getCodePoint","c","singleCharReplacer","data","reEscapeChars","escape","escapeUTF8","exports","decode_1","encode_1","level","decodeStrict","encode_2","decode_2","_classCallCheck","instance","Constructor","_defineProperties","target","props","descriptor","_createClass","protoProps","staticProps","_createForOfIteratorHelper","o","allowArrayLike","it","_unsupportedIterableToArray","F","_e","normalCompletion","didErr","err","step","_e2","minLen","_arrayLikeToArray","n","arr","len","arr2","entities","defaults","getDefaultColors","colors","range","red","green","blue","setStyleColor","gray","l","toHexString","r","g","toColorHexString","num","ref","results","_iterator","_step","generateOutput","stack","token","options","result","pushText","handleDisplay","pushForegroundColor","pushBackgroundColor","handleRgb","operation","color","rgb","value","pushStyle","code","codeMap","resetStyles","pushTag","closeTag","stackClone","tag","low","high","notCategory","category","e","categoryForCode","text","style","last","tokenize","callback","ansiMatch","ansiHandler","remove","removeXterm256Foreground","m","g1","removeXterm256Background","newline","ansiMess","_iterator2","_step2","realText","tokens","process","handler","results1","_text","length","outer","updateStickyStack","stickyStack","Filter","input","_this","buf","element","ansi_to_html","useAnsiToHtml","theme","useTheme","useMemo","AnsiToHTML","stripCursorMovements","testRunnerStatusDataSchema","z","testRunnerTestStepDataSchema","testRunnerDataSchema","InBrowserTestRunner","pathname","testFile","ansi","iframeRef","useRef","message","setMessage","useState","testSteps","setTestSteps","useEffect","handleMessage","messageEvent","steps","statusEmoji","AnimatedBars","sortedTestSteps","testStepStatusEmojis","Fragment","Accordion.Root","AccordionComponent","testStep","index","_b","testEventSchema","union","object","type","literal","exitCode","number","nullable","optional","isRunning","boolean","array","content","string","timestamp","testEventQueueSchema","simpleReducer","prev","getNext","TestOutput","state","dispatch","useReducer","version","lines","lastMessage","useEventSource","URLSearchParams","parsed","JSON","parse","safeParse","success","console","error","flatten","event","sort","className","TestRunner","onRun","role","StopTest","String","ClearTest","onClear","line","dangerouslySetInnerHTML","__html","toHtml","fetcher","useFetcher","peRedirectInput","usePERedirectInput","latestOnRun","current","Form","method","action","latestOnClear","onStop","latestOnStop","Tests","playgroundAppInfo","TestUI","inBrowserTestKey","setInBrowserTestKey","useUserHasAccess","DeferredEpicVideo"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5]}
|