@serifpersia/dango 4.0.7 → 4.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/client/dist/assets/AmbientLightMenu-JmM55s7j.js +1 -0
- package/client/dist/assets/{AnimeCard-CcvD-9Bi.js → AnimeCard-b-53YtWg.js} +1 -1
- package/client/dist/assets/{AnimeInfo-t3qfap0B.js → AnimeInfo-nkc_dqNh.js} +1 -1
- package/client/dist/assets/{AnimeInfoPage-D3vtcWL7.js → AnimeInfoPage-6Ee5ZHLo.js} +2 -2
- package/client/dist/assets/{Asmr-GHxClLoM.js → Asmr-DKguNIXd.js} +1 -1
- package/client/dist/assets/{AsmrPopup-Bt7wZkV8.js → AsmrPopup-CGEB-Kvs.js} +1 -1
- package/client/dist/assets/{AsmrResetProgressModal-Di6VgAZx.js → AsmrResetProgressModal-BeFdF9K3.js} +1 -1
- package/client/dist/assets/Home-CoBFY-dI.css +1 -0
- package/client/dist/assets/Home-DkqyQNvN.js +1 -0
- package/client/dist/assets/{Insights-B-jf5_UY.js → Insights-BuRpXDDL.js} +1 -1
- package/client/dist/assets/{LibraryListPage-B5q00Vno.js → LibraryListPage-DZFS8rVq.js} +1 -1
- package/client/dist/assets/{ListeningList-BNUrMPyA.js → ListeningList-VVvcvQlT.js} +1 -1
- package/client/dist/assets/{Manga-SYhXSYV_.js → Manga-CW8EcY5b.js} +1 -1
- package/client/dist/assets/{MangaInfoPage-CsGcpQ4g.js → MangaInfoPage-NoGbmyMn.js} +1 -1
- package/client/dist/assets/{MangaReadPage-B0BKdQeU.js → MangaReadPage-D5iydDmy.js} +1 -1
- package/client/dist/assets/{MangaResetProgressModal-8Q_Jp8Tk.js → MangaResetProgressModal-DzUFivte.js} +1 -1
- package/client/dist/assets/Mature-DciBmGdw.js +1 -0
- package/client/dist/assets/{MatureConsentModal-DoPl5ONK.js → MatureConsentModal-CJcnA2Uj.js} +1 -1
- package/client/dist/assets/{MediaCard-Ce90T0yC.js → MediaCard-CVcMufm7.js} +1 -1
- package/client/dist/assets/{Player-CYrY9dNs.js → Player-oPxiL_OZ.js} +6 -6
- package/client/dist/assets/{PlayerProvider-CjctET1A.js → PlayerProvider-Xhw7H58n.js} +1 -1
- package/client/dist/assets/PlayerSettings-BBy5U9hv.js +1 -0
- package/client/dist/assets/{PlayerSurface-B_rgFBYD.js → PlayerSurface-DfHO6_SI.js} +1 -1
- package/client/dist/assets/{QueueOptionsButton-BHkP1DB_.js → QueueOptionsButton-BY-l4POc.js} +1 -1
- package/client/dist/assets/{QueueRail-CxtCW4xn.js → QueueRail-cLqEp8MD.js} +1 -1
- package/client/dist/assets/{ReadingList-C0hu5BhB.js → ReadingList-Dumcsksm.js} +1 -1
- package/client/dist/assets/{ResetProgressModal-CncQLVw1.js → ResetProgressModal-BLU57mHM.js} +1 -1
- package/client/dist/assets/{Search-J3jIU8gd.js → Search-Cad-umPS.js} +1 -1
- package/client/dist/assets/{Settings-B8jClutS.js → Settings-BJgbyHSZ.js} +2 -2
- package/client/dist/assets/{SkeletonGrid-zCAxRZIz.js → SkeletonGrid-xe5EDdzV.js} +1 -1
- package/client/dist/assets/{Trackers-DTlCK6Gw.js → Trackers-FBVYcCT_.js} +1 -1
- package/client/dist/assets/Tv-B_EUjRAA.js +4 -0
- package/client/dist/assets/{TvInfo-Co-CnIbQ.js → TvInfo-Dp7dfUP2.js} +1 -1
- package/client/dist/assets/TvPopup-DuSXRbpD.js +1 -0
- package/client/dist/assets/{TvSearch-dkkP831q.js → TvSearch-Ye7Hj_un.js} +1 -1
- package/client/dist/assets/{TvWatchlist-CTxHqUB9.js → TvWatchlist-BvT_bqhG.js} +1 -1
- package/client/dist/assets/{VirtualKeyboard-ClY9H0vl.js → VirtualKeyboard-CzGcfsAk.js} +1 -1
- package/client/dist/assets/{WatchAlong-RAJe62YS.js → WatchAlong-DsPGvRNW.js} +1 -1
- package/client/dist/assets/{WatchAlongPanel-G2j2eopw.js → WatchAlongPanel-Pc2hYO_v.js} +1 -1
- package/client/dist/assets/{Watchlist-D8prt4l1.js → Watchlist-G-sHVKs0.js} +1 -1
- package/client/dist/assets/atkinson-hyperlegible-latin-400-normal-BbWidj28.woff +0 -0
- package/client/dist/assets/atkinson-hyperlegible-latin-400-normal-BrHNak5F.woff2 +0 -0
- package/client/dist/assets/atkinson-hyperlegible-latin-700-normal-BK6Glc0m.woff +0 -0
- package/client/dist/assets/atkinson-hyperlegible-latin-700-normal-GZI4o3u0.woff2 +0 -0
- package/client/dist/assets/atkinson-hyperlegible-latin-ext-400-normal-Bbz-b3yf.woff +0 -0
- package/client/dist/assets/atkinson-hyperlegible-latin-ext-400-normal-DRk46D-x.woff2 +0 -0
- package/client/dist/assets/atkinson-hyperlegible-latin-ext-700-normal-BoVPHkS0.woff2 +0 -0
- package/client/dist/assets/atkinson-hyperlegible-latin-ext-700-normal-CKkU2Dpt.woff +0 -0
- package/client/dist/assets/bangers-latin-400-normal-BAEm-Pv0.woff +0 -0
- package/client/dist/assets/bangers-latin-400-normal-DeHY8Ncq.woff2 +0 -0
- package/client/dist/assets/bangers-latin-ext-400-normal-7BLmjjiv.woff2 +0 -0
- package/client/dist/assets/bangers-latin-ext-400-normal-CzVt_Cgx.woff +0 -0
- package/client/dist/assets/bangers-vietnamese-400-normal-BbvBhFjQ.woff2 +0 -0
- package/client/dist/assets/bangers-vietnamese-400-normal-Ll9rymNv.woff +0 -0
- package/client/dist/assets/bree-serif-latin-400-normal-DFKDEHQE.woff2 +0 -0
- package/client/dist/assets/bree-serif-latin-400-normal-Dbaz2OwO.woff +0 -0
- package/client/dist/assets/bree-serif-latin-ext-400-normal-CnorAOA2.woff +0 -0
- package/client/dist/assets/bree-serif-latin-ext-400-normal-amfO-E0k.woff2 +0 -0
- package/client/dist/assets/chakra-petch-latin-400-normal-D7EtbySE.woff +0 -0
- package/client/dist/assets/chakra-petch-latin-400-normal-SafcrIr2.woff2 +0 -0
- package/client/dist/assets/chakra-petch-latin-700-normal-CnDBPjkL.woff2 +0 -0
- package/client/dist/assets/chakra-petch-latin-700-normal-D1s_c2du.woff +0 -0
- package/client/dist/assets/chakra-petch-latin-ext-400-normal-C8u6EFkq.woff2 +0 -0
- package/client/dist/assets/chakra-petch-latin-ext-400-normal-MNNNbyh_.woff +0 -0
- package/client/dist/assets/chakra-petch-latin-ext-700-normal-BeviJPUl.woff +0 -0
- package/client/dist/assets/chakra-petch-latin-ext-700-normal-DAkvJhej.woff2 +0 -0
- package/client/dist/assets/chakra-petch-thai-400-normal-Bw1Q-fVY.woff2 +0 -0
- package/client/dist/assets/chakra-petch-thai-400-normal-KdzBjiWs.woff +0 -0
- package/client/dist/assets/chakra-petch-thai-700-normal-B7WL5pBr.woff2 +0 -0
- package/client/dist/assets/chakra-petch-thai-700-normal-vZLZ_5L8.woff +0 -0
- package/client/dist/assets/chakra-petch-vietnamese-400-normal-Cn7ya5On.woff +0 -0
- package/client/dist/assets/chakra-petch-vietnamese-700-normal-gQuUA8Wu.woff +0 -0
- package/client/dist/assets/comic-neue-latin-400-normal-BdhG8RSD.woff2 +0 -0
- package/client/dist/assets/comic-neue-latin-400-normal-CU7kPFAv.woff +0 -0
- package/client/dist/assets/comic-neue-latin-700-normal-NE4Vcoll.woff2 +0 -0
- package/client/dist/assets/comic-neue-latin-700-normal-yR9qu__P.woff +0 -0
- package/client/dist/assets/{index-BOJFs4B4.js → index-CaTGvWwZ.js} +2 -2
- package/client/dist/assets/{libraryInvalidation-1xwHWgGv.js → libraryInvalidation-Bn7rPtR2.js} +1 -1
- package/client/dist/assets/oswald-cyrillic-ext-wght-normal-DLWmRmaW.woff2 +0 -0
- package/client/dist/assets/oswald-cyrillic-wght-normal-C8sJyxwB.woff2 +0 -0
- package/client/dist/assets/oswald-latin-ext-wght-normal-Dj_1K-Kw.woff2 +0 -0
- package/client/dist/assets/oswald-latin-wght-normal-CzS3kehr.woff2 +0 -0
- package/client/dist/assets/oswald-vietnamese-wght-normal-Tdf5mmdl.woff2 +0 -0
- package/client/dist/assets/{playbackCompletion-BpEGpC-Z.js → playbackCompletion-Cv5b1X7P.js} +1 -1
- package/client/dist/assets/russo-one-cyrillic-400-normal-BXZIn0h3.woff2 +0 -0
- package/client/dist/assets/russo-one-cyrillic-400-normal-rRbrNFRA.woff +0 -0
- package/client/dist/assets/russo-one-latin-400-normal-BfOuQF9V.woff2 +0 -0
- package/client/dist/assets/russo-one-latin-400-normal-CosRecV9.woff +0 -0
- package/client/dist/assets/russo-one-latin-ext-400-normal-BssN3Pxm.woff +0 -0
- package/client/dist/assets/russo-one-latin-ext-400-normal-CezFp_e4.woff2 +0 -0
- package/client/dist/assets/useAnimeInfoData-labdig-v.js +1 -0
- package/client/dist/assets/{useMangaLibrary-OgS0RRdO.js → useMangaLibrary-azB3VMor.js} +1 -1
- package/client/dist/assets/{useMangaPopup-Eyed-Gg3.js → useMangaPopup-CS9sxdTY.js} +1 -1
- package/client/dist/assets/{useTv-SLXsIWFQ.js → useTv-DtCO9m0I.js} +1 -1
- package/client/dist/assets/{useTvLibrary-F0S6WnwD.js → useTvLibrary-ByqbivhY.js} +1 -1
- package/client/dist/assets/useWatchAlongPlayer-BksJHCzs.css +1 -0
- package/client/dist/assets/useWatchAlongPlayer-CPxdEuB8.js +11 -0
- package/client/dist/index.html +1 -1
- package/client/dist/subtitle-font-licenses.txt +113 -0
- package/package.json +2 -2
- package/server/dist/server.js +2 -2
- package/server/package.json +1 -1
- package/client/dist/assets/Home-Bmc4hGfd.css +0 -1
- package/client/dist/assets/Home-C9caLBqU.js +0 -1
- package/client/dist/assets/Mature-DtyWIW42.js +0 -1
- package/client/dist/assets/OptionListMenu-CHqo2pTO.js +0 -1
- package/client/dist/assets/PlayerSettings-uDMPYAlP.js +0 -1
- package/client/dist/assets/Tv-CnahgiVt.js +0 -4
- package/client/dist/assets/TvPopup-Ci4SXMWf.js +0 -1
- package/client/dist/assets/useAnimeInfoData-CvV6vRjn.js +0 -1
- package/client/dist/assets/useWatchAlongPlayer-BsaopdPw.css +0 -1
- package/client/dist/assets/useWatchAlongPlayer-D-fPdbp2.js +0 -10
package/server/dist/server.js
CHANGED
|
@@ -466,7 +466,7 @@ ${u}
|
|
|
466
466
|
}
|
|
467
467
|
}
|
|
468
468
|
`,B=t?.toLowerCase().replace(/[^a-z0-9]/g,""),x=t?.trim()?IB(t).filter(be=>be.toLowerCase().replace(/[^a-z0-9]/g,"")===B):[""],v=new Map,U=null,W=!1;for(let[be,De]of x.entries()){if(U=await ur(S,{...C,...De?{search:De}:{}}),!U?.data)break;for(let K of U.data.Page.media??[])K.id&&v.set(K.id,K);if(be>0&&(W=!0),(U.data.Page.media?.length??0)>=n)break}if(!U?.data&&v.size===0){if(_i()){let De=await Pf(async()=>{let j=Wr(),Z=await Td(j,{query:t,page:r,perPage:n,format:i&&i!=="ALL"&&i!=="ADULT"?i:void 0,status:s,season:o,seasonYear:a,genre:u,genre_in:c,genre_not_in:d,averageScore_greater:g,episodes_greater:p,isAdult:i==="ADULT"?!0:m,sort:I});if(Z.length>0)try{let Ie=await Td(j,{query:t,page:r,perPage:n,format:i&&i!=="ALL"&&i!=="ADULT"?i:void 0,status:s,season:o,seasonYear:a,genre:u,genre_in:c,averageScore_greater:g,episodes_greater:p,sort:I,isAdult:!0},!1);if(Ie.length>0){let Bt=new Set(Ie.map(er=>er.id));Z=Z.filter(er=>!Bt.has(er.id))}}catch{}return Z},()=>wa({query:t,page:r,perPage:n,format:i&&i!=="ALL"&&i!=="ADULT"?i:void 0,status:s,season:o,seasonYear:a,genre:u,genre_in:c,genre_not_in:d,averageScore_greater:g,episodes_greater:p,isAdult:i==="ADULT"?!0:m,sort:I}));try{await ED(Wr(),De)}catch{}let K=gae(De);if(K.length===0&&t?.trim())try{let Z=(await RB(Wr(),t,r)).entries.map(Ie=>wd(Ie));try{await ED(Wr(),Z)}catch{}K=Z.map(Ie=>Er(Ie))}catch{}return K}return[]}let X=[...v.values()];if(!X||X.length===0)return[];W&&X.sort((be,De)=>{let K=j=>Math.max(0,...[j.title?.romaji,j.title?.english,j.title?.native].filter(Z=>!!Z).map(Z=>kc([{title:Z}],[t??""])?.score??0));return K(De)-K(be)});let ae=new Set,Ee=[];for(let be of X)!be.id||ae.has(be.id)||(ae.add(be.id),Ee.push(Er(be)));return Ee.slice(0,n)}function V8(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.browse=="function"&&typeof t.getEpisodes=="function"&&typeof t.getStreamUrls=="function"&&typeof t.getImages=="function"&&typeof t.getChapters=="function"}var Qae=/^[a-z0-9][a-z0-9-]*$/i,yKe=/^[0-9a-f]{64}$/i,wae=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function Sae(e,t){let r=e.split(".").map(Number),n=t.split(".").map(Number);for(let i=0;i<3;i++)if(r[i]!==n[i])return r[i]>n[i];return!0}function kB(e){if(!e||typeof e!="object")throw new Error("registry: not an object");let t=e;if(!Number.isSafeInteger(t.version)||t.version<0)throw new Error("registry.version must be a non-negative integer");if(!Array.isArray(t.providers))throw new Error("registry.providers must be an array");let r=t.providers.map((i,s)=>bKe(i,s)),n=new Set;for(let i of r){let s=i.id.toLowerCase();if(n.has(s))throw new Error(`registry: duplicate provider id "${i.id}"`);n.add(s)}return{version:t.version,updatedAt:typeof t.updatedAt=="string"?t.updatedAt:void 0,providers:r}}function bKe(e,t){if(!e||typeof e!="object")throw new Error(`registry.providers[${t}]: not an object`);let r=e,n=r.id,i=r.entry,s=r.label,o=r.version;if(typeof n!="string"||!Qae.test(n.trim()))throw new Error(`registry.providers[${t}].id must match ${Qae}`);if(typeof s!="string"||!s.trim())throw new Error(`registry.providers[${t}].label must be a non-empty string`);if(typeof o!="string"||!wae.test(o.trim()))throw new Error(`registry.providers[${t}].version must be major.minor.patch`);if(r.minDango!==void 0&&(typeof r.minDango!="string"||!wae.test(r.minDango)))throw new Error(`registry.providers[${t}].minDango must be major.minor.patch`);let a=r.embedBase;if(a!==void 0&&(typeof a!="string"||!/^https:\/\/[^/]+/i.test(a.trim())))throw new Error(`registry.providers[${t}].embedBase must be an https URL`);if((typeof i!="string"||!i.trim())&&a===void 0)throw new Error(`registry.providers[${t}].entry must be a non-empty string`);if(r.sha256!==void 0&&(typeof r.sha256!="string"||!yKe.test(r.sha256.trim())))throw new Error(`registry.providers[${t}].sha256 must be 64 hex chars`);if(r.mature!==void 0&&typeof r.mature!="boolean")throw new Error(`registry.providers[${t}].mature must be boolean`);if(r.kind!==void 0&&r.kind!=="anime"&&r.kind!=="asmr"&&r.kind!=="manga"&&r.kind!=="tv"&&r.kind!=="hentai"&&r.kind!=="adult")throw new Error(`registry.providers[${t}].kind must be anime|asmr|manga|tv|hentai|adult`);if(r.sub!==void 0&&r.sub!=="soft"&&r.sub!=="hard"&&r.sub!=="mixed")throw new Error(`registry.providers[${t}].sub must be soft|hard|mixed`);if(r.tier!==void 0&&r.tier!=="direct"&&r.tier!=="embed"&&r.tier!=="cookie")throw new Error(`registry.providers[${t}].tier must be direct|embed|cookie`);let A;if(r.modes!==void 0){if(!Array.isArray(r.modes))throw new Error(`registry.providers[${t}].modes must be an array`);A=[];for(let u of r.modes){if(u!=="sub"&&u!=="dub")throw new Error(`registry.providers[${t}].modes must contain only sub|dub`);A.includes(u)||A.push(u)}}return{id:n.trim(),label:s.trim(),version:o.trim(),entry:typeof i=="string"?i.trim():void 0,embedBase:typeof a=="string"?a.trim().replace(/\/+$/,""):void 0,sha256:typeof r.sha256=="string"?r.sha256.trim().toLowerCase():void 0,minDango:typeof r.minDango=="string"?r.minDango:void 0,mature:typeof r.mature=="boolean"?r.mature:!1,kind:a!==void 0?"tv":r.kind==="asmr"||r.kind==="manga"||r.kind==="tv"||r.kind==="hentai"||r.kind==="adult"?r.kind:"anime",sub:r.sub,tier:r.tier,modes:A,browse:SKe(r.browse,t),proxy:QKe(r.proxy,t),auth:wKe(r.auth,t),enabledByDefault:r.enabledByDefault!==!1}}function QKe(e,t){if(e===void 0)return;if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`registry.providers[${t}].proxy must be an object`);let r=e,n={};for(let i of["hosts","suffixes","mirrors"])if(r[i]!==void 0){if(!Array.isArray(r[i])||!r[i].every(s=>typeof s=="string"&&s))throw new Error(`registry.providers[${t}].proxy.${i} must be a non-empty string array`);n[i]=r[i].map(s=>s.trim().toLowerCase())}for(let i of["referer","origin"])if(r[i]!==void 0){if(typeof r[i]!="string"||!/^https:\/\//i.test(r[i].trim()))throw new Error(`registry.providers[${t}].proxy.${i} must be an https URL`);n[i]=r[i].trim()}for(let i of["originFromReferer","scrape","cfCookie","embedPatch"])if(r[i]!==void 0){if(typeof r[i]!="boolean")throw new Error(`registry.providers[${t}].proxy.${i} must be boolean`);n[i]=r[i]}return n}function wKe(e,t){if(e===void 0||e==="none")return;if(e==="cookie")return{type:"cookie"};if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`registry.providers[${t}].auth must be an object`);let r=e;if(r.type!=="cookie"&&r.type!=="browser_verify")throw new Error(`registry.providers[${t}].auth.type must be cookie|browser_verify`);for(let n of["label","siteUrl","cookieName","instructions"])if(r[n]!==void 0&&(typeof r[n]!="string"||!r[n].trim()))throw new Error(`registry.providers[${t}].auth.${n} must be a non-empty string`);if(r.siteUrl!==void 0&&!/^https:\/\//i.test(r.siteUrl.trim()))throw new Error(`registry.providers[${t}].auth.siteUrl must be an https URL`);if(r.cookieName!==void 0&&!/^[a-z0-9_.-]+$/i.test(r.cookieName.trim()))throw new Error(`registry.providers[${t}].auth.cookieName must be a cookie name`);if(r.needsUa!==void 0&&typeof r.needsUa!="boolean")throw new Error(`registry.providers[${t}].auth.needsUa must be boolean`);return{type:r.type,label:typeof r.label=="string"?r.label.trim():void 0,siteUrl:typeof r.siteUrl=="string"?r.siteUrl.trim():void 0,cookieName:typeof r.cookieName=="string"?r.cookieName.trim():void 0,needsUa:typeof r.needsUa=="boolean"?r.needsUa:void 0,instructions:typeof r.instructions=="string"?r.instructions.trim():void 0}}function Tae(e){if(e.auth&&typeof e.auth=="object")return{...e.auth,siteUrl:e.auth.siteUrl??e.proxy?.referer??e.proxy?.origin,cookieName:e.auth.cookieName??"cf_clearance",needsUa:e.auth.needsUa??!0};if(e.auth==="cookie"||e.proxy?.cfCookie||e.tier==="cookie")return{type:"cookie",siteUrl:e.proxy?.referer??e.proxy?.origin,cookieName:"cf_clearance",needsUa:!0}}function SKe(e,t){if(e===void 0)return;if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`registry.providers[${t}].browse must be an object`);let r=e,n={};for(let i of["genre","order","studio","sort"])if(r[i]!==void 0){if(typeof r[i]!="boolean")throw new Error(`registry.providers[${t}].browse.${i} must be boolean`);n[i]=r[i]}if(r.pageSize!==void 0){if(typeof r.pageSize!="number"||!Number.isInteger(r.pageSize)||r.pageSize<1)throw new Error(`registry.providers[${t}].browse.pageSize must be a positive integer`);n.pageSize=r.pageSize}return n}var SD=15e3,Dae=JSON.parse(Pi.readFileSync(As.join(Pn.PACKAGE_ROOT,"package.json"),"utf8")).version;async function yD(e,t){let r=`${e}.${wD.randomUUID()}.tmp`;try{await Pi.promises.writeFile(r,t),await Pi.promises.rename(r,e)}finally{await Pi.promises.rm(r,{force:!0})}}var MB="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";function FB(e,t,r){let n,i=new Promise((s,o)=>{n=setTimeout(()=>o(new Error(`${r} timed out after ${t}ms`)),t)});return Promise.race([e,i]).finally(()=>clearTimeout(n))}function UB(e){return/^https?:\/\//i.test(e)}function q8(e){return e.startsWith("file://")?DKe(e):e}function xKe(e){return UB(e)||e.startsWith("file://")?!1:e.includes("/")||e.includes("\\")||e.endsWith(".json")}async function vKe(e){if(UB(e)){let r=await FB(fetch(e,{headers:{"User-Agent":MB,Accept:"application/json"}}),SD,"registry fetch");if(!r.ok)throw new Error(`registry HTTP ${r.status}: ${e}`);return Rl(Buffer.from(await r.arrayBuffer()))}let t=As.resolve(q8(e));return await Pi.promises.readFile(t)}async function kKe(e){if(UB(e)){let r=await FB(fetch(e,{headers:{"User-Agent":MB,Accept:"text/javascript,*/*"}}),SD,"provider fetch");if(!r.ok)throw new Error(`provider HTTP ${r.status}: ${e}`);return Rl(Buffer.from(await r.arrayBuffer()))}let t=As.resolve(q8(e));return await Pi.promises.readFile(t)}function LKe(e,t){let r=(e??"").trim();if(UB(r)||r.startsWith("file://"))return r;if(UB(t))return new URL(r,t).href;let n=As.dirname(As.resolve(q8(t)));return As.resolve(n,r)}function bD(e){return wD.createHash("sha256").update(e).digest("hex")}function MKe(e,t,r){let n;try{n=Buffer.from(e,"base64url")}catch{return null}if(!n.length||n.length%16!==0)return null;try{let i=Buffer.alloc(32);Buffer.from(t).copy(i);let s=wD.createDecipheriv("aes-256-cbc",i,Buffer.from(r)),o=Buffer.concat([s.update(n),s.final()]);return JSON.parse(o.toString("utf8"))}catch{return null}}function Nae(e,t){let r=["-sSL","-A",MB,...Object.entries(t??{}).flatMap(([o,a])=>["-H",`${o}: ${a}`]),"--max-time","15","-w",`
|
|
469
|
-
__HTTP_STATUS__%{http_code}`,"--",e],n;try{n=TKe("curl",r,{encoding:"utf-8",maxBuffer:10*1024*1024})}catch{return null}let i=n.match(/__HTTP_STATUS__(\d+)\s*$/);return{status:i?parseInt(i[1],10):0,body:i&&i.index!==void 0?n.slice(0,i.index):n}}function FKe(e){let t=async(r,n,i=SD)=>FB(fetch(r,{...n,headers:{"User-Agent":MB,...n?.headers}}),i,`fetch ${r}`);return{cache:{get:r=>e.get(r),set:(r,n,i)=>{e.set(r,n,i)}},logger:{info:(r,n)=>{O.info(r,n)},warn:(r,n)=>{O.warn(r,n)},error:(r,n)=>{O.error(r,n)},debug:(r,n)=>{O.debug(r,n)}},fetchText:async(r,n)=>{try{let i=await t(r,n);return i.ok?await i.text():null}catch{return null}},fetchJson:async(r,n)=>{let i=await t(r,n);if(!i.ok)throw new Error(`HTTP ${i.status}: ${r}`);return Yt(i)},proxyUrl:(r,n)=>`/api/proxy?url=${encodeURIComponent(r)}&referer=${encodeURIComponent(n)}`,userAgent:MB,titleMatch:{buildQueryVariants:IB,pickBestMatch:kc},resolveBestShowId:async(r,n,i)=>{let s=[r,n].filter(o=>typeof o=="string"&&o.trim().length>0);if(s.length===0)return null;for(let o of IB(r,n)){let a;try{a=await i(o)}catch(u){if(u.message==="AUTH_REQUIRED")throw u;continue}if(!a||a.length===0)continue;let A=kc(a.filter(u=>u&&typeof u.id=="string"&&u.id.length>0),s);if(A)return A.item.id}return null},anilist:{request:(r,n)=>ur(r,n),parseMalId:Os,searchByTitle:Ps},kitsu:{metaByAnilistId:QB},tmdb:{base:To,image:Dd,get:async r=>{try{let n=await Uc(),i=r.includes("?")?"&":"?",s=await t(`${To}${r}${i}api_key=${n}`);return s.ok?Yt(s):null}catch{return null}}},request:{get:r=>Op.getStore()?.get(r)},cookies:{sanitizeCfClearance:Pp,buildCfClearanceCookie:Eu},crypto:{aes256CbcDecryptJson:MKe,hmacSha256Base64Url:(r,n)=>wD.createHmac("sha256",r).update(n).digest("base64url")},scraping:{fetch:async(r,n)=>{let i=typeof r=="string"?{url:r,...n??{}}:r,{url:s,...o}=i,a=await RKe({url:s,method:"GET",responseType:"text",throwHttpErrors:!1,...o});return{statusCode:a.statusCode,body:String(a.body??""),headers:a.headers}}},curl:{getJson:async(r,n)=>{try{let i=Nae(r,n);return!i||i.status!==200?null:JSON.parse(i.body)}catch{return null}},getText:async(r,n)=>{let i=Nae(r,n);return!i||i.status!==200?null:i.body}},cheerio:{load:r=>T2(r)}}}function J8(e){if(!e||typeof e!="object")return null;let t=e;return typeof t.name=="string"?t:null}function Mae(e,t){return t.every(r=>typeof e[r]=="function")}function Fae(e){let t=J8(e);return!!t&&Mae(t,["search","getEpisodes","getStreamUrls"])}function Uae(e){let t=J8(e);return!!t&&Mae(t,["search","getDetail","getChapters","getPages"])}function _ae(e){let t=J8(e);return!!t&&(typeof t.getSources=="function"||typeof t.getEmbedUrl=="function")}function UKe(e,t){return e==="manga"?Uae(t):e==="tv"?_ae(t):e==="asmr"?V8(t):Fae(t)}var Rae=new WeakMap;function BD(e,t){let r=Rae.get(t);r||(r=new Map,Rae.set(t,r));let n=r.get(e);if(n)return n;let i=new Proxy(t,{get(s,o){let a=Reflect.get(s,o);return typeof a!="function"?a:(...A)=>{let u=Op.getStore();if(!u)return a.apply(s,A);let c=u.get(`${e}_cookie`),l=u.get(`${e}_ua`);if(!c&&!l)return a.apply(s,A);let h=new Map(u);return c&&h.set("cookie",c),l&&h.set("ua",l),Op.run(h,()=>a.apply(s,A))}}});return r.set(e,i),i}function xae(e,t,r,n){return t.kind==="manga"?Uae(n)?(e.mangaProviders[r]=BD(r,n),!0):!1:t.kind==="tv"?_ae(n)?(e.tvProviders[r]=BD(r,n),!0):!1:t.kind==="asmr"?V8(n)?(e.asmrProviders[r]=BD(r,n),!0):!1:Fae(n)?(e.providers[r]=BD(r,n),!0):!1}function _Ke(e,t){let r=t.trim().replace(/\/+$/,"");return{name:e,getEmbedUrl:async n=>{let i=Number(n.tmdbId);return i?n.type==="movie"?`${r}/movie/${i}`:`${r}/tv/${i}/${n.season||1}/${n.episode||1}`:null}}}async function W8(e,t,r,n,i){if(e.minDango&&!Sae(Dae,e.minDango))return{provider:null,error:`requires dango ${e.minDango}, running ${Dae}`};if(e.embedBase)return{provider:_Ke(e.id,e.embedBase)};let s=LKe(e.entry,t);await Pi.promises.mkdir(r,{recursive:!0});let o=LB(e),a=As.join(r,o),A=`${a}:${e.kind??"anime"}`,u=null;try{let h=await Pi.promises.readFile(a);(e.sha256&&bD(h)===e.sha256||!e.sha256&&i)&&(u=h)}catch{}if(u){let h=QD.get(A);if(h)return O.debug({provider:e.id,version:e.version},"remote provider reused cached instance"),{provider:h.provider,facets:h.facets}}else{try{u=await kKe(s)}catch(h){return{provider:null,error:`download failed: ${h.message}`}}if(e.sha256){if(bD(u)!==e.sha256)return{provider:null,error:`sha256 mismatch for ${e.id}`}}else if(!i)return{provider:null,error:`missing sha256 for ${e.id}`};await yD(a,u)}let c=`${e.version}-${e.sha256??"nosha"}`,l=await PKe(a,c,n,e);return l.provider&&!l.error&&QD.set(A,{provider:l.provider,facets:l.facets}),l}var QD=new Map;function LB(e){return`${e.id}-${e.version}-${e.sha256??"nosha"}.mjs`}function OKe(e){let t,r,n;for(let[i,s]of Object.entries(e)){if(i==="default"||!Array.isArray(s)||s.length===0||!s.every(A=>typeof A=="string"&&A.length>0))continue;let o=s.filter(A=>A.length<=64).slice(0,500);if(o.length===0)continue;let a=i.toUpperCase();a.includes("GENRE")||a.includes("TAG")?t??=o:a.includes("ORDER")?r??=o:a.includes("SORT")&&(n??=o)}if(!(!t&&!r&&!n))return{...t?{genres:t}:{},...r?{orders:r}:{},...n?{sorts:n}:{}}}async function PKe(e,t,r,n){let i=n.id,s;try{let A=`${NKe(e).href}?v=${encodeURIComponent(t)}`;s=await FB(import(A),SD,`import ${i}`)}catch(A){return{provider:null,error:`import failed: ${A.message}`}}let o=s.default;if(typeof o!="function")return{provider:null,error:"missing default factory export"};let a;try{a=await FB(Promise.resolve(o(r)),1e4,`factory ${i}`)}catch(A){return{provider:null,error:`factory failed: ${A.message}`}}return UKe(n.kind,a)?{provider:a,facets:OKe(s)}:{provider:null,error:"invalid provider shape"}}async function HKe(e,t,r){if(e.embedBase)return W8(e,"",t,r,!1);if(!e.sha256)return{provider:null,error:"no verified fallback"};let n=As.join(t,LB(e)),i;try{i=await Pi.promises.readFile(n)}catch{return{provider:null,error:"no cached fallback file"}}return bD(i)!==e.sha256?{provider:null,error:"cached fallback failed verification"}:W8(e,"",t,r,!1)}var vae;function Oae(e){return vae??=GKe(e).finally(()=>{vae=void 0})}async function GKe(e){let t=(e.registryUrl??Ae.PROVIDER_REPO_URL??"").trim(),r={registryLoaded:!1,providers:{},mangaProviders:{},tvProviders:{},asmrProviders:{},catalog:[],proxyRules:[]};if(!t)return r;let n=As.join(Pn.ROOT,"remote-providers"),i=As.join(n,"registry.json"),s=As.join(n,"active.json"),o=null;try{o=kB(JSON.parse(await Pi.promises.readFile(s,"utf8")))}catch{try{o=kB(JSON.parse(await Pi.promises.readFile(i,"utf8")));for(let f of o.providers){if(f.embedBase||!f.sha256)continue;let g=As.join(n,`${f.id}-${f.version}.mjs`);try{let p=await Pi.promises.readFile(g);bD(p)===f.sha256&&await yD(As.join(n,LB(f)),p)}catch{}}}catch{}}let a=new Map((o?.providers??[]).map(f=>[f.id.toLowerCase(),f])),A;try{let f=await vKe(t);A=kB(JSON.parse(f.toString("utf8")))}catch(f){O.error({err:f,registryUrl:t},"remote providers: manifest fetch failed, trying disk cache");try{A=kB(JSON.parse(await Pi.promises.readFile(i,"utf8")))}catch{return r}}r.registryLoaded=!0;let u=[],c=new Set((e.enabledProviders??[]).map(f=>f.toLowerCase())),l=c.size>0,h=FKe(e.cache),d=e.allowUnsigned??(process.env.DANGO_ALLOW_UNSIGNED_PROVIDERS==="1"||xKe(t));for(let f of A.providers){let g=f.id.toLowerCase();if(f.enabledByDefault===!1&&(!l||!c.has(g))){r.catalog.push(jp(f,!1,"disabled by default"));continue}if(l&&!c.has(g)){r.catalog.push(jp(f,!1,"not in enabledProviders"));continue}let{provider:p,facets:m,error:I}=await W8(f,t,n,h,d);if(p&&!I){if(!xae(r,f,g,p)){r.catalog.push(jp(f,!1,"invalid provider shape for kind")),O.warn({provider:f.id},"remote provider kind mismatch, skipped");continue}r.catalog.push(Lae(m,kae(f,p,jp(f,!0)))),u.push(f),f.proxy&&r.proxyRules.push(f.proxy),O.info({provider:f.id,version:f.version},"remote provider loaded")}else{let C=a.get(g);if(C){let y=await HKe(C,n,h);if(y.provider&&!y.error&&(xae(r,C,g,y.provider)||(y.error="cached fallback failed validation")),y.provider&&!y.error){r.catalog.push({...Lae(y.facets,kae(C,y.provider,jp(C,!0))),error:`serving cached ${C.version}: ${I}`}),u.push(C),C.proxy&&r.proxyRules.push(C.proxy),O.warn({provider:f.id,error:I,fallback:C.version},"remote provider update failed, serving cached version");continue}}r.catalog.push(jp(f,!1,I)),C&&u.push(C),f.proxy&&r.proxyRules.push(f.proxy),O.warn({provider:f.id,error:I},"remote provider skipped")}}await Pi.promises.mkdir(n,{recursive:!0}),await yD(s,JSON.stringify({...A,providers:u})),await yD(i,JSON.stringify(A));try{let f=new Set([...A.providers,...u].map(m=>LB(m))),g=new Set([...A.providers,...u].map(m=>{let I=m.embedBase?"tv":m.kind??"anime";return`${As.join(n,LB(m))}:${I}`}));for(let m of QD.keys())g.has(m)||QD.delete(m);let p=await Pi.promises.readdir(n);for(let m of p)m.toLowerCase().endsWith(".mjs")&&(f.has(m)||(await Pi.promises.unlink(As.join(n,m)),O.info({file:m},"remote providers: removed superseded module")))}catch(f){O.warn({err:f},"remote providers: superseded module cleanup failed")}return r}function kae(e,t,r){if(e.kind!=="tv"||!t||typeof t!="object")return r;let n=t.servers;return Array.isArray(n)&&n.every(i=>typeof i=="string")&&n.length>0?{...r,servers:[...n]}:r}function Lae(e,t){let r=(e?.genres??[]).length>0?e?.genres:void 0,n=(e?.orders??[]).length>0?e?.orders:void 0,i=(e?.sorts??[]).length>0?e?.sorts:void 0;return!r&&!n&&!i?t:{...t,facets:{...r?{genres:r}:{},...n?{orders:n}:{},...i?{sorts:i}:{}}}}function jp(e,t,r){return{id:e.id.toLowerCase(),label:e.label,version:e.version,mature:e.mature,kind:e.kind??"anime",sub:e.sub,tier:e.tier,modes:e.modes??(e.kind==="tv"?[]:["sub","dub"]),browse:e.browse,auth:Tae(e),enabledByDefault:e.enabledByDefault!==!1,loaded:t,remote:!0,error:r}}var gm=rr(oBe(),1);In();var Pht=rr(T4(),1),Hht=rr(XB(),1),Ght=rr(Vf(),1),Yht=rr(XD(),1),Vht=rr(ZD(),1),Wht=rr(iN(),1),aBe=rr(zB(),1),qht=rr(N4(),1);var wg=aBe.default;In();var ABe=rr(OQ(),1),$s=O.child({module:"DiscordGateway"}),F5=class{gateway=null;heartbeat=null;token=null;reconnectTimeout=null;lastActivity=null;isEnabled=!1;RECONNECT_DELAY=15e3;externalAssetCache=new Map;logoAssetId=null;logoAssetChecked=!1;setEnabled(t){this.isEnabled=t,t?(this.loadToken(),this.connect()):this.disconnect()}get serviceEnabled(){return this.isEnabled&&!!this.token&&this.token.length>30}hasToken(){return!!this.token&&this.token.length>30}loadToken(){this.token=process.env.DISCORD_GATEWAY_TOKEN||null,this.logoAssetId=null,this.logoAssetChecked=!1}reloadToken(){ABe.default.config({path:Ae.ENV_PATH,override:!0}),this.loadToken(),this.serviceEnabled&&(this.disconnect(),this.connect())}async getExternalAsset(t){if(!Ae.DISCORD_CLIENT_ID||!this.token)return null;let r=this.externalAssetCache.get(t);if(r)return r;try{let n=await fetch(`https://discord.com/api/v9/applications/${Ae.DISCORD_CLIENT_ID}/external-assets`,{method:"POST",headers:{Authorization:this.token,"Content-Type":"application/json"},body:JSON.stringify({urls:[t]})}),i=await n.text();if(!n.ok)return $s.warn(`external-assets proxy failed ${n.status}: ${i.slice(0,200)}`),null;let s=JSON.parse(i);if(!s[0]?.external_asset_path)return null;let o=`mp:${s[0].external_asset_path}`;return this.externalAssetCache.set(t,o),o}catch(n){return $s.warn({err:n},"external-assets proxy error"),null}}async getLogoAssetId(){if(!Ae.DISCORD_CLIENT_ID||!this.token)return null;if(this.logoAssetChecked)return this.logoAssetId;try{let t=await fetch(`https://discord.com/api/v9/oauth2/applications/${Ae.DISCORD_CLIENT_ID}/assets`,{headers:{Authorization:this.token}}),r=await t.text();if(!t.ok)return $s.warn(`application assets fetch failed ${t.status}: ${r.slice(0,200)}`),this.logoAssetChecked=!0,null;let n=JSON.parse(r);return this.logoAssetId=n.find(i=>i.name==="logo")?.id??null,this.logoAssetChecked=!0,this.logoAssetId}catch(t){return $s.warn({err:t},"application assets fetch error"),this.logoAssetChecked=!0,null}}resolveImageUrl(t){let r=i=>!i.startsWith("https://")||i.includes("localhost")||i.includes("127.0.0.1")?!1:i.includes("s4.anilist.co")||i.includes("anilistcdn")?!0:!["youtube-anime.com","animepahe","animeya.cc","gogocdn.net","weeabo0.xyz","japaneseasmr.com"].some(o=>i.includes(o)),n=t.thumbnail;if(n&&n.includes("/api/image-proxy")){let i=n.match(/url=([^&]+)/);if(i)try{n=decodeURIComponent(i[1])}catch(s){}}if(n&&t.providerName!=="AnimePahe"&&r(n))return n;if(t.thumbnails){let i=t.thumbnails.find(s=>s&&(s.includes("s4.anilist.co")||s.includes("anilistcdn")));if(i)return i}return n&&r(n)?n:null}async updatePresence(t){if(this.lastActivity=t,!this.isEnabled||!this.gateway||this.gateway.readyState!==wg.OPEN)return;let r="dango",n=t.title,i=t.stateLine?t.stateLine:`Episode ${t.episode}${t.totalEpisodes?`/${t.totalEpisodes}`:""}`,s=t.providerName==="ASMR"?2:3,o=this.resolveImageUrl(t),a;if(Ae.DISCORD_CLIENT_ID){let l=(o?await this.getExternalAsset(o):null)??await this.getLogoAssetId();l&&(a={large_image:l,large_text:t.title.slice(0,128)})}let A={since:null,activities:[{name:r,type:s,state:t.isPlaying?i:`${i} (Paused)`,details:n,...Ae.DISCORD_CLIENT_ID?{application_id:Ae.DISCORD_CLIENT_ID}:{},...a?{assets:a}:{},buttons:["Learn More"],metadata:{button_urls:["https://github.com/serifpersia/dango"]},status_display_type:2}],status:"online",afk:!1},u=Date.now();t.isPlaying&&(t.currentTime&&t.currentTime>0&&(A.since=u-Math.round(t.currentTime*1e3)),t.duration&&t.duration>t.currentTime&&(A.activities[0].timestamps={start:u-Math.round(t.currentTime*1e3),end:u+Math.round((t.duration-t.currentTime)*1e3)}));try{this.gateway.send(JSON.stringify({op:3,d:A}))}catch(c){$s.error({err:c},"Failed to send gateway presence update")}}async setIdleStatus(t){if(!this.isEnabled||!this.gateway||this.gateway.readyState!==wg.OPEN)return;let n={home:{details:"Home",state:"Browsing anime"},"home-anime":{details:"Home",state:"Browsing anime"},"home-manga":{details:"Home",state:"Browsing manga"},"home-tv":{details:"Home",state:"Browsing movies & shows"},"home-asmr":{details:"Home",state:"Browsing ASMR works"},search:{details:"Search",state:"Exploring titles..."},"search-anime":{details:"Anime Search",state:"Browsing titles"},"search-manga":{details:"Manga Search",state:"Browsing titles"},"search-tv":{details:"TV Search",state:"Browsing titles"},"search-asmr":{details:"ASMR Search",state:"Browsing titles"},watchlist:{details:"Watchlist",state:"Reviewing the watchlist"},anime:{details:"Anime Info",state:"Reading show details"},insights:{details:"Insights",state:"Reviewing stats"},settings:{details:"Settings",state:"Tweaking preferences"},trackers:{details:"Trackers",state:"Syncing watchlists"},map:{details:"Map",state:"Exploring the global user map"},asmr:{details:"ASMR Info",state:"Reading details"},tv:{details:"TV Info",state:"Reading show details"},manga:{details:"Manga Info",state:"Reading manga details"}}[t]??{details:"dango",state:"Idle"},i=t==="asmr"||t==="home-asmr"||t==="search-asmr",s=await this.getLogoAssetId();try{this.gateway.send(JSON.stringify({op:3,d:{since:null,activities:[{name:"dango",type:i?2:3,state:n.state,details:n.details,...Ae.DISCORD_CLIENT_ID?{application_id:Ae.DISCORD_CLIENT_ID}:{},...s?{assets:{large_image:s,...i?{}:{large_text:"dango"}}}:{},buttons:["Learn More"],metadata:{button_urls:["https://github.com/serifpersia/dango"]},status_display_type:2}],status:"online",afk:!1}}))}catch(o){$s.error({err:o},"Failed to send gateway idle status")}}clearPresence(){if(this.isEnabled){if(this.gateway&&this.gateway.readyState===wg.OPEN)try{this.gateway.send(JSON.stringify({op:3,d:{since:null,activities:[],status:"online",afk:!1}}))}catch{}this.lastActivity=null}}shutdown(){this.isEnabled=!1,this.token=null,this.disconnect()}disconnect(){if(this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.gateway){try{this.gateway.readyState===wg.OPEN&&this.gateway.send(JSON.stringify({op:3,d:{since:null,activities:[],status:"online",afk:!1}})),this.gateway.close()}catch{}this.gateway=null}this.heartbeat&&(clearInterval(this.heartbeat),this.heartbeat=null)}connect(){if(!this.isEnabled||!this.token||this.gateway)return;let t="wss://gateway.discord.gg/?encoding=json&v=10";$s.debug("Connecting Discord gateway"),this.gateway=new wg(t);let r=41250;this.gateway.on("message",n=>{try{let i=JSON.parse(n.toString());if(i.op===10){r=i.d.heartbeat_interval,this.heartbeat=setInterval(()=>{try{this.gateway&&this.gateway.readyState===wg.OPEN&&this.gateway.send(JSON.stringify({op:1,d:null}))}catch{}},r);let s={op:2,d:{token:this.token,capabilities:1021,client_state:{guild_hashes:{},highest_last_message_id:"0",private_channels_version:"0",read_state_version:0,user_guild_settings_version:-1,user_settings_version:-1},compress:!1,presence:{since:null,activities:[],status:"online",afk:!1},properties:{os:"Windows",os_version:"10.0.19044",os_arch:"x64",browser:"Discord Client",client_version:"0.0.20",client_build_number:152131,client_event_source:null,release_channel:"stable",system_locale:"en-US"}}};this.gateway&&this.gateway.send(JSON.stringify(s))}else i.op===11||(i.op===0?i.t==="READY"&&($s.info(`Gateway READY as ${i.d.user?.username||"unknown"}`),this.logoAssetChecked=!1,this.lastActivity&&this.updatePresence(this.lastActivity).catch(s=>$s.warn({err:s},"failed to restore presence after READY"))):i.op===7?($s.warn("Gateway reconnect requested by Discord"),this.handleDisconnect()):i.op===9&&($s.warn("Gateway invalid session, reconnecting..."),this.handleDisconnect()))}catch(i){$s.debug({err:i},"Gateway message parse error")}}),this.gateway.on("close",(n,i)=>{$s.warn(`Gateway closed ${n} ${i.toString().slice(0,100)}`),this.handleDisconnect()}),this.gateway.on("error",n=>{$s.error(n,"Gateway WebSocket error"),this.handleDisconnect()})}handleDisconnect(){this.heartbeat&&(clearInterval(this.heartbeat),this.heartbeat=null),this.gateway=null,this.isEnabled&&this.token&&(this.reconnectTimeout=setTimeout(()=>{this.reconnectTimeout=null,this.connect()},this.RECONNECT_DELAY))}},$r=new F5;var Ci=O.child({module:"DiscordRPC"}),U5=class{client=null;isEnabled=!1;hideMature=!0;reconnectTimeout=null;lastActivity=null;currentSessionId=null;hasPagePresence=!1;hasEverConnected=!1;permanentlyDisabled=!1;heartbeats=new Map;heartbeatTimer=null;retryCount=0;MAX_RETRIES=5;INITIAL_RECONNECT_DELAY=15e3;MAX_RECONNECT_DELAY=3e5;HEARTBEAT_TIMEOUT=4e4;HEARTBEAT_CHECK_INTERVAL=1e4;async setEnabled(t){if(this.isEnabled!==t)if(this.isEnabled=t,t){if(this.permanentlyDisabled){Ci.debug("Discord Rich Presence is unavailable on this device/session. Not retrying."),this.isEnabled=!1;return}this.retryCount=0,$r.setEnabled(!0),$r.serviceEnabled||this.connect()}else await this.disconnect(),$r.setEnabled(!1)}get isServiceEnabled(){return this.isEnabled&&(this.client!==null||$r.serviceEnabled)}setHideMature(t){this.hideMature=t}heartbeat(t){this.heartbeats.set(t,Date.now()),!this.heartbeatTimer&&this.isEnabled&&(this.heartbeatTimer=setInterval(()=>{this.checkHeartbeats()},this.HEARTBEAT_CHECK_INTERVAL))}removeHeartbeat(t){this.heartbeats.delete(t),this.checkHeartbeats()}isLocked(t){if(!t||!this.currentSessionId||t===this.currentSessionId)return!1;let r=this.heartbeats.get(this.currentSessionId);return r!==void 0&&Date.now()-r<=this.HEARTBEAT_TIMEOUT}async checkHeartbeats(){if(!this.isEnabled){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null);return}let t=Date.now();for(let[r,n]of this.heartbeats)t-n>this.HEARTBEAT_TIMEOUT&&this.heartbeats.delete(r);this.currentSessionId&&!this.heartbeats.has(this.currentSessionId)&&(this.lastActivity=null,this.currentSessionId=null,this.hasPagePresence=!1),this.heartbeats.size===0&&(this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),(this.hasPagePresence||this.lastActivity||this.currentSessionId)&&(this.lastActivity=null,this.currentSessionId=null,this.hasPagePresence=!1,await this.setIdleStatus("idle")))}async connect(){if(!this.isEnabled||this.client||this.permanentlyDisabled)return;if($r.serviceEnabled){Ci.debug("Using Discord Gateway for presence (token configured). Skipping local RPC.");return}let t=!!process.env.TERMUX_VERSION,r=process.platform==="android";if(t||r){Ci.debug("Discord Rich Presence is not supported on Android/Termux. Skipping connection."),this.isEnabled=!1,this.permanentlyDisabled=!0;return}let n=Ae.DISCORD_CLIENT_ID;if(!n){Ci.debug("DISCORD_CLIENT_ID is not configured. Discord Rich Presence is disabled."),this.isEnabled=!1,this.permanentlyDisabled=!0;return}try{this.client=new gm.Client({clientId:n}),this.client.on("ready",()=>{Ci.info("Connected to Discord client successfully"),this.hasEverConnected=!0,this.retryCount=0,this.lastActivity?this.updatePresence(this.lastActivity):this.setIdleStatus("idle")}),this.client.on("disconnected",()=>{Ci.warn("Disconnected from Discord client, scheduling reconnect..."),this.cleanup(),this.scheduleReconnect()}),this.client.on("ERROR",o=>{let a=o instanceof Error?o.message:String(o);if(a.includes("ENOENT")||a.includes("ECONNREFUSED")){if(this.cleanup(),!this.hasEverConnected){Ci.debug("Discord client not detected. Rich Presence disabled for this session."),this.isEnabled=!1,this.permanentlyDisabled=!0;return}Ci.debug("Discord client not running or connection refused."),this.scheduleReconnect()}else Ci.error({err:o},"Discord RPC client error"),this.cleanup(),this.scheduleReconnect()});let i=this.client.login(),s=new Promise((o,a)=>setTimeout(()=>a(new Error("Login timeout")),5e3));await Promise.race([i,s]),this.hasEverConnected=!0}catch{if(this.cleanup(),!this.hasEverConnected){Ci.debug("Discord client not available at startup. Rich Presence disabled for the rest of this session."),this.isEnabled=!1,this.permanentlyDisabled=!0;return}this.scheduleReconnect()}}scheduleReconnect(){if(!this.isEnabled||this.reconnectTimeout||this.permanentlyDisabled)return;let t=Math.min(this.INITIAL_RECONNECT_DELAY*Math.pow(1.5,this.retryCount),this.MAX_RECONNECT_DELAY);this.retryCount++,this.retryCount>this.MAX_RETRIES?Ci.debug(`Discord RPC login failed ${this.retryCount} times. Retrying in ${Math.round(t/1e3)}s...`):Ci.info(`Discord RPC login failed. Retrying in ${Math.round(t/1e3)}s...`),this.reconnectTimeout=setTimeout(()=>{this.reconnectTimeout=null,this.connect()},t)}cleanup(){if(this.client){try{this.client.removeAllListeners(),this.client.destroy()}catch{}this.client=null}}async disconnect(){if(this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.client?.user)try{await this.client.user.clearActivity()}catch{}this.cleanup(),this.lastActivity=null,this.currentSessionId=null,this.heartbeats.clear(),this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),$r.disconnect()}async updatePresence(t){if(this.isLocked(t.sessionId)||(this.lastActivity=t,t.sessionId&&(this.currentSessionId=t.sessionId,this.heartbeat(t.sessionId)),!this.isEnabled))return;if(this.hideMature&&t.isAdult){if($r.serviceEnabled)$r.clearPresence();else if(this.client?.user)try{await this.client.user.clearActivity()}catch{}return}if($r.serviceEnabled){$r.updatePresence(t);return}if(!this.client||!this.client.user)return;let r=i=>!i.startsWith("https://")||i.includes("localhost")||i.includes("127.0.0.1")?!1:i.includes("s4.anilist.co")||i.includes("anilistcdn")?!0:!["youtube-anime.com","animepahe","animeya.cc","gogocdn.net","weeabo0.xyz","japaneseasmr.com"].some(o=>i.includes(o)),n="logo";if(t.thumbnail&&t.providerName!=="AnimePahe"){let i=t.thumbnail;if(i.includes("/api/image-proxy")){let s=i.match(/url=([^&]+)/);s&&(i=decodeURIComponent(s[1]))}if(r(i))n=i;else if(t.thumbnails){let s=t.thumbnails.find(o=>o&&(o.includes("s4.anilist.co")||o.includes("anilistcdn")));s&&(n=s)}}try{if(!t.isPlaying){await this.client.user.clearActivity(),await this.client.user.setActivity({details:t.title,state:t.stateLine?`${t.stateLine} (Paused)`:`Episode ${t.episode}${t.totalEpisodes?`/${t.totalEpisodes}`:""} (Paused)`,largeImageKey:n,largeImageText:t.title,type:t.providerName==="ASMR"?2:3,statusDisplayType:gm.StatusDisplayType.DETAILS,buttons:[{label:"Learn More",url:"https://github.com/serifpersia/dango"}]}),this.hasPagePresence=!1;return}let i=Math.round(Date.now()/1e3),s={details:t.title,state:t.stateLine?t.stateLine:`Episode ${t.episode}${t.totalEpisodes?`/${t.totalEpisodes}`:""}`,largeImageKey:n,largeImageText:t.title,type:t.providerName==="ASMR"?2:3,statusDisplayType:gm.StatusDisplayType.DETAILS,buttons:[{label:"Learn More",url:"https://github.com/serifpersia/dango"}]};t.currentTime&&t.currentTime>0&&(s.startTimestamp=Math.round(i-t.currentTime)),t.duration&&t.duration>t.currentTime&&(s.endTimestamp=Math.round(i+(t.duration-t.currentTime))),await this.client.user.setActivity(s),this.hasPagePresence=!1}catch(i){Ci.error({err:i},"Failed to set Discord activity")}}async setIdleStatus(t,r){if(this.isLocked(r)||!this.isEnabled)return;if($r.serviceEnabled){$r.setIdleStatus(t);return}if(!this.client||!this.client.user){Ci.warn("Discord client not connected, skipping idle status update");return}let n={home:{details:"Home",state:"Browsing anime"},"home-anime":{details:"Home",state:"Browsing anime"},"home-manga":{details:"Home",state:"Browsing manga"},"home-tv":{details:"Home",state:"Browsing movies & shows"},"home-asmr":{details:"Home",state:"Browsing ASMR works"},search:{details:"Search",state:"Exploring titles..."},"search-anime":{details:"Anime Search",state:"Browsing titles"},"search-manga":{details:"Manga Search",state:"Browsing titles"},"search-tv":{details:"TV Search",state:"Browsing titles"},"search-asmr":{details:"ASMR Search",state:"Browsing titles"},watchlist:{details:"Watchlist",state:"Reviewing the watchlist"},anime:{details:"Anime Info",state:"Reading show details"},insights:{details:"Insights",state:"Reviewing stats"},settings:{details:"Settings",state:"Tweaking preferences"},mal:{details:"MAL Sync",state:"Syncing with MyAnimeList"},map:{details:"Map",state:"Exploring the global user map"},asmr:{details:"ASMR Info",state:"Reading details"},tv:{details:"TV Info",state:"Reading show details"},manga:{details:"Manga Info",state:"Reading manga details"}},i=n[t]??{details:"dango",state:"Idle"},s=t==="asmr"||t==="home-asmr"||t==="search-asmr";try{if(!this.client||!this.client.user){Ci.warn("Discord client not connected, skipping idle status update");return}await this.client.user.setActivity({details:i.details,state:i.state,largeImageKey:"logo",largeImageText:s?void 0:"dango",type:s?2:3,statusDisplayType:gm.StatusDisplayType.DETAILS,buttons:[{label:"Learn More",url:"https://github.com/serifpersia/dango"}]}),this.hasPagePresence=t in n}catch(o){o.message==="Closed by Discord"?Ci.warn("Discord connection ended, skipping idle status update"):Ci.error({err:o},"Failed to set Discord idle status")}}async clearPresence(t){if(!(t&&this.currentSessionId&&t!==this.currentSessionId)){if(this.lastActivity=null,this.currentSessionId=null,$r.serviceEnabled){$r.clearPresence();return}await this.setIdleStatus("idle")}}},sb=new U5;var _5=(e,t,r)=>(n,i)=>{let s=-1;return o(0);async function o(a){if(a<=s)throw new Error("next() called multiple times");s=a;let A,u=!1,c;if(e[a]?(c=e[a][0][0],n.req.routeIndex=a):c=a===e.length&&i||void 0,c)try{A=await c(n,()=>o(a+1))}catch(l){if(l instanceof Error&&t)n.error=l,A=await t(l,n),u=!0;else throw l}else n.finalized===!1&&r&&(A=await r(n));return A&&(n.finalized===!1||u)&&(n.res=A),n}};var Bi="ALL",uBe="all",cBe=["get","post","put","delete","options","patch","query"],Sx="Can not add a route since the matcher is already built.",Tx=class extends Error{};var lBe="__COMPOSED_HANDLER";var Jht=e=>e.text("404 Not Found",404),dBe=(e,t)=>{if("getResponse"in e){let r=e.getResponse();return t.newResponse(r.body,r)}return console.error(e),t.text("Internal Server Error",500)},hBe=class fBe{get;post;put;delete;options;patch;query;all;on;use;router;getPath;_basePath="/";#e="/";routes=[];constructor(t={}){[...cBe,uBe].forEach(s=>{this[s]=(o,...a)=>{let A=s.toUpperCase();return typeof o=="string"?this.#e=o:this.#i(A,this.#e,o),a.forEach(u=>{this.#i(A,this.#e,u)}),this}}),this.on=(s,o,...a)=>{for(let A of[o].flat()){this.#e=A;for(let u of[s].flat()){let c=u.toUpperCase();for(let l of a)this.#i(c,this.#e,l)}}return this},this.use=(s,...o)=>(typeof s=="string"?this.#e=s:(this.#e="*",o.unshift(s)),o.forEach(a=>{this.#i(Bi,this.#e,a)}),this);let{strict:n,...i}=t;Object.assign(this,i),this.getPath=n??!0?t.getPath??uk:k9}#t(){let t=new fBe({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#r=this.#r,t.routes=this.routes,t}#r=Jht;errorHandler=dBe;route(t,r){let n=this.basePath(t);return r.routes.map(i=>{let s;r.errorHandler===dBe?s=i.handler:(s=async(o,a)=>(await _5([],r.errorHandler)(o,()=>i.handler(o,a))).res,s[lBe]=i.handler),n.#i(i.method,i.path,s,i.basePath)}),this}basePath(t){let r=this.#t();return r._basePath=Bl(this._basePath,t),r}onError=t=>(this.errorHandler=t,this);notFound=t=>(this.#r=t,this);mount(t,r,n){let i,s;n&&(typeof n=="function"?s=n:(s=n.optionHandler,n.replaceRequest===!1?i=A=>A:i=n.replaceRequest));let o=s?A=>{let u=s(A);return Array.isArray(u)?u:[u]}:A=>{let u;try{u=A.executionCtx}catch{}return[A.env,u]};i||=(()=>{let A=Bl(this._basePath,t),u=A==="/"?0:A.length;return c=>{let l=new URL(c.url);return l.pathname=this.getPath(c).slice(u)||"/",new Request(l,c)}})();let a=async(A,u)=>{let c=await r(i(A.req.raw),...o(A));if(c)return c;await u()};return this.#i(Bi,Bl(t,"*"),a),this}#i(t,r,n,i){r=Bl(this._basePath,r);let s={basePath:i!==void 0?Bl(this._basePath,i):this._basePath,path:r,method:t,handler:n};this.router.add(t,r,[n,s]),this.routes.push(s)}#s(t,r){if(t instanceof Error)return this.errorHandler(t,r);throw t}#n(t,r,n,i){if(i==="HEAD")return(async()=>new Response(null,await this.#n(t,r,n,"GET")))();let s=this.getPath(t,{env:n}),o=this.router.match(i,s),a=new lk(t,{path:s,matchResult:o,env:n,executionCtx:r,notFoundHandler:this.#r});if(o[0].length===1){let u;try{u=o[0][0][0][0](a,async()=>{a.res=await this.#r(a)})}catch(c){return this.#s(c,a)}return u instanceof Promise?u.then(c=>c||(a.finalized?a.res:this.#r(a))).catch(c=>this.#s(c,a)):u??this.#r(a)}let A=_5(o[0],this.errorHandler,this.#r);return(async()=>{try{let u=await A(a);if(!u.finalized)throw new Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return u.res}catch(u){return this.#s(u,a)}})()}fetch=(t,...r)=>this.#n(t,r[1],r[0],t.method);request=(t,r,n,i)=>t instanceof Request?this.fetch(r?new Request(t,r):t,n,i):(t=t.toString(),this.fetch(new Request(/^https?:\/\//.test(t)?t:`http://localhost${Bl("/",t)}`,r),n,i));fire=()=>{addEventListener("fetch",t=>{t.respondWith(this.#n(t.request,t,void 0,t.request.method))})}};var ii=()=>Object.create(null);var Dx=[];function O5(e,t){let r=this.buildAllMatchers(),n=((i,s)=>{let o=r[i]||r[Bi],a=o[2][s];if(a)return a;let A=s.match(o[0]);if(!A)return[[],Dx];let u=A.indexOf("",1);return[o[1][u],A]});return this.match=n,n(e,t)}var pm="[^/]+",eh=".*",il="(?:|/.*)",Zd=Symbol(),gBe=new Set(".\\+*[^]$()");function jht(e,t){return e.length===1?t.length===1?e<t?-1:1:-1:t.length===1?1:e===eh||e===il?t===il?-1:1:t===eh||t===il?-1:e===pm?1:t===pm?-1:e.length===t.length?e<t?-1:1:t.length-e.length}var pBe=class P5{#e;#t;#r=ii();insert(t,r,n,i,s){let o=this;for(let a=0,A=t.length;a<A;a++){let u=t[a],c=u.length===1?u==="*"?a===A-1?["","",eh]:["","",pm]:null:u==="/*"?["","",il]:u.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),l;if(c){let h=c[1],d=c[2]||pm;if(h&&c[2]&&(d===".*"||(d=d.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(d))||d.length===1&&gBe.has(d)))throw Zd;if(l=o.#r[d],!l){if(d!==eh&&d!==il){for(let f in o.#r)if((d.length>1||f.length>1)&&f!==eh&&f!==il)throw Zd}l=o.#r[d]=new P5}h!==""&&(l.#t??=i.varIndex++,n.push([h,l.#t]))}else if(l=o.#r[u],!l){for(let h in o.#r)if(h.length>1&&h!==eh&&h!==il)throw Zd;l=o.#r[u]=new P5}o=l}if(o.#e!==void 0)throw Zd;o.#e=s?-1:r}buildRegExpStr(){let r=Object.keys(this.#r).sort(jht).map(n=>{let i=this.#r[n],s=i.buildRegExpStr();return s===""?"":(typeof i.#t=="number"?`(${n})@${i.#t}`:gBe.has(n)?`\\${n}`:n)+s}).filter(Boolean);return typeof this.#e=="number"&&this.#e!==-1&&r.unshift(`#${this.#e}`),r.length===0?"":r.length===1?r[0]:"(?:"+r.join("|")+")"}};var H5=class{#e={varIndex:0};#t=new pBe;#r=0;paths=ii();insert(e,t){if(t){this.#t.insert(e.split(""),0,[],this.#e,!0);return}let r=[],n=[],i=e;for(let o=0;;){let a=!1;if(i=i.replace(/\{[^}]+\}/g,A=>{let u=`@\\${o}`;return n[o]=[u,A],o++,a=!0,u}),!a)break}let s=i.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let o=n.length-1;o>=0;o--){let[a]=n[o];for(let A=s.length-1;A>=0;A--)if(s[A].indexOf(a)!==-1){s[A]=s[A].replace(a,n[o][1]);break}}this.#t.insert(s,this.#r,r,this.#e,!1),this.paths[e]=[this.#r++,r]}buildRegExp(){let e=this.#t.buildRegExpStr();if(e==="")return[/^$/,[],[]];let t=0,r=[],n=[];return e=e.replace(/#(\d+)|@(\d+)|\.\*\$/g,(i,s,o)=>s!==void 0?(r[++t]=Number(s),"$()"):(o!==void 0&&(n[Number(o)]=++t),"")),[new RegExp(`^${e}`),r,n]}};var EBe=ii();function mBe(e){return EBe[e]??=new RegExp(`^${e.replace(/\/:[^/{}]+(?:\{\[\^\/]\+})?(?=[/{]|$)|\/?\*$|([.\\+*[^\]$()?{}|])/g,(t,r)=>r?`\\${r}`:t==="/*"?il:t==="*"?eh:`/:${pm}`)}$`)}function Nx(e,t){for(let r of Object.keys(e).sort((n,i)=>i.length-n.length))if(mBe(r).test(t))return[...e[r]]}var Rx=class{name="RegExpRouter";#e;#t;#r;constructor(){this.#e={[Bi]:ii()},this.#t={[Bi]:ii()},this.#r={[Bi]:new H5}}#i(e,t){try{this.#r[e].insert(t,!/\*|\/:/.test(t))}catch(r){throw r===Zd?new Tx(t):r}}add(e,t,r){let n=this.#e,i=this.#t;if(!n)throw new Error(Sx);if(!n[e]){this.#r[e]=new H5;for(let a of[n,i]){a[e]=ii();for(let A in a[Bi])a[e][A]=[...a[Bi][A]],this.#i(e,A)}}t==="/*"&&(t="*");let s=e===Bi?Object.keys(n):[e];if(/\*$/.test(t)){let a=mBe(t);for(let A of s)n[A][t]||(this.#i(A,t),n[A][t]=Nx(n[A],t)||Nx(n[Bi],t)||[]);for(let A of[n,i])for(let u of s)for(let c in A[u])a.test(c)&&A[u][c].push([r,t]);return}let o=uQ(t)||[t];for(let a of o)for(let A of s)i[A][a]||(this.#i(A,a),i[A][a]=Nx(n[A],a)||Nx(n[Bi],a)||[]),i[A][a].push([r,a])}match=O5;buildAllMatchers(){let e=ii();for(let t of Object.keys(this.#t))e[t]=this.#s(t);return this.#e=this.#t=this.#r=void 0,EBe=ii(),e}#s(e){let t=this.#e[e],r=this.#t[e],n=this.#r[e],i=ii(),s=[],[o,a,A]=n.buildRegExp();for(let u of[t,r])for(let c in u){let l=u[c],h=n.paths[c];if(!h){i[c]=[l.map(([d])=>[d,ii()]),Dx];continue}s[h[0]]=l.map(([d,f])=>[d,n.paths[f][1].reduceRight((g,[p],m)=>(g[p]=A[h[1][m][1]],g),ii())])}return[o,a.map(u=>s[u]),i]}};var G5=class{name="SmartRouter";#e=[];#t=[];constructor(e){this.#e=e.routers}add(e,t,r){if(!this.#t)throw new Error(Sx);this.#t.push([e,t,r])}match(e,t){if(!this.#t)throw new Error("Fatal error");let r=this.#e,n=this.#t,i=r.length,s=0,o;for(;s<i;s++){let a=r[s];try{for(let A=0,u=n.length;A<u;A++)a.add(...n[A]);o=a.match(e,t)}catch(A){if(A instanceof Tx)continue;throw A}this.match=a.match.bind(a),this.#e=[a],this.#t=void 0;break}if(s===i)throw new Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,o}get activeRouter(){if(this.#t||this.#e.length!==1)throw new Error("No active router has been determined yet.");return this.#e[0]}};var Y5=ii(),$ht=0,IBe=class CBe{#e=[];#t=ii();#r=[];#i;#s=Y5;insert(t,r,n){let i=this,s=R9(r),o=new Set,a=0;for(let A of s){let u=s[++a],c=x9(A,u)||(u===void 0&&A&&A.indexOf("*")===A.length-1?A:null),l=Array.isArray(c),h=l?c[0]:c||A,d=i.#t[h]||=new CBe;c&&!d.#i&&(d.#i=c,i.#r.push(d)),i=d,l&&o.add(c[1])}i.#e.push({[t]:{handler:n,possibleKeys:[...o],score:++$ht}})}#n(t,r,n,i,s){for(let o=0,a=r.#e.length;o<a;o++){let A=r.#e[o],u=A[n]||A[Bi];if(u){u.params=ii(),t.push(u);for(let c=0,l=u.possibleKeys.length;c<l;c++){let h=u.possibleKeys[c];u.params[h]=s?.[h]&&!c?s[h]:i[h]??s?.[h]}}}}search(t,r){let n=[];this.#s=Y5;let s=[this],o=Ak(r),a=[],A=o.length,u=null;for(let c=0;c<A;c++){let l=o[c],h=c===A-1,d=[];for(let g=0,p=s.length;g<p;g++){let m=s[g],I=m.#t[l];I&&(I.#s=m.#s,h?(I.#t["*"]&&this.#n(n,I.#t["*"],t,m.#s),this.#n(n,I,t,m.#s)):d.push(I));for(let C of m.#r){let y=C.#i,Q=m.#s===Y5?{}:{...m.#s};if(typeof y=="string"){(y==="*"||l.startsWith(y.slice(0,-1)))&&(this.#n(n,C,t,m.#s),y==="*"&&(C.#s=Q,d.push(C)));continue}let[,D,N]=y;if(!(!l&&N===!0)){if(N!==!0){if(!u){u=[];let x=r[0]==="/"?1:0;for(let v=0;v<A;v++)u[v]=x,x+=o[v].length+1}let S=r.slice(u[c]),B=N.exec(S);if(B){Q[D]=B[0],this.#n(n,C,t,m.#s,Q),B[0].length===S.length&&C.#t["*"]&&this.#n(n,C.#t["*"],t,m.#s,Q);for(let x in C.#t){C.#s=Q;let v=B[0].match(/\//g)?.length??0;(a[v]||=[]).push(C);break}continue}}(N===!0||N.test(l))&&(Q[D]=l,h?(this.#n(n,C,t,Q,m.#s),C.#t["*"]&&this.#n(n,C.#t["*"],t,Q,m.#s)):(C.#s=Q,d.push(C)))}}}let f=a.shift();s=f?d.concat(f):d}return n[1]&&n.sort((c,l)=>c.score-l.score),[n.map(({handler:c,params:l})=>[c,l])]}};var V5=class{name="TrieRouter";#e=new IBe;add(e,t,r){for(let n of uQ(t)||[t])this.#e.insert(e,n,r)}match(e,t){return this.#e.search(e,t)}};var W5=class extends hBe{constructor(e={}){super(e),this.router=e.router??new G5({routers:[new Rx,new V5]})}};var yBe=e=>e===32||e===9||e===10||e===13,xx=(e,t)=>{for(;t<e.length&&yBe(e.charCodeAt(t));)t++;return t},ob=(e,t)=>{for(;t>0&&yBe(e.charCodeAt(t-1));)t--;return t},BBe=(e,t)=>{for(;t<e.length;){let r=e.charCodeAt(t);if(r===59)return[t+1,!0];if(r===44)return[t+1,!1];t++}return[t,!1]},Kht=(e,t)=>{let r=t,n=!1;for(;r<e.length;){let i=e.charCodeAt(r);if(n&&i===92)r++;else if(i===34)n=!n;else if(!n&&i===44)return r+1;r++}return r},Xht=(e,t)=>{t=xx(e,t);let r=t,n,i,s=!1;for(;r<e.length;){let A=e.charCodeAt(r);if(A===61){n=e.slice(t,ob(e,r)),r++;break}if(A===59)return[r+1,void 0,void 0,!0];if(A===44)return[r+1,void 0,void 0,!1];r++}if(n===void 0)return[r,void 0,void 0,!1];if(r=xx(e,r),e.charCodeAt(r)===61){let A=BBe(e,r+1);return[A[0],n,void 0,A[1]]}let o=!1,a=r;for(;r<e.length;){let A=e.charCodeAt(r);if(o&&A===92)r++;else if(A===34){if(o){let u=xx(e,r+1),c=e.charCodeAt(u);if(u<e.length&&!(c===59||c===44)){let l=BBe(e,u);return[l[0],n,void 0,l[1]]}if(i=e.slice(a+1,r),i.includes("\\")&&(i=i.replace(/\\(.)/g,"$1")),c===44)return[u+1,n,i,!1];c===59&&(s=!0,u++),r=u;break}o=!0}else if(!o&&(A===59||A===44)){i=e.slice(a,ob(e,r)),A===59&&(s=!0),r++;break}r++}return[r,n,i??e.slice(a,ob(e,r)),s]},zht=(e,t)=>{let r={type:"",params:Object.create(null),q:1};t=xx(e,t);let n=t;for(;n<e.length;){let a=e.charCodeAt(n);if(a===59||a===44){if(r.type=e.slice(t,ob(e,n)),n++,a===44)return[n,r.type?r:void 0];if(!r.type)return[Kht(e,n),void 0];break}n++}if(!r.type)return r.type=e.slice(t,ob(e,e.length)),[e.length,r.type?r:void 0];let i,s,o;for(;n<e.length&&([n,i,s,o]=Xht(e,n),i&&s&&(r.params[i]=s),!!o););return[n,r]},bBe=e=>{if(!e)return[];let t=[],r=0,n,i=!1,s;for(;r<e.length;)[r,n]=zht(e,r),n&&(n.q=Zht(n.params.q??n.params.Q),t.push(n),s&&s.q<n.q&&(i=!0),s=n);return i&&t.sort((o,a)=>a.q-o.q),t},Zht=e=>{if(e===void 0||e==="")return 1;if(e==="NaN")return 0;let t=Number(e);return Number.isNaN(t)?1:t<0?0:t>1?1:t};var QBe=/^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|msgpack|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|vnd\.msgpack|wasm|x-httpd-php|x-javascript|x-msgpack|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml|msgpack))(?:[;\s]|$)/i;var eft=["gzip","deflate"],tft=/(?:^|,)\s*?no-transform\s*?(?:,|$)/i,rft=(e,t)=>{if(e===void 0)return;let r=bBe(e),n=r.find(s=>s.type==="*")?.q,i;for(let s of t){let o=r.find(A=>A.type.toLowerCase()===s),a=o?o.q:n??0;if(a===1)return s;a>0&&(!i||a>i.q)&&(i={encoding:s,q:a})}return i?.encoding},nft=/(?:^|,)\s*accept-encoding\s*(?:,|$)/i,wBe=e=>{let t=e?.threshold??1024,r=e?.encoding?[e.encoding]:eft,n=e?.contentTypeFilter??QBe,i=typeof n=="function"?s=>{let o=s.headers.get("Content-Type");return o&&n(o)}:s=>{let o=s.headers.get("Content-Type");return o&&n.test(o)};return async function(o,a){await a();let A=o.res.headers.get("Content-Length");if(o.res.status===206||o.res.headers.has("Content-Encoding")||o.res.headers.has("Transfer-Encoding")||o.req.method==="HEAD"||A&&Number(A)<t||!i(o.res)||!ift(o.res))return;let u=o.res.headers.get("Vary");u!=="*"&&!(u&&nft.test(u))&&o.header("Vary",u?`${u}, Accept-Encoding`:"Accept-Encoding");let c=o.req.header("Accept-Encoding"),l=rft(c,r);if(!l||!o.res.body)return;let h=new CompressionStream(l);o.res=new Response(o.res.body.pipeThrough(h),o.res),o.res.headers.delete("Content-Length"),o.res.headers.set("Content-Encoding",l);let d=o.res.headers.get("ETag");d&&!d.startsWith("W/")&&o.res.headers.set("ETag",`W/${d}`)}},ift=e=>{let t=e.headers.get("Cache-Control");return!t||!tft.test(t)};import kwe from"path";import Jm from"fs";var SBe=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",sft=SBe+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040",oft="["+SBe+"]["+sft+"]*",aft=new RegExp("^"+oft+"$");function TBe(e,t){let r=[],n=t.exec(e);for(;n;){let i=[];i.startIndex=t.lastIndex-n[0].length;let s=n.length;for(let o=0;o<s;o++)i.push(n[o]);r.push(i),n=t.exec(e)}return r}var q5=function(e){let t=aft.exec(e);return!(t===null||typeof t>"u")};function DBe(e){return typeof e<"u"}var ab=["hasOwnProperty","toString","valueOf","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"],vx=["__proto__","constructor","prototype"];var Aft={allowBooleanAttributes:!1,unpairedTags:[]};function vBe(e,t){t=Object.assign({},Aft,t);let r=[],n=!1,i=!1;e[0]==="\uFEFF"&&(e=e.substr(1));for(let s=0;s<e.length;s++)if(e[s]==="<"&&e[s+1]==="?"){if(s+=2,s=NBe(e,s),s.err)return s}else if(e[s]==="<"){let o=s;if(s++,e[s]==="!"){s=RBe(e,s);continue}else{let a=!1;e[s]==="/"&&(a=!0,s++);let A="";for(;s<e.length&&e[s]!==">"&&e[s]!==" "&&e[s]!==" "&&e[s]!==`
|
|
469
|
+
__HTTP_STATUS__%{http_code}`,"--",e],n;try{n=TKe("curl",r,{encoding:"utf-8",maxBuffer:10*1024*1024})}catch{return null}let i=n.match(/__HTTP_STATUS__(\d+)\s*$/);return{status:i?parseInt(i[1],10):0,body:i&&i.index!==void 0?n.slice(0,i.index):n}}function FKe(e){let t=async(r,n,i=SD)=>FB(fetch(r,{...n,headers:{"User-Agent":MB,...n?.headers}}),i,`fetch ${r}`);return{cache:{get:r=>e.get(r),set:(r,n,i)=>{e.set(r,n,i)}},logger:{info:(r,n)=>{O.info(r,n)},warn:(r,n)=>{O.warn(r,n)},error:(r,n)=>{O.error(r,n)},debug:(r,n)=>{O.debug(r,n)}},fetchText:async(r,n)=>{try{let i=await t(r,n);return i.ok?await i.text():null}catch{return null}},fetchJson:async(r,n)=>{let i=await t(r,n);if(!i.ok)throw new Error(`HTTP ${i.status}: ${r}`);return Yt(i)},proxyUrl:(r,n)=>`/api/proxy?url=${encodeURIComponent(r)}&referer=${encodeURIComponent(n)}`,userAgent:MB,titleMatch:{buildQueryVariants:IB,pickBestMatch:kc},resolveBestShowId:async(r,n,i)=>{let s=[r,n].filter(o=>typeof o=="string"&&o.trim().length>0);if(s.length===0)return null;for(let o of IB(r,n)){let a;try{a=await i(o)}catch(u){if(u.message==="AUTH_REQUIRED")throw u;continue}if(!a||a.length===0)continue;let A=kc(a.filter(u=>u&&typeof u.id=="string"&&u.id.length>0),s);if(A)return A.item.id}return null},anilist:{request:(r,n)=>ur(r,n),parseMalId:Os,searchByTitle:Ps},kitsu:{metaByAnilistId:QB},tmdb:{base:To,image:Dd,get:async r=>{try{let n=await Uc(),i=r.includes("?")?"&":"?",s=await t(`${To}${r}${i}api_key=${n}`);return s.ok?Yt(s):null}catch{return null}}},request:{get:r=>Op.getStore()?.get(r)},cookies:{sanitizeCfClearance:Pp,buildCfClearanceCookie:Eu},crypto:{aes256CbcDecryptJson:MKe,hmacSha256Base64Url:(r,n)=>wD.createHmac("sha256",r).update(n).digest("base64url")},scraping:{fetch:async(r,n)=>{let i=typeof r=="string"?{url:r,...n??{}}:r,{url:s,...o}=i,a=await RKe({url:s,method:"GET",responseType:"text",throwHttpErrors:!1,...o});return{statusCode:a.statusCode,body:String(a.body??""),headers:a.headers}}},curl:{getJson:async(r,n)=>{try{let i=Nae(r,n);return!i||i.status!==200?null:JSON.parse(i.body)}catch{return null}},getText:async(r,n)=>{let i=Nae(r,n);return!i||i.status!==200?null:i.body}},cheerio:{load:r=>T2(r)}}}function J8(e){if(!e||typeof e!="object")return null;let t=e;return typeof t.name=="string"?t:null}function Mae(e,t){return t.every(r=>typeof e[r]=="function")}function Fae(e){let t=J8(e);return!!t&&Mae(t,["search","getEpisodes","getStreamUrls"])}function Uae(e){let t=J8(e);return!!t&&Mae(t,["search","getDetail","getChapters","getPages"])}function _ae(e){let t=J8(e);return!!t&&(typeof t.getSources=="function"||typeof t.getEmbedUrl=="function")}function UKe(e,t){return e==="manga"?Uae(t):e==="tv"?_ae(t):e==="asmr"?V8(t):Fae(t)}var Rae=new WeakMap;function BD(e,t){let r=Rae.get(t);r||(r=new Map,Rae.set(t,r));let n=r.get(e);if(n)return n;let i=new Proxy(t,{get(s,o){let a=Reflect.get(s,o);return typeof a!="function"?a:(...A)=>{let u=Op.getStore();if(!u)return a.apply(s,A);let c=u.get(`${e}_cookie`),l=u.get(`${e}_ua`);if(!c&&!l)return a.apply(s,A);let h=new Map(u);return c&&h.set("cookie",c),l&&h.set("ua",l),Op.run(h,()=>a.apply(s,A))}}});return r.set(e,i),i}function xae(e,t,r,n){return t.kind==="manga"?Uae(n)?(e.mangaProviders[r]=BD(r,n),!0):!1:t.kind==="tv"?_ae(n)?(e.tvProviders[r]=BD(r,n),!0):!1:t.kind==="asmr"?V8(n)?(e.asmrProviders[r]=BD(r,n),!0):!1:Fae(n)?(e.providers[r]=BD(r,n),!0):!1}function _Ke(e,t){let r=t.trim().replace(/\/+$/,"");return{name:e,getEmbedUrl:async n=>{let i=Number(n.tmdbId);return i?n.type==="movie"?`${r}/movie/${i}`:`${r}/tv/${i}/${n.season||1}/${n.episode||1}`:null}}}async function W8(e,t,r,n,i){if(e.minDango&&!Sae(Dae,e.minDango))return{provider:null,error:`requires dango ${e.minDango}, running ${Dae}`};if(e.embedBase)return{provider:_Ke(e.id,e.embedBase)};let s=LKe(e.entry,t);await Pi.promises.mkdir(r,{recursive:!0});let o=LB(e),a=As.join(r,o),A=`${a}:${e.kind??"anime"}`,u=null;try{let h=await Pi.promises.readFile(a);(e.sha256&&bD(h)===e.sha256||!e.sha256&&i)&&(u=h)}catch{}if(u){let h=QD.get(A);if(h)return O.debug({provider:e.id,version:e.version},"remote provider reused cached instance"),{provider:h.provider,facets:h.facets}}else{try{u=await kKe(s)}catch(h){return{provider:null,error:`download failed: ${h.message}`}}if(e.sha256){if(bD(u)!==e.sha256)return{provider:null,error:`sha256 mismatch for ${e.id}`}}else if(!i)return{provider:null,error:`missing sha256 for ${e.id}`};await yD(a,u)}let c=`${e.version}-${e.sha256??"nosha"}`,l=await PKe(a,c,n,e);return l.provider&&!l.error&&QD.set(A,{provider:l.provider,facets:l.facets}),l}var QD=new Map;function LB(e){return`${e.id}-${e.version}-${e.sha256??"nosha"}.mjs`}function OKe(e){let t,r,n;for(let[i,s]of Object.entries(e)){if(i==="default"||!Array.isArray(s)||s.length===0||!s.every(A=>typeof A=="string"&&A.length>0))continue;let o=s.filter(A=>A.length<=64).slice(0,500);if(o.length===0)continue;let a=i.toUpperCase();a.includes("GENRE")||a.includes("TAG")?t??=o:a.includes("ORDER")?r??=o:a.includes("SORT")&&(n??=o)}if(!(!t&&!r&&!n))return{...t?{genres:t}:{},...r?{orders:r}:{},...n?{sorts:n}:{}}}async function PKe(e,t,r,n){let i=n.id,s;try{let A=`${NKe(e).href}?v=${encodeURIComponent(t)}`;s=await FB(import(A),SD,`import ${i}`)}catch(A){return{provider:null,error:`import failed: ${A.message}`}}let o=s.default;if(typeof o!="function")return{provider:null,error:"missing default factory export"};let a;try{a=await FB(Promise.resolve(o(r)),1e4,`factory ${i}`)}catch(A){return{provider:null,error:`factory failed: ${A.message}`}}return UKe(n.kind,a)?{provider:a,facets:OKe(s)}:{provider:null,error:"invalid provider shape"}}async function HKe(e,t,r){if(e.embedBase)return W8(e,"",t,r,!1);if(!e.sha256)return{provider:null,error:"no verified fallback"};let n=As.join(t,LB(e)),i;try{i=await Pi.promises.readFile(n)}catch{return{provider:null,error:"no cached fallback file"}}return bD(i)!==e.sha256?{provider:null,error:"cached fallback failed verification"}:W8(e,"",t,r,!1)}var vae;function Oae(e){return vae??=GKe(e).finally(()=>{vae=void 0})}async function GKe(e){let t=(e.registryUrl??Ae.PROVIDER_REPO_URL??"").trim(),r={registryLoaded:!1,providers:{},mangaProviders:{},tvProviders:{},asmrProviders:{},catalog:[],proxyRules:[]};if(!t)return r;let n=As.join(Pn.ROOT,"remote-providers"),i=As.join(n,"registry.json"),s=As.join(n,"active.json"),o=null;try{o=kB(JSON.parse(await Pi.promises.readFile(s,"utf8")))}catch{try{o=kB(JSON.parse(await Pi.promises.readFile(i,"utf8")));for(let f of o.providers){if(f.embedBase||!f.sha256)continue;let g=As.join(n,`${f.id}-${f.version}.mjs`);try{let p=await Pi.promises.readFile(g);bD(p)===f.sha256&&await yD(As.join(n,LB(f)),p)}catch{}}}catch{}}let a=new Map((o?.providers??[]).map(f=>[f.id.toLowerCase(),f])),A;try{let f=await vKe(t);A=kB(JSON.parse(f.toString("utf8")))}catch(f){O.error({err:f,registryUrl:t},"remote providers: manifest fetch failed, trying disk cache");try{A=kB(JSON.parse(await Pi.promises.readFile(i,"utf8")))}catch{return r}}r.registryLoaded=!0;let u=[],c=new Set((e.enabledProviders??[]).map(f=>f.toLowerCase())),l=c.size>0,h=FKe(e.cache),d=e.allowUnsigned??(process.env.DANGO_ALLOW_UNSIGNED_PROVIDERS==="1"||xKe(t));for(let f of A.providers){let g=f.id.toLowerCase();if(f.enabledByDefault===!1&&(!l||!c.has(g))){r.catalog.push(jp(f,!1,"disabled by default"));continue}if(l&&!c.has(g)){r.catalog.push(jp(f,!1,"not in enabledProviders"));continue}let{provider:p,facets:m,error:I}=await W8(f,t,n,h,d);if(p&&!I){if(!xae(r,f,g,p)){r.catalog.push(jp(f,!1,"invalid provider shape for kind")),O.warn({provider:f.id},"remote provider kind mismatch, skipped");continue}r.catalog.push(Lae(m,kae(f,p,jp(f,!0)))),u.push(f),f.proxy&&r.proxyRules.push(f.proxy),O.info({provider:f.id,version:f.version},"remote provider loaded")}else{let C=a.get(g);if(C){let y=await HKe(C,n,h);if(y.provider&&!y.error&&(xae(r,C,g,y.provider)||(y.error="cached fallback failed validation")),y.provider&&!y.error){r.catalog.push({...Lae(y.facets,kae(C,y.provider,jp(C,!0))),error:`serving cached ${C.version}: ${I}`}),u.push(C),C.proxy&&r.proxyRules.push(C.proxy),O.warn({provider:f.id,error:I,fallback:C.version},"remote provider update failed, serving cached version");continue}}r.catalog.push(jp(f,!1,I)),C&&u.push(C),f.proxy&&r.proxyRules.push(f.proxy),O.warn({provider:f.id,error:I},"remote provider skipped")}}await Pi.promises.mkdir(n,{recursive:!0}),await yD(s,JSON.stringify({...A,providers:u})),await yD(i,JSON.stringify(A));try{let f=new Set([...A.providers,...u].map(m=>LB(m))),g=new Set([...A.providers,...u].map(m=>{let I=m.embedBase?"tv":m.kind??"anime";return`${As.join(n,LB(m))}:${I}`}));for(let m of QD.keys())g.has(m)||QD.delete(m);let p=await Pi.promises.readdir(n);for(let m of p)m.toLowerCase().endsWith(".mjs")&&(f.has(m)||(await Pi.promises.unlink(As.join(n,m)),O.info({file:m},"remote providers: removed superseded module")))}catch(f){O.warn({err:f},"remote providers: superseded module cleanup failed")}return r}function kae(e,t,r){if(e.kind!=="tv"||!t||typeof t!="object")return r;let n=t.servers;return Array.isArray(n)&&n.every(i=>typeof i=="string")&&n.length>0?{...r,servers:[...n]}:r}function Lae(e,t){let r=(e?.genres??[]).length>0?e?.genres:void 0,n=(e?.orders??[]).length>0?e?.orders:void 0,i=(e?.sorts??[]).length>0?e?.sorts:void 0;return!r&&!n&&!i?t:{...t,facets:{...r?{genres:r}:{},...n?{orders:n}:{},...i?{sorts:i}:{}}}}function jp(e,t,r){return{id:e.id.toLowerCase(),label:e.label,version:e.version,mature:e.mature,kind:e.kind??"anime",sub:e.sub,tier:e.tier,modes:e.modes??(e.kind==="tv"?[]:["sub","dub"]),browse:e.browse,auth:Tae(e),enabledByDefault:e.enabledByDefault!==!1,loaded:t,remote:!0,error:r}}var gm=rr(oBe(),1);In();var Pht=rr(T4(),1),Hht=rr(XB(),1),Ght=rr(Vf(),1),Yht=rr(XD(),1),Vht=rr(ZD(),1),Wht=rr(iN(),1),aBe=rr(zB(),1),qht=rr(N4(),1);var wg=aBe.default;In();var ABe=rr(OQ(),1),$s=O.child({module:"DiscordGateway"}),F5=class{gateway=null;heartbeat=null;token=null;reconnectTimeout=null;lastActivity=null;isEnabled=!1;RECONNECT_DELAY=15e3;externalAssetCache=new Map;logoAssetId=null;logoAssetChecked=!1;setEnabled(t){this.isEnabled=t,t?(this.loadToken(),this.connect()):this.disconnect()}get serviceEnabled(){return this.isEnabled&&!!this.token&&this.token.length>30}hasToken(){return!!this.token&&this.token.length>30}loadToken(){this.token=process.env.DISCORD_GATEWAY_TOKEN||null,this.logoAssetId=null,this.logoAssetChecked=!1}reloadToken(){ABe.default.config({path:Ae.ENV_PATH,override:!0}),this.loadToken(),this.serviceEnabled&&(this.disconnect(),this.connect())}async getExternalAsset(t){if(!Ae.DISCORD_CLIENT_ID||!this.token)return null;let r=this.externalAssetCache.get(t);if(r)return r;try{let n=await fetch(`https://discord.com/api/v9/applications/${Ae.DISCORD_CLIENT_ID}/external-assets`,{method:"POST",headers:{Authorization:this.token,"Content-Type":"application/json"},body:JSON.stringify({urls:[t]})}),i=await n.text();if(!n.ok)return $s.warn(`external-assets proxy failed ${n.status}: ${i.slice(0,200)}`),null;let s=JSON.parse(i);if(!s[0]?.external_asset_path)return null;let o=`mp:${s[0].external_asset_path}`;return this.externalAssetCache.set(t,o),o}catch(n){return $s.warn({err:n},"external-assets proxy error"),null}}async getLogoAssetId(){if(!Ae.DISCORD_CLIENT_ID||!this.token)return null;if(this.logoAssetChecked)return this.logoAssetId;try{let t=await fetch(`https://discord.com/api/v9/oauth2/applications/${Ae.DISCORD_CLIENT_ID}/assets`,{headers:{Authorization:this.token}}),r=await t.text();if(!t.ok)return $s.warn(`application assets fetch failed ${t.status}: ${r.slice(0,200)}`),this.logoAssetChecked=!0,null;let n=JSON.parse(r);return this.logoAssetId=n.find(i=>i.name==="logo")?.id??null,this.logoAssetChecked=!0,this.logoAssetId}catch(t){return $s.warn({err:t},"application assets fetch error"),this.logoAssetChecked=!0,null}}resolveImageUrl(t){let r=i=>!i.startsWith("https://")||i.includes("localhost")||i.includes("127.0.0.1")?!1:i.includes("s4.anilist.co")||i.includes("anilistcdn")?!0:!["youtube-anime.com","animepahe","animeya.cc","gogocdn.net","weeabo0.xyz","japaneseasmr.com"].some(o=>i.includes(o)),n=t.thumbnail;if(n&&n.includes("/api/image-proxy")){let i=n.match(/url=([^&]+)/);if(i)try{n=decodeURIComponent(i[1])}catch(s){}}if(n&&t.providerName!=="AnimePahe"&&r(n))return n;if(t.thumbnails){let i=t.thumbnails.find(s=>s&&(s.includes("s4.anilist.co")||s.includes("anilistcdn")));if(i)return i}return n&&r(n)?n:null}async updatePresence(t){if(this.lastActivity=t,!this.isEnabled||!this.gateway||this.gateway.readyState!==wg.OPEN)return;let r="dango",n=t.title,i=t.stateLine?t.stateLine:`Episode ${t.episode}${t.totalEpisodes?`/${t.totalEpisodes}`:""}`,s=t.providerName==="ASMR"?2:3,o=this.resolveImageUrl(t),a;if(Ae.DISCORD_CLIENT_ID){let l=(o?await this.getExternalAsset(o):null)??await this.getLogoAssetId();l&&(a={large_image:l,large_text:t.title.slice(0,128)})}let A={since:null,activities:[{name:r,type:s,state:t.isPlaying?i:`${i} (Paused)`,details:n,...Ae.DISCORD_CLIENT_ID?{application_id:Ae.DISCORD_CLIENT_ID}:{},...a?{assets:a}:{},buttons:["Learn More"],metadata:{button_urls:["https://github.com/serifpersia/dango"]},status_display_type:2}],status:"online",afk:!1},u=Date.now();t.isPlaying&&(t.currentTime&&t.currentTime>0&&(A.since=u-Math.round(t.currentTime*1e3)),t.duration&&t.duration>t.currentTime&&(A.activities[0].timestamps={start:u-Math.round(t.currentTime*1e3),end:u+Math.round((t.duration-t.currentTime)*1e3)}));try{this.gateway.send(JSON.stringify({op:3,d:A}))}catch(c){$s.error({err:c},"Failed to send gateway presence update")}}async setIdleStatus(t){if(!this.isEnabled||!this.gateway||this.gateway.readyState!==wg.OPEN)return;let n={home:{details:"Home",state:"Browsing anime"},"home-anime":{details:"Home",state:"Browsing anime"},"home-manga":{details:"Home",state:"Browsing manga"},"home-tv":{details:"Home",state:"Browsing movies & shows"},"home-asmr":{details:"Home",state:"Browsing ASMR works"},search:{details:"Search",state:"Exploring titles..."},"search-anime":{details:"Anime Search",state:"Browsing titles"},"search-manga":{details:"Manga Search",state:"Browsing titles"},"search-tv":{details:"TV Search",state:"Browsing titles"},"search-asmr":{details:"ASMR Search",state:"Browsing titles"},watchlist:{details:"Watchlist",state:"Reviewing the watchlist"},"tv-watchlist":{details:"TV Watchlist",state:"Reviewing the watchlist"},"reading-list":{details:"Reading List",state:"Reviewing the reading list"},"listening-list":{details:"Listening List",state:"Reviewing the listening list"},anime:{details:"Anime Info",state:"Reading show details"},insights:{details:"Insights",state:"Reviewing stats"},settings:{details:"Settings",state:"Tweaking preferences"},trackers:{details:"Trackers",state:"Syncing watchlists"},map:{details:"Map",state:"Exploring the global user map"},asmr:{details:"ASMR Info",state:"Reading details"},tv:{details:"TV Info",state:"Reading show details"},manga:{details:"Manga Info",state:"Reading manga details"}}[t]??{details:"dango",state:"Idle"},i=t==="asmr"||t==="home-asmr"||t==="search-asmr",s=await this.getLogoAssetId();try{this.gateway.send(JSON.stringify({op:3,d:{since:null,activities:[{name:"dango",type:i?2:3,state:n.state,details:n.details,...Ae.DISCORD_CLIENT_ID?{application_id:Ae.DISCORD_CLIENT_ID}:{},...s?{assets:{large_image:s,...i?{}:{large_text:"dango"}}}:{},buttons:["Learn More"],metadata:{button_urls:["https://github.com/serifpersia/dango"]},status_display_type:2}],status:"online",afk:!1}}))}catch(o){$s.error({err:o},"Failed to send gateway idle status")}}clearPresence(){if(this.isEnabled){if(this.gateway&&this.gateway.readyState===wg.OPEN)try{this.gateway.send(JSON.stringify({op:3,d:{since:null,activities:[],status:"online",afk:!1}}))}catch{}this.lastActivity=null}}shutdown(){this.isEnabled=!1,this.token=null,this.disconnect()}disconnect(){if(this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.gateway){try{this.gateway.readyState===wg.OPEN&&this.gateway.send(JSON.stringify({op:3,d:{since:null,activities:[],status:"online",afk:!1}})),this.gateway.close()}catch{}this.gateway=null}this.heartbeat&&(clearInterval(this.heartbeat),this.heartbeat=null)}connect(){if(!this.isEnabled||!this.token||this.gateway)return;let t="wss://gateway.discord.gg/?encoding=json&v=10";$s.debug("Connecting Discord gateway"),this.gateway=new wg(t);let r=41250;this.gateway.on("message",n=>{try{let i=JSON.parse(n.toString());if(i.op===10){r=i.d.heartbeat_interval,this.heartbeat=setInterval(()=>{try{this.gateway&&this.gateway.readyState===wg.OPEN&&this.gateway.send(JSON.stringify({op:1,d:null}))}catch{}},r);let s={op:2,d:{token:this.token,capabilities:1021,client_state:{guild_hashes:{},highest_last_message_id:"0",private_channels_version:"0",read_state_version:0,user_guild_settings_version:-1,user_settings_version:-1},compress:!1,presence:{since:null,activities:[],status:"online",afk:!1},properties:{os:"Windows",os_version:"10.0.19044",os_arch:"x64",browser:"Discord Client",client_version:"0.0.20",client_build_number:152131,client_event_source:null,release_channel:"stable",system_locale:"en-US"}}};this.gateway&&this.gateway.send(JSON.stringify(s))}else i.op===11||(i.op===0?i.t==="READY"&&($s.info(`Gateway READY as ${i.d.user?.username||"unknown"}`),this.logoAssetChecked=!1,this.lastActivity&&this.updatePresence(this.lastActivity).catch(s=>$s.warn({err:s},"failed to restore presence after READY"))):i.op===7?($s.warn("Gateway reconnect requested by Discord"),this.handleDisconnect()):i.op===9&&($s.warn("Gateway invalid session, reconnecting..."),this.handleDisconnect()))}catch(i){$s.debug({err:i},"Gateway message parse error")}}),this.gateway.on("close",(n,i)=>{$s.warn(`Gateway closed ${n} ${i.toString().slice(0,100)}`),this.handleDisconnect()}),this.gateway.on("error",n=>{$s.error(n,"Gateway WebSocket error"),this.handleDisconnect()})}handleDisconnect(){this.heartbeat&&(clearInterval(this.heartbeat),this.heartbeat=null),this.gateway=null,this.isEnabled&&this.token&&(this.reconnectTimeout=setTimeout(()=>{this.reconnectTimeout=null,this.connect()},this.RECONNECT_DELAY))}},$r=new F5;var Ci=O.child({module:"DiscordRPC"}),U5=class{client=null;isEnabled=!1;hideMature=!0;reconnectTimeout=null;lastActivity=null;currentSessionId=null;hasPagePresence=!1;hasEverConnected=!1;permanentlyDisabled=!1;heartbeats=new Map;heartbeatTimer=null;retryCount=0;MAX_RETRIES=5;INITIAL_RECONNECT_DELAY=15e3;MAX_RECONNECT_DELAY=3e5;HEARTBEAT_TIMEOUT=4e4;HEARTBEAT_CHECK_INTERVAL=1e4;async setEnabled(t){if(this.isEnabled!==t)if(this.isEnabled=t,t){if(this.permanentlyDisabled){Ci.debug("Discord Rich Presence is unavailable on this device/session. Not retrying."),this.isEnabled=!1;return}this.retryCount=0,$r.setEnabled(!0),$r.serviceEnabled||this.connect()}else await this.disconnect(),$r.setEnabled(!1)}get isServiceEnabled(){return this.isEnabled&&(this.client!==null||$r.serviceEnabled)}setHideMature(t){this.hideMature=t}heartbeat(t){this.heartbeats.set(t,Date.now()),!this.heartbeatTimer&&this.isEnabled&&(this.heartbeatTimer=setInterval(()=>{this.checkHeartbeats()},this.HEARTBEAT_CHECK_INTERVAL))}removeHeartbeat(t){this.heartbeats.delete(t),this.checkHeartbeats()}isLocked(t){if(!t||!this.currentSessionId||t===this.currentSessionId)return!1;let r=this.heartbeats.get(this.currentSessionId);return r!==void 0&&Date.now()-r<=this.HEARTBEAT_TIMEOUT}async checkHeartbeats(){if(!this.isEnabled){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null);return}let t=Date.now();for(let[r,n]of this.heartbeats)t-n>this.HEARTBEAT_TIMEOUT&&this.heartbeats.delete(r);this.currentSessionId&&!this.heartbeats.has(this.currentSessionId)&&(this.lastActivity=null,this.currentSessionId=null,this.hasPagePresence=!1),this.heartbeats.size===0&&(this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),(this.hasPagePresence||this.lastActivity||this.currentSessionId)&&(this.lastActivity=null,this.currentSessionId=null,this.hasPagePresence=!1,await this.setIdleStatus("idle")))}async connect(){if(!this.isEnabled||this.client||this.permanentlyDisabled)return;if($r.serviceEnabled){Ci.debug("Using Discord Gateway for presence (token configured). Skipping local RPC.");return}let t=!!process.env.TERMUX_VERSION,r=process.platform==="android";if(t||r){Ci.debug("Discord Rich Presence is not supported on Android/Termux. Skipping connection."),this.isEnabled=!1,this.permanentlyDisabled=!0;return}let n=Ae.DISCORD_CLIENT_ID;if(!n){Ci.debug("DISCORD_CLIENT_ID is not configured. Discord Rich Presence is disabled."),this.isEnabled=!1,this.permanentlyDisabled=!0;return}try{this.client=new gm.Client({clientId:n}),this.client.on("ready",()=>{Ci.info("Connected to Discord client successfully"),this.hasEverConnected=!0,this.retryCount=0,this.lastActivity?this.updatePresence(this.lastActivity):this.setIdleStatus("idle")}),this.client.on("disconnected",()=>{Ci.warn("Disconnected from Discord client, scheduling reconnect..."),this.cleanup(),this.scheduleReconnect()}),this.client.on("ERROR",o=>{let a=o instanceof Error?o.message:String(o);if(a.includes("ENOENT")||a.includes("ECONNREFUSED")){if(this.cleanup(),!this.hasEverConnected){Ci.debug("Discord client not detected. Rich Presence disabled for this session."),this.isEnabled=!1,this.permanentlyDisabled=!0;return}Ci.debug("Discord client not running or connection refused."),this.scheduleReconnect()}else Ci.error({err:o},"Discord RPC client error"),this.cleanup(),this.scheduleReconnect()});let i=this.client.login(),s=new Promise((o,a)=>setTimeout(()=>a(new Error("Login timeout")),5e3));await Promise.race([i,s]),this.hasEverConnected=!0}catch{if(this.cleanup(),!this.hasEverConnected){Ci.debug("Discord client not available at startup. Rich Presence disabled for the rest of this session."),this.isEnabled=!1,this.permanentlyDisabled=!0;return}this.scheduleReconnect()}}scheduleReconnect(){if(!this.isEnabled||this.reconnectTimeout||this.permanentlyDisabled)return;let t=Math.min(this.INITIAL_RECONNECT_DELAY*Math.pow(1.5,this.retryCount),this.MAX_RECONNECT_DELAY);this.retryCount++,this.retryCount>this.MAX_RETRIES?Ci.debug(`Discord RPC login failed ${this.retryCount} times. Retrying in ${Math.round(t/1e3)}s...`):Ci.info(`Discord RPC login failed. Retrying in ${Math.round(t/1e3)}s...`),this.reconnectTimeout=setTimeout(()=>{this.reconnectTimeout=null,this.connect()},t)}cleanup(){if(this.client){try{this.client.removeAllListeners(),this.client.destroy()}catch{}this.client=null}}async disconnect(){if(this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.client?.user)try{await this.client.user.clearActivity()}catch{}this.cleanup(),this.lastActivity=null,this.currentSessionId=null,this.heartbeats.clear(),this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),$r.disconnect()}async updatePresence(t){if(this.isLocked(t.sessionId)||(this.lastActivity=t,t.sessionId&&(this.currentSessionId=t.sessionId,this.heartbeat(t.sessionId)),!this.isEnabled))return;if(this.hideMature&&t.isAdult){if($r.serviceEnabled)$r.clearPresence();else if(this.client?.user)try{await this.client.user.clearActivity()}catch{}return}if($r.serviceEnabled){$r.updatePresence(t);return}if(!this.client||!this.client.user)return;let r=i=>!i.startsWith("https://")||i.includes("localhost")||i.includes("127.0.0.1")?!1:i.includes("s4.anilist.co")||i.includes("anilistcdn")?!0:!["youtube-anime.com","animepahe","animeya.cc","gogocdn.net","weeabo0.xyz","japaneseasmr.com"].some(o=>i.includes(o)),n="logo";if(t.thumbnail&&t.providerName!=="AnimePahe"){let i=t.thumbnail;if(i.includes("/api/image-proxy")){let s=i.match(/url=([^&]+)/);s&&(i=decodeURIComponent(s[1]))}if(r(i))n=i;else if(t.thumbnails){let s=t.thumbnails.find(o=>o&&(o.includes("s4.anilist.co")||o.includes("anilistcdn")));s&&(n=s)}}try{if(!t.isPlaying){await this.client.user.clearActivity(),await this.client.user.setActivity({details:t.title,state:t.stateLine?`${t.stateLine} (Paused)`:`Episode ${t.episode}${t.totalEpisodes?`/${t.totalEpisodes}`:""} (Paused)`,largeImageKey:n,largeImageText:t.title,type:t.providerName==="ASMR"?2:3,statusDisplayType:gm.StatusDisplayType.DETAILS,buttons:[{label:"Learn More",url:"https://github.com/serifpersia/dango"}]}),this.hasPagePresence=!1;return}let i=Math.round(Date.now()/1e3),s={details:t.title,state:t.stateLine?t.stateLine:`Episode ${t.episode}${t.totalEpisodes?`/${t.totalEpisodes}`:""}`,largeImageKey:n,largeImageText:t.title,type:t.providerName==="ASMR"?2:3,statusDisplayType:gm.StatusDisplayType.DETAILS,buttons:[{label:"Learn More",url:"https://github.com/serifpersia/dango"}]};t.currentTime&&t.currentTime>0&&(s.startTimestamp=Math.round(i-t.currentTime)),t.duration&&t.duration>t.currentTime&&(s.endTimestamp=Math.round(i+(t.duration-t.currentTime))),await this.client.user.setActivity(s),this.hasPagePresence=!1}catch(i){Ci.error({err:i},"Failed to set Discord activity")}}async setIdleStatus(t,r){if(this.isLocked(r)||!this.isEnabled)return;if($r.serviceEnabled){$r.setIdleStatus(t);return}if(!this.client||!this.client.user){Ci.warn("Discord client not connected, skipping idle status update");return}let n={home:{details:"Home",state:"Browsing anime"},"home-anime":{details:"Home",state:"Browsing anime"},"home-manga":{details:"Home",state:"Browsing manga"},"home-tv":{details:"Home",state:"Browsing movies & shows"},"home-asmr":{details:"Home",state:"Browsing ASMR works"},search:{details:"Search",state:"Exploring titles..."},"search-anime":{details:"Anime Search",state:"Browsing titles"},"search-manga":{details:"Manga Search",state:"Browsing titles"},"search-tv":{details:"TV Search",state:"Browsing titles"},"search-asmr":{details:"ASMR Search",state:"Browsing titles"},watchlist:{details:"Watchlist",state:"Reviewing the watchlist"},"tv-watchlist":{details:"TV Watchlist",state:"Reviewing the watchlist"},"reading-list":{details:"Reading List",state:"Reviewing the reading list"},"listening-list":{details:"Listening List",state:"Reviewing the listening list"},anime:{details:"Anime Info",state:"Reading show details"},insights:{details:"Insights",state:"Reviewing stats"},settings:{details:"Settings",state:"Tweaking preferences"},mal:{details:"MAL Sync",state:"Syncing with MyAnimeList"},map:{details:"Map",state:"Exploring the global user map"},asmr:{details:"ASMR Info",state:"Reading details"},tv:{details:"TV Info",state:"Reading show details"},manga:{details:"Manga Info",state:"Reading manga details"}},i=n[t]??{details:"dango",state:"Idle"},s=t==="asmr"||t==="home-asmr"||t==="search-asmr";try{if(!this.client||!this.client.user){Ci.warn("Discord client not connected, skipping idle status update");return}await this.client.user.setActivity({details:i.details,state:i.state,largeImageKey:"logo",largeImageText:s?void 0:"dango",type:s?2:3,statusDisplayType:gm.StatusDisplayType.DETAILS,buttons:[{label:"Learn More",url:"https://github.com/serifpersia/dango"}]}),this.hasPagePresence=t in n}catch(o){o.message==="Closed by Discord"?Ci.warn("Discord connection ended, skipping idle status update"):Ci.error({err:o},"Failed to set Discord idle status")}}async clearPresence(t){if(!(t&&this.currentSessionId&&t!==this.currentSessionId)){if(this.lastActivity=null,this.currentSessionId=null,$r.serviceEnabled){$r.clearPresence();return}await this.setIdleStatus("idle")}}},sb=new U5;var _5=(e,t,r)=>(n,i)=>{let s=-1;return o(0);async function o(a){if(a<=s)throw new Error("next() called multiple times");s=a;let A,u=!1,c;if(e[a]?(c=e[a][0][0],n.req.routeIndex=a):c=a===e.length&&i||void 0,c)try{A=await c(n,()=>o(a+1))}catch(l){if(l instanceof Error&&t)n.error=l,A=await t(l,n),u=!0;else throw l}else n.finalized===!1&&r&&(A=await r(n));return A&&(n.finalized===!1||u)&&(n.res=A),n}};var Bi="ALL",uBe="all",cBe=["get","post","put","delete","options","patch","query"],Sx="Can not add a route since the matcher is already built.",Tx=class extends Error{};var lBe="__COMPOSED_HANDLER";var Jht=e=>e.text("404 Not Found",404),dBe=(e,t)=>{if("getResponse"in e){let r=e.getResponse();return t.newResponse(r.body,r)}return console.error(e),t.text("Internal Server Error",500)},hBe=class fBe{get;post;put;delete;options;patch;query;all;on;use;router;getPath;_basePath="/";#e="/";routes=[];constructor(t={}){[...cBe,uBe].forEach(s=>{this[s]=(o,...a)=>{let A=s.toUpperCase();return typeof o=="string"?this.#e=o:this.#i(A,this.#e,o),a.forEach(u=>{this.#i(A,this.#e,u)}),this}}),this.on=(s,o,...a)=>{for(let A of[o].flat()){this.#e=A;for(let u of[s].flat()){let c=u.toUpperCase();for(let l of a)this.#i(c,this.#e,l)}}return this},this.use=(s,...o)=>(typeof s=="string"?this.#e=s:(this.#e="*",o.unshift(s)),o.forEach(a=>{this.#i(Bi,this.#e,a)}),this);let{strict:n,...i}=t;Object.assign(this,i),this.getPath=n??!0?t.getPath??uk:k9}#t(){let t=new fBe({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#r=this.#r,t.routes=this.routes,t}#r=Jht;errorHandler=dBe;route(t,r){let n=this.basePath(t);return r.routes.map(i=>{let s;r.errorHandler===dBe?s=i.handler:(s=async(o,a)=>(await _5([],r.errorHandler)(o,()=>i.handler(o,a))).res,s[lBe]=i.handler),n.#i(i.method,i.path,s,i.basePath)}),this}basePath(t){let r=this.#t();return r._basePath=Bl(this._basePath,t),r}onError=t=>(this.errorHandler=t,this);notFound=t=>(this.#r=t,this);mount(t,r,n){let i,s;n&&(typeof n=="function"?s=n:(s=n.optionHandler,n.replaceRequest===!1?i=A=>A:i=n.replaceRequest));let o=s?A=>{let u=s(A);return Array.isArray(u)?u:[u]}:A=>{let u;try{u=A.executionCtx}catch{}return[A.env,u]};i||=(()=>{let A=Bl(this._basePath,t),u=A==="/"?0:A.length;return c=>{let l=new URL(c.url);return l.pathname=this.getPath(c).slice(u)||"/",new Request(l,c)}})();let a=async(A,u)=>{let c=await r(i(A.req.raw),...o(A));if(c)return c;await u()};return this.#i(Bi,Bl(t,"*"),a),this}#i(t,r,n,i){r=Bl(this._basePath,r);let s={basePath:i!==void 0?Bl(this._basePath,i):this._basePath,path:r,method:t,handler:n};this.router.add(t,r,[n,s]),this.routes.push(s)}#s(t,r){if(t instanceof Error)return this.errorHandler(t,r);throw t}#n(t,r,n,i){if(i==="HEAD")return(async()=>new Response(null,await this.#n(t,r,n,"GET")))();let s=this.getPath(t,{env:n}),o=this.router.match(i,s),a=new lk(t,{path:s,matchResult:o,env:n,executionCtx:r,notFoundHandler:this.#r});if(o[0].length===1){let u;try{u=o[0][0][0][0](a,async()=>{a.res=await this.#r(a)})}catch(c){return this.#s(c,a)}return u instanceof Promise?u.then(c=>c||(a.finalized?a.res:this.#r(a))).catch(c=>this.#s(c,a)):u??this.#r(a)}let A=_5(o[0],this.errorHandler,this.#r);return(async()=>{try{let u=await A(a);if(!u.finalized)throw new Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return u.res}catch(u){return this.#s(u,a)}})()}fetch=(t,...r)=>this.#n(t,r[1],r[0],t.method);request=(t,r,n,i)=>t instanceof Request?this.fetch(r?new Request(t,r):t,n,i):(t=t.toString(),this.fetch(new Request(/^https?:\/\//.test(t)?t:`http://localhost${Bl("/",t)}`,r),n,i));fire=()=>{addEventListener("fetch",t=>{t.respondWith(this.#n(t.request,t,void 0,t.request.method))})}};var ii=()=>Object.create(null);var Dx=[];function O5(e,t){let r=this.buildAllMatchers(),n=((i,s)=>{let o=r[i]||r[Bi],a=o[2][s];if(a)return a;let A=s.match(o[0]);if(!A)return[[],Dx];let u=A.indexOf("",1);return[o[1][u],A]});return this.match=n,n(e,t)}var pm="[^/]+",eh=".*",il="(?:|/.*)",Zd=Symbol(),gBe=new Set(".\\+*[^]$()");function jht(e,t){return e.length===1?t.length===1?e<t?-1:1:-1:t.length===1?1:e===eh||e===il?t===il?-1:1:t===eh||t===il?-1:e===pm?1:t===pm?-1:e.length===t.length?e<t?-1:1:t.length-e.length}var pBe=class P5{#e;#t;#r=ii();insert(t,r,n,i,s){let o=this;for(let a=0,A=t.length;a<A;a++){let u=t[a],c=u.length===1?u==="*"?a===A-1?["","",eh]:["","",pm]:null:u==="/*"?["","",il]:u.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),l;if(c){let h=c[1],d=c[2]||pm;if(h&&c[2]&&(d===".*"||(d=d.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(d))||d.length===1&&gBe.has(d)))throw Zd;if(l=o.#r[d],!l){if(d!==eh&&d!==il){for(let f in o.#r)if((d.length>1||f.length>1)&&f!==eh&&f!==il)throw Zd}l=o.#r[d]=new P5}h!==""&&(l.#t??=i.varIndex++,n.push([h,l.#t]))}else if(l=o.#r[u],!l){for(let h in o.#r)if(h.length>1&&h!==eh&&h!==il)throw Zd;l=o.#r[u]=new P5}o=l}if(o.#e!==void 0)throw Zd;o.#e=s?-1:r}buildRegExpStr(){let r=Object.keys(this.#r).sort(jht).map(n=>{let i=this.#r[n],s=i.buildRegExpStr();return s===""?"":(typeof i.#t=="number"?`(${n})@${i.#t}`:gBe.has(n)?`\\${n}`:n)+s}).filter(Boolean);return typeof this.#e=="number"&&this.#e!==-1&&r.unshift(`#${this.#e}`),r.length===0?"":r.length===1?r[0]:"(?:"+r.join("|")+")"}};var H5=class{#e={varIndex:0};#t=new pBe;#r=0;paths=ii();insert(e,t){if(t){this.#t.insert(e.split(""),0,[],this.#e,!0);return}let r=[],n=[],i=e;for(let o=0;;){let a=!1;if(i=i.replace(/\{[^}]+\}/g,A=>{let u=`@\\${o}`;return n[o]=[u,A],o++,a=!0,u}),!a)break}let s=i.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let o=n.length-1;o>=0;o--){let[a]=n[o];for(let A=s.length-1;A>=0;A--)if(s[A].indexOf(a)!==-1){s[A]=s[A].replace(a,n[o][1]);break}}this.#t.insert(s,this.#r,r,this.#e,!1),this.paths[e]=[this.#r++,r]}buildRegExp(){let e=this.#t.buildRegExpStr();if(e==="")return[/^$/,[],[]];let t=0,r=[],n=[];return e=e.replace(/#(\d+)|@(\d+)|\.\*\$/g,(i,s,o)=>s!==void 0?(r[++t]=Number(s),"$()"):(o!==void 0&&(n[Number(o)]=++t),"")),[new RegExp(`^${e}`),r,n]}};var EBe=ii();function mBe(e){return EBe[e]??=new RegExp(`^${e.replace(/\/:[^/{}]+(?:\{\[\^\/]\+})?(?=[/{]|$)|\/?\*$|([.\\+*[^\]$()?{}|])/g,(t,r)=>r?`\\${r}`:t==="/*"?il:t==="*"?eh:`/:${pm}`)}$`)}function Nx(e,t){for(let r of Object.keys(e).sort((n,i)=>i.length-n.length))if(mBe(r).test(t))return[...e[r]]}var Rx=class{name="RegExpRouter";#e;#t;#r;constructor(){this.#e={[Bi]:ii()},this.#t={[Bi]:ii()},this.#r={[Bi]:new H5}}#i(e,t){try{this.#r[e].insert(t,!/\*|\/:/.test(t))}catch(r){throw r===Zd?new Tx(t):r}}add(e,t,r){let n=this.#e,i=this.#t;if(!n)throw new Error(Sx);if(!n[e]){this.#r[e]=new H5;for(let a of[n,i]){a[e]=ii();for(let A in a[Bi])a[e][A]=[...a[Bi][A]],this.#i(e,A)}}t==="/*"&&(t="*");let s=e===Bi?Object.keys(n):[e];if(/\*$/.test(t)){let a=mBe(t);for(let A of s)n[A][t]||(this.#i(A,t),n[A][t]=Nx(n[A],t)||Nx(n[Bi],t)||[]);for(let A of[n,i])for(let u of s)for(let c in A[u])a.test(c)&&A[u][c].push([r,t]);return}let o=uQ(t)||[t];for(let a of o)for(let A of s)i[A][a]||(this.#i(A,a),i[A][a]=Nx(n[A],a)||Nx(n[Bi],a)||[]),i[A][a].push([r,a])}match=O5;buildAllMatchers(){let e=ii();for(let t of Object.keys(this.#t))e[t]=this.#s(t);return this.#e=this.#t=this.#r=void 0,EBe=ii(),e}#s(e){let t=this.#e[e],r=this.#t[e],n=this.#r[e],i=ii(),s=[],[o,a,A]=n.buildRegExp();for(let u of[t,r])for(let c in u){let l=u[c],h=n.paths[c];if(!h){i[c]=[l.map(([d])=>[d,ii()]),Dx];continue}s[h[0]]=l.map(([d,f])=>[d,n.paths[f][1].reduceRight((g,[p],m)=>(g[p]=A[h[1][m][1]],g),ii())])}return[o,a.map(u=>s[u]),i]}};var G5=class{name="SmartRouter";#e=[];#t=[];constructor(e){this.#e=e.routers}add(e,t,r){if(!this.#t)throw new Error(Sx);this.#t.push([e,t,r])}match(e,t){if(!this.#t)throw new Error("Fatal error");let r=this.#e,n=this.#t,i=r.length,s=0,o;for(;s<i;s++){let a=r[s];try{for(let A=0,u=n.length;A<u;A++)a.add(...n[A]);o=a.match(e,t)}catch(A){if(A instanceof Tx)continue;throw A}this.match=a.match.bind(a),this.#e=[a],this.#t=void 0;break}if(s===i)throw new Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,o}get activeRouter(){if(this.#t||this.#e.length!==1)throw new Error("No active router has been determined yet.");return this.#e[0]}};var Y5=ii(),$ht=0,IBe=class CBe{#e=[];#t=ii();#r=[];#i;#s=Y5;insert(t,r,n){let i=this,s=R9(r),o=new Set,a=0;for(let A of s){let u=s[++a],c=x9(A,u)||(u===void 0&&A&&A.indexOf("*")===A.length-1?A:null),l=Array.isArray(c),h=l?c[0]:c||A,d=i.#t[h]||=new CBe;c&&!d.#i&&(d.#i=c,i.#r.push(d)),i=d,l&&o.add(c[1])}i.#e.push({[t]:{handler:n,possibleKeys:[...o],score:++$ht}})}#n(t,r,n,i,s){for(let o=0,a=r.#e.length;o<a;o++){let A=r.#e[o],u=A[n]||A[Bi];if(u){u.params=ii(),t.push(u);for(let c=0,l=u.possibleKeys.length;c<l;c++){let h=u.possibleKeys[c];u.params[h]=s?.[h]&&!c?s[h]:i[h]??s?.[h]}}}}search(t,r){let n=[];this.#s=Y5;let s=[this],o=Ak(r),a=[],A=o.length,u=null;for(let c=0;c<A;c++){let l=o[c],h=c===A-1,d=[];for(let g=0,p=s.length;g<p;g++){let m=s[g],I=m.#t[l];I&&(I.#s=m.#s,h?(I.#t["*"]&&this.#n(n,I.#t["*"],t,m.#s),this.#n(n,I,t,m.#s)):d.push(I));for(let C of m.#r){let y=C.#i,Q=m.#s===Y5?{}:{...m.#s};if(typeof y=="string"){(y==="*"||l.startsWith(y.slice(0,-1)))&&(this.#n(n,C,t,m.#s),y==="*"&&(C.#s=Q,d.push(C)));continue}let[,D,N]=y;if(!(!l&&N===!0)){if(N!==!0){if(!u){u=[];let x=r[0]==="/"?1:0;for(let v=0;v<A;v++)u[v]=x,x+=o[v].length+1}let S=r.slice(u[c]),B=N.exec(S);if(B){Q[D]=B[0],this.#n(n,C,t,m.#s,Q),B[0].length===S.length&&C.#t["*"]&&this.#n(n,C.#t["*"],t,m.#s,Q);for(let x in C.#t){C.#s=Q;let v=B[0].match(/\//g)?.length??0;(a[v]||=[]).push(C);break}continue}}(N===!0||N.test(l))&&(Q[D]=l,h?(this.#n(n,C,t,Q,m.#s),C.#t["*"]&&this.#n(n,C.#t["*"],t,Q,m.#s)):(C.#s=Q,d.push(C)))}}}let f=a.shift();s=f?d.concat(f):d}return n[1]&&n.sort((c,l)=>c.score-l.score),[n.map(({handler:c,params:l})=>[c,l])]}};var V5=class{name="TrieRouter";#e=new IBe;add(e,t,r){for(let n of uQ(t)||[t])this.#e.insert(e,n,r)}match(e,t){return this.#e.search(e,t)}};var W5=class extends hBe{constructor(e={}){super(e),this.router=e.router??new G5({routers:[new Rx,new V5]})}};var yBe=e=>e===32||e===9||e===10||e===13,xx=(e,t)=>{for(;t<e.length&&yBe(e.charCodeAt(t));)t++;return t},ob=(e,t)=>{for(;t>0&&yBe(e.charCodeAt(t-1));)t--;return t},BBe=(e,t)=>{for(;t<e.length;){let r=e.charCodeAt(t);if(r===59)return[t+1,!0];if(r===44)return[t+1,!1];t++}return[t,!1]},Kht=(e,t)=>{let r=t,n=!1;for(;r<e.length;){let i=e.charCodeAt(r);if(n&&i===92)r++;else if(i===34)n=!n;else if(!n&&i===44)return r+1;r++}return r},Xht=(e,t)=>{t=xx(e,t);let r=t,n,i,s=!1;for(;r<e.length;){let A=e.charCodeAt(r);if(A===61){n=e.slice(t,ob(e,r)),r++;break}if(A===59)return[r+1,void 0,void 0,!0];if(A===44)return[r+1,void 0,void 0,!1];r++}if(n===void 0)return[r,void 0,void 0,!1];if(r=xx(e,r),e.charCodeAt(r)===61){let A=BBe(e,r+1);return[A[0],n,void 0,A[1]]}let o=!1,a=r;for(;r<e.length;){let A=e.charCodeAt(r);if(o&&A===92)r++;else if(A===34){if(o){let u=xx(e,r+1),c=e.charCodeAt(u);if(u<e.length&&!(c===59||c===44)){let l=BBe(e,u);return[l[0],n,void 0,l[1]]}if(i=e.slice(a+1,r),i.includes("\\")&&(i=i.replace(/\\(.)/g,"$1")),c===44)return[u+1,n,i,!1];c===59&&(s=!0,u++),r=u;break}o=!0}else if(!o&&(A===59||A===44)){i=e.slice(a,ob(e,r)),A===59&&(s=!0),r++;break}r++}return[r,n,i??e.slice(a,ob(e,r)),s]},zht=(e,t)=>{let r={type:"",params:Object.create(null),q:1};t=xx(e,t);let n=t;for(;n<e.length;){let a=e.charCodeAt(n);if(a===59||a===44){if(r.type=e.slice(t,ob(e,n)),n++,a===44)return[n,r.type?r:void 0];if(!r.type)return[Kht(e,n),void 0];break}n++}if(!r.type)return r.type=e.slice(t,ob(e,e.length)),[e.length,r.type?r:void 0];let i,s,o;for(;n<e.length&&([n,i,s,o]=Xht(e,n),i&&s&&(r.params[i]=s),!!o););return[n,r]},bBe=e=>{if(!e)return[];let t=[],r=0,n,i=!1,s;for(;r<e.length;)[r,n]=zht(e,r),n&&(n.q=Zht(n.params.q??n.params.Q),t.push(n),s&&s.q<n.q&&(i=!0),s=n);return i&&t.sort((o,a)=>a.q-o.q),t},Zht=e=>{if(e===void 0||e==="")return 1;if(e==="NaN")return 0;let t=Number(e);return Number.isNaN(t)?1:t<0?0:t>1?1:t};var QBe=/^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|msgpack|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|vnd\.msgpack|wasm|x-httpd-php|x-javascript|x-msgpack|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml|msgpack))(?:[;\s]|$)/i;var eft=["gzip","deflate"],tft=/(?:^|,)\s*?no-transform\s*?(?:,|$)/i,rft=(e,t)=>{if(e===void 0)return;let r=bBe(e),n=r.find(s=>s.type==="*")?.q,i;for(let s of t){let o=r.find(A=>A.type.toLowerCase()===s),a=o?o.q:n??0;if(a===1)return s;a>0&&(!i||a>i.q)&&(i={encoding:s,q:a})}return i?.encoding},nft=/(?:^|,)\s*accept-encoding\s*(?:,|$)/i,wBe=e=>{let t=e?.threshold??1024,r=e?.encoding?[e.encoding]:eft,n=e?.contentTypeFilter??QBe,i=typeof n=="function"?s=>{let o=s.headers.get("Content-Type");return o&&n(o)}:s=>{let o=s.headers.get("Content-Type");return o&&n.test(o)};return async function(o,a){await a();let A=o.res.headers.get("Content-Length");if(o.res.status===206||o.res.headers.has("Content-Encoding")||o.res.headers.has("Transfer-Encoding")||o.req.method==="HEAD"||A&&Number(A)<t||!i(o.res)||!ift(o.res))return;let u=o.res.headers.get("Vary");u!=="*"&&!(u&&nft.test(u))&&o.header("Vary",u?`${u}, Accept-Encoding`:"Accept-Encoding");let c=o.req.header("Accept-Encoding"),l=rft(c,r);if(!l||!o.res.body)return;let h=new CompressionStream(l);o.res=new Response(o.res.body.pipeThrough(h),o.res),o.res.headers.delete("Content-Length"),o.res.headers.set("Content-Encoding",l);let d=o.res.headers.get("ETag");d&&!d.startsWith("W/")&&o.res.headers.set("ETag",`W/${d}`)}},ift=e=>{let t=e.headers.get("Cache-Control");return!t||!tft.test(t)};import kwe from"path";import Jm from"fs";var SBe=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",sft=SBe+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040",oft="["+SBe+"]["+sft+"]*",aft=new RegExp("^"+oft+"$");function TBe(e,t){let r=[],n=t.exec(e);for(;n;){let i=[];i.startIndex=t.lastIndex-n[0].length;let s=n.length;for(let o=0;o<s;o++)i.push(n[o]);r.push(i),n=t.exec(e)}return r}var q5=function(e){let t=aft.exec(e);return!(t===null||typeof t>"u")};function DBe(e){return typeof e<"u"}var ab=["hasOwnProperty","toString","valueOf","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"],vx=["__proto__","constructor","prototype"];var Aft={allowBooleanAttributes:!1,unpairedTags:[]};function vBe(e,t){t=Object.assign({},Aft,t);let r=[],n=!1,i=!1;e[0]==="\uFEFF"&&(e=e.substr(1));for(let s=0;s<e.length;s++)if(e[s]==="<"&&e[s+1]==="?"){if(s+=2,s=NBe(e,s),s.err)return s}else if(e[s]==="<"){let o=s;if(s++,e[s]==="!"){s=RBe(e,s);continue}else{let a=!1;e[s]==="/"&&(a=!0,s++);let A="";for(;s<e.length&&e[s]!==">"&&e[s]!==" "&&e[s]!==" "&&e[s]!==`
|
|
470
470
|
`&&e[s]!=="\r";s++)A+=e[s];if(A=A.trim(),A[A.length-1]==="/"&&(A=A.substring(0,A.length-1),s--),!pft(A)){let l;return A.trim().length===0?l="Invalid space after '<'.":l="Tag '"+A+"' is an invalid name.",gn("InvalidTag",l,ds(e,s))}let u=lft(e,s);if(u===!1)return gn("InvalidAttr","Attributes for '"+A+"' have open quote.",ds(e,s));let c=u.value;if(s=u.index,c[c.length-1]==="/"){let l=s-c.length;c=c.substring(0,c.length-1);let h=xBe(c,t);if(h===!0)n=!0;else return gn(h.err.code,h.err.msg,ds(e,l+h.err.line))}else if(a)if(u.tagClosed){if(c.trim().length>0)return gn("InvalidTag","Closing tag '"+A+"' can't have attributes or invalid starting.",ds(e,o));if(r.length===0)return gn("InvalidTag","Closing tag '"+A+"' has not been opened.",ds(e,o));{let l=r.pop();if(A!==l.tagName){let h=ds(e,l.tagStartPos);return gn("InvalidTag","Expected closing tag '"+l.tagName+"' (opened in line "+h.line+", col "+h.col+") instead of closing tag '"+A+"'.",ds(e,o))}r.length==0&&(i=!0)}}else return gn("InvalidTag","Closing tag '"+A+"' doesn't have proper closing.",ds(e,s));else{let l=xBe(c,t);if(l!==!0)return gn(l.err.code,l.err.msg,ds(e,s-c.length+l.err.line));if(i===!0)return gn("InvalidXml","Multiple possible root nodes found.",ds(e,s));t.unpairedTags.indexOf(A)!==-1||r.push({tagName:A,tagStartPos:o}),n=!0}for(s++;s<e.length;s++)if(e[s]==="<")if(e[s+1]==="!"){s++,s=RBe(e,s);continue}else if(e[s+1]==="?"){if(s=NBe(e,++s),s.err)return s}else break;else if(e[s]==="&"){let l=fft(e,s);if(l==-1)return gn("InvalidChar","char '&' is not expected.",ds(e,s));s=l}else if(i===!0&&!Em(e[s]))return gn("InvalidXml","Extra text at the end",ds(e,s));e[s]==="<"&&s--}}else{if(Em(e[s]))continue;return gn("InvalidChar","char '"+e[s]+"' is not expected.",ds(e,s))}if(n){if(r.length==1)return gn("InvalidTag","Unclosed tag '"+r[0].tagName+"'.",ds(e,r[0].tagStartPos));if(r.length>0)return gn("InvalidXml","Invalid '"+JSON.stringify(r.map(s=>s.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1})}else return gn("InvalidXml","Start tag expected.",1);return!0}function Em(e){return e===" "||e===" "||e===`
|
|
471
471
|
`||e==="\r"}function NBe(e,t){let r=t;for(;t<e.length;t++)if(e[t]=="?"||e[t]==" "){let n=e.substr(r,t-r);if(t>5&&n==="xml")return gn("InvalidXml","XML declaration allowed only at the start of the document.",ds(e,t));if(e[t]=="?"&&e[t+1]==">"){t++;break}else continue}return t}function RBe(e,t){if(e.length>t+5&&e[t+1]==="-"&&e[t+2]==="-"){for(t+=3;t<e.length;t++)if(e[t]==="-"&&e[t+1]==="-"&&e[t+2]===">"){t+=2;break}}else if(e.length>t+8&&e[t+1]==="D"&&e[t+2]==="O"&&e[t+3]==="C"&&e[t+4]==="T"&&e[t+5]==="Y"&&e[t+6]==="P"&&e[t+7]==="E"){let r=1;for(t+=8;t<e.length;t++)if(e[t]==="<")r++;else if(e[t]===">"&&(r--,r===0))break}else if(e.length>t+9&&e[t+1]==="["&&e[t+2]==="C"&&e[t+3]==="D"&&e[t+4]==="A"&&e[t+5]==="T"&&e[t+6]==="A"&&e[t+7]==="["){for(t+=8;t<e.length;t++)if(e[t]==="]"&&e[t+1]==="]"&&e[t+2]===">"){t+=2;break}}return t}var uft='"',cft="'";function lft(e,t){let r="",n="",i=!1;for(;t<e.length;t++){if(e[t]===uft||e[t]===cft)n===""?n=e[t]:n!==e[t]||(n="");else if(e[t]===">"&&n===""){i=!0;break}r+=e[t]}return n!==""?!1:{value:r,index:t,tagClosed:i}}function dft(e){let t=[],r=e.length,n=0;for(;n<r;){let i=n;for(;n<r&&Em(e[n]);)n++;if(n>=r)break;if(e[n]==="="){n=i+1;continue}let s=e.slice(i,n),o=n;for(;n<r&&!Em(e[n])&&e[n]!=="=";)n++;let a=e.slice(o,n),A,u=n;for(;u<r&&Em(e[u]);)u++;u<r&&e[u]==="="&&(A=e.slice(n,u+1),n=u+1);let c,l,h=n;for(;h<r&&Em(e[h]);)h++;if(h<r&&(e[h]==='"'||e[h]==="'")){let f=h+1,g=e.indexOf(e[h],f);g!==-1&&(c=e[h],l=e.slice(f,g),n=g+1)}let d={startIndex:i};d[1]=s,d[2]=a,d[3]=A,d[4]=c!==void 0?!0:void 0,d[5]=c,d[6]=l,t.push(d)}return t}function xBe(e,t){let r=dft(e),n={};for(let i=0;i<r.length;i++){if(r[i][1].length===0)return gn("InvalidAttr","Attribute '"+r[i][2]+"' has no space in starting.",Ab(r[i]));if(r[i][3]!==void 0&&r[i][4]===void 0)return gn("InvalidAttr","Attribute '"+r[i][2]+"' is without value.",Ab(r[i]));if(r[i][3]===void 0&&!t.allowBooleanAttributes)return gn("InvalidAttr","boolean attribute '"+r[i][2]+"' is not allowed.",Ab(r[i]));let s=r[i][2];if(!gft(s))return gn("InvalidAttr","Attribute '"+s+"' is an invalid name.",Ab(r[i]));if(!Object.prototype.hasOwnProperty.call(n,s))n[s]=1;else return gn("InvalidAttr","Attribute '"+s+"' is repeated.",Ab(r[i]))}return!0}function hft(e,t){let r=/\d/;for(e[t]==="x"&&(t++,r=/[\da-fA-F]/);t<e.length;t++){if(e[t]===";")return t;if(!e[t].match(r))break}return-1}function fft(e,t){if(t++,e[t]===";")return-1;if(e[t]==="#")return t++,hft(e,t);let r=0;for(;t<e.length;t++,r++)if(!(e[t].match(/\w/)&&r<20)){if(e[t]===";")break;return-1}return t}function gn(e,t,r){return{err:{code:e,msg:t,line:r.line||r,col:r.col}}}function gft(e){return q5(e)}function pft(e){return q5(e)}function ds(e,t){let r=e.substring(0,t).split(/\r?\n/);return{line:r.length,col:r[r.length-1].length+1}}function Ab(e){return e.startIndex+e[1].length}var J5={cent:"\xA2",pound:"\xA3",curren:"\xA4",yen:"\xA5",euro:"\u20AC",dollar:"$",fnof:"\u0192",inr:"\u20B9",af:"\u060B",birr:"\u1265\u122D",peso:"\u20B1",rub:"\u20BD",won:"\u20A9",yuan:"\xA5",cedil:"\xB8"};var ub={amp:"&",apos:"'",gt:">",lt:"<",quot:'"'},j5={nbsp:"\xA0",copy:"\xA9",reg:"\xAE",trade:"\u2122",mdash:"\u2014",ndash:"\u2013",hellip:"\u2026",laquo:"\xAB",raquo:"\xBB",lsquo:"\u2018",rsquo:"\u2019",ldquo:"\u201C",rdquo:"\u201D",bull:"\u2022",para:"\xB6",sect:"\xA7",deg:"\xB0",frac12:"\xBD",frac14:"\xBC",frac34:"\xBE"};var mm=Object.freeze({ALLOW:"allow",BLOCK:"block",THROW:"throw"}),Eft=new Set("!?\\\\/[]$%{}^&*()<>|+");function kBe(e){if(e[0]==="#")throw new Error(`[EntityReplacer] Invalid character '#' in entity name: "${e}"`);for(let t of e)if(Eft.has(t))throw new Error(`[EntityReplacer] Invalid character '${t}' in entity name: "${e}"`);return e}function cb(...e){let t=Object.create(null);for(let r of e)if(r)for(let n of Object.keys(r)){let i=r[n];if(typeof i=="string")t[n]=i;else if(i&&typeof i=="object"&&i.val!==void 0){let s=i.val;typeof s=="string"&&(t[n]=s)}}return t}var Sg="external",kx="base",$5="all";function mft(e){return!e||e===Sg?new Set([Sg]):e===$5?new Set([$5]):e===kx?new Set([kx]):Array.isArray(e)?new Set(e):new Set([Sg])}var Ks=Object.freeze({allow:0,leave:1,remove:2,throw:3}),Ift=new Set([9,10,13]);function Cft(e){if(!e)return{xmlVersion:1,onLevel:Ks.allow,nullLevel:Ks.remove};let t=e.xmlVersion===1.1?1.1:1,r=Ks[e.onNCR]??Ks.allow,n=Ks[e.nullNCR]??Ks.remove,i=Math.max(n,Ks.remove);return{xmlVersion:t,onLevel:r,nullLevel:i}}var Im=class{constructor(t={}){this._limit=t.limit||{},this._maxTotalExpansions=this._limit.maxTotalExpansions||0,this._maxExpandedLength=this._limit.maxExpandedLength||0,this._postCheck=typeof t.postCheck=="function"?t.postCheck:n=>n,this._limitTiers=mft(this._limit.applyLimitsTo??Sg),this._numericAllowed=t.numericAllowed??!0,this._baseMap=cb(ub,t.namedEntities||null),this._externalMap=Object.create(null),this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this._removeSet=new Set(t.remove&&Array.isArray(t.remove)?t.remove:[]),this._leaveSet=new Set(t.leave&&Array.isArray(t.leave)?t.leave:[]);let r=Cft(t.ncr);this._ncrXmlVersion=r.xmlVersion,this._ncrOnLevel=r.onLevel,this._ncrNullLevel=r.nullLevel,this._onExternalEntity=typeof t.onExternalEntity=="function"?t.onExternalEntity:null,this._onInputEntity=typeof t.onInputEntity=="function"?t.onInputEntity:null}_applyRegistrationHook(t,r,n,i){if(!t)return!0;let s=t(r,n);if(s===mm.BLOCK)return!1;if(s===mm.THROW)throw new Error(`[EntityDecoder] Registration of ${i} entity "&${r};" was rejected by hook`);return!0}setExternalEntities(t){if(t)for(let i of Object.keys(t))kBe(i);if(!this._onExternalEntity){this._externalMap=cb(t);return}let r=cb(t),n=Object.create(null);for(let[i,s]of Object.entries(r))this._applyRegistrationHook(this._onExternalEntity,i,s,"external")&&(n[i]=s);this._externalMap=n}addExternalEntity(t,r){kBe(t),typeof r=="string"&&r.indexOf("&")===-1&&this._applyRegistrationHook(this._onExternalEntity,t,r,"external")&&(this._externalMap[t]=r)}addInputEntities(t){if(this._totalExpansions=0,this._expandedLength=0,!this._onInputEntity){this._inputMap=cb(t);return}let r=cb(t),n=Object.create(null);for(let[i,s]of Object.entries(r))this._applyRegistrationHook(this._onInputEntity,i,s,"input")&&(n[i]=s);this._inputMap=n}reset(){return this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this}setXmlVersion(t){this._ncrXmlVersion=t===1.1?1.1:1}decode(t){if(typeof t!="string"||t.length===0||t.indexOf("&")===-1)return t;let r=t,n=[],i=t.length,s=0,o=0,a=this._maxTotalExpansions>0,A=this._maxExpandedLength>0,u=a||A;for(;o<i;){if(t.charCodeAt(o)!==38){o++;continue}let l=o+1;for(;l<i&&t.charCodeAt(l)!==59&&l-o<=32;)l++;if(l>=i||t.charCodeAt(l)!==59){o++;continue}let h=t.slice(o+1,l);if(h.length===0){o++;continue}let d,f;if(this._removeSet.has(h))d="",f===void 0&&(f=Sg);else if(this._leaveSet.has(h)){o++;continue}else if(h.charCodeAt(0)===35){let g=this._resolveNCR(h);if(g===void 0){o++;continue}d=g,f=kx}else{let g=this._resolveName(h);d=g?.value,f=g?.tier}if(d===void 0){o++;continue}if(o>s&&n.push(t.slice(s,o)),n.push(d),s=l+1,o=s,u&&this._tierCounts(f)){if(a&&(this._totalExpansions++,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`);if(A){let g=d.length-(h.length+2);if(g>0&&(this._expandedLength+=g,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}}}s<i&&n.push(t.slice(s));let c=n.length===0?t:n.join("");return this._postCheck(c,r)}_tierCounts(t){return this._limitTiers.has($5)?!0:this._limitTiers.has(t)}_resolveName(t){if(t in this._inputMap)return{value:this._inputMap[t],tier:Sg};if(t in this._externalMap)return{value:this._externalMap[t],tier:Sg};if(t in this._baseMap)return{value:this._baseMap[t],tier:kx}}_classifyNCR(t){return t===0?this._ncrNullLevel:t>=55296&&t<=57343||this._ncrXmlVersion===1&&t>=1&&t<=31&&!Ift.has(t)?Ks.remove:-1}_applyNCRAction(t,r,n){switch(t){case Ks.allow:return String.fromCodePoint(n);case Ks.remove:return"";case Ks.leave:return;case Ks.throw:throw new Error(`[EntityDecoder] Prohibited numeric character reference &${r}; (U+${n.toString(16).toUpperCase().padStart(4,"0")})`);default:return String.fromCodePoint(n)}}_resolveNCR(t){let r=t.charCodeAt(1),n;if(r===120||r===88?n=parseInt(t.slice(2),16):n=parseInt(t.slice(1),10),Number.isNaN(n)||n<0||n>1114111)return;let i=this._classifyNCR(n);if(!this._numericAllowed&&i<Ks.remove)return;let s=i===-1?this._ncrOnLevel:Math.max(this._ncrOnLevel,i);return this._applyNCRAction(s,t,n)}};var LBe=e=>ab.includes(e)?"__"+e:e,Bft={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0,unicode:!1},tagValueProcessor:function(e,t){return t},attributeValueProcessor:function(e,t){return t},stopNodes:[],alwaysCreateTextNode:!1,isArray:()=>!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,entityDecoder:null,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(e,t,r){return e},captureMetaData:!1,maxNestedTags:100,strictReservedNames:!0,jPath:!0,onDangerousProperty:LBe};function yft(e,t){if(typeof e!="string")return;let r=e.toLowerCase();if(ab.some(n=>r===n.toLowerCase()))throw new Error(`[SECURITY] Invalid ${t}: "${e}" is a reserved JavaScript keyword that could cause prototype pollution`);if(vx.some(n=>r===n.toLowerCase()))throw new Error(`[SECURITY] Invalid ${t}: "${e}" is a reserved JavaScript keyword that could cause prototype pollution`)}function MBe(e,t){return typeof e=="boolean"?{enabled:e,maxEntitySize:1e4,maxExpansionDepth:1e4,maxTotalExpansions:1/0,maxExpandedLength:1e5,maxEntityCount:1e3,allowedTags:null,tagFilter:null,appliesTo:"all"}:typeof e=="object"&&e!==null?{enabled:e.enabled!==!1,maxEntitySize:Math.max(1,e.maxEntitySize??1e4),maxExpansionDepth:Math.max(1,e.maxExpansionDepth??1e4),maxTotalExpansions:Math.max(1,e.maxTotalExpansions??1/0),maxExpandedLength:Math.max(1,e.maxExpandedLength??1e5),maxEntityCount:Math.max(1,e.maxEntityCount??1e3),allowedTags:e.allowedTags??null,tagFilter:e.tagFilter??null,appliesTo:e.appliesTo??"all"}:MBe(!0)}var FBe=function(e){let t=Object.assign({},Bft,e),r=[{value:t.attributeNamePrefix,name:"attributeNamePrefix"},{value:t.attributesGroupName,name:"attributesGroupName"},{value:t.textNodeName,name:"textNodeName"},{value:t.cdataPropName,name:"cdataPropName"},{value:t.commentPropName,name:"commentPropName"}];for(let{value:n,name:i}of r)n&&yft(n,i);return t.onDangerousProperty===null&&(t.onDangerousProperty=LBe),t.processEntities=MBe(t.processEntities,t.htmlEntities),t.unpairedTagsSet=new Set(t.unpairedTags),t.stopNodes&&Array.isArray(t.stopNodes)&&(t.stopNodes=t.stopNodes.map(n=>typeof n=="string"&&n.startsWith("*.")?".."+n.substring(2):n)),t};var Tg;typeof Symbol!="function"?Tg="@@xmlMetadata":Tg=Symbol("XML Node Metadata");var Xs=class{constructor(t){this.tagname=t,this.child=[],this[":@"]=Object.create(null)}add(t,r){t==="__proto__"&&(t="#__proto__"),this.child.push({[t]:r})}addChild(t,r){t.tagname==="__proto__"&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),this.addStartIndex(r)}addStartIndex(t){t!==void 0&&(this.child[this.child.length-1][Tg]={startIndex:t})}addEndIndex(t){let r=this.child[this.child.length-1];r!==void 0&&r[Tg]!==void 0&&r[Tg].endIndex===void 0&&(r[Tg].endIndex=t)}static getMetaDataSymbol(){return Tg}};var UBe=":A-Za-z_\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD",bft=UBe+"\\-\\.\\d\xB7\u0300-\u036F\u203F-\u2040",_Be=":A-Za-z_\xC0-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}",Qft=_Be+"\\-\\.\\d\xB7\u0300-\u036F\u0487\u203F-\u2040",K5=(e,t,r="")=>{let n=e.replace(":",""),i=t.replace(":",""),s=`[${n}][${i}]*`;return{name:new RegExp(`^[${e}][${t}]*$`,r),ncName:new RegExp(`^${s}$`,r),qName:new RegExp(`^${s}(?::${s})?$`,r),nmToken:new RegExp(`^[${t}]+$`,r),nmTokens:new RegExp(`^[${t}]+(?:\\s+[${t}]+)*$`,r)}},wft=K5(UBe,bft),Sft=K5(_Be,Qft,"u"),OBe=":A-Za-z_",Tft=OBe+"\\-\\.\\d",Dft=K5(OBe,Tft),Nft=(e="1.0",t=!1)=>t?Dft:e==="1.1"?Sft:wft;var X5=(e,{xmlVersion:t="1.0",asciiOnly:r=!1}={})=>Nft(t,r).qName.test(e);var db=class{constructor(t,r){this.suppressValidationErr=!t,this.options=t,this.xmlVersion=r||1}setXmlVersion(t=1){this.xmlVersion=t}readDocType(t,r){let n=Object.create(null),i=0;if(t[r+3]==="O"&&t[r+4]==="C"&&t[r+5]==="T"&&t[r+6]==="Y"&&t[r+7]==="P"&&t[r+8]==="E"){r=r+9;let s=1,o=!1,a=!1,A=null,u="";for(;r<t.length;r++){if(A!==null){t[r]===A&&(A=null),u+=t[r];continue}if(!o&&!a&&(t[r]==='"'||t[r]==="'")){A=t[r],u+=t[r];continue}if(t[r]==="<"&&!a){if(o&&Dg(t,"!ENTITY",r)){r+=7;let c,l;if([c,l,r]=this.readEntityExp(t,r+1,this.suppressValidationErr),l.indexOf("&")===-1){if(this.options.enabled!==!1&&this.options.maxEntityCount!=null&&i>=this.options.maxEntityCount)throw new Error(`Entity count (${i+1}) exceeds maximum allowed (${this.options.maxEntityCount})`);n[c]=l,i++}}else if(o&&Dg(t,"!ELEMENT",r)){r+=8;let{index:c}=this.readElementExp(t,r+1);r=c}else if(o&&Dg(t,"!ATTLIST",r))r+=8;else if(o&&Dg(t,"!NOTATION",r)){r+=9;let{index:c}=this.readNotationExp(t,r+1,this.suppressValidationErr);r=c}else if(Dg(t,"!--",r))a=!0;else throw new Error("Invalid DOCTYPE");s++,u=""}else if(t[r]===">"){if(a?t[r-1]==="-"&&t[r-2]==="-"&&(a=!1,s--):s--,s===0)break}else t[r]==="["?o=!0:u+=t[r]}if(A!==null||s!==0)throw new Error("Unclosed DOCTYPE")}else throw new Error("Invalid Tag instead of DOCTYPE");return{entities:n,i:r}}readEntityExp(t,r){r=zs(t,r);let n=r;for(;r<t.length&&!/\s/.test(t[r])&&t[r]!=='"'&&t[r]!=="'";)r++;let i=t.substring(n,r);if(lb(i,{xmlVersion:this.xmlVersion}),r=zs(t,r),!this.suppressValidationErr){if(t.substring(r,r+6).toUpperCase()==="SYSTEM")throw new Error("External entities are not supported");if(t[r]==="%")throw new Error("Parameter entities are not supported")}let s="";if([r,s]=this.readIdentifierVal(t,r,"entity"),this.options.enabled!==!1&&this.options.maxEntitySize!=null&&s.length>this.options.maxEntitySize)throw new Error(`Entity "${i}" size (${s.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`);return r--,[i,s,r]}readNotationExp(t,r){r=zs(t,r);let n=r;for(;r<t.length&&!/\s/.test(t[r]);)r++;let i=t.substring(n,r);!this.suppressValidationErr&&lb(i,{xmlVersion:this.xmlVersion}),r=zs(t,r);let s=t.substring(r,r+6).toUpperCase();if(!this.suppressValidationErr&&s!=="SYSTEM"&&s!=="PUBLIC")throw new Error(`Expected SYSTEM or PUBLIC, found "${s}"`);r+=s.length,r=zs(t,r);let o=null,a=null;if(s==="PUBLIC")[r,o]=this.readIdentifierVal(t,r,"publicIdentifier"),r=zs(t,r),(t[r]==='"'||t[r]==="'")&&([r,a]=this.readIdentifierVal(t,r,"systemIdentifier"));else if(s==="SYSTEM"&&([r,a]=this.readIdentifierVal(t,r,"systemIdentifier"),!this.suppressValidationErr&&!a))throw new Error("Missing mandatory system identifier for SYSTEM notation");return{notationName:i,publicIdentifier:o,systemIdentifier:a,index:--r}}readIdentifierVal(t,r,n){let i="",s=t[r];if(s!=='"'&&s!=="'")throw new Error(`Expected quoted string, found "${s}"`);r++;let o=r;for(;r<t.length&&t[r]!==s;)r++;if(i=t.substring(o,r),t[r]!==s)throw new Error(`Unterminated ${n} value`);return r++,[r,i]}readElementExp(t,r){r=zs(t,r);let n=r;for(;r<t.length&&!/\s/.test(t[r]);)r++;let i=t.substring(n,r);if(!this.suppressValidationErr&&!X5(i,{xmlVersion:this.xmlVersion}))throw new Error(`Invalid element name: "${i}"`);r=zs(t,r);let s="";if(t[r]==="E"&&Dg(t,"MPTY",r))r+=4;else if(t[r]==="A"&&Dg(t,"NY",r))r+=2;else if(t[r]==="("){r++;let o=r;for(;r<t.length&&t[r]!==")";)r++;if(s=t.substring(o,r),t[r]!==")")throw new Error("Unterminated content model")}else if(!this.suppressValidationErr)throw new Error(`Invalid Element Expression, found "${t[r]}"`);return{elementName:i,contentModel:s.trim(),index:r}}readAttlistExp(t,r){r=zs(t,r);let n=r;for(;r<t.length&&!/\s/.test(t[r]);)r++;let i=t.substring(n,r);for(lb(i,{xmlVersion:this.xmlVersion}),r=zs(t,r),n=r;r<t.length&&!/\s/.test(t[r]);)r++;let s=t.substring(n,r);if(!lb(s,{xmlVersion:this.xmlVersion}))throw new Error(`Invalid attribute name: "${s}"`);r=zs(t,r);let o="";if(t.substring(r,r+8).toUpperCase()==="NOTATION"){if(o="NOTATION",r+=8,r=zs(t,r),t[r]!=="(")throw new Error(`Expected '(', found "${t[r]}"`);r++;let A=[];for(;r<t.length&&t[r]!==")";){let u=r;for(;r<t.length&&t[r]!=="|"&&t[r]!==")";)r++;let c=t.substring(u,r);if(c=c.trim(),!lb(c,{xmlVersion:this.xmlVersion}))throw new Error(`Invalid notation name: "${c}"`);A.push(c),t[r]==="|"&&(r++,r=zs(t,r))}if(t[r]!==")")throw new Error("Unterminated list of notations");r++,o+=" ("+A.join("|")+")"}else{let A=r;for(;r<t.length&&!/\s/.test(t[r]);)r++;o+=t.substring(A,r);let u=["CDATA","ID","IDREF","IDREFS","ENTITY","ENTITIES","NMTOKEN","NMTOKENS"];if(!this.suppressValidationErr&&!u.includes(o.toUpperCase()))throw new Error(`Invalid attribute type: "${o}"`)}r=zs(t,r);let a="";return t.substring(r,r+8).toUpperCase()==="#REQUIRED"?(a="#REQUIRED",r+=8):t.substring(r,r+7).toUpperCase()==="#IMPLIED"?(a="#IMPLIED",r+=7):[r,a]=this.readIdentifierVal(t,r,"ATTLIST"),{elementName:i,attributeName:s,attributeType:o,defaultValue:a,index:r}}},zs=(e,t)=>{for(;t<e.length&&/\s/.test(e[t]);)t++;return t};function Dg(e,t,r){for(let n=0;n<t.length;n++)if(t[n]!==e[r+n+1])return!1;return!0}function lb(e,t){if(X5(e,{xmlVersion:t}))return e;throw new Error(`Invalid entity name ${e}`)}var Rft=[48,1632,1776,2406,2534,2662,2790,2918,3046,3174,3302,3430,3558,3664,3792,3872,4160,4240,6112,6160,6470,6608,6784,6800,6992,7088,7232,7248,65296,120782,120792,120802,120812,120822,66720,68912,69734,69872,69942,70096,70384,70736,70864,71248,71360,71472,71904,72016,72688,72784,73040,73120,73552,92768,92864,93008,123200,123632,124144,125264,130032],Lx=255,Mx=new Map,PBe=65535,HBe=1632,Cm=HBe,xft=PBe-HBe+1,Fx=new Uint8Array(xft).fill(Lx);for(let e of Rft)for(let t=0;t<10;t++){let r=e+t;r<=PBe?Fx[r-Cm]=t:Mx.set(r,t)}var GBe=48,YBe=57,VBe=45,Ux=new Set([8722,65293,65123]);function vft(e){if(typeof e!="string")return e;let t=e.length;if(t===0)return e;let r=-1;for(let i=0;i<t;i++){let s=e.charCodeAt(i);if(!(s>=GBe&&s<=YBe||s===VBe)){if(s<Cm){if(Ux.has(s)){r=i;break}continue}if(s>=55296&&s<=56319){if(i+1<t){let o=e.charCodeAt(i+1);if(o>=56320&&o<=57343){let a=65536+(s-55296<<10)+(o-56320);if(Mx.has(a)){r=i;break}}}continue}if(Fx[s-Cm]!==Lx||Ux.has(s)){r=i;break}}}if(r===-1)return e;let n=[];r>0&&n.push(e.slice(0,r));for(let i=r;i<t;i++){let s=e.charCodeAt(i);if(s>=GBe&&s<=YBe||s===VBe){n.push(e[i]);continue}if(s<Cm){n.push(Ux.has(s)?"-":e[i]);continue}if(s>=55296&&s<=56319){if(i+1<t){let a=e.charCodeAt(i+1);if(a>=56320&&a<=57343){let A=65536+(s-55296<<10)+(a-56320),u=Mx.get(A);if(u!==void 0){n.push(String.fromCharCode(u+48)),i++;continue}}}n.push(e[i]);continue}if(Ux.has(s)){n.push("-");continue}let o=Fx[s-Cm];n.push(o!==Lx?String.fromCharCode(o+48):e[i])}return n.join("")}var WBe=vft;var kft=/^[-+]?0x[a-fA-F0-9]+$/,Lft=/^0b[01]+$/,Mft=/^0o[0-7]+$/,Fft=/^([\-\+])?(0*)([0-9]*(\.[0-9]*)?)$/,Uft={hex:!0,binary:!1,octal:!1,leadingZeros:!0,decimalPoint:".",eNotation:!0,infinity:"original",unicode:!1};function Z5(e,t={}){if(t=Object.assign({},Uft,t),!e||typeof e!="string")return e;let r=e.trim();if(r.length===0)return e;if(t.skipLike!==void 0&&t.skipLike.test(r))return e;if(r==="0"||t.unicode&&(r=WBe(r),r==="0"))return 0;if(t.hex&&kft.test(r))return z5(r,16);if(t.binary&&Lft.test(r))return z5(r,2);if(t.octal&&Mft.test(r))return z5(r,8);if(isFinite(r)){if(r.includes("e")||r.includes("E"))return Oft(e,r,t);{let n=Fft.exec(r);if(n){let i=n[1]||"",s=n[2],o=Pft(n[3]),a=i?e[s.length+1]===".":e[s.length]===".";if(!t.leadingZeros&&(s.length>1||s.length===1&&!a))return e;{let A=Number(r),u=String(A);if(A===0)return A;if(u.search(/[eE]/)!==-1)return t.eNotation?A:e;if(r.indexOf(".")!==-1)return u==="0"||u===o||u===`${i}${o}`?A:e;let c=s?o:r;return s?c===u||i+c===u?A:e:c===u||c===i+u?A:e}}else return e}}else return Hft(e,Number(r),t)}var _ft=/^([-+])?(0*)(\d*(\.\d*)?[eE][-\+]?\d+)$/;function Oft(e,t,r){if(!r.eNotation)return e;let n=t.match(_ft);if(n){let i=n[1]||"",s=n[3].indexOf("e")===-1?"E":"e",o=n[2],a=i?e[o.length+1]===s:e[o.length]===s;return o.length>1&&a?e:o.length===1&&(n[3].startsWith(`.${s}`)||n[3][0]===s)?Number(t):o.length>0?r.leadingZeros&&!a?(t=(n[1]||"")+n[3],Number(t)):e:Number(t)}else return e}function Pft(e){if(e&&e.indexOf(".")!==-1){let t=e.length;for(;t>0&&e.charCodeAt(t-1)===48;)t--;return e=e.slice(0,t),e==="."?e="0":e[0]==="."?e="0"+e:e[e.length-1]==="."&&(e=e.substring(0,e.length-1)),e}return e}function z5(e,t){let r=e.trim();if((t===2||t===8)&&(e=r.substring(2)),parseInt)return parseInt(e,t);if(Number.parseInt)return Number.parseInt(e,t);if(window&&window.parseInt)return window.parseInt(e,t);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}function Hft(e,t,r){let n=t===1/0;switch(r.infinity.toLowerCase()){case"null":return null;case"infinity":return t;case"string":return n?"Infinity":"-Infinity";default:return e}}function eG(e){return typeof e=="function"?e:Array.isArray(e)?t=>{for(let r of e)if(typeof r=="string"&&t===r||r instanceof RegExp&&r.test(t))return!0}:()=>!1}var Ng=class{constructor(t,r={},n){this.pattern=t,this.separator=r.separator||".",this.segments=this._parse(t),this.data=n,this._hasDeepWildcard=this.segments.some(i=>i.type==="deep-wildcard"),this._hasAttributeCondition=this.segments.some(i=>i.attrName!==void 0),this._hasPositionSelector=this.segments.some(i=>i.position!==void 0)}_parse(t){let r=[],n=0,i="";for(;n<t.length;)t[n]===this.separator?n+1<t.length&&t[n+1]===this.separator?(i.trim()&&(r.push(this._parseSegment(i.trim())),i=""),r.push({type:"deep-wildcard"}),n+=2):(i.trim()&&r.push(this._parseSegment(i.trim())),i="",n++):(i+=t[n],n++);return i.trim()&&r.push(this._parseSegment(i.trim())),r}_parseSegment(t){let r={type:"tag"},n=null,i=t,s=t.match(/^([^\[]+)(\[[^\]]*\])(.*)$/);if(s&&(i=s[1]+s[3],s[2])){let c=s[2].slice(1,-1);c&&(n=c)}let o,a=i;if(i.includes("::")){let c=i.indexOf("::");if(o=i.substring(0,c).trim(),a=i.substring(c+2).trim(),!o)throw new Error(`Invalid namespace in pattern: ${t}`)}let A,u=null;if(a.includes(":")){let c=a.lastIndexOf(":"),l=a.substring(0,c).trim(),h=a.substring(c+1).trim();["first","last","odd","even"].includes(h)||/^nth\(\d+\)$/.test(h)?(A=l,u=h):A=a}else A=a;if(!A)throw new Error(`Invalid segment pattern: ${t}`);if(r.tag=A,o&&(r.namespace=o),n)if(n.includes("=")){let c=n.indexOf("=");r.attrName=n.substring(0,c).trim(),r.attrValue=n.substring(c+1).trim()}else r.attrName=n.trim();if(u){let c=u.match(/^nth\((\d+)\)$/);c?(r.position="nth",r.positionValue=parseInt(c[1],10)):r.position=u}return r}get length(){return this.segments.length}hasDeepWildcard(){return this._hasDeepWildcard}hasAttributeCondition(){return this._hasAttributeCondition}hasPositionSelector(){return this._hasPositionSelector}toString(){return this.pattern}};var Bm=class{constructor(){this._byDepthAndTag=new Map,this._wildcardByDepth=new Map,this._deepWildcards=[],this._deepByTerminalTag=new Map,this._patterns=new Set,this._sealed=!1}add(t){if(this._sealed)throw new TypeError("ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.");if(this._patterns.has(t.pattern))return this;if(this._patterns.add(t.pattern),t.hasDeepWildcard()){let s=t.segments[t.segments.length-1];if(s&&s.type!=="deep-wildcard"&&s.tag!=="*"){let o=s.tag;this._deepByTerminalTag.has(o)||this._deepByTerminalTag.set(o,[]),this._deepByTerminalTag.get(o).push(t)}else this._deepWildcards.push(t);return this}let r=t.length,i=t.segments[t.segments.length-1]?.tag;if(!i||i==="*")this._wildcardByDepth.has(r)||this._wildcardByDepth.set(r,[]),this._wildcardByDepth.get(r).push(t);else{let s=`${r}:${i}`;this._byDepthAndTag.has(s)||this._byDepthAndTag.set(s,[]),this._byDepthAndTag.get(s).push(t)}return this}addAll(t){for(let r of t)this.add(r);return this}has(t){return this._patterns.has(t.pattern)}get size(){return this._patterns.size}seal(){return this._sealed=!0,this}get isSealed(){return this._sealed}matchesAny(t){return this.findMatch(t)!==null}findMatch(t){let r=t.getDepth(),n=t.getCurrentTag(),i=`${r}:${n}`,s=this._byDepthAndTag.get(i);if(s){for(let A=0;A<s.length;A++)if(t.matches(s[A]))return s[A]}let o=this._wildcardByDepth.get(r);if(o){for(let A=0;A<o.length;A++)if(t.matches(o[A]))return o[A]}let a=this._deepByTerminalTag.get(n);if(a){for(let A=0;A<a.length;A++)if(t.matches(a[A]))return a[A]}for(let A=0;A<this._deepWildcards.length;A++)if(t.matches(this._deepWildcards[A]))return this._deepWildcards[A];return null}};var tG=class{constructor(t){this._matcher=t}get separator(){return this._matcher.separator}getCurrentTag(){let t=this._matcher.path;return t.length>0?t[t.length-1].tag:void 0}getCurrentNamespace(){let t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){let r=this._matcher.path;if(r.length!==0)return r[r.length-1].values?.[t]}hasAttr(t){let r=this._matcher.path;if(r.length===0)return!1;let n=r[r.length-1];return n.values!==void 0&&t in n.values}getAnyParentAttr(t){return this._matcher.getAnyParentAttr(t)}hasAnyParentAttr(t){return this._matcher.hasAnyParentAttr(t)}getPosition(){let t=this._matcher.path;return t.length===0?-1:t[t.length-1].position??0}getCounter(){let t=this._matcher.path;return t.length===0?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,r=!0){return this._matcher.toString(t,r)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}},ym=class{constructor(t={}){this.separator=t.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new tG(this),this._keptAttrs=[]}push(t,r=null,n=null,i=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);let s=this.path.length,o=this.siblingStacks[s];o||(o={counts:new Map,total:0},this.siblingStacks[s]=o);let a=n?`${n}:${t}`:t,A=o.counts.get(a)||0,u=o.total;o.counts.set(a,A+1),o.total++;let c={tag:t,position:u,counter:A};n!=null&&(c.namespace=n),r!=null&&(c.values=r),this.path.push(c);let l=this.path.length,h=i!==null?i.keep:null;if(h!=null&&h.length>0&&r)for(let d=0;d<h.length;d++){let f=h[d];r[f]!==void 0&&this._keptAttrs.push({depth:l,name:f,value:r[f]})}}pop(){if(this.path.length===0)return;this._pathStringCache=null;let t=this.path.pop();this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1);let r=this.path.length+1;for(;this._keptAttrs.length>0&&this._keptAttrs[this._keptAttrs.length-1].depth>=r;)this._keptAttrs.pop();return t}updateCurrent(t){if(this.path.length>0){let r=this.path[this.path.length-1];t!=null&&(r.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(this.path.length!==0)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(this.path.length===0)return!1;let r=this.path[this.path.length-1];return r.values!==void 0&&t in r.values}getAnyParentAttr(t){let r=this._keptAttrs;for(let n=r.length-1;n>=0;n--)if(r[n].name===t)return r[n].value}hasAnyParentAttr(t){let r=this._keptAttrs;for(let n=r.length-1;n>=0;n--)if(r[n].name===t)return!0;return!1}getPosition(){return this.path.length===0?-1:this.path[this.path.length-1].position??0}getCounter(){return this.path.length===0?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,r=!0){let n=t||this.separator;if(n===this.separator&&r===!0){if(this._pathStringCache!==null)return this._pathStringCache;let s=this.path.map(o=>o.namespace?`${o.namespace}:${o.tag}`:o.tag).join(n);return this._pathStringCache=s,s}return this.path.map(s=>r&&s.namespace?`${s.namespace}:${s.tag}`:s.tag).join(n)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[],this._keptAttrs=[]}matches(t){let r=t.segments;return r.length===0?!1:t.hasDeepWildcard()?this._matchWithDeepWildcard(r):this._matchSimple(r)}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let r=0;r<t.length;r++)if(!this._matchSegment(t[r],this.path[r],r===this.path.length-1))return!1;return!0}_matchWithDeepWildcard(t){let r=this.path.length-1,n=t.length-1;for(;n>=0&&r>=0;){let i=t[n];if(i.type==="deep-wildcard"){if(n--,n<0)return!0;let s=t[n],o=!1;for(let a=r;a>=0;a--)if(this._matchSegment(s,this.path[a],a===this.path.length-1)){r=a-1,n--,o=!0;break}if(!o)return!1}else{if(!this._matchSegment(i,this.path[r],r===this.path.length-1))return!1;r--,n--}}return n<0}_matchSegment(t,r,n){if(t.tag!=="*"&&t.tag!==r.tag||t.namespace!==void 0&&t.namespace!=="*"&&t.namespace!==r.namespace||t.attrName!==void 0&&(!n||!r.values||!(t.attrName in r.values)||t.attrValue!==void 0&&String(r.values[t.attrName])!==String(t.attrValue)))return!1;if(t.position!==void 0){if(!n)return!1;let i=r.counter??0;if(t.position==="first"&&i!==0)return!1;if(t.position==="odd"&&i%2!==1)return!1;if(t.position==="even"&&i%2!==0)return!1;if(t.position==="nth"&&i!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>t&&{counts:new Map(t.counts),total:t.total}),keptAttrs:this._keptAttrs.map(t=>({...t}))}}restore(t){this._pathStringCache=null,this.path=t.path.map(r=>({...r})),this.siblingStacks=t.siblingStacks.map(r=>r&&{counts:new Map(r.counts),total:r.total}),this._keptAttrs=(t.keptAttrs||[]).map(r=>({...r}))}readOnly(){return this._view}};var Gft=[{id:"html-script-open",description:"<script opening tag",pattern:/<script[\s>/]/i},{id:"html-script-close",description:"</script closing tag",pattern:/<\/script[\s>]/i},{id:"html-javascript-protocol",description:"javascript: URI scheme (with optional whitespace/encoding)",pattern:/j[\t\n\r ]*a[\t\n\r ]*v[\t\n\r ]*a[\t\n\r ]*s[\t\n\r ]*c[\t\n\r ]*r[\t\n\r ]*i[\t\n\r ]*p[\t\n\r ]*t[\t\n\r ]*:/i},{id:"html-vbscript-protocol",description:"vbscript: URI scheme",pattern:/vbscript[\t\n\r ]*:/i},{id:"html-data-html",description:"data:text/html URI \u2014 can execute scripts in browsers",pattern:/data[\t\n\r ]*:[\t\n\r ]*text\/html/i},{id:"html-data-xhtml",description:"data:application/xhtml+xml URI",pattern:/data[\t\n\r ]*:[\t\n\r ]*application\/xhtml/i},{id:"html-data-svg",description:"data:image/svg+xml URI \u2014 can execute scripts",pattern:/data[\t\n\r ]*:[\t\n\r ]*image\/svg\+xml/i},{id:"html-inline-event-handler",description:"Inline event handler attributes: onclick=, onerror=, onload=, etc.",pattern:/\bon\w{1,30}\s*=/i},{id:"html-entity-obfuscated-script",description:"HTML-entity-encoded <script (e.g. <script or <script)",pattern:/(?:�*3[Cc];?|�*60;?|<)\s*script/i},{id:"html-entity-obfuscated-javascript",description:'HTML-entity-encoded javascript: (partial \u2014 catches common j or j for "j")',pattern:/(?:�*6[Aa];?|�*106;?)\s*(?:�*61;?|a)[\s\S]{0,80}script\s*:/i},{id:"html-style-expression",description:"CSS expression() \u2014 IE-era code execution in style attributes",pattern:/style[\s\S]{0,20}expression\s*\(/i},{id:"html-object-embed",description:"<object or <embed tags that can load active content",pattern:/<(?:object|embed)[\s>/]/i},{id:"html-base-tag",description:"<base href= \u2014 can hijack all relative URLs on a page",pattern:/<base[\s>]/i},{id:"html-meta-refresh",description:'<meta http-equiv="refresh" \u2014 can redirect users',pattern:/<meta[\s\S]{0,40}http-equiv[\s\S]{0,20}refresh/i},{id:"html-srcdoc",description:"srcdoc= attribute on iframes \u2014 embeds HTML that can run scripts",pattern:/srcdoc\s*=/i},{id:"html-iframe",description:"<iframe tag",pattern:/<iframe[\s>/]/i},{id:"html-form",description:"<form tag \u2014 can be used for phishing / credential harvesting injection",pattern:/<form[\s>/]/i}],bm=Gft;var Yft=[{id:"xml-cdata-injection",description:"CDATA section injection: <![CDATA[ breaks out of text node context",pattern:/<!\[CDATA\[/i},{id:"xml-cdata-close",description:"CDATA close sequence: ]]> can terminate an enclosing CDATA section",pattern:/\]\]>/},{id:"xml-processing-instruction",description:"XML processing instruction: <?xml-stylesheet or <?php etc.",pattern:/<\?(?:xml[\- ]|php|asp)/i},{id:"xml-doctype-injection",description:"DOCTYPE declaration embedded in content \u2014 can define entities",pattern:/<!DOCTYPE(?:[\s[]|$)/i},{id:"xml-entity-system",description:"SYSTEM keyword \u2014 used in external entity declarations (XXE)",pattern:/\bSYSTEM\s+["']/i},{id:"xml-entity-public",description:"PUBLIC keyword \u2014 used in external entity declarations (XXE)",pattern:/\bPUBLIC\s+["']/i},{id:"xml-entity-declaration",description:"<!ENTITY declaration \u2014 defines entities, potential XXE or entity expansion",pattern:/<!ENTITY[\s%]/i},{id:"xml-billion-laughs",description:"Entity reference chaining / billion laughs: repeated &eX; style references",pattern:/(?:&\w{1,20};){3,}/},{id:"xml-namespace-confusion",description:"xmlns: attribute injection \u2014 can redefine namespaces to confuse parsers",pattern:/\bxmlns(?::\w{1,40})?\s*=/i},{id:"xml-comment-injection",description:"<!-- comment injection \u2014 can hide content from some parsers",pattern:/<!--/},{id:"xml-comment-close",description:"--> closes an enclosing XML comment",pattern:/-->/},{id:"xml-pi-close",description:"?> closes an enclosing processing instruction",pattern:/\?>/}],Qm=Yft;var Vft=[{id:"svg-script-element",description:"<script element inside SVG executes JavaScript",pattern:/<script[\s>/]/i},{id:"svg-xlink-href-javascript",description:"xlink:href with javascript: \u2014 classic SVG XSS via <a> or <use>",pattern:/xlink\s*:\s*href\s*=\s*["']?\s*javascript\s*:/i},{id:"svg-href-javascript",description:"href= with javascript: in SVG context (<a>, <animate>, etc.)",pattern:/href\s*=\s*["']?\s*javascript\s*:/i},{id:"svg-foreignobject",description:"<foreignObject embeds HTML inside SVG \u2014 can execute scripts",pattern:/<foreignObject[\s>/]/i},{id:"svg-use-external",description:"<use xlink:href or href pointing to external resource (non-fragment URL)",pattern:/<use[\s\S]{0,60}(?:xlink\s*:\s*)?href\s*=\s*(?:["'][^#]|[^"'#\s>])/i},{id:"svg-animate-href",description:'<animate attributeName="href" \u2014 can dynamically change href to javascript:',pattern:/<animate[\s\S]{0,80}attributeName\s*=\s*["'][\s]*href["']/i},{id:"svg-animate-xlinkhref",description:'<animate attributeName="xlink:href"',pattern:/<animate[\s\S]{0,80}attributeName\s*=\s*["'][\s]*xlink\s*:\s*href["']/i},{id:"svg-set-javascript",description:'<set to="javascript:..." \u2014 sets an attribute to a javascript: URI',pattern:/<set[\s\S]{0,80}to\s*=\s*["']?\s*javascript\s*:/i},{id:"svg-event-handler",description:"SVG-specific event handler attributes: onload=, onerror=, onactivate=, etc.",pattern:/\bon(?:load|error|activate|begin|end|repeat|focus|blur|click|mouse\w{1,20}|key\w{1,20})\s*=/i},{id:"svg-handler-generic",description:"Generic on* handler catch-all for SVG attributes",pattern:/\bon\w{1,30}\s*=/i},{id:"svg-filter-feimage",description:"<feImage href= \u2014 filter primitive that can load external resources",pattern:/<feImage[\s\S]{0,80}(?:xlink\s*:\s*)?href\s*=/i},{id:"svg-image-external",description:"<image xlink:href with http/https or javascript protocol",pattern:/<image[\s\S]{0,80}(?:xlink\s*:\s*)?href\s*=\s*["']?\s*(?:https?|javascript)\s*:/i},{id:"svg-style-javascript",description:"style= attribute containing javascript: (e.g. background:url(javascript:...))",pattern:/style\s*=[\s\S]{0,60}javascript\s*:/i}],rG=Vft;var Wft=[{id:"sql-block-comment-open",description:"SQL block comment open: /* ... */ \u2014 unusual in legitimate user text",pattern:/\/\*/},{id:"sql-union-select",description:"UNION SELECT \u2014 most common SQL injection aggregation attack",pattern:/\bUNION\s{1,20}(?:ALL\s{1,20})?SELECT\b/i},{id:"sql-drop-table",description:"DROP TABLE \u2014 destructive DDL injection",pattern:/\bDROP\s{1,20}TABLE\b/i},{id:"sql-drop-database",description:"DROP DATABASE \u2014 destructive DDL injection",pattern:/\bDROP\s{1,20}DATABASE\b/i},{id:"sql-insert-into",description:"INSERT INTO \u2014 data injection",pattern:/\bINSERT\s{1,20}INTO\b/i},{id:"sql-delete-from",description:"DELETE FROM \u2014 data deletion injection",pattern:/\bDELETE\s{1,20}FROM\b/i},{id:"sql-update-set",description:"UPDATE ... SET \u2014 data modification injection",pattern:/\bUPDATE\b[\s\S]{1,60}\bSET\b/i},{id:"sql-exec-xp",description:"EXEC xp_ \u2014 MSSQL extended stored procedure execution",pattern:/\bEXEC(?:UTE)?\s{1,20}xp_/i},{id:"sql-tautology-string",description:`Classic string tautology: ' OR '1'='1 or " OR "1"="1"`,pattern:/'\s{0,10}OR\s{0,10}'[^']{0,20}'\s*=\s*'[^']{0,20}/i},{id:"sql-tautology-numeric",description:"Numeric tautology: OR 1=1",pattern:/\bOR\s{1,10}1\s*=\s*1\b/i},{id:"sql-always-true-zero",description:"Numeric tautology: OR 0=0",pattern:/\bOR\s{1,10}0\s*=\s*0\b/i},{id:"sql-sleep-benchmark",description:"Time-based blind injection: SLEEP() or BENCHMARK()",pattern:/\b(?:SLEEP|BENCHMARK)\s*\(/i},{id:"sql-waitfor-delay",description:"MSSQL time-based blind injection: WAITFOR DELAY",pattern:/\bWAITFOR\s{1,20}DELAY\b/i},{id:"sql-char-function",description:"CHAR() function \u2014 used to obfuscate injected strings",pattern:/\bCHAR\s*\(\s*\d{1,3}/i},{id:"sql-information-schema",description:"INFORMATION_SCHEMA \u2014 reconnaissance query for table/column enumeration",pattern:/\bINFORMATION_SCHEMA\b/i}],hb=Wft;var qft=[{id:"shell-path-traversal-unix",description:"Unix path traversal: ../ \u2014 climbing the directory tree",pattern:/\.\.\//},{id:"shell-path-traversal-windows",description:"Windows path traversal: ..\\ \u2014 climbing the directory tree",pattern:/\.\.\\/},{id:"shell-path-traversal-encoded",description:"URL-encoded path traversal: %2e%2e or %2f variants",pattern:/%2e%2e|%2f\.\.|\.\.%2f/i},{id:"shell-null-byte",description:"Null byte injection: \\x00 or %00 \u2014 truncates strings in C-backed functions",pattern:/\x00|%00/},{id:"shell-semicolon",description:"Semicolon command separator: cmd1; cmd2",pattern:/;/},{id:"shell-pipe",description:"Pipe operator: cmd1 | cmd2",pattern:/\|/},{id:"shell-and-operator",description:"AND operator: cmd1 && cmd2",pattern:/&&/},{id:"shell-or-operator",description:"OR operator: cmd1 || cmd2",pattern:/\|\|/},{id:"shell-backtick",description:"Backtick command substitution: `cmd`",pattern:/`/},{id:"shell-dollar-paren",description:"Dollar-paren command substitution: $(cmd)",pattern:/\$\(/},{id:"shell-dollar-brace",description:"Dollar-brace variable expansion: ${var} \u2014 can be abused for injection",pattern:/\$\{/},{id:"shell-redirect-out",description:"Output redirection: cmd > file or cmd >> file",pattern:/>{1,2}/},{id:"shell-redirect-in",description:"Input redirection: cmd < file",pattern:/</},{id:"shell-newline-injection",description:"Newline injection: \\n or \\r \u2014 can inject new shell commands",pattern:/[\n\r]/},{id:"shell-glob-star",description:"Glob expansion: * or ? \u2014 can expand to unintended files",pattern:/[/\\][*?]/},{id:"shell-absolute-root",description:"Absolute root path injection: string starting with / or \\ (Windows UNC)",pattern:/^(?:\/|\\\\)/},{id:"shell-windows-drive",description:"Windows drive letter path injection: C:\\ or D:/",pattern:/^[a-zA-Z]:[/\\]/},{id:"shell-curl-wget",description:"curl/wget with URL or flags \u2014 can exfiltrate data or download payloads",pattern:/\b(?:curl|wget)\s+(?:https?:\/\/|ftp:\/\/|-)/i}],nG=qft;var Jft=[{id:"redos-nested-quantifier-plus",description:"Nested + quantifier inside a group with outer quantifier: (a+)+, (.+b)*, etc.",pattern:/\([^)]*\+[^)]*\)[+*]/},{id:"redos-nested-quantifier-star",description:"Nested * quantifier: (a*)* or (a*)+ \u2014 catastrophic backtracking",pattern:/\([^)]*\*[^)]*\)[*+]/},{id:"redos-nested-groups",description:"Doubly nested quantified groups: ((a+)+) \u2014 guaranteed catastrophic",pattern:/\(\([^)]{0,40}\)[+*]\)[+*]/},{id:"redos-alternation-overlap",description:"Overlapping alternation under quantifier: (a|a)+ \u2014 ambiguous NFA paths",pattern:/\(([^|()]{1,20})\|(?:\1)(?:\|[^|()]{1,20}){0,5}\)[+*?]{1,2}/},{id:"redos-star-plus-concat",description:"(x*x)+ pattern \u2014 triggers super-linear backtracking",pattern:/\([^)]{0,10}\*[^)]{0,10}\)[+*]/},{id:"redos-dot-star-greedy",description:"(.*){n,} or (.+){n,} \u2014 repeated greedy dot quantifiers",pattern:/\(\.[*+]\)\{?\d/},{id:"redos-large-repetition",description:"Very large fixed or range repetition count {1000,} or {1000,n} \u2014 denial of service via backtracking",pattern:/\{\d{4,}(?:,\d*)?\}/},{id:"redos-catastrophic-alternation",description:"Long alternation with many similar branches \u2014 polynomial backtracking risk",pattern:/\([^)]{0,200}(?:\|[^|)]{0,50}){9,}\)/}],iG=Jft;var Po=`["'\\s]*:`,jft=[{id:"nosql-where-operator",description:"$where \u2014 executes arbitrary JavaScript server-side in MongoDB",pattern:new RegExp(`\\$where${Po}`,"i")},{id:"nosql-ne-operator",description:'$ne \u2014 "not equal" operator used to bypass equality checks',pattern:new RegExp(`\\$ne${Po}`,"i")},{id:"nosql-gt-operator",description:'$gt \u2014 "greater than" used to bypass password/value checks',pattern:new RegExp(`\\$gte?${Po}`,"i")},{id:"nosql-lt-operator",description:'$lt / $lte \u2014 "less than" bypass variants',pattern:new RegExp(`\\$lte?${Po}`,"i")},{id:"nosql-regex-operator",description:"$regex \u2014 can be used to extract data character by character (blind injection)",pattern:new RegExp(`\\$regex${Po}`,"i")},{id:"nosql-or-operator",description:"$or \u2014 logical OR; used to create always-true conditions",pattern:new RegExp(`\\$or${Po}\\s*\\[`,"i")},{id:"nosql-and-operator",description:"$and \u2014 logical AND operator injection",pattern:new RegExp(`\\$and${Po}\\s*\\[`,"i")},{id:"nosql-nor-operator",description:"$nor \u2014 logical NOR operator injection",pattern:new RegExp(`\\$nor${Po}\\s*\\[`,"i")},{id:"nosql-exists-operator",description:"$exists \u2014 can enumerate fields to determine schema",pattern:new RegExp(`\\$exists${Po}`,"i")},{id:"nosql-in-operator",description:"$in \u2014 matches any value in a list; can enumerate values",pattern:new RegExp(`\\$in${Po}\\s*\\[`,"i")},{id:"nosql-expr-operator",description:"$expr \u2014 allows aggregation expressions in queries (MongoDB 3.6+)",pattern:new RegExp(`\\$expr${Po}`,"i")},{id:"nosql-function-operator",description:"$function \u2014 executes arbitrary JavaScript in MongoDB 4.4+",pattern:new RegExp(`\\$function${Po}`,"i")},{id:"nosql-accumulator-operator",description:"$accumulator \u2014 custom aggregation with arbitrary JS execution",pattern:new RegExp(`\\$accumulator${Po}`,"i")},{id:"nosql-proto-pollution",description:"__proto__ \u2014 prototype pollution via object key injection",pattern:/__proto__/},{id:"nosql-constructor-prototype",description:"constructor.prototype \u2014 alternative prototype pollution vector (dot notation or JSON key)",pattern:/constructor[\s"':.,{\[]*prototype/i},{id:"nosql-proto-bracket",description:'["__proto__"] \u2014 bracket-notation prototype pollution',pattern:/\[["']__proto__["']\]/}],sG=jft;var $ft=[{id:"log-crlf-injection",description:"CRLF injection: literal \\r or \\n embeds fake log lines",pattern:/[\r\n]/},{id:"log-url-encoded-crlf",description:"URL-encoded CRLF: %0d, %0a, %0D, %0A \u2014 decoded by some log parsers",pattern:/%0[dDaA]/},{id:"log-unicode-newline",description:"Unicode newline variants: U+2028 (line separator), U+2029 (paragraph separator)",pattern:/[\u2028\u2029]/},{id:"log-log4shell-jndi",description:"Log4Shell: ${jndi:...} triggers remote code execution in Apache Log4j",pattern:/\$\{jndi\s*:/i},{id:"log-log4shell-obfuscated",description:"Obfuscated Log4Shell: ${::-j}... lookup-bypass prefix used to evade WAF detection",pattern:/\$\{::-/},{id:"log-log4j-lookup",description:"Log4j lookup syntax: ${env:...}, ${sys:...}, ${ctx:...} \u2014 data exfiltration",pattern:/\$\{(?:env|sys|ctx|main|map|sd|web|docker|k8s|spring)\s*:/i},{id:"log-ssti-double-brace",description:"SSTI double-brace: {{expression}} \u2014 Jinja2, Twig, Handlebars, etc.",pattern:/\{\{[\s\S]{0,80}\}\}/},{id:"log-ssti-hash-brace",description:"SSTI hash-brace: #{expression} \u2014 Thymeleaf, Velocity, Ruby ERB",pattern:/#\{[\s\S]{0,80}\}/},{id:"log-ssti-dollar-brace",description:"SSTI/EL injection: ${expression with operators or method calls} \u2014 JSP EL, Freemarker, SpEL",pattern:/\$\{[^}]*(?:\.|\(|\*|\+|\bclass\b|\bruntime\b|\bprocess\b|\bexec\b)[^}]{0,80}\}/i},{id:"log-ssti-percent-tag",description:"SSTI ERB/ASP tag: <%= expression %> \u2014 Ruby ERB, ASP",pattern:/<%=[\s\S]{0,80}%>/},{id:"log-null-byte",description:"Null byte: \\x00 or %00 \u2014 can truncate log entries in C-backed loggers",pattern:/\x00|%00/},{id:"log-ansi-escape",description:"ANSI escape sequence: ESC[ \u2014 can manipulate terminal output when logs are tailed",pattern:/\x1b\[/}],oG=$ft;var Kft=[{id:"sql-line-comment",description:"SQL line comment: -- followed by whitespace or end of string",pattern:/--(?:\s|$)/},{id:"sql-stacked-query",description:"Stacked queries: semicolon immediately followed by a SQL keyword",pattern:/;\s{0,10}(?:SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC)\b/i},{id:"sql-hex-encoding",description:"Hex-encoded string injection: 0x41414141 style (MySQL)",pattern:/\b0x[0-9a-f]{4,}/i}],Xft=[...hb,...Kft],aG=Xft;bm.label="HTML";Qm.label="XML";rG.label="SVG";hb.label="SQL";aG.label="SQL-STRICT";nG.label="SHELL";iG.label="REDOS";sG.label="NOSQL";oG.label="LOG";var nHt=Object.freeze({HTML:bm,XML:Qm,SVG:rG,SQL:hb,"SQL-STRICT":aG,SHELL:nG,REDOS:iG,NOSQL:sG,LOG:oG});function zft(e){if(typeof e!="string")throw new TypeError(`is-unsafe: first argument must be a string, got ${typeof e}`)}function Zft(e){if(!(e instanceof RegExp)){if(Array.isArray(e)){if(e.length===0)throw new TypeError("is-unsafe: context must not be an empty array");if(Array.isArray(e[0])){for(let t of e)if(!Array.isArray(t)||t.length===0)throw new TypeError("is-unsafe: each context in the array must be a non-empty pattern array (PatternList)")}return}throw new TypeError(`is-unsafe: second argument must be a PatternList (e.g. HTML), an array of PatternLists (e.g. [HTML, XML]), or a RegExp. Got: ${typeof e}`)}}function egt(e){return e instanceof RegExp?{lists:null,regex:e}:Array.isArray(e[0])?{lists:e,regex:null}:{lists:[e],regex:null}}function tgt(e,t){let r=t.label??"CUSTOM";for(let n of t)if(n.pattern.test(e))return{context:r,id:n.id,description:n.description,pattern:n.pattern};return null}function qBe(e,t){zft(e),Zft(t);let{lists:r,regex:n}=egt(t);if(n)return n.test(e);for(let i of r)if(tgt(e,i)!==null)return!0;return!1}function rgt(e,t){if(!e)return{};let r=t.attributesGroupName?e[t.attributesGroupName]:e;if(!r)return{};let n={};for(let i in r)if(i.startsWith(t.attributeNamePrefix)){let s=i.substring(t.attributeNamePrefix.length);n[s]=r[i]}else n[i]=r[i];return n}function ngt(e){if(!e||typeof e!="string")return;let t=e.indexOf(":");if(t!==-1&&t>0){let r=e.substring(0,t);if(r!=="xmlns")return r}}var fb=class{constructor(t,r){this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.parseXml=Agt,this.parseTextData=igt,this.resolveNameSpace=sgt,this.buildAttributesMap=agt,this.isItStopNode=dgt,this.replaceEntitiesValue=cgt,this.readStopNodeData=ggt,this.saveTextToParentTag=lgt,this.addChild=ugt,this.ignoreAttributesFn=eG(this.options.ignoreAttributes),this.entityExpansionCount=0,this.currentExpandedLength=0,this.doctypefound=!1;let n={...ub};this.options.entityDecoder?this.entityDecoder=this.options.entityDecoder:(typeof this.options.htmlEntities=="object"?n=this.options.htmlEntities:this.options.htmlEntities===!0&&(n={...j5,...J5}),this.entityDecoder=new Im({namedEntities:{...n,...r},numericAllowed:this.options.htmlEntities,limit:{maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:this.options.processEntities.appliesTo},onInputEntity:(s,o)=>qBe(o,[bm,Qm])?mm.BLOCK:mm.ALLOW})),this.matcher=new ym,this.readonlyMatcher=this.matcher.readOnly(),this.isCurrentNodeStopNode=!1,this.stopNodeExpressionsSet=new Bm;let i=this.options.stopNodes;if(i&&i.length>0){for(let s=0;s<i.length;s++){let o=i[s];typeof o=="string"?this.stopNodeExpressionsSet.add(new Ng(o)):o instanceof Ng&&this.stopNodeExpressionsSet.add(o)}this.stopNodeExpressionsSet.seal()}}};function igt(e,t,r,n,i,s,o){let a=this.options;if(e!==void 0&&(a.trimValues&&!n&&(e=e.trim()),e.length>0)){o||(e=this.replaceEntitiesValue(e,t,r));let A=a.jPath?r.toString():r,u=a.tagValueProcessor(t,e,A,i,s);return u==null?e:typeof u!=typeof e||u!==e?u:a.trimValues||e.trim()===e?cG(e,a.parseTagValue,a.numberParseOptions):e}}function sgt(e){if(this.options.removeNSPrefix){let t=e.split(":"),r=e.charAt(0)==="/"?"/":"";if(t[0]==="xmlns")return"";t.length===2&&(e=r+t[1])}return e}var ogt=new RegExp(`([^\\s=]+)\\s*(=\\s*(['"])([\\s\\S]*?)\\3)?`,"gm");function agt(e,t,r,n=!1){let i=this.options;if(n===!0||i.ignoreAttributes!==!0&&typeof e=="string"){let s=TBe(e,ogt),o=s.length,a={},A=new Array(o),u=!1,c={};for(let d=0;d<o;d++){let f=this.resolveNameSpace(s[d][1]),g=s[d][4];if(f.length&&g!==void 0){let p=g;i.trimValues&&(p=p.trim()),p=this.replaceEntitiesValue(p,r,this.readonlyMatcher),A[d]=p,c[f]=p,u=!0}}u&&typeof t=="object"&&t.updateCurrent&&t.updateCurrent(c);let l=i.jPath?t.toString():this.readonlyMatcher,h=!1;for(let d=0;d<o;d++){let f=this.resolveNameSpace(s[d][1]);if(this.ignoreAttributesFn(f,l))continue;let g=i.attributeNamePrefix+f;if(f.length)if(i.transformAttributeName&&(g=i.transformAttributeName(g)),g=JBe(g,i),s[d][4]!==void 0){let p=A[d],m=i.attributeValueProcessor(f,p,l);m==null?a[g]=p:typeof m!=typeof p||m!==p?a[g]=m:a[g]=cG(p,i.parseAttributeValue,i.numberParseOptions),h=!0}else i.allowBooleanAttributes&&(a[g]=!0,h=!0)}if(!h)return;if(i.attributesGroupName&&!i.preserveOrder){let d={};return d[i.attributesGroupName]=a,d}return a}}var Agt=function(e){e=e.replace(/\r\n?/g,`
|
|
472
472
|
`);let t=new Xs("!xml"),r=t,n="";this.matcher.reset(),this.entityDecoder.reset(),this.entityExpansionCount=0,this.currentExpandedLength=0,this.doctypefound=!1;let i=this.options,s=new db(i.processEntities),o=e.length;for(let a=0;a<o;a++)if(e[a]==="<"){let u=e.charCodeAt(a+1);if(u===47){let c=wm(e,">",a,"Closing Tag is not closed."),l=e.substring(a+2,c).trim();if(i.removeNSPrefix){let d=l.indexOf(":");d!==-1&&(l=l.substr(d+1))}l=AG(i.transformTagName,l,"",i).tagName,r&&(n=this.saveTextToParentTag(n,r,this.readonlyMatcher));let h=this.matcher.getCurrentTag();if(l&&i.unpairedTagsSet.has(l))throw new Error(`Unpaired tag can not be used as closing tag: </${l}>`);h&&i.unpairedTagsSet.has(h)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,r=this.tagsNodeStack.pop()||t,i.captureMetaData&&r&&r.addEndIndex(c+1),n="",a=c}else if(u===63){let c=uG(e,a,!1,"?>");if(!c)throw new Error("Pi Tag is not closed.");n=this.saveTextToParentTag(n,r,this.readonlyMatcher);let l=this.buildAttributesMap(c.tagExp,this.matcher,c.tagName,!0);if(l){let h=l[this.options.attributeNamePrefix+"version"];this.entityDecoder.setXmlVersion(Number(h)||1),s.setXmlVersion(Number(h)||1)}if(!(i.ignoreDeclaration&&c.tagName==="?xml"||i.ignorePiTags)){let h=new Xs(c.tagName);h.add(i.textNodeName,""),c.tagName!==c.tagExp&&c.attrExpPresent&&i.ignoreAttributes!==!0&&(h[":@"]=l),this.addChild(r,h,this.readonlyMatcher,a),i.captureMetaData&&r.addEndIndex(c.closeIndex+2)}a=c.closeIndex+1}else if(u===33&&e.charCodeAt(a+2)===45&&e.charCodeAt(a+3)===45){let c=wm(e,"-->",a+4,"Comment is not closed.");if(i.commentPropName){let l=e.substring(a+4,c-2);n=this.saveTextToParentTag(n,r,this.readonlyMatcher),r.add(i.commentPropName,[{[i.textNodeName]:l}])}a=c}else if(u===33&&e.charCodeAt(a+2)===68){if(this.doctypefound)throw new Error("Multiple DOCTYPE declarations found.");this.doctypefound=!0;let c=s.readDocType(e,a);this.entityDecoder.addInputEntities(c.entities),a=c.i}else if(u===33&&e.charCodeAt(a+2)===91){let c=wm(e,"]]>",a,"CDATA is not closed.")-2,l=e.substring(a+9,c);n=this.saveTextToParentTag(n,r,this.readonlyMatcher);let h=this.parseTextData(l,r.tagname,this.readonlyMatcher,!0,!1,!0,!0);h==null&&(h=""),i.cdataPropName?r.add(i.cdataPropName,[{[i.textNodeName]:l}]):r.add(i.textNodeName,h),a=c+2}else{let c=uG(e,a,i.removeNSPrefix);if(!c){let D=e.substring(Math.max(0,a-50),Math.min(o,a+50));throw new Error(`readTagExp returned undefined at position ${a}. Context: "${D}"`)}let l=c.tagName,h=c.rawTagName,d=c.tagExp,f=c.attrExpPresent,g=c.closeIndex;if({tagName:l,tagExp:d}=AG(i.transformTagName,l,d,i),i.strictReservedNames&&(l===i.commentPropName||l===i.cdataPropName||l===i.textNodeName||l===i.attributesGroupName))throw new Error(`Invalid tag name: ${l}`);r&&n&&r.tagname!=="!xml"&&(n=this.saveTextToParentTag(n,r,this.readonlyMatcher,!1));let p=r;p&&i.unpairedTagsSet.has(p.tagname)&&(r=this.tagsNodeStack.pop(),this.matcher.pop());let m=!1;d.length>0&&d.lastIndexOf("/")===d.length-1&&(m=!0,l[l.length-1]==="/"?(l=l.substr(0,l.length-1),d=l):d=d.substr(0,d.length-1),f=l!==d);let I=null,C={},y;y=ngt(h),l!==t.tagname&&this.matcher.push(l,{},y),l!==d&&f&&(I=this.buildAttributesMap(d,this.matcher,l),I&&(C=rgt(I,i))),l!==t.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode());let Q=a;if(this.isCurrentNodeStopNode){let D="";if(m)a=c.closeIndex;else if(i.unpairedTagsSet.has(l))a=c.closeIndex;else{let S=this.readStopNodeData(e,h,g+1);if(!S)throw new Error(`Unexpected end of ${h}`);a=S.i,D=S.tagContent}let N=new Xs(l);I&&(N[":@"]=I),N.add(i.textNodeName,D),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(r,N,this.readonlyMatcher,Q),i.captureMetaData&&r.addEndIndex(a+1)}else{if(m){({tagName:l,tagExp:d}=AG(i.transformTagName,l,d,i));let D=new Xs(l);I&&(D[":@"]=I),this.addChild(r,D,this.readonlyMatcher,Q),i.captureMetaData&&r.addEndIndex(g+1),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else if(i.unpairedTagsSet.has(l)){let D=new Xs(l);I&&(D[":@"]=I),this.addChild(r,D,this.readonlyMatcher,Q),i.captureMetaData&&r.addEndIndex(c.closeIndex+1),this.matcher.pop(),this.isCurrentNodeStopNode=!1,a=c.closeIndex;continue}else{let D=new Xs(l);if(this.tagsNodeStack.length>i.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(r),I&&(D[":@"]=I),this.addChild(r,D,this.readonlyMatcher,Q),r=D}n="",a=g}}}else n+=e[a];return t.child};function ugt(e,t,r,n){this.options.captureMetaData||(n=void 0);let i=this.options.jPath?r.toString():r,s=this.options.updateTag(t.tagname,i,t[":@"]);s===!1||(typeof s=="string"&&(t.tagname=s),e.addChild(t,n))}function cgt(e,t,r){let n=this.options.processEntities;if(!n||!n.enabled)return e;if(n.allowedTags){let i=this.options.jPath?r.toString():r;if(!(Array.isArray(n.allowedTags)?n.allowedTags.includes(t):n.allowedTags(t,i)))return e}if(n.tagFilter){let i=this.options.jPath?r.toString():r;if(!n.tagFilter(t,i))return e}return this.entityDecoder.decode(e)}function lgt(e,t,r,n){return e&&(n===void 0&&(n=t.child.length===0),e=this.parseTextData(e,t.tagname,r,!1,t[":@"]?Object.keys(t[":@"]).length!==0:!1,n),e!==void 0&&e!==""&&t.add(this.options.textNodeName,e),e=""),e}function dgt(){return this.stopNodeExpressionsSet.size===0?!1:this.matcher.matchesAny(this.stopNodeExpressionsSet)}function hgt(e,t,r=">"){let n=0,i=e.length,s=r.charCodeAt(0),o=r.length>1?r.charCodeAt(1):-1,a="",A=t;for(let u=t;u<i;u++){let c=e.charCodeAt(u);if(n)c===n&&(n=0);else if(c===34||c===39)n=c;else if(c===s)if(o!==-1){if(e.charCodeAt(u+1)===o)return a+=e.substring(A,u),{data:a,index:u}}else return a+=e.substring(A,u),{data:a,index:u};else c===9&&!n&&(a+=e.substring(A,u)+" ",A=u+1)}}function wm(e,t,r,n){let i=e.indexOf(t,r);if(i===-1)throw new Error(n);return i+t.length-1}function fgt(e,t,r,n){let i=e.indexOf(t,r);if(i===-1)throw new Error(n);return i}function uG(e,t,r,n=">"){let i=hgt(e,t+1,n);if(!i)return;let s=i.data,o=i.index,a=s.search(/\s/),A=s,u=!0;a!==-1&&(A=s.substring(0,a),s=s.substring(a+1).trimStart());let c=A;if(r){let l=A.indexOf(":");l!==-1&&(A=A.substr(l+1),u=A!==i.data.substr(l+1))}return{tagName:A,tagExp:s,closeIndex:o,attrExpPresent:u,rawTagName:c}}function ggt(e,t,r){let n=r,i=1,s=e.length;for(;r<s;r++)if(e[r]==="<"){let o=e.charCodeAt(r+1);if(o===47){let a=fgt(e,">",r,`${t} is not closed`);if(e.substring(r+2,a).trim()===t&&(i--,i===0))return{tagContent:e.substring(n,r),i:a};r=a}else if(o===63)r=wm(e,"?>",r+1,"StopNode is not closed.");else if(o===33&&e.charCodeAt(r+2)===45&&e.charCodeAt(r+3)===45)r=wm(e,"-->",r+3,"StopNode is not closed.");else if(o===33&&e.charCodeAt(r+2)===91)r=wm(e,"]]>",r,"StopNode is not closed.")-2;else{let a=uG(e,r,!1);a&&((a&&a.tagName)===t&&a.tagExp[a.tagExp.length-1]!=="/"&&i++,r=a.closeIndex)}}}function cG(e,t,r){if(t&&typeof e=="string"){let n=e.trim();return n==="true"?!0:n==="false"?!1:Z5(e,r)}else return DBe(e)?e:""}function AG(e,t,r,n){if(e){let i=e(t);r===t&&(r=i),t=i}return t=JBe(t,n),{tagName:t,tagExp:r}}function JBe(e,t){if(vx.includes(e))throw new Error(`[SECURITY] Invalid name: "${e}" is a reserved JavaScript keyword that could cause prototype pollution`);return ab.includes(e)?t.onDangerousProperty(e):e}var lG=Xs.getMetaDataSymbol();function pgt(e,t){if(!e||typeof e!="object")return{};if(!t)return e;let r={};for(let n in e)if(n.startsWith(t)){let i=n.substring(t.length);r[i]=e[n]}else r[n]=e[n];return r}function dG(e,t,r,n){return jBe(e,t,r,n)}function jBe(e,t,r,n){let i,s={};for(let o=0;o<e.length;o++){let a=e[o],A=Egt(a);if(A!==void 0&&A!==t.textNodeName){let u=pgt(a[":@"]||{},t.attributeNamePrefix);r.push(A,u)}if(A===t.textNodeName)i===void 0?i=a[A]:i+=""+a[A];else{if(A===void 0)continue;if(a[A]){let u=jBe(a[A],t,r,n),c=Igt(u,t);if(Object.keys(u).length===0&&t.alwaysCreateTextNode&&(u[t.textNodeName]=""),a[":@"]?mgt(u,a[":@"],n,t):Object.keys(u).length===1&&u[t.textNodeName]!==void 0&&!t.alwaysCreateTextNode?u=u[t.textNodeName]:Object.keys(u).length===0&&(t.alwaysCreateTextNode?u[t.textNodeName]="":u=""),a[lG]!==void 0&&typeof u=="object"&&u!==null&&(u[lG]=a[lG]),s[A]!==void 0&&Object.prototype.hasOwnProperty.call(s,A))Array.isArray(s[A])||(s[A]=[s[A]]),s[A].push(u);else{let l=t.jPath?n.toString():n;t.isArray(A,l,c)?s[A]=[u]:s[A]=u}A!==void 0&&A!==t.textNodeName&&r.pop()}}}return typeof i=="string"?i.length>0&&(s[t.textNodeName]=i):i!==void 0&&(s[t.textNodeName]=i),s}function Egt(e){let t=Object.keys(e);for(let r=0;r<t.length;r++){let n=t[r];if(n!==":@")return n}}function mgt(e,t,r,n){if(t){let i=Object.keys(t),s=i.length;for(let o=0;o<s;o++){let a=i[o],A=a.startsWith(n.attributeNamePrefix)?a.substring(n.attributeNamePrefix.length):a,u=n.jPath?r.toString()+"."+A:r;n.isArray(a,u,!0,!0)?e[a]=[t[a]]:e[a]=t[a]}}}function Igt(e,t){let{textNodeName:r}=t,n=Object.keys(e).length;return!!(n===0||n===1&&(e[r]||typeof e[r]=="boolean"||e[r]===0))}var th=class{constructor(t){this.externalEntities={},this.options=FBe(t)}parse(t,r){if(typeof t!="string"&&t.toString)t=t.toString();else if(typeof t!="string")throw new Error("XML data is accepted in String or Bytes[] form.");if(r){r===!0&&(r={});let s=vBe(t,r);if(s!==!0)throw Error(`${s.err.msg}:${s.err.line}:${s.err.col}`)}let n=new fb(this.options,this.externalEntities),i=n.parseXml(t);return this.options.preserveOrder||i===void 0?i:dG(i,this.options,n.matcher,n.readonlyMatcher)}addEntity(t,r){if(r.indexOf("&")!==-1)throw new Error("Entity value can't have '&'");if(t.indexOf("&")!==-1||t.indexOf(";")!==-1)throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for '
'");if(r==="&")throw new Error("An entity with value '&' is not permitted");this.externalEntities[t]=r}static getMetaDataSymbol(){return Xs.getMetaDataSymbol()}};In();In();function Zs(e){if(typeof e!="string"||!e.trim())return{safe:!1,error:"URL required"};let t;try{t=new URL(e.trim())}catch{return{safe:!1,error:"Invalid URL format"}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{safe:!1,error:"Only http and https protocols are supported"};let r=t.hostname.toLowerCase();if(r==="localhost"||r==="127.0.0.1"||r==="::1"||r==="0.0.0.0"||r.endsWith(".localhost")||r.endsWith(".local")||r.endsWith(".internal"))return{safe:!1,error:"Access to loopback/local addresses is forbidden"};let n=r.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);if(n){let i=Number(n[1]),s=Number(n[2]),o=Number(n[3]),a=Number(n[4]);if([i,s,o,a].some(A=>A<0||A>255))return{safe:!1,error:"Invalid IP address format"};if(i===0||i===10||i===127||i===172&&s>=16&&s<=31||i===192&&s===168||i===169&&s===254)return{safe:!1,error:"Access to private or link-local IP addresses is forbidden"}}if(r.startsWith("[")||r.includes(":")){let i=r.replace(/^\[|\]$/g,"").toLowerCase();if(i==="::1"||i==="::"||i.startsWith("fe80:")||i.startsWith("fc00:")||i.startsWith("fd00:")||i.startsWith("::ffff:127.")||i.startsWith("::ffff:192.168.")||i.startsWith("::ffff:10.")||i.startsWith("::ffff:172.")||i.startsWith("::ffff:169.254."))return{safe:!1,error:"Access to private or link-local IPv6 addresses is forbidden"}}return{safe:!0,url:t}}function $Be(e,t,r){let n=s=>s?.split(",")[0]?.trim(),i=n(r);if(!i)return e;try{let s=new URL(e),o=n(t)||s.protocol.slice(0,-1);return new URL(`${o}://${i}`).origin}catch{return e}}function gb(e,t){if(!e)return!0;try{let r=new URL(e);if(Ae.ALLOWED_ORIGINS.includes(r.origin))return!0;if(!t)return!1;let n=new URL(t);if(r.origin===n.origin)return!0;let i=s=>["localhost","127.0.0.1","[::1]"].includes(s);return r.hostname===n.hostname&&!i(r.hostname)?!0:Ae.IS_DEV&&i(r.hostname)&&i(n.hostname)&&r.port===String(Ae.DEV_PORT)}catch{return!1}}In();import pb from"crypto";import _x from"fs";import Cgt from"path";var fG="dango_lan_auth",Bgt=720*60*60*1e3;function hG(){return Cgt.join(Pn.ROOT,"lan_sessions.json")}function gG(){try{if(!_x.existsSync(hG()))return{};let e=_x.readFileSync(hG(),"utf8"),t=JSON.parse(e),r=Date.now(),n=!1;for(let[i,s]of Object.entries(t))(typeof s!="number"||s<r)&&(delete t[i],n=!0);return n&&Eb(t),t}catch{return{}}}function Eb(e){try{_x.mkdirSync(Pn.ROOT,{recursive:!0}),_x.writeFileSync(hG(),JSON.stringify(e))}catch{}}function KBe(){return process.env.APP_PASSWORD_HASH||Pn.APP_PASSWORD_HASH||""}function rh(){return!!KBe()}function pG(e){let t=pb.randomBytes(16).toString("hex"),r=pb.scryptSync(e,t,32).toString("hex");return`scrypt:${t}:${r}`}function XBe(e){return Ox(e,KBe())}function Ox(e,t){if(!t)return!1;let r=t.split(":");if(r.length!==3||r[0]!=="scrypt")return!1;let[,n,i]=r;try{let s=pb.scryptSync(e,n,32),o=Buffer.from(i,"hex");return s.length!==o.length?!1:pb.timingSafeEqual(s,o)}catch{return!1}}async function zBe(e){let{updateEnvFile:t}=await Promise.resolve().then(()=>(Qh(),kL));if(!e){await t({APP_PASSWORD_HASH:""}),Pn.APP_PASSWORD_HASH="";return}let r=pG(e);await t({APP_PASSWORD_HASH:r}),Pn.APP_PASSWORD_HASH=r}function ZBe(){let e=pb.randomBytes(32).toString("hex"),t=Date.now()+Bgt,r=gG();return r[e]=t,Eb(r),{token:e,expiry:t}}function mb(e){if(!e)return!1;let t=gG(),r=t[e];return r?r<Date.now()?(delete t[e],Eb(t),!1):!0:!1}function eye(e){if(!e)return;let t=gG();t[e]&&(delete t[e],Eb(t))}function tye(){Eb({})}function ygt(e){return e?e.startsWith("::ffff:")?e.slice(7):e:""}function EG(e){let t=ygt(e);return t==="127.0.0.1"||t==="::1"}function Sm(e,t){if(e&&e.toLowerCase().startsWith("bearer "))return e.slice(7).trim()||null;if(t){let r=t.split(";");for(let n of r){let i=n.indexOf("=");if(i===-1)continue;if(n.slice(0,i).trim()===fG)return decodeURIComponent(n.slice(i+1).trim())||null}}return null}var rye=new Set(["/api/auth/app-status","/api/auth/app-login","/api/auth/app-logout","/api/internal/shutdown"]);function nye(e,t){let r=Math.max(1,Math.floor((t-Date.now())/1e3));return`${fG}=${encodeURIComponent(e)}; HttpOnly; Path=/; Max-Age=${r}; SameSite=Lax`}function iye(){return`${fG}=; HttpOnly; Path=/; Max-Age=0; SameSite=Lax`}var Ib=co("manga_library",{id:Ge("id").notNull(),provider:Ge("provider").notNull(),mangaId:Ge("mangaId").notNull(),title:Ge("title"),cover:Ge("cover"),status:Ge("status"),author:Ge("author"),altTitle:Ge("altTitle"),contentRating:Ge("contentRating"),lastChapterId:Ge("lastChapterId"),lastChapterNumber:Ge("lastChapterNumber"),lastPage:Mn("lastPage"),updatedAt:Mn("updatedAt"),anilistId:Mn("anilistId"),anilistIdSource:Ge("anilistIdSource")},e=>[ta({columns:[e.id]})]),MHt=co("manga_progress",{mangaId:Ge("mangaId").notNull(),chapterId:Ge("chapterId").notNull(),chapterNumber:Ge("chapterNumber"),page:Mn("page"),pageCount:Mn("pageCount"),updatedAt:Mn("updatedAt"),title:Ge("title"),cover:Ge("cover"),provider:Ge("provider"),altTitle:Ge("altTitle"),contentRating:Ge("contentRating")},e=>[ta({columns:[e.mangaId,e.chapterId]})]);var sye=["watchlist","watched_episodes","queue","shows_meta","dismissed_notifications","discovered_notifications","legacy_id_mapping","temp_show_ids"],oye=["manga_library","manga_progress"],aye=["tv_library","tv_progress"],Aye=["asmr_library","asmr_progress"];async function Px(e,t){let r={};for(let n of t)try{let i=await re(e).all(b`SELECT COUNT(*) AS rows FROM ${b.raw(`"${n}"`)}`);r[n]=i[0]?.rows??0}catch{r[n]=0}return r}async function Hx(e,t){for(let r of t)try{await re(e).run(b`DELETE FROM ${b.raw(`"${r}"`)}`)}catch{}}function Tm(e){let t=b.raw(`"${e}"`);return{getById:async(r,n)=>(await re(r).all(b`SELECT * FROM ${t} WHERE id = ${n}`))[0],getAll:(r,n,i,s)=>{let o=b`SELECT * FROM ${t}`;return n&&n!=="All"&&o.append(b` WHERE status = ${n}`),o.append(b` ORDER BY updatedAt DESC`),i!==void 0&&s!==void 0&&o.append(b` LIMIT ${i} OFFSET ${s}`),re(r).all(o)},getCount:async(r,n)=>n&&n!=="All"?(await re(r).all(b`SELECT COUNT(*) as total FROM ${t} WHERE status = ${n}`))[0]?.total||0:(await re(r).all(b`SELECT COUNT(*) as total FROM ${t}`))[0]?.total||0,getIds:async r=>(await re(r).all(b`SELECT id FROM ${t}`)).map(i=>i.id),updateStatus:(r,n,i)=>re(r).run(b`
|
|
@@ -714,7 +714,7 @@ This is a client-only function.
|
|
|
714
714
|
If you want to call this function on the server, see https://trpc.io/docs/v11/server/server-side-calls
|
|
715
715
|
`.trim();async function Cbe(e,t,r){try{let n=t.middlewares[e];return await n(it(it({},r),{},{meta:t.meta,input:r.input,next(i){var s;let o=i;return Cbe(e+1,t,it(it({},r),{},{ctx:o?.ctx?it(it({},r.ctx),o.ctx):r.ctx,input:o&&"input"in o?o.input:r.input,getRawInput:(s=o?.getRawInput)!==null&&s!==void 0?s:r.getRawInput}))}}))}catch(n){return{ok:!1,error:Go(n),marker:Ebe}}}function opt(e){async function t(r){if(!r||!("getRawInput"in r))throw new Error(spt);let n=await Cbe(0,e,r);if(!n)throw new Ye({code:"INTERNAL_SERVER_ERROR",message:"No result from middlewares - did you forget to `return next()`?"});if(!n.ok)throw n.error;return n.data}return t._def=e,t.procedure=!0,t.meta=e.meta,t}var Fm,Um,_m,pbe=typeof window>"u"||"Deno"in window||((Fm=globalThis.process)===null||Fm===void 0||(Fm=Fm.env)===null||Fm===void 0?void 0:Fm.NODE_ENV)==="test"||!!(!((Um=globalThis.process)===null||Um===void 0||(Um=Um.env)===null||Um===void 0)&&Um.JEST_WORKER_ID)||!!(!((_m=globalThis.process)===null||_m===void 0||(_m=_m.env)===null||_m===void 0)&&_m.VITEST_WORKER_ID),$G=new class jG{context(){return new jG}meta(){return new jG}create(t){var r,n,i,s,o,a;let A=it(it({},t),{},{transformer:Kye((r=t?.transformer)!==null&&r!==void 0?r:Mm),isDev:(n=t?.isDev)!==null&&n!==void 0?n:((i=globalThis.process)===null||i===void 0?void 0:i.env.NODE_ENV)!=="production",allowOutsideOfServer:(s=t?.allowOutsideOfServer)!==null&&s!==void 0?s:!1,errorFormatter:(o=t?.errorFormatter)!==null&&o!==void 0?o:Lm,isServer:(a=t?.isServer)!==null&&a!==void 0?a:pbe,$types:null});var u;if(!((u=t?.isServer)!==null&&u!==void 0?u:pbe)&&t?.allowOutsideOfServer!==!0)throw new Error("You're trying to use @trpc/server in a non-server environment. This is not supported by default.");return{_config:A,procedure:Ibe({meta:t?.defaultMeta}),middleware:Z0t(),router:xG(A),mergeRouters:Xye,createCallerFactory:vG()}}};function Le(e){return new Ye({code:"BAD_REQUEST",message:e})}function Al(e){return new Ye({code:"NOT_FOUND",message:e})}function mr(e){return new Ye({code:"INTERNAL_SERVER_ERROR",message:e})}function ul(e){return new Ye({code:"SERVICE_UNAVAILABLE",message:e})}function Bbe(e){return new Ye({code:"TOO_MANY_REQUESTS",message:e})}function ybe(e){return new Ye({code:"CONFLICT",message:e})}function bbe(e){return new Ye({code:"UNAUTHORIZED",message:e})}function NA(e){return new Ye({code:"FORBIDDEN",message:"AUTH_REQUIRED",cause:{code:"AUTH_REQUIRED",provider:e}})}function Qbe(){return new Ye({code:"UNAUTHORIZED",message:"LAN_AUTH_REQUIRED",cause:{code:"LAN_AUTH_REQUIRED"}})}li();var sv=$G.context().create({errorFormatter:({shape:e,error:t})=>({...e,data:{...e.data,cause:t.cause??null}})}),dt=sv.router,wbe=sv.mergeRouters,apt=sv.middleware(({ctx:e,next:t})=>{if(!e.lanAuthed)throw Qbe();return t({ctx:e})}),ee=sv.procedure.use(apt),Vo=ee.use(({next:e})=>{if(He.getStore()?.owner===!1)throw new Ye({code:"FORBIDDEN",message:"Owner access required"});return e()});li();In();var Sbe=new Ao({ttlSeconds:10080*60,maxKeys:5e3});function Apt(e){return e.split(" ").map((t,r)=>r!==0&&["x","and","or","the","a","an","of","in","on","with"].includes(t.toLowerCase())?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1)).join(" ").replace(/\bX\b/g,"x")}function upt(e){let t=e.trim();return t&&Apt(t)}async function Tbe(e,t,r){let n=e.map(o=>String(o).trim()).filter(Boolean),i={},s=[];for(let o of n){let a=`${t}:${r}:${o}`,A=Sbe.get(a);A?i[o]=A:s.push(o)}if(s.length>0){let o=[];for(let a=0;a<s.length;a+=15)o.push(s.slice(a,a+15));for(let a of o){let A=a.join(`
|
|
716
716
|
`),u=`https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=${encodeURIComponent(t)}&tl=${encodeURIComponent(r)}&dt=t&q=${encodeURIComponent(A)}`;try{let c=await fetch(u,{headers:{"User-Agent":"Mozilla/5.0"},signal:AbortSignal.timeout(5e3)});if(!c.ok)throw new Error(`translate ${c.status}`);let l=await Yt(c),h="";Array.isArray(l)&&typeof l[0]=="string"?h=l[0]:Array.isArray(l)&&Array.isArray(l[0])&&(h=l[0]?.map(g=>g[0]).join("")||"");let d=h.split(`
|
|
717
|
-
`);a.forEach((f,g)=>{let p=(d[g]??"").trim(),m=p?upt(p):f;i[f]=m,Sbe.set(`${t}:${r}:${f}`,m)})}catch{for(let c of a)i[c]||(i[c]=c)}await new Promise(c=>setTimeout(c,80))}}return i}function pe(e){return{"~standard":{version:1,vendor:"dango",types:void 0,validate(t){try{return{value:e(t)}}catch(r){return{issues:[{message:r instanceof Error?r.message:"Invalid input"}]}}}}}}function Nbe(e){if(typeof e!="object"||e===null)throw Le("Expected an object");let t=e.key;if(typeof t!="string"||t.length===0)throw Le("key must be a string");return t}function ut(e,t){let r=e[t];if(typeof r!="string"||r.length===0)throw Le(`${t} must be a string`);return r}function ue(e,t){let r=e[t];if(typeof r=="string")return r}function eo(e,t){let r=e[t];if(r==null||r==="")return;let n=Number(r);return Number.isFinite(n)?n:void 0}function Dbe(e,t){let r=e[t];if(typeof r=="boolean")return r}function Wo(e,t){let r=e[t];if(typeof r!="string"&&typeof r!="number"||String(r).length===0)throw Le(`${t} must be a string`);return String(r)}function cl(e,t,r){let n=e[t];if(n==null||n==="")return r;let i=Math.floor(Number(n));return Number.isFinite(i)?i:r}function RA(e,t){let r=e[t];return typeof r=="string"?r:null}function Ji(e,t=1){return Math.max(cl(e,"page",t),1)}function gs(e,t=24,r=100,n="limit"){return Math.min(Math.max(cl(e,n,t),1),r)}function Ug(e){let t=Array.isArray(e)?e:KG(Ce(e),"ids",!0);if(t.length===0)throw Le("ids must be a non-empty array");return[...new Set(t.map(r=>String(r)))]}function KG(e,t,r){let n=e[t];if(!Array.isArray(n)||r&&n.length===0)throw Le(`${t} must be ${r?"a non-empty ":"an "}array`);return n.map(i=>String(i))}function Ce(e){if(typeof e!="object"||e===null)throw Le("Expected an object");return e}var Rbe=()=>pe(e=>({key:Nbe(e)})),xbe=()=>pe(e=>({id:ut(Ce(e),"id")})),ah=e=>pe(t=>({[e]:ut(Ce(t),e)})),Ah=()=>pe(e=>({showId:ut(Ce(e),"showId")})),XG=()=>pe(e=>{let t=Ce(e);return{showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")}}),ov=()=>pe(e=>({ids:Ug(e)})),vbe=()=>pe(e=>{let t=Ce(e),r={id:ut(t,"id"),name:ut(t,"name")},n=ue(t,"status");n!==void 0&&(r.status=n);let i=ue(t,"thumbnail");i!==void 0&&(r.thumbnail=i);let s=ue(t,"nativeName");s!==void 0&&(r.nativeName=s);let o=ue(t,"englishName");o!==void 0&&(r.englishName=o);let a=ue(t,"type");return a!==void 0&&(r.type=a),typeof t.isAdult=="boolean"&&(r.isAdult=t.isAdult),r}),kbe=()=>pe(e=>{let t=Ce(e);return{id:ut(t,"id"),status:ut(t,"status")}}),Lbe=()=>pe(e=>{let t=Ce(e);return{ids:Ug(t),status:ut(t,"status")}});function Mbe(e){return{showName:ue(e,"showName"),showThumbnail:ue(e,"showThumbnail"),nativeName:ue(e,"nativeName"),englishName:ue(e,"englishName"),type:ue(e,"type")}}var Fbe=()=>pe(e=>{let t=Ce(e);return{...Mbe(t),showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")}}),Ube=()=>pe(e=>{let t=Ce(e);return{...Mbe(t),showId:ut(t,"showId"),episodeNumbers:KG(t,"episodeNumbers",!0)}}),_be=()=>pe(e=>{let t=Ce(e);return{showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")}}),Obe=()=>pe(e=>{let t=Ce(e),r={showId:ut(t,"showId")};return t.episodeNumbers!==void 0&&(r.episodeNumbers=KG(t,"episodeNumbers",!1)),r}),Pbe=()=>pe(e=>{if(!Array.isArray(e))throw Le("items must be an array");return e.map(t=>{let r=Ce(t),n={};return typeof r.id=="number"&&(n.id=r.id),r.showId!==void 0&&(n.showId=String(r.showId)),r.episodeNumber!==void 0&&(n.episodeNumber=String(r.episodeNumber)),n})}),Hbe=()=>pe(e=>{if(typeof e!="object"||e===null)throw Le("Expected an object");return{key:Nbe(e),value:e.value}}),Gbe=()=>pe(e=>{let t=Ce(e),r={showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")},n=eo(t,"currentTime");n!==void 0&&(r.currentTime=n);let i=eo(t,"duration");i!==void 0&&(r.duration=i);let s=ue(t,"showName");s!==void 0&&(r.showName=s);let o=ue(t,"showThumbnail");o!==void 0&&(r.showThumbnail=o);let a=ue(t,"nativeName");a!==void 0&&(r.nativeName=a);let A=ue(t,"englishName");A!==void 0&&(r.englishName=A);let u=t.genres;(typeof u=="string"||Array.isArray(u))&&(r.genres=(Array.isArray(u)?u:[u]).map(String));let c=eo(t,"popularityScore");c!==void 0&&(r.popularityScore=c);let l=ue(t,"type");l!==void 0&&(r.type=l);let h=ue(t,"status");h!==void 0&&(r.status=h);let d=eo(t,"episodeCount");d!==void 0&&(r.episodeCount=d);let f=Dbe(t,"isPlaying");f!==void 0&&(r.isPlaying=f);let g=ue(t,"sessionId");g!==void 0&&(r.sessionId=g);let p=Dbe(t,"isAdult");return p!==void 0&&(r.isAdult=p),r}),Ybe=()=>pe(e=>{let t=Ce(e);return{showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")}});var cpt={discordRPCEnabled:"true",discordRPCHideMature:"true",ignoreAdultContent:"true",mangaIgnoreAdultContent:"true",tvIgnoreAdultContent:"true",asmrIgnoreAdultContent:"true",frozenMode:"false"},lpt=()=>pe(e=>{let t=Ce(e);if(typeof t.enabled!="boolean")throw Le("enabled must be a boolean");return{enabled:t.enabled}}),dpt=()=>pe(e=>{if(e==null)return{};let t=Ce(e);return{texts:t.texts,source:t.source,target:t.target}}),Vbe=dt({frozenStatus:ee.query(()=>({frozen:tn()})),watchAlong:ee.query(()=>({workerUrl:Ae.WATCH_ALONG_WORKER_URL})),getByKey:ee.input(Rbe()).query(async({ctx:e,input:t})=>{if(RL(t.key))throw new Ye({code:"FORBIDDEN",message:"Tracker credentials are private."});let r=await fe.getByKey(e.db,t.key);return{value:r?r.value:cpt[t.key]??null}}),set:ee.input(Hbe()).mutation(async({ctx:e,input:t})=>{let r=t.key;if(r===$L){let s=t.value==="true"||t.value===!0;return await Fe(e.db,async o=>{await fe.upsert(o,r,String(s))},void 0,{allowWhenFrozen:!0}),KL(s),{success:!0}}if(tn())return{success:!0,frozen:!0};if(r.startsWith("discord")&&He.getStore()?.owner===!1)throw new Ye({code:"FORBIDDEN",message:"Owner access required"});if(RL(r))throw new Ye({code:"FORBIDDEN",message:"Use the tracker account settings to manage credentials."});let n=String(t.value??""),i=n===""&&r==="tracker_anilist_client_id";return await Fe(e.db,async s=>{i?await fe.deleteByKey(s,r):await fe.upsert(s,r,n)}),r==="discordRPCEnabled"&&e.discordRPC.setEnabled(t.value==="true"||t.value===!0),r==="discordRPCHideMature"&&e.discordRPC.setHideMature(t.value==="true"||t.value===!0),{success:!0}}),offlineDbInfo:ee.query(async({ctx:e})=>await e.offlineDb.getOfflineDbInfo(e.db)),setOfflineDbAutoUpdate:Vo.input(lpt()).mutation(async({ctx:e,input:t})=>(await fe.upsert(e.db,"offlineDbAutoUpdateEnabled",String(t.enabled)),{success:!0,enabled:t.enabled})),triggerOfflineDbUpdate:Vo.mutation(async({ctx:e})=>{if((await e.offlineDb.getOfflineDbInfo(e.db)).isRefreshing)throw ybe("Offline database refresh already in progress");return e.offlineDb.refreshDatabase(e.db).catch(r=>{O.warn({err:r?.message},"Manual offline database update failed")}),{message:"Offline database refresh started"}}),translate:ee.input(dpt()).mutation(async({input:e})=>{let t=e.texts,r=e.source??"ja",n=e.target??"en";return!Array.isArray(t)||t.length===0?{translations:{}}:{translations:await Tbe(t,String(r),String(n))}}),malImportCancel:ee.mutation(()=>$x())});var ps={getAll:e=>re(e).all(b`
|
|
717
|
+
`);a.forEach((f,g)=>{let p=(d[g]??"").trim(),m=p?upt(p):f;i[f]=m,Sbe.set(`${t}:${r}:${f}`,m)})}catch{for(let c of a)i[c]||(i[c]=c)}await new Promise(c=>setTimeout(c,80))}}return i}function pe(e){return{"~standard":{version:1,vendor:"dango",types:void 0,validate(t){try{return{value:e(t)}}catch(r){return{issues:[{message:r instanceof Error?r.message:"Invalid input"}]}}}}}}function Nbe(e){if(typeof e!="object"||e===null)throw Le("Expected an object");let t=e.key;if(typeof t!="string"||t.length===0)throw Le("key must be a string");return t}function ut(e,t){let r=e[t];if(typeof r!="string"||r.length===0)throw Le(`${t} must be a string`);return r}function ue(e,t){let r=e[t];if(typeof r=="string")return r}function eo(e,t){let r=e[t];if(r==null||r==="")return;let n=Number(r);return Number.isFinite(n)?n:void 0}function Dbe(e,t){let r=e[t];if(typeof r=="boolean")return r}function Wo(e,t){let r=e[t];if(typeof r!="string"&&typeof r!="number"||String(r).length===0)throw Le(`${t} must be a string`);return String(r)}function cl(e,t,r){let n=e[t];if(n==null||n==="")return r;let i=Math.floor(Number(n));return Number.isFinite(i)?i:r}function RA(e,t){let r=e[t];return typeof r=="string"?r:null}function Ji(e,t=1){return Math.max(cl(e,"page",t),1)}function gs(e,t=24,r=100,n="limit"){return Math.min(Math.max(cl(e,n,t),1),r)}function Ug(e){let t=Array.isArray(e)?e:KG(Ce(e),"ids",!0);if(t.length===0)throw Le("ids must be a non-empty array");return[...new Set(t.map(r=>String(r)))]}function KG(e,t,r){let n=e[t];if(!Array.isArray(n)||r&&n.length===0)throw Le(`${t} must be ${r?"a non-empty ":"an "}array`);return n.map(i=>String(i))}function Ce(e){if(typeof e!="object"||e===null)throw Le("Expected an object");return e}var Rbe=()=>pe(e=>({key:Nbe(e)})),xbe=()=>pe(e=>({id:ut(Ce(e),"id")})),ah=e=>pe(t=>({[e]:ut(Ce(t),e)})),Ah=()=>pe(e=>({showId:ut(Ce(e),"showId")})),XG=()=>pe(e=>{let t=Ce(e);return{showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")}}),ov=()=>pe(e=>({ids:Ug(e)})),vbe=()=>pe(e=>{let t=Ce(e),r={id:ut(t,"id"),name:ut(t,"name")},n=ue(t,"status");n!==void 0&&(r.status=n);let i=ue(t,"thumbnail");i!==void 0&&(r.thumbnail=i);let s=ue(t,"nativeName");s!==void 0&&(r.nativeName=s);let o=ue(t,"englishName");o!==void 0&&(r.englishName=o);let a=ue(t,"type");return a!==void 0&&(r.type=a),typeof t.isAdult=="boolean"&&(r.isAdult=t.isAdult),r}),kbe=()=>pe(e=>{let t=Ce(e);return{id:ut(t,"id"),status:ut(t,"status")}}),Lbe=()=>pe(e=>{let t=Ce(e);return{ids:Ug(t),status:ut(t,"status")}});function Mbe(e){return{showName:ue(e,"showName"),showThumbnail:ue(e,"showThumbnail"),nativeName:ue(e,"nativeName"),englishName:ue(e,"englishName"),type:ue(e,"type")}}var Fbe=()=>pe(e=>{let t=Ce(e);return{...Mbe(t),showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")}}),Ube=()=>pe(e=>{let t=Ce(e);return{...Mbe(t),showId:ut(t,"showId"),episodeNumbers:KG(t,"episodeNumbers",!0)}}),_be=()=>pe(e=>{let t=Ce(e);return{showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")}}),Obe=()=>pe(e=>{let t=Ce(e),r={showId:ut(t,"showId")};return t.episodeNumbers!==void 0&&(r.episodeNumbers=KG(t,"episodeNumbers",!1)),r}),Pbe=()=>pe(e=>{if(!Array.isArray(e))throw Le("items must be an array");return e.map(t=>{let r=Ce(t),n={};return typeof r.id=="number"&&(n.id=r.id),r.showId!==void 0&&(n.showId=String(r.showId)),r.episodeNumber!==void 0&&(n.episodeNumber=String(r.episodeNumber)),n})}),Hbe=()=>pe(e=>{if(typeof e!="object"||e===null)throw Le("Expected an object");return{key:Nbe(e),value:e.value}}),Gbe=()=>pe(e=>{let t=Ce(e),r={showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")},n=eo(t,"currentTime");n!==void 0&&(r.currentTime=n);let i=eo(t,"duration");i!==void 0&&(r.duration=i);let s=ue(t,"showName");s!==void 0&&(r.showName=s);let o=ue(t,"showThumbnail");o!==void 0&&(r.showThumbnail=o);let a=ue(t,"nativeName");a!==void 0&&(r.nativeName=a);let A=ue(t,"englishName");A!==void 0&&(r.englishName=A);let u=t.genres;(typeof u=="string"||Array.isArray(u))&&(r.genres=(Array.isArray(u)?u:[u]).map(String));let c=eo(t,"popularityScore");c!==void 0&&(r.popularityScore=c);let l=ue(t,"type");l!==void 0&&(r.type=l);let h=ue(t,"status");h!==void 0&&(r.status=h);let d=eo(t,"episodeCount");d!==void 0&&(r.episodeCount=d);let f=Dbe(t,"isPlaying");f!==void 0&&(r.isPlaying=f);let g=ue(t,"sessionId");g!==void 0&&(r.sessionId=g);let p=Dbe(t,"isAdult");return p!==void 0&&(r.isAdult=p),r}),Ybe=()=>pe(e=>{let t=Ce(e);return{showId:ut(t,"showId"),episodeNumber:Wo(t,"episodeNumber")}});var cpt={discordRPCEnabled:"true",discordRPCHideMature:"true",dangoGaze:"true",ignoreAdultContent:"true",mangaIgnoreAdultContent:"true",tvIgnoreAdultContent:"true",asmrIgnoreAdultContent:"true",frozenMode:"false"},lpt=()=>pe(e=>{let t=Ce(e);if(typeof t.enabled!="boolean")throw Le("enabled must be a boolean");return{enabled:t.enabled}}),dpt=()=>pe(e=>{if(e==null)return{};let t=Ce(e);return{texts:t.texts,source:t.source,target:t.target}}),Vbe=dt({frozenStatus:ee.query(()=>({frozen:tn()})),watchAlong:ee.query(()=>({workerUrl:Ae.WATCH_ALONG_WORKER_URL})),getByKey:ee.input(Rbe()).query(async({ctx:e,input:t})=>{if(RL(t.key))throw new Ye({code:"FORBIDDEN",message:"Tracker credentials are private."});let r=await fe.getByKey(e.db,t.key);return{value:r?r.value:cpt[t.key]??null}}),set:ee.input(Hbe()).mutation(async({ctx:e,input:t})=>{let r=t.key;if(r===$L){let s=t.value==="true"||t.value===!0;return await Fe(e.db,async o=>{await fe.upsert(o,r,String(s))},void 0,{allowWhenFrozen:!0}),KL(s),{success:!0}}if(tn())return{success:!0,frozen:!0};if(r.startsWith("discord")&&He.getStore()?.owner===!1)throw new Ye({code:"FORBIDDEN",message:"Owner access required"});if(RL(r))throw new Ye({code:"FORBIDDEN",message:"Use the tracker account settings to manage credentials."});let n=String(t.value??""),i=n===""&&r==="tracker_anilist_client_id";return await Fe(e.db,async s=>{i?await fe.deleteByKey(s,r):await fe.upsert(s,r,n)}),r==="discordRPCEnabled"&&e.discordRPC.setEnabled(t.value==="true"||t.value===!0),r==="discordRPCHideMature"&&e.discordRPC.setHideMature(t.value==="true"||t.value===!0),{success:!0}}),offlineDbInfo:ee.query(async({ctx:e})=>await e.offlineDb.getOfflineDbInfo(e.db)),setOfflineDbAutoUpdate:Vo.input(lpt()).mutation(async({ctx:e,input:t})=>(await fe.upsert(e.db,"offlineDbAutoUpdateEnabled",String(t.enabled)),{success:!0,enabled:t.enabled})),triggerOfflineDbUpdate:Vo.mutation(async({ctx:e})=>{if((await e.offlineDb.getOfflineDbInfo(e.db)).isRefreshing)throw ybe("Offline database refresh already in progress");return e.offlineDb.refreshDatabase(e.db).catch(r=>{O.warn({err:r?.message},"Manual offline database update failed")}),{message:"Offline database refresh started"}}),translate:ee.input(dpt()).mutation(async({input:e})=>{let t=e.texts,r=e.source??"ja",n=e.target??"en";return!Array.isArray(t)||t.length===0?{translations:{}}:{translations:await Tbe(t,String(r),String(n))}}),malImportCancel:ee.mutation(()=>$x())});var ps={getAll:e=>re(e).all(b`
|
|
718
718
|
SELECT
|
|
719
719
|
q.id,
|
|
720
720
|
q.showId,
|
package/server/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._section-header_x6wvn_1{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:var(--space-8);gap:var(--space-4)}._sectionWrapper_x6wvn_9{margin-bottom:2.5rem}@media(max-width:768px){._sectionWrapper_x6wvn_9{margin-bottom:1.25rem}}._sectionTitleNoMargin_x6wvn_19{margin-bottom:0}._title-wrapper_x6wvn_23{display:flex;align-items:center;gap:var(--space-6);flex:1}._header-controls_x6wvn_30{display:flex;align-items:center;gap:var(--space-2);margin-left:auto}._header-select_x6wvn_37{width:auto;min-width:120px;height:40px;padding:0 10px;padding-right:2rem;background-color:var(--bg-tertiary);border:1px solid var(--border-primary);border-radius:var(--radius-md);color:var(--control-text);font-size:var(--font-size-sm);font-weight:700;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23a1a1aa' stroke-width='2' viewBox='0 0 12 12'%3E%3Cpolyline points='3 5 6 8 9 5'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center;transition:all var(--transition-base)}._header-select_x6wvn_37:hover{border-color:var(--control-border-hover);background-color:var(--bg-elevated)}._header-select_x6wvn_37:focus{outline:none;border-color:var(--accent)}._view-all-link_x6wvn_68{font-size:.85rem;font-weight:700;color:var(--text-secondary);text-decoration:none;white-space:nowrap;padding:8px 12px;border-radius:var(--radius-md);border:1px solid transparent;transition:all var(--transition-base)}._view-all-link_x6wvn_68:hover{color:var(--accent-light);background:var(--accent-subtle);border-color:var(--border-primary)}._collapse-button_x6wvn_86{width:40px;height:40px;border:1px solid var(--border-primary);background:var(--bg-tertiary);color:var(--control-text);border-radius:var(--radius-md);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:all var(--transition-base)}._collapse-button_x6wvn_86:hover{background:var(--bg-elevated);border-color:var(--border-primary);color:var(--control-text)}._title-link_x6wvn_106{color:inherit;text-decoration:none;display:inline-flex;align-items:center;transition:all var(--transition-base)}._title-link_x6wvn_106 .section-title{position:relative;font-size:1.5rem;font-weight:800;letter-spacing:-.01em}._title-link_x6wvn_106:hover,._continue-watching_x6wvn_125 ._title-link_x6wvn_106:hover .section-title{color:var(--accent)}@media(max-width:600px){._section-header_x6wvn_1{flex-direction:column;align-items:flex-start;gap:var(--space-4);margin-bottom:var(--space-6)}._title-wrapper_x6wvn_23{width:100%;justify-content:space-between}._title-link_x6wvn_106 .section-title{font-size:1.25rem}}._nav-arrows_x6wvn_147{display:flex;height:40px;gap:6px}._nav-button_x6wvn_153{background:var(--bg-tertiary);border:1px solid var(--border-primary);color:var(--control-text);width:40px;height:40px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color var(--transition-base),color var(--transition-base)}._nav-button_x6wvn_153:hover{background:var(--bg-elevated);border-color:var(--border-primary);color:var(--control-text)}._nav-button_x6wvn_153:active{background:var(--bg-elevated)}._nav-button_x6wvn_153:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}@media(hover:none),(pointer:coarse){._nav-arrows_x6wvn_147{height:36px}._nav-button_x6wvn_153{width:36px;height:36px}}._carousel-container_x6wvn_195{position:relative;width:100%}._carousel_x6wvn_195{overflow:hidden}._carousel-inner_x6wvn_204{display:flex;gap:20px;align-items:flex-start}._carousel-card_x6wvn_210{flex:0 0 calc((100% - (6 * 20px)) / 7);min-width:150px}@media(max-width:1400px){._carousel-card_x6wvn_210{flex:0 0 calc((100% - (5 * 20px)) / 6)}}@media(max-width:1200px){._carousel-card_x6wvn_210{flex:0 0 calc((100% - 80px)/5)}}@media(max-width:900px){._carousel-card_x6wvn_210{flex:0 0 calc((100% - 80px)/5);min-width:0}}@media(max-width:768px){._carousel-inner_x6wvn_204{gap:15px}._carousel-card_x6wvn_210{flex:0 0 calc((100% - (2 * 15px)) / 3);min-width:0}}@media(max-width:480px){._carousel-card_x6wvn_210{flex:0 0 calc((100% - (2 * 10px)) / 3);min-width:0}}._wrapper_j52nn_1{position:relative;display:inline-flex}._arrow_j52nn_6{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);color:var(--control-text);pointer-events:none}._select_j52nn_15{height:38px;padding:0 10px;padding-right:1.75rem;background-color:var(--bg-tertiary);border:1px solid var(--border-primary);border-radius:var(--radius-md);color:var(--control-text);font-size:.85rem;font-weight:700;cursor:pointer;appearance:none;-webkit-appearance:none;transition:all var(--transition-fast)}._select_j52nn_15:hover{background-color:var(--bg-elevated);border-color:#ffffff40}._wrapper_j52nn_1:hover ._arrow_j52nn_6{color:var(--text-primary)}._select_j52nn_15:focus-visible{outline:none;border-color:#ffffff59}._sectionWrapper_b6zf8_2{margin-bottom:2.5rem}@media(max-width:768px){._sectionWrapper_b6zf8_2{margin-bottom:1.25rem}}._sectionTitleNoMargin_b6zf8_12{margin-bottom:0;white-space:nowrap}._section-header_b6zf8_17{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:var(--space-8);gap:var(--space-4)}._title-wrapper_b6zf8_25{display:flex;align-items:center;gap:var(--space-6);flex:1}@media(max-width:600px){._section-header_b6zf8_17{flex-direction:column;align-items:flex-start;gap:var(--space-4);margin-bottom:var(--space-6)}._title-wrapper_b6zf8_25{width:100%;justify-content:space-between}._header-actions_b6zf8_45{width:100%}}._nav-arrows_b6zf8_51{display:flex;height:40px;gap:6px}._nav-button_b6zf8_57{background:var(--bg-tertiary);border:1px solid var(--border-primary);color:var(--control-text);width:40px;height:40px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color var(--transition-base),color var(--transition-base)}._nav-button_b6zf8_57:hover{background:var(--bg-elevated);border-color:var(--border-primary);color:var(--control-text)}._nav-button_b6zf8_57:active{background:var(--bg-elevated)}._nav-button_b6zf8_57:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}@media(hover:none),(pointer:coarse){._nav-arrows_b6zf8_51{height:36px}._nav-button_b6zf8_57{width:36px;height:36px}}._carouselContainer_b6zf8_100{position:relative;width:100%}._carousel_b6zf8_100{overflow:hidden;padding:10px 0;margin:-10px 0}._carouselInner_b6zf8_111{display:flex;gap:15px;align-items:flex-start}._carouselItem_b6zf8_117{flex:0 0 calc((100% - (6 * 15px)) / 7);min-width:120px;position:relative}@media(max-width:1200px){._carouselItem_b6zf8_117{flex:0 0 calc((100% - (5 * 15px)) / 6)}}@media(max-width:1024px){._carouselItem_b6zf8_117{flex:0 0 calc((100% - 60px)/5)}}@media(max-width:768px){._carouselItem_b6zf8_117{flex:0 0 calc((100% - (2 * 15px)) / 3)}}@media(max-width:480px){._carouselItem_b6zf8_117{flex:0 0 calc((100% - (2 * 10px)) / 3);min-width:100px}._carouselInner_b6zf8_111{gap:10px;align-items:flex-start}}._rankCard_b6zf8_154{width:100%}._rankPill_b6zf8_158{text-align:center;margin-top:4px;font-size:1.6rem;font-weight:900;line-height:1;letter-spacing:-.04em;color:var(--text-tertiary);font-variant-numeric:tabular-nums}._rankPill_b6zf8_158._rankGold_b6zf8_169{color:var(--palette-gold)}._rankPill_b6zf8_158._rankSilver_b6zf8_173{color:var(--palette-silver)}._rankPill_b6zf8_158._rankBronze_b6zf8_177{color:var(--palette-bronze)}@media(max-width:768px){._rankPill_b6zf8_158{font-size:1.3rem}}._skeletonPoster_b6zf8_188,._skeletonText_b6zf8_189{position:relative;overflow:hidden;background-color:var(--bg-tertiary);border-radius:var(--radius-sm)}._skeletonPoster_b6zf8_188:after,._skeletonText_b6zf8_189:after{content:"";position:absolute;inset:0;transform:translate(-100%);background-image:linear-gradient(90deg,#fff0 0,#ffffff0d 20%,#ffffff1f 60%,#fff0);animation:_skeleton-wave_b6zf8_1 1.8s infinite ease-in-out}._skeletonPoster_b6zf8_188{width:100%;aspect-ratio:3 / 4}._skeletonText_b6zf8_189{width:80%;height:12px;margin-top:var(--space-2)}._header-actions_b6zf8_45{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-2);flex-shrink:0}._scheduleSection_ngtwy_1{margin-bottom:2.5rem}._sectionTitleRow_ngtwy_5{display:flex;align-items:center;gap:1rem}._sectionTitleNoMargin_ngtwy_11{margin-bottom:0}._sectionHeader_ngtwy_15{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-6);gap:var(--space-4);flex-wrap:wrap;row-gap:var(--space-3)}._headerActions_ngtwy_25{display:flex;align-items:center;gap:var(--space-3);margin-left:auto}._daySelectorContainer_ngtwy_33{margin-bottom:var(--space-8);width:100%;position:relative}._daySelector_ngtwy_33{display:flex;overflow-x:auto;padding:var(--space-2) var(--space-8);scrollbar-width:none;-webkit-overflow-scrolling:touch;width:100%;scroll-behavior:smooth;overscroll-behavior-x:contain}._daySelectorInner_ngtwy_50{display:flex;gap:var(--space-2);justify-content:flex-start;margin:0 auto}._daySelector_ngtwy_33::-webkit-scrollbar{display:none}._dayBtn_ngtwy_61{background:#ffffff08;border:1px solid var(--border-primary);color:var(--text-secondary);padding:var(--space-2) var(--space-4);border-radius:var(--radius-lg);cursor:pointer;transition:all var(--transition-base);min-width:70px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;flex-shrink:0}._dayBtn_ngtwy_61:hover{background:var(--bg-hover);border-color:var(--border-secondary);transform:translateY(-2px)}._dayBtn_ngtwy_61._active_ngtwy_84{background:var(--accent);border-color:var(--accent);color:var(--accent-text);box-shadow:0 8px 20px var(--accent-glow);transform:translateY(-4px)}._dayMonth_ngtwy_92{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;opacity:.8}._dayNum_ngtwy_100{font-size:1.25rem;font-weight:800;line-height:1}._dayName_ngtwy_106{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.02em}._dayBtn_ngtwy_61._active_ngtwy_84 ._dayMonth_ngtwy_92,._dayBtn_ngtwy_61._active_ngtwy_84 ._dayName_ngtwy_106{opacity:1}._navArrows_ngtwy_119{display:flex;height:40px;gap:6px}._navButton_ngtwy_125{background:var(--bg-tertiary);border:1px solid var(--border-primary);color:var(--control-text);width:40px;height:40px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color var(--transition-base),color var(--transition-base)}._navButton_ngtwy_125:hover{background:var(--bg-elevated);border-color:var(--border-primary);color:var(--control-text)}._navButton_ngtwy_125:active{background:var(--bg-elevated)}._navButton_ngtwy_125:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}@media(hover:none),(pointer:coarse){._navArrows_ngtwy_119{height:36px}._navButton_ngtwy_125{width:36px;height:36px}}._carouselContainer_ngtwy_168{position:relative;width:100%;min-height:280px}._carousel_ngtwy_168{overflow:hidden;padding-bottom:10px;min-height:260px}._carouselInner_ngtwy_180{display:flex;gap:15px;align-items:flex-start}._carouselCard_ngtwy_186{flex:0 0 calc((100% - (6 * 15px)) / 7);min-width:150px}@media(max-width:1200px){._carouselCard_ngtwy_186{flex:0 0 calc((100% - (5 * 15px)) / 6)}}@media(max-width:1024px){._carouselCard_ngtwy_186{flex:0 0 calc((100% - 60px)/5)}}@media(max-width:768px){._carouselCard_ngtwy_186{flex:0 0 calc((100% - (2 * 15px)) / 3);min-width:0}._daySelector_ngtwy_33{justify-content:flex-start;padding-left:var(--space-4);padding-right:var(--space-4)}._dayBtn_ngtwy_61{min-width:60px;padding:var(--space-2) var(--space-3)}}@media(max-width:480px){._carouselCard_ngtwy_186{flex:0 0 calc((100% - (2 * 10px)) / 3);min-width:0}._carouselInner_ngtwy_180{gap:10px;align-items:flex-start}}@media(max-width:600px){._daySelector_ngtwy_33{display:flex;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;gap:0;padding:var(--space-1) var(--space-4);scroll-behavior:smooth;overscroll-behavior-x:contain}._daySelectorInner_ngtwy_50{gap:0;margin:0;justify-content:flex-start}._dayBtn_ngtwy_61{flex:0 0 14.2857%;min-width:0!important;padding:var(--space-1) 0!important;border-radius:var(--radius-md)!important}._dayMonth_ngtwy_92{font-size:10px!important}._dayNum_ngtwy_100{font-size:1rem!important}._dayName_ngtwy_106{font-size:10px!important}._dayBtn_ngtwy_61._active_ngtwy_84{transform:translateY(-2px)!important}}._bannerContainer_lye2m_1{width:100vw;max-width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;margin-top:calc(-1 * var(--header-height));margin-bottom:2.5rem;overflow:hidden;background-color:var(--bg-main);z-index:2}@media(max-width:1024px){._bannerContainer_lye2m_1{margin-top:calc(-1 * (var(--header-height) + 52px))}}@media(max-width:848px){._bannerContainer_lye2m_1{margin-top:-116px}}._hero_lye2m_28{position:relative;width:100%;height:clamp(480px,72svh,660px);overflow:hidden;background-color:var(--bg-main)}._ambient_lye2m_37{position:absolute;inset:-60px;width:calc(100% + 120px);height:calc(100% + 120px);object-fit:cover;object-position:center 22%;filter:grayscale(1) brightness(.4) contrast(1.2);opacity:0;transition:opacity .6s ease}._ambientShow_lye2m_49{opacity:1}._scrim_lye2m_53{position:absolute;inset:0;z-index:1;background:linear-gradient(90deg,rgba(15,15,19,.9) 0%,rgba(15,15,19,.4) 40%,transparent 100%),radial-gradient(circle,rgba(255,255,255,.06) 1px,transparent 1px) 0 0 / 6px 6px,#0f0f13b3}._progressLine_lye2m_64{position:absolute;left:0;right:0;bottom:0;height:2px;z-index:6;background:#ffffff1a;overflow:hidden}._progressLine_lye2m_64:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,var(--accent),var(--accent-light));transform-origin:left;animation:_progressFill_lye2m_1 8s linear forwards}._paused_lye2m_84 ._progressLine_lye2m_64:after{animation-play-state:paused}@keyframes _progressFill_lye2m_1{0%{transform:scaleX(0)}to{transform:scaleX(1)}}._dots_lye2m_98{position:absolute;left:50%;transform:translate(-50%);bottom:.6rem;z-index:5;display:flex;align-items:center;gap:.5rem;padding:10px 16px}._dot_lye2m_98{width:10px;height:10px;padding:0;border-radius:var(--radius-full);border:none;background:#ffffff4d;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1)}._dot_lye2m_98:not(._dotActive_lye2m_121):hover{background:#ffffffa6}._dotActive_lye2m_121{width:32px;background:var(--accent);box-shadow:0 0 10px var(--accent-glow)}._viewport_lye2m_132{position:absolute;inset:0;z-index:2;overflow:hidden}._track_lye2m_139{display:flex;height:100%;transition:transform .45s cubic-bezier(.22,1,.36,1)}._slide_lye2m_145{flex:0 0 100%;height:100%;display:flex;align-items:center;justify-content:center}._slideInner_lye2m_153{width:100%;max-width:var(--max-width);margin:0 auto;padding:4rem var(--space-8) 3.5rem;display:flex;align-items:center;gap:3rem}._poster_lye2m_163{width:clamp(110px,18vw,230px);height:auto;aspect-ratio:2 / 3;object-fit:cover;border-radius:var(--radius-lg);flex-shrink:0;border:1px solid rgba(255,255,255,.14);box-shadow:0 30px 80px #0009}._posterLandscape_lye2m_174{width:min(400px,38vw);aspect-ratio:16 / 9;height:auto;object-fit:cover;border-radius:var(--radius-lg);flex-shrink:0;border:1px solid rgba(255,255,255,.14);box-shadow:0 30px 80px #0009}@media(max-width:1024px){._posterLandscape_lye2m_174{width:min(320px,36vw)}}@media(max-width:768px)and (pointer:coarse){._posterLandscape_lye2m_174{width:100%;max-width:420px}}._info_lye2m_198{min-width:0;max-width:620px;display:flex;flex-direction:column;justify-content:space-between;height:100%}._kicker_lye2m_207{display:flex;align-items:center;gap:.75rem;margin-bottom:.9rem}._featureLabel_lye2m_214{padding:.3rem .75rem;background:var(--accent-subtle);border:1px solid var(--border-accent);color:var(--accent-light);font-size:.75rem;font-weight:700;text-transform:uppercase;border-radius:var(--radius-full);letter-spacing:.08em}._scoreChip_lye2m_226{display:inline-flex;align-items:center;gap:.35rem;padding:.3rem .7rem;background:#00000073;border:1px solid var(--border-strong);border-radius:var(--radius-full);color:var(--accent-lighter);font-size:.8rem;font-weight:700;font-variant-numeric:tabular-nums;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}._slide_lye2m_145 ._rise_lye2m_244{opacity:1}._slide_lye2m_145._active_lye2m_248 ._rise_lye2m_244{animation:_riseIn_lye2m_1 .45s cubic-bezier(.22,1,.36,1) both}._slide_lye2m_145._active_lye2m_248 ._rise_lye2m_244:nth-child(1){animation-delay:.03s}._slide_lye2m_145._active_lye2m_248 ._rise_lye2m_244:nth-child(2){animation-delay:.07s}._slide_lye2m_145._active_lye2m_248 ._rise_lye2m_244:nth-child(3){animation-delay:.11s}._slide_lye2m_145._active_lye2m_248 ._rise_lye2m_244:nth-child(4){animation-delay:.15s}._slide_lye2m_145._active_lye2m_248 ._rise_lye2m_244:nth-child(5){animation-delay:.19s}._slide_lye2m_145._active_lye2m_248 ._rise_lye2m_244:nth-child(6){animation-delay:.23s}@keyframes _riseIn_lye2m_1{0%{opacity:0;transform:translateY(26px)}to{opacity:1;transform:none}}._slide_lye2m_145._active_lye2m_248 ._poster_lye2m_163{animation:_posterIn_lye2m_1 .5s cubic-bezier(.22,1,.36,1)}@keyframes _posterIn_lye2m_1{0%{opacity:0;transform:translate(-30px) scale(.97)}to{opacity:1;transform:none}}._metaRow_lye2m_304{display:flex;align-items:center;flex-wrap:wrap;gap:.75rem;color:#ffffffb3;font-size:.9rem;font-weight:600;margin-bottom:.8rem}._metaItem_lye2m_315{display:flex;align-items:center;gap:4px}._metaDivider_lye2m_321{width:4px;height:4px;background:#ffffff4d;border-radius:50%}._title_lye2m_328{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:clamp(1.6rem,4.6vw,3rem);line-height:1.04;cursor:pointer;max-width:800px;margin-bottom:.9rem;text-shadow:0 2px 26px rgba(0,0,0,.75),0 1px 3px rgba(0,0,0,.9)}._title_lye2m_328:hover{color:var(--accent-light)}._genres_lye2m_347{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;margin-bottom:.9rem}._genreTag_lye2m_355{color:#fffc;border:1px solid rgba(255,255,255,.28);padding:.32rem .75rem;border-radius:var(--radius-full);font-size:.7rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase}._summary_lye2m_366{font-size:.96rem;line-height:1.65;margin:0 0 1.6rem;color:#fffc;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;max-width:750px}._actions_lye2m_378{display:flex;flex-direction:column;align-items:flex-start;gap:.6rem;flex-wrap:wrap}._watchBtn_lye2m_386{display:inline-flex;align-items:center;justify-content:center;gap:.6rem;width:100%;max-width:280px;padding:.95rem 2rem;background:linear-gradient(135deg,var(--accent) 0%,var(--accent-dark) 100%);color:var(--accent-text);font-size:.95rem;font-weight:700;border:none;border-radius:var(--radius-md);cursor:pointer;box-shadow:0 8px 28px var(--accent-glow),0 2px 8px #0006;transition:transform .2s cubic-bezier(.22,1,.36,1),box-shadow .2s ease,filter .2s ease;letter-spacing:.02em}._watchBtn_lye2m_386:hover{transform:scale(1.02);box-shadow:0 14px 40px var(--accent-glow),0 4px 12px #00000080}._detailsBtn_lye2m_418{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;margin-top:.2rem;padding:.3rem 0;background:none;color:var(--text-secondary);font-size:.88rem;font-weight:600;border:none;border-radius:0;cursor:pointer;transition:color .2s ease;opacity:.8;position:relative}._detailsBtn_lye2m_418:after{content:"→";font-size:.9rem;transition:transform .2s ease}._detailsBtn_lye2m_418:hover{color:var(--accent-light);background:none;opacity:1}._secondaryRow_lye2m_449{display:flex;align-items:center;gap:1.2rem;flex-wrap:wrap}._secondaryBtn_lye2m_456{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;margin-top:.2rem;padding:.3rem 0;background:none;color:var(--text-secondary);font-size:.88rem;font-weight:600;border:none;border-radius:0;cursor:pointer;transition:color .2s ease;opacity:.8}._secondaryBtn_lye2m_456:hover{color:var(--accent-light);opacity:1}._navArrow_lye2m_479{position:absolute;top:50%;transform:translateY(-50%);z-index:6;width:46px;height:46px;border-radius:50%;background:#0006;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);border:1px solid rgba(255,255,255,.2);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .3s ease,border-color .2s ease,color .2s ease}._hero_lye2m_28:hover ._navArrow_lye2m_479{opacity:.9}._navArrow_lye2m_479:hover{border-color:var(--accent);color:var(--accent-light)}._prevArrow_lye2m_512{left:1.2rem}._nextArrow_lye2m_516{right:1.2rem}@media(max-width:768px)and (pointer:coarse){._hero_lye2m_28{min-height:92svh}._scrim_lye2m_53{background:linear-gradient(0deg,#050508e6,#05050859 55%,#05050873)}._slideInner_lye2m_153{flex-direction:column;justify-content:center;text-align:center;gap:1.3rem;padding:4.2rem var(--space-4) 2.4rem}._poster_lye2m_163{width:min(46vw,172px)}._slide_lye2m_145._active_lye2m_248 ._poster_lye2m_163{animation-name:_posterUp_lye2m_1}@keyframes _posterUp_lye2m_1{0%{opacity:0;transform:translateY(24px) scale(.97)}to{opacity:1;transform:none}}._kicker_lye2m_207{justify-content:center}._title_lye2m_328{font-size:1.6rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-align:center;overflow-wrap:anywhere;width:100%;max-width:100%}._info_lye2m_198{align-items:center;text-align:center}._metaRow_lye2m_304{justify-content:center;font-size:.8rem}._genres_lye2m_347{justify-content:center}._genreTag_lye2m_355{font-size:.66rem}._summary_lye2m_366{display:none}._actions_lye2m_378{width:100%;align-items:center}._watchBtn_lye2m_386,._detailsBtn_lye2m_418{flex:1;justify-content:center;padding:.85rem .5rem;font-size:.87rem}._navArrow_lye2m_479{display:none}}@media(max-width:1024px){._slideInner_lye2m_153{gap:2rem}}@media(max-height:500px)and (orientation:landscape){._hero_lye2m_28{min-height:360px}._slideInner_lye2m_153{gap:1.5rem;padding:3.5rem var(--space-8) 3rem}._poster_lye2m_163{width:140px}._title_lye2m_328{font-size:1.5rem}._summary_lye2m_366{display:none}}._emptyState_19tmt_1{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-16) var(--space-8);background:linear-gradient(to bottom,var(--bg-tertiary),var(--bg-main));border-radius:var(--radius-lg);border:1px solid var(--border-primary);text-align:center;gap:var(--space-4);width:100%;min-height:320px}._emptyStateIcon_19tmt_16{color:var(--accent);opacity:.4;margin-bottom:var(--space-2);filter:drop-shadow(0 0 20px var(--accent-glow))}._emptyStateTitle_19tmt_23{font-size:1.5rem;font-weight:800;margin:0;color:var(--text-primary)}._emptyStateText_19tmt_30{font-size:1rem;color:var(--text-secondary);max-width:340px;line-height:1.6}._tabBar_1mv4x_1{display:flex;align-items:center;gap:6px;margin-bottom:2.5rem;padding:6px;background:#ffffff0a;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid var(--border-primary);border-radius:var(--radius-full);width:fit-content;max-width:100%;overflow-x:auto;scrollbar-width:none;box-shadow:0 4px 20px #0003;position:relative}._tabBar_1mv4x_1::-webkit-scrollbar{display:none}._tabIndicator_1mv4x_24{position:absolute;top:6px;bottom:6px;border-radius:var(--radius-full);background:linear-gradient(135deg,var(--accent) 0%,var(--accent-dark) 100%);box-shadow:0 4px 15px var(--accent-glow);transition:left .22s cubic-bezier(.2,1.2,.3,1),width .22s cubic-bezier(.2,1.2,.3,1);z-index:0;pointer-events:none}._tabButton_1mv4x_38{border-radius:var(--radius-full)!important;font-weight:700!important;font-size:.85rem!important;padding:.65rem 1.4rem!important;letter-spacing:.02em;transition:color .25s ease!important;border:none!important;background:transparent!important;color:var(--text-muted)!important;position:relative;z-index:1;flex-shrink:0}._tabButton_1mv4x_38:hover:not(:disabled):not(._tabActive_1mv4x_53){background:#ffffff1a!important;color:var(--text-primary)!important;box-shadow:inset 0 0 0 1px var(--border-secondary)!important;transform:none!important}._tabButton_1mv4x_38:active{transform:scale(.96)}._tabActive_1mv4x_53{color:var(--accent-text)!important}._tabActive_1mv4x_53:hover:not(:disabled){color:var(--accent-text)!important;transform:none!important}@media(max-width:600px){._tabBar_1mv4x_1{width:100%;justify-content:flex-start}._tabButton_1mv4x_38{flex:1;justify-content:center!important;padding:.65rem .5rem!important;text-align:center;font-size:.78rem!important}}._emptyState_bpz5x_1{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-16) var(--space-8);background:linear-gradient(to bottom,var(--bg-tertiary),var(--bg-main));border-radius:var(--radius-lg);border:1px solid var(--border-primary);text-align:center;gap:var(--space-4);width:100%;min-height:320px}._section-header_6ckjf_1{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-8)}._content-type-nav_6ckjf_8{display:flex;justify-content:center;margin-bottom:2.5rem}._content-type-nav_6ckjf_8 .tabBar{margin-bottom:0}._title-wrapper_6ckjf_18{display:flex;align-items:center;gap:var(--space-6)}._pagination-controls_6ckjf_24{display:flex;gap:8px;align-items:center;background:var(--bg-tertiary);padding:4px;border-radius:var(--radius-md);border:1px solid var(--border-primary)}._seasonSection_6ckjf_34{margin-bottom:2.5rem}._seasonGrid_6ckjf_38{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--space-4)}@media(max-width:1200px){._seasonGrid_6ckjf_38{grid-template-columns:repeat(6,1fr)}}@media(max-width:1024px){._seasonGrid_6ckjf_38{grid-template-columns:repeat(5,1fr)}}@media(max-width:768px){._seasonSection_6ckjf_34{margin-bottom:1.25rem}._seasonGrid_6ckjf_38{grid-template-columns:repeat(3,1fr);gap:var(--space-2)}}@media(max-width:480px){._seasonGrid_6ckjf_38{grid-template-columns:repeat(3,1fr);gap:8px}}
|