diff --git a/src/config.js b/src/config.js index 547b70a..9f16ac6 100644 --- a/src/config.js +++ b/src/config.js @@ -6,18 +6,6 @@ // Fshare/Fsonic Tested: 155 ( they don't have Michael ) export const SOURCES = [ - { - key: '4khdhub', - label: '4KHDHub', - sourceFile: '4khdhub', - proxyParam: 'khd', - timeout: 35000, - jitter: 500, - retries: 1, - multiUrl: true, - skipProxy: true, - }, - { key: '123anime', label: '123Anime', @@ -119,72 +107,20 @@ export const SOURCES = [ }, { - key: 'cinejoy', - label: 'Cinejoy', - sourceFile: 'cinejoy', - proxyParam: 'cj', - timeout: 30000, - jitter: 500, - retries: 1, - multiUrl: true, - skipProxy: true, - }, - - { - key: 'cinesrc', - label: 'CineSrc', - sourceFile: 'cinesrc', - proxyParam: 'csr', + key: 'dulo', + label: 'Dulo', + sourceFile: 'dulo', + proxyParam: 'dl', timeout: 25000, jitter: 500, retries: 2, multiUrl: true, skipProxy: true, - skipVerify: true, cdnHeaders: [{ - pattern: /glendale-plumbing\.com|1embed\.cc|bright\d+\.online/i, + pattern: /dulo\.mov/i, headers: { - Referer: 'https://cinesrc.st/', - Origin: 'https://cinesrc.st', - }, - }], - }, - - { - key: 'cinesu', - label: 'CineSu', - sourceFile: 'cinesu', - proxyParam: 'cs', - timeout: 25000, - jitter: 500, - retries: 2, - multiUrl: true, - skipProxy: true, - skipVerify: true, - cdnHeaders: [{ - pattern: /glendale-plumbing\.com/i, - headers: { - Referer: 'https://cine.su/', - Origin: 'https://cine.su', - }, - }], - }, - - { - key: 'downloadeverything', - label: 'DownloadEverything', - sourceFile: 'downloadeverything', - proxyParam: 'de', - timeout: 35000, - jitter: 500, - retries: 1, - multiUrl: true, - skipProxy: true, - cdnHeaders: [{ - pattern: /cloudflarestorage\.com|pixeldrain\.com|hakunaymatata\.com/i, - headers: { - Referer: 'https://downloadeverythingfromeverywhere.com/', - Origin: 'https://downloadeverythingfromeverywhere.com', + Referer: 'https://dulo.mov/', + Origin: 'https://dulo.mov', }, }], }, @@ -208,45 +144,6 @@ export const SOURCES = [ },], }, - { - key: 'frame', - label: 'Frame', - sourceFile: 'frame', - proxyParam: 'fr', - timeout: 25000, - jitter: 500, - retries: 2, - multiUrl: true, - skipProxy: true, - }, - - { - key: 'fsharetv', - label: 'FShareTV', - sourceFile: 'fsharetv', - proxyParam: 'fs', - timeout: 25000, - jitter: 600, - retries: 2, - multiUrl: false, - verifyHeaders: { - Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8', - 'Accept-Language': 'en-US,en;q=0.9', - Referer: 'https://fsharetv.cc', - }, - }, - - { - key: 'fsonic', - label: 'Fsonic', - sourceFile: 'fsonic', - proxyParam: 'fn', - timeout: 35000, - jitter: 600, - retries: 1, - multiUrl: true, - }, - { key: 'fsonline', label: 'FSOnline', @@ -259,16 +156,6 @@ export const SOURCES = [ skipProxy: true, }, - { - key: 'hexa', - label: 'Hexa', - sourceFile: 'hexa', - proxyParam: 'hx', - timeout: 20000, - jitter: 500, - retries: 2, - }, - { key: 'kisskh', label: 'KissKH', @@ -304,44 +191,6 @@ export const SOURCES = [ }, }, - { - key: 'luna-sub', - label: 'Luna (Sub)', - sourceFile: 'luna', - proxyParam: 'lusub', - subtype: 'sub', - timeout: 25000, - jitter: 500, - retries: 2, - multiUrl: true, - skipProxy: true, - }, - - { - key: 'luna-dub', - label: 'Luna (Dub)', - sourceFile: 'luna', - proxyParam: 'ludub', - subtype: 'dub', - timeout: 25000, - jitter: 500, - retries: 2, - multiUrl: true, - skipProxy: true, - }, - - { - key: 'meowtv', - label: 'MeowTV', - sourceFile: 'meowtv', - proxyParam: 'mt', - timeout: 20000, - jitter: 500, - retries: 2, - multiUrl: true, - skipProxy: true - }, - { key: 'movienight', label: 'MovieNight', @@ -380,18 +229,6 @@ export const SOURCES = [ }], }, - { - key: 'peestream', - label: 'PeeStream', - sourceFile: 'peestream', - proxyParam: 'pee', - timeout: 25000, - jitter: 500, - retries: 2, - multiUrl: true, - skipProxy: true, - }, - { key: 'pengu', label: 'Pengu', @@ -456,26 +293,6 @@ export const SOURCES = [ }, }], }, - - { - key: 'vadapav', - label: 'Vadapav', - sourceFile: 'vadapav', - proxyParam: 'vp', - timeout: 25000, - jitter: 500, - retries: 2, - multiUrl: true, - skipProxy: true, - cdnHeaders: [{ - pattern: /vadapav\.mov/i, - headers: { - Referer: 'https://stremio.vadapav.mov/', - Origin: 'https://stremio.vadapav.mov', - }, - }], - }, - { key: 'vidapi', label: 'VidAPI', @@ -487,27 +304,6 @@ export const SOURCES = [ multiUrl: true }, - { - key: 'vidcore', - sourceFile: 'vidcore', - label: 'Vidcore', - proxyParam: 'vc', - timeout: 30000, - jitter: 500, - retries: 2, - sourcesTimeout: 10000, - }, - - { - key: 'vidfast', - label: 'Vidfast', - sourceFile: 'vidfast', - proxyParam: 'vf', - timeout: 35000, - jitter: 500, - retries: 1, - }, - { key: 'vidgod', label: 'VidGod', @@ -644,25 +440,6 @@ export const SOURCES = [ }, }, - { - key: 'vuflix', - label: 'Vuflix', - sourceFile: 'vuflix', - proxyParam: 'vfx', - timeout: 25000, - jitter: 500, - retries: 2, - multiUrl: true, - skipProxy: true, - cdnHeaders: [{ - pattern: /vuflix\.co/i, - headers: { - Referer: 'https://vuflix.co/', - Origin: 'https://vuflix.co', - }, - }], - }, - { key: 'xdownloader', label: 'XDownloader', diff --git a/src/sources/4khdhub.js b/src/sources/4khdhub.js deleted file mode 100644 index fa96f27..0000000 --- a/src/sources/4khdhub.js +++ /dev/null @@ -1,324 +0,0 @@ -import { getUA } from '../utils/helpers.js'; - -const INITIAL_BASE_URL = 'https://4khdhub.one'; -let cachedBaseUrl = null; -let cachedBaseUrlExpiry = 0; - -function rot13(str) { - return str.replace(/[a-zA-Z]/g, (c) => { - const code = c.charCodeAt(0); - if (code >= 65 && code <= 90) { - return String.fromCharCode(((code - 65 + 13) % 26) + 65); - } - return String.fromCharCode(((code - 97 + 13) % 26) + 97); - }); -} - -function levenshtein(a, b) { - if (a === b) return 0; - if (!a.length) return b.length; - if (!b.length) return a.length; - const la = a.length; - const lb = b.length; - const d = Array.from({ length: la + 1 }, () => new Array(lb + 1).fill(0)); - for (let i = 0; i <= la; i++) d[i][0] = i; - for (let j = 0; j <= lb; j++) d[0][j] = j; - for (let i = 1; i <= la; i++) { - for (let j = 1; j <= lb; j++) { - const cost = a[i - 1] === b[j - 1] ? 0 : 1; - d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost); - } - } - return d[la][lb]; -} - -async function getBaseUrl(ua) { - if (cachedBaseUrl && Date.now() < cachedBaseUrlExpiry) { - return cachedBaseUrl; - } - - let currentUrl = INITIAL_BASE_URL; - for (let i = 0; i < 10; i++) { - try { - const res = await fetch(currentUrl, { - method: 'HEAD', - headers: { 'User-Agent': ua }, - redirect: 'manual', - signal: AbortSignal.timeout(10000), - }); - - if (res.status >= 300 && res.status < 400) { - const location = res.headers.get('location'); - if (location) { - currentUrl = new URL(location, currentUrl).toString(); - continue; - } - } - break; - } catch { - break; - } - } - - const parsed = new URL(currentUrl); - cachedBaseUrl = `${parsed.protocol}//${parsed.host}`; - cachedBaseUrlExpiry = Date.now() + 3600000; - return cachedBaseUrl; -} - -async function resolveMetadata(sdk, id, isTv) { - const apiKey = sdk?.tmdbApiKey || process.env.TMDB_API_KEY; - if (!apiKey) return null; - const type = isTv ? 'tv' : 'movie'; - try { - const res = await fetch(`https://api.themoviedb.org/3/${type}/${id}?api_key=${apiKey}`, { - signal: AbortSignal.timeout(8000), - }); - if (!res.ok) return null; - const data = await res.json(); - const title = isTv ? data.name : data.title; - const releaseDate = isTv ? data.first_air_date : data.release_date; - const year = releaseDate ? parseInt(releaseDate.split('-')[0], 10) : null; - return { title, year }; - } catch { - return null; - } -} - -function sanitizeStreamUrl(rawUrl) { - try { - const parsed = new URL(rawUrl); - parsed.pathname = parsed.pathname.replaceAll('::', '%3A%3A'); - return parsed.toString(); - } catch { - return rawUrl.replaceAll('::', '%3A%3A'); - } -} - -async function validateStreamUrl(url, ua) { - try { - const res = await fetch(url, { - headers: { - 'User-Agent': ua, - Range: 'bytes=0-1024', - }, - signal: AbortSignal.timeout(4000), - }); - - const contentType = (res.headers.get('content-type') || '').toLowerCase(); - const isSuccess = (res.status >= 200 && res.status < 300) || res.status === 206; - const isHtmlOrJsonError = contentType.includes('text/html') || contentType.includes('application/json'); - - if (!isSuccess || isHtmlOrJsonError) return false; - return true; - } catch { - return true; - } -} - -async function resolveRedirectUrl(redirectUrl, ua) { - try { - const res = await fetch(redirectUrl, { - headers: { 'User-Agent': ua }, - signal: AbortSignal.timeout(15000), - }); - if (!res.ok) return null; - const html = await res.text(); - - let nextUrl = ''; - const downloadMatch = html.match(/]*class="[^"]*btn-success/); - if (finalMatch) { - return finalMatch[1]; - } - - return null; - } catch { - return null; - } -} - -async function extractSourceResults(itemHtml, ua) { - const sizeMatch = itemHtml.match(/([\d.]+ ?[GM]B)/); - const sizeStr = sizeMatch ? sizeMatch[1] : null; - - const heightMatch = itemHtml.match(/\d{3,}p/); - const heightStr = heightMatch ? heightMatch[0] : null; - - const fileTitleMatch = itemHtml.match(/class="(?:file-title|episode-file-title)"[^>]*>([^<]+)/); - const fileTitle = fileTitleMatch ? fileTitleMatch[1].trim() : 'Unknown'; - - const displayParts = [fileTitle]; - if (heightStr) displayParts.push(heightStr); - if (sizeStr) displayParts.push(sizeStr); - - let hubCloudUrl = null; - let hubDriveUrl = null; - - const linkRegex = /]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/gi; - let match; - while ((match = linkRegex.exec(itemHtml)) !== null) { - const href = match[1]; - const text = match[2]; - if (text.includes('HubCloud') && !hubCloudUrl) { - hubCloudUrl = href; - } else if (text.includes('HubDrive') && !hubDriveUrl) { - hubDriveUrl = href; - } - } - - const redirectUrl = hubCloudUrl || hubDriveUrl; - if (!redirectUrl) return null; - - const resolvedUrl = await resolveRedirectUrl(redirectUrl, ua); - if (!resolvedUrl) return null; - - const safeUrl = sanitizeStreamUrl(resolvedUrl); - const isValid = await validateStreamUrl(safeUrl, ua); - if (!isValid) return null; - - return { - url: safeUrl, - label: displayParts.join(' · '), - headers: { - 'User-Agent': ua, - }, - }; -} - -export async function getStream({ id, s, e, sdk }) { - const isTv = Boolean(s && e); - const ua = getUA(); - - const meta = await resolveMetadata(sdk, id, isTv); - if (!meta?.title) return null; - - const baseUrl = await getBaseUrl(ua); - const searchUrl = `${baseUrl}/?s=${encodeURIComponent(meta.title)}`; - - const searchRes = await fetch(searchUrl, { - headers: { 'User-Agent': ua }, - signal: AbortSignal.timeout(15000), - }); - if (!searchRes.ok) return null; - const searchHtml = await searchRes.text(); - - const cardRegex = /]*\bclass="[^"]*movie-card[^"]*"[^>]*)>([\s\S]*?)<\/a>/gi; - const formatFilter = isTv ? 'Series' : 'Movies'; - let targetPageUrl = null; - - let cardMatch; - while ((cardMatch = cardRegex.exec(searchHtml)) !== null) { - const attributes = cardMatch[1]; - const inner = cardMatch[2]; - - const hrefMatch = attributes.match(/href="([^"]+)"/); - if (!hrefMatch) continue; - const href = hrefMatch[1]; - - const formatMatches = [...inner.matchAll(/class="movie-card-format"[^>]*>([\s\S]*?)<\//gi)]; - const formatTexts = formatMatches.map(m => m[1].trim()); - if (!formatTexts.some(t => t.includes(formatFilter))) continue; - - if (meta.year != null) { - const metaMatch = inner.match(/class="movie-card-meta"[^>]*>([\s\S]*?)<\//i); - const yearMatch = metaMatch ? metaMatch[1].match(/\d{4}/) : null; - if (yearMatch) { - const cardYear = parseInt(yearMatch[0], 10); - if (Math.abs(cardYear - meta.year) > 1) continue; - } - } - - const titleMatch = inner.match(/class="movie-card-title"[^>]*>([\s\S]*?)<\//i); - let cardTitle = titleMatch ? titleMatch[1] : ''; - cardTitle = cardTitle.replace(/\[.*?\]/g, '').trim(); - - const diff = levenshtein(cardTitle.toLowerCase(), meta.title.toLowerCase()); - const isMatch = diff < 5 || (cardTitle.toLowerCase().includes(meta.title.toLowerCase()) && diff < 16); - if (!isMatch) continue; - - targetPageUrl = new URL(href, baseUrl).toString(); - break; - } - - if (!targetPageUrl) return null; - - const pageRes = await fetch(targetPageUrl, { - headers: { 'User-Agent': ua }, - signal: AbortSignal.timeout(15000), - }); - if (!pageRes.ok) return null; - const pageHtml = await pageRes.text(); - - const matchedHtmlBlocks = []; - - if (isTv) { - const seasonStr = String(s).padStart(2, '0'); - const episodeStr = String(e).padStart(2, '0'); - - const epItemRegex = /class="[^"]*episode-item[^"]*"[^>]*>([\s\S]*?)(?=(?:class="[^"]*episode-item"|<\/main>|$))/gi; - let epMatch; - while ((epMatch = epItemRegex.exec(pageHtml)) !== null) { - const epBlock = epMatch[1]; - const titleMatch = epBlock.match(/class="episode-title"[^>]*>([\s\S]*?)<\//i); - const titleText = titleMatch ? titleMatch[1] : ''; - if (!titleText.includes(`S${seasonStr}`)) continue; - - const dlItemRegex = /class="[^"]*episode-download-item[^"]*"[^>]*>([\s\S]*?)(?=(?:class="[^"]*episode-download-item"|<\/div>\s*<\/div>|$))/gi; - let dlMatch; - while ((dlMatch = dlItemRegex.exec(epBlock)) !== null) { - const dlBlock = dlMatch[1]; - if (dlBlock.includes(`Episode-${episodeStr}`)) { - matchedHtmlBlocks.push(dlBlock); - } - } - } - } else { - const dlItemRegex = /class="[^"]*download-item[^"]*"[^>]*>([\s\S]*?)(?=(?:class="[^"]*download-item"|<\/main>|$))/gi; - let dlMatch; - while ((dlMatch = dlItemRegex.exec(pageHtml)) !== null) { - matchedHtmlBlocks.push(dlMatch[1]); - } - } - - if (matchedHtmlBlocks.length === 0) return null; - - const results = await Promise.all(matchedHtmlBlocks.map((block) => extractSourceResults(block, ua))); - const allUrls = results.filter(Boolean); - - if (allUrls.length === 0) return null; - - return { - url: allUrls[0].url, - allUrls, - headers: allUrls[0].headers, - }; -} \ No newline at end of file diff --git a/src/sources/cinejoy.js b/src/sources/cinejoy.js deleted file mode 100644 index b53c34a..0000000 --- a/src/sources/cinejoy.js +++ /dev/null @@ -1,195 +0,0 @@ -import { webcrypto } from 'node:crypto'; -import { USER_AGENT } from '../utils/helpers.js'; - -const PROVIDERS = ['Lisbon', 'Solara', 'Athens', 'Joy', 'Castle', 'Sakura', 'Canaias']; -const REFERER = 'https://cinejoy.to/'; -const ORIGIN = 'https://cinejoy.to'; -const API_URL = 'https://api.shegu.st/g'; - -const WASM_B64 = 'AGFzbQEAAAABbQ5gAn9/AGACf38Bf2ADf39/AX9gA39/fwBgAX8Bf2ABfwBgBX9/f39/AGAEf39/fwBgBX9/f39/AX9gBn9/f39/fwBgBn9/f39/fwF/YAd/f39/f39/AX9gC39/f39/f39/f39/AX9gA39+fgADvQG7AQAACQQDBgMDAAQEBgUEAwMGAAAGAwMAAwAFAAMDAwUFAQAEBAUFAwADAwAEAQEBBQABAQABAwAEAAoHAQACAwcGBQABAQAAAAMDAwMDAAADBwAAAAAAAQEBAQEBAQEBAQEBAQEAAAEEBAQDBAYFBgYABwAAAAAAAwMDAwACAAAAAwEFBQABAgMAAAAFBAEAAAABAAAAAQYDAAMDAgAFAAIBCAEGAwEDAQEBAgEIAQgCCwwIAwEBAwENBwIEBQFwATY2BQMBABEGGQN/AUGAgMAAC38AQZW+wAALfwBBoL7AAAsHRgYGbWVtb3J5AgAFYWxsb2MANwdkZWFsbG9jADgMc2VhbF9yZXF1ZXN0ADkKX19kYXRhX2VuZAMBC19faGVhcF9iYXNlAwIJUgEAQQELNSQ2IiN8fTIsNC5bIGEtWVpXMWJWXbQBXGCiAV5YpQFjZo4BggGGAYUBgQF+f5UBkgGTAZQBgwGRAY8BkAGEAagBXKkBtwGqAasBrQEK9M8DuwGeAgEFfyMAQSBrIgIkACACQRhqIAFBGGopAgA3AwAgAkEQaiABQRBqKQIANwMAIAJBCGogAUEIaikCADcDACACIAEpAgA3AwAjAEEgayIFJAAgBSACEFMjAEEgayIBQRhqQgA3AwAgAUEQakIANwMAIAFBCGpCADcDACABQgA3AwAgBUEcaiEGA0AgBEEgRiIDIANyRQRAIAEgBGogBigCACIDQRh0IANBgP4DcUEIdHIgA0EIdkGA/gNxIANBGHZycjYAACAEQQRqIQQgBkEEayEGDAELCyAAIAEpAwA3AAAgAEEYaiABQRhqKQMANwAAIABBEGogAUEQaikDADcAACAAQQhqIAFBCGopAwA3AAAgBUEgaiQAIAJBIGokAAs3AQJ/IAAgASgCACICIAEoAgQiA0cEfyABIAJBAWo2AgAgAi0AAAUgAQs6AAEgACACIANHOgAACzwAAkAgASACTQRAIAIgBE0NASACIAQgBRCaAQALIAFBACAFEKQBAAsgACACIAFrNgIEIAAgASADajYCAAsJACAALQBAEGcLzwUBDH8jAEHgAmsiAyQAIANBDGoiBCABEFIgA0HoAGpCADcDACADQeAAakIANwMAIANB2ABqQgA3AwAgA0IANwNQIANBMGoiBSADQdAAaiAEIAMtACwQUCADQbgBaiIJIAUgBRAGIANBwAJqIgogCSAFEAYgA0GUAWoiAUGEjsAAIAUQBiADQaACaiILIAogARAHIANB0AFqIgxBvI7AACkCADcDACADQcgBaiINQbSOwAApAgA3AwAgA0HAAWoiDkGsjsAAKQIANwMAIANBpI7AACkCADcDuAEgA0H0AGoiBSALIAkQByMAQaACayIEJAAgBEGAAmoiBiAFEE4gBCAFIAYQSCAGIARBAhBPIARBIGoiByAEIAYQSCAGIAdBBBBPIARBQGsiCCAHIAYQSCAGIAhBCBBPIARB4ABqIgcgBiAIEEggBiAHQRAQTyAEQeABaiIIIAYgBxBIIAYgCEEgEE8gBEHAAWoiByAGIAUQSCAGIAdB4AAQTyAEQaABaiIIIAYgBRBIIARBgAFqIgcgCEHeABBPIAYgByAHEEggASAGIAUQQzoAICABQRhqIARBmAFqKQIANwIAIAFBEGogBEGQAWopAgA3AgAgAUEIaiAEQYgBaikCADcCACABIAQpAoABNwIAIARBoAJqJAAgA0G4AmpCADcDACADQbACakIANwMAIANBqAJqQgA3AwAgA0IANwOgAiADQYACaiIFIAsgASADLQC0ARBQIAogBRAIIANB2AFqIAogBSMAQSBrIgEkACABIAUQUyABKAIAQQFxEGchBSABQSBqJAAgAiAFcxBnEAkQUCAOIANBOGopAgA3AwAgDSADQUBrKQIANwMAIAwgA0HIAGopAgA3AwAgA0EAOgD4ASADIAMpAjA3A7gBIAMtACwgAy0AtAFxEGchASAAIAlBxAD8CgAAIAAgAToARCADQeACaiQACz0BAX8jAEEQayIFJAAgBUEIakEAIAEgAiADIAQQAiAFKAIMIQEgACAFKAIINgIAIAAgATYCBCAFQRBqJAALIgEBfyMAQSBrIgMkACADIAEgAhBJIAAgAxBFIANBIGokAAsiAQF/IwBBIGsiAyQAIAMgASACEEogACADEEUgA0EgaiQACyUBAX8jAEEgayICJAAgAkG4oMAAIAEQTCAAIAIQRSACQSBqJAALDAAgAEF/c0EBcRBnCwsAIAAQDUH/AXFFC2gBAX8jAEEgayIFJAAgAiADSQRAIAVBADYCGCAFQQE2AgwgBUGok8AANgIIIAVCBDcCECAFQQhqIAQQngEACyAAIAM2AgQgACABNgIAIAAgAiADazYCDCAAIAEgA2o2AgggBUEgaiQAC4oDAQJ/IwBBIGsiASQAIAEgADYCBCAAQSBHBEAgAUEANgIIIwBBEGsiAiQAIAJB8I3AADYCDCACIAFBBGo2AggjAEHwAGsiACQAIABBzLTAADYCDCAAIAJBCGo2AgggAEHMtMAANgIUIAAgAkEMajYCECAAQai6wAAoAgA2AhwgAEGcusAAKAIANgIYAkAgAUEIaiIBKAIABEAgAEEwaiABQRBqKQIANwMAIABBKGogAUEIaikCADcDACAAIAEpAgA3AyAgAEEENgJcIABBzLXAADYCWCAAQgQ3AmQgACAAQRBqrUKAgICA8AWENwNQIAAgAEEIaq1CgICAgPAFhDcDSCAAIABBIGqtQoCAgICQBoQ3A0AMAQsgAEEDNgJcIABBmLXAADYCWCAAQgM3AmQgACAAQRBqrUKAgICA8AWENwNIIAAgAEEIaq1CgICAgPAFhDcDQAsgACAAQRhqrUKAgICAgAaENwM4IAAgAEE4ajYCYCAAQdgAakH0jcAAEJ4BAAsgAUEgaiQAC1oBAn8jAEHwAGsiASQAIAFBCGoiAiAALQAAECogASgCCEEFRwRAIAFBPGoiACACQTT8CgAAQYCWwABBCyAAQdCTwABBjJbAABCjAQALIAEtAAwgAUHwAGokAAvJBQENfyMAQaAEayIDJAAgAyABIAIQBiADQSBqIgcgAUEgaiIJIAJBIGoiChAGIANBQGsiBiABQUBrIgsgAkFAayIMEAYgA0HgA2oiBSABIAkQByADQYAEaiIEIAIgChAHIANBwANqIgggBSAEEAYgBCADIAcQByADQeAAaiINIAggBBAXIAUgCSALEAcgBCAKIAwQByAIIAUgBBAGIAQgByAGEAcgA0GAAWoiCiAIIAQQFyAFIAEgCxAHIAQgAiAMEAcgCCAFIAQQBiAEIAMgBhAHIANBoAFqIgsgCCAEEBcgBEGkjsAAIAYQBiADQcABaiIBIAsgBBAXIAUgARBVIANBmARqIgEgA0HYAWopAgA3AwAgA0GQBGoiAiADQdABaikCADcDACADQYgEaiIJIANByAFqKQIANwMAIAMgAykCwAE3A4AEIANB4AFqIgwgBSAEEAcgA0GAAmoiDiAHIAwQFyADQaACaiIPIAcgDBAHIAUgBhBVIAEgA0HYAGopAgA3AwAgAiADQdAAaikCADcDACAJIANByABqKQIANwMAIAMgAykCQDcDgAQgA0HAAmoiByAFIAQQByAFQaSOwAAgCxAGIAQgByADEAcgA0HgAmoiBiAFIAQQFyAFIAYQVSABIANB+AJqKQIANwMAIAIgA0HwAmopAgA3AwAgCSADQegCaikCADcDACADIAMpAuACNwOABCADQYADaiIGIAUgBBAHIAUgAxBVIAEgA0EYaikCADcDACACIANBEGopAgA3AwAgCSADQQhqKQIANwMAIAMgAykCADcDgAQgCCAFIAQQByADQaADaiIBIAggBxAXIAUgDyANEAYgBCAKIAYQBiAAIAUgBBAXIAUgDyAOEAYgBCABIAYQBiAAQSBqIAUgBBAHIAUgDiAKEAYgBCANIAEQBiAAQUBrIAUgBBAHIANBoARqJAAL1wcBC38jAEHwEGsiAyQAIANByA9qIAJBGGopAgA3AwAgA0HAD2ogAkEQaikCADcDACADQbgPaiACQQhqKQIANwMAIAMgAikCADcDsA8gA0GQEGoiBBBBIANCoICAgMAANwLcDkEAIQIgA0EANgLUDiADIANBsBBqNgLQDiADQdgOaiIFIAQ2AgAgA0HQDmoQayEEIANByABqIANB4A5qKAIANgIAIANBQGsgBSkCADcCACADQQg2AlQgAyADQdAPajYCNCADIAMpAtAONwI4IANBCCAEIARBCE8bIgQ2AlAgAyADQbAPajYCMCADQThqIQUDQAJAIAIgBE8NACADIAJBAWo2AkwgAygCMCACQQJ0aigCACEEIANBCGogBSACEGogAygCCCICRQ0AIAMoAgwhBiADIAQ2AtAOIAIgBiADQdAOakEEQaiRwAAQECADKAJQIQQgAygCTCECDAELCyADQRhqIANBmBBqKQAANwMAIANBIGogA0GgEGopAAA3AwAgA0EoaiADQagQaikAADcDACADIAMpAJAQNwMQQQAhAgNAIAJBgAxGRQRAIANBMGogAmpBiI/AAEHgAPwKAAAg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IAE2AgAgAEECNgIMIABBzLjAADYCCCAAQgI3AhQgACAAQQRqrUKAgICAwAOENwMoIAAgAK1CgICAgMADhDcDICAAIABBIGo2AhAgAEEIaiAEEJ4BAAsgACADIAFrNgIEIAAgASACajYCAAsYACAAIAApAyAgAq18NwMgIAAgASACED4LpwUCBn8DfiMAQZABayIDJAAgA0EYahBBIAEtAEAhBCADIAA2AjggACkDICEJIAEgBGpBgAE6AAAgAyADQThqNgI8IANBEGogBEEBaiABQcAAQfiQwAAQEyAErUIDhiEKIAMoAhQhACADKAIQIQUDQCAABEAgBUEAOgAAIABBAWshACAFQQFqIQUMAQsLIApCOIYgCUIJhiILIAqEIgpCgP4Dg0IohoQgCkKAgPwHg0IYhiAKQoCAgPgPg0IIhoSEIAlCAYZCgICA+A+DIAlCD4hCgID8B4OEIAlCH4hCgP4DgyALQjiIhISEIQkCQCAEQThxQThHBEAgASAJNwA4IANBPGogARAWDAELIANBPGoiACABEBYgA0HQAGoiBEEAQTj8CwAgAyAJNwCIASAAIAQQFgsgAUEAOgBAIANCoICAgMAANwJIIANBADYCQCADIANBOGo2AjwgAygCOCEEIAMgA0EYajYCRCMAQRBrIgEkACABIARBIGoiCDYCDCABIAQ2AgggA0E8aiIFEGshBiABQQhqIgAoAgQgACgCAGtBAnYhByADQdAAaiIAIAY2AiQgAEEANgIcIAAgCDYCGCAAIAQ2AhQgAEEQaiAFQRBqKAIANgIAIABBCGogBUEIaikCADcCACAAIAUpAgA3AgAgACAHIAYgBiAHSxs2AiAgAUEQaiQAA0ACQCADKAJsIgAgAygCcE8NACADIABBAWo2AmwgA0EIaiADQdAAaiAAEGogAygCCCIBRQ0AIAMoAgwhBCADIAMoAmQgAEECdGooAgAiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AjwgASAEIANBPGpBBEH8nMAAEBAMAQsLIAJBICADQRhqQSBB6I/AABAQIANBkAFqJAALEAAgACgCACgCACABQQEQPgsiAQF/IwBBIGsiAyQAIAMgASACEEwgACADEEUgA0EgaiQAC9wBAQR/AkAjAEEgayIDJABBECABQRBqIAFrIgQgBEEQTxsh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QQRqIQMMAQsLIAwgASkC+AE3AgggDCABKQLwATcCACABQYACaiQAIBcgDEEIaikCADcCACANIAwpAgA3AhAgDEEgaiQAIBBBEGokACAAQRBqIQAMAQsLIBJBEGokAAvLAQIEfwF+IwBBEGsiBCQAIARBBGoiAwJ/AkAgAa0iB0IgiFAEQCAHpyIFQf////8HTQ0BCyADQQA2AgRBAQwBCyAFRQRAIANBATYCCCADQQA2AgRBAAwBCyAFQQEQOyIGBEAgAyAGNgIIIAMgATYCBEEADAELIAMgBTYCCCADQQE2AgRBAQs2AgAgBCgCCCEBIAQoAgRBAUYEQCABIAQoAgwgAhCXAQALIAQoAgwhAiAAQQA2AgggACACNgIEIAAgATYCACAEQRBqJAALdAEEfyMAQSBrIgEkACABQQhqIgJCADcDACABQRBqIgNCADcDACABQRhqIgRCADcDACABQgA3AwAgACABKQMANwIAIABBCGogAikDADcCACAAQRBqIAMpAwA3AgAgAEEYaiAEKQMANwIAIAAQHyABQSBqJAALIQEBfyMAQRBrIgEkACABIAA2AgwgAC0AABogAUEQaiQAC04BAX8jAEEQayICJAAgAiAAKAIAIgA2AgwgAUHMlsAAQQVB0ZbAAEEEIABBCGpBrJbAAEHVlsAAQQggAkEMakG8lsAAELEBIAJBEGokAAtdAQF/IwBBIGsiAiQAIAIQQSABIAFBKGogAhAVIABBGGogAkEYaikAADcAACAAQRBqIAJBEGopAAA3AAAgAEEIaiACQQhqKQAANwAAIAAgAikAADcAACACQSBqJAALBwAgACgCCAsIACAAKAIIRQsGACAAEC8LRQEEfyAAQQ9qIQIDQAJAIAFBeEYNACAALQAAIQMgACABIAJqIgQtAAA6AAAgBCADOgAAIAFBAWshASAAQQFqIQAMAQsLC9ACAQV/IwBBQGoiAyQAIAMgADYCKCAAQdAAaiEFIAAtAJABIQQgAyADQShqNgIsAkACQAJAQcAAIARrIgYgAk0EQCAEDQEMAgsgA0EQaiAEIAVBwABByJDAABATIANBCGogAiADKAIQIAMoAhRB2JDAABAFIAMoAgggAygCDCABIAJB6JDAABAQIAIgBGohBAwCCyADQTBqIAEgAiAGQfiPwAAQCyADKAI8IQIgAygCOCEBIAMoAjQhBiADKAIwIQcgA0EgaiAEIAVBwABBiJDAABATIAMoAiAgAygCJCAHIAZBmJDAABAQIANBLGogBUEBEDULIAJBP3EhBCACQcAATwRAIANBLGogASACQQZ2EDULIANBGGogBCAFQcAAQaiQwAAQBSADKAIYIAMoAhwgASACQUBxaiAEQbiQwAAQEAsgACAEOgCQASADQUBrJAALswEBBH8jAEHQAGsiAiQAIAJBEGoiBRBBIAJBMGoiAxBBIAEgAUHQAGoiBCADEBUgAUEAOgCQASACQQhqQSAgBEHAAEHYkMAAEAUgAigCCCACKAIMIANBIEHokMAAEBAgAUEgOgCQASABQShqIAQgBRAVIABBGGogAkEoaikAADcAACAAQRBqIAJBIGopAAA3AAAgAEEIaiACQRhqKQAANwAAIAAgAikAEDcAACACQdAAaiQAC5ICAQJ/IwBB0AJrIgMkACADQRBqIgRBAEHAAPwLAAJAIAJBwABNBEAgA0EIaiACIARBwABB8JTAABAFIAMoAgggAygCDCABIAJBgJXAABAQDAELIANBmAFqQQBBwQD8CwAgA0GIAWpBqJ3AACkDADcDACADQYABakGgncAAKQMANwMAIANB+ABqQZidwAApAwA3AwAgA0IANwOQASADQZCdwAApAwA3A3AgA0HwAGoiBCABIAIQKSADQeABaiIBIARB8AD8CgAAIANB0ABqIgIgARAhIANBICADQRBqQcAAQdCUwAAQBSADKAIAIAMoAgQgAkEgQeCUwAAQEAsgACADQRBqQcAA/AoAACADQdACaiQAC80CAQV/IwBBQGoiAyQAIAMgADYCKCAAQShqIQUgAC0AaCEEIAMgA0EoajYCLAJAAkACQEHAACAEayIGIAJNBEAgBA0BDAILIANBEGogBCAFQcAAQciQwAAQEyADQQhqIAIgAygCECADKAIUQdiQwAAQBSADKAIIIAMoAgwgASACQeiQwAAQECACIARqIQQMAgsgA0EwaiABIAIgBkH4j8AAEAsgAygCPCECIAMoAjghASADKAI0IQYgAygCMCEHIANBIGogBCAFQcAAQYiQwAAQEyADKAIgIAMoAiQgByAGQZiQwAAQECADQSxqIAVBARA1CyACQT9xIQQgAkHAAE8EQCADQSxqIAEgAkEGdhA1CyADQRhqIAQgBUHAAEGo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AWogAiAFIAIbQcEAQSAgAhsQKEEAIQIDQCACQcAARwRAIARBwAFqIAJqIgUgBS0AAEE2czoAACACQQFqIQIMAQsLQQAhAiAEQZgCakGoncAAKQMANwMAIARBkAJqQaCdwAApAwA3AwAgBEGIAmpBmJ3AACkDADcDACAEQgA3A6ACIARBkJ3AACkDADcDgAIgBEGAAmogBEHAAWpBARAUA0AgAkHAAEcEQCAEQcABaiACaiIFIAUtAABB6gBzOgAAIAJBAWohAgwBCwsgBEHAAmpBqJ3AACkDADcDACAEQbgCakGgncAAKQMANwMAIARBsAJqQZidwAApAwA3AwAgBEIANwPIAiAEQZCdwAApAwA3A6gCIARBqAJqIgIgBEHAAWpBARAUIARB+AJqIAJBKPwKAAAgBEHQAmoiAiAEQYACakEo/AoAACAEQfgAakEAQcEA/AsAIARBKGoiBSACQdAA/AoAACAIIAVBmAH8CgAAIARBoANqJAAgCCABQSAQJiAIQZgBaiIBIAhBmAH8CgAAIwBB4AFrIgIkACACQShqIgUgAUGYAfwKAAAgAkHAAWoiASAFECcgAkEIaiIEIAEQGiMAQeABayIBJAAgASAEQSAQKEEAIQQDQCAEQcAARwRAIAEgBGoiCiAKLQAAQTZzOgAAIARBAWohBAwBCwtBACEEIAFB2ABqQaidwAApAwA3AwAgAUHQAGpBoJ3AACkDADcDACABQcgAakGYncAAKQMANwMAIAFCADcDYCABQZCdwAApAwA3A0AgAUFAayABQQEQFANAIARBwABHBEAgASAEaiIKIAotAABB6gBzOgAAIARBAWohBAwBCwsgAUGAAWpBqJ3AACkDADcDACABQfgAakGgncAAKQMANwMAIAFB8ABqQZidwAApAwA3AwAgAUIANwOIASABQZCdwAApAwA3A2ggAUHoAGoiBCABQQEQFCABQbgBaiAEQSj8CgAAIAFBkAFqIgQgAUFAa0Eo/AoAACAFQQhqIARB0AD8CgAAIAVCADcDACABQeABaiQAAkAgAigCKEEBRwRAIAdBIGogAkEwakHQAPwKAAAgB0EYaiACQSBqKQAANwAAIAdBEGogAkEYaikAADcAACAHQQhqIAJBEGopAAA3AAAgByACKQAINwAAIAJB4AFqJAAMAQtBrJTAAEETIAJBwAFqQcCTwABBwJTAABCjAQALIAhBsAJqJAAgBiAHQSBqQdAA/AoAACAHQfAAaiQAIAZB6ABqIgxCADcDACAGQeAAaiINQgA3AwAgBkHYAGoiDkIANwMAIAZCADcDUCAGQfQAaiIBQRFBuJ/AABAdIAFBoJ/AAEENEHogASADQQQQeiAGKAJ4IQEgBigCfCECIAZB0ABqIQUjAEEQayIIJAAgCCACNgIMIAggATYCCCAIQQhqIQFBACECQSAhBCMAQaADayIDJAAgA0EAOgAPIAZBKGohDyADQRBqIQcgA0GAAWohECADQZACaiERA0AgBARAIBEgD0Eo/AoAACADQegBaiIKIAZBKPwKAAAgEEEAQcEA/AsAIANBMGoiCSAKQdAA/AoAACACQQFxBEAgCSAHQSAQJgsgBEEgIAQgBEEgTxsiCmshBEEIIQkgASECA0AgCQRAIANBMGogAigCACACKAIEECYgCUEIayEJIAJBCGohAgwBCwtBASECIAMgEkEBaiISOgDoASADQTBqIgsgA0HoAWoiCUEBECYgCSALQZgB/AoAACADQYADaiILIAkQJyADQcgBaiIJIAsQGiAFIAogCSAKQZyUwAAQECAHQRhqIANB4AFqKQAANwAAIAdBEGogA0HYAWopAAA3AAAgB0EIaiADQdABaikAADcAACAHIAMpAMgBNwAAIANBAToADyAFIApqIQUMAQsLIANBoANqJAAgCEEQaiQAIAAgBikDUDcAASAAQRlqIAwpAwA3AAAgAEERaiANKQMANwAAIABBCWogDikDADcAACAGQfQAahAvIABBADoAACAGQYABaiQACxsAAn8gAUEJTwRAIAEgABCNAQwBCyAAEIwBCwteAQJ/AkACQCAAQQRrKAIAIgJBeHEiA0EEQQggAkEDcSICGyABak8EQCACQQAgAyABQSdqSxsNASAAEIsBDAILQcSxwABB9LHAABCcAQALQYSywABBtLLAABCcAQALC+YFAQV/An8CQAJAAkAgAEEEayIEKAIAIgZBeHEiA0EEQQggBkEDcSIFGyABak8EQCAFQQAgAUEnaiADSRsNAQJAIAJBzP97Sw0AQRAgAkELakF4cSACQQtJGyEBAkAgBUUEQCABQYACSSADIAFBBHJJciADIAFrQYGACE9yDQEMBgsgAEEIayIFIANqIQcCQAJAAkACQCAB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IAw2AowDIAMgCzYCiAMgAyAKNgKEAyADIAk2AoADIAMgBzYCWCADIAY2AlQgAyAFNgJQIAMgBDYCTCABIAIgCCADQeABahA/IAMoAvACIQkgAygC9AIhCiADKAL4AiELIAMoAvwCIQwgAyAaNgLsAiADIBk2AugCIAMgGDYC5AIgAyAXNgLgAiADIBY2AvwCIAMgFTYC+AIgAyAUNgL0AiADIBM2AvACIAMgEjYCjAMgAyARNgKIAyADIBA2AoQDIAMgDzYCgAMgAyANNgJYIAMgHTYCVCADIBw2AlAgAyAbNgJMIB4gDiABIAIgCBBAIAMoAtACIRcgAygC1AIhGCADKALYAiEZIAMoAtwCIRogAyAHNgL8AiADIAY2AvgCIAMgBTYC9AIgAyAENgLwAiADIAw2AowDIAMgCzYCiAMgAyAKNgKEAyADIAk2AoADIAMgGkHU5qmoBmoiBDYCWCADIBlBu5WoswdqIgU2AlQgAyAYQdLt9PEHayIGNgJQIAMgF0H7prfsBmsiBzYCTCAOIAEgAiAIED8gAyAGNgL8ASADIAc2AvgBIAMgBDYC9AEgAyAFNgLwASADKALgAiEEIAMoAuQCIQUgAygC6AIhBiADKALsAiEHIAMgDDYCjAMgAyALNgKIAyADIAo2AoQDIAMgCTYCgAMgAyAHNgJYIAMgBjYCVCADIAU2AlAgAyAENgJMIAEgAiAIIANB8AFqED8gAygC8AIhCSADKAL0AiEKIAMoAvgCIQsgAygC/AIhDCADIBY2AuwCIAMgFTYC6AIgAyAUNgLkAiADIBM2AuACIAMgEjYC/AIgAyARNgL4AiADIBA2AvQCIAMgDzYC8AIgAyANNgKMAyADIB02AogDIAMgHDYChAMgAyAbNgKAAyADIBo2AlggAyAZNgJUIAMgGDYCUCADIBc2AkwgHiAOIAEgAiAIEEAgAygC0AIhEyADKALUAiEUIAMoAtgCIRUgAygC3AIhFiADIAc2AvwCIAMgBjYC+AIgAyAFNgL0AiADIAQ2AvACIAMgDDYCjAMgAyALNgKIAyADIAo2AoQDIAMgCTYCgAMgAyAWQd+ugOoFayIENgJYIAMgFUG1s5a/BWsiBTYCVCADIBRBkOnR7QNrIgY2AlAgAyATQd3czsQDayIHNgJMIA4gASACIAgQPyADIAY2AowCIAMgBzYCiAIgAyAENgKEAiADIAU2AoACIAMoAuACIQQgAygC5AIhBSADKALoAiEGIAMoAuwCIQcgAyAMNgKMAyADIAs2AogDIAMgCjYChAMgAyAJNgKAAyADIAc2AlggAyAGNgJUIAMgBTYCUCADIAQ2AkwgASACIAggA0GAAmoQPyADKALwAiEJIAMoAvQCIQogAygC+AIhCyADKAL8AiEMIAMgEjYC7AIgAyARNgLoAiADIBA2AuQCIAMgDzYC4AIgAyANNgL8AiADIB02AvgCIAMgHDYC9AIgAyAbNgLwAiADIBo2AowDIAMgGTYCiAMgAyAYNgKEAyADIBc2AoADIAMgFjYCWCADIBU2AlQgAyAUNgJQIAMgEzYCTCAeIA4gASACIAgQQCADKALQAiEPIAMoAtQCIRAgAygC2AIhESADKALcAiESIAMgBzYC/AIgAyAGNgL4AiADIAU2AvQCIAMgBDYC8AIgAyAMNgKMAyADIAs2AogDIAMgCjYChAMgAyAJNgKAAyADIBJB56+08wJrIgQ2AlggAyARQdzzm8sCayIFNgJUIAMgEEH7lMffAGsiBjYCUCADIA9B8MCqgwFqIgc2AkwgDiABIAIgCBA/IAMgBjYCnAIgAyAHNgKYAiADIAQ2ApQCIAMgBTYCkAIgAygC4AIhBCADKALkAiEFIAMoAugCIQYgAygC7AIhByADIAw2AowDIAMgCzYCiAMgAyAKNgKEAyADIAk2AoADIAMgBzYCWCADIAY2AlQgAyAFNgJQIAMgBDYCTCABIAIgCCADQZACahA/IAMoAvACIQkgAygC9AIhCiADKAL4AiELIAMoAvwCIQwgAyANNgLsAiADIB02AugCIAMgHDYC5AIgAyAbNgLgAiADIBo2AvwCIAMgGTYC+AIgAyAYNgL0AiADIBc2AvACIAMgFjYCjAMgAyAVNgKIAyADIBQ2AoQDIAMgEzYCgAMgAyASNgJYIAMgETYCVCADIBA2AlAgAyAPNgJMIB4gDiABIAIgCBBAIAMoAtACIRsgAygC1AIhHCADKALYAiEdIAMoAtwCIQ0gAyAHNgL8AiADIAY2AvgCIAMgBTYC9AIgAyAENgLwAiADIAw2AowDIAMgCzYCiAMgAyAKNgKEAyADIAk2AoADIAMgDUGWgpPNAWoiBDYCWCADIB1BiNjd8QFqIgU2AlQgAyAcQczuoboCaiIGNgJQIAMgG0G1+cKlA2oiBzYCTCAOIAEgAiAIED8gAyAGNgKsAiADIAc2AqgCIAMgBDYCpAIgAyAFNgKgAiADKALgAiEEIAMoAuQCIQUgAygC6AIhBiADKALsAiEHIAMgDDYCjAMgAyALNgKIAyADIAo2AoQDIAMgCTYCgAMgAyAHNgJYIAMgBjYCVCADIAU2AlAgAyAENgJMIAEgAiAIIANBoAJqED8gAygC8AIhCSADKAL0AiEKIAMoAvgCIQsgAygC/AIhDCADIBo2AuwCIAMgGTYC6AIgAyAYNgLkAiADIBc2AuACIAMgFjYC/AIgAyAVNgL4AiADIBQ2AvQCIAMgEzYC8AIgAyASNgKMAyADIBE2AogDIAMgEDYChAMgAyAPNgKAAyADIA02AlggAyAdNgJUIAMgHDYCUCADIBs2AkwgHiAOIAEgAiAIEEAgAygC0AIhFyADKALUAiEYIAMoAtgCIRkgAygC3AIhGiADIAc2AvwCIAMgBjYC+AIgAyAFNgL0AiADIAQ2AvACIAMgDDYCjAMgAyALNgKIAyADIAo2AoQDIAMgCTYCgAMgAyAaQbOZ8MgDaiIENgJYIAMgGUHK1OL2BGoiBTYCVCADIBhBz5Tz3AVqIgY2AlAgAyAXQfPfucEGaiIHNgJMIA4gASACIAgQPyADIAY2ArwCIAMgBzYCuAIgAyAENgK0AiADIAU2ArACIAMoAuACIQQgAygC5AIhBSADKALoAiEGIAMoAuwCIQcgAyAMNgKMAyADIAs2AogDIAMgCjYChAMgAyAJNgKAAyADIAc2AlggAyAGNgJUIAMgBTYCUCADIAQ2AkwgASACIAggA0GwAmoQPyADKALwAiEJIAMoAvQCIQogAygC+AIhCyADKAL8AiEMIAMgFjYC7AIgAyAVNgLoAiADIBQ2AuQCIAMgEzYC4AIgAyASNgL8AiADIBE2AvgCIAMgEDYC9AIgAyAPNgLwAiADIA02AowDIAMgHTYCiAMgAyAcNgKEAyADIBs2AoADIAMgGjYCWCADIBk2AlQgAyAYNgJQIAMgFzYCTCAeIA4gASACIAgQQCADKALQAiETIAMoAtQCIRQgAygC2AIhFSADKALcAiEWIAMgBzYC/AIgAyAGNgL4AiADIAU2AvQCIAMgBDYC8AIgAyAMNgKMAyADIAs2AogD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QQhqIANqIAEgA2otAAA6AAAgA0EBaiEDDAELAAsACwsgACACKQMgNwIAIABBGGogAkE4aikDADcCACAAQRBqIAJBMGopAwA3AgAgAEEIaiACQShqKQMANwIAIAJBQGskAAs8ACAAIAEpAgA3AgAgAEEYaiABQRhqKQIANwIAIABBEGogAUEQaikCADcCACAAQQhqIAFBCGopAgA3AgALIgEBfyMAQSBrIgMkACADIAEgAhBJIAAgAxBCIANBIGokAAvKBgIBfxl+IwBBwAJrIgMkACADIAIpAgAiBSABKQIAIgQQuAEgA0EQaiACKQIIIgYgBBC4ASADQSBqIAIpAhAiByAEELgBIANBMGogAikCGCIIIAQQuAEgA0FAayAFIAEpAggiBBC4ASADQfAAaiAGIAQQuAEgA0GgAWogByAEELgBIANB0AFqIAggBBC4ASADQdAAaiAFIAEpAhAiBBC4ASADQYABaiAGIAQQuAEgA0GwAWogByAEELgBIANB4AFqIAggBBC4ASADQeAAaiAFIAEpAhgiBRC4ASADQZABaiAGIAUQuAEgA0HAAWogByAFELgBIANB8AFqIAggBRC4ASADIAMpAwA3A4ACIAMpAxghBCADKQMgIQYgAykDKCEHIAMpAzAhCCADKQM4IQkgAykD0AEhDCADKQPYASEPIAMpA6ABIQ0gAykDqAEhECADKQNwIQogAykDeCERIAMgAykDECILIAMpAwh8IgUgAykDQHwiDjcDiAIgAykD4AEhEiADKQPoASETIAMpA7ABIRQgAykDuAEhFSADKQOAASEWIAMpA4gBIRcgAyAKIAYgBCAFIAtUrXwiC3wiBHwiBiADKQNIIAUgDlatfHwiBSADKQNQfCIKNwOQAiADKQPwASEOIAMpA/gBIRggAykDwAEhGSADKQPIASEaIAMpA5ABIRsgAykDmAEhHCADIBYgDSAIIAcgBCALVK18Igt8Igd8IgggBSAGVK0gESAEIAZWrXx8fCIEfCIGIAMpA1ggBSAKVq18fCIFIAMpA2B8Ig03A5gCIAMgGyAUIAwgCSAHIAtUrXwiCnwiCSAEIAhUrSAQIAcgCFatfHx8Igd8IgggBSAGVK0gFyAEIAZWrXx8fCIEfCIGIAMpA2ggBSANVq18fCIMNwOgAiADIBkgEiAHIAlUrSAPIAkgClStfHwiCXwiBSAEIAhUrSAVIAcgCFatfHx8Igd8IgggBiAMVq0gHCAEIAZWrXx8fCIENwOoAiADIA4gBSAHVq0gEyAFIAlUrXx8IgZ8IgUgBCAIVK0gGiAHIAhWrXx8fCIENwOwAiADIAQgBVStIBggBSAGVK18fDcDuAIgACADQYACahBNIANBwAJqJAAL6wECAX8IfiMAQdAAayIDJAAgASkCCCEEIAIpAgghBSACKQIYIQkgASkCGCEKIAIpAhAhBiABKQIQIQcgAyACKQIAIgggASkCAHwiCzcDACADIAQgBXwiBCAIIAtWrXwiCDcDCCADIAYgB3wiByAEIAVUrSAEIAhWrXx8IgQ3AxAgAyAJIAp8IgUgBiAHVq0gBCAHVK18fCIGNwMYIAMgBSAJVK0gBSAGVq18NwMgIANCADcDSCADQoGAgIBwNwNAIANCADcDOCADQv////8PNwMwIANCfzcDKCAAIAMgA0EoahBLIANB0ABqJAALswIBCH4gACABKQMIIgMgAikDCCIEfSIFIAEpAwAiBiACKQMAIghUrSIHfSIJIAVUrSAHIAMgBFStfH1CP4ciAyABKQMQIgQgAikDECIFVK19IAMgBCAFfSIDfCIHIANUrXxCP4ciAyABKQMYIgQgAikDGCIFVK19IAMgBCAFfSIDfCIKIANUrXxCP4ciAyABKQMgIgQgAikDICIFVK19IAMgBCAFfSIDfCADVK18IgMgBiAIfXwiBD4CACAAIARCIIg+AgQgACADQv////8PgyIGIAl8IgUgAyAEVq18IgQ+AgggACAEQiCIPgIMIAAgBSAGVK0gBCAFVK18IgUgB3wiBD4CECAAIARCIIg+AhQgACAEIAVUrSADQoGAgIBwgyAKfHwiAz4CGCAAIANCIIg+AhwLoQECAX8IfiMAQdAAayIDJAAgAikCACEEIAIpAgghBSACKQIQIQYgAikCGCEHIAEpAgAhCCABKQIIIQkgASkCECEKIAEpAhghCyADQgA3AyAgAyALNwMYIAMgCjcDECADIAk3AwggAyAINwMAIANCADcDSCADIAc3A0AgAyAGNwM4IAMgBTcDMCADIAQ3AyggACADIANBKGoQSyADQdAAaiQAC9MEAgF/EX4jAEGgAWsiAiQAIAJBMGogASkDACIDQv////8PELgBIAJBQGsgA0KBgICAcBC4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A0EIaikCADcDACACQThqIANBEGopAgA3AwAgAiADKQIANwMoIAJBHGpBrLHAACACQShqEJ8BGiACQRhqIAQoAgAiAzYCACACIAIpAhwiBTcDECABQQhqIAM2AgAgASAFNwIACyABKQIAIQUgAUKAgICAEDcCACACQQhqIgMgAUEIaiIBKAIANgIAIAFBADYCACACIAU3AwBBDEEEEDsiAUUEQEEEQQwQmAEACyABIAIpAwA3AgAgAUEIaiADKAIANgIAIABBiLPAADYCBCAAIAE2AgAgAkFAayQAC8IBAgN/AX4jAEEwayICJAAgASgCAEGAgICAeEYEQCABKAIMIQMgAkEUaiIEQQA2AgAgAkKAgICAEDcCDCACQSBqIAMoAgAiA0EIaikCADcDACACQShqIANBEGopAgA3AwAgAiADKQIANwMYIAJBDGpBrLHAACACQRhqEJ8BGiACQQhqIAQoAgAiAzYCACACIAIpAgwiBTcDACABQQhqIAM2AgAgASAFNwIACyAAQYizwAA2AgQgACABNgIAIAJBMGokAAt7AQF/IwBBIGsiAiQAAn8gACgCAEGAgICAeEcEQCABIAAoAgQgACgCCBCvAQwBCyACQRBqIAAoAgwoAgAiAEEIaikCADcDACACQRhqIABBEGopAgA3AwAgAiAAKQIANwMIIAEoAgAgASgCBCACQQhqEJ8BCyACQSBqJAALRQECfyABKAIEIQIgASgCACEDQQhBBBA7IgFFBEBBBEEIEJgBAAsgASACNgIEIAEgAzYCACAAQZizwAA2AgQgACABNgIACxMAIABBmLPAADYCBCAAIAE2AgALDAAgACABKQIANwMACxEAIAEgACgCACAAKAIEEK8BC5UCAQJ/IwBBIGsiBSQAQci6wABByLrAACgCACIGQQFqNgIAAn9BACAGQQBIDQAaQQFBlL7AAC0AAA0AGkGUvsAAQQE6AABBkL7AAEGQvsAAKAIAQQFqNgIAQQILQf8BcSIGQQJHBEAgBkEBcQRAIAVBCGogACABKAIYEQAACwALAkBBvLrAACgCACIGQQBOBEBBvLrAACAGQQFqNgIAQcC6wAAoAgAEQCAFIAAgASgCFBEAACAFIAQ6AB0gBSADOgAcIAUgAjYCGCAFIAUpAwA3AhBBwLrAACgCACAFQRBqQcS6wAAoAgAoAhQRAAALQby6wABBvLrAACgCAEEBazYCAEGUvsAAQQA6AAAgA0UNAQALAAsAC0IAIAAEQCAAIAEQmAEACyMAQSBrIgAkACAAQQA2AhggAEEBNgIMIABB9LPAADYCCCAAQgQ3AhAgAEEIaiACEJ4BAAsZACAAIAFBuLrAACgCACIAQR8gABsRAAAAC2sBAX8jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0G8tMAANgIIIANCAjcCFCADIAOtQoCAgIDAA4Q3AyggAyADQQRqrUKAgICAwAOENwMgIAMgA0EgajYCECADQQhqIAIQngEACxAAIAAgASACQey4wAAQuQEL4AQBBn8CQAJAIAAoAggiB0GAgIDAAXFFDQACQAJAAkACQCAHQYCAgIABcQRAIAAvAQ4iAw0BQQAhAgwCCyACQRBPBEAgASACEKABIQMMBAsgAkUEQEEAIQIMBAsgAkEDcSEGAkAgAkEESQRADAELIAJBDHEhCANAIAMgASAFaiIELAAAQb9/SmogBEEBaiwAAEG/f0pqIARBAmosAABBv39KaiAEQQNqLAAAQb9/SmohAyAIIAVBBGoiBUcNAAsLIAZFDQMgASAFaiEEA0AgAyAELAAAQb9/SmohAyAEQQFqIQQgBkEBayIGDQALDAMLIAEgAmohCEEAIQIgASEEIAMhBQNAIAQiBiAIRg0CAn8gBkEBaiAGLAAAIgRBAE4NABogBkECaiAEQWBJDQAaIAZBA2ogBEFwSQ0AGiAGQQRqCyIEIAZrIAJqIQIgBUEBayIFDQALC0EAIQULIAMgBWshAwsgAyAALwEMIgRPDQAgBCADayEGQQAhA0EAIQUCQAJAAkAgB0EddkEDcUEBaw4CAAECCyAGIQUMAQsgBkH+/wNxQQF2IQULIAdB////AHEhCCAAKAIEIQcgACgCACEAA0AgA0H//wNxIAVB//8DcUkEQEEBIQQgA0EBaiEDIAAgCCAHKAIQEQEARQ0BDAMLC0EBIQQgACABIAIgBygCDBECAA0BQQAhAyAGIAVrQf//A3EhAQNAIANB//8DcSICIAFJIQQgASACTQ0CIANBAWohAyAAIAggBygCEBEBAEUNAAsMAQsgACgCACABIAIgACgCBCgCDBECACEECyAEC0IBAX8jAEEgayICJAAgAkEANgIQIAJBATYCBCACQgQ3AgggAkEuNgIcIAIgADYCGCACIAJBGGo2AgAgAiABEJ4BAAs3AQF/IwBBIGsiASQAIAFBADYCGCABQQE2AgwgAUGQuMAANgIIIAFCBDcCECABQQhqIAAQngEAC/wBAgJ/AX4jAEEQayICJAAgAkEBOwEMIAIgATYCCCACIAA2AgQjAEEQayIBJAAgAkEEaiIAKQIAIQQgASAANgIMIAEgBDcCBCMAQRBrIgAkACABQQRqIgEoAgAiAigCDCEDAkACQAJAAkAgAigCBA4CAAECCyADDQFBASECQQAhAwwCCyADDQAgAigCACICKAIEIQMgAigCACECDAELIABBgICAgHg2AgAgACABNgIMIABBxLPAACABKAIEIAEoAggiAC0ACCAALQAJEJYBAAsgACADNgIEIAAgAjYCACAAQaizwAAgASgCBCABKAIIIgAtAAggAC0ACRCWAQALugQBCH8jAEEQayIDJAAgAyABNgIEIAMgADYCACADQqCAgIAONwIIAn8CQAJAAkAgAigCECIJBEAgAigCFCIADQEMAgsgAigCDCIARQ0BIAIoAggiASAAQQN0aiEEIABBAWtB/////wFxQQFqIQYgAigCACEAA0ACQCAAQQRqKAIAIgVFDQAgAygCACAAKAIAIAUgAygCBCgCDBECAEUNAEEBDAULQQEgASgCACADIAFBBGooAgARAQANBBogAEEIaiEAIAQgAUEIaiIBRw0ACwwCCyAAQRhsIQogAEEBa0H/////AXFBAWohBiACKAIIIQQgAigCACEAA0ACQCAAQQRqKAIAIgFFDQAgAygCACAAKAIAIAEgAygCBCgCDBECAEUNAEEBDAQLQQAhB0EAIQgCQAJAAkAgBSAJaiIBQQhqLwEAQQFrDgIBAgALIAFBCmovAQAhCAwBCyAEIAFBDGooAgBBA3RqLwEEIQgLAkACQAJAIAEvAQBBAWsOAgECAAsgAUECai8BACEHDAELIAQgAUEEaigCAEEDdGovAQQhBwsgAyAHOwEOIAMgCDsBDCADIAFBFGooAgA2AghBASAEIAFBEGooAgBBA3RqIgEoAgAgAyABKAIEEQEADQMaIABBCGohACAFQRhqIgUgCkcNAAsMAQsLAkAgBiACKAIETw0AIAMoAgAgAigCACAGQQN0aiIAKAIAIAAoAgQgAygCBCgCDBECAEUN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cGkucnMAcnVzdC9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvY3J5cHRvLWJpZ2ludC0wLjUuNS9zcmMvdWludC9lbmNvZGluZy5ycwBydXN0L3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9jaXBoZXItMC40LjQvc3JjL3N0cmVhbV9jb3JlLnJzAHJ1c3QvcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2RpZ2VzdC0wLjEwLjcvc3JjL2NvcmVfYXBpL2N0X3ZhcmlhYmxlLnJzAC9ydXN0Yy8yOTQ4Mzg4M2VlZDY5ZDVmYjRkYjAxOTY0Y2RmMmFmNGQ4NmU5Y2IyL2xpYnJhcnkvY29yZS9zcmMvc2xpY2UvbW9kLnJzAC9ydXN0Yy8yOTQ4Mzg4M2VlZDY5ZDVmYjRkYjAxOTY0Y2RmMmFmNGQ4NmU5Y2IyL2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjkvc3JjL2RsbWFsbG9jLnJzAGxpYnJhcnkvc3RkL3NyYy9hbGxvYy5ycwBydXN0L3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9nZW5lcmljLWFycmF5LTAuMTQuNy9zcmMvbGliLnJzAHJ1c3QvcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2NvbnN0LW9pZC0wLjkuNi9zcmMvbGliLnJzAHJ1c3QvcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2hrZGYtMC4xMi40L3NyYy9saWIucnMAcnVzdC9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYmxvY2stYnVmZmVyLTAuMTAuNC9zcmMvbGliLnJzAHJ1c3QvcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Flcy1nY20tMC4xMC4zL3NyYy9saWIucnMAcnVzdC9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWVhZC0wLjUuMi9zcmMvbGliLnJzAHJ1c3QvcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3VuaXZlcnNhbC1oYXNoLTAuNS4xL3NyYy9saWIucnMAcnVzdC9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaG1hYy0wLjEyLjEvc3JjL2xpYi5ycwBydXN0L3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9wb2x5dmFsLTAuNi4yL3NyYy9iYWNrZW5kL3NvZnQzMi5ycwBydXN0L3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9jdHItMC45LjIvc3JjL2ZsYXZvcnMvY3RyMzIucnMAcnVzdC9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWVzLTAuOC40L3NyYy9zb2Z0L2ZpeHNsaWNlMzIucnMAAAAgAAAAgQMQAFMAAAA8AgAACQAAAPz//////////////wMAQZyOwAALKAQAAAD8////373EKWLfnNiQMIR4zQXwrNYuIferIKLlNEiHBB0GMNwAQYSPwAALAQEAQaiPwAALAQEAQbSPwAALEP////////////////7///8AQeiPwAALoQFCAhAAXQAAAHwAAAAkAAAAbAQQAFIAAACiAAAAJwAAAGwEEABSAAAApAAAABgAAABsBBAAUgAAAKQAAAAgAAAAbAQQAFIAAACuAAAAFAAAAGwEEABSAAAArgAAABoAAABsBBAAUgAAAJ0AAAAYAAAAbAQQAFIAAACdAAAAHwAAAGwEEABSAAAAnQAAACUAAABsBBAAUgAAAC0BAAAiAAAAAQBBlJHAAAupAv////////////////7///8AAAAAkwEQAFwAAACaAAAAEQAAAFNsaWNlIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBhcnJheQAAgQMQAFMAAABcAgAADgAAAAAAEABbAAAApwAAABIAAAAAABAAWwAAAKcAAAAdAAAAVAUQAFMAAAB/AAAAGQAAAFQFEABTAAAAfwAAACgAAABUBRAAUwAAALcAAAAeAAAACwUQAEkAAACHAQAAGgAAAAsFEABJAAAAiAEAABAAAAABAAAADAAAAAQAAAACAAAAAQAAAAwAAAAEAAAAAgAAAAIAAABkCRAAAwAAAAQAAAAFAAAABgAAAG1pZCA+IGxlbgAAAJwJEAAJAAAAnwIQAE4AAADwAwAAKwBByJPAAAtDAQAAAAcAAAAAAAAANAAAAAQAAAAIAAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQBBlJTAAAvJCAEAAAAJAAAAIgQQAEoAAAACAQAAEwAAAFBSSyBzaXplIGlzIGNvcnJlY3QAIgQQAEoAAACoAAAAKQAAAKcFEABKAAAAfAAAABQAAACnBRAASgAAAHwAAAAjAAAApwUQAEoAAABzAAAAEAAAAKcFEABKAAAAcwAAAB4AAABbABAASwAAAGsAAAAOAAAAWwAQAEsAAABrAAAAHwAAAFsAEABLAAAAywAAACYAAABbABAASwAAAIYAAAAOAAAAWwAQAEsAAACGAAAAKgAAAFsAEABLAAAAiQAAABIAAABbABAASwAAAIkAAAAtAAAAaW52YWxpZCB0YWcAWwAQAEsAAADBAAAAJQAAAFsAEABLAAAAnAAAABQAAAAAAAAALAAAAAQAAAAKAAAAAAAAAAQAAAAEAAAACwAAAEVycm9ya2luZHBvc2l0aW9uAAAAAAAAAAQAAAAEAAAADAAAAEFzbjFDcnlwdG9Qb2ludEVuY29kaW5nVmVyc2lvbgAAAAAAAAQAAAAEAAAADQAAAExlbmd0aERhdGVUaW1lRmFpbGVkAAAAAAQAAAAEAAAADgAAAAAAAAAEAAAABAAAAA8AAABJbmNvbXBsZXRlZXhwZWN0ZWRfbGVuYWN0dWFsX2xlbkluZGVmaW5pdGVMZW5ndGgAAAAABAAAAAQAAAAQAAAAdGFnTm9uY2Fub25pY2FsT2lkTWFsZm9ybWVkAAAAAAAEAAAABAAAABEAAABPaWRVbmtub3dub2lkU2V0RHVwbGljYXRlU2V0T3JkZXJpbmdPdmVyZmxvd092ZXJsZW5ndGhSZWFkZXJUYWdNb2RlVW5rbm93blRhZ051bWJlckludmFsaWQAAAAAAAADAAAAAQAAABIAAABUYWdVbmV4cGVjdGVkZXhwZWN0ZWRhY3R1YWwAAAAAAAQAAAAEAAAAEwAAAFRhZ1Vua25vd25ieXRlVHJhaWxpbmdEYXRhZGVjb2RlZHJlbWFpbmluZwAAAAAAAAQAAAAEAAAAFAAAAFV0ZjhWYWx1ZU5vbmVTb21lSW52YWxpZFBya0xlbmd0aAAAAO8BEABTAAAAkQAAAC8AAADvARAAUwAAAIAAAAAOAAAA7wEQAFMAAACAAAAAFAAAAO8BEABTAAAAgwAAABcAAABTdHJlYW1DaXBoZXJFcnJvcgAAAL4EEABNAAAAagEAAA4AAAC+BBAATQAAAGoBAAAUAAAAvgQQAE0AAABrAQAADgAAAL4EEABNAAAAawEAABQAAAC+BBAATQAAAEwBAAASAAAAvgQQAE0AAABMAQAAGQAAAEgGEABSAAAAOgAAABIAAABIBhAAUgAAADoAAAAcAAAASAYQAFIAAAA6AAAAIwAAADwUqRjUMOd5AbbtX/yVunUQJWJ3K3P7ecZVN6V2X5AYClaVzldT8t1c5Bm65LhKiyXzId2IhujShV2IJRj/cYUBAEHonMAAC80D/////////////////v///wAAAABEARAATwAAAEIAAAATAAAAAAAAAGfmCWqFrme7cvNuPDr1T6V/Ug5RjGgFm6vZgx8ZzeBbBIPHqCEyuFFuPrQGG4LpyIHMWFWTpHCQARMb/3RD6rwXAcHw1Q4jrAKwuaWXmQPb1+kFWqteSlUyEy0dIAcH9fJ8YzJzfHMyYwAAAOYFEAALAAAAiQAAABQAAAACAQAA5gUQAAsAAACKAAAACgAAAOYFEAALAAAAiwAAAAoAAADmBRAACwAAAIwAAAAKAAAA5gUQAAsAAACNAAAACgAAAOYFEAALAAAAjwAAABYAAADmBRAACwAAAJAAAAAMAAAA5gUQAAsAAACRAAAADAAAAOYFEAALAAAAkgAAAAwAAADmBRAACwAAAJMAAAAMAAAAbHVtZW4tZ2F0ZS12MnxlcGhlbWVyYWx85gUQAAsAAACpAAAAFAAAAOYFEAALAAAAqgAAAAoAAADmBRAACwAAAKsAAAAKAAAA5gUQAAsAAACxAAAAFQAAAOYFEAALAAAAsgAAAAsAAADmBRAACwAAALMAAAALAAAA5gUQAAsAAAC0AAAACwAAAPUAEABPAAAAgwcAABEAQdigwAALTFElY/zCyrnzhJ4Xp6365rz//////////wAAAAD/////AwAAAAAAAAD/////+/////7//////////f///wQAAAD///////////////8AQbChwAALpQQBAAAA/////2VtcHR5IHktY29vcmRpbmF0ZQAAWwAQAEsAAAAUAgAAHgAAAAAAAAAEAAAABAAAABoAAAAAAAAABAAAAAQAAAAbAAAAVXRmOEVycm9ydmFsaWRfdXBfdG9lcnJvcl9sZW5Ob25lAAAAAAAAAAQAAAAEAAAAEwAAAFNvbWUAAAAABAAAAAQAAAAPAAAAKQAAAAEAAAAAAAAAQk9PTEVBTklOVEVHRVJCSVQgU1RSSU5HT0NURVQgU1RSSU5HTlVMTE9CSkVDVCBJREVOVElGSUVSUkVBTEVOVU1FUkFURURVVEY4U3RyaW5nU0VRVUVOQ0VTRVROdW1lcmljU3RyaW5nUHJpbnRhYmxlU3RyaW5nVGVsZXRleFN0cmluZ1ZpZGVvdGV4U3RyaW5nSUE1U3RyaW5nVVRDVGltZUdlbmVyYWxpemVkVGltZVZpc2libGVTdHJpbmdCTVBTdHJpbmdwcmltaXRpdmVjb25zdHJ1Y3RlZBgSEAAJAAAAIRIQAAsAAABBUFBMSUNBVElPTiBbXSAoPBIQAA0AAABJEhAAAwAAAEQREAABAAAAQ09OVEVYVC1TUEVDSUZJQyBbAABkEhAAEgAAAEkSEAADAAAARBEQAAEAAABQUklWQVRFIFsAAACQEhAACQAAAEkSEAADAAAARBEQAAEAAABUYWcoMHg6ILQSEAAGAAAAuhIQAAIAAABEERAAAQAAAAIAQd6lwAALAQIAQeilwAALyRQgAADpAgAAAAAAAAACAAAAAAAAAAEAAAAgAADgTGVuZ3RoAAAAAAAABAAAAAQAAAANAAAAAAAAAAgAAAAEAAAAHgAAAKYAEABPAAAANwAAAC8AAACmABAATwAAADwAAAAvAAAAT0lEIG1hbGZvcm1lZAAAAKYAEABPAAAAbQAAABkAAADUAxAATgAAAKgAAAAUAAAAT2JqZWN0SWRlbnRpZmllcigpAAB8ExAAEQAAAI0TEAABAAAAAQAAAAAAAAAuAAAAqBMQAAEAAAAAAAAABAAAAAQAAAANAAAAQXJjSW52YWxpZGFyY0FyY1Rvb0JpZ0Jhc2UxMjgAAAAAAAAABAAAAAQAAAATAAAARGlnaXRFeHBlY3RlZGFjdHVhbEVtcHR5TGVuZ3RoTm90RW5vdWdoQXJjc1RyYWlsaW5nRG90Ynl0ZXMgYXJlIG5vdCB0aGUgZXhwZWN0ZWQgc2l6ZQAAACoUEAAfAAAAkwEQAFwAAAAPAAAACQAAAPUAEABPAAAAIwgAABEAAAD1ABAATwAAAKwGAAAVAAAA8QUQAFcAAABoAAAAEwAAAJoGEABUAAAAuwAAABgAAACaBhAAVAAAALwAAAAYAAAAmgYQAFQAAADFAAAAHQAAAJoGEABUAAAAxgAAACIAAACaBhAAVAAAAMgAAAAqAAAAmgYQAFQAAADnAAAAJAAAAJoGEABUAAAA7AAAACIAAACaBhAAVAAAAOMAAAAoAAAAmgYQAFQAAADkAAAAKAAAAJoGEABUAAAA5QAAACgAAACaBhAAVAAAANMAAAAdAAAAmgYQAFQAAADUAAAAIgAAAJoGEABUAAAADAIAACkAAACaBhAAVAAAABwCAAAtAAAAmgYQAFQAAAAhAgAALQAAAJoGEABUAAAAJwIAACkAAACaBhAAVAAAAA8DAAAOAAAAmgYQAFQAAAAQAwAADgAAAJoGEABUAAAAEQMAAA4AAACaBhAAVAAAABIDAAAOAAAAmgYQAFQAAAATAwAADgAAAJoGEABUAAAAFAMAAA4AAACaBhAAVAAAABUDAAAOAAAAmgYQAFQAAAAWAwAADgAAAJoGEABUAAAAuAMAAAUAAACaBhAAVAAAALkDAAAFAAAAmgYQAFQAAAC6AwAABQAAAJoGEABUAAAAuwMAAAUAAACaBhAAVAAAAIkEAAASAAAAmgYQAFQAAACJBAAAPQAAAJoGEABUAAAAnwQAACsAAACaBhAAVAAAAKAEAAArAAAAmgYQAFQAAAChBAAAKwAAAJoGEABUAAAAogQAACsAAACaBhAAVAAAAKMEAAArAAAAmgYQAFQAAACkBAAAKwAAAJoGEABUAAAApQQAACsAAACaBhAAVAAAAKYEAAArAAAAmgYQAFQAAADCBAAABQAAAJoGEABUAAAAwwQAAAUAAACaBhAAVAAAAMQEAAAFAAAAmgYQAFQAAADFBAAABQAAAJoGEABUAAAAxgQAAAUAAACaBhAAVAAAAMcEAAAFAAAAmgYQAFQAAADIBAAABQAAAJoGEABUAAAAyQQAAAUAAACaBhAAVAAAAP4EAAAbAAAAmgYQAFQAAAD/BAAAGwAAAJoGEABUAAAAAAUAABsAAACaBhAAVAAAAAEFAAAbAAAAmgYQAFQAAAACBQAAGwAAAJoGEABUAAAAAwUAABsAAACaBhAAVAAAAAQFAAAbAAAAmgYQAFQAAAAFBQAAGwAAAJoGEABUAAAAFAUAACIAAACaBhAAVAAAABQFAAAJAAAAmgYQAFQAAAAkBQAABQAAAO0CEABRAAAALgIAABEAAAALBRAASQAAAA8CAAAJAAAAR2VuZXJpY0FycmF5Ojpmcm9tX2l0ZXIgcmVjZWl2ZWQgIGVsZW1lbnRzIGJ1dCBleHBlY3RlZCBEGBAAIQAAAGUYEAAXAAAAgQMQAFMAAABuAQAABQAAAO0CEABRAAAALgIAABEAAAAgAAAADAAAAAQAAAAhAAAAIgAAACMAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAAA+AxAAKgAAALAEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6ZSArIG1heF9vdmVyaGVhZAAAPgMQACoAAAC2BAAADQAAAG1lbW9yeSBhbGxvY2F0aW9uIG9mICBieXRlcyBmYWlsZWQAAEQZEAAVAAAAWRkQAA0AAABoAxAAGQAAAGQBAAAJAAAAIAAAAAwAAAAEAAAAJAAAAAAAAAAIAAAABAAAACUAAAAAAAAACAAAAAQAAAAmAAAAJwAAACgAAAApAAAAKgAAABAAAAAEAAAAKwAAACwAAAAtAAAALgAAAGNhcGFjaXR5IG92ZXJmbG93AAAA4BkQABEAAAApAAAAAQAAAAAAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAACBoQACAAAAAoGhAAEgAAAAAAAAAEAAAABAAAADIAAAA9PSE9bWF0Y2hlc2Fzc2VydGlvbiBgbGVmdCAgcmlnaHRgIGZhaWxlZAogIGxlZnQ6IAogcmlnaHQ6IABnGhAAEAAAAHcaEAAXAAAAjhoQAAkAAAAgcmlnaHRgIGZhaWxlZDogCiAgbGVmdDogAAAAZxoQABAAAACwGhAAEAAAAMAaEAAJAAAAjhoQAAkAAAA6IAAAAQAAAAAAAADsGhAAAgAAAAAAAAAMAAAABAAAADMAAAA0AAAANQAAACAgICAgeyAsICB7CiwKfSB9KCgKLDB4MDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJv9xsQABkAAAByYW5nZSBzdGFydCBpbmRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggGBwQABIAAAAqHBAAIgAAAHJhbmdlIGVuZCBpbmRleCBcHBAAEAAAACocEAAiAAAAc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCAAfBwQABYAAACSHBAADQAAAGNvcHlfZnJvbV9zbGljZTogc291cmNlIHNsaWNlIGxlbmd0aCAoKSBkb2VzIG5vdCBtYXRjaCBkZXN0aW5hdGlvbiBzbGljZSBsZW5ndGggKAAAALAcEAAmAAAA1hwQACsAAAD8GRAAAQAAAFwaEABeGhAAYBoQAAIAAAACAAAABw=='; - -let wasmModuleCache = null; - -async function getWasmInstance() { - if (!WASM_B64) return null; - try { - if (!wasmModuleCache) { - const wasmBuffer = Buffer.from(WASM_B64, 'base64'); - wasmModuleCache = await WebAssembly.compile(wasmBuffer); - } - return await WebAssembly.instantiate(wasmModuleCache, {}); - } catch { - return null; - } -} - -function getCrypto() { - if (typeof globalThis.crypto?.subtle !== 'undefined') { - return globalThis.crypto; - } - return webcrypto; -} - -async function scrapeCinejoyProvider(type, tmdbId, s, e, provider) { - try { - const instance = await getWasmInstance(); - if (!instance) return null; - - const cryptoObj = getCrypto(); - const params = new URLSearchParams({ tmdb: String(tmdbId) }); - - if (type === 'show') { - if (s !== undefined && s !== null) params.set('season', String(s)); - if (e !== undefined && e !== null) params.set('episode', String(e)); - } - - const routeType = type === 'movie' ? 'movie' : 'series'; - const pathStr = `/${provider}/${routeType}?${params.toString()}`; - - const jsonPayload = JSON.stringify({ path: pathStr, payload: null }); - const encodedPayload = new TextEncoder().encode(jsonPayload); - - const randomBytes = new Uint8Array(44); - cryptoObj.getRandomValues(randomBytes); - - const allocSize = encodedPayload.length + 3537; - const wasm = instance.exports; - - const payloadPtr = wasm.alloc(encodedPayload.length); - const keyPtr = wasm.alloc(randomBytes.length); - const outPtr = wasm.alloc(allocSize); - - let memView = new Uint8Array(wasm.memory.buffer); - memView.set(encodedPayload, payloadPtr); - memView.set(randomBytes, keyPtr); - - const sealedLen = wasm.seal_request( - payloadPtr, - encodedPayload.length, - keyPtr, - randomBytes.length, - outPtr, - allocSize - ); - - if (sealedLen <= 0 || sealedLen > allocSize) { - return null; - } - - memView = new Uint8Array(wasm.memory.buffer); - const sealedBuffer = memView.slice(outPtr, outPtr + sealedLen); - - wasm.dealloc(payloadPtr, encodedPayload.length); - wasm.dealloc(keyPtr, randomBytes.length); - wasm.dealloc(outPtr, allocSize); - - const K = 32; - const T = 98; - - const responseKey = sealedBuffer.slice(0, K); - const keyId = sealedBuffer[K]; - const ephemeralPublic = sealedBuffer.slice(K + 1, T); - const bodyBytes = sealedBuffer.slice(T); - - const resp = await fetch(API_URL, { - method: 'POST', - headers: { - 'Content-Type': 'application/octet-stream', - 'User-Agent': USER_AGENT, - 'Referer': REFERER, - 'Origin': ORIGIN - }, - body: bodyBytes, - signal: AbortSignal.timeout(8000) - }); - - if (!resp.ok) return null; - - const encData = new Uint8Array(await resp.arrayBuffer()); - - const key = await cryptoObj.subtle.importKey( - 'raw', - responseKey, - { name: 'AES-GCM', length: 256 }, - false, - ['decrypt'] - ); - - const IV_LENGTH = 12; - const iv = encData.slice(0, IV_LENGTH); - const ciphertext = encData.slice(IV_LENGTH); - - const lumenPrefix = new TextEncoder().encode('lumen-gate-v2'); - const additionalData = new Uint8Array(lumenPrefix.length + 3 + ephemeralPublic.length); - additionalData.set(lumenPrefix, 0); - additionalData.set([0, 2, keyId], lumenPrefix.length); - additionalData.set(ephemeralPublic, lumenPrefix.length + 3); - - const decryptedBuffer = await cryptoObj.subtle.decrypt( - { - name: 'AES-GCM', - iv, - additionalData, - tagLength: 128 - }, - key, - ciphertext - ); - - const jsonResult = JSON.parse(new TextDecoder().decode(decryptedBuffer)); - const streamObj = jsonResult?.data?.stream?.[0]; - - if (streamObj) { - const streamUrl = streamObj.playlist || streamObj.url; - if (!streamUrl) return null; - - const format = String(streamObj.type || '').toLowerCase(); - const isM3U8 = format === 'hls' || streamUrl.includes('.m3u8'); - - return { - url: streamUrl, - server: `Cinejoy (${provider})`, - quality: streamObj.quality || 'Auto', - type: isM3U8 ? 'hls' : 'mp4', - headers: { - 'User-Agent': USER_AGENT, - 'Referer': REFERER, - 'Origin': ORIGIN - } - }; - } - return null; - } catch { - return null; - } -} - -export async function getStream(args) { - const { id, s, e, server } = args; - const isTv = s != null && e != null; - const type = isTv ? 'show' : 'movie'; - - let targets = PROVIDERS; - if (server && server !== 'all') { - const clean = server.toLowerCase().replace('cinejoy (', '').replace(')', '').replace('cinejoy', '').trim(); - targets = PROVIDERS.filter(p => p.toLowerCase().includes(clean)); - if (!targets.length) targets = PROVIDERS; - } - - const settled = await Promise.allSettled( - targets.map(provider => scrapeCinejoyProvider(type, id, s, e, provider)) - ); - - const allUrls = []; - for (const r of settled) { - if (r.status === 'fulfilled' && r.value) { - allUrls.push(r.value); - } - } - - return allUrls.length ? { allUrls } : null; -} - -export async function getSources() { - return PROVIDERS.map(p => `Cinejoy (${p})`); -} \ No newline at end of file diff --git a/src/sources/cinesrc.js b/src/sources/cinesrc.js deleted file mode 100644 index 35a777f..0000000 --- a/src/sources/cinesrc.js +++ /dev/null @@ -1,212 +0,0 @@ -import { USER_AGENT } from '../utils/helpers.js'; - -const _sInit = [23, 27, 30, 31, 86, 28, 19, 86, 9, 18, 19, 21, 26, 27, 86, 120, 114, 120, 116, 86, 9, 18, 19, 21, 26, 27, 122, 89, 25, 23]; -const _vParam = `_v=${(_sInit[15] ^ 0x5a)}${(_sInit[16] ^ 0x5a)}${(_sInit[17] ^ 0x5a)}${(_sInit[18] ^ 0x5a)}`; - -const nD = '4860ac8bfddb'; -const aD = '224eff10e662e9635c9f671cf46351dcd69af42b1edd56f5e5fa21751f44b9c8'; -const Ls = [17, 91, 203, 44, 8, 177, 62, 239, 119, 3, 154, 81, 28, 210, 101, 7]; -const wa = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'; - -const SERVERS = [ - { id: 'NIGHT', endpoint: '/server/night' }, - { id: 'EMP', endpoint: '/server/emp' }, - { id: 'MAIN', endpoint: '/server/vidsrc' } -]; - -let cachedToken = null; -let tokenExpiry = 0; - -function ab(e) { - let t = e >>> 0; - t ^= t >>> 16; - t = Math.imul(t, 2146121005) >>> 0; - t ^= t >>> 15; - t = Math.imul(t, 2221713035) >>> 0; - return (t ^ (t >>> 16)) >>> 0; -} - -function sD(e) { - const t = new TextEncoder().encode(aD); - const r = Math.max(32, Math.min(128, e + 17)); - const n = new Uint8Array(r); - let a = 2166136261; - for (let s = 0; s < r; s += 1) { - a ^= t[s % t.length] ?? s; - a = ab((a + Ls[s % Ls.length] + ((2654435761 * s) >>> 0)) >>> 0); - n[s] = a & 255; - } - return n; -} - -function iD(e) { - let t = ''; - for (let r = 0; r < e.length; r += 3) { - const n = e[r]; - const a = e[r + 1]; - const s = e[r + 2]; - t += wa[n >>> 2]; - t += wa[((3 & n) << 4) | ((a ?? 0) >>> 4)]; - if (a === undefined) break; - t += wa[((15 & a) << 2) | ((s ?? 0) >>> 6)]; - if (s === undefined) break; - t += wa[63 & s]; - } - return t; -} - -function generateCinesrcDirectHlsUrl(id, s, e) { - const isTv = s != null && e != null; - const tmdbId = Math.floor(Number(id)); - const season = isTv ? Math.floor(Number(s || 1)) : 0; - const episode = isTv ? Math.floor(Number(e || 1)) : 0; - - const str = `${nD}:${isTv ? 's' : 'm'}:${tmdbId}:${season}:${episode}`; - const a = new TextEncoder().encode(str); - const sArr = sD(a.length); - const i = new Uint8Array(a.length + 2); - i[0] = a.length & 255; - i[1] = (a.length >>> 8) & 255; - let o = (2654435769 ^ a.length) >>> 0; - for (let l = 0; l < a.length; l += 1) { - o = ab((o + sArr[l % sArr.length] + Ls[l % Ls.length] + l) >>> 0); - i[l + 2] = (a[l] ^ (255 & o)) ^ sArr[(7 * l + 3) % sArr.length]; - } - - return `https://glendale-plumbing.com/c/v1/${iD(i)}/master.m3u8`; -} - -async function fetchBright67Subtitles(id, season, episode) { - let url = `https://subs.bright67.online/search?id=${id}`; - if (season != null && episode != null) { - url += `&season=${season}&episode=${episode}`; - } - - try { - const res = await fetch(url, { - headers: { - 'User-Agent': USER_AGENT, - 'Referer': 'https://cinesrc.st/' - }, - signal: AbortSignal.timeout(4000) - }); - - if (!res.ok) return []; - const data = await res.json(); - if (!Array.isArray(data)) return []; - - return data.slice(0, 15).map(s => ({ - label: s.display || s.languageName || s.language || 'English', - language: s.language || 'en', - file: s.url || s.r2Url, - type: (s.url || s.r2Url || '').endsWith('.vtt') ? 'vtt' : 'srt' - })); - } catch { - return []; - } -} - -async function fetchInternalToken() { - if (cachedToken && Date.now() < tokenExpiry) return cachedToken; - try { - const res = await fetch('https://1embed.cc/api/token', { - headers: { - 'User-Agent': USER_AGENT, - 'Referer': 'https://1embed.cc/', - 'Accept': 'application/json, text/plain, */*' - }, - signal: AbortSignal.timeout(4000) - }); - if (res.ok) { - const data = await res.json(); - if (data?.token) { - cachedToken = data.token; - tokenExpiry = Date.now() + 1800 * 1000; - return cachedToken; - } - } - } catch { } - - return ''; -} - -export async function getStream(args) { - const { id, s, e, clientIP } = args; - const isTv = s != null && e != null; - const isMovie = !isTv; - const allUrls = []; - - const [subtitles, directHlsUrl] = await Promise.all([ - fetchBright67Subtitles(id, isMovie ? undefined : s, isMovie ? undefined : e), - Promise.resolve(generateCinesrcDirectHlsUrl(id, s, e)) - ]); - - const masterUrlWithMark = `${directHlsUrl}?${_vParam}`; - - allUrls.push({ - url: masterUrlWithMark, - server: 'CineSrc (Direct Master)', - quality: 'Auto', - type: 'hls', - headers: { - 'User-Agent': USER_AGENT, - 'Referer': 'https://cinesrc.st/', - 'Origin': 'https://cinesrc.st', - ...(clientIP && { 'X-Forwarded-For': clientIP }) - }, - subtitles: subtitles.length ? subtitles : undefined - }); - - const token = await fetchInternalToken(); - - await Promise.allSettled( - SERVERS.map(async (server) => { - const query = isTv - ? `id=${id}?type=tv&s=${s || 1}&e=${e || 1}` - : `id=${id}?type=movie`; - - const stParam = token ? `&_st=${token}` : ''; - const targetUrl = `https://1embed.cc${server.endpoint}/${query}${stParam}`; - - const headers = { - 'User-Agent': USER_AGENT, - 'Referer': 'https://cinesrc.st/', - 'Accept': 'application/json, text/plain, */*', - ...(token && { 'X-Stream-Token': token }), - ...(clientIP && { 'X-Forwarded-For': clientIP }) - }; - - const res = await fetch(targetUrl, { headers, signal: AbortSignal.timeout(5000) }).catch(() => null); - - if (res && res.ok) { - try { - const data = await res.json(); - if (data && data.success !== false) { - const streamUrl = data.streams?.proxy_m3u8 || data.streams?.raw_m3u8 || data.streams?.m3u8 || data.streamUrl; - if (streamUrl && typeof streamUrl === 'string') { - const urlWithMark = streamUrl.includes('?') ? `${streamUrl}&${_vParam}` : `${streamUrl}?${_vParam}`; - allUrls.push({ - url: urlWithMark, - server: `CineSrc (${data.selectedSource || data.provider || server.id})`, - quality: 'Auto', - type: streamUrl.includes('.m3u8') ? 'hls' : 'mp4', - headers: { - 'User-Agent': USER_AGENT, - 'Referer': 'https://cinesrc.st/', - 'Origin': 'https://cinesrc.st' - }, - subtitles: subtitles.length ? subtitles : undefined - }); - } - } - } catch { } - } - }) - ); - - return allUrls.length ? { allUrls } : null; -} - -export async function getSources() { - return ['CineSrc (Direct Master)', 'CineSrc (NIGHT)', 'CineSrc (EMP)', 'CineSrc (MAIN)']; -} \ No newline at end of file diff --git a/src/sources/cinesu.js b/src/sources/cinesu.js deleted file mode 100644 index d1e2b55..0000000 --- a/src/sources/cinesu.js +++ /dev/null @@ -1,148 +0,0 @@ -import { USER_AGENT } from '../utils/helpers.js'; - -const BASE_DOMAIN = 'https://glendale-plumbing.com'; -const REFERER = 'https://cine.su/'; - -const nD = '4860ac8bfddb'; -const aD = '224eff10e662e9635c9f671cf46351dcd69af42b1edd56f5e5fa21751f44b9c8'; -const Ls = [17, 91, 203, 44, 8, 177, 62, 239, 119, 3, 154, 81, 28, 210, 101, 7]; -const wa = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'; - -function ab(e) { - let t = e >>> 0; - t ^= t >>> 16; - t = Math.imul(t, 2146121005) >>> 0; - t ^= t >>> 15; - t = Math.imul(t, 2221713035) >>> 0; - return (t ^ (t >>> 16)) >>> 0; -} - -function sD(e) { - const t = new TextEncoder().encode(aD); - const r = Math.max(32, Math.min(128, e + 17)); - const n = new Uint8Array(r); - let a = 2166136261; - for (let s = 0; s < r; s += 1) { - a ^= t[s % t.length] ?? s; - a = ab((a + Ls[s % Ls.length] + ((2654435761 * s) >>> 0)) >>> 0); - n[s] = a & 255; - } - return n; -} - -function iD(e) { - let t = ''; - for (let r = 0; r < e.length; r += 3) { - const n = e[r]; - const a = e[r + 1]; - const s = e[r + 2]; - t += wa[n >>> 2]; - t += wa[((3 & n) << 4) | ((a ?? 0) >>> 4)]; - if (a === undefined) break; - t += wa[((15 & a) << 2) | ((s ?? 0) >>> 6)]; - if (s === undefined) break; - t += wa[63 & s]; - } - return t; -} - -function generateMasterUrl(id, s, e) { - const isTv = s != null && e != null; - const tmdbId = Math.floor(Number(id)); - const season = isTv ? Math.floor(Number(s || 1)) : 0; - const episode = isTv ? Math.floor(Number(e || 1)) : 0; - - const str = `${nD}:${isTv ? 's' : 'm'}:${tmdbId}:${season}:${episode}`; - const a = new TextEncoder().encode(str); - const sArr = sD(a.length); - const i = new Uint8Array(a.length + 2); - i[0] = a.length & 255; - i[1] = (a.length >>> 8) & 255; - let o = (2654435769 ^ a.length) >>> 0; - for (let l = 0; l < a.length; l += 1) { - o = ab((o + sArr[l % sArr.length] + Ls[l % Ls.length] + l) >>> 0); - i[l + 2] = (a[l] ^ (255 & o)) ^ sArr[(7 * l + 3) % sArr.length]; - } - - return `${BASE_DOMAIN}/c/v1/${iD(i)}/master.m3u8`; -} - -function parsePlaylist(m3u8Text) { - const qualities = []; - const subtitles = []; - - const subRegex = /#EXT-X-MEDIA:TYPE=SUBTITLES,[^\n]*NAME="([^"]*)"[^\n]*LANGUAGE="([^"]*)"[^\n]*URI="([^"]*)"/g; - let match; - while ((match = subRegex.exec(m3u8Text)) !== null) { - let uri = match[3]; - if (uri.startsWith('/')) uri = `${BASE_DOMAIN}${uri}`; - subtitles.push({ label: match[1], language: match[2], file: uri, type: 'vtt' }); - } - - const streamRegex = /#EXT-X-STREAM-INF:[^\n]*RESOLUTION=\d+x(\d+)[^\n]*\r?\n([^\n#][^\n]*)/g; - while ((match = streamRegex.exec(m3u8Text)) !== null) { - let streamPath = match[2].trim(); - if (streamPath.startsWith('/')) streamPath = `${BASE_DOMAIN}${streamPath}`; - qualities.push({ quality: `${match[1]}p`, url: streamPath }); - } - - return { qualities, subtitles }; -} - -export async function getStream(args) { - const { id, s, e, clientIP } = args; - const rawMasterUrl = generateMasterUrl(id, s, e); - - const headers = { - 'User-Agent': USER_AGENT, - 'Referer': REFERER, - 'Origin': 'https://cine.su', - ...(clientIP && { 'X-Forwarded-For': clientIP }) - }; - - try { - const res = await fetch(rawMasterUrl, { - headers, - signal: AbortSignal.timeout(5000) - }); - - if (res.ok) { - const text = await res.text(); - const { qualities, subtitles } = parsePlaylist(text); - - if (qualities.length) { - const allUrls = [{ - url: rawMasterUrl, - server: 'CineSu (Auto)', - quality: 'Auto', - type: 'hls', - headers, - subtitles: subtitles.length ? subtitles : undefined - }]; - - for (const q of qualities) { - allUrls.push({ - url: q.url, - server: `CineSu (${q.quality})`, - quality: q.quality, - type: 'hls', - headers, - subtitles: subtitles.length ? subtitles : undefined - }); - } - - return { allUrls }; - } - } - } catch { } - - return { - allUrls: [{ - url: rawMasterUrl, - server: 'CineSu', - quality: 'Auto', - type: 'hls', - headers - }] - }; -} \ No newline at end of file diff --git a/src/sources/downloadeverything.js b/src/sources/downloadeverything.js deleted file mode 100644 index 29552cb..0000000 --- a/src/sources/downloadeverything.js +++ /dev/null @@ -1,338 +0,0 @@ -import { getUA } from '../utils/helpers.js'; - -const SLAVE_URL = 'https://slave.downloadeverythingfromeverywhere.com/'; -const REFERER = 'https://downloadeverythingfromeverywhere.com/'; -const ORIGIN = 'https://downloadeverythingfromeverywhere.com'; -const USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'; - -function extractJsonObjects(text) { - const objects = []; - let depth = 0; - let start = -1; - let inString = false; - let escape = false; - - for (let i = 0; i < text.length; i++) { - const char = text[i]; - if (escape) { - escape = false; - continue; - } - if (char === '\\') { - escape = true; - continue; - } - if (char === '"') { - inString = !inString; - continue; - } - if (!inString) { - if (char === '{') { - if (depth === 0) start = i; - depth++; - } else if (char === '}') { - depth--; - if (depth === 0 && start !== -1) { - const jsonStr = text.substring(start, i + 1); - try { - objects.push(JSON.parse(jsonStr)); - } catch { } - start = -1; - } - } - } - } - return objects; -} - -async function resolveDetails(sdk, id, isTv) { - const apiKey = sdk?.tmdbApiKey || process.env.TMDB_API_KEY; - if (!apiKey) return null; - const type = isTv ? 'tv' : 'movie'; - try { - const res = await fetch(`https://api.themoviedb.org/3/${type}/${id}?api_key=${apiKey}&append_to_response=external_ids`, { - signal: AbortSignal.timeout(6000), - }); - if (!res.ok) return null; - const data = await res.json(); - const title = isTv ? data.name : data.title; - const releaseDate = isTv ? data.first_air_date : data.release_date; - const year = releaseDate ? parseInt(releaseDate.split('-')[0], 10) : null; - const imdbId = data.imdb_id || data.external_ids?.imdb_id || null; - return { title, year, imdbId }; - } catch { - return null; - } -} - -async function resolveHubCloud(hubUrl, ua) { - try { - const res1 = await fetch(hubUrl, { - headers: { - 'User-Agent': ua, - Referer: REFERER, - }, - signal: AbortSignal.timeout(8000), - }); - - const html = await res1.text(); - const hubPhpMatch = html.match(/https?:\/\/[^\s"<>]+\/hubcloud\.php\?[^\s"<>]+/i); - if (!hubPhpMatch) return null; - - const phpUrl = hubPhpMatch[0]; - const phpRes = await fetch(phpUrl, { - headers: { - 'User-Agent': ua, - Referer: hubUrl, - }, - signal: AbortSignal.timeout(8000), - }); - - const phpBody = await phpRes.text(); - - const r2Match = phpBody.match(/https?:\/\/[a-zA-Z0-9.\-_]+\.r2\.cloudflarestorage\.com\/[^\s"<>]+/i); - if (r2Match) { - return r2Match[0].replaceAll('&', '&'); - } - - const pixelMatch = phpBody.match(/https?:\/\/pixel\.hubcloud\.[a-z]+\/\?id=[^\s"<>]+/i); - if (pixelMatch) { - return pixelMatch[0]; - } - } catch { } - return null; -} - -async function resolveClicknUpload(clicknUrl, ua) { - try { - const res1 = await fetch(clicknUrl, { - headers: { - 'User-Agent': ua, - Referer: REFERER, - }, - signal: AbortSignal.timeout(8000), - }); - - const body1 = await res1.text(); - const formMatch1 = body1.match(/]+method=["']POST["'][^>]*>([\s\S]*?)<\/form>/i); - if (!formMatch1) return null; - - const inputMatches1 = [...formMatch1[1].matchAll(/]+name=["']([^"']+)["'][^>]+value=["']([^"']*)["']/gi)]; - const params1 = new URLSearchParams(); - for (const m of inputMatches1) { - params1.set(m[1], m[2]); - } - params1.set('method_free', 'Slow Download'); - - const rawCookies = res1.headers.getSetCookie?.() || [res1.headers.get('set-cookie')].filter(Boolean); - const cookieHeader = rawCookies.join('; '); - - const res2 = await fetch(clicknUrl, { - method: 'POST', - headers: { - 'User-Agent': ua, - Referer: clicknUrl, - 'Content-Type': 'application/x-www-form-urlencoded', - ...(cookieHeader ? { Cookie: cookieHeader } : {}), - }, - body: params1.toString(), - signal: AbortSignal.timeout(8000), - }); - - const body2 = await res2.text(); - const formMatch2 = body2.match(/]+method=["']POST["'][^>]*>([\s\S]*?)<\/form>/i); - if (!formMatch2) return null; - - const inputMatches2 = [...formMatch2[1].matchAll(/]+name=["']([^"']+)["'][^>]+value=["']([^"']*)["']/gi)]; - const params2 = new URLSearchParams(); - for (const m of inputMatches2) { - params2.set(m[1], m[2]); - } - params2.set('down_script', '1'); - - await new Promise(r => setTimeout(r, 4500)); - - const res3 = await fetch(clicknUrl, { - method: 'POST', - headers: { - 'User-Agent': ua, - Referer: clicknUrl, - 'Content-Type': 'application/x-www-form-urlencoded', - ...(cookieHeader ? { Cookie: cookieHeader } : {}), - }, - body: params2.toString(), - signal: AbortSignal.timeout(8000), - }); - - const body3 = await res3.text(); - const directMatch = body3.match(/https?:\/\/[a-zA-Z0-9.\-_:]+\/d\/[a-zA-Z0-9_\-\/]+/i) || - body3.match(/window\.open\(["'](https?:\/\/[^"']+)["']\)/i); - - if (directMatch) { - const found = directMatch[1] || directMatch[0]; - if (found.includes('clicknupload.') && !found.includes('/d/')) { - return null; - } - return found; - } - } catch { } - return null; -} - -async function resolveItem(item, fallbackTitle, ua) { - const rawUrl = String(item.url || '').trim(); - if (!rawUrl) return null; - - if ( - rawUrl.includes('111477.xyz') || - rawUrl.includes('vadapav.mov') || - rawUrl.includes('driveseed.org') || - rawUrl.includes('new3.gdflix.io') || - rawUrl.includes('rapidrar.cr') || - rawUrl.includes('megaup.net') || - rawUrl.includes('telegram.dog') || - rawUrl.includes('t.me') - ) { - return null; - } - - let directStreamUrl = null; - let provider = item.site || 'DownloadEverything'; - let streamHeaders = { 'User-Agent': ua }; - - try { - if (rawUrl.includes('hakunaymatata.com')) { - directStreamUrl = rawUrl; - provider = 'Moviebox'; - streamHeaders = { 'User-Agent': 'Lavf/60.16.100' }; - } else if (rawUrl.includes('pixeldrain.dev') || rawUrl.includes('pixeldrain.com')) { - const m = rawUrl.match(/pixeldrain\.(?:dev|com)\/(?:u|l)\/([a-zA-Z0-9_-]+)/); - if (m) { - directStreamUrl = `https://pixeldrain.com/api/file/${m[1]}`; - provider = 'Pixeldrain'; - } - } else if (rawUrl.includes('hubcloud.') || rawUrl.includes('vcloud.zip')) { - directStreamUrl = await resolveHubCloud(rawUrl, ua); - if (directStreamUrl) { - provider = 'HubCloud'; - } - } else if (rawUrl.includes('clicknupload.')) { - directStreamUrl = await resolveClicknUpload(rawUrl, ua); - if (directStreamUrl) { - provider = 'ClicknUpload'; - } - } else if ( - /\.(?:mp4|mkv)(?:\?|$)/i.test(rawUrl) && - !rawUrl.includes('111477.xyz') && - !rawUrl.includes('vadapav.mov') && - !rawUrl.includes('.cyou/res/') - ) { - try { - const check = await fetch(rawUrl, { - method: 'HEAD', - headers: { 'User-Agent': ua }, - signal: AbortSignal.timeout(2000), - }); - if (check.status === 200 || check.status === 206 || (check.status >= 300 && check.status < 400)) { - directStreamUrl = rawUrl; - provider = item.site || 'DirectStream'; - } - } catch { } - } - } catch { } - - if (!directStreamUrl) return null; - - const tags = Array.isArray(item.tags) ? item.tags.map(String) : []; - const qualityMatch = tags.find(t => /2160p|4k|1080p|720p|480p/i.test(t)) || '1080p'; - const rawTitle = item.name || item.release || fallbackTitle; - - return { - url: directStreamUrl, - label: `[${provider}] ${rawTitle} (${qualityMatch})`, - headers: streamHeaders, - }; -} - -export async function getStream({ id, s, e, sdk }) { - const isTv = Boolean(s && e); - const mediaType = isTv ? 'series' : 'movie'; - const ua = USER_AGENT; - - const details = await resolveDetails(sdk, id, isTv); - const title = details?.title || String(id); - const tmdbId = parseInt(id, 10); - - const payload = { - mode: mediaType, - title, - ...(details?.year ? { year: String(details.year) } : {}), - ...(tmdbId ? { tmdb_id: tmdbId } : {}), - ...(details?.imdbId ? { imdb_id: details.imdbId } : {}), - ...(isTv && s != null ? { season: Number(s) } : {}), - ...(isTv && e != null ? { episode: Number(e) } : {}), - }; - - const res = await fetch(SLAVE_URL, { - method: 'POST', - headers: { - 'User-Agent': ua, - Origin: ORIGIN, - Referer: REFERER, - 'Content-Type': 'application/json', - Accept: 'application/x-ndjson', - 'x-defe-manual': '1', - 'sec-ch-ua': '"Microsoft Edge";v="153", "Not_A Brand";v="8", "Chromium";v="153"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-site', - }, - body: JSON.stringify(payload), - signal: AbortSignal.timeout(16000), - }); - - if (!res.ok) return null; - - let fullText = ''; - if (res.body?.getReader) { - const reader = res.body.getReader(); - const decoder = new TextDecoder(); - - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - fullText += decoder.decode(value, { stream: true }); - } - } catch { } - } else { - fullText = await res.text(); - } - - const objects = extractJsonObjects(fullText); - const candidateItems = []; - - for (const parsed of objects) { - if (parsed?.t === 'hit' && Array.isArray(parsed.links)) { - const site = parsed.site || 'DownloadEverything'; - for (const l of parsed.links) { - if (l && typeof l === 'object') { - candidateItems.push({ site, ...l }); - } - } - } - } - - const resolved = await Promise.all(candidateItems.map(item => resolveItem(item, title, ua))); - const allUrls = resolved.filter(Boolean); - - if (allUrls.length === 0) return null; - - return { - url: allUrls[0].url, - allUrls, - headers: allUrls[0].headers, - }; -} \ No newline at end of file diff --git a/src/sources/dulo.js b/src/sources/dulo.js new file mode 100644 index 0000000..3da6527 --- /dev/null +++ b/src/sources/dulo.js @@ -0,0 +1,150 @@ +import { getUA } from '../utils/helpers.js'; + +const BASE_URL = 'https://dulo.mov'; + +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + +async function resolveDetails(sdk, id, isTv) { + const apiKey = sdk?.tmdbApiKey || process.env.TMDB_API_KEY; + if (!apiKey) return null; + const type = isTv ? 'tv' : 'movie'; + try { + const res = await fetch(`https://api.themoviedb.org/3/${type}/${id}?api_key=${apiKey}`, { + signal: AbortSignal.timeout(6000), + }); + if (!res.ok) return null; + const data = await res.json(); + const title = isTv ? data.name : data.title; + const releaseDate = isTv ? data.first_air_date : data.release_date; + const year = releaseDate ? releaseDate.split('-')[0] : ''; + const runtime = isTv ? (data.episode_run_time?.[0] || 24) : (data.runtime || 90); + return { title, year, runtime }; + } catch { + return null; + } +} + +async function fetchSource(url, headers) { + try { + const res = await fetch(url, { + headers, + signal: AbortSignal.timeout(8000), + }); + if (!res.ok) return null; + return await res.json(); + } catch { + return null; + } +} + +export async function getStream({ id, s, e, sdk }) { + const isTv = Boolean(s && e); + const mediaType = isTv ? 'tv' : 'movie'; + const ua = getUA(); + + const details = await resolveDetails(sdk, id, isTv); + const title = details?.title || ''; + const year = details?.year || ''; + const runtime = details?.runtime || ''; + + const referer = isTv + ? `${BASE_URL}/watch/tv/${id}/${s}/${e}` + : `${BASE_URL}/watch/movie/${id}`; + + const defaultHeaders = { + 'User-Agent': ua, + Referer: referer, + Origin: BASE_URL, + Accept: '*/*', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-origin', + }; + + const baseParams = new URLSearchParams({ + tmdbId: String(id), + type: mediaType, + }); + + const additionalParams = new URLSearchParams({ + tmdbId: String(id), + type: mediaType, + progressive: 'true', + }); + + if (title) additionalParams.set('title', title); + if (year) additionalParams.set('year', String(year)); + if (runtime) additionalParams.set('runtime', String(runtime)); + + if (isTv) { + baseParams.set('season', String(s)); + baseParams.set('episode', String(e)); + additionalParams.set('season', String(s)); + additionalParams.set('episode', String(e)); + } + + const endpoints = [ + `${BASE_URL}/api/sources?${baseParams.toString()}`, + `${BASE_URL}/api/sources/willow?${baseParams.toString()}`, + `${BASE_URL}/api/sources/additional?${additionalParams.toString()}`, + ]; + + const seenUrls = new Set(); + const allUrls = []; + + let pendingUrls = [...endpoints]; + const maxPollTime = Date.now() + 16000; + + while (pendingUrls.length > 0 && Date.now() < maxPollTime) { + const results = await Promise.all( + pendingUrls.map((url) => fetchSource(url, defaultHeaders)) + ); + + const nextPending = []; + + results.forEach((data, index) => { + if (!data) return; + + if (Array.isArray(data.sources) && data.sources.length > 0) { + for (const src of data.sources) { + let streamUrl = String(src?.url || '').trim(); + if (!streamUrl) continue; + + if (streamUrl.startsWith('/')) { + streamUrl = `${BASE_URL}${streamUrl}`; + } + + if (!streamUrl.startsWith('http') || seenUrls.has(streamUrl)) continue; + seenUrls.add(streamUrl); + + allUrls.push({ + url: streamUrl, + label: src.label || 'Dulo', + headers: { + 'User-Agent': ua, + Referer: referer, + }, + captions: Array.isArray(src.captions) ? src.captions : [], + }); + } + } + + if (data.pending) { + nextPending.push(pendingUrls[index]); + } + }); + + pendingUrls = nextPending; + if (pendingUrls.length > 0) { + await sleep(1500); + } + } + + if (allUrls.length === 0) return null; + + return { + url: allUrls[0].url, + allUrls, + headers: allUrls[0].headers, + }; +} \ No newline at end of file diff --git a/src/sources/frame.js b/src/sources/frame.js deleted file mode 100644 index 71320ee..0000000 --- a/src/sources/frame.js +++ /dev/null @@ -1,88 +0,0 @@ -import { USER_AGENT, fetchJson } from '../utils/helpers.js'; - -const BASE_URL = 'https://api.peestream.in'; - -const PROVIDERS = [ - { id: 'vaplayer', name: 'FRAME Zephyr' }, - { id: 'castle', name: 'FRAME Atlas' }, - { id: 'hera', name: 'FRAME Luna' }, - { id: 'multivid', name: 'FRAME Volt' }, - { id: 'netmirror', name: 'FRAME Echo' }, - { id: 'vidsuper-castle', name: 'FRAME Rift' }, - { id: 'vidsuper-vixsrc', name: 'FRAME Quill' } -]; - -async function fetchProviderStreams(provider, type, id, s, e) { - try { - const queryParams = new URLSearchParams({ - q: String(id), - type, - provider: provider.id - }); - if (type === 'tv') { - queryParams.set('season', String(s)); - queryParams.set('episode', String(e)); - } - - const url = `${BASE_URL}/api/search?${queryParams.toString()}`; - const data = await fetchJson(url, { - headers: { - 'User-Agent': USER_AGENT, - 'Accept': 'application/json', - 'Referer': 'https://peestream.in/' - }, - signal: AbortSignal.timeout(12000) - }); - - if (!data || !Array.isArray(data.results) || !data.results.length) return []; - - const streams = []; - for (const result of data.results) { - for (const stream of result.streams || []) { - if (!stream || !stream.url) continue; - streams.push({ - url: stream.url, - server: provider.name, - quality: stream.quality || 'Auto', - type: stream.type === 'm3u8' || stream.url.includes('.m3u8') ? 'hls' : 'mp4', - headers: stream.headers || { - 'User-Agent': USER_AGENT - } - }); - } - } - return streams; - } catch { - return []; - } -} - -export async function getStream(args) { - const { id, s, e, server } = args; - const isTv = s != null && e != null; - const type = isTv ? 'tv' : 'movie'; - - let targets = PROVIDERS; - if (server && server !== 'all') { - const clean = server.toLowerCase().replace('frame ', '').trim(); - targets = PROVIDERS.filter(p => p.id.toLowerCase() === clean || p.name.toLowerCase().includes(clean)); - if (!targets.length) targets = PROVIDERS; - } - - const settled = await Promise.allSettled( - targets.map(p => fetchProviderStreams(p, type, id, s, e)) - ); - - const allUrls = []; - for (const r of settled) { - if (r.status === 'fulfilled' && Array.isArray(r.value)) { - allUrls.push(...r.value); - } - } - - return allUrls.length ? { allUrls } : null; -} - -export async function getSources() { - return PROVIDERS.map(p => p.name); -} \ No newline at end of file diff --git a/src/sources/fsharetv.js b/src/sources/fsharetv.js deleted file mode 100644 index 8e185d2..0000000 --- a/src/sources/fsharetv.js +++ /dev/null @@ -1,44 +0,0 @@ -import { fetchText, fetchJson, USER_AGENT, getTmdbInfo } from '../utils/helpers.js'; - -const BASE_URL = 'https://fsharetv.cc'; -const HEADERS = { 'User-Agent': USER_AGENT, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.9', 'Referer': `${BASE_URL}/` }; -const API_HEADERS = { ...HEADERS, 'Accept': 'application/json, */*; q=0.01', 'X-Requested-With': 'XMLHttpRequest' }; - -export async function getStream({ id, s }) { - if (s != null) return null; - try { - const info = await getTmdbInfo(id, 'movie'); - if (!info?.imdbId) return null; - const html = await fetchText(`${BASE_URL}/movie/${info.imdbId}`, { headers: HEADERS, signal: AbortSignal.timeout(8000) }); - let watchPath = null; - const match = html.match(/href="(\/w\/[^"]+)"/); - if (match) watchPath = match[1]; - if (!watchPath) return null; - const watchHtml = await fetchText(`${BASE_URL}${watchPath}`, { headers: HEADERS, signal: AbortSignal.timeout(8000) }); - let sourceId = null; - const sidMatch = watchHtml.match(/(?:source_id|file_id|setSource)[\s=:\('"]+([^'"\)]+)/i); - if (sidMatch) sourceId = sidMatch[1]; - if (!sourceId) return null; - const json = await fetchJson(`${BASE_URL}/api/file/${sourceId}/source?trailer=Png81APqcxU&type=watch`, { headers: { ...API_HEADERS, 'Referer': `${BASE_URL}${watchPath}` }, signal: AbortSignal.timeout(8000) }); - if (json.status !== 'ok') return null; - const groups = []; - if (Array.isArray(json.data?.file?.sources)) groups.push(json.data.file.sources); - if (Array.isArray(json.data?.file?.alternatives)) json.data.file.alternatives.forEach(g => Array.isArray(g) && groups.push(g)); - const out = [], seen = new Set(); - for (const group of groups) { - for (const item of group.filter(st => st?.src).sort((a, b) => parseInt(b.quality) - parseInt(a.quality))) { - const url = item.src.startsWith('http') ? item.src : `${BASE_URL}${item.src}`; - if (seen.has(url)) continue; - seen.add(url); - out.push({ url, quality: parseInt(item.quality) || 0, label: item.label || null }); - } - } - out.sort((a, b) => b.quality - a.quality); - return out.length ? { allUrls: out.map(u => ({ url: u.url, headers: HEADERS, skipProxy: false })) } : null; - } catch { return null; } -} - -export async function getSources(args) { - const stream = await getStream(args); - return stream?.allUrls ? stream.allUrls.map(u => u.url) : []; -} \ No newline at end of file diff --git a/src/sources/fsonic.js b/src/sources/fsonic.js deleted file mode 100644 index e906426..0000000 --- a/src/sources/fsonic.js +++ /dev/null @@ -1,49 +0,0 @@ -import { fetchText, fetchJson, USER_AGENT, getTmdbInfo } from '../utils/helpers.js'; - -const BASE_URL = 'https://www.fsonic.net'; -const FSHARE_BASE = 'https://fsharetv.co'; -const HEADERS = { 'User-Agent': USER_AGENT, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.9' }; - -export async function getStream({ id, s, sdk }) { - const tmdbApiKey = sdk?.tmdbApiKey || null; - if (!tmdbApiKey) return null; - if (s != null) return null; - try { - const info = await getTmdbInfo(tmdbApiKey, id, 'movie'); - if (!info?.titles?.length) return null; - let watchSlug = null; - for (const title of info.titles) { - try { - const html = await fetchText(`${BASE_URL}/movie/search/${encodeURIComponent(title)}`, { headers: HEADERS, signal: AbortSignal.timeout(8000) }); - let idx = 0, found = null; - const yearStr = String(info.year); - while ((idx = html.indexOf('href="/watch/', idx)) !== -1) { - const start = idx + 6; - const end = html.indexOf('"', start); - const link = html.slice(start, end); - if (!found) found = link; - if (link.includes(yearStr)) { found = link; break; } - idx = end; - } - if (found) { watchSlug = found; break; } - } catch { } - } - if (!watchSlug) return null; - const wHtml = await fetchText(`${BASE_URL}${watchSlug}`, { headers: HEADERS, signal: AbortSignal.timeout(8000) }); - let token = null, trailer = null; - const match = wHtml.match(/init\('([^']+)',\s*(?:'[^']*',\s*)?'([^']+)'/); - if (match) { token = match[1]; trailer = match[2]; } - if (!token) return null; - const json = await fetchJson(`${BASE_URL}/api/source/${token}?trailer=${trailer}&type=watch`, { headers: { ...HEADERS, 'Accept': 'application/json, text/plain, */*', 'Referer': `${BASE_URL}${watchSlug}` }, signal: AbortSignal.timeout(8000) }); - if (json.status !== 'ok') return null; - const allGroups = []; - if (json.data?.file?.sources?.length) allGroups.push(json.data.file.sources); - if (json.data?.file?.alternatives) for (const g of json.data.file.alternatives) if (g?.length) allGroups.push(g); - const urls = new Set(); - for (const group of allGroups) { - const best = [...group].filter(st => st?.src).sort((a, b) => parseInt(b.quality) - parseInt(a.quality))[0]; - if (best) urls.add(best.src.startsWith('http') ? best.src : `${FSHARE_BASE}${best.src}`); - } - return urls.size ? { allUrls: [...urls].map(url => ({ url, headers: { ...HEADERS, 'Referer': `${FSHARE_BASE}/` }, skipProxy: false })) } : null; - } catch { return null; } -} \ No newline at end of file diff --git a/src/sources/hexa.js b/src/sources/hexa.js deleted file mode 100644 index 3d54479..0000000 --- a/src/sources/hexa.js +++ /dev/null @@ -1,82 +0,0 @@ -import crypto from 'node:crypto'; -import { fetchJson, fetchText, USER_AGENT } from '../utils/helpers.js'; - -const API_BASE = 'https://enc-dec.app/api'; -const DOMAINS = ['hexa.su', 'flixer.su']; - -async function getChallengeToken() { - try { - const data = await fetchJson(`${API_BASE}/enc-hexa`, { signal: AbortSignal.timeout(6000) }); - return data?.status === 200 ? data.result.token : null; - } catch { return null; } -} - -export async function getStream({ id, s, e, server }) { - try { - const apiKey = crypto.randomBytes(32).toString('hex'); - const capToken = await getChallengeToken(); - if (!capToken) return null; - - const isTv = s != null && e != null; - let decrypted = null; - - for (const domain of DOMAINS) { - try { - const url = isTv - ? `https://theemoviedb.${domain}/api/tmdb/tv/${id}/season/${s}/episode/${e}/images` - : `https://theemoviedb.${domain}/api/tmdb/movie/${id}/images`; - - const encrypted = await fetchText(url, { - headers: { - 'User-Agent': USER_AGENT, - 'Referer': `https://${domain}/`, - 'Accept': 'text/plain', - 'X-Fingerprint-Lite': 'e9136c41504646444', - 'X-Api-Key': apiKey, - 'X-Cap-Token': capToken - }, - signal: AbortSignal.timeout(10000) - }); - - if (!encrypted) continue; - - const decData = await fetchJson(`${API_BASE}/dec-hexa`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ text: encrypted, key: apiKey }), - signal: AbortSignal.timeout(8000) - }); - - if (decData?.status === 200 && decData.result?.sources?.length) { - decrypted = decData.result; - break; - } - } catch { continue; } - } - - if (!decrypted?.sources?.length) return null; - - let sources = decrypted.sources.map(src => ({ - url: src.url, - server: `Hexa - ${src.name || src.server || 'Server'}`, - type: src.url.includes('.m3u8') ? 'hls' : 'mp4', - quality: src.quality || 'Auto', - subtitles: (decrypted.subtitles || []).map(sub => ({ - url: sub.url, - lang: sub.label || sub.lang || 'Unknown' - })), - skipProxy: false - })); - - if (server && server !== 'all') { - const cleanName = server.replace('Hexa - ', ''); - sources = sources.filter(u => u.server.includes(cleanName)); - } - - return sources.length ? { allUrls: sources } : null; - } catch { return null; } -} - -export async function getSources() { - return ['Hexa']; -} \ No newline at end of file diff --git a/src/sources/luna.js b/src/sources/luna.js deleted file mode 100644 index 64238ec..0000000 --- a/src/sources/luna.js +++ /dev/null @@ -1,125 +0,0 @@ -import { USER_AGENT, fetchText, getTmdbInfo, tmdbToAnilist } from '../utils/helpers.js'; - -const ACTION_FETCH_SOURCES = 'afb0491c5516f9fff5fcb464d627638df76062f8'; -const WATCH_URL = 'https://luna-stream.me/anime/watch/21/gogoanime/1'; - -const PROVIDERS = [ - { id: 'megaplay', name: 'Helios' }, - { id: 'anibd', name: 'Nova' }, - { id: 'pahe', name: 'Polaris' }, - { id: 'gogoanime', name: 'Quasar' }, - { id: 'zoro', name: 'Zenith' }, - { id: 'animepahe', name: 'Vega' }, - { id: 'animekai', name: 'Cosmos' }, - { id: 'crysoline', name: 'CrysOline' }, - { id: 'orion', name: 'Orion' }, - { id: 'pulsar', name: 'Pulsar' } -]; - -function parseRscResponse(text) { - for (const line of text.split('\n')) { - if (line.startsWith('1:')) { - try { - return JSON.parse(line.slice(2)); - } catch { } - } - } - return null; -} - -function cleanUrl(rawUrl) { - if (!rawUrl) return ''; - return rawUrl.replace(/^https:\/\/api\.luna-stream\.mehttps:\/\/api\.luna-stream\.me/, 'https://api.luna-stream.me'); -} - -async function fetchProviderStreams(anilistId, epNum, provider, subtype) { - try { - const text = await fetchText(WATCH_URL, { - method: 'POST', - headers: { - 'User-Agent': USER_AGENT, - 'Next-Action': ACTION_FETCH_SOURCES, - 'Content-Type': 'text/plain;charset=UTF-8', - 'Accept': 'text/x-component', - 'Referer': WATCH_URL, - 'Origin': 'https://luna-stream.me' - }, - body: JSON.stringify([anilistId, provider.id, String(epNum), epNum, subtype, null]), - signal: AbortSignal.timeout(10000) - }); - - if (!text) return []; - - const parsed = parseRscResponse(text); - if (!parsed || !Array.isArray(parsed.sources)) return []; - - const streams = []; - for (const s of parsed.sources) { - if (!s || !s.url) continue; - - const url = cleanUrl(s.url); - const format = String(s.type || '').toLowerCase(); - const isM3U8 = format === 'hls' || format === 'm3u8' || url.includes('.m3u8') || url.includes('.txt'); - - streams.push({ - url, - server: `Luna (${provider.name})`, - quality: String(s.quality || 'Auto'), - type: isM3U8 ? 'hls' : 'mp4', - headers: { - 'User-Agent': USER_AGENT, - 'Referer': 'https://luna-stream.me/' - } - }); - } - - return streams; - } catch { - return []; - } -} - -export async function getStream(args) { - const { id, s, e, ep, audio, server, tmdbApiKey } = args; - const isTv = s != null && e != null; - const mediaType = isTv ? 'tv' : 'movie'; - - let anilistId = null; - try { - const info = await getTmdbInfo(tmdbApiKey, id, mediaType, s); - anilistId = await tmdbToAnilist(id, mediaType, s, info?.titles || [], info?.year); - } catch { } - - if (!anilistId) { - anilistId = Number(id); - } - - if (!anilistId || isNaN(anilistId)) return null; - - const epNum = Number(e || ep || 1); - const resolvedSubtype = audio === 'dub' ? 'dub' : 'sub'; - - let targets = PROVIDERS; - if (server && server !== 'all') { - const clean = server.toLowerCase().replace('luna (', '').replace(')', '').replace('luna', '').trim(); - targets = PROVIDERS.filter(p => p.id.toLowerCase() === clean || p.name.toLowerCase().includes(clean)); - if (!targets.length) targets = PROVIDERS; - } - - const settled = await Promise.allSettled( - targets.map(p => fetchProviderStreams(anilistId, epNum, p, resolvedSubtype)) - ); - - const allUrls = []; - for (const r of settled) { - if (r.status === 'fulfilled' && Array.isArray(r.value)) { - allUrls.push(...r.value); - } - } - - return allUrls.length ? { allUrls } : null; -} - -export async function getSources() { - return PROVIDERS.map(p => `Luna (${p.name})`); -} \ No newline at end of file diff --git a/src/sources/meowtv.js b/src/sources/meowtv.js deleted file mode 100644 index eb0818a..0000000 --- a/src/sources/meowtv.js +++ /dev/null @@ -1,142 +0,0 @@ -import { fetchJson, USER_AGENT } from '../utils/helpers.js'; - -const API_BASE = 'https://api.meowtv.ru'; -const REFERER = 'https://meowtv.ru/'; -const ENC_DEC_API = 'https://enc-dec.app/api/dec-meowtv'; - -const BASE_HEADERS = { - 'User-Agent': USER_AGENT, - 'Accept': 'application/json', - 'Referer': REFERER, - 'Origin': 'https://meowtv.ru', - 'Accept-Language': 'en-US,en;q=0.9' -}; - -const SERVERS = [ - 'dcloud', 'acme', 'tcloud', 'ipcloud', 'turkce', 'hindiv3' -]; - -const TIMEOUT_MS = 15000; - -export const VERIFY_HEADERS = { 'User-Agent': USER_AGENT, 'Referer': REFERER, 'Origin': 'https://meowtv.ru' }; - -let cachedTicket = null; -let ticketExpiry = 0; - -/** - * Fetches a stream ticket or returns a cached valid ticket. - */ -async function getTicket(forceRefresh = false) { - const now = Date.now(); - if (!forceRefresh && cachedTicket && now < ticketExpiry - 10000) { - return cachedTicket; - } - - try { - const res = await fetchJson(`${API_BASE}/streams/ticket`, { - method: 'POST', - headers: { - ...BASE_HEADERS, - 'Content-Type': 'application/json' - }, - body: JSON.stringify({}) - }); - - if (res?.ticket) { - cachedTicket = res.ticket; - ticketExpiry = typeof res.exp === 'number' ? res.exp : now + 60000; - return cachedTicket; - } - } catch { - } - - return null; -} - -async function decryptPayload(payload) { - try { - const response = await fetchJson(ENC_DEC_API, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ data: payload }) - }); - - if (response?.status !== 200 || !response?.result) { - return null; - } - - return typeof response.result === 'string' ? JSON.parse(response.result) : response.result; - } catch (e) { - return null; - } -} - -export async function getStream({ id, s, e, server }) { - try { - const isTv = !!s; - let targets = SERVERS; - if (server && server !== 'all') { - const cleanName = server.replace('MeowTV - ', ''); - targets = SERVERS.includes(cleanName) ? [cleanName] : [targets[0]]; - } - - const ticket = await getTicket(); - const requestHeaders = { - ...BASE_HEADERS, - ...(ticket ? { 'x-stream-ticket': ticket } : {}) - }; - - const results = await Promise.all(targets.map(async srv => { - try { - return await Promise.race([ - (async () => { - const path = isTv - ? `/streams/tv/${id}/${s}/${e}?s=${encodeURIComponent(srv)}` - : `/streams/movie/${id}?s=${encodeURIComponent(srv)}`; - - const payload = await fetchJson(`${API_BASE}${path}`, { - headers: requestHeaders - }); - - if (!payload) return null; - - const data = await decryptPayload(payload); - if (!data) return null; - - const urls = []; - if (data?.url?.startsWith('http')) { - urls.push({ - url: data.url, - server: `MeowTV - ${srv}`, - }); - } - - if (Array.isArray(data?.streams)) { - for (const stream of data.streams) { - if (stream?.url?.startsWith('http')) { - urls.push({ - url: stream.url, - server: `MeowTV - ${srv} (${stream.language || 'Unknown'})`, - }); - } - } - } - return urls; - })(), - new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout exceeded')), TIMEOUT_MS)) - ]); - } catch (err) { - return null; - } - })); - - const allUrls = results.filter(Boolean).flat(); - return allUrls.length ? { allUrls } : null; - } catch (e) { - return null; - } -} - -export async function getSources() { - return SERVERS.map(s => `MeowTV - ${s}`); -} \ No newline at end of file diff --git a/src/sources/peestream.js b/src/sources/peestream.js deleted file mode 100644 index 643e477..0000000 --- a/src/sources/peestream.js +++ /dev/null @@ -1,122 +0,0 @@ -import { USER_AGENT, fetchJson, getTmdbInfo } from '../utils/helpers.js'; - -const BASE_URL = 'https://providers.peestream.in'; - -export async function getStream(args) { - const { id, s, e, server, tmdbApiKey } = args; - const isTv = s != null && e != null; - const type = isTv ? 'tv' : 'movie'; - - let title = args.title || ''; - let releaseYear = args.year || ''; - let imdbId = args.imdbId || ''; - - if (!title) { - try { - const info = await getTmdbInfo(id, type, s, tmdbApiKey); - if (info) { - title = info.title || ''; - if (info.year) releaseYear = info.year; - if (info.imdbId) imdbId = info.imdbId; - } - } catch { } - } - - const queryParams = new URLSearchParams({ - type, - tmdbId: String(id), - title: title || String(id) - }); - if (releaseYear) queryParams.set('releaseYear', String(releaseYear)); - if (imdbId) queryParams.set('imdbId', String(imdbId)); - if (isTv) { - queryParams.set('season', String(s)); - queryParams.set('episode', String(e)); - } - - const allUrls = []; - - try { - const scrapeUrl = `${BASE_URL}/scrape?${queryParams.toString()}`; - const res = await fetch(scrapeUrl, { - headers: { - 'User-Agent': USER_AGENT, - 'Accept': 'text/event-stream', - 'Referer': `${BASE_URL}/` - }, - signal: AbortSignal.timeout(15000) - }); - - if (res.ok) { - const text = await res.text(); - const events = text.split('\n\n'); - for (const ev of events) { - if (ev.includes('event: completed')) { - const dataMatch = ev.match(/data:\s*(.+)/); - if (dataMatch) { - try { - const parsed = JSON.parse(dataMatch[1].trim()); - const stream = parsed.stream; - const streamUrl = stream?.playlist || stream?.url || stream?.file; - if (streamUrl) { - allUrls.push({ - url: streamUrl, - server: `PeeStream - ${parsed.sourceId || 'Poseidon'}`, - quality: 'Auto', - type: stream.type === 'hls' || streamUrl.includes('.m3u8') ? 'hls' : 'mp4', - headers: stream.headers || { - 'User-Agent': USER_AGENT - } - }); - } - } catch { } - } - } - } - } - } catch { } - - if (!allUrls.length) { - try { - const searchUrl = `${BASE_URL}/api/search?q=${encodeURIComponent(title || id)}&type=${type}&tmdbId=${id}${isTv ? `&season=${s}&episode=${e}` : ''}`; - const data = await fetchJson(searchUrl, { - headers: { - 'User-Agent': USER_AGENT, - 'Accept': 'application/json', - 'Referer': `${BASE_URL}/` - }, - signal: AbortSignal.timeout(10000) - }); - - if (data && Array.isArray(data.results)) { - for (const result of data.results) { - const pName = result.providerName || result.provider || 'PeeStream'; - for (const stream of result.streams || []) { - if (!stream || !stream.url) continue; - allUrls.push({ - url: stream.url, - server: `PeeStream - ${stream.name || pName}`, - quality: stream.quality || 'Auto', - type: stream.type === 'm3u8' || stream.url.includes('.m3u8') ? 'hls' : 'mp4', - headers: stream.headers || { - 'User-Agent': USER_AGENT - } - }); - } - } - } - } catch { } - } - - if (server && server !== 'all') { - const clean = server.toLowerCase().replace('peestream - ', ''); - const filtered = allUrls.filter(u => u.server.toLowerCase().includes(clean)); - if (filtered.length) return { allUrls: filtered }; - } - - return allUrls.length ? { allUrls } : null; -} - -export async function getSources() { - return ['PeeStream - vaplayer']; -} \ No newline at end of file diff --git a/src/sources/streamaggregator.js b/src/sources/streamaggregator.js index d3b45a9..a4bf616 100644 --- a/src/sources/streamaggregator.js +++ b/src/sources/streamaggregator.js @@ -49,9 +49,9 @@ export async function getStream({ id, s, e, sdk }) { 'User-Agent': ua, Referer: `${BASE_URL}/`, Origin: BASE_URL, - Accept: 'application/x-ndjson, text/plain, */*', + Accept: 'text/event-stream, application/x-ndjson, text/plain, */*', }, - signal: AbortSignal.timeout(18000), + signal: AbortSignal.timeout(90000), }); if (!res.ok) return null; @@ -89,7 +89,9 @@ export async function getStream({ id, s, e, sdk }) { for (const line of lines) { try { - const item = JSON.parse(line); + const raw = line.startsWith('data:') ? line.slice(5).trim() : line; + if (!raw || raw === '[DONE]') continue; + const item = JSON.parse(raw); const streamUrl = String(item?.url || '').trim(); if (!streamUrl || !streamUrl.startsWith('http') || seenUrls.has(streamUrl)) continue; diff --git a/src/sources/vadapav.js b/src/sources/vadapav.js deleted file mode 100644 index 1a78257..0000000 --- a/src/sources/vadapav.js +++ /dev/null @@ -1,85 +0,0 @@ -import { getUA } from '../utils/helpers.js'; - -const ADDON_BASE = 'https://stremio.vadapav.mov'; - -async function resolveImdbId(sdk, id, isTv) { - const apiKey = sdk?.tmdbApiKey || process.env.TMDB_API_KEY; - if (!apiKey) return null; - const type = isTv ? 'tv' : 'movie'; - try { - const res = await fetch(`https://api.themoviedb.org/3/${type}/${id}?api_key=${apiKey}&append_to_response=external_ids`, { - signal: AbortSignal.timeout(6000), - }); - if (!res.ok) return null; - const data = await res.json(); - return data.imdb_id || data.external_ids?.imdb_id || null; - } catch { - return null; - } -} - -export async function getStream({ id, s, e, sdk }) { - const isTv = Boolean(s && e); - const ua = getUA(); - - const imdbId = await resolveImdbId(sdk, id, isTv); - const targetIds = []; - if (imdbId && imdbId.startsWith('tt')) { - targetIds.push(imdbId); - } - targetIds.push(`tmdb:${id}`); - - const seenUrls = new Set(); - const allUrls = []; - - const defaultHeaders = { - 'User-Agent': ua, - Accept: 'application/json, text/plain, */*', - }; - - for (const targetId of targetIds) { - const streamPath = isTv - ? `${ADDON_BASE}/stream/series/${targetId}:${s}:${e}.json` - : `${ADDON_BASE}/stream/movie/${targetId}.json`; - - try { - const res = await fetch(streamPath, { - headers: defaultHeaders, - signal: AbortSignal.timeout(12000), - }); - - if (!res.ok) continue; - const data = await res.json(); - - if (Array.isArray(data?.streams) && data.streams.length > 0) { - for (const item of data.streams) { - if (!item || typeof item !== 'object') continue; - const url = String(item.url || '').trim(); - if (!url || !url.startsWith('http') || seenUrls.has(url)) continue; - - seenUrls.add(url); - - const rawTitle = item.title ? String(item.title).trim() : ''; - const rawName = item.name ? String(item.name).trim() : 'vadapav.mov'; - const label = rawTitle || rawName; - - allUrls.push({ - url, - label, - headers: defaultHeaders, - }); - } - - if (allUrls.length > 0) break; - } - } catch { } - } - - if (allUrls.length === 0) return null; - - return { - url: allUrls[0].url, - allUrls, - headers: allUrls[0].headers, - }; -} \ No newline at end of file diff --git a/src/sources/vidcore.js b/src/sources/vidcore.js deleted file mode 100644 index ce04e6b..0000000 --- a/src/sources/vidcore.js +++ /dev/null @@ -1,43 +0,0 @@ -import { fetchJson, fetchText, USER_AGENT } from '../utils/helpers.js'; - -const API_BASE = 'https://enc-dec.app/api'; -const HEADERS = { 'User-Agent': USER_AGENT, 'Referer': 'https://vidcore.net/', 'X-Requested-With': 'XMLHttpRequest' }; - -async function getDynamicServers(id, s, e) { - try { - const html = await fetchText(s != null && e != null ? `https://vidcore.net/tv/${id}/${s}/${e}/` : `https://vidcore.net/movie/${id}/`, { headers: HEADERS }); - - const match = html.match(/\\"(?:en|token)\\":\\"(.*?)\\"/) || html.match(/"(?:en|token)":"(.*?)"/); - if (!match?.[1]) return null; - - const encData = await fetchJson(`${API_BASE}/enc-vidcore?text=${encodeURIComponent(match[1])}`); - if (!encData?.result) return null; - const { servers: serversUrl, stream: streamUrl, token } = encData.result; - const reqHeaders = { ...HEADERS, 'X-CSRF-Token': token }; - const serversEncrypted = await fetchText(serversUrl, { method: 'POST', headers: reqHeaders }); - const decData = await fetchJson(`${API_BASE}/dec-vidcore`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: serversEncrypted }) }); - return decData?.result ? { servers: decData.result, streamUrl, reqHeaders } : null; - } catch { return null; } -} - -export async function getStream({ id, s, e }) { - const data = await getDynamicServers(id, s, e); - if (!data?.servers?.length) return null; - for (const srv of data.servers) { - try { - const streamEncrypted = await fetchText(`${data.streamUrl}/${srv.data}`, { method: 'POST', headers: data.reqHeaders }); - const decData = await fetchJson(`${API_BASE}/dec-vidcore`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: streamEncrypted }) }); - const url = decData?.result?.url; - if (url) { - const r = await fetch(url, { headers: { ...HEADERS, 'Range': 'bytes=0-511' }, signal: AbortSignal.timeout(5000) }); - if (r.ok || r.status === 206) return { url, subtitles: (decData.result.captions || []).map(c => ({ url: c.file, lang: c.label || 'Unknown' })), headers: { ...HEADERS, 'Origin': 'https://vidcore.net' }, server: srv.name }; - } - } catch { } - } - return null; -} - -export async function getSources(args) { - const data = await getDynamicServers(args.id, args.s, args.e); - return data?.servers ? data.servers.map(s => s.name) : []; -} \ No newline at end of file diff --git a/src/sources/vidfast.js b/src/sources/vidfast.js deleted file mode 100644 index b294eab..0000000 --- a/src/sources/vidfast.js +++ /dev/null @@ -1,53 +0,0 @@ -import { fetchJson, fetchText, USER_AGENT } from '../utils/helpers.js'; - -const API_BASE = 'https://enc-dec.app/api'; -const DOMAIN = 'https://vidfast.vc'; -const HEADERS = { 'User-Agent': USER_AGENT, 'Referer': `${DOMAIN}/`, 'X-Requested-With': 'XMLHttpRequest' }; - -async function getVidfastMeta(id, s, e) { - try { - const embedUrl = s != null && e != null ? `${DOMAIN}/tv/${id}/${s}/${e}/` : `${DOMAIN}/movie/${id}/`; - const html = await fetchText(embedUrl, { headers: { 'User-Agent': USER_AGENT } }); - - const match = html.match(/\\"(?:en|token)\\":\\"(.*?)\\"/) || html.match(/"(?:en|token)":"(.*?)"/); - if (!match?.[1]) return null; - - const encData = await fetchJson(`${API_BASE}/enc-vidfast?text=${encodeURIComponent(match[1])}`); - if (encData.status !== 200 || !encData.result) return null; - - const { servers: serversUrl, stream: streamUrl, token } = encData.result; - const reqHeaders = { ...HEADERS, 'X-CSRF-Token': token }; - - const serversEncrypted = await fetchText(serversUrl, { method: 'POST', headers: reqHeaders }); - const decServersData = await fetchJson(`${API_BASE}/dec-vidfast`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: serversEncrypted }) }); - - if (decServersData.status !== 200 || !decServersData.result) return null; - return { servers: decServersData.result, streamUrl, reqHeaders }; - } catch { return null; } -} - -export async function getStream({ id, s, e, server }) { - const meta = await getVidfastMeta(id, s, e); - if (!meta?.servers?.length) return null; - const { servers, streamUrl, reqHeaders } = meta; - let targets = servers; - if (server && server !== 'all') { - const cleanName = server.replace('VidFast - ', ''); - targets = servers.filter(srv => srv.name === cleanName); - if (!targets.length) targets = servers; - } - const results = await Promise.allSettled(targets.map(async srv => { - const streamEncrypted = await fetchText(`${streamUrl}/${srv.data}`, { method: 'POST', headers: reqHeaders }); - const decStreamData = await fetchJson(`${API_BASE}/dec-vidfast`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: streamEncrypted }) }); - if (decStreamData.status !== 200 || !decStreamData.result?.url) throw new Error(); - return { url: decStreamData.result.url, server: `VidFast - ${srv.name || 'Server'}`, type: decStreamData.result.url.includes('.m3u8') ? 'hls' : 'mp4', subtitles: (decStreamData.result.captions || []).map(c => ({ url: c.file, lang: c.label || 'Unknown' })), headers: { ...HEADERS, 'Origin': DOMAIN } }; - })); - const allUrls = []; - for (const r of results) if (r.status === 'fulfilled') allUrls.push(r.value); - return allUrls.length ? { allUrls } : null; -} - -export async function getSources(args) { - const meta = await getVidfastMeta(args.id, args.s, args.e); - return meta?.servers ? meta.servers.map(srv => `VidFast - ${srv.name}`) : []; -} \ No newline at end of file diff --git a/src/sources/vuflix.js b/src/sources/vuflix.js deleted file mode 100644 index 6fb539e..0000000 --- a/src/sources/vuflix.js +++ /dev/null @@ -1,249 +0,0 @@ -import { getUA } from '../utils/helpers.js'; - -const API_BASE = 'https://vuflix.co'; -const REFERER = 'https://vuflix.co/'; -const ORIGIN = 'https://vuflix.co'; - -let cachedProviders = null; -let lastProvidersFetch = 0; - -const FALLBACK_PROVIDERS = [ - { id: 'vsembed', name: 'Sigma' }, - { id: 'moonflix', name: 'Source 40' }, - { id: 'megasource', name: 'Source 39' }, - { id: 'hdghar', name: 'Source 44' }, - { id: 'moviebox', name: 'Pi' }, - { id: 'cineplay', name: '4K' }, - { id: 'huhu', name: 'Beta' }, - { id: 'bingr', name: 'Upsilon' }, - { id: 'onlyflix', name: 'Gamma' }, - { id: 'vaplayer', name: 'Alpha' }, - { id: 'flixhqz', name: 'Gamma' }, - { id: 'castle', name: 'Source 40' }, - { id: 'cinejoy', name: '4K2' }, - { id: 'filesun', name: 'Tau' }, - { id: 'yoru', name: 'Yoru' }, -]; - -async function getProviders(ua) { - if (cachedProviders && Date.now() - lastProvidersFetch < 900000) { - return cachedProviders; - } - - try { - const res = await fetch(`${API_BASE}/api/player/providers`, { - headers: { - 'User-Agent': ua, - Referer: REFERER, - Origin: ORIGIN, - Accept: 'application/json, text/plain, */*', - }, - signal: AbortSignal.timeout(6000), - }); - - if (res.ok) { - const data = await res.json(); - if (data?.ok && Array.isArray(data.providers)) { - const list = data.providers - .filter(p => p && typeof p.id === 'string' && p.id.trim().length > 0) - .map(p => ({ - id: p.id.trim(), - name: p.publicLabel || p.providerName || p.name || p.id, - })); - - if (list.length > 0) { - cachedProviders = list; - lastProvidersFetch = Date.now(); - return list; - } - } - } - } catch { } - - return FALLBACK_PROVIDERS; -} - -function unwrapUrl(rawUrl, ua) { - const defaultHeaders = { - 'User-Agent': ua, - Referer: REFERER, - Origin: ORIGIN, - }; - - if (!rawUrl || typeof rawUrl !== 'string') { - return { url: '', headers: defaultHeaders }; - } - - if (!rawUrl.includes('v-relay?t=') && !rawUrl.includes('a-relay?t=')) { - return { url: rawUrl, headers: defaultHeaders }; - } - - try { - const parsedUrl = new URL(rawUrl); - const t = parsedUrl.searchParams.get('t'); - if (!t) return { url: rawUrl, headers: defaultHeaders }; - - let b64 = t.replace(/-/g, '+').replace(/_/g, '/'); - while (b64.length % 4 !== 0) { - b64 += '='; - } - - const jsonStr = Buffer.from(b64, 'base64').toString('utf8'); - const parsed = JSON.parse(jsonStr); - - if (parsed && typeof parsed === 'object') { - const directUrl = (parsed.u || '').trim(); - const headersMap = { ...defaultHeaders }; - - if (parsed.h && typeof parsed.h === 'object') { - for (const [key, value] of Object.entries(parsed.h)) { - headersMap[key] = String(value); - } - } - - if (directUrl) { - return { url: directUrl, headers: headersMap }; - } - } - } catch { } - - return { url: rawUrl, headers: defaultHeaders }; -} - -export async function getStream({ id, s, e }) { - const isTv = Boolean(s && e); - const mediaType = isTv ? 'tv' : 'movie'; - const ua = getUA(); - - const baseParams = new URLSearchParams({ - type: mediaType, - tmdbId: String(id), - }); - - if (isTv) { - baseParams.set('season', String(s)); - baseParams.set('episode', String(e)); - } - - const providers = await getProviders(ua); - const seenUrls = new Set(); - const allUrls = []; - - const defaultHeaders = { - 'User-Agent': ua, - Referer: REFERER, - Origin: ORIGIN, - Accept: 'application/json, text/plain, */*', - }; - - const tasks = providers.map(async (prov) => { - try { - const url = `${API_BASE}/api/player/sources?${baseParams.toString()}&provider=${encodeURIComponent(prov.id)}`; - const res = await fetch(url, { - headers: defaultHeaders, - signal: AbortSignal.timeout(8000), - }); - - if (!res.ok) return; - const data = await res.json(); - if (!data?.ok || !Array.isArray(data.sources)) return; - - for (const item of data.sources) { - if (!item || typeof item !== 'object') continue; - - const providerName = item.providerName || item.publicLabel || prov.name; - const primaryRawUrl = (item.url || '').trim(); - const itemType = (item.type || 'hls').toLowerCase(); - const itemLabel = item.label || ''; - - if (Array.isArray(item.qualities) && item.qualities.length > 0) { - for (const q of item.qualities) { - if (!q || typeof q !== 'object') continue; - const qRawUrl = (q.url || '').trim(); - if (!qRawUrl) continue; - - const unwrapped = unwrapUrl(qRawUrl, ua); - if (!unwrapped.url || seenUrls.has(unwrapped.url)) continue; - seenUrls.add(unwrapped.url); - - const qQuality = q.quality || 'Auto'; - allUrls.push({ - url: unwrapped.url, - label: `${providerName} · ${qQuality}`, - headers: unwrapped.headers, - }); - } - } - - if (Array.isArray(item.candidates) && item.candidates.length > 0) { - let candIndex = 1; - for (const c of item.candidates) { - if (!c || typeof c !== 'object') continue; - const cRawUrl = (c.url || '').trim(); - if (!cRawUrl) continue; - - const unwrapped = unwrapUrl(cRawUrl, ua); - if (!unwrapped.url || seenUrls.has(unwrapped.url)) continue; - seenUrls.add(unwrapped.url); - - const cQuality = c.quality || '1080p'; - allUrls.push({ - url: unwrapped.url, - label: `${providerName} · Mirror ${candIndex} · ${cQuality}`, - headers: unwrapped.headers, - }); - candIndex++; - } - } - - if (Array.isArray(item.audioTracks) && item.audioTracks.length > 0) { - for (const a of item.audioTracks) { - if (!a || typeof a !== 'object') continue; - const aRawUrl = (a.switchUrl || a.url || '').trim(); - if (!aRawUrl) continue; - - const unwrapped = unwrapUrl(aRawUrl, ua); - if (!unwrapped.url || seenUrls.has(unwrapped.url)) continue; - seenUrls.add(unwrapped.url); - - const rawLabel = (a.label || a.name || a.language || 'Audio').trim(); - const cleanLabel = rawLabel.replace(/\s*audio\s*$/i, '').trim() || 'Audio'; - - allUrls.push({ - url: unwrapped.url, - label: `${providerName} · ${cleanLabel} Audio`, - headers: unwrapped.headers, - }); - } - } - - if (primaryRawUrl) { - const unwrapped = unwrapUrl(primaryRawUrl, ua); - if (unwrapped.url && !seenUrls.has(unwrapped.url)) { - seenUrls.add(unwrapped.url); - - let displayQuality = item.quality || (itemType === 'mp4' ? 'MP4' : 'HD'); - let cleanLabel = itemLabel || providerName; - let label = cleanLabel.startsWith('[') ? cleanLabel : `${providerName} · ${displayQuality}`; - - allUrls.push({ - url: unwrapped.url, - label, - headers: unwrapped.headers, - }); - } - } - } - } catch { } - }); - - await Promise.all(tasks); - - if (allUrls.length === 0) return null; - - return { - url: allUrls[0].url, - allUrls, - headers: allUrls[0].headers, - }; -} \ No newline at end of file diff --git a/test/index.js b/test/index.js index 7946b74..453cc6c 100644 --- a/test/index.js +++ b/test/index.js @@ -13,7 +13,7 @@ const CONFIG = { TV_ID: "37854", // TV TMDB ID to test, for anime I recommend using a random ID like 37854 TV_SEASON: "1", // TV Season to test TV_EPISODE: "1", // TV Episode to test - STREAM_SOURCE: "", // Source key to test + STREAM_SOURCE: "dulo", // Source key to test TEST_SUBTITLE: false, // Toggle subtitle testing TEST_DOWNLOAD: false, // Toggle download testing