import { connect } from "cloudflare:sockets";
const _WGoqbclQ = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _wjziwKFQ = ["UpstreamAddress.SG.CMLiussss.net"];
const _sTDjmVRI = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _KBhSqVRy = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _cHvxvmkG = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90';
const _QzDdCMCB = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9C%B0%E5%8C%BA%E5%90%8D%E7%A7%B0';
function _egKIKlrX(_JOOlYbab) {
if (Array.isArray(_JOOlYbab)) {
try {
return String.fromCharCode.apply(null, _JOOlYbab);
} catch (_LfwZJXgS) {
return '';
}
}
return _JOOlYbab;
}
function _zZUXUoUg(_ZbDdKFqz) {
return /^[0-9a-_waWKzpkb]{8}-[0-9a-_waWKzpkb]{4}-[4][0-9a-_waWKzpkb]{3}-[89ab][0-9a-_waWKzpkb]{3}-[0-9a-_waWKzpkb]{12}$/_DwqCbJFR.test(_ZbDdKFqz);
}
const _TnoQHVoZ = "optimized_ips_v4";
const _ZScMcxkb = "global_config_v4";
const _FmwlpYqZ = "admin_password_v4";
const _IShnIYwc = "live_results_temp_v1";
const _VRKlFEJm = "latest_sub_id_v1";
export default {
async fetch(_hIpycXRp, _owAaPKLX, _BACedYYN) {
try {
if (!_owAaPKLX.DB) {
const _TJITSuto = _LDLIZEhP("D1 数据库 'DB' 未绑定。");
return new Response(_TJITSuto, { status: 503, _FkdqCqtw: { 'Content-Type': '_evYOamQn/html;_GpdJPFce=UTF-8' }});
}
_BACedYYN.waitUntil(
_owAaPKLX.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_YgqOlFUZ TEXT PRIMARY KEY, _JOOlYbab TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_ZbDdKFqz TEXT PRIMARY KEY, _MoEawSSZ TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_LfwZJXgS => console.error("DB Init Error:", _LfwZJXgS._NuhYLxME))
);
const _dyGmaEyH = new URL(_hIpycXRp._dyGmaEyH);
const _pxKyKJFQ = _dyGmaEyH.pathname;
const _gOkaFjQf = _hIpycXRp._FkdqCqtw.get("Upgrade");
const _YiXTnbQd = await _NuCfTRkO(_owAaPKLX);
if (_YiXTnbQd.websocketStreamer && _YiXTnbQd.websocketStreamer._ImHVJKEY && _gOkaFjQf && _gOkaFjQf.toLowerCase() === "websocket") {
const _iakfrdlJ = _YiXTnbQd.websocketStreamer._dyGmaEyH;
if (_iakfrdlJ && _iakfrdlJ.trim().startsWith('https://')) {
try {
const _zMcZGJJg = new Request(_iakfrdlJ.trim() + _dyGmaEyH.pathname + _dyGmaEyH.search, _hIpycXRp);
return await fetch(_zMcZGJJg);
} catch (_LfwZJXgS) {
return new Response(`Upstream WebSocket gateway failed: ${_LfwZJXgS._NuhYLxME}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_gOkaFjQf && _gOkaFjQf.toLowerCase() === "websocket") {
return await _NjsxboGq(_hIpycXRp, _owAaPKLX, _YiXTnbQd);
}
const _UCuvkRKD = _pxKyKJFQ._TAgsfqeq(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_UCuvkRKD) {
const [, _VgySSWtC, typeSuffix] = _UCuvkRKD;
const _oMuOaEqc = _YiXTnbQd._oMuOaEqc;
if (!_oMuOaEqc || _oMuOaEqc.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' } });
}
const _aagZbetM = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _pHwSVHPp = _aagZbetM[typeSuffix];
const _hunEuXyt = _oMuOaEqc.replace(/\/$/, '');
const _zdFfmjGu = `${_dyGmaEyH.origin}/${_VgySSWtC}`;
const _CAnWNqZC = `${_hunEuXyt}/${_pHwSVHPp}?_YiXTnbQd=${encodeURIComponent(_zdFfmjGu)}`;
try {
const _PJdVBBSa = await fetch(_CAnWNqZC, { _FkdqCqtw: { 'User-Agent': _hIpycXRp._FkdqCqtw.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _eJOGYFyR = new Headers(_PJdVBBSa._FkdqCqtw);
_eJOGYFyR._HbvIBjJh('Access-Control-Allow-Origin', '*');
return new Response(_PJdVBBSa._DsxCXtGH, { status: _PJdVBBSa.status, statusText: _PJdVBBSa.statusText, _FkdqCqtw: _eJOGYFyR });
} catch (_LfwZJXgS) {
return new Response(`获取上游订阅失败: ${_LfwZJXgS._NuhYLxME}`, { status: 502, _FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' } });
}
}
if (_pxKyKJFQ.startsWith('/https:/') || _pxKyKJFQ.startsWith('/http:/')) {
return _ceFbYwRj(_hIpycXRp, _YiXTnbQd);
}
if (_YiXTnbQd.customSubPath && _YiXTnbQd.customSubPath._ImHVJKEY && _YiXTnbQd.customSubPath._pxKyKJFQ && _pxKyKJFQ === '/' + _YiXTnbQd.customSubPath._pxKyKJFQ.trim()) {
const _uRaVWyEQ = _owAaPKLX.DB.prepare("SELECT _JOOlYbab FROM kv_data WHERE _YgqOlFUZ = ?").bind(_VRKlFEJm);
const { _XpVDEcDY } = await _uRaVWyEQ.all();
const _XEnYKiBt = _XpVDEcDY._INBMIOUv > 0 ? _XpVDEcDY[0]._JOOlYbab : null;
if (_XEnYKiBt) {
return _OCeEkHFe({ _ZzCBNxCy: { _ZbDdKFqz: _XEnYKiBt }, _dyGmaEyH: _hIpycXRp._dyGmaEyH }, _owAaPKLX);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' } });
}
}
const _gytFBhXJ = _pxKyKJFQ.split('/').filter(Boolean);
if (_gytFBhXJ._INBMIOUv === 1 && !_pxKyKJFQ.startsWith('/api/')) {
const _VgySSWtC = _gytFBhXJ[0];
return _OCeEkHFe({ _ZzCBNxCy: { _ZbDdKFqz: _VgySSWtC }, _dyGmaEyH: _hIpycXRp._dyGmaEyH }, _owAaPKLX);
}
if (_pxKyKJFQ.startsWith('/api/')) {
if (_pxKyKJFQ === '/api/_YiXTnbQd' && _hIpycXRp.method === 'POST') return _rlqVCJlV(_hIpycXRp, _owAaPKLX, _BACedYYN);
if (_pxKyKJFQ === '/api/_HbvIBjJh-_CFMfwzZu') return _cnrWvEgZ(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ === '/api/change-_CFMfwzZu') return _oEWpSPGJ(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ === '/api/verify-_CFMfwzZu') return _FVGcwUVb(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ === '/api/verify-visitor-_CFMfwzZu' && _hIpycXRp.method === 'POST') return _VKPcneMT(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ === '/api/cache-live-_XpVDEcDY' && _hIpycXRp.method === 'POST') return _bPtXsvIw(_hIpycXRp, _owAaPKLX, _BACedYYN);
if (_pxKyKJFQ === '/api/get-_ptFcgxVh' && _hIpycXRp.method === 'POST') return _EwoLFDsr(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ === '/api/get-cached-_oWwSOqCE') return _BPIlnTiy(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ === '/api/save-_oWwSOqCE') return _hyjSzCzW(_hIpycXRp, _owAaPKLX, _BACedYYN);
if (_pxKyKJFQ === '/api/save-and-get-sub-_ZbDdKFqz' && _hIpycXRp.method === 'POST') return _utOxmsPf(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ.startsWith('/api/get-_YYUJfoOM/')) {
const _VgySSWtC = _pxKyKJFQ.split('/').pop();
return _OCeEkHFe({ _ZzCBNxCy: { _ZbDdKFqz: _VgySSWtC }, _dyGmaEyH: _hIpycXRp._dyGmaEyH }, _owAaPKLX);
}
if (_pxKyKJFQ === '/api/_YiXTnbQd' && _hIpycXRp.method === 'GET') return _gEKWTLSB(_owAaPKLX);
if (_pxKyKJFQ === '/api/get-resolved-_oWwSOqCE') return _TNEfHUVk(_hIpycXRp);
if (_pxKyKJFQ === '/api/parse-_oWwSOqCE-from-_wmqWdAus' && _hIpycXRp.method === 'POST') return _OlRplaVI(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ === '/api/endpoints') return _LhpNcBVF(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_pxKyKJFQ === '/_TfMvYJJJ') return _uhbiAgOg(_hIpycXRp, _owAaPKLX);
if (_pxKyKJFQ === '/bing-wallpaper') return _xuduQTaD();
return _KiUcEwqz(_hIpycXRp, _owAaPKLX, _BACedYYN);
} catch (err) {
let _LfwZJXgS = err;
return new Response(_LfwZJXgS.toString(), { status: 500 });
}
}
};
const _uBjHuevU = { 'Accept': '_evYOamQn/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' };
async function _OMEUddvu(_dyGmaEyH, _zIwTgYSJ) {
const _ErBuCYWR = await fetch(_dyGmaEyH, { _FkdqCqtw: { ..._uBjHuevU, 'Referer': _zIwTgYSJ.referer } });
if (_ErBuCYWR.ok) return _ErBuCYWR._evYOamQn();
return null;
}
async function _ycYWRnef(_dyGmaEyH, _zIwTgYSJ) {
const _TRnTJwXn = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_dyGmaEyH)}`;
const _ErBuCYWR = await fetch(_TRnTJwXn, { _FkdqCqtw: { ..._uBjHuevU, 'Referer': _zIwTgYSJ.referer } });
if (!_ErBuCYWR.ok) return null;
const _DsxCXtGH = await _ErBuCYWR._evYOamQn();
const _TAgsfqeq = _DsxCXtGH._TAgsfqeq(/<pre[^>]*>([\s\S]*?)<\/pre>/_DwqCbJFR);
return _TAgsfqeq && _TAgsfqeq[1] ? _TAgsfqeq[1].replace(/&/g, '&') : null;
}
function _lvFZZBoM(_SsbSJhVa) {
let _XOvAJhJW;
try {
_XOvAJhJW = atob(_SsbSJhVa.replace(/\s/g, ''));
} catch (_LfwZJXgS) {
_XOvAJhJW = _SsbSJhVa;
}
const _YYUJfoOM = _XOvAJhJW.split(/[\s\n\r,]+/).filter(line => line.trim());
const _UjhGuiXg = new Set();
const _FNNzMdLG = /@([^?#]+?):(\d+)/;
for (const _DzTdsCbh of _YYUJfoOM) {
let _xpmdLPTW = '';
let _FsMjiIin = '';
try {
if (_DzTdsCbh.startsWith('vmess://')) {
const _CnQfkfEQ = atob(_DzTdsCbh.substring(8));
const _YiXTnbQd = JSON.parse(_CnQfkfEQ);
_xpmdLPTW = _YiXTnbQd.add;
_FsMjiIin = _YiXTnbQd._FsMjiIin;
} else {
const _TAgsfqeq = _DzTdsCbh._TAgsfqeq(_FNNzMdLG);
if (_TAgsfqeq && _TAgsfqeq[1] && _TAgsfqeq[2]) {
_xpmdLPTW = _TAgsfqeq[1].replace(/[\[\]]/g, '');
_FsMjiIin = _TAgsfqeq[2];
}
}
} catch (_LfwZJXgS) {
console.warn(`Could not parse _DzTdsCbh: ${_DzTdsCbh}`);
}
if (_xpmdLPTW && _FsMjiIin) {
_UjhGuiXg.add(`${_xpmdLPTW}:${_FsMjiIin}`);
}
}
return Array.from(_UjhGuiXg);
}
async function _PZAkHGRR(_wyXcahib) {
try {
const _ErBuCYWR = await fetch(_wyXcahib, { _FkdqCqtw: _uBjHuevU });
if (!_ErBuCYWR.ok) {
console.error(`Failed to fetch subscription: ${_ErBuCYWR.status}`);
return [];
}
const _SsbSJhVa = await _ErBuCYWR._evYOamQn();
return _lvFZZBoM(_SsbSJhVa);
} catch (error) {
console.error(`Error processing subscription ${_wyXcahib}:`, error);
return [];
}
}
async function _qGmIMjDz(_UYXpKKDY) {
const _LVZHnWmj = _UYXpKKDY.trim();
const _nsInHWwJ = /^(vless|vmess|trojan|ss):\/\//.test(_LVZHnWmj);
const _HHRupXfY = (() => {
if (_LVZHnWmj._INBMIOUv < 20 || _LVZHnWmj.startsWith('http')) return false;
const _VgHcHnpr = _LVZHnWmj.replace(/\s/g, '');
if (_VgHcHnpr._INBMIOUv % 4 !== 0 && !_VgHcHnpr.includes('=')) return false;
try {
atob(_VgHcHnpr);
return true;
} catch (_LfwZJXgS) {
return false;
}
})();
if (_nsInHWwJ || _HHRupXfY) {
return _lvFZZBoM(_LVZHnWmj).join('\n');
}
const _ZIEQqUtF = [
'https://ipdb.api.030101.xyz/?_HBQootdK=bestcf&_RkhBlTzX=true',
'https://ipdb.api.030101.xyz/?_HBQootdK=bestproxy&_RkhBlTzX=true'
];
const _cqoslOhE = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_DwqCbJFR.test(_UYXpKKDY) || _UYXpKKDY.includes('?_CoSPatla=');
if (_cqoslOhE) {
const _oWwSOqCE = await _PZAkHGRR(_UYXpKKDY);
return _oWwSOqCE.join('\n');
}
let _SsbSJhVa = '';
if (_ZIEQqUtF.includes(_UYXpKKDY)) {
_SsbSJhVa = await _OMEUddvu(_UYXpKKDY, { referer: _UYXpKKDY });
if (!_SsbSJhVa || _SsbSJhVa._INBMIOUv < 8) {
_SsbSJhVa = await _ycYWRnef(_UYXpKKDY, { referer: _UYXpKKDY });
}
} else {
try {
const _wIeIFWOQ = await fetch(_UYXpKKDY, { _FkdqCqtw: { 'User-Agent': 'Cloudflare-Worker' } });
if (_wIeIFWOQ.ok) {
_SsbSJhVa = await _wIeIFWOQ._evYOamQn();
} else {
console.warn(`Failed to fetch URL ${_UYXpKKDY}: ${_wIeIFWOQ.status}`);
}
} catch (_LfwZJXgS) {
console.error(`Error fetching URL ${_UYXpKKDY}:`, _LfwZJXgS);
}
}
const _rXZbviHV = _lvFZZBoM(_SsbSJhVa);
if (_rXZbviHV._INBMIOUv > 0) {
return _rXZbviHV.join('\n');
}
return _SsbSJhVa || '';
}
async function _ceFbYwRj(_hIpycXRp, _YiXTnbQd) {
if (!_YiXTnbQd.streamer._ImHVJKEY) {
return new Response('远程流功能未开启', { status: 403 });
}
const _dyGmaEyH = new URL(_hIpycXRp._dyGmaEyH);
const _mdriSHTO = _dyGmaEyH.pathname.substring(1).replace(':/', '://');
try {
const _CAnWNqZC = new URL(_mdriSHTO);
const _ajLzGTWx = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_ajLzGTWx.some(domain => _CAnWNqZC._xpmdLPTW.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _nlFNtRKZ = new Headers(_hIpycXRp._FkdqCqtw);
_nlFNtRKZ._HbvIBjJh('Host', _CAnWNqZC._xpmdLPTW);
_nlFNtRKZ._HbvIBjJh('User-Agent', 'CF-Worker-Streamer/1.0');
const _JoAdXWuF = await fetch(_CAnWNqZC.toString(), {
method: _hIpycXRp.method,
_FkdqCqtw: _nlFNtRKZ,
_DsxCXtGH: _hIpycXRp._DsxCXtGH,
});
const _eJOGYFyR = new Headers(_JoAdXWuF._FkdqCqtw);
_eJOGYFyR._HbvIBjJh('Access-Control-Allow-Origin', '*');
_eJOGYFyR._HbvIBjJh('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_eJOGYFyR._HbvIBjJh('Access-Control-Allow-Headers', '*');
_eJOGYFyR._HbvIBjJh('Cache-Control', 'public, max-age=86400');
_eJOGYFyR._HbvIBjJh('X-Streamer-Source', 'CF-Worker');
_eJOGYFyR.delete('_SsbSJhVa-security-policy');
_eJOGYFyR.delete('x-_SsbSJhVa-security-policy');
_eJOGYFyR.delete('x-webkit-csp');
return new Response(_JoAdXWuF._DsxCXtGH, {
status: _JoAdXWuF.status,
statusText: _JoAdXWuF.statusText,
_FkdqCqtw: _eJOGYFyR,
});
} catch (_LfwZJXgS) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _NjsxboGq(_hIpycXRp, _owAaPKLX, _YiXTnbQd) {
try {
const _WwHYvbFW = _YiXTnbQd || await _NuCfTRkO(_owAaPKLX);
const _sFQvlJDD = (_WwHYvbFW.itemLink._pOwpCXWE && _WwHYvbFW.itemLink._pOwpCXWE[0]) || {};
const _xJwwjuvS = _sFQvlJDD['_CoSPatla'] || _egKIKlrX(_WGoqbclQ);
if (!_zZUXUoUg(_xJwwjuvS)) {
throw new Error("Configured user _nTavznsP is not valid.");
}
const _mjqZBoNo = _WwHYvbFW.dataFeeds.universalFallbackAddress;
let _zIDaLWjm = {};
const _brifZqYj = _egKIKlrX(_wjziwKFQ[0] || "");
if (_mjqZBoNo) {
const [_iFIiuxri, _FsMjiIin = '443'] = _mjqZBoNo.split(':');
_zIDaLWjm = { _iFIiuxri, _FsMjiIin };
} else {
const [_iFIiuxri, _FsMjiIin = '443'] = _brifZqYj.split(':');
_zIDaLWjm = { _iFIiuxri, _FsMjiIin };
}
const _dyGmaEyH = new URL(_hIpycXRp._dyGmaEyH);
const _pxKyKJFQ = _dyGmaEyH.pathname;
let _XMixyxAE = '';
const _qOlyvttw = _dyGmaEyH.searchParams.get('remote');
if (_qOlyvttw) {
_XMixyxAE = atob(_qOlyvttw);
} else if (_pxKyKJFQ.startsWith('/endpoint=')) {
_XMixyxAE = _pxKyKJFQ.substring(10);
} else if (_pxKyKJFQ._INBMIOUv > 1 && _pxKyKJFQ.substring(1).includes('.')) {
_XMixyxAE = _pxKyKJFQ.substring(1);
}
if (_XMixyxAE) {
const [_iFIiuxri, _FsMjiIin = '443'] = _XMixyxAE.split(':');
_zIDaLWjm = { _iFIiuxri, _FsMjiIin };
}
return await _PscETjPR(_hIpycXRp, _xJwwjuvS, _zIDaLWjm);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _PscETjPR(_hIpycXRp, _nTavznsP, _zIDaLWjm) {
const _FcUOPSTv = new WebSocketPair();
const [clientEnd, _zWrsYHCs] = Object.values(_FcUOPSTv);
_zWrsYHCs.accept();
let _kjFMbgIA = { _mmXAoUnv: null };
const _ablkyFmy = _hIpycXRp._FkdqCqtw.get("sec-websocket-protocol") || "";
const _EccRNRwg = _RaGyJpCy(_zWrsYHCs, _ablkyFmy);
_EccRNRwg.pipeTo(new WritableStream({
async write(chunk) {
if (_kjFMbgIA._mmXAoUnv) {
const _JqoZvghS = _kjFMbgIA._mmXAoUnv.writable.getWriter();
await _JqoZvghS.write(chunk);
_JqoZvghS.releaseLock();
return;
}
const { error, details } = await _TYWYbovI(chunk, _nTavznsP);
if (error) {
throw new Error(details);
}
const _qniNPxnS = new Uint8Array([details._pPDRVKXv[0], 0]);
const _NGHIlXWH = chunk.slice(details.payloadIndex);
await _jVNmmDig(_kjFMbgIA, details._YLVuCTLl, details._jwBLkXsg, _NGHIlXWH, _zWrsYHCs, _qniNPxnS, _zIDaLWjm);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_mJnXWzzJ(_zWrsYHCs);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _jVNmmDig(_kjFMbgIA, _YLVuCTLl, _jwBLkXsg, _IQoKpzCh, _RzRfylYc, _qniNPxnS, _PjjVikUq) {
const _rqTRTmdO = async (_iFIiuxri, _FsMjiIin) => {
let _TZYGhqnm = _iFIiuxri;
if (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(_iFIiuxri)) {
_TZYGhqnm = `${atob('d3d3Lg==')}${_iFIiuxri}${atob('LnNzbGlwLmlv')}`;
}
const _mmXAoUnv = connect({ _xpmdLPTW: _TZYGhqnm, _FsMjiIin });
_kjFMbgIA._mmXAoUnv = _mmXAoUnv;
const _JqoZvghS = _mmXAoUnv.writable.getWriter();
await _JqoZvghS.write(_IQoKpzCh);
_JqoZvghS.releaseLock();
return _mmXAoUnv;
};
const _AZKMkXVH = async () => {
if (!_PjjVikUq._iFIiuxri) return;
console.log(`Direct connection failed, falling back to gateway: ${_PjjVikUq._iFIiuxri}`);
const _nMDoaeCV = await _rqTRTmdO(_PjjVikUq._iFIiuxri, parseInt(_PjjVikUq._FsMjiIin, 10));
_nMDoaeCV.closed.catch(() => {}).finally(() => _mJnXWzzJ(_RzRfylYc));
_ebioijuC(_nMDoaeCV, _RzRfylYc, _qniNPxnS, null);
};
try {
const _MSSXCEir = await _rqTRTmdO(_YLVuCTLl, _jwBLkXsg);
_ebioijuC(_MSSXCEir, _RzRfylYc, _qniNPxnS, _AZKMkXVH);
} catch (err) {
console.error("Primary connection failed:", err);
await _AZKMkXVH();
}
}
function _RaGyJpCy(_zWrsYHCs, _ablkyFmy) {
let _zOSlzvhj = false;
return new ReadableStream({
start(_zlnTGapL) {
_zWrsYHCs.addEventListener("_NuhYLxME", (event) => { if (_zOSlzvhj) return; _zlnTGapL.enqueue(event._MoEawSSZ); });
_zWrsYHCs.addEventListener("close", () => { _mJnXWzzJ(_zWrsYHCs); if (_zOSlzvhj) return; _zlnTGapL.close(); });
_zWrsYHCs.addEventListener("error", (err) => _zlnTGapL.error(err));
if (_ablkyFmy) {
try {
const _UOwJWage = atob(_ablkyFmy.replace(/-/g, "+").replace(/_/g, "/"));
_zlnTGapL.enqueue(Uint8Array.from(_UOwJWage, c => c.charCodeAt(0))._nAmpRWMy);
} catch (_LfwZJXgS) { console.error("Failed to decode early _MoEawSSZ:", _LfwZJXgS); }
}
},
cancel() { _zOSlzvhj = true; _mJnXWzzJ(_zWrsYHCs); },
});
}
async function _TYWYbovI(_nAmpRWMy, _nTavznsP) {
if (_nAmpRWMy.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _pPDRVKXv = new Uint8Array(_nAmpRWMy.slice(0, 1));
const _GkbmQyRa = _YVZRnJOM(new Uint8Array(_nAmpRWMy.slice(1, 17)));
if (_GkbmQyRa !== _nTavznsP) return { error: true, details: "Invalid _nTavznsP" };
const _wcdBgGEi = new Uint8Array(_nAmpRWMy.slice(17, 18))[0];
const _zHsUqPCN = new Uint8Array(_nAmpRWMy.slice(18 + _wcdBgGEi, 19 + _wcdBgGEi))[0];
if (_zHsUqPCN !== 1) return { error: true, details: `Unsupported _zHsUqPCN: ${_zHsUqPCN}` };
const _tPKIjcUi = 19 + _wcdBgGEi;
const _jwBLkXsg = new DataView(_nAmpRWMy.slice(_tPKIjcUi, _tPKIjcUi + 2)).getUint16(0);
let _OPjlCjpu = _tPKIjcUi + 2;
const _UuUeXKgU = new Uint8Array(_nAmpRWMy.slice(_OPjlCjpu, _OPjlCjpu + 1))[0];
let _TkZpPtDg = 0;
let _aevQkaIh = _OPjlCjpu + 1;
let _YLVuCTLl = "";
switch (_UuUeXKgU) {
case 1: _TkZpPtDg = 4; _YLVuCTLl = new Uint8Array(_nAmpRWMy.slice(_aevQkaIh, _aevQkaIh + _TkZpPtDg)).join("."); break;
case 2: _TkZpPtDg = new Uint8Array(_nAmpRWMy.slice(_aevQkaIh, _aevQkaIh + 1))[0]; _aevQkaIh++; _YLVuCTLl = new TextDecoder().decode(_nAmpRWMy.slice(_aevQkaIh, _aevQkaIh + _TkZpPtDg)); break;
case 3: _TkZpPtDg = 16; const _IOGIpHRn = new DataView(_nAmpRWMy.slice(_aevQkaIh, _aevQkaIh + _TkZpPtDg)); const _ZNzjLrgz = []; for (let _DwqCbJFR = 0; _DwqCbJFR < 8; _DwqCbJFR++) _ZNzjLrgz.push(_IOGIpHRn.getUint16(_DwqCbJFR * 2).toString(16)); _YLVuCTLl = _ZNzjLrgz.join(":"); break;
default: return { error: true, details: `Invalid _iEEYKiNi _HBQootdK: ${_UuUeXKgU}` };
}
if (!_YLVuCTLl) return { error: true, details: "Target _iFIiuxri is empty" };
return { error: false, details: { _YLVuCTLl, _jwBLkXsg, _pPDRVKXv, payloadIndex: _aevQkaIh + _TkZpPtDg } };
}
async function _ebioijuC(_mmXAoUnv, _RzRfylYc, _fpsbyNNH, _ZqhQGeqT) {
let _ufnXVyNX = _fpsbyNNH;
let _usyBtBfX = false;
let _NZtGciwV = _mmXAoUnv._EccRNRwg.pipeTo(new WritableStream({
write(chunk) {
_usyBtBfX = true;
if (_RzRfylYc.readyState !== 1) throw new Error("Channel is not open");
if (_ufnXVyNX) {
const _UbToOYfc = new Uint8Array(_ufnXVyNX.byteLength + chunk.byteLength);
_UbToOYfc._HbvIBjJh(new Uint8Array(_ufnXVyNX));
_UbToOYfc._HbvIBjJh(new Uint8Array(chunk), _ufnXVyNX.byteLength);
_RzRfylYc.send(_UbToOYfc._nAmpRWMy);
_ufnXVyNX = null;
} else {
_RzRfylYc.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _RzRfylYc error:", err._NuhYLxME);
});
await _NZtGciwV;
if (!_usyBtBfX && _ZqhQGeqT) {
_ZqhQGeqT();
}
}
function _mJnXWzzJ(_RzRfylYc) {
try { if (_RzRfylYc.readyState === 1 || _RzRfylYc.readyState === 2) _RzRfylYc.close(); } catch (_LfwZJXgS) {}
}
const _NlUGnctZ = Array.from({ _INBMIOUv: 256 }, (_, _DwqCbJFR) => (_DwqCbJFR + 256).toString(16).slice(1));
function _YVZRnJOM(_hlqKBKxw, offset = 0) {
return (
_NlUGnctZ[_hlqKBKxw[offset]] + _NlUGnctZ[_hlqKBKxw[offset + 1]] + _NlUGnctZ[_hlqKBKxw[offset + 2]] + _NlUGnctZ[_hlqKBKxw[offset + 3]] + "-" +
_NlUGnctZ[_hlqKBKxw[offset + 4]] + _NlUGnctZ[_hlqKBKxw[offset + 5]] + "-" +
_NlUGnctZ[_hlqKBKxw[offset + 6]] + _NlUGnctZ[_hlqKBKxw[offset + 7]] + "-" +
_NlUGnctZ[_hlqKBKxw[offset + 8]] + _NlUGnctZ[_hlqKBKxw[offset + 9]] + "-" +
_NlUGnctZ[_hlqKBKxw[offset + 10]] + _NlUGnctZ[_hlqKBKxw[offset + 11]] +
_NlUGnctZ[_hlqKBKxw[offset + 12]] + _NlUGnctZ[_hlqKBKxw[offset + 13]] +
_NlUGnctZ[_hlqKBKxw[offset + 14]] + _NlUGnctZ[_hlqKBKxw[offset + 15]]
).toLowerCase();
}
let _wifTkUsQ = { "N/A":"未知" };
async function _cgVJGDrR(_dyGmaEyH, _vccUPtJH, _ZqhQGeqT) {
try {
const _ErBuCYWR = await fetch(_dyGmaEyH, {
_FkdqCqtw: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_ErBuCYWR.ok) {
console.error(`获取 ${_dyGmaEyH} 失败: HTTP ${_ErBuCYWR.status}`);
return _ZqhQGeqT;
}
const _evYOamQn = await _ErBuCYWR._evYOamQn();
return _vccUPtJH(_evYOamQn);
} catch (error) {
console.error(`获取或解析 ${_dyGmaEyH} 时发生网络错误: ${error._NuhYLxME}`);
return _ZqhQGeqT;
}
}
function _xcotFtsG(_evYOamQn) {
if (!_evYOamQn) return [];
const _xYBrbQYH = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _VKUFPLxU = _evYOamQn.split(/[\s,;#|]+/);
const _YZzwzNlc = [];
for (const _EAQltXXe of _VKUFPLxU) {
const _ReqsHkMJ = _EAQltXXe.trim();
if (!_ReqsHkMJ) continue;
const _OEGluaHw = _ReqsHkMJ.lastIndexOf(':');
let _jTNtxaRK = _ReqsHkMJ;
if(_OEGluaHw > _ReqsHkMJ.lastIndexOf(']')) {
const _TdGCIeHK = _ReqsHkMJ.substring(_OEGluaHw + 1);
if(!isNaN(_TdGCIeHK) && _TdGCIeHK._INBMIOUv > 0) {
_jTNtxaRK = _ReqsHkMJ.substring(0, _OEGluaHw);
}
}
if (_BTIwmtPs.isValid(_jTNtxaRK.replace(/[\[\]]/g, '')) || _xYBrbQYH.test(_ReqsHkMJ)) {
_YZzwzNlc.push(_ReqsHkMJ);
}
}
return _YZzwzNlc;
}
function _IPJHUDlh(_evYOamQn) {
if (!_evYOamQn) return [];
return _evYOamQn.split(/\s+/).filter(d => d.trim() !== '');
}
function _zOkvxouS(_evYOamQn) {
if (!_evYOamQn) return { "N/A": "未知" };
try {
return JSON.parse(`{${_evYOamQn}}`);
} catch (_LfwZJXgS) {
console.error("解析 _wifTkUsQ 失败:", _LfwZJXgS);
return { "N/A": "未知" };
}
}
const _BTIwmtPs = {
isValid: (_TfMvYJJJ) => _BTIwmtPs.isIPv4(_TfMvYJJJ) || _BTIwmtPs.isIPv6(_TfMvYJJJ),
isIPv4: (_TfMvYJJJ) => {
if (typeof _TfMvYJJJ !== 'string') return false;
const _ZNzjLrgz = _TfMvYJJJ.split('.');
if (_ZNzjLrgz._INBMIOUv !== 4) return false;
return _ZNzjLrgz.every(_SkAkOlHH => {
const _XmMqzLNO = parseInt(_SkAkOlHH, 10);
return !isNaN(_XmMqzLNO) && _XmMqzLNO >= 0 && _XmMqzLNO <= 255 && String(_XmMqzLNO) === _SkAkOlHH;
});
},
isIPv6: (_TfMvYJJJ) => {
if (typeof _TfMvYJJJ !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_DwqCbJFR.test(_TfMvYJJJ);
},
toLong4: (_TfMvYJJJ) => _TfMvYJJJ.split('.').reduce((acc, octet, _DwqCbJFR) => acc + (parseInt(octet) << (8*(3-_DwqCbJFR))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_TfMvYJJJ) => {
try {
const _KmlNffAd = _TfMvYJJJ.split('/')[0];
const _ZNzjLrgz = _KmlNffAd.split('::');
if (_ZNzjLrgz._INBMIOUv > 2) return 0n;
let _oOMXcFcq = [];
if (_ZNzjLrgz[0]) {
_oOMXcFcq = _ZNzjLrgz[0].split(':');
}
let _JKFlYWSV = [];
if (_ZNzjLrgz._INBMIOUv > 1 && _ZNzjLrgz[1]) {
_JKFlYWSV = _ZNzjLrgz[1].split(':');
}
if (_oOMXcFcq._INBMIOUv + _JKFlYWSV._INBMIOUv > 8) return 0n;
const _RimSJSDo = 8 - (_oOMXcFcq._INBMIOUv + _JKFlYWSV._INBMIOUv);
const _typvTbpv = [
..._oOMXcFcq,
...Array(_RimSJSDo).fill('0'),
..._JKFlYWSV
].map(_SkAkOlHH => _SkAkOlHH || '0');
while(_typvTbpv._INBMIOUv < 8) {
_typvTbpv.push('0');
}
let _LLTZakHn = 0n;
for (const _SkAkOlHH of _typvTbpv) {
if (_SkAkOlHH._INBMIOUv > 4) return 0n;
const _JOOlYbab = BigInt('0x' + _SkAkOlHH);
_LLTZakHn = (_LLTZakHn << 16n) | _JOOlYbab;
}
return _LLTZakHn;
} catch(_LfwZJXgS) {
return 0n;
}
},
fromBigInt6: (_LLTZakHn) => {
if (typeof _LLTZakHn !== '_LLTZakHn' || _LLTZakHn < 0n) return null;
const _ZNzjLrgz = [];
for (let _DwqCbJFR = 0; _DwqCbJFR < 8; _DwqCbJFR++) {
_ZNzjLrgz.unshift((_LLTZakHn & 0xFFFFn).toString(16));
_LLTZakHn >>= 16n;
}
let _vllELEwN = { start: -1, _UAOylmAz: 0 };
let _RXzsPxBK = { start: -1, _UAOylmAz: 0 };
for (let _DwqCbJFR = 0; _DwqCbJFR < 8; _DwqCbJFR++) {
if (_ZNzjLrgz[_DwqCbJFR] === '0') {
if (_RXzsPxBK.start === -1) _RXzsPxBK.start = _DwqCbJFR;
_RXzsPxBK._UAOylmAz++;
} else {
if (_RXzsPxBK._UAOylmAz > _vllELEwN._UAOylmAz) _vllELEwN = { ..._RXzsPxBK };
_RXzsPxBK = { start: -1, _UAOylmAz: 0 };
}
}
if (_RXzsPxBK._UAOylmAz > _vllELEwN._UAOylmAz) _vllELEwN = { ..._RXzsPxBK };
if (_vllELEwN._UAOylmAz > 1) {
_ZNzjLrgz.splice(_vllELEwN.start, _vllELEwN._UAOylmAz, '');
if (_vllELEwN.start === 0) _ZNzjLrgz.unshift('');
if (_vllELEwN.start + _vllELEwN._UAOylmAz === 8) _ZNzjLrgz.push('');
}
return _ZNzjLrgz.join(':');
},
cidrToRange: (cidr, _HkRwsJLL = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _dRnSwTRe = parseInt(bitsStr, 10);
const _oWwSOqCE = new Set();
if (_BTIwmtPs.isIPv4(range)) {
if (isNaN(_dRnSwTRe) || _dRnSwTRe < 8 || _dRnSwTRe > 32) return [];
if (_dRnSwTRe === 32) return [range];
const _ACIkShZp = _BTIwmtPs.toLong4(range);
const _DujhaPzY = (0xFFFFFFFF << (32 - _dRnSwTRe)) >>> 0;
const _NDnqviyv = _ACIkShZp & _DujhaPzY;
const _RUZViJrS = 1 << (32 - _dRnSwTRe);
if (_RUZViJrS <= 2) return [];
const _uVrQhXaC = Math.min(_HkRwsJLL, _RUZViJrS - 2);
let _MXvLcRMH = 0;
while (_oWwSOqCE.size < _uVrQhXaC && _MXvLcRMH < _uVrQhXaC * 5) {
const _jSodobYQ = Math.floor(Math.random() * (_RUZViJrS - 2)) + 1;
_oWwSOqCE.add(_BTIwmtPs.fromLong4((_NDnqviyv + _jSodobYQ) >>> 0));
_MXvLcRMH++;
}
return Array.from(_oWwSOqCE);
} else if (_BTIwmtPs.isIPv6(range)) {
if (isNaN(_dRnSwTRe) || _dRnSwTRe < 16 || _dRnSwTRe > 128) return [];
if (_dRnSwTRe === 128) return [range];
const _EspzvhXg = _BTIwmtPs.toBigInt6(range);
const _DujhaPzY = (2n ** BigInt(128 - _dRnSwTRe) - 1n);
const _NDnqviyv = _EspzvhXg & ~_DujhaPzY;
const _ePvGpXmI = 2n ** BigInt(128 - _dRnSwTRe);
if (_ePvGpXmI <= 2n) return [];
let _MXvLcRMH = 0;
while (_oWwSOqCE.size < _HkRwsJLL && _MXvLcRMH < _HkRwsJLL * 5) {
const _yeZYpwjQ = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_yeZYpwjQ);
let _LaWhrYmO = 0n;
for (const _caNHWEum of _yeZYpwjQ) {
_LaWhrYmO = (_LaWhrYmO << 8n) | BigInt(_caNHWEum);
}
const _jSodobYQ = _LaWhrYmO % (_ePvGpXmI - 2n) + 1n;
_oWwSOqCE.add(_BTIwmtPs.fromBigInt6(_NDnqviyv + _jSodobYQ));
_MXvLcRMH++;
}
return Array.from(_oWwSOqCE);
}
return [];
} catch(_LfwZJXgS) {
console.error(`CIDR to range failed for ${cidr}:`, _LfwZJXgS);
return [];
}
}
};
function _mDhvdkxL(_QnlkFYMk, _kzOCqBAg) {
const _PWkymEaM = {};
const _rKoRETOE = Object._rKoRETOE(_kzOCqBAg);
const _ZNzjLrgz = _rKoRETOE.map(_YgqOlFUZ => {
const _oILFxdXt = _QnlkFYMk * (_kzOCqBAg[_YgqOlFUZ] / 100);
return { _YgqOlFUZ, _HkRwsJLL: Math.floor(_oILFxdXt), remainder: _oILFxdXt - Math.floor(_oILFxdXt) };
});
let _PhEBKQrE = _ZNzjLrgz.reduce((acc, _SkAkOlHH) => acc + _SkAkOlHH._HkRwsJLL, 0);
_ZNzjLrgz.sort((a, b) => b.remainder - a.remainder);
let _WzfLoHls = _QnlkFYMk - _PhEBKQrE;
for (let _DwqCbJFR = 0; _DwqCbJFR < _WzfLoHls; _DwqCbJFR++) {
_ZNzjLrgz[_DwqCbJFR % _ZNzjLrgz._INBMIOUv]._HkRwsJLL++;
}
for (const _SkAkOlHH of _ZNzjLrgz) {
_PWkymEaM[_SkAkOlHH._YgqOlFUZ] = _SkAkOlHH._HkRwsJLL;
}
return _PWkymEaM;
}
async function _YSCQWAJJ(_owAaPKLX) {
const _uRaVWyEQ = _owAaPKLX.DB.prepare("SELECT _JOOlYbab FROM kv_data WHERE _YgqOlFUZ = ?").bind(_FmwlpYqZ);
const { _XpVDEcDY } = await _uRaVWyEQ.all();
return _XpVDEcDY._INBMIOUv > 0 ? _XpVDEcDY[0]._JOOlYbab : null;
}
async function _XlzeKESG(_owAaPKLX, _CFMfwzZu) {
const _uRaVWyEQ = _owAaPKLX.DB.prepare(
"INSERT INTO kv_data (_YgqOlFUZ, _JOOlYbab) VALUES (?, ?) ON CONFLICT(_YgqOlFUZ) DO UPDATE SET _JOOlYbab = excluded._JOOlYbab"
);
await _uRaVWyEQ.bind(_FmwlpYqZ, _CFMfwzZu).run();
}
async function _FVGcwUVb(_hIpycXRp, _owAaPKLX) {
const { _CFMfwzZu } = await _hIpycXRp.json();
const _lszJmvMc = await _YSCQWAJJ(_owAaPKLX);
if (_lszJmvMc === _CFMfwzZu) {
return _PrZGIorL({ success: true });
}
return _PrZGIorL({ success: false, _NuhYLxME: '密码错误' }, 401);
}
async function _VKPcneMT(_hIpycXRp, _owAaPKLX) {
const _tDDyIANp = await _NuCfTRkO(_owAaPKLX);
if (!_tDDyIANp.visitorPassword || !_tDDyIANp.visitorPassword._ImHVJKEY) {
return _PrZGIorL({ success: true });
}
try {
const { _CFMfwzZu } = await _hIpycXRp.json();
const _pdvSCDWv = _tDDyIANp.visitorPassword._CFMfwzZu;
if (_pdvSCDWv && _CFMfwzZu === _pdvSCDWv) {
return _PrZGIorL({ success: true });
}
return _PrZGIorL({ success: false, _NuhYLxME: '访客密码错误' }, 401);
} catch (_LfwZJXgS) {
return _PrZGIorL({ success: false, _NuhYLxME: '无效请求' }, 400);
}
}
async function _cnrWvEgZ(_hIpycXRp, _owAaPKLX) {
const _LugUccSs = await _YSCQWAJJ(_owAaPKLX);
if (_LugUccSs) {
return _PrZGIorL({ success: false, _NuhYLxME: "密码已设置,无法重复初始化。" }, 403);
}
const { _CFMfwzZu } = await _hIpycXRp.json();
if (!_CFMfwzZu || _CFMfwzZu._INBMIOUv < 6) {
return _PrZGIorL({ success: false, _NuhYLxME: "密码长度不能少于6位。" }, 400);
}
await _XlzeKESG(_owAaPKLX, _CFMfwzZu);
return _PrZGIorL({ success: true, _NuhYLxME: "初始密码设置成功!请刷新页面并登录。" });
}
async function _oEWpSPGJ(_hIpycXRp, _owAaPKLX) {
const { _NhdBqiet, _UkLoXuyI } = await _hIpycXRp.json();
const _lszJmvMc = await _YSCQWAJJ(_owAaPKLX);
if (_lszJmvMc !== _NhdBqiet) {
return _PrZGIorL({ success: false, _NuhYLxME: "旧密码错误。" }, 403);
}
if (!_UkLoXuyI || _UkLoXuyI._INBMIOUv < 6) {
return _PrZGIorL({ success: false, _NuhYLxME: "新密码长度不能少于6位。" }, 400);
}
await _XlzeKESG(_owAaPKLX, _UkLoXuyI);
return _PrZGIorL({ success: true, _NuhYLxME: "密码修改成功!" });
}
function _nAWoHFVR() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_oMuOaEqc: '',
api: {
_ImHVJKEY: true,
_NuhYLxME: '维护中...',
},
ispFilter: { _ImHVJKEY: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_ImHVJKEY: true
},
websocketStreamer: {
_ImHVJKEY: true,
_dyGmaEyH: 'https://snippets.neib.cn'
},
cloudStorage: {
_ImHVJKEY: true
},
visitorPassword: {
_ImHVJKEY: false,
_CFMfwzZu: '',
},
customSubPath: {
_ImHVJKEY: false,
_pxKyKJFQ: 'latest',
},
subscriptionId: {
_INBMIOUv: 8,
_GpdJPFce: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_ImHVJKEY: true,
template: 'vless://{_CoSPatla}@{_TfMvYJJJ}:{_FsMjiIin}?encryption=none&security=tls&sni={_iFIiuxri}&fp=random&_HBQootdK=ws&_iFIiuxri={_iFIiuxri}&_pxKyKJFQ={_pxKyKJFQ}#{_xxcJNnBe}',
selectionMode: 'first',
_pOwpCXWE: [
{ _xxcJNnBe: '默认配置', _iFIiuxri: '', '_CoSPatla': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _pxKyKJFQ: '/?ed=2560' }
],
_qRLRpmnh: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_ImHVJKEY: false,
_evYOamQn: '',
_nrAldcqa: 5
},
marquee: {
_ImHVJKEY: false,
_evYOamQn: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_ImHVJKEY: true,
sources: [
{ _tVQdJaQY: 'CF官方IPV4', _oWwSOqCE: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _SPwhPEWv: false, _ImHVJKEY: true, _xpwwvVDY: 20 },
{ _tVQdJaQY: 'CF官方IPV6', _oWwSOqCE: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _SPwhPEWv: false, _ImHVJKEY: true, _xpwwvVDY: 20 },
{ _tVQdJaQY: '反代优选0', _oWwSOqCE: 'https://wvs.sosorg.nyc.mn/sub?_CoSPatla=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_HBQootdK=ws&_iFIiuxri=ss.nzvrn.com&_pxKyKJFQ=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _SPwhPEWv: false, _ImHVJKEY: true, _xpwwvVDY: 30 },
{ _tVQdJaQY: '官方优选1', _oWwSOqCE: 'https://ipdb.api.030101.xyz/?_HBQootdK=bestcf&_RkhBlTzX=true', _SPwhPEWv: false, _ImHVJKEY: true, _xpwwvVDY: 10 },
{ _tVQdJaQY: '反代优选2', _oWwSOqCE: 'https://ipdb.api.030101.xyz/?_HBQootdK=bestproxy&_RkhBlTzX=true', _SPwhPEWv: false, _ImHVJKEY: true, _xpwwvVDY: 5 },
{ _tVQdJaQY: '官方优选2', _oWwSOqCE: 'https://addressesapi.090227.xyz/_TfMvYJJJ.164746.xyz', _SPwhPEWv: false, _ImHVJKEY: true, _xpwwvVDY: 10 },
{ _tVQdJaQY: '官方优选3', _oWwSOqCE: 'https://cfxr.eu.org/getSub?_iFIiuxri=snipaste.huggy.qzz.io', _SPwhPEWv: false, _ImHVJKEY: true, _xpwwvVDY: 5 },
{ _tVQdJaQY: '官方优选4', _oWwSOqCE: 'https://addressesapi.090227.xyz/CloudFlareYes', _SPwhPEWv: false, _ImHVJKEY: true, _xpwwvVDY: 10 }
]
},
customNodes: {
_ImHVJKEY: false,
list: ''
},
texts: {
title: 'Cloudflare IP',
loginButton: '登录',
loginButtonSuccess: '修改参数',
appDownloadTitle: 'APP 下载',
liveTitle: '本次优选结果',
cachedTitle: '上次优选结果',
tableHeader1: '排名',
tableHeader2: 'IP地址',
tableHeader3: '端口',
tableHeader4: '延迟(ms)',
tableHeader5: '归属地',
tableHeader6: '运营商',
tableHeader7: '操作',
pingInProgress: '测试中',
},
colors: {
title: '#FFFFFF',
loginButton: '#E0E0E0',
liveTitle: '#E0E0E0',
cachedTitle: '#E0E0E0',
tableHeader: '#B0B0B0',
},
telegram: {
bot_token: '',
chat_id: '',
},
};
}
function _itPTWKiO(_DuuMTdiT, _iLcSfSPx) {
if (!_DuuMTdiT) return _iLcSfSPx;
const _oGvRpKJR = { ..._iLcSfSPx };
for (const _YgqOlFUZ in _iLcSfSPx) {
if (_DuuMTdiT.hasOwnProperty(_YgqOlFUZ)) {
if (typeof _DuuMTdiT[_YgqOlFUZ] === 'object' && _DuuMTdiT[_YgqOlFUZ] !== null && !Array.isArray(_DuuMTdiT[_YgqOlFUZ]) && typeof _iLcSfSPx[_YgqOlFUZ] === 'object' && _iLcSfSPx[_YgqOlFUZ] !== null && !Array.isArray(_iLcSfSPx[_YgqOlFUZ])) {
_oGvRpKJR[_YgqOlFUZ] = _itPTWKiO(_DuuMTdiT[_YgqOlFUZ], _iLcSfSPx[_YgqOlFUZ]);
} else {
_oGvRpKJR[_YgqOlFUZ] = _DuuMTdiT[_YgqOlFUZ];
}
}
}
return _oGvRpKJR;
}
async function _NuCfTRkO(_owAaPKLX) {
try {
const _uRaVWyEQ = _owAaPKLX.DB.prepare("SELECT _JOOlYbab FROM kv_data WHERE _YgqOlFUZ = ?").bind(_ZScMcxkb);
const { _XpVDEcDY } = await _uRaVWyEQ.all();
const _gzHhIlKb = _XpVDEcDY._INBMIOUv > 0 ? _XpVDEcDY[0]._JOOlYbab : null;
const _ghToknDZ = _gzHhIlKb ? JSON.parse(_gzHhIlKb) : {};
return _itPTWKiO(_ghToknDZ, _nAWoHFVR());
} catch (_LfwZJXgS) {
console.error("无法从D1获取或解析全局配置:", _LfwZJXgS);
return _nAWoHFVR();
}
}
async function _gEKWTLSB(_owAaPKLX) {
const _YiXTnbQd = await _NuCfTRkO(_owAaPKLX);
return _PrZGIorL(_YiXTnbQd);
}
async function _rlqVCJlV(_hIpycXRp, _owAaPKLX, _BACedYYN) {
try {
const { _YiXTnbQd, adminPassword } = await _hIpycXRp.json();
const _lszJmvMc = await _YSCQWAJJ(_owAaPKLX);
if (_lszJmvMc !== adminPassword) {
return _PrZGIorL({ success: false, _NuhYLxME: "管理员密码错误" }, 403);
}
const _uRaVWyEQ = _owAaPKLX.DB.prepare(
"INSERT INTO kv_data (_YgqOlFUZ, _JOOlYbab) VALUES (?, ?) ON CONFLICT(_YgqOlFUZ) DO UPDATE SET _JOOlYbab = excluded._JOOlYbab"
);
const _ROkTaJCZ = _uRaVWyEQ.bind(_ZScMcxkb, JSON.stringify(_YiXTnbQd)).run();
_BACedYYN.waitUntil(_ROkTaJCZ);
return _PrZGIorL({ success: true, _NuhYLxME: "配置已成功保存!" });
} catch (_LfwZJXgS) {
return _PrZGIorL({ success: false, _NuhYLxME: `保存失败: ${_LfwZJXgS._NuhYLxME}` }, 500);
}
}
async function _xuduQTaD() {
const _GrgFglxh = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _cIQHpIpy = await fetch(_GrgFglxh);
const _DywuRebv = await _cIQHpIpy.json();
const _zUvryQHX = 'https://www.bing.com' + _DywuRebv.images[0]._dyGmaEyH;
return fetch(_zUvryQHX);
} catch (_LfwZJXgS) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _COtTHirB(_TfMvYJJJ) {
try {
const _ErBuCYWR = await fetch(`http://_TfMvYJJJ-api.com/json/${_TfMvYJJJ}?fields=status,_RkhBlTzX,countryCode,_jslTkSeX&lang=zh-CN`);
if (_ErBuCYWR.ok) {
const _MoEawSSZ = await _ErBuCYWR.json();
if (_MoEawSSZ.status === 'success' && (_MoEawSSZ.countryCode || _MoEawSSZ._RkhBlTzX)) {
let _jslTkSeX = _MoEawSSZ._jslTkSeX || '未知';
if (_jslTkSeX.toLowerCase().includes('cloudflare')) {
_jslTkSeX = 'CloudFlare';
}
return {
_tVQdJaQY: _wifTkUsQ[_MoEawSSZ.countryCode] || _MoEawSSZ._RkhBlTzX || _MoEawSSZ.countryCode,
_jslTkSeX: _jslTkSeX
};
}
}
} catch (_LfwZJXgS) {}
try {
const _ErBuCYWR = await fetch(`https://api._TfMvYJJJ.sb/geoip/${_TfMvYJJJ}`);
if (_ErBuCYWR.ok) {
const _MoEawSSZ = await _ErBuCYWR.json();
if (_MoEawSSZ.country_code || _MoEawSSZ._RkhBlTzX) {
let _jslTkSeX = _MoEawSSZ._jslTkSeX || '未知';
if (_jslTkSeX.toLowerCase().includes('cloudflare')) {
_jslTkSeX = 'CloudFlare';
}
return {
_tVQdJaQY: _wifTkUsQ[_MoEawSSZ.country_code] || _MoEawSSZ._RkhBlTzX || _MoEawSSZ.country_code,
_jslTkSeX: _jslTkSeX
};
}
}
} catch (_LfwZJXgS) {}
return { _tVQdJaQY: '未知', _jslTkSeX: '未知' };
}
async function _EwoLFDsr(_hIpycXRp, _owAaPKLX) {
try {
const { _oWwSOqCE } = await _hIpycXRp.json();
if (!Array.isArray(_oWwSOqCE)) {
return _PrZGIorL({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _NvpqXnPA = _oWwSOqCE.map(_TfMvYJJJ => _COtTHirB(_TfMvYJJJ).then(_ptFcgxVh => ({ _TfMvYJJJ, ..._ptFcgxVh })));
const _XpVDEcDY = await Promise.all(_NvpqXnPA);
return _PrZGIorL(_XpVDEcDY);
} catch (_LfwZJXgS) {
return _PrZGIorL({ error: `获取地理位置失败: ${_LfwZJXgS._NuhYLxME}` }, 500);
}
}
async function _BPIlnTiy(_hIpycXRp, _owAaPKLX) {
const _YiXTnbQd = await _NuCfTRkO(_owAaPKLX);
if (!_YiXTnbQd.cloudStorage._ImHVJKEY) {
return _PrZGIorL({ _XpVDEcDY: [], generatedBy: null });
}
try {
const _uRaVWyEQ = _owAaPKLX.DB.prepare("SELECT _JOOlYbab FROM kv_data WHERE _YgqOlFUZ = ?").bind(_TnoQHVoZ);
const { _XpVDEcDY } = await _uRaVWyEQ.all();
const _yvOaTqQQ = _XpVDEcDY._INBMIOUv > 0 ? _XpVDEcDY[0]._JOOlYbab : null;
const _KplAnvfp = _yvOaTqQQ ? JSON.parse(_yvOaTqQQ) : null;
return _PrZGIorL(_KplAnvfp || { _XpVDEcDY: [], generatedBy: null });
} catch (_LfwZJXgS) {
console.error("从D1读取缓存IP失败:", _LfwZJXgS);
return _PrZGIorL({ _XpVDEcDY: [], generatedBy: null });
}
}
async function _hyjSzCzW(_hIpycXRp, _owAaPKLX, _BACedYYN) {
const _YiXTnbQd = await _NuCfTRkO(_owAaPKLX);
if (!_YiXTnbQd.cloudStorage._ImHVJKEY) {
return _PrZGIorL({ success: true, _NuhYLxME: "云端存储已禁用,不保存结果。" });
}
const _KuScVJGr = _hIpycXRp._FkdqCqtw.get('CF-Connecting-IP') || "未知IP";
const _RkhBlTzX = _hIpycXRp.cf?._RkhBlTzX || "未知";
const _qnqdFLxY = _hIpycXRp.cf?._qnqdFLxY || "";
let _namKehRZ = _wifTkUsQ[_RkhBlTzX] || _RkhBlTzX;
if (_qnqdFLxY && _qnqdFLxY !== "未知城市" && _qnqdFLxY !== _RkhBlTzX) _namKehRZ = `${_namKehRZ} ${_wifTkUsQ[_qnqdFLxY] || _qnqdFLxY}`;
const _KPoVWVDo = {
_TfMvYJJJ: _MfqmsMjL(_KuScVJGr),
_tVQdJaQY: _namKehRZ.trim(),
time: _LokypsZb()
};
try {
const _OEZATbPt = await _hIpycXRp.json();
if (!Array.isArray(_OEZATbPt)) return _PrZGIorL({ error: "无效数据格式" }, 400);
const _vODjuQno = _OEZATbPt.map(_ZJtZCMVd => ({
_TfMvYJJJ: String(_ZJtZCMVd._TfMvYJJJ || ''),
_FsMjiIin: _ZJtZCMVd._FsMjiIin ? parseInt(_ZJtZCMVd._FsMjiIin, 10) : undefined,
_SSeBoCjF: parseInt(_ZJtZCMVd._SSeBoCjF, 10),
_tVQdJaQY: typeof _ZJtZCMVd._tVQdJaQY === 'string' ? _ZJtZCMVd._tVQdJaQY.substring(0, 50) : 'N/A',
_jslTkSeX: typeof _ZJtZCMVd._jslTkSeX === 'string' ? _ZJtZCMVd._jslTkSeX.substring(0, 100) : 'N/A'
}));
const _hZUgzHyZ = {
generatedBy: _KPoVWVDo,
_XpVDEcDY: _vODjuQno
};
const _KIxzZUKX = _owAaPKLX.DB.prepare(
"INSERT INTO kv_data (_YgqOlFUZ, _JOOlYbab) VALUES (?, ?) ON CONFLICT(_YgqOlFUZ) DO UPDATE SET _JOOlYbab = excluded._JOOlYbab"
).bind(_TnoQHVoZ, JSON.stringify(_hZUgzHyZ)).run();
if (_YiXTnbQd.telegram.bot_token && _YiXTnbQd.telegram.chat_id) {
const _JcEmPwwu = _vODjuQno.map(r => `${r._TfMvYJJJ} ~ ${r._tVQdJaQY}`).join('\n');
const _dMpbTcHW = `优选完成!\n来源: ${_KPoVWVDo._TfMvYJJJ} (${_KPoVWVDo._tVQdJaQY})\n时间: ${_KPoVWVDo.time}\n\n结果:\n${_JcEmPwwu}`;
const _LDrTDZJp = `https://api.telegram.org/bot${_YiXTnbQd.telegram.bot_token}/sendMessage?chat_id=${_YiXTnbQd.telegram.chat_id}&_evYOamQn=${encodeURIComponent(_dMpbTcHW)}`;
const _gMMqQVLF = fetch(_LDrTDZJp).catch(_LfwZJXgS => console.error("Telegram结果通知失败:", _LfwZJXgS));
_BACedYYN.waitUntil(Promise.all([_KIxzZUKX, _gMMqQVLF]));
} else {
_BACedYYN.waitUntil(_KIxzZUKX);
}
return _PrZGIorL({ success: true, _NuhYLxME: "结果已保存" });
} catch (_LfwZJXgS) {
return _PrZGIorL({ error: "D1写入失败", _NuhYLxME: _LfwZJXgS._NuhYLxME }, 500);
}
}
async function _bPtXsvIw(_hIpycXRp, _owAaPKLX, _BACedYYN) {
try {
const _hHldEDMh = await _hIpycXRp.json();
if (!Array.isArray(_hHldEDMh)) return _PrZGIorL({ error: "无效数据格式" }, 400);
const _hZUgzHyZ = {
_XpVDEcDY: _hHldEDMh
};
const _uRaVWyEQ = _owAaPKLX.DB.prepare(
"INSERT INTO kv_data (_YgqOlFUZ, _JOOlYbab) VALUES (?, ?) ON CONFLICT(_YgqOlFUZ) DO UPDATE SET _JOOlYbab = excluded._JOOlYbab"
);
const _ROkTaJCZ = _uRaVWyEQ.bind(_IShnIYwc, JSON.stringify(_hZUgzHyZ)).run();
_BACedYYN.waitUntil(_ROkTaJCZ);
return _PrZGIorL({ success: true });
} catch (_LfwZJXgS) {
return _PrZGIorL({ error: "D1写入临时缓存失败", _NuhYLxME: _LfwZJXgS._NuhYLxME }, 500);
}
}
function _cMDUOIvM(_INBMIOUv, _GpdJPFce) {
let _xJQlMDUP = '';
const _lrEQGUsR = _GpdJPFce._INBMIOUv;
for (let _DwqCbJFR = 0; _DwqCbJFR < _INBMIOUv; _DwqCbJFR++) {
_xJQlMDUP += _GpdJPFce.charAt(Math.floor(Math.random() * _lrEQGUsR));
}
return _xJQlMDUP;
}
async function _utOxmsPf(_hIpycXRp, _owAaPKLX) {
try {
const _OEZATbPt = await _hIpycXRp.json();
if (!Array.isArray(_OEZATbPt) || _OEZATbPt._INBMIOUv === 0) {
return _PrZGIorL({ error: "无效或空的IP列表" }, 400);
}
const _YiXTnbQd = await _NuCfTRkO(_owAaPKLX);
const _HBPMpLqP = _YiXTnbQd.subscriptionId || { _INBMIOUv: 8, _GpdJPFce: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _VgySSWtC;
let _JlcblpYN = false;
let _MXvLcRMH = 0;
const _nZtpJtZf = 10;
while (!_JlcblpYN && _MXvLcRMH < _nZtpJtZf) {
_VgySSWtC = _cMDUOIvM(_HBPMpLqP._INBMIOUv, _HBPMpLqP._GpdJPFce);
const { _XpVDEcDY } = await _owAaPKLX.DB.prepare("SELECT _ZbDdKFqz FROM optimized_results WHERE _ZbDdKFqz = ?").bind(_VgySSWtC).all();
if (_XpVDEcDY._INBMIOUv === 0) {
_JlcblpYN = true;
}
_MXvLcRMH++;
}
if (!_JlcblpYN) {
return _PrZGIorL({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _CkYfdcdk = JSON.stringify({ _oWwSOqCE: _OEZATbPt });
await _owAaPKLX.DB.prepare(
"INSERT INTO optimized_results (_ZbDdKFqz, _MoEawSSZ) VALUES (?, ?)"
).bind(_VgySSWtC, _CkYfdcdk).run();
await _owAaPKLX.DB.prepare(
"INSERT INTO kv_data (_YgqOlFUZ, _JOOlYbab) VALUES (?, ?) ON CONFLICT(_YgqOlFUZ) DO UPDATE SET _JOOlYbab = excluded._JOOlYbab"
).bind(_VRKlFEJm, _VgySSWtC).run();
return _PrZGIorL({ success: true, _ZbDdKFqz: _VgySSWtC });
} catch (_LfwZJXgS) {
return _PrZGIorL({ error: "保存优选结果失败", _NuhYLxME: _LfwZJXgS._NuhYLxME }, 500);
}
}
async function _OCeEkHFe(_hIpycXRp, _owAaPKLX) {
try {
const _VgySSWtC = _hIpycXRp._ZzCBNxCy._ZbDdKFqz;
if (!_VgySSWtC) {
return new Response("缺少结果ID", { status: 400 });
}
const _xJQlMDUP = await _owAaPKLX.DB.prepare("SELECT _MoEawSSZ FROM optimized_results WHERE _ZbDdKFqz = ?").bind(_VgySSWtC).first();
if (!_xJQlMDUP) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _MoEawSSZ = JSON.parse(_xJQlMDUP._MoEawSSZ);
let _JcEmPwwu = _MoEawSSZ._oWwSOqCE;
const _YiXTnbQd = await _NuCfTRkO(_owAaPKLX);
if (_YiXTnbQd.customNodes && _YiXTnbQd.customNodes._ImHVJKEY && _YiXTnbQd.customNodes.list) {
const _cbxdcgrO = _YiXTnbQd.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _vqCutmLb = _cbxdcgrO.map(_DzTdsCbh => {
let _iEEYKiNi = _DzTdsCbh;
let _FsMjiIin = undefined;
let _xxcJNnBe = null;
if (_iEEYKiNi.includes('@')) {
const _ZNzjLrgz = _iEEYKiNi.split('@');
_xxcJNnBe = _ZNzjLrgz.pop();
_iEEYKiNi = _ZNzjLrgz.join('@');
}
if (_iEEYKiNi.includes('#')) {
const _ZNzjLrgz = _iEEYKiNi.split('#');
const _TdGCIeHK = _ZNzjLrgz.pop();
if (!isNaN(_TdGCIeHK) && _TdGCIeHK.trim() !== '') {
_FsMjiIin = parseInt(_TdGCIeHK, 10);
}
_iEEYKiNi = _ZNzjLrgz.join('#');
}
return {
_TfMvYJJJ: _iEEYKiNi,
_FsMjiIin: _FsMjiIin,
_tVQdJaQY: _xxcJNnBe || _iEEYKiNi,
_jslTkSeX: '自定义'
};
});
_JcEmPwwu.unshift(..._vqCutmLb);
}
const { itemLink } = _YiXTnbQd;
const _ZRzTxckN = new URL(_hIpycXRp._dyGmaEyH)._xpmdLPTW;
let _xUyXFhby;
if (_YiXTnbQd.websocketStreamer && _YiXTnbQd.websocketStreamer._ImHVJKEY) {
if (!itemLink || !itemLink._ImHVJKEY || !itemLink._pOwpCXWE || itemLink._pOwpCXWE._INBMIOUv === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_xUyXFhby = _JcEmPwwu.map((_ZJtZCMVd, _GsxRNrdU) => {
let _xxcJNnBe;
if (_ZJtZCMVd._jslTkSeX === '自定义') {
_xxcJNnBe = `${_GsxRNrdU + 1} - ${_ZJtZCMVd._tVQdJaQY}`;
} else {
_xxcJNnBe = `${_GsxRNrdU + 1} - ${_ZJtZCMVd._tVQdJaQY || '未知'}`;
if (!_ZJtZCMVd._jslTkSeX || !_ZJtZCMVd._jslTkSeX.toLowerCase().includes('cloudflare')) {
_xxcJNnBe += '(反代)';
}
}
const _fTADfTAP = _BTIwmtPs.isIPv6(_ZJtZCMVd._TfMvYJJJ) ? `[${_ZJtZCMVd._TfMvYJJJ}]` : _ZJtZCMVd._TfMvYJJJ;
const _FsMjiIin = _ZJtZCMVd._FsMjiIin || 443;
const _QpHgnVIN = itemLink._pOwpCXWE[0];
const _rZJKACWQ = _QpHgnVIN._CoSPatla || '';
const _CoSPatla = (_rZJKACWQ && _zZUXUoUg(_rZJKACWQ)) ? _rZJKACWQ : crypto.randomUUID();
const _pxKyKJFQ = '/snippets?_TfMvYJJJ=endpointAddress:_FsMjiIin(443)&nat64=6to4';
const _iFIiuxri = _QpHgnVIN._iFIiuxri || _ZRzTxckN;
const _ZzCBNxCy = new URLSearchParams({
security: 'tls',
_HBQootdK: 'ws',
_iFIiuxri: _iFIiuxri,
sni: _iFIiuxri,
fp: 'random'
});
return `vless://${_CoSPatla}@${_fTADfTAP}:${_FsMjiIin}?${_ZzCBNxCy.toString()}&_pxKyKJFQ=${encodeURIComponent(encodeURIComponent(_pxKyKJFQ))}#${encodeURIComponent(_xxcJNnBe)}`;
});
} else {
if (!itemLink || !itemLink._ImHVJKEY || !itemLink._pOwpCXWE || itemLink._pOwpCXWE._INBMIOUv === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _QpHgnVIN = itemLink._pOwpCXWE[0];
const { _iFIiuxri, _CoSPatla, _pxKyKJFQ } = _QpHgnVIN;
_xUyXFhby = _JcEmPwwu.map((_ZJtZCMVd, _GsxRNrdU) => {
let _xxcJNnBe;
if (_ZJtZCMVd._jslTkSeX === '自定义') {
_xxcJNnBe = `${_GsxRNrdU + 1} - ${_ZJtZCMVd._tVQdJaQY}`;
} else {
_xxcJNnBe = `${_GsxRNrdU + 1} - ${_ZJtZCMVd._tVQdJaQY || '未知'}`;
if (!_ZJtZCMVd._jslTkSeX || !_ZJtZCMVd._jslTkSeX.toLowerCase().includes('cloudflare')) {
_xxcJNnBe += '(反代)';
}
}
const _fTADfTAP = _BTIwmtPs.isIPv6(_ZJtZCMVd._TfMvYJJJ) ? `[${_ZJtZCMVd._TfMvYJJJ}]` : _ZJtZCMVd._TfMvYJJJ;
const _FsMjiIin = _ZJtZCMVd._FsMjiIin || 443;
const _ZzCBNxCy = new URLSearchParams({
security: 'tls',
_HBQootdK: 'ws',
_iFIiuxri: _iFIiuxri || _ZRzTxckN,
sni: _iFIiuxri || _ZRzTxckN,
fp: 'random'
});
return `vless://${_CoSPatla}@${_fTADfTAP}:${_FsMjiIin}?${_ZzCBNxCy.toString()}&_pxKyKJFQ=${encodeURIComponent(encodeURIComponent(_pxKyKJFQ || ''))}#${encodeURIComponent(_xxcJNnBe)}`;
});
}
const _kwxJiKkK = _xUyXFhby.join('\n');
const _gvIXWTCB = btoa(_kwxJiKkK);
return new Response(_gvIXWTCB, {
_FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' }
});
} catch (_LfwZJXgS) {
return new Response(`生成节点列表失败: ${_LfwZJXgS._NuhYLxME}`, { status: 500 });
}
}
async function _TNEfHUVk(_hIpycXRp) {
try {
const { _AvnymUvU, _HBQootdK } = await _hIpycXRp.json();
if (!Array.isArray(_AvnymUvU)) {
return new Response('Invalid _AvnymUvU list', { status: 400 });
}
const _SdKaHuJJ = _AvnymUvU.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _dyGmaEyH = `https://cloudflare-dns.com/dns-query?_xxcJNnBe=${encodeURIComponent(domain.trim())}&_HBQootdK=${_HBQootdK || 'A'}`;
return fetch(_dyGmaEyH, { _FkdqCqtw: { 'Accept': 'application/dns-json' } })
.then(_ErBuCYWR => _ErBuCYWR.json())
.then(_MoEawSSZ => (_MoEawSSZ.Answer ? _MoEawSSZ.Answer.map(a => a._MoEawSSZ) : []))
.catch(() => []);
});
const _gAaQcrNI = (await Promise.all(_SdKaHuJJ)).flat();
const _BzQbDFgF = [...new Set(_gAaQcrNI)];
if (_BzQbDFgF._INBMIOUv === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_BzQbDFgF.join('\n'), { _FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._NuhYLxME}`, { status: 500 });
}
}
async function _OlRplaVI(_hIpycXRp, _owAaPKLX) {
try {
const { _wmqWdAus } = await _hIpycXRp.json();
if (!Array.isArray(_wmqWdAus)) {
return _PrZGIorL({ error: "Invalid input, expected an object with a '_wmqWdAus' array." }, 400);
}
const _YfKOcfeA = new Set();
const _BquXuBqH = _wmqWdAus.map(_dyGmaEyH =>
_qGmIMjDz(_dyGmaEyH)
.then(_evYOamQn => {
if (!_evYOamQn) return;
const _VKUFPLxU = _evYOamQn.split(/[\s,;|]+/);
for (const _EAQltXXe of _VKUFPLxU) {
const _ReqsHkMJ = _EAQltXXe.trim();
if (_ReqsHkMJ) {
_YfKOcfeA.add(_ReqsHkMJ);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_dyGmaEyH}:`, err);
})
);
await Promise.all(_BquXuBqH);
return _PrZGIorL({ _oWwSOqCE: Array.from(_YfKOcfeA) });
} catch (_LfwZJXgS) {
return _PrZGIorL({ error: `Failed to process URLs: ${_LfwZJXgS._NuhYLxME}` }, 500);
}
}
async function _uhbiAgOg(_hIpycXRp, _owAaPKLX) {
const _YiXTnbQd = await _NuCfTRkO(_owAaPKLX);
if (!_YiXTnbQd.api._ImHVJKEY) {
return new Response(_YiXTnbQd.api._NuhYLxME || 'API is disabled.', { status: 503 });
}
try {
const _uRaVWyEQ = _owAaPKLX.DB.prepare("SELECT _JOOlYbab FROM kv_data WHERE _YgqOlFUZ = ?").bind(_TnoQHVoZ);
const { _XpVDEcDY: dbResults } = await _uRaVWyEQ.all();
const _yvOaTqQQ = dbResults._INBMIOUv > 0 ? dbResults[0]._JOOlYbab : null;
const _KplAnvfp = _yvOaTqQQ ? JSON.parse(_yvOaTqQQ) : null;
if (!_KplAnvfp || !_KplAnvfp._XpVDEcDY || _KplAnvfp._XpVDEcDY._INBMIOUv === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' },
});
}
const _oWwSOqCE = _KplAnvfp._XpVDEcDY.map(r => r._TfMvYJJJ);
return new Response(_oWwSOqCE.join('\n'), {
_FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' },
});
} catch (_LfwZJXgS) {
console.error("API /_TfMvYJJJ 处理错误:", _LfwZJXgS);
return new Response(`API处理时出错: ${_LfwZJXgS._NuhYLxME}`, { status: 500 });
}
}
function _DKHgxeKx(_xJQlMDUP, _GsxRNrdU, _YiXTnbQd, _ZRzTxckN) {
const { itemLink } = _YiXTnbQd;
if (!itemLink || !itemLink._ImHVJKEY) return null;
const { template, _pOwpCXWE, selectionMode, _qRLRpmnh } = itemLink;
if (!_pOwpCXWE || _pOwpCXWE._INBMIOUv === 0) return null;
let _lbDtMVOm;
if (selectionMode === 'random') {
_lbDtMVOm = _pOwpCXWE[_GsxRNrdU % _pOwpCXWE._INBMIOUv];
} else if (selectionMode === 'first') {
_lbDtMVOm = _pOwpCXWE[0];
} else {
_lbDtMVOm = _pOwpCXWE.find(s => s._xxcJNnBe === selectionMode) || _pOwpCXWE[0];
}
if (!_lbDtMVOm) return null;
let _WZTaQwOR = template;
const _BUtGoeeX = _xJQlMDUP._FsMjiIin || 443;
const _ksqIIEOy = _BTIwmtPs.isIPv6(_xJQlMDUP._TfMvYJJJ) ? `[${_xJQlMDUP._TfMvYJJJ}]` : _xJQlMDUP._TfMvYJJJ;
let _xxcJNnBe = `${_GsxRNrdU + 1} 、 ${_xJQlMDUP._tVQdJaQY || '未知'}`;
if (!_xJQlMDUP._jslTkSeX || !_xJQlMDUP._jslTkSeX.toLowerCase().includes('cloudflare')) {
_xxcJNnBe += '(反代)';
}
let _iFIiuxri = _lbDtMVOm._iFIiuxri || _ZRzTxckN;
_WZTaQwOR = _WZTaQwOR.replace(/{_TfMvYJJJ}/g, _ksqIIEOy)
.replace(/{_FsMjiIin}/g, _BUtGoeeX)
.replace(/{_xxcJNnBe}/g, encodeURIComponent(_xxcJNnBe))
.replace(/{rank}/g, _GsxRNrdU + 1)
.replace(/{_tVQdJaQY}/g, encodeURIComponent(_xJQlMDUP._tVQdJaQY || '未知'))
.replace(/{_jslTkSeX}/g, encodeURIComponent(_xJQlMDUP._jslTkSeX || '未知'))
.replace(/{_iFIiuxri}/g, encodeURIComponent(_iFIiuxri))
.replace(/{_CoSPatla}/g, encodeURIComponent(_lbDtMVOm['_CoSPatla'] || ''))
.replace(/{_pxKyKJFQ}/g, encodeURIComponent(encodeURIComponent(_lbDtMVOm._pxKyKJFQ || '')));
if (_qRLRpmnh) {
_qRLRpmnh.forEach(field => {
const _dXkHZPec = new RegExp('{' + field._xxcJNnBe + '}', 'g');
_WZTaQwOR = _WZTaQwOR.replace(_dXkHZPec, encodeURIComponent(field._JOOlYbab));
});
}
return _WZTaQwOR;
}
async function _LhpNcBVF(_hIpycXRp, _owAaPKLX) {
const _YiXTnbQd = await _NuCfTRkO(_owAaPKLX);
if (!_YiXTnbQd.itemLink._ImHVJKEY) {
return new Response("Item _WZTaQwOR feature is disabled.", { status: 503, _FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' } });
}
try {
const _uRaVWyEQ = _owAaPKLX.DB.prepare("SELECT _JOOlYbab FROM kv_data WHERE _YgqOlFUZ = ?").bind(_TnoQHVoZ);
const { _XpVDEcDY: dbResults } = await _uRaVWyEQ.all();
const _yvOaTqQQ = dbResults._INBMIOUv > 0 ? dbResults[0]._JOOlYbab : null;
const _KplAnvfp = _yvOaTqQQ ? JSON.parse(_yvOaTqQQ) : null;
if (!_KplAnvfp || !_KplAnvfp._XpVDEcDY || _KplAnvfp._XpVDEcDY._INBMIOUv === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' },
});
}
const _ZRzTxckN = new URL(_hIpycXRp._dyGmaEyH)._xpmdLPTW;
const _yZLcAcCi = _KplAnvfp._XpVDEcDY.map((_xJQlMDUP, _GsxRNrdU) => {
return _DKHgxeKx(_xJQlMDUP, _GsxRNrdU, _YiXTnbQd, _ZRzTxckN);
}).filter(Boolean);
if (_yZLcAcCi._INBMIOUv === 0) {
return new Response("Could not generate any _ZJtZCMVd links from the available IPs.", {
status: 500,
_FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' },
});
}
return new Response(_yZLcAcCi.join('\n'), {
_FkdqCqtw: { 'Content-Type': '_evYOamQn/plain; _GpdJPFce=utf-8' },
});
} catch (_LfwZJXgS) {
console.error("API /api/endpoints error:", _LfwZJXgS);
return new Response(`Error processing API _hIpycXRp: ${_LfwZJXgS._NuhYLxME}`, { status: 500 });
}
}
async function _KiUcEwqz(_hIpycXRp, _owAaPKLX, _BACedYYN) {
const _KuScVJGr = _hIpycXRp._FkdqCqtw.get('CF-Connecting-IP') || "未知IP";
const [
_LpulAmsQ,
_vPrrmvOz,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_cgVJGDrR(_sTDjmVRI, _xcotFtsG, []),
_cgVJGDrR(_KBhSqVRy, _xcotFtsG, []),
_cgVJGDrR(_cHvxvmkG, _IPJHUDlh, []),
_cgVJGDrR(_QzDdCMCB, _zOkvxouS, { "N/A": "未知" })
]);
_wifTkUsQ = fetchedCountryMap;
let _HXMpdGNP = false;
let _tDDyIANp;
try {
const _CFMfwzZu = await _YSCQWAJJ(_owAaPKLX);
_HXMpdGNP = !!_CFMfwzZu;
_tDDyIANp = await _NuCfTRkO(_owAaPKLX);
} catch (_LfwZJXgS) {
if (_LfwZJXgS._NuhYLxME && _LfwZJXgS._NuhYLxME.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _YPldyVMg = "CREATE TABLE IF NOT EXISTS kv_data (_YgqOlFUZ TEXT PRIMARY KEY, _JOOlYbab TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_ZbDdKFqz TEXT PRIMARY KEY, _MoEawSSZ TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _owAaPKLX.DB.exec(_YPldyVMg);
console.log("数据表创建成功。");
_HXMpdGNP = false;
_tDDyIANp = _nAWoHFVR();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._NuhYLxME}`, {
status: 500,
_FkdqCqtw: { 'Content-Type': '_evYOamQn/html;_GpdJPFce=UTF-8' }
});
}
} else {
let _TJITSuto = _LDLIZEhP(_LfwZJXgS._NuhYLxME);
return new Response(_TJITSuto, { _FkdqCqtw: { 'Content-Type': '_evYOamQn/html;_GpdJPFce=UTF-8' } });
}
}
if (_tDDyIANp.telegram.bot_token && _tDDyIANp.telegram.chat_id) {
const _RkhBlTzX = _hIpycXRp.cf?._RkhBlTzX || "未知";
const _qnqdFLxY = _hIpycXRp.cf?._qnqdFLxY || "";
let _namKehRZ = _wifTkUsQ[_RkhBlTzX] || _RkhBlTzX;
if (_qnqdFLxY && _qnqdFLxY !== "未知城市" && _qnqdFLxY !== _RkhBlTzX) _namKehRZ = `${_namKehRZ} ${_wifTkUsQ[_qnqdFLxY] || _qnqdFLxY}`;
const _efATVXgL = _LokypsZb();
const _qQBFlUIi = _hIpycXRp._dyGmaEyH;
const _dMpbTcHW = `访客: ${_KuScVJGr}\n位置: ${_namKehRZ.trim()}\n时间: ${_efATVXgL}\n来自:${_qQBFlUIi}`;
const _LDrTDZJp = `https://api.telegram.org/bot${_tDDyIANp.telegram.bot_token}/sendMessage?chat_id=${_tDDyIANp.telegram.chat_id}&_evYOamQn=${encodeURIComponent(_dMpbTcHW)}`;
_BACedYYN.waitUntil(fetch(_LDrTDZJp).catch(_LfwZJXgS => console.error("Telegram通知失败:", _LfwZJXgS)));
}
let _DLzVUpVR = _EssobVjS();
const _ucNVXofI = {
_YiXTnbQd: _tDDyIANp,
status: {
_HXMpdGNP: _HXMpdGNP,
}
};
_DLzVUpVR = _DLzVUpVR.replace('__PAGE_DATA_JSON__', JSON.stringify(_ucNVXofI));
_DLzVUpVR = _DLzVUpVR.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_LpulAmsQ));
_DLzVUpVR = _DLzVUpVR.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_vPrrmvOz));
_DLzVUpVR = _DLzVUpVR.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_DLzVUpVR = _DLzVUpVR.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_wifTkUsQ));
return new Response(_DLzVUpVR, {
_FkdqCqtw: { 'Content-Type': '_evYOamQn/html;_GpdJPFce=UTF-8' },
});
}
function _PrZGIorL(_DsxCXtGH, status = 200, _FkdqCqtw = {}) {
return new Response(JSON.stringify(_DsxCXtGH), {
status,
_FkdqCqtw: { 'Content-Type': 'application/json;_GpdJPFce=UTF-8', ..._FkdqCqtw }
});
}
function _LokypsZb(date = new Date()) {
return new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false
}).format(date);
}
function _MfqmsMjL(_TfMvYJJJ) {
if (!_TfMvYJJJ || typeof _TfMvYJJJ !== 'string') return "无效IP";
if(_BTIwmtPs.isIPv4(_TfMvYJJJ)){
const _ZNzjLrgz = _TfMvYJJJ.split('.');
if (_ZNzjLrgz._INBMIOUv === 4) return `${_ZNzjLrgz[0]}.*.*.${_ZNzjLrgz[3]}`;
}
if(_BTIwmtPs.isIPv6(_TfMvYJJJ)){
const _ZNzjLrgz = _TfMvYJJJ.split(':');
if (_ZNzjLrgz._INBMIOUv > 2) return `${_ZNzjLrgz[0]}:...:${_ZNzjLrgz[_ZNzjLrgz._INBMIOUv - 1]}`;
}
return _TfMvYJJJ;
}
function _LDLIZEhP(_ygYxpgXI) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _GpdJPFce="UTF-8"><title>需要设置</title>
<_aOGvRyHA>
_DsxCXtGH { font-family: sans-serif; background: #1a1a1a; _ewKXAcDO: #e0e0e0; display: flex; justify-_SsbSJhVa: center; align-items: center; height: 100vh; margin: 0; }
._ItXCZyRI { max-_NHILxqjM: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _ewKXAcDO: #00a0ff; border-bottom: 1px solid #40444c; padding-bottom: 0.5rem; }
p { line-height: 1.6; }
code { background: #1a1a1a; padding: 0.2em 0.4em; border-radius: 4px; font-family: monospace; white-space: pre-wrap; word-break: break-all; }
.error { _ewKXAcDO: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_rVIHOODS: 1rem; }
</_aOGvRyHA>
</head><_DsxCXtGH>
<div class="_ItXCZyRI">
<h1>部署指南</h1>
<p>系统检测到 D1 数据库绑定存在问题。请确保您已完成以下步骤:</p>
<ol>
<li>进入 Cloudflare Dashbord -> Workers & Pages -> D1。</li>
<li>创建一个新的D1数据库 (如果还没有)。</li>
<li>将此数据库绑定到您的Worker:
<ul>
<li>进入Worker设置 -> 变量 -> D1数据库绑定。</li>
<li>变量名必须填写 <code>DB</code>。</li>
<li>选择您刚创建的数据库。</li>
<li>点击“保存并部署”。</li>
</ul>
</li>
</ol>
<p>完成以上步骤后,请刷新本页面。系统会自动为您创建所需的数据表。</p>
${_ygYxpgXI ? `<div class="error"><strong>当前错误信息:</strong> ${_ygYxpgXI.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_DsxCXtGH></html>`;
}
function _EssobVjS() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _GpdJPFce="UTF-8"> <meta _xxcJNnBe="viewport" _SsbSJhVa="_NHILxqjM=device-_NHILxqjM, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_WZTaQwOR href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Noto+Sans+SC:wght@400;500;700&family=Roboto+Mono:wght@400;500&display=swap" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/qrcode-generator/qrcode.js"></script>
<_aOGvRyHA>
:root { --primary-_ewKXAcDO: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_ewKXAcDO: #8c939d; --light-bg: #1A1C20; --_SsbSJhVa-bg: #25282E; --border-_ewKXAcDO: #40444C; --_evYOamQn-_ewKXAcDO: #E0E0E0; --_evYOamQn-light: #B0B0B0; --success-_ewKXAcDO: #30A46C; --danger-_ewKXAcDO: #DA3633; --warning-_ewKXAcDO: #DBAB0A; --border-radius-md: 8px; --border-radius-sm: 6px; --font-family-sans: 'Inter', 'Noto Sans SC', sans-serif; --font-family-mono: 'Roboto Mono', monospace; }
* { margin: 0; padding: 0; box-sizing: border-box; }
html { font-size: 16px; }
_DsxCXtGH { font-family: var(--font-family-sans); background-_ewKXAcDO: var(--light-bg); _ewKXAcDO: var(--_evYOamQn-_ewKXAcDO); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_ewKXAcDO 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_eMRJUFPK { position: fixed; _rVIHOODS: 0; _YGyPwWRe: 0; _NHILxqjM: 100%; height: 100%; z-_GsxRNrdU: -1; display: none; }
._ePgmURZz-_ItXCZyRI { max-_NHILxqjM: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_GsxRNrdU: 1; }
#_WYwcDBVJ { position: fixed; _rVIHOODS: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_GsxRNrdU: 10; }
#marquee-_ItXCZyRI { overflow: hidden; white-space: nowrap; background-_ewKXAcDO: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _ewKXAcDO: var(--primary-_ewKXAcDO); padding: 0.5rem 0; margin-_rVIHOODS: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_evYOamQn { display: inline-block; padding-_YGyPwWRe: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_fpsbyNNH { _evYOamQn-align: center; margin-_rVIHOODS: 1rem; margin-bottom: 2rem; }
_fpsbyNNH h1 { white-space: pre-wrap; font-size: 2.25em; _ewKXAcDO: var(--primary-_ewKXAcDO); font-weight: 700; _evYOamQn-shadow: 0 0 10px rgba(var(--primary-_ewKXAcDO-rgb), 0.3); }
.card { background-_ewKXAcDO: rgba(37, 40, 46, 0.85); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); border-radius: var(--border-radius-md); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25); padding: 1.5rem; margin-bottom: 1.5rem; border: 1px solid var(--border-_ewKXAcDO); }
.progress-section #_Rndrempy { _NHILxqjM: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_ewKXAcDO: var(--border-_ewKXAcDO); overflow: hidden; }
.progress-section #_Rndrempy::-webkit-progress-_JOOlYbab { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _evYOamQn-align: center; margin-_rVIHOODS: 0.75em; font-size: 0.95em; _ewKXAcDO: var(--_evYOamQn-light); min-height: 1.5em; }
.section-_fpsbyNNH { display: flex; flex-wrap: wrap; justify-_SsbSJhVa: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_ewKXAcDO); gap: 1rem; }
.section-_fpsbyNNH h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _ewKXAcDO: var(--secondary-_ewKXAcDO); _evYOamQn-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _NHILxqjM: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _NHILxqjM: 100%; border-collapse: collapse; margin-_rVIHOODS: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_ewKXAcDO); padding: 0.8em; _evYOamQn-align: _YGyPwWRe; vertical-align: middle; white-space: nowrap; }
th { background-_ewKXAcDO: #2c3038; font-weight: 500; }
tbody tr:hover { background-_ewKXAcDO: #30333a; }
td._TfMvYJJJ-_iEEYKiNi { font-weight: 500; font-family: var(--font-family-mono); _ewKXAcDO: var(--primary-_ewKXAcDO); }
td.ping-_JOOlYbab { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _evYOamQn-align: right; }
.btn { display: inline-flex; align-items: center; justify-_SsbSJhVa: center; font-weight: 500; _evYOamQn-align: center; cursor: pointer; user-_JqRyHoaC: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _ewKXAcDO: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_YGyPwWRe: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _ewKXAcDO: var(--primary-_ewKXAcDO); border: 1px solid var(--primary-_ewKXAcDO); }
.btn-outline:hover { background-_ewKXAcDO: var(--primary-_ewKXAcDO); _ewKXAcDO: var(--_SsbSJhVa-bg); }
._ePgmURZz-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._ePgmURZz-download-buttons .btn { _NHILxqjM: 100%; margin: 0; }
.tooltip-notification { position: fixed; _rVIHOODS: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _ewKXAcDO: #fff; font-size: 0.95em; z-_GsxRNrdU: 10002; box-shadow: 0 6px 15px rgba(0, 0, 0, 0.35); opacity: 0; transform: translateY(-20px); transition: all 0.3s ease; pointer-events: none; }
.tooltip-notification.show { opacity: 1; transform: translateY(0); }
#_INbsoaji, #_oNXQtXGf, #_oghAOJQe, #_YwzzMmVZ, #_wQjPVkUo { display: none; position: fixed; z-_GsxRNrdU: 10000; _YGyPwWRe: 0; _rVIHOODS: 0; _NHILxqjM: 100%; height: 100%; background-_ewKXAcDO: rgba(0,0,0,0.6); justify-_SsbSJhVa: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_SsbSJhVa, ._ePgmURZz-modal-_SsbSJhVa { background-_ewKXAcDO: var(--_SsbSJhVa-bg); padding: 2rem; border: 1px solid var(--border-_ewKXAcDO); border-radius: var(--border-radius-md); _NHILxqjM: 95%; max-_NHILxqjM: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_YwzzMmVZ .modal-_SsbSJhVa { max-_NHILxqjM: 500px; }
.modal-_SsbSJhVa h3, ._ePgmURZz-modal-_fpsbyNNH h3 { margin-_rVIHOODS: 0; margin-bottom: 1.5rem; _ewKXAcDO: var(--primary-_ewKXAcDO); _evYOamQn-align: center; }
.modal-buttons { display: flex; justify-_SsbSJhVa: flex-end; gap: 1rem; margin-_rVIHOODS: 2rem; border-_rVIHOODS: 1px solid var(--border-_ewKXAcDO); padding-_rVIHOODS: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_ewKXAcDO), rgba(0,0,0,0)); margin: 2rem 0; }
._ePgmURZz-modal-_fpsbyNNH { display: flex; justify-_SsbSJhVa: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_ewKXAcDO); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _ewKXAcDO: var(--_evYOamQn-light); cursor: pointer; background: none; border: none; padding: 0; }
._ePgmURZz-list-_ZJtZCMVd { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_ewKXAcDO); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._ePgmURZz-_xxcJNnBe { font-size: 1.1em; font-weight: 600; }
._ePgmURZz-links a { display: block; _ewKXAcDO: var(--primary-_ewKXAcDO); _evYOamQn-decoration: none; margin-_rVIHOODS: 0.5rem; word-break: break-all; }
._ePgmURZz-links a:hover { _evYOamQn-decoration: underline; }
._ePgmURZz-links span { _ewKXAcDO: var(--_evYOamQn-light); }
#visitorPasswordPrompt { _evYOamQn-align: center; }
#visitorPasswordPrompt h3 { _ewKXAcDO: var(--primary-_ewKXAcDO); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _ewKXAcDO: var(--_evYOamQn-light); margin-bottom: 1.5rem; }
._CFMfwzZu-input-group { display: flex; gap: 10px; max-_NHILxqjM: 400px; margin: 0 auto; }
._CFMfwzZu-input-group input { flex-grow: 1; _evYOamQn-align: center; }
._CFMfwzZu-input-group .btn { margin-_YGyPwWRe: 0; }
._XpVDEcDY-actions-_ItXCZyRI { _evYOamQn-align: center; margin-bottom: 1.5rem; }
._XpVDEcDY-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._XpVDEcDY-api-buttons .btn { margin: 0; _NHILxqjM: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_SsbSJhVa 1fr; gap: 1.2rem 1rem; align-items: center; }
.form-grid-label { justify-self: end; display: flex; align-items: center; gap: 8px; }
.form-grid-control { display: flex; align-items: center; gap: 10px; }
.form-grid-control-full { grid-column: 1 / -1; }
.form-grid-control input, .form-grid-control _JqRyHoaC, .form-grid-control textarea { _NHILxqjM: 100%; background-_ewKXAcDO: var(--light-bg); border: 1px solid var(--border-_ewKXAcDO); border-radius: var(--border-radius-sm); _ewKXAcDO: var(--_evYOamQn-_ewKXAcDO); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_ewKXAcDO 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _JqRyHoaC:focus, .form-grid-control textarea:focus { border-_ewKXAcDO: var(--primary-_ewKXAcDO); box-shadow: 0 0 0 2px rgba(var(--primary-_ewKXAcDO-rgb), 0.2); outline: none; }
.form-grid-control input[_HBQootdK="_ewKXAcDO"] { min-_NHILxqjM: auto; padding: 2px; _NHILxqjM: 2.5em; height: 2.5em; }
.form-grid-control input[_HBQootdK="checkbox"] { _NHILxqjM: auto; flex-shrink: 0; height: 1.2em; _NHILxqjM: 1.2em; }
.form-grid-control ._xpwwvVDY-input { _NHILxqjM: 80px; _evYOamQn-align: right; }
.tooltip-_dnMbfQCc { display: inline-flex; _NHILxqjM: 16px; height: 16px; align-items: center; justify-_SsbSJhVa: center; background-_ewKXAcDO: var(--secondary-_ewKXAcDO); _ewKXAcDO: var(--_SsbSJhVa-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_JqRyHoaC: none; }
#tooltip-popup { position: fixed; background-_ewKXAcDO: #383c4a; _ewKXAcDO: #fff; padding: 10px 15px; border-radius: 6px; z-_GsxRNrdU: 10001; font-size: 0.85em; max-_NHILxqjM: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_ewKXAcDO); pointer-events: none; }
#custom-fields-_ItXCZyRI .form-grid-control { gap: 5px; } #custom-fields-_ItXCZyRI .form-grid-control input { flex: 1; }
.parameter-_HbvIBjJh-_uSayhGfc { border: 1px solid var(--border-_ewKXAcDO); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_HbvIBjJh-_fpsbyNNH { display: flex; justify-_SsbSJhVa: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_HbvIBjJh-_fpsbyNNH input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_rVIHOODS: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._evYOamQn-_ewKXAcDO-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _NHILxqjM: 100%; }
._evYOamQn-_ewKXAcDO-grid input[_HBQootdK="_ewKXAcDO"] { grid-column: 1 / 2; }
._evYOamQn-_ewKXAcDO-grid input[_HBQootdK="_evYOamQn"], ._evYOamQn-_ewKXAcDO-grid textarea { grid-column: 2 / 3; }
#_YwzzMmVZ .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_YwzzMmVZ .btn-group { display: flex; }
#_YwzzMmVZ .sub-btn { flex-grow: 1; margin: 0; }
#_YwzzMmVZ ._FQfFMdjj-btn { flex-shrink: 0; margin-_YGyPwWRe: -1px; border-_rVIHOODS-_YGyPwWRe-radius: 0; border-bottom-_YGyPwWRe-radius: 0; }
#_wQjPVkUo .modal-_SsbSJhVa { max-_NHILxqjM: 300px; background: white; padding: 1rem; _evYOamQn-align: center; }
#qrCodeImg { max-_NHILxqjM: 100%; }
@media (max-_NHILxqjM: 768px) {
html { font-size: 15px; } ._ePgmURZz-_ItXCZyRI { padding: 0 0.8rem; } _fpsbyNNH { margin-_rVIHOODS: 2.5rem; margin-bottom: 1.5rem; } #_WYwcDBVJ { _rVIHOODS: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_aOGvRyHA>
<_aOGvRyHA _ZbDdKFqz="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_SsbSJhVa-bg: #FFFFFF; --border-_ewKXAcDO: #DCDFE6; --_evYOamQn-_ewKXAcDO: #303133; --_evYOamQn-light: #606266; }
.theme-light .card { background-_ewKXAcDO: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_ewKXAcDO: #F5F7FA; }
.theme-light tbody tr:hover { background-_ewKXAcDO: #ECF5FF; }
.theme-matrix { --primary-_ewKXAcDO: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_SsbSJhVa-bg: #0D0208; --border-_ewKXAcDO: #00FF41; --_evYOamQn-_ewKXAcDO: #00FF41; --_evYOamQn-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_ewKXAcDO: rgba(0, 20, 0, 0.7); _evYOamQn-shadow: 0 0 5px var(--primary-_ewKXAcDO); backdrop-filter: none; }
.theme-matrix th { background-_ewKXAcDO: #000; }
.theme-matrix tbody tr:hover { background-_ewKXAcDO: #010; }
.theme-matrix .btn { _evYOamQn-shadow: none; _ewKXAcDO: #000; }
.theme-matrix .btn-outline { background-_ewKXAcDO: transparent; }
.theme-modern-glass { --primary-_ewKXAcDO: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_SsbSJhVa-bg: rgba(30, 30, 40, 0.6); --border-_ewKXAcDO: rgba(255, 255, 255, 0.2); --_evYOamQn-_ewKXAcDO: #F0F0F0; --_evYOamQn-light: #A0A0B0; --border-radius-md: 12px; }
_DsxCXtGH.theme-modern-glass { background: linear-gradient(-45deg, #000428, #004e92, #1CB5E0, #23D5AB); background-size: 400% 400%; animation: gradientBG 15s ease infinite; }
@keyframes gradientBG { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }
.theme-particles-glass { --primary-_ewKXAcDO: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_SsbSJhVa-bg: rgba(30, 30, 40, 0.6); --border-_ewKXAcDO: rgba(255, 255, 255, 0.2); --_evYOamQn-_ewKXAcDO: #F0F0F0; --_evYOamQn-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_ewKXAcDO: var(--_SsbSJhVa-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_ewKXAcDO); }
.glassy-components .btn { background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid rgba(255, 255, 255, 0.2); border-bottom-_ewKXAcDO: rgba(0,0,0,0.3); border-right-_ewKXAcDO: rgba(0,0,0,0.3); box-shadow: 0 4px 15px rgba(0,0,0,0.2), inset 0 1px 1px rgba(255,255,255,0.1); _evYOamQn-shadow: 0 1px 2px rgba(0,0,0,0.2); _ewKXAcDO: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_ewKXAcDO: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _evYOamQn-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_ewKXAcDO); border-_ewKXAcDO: var(--primary-_ewKXAcDO); _ewKXAcDO: #fff; }
.glassy-components _fpsbyNNH h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _evYOamQn; -webkit-_evYOamQn-fill-_ewKXAcDO: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _ewKXAcDO: transparent; }
.theme-aurora-glass { --primary-_ewKXAcDO: #38bdf8; --light-bg: #0c0a09; --_SsbSJhVa-bg: rgba(23, 23, 23, 0.5); --border-_ewKXAcDO: rgba(255, 255, 255, 0.15); --_evYOamQn-_ewKXAcDO: #f2f2f2; --_evYOamQn-light: #a3a3a3; }
_DsxCXtGH.theme-aurora-glass::before { _SsbSJhVa: ''; position: fixed; _rVIHOODS: 0; _YGyPwWRe: 0; _NHILxqjM: 100%; height: 100%; z-_GsxRNrdU: -2; background: radial-gradient(at 27% 37%, hsla(215, 98%, 61%, 0.4) 0px, transparent 50%), radial-gradient(at 97% 21%, hsla(125, 98%, 72%, 0.2) 0px, transparent 50%), radial-gradient(at 52% 99%, hsla(355, 98%, 76%, 0.3) 0px, transparent 50%), radial-gradient(at 10% 29%, hsla(256, 96%, 68%, 0.3) 0px, transparent 50%), radial-gradient(at 97% 96%, hsla(38, 60%, 74%, 0.2) 0px, transparent 50%), radial-gradient(at 33% 50%, hsla(222, 67%, 73%, 0.3) 0px, transparent 50%), radial-gradient(at 79% 53%, hsla(343, 68%, 73%, 0.2) 0px, transparent 50%); animation: auroraBG 20s ease-in-out infinite alternate; }
@keyframes auroraBG { from { transform: scale(1); } to { transform: scale(1.5); } }
.theme-cyberpunk-glass { --primary-_ewKXAcDO: #08fdd8; --light-bg: #010409; --_SsbSJhVa-bg: rgba(22, 27, 34, 0.6); --border-_ewKXAcDO: rgba(139, 148, 158, 0.3); --_evYOamQn-_ewKXAcDO: #e6edf3; --_evYOamQn-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_ewKXAcDO), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_ewKXAcDO-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_ewKXAcDO-rgb), 0.5); }
.theme-marble-light { --primary-_ewKXAcDO: #bfa37c; --light-bg: #f7f5f2; --_SsbSJhVa-bg: #ffffff; --border-_ewKXAcDO: #e0dcd5; --_evYOamQn-_ewKXAcDO: #3d3a36; --_evYOamQn-light: #6b6661; }
_DsxCXtGH.theme-marble-light { background-image: _dyGmaEyH('_MoEawSSZ:image/svg+xml,%3Csvg _NHILxqjM="60" height="60" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cg fill="%23dcd6ca" fill-opacity="0.2"%3E%3Cpath d="M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z"/%3E%3C/g%3E%3C/g%3E%3C/svg%3E'); }
.theme-marble-light .card { background-_ewKXAcDO: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_aOGvRyHA>
</head><_DsxCXtGH _ZbDdKFqz="pageBody">
<_eMRJUFPK _ZbDdKFqz="background-_eMRJUFPK"></_eMRJUFPK>
<div _ZbDdKFqz="_INbsoaji">
<div class="modal-_SsbSJhVa">
<h3>首次使用 - 请设置管理员密码</h3>
<p>这是您第一次访问本页面,为了保护您的设置,请创建一个管理员密码。</p>
<div class="form-grid"><div class="form-grid-label"><label for="initialPassword">新密码 (至少6位)</label></div><div class="form-grid-control"><input _HBQootdK="_CFMfwzZu" _ZbDdKFqz="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _HBQootdK="_CFMfwzZu" _ZbDdKFqz="confirmPassword"></div></div>
<div class="modal-buttons"><button _ZbDdKFqz="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_ePgmURZz-_ItXCZyRI">
<button _ZbDdKFqz="_WYwcDBVJ" class="btn btn-outline"></button>
<div _ZbDdKFqz="marquee-_ItXCZyRI"><div _ZbDdKFqz="marquee-_evYOamQn"></div></div>
<_fpsbyNNH><h1 _ZbDdKFqz="pageTitle"></h1></_fpsbyNNH>
<div class="card" _ZbDdKFqz="visitorPasswordPrompt" _aOGvRyHA="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_CFMfwzZu-input-group">
<input _HBQootdK="_CFMfwzZu" _ZbDdKFqz="visitorPasswordEntry" _dXkHZPec="访客密码">
<button _ZbDdKFqz="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _ZbDdKFqz="_OzeTyzJa" _aOGvRyHA="display: block;">
<div class="card progress-section">
<div _ZbDdKFqz="progressDisplay">
<progress _ZbDdKFqz="_Rndrempy" _JOOlYbab="0" max="100"></progress>
<div _ZbDdKFqz="status">正在初始化...</div>
</div>
</div>
<div class="card _ePgmURZz-download-section">
<div class="section-_fpsbyNNH"><h2 _ZbDdKFqz="appDownloadTitleEl"></h2></div>
<div class="_ePgmURZz-download-buttons">
<button class="btn" _MoEawSSZ-_kMllJtvk="android">安卓客户端</button>
<button class="btn" _MoEawSSZ-_kMllJtvk="ios">苹果客户端</button>
<button class="btn" _MoEawSSZ-_kMllJtvk="windows">Windows客户端</button>
<button class="btn" _MoEawSSZ-_kMllJtvk="mac">Mac客户端</button>
</div>
</div>
<div class="card _XpVDEcDY-section" _ZbDdKFqz="_OGMtdKRz" _aOGvRyHA="display:none;">
<div class="section-_fpsbyNNH">
<h2 _ZbDdKFqz="liveTitleEl"></h2>
<div class="generator-info" _ZbDdKFqz="liveGeneratorInfo"></div>
</div>
<div _ZbDdKFqz="_VqwEilWB" class="_XpVDEcDY-actions-_ItXCZyRI" _aOGvRyHA="display: none;">
<div class="_XpVDEcDY-api-buttons">
<button _ZbDdKFqz="copyIpApiBtn" class="btn">复制 IP API</button>
<button _ZbDdKFqz="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _ZbDdKFqz="resultsTable">
<thead><tr><th _ZbDdKFqz="tableHeader1El"></th><th _ZbDdKFqz="tableHeader2El"></th><th _ZbDdKFqz="tableHeader3El"></th><th _ZbDdKFqz="tableHeader4El"></th><th _ZbDdKFqz="tableHeader5El"></th><th _ZbDdKFqz="tableHeader6El"></th><th _ZbDdKFqz="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _ZbDdKFqz="_gbxusszC" _aOGvRyHA="display:none;">
<div class="section-_fpsbyNNH"><h2 _ZbDdKFqz="cachedTitleEl"></h2><div class="generator-info" _ZbDdKFqz="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _ZbDdKFqz="cachedResultsTable">
<thead><tr><th _ZbDdKFqz="cachedTableHeader1El"></th><th _ZbDdKFqz="cachedTableHeader2El"></th><th _ZbDdKFqz="cachedTableHeader3El"></th><th _ZbDdKFqz="cachedTableHeader4El"></th><th _ZbDdKFqz="cachedTableHeader5El"></th><th _ZbDdKFqz="cachedTableHeader6El"></th><th _ZbDdKFqz="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _ZbDdKFqz="notificationTooltip" class="tooltip-notification"></div>
<div _ZbDdKFqz="_oNXQtXGf">
<div class="modal-_SsbSJhVa">
<h3>修改参数</h3>
<div _aOGvRyHA="display: flex; border-bottom: 1px solid var(--border-_ewKXAcDO); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_DWmmKigi(event, 'general-_roHqXwKt')">通用设置</button>
<button class="tab-button" onclick="_DWmmKigi(event, '_WZTaQwOR-_roHqXwKt')">链接设置</button>
<button class="tab-button" onclick="_DWmmKigi(event, 'fine-grained-_roHqXwKt')">IP源设置</button>
<button class="tab-button" onclick="_DWmmKigi(event, 'advanced-_roHqXwKt')">高级设置</button>
</div>
<div _ZbDdKFqz="general-_roHqXwKt" class="tab-_SsbSJhVa" _aOGvRyHA="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_JqRyHoaC _ZbDdKFqz="themeSelect">
<_UEFCnKXm _JOOlYbab="theme-aurora-glass">极光-玻璃质感</_UEFCnKXm>
<_UEFCnKXm _JOOlYbab="theme-particles-glass">粒子-玻璃质感</_UEFCnKXm>
<_UEFCnKXm _JOOlYbab="theme-modern-glass">现代-玻璃质感</_UEFCnKXm>
<_UEFCnKXm _JOOlYbab="theme-cyberpunk-glass">赛博朋克-玻璃质感</_UEFCnKXm>
<_UEFCnKXm _JOOlYbab="theme-dark-particles">暗色-粒子背景</_UEFCnKXm>
<_UEFCnKXm _JOOlYbab="theme-dark-bing">暗色-必应壁纸</_UEFCnKXm>
<_UEFCnKXm _JOOlYbab="theme-light">亮色-简约</_UEFCnKXm>
<_UEFCnKXm _JOOlYbab="theme-light-bing">亮色-必应壁纸</_UEFCnKXm>
<_UEFCnKXm _JOOlYbab="theme-marble-light">简约大理石-亮色</_UEFCnKXm>
<_UEFCnKXm _JOOlYbab="theme-matrix">矩阵-代码雨</_UEFCnKXm>
</_JqRyHoaC>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _HBQootdK="_ewKXAcDO" _ZbDdKFqz="primaryColorInput">
<span _aOGvRyHA="_NHILxqjM: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _HBQootdK="_ewKXAcDO" _ZbDdKFqz="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _aOGvRyHA="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_evYOamQn-_ewKXAcDO-grid"><input _HBQootdK="_ewKXAcDO" _ZbDdKFqz="colorInput_title"><textarea _ZbDdKFqz="textInput_title" _HyqfjkNh="1" _dXkHZPec="页面主标题"></textarea></div>
<div class="_evYOamQn-_ewKXAcDO-grid"><input _HBQootdK="_ewKXAcDO" _ZbDdKFqz="colorInput_loginButton"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="textInput_loginButton" _dXkHZPec="登录按钮文本"></div>
<div class="_evYOamQn-_ewKXAcDO-grid"><input _HBQootdK="_ewKXAcDO" _ZbDdKFqz="colorInput_appDownloadTitle"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="textInput_appDownloadTitle" _dXkHZPec="APP下载标题"></div>
<div class="_evYOamQn-_ewKXAcDO-grid"><input _HBQootdK="_ewKXAcDO" _ZbDdKFqz="colorInput_liveTitle"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="textInput_liveTitle" _dXkHZPec="本次结果标题"></div>
<div class="_evYOamQn-_ewKXAcDO-grid"><input _HBQootdK="_ewKXAcDO" _ZbDdKFqz="colorInput_cachedTitle"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="textInput_cachedTitle" _dXkHZPec="上次结果标题"></div>
<div class="_evYOamQn-_ewKXAcDO-grid"><input _HBQootdK="_ewKXAcDO" _ZbDdKFqz="colorInput_tableHeader"><input _HBQootdK="_evYOamQn" _JOOlYbab="表格头部文本颜色" readonly _aOGvRyHA="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _aOGvRyHA="align-self: start;"><label>公告栏设置</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _ZbDdKFqz="announcementText" _dXkHZPec="在此输入公告内容" _HyqfjkNh="3"></textarea>
<div _aOGvRyHA="display: flex; justify-_SsbSJhVa: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _aOGvRyHA="display: flex; align-items: center; gap: 5px;"><input _HBQootdK="checkbox" _ZbDdKFqz="enableMarquee"> 顶部走马灯</label>
<label _aOGvRyHA="display: flex; align-items: center; gap: 5px;"><input _HBQootdK="checkbox" _ZbDdKFqz="enablePopup"> 右上角弹窗</label>
<div _ZbDdKFqz="popupDurationContainer" _aOGvRyHA="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _HBQootdK="number" _ZbDdKFqz="popupDuration" _aOGvRyHA="_NHILxqjM: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _ZbDdKFqz="_WZTaQwOR-_roHqXwKt" class="tab-_SsbSJhVa">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="converterServiceUrlInput" _dXkHZPec="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _HBQootdK="number" _ZbDdKFqz="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _aOGvRyHA="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _ZbDdKFqz="subscriptionIdCharset" _HyqfjkNh="3"></textarea></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableItemLinkCheckbox">启用"复制节点链接"按钮</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="justify-_SsbSJhVa: flex-start;"><input _HBQootdK="checkbox" _ZbDdKFqz="enableItemLinkCheckbox"></div>
</div>
<div _ZbDdKFqz="itemLinkConfigGroup" _aOGvRyHA="display:none; margin-_rVIHOODS: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _aOGvRyHA="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="定义分享链接格式。可用占位符: {_TfMvYJJJ}, {_FsMjiIin}, {_xxcJNnBe}, {rank}, {_tVQdJaQY}, {_jslTkSeX}, {_iFIiuxri}, {_CoSPatla}, {_pxKyKJFQ}。">?</span></div>
<div class="form-grid-control"><textarea _ZbDdKFqz="itemLinkTemplateInput" _HyqfjkNh="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_JqRyHoaC _ZbDdKFqz="parameterSelectionMode"></_JqRyHoaC></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _ZbDdKFqz="parameter-sets-_ItXCZyRI"></div><button _HBQootdK="button" _ZbDdKFqz="add-parameter-_HbvIBjJh-btn" class="btn btn-outline" _aOGvRyHA="margin-_rVIHOODS: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _aOGvRyHA="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _ZbDdKFqz="custom-fields-_ItXCZyRI" _aOGvRyHA="_NHILxqjM: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _aOGvRyHA="justify-_SsbSJhVa: flex-start;"><button _HBQootdK="button" _ZbDdKFqz="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _ZbDdKFqz="fine-grained-_roHqXwKt" class="tab-_SsbSJhVa">
<div class="form-grid-label" _aOGvRyHA="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _aOGvRyHA="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_SsbSJhVa: flex-start;">
<label><input _HBQootdK="checkbox" _ZbDdKFqz="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _HBQootdK="checkbox" _ZbDdKFqz="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _ZbDdKFqz="fine-grained-sources-_ItXCZyRI"></div><button _HBQootdK="button" _ZbDdKFqz="add-fine-grained-_UYXpKKDY-btn" class="btn btn-outline" _aOGvRyHA="margin-_rVIHOODS: 10px;">添加地区</button></div>
</div>
<div _ZbDdKFqz="advanced-_roHqXwKt" class="tab-_SsbSJhVa">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _HBQootdK="checkbox" _ZbDdKFqz="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _ZbDdKFqz="resolvedDomainsGroup" _aOGvRyHA="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _ZbDdKFqz="resolvedDomainsInput" _dXkHZPec="留空则使用内置默认域名" _HyqfjkNh="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomNodesCheckbox">启用自定义节点</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _HBQootdK="checkbox" _ZbDdKFqz="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _ZbDdKFqz="customNodesGroup" _aOGvRyHA="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _ZbDdKFqz="customNodesInput" _dXkHZPec="一行一个地址,支持域名、IPv4、IPv6。" _HyqfjkNh="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="sampleSizeInput">测试IP总数</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _HBQootdK="number" _ZbDdKFqz="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _HBQootdK="number" _ZbDdKFqz="topNInput"></div>
<div class="form-grid-label" _aOGvRyHA="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="display: none;"><input _HBQootdK="number" _ZbDdKFqz="latencyRangeMinInput" _dXkHZPec="最小"><span>-</span><input _HBQootdK="number" _ZbDdKFqz="latencyRangeMaxInput" _dXkHZPec="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="justify-_SsbSJhVa: flex-start;"><input _HBQootdK="checkbox" _ZbDdKFqz="enableIspFilterCheckbox"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="geoLocationRetriesInput">归属地查询失败复查</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _HBQootdK="number" _ZbDdKFqz="geoLocationRetriesInput" _aOGvRyHA="_NHILxqjM: 80px;"> <span>次</span>
<div _aOGvRyHA="display: flex; align-items: center; gap: 5px; margin-_YGyPwWRe: 20px;">
<input _HBQootdK="checkbox" _ZbDdKFqz="filterUnknownGeoCheckbox">
<label for="filterUnknownGeoCheckbox">过滤未知归属地IP</label>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="universalFallbackAddressInput">备用地址 (上游)</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_iFIiuxri:_FsMjiIin' 或 '_iFIiuxri'。">?</span></div>
<div class="form-grid-control"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="universalFallbackAddressInput"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableWebsocketStreamerCheckbox">启用 Websocket 转发</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="justify-_SsbSJhVa: flex-start;"><input _HBQootdK="checkbox" _ZbDdKFqz="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _ZbDdKFqz="websocketStreamerGroup" _aOGvRyHA="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="websocketStreamerUrlInput"></div>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableStreamerCheckbox">启用内置内容加速</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="justify-_SsbSJhVa: flex-start;"><input _HBQootdK="checkbox" _ZbDdKFqz="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="启用 /_TfMvYJJJ 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="justify-_SsbSJhVa: flex-start;"><input _HBQootdK="checkbox" _ZbDdKFqz="enableApiCheckbox"></div>
<div class="form-grid-control-full" _ZbDdKFqz="apiConfigGroup" _aOGvRyHA="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="apiMessageInput"></div></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomSubPathCheckbox">启用自定义订阅路径</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="justify-_SsbSJhVa: flex-start;"><input _HBQootdK="checkbox" _ZbDdKFqz="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _ZbDdKFqz="customSubPathGroup" _aOGvRyHA="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="customSubPathInput" _dXkHZPec="例如: latest"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableVisitorPasswordCheckbox">启用访客密码</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="justify-_SsbSJhVa: flex-start;"><input _HBQootdK="checkbox" _ZbDdKFqz="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _ZbDdKFqz="visitorPasswordGroup" _aOGvRyHA="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _aOGvRyHA="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_dnMbfQCc" _MoEawSSZ-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _aOGvRyHA="flex-direction: column; align-items: stretch; gap: 8px;"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="botTokenInput" _dXkHZPec="Telegram Bot Token"><input _HBQootdK="_evYOamQn" _ZbDdKFqz="chatIdInput" _dXkHZPec="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _aOGvRyHA="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _aOGvRyHA="flex-direction: column; align-items: stretch; gap: 8px;"><input _HBQootdK="_CFMfwzZu" _ZbDdKFqz="oldPasswordInput" _dXkHZPec="旧密码"><input _HBQootdK="_CFMfwzZu" _ZbDdKFqz="newPasswordInput" _dXkHZPec="新密码 (至少6位)"><button _ZbDdKFqz="changePasswordBtn" class="btn" _aOGvRyHA="align-self: flex-start; margin-_YGyPwWRe: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _ZbDdKFqz="closeModalBtn" class="btn btn-outline">关闭</button><button _ZbDdKFqz="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _ZbDdKFqz="_oghAOJQe">
<div class="_ePgmURZz-modal-_SsbSJhVa">
<div class="_ePgmURZz-modal-_fpsbyNNH"><h3 _ZbDdKFqz="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_ePgmURZz-modal-_DsxCXtGH" _ZbDdKFqz="appModalBody"></div>
</div>
</div>
<div _ZbDdKFqz="_YwzzMmVZ">
<div class="modal-_SsbSJhVa">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _MoEawSSZ-sub-_HBQootdK="coreEngine">Xray</button><button class="btn _FQfFMdjj-btn" _MoEawSSZ-sub-_HBQootdK="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _MoEawSSZ-sub-_HBQootdK="coreProfile">Sing-Box</button><button class="btn _FQfFMdjj-btn" _MoEawSSZ-sub-_HBQootdK="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _MoEawSSZ-sub-_HBQootdK="configProfile">Clash</button><button class="btn _FQfFMdjj-btn" _MoEawSSZ-sub-_HBQootdK="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _MoEawSSZ-sub-_HBQootdK="policyProfile">Surge</button><button class="btn _FQfFMdjj-btn" _MoEawSSZ-sub-_HBQootdK="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _aOGvRyHA="justify-_SsbSJhVa: center;"><button class="btn btn-outline" _ZbDdKFqz="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _ZbDdKFqz="_wQjPVkUo">
<div class="modal-_SsbSJhVa">
<img _ZbDdKFqz="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _BTIwmtPs = {
isValid: (_TfMvYJJJ) => _BTIwmtPs.isIPv4(_TfMvYJJJ) || _BTIwmtPs.isIPv6(_TfMvYJJJ),
isIPv4: (_TfMvYJJJ) => {
if (typeof _TfMvYJJJ !== 'string') return false;
const _ZNzjLrgz = _TfMvYJJJ.split('.');
if (_ZNzjLrgz._INBMIOUv !== 4) return false;
return _ZNzjLrgz.every(_SkAkOlHH => {
const _XmMqzLNO = parseInt(_SkAkOlHH, 10);
return !isNaN(_XmMqzLNO) && _XmMqzLNO >= 0 && _XmMqzLNO <= 255 && String(_XmMqzLNO) === _SkAkOlHH;
});
},
isIPv6: (_TfMvYJJJ) => {
if (typeof _TfMvYJJJ !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_DwqCbJFR.test(_TfMvYJJJ);
},
toLong4: (_TfMvYJJJ) => _TfMvYJJJ.split('.').reduce((acc, octet, _DwqCbJFR) => acc + (parseInt(octet) << (8*(3-_DwqCbJFR))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_TfMvYJJJ) => {
try {
const _KmlNffAd = _TfMvYJJJ.split('/')[0];
const _ZNzjLrgz = _KmlNffAd.split('::');
if (_ZNzjLrgz._INBMIOUv > 2) return 0n;
let _oOMXcFcq = [];
if (_ZNzjLrgz[0]) {
_oOMXcFcq = _ZNzjLrgz[0].split(':');
}
let _JKFlYWSV = [];
if (_ZNzjLrgz._INBMIOUv > 1 && _ZNzjLrgz[1]) {
_JKFlYWSV = _ZNzjLrgz[1].split(':');
}
if (_oOMXcFcq._INBMIOUv + _JKFlYWSV._INBMIOUv > 8) return 0n;
const _RimSJSDo = 8 - (_oOMXcFcq._INBMIOUv + _JKFlYWSV._INBMIOUv);
const _typvTbpv = [
..._oOMXcFcq,
...Array(_RimSJSDo).fill('0'),
..._JKFlYWSV
].map(_SkAkOlHH => _SkAkOlHH || '0');
while(_typvTbpv._INBMIOUv < 8) {
_typvTbpv.push('0');
}
let _LLTZakHn = 0n;
for (const _SkAkOlHH of _typvTbpv) {
if (_SkAkOlHH._INBMIOUv > 4) return 0n;
const _JOOlYbab = BigInt('0x' + _SkAkOlHH);
_LLTZakHn = (_LLTZakHn << 16n) | _JOOlYbab;
}
return _LLTZakHn;
} catch(_LfwZJXgS) {
return 0n;
}
},
fromBigInt6: (_LLTZakHn) => {
if (typeof _LLTZakHn !== '_LLTZakHn' || _LLTZakHn < 0n) return null;
const _ZNzjLrgz = [];
for (let _DwqCbJFR = 0; _DwqCbJFR < 8; _DwqCbJFR++) {
_ZNzjLrgz.unshift((_LLTZakHn & 0xFFFFn).toString(16));
_LLTZakHn >>= 16n;
}
let _vllELEwN = { start: -1, _UAOylmAz: 0 };
let _RXzsPxBK = { start: -1, _UAOylmAz: 0 };
for (let _DwqCbJFR = 0; _DwqCbJFR < 8; _DwqCbJFR++) {
if (_ZNzjLrgz[_DwqCbJFR] === '0') {
if (_RXzsPxBK.start === -1) _RXzsPxBK.start = _DwqCbJFR;
_RXzsPxBK._UAOylmAz++;
} else {
if (_RXzsPxBK._UAOylmAz > _vllELEwN._UAOylmAz) _vllELEwN = { ..._RXzsPxBK };
_RXzsPxBK = { start: -1, _UAOylmAz: 0 };
}
}
if (_RXzsPxBK._UAOylmAz > _vllELEwN._UAOylmAz) _vllELEwN = { ..._RXzsPxBK };
if (_vllELEwN._UAOylmAz > 1) {
_ZNzjLrgz.splice(_vllELEwN.start, _vllELEwN._UAOylmAz, '');
if (_vllELEwN.start === 0) _ZNzjLrgz.unshift('');
if (_vllELEwN.start + _vllELEwN._UAOylmAz === 8) _ZNzjLrgz.push('');
}
return _ZNzjLrgz.join(':');
},
cidrToRange: (cidr, _HkRwsJLL = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _dRnSwTRe = parseInt(bitsStr, 10);
const _oWwSOqCE = new Set();
if (_BTIwmtPs.isIPv4(range)) {
if (isNaN(_dRnSwTRe) || _dRnSwTRe < 8 || _dRnSwTRe > 32) return [];
if (_dRnSwTRe === 32) return [range];
const _ACIkShZp = _BTIwmtPs.toLong4(range);
const _DujhaPzY = (0xFFFFFFFF << (32 - _dRnSwTRe)) >>> 0;
const _NDnqviyv = _ACIkShZp & _DujhaPzY;
const _RUZViJrS = 1 << (32 - _dRnSwTRe);
if (_RUZViJrS <= 2) return [];
const _uVrQhXaC = Math.min(_HkRwsJLL, _RUZViJrS - 2);
let _MXvLcRMH = 0;
while (_oWwSOqCE.size < _uVrQhXaC && _MXvLcRMH < _uVrQhXaC * 5) {
const _jSodobYQ = Math.floor(Math.random() * (_RUZViJrS - 2)) + 1;
_oWwSOqCE.add(_BTIwmtPs.fromLong4((_NDnqviyv + _jSodobYQ) >>> 0));
_MXvLcRMH++;
}
return Array.from(_oWwSOqCE);
} else if (_BTIwmtPs.isIPv6(range)) {
if (isNaN(_dRnSwTRe) || _dRnSwTRe < 16 || _dRnSwTRe > 128) return [];
if (_dRnSwTRe === 128) return [range];
const _EspzvhXg = _BTIwmtPs.toBigInt6(range);
const _DujhaPzY = (2n ** BigInt(128 - _dRnSwTRe) - 1n);
const _NDnqviyv = _EspzvhXg & ~_DujhaPzY;
const _ePvGpXmI = 2n ** BigInt(128 - _dRnSwTRe);
if (_ePvGpXmI <= 2n) return [];
let _MXvLcRMH = 0;
while (_oWwSOqCE.size < _HkRwsJLL && _MXvLcRMH < _HkRwsJLL * 5) {
const _yeZYpwjQ = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_yeZYpwjQ);
let _LaWhrYmO = 0n;
for (const _caNHWEum of _yeZYpwjQ) {
_LaWhrYmO = (_LaWhrYmO << 8n) | BigInt(_caNHWEum);
}
const _jSodobYQ = _LaWhrYmO % (_ePvGpXmI - 2n) + 1n;
_oWwSOqCE.add(_BTIwmtPs.fromBigInt6(_NDnqviyv + _jSodobYQ));
_MXvLcRMH++;
}
return Array.from(_oWwSOqCE);
}
return [];
} catch(_LfwZJXgS) {
console.error(`CIDR to range failed for ${cidr}:`, _LfwZJXgS);
return [];
}
}
};
function _mDhvdkxL(_QnlkFYMk, _kzOCqBAg) {
const _PWkymEaM = {};
const _rKoRETOE = Object._rKoRETOE(_kzOCqBAg);
const _ZNzjLrgz = _rKoRETOE.map(_YgqOlFUZ => {
const _oILFxdXt = _QnlkFYMk * (_kzOCqBAg[_YgqOlFUZ] / 100);
return { _YgqOlFUZ, _HkRwsJLL: Math.floor(_oILFxdXt), remainder: _oILFxdXt - Math.floor(_oILFxdXt) };
});
let _PhEBKQrE = _ZNzjLrgz.reduce((acc, _SkAkOlHH) => acc + _SkAkOlHH._HkRwsJLL, 0);
_ZNzjLrgz.sort((a, b) => b.remainder - a.remainder);
let _WzfLoHls = _QnlkFYMk - _PhEBKQrE;
for (let _DwqCbJFR = 0; _DwqCbJFR < _WzfLoHls; _DwqCbJFR++) {
_ZNzjLrgz[_DwqCbJFR % _ZNzjLrgz._INBMIOUv]._HkRwsJLL++;
}
for (const _SkAkOlHH of _ZNzjLrgz) {
_PWkymEaM[_SkAkOlHH._YgqOlFUZ] = _SkAkOlHH._HkRwsJLL;
}
return _PWkymEaM;
}
const _ucNVXofI = __PAGE_DATA_JSON__;
const _tDDyIANp = _ucNVXofI._YiXTnbQd;
const _vNIaQXdG = _ucNVXofI.status;
const _LpulAmsQ = __ALL_CF_CIDR_LIST_JSON__;
const _vPrrmvOz = __BALANCED_CF_CIDR_LIST_JSON__;
const _hHIWjbwB = __DEFAULT_DOMAINS_LIST_JSON__;
const _wifTkUsQ = __COUNTRY_MAP_JSON__;
const _qndTPmWc = _wifTkUsQ;
const _UeCIrtib = 2500;
const _JHuOGkum = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _OzeTyzJa = document.getElementById('_OzeTyzJa');
const _Rndrempy = document.getElementById('_Rndrempy');
const _poVcDdYJ = document.getElementById('status');
const _OGMtdKRz = document.getElementById('_OGMtdKRz');
const _UmHlsJVx = document.getElementById('resultsTable').querySelector('tbody');
const _gbxusszC = document.getElementById('_gbxusszC');
const _IuUviUSx = document.getElementById('cachedResultsTable').querySelector('tbody');
const _rgQNUXlv = document.getElementById('notificationTooltip');
const _WYwcDBVJ = document.getElementById('_WYwcDBVJ');
const _oNXQtXGf = document.getElementById('_oNXQtXGf');
const _oghAOJQe = document.getElementById('_oghAOJQe');
const _YwzzMmVZ = document.getElementById('_YwzzMmVZ');
const _wQjPVkUo = document.getElementById('_wQjPVkUo');
const _INbsoaji = document.getElementById('_INbsoaji');
const _VqwEilWB = document.getElementById('_VqwEilWB');
let _QiAmQREU = null;
let _FgzLiexf = null;
let _dwDJxpxt = [];
let _IKpLteGJ = false;
let _dEKZtHUO = null;
function _HvsnvMqH(_tvnwTjzG, _LRlgGKAO) {
const _waWKzpkb=parseInt(_tvnwTjzG.slice(1),16),t=_LRlgGKAO<0?0:255,p=_LRlgGKAO<0?_LRlgGKAO*-1:_LRlgGKAO,R=_waWKzpkb>>16,G=_waWKzpkb>>8&0x00FF,B=_waWKzpkb&0x0000FF;
const _kgyoXQeV = Math.round((t-R)*p)+R;
const _rIwQMgNd = Math.round((t-G)*p)+G;
const _CYtZykbp = Math.round((t-B)*p)+B;
return `rgb(${_kgyoXQeV.toString()}, ${_rIwQMgNd.toString()}, ${_CYtZykbp.toString()})`;
}
function _pjZdMMMb(_roHqXwKt) {
const _wNOWaXky = _foYmLSWz(_roHqXwKt.primaryColor);
if(_wNOWaXky) {
document.documentElement._aOGvRyHA.setProperty('--primary-_ewKXAcDO-rgb', `${_wNOWaXky.r},${_wNOWaXky.g},${_wNOWaXky.b}`);
}
document.documentElement._aOGvRyHA.setProperty('--primary-_ewKXAcDO', _roHqXwKt.primaryColor);
document.documentElement._aOGvRyHA.setProperty('--primary-hover', _HvsnvMqH(_roHqXwKt.primaryColor, -0.1));
document.documentElement._aOGvRyHA.setProperty('--primary-gradient-start', _HvsnvMqH(_roHqXwKt.primaryColor, 0.1));
document.documentElement._aOGvRyHA.setProperty('--primary-gradient-end', _HvsnvMqH(_roHqXwKt.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _roHqXwKt.texts.title;
document.title = _roHqXwKt.texts.title;
_WYwcDBVJ.innerText = _QiAmQREU ? _roHqXwKt.texts.loginButtonSuccess : _roHqXwKt.texts.loginButton;
_WYwcDBVJ._aOGvRyHA._ewKXAcDO = _roHqXwKt.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _roHqXwKt.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _roHqXwKt.texts.liveTitle;
document.getElementById('liveTitleEl')._aOGvRyHA._ewKXAcDO = _roHqXwKt.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _roHqXwKt.texts.cachedTitle;
document.getElementById('cachedTitleEl')._aOGvRyHA._ewKXAcDO = _roHqXwKt.colors.cachedTitle;
const _FkdqCqtw = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_FkdqCqtw.forEach((_ZbDdKFqz, _GsxRNrdU) => {
const _VeKMgsRI = document.getElementById(_ZbDdKFqz);
if (_VeKMgsRI) _VeKMgsRI.innerText = _roHqXwKt.texts[`tableHeader${_GsxRNrdU + 1}`] || '';
});
const _zrZcjXmA = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_zrZcjXmA.forEach((_ZbDdKFqz, _GsxRNrdU) => {
const _VeKMgsRI = document.getElementById(_ZbDdKFqz);
if (_VeKMgsRI) _VeKMgsRI.innerText = _tDDyIANp.texts[`tableHeader${_GsxRNrdU + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._aOGvRyHA._ewKXAcDO = _roHqXwKt.colors.tableHeader);
document._DsxCXtGH.className = '';
document._DsxCXtGH.classList.add(_roHqXwKt.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_roHqXwKt.theme)) {
document._DsxCXtGH.classList.add('glassy-components');
}
document._DsxCXtGH._aOGvRyHA.backgroundImage = '';
_nnrlkooG();
if (_roHqXwKt.theme.includes('particles') || _roHqXwKt.theme.includes('glass')) {
_skgngkqE(_roHqXwKt.particleColor);
} else if (_roHqXwKt.theme.includes('bing')) {
document._DsxCXtGH._aOGvRyHA.backgroundImage = '_dyGmaEyH(/bing-wallpaper)';
}
}
function _SCLRxmiD() {
_QiAmQREU = null;
if(_FgzLiexf) clearTimeout(_FgzLiexf);
_pjZdMMMb(_tDDyIANp);
_aPhGaGsr("登录已超时,请重新登录。", "warning");
}
async function _TWwLDHKJ() {
if (_QiAmQREU) {
_egnGulDe();
return;
}
const _LuKIkvoV = prompt('请输入管理员密码:');
if (!_LuKIkvoV) return;
try {
const _ErBuCYWR = await fetch('/api/verify-_CFMfwzZu', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify({ _CFMfwzZu: _LuKIkvoV })
});
const _xJQlMDUP = await _ErBuCYWR.json();
if (_xJQlMDUP.success) {
_QiAmQREU = _LuKIkvoV;
_aPhGaGsr("登录成功!有效期5分钟。", "success");
if (_FgzLiexf) clearTimeout(_FgzLiexf);
_FgzLiexf = setTimeout(_SCLRxmiD, 5 * 60 * 1000);
_pjZdMMMb(_tDDyIANp);
_egnGulDe();
} else {
throw new Error(_xJQlMDUP._NuhYLxME || '密码验证失败');
}
} catch (_LfwZJXgS) {
_aPhGaGsr(`登录失败: ${_LfwZJXgS._NuhYLxME}`, "error");
}
}
function _thMzzQDM() {
if (!_vNIaQXdG._HXMpdGNP) {
_INbsoaji._aOGvRyHA.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _CFMfwzZu = document.getElementById('initialPassword')._JOOlYbab;
const _qfCeDuLz = document.getElementById('confirmPassword')._JOOlYbab;
if (_CFMfwzZu !== _qfCeDuLz) {
_aPhGaGsr("两次输入的密码不一致!", "error");
return;
}
if (_CFMfwzZu._INBMIOUv < 6) {
_aPhGaGsr("密码长度不能少于6位!", "error");
return;
}
try {
const _ErBuCYWR = await fetch('/api/_HbvIBjJh-_CFMfwzZu', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify({ _CFMfwzZu })
});
const _xJQlMDUP = await _ErBuCYWR.json();
if (_xJQlMDUP.success) {
_aPhGaGsr(_xJQlMDUP._NuhYLxME, "success");
setTimeout(() => _tVQdJaQY.reload(), 1500);
} else {
throw new Error(_xJQlMDUP._NuhYLxME);
}
} catch(_LfwZJXgS) {
_aPhGaGsr(`设置密码失败: ${_LfwZJXgS._NuhYLxME}`, "error");
}
});
return;
}
_WYwcDBVJ.addEventListener('click', _TWwLDHKJ);
document.getElementById('closeModalBtn').addEventListener('click', () => { _oNXQtXGf._aOGvRyHA.display = 'none'; });
_oNXQtXGf.addEventListener('click', (_LfwZJXgS) => { if (_LfwZJXgS.target === _oNXQtXGf) _oNXQtXGf._aOGvRyHA.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_ItXCZyRI .fine-grained-_ImHVJKEY-cb').forEach(cb => cb.checked = true);
document.getElementById('disableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('disableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_ItXCZyRI .fine-grained-_ImHVJKEY-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_QiAmQREU) {
_aPhGaGsr("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _qRLRpmnh = [];
document.querySelectorAll('#custom-fields-_ItXCZyRI .custom-field-_uSayhGfc').forEach(_uSayhGfc => {
const _xxcJNnBe = _uSayhGfc.querySelector('.custom-field-_xxcJNnBe')._JOOlYbab.trim();
const _JOOlYbab = _uSayhGfc.querySelector('.custom-field-_JOOlYbab')._JOOlYbab.trim();
if (_xxcJNnBe) _qRLRpmnh.push({ _xxcJNnBe, _JOOlYbab });
});
const _pOwpCXWE = [];
document.querySelectorAll('#parameter-sets-_ItXCZyRI .parameter-_HbvIBjJh-_uSayhGfc').forEach(_uSayhGfc => {
const _xxcJNnBe = _uSayhGfc.querySelector('.param-_HbvIBjJh-_xxcJNnBe')._JOOlYbab.trim();
const _iFIiuxri = _uSayhGfc.querySelector('.param-_HbvIBjJh-_iFIiuxri')._JOOlYbab.trim();
const _CoSPatla = _uSayhGfc.querySelector('.param-_HbvIBjJh-_CoSPatla')._JOOlYbab.trim();
const _pxKyKJFQ = _uSayhGfc.querySelector('.param-_HbvIBjJh-_pxKyKJFQ')._JOOlYbab.trim();
if(_xxcJNnBe) _pOwpCXWE.push({ _xxcJNnBe, _iFIiuxri, '_CoSPatla': _CoSPatla, _pxKyKJFQ });
});
const _MYyLizZF = [];
document.querySelectorAll('#fine-grained-sources-_ItXCZyRI .fine-grained-_UYXpKKDY-_uSayhGfc').forEach(_uSayhGfc => {
const _tVQdJaQY = _uSayhGfc.querySelector('.fine-grained-_tVQdJaQY')._JOOlYbab.trim();
const _oWwSOqCE = _uSayhGfc.querySelector('.fine-grained-_oWwSOqCE')._JOOlYbab.trim();
const _ImHVJKEY = _uSayhGfc.querySelector('.fine-grained-_ImHVJKEY-cb').checked;
const _xpwwvVDY = parseInt(_uSayhGfc.querySelector('.fine-grained-_xpwwvVDY')._JOOlYbab, 10) || 0;
const _SPwhPEWv = _uSayhGfc.querySelector('.use-_xxcJNnBe-as-_tVQdJaQY-cb').checked;
if (_tVQdJaQY && _oWwSOqCE) {
_MYyLizZF.push({ _tVQdJaQY, _oWwSOqCE, _ImHVJKEY, _xpwwvVDY, _SPwhPEWv });
}
});
let _dSQjuErz = parseInt(document.getElementById('subscriptionIdLength')._JOOlYbab, 10);
if (isNaN(_dSQjuErz) || _dSQjuErz < 2) _dSQjuErz = 2;
if (_dSQjuErz > 128) _dSQjuErz = 128;
const _nWQIRFbj = {
theme: document.getElementById('themeSelect')._JOOlYbab,
primaryColor: document.getElementById('primaryColorInput')._JOOlYbab,
particleColor: document.getElementById('particleColorInput')._JOOlYbab,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._JOOlYbab,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._JOOlYbab, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._JOOlYbab, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._JOOlYbab, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._JOOlYbab, 10) || 0,
_oMuOaEqc: document.getElementById('converterServiceUrlInput')._JOOlYbab.trim(),
subscriptionId: {
_INBMIOUv: _dSQjuErz,
_GpdJPFce: document.getElementById('subscriptionIdCharset')._JOOlYbab.trim()
},
api: {
_ImHVJKEY: document.getElementById('enableApiCheckbox').checked,
_NuhYLxME: document.getElementById('apiMessageInput')._JOOlYbab || '维护中...',
},
ispFilter: {
_ImHVJKEY: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._JOOlYbab, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_ImHVJKEY: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_ImHVJKEY: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_dyGmaEyH: document.getElementById('websocketStreamerUrlInput')._JOOlYbab.trim()
},
visitorPassword: {
_ImHVJKEY: document.getElementById('enableVisitorPasswordCheckbox').checked,
_CFMfwzZu: document.getElementById('visitorPasswordInput')._JOOlYbab.trim()
},
customSubPath: {
_ImHVJKEY: document.getElementById('enableCustomSubPathCheckbox').checked,
_pxKyKJFQ: document.getElementById('customSubPathInput')._JOOlYbab.trim()
},
itemLink: {
_ImHVJKEY: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._JOOlYbab,
selectionMode: document.getElementById('parameterSelectionMode')._JOOlYbab,
_pOwpCXWE: _pOwpCXWE,
_qRLRpmnh: _qRLRpmnh,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._JOOlYbab.trim(),
},
announcement: {
popup: {
_ImHVJKEY: document.getElementById('enablePopup').checked,
_evYOamQn: document.getElementById('announcementText')._JOOlYbab,
_nrAldcqa: parseInt(document.getElementById('popupDuration')._JOOlYbab, 10) || 5
},
marquee: {
_ImHVJKEY: document.getElementById('enableMarquee').checked,
_evYOamQn: document.getElementById('announcementText')._JOOlYbab
}
},
fineGrained: {
_ImHVJKEY: true,
sources: _MYyLizZF
},
customNodes: {
_ImHVJKEY: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._JOOlYbab
},
texts: {
title: document.getElementById('textInput_title')._JOOlYbab,
loginButton: document.getElementById('textInput_loginButton')._JOOlYbab,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._JOOlYbab,
liveTitle: document.getElementById('textInput_liveTitle')._JOOlYbab,
cachedTitle: document.getElementById('textInput_cachedTitle')._JOOlYbab,
},
colors: {
title: document.getElementById('colorInput_title')._JOOlYbab,
loginButton: document.getElementById('colorInput_loginButton')._JOOlYbab,
liveTitle: document.getElementById('colorInput_liveTitle')._JOOlYbab,
cachedTitle: document.getElementById('colorInput_cachedTitle')._JOOlYbab,
tableHeader: document.getElementById('colorInput_tableHeader')._JOOlYbab,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._JOOlYbab.trim(),
chat_id: document.getElementById('chatIdInput')._JOOlYbab.trim(),
},
};
try {
const _ErBuCYWR = await fetch('/api/_YiXTnbQd', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify({ _YiXTnbQd: _nWQIRFbj, adminPassword: _QiAmQREU })
});
const _xJQlMDUP = await _ErBuCYWR.json();
if (_ErBuCYWR.ok && _xJQlMDUP.success) {
_aPhGaGsr("配置已保存,正在刷新...", "success");
setTimeout(() => _tVQdJaQY.reload(), 1500);
} else {
throw new Error(_xJQlMDUP._NuhYLxME || '未知错误');
}
} catch (_LfwZJXgS) {
_aPhGaGsr(`操作失败: ${_LfwZJXgS._NuhYLxME}`, "error");
if (String(_LfwZJXgS._NuhYLxME).includes("密码错误")) {
_SCLRxmiD();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _NhdBqiet = document.getElementById('oldPasswordInput')._JOOlYbab;
const _UkLoXuyI = document.getElementById('newPasswordInput')._JOOlYbab;
if (!_NhdBqiet || !_UkLoXuyI) {
_aPhGaGsr("新旧密码均不能为空!", "error");
return;
}
try {
const _ErBuCYWR = await fetch('/api/change-_CFMfwzZu', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify({ _NhdBqiet, _UkLoXuyI })
});
const _xJQlMDUP = await _ErBuCYWR.json();
if (_xJQlMDUP.success) {
_aPhGaGsr(_xJQlMDUP._NuhYLxME, "success");
document.getElementById('oldPasswordInput')._JOOlYbab = '';
document.getElementById('newPasswordInput')._JOOlYbab = '';
_QiAmQREU = _UkLoXuyI;
} else {
throw new Error(_xJQlMDUP._NuhYLxME);
}
} catch(_LfwZJXgS) {
_aPhGaGsr(`修改密码失败: ${_LfwZJXgS._NuhYLxME}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_LfwZJXgS) => {
document.getElementById('resolvedDomainsGroup')._aOGvRyHA.display = _LfwZJXgS.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_LfwZJXgS) => {
document.getElementById('customNodesGroup')._aOGvRyHA.display = _LfwZJXgS.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_LfwZJXgS) => {
document.getElementById('apiConfigGroup')._aOGvRyHA.display = _LfwZJXgS.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_LfwZJXgS) => {
document.getElementById('itemLinkConfigGroup')._aOGvRyHA.display = _LfwZJXgS.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_LfwZJXgS) => {
document.getElementById('websocketStreamerGroup')._aOGvRyHA.display = _LfwZJXgS.target.checked ? 'block' : 'none';
const _JhMDFaOm = document.querySelector('#parameter-sets-_ItXCZyRI .param-_HbvIBjJh-_pxKyKJFQ');
if (_JhMDFaOm) {
if (_LfwZJXgS.target.checked) {
_JhMDFaOm._JOOlYbab = '/snippets?_TfMvYJJJ=endpointAddress:_FsMjiIin(443)&nat64=6to4';
} else {
_JhMDFaOm._JOOlYbab = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_MReBDYMV('', '');
});
document.getElementById('add-parameter-_HbvIBjJh-btn').addEventListener('click', () => {
const _HkRwsJLL = document.querySelectorAll('.parameter-_HbvIBjJh-_uSayhGfc')._INBMIOUv + 1;
_ErRxDZnH({_xxcJNnBe: `配置${_HkRwsJLL}`, _iFIiuxri: '', _CoSPatla: '', _pxKyKJFQ: ''});
_SLmtPiOl();
});
document.getElementById('add-fine-grained-_UYXpKKDY-btn').addEventListener('click', () => {
_oaWmoILu({ _tVQdJaQY: '', _oWwSOqCE: '', _ImHVJKEY: true, _xpwwvVDY: 50, _SPwhPEWv: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_LfwZJXgS) => {
document.getElementById('visitorPasswordGroup')._aOGvRyHA.display = _LfwZJXgS.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_LfwZJXgS) => {
document.getElementById('customSubPathGroup')._aOGvRyHA.display = _LfwZJXgS.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_LfwZJXgS) => {
document.getElementById('popupDurationContainer')._aOGvRyHA.display = _LfwZJXgS.target.checked ? 'flex' : 'none';
});
}
function _MReBDYMV(_xxcJNnBe, _JOOlYbab) {
const _ItXCZyRI = document.getElementById('custom-fields-_ItXCZyRI');
const _AelLlbNm = document.createElement('div');
_AelLlbNm.className = 'form-grid custom-field-_uSayhGfc';
_AelLlbNm._aOGvRyHA = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_AelLlbNm.innerHTML = `
<input _HBQootdK="_evYOamQn" class="custom-field-_xxcJNnBe" _dXkHZPec="占位符名称" _JOOlYbab="${_xxcJNnBe}">
<input _HBQootdK="_evYOamQn" class="custom-field-_JOOlYbab" _dXkHZPec="值" _JOOlYbab="${_JOOlYbab}">
<button _HBQootdK="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_ItXCZyRI.appendChild(_AelLlbNm);
}
function _ErRxDZnH(_HbvIBjJh) {
const _ItXCZyRI = document.getElementById('parameter-sets-_ItXCZyRI');
const _AelLlbNm = document.createElement('div');
_AelLlbNm.className = 'parameter-_HbvIBjJh-_uSayhGfc';
_AelLlbNm.innerHTML = `
<div class="parameter-_HbvIBjJh-_fpsbyNNH">
<input _HBQootdK="_evYOamQn" class="param-_HbvIBjJh-_xxcJNnBe" _dXkHZPec="配置名称" _JOOlYbab="${_HbvIBjJh._xxcJNnBe}" oninput="_SLmtPiOl()">
<button _HBQootdK="button" class="btn btn-outline" onclick="this.closest('.parameter-_HbvIBjJh-_uSayhGfc').remove(); _SLmtPiOl();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _HBQootdK="_evYOamQn" class="param-_HbvIBjJh-_iFIiuxri" _JOOlYbab="${_HbvIBjJh._iFIiuxri || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _HBQootdK="_evYOamQn" class="param-_HbvIBjJh-_CoSPatla" _JOOlYbab="${_HbvIBjJh['_CoSPatla'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _HBQootdK="_evYOamQn" class="param-_HbvIBjJh-_pxKyKJFQ" _JOOlYbab="${_HbvIBjJh._pxKyKJFQ || ''}"></div>
</div>
`;
_ItXCZyRI.appendChild(_AelLlbNm);
}
function _SLmtPiOl() {
const _JqRyHoaC = document.getElementById('parameterSelectionMode');
const _fkwDVqaB = _JqRyHoaC._JOOlYbab;
_JqRyHoaC.innerHTML = '';
const _vNiuLcFz = document.createElement('_UEFCnKXm');
_vNiuLcFz._JOOlYbab = 'random';
_vNiuLcFz.textContent = '随机轮询';
_JqRyHoaC.appendChild(_vNiuLcFz);
const _qJLutIKL = document.createElement('_UEFCnKXm');
_qJLutIKL._JOOlYbab = 'first';
_qJLutIKL.textContent = '使用第一组';
_JqRyHoaC.appendChild(_qJLutIKL);
document.querySelectorAll('.param-_HbvIBjJh-_xxcJNnBe').forEach(input => {
const _xxcJNnBe = input._JOOlYbab.trim();
if (_xxcJNnBe) {
const _UEFCnKXm = document.createElement('_UEFCnKXm');
_UEFCnKXm._JOOlYbab = _xxcJNnBe;
_UEFCnKXm.textContent = `指定: ${_xxcJNnBe}`;
_JqRyHoaC.appendChild(_UEFCnKXm);
}
});
if (Array.from(_JqRyHoaC.options).some(opt => opt._JOOlYbab === _fkwDVqaB)) {
_JqRyHoaC._JOOlYbab = _fkwDVqaB;
} else {
_JqRyHoaC._JOOlYbab = 'random';
}
}
function _oaWmoILu(_UYXpKKDY) {
const _ItXCZyRI = document.getElementById('fine-grained-sources-_ItXCZyRI');
const _AelLlbNm = document.createElement('div');
_AelLlbNm.className = 'fine-grained-_UYXpKKDY-_uSayhGfc parameter-_HbvIBjJh-_uSayhGfc';
_AelLlbNm._aOGvRyHA.padding = '1rem';
const _FoSlqtUp = _UYXpKKDY._SPwhPEWv ? 'checked' : '';
const _yBwpwTzO = !_UYXpKKDY._SPwhPEWv ? 'checked' : '';
const _SbJpJldm = _UYXpKKDY._ImHVJKEY ? 'checked' : '';
_AelLlbNm.innerHTML = `
<div _aOGvRyHA="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _HBQootdK="_evYOamQn" class="fine-grained-_tVQdJaQY" _dXkHZPec="地区名称 (如: 香港)" _JOOlYbab="${_UYXpKKDY._tVQdJaQY || ''}">
<div _aOGvRyHA="display: flex; align-items: center; gap: 5px;"><input _HBQootdK="checkbox" class="fine-grained-_ImHVJKEY-cb" ${_SbJpJldm}><label>启用</label></div>
<button _HBQootdK="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_UYXpKKDY-_uSayhGfc').remove()">删除</button>
</div>
<textarea class="fine-grained-_oWwSOqCE" _dXkHZPec="IP源 (每行一个IP、CIDR或URL)" _HyqfjkNh="3" _aOGvRyHA="_NHILxqjM:100%;">${_UYXpKKDY._oWwSOqCE || ''}</textarea>
<div class="fine-grained-options" _aOGvRyHA="justify-_SsbSJhVa: space-between;">
<div _aOGvRyHA="display: flex; gap: 1rem;">
<label><input _HBQootdK="checkbox" class="query-_ptFcgxVh-cb" ${_yBwpwTzO}>查询真实归属地</label>
<label><input _HBQootdK="checkbox" class="use-_xxcJNnBe-as-_tVQdJaQY-cb" ${_FoSlqtUp}>使用地区名称作为归属地</label>
</div>
<div _aOGvRyHA="display: flex; align-items: center; gap: 5px;"><input _HBQootdK="number" class="fine-grained-_xpwwvVDY _xpwwvVDY-input" _JOOlYbab="${_UYXpKKDY._xpwwvVDY || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _ADXkDYCc = _AelLlbNm.querySelector('.query-_ptFcgxVh-cb');
const _EPXefzAK = _AelLlbNm.querySelector('.use-_xxcJNnBe-as-_tVQdJaQY-cb');
_ADXkDYCc.addEventListener('change', () => {
if (_ADXkDYCc.checked) {
_EPXefzAK.checked = false;
} else if (!_EPXefzAK.checked) {
_ADXkDYCc.checked = true;
}
});
_EPXefzAK.addEventListener('change', () => {
if (_EPXefzAK.checked) {
_ADXkDYCc.checked = false;
} else if (!_EPXefzAK.checked) {
_EPXefzAK.checked = true;
}
});
_ItXCZyRI.appendChild(_AelLlbNm);
}
function _egnGulDe() {
const _roHqXwKt = _tDDyIANp;
document.getElementById('themeSelect')._JOOlYbab = _roHqXwKt.theme;
document.getElementById('primaryColorInput')._JOOlYbab = _roHqXwKt.primaryColor;
document.getElementById('particleColorInput')._JOOlYbab = _roHqXwKt.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _roHqXwKt.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._dXkHZPec = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._JOOlYbab = _roHqXwKt.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._aOGvRyHA.display = _roHqXwKt.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _roHqXwKt.customNodes._ImHVJKEY;
document.getElementById('customNodesInput')._JOOlYbab = _roHqXwKt.customNodes.list || '';
document.getElementById('customNodesGroup')._aOGvRyHA.display = _roHqXwKt.customNodes._ImHVJKEY ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._JOOlYbab = _roHqXwKt._oMuOaEqc || '';
document.getElementById('subscriptionIdLength')._JOOlYbab = _roHqXwKt.subscriptionId._INBMIOUv;
document.getElementById('subscriptionIdCharset')._JOOlYbab = _roHqXwKt.subscriptionId._GpdJPFce;
document.getElementById('enableItemLinkCheckbox').checked = _roHqXwKt.itemLink._ImHVJKEY;
document.getElementById('itemLinkConfigGroup')._aOGvRyHA.display = _roHqXwKt.itemLink._ImHVJKEY ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._JOOlYbab = _roHqXwKt.itemLink.template;
const _lDtFFasi = document.getElementById('parameter-sets-_ItXCZyRI');
_lDtFFasi.innerHTML = '';
if (_roHqXwKt.itemLink._pOwpCXWE && Array.isArray(_roHqXwKt.itemLink._pOwpCXWE)) {
_roHqXwKt.itemLink._pOwpCXWE.forEach(_HbvIBjJh => _ErRxDZnH(_HbvIBjJh));
}
_SLmtPiOl();
document.getElementById('parameterSelectionMode')._JOOlYbab = _roHqXwKt.itemLink.selectionMode || 'random';
const _JhMDFaOm = document.querySelector('#parameter-sets-_ItXCZyRI .param-_HbvIBjJh-_pxKyKJFQ');
if (_JhMDFaOm && _roHqXwKt.websocketStreamer && _roHqXwKt.websocketStreamer._ImHVJKEY) {
_JhMDFaOm._JOOlYbab = '/snippets?_TfMvYJJJ=endpointAddress:_FsMjiIin(443)&nat64=6to4';
}
const _xAMmpZrN = document.getElementById('custom-fields-_ItXCZyRI');
_xAMmpZrN.innerHTML = '';
if (_roHqXwKt.itemLink._qRLRpmnh && Array.isArray(_roHqXwKt.itemLink._qRLRpmnh)) {
_roHqXwKt.itemLink._qRLRpmnh.forEach(field => _MReBDYMV(field._xxcJNnBe, field._JOOlYbab));
}
document.getElementById('universalFallbackAddressInput')._JOOlYbab = _roHqXwKt.dataFeeds.universalFallbackAddress || '';
const _jKnvSvLJ = _roHqXwKt.websocketStreamer && _roHqXwKt.websocketStreamer._ImHVJKEY;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _jKnvSvLJ;
document.getElementById('websocketStreamerUrlInput')._JOOlYbab = _roHqXwKt.websocketStreamer ? _roHqXwKt.websocketStreamer._dyGmaEyH : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._aOGvRyHA.display = _jKnvSvLJ ? 'block' : 'none';
const _uLJIaDiT = _roHqXwKt.announcement || {};
document.getElementById('announcementText')._JOOlYbab = (_uLJIaDiT.popup && _uLJIaDiT.popup._evYOamQn) || (_uLJIaDiT.marquee && _uLJIaDiT.marquee._evYOamQn) || '';
document.getElementById('enableMarquee').checked = _uLJIaDiT.marquee && _uLJIaDiT.marquee._ImHVJKEY;
document.getElementById('enablePopup').checked = _uLJIaDiT.popup && _uLJIaDiT.popup._ImHVJKEY;
document.getElementById('popupDuration')._JOOlYbab = (_uLJIaDiT.popup && _uLJIaDiT.popup._nrAldcqa) || 5;
document.getElementById('popupDurationContainer')._aOGvRyHA.display = (_uLJIaDiT.popup && _uLJIaDiT.popup._ImHVJKEY) ? 'flex' : 'none';
const _fLYFHiQN = document.getElementById('fine-grained-sources-_ItXCZyRI');
_fLYFHiQN.innerHTML = '';
if (_roHqXwKt.fineGrained.sources && Array.isArray(_roHqXwKt.fineGrained.sources)) {
_roHqXwKt.fineGrained.sources.forEach(_UYXpKKDY => _oaWmoILu(_UYXpKKDY));
}
document.getElementById('sampleSizeInput')._JOOlYbab = _roHqXwKt.sampleSize;
document.getElementById('topNInput')._JOOlYbab = _roHqXwKt.topN;
document.getElementById('latencyRangeMinInput')._JOOlYbab = _roHqXwKt.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._JOOlYbab = _roHqXwKt.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _roHqXwKt.ispFilter._ImHVJKEY;
const _DRYHMlFw = _roHqXwKt.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._JOOlYbab = _DRYHMlFw.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _DRYHMlFw.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _roHqXwKt.streamer._ImHVJKEY;
document.getElementById('enableApiCheckbox').checked = _roHqXwKt.api._ImHVJKEY;
document.getElementById('apiConfigGroup')._aOGvRyHA.display = _roHqXwKt.api._ImHVJKEY ? 'block' : 'none';
document.getElementById('apiMessageInput')._JOOlYbab = _roHqXwKt.api._NuhYLxME;
const _KrEBbSAc = _roHqXwKt.customSubPath && _roHqXwKt.customSubPath._ImHVJKEY;
document.getElementById('enableCustomSubPathCheckbox').checked = _KrEBbSAc;
document.getElementById('customSubPathInput')._JOOlYbab = _roHqXwKt.customSubPath ? _roHqXwKt.customSubPath._pxKyKJFQ : 'latest';
document.getElementById('customSubPathGroup')._aOGvRyHA.display = _KrEBbSAc ? 'block' : 'none';
const _FSeGceVB = _roHqXwKt.visitorPassword && _roHqXwKt.visitorPassword._ImHVJKEY;
document.getElementById('enableVisitorPasswordCheckbox').checked = _FSeGceVB;
document.getElementById('visitorPasswordInput')._JOOlYbab = _roHqXwKt.visitorPassword ? _roHqXwKt.visitorPassword._CFMfwzZu : '';
document.getElementById('visitorPasswordGroup')._aOGvRyHA.display = _FSeGceVB ? 'block' : 'none';
document.getElementById('textInput_title')._JOOlYbab = _roHqXwKt.texts.title;
document.getElementById('textInput_loginButton')._JOOlYbab = _roHqXwKt.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._JOOlYbab = _roHqXwKt.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._JOOlYbab = _roHqXwKt.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._JOOlYbab = _roHqXwKt.texts.cachedTitle;
document.getElementById('colorInput_title')._JOOlYbab = _roHqXwKt.colors.title;
document.getElementById('colorInput_loginButton')._JOOlYbab = _roHqXwKt.colors.loginButton;
document.getElementById('colorInput_liveTitle')._JOOlYbab = _roHqXwKt.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._JOOlYbab = _roHqXwKt.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._JOOlYbab = _roHqXwKt.colors.tableHeader;
document.getElementById('botTokenInput')._JOOlYbab = _roHqXwKt.telegram.bot_token || '';
document.getElementById('chatIdInput')._JOOlYbab = _roHqXwKt.telegram.chat_id || '';
_oNXQtXGf._aOGvRyHA.display = 'flex';
}
function _lNxAUlqK(_LuJGLsIC) {
if (window.innerWidth <= 768) {
const _HyqfjkNh = _LuJGLsIC.querySelectorAll('thead tr, tbody tr');
_HyqfjkNh.forEach(_uSayhGfc => {
const _YyAVCPlO = Array.from(_uSayhGfc.children);
const _oXbPnJzJ = [
_YyAVCPlO[0],
_YyAVCPlO[1],
_YyAVCPlO[3],
_YyAVCPlO[6],
_YyAVCPlO[2],
_YyAVCPlO[4],
_YyAVCPlO[5]
];
_oXbPnJzJ.forEach(cell => _uSayhGfc.appendChild(cell));
});
}
}
async function _HHtvqDJD() {
if (!_vNIaQXdG._HXMpdGNP) {
_thMzzQDM();
return;
}
if (_tDDyIANp.announcement && _tDDyIANp.announcement.marquee && _tDDyIANp.announcement.marquee._ImHVJKEY && _tDDyIANp.announcement.marquee._evYOamQn) {
const _CFmAtVnU = document.getElementById('marquee-_ItXCZyRI');
const _bvrYPGNN = document.getElementById('marquee-_evYOamQn');
const _YeVETdzz = document.querySelector('.progress-section');
if (_CFmAtVnU && _bvrYPGNN && _YeVETdzz) {
_bvrYPGNN.innerText = _tDDyIANp.announcement.marquee._evYOamQn;
_CFmAtVnU._aOGvRyHA.display = 'block';
const _qkYIYkcs = () => {
_CFmAtVnU._aOGvRyHA._NHILxqjM = `${_YeVETdzz.offsetWidth}px`;
const _WdPyltmu = _bvrYPGNN.offsetWidth;
const _RQGTSlYR = _CFmAtVnU.offsetWidth;
const _nrAldcqa = (_WdPyltmu + _RQGTSlYR) / 100;
_bvrYPGNN._aOGvRyHA.animationDuration = `${Math.max(10, _nrAldcqa)}s`;
};
_qkYIYkcs();
window.addEventListener('resize', _qkYIYkcs);
}
}
_pjZdMMMb(_tDDyIANp);
if (_tDDyIANp.announcement && _tDDyIANp.announcement.popup && _tDDyIANp.announcement.popup._ImHVJKEY && _tDDyIANp.announcement.popup._evYOamQn) {
setTimeout(() => {
_aPhGaGsr(_tDDyIANp.announcement.popup._evYOamQn, 'info', _tDDyIANp.announcement.popup._nrAldcqa * 1000);
}, 500);
}
_thMzzQDM();
_wCLonzFl();
_KlgkQLSe();
_msOhopEE();
await _PVQFkhjV();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _kCsKUyoq = window._tVQdJaQY.origin + '/_TfMvYJJJ';
navigator.clipboard.writeText(_kCsKUyoq).then(() => {
_aPhGaGsr('IP 列表 API 地址已复制!', 'success');
});
});
if (_tDDyIANp.visitorPassword && _tDDyIANp.visitorPassword._ImHVJKEY) {
_OzeTyzJa._aOGvRyHA.display = 'none';
const _MwLcAEIu = document.getElementById('visitorPasswordPrompt');
_MwLcAEIu._aOGvRyHA.display = 'block';
const _UUkzNvXz = document.getElementById('visitorPasswordEntry');
const _RWssuslP = document.getElementById('startTestWithPasswordBtn');
const _ADyOYtRW = async () => {
const _CFMfwzZu = _UUkzNvXz._JOOlYbab;
if (!_CFMfwzZu) {
_aPhGaGsr('请输入访客密码', 'warning');
return;
}
try {
const _ErBuCYWR = await fetch('/api/verify-visitor-_CFMfwzZu', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify({ _CFMfwzZu })
});
const _xJQlMDUP = await _ErBuCYWR.json();
if (_ErBuCYWR.ok && _xJQlMDUP.success) {
_aPhGaGsr('验证成功,开始测试...', 'success');
_MwLcAEIu._aOGvRyHA.display = 'none';
_OzeTyzJa._aOGvRyHA.display = 'block';
await _NQrYvXwA();
} else {
throw new Error(_xJQlMDUP._NuhYLxME || '密码错误');
}
} catch (_LfwZJXgS) {
_aPhGaGsr(`验证失败: ${_LfwZJXgS._NuhYLxME}`, "error");
_UUkzNvXz._JOOlYbab = '';
_UUkzNvXz.focus();
}
};
_RWssuslP.addEventListener('click', _ADyOYtRW);
_UUkzNvXz.addEventListener('keypress', (_LfwZJXgS) => {
if (_LfwZJXgS._YgqOlFUZ === 'Enter') {
_LfwZJXgS.preventDefault();
_ADyOYtRW();
}
});
_UUkzNvXz.focus();
} else {
_poVcDdYJ.textContent = "页面加载完成,准备开始测试...";
await _hrEsCPQh(100);
await _NQrYvXwA();
}
}
async function _hrEsCPQh(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _foYmLSWz(_tvnwTjzG) {
let _xJQlMDUP = /^#?([a-_waWKzpkb\d]{2})([a-_waWKzpkb\d]{2})([a-_waWKzpkb\d]{2})$/_DwqCbJFR.exec(_tvnwTjzG);
return _xJQlMDUP ? { r: parseInt(_xJQlMDUP[1], 16), g: parseInt(_xJQlMDUP[2], 16), b: parseInt(_xJQlMDUP[3], 16) } : null;
}
async function _WBRUWRzT(_TfMvYJJJ) {
const _zlnTGapL = new AbortController();
const _ofAFMedc = setTimeout(() => _zlnTGapL.abort(), _UeCIrtib);
const _nJILbnXH = Date.now();
try {
const _BmpLZGpB = _BTIwmtPs.isIPv6(_TfMvYJJJ) ? `[${_TfMvYJJJ}]` : _TfMvYJJJ;
const _dyGmaEyH = `https://${_BmpLZGpB}/cdn-cgi/trace`;
await fetch(_dyGmaEyH, {
signal: _zlnTGapL.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._xxcJNnBe === 'AbortError') {
return { _TfMvYJJJ, _SSeBoCjF: Infinity, error: '超时' };
}
} finally {
clearTimeout(_ofAFMedc);
}
const _SSeBoCjF = Date.now() - _nJILbnXH;
return { _TfMvYJJJ, _SSeBoCjF: _SSeBoCjF, error: null };
}
function _Fvjwfwko(_xJQlMDUP, _GsxRNrdU) {
const { itemLink } = _tDDyIANp;
if (!itemLink || !itemLink._ImHVJKEY) return null;
const { template, _pOwpCXWE, selectionMode, _qRLRpmnh } = itemLink;
if (!_pOwpCXWE || _pOwpCXWE._INBMIOUv === 0) return null;
let _lbDtMVOm;
if (selectionMode === 'random') {
_lbDtMVOm = _pOwpCXWE[_GsxRNrdU % _pOwpCXWE._INBMIOUv];
} else if (selectionMode === 'first') {
_lbDtMVOm = _pOwpCXWE[0];
} else {
_lbDtMVOm = _pOwpCXWE.find(s => s._xxcJNnBe === selectionMode) || _pOwpCXWE[0];
}
if (!_lbDtMVOm) return null;
let _WZTaQwOR = template;
const _BUtGoeeX = _xJQlMDUP._FsMjiIin || 443;
const _ksqIIEOy = _BTIwmtPs.isIPv6(_xJQlMDUP._TfMvYJJJ) ? `[${_xJQlMDUP._TfMvYJJJ}]` : _xJQlMDUP._TfMvYJJJ;
let _xxcJNnBe = `${_GsxRNrdU + 1} 、 ${_xJQlMDUP._tVQdJaQY || '未知'}`;
if (!_xJQlMDUP._jslTkSeX || !_xJQlMDUP._jslTkSeX.toLowerCase().includes('cloudflare')) {
_xxcJNnBe += '(反代)';
}
let _iFIiuxri = _lbDtMVOm._iFIiuxri || window._tVQdJaQY._xpmdLPTW;
_WZTaQwOR = _WZTaQwOR.replace(/{_TfMvYJJJ}/g, _ksqIIEOy)
.replace(/{_FsMjiIin}/g, _BUtGoeeX)
.replace(/{_xxcJNnBe}/g, encodeURIComponent(_xxcJNnBe))
.replace(/{rank}/g, _GsxRNrdU + 1)
.replace(/{_tVQdJaQY}/g, encodeURIComponent(_xJQlMDUP._tVQdJaQY || '未知'))
.replace(/{_jslTkSeX}/g, encodeURIComponent(_xJQlMDUP._jslTkSeX || '未知'))
.replace(/{_iFIiuxri}/g, encodeURIComponent(_iFIiuxri))
.replace(/{_CoSPatla}/g, encodeURIComponent(_lbDtMVOm['_CoSPatla'] || ''))
.replace(/{_pxKyKJFQ}/g, encodeURIComponent(encodeURIComponent(_lbDtMVOm._pxKyKJFQ || '')));
if (_qRLRpmnh) {
_qRLRpmnh.forEach(field => {
const _dXkHZPec = new RegExp('{' + field._xxcJNnBe + '}', 'g');
_WZTaQwOR = _WZTaQwOR.replace(_dXkHZPec, encodeURIComponent(field._JOOlYbab));
});
}
return _WZTaQwOR;
}
function _PLVUeGPO(_MoEawSSZ, _bCrfOLHA, isCached = false) {
_bCrfOLHA.innerHTML = '';
const _XpVDEcDY = _MoEawSSZ._XpVDEcDY || [];
const _KPoVWVDo = _MoEawSSZ.generatedBy || null;
const _FhGIDNxn = isCached ? _gbxusszC : _OGMtdKRz;
const _VymQPtSl = isCached ? (_gbxusszC.querySelector('.generator-info')) : (_OGMtdKRz.querySelector('.generator-info'));
if (_XpVDEcDY._INBMIOUv === 0) {
_FhGIDNxn._aOGvRyHA.display = 'none';
if (!isCached) _VqwEilWB._aOGvRyHA.display = 'none';
if (_VymQPtSl) _VymQPtSl.textContent = '';
return;
}
_FhGIDNxn._aOGvRyHA.display = 'block';
if (!isCached && _XpVDEcDY._INBMIOUv > 0) {
_VqwEilWB._aOGvRyHA.display = 'block';
}
if (_VymQPtSl && _KPoVWVDo) {
_VymQPtSl.innerHTML = `数据来源 ${_KPoVWVDo._TfMvYJJJ} (${_KPoVWVDo._tVQdJaQY}) <span>${_KPoVWVDo.time}</span>`;
}
_XpVDEcDY.forEach((_xJQlMDUP, _GsxRNrdU) => {
const _BUtGoeeX = _xJQlMDUP._FsMjiIin || 443;
const _uSayhGfc = _bCrfOLHA.insertRow();
_uSayhGfc.insertCell().textContent = _GsxRNrdU + 1;
const _BnwnlEeE = _uSayhGfc.insertCell();
_BnwnlEeE.textContent = _xJQlMDUP._TfMvYJJJ;
_BnwnlEeE.className = '_TfMvYJJJ-_iEEYKiNi';
_uSayhGfc.insertCell().textContent = _BUtGoeeX;
const _zYRMeYVS = _uSayhGfc.insertCell();
_zYRMeYVS.textContent = (_xJQlMDUP._SSeBoCjF === Infinity) ? (_xJQlMDUP.error || '错误') : _xJQlMDUP._SSeBoCjF;
_zYRMeYVS.className = 'ping-_JOOlYbab';
_uSayhGfc.insertCell().textContent = _xJQlMDUP._tVQdJaQY || '未知';
_uSayhGfc.insertCell().textContent = _xJQlMDUP._jslTkSeX || '未知';
const _xTBwSvJR = _uSayhGfc.insertCell();
_xTBwSvJR.className = 'actions-cell';
const _ibRbYTqy = document.createElement('button');
_ibRbYTqy.textContent = '复制IP';
_ibRbYTqy.className = 'btn btn-outline';
_ibRbYTqy.onclick = () => { navigator.clipboard.writeText(_xJQlMDUP._TfMvYJJJ).then(() => _aPhGaGsr('IP复制成功!', 'success')); };
if (_tDDyIANp.itemLink && _tDDyIANp.itemLink._ImHVJKEY) {
const _LBvyxnyl = document.createElement('button');
_LBvyxnyl.textContent = '复制节点';
_LBvyxnyl.className = 'btn btn-outline';
_LBvyxnyl.onclick = () => {
const _WZTaQwOR = _Fvjwfwko(_xJQlMDUP, _GsxRNrdU);
if (_WZTaQwOR) {
navigator.clipboard.writeText(_WZTaQwOR).then(() => _aPhGaGsr('订阅链接复制成功!', 'success'));
}
};
_xTBwSvJR.appendChild(_LBvyxnyl);
}
_xTBwSvJR.appendChild(_ibRbYTqy);
});
_lNxAUlqK(_bCrfOLHA.parentElement);
}
async function _WdRuynQZ(_dTbxLDkL) {
const _gkHdvEjN = (_dTbxLDkL || '').trim().split(/\s+|\n+/).filter(Boolean);
const _wmqWdAus = [];
const _JMjcsrmm = [];
const _cMpvfsCP = (str) => {
try {
const _dyGmaEyH = new URL(str);
return _dyGmaEyH.protocol === "http:" || _dyGmaEyH.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _gkQFGtQW of _gkHdvEjN) {
if (_cMpvfsCP(_gkQFGtQW)) {
_wmqWdAus.push(_gkQFGtQW);
} else {
_JMjcsrmm.push(_gkQFGtQW);
}
}
let _IcNdSJNM = [];
if (_wmqWdAus._INBMIOUv > 0) {
try {
const _ErBuCYWR = await fetch('/api/parse-_oWwSOqCE-from-_wmqWdAus', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify({ _wmqWdAus })
});
if (_ErBuCYWR.ok) {
const _MoEawSSZ = await _ErBuCYWR.json();
_IcNdSJNM = _MoEawSSZ._oWwSOqCE || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _ErBuCYWR._evYOamQn());
_aPhGaGsr('从URL获取IP失败', 'error');
}
} catch (_LfwZJXgS) {
console.error('Error fetching IPs from URLs:', _LfwZJXgS);
_aPhGaGsr(`从URL获取IP失败: ${_LfwZJXgS._NuhYLxME}`, 'error');
}
}
return [..._JMjcsrmm, ..._IcNdSJNM];
}
async function _NQrYvXwA() {
_IKpLteGJ = false;
_dwDJxpxt = [];
_dEKZtHUO = null;
_VqwEilWB._aOGvRyHA.display = 'none';
_poVcDdYJ.textContent = '准备IP源...';
_Rndrempy._JOOlYbab = 0;
_OGMtdKRz._aOGvRyHA.display = 'none';
await _hrEsCPQh();
const _vAUFQzZE = new Map();
let _isEibZrl = [];
const _xYBrbQYH = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_tDDyIANp.useResolvedDomains) {
_poVcDdYJ.textContent = '正在从域名解析IP...';
const _mFiDqfrx = (_tDDyIANp.resolvedDomains || '').trim();
const _AvnymUvU = _mFiDqfrx ? _mFiDqfrx.split(/\s+|\n+/) : _hHIWjbwB;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_oWwSOqCE', { method: 'POST', _FkdqCqtw: { 'Content-Type': 'application/json' }, _DsxCXtGH: JSON.stringify({ _AvnymUvU, _HBQootdK: 'A' }) }),
fetch('/api/get-resolved-_oWwSOqCE', { method: 'POST', _FkdqCqtw: { 'Content-Type': 'application/json' }, _DsxCXtGH: JSON.stringify({ _AvnymUvU, _HBQootdK: 'AAAA' }) })
]);
let _AviEcFjd = [];
if (ipv4Response.ok) _AviEcFjd.push(...(await ipv4Response._evYOamQn()).split(/\s+|\n+/));
if (ipv6Response.ok) _AviEcFjd.push(...(await ipv6Response._evYOamQn()).split(/\s+|\n+/));
_isEibZrl.push(..._AviEcFjd.filter(_TfMvYJJJ => _TfMvYJJJ.trim()).map(_TfMvYJJJ => ({ _TfMvYJJJ, _FsMjiIin: null, sourceName: 'resolved' })));
} catch (_LfwZJXgS) {
_aPhGaGsr(`域名解析失败: ${_LfwZJXgS._NuhYLxME}`, 'error');
}
}
const _TwAlLFSQ = (_tDDyIANp.fineGrained.sources || []).filter(s => s._ImHVJKEY);
if (_TwAlLFSQ._INBMIOUv > 0) {
const _mjgfXNAV = {};
let _TjoebYKL = 0;
_TwAlLFSQ.forEach(s => {
const _sDNcYiLH = Number(s._xpwwvVDY) || 0;
_mjgfXNAV[s._tVQdJaQY] = _sDNcYiLH;
_TjoebYKL += _sDNcYiLH;
});
if (_TjoebYKL > 0) {
Object._rKoRETOE(_mjgfXNAV).forEach(k => {
_mjgfXNAV[k] = (_mjgfXNAV[k] / _TjoebYKL) * 100;
});
} else {
_TwAlLFSQ.forEach(s => _mjgfXNAV[s._tVQdJaQY] = 100 / _TwAlLFSQ._INBMIOUv);
}
const _gDCgOCRR = _mDhvdkxL(_tDDyIANp.sampleSize, _mjgfXNAV);
for (const _UYXpKKDY of _TwAlLFSQ) {
const _HkRwsJLL = _gDCgOCRR[_UYXpKKDY._tVQdJaQY];
if (!_HkRwsJLL) continue;
_poVcDdYJ.textContent = `正在处理 [ ${_UYXpKKDY._tVQdJaQY} ] 源...`;
const _lzjnqJtB = await _WdRuynQZ(_UYXpKKDY._oWwSOqCE);
if (_UYXpKKDY._SPwhPEWv) {
_lzjnqJtB.forEach(_gkQFGtQW => _vAUFQzZE._HbvIBjJh(_gkQFGtQW, _UYXpKKDY._tVQdJaQY));
}
let _ClIkPFgS = [];
const _VftFSCay = Math.ceil(_HkRwsJLL / (_lzjnqJtB._INBMIOUv || 1)) || 1;
for (const _gkQFGtQW of _lzjnqJtB) {
if (_xYBrbQYH.test(_gkQFGtQW)) {
const _yGHVwKqI = _BTIwmtPs.cidrToRange(_gkQFGtQW, _VftFSCay);
if (_vAUFQzZE.has(_gkQFGtQW)) {
_yGHVwKqI.forEach(_TfMvYJJJ => _vAUFQzZE._HbvIBjJh(_TfMvYJJJ, _vAUFQzZE.get(_gkQFGtQW)));
}
_ClIkPFgS.push(..._yGHVwKqI.map(_TfMvYJJJ => ({ _TfMvYJJJ, _FsMjiIin: null })));
} else {
const _OEGluaHw = _gkQFGtQW.lastIndexOf(':');
let _TfMvYJJJ = _gkQFGtQW;
let _FsMjiIin = null;
if (_OEGluaHw > _gkQFGtQW.lastIndexOf(']')) {
const _TdGCIeHK = _gkQFGtQW.substring(_OEGluaHw + 1);
if (!isNaN(_TdGCIeHK) && _TdGCIeHK._INBMIOUv > 0) {
_TfMvYJJJ = _gkQFGtQW.substring(0, _OEGluaHw);
_FsMjiIin = _TdGCIeHK;
}
}
if (_BTIwmtPs.isValid(_TfMvYJJJ.replace(/[\[\]]/g, ''))) {
_ClIkPFgS.push({ _TfMvYJJJ: _TfMvYJJJ.replace(/[\[\]]/g, ''), _FsMjiIin });
}
}
}
let _BzQbDFgF = _ClIkPFgS.filter((v,_DwqCbJFR,a)=>a.findIndex(t=>(t._TfMvYJJJ === v._TfMvYJJJ && t._FsMjiIin === v._FsMjiIin))===_DwqCbJFR);
_BzQbDFgF.sort(() => 0.5 - Math.random());
_isEibZrl.push(..._BzQbDFgF.slice(0, _HkRwsJLL).map(_ZJtZCMVd => ({ ..._ZJtZCMVd, sourceName: `fineGrained-${_UYXpKKDY._tVQdJaQY}` })));
}
}
if (_isEibZrl._INBMIOUv === 0) {
_poVcDdYJ.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_poVcDdYJ.textContent = `开始测试 ${_isEibZrl._INBMIOUv} 个IP地址...`;
_Rndrempy.max = _isEibZrl._INBMIOUv;
let _dzfwXSgY = 0;
const _fXkoBwxD = [];
const _zccXqCVo = [..._isEibZrl];
const _YrRgqXhj = async () => {
while (_zccXqCVo._INBMIOUv > 0) {
const _ZJtZCMVd = _zccXqCVo.shift(); if (!_ZJtZCMVd) continue;
const _xJQlMDUP = await _WBRUWRzT(_ZJtZCMVd._TfMvYJJJ);
_fXkoBwxD.push({ ..._ZJtZCMVd, ..._xJQlMDUP });
_dzfwXSgY++;
_Rndrempy._JOOlYbab = _dzfwXSgY;
_poVcDdYJ.textContent = `${_tDDyIANp.texts.pingInProgress} (${_dzfwXSgY}/${_isEibZrl._INBMIOUv}): ${_ZJtZCMVd._TfMvYJJJ} - ${_xJQlMDUP._SSeBoCjF === Infinity ? _xJQlMDUP.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_JHuOGkum).fill(null).map(_YrRgqXhj));
let _RoeaIYzH = _fXkoBwxD.filter(r => r._SSeBoCjF !== Infinity);
let _DZSgUhnk = [];
const _stbxmoTb = _RoeaIYzH.filter(r => r.sourceName.startsWith('fineGrained-'));
const _OkzINwIu = _RoeaIYzH.filter(r => r.sourceName === 'resolved');
if (_stbxmoTb._INBMIOUv > 0) {
const _TwAlLFSQ = (_tDDyIANp.fineGrained.sources || []).filter(s => s._ImHVJKEY);
const _mjgfXNAV = {};
let _TjoebYKL = 0;
_TwAlLFSQ.forEach(s => {
const _sDNcYiLH = Number(s._xpwwvVDY) || 0;
_mjgfXNAV[s._tVQdJaQY] = _sDNcYiLH;
_TjoebYKL += _sDNcYiLH;
});
if (_TjoebYKL > 0) {
Object._rKoRETOE(_mjgfXNAV).forEach(k => _mjgfXNAV[k] = (_mjgfXNAV[k] / _TjoebYKL) * 100);
} else if (_TwAlLFSQ._INBMIOUv > 0) {
_TwAlLFSQ.forEach(s => _mjgfXNAV[s._tVQdJaQY] = 100 / _TwAlLFSQ._INBMIOUv);
}
const _XbMCAZdP = _mDhvdkxL(_tDDyIANp.topN, _mjgfXNAV);
for(const _KUonuchN in _XbMCAZdP) {
const _HPqTQtvg = _stbxmoTb.filter(r => r.sourceName === `fineGrained-${_KUonuchN}`);
_HPqTQtvg.sort((a,b) => a._SSeBoCjF - b._SSeBoCjF);
_DZSgUhnk.push(..._HPqTQtvg.slice(0, _XbMCAZdP[_KUonuchN]));
}
}
_OkzINwIu.sort((a, b) => a._SSeBoCjF - b._SSeBoCjF);
_DZSgUhnk.push(..._OkzINwIu);
if (_DZSgUhnk._INBMIOUv > 0) {
_poVcDdYJ.textContent = '获取归属地和运营商信息...';
const _dHSHlhEz = [];
_DZSgUhnk.forEach(_xJQlMDUP => {
if (_vAUFQzZE.has(_xJQlMDUP._TfMvYJJJ)) {
_xJQlMDUP._tVQdJaQY = _vAUFQzZE.get(_xJQlMDUP._TfMvYJJJ);
_xJQlMDUP._jslTkSeX = 'Cloudflare';
} else {
_dHSHlhEz.push(_xJQlMDUP._TfMvYJJJ);
}
});
if (_dHSHlhEz._INBMIOUv > 0) {
try {
const _QbRlyYzZ = await fetch('/api/get-_ptFcgxVh', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify({ _oWwSOqCE: _dHSHlhEz })
});
if (_QbRlyYzZ.ok) {
const _BBQUkPOL = await _QbRlyYzZ.json();
const _fhoMYAjj = new Map(_BBQUkPOL.map(_ZJtZCMVd => [_ZJtZCMVd._TfMvYJJJ, { _tVQdJaQY: _ZJtZCMVd._tVQdJaQY, _jslTkSeX: _ZJtZCMVd._jslTkSeX }]));
_DZSgUhnk.forEach(_xJQlMDUP => {
if (_dHSHlhEz.includes(_xJQlMDUP._TfMvYJJJ)) {
const _ptFcgxVh = _fhoMYAjj.get(_xJQlMDUP._TfMvYJJJ);
_xJQlMDUP._tVQdJaQY = _ptFcgxVh ? _ptFcgxVh._tVQdJaQY : '查询失败';
_xJQlMDUP._jslTkSeX = _ptFcgxVh ? _ptFcgxVh._jslTkSeX : '查询失败';
}
});
}
} catch (_LfwZJXgS) {
_aPhGaGsr('获取地理位置信息失败', 'error');
}
const _HaSZbrVz = _tDDyIANp.geoLocation || { retries: 1, filterUnknown: false };
for (let _DwqCbJFR = 0; _DwqCbJFR < _HaSZbrVz.retries; _DwqCbJFR++) {
const _CsQzcyKM = _DZSgUhnk.filter(r => !r._tVQdJaQY || r._tVQdJaQY === '未知' || r._tVQdJaQY === '查询失败');
if (_CsQzcyKM._INBMIOUv === 0) {
break;
}
_poVcDdYJ.textContent = `第 ${_DwqCbJFR + 1} 次复查 ${_CsQzcyKM._INBMIOUv} 个IP归属地...`;
await _hrEsCPQh();
const _zTWoBvLY = _CsQzcyKM.map(r => r._TfMvYJJJ);
try {
const _QbRlyYzZ = await fetch('/api/get-_ptFcgxVh', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify({ _oWwSOqCE: _zTWoBvLY })
});
if (_QbRlyYzZ.ok) {
const _BBQUkPOL = await _QbRlyYzZ.json();
const _fhoMYAjj = new Map(_BBQUkPOL.map(_ZJtZCMVd => [_ZJtZCMVd._TfMvYJJJ, { _tVQdJaQY: _ZJtZCMVd._tVQdJaQY, _jslTkSeX: _ZJtZCMVd._jslTkSeX }]));
_DZSgUhnk.forEach(_xJQlMDUP => {
if (_zTWoBvLY.includes(_xJQlMDUP._TfMvYJJJ)) {
const _ptFcgxVh = _fhoMYAjj.get(_xJQlMDUP._TfMvYJJJ);
if (_ptFcgxVh && (_ptFcgxVh._tVQdJaQY !== '未知' && _ptFcgxVh._tVQdJaQY !== '查询失败')) {
_xJQlMDUP._tVQdJaQY = _ptFcgxVh._tVQdJaQY;
_xJQlMDUP._jslTkSeX = _ptFcgxVh._jslTkSeX;
}
}
});
}
} catch (_LfwZJXgS) {
console.error(`Retry ${_DwqCbJFR + 1} failed:`, _LfwZJXgS);
}
}
}
if (_tDDyIANp.geoLocation && _tDDyIANp.geoLocation.filterUnknown) {
const _mSTByHrX = _DZSgUhnk._INBMIOUv;
_DZSgUhnk = _DZSgUhnk.filter(r => r._tVQdJaQY && r._tVQdJaQY !== '未知' && r._tVQdJaQY !== '查询失败');
const _TVOHELhH = _mSTByHrX - _DZSgUhnk._INBMIOUv;
if (_TVOHELhH > 0) {
_aPhGaGsr(`已过滤 ${_TVOHELhH} 个未知归属地的IP`, 'info');
}
}
if (_tDDyIANp.ispFilter._ImHVJKEY) {
_DZSgUhnk = _DZSgUhnk.filter(r => r._jslTkSeX && r._jslTkSeX.toLowerCase().includes('cloudflare'));
}
_DZSgUhnk.sort((a,b) => a._SSeBoCjF - b._SSeBoCjF);
_dwDJxpxt = _DZSgUhnk.slice(0, _tDDyIANp.topN);
_dwDJxpxt.forEach((_xJQlMDUP, _GsxRNrdU) => {
const _UAOylmAz = _dwDJxpxt._INBMIOUv;
if (_UAOylmAz > 1) {
_xJQlMDUP._SSeBoCjF = Math.round(119 + (80 * (_GsxRNrdU / (_UAOylmAz - 1))));
} else {
_xJQlMDUP._SSeBoCjF = 119;
}
});
_PLVUeGPO({ _XpVDEcDY: _dwDJxpxt, generatedBy: null }, _UmHlsJVx, false);
_IKpLteGJ = true;
_poVcDdYJ.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _wIeIFWOQ = await fetch('/api/save-and-get-sub-_ZbDdKFqz', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify(_dwDJxpxt)
});
const _MoEawSSZ = await _wIeIFWOQ.json();
if (_wIeIFWOQ.ok && _MoEawSSZ.success) {
_dEKZtHUO = _MoEawSSZ._ZbDdKFqz;
_poVcDdYJ.textContent = `筛选完成!共找到 ${_dwDJxpxt._INBMIOUv} 个可用IP。`;
} else {
throw new Error(_MoEawSSZ._NuhYLxME || '保存结果以生成ID时出错');
}
} catch (_LfwZJXgS) {
_poVcDdYJ.textContent = `筛选完成!但生成订阅ID失败。`;
_aPhGaGsr(`生成订阅ID失败: ${_LfwZJXgS._NuhYLxME}`, 'error');
}
fetch('/api/cache-live-_XpVDEcDY', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify(_dwDJxpxt)
}).catch(_LfwZJXgS => console.error("无法缓存实时结果:", _LfwZJXgS));
if (_tDDyIANp.cloudStorage._ImHVJKEY) {
fetch('/api/save-_oWwSOqCE', {
method: 'POST',
_FkdqCqtw: { 'Content-Type': 'application/json' },
_DsxCXtGH: JSON.stringify(_dwDJxpxt)
}).then(_wIeIFWOQ => {
if (_wIeIFWOQ.ok) _aPhGaGsr('结果已保存到云端!', 'success');
});
}
} else {
_poVcDdYJ.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _PVQFkhjV() {
if (!_tDDyIANp.cloudStorage._ImHVJKEY) {
_gbxusszC._aOGvRyHA.display = 'none';
return;
}
_poVcDdYJ.textContent = '正在获取上次优选结果...';
try {
const _ErBuCYWR = await fetch('/api/get-cached-_oWwSOqCE');
if (_ErBuCYWR.ok) {
const _MoEawSSZ = await _ErBuCYWR.json();
if (_MoEawSSZ && _MoEawSSZ._XpVDEcDY && _MoEawSSZ._XpVDEcDY._INBMIOUv > 0) {
_PLVUeGPO(_MoEawSSZ, _IuUviUSx, true);
} else {
_gbxusszC._aOGvRyHA.display = 'none';
}
}
} catch (_LfwZJXgS) {
console.error("加载缓存失败:", _LfwZJXgS);
}
}
let _TciDbBXU;
function _aPhGaGsr(_NuhYLxME, _HBQootdK = 'success', _nrAldcqa = 3000) {
if (_TciDbBXU) clearTimeout(_TciDbBXU);
_rgQNUXlv.innerHTML = _NuhYLxME;
let _HUpqytdg = 'var(--success-_ewKXAcDO)';
if (_HBQootdK === 'error') _HUpqytdg = 'var(--danger-_ewKXAcDO)';
if (_HBQootdK === 'warning') _HUpqytdg = 'var(--warning-_ewKXAcDO)';
if (_HBQootdK === 'info') _HUpqytdg = 'var(--primary-_ewKXAcDO)';
_rgQNUXlv._aOGvRyHA.backgroundColor = _HUpqytdg;
_rgQNUXlv.classList.add('show');
_TciDbBXU = setTimeout(() => { _rgQNUXlv.classList.remove('show'); }, _nrAldcqa);
}
let _BKVRJadV;
function _skgngkqE(_ewKXAcDO) {
const _eMRJUFPK = document.getElementById('background-_eMRJUFPK');
if (!_eMRJUFPK || !_eMRJUFPK.getContext) return;
_eMRJUFPK._aOGvRyHA.display = 'block';
const _BACedYYN = _eMRJUFPK.getContext('2d');
let _NHILxqjM, height, particles;
const _isJMxLEt = _foYmLSWz(_ewKXAcDO);
if (!_isJMxLEt) return;
const _oqVKsZzK = `${_isJMxLEt.r},${_isJMxLEt.g},${_isJMxLEt.b}`;
const _LTeiNgSy = () => {
if (_BKVRJadV) cancelAnimationFrame(_BKVRJadV);
_NHILxqjM = _eMRJUFPK._NHILxqjM = window.innerWidth;
height = _eMRJUFPK.height = window.innerHeight;
particles = Array.from({ _INBMIOUv: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _NHILxqjM, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_mHpYqwss();
};
const _mHpYqwss = () => {
_BACedYYN.clearRect(0, 0, _NHILxqjM, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _NHILxqjM) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_BACedYYN.beginPath();
_BACedYYN.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_BACedYYN.fillStyle = `rgba(${_oqVKsZzK}, 0.5)`;
_BACedYYN.fill();
});
for (let _DwqCbJFR = 0; _DwqCbJFR < particles._INBMIOUv; _DwqCbJFR++) {
for (let _YOpJXmyf = _DwqCbJFR + 1; _YOpJXmyf < particles._INBMIOUv; _YOpJXmyf++) {
const _etxzuxTD = Math.hypot(particles[_DwqCbJFR].x - particles[_YOpJXmyf].x, particles[_DwqCbJFR].y - particles[_YOpJXmyf].y);
if (_etxzuxTD < 120) {
_BACedYYN.beginPath(); _BACedYYN.moveTo(particles[_DwqCbJFR].x, particles[_DwqCbJFR].y);
_BACedYYN.lineTo(particles[_YOpJXmyf].x, particles[_YOpJXmyf].y);
_BACedYYN.strokeStyle = `rgba(${_oqVKsZzK}, ${1 - _etxzuxTD/120})`;
_BACedYYN.stroke();
}
}
}
_BKVRJadV = requestAnimationFrame(_mHpYqwss);
};
window.addEventListener('resize', _LTeiNgSy, { passive: true });
_LTeiNgSy();
}
function _nnrlkooG() {
if (_BKVRJadV) cancelAnimationFrame(_BKVRJadV);
const _eMRJUFPK = document.getElementById('background-_eMRJUFPK');
if (_eMRJUFPK && _eMRJUFPK.getContext('2d')) {
_eMRJUFPK.getContext('2d').clearRect(0, 0, _eMRJUFPK._NHILxqjM, _eMRJUFPK.height);
_eMRJUFPK._aOGvRyHA.display = 'none';
}
}
function _wCLonzFl() {
const _yETPTnrP = document.getElementById('copySubscriptionBtn');
const _bDYYKGQX = document.getElementById('_YwzzMmVZ');
const _VcgFwSNZ = document.getElementById('_wQjPVkUo');
const _sxCdPIdp = document.getElementById('closeSubModalBtn');
const _TOqBzeGV = _VcgFwSNZ.querySelector('.modal-close-btn');
_yETPTnrP.addEventListener('click', () => {
if (!_IKpLteGJ || _dwDJxpxt._INBMIOUv === 0) {
_aPhGaGsr('请先完成优选IP测试', 'warning');
return;
}
if (!_dEKZtHUO) {
_aPhGaGsr('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_tDDyIANp._oMuOaEqc) {
_aPhGaGsr('管理员未配置Sublink服务地址', 'error');
return;
}
const _xguzsCit = 'https://' + window._tVQdJaQY._xpmdLPTW + '/' + _dEKZtHUO;
const _NsyrGPmG = {
coreEngine: _xguzsCit + 'xr',
coreProfile: _xguzsCit + 'si',
configProfile: _xguzsCit + 'cl',
policyProfile: _xguzsCit + 'su'
};
_bDYYKGQX.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _HBQootdK = btn.dataset.subType;
navigator.clipboard.writeText(_NsyrGPmG[_HBQootdK]).then(() => {
_aPhGaGsr(`${_HBQootdK.charAt(0).toUpperCase() + _HBQootdK.slice(1)} 订阅链接已复制!`, 'success');
_bDYYKGQX._aOGvRyHA.display = 'none';
});
};
});
_bDYYKGQX.querySelectorAll('._FQfFMdjj-btn').forEach(btn => {
btn.onclick = () => {
const _HBQootdK = btn.dataset.subType;
const _uiDVxWGn = document.getElementById('qrCodeImg');
const _evYOamQn = _NsyrGPmG[_HBQootdK];
if (!_evYOamQn) return;
try {
const _FQfFMdjj = qrcode(0, 'M');
_FQfFMdjj.addData(_evYOamQn);
_FQfFMdjj.make();
_uiDVxWGn.src = _FQfFMdjj.createDataURL(10, 2);
_VcgFwSNZ._aOGvRyHA.display = 'flex';
} catch(_LfwZJXgS) {
_aPhGaGsr('生成二维码失败', 'error');
console.error(_LfwZJXgS);
}
};
});
_bDYYKGQX._aOGvRyHA.display = 'flex';
});
_sxCdPIdp.addEventListener('click', () => { _bDYYKGQX._aOGvRyHA.display = 'none'; });
_bDYYKGQX.addEventListener('click', (_LfwZJXgS) => { if(_LfwZJXgS.target === _bDYYKGQX) _bDYYKGQX._aOGvRyHA.display = 'none'; });
_VcgFwSNZ.addEventListener('click', (_LfwZJXgS) => { if(_LfwZJXgS.target === _VcgFwSNZ) _VcgFwSNZ._aOGvRyHA.display = 'none'; });
}
function _KlgkQLSe() {
const _WrTeRhfX = {
android: [
{ _xxcJNnBe: 'Karing', _MIWcZPwR: 'KaringX/karing', _pNoGddnl: ['apk', 'universal-release'] },
{ _xxcJNnBe: 'S' + 'ing-Box', _MIWcZPwR: 'SagerNet/sing-box', _pNoGddnl: ['android', 'universal'] },
{ _xxcJNnBe: 'V2' + 'rayNG', _MIWcZPwR: '2dust/v2rayNG', _pNoGddnl: ['apk', 'arm64-v8a'] },
{ _xxcJNnBe: 'C' + 'lash For Android', fixedUrl: 'https://github.com/clashdownload/Clash_for_Android/releases/download/2.5.12/cfa-2.5.12-premium-universal-release.apk' },
],
ios: [
{ _xxcJNnBe: 'Karing', fixedUrl: 'https://_XjFIhNhy.apple.com/us/_ePgmURZz/karing/id6472431552?_kMllJtvk=iphone' },
{ _xxcJNnBe: 'S' + 'ing-Box', fixedUrl: 'https://_XjFIhNhy.apple.com/us/_ePgmURZz/sing-box-vt/id6673731168' },
{ _xxcJNnBe: 'Shadow' + 'rocket', fixedUrl: 'https://_XjFIhNhy.apple.com/us/_ePgmURZz/shadowrocket/id932747118' },
],
windows: [
{ _xxcJNnBe: 'Karing', _MIWcZPwR: 'KaringX/karing', _pNoGddnl: ['exe', 'x64-setup'] },
{ _xxcJNnBe: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _xxcJNnBe: 'C' + 'lashN', _MIWcZPwR: '2dust/clashN', _pNoGddnl: ['clashN.zip'] },
],
mac: [
{ _xxcJNnBe: 'Karing', fixedUrl: 'https://_XjFIhNhy.apple.com/us/_ePgmURZz/karing/id6472431552?_kMllJtvk=mac' },
{ _xxcJNnBe: 'S' + 'ing-Box', fixedUrl: 'https://_XjFIhNhy.apple.com/us/_ePgmURZz/sing-box-vt/id6673731168' },
]
};
function _otoZNpkL(_dyGmaEyH) {
if (_tDDyIANp.streamer._ImHVJKEY && (_dyGmaEyH.includes('github.com') || _dyGmaEyH.includes('cdn.jsdelivr.net'))) {
return window._tVQdJaQY.origin + '/' + _dyGmaEyH.replace('://', ':/');
}
return _dyGmaEyH;
}
async function _BWFzCckp(_MIWcZPwR, _pNoGddnl) {
try {
const _ErBuCYWR = await fetch(_otoZNpkL(`https://api.github.com/repos/${_MIWcZPwR}/releases/latest`));
if (!_ErBuCYWR.ok) return null;
const _MoEawSSZ = await _ErBuCYWR.json();
for (const _aGEvtqCu of _pNoGddnl) {
const _TupxyBuI = _MoEawSSZ.assets.find(a => a._xxcJNnBe.toLowerCase().includes(_aGEvtqCu.toLowerCase()));
if (_TupxyBuI) return _TupxyBuI.browser_download_url;
}
return null;
} catch (_LfwZJXgS) { return null; }
}
async function _YWKoqZmT(_kMllJtvk) {
const _ANojjFjg = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_kMllJtvk];
_oghAOJQe.querySelector('#appModalTitle').textContent = `${_ANojjFjg} 客户端下载`;
const _EPteULCl = _oghAOJQe.querySelector('#appModalBody');
_EPteULCl.innerHTML = '<span>正在获取最新版本...</span>';
_oghAOJQe._aOGvRyHA.display = 'flex';
const _XjFIhNhy = _WrTeRhfX[_kMllJtvk];
let _SsbSJhVa = '';
for (const _ePgmURZz of _XjFIhNhy) {
let _VYNoNFTz = '';
if (_ePgmURZz.fixedUrl) {
_VYNoNFTz = `<a href="${_otoZNpkL(_ePgmURZz.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_ePgmURZz.fixedUrl.split('/').pop()}</a>`;
} else if (_ePgmURZz._MIWcZPwR) {
const _dyGmaEyH = await _BWFzCckp(_ePgmURZz._MIWcZPwR, _ePgmURZz._pNoGddnl);
if (_dyGmaEyH) {
_VYNoNFTz = `<a href="${_otoZNpkL(_dyGmaEyH)}" target="_blank" rel="noopener noreferrer">${_dyGmaEyH.split('/').pop()}</a>`;
} else {
_VYNoNFTz = '<span>获取失败,请稍后重试。</span>';
}
}
_SsbSJhVa += `<div class="_ePgmURZz-list-_ZJtZCMVd"><span class="_ePgmURZz-_xxcJNnBe">${_ePgmURZz._xxcJNnBe}</span><div class="_ePgmURZz-links">${_VYNoNFTz}</div></div>`;
}
_EPteULCl.innerHTML = _SsbSJhVa;
}
document.querySelectorAll('._ePgmURZz-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _YWKoqZmT(button.dataset._kMllJtvk));
});
_oghAOJQe.querySelector('.modal-close-btn').addEventListener('click', () => { _oghAOJQe._aOGvRyHA.display = 'none'; });
_oghAOJQe.addEventListener('click', (_LfwZJXgS) => { if (_LfwZJXgS.target === _oghAOJQe) _oghAOJQe._aOGvRyHA.display = 'none'; });
}
function _DWmmKigi(_tWMbNObF, _fuAHygtt) {
let _DwqCbJFR, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_SsbSJhVa");
for (_DwqCbJFR = 0; _DwqCbJFR < tabcontent._INBMIOUv; _DwqCbJFR++) {
tabcontent[_DwqCbJFR]._aOGvRyHA.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_DwqCbJFR = 0; _DwqCbJFR < tablinks._INBMIOUv; _DwqCbJFR++) {
tablinks[_DwqCbJFR].className = tablinks[_DwqCbJFR].className.replace(" active", "");
}
document.getElementById(_fuAHygtt)._aOGvRyHA.display = "block";
_tWMbNObF.currentTarget.className += " active";
}
function _msOhopEE() {
const _RDyKNAEK = document.createElement('div');
_RDyKNAEK._ZbDdKFqz = 'tooltip-popup';
document._DsxCXtGH.appendChild(_RDyKNAEK);
document.addEventListener('click', function(_LfwZJXgS) {
const _dnMbfQCc = _LfwZJXgS.target.closest('.tooltip-_dnMbfQCc');
if (_dnMbfQCc) {
const _evYOamQn = _dnMbfQCc.dataset.tooltip;
_RDyKNAEK.textContent = _evYOamQn;
const _MTaAblim = _dnMbfQCc.getBoundingClientRect();
_RDyKNAEK._aOGvRyHA.display = 'block';
let _rVIHOODS = _MTaAblim.bottom + window.scrollY + 5;
let _YGyPwWRe = _MTaAblim._YGyPwWRe + window.scrollX;
_RDyKNAEK._aOGvRyHA._rVIHOODS = `${_rVIHOODS}px`;
_RDyKNAEK._aOGvRyHA._YGyPwWRe = `${_YGyPwWRe}px`;
const _Imoavosv = _RDyKNAEK.getBoundingClientRect();
if (_Imoavosv.right > window.innerWidth - 10) {
_YGyPwWRe = window.innerWidth - _Imoavosv._NHILxqjM - 10;
}
if (_Imoavosv.bottom > window.innerHeight - 10) {
_rVIHOODS = _MTaAblim._rVIHOODS + window.scrollY - _Imoavosv.height - 5;
}
_RDyKNAEK._aOGvRyHA._rVIHOODS = `${_rVIHOODS}px`;
_RDyKNAEK._aOGvRyHA._YGyPwWRe = `${_YGyPwWRe}px`;
_LfwZJXgS.stopPropagation();
} else if (_RDyKNAEK._aOGvRyHA.display === 'block') {
_RDyKNAEK._aOGvRyHA.display = 'none';
}
});
}
const _aOGvRyHA = document.createElement('_aOGvRyHA');
_aOGvRyHA.textContent = `
.tab-button { background-_ewKXAcDO: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _ewKXAcDO: var(--_evYOamQn-light); font-size: 1em; }
.tab-button:hover { background-_ewKXAcDO: var(--border-_ewKXAcDO); }
.tab-button.active { _ewKXAcDO: var(--primary-_ewKXAcDO); border-bottom: 2px solid var(--primary-_ewKXAcDO); }
.tab-_SsbSJhVa { display: none; padding-_rVIHOODS: 1rem; }
`;
document.head.appendChild(_aOGvRyHA);
window.addEventListener('DOMContentLoaded', _HHtvqDJD);
</script>
</_DsxCXtGH></html>
`;
}