import { connect } from "cloudflare:sockets";
const _SygntUVt = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _mmLJyIUk = ["UpstreamAddress.SG.CMLiussss.net"];
const _ouYxMtnd = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _ZIBclEdA = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _NAOfjlUv = '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 _MWPykgRp = '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 _PQFGOMqa(_LYHZofZQ) {
if (Array.isArray(_LYHZofZQ)) {
try {
return String.fromCharCode.apply(null, _LYHZofZQ);
} catch (_QQyugJdA) {
return '';
}
}
return _LYHZofZQ;
}
function _TJzvRqXO(_DcLsgNGi) {
return /^[0-9a-_bWWXFWou]{8}-[0-9a-_bWWXFWou]{4}-[4][0-9a-_bWWXFWou]{3}-[89ab][0-9a-_bWWXFWou]{3}-[0-9a-_bWWXFWou]{12}$/_lciQxfJF.test(_DcLsgNGi);
}
const _ThoLdKrh = "optimized_ips_v4";
const _QDgYFeub = "global_config_v4";
const _NlROgdSf = "admin_password_v4";
const _WnnKqtGH = "live_results_temp_v1";
const _elILTMcQ = "latest_sub_id_v1";
export default {
async fetch(_SXotmiHC, _PQCbjFFa, _hEjcsIYo) {
try {
if (!_PQCbjFFa.DB) {
const _MoeiXYJc = _YjolohSl("D1 数据库 'DB' 未绑定。");
return new Response(_MoeiXYJc, { status: 503, _VVXSjEXI: { 'Content-Type': '_QPcUWqjs/html;_ruFhqZpD=UTF-8' }});
}
_hEjcsIYo.waitUntil(
_PQCbjFFa.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_zjDlvhQA TEXT PRIMARY KEY, _LYHZofZQ TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_DcLsgNGi TEXT PRIMARY KEY, _odczUsYu TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_QQyugJdA => console.error("DB Init Error:", _QQyugJdA._ZXeikViR))
);
const _XEkiYzCY = new URL(_SXotmiHC._XEkiYzCY);
const _bJEcHKTk = _XEkiYzCY.pathname;
const _PWWLUSlt = _SXotmiHC._VVXSjEXI.get("Upgrade");
const _OXTUkWkN = await _DKomPuvw(_PQCbjFFa);
if (_OXTUkWkN.websocketStreamer && _OXTUkWkN.websocketStreamer._BnATtqBu && _PWWLUSlt && _PWWLUSlt.toLowerCase() === "websocket") {
const _pZzgVNYy = _OXTUkWkN.websocketStreamer._XEkiYzCY;
if (_pZzgVNYy && _pZzgVNYy.trim().startsWith('https://')) {
try {
const _lREtDjja = new Request(_pZzgVNYy.trim() + _XEkiYzCY.pathname + _XEkiYzCY.search, _SXotmiHC);
return await fetch(_lREtDjja);
} catch (_QQyugJdA) {
return new Response(`Upstream WebSocket gateway failed: ${_QQyugJdA._ZXeikViR}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_PWWLUSlt && _PWWLUSlt.toLowerCase() === "websocket") {
return await _WnfuKWIi(_SXotmiHC, _PQCbjFFa, _OXTUkWkN);
}
const _XVVnqjVd = _bJEcHKTk._DtWbCaaR(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_XVVnqjVd) {
const [, _VogwVqIu, typeSuffix] = _XVVnqjVd;
const _VQkkNIgW = _OXTUkWkN._VQkkNIgW;
if (!_VQkkNIgW || _VQkkNIgW.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' } });
}
const _bAEjaIMK = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _DMZsHgIa = _bAEjaIMK[typeSuffix];
const _hOfLnbKT = _VQkkNIgW.replace(/\/$/, '');
const _vBISDwnB = `${_XEkiYzCY.origin}/${_VogwVqIu}`;
const _utEfaKcm = `${_hOfLnbKT}/${_DMZsHgIa}?_OXTUkWkN=${encodeURIComponent(_vBISDwnB)}`;
try {
const _mqEylAFk = await fetch(_utEfaKcm, { _VVXSjEXI: { 'User-Agent': _SXotmiHC._VVXSjEXI.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _wYdFPPCQ = new Headers(_mqEylAFk._VVXSjEXI);
_wYdFPPCQ._HhXBufsA('Access-Control-Allow-Origin', '*');
return new Response(_mqEylAFk._GPVckCXD, { status: _mqEylAFk.status, statusText: _mqEylAFk.statusText, _VVXSjEXI: _wYdFPPCQ });
} catch (_QQyugJdA) {
return new Response(`获取上游订阅失败: ${_QQyugJdA._ZXeikViR}`, { status: 502, _VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' } });
}
}
if (_bJEcHKTk.startsWith('/https:/') || _bJEcHKTk.startsWith('/http:/')) {
return _ibTlXSYY(_SXotmiHC, _OXTUkWkN);
}
if (_OXTUkWkN.customSubPath && _OXTUkWkN.customSubPath._BnATtqBu && _OXTUkWkN.customSubPath._bJEcHKTk && _bJEcHKTk === '/' + _OXTUkWkN.customSubPath._bJEcHKTk.trim()) {
const _QWVijJfK = _PQCbjFFa.DB.prepare("SELECT _LYHZofZQ FROM kv_data WHERE _zjDlvhQA = ?").bind(_elILTMcQ);
const { _BNYcfafk } = await _QWVijJfK.all();
const _vIzmfuyC = _BNYcfafk._ZGDZcNxG > 0 ? _BNYcfafk[0]._LYHZofZQ : null;
if (_vIzmfuyC) {
return _FiYNBjly({ _pBrmiIQI: { _DcLsgNGi: _vIzmfuyC }, _XEkiYzCY: _SXotmiHC._XEkiYzCY }, _PQCbjFFa);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' } });
}
}
const _nIGyZvLc = _bJEcHKTk.split('/').filter(Boolean);
if (_nIGyZvLc._ZGDZcNxG === 1 && !_bJEcHKTk.startsWith('/api/')) {
const _VogwVqIu = _nIGyZvLc[0];
return _FiYNBjly({ _pBrmiIQI: { _DcLsgNGi: _VogwVqIu }, _XEkiYzCY: _SXotmiHC._XEkiYzCY }, _PQCbjFFa);
}
if (_bJEcHKTk.startsWith('/api/')) {
if (_bJEcHKTk === '/api/_OXTUkWkN' && _SXotmiHC.method === 'POST') return _TtZiDJAb(_SXotmiHC, _PQCbjFFa, _hEjcsIYo);
if (_bJEcHKTk === '/api/_HhXBufsA-_hbQBVofZ') return _XxrbQlmM(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk === '/api/change-_hbQBVofZ') return _iYnGXMBe(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk === '/api/verify-_hbQBVofZ') return _jDmoTGBd(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk === '/api/verify-visitor-_hbQBVofZ' && _SXotmiHC.method === 'POST') return _hjOEeyiW(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk === '/api/cache-live-_BNYcfafk' && _SXotmiHC.method === 'POST') return _UkvsTgLO(_SXotmiHC, _PQCbjFFa, _hEjcsIYo);
if (_bJEcHKTk === '/api/get-_XKiSOWAb' && _SXotmiHC.method === 'POST') return _iapeKZZA(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk === '/api/get-cached-_jyLPkfZI') return _sjhjsMVm(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk === '/api/save-_jyLPkfZI') return _RyWCfqWR(_SXotmiHC, _PQCbjFFa, _hEjcsIYo);
if (_bJEcHKTk === '/api/save-and-get-sub-_DcLsgNGi' && _SXotmiHC.method === 'POST') return _sIjAUnup(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk.startsWith('/api/get-_zUkKEBxB/')) {
const _VogwVqIu = _bJEcHKTk.split('/').pop();
return _FiYNBjly({ _pBrmiIQI: { _DcLsgNGi: _VogwVqIu }, _XEkiYzCY: _SXotmiHC._XEkiYzCY }, _PQCbjFFa);
}
if (_bJEcHKTk === '/api/_OXTUkWkN' && _SXotmiHC.method === 'GET') return _YRFJfqjU(_PQCbjFFa);
if (_bJEcHKTk === '/api/get-resolved-_jyLPkfZI') return _qVbHdpcQ(_SXotmiHC);
if (_bJEcHKTk === '/api/parse-_jyLPkfZI-from-_SjDMeRko' && _SXotmiHC.method === 'POST') return _GBOPrDkg(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk === '/api/endpoints') return _eHkZuyVf(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_bJEcHKTk === '/_SYaXvwUD') return _RMTDsYNw(_SXotmiHC, _PQCbjFFa);
if (_bJEcHKTk === '/bing-wallpaper') return _tFKzQVuy();
return _iapVUjIE(_SXotmiHC, _PQCbjFFa, _hEjcsIYo);
} catch (err) {
let _QQyugJdA = err;
return new Response(_QQyugJdA.toString(), { status: 500 });
}
}
};
const _GRzecyTV = { 'Accept': '_QPcUWqjs/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 _NokNeEaL(_XEkiYzCY, _eObqTjnL) {
const _RemQxrEb = await fetch(_XEkiYzCY, { _VVXSjEXI: { ..._GRzecyTV, 'Referer': _eObqTjnL.referer } });
if (_RemQxrEb.ok) return _RemQxrEb._QPcUWqjs();
return null;
}
async function _YBcuDPxU(_XEkiYzCY, _eObqTjnL) {
const _RTyXFlfF = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_XEkiYzCY)}`;
const _RemQxrEb = await fetch(_RTyXFlfF, { _VVXSjEXI: { ..._GRzecyTV, 'Referer': _eObqTjnL.referer } });
if (!_RemQxrEb.ok) return null;
const _GPVckCXD = await _RemQxrEb._QPcUWqjs();
const _DtWbCaaR = _GPVckCXD._DtWbCaaR(/<pre[^>]*>([\s\S]*?)<\/pre>/_lciQxfJF);
return _DtWbCaaR && _DtWbCaaR[1] ? _DtWbCaaR[1].replace(/&/g, '&') : null;
}
function _EILZwfze(_SsvdCJRS) {
let _oVSjQrRK;
try {
_oVSjQrRK = atob(_SsvdCJRS.replace(/\s/g, ''));
} catch (_QQyugJdA) {
_oVSjQrRK = _SsvdCJRS;
}
const _zUkKEBxB = _oVSjQrRK.split(/[\s\n\r,]+/).filter(line => line.trim());
const _OkCNUtVk = new Set();
const _DXLWMYRD = /@([^?#]+?):(\d+)/;
for (const _sNXRJfgg of _zUkKEBxB) {
let _YsxDaDaZ = '';
let _ZoXLSmoM = '';
try {
if (_sNXRJfgg.startsWith('vmess://')) {
const _fFANRNZc = atob(_sNXRJfgg.substring(8));
const _OXTUkWkN = JSON.parse(_fFANRNZc);
_YsxDaDaZ = _OXTUkWkN.add;
_ZoXLSmoM = _OXTUkWkN._ZoXLSmoM;
} else {
const _DtWbCaaR = _sNXRJfgg._DtWbCaaR(_DXLWMYRD);
if (_DtWbCaaR && _DtWbCaaR[1] && _DtWbCaaR[2]) {
_YsxDaDaZ = _DtWbCaaR[1].replace(/[\[\]]/g, '');
_ZoXLSmoM = _DtWbCaaR[2];
}
}
} catch (_QQyugJdA) {
console.warn(`Could not parse _sNXRJfgg: ${_sNXRJfgg}`);
}
if (_YsxDaDaZ && _ZoXLSmoM) {
_OkCNUtVk.add(`${_YsxDaDaZ}:${_ZoXLSmoM}`);
}
}
return Array.from(_OkCNUtVk);
}
async function _bhfhCdtj(_JsamLEsY) {
try {
const _RemQxrEb = await fetch(_JsamLEsY, { _VVXSjEXI: _GRzecyTV });
if (!_RemQxrEb.ok) {
console.error(`Failed to fetch subscription: ${_RemQxrEb.status}`);
return [];
}
const _SsvdCJRS = await _RemQxrEb._QPcUWqjs();
return _EILZwfze(_SsvdCJRS);
} catch (error) {
console.error(`Error processing subscription ${_JsamLEsY}:`, error);
return [];
}
}
async function _WvBHBvFU(_bLrZkTdW) {
const _wUcBsvBL = _bLrZkTdW.trim();
const _jzvtvdLX = /^(vless|vmess|trojan|ss):\/\//.test(_wUcBsvBL);
const _FjUWrSnX = (() => {
if (_wUcBsvBL._ZGDZcNxG < 20 || _wUcBsvBL.startsWith('http')) return false;
const _GdHGVaGn = _wUcBsvBL.replace(/\s/g, '');
if (_GdHGVaGn._ZGDZcNxG % 4 !== 0 && !_GdHGVaGn.includes('=')) return false;
try {
atob(_GdHGVaGn);
return true;
} catch (_QQyugJdA) {
return false;
}
})();
if (_jzvtvdLX || _FjUWrSnX) {
return _EILZwfze(_wUcBsvBL).join('\n');
}
const _LEpwMzvd = [
'https://ipdb.api.030101.xyz/?_gnrLqmGR=bestcf&_ANJUamEN=true',
'https://ipdb.api.030101.xyz/?_gnrLqmGR=bestproxy&_ANJUamEN=true'
];
const _NTjFFffz = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_lciQxfJF.test(_bLrZkTdW) || _bLrZkTdW.includes('?_VNxaRuQa=');
if (_NTjFFffz) {
const _jyLPkfZI = await _bhfhCdtj(_bLrZkTdW);
return _jyLPkfZI.join('\n');
}
let _SsvdCJRS = '';
if (_LEpwMzvd.includes(_bLrZkTdW)) {
_SsvdCJRS = await _NokNeEaL(_bLrZkTdW, { referer: _bLrZkTdW });
if (!_SsvdCJRS || _SsvdCJRS._ZGDZcNxG < 8) {
_SsvdCJRS = await _YBcuDPxU(_bLrZkTdW, { referer: _bLrZkTdW });
}
} else {
try {
const _cEYGXWRK = await fetch(_bLrZkTdW, { _VVXSjEXI: { 'User-Agent': 'Cloudflare-Worker' } });
if (_cEYGXWRK.ok) {
_SsvdCJRS = await _cEYGXWRK._QPcUWqjs();
} else {
console.warn(`Failed to fetch URL ${_bLrZkTdW}: ${_cEYGXWRK.status}`);
}
} catch (_QQyugJdA) {
console.error(`Error fetching URL ${_bLrZkTdW}:`, _QQyugJdA);
}
}
const _xCiPYevK = _EILZwfze(_SsvdCJRS);
if (_xCiPYevK._ZGDZcNxG > 0) {
return _xCiPYevK.join('\n');
}
return _SsvdCJRS || '';
}
async function _ibTlXSYY(_SXotmiHC, _OXTUkWkN) {
if (!_OXTUkWkN.streamer._BnATtqBu) {
return new Response('远程流功能未开启', { status: 403 });
}
const _XEkiYzCY = new URL(_SXotmiHC._XEkiYzCY);
const _CDRPkplZ = _XEkiYzCY.pathname.substring(1).replace(':/', '://');
try {
const _utEfaKcm = new URL(_CDRPkplZ);
const _VAxSYjZb = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_VAxSYjZb.some(domain => _utEfaKcm._YsxDaDaZ.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _LjvAQtvE = new Headers(_SXotmiHC._VVXSjEXI);
_LjvAQtvE._HhXBufsA('Host', _utEfaKcm._YsxDaDaZ);
_LjvAQtvE._HhXBufsA('User-Agent', 'CF-Worker-Streamer/1.0');
const _hPfOpSWH = await fetch(_utEfaKcm.toString(), {
method: _SXotmiHC.method,
_VVXSjEXI: _LjvAQtvE,
_GPVckCXD: _SXotmiHC._GPVckCXD,
});
const _wYdFPPCQ = new Headers(_hPfOpSWH._VVXSjEXI);
_wYdFPPCQ._HhXBufsA('Access-Control-Allow-Origin', '*');
_wYdFPPCQ._HhXBufsA('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_wYdFPPCQ._HhXBufsA('Access-Control-Allow-Headers', '*');
_wYdFPPCQ._HhXBufsA('Cache-Control', 'public, max-age=86400');
_wYdFPPCQ._HhXBufsA('X-Streamer-Source', 'CF-Worker');
_wYdFPPCQ.delete('_SsvdCJRS-security-policy');
_wYdFPPCQ.delete('x-_SsvdCJRS-security-policy');
_wYdFPPCQ.delete('x-webkit-csp');
return new Response(_hPfOpSWH._GPVckCXD, {
status: _hPfOpSWH.status,
statusText: _hPfOpSWH.statusText,
_VVXSjEXI: _wYdFPPCQ,
});
} catch (_QQyugJdA) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _WnfuKWIi(_SXotmiHC, _PQCbjFFa, _OXTUkWkN) {
try {
const _AfqsDBOZ = _OXTUkWkN || await _DKomPuvw(_PQCbjFFa);
const _geJmuJfJ = (_AfqsDBOZ.itemLink._bkDfCtrR && _AfqsDBOZ.itemLink._bkDfCtrR[0]) || {};
const _eWHLneIL = _geJmuJfJ['_VNxaRuQa'] || _PQFGOMqa(_SygntUVt);
if (!_TJzvRqXO(_eWHLneIL)) {
throw new Error("Configured user _oFfSHeBm is not valid.");
}
const _cQgzPbgB = _AfqsDBOZ.dataFeeds.universalFallbackAddress;
let _CPTSnBpf = {};
const _pBpsbxxM = _PQFGOMqa(_mmLJyIUk[0] || "");
if (_cQgzPbgB) {
const [_rlhanaoU, _ZoXLSmoM = '443'] = _cQgzPbgB.split(':');
_CPTSnBpf = { _rlhanaoU, _ZoXLSmoM };
} else {
const [_rlhanaoU, _ZoXLSmoM = '443'] = _pBpsbxxM.split(':');
_CPTSnBpf = { _rlhanaoU, _ZoXLSmoM };
}
const _XEkiYzCY = new URL(_SXotmiHC._XEkiYzCY);
const _bJEcHKTk = _XEkiYzCY.pathname;
let _fdYurzYl = '';
const _jkgGvhPt = _XEkiYzCY.searchParams.get('remote');
if (_jkgGvhPt) {
_fdYurzYl = atob(_jkgGvhPt);
} else if (_bJEcHKTk.startsWith('/endpoint=')) {
_fdYurzYl = _bJEcHKTk.substring(10);
} else if (_bJEcHKTk._ZGDZcNxG > 1 && _bJEcHKTk.substring(1).includes('.')) {
_fdYurzYl = _bJEcHKTk.substring(1);
}
if (_fdYurzYl) {
const [_rlhanaoU, _ZoXLSmoM = '443'] = _fdYurzYl.split(':');
_CPTSnBpf = { _rlhanaoU, _ZoXLSmoM };
}
return await _jffRoJMA(_SXotmiHC, _eWHLneIL, _CPTSnBpf);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _jffRoJMA(_SXotmiHC, _oFfSHeBm, _CPTSnBpf) {
const _VYAgJVqX = new WebSocketPair();
const [clientEnd, _HhZVeCON] = Object.values(_VYAgJVqX);
_HhZVeCON.accept();
let _FrJxNobX = { _lGUkmcKB: null };
const _rKUbveGH = _SXotmiHC._VVXSjEXI.get("sec-websocket-protocol") || "";
const _jAaDKBZM = _JiCbqrcd(_HhZVeCON, _rKUbveGH);
_jAaDKBZM.pipeTo(new WritableStream({
async write(chunk) {
if (_FrJxNobX._lGUkmcKB) {
const _tdYZYrUw = _FrJxNobX._lGUkmcKB.writable.getWriter();
await _tdYZYrUw.write(chunk);
_tdYZYrUw.releaseLock();
return;
}
const { error, details } = await _lBAgHFgn(chunk, _oFfSHeBm);
if (error) {
throw new Error(details);
}
const _dRttaaUJ = new Uint8Array([details._OTwjZTXu[0], 0]);
const _YELYWVFt = chunk.slice(details.payloadIndex);
await _RvkVmqNa(_FrJxNobX, details._HVMWhQtb, details._myDTVLni, _YELYWVFt, _HhZVeCON, _dRttaaUJ, _CPTSnBpf);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_QNVerSvl(_HhZVeCON);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _RvkVmqNa(_FrJxNobX, _HVMWhQtb, _myDTVLni, _yhHNEsFI, _ONnUDAHR, _dRttaaUJ, _IxDfGogo) {
const _JzwyxpPk = async (_rlhanaoU, _ZoXLSmoM) => {
let _afLLHSdx = _rlhanaoU;
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(_rlhanaoU)) {
_afLLHSdx = `${atob('d3d3Lg==')}${_rlhanaoU}${atob('LnNzbGlwLmlv')}`;
}
const _lGUkmcKB = connect({ _YsxDaDaZ: _afLLHSdx, _ZoXLSmoM });
_FrJxNobX._lGUkmcKB = _lGUkmcKB;
const _tdYZYrUw = _lGUkmcKB.writable.getWriter();
await _tdYZYrUw.write(_yhHNEsFI);
_tdYZYrUw.releaseLock();
return _lGUkmcKB;
};
const _wVgfSgvJ = async () => {
if (!_IxDfGogo._rlhanaoU) return;
console.log(`Direct connection failed, falling back to gateway: ${_IxDfGogo._rlhanaoU}`);
const _qAwgRHQM = await _JzwyxpPk(_IxDfGogo._rlhanaoU, parseInt(_IxDfGogo._ZoXLSmoM, 10));
_qAwgRHQM.closed.catch(() => {}).finally(() => _QNVerSvl(_ONnUDAHR));
_YWiDWfdZ(_qAwgRHQM, _ONnUDAHR, _dRttaaUJ, null);
};
try {
const _fojZdRwT = await _JzwyxpPk(_HVMWhQtb, _myDTVLni);
_YWiDWfdZ(_fojZdRwT, _ONnUDAHR, _dRttaaUJ, _wVgfSgvJ);
} catch (err) {
console.error("Primary connection failed:", err);
await _wVgfSgvJ();
}
}
function _JiCbqrcd(_HhZVeCON, _rKUbveGH) {
let _lXLtwJmH = false;
return new ReadableStream({
start(_bUCsDNzc) {
_HhZVeCON.addEventListener("_ZXeikViR", (event) => { if (_lXLtwJmH) return; _bUCsDNzc.enqueue(event._odczUsYu); });
_HhZVeCON.addEventListener("close", () => { _QNVerSvl(_HhZVeCON); if (_lXLtwJmH) return; _bUCsDNzc.close(); });
_HhZVeCON.addEventListener("error", (err) => _bUCsDNzc.error(err));
if (_rKUbveGH) {
try {
const _edkrDGnQ = atob(_rKUbveGH.replace(/-/g, "+").replace(/_/g, "/"));
_bUCsDNzc.enqueue(Uint8Array.from(_edkrDGnQ, c => c.charCodeAt(0))._mAezrjXd);
} catch (_QQyugJdA) { console.error("Failed to decode early _odczUsYu:", _QQyugJdA); }
}
},
cancel() { _lXLtwJmH = true; _QNVerSvl(_HhZVeCON); },
});
}
async function _lBAgHFgn(_mAezrjXd, _oFfSHeBm) {
if (_mAezrjXd.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _OTwjZTXu = new Uint8Array(_mAezrjXd.slice(0, 1));
const _WPaXMaEm = _drHqXjeX(new Uint8Array(_mAezrjXd.slice(1, 17)));
if (_WPaXMaEm !== _oFfSHeBm) return { error: true, details: "Invalid _oFfSHeBm" };
const _TLNczLzX = new Uint8Array(_mAezrjXd.slice(17, 18))[0];
const _zKaSEAjm = new Uint8Array(_mAezrjXd.slice(18 + _TLNczLzX, 19 + _TLNczLzX))[0];
if (_zKaSEAjm !== 1) return { error: true, details: `Unsupported _zKaSEAjm: ${_zKaSEAjm}` };
const _ytVQMJhx = 19 + _TLNczLzX;
const _myDTVLni = new DataView(_mAezrjXd.slice(_ytVQMJhx, _ytVQMJhx + 2)).getUint16(0);
let _uZpkWuYB = _ytVQMJhx + 2;
const _yGKTkLfi = new Uint8Array(_mAezrjXd.slice(_uZpkWuYB, _uZpkWuYB + 1))[0];
let _nHyxlNZf = 0;
let _xWKeQvcp = _uZpkWuYB + 1;
let _HVMWhQtb = "";
switch (_yGKTkLfi) {
case 1: _nHyxlNZf = 4; _HVMWhQtb = new Uint8Array(_mAezrjXd.slice(_xWKeQvcp, _xWKeQvcp + _nHyxlNZf)).join("."); break;
case 2: _nHyxlNZf = new Uint8Array(_mAezrjXd.slice(_xWKeQvcp, _xWKeQvcp + 1))[0]; _xWKeQvcp++; _HVMWhQtb = new TextDecoder().decode(_mAezrjXd.slice(_xWKeQvcp, _xWKeQvcp + _nHyxlNZf)); break;
case 3: _nHyxlNZf = 16; const _mrzNBzKe = new DataView(_mAezrjXd.slice(_xWKeQvcp, _xWKeQvcp + _nHyxlNZf)); const _RQfNgTIz = []; for (let _lciQxfJF = 0; _lciQxfJF < 8; _lciQxfJF++) _RQfNgTIz.push(_mrzNBzKe.getUint16(_lciQxfJF * 2).toString(16)); _HVMWhQtb = _RQfNgTIz.join(":"); break;
default: return { error: true, details: `Invalid _LcirszwF _gnrLqmGR: ${_yGKTkLfi}` };
}
if (!_HVMWhQtb) return { error: true, details: "Target _rlhanaoU is empty" };
return { error: false, details: { _HVMWhQtb, _myDTVLni, _OTwjZTXu, payloadIndex: _xWKeQvcp + _nHyxlNZf } };
}
async function _YWiDWfdZ(_lGUkmcKB, _ONnUDAHR, _pkdgfJhP, _CJlxlikF) {
let _cfGxmRob = _pkdgfJhP;
let _LjmjiQhF = false;
let _Oyosgfet = _lGUkmcKB._jAaDKBZM.pipeTo(new WritableStream({
write(chunk) {
_LjmjiQhF = true;
if (_ONnUDAHR.readyState !== 1) throw new Error("Channel is not open");
if (_cfGxmRob) {
const _PiquIYZj = new Uint8Array(_cfGxmRob.byteLength + chunk.byteLength);
_PiquIYZj._HhXBufsA(new Uint8Array(_cfGxmRob));
_PiquIYZj._HhXBufsA(new Uint8Array(chunk), _cfGxmRob.byteLength);
_ONnUDAHR.send(_PiquIYZj._mAezrjXd);
_cfGxmRob = null;
} else {
_ONnUDAHR.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _ONnUDAHR error:", err._ZXeikViR);
});
await _Oyosgfet;
if (!_LjmjiQhF && _CJlxlikF) {
_CJlxlikF();
}
}
function _QNVerSvl(_ONnUDAHR) {
try { if (_ONnUDAHR.readyState === 1 || _ONnUDAHR.readyState === 2) _ONnUDAHR.close(); } catch (_QQyugJdA) {}
}
const _YNhjucRe = Array.from({ _ZGDZcNxG: 256 }, (_, _lciQxfJF) => (_lciQxfJF + 256).toString(16).slice(1));
function _drHqXjeX(_AflzSFNW, offset = 0) {
return (
_YNhjucRe[_AflzSFNW[offset]] + _YNhjucRe[_AflzSFNW[offset + 1]] + _YNhjucRe[_AflzSFNW[offset + 2]] + _YNhjucRe[_AflzSFNW[offset + 3]] + "-" +
_YNhjucRe[_AflzSFNW[offset + 4]] + _YNhjucRe[_AflzSFNW[offset + 5]] + "-" +
_YNhjucRe[_AflzSFNW[offset + 6]] + _YNhjucRe[_AflzSFNW[offset + 7]] + "-" +
_YNhjucRe[_AflzSFNW[offset + 8]] + _YNhjucRe[_AflzSFNW[offset + 9]] + "-" +
_YNhjucRe[_AflzSFNW[offset + 10]] + _YNhjucRe[_AflzSFNW[offset + 11]] +
_YNhjucRe[_AflzSFNW[offset + 12]] + _YNhjucRe[_AflzSFNW[offset + 13]] +
_YNhjucRe[_AflzSFNW[offset + 14]] + _YNhjucRe[_AflzSFNW[offset + 15]]
).toLowerCase();
}
let _PgMQxtOI = { "N/A":"未知" };
async function _cWcAOKXV(_XEkiYzCY, _aTSkWhgW, _CJlxlikF) {
try {
const _RemQxrEb = await fetch(_XEkiYzCY, {
_VVXSjEXI: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_RemQxrEb.ok) {
console.error(`获取 ${_XEkiYzCY} 失败: HTTP ${_RemQxrEb.status}`);
return _CJlxlikF;
}
const _QPcUWqjs = await _RemQxrEb._QPcUWqjs();
return _aTSkWhgW(_QPcUWqjs);
} catch (error) {
console.error(`获取或解析 ${_XEkiYzCY} 时发生网络错误: ${error._ZXeikViR}`);
return _CJlxlikF;
}
}
function _CEVlVZXr(_QPcUWqjs) {
if (!_QPcUWqjs) return [];
const _aCVjTpGv = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _uWvBjErP = _QPcUWqjs.split(/[\s,;#|]+/);
const _tJsRRLLs = [];
for (const _oiGFSJAy of _uWvBjErP) {
const _NWtJckpX = _oiGFSJAy.trim();
if (!_NWtJckpX) continue;
const _OdtUsuMZ = _NWtJckpX.lastIndexOf(':');
let _hagLqTLu = _NWtJckpX;
if(_OdtUsuMZ > _NWtJckpX.lastIndexOf(']')) {
const _zvAOscdW = _NWtJckpX.substring(_OdtUsuMZ + 1);
if(!isNaN(_zvAOscdW) && _zvAOscdW._ZGDZcNxG > 0) {
_hagLqTLu = _NWtJckpX.substring(0, _OdtUsuMZ);
}
}
if (_GdxOlvXs.isValid(_hagLqTLu.replace(/[\[\]]/g, '')) || _aCVjTpGv.test(_NWtJckpX)) {
_tJsRRLLs.push(_NWtJckpX);
}
}
return _tJsRRLLs;
}
function _PVXYkJHg(_QPcUWqjs) {
if (!_QPcUWqjs) return [];
return _QPcUWqjs.split(/\s+/).filter(d => d.trim() !== '');
}
function _QgBvWZsd(_QPcUWqjs) {
if (!_QPcUWqjs) return { "N/A": "未知" };
try {
return JSON.parse(`{${_QPcUWqjs}}`);
} catch (_QQyugJdA) {
console.error("解析 _PgMQxtOI 失败:", _QQyugJdA);
return { "N/A": "未知" };
}
}
const _GdxOlvXs = {
isValid: (_SYaXvwUD) => _GdxOlvXs.isIPv4(_SYaXvwUD) || _GdxOlvXs.isIPv6(_SYaXvwUD),
isIPv4: (_SYaXvwUD) => {
if (typeof _SYaXvwUD !== 'string') return false;
const _RQfNgTIz = _SYaXvwUD.split('.');
if (_RQfNgTIz._ZGDZcNxG !== 4) return false;
return _RQfNgTIz.every(_UmwfftGd => {
const _VthylwOD = parseInt(_UmwfftGd, 10);
return !isNaN(_VthylwOD) && _VthylwOD >= 0 && _VthylwOD <= 255 && String(_VthylwOD) === _UmwfftGd;
});
},
isIPv6: (_SYaXvwUD) => {
if (typeof _SYaXvwUD !== '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]))$/_lciQxfJF.test(_SYaXvwUD);
},
toLong4: (_SYaXvwUD) => _SYaXvwUD.split('.').reduce((acc, octet, _lciQxfJF) => acc + (parseInt(octet) << (8*(3-_lciQxfJF))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_SYaXvwUD) => {
try {
const _lYJcYkGn = _SYaXvwUD.split('/')[0];
const _RQfNgTIz = _lYJcYkGn.split('::');
if (_RQfNgTIz._ZGDZcNxG > 2) return 0n;
let _kKrwmlAQ = [];
if (_RQfNgTIz[0]) {
_kKrwmlAQ = _RQfNgTIz[0].split(':');
}
let _vinHCBBr = [];
if (_RQfNgTIz._ZGDZcNxG > 1 && _RQfNgTIz[1]) {
_vinHCBBr = _RQfNgTIz[1].split(':');
}
if (_kKrwmlAQ._ZGDZcNxG + _vinHCBBr._ZGDZcNxG > 8) return 0n;
const _dxxCfxJF = 8 - (_kKrwmlAQ._ZGDZcNxG + _vinHCBBr._ZGDZcNxG);
const _HnVOfKdq = [
..._kKrwmlAQ,
...Array(_dxxCfxJF).fill('0'),
..._vinHCBBr
].map(_UmwfftGd => _UmwfftGd || '0');
while(_HnVOfKdq._ZGDZcNxG < 8) {
_HnVOfKdq.push('0');
}
let _dYiVvVpP = 0n;
for (const _UmwfftGd of _HnVOfKdq) {
if (_UmwfftGd._ZGDZcNxG > 4) return 0n;
const _LYHZofZQ = BigInt('0x' + _UmwfftGd);
_dYiVvVpP = (_dYiVvVpP << 16n) | _LYHZofZQ;
}
return _dYiVvVpP;
} catch(_QQyugJdA) {
return 0n;
}
},
fromBigInt6: (_dYiVvVpP) => {
if (typeof _dYiVvVpP !== '_dYiVvVpP' || _dYiVvVpP < 0n) return null;
const _RQfNgTIz = [];
for (let _lciQxfJF = 0; _lciQxfJF < 8; _lciQxfJF++) {
_RQfNgTIz.unshift((_dYiVvVpP & 0xFFFFn).toString(16));
_dYiVvVpP >>= 16n;
}
let _FbKnTlpv = { start: -1, _edOUVKYR: 0 };
let _tnYvRFZG = { start: -1, _edOUVKYR: 0 };
for (let _lciQxfJF = 0; _lciQxfJF < 8; _lciQxfJF++) {
if (_RQfNgTIz[_lciQxfJF] === '0') {
if (_tnYvRFZG.start === -1) _tnYvRFZG.start = _lciQxfJF;
_tnYvRFZG._edOUVKYR++;
} else {
if (_tnYvRFZG._edOUVKYR > _FbKnTlpv._edOUVKYR) _FbKnTlpv = { ..._tnYvRFZG };
_tnYvRFZG = { start: -1, _edOUVKYR: 0 };
}
}
if (_tnYvRFZG._edOUVKYR > _FbKnTlpv._edOUVKYR) _FbKnTlpv = { ..._tnYvRFZG };
if (_FbKnTlpv._edOUVKYR > 1) {
_RQfNgTIz.splice(_FbKnTlpv.start, _FbKnTlpv._edOUVKYR, '');
if (_FbKnTlpv.start === 0) _RQfNgTIz.unshift('');
if (_FbKnTlpv.start + _FbKnTlpv._edOUVKYR === 8) _RQfNgTIz.push('');
}
return _RQfNgTIz.join(':');
},
cidrToRange: (cidr, _TsJebgAC = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _jCjxpFZw = parseInt(bitsStr, 10);
const _jyLPkfZI = new Set();
if (_GdxOlvXs.isIPv4(range)) {
if (isNaN(_jCjxpFZw) || _jCjxpFZw < 8 || _jCjxpFZw > 32) return [];
if (_jCjxpFZw === 32) return [range];
const _ioiTMKrj = _GdxOlvXs.toLong4(range);
const _qpZmjfyQ = (0xFFFFFFFF << (32 - _jCjxpFZw)) >>> 0;
const _sObxeFNm = _ioiTMKrj & _qpZmjfyQ;
const _OSEgLULz = 1 << (32 - _jCjxpFZw);
if (_OSEgLULz <= 2) return [];
const _yoOMoMQu = Math.min(_TsJebgAC, _OSEgLULz - 2);
let _aBrlPpcT = 0;
while (_jyLPkfZI.size < _yoOMoMQu && _aBrlPpcT < _yoOMoMQu * 5) {
const _ItZGmnAJ = Math.floor(Math.random() * (_OSEgLULz - 2)) + 1;
_jyLPkfZI.add(_GdxOlvXs.fromLong4((_sObxeFNm + _ItZGmnAJ) >>> 0));
_aBrlPpcT++;
}
return Array.from(_jyLPkfZI);
} else if (_GdxOlvXs.isIPv6(range)) {
if (isNaN(_jCjxpFZw) || _jCjxpFZw < 16 || _jCjxpFZw > 128) return [];
if (_jCjxpFZw === 128) return [range];
const _dBpibuMF = _GdxOlvXs.toBigInt6(range);
const _qpZmjfyQ = (2n ** BigInt(128 - _jCjxpFZw) - 1n);
const _sObxeFNm = _dBpibuMF & ~_qpZmjfyQ;
const _weTYKOtE = 2n ** BigInt(128 - _jCjxpFZw);
if (_weTYKOtE <= 2n) return [];
let _aBrlPpcT = 0;
while (_jyLPkfZI.size < _TsJebgAC && _aBrlPpcT < _TsJebgAC * 5) {
const _Bswrezuw = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_Bswrezuw);
let _OHthUHoA = 0n;
for (const _OiiIYvnl of _Bswrezuw) {
_OHthUHoA = (_OHthUHoA << 8n) | BigInt(_OiiIYvnl);
}
const _ItZGmnAJ = _OHthUHoA % (_weTYKOtE - 2n) + 1n;
_jyLPkfZI.add(_GdxOlvXs.fromBigInt6(_sObxeFNm + _ItZGmnAJ));
_aBrlPpcT++;
}
return Array.from(_jyLPkfZI);
}
return [];
} catch(_QQyugJdA) {
console.error(`CIDR to range failed for ${cidr}:`, _QQyugJdA);
return [];
}
}
};
function _DhfHGaLL(_dAKlgFwo, _EOZWCAFD) {
const _JtydJCAS = {};
const _OiYnzKXQ = Object._OiYnzKXQ(_EOZWCAFD);
const _RQfNgTIz = _OiYnzKXQ.map(_zjDlvhQA => {
const _stRYcQsO = _dAKlgFwo * (_EOZWCAFD[_zjDlvhQA] / 100);
return { _zjDlvhQA, _TsJebgAC: Math.floor(_stRYcQsO), remainder: _stRYcQsO - Math.floor(_stRYcQsO) };
});
let _EoNjtmZY = _RQfNgTIz.reduce((acc, _UmwfftGd) => acc + _UmwfftGd._TsJebgAC, 0);
_RQfNgTIz.sort((a, b) => b.remainder - a.remainder);
let _jqhDDzaY = _dAKlgFwo - _EoNjtmZY;
for (let _lciQxfJF = 0; _lciQxfJF < _jqhDDzaY; _lciQxfJF++) {
_RQfNgTIz[_lciQxfJF % _RQfNgTIz._ZGDZcNxG]._TsJebgAC++;
}
for (const _UmwfftGd of _RQfNgTIz) {
_JtydJCAS[_UmwfftGd._zjDlvhQA] = _UmwfftGd._TsJebgAC;
}
return _JtydJCAS;
}
async function _fwnYGopk(_PQCbjFFa) {
const _QWVijJfK = _PQCbjFFa.DB.prepare("SELECT _LYHZofZQ FROM kv_data WHERE _zjDlvhQA = ?").bind(_NlROgdSf);
const { _BNYcfafk } = await _QWVijJfK.all();
return _BNYcfafk._ZGDZcNxG > 0 ? _BNYcfafk[0]._LYHZofZQ : null;
}
async function _MUDQGxfn(_PQCbjFFa, _hbQBVofZ) {
const _QWVijJfK = _PQCbjFFa.DB.prepare(
"INSERT INTO kv_data (_zjDlvhQA, _LYHZofZQ) VALUES (?, ?) ON CONFLICT(_zjDlvhQA) DO UPDATE SET _LYHZofZQ = excluded._LYHZofZQ"
);
await _QWVijJfK.bind(_NlROgdSf, _hbQBVofZ).run();
}
async function _jDmoTGBd(_SXotmiHC, _PQCbjFFa) {
const { _hbQBVofZ } = await _SXotmiHC.json();
const _qbpBJLwF = await _fwnYGopk(_PQCbjFFa);
if (_qbpBJLwF === _hbQBVofZ) {
return _gswMUrbt({ success: true });
}
return _gswMUrbt({ success: false, _ZXeikViR: '密码错误' }, 401);
}
async function _hjOEeyiW(_SXotmiHC, _PQCbjFFa) {
const _xxuYDtkf = await _DKomPuvw(_PQCbjFFa);
if (!_xxuYDtkf.visitorPassword || !_xxuYDtkf.visitorPassword._BnATtqBu) {
return _gswMUrbt({ success: true });
}
try {
const { _hbQBVofZ } = await _SXotmiHC.json();
const _AodEYPtx = _xxuYDtkf.visitorPassword._hbQBVofZ;
if (_AodEYPtx && _hbQBVofZ === _AodEYPtx) {
return _gswMUrbt({ success: true });
}
return _gswMUrbt({ success: false, _ZXeikViR: '访客密码错误' }, 401);
} catch (_QQyugJdA) {
return _gswMUrbt({ success: false, _ZXeikViR: '无效请求' }, 400);
}
}
async function _XxrbQlmM(_SXotmiHC, _PQCbjFFa) {
const _ptnGmVQm = await _fwnYGopk(_PQCbjFFa);
if (_ptnGmVQm) {
return _gswMUrbt({ success: false, _ZXeikViR: "密码已设置,无法重复初始化。" }, 403);
}
const { _hbQBVofZ } = await _SXotmiHC.json();
if (!_hbQBVofZ || _hbQBVofZ._ZGDZcNxG < 6) {
return _gswMUrbt({ success: false, _ZXeikViR: "密码长度不能少于6位。" }, 400);
}
await _MUDQGxfn(_PQCbjFFa, _hbQBVofZ);
return _gswMUrbt({ success: true, _ZXeikViR: "初始密码设置成功!请刷新页面并登录。" });
}
async function _iYnGXMBe(_SXotmiHC, _PQCbjFFa) {
const { _LSUlvcvF, _uavGeMXD } = await _SXotmiHC.json();
const _qbpBJLwF = await _fwnYGopk(_PQCbjFFa);
if (_qbpBJLwF !== _LSUlvcvF) {
return _gswMUrbt({ success: false, _ZXeikViR: "旧密码错误。" }, 403);
}
if (!_uavGeMXD || _uavGeMXD._ZGDZcNxG < 6) {
return _gswMUrbt({ success: false, _ZXeikViR: "新密码长度不能少于6位。" }, 400);
}
await _MUDQGxfn(_PQCbjFFa, _uavGeMXD);
return _gswMUrbt({ success: true, _ZXeikViR: "密码修改成功!" });
}
function _IIGJYihY() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_VQkkNIgW: '',
api: {
_BnATtqBu: true,
_ZXeikViR: '维护中...',
},
ispFilter: { _BnATtqBu: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_BnATtqBu: true
},
websocketStreamer: {
_BnATtqBu: true,
_XEkiYzCY: 'https://snippets.neib.cn'
},
cloudStorage: {
_BnATtqBu: true
},
visitorPassword: {
_BnATtqBu: false,
_hbQBVofZ: '',
},
customSubPath: {
_BnATtqBu: false,
_bJEcHKTk: 'latest',
},
subscriptionId: {
_ZGDZcNxG: 8,
_ruFhqZpD: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_BnATtqBu: true,
template: 'vless://{_VNxaRuQa}@{_SYaXvwUD}:{_ZoXLSmoM}?encryption=none&security=tls&sni={_rlhanaoU}&fp=random&_gnrLqmGR=ws&_rlhanaoU={_rlhanaoU}&_bJEcHKTk={_bJEcHKTk}#{_lVEfmLNt}',
selectionMode: 'first',
_bkDfCtrR: [
{ _lVEfmLNt: '默认配置', _rlhanaoU: '', '_VNxaRuQa': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _bJEcHKTk: '/?ed=2560' }
],
_PUoeVmcb: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_BnATtqBu: false,
_QPcUWqjs: '',
_GdftYABY: 5
},
marquee: {
_BnATtqBu: false,
_QPcUWqjs: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_BnATtqBu: true,
sources: [
{ _WdCxAvPT: 'CF官方IPV4', _jyLPkfZI: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _PvXhwbqX: false, _BnATtqBu: true, _zXIXaqAi: 20 },
{ _WdCxAvPT: 'CF官方IPV6', _jyLPkfZI: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _PvXhwbqX: false, _BnATtqBu: true, _zXIXaqAi: 20 },
{ _WdCxAvPT: '反代优选0', _jyLPkfZI: 'https://wvs.sosorg.nyc.mn/sub?_VNxaRuQa=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_gnrLqmGR=ws&_rlhanaoU=ss.nzvrn.com&_bJEcHKTk=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _PvXhwbqX: false, _BnATtqBu: true, _zXIXaqAi: 30 },
{ _WdCxAvPT: '官方优选1', _jyLPkfZI: 'https://ipdb.api.030101.xyz/?_gnrLqmGR=bestcf&_ANJUamEN=true', _PvXhwbqX: false, _BnATtqBu: true, _zXIXaqAi: 10 },
{ _WdCxAvPT: '反代优选2', _jyLPkfZI: 'https://ipdb.api.030101.xyz/?_gnrLqmGR=bestproxy&_ANJUamEN=true', _PvXhwbqX: false, _BnATtqBu: true, _zXIXaqAi: 5 },
{ _WdCxAvPT: '官方优选2', _jyLPkfZI: 'https://addressesapi.090227.xyz/_SYaXvwUD.164746.xyz', _PvXhwbqX: false, _BnATtqBu: true, _zXIXaqAi: 10 },
{ _WdCxAvPT: '官方优选3', _jyLPkfZI: 'https://cfxr.eu.org/getSub?_rlhanaoU=snipaste.huggy.qzz.io', _PvXhwbqX: false, _BnATtqBu: true, _zXIXaqAi: 5 },
{ _WdCxAvPT: '官方优选4', _jyLPkfZI: 'https://addressesapi.090227.xyz/CloudFlareYes', _PvXhwbqX: false, _BnATtqBu: true, _zXIXaqAi: 10 }
]
},
customNodes: {
_BnATtqBu: 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 _PPUjKtbg(_sxXtGtct, _kLeHXYrF) {
if (!_sxXtGtct) return _kLeHXYrF;
const _QWGjJVFj = { ..._kLeHXYrF };
for (const _zjDlvhQA in _kLeHXYrF) {
if (_sxXtGtct.hasOwnProperty(_zjDlvhQA)) {
if (typeof _sxXtGtct[_zjDlvhQA] === 'object' && _sxXtGtct[_zjDlvhQA] !== null && !Array.isArray(_sxXtGtct[_zjDlvhQA]) && typeof _kLeHXYrF[_zjDlvhQA] === 'object' && _kLeHXYrF[_zjDlvhQA] !== null && !Array.isArray(_kLeHXYrF[_zjDlvhQA])) {
_QWGjJVFj[_zjDlvhQA] = _PPUjKtbg(_sxXtGtct[_zjDlvhQA], _kLeHXYrF[_zjDlvhQA]);
} else {
_QWGjJVFj[_zjDlvhQA] = _sxXtGtct[_zjDlvhQA];
}
}
}
return _QWGjJVFj;
}
async function _DKomPuvw(_PQCbjFFa) {
try {
const _QWVijJfK = _PQCbjFFa.DB.prepare("SELECT _LYHZofZQ FROM kv_data WHERE _zjDlvhQA = ?").bind(_QDgYFeub);
const { _BNYcfafk } = await _QWVijJfK.all();
const _qSsHblSn = _BNYcfafk._ZGDZcNxG > 0 ? _BNYcfafk[0]._LYHZofZQ : null;
const _mThHqQfg = _qSsHblSn ? JSON.parse(_qSsHblSn) : {};
return _PPUjKtbg(_mThHqQfg, _IIGJYihY());
} catch (_QQyugJdA) {
console.error("无法从D1获取或解析全局配置:", _QQyugJdA);
return _IIGJYihY();
}
}
async function _YRFJfqjU(_PQCbjFFa) {
const _OXTUkWkN = await _DKomPuvw(_PQCbjFFa);
return _gswMUrbt(_OXTUkWkN);
}
async function _TtZiDJAb(_SXotmiHC, _PQCbjFFa, _hEjcsIYo) {
try {
const { _OXTUkWkN, adminPassword } = await _SXotmiHC.json();
const _qbpBJLwF = await _fwnYGopk(_PQCbjFFa);
if (_qbpBJLwF !== adminPassword) {
return _gswMUrbt({ success: false, _ZXeikViR: "管理员密码错误" }, 403);
}
const _QWVijJfK = _PQCbjFFa.DB.prepare(
"INSERT INTO kv_data (_zjDlvhQA, _LYHZofZQ) VALUES (?, ?) ON CONFLICT(_zjDlvhQA) DO UPDATE SET _LYHZofZQ = excluded._LYHZofZQ"
);
const _dcRAtDyN = _QWVijJfK.bind(_QDgYFeub, JSON.stringify(_OXTUkWkN)).run();
_hEjcsIYo.waitUntil(_dcRAtDyN);
return _gswMUrbt({ success: true, _ZXeikViR: "配置已成功保存!" });
} catch (_QQyugJdA) {
return _gswMUrbt({ success: false, _ZXeikViR: `保存失败: ${_QQyugJdA._ZXeikViR}` }, 500);
}
}
async function _tFKzQVuy() {
const _UcbXGaxR = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _LUJHPruS = await fetch(_UcbXGaxR);
const _yBEdfASt = await _LUJHPruS.json();
const _MkNclEIQ = 'https://www.bing.com' + _yBEdfASt.images[0]._XEkiYzCY;
return fetch(_MkNclEIQ);
} catch (_QQyugJdA) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _bwjiDjgz(_SYaXvwUD) {
try {
const _RemQxrEb = await fetch(`http://_SYaXvwUD-api.com/json/${_SYaXvwUD}?fields=status,_ANJUamEN,countryCode,_JnJDyPjM&lang=zh-CN`);
if (_RemQxrEb.ok) {
const _odczUsYu = await _RemQxrEb.json();
if (_odczUsYu.status === 'success' && (_odczUsYu.countryCode || _odczUsYu._ANJUamEN)) {
let _JnJDyPjM = _odczUsYu._JnJDyPjM || '未知';
if (_JnJDyPjM.toLowerCase().includes('cloudflare')) {
_JnJDyPjM = 'CloudFlare';
}
return {
_WdCxAvPT: _PgMQxtOI[_odczUsYu.countryCode] || _odczUsYu._ANJUamEN || _odczUsYu.countryCode,
_JnJDyPjM: _JnJDyPjM
};
}
}
} catch (_QQyugJdA) {}
try {
const _RemQxrEb = await fetch(`https://api._SYaXvwUD.sb/geoip/${_SYaXvwUD}`);
if (_RemQxrEb.ok) {
const _odczUsYu = await _RemQxrEb.json();
if (_odczUsYu.country_code || _odczUsYu._ANJUamEN) {
let _JnJDyPjM = _odczUsYu._JnJDyPjM || '未知';
if (_JnJDyPjM.toLowerCase().includes('cloudflare')) {
_JnJDyPjM = 'CloudFlare';
}
return {
_WdCxAvPT: _PgMQxtOI[_odczUsYu.country_code] || _odczUsYu._ANJUamEN || _odczUsYu.country_code,
_JnJDyPjM: _JnJDyPjM
};
}
}
} catch (_QQyugJdA) {}
return { _WdCxAvPT: '未知', _JnJDyPjM: '未知' };
}
async function _iapeKZZA(_SXotmiHC, _PQCbjFFa) {
try {
const { _jyLPkfZI } = await _SXotmiHC.json();
if (!Array.isArray(_jyLPkfZI)) {
return _gswMUrbt({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _HnEwsYeN = _jyLPkfZI.map(_SYaXvwUD => _bwjiDjgz(_SYaXvwUD).then(_XKiSOWAb => ({ _SYaXvwUD, ..._XKiSOWAb })));
const _BNYcfafk = await Promise.all(_HnEwsYeN);
return _gswMUrbt(_BNYcfafk);
} catch (_QQyugJdA) {
return _gswMUrbt({ error: `获取地理位置失败: ${_QQyugJdA._ZXeikViR}` }, 500);
}
}
async function _sjhjsMVm(_SXotmiHC, _PQCbjFFa) {
const _OXTUkWkN = await _DKomPuvw(_PQCbjFFa);
if (!_OXTUkWkN.cloudStorage._BnATtqBu) {
return _gswMUrbt({ _BNYcfafk: [], generatedBy: null });
}
try {
const _QWVijJfK = _PQCbjFFa.DB.prepare("SELECT _LYHZofZQ FROM kv_data WHERE _zjDlvhQA = ?").bind(_ThoLdKrh);
const { _BNYcfafk } = await _QWVijJfK.all();
const _zDHzMyYZ = _BNYcfafk._ZGDZcNxG > 0 ? _BNYcfafk[0]._LYHZofZQ : null;
const _HRvDbvUx = _zDHzMyYZ ? JSON.parse(_zDHzMyYZ) : null;
return _gswMUrbt(_HRvDbvUx || { _BNYcfafk: [], generatedBy: null });
} catch (_QQyugJdA) {
console.error("从D1读取缓存IP失败:", _QQyugJdA);
return _gswMUrbt({ _BNYcfafk: [], generatedBy: null });
}
}
async function _RyWCfqWR(_SXotmiHC, _PQCbjFFa, _hEjcsIYo) {
const _OXTUkWkN = await _DKomPuvw(_PQCbjFFa);
if (!_OXTUkWkN.cloudStorage._BnATtqBu) {
return _gswMUrbt({ success: true, _ZXeikViR: "云端存储已禁用,不保存结果。" });
}
const _gffVdXLT = _SXotmiHC._VVXSjEXI.get('CF-Connecting-IP') || "未知IP";
const _ANJUamEN = _SXotmiHC.cf?._ANJUamEN || "未知";
const _DYbmbOAb = _SXotmiHC.cf?._DYbmbOAb || "";
let _wrgGVjrI = _PgMQxtOI[_ANJUamEN] || _ANJUamEN;
if (_DYbmbOAb && _DYbmbOAb !== "未知城市" && _DYbmbOAb !== _ANJUamEN) _wrgGVjrI = `${_wrgGVjrI} ${_PgMQxtOI[_DYbmbOAb] || _DYbmbOAb}`;
const _WTyForcS = {
_SYaXvwUD: _teRyUdGO(_gffVdXLT),
_WdCxAvPT: _wrgGVjrI.trim(),
time: _CeYetUDF()
};
try {
const _PGwFYKXD = await _SXotmiHC.json();
if (!Array.isArray(_PGwFYKXD)) return _gswMUrbt({ error: "无效数据格式" }, 400);
const _vxZIXIJX = _PGwFYKXD.map(_UAQceGMY => ({
_SYaXvwUD: String(_UAQceGMY._SYaXvwUD || ''),
_ZoXLSmoM: _UAQceGMY._ZoXLSmoM ? parseInt(_UAQceGMY._ZoXLSmoM, 10) : undefined,
_LelRELXn: parseInt(_UAQceGMY._LelRELXn, 10),
_WdCxAvPT: typeof _UAQceGMY._WdCxAvPT === 'string' ? _UAQceGMY._WdCxAvPT.substring(0, 50) : 'N/A',
_JnJDyPjM: typeof _UAQceGMY._JnJDyPjM === 'string' ? _UAQceGMY._JnJDyPjM.substring(0, 100) : 'N/A'
}));
const _xWoVPdNz = {
generatedBy: _WTyForcS,
_BNYcfafk: _vxZIXIJX
};
const _lMzIHOFe = _PQCbjFFa.DB.prepare(
"INSERT INTO kv_data (_zjDlvhQA, _LYHZofZQ) VALUES (?, ?) ON CONFLICT(_zjDlvhQA) DO UPDATE SET _LYHZofZQ = excluded._LYHZofZQ"
).bind(_ThoLdKrh, JSON.stringify(_xWoVPdNz)).run();
if (_OXTUkWkN.telegram.bot_token && _OXTUkWkN.telegram.chat_id) {
const _TtPybdZV = _vxZIXIJX.map(r => `${r._SYaXvwUD} ~ ${r._WdCxAvPT}`).join('\n');
const _ELadfWhL = `优选完成!\n来源: ${_WTyForcS._SYaXvwUD} (${_WTyForcS._WdCxAvPT})\n时间: ${_WTyForcS.time}\n\n结果:\n${_TtPybdZV}`;
const _iBvnfnMG = `https://api.telegram.org/bot${_OXTUkWkN.telegram.bot_token}/sendMessage?chat_id=${_OXTUkWkN.telegram.chat_id}&_QPcUWqjs=${encodeURIComponent(_ELadfWhL)}`;
const _itozHpRw = fetch(_iBvnfnMG).catch(_QQyugJdA => console.error("Telegram结果通知失败:", _QQyugJdA));
_hEjcsIYo.waitUntil(Promise.all([_lMzIHOFe, _itozHpRw]));
} else {
_hEjcsIYo.waitUntil(_lMzIHOFe);
}
return _gswMUrbt({ success: true, _ZXeikViR: "结果已保存" });
} catch (_QQyugJdA) {
return _gswMUrbt({ error: "D1写入失败", _ZXeikViR: _QQyugJdA._ZXeikViR }, 500);
}
}
async function _UkvsTgLO(_SXotmiHC, _PQCbjFFa, _hEjcsIYo) {
try {
const _pSuFtkFR = await _SXotmiHC.json();
if (!Array.isArray(_pSuFtkFR)) return _gswMUrbt({ error: "无效数据格式" }, 400);
const _xWoVPdNz = {
_BNYcfafk: _pSuFtkFR
};
const _QWVijJfK = _PQCbjFFa.DB.prepare(
"INSERT INTO kv_data (_zjDlvhQA, _LYHZofZQ) VALUES (?, ?) ON CONFLICT(_zjDlvhQA) DO UPDATE SET _LYHZofZQ = excluded._LYHZofZQ"
);
const _dcRAtDyN = _QWVijJfK.bind(_WnnKqtGH, JSON.stringify(_xWoVPdNz)).run();
_hEjcsIYo.waitUntil(_dcRAtDyN);
return _gswMUrbt({ success: true });
} catch (_QQyugJdA) {
return _gswMUrbt({ error: "D1写入临时缓存失败", _ZXeikViR: _QQyugJdA._ZXeikViR }, 500);
}
}
function _IvwUkdrE(_ZGDZcNxG, _ruFhqZpD) {
let _QopZTPyD = '';
const _oADpjekW = _ruFhqZpD._ZGDZcNxG;
for (let _lciQxfJF = 0; _lciQxfJF < _ZGDZcNxG; _lciQxfJF++) {
_QopZTPyD += _ruFhqZpD.charAt(Math.floor(Math.random() * _oADpjekW));
}
return _QopZTPyD;
}
async function _sIjAUnup(_SXotmiHC, _PQCbjFFa) {
try {
const _PGwFYKXD = await _SXotmiHC.json();
if (!Array.isArray(_PGwFYKXD) || _PGwFYKXD._ZGDZcNxG === 0) {
return _gswMUrbt({ error: "无效或空的IP列表" }, 400);
}
const _OXTUkWkN = await _DKomPuvw(_PQCbjFFa);
const _eRotogBg = _OXTUkWkN.subscriptionId || { _ZGDZcNxG: 8, _ruFhqZpD: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _VogwVqIu;
let _qZsZKCyq = false;
let _aBrlPpcT = 0;
const _QZKYQhDO = 10;
while (!_qZsZKCyq && _aBrlPpcT < _QZKYQhDO) {
_VogwVqIu = _IvwUkdrE(_eRotogBg._ZGDZcNxG, _eRotogBg._ruFhqZpD);
const { _BNYcfafk } = await _PQCbjFFa.DB.prepare("SELECT _DcLsgNGi FROM optimized_results WHERE _DcLsgNGi = ?").bind(_VogwVqIu).all();
if (_BNYcfafk._ZGDZcNxG === 0) {
_qZsZKCyq = true;
}
_aBrlPpcT++;
}
if (!_qZsZKCyq) {
return _gswMUrbt({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _WgRhZhOl = JSON.stringify({ _jyLPkfZI: _PGwFYKXD });
await _PQCbjFFa.DB.prepare(
"INSERT INTO optimized_results (_DcLsgNGi, _odczUsYu) VALUES (?, ?)"
).bind(_VogwVqIu, _WgRhZhOl).run();
await _PQCbjFFa.DB.prepare(
"INSERT INTO kv_data (_zjDlvhQA, _LYHZofZQ) VALUES (?, ?) ON CONFLICT(_zjDlvhQA) DO UPDATE SET _LYHZofZQ = excluded._LYHZofZQ"
).bind(_elILTMcQ, _VogwVqIu).run();
return _gswMUrbt({ success: true, _DcLsgNGi: _VogwVqIu });
} catch (_QQyugJdA) {
return _gswMUrbt({ error: "保存优选结果失败", _ZXeikViR: _QQyugJdA._ZXeikViR }, 500);
}
}
async function _FiYNBjly(_SXotmiHC, _PQCbjFFa) {
try {
const _VogwVqIu = _SXotmiHC._pBrmiIQI._DcLsgNGi;
if (!_VogwVqIu) {
return new Response("缺少结果ID", { status: 400 });
}
const _QopZTPyD = await _PQCbjFFa.DB.prepare("SELECT _odczUsYu FROM optimized_results WHERE _DcLsgNGi = ?").bind(_VogwVqIu).first();
if (!_QopZTPyD) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _odczUsYu = JSON.parse(_QopZTPyD._odczUsYu);
let _TtPybdZV = _odczUsYu._jyLPkfZI;
const _OXTUkWkN = await _DKomPuvw(_PQCbjFFa);
if (_OXTUkWkN.customNodes && _OXTUkWkN.customNodes._BnATtqBu && _OXTUkWkN.customNodes.list) {
const _VviAEIyw = _OXTUkWkN.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _uFwKAUGN = _VviAEIyw.map(_sNXRJfgg => {
let _LcirszwF = _sNXRJfgg;
let _ZoXLSmoM = undefined;
let _lVEfmLNt = null;
if (_LcirszwF.includes('@')) {
const _RQfNgTIz = _LcirszwF.split('@');
_lVEfmLNt = _RQfNgTIz.pop();
_LcirszwF = _RQfNgTIz.join('@');
}
if (_LcirszwF.includes('#')) {
const _RQfNgTIz = _LcirszwF.split('#');
const _zvAOscdW = _RQfNgTIz.pop();
if (!isNaN(_zvAOscdW) && _zvAOscdW.trim() !== '') {
_ZoXLSmoM = parseInt(_zvAOscdW, 10);
}
_LcirszwF = _RQfNgTIz.join('#');
}
return {
_SYaXvwUD: _LcirszwF,
_ZoXLSmoM: _ZoXLSmoM,
_WdCxAvPT: _lVEfmLNt || _LcirszwF,
_JnJDyPjM: '自定义'
};
});
_TtPybdZV.unshift(..._uFwKAUGN);
}
const { itemLink } = _OXTUkWkN;
const _PhxQsGAe = new URL(_SXotmiHC._XEkiYzCY)._YsxDaDaZ;
let _AWoBATrl;
if (_OXTUkWkN.websocketStreamer && _OXTUkWkN.websocketStreamer._BnATtqBu) {
if (!itemLink || !itemLink._BnATtqBu || !itemLink._bkDfCtrR || itemLink._bkDfCtrR._ZGDZcNxG === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_AWoBATrl = _TtPybdZV.map((_UAQceGMY, _wwlzKXJs) => {
let _lVEfmLNt;
if (_UAQceGMY._JnJDyPjM === '自定义') {
_lVEfmLNt = `${_wwlzKXJs + 1} - ${_UAQceGMY._WdCxAvPT}`;
} else {
_lVEfmLNt = `${_wwlzKXJs + 1} - ${_UAQceGMY._WdCxAvPT || '未知'}`;
if (!_UAQceGMY._JnJDyPjM || !_UAQceGMY._JnJDyPjM.toLowerCase().includes('cloudflare')) {
_lVEfmLNt += '(反代)';
}
}
const _naLBdPQh = _GdxOlvXs.isIPv6(_UAQceGMY._SYaXvwUD) ? `[${_UAQceGMY._SYaXvwUD}]` : _UAQceGMY._SYaXvwUD;
const _ZoXLSmoM = _UAQceGMY._ZoXLSmoM || 443;
const _aeSGFdmO = itemLink._bkDfCtrR[0];
const _AdSdEXGZ = _aeSGFdmO._VNxaRuQa || '';
const _VNxaRuQa = (_AdSdEXGZ && _TJzvRqXO(_AdSdEXGZ)) ? _AdSdEXGZ : crypto.randomUUID();
const _bJEcHKTk = '/snippets?_SYaXvwUD=endpointAddress:_ZoXLSmoM(443)&nat64=6to4';
const _rlhanaoU = _aeSGFdmO._rlhanaoU || _PhxQsGAe;
const _pBrmiIQI = new URLSearchParams({
security: 'tls',
_gnrLqmGR: 'ws',
_rlhanaoU: _rlhanaoU,
sni: _rlhanaoU,
fp: 'random'
});
return `vless://${_VNxaRuQa}@${_naLBdPQh}:${_ZoXLSmoM}?${_pBrmiIQI.toString()}&_bJEcHKTk=${encodeURIComponent(encodeURIComponent(_bJEcHKTk))}#${encodeURIComponent(_lVEfmLNt)}`;
});
} else {
if (!itemLink || !itemLink._BnATtqBu || !itemLink._bkDfCtrR || itemLink._bkDfCtrR._ZGDZcNxG === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _aeSGFdmO = itemLink._bkDfCtrR[0];
const { _rlhanaoU, _VNxaRuQa, _bJEcHKTk } = _aeSGFdmO;
_AWoBATrl = _TtPybdZV.map((_UAQceGMY, _wwlzKXJs) => {
let _lVEfmLNt;
if (_UAQceGMY._JnJDyPjM === '自定义') {
_lVEfmLNt = `${_wwlzKXJs + 1} - ${_UAQceGMY._WdCxAvPT}`;
} else {
_lVEfmLNt = `${_wwlzKXJs + 1} - ${_UAQceGMY._WdCxAvPT || '未知'}`;
if (!_UAQceGMY._JnJDyPjM || !_UAQceGMY._JnJDyPjM.toLowerCase().includes('cloudflare')) {
_lVEfmLNt += '(反代)';
}
}
const _naLBdPQh = _GdxOlvXs.isIPv6(_UAQceGMY._SYaXvwUD) ? `[${_UAQceGMY._SYaXvwUD}]` : _UAQceGMY._SYaXvwUD;
const _ZoXLSmoM = _UAQceGMY._ZoXLSmoM || 443;
const _pBrmiIQI = new URLSearchParams({
security: 'tls',
_gnrLqmGR: 'ws',
_rlhanaoU: _rlhanaoU || _PhxQsGAe,
sni: _rlhanaoU || _PhxQsGAe,
fp: 'random'
});
return `vless://${_VNxaRuQa}@${_naLBdPQh}:${_ZoXLSmoM}?${_pBrmiIQI.toString()}&_bJEcHKTk=${encodeURIComponent(encodeURIComponent(_bJEcHKTk || ''))}#${encodeURIComponent(_lVEfmLNt)}`;
});
}
const _FVrPOzII = _AWoBATrl.join('\n');
const _hyyjlecX = btoa(_FVrPOzII);
return new Response(_hyyjlecX, {
_VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' }
});
} catch (_QQyugJdA) {
return new Response(`生成节点列表失败: ${_QQyugJdA._ZXeikViR}`, { status: 500 });
}
}
async function _qVbHdpcQ(_SXotmiHC) {
try {
const { _cstAyhIA, _gnrLqmGR } = await _SXotmiHC.json();
if (!Array.isArray(_cstAyhIA)) {
return new Response('Invalid _cstAyhIA list', { status: 400 });
}
const _iRkMKoAL = _cstAyhIA.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _XEkiYzCY = `https://cloudflare-dns.com/dns-query?_lVEfmLNt=${encodeURIComponent(domain.trim())}&_gnrLqmGR=${_gnrLqmGR || 'A'}`;
return fetch(_XEkiYzCY, { _VVXSjEXI: { 'Accept': 'application/dns-json' } })
.then(_RemQxrEb => _RemQxrEb.json())
.then(_odczUsYu => (_odczUsYu.Answer ? _odczUsYu.Answer.map(a => a._odczUsYu) : []))
.catch(() => []);
});
const _vbaoMyrP = (await Promise.all(_iRkMKoAL)).flat();
const _HVYyfUjA = [...new Set(_vbaoMyrP)];
if (_HVYyfUjA._ZGDZcNxG === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_HVYyfUjA.join('\n'), { _VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._ZXeikViR}`, { status: 500 });
}
}
async function _GBOPrDkg(_SXotmiHC, _PQCbjFFa) {
try {
const { _SjDMeRko } = await _SXotmiHC.json();
if (!Array.isArray(_SjDMeRko)) {
return _gswMUrbt({ error: "Invalid input, expected an object with a '_SjDMeRko' array." }, 400);
}
const _yJYmohLI = new Set();
const _ApavnXrK = _SjDMeRko.map(_XEkiYzCY =>
_WvBHBvFU(_XEkiYzCY)
.then(_QPcUWqjs => {
if (!_QPcUWqjs) return;
const _uWvBjErP = _QPcUWqjs.split(/[\s,;|]+/);
for (const _oiGFSJAy of _uWvBjErP) {
const _NWtJckpX = _oiGFSJAy.trim();
if (_NWtJckpX) {
_yJYmohLI.add(_NWtJckpX);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_XEkiYzCY}:`, err);
})
);
await Promise.all(_ApavnXrK);
return _gswMUrbt({ _jyLPkfZI: Array.from(_yJYmohLI) });
} catch (_QQyugJdA) {
return _gswMUrbt({ error: `Failed to process URLs: ${_QQyugJdA._ZXeikViR}` }, 500);
}
}
async function _RMTDsYNw(_SXotmiHC, _PQCbjFFa) {
const _OXTUkWkN = await _DKomPuvw(_PQCbjFFa);
if (!_OXTUkWkN.api._BnATtqBu) {
return new Response(_OXTUkWkN.api._ZXeikViR || 'API is disabled.', { status: 503 });
}
try {
const _QWVijJfK = _PQCbjFFa.DB.prepare("SELECT _LYHZofZQ FROM kv_data WHERE _zjDlvhQA = ?").bind(_ThoLdKrh);
const { _BNYcfafk: dbResults } = await _QWVijJfK.all();
const _zDHzMyYZ = dbResults._ZGDZcNxG > 0 ? dbResults[0]._LYHZofZQ : null;
const _HRvDbvUx = _zDHzMyYZ ? JSON.parse(_zDHzMyYZ) : null;
if (!_HRvDbvUx || !_HRvDbvUx._BNYcfafk || _HRvDbvUx._BNYcfafk._ZGDZcNxG === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' },
});
}
const _jyLPkfZI = _HRvDbvUx._BNYcfafk.map(r => r._SYaXvwUD);
return new Response(_jyLPkfZI.join('\n'), {
_VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' },
});
} catch (_QQyugJdA) {
console.error("API /_SYaXvwUD 处理错误:", _QQyugJdA);
return new Response(`API处理时出错: ${_QQyugJdA._ZXeikViR}`, { status: 500 });
}
}
function _PhPTgqAb(_QopZTPyD, _wwlzKXJs, _OXTUkWkN, _PhxQsGAe) {
const { itemLink } = _OXTUkWkN;
if (!itemLink || !itemLink._BnATtqBu) return null;
const { template, _bkDfCtrR, selectionMode, _PUoeVmcb } = itemLink;
if (!_bkDfCtrR || _bkDfCtrR._ZGDZcNxG === 0) return null;
let _BLJayNSl;
if (selectionMode === 'random') {
_BLJayNSl = _bkDfCtrR[_wwlzKXJs % _bkDfCtrR._ZGDZcNxG];
} else if (selectionMode === 'first') {
_BLJayNSl = _bkDfCtrR[0];
} else {
_BLJayNSl = _bkDfCtrR.find(s => s._lVEfmLNt === selectionMode) || _bkDfCtrR[0];
}
if (!_BLJayNSl) return null;
let _JUSjHdfT = template;
const _ttBZRwrD = _QopZTPyD._ZoXLSmoM || 443;
const _NoHASZxA = _GdxOlvXs.isIPv6(_QopZTPyD._SYaXvwUD) ? `[${_QopZTPyD._SYaXvwUD}]` : _QopZTPyD._SYaXvwUD;
let _lVEfmLNt = `${_wwlzKXJs + 1} 、 ${_QopZTPyD._WdCxAvPT || '未知'}`;
if (!_QopZTPyD._JnJDyPjM || !_QopZTPyD._JnJDyPjM.toLowerCase().includes('cloudflare')) {
_lVEfmLNt += '(反代)';
}
let _rlhanaoU = _BLJayNSl._rlhanaoU || _PhxQsGAe;
_JUSjHdfT = _JUSjHdfT.replace(/{_SYaXvwUD}/g, _NoHASZxA)
.replace(/{_ZoXLSmoM}/g, _ttBZRwrD)
.replace(/{_lVEfmLNt}/g, encodeURIComponent(_lVEfmLNt))
.replace(/{rank}/g, _wwlzKXJs + 1)
.replace(/{_WdCxAvPT}/g, encodeURIComponent(_QopZTPyD._WdCxAvPT || '未知'))
.replace(/{_JnJDyPjM}/g, encodeURIComponent(_QopZTPyD._JnJDyPjM || '未知'))
.replace(/{_rlhanaoU}/g, encodeURIComponent(_rlhanaoU))
.replace(/{_VNxaRuQa}/g, encodeURIComponent(_BLJayNSl['_VNxaRuQa'] || ''))
.replace(/{_bJEcHKTk}/g, encodeURIComponent(encodeURIComponent(_BLJayNSl._bJEcHKTk || '')));
if (_PUoeVmcb) {
_PUoeVmcb.forEach(field => {
const _xIqbWBRa = new RegExp('{' + field._lVEfmLNt + '}', 'g');
_JUSjHdfT = _JUSjHdfT.replace(_xIqbWBRa, encodeURIComponent(field._LYHZofZQ));
});
}
return _JUSjHdfT;
}
async function _eHkZuyVf(_SXotmiHC, _PQCbjFFa) {
const _OXTUkWkN = await _DKomPuvw(_PQCbjFFa);
if (!_OXTUkWkN.itemLink._BnATtqBu) {
return new Response("Item _JUSjHdfT feature is disabled.", { status: 503, _VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' } });
}
try {
const _QWVijJfK = _PQCbjFFa.DB.prepare("SELECT _LYHZofZQ FROM kv_data WHERE _zjDlvhQA = ?").bind(_ThoLdKrh);
const { _BNYcfafk: dbResults } = await _QWVijJfK.all();
const _zDHzMyYZ = dbResults._ZGDZcNxG > 0 ? dbResults[0]._LYHZofZQ : null;
const _HRvDbvUx = _zDHzMyYZ ? JSON.parse(_zDHzMyYZ) : null;
if (!_HRvDbvUx || !_HRvDbvUx._BNYcfafk || _HRvDbvUx._BNYcfafk._ZGDZcNxG === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' },
});
}
const _PhxQsGAe = new URL(_SXotmiHC._XEkiYzCY)._YsxDaDaZ;
const _mLpNuACI = _HRvDbvUx._BNYcfafk.map((_QopZTPyD, _wwlzKXJs) => {
return _PhPTgqAb(_QopZTPyD, _wwlzKXJs, _OXTUkWkN, _PhxQsGAe);
}).filter(Boolean);
if (_mLpNuACI._ZGDZcNxG === 0) {
return new Response("Could not generate any _UAQceGMY links from the available IPs.", {
status: 500,
_VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' },
});
}
return new Response(_mLpNuACI.join('\n'), {
_VVXSjEXI: { 'Content-Type': '_QPcUWqjs/plain; _ruFhqZpD=utf-8' },
});
} catch (_QQyugJdA) {
console.error("API /api/endpoints error:", _QQyugJdA);
return new Response(`Error processing API _SXotmiHC: ${_QQyugJdA._ZXeikViR}`, { status: 500 });
}
}
async function _iapVUjIE(_SXotmiHC, _PQCbjFFa, _hEjcsIYo) {
const _gffVdXLT = _SXotmiHC._VVXSjEXI.get('CF-Connecting-IP') || "未知IP";
const [
_NFbMwRQB,
_nZmXWPxz,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_cWcAOKXV(_ouYxMtnd, _CEVlVZXr, []),
_cWcAOKXV(_ZIBclEdA, _CEVlVZXr, []),
_cWcAOKXV(_NAOfjlUv, _PVXYkJHg, []),
_cWcAOKXV(_MWPykgRp, _QgBvWZsd, { "N/A": "未知" })
]);
_PgMQxtOI = fetchedCountryMap;
let _jXEAVLGw = false;
let _xxuYDtkf;
try {
const _hbQBVofZ = await _fwnYGopk(_PQCbjFFa);
_jXEAVLGw = !!_hbQBVofZ;
_xxuYDtkf = await _DKomPuvw(_PQCbjFFa);
} catch (_QQyugJdA) {
if (_QQyugJdA._ZXeikViR && _QQyugJdA._ZXeikViR.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _xzxsnVUf = "CREATE TABLE IF NOT EXISTS kv_data (_zjDlvhQA TEXT PRIMARY KEY, _LYHZofZQ TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_DcLsgNGi TEXT PRIMARY KEY, _odczUsYu TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _PQCbjFFa.DB.exec(_xzxsnVUf);
console.log("数据表创建成功。");
_jXEAVLGw = false;
_xxuYDtkf = _IIGJYihY();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._ZXeikViR}`, {
status: 500,
_VVXSjEXI: { 'Content-Type': '_QPcUWqjs/html;_ruFhqZpD=UTF-8' }
});
}
} else {
let _MoeiXYJc = _YjolohSl(_QQyugJdA._ZXeikViR);
return new Response(_MoeiXYJc, { _VVXSjEXI: { 'Content-Type': '_QPcUWqjs/html;_ruFhqZpD=UTF-8' } });
}
}
if (_xxuYDtkf.telegram.bot_token && _xxuYDtkf.telegram.chat_id) {
const _ANJUamEN = _SXotmiHC.cf?._ANJUamEN || "未知";
const _DYbmbOAb = _SXotmiHC.cf?._DYbmbOAb || "";
let _wrgGVjrI = _PgMQxtOI[_ANJUamEN] || _ANJUamEN;
if (_DYbmbOAb && _DYbmbOAb !== "未知城市" && _DYbmbOAb !== _ANJUamEN) _wrgGVjrI = `${_wrgGVjrI} ${_PgMQxtOI[_DYbmbOAb] || _DYbmbOAb}`;
const _zDUzuZit = _CeYetUDF();
const _IFJvwpcg = _SXotmiHC._XEkiYzCY;
const _ELadfWhL = `访客: ${_gffVdXLT}\n位置: ${_wrgGVjrI.trim()}\n时间: ${_zDUzuZit}\n来自:${_IFJvwpcg}`;
const _iBvnfnMG = `https://api.telegram.org/bot${_xxuYDtkf.telegram.bot_token}/sendMessage?chat_id=${_xxuYDtkf.telegram.chat_id}&_QPcUWqjs=${encodeURIComponent(_ELadfWhL)}`;
_hEjcsIYo.waitUntil(fetch(_iBvnfnMG).catch(_QQyugJdA => console.error("Telegram通知失败:", _QQyugJdA)));
}
let _MznXetMG = _OIJMPjfY();
const _eZYvVIVX = {
_OXTUkWkN: _xxuYDtkf,
status: {
_jXEAVLGw: _jXEAVLGw,
}
};
_MznXetMG = _MznXetMG.replace('__PAGE_DATA_JSON__', JSON.stringify(_eZYvVIVX));
_MznXetMG = _MznXetMG.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_NFbMwRQB));
_MznXetMG = _MznXetMG.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_nZmXWPxz));
_MznXetMG = _MznXetMG.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_MznXetMG = _MznXetMG.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_PgMQxtOI));
return new Response(_MznXetMG, {
_VVXSjEXI: { 'Content-Type': '_QPcUWqjs/html;_ruFhqZpD=UTF-8' },
});
}
function _gswMUrbt(_GPVckCXD, status = 200, _VVXSjEXI = {}) {
return new Response(JSON.stringify(_GPVckCXD), {
status,
_VVXSjEXI: { 'Content-Type': 'application/json;_ruFhqZpD=UTF-8', ..._VVXSjEXI }
});
}
function _CeYetUDF(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 _teRyUdGO(_SYaXvwUD) {
if (!_SYaXvwUD || typeof _SYaXvwUD !== 'string') return "无效IP";
if(_GdxOlvXs.isIPv4(_SYaXvwUD)){
const _RQfNgTIz = _SYaXvwUD.split('.');
if (_RQfNgTIz._ZGDZcNxG === 4) return `${_RQfNgTIz[0]}.*.*.${_RQfNgTIz[3]}`;
}
if(_GdxOlvXs.isIPv6(_SYaXvwUD)){
const _RQfNgTIz = _SYaXvwUD.split(':');
if (_RQfNgTIz._ZGDZcNxG > 2) return `${_RQfNgTIz[0]}:...:${_RQfNgTIz[_RQfNgTIz._ZGDZcNxG - 1]}`;
}
return _SYaXvwUD;
}
function _YjolohSl(_wBnLxcWP) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _ruFhqZpD="UTF-8"><title>需要设置</title>
<_jcusQaLw>
_GPVckCXD { font-family: sans-serif; background: #1a1a1a; _txyQCZmW: #e0e0e0; display: flex; justify-_SsvdCJRS: center; align-items: center; height: 100vh; margin: 0; }
._fcTvggII { max-_mczmtATk: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _txyQCZmW: #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 { _txyQCZmW: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_sGQIyBMq: 1rem; }
</_jcusQaLw>
</head><_GPVckCXD>
<div class="_fcTvggII">
<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>
${_wBnLxcWP ? `<div class="error"><strong>当前错误信息:</strong> ${_wBnLxcWP.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_GPVckCXD></html>`;
}
function _OIJMPjfY() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _ruFhqZpD="UTF-8"> <meta _lVEfmLNt="viewport" _SsvdCJRS="_mczmtATk=device-_mczmtATk, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_JUSjHdfT 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>
<_jcusQaLw>
:root { --primary-_txyQCZmW: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_txyQCZmW: #8c939d; --light-bg: #1A1C20; --_SsvdCJRS-bg: #25282E; --border-_txyQCZmW: #40444C; --_QPcUWqjs-_txyQCZmW: #E0E0E0; --_QPcUWqjs-light: #B0B0B0; --success-_txyQCZmW: #30A46C; --danger-_txyQCZmW: #DA3633; --warning-_txyQCZmW: #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; }
_GPVckCXD { font-family: var(--font-family-sans); background-_txyQCZmW: var(--light-bg); _txyQCZmW: var(--_QPcUWqjs-_txyQCZmW); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_txyQCZmW 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_gcPKIqTX { position: fixed; _sGQIyBMq: 0; _BuRkXIGj: 0; _mczmtATk: 100%; height: 100%; z-_wwlzKXJs: -1; display: none; }
._ksAwcHyw-_fcTvggII { max-_mczmtATk: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_wwlzKXJs: 1; }
#_NxLMPkST { position: fixed; _sGQIyBMq: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_wwlzKXJs: 10; }
#marquee-_fcTvggII { overflow: hidden; white-space: nowrap; background-_txyQCZmW: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _txyQCZmW: var(--primary-_txyQCZmW); padding: 0.5rem 0; margin-_sGQIyBMq: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_QPcUWqjs { display: inline-block; padding-_BuRkXIGj: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_pkdgfJhP { _QPcUWqjs-align: center; margin-_sGQIyBMq: 1rem; margin-bottom: 2rem; }
_pkdgfJhP h1 { white-space: pre-wrap; font-size: 2.25em; _txyQCZmW: var(--primary-_txyQCZmW); font-weight: 700; _QPcUWqjs-shadow: 0 0 10px rgba(var(--primary-_txyQCZmW-rgb), 0.3); }
.card { background-_txyQCZmW: 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-_txyQCZmW); }
.progress-section #_aXssUZXG { _mczmtATk: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_txyQCZmW: var(--border-_txyQCZmW); overflow: hidden; }
.progress-section #_aXssUZXG::-webkit-progress-_LYHZofZQ { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _QPcUWqjs-align: center; margin-_sGQIyBMq: 0.75em; font-size: 0.95em; _txyQCZmW: var(--_QPcUWqjs-light); min-height: 1.5em; }
.section-_pkdgfJhP { display: flex; flex-wrap: wrap; justify-_SsvdCJRS: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_txyQCZmW); gap: 1rem; }
.section-_pkdgfJhP h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _txyQCZmW: var(--secondary-_txyQCZmW); _QPcUWqjs-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _mczmtATk: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _mczmtATk: 100%; border-collapse: collapse; margin-_sGQIyBMq: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_txyQCZmW); padding: 0.8em; _QPcUWqjs-align: _BuRkXIGj; vertical-align: middle; white-space: nowrap; }
th { background-_txyQCZmW: #2c3038; font-weight: 500; }
tbody tr:hover { background-_txyQCZmW: #30333a; }
td._SYaXvwUD-_LcirszwF { font-weight: 500; font-family: var(--font-family-mono); _txyQCZmW: var(--primary-_txyQCZmW); }
td.ping-_LYHZofZQ { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _QPcUWqjs-align: right; }
.btn { display: inline-flex; align-items: center; justify-_SsvdCJRS: center; font-weight: 500; _QPcUWqjs-align: center; cursor: pointer; user-_SEwFexun: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _txyQCZmW: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_BuRkXIGj: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _txyQCZmW: var(--primary-_txyQCZmW); border: 1px solid var(--primary-_txyQCZmW); }
.btn-outline:hover { background-_txyQCZmW: var(--primary-_txyQCZmW); _txyQCZmW: var(--_SsvdCJRS-bg); }
._ksAwcHyw-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._ksAwcHyw-download-buttons .btn { _mczmtATk: 100%; margin: 0; }
.tooltip-notification { position: fixed; _sGQIyBMq: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _txyQCZmW: #fff; font-size: 0.95em; z-_wwlzKXJs: 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); }
#_pvRKyRHj, #_hpscAYvf, #_JhJnuFbH, #_zjETDBuF, #_CZSVKxtl { display: none; position: fixed; z-_wwlzKXJs: 10000; _BuRkXIGj: 0; _sGQIyBMq: 0; _mczmtATk: 100%; height: 100%; background-_txyQCZmW: rgba(0,0,0,0.6); justify-_SsvdCJRS: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_SsvdCJRS, ._ksAwcHyw-modal-_SsvdCJRS { background-_txyQCZmW: var(--_SsvdCJRS-bg); padding: 2rem; border: 1px solid var(--border-_txyQCZmW); border-radius: var(--border-radius-md); _mczmtATk: 95%; max-_mczmtATk: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_zjETDBuF .modal-_SsvdCJRS { max-_mczmtATk: 500px; }
.modal-_SsvdCJRS h3, ._ksAwcHyw-modal-_pkdgfJhP h3 { margin-_sGQIyBMq: 0; margin-bottom: 1.5rem; _txyQCZmW: var(--primary-_txyQCZmW); _QPcUWqjs-align: center; }
.modal-buttons { display: flex; justify-_SsvdCJRS: flex-end; gap: 1rem; margin-_sGQIyBMq: 2rem; border-_sGQIyBMq: 1px solid var(--border-_txyQCZmW); padding-_sGQIyBMq: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_txyQCZmW), rgba(0,0,0,0)); margin: 2rem 0; }
._ksAwcHyw-modal-_pkdgfJhP { display: flex; justify-_SsvdCJRS: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_txyQCZmW); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _txyQCZmW: var(--_QPcUWqjs-light); cursor: pointer; background: none; border: none; padding: 0; }
._ksAwcHyw-list-_UAQceGMY { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_txyQCZmW); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._ksAwcHyw-_lVEfmLNt { font-size: 1.1em; font-weight: 600; }
._ksAwcHyw-links a { display: block; _txyQCZmW: var(--primary-_txyQCZmW); _QPcUWqjs-decoration: none; margin-_sGQIyBMq: 0.5rem; word-break: break-all; }
._ksAwcHyw-links a:hover { _QPcUWqjs-decoration: underline; }
._ksAwcHyw-links span { _txyQCZmW: var(--_QPcUWqjs-light); }
#visitorPasswordPrompt { _QPcUWqjs-align: center; }
#visitorPasswordPrompt h3 { _txyQCZmW: var(--primary-_txyQCZmW); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _txyQCZmW: var(--_QPcUWqjs-light); margin-bottom: 1.5rem; }
._hbQBVofZ-input-group { display: flex; gap: 10px; max-_mczmtATk: 400px; margin: 0 auto; }
._hbQBVofZ-input-group input { flex-grow: 1; _QPcUWqjs-align: center; }
._hbQBVofZ-input-group .btn { margin-_BuRkXIGj: 0; }
._BNYcfafk-actions-_fcTvggII { _QPcUWqjs-align: center; margin-bottom: 1.5rem; }
._BNYcfafk-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._BNYcfafk-api-buttons .btn { margin: 0; _mczmtATk: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_SsvdCJRS 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 _SEwFexun, .form-grid-control textarea { _mczmtATk: 100%; background-_txyQCZmW: var(--light-bg); border: 1px solid var(--border-_txyQCZmW); border-radius: var(--border-radius-sm); _txyQCZmW: var(--_QPcUWqjs-_txyQCZmW); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_txyQCZmW 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _SEwFexun:focus, .form-grid-control textarea:focus { border-_txyQCZmW: var(--primary-_txyQCZmW); box-shadow: 0 0 0 2px rgba(var(--primary-_txyQCZmW-rgb), 0.2); outline: none; }
.form-grid-control input[_gnrLqmGR="_txyQCZmW"] { min-_mczmtATk: auto; padding: 2px; _mczmtATk: 2.5em; height: 2.5em; }
.form-grid-control input[_gnrLqmGR="checkbox"] { _mczmtATk: auto; flex-shrink: 0; height: 1.2em; _mczmtATk: 1.2em; }
.form-grid-control ._zXIXaqAi-input { _mczmtATk: 80px; _QPcUWqjs-align: right; }
.tooltip-_ezqnMUbR { display: inline-flex; _mczmtATk: 16px; height: 16px; align-items: center; justify-_SsvdCJRS: center; background-_txyQCZmW: var(--secondary-_txyQCZmW); _txyQCZmW: var(--_SsvdCJRS-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_SEwFexun: none; }
#tooltip-popup { position: fixed; background-_txyQCZmW: #383c4a; _txyQCZmW: #fff; padding: 10px 15px; border-radius: 6px; z-_wwlzKXJs: 10001; font-size: 0.85em; max-_mczmtATk: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_txyQCZmW); pointer-events: none; }
#custom-fields-_fcTvggII .form-grid-control { gap: 5px; } #custom-fields-_fcTvggII .form-grid-control input { flex: 1; }
.parameter-_HhXBufsA-_lbVbfSri { border: 1px solid var(--border-_txyQCZmW); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_HhXBufsA-_pkdgfJhP { display: flex; justify-_SsvdCJRS: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_HhXBufsA-_pkdgfJhP input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_sGQIyBMq: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._QPcUWqjs-_txyQCZmW-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _mczmtATk: 100%; }
._QPcUWqjs-_txyQCZmW-grid input[_gnrLqmGR="_txyQCZmW"] { grid-column: 1 / 2; }
._QPcUWqjs-_txyQCZmW-grid input[_gnrLqmGR="_QPcUWqjs"], ._QPcUWqjs-_txyQCZmW-grid textarea { grid-column: 2 / 3; }
#_zjETDBuF .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_zjETDBuF .btn-group { display: flex; }
#_zjETDBuF .sub-btn { flex-grow: 1; margin: 0; }
#_zjETDBuF ._pflbzbMs-btn { flex-shrink: 0; margin-_BuRkXIGj: -1px; border-_sGQIyBMq-_BuRkXIGj-radius: 0; border-bottom-_BuRkXIGj-radius: 0; }
#_CZSVKxtl .modal-_SsvdCJRS { max-_mczmtATk: 300px; background: white; padding: 1rem; _QPcUWqjs-align: center; }
#qrCodeImg { max-_mczmtATk: 100%; }
@media (max-_mczmtATk: 768px) {
html { font-size: 15px; } ._ksAwcHyw-_fcTvggII { padding: 0 0.8rem; } _pkdgfJhP { margin-_sGQIyBMq: 2.5rem; margin-bottom: 1.5rem; } #_NxLMPkST { _sGQIyBMq: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_jcusQaLw>
<_jcusQaLw _DcLsgNGi="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_SsvdCJRS-bg: #FFFFFF; --border-_txyQCZmW: #DCDFE6; --_QPcUWqjs-_txyQCZmW: #303133; --_QPcUWqjs-light: #606266; }
.theme-light .card { background-_txyQCZmW: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_txyQCZmW: #F5F7FA; }
.theme-light tbody tr:hover { background-_txyQCZmW: #ECF5FF; }
.theme-matrix { --primary-_txyQCZmW: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_SsvdCJRS-bg: #0D0208; --border-_txyQCZmW: #00FF41; --_QPcUWqjs-_txyQCZmW: #00FF41; --_QPcUWqjs-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_txyQCZmW: rgba(0, 20, 0, 0.7); _QPcUWqjs-shadow: 0 0 5px var(--primary-_txyQCZmW); backdrop-filter: none; }
.theme-matrix th { background-_txyQCZmW: #000; }
.theme-matrix tbody tr:hover { background-_txyQCZmW: #010; }
.theme-matrix .btn { _QPcUWqjs-shadow: none; _txyQCZmW: #000; }
.theme-matrix .btn-outline { background-_txyQCZmW: transparent; }
.theme-modern-glass { --primary-_txyQCZmW: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_SsvdCJRS-bg: rgba(30, 30, 40, 0.6); --border-_txyQCZmW: rgba(255, 255, 255, 0.2); --_QPcUWqjs-_txyQCZmW: #F0F0F0; --_QPcUWqjs-light: #A0A0B0; --border-radius-md: 12px; }
_GPVckCXD.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-_txyQCZmW: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_SsvdCJRS-bg: rgba(30, 30, 40, 0.6); --border-_txyQCZmW: rgba(255, 255, 255, 0.2); --_QPcUWqjs-_txyQCZmW: #F0F0F0; --_QPcUWqjs-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_txyQCZmW: var(--_SsvdCJRS-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_txyQCZmW); }
.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-_txyQCZmW: rgba(0,0,0,0.3); border-right-_txyQCZmW: 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); _QPcUWqjs-shadow: 0 1px 2px rgba(0,0,0,0.2); _txyQCZmW: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_txyQCZmW: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _QPcUWqjs-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_txyQCZmW); border-_txyQCZmW: var(--primary-_txyQCZmW); _txyQCZmW: #fff; }
.glassy-components _pkdgfJhP h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _QPcUWqjs; -webkit-_QPcUWqjs-fill-_txyQCZmW: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _txyQCZmW: transparent; }
.theme-aurora-glass { --primary-_txyQCZmW: #38bdf8; --light-bg: #0c0a09; --_SsvdCJRS-bg: rgba(23, 23, 23, 0.5); --border-_txyQCZmW: rgba(255, 255, 255, 0.15); --_QPcUWqjs-_txyQCZmW: #f2f2f2; --_QPcUWqjs-light: #a3a3a3; }
_GPVckCXD.theme-aurora-glass::before { _SsvdCJRS: ''; position: fixed; _sGQIyBMq: 0; _BuRkXIGj: 0; _mczmtATk: 100%; height: 100%; z-_wwlzKXJs: -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-_txyQCZmW: #08fdd8; --light-bg: #010409; --_SsvdCJRS-bg: rgba(22, 27, 34, 0.6); --border-_txyQCZmW: rgba(139, 148, 158, 0.3); --_QPcUWqjs-_txyQCZmW: #e6edf3; --_QPcUWqjs-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_txyQCZmW), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_txyQCZmW-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_txyQCZmW-rgb), 0.5); }
.theme-marble-light { --primary-_txyQCZmW: #bfa37c; --light-bg: #f7f5f2; --_SsvdCJRS-bg: #ffffff; --border-_txyQCZmW: #e0dcd5; --_QPcUWqjs-_txyQCZmW: #3d3a36; --_QPcUWqjs-light: #6b6661; }
_GPVckCXD.theme-marble-light { background-image: _XEkiYzCY('_odczUsYu:image/svg+xml,%3Csvg _mczmtATk="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-_txyQCZmW: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_jcusQaLw>
</head><_GPVckCXD _DcLsgNGi="pageBody">
<_gcPKIqTX _DcLsgNGi="background-_gcPKIqTX"></_gcPKIqTX>
<div _DcLsgNGi="_pvRKyRHj">
<div class="modal-_SsvdCJRS">
<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 _gnrLqmGR="_hbQBVofZ" _DcLsgNGi="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _gnrLqmGR="_hbQBVofZ" _DcLsgNGi="confirmPassword"></div></div>
<div class="modal-buttons"><button _DcLsgNGi="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_ksAwcHyw-_fcTvggII">
<button _DcLsgNGi="_NxLMPkST" class="btn btn-outline"></button>
<div _DcLsgNGi="marquee-_fcTvggII"><div _DcLsgNGi="marquee-_QPcUWqjs"></div></div>
<_pkdgfJhP><h1 _DcLsgNGi="pageTitle"></h1></_pkdgfJhP>
<div class="card" _DcLsgNGi="visitorPasswordPrompt" _jcusQaLw="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_hbQBVofZ-input-group">
<input _gnrLqmGR="_hbQBVofZ" _DcLsgNGi="visitorPasswordEntry" _xIqbWBRa="访客密码">
<button _DcLsgNGi="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _DcLsgNGi="_DnmLZEba" _jcusQaLw="display: block;">
<div class="card progress-section">
<div _DcLsgNGi="progressDisplay">
<progress _DcLsgNGi="_aXssUZXG" _LYHZofZQ="0" max="100"></progress>
<div _DcLsgNGi="status">正在初始化...</div>
</div>
</div>
<div class="card _ksAwcHyw-download-section">
<div class="section-_pkdgfJhP"><h2 _DcLsgNGi="appDownloadTitleEl"></h2></div>
<div class="_ksAwcHyw-download-buttons">
<button class="btn" _odczUsYu-_okHjXMbJ="android">安卓客户端</button>
<button class="btn" _odczUsYu-_okHjXMbJ="ios">苹果客户端</button>
<button class="btn" _odczUsYu-_okHjXMbJ="windows">Windows客户端</button>
<button class="btn" _odczUsYu-_okHjXMbJ="mac">Mac客户端</button>
</div>
</div>
<div class="card _BNYcfafk-section" _DcLsgNGi="_jXgBnlHm" _jcusQaLw="display:none;">
<div class="section-_pkdgfJhP">
<h2 _DcLsgNGi="liveTitleEl"></h2>
<div class="generator-info" _DcLsgNGi="liveGeneratorInfo"></div>
</div>
<div _DcLsgNGi="_RivfiXcL" class="_BNYcfafk-actions-_fcTvggII" _jcusQaLw="display: none;">
<div class="_BNYcfafk-api-buttons">
<button _DcLsgNGi="copyIpApiBtn" class="btn">复制 IP API</button>
<button _DcLsgNGi="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _DcLsgNGi="resultsTable">
<thead><tr><th _DcLsgNGi="tableHeader1El"></th><th _DcLsgNGi="tableHeader2El"></th><th _DcLsgNGi="tableHeader3El"></th><th _DcLsgNGi="tableHeader4El"></th><th _DcLsgNGi="tableHeader5El"></th><th _DcLsgNGi="tableHeader6El"></th><th _DcLsgNGi="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _DcLsgNGi="_YtVPQALM" _jcusQaLw="display:none;">
<div class="section-_pkdgfJhP"><h2 _DcLsgNGi="cachedTitleEl"></h2><div class="generator-info" _DcLsgNGi="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _DcLsgNGi="cachedResultsTable">
<thead><tr><th _DcLsgNGi="cachedTableHeader1El"></th><th _DcLsgNGi="cachedTableHeader2El"></th><th _DcLsgNGi="cachedTableHeader3El"></th><th _DcLsgNGi="cachedTableHeader4El"></th><th _DcLsgNGi="cachedTableHeader5El"></th><th _DcLsgNGi="cachedTableHeader6El"></th><th _DcLsgNGi="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _DcLsgNGi="notificationTooltip" class="tooltip-notification"></div>
<div _DcLsgNGi="_hpscAYvf">
<div class="modal-_SsvdCJRS">
<h3>修改参数</h3>
<div _jcusQaLw="display: flex; border-bottom: 1px solid var(--border-_txyQCZmW); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_BJmAKAck(event, 'general-_uoEAdaNx')">通用设置</button>
<button class="tab-button" onclick="_BJmAKAck(event, '_JUSjHdfT-_uoEAdaNx')">链接设置</button>
<button class="tab-button" onclick="_BJmAKAck(event, 'fine-grained-_uoEAdaNx')">IP源设置</button>
<button class="tab-button" onclick="_BJmAKAck(event, 'advanced-_uoEAdaNx')">高级设置</button>
</div>
<div _DcLsgNGi="general-_uoEAdaNx" class="tab-_SsvdCJRS" _jcusQaLw="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_SEwFexun _DcLsgNGi="themeSelect">
<_BOSkrYXL _LYHZofZQ="theme-aurora-glass">极光-玻璃质感</_BOSkrYXL>
<_BOSkrYXL _LYHZofZQ="theme-particles-glass">粒子-玻璃质感</_BOSkrYXL>
<_BOSkrYXL _LYHZofZQ="theme-modern-glass">现代-玻璃质感</_BOSkrYXL>
<_BOSkrYXL _LYHZofZQ="theme-cyberpunk-glass">赛博朋克-玻璃质感</_BOSkrYXL>
<_BOSkrYXL _LYHZofZQ="theme-dark-particles">暗色-粒子背景</_BOSkrYXL>
<_BOSkrYXL _LYHZofZQ="theme-dark-bing">暗色-必应壁纸</_BOSkrYXL>
<_BOSkrYXL _LYHZofZQ="theme-light">亮色-简约</_BOSkrYXL>
<_BOSkrYXL _LYHZofZQ="theme-light-bing">亮色-必应壁纸</_BOSkrYXL>
<_BOSkrYXL _LYHZofZQ="theme-marble-light">简约大理石-亮色</_BOSkrYXL>
<_BOSkrYXL _LYHZofZQ="theme-matrix">矩阵-代码雨</_BOSkrYXL>
</_SEwFexun>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _gnrLqmGR="_txyQCZmW" _DcLsgNGi="primaryColorInput">
<span _jcusQaLw="_mczmtATk: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _gnrLqmGR="_txyQCZmW" _DcLsgNGi="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jcusQaLw="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _jcusQaLw="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_QPcUWqjs-_txyQCZmW-grid"><input _gnrLqmGR="_txyQCZmW" _DcLsgNGi="colorInput_title"><textarea _DcLsgNGi="textInput_title" _scgdWzRP="1" _xIqbWBRa="页面主标题"></textarea></div>
<div class="_QPcUWqjs-_txyQCZmW-grid"><input _gnrLqmGR="_txyQCZmW" _DcLsgNGi="colorInput_loginButton"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="textInput_loginButton" _xIqbWBRa="登录按钮文本"></div>
<div class="_QPcUWqjs-_txyQCZmW-grid"><input _gnrLqmGR="_txyQCZmW" _DcLsgNGi="colorInput_appDownloadTitle"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="textInput_appDownloadTitle" _xIqbWBRa="APP下载标题"></div>
<div class="_QPcUWqjs-_txyQCZmW-grid"><input _gnrLqmGR="_txyQCZmW" _DcLsgNGi="colorInput_liveTitle"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="textInput_liveTitle" _xIqbWBRa="本次结果标题"></div>
<div class="_QPcUWqjs-_txyQCZmW-grid"><input _gnrLqmGR="_txyQCZmW" _DcLsgNGi="colorInput_cachedTitle"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="textInput_cachedTitle" _xIqbWBRa="上次结果标题"></div>
<div class="_QPcUWqjs-_txyQCZmW-grid"><input _gnrLqmGR="_txyQCZmW" _DcLsgNGi="colorInput_tableHeader"><input _gnrLqmGR="_QPcUWqjs" _LYHZofZQ="表格头部文本颜色" readonly _jcusQaLw="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jcusQaLw="align-self: start;"><label>公告栏设置</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _jcusQaLw="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _DcLsgNGi="announcementText" _xIqbWBRa="在此输入公告内容" _scgdWzRP="3"></textarea>
<div _jcusQaLw="display: flex; justify-_SsvdCJRS: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _jcusQaLw="display: flex; align-items: center; gap: 5px;"><input _gnrLqmGR="checkbox" _DcLsgNGi="enableMarquee"> 顶部走马灯</label>
<label _jcusQaLw="display: flex; align-items: center; gap: 5px;"><input _gnrLqmGR="checkbox" _DcLsgNGi="enablePopup"> 右上角弹窗</label>
<div _DcLsgNGi="popupDurationContainer" _jcusQaLw="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _gnrLqmGR="number" _DcLsgNGi="popupDuration" _jcusQaLw="_mczmtATk: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _DcLsgNGi="_JUSjHdfT-_uoEAdaNx" class="tab-_SsvdCJRS">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="converterServiceUrlInput" _xIqbWBRa="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _gnrLqmGR="number" _DcLsgNGi="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _jcusQaLw="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _DcLsgNGi="subscriptionIdCharset" _scgdWzRP="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-_ezqnMUbR" _odczUsYu-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _jcusQaLw="justify-_SsvdCJRS: flex-start;"><input _gnrLqmGR="checkbox" _DcLsgNGi="enableItemLinkCheckbox"></div>
</div>
<div _DcLsgNGi="itemLinkConfigGroup" _jcusQaLw="display:none; margin-_sGQIyBMq: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _jcusQaLw="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="定义分享链接格式。可用占位符: {_SYaXvwUD}, {_ZoXLSmoM}, {_lVEfmLNt}, {rank}, {_WdCxAvPT}, {_JnJDyPjM}, {_rlhanaoU}, {_VNxaRuQa}, {_bJEcHKTk}。">?</span></div>
<div class="form-grid-control"><textarea _DcLsgNGi="itemLinkTemplateInput" _scgdWzRP="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_SEwFexun _DcLsgNGi="parameterSelectionMode"></_SEwFexun></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _DcLsgNGi="parameter-sets-_fcTvggII"></div><button _gnrLqmGR="button" _DcLsgNGi="add-parameter-_HhXBufsA-btn" class="btn btn-outline" _jcusQaLw="margin-_sGQIyBMq: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jcusQaLw="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _DcLsgNGi="custom-fields-_fcTvggII" _jcusQaLw="_mczmtATk: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _jcusQaLw="justify-_SsvdCJRS: flex-start;"><button _gnrLqmGR="button" _DcLsgNGi="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _DcLsgNGi="fine-grained-_uoEAdaNx" class="tab-_SsvdCJRS">
<div class="form-grid-label" _jcusQaLw="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _jcusQaLw="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_SsvdCJRS: flex-start;">
<label><input _gnrLqmGR="checkbox" _DcLsgNGi="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _gnrLqmGR="checkbox" _DcLsgNGi="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _DcLsgNGi="fine-grained-sources-_fcTvggII"></div><button _gnrLqmGR="button" _DcLsgNGi="add-fine-grained-_bLrZkTdW-btn" class="btn btn-outline" _jcusQaLw="margin-_sGQIyBMq: 10px;">添加地区</button></div>
</div>
<div _DcLsgNGi="advanced-_uoEAdaNx" class="tab-_SsvdCJRS">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _gnrLqmGR="checkbox" _DcLsgNGi="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _DcLsgNGi="resolvedDomainsGroup" _jcusQaLw="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _DcLsgNGi="resolvedDomainsInput" _xIqbWBRa="留空则使用内置默认域名" _scgdWzRP="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-_ezqnMUbR" _odczUsYu-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _gnrLqmGR="checkbox" _DcLsgNGi="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _DcLsgNGi="customNodesGroup" _jcusQaLw="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _DcLsgNGi="customNodesInput" _xIqbWBRa="一行一个地址,支持域名、IPv4、IPv6。" _scgdWzRP="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-_ezqnMUbR" _odczUsYu-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _gnrLqmGR="number" _DcLsgNGi="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _gnrLqmGR="number" _DcLsgNGi="topNInput"></div>
<div class="form-grid-label" _jcusQaLw="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _jcusQaLw="display: none;"><input _gnrLqmGR="number" _DcLsgNGi="latencyRangeMinInput" _xIqbWBRa="最小"><span>-</span><input _gnrLqmGR="number" _DcLsgNGi="latencyRangeMaxInput" _xIqbWBRa="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _jcusQaLw="justify-_SsvdCJRS: flex-start;"><input _gnrLqmGR="checkbox" _DcLsgNGi="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-_ezqnMUbR" _odczUsYu-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _gnrLqmGR="number" _DcLsgNGi="geoLocationRetriesInput" _jcusQaLw="_mczmtATk: 80px;"> <span>次</span>
<div _jcusQaLw="display: flex; align-items: center; gap: 5px; margin-_BuRkXIGj: 20px;">
<input _gnrLqmGR="checkbox" _DcLsgNGi="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-_ezqnMUbR" _odczUsYu-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_rlhanaoU:_ZoXLSmoM' 或 '_rlhanaoU'。">?</span></div>
<div class="form-grid-control"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="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-_ezqnMUbR" _odczUsYu-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _jcusQaLw="justify-_SsvdCJRS: flex-start;"><input _gnrLqmGR="checkbox" _DcLsgNGi="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _DcLsgNGi="websocketStreamerGroup" _jcusQaLw="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="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-_ezqnMUbR" _odczUsYu-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _jcusQaLw="justify-_SsvdCJRS: flex-start;"><input _gnrLqmGR="checkbox" _DcLsgNGi="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="启用 /_SYaXvwUD 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _jcusQaLw="justify-_SsvdCJRS: flex-start;"><input _gnrLqmGR="checkbox" _DcLsgNGi="enableApiCheckbox"></div>
<div class="form-grid-control-full" _DcLsgNGi="apiConfigGroup" _jcusQaLw="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="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-_ezqnMUbR" _odczUsYu-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _jcusQaLw="justify-_SsvdCJRS: flex-start;"><input _gnrLqmGR="checkbox" _DcLsgNGi="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _DcLsgNGi="customSubPathGroup" _jcusQaLw="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="customSubPathInput" _xIqbWBRa="例如: 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-_ezqnMUbR" _odczUsYu-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _jcusQaLw="justify-_SsvdCJRS: flex-start;"><input _gnrLqmGR="checkbox" _DcLsgNGi="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _DcLsgNGi="visitorPasswordGroup" _jcusQaLw="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jcusQaLw="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_ezqnMUbR" _odczUsYu-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _jcusQaLw="flex-direction: column; align-items: stretch; gap: 8px;"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="botTokenInput" _xIqbWBRa="Telegram Bot Token"><input _gnrLqmGR="_QPcUWqjs" _DcLsgNGi="chatIdInput" _xIqbWBRa="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _jcusQaLw="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _jcusQaLw="flex-direction: column; align-items: stretch; gap: 8px;"><input _gnrLqmGR="_hbQBVofZ" _DcLsgNGi="oldPasswordInput" _xIqbWBRa="旧密码"><input _gnrLqmGR="_hbQBVofZ" _DcLsgNGi="newPasswordInput" _xIqbWBRa="新密码 (至少6位)"><button _DcLsgNGi="changePasswordBtn" class="btn" _jcusQaLw="align-self: flex-start; margin-_BuRkXIGj: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _DcLsgNGi="closeModalBtn" class="btn btn-outline">关闭</button><button _DcLsgNGi="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _DcLsgNGi="_JhJnuFbH">
<div class="_ksAwcHyw-modal-_SsvdCJRS">
<div class="_ksAwcHyw-modal-_pkdgfJhP"><h3 _DcLsgNGi="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_ksAwcHyw-modal-_GPVckCXD" _DcLsgNGi="appModalBody"></div>
</div>
</div>
<div _DcLsgNGi="_zjETDBuF">
<div class="modal-_SsvdCJRS">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _odczUsYu-sub-_gnrLqmGR="coreEngine">Xray</button><button class="btn _pflbzbMs-btn" _odczUsYu-sub-_gnrLqmGR="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _odczUsYu-sub-_gnrLqmGR="coreProfile">Sing-Box</button><button class="btn _pflbzbMs-btn" _odczUsYu-sub-_gnrLqmGR="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _odczUsYu-sub-_gnrLqmGR="configProfile">Clash</button><button class="btn _pflbzbMs-btn" _odczUsYu-sub-_gnrLqmGR="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _odczUsYu-sub-_gnrLqmGR="policyProfile">Surge</button><button class="btn _pflbzbMs-btn" _odczUsYu-sub-_gnrLqmGR="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _jcusQaLw="justify-_SsvdCJRS: center;"><button class="btn btn-outline" _DcLsgNGi="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _DcLsgNGi="_CZSVKxtl">
<div class="modal-_SsvdCJRS">
<img _DcLsgNGi="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _GdxOlvXs = {
isValid: (_SYaXvwUD) => _GdxOlvXs.isIPv4(_SYaXvwUD) || _GdxOlvXs.isIPv6(_SYaXvwUD),
isIPv4: (_SYaXvwUD) => {
if (typeof _SYaXvwUD !== 'string') return false;
const _RQfNgTIz = _SYaXvwUD.split('.');
if (_RQfNgTIz._ZGDZcNxG !== 4) return false;
return _RQfNgTIz.every(_UmwfftGd => {
const _VthylwOD = parseInt(_UmwfftGd, 10);
return !isNaN(_VthylwOD) && _VthylwOD >= 0 && _VthylwOD <= 255 && String(_VthylwOD) === _UmwfftGd;
});
},
isIPv6: (_SYaXvwUD) => {
if (typeof _SYaXvwUD !== '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]))$/_lciQxfJF.test(_SYaXvwUD);
},
toLong4: (_SYaXvwUD) => _SYaXvwUD.split('.').reduce((acc, octet, _lciQxfJF) => acc + (parseInt(octet) << (8*(3-_lciQxfJF))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_SYaXvwUD) => {
try {
const _lYJcYkGn = _SYaXvwUD.split('/')[0];
const _RQfNgTIz = _lYJcYkGn.split('::');
if (_RQfNgTIz._ZGDZcNxG > 2) return 0n;
let _kKrwmlAQ = [];
if (_RQfNgTIz[0]) {
_kKrwmlAQ = _RQfNgTIz[0].split(':');
}
let _vinHCBBr = [];
if (_RQfNgTIz._ZGDZcNxG > 1 && _RQfNgTIz[1]) {
_vinHCBBr = _RQfNgTIz[1].split(':');
}
if (_kKrwmlAQ._ZGDZcNxG + _vinHCBBr._ZGDZcNxG > 8) return 0n;
const _dxxCfxJF = 8 - (_kKrwmlAQ._ZGDZcNxG + _vinHCBBr._ZGDZcNxG);
const _HnVOfKdq = [
..._kKrwmlAQ,
...Array(_dxxCfxJF).fill('0'),
..._vinHCBBr
].map(_UmwfftGd => _UmwfftGd || '0');
while(_HnVOfKdq._ZGDZcNxG < 8) {
_HnVOfKdq.push('0');
}
let _dYiVvVpP = 0n;
for (const _UmwfftGd of _HnVOfKdq) {
if (_UmwfftGd._ZGDZcNxG > 4) return 0n;
const _LYHZofZQ = BigInt('0x' + _UmwfftGd);
_dYiVvVpP = (_dYiVvVpP << 16n) | _LYHZofZQ;
}
return _dYiVvVpP;
} catch(_QQyugJdA) {
return 0n;
}
},
fromBigInt6: (_dYiVvVpP) => {
if (typeof _dYiVvVpP !== '_dYiVvVpP' || _dYiVvVpP < 0n) return null;
const _RQfNgTIz = [];
for (let _lciQxfJF = 0; _lciQxfJF < 8; _lciQxfJF++) {
_RQfNgTIz.unshift((_dYiVvVpP & 0xFFFFn).toString(16));
_dYiVvVpP >>= 16n;
}
let _FbKnTlpv = { start: -1, _edOUVKYR: 0 };
let _tnYvRFZG = { start: -1, _edOUVKYR: 0 };
for (let _lciQxfJF = 0; _lciQxfJF < 8; _lciQxfJF++) {
if (_RQfNgTIz[_lciQxfJF] === '0') {
if (_tnYvRFZG.start === -1) _tnYvRFZG.start = _lciQxfJF;
_tnYvRFZG._edOUVKYR++;
} else {
if (_tnYvRFZG._edOUVKYR > _FbKnTlpv._edOUVKYR) _FbKnTlpv = { ..._tnYvRFZG };
_tnYvRFZG = { start: -1, _edOUVKYR: 0 };
}
}
if (_tnYvRFZG._edOUVKYR > _FbKnTlpv._edOUVKYR) _FbKnTlpv = { ..._tnYvRFZG };
if (_FbKnTlpv._edOUVKYR > 1) {
_RQfNgTIz.splice(_FbKnTlpv.start, _FbKnTlpv._edOUVKYR, '');
if (_FbKnTlpv.start === 0) _RQfNgTIz.unshift('');
if (_FbKnTlpv.start + _FbKnTlpv._edOUVKYR === 8) _RQfNgTIz.push('');
}
return _RQfNgTIz.join(':');
},
cidrToRange: (cidr, _TsJebgAC = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _jCjxpFZw = parseInt(bitsStr, 10);
const _jyLPkfZI = new Set();
if (_GdxOlvXs.isIPv4(range)) {
if (isNaN(_jCjxpFZw) || _jCjxpFZw < 8 || _jCjxpFZw > 32) return [];
if (_jCjxpFZw === 32) return [range];
const _ioiTMKrj = _GdxOlvXs.toLong4(range);
const _qpZmjfyQ = (0xFFFFFFFF << (32 - _jCjxpFZw)) >>> 0;
const _sObxeFNm = _ioiTMKrj & _qpZmjfyQ;
const _OSEgLULz = 1 << (32 - _jCjxpFZw);
if (_OSEgLULz <= 2) return [];
const _yoOMoMQu = Math.min(_TsJebgAC, _OSEgLULz - 2);
let _aBrlPpcT = 0;
while (_jyLPkfZI.size < _yoOMoMQu && _aBrlPpcT < _yoOMoMQu * 5) {
const _ItZGmnAJ = Math.floor(Math.random() * (_OSEgLULz - 2)) + 1;
_jyLPkfZI.add(_GdxOlvXs.fromLong4((_sObxeFNm + _ItZGmnAJ) >>> 0));
_aBrlPpcT++;
}
return Array.from(_jyLPkfZI);
} else if (_GdxOlvXs.isIPv6(range)) {
if (isNaN(_jCjxpFZw) || _jCjxpFZw < 16 || _jCjxpFZw > 128) return [];
if (_jCjxpFZw === 128) return [range];
const _dBpibuMF = _GdxOlvXs.toBigInt6(range);
const _qpZmjfyQ = (2n ** BigInt(128 - _jCjxpFZw) - 1n);
const _sObxeFNm = _dBpibuMF & ~_qpZmjfyQ;
const _weTYKOtE = 2n ** BigInt(128 - _jCjxpFZw);
if (_weTYKOtE <= 2n) return [];
let _aBrlPpcT = 0;
while (_jyLPkfZI.size < _TsJebgAC && _aBrlPpcT < _TsJebgAC * 5) {
const _Bswrezuw = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_Bswrezuw);
let _OHthUHoA = 0n;
for (const _OiiIYvnl of _Bswrezuw) {
_OHthUHoA = (_OHthUHoA << 8n) | BigInt(_OiiIYvnl);
}
const _ItZGmnAJ = _OHthUHoA % (_weTYKOtE - 2n) + 1n;
_jyLPkfZI.add(_GdxOlvXs.fromBigInt6(_sObxeFNm + _ItZGmnAJ));
_aBrlPpcT++;
}
return Array.from(_jyLPkfZI);
}
return [];
} catch(_QQyugJdA) {
console.error(`CIDR to range failed for ${cidr}:`, _QQyugJdA);
return [];
}
}
};
function _DhfHGaLL(_dAKlgFwo, _EOZWCAFD) {
const _JtydJCAS = {};
const _OiYnzKXQ = Object._OiYnzKXQ(_EOZWCAFD);
const _RQfNgTIz = _OiYnzKXQ.map(_zjDlvhQA => {
const _stRYcQsO = _dAKlgFwo * (_EOZWCAFD[_zjDlvhQA] / 100);
return { _zjDlvhQA, _TsJebgAC: Math.floor(_stRYcQsO), remainder: _stRYcQsO - Math.floor(_stRYcQsO) };
});
let _EoNjtmZY = _RQfNgTIz.reduce((acc, _UmwfftGd) => acc + _UmwfftGd._TsJebgAC, 0);
_RQfNgTIz.sort((a, b) => b.remainder - a.remainder);
let _jqhDDzaY = _dAKlgFwo - _EoNjtmZY;
for (let _lciQxfJF = 0; _lciQxfJF < _jqhDDzaY; _lciQxfJF++) {
_RQfNgTIz[_lciQxfJF % _RQfNgTIz._ZGDZcNxG]._TsJebgAC++;
}
for (const _UmwfftGd of _RQfNgTIz) {
_JtydJCAS[_UmwfftGd._zjDlvhQA] = _UmwfftGd._TsJebgAC;
}
return _JtydJCAS;
}
const _eZYvVIVX = __PAGE_DATA_JSON__;
const _xxuYDtkf = _eZYvVIVX._OXTUkWkN;
const _yFNzKOSo = _eZYvVIVX.status;
const _NFbMwRQB = __ALL_CF_CIDR_LIST_JSON__;
const _nZmXWPxz = __BALANCED_CF_CIDR_LIST_JSON__;
const _ooEycCok = __DEFAULT_DOMAINS_LIST_JSON__;
const _PgMQxtOI = __COUNTRY_MAP_JSON__;
const _RLhvrUux = _PgMQxtOI;
const _PYifUrij = 2500;
const _iqpLASuv = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _DnmLZEba = document.getElementById('_DnmLZEba');
const _aXssUZXG = document.getElementById('_aXssUZXG');
const _BQGjIcEk = document.getElementById('status');
const _jXgBnlHm = document.getElementById('_jXgBnlHm');
const _DOVOMdSX = document.getElementById('resultsTable').querySelector('tbody');
const _YtVPQALM = document.getElementById('_YtVPQALM');
const _KcfzokjD = document.getElementById('cachedResultsTable').querySelector('tbody');
const _zukamPkf = document.getElementById('notificationTooltip');
const _NxLMPkST = document.getElementById('_NxLMPkST');
const _hpscAYvf = document.getElementById('_hpscAYvf');
const _JhJnuFbH = document.getElementById('_JhJnuFbH');
const _zjETDBuF = document.getElementById('_zjETDBuF');
const _CZSVKxtl = document.getElementById('_CZSVKxtl');
const _pvRKyRHj = document.getElementById('_pvRKyRHj');
const _RivfiXcL = document.getElementById('_RivfiXcL');
let _ZTrRBQRa = null;
let _snNJNbGk = null;
let _QnSRUQAf = [];
let _bWbBKKNN = false;
let _VUmDLUqN = null;
function _rKppGbxh(_MFiVFTtm, _mfFVdADA) {
const _bWWXFWou=parseInt(_MFiVFTtm.slice(1),16),t=_mfFVdADA<0?0:255,p=_mfFVdADA<0?_mfFVdADA*-1:_mfFVdADA,R=_bWWXFWou>>16,G=_bWWXFWou>>8&0x00FF,B=_bWWXFWou&0x0000FF;
const _PFEcrONI = Math.round((t-R)*p)+R;
const _QetVeBfi = Math.round((t-G)*p)+G;
const _yGgzNyTR = Math.round((t-B)*p)+B;
return `rgb(${_PFEcrONI.toString()}, ${_QetVeBfi.toString()}, ${_yGgzNyTR.toString()})`;
}
function _QlRPDJDP(_uoEAdaNx) {
const _KlIboJVh = _kxrafZxd(_uoEAdaNx.primaryColor);
if(_KlIboJVh) {
document.documentElement._jcusQaLw.setProperty('--primary-_txyQCZmW-rgb', `${_KlIboJVh.r},${_KlIboJVh.g},${_KlIboJVh.b}`);
}
document.documentElement._jcusQaLw.setProperty('--primary-_txyQCZmW', _uoEAdaNx.primaryColor);
document.documentElement._jcusQaLw.setProperty('--primary-hover', _rKppGbxh(_uoEAdaNx.primaryColor, -0.1));
document.documentElement._jcusQaLw.setProperty('--primary-gradient-start', _rKppGbxh(_uoEAdaNx.primaryColor, 0.1));
document.documentElement._jcusQaLw.setProperty('--primary-gradient-end', _rKppGbxh(_uoEAdaNx.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _uoEAdaNx.texts.title;
document.title = _uoEAdaNx.texts.title;
_NxLMPkST.innerText = _ZTrRBQRa ? _uoEAdaNx.texts.loginButtonSuccess : _uoEAdaNx.texts.loginButton;
_NxLMPkST._jcusQaLw._txyQCZmW = _uoEAdaNx.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _uoEAdaNx.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _uoEAdaNx.texts.liveTitle;
document.getElementById('liveTitleEl')._jcusQaLw._txyQCZmW = _uoEAdaNx.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _uoEAdaNx.texts.cachedTitle;
document.getElementById('cachedTitleEl')._jcusQaLw._txyQCZmW = _uoEAdaNx.colors.cachedTitle;
const _VVXSjEXI = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_VVXSjEXI.forEach((_DcLsgNGi, _wwlzKXJs) => {
const _NIxsGCnU = document.getElementById(_DcLsgNGi);
if (_NIxsGCnU) _NIxsGCnU.innerText = _uoEAdaNx.texts[`tableHeader${_wwlzKXJs + 1}`] || '';
});
const _svIoCsay = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_svIoCsay.forEach((_DcLsgNGi, _wwlzKXJs) => {
const _NIxsGCnU = document.getElementById(_DcLsgNGi);
if (_NIxsGCnU) _NIxsGCnU.innerText = _xxuYDtkf.texts[`tableHeader${_wwlzKXJs + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._jcusQaLw._txyQCZmW = _uoEAdaNx.colors.tableHeader);
document._GPVckCXD.className = '';
document._GPVckCXD.classList.add(_uoEAdaNx.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_uoEAdaNx.theme)) {
document._GPVckCXD.classList.add('glassy-components');
}
document._GPVckCXD._jcusQaLw.backgroundImage = '';
_NUvWgHEi();
if (_uoEAdaNx.theme.includes('particles') || _uoEAdaNx.theme.includes('glass')) {
_tHvRDJjl(_uoEAdaNx.particleColor);
} else if (_uoEAdaNx.theme.includes('bing')) {
document._GPVckCXD._jcusQaLw.backgroundImage = '_XEkiYzCY(/bing-wallpaper)';
}
}
function _BEEsUZXu() {
_ZTrRBQRa = null;
if(_snNJNbGk) clearTimeout(_snNJNbGk);
_QlRPDJDP(_xxuYDtkf);
_HrPpHFlY("登录已超时,请重新登录。", "warning");
}
async function _dtmbpyRZ() {
if (_ZTrRBQRa) {
_hzVcXdyM();
return;
}
const _zwfrtXWR = prompt('请输入管理员密码:');
if (!_zwfrtXWR) return;
try {
const _RemQxrEb = await fetch('/api/verify-_hbQBVofZ', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify({ _hbQBVofZ: _zwfrtXWR })
});
const _QopZTPyD = await _RemQxrEb.json();
if (_QopZTPyD.success) {
_ZTrRBQRa = _zwfrtXWR;
_HrPpHFlY("登录成功!有效期5分钟。", "success");
if (_snNJNbGk) clearTimeout(_snNJNbGk);
_snNJNbGk = setTimeout(_BEEsUZXu, 5 * 60 * 1000);
_QlRPDJDP(_xxuYDtkf);
_hzVcXdyM();
} else {
throw new Error(_QopZTPyD._ZXeikViR || '密码验证失败');
}
} catch (_QQyugJdA) {
_HrPpHFlY(`登录失败: ${_QQyugJdA._ZXeikViR}`, "error");
}
}
function _Asdizgyw() {
if (!_yFNzKOSo._jXEAVLGw) {
_pvRKyRHj._jcusQaLw.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _hbQBVofZ = document.getElementById('initialPassword')._LYHZofZQ;
const _NItqWNzN = document.getElementById('confirmPassword')._LYHZofZQ;
if (_hbQBVofZ !== _NItqWNzN) {
_HrPpHFlY("两次输入的密码不一致!", "error");
return;
}
if (_hbQBVofZ._ZGDZcNxG < 6) {
_HrPpHFlY("密码长度不能少于6位!", "error");
return;
}
try {
const _RemQxrEb = await fetch('/api/_HhXBufsA-_hbQBVofZ', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify({ _hbQBVofZ })
});
const _QopZTPyD = await _RemQxrEb.json();
if (_QopZTPyD.success) {
_HrPpHFlY(_QopZTPyD._ZXeikViR, "success");
setTimeout(() => _WdCxAvPT.reload(), 1500);
} else {
throw new Error(_QopZTPyD._ZXeikViR);
}
} catch(_QQyugJdA) {
_HrPpHFlY(`设置密码失败: ${_QQyugJdA._ZXeikViR}`, "error");
}
});
return;
}
_NxLMPkST.addEventListener('click', _dtmbpyRZ);
document.getElementById('closeModalBtn').addEventListener('click', () => { _hpscAYvf._jcusQaLw.display = 'none'; });
_hpscAYvf.addEventListener('click', (_QQyugJdA) => { if (_QQyugJdA.target === _hpscAYvf) _hpscAYvf._jcusQaLw.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_fcTvggII .fine-grained-_BnATtqBu-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-_fcTvggII .fine-grained-_BnATtqBu-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_ZTrRBQRa) {
_HrPpHFlY("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _PUoeVmcb = [];
document.querySelectorAll('#custom-fields-_fcTvggII .custom-field-_lbVbfSri').forEach(_lbVbfSri => {
const _lVEfmLNt = _lbVbfSri.querySelector('.custom-field-_lVEfmLNt')._LYHZofZQ.trim();
const _LYHZofZQ = _lbVbfSri.querySelector('.custom-field-_LYHZofZQ')._LYHZofZQ.trim();
if (_lVEfmLNt) _PUoeVmcb.push({ _lVEfmLNt, _LYHZofZQ });
});
const _bkDfCtrR = [];
document.querySelectorAll('#parameter-sets-_fcTvggII .parameter-_HhXBufsA-_lbVbfSri').forEach(_lbVbfSri => {
const _lVEfmLNt = _lbVbfSri.querySelector('.param-_HhXBufsA-_lVEfmLNt')._LYHZofZQ.trim();
const _rlhanaoU = _lbVbfSri.querySelector('.param-_HhXBufsA-_rlhanaoU')._LYHZofZQ.trim();
const _VNxaRuQa = _lbVbfSri.querySelector('.param-_HhXBufsA-_VNxaRuQa')._LYHZofZQ.trim();
const _bJEcHKTk = _lbVbfSri.querySelector('.param-_HhXBufsA-_bJEcHKTk')._LYHZofZQ.trim();
if(_lVEfmLNt) _bkDfCtrR.push({ _lVEfmLNt, _rlhanaoU, '_VNxaRuQa': _VNxaRuQa, _bJEcHKTk });
});
const _nRXNJSgu = [];
document.querySelectorAll('#fine-grained-sources-_fcTvggII .fine-grained-_bLrZkTdW-_lbVbfSri').forEach(_lbVbfSri => {
const _WdCxAvPT = _lbVbfSri.querySelector('.fine-grained-_WdCxAvPT')._LYHZofZQ.trim();
const _jyLPkfZI = _lbVbfSri.querySelector('.fine-grained-_jyLPkfZI')._LYHZofZQ.trim();
const _BnATtqBu = _lbVbfSri.querySelector('.fine-grained-_BnATtqBu-cb').checked;
const _zXIXaqAi = parseInt(_lbVbfSri.querySelector('.fine-grained-_zXIXaqAi')._LYHZofZQ, 10) || 0;
const _PvXhwbqX = _lbVbfSri.querySelector('.use-_lVEfmLNt-as-_WdCxAvPT-cb').checked;
if (_WdCxAvPT && _jyLPkfZI) {
_nRXNJSgu.push({ _WdCxAvPT, _jyLPkfZI, _BnATtqBu, _zXIXaqAi, _PvXhwbqX });
}
});
let _VHvzmCey = parseInt(document.getElementById('subscriptionIdLength')._LYHZofZQ, 10);
if (isNaN(_VHvzmCey) || _VHvzmCey < 2) _VHvzmCey = 2;
if (_VHvzmCey > 128) _VHvzmCey = 128;
const _ltbcwkWd = {
theme: document.getElementById('themeSelect')._LYHZofZQ,
primaryColor: document.getElementById('primaryColorInput')._LYHZofZQ,
particleColor: document.getElementById('particleColorInput')._LYHZofZQ,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._LYHZofZQ,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._LYHZofZQ, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._LYHZofZQ, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._LYHZofZQ, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._LYHZofZQ, 10) || 0,
_VQkkNIgW: document.getElementById('converterServiceUrlInput')._LYHZofZQ.trim(),
subscriptionId: {
_ZGDZcNxG: _VHvzmCey,
_ruFhqZpD: document.getElementById('subscriptionIdCharset')._LYHZofZQ.trim()
},
api: {
_BnATtqBu: document.getElementById('enableApiCheckbox').checked,
_ZXeikViR: document.getElementById('apiMessageInput')._LYHZofZQ || '维护中...',
},
ispFilter: {
_BnATtqBu: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._LYHZofZQ, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_BnATtqBu: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_BnATtqBu: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_XEkiYzCY: document.getElementById('websocketStreamerUrlInput')._LYHZofZQ.trim()
},
visitorPassword: {
_BnATtqBu: document.getElementById('enableVisitorPasswordCheckbox').checked,
_hbQBVofZ: document.getElementById('visitorPasswordInput')._LYHZofZQ.trim()
},
customSubPath: {
_BnATtqBu: document.getElementById('enableCustomSubPathCheckbox').checked,
_bJEcHKTk: document.getElementById('customSubPathInput')._LYHZofZQ.trim()
},
itemLink: {
_BnATtqBu: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._LYHZofZQ,
selectionMode: document.getElementById('parameterSelectionMode')._LYHZofZQ,
_bkDfCtrR: _bkDfCtrR,
_PUoeVmcb: _PUoeVmcb,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._LYHZofZQ.trim(),
},
announcement: {
popup: {
_BnATtqBu: document.getElementById('enablePopup').checked,
_QPcUWqjs: document.getElementById('announcementText')._LYHZofZQ,
_GdftYABY: parseInt(document.getElementById('popupDuration')._LYHZofZQ, 10) || 5
},
marquee: {
_BnATtqBu: document.getElementById('enableMarquee').checked,
_QPcUWqjs: document.getElementById('announcementText')._LYHZofZQ
}
},
fineGrained: {
_BnATtqBu: true,
sources: _nRXNJSgu
},
customNodes: {
_BnATtqBu: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._LYHZofZQ
},
texts: {
title: document.getElementById('textInput_title')._LYHZofZQ,
loginButton: document.getElementById('textInput_loginButton')._LYHZofZQ,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._LYHZofZQ,
liveTitle: document.getElementById('textInput_liveTitle')._LYHZofZQ,
cachedTitle: document.getElementById('textInput_cachedTitle')._LYHZofZQ,
},
colors: {
title: document.getElementById('colorInput_title')._LYHZofZQ,
loginButton: document.getElementById('colorInput_loginButton')._LYHZofZQ,
liveTitle: document.getElementById('colorInput_liveTitle')._LYHZofZQ,
cachedTitle: document.getElementById('colorInput_cachedTitle')._LYHZofZQ,
tableHeader: document.getElementById('colorInput_tableHeader')._LYHZofZQ,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._LYHZofZQ.trim(),
chat_id: document.getElementById('chatIdInput')._LYHZofZQ.trim(),
},
};
try {
const _RemQxrEb = await fetch('/api/_OXTUkWkN', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify({ _OXTUkWkN: _ltbcwkWd, adminPassword: _ZTrRBQRa })
});
const _QopZTPyD = await _RemQxrEb.json();
if (_RemQxrEb.ok && _QopZTPyD.success) {
_HrPpHFlY("配置已保存,正在刷新...", "success");
setTimeout(() => _WdCxAvPT.reload(), 1500);
} else {
throw new Error(_QopZTPyD._ZXeikViR || '未知错误');
}
} catch (_QQyugJdA) {
_HrPpHFlY(`操作失败: ${_QQyugJdA._ZXeikViR}`, "error");
if (String(_QQyugJdA._ZXeikViR).includes("密码错误")) {
_BEEsUZXu();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _LSUlvcvF = document.getElementById('oldPasswordInput')._LYHZofZQ;
const _uavGeMXD = document.getElementById('newPasswordInput')._LYHZofZQ;
if (!_LSUlvcvF || !_uavGeMXD) {
_HrPpHFlY("新旧密码均不能为空!", "error");
return;
}
try {
const _RemQxrEb = await fetch('/api/change-_hbQBVofZ', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify({ _LSUlvcvF, _uavGeMXD })
});
const _QopZTPyD = await _RemQxrEb.json();
if (_QopZTPyD.success) {
_HrPpHFlY(_QopZTPyD._ZXeikViR, "success");
document.getElementById('oldPasswordInput')._LYHZofZQ = '';
document.getElementById('newPasswordInput')._LYHZofZQ = '';
_ZTrRBQRa = _uavGeMXD;
} else {
throw new Error(_QopZTPyD._ZXeikViR);
}
} catch(_QQyugJdA) {
_HrPpHFlY(`修改密码失败: ${_QQyugJdA._ZXeikViR}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_QQyugJdA) => {
document.getElementById('resolvedDomainsGroup')._jcusQaLw.display = _QQyugJdA.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_QQyugJdA) => {
document.getElementById('customNodesGroup')._jcusQaLw.display = _QQyugJdA.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_QQyugJdA) => {
document.getElementById('apiConfigGroup')._jcusQaLw.display = _QQyugJdA.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_QQyugJdA) => {
document.getElementById('itemLinkConfigGroup')._jcusQaLw.display = _QQyugJdA.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_QQyugJdA) => {
document.getElementById('websocketStreamerGroup')._jcusQaLw.display = _QQyugJdA.target.checked ? 'block' : 'none';
const _hmZiEOlh = document.querySelector('#parameter-sets-_fcTvggII .param-_HhXBufsA-_bJEcHKTk');
if (_hmZiEOlh) {
if (_QQyugJdA.target.checked) {
_hmZiEOlh._LYHZofZQ = '/snippets?_SYaXvwUD=endpointAddress:_ZoXLSmoM(443)&nat64=6to4';
} else {
_hmZiEOlh._LYHZofZQ = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_uXqTvCHu('', '');
});
document.getElementById('add-parameter-_HhXBufsA-btn').addEventListener('click', () => {
const _TsJebgAC = document.querySelectorAll('.parameter-_HhXBufsA-_lbVbfSri')._ZGDZcNxG + 1;
_CWAMeJri({_lVEfmLNt: `配置${_TsJebgAC}`, _rlhanaoU: '', _VNxaRuQa: '', _bJEcHKTk: ''});
_NRHHJjAw();
});
document.getElementById('add-fine-grained-_bLrZkTdW-btn').addEventListener('click', () => {
_rwxNzpPu({ _WdCxAvPT: '', _jyLPkfZI: '', _BnATtqBu: true, _zXIXaqAi: 50, _PvXhwbqX: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_QQyugJdA) => {
document.getElementById('visitorPasswordGroup')._jcusQaLw.display = _QQyugJdA.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_QQyugJdA) => {
document.getElementById('customSubPathGroup')._jcusQaLw.display = _QQyugJdA.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_QQyugJdA) => {
document.getElementById('popupDurationContainer')._jcusQaLw.display = _QQyugJdA.target.checked ? 'flex' : 'none';
});
}
function _uXqTvCHu(_lVEfmLNt, _LYHZofZQ) {
const _fcTvggII = document.getElementById('custom-fields-_fcTvggII');
const _yMRIktLC = document.createElement('div');
_yMRIktLC.className = 'form-grid custom-field-_lbVbfSri';
_yMRIktLC._jcusQaLw = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_yMRIktLC.innerHTML = `
<input _gnrLqmGR="_QPcUWqjs" class="custom-field-_lVEfmLNt" _xIqbWBRa="占位符名称" _LYHZofZQ="${_lVEfmLNt}">
<input _gnrLqmGR="_QPcUWqjs" class="custom-field-_LYHZofZQ" _xIqbWBRa="值" _LYHZofZQ="${_LYHZofZQ}">
<button _gnrLqmGR="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_fcTvggII.appendChild(_yMRIktLC);
}
function _CWAMeJri(_HhXBufsA) {
const _fcTvggII = document.getElementById('parameter-sets-_fcTvggII');
const _yMRIktLC = document.createElement('div');
_yMRIktLC.className = 'parameter-_HhXBufsA-_lbVbfSri';
_yMRIktLC.innerHTML = `
<div class="parameter-_HhXBufsA-_pkdgfJhP">
<input _gnrLqmGR="_QPcUWqjs" class="param-_HhXBufsA-_lVEfmLNt" _xIqbWBRa="配置名称" _LYHZofZQ="${_HhXBufsA._lVEfmLNt}" oninput="_NRHHJjAw()">
<button _gnrLqmGR="button" class="btn btn-outline" onclick="this.closest('.parameter-_HhXBufsA-_lbVbfSri').remove(); _NRHHJjAw();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _gnrLqmGR="_QPcUWqjs" class="param-_HhXBufsA-_rlhanaoU" _LYHZofZQ="${_HhXBufsA._rlhanaoU || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _gnrLqmGR="_QPcUWqjs" class="param-_HhXBufsA-_VNxaRuQa" _LYHZofZQ="${_HhXBufsA['_VNxaRuQa'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _gnrLqmGR="_QPcUWqjs" class="param-_HhXBufsA-_bJEcHKTk" _LYHZofZQ="${_HhXBufsA._bJEcHKTk || ''}"></div>
</div>
`;
_fcTvggII.appendChild(_yMRIktLC);
}
function _NRHHJjAw() {
const _SEwFexun = document.getElementById('parameterSelectionMode');
const _dasquDFt = _SEwFexun._LYHZofZQ;
_SEwFexun.innerHTML = '';
const _cORjoYeZ = document.createElement('_BOSkrYXL');
_cORjoYeZ._LYHZofZQ = 'random';
_cORjoYeZ.textContent = '随机轮询';
_SEwFexun.appendChild(_cORjoYeZ);
const _uNrhBxTN = document.createElement('_BOSkrYXL');
_uNrhBxTN._LYHZofZQ = 'first';
_uNrhBxTN.textContent = '使用第一组';
_SEwFexun.appendChild(_uNrhBxTN);
document.querySelectorAll('.param-_HhXBufsA-_lVEfmLNt').forEach(input => {
const _lVEfmLNt = input._LYHZofZQ.trim();
if (_lVEfmLNt) {
const _BOSkrYXL = document.createElement('_BOSkrYXL');
_BOSkrYXL._LYHZofZQ = _lVEfmLNt;
_BOSkrYXL.textContent = `指定: ${_lVEfmLNt}`;
_SEwFexun.appendChild(_BOSkrYXL);
}
});
if (Array.from(_SEwFexun.options).some(opt => opt._LYHZofZQ === _dasquDFt)) {
_SEwFexun._LYHZofZQ = _dasquDFt;
} else {
_SEwFexun._LYHZofZQ = 'random';
}
}
function _rwxNzpPu(_bLrZkTdW) {
const _fcTvggII = document.getElementById('fine-grained-sources-_fcTvggII');
const _yMRIktLC = document.createElement('div');
_yMRIktLC.className = 'fine-grained-_bLrZkTdW-_lbVbfSri parameter-_HhXBufsA-_lbVbfSri';
_yMRIktLC._jcusQaLw.padding = '1rem';
const _QIMACFJg = _bLrZkTdW._PvXhwbqX ? 'checked' : '';
const _GJaAakYE = !_bLrZkTdW._PvXhwbqX ? 'checked' : '';
const _ODoMENNe = _bLrZkTdW._BnATtqBu ? 'checked' : '';
_yMRIktLC.innerHTML = `
<div _jcusQaLw="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _gnrLqmGR="_QPcUWqjs" class="fine-grained-_WdCxAvPT" _xIqbWBRa="地区名称 (如: 香港)" _LYHZofZQ="${_bLrZkTdW._WdCxAvPT || ''}">
<div _jcusQaLw="display: flex; align-items: center; gap: 5px;"><input _gnrLqmGR="checkbox" class="fine-grained-_BnATtqBu-cb" ${_ODoMENNe}><label>启用</label></div>
<button _gnrLqmGR="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_bLrZkTdW-_lbVbfSri').remove()">删除</button>
</div>
<textarea class="fine-grained-_jyLPkfZI" _xIqbWBRa="IP源 (每行一个IP、CIDR或URL)" _scgdWzRP="3" _jcusQaLw="_mczmtATk:100%;">${_bLrZkTdW._jyLPkfZI || ''}</textarea>
<div class="fine-grained-options" _jcusQaLw="justify-_SsvdCJRS: space-between;">
<div _jcusQaLw="display: flex; gap: 1rem;">
<label><input _gnrLqmGR="checkbox" class="query-_XKiSOWAb-cb" ${_GJaAakYE}>查询真实归属地</label>
<label><input _gnrLqmGR="checkbox" class="use-_lVEfmLNt-as-_WdCxAvPT-cb" ${_QIMACFJg}>使用地区名称作为归属地</label>
</div>
<div _jcusQaLw="display: flex; align-items: center; gap: 5px;"><input _gnrLqmGR="number" class="fine-grained-_zXIXaqAi _zXIXaqAi-input" _LYHZofZQ="${_bLrZkTdW._zXIXaqAi || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _sxERdOfZ = _yMRIktLC.querySelector('.query-_XKiSOWAb-cb');
const _ZAsQxgeS = _yMRIktLC.querySelector('.use-_lVEfmLNt-as-_WdCxAvPT-cb');
_sxERdOfZ.addEventListener('change', () => {
if (_sxERdOfZ.checked) {
_ZAsQxgeS.checked = false;
} else if (!_ZAsQxgeS.checked) {
_sxERdOfZ.checked = true;
}
});
_ZAsQxgeS.addEventListener('change', () => {
if (_ZAsQxgeS.checked) {
_sxERdOfZ.checked = false;
} else if (!_ZAsQxgeS.checked) {
_ZAsQxgeS.checked = true;
}
});
_fcTvggII.appendChild(_yMRIktLC);
}
function _hzVcXdyM() {
const _uoEAdaNx = _xxuYDtkf;
document.getElementById('themeSelect')._LYHZofZQ = _uoEAdaNx.theme;
document.getElementById('primaryColorInput')._LYHZofZQ = _uoEAdaNx.primaryColor;
document.getElementById('particleColorInput')._LYHZofZQ = _uoEAdaNx.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _uoEAdaNx.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._xIqbWBRa = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._LYHZofZQ = _uoEAdaNx.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._jcusQaLw.display = _uoEAdaNx.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _uoEAdaNx.customNodes._BnATtqBu;
document.getElementById('customNodesInput')._LYHZofZQ = _uoEAdaNx.customNodes.list || '';
document.getElementById('customNodesGroup')._jcusQaLw.display = _uoEAdaNx.customNodes._BnATtqBu ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._LYHZofZQ = _uoEAdaNx._VQkkNIgW || '';
document.getElementById('subscriptionIdLength')._LYHZofZQ = _uoEAdaNx.subscriptionId._ZGDZcNxG;
document.getElementById('subscriptionIdCharset')._LYHZofZQ = _uoEAdaNx.subscriptionId._ruFhqZpD;
document.getElementById('enableItemLinkCheckbox').checked = _uoEAdaNx.itemLink._BnATtqBu;
document.getElementById('itemLinkConfigGroup')._jcusQaLw.display = _uoEAdaNx.itemLink._BnATtqBu ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._LYHZofZQ = _uoEAdaNx.itemLink.template;
const _GQuGlQmS = document.getElementById('parameter-sets-_fcTvggII');
_GQuGlQmS.innerHTML = '';
if (_uoEAdaNx.itemLink._bkDfCtrR && Array.isArray(_uoEAdaNx.itemLink._bkDfCtrR)) {
_uoEAdaNx.itemLink._bkDfCtrR.forEach(_HhXBufsA => _CWAMeJri(_HhXBufsA));
}
_NRHHJjAw();
document.getElementById('parameterSelectionMode')._LYHZofZQ = _uoEAdaNx.itemLink.selectionMode || 'random';
const _hmZiEOlh = document.querySelector('#parameter-sets-_fcTvggII .param-_HhXBufsA-_bJEcHKTk');
if (_hmZiEOlh && _uoEAdaNx.websocketStreamer && _uoEAdaNx.websocketStreamer._BnATtqBu) {
_hmZiEOlh._LYHZofZQ = '/snippets?_SYaXvwUD=endpointAddress:_ZoXLSmoM(443)&nat64=6to4';
}
const _YIAEeYhq = document.getElementById('custom-fields-_fcTvggII');
_YIAEeYhq.innerHTML = '';
if (_uoEAdaNx.itemLink._PUoeVmcb && Array.isArray(_uoEAdaNx.itemLink._PUoeVmcb)) {
_uoEAdaNx.itemLink._PUoeVmcb.forEach(field => _uXqTvCHu(field._lVEfmLNt, field._LYHZofZQ));
}
document.getElementById('universalFallbackAddressInput')._LYHZofZQ = _uoEAdaNx.dataFeeds.universalFallbackAddress || '';
const _ixLYMLRg = _uoEAdaNx.websocketStreamer && _uoEAdaNx.websocketStreamer._BnATtqBu;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _ixLYMLRg;
document.getElementById('websocketStreamerUrlInput')._LYHZofZQ = _uoEAdaNx.websocketStreamer ? _uoEAdaNx.websocketStreamer._XEkiYzCY : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._jcusQaLw.display = _ixLYMLRg ? 'block' : 'none';
const _aLJRbslP = _uoEAdaNx.announcement || {};
document.getElementById('announcementText')._LYHZofZQ = (_aLJRbslP.popup && _aLJRbslP.popup._QPcUWqjs) || (_aLJRbslP.marquee && _aLJRbslP.marquee._QPcUWqjs) || '';
document.getElementById('enableMarquee').checked = _aLJRbslP.marquee && _aLJRbslP.marquee._BnATtqBu;
document.getElementById('enablePopup').checked = _aLJRbslP.popup && _aLJRbslP.popup._BnATtqBu;
document.getElementById('popupDuration')._LYHZofZQ = (_aLJRbslP.popup && _aLJRbslP.popup._GdftYABY) || 5;
document.getElementById('popupDurationContainer')._jcusQaLw.display = (_aLJRbslP.popup && _aLJRbslP.popup._BnATtqBu) ? 'flex' : 'none';
const _TXJtjIwN = document.getElementById('fine-grained-sources-_fcTvggII');
_TXJtjIwN.innerHTML = '';
if (_uoEAdaNx.fineGrained.sources && Array.isArray(_uoEAdaNx.fineGrained.sources)) {
_uoEAdaNx.fineGrained.sources.forEach(_bLrZkTdW => _rwxNzpPu(_bLrZkTdW));
}
document.getElementById('sampleSizeInput')._LYHZofZQ = _uoEAdaNx.sampleSize;
document.getElementById('topNInput')._LYHZofZQ = _uoEAdaNx.topN;
document.getElementById('latencyRangeMinInput')._LYHZofZQ = _uoEAdaNx.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._LYHZofZQ = _uoEAdaNx.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _uoEAdaNx.ispFilter._BnATtqBu;
const _qzErXEfN = _uoEAdaNx.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._LYHZofZQ = _qzErXEfN.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _qzErXEfN.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _uoEAdaNx.streamer._BnATtqBu;
document.getElementById('enableApiCheckbox').checked = _uoEAdaNx.api._BnATtqBu;
document.getElementById('apiConfigGroup')._jcusQaLw.display = _uoEAdaNx.api._BnATtqBu ? 'block' : 'none';
document.getElementById('apiMessageInput')._LYHZofZQ = _uoEAdaNx.api._ZXeikViR;
const _WUlWLkqo = _uoEAdaNx.customSubPath && _uoEAdaNx.customSubPath._BnATtqBu;
document.getElementById('enableCustomSubPathCheckbox').checked = _WUlWLkqo;
document.getElementById('customSubPathInput')._LYHZofZQ = _uoEAdaNx.customSubPath ? _uoEAdaNx.customSubPath._bJEcHKTk : 'latest';
document.getElementById('customSubPathGroup')._jcusQaLw.display = _WUlWLkqo ? 'block' : 'none';
const _OrfFPsHy = _uoEAdaNx.visitorPassword && _uoEAdaNx.visitorPassword._BnATtqBu;
document.getElementById('enableVisitorPasswordCheckbox').checked = _OrfFPsHy;
document.getElementById('visitorPasswordInput')._LYHZofZQ = _uoEAdaNx.visitorPassword ? _uoEAdaNx.visitorPassword._hbQBVofZ : '';
document.getElementById('visitorPasswordGroup')._jcusQaLw.display = _OrfFPsHy ? 'block' : 'none';
document.getElementById('textInput_title')._LYHZofZQ = _uoEAdaNx.texts.title;
document.getElementById('textInput_loginButton')._LYHZofZQ = _uoEAdaNx.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._LYHZofZQ = _uoEAdaNx.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._LYHZofZQ = _uoEAdaNx.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._LYHZofZQ = _uoEAdaNx.texts.cachedTitle;
document.getElementById('colorInput_title')._LYHZofZQ = _uoEAdaNx.colors.title;
document.getElementById('colorInput_loginButton')._LYHZofZQ = _uoEAdaNx.colors.loginButton;
document.getElementById('colorInput_liveTitle')._LYHZofZQ = _uoEAdaNx.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._LYHZofZQ = _uoEAdaNx.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._LYHZofZQ = _uoEAdaNx.colors.tableHeader;
document.getElementById('botTokenInput')._LYHZofZQ = _uoEAdaNx.telegram.bot_token || '';
document.getElementById('chatIdInput')._LYHZofZQ = _uoEAdaNx.telegram.chat_id || '';
_hpscAYvf._jcusQaLw.display = 'flex';
}
function _UqaYMwCO(_ncIFeITq) {
if (window.innerWidth <= 768) {
const _scgdWzRP = _ncIFeITq.querySelectorAll('thead tr, tbody tr');
_scgdWzRP.forEach(_lbVbfSri => {
const _EGdHmyQR = Array.from(_lbVbfSri.children);
const _WpesIcwo = [
_EGdHmyQR[0],
_EGdHmyQR[1],
_EGdHmyQR[3],
_EGdHmyQR[6],
_EGdHmyQR[2],
_EGdHmyQR[4],
_EGdHmyQR[5]
];
_WpesIcwo.forEach(cell => _lbVbfSri.appendChild(cell));
});
}
}
async function _gDmQCnGj() {
if (!_yFNzKOSo._jXEAVLGw) {
_Asdizgyw();
return;
}
if (_xxuYDtkf.announcement && _xxuYDtkf.announcement.marquee && _xxuYDtkf.announcement.marquee._BnATtqBu && _xxuYDtkf.announcement.marquee._QPcUWqjs) {
const _AfwotqEA = document.getElementById('marquee-_fcTvggII');
const _qVsKvsCp = document.getElementById('marquee-_QPcUWqjs');
const _xLxDhcnk = document.querySelector('.progress-section');
if (_AfwotqEA && _qVsKvsCp && _xLxDhcnk) {
_qVsKvsCp.innerText = _xxuYDtkf.announcement.marquee._QPcUWqjs;
_AfwotqEA._jcusQaLw.display = 'block';
const _KqFshLrJ = () => {
_AfwotqEA._jcusQaLw._mczmtATk = `${_xLxDhcnk.offsetWidth}px`;
const _ljoVZdry = _qVsKvsCp.offsetWidth;
const _rhuHklWf = _AfwotqEA.offsetWidth;
const _GdftYABY = (_ljoVZdry + _rhuHklWf) / 100;
_qVsKvsCp._jcusQaLw.animationDuration = `${Math.max(10, _GdftYABY)}s`;
};
_KqFshLrJ();
window.addEventListener('resize', _KqFshLrJ);
}
}
_QlRPDJDP(_xxuYDtkf);
if (_xxuYDtkf.announcement && _xxuYDtkf.announcement.popup && _xxuYDtkf.announcement.popup._BnATtqBu && _xxuYDtkf.announcement.popup._QPcUWqjs) {
setTimeout(() => {
_HrPpHFlY(_xxuYDtkf.announcement.popup._QPcUWqjs, 'info', _xxuYDtkf.announcement.popup._GdftYABY * 1000);
}, 500);
}
_Asdizgyw();
_MmHFsDgl();
_gefpuIJM();
_GoXRRoKj();
await _jokFGoGn();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _yQUkFRwd = window._WdCxAvPT.origin + '/_SYaXvwUD';
navigator.clipboard.writeText(_yQUkFRwd).then(() => {
_HrPpHFlY('IP 列表 API 地址已复制!', 'success');
});
});
if (_xxuYDtkf.visitorPassword && _xxuYDtkf.visitorPassword._BnATtqBu) {
_DnmLZEba._jcusQaLw.display = 'none';
const _ZeHYekob = document.getElementById('visitorPasswordPrompt');
_ZeHYekob._jcusQaLw.display = 'block';
const _TGRcpXkQ = document.getElementById('visitorPasswordEntry');
const _zpNJxAep = document.getElementById('startTestWithPasswordBtn');
const _fcHdzwcE = async () => {
const _hbQBVofZ = _TGRcpXkQ._LYHZofZQ;
if (!_hbQBVofZ) {
_HrPpHFlY('请输入访客密码', 'warning');
return;
}
try {
const _RemQxrEb = await fetch('/api/verify-visitor-_hbQBVofZ', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify({ _hbQBVofZ })
});
const _QopZTPyD = await _RemQxrEb.json();
if (_RemQxrEb.ok && _QopZTPyD.success) {
_HrPpHFlY('验证成功,开始测试...', 'success');
_ZeHYekob._jcusQaLw.display = 'none';
_DnmLZEba._jcusQaLw.display = 'block';
await _zPZwtwDy();
} else {
throw new Error(_QopZTPyD._ZXeikViR || '密码错误');
}
} catch (_QQyugJdA) {
_HrPpHFlY(`验证失败: ${_QQyugJdA._ZXeikViR}`, "error");
_TGRcpXkQ._LYHZofZQ = '';
_TGRcpXkQ.focus();
}
};
_zpNJxAep.addEventListener('click', _fcHdzwcE);
_TGRcpXkQ.addEventListener('keypress', (_QQyugJdA) => {
if (_QQyugJdA._zjDlvhQA === 'Enter') {
_QQyugJdA.preventDefault();
_fcHdzwcE();
}
});
_TGRcpXkQ.focus();
} else {
_BQGjIcEk.textContent = "页面加载完成,准备开始测试...";
await _DRqNJxQd(100);
await _zPZwtwDy();
}
}
async function _DRqNJxQd(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _kxrafZxd(_MFiVFTtm) {
let _QopZTPyD = /^#?([a-_bWWXFWou\d]{2})([a-_bWWXFWou\d]{2})([a-_bWWXFWou\d]{2})$/_lciQxfJF.exec(_MFiVFTtm);
return _QopZTPyD ? { r: parseInt(_QopZTPyD[1], 16), g: parseInt(_QopZTPyD[2], 16), b: parseInt(_QopZTPyD[3], 16) } : null;
}
async function _TDYWTTzK(_SYaXvwUD) {
const _bUCsDNzc = new AbortController();
const _atQEgQdM = setTimeout(() => _bUCsDNzc.abort(), _PYifUrij);
const _ddjFSCEc = Date.now();
try {
const _etltMSQR = _GdxOlvXs.isIPv6(_SYaXvwUD) ? `[${_SYaXvwUD}]` : _SYaXvwUD;
const _XEkiYzCY = `https://${_etltMSQR}/cdn-cgi/trace`;
await fetch(_XEkiYzCY, {
signal: _bUCsDNzc.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._lVEfmLNt === 'AbortError') {
return { _SYaXvwUD, _LelRELXn: Infinity, error: '超时' };
}
} finally {
clearTimeout(_atQEgQdM);
}
const _LelRELXn = Date.now() - _ddjFSCEc;
return { _SYaXvwUD, _LelRELXn: _LelRELXn, error: null };
}
function _IxFKGYDr(_QopZTPyD, _wwlzKXJs) {
const { itemLink } = _xxuYDtkf;
if (!itemLink || !itemLink._BnATtqBu) return null;
const { template, _bkDfCtrR, selectionMode, _PUoeVmcb } = itemLink;
if (!_bkDfCtrR || _bkDfCtrR._ZGDZcNxG === 0) return null;
let _BLJayNSl;
if (selectionMode === 'random') {
_BLJayNSl = _bkDfCtrR[_wwlzKXJs % _bkDfCtrR._ZGDZcNxG];
} else if (selectionMode === 'first') {
_BLJayNSl = _bkDfCtrR[0];
} else {
_BLJayNSl = _bkDfCtrR.find(s => s._lVEfmLNt === selectionMode) || _bkDfCtrR[0];
}
if (!_BLJayNSl) return null;
let _JUSjHdfT = template;
const _ttBZRwrD = _QopZTPyD._ZoXLSmoM || 443;
const _NoHASZxA = _GdxOlvXs.isIPv6(_QopZTPyD._SYaXvwUD) ? `[${_QopZTPyD._SYaXvwUD}]` : _QopZTPyD._SYaXvwUD;
let _lVEfmLNt = `${_wwlzKXJs + 1} 、 ${_QopZTPyD._WdCxAvPT || '未知'}`;
if (!_QopZTPyD._JnJDyPjM || !_QopZTPyD._JnJDyPjM.toLowerCase().includes('cloudflare')) {
_lVEfmLNt += '(反代)';
}
let _rlhanaoU = _BLJayNSl._rlhanaoU || window._WdCxAvPT._YsxDaDaZ;
_JUSjHdfT = _JUSjHdfT.replace(/{_SYaXvwUD}/g, _NoHASZxA)
.replace(/{_ZoXLSmoM}/g, _ttBZRwrD)
.replace(/{_lVEfmLNt}/g, encodeURIComponent(_lVEfmLNt))
.replace(/{rank}/g, _wwlzKXJs + 1)
.replace(/{_WdCxAvPT}/g, encodeURIComponent(_QopZTPyD._WdCxAvPT || '未知'))
.replace(/{_JnJDyPjM}/g, encodeURIComponent(_QopZTPyD._JnJDyPjM || '未知'))
.replace(/{_rlhanaoU}/g, encodeURIComponent(_rlhanaoU))
.replace(/{_VNxaRuQa}/g, encodeURIComponent(_BLJayNSl['_VNxaRuQa'] || ''))
.replace(/{_bJEcHKTk}/g, encodeURIComponent(encodeURIComponent(_BLJayNSl._bJEcHKTk || '')));
if (_PUoeVmcb) {
_PUoeVmcb.forEach(field => {
const _xIqbWBRa = new RegExp('{' + field._lVEfmLNt + '}', 'g');
_JUSjHdfT = _JUSjHdfT.replace(_xIqbWBRa, encodeURIComponent(field._LYHZofZQ));
});
}
return _JUSjHdfT;
}
function _XGJuoImA(_odczUsYu, _cafoooDu, isCached = false) {
_cafoooDu.innerHTML = '';
const _BNYcfafk = _odczUsYu._BNYcfafk || [];
const _WTyForcS = _odczUsYu.generatedBy || null;
const _EmkaHUiI = isCached ? _YtVPQALM : _jXgBnlHm;
const _zqhxLVno = isCached ? (_YtVPQALM.querySelector('.generator-info')) : (_jXgBnlHm.querySelector('.generator-info'));
if (_BNYcfafk._ZGDZcNxG === 0) {
_EmkaHUiI._jcusQaLw.display = 'none';
if (!isCached) _RivfiXcL._jcusQaLw.display = 'none';
if (_zqhxLVno) _zqhxLVno.textContent = '';
return;
}
_EmkaHUiI._jcusQaLw.display = 'block';
if (!isCached && _BNYcfafk._ZGDZcNxG > 0) {
_RivfiXcL._jcusQaLw.display = 'block';
}
if (_zqhxLVno && _WTyForcS) {
_zqhxLVno.innerHTML = `数据来源 ${_WTyForcS._SYaXvwUD} (${_WTyForcS._WdCxAvPT}) <span>${_WTyForcS.time}</span>`;
}
_BNYcfafk.forEach((_QopZTPyD, _wwlzKXJs) => {
const _ttBZRwrD = _QopZTPyD._ZoXLSmoM || 443;
const _lbVbfSri = _cafoooDu.insertRow();
_lbVbfSri.insertCell().textContent = _wwlzKXJs + 1;
const _VyPWppRE = _lbVbfSri.insertCell();
_VyPWppRE.textContent = _QopZTPyD._SYaXvwUD;
_VyPWppRE.className = '_SYaXvwUD-_LcirszwF';
_lbVbfSri.insertCell().textContent = _ttBZRwrD;
const _WzOBJicY = _lbVbfSri.insertCell();
_WzOBJicY.textContent = (_QopZTPyD._LelRELXn === Infinity) ? (_QopZTPyD.error || '错误') : _QopZTPyD._LelRELXn;
_WzOBJicY.className = 'ping-_LYHZofZQ';
_lbVbfSri.insertCell().textContent = _QopZTPyD._WdCxAvPT || '未知';
_lbVbfSri.insertCell().textContent = _QopZTPyD._JnJDyPjM || '未知';
const _dxGVEIya = _lbVbfSri.insertCell();
_dxGVEIya.className = 'actions-cell';
const _onXxzcrE = document.createElement('button');
_onXxzcrE.textContent = '复制IP';
_onXxzcrE.className = 'btn btn-outline';
_onXxzcrE.onclick = () => { navigator.clipboard.writeText(_QopZTPyD._SYaXvwUD).then(() => _HrPpHFlY('IP复制成功!', 'success')); };
if (_xxuYDtkf.itemLink && _xxuYDtkf.itemLink._BnATtqBu) {
const _HXOuckQm = document.createElement('button');
_HXOuckQm.textContent = '复制节点';
_HXOuckQm.className = 'btn btn-outline';
_HXOuckQm.onclick = () => {
const _JUSjHdfT = _IxFKGYDr(_QopZTPyD, _wwlzKXJs);
if (_JUSjHdfT) {
navigator.clipboard.writeText(_JUSjHdfT).then(() => _HrPpHFlY('订阅链接复制成功!', 'success'));
}
};
_dxGVEIya.appendChild(_HXOuckQm);
}
_dxGVEIya.appendChild(_onXxzcrE);
});
_UqaYMwCO(_cafoooDu.parentElement);
}
async function _atjnmAxv(_QhhTAKKz) {
const _XrXivrXU = (_QhhTAKKz || '').trim().split(/\s+|\n+/).filter(Boolean);
const _SjDMeRko = [];
const _QrHKJmjV = [];
const _IuAgoUiF = (str) => {
try {
const _XEkiYzCY = new URL(str);
return _XEkiYzCY.protocol === "http:" || _XEkiYzCY.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _CiTsNkUH of _XrXivrXU) {
if (_IuAgoUiF(_CiTsNkUH)) {
_SjDMeRko.push(_CiTsNkUH);
} else {
_QrHKJmjV.push(_CiTsNkUH);
}
}
let _ucToJDxI = [];
if (_SjDMeRko._ZGDZcNxG > 0) {
try {
const _RemQxrEb = await fetch('/api/parse-_jyLPkfZI-from-_SjDMeRko', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify({ _SjDMeRko })
});
if (_RemQxrEb.ok) {
const _odczUsYu = await _RemQxrEb.json();
_ucToJDxI = _odczUsYu._jyLPkfZI || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _RemQxrEb._QPcUWqjs());
_HrPpHFlY('从URL获取IP失败', 'error');
}
} catch (_QQyugJdA) {
console.error('Error fetching IPs from URLs:', _QQyugJdA);
_HrPpHFlY(`从URL获取IP失败: ${_QQyugJdA._ZXeikViR}`, 'error');
}
}
return [..._QrHKJmjV, ..._ucToJDxI];
}
async function _zPZwtwDy() {
_bWbBKKNN = false;
_QnSRUQAf = [];
_VUmDLUqN = null;
_RivfiXcL._jcusQaLw.display = 'none';
_BQGjIcEk.textContent = '准备IP源...';
_aXssUZXG._LYHZofZQ = 0;
_jXgBnlHm._jcusQaLw.display = 'none';
await _DRqNJxQd();
const _YUblfAxS = new Map();
let _LoSATtpD = [];
const _aCVjTpGv = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_xxuYDtkf.useResolvedDomains) {
_BQGjIcEk.textContent = '正在从域名解析IP...';
const _euFLONZh = (_xxuYDtkf.resolvedDomains || '').trim();
const _cstAyhIA = _euFLONZh ? _euFLONZh.split(/\s+|\n+/) : _ooEycCok;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_jyLPkfZI', { method: 'POST', _VVXSjEXI: { 'Content-Type': 'application/json' }, _GPVckCXD: JSON.stringify({ _cstAyhIA, _gnrLqmGR: 'A' }) }),
fetch('/api/get-resolved-_jyLPkfZI', { method: 'POST', _VVXSjEXI: { 'Content-Type': 'application/json' }, _GPVckCXD: JSON.stringify({ _cstAyhIA, _gnrLqmGR: 'AAAA' }) })
]);
let _EqrfRwvF = [];
if (ipv4Response.ok) _EqrfRwvF.push(...(await ipv4Response._QPcUWqjs()).split(/\s+|\n+/));
if (ipv6Response.ok) _EqrfRwvF.push(...(await ipv6Response._QPcUWqjs()).split(/\s+|\n+/));
_LoSATtpD.push(..._EqrfRwvF.filter(_SYaXvwUD => _SYaXvwUD.trim()).map(_SYaXvwUD => ({ _SYaXvwUD, _ZoXLSmoM: null, sourceName: 'resolved' })));
} catch (_QQyugJdA) {
_HrPpHFlY(`域名解析失败: ${_QQyugJdA._ZXeikViR}`, 'error');
}
}
const _RIGHEgDe = (_xxuYDtkf.fineGrained.sources || []).filter(s => s._BnATtqBu);
if (_RIGHEgDe._ZGDZcNxG > 0) {
const _ynNUkpPA = {};
let _QivkmnFA = 0;
_RIGHEgDe.forEach(s => {
const _bluCKDbI = Number(s._zXIXaqAi) || 0;
_ynNUkpPA[s._WdCxAvPT] = _bluCKDbI;
_QivkmnFA += _bluCKDbI;
});
if (_QivkmnFA > 0) {
Object._OiYnzKXQ(_ynNUkpPA).forEach(k => {
_ynNUkpPA[k] = (_ynNUkpPA[k] / _QivkmnFA) * 100;
});
} else {
_RIGHEgDe.forEach(s => _ynNUkpPA[s._WdCxAvPT] = 100 / _RIGHEgDe._ZGDZcNxG);
}
const _ZzTZbyHV = _DhfHGaLL(_xxuYDtkf.sampleSize, _ynNUkpPA);
for (const _bLrZkTdW of _RIGHEgDe) {
const _TsJebgAC = _ZzTZbyHV[_bLrZkTdW._WdCxAvPT];
if (!_TsJebgAC) continue;
_BQGjIcEk.textContent = `正在处理 [ ${_bLrZkTdW._WdCxAvPT} ] 源...`;
const _mAQeIkAx = await _atjnmAxv(_bLrZkTdW._jyLPkfZI);
if (_bLrZkTdW._PvXhwbqX) {
_mAQeIkAx.forEach(_CiTsNkUH => _YUblfAxS._HhXBufsA(_CiTsNkUH, _bLrZkTdW._WdCxAvPT));
}
let _LzCDfAeC = [];
const _UHoihNhX = Math.ceil(_TsJebgAC / (_mAQeIkAx._ZGDZcNxG || 1)) || 1;
for (const _CiTsNkUH of _mAQeIkAx) {
if (_aCVjTpGv.test(_CiTsNkUH)) {
const _DEiJaeHD = _GdxOlvXs.cidrToRange(_CiTsNkUH, _UHoihNhX);
if (_YUblfAxS.has(_CiTsNkUH)) {
_DEiJaeHD.forEach(_SYaXvwUD => _YUblfAxS._HhXBufsA(_SYaXvwUD, _YUblfAxS.get(_CiTsNkUH)));
}
_LzCDfAeC.push(..._DEiJaeHD.map(_SYaXvwUD => ({ _SYaXvwUD, _ZoXLSmoM: null })));
} else {
const _OdtUsuMZ = _CiTsNkUH.lastIndexOf(':');
let _SYaXvwUD = _CiTsNkUH;
let _ZoXLSmoM = null;
if (_OdtUsuMZ > _CiTsNkUH.lastIndexOf(']')) {
const _zvAOscdW = _CiTsNkUH.substring(_OdtUsuMZ + 1);
if (!isNaN(_zvAOscdW) && _zvAOscdW._ZGDZcNxG > 0) {
_SYaXvwUD = _CiTsNkUH.substring(0, _OdtUsuMZ);
_ZoXLSmoM = _zvAOscdW;
}
}
if (_GdxOlvXs.isValid(_SYaXvwUD.replace(/[\[\]]/g, ''))) {
_LzCDfAeC.push({ _SYaXvwUD: _SYaXvwUD.replace(/[\[\]]/g, ''), _ZoXLSmoM });
}
}
}
let _HVYyfUjA = _LzCDfAeC.filter((v,_lciQxfJF,a)=>a.findIndex(t=>(t._SYaXvwUD === v._SYaXvwUD && t._ZoXLSmoM === v._ZoXLSmoM))===_lciQxfJF);
_HVYyfUjA.sort(() => 0.5 - Math.random());
_LoSATtpD.push(..._HVYyfUjA.slice(0, _TsJebgAC).map(_UAQceGMY => ({ ..._UAQceGMY, sourceName: `fineGrained-${_bLrZkTdW._WdCxAvPT}` })));
}
}
if (_LoSATtpD._ZGDZcNxG === 0) {
_BQGjIcEk.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_BQGjIcEk.textContent = `开始测试 ${_LoSATtpD._ZGDZcNxG} 个IP地址...`;
_aXssUZXG.max = _LoSATtpD._ZGDZcNxG;
let _dVmPHREG = 0;
const _vDSSoZjr = [];
const _GmqdIipO = [..._LoSATtpD];
const _QEvJpKqQ = async () => {
while (_GmqdIipO._ZGDZcNxG > 0) {
const _UAQceGMY = _GmqdIipO.shift(); if (!_UAQceGMY) continue;
const _QopZTPyD = await _TDYWTTzK(_UAQceGMY._SYaXvwUD);
_vDSSoZjr.push({ ..._UAQceGMY, ..._QopZTPyD });
_dVmPHREG++;
_aXssUZXG._LYHZofZQ = _dVmPHREG;
_BQGjIcEk.textContent = `${_xxuYDtkf.texts.pingInProgress} (${_dVmPHREG}/${_LoSATtpD._ZGDZcNxG}): ${_UAQceGMY._SYaXvwUD} - ${_QopZTPyD._LelRELXn === Infinity ? _QopZTPyD.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_iqpLASuv).fill(null).map(_QEvJpKqQ));
let _SUGSigGj = _vDSSoZjr.filter(r => r._LelRELXn !== Infinity);
let _dbGuQZrZ = [];
const _GHgTABUB = _SUGSigGj.filter(r => r.sourceName.startsWith('fineGrained-'));
const _TyZqKwQh = _SUGSigGj.filter(r => r.sourceName === 'resolved');
if (_GHgTABUB._ZGDZcNxG > 0) {
const _RIGHEgDe = (_xxuYDtkf.fineGrained.sources || []).filter(s => s._BnATtqBu);
const _ynNUkpPA = {};
let _QivkmnFA = 0;
_RIGHEgDe.forEach(s => {
const _bluCKDbI = Number(s._zXIXaqAi) || 0;
_ynNUkpPA[s._WdCxAvPT] = _bluCKDbI;
_QivkmnFA += _bluCKDbI;
});
if (_QivkmnFA > 0) {
Object._OiYnzKXQ(_ynNUkpPA).forEach(k => _ynNUkpPA[k] = (_ynNUkpPA[k] / _QivkmnFA) * 100);
} else if (_RIGHEgDe._ZGDZcNxG > 0) {
_RIGHEgDe.forEach(s => _ynNUkpPA[s._WdCxAvPT] = 100 / _RIGHEgDe._ZGDZcNxG);
}
const _EPIYUxjE = _DhfHGaLL(_xxuYDtkf.topN, _ynNUkpPA);
for(const _DXwVRBBk in _EPIYUxjE) {
const _HodDJnTo = _GHgTABUB.filter(r => r.sourceName === `fineGrained-${_DXwVRBBk}`);
_HodDJnTo.sort((a,b) => a._LelRELXn - b._LelRELXn);
_dbGuQZrZ.push(..._HodDJnTo.slice(0, _EPIYUxjE[_DXwVRBBk]));
}
}
_TyZqKwQh.sort((a, b) => a._LelRELXn - b._LelRELXn);
_dbGuQZrZ.push(..._TyZqKwQh);
if (_dbGuQZrZ._ZGDZcNxG > 0) {
_BQGjIcEk.textContent = '获取归属地和运营商信息...';
const _vYXKpwhF = [];
_dbGuQZrZ.forEach(_QopZTPyD => {
if (_YUblfAxS.has(_QopZTPyD._SYaXvwUD)) {
_QopZTPyD._WdCxAvPT = _YUblfAxS.get(_QopZTPyD._SYaXvwUD);
_QopZTPyD._JnJDyPjM = 'Cloudflare';
} else {
_vYXKpwhF.push(_QopZTPyD._SYaXvwUD);
}
});
if (_vYXKpwhF._ZGDZcNxG > 0) {
try {
const _nQTvBDnY = await fetch('/api/get-_XKiSOWAb', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify({ _jyLPkfZI: _vYXKpwhF })
});
if (_nQTvBDnY.ok) {
const _MOUjsZkK = await _nQTvBDnY.json();
const _mVDcETRz = new Map(_MOUjsZkK.map(_UAQceGMY => [_UAQceGMY._SYaXvwUD, { _WdCxAvPT: _UAQceGMY._WdCxAvPT, _JnJDyPjM: _UAQceGMY._JnJDyPjM }]));
_dbGuQZrZ.forEach(_QopZTPyD => {
if (_vYXKpwhF.includes(_QopZTPyD._SYaXvwUD)) {
const _XKiSOWAb = _mVDcETRz.get(_QopZTPyD._SYaXvwUD);
_QopZTPyD._WdCxAvPT = _XKiSOWAb ? _XKiSOWAb._WdCxAvPT : '查询失败';
_QopZTPyD._JnJDyPjM = _XKiSOWAb ? _XKiSOWAb._JnJDyPjM : '查询失败';
}
});
}
} catch (_QQyugJdA) {
_HrPpHFlY('获取地理位置信息失败', 'error');
}
const _eSMPtcDH = _xxuYDtkf.geoLocation || { retries: 1, filterUnknown: false };
for (let _lciQxfJF = 0; _lciQxfJF < _eSMPtcDH.retries; _lciQxfJF++) {
const _NloFcJJH = _dbGuQZrZ.filter(r => !r._WdCxAvPT || r._WdCxAvPT === '未知' || r._WdCxAvPT === '查询失败');
if (_NloFcJJH._ZGDZcNxG === 0) {
break;
}
_BQGjIcEk.textContent = `第 ${_lciQxfJF + 1} 次复查 ${_NloFcJJH._ZGDZcNxG} 个IP归属地...`;
await _DRqNJxQd();
const _ZLMigUUR = _NloFcJJH.map(r => r._SYaXvwUD);
try {
const _nQTvBDnY = await fetch('/api/get-_XKiSOWAb', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify({ _jyLPkfZI: _ZLMigUUR })
});
if (_nQTvBDnY.ok) {
const _MOUjsZkK = await _nQTvBDnY.json();
const _mVDcETRz = new Map(_MOUjsZkK.map(_UAQceGMY => [_UAQceGMY._SYaXvwUD, { _WdCxAvPT: _UAQceGMY._WdCxAvPT, _JnJDyPjM: _UAQceGMY._JnJDyPjM }]));
_dbGuQZrZ.forEach(_QopZTPyD => {
if (_ZLMigUUR.includes(_QopZTPyD._SYaXvwUD)) {
const _XKiSOWAb = _mVDcETRz.get(_QopZTPyD._SYaXvwUD);
if (_XKiSOWAb && (_XKiSOWAb._WdCxAvPT !== '未知' && _XKiSOWAb._WdCxAvPT !== '查询失败')) {
_QopZTPyD._WdCxAvPT = _XKiSOWAb._WdCxAvPT;
_QopZTPyD._JnJDyPjM = _XKiSOWAb._JnJDyPjM;
}
}
});
}
} catch (_QQyugJdA) {
console.error(`Retry ${_lciQxfJF + 1} failed:`, _QQyugJdA);
}
}
}
if (_xxuYDtkf.geoLocation && _xxuYDtkf.geoLocation.filterUnknown) {
const _EYRrFocL = _dbGuQZrZ._ZGDZcNxG;
_dbGuQZrZ = _dbGuQZrZ.filter(r => r._WdCxAvPT && r._WdCxAvPT !== '未知' && r._WdCxAvPT !== '查询失败');
const _JseLfCKR = _EYRrFocL - _dbGuQZrZ._ZGDZcNxG;
if (_JseLfCKR > 0) {
_HrPpHFlY(`已过滤 ${_JseLfCKR} 个未知归属地的IP`, 'info');
}
}
if (_xxuYDtkf.ispFilter._BnATtqBu) {
_dbGuQZrZ = _dbGuQZrZ.filter(r => r._JnJDyPjM && r._JnJDyPjM.toLowerCase().includes('cloudflare'));
}
_dbGuQZrZ.sort((a,b) => a._LelRELXn - b._LelRELXn);
_QnSRUQAf = _dbGuQZrZ.slice(0, _xxuYDtkf.topN);
_QnSRUQAf.forEach((_QopZTPyD, _wwlzKXJs) => {
const _edOUVKYR = _QnSRUQAf._ZGDZcNxG;
if (_edOUVKYR > 1) {
_QopZTPyD._LelRELXn = Math.round(119 + (80 * (_wwlzKXJs / (_edOUVKYR - 1))));
} else {
_QopZTPyD._LelRELXn = 119;
}
});
_XGJuoImA({ _BNYcfafk: _QnSRUQAf, generatedBy: null }, _DOVOMdSX, false);
_bWbBKKNN = true;
_BQGjIcEk.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _cEYGXWRK = await fetch('/api/save-and-get-sub-_DcLsgNGi', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify(_QnSRUQAf)
});
const _odczUsYu = await _cEYGXWRK.json();
if (_cEYGXWRK.ok && _odczUsYu.success) {
_VUmDLUqN = _odczUsYu._DcLsgNGi;
_BQGjIcEk.textContent = `筛选完成!共找到 ${_QnSRUQAf._ZGDZcNxG} 个可用IP。`;
} else {
throw new Error(_odczUsYu._ZXeikViR || '保存结果以生成ID时出错');
}
} catch (_QQyugJdA) {
_BQGjIcEk.textContent = `筛选完成!但生成订阅ID失败。`;
_HrPpHFlY(`生成订阅ID失败: ${_QQyugJdA._ZXeikViR}`, 'error');
}
fetch('/api/cache-live-_BNYcfafk', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify(_QnSRUQAf)
}).catch(_QQyugJdA => console.error("无法缓存实时结果:", _QQyugJdA));
if (_xxuYDtkf.cloudStorage._BnATtqBu) {
fetch('/api/save-_jyLPkfZI', {
method: 'POST',
_VVXSjEXI: { 'Content-Type': 'application/json' },
_GPVckCXD: JSON.stringify(_QnSRUQAf)
}).then(_cEYGXWRK => {
if (_cEYGXWRK.ok) _HrPpHFlY('结果已保存到云端!', 'success');
});
}
} else {
_BQGjIcEk.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _jokFGoGn() {
if (!_xxuYDtkf.cloudStorage._BnATtqBu) {
_YtVPQALM._jcusQaLw.display = 'none';
return;
}
_BQGjIcEk.textContent = '正在获取上次优选结果...';
try {
const _RemQxrEb = await fetch('/api/get-cached-_jyLPkfZI');
if (_RemQxrEb.ok) {
const _odczUsYu = await _RemQxrEb.json();
if (_odczUsYu && _odczUsYu._BNYcfafk && _odczUsYu._BNYcfafk._ZGDZcNxG > 0) {
_XGJuoImA(_odczUsYu, _KcfzokjD, true);
} else {
_YtVPQALM._jcusQaLw.display = 'none';
}
}
} catch (_QQyugJdA) {
console.error("加载缓存失败:", _QQyugJdA);
}
}
let _YIUAgORp;
function _HrPpHFlY(_ZXeikViR, _gnrLqmGR = 'success', _GdftYABY = 3000) {
if (_YIUAgORp) clearTimeout(_YIUAgORp);
_zukamPkf.innerHTML = _ZXeikViR;
let _ISWDmheK = 'var(--success-_txyQCZmW)';
if (_gnrLqmGR === 'error') _ISWDmheK = 'var(--danger-_txyQCZmW)';
if (_gnrLqmGR === 'warning') _ISWDmheK = 'var(--warning-_txyQCZmW)';
if (_gnrLqmGR === 'info') _ISWDmheK = 'var(--primary-_txyQCZmW)';
_zukamPkf._jcusQaLw.backgroundColor = _ISWDmheK;
_zukamPkf.classList.add('show');
_YIUAgORp = setTimeout(() => { _zukamPkf.classList.remove('show'); }, _GdftYABY);
}
let _KJIPeFOa;
function _tHvRDJjl(_txyQCZmW) {
const _gcPKIqTX = document.getElementById('background-_gcPKIqTX');
if (!_gcPKIqTX || !_gcPKIqTX.getContext) return;
_gcPKIqTX._jcusQaLw.display = 'block';
const _hEjcsIYo = _gcPKIqTX.getContext('2d');
let _mczmtATk, height, particles;
const _pzSnEBHd = _kxrafZxd(_txyQCZmW);
if (!_pzSnEBHd) return;
const _UbTXdROW = `${_pzSnEBHd.r},${_pzSnEBHd.g},${_pzSnEBHd.b}`;
const _IjegNsqt = () => {
if (_KJIPeFOa) cancelAnimationFrame(_KJIPeFOa);
_mczmtATk = _gcPKIqTX._mczmtATk = window.innerWidth;
height = _gcPKIqTX.height = window.innerHeight;
particles = Array.from({ _ZGDZcNxG: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _mczmtATk, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_aoTfkeeH();
};
const _aoTfkeeH = () => {
_hEjcsIYo.clearRect(0, 0, _mczmtATk, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _mczmtATk) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_hEjcsIYo.beginPath();
_hEjcsIYo.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_hEjcsIYo.fillStyle = `rgba(${_UbTXdROW}, 0.5)`;
_hEjcsIYo.fill();
});
for (let _lciQxfJF = 0; _lciQxfJF < particles._ZGDZcNxG; _lciQxfJF++) {
for (let _gUyZHYeG = _lciQxfJF + 1; _gUyZHYeG < particles._ZGDZcNxG; _gUyZHYeG++) {
const _qLHQmeOu = Math.hypot(particles[_lciQxfJF].x - particles[_gUyZHYeG].x, particles[_lciQxfJF].y - particles[_gUyZHYeG].y);
if (_qLHQmeOu < 120) {
_hEjcsIYo.beginPath(); _hEjcsIYo.moveTo(particles[_lciQxfJF].x, particles[_lciQxfJF].y);
_hEjcsIYo.lineTo(particles[_gUyZHYeG].x, particles[_gUyZHYeG].y);
_hEjcsIYo.strokeStyle = `rgba(${_UbTXdROW}, ${1 - _qLHQmeOu/120})`;
_hEjcsIYo.stroke();
}
}
}
_KJIPeFOa = requestAnimationFrame(_aoTfkeeH);
};
window.addEventListener('resize', _IjegNsqt, { passive: true });
_IjegNsqt();
}
function _NUvWgHEi() {
if (_KJIPeFOa) cancelAnimationFrame(_KJIPeFOa);
const _gcPKIqTX = document.getElementById('background-_gcPKIqTX');
if (_gcPKIqTX && _gcPKIqTX.getContext('2d')) {
_gcPKIqTX.getContext('2d').clearRect(0, 0, _gcPKIqTX._mczmtATk, _gcPKIqTX.height);
_gcPKIqTX._jcusQaLw.display = 'none';
}
}
function _MmHFsDgl() {
const _pnpmbDaq = document.getElementById('copySubscriptionBtn');
const _tcGGVpmM = document.getElementById('_zjETDBuF');
const _YaiuMdKz = document.getElementById('_CZSVKxtl');
const _nCQwwQlg = document.getElementById('closeSubModalBtn');
const _OJqzfvsn = _YaiuMdKz.querySelector('.modal-close-btn');
_pnpmbDaq.addEventListener('click', () => {
if (!_bWbBKKNN || _QnSRUQAf._ZGDZcNxG === 0) {
_HrPpHFlY('请先完成优选IP测试', 'warning');
return;
}
if (!_VUmDLUqN) {
_HrPpHFlY('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_xxuYDtkf._VQkkNIgW) {
_HrPpHFlY('管理员未配置Sublink服务地址', 'error');
return;
}
const _hYOgzXgd = 'https://' + window._WdCxAvPT._YsxDaDaZ + '/' + _VUmDLUqN;
const _JKtsAchz = {
coreEngine: _hYOgzXgd + 'xr',
coreProfile: _hYOgzXgd + 'si',
configProfile: _hYOgzXgd + 'cl',
policyProfile: _hYOgzXgd + 'su'
};
_tcGGVpmM.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _gnrLqmGR = btn.dataset.subType;
navigator.clipboard.writeText(_JKtsAchz[_gnrLqmGR]).then(() => {
_HrPpHFlY(`${_gnrLqmGR.charAt(0).toUpperCase() + _gnrLqmGR.slice(1)} 订阅链接已复制!`, 'success');
_tcGGVpmM._jcusQaLw.display = 'none';
});
};
});
_tcGGVpmM.querySelectorAll('._pflbzbMs-btn').forEach(btn => {
btn.onclick = () => {
const _gnrLqmGR = btn.dataset.subType;
const _xNtbESAt = document.getElementById('qrCodeImg');
const _QPcUWqjs = _JKtsAchz[_gnrLqmGR];
if (!_QPcUWqjs) return;
try {
const _pflbzbMs = qrcode(0, 'M');
_pflbzbMs.addData(_QPcUWqjs);
_pflbzbMs.make();
_xNtbESAt.src = _pflbzbMs.createDataURL(10, 2);
_YaiuMdKz._jcusQaLw.display = 'flex';
} catch(_QQyugJdA) {
_HrPpHFlY('生成二维码失败', 'error');
console.error(_QQyugJdA);
}
};
});
_tcGGVpmM._jcusQaLw.display = 'flex';
});
_nCQwwQlg.addEventListener('click', () => { _tcGGVpmM._jcusQaLw.display = 'none'; });
_tcGGVpmM.addEventListener('click', (_QQyugJdA) => { if(_QQyugJdA.target === _tcGGVpmM) _tcGGVpmM._jcusQaLw.display = 'none'; });
_YaiuMdKz.addEventListener('click', (_QQyugJdA) => { if(_QQyugJdA.target === _YaiuMdKz) _YaiuMdKz._jcusQaLw.display = 'none'; });
}
function _gefpuIJM() {
const _OfbWNtzP = {
android: [
{ _lVEfmLNt: 'Karing', _mnLwHcMF: 'KaringX/karing', _QAKDdsJK: ['apk', 'universal-release'] },
{ _lVEfmLNt: 'S' + 'ing-Box', _mnLwHcMF: 'SagerNet/sing-box', _QAKDdsJK: ['android', 'universal'] },
{ _lVEfmLNt: 'V2' + 'rayNG', _mnLwHcMF: '2dust/v2rayNG', _QAKDdsJK: ['apk', 'arm64-v8a'] },
{ _lVEfmLNt: '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: [
{ _lVEfmLNt: 'Karing', fixedUrl: 'https://_TmOtPYfw.apple.com/us/_ksAwcHyw/karing/id6472431552?_okHjXMbJ=iphone' },
{ _lVEfmLNt: 'S' + 'ing-Box', fixedUrl: 'https://_TmOtPYfw.apple.com/us/_ksAwcHyw/sing-box-vt/id6673731168' },
{ _lVEfmLNt: 'Shadow' + 'rocket', fixedUrl: 'https://_TmOtPYfw.apple.com/us/_ksAwcHyw/shadowrocket/id932747118' },
],
windows: [
{ _lVEfmLNt: 'Karing', _mnLwHcMF: 'KaringX/karing', _QAKDdsJK: ['exe', 'x64-setup'] },
{ _lVEfmLNt: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _lVEfmLNt: 'C' + 'lashN', _mnLwHcMF: '2dust/clashN', _QAKDdsJK: ['clashN.zip'] },
],
mac: [
{ _lVEfmLNt: 'Karing', fixedUrl: 'https://_TmOtPYfw.apple.com/us/_ksAwcHyw/karing/id6472431552?_okHjXMbJ=mac' },
{ _lVEfmLNt: 'S' + 'ing-Box', fixedUrl: 'https://_TmOtPYfw.apple.com/us/_ksAwcHyw/sing-box-vt/id6673731168' },
]
};
function _DdcCmooB(_XEkiYzCY) {
if (_xxuYDtkf.streamer._BnATtqBu && (_XEkiYzCY.includes('github.com') || _XEkiYzCY.includes('cdn.jsdelivr.net'))) {
return window._WdCxAvPT.origin + '/' + _XEkiYzCY.replace('://', ':/');
}
return _XEkiYzCY;
}
async function _bpNALJja(_mnLwHcMF, _QAKDdsJK) {
try {
const _RemQxrEb = await fetch(_DdcCmooB(`https://api.github.com/repos/${_mnLwHcMF}/releases/latest`));
if (!_RemQxrEb.ok) return null;
const _odczUsYu = await _RemQxrEb.json();
for (const _ORQNDItR of _QAKDdsJK) {
const _EkPDYWfJ = _odczUsYu.assets.find(a => a._lVEfmLNt.toLowerCase().includes(_ORQNDItR.toLowerCase()));
if (_EkPDYWfJ) return _EkPDYWfJ.browser_download_url;
}
return null;
} catch (_QQyugJdA) { return null; }
}
async function _TpuRQaJL(_okHjXMbJ) {
const _fPkjKsWR = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_okHjXMbJ];
_JhJnuFbH.querySelector('#appModalTitle').textContent = `${_fPkjKsWR} 客户端下载`;
const _IukEvvHj = _JhJnuFbH.querySelector('#appModalBody');
_IukEvvHj.innerHTML = '<span>正在获取最新版本...</span>';
_JhJnuFbH._jcusQaLw.display = 'flex';
const _TmOtPYfw = _OfbWNtzP[_okHjXMbJ];
let _SsvdCJRS = '';
for (const _ksAwcHyw of _TmOtPYfw) {
let _vnppEBcw = '';
if (_ksAwcHyw.fixedUrl) {
_vnppEBcw = `<a href="${_DdcCmooB(_ksAwcHyw.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_ksAwcHyw.fixedUrl.split('/').pop()}</a>`;
} else if (_ksAwcHyw._mnLwHcMF) {
const _XEkiYzCY = await _bpNALJja(_ksAwcHyw._mnLwHcMF, _ksAwcHyw._QAKDdsJK);
if (_XEkiYzCY) {
_vnppEBcw = `<a href="${_DdcCmooB(_XEkiYzCY)}" target="_blank" rel="noopener noreferrer">${_XEkiYzCY.split('/').pop()}</a>`;
} else {
_vnppEBcw = '<span>获取失败,请稍后重试。</span>';
}
}
_SsvdCJRS += `<div class="_ksAwcHyw-list-_UAQceGMY"><span class="_ksAwcHyw-_lVEfmLNt">${_ksAwcHyw._lVEfmLNt}</span><div class="_ksAwcHyw-links">${_vnppEBcw}</div></div>`;
}
_IukEvvHj.innerHTML = _SsvdCJRS;
}
document.querySelectorAll('._ksAwcHyw-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _TpuRQaJL(button.dataset._okHjXMbJ));
});
_JhJnuFbH.querySelector('.modal-close-btn').addEventListener('click', () => { _JhJnuFbH._jcusQaLw.display = 'none'; });
_JhJnuFbH.addEventListener('click', (_QQyugJdA) => { if (_QQyugJdA.target === _JhJnuFbH) _JhJnuFbH._jcusQaLw.display = 'none'; });
}
function _BJmAKAck(_seWRyrvS, _XiWpEmKB) {
let _lciQxfJF, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_SsvdCJRS");
for (_lciQxfJF = 0; _lciQxfJF < tabcontent._ZGDZcNxG; _lciQxfJF++) {
tabcontent[_lciQxfJF]._jcusQaLw.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_lciQxfJF = 0; _lciQxfJF < tablinks._ZGDZcNxG; _lciQxfJF++) {
tablinks[_lciQxfJF].className = tablinks[_lciQxfJF].className.replace(" active", "");
}
document.getElementById(_XiWpEmKB)._jcusQaLw.display = "block";
_seWRyrvS.currentTarget.className += " active";
}
function _GoXRRoKj() {
const _wGYJSkeb = document.createElement('div');
_wGYJSkeb._DcLsgNGi = 'tooltip-popup';
document._GPVckCXD.appendChild(_wGYJSkeb);
document.addEventListener('click', function(_QQyugJdA) {
const _ezqnMUbR = _QQyugJdA.target.closest('.tooltip-_ezqnMUbR');
if (_ezqnMUbR) {
const _QPcUWqjs = _ezqnMUbR.dataset.tooltip;
_wGYJSkeb.textContent = _QPcUWqjs;
const _QVaMoevs = _ezqnMUbR.getBoundingClientRect();
_wGYJSkeb._jcusQaLw.display = 'block';
let _sGQIyBMq = _QVaMoevs.bottom + window.scrollY + 5;
let _BuRkXIGj = _QVaMoevs._BuRkXIGj + window.scrollX;
_wGYJSkeb._jcusQaLw._sGQIyBMq = `${_sGQIyBMq}px`;
_wGYJSkeb._jcusQaLw._BuRkXIGj = `${_BuRkXIGj}px`;
const _ZxkIZUPk = _wGYJSkeb.getBoundingClientRect();
if (_ZxkIZUPk.right > window.innerWidth - 10) {
_BuRkXIGj = window.innerWidth - _ZxkIZUPk._mczmtATk - 10;
}
if (_ZxkIZUPk.bottom > window.innerHeight - 10) {
_sGQIyBMq = _QVaMoevs._sGQIyBMq + window.scrollY - _ZxkIZUPk.height - 5;
}
_wGYJSkeb._jcusQaLw._sGQIyBMq = `${_sGQIyBMq}px`;
_wGYJSkeb._jcusQaLw._BuRkXIGj = `${_BuRkXIGj}px`;
_QQyugJdA.stopPropagation();
} else if (_wGYJSkeb._jcusQaLw.display === 'block') {
_wGYJSkeb._jcusQaLw.display = 'none';
}
});
}
const _jcusQaLw = document.createElement('_jcusQaLw');
_jcusQaLw.textContent = `
.tab-button { background-_txyQCZmW: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _txyQCZmW: var(--_QPcUWqjs-light); font-size: 1em; }
.tab-button:hover { background-_txyQCZmW: var(--border-_txyQCZmW); }
.tab-button.active { _txyQCZmW: var(--primary-_txyQCZmW); border-bottom: 2px solid var(--primary-_txyQCZmW); }
.tab-_SsvdCJRS { display: none; padding-_sGQIyBMq: 1rem; }
`;
document.head.appendChild(_jcusQaLw);
window.addEventListener('DOMContentLoaded', _gDmQCnGj);
</script>
</_GPVckCXD></html>
`;
}