{"version":3,"sources":["utils/detectHost.ts","utils/releases.ts","utils/groupBy.ts","config.ts","utils/meta.ts","utils/formatRelease.ts","components/OSIcon.tsx","components/AlternativeDownloads.tsx","components/ShowcasedDownload.tsx","components/Releases.tsx","hooks/useReleases.ts","theme.ts","components/SVGGradientProvider.tsx","Guides.tsx","hooks/useConfig.ts","instructions.ts","Repositories.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["UnsupportedHost","Symbol","detectHost","a","detectHostUserAgentData","userAgentDataHost","userAgentHost","detectHostUserAgent","platform","arch","navigator","userAgentData","getHighEntropyValues","architecture","bitness","ourPlatform","ourArch","userAgent","includes","parseReleases","meta","baseUrl","entries","map","entry","resolvedUrl","URL","url","toString","os","splitReleases","releases","host","hostLatestRelease","undefined","otherLatestReleases","find","x","filter","sortReleases","sort","b","localeCompare","groupReleasesByPlatform","fn","release","reduce","acc","item","key","config","load","remoteConfigPath","envKeyPrefix","fetchMeta","fetch","headers","Accept","res","json","resBody","isMeta","Error","shape","getExt","filename","slice","lastIndexOf","formatReleaseGeneric","r","ext","name","text","formatReleaseLinux","subtext","formatReleaseMacos","formatReleaseWindows","formatRelease","OSIcon","props","src","style","width","height","alt","AlternativeDownloads","React","memo","Typography","variant","gutterBottom","Stack","direction","xs","sm","justifyContent","sx","flexBasis","Object","spacing","alignItems","Download","Button","href","target","display","ml","flexDirection","Box","DisabledDownload","alignSelf","disabled","ShowcasedDownload","ShowReleases","NoReleases","component","Releases","useState","state","status","setStatus","useEffect","loadMeta","metaUrl","Promise","allSettled","loadMetaResult","detectHostResult","error","String","reason","value","hostInfo","grouped","data","useReleases","CircularProgress","keys","length","mainSvgGradientId","mainGradient","textGradientStyle","background","WebkitBackgroundClip","WebkitTextFillColor","gradientedBackgroundButton","color","boxShadow","baseTheme","createTheme","palette","mode","typography","fontFamily","h1","fontSize","lineHeight","textTransform","letterSpacing","h2","fontWeight","body1","body2","overline","button","borderRadius","theme","components","MuiCssBaseline","styleOverrides","backgroundColor","MuiLinearProgress","bar","colorPrimary","MuiCircularProgress","circle","stroke","MuiCard","root","backgroundImage","padding","MuiCardContent","MuiCardActions","MuiTabs","indicator","MuiTab","MuiFab","primary","MuiPaper","MuiAccordion","content","MuiButton","borderColor","containedPrimary","containedSecondary","outlinedPrimary","borderWidth","textPrimary","MuiListItemButton","MuiMenuItem","MuiDialog","paper","SVGGradientProvider","children","id","x1","y1","x2","y2","offset","stopColor","HelpLinks","link","icon","BookOutlined","Guides","Card","startIcon","useConfig","cache","setCache","then","val","yumInstructions","repoName","packageName","Repositories","repoUrl","cfg","title","instructions","aptRepoUrl","aptRepoSourceName","aptPackageName","yumRepoUrl","yumRepoSourceName","yumPackageName","Repository","CardContent","overflow","join","App","StyledEngineProvider","injectFirst","ThemeProvider","CssBaseline","position","top","left","objectFit","zIndex","Container","maxWidth","m","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"yTAKaA,EAAkBC,OAAO,yBAEzBC,EAAU,uCAAG,8BAAAC,EAAA,sEAGQC,IAHR,YAGlBC,EAHkB,iDAKfA,GALe,YAQlBC,EAAgBC,KARE,yCAUfD,GAVe,gCAcjB,CAAEE,SAAU,QAASC,KAAM,QAdV,2CAAH,qDAiBVL,EAAuB,uCAAG,0CAAAD,EAAA,2DAGXO,UAAlBC,EAH6B,EAG7BA,cAH6B,yCAM5B,MAN4B,uBAU7BA,EAAcC,qBAAqB,CAAC,eAAgB,YAVvB,mBAS7BC,EAT6B,EAS7BA,aAAcC,EATe,EASfA,QAASN,EATM,EASNA,SAG1BK,EAZgC,0CAa5B,MAb4B,WAgBjCE,EAA0C,KAC1CC,EAAkC,KAErB,UAAbR,EACFO,EAAc,SACQ,YAAbP,EACTO,EAAc,QACQ,UAAbP,IACTO,EAAc,SAGK,QAAjBF,GAAsC,OAAZC,EAC5BE,EAAU,QACgB,QAAjBH,GAAqC,MAAXC,IACnCE,EAAU,OAGQ,OAAhBD,GAAoC,OAAZC,EAjCS,0CAkC5B,CAAER,SAAUO,EAAaN,KAAMO,IAlCH,iCAqC9B,MArC8B,4CAAH,qDAwCvBT,EAAsB,WACjC,IAAMU,EAAYP,UAAUO,UAC5B,OAAIA,EAAUC,SAAS,UACjBD,EAAUC,SAAS,SACd,CAAEV,SAAU,SAAUC,KAAM,OAE5B,CAAED,SAAU,SAAUC,KAAM,SAE5BQ,EAAUC,SAAS,WACrB,CAAEV,SAAU,QAASC,KAAM,OACzBQ,EAAUC,SAAS,SACrB,CAAEV,SAAU,QAASC,KAAM,OAG7B,M,OC7DIU,EAAgB,SAACC,EAAYC,GAAb,OAC3BD,EAAKE,QAAQC,KAAI,SAACC,GAChB,IARkBhB,EAQZiB,EAAc,IAAIC,IAAIF,EAAMG,IAAKN,GAASO,WAC1CC,GATYrB,EASMgB,EAAMhB,UARnBU,SAAS,SAAiB,QACnCV,EAASU,SAAS,QAAUV,EAASU,SAAS,UAAkB,QAC7D,UAOL,OAAO,2BACFM,GADL,IAEEG,IAAKF,EACLI,KACAJ,oBASOK,EAAgB,SAC3BC,EACAC,GAEA,GAAIA,IAAShC,EACX,MAAO,CACLiC,uBAAmBC,EACnBC,oBAAqBJ,GAIzB,IAAME,EAAoBF,EAASK,MACjC,SAACC,GAAD,OAAOA,EAAE5B,OAASuB,EAAKvB,MAAQ4B,EAAE7B,WAAawB,EAAKxB,YAErD,MAAO,CACLyB,oBACAE,oBAAqBJ,EAASO,QAAO,SAACD,GAAD,OAAOA,IAAMJ,OAIzCM,EAAe,SAACR,GAAD,OAC1B,YAAIA,GAAUS,MAAK,SAACrC,EAAGsC,GAAJ,OAAUtC,EAAEK,SAASkC,cAAcD,EAAEjC,cAE7CmC,EAA0B,SACrCZ,GAEA,OC1DAa,ED4DE,SAACC,GAAD,OAAaA,EAAQrC,UADrBuB,ECzDSe,QAAO,SAACC,EAAKC,GAAU,IAAD,EACzBC,EAAML,EAAGI,GACf,OAAO,2BACFD,GADL,kBAEGE,EAFH,gCAEcF,EAAIE,UAFlB,QAE0B,IAF1B,CAE+BD,QAE9B,IAVkB,IAErBJ,G,QCgBaM,EAPAC,eAAkB,CAC/BC,iBAAkB,eAClBC,aAAc,SCDHC,EAAS,uCAAG,WAAO3B,GAAP,iBAAAxB,EAAA,sEACLoD,MAAM5B,EAAK,CAC3B6B,QAAS,CACPC,OAAQ,sBAHW,cACjBC,EADiB,gBAMQA,EAAIC,OANZ,UAMjBC,EANiB,QAOnBC,EAAOD,GAPY,yCAQdA,GARc,aAUjB,IAAIE,MAAM,gBAVO,2CAAH,sDAahBD,EAAS,SAACE,GACd,OAAiB,OAAVA,GAAmC,kBAAVA,GAAsB,YAAaA,G,iBCN/DC,EAAS,SAACC,GAAD,OACbA,EAASC,MAAMD,EAASE,YAAY,KAAO,IAEvCC,EAAuB,SAACC,GAC5B,IAAMC,EAAMN,EAAOK,EAAEE,MACrB,MAAO,CAAEC,KAAK,GAAD,OAAKH,EAAE7D,SAAP,YAAmB6D,EAAE5D,KAArB,aAA8B6D,EAA9B,OAGTG,EAAqB,SAACJ,GAC1B,IAAMC,EAAMN,EAAOK,EAAEE,MAarB,MAAO,CAAEC,KAXsB,OAAVH,EAAE5D,KAAgB,cAAlB,gBAA2C4D,EAAE5D,MAWrCiE,QARnB,QAARJ,EACI,iBACQ,QAARA,EACA,cACQ,QAARA,EACA,cADA,WAEIA,EAFJ,OAOFK,EAAqB,SAACN,GAC1B,IAAMC,EAAMN,EAAOK,EAAEE,MAYrB,MAAO,CAAEC,KARI,UAAXH,EAAE5D,KACE,yBACW,QAAX4D,EAAE5D,KACF,iBADA,mBAEY4D,EAAE5D,MAISiE,QAFA,QAARJ,EAAgB,cAAgBA,IAKjDM,EAAuB,SAACP,GAC5B,IAAMC,EAAMN,EAAOK,EAAEE,MASrB,MAAO,CAAEC,KANuB,QAAXH,EAAE5D,KAAiB,UAAnB,kBAA0C4D,EAAE5D,MAMpCiE,QAFnB,QAARJ,OAAgBpC,EAAoB,QAARoC,EAAgB,cAAgBA,IAKjDO,EAnEO,SAACR,GACrB,OAAQA,EAAExC,IACR,IAAK,QACH,OAAO4C,EAAmBJ,GAC5B,IAAK,QACH,OAAOM,EAAmBN,GAC5B,IAAK,UACH,OAAOO,EAAqBP,GAC9B,QACE,OAAOD,EAAqBC,K,OCbrBS,EAA+B,SAACC,GAAD,OAC1C,qBACEC,IAAG,yBAAoBD,EAAMlD,GAA1B,cACHoD,MAAO,CAAEC,MAAO,GAAIC,OAAQ,IAC5BC,IAAK,MAAQL,EAAMlD,MCKjBwD,EAAwCC,IAAMC,MAAK,SAACR,GAAW,IAC3DhD,EAAagD,EAAbhD,SAER,OACE,eAAC,IAAD,CAAKmD,MAAO,OAAZ,UACE,cAACM,EAAA,EAAD,CAAYC,QAAQ,KAAKC,cAAY,EAArC,+BAGA,cAACC,EAAA,EAAD,CACEC,UAAW,CAAEC,GAAI,SAAUC,GAAI,OAC/BC,eAAe,gBACfC,GAAI,CACF,MAAO,CACLC,UAAW,SALjB,SASGC,OAAO5E,QAAQS,GAAUR,KAAI,mCAAEf,EAAF,KAAYuB,EAAZ,YAC5B,cAAC4D,EAAA,EAAD,CACEC,UAAU,SACVO,QAAS,EAETH,GAAI,CACFI,WAAY,UALhB,SAQGrE,EAASR,KAAI,SAACsB,GAAD,OACZ,cAAC,EAAD,CAA6BA,QAASA,GAAvBA,EAAQ0B,UANpB/D,cAmBX6F,EAAoCf,IAAMC,MAAK,SAACR,GAAW,IACvDlC,EAAYkC,EAAZlC,QADsD,EAEpCgC,EAAchC,GAAhC2B,EAFsD,EAEtDA,KAAME,EAFgD,EAEhDA,QAEd,OACE,cAAC,IAAD,UACE,cAAC4B,EAAA,EAAD,CAAQC,KAAM1D,EAAQlB,IAAK6E,OAAO,SAAlC,SACE,eAAC,IAAD,CAAKC,QAAQ,OAAOL,WAAW,SAA/B,UACE,cAAC,EAAD,CAAQvE,GAAIgB,EAAQhB,KACpB,cAAC,IAAD,CAAK6E,GAAI,IACT,eAAC,IAAD,CAAKD,QAAQ,OAAOE,cAAc,SAAlC,UACE,cAAC,IAAD,UAAMnC,IACN,cAAC,IAAD,UACE,cAACgB,EAAA,EAAD,CAAYC,QAAQ,QAApB,SAA6Bf,mBAS5BW,ICzDTgB,EAAoC,SAACtB,GAAW,IAC5ClC,EAAYkC,EAAZlC,QAD2C,EAEzBgC,EAAchC,GAAhC2B,EAF2C,EAE3CA,KAAME,EAFqC,EAErCA,QAEd,OACE,eAACiB,EAAA,EAAD,CAAOQ,QAAS,EAAGP,UAAU,SAASQ,WAAW,SAAjD,UACE,cAACE,EAAA,EAAD,CAAQb,QAAQ,YAAYc,KAAM1D,EAAQlB,IAAK6E,OAAO,SAAtD,SACE,eAACb,EAAA,EAAD,CAAOQ,QAAS,EAAGP,UAAU,MAAMQ,WAAW,SAA9C,UACE,cAAC,EAAD,CAAQvE,GAAIgB,EAAQhB,KACpB,cAAC+E,EAAA,EAAD,CAAKF,GAAI,IAFX,oBAMF,eAACE,EAAA,EAAD,CAAKH,QAAQ,OAAOE,cAAc,SAASP,WAAW,SAAtD,UACE,cAACQ,EAAA,EAAD,UAAMpC,IACN,cAACoC,EAAA,EAAD,UACE,cAACpB,EAAA,EAAD,CAAYC,QAAQ,QAApB,SAA6Bf,aAOjCmC,EAA6B,WACjC,OACE,cAACD,EAAA,EAAD,CAAKE,UAAU,SAAf,SACE,cAACR,EAAA,EAAD,CAAQb,QAAQ,YAAYc,KAAK,GAAGC,OAAO,SAASO,UAAQ,EAA5D,SACE,cAACpB,EAAA,EAAD,CAAOQ,QAAS,EAAGP,UAAU,MAAMQ,WAAW,SAA9C,+BAQOY,EA5C4B,SAACjC,GAAW,IAC7ClC,EAAYkC,EAAZlC,QACR,OAAOA,EAAU,cAAC,EAAD,CAAUA,QAASA,IAAc,cAAC,EAAD,KCiB9CoE,EAAgC,SAAClC,GAAW,IACxChD,EAAagD,EAAbhD,SAER,OACE,qCACE,cAAC,EAAD,CAAmBc,QAASd,EAASE,oBACrC,cAAC,EAAD,CAAsBF,SAAUA,EAASI,0BAKzC+E,EAAuB,WAC3B,OACE,qCACE,cAAC,EAAD,CAAmBrE,aAASX,IAC5B,cAAC0E,EAAA,EAAD,CAAKO,UAAU,IAAf,oCAKSC,EAzCY,WACzB,IAAMrF,ECkBmB,WAAyB,IAAD,EACrBsF,mBAA2B,CAAEC,MAAO,YADf,mBAC1CC,EAD0C,KAClCC,EADkC,KAgDjD,OA7CAC,qBAAU,WACR,IAAMC,EAAQ,uCAAG,gCAAAvH,EAAA,sEACW+C,EADX,uBACPyE,EADO,EACPA,QADO,SAEIrE,EAAUqE,GAFd,cAETvG,EAFS,yBAGR,CAAEuG,UAASvG,SAHH,2CAAH,qDAMRwB,EAAE,uCAAG,oDAAAzC,EAAA,sEACwCyH,QAAQC,WAAW,CAClEH,IACAxH,MAHO,sCACF4H,EADE,KACcC,EADd,KAMqB,aAA1BD,EAAeP,OANV,uBAOPC,EAAU,CAAEF,MAAO,QAASU,MAAOC,OAAOH,EAAeI,UAPlD,+BAUiBJ,EAAeK,MAAjC/G,EAVC,EAUDA,KAAMuG,EAVL,EAUKA,QAEkB,aAA5BI,EAAiBR,OAZZ,wBAaPC,EAAU,CAAEF,MAAO,QAASU,MAAOC,OAAOF,EAAiBG,UAbpD,2BAgBHE,EAAWL,EAAiBI,MAE5BpG,EAAWZ,EAAcC,EAAMuG,GAlB5B,EAoB0C7F,EACjDS,EAAaR,GACbqG,GAFMnG,EApBC,EAoBDA,kBAAmBE,EApBlB,EAoBkBA,oBAKrBkG,EAAU1F,EAAwBR,GAExCqF,EAAU,CACRF,MAAO,QACPgB,KAAM,CACJrG,oBACAE,oBAAqBkG,KA/BhB,4CAAH,qDAmCHzF,MACJ,IAEI2E,EDlEUgB,GAEjB,OACE,mCACsB,YAAnBxG,EAASuF,MACR,cAACkB,EAAA,EAAD,IACqB,UAAnBzG,EAASuF,YAE2BpF,IAApCH,EAASuG,KAAKrG,mBAC0C,IAA1DiE,OAAOuC,KAAK1G,EAASuG,KAAKnG,qBAAqBuG,OAF/C,cAAC,EAAD,IAKA,cAAC,EAAD,CAAc3G,SAAUA,EAASuG,U,SEZ5BK,GAAoB,oBACpBC,GAAe,mDACfC,GAAoB,CAC/BC,WAAW,WAAD,OAAaF,IACvBG,qBAAsB,OACtBC,oBAAqB,eAEVC,GAA+C,CAC1DH,WAAYF,GACZM,MAAO,OACP,UAAW,CACTC,UAAW,kCAEb,WAAY,CACVA,UAAW,sCAEb,aAAc,CACZL,WAAY,UACZI,MAAO,SAGLE,GAAYC,aAAY,CAC5BC,QAAS,CACPC,KAAM,QAERC,WAAY,CACVC,WAAY,WACZC,GAAI,CACFC,SAAU,OACVC,WAAY,OACZC,cAAe,YACfC,cAAe,UAEjBC,GAAI,CACFJ,SAAU,UACVE,cAAe,YACfG,WAAY,IACZF,cAAe,SACfZ,MAAO,QAETe,MAAO,CACLN,SAAU,UACVK,WAAY,IACZJ,WAAY,EACZV,MAAO,QAETgB,MAAO,CACLP,SAAU,UACVT,MAAO,WAETiB,SAAU,CACRL,cAAe,SACfH,SAAU,OACVT,MAAO,aAETkB,OAAQ,CACNN,cAAe,SACfH,SAAU,SAGd5F,MAAO,CACLsG,aAAc,KAwLHC,GApLDjB,aACZ,CACEkB,WAAY,CACVC,eAAgB,CACdC,eAAgB,CACd,uBAAwB,CACtBvF,MAAO,GACPC,OAAQ,IAEV,6BAA8B,CAC5BD,MAAO,GACPC,OAAQ,GACRuF,gBAAiB,WAEnB,6BAA8B,CAC5BxF,MAAO,GACPC,OAAQ,GACRuF,gBAAiB,WAEnB,8BAA+B,CAC7BA,gBAAiB,aAIvBC,kBAAmB,CACjBF,eAAgB,CACdG,IAAK,CACH9B,WAAYF,IAEdiC,aAAc,CACZH,gBAAiB,aAIvBI,oBAAqB,CACnBL,eAAgB,CACdM,OAAQ,CACNC,OAAO,QAAD,OAAUrC,GAAV,QAIZsC,QAAS,CACPR,eAAgB,CACdS,KAAM,CACJR,gBAAiB,UACjBS,gBAAiB,OACjBC,QAAS,eAIfC,eAAgB,CACdZ,eAAgB,CACdS,KAAM,CACJE,QAAS,OAIfE,eAAgB,CACdb,eAAgB,CACdS,KAAM,CACJE,QAAS,OAIfG,QAAS,CACPd,eAAgB,CACde,UAAU,eACLvC,MAITwC,OAAQ,CACNhB,eAAgB,CACdS,KAAM,CACJrB,cAAe,OACfC,cAAe,QACfZ,MAAO,UACPc,WAAY,IACZ,iBAAkBnB,MAIxB6C,OAAQ,CACNjB,eAAgB,CACdkB,QAAQ,aACNtB,aAAc,GACXpB,MAIT2C,SAAU,CACRnB,eAAgB,CACdS,KAAM,CACJ/B,UAAW,OACXuB,gBAAiB,aAIvBmB,aAAc,CACZpB,eAAgB,CACdS,KAAM,CACJ,WAAY,CACVY,QAAS,WAKjBC,UAAW,CACTtB,eAAgB,CACdS,KAAM,CACJ,UAAW,CACTc,YAAa,UACbtB,gBAAiB,8BAGrBuB,iBAAiB,2BACZhD,IADW,IAEd,UAAW,CACTyB,gBAAiB,YACjBvB,UAAW,uCAGf+C,mBAAoB,CAClBhD,MAAO,QACPW,cAAe,OACfa,gBAAiB,UACjBvB,UAAW,OACX,UAAW,CACTL,WAAY,UACZI,MAAO,OACPC,UAAW,QAEb,aAAc,CACZL,WAAY,YAGhBqD,gBAAiB,CACfjD,MAAO,OACP8C,YAAa,UACbI,YAAa,EACb,aAAc,CACZJ,YAAa,YAGjBK,YAAa,CACXxC,cAAe,OACfX,MAAO,UAIboD,kBAAmB,CACjB7B,eAAgB,CACdS,KAAM,CACJR,gBAAiB,UACjB,iBAAkBzB,GAClB,UAAW,CACTyB,gBAAiB,cAKzB6B,YAAa,CACX9B,eAAgB,CACdS,KAAM,CACJ,iBAAkBjC,MAIxBuD,UAAW,CACT/B,eAAgB,CACdgC,MAAO,CACL/B,gBAAiB,UACjBS,gBAAiB,YAM3B/B,ICvPWsD,GAAgC,SAAC,GAAkB,IAAhBC,EAAe,EAAfA,SAC9C,OACE,qCACE,qBAAK1H,MAAO,CAAEE,OAAQ,EAAGD,MAAO,EAAGuB,QAAS,SAA5C,SACE,iCAAgBmG,GAAIjE,GAAmBkE,GAAG,IAAIC,GAAG,IAAIC,GAAG,IAAIC,GAAG,IAA/D,UACE,sBAAMC,OAAO,KAAKC,UAAU,YAC5B,sBAAMD,OAAO,OAAOC,UAAU,iBAGjCP,M,UCTMQ,GAAY,CACvB,CACEC,KAAM,0CACN7I,KAAM,gDACN8I,KAAM,cAACC,GAAA,EAAD,KAER,CACEF,KAAM,gCACN7I,KAAM,gBACN8I,KAAM,cAACC,GAAA,EAAD,MAGGC,GAAmB,WAC9B,OACE,cAACC,EAAA,EAAD,UACE,eAAC7H,EAAA,EAAD,CAAOQ,QAAS,EAAhB,UACE,cAACX,EAAA,EAAD,CAAYC,QAAQ,KAAKC,cAAY,EAArC,0BAGA,cAACC,EAAA,EAAD,CAAOQ,QAAS,EAAhB,SACGgH,GAAU5L,KAAI,SAAC6L,GAAD,OACb,cAAC9G,EAAA,EAAD,CAEEC,KAAM6G,EAAKA,KACX5G,OAAO,SACPf,QAAQ,OACRgI,UAAWL,EAAKC,KAChBrH,GAAI,CAAED,eAAgB,cANxB,SAQGqH,EAAK7I,MAPD6I,EAAK7I,iB,UCVTmJ,GAZU,WAAsB,IAAD,EAClBrG,mBAAwB,MADN,mBACrCsG,EADqC,KAC9BC,EAD8B,KAS5C,OANAnG,qBAAU,WACHvE,EAAO2K,MAAK,SAACC,GAChBF,EAASE,QAEV,IAEIH,GCCII,GAAkB,SAC7BpM,EACAqM,EACAC,GAEA,MAAO,CAAC,yCAAD,OACoCD,EADpC,oBAEDA,EAFC,oBAGGA,GAHH,kBAIMrM,GAJN,0DAQesM,KCrBXC,GAAyB,WACpC,IDLAC,EACAH,EACAC,ECGMG,EAAMV,KACZ,OAAY,OAARU,EACK,6BAGP,qCACE,cAAC,GAAD,CACEC,MAAM,YACNC,cDbNH,ECcQC,EAAIG,WDbZP,ECcQI,EAAII,kBDbZP,ECcQG,EAAIK,eDZL,CAAC,2CAAD,kCAEsBN,EAFtB,mDAEwEH,EAFxE,SAGL,sBAHK,+BAImBC,OCWtB,cAAC,GAAD,CACEI,MAAM,YACNC,aAAcP,GACZK,EAAIM,WACJN,EAAIO,kBACJP,EAAIQ,sBAORC,GAAkE,SAAC,GAGlE,IAFLR,EAEI,EAFJA,MACAC,EACI,EADJA,aAEA,OACE,cAACd,EAAA,EAAD,UACE,eAACsB,GAAA,EAAD,WACE,cAACtJ,EAAA,EAAD,CAAYC,QAAQ,KAAKC,cAAY,EAArC,SACG2I,IAEH,cAACzH,EAAA,EAAD,CAAK1B,MAAM,OAAO6J,SAAS,UAA3B,SACE,+BACE,8BAAMT,EAAaU,KAAK,kBCSrBC,GA5CO,WACpB,OACE,cAAC,GAAD,UACE,cAACC,EAAA,EAAD,CAAsBC,aAAW,EAAjC,SACE,cAACC,EAAA,EAAD,CAAe9E,MAAOA,GAAtB,SACE,eAAC+E,EAAA,EAAD,WACE,qBACErK,IAAI,8BACJC,MAAO,CACLqK,SAAU,WACVC,IAAK,EACLC,KAAM,EACNrK,OAAQ,OACRsK,UAAW,UACXC,QAAS,KAGb,cAACC,EAAA,EAAD,CAAWxI,UAAU,MAAMyI,SAAS,KAApC,SACE,eAACjK,EAAA,EAAD,CAAOQ,QAAS,EAAG0J,EAAG,EAAtB,UACE,cAACrC,EAAA,EAAD,UACE,eAAC7H,EAAA,EAAD,CAAOQ,QAAS,EAAGC,WAAW,SAA9B,UACE,qBACEpB,IAAI,4BACJI,IAAI,WACJF,MAAO,IACPC,OAAQ,MAEV,cAACK,EAAA,EAAD,CAAYC,QAAQ,KAApB,0DAGA,cAAC,EAAD,SAGJ,cAAC,GAAD,IACA,cAAC,GAAD,mBC3BDqK,GAdS,SAACC,GACnBA,GAAeA,aAAuBC,UACnC,8BAAqBnC,MACxB,YAAkD,IAA/CoC,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QACjCJ,EAAOF,GACPG,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAQN,OCLhBO,IAASC,OACP,cAAC,IAAMC,WAAP,UACE,cAAC,GAAD,MAEFC,SAASC,eAAe,SAG1BZ,O","file":"static/js/main.5ae37240.chunk.js","sourcesContent":["import { Release } from \"./releases\";\n\nexport type HostInfo = Pick<Release, \"platform\" | \"arch\">;\n\n// For when the host is detected but it is explicitly unsupported.\nexport const UnsupportedHost = Symbol(\"detectHostUnsupported\");\n\nexport const detectHost = async (): Promise<\n  HostInfo | typeof UnsupportedHost\n> => {\n  const userAgentDataHost = await detectHostUserAgentData();\n  if (userAgentDataHost) {\n    return userAgentDataHost;\n  }\n\n  const userAgentHost = detectHostUserAgent();\n  if (userAgentHost) {\n    return userAgentHost;\n  }\n\n  // fallback: most common\n  return { platform: \"win32\", arch: \"x64\" };\n};\n\nexport const detectHostUserAgentData = async (): Promise<\n  HostInfo | null | typeof UnsupportedHost\n> => {\n  const { userAgentData } = navigator;\n  if (!userAgentData) {\n    // User agent data unsupported in this browser.\n    return null;\n  }\n\n  const { architecture, bitness, platform } =\n    await userAgentData.getHighEntropyValues([\"architecture\", \"bitness\"]);\n\n  if (!architecture) {\n    return null;\n  }\n\n  let ourPlatform: null | Release[\"platform\"] = null;\n  let ourArch: null | Release[\"arch\"] = null;\n\n  if (platform === \"macOS\") {\n    ourPlatform = \"darwin\";\n  } else if (platform === \"Windows\") {\n    ourPlatform = \"win32\";\n  } else if (platform === \"Linux\") {\n    ourPlatform = \"linux\";\n  }\n\n  if (architecture === \"arm\" && bitness === \"64\") {\n    ourArch = \"arm64\";\n  } else if (architecture === \"x86\" && bitness == \"64\") {\n    ourArch = \"x64\";\n  }\n\n  if (ourPlatform !== null && ourArch !== null) {\n    return { platform: ourPlatform, arch: ourArch };\n  }\n\n  return null;\n};\n\nexport const detectHostUserAgent = (): HostInfo | null => {\n  const userAgent = navigator.userAgent;\n  if (userAgent.includes(\"Mac OS\")) {\n    if (userAgent.includes(\"Intel\")) {\n      return { platform: \"darwin\", arch: \"x64\" };\n    } else {\n      return { platform: \"darwin\", arch: \"arm64\" };\n    }\n  } else if (userAgent.includes(\"Windows\")) {\n    return { platform: \"win32\", arch: \"x64\" };\n  } else if (userAgent.includes(\"Linux\")) {\n    return { platform: \"linux\", arch: \"x64\" };\n  }\n\n  return null;\n};\n","import { HostInfo, UnsupportedHost } from \"./detectHost\";\nimport { groupBy } from \"./groupBy\";\nimport { Entry, Meta } from \"./meta\";\n\nexport type OS = \"linux\" | \"windows\" | \"macos\";\n\nexport type Release = Entry & {\n  resolvedUrl: string;\n  os: OS;\n};\n\nconst platformToOs = (platform: string): OS => {\n  if (platform.includes(\"linux\")) return \"linux\";\n  if (platform.includes(\"mac\") || platform.includes(\"darwin\")) return \"macos\";\n  return \"windows\";\n};\n\nexport const parseReleases = (meta: Meta, baseUrl: string): Release[] =>\n  meta.entries.map((entry) => {\n    const resolvedUrl = new URL(entry.url, baseUrl).toString();\n    const os = platformToOs(entry.platform);\n    return {\n      ...entry,\n      url: resolvedUrl,\n      os,\n      resolvedUrl,\n    };\n  });\n\nexport type SplitReleases = {\n  hostLatestRelease?: Release;\n  otherLatestReleases: Release[];\n};\n\nexport const splitReleases = (\n  releases: Release[],\n  host: HostInfo | typeof UnsupportedHost\n): SplitReleases => {\n  if (host === UnsupportedHost) {\n    return {\n      hostLatestRelease: undefined,\n      otherLatestReleases: releases,\n    };\n  }\n\n  const hostLatestRelease = releases.find(\n    (x) => x.arch === host.arch && x.platform === host.platform\n  );\n  return {\n    hostLatestRelease,\n    otherLatestReleases: releases.filter((x) => x !== hostLatestRelease),\n  };\n};\n\nexport const sortReleases = (releases: Release[]): Release[] =>\n  [...releases].sort((a, b) => a.platform.localeCompare(b.platform));\n\nexport const groupReleasesByPlatform = (\n  releases: Release[]\n): Record<Release[\"platform\"], Release[]> => {\n  return groupBy<Release, Release[\"platform\"]>(\n    releases,\n    (release) => release.platform\n  );\n};\n","export const groupBy = <T, U extends string>(\n  arr: T[],\n  fn: (item: T) => U\n): Record<U, T[]> => {\n  return arr.reduce((acc, item) => {\n    const key = fn(item);\n    return {\n      ...acc,\n      [key]: [...(acc[key] ?? []), item],\n    };\n  }, {} as Record<U, T[]>);\n};\n","import { load, PlainConfig } from \"hybridconfig\";\n\ntype AllowedKeys =\n  | \"metaUrl\"\n  | \"aptRepoUrl\"\n  | \"aptRepoSourceName\"\n  | \"aptPackageName\"\n  | \"yumRepoUrl\"\n  | \"yumRepoSourceName\"\n  | \"yumPackageName\";\n\nconst config = load<AllowedKeys>({\n  remoteConfigPath: \"/config.json\",\n  envKeyPrefix: \"APP_\",\n});\n\nexport type Config = PlainConfig<AllowedKeys>;\n\nexport default config;\n","export type Entry = {\n  name: string;\n  url: string;\n  platform: string;\n  arch: string;\n};\n\nexport type Meta = {\n  version: string;\n  entries: Entry[];\n};\n\nexport const fetchMeta = async (url: string): Promise<Meta> => {\n  const res = await fetch(url, {\n    headers: {\n      Accept: \"application/json\",\n    },\n  });\n  const resBody: unknown = await res.json();\n  if (isMeta(resBody)) {\n    return resBody;\n  }\n  throw new Error(\"invalid meta\");\n};\n\nconst isMeta = (shape: unknown): shape is Meta => {\n  return shape !== null && typeof shape === \"object\" && \"entries\" in shape;\n};\n","import { Release } from \"./releases\";\n\nexport type ReleaseData = {\n  text: string;\n  subtext?: string;\n};\n\nconst formatRelease = (r: Release): ReleaseData => {\n  switch (r.os) {\n    case \"linux\":\n      return formatReleaseLinux(r);\n    case \"macos\":\n      return formatReleaseMacos(r);\n    case \"windows\":\n      return formatReleaseWindows(r);\n    default:\n      return formatReleaseGeneric(r);\n  }\n};\n\nconst getExt = (filename: string) =>\n  filename.slice(filename.lastIndexOf(\".\") + 1);\n\nconst formatReleaseGeneric = (r: Release): ReleaseData => {\n  const ext = getExt(r.name);\n  return { text: `${r.platform} ${r.arch} (${ext})` };\n};\n\nconst formatReleaseLinux = (r: Release): ReleaseData => {\n  const ext = getExt(r.name);\n\n  const platformName = r.arch == \"x64\" ? \"Linux amd64\" : `Linux ${r.arch}`;\n\n  const distribution =\n    ext === \"deb\"\n      ? \"Debian package\"\n      : ext === \"rpm\"\n      ? \"RPM package\"\n      : ext === \"zip\"\n      ? \"ZIP-archive\"\n      : `(${ext})`;\n\n  return { text: platformName, subtext: distribution };\n};\n\nconst formatReleaseMacos = (r: Release): ReleaseData => {\n  const ext = getExt(r.name);\n\n  // For macOS, we convert architectures to the more user-friendly names.\n  const platformName =\n    r.arch === \"arm64\"\n      ? \"macOS on Apple Silicon\"\n      : r.arch === \"x64\"\n      ? \"macOS on Intel\"\n      : `macOS on ${r.arch}`;\n\n  const distribution = ext === \"zip\" ? \"ZIP-archive\" : ext;\n\n  return { text: platformName, subtext: distribution };\n};\n\nconst formatReleaseWindows = (r: Release): ReleaseData => {\n  const ext = getExt(r.name);\n\n  // For Windows, x64 is default, so we just omit the arch.\n  const platformName = r.arch === \"x64\" ? \"Windows\" : `Windows ${r.arch}`;\n\n  // The .exe installer is just the default option for windows.\n  const distribution =\n    ext === \"exe\" ? undefined : ext === \"zip\" ? \"ZIP-archive\" : ext;\n\n  return { text: platformName, subtext: distribution };\n};\n\nexport default formatRelease;\n","import React from \"react\";\nimport { OS } from \"../utils/releases\";\n\nexport const OSIcon: React.FC<{ os: OS }> = (props) => (\n  <img\n    src={`/assets/social-${props.os}-white.svg`}\n    style={{ width: 30, height: 30 }}\n    alt={\"os \" + props.os}\n  />\n);\n","import { Button, Stack, Typography } from \"@mui/material\";\nimport { Box } from \"@mui/system\";\nimport React from \"react\";\nimport { ReleasesData } from \"../hooks/useReleases\";\nimport formatRelease from \"../utils/formatRelease\";\nimport { Release } from \"../utils/releases\";\nimport { OSIcon } from \"./OSIcon\";\n\ntype Props = {\n  releases: ReleasesData[\"otherLatestReleases\"];\n};\n\nconst AlternativeDownloads: React.FC<Props> = React.memo((props) => {\n  const { releases } = props;\n\n  return (\n    <Box width={\"100%\"}>\n      <Typography variant=\"h6\" gutterBottom>\n        Also available on\n      </Typography>\n      <Stack\n        direction={{ xs: \"column\", sm: \"row\" }}\n        justifyContent=\"space-between\"\n        sx={{\n          \"> *\": {\n            flexBasis: \"100%\",\n          },\n        }}\n      >\n        {Object.entries(releases).map(([platform, releases]) => (\n          <Stack\n            direction=\"column\"\n            spacing={1}\n            key={platform}\n            sx={{\n              alignItems: \"center\",\n            }}\n          >\n            {releases.map((release) => (\n              <Download key={release.name} release={release} />\n            ))}\n          </Stack>\n        ))}\n      </Stack>\n    </Box>\n  );\n});\n\ntype DownloadProps = {\n  release: Release;\n};\n\nconst Download: React.FC<DownloadProps> = React.memo((props) => {\n  const { release } = props;\n  const { text, subtext } = formatRelease(release);\n\n  return (\n    <Box>\n      <Button href={release.url} target=\"_blank\">\n        <Box display=\"flex\" alignItems=\"center\">\n          <OSIcon os={release.os} />\n          <Box ml={1} />\n          <Box display=\"flex\" flexDirection=\"column\">\n            <Box>{text}</Box>\n            <Box>\n              <Typography variant=\"body2\">{subtext}</Typography>\n            </Box>\n          </Box>\n        </Box>\n      </Button>\n    </Box>\n  );\n});\n\nexport default AlternativeDownloads;\n","import { Box, Button, Stack, Typography } from \"@mui/material\";\nimport React from \"react\";\nimport formatRelease from \"../utils/formatRelease\";\nimport { Release } from \"../utils/releases\";\nimport { OSIcon } from \"./OSIcon\";\n\ntype Props = { release: Release | undefined };\n\nconst ShowcasedDownload: React.FC<Props> = (props) => {\n  const { release } = props;\n  return release ? <Download release={release} /> : <DisabledDownload />;\n};\n\ntype DownloadProps = {\n  release: Release;\n};\n\nconst Download: React.FC<DownloadProps> = (props) => {\n  const { release } = props;\n  const { text, subtext } = formatRelease(release);\n\n  return (\n    <Stack spacing={1} direction=\"column\" alignItems=\"center\">\n      <Button variant=\"contained\" href={release.url} target=\"_blank\">\n        <Stack spacing={1} direction=\"row\" alignItems=\"center\">\n          <OSIcon os={release.os} />\n          <Box ml={1} />\n          Download now\n        </Stack>\n      </Button>\n      <Box display=\"flex\" flexDirection=\"column\" alignItems=\"center\">\n        <Box>{text}</Box>\n        <Box>\n          <Typography variant=\"body2\">{subtext}</Typography>\n        </Box>\n      </Box>\n    </Stack>\n  );\n};\n\nconst DisabledDownload: React.FC = () => {\n  return (\n    <Box alignSelf=\"center\">\n      <Button variant=\"contained\" href=\"\" target=\"_blank\" disabled>\n        <Stack spacing={1} direction=\"row\" alignItems=\"center\">\n          Download now\n        </Stack>\n      </Button>\n    </Box>\n  );\n};\n\nexport default ShowcasedDownload;\n","import { Box, CircularProgress } from \"@mui/material\";\nimport React from \"react\";\nimport { ReleasesData, useReleases } from \"../hooks/useReleases\";\nimport AlternativeDownloads from \"./AlternativeDownloads\";\nimport ShowcasedDownload from \"./ShowcasedDownload\";\n\nconst Releases: React.FC = () => {\n  const releases = useReleases();\n\n  return (\n    <>\n      {releases.state === \"loading\" ? (\n        <CircularProgress />\n      ) : releases.state === \"error\" ? (\n        <NoReleases />\n      ) : releases.data.hostLatestRelease === undefined &&\n        Object.keys(releases.data.otherLatestReleases).length === 0 ? (\n        <NoReleases />\n      ) : (\n        <ShowReleases releases={releases.data} />\n      )}\n    </>\n  );\n};\n\ntype Props = { releases: ReleasesData };\n\nconst ShowReleases: React.FC<Props> = (props) => {\n  const { releases } = props;\n\n  return (\n    <>\n      <ShowcasedDownload release={releases.hostLatestRelease} />\n      <AlternativeDownloads releases={releases.otherLatestReleases} />\n    </>\n  );\n};\n\nconst NoReleases: React.FC = () => {\n  return (\n    <>\n      <ShowcasedDownload release={undefined} />\n      <Box component=\"p\">No releases found.</Box>\n    </>\n  );\n};\n\nexport default Releases;\n","import { useEffect, useState } from \"react\";\nimport {\n  groupReleasesByPlatform,\n  parseReleases,\n  Release,\n  sortReleases,\n  splitReleases,\n} from \"../utils/releases\";\nimport config from \"../config\";\nimport { fetchMeta } from \"../utils/meta\";\nimport { detectHost } from \"../utils/detectHost\";\n\nexport type ReleasesData = {\n  hostLatestRelease?: Release;\n  otherLatestReleases: Record<Release[\"platform\"], Release[]>;\n};\n\nexport type UseReleasesState =\n  | { state: \"loading\" }\n  | { state: \"error\"; error: string }\n  | {\n      state: \"ready\";\n      data: ReleasesData;\n    };\n\nexport const useReleases = (): UseReleasesState => {\n  const [status, setStatus] = useState<UseReleasesState>({ state: \"loading\" });\n\n  useEffect(() => {\n    const loadMeta = async () => {\n      const { metaUrl } = await config;\n      const meta = await fetchMeta(metaUrl);\n      return { metaUrl, meta };\n    };\n\n    const fn = async () => {\n      const [loadMetaResult, detectHostResult] = await Promise.allSettled([\n        loadMeta(),\n        detectHost(),\n      ]);\n\n      if (loadMetaResult.status === \"rejected\") {\n        setStatus({ state: \"error\", error: String(loadMetaResult.reason) });\n        return;\n      }\n      const { meta, metaUrl } = loadMetaResult.value;\n\n      if (detectHostResult.status === \"rejected\") {\n        setStatus({ state: \"error\", error: String(detectHostResult.reason) });\n        return;\n      }\n      const hostInfo = detectHostResult.value;\n\n      const releases = parseReleases(meta, metaUrl);\n\n      const { hostLatestRelease, otherLatestReleases } = splitReleases(\n        sortReleases(releases),\n        hostInfo\n      );\n\n      const grouped = groupReleasesByPlatform(otherLatestReleases);\n\n      setStatus({\n        state: \"ready\",\n        data: {\n          hostLatestRelease,\n          otherLatestReleases: grouped,\n        },\n      });\n    };\n    void fn();\n  }, []);\n\n  return status;\n};\n","import { createTheme, Theme } from \"@mui/material/styles\";\nimport { CSSInterpolation } from \"@mui/system\";\ndeclare module \"@mui/material/styles\" {\n  // eslint-disable-next-line @typescript-eslint/no-empty-interface\n  interface DefaultTheme extends Theme {}\n}\n\nexport const mainSvgGradientId = \"main-svg-gradient\";\nexport const mainGradient = \"linear-gradient(45deg, #C62A1F 0%, #F8C16C 100%)\";\nexport const textGradientStyle = {\n  background: `-webkit-${mainGradient}`,\n  WebkitBackgroundClip: \"text\",\n  WebkitTextFillColor: \"transparent\",\n};\nexport const gradientedBackgroundButton: CSSInterpolation = {\n  background: mainGradient,\n  color: \"#fff\",\n  \"&:hover\": {\n    boxShadow: \"inset 10px 10px 40px #FFFFFF33\",\n  },\n  \"&:active\": {\n    boxShadow: \"inset 14px 14px 30px 9px #30272733\",\n  },\n  \"&:disabled\": {\n    background: \"#303030\",\n    color: \"#fff\",\n  },\n};\nconst baseTheme = createTheme({\n  palette: {\n    mode: \"dark\",\n  },\n  typography: {\n    fontFamily: \"FuturaPT\",\n    h1: {\n      fontSize: \"27px\",\n      lineHeight: \"35px\",\n      textTransform: \"uppercase\",\n      letterSpacing: \"0.5rem\",\n    },\n    h2: {\n      fontSize: \"0.95rem\",\n      textTransform: \"uppercase\",\n      fontWeight: 400,\n      letterSpacing: \"0.1rem\",\n      color: \"#fff\",\n    },\n    body1: {\n      fontSize: \"0.90rem\",\n      fontWeight: 300,\n      lineHeight: 1,\n      color: \"#fff\",\n    },\n    body2: {\n      fontSize: \"0.85rem\",\n      color: \"#929292\",\n    },\n    overline: {\n      letterSpacing: \"0.08em\",\n      fontSize: \"13px\",\n      color: \"#ffffff88\",\n    },\n    button: {\n      letterSpacing: \"0.15em\",\n      fontSize: \"13px\",\n    },\n  },\n  shape: {\n    borderRadius: 0,\n  },\n});\n\nconst theme = createTheme(\n  {\n    components: {\n      MuiCssBaseline: {\n        styleOverrides: {\n          \"*::-webkit-scrollbar\": {\n            width: 15,\n            height: 15,\n          },\n          \"*::-webkit-scrollbar-track\": {\n            width: 15,\n            height: 15,\n            backgroundColor: \"#1A1A1A\",\n          },\n          \"*::-webkit-scrollbar-thumb\": {\n            width: 15,\n            height: 15,\n            backgroundColor: \"#242424\",\n          },\n          \"*::-webkit-scrollbar-corner\": {\n            backgroundColor: \"#1A1A1A\",\n          },\n        },\n      },\n      MuiLinearProgress: {\n        styleOverrides: {\n          bar: {\n            background: mainGradient,\n          },\n          colorPrimary: {\n            backgroundColor: \"#363636\",\n          },\n        },\n      },\n      MuiCircularProgress: {\n        styleOverrides: {\n          circle: {\n            stroke: `url(#${mainSvgGradientId})`,\n          },\n        },\n      },\n      MuiCard: {\n        styleOverrides: {\n          root: {\n            backgroundColor: \"#202020\",\n            backgroundImage: \"none\",\n            padding: \"35px 50px\",\n          },\n        },\n      },\n      MuiCardContent: {\n        styleOverrides: {\n          root: {\n            padding: \"0\",\n          },\n        },\n      },\n      MuiCardActions: {\n        styleOverrides: {\n          root: {\n            padding: \"0\",\n          },\n        },\n      },\n      MuiTabs: {\n        styleOverrides: {\n          indicator: {\n            ...gradientedBackgroundButton,\n          },\n        },\n      },\n      MuiTab: {\n        styleOverrides: {\n          root: {\n            textTransform: \"none\",\n            letterSpacing: \"0.1em\",\n            color: \"#8B8B8B\",\n            fontWeight: 400,\n            \"&.Mui-selected\": textGradientStyle,\n          },\n        },\n      },\n      MuiFab: {\n        styleOverrides: {\n          primary: {\n            borderRadius: 0,\n            ...gradientedBackgroundButton,\n          },\n        },\n      },\n      MuiPaper: {\n        styleOverrides: {\n          root: {\n            boxShadow: \"none\",\n            backgroundColor: \"#101010\",\n          },\n        },\n      },\n      MuiAccordion: {\n        styleOverrides: {\n          root: {\n            \"&:before\": {\n              content: \"none\",\n            },\n          },\n        },\n      },\n      MuiButton: {\n        styleOverrides: {\n          root: {\n            \"&:hover\": {\n              borderColor: \"#ffa08b\",\n              backgroundColor: \"rgba(255, 255, 255, 0.10)\",\n            },\n          },\n          containedPrimary: {\n            ...gradientedBackgroundButton,\n            \"&:hover\": {\n              backgroundColor: \"#C62A1F88\",\n              boxShadow: \"inset 0px 0px 20px 20px #C62A1F88\",\n            },\n          },\n          containedSecondary: {\n            color: \"#fff8\",\n            textTransform: \"none\",\n            backgroundColor: \"#1A1A1A\",\n            boxShadow: \"none\",\n            \"&:hover\": {\n              background: \"#262626\",\n              color: \"#fff\",\n              boxShadow: \"none\",\n            },\n            \"&:disabled\": {\n              background: \"#303030\",\n            },\n          },\n          outlinedPrimary: {\n            color: \"#fff\",\n            borderColor: \"#979797\",\n            borderWidth: 1,\n            \"&:disabled\": {\n              borderColor: \"#575757\",\n            },\n          },\n          textPrimary: {\n            textTransform: \"none\",\n            color: \"#fff\",\n          },\n        },\n      },\n      MuiListItemButton: {\n        styleOverrides: {\n          root: {\n            backgroundColor: \"#151515\",\n            \"&.Mui-selected\": gradientedBackgroundButton,\n            \"&:hover\": {\n              backgroundColor: \"#262626\",\n            },\n          },\n        },\n      },\n      MuiMenuItem: {\n        styleOverrides: {\n          root: {\n            \"&.Mui-selected\": gradientedBackgroundButton,\n          },\n        },\n      },\n      MuiDialog: {\n        styleOverrides: {\n          paper: {\n            backgroundColor: \"#202020\",\n            backgroundImage: \"none\",\n          },\n        },\n      },\n    },\n  },\n  baseTheme\n);\nexport default theme;\n","import { mainSvgGradientId } from \"../theme\";\nimport React from \"react\";\n\nexport const SVGGradientProvider: React.FC = ({ children }) => {\n  return (\n    <>\n      <svg style={{ height: 0, width: 0, display: \"block\" }}>\n        <linearGradient id={mainSvgGradientId} x1=\"0\" y1=\"1\" x2=\"1\" y2=\"0\">\n          <stop offset=\"0%\" stopColor=\"#C62A1F\" />\n          <stop offset=\"100%\" stopColor=\"#F8C16C\" />\n        </linearGradient>\n      </svg>\n      {children}\n    </>\n  );\n};\n","import { Card, Stack, Typography, Button } from \"@mui/material\";\nimport { BookOutlined } from \"@mui/icons-material\";\n\nexport const HelpLinks = [\n  {\n    link: \"https://link.humanode.io/guide/launcher\",\n    name: \"Guide for setting up a node with the launcher\",\n    icon: <BookOutlined />,\n  },\n  {\n    link: \"https://link.humanode.io/docs\",\n    name: \"Documentation\",\n    icon: <BookOutlined />,\n  },\n];\nexport const Guides: React.FC = () => {\n  return (\n    <Card>\n      <Stack spacing={3}>\n        <Typography variant=\"h6\" gutterBottom>\n          Useful links\n        </Typography>\n        <Stack spacing={1}>\n          {HelpLinks.map((link) => (\n            <Button\n              key={link.name}\n              href={link.link}\n              target=\"_blank\"\n              variant=\"text\"\n              startIcon={link.icon}\n              sx={{ justifyContent: \"flex-start\" }}\n            >\n              {link.name}\n            </Button>\n          ))}\n        </Stack>\n      </Stack>\n    </Card>\n  );\n};\n","import { useEffect, useState } from \"react\";\nimport config, { Config } from \"../config\";\n\nexport const useConfig = (): Config | null => {\n  const [cache, setCache] = useState<Config | null>(null);\n\n  useEffect(() => {\n    void config.then((val) => {\n      setCache(val);\n    });\n  }, []);\n\n  return cache;\n};\n\nexport default useConfig;\n","export const aptInstructions = (\n  repoUrl: string,\n  repoName: string,\n  packageName: string\n): string[] => {\n  return [\n    `sudo apt-get install apt-transport-https`,\n    `echo \"deb [trusted=yes] ${repoUrl} ./\" | sudo tee /etc/apt/sources.list.d/${repoName}.list`,\n    \"sudo apt-get update\",\n    `sudo apt-get install ${packageName}`,\n  ];\n};\n\nexport const yumInstructions = (\n  url: string,\n  repoName: string,\n  packageName: string\n): string[] => {\n  return [\n    `cat <<EOF | sudo tee /etc/yum.repos.d/${repoName}.repo`,\n    `[${repoName}]`,\n    `name=${repoName}`,\n    `baseurl=${url}`,\n    `enabled=1`,\n    `gpgcheck=0`,\n    `EOF`,\n    `sudo yum install ${packageName}`,\n  ];\n};\n","import { Box, Card, CardContent, Typography } from \"@mui/material\";\nimport React from \"react\";\nimport useConfig from \"./hooks/useConfig\";\nimport { aptInstructions, yumInstructions } from \"./instructions\";\n\nexport const Repositories: React.FC = () => {\n  const cfg = useConfig();\n  if (cfg === null) {\n    return <></>;\n  }\n  return (\n    <>\n      <Repository\n        title=\"Using APT\"\n        instructions={aptInstructions(\n          cfg.aptRepoUrl,\n          cfg.aptRepoSourceName,\n          cfg.aptPackageName\n        )}\n      />\n      <Repository\n        title=\"Using YUM\"\n        instructions={yumInstructions(\n          cfg.yumRepoUrl,\n          cfg.yumRepoSourceName,\n          cfg.yumPackageName\n        )}\n      />\n    </>\n  );\n};\n\nconst Repository: React.FC<{ title: string; instructions: string[] }> = ({\n  title,\n  instructions,\n}) => {\n  return (\n    <Card>\n      <CardContent>\n        <Typography variant=\"h6\" gutterBottom>\n          {title}\n        </Typography>\n        <Box width=\"100%\" overflow=\"overlay\">\n          <code>\n            <pre>{instructions.join(\"\\n\")}</pre>\n          </code>\n        </Box>\n      </CardContent>\n    </Card>\n  );\n};\n","import { Card, Container, CssBaseline, Stack, Typography } from \"@mui/material\";\nimport { StyledEngineProvider, ThemeProvider } from \"@mui/system\";\nimport React from \"react\";\nimport Releases from \"./components/Releases\";\nimport { SVGGradientProvider } from \"./components/SVGGradientProvider\";\nimport { Guides } from \"./Guides\";\nimport { Repositories } from \"./Repositories\";\nimport theme from \"./theme\";\n\nconst App: React.FC = () => {\n  return (\n    <SVGGradientProvider>\n      <StyledEngineProvider injectFirst>\n        <ThemeProvider theme={theme}>\n          <CssBaseline>\n            <img\n              src=\"/assets/white-eyes-face.png\"\n              style={{\n                position: \"absolute\",\n                top: 0,\n                left: 0,\n                height: \"100%\",\n                objectFit: \"contain\",\n                zIndex: -1,\n              }}\n            ></img>\n            <Container component=\"div\" maxWidth=\"md\">\n              <Stack spacing={4} m={4}>\n                <Card>\n                  <Stack spacing={3} alignItems=\"center\">\n                    <img\n                      src=\"/assets/humanode-logo.png\"\n                      alt=\"Humanode\"\n                      width={240}\n                      height={240}\n                    />\n                    <Typography variant=\"h6\">\n                      Get the Humanode Launcher and run your node!\n                    </Typography>\n                    <Releases />\n                  </Stack>\n                </Card>\n                <Guides />\n                <Repositories />\n              </Stack>\n            </Container>\n          </CssBaseline>\n        </ThemeProvider>\n      </StyledEngineProvider>\n    </SVGGradientProvider>\n  );\n};\n\nexport default App;\n","import { ReportHandler } from \"web-vitals\";\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler): void => {\n  if (onPerfEntry && onPerfEntry instanceof Function) {\n    void import(\"web-vitals\").then(\n      ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n        getCLS(onPerfEntry);\n        getFID(onPerfEntry);\n        getFCP(onPerfEntry);\n        getLCP(onPerfEntry);\n        getTTFB(onPerfEntry);\n      }\n    );\n  }\n};\n\nexport default reportWebVitals;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport App from \"./App\";\nimport reportWebVitals from \"./reportWebVitals\";\n\nReactDOM.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>,\n  document.getElementById(\"root\")\n);\n\nreportWebVitals();\n"],"sourceRoot":""}