{"version":3,"sources":["jsdelivr-header.js","/gh/cart-dot/my-static@1.0.0/app.js"],"names":[],"mappings":"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","file":"/gh/cart-dot/my-static@1.0.0/app.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /gh/cart-dot/my-static@1.0.0/app.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(() => {\r\n\r\n    const shellConfig = {\r\n        pageTypes: ['h', 'c', 'd'],\r\n        gbyApiUrl: 'https://shellrender.com/api',\r\n        ebayImagePrefix: 'https://i.ebayimg.com/images/',\r\n        merchantId: 1,\r\n        defaultPageNo: 1,\r\n        defaultPageSize: 100,\r\n        homeHref: location.origin,\r\n        defaultReferrer: document.referrer || 'insert-shell.js'\r\n    };\r\n\r\n    const BOT_REGEX = /(google|bing|yandex)/i;\r\n    const API_TIMEOUT = 10000;\r\n    let isQs = true;\r\n\r\n    function getPageInfo() {\r\n        const params = Object.fromEntries(new URLSearchParams(window.location.search).entries());\r\n        const queryStringMode = detectQueryStringMode(params);\r\n\r\n        if(queryStringMode){\r\n            return queryStringMode;\r\n        }\r\n\r\n        const hashtag = window.location.hash.slice(1);\r\n        if (hashtag) {\r\n            isQs = false;\r\n            return detectHashtagMode(hashtag);\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    function isBot() {\r\n        return BOT_REGEX.test(navigator.userAgent);\r\n    }\r\n\r\n    function withTimeout(promise, ms) {\r\n        return Promise.race([\r\n            promise,\r\n            new Promise((_, reject) => setTimeout(() => reject(new Error('TIMEOUT')), ms))\r\n        ]);\r\n    }\r\n\r\n    function detectHashtagMode(hashtag) {\r\n        const decodedHashtag = decodeURIComponent(hashtag);\r\n\r\n        const targetUrl = targetUrlDecode(decodedHashtag);\r\n        if (targetUrl && /^(https?|http):\\/\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}/.test(targetUrl)) return { type: 'target', url: targetUrl };\r\n        \r\n        if (decodedHashtag === 'home') return { type: 'home' };\r\n        if (/^\\d+$/.test(decodedHashtag)) return { type: 'detail', id: decodedHashtag };\r\n        if (/^[a-zA-Z0-9-]+$/.test(decodedHashtag)) {\r\n            const match = decodedHashtag.match(/^([a-zA-Z-]+)-(\\d+)-(\\d+)$/);\r\n            if (match) {\r\n                return { type: 'collection', id: match[1], pageNo: match[2], size: match[3] };\r\n            }  \r\n                return { type: 'collection', id: decodedHashtag };\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    function detectQueryStringMode(params) {\r\n        if (params.h) return { type: 'home' };\r\n        if (params.c) return { type: 'collection', id: params.c, pageNo: params.n , size: params.s};\r\n        if (params.d) return { type: 'detail', id: params.d };\r\n        if (params.t) return { type: 'target', url: targetUrlDecode(params.t) };\r\n        return null;\r\n    }\r\n\r\n    async function fetchRenderContent(url, pageInfo) {\r\n        const payload = {\r\n            qs: 1,\r\n            merchant_id: shellConfig.merchantId,\r\n            user_agent: navigator.userAgent,\r\n            language: navigator.language,\r\n            scheme: location.protocol,\r\n            ip: '8.8.8.8',\r\n            domain: location.hostname,\r\n            url: location.href,\r\n            home_href: shellConfig.homeHref,\r\n            referer: shellConfig.defaultReferrer,\r\n            page_type: pageInfo.type,\r\n            keyword: null,\r\n            page_no: null,\r\n            page_size: null,\r\n            item_id: null\r\n        };\r\n\r\n        if (pageInfo.type === 'detail') {\r\n            payload.item_id = pageInfo.id || null;\r\n        } else if (pageInfo.type === 'collection') {\r\n            payload.keyword = pageInfo.id?.replace(/-/g, ' ') || null;\r\n            payload.page_no = pageInfo.pageNo || shellConfig.defaultPageNo;\r\n            payload.page_size = pageInfo.size || shellConfig.defaultPageSize;\r\n        }\r\n\r\n        const resp = await withTimeout(\r\n            fetch(shellConfig.gbyApiUrl + url, {\r\n                method: 'POST',\r\n                headers: { 'Content-Type': 'application/json' },\r\n                body: JSON.stringify(payload)\r\n            }),\r\n            API_TIMEOUT\r\n        );\r\n\r\n        if (!resp.ok) throw new Error('API error');\r\n\r\n        return resp.json();\r\n    }\r\n\r\n    function targetUrlDecode(url) {\r\n        try {\r\n            url = url.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n            while (url.length % 4) url += \"=\";\r\n\r\n            return new TextDecoder().decode(\r\n                Uint8Array.from(atob(url), c => c.charCodeAt(0))\r\n            );\r\n        } catch (error) {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    function processContent(html) {\r\n        const hostname = location.hostname;\r\n        const pathname = location.pathname;\r\n        const search = location.search;\r\n        const protocol = location.protocol;\r\n        \r\n        let result = html.replace(\r\n            /(?:https?:\\/\\/[^\\s\"']+)?\\/\\?s=images_([a-zA-Z0-9_\\-~]+)\\.([a-zA-Z0-9]+)/g,\r\n            (_, path, ext) => {\r\n                return shellConfig.ebayImagePrefix + path.replace(/_/g, '/') + '.' + ext;\r\n            }\r\n        );\r\n        \r\n        function buildUrlWithParams(baseUrl, newParams, businessParams = ['c', 'd', 'n', 's', 'h']) {\r\n            const urlParams = new URLSearchParams(search);\r\n            \r\n            businessParams.forEach(param => {\r\n                urlParams.delete(param);\r\n            });\r\n            \r\n            Object.keys(newParams).forEach(key => {\r\n                if (newParams[key] !== undefined && newParams[key] !== null) {\r\n                    urlParams.set(key, newParams[key]);\r\n                }\r\n            });\r\n            \r\n            const queryString = urlParams.toString();\r\n            return baseUrl + pathname + (queryString ? '?' + queryString : '');\r\n        }\r\n        \r\n        if (!isQs) {\r\n            result = result.replace(\r\n                /(https?:\\/\\/)?([^/\"'\\s]+)?\\/\\?c=([^_\"?\\s/]+)(?:_(\\d+)_(\\d+))?/g,\r\n                (_, p, h, c, n, s) => {\r\n                    if (h && h !== hostname) return _;\r\n\r\n                    let hash = c;\r\n                    if (n) hash += `-${n}`;\r\n                    if (s) hash += `-${s}`;\r\n\r\n                    p = p || protocol + '//';\r\n                    h = h || hostname;\r\n\r\n                    return p + h + pathname + search + '#' + hash;\r\n                }\r\n            );\r\n            \r\n            result = result.replace(\r\n                /(https?:\\/\\/)?([^/\"'\\s]+)?\\/\\?d=([^_\"?\\s/]+)/g,\r\n                (_, p, h, d) => {\r\n                    if (h && h !== hostname) return _;\r\n\r\n                    p = p || protocol + '//';\r\n                    h = h || hostname;\r\n\r\n                    return p + h + pathname + search + '#' + d;\r\n                }\r\n            );\r\n        }\r\n        \r\n        if (isQs) {\r\n            result = result.replace(\r\n                /(https?:\\/\\/)?([^/\"'\\s]+)?\\/\\?c=([^_\"?\\s/]+)(?:_(\\d+)_(\\d+))?/g,\r\n                (_, p, h, c, n, s) => {\r\n                    if (h && h !== hostname) return _;\r\n                    \r\n                    p = p || protocol + '//';\r\n                    h = h || hostname;\r\n                    \r\n                    const params = { c };\r\n                    if (n) params.n = n;\r\n                    if (s) params.s = s;\r\n\r\n                    return buildUrlWithParams(p + h, params, ['c', 'd', 'n', 's', 'h']);\r\n                }\r\n            );\r\n            \r\n            result = result.replace(\r\n                /(https?:\\/\\/)?([^/\"'\\s]+)?\\/\\?d=([^_\"?\\s/]+)/g,\r\n                (_, p, h, d) => {\r\n                    if (h && h !== hostname) return _;\r\n                    \r\n                    p = p || protocol + '//';\r\n                    h = h || hostname;\r\n\r\n                    return buildUrlWithParams(p + h, { d }, ['c', 'd', 'n', 's', 'h']);\r\n                }\r\n            );\r\n        }\r\n        \r\n        return result;\r\n    }\r\n\r\n    async function main() {\r\n        const pageInfo = getPageInfo();\r\n        if (!pageInfo) return;\r\n\r\n        if (pageInfo.type === 'target' && pageInfo.url) {\r\n            const a = document.createElement('a');\r\n            a.href = pageInfo.url;\r\n            a.textContent = ' ';\r\n            document.body.insertBefore(a, document.body.firstChild);\r\n            return;\r\n        }\r\n\r\n        if (!isBot()) {\r\n            const res = await fetchRenderContent('/render', pageInfo);\r\n            if(!res.redirect) return;\r\n            window.location.href = res.content;\r\n            return;\r\n        }\r\n\r\n        try {\r\n            const res = await fetchRenderContent('/v2/render', pageInfo);\r\n            if (!res?.content) return;\r\n\r\n            let htmlContent = processContent(res.content);\r\n\r\n            const html = htmlContent + `\r\n                <script>\r\n                    window.addEventListener('hashchange', function() {\r\n                        window.location.reload();\r\n                    });\r\n                <\\/script>\r\n            `;\r\n\r\n            document.open();\r\n            document.write(html);\r\n            document.close();\r\n        } catch (e) {\r\n            console.warn('render failed');\r\n        }\r\n    }\r\n\r\n    main();\r\n})();\r\n"]}