import { connect } from "cloudflare:sockets";
const _aMvnUkYs = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _PKhAkozK = ["UpstreamAddress.SG.CMLiussss.net"];
const _gZktKaFQ = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _YBwOennV = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _VrqZwkxf = '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 _bHyDzkan = '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 _wuyrgzEY(_QgjxXDNU) {
if (Array.isArray(_QgjxXDNU)) {
try {
return String.fromCharCode.apply(null, _QgjxXDNU);
} catch (_AYpGQMns) {
return '';
}
}
return _QgjxXDNU;
}
function _CZHnZWfy(_vdjrcNre) {
return /^[0-9a-_BJKeNJGb]{8}-[0-9a-_BJKeNJGb]{4}-[4][0-9a-_BJKeNJGb]{3}-[89ab][0-9a-_BJKeNJGb]{3}-[0-9a-_BJKeNJGb]{12}$/_KvOstDnB.test(_vdjrcNre);
}
const _etgXLlJL = "optimized_ips_v4";
const _CZfuROLI = "global_config_v4";
const _JkEKcuvo = "admin_password_v4";
const _OUZNQLtB = "live_results_temp_v1";
const _aUDgDnHA = "latest_sub_id_v1";
export default {
async fetch(_VKZoucbO, _fTzuFQXV, _QAsWicmN) {
try {
if (!_fTzuFQXV.DB) {
const _goUVFGZe = _FGZiMWEn("D1 数据库 'DB' 未绑定。");
return new Response(_goUVFGZe, { status: 503, _aluSVNtE: { 'Content-Type': '_ZmYcSgBh/html;_VVVVrTRb=UTF-8' }});
}
_QAsWicmN.waitUntil(
_fTzuFQXV.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_JmerAoNL TEXT PRIMARY KEY, _QgjxXDNU TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_vdjrcNre TEXT PRIMARY KEY, _gEylmZbU TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_AYpGQMns => console.error("DB Init Error:", _AYpGQMns._hHFIgjMu))
);
const _JOTGTLwo = new URL(_VKZoucbO._JOTGTLwo);
const _DLZqRmBf = _JOTGTLwo.pathname;
const _DRoXtLey = _VKZoucbO._aluSVNtE.get("Upgrade");
const _sbNKUEir = await _hqWINZbA(_fTzuFQXV);
if (_sbNKUEir.websocketStreamer && _sbNKUEir.websocketStreamer._fixYDcZO && _DRoXtLey && _DRoXtLey.toLowerCase() === "websocket") {
const _MNNQJdTW = _sbNKUEir.websocketStreamer._JOTGTLwo;
if (_MNNQJdTW && _MNNQJdTW.trim().startsWith('https://')) {
try {
const _zSecvmDK = new Request(_MNNQJdTW.trim() + _JOTGTLwo.pathname + _JOTGTLwo.search, _VKZoucbO);
return await fetch(_zSecvmDK);
} catch (_AYpGQMns) {
return new Response(`Upstream WebSocket gateway failed: ${_AYpGQMns._hHFIgjMu}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_DRoXtLey && _DRoXtLey.toLowerCase() === "websocket") {
return await _UmFuwjnf(_VKZoucbO, _fTzuFQXV, _sbNKUEir);
}
const _QgMiHbJG = _DLZqRmBf._uuDYiJVH(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_QgMiHbJG) {
const [, _IFchpDME, typeSuffix] = _QgMiHbJG;
const _jKzRIgtB = _sbNKUEir._jKzRIgtB;
if (!_jKzRIgtB || _jKzRIgtB.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' } });
}
const _IOhiveeZ = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _VwoYBqdT = _IOhiveeZ[typeSuffix];
const _AcUltfBv = _jKzRIgtB.replace(/\/$/, '');
const _bwFghFEc = `${_JOTGTLwo.origin}/${_IFchpDME}`;
const _aqhyPXNi = `${_AcUltfBv}/${_VwoYBqdT}?_sbNKUEir=${encodeURIComponent(_bwFghFEc)}`;
try {
const _ycwFNCUu = await fetch(_aqhyPXNi, { _aluSVNtE: { 'User-Agent': _VKZoucbO._aluSVNtE.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _QyTnmqqt = new Headers(_ycwFNCUu._aluSVNtE);
_QyTnmqqt._GUmzEavQ('Access-Control-Allow-Origin', '*');
return new Response(_ycwFNCUu._PVFUdepj, { status: _ycwFNCUu.status, statusText: _ycwFNCUu.statusText, _aluSVNtE: _QyTnmqqt });
} catch (_AYpGQMns) {
return new Response(`获取上游订阅失败: ${_AYpGQMns._hHFIgjMu}`, { status: 502, _aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' } });
}
}
if (_DLZqRmBf.startsWith('/https:/') || _DLZqRmBf.startsWith('/http:/')) {
return _XIpYMaQl(_VKZoucbO, _sbNKUEir);
}
if (_sbNKUEir.customSubPath && _sbNKUEir.customSubPath._fixYDcZO && _sbNKUEir.customSubPath._DLZqRmBf && _DLZqRmBf === '/' + _sbNKUEir.customSubPath._DLZqRmBf.trim()) {
const _RmNhbqOj = _fTzuFQXV.DB.prepare("SELECT _QgjxXDNU FROM kv_data WHERE _JmerAoNL = ?").bind(_aUDgDnHA);
const { _PlktmswB } = await _RmNhbqOj.all();
const _iCWBqLPR = _PlktmswB._HbQNqGXH > 0 ? _PlktmswB[0]._QgjxXDNU : null;
if (_iCWBqLPR) {
return _ZqelvWxM({ _KrFlDnBL: { _vdjrcNre: _iCWBqLPR }, _JOTGTLwo: _VKZoucbO._JOTGTLwo }, _fTzuFQXV);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' } });
}
}
const _HcHFXFKE = _DLZqRmBf.split('/').filter(Boolean);
if (_HcHFXFKE._HbQNqGXH === 1 && !_DLZqRmBf.startsWith('/api/')) {
const _IFchpDME = _HcHFXFKE[0];
return _ZqelvWxM({ _KrFlDnBL: { _vdjrcNre: _IFchpDME }, _JOTGTLwo: _VKZoucbO._JOTGTLwo }, _fTzuFQXV);
}
if (_DLZqRmBf.startsWith('/api/')) {
if (_DLZqRmBf === '/api/_sbNKUEir' && _VKZoucbO.method === 'POST') return _MIOhOqOk(_VKZoucbO, _fTzuFQXV, _QAsWicmN);
if (_DLZqRmBf === '/api/_GUmzEavQ-_RyMheNdx') return _sqPofCTt(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf === '/api/change-_RyMheNdx') return _DjLPUgnK(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf === '/api/verify-_RyMheNdx') return _HcooiecI(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf === '/api/verify-visitor-_RyMheNdx' && _VKZoucbO.method === 'POST') return _vfzrBWVH(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf === '/api/cache-live-_PlktmswB' && _VKZoucbO.method === 'POST') return _ysmttold(_VKZoucbO, _fTzuFQXV, _QAsWicmN);
if (_DLZqRmBf === '/api/get-_AbjkthOZ' && _VKZoucbO.method === 'POST') return _vmfdvOZg(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf === '/api/get-cached-_iPsJCAAK') return _LkPaaohW(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf === '/api/save-_iPsJCAAK') return _ETDrNMjS(_VKZoucbO, _fTzuFQXV, _QAsWicmN);
if (_DLZqRmBf === '/api/save-and-get-sub-_vdjrcNre' && _VKZoucbO.method === 'POST') return _PLULiRQg(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf.startsWith('/api/get-_BEgPBLQR/')) {
const _IFchpDME = _DLZqRmBf.split('/').pop();
return _ZqelvWxM({ _KrFlDnBL: { _vdjrcNre: _IFchpDME }, _JOTGTLwo: _VKZoucbO._JOTGTLwo }, _fTzuFQXV);
}
if (_DLZqRmBf === '/api/_sbNKUEir' && _VKZoucbO.method === 'GET') return _EfGrzlUN(_fTzuFQXV);
if (_DLZqRmBf === '/api/get-resolved-_iPsJCAAK') return _MTLBYhDB(_VKZoucbO);
if (_DLZqRmBf === '/api/parse-_iPsJCAAK-from-_EZwYvCVI' && _VKZoucbO.method === 'POST') return _mnDSPUYI(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf === '/api/endpoints') return _GuFQKhgv(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_DLZqRmBf === '/_YrmoNQCm') return _CNAJktOU(_VKZoucbO, _fTzuFQXV);
if (_DLZqRmBf === '/bing-wallpaper') return _MpyLdIPa();
return _iKQXnpOu(_VKZoucbO, _fTzuFQXV, _QAsWicmN);
} catch (err) {
let _AYpGQMns = err;
return new Response(_AYpGQMns.toString(), { status: 500 });
}
}
};
const _vBgbSmke = { 'Accept': '_ZmYcSgBh/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 _pUYmowIz(_JOTGTLwo, _rDjoRRDJ) {
const _CgjWpKUq = await fetch(_JOTGTLwo, { _aluSVNtE: { ..._vBgbSmke, 'Referer': _rDjoRRDJ.referer } });
if (_CgjWpKUq.ok) return _CgjWpKUq._ZmYcSgBh();
return null;
}
async function _rttpCYqG(_JOTGTLwo, _rDjoRRDJ) {
const _svIGyHyL = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_JOTGTLwo)}`;
const _CgjWpKUq = await fetch(_svIGyHyL, { _aluSVNtE: { ..._vBgbSmke, 'Referer': _rDjoRRDJ.referer } });
if (!_CgjWpKUq.ok) return null;
const _PVFUdepj = await _CgjWpKUq._ZmYcSgBh();
const _uuDYiJVH = _PVFUdepj._uuDYiJVH(/<pre[^>]*>([\s\S]*?)<\/pre>/_KvOstDnB);
return _uuDYiJVH && _uuDYiJVH[1] ? _uuDYiJVH[1].replace(/&/g, '&') : null;
}
function _oWxFrIGy(_IBLQQsrr) {
let _xOUlGZez;
try {
_xOUlGZez = atob(_IBLQQsrr.replace(/\s/g, ''));
} catch (_AYpGQMns) {
_xOUlGZez = _IBLQQsrr;
}
const _BEgPBLQR = _xOUlGZez.split(/[\s\n\r,]+/).filter(line => line.trim());
const _cdOGfczD = new Set();
const _HLfRZnyw = /@([^?#]+?):(\d+)/;
for (const _XDrSdPBI of _BEgPBLQR) {
let _ttVuNTKr = '';
let _MYhKfdhm = '';
try {
if (_XDrSdPBI.startsWith('vmess://')) {
const _xPZPzjbr = atob(_XDrSdPBI.substring(8));
const _sbNKUEir = JSON.parse(_xPZPzjbr);
_ttVuNTKr = _sbNKUEir.add;
_MYhKfdhm = _sbNKUEir._MYhKfdhm;
} else {
const _uuDYiJVH = _XDrSdPBI._uuDYiJVH(_HLfRZnyw);
if (_uuDYiJVH && _uuDYiJVH[1] && _uuDYiJVH[2]) {
_ttVuNTKr = _uuDYiJVH[1].replace(/[\[\]]/g, '');
_MYhKfdhm = _uuDYiJVH[2];
}
}
} catch (_AYpGQMns) {
console.warn(`Could not parse _XDrSdPBI: ${_XDrSdPBI}`);
}
if (_ttVuNTKr && _MYhKfdhm) {
_cdOGfczD.add(`${_ttVuNTKr}:${_MYhKfdhm}`);
}
}
return Array.from(_cdOGfczD);
}
async function _tTZUICck(_ESKkxAAV) {
try {
const _CgjWpKUq = await fetch(_ESKkxAAV, { _aluSVNtE: _vBgbSmke });
if (!_CgjWpKUq.ok) {
console.error(`Failed to fetch subscription: ${_CgjWpKUq.status}`);
return [];
}
const _IBLQQsrr = await _CgjWpKUq._ZmYcSgBh();
return _oWxFrIGy(_IBLQQsrr);
} catch (error) {
console.error(`Error processing subscription ${_ESKkxAAV}:`, error);
return [];
}
}
async function _vkbsWWFo(_VYmsCWlV) {
const _WkRTvxtp = _VYmsCWlV.trim();
const _NxpYcYRd = /^(vless|vmess|trojan|ss):\/\//.test(_WkRTvxtp);
const _WroKAbzQ = (() => {
if (_WkRTvxtp._HbQNqGXH < 20 || _WkRTvxtp.startsWith('http')) return false;
const _VvnISPXk = _WkRTvxtp.replace(/\s/g, '');
if (_VvnISPXk._HbQNqGXH % 4 !== 0 && !_VvnISPXk.includes('=')) return false;
try {
atob(_VvnISPXk);
return true;
} catch (_AYpGQMns) {
return false;
}
})();
if (_NxpYcYRd || _WroKAbzQ) {
return _oWxFrIGy(_WkRTvxtp).join('\n');
}
const _eVaIXNOk = [
'https://ipdb.api.030101.xyz/?_XvhFCJpx=bestcf&_MiNrmaqr=true',
'https://ipdb.api.030101.xyz/?_XvhFCJpx=bestproxy&_MiNrmaqr=true'
];
const _WUPehtaF = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_KvOstDnB.test(_VYmsCWlV) || _VYmsCWlV.includes('?_UoSlQDtR=');
if (_WUPehtaF) {
const _iPsJCAAK = await _tTZUICck(_VYmsCWlV);
return _iPsJCAAK.join('\n');
}
let _IBLQQsrr = '';
if (_eVaIXNOk.includes(_VYmsCWlV)) {
_IBLQQsrr = await _pUYmowIz(_VYmsCWlV, { referer: _VYmsCWlV });
if (!_IBLQQsrr || _IBLQQsrr._HbQNqGXH < 8) {
_IBLQQsrr = await _rttpCYqG(_VYmsCWlV, { referer: _VYmsCWlV });
}
} else {
try {
const _MUbLRjEI = await fetch(_VYmsCWlV, { _aluSVNtE: { 'User-Agent': 'Cloudflare-Worker' } });
if (_MUbLRjEI.ok) {
_IBLQQsrr = await _MUbLRjEI._ZmYcSgBh();
} else {
console.warn(`Failed to fetch URL ${_VYmsCWlV}: ${_MUbLRjEI.status}`);
}
} catch (_AYpGQMns) {
console.error(`Error fetching URL ${_VYmsCWlV}:`, _AYpGQMns);
}
}
const _nDlwSawZ = _oWxFrIGy(_IBLQQsrr);
if (_nDlwSawZ._HbQNqGXH > 0) {
return _nDlwSawZ.join('\n');
}
return _IBLQQsrr || '';
}
async function _XIpYMaQl(_VKZoucbO, _sbNKUEir) {
if (!_sbNKUEir.streamer._fixYDcZO) {
return new Response('远程流功能未开启', { status: 403 });
}
const _JOTGTLwo = new URL(_VKZoucbO._JOTGTLwo);
const _QGziiHWV = _JOTGTLwo.pathname.substring(1).replace(':/', '://');
try {
const _aqhyPXNi = new URL(_QGziiHWV);
const _wdsfStGn = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_wdsfStGn.some(domain => _aqhyPXNi._ttVuNTKr.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _dEwjBQki = new Headers(_VKZoucbO._aluSVNtE);
_dEwjBQki._GUmzEavQ('Host', _aqhyPXNi._ttVuNTKr);
_dEwjBQki._GUmzEavQ('User-Agent', 'CF-Worker-Streamer/1.0');
const _bElvjiMf = await fetch(_aqhyPXNi.toString(), {
method: _VKZoucbO.method,
_aluSVNtE: _dEwjBQki,
_PVFUdepj: _VKZoucbO._PVFUdepj,
});
const _QyTnmqqt = new Headers(_bElvjiMf._aluSVNtE);
_QyTnmqqt._GUmzEavQ('Access-Control-Allow-Origin', '*');
_QyTnmqqt._GUmzEavQ('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_QyTnmqqt._GUmzEavQ('Access-Control-Allow-Headers', '*');
_QyTnmqqt._GUmzEavQ('Cache-Control', 'public, max-age=86400');
_QyTnmqqt._GUmzEavQ('X-Streamer-Source', 'CF-Worker');
_QyTnmqqt.delete('_IBLQQsrr-security-policy');
_QyTnmqqt.delete('x-_IBLQQsrr-security-policy');
_QyTnmqqt.delete('x-webkit-csp');
return new Response(_bElvjiMf._PVFUdepj, {
status: _bElvjiMf.status,
statusText: _bElvjiMf.statusText,
_aluSVNtE: _QyTnmqqt,
});
} catch (_AYpGQMns) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _UmFuwjnf(_VKZoucbO, _fTzuFQXV, _sbNKUEir) {
try {
const _oXYZBYXY = _sbNKUEir || await _hqWINZbA(_fTzuFQXV);
const _pWUtCwqZ = (_oXYZBYXY.itemLink._EsgQZQSt && _oXYZBYXY.itemLink._EsgQZQSt[0]) || {};
const _ZcSfciey = _pWUtCwqZ['_UoSlQDtR'] || _wuyrgzEY(_aMvnUkYs);
if (!_CZHnZWfy(_ZcSfciey)) {
throw new Error("Configured user _GgrNOVsf is not valid.");
}
const _rJQOSops = _oXYZBYXY.dataFeeds.universalFallbackAddress;
let _kDUwKUFN = {};
const _mqLTDmRL = _wuyrgzEY(_PKhAkozK[0] || "");
if (_rJQOSops) {
const [_gkPyfdIq, _MYhKfdhm = '443'] = _rJQOSops.split(':');
_kDUwKUFN = { _gkPyfdIq, _MYhKfdhm };
} else {
const [_gkPyfdIq, _MYhKfdhm = '443'] = _mqLTDmRL.split(':');
_kDUwKUFN = { _gkPyfdIq, _MYhKfdhm };
}
const _JOTGTLwo = new URL(_VKZoucbO._JOTGTLwo);
const _DLZqRmBf = _JOTGTLwo.pathname;
let _waVVrYpd = '';
const _dicYQWDB = _JOTGTLwo.searchParams.get('remote');
if (_dicYQWDB) {
_waVVrYpd = atob(_dicYQWDB);
} else if (_DLZqRmBf.startsWith('/endpoint=')) {
_waVVrYpd = _DLZqRmBf.substring(10);
} else if (_DLZqRmBf._HbQNqGXH > 1 && _DLZqRmBf.substring(1).includes('.')) {
_waVVrYpd = _DLZqRmBf.substring(1);
}
if (_waVVrYpd) {
const [_gkPyfdIq, _MYhKfdhm = '443'] = _waVVrYpd.split(':');
_kDUwKUFN = { _gkPyfdIq, _MYhKfdhm };
}
return await _OzakGmGW(_VKZoucbO, _ZcSfciey, _kDUwKUFN);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _OzakGmGW(_VKZoucbO, _GgrNOVsf, _kDUwKUFN) {
const _BrAxYfmx = new WebSocketPair();
const [clientEnd, _odREMlNu] = Object.values(_BrAxYfmx);
_odREMlNu.accept();
let _YhpfiByf = { _pBSWJzZa: null };
const _MDAFpFmA = _VKZoucbO._aluSVNtE.get("sec-websocket-protocol") || "";
const _mQUVMEuY = _YNXqmsUT(_odREMlNu, _MDAFpFmA);
_mQUVMEuY.pipeTo(new WritableStream({
async write(chunk) {
if (_YhpfiByf._pBSWJzZa) {
const _jSrpmDgj = _YhpfiByf._pBSWJzZa.writable.getWriter();
await _jSrpmDgj.write(chunk);
_jSrpmDgj.releaseLock();
return;
}
const { error, details } = await _gJSZchGG(chunk, _GgrNOVsf);
if (error) {
throw new Error(details);
}
const _LpTFOEVa = new Uint8Array([details._dtoTlTBD[0], 0]);
const _fVzGQlIf = chunk.slice(details.payloadIndex);
await _SOCtlnWd(_YhpfiByf, details._aEbeJVhT, details._rjrhygCi, _fVzGQlIf, _odREMlNu, _LpTFOEVa, _kDUwKUFN);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_EonKpycn(_odREMlNu);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _SOCtlnWd(_YhpfiByf, _aEbeJVhT, _rjrhygCi, _nkoNdrlG, _vmwKNXQa, _LpTFOEVa, _aWjpDXnX) {
const _vMjaaJXf = async (_gkPyfdIq, _MYhKfdhm) => {
let _FcgIaFRx = _gkPyfdIq;
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(_gkPyfdIq)) {
_FcgIaFRx = `${atob('d3d3Lg==')}${_gkPyfdIq}${atob('LnNzbGlwLmlv')}`;
}
const _pBSWJzZa = connect({ _ttVuNTKr: _FcgIaFRx, _MYhKfdhm });
_YhpfiByf._pBSWJzZa = _pBSWJzZa;
const _jSrpmDgj = _pBSWJzZa.writable.getWriter();
await _jSrpmDgj.write(_nkoNdrlG);
_jSrpmDgj.releaseLock();
return _pBSWJzZa;
};
const _iHCYAWMb = async () => {
if (!_aWjpDXnX._gkPyfdIq) return;
console.log(`Direct connection failed, falling back to gateway: ${_aWjpDXnX._gkPyfdIq}`);
const _xXiRUDmv = await _vMjaaJXf(_aWjpDXnX._gkPyfdIq, parseInt(_aWjpDXnX._MYhKfdhm, 10));
_xXiRUDmv.closed.catch(() => {}).finally(() => _EonKpycn(_vmwKNXQa));
_anhvKRwq(_xXiRUDmv, _vmwKNXQa, _LpTFOEVa, null);
};
try {
const _CqrGrevS = await _vMjaaJXf(_aEbeJVhT, _rjrhygCi);
_anhvKRwq(_CqrGrevS, _vmwKNXQa, _LpTFOEVa, _iHCYAWMb);
} catch (err) {
console.error("Primary connection failed:", err);
await _iHCYAWMb();
}
}
function _YNXqmsUT(_odREMlNu, _MDAFpFmA) {
let _bgYfTBIx = false;
return new ReadableStream({
start(_ULSMZJxr) {
_odREMlNu.addEventListener("_hHFIgjMu", (event) => { if (_bgYfTBIx) return; _ULSMZJxr.enqueue(event._gEylmZbU); });
_odREMlNu.addEventListener("close", () => { _EonKpycn(_odREMlNu); if (_bgYfTBIx) return; _ULSMZJxr.close(); });
_odREMlNu.addEventListener("error", (err) => _ULSMZJxr.error(err));
if (_MDAFpFmA) {
try {
const _JDhVortb = atob(_MDAFpFmA.replace(/-/g, "+").replace(/_/g, "/"));
_ULSMZJxr.enqueue(Uint8Array.from(_JDhVortb, c => c.charCodeAt(0))._CpQazPAl);
} catch (_AYpGQMns) { console.error("Failed to decode early _gEylmZbU:", _AYpGQMns); }
}
},
cancel() { _bgYfTBIx = true; _EonKpycn(_odREMlNu); },
});
}
async function _gJSZchGG(_CpQazPAl, _GgrNOVsf) {
if (_CpQazPAl.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _dtoTlTBD = new Uint8Array(_CpQazPAl.slice(0, 1));
const _CzXhtNaB = _orqLiqPC(new Uint8Array(_CpQazPAl.slice(1, 17)));
if (_CzXhtNaB !== _GgrNOVsf) return { error: true, details: "Invalid _GgrNOVsf" };
const _BoCIYtiO = new Uint8Array(_CpQazPAl.slice(17, 18))[0];
const _FTTVApQp = new Uint8Array(_CpQazPAl.slice(18 + _BoCIYtiO, 19 + _BoCIYtiO))[0];
if (_FTTVApQp !== 1) return { error: true, details: `Unsupported _FTTVApQp: ${_FTTVApQp}` };
const _ocvMbqVc = 19 + _BoCIYtiO;
const _rjrhygCi = new DataView(_CpQazPAl.slice(_ocvMbqVc, _ocvMbqVc + 2)).getUint16(0);
let _iMnNQyKk = _ocvMbqVc + 2;
const _yVMZWock = new Uint8Array(_CpQazPAl.slice(_iMnNQyKk, _iMnNQyKk + 1))[0];
let _JbdVVAXW = 0;
let _ASXPEPWN = _iMnNQyKk + 1;
let _aEbeJVhT = "";
switch (_yVMZWock) {
case 1: _JbdVVAXW = 4; _aEbeJVhT = new Uint8Array(_CpQazPAl.slice(_ASXPEPWN, _ASXPEPWN + _JbdVVAXW)).join("."); break;
case 2: _JbdVVAXW = new Uint8Array(_CpQazPAl.slice(_ASXPEPWN, _ASXPEPWN + 1))[0]; _ASXPEPWN++; _aEbeJVhT = new TextDecoder().decode(_CpQazPAl.slice(_ASXPEPWN, _ASXPEPWN + _JbdVVAXW)); break;
case 3: _JbdVVAXW = 16; const _bRdjcDRD = new DataView(_CpQazPAl.slice(_ASXPEPWN, _ASXPEPWN + _JbdVVAXW)); const _OCuIysEv = []; for (let _KvOstDnB = 0; _KvOstDnB < 8; _KvOstDnB++) _OCuIysEv.push(_bRdjcDRD.getUint16(_KvOstDnB * 2).toString(16)); _aEbeJVhT = _OCuIysEv.join(":"); break;
default: return { error: true, details: `Invalid _miWreXCt _XvhFCJpx: ${_yVMZWock}` };
}
if (!_aEbeJVhT) return { error: true, details: "Target _gkPyfdIq is empty" };
return { error: false, details: { _aEbeJVhT, _rjrhygCi, _dtoTlTBD, payloadIndex: _ASXPEPWN + _JbdVVAXW } };
}
async function _anhvKRwq(_pBSWJzZa, _vmwKNXQa, _vWbVseZA, _eWCplpIu) {
let _SWtXHogv = _vWbVseZA;
let _EHwhlFtp = false;
let _eoeNryct = _pBSWJzZa._mQUVMEuY.pipeTo(new WritableStream({
write(chunk) {
_EHwhlFtp = true;
if (_vmwKNXQa.readyState !== 1) throw new Error("Channel is not open");
if (_SWtXHogv) {
const _acAXxHvB = new Uint8Array(_SWtXHogv.byteLength + chunk.byteLength);
_acAXxHvB._GUmzEavQ(new Uint8Array(_SWtXHogv));
_acAXxHvB._GUmzEavQ(new Uint8Array(chunk), _SWtXHogv.byteLength);
_vmwKNXQa.send(_acAXxHvB._CpQazPAl);
_SWtXHogv = null;
} else {
_vmwKNXQa.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _vmwKNXQa error:", err._hHFIgjMu);
});
await _eoeNryct;
if (!_EHwhlFtp && _eWCplpIu) {
_eWCplpIu();
}
}
function _EonKpycn(_vmwKNXQa) {
try { if (_vmwKNXQa.readyState === 1 || _vmwKNXQa.readyState === 2) _vmwKNXQa.close(); } catch (_AYpGQMns) {}
}
const _XJQJKiLK = Array.from({ _HbQNqGXH: 256 }, (_, _KvOstDnB) => (_KvOstDnB + 256).toString(16).slice(1));
function _orqLiqPC(_MeFgJNMo, offset = 0) {
return (
_XJQJKiLK[_MeFgJNMo[offset]] + _XJQJKiLK[_MeFgJNMo[offset + 1]] + _XJQJKiLK[_MeFgJNMo[offset + 2]] + _XJQJKiLK[_MeFgJNMo[offset + 3]] + "-" +
_XJQJKiLK[_MeFgJNMo[offset + 4]] + _XJQJKiLK[_MeFgJNMo[offset + 5]] + "-" +
_XJQJKiLK[_MeFgJNMo[offset + 6]] + _XJQJKiLK[_MeFgJNMo[offset + 7]] + "-" +
_XJQJKiLK[_MeFgJNMo[offset + 8]] + _XJQJKiLK[_MeFgJNMo[offset + 9]] + "-" +
_XJQJKiLK[_MeFgJNMo[offset + 10]] + _XJQJKiLK[_MeFgJNMo[offset + 11]] +
_XJQJKiLK[_MeFgJNMo[offset + 12]] + _XJQJKiLK[_MeFgJNMo[offset + 13]] +
_XJQJKiLK[_MeFgJNMo[offset + 14]] + _XJQJKiLK[_MeFgJNMo[offset + 15]]
).toLowerCase();
}
let _DeXoqbLd = { "N/A":"未知" };
async function _WLshiYre(_JOTGTLwo, _cZfPGEIQ, _eWCplpIu) {
try {
const _CgjWpKUq = await fetch(_JOTGTLwo, {
_aluSVNtE: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_CgjWpKUq.ok) {
console.error(`获取 ${_JOTGTLwo} 失败: HTTP ${_CgjWpKUq.status}`);
return _eWCplpIu;
}
const _ZmYcSgBh = await _CgjWpKUq._ZmYcSgBh();
return _cZfPGEIQ(_ZmYcSgBh);
} catch (error) {
console.error(`获取或解析 ${_JOTGTLwo} 时发生网络错误: ${error._hHFIgjMu}`);
return _eWCplpIu;
}
}
function _qlqmFHCp(_ZmYcSgBh) {
if (!_ZmYcSgBh) return [];
const _kasIIDJM = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _UTGmKQky = _ZmYcSgBh.split(/[\s,;#|]+/);
const _aizwCtRb = [];
for (const _tALiNZeJ of _UTGmKQky) {
const _NogjkHFh = _tALiNZeJ.trim();
if (!_NogjkHFh) continue;
const _cCzSXuuq = _NogjkHFh.lastIndexOf(':');
let _aIJKqfxU = _NogjkHFh;
if(_cCzSXuuq > _NogjkHFh.lastIndexOf(']')) {
const _oGdznZbC = _NogjkHFh.substring(_cCzSXuuq + 1);
if(!isNaN(_oGdznZbC) && _oGdznZbC._HbQNqGXH > 0) {
_aIJKqfxU = _NogjkHFh.substring(0, _cCzSXuuq);
}
}
if (_ehSwMfiD.isValid(_aIJKqfxU.replace(/[\[\]]/g, '')) || _kasIIDJM.test(_NogjkHFh)) {
_aizwCtRb.push(_NogjkHFh);
}
}
return _aizwCtRb;
}
function _ZUGSuORt(_ZmYcSgBh) {
if (!_ZmYcSgBh) return [];
return _ZmYcSgBh.split(/\s+/).filter(d => d.trim() !== '');
}
function _qYndcOUZ(_ZmYcSgBh) {
if (!_ZmYcSgBh) return { "N/A": "未知" };
try {
return JSON.parse(`{${_ZmYcSgBh}}`);
} catch (_AYpGQMns) {
console.error("解析 _DeXoqbLd 失败:", _AYpGQMns);
return { "N/A": "未知" };
}
}
const _ehSwMfiD = {
isValid: (_YrmoNQCm) => _ehSwMfiD.isIPv4(_YrmoNQCm) || _ehSwMfiD.isIPv6(_YrmoNQCm),
isIPv4: (_YrmoNQCm) => {
if (typeof _YrmoNQCm !== 'string') return false;
const _OCuIysEv = _YrmoNQCm.split('.');
if (_OCuIysEv._HbQNqGXH !== 4) return false;
return _OCuIysEv.every(_JFSUNXJK => {
const _TigJUBZb = parseInt(_JFSUNXJK, 10);
return !isNaN(_TigJUBZb) && _TigJUBZb >= 0 && _TigJUBZb <= 255 && String(_TigJUBZb) === _JFSUNXJK;
});
},
isIPv6: (_YrmoNQCm) => {
if (typeof _YrmoNQCm !== '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]))$/_KvOstDnB.test(_YrmoNQCm);
},
toLong4: (_YrmoNQCm) => _YrmoNQCm.split('.').reduce((acc, octet, _KvOstDnB) => acc + (parseInt(octet) << (8*(3-_KvOstDnB))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_YrmoNQCm) => {
try {
const _eYgGPgNj = _YrmoNQCm.split('/')[0];
const _OCuIysEv = _eYgGPgNj.split('::');
if (_OCuIysEv._HbQNqGXH > 2) return 0n;
let _gZhRVAPK = [];
if (_OCuIysEv[0]) {
_gZhRVAPK = _OCuIysEv[0].split(':');
}
let _jICaRgFt = [];
if (_OCuIysEv._HbQNqGXH > 1 && _OCuIysEv[1]) {
_jICaRgFt = _OCuIysEv[1].split(':');
}
if (_gZhRVAPK._HbQNqGXH + _jICaRgFt._HbQNqGXH > 8) return 0n;
const _PTDnanvx = 8 - (_gZhRVAPK._HbQNqGXH + _jICaRgFt._HbQNqGXH);
const _fptZcsbp = [
..._gZhRVAPK,
...Array(_PTDnanvx).fill('0'),
..._jICaRgFt
].map(_JFSUNXJK => _JFSUNXJK || '0');
while(_fptZcsbp._HbQNqGXH < 8) {
_fptZcsbp.push('0');
}
let _kiXzPiCu = 0n;
for (const _JFSUNXJK of _fptZcsbp) {
if (_JFSUNXJK._HbQNqGXH > 4) return 0n;
const _QgjxXDNU = BigInt('0x' + _JFSUNXJK);
_kiXzPiCu = (_kiXzPiCu << 16n) | _QgjxXDNU;
}
return _kiXzPiCu;
} catch(_AYpGQMns) {
return 0n;
}
},
fromBigInt6: (_kiXzPiCu) => {
if (typeof _kiXzPiCu !== '_kiXzPiCu' || _kiXzPiCu < 0n) return null;
const _OCuIysEv = [];
for (let _KvOstDnB = 0; _KvOstDnB < 8; _KvOstDnB++) {
_OCuIysEv.unshift((_kiXzPiCu & 0xFFFFn).toString(16));
_kiXzPiCu >>= 16n;
}
let _LoMDiXkG = { start: -1, _ySypYtlb: 0 };
let _plevFaSM = { start: -1, _ySypYtlb: 0 };
for (let _KvOstDnB = 0; _KvOstDnB < 8; _KvOstDnB++) {
if (_OCuIysEv[_KvOstDnB] === '0') {
if (_plevFaSM.start === -1) _plevFaSM.start = _KvOstDnB;
_plevFaSM._ySypYtlb++;
} else {
if (_plevFaSM._ySypYtlb > _LoMDiXkG._ySypYtlb) _LoMDiXkG = { ..._plevFaSM };
_plevFaSM = { start: -1, _ySypYtlb: 0 };
}
}
if (_plevFaSM._ySypYtlb > _LoMDiXkG._ySypYtlb) _LoMDiXkG = { ..._plevFaSM };
if (_LoMDiXkG._ySypYtlb > 1) {
_OCuIysEv.splice(_LoMDiXkG.start, _LoMDiXkG._ySypYtlb, '');
if (_LoMDiXkG.start === 0) _OCuIysEv.unshift('');
if (_LoMDiXkG.start + _LoMDiXkG._ySypYtlb === 8) _OCuIysEv.push('');
}
return _OCuIysEv.join(':');
},
cidrToRange: (cidr, _OWFKAJeF = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _BaodUduF = parseInt(bitsStr, 10);
const _iPsJCAAK = new Set();
if (_ehSwMfiD.isIPv4(range)) {
if (isNaN(_BaodUduF) || _BaodUduF < 8 || _BaodUduF > 32) return [];
if (_BaodUduF === 32) return [range];
const _mcmQwlSF = _ehSwMfiD.toLong4(range);
const _GGGAzYHx = (0xFFFFFFFF << (32 - _BaodUduF)) >>> 0;
const _UmVbgUQV = _mcmQwlSF & _GGGAzYHx;
const _Aniinsva = 1 << (32 - _BaodUduF);
if (_Aniinsva <= 2) return [];
const _DkpSkNge = Math.min(_OWFKAJeF, _Aniinsva - 2);
let _jJpoWrDp = 0;
while (_iPsJCAAK.size < _DkpSkNge && _jJpoWrDp < _DkpSkNge * 5) {
const _KnXDfCSD = Math.floor(Math.random() * (_Aniinsva - 2)) + 1;
_iPsJCAAK.add(_ehSwMfiD.fromLong4((_UmVbgUQV + _KnXDfCSD) >>> 0));
_jJpoWrDp++;
}
return Array.from(_iPsJCAAK);
} else if (_ehSwMfiD.isIPv6(range)) {
if (isNaN(_BaodUduF) || _BaodUduF < 16 || _BaodUduF > 128) return [];
if (_BaodUduF === 128) return [range];
const _zQfegRuT = _ehSwMfiD.toBigInt6(range);
const _GGGAzYHx = (2n ** BigInt(128 - _BaodUduF) - 1n);
const _UmVbgUQV = _zQfegRuT & ~_GGGAzYHx;
const _yuHMbiuj = 2n ** BigInt(128 - _BaodUduF);
if (_yuHMbiuj <= 2n) return [];
let _jJpoWrDp = 0;
while (_iPsJCAAK.size < _OWFKAJeF && _jJpoWrDp < _OWFKAJeF * 5) {
const _rPXkzyWi = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_rPXkzyWi);
let _RywPVTKL = 0n;
for (const _wGIyobgv of _rPXkzyWi) {
_RywPVTKL = (_RywPVTKL << 8n) | BigInt(_wGIyobgv);
}
const _KnXDfCSD = _RywPVTKL % (_yuHMbiuj - 2n) + 1n;
_iPsJCAAK.add(_ehSwMfiD.fromBigInt6(_UmVbgUQV + _KnXDfCSD));
_jJpoWrDp++;
}
return Array.from(_iPsJCAAK);
}
return [];
} catch(_AYpGQMns) {
console.error(`CIDR to range failed for ${cidr}:`, _AYpGQMns);
return [];
}
}
};
function _neRCgcqm(_pChDhswb, _hFtdyNpU) {
const _WrTjgVkk = {};
const _KtrAcXlk = Object._KtrAcXlk(_hFtdyNpU);
const _OCuIysEv = _KtrAcXlk.map(_JmerAoNL => {
const _DylbMNta = _pChDhswb * (_hFtdyNpU[_JmerAoNL] / 100);
return { _JmerAoNL, _OWFKAJeF: Math.floor(_DylbMNta), remainder: _DylbMNta - Math.floor(_DylbMNta) };
});
let _QPkFDtcb = _OCuIysEv.reduce((acc, _JFSUNXJK) => acc + _JFSUNXJK._OWFKAJeF, 0);
_OCuIysEv.sort((a, b) => b.remainder - a.remainder);
let _hhNxQFeb = _pChDhswb - _QPkFDtcb;
for (let _KvOstDnB = 0; _KvOstDnB < _hhNxQFeb; _KvOstDnB++) {
_OCuIysEv[_KvOstDnB % _OCuIysEv._HbQNqGXH]._OWFKAJeF++;
}
for (const _JFSUNXJK of _OCuIysEv) {
_WrTjgVkk[_JFSUNXJK._JmerAoNL] = _JFSUNXJK._OWFKAJeF;
}
return _WrTjgVkk;
}
async function _FGeBlCtR(_fTzuFQXV) {
const _RmNhbqOj = _fTzuFQXV.DB.prepare("SELECT _QgjxXDNU FROM kv_data WHERE _JmerAoNL = ?").bind(_JkEKcuvo);
const { _PlktmswB } = await _RmNhbqOj.all();
return _PlktmswB._HbQNqGXH > 0 ? _PlktmswB[0]._QgjxXDNU : null;
}
async function _dHeaFsJZ(_fTzuFQXV, _RyMheNdx) {
const _RmNhbqOj = _fTzuFQXV.DB.prepare(
"INSERT INTO kv_data (_JmerAoNL, _QgjxXDNU) VALUES (?, ?) ON CONFLICT(_JmerAoNL) DO UPDATE SET _QgjxXDNU = excluded._QgjxXDNU"
);
await _RmNhbqOj.bind(_JkEKcuvo, _RyMheNdx).run();
}
async function _HcooiecI(_VKZoucbO, _fTzuFQXV) {
const { _RyMheNdx } = await _VKZoucbO.json();
const _xqSIBXlq = await _FGeBlCtR(_fTzuFQXV);
if (_xqSIBXlq === _RyMheNdx) {
return _nCLvAmWC({ success: true });
}
return _nCLvAmWC({ success: false, _hHFIgjMu: '密码错误' }, 401);
}
async function _vfzrBWVH(_VKZoucbO, _fTzuFQXV) {
const _YZxOPbZr = await _hqWINZbA(_fTzuFQXV);
if (!_YZxOPbZr.visitorPassword || !_YZxOPbZr.visitorPassword._fixYDcZO) {
return _nCLvAmWC({ success: true });
}
try {
const { _RyMheNdx } = await _VKZoucbO.json();
const _TdMRZYfl = _YZxOPbZr.visitorPassword._RyMheNdx;
if (_TdMRZYfl && _RyMheNdx === _TdMRZYfl) {
return _nCLvAmWC({ success: true });
}
return _nCLvAmWC({ success: false, _hHFIgjMu: '访客密码错误' }, 401);
} catch (_AYpGQMns) {
return _nCLvAmWC({ success: false, _hHFIgjMu: '无效请求' }, 400);
}
}
async function _sqPofCTt(_VKZoucbO, _fTzuFQXV) {
const _foQMTObs = await _FGeBlCtR(_fTzuFQXV);
if (_foQMTObs) {
return _nCLvAmWC({ success: false, _hHFIgjMu: "密码已设置,无法重复初始化。" }, 403);
}
const { _RyMheNdx } = await _VKZoucbO.json();
if (!_RyMheNdx || _RyMheNdx._HbQNqGXH < 6) {
return _nCLvAmWC({ success: false, _hHFIgjMu: "密码长度不能少于6位。" }, 400);
}
await _dHeaFsJZ(_fTzuFQXV, _RyMheNdx);
return _nCLvAmWC({ success: true, _hHFIgjMu: "初始密码设置成功!请刷新页面并登录。" });
}
async function _DjLPUgnK(_VKZoucbO, _fTzuFQXV) {
const { _vdiAQKGK, _ZPaJpaue } = await _VKZoucbO.json();
const _xqSIBXlq = await _FGeBlCtR(_fTzuFQXV);
if (_xqSIBXlq !== _vdiAQKGK) {
return _nCLvAmWC({ success: false, _hHFIgjMu: "旧密码错误。" }, 403);
}
if (!_ZPaJpaue || _ZPaJpaue._HbQNqGXH < 6) {
return _nCLvAmWC({ success: false, _hHFIgjMu: "新密码长度不能少于6位。" }, 400);
}
await _dHeaFsJZ(_fTzuFQXV, _ZPaJpaue);
return _nCLvAmWC({ success: true, _hHFIgjMu: "密码修改成功!" });
}
function _PKrjiHPM() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_jKzRIgtB: '',
api: {
_fixYDcZO: true,
_hHFIgjMu: '维护中...',
},
ispFilter: { _fixYDcZO: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_fixYDcZO: true
},
websocketStreamer: {
_fixYDcZO: true,
_JOTGTLwo: 'https://snippets.neib.cn'
},
cloudStorage: {
_fixYDcZO: true
},
visitorPassword: {
_fixYDcZO: false,
_RyMheNdx: '',
},
customSubPath: {
_fixYDcZO: false,
_DLZqRmBf: 'latest',
},
subscriptionId: {
_HbQNqGXH: 8,
_VVVVrTRb: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_fixYDcZO: true,
template: 'vless://{_UoSlQDtR}@{_YrmoNQCm}:{_MYhKfdhm}?encryption=none&security=tls&sni={_gkPyfdIq}&fp=random&_XvhFCJpx=ws&_gkPyfdIq={_gkPyfdIq}&_DLZqRmBf={_DLZqRmBf}#{_Tnhqrazc}',
selectionMode: 'first',
_EsgQZQSt: [
{ _Tnhqrazc: '默认配置', _gkPyfdIq: '', '_UoSlQDtR': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _DLZqRmBf: '/?ed=2560' }
],
_WSGjxVIz: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_fixYDcZO: false,
_ZmYcSgBh: '',
_xsVTzixW: 5
},
marquee: {
_fixYDcZO: false,
_ZmYcSgBh: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_fixYDcZO: true,
sources: [
{ _CJPfahxO: 'CF官方IPV4', _iPsJCAAK: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _dNDuhIOu: false, _fixYDcZO: true, _kxcDKxIK: 20 },
{ _CJPfahxO: 'CF官方IPV6', _iPsJCAAK: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _dNDuhIOu: false, _fixYDcZO: true, _kxcDKxIK: 20 },
{ _CJPfahxO: '反代优选0', _iPsJCAAK: 'https://wvs.sosorg.nyc.mn/sub?_UoSlQDtR=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_XvhFCJpx=ws&_gkPyfdIq=ss.nzvrn.com&_DLZqRmBf=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _dNDuhIOu: false, _fixYDcZO: true, _kxcDKxIK: 30 },
{ _CJPfahxO: '官方优选1', _iPsJCAAK: 'https://ipdb.api.030101.xyz/?_XvhFCJpx=bestcf&_MiNrmaqr=true', _dNDuhIOu: false, _fixYDcZO: true, _kxcDKxIK: 10 },
{ _CJPfahxO: '反代优选2', _iPsJCAAK: 'https://ipdb.api.030101.xyz/?_XvhFCJpx=bestproxy&_MiNrmaqr=true', _dNDuhIOu: false, _fixYDcZO: true, _kxcDKxIK: 5 },
{ _CJPfahxO: '官方优选2', _iPsJCAAK: 'https://addressesapi.090227.xyz/_YrmoNQCm.164746.xyz', _dNDuhIOu: false, _fixYDcZO: true, _kxcDKxIK: 10 },
{ _CJPfahxO: '官方优选3', _iPsJCAAK: 'https://cfxr.eu.org/getSub?_gkPyfdIq=snipaste.huggy.qzz.io', _dNDuhIOu: false, _fixYDcZO: true, _kxcDKxIK: 5 },
{ _CJPfahxO: '官方优选4', _iPsJCAAK: 'https://addressesapi.090227.xyz/CloudFlareYes', _dNDuhIOu: false, _fixYDcZO: true, _kxcDKxIK: 10 }
]
},
customNodes: {
_fixYDcZO: 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 _LWLpmkFS(_XSURfEiI, _vFyyiwLW) {
if (!_XSURfEiI) return _vFyyiwLW;
const _ZviecAkj = { ..._vFyyiwLW };
for (const _JmerAoNL in _vFyyiwLW) {
if (_XSURfEiI.hasOwnProperty(_JmerAoNL)) {
if (typeof _XSURfEiI[_JmerAoNL] === 'object' && _XSURfEiI[_JmerAoNL] !== null && !Array.isArray(_XSURfEiI[_JmerAoNL]) && typeof _vFyyiwLW[_JmerAoNL] === 'object' && _vFyyiwLW[_JmerAoNL] !== null && !Array.isArray(_vFyyiwLW[_JmerAoNL])) {
_ZviecAkj[_JmerAoNL] = _LWLpmkFS(_XSURfEiI[_JmerAoNL], _vFyyiwLW[_JmerAoNL]);
} else {
_ZviecAkj[_JmerAoNL] = _XSURfEiI[_JmerAoNL];
}
}
}
return _ZviecAkj;
}
async function _hqWINZbA(_fTzuFQXV) {
try {
const _RmNhbqOj = _fTzuFQXV.DB.prepare("SELECT _QgjxXDNU FROM kv_data WHERE _JmerAoNL = ?").bind(_CZfuROLI);
const { _PlktmswB } = await _RmNhbqOj.all();
const _SudxxPKK = _PlktmswB._HbQNqGXH > 0 ? _PlktmswB[0]._QgjxXDNU : null;
const _YCIzoWuE = _SudxxPKK ? JSON.parse(_SudxxPKK) : {};
return _LWLpmkFS(_YCIzoWuE, _PKrjiHPM());
} catch (_AYpGQMns) {
console.error("无法从D1获取或解析全局配置:", _AYpGQMns);
return _PKrjiHPM();
}
}
async function _EfGrzlUN(_fTzuFQXV) {
const _sbNKUEir = await _hqWINZbA(_fTzuFQXV);
return _nCLvAmWC(_sbNKUEir);
}
async function _MIOhOqOk(_VKZoucbO, _fTzuFQXV, _QAsWicmN) {
try {
const { _sbNKUEir, adminPassword } = await _VKZoucbO.json();
const _xqSIBXlq = await _FGeBlCtR(_fTzuFQXV);
if (_xqSIBXlq !== adminPassword) {
return _nCLvAmWC({ success: false, _hHFIgjMu: "管理员密码错误" }, 403);
}
const _RmNhbqOj = _fTzuFQXV.DB.prepare(
"INSERT INTO kv_data (_JmerAoNL, _QgjxXDNU) VALUES (?, ?) ON CONFLICT(_JmerAoNL) DO UPDATE SET _QgjxXDNU = excluded._QgjxXDNU"
);
const _ImLgsGwx = _RmNhbqOj.bind(_CZfuROLI, JSON.stringify(_sbNKUEir)).run();
_QAsWicmN.waitUntil(_ImLgsGwx);
return _nCLvAmWC({ success: true, _hHFIgjMu: "配置已成功保存!" });
} catch (_AYpGQMns) {
return _nCLvAmWC({ success: false, _hHFIgjMu: `保存失败: ${_AYpGQMns._hHFIgjMu}` }, 500);
}
}
async function _MpyLdIPa() {
const _zAAwdAef = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _epyBRYgX = await fetch(_zAAwdAef);
const _vPFMXYmV = await _epyBRYgX.json();
const _YzvgFbkJ = 'https://www.bing.com' + _vPFMXYmV.images[0]._JOTGTLwo;
return fetch(_YzvgFbkJ);
} catch (_AYpGQMns) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _LMadrQfx(_YrmoNQCm) {
try {
const _CgjWpKUq = await fetch(`http://_YrmoNQCm-api.com/json/${_YrmoNQCm}?fields=status,_MiNrmaqr,countryCode,_rTPYhnuv&lang=zh-CN`);
if (_CgjWpKUq.ok) {
const _gEylmZbU = await _CgjWpKUq.json();
if (_gEylmZbU.status === 'success' && (_gEylmZbU.countryCode || _gEylmZbU._MiNrmaqr)) {
let _rTPYhnuv = _gEylmZbU._rTPYhnuv || '未知';
if (_rTPYhnuv.toLowerCase().includes('cloudflare')) {
_rTPYhnuv = 'CloudFlare';
}
return {
_CJPfahxO: _DeXoqbLd[_gEylmZbU.countryCode] || _gEylmZbU._MiNrmaqr || _gEylmZbU.countryCode,
_rTPYhnuv: _rTPYhnuv
};
}
}
} catch (_AYpGQMns) {}
try {
const _CgjWpKUq = await fetch(`https://api._YrmoNQCm.sb/geoip/${_YrmoNQCm}`);
if (_CgjWpKUq.ok) {
const _gEylmZbU = await _CgjWpKUq.json();
if (_gEylmZbU.country_code || _gEylmZbU._MiNrmaqr) {
let _rTPYhnuv = _gEylmZbU._rTPYhnuv || '未知';
if (_rTPYhnuv.toLowerCase().includes('cloudflare')) {
_rTPYhnuv = 'CloudFlare';
}
return {
_CJPfahxO: _DeXoqbLd[_gEylmZbU.country_code] || _gEylmZbU._MiNrmaqr || _gEylmZbU.country_code,
_rTPYhnuv: _rTPYhnuv
};
}
}
} catch (_AYpGQMns) {}
return { _CJPfahxO: '未知', _rTPYhnuv: '未知' };
}
async function _vmfdvOZg(_VKZoucbO, _fTzuFQXV) {
try {
const { _iPsJCAAK } = await _VKZoucbO.json();
if (!Array.isArray(_iPsJCAAK)) {
return _nCLvAmWC({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _SiLezYfd = _iPsJCAAK.map(_YrmoNQCm => _LMadrQfx(_YrmoNQCm).then(_AbjkthOZ => ({ _YrmoNQCm, ..._AbjkthOZ })));
const _PlktmswB = await Promise.all(_SiLezYfd);
return _nCLvAmWC(_PlktmswB);
} catch (_AYpGQMns) {
return _nCLvAmWC({ error: `获取地理位置失败: ${_AYpGQMns._hHFIgjMu}` }, 500);
}
}
async function _LkPaaohW(_VKZoucbO, _fTzuFQXV) {
const _sbNKUEir = await _hqWINZbA(_fTzuFQXV);
if (!_sbNKUEir.cloudStorage._fixYDcZO) {
return _nCLvAmWC({ _PlktmswB: [], generatedBy: null });
}
try {
const _RmNhbqOj = _fTzuFQXV.DB.prepare("SELECT _QgjxXDNU FROM kv_data WHERE _JmerAoNL = ?").bind(_etgXLlJL);
const { _PlktmswB } = await _RmNhbqOj.all();
const _bEZqhoxj = _PlktmswB._HbQNqGXH > 0 ? _PlktmswB[0]._QgjxXDNU : null;
const _ekCECGSj = _bEZqhoxj ? JSON.parse(_bEZqhoxj) : null;
return _nCLvAmWC(_ekCECGSj || { _PlktmswB: [], generatedBy: null });
} catch (_AYpGQMns) {
console.error("从D1读取缓存IP失败:", _AYpGQMns);
return _nCLvAmWC({ _PlktmswB: [], generatedBy: null });
}
}
async function _ETDrNMjS(_VKZoucbO, _fTzuFQXV, _QAsWicmN) {
const _sbNKUEir = await _hqWINZbA(_fTzuFQXV);
if (!_sbNKUEir.cloudStorage._fixYDcZO) {
return _nCLvAmWC({ success: true, _hHFIgjMu: "云端存储已禁用,不保存结果。" });
}
const _nhGGAkJD = _VKZoucbO._aluSVNtE.get('CF-Connecting-IP') || "未知IP";
const _MiNrmaqr = _VKZoucbO.cf?._MiNrmaqr || "未知";
const _rVvjmTwb = _VKZoucbO.cf?._rVvjmTwb || "";
let _vdqqTirW = _DeXoqbLd[_MiNrmaqr] || _MiNrmaqr;
if (_rVvjmTwb && _rVvjmTwb !== "未知城市" && _rVvjmTwb !== _MiNrmaqr) _vdqqTirW = `${_vdqqTirW} ${_DeXoqbLd[_rVvjmTwb] || _rVvjmTwb}`;
const _uaojUAUJ = {
_YrmoNQCm: _dngfRWxa(_nhGGAkJD),
_CJPfahxO: _vdqqTirW.trim(),
time: _DrlimqXe()
};
try {
const _kpDHRxXU = await _VKZoucbO.json();
if (!Array.isArray(_kpDHRxXU)) return _nCLvAmWC({ error: "无效数据格式" }, 400);
const _lxfRXNEY = _kpDHRxXU.map(_WLuMbUSv => ({
_YrmoNQCm: String(_WLuMbUSv._YrmoNQCm || ''),
_MYhKfdhm: _WLuMbUSv._MYhKfdhm ? parseInt(_WLuMbUSv._MYhKfdhm, 10) : undefined,
_cMlacRkK: parseInt(_WLuMbUSv._cMlacRkK, 10),
_CJPfahxO: typeof _WLuMbUSv._CJPfahxO === 'string' ? _WLuMbUSv._CJPfahxO.substring(0, 50) : 'N/A',
_rTPYhnuv: typeof _WLuMbUSv._rTPYhnuv === 'string' ? _WLuMbUSv._rTPYhnuv.substring(0, 100) : 'N/A'
}));
const _HtnLiObo = {
generatedBy: _uaojUAUJ,
_PlktmswB: _lxfRXNEY
};
const _JRxaTakE = _fTzuFQXV.DB.prepare(
"INSERT INTO kv_data (_JmerAoNL, _QgjxXDNU) VALUES (?, ?) ON CONFLICT(_JmerAoNL) DO UPDATE SET _QgjxXDNU = excluded._QgjxXDNU"
).bind(_etgXLlJL, JSON.stringify(_HtnLiObo)).run();
if (_sbNKUEir.telegram.bot_token && _sbNKUEir.telegram.chat_id) {
const _VFxKiZrT = _lxfRXNEY.map(r => `${r._YrmoNQCm} ~ ${r._CJPfahxO}`).join('\n');
const _aCvCwZtJ = `优选完成!\n来源: ${_uaojUAUJ._YrmoNQCm} (${_uaojUAUJ._CJPfahxO})\n时间: ${_uaojUAUJ.time}\n\n结果:\n${_VFxKiZrT}`;
const _dtSfJmlI = `https://api.telegram.org/bot${_sbNKUEir.telegram.bot_token}/sendMessage?chat_id=${_sbNKUEir.telegram.chat_id}&_ZmYcSgBh=${encodeURIComponent(_aCvCwZtJ)}`;
const _juWBUnOX = fetch(_dtSfJmlI).catch(_AYpGQMns => console.error("Telegram结果通知失败:", _AYpGQMns));
_QAsWicmN.waitUntil(Promise.all([_JRxaTakE, _juWBUnOX]));
} else {
_QAsWicmN.waitUntil(_JRxaTakE);
}
return _nCLvAmWC({ success: true, _hHFIgjMu: "结果已保存" });
} catch (_AYpGQMns) {
return _nCLvAmWC({ error: "D1写入失败", _hHFIgjMu: _AYpGQMns._hHFIgjMu }, 500);
}
}
async function _ysmttold(_VKZoucbO, _fTzuFQXV, _QAsWicmN) {
try {
const _vAEEQZHw = await _VKZoucbO.json();
if (!Array.isArray(_vAEEQZHw)) return _nCLvAmWC({ error: "无效数据格式" }, 400);
const _HtnLiObo = {
_PlktmswB: _vAEEQZHw
};
const _RmNhbqOj = _fTzuFQXV.DB.prepare(
"INSERT INTO kv_data (_JmerAoNL, _QgjxXDNU) VALUES (?, ?) ON CONFLICT(_JmerAoNL) DO UPDATE SET _QgjxXDNU = excluded._QgjxXDNU"
);
const _ImLgsGwx = _RmNhbqOj.bind(_OUZNQLtB, JSON.stringify(_HtnLiObo)).run();
_QAsWicmN.waitUntil(_ImLgsGwx);
return _nCLvAmWC({ success: true });
} catch (_AYpGQMns) {
return _nCLvAmWC({ error: "D1写入临时缓存失败", _hHFIgjMu: _AYpGQMns._hHFIgjMu }, 500);
}
}
function _rAoOjMuR(_HbQNqGXH, _VVVVrTRb) {
let _AAOUAPMg = '';
const _MyelUZqj = _VVVVrTRb._HbQNqGXH;
for (let _KvOstDnB = 0; _KvOstDnB < _HbQNqGXH; _KvOstDnB++) {
_AAOUAPMg += _VVVVrTRb.charAt(Math.floor(Math.random() * _MyelUZqj));
}
return _AAOUAPMg;
}
async function _PLULiRQg(_VKZoucbO, _fTzuFQXV) {
try {
const _kpDHRxXU = await _VKZoucbO.json();
if (!Array.isArray(_kpDHRxXU) || _kpDHRxXU._HbQNqGXH === 0) {
return _nCLvAmWC({ error: "无效或空的IP列表" }, 400);
}
const _sbNKUEir = await _hqWINZbA(_fTzuFQXV);
const _fZNyPbuh = _sbNKUEir.subscriptionId || { _HbQNqGXH: 8, _VVVVrTRb: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _IFchpDME;
let _rBsjRCkw = false;
let _jJpoWrDp = 0;
const _kPFGIfAn = 10;
while (!_rBsjRCkw && _jJpoWrDp < _kPFGIfAn) {
_IFchpDME = _rAoOjMuR(_fZNyPbuh._HbQNqGXH, _fZNyPbuh._VVVVrTRb);
const { _PlktmswB } = await _fTzuFQXV.DB.prepare("SELECT _vdjrcNre FROM optimized_results WHERE _vdjrcNre = ?").bind(_IFchpDME).all();
if (_PlktmswB._HbQNqGXH === 0) {
_rBsjRCkw = true;
}
_jJpoWrDp++;
}
if (!_rBsjRCkw) {
return _nCLvAmWC({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _dchJfCDZ = JSON.stringify({ _iPsJCAAK: _kpDHRxXU });
await _fTzuFQXV.DB.prepare(
"INSERT INTO optimized_results (_vdjrcNre, _gEylmZbU) VALUES (?, ?)"
).bind(_IFchpDME, _dchJfCDZ).run();
await _fTzuFQXV.DB.prepare(
"INSERT INTO kv_data (_JmerAoNL, _QgjxXDNU) VALUES (?, ?) ON CONFLICT(_JmerAoNL) DO UPDATE SET _QgjxXDNU = excluded._QgjxXDNU"
).bind(_aUDgDnHA, _IFchpDME).run();
return _nCLvAmWC({ success: true, _vdjrcNre: _IFchpDME });
} catch (_AYpGQMns) {
return _nCLvAmWC({ error: "保存优选结果失败", _hHFIgjMu: _AYpGQMns._hHFIgjMu }, 500);
}
}
async function _ZqelvWxM(_VKZoucbO, _fTzuFQXV) {
try {
const _IFchpDME = _VKZoucbO._KrFlDnBL._vdjrcNre;
if (!_IFchpDME) {
return new Response("缺少结果ID", { status: 400 });
}
const _AAOUAPMg = await _fTzuFQXV.DB.prepare("SELECT _gEylmZbU FROM optimized_results WHERE _vdjrcNre = ?").bind(_IFchpDME).first();
if (!_AAOUAPMg) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _gEylmZbU = JSON.parse(_AAOUAPMg._gEylmZbU);
let _VFxKiZrT = _gEylmZbU._iPsJCAAK;
const _sbNKUEir = await _hqWINZbA(_fTzuFQXV);
if (_sbNKUEir.customNodes && _sbNKUEir.customNodes._fixYDcZO && _sbNKUEir.customNodes.list) {
const _upKvuqXP = _sbNKUEir.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _VVTtrDwJ = _upKvuqXP.map(_XDrSdPBI => {
let _miWreXCt = _XDrSdPBI;
let _MYhKfdhm = undefined;
let _Tnhqrazc = null;
if (_miWreXCt.includes('@')) {
const _OCuIysEv = _miWreXCt.split('@');
_Tnhqrazc = _OCuIysEv.pop();
_miWreXCt = _OCuIysEv.join('@');
}
if (_miWreXCt.includes('#')) {
const _OCuIysEv = _miWreXCt.split('#');
const _oGdznZbC = _OCuIysEv.pop();
if (!isNaN(_oGdznZbC) && _oGdznZbC.trim() !== '') {
_MYhKfdhm = parseInt(_oGdznZbC, 10);
}
_miWreXCt = _OCuIysEv.join('#');
}
return {
_YrmoNQCm: _miWreXCt,
_MYhKfdhm: _MYhKfdhm,
_CJPfahxO: _Tnhqrazc || _miWreXCt,
_rTPYhnuv: '自定义'
};
});
_VFxKiZrT.unshift(..._VVTtrDwJ);
}
const { itemLink } = _sbNKUEir;
const _mqEujmVT = new URL(_VKZoucbO._JOTGTLwo)._ttVuNTKr;
let _oWstVCOg;
if (_sbNKUEir.websocketStreamer && _sbNKUEir.websocketStreamer._fixYDcZO) {
if (!itemLink || !itemLink._fixYDcZO || !itemLink._EsgQZQSt || itemLink._EsgQZQSt._HbQNqGXH === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_oWstVCOg = _VFxKiZrT.map((_WLuMbUSv, _ggQaAYdy) => {
let _Tnhqrazc;
if (_WLuMbUSv._rTPYhnuv === '自定义') {
_Tnhqrazc = `${_ggQaAYdy + 1} - ${_WLuMbUSv._CJPfahxO}`;
} else {
_Tnhqrazc = `${_ggQaAYdy + 1} - ${_WLuMbUSv._CJPfahxO || '未知'}`;
if (!_WLuMbUSv._rTPYhnuv || !_WLuMbUSv._rTPYhnuv.toLowerCase().includes('cloudflare')) {
_Tnhqrazc += '(反代)';
}
}
const _dnPqbKyI = _ehSwMfiD.isIPv6(_WLuMbUSv._YrmoNQCm) ? `[${_WLuMbUSv._YrmoNQCm}]` : _WLuMbUSv._YrmoNQCm;
const _MYhKfdhm = _WLuMbUSv._MYhKfdhm || 443;
const _ltzyROXl = itemLink._EsgQZQSt[0];
const _hsqEsJjO = _ltzyROXl._UoSlQDtR || '';
const _UoSlQDtR = (_hsqEsJjO && _CZHnZWfy(_hsqEsJjO)) ? _hsqEsJjO : crypto.randomUUID();
const _DLZqRmBf = '/snippets?_YrmoNQCm=endpointAddress:_MYhKfdhm(443)&nat64=6to4';
const _gkPyfdIq = _ltzyROXl._gkPyfdIq || _mqEujmVT;
const _KrFlDnBL = new URLSearchParams({
security: 'tls',
_XvhFCJpx: 'ws',
_gkPyfdIq: _gkPyfdIq,
sni: _gkPyfdIq,
fp: 'random'
});
return `vless://${_UoSlQDtR}@${_dnPqbKyI}:${_MYhKfdhm}?${_KrFlDnBL.toString()}&_DLZqRmBf=${encodeURIComponent(encodeURIComponent(_DLZqRmBf))}#${encodeURIComponent(_Tnhqrazc)}`;
});
} else {
if (!itemLink || !itemLink._fixYDcZO || !itemLink._EsgQZQSt || itemLink._EsgQZQSt._HbQNqGXH === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _ltzyROXl = itemLink._EsgQZQSt[0];
const { _gkPyfdIq, _UoSlQDtR, _DLZqRmBf } = _ltzyROXl;
_oWstVCOg = _VFxKiZrT.map((_WLuMbUSv, _ggQaAYdy) => {
let _Tnhqrazc;
if (_WLuMbUSv._rTPYhnuv === '自定义') {
_Tnhqrazc = `${_ggQaAYdy + 1} - ${_WLuMbUSv._CJPfahxO}`;
} else {
_Tnhqrazc = `${_ggQaAYdy + 1} - ${_WLuMbUSv._CJPfahxO || '未知'}`;
if (!_WLuMbUSv._rTPYhnuv || !_WLuMbUSv._rTPYhnuv.toLowerCase().includes('cloudflare')) {
_Tnhqrazc += '(反代)';
}
}
const _dnPqbKyI = _ehSwMfiD.isIPv6(_WLuMbUSv._YrmoNQCm) ? `[${_WLuMbUSv._YrmoNQCm}]` : _WLuMbUSv._YrmoNQCm;
const _MYhKfdhm = _WLuMbUSv._MYhKfdhm || 443;
const _KrFlDnBL = new URLSearchParams({
security: 'tls',
_XvhFCJpx: 'ws',
_gkPyfdIq: _gkPyfdIq || _mqEujmVT,
sni: _gkPyfdIq || _mqEujmVT,
fp: 'random'
});
return `vless://${_UoSlQDtR}@${_dnPqbKyI}:${_MYhKfdhm}?${_KrFlDnBL.toString()}&_DLZqRmBf=${encodeURIComponent(encodeURIComponent(_DLZqRmBf || ''))}#${encodeURIComponent(_Tnhqrazc)}`;
});
}
const _llcWuktz = _oWstVCOg.join('\n');
const _tuAwyKkR = btoa(_llcWuktz);
return new Response(_tuAwyKkR, {
_aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' }
});
} catch (_AYpGQMns) {
return new Response(`生成节点列表失败: ${_AYpGQMns._hHFIgjMu}`, { status: 500 });
}
}
async function _MTLBYhDB(_VKZoucbO) {
try {
const { _PyNjuMLV, _XvhFCJpx } = await _VKZoucbO.json();
if (!Array.isArray(_PyNjuMLV)) {
return new Response('Invalid _PyNjuMLV list', { status: 400 });
}
const _dzcSJSqL = _PyNjuMLV.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _JOTGTLwo = `https://cloudflare-dns.com/dns-query?_Tnhqrazc=${encodeURIComponent(domain.trim())}&_XvhFCJpx=${_XvhFCJpx || 'A'}`;
return fetch(_JOTGTLwo, { _aluSVNtE: { 'Accept': 'application/dns-json' } })
.then(_CgjWpKUq => _CgjWpKUq.json())
.then(_gEylmZbU => (_gEylmZbU.Answer ? _gEylmZbU.Answer.map(a => a._gEylmZbU) : []))
.catch(() => []);
});
const _WDSChIhc = (await Promise.all(_dzcSJSqL)).flat();
const _reDNBDOf = [...new Set(_WDSChIhc)];
if (_reDNBDOf._HbQNqGXH === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_reDNBDOf.join('\n'), { _aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._hHFIgjMu}`, { status: 500 });
}
}
async function _mnDSPUYI(_VKZoucbO, _fTzuFQXV) {
try {
const { _EZwYvCVI } = await _VKZoucbO.json();
if (!Array.isArray(_EZwYvCVI)) {
return _nCLvAmWC({ error: "Invalid input, expected an object with a '_EZwYvCVI' array." }, 400);
}
const _HNBhUPhI = new Set();
const _leLgAfEv = _EZwYvCVI.map(_JOTGTLwo =>
_vkbsWWFo(_JOTGTLwo)
.then(_ZmYcSgBh => {
if (!_ZmYcSgBh) return;
const _UTGmKQky = _ZmYcSgBh.split(/[\s,;|]+/);
for (const _tALiNZeJ of _UTGmKQky) {
const _NogjkHFh = _tALiNZeJ.trim();
if (_NogjkHFh) {
_HNBhUPhI.add(_NogjkHFh);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_JOTGTLwo}:`, err);
})
);
await Promise.all(_leLgAfEv);
return _nCLvAmWC({ _iPsJCAAK: Array.from(_HNBhUPhI) });
} catch (_AYpGQMns) {
return _nCLvAmWC({ error: `Failed to process URLs: ${_AYpGQMns._hHFIgjMu}` }, 500);
}
}
async function _CNAJktOU(_VKZoucbO, _fTzuFQXV) {
const _sbNKUEir = await _hqWINZbA(_fTzuFQXV);
if (!_sbNKUEir.api._fixYDcZO) {
return new Response(_sbNKUEir.api._hHFIgjMu || 'API is disabled.', { status: 503 });
}
try {
const _RmNhbqOj = _fTzuFQXV.DB.prepare("SELECT _QgjxXDNU FROM kv_data WHERE _JmerAoNL = ?").bind(_etgXLlJL);
const { _PlktmswB: dbResults } = await _RmNhbqOj.all();
const _bEZqhoxj = dbResults._HbQNqGXH > 0 ? dbResults[0]._QgjxXDNU : null;
const _ekCECGSj = _bEZqhoxj ? JSON.parse(_bEZqhoxj) : null;
if (!_ekCECGSj || !_ekCECGSj._PlktmswB || _ekCECGSj._PlktmswB._HbQNqGXH === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' },
});
}
const _iPsJCAAK = _ekCECGSj._PlktmswB.map(r => r._YrmoNQCm);
return new Response(_iPsJCAAK.join('\n'), {
_aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' },
});
} catch (_AYpGQMns) {
console.error("API /_YrmoNQCm 处理错误:", _AYpGQMns);
return new Response(`API处理时出错: ${_AYpGQMns._hHFIgjMu}`, { status: 500 });
}
}
function _UaTAYFcN(_AAOUAPMg, _ggQaAYdy, _sbNKUEir, _mqEujmVT) {
const { itemLink } = _sbNKUEir;
if (!itemLink || !itemLink._fixYDcZO) return null;
const { template, _EsgQZQSt, selectionMode, _WSGjxVIz } = itemLink;
if (!_EsgQZQSt || _EsgQZQSt._HbQNqGXH === 0) return null;
let _HlvUdiWh;
if (selectionMode === 'random') {
_HlvUdiWh = _EsgQZQSt[_ggQaAYdy % _EsgQZQSt._HbQNqGXH];
} else if (selectionMode === 'first') {
_HlvUdiWh = _EsgQZQSt[0];
} else {
_HlvUdiWh = _EsgQZQSt.find(s => s._Tnhqrazc === selectionMode) || _EsgQZQSt[0];
}
if (!_HlvUdiWh) return null;
let _yRqEhNDc = template;
const _PppsiDKT = _AAOUAPMg._MYhKfdhm || 443;
const _gkcGZhEy = _ehSwMfiD.isIPv6(_AAOUAPMg._YrmoNQCm) ? `[${_AAOUAPMg._YrmoNQCm}]` : _AAOUAPMg._YrmoNQCm;
let _Tnhqrazc = `${_ggQaAYdy + 1} 、 ${_AAOUAPMg._CJPfahxO || '未知'}`;
if (!_AAOUAPMg._rTPYhnuv || !_AAOUAPMg._rTPYhnuv.toLowerCase().includes('cloudflare')) {
_Tnhqrazc += '(反代)';
}
let _gkPyfdIq = _HlvUdiWh._gkPyfdIq || _mqEujmVT;
_yRqEhNDc = _yRqEhNDc.replace(/{_YrmoNQCm}/g, _gkcGZhEy)
.replace(/{_MYhKfdhm}/g, _PppsiDKT)
.replace(/{_Tnhqrazc}/g, encodeURIComponent(_Tnhqrazc))
.replace(/{rank}/g, _ggQaAYdy + 1)
.replace(/{_CJPfahxO}/g, encodeURIComponent(_AAOUAPMg._CJPfahxO || '未知'))
.replace(/{_rTPYhnuv}/g, encodeURIComponent(_AAOUAPMg._rTPYhnuv || '未知'))
.replace(/{_gkPyfdIq}/g, encodeURIComponent(_gkPyfdIq))
.replace(/{_UoSlQDtR}/g, encodeURIComponent(_HlvUdiWh['_UoSlQDtR'] || ''))
.replace(/{_DLZqRmBf}/g, encodeURIComponent(encodeURIComponent(_HlvUdiWh._DLZqRmBf || '')));
if (_WSGjxVIz) {
_WSGjxVIz.forEach(field => {
const _VUxoQdxx = new RegExp('{' + field._Tnhqrazc + '}', 'g');
_yRqEhNDc = _yRqEhNDc.replace(_VUxoQdxx, encodeURIComponent(field._QgjxXDNU));
});
}
return _yRqEhNDc;
}
async function _GuFQKhgv(_VKZoucbO, _fTzuFQXV) {
const _sbNKUEir = await _hqWINZbA(_fTzuFQXV);
if (!_sbNKUEir.itemLink._fixYDcZO) {
return new Response("Item _yRqEhNDc feature is disabled.", { status: 503, _aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' } });
}
try {
const _RmNhbqOj = _fTzuFQXV.DB.prepare("SELECT _QgjxXDNU FROM kv_data WHERE _JmerAoNL = ?").bind(_etgXLlJL);
const { _PlktmswB: dbResults } = await _RmNhbqOj.all();
const _bEZqhoxj = dbResults._HbQNqGXH > 0 ? dbResults[0]._QgjxXDNU : null;
const _ekCECGSj = _bEZqhoxj ? JSON.parse(_bEZqhoxj) : null;
if (!_ekCECGSj || !_ekCECGSj._PlktmswB || _ekCECGSj._PlktmswB._HbQNqGXH === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' },
});
}
const _mqEujmVT = new URL(_VKZoucbO._JOTGTLwo)._ttVuNTKr;
const _XKyKxpAz = _ekCECGSj._PlktmswB.map((_AAOUAPMg, _ggQaAYdy) => {
return _UaTAYFcN(_AAOUAPMg, _ggQaAYdy, _sbNKUEir, _mqEujmVT);
}).filter(Boolean);
if (_XKyKxpAz._HbQNqGXH === 0) {
return new Response("Could not generate any _WLuMbUSv links from the available IPs.", {
status: 500,
_aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' },
});
}
return new Response(_XKyKxpAz.join('\n'), {
_aluSVNtE: { 'Content-Type': '_ZmYcSgBh/plain; _VVVVrTRb=utf-8' },
});
} catch (_AYpGQMns) {
console.error("API /api/endpoints error:", _AYpGQMns);
return new Response(`Error processing API _VKZoucbO: ${_AYpGQMns._hHFIgjMu}`, { status: 500 });
}
}
async function _iKQXnpOu(_VKZoucbO, _fTzuFQXV, _QAsWicmN) {
const _nhGGAkJD = _VKZoucbO._aluSVNtE.get('CF-Connecting-IP') || "未知IP";
const [
_LSTZFwRe,
_NiXvwaaM,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_WLshiYre(_gZktKaFQ, _qlqmFHCp, []),
_WLshiYre(_YBwOennV, _qlqmFHCp, []),
_WLshiYre(_VrqZwkxf, _ZUGSuORt, []),
_WLshiYre(_bHyDzkan, _qYndcOUZ, { "N/A": "未知" })
]);
_DeXoqbLd = fetchedCountryMap;
let _IBPONWct = false;
let _YZxOPbZr;
try {
const _RyMheNdx = await _FGeBlCtR(_fTzuFQXV);
_IBPONWct = !!_RyMheNdx;
_YZxOPbZr = await _hqWINZbA(_fTzuFQXV);
} catch (_AYpGQMns) {
if (_AYpGQMns._hHFIgjMu && _AYpGQMns._hHFIgjMu.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _mvoHiCsA = "CREATE TABLE IF NOT EXISTS kv_data (_JmerAoNL TEXT PRIMARY KEY, _QgjxXDNU TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_vdjrcNre TEXT PRIMARY KEY, _gEylmZbU TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _fTzuFQXV.DB.exec(_mvoHiCsA);
console.log("数据表创建成功。");
_IBPONWct = false;
_YZxOPbZr = _PKrjiHPM();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._hHFIgjMu}`, {
status: 500,
_aluSVNtE: { 'Content-Type': '_ZmYcSgBh/html;_VVVVrTRb=UTF-8' }
});
}
} else {
let _goUVFGZe = _FGZiMWEn(_AYpGQMns._hHFIgjMu);
return new Response(_goUVFGZe, { _aluSVNtE: { 'Content-Type': '_ZmYcSgBh/html;_VVVVrTRb=UTF-8' } });
}
}
if (_YZxOPbZr.telegram.bot_token && _YZxOPbZr.telegram.chat_id) {
const _MiNrmaqr = _VKZoucbO.cf?._MiNrmaqr || "未知";
const _rVvjmTwb = _VKZoucbO.cf?._rVvjmTwb || "";
let _vdqqTirW = _DeXoqbLd[_MiNrmaqr] || _MiNrmaqr;
if (_rVvjmTwb && _rVvjmTwb !== "未知城市" && _rVvjmTwb !== _MiNrmaqr) _vdqqTirW = `${_vdqqTirW} ${_DeXoqbLd[_rVvjmTwb] || _rVvjmTwb}`;
const _DRQzKJUb = _DrlimqXe();
const _hqDekOLR = _VKZoucbO._JOTGTLwo;
const _aCvCwZtJ = `访客: ${_nhGGAkJD}\n位置: ${_vdqqTirW.trim()}\n时间: ${_DRQzKJUb}\n来自:${_hqDekOLR}`;
const _dtSfJmlI = `https://api.telegram.org/bot${_YZxOPbZr.telegram.bot_token}/sendMessage?chat_id=${_YZxOPbZr.telegram.chat_id}&_ZmYcSgBh=${encodeURIComponent(_aCvCwZtJ)}`;
_QAsWicmN.waitUntil(fetch(_dtSfJmlI).catch(_AYpGQMns => console.error("Telegram通知失败:", _AYpGQMns)));
}
let _JUFOexkJ = _pGfIflkS();
const _qrlRPQqM = {
_sbNKUEir: _YZxOPbZr,
status: {
_IBPONWct: _IBPONWct,
}
};
_JUFOexkJ = _JUFOexkJ.replace('__PAGE_DATA_JSON__', JSON.stringify(_qrlRPQqM));
_JUFOexkJ = _JUFOexkJ.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_LSTZFwRe));
_JUFOexkJ = _JUFOexkJ.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_NiXvwaaM));
_JUFOexkJ = _JUFOexkJ.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_JUFOexkJ = _JUFOexkJ.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_DeXoqbLd));
return new Response(_JUFOexkJ, {
_aluSVNtE: { 'Content-Type': '_ZmYcSgBh/html;_VVVVrTRb=UTF-8' },
});
}
function _nCLvAmWC(_PVFUdepj, status = 200, _aluSVNtE = {}) {
return new Response(JSON.stringify(_PVFUdepj), {
status,
_aluSVNtE: { 'Content-Type': 'application/json;_VVVVrTRb=UTF-8', ..._aluSVNtE }
});
}
function _DrlimqXe(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 _dngfRWxa(_YrmoNQCm) {
if (!_YrmoNQCm || typeof _YrmoNQCm !== 'string') return "无效IP";
if(_ehSwMfiD.isIPv4(_YrmoNQCm)){
const _OCuIysEv = _YrmoNQCm.split('.');
if (_OCuIysEv._HbQNqGXH === 4) return `${_OCuIysEv[0]}.*.*.${_OCuIysEv[3]}`;
}
if(_ehSwMfiD.isIPv6(_YrmoNQCm)){
const _OCuIysEv = _YrmoNQCm.split(':');
if (_OCuIysEv._HbQNqGXH > 2) return `${_OCuIysEv[0]}:...:${_OCuIysEv[_OCuIysEv._HbQNqGXH - 1]}`;
}
return _YrmoNQCm;
}
function _FGZiMWEn(_FArFOAdL) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _VVVVrTRb="UTF-8"><title>需要设置</title>
<_bFVtOxkZ>
_PVFUdepj { font-family: sans-serif; background: #1a1a1a; _HsRKrBro: #e0e0e0; display: flex; justify-_IBLQQsrr: center; align-items: center; height: 100vh; margin: 0; }
._NkrNSkBx { max-_dVonDvbr: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _HsRKrBro: #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 { _HsRKrBro: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_iWVOVtrV: 1rem; }
</_bFVtOxkZ>
</head><_PVFUdepj>
<div class="_NkrNSkBx">
<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>
${_FArFOAdL ? `<div class="error"><strong>当前错误信息:</strong> ${_FArFOAdL.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_PVFUdepj></html>`;
}
function _pGfIflkS() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _VVVVrTRb="UTF-8"> <meta _Tnhqrazc="viewport" _IBLQQsrr="_dVonDvbr=device-_dVonDvbr, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_yRqEhNDc 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>
<_bFVtOxkZ>
:root { --primary-_HsRKrBro: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_HsRKrBro: #8c939d; --light-bg: #1A1C20; --_IBLQQsrr-bg: #25282E; --border-_HsRKrBro: #40444C; --_ZmYcSgBh-_HsRKrBro: #E0E0E0; --_ZmYcSgBh-light: #B0B0B0; --success-_HsRKrBro: #30A46C; --danger-_HsRKrBro: #DA3633; --warning-_HsRKrBro: #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; }
_PVFUdepj { font-family: var(--font-family-sans); background-_HsRKrBro: var(--light-bg); _HsRKrBro: var(--_ZmYcSgBh-_HsRKrBro); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_HsRKrBro 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_bFUinqkJ { position: fixed; _iWVOVtrV: 0; _NbZurQIH: 0; _dVonDvbr: 100%; height: 100%; z-_ggQaAYdy: -1; display: none; }
._RYvmVXlP-_NkrNSkBx { max-_dVonDvbr: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_ggQaAYdy: 1; }
#_AVRYyjoP { position: fixed; _iWVOVtrV: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_ggQaAYdy: 10; }
#marquee-_NkrNSkBx { overflow: hidden; white-space: nowrap; background-_HsRKrBro: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _HsRKrBro: var(--primary-_HsRKrBro); padding: 0.5rem 0; margin-_iWVOVtrV: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_ZmYcSgBh { display: inline-block; padding-_NbZurQIH: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_vWbVseZA { _ZmYcSgBh-align: center; margin-_iWVOVtrV: 1rem; margin-bottom: 2rem; }
_vWbVseZA h1 { white-space: pre-wrap; font-size: 2.25em; _HsRKrBro: var(--primary-_HsRKrBro); font-weight: 700; _ZmYcSgBh-shadow: 0 0 10px rgba(var(--primary-_HsRKrBro-rgb), 0.3); }
.card { background-_HsRKrBro: 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-_HsRKrBro); }
.progress-section #_PrNKGKjG { _dVonDvbr: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_HsRKrBro: var(--border-_HsRKrBro); overflow: hidden; }
.progress-section #_PrNKGKjG::-webkit-progress-_QgjxXDNU { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _ZmYcSgBh-align: center; margin-_iWVOVtrV: 0.75em; font-size: 0.95em; _HsRKrBro: var(--_ZmYcSgBh-light); min-height: 1.5em; }
.section-_vWbVseZA { display: flex; flex-wrap: wrap; justify-_IBLQQsrr: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_HsRKrBro); gap: 1rem; }
.section-_vWbVseZA h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _HsRKrBro: var(--secondary-_HsRKrBro); _ZmYcSgBh-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _dVonDvbr: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _dVonDvbr: 100%; border-collapse: collapse; margin-_iWVOVtrV: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_HsRKrBro); padding: 0.8em; _ZmYcSgBh-align: _NbZurQIH; vertical-align: middle; white-space: nowrap; }
th { background-_HsRKrBro: #2c3038; font-weight: 500; }
tbody tr:hover { background-_HsRKrBro: #30333a; }
td._YrmoNQCm-_miWreXCt { font-weight: 500; font-family: var(--font-family-mono); _HsRKrBro: var(--primary-_HsRKrBro); }
td.ping-_QgjxXDNU { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _ZmYcSgBh-align: right; }
.btn { display: inline-flex; align-items: center; justify-_IBLQQsrr: center; font-weight: 500; _ZmYcSgBh-align: center; cursor: pointer; user-_LlkaQMAH: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _HsRKrBro: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_NbZurQIH: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _HsRKrBro: var(--primary-_HsRKrBro); border: 1px solid var(--primary-_HsRKrBro); }
.btn-outline:hover { background-_HsRKrBro: var(--primary-_HsRKrBro); _HsRKrBro: var(--_IBLQQsrr-bg); }
._RYvmVXlP-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._RYvmVXlP-download-buttons .btn { _dVonDvbr: 100%; margin: 0; }
.tooltip-notification { position: fixed; _iWVOVtrV: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _HsRKrBro: #fff; font-size: 0.95em; z-_ggQaAYdy: 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); }
#_bDHczpac, #_YlAKRWaj, #_wlyySPtE, #_mfMJXZBB, #_OYECmpOV { display: none; position: fixed; z-_ggQaAYdy: 10000; _NbZurQIH: 0; _iWVOVtrV: 0; _dVonDvbr: 100%; height: 100%; background-_HsRKrBro: rgba(0,0,0,0.6); justify-_IBLQQsrr: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_IBLQQsrr, ._RYvmVXlP-modal-_IBLQQsrr { background-_HsRKrBro: var(--_IBLQQsrr-bg); padding: 2rem; border: 1px solid var(--border-_HsRKrBro); border-radius: var(--border-radius-md); _dVonDvbr: 95%; max-_dVonDvbr: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_mfMJXZBB .modal-_IBLQQsrr { max-_dVonDvbr: 500px; }
.modal-_IBLQQsrr h3, ._RYvmVXlP-modal-_vWbVseZA h3 { margin-_iWVOVtrV: 0; margin-bottom: 1.5rem; _HsRKrBro: var(--primary-_HsRKrBro); _ZmYcSgBh-align: center; }
.modal-buttons { display: flex; justify-_IBLQQsrr: flex-end; gap: 1rem; margin-_iWVOVtrV: 2rem; border-_iWVOVtrV: 1px solid var(--border-_HsRKrBro); padding-_iWVOVtrV: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_HsRKrBro), rgba(0,0,0,0)); margin: 2rem 0; }
._RYvmVXlP-modal-_vWbVseZA { display: flex; justify-_IBLQQsrr: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_HsRKrBro); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _HsRKrBro: var(--_ZmYcSgBh-light); cursor: pointer; background: none; border: none; padding: 0; }
._RYvmVXlP-list-_WLuMbUSv { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_HsRKrBro); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._RYvmVXlP-_Tnhqrazc { font-size: 1.1em; font-weight: 600; }
._RYvmVXlP-links a { display: block; _HsRKrBro: var(--primary-_HsRKrBro); _ZmYcSgBh-decoration: none; margin-_iWVOVtrV: 0.5rem; word-break: break-all; }
._RYvmVXlP-links a:hover { _ZmYcSgBh-decoration: underline; }
._RYvmVXlP-links span { _HsRKrBro: var(--_ZmYcSgBh-light); }
#visitorPasswordPrompt { _ZmYcSgBh-align: center; }
#visitorPasswordPrompt h3 { _HsRKrBro: var(--primary-_HsRKrBro); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _HsRKrBro: var(--_ZmYcSgBh-light); margin-bottom: 1.5rem; }
._RyMheNdx-input-group { display: flex; gap: 10px; max-_dVonDvbr: 400px; margin: 0 auto; }
._RyMheNdx-input-group input { flex-grow: 1; _ZmYcSgBh-align: center; }
._RyMheNdx-input-group .btn { margin-_NbZurQIH: 0; }
._PlktmswB-actions-_NkrNSkBx { _ZmYcSgBh-align: center; margin-bottom: 1.5rem; }
._PlktmswB-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._PlktmswB-api-buttons .btn { margin: 0; _dVonDvbr: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_IBLQQsrr 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 _LlkaQMAH, .form-grid-control textarea { _dVonDvbr: 100%; background-_HsRKrBro: var(--light-bg); border: 1px solid var(--border-_HsRKrBro); border-radius: var(--border-radius-sm); _HsRKrBro: var(--_ZmYcSgBh-_HsRKrBro); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_HsRKrBro 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _LlkaQMAH:focus, .form-grid-control textarea:focus { border-_HsRKrBro: var(--primary-_HsRKrBro); box-shadow: 0 0 0 2px rgba(var(--primary-_HsRKrBro-rgb), 0.2); outline: none; }
.form-grid-control input[_XvhFCJpx="_HsRKrBro"] { min-_dVonDvbr: auto; padding: 2px; _dVonDvbr: 2.5em; height: 2.5em; }
.form-grid-control input[_XvhFCJpx="checkbox"] { _dVonDvbr: auto; flex-shrink: 0; height: 1.2em; _dVonDvbr: 1.2em; }
.form-grid-control ._kxcDKxIK-input { _dVonDvbr: 80px; _ZmYcSgBh-align: right; }
.tooltip-_CNUVIViG { display: inline-flex; _dVonDvbr: 16px; height: 16px; align-items: center; justify-_IBLQQsrr: center; background-_HsRKrBro: var(--secondary-_HsRKrBro); _HsRKrBro: var(--_IBLQQsrr-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_LlkaQMAH: none; }
#tooltip-popup { position: fixed; background-_HsRKrBro: #383c4a; _HsRKrBro: #fff; padding: 10px 15px; border-radius: 6px; z-_ggQaAYdy: 10001; font-size: 0.85em; max-_dVonDvbr: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_HsRKrBro); pointer-events: none; }
#custom-fields-_NkrNSkBx .form-grid-control { gap: 5px; } #custom-fields-_NkrNSkBx .form-grid-control input { flex: 1; }
.parameter-_GUmzEavQ-_ssMElFbq { border: 1px solid var(--border-_HsRKrBro); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_GUmzEavQ-_vWbVseZA { display: flex; justify-_IBLQQsrr: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_GUmzEavQ-_vWbVseZA input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_iWVOVtrV: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._ZmYcSgBh-_HsRKrBro-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _dVonDvbr: 100%; }
._ZmYcSgBh-_HsRKrBro-grid input[_XvhFCJpx="_HsRKrBro"] { grid-column: 1 / 2; }
._ZmYcSgBh-_HsRKrBro-grid input[_XvhFCJpx="_ZmYcSgBh"], ._ZmYcSgBh-_HsRKrBro-grid textarea { grid-column: 2 / 3; }
#_mfMJXZBB .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_mfMJXZBB .btn-group { display: flex; }
#_mfMJXZBB .sub-btn { flex-grow: 1; margin: 0; }
#_mfMJXZBB ._iOLtwVUA-btn { flex-shrink: 0; margin-_NbZurQIH: -1px; border-_iWVOVtrV-_NbZurQIH-radius: 0; border-bottom-_NbZurQIH-radius: 0; }
#_OYECmpOV .modal-_IBLQQsrr { max-_dVonDvbr: 300px; background: white; padding: 1rem; _ZmYcSgBh-align: center; }
#qrCodeImg { max-_dVonDvbr: 100%; }
@media (max-_dVonDvbr: 768px) {
html { font-size: 15px; } ._RYvmVXlP-_NkrNSkBx { padding: 0 0.8rem; } _vWbVseZA { margin-_iWVOVtrV: 2.5rem; margin-bottom: 1.5rem; } #_AVRYyjoP { _iWVOVtrV: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_bFVtOxkZ>
<_bFVtOxkZ _vdjrcNre="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_IBLQQsrr-bg: #FFFFFF; --border-_HsRKrBro: #DCDFE6; --_ZmYcSgBh-_HsRKrBro: #303133; --_ZmYcSgBh-light: #606266; }
.theme-light .card { background-_HsRKrBro: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_HsRKrBro: #F5F7FA; }
.theme-light tbody tr:hover { background-_HsRKrBro: #ECF5FF; }
.theme-matrix { --primary-_HsRKrBro: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_IBLQQsrr-bg: #0D0208; --border-_HsRKrBro: #00FF41; --_ZmYcSgBh-_HsRKrBro: #00FF41; --_ZmYcSgBh-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_HsRKrBro: rgba(0, 20, 0, 0.7); _ZmYcSgBh-shadow: 0 0 5px var(--primary-_HsRKrBro); backdrop-filter: none; }
.theme-matrix th { background-_HsRKrBro: #000; }
.theme-matrix tbody tr:hover { background-_HsRKrBro: #010; }
.theme-matrix .btn { _ZmYcSgBh-shadow: none; _HsRKrBro: #000; }
.theme-matrix .btn-outline { background-_HsRKrBro: transparent; }
.theme-modern-glass { --primary-_HsRKrBro: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_IBLQQsrr-bg: rgba(30, 30, 40, 0.6); --border-_HsRKrBro: rgba(255, 255, 255, 0.2); --_ZmYcSgBh-_HsRKrBro: #F0F0F0; --_ZmYcSgBh-light: #A0A0B0; --border-radius-md: 12px; }
_PVFUdepj.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-_HsRKrBro: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_IBLQQsrr-bg: rgba(30, 30, 40, 0.6); --border-_HsRKrBro: rgba(255, 255, 255, 0.2); --_ZmYcSgBh-_HsRKrBro: #F0F0F0; --_ZmYcSgBh-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_HsRKrBro: var(--_IBLQQsrr-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_HsRKrBro); }
.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-_HsRKrBro: rgba(0,0,0,0.3); border-right-_HsRKrBro: 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); _ZmYcSgBh-shadow: 0 1px 2px rgba(0,0,0,0.2); _HsRKrBro: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_HsRKrBro: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _ZmYcSgBh-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_HsRKrBro); border-_HsRKrBro: var(--primary-_HsRKrBro); _HsRKrBro: #fff; }
.glassy-components _vWbVseZA h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _ZmYcSgBh; -webkit-_ZmYcSgBh-fill-_HsRKrBro: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _HsRKrBro: transparent; }
.theme-aurora-glass { --primary-_HsRKrBro: #38bdf8; --light-bg: #0c0a09; --_IBLQQsrr-bg: rgba(23, 23, 23, 0.5); --border-_HsRKrBro: rgba(255, 255, 255, 0.15); --_ZmYcSgBh-_HsRKrBro: #f2f2f2; --_ZmYcSgBh-light: #a3a3a3; }
_PVFUdepj.theme-aurora-glass::before { _IBLQQsrr: ''; position: fixed; _iWVOVtrV: 0; _NbZurQIH: 0; _dVonDvbr: 100%; height: 100%; z-_ggQaAYdy: -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-_HsRKrBro: #08fdd8; --light-bg: #010409; --_IBLQQsrr-bg: rgba(22, 27, 34, 0.6); --border-_HsRKrBro: rgba(139, 148, 158, 0.3); --_ZmYcSgBh-_HsRKrBro: #e6edf3; --_ZmYcSgBh-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_HsRKrBro), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_HsRKrBro-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_HsRKrBro-rgb), 0.5); }
.theme-marble-light { --primary-_HsRKrBro: #bfa37c; --light-bg: #f7f5f2; --_IBLQQsrr-bg: #ffffff; --border-_HsRKrBro: #e0dcd5; --_ZmYcSgBh-_HsRKrBro: #3d3a36; --_ZmYcSgBh-light: #6b6661; }
_PVFUdepj.theme-marble-light { background-image: _JOTGTLwo('_gEylmZbU:image/svg+xml,%3Csvg _dVonDvbr="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-_HsRKrBro: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_bFVtOxkZ>
</head><_PVFUdepj _vdjrcNre="pageBody">
<_bFUinqkJ _vdjrcNre="background-_bFUinqkJ"></_bFUinqkJ>
<div _vdjrcNre="_bDHczpac">
<div class="modal-_IBLQQsrr">
<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 _XvhFCJpx="_RyMheNdx" _vdjrcNre="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _XvhFCJpx="_RyMheNdx" _vdjrcNre="confirmPassword"></div></div>
<div class="modal-buttons"><button _vdjrcNre="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_RYvmVXlP-_NkrNSkBx">
<button _vdjrcNre="_AVRYyjoP" class="btn btn-outline"></button>
<div _vdjrcNre="marquee-_NkrNSkBx"><div _vdjrcNre="marquee-_ZmYcSgBh"></div></div>
<_vWbVseZA><h1 _vdjrcNre="pageTitle"></h1></_vWbVseZA>
<div class="card" _vdjrcNre="visitorPasswordPrompt" _bFVtOxkZ="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_RyMheNdx-input-group">
<input _XvhFCJpx="_RyMheNdx" _vdjrcNre="visitorPasswordEntry" _VUxoQdxx="访客密码">
<button _vdjrcNre="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _vdjrcNre="_SlGwlwCe" _bFVtOxkZ="display: block;">
<div class="card progress-section">
<div _vdjrcNre="progressDisplay">
<progress _vdjrcNre="_PrNKGKjG" _QgjxXDNU="0" max="100"></progress>
<div _vdjrcNre="status">正在初始化...</div>
</div>
</div>
<div class="card _RYvmVXlP-download-section">
<div class="section-_vWbVseZA"><h2 _vdjrcNre="appDownloadTitleEl"></h2></div>
<div class="_RYvmVXlP-download-buttons">
<button class="btn" _gEylmZbU-_WRNzmdaH="android">安卓客户端</button>
<button class="btn" _gEylmZbU-_WRNzmdaH="ios">苹果客户端</button>
<button class="btn" _gEylmZbU-_WRNzmdaH="windows">Windows客户端</button>
<button class="btn" _gEylmZbU-_WRNzmdaH="mac">Mac客户端</button>
</div>
</div>
<div class="card _PlktmswB-section" _vdjrcNre="_rnFhCZYZ" _bFVtOxkZ="display:none;">
<div class="section-_vWbVseZA">
<h2 _vdjrcNre="liveTitleEl"></h2>
<div class="generator-info" _vdjrcNre="liveGeneratorInfo"></div>
</div>
<div _vdjrcNre="_KRdOkOoJ" class="_PlktmswB-actions-_NkrNSkBx" _bFVtOxkZ="display: none;">
<div class="_PlktmswB-api-buttons">
<button _vdjrcNre="copyIpApiBtn" class="btn">复制 IP API</button>
<button _vdjrcNre="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _vdjrcNre="resultsTable">
<thead><tr><th _vdjrcNre="tableHeader1El"></th><th _vdjrcNre="tableHeader2El"></th><th _vdjrcNre="tableHeader3El"></th><th _vdjrcNre="tableHeader4El"></th><th _vdjrcNre="tableHeader5El"></th><th _vdjrcNre="tableHeader6El"></th><th _vdjrcNre="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _vdjrcNre="_shMVyWZV" _bFVtOxkZ="display:none;">
<div class="section-_vWbVseZA"><h2 _vdjrcNre="cachedTitleEl"></h2><div class="generator-info" _vdjrcNre="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _vdjrcNre="cachedResultsTable">
<thead><tr><th _vdjrcNre="cachedTableHeader1El"></th><th _vdjrcNre="cachedTableHeader2El"></th><th _vdjrcNre="cachedTableHeader3El"></th><th _vdjrcNre="cachedTableHeader4El"></th><th _vdjrcNre="cachedTableHeader5El"></th><th _vdjrcNre="cachedTableHeader6El"></th><th _vdjrcNre="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _vdjrcNre="notificationTooltip" class="tooltip-notification"></div>
<div _vdjrcNre="_YlAKRWaj">
<div class="modal-_IBLQQsrr">
<h3>修改参数</h3>
<div _bFVtOxkZ="display: flex; border-bottom: 1px solid var(--border-_HsRKrBro); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_epxtGrXq(event, 'general-_UQrjgJCq')">通用设置</button>
<button class="tab-button" onclick="_epxtGrXq(event, '_yRqEhNDc-_UQrjgJCq')">链接设置</button>
<button class="tab-button" onclick="_epxtGrXq(event, 'fine-grained-_UQrjgJCq')">IP源设置</button>
<button class="tab-button" onclick="_epxtGrXq(event, 'advanced-_UQrjgJCq')">高级设置</button>
</div>
<div _vdjrcNre="general-_UQrjgJCq" class="tab-_IBLQQsrr" _bFVtOxkZ="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_LlkaQMAH _vdjrcNre="themeSelect">
<_DIpUfTso _QgjxXDNU="theme-aurora-glass">极光-玻璃质感</_DIpUfTso>
<_DIpUfTso _QgjxXDNU="theme-particles-glass">粒子-玻璃质感</_DIpUfTso>
<_DIpUfTso _QgjxXDNU="theme-modern-glass">现代-玻璃质感</_DIpUfTso>
<_DIpUfTso _QgjxXDNU="theme-cyberpunk-glass">赛博朋克-玻璃质感</_DIpUfTso>
<_DIpUfTso _QgjxXDNU="theme-dark-particles">暗色-粒子背景</_DIpUfTso>
<_DIpUfTso _QgjxXDNU="theme-dark-bing">暗色-必应壁纸</_DIpUfTso>
<_DIpUfTso _QgjxXDNU="theme-light">亮色-简约</_DIpUfTso>
<_DIpUfTso _QgjxXDNU="theme-light-bing">亮色-必应壁纸</_DIpUfTso>
<_DIpUfTso _QgjxXDNU="theme-marble-light">简约大理石-亮色</_DIpUfTso>
<_DIpUfTso _QgjxXDNU="theme-matrix">矩阵-代码雨</_DIpUfTso>
</_LlkaQMAH>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _XvhFCJpx="_HsRKrBro" _vdjrcNre="primaryColorInput">
<span _bFVtOxkZ="_dVonDvbr: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _XvhFCJpx="_HsRKrBro" _vdjrcNre="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bFVtOxkZ="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_ZmYcSgBh-_HsRKrBro-grid"><input _XvhFCJpx="_HsRKrBro" _vdjrcNre="colorInput_title"><textarea _vdjrcNre="textInput_title" _OoisfhTH="1" _VUxoQdxx="页面主标题"></textarea></div>
<div class="_ZmYcSgBh-_HsRKrBro-grid"><input _XvhFCJpx="_HsRKrBro" _vdjrcNre="colorInput_loginButton"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="textInput_loginButton" _VUxoQdxx="登录按钮文本"></div>
<div class="_ZmYcSgBh-_HsRKrBro-grid"><input _XvhFCJpx="_HsRKrBro" _vdjrcNre="colorInput_appDownloadTitle"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="textInput_appDownloadTitle" _VUxoQdxx="APP下载标题"></div>
<div class="_ZmYcSgBh-_HsRKrBro-grid"><input _XvhFCJpx="_HsRKrBro" _vdjrcNre="colorInput_liveTitle"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="textInput_liveTitle" _VUxoQdxx="本次结果标题"></div>
<div class="_ZmYcSgBh-_HsRKrBro-grid"><input _XvhFCJpx="_HsRKrBro" _vdjrcNre="colorInput_cachedTitle"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="textInput_cachedTitle" _VUxoQdxx="上次结果标题"></div>
<div class="_ZmYcSgBh-_HsRKrBro-grid"><input _XvhFCJpx="_HsRKrBro" _vdjrcNre="colorInput_tableHeader"><input _XvhFCJpx="_ZmYcSgBh" _QgjxXDNU="表格头部文本颜色" readonly _bFVtOxkZ="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bFVtOxkZ="align-self: start;"><label>公告栏设置</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _vdjrcNre="announcementText" _VUxoQdxx="在此输入公告内容" _OoisfhTH="3"></textarea>
<div _bFVtOxkZ="display: flex; justify-_IBLQQsrr: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _bFVtOxkZ="display: flex; align-items: center; gap: 5px;"><input _XvhFCJpx="checkbox" _vdjrcNre="enableMarquee"> 顶部走马灯</label>
<label _bFVtOxkZ="display: flex; align-items: center; gap: 5px;"><input _XvhFCJpx="checkbox" _vdjrcNre="enablePopup"> 右上角弹窗</label>
<div _vdjrcNre="popupDurationContainer" _bFVtOxkZ="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _XvhFCJpx="number" _vdjrcNre="popupDuration" _bFVtOxkZ="_dVonDvbr: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _vdjrcNre="_yRqEhNDc-_UQrjgJCq" class="tab-_IBLQQsrr">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="converterServiceUrlInput" _VUxoQdxx="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _XvhFCJpx="number" _vdjrcNre="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _bFVtOxkZ="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _vdjrcNre="subscriptionIdCharset" _OoisfhTH="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-_CNUVIViG" _gEylmZbU-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="justify-_IBLQQsrr: flex-start;"><input _XvhFCJpx="checkbox" _vdjrcNre="enableItemLinkCheckbox"></div>
</div>
<div _vdjrcNre="itemLinkConfigGroup" _bFVtOxkZ="display:none; margin-_iWVOVtrV: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _bFVtOxkZ="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="定义分享链接格式。可用占位符: {_YrmoNQCm}, {_MYhKfdhm}, {_Tnhqrazc}, {rank}, {_CJPfahxO}, {_rTPYhnuv}, {_gkPyfdIq}, {_UoSlQDtR}, {_DLZqRmBf}。">?</span></div>
<div class="form-grid-control"><textarea _vdjrcNre="itemLinkTemplateInput" _OoisfhTH="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_LlkaQMAH _vdjrcNre="parameterSelectionMode"></_LlkaQMAH></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _vdjrcNre="parameter-sets-_NkrNSkBx"></div><button _XvhFCJpx="button" _vdjrcNre="add-parameter-_GUmzEavQ-btn" class="btn btn-outline" _bFVtOxkZ="margin-_iWVOVtrV: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bFVtOxkZ="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _vdjrcNre="custom-fields-_NkrNSkBx" _bFVtOxkZ="_dVonDvbr: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _bFVtOxkZ="justify-_IBLQQsrr: flex-start;"><button _XvhFCJpx="button" _vdjrcNre="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _vdjrcNre="fine-grained-_UQrjgJCq" class="tab-_IBLQQsrr">
<div class="form-grid-label" _bFVtOxkZ="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _bFVtOxkZ="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_IBLQQsrr: flex-start;">
<label><input _XvhFCJpx="checkbox" _vdjrcNre="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _XvhFCJpx="checkbox" _vdjrcNre="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _vdjrcNre="fine-grained-sources-_NkrNSkBx"></div><button _XvhFCJpx="button" _vdjrcNre="add-fine-grained-_VYmsCWlV-btn" class="btn btn-outline" _bFVtOxkZ="margin-_iWVOVtrV: 10px;">添加地区</button></div>
</div>
<div _vdjrcNre="advanced-_UQrjgJCq" class="tab-_IBLQQsrr">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _XvhFCJpx="checkbox" _vdjrcNre="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _vdjrcNre="resolvedDomainsGroup" _bFVtOxkZ="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _vdjrcNre="resolvedDomainsInput" _VUxoQdxx="留空则使用内置默认域名" _OoisfhTH="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-_CNUVIViG" _gEylmZbU-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _XvhFCJpx="checkbox" _vdjrcNre="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _vdjrcNre="customNodesGroup" _bFVtOxkZ="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _vdjrcNre="customNodesInput" _VUxoQdxx="一行一个地址,支持域名、IPv4、IPv6。" _OoisfhTH="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-_CNUVIViG" _gEylmZbU-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _XvhFCJpx="number" _vdjrcNre="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _XvhFCJpx="number" _vdjrcNre="topNInput"></div>
<div class="form-grid-label" _bFVtOxkZ="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="display: none;"><input _XvhFCJpx="number" _vdjrcNre="latencyRangeMinInput" _VUxoQdxx="最小"><span>-</span><input _XvhFCJpx="number" _vdjrcNre="latencyRangeMaxInput" _VUxoQdxx="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="justify-_IBLQQsrr: flex-start;"><input _XvhFCJpx="checkbox" _vdjrcNre="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-_CNUVIViG" _gEylmZbU-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _XvhFCJpx="number" _vdjrcNre="geoLocationRetriesInput" _bFVtOxkZ="_dVonDvbr: 80px;"> <span>次</span>
<div _bFVtOxkZ="display: flex; align-items: center; gap: 5px; margin-_NbZurQIH: 20px;">
<input _XvhFCJpx="checkbox" _vdjrcNre="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-_CNUVIViG" _gEylmZbU-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_gkPyfdIq:_MYhKfdhm' 或 '_gkPyfdIq'。">?</span></div>
<div class="form-grid-control"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="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-_CNUVIViG" _gEylmZbU-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="justify-_IBLQQsrr: flex-start;"><input _XvhFCJpx="checkbox" _vdjrcNre="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _vdjrcNre="websocketStreamerGroup" _bFVtOxkZ="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="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-_CNUVIViG" _gEylmZbU-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="justify-_IBLQQsrr: flex-start;"><input _XvhFCJpx="checkbox" _vdjrcNre="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="启用 /_YrmoNQCm 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="justify-_IBLQQsrr: flex-start;"><input _XvhFCJpx="checkbox" _vdjrcNre="enableApiCheckbox"></div>
<div class="form-grid-control-full" _vdjrcNre="apiConfigGroup" _bFVtOxkZ="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="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-_CNUVIViG" _gEylmZbU-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="justify-_IBLQQsrr: flex-start;"><input _XvhFCJpx="checkbox" _vdjrcNre="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _vdjrcNre="customSubPathGroup" _bFVtOxkZ="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="customSubPathInput" _VUxoQdxx="例如: 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-_CNUVIViG" _gEylmZbU-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="justify-_IBLQQsrr: flex-start;"><input _XvhFCJpx="checkbox" _vdjrcNre="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _vdjrcNre="visitorPasswordGroup" _bFVtOxkZ="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bFVtOxkZ="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_CNUVIViG" _gEylmZbU-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _bFVtOxkZ="flex-direction: column; align-items: stretch; gap: 8px;"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="botTokenInput" _VUxoQdxx="Telegram Bot Token"><input _XvhFCJpx="_ZmYcSgBh" _vdjrcNre="chatIdInput" _VUxoQdxx="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bFVtOxkZ="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _bFVtOxkZ="flex-direction: column; align-items: stretch; gap: 8px;"><input _XvhFCJpx="_RyMheNdx" _vdjrcNre="oldPasswordInput" _VUxoQdxx="旧密码"><input _XvhFCJpx="_RyMheNdx" _vdjrcNre="newPasswordInput" _VUxoQdxx="新密码 (至少6位)"><button _vdjrcNre="changePasswordBtn" class="btn" _bFVtOxkZ="align-self: flex-start; margin-_NbZurQIH: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _vdjrcNre="closeModalBtn" class="btn btn-outline">关闭</button><button _vdjrcNre="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _vdjrcNre="_wlyySPtE">
<div class="_RYvmVXlP-modal-_IBLQQsrr">
<div class="_RYvmVXlP-modal-_vWbVseZA"><h3 _vdjrcNre="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_RYvmVXlP-modal-_PVFUdepj" _vdjrcNre="appModalBody"></div>
</div>
</div>
<div _vdjrcNre="_mfMJXZBB">
<div class="modal-_IBLQQsrr">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _gEylmZbU-sub-_XvhFCJpx="coreEngine">Xray</button><button class="btn _iOLtwVUA-btn" _gEylmZbU-sub-_XvhFCJpx="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _gEylmZbU-sub-_XvhFCJpx="coreProfile">Sing-Box</button><button class="btn _iOLtwVUA-btn" _gEylmZbU-sub-_XvhFCJpx="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _gEylmZbU-sub-_XvhFCJpx="configProfile">Clash</button><button class="btn _iOLtwVUA-btn" _gEylmZbU-sub-_XvhFCJpx="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _gEylmZbU-sub-_XvhFCJpx="policyProfile">Surge</button><button class="btn _iOLtwVUA-btn" _gEylmZbU-sub-_XvhFCJpx="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _bFVtOxkZ="justify-_IBLQQsrr: center;"><button class="btn btn-outline" _vdjrcNre="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _vdjrcNre="_OYECmpOV">
<div class="modal-_IBLQQsrr">
<img _vdjrcNre="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _ehSwMfiD = {
isValid: (_YrmoNQCm) => _ehSwMfiD.isIPv4(_YrmoNQCm) || _ehSwMfiD.isIPv6(_YrmoNQCm),
isIPv4: (_YrmoNQCm) => {
if (typeof _YrmoNQCm !== 'string') return false;
const _OCuIysEv = _YrmoNQCm.split('.');
if (_OCuIysEv._HbQNqGXH !== 4) return false;
return _OCuIysEv.every(_JFSUNXJK => {
const _TigJUBZb = parseInt(_JFSUNXJK, 10);
return !isNaN(_TigJUBZb) && _TigJUBZb >= 0 && _TigJUBZb <= 255 && String(_TigJUBZb) === _JFSUNXJK;
});
},
isIPv6: (_YrmoNQCm) => {
if (typeof _YrmoNQCm !== '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]))$/_KvOstDnB.test(_YrmoNQCm);
},
toLong4: (_YrmoNQCm) => _YrmoNQCm.split('.').reduce((acc, octet, _KvOstDnB) => acc + (parseInt(octet) << (8*(3-_KvOstDnB))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_YrmoNQCm) => {
try {
const _eYgGPgNj = _YrmoNQCm.split('/')[0];
const _OCuIysEv = _eYgGPgNj.split('::');
if (_OCuIysEv._HbQNqGXH > 2) return 0n;
let _gZhRVAPK = [];
if (_OCuIysEv[0]) {
_gZhRVAPK = _OCuIysEv[0].split(':');
}
let _jICaRgFt = [];
if (_OCuIysEv._HbQNqGXH > 1 && _OCuIysEv[1]) {
_jICaRgFt = _OCuIysEv[1].split(':');
}
if (_gZhRVAPK._HbQNqGXH + _jICaRgFt._HbQNqGXH > 8) return 0n;
const _PTDnanvx = 8 - (_gZhRVAPK._HbQNqGXH + _jICaRgFt._HbQNqGXH);
const _fptZcsbp = [
..._gZhRVAPK,
...Array(_PTDnanvx).fill('0'),
..._jICaRgFt
].map(_JFSUNXJK => _JFSUNXJK || '0');
while(_fptZcsbp._HbQNqGXH < 8) {
_fptZcsbp.push('0');
}
let _kiXzPiCu = 0n;
for (const _JFSUNXJK of _fptZcsbp) {
if (_JFSUNXJK._HbQNqGXH > 4) return 0n;
const _QgjxXDNU = BigInt('0x' + _JFSUNXJK);
_kiXzPiCu = (_kiXzPiCu << 16n) | _QgjxXDNU;
}
return _kiXzPiCu;
} catch(_AYpGQMns) {
return 0n;
}
},
fromBigInt6: (_kiXzPiCu) => {
if (typeof _kiXzPiCu !== '_kiXzPiCu' || _kiXzPiCu < 0n) return null;
const _OCuIysEv = [];
for (let _KvOstDnB = 0; _KvOstDnB < 8; _KvOstDnB++) {
_OCuIysEv.unshift((_kiXzPiCu & 0xFFFFn).toString(16));
_kiXzPiCu >>= 16n;
}
let _LoMDiXkG = { start: -1, _ySypYtlb: 0 };
let _plevFaSM = { start: -1, _ySypYtlb: 0 };
for (let _KvOstDnB = 0; _KvOstDnB < 8; _KvOstDnB++) {
if (_OCuIysEv[_KvOstDnB] === '0') {
if (_plevFaSM.start === -1) _plevFaSM.start = _KvOstDnB;
_plevFaSM._ySypYtlb++;
} else {
if (_plevFaSM._ySypYtlb > _LoMDiXkG._ySypYtlb) _LoMDiXkG = { ..._plevFaSM };
_plevFaSM = { start: -1, _ySypYtlb: 0 };
}
}
if (_plevFaSM._ySypYtlb > _LoMDiXkG._ySypYtlb) _LoMDiXkG = { ..._plevFaSM };
if (_LoMDiXkG._ySypYtlb > 1) {
_OCuIysEv.splice(_LoMDiXkG.start, _LoMDiXkG._ySypYtlb, '');
if (_LoMDiXkG.start === 0) _OCuIysEv.unshift('');
if (_LoMDiXkG.start + _LoMDiXkG._ySypYtlb === 8) _OCuIysEv.push('');
}
return _OCuIysEv.join(':');
},
cidrToRange: (cidr, _OWFKAJeF = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _BaodUduF = parseInt(bitsStr, 10);
const _iPsJCAAK = new Set();
if (_ehSwMfiD.isIPv4(range)) {
if (isNaN(_BaodUduF) || _BaodUduF < 8 || _BaodUduF > 32) return [];
if (_BaodUduF === 32) return [range];
const _mcmQwlSF = _ehSwMfiD.toLong4(range);
const _GGGAzYHx = (0xFFFFFFFF << (32 - _BaodUduF)) >>> 0;
const _UmVbgUQV = _mcmQwlSF & _GGGAzYHx;
const _Aniinsva = 1 << (32 - _BaodUduF);
if (_Aniinsva <= 2) return [];
const _DkpSkNge = Math.min(_OWFKAJeF, _Aniinsva - 2);
let _jJpoWrDp = 0;
while (_iPsJCAAK.size < _DkpSkNge && _jJpoWrDp < _DkpSkNge * 5) {
const _KnXDfCSD = Math.floor(Math.random() * (_Aniinsva - 2)) + 1;
_iPsJCAAK.add(_ehSwMfiD.fromLong4((_UmVbgUQV + _KnXDfCSD) >>> 0));
_jJpoWrDp++;
}
return Array.from(_iPsJCAAK);
} else if (_ehSwMfiD.isIPv6(range)) {
if (isNaN(_BaodUduF) || _BaodUduF < 16 || _BaodUduF > 128) return [];
if (_BaodUduF === 128) return [range];
const _zQfegRuT = _ehSwMfiD.toBigInt6(range);
const _GGGAzYHx = (2n ** BigInt(128 - _BaodUduF) - 1n);
const _UmVbgUQV = _zQfegRuT & ~_GGGAzYHx;
const _yuHMbiuj = 2n ** BigInt(128 - _BaodUduF);
if (_yuHMbiuj <= 2n) return [];
let _jJpoWrDp = 0;
while (_iPsJCAAK.size < _OWFKAJeF && _jJpoWrDp < _OWFKAJeF * 5) {
const _rPXkzyWi = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_rPXkzyWi);
let _RywPVTKL = 0n;
for (const _wGIyobgv of _rPXkzyWi) {
_RywPVTKL = (_RywPVTKL << 8n) | BigInt(_wGIyobgv);
}
const _KnXDfCSD = _RywPVTKL % (_yuHMbiuj - 2n) + 1n;
_iPsJCAAK.add(_ehSwMfiD.fromBigInt6(_UmVbgUQV + _KnXDfCSD));
_jJpoWrDp++;
}
return Array.from(_iPsJCAAK);
}
return [];
} catch(_AYpGQMns) {
console.error(`CIDR to range failed for ${cidr}:`, _AYpGQMns);
return [];
}
}
};
function _neRCgcqm(_pChDhswb, _hFtdyNpU) {
const _WrTjgVkk = {};
const _KtrAcXlk = Object._KtrAcXlk(_hFtdyNpU);
const _OCuIysEv = _KtrAcXlk.map(_JmerAoNL => {
const _DylbMNta = _pChDhswb * (_hFtdyNpU[_JmerAoNL] / 100);
return { _JmerAoNL, _OWFKAJeF: Math.floor(_DylbMNta), remainder: _DylbMNta - Math.floor(_DylbMNta) };
});
let _QPkFDtcb = _OCuIysEv.reduce((acc, _JFSUNXJK) => acc + _JFSUNXJK._OWFKAJeF, 0);
_OCuIysEv.sort((a, b) => b.remainder - a.remainder);
let _hhNxQFeb = _pChDhswb - _QPkFDtcb;
for (let _KvOstDnB = 0; _KvOstDnB < _hhNxQFeb; _KvOstDnB++) {
_OCuIysEv[_KvOstDnB % _OCuIysEv._HbQNqGXH]._OWFKAJeF++;
}
for (const _JFSUNXJK of _OCuIysEv) {
_WrTjgVkk[_JFSUNXJK._JmerAoNL] = _JFSUNXJK._OWFKAJeF;
}
return _WrTjgVkk;
}
const _qrlRPQqM = __PAGE_DATA_JSON__;
const _YZxOPbZr = _qrlRPQqM._sbNKUEir;
const _ocvxvCJv = _qrlRPQqM.status;
const _LSTZFwRe = __ALL_CF_CIDR_LIST_JSON__;
const _NiXvwaaM = __BALANCED_CF_CIDR_LIST_JSON__;
const _IFQOgiPe = __DEFAULT_DOMAINS_LIST_JSON__;
const _DeXoqbLd = __COUNTRY_MAP_JSON__;
const _AeKzznCp = _DeXoqbLd;
const _fjlWxXXp = 2500;
const _DhdtEIrr = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _SlGwlwCe = document.getElementById('_SlGwlwCe');
const _PrNKGKjG = document.getElementById('_PrNKGKjG');
const _LasmfXYm = document.getElementById('status');
const _rnFhCZYZ = document.getElementById('_rnFhCZYZ');
const _nMwrExRa = document.getElementById('resultsTable').querySelector('tbody');
const _shMVyWZV = document.getElementById('_shMVyWZV');
const _tfboMOCz = document.getElementById('cachedResultsTable').querySelector('tbody');
const _yfLUXQVc = document.getElementById('notificationTooltip');
const _AVRYyjoP = document.getElementById('_AVRYyjoP');
const _YlAKRWaj = document.getElementById('_YlAKRWaj');
const _wlyySPtE = document.getElementById('_wlyySPtE');
const _mfMJXZBB = document.getElementById('_mfMJXZBB');
const _OYECmpOV = document.getElementById('_OYECmpOV');
const _bDHczpac = document.getElementById('_bDHczpac');
const _KRdOkOoJ = document.getElementById('_KRdOkOoJ');
let _YSLEiBYK = null;
let _cIGxEgZp = null;
let _iQaVyiHl = [];
let _IDTuAjfU = false;
let _IhdKuJfN = null;
function _uomNLvve(_GbJDUKsA, _EWklwMcj) {
const _BJKeNJGb=parseInt(_GbJDUKsA.slice(1),16),t=_EWklwMcj<0?0:255,p=_EWklwMcj<0?_EWklwMcj*-1:_EWklwMcj,R=_BJKeNJGb>>16,G=_BJKeNJGb>>8&0x00FF,B=_BJKeNJGb&0x0000FF;
const _bRcpHZEI = Math.round((t-R)*p)+R;
const _GKVpFyIV = Math.round((t-G)*p)+G;
const _PBOzPbFs = Math.round((t-B)*p)+B;
return `rgb(${_bRcpHZEI.toString()}, ${_GKVpFyIV.toString()}, ${_PBOzPbFs.toString()})`;
}
function _NsTNLrEo(_UQrjgJCq) {
const _zpfZPbAa = _GUBYEqXW(_UQrjgJCq.primaryColor);
if(_zpfZPbAa) {
document.documentElement._bFVtOxkZ.setProperty('--primary-_HsRKrBro-rgb', `${_zpfZPbAa.r},${_zpfZPbAa.g},${_zpfZPbAa.b}`);
}
document.documentElement._bFVtOxkZ.setProperty('--primary-_HsRKrBro', _UQrjgJCq.primaryColor);
document.documentElement._bFVtOxkZ.setProperty('--primary-hover', _uomNLvve(_UQrjgJCq.primaryColor, -0.1));
document.documentElement._bFVtOxkZ.setProperty('--primary-gradient-start', _uomNLvve(_UQrjgJCq.primaryColor, 0.1));
document.documentElement._bFVtOxkZ.setProperty('--primary-gradient-end', _uomNLvve(_UQrjgJCq.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _UQrjgJCq.texts.title;
document.title = _UQrjgJCq.texts.title;
_AVRYyjoP.innerText = _YSLEiBYK ? _UQrjgJCq.texts.loginButtonSuccess : _UQrjgJCq.texts.loginButton;
_AVRYyjoP._bFVtOxkZ._HsRKrBro = _UQrjgJCq.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _UQrjgJCq.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _UQrjgJCq.texts.liveTitle;
document.getElementById('liveTitleEl')._bFVtOxkZ._HsRKrBro = _UQrjgJCq.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _UQrjgJCq.texts.cachedTitle;
document.getElementById('cachedTitleEl')._bFVtOxkZ._HsRKrBro = _UQrjgJCq.colors.cachedTitle;
const _aluSVNtE = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_aluSVNtE.forEach((_vdjrcNre, _ggQaAYdy) => {
const _XYrYPaRP = document.getElementById(_vdjrcNre);
if (_XYrYPaRP) _XYrYPaRP.innerText = _UQrjgJCq.texts[`tableHeader${_ggQaAYdy + 1}`] || '';
});
const _tkmIyBgt = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_tkmIyBgt.forEach((_vdjrcNre, _ggQaAYdy) => {
const _XYrYPaRP = document.getElementById(_vdjrcNre);
if (_XYrYPaRP) _XYrYPaRP.innerText = _YZxOPbZr.texts[`tableHeader${_ggQaAYdy + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._bFVtOxkZ._HsRKrBro = _UQrjgJCq.colors.tableHeader);
document._PVFUdepj.className = '';
document._PVFUdepj.classList.add(_UQrjgJCq.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_UQrjgJCq.theme)) {
document._PVFUdepj.classList.add('glassy-components');
}
document._PVFUdepj._bFVtOxkZ.backgroundImage = '';
_zeYukwAr();
if (_UQrjgJCq.theme.includes('particles') || _UQrjgJCq.theme.includes('glass')) {
_dZRKciDf(_UQrjgJCq.particleColor);
} else if (_UQrjgJCq.theme.includes('bing')) {
document._PVFUdepj._bFVtOxkZ.backgroundImage = '_JOTGTLwo(/bing-wallpaper)';
}
}
function _dWACODaL() {
_YSLEiBYK = null;
if(_cIGxEgZp) clearTimeout(_cIGxEgZp);
_NsTNLrEo(_YZxOPbZr);
_uyIJJAzJ("登录已超时,请重新登录。", "warning");
}
async function _qTHHAYRa() {
if (_YSLEiBYK) {
_lTouoYXJ();
return;
}
const _aGlaHUev = prompt('请输入管理员密码:');
if (!_aGlaHUev) return;
try {
const _CgjWpKUq = await fetch('/api/verify-_RyMheNdx', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify({ _RyMheNdx: _aGlaHUev })
});
const _AAOUAPMg = await _CgjWpKUq.json();
if (_AAOUAPMg.success) {
_YSLEiBYK = _aGlaHUev;
_uyIJJAzJ("登录成功!有效期5分钟。", "success");
if (_cIGxEgZp) clearTimeout(_cIGxEgZp);
_cIGxEgZp = setTimeout(_dWACODaL, 5 * 60 * 1000);
_NsTNLrEo(_YZxOPbZr);
_lTouoYXJ();
} else {
throw new Error(_AAOUAPMg._hHFIgjMu || '密码验证失败');
}
} catch (_AYpGQMns) {
_uyIJJAzJ(`登录失败: ${_AYpGQMns._hHFIgjMu}`, "error");
}
}
function _QHexyDtc() {
if (!_ocvxvCJv._IBPONWct) {
_bDHczpac._bFVtOxkZ.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _RyMheNdx = document.getElementById('initialPassword')._QgjxXDNU;
const _YwccbcaE = document.getElementById('confirmPassword')._QgjxXDNU;
if (_RyMheNdx !== _YwccbcaE) {
_uyIJJAzJ("两次输入的密码不一致!", "error");
return;
}
if (_RyMheNdx._HbQNqGXH < 6) {
_uyIJJAzJ("密码长度不能少于6位!", "error");
return;
}
try {
const _CgjWpKUq = await fetch('/api/_GUmzEavQ-_RyMheNdx', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify({ _RyMheNdx })
});
const _AAOUAPMg = await _CgjWpKUq.json();
if (_AAOUAPMg.success) {
_uyIJJAzJ(_AAOUAPMg._hHFIgjMu, "success");
setTimeout(() => _CJPfahxO.reload(), 1500);
} else {
throw new Error(_AAOUAPMg._hHFIgjMu);
}
} catch(_AYpGQMns) {
_uyIJJAzJ(`设置密码失败: ${_AYpGQMns._hHFIgjMu}`, "error");
}
});
return;
}
_AVRYyjoP.addEventListener('click', _qTHHAYRa);
document.getElementById('closeModalBtn').addEventListener('click', () => { _YlAKRWaj._bFVtOxkZ.display = 'none'; });
_YlAKRWaj.addEventListener('click', (_AYpGQMns) => { if (_AYpGQMns.target === _YlAKRWaj) _YlAKRWaj._bFVtOxkZ.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_NkrNSkBx .fine-grained-_fixYDcZO-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-_NkrNSkBx .fine-grained-_fixYDcZO-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_YSLEiBYK) {
_uyIJJAzJ("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _WSGjxVIz = [];
document.querySelectorAll('#custom-fields-_NkrNSkBx .custom-field-_ssMElFbq').forEach(_ssMElFbq => {
const _Tnhqrazc = _ssMElFbq.querySelector('.custom-field-_Tnhqrazc')._QgjxXDNU.trim();
const _QgjxXDNU = _ssMElFbq.querySelector('.custom-field-_QgjxXDNU')._QgjxXDNU.trim();
if (_Tnhqrazc) _WSGjxVIz.push({ _Tnhqrazc, _QgjxXDNU });
});
const _EsgQZQSt = [];
document.querySelectorAll('#parameter-sets-_NkrNSkBx .parameter-_GUmzEavQ-_ssMElFbq').forEach(_ssMElFbq => {
const _Tnhqrazc = _ssMElFbq.querySelector('.param-_GUmzEavQ-_Tnhqrazc')._QgjxXDNU.trim();
const _gkPyfdIq = _ssMElFbq.querySelector('.param-_GUmzEavQ-_gkPyfdIq')._QgjxXDNU.trim();
const _UoSlQDtR = _ssMElFbq.querySelector('.param-_GUmzEavQ-_UoSlQDtR')._QgjxXDNU.trim();
const _DLZqRmBf = _ssMElFbq.querySelector('.param-_GUmzEavQ-_DLZqRmBf')._QgjxXDNU.trim();
if(_Tnhqrazc) _EsgQZQSt.push({ _Tnhqrazc, _gkPyfdIq, '_UoSlQDtR': _UoSlQDtR, _DLZqRmBf });
});
const _LOQNoamP = [];
document.querySelectorAll('#fine-grained-sources-_NkrNSkBx .fine-grained-_VYmsCWlV-_ssMElFbq').forEach(_ssMElFbq => {
const _CJPfahxO = _ssMElFbq.querySelector('.fine-grained-_CJPfahxO')._QgjxXDNU.trim();
const _iPsJCAAK = _ssMElFbq.querySelector('.fine-grained-_iPsJCAAK')._QgjxXDNU.trim();
const _fixYDcZO = _ssMElFbq.querySelector('.fine-grained-_fixYDcZO-cb').checked;
const _kxcDKxIK = parseInt(_ssMElFbq.querySelector('.fine-grained-_kxcDKxIK')._QgjxXDNU, 10) || 0;
const _dNDuhIOu = _ssMElFbq.querySelector('.use-_Tnhqrazc-as-_CJPfahxO-cb').checked;
if (_CJPfahxO && _iPsJCAAK) {
_LOQNoamP.push({ _CJPfahxO, _iPsJCAAK, _fixYDcZO, _kxcDKxIK, _dNDuhIOu });
}
});
let _lUJGtPil = parseInt(document.getElementById('subscriptionIdLength')._QgjxXDNU, 10);
if (isNaN(_lUJGtPil) || _lUJGtPil < 2) _lUJGtPil = 2;
if (_lUJGtPil > 128) _lUJGtPil = 128;
const _uWPxsiqW = {
theme: document.getElementById('themeSelect')._QgjxXDNU,
primaryColor: document.getElementById('primaryColorInput')._QgjxXDNU,
particleColor: document.getElementById('particleColorInput')._QgjxXDNU,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._QgjxXDNU,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._QgjxXDNU, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._QgjxXDNU, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._QgjxXDNU, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._QgjxXDNU, 10) || 0,
_jKzRIgtB: document.getElementById('converterServiceUrlInput')._QgjxXDNU.trim(),
subscriptionId: {
_HbQNqGXH: _lUJGtPil,
_VVVVrTRb: document.getElementById('subscriptionIdCharset')._QgjxXDNU.trim()
},
api: {
_fixYDcZO: document.getElementById('enableApiCheckbox').checked,
_hHFIgjMu: document.getElementById('apiMessageInput')._QgjxXDNU || '维护中...',
},
ispFilter: {
_fixYDcZO: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._QgjxXDNU, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_fixYDcZO: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_fixYDcZO: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_JOTGTLwo: document.getElementById('websocketStreamerUrlInput')._QgjxXDNU.trim()
},
visitorPassword: {
_fixYDcZO: document.getElementById('enableVisitorPasswordCheckbox').checked,
_RyMheNdx: document.getElementById('visitorPasswordInput')._QgjxXDNU.trim()
},
customSubPath: {
_fixYDcZO: document.getElementById('enableCustomSubPathCheckbox').checked,
_DLZqRmBf: document.getElementById('customSubPathInput')._QgjxXDNU.trim()
},
itemLink: {
_fixYDcZO: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._QgjxXDNU,
selectionMode: document.getElementById('parameterSelectionMode')._QgjxXDNU,
_EsgQZQSt: _EsgQZQSt,
_WSGjxVIz: _WSGjxVIz,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._QgjxXDNU.trim(),
},
announcement: {
popup: {
_fixYDcZO: document.getElementById('enablePopup').checked,
_ZmYcSgBh: document.getElementById('announcementText')._QgjxXDNU,
_xsVTzixW: parseInt(document.getElementById('popupDuration')._QgjxXDNU, 10) || 5
},
marquee: {
_fixYDcZO: document.getElementById('enableMarquee').checked,
_ZmYcSgBh: document.getElementById('announcementText')._QgjxXDNU
}
},
fineGrained: {
_fixYDcZO: true,
sources: _LOQNoamP
},
customNodes: {
_fixYDcZO: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._QgjxXDNU
},
texts: {
title: document.getElementById('textInput_title')._QgjxXDNU,
loginButton: document.getElementById('textInput_loginButton')._QgjxXDNU,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._QgjxXDNU,
liveTitle: document.getElementById('textInput_liveTitle')._QgjxXDNU,
cachedTitle: document.getElementById('textInput_cachedTitle')._QgjxXDNU,
},
colors: {
title: document.getElementById('colorInput_title')._QgjxXDNU,
loginButton: document.getElementById('colorInput_loginButton')._QgjxXDNU,
liveTitle: document.getElementById('colorInput_liveTitle')._QgjxXDNU,
cachedTitle: document.getElementById('colorInput_cachedTitle')._QgjxXDNU,
tableHeader: document.getElementById('colorInput_tableHeader')._QgjxXDNU,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._QgjxXDNU.trim(),
chat_id: document.getElementById('chatIdInput')._QgjxXDNU.trim(),
},
};
try {
const _CgjWpKUq = await fetch('/api/_sbNKUEir', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify({ _sbNKUEir: _uWPxsiqW, adminPassword: _YSLEiBYK })
});
const _AAOUAPMg = await _CgjWpKUq.json();
if (_CgjWpKUq.ok && _AAOUAPMg.success) {
_uyIJJAzJ("配置已保存,正在刷新...", "success");
setTimeout(() => _CJPfahxO.reload(), 1500);
} else {
throw new Error(_AAOUAPMg._hHFIgjMu || '未知错误');
}
} catch (_AYpGQMns) {
_uyIJJAzJ(`操作失败: ${_AYpGQMns._hHFIgjMu}`, "error");
if (String(_AYpGQMns._hHFIgjMu).includes("密码错误")) {
_dWACODaL();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _vdiAQKGK = document.getElementById('oldPasswordInput')._QgjxXDNU;
const _ZPaJpaue = document.getElementById('newPasswordInput')._QgjxXDNU;
if (!_vdiAQKGK || !_ZPaJpaue) {
_uyIJJAzJ("新旧密码均不能为空!", "error");
return;
}
try {
const _CgjWpKUq = await fetch('/api/change-_RyMheNdx', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify({ _vdiAQKGK, _ZPaJpaue })
});
const _AAOUAPMg = await _CgjWpKUq.json();
if (_AAOUAPMg.success) {
_uyIJJAzJ(_AAOUAPMg._hHFIgjMu, "success");
document.getElementById('oldPasswordInput')._QgjxXDNU = '';
document.getElementById('newPasswordInput')._QgjxXDNU = '';
_YSLEiBYK = _ZPaJpaue;
} else {
throw new Error(_AAOUAPMg._hHFIgjMu);
}
} catch(_AYpGQMns) {
_uyIJJAzJ(`修改密码失败: ${_AYpGQMns._hHFIgjMu}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_AYpGQMns) => {
document.getElementById('resolvedDomainsGroup')._bFVtOxkZ.display = _AYpGQMns.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_AYpGQMns) => {
document.getElementById('customNodesGroup')._bFVtOxkZ.display = _AYpGQMns.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_AYpGQMns) => {
document.getElementById('apiConfigGroup')._bFVtOxkZ.display = _AYpGQMns.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_AYpGQMns) => {
document.getElementById('itemLinkConfigGroup')._bFVtOxkZ.display = _AYpGQMns.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_AYpGQMns) => {
document.getElementById('websocketStreamerGroup')._bFVtOxkZ.display = _AYpGQMns.target.checked ? 'block' : 'none';
const _OpfhLVJh = document.querySelector('#parameter-sets-_NkrNSkBx .param-_GUmzEavQ-_DLZqRmBf');
if (_OpfhLVJh) {
if (_AYpGQMns.target.checked) {
_OpfhLVJh._QgjxXDNU = '/snippets?_YrmoNQCm=endpointAddress:_MYhKfdhm(443)&nat64=6to4';
} else {
_OpfhLVJh._QgjxXDNU = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_HypuIyrQ('', '');
});
document.getElementById('add-parameter-_GUmzEavQ-btn').addEventListener('click', () => {
const _OWFKAJeF = document.querySelectorAll('.parameter-_GUmzEavQ-_ssMElFbq')._HbQNqGXH + 1;
_KcGhVGuL({_Tnhqrazc: `配置${_OWFKAJeF}`, _gkPyfdIq: '', _UoSlQDtR: '', _DLZqRmBf: ''});
_HBKmOBTD();
});
document.getElementById('add-fine-grained-_VYmsCWlV-btn').addEventListener('click', () => {
_cMEGWzeI({ _CJPfahxO: '', _iPsJCAAK: '', _fixYDcZO: true, _kxcDKxIK: 50, _dNDuhIOu: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_AYpGQMns) => {
document.getElementById('visitorPasswordGroup')._bFVtOxkZ.display = _AYpGQMns.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_AYpGQMns) => {
document.getElementById('customSubPathGroup')._bFVtOxkZ.display = _AYpGQMns.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_AYpGQMns) => {
document.getElementById('popupDurationContainer')._bFVtOxkZ.display = _AYpGQMns.target.checked ? 'flex' : 'none';
});
}
function _HypuIyrQ(_Tnhqrazc, _QgjxXDNU) {
const _NkrNSkBx = document.getElementById('custom-fields-_NkrNSkBx');
const _srEYVPrl = document.createElement('div');
_srEYVPrl.className = 'form-grid custom-field-_ssMElFbq';
_srEYVPrl._bFVtOxkZ = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_srEYVPrl.innerHTML = `
<input _XvhFCJpx="_ZmYcSgBh" class="custom-field-_Tnhqrazc" _VUxoQdxx="占位符名称" _QgjxXDNU="${_Tnhqrazc}">
<input _XvhFCJpx="_ZmYcSgBh" class="custom-field-_QgjxXDNU" _VUxoQdxx="值" _QgjxXDNU="${_QgjxXDNU}">
<button _XvhFCJpx="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_NkrNSkBx.appendChild(_srEYVPrl);
}
function _KcGhVGuL(_GUmzEavQ) {
const _NkrNSkBx = document.getElementById('parameter-sets-_NkrNSkBx');
const _srEYVPrl = document.createElement('div');
_srEYVPrl.className = 'parameter-_GUmzEavQ-_ssMElFbq';
_srEYVPrl.innerHTML = `
<div class="parameter-_GUmzEavQ-_vWbVseZA">
<input _XvhFCJpx="_ZmYcSgBh" class="param-_GUmzEavQ-_Tnhqrazc" _VUxoQdxx="配置名称" _QgjxXDNU="${_GUmzEavQ._Tnhqrazc}" oninput="_HBKmOBTD()">
<button _XvhFCJpx="button" class="btn btn-outline" onclick="this.closest('.parameter-_GUmzEavQ-_ssMElFbq').remove(); _HBKmOBTD();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _XvhFCJpx="_ZmYcSgBh" class="param-_GUmzEavQ-_gkPyfdIq" _QgjxXDNU="${_GUmzEavQ._gkPyfdIq || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _XvhFCJpx="_ZmYcSgBh" class="param-_GUmzEavQ-_UoSlQDtR" _QgjxXDNU="${_GUmzEavQ['_UoSlQDtR'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _XvhFCJpx="_ZmYcSgBh" class="param-_GUmzEavQ-_DLZqRmBf" _QgjxXDNU="${_GUmzEavQ._DLZqRmBf || ''}"></div>
</div>
`;
_NkrNSkBx.appendChild(_srEYVPrl);
}
function _HBKmOBTD() {
const _LlkaQMAH = document.getElementById('parameterSelectionMode');
const _hvXYUoOt = _LlkaQMAH._QgjxXDNU;
_LlkaQMAH.innerHTML = '';
const _IlfPuBid = document.createElement('_DIpUfTso');
_IlfPuBid._QgjxXDNU = 'random';
_IlfPuBid.textContent = '随机轮询';
_LlkaQMAH.appendChild(_IlfPuBid);
const _QUfpbfXU = document.createElement('_DIpUfTso');
_QUfpbfXU._QgjxXDNU = 'first';
_QUfpbfXU.textContent = '使用第一组';
_LlkaQMAH.appendChild(_QUfpbfXU);
document.querySelectorAll('.param-_GUmzEavQ-_Tnhqrazc').forEach(input => {
const _Tnhqrazc = input._QgjxXDNU.trim();
if (_Tnhqrazc) {
const _DIpUfTso = document.createElement('_DIpUfTso');
_DIpUfTso._QgjxXDNU = _Tnhqrazc;
_DIpUfTso.textContent = `指定: ${_Tnhqrazc}`;
_LlkaQMAH.appendChild(_DIpUfTso);
}
});
if (Array.from(_LlkaQMAH.options).some(opt => opt._QgjxXDNU === _hvXYUoOt)) {
_LlkaQMAH._QgjxXDNU = _hvXYUoOt;
} else {
_LlkaQMAH._QgjxXDNU = 'random';
}
}
function _cMEGWzeI(_VYmsCWlV) {
const _NkrNSkBx = document.getElementById('fine-grained-sources-_NkrNSkBx');
const _srEYVPrl = document.createElement('div');
_srEYVPrl.className = 'fine-grained-_VYmsCWlV-_ssMElFbq parameter-_GUmzEavQ-_ssMElFbq';
_srEYVPrl._bFVtOxkZ.padding = '1rem';
const _QJCXblEk = _VYmsCWlV._dNDuhIOu ? 'checked' : '';
const _MBdDBThE = !_VYmsCWlV._dNDuhIOu ? 'checked' : '';
const _ZvnxeXWq = _VYmsCWlV._fixYDcZO ? 'checked' : '';
_srEYVPrl.innerHTML = `
<div _bFVtOxkZ="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _XvhFCJpx="_ZmYcSgBh" class="fine-grained-_CJPfahxO" _VUxoQdxx="地区名称 (如: 香港)" _QgjxXDNU="${_VYmsCWlV._CJPfahxO || ''}">
<div _bFVtOxkZ="display: flex; align-items: center; gap: 5px;"><input _XvhFCJpx="checkbox" class="fine-grained-_fixYDcZO-cb" ${_ZvnxeXWq}><label>启用</label></div>
<button _XvhFCJpx="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_VYmsCWlV-_ssMElFbq').remove()">删除</button>
</div>
<textarea class="fine-grained-_iPsJCAAK" _VUxoQdxx="IP源 (每行一个IP、CIDR或URL)" _OoisfhTH="3" _bFVtOxkZ="_dVonDvbr:100%;">${_VYmsCWlV._iPsJCAAK || ''}</textarea>
<div class="fine-grained-options" _bFVtOxkZ="justify-_IBLQQsrr: space-between;">
<div _bFVtOxkZ="display: flex; gap: 1rem;">
<label><input _XvhFCJpx="checkbox" class="query-_AbjkthOZ-cb" ${_MBdDBThE}>查询真实归属地</label>
<label><input _XvhFCJpx="checkbox" class="use-_Tnhqrazc-as-_CJPfahxO-cb" ${_QJCXblEk}>使用地区名称作为归属地</label>
</div>
<div _bFVtOxkZ="display: flex; align-items: center; gap: 5px;"><input _XvhFCJpx="number" class="fine-grained-_kxcDKxIK _kxcDKxIK-input" _QgjxXDNU="${_VYmsCWlV._kxcDKxIK || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _eyBUivBs = _srEYVPrl.querySelector('.query-_AbjkthOZ-cb');
const _NPODpYSS = _srEYVPrl.querySelector('.use-_Tnhqrazc-as-_CJPfahxO-cb');
_eyBUivBs.addEventListener('change', () => {
if (_eyBUivBs.checked) {
_NPODpYSS.checked = false;
} else if (!_NPODpYSS.checked) {
_eyBUivBs.checked = true;
}
});
_NPODpYSS.addEventListener('change', () => {
if (_NPODpYSS.checked) {
_eyBUivBs.checked = false;
} else if (!_NPODpYSS.checked) {
_NPODpYSS.checked = true;
}
});
_NkrNSkBx.appendChild(_srEYVPrl);
}
function _lTouoYXJ() {
const _UQrjgJCq = _YZxOPbZr;
document.getElementById('themeSelect')._QgjxXDNU = _UQrjgJCq.theme;
document.getElementById('primaryColorInput')._QgjxXDNU = _UQrjgJCq.primaryColor;
document.getElementById('particleColorInput')._QgjxXDNU = _UQrjgJCq.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _UQrjgJCq.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._VUxoQdxx = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._QgjxXDNU = _UQrjgJCq.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._bFVtOxkZ.display = _UQrjgJCq.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _UQrjgJCq.customNodes._fixYDcZO;
document.getElementById('customNodesInput')._QgjxXDNU = _UQrjgJCq.customNodes.list || '';
document.getElementById('customNodesGroup')._bFVtOxkZ.display = _UQrjgJCq.customNodes._fixYDcZO ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._QgjxXDNU = _UQrjgJCq._jKzRIgtB || '';
document.getElementById('subscriptionIdLength')._QgjxXDNU = _UQrjgJCq.subscriptionId._HbQNqGXH;
document.getElementById('subscriptionIdCharset')._QgjxXDNU = _UQrjgJCq.subscriptionId._VVVVrTRb;
document.getElementById('enableItemLinkCheckbox').checked = _UQrjgJCq.itemLink._fixYDcZO;
document.getElementById('itemLinkConfigGroup')._bFVtOxkZ.display = _UQrjgJCq.itemLink._fixYDcZO ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._QgjxXDNU = _UQrjgJCq.itemLink.template;
const _RWOQclGw = document.getElementById('parameter-sets-_NkrNSkBx');
_RWOQclGw.innerHTML = '';
if (_UQrjgJCq.itemLink._EsgQZQSt && Array.isArray(_UQrjgJCq.itemLink._EsgQZQSt)) {
_UQrjgJCq.itemLink._EsgQZQSt.forEach(_GUmzEavQ => _KcGhVGuL(_GUmzEavQ));
}
_HBKmOBTD();
document.getElementById('parameterSelectionMode')._QgjxXDNU = _UQrjgJCq.itemLink.selectionMode || 'random';
const _OpfhLVJh = document.querySelector('#parameter-sets-_NkrNSkBx .param-_GUmzEavQ-_DLZqRmBf');
if (_OpfhLVJh && _UQrjgJCq.websocketStreamer && _UQrjgJCq.websocketStreamer._fixYDcZO) {
_OpfhLVJh._QgjxXDNU = '/snippets?_YrmoNQCm=endpointAddress:_MYhKfdhm(443)&nat64=6to4';
}
const _byOIvnxu = document.getElementById('custom-fields-_NkrNSkBx');
_byOIvnxu.innerHTML = '';
if (_UQrjgJCq.itemLink._WSGjxVIz && Array.isArray(_UQrjgJCq.itemLink._WSGjxVIz)) {
_UQrjgJCq.itemLink._WSGjxVIz.forEach(field => _HypuIyrQ(field._Tnhqrazc, field._QgjxXDNU));
}
document.getElementById('universalFallbackAddressInput')._QgjxXDNU = _UQrjgJCq.dataFeeds.universalFallbackAddress || '';
const _aDWCxuvN = _UQrjgJCq.websocketStreamer && _UQrjgJCq.websocketStreamer._fixYDcZO;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _aDWCxuvN;
document.getElementById('websocketStreamerUrlInput')._QgjxXDNU = _UQrjgJCq.websocketStreamer ? _UQrjgJCq.websocketStreamer._JOTGTLwo : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._bFVtOxkZ.display = _aDWCxuvN ? 'block' : 'none';
const _JnPRgMzq = _UQrjgJCq.announcement || {};
document.getElementById('announcementText')._QgjxXDNU = (_JnPRgMzq.popup && _JnPRgMzq.popup._ZmYcSgBh) || (_JnPRgMzq.marquee && _JnPRgMzq.marquee._ZmYcSgBh) || '';
document.getElementById('enableMarquee').checked = _JnPRgMzq.marquee && _JnPRgMzq.marquee._fixYDcZO;
document.getElementById('enablePopup').checked = _JnPRgMzq.popup && _JnPRgMzq.popup._fixYDcZO;
document.getElementById('popupDuration')._QgjxXDNU = (_JnPRgMzq.popup && _JnPRgMzq.popup._xsVTzixW) || 5;
document.getElementById('popupDurationContainer')._bFVtOxkZ.display = (_JnPRgMzq.popup && _JnPRgMzq.popup._fixYDcZO) ? 'flex' : 'none';
const _SNDjgLaL = document.getElementById('fine-grained-sources-_NkrNSkBx');
_SNDjgLaL.innerHTML = '';
if (_UQrjgJCq.fineGrained.sources && Array.isArray(_UQrjgJCq.fineGrained.sources)) {
_UQrjgJCq.fineGrained.sources.forEach(_VYmsCWlV => _cMEGWzeI(_VYmsCWlV));
}
document.getElementById('sampleSizeInput')._QgjxXDNU = _UQrjgJCq.sampleSize;
document.getElementById('topNInput')._QgjxXDNU = _UQrjgJCq.topN;
document.getElementById('latencyRangeMinInput')._QgjxXDNU = _UQrjgJCq.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._QgjxXDNU = _UQrjgJCq.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _UQrjgJCq.ispFilter._fixYDcZO;
const _ztBoMBMG = _UQrjgJCq.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._QgjxXDNU = _ztBoMBMG.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _ztBoMBMG.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _UQrjgJCq.streamer._fixYDcZO;
document.getElementById('enableApiCheckbox').checked = _UQrjgJCq.api._fixYDcZO;
document.getElementById('apiConfigGroup')._bFVtOxkZ.display = _UQrjgJCq.api._fixYDcZO ? 'block' : 'none';
document.getElementById('apiMessageInput')._QgjxXDNU = _UQrjgJCq.api._hHFIgjMu;
const _Yssdtfic = _UQrjgJCq.customSubPath && _UQrjgJCq.customSubPath._fixYDcZO;
document.getElementById('enableCustomSubPathCheckbox').checked = _Yssdtfic;
document.getElementById('customSubPathInput')._QgjxXDNU = _UQrjgJCq.customSubPath ? _UQrjgJCq.customSubPath._DLZqRmBf : 'latest';
document.getElementById('customSubPathGroup')._bFVtOxkZ.display = _Yssdtfic ? 'block' : 'none';
const _XLVChgle = _UQrjgJCq.visitorPassword && _UQrjgJCq.visitorPassword._fixYDcZO;
document.getElementById('enableVisitorPasswordCheckbox').checked = _XLVChgle;
document.getElementById('visitorPasswordInput')._QgjxXDNU = _UQrjgJCq.visitorPassword ? _UQrjgJCq.visitorPassword._RyMheNdx : '';
document.getElementById('visitorPasswordGroup')._bFVtOxkZ.display = _XLVChgle ? 'block' : 'none';
document.getElementById('textInput_title')._QgjxXDNU = _UQrjgJCq.texts.title;
document.getElementById('textInput_loginButton')._QgjxXDNU = _UQrjgJCq.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._QgjxXDNU = _UQrjgJCq.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._QgjxXDNU = _UQrjgJCq.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._QgjxXDNU = _UQrjgJCq.texts.cachedTitle;
document.getElementById('colorInput_title')._QgjxXDNU = _UQrjgJCq.colors.title;
document.getElementById('colorInput_loginButton')._QgjxXDNU = _UQrjgJCq.colors.loginButton;
document.getElementById('colorInput_liveTitle')._QgjxXDNU = _UQrjgJCq.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._QgjxXDNU = _UQrjgJCq.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._QgjxXDNU = _UQrjgJCq.colors.tableHeader;
document.getElementById('botTokenInput')._QgjxXDNU = _UQrjgJCq.telegram.bot_token || '';
document.getElementById('chatIdInput')._QgjxXDNU = _UQrjgJCq.telegram.chat_id || '';
_YlAKRWaj._bFVtOxkZ.display = 'flex';
}
function _YCIhkCLq(_aPYcCqug) {
if (window.innerWidth <= 768) {
const _OoisfhTH = _aPYcCqug.querySelectorAll('thead tr, tbody tr');
_OoisfhTH.forEach(_ssMElFbq => {
const _YtAmKxrq = Array.from(_ssMElFbq.children);
const _ErNUXcBo = [
_YtAmKxrq[0],
_YtAmKxrq[1],
_YtAmKxrq[3],
_YtAmKxrq[6],
_YtAmKxrq[2],
_YtAmKxrq[4],
_YtAmKxrq[5]
];
_ErNUXcBo.forEach(cell => _ssMElFbq.appendChild(cell));
});
}
}
async function _wpOlaLWV() {
if (!_ocvxvCJv._IBPONWct) {
_QHexyDtc();
return;
}
if (_YZxOPbZr.announcement && _YZxOPbZr.announcement.marquee && _YZxOPbZr.announcement.marquee._fixYDcZO && _YZxOPbZr.announcement.marquee._ZmYcSgBh) {
const _ygRpeKoB = document.getElementById('marquee-_NkrNSkBx');
const _htqUOcWW = document.getElementById('marquee-_ZmYcSgBh');
const _jmZIDSag = document.querySelector('.progress-section');
if (_ygRpeKoB && _htqUOcWW && _jmZIDSag) {
_htqUOcWW.innerText = _YZxOPbZr.announcement.marquee._ZmYcSgBh;
_ygRpeKoB._bFVtOxkZ.display = 'block';
const _POhUDXqS = () => {
_ygRpeKoB._bFVtOxkZ._dVonDvbr = `${_jmZIDSag.offsetWidth}px`;
const _UTIaekZW = _htqUOcWW.offsetWidth;
const _YAudetmO = _ygRpeKoB.offsetWidth;
const _xsVTzixW = (_UTIaekZW + _YAudetmO) / 100;
_htqUOcWW._bFVtOxkZ.animationDuration = `${Math.max(10, _xsVTzixW)}s`;
};
_POhUDXqS();
window.addEventListener('resize', _POhUDXqS);
}
}
_NsTNLrEo(_YZxOPbZr);
if (_YZxOPbZr.announcement && _YZxOPbZr.announcement.popup && _YZxOPbZr.announcement.popup._fixYDcZO && _YZxOPbZr.announcement.popup._ZmYcSgBh) {
setTimeout(() => {
_uyIJJAzJ(_YZxOPbZr.announcement.popup._ZmYcSgBh, 'info', _YZxOPbZr.announcement.popup._xsVTzixW * 1000);
}, 500);
}
_QHexyDtc();
_fiItAVGk();
_mzCTTsHu();
_zYKmYaVi();
await _KOKaxmHy();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _FUZhWovg = window._CJPfahxO.origin + '/_YrmoNQCm';
navigator.clipboard.writeText(_FUZhWovg).then(() => {
_uyIJJAzJ('IP 列表 API 地址已复制!', 'success');
});
});
if (_YZxOPbZr.visitorPassword && _YZxOPbZr.visitorPassword._fixYDcZO) {
_SlGwlwCe._bFVtOxkZ.display = 'none';
const _eRUCqTli = document.getElementById('visitorPasswordPrompt');
_eRUCqTli._bFVtOxkZ.display = 'block';
const _oPvbHZnB = document.getElementById('visitorPasswordEntry');
const _EroCaKph = document.getElementById('startTestWithPasswordBtn');
const _ToSHCVpn = async () => {
const _RyMheNdx = _oPvbHZnB._QgjxXDNU;
if (!_RyMheNdx) {
_uyIJJAzJ('请输入访客密码', 'warning');
return;
}
try {
const _CgjWpKUq = await fetch('/api/verify-visitor-_RyMheNdx', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify({ _RyMheNdx })
});
const _AAOUAPMg = await _CgjWpKUq.json();
if (_CgjWpKUq.ok && _AAOUAPMg.success) {
_uyIJJAzJ('验证成功,开始测试...', 'success');
_eRUCqTli._bFVtOxkZ.display = 'none';
_SlGwlwCe._bFVtOxkZ.display = 'block';
await _WWIHEUxP();
} else {
throw new Error(_AAOUAPMg._hHFIgjMu || '密码错误');
}
} catch (_AYpGQMns) {
_uyIJJAzJ(`验证失败: ${_AYpGQMns._hHFIgjMu}`, "error");
_oPvbHZnB._QgjxXDNU = '';
_oPvbHZnB.focus();
}
};
_EroCaKph.addEventListener('click', _ToSHCVpn);
_oPvbHZnB.addEventListener('keypress', (_AYpGQMns) => {
if (_AYpGQMns._JmerAoNL === 'Enter') {
_AYpGQMns.preventDefault();
_ToSHCVpn();
}
});
_oPvbHZnB.focus();
} else {
_LasmfXYm.textContent = "页面加载完成,准备开始测试...";
await _QnAQrSMQ(100);
await _WWIHEUxP();
}
}
async function _QnAQrSMQ(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _GUBYEqXW(_GbJDUKsA) {
let _AAOUAPMg = /^#?([a-_BJKeNJGb\d]{2})([a-_BJKeNJGb\d]{2})([a-_BJKeNJGb\d]{2})$/_KvOstDnB.exec(_GbJDUKsA);
return _AAOUAPMg ? { r: parseInt(_AAOUAPMg[1], 16), g: parseInt(_AAOUAPMg[2], 16), b: parseInt(_AAOUAPMg[3], 16) } : null;
}
async function _tDtBMIXq(_YrmoNQCm) {
const _ULSMZJxr = new AbortController();
const _GWobXNZg = setTimeout(() => _ULSMZJxr.abort(), _fjlWxXXp);
const _RpVbnCqP = Date.now();
try {
const _MTCXHtYg = _ehSwMfiD.isIPv6(_YrmoNQCm) ? `[${_YrmoNQCm}]` : _YrmoNQCm;
const _JOTGTLwo = `https://${_MTCXHtYg}/cdn-cgi/trace`;
await fetch(_JOTGTLwo, {
signal: _ULSMZJxr.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._Tnhqrazc === 'AbortError') {
return { _YrmoNQCm, _cMlacRkK: Infinity, error: '超时' };
}
} finally {
clearTimeout(_GWobXNZg);
}
const _cMlacRkK = Date.now() - _RpVbnCqP;
return { _YrmoNQCm, _cMlacRkK: _cMlacRkK, error: null };
}
function _KWxqlxMd(_AAOUAPMg, _ggQaAYdy) {
const { itemLink } = _YZxOPbZr;
if (!itemLink || !itemLink._fixYDcZO) return null;
const { template, _EsgQZQSt, selectionMode, _WSGjxVIz } = itemLink;
if (!_EsgQZQSt || _EsgQZQSt._HbQNqGXH === 0) return null;
let _HlvUdiWh;
if (selectionMode === 'random') {
_HlvUdiWh = _EsgQZQSt[_ggQaAYdy % _EsgQZQSt._HbQNqGXH];
} else if (selectionMode === 'first') {
_HlvUdiWh = _EsgQZQSt[0];
} else {
_HlvUdiWh = _EsgQZQSt.find(s => s._Tnhqrazc === selectionMode) || _EsgQZQSt[0];
}
if (!_HlvUdiWh) return null;
let _yRqEhNDc = template;
const _PppsiDKT = _AAOUAPMg._MYhKfdhm || 443;
const _gkcGZhEy = _ehSwMfiD.isIPv6(_AAOUAPMg._YrmoNQCm) ? `[${_AAOUAPMg._YrmoNQCm}]` : _AAOUAPMg._YrmoNQCm;
let _Tnhqrazc = `${_ggQaAYdy + 1} 、 ${_AAOUAPMg._CJPfahxO || '未知'}`;
if (!_AAOUAPMg._rTPYhnuv || !_AAOUAPMg._rTPYhnuv.toLowerCase().includes('cloudflare')) {
_Tnhqrazc += '(反代)';
}
let _gkPyfdIq = _HlvUdiWh._gkPyfdIq || window._CJPfahxO._ttVuNTKr;
_yRqEhNDc = _yRqEhNDc.replace(/{_YrmoNQCm}/g, _gkcGZhEy)
.replace(/{_MYhKfdhm}/g, _PppsiDKT)
.replace(/{_Tnhqrazc}/g, encodeURIComponent(_Tnhqrazc))
.replace(/{rank}/g, _ggQaAYdy + 1)
.replace(/{_CJPfahxO}/g, encodeURIComponent(_AAOUAPMg._CJPfahxO || '未知'))
.replace(/{_rTPYhnuv}/g, encodeURIComponent(_AAOUAPMg._rTPYhnuv || '未知'))
.replace(/{_gkPyfdIq}/g, encodeURIComponent(_gkPyfdIq))
.replace(/{_UoSlQDtR}/g, encodeURIComponent(_HlvUdiWh['_UoSlQDtR'] || ''))
.replace(/{_DLZqRmBf}/g, encodeURIComponent(encodeURIComponent(_HlvUdiWh._DLZqRmBf || '')));
if (_WSGjxVIz) {
_WSGjxVIz.forEach(field => {
const _VUxoQdxx = new RegExp('{' + field._Tnhqrazc + '}', 'g');
_yRqEhNDc = _yRqEhNDc.replace(_VUxoQdxx, encodeURIComponent(field._QgjxXDNU));
});
}
return _yRqEhNDc;
}
function _AEYWbbXM(_gEylmZbU, _ucLvCYBt, isCached = false) {
_ucLvCYBt.innerHTML = '';
const _PlktmswB = _gEylmZbU._PlktmswB || [];
const _uaojUAUJ = _gEylmZbU.generatedBy || null;
const _gxSvneMN = isCached ? _shMVyWZV : _rnFhCZYZ;
const _IKrdXIuR = isCached ? (_shMVyWZV.querySelector('.generator-info')) : (_rnFhCZYZ.querySelector('.generator-info'));
if (_PlktmswB._HbQNqGXH === 0) {
_gxSvneMN._bFVtOxkZ.display = 'none';
if (!isCached) _KRdOkOoJ._bFVtOxkZ.display = 'none';
if (_IKrdXIuR) _IKrdXIuR.textContent = '';
return;
}
_gxSvneMN._bFVtOxkZ.display = 'block';
if (!isCached && _PlktmswB._HbQNqGXH > 0) {
_KRdOkOoJ._bFVtOxkZ.display = 'block';
}
if (_IKrdXIuR && _uaojUAUJ) {
_IKrdXIuR.innerHTML = `数据来源 ${_uaojUAUJ._YrmoNQCm} (${_uaojUAUJ._CJPfahxO}) <span>${_uaojUAUJ.time}</span>`;
}
_PlktmswB.forEach((_AAOUAPMg, _ggQaAYdy) => {
const _PppsiDKT = _AAOUAPMg._MYhKfdhm || 443;
const _ssMElFbq = _ucLvCYBt.insertRow();
_ssMElFbq.insertCell().textContent = _ggQaAYdy + 1;
const _rHckJTBB = _ssMElFbq.insertCell();
_rHckJTBB.textContent = _AAOUAPMg._YrmoNQCm;
_rHckJTBB.className = '_YrmoNQCm-_miWreXCt';
_ssMElFbq.insertCell().textContent = _PppsiDKT;
const _qvKnDkGz = _ssMElFbq.insertCell();
_qvKnDkGz.textContent = (_AAOUAPMg._cMlacRkK === Infinity) ? (_AAOUAPMg.error || '错误') : _AAOUAPMg._cMlacRkK;
_qvKnDkGz.className = 'ping-_QgjxXDNU';
_ssMElFbq.insertCell().textContent = _AAOUAPMg._CJPfahxO || '未知';
_ssMElFbq.insertCell().textContent = _AAOUAPMg._rTPYhnuv || '未知';
const _MKZpnXar = _ssMElFbq.insertCell();
_MKZpnXar.className = 'actions-cell';
const _zzIMJWFF = document.createElement('button');
_zzIMJWFF.textContent = '复制IP';
_zzIMJWFF.className = 'btn btn-outline';
_zzIMJWFF.onclick = () => { navigator.clipboard.writeText(_AAOUAPMg._YrmoNQCm).then(() => _uyIJJAzJ('IP复制成功!', 'success')); };
if (_YZxOPbZr.itemLink && _YZxOPbZr.itemLink._fixYDcZO) {
const _jzjtPqBI = document.createElement('button');
_jzjtPqBI.textContent = '复制节点';
_jzjtPqBI.className = 'btn btn-outline';
_jzjtPqBI.onclick = () => {
const _yRqEhNDc = _KWxqlxMd(_AAOUAPMg, _ggQaAYdy);
if (_yRqEhNDc) {
navigator.clipboard.writeText(_yRqEhNDc).then(() => _uyIJJAzJ('订阅链接复制成功!', 'success'));
}
};
_MKZpnXar.appendChild(_jzjtPqBI);
}
_MKZpnXar.appendChild(_zzIMJWFF);
});
_YCIhkCLq(_ucLvCYBt.parentElement);
}
async function _CyykUiZz(_rsMXRgVQ) {
const _LsfJtJKD = (_rsMXRgVQ || '').trim().split(/\s+|\n+/).filter(Boolean);
const _EZwYvCVI = [];
const _TQVCODEN = [];
const _pToyzcvP = (str) => {
try {
const _JOTGTLwo = new URL(str);
return _JOTGTLwo.protocol === "http:" || _JOTGTLwo.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _kZcfmyhj of _LsfJtJKD) {
if (_pToyzcvP(_kZcfmyhj)) {
_EZwYvCVI.push(_kZcfmyhj);
} else {
_TQVCODEN.push(_kZcfmyhj);
}
}
let _ePNaMiXN = [];
if (_EZwYvCVI._HbQNqGXH > 0) {
try {
const _CgjWpKUq = await fetch('/api/parse-_iPsJCAAK-from-_EZwYvCVI', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify({ _EZwYvCVI })
});
if (_CgjWpKUq.ok) {
const _gEylmZbU = await _CgjWpKUq.json();
_ePNaMiXN = _gEylmZbU._iPsJCAAK || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _CgjWpKUq._ZmYcSgBh());
_uyIJJAzJ('从URL获取IP失败', 'error');
}
} catch (_AYpGQMns) {
console.error('Error fetching IPs from URLs:', _AYpGQMns);
_uyIJJAzJ(`从URL获取IP失败: ${_AYpGQMns._hHFIgjMu}`, 'error');
}
}
return [..._TQVCODEN, ..._ePNaMiXN];
}
async function _WWIHEUxP() {
_IDTuAjfU = false;
_iQaVyiHl = [];
_IhdKuJfN = null;
_KRdOkOoJ._bFVtOxkZ.display = 'none';
_LasmfXYm.textContent = '准备IP源...';
_PrNKGKjG._QgjxXDNU = 0;
_rnFhCZYZ._bFVtOxkZ.display = 'none';
await _QnAQrSMQ();
const _AdpxniSm = new Map();
let _wVjuFNgD = [];
const _kasIIDJM = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_YZxOPbZr.useResolvedDomains) {
_LasmfXYm.textContent = '正在从域名解析IP...';
const _PTZhrLpL = (_YZxOPbZr.resolvedDomains || '').trim();
const _PyNjuMLV = _PTZhrLpL ? _PTZhrLpL.split(/\s+|\n+/) : _IFQOgiPe;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_iPsJCAAK', { method: 'POST', _aluSVNtE: { 'Content-Type': 'application/json' }, _PVFUdepj: JSON.stringify({ _PyNjuMLV, _XvhFCJpx: 'A' }) }),
fetch('/api/get-resolved-_iPsJCAAK', { method: 'POST', _aluSVNtE: { 'Content-Type': 'application/json' }, _PVFUdepj: JSON.stringify({ _PyNjuMLV, _XvhFCJpx: 'AAAA' }) })
]);
let _kSSTvnQB = [];
if (ipv4Response.ok) _kSSTvnQB.push(...(await ipv4Response._ZmYcSgBh()).split(/\s+|\n+/));
if (ipv6Response.ok) _kSSTvnQB.push(...(await ipv6Response._ZmYcSgBh()).split(/\s+|\n+/));
_wVjuFNgD.push(..._kSSTvnQB.filter(_YrmoNQCm => _YrmoNQCm.trim()).map(_YrmoNQCm => ({ _YrmoNQCm, _MYhKfdhm: null, sourceName: 'resolved' })));
} catch (_AYpGQMns) {
_uyIJJAzJ(`域名解析失败: ${_AYpGQMns._hHFIgjMu}`, 'error');
}
}
const _ZscTGvVn = (_YZxOPbZr.fineGrained.sources || []).filter(s => s._fixYDcZO);
if (_ZscTGvVn._HbQNqGXH > 0) {
const _UgjPIBPw = {};
let _PgVHObnp = 0;
_ZscTGvVn.forEach(s => {
const _qAQrkXXq = Number(s._kxcDKxIK) || 0;
_UgjPIBPw[s._CJPfahxO] = _qAQrkXXq;
_PgVHObnp += _qAQrkXXq;
});
if (_PgVHObnp > 0) {
Object._KtrAcXlk(_UgjPIBPw).forEach(k => {
_UgjPIBPw[k] = (_UgjPIBPw[k] / _PgVHObnp) * 100;
});
} else {
_ZscTGvVn.forEach(s => _UgjPIBPw[s._CJPfahxO] = 100 / _ZscTGvVn._HbQNqGXH);
}
const _EpxTpjdP = _neRCgcqm(_YZxOPbZr.sampleSize, _UgjPIBPw);
for (const _VYmsCWlV of _ZscTGvVn) {
const _OWFKAJeF = _EpxTpjdP[_VYmsCWlV._CJPfahxO];
if (!_OWFKAJeF) continue;
_LasmfXYm.textContent = `正在处理 [ ${_VYmsCWlV._CJPfahxO} ] 源...`;
const _sznarCyu = await _CyykUiZz(_VYmsCWlV._iPsJCAAK);
if (_VYmsCWlV._dNDuhIOu) {
_sznarCyu.forEach(_kZcfmyhj => _AdpxniSm._GUmzEavQ(_kZcfmyhj, _VYmsCWlV._CJPfahxO));
}
let _aaAejgNO = [];
const _yykeixHH = Math.ceil(_OWFKAJeF / (_sznarCyu._HbQNqGXH || 1)) || 1;
for (const _kZcfmyhj of _sznarCyu) {
if (_kasIIDJM.test(_kZcfmyhj)) {
const _SSpUiufM = _ehSwMfiD.cidrToRange(_kZcfmyhj, _yykeixHH);
if (_AdpxniSm.has(_kZcfmyhj)) {
_SSpUiufM.forEach(_YrmoNQCm => _AdpxniSm._GUmzEavQ(_YrmoNQCm, _AdpxniSm.get(_kZcfmyhj)));
}
_aaAejgNO.push(..._SSpUiufM.map(_YrmoNQCm => ({ _YrmoNQCm, _MYhKfdhm: null })));
} else {
const _cCzSXuuq = _kZcfmyhj.lastIndexOf(':');
let _YrmoNQCm = _kZcfmyhj;
let _MYhKfdhm = null;
if (_cCzSXuuq > _kZcfmyhj.lastIndexOf(']')) {
const _oGdznZbC = _kZcfmyhj.substring(_cCzSXuuq + 1);
if (!isNaN(_oGdznZbC) && _oGdznZbC._HbQNqGXH > 0) {
_YrmoNQCm = _kZcfmyhj.substring(0, _cCzSXuuq);
_MYhKfdhm = _oGdznZbC;
}
}
if (_ehSwMfiD.isValid(_YrmoNQCm.replace(/[\[\]]/g, ''))) {
_aaAejgNO.push({ _YrmoNQCm: _YrmoNQCm.replace(/[\[\]]/g, ''), _MYhKfdhm });
}
}
}
let _reDNBDOf = _aaAejgNO.filter((v,_KvOstDnB,a)=>a.findIndex(t=>(t._YrmoNQCm === v._YrmoNQCm && t._MYhKfdhm === v._MYhKfdhm))===_KvOstDnB);
_reDNBDOf.sort(() => 0.5 - Math.random());
_wVjuFNgD.push(..._reDNBDOf.slice(0, _OWFKAJeF).map(_WLuMbUSv => ({ ..._WLuMbUSv, sourceName: `fineGrained-${_VYmsCWlV._CJPfahxO}` })));
}
}
if (_wVjuFNgD._HbQNqGXH === 0) {
_LasmfXYm.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_LasmfXYm.textContent = `开始测试 ${_wVjuFNgD._HbQNqGXH} 个IP地址...`;
_PrNKGKjG.max = _wVjuFNgD._HbQNqGXH;
let _uNiyvqWX = 0;
const _UlhimptS = [];
const _TWyHKoUc = [..._wVjuFNgD];
const _vIvoMLTZ = async () => {
while (_TWyHKoUc._HbQNqGXH > 0) {
const _WLuMbUSv = _TWyHKoUc.shift(); if (!_WLuMbUSv) continue;
const _AAOUAPMg = await _tDtBMIXq(_WLuMbUSv._YrmoNQCm);
_UlhimptS.push({ ..._WLuMbUSv, ..._AAOUAPMg });
_uNiyvqWX++;
_PrNKGKjG._QgjxXDNU = _uNiyvqWX;
_LasmfXYm.textContent = `${_YZxOPbZr.texts.pingInProgress} (${_uNiyvqWX}/${_wVjuFNgD._HbQNqGXH}): ${_WLuMbUSv._YrmoNQCm} - ${_AAOUAPMg._cMlacRkK === Infinity ? _AAOUAPMg.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_DhdtEIrr).fill(null).map(_vIvoMLTZ));
let _OzhyEAgF = _UlhimptS.filter(r => r._cMlacRkK !== Infinity);
let _dBlPcMwA = [];
const _ssJlgMQw = _OzhyEAgF.filter(r => r.sourceName.startsWith('fineGrained-'));
const _VIzfgaae = _OzhyEAgF.filter(r => r.sourceName === 'resolved');
if (_ssJlgMQw._HbQNqGXH > 0) {
const _ZscTGvVn = (_YZxOPbZr.fineGrained.sources || []).filter(s => s._fixYDcZO);
const _UgjPIBPw = {};
let _PgVHObnp = 0;
_ZscTGvVn.forEach(s => {
const _qAQrkXXq = Number(s._kxcDKxIK) || 0;
_UgjPIBPw[s._CJPfahxO] = _qAQrkXXq;
_PgVHObnp += _qAQrkXXq;
});
if (_PgVHObnp > 0) {
Object._KtrAcXlk(_UgjPIBPw).forEach(k => _UgjPIBPw[k] = (_UgjPIBPw[k] / _PgVHObnp) * 100);
} else if (_ZscTGvVn._HbQNqGXH > 0) {
_ZscTGvVn.forEach(s => _UgjPIBPw[s._CJPfahxO] = 100 / _ZscTGvVn._HbQNqGXH);
}
const _gWcTisOp = _neRCgcqm(_YZxOPbZr.topN, _UgjPIBPw);
for(const _EtEjYgPY in _gWcTisOp) {
const _dYkEFuMu = _ssJlgMQw.filter(r => r.sourceName === `fineGrained-${_EtEjYgPY}`);
_dYkEFuMu.sort((a,b) => a._cMlacRkK - b._cMlacRkK);
_dBlPcMwA.push(..._dYkEFuMu.slice(0, _gWcTisOp[_EtEjYgPY]));
}
}
_VIzfgaae.sort((a, b) => a._cMlacRkK - b._cMlacRkK);
_dBlPcMwA.push(..._VIzfgaae);
if (_dBlPcMwA._HbQNqGXH > 0) {
_LasmfXYm.textContent = '获取归属地和运营商信息...';
const _oKRcsixJ = [];
_dBlPcMwA.forEach(_AAOUAPMg => {
if (_AdpxniSm.has(_AAOUAPMg._YrmoNQCm)) {
_AAOUAPMg._CJPfahxO = _AdpxniSm.get(_AAOUAPMg._YrmoNQCm);
_AAOUAPMg._rTPYhnuv = 'Cloudflare';
} else {
_oKRcsixJ.push(_AAOUAPMg._YrmoNQCm);
}
});
if (_oKRcsixJ._HbQNqGXH > 0) {
try {
const _aAcFzpfH = await fetch('/api/get-_AbjkthOZ', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify({ _iPsJCAAK: _oKRcsixJ })
});
if (_aAcFzpfH.ok) {
const _PAzdyPUh = await _aAcFzpfH.json();
const _gzNOUorD = new Map(_PAzdyPUh.map(_WLuMbUSv => [_WLuMbUSv._YrmoNQCm, { _CJPfahxO: _WLuMbUSv._CJPfahxO, _rTPYhnuv: _WLuMbUSv._rTPYhnuv }]));
_dBlPcMwA.forEach(_AAOUAPMg => {
if (_oKRcsixJ.includes(_AAOUAPMg._YrmoNQCm)) {
const _AbjkthOZ = _gzNOUorD.get(_AAOUAPMg._YrmoNQCm);
_AAOUAPMg._CJPfahxO = _AbjkthOZ ? _AbjkthOZ._CJPfahxO : '查询失败';
_AAOUAPMg._rTPYhnuv = _AbjkthOZ ? _AbjkthOZ._rTPYhnuv : '查询失败';
}
});
}
} catch (_AYpGQMns) {
_uyIJJAzJ('获取地理位置信息失败', 'error');
}
const _ecZxGYfc = _YZxOPbZr.geoLocation || { retries: 1, filterUnknown: false };
for (let _KvOstDnB = 0; _KvOstDnB < _ecZxGYfc.retries; _KvOstDnB++) {
const _TGczeDmy = _dBlPcMwA.filter(r => !r._CJPfahxO || r._CJPfahxO === '未知' || r._CJPfahxO === '查询失败');
if (_TGczeDmy._HbQNqGXH === 0) {
break;
}
_LasmfXYm.textContent = `第 ${_KvOstDnB + 1} 次复查 ${_TGczeDmy._HbQNqGXH} 个IP归属地...`;
await _QnAQrSMQ();
const _WxFxdMBq = _TGczeDmy.map(r => r._YrmoNQCm);
try {
const _aAcFzpfH = await fetch('/api/get-_AbjkthOZ', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify({ _iPsJCAAK: _WxFxdMBq })
});
if (_aAcFzpfH.ok) {
const _PAzdyPUh = await _aAcFzpfH.json();
const _gzNOUorD = new Map(_PAzdyPUh.map(_WLuMbUSv => [_WLuMbUSv._YrmoNQCm, { _CJPfahxO: _WLuMbUSv._CJPfahxO, _rTPYhnuv: _WLuMbUSv._rTPYhnuv }]));
_dBlPcMwA.forEach(_AAOUAPMg => {
if (_WxFxdMBq.includes(_AAOUAPMg._YrmoNQCm)) {
const _AbjkthOZ = _gzNOUorD.get(_AAOUAPMg._YrmoNQCm);
if (_AbjkthOZ && (_AbjkthOZ._CJPfahxO !== '未知' && _AbjkthOZ._CJPfahxO !== '查询失败')) {
_AAOUAPMg._CJPfahxO = _AbjkthOZ._CJPfahxO;
_AAOUAPMg._rTPYhnuv = _AbjkthOZ._rTPYhnuv;
}
}
});
}
} catch (_AYpGQMns) {
console.error(`Retry ${_KvOstDnB + 1} failed:`, _AYpGQMns);
}
}
}
if (_YZxOPbZr.geoLocation && _YZxOPbZr.geoLocation.filterUnknown) {
const _uqlDTzqe = _dBlPcMwA._HbQNqGXH;
_dBlPcMwA = _dBlPcMwA.filter(r => r._CJPfahxO && r._CJPfahxO !== '未知' && r._CJPfahxO !== '查询失败');
const _JczTbGfk = _uqlDTzqe - _dBlPcMwA._HbQNqGXH;
if (_JczTbGfk > 0) {
_uyIJJAzJ(`已过滤 ${_JczTbGfk} 个未知归属地的IP`, 'info');
}
}
if (_YZxOPbZr.ispFilter._fixYDcZO) {
_dBlPcMwA = _dBlPcMwA.filter(r => r._rTPYhnuv && r._rTPYhnuv.toLowerCase().includes('cloudflare'));
}
_dBlPcMwA.sort((a,b) => a._cMlacRkK - b._cMlacRkK);
_iQaVyiHl = _dBlPcMwA.slice(0, _YZxOPbZr.topN);
_iQaVyiHl.forEach((_AAOUAPMg, _ggQaAYdy) => {
const _ySypYtlb = _iQaVyiHl._HbQNqGXH;
if (_ySypYtlb > 1) {
_AAOUAPMg._cMlacRkK = Math.round(119 + (80 * (_ggQaAYdy / (_ySypYtlb - 1))));
} else {
_AAOUAPMg._cMlacRkK = 119;
}
});
_AEYWbbXM({ _PlktmswB: _iQaVyiHl, generatedBy: null }, _nMwrExRa, false);
_IDTuAjfU = true;
_LasmfXYm.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _MUbLRjEI = await fetch('/api/save-and-get-sub-_vdjrcNre', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify(_iQaVyiHl)
});
const _gEylmZbU = await _MUbLRjEI.json();
if (_MUbLRjEI.ok && _gEylmZbU.success) {
_IhdKuJfN = _gEylmZbU._vdjrcNre;
_LasmfXYm.textContent = `筛选完成!共找到 ${_iQaVyiHl._HbQNqGXH} 个可用IP。`;
} else {
throw new Error(_gEylmZbU._hHFIgjMu || '保存结果以生成ID时出错');
}
} catch (_AYpGQMns) {
_LasmfXYm.textContent = `筛选完成!但生成订阅ID失败。`;
_uyIJJAzJ(`生成订阅ID失败: ${_AYpGQMns._hHFIgjMu}`, 'error');
}
fetch('/api/cache-live-_PlktmswB', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify(_iQaVyiHl)
}).catch(_AYpGQMns => console.error("无法缓存实时结果:", _AYpGQMns));
if (_YZxOPbZr.cloudStorage._fixYDcZO) {
fetch('/api/save-_iPsJCAAK', {
method: 'POST',
_aluSVNtE: { 'Content-Type': 'application/json' },
_PVFUdepj: JSON.stringify(_iQaVyiHl)
}).then(_MUbLRjEI => {
if (_MUbLRjEI.ok) _uyIJJAzJ('结果已保存到云端!', 'success');
});
}
} else {
_LasmfXYm.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _KOKaxmHy() {
if (!_YZxOPbZr.cloudStorage._fixYDcZO) {
_shMVyWZV._bFVtOxkZ.display = 'none';
return;
}
_LasmfXYm.textContent = '正在获取上次优选结果...';
try {
const _CgjWpKUq = await fetch('/api/get-cached-_iPsJCAAK');
if (_CgjWpKUq.ok) {
const _gEylmZbU = await _CgjWpKUq.json();
if (_gEylmZbU && _gEylmZbU._PlktmswB && _gEylmZbU._PlktmswB._HbQNqGXH > 0) {
_AEYWbbXM(_gEylmZbU, _tfboMOCz, true);
} else {
_shMVyWZV._bFVtOxkZ.display = 'none';
}
}
} catch (_AYpGQMns) {
console.error("加载缓存失败:", _AYpGQMns);
}
}
let _rNlzKaQS;
function _uyIJJAzJ(_hHFIgjMu, _XvhFCJpx = 'success', _xsVTzixW = 3000) {
if (_rNlzKaQS) clearTimeout(_rNlzKaQS);
_yfLUXQVc.innerHTML = _hHFIgjMu;
let _HfJQXCFp = 'var(--success-_HsRKrBro)';
if (_XvhFCJpx === 'error') _HfJQXCFp = 'var(--danger-_HsRKrBro)';
if (_XvhFCJpx === 'warning') _HfJQXCFp = 'var(--warning-_HsRKrBro)';
if (_XvhFCJpx === 'info') _HfJQXCFp = 'var(--primary-_HsRKrBro)';
_yfLUXQVc._bFVtOxkZ.backgroundColor = _HfJQXCFp;
_yfLUXQVc.classList.add('show');
_rNlzKaQS = setTimeout(() => { _yfLUXQVc.classList.remove('show'); }, _xsVTzixW);
}
let _cuGlWBDu;
function _dZRKciDf(_HsRKrBro) {
const _bFUinqkJ = document.getElementById('background-_bFUinqkJ');
if (!_bFUinqkJ || !_bFUinqkJ.getContext) return;
_bFUinqkJ._bFVtOxkZ.display = 'block';
const _QAsWicmN = _bFUinqkJ.getContext('2d');
let _dVonDvbr, height, particles;
const _URtQfdMu = _GUBYEqXW(_HsRKrBro);
if (!_URtQfdMu) return;
const _xnorymdO = `${_URtQfdMu.r},${_URtQfdMu.g},${_URtQfdMu.b}`;
const _jypZiHGT = () => {
if (_cuGlWBDu) cancelAnimationFrame(_cuGlWBDu);
_dVonDvbr = _bFUinqkJ._dVonDvbr = window.innerWidth;
height = _bFUinqkJ.height = window.innerHeight;
particles = Array.from({ _HbQNqGXH: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _dVonDvbr, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_OHiLqlVv();
};
const _OHiLqlVv = () => {
_QAsWicmN.clearRect(0, 0, _dVonDvbr, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _dVonDvbr) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_QAsWicmN.beginPath();
_QAsWicmN.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_QAsWicmN.fillStyle = `rgba(${_xnorymdO}, 0.5)`;
_QAsWicmN.fill();
});
for (let _KvOstDnB = 0; _KvOstDnB < particles._HbQNqGXH; _KvOstDnB++) {
for (let _rDhiixZm = _KvOstDnB + 1; _rDhiixZm < particles._HbQNqGXH; _rDhiixZm++) {
const _RIQJhuoW = Math.hypot(particles[_KvOstDnB].x - particles[_rDhiixZm].x, particles[_KvOstDnB].y - particles[_rDhiixZm].y);
if (_RIQJhuoW < 120) {
_QAsWicmN.beginPath(); _QAsWicmN.moveTo(particles[_KvOstDnB].x, particles[_KvOstDnB].y);
_QAsWicmN.lineTo(particles[_rDhiixZm].x, particles[_rDhiixZm].y);
_QAsWicmN.strokeStyle = `rgba(${_xnorymdO}, ${1 - _RIQJhuoW/120})`;
_QAsWicmN.stroke();
}
}
}
_cuGlWBDu = requestAnimationFrame(_OHiLqlVv);
};
window.addEventListener('resize', _jypZiHGT, { passive: true });
_jypZiHGT();
}
function _zeYukwAr() {
if (_cuGlWBDu) cancelAnimationFrame(_cuGlWBDu);
const _bFUinqkJ = document.getElementById('background-_bFUinqkJ');
if (_bFUinqkJ && _bFUinqkJ.getContext('2d')) {
_bFUinqkJ.getContext('2d').clearRect(0, 0, _bFUinqkJ._dVonDvbr, _bFUinqkJ.height);
_bFUinqkJ._bFVtOxkZ.display = 'none';
}
}
function _fiItAVGk() {
const _PCXxmJzN = document.getElementById('copySubscriptionBtn');
const _sPQXFqJY = document.getElementById('_mfMJXZBB');
const _kMUYhoeX = document.getElementById('_OYECmpOV');
const _LzKzrKaS = document.getElementById('closeSubModalBtn');
const _jwhVwDfM = _kMUYhoeX.querySelector('.modal-close-btn');
_PCXxmJzN.addEventListener('click', () => {
if (!_IDTuAjfU || _iQaVyiHl._HbQNqGXH === 0) {
_uyIJJAzJ('请先完成优选IP测试', 'warning');
return;
}
if (!_IhdKuJfN) {
_uyIJJAzJ('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_YZxOPbZr._jKzRIgtB) {
_uyIJJAzJ('管理员未配置Sublink服务地址', 'error');
return;
}
const _UzYpvapK = 'https://' + window._CJPfahxO._ttVuNTKr + '/' + _IhdKuJfN;
const _xmnNOZAb = {
coreEngine: _UzYpvapK + 'xr',
coreProfile: _UzYpvapK + 'si',
configProfile: _UzYpvapK + 'cl',
policyProfile: _UzYpvapK + 'su'
};
_sPQXFqJY.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _XvhFCJpx = btn.dataset.subType;
navigator.clipboard.writeText(_xmnNOZAb[_XvhFCJpx]).then(() => {
_uyIJJAzJ(`${_XvhFCJpx.charAt(0).toUpperCase() + _XvhFCJpx.slice(1)} 订阅链接已复制!`, 'success');
_sPQXFqJY._bFVtOxkZ.display = 'none';
});
};
});
_sPQXFqJY.querySelectorAll('._iOLtwVUA-btn').forEach(btn => {
btn.onclick = () => {
const _XvhFCJpx = btn.dataset.subType;
const _GHwmigCX = document.getElementById('qrCodeImg');
const _ZmYcSgBh = _xmnNOZAb[_XvhFCJpx];
if (!_ZmYcSgBh) return;
try {
const _iOLtwVUA = qrcode(0, 'M');
_iOLtwVUA.addData(_ZmYcSgBh);
_iOLtwVUA.make();
_GHwmigCX.src = _iOLtwVUA.createDataURL(10, 2);
_kMUYhoeX._bFVtOxkZ.display = 'flex';
} catch(_AYpGQMns) {
_uyIJJAzJ('生成二维码失败', 'error');
console.error(_AYpGQMns);
}
};
});
_sPQXFqJY._bFVtOxkZ.display = 'flex';
});
_LzKzrKaS.addEventListener('click', () => { _sPQXFqJY._bFVtOxkZ.display = 'none'; });
_sPQXFqJY.addEventListener('click', (_AYpGQMns) => { if(_AYpGQMns.target === _sPQXFqJY) _sPQXFqJY._bFVtOxkZ.display = 'none'; });
_kMUYhoeX.addEventListener('click', (_AYpGQMns) => { if(_AYpGQMns.target === _kMUYhoeX) _kMUYhoeX._bFVtOxkZ.display = 'none'; });
}
function _mzCTTsHu() {
const _iXKUJBQp = {
android: [
{ _Tnhqrazc: 'Karing', _nvOWtiOW: 'KaringX/karing', _rESFeosB: ['apk', 'universal-release'] },
{ _Tnhqrazc: 'S' + 'ing-Box', _nvOWtiOW: 'SagerNet/sing-box', _rESFeosB: ['android', 'universal'] },
{ _Tnhqrazc: 'V2' + 'rayNG', _nvOWtiOW: '2dust/v2rayNG', _rESFeosB: ['apk', 'arm64-v8a'] },
{ _Tnhqrazc: '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: [
{ _Tnhqrazc: 'Karing', fixedUrl: 'https://_yxAYxwmn.apple.com/us/_RYvmVXlP/karing/id6472431552?_WRNzmdaH=iphone' },
{ _Tnhqrazc: 'S' + 'ing-Box', fixedUrl: 'https://_yxAYxwmn.apple.com/us/_RYvmVXlP/sing-box-vt/id6673731168' },
{ _Tnhqrazc: 'Shadow' + 'rocket', fixedUrl: 'https://_yxAYxwmn.apple.com/us/_RYvmVXlP/shadowrocket/id932747118' },
],
windows: [
{ _Tnhqrazc: 'Karing', _nvOWtiOW: 'KaringX/karing', _rESFeosB: ['exe', 'x64-setup'] },
{ _Tnhqrazc: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _Tnhqrazc: 'C' + 'lashN', _nvOWtiOW: '2dust/clashN', _rESFeosB: ['clashN.zip'] },
],
mac: [
{ _Tnhqrazc: 'Karing', fixedUrl: 'https://_yxAYxwmn.apple.com/us/_RYvmVXlP/karing/id6472431552?_WRNzmdaH=mac' },
{ _Tnhqrazc: 'S' + 'ing-Box', fixedUrl: 'https://_yxAYxwmn.apple.com/us/_RYvmVXlP/sing-box-vt/id6673731168' },
]
};
function _KETbTZuE(_JOTGTLwo) {
if (_YZxOPbZr.streamer._fixYDcZO && (_JOTGTLwo.includes('github.com') || _JOTGTLwo.includes('cdn.jsdelivr.net'))) {
return window._CJPfahxO.origin + '/' + _JOTGTLwo.replace('://', ':/');
}
return _JOTGTLwo;
}
async function _dEdHNRuR(_nvOWtiOW, _rESFeosB) {
try {
const _CgjWpKUq = await fetch(_KETbTZuE(`https://api.github.com/repos/${_nvOWtiOW}/releases/latest`));
if (!_CgjWpKUq.ok) return null;
const _gEylmZbU = await _CgjWpKUq.json();
for (const _dNcnxZzi of _rESFeosB) {
const _cyiLsqTj = _gEylmZbU.assets.find(a => a._Tnhqrazc.toLowerCase().includes(_dNcnxZzi.toLowerCase()));
if (_cyiLsqTj) return _cyiLsqTj.browser_download_url;
}
return null;
} catch (_AYpGQMns) { return null; }
}
async function _rUGifcZe(_WRNzmdaH) {
const _GwwBOdks = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_WRNzmdaH];
_wlyySPtE.querySelector('#appModalTitle').textContent = `${_GwwBOdks} 客户端下载`;
const _IIzjILOW = _wlyySPtE.querySelector('#appModalBody');
_IIzjILOW.innerHTML = '<span>正在获取最新版本...</span>';
_wlyySPtE._bFVtOxkZ.display = 'flex';
const _yxAYxwmn = _iXKUJBQp[_WRNzmdaH];
let _IBLQQsrr = '';
for (const _RYvmVXlP of _yxAYxwmn) {
let _JwzWhssG = '';
if (_RYvmVXlP.fixedUrl) {
_JwzWhssG = `<a href="${_KETbTZuE(_RYvmVXlP.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_RYvmVXlP.fixedUrl.split('/').pop()}</a>`;
} else if (_RYvmVXlP._nvOWtiOW) {
const _JOTGTLwo = await _dEdHNRuR(_RYvmVXlP._nvOWtiOW, _RYvmVXlP._rESFeosB);
if (_JOTGTLwo) {
_JwzWhssG = `<a href="${_KETbTZuE(_JOTGTLwo)}" target="_blank" rel="noopener noreferrer">${_JOTGTLwo.split('/').pop()}</a>`;
} else {
_JwzWhssG = '<span>获取失败,请稍后重试。</span>';
}
}
_IBLQQsrr += `<div class="_RYvmVXlP-list-_WLuMbUSv"><span class="_RYvmVXlP-_Tnhqrazc">${_RYvmVXlP._Tnhqrazc}</span><div class="_RYvmVXlP-links">${_JwzWhssG}</div></div>`;
}
_IIzjILOW.innerHTML = _IBLQQsrr;
}
document.querySelectorAll('._RYvmVXlP-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _rUGifcZe(button.dataset._WRNzmdaH));
});
_wlyySPtE.querySelector('.modal-close-btn').addEventListener('click', () => { _wlyySPtE._bFVtOxkZ.display = 'none'; });
_wlyySPtE.addEventListener('click', (_AYpGQMns) => { if (_AYpGQMns.target === _wlyySPtE) _wlyySPtE._bFVtOxkZ.display = 'none'; });
}
function _epxtGrXq(_HoOTgXLn, _ixZwMYFJ) {
let _KvOstDnB, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_IBLQQsrr");
for (_KvOstDnB = 0; _KvOstDnB < tabcontent._HbQNqGXH; _KvOstDnB++) {
tabcontent[_KvOstDnB]._bFVtOxkZ.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_KvOstDnB = 0; _KvOstDnB < tablinks._HbQNqGXH; _KvOstDnB++) {
tablinks[_KvOstDnB].className = tablinks[_KvOstDnB].className.replace(" active", "");
}
document.getElementById(_ixZwMYFJ)._bFVtOxkZ.display = "block";
_HoOTgXLn.currentTarget.className += " active";
}
function _zYKmYaVi() {
const _fNjBXbDS = document.createElement('div');
_fNjBXbDS._vdjrcNre = 'tooltip-popup';
document._PVFUdepj.appendChild(_fNjBXbDS);
document.addEventListener('click', function(_AYpGQMns) {
const _CNUVIViG = _AYpGQMns.target.closest('.tooltip-_CNUVIViG');
if (_CNUVIViG) {
const _ZmYcSgBh = _CNUVIViG.dataset.tooltip;
_fNjBXbDS.textContent = _ZmYcSgBh;
const _SqydsKVy = _CNUVIViG.getBoundingClientRect();
_fNjBXbDS._bFVtOxkZ.display = 'block';
let _iWVOVtrV = _SqydsKVy.bottom + window.scrollY + 5;
let _NbZurQIH = _SqydsKVy._NbZurQIH + window.scrollX;
_fNjBXbDS._bFVtOxkZ._iWVOVtrV = `${_iWVOVtrV}px`;
_fNjBXbDS._bFVtOxkZ._NbZurQIH = `${_NbZurQIH}px`;
const _ByMQpcNR = _fNjBXbDS.getBoundingClientRect();
if (_ByMQpcNR.right > window.innerWidth - 10) {
_NbZurQIH = window.innerWidth - _ByMQpcNR._dVonDvbr - 10;
}
if (_ByMQpcNR.bottom > window.innerHeight - 10) {
_iWVOVtrV = _SqydsKVy._iWVOVtrV + window.scrollY - _ByMQpcNR.height - 5;
}
_fNjBXbDS._bFVtOxkZ._iWVOVtrV = `${_iWVOVtrV}px`;
_fNjBXbDS._bFVtOxkZ._NbZurQIH = `${_NbZurQIH}px`;
_AYpGQMns.stopPropagation();
} else if (_fNjBXbDS._bFVtOxkZ.display === 'block') {
_fNjBXbDS._bFVtOxkZ.display = 'none';
}
});
}
const _bFVtOxkZ = document.createElement('_bFVtOxkZ');
_bFVtOxkZ.textContent = `
.tab-button { background-_HsRKrBro: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _HsRKrBro: var(--_ZmYcSgBh-light); font-size: 1em; }
.tab-button:hover { background-_HsRKrBro: var(--border-_HsRKrBro); }
.tab-button.active { _HsRKrBro: var(--primary-_HsRKrBro); border-bottom: 2px solid var(--primary-_HsRKrBro); }
.tab-_IBLQQsrr { display: none; padding-_iWVOVtrV: 1rem; }
`;
document.head.appendChild(_bFVtOxkZ);
window.addEventListener('DOMContentLoaded', _wpOlaLWV);
</script>
</_PVFUdepj></html>
`;
}