import { connect } from "cloudflare:sockets";
const _tAoeaBVS = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _DERyKQjN = ["UpstreamAddress.SG.CMLiussss.net"];
const _oPMDJFqG = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _rmIHkACn = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _WqbeWJOR = '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 _rWkEfMrF = '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 _eNDsOjGl(_PddNZMdf) {
if (Array.isArray(_PddNZMdf)) {
try {
return String.fromCharCode.apply(null, _PddNZMdf);
} catch (_RsrDgbqX) {
return '';
}
}
return _PddNZMdf;
}
function _qzawfgLC(_wCBEUxaf) {
return /^[0-9a-_lgidycnk]{8}-[0-9a-_lgidycnk]{4}-[4][0-9a-_lgidycnk]{3}-[89ab][0-9a-_lgidycnk]{3}-[0-9a-_lgidycnk]{12}$/_jbSTkMCL.test(_wCBEUxaf);
}
const _qsdUfrSo = "optimized_ips_v4";
const _ZoPeEyUh = "global_config_v4";
const _TbSsDVKa = "admin_password_v4";
const _XanQCPSV = "live_results_temp_v1";
const _pyKEqRbm = "latest_sub_id_v1";
export default {
async fetch(_OjdohtLf, _rEKGtlgo, _GcEcgtCI) {
try {
if (!_rEKGtlgo.DB) {
const _XXVIPzrg = _iVoyFdiy("D1 数据库 'DB' 未绑定。");
return new Response(_XXVIPzrg, { status: 503, _ZwOMJIoE: { 'Content-Type': '_rKlfZOru/html;_dXctSIpI=UTF-8' }});
}
_GcEcgtCI.waitUntil(
_rEKGtlgo.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_LfCFIZgy TEXT PRIMARY KEY, _PddNZMdf TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_wCBEUxaf TEXT PRIMARY KEY, _UEpiXCXa TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_RsrDgbqX => console.error("DB Init Error:", _RsrDgbqX._pOiegcWY))
);
const _FeNIvQZo = new URL(_OjdohtLf._FeNIvQZo);
const _xcynfIYb = _FeNIvQZo.pathname;
const _nbvmSYWc = _OjdohtLf._ZwOMJIoE.get("Upgrade");
const _SAQduYSd = await _dZFSPwNE(_rEKGtlgo);
if (_SAQduYSd.websocketStreamer && _SAQduYSd.websocketStreamer._aRVwalGf && _nbvmSYWc && _nbvmSYWc.toLowerCase() === "websocket") {
const _tVTlXsIa = _SAQduYSd.websocketStreamer._FeNIvQZo;
if (_tVTlXsIa && _tVTlXsIa.trim().startsWith('https://')) {
try {
const _fbYSRxaE = new Request(_tVTlXsIa.trim() + _FeNIvQZo.pathname + _FeNIvQZo.search, _OjdohtLf);
return await fetch(_fbYSRxaE);
} catch (_RsrDgbqX) {
return new Response(`Upstream WebSocket gateway failed: ${_RsrDgbqX._pOiegcWY}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_nbvmSYWc && _nbvmSYWc.toLowerCase() === "websocket") {
return await _WinAmKWX(_OjdohtLf, _rEKGtlgo, _SAQduYSd);
}
const _VxZNEgbu = _xcynfIYb._CXvjlpRG(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_VxZNEgbu) {
const [, _AlLHGkxa, typeSuffix] = _VxZNEgbu;
const _bdZlqXlE = _SAQduYSd._bdZlqXlE;
if (!_bdZlqXlE || _bdZlqXlE.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' } });
}
const _UPcTjUfV = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _UwdHjQsP = _UPcTjUfV[typeSuffix];
const _wGRCUhjw = _bdZlqXlE.replace(/\/$/, '');
const _PFzFunbv = `${_FeNIvQZo.origin}/${_AlLHGkxa}`;
const _leyDqYfT = `${_wGRCUhjw}/${_UwdHjQsP}?_SAQduYSd=${encodeURIComponent(_PFzFunbv)}`;
try {
const _KsmSrzZf = await fetch(_leyDqYfT, { _ZwOMJIoE: { 'User-Agent': _OjdohtLf._ZwOMJIoE.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _louRBGxR = new Headers(_KsmSrzZf._ZwOMJIoE);
_louRBGxR._cFvThiOq('Access-Control-Allow-Origin', '*');
return new Response(_KsmSrzZf._SEZcaJmb, { status: _KsmSrzZf.status, statusText: _KsmSrzZf.statusText, _ZwOMJIoE: _louRBGxR });
} catch (_RsrDgbqX) {
return new Response(`获取上游订阅失败: ${_RsrDgbqX._pOiegcWY}`, { status: 502, _ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' } });
}
}
if (_xcynfIYb.startsWith('/https:/') || _xcynfIYb.startsWith('/http:/')) {
return _xzaKTGlH(_OjdohtLf, _SAQduYSd);
}
if (_SAQduYSd.customSubPath && _SAQduYSd.customSubPath._aRVwalGf && _SAQduYSd.customSubPath._xcynfIYb && _xcynfIYb === '/' + _SAQduYSd.customSubPath._xcynfIYb.trim()) {
const _cWTqQqta = _rEKGtlgo.DB.prepare("SELECT _PddNZMdf FROM kv_data WHERE _LfCFIZgy = ?").bind(_pyKEqRbm);
const { _meNdXQMV } = await _cWTqQqta.all();
const _doJSKtYM = _meNdXQMV._ueCUCPRZ > 0 ? _meNdXQMV[0]._PddNZMdf : null;
if (_doJSKtYM) {
return _lGqAUIdD({ _lcNZqsDv: { _wCBEUxaf: _doJSKtYM }, _FeNIvQZo: _OjdohtLf._FeNIvQZo }, _rEKGtlgo);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' } });
}
}
const _aQjXsOMs = _xcynfIYb.split('/').filter(Boolean);
if (_aQjXsOMs._ueCUCPRZ === 1 && !_xcynfIYb.startsWith('/api/')) {
const _AlLHGkxa = _aQjXsOMs[0];
return _lGqAUIdD({ _lcNZqsDv: { _wCBEUxaf: _AlLHGkxa }, _FeNIvQZo: _OjdohtLf._FeNIvQZo }, _rEKGtlgo);
}
if (_xcynfIYb.startsWith('/api/')) {
if (_xcynfIYb === '/api/_SAQduYSd' && _OjdohtLf.method === 'POST') return _ZnwAvLkW(_OjdohtLf, _rEKGtlgo, _GcEcgtCI);
if (_xcynfIYb === '/api/_cFvThiOq-_DXqHZlWv') return _isdvxbXk(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb === '/api/change-_DXqHZlWv') return _YmlHUvNv(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb === '/api/verify-_DXqHZlWv') return _xiQrcEYj(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb === '/api/verify-visitor-_DXqHZlWv' && _OjdohtLf.method === 'POST') return _bvAUAmsU(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb === '/api/cache-live-_meNdXQMV' && _OjdohtLf.method === 'POST') return _GESsqoNx(_OjdohtLf, _rEKGtlgo, _GcEcgtCI);
if (_xcynfIYb === '/api/get-_zhcupgOQ' && _OjdohtLf.method === 'POST') return _yelmhusD(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb === '/api/get-cached-_IiTJuJbi') return _ppKXEcsY(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb === '/api/save-_IiTJuJbi') return _cyiqCMan(_OjdohtLf, _rEKGtlgo, _GcEcgtCI);
if (_xcynfIYb === '/api/save-and-get-sub-_wCBEUxaf' && _OjdohtLf.method === 'POST') return _eGKzLDhd(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb.startsWith('/api/get-_IwTsZuqY/')) {
const _AlLHGkxa = _xcynfIYb.split('/').pop();
return _lGqAUIdD({ _lcNZqsDv: { _wCBEUxaf: _AlLHGkxa }, _FeNIvQZo: _OjdohtLf._FeNIvQZo }, _rEKGtlgo);
}
if (_xcynfIYb === '/api/_SAQduYSd' && _OjdohtLf.method === 'GET') return _NnBQhUSZ(_rEKGtlgo);
if (_xcynfIYb === '/api/get-resolved-_IiTJuJbi') return _SZNfhZQU(_OjdohtLf);
if (_xcynfIYb === '/api/parse-_IiTJuJbi-from-_qEFtuSKG' && _OjdohtLf.method === 'POST') return _hfUbqDpD(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb === '/api/endpoints') return _NLgjQrOX(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_xcynfIYb === '/_zNgQWNri') return _diqVcMYI(_OjdohtLf, _rEKGtlgo);
if (_xcynfIYb === '/bing-wallpaper') return _fswQJwFS();
return _IZSedxqp(_OjdohtLf, _rEKGtlgo, _GcEcgtCI);
} catch (err) {
let _RsrDgbqX = err;
return new Response(_RsrDgbqX.toString(), { status: 500 });
}
}
};
const _UVlEVMPa = { 'Accept': '_rKlfZOru/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 _NzMIfwhF(_FeNIvQZo, _LhqAbrtz) {
const _dqOZVNUf = await fetch(_FeNIvQZo, { _ZwOMJIoE: { ..._UVlEVMPa, 'Referer': _LhqAbrtz.referer } });
if (_dqOZVNUf.ok) return _dqOZVNUf._rKlfZOru();
return null;
}
async function _HUmGSoId(_FeNIvQZo, _LhqAbrtz) {
const _GCYSDbOS = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_FeNIvQZo)}`;
const _dqOZVNUf = await fetch(_GCYSDbOS, { _ZwOMJIoE: { ..._UVlEVMPa, 'Referer': _LhqAbrtz.referer } });
if (!_dqOZVNUf.ok) return null;
const _SEZcaJmb = await _dqOZVNUf._rKlfZOru();
const _CXvjlpRG = _SEZcaJmb._CXvjlpRG(/<pre[^>]*>([\s\S]*?)<\/pre>/_jbSTkMCL);
return _CXvjlpRG && _CXvjlpRG[1] ? _CXvjlpRG[1].replace(/&/g, '&') : null;
}
function _XLOIAvyI(_QJspXcDE) {
let _jAYDCEdG;
try {
_jAYDCEdG = atob(_QJspXcDE.replace(/\s/g, ''));
} catch (_RsrDgbqX) {
_jAYDCEdG = _QJspXcDE;
}
const _IwTsZuqY = _jAYDCEdG.split(/[\s\n\r,]+/).filter(line => line.trim());
const _jzxuxErI = new Set();
const _MgGTXDOu = /@([^?#]+?):(\d+)/;
for (const _OPuMRxKS of _IwTsZuqY) {
let _yzvJpwrq = '';
let _cYcavHgQ = '';
try {
if (_OPuMRxKS.startsWith('vmess://')) {
const _PqOWlvjl = atob(_OPuMRxKS.substring(8));
const _SAQduYSd = JSON.parse(_PqOWlvjl);
_yzvJpwrq = _SAQduYSd.add;
_cYcavHgQ = _SAQduYSd._cYcavHgQ;
} else {
const _CXvjlpRG = _OPuMRxKS._CXvjlpRG(_MgGTXDOu);
if (_CXvjlpRG && _CXvjlpRG[1] && _CXvjlpRG[2]) {
_yzvJpwrq = _CXvjlpRG[1].replace(/[\[\]]/g, '');
_cYcavHgQ = _CXvjlpRG[2];
}
}
} catch (_RsrDgbqX) {
console.warn(`Could not parse _OPuMRxKS: ${_OPuMRxKS}`);
}
if (_yzvJpwrq && _cYcavHgQ) {
_jzxuxErI.add(`${_yzvJpwrq}:${_cYcavHgQ}`);
}
}
return Array.from(_jzxuxErI);
}
async function _mflxjYez(_ONZvNHIB) {
try {
const _dqOZVNUf = await fetch(_ONZvNHIB, { _ZwOMJIoE: _UVlEVMPa });
if (!_dqOZVNUf.ok) {
console.error(`Failed to fetch subscription: ${_dqOZVNUf.status}`);
return [];
}
const _QJspXcDE = await _dqOZVNUf._rKlfZOru();
return _XLOIAvyI(_QJspXcDE);
} catch (error) {
console.error(`Error processing subscription ${_ONZvNHIB}:`, error);
return [];
}
}
async function _PFjAdovt(_YDCusDOA) {
const _sVHXIczi = _YDCusDOA.trim();
const _fLDZDucB = /^(vless|vmess|trojan|ss):\/\//.test(_sVHXIczi);
const _SHxGctmm = (() => {
if (_sVHXIczi._ueCUCPRZ < 20 || _sVHXIczi.startsWith('http')) return false;
const _VlzfrQTV = _sVHXIczi.replace(/\s/g, '');
if (_VlzfrQTV._ueCUCPRZ % 4 !== 0 && !_VlzfrQTV.includes('=')) return false;
try {
atob(_VlzfrQTV);
return true;
} catch (_RsrDgbqX) {
return false;
}
})();
if (_fLDZDucB || _SHxGctmm) {
return _XLOIAvyI(_sVHXIczi).join('\n');
}
const _YScacbzO = [
'https://ipdb.api.030101.xyz/?_cgHwBBYC=bestcf&_OpSUHqvQ=true',
'https://ipdb.api.030101.xyz/?_cgHwBBYC=bestproxy&_OpSUHqvQ=true'
];
const _ITcJmRfk = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_jbSTkMCL.test(_YDCusDOA) || _YDCusDOA.includes('?_BDUqRTBA=');
if (_ITcJmRfk) {
const _IiTJuJbi = await _mflxjYez(_YDCusDOA);
return _IiTJuJbi.join('\n');
}
let _QJspXcDE = '';
if (_YScacbzO.includes(_YDCusDOA)) {
_QJspXcDE = await _NzMIfwhF(_YDCusDOA, { referer: _YDCusDOA });
if (!_QJspXcDE || _QJspXcDE._ueCUCPRZ < 8) {
_QJspXcDE = await _HUmGSoId(_YDCusDOA, { referer: _YDCusDOA });
}
} else {
try {
const _LdeDnDab = await fetch(_YDCusDOA, { _ZwOMJIoE: { 'User-Agent': 'Cloudflare-Worker' } });
if (_LdeDnDab.ok) {
_QJspXcDE = await _LdeDnDab._rKlfZOru();
} else {
console.warn(`Failed to fetch URL ${_YDCusDOA}: ${_LdeDnDab.status}`);
}
} catch (_RsrDgbqX) {
console.error(`Error fetching URL ${_YDCusDOA}:`, _RsrDgbqX);
}
}
const _BiwruDIG = _XLOIAvyI(_QJspXcDE);
if (_BiwruDIG._ueCUCPRZ > 0) {
return _BiwruDIG.join('\n');
}
return _QJspXcDE || '';
}
async function _xzaKTGlH(_OjdohtLf, _SAQduYSd) {
if (!_SAQduYSd.streamer._aRVwalGf) {
return new Response('远程流功能未开启', { status: 403 });
}
const _FeNIvQZo = new URL(_OjdohtLf._FeNIvQZo);
const _sRoDNXMx = _FeNIvQZo.pathname.substring(1).replace(':/', '://');
try {
const _leyDqYfT = new URL(_sRoDNXMx);
const _tKTxDjgQ = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_tKTxDjgQ.some(domain => _leyDqYfT._yzvJpwrq.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _IUQPWAnT = new Headers(_OjdohtLf._ZwOMJIoE);
_IUQPWAnT._cFvThiOq('Host', _leyDqYfT._yzvJpwrq);
_IUQPWAnT._cFvThiOq('User-Agent', 'CF-Worker-Streamer/1.0');
const _fFFGOTCS = await fetch(_leyDqYfT.toString(), {
method: _OjdohtLf.method,
_ZwOMJIoE: _IUQPWAnT,
_SEZcaJmb: _OjdohtLf._SEZcaJmb,
});
const _louRBGxR = new Headers(_fFFGOTCS._ZwOMJIoE);
_louRBGxR._cFvThiOq('Access-Control-Allow-Origin', '*');
_louRBGxR._cFvThiOq('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_louRBGxR._cFvThiOq('Access-Control-Allow-Headers', '*');
_louRBGxR._cFvThiOq('Cache-Control', 'public, max-age=86400');
_louRBGxR._cFvThiOq('X-Streamer-Source', 'CF-Worker');
_louRBGxR.delete('_QJspXcDE-security-policy');
_louRBGxR.delete('x-_QJspXcDE-security-policy');
_louRBGxR.delete('x-webkit-csp');
return new Response(_fFFGOTCS._SEZcaJmb, {
status: _fFFGOTCS.status,
statusText: _fFFGOTCS.statusText,
_ZwOMJIoE: _louRBGxR,
});
} catch (_RsrDgbqX) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _WinAmKWX(_OjdohtLf, _rEKGtlgo, _SAQduYSd) {
try {
const _bdEWiNFK = _SAQduYSd || await _dZFSPwNE(_rEKGtlgo);
const _roZGzJDs = (_bdEWiNFK.itemLink._LTSKiGFq && _bdEWiNFK.itemLink._LTSKiGFq[0]) || {};
const _wFFBYYgP = _roZGzJDs['_BDUqRTBA'] || _eNDsOjGl(_tAoeaBVS);
if (!_qzawfgLC(_wFFBYYgP)) {
throw new Error("Configured user _oljFcqAo is not valid.");
}
const _guzLfIwa = _bdEWiNFK.dataFeeds.universalFallbackAddress;
let _NWprvrcL = {};
const _VBojTqmR = _eNDsOjGl(_DERyKQjN[0] || "");
if (_guzLfIwa) {
const [_vxTkKCIg, _cYcavHgQ = '443'] = _guzLfIwa.split(':');
_NWprvrcL = { _vxTkKCIg, _cYcavHgQ };
} else {
const [_vxTkKCIg, _cYcavHgQ = '443'] = _VBojTqmR.split(':');
_NWprvrcL = { _vxTkKCIg, _cYcavHgQ };
}
const _FeNIvQZo = new URL(_OjdohtLf._FeNIvQZo);
const _xcynfIYb = _FeNIvQZo.pathname;
let _ASQxvrgq = '';
const _YFvaAnWV = _FeNIvQZo.searchParams.get('remote');
if (_YFvaAnWV) {
_ASQxvrgq = atob(_YFvaAnWV);
} else if (_xcynfIYb.startsWith('/endpoint=')) {
_ASQxvrgq = _xcynfIYb.substring(10);
} else if (_xcynfIYb._ueCUCPRZ > 1 && _xcynfIYb.substring(1).includes('.')) {
_ASQxvrgq = _xcynfIYb.substring(1);
}
if (_ASQxvrgq) {
const [_vxTkKCIg, _cYcavHgQ = '443'] = _ASQxvrgq.split(':');
_NWprvrcL = { _vxTkKCIg, _cYcavHgQ };
}
return await _UxPQHWid(_OjdohtLf, _wFFBYYgP, _NWprvrcL);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _UxPQHWid(_OjdohtLf, _oljFcqAo, _NWprvrcL) {
const _CUncEBMD = new WebSocketPair();
const [clientEnd, _qTNLDqes] = Object.values(_CUncEBMD);
_qTNLDqes.accept();
let _dxkTcPeO = { _YdLVBUhn: null };
const _kzOZOTmC = _OjdohtLf._ZwOMJIoE.get("sec-websocket-protocol") || "";
const _uVdqfyDB = _iklEDfym(_qTNLDqes, _kzOZOTmC);
_uVdqfyDB.pipeTo(new WritableStream({
async write(chunk) {
if (_dxkTcPeO._YdLVBUhn) {
const _nASksKPP = _dxkTcPeO._YdLVBUhn.writable.getWriter();
await _nASksKPP.write(chunk);
_nASksKPP.releaseLock();
return;
}
const { error, details } = await _ZEFhIvje(chunk, _oljFcqAo);
if (error) {
throw new Error(details);
}
const _aANDcJIq = new Uint8Array([details._ITRdIAfP[0], 0]);
const _bWxPfMEq = chunk.slice(details.payloadIndex);
await _NkFQrqor(_dxkTcPeO, details._ByBQfTAy, details._sfwfmrQn, _bWxPfMEq, _qTNLDqes, _aANDcJIq, _NWprvrcL);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_PvoAiqfy(_qTNLDqes);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _NkFQrqor(_dxkTcPeO, _ByBQfTAy, _sfwfmrQn, _HarCjeoD, _sDnyivTb, _aANDcJIq, _dSlGDjDh) {
const _qipizJRp = async (_vxTkKCIg, _cYcavHgQ) => {
let _TMsiVmkn = _vxTkKCIg;
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(_vxTkKCIg)) {
_TMsiVmkn = `${atob('d3d3Lg==')}${_vxTkKCIg}${atob('LnNzbGlwLmlv')}`;
}
const _YdLVBUhn = connect({ _yzvJpwrq: _TMsiVmkn, _cYcavHgQ });
_dxkTcPeO._YdLVBUhn = _YdLVBUhn;
const _nASksKPP = _YdLVBUhn.writable.getWriter();
await _nASksKPP.write(_HarCjeoD);
_nASksKPP.releaseLock();
return _YdLVBUhn;
};
const _XnenZfaT = async () => {
if (!_dSlGDjDh._vxTkKCIg) return;
console.log(`Direct connection failed, falling back to gateway: ${_dSlGDjDh._vxTkKCIg}`);
const _DgNcWyVq = await _qipizJRp(_dSlGDjDh._vxTkKCIg, parseInt(_dSlGDjDh._cYcavHgQ, 10));
_DgNcWyVq.closed.catch(() => {}).finally(() => _PvoAiqfy(_sDnyivTb));
_AtnApdcq(_DgNcWyVq, _sDnyivTb, _aANDcJIq, null);
};
try {
const _bLjVRvLi = await _qipizJRp(_ByBQfTAy, _sfwfmrQn);
_AtnApdcq(_bLjVRvLi, _sDnyivTb, _aANDcJIq, _XnenZfaT);
} catch (err) {
console.error("Primary connection failed:", err);
await _XnenZfaT();
}
}
function _iklEDfym(_qTNLDqes, _kzOZOTmC) {
let _thzfJVtQ = false;
return new ReadableStream({
start(_ekqHuicF) {
_qTNLDqes.addEventListener("_pOiegcWY", (event) => { if (_thzfJVtQ) return; _ekqHuicF.enqueue(event._UEpiXCXa); });
_qTNLDqes.addEventListener("close", () => { _PvoAiqfy(_qTNLDqes); if (_thzfJVtQ) return; _ekqHuicF.close(); });
_qTNLDqes.addEventListener("error", (err) => _ekqHuicF.error(err));
if (_kzOZOTmC) {
try {
const _NVfORocq = atob(_kzOZOTmC.replace(/-/g, "+").replace(/_/g, "/"));
_ekqHuicF.enqueue(Uint8Array.from(_NVfORocq, c => c.charCodeAt(0))._YexhwSLT);
} catch (_RsrDgbqX) { console.error("Failed to decode early _UEpiXCXa:", _RsrDgbqX); }
}
},
cancel() { _thzfJVtQ = true; _PvoAiqfy(_qTNLDqes); },
});
}
async function _ZEFhIvje(_YexhwSLT, _oljFcqAo) {
if (_YexhwSLT.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _ITRdIAfP = new Uint8Array(_YexhwSLT.slice(0, 1));
const _ihVEBtVV = _TmoEvBkC(new Uint8Array(_YexhwSLT.slice(1, 17)));
if (_ihVEBtVV !== _oljFcqAo) return { error: true, details: "Invalid _oljFcqAo" };
const _ZqaTzKis = new Uint8Array(_YexhwSLT.slice(17, 18))[0];
const _CJJADHiM = new Uint8Array(_YexhwSLT.slice(18 + _ZqaTzKis, 19 + _ZqaTzKis))[0];
if (_CJJADHiM !== 1) return { error: true, details: `Unsupported _CJJADHiM: ${_CJJADHiM}` };
const _XNqhPCah = 19 + _ZqaTzKis;
const _sfwfmrQn = new DataView(_YexhwSLT.slice(_XNqhPCah, _XNqhPCah + 2)).getUint16(0);
let _vuhsCKcS = _XNqhPCah + 2;
const _UWoHyNPN = new Uint8Array(_YexhwSLT.slice(_vuhsCKcS, _vuhsCKcS + 1))[0];
let _uZmSPpGB = 0;
let _exxuYVwf = _vuhsCKcS + 1;
let _ByBQfTAy = "";
switch (_UWoHyNPN) {
case 1: _uZmSPpGB = 4; _ByBQfTAy = new Uint8Array(_YexhwSLT.slice(_exxuYVwf, _exxuYVwf + _uZmSPpGB)).join("."); break;
case 2: _uZmSPpGB = new Uint8Array(_YexhwSLT.slice(_exxuYVwf, _exxuYVwf + 1))[0]; _exxuYVwf++; _ByBQfTAy = new TextDecoder().decode(_YexhwSLT.slice(_exxuYVwf, _exxuYVwf + _uZmSPpGB)); break;
case 3: _uZmSPpGB = 16; const _kYChhZYl = new DataView(_YexhwSLT.slice(_exxuYVwf, _exxuYVwf + _uZmSPpGB)); const _qNkwKLNM = []; for (let _jbSTkMCL = 0; _jbSTkMCL < 8; _jbSTkMCL++) _qNkwKLNM.push(_kYChhZYl.getUint16(_jbSTkMCL * 2).toString(16)); _ByBQfTAy = _qNkwKLNM.join(":"); break;
default: return { error: true, details: `Invalid _KpokZEPb _cgHwBBYC: ${_UWoHyNPN}` };
}
if (!_ByBQfTAy) return { error: true, details: "Target _vxTkKCIg is empty" };
return { error: false, details: { _ByBQfTAy, _sfwfmrQn, _ITRdIAfP, payloadIndex: _exxuYVwf + _uZmSPpGB } };
}
async function _AtnApdcq(_YdLVBUhn, _sDnyivTb, _uGpjjYYS, _bzeCEkHq) {
let _hAlPSlUV = _uGpjjYYS;
let _lxgUJOXd = false;
let _zRVqoaDB = _YdLVBUhn._uVdqfyDB.pipeTo(new WritableStream({
write(chunk) {
_lxgUJOXd = true;
if (_sDnyivTb.readyState !== 1) throw new Error("Channel is not open");
if (_hAlPSlUV) {
const _BFLnubSK = new Uint8Array(_hAlPSlUV.byteLength + chunk.byteLength);
_BFLnubSK._cFvThiOq(new Uint8Array(_hAlPSlUV));
_BFLnubSK._cFvThiOq(new Uint8Array(chunk), _hAlPSlUV.byteLength);
_sDnyivTb.send(_BFLnubSK._YexhwSLT);
_hAlPSlUV = null;
} else {
_sDnyivTb.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _sDnyivTb error:", err._pOiegcWY);
});
await _zRVqoaDB;
if (!_lxgUJOXd && _bzeCEkHq) {
_bzeCEkHq();
}
}
function _PvoAiqfy(_sDnyivTb) {
try { if (_sDnyivTb.readyState === 1 || _sDnyivTb.readyState === 2) _sDnyivTb.close(); } catch (_RsrDgbqX) {}
}
const _bEEXvuUR = Array.from({ _ueCUCPRZ: 256 }, (_, _jbSTkMCL) => (_jbSTkMCL + 256).toString(16).slice(1));
function _TmoEvBkC(_ZbTDEvWZ, offset = 0) {
return (
_bEEXvuUR[_ZbTDEvWZ[offset]] + _bEEXvuUR[_ZbTDEvWZ[offset + 1]] + _bEEXvuUR[_ZbTDEvWZ[offset + 2]] + _bEEXvuUR[_ZbTDEvWZ[offset + 3]] + "-" +
_bEEXvuUR[_ZbTDEvWZ[offset + 4]] + _bEEXvuUR[_ZbTDEvWZ[offset + 5]] + "-" +
_bEEXvuUR[_ZbTDEvWZ[offset + 6]] + _bEEXvuUR[_ZbTDEvWZ[offset + 7]] + "-" +
_bEEXvuUR[_ZbTDEvWZ[offset + 8]] + _bEEXvuUR[_ZbTDEvWZ[offset + 9]] + "-" +
_bEEXvuUR[_ZbTDEvWZ[offset + 10]] + _bEEXvuUR[_ZbTDEvWZ[offset + 11]] +
_bEEXvuUR[_ZbTDEvWZ[offset + 12]] + _bEEXvuUR[_ZbTDEvWZ[offset + 13]] +
_bEEXvuUR[_ZbTDEvWZ[offset + 14]] + _bEEXvuUR[_ZbTDEvWZ[offset + 15]]
).toLowerCase();
}
let _mhgfzRYv = { "N/A":"未知" };
async function _BabtQUyS(_FeNIvQZo, _qSrcbgAn, _bzeCEkHq) {
try {
const _dqOZVNUf = await fetch(_FeNIvQZo, {
_ZwOMJIoE: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_dqOZVNUf.ok) {
console.error(`获取 ${_FeNIvQZo} 失败: HTTP ${_dqOZVNUf.status}`);
return _bzeCEkHq;
}
const _rKlfZOru = await _dqOZVNUf._rKlfZOru();
return _qSrcbgAn(_rKlfZOru);
} catch (error) {
console.error(`获取或解析 ${_FeNIvQZo} 时发生网络错误: ${error._pOiegcWY}`);
return _bzeCEkHq;
}
}
function _wtdJtfFW(_rKlfZOru) {
if (!_rKlfZOru) return [];
const _Sjthndhi = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _ShhLYUra = _rKlfZOru.split(/[\s,;#|]+/);
const _zSOUaExA = [];
for (const _gUeTeYvx of _ShhLYUra) {
const _PUJjvpMP = _gUeTeYvx.trim();
if (!_PUJjvpMP) continue;
const _JGeSqguS = _PUJjvpMP.lastIndexOf(':');
let _gEaUOoqM = _PUJjvpMP;
if(_JGeSqguS > _PUJjvpMP.lastIndexOf(']')) {
const _TyDmYozT = _PUJjvpMP.substring(_JGeSqguS + 1);
if(!isNaN(_TyDmYozT) && _TyDmYozT._ueCUCPRZ > 0) {
_gEaUOoqM = _PUJjvpMP.substring(0, _JGeSqguS);
}
}
if (_yyeKYwKZ.isValid(_gEaUOoqM.replace(/[\[\]]/g, '')) || _Sjthndhi.test(_PUJjvpMP)) {
_zSOUaExA.push(_PUJjvpMP);
}
}
return _zSOUaExA;
}
function _NRSBMzod(_rKlfZOru) {
if (!_rKlfZOru) return [];
return _rKlfZOru.split(/\s+/).filter(d => d.trim() !== '');
}
function _lqDEZZsB(_rKlfZOru) {
if (!_rKlfZOru) return { "N/A": "未知" };
try {
return JSON.parse(`{${_rKlfZOru}}`);
} catch (_RsrDgbqX) {
console.error("解析 _mhgfzRYv 失败:", _RsrDgbqX);
return { "N/A": "未知" };
}
}
const _yyeKYwKZ = {
isValid: (_zNgQWNri) => _yyeKYwKZ.isIPv4(_zNgQWNri) || _yyeKYwKZ.isIPv6(_zNgQWNri),
isIPv4: (_zNgQWNri) => {
if (typeof _zNgQWNri !== 'string') return false;
const _qNkwKLNM = _zNgQWNri.split('.');
if (_qNkwKLNM._ueCUCPRZ !== 4) return false;
return _qNkwKLNM.every(_PbvbXeZp => {
const _ORRyRQXY = parseInt(_PbvbXeZp, 10);
return !isNaN(_ORRyRQXY) && _ORRyRQXY >= 0 && _ORRyRQXY <= 255 && String(_ORRyRQXY) === _PbvbXeZp;
});
},
isIPv6: (_zNgQWNri) => {
if (typeof _zNgQWNri !== '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]))$/_jbSTkMCL.test(_zNgQWNri);
},
toLong4: (_zNgQWNri) => _zNgQWNri.split('.').reduce((acc, octet, _jbSTkMCL) => acc + (parseInt(octet) << (8*(3-_jbSTkMCL))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_zNgQWNri) => {
try {
const _vkKRZwWQ = _zNgQWNri.split('/')[0];
const _qNkwKLNM = _vkKRZwWQ.split('::');
if (_qNkwKLNM._ueCUCPRZ > 2) return 0n;
let _YCzdHfoe = [];
if (_qNkwKLNM[0]) {
_YCzdHfoe = _qNkwKLNM[0].split(':');
}
let _acgpjxeJ = [];
if (_qNkwKLNM._ueCUCPRZ > 1 && _qNkwKLNM[1]) {
_acgpjxeJ = _qNkwKLNM[1].split(':');
}
if (_YCzdHfoe._ueCUCPRZ + _acgpjxeJ._ueCUCPRZ > 8) return 0n;
const _OCNFADKL = 8 - (_YCzdHfoe._ueCUCPRZ + _acgpjxeJ._ueCUCPRZ);
const _qGBsGFwR = [
..._YCzdHfoe,
...Array(_OCNFADKL).fill('0'),
..._acgpjxeJ
].map(_PbvbXeZp => _PbvbXeZp || '0');
while(_qGBsGFwR._ueCUCPRZ < 8) {
_qGBsGFwR.push('0');
}
let _kUtPQCeC = 0n;
for (const _PbvbXeZp of _qGBsGFwR) {
if (_PbvbXeZp._ueCUCPRZ > 4) return 0n;
const _PddNZMdf = BigInt('0x' + _PbvbXeZp);
_kUtPQCeC = (_kUtPQCeC << 16n) | _PddNZMdf;
}
return _kUtPQCeC;
} catch(_RsrDgbqX) {
return 0n;
}
},
fromBigInt6: (_kUtPQCeC) => {
if (typeof _kUtPQCeC !== '_kUtPQCeC' || _kUtPQCeC < 0n) return null;
const _qNkwKLNM = [];
for (let _jbSTkMCL = 0; _jbSTkMCL < 8; _jbSTkMCL++) {
_qNkwKLNM.unshift((_kUtPQCeC & 0xFFFFn).toString(16));
_kUtPQCeC >>= 16n;
}
let _XelYKMsZ = { start: -1, _mEHevXNE: 0 };
let _VqMqOJah = { start: -1, _mEHevXNE: 0 };
for (let _jbSTkMCL = 0; _jbSTkMCL < 8; _jbSTkMCL++) {
if (_qNkwKLNM[_jbSTkMCL] === '0') {
if (_VqMqOJah.start === -1) _VqMqOJah.start = _jbSTkMCL;
_VqMqOJah._mEHevXNE++;
} else {
if (_VqMqOJah._mEHevXNE > _XelYKMsZ._mEHevXNE) _XelYKMsZ = { ..._VqMqOJah };
_VqMqOJah = { start: -1, _mEHevXNE: 0 };
}
}
if (_VqMqOJah._mEHevXNE > _XelYKMsZ._mEHevXNE) _XelYKMsZ = { ..._VqMqOJah };
if (_XelYKMsZ._mEHevXNE > 1) {
_qNkwKLNM.splice(_XelYKMsZ.start, _XelYKMsZ._mEHevXNE, '');
if (_XelYKMsZ.start === 0) _qNkwKLNM.unshift('');
if (_XelYKMsZ.start + _XelYKMsZ._mEHevXNE === 8) _qNkwKLNM.push('');
}
return _qNkwKLNM.join(':');
},
cidrToRange: (cidr, _fQxqDHEX = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _cDqiQYre = parseInt(bitsStr, 10);
const _IiTJuJbi = new Set();
if (_yyeKYwKZ.isIPv4(range)) {
if (isNaN(_cDqiQYre) || _cDqiQYre < 8 || _cDqiQYre > 32) return [];
if (_cDqiQYre === 32) return [range];
const _OzIaqahB = _yyeKYwKZ.toLong4(range);
const _pdwvBsJI = (0xFFFFFFFF << (32 - _cDqiQYre)) >>> 0;
const _WdlSzXoJ = _OzIaqahB & _pdwvBsJI;
const _kbvtCekN = 1 << (32 - _cDqiQYre);
if (_kbvtCekN <= 2) return [];
const _TeNVYBCH = Math.min(_fQxqDHEX, _kbvtCekN - 2);
let _MMRerpHJ = 0;
while (_IiTJuJbi.size < _TeNVYBCH && _MMRerpHJ < _TeNVYBCH * 5) {
const _cMmpgdcr = Math.floor(Math.random() * (_kbvtCekN - 2)) + 1;
_IiTJuJbi.add(_yyeKYwKZ.fromLong4((_WdlSzXoJ + _cMmpgdcr) >>> 0));
_MMRerpHJ++;
}
return Array.from(_IiTJuJbi);
} else if (_yyeKYwKZ.isIPv6(range)) {
if (isNaN(_cDqiQYre) || _cDqiQYre < 16 || _cDqiQYre > 128) return [];
if (_cDqiQYre === 128) return [range];
const _MOxlIlUm = _yyeKYwKZ.toBigInt6(range);
const _pdwvBsJI = (2n ** BigInt(128 - _cDqiQYre) - 1n);
const _WdlSzXoJ = _MOxlIlUm & ~_pdwvBsJI;
const _cwHEaYjP = 2n ** BigInt(128 - _cDqiQYre);
if (_cwHEaYjP <= 2n) return [];
let _MMRerpHJ = 0;
while (_IiTJuJbi.size < _fQxqDHEX && _MMRerpHJ < _fQxqDHEX * 5) {
const _LQhxfArr = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_LQhxfArr);
let _xSDJdjrQ = 0n;
for (const _AmKPchUn of _LQhxfArr) {
_xSDJdjrQ = (_xSDJdjrQ << 8n) | BigInt(_AmKPchUn);
}
const _cMmpgdcr = _xSDJdjrQ % (_cwHEaYjP - 2n) + 1n;
_IiTJuJbi.add(_yyeKYwKZ.fromBigInt6(_WdlSzXoJ + _cMmpgdcr));
_MMRerpHJ++;
}
return Array.from(_IiTJuJbi);
}
return [];
} catch(_RsrDgbqX) {
console.error(`CIDR to range failed for ${cidr}:`, _RsrDgbqX);
return [];
}
}
};
function _TCbiZRiL(_WMKMwsdJ, _DTaESUvv) {
const _fRpheNGT = {};
const _zRSzuNpQ = Object._zRSzuNpQ(_DTaESUvv);
const _qNkwKLNM = _zRSzuNpQ.map(_LfCFIZgy => {
const _UaFhOfsF = _WMKMwsdJ * (_DTaESUvv[_LfCFIZgy] / 100);
return { _LfCFIZgy, _fQxqDHEX: Math.floor(_UaFhOfsF), remainder: _UaFhOfsF - Math.floor(_UaFhOfsF) };
});
let _sQIUqNMy = _qNkwKLNM.reduce((acc, _PbvbXeZp) => acc + _PbvbXeZp._fQxqDHEX, 0);
_qNkwKLNM.sort((a, b) => b.remainder - a.remainder);
let _jmvwxtzp = _WMKMwsdJ - _sQIUqNMy;
for (let _jbSTkMCL = 0; _jbSTkMCL < _jmvwxtzp; _jbSTkMCL++) {
_qNkwKLNM[_jbSTkMCL % _qNkwKLNM._ueCUCPRZ]._fQxqDHEX++;
}
for (const _PbvbXeZp of _qNkwKLNM) {
_fRpheNGT[_PbvbXeZp._LfCFIZgy] = _PbvbXeZp._fQxqDHEX;
}
return _fRpheNGT;
}
async function _PtcQjOZh(_rEKGtlgo) {
const _cWTqQqta = _rEKGtlgo.DB.prepare("SELECT _PddNZMdf FROM kv_data WHERE _LfCFIZgy = ?").bind(_TbSsDVKa);
const { _meNdXQMV } = await _cWTqQqta.all();
return _meNdXQMV._ueCUCPRZ > 0 ? _meNdXQMV[0]._PddNZMdf : null;
}
async function _vqOzbvZv(_rEKGtlgo, _DXqHZlWv) {
const _cWTqQqta = _rEKGtlgo.DB.prepare(
"INSERT INTO kv_data (_LfCFIZgy, _PddNZMdf) VALUES (?, ?) ON CONFLICT(_LfCFIZgy) DO UPDATE SET _PddNZMdf = excluded._PddNZMdf"
);
await _cWTqQqta.bind(_TbSsDVKa, _DXqHZlWv).run();
}
async function _xiQrcEYj(_OjdohtLf, _rEKGtlgo) {
const { _DXqHZlWv } = await _OjdohtLf.json();
const _STpIuzoI = await _PtcQjOZh(_rEKGtlgo);
if (_STpIuzoI === _DXqHZlWv) {
return _GQBfBLBJ({ success: true });
}
return _GQBfBLBJ({ success: false, _pOiegcWY: '密码错误' }, 401);
}
async function _bvAUAmsU(_OjdohtLf, _rEKGtlgo) {
const _KTsUVjiA = await _dZFSPwNE(_rEKGtlgo);
if (!_KTsUVjiA.visitorPassword || !_KTsUVjiA.visitorPassword._aRVwalGf) {
return _GQBfBLBJ({ success: true });
}
try {
const { _DXqHZlWv } = await _OjdohtLf.json();
const _EGQTRTUM = _KTsUVjiA.visitorPassword._DXqHZlWv;
if (_EGQTRTUM && _DXqHZlWv === _EGQTRTUM) {
return _GQBfBLBJ({ success: true });
}
return _GQBfBLBJ({ success: false, _pOiegcWY: '访客密码错误' }, 401);
} catch (_RsrDgbqX) {
return _GQBfBLBJ({ success: false, _pOiegcWY: '无效请求' }, 400);
}
}
async function _isdvxbXk(_OjdohtLf, _rEKGtlgo) {
const _sZeDFkKZ = await _PtcQjOZh(_rEKGtlgo);
if (_sZeDFkKZ) {
return _GQBfBLBJ({ success: false, _pOiegcWY: "密码已设置,无法重复初始化。" }, 403);
}
const { _DXqHZlWv } = await _OjdohtLf.json();
if (!_DXqHZlWv || _DXqHZlWv._ueCUCPRZ < 6) {
return _GQBfBLBJ({ success: false, _pOiegcWY: "密码长度不能少于6位。" }, 400);
}
await _vqOzbvZv(_rEKGtlgo, _DXqHZlWv);
return _GQBfBLBJ({ success: true, _pOiegcWY: "初始密码设置成功!请刷新页面并登录。" });
}
async function _YmlHUvNv(_OjdohtLf, _rEKGtlgo) {
const { _vyqcPRDC, _bGNPyIXi } = await _OjdohtLf.json();
const _STpIuzoI = await _PtcQjOZh(_rEKGtlgo);
if (_STpIuzoI !== _vyqcPRDC) {
return _GQBfBLBJ({ success: false, _pOiegcWY: "旧密码错误。" }, 403);
}
if (!_bGNPyIXi || _bGNPyIXi._ueCUCPRZ < 6) {
return _GQBfBLBJ({ success: false, _pOiegcWY: "新密码长度不能少于6位。" }, 400);
}
await _vqOzbvZv(_rEKGtlgo, _bGNPyIXi);
return _GQBfBLBJ({ success: true, _pOiegcWY: "密码修改成功!" });
}
function _eyDDoihq() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_bdZlqXlE: '',
api: {
_aRVwalGf: true,
_pOiegcWY: '维护中...',
},
ispFilter: { _aRVwalGf: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_aRVwalGf: true
},
websocketStreamer: {
_aRVwalGf: true,
_FeNIvQZo: 'https://snippets.neib.cn'
},
cloudStorage: {
_aRVwalGf: true
},
visitorPassword: {
_aRVwalGf: false,
_DXqHZlWv: '',
},
customSubPath: {
_aRVwalGf: false,
_xcynfIYb: 'latest',
},
subscriptionId: {
_ueCUCPRZ: 8,
_dXctSIpI: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_aRVwalGf: true,
template: 'vless://{_BDUqRTBA}@{_zNgQWNri}:{_cYcavHgQ}?encryption=none&security=tls&sni={_vxTkKCIg}&fp=random&_cgHwBBYC=ws&_vxTkKCIg={_vxTkKCIg}&_xcynfIYb={_xcynfIYb}#{_njTvGXit}',
selectionMode: 'first',
_LTSKiGFq: [
{ _njTvGXit: '默认配置', _vxTkKCIg: '', '_BDUqRTBA': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _xcynfIYb: '/?ed=2560' }
],
_KwnrDcIA: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_aRVwalGf: false,
_rKlfZOru: '',
_ngqeJqKk: 5
},
marquee: {
_aRVwalGf: false,
_rKlfZOru: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_aRVwalGf: true,
sources: [
{ _JeDMiKIp: 'CF官方IPV4', _IiTJuJbi: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _TiuxjqXm: false, _aRVwalGf: true, _wpYibUao: 20 },
{ _JeDMiKIp: 'CF官方IPV6', _IiTJuJbi: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _TiuxjqXm: false, _aRVwalGf: true, _wpYibUao: 20 },
{ _JeDMiKIp: '反代优选0', _IiTJuJbi: 'https://wvs.sosorg.nyc.mn/sub?_BDUqRTBA=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_cgHwBBYC=ws&_vxTkKCIg=ss.nzvrn.com&_xcynfIYb=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _TiuxjqXm: false, _aRVwalGf: true, _wpYibUao: 30 },
{ _JeDMiKIp: '官方优选1', _IiTJuJbi: 'https://ipdb.api.030101.xyz/?_cgHwBBYC=bestcf&_OpSUHqvQ=true', _TiuxjqXm: false, _aRVwalGf: true, _wpYibUao: 10 },
{ _JeDMiKIp: '反代优选2', _IiTJuJbi: 'https://ipdb.api.030101.xyz/?_cgHwBBYC=bestproxy&_OpSUHqvQ=true', _TiuxjqXm: false, _aRVwalGf: true, _wpYibUao: 5 },
{ _JeDMiKIp: '官方优选2', _IiTJuJbi: 'https://addressesapi.090227.xyz/_zNgQWNri.164746.xyz', _TiuxjqXm: false, _aRVwalGf: true, _wpYibUao: 10 },
{ _JeDMiKIp: '官方优选3', _IiTJuJbi: 'https://cfxr.eu.org/getSub?_vxTkKCIg=snipaste.huggy.qzz.io', _TiuxjqXm: false, _aRVwalGf: true, _wpYibUao: 5 },
{ _JeDMiKIp: '官方优选4', _IiTJuJbi: 'https://addressesapi.090227.xyz/CloudFlareYes', _TiuxjqXm: false, _aRVwalGf: true, _wpYibUao: 10 }
]
},
customNodes: {
_aRVwalGf: 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 _NMRSECsT(_rwmuJCnK, _PJshhedV) {
if (!_rwmuJCnK) return _PJshhedV;
const _EwqeXrvM = { ..._PJshhedV };
for (const _LfCFIZgy in _PJshhedV) {
if (_rwmuJCnK.hasOwnProperty(_LfCFIZgy)) {
if (typeof _rwmuJCnK[_LfCFIZgy] === 'object' && _rwmuJCnK[_LfCFIZgy] !== null && !Array.isArray(_rwmuJCnK[_LfCFIZgy]) && typeof _PJshhedV[_LfCFIZgy] === 'object' && _PJshhedV[_LfCFIZgy] !== null && !Array.isArray(_PJshhedV[_LfCFIZgy])) {
_EwqeXrvM[_LfCFIZgy] = _NMRSECsT(_rwmuJCnK[_LfCFIZgy], _PJshhedV[_LfCFIZgy]);
} else {
_EwqeXrvM[_LfCFIZgy] = _rwmuJCnK[_LfCFIZgy];
}
}
}
return _EwqeXrvM;
}
async function _dZFSPwNE(_rEKGtlgo) {
try {
const _cWTqQqta = _rEKGtlgo.DB.prepare("SELECT _PddNZMdf FROM kv_data WHERE _LfCFIZgy = ?").bind(_ZoPeEyUh);
const { _meNdXQMV } = await _cWTqQqta.all();
const _hjOjoYxm = _meNdXQMV._ueCUCPRZ > 0 ? _meNdXQMV[0]._PddNZMdf : null;
const _OwghFzmy = _hjOjoYxm ? JSON.parse(_hjOjoYxm) : {};
return _NMRSECsT(_OwghFzmy, _eyDDoihq());
} catch (_RsrDgbqX) {
console.error("无法从D1获取或解析全局配置:", _RsrDgbqX);
return _eyDDoihq();
}
}
async function _NnBQhUSZ(_rEKGtlgo) {
const _SAQduYSd = await _dZFSPwNE(_rEKGtlgo);
return _GQBfBLBJ(_SAQduYSd);
}
async function _ZnwAvLkW(_OjdohtLf, _rEKGtlgo, _GcEcgtCI) {
try {
const { _SAQduYSd, adminPassword } = await _OjdohtLf.json();
const _STpIuzoI = await _PtcQjOZh(_rEKGtlgo);
if (_STpIuzoI !== adminPassword) {
return _GQBfBLBJ({ success: false, _pOiegcWY: "管理员密码错误" }, 403);
}
const _cWTqQqta = _rEKGtlgo.DB.prepare(
"INSERT INTO kv_data (_LfCFIZgy, _PddNZMdf) VALUES (?, ?) ON CONFLICT(_LfCFIZgy) DO UPDATE SET _PddNZMdf = excluded._PddNZMdf"
);
const _lpHKwxEN = _cWTqQqta.bind(_ZoPeEyUh, JSON.stringify(_SAQduYSd)).run();
_GcEcgtCI.waitUntil(_lpHKwxEN);
return _GQBfBLBJ({ success: true, _pOiegcWY: "配置已成功保存!" });
} catch (_RsrDgbqX) {
return _GQBfBLBJ({ success: false, _pOiegcWY: `保存失败: ${_RsrDgbqX._pOiegcWY}` }, 500);
}
}
async function _fswQJwFS() {
const _srbdNcwq = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _PeWPcNfI = await fetch(_srbdNcwq);
const _UkkHPGPn = await _PeWPcNfI.json();
const _TCBQaKdF = 'https://www.bing.com' + _UkkHPGPn.images[0]._FeNIvQZo;
return fetch(_TCBQaKdF);
} catch (_RsrDgbqX) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _YGlOwSLu(_zNgQWNri) {
try {
const _dqOZVNUf = await fetch(`http://_zNgQWNri-api.com/json/${_zNgQWNri}?fields=status,_OpSUHqvQ,countryCode,_GOQqtlGE&lang=zh-CN`);
if (_dqOZVNUf.ok) {
const _UEpiXCXa = await _dqOZVNUf.json();
if (_UEpiXCXa.status === 'success' && (_UEpiXCXa.countryCode || _UEpiXCXa._OpSUHqvQ)) {
let _GOQqtlGE = _UEpiXCXa._GOQqtlGE || '未知';
if (_GOQqtlGE.toLowerCase().includes('cloudflare')) {
_GOQqtlGE = 'CloudFlare';
}
return {
_JeDMiKIp: _mhgfzRYv[_UEpiXCXa.countryCode] || _UEpiXCXa._OpSUHqvQ || _UEpiXCXa.countryCode,
_GOQqtlGE: _GOQqtlGE
};
}
}
} catch (_RsrDgbqX) {}
try {
const _dqOZVNUf = await fetch(`https://api._zNgQWNri.sb/geoip/${_zNgQWNri}`);
if (_dqOZVNUf.ok) {
const _UEpiXCXa = await _dqOZVNUf.json();
if (_UEpiXCXa.country_code || _UEpiXCXa._OpSUHqvQ) {
let _GOQqtlGE = _UEpiXCXa._GOQqtlGE || '未知';
if (_GOQqtlGE.toLowerCase().includes('cloudflare')) {
_GOQqtlGE = 'CloudFlare';
}
return {
_JeDMiKIp: _mhgfzRYv[_UEpiXCXa.country_code] || _UEpiXCXa._OpSUHqvQ || _UEpiXCXa.country_code,
_GOQqtlGE: _GOQqtlGE
};
}
}
} catch (_RsrDgbqX) {}
return { _JeDMiKIp: '未知', _GOQqtlGE: '未知' };
}
async function _yelmhusD(_OjdohtLf, _rEKGtlgo) {
try {
const { _IiTJuJbi } = await _OjdohtLf.json();
if (!Array.isArray(_IiTJuJbi)) {
return _GQBfBLBJ({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _uqBOUTal = _IiTJuJbi.map(_zNgQWNri => _YGlOwSLu(_zNgQWNri).then(_zhcupgOQ => ({ _zNgQWNri, ..._zhcupgOQ })));
const _meNdXQMV = await Promise.all(_uqBOUTal);
return _GQBfBLBJ(_meNdXQMV);
} catch (_RsrDgbqX) {
return _GQBfBLBJ({ error: `获取地理位置失败: ${_RsrDgbqX._pOiegcWY}` }, 500);
}
}
async function _ppKXEcsY(_OjdohtLf, _rEKGtlgo) {
const _SAQduYSd = await _dZFSPwNE(_rEKGtlgo);
if (!_SAQduYSd.cloudStorage._aRVwalGf) {
return _GQBfBLBJ({ _meNdXQMV: [], generatedBy: null });
}
try {
const _cWTqQqta = _rEKGtlgo.DB.prepare("SELECT _PddNZMdf FROM kv_data WHERE _LfCFIZgy = ?").bind(_qsdUfrSo);
const { _meNdXQMV } = await _cWTqQqta.all();
const _oACmCmxL = _meNdXQMV._ueCUCPRZ > 0 ? _meNdXQMV[0]._PddNZMdf : null;
const _rWybXWAz = _oACmCmxL ? JSON.parse(_oACmCmxL) : null;
return _GQBfBLBJ(_rWybXWAz || { _meNdXQMV: [], generatedBy: null });
} catch (_RsrDgbqX) {
console.error("从D1读取缓存IP失败:", _RsrDgbqX);
return _GQBfBLBJ({ _meNdXQMV: [], generatedBy: null });
}
}
async function _cyiqCMan(_OjdohtLf, _rEKGtlgo, _GcEcgtCI) {
const _SAQduYSd = await _dZFSPwNE(_rEKGtlgo);
if (!_SAQduYSd.cloudStorage._aRVwalGf) {
return _GQBfBLBJ({ success: true, _pOiegcWY: "云端存储已禁用,不保存结果。" });
}
const _EhbOherM = _OjdohtLf._ZwOMJIoE.get('CF-Connecting-IP') || "未知IP";
const _OpSUHqvQ = _OjdohtLf.cf?._OpSUHqvQ || "未知";
const _UhKdfyin = _OjdohtLf.cf?._UhKdfyin || "";
let _nmtkpbDU = _mhgfzRYv[_OpSUHqvQ] || _OpSUHqvQ;
if (_UhKdfyin && _UhKdfyin !== "未知城市" && _UhKdfyin !== _OpSUHqvQ) _nmtkpbDU = `${_nmtkpbDU} ${_mhgfzRYv[_UhKdfyin] || _UhKdfyin}`;
const _islPmotb = {
_zNgQWNri: _UneYVDQX(_EhbOherM),
_JeDMiKIp: _nmtkpbDU.trim(),
time: _nJpmlhJO()
};
try {
const _elocVQyD = await _OjdohtLf.json();
if (!Array.isArray(_elocVQyD)) return _GQBfBLBJ({ error: "无效数据格式" }, 400);
const _gnyONHhS = _elocVQyD.map(_hLSOxTIo => ({
_zNgQWNri: String(_hLSOxTIo._zNgQWNri || ''),
_cYcavHgQ: _hLSOxTIo._cYcavHgQ ? parseInt(_hLSOxTIo._cYcavHgQ, 10) : undefined,
_nHVAIewp: parseInt(_hLSOxTIo._nHVAIewp, 10),
_JeDMiKIp: typeof _hLSOxTIo._JeDMiKIp === 'string' ? _hLSOxTIo._JeDMiKIp.substring(0, 50) : 'N/A',
_GOQqtlGE: typeof _hLSOxTIo._GOQqtlGE === 'string' ? _hLSOxTIo._GOQqtlGE.substring(0, 100) : 'N/A'
}));
const _VIMXQDKy = {
generatedBy: _islPmotb,
_meNdXQMV: _gnyONHhS
};
const _hTCsNtqY = _rEKGtlgo.DB.prepare(
"INSERT INTO kv_data (_LfCFIZgy, _PddNZMdf) VALUES (?, ?) ON CONFLICT(_LfCFIZgy) DO UPDATE SET _PddNZMdf = excluded._PddNZMdf"
).bind(_qsdUfrSo, JSON.stringify(_VIMXQDKy)).run();
if (_SAQduYSd.telegram.bot_token && _SAQduYSd.telegram.chat_id) {
const _KruTcNLK = _gnyONHhS.map(r => `${r._zNgQWNri} ~ ${r._JeDMiKIp}`).join('\n');
const _HpPxYKqj = `优选完成!\n来源: ${_islPmotb._zNgQWNri} (${_islPmotb._JeDMiKIp})\n时间: ${_islPmotb.time}\n\n结果:\n${_KruTcNLK}`;
const _XyacVrRY = `https://api.telegram.org/bot${_SAQduYSd.telegram.bot_token}/sendMessage?chat_id=${_SAQduYSd.telegram.chat_id}&_rKlfZOru=${encodeURIComponent(_HpPxYKqj)}`;
const _fphtDJpD = fetch(_XyacVrRY).catch(_RsrDgbqX => console.error("Telegram结果通知失败:", _RsrDgbqX));
_GcEcgtCI.waitUntil(Promise.all([_hTCsNtqY, _fphtDJpD]));
} else {
_GcEcgtCI.waitUntil(_hTCsNtqY);
}
return _GQBfBLBJ({ success: true, _pOiegcWY: "结果已保存" });
} catch (_RsrDgbqX) {
return _GQBfBLBJ({ error: "D1写入失败", _pOiegcWY: _RsrDgbqX._pOiegcWY }, 500);
}
}
async function _GESsqoNx(_OjdohtLf, _rEKGtlgo, _GcEcgtCI) {
try {
const _mRSAnpKm = await _OjdohtLf.json();
if (!Array.isArray(_mRSAnpKm)) return _GQBfBLBJ({ error: "无效数据格式" }, 400);
const _VIMXQDKy = {
_meNdXQMV: _mRSAnpKm
};
const _cWTqQqta = _rEKGtlgo.DB.prepare(
"INSERT INTO kv_data (_LfCFIZgy, _PddNZMdf) VALUES (?, ?) ON CONFLICT(_LfCFIZgy) DO UPDATE SET _PddNZMdf = excluded._PddNZMdf"
);
const _lpHKwxEN = _cWTqQqta.bind(_XanQCPSV, JSON.stringify(_VIMXQDKy)).run();
_GcEcgtCI.waitUntil(_lpHKwxEN);
return _GQBfBLBJ({ success: true });
} catch (_RsrDgbqX) {
return _GQBfBLBJ({ error: "D1写入临时缓存失败", _pOiegcWY: _RsrDgbqX._pOiegcWY }, 500);
}
}
function _higwKjgy(_ueCUCPRZ, _dXctSIpI) {
let _aoWLZQHK = '';
const _jiDSkbem = _dXctSIpI._ueCUCPRZ;
for (let _jbSTkMCL = 0; _jbSTkMCL < _ueCUCPRZ; _jbSTkMCL++) {
_aoWLZQHK += _dXctSIpI.charAt(Math.floor(Math.random() * _jiDSkbem));
}
return _aoWLZQHK;
}
async function _eGKzLDhd(_OjdohtLf, _rEKGtlgo) {
try {
const _elocVQyD = await _OjdohtLf.json();
if (!Array.isArray(_elocVQyD) || _elocVQyD._ueCUCPRZ === 0) {
return _GQBfBLBJ({ error: "无效或空的IP列表" }, 400);
}
const _SAQduYSd = await _dZFSPwNE(_rEKGtlgo);
const _vNPGKxXT = _SAQduYSd.subscriptionId || { _ueCUCPRZ: 8, _dXctSIpI: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _AlLHGkxa;
let _eqLuNyBF = false;
let _MMRerpHJ = 0;
const _rvwJvUZG = 10;
while (!_eqLuNyBF && _MMRerpHJ < _rvwJvUZG) {
_AlLHGkxa = _higwKjgy(_vNPGKxXT._ueCUCPRZ, _vNPGKxXT._dXctSIpI);
const { _meNdXQMV } = await _rEKGtlgo.DB.prepare("SELECT _wCBEUxaf FROM optimized_results WHERE _wCBEUxaf = ?").bind(_AlLHGkxa).all();
if (_meNdXQMV._ueCUCPRZ === 0) {
_eqLuNyBF = true;
}
_MMRerpHJ++;
}
if (!_eqLuNyBF) {
return _GQBfBLBJ({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _FuWLxQno = JSON.stringify({ _IiTJuJbi: _elocVQyD });
await _rEKGtlgo.DB.prepare(
"INSERT INTO optimized_results (_wCBEUxaf, _UEpiXCXa) VALUES (?, ?)"
).bind(_AlLHGkxa, _FuWLxQno).run();
await _rEKGtlgo.DB.prepare(
"INSERT INTO kv_data (_LfCFIZgy, _PddNZMdf) VALUES (?, ?) ON CONFLICT(_LfCFIZgy) DO UPDATE SET _PddNZMdf = excluded._PddNZMdf"
).bind(_pyKEqRbm, _AlLHGkxa).run();
return _GQBfBLBJ({ success: true, _wCBEUxaf: _AlLHGkxa });
} catch (_RsrDgbqX) {
return _GQBfBLBJ({ error: "保存优选结果失败", _pOiegcWY: _RsrDgbqX._pOiegcWY }, 500);
}
}
async function _lGqAUIdD(_OjdohtLf, _rEKGtlgo) {
try {
const _AlLHGkxa = _OjdohtLf._lcNZqsDv._wCBEUxaf;
if (!_AlLHGkxa) {
return new Response("缺少结果ID", { status: 400 });
}
const _aoWLZQHK = await _rEKGtlgo.DB.prepare("SELECT _UEpiXCXa FROM optimized_results WHERE _wCBEUxaf = ?").bind(_AlLHGkxa).first();
if (!_aoWLZQHK) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _UEpiXCXa = JSON.parse(_aoWLZQHK._UEpiXCXa);
let _KruTcNLK = _UEpiXCXa._IiTJuJbi;
const _SAQduYSd = await _dZFSPwNE(_rEKGtlgo);
if (_SAQduYSd.customNodes && _SAQduYSd.customNodes._aRVwalGf && _SAQduYSd.customNodes.list) {
const _CHprnZjc = _SAQduYSd.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _jLoGGFCs = _CHprnZjc.map(_OPuMRxKS => {
let _KpokZEPb = _OPuMRxKS;
let _cYcavHgQ = undefined;
let _njTvGXit = null;
if (_KpokZEPb.includes('@')) {
const _qNkwKLNM = _KpokZEPb.split('@');
_njTvGXit = _qNkwKLNM.pop();
_KpokZEPb = _qNkwKLNM.join('@');
}
if (_KpokZEPb.includes('#')) {
const _qNkwKLNM = _KpokZEPb.split('#');
const _TyDmYozT = _qNkwKLNM.pop();
if (!isNaN(_TyDmYozT) && _TyDmYozT.trim() !== '') {
_cYcavHgQ = parseInt(_TyDmYozT, 10);
}
_KpokZEPb = _qNkwKLNM.join('#');
}
return {
_zNgQWNri: _KpokZEPb,
_cYcavHgQ: _cYcavHgQ,
_JeDMiKIp: _njTvGXit || _KpokZEPb,
_GOQqtlGE: '自定义'
};
});
_KruTcNLK.unshift(..._jLoGGFCs);
}
const { itemLink } = _SAQduYSd;
const _wTizRaFr = new URL(_OjdohtLf._FeNIvQZo)._yzvJpwrq;
let _cLiHWPYh;
if (_SAQduYSd.websocketStreamer && _SAQduYSd.websocketStreamer._aRVwalGf) {
if (!itemLink || !itemLink._aRVwalGf || !itemLink._LTSKiGFq || itemLink._LTSKiGFq._ueCUCPRZ === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_cLiHWPYh = _KruTcNLK.map((_hLSOxTIo, _rWbFRmdi) => {
let _njTvGXit;
if (_hLSOxTIo._GOQqtlGE === '自定义') {
_njTvGXit = `${_rWbFRmdi + 1} - ${_hLSOxTIo._JeDMiKIp}`;
} else {
_njTvGXit = `${_rWbFRmdi + 1} - ${_hLSOxTIo._JeDMiKIp || '未知'}`;
if (!_hLSOxTIo._GOQqtlGE || !_hLSOxTIo._GOQqtlGE.toLowerCase().includes('cloudflare')) {
_njTvGXit += '(反代)';
}
}
const _IzybDSYV = _yyeKYwKZ.isIPv6(_hLSOxTIo._zNgQWNri) ? `[${_hLSOxTIo._zNgQWNri}]` : _hLSOxTIo._zNgQWNri;
const _cYcavHgQ = _hLSOxTIo._cYcavHgQ || 443;
const _jwcMrRoi = itemLink._LTSKiGFq[0];
const _ORZNFoUO = _jwcMrRoi._BDUqRTBA || '';
const _BDUqRTBA = (_ORZNFoUO && _qzawfgLC(_ORZNFoUO)) ? _ORZNFoUO : crypto.randomUUID();
const _xcynfIYb = '/snippets?_zNgQWNri=endpointAddress:_cYcavHgQ(443)&nat64=6to4';
const _vxTkKCIg = _jwcMrRoi._vxTkKCIg || _wTizRaFr;
const _lcNZqsDv = new URLSearchParams({
security: 'tls',
_cgHwBBYC: 'ws',
_vxTkKCIg: _vxTkKCIg,
sni: _vxTkKCIg,
fp: 'random'
});
return `vless://${_BDUqRTBA}@${_IzybDSYV}:${_cYcavHgQ}?${_lcNZqsDv.toString()}&_xcynfIYb=${encodeURIComponent(encodeURIComponent(_xcynfIYb))}#${encodeURIComponent(_njTvGXit)}`;
});
} else {
if (!itemLink || !itemLink._aRVwalGf || !itemLink._LTSKiGFq || itemLink._LTSKiGFq._ueCUCPRZ === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _jwcMrRoi = itemLink._LTSKiGFq[0];
const { _vxTkKCIg, _BDUqRTBA, _xcynfIYb } = _jwcMrRoi;
_cLiHWPYh = _KruTcNLK.map((_hLSOxTIo, _rWbFRmdi) => {
let _njTvGXit;
if (_hLSOxTIo._GOQqtlGE === '自定义') {
_njTvGXit = `${_rWbFRmdi + 1} - ${_hLSOxTIo._JeDMiKIp}`;
} else {
_njTvGXit = `${_rWbFRmdi + 1} - ${_hLSOxTIo._JeDMiKIp || '未知'}`;
if (!_hLSOxTIo._GOQqtlGE || !_hLSOxTIo._GOQqtlGE.toLowerCase().includes('cloudflare')) {
_njTvGXit += '(反代)';
}
}
const _IzybDSYV = _yyeKYwKZ.isIPv6(_hLSOxTIo._zNgQWNri) ? `[${_hLSOxTIo._zNgQWNri}]` : _hLSOxTIo._zNgQWNri;
const _cYcavHgQ = _hLSOxTIo._cYcavHgQ || 443;
const _lcNZqsDv = new URLSearchParams({
security: 'tls',
_cgHwBBYC: 'ws',
_vxTkKCIg: _vxTkKCIg || _wTizRaFr,
sni: _vxTkKCIg || _wTizRaFr,
fp: 'random'
});
return `vless://${_BDUqRTBA}@${_IzybDSYV}:${_cYcavHgQ}?${_lcNZqsDv.toString()}&_xcynfIYb=${encodeURIComponent(encodeURIComponent(_xcynfIYb || ''))}#${encodeURIComponent(_njTvGXit)}`;
});
}
const _MZQpEJTG = _cLiHWPYh.join('\n');
const _FRbquPzl = btoa(_MZQpEJTG);
return new Response(_FRbquPzl, {
_ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' }
});
} catch (_RsrDgbqX) {
return new Response(`生成节点列表失败: ${_RsrDgbqX._pOiegcWY}`, { status: 500 });
}
}
async function _SZNfhZQU(_OjdohtLf) {
try {
const { _JrvSIbhq, _cgHwBBYC } = await _OjdohtLf.json();
if (!Array.isArray(_JrvSIbhq)) {
return new Response('Invalid _JrvSIbhq list', { status: 400 });
}
const _YGQtgXWY = _JrvSIbhq.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _FeNIvQZo = `https://cloudflare-dns.com/dns-query?_njTvGXit=${encodeURIComponent(domain.trim())}&_cgHwBBYC=${_cgHwBBYC || 'A'}`;
return fetch(_FeNIvQZo, { _ZwOMJIoE: { 'Accept': 'application/dns-json' } })
.then(_dqOZVNUf => _dqOZVNUf.json())
.then(_UEpiXCXa => (_UEpiXCXa.Answer ? _UEpiXCXa.Answer.map(a => a._UEpiXCXa) : []))
.catch(() => []);
});
const _RZdtWnPi = (await Promise.all(_YGQtgXWY)).flat();
const _lLELnUDx = [...new Set(_RZdtWnPi)];
if (_lLELnUDx._ueCUCPRZ === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_lLELnUDx.join('\n'), { _ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._pOiegcWY}`, { status: 500 });
}
}
async function _hfUbqDpD(_OjdohtLf, _rEKGtlgo) {
try {
const { _qEFtuSKG } = await _OjdohtLf.json();
if (!Array.isArray(_qEFtuSKG)) {
return _GQBfBLBJ({ error: "Invalid input, expected an object with a '_qEFtuSKG' array." }, 400);
}
const _sKrLeUBk = new Set();
const _ozEQidBi = _qEFtuSKG.map(_FeNIvQZo =>
_PFjAdovt(_FeNIvQZo)
.then(_rKlfZOru => {
if (!_rKlfZOru) return;
const _ShhLYUra = _rKlfZOru.split(/[\s,;|]+/);
for (const _gUeTeYvx of _ShhLYUra) {
const _PUJjvpMP = _gUeTeYvx.trim();
if (_PUJjvpMP) {
_sKrLeUBk.add(_PUJjvpMP);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_FeNIvQZo}:`, err);
})
);
await Promise.all(_ozEQidBi);
return _GQBfBLBJ({ _IiTJuJbi: Array.from(_sKrLeUBk) });
} catch (_RsrDgbqX) {
return _GQBfBLBJ({ error: `Failed to process URLs: ${_RsrDgbqX._pOiegcWY}` }, 500);
}
}
async function _diqVcMYI(_OjdohtLf, _rEKGtlgo) {
const _SAQduYSd = await _dZFSPwNE(_rEKGtlgo);
if (!_SAQduYSd.api._aRVwalGf) {
return new Response(_SAQduYSd.api._pOiegcWY || 'API is disabled.', { status: 503 });
}
try {
const _cWTqQqta = _rEKGtlgo.DB.prepare("SELECT _PddNZMdf FROM kv_data WHERE _LfCFIZgy = ?").bind(_qsdUfrSo);
const { _meNdXQMV: dbResults } = await _cWTqQqta.all();
const _oACmCmxL = dbResults._ueCUCPRZ > 0 ? dbResults[0]._PddNZMdf : null;
const _rWybXWAz = _oACmCmxL ? JSON.parse(_oACmCmxL) : null;
if (!_rWybXWAz || !_rWybXWAz._meNdXQMV || _rWybXWAz._meNdXQMV._ueCUCPRZ === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' },
});
}
const _IiTJuJbi = _rWybXWAz._meNdXQMV.map(r => r._zNgQWNri);
return new Response(_IiTJuJbi.join('\n'), {
_ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' },
});
} catch (_RsrDgbqX) {
console.error("API /_zNgQWNri 处理错误:", _RsrDgbqX);
return new Response(`API处理时出错: ${_RsrDgbqX._pOiegcWY}`, { status: 500 });
}
}
function _PAemEtpm(_aoWLZQHK, _rWbFRmdi, _SAQduYSd, _wTizRaFr) {
const { itemLink } = _SAQduYSd;
if (!itemLink || !itemLink._aRVwalGf) return null;
const { template, _LTSKiGFq, selectionMode, _KwnrDcIA } = itemLink;
if (!_LTSKiGFq || _LTSKiGFq._ueCUCPRZ === 0) return null;
let _NExHydnJ;
if (selectionMode === 'random') {
_NExHydnJ = _LTSKiGFq[_rWbFRmdi % _LTSKiGFq._ueCUCPRZ];
} else if (selectionMode === 'first') {
_NExHydnJ = _LTSKiGFq[0];
} else {
_NExHydnJ = _LTSKiGFq.find(s => s._njTvGXit === selectionMode) || _LTSKiGFq[0];
}
if (!_NExHydnJ) return null;
let _oIXHsDcf = template;
const _HZmxqEqI = _aoWLZQHK._cYcavHgQ || 443;
const _QijFLweZ = _yyeKYwKZ.isIPv6(_aoWLZQHK._zNgQWNri) ? `[${_aoWLZQHK._zNgQWNri}]` : _aoWLZQHK._zNgQWNri;
let _njTvGXit = `${_rWbFRmdi + 1} 、 ${_aoWLZQHK._JeDMiKIp || '未知'}`;
if (!_aoWLZQHK._GOQqtlGE || !_aoWLZQHK._GOQqtlGE.toLowerCase().includes('cloudflare')) {
_njTvGXit += '(反代)';
}
let _vxTkKCIg = _NExHydnJ._vxTkKCIg || _wTizRaFr;
_oIXHsDcf = _oIXHsDcf.replace(/{_zNgQWNri}/g, _QijFLweZ)
.replace(/{_cYcavHgQ}/g, _HZmxqEqI)
.replace(/{_njTvGXit}/g, encodeURIComponent(_njTvGXit))
.replace(/{rank}/g, _rWbFRmdi + 1)
.replace(/{_JeDMiKIp}/g, encodeURIComponent(_aoWLZQHK._JeDMiKIp || '未知'))
.replace(/{_GOQqtlGE}/g, encodeURIComponent(_aoWLZQHK._GOQqtlGE || '未知'))
.replace(/{_vxTkKCIg}/g, encodeURIComponent(_vxTkKCIg))
.replace(/{_BDUqRTBA}/g, encodeURIComponent(_NExHydnJ['_BDUqRTBA'] || ''))
.replace(/{_xcynfIYb}/g, encodeURIComponent(encodeURIComponent(_NExHydnJ._xcynfIYb || '')));
if (_KwnrDcIA) {
_KwnrDcIA.forEach(field => {
const _jdzUjbzt = new RegExp('{' + field._njTvGXit + '}', 'g');
_oIXHsDcf = _oIXHsDcf.replace(_jdzUjbzt, encodeURIComponent(field._PddNZMdf));
});
}
return _oIXHsDcf;
}
async function _NLgjQrOX(_OjdohtLf, _rEKGtlgo) {
const _SAQduYSd = await _dZFSPwNE(_rEKGtlgo);
if (!_SAQduYSd.itemLink._aRVwalGf) {
return new Response("Item _oIXHsDcf feature is disabled.", { status: 503, _ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' } });
}
try {
const _cWTqQqta = _rEKGtlgo.DB.prepare("SELECT _PddNZMdf FROM kv_data WHERE _LfCFIZgy = ?").bind(_qsdUfrSo);
const { _meNdXQMV: dbResults } = await _cWTqQqta.all();
const _oACmCmxL = dbResults._ueCUCPRZ > 0 ? dbResults[0]._PddNZMdf : null;
const _rWybXWAz = _oACmCmxL ? JSON.parse(_oACmCmxL) : null;
if (!_rWybXWAz || !_rWybXWAz._meNdXQMV || _rWybXWAz._meNdXQMV._ueCUCPRZ === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' },
});
}
const _wTizRaFr = new URL(_OjdohtLf._FeNIvQZo)._yzvJpwrq;
const _JQuDEMGd = _rWybXWAz._meNdXQMV.map((_aoWLZQHK, _rWbFRmdi) => {
return _PAemEtpm(_aoWLZQHK, _rWbFRmdi, _SAQduYSd, _wTizRaFr);
}).filter(Boolean);
if (_JQuDEMGd._ueCUCPRZ === 0) {
return new Response("Could not generate any _hLSOxTIo links from the available IPs.", {
status: 500,
_ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' },
});
}
return new Response(_JQuDEMGd.join('\n'), {
_ZwOMJIoE: { 'Content-Type': '_rKlfZOru/plain; _dXctSIpI=utf-8' },
});
} catch (_RsrDgbqX) {
console.error("API /api/endpoints error:", _RsrDgbqX);
return new Response(`Error processing API _OjdohtLf: ${_RsrDgbqX._pOiegcWY}`, { status: 500 });
}
}
async function _IZSedxqp(_OjdohtLf, _rEKGtlgo, _GcEcgtCI) {
const _EhbOherM = _OjdohtLf._ZwOMJIoE.get('CF-Connecting-IP') || "未知IP";
const [
_ZKsFYtfE,
_NdZNVBqi,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_BabtQUyS(_oPMDJFqG, _wtdJtfFW, []),
_BabtQUyS(_rmIHkACn, _wtdJtfFW, []),
_BabtQUyS(_WqbeWJOR, _NRSBMzod, []),
_BabtQUyS(_rWkEfMrF, _lqDEZZsB, { "N/A": "未知" })
]);
_mhgfzRYv = fetchedCountryMap;
let _vhLuCpXR = false;
let _KTsUVjiA;
try {
const _DXqHZlWv = await _PtcQjOZh(_rEKGtlgo);
_vhLuCpXR = !!_DXqHZlWv;
_KTsUVjiA = await _dZFSPwNE(_rEKGtlgo);
} catch (_RsrDgbqX) {
if (_RsrDgbqX._pOiegcWY && _RsrDgbqX._pOiegcWY.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _HxVXvyJF = "CREATE TABLE IF NOT EXISTS kv_data (_LfCFIZgy TEXT PRIMARY KEY, _PddNZMdf TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_wCBEUxaf TEXT PRIMARY KEY, _UEpiXCXa TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _rEKGtlgo.DB.exec(_HxVXvyJF);
console.log("数据表创建成功。");
_vhLuCpXR = false;
_KTsUVjiA = _eyDDoihq();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._pOiegcWY}`, {
status: 500,
_ZwOMJIoE: { 'Content-Type': '_rKlfZOru/html;_dXctSIpI=UTF-8' }
});
}
} else {
let _XXVIPzrg = _iVoyFdiy(_RsrDgbqX._pOiegcWY);
return new Response(_XXVIPzrg, { _ZwOMJIoE: { 'Content-Type': '_rKlfZOru/html;_dXctSIpI=UTF-8' } });
}
}
if (_KTsUVjiA.telegram.bot_token && _KTsUVjiA.telegram.chat_id) {
const _OpSUHqvQ = _OjdohtLf.cf?._OpSUHqvQ || "未知";
const _UhKdfyin = _OjdohtLf.cf?._UhKdfyin || "";
let _nmtkpbDU = _mhgfzRYv[_OpSUHqvQ] || _OpSUHqvQ;
if (_UhKdfyin && _UhKdfyin !== "未知城市" && _UhKdfyin !== _OpSUHqvQ) _nmtkpbDU = `${_nmtkpbDU} ${_mhgfzRYv[_UhKdfyin] || _UhKdfyin}`;
const _KkHAMwCU = _nJpmlhJO();
const _rpUmCCcv = _OjdohtLf._FeNIvQZo;
const _HpPxYKqj = `访客: ${_EhbOherM}\n位置: ${_nmtkpbDU.trim()}\n时间: ${_KkHAMwCU}\n来自:${_rpUmCCcv}`;
const _XyacVrRY = `https://api.telegram.org/bot${_KTsUVjiA.telegram.bot_token}/sendMessage?chat_id=${_KTsUVjiA.telegram.chat_id}&_rKlfZOru=${encodeURIComponent(_HpPxYKqj)}`;
_GcEcgtCI.waitUntil(fetch(_XyacVrRY).catch(_RsrDgbqX => console.error("Telegram通知失败:", _RsrDgbqX)));
}
let _HLziRiSy = _aaqxFCBl();
const _ZiEjgBvd = {
_SAQduYSd: _KTsUVjiA,
status: {
_vhLuCpXR: _vhLuCpXR,
}
};
_HLziRiSy = _HLziRiSy.replace('__PAGE_DATA_JSON__', JSON.stringify(_ZiEjgBvd));
_HLziRiSy = _HLziRiSy.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_ZKsFYtfE));
_HLziRiSy = _HLziRiSy.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_NdZNVBqi));
_HLziRiSy = _HLziRiSy.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_HLziRiSy = _HLziRiSy.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_mhgfzRYv));
return new Response(_HLziRiSy, {
_ZwOMJIoE: { 'Content-Type': '_rKlfZOru/html;_dXctSIpI=UTF-8' },
});
}
function _GQBfBLBJ(_SEZcaJmb, status = 200, _ZwOMJIoE = {}) {
return new Response(JSON.stringify(_SEZcaJmb), {
status,
_ZwOMJIoE: { 'Content-Type': 'application/json;_dXctSIpI=UTF-8', ..._ZwOMJIoE }
});
}
function _nJpmlhJO(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 _UneYVDQX(_zNgQWNri) {
if (!_zNgQWNri || typeof _zNgQWNri !== 'string') return "无效IP";
if(_yyeKYwKZ.isIPv4(_zNgQWNri)){
const _qNkwKLNM = _zNgQWNri.split('.');
if (_qNkwKLNM._ueCUCPRZ === 4) return `${_qNkwKLNM[0]}.*.*.${_qNkwKLNM[3]}`;
}
if(_yyeKYwKZ.isIPv6(_zNgQWNri)){
const _qNkwKLNM = _zNgQWNri.split(':');
if (_qNkwKLNM._ueCUCPRZ > 2) return `${_qNkwKLNM[0]}:...:${_qNkwKLNM[_qNkwKLNM._ueCUCPRZ - 1]}`;
}
return _zNgQWNri;
}
function _iVoyFdiy(_zkdKFBCs) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _dXctSIpI="UTF-8"><title>需要设置</title>
<_bqJVQEOY>
_SEZcaJmb { font-family: sans-serif; background: #1a1a1a; _ZFAagGBy: #e0e0e0; display: flex; justify-_QJspXcDE: center; align-items: center; height: 100vh; margin: 0; }
._YcQNHniu { max-_PKydkKvH: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _ZFAagGBy: #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 { _ZFAagGBy: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_SaBVZyGp: 1rem; }
</_bqJVQEOY>
</head><_SEZcaJmb>
<div class="_YcQNHniu">
<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>
${_zkdKFBCs ? `<div class="error"><strong>当前错误信息:</strong> ${_zkdKFBCs.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_SEZcaJmb></html>`;
}
function _aaqxFCBl() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _dXctSIpI="UTF-8"> <meta _njTvGXit="viewport" _QJspXcDE="_PKydkKvH=device-_PKydkKvH, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_oIXHsDcf 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>
<_bqJVQEOY>
:root { --primary-_ZFAagGBy: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_ZFAagGBy: #8c939d; --light-bg: #1A1C20; --_QJspXcDE-bg: #25282E; --border-_ZFAagGBy: #40444C; --_rKlfZOru-_ZFAagGBy: #E0E0E0; --_rKlfZOru-light: #B0B0B0; --success-_ZFAagGBy: #30A46C; --danger-_ZFAagGBy: #DA3633; --warning-_ZFAagGBy: #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; }
_SEZcaJmb { font-family: var(--font-family-sans); background-_ZFAagGBy: var(--light-bg); _ZFAagGBy: var(--_rKlfZOru-_ZFAagGBy); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_ZFAagGBy 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_BoSKenCP { position: fixed; _SaBVZyGp: 0; _HWPwfuBx: 0; _PKydkKvH: 100%; height: 100%; z-_rWbFRmdi: -1; display: none; }
._nYJwRFiI-_YcQNHniu { max-_PKydkKvH: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_rWbFRmdi: 1; }
#_nIJoStnM { position: fixed; _SaBVZyGp: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_rWbFRmdi: 10; }
#marquee-_YcQNHniu { overflow: hidden; white-space: nowrap; background-_ZFAagGBy: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _ZFAagGBy: var(--primary-_ZFAagGBy); padding: 0.5rem 0; margin-_SaBVZyGp: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_rKlfZOru { display: inline-block; padding-_HWPwfuBx: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_uGpjjYYS { _rKlfZOru-align: center; margin-_SaBVZyGp: 1rem; margin-bottom: 2rem; }
_uGpjjYYS h1 { white-space: pre-wrap; font-size: 2.25em; _ZFAagGBy: var(--primary-_ZFAagGBy); font-weight: 700; _rKlfZOru-shadow: 0 0 10px rgba(var(--primary-_ZFAagGBy-rgb), 0.3); }
.card { background-_ZFAagGBy: 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-_ZFAagGBy); }
.progress-section #_lMOLeXFq { _PKydkKvH: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_ZFAagGBy: var(--border-_ZFAagGBy); overflow: hidden; }
.progress-section #_lMOLeXFq::-webkit-progress-_PddNZMdf { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _rKlfZOru-align: center; margin-_SaBVZyGp: 0.75em; font-size: 0.95em; _ZFAagGBy: var(--_rKlfZOru-light); min-height: 1.5em; }
.section-_uGpjjYYS { display: flex; flex-wrap: wrap; justify-_QJspXcDE: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_ZFAagGBy); gap: 1rem; }
.section-_uGpjjYYS h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _ZFAagGBy: var(--secondary-_ZFAagGBy); _rKlfZOru-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _PKydkKvH: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _PKydkKvH: 100%; border-collapse: collapse; margin-_SaBVZyGp: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_ZFAagGBy); padding: 0.8em; _rKlfZOru-align: _HWPwfuBx; vertical-align: middle; white-space: nowrap; }
th { background-_ZFAagGBy: #2c3038; font-weight: 500; }
tbody tr:hover { background-_ZFAagGBy: #30333a; }
td._zNgQWNri-_KpokZEPb { font-weight: 500; font-family: var(--font-family-mono); _ZFAagGBy: var(--primary-_ZFAagGBy); }
td.ping-_PddNZMdf { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _rKlfZOru-align: right; }
.btn { display: inline-flex; align-items: center; justify-_QJspXcDE: center; font-weight: 500; _rKlfZOru-align: center; cursor: pointer; user-_uesrEtdT: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _ZFAagGBy: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_HWPwfuBx: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _ZFAagGBy: var(--primary-_ZFAagGBy); border: 1px solid var(--primary-_ZFAagGBy); }
.btn-outline:hover { background-_ZFAagGBy: var(--primary-_ZFAagGBy); _ZFAagGBy: var(--_QJspXcDE-bg); }
._nYJwRFiI-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._nYJwRFiI-download-buttons .btn { _PKydkKvH: 100%; margin: 0; }
.tooltip-notification { position: fixed; _SaBVZyGp: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _ZFAagGBy: #fff; font-size: 0.95em; z-_rWbFRmdi: 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); }
#_CDrwhDMf, #_QpcwJICX, #_wjnheczd, #_XdBdGerK, #_eCLqIMIm { display: none; position: fixed; z-_rWbFRmdi: 10000; _HWPwfuBx: 0; _SaBVZyGp: 0; _PKydkKvH: 100%; height: 100%; background-_ZFAagGBy: rgba(0,0,0,0.6); justify-_QJspXcDE: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_QJspXcDE, ._nYJwRFiI-modal-_QJspXcDE { background-_ZFAagGBy: var(--_QJspXcDE-bg); padding: 2rem; border: 1px solid var(--border-_ZFAagGBy); border-radius: var(--border-radius-md); _PKydkKvH: 95%; max-_PKydkKvH: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_XdBdGerK .modal-_QJspXcDE { max-_PKydkKvH: 500px; }
.modal-_QJspXcDE h3, ._nYJwRFiI-modal-_uGpjjYYS h3 { margin-_SaBVZyGp: 0; margin-bottom: 1.5rem; _ZFAagGBy: var(--primary-_ZFAagGBy); _rKlfZOru-align: center; }
.modal-buttons { display: flex; justify-_QJspXcDE: flex-end; gap: 1rem; margin-_SaBVZyGp: 2rem; border-_SaBVZyGp: 1px solid var(--border-_ZFAagGBy); padding-_SaBVZyGp: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_ZFAagGBy), rgba(0,0,0,0)); margin: 2rem 0; }
._nYJwRFiI-modal-_uGpjjYYS { display: flex; justify-_QJspXcDE: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_ZFAagGBy); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _ZFAagGBy: var(--_rKlfZOru-light); cursor: pointer; background: none; border: none; padding: 0; }
._nYJwRFiI-list-_hLSOxTIo { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_ZFAagGBy); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._nYJwRFiI-_njTvGXit { font-size: 1.1em; font-weight: 600; }
._nYJwRFiI-links a { display: block; _ZFAagGBy: var(--primary-_ZFAagGBy); _rKlfZOru-decoration: none; margin-_SaBVZyGp: 0.5rem; word-break: break-all; }
._nYJwRFiI-links a:hover { _rKlfZOru-decoration: underline; }
._nYJwRFiI-links span { _ZFAagGBy: var(--_rKlfZOru-light); }
#visitorPasswordPrompt { _rKlfZOru-align: center; }
#visitorPasswordPrompt h3 { _ZFAagGBy: var(--primary-_ZFAagGBy); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _ZFAagGBy: var(--_rKlfZOru-light); margin-bottom: 1.5rem; }
._DXqHZlWv-input-group { display: flex; gap: 10px; max-_PKydkKvH: 400px; margin: 0 auto; }
._DXqHZlWv-input-group input { flex-grow: 1; _rKlfZOru-align: center; }
._DXqHZlWv-input-group .btn { margin-_HWPwfuBx: 0; }
._meNdXQMV-actions-_YcQNHniu { _rKlfZOru-align: center; margin-bottom: 1.5rem; }
._meNdXQMV-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._meNdXQMV-api-buttons .btn { margin: 0; _PKydkKvH: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_QJspXcDE 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 _uesrEtdT, .form-grid-control textarea { _PKydkKvH: 100%; background-_ZFAagGBy: var(--light-bg); border: 1px solid var(--border-_ZFAagGBy); border-radius: var(--border-radius-sm); _ZFAagGBy: var(--_rKlfZOru-_ZFAagGBy); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_ZFAagGBy 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _uesrEtdT:focus, .form-grid-control textarea:focus { border-_ZFAagGBy: var(--primary-_ZFAagGBy); box-shadow: 0 0 0 2px rgba(var(--primary-_ZFAagGBy-rgb), 0.2); outline: none; }
.form-grid-control input[_cgHwBBYC="_ZFAagGBy"] { min-_PKydkKvH: auto; padding: 2px; _PKydkKvH: 2.5em; height: 2.5em; }
.form-grid-control input[_cgHwBBYC="checkbox"] { _PKydkKvH: auto; flex-shrink: 0; height: 1.2em; _PKydkKvH: 1.2em; }
.form-grid-control ._wpYibUao-input { _PKydkKvH: 80px; _rKlfZOru-align: right; }
.tooltip-_OKjZkkid { display: inline-flex; _PKydkKvH: 16px; height: 16px; align-items: center; justify-_QJspXcDE: center; background-_ZFAagGBy: var(--secondary-_ZFAagGBy); _ZFAagGBy: var(--_QJspXcDE-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_uesrEtdT: none; }
#tooltip-popup { position: fixed; background-_ZFAagGBy: #383c4a; _ZFAagGBy: #fff; padding: 10px 15px; border-radius: 6px; z-_rWbFRmdi: 10001; font-size: 0.85em; max-_PKydkKvH: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_ZFAagGBy); pointer-events: none; }
#custom-fields-_YcQNHniu .form-grid-control { gap: 5px; } #custom-fields-_YcQNHniu .form-grid-control input { flex: 1; }
.parameter-_cFvThiOq-_DPynTlru { border: 1px solid var(--border-_ZFAagGBy); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_cFvThiOq-_uGpjjYYS { display: flex; justify-_QJspXcDE: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_cFvThiOq-_uGpjjYYS input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_SaBVZyGp: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._rKlfZOru-_ZFAagGBy-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _PKydkKvH: 100%; }
._rKlfZOru-_ZFAagGBy-grid input[_cgHwBBYC="_ZFAagGBy"] { grid-column: 1 / 2; }
._rKlfZOru-_ZFAagGBy-grid input[_cgHwBBYC="_rKlfZOru"], ._rKlfZOru-_ZFAagGBy-grid textarea { grid-column: 2 / 3; }
#_XdBdGerK .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_XdBdGerK .btn-group { display: flex; }
#_XdBdGerK .sub-btn { flex-grow: 1; margin: 0; }
#_XdBdGerK ._IPxWHwPA-btn { flex-shrink: 0; margin-_HWPwfuBx: -1px; border-_SaBVZyGp-_HWPwfuBx-radius: 0; border-bottom-_HWPwfuBx-radius: 0; }
#_eCLqIMIm .modal-_QJspXcDE { max-_PKydkKvH: 300px; background: white; padding: 1rem; _rKlfZOru-align: center; }
#qrCodeImg { max-_PKydkKvH: 100%; }
@media (max-_PKydkKvH: 768px) {
html { font-size: 15px; } ._nYJwRFiI-_YcQNHniu { padding: 0 0.8rem; } _uGpjjYYS { margin-_SaBVZyGp: 2.5rem; margin-bottom: 1.5rem; } #_nIJoStnM { _SaBVZyGp: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_bqJVQEOY>
<_bqJVQEOY _wCBEUxaf="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_QJspXcDE-bg: #FFFFFF; --border-_ZFAagGBy: #DCDFE6; --_rKlfZOru-_ZFAagGBy: #303133; --_rKlfZOru-light: #606266; }
.theme-light .card { background-_ZFAagGBy: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_ZFAagGBy: #F5F7FA; }
.theme-light tbody tr:hover { background-_ZFAagGBy: #ECF5FF; }
.theme-matrix { --primary-_ZFAagGBy: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_QJspXcDE-bg: #0D0208; --border-_ZFAagGBy: #00FF41; --_rKlfZOru-_ZFAagGBy: #00FF41; --_rKlfZOru-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_ZFAagGBy: rgba(0, 20, 0, 0.7); _rKlfZOru-shadow: 0 0 5px var(--primary-_ZFAagGBy); backdrop-filter: none; }
.theme-matrix th { background-_ZFAagGBy: #000; }
.theme-matrix tbody tr:hover { background-_ZFAagGBy: #010; }
.theme-matrix .btn { _rKlfZOru-shadow: none; _ZFAagGBy: #000; }
.theme-matrix .btn-outline { background-_ZFAagGBy: transparent; }
.theme-modern-glass { --primary-_ZFAagGBy: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_QJspXcDE-bg: rgba(30, 30, 40, 0.6); --border-_ZFAagGBy: rgba(255, 255, 255, 0.2); --_rKlfZOru-_ZFAagGBy: #F0F0F0; --_rKlfZOru-light: #A0A0B0; --border-radius-md: 12px; }
_SEZcaJmb.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-_ZFAagGBy: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_QJspXcDE-bg: rgba(30, 30, 40, 0.6); --border-_ZFAagGBy: rgba(255, 255, 255, 0.2); --_rKlfZOru-_ZFAagGBy: #F0F0F0; --_rKlfZOru-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_ZFAagGBy: var(--_QJspXcDE-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_ZFAagGBy); }
.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-_ZFAagGBy: rgba(0,0,0,0.3); border-right-_ZFAagGBy: 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); _rKlfZOru-shadow: 0 1px 2px rgba(0,0,0,0.2); _ZFAagGBy: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_ZFAagGBy: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _rKlfZOru-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_ZFAagGBy); border-_ZFAagGBy: var(--primary-_ZFAagGBy); _ZFAagGBy: #fff; }
.glassy-components _uGpjjYYS h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _rKlfZOru; -webkit-_rKlfZOru-fill-_ZFAagGBy: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _ZFAagGBy: transparent; }
.theme-aurora-glass { --primary-_ZFAagGBy: #38bdf8; --light-bg: #0c0a09; --_QJspXcDE-bg: rgba(23, 23, 23, 0.5); --border-_ZFAagGBy: rgba(255, 255, 255, 0.15); --_rKlfZOru-_ZFAagGBy: #f2f2f2; --_rKlfZOru-light: #a3a3a3; }
_SEZcaJmb.theme-aurora-glass::before { _QJspXcDE: ''; position: fixed; _SaBVZyGp: 0; _HWPwfuBx: 0; _PKydkKvH: 100%; height: 100%; z-_rWbFRmdi: -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-_ZFAagGBy: #08fdd8; --light-bg: #010409; --_QJspXcDE-bg: rgba(22, 27, 34, 0.6); --border-_ZFAagGBy: rgba(139, 148, 158, 0.3); --_rKlfZOru-_ZFAagGBy: #e6edf3; --_rKlfZOru-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_ZFAagGBy), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_ZFAagGBy-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_ZFAagGBy-rgb), 0.5); }
.theme-marble-light { --primary-_ZFAagGBy: #bfa37c; --light-bg: #f7f5f2; --_QJspXcDE-bg: #ffffff; --border-_ZFAagGBy: #e0dcd5; --_rKlfZOru-_ZFAagGBy: #3d3a36; --_rKlfZOru-light: #6b6661; }
_SEZcaJmb.theme-marble-light { background-image: _FeNIvQZo('_UEpiXCXa:image/svg+xml,%3Csvg _PKydkKvH="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-_ZFAagGBy: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_bqJVQEOY>
</head><_SEZcaJmb _wCBEUxaf="pageBody">
<_BoSKenCP _wCBEUxaf="background-_BoSKenCP"></_BoSKenCP>
<div _wCBEUxaf="_CDrwhDMf">
<div class="modal-_QJspXcDE">
<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 _cgHwBBYC="_DXqHZlWv" _wCBEUxaf="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _cgHwBBYC="_DXqHZlWv" _wCBEUxaf="confirmPassword"></div></div>
<div class="modal-buttons"><button _wCBEUxaf="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_nYJwRFiI-_YcQNHniu">
<button _wCBEUxaf="_nIJoStnM" class="btn btn-outline"></button>
<div _wCBEUxaf="marquee-_YcQNHniu"><div _wCBEUxaf="marquee-_rKlfZOru"></div></div>
<_uGpjjYYS><h1 _wCBEUxaf="pageTitle"></h1></_uGpjjYYS>
<div class="card" _wCBEUxaf="visitorPasswordPrompt" _bqJVQEOY="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_DXqHZlWv-input-group">
<input _cgHwBBYC="_DXqHZlWv" _wCBEUxaf="visitorPasswordEntry" _jdzUjbzt="访客密码">
<button _wCBEUxaf="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _wCBEUxaf="_dHKNOQYZ" _bqJVQEOY="display: block;">
<div class="card progress-section">
<div _wCBEUxaf="progressDisplay">
<progress _wCBEUxaf="_lMOLeXFq" _PddNZMdf="0" max="100"></progress>
<div _wCBEUxaf="status">正在初始化...</div>
</div>
</div>
<div class="card _nYJwRFiI-download-section">
<div class="section-_uGpjjYYS"><h2 _wCBEUxaf="appDownloadTitleEl"></h2></div>
<div class="_nYJwRFiI-download-buttons">
<button class="btn" _UEpiXCXa-_jrvfbThn="android">安卓客户端</button>
<button class="btn" _UEpiXCXa-_jrvfbThn="ios">苹果客户端</button>
<button class="btn" _UEpiXCXa-_jrvfbThn="windows">Windows客户端</button>
<button class="btn" _UEpiXCXa-_jrvfbThn="mac">Mac客户端</button>
</div>
</div>
<div class="card _meNdXQMV-section" _wCBEUxaf="_HRmGNfRu" _bqJVQEOY="display:none;">
<div class="section-_uGpjjYYS">
<h2 _wCBEUxaf="liveTitleEl"></h2>
<div class="generator-info" _wCBEUxaf="liveGeneratorInfo"></div>
</div>
<div _wCBEUxaf="_xWjeOwIS" class="_meNdXQMV-actions-_YcQNHniu" _bqJVQEOY="display: none;">
<div class="_meNdXQMV-api-buttons">
<button _wCBEUxaf="copyIpApiBtn" class="btn">复制 IP API</button>
<button _wCBEUxaf="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _wCBEUxaf="resultsTable">
<thead><tr><th _wCBEUxaf="tableHeader1El"></th><th _wCBEUxaf="tableHeader2El"></th><th _wCBEUxaf="tableHeader3El"></th><th _wCBEUxaf="tableHeader4El"></th><th _wCBEUxaf="tableHeader5El"></th><th _wCBEUxaf="tableHeader6El"></th><th _wCBEUxaf="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _wCBEUxaf="_JDFLWfrs" _bqJVQEOY="display:none;">
<div class="section-_uGpjjYYS"><h2 _wCBEUxaf="cachedTitleEl"></h2><div class="generator-info" _wCBEUxaf="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _wCBEUxaf="cachedResultsTable">
<thead><tr><th _wCBEUxaf="cachedTableHeader1El"></th><th _wCBEUxaf="cachedTableHeader2El"></th><th _wCBEUxaf="cachedTableHeader3El"></th><th _wCBEUxaf="cachedTableHeader4El"></th><th _wCBEUxaf="cachedTableHeader5El"></th><th _wCBEUxaf="cachedTableHeader6El"></th><th _wCBEUxaf="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _wCBEUxaf="notificationTooltip" class="tooltip-notification"></div>
<div _wCBEUxaf="_QpcwJICX">
<div class="modal-_QJspXcDE">
<h3>修改参数</h3>
<div _bqJVQEOY="display: flex; border-bottom: 1px solid var(--border-_ZFAagGBy); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_GWGRRyGQ(event, 'general-_HStTKvcj')">通用设置</button>
<button class="tab-button" onclick="_GWGRRyGQ(event, '_oIXHsDcf-_HStTKvcj')">链接设置</button>
<button class="tab-button" onclick="_GWGRRyGQ(event, 'fine-grained-_HStTKvcj')">IP源设置</button>
<button class="tab-button" onclick="_GWGRRyGQ(event, 'advanced-_HStTKvcj')">高级设置</button>
</div>
<div _wCBEUxaf="general-_HStTKvcj" class="tab-_QJspXcDE" _bqJVQEOY="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_uesrEtdT _wCBEUxaf="themeSelect">
<_eRzjzmQQ _PddNZMdf="theme-aurora-glass">极光-玻璃质感</_eRzjzmQQ>
<_eRzjzmQQ _PddNZMdf="theme-particles-glass">粒子-玻璃质感</_eRzjzmQQ>
<_eRzjzmQQ _PddNZMdf="theme-modern-glass">现代-玻璃质感</_eRzjzmQQ>
<_eRzjzmQQ _PddNZMdf="theme-cyberpunk-glass">赛博朋克-玻璃质感</_eRzjzmQQ>
<_eRzjzmQQ _PddNZMdf="theme-dark-particles">暗色-粒子背景</_eRzjzmQQ>
<_eRzjzmQQ _PddNZMdf="theme-dark-bing">暗色-必应壁纸</_eRzjzmQQ>
<_eRzjzmQQ _PddNZMdf="theme-light">亮色-简约</_eRzjzmQQ>
<_eRzjzmQQ _PddNZMdf="theme-light-bing">亮色-必应壁纸</_eRzjzmQQ>
<_eRzjzmQQ _PddNZMdf="theme-marble-light">简约大理石-亮色</_eRzjzmQQ>
<_eRzjzmQQ _PddNZMdf="theme-matrix">矩阵-代码雨</_eRzjzmQQ>
</_uesrEtdT>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _cgHwBBYC="_ZFAagGBy" _wCBEUxaf="primaryColorInput">
<span _bqJVQEOY="_PKydkKvH: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _cgHwBBYC="_ZFAagGBy" _wCBEUxaf="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bqJVQEOY="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_rKlfZOru-_ZFAagGBy-grid"><input _cgHwBBYC="_ZFAagGBy" _wCBEUxaf="colorInput_title"><textarea _wCBEUxaf="textInput_title" _ZBRGJeiL="1" _jdzUjbzt="页面主标题"></textarea></div>
<div class="_rKlfZOru-_ZFAagGBy-grid"><input _cgHwBBYC="_ZFAagGBy" _wCBEUxaf="colorInput_loginButton"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="textInput_loginButton" _jdzUjbzt="登录按钮文本"></div>
<div class="_rKlfZOru-_ZFAagGBy-grid"><input _cgHwBBYC="_ZFAagGBy" _wCBEUxaf="colorInput_appDownloadTitle"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="textInput_appDownloadTitle" _jdzUjbzt="APP下载标题"></div>
<div class="_rKlfZOru-_ZFAagGBy-grid"><input _cgHwBBYC="_ZFAagGBy" _wCBEUxaf="colorInput_liveTitle"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="textInput_liveTitle" _jdzUjbzt="本次结果标题"></div>
<div class="_rKlfZOru-_ZFAagGBy-grid"><input _cgHwBBYC="_ZFAagGBy" _wCBEUxaf="colorInput_cachedTitle"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="textInput_cachedTitle" _jdzUjbzt="上次结果标题"></div>
<div class="_rKlfZOru-_ZFAagGBy-grid"><input _cgHwBBYC="_ZFAagGBy" _wCBEUxaf="colorInput_tableHeader"><input _cgHwBBYC="_rKlfZOru" _PddNZMdf="表格头部文本颜色" readonly _bqJVQEOY="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bqJVQEOY="align-self: start;"><label>公告栏设置</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _wCBEUxaf="announcementText" _jdzUjbzt="在此输入公告内容" _ZBRGJeiL="3"></textarea>
<div _bqJVQEOY="display: flex; justify-_QJspXcDE: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _bqJVQEOY="display: flex; align-items: center; gap: 5px;"><input _cgHwBBYC="checkbox" _wCBEUxaf="enableMarquee"> 顶部走马灯</label>
<label _bqJVQEOY="display: flex; align-items: center; gap: 5px;"><input _cgHwBBYC="checkbox" _wCBEUxaf="enablePopup"> 右上角弹窗</label>
<div _wCBEUxaf="popupDurationContainer" _bqJVQEOY="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _cgHwBBYC="number" _wCBEUxaf="popupDuration" _bqJVQEOY="_PKydkKvH: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _wCBEUxaf="_oIXHsDcf-_HStTKvcj" class="tab-_QJspXcDE">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="converterServiceUrlInput" _jdzUjbzt="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _cgHwBBYC="number" _wCBEUxaf="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _bqJVQEOY="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _wCBEUxaf="subscriptionIdCharset" _ZBRGJeiL="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-_OKjZkkid" _UEpiXCXa-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="justify-_QJspXcDE: flex-start;"><input _cgHwBBYC="checkbox" _wCBEUxaf="enableItemLinkCheckbox"></div>
</div>
<div _wCBEUxaf="itemLinkConfigGroup" _bqJVQEOY="display:none; margin-_SaBVZyGp: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _bqJVQEOY="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="定义分享链接格式。可用占位符: {_zNgQWNri}, {_cYcavHgQ}, {_njTvGXit}, {rank}, {_JeDMiKIp}, {_GOQqtlGE}, {_vxTkKCIg}, {_BDUqRTBA}, {_xcynfIYb}。">?</span></div>
<div class="form-grid-control"><textarea _wCBEUxaf="itemLinkTemplateInput" _ZBRGJeiL="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_uesrEtdT _wCBEUxaf="parameterSelectionMode"></_uesrEtdT></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _wCBEUxaf="parameter-sets-_YcQNHniu"></div><button _cgHwBBYC="button" _wCBEUxaf="add-parameter-_cFvThiOq-btn" class="btn btn-outline" _bqJVQEOY="margin-_SaBVZyGp: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bqJVQEOY="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _wCBEUxaf="custom-fields-_YcQNHniu" _bqJVQEOY="_PKydkKvH: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _bqJVQEOY="justify-_QJspXcDE: flex-start;"><button _cgHwBBYC="button" _wCBEUxaf="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _wCBEUxaf="fine-grained-_HStTKvcj" class="tab-_QJspXcDE">
<div class="form-grid-label" _bqJVQEOY="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _bqJVQEOY="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_QJspXcDE: flex-start;">
<label><input _cgHwBBYC="checkbox" _wCBEUxaf="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _cgHwBBYC="checkbox" _wCBEUxaf="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _wCBEUxaf="fine-grained-sources-_YcQNHniu"></div><button _cgHwBBYC="button" _wCBEUxaf="add-fine-grained-_YDCusDOA-btn" class="btn btn-outline" _bqJVQEOY="margin-_SaBVZyGp: 10px;">添加地区</button></div>
</div>
<div _wCBEUxaf="advanced-_HStTKvcj" class="tab-_QJspXcDE">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _cgHwBBYC="checkbox" _wCBEUxaf="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _wCBEUxaf="resolvedDomainsGroup" _bqJVQEOY="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _wCBEUxaf="resolvedDomainsInput" _jdzUjbzt="留空则使用内置默认域名" _ZBRGJeiL="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-_OKjZkkid" _UEpiXCXa-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _cgHwBBYC="checkbox" _wCBEUxaf="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _wCBEUxaf="customNodesGroup" _bqJVQEOY="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _wCBEUxaf="customNodesInput" _jdzUjbzt="一行一个地址,支持域名、IPv4、IPv6。" _ZBRGJeiL="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-_OKjZkkid" _UEpiXCXa-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _cgHwBBYC="number" _wCBEUxaf="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _cgHwBBYC="number" _wCBEUxaf="topNInput"></div>
<div class="form-grid-label" _bqJVQEOY="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="display: none;"><input _cgHwBBYC="number" _wCBEUxaf="latencyRangeMinInput" _jdzUjbzt="最小"><span>-</span><input _cgHwBBYC="number" _wCBEUxaf="latencyRangeMaxInput" _jdzUjbzt="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="justify-_QJspXcDE: flex-start;"><input _cgHwBBYC="checkbox" _wCBEUxaf="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-_OKjZkkid" _UEpiXCXa-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _cgHwBBYC="number" _wCBEUxaf="geoLocationRetriesInput" _bqJVQEOY="_PKydkKvH: 80px;"> <span>次</span>
<div _bqJVQEOY="display: flex; align-items: center; gap: 5px; margin-_HWPwfuBx: 20px;">
<input _cgHwBBYC="checkbox" _wCBEUxaf="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-_OKjZkkid" _UEpiXCXa-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_vxTkKCIg:_cYcavHgQ' 或 '_vxTkKCIg'。">?</span></div>
<div class="form-grid-control"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="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-_OKjZkkid" _UEpiXCXa-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="justify-_QJspXcDE: flex-start;"><input _cgHwBBYC="checkbox" _wCBEUxaf="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _wCBEUxaf="websocketStreamerGroup" _bqJVQEOY="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="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-_OKjZkkid" _UEpiXCXa-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="justify-_QJspXcDE: flex-start;"><input _cgHwBBYC="checkbox" _wCBEUxaf="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="启用 /_zNgQWNri 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="justify-_QJspXcDE: flex-start;"><input _cgHwBBYC="checkbox" _wCBEUxaf="enableApiCheckbox"></div>
<div class="form-grid-control-full" _wCBEUxaf="apiConfigGroup" _bqJVQEOY="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="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-_OKjZkkid" _UEpiXCXa-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="justify-_QJspXcDE: flex-start;"><input _cgHwBBYC="checkbox" _wCBEUxaf="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _wCBEUxaf="customSubPathGroup" _bqJVQEOY="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="customSubPathInput" _jdzUjbzt="例如: 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-_OKjZkkid" _UEpiXCXa-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="justify-_QJspXcDE: flex-start;"><input _cgHwBBYC="checkbox" _wCBEUxaf="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _wCBEUxaf="visitorPasswordGroup" _bqJVQEOY="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bqJVQEOY="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_OKjZkkid" _UEpiXCXa-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _bqJVQEOY="flex-direction: column; align-items: stretch; gap: 8px;"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="botTokenInput" _jdzUjbzt="Telegram Bot Token"><input _cgHwBBYC="_rKlfZOru" _wCBEUxaf="chatIdInput" _jdzUjbzt="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _bqJVQEOY="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _bqJVQEOY="flex-direction: column; align-items: stretch; gap: 8px;"><input _cgHwBBYC="_DXqHZlWv" _wCBEUxaf="oldPasswordInput" _jdzUjbzt="旧密码"><input _cgHwBBYC="_DXqHZlWv" _wCBEUxaf="newPasswordInput" _jdzUjbzt="新密码 (至少6位)"><button _wCBEUxaf="changePasswordBtn" class="btn" _bqJVQEOY="align-self: flex-start; margin-_HWPwfuBx: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _wCBEUxaf="closeModalBtn" class="btn btn-outline">关闭</button><button _wCBEUxaf="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _wCBEUxaf="_wjnheczd">
<div class="_nYJwRFiI-modal-_QJspXcDE">
<div class="_nYJwRFiI-modal-_uGpjjYYS"><h3 _wCBEUxaf="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_nYJwRFiI-modal-_SEZcaJmb" _wCBEUxaf="appModalBody"></div>
</div>
</div>
<div _wCBEUxaf="_XdBdGerK">
<div class="modal-_QJspXcDE">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _UEpiXCXa-sub-_cgHwBBYC="coreEngine">Xray</button><button class="btn _IPxWHwPA-btn" _UEpiXCXa-sub-_cgHwBBYC="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _UEpiXCXa-sub-_cgHwBBYC="coreProfile">Sing-Box</button><button class="btn _IPxWHwPA-btn" _UEpiXCXa-sub-_cgHwBBYC="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _UEpiXCXa-sub-_cgHwBBYC="configProfile">Clash</button><button class="btn _IPxWHwPA-btn" _UEpiXCXa-sub-_cgHwBBYC="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _UEpiXCXa-sub-_cgHwBBYC="policyProfile">Surge</button><button class="btn _IPxWHwPA-btn" _UEpiXCXa-sub-_cgHwBBYC="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _bqJVQEOY="justify-_QJspXcDE: center;"><button class="btn btn-outline" _wCBEUxaf="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _wCBEUxaf="_eCLqIMIm">
<div class="modal-_QJspXcDE">
<img _wCBEUxaf="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _yyeKYwKZ = {
isValid: (_zNgQWNri) => _yyeKYwKZ.isIPv4(_zNgQWNri) || _yyeKYwKZ.isIPv6(_zNgQWNri),
isIPv4: (_zNgQWNri) => {
if (typeof _zNgQWNri !== 'string') return false;
const _qNkwKLNM = _zNgQWNri.split('.');
if (_qNkwKLNM._ueCUCPRZ !== 4) return false;
return _qNkwKLNM.every(_PbvbXeZp => {
const _ORRyRQXY = parseInt(_PbvbXeZp, 10);
return !isNaN(_ORRyRQXY) && _ORRyRQXY >= 0 && _ORRyRQXY <= 255 && String(_ORRyRQXY) === _PbvbXeZp;
});
},
isIPv6: (_zNgQWNri) => {
if (typeof _zNgQWNri !== '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]))$/_jbSTkMCL.test(_zNgQWNri);
},
toLong4: (_zNgQWNri) => _zNgQWNri.split('.').reduce((acc, octet, _jbSTkMCL) => acc + (parseInt(octet) << (8*(3-_jbSTkMCL))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_zNgQWNri) => {
try {
const _vkKRZwWQ = _zNgQWNri.split('/')[0];
const _qNkwKLNM = _vkKRZwWQ.split('::');
if (_qNkwKLNM._ueCUCPRZ > 2) return 0n;
let _YCzdHfoe = [];
if (_qNkwKLNM[0]) {
_YCzdHfoe = _qNkwKLNM[0].split(':');
}
let _acgpjxeJ = [];
if (_qNkwKLNM._ueCUCPRZ > 1 && _qNkwKLNM[1]) {
_acgpjxeJ = _qNkwKLNM[1].split(':');
}
if (_YCzdHfoe._ueCUCPRZ + _acgpjxeJ._ueCUCPRZ > 8) return 0n;
const _OCNFADKL = 8 - (_YCzdHfoe._ueCUCPRZ + _acgpjxeJ._ueCUCPRZ);
const _qGBsGFwR = [
..._YCzdHfoe,
...Array(_OCNFADKL).fill('0'),
..._acgpjxeJ
].map(_PbvbXeZp => _PbvbXeZp || '0');
while(_qGBsGFwR._ueCUCPRZ < 8) {
_qGBsGFwR.push('0');
}
let _kUtPQCeC = 0n;
for (const _PbvbXeZp of _qGBsGFwR) {
if (_PbvbXeZp._ueCUCPRZ > 4) return 0n;
const _PddNZMdf = BigInt('0x' + _PbvbXeZp);
_kUtPQCeC = (_kUtPQCeC << 16n) | _PddNZMdf;
}
return _kUtPQCeC;
} catch(_RsrDgbqX) {
return 0n;
}
},
fromBigInt6: (_kUtPQCeC) => {
if (typeof _kUtPQCeC !== '_kUtPQCeC' || _kUtPQCeC < 0n) return null;
const _qNkwKLNM = [];
for (let _jbSTkMCL = 0; _jbSTkMCL < 8; _jbSTkMCL++) {
_qNkwKLNM.unshift((_kUtPQCeC & 0xFFFFn).toString(16));
_kUtPQCeC >>= 16n;
}
let _XelYKMsZ = { start: -1, _mEHevXNE: 0 };
let _VqMqOJah = { start: -1, _mEHevXNE: 0 };
for (let _jbSTkMCL = 0; _jbSTkMCL < 8; _jbSTkMCL++) {
if (_qNkwKLNM[_jbSTkMCL] === '0') {
if (_VqMqOJah.start === -1) _VqMqOJah.start = _jbSTkMCL;
_VqMqOJah._mEHevXNE++;
} else {
if (_VqMqOJah._mEHevXNE > _XelYKMsZ._mEHevXNE) _XelYKMsZ = { ..._VqMqOJah };
_VqMqOJah = { start: -1, _mEHevXNE: 0 };
}
}
if (_VqMqOJah._mEHevXNE > _XelYKMsZ._mEHevXNE) _XelYKMsZ = { ..._VqMqOJah };
if (_XelYKMsZ._mEHevXNE > 1) {
_qNkwKLNM.splice(_XelYKMsZ.start, _XelYKMsZ._mEHevXNE, '');
if (_XelYKMsZ.start === 0) _qNkwKLNM.unshift('');
if (_XelYKMsZ.start + _XelYKMsZ._mEHevXNE === 8) _qNkwKLNM.push('');
}
return _qNkwKLNM.join(':');
},
cidrToRange: (cidr, _fQxqDHEX = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _cDqiQYre = parseInt(bitsStr, 10);
const _IiTJuJbi = new Set();
if (_yyeKYwKZ.isIPv4(range)) {
if (isNaN(_cDqiQYre) || _cDqiQYre < 8 || _cDqiQYre > 32) return [];
if (_cDqiQYre === 32) return [range];
const _OzIaqahB = _yyeKYwKZ.toLong4(range);
const _pdwvBsJI = (0xFFFFFFFF << (32 - _cDqiQYre)) >>> 0;
const _WdlSzXoJ = _OzIaqahB & _pdwvBsJI;
const _kbvtCekN = 1 << (32 - _cDqiQYre);
if (_kbvtCekN <= 2) return [];
const _TeNVYBCH = Math.min(_fQxqDHEX, _kbvtCekN - 2);
let _MMRerpHJ = 0;
while (_IiTJuJbi.size < _TeNVYBCH && _MMRerpHJ < _TeNVYBCH * 5) {
const _cMmpgdcr = Math.floor(Math.random() * (_kbvtCekN - 2)) + 1;
_IiTJuJbi.add(_yyeKYwKZ.fromLong4((_WdlSzXoJ + _cMmpgdcr) >>> 0));
_MMRerpHJ++;
}
return Array.from(_IiTJuJbi);
} else if (_yyeKYwKZ.isIPv6(range)) {
if (isNaN(_cDqiQYre) || _cDqiQYre < 16 || _cDqiQYre > 128) return [];
if (_cDqiQYre === 128) return [range];
const _MOxlIlUm = _yyeKYwKZ.toBigInt6(range);
const _pdwvBsJI = (2n ** BigInt(128 - _cDqiQYre) - 1n);
const _WdlSzXoJ = _MOxlIlUm & ~_pdwvBsJI;
const _cwHEaYjP = 2n ** BigInt(128 - _cDqiQYre);
if (_cwHEaYjP <= 2n) return [];
let _MMRerpHJ = 0;
while (_IiTJuJbi.size < _fQxqDHEX && _MMRerpHJ < _fQxqDHEX * 5) {
const _LQhxfArr = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_LQhxfArr);
let _xSDJdjrQ = 0n;
for (const _AmKPchUn of _LQhxfArr) {
_xSDJdjrQ = (_xSDJdjrQ << 8n) | BigInt(_AmKPchUn);
}
const _cMmpgdcr = _xSDJdjrQ % (_cwHEaYjP - 2n) + 1n;
_IiTJuJbi.add(_yyeKYwKZ.fromBigInt6(_WdlSzXoJ + _cMmpgdcr));
_MMRerpHJ++;
}
return Array.from(_IiTJuJbi);
}
return [];
} catch(_RsrDgbqX) {
console.error(`CIDR to range failed for ${cidr}:`, _RsrDgbqX);
return [];
}
}
};
function _TCbiZRiL(_WMKMwsdJ, _DTaESUvv) {
const _fRpheNGT = {};
const _zRSzuNpQ = Object._zRSzuNpQ(_DTaESUvv);
const _qNkwKLNM = _zRSzuNpQ.map(_LfCFIZgy => {
const _UaFhOfsF = _WMKMwsdJ * (_DTaESUvv[_LfCFIZgy] / 100);
return { _LfCFIZgy, _fQxqDHEX: Math.floor(_UaFhOfsF), remainder: _UaFhOfsF - Math.floor(_UaFhOfsF) };
});
let _sQIUqNMy = _qNkwKLNM.reduce((acc, _PbvbXeZp) => acc + _PbvbXeZp._fQxqDHEX, 0);
_qNkwKLNM.sort((a, b) => b.remainder - a.remainder);
let _jmvwxtzp = _WMKMwsdJ - _sQIUqNMy;
for (let _jbSTkMCL = 0; _jbSTkMCL < _jmvwxtzp; _jbSTkMCL++) {
_qNkwKLNM[_jbSTkMCL % _qNkwKLNM._ueCUCPRZ]._fQxqDHEX++;
}
for (const _PbvbXeZp of _qNkwKLNM) {
_fRpheNGT[_PbvbXeZp._LfCFIZgy] = _PbvbXeZp._fQxqDHEX;
}
return _fRpheNGT;
}
const _ZiEjgBvd = __PAGE_DATA_JSON__;
const _KTsUVjiA = _ZiEjgBvd._SAQduYSd;
const _XJXShKRZ = _ZiEjgBvd.status;
const _ZKsFYtfE = __ALL_CF_CIDR_LIST_JSON__;
const _NdZNVBqi = __BALANCED_CF_CIDR_LIST_JSON__;
const _vyvgDOoK = __DEFAULT_DOMAINS_LIST_JSON__;
const _mhgfzRYv = __COUNTRY_MAP_JSON__;
const _ZzoavhxI = _mhgfzRYv;
const _vfiCJnoz = 2500;
const _GnEhCQWJ = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _dHKNOQYZ = document.getElementById('_dHKNOQYZ');
const _lMOLeXFq = document.getElementById('_lMOLeXFq');
const _cJNVnGDA = document.getElementById('status');
const _HRmGNfRu = document.getElementById('_HRmGNfRu');
const _klTwqJMa = document.getElementById('resultsTable').querySelector('tbody');
const _JDFLWfrs = document.getElementById('_JDFLWfrs');
const _XJndZTKC = document.getElementById('cachedResultsTable').querySelector('tbody');
const _fXYUUOZt = document.getElementById('notificationTooltip');
const _nIJoStnM = document.getElementById('_nIJoStnM');
const _QpcwJICX = document.getElementById('_QpcwJICX');
const _wjnheczd = document.getElementById('_wjnheczd');
const _XdBdGerK = document.getElementById('_XdBdGerK');
const _eCLqIMIm = document.getElementById('_eCLqIMIm');
const _CDrwhDMf = document.getElementById('_CDrwhDMf');
const _xWjeOwIS = document.getElementById('_xWjeOwIS');
let _uoKVGKRb = null;
let _NEPFTDcv = null;
let _dDKTuJZl = [];
let _aNHydtfv = false;
let _ZsJfPVXz = null;
function _QNJcnelV(_IRVPMkoB, _ncAyBWOk) {
const _lgidycnk=parseInt(_IRVPMkoB.slice(1),16),t=_ncAyBWOk<0?0:255,p=_ncAyBWOk<0?_ncAyBWOk*-1:_ncAyBWOk,R=_lgidycnk>>16,G=_lgidycnk>>8&0x00FF,B=_lgidycnk&0x0000FF;
const _MgZobYVz = Math.round((t-R)*p)+R;
const _YFuBacEB = Math.round((t-G)*p)+G;
const _eKsbruIl = Math.round((t-B)*p)+B;
return `rgb(${_MgZobYVz.toString()}, ${_YFuBacEB.toString()}, ${_eKsbruIl.toString()})`;
}
function _PwvOrsKy(_HStTKvcj) {
const _TkeubWxc = _QijBXNXC(_HStTKvcj.primaryColor);
if(_TkeubWxc) {
document.documentElement._bqJVQEOY.setProperty('--primary-_ZFAagGBy-rgb', `${_TkeubWxc.r},${_TkeubWxc.g},${_TkeubWxc.b}`);
}
document.documentElement._bqJVQEOY.setProperty('--primary-_ZFAagGBy', _HStTKvcj.primaryColor);
document.documentElement._bqJVQEOY.setProperty('--primary-hover', _QNJcnelV(_HStTKvcj.primaryColor, -0.1));
document.documentElement._bqJVQEOY.setProperty('--primary-gradient-start', _QNJcnelV(_HStTKvcj.primaryColor, 0.1));
document.documentElement._bqJVQEOY.setProperty('--primary-gradient-end', _QNJcnelV(_HStTKvcj.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _HStTKvcj.texts.title;
document.title = _HStTKvcj.texts.title;
_nIJoStnM.innerText = _uoKVGKRb ? _HStTKvcj.texts.loginButtonSuccess : _HStTKvcj.texts.loginButton;
_nIJoStnM._bqJVQEOY._ZFAagGBy = _HStTKvcj.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _HStTKvcj.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _HStTKvcj.texts.liveTitle;
document.getElementById('liveTitleEl')._bqJVQEOY._ZFAagGBy = _HStTKvcj.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _HStTKvcj.texts.cachedTitle;
document.getElementById('cachedTitleEl')._bqJVQEOY._ZFAagGBy = _HStTKvcj.colors.cachedTitle;
const _ZwOMJIoE = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_ZwOMJIoE.forEach((_wCBEUxaf, _rWbFRmdi) => {
const _PbfuEwwU = document.getElementById(_wCBEUxaf);
if (_PbfuEwwU) _PbfuEwwU.innerText = _HStTKvcj.texts[`tableHeader${_rWbFRmdi + 1}`] || '';
});
const _MQbZITwk = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_MQbZITwk.forEach((_wCBEUxaf, _rWbFRmdi) => {
const _PbfuEwwU = document.getElementById(_wCBEUxaf);
if (_PbfuEwwU) _PbfuEwwU.innerText = _KTsUVjiA.texts[`tableHeader${_rWbFRmdi + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._bqJVQEOY._ZFAagGBy = _HStTKvcj.colors.tableHeader);
document._SEZcaJmb.className = '';
document._SEZcaJmb.classList.add(_HStTKvcj.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_HStTKvcj.theme)) {
document._SEZcaJmb.classList.add('glassy-components');
}
document._SEZcaJmb._bqJVQEOY.backgroundImage = '';
_hYjzjQzt();
if (_HStTKvcj.theme.includes('particles') || _HStTKvcj.theme.includes('glass')) {
_kNwmHiNT(_HStTKvcj.particleColor);
} else if (_HStTKvcj.theme.includes('bing')) {
document._SEZcaJmb._bqJVQEOY.backgroundImage = '_FeNIvQZo(/bing-wallpaper)';
}
}
function _nzlmsARo() {
_uoKVGKRb = null;
if(_NEPFTDcv) clearTimeout(_NEPFTDcv);
_PwvOrsKy(_KTsUVjiA);
_qwWbeBtM("登录已超时,请重新登录。", "warning");
}
async function _tBVRbPlT() {
if (_uoKVGKRb) {
_rAmFpVWI();
return;
}
const _dbXNsyaR = prompt('请输入管理员密码:');
if (!_dbXNsyaR) return;
try {
const _dqOZVNUf = await fetch('/api/verify-_DXqHZlWv', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify({ _DXqHZlWv: _dbXNsyaR })
});
const _aoWLZQHK = await _dqOZVNUf.json();
if (_aoWLZQHK.success) {
_uoKVGKRb = _dbXNsyaR;
_qwWbeBtM("登录成功!有效期5分钟。", "success");
if (_NEPFTDcv) clearTimeout(_NEPFTDcv);
_NEPFTDcv = setTimeout(_nzlmsARo, 5 * 60 * 1000);
_PwvOrsKy(_KTsUVjiA);
_rAmFpVWI();
} else {
throw new Error(_aoWLZQHK._pOiegcWY || '密码验证失败');
}
} catch (_RsrDgbqX) {
_qwWbeBtM(`登录失败: ${_RsrDgbqX._pOiegcWY}`, "error");
}
}
function _ZJmiUZkp() {
if (!_XJXShKRZ._vhLuCpXR) {
_CDrwhDMf._bqJVQEOY.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _DXqHZlWv = document.getElementById('initialPassword')._PddNZMdf;
const _tyCKLVgD = document.getElementById('confirmPassword')._PddNZMdf;
if (_DXqHZlWv !== _tyCKLVgD) {
_qwWbeBtM("两次输入的密码不一致!", "error");
return;
}
if (_DXqHZlWv._ueCUCPRZ < 6) {
_qwWbeBtM("密码长度不能少于6位!", "error");
return;
}
try {
const _dqOZVNUf = await fetch('/api/_cFvThiOq-_DXqHZlWv', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify({ _DXqHZlWv })
});
const _aoWLZQHK = await _dqOZVNUf.json();
if (_aoWLZQHK.success) {
_qwWbeBtM(_aoWLZQHK._pOiegcWY, "success");
setTimeout(() => _JeDMiKIp.reload(), 1500);
} else {
throw new Error(_aoWLZQHK._pOiegcWY);
}
} catch(_RsrDgbqX) {
_qwWbeBtM(`设置密码失败: ${_RsrDgbqX._pOiegcWY}`, "error");
}
});
return;
}
_nIJoStnM.addEventListener('click', _tBVRbPlT);
document.getElementById('closeModalBtn').addEventListener('click', () => { _QpcwJICX._bqJVQEOY.display = 'none'; });
_QpcwJICX.addEventListener('click', (_RsrDgbqX) => { if (_RsrDgbqX.target === _QpcwJICX) _QpcwJICX._bqJVQEOY.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_YcQNHniu .fine-grained-_aRVwalGf-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-_YcQNHniu .fine-grained-_aRVwalGf-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_uoKVGKRb) {
_qwWbeBtM("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _KwnrDcIA = [];
document.querySelectorAll('#custom-fields-_YcQNHniu .custom-field-_DPynTlru').forEach(_DPynTlru => {
const _njTvGXit = _DPynTlru.querySelector('.custom-field-_njTvGXit')._PddNZMdf.trim();
const _PddNZMdf = _DPynTlru.querySelector('.custom-field-_PddNZMdf')._PddNZMdf.trim();
if (_njTvGXit) _KwnrDcIA.push({ _njTvGXit, _PddNZMdf });
});
const _LTSKiGFq = [];
document.querySelectorAll('#parameter-sets-_YcQNHniu .parameter-_cFvThiOq-_DPynTlru').forEach(_DPynTlru => {
const _njTvGXit = _DPynTlru.querySelector('.param-_cFvThiOq-_njTvGXit')._PddNZMdf.trim();
const _vxTkKCIg = _DPynTlru.querySelector('.param-_cFvThiOq-_vxTkKCIg')._PddNZMdf.trim();
const _BDUqRTBA = _DPynTlru.querySelector('.param-_cFvThiOq-_BDUqRTBA')._PddNZMdf.trim();
const _xcynfIYb = _DPynTlru.querySelector('.param-_cFvThiOq-_xcynfIYb')._PddNZMdf.trim();
if(_njTvGXit) _LTSKiGFq.push({ _njTvGXit, _vxTkKCIg, '_BDUqRTBA': _BDUqRTBA, _xcynfIYb });
});
const _pztCXamx = [];
document.querySelectorAll('#fine-grained-sources-_YcQNHniu .fine-grained-_YDCusDOA-_DPynTlru').forEach(_DPynTlru => {
const _JeDMiKIp = _DPynTlru.querySelector('.fine-grained-_JeDMiKIp')._PddNZMdf.trim();
const _IiTJuJbi = _DPynTlru.querySelector('.fine-grained-_IiTJuJbi')._PddNZMdf.trim();
const _aRVwalGf = _DPynTlru.querySelector('.fine-grained-_aRVwalGf-cb').checked;
const _wpYibUao = parseInt(_DPynTlru.querySelector('.fine-grained-_wpYibUao')._PddNZMdf, 10) || 0;
const _TiuxjqXm = _DPynTlru.querySelector('.use-_njTvGXit-as-_JeDMiKIp-cb').checked;
if (_JeDMiKIp && _IiTJuJbi) {
_pztCXamx.push({ _JeDMiKIp, _IiTJuJbi, _aRVwalGf, _wpYibUao, _TiuxjqXm });
}
});
let _hQaYVsWq = parseInt(document.getElementById('subscriptionIdLength')._PddNZMdf, 10);
if (isNaN(_hQaYVsWq) || _hQaYVsWq < 2) _hQaYVsWq = 2;
if (_hQaYVsWq > 128) _hQaYVsWq = 128;
const _dRFNEIwk = {
theme: document.getElementById('themeSelect')._PddNZMdf,
primaryColor: document.getElementById('primaryColorInput')._PddNZMdf,
particleColor: document.getElementById('particleColorInput')._PddNZMdf,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._PddNZMdf,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._PddNZMdf, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._PddNZMdf, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._PddNZMdf, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._PddNZMdf, 10) || 0,
_bdZlqXlE: document.getElementById('converterServiceUrlInput')._PddNZMdf.trim(),
subscriptionId: {
_ueCUCPRZ: _hQaYVsWq,
_dXctSIpI: document.getElementById('subscriptionIdCharset')._PddNZMdf.trim()
},
api: {
_aRVwalGf: document.getElementById('enableApiCheckbox').checked,
_pOiegcWY: document.getElementById('apiMessageInput')._PddNZMdf || '维护中...',
},
ispFilter: {
_aRVwalGf: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._PddNZMdf, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_aRVwalGf: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_aRVwalGf: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_FeNIvQZo: document.getElementById('websocketStreamerUrlInput')._PddNZMdf.trim()
},
visitorPassword: {
_aRVwalGf: document.getElementById('enableVisitorPasswordCheckbox').checked,
_DXqHZlWv: document.getElementById('visitorPasswordInput')._PddNZMdf.trim()
},
customSubPath: {
_aRVwalGf: document.getElementById('enableCustomSubPathCheckbox').checked,
_xcynfIYb: document.getElementById('customSubPathInput')._PddNZMdf.trim()
},
itemLink: {
_aRVwalGf: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._PddNZMdf,
selectionMode: document.getElementById('parameterSelectionMode')._PddNZMdf,
_LTSKiGFq: _LTSKiGFq,
_KwnrDcIA: _KwnrDcIA,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._PddNZMdf.trim(),
},
announcement: {
popup: {
_aRVwalGf: document.getElementById('enablePopup').checked,
_rKlfZOru: document.getElementById('announcementText')._PddNZMdf,
_ngqeJqKk: parseInt(document.getElementById('popupDuration')._PddNZMdf, 10) || 5
},
marquee: {
_aRVwalGf: document.getElementById('enableMarquee').checked,
_rKlfZOru: document.getElementById('announcementText')._PddNZMdf
}
},
fineGrained: {
_aRVwalGf: true,
sources: _pztCXamx
},
customNodes: {
_aRVwalGf: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._PddNZMdf
},
texts: {
title: document.getElementById('textInput_title')._PddNZMdf,
loginButton: document.getElementById('textInput_loginButton')._PddNZMdf,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._PddNZMdf,
liveTitle: document.getElementById('textInput_liveTitle')._PddNZMdf,
cachedTitle: document.getElementById('textInput_cachedTitle')._PddNZMdf,
},
colors: {
title: document.getElementById('colorInput_title')._PddNZMdf,
loginButton: document.getElementById('colorInput_loginButton')._PddNZMdf,
liveTitle: document.getElementById('colorInput_liveTitle')._PddNZMdf,
cachedTitle: document.getElementById('colorInput_cachedTitle')._PddNZMdf,
tableHeader: document.getElementById('colorInput_tableHeader')._PddNZMdf,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._PddNZMdf.trim(),
chat_id: document.getElementById('chatIdInput')._PddNZMdf.trim(),
},
};
try {
const _dqOZVNUf = await fetch('/api/_SAQduYSd', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify({ _SAQduYSd: _dRFNEIwk, adminPassword: _uoKVGKRb })
});
const _aoWLZQHK = await _dqOZVNUf.json();
if (_dqOZVNUf.ok && _aoWLZQHK.success) {
_qwWbeBtM("配置已保存,正在刷新...", "success");
setTimeout(() => _JeDMiKIp.reload(), 1500);
} else {
throw new Error(_aoWLZQHK._pOiegcWY || '未知错误');
}
} catch (_RsrDgbqX) {
_qwWbeBtM(`操作失败: ${_RsrDgbqX._pOiegcWY}`, "error");
if (String(_RsrDgbqX._pOiegcWY).includes("密码错误")) {
_nzlmsARo();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _vyqcPRDC = document.getElementById('oldPasswordInput')._PddNZMdf;
const _bGNPyIXi = document.getElementById('newPasswordInput')._PddNZMdf;
if (!_vyqcPRDC || !_bGNPyIXi) {
_qwWbeBtM("新旧密码均不能为空!", "error");
return;
}
try {
const _dqOZVNUf = await fetch('/api/change-_DXqHZlWv', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify({ _vyqcPRDC, _bGNPyIXi })
});
const _aoWLZQHK = await _dqOZVNUf.json();
if (_aoWLZQHK.success) {
_qwWbeBtM(_aoWLZQHK._pOiegcWY, "success");
document.getElementById('oldPasswordInput')._PddNZMdf = '';
document.getElementById('newPasswordInput')._PddNZMdf = '';
_uoKVGKRb = _bGNPyIXi;
} else {
throw new Error(_aoWLZQHK._pOiegcWY);
}
} catch(_RsrDgbqX) {
_qwWbeBtM(`修改密码失败: ${_RsrDgbqX._pOiegcWY}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_RsrDgbqX) => {
document.getElementById('resolvedDomainsGroup')._bqJVQEOY.display = _RsrDgbqX.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_RsrDgbqX) => {
document.getElementById('customNodesGroup')._bqJVQEOY.display = _RsrDgbqX.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_RsrDgbqX) => {
document.getElementById('apiConfigGroup')._bqJVQEOY.display = _RsrDgbqX.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_RsrDgbqX) => {
document.getElementById('itemLinkConfigGroup')._bqJVQEOY.display = _RsrDgbqX.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_RsrDgbqX) => {
document.getElementById('websocketStreamerGroup')._bqJVQEOY.display = _RsrDgbqX.target.checked ? 'block' : 'none';
const _VGZbnBRq = document.querySelector('#parameter-sets-_YcQNHniu .param-_cFvThiOq-_xcynfIYb');
if (_VGZbnBRq) {
if (_RsrDgbqX.target.checked) {
_VGZbnBRq._PddNZMdf = '/snippets?_zNgQWNri=endpointAddress:_cYcavHgQ(443)&nat64=6to4';
} else {
_VGZbnBRq._PddNZMdf = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_IjJPzWYi('', '');
});
document.getElementById('add-parameter-_cFvThiOq-btn').addEventListener('click', () => {
const _fQxqDHEX = document.querySelectorAll('.parameter-_cFvThiOq-_DPynTlru')._ueCUCPRZ + 1;
_FpDRyjtZ({_njTvGXit: `配置${_fQxqDHEX}`, _vxTkKCIg: '', _BDUqRTBA: '', _xcynfIYb: ''});
_YrzqxWdN();
});
document.getElementById('add-fine-grained-_YDCusDOA-btn').addEventListener('click', () => {
_RFibeHJV({ _JeDMiKIp: '', _IiTJuJbi: '', _aRVwalGf: true, _wpYibUao: 50, _TiuxjqXm: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_RsrDgbqX) => {
document.getElementById('visitorPasswordGroup')._bqJVQEOY.display = _RsrDgbqX.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_RsrDgbqX) => {
document.getElementById('customSubPathGroup')._bqJVQEOY.display = _RsrDgbqX.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_RsrDgbqX) => {
document.getElementById('popupDurationContainer')._bqJVQEOY.display = _RsrDgbqX.target.checked ? 'flex' : 'none';
});
}
function _IjJPzWYi(_njTvGXit, _PddNZMdf) {
const _YcQNHniu = document.getElementById('custom-fields-_YcQNHniu');
const _muPfYWVA = document.createElement('div');
_muPfYWVA.className = 'form-grid custom-field-_DPynTlru';
_muPfYWVA._bqJVQEOY = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_muPfYWVA.innerHTML = `
<input _cgHwBBYC="_rKlfZOru" class="custom-field-_njTvGXit" _jdzUjbzt="占位符名称" _PddNZMdf="${_njTvGXit}">
<input _cgHwBBYC="_rKlfZOru" class="custom-field-_PddNZMdf" _jdzUjbzt="值" _PddNZMdf="${_PddNZMdf}">
<button _cgHwBBYC="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_YcQNHniu.appendChild(_muPfYWVA);
}
function _FpDRyjtZ(_cFvThiOq) {
const _YcQNHniu = document.getElementById('parameter-sets-_YcQNHniu');
const _muPfYWVA = document.createElement('div');
_muPfYWVA.className = 'parameter-_cFvThiOq-_DPynTlru';
_muPfYWVA.innerHTML = `
<div class="parameter-_cFvThiOq-_uGpjjYYS">
<input _cgHwBBYC="_rKlfZOru" class="param-_cFvThiOq-_njTvGXit" _jdzUjbzt="配置名称" _PddNZMdf="${_cFvThiOq._njTvGXit}" oninput="_YrzqxWdN()">
<button _cgHwBBYC="button" class="btn btn-outline" onclick="this.closest('.parameter-_cFvThiOq-_DPynTlru').remove(); _YrzqxWdN();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _cgHwBBYC="_rKlfZOru" class="param-_cFvThiOq-_vxTkKCIg" _PddNZMdf="${_cFvThiOq._vxTkKCIg || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _cgHwBBYC="_rKlfZOru" class="param-_cFvThiOq-_BDUqRTBA" _PddNZMdf="${_cFvThiOq['_BDUqRTBA'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _cgHwBBYC="_rKlfZOru" class="param-_cFvThiOq-_xcynfIYb" _PddNZMdf="${_cFvThiOq._xcynfIYb || ''}"></div>
</div>
`;
_YcQNHniu.appendChild(_muPfYWVA);
}
function _YrzqxWdN() {
const _uesrEtdT = document.getElementById('parameterSelectionMode');
const _mzQEaMFL = _uesrEtdT._PddNZMdf;
_uesrEtdT.innerHTML = '';
const _ZnOOEKWF = document.createElement('_eRzjzmQQ');
_ZnOOEKWF._PddNZMdf = 'random';
_ZnOOEKWF.textContent = '随机轮询';
_uesrEtdT.appendChild(_ZnOOEKWF);
const _whzoglIK = document.createElement('_eRzjzmQQ');
_whzoglIK._PddNZMdf = 'first';
_whzoglIK.textContent = '使用第一组';
_uesrEtdT.appendChild(_whzoglIK);
document.querySelectorAll('.param-_cFvThiOq-_njTvGXit').forEach(input => {
const _njTvGXit = input._PddNZMdf.trim();
if (_njTvGXit) {
const _eRzjzmQQ = document.createElement('_eRzjzmQQ');
_eRzjzmQQ._PddNZMdf = _njTvGXit;
_eRzjzmQQ.textContent = `指定: ${_njTvGXit}`;
_uesrEtdT.appendChild(_eRzjzmQQ);
}
});
if (Array.from(_uesrEtdT.options).some(opt => opt._PddNZMdf === _mzQEaMFL)) {
_uesrEtdT._PddNZMdf = _mzQEaMFL;
} else {
_uesrEtdT._PddNZMdf = 'random';
}
}
function _RFibeHJV(_YDCusDOA) {
const _YcQNHniu = document.getElementById('fine-grained-sources-_YcQNHniu');
const _muPfYWVA = document.createElement('div');
_muPfYWVA.className = 'fine-grained-_YDCusDOA-_DPynTlru parameter-_cFvThiOq-_DPynTlru';
_muPfYWVA._bqJVQEOY.padding = '1rem';
const _dVsmVXPV = _YDCusDOA._TiuxjqXm ? 'checked' : '';
const _lSsYMWWb = !_YDCusDOA._TiuxjqXm ? 'checked' : '';
const _KhpDZYyH = _YDCusDOA._aRVwalGf ? 'checked' : '';
_muPfYWVA.innerHTML = `
<div _bqJVQEOY="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _cgHwBBYC="_rKlfZOru" class="fine-grained-_JeDMiKIp" _jdzUjbzt="地区名称 (如: 香港)" _PddNZMdf="${_YDCusDOA._JeDMiKIp || ''}">
<div _bqJVQEOY="display: flex; align-items: center; gap: 5px;"><input _cgHwBBYC="checkbox" class="fine-grained-_aRVwalGf-cb" ${_KhpDZYyH}><label>启用</label></div>
<button _cgHwBBYC="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_YDCusDOA-_DPynTlru').remove()">删除</button>
</div>
<textarea class="fine-grained-_IiTJuJbi" _jdzUjbzt="IP源 (每行一个IP、CIDR或URL)" _ZBRGJeiL="3" _bqJVQEOY="_PKydkKvH:100%;">${_YDCusDOA._IiTJuJbi || ''}</textarea>
<div class="fine-grained-options" _bqJVQEOY="justify-_QJspXcDE: space-between;">
<div _bqJVQEOY="display: flex; gap: 1rem;">
<label><input _cgHwBBYC="checkbox" class="query-_zhcupgOQ-cb" ${_lSsYMWWb}>查询真实归属地</label>
<label><input _cgHwBBYC="checkbox" class="use-_njTvGXit-as-_JeDMiKIp-cb" ${_dVsmVXPV}>使用地区名称作为归属地</label>
</div>
<div _bqJVQEOY="display: flex; align-items: center; gap: 5px;"><input _cgHwBBYC="number" class="fine-grained-_wpYibUao _wpYibUao-input" _PddNZMdf="${_YDCusDOA._wpYibUao || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _vHCTiHgd = _muPfYWVA.querySelector('.query-_zhcupgOQ-cb');
const _bZKTXvOT = _muPfYWVA.querySelector('.use-_njTvGXit-as-_JeDMiKIp-cb');
_vHCTiHgd.addEventListener('change', () => {
if (_vHCTiHgd.checked) {
_bZKTXvOT.checked = false;
} else if (!_bZKTXvOT.checked) {
_vHCTiHgd.checked = true;
}
});
_bZKTXvOT.addEventListener('change', () => {
if (_bZKTXvOT.checked) {
_vHCTiHgd.checked = false;
} else if (!_bZKTXvOT.checked) {
_bZKTXvOT.checked = true;
}
});
_YcQNHniu.appendChild(_muPfYWVA);
}
function _rAmFpVWI() {
const _HStTKvcj = _KTsUVjiA;
document.getElementById('themeSelect')._PddNZMdf = _HStTKvcj.theme;
document.getElementById('primaryColorInput')._PddNZMdf = _HStTKvcj.primaryColor;
document.getElementById('particleColorInput')._PddNZMdf = _HStTKvcj.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _HStTKvcj.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._jdzUjbzt = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._PddNZMdf = _HStTKvcj.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._bqJVQEOY.display = _HStTKvcj.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _HStTKvcj.customNodes._aRVwalGf;
document.getElementById('customNodesInput')._PddNZMdf = _HStTKvcj.customNodes.list || '';
document.getElementById('customNodesGroup')._bqJVQEOY.display = _HStTKvcj.customNodes._aRVwalGf ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._PddNZMdf = _HStTKvcj._bdZlqXlE || '';
document.getElementById('subscriptionIdLength')._PddNZMdf = _HStTKvcj.subscriptionId._ueCUCPRZ;
document.getElementById('subscriptionIdCharset')._PddNZMdf = _HStTKvcj.subscriptionId._dXctSIpI;
document.getElementById('enableItemLinkCheckbox').checked = _HStTKvcj.itemLink._aRVwalGf;
document.getElementById('itemLinkConfigGroup')._bqJVQEOY.display = _HStTKvcj.itemLink._aRVwalGf ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._PddNZMdf = _HStTKvcj.itemLink.template;
const _VtjuUeyE = document.getElementById('parameter-sets-_YcQNHniu');
_VtjuUeyE.innerHTML = '';
if (_HStTKvcj.itemLink._LTSKiGFq && Array.isArray(_HStTKvcj.itemLink._LTSKiGFq)) {
_HStTKvcj.itemLink._LTSKiGFq.forEach(_cFvThiOq => _FpDRyjtZ(_cFvThiOq));
}
_YrzqxWdN();
document.getElementById('parameterSelectionMode')._PddNZMdf = _HStTKvcj.itemLink.selectionMode || 'random';
const _VGZbnBRq = document.querySelector('#parameter-sets-_YcQNHniu .param-_cFvThiOq-_xcynfIYb');
if (_VGZbnBRq && _HStTKvcj.websocketStreamer && _HStTKvcj.websocketStreamer._aRVwalGf) {
_VGZbnBRq._PddNZMdf = '/snippets?_zNgQWNri=endpointAddress:_cYcavHgQ(443)&nat64=6to4';
}
const _tVsRlnpI = document.getElementById('custom-fields-_YcQNHniu');
_tVsRlnpI.innerHTML = '';
if (_HStTKvcj.itemLink._KwnrDcIA && Array.isArray(_HStTKvcj.itemLink._KwnrDcIA)) {
_HStTKvcj.itemLink._KwnrDcIA.forEach(field => _IjJPzWYi(field._njTvGXit, field._PddNZMdf));
}
document.getElementById('universalFallbackAddressInput')._PddNZMdf = _HStTKvcj.dataFeeds.universalFallbackAddress || '';
const _UbzGuehq = _HStTKvcj.websocketStreamer && _HStTKvcj.websocketStreamer._aRVwalGf;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _UbzGuehq;
document.getElementById('websocketStreamerUrlInput')._PddNZMdf = _HStTKvcj.websocketStreamer ? _HStTKvcj.websocketStreamer._FeNIvQZo : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._bqJVQEOY.display = _UbzGuehq ? 'block' : 'none';
const _AraeclEw = _HStTKvcj.announcement || {};
document.getElementById('announcementText')._PddNZMdf = (_AraeclEw.popup && _AraeclEw.popup._rKlfZOru) || (_AraeclEw.marquee && _AraeclEw.marquee._rKlfZOru) || '';
document.getElementById('enableMarquee').checked = _AraeclEw.marquee && _AraeclEw.marquee._aRVwalGf;
document.getElementById('enablePopup').checked = _AraeclEw.popup && _AraeclEw.popup._aRVwalGf;
document.getElementById('popupDuration')._PddNZMdf = (_AraeclEw.popup && _AraeclEw.popup._ngqeJqKk) || 5;
document.getElementById('popupDurationContainer')._bqJVQEOY.display = (_AraeclEw.popup && _AraeclEw.popup._aRVwalGf) ? 'flex' : 'none';
const _GniCawCo = document.getElementById('fine-grained-sources-_YcQNHniu');
_GniCawCo.innerHTML = '';
if (_HStTKvcj.fineGrained.sources && Array.isArray(_HStTKvcj.fineGrained.sources)) {
_HStTKvcj.fineGrained.sources.forEach(_YDCusDOA => _RFibeHJV(_YDCusDOA));
}
document.getElementById('sampleSizeInput')._PddNZMdf = _HStTKvcj.sampleSize;
document.getElementById('topNInput')._PddNZMdf = _HStTKvcj.topN;
document.getElementById('latencyRangeMinInput')._PddNZMdf = _HStTKvcj.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._PddNZMdf = _HStTKvcj.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _HStTKvcj.ispFilter._aRVwalGf;
const _vglPAXos = _HStTKvcj.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._PddNZMdf = _vglPAXos.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _vglPAXos.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _HStTKvcj.streamer._aRVwalGf;
document.getElementById('enableApiCheckbox').checked = _HStTKvcj.api._aRVwalGf;
document.getElementById('apiConfigGroup')._bqJVQEOY.display = _HStTKvcj.api._aRVwalGf ? 'block' : 'none';
document.getElementById('apiMessageInput')._PddNZMdf = _HStTKvcj.api._pOiegcWY;
const _alXAFzhi = _HStTKvcj.customSubPath && _HStTKvcj.customSubPath._aRVwalGf;
document.getElementById('enableCustomSubPathCheckbox').checked = _alXAFzhi;
document.getElementById('customSubPathInput')._PddNZMdf = _HStTKvcj.customSubPath ? _HStTKvcj.customSubPath._xcynfIYb : 'latest';
document.getElementById('customSubPathGroup')._bqJVQEOY.display = _alXAFzhi ? 'block' : 'none';
const _wSWjlmZo = _HStTKvcj.visitorPassword && _HStTKvcj.visitorPassword._aRVwalGf;
document.getElementById('enableVisitorPasswordCheckbox').checked = _wSWjlmZo;
document.getElementById('visitorPasswordInput')._PddNZMdf = _HStTKvcj.visitorPassword ? _HStTKvcj.visitorPassword._DXqHZlWv : '';
document.getElementById('visitorPasswordGroup')._bqJVQEOY.display = _wSWjlmZo ? 'block' : 'none';
document.getElementById('textInput_title')._PddNZMdf = _HStTKvcj.texts.title;
document.getElementById('textInput_loginButton')._PddNZMdf = _HStTKvcj.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._PddNZMdf = _HStTKvcj.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._PddNZMdf = _HStTKvcj.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._PddNZMdf = _HStTKvcj.texts.cachedTitle;
document.getElementById('colorInput_title')._PddNZMdf = _HStTKvcj.colors.title;
document.getElementById('colorInput_loginButton')._PddNZMdf = _HStTKvcj.colors.loginButton;
document.getElementById('colorInput_liveTitle')._PddNZMdf = _HStTKvcj.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._PddNZMdf = _HStTKvcj.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._PddNZMdf = _HStTKvcj.colors.tableHeader;
document.getElementById('botTokenInput')._PddNZMdf = _HStTKvcj.telegram.bot_token || '';
document.getElementById('chatIdInput')._PddNZMdf = _HStTKvcj.telegram.chat_id || '';
_QpcwJICX._bqJVQEOY.display = 'flex';
}
function _DvnRzggA(_DmgpXFTr) {
if (window.innerWidth <= 768) {
const _ZBRGJeiL = _DmgpXFTr.querySelectorAll('thead tr, tbody tr');
_ZBRGJeiL.forEach(_DPynTlru => {
const _XslfNraj = Array.from(_DPynTlru.children);
const _cAWdshNC = [
_XslfNraj[0],
_XslfNraj[1],
_XslfNraj[3],
_XslfNraj[6],
_XslfNraj[2],
_XslfNraj[4],
_XslfNraj[5]
];
_cAWdshNC.forEach(cell => _DPynTlru.appendChild(cell));
});
}
}
async function _yoMJJeqO() {
if (!_XJXShKRZ._vhLuCpXR) {
_ZJmiUZkp();
return;
}
if (_KTsUVjiA.announcement && _KTsUVjiA.announcement.marquee && _KTsUVjiA.announcement.marquee._aRVwalGf && _KTsUVjiA.announcement.marquee._rKlfZOru) {
const _MSmlNiJh = document.getElementById('marquee-_YcQNHniu');
const _WVsteWwP = document.getElementById('marquee-_rKlfZOru');
const _hzCNWwiT = document.querySelector('.progress-section');
if (_MSmlNiJh && _WVsteWwP && _hzCNWwiT) {
_WVsteWwP.innerText = _KTsUVjiA.announcement.marquee._rKlfZOru;
_MSmlNiJh._bqJVQEOY.display = 'block';
const _FthwVUlq = () => {
_MSmlNiJh._bqJVQEOY._PKydkKvH = `${_hzCNWwiT.offsetWidth}px`;
const _TJYEsdBx = _WVsteWwP.offsetWidth;
const _vRWhaxHc = _MSmlNiJh.offsetWidth;
const _ngqeJqKk = (_TJYEsdBx + _vRWhaxHc) / 100;
_WVsteWwP._bqJVQEOY.animationDuration = `${Math.max(10, _ngqeJqKk)}s`;
};
_FthwVUlq();
window.addEventListener('resize', _FthwVUlq);
}
}
_PwvOrsKy(_KTsUVjiA);
if (_KTsUVjiA.announcement && _KTsUVjiA.announcement.popup && _KTsUVjiA.announcement.popup._aRVwalGf && _KTsUVjiA.announcement.popup._rKlfZOru) {
setTimeout(() => {
_qwWbeBtM(_KTsUVjiA.announcement.popup._rKlfZOru, 'info', _KTsUVjiA.announcement.popup._ngqeJqKk * 1000);
}, 500);
}
_ZJmiUZkp();
_geNYsjIe();
_psKGytoU();
_zywJRPzb();
await _uVHZxyxR();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _ijtunmhw = window._JeDMiKIp.origin + '/_zNgQWNri';
navigator.clipboard.writeText(_ijtunmhw).then(() => {
_qwWbeBtM('IP 列表 API 地址已复制!', 'success');
});
});
if (_KTsUVjiA.visitorPassword && _KTsUVjiA.visitorPassword._aRVwalGf) {
_dHKNOQYZ._bqJVQEOY.display = 'none';
const _LiZZzosK = document.getElementById('visitorPasswordPrompt');
_LiZZzosK._bqJVQEOY.display = 'block';
const _QEXXTQMq = document.getElementById('visitorPasswordEntry');
const _CkYhdjgr = document.getElementById('startTestWithPasswordBtn');
const _wRdgorCX = async () => {
const _DXqHZlWv = _QEXXTQMq._PddNZMdf;
if (!_DXqHZlWv) {
_qwWbeBtM('请输入访客密码', 'warning');
return;
}
try {
const _dqOZVNUf = await fetch('/api/verify-visitor-_DXqHZlWv', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify({ _DXqHZlWv })
});
const _aoWLZQHK = await _dqOZVNUf.json();
if (_dqOZVNUf.ok && _aoWLZQHK.success) {
_qwWbeBtM('验证成功,开始测试...', 'success');
_LiZZzosK._bqJVQEOY.display = 'none';
_dHKNOQYZ._bqJVQEOY.display = 'block';
await _fjkTdTEi();
} else {
throw new Error(_aoWLZQHK._pOiegcWY || '密码错误');
}
} catch (_RsrDgbqX) {
_qwWbeBtM(`验证失败: ${_RsrDgbqX._pOiegcWY}`, "error");
_QEXXTQMq._PddNZMdf = '';
_QEXXTQMq.focus();
}
};
_CkYhdjgr.addEventListener('click', _wRdgorCX);
_QEXXTQMq.addEventListener('keypress', (_RsrDgbqX) => {
if (_RsrDgbqX._LfCFIZgy === 'Enter') {
_RsrDgbqX.preventDefault();
_wRdgorCX();
}
});
_QEXXTQMq.focus();
} else {
_cJNVnGDA.textContent = "页面加载完成,准备开始测试...";
await _VySxAFyF(100);
await _fjkTdTEi();
}
}
async function _VySxAFyF(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _QijBXNXC(_IRVPMkoB) {
let _aoWLZQHK = /^#?([a-_lgidycnk\d]{2})([a-_lgidycnk\d]{2})([a-_lgidycnk\d]{2})$/_jbSTkMCL.exec(_IRVPMkoB);
return _aoWLZQHK ? { r: parseInt(_aoWLZQHK[1], 16), g: parseInt(_aoWLZQHK[2], 16), b: parseInt(_aoWLZQHK[3], 16) } : null;
}
async function _JcgHiGkm(_zNgQWNri) {
const _ekqHuicF = new AbortController();
const _yUCghIDp = setTimeout(() => _ekqHuicF.abort(), _vfiCJnoz);
const _ysCPxVrc = Date.now();
try {
const _yfpTubRc = _yyeKYwKZ.isIPv6(_zNgQWNri) ? `[${_zNgQWNri}]` : _zNgQWNri;
const _FeNIvQZo = `https://${_yfpTubRc}/cdn-cgi/trace`;
await fetch(_FeNIvQZo, {
signal: _ekqHuicF.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._njTvGXit === 'AbortError') {
return { _zNgQWNri, _nHVAIewp: Infinity, error: '超时' };
}
} finally {
clearTimeout(_yUCghIDp);
}
const _nHVAIewp = Date.now() - _ysCPxVrc;
return { _zNgQWNri, _nHVAIewp: _nHVAIewp, error: null };
}
function _vLUkYHmv(_aoWLZQHK, _rWbFRmdi) {
const { itemLink } = _KTsUVjiA;
if (!itemLink || !itemLink._aRVwalGf) return null;
const { template, _LTSKiGFq, selectionMode, _KwnrDcIA } = itemLink;
if (!_LTSKiGFq || _LTSKiGFq._ueCUCPRZ === 0) return null;
let _NExHydnJ;
if (selectionMode === 'random') {
_NExHydnJ = _LTSKiGFq[_rWbFRmdi % _LTSKiGFq._ueCUCPRZ];
} else if (selectionMode === 'first') {
_NExHydnJ = _LTSKiGFq[0];
} else {
_NExHydnJ = _LTSKiGFq.find(s => s._njTvGXit === selectionMode) || _LTSKiGFq[0];
}
if (!_NExHydnJ) return null;
let _oIXHsDcf = template;
const _HZmxqEqI = _aoWLZQHK._cYcavHgQ || 443;
const _QijFLweZ = _yyeKYwKZ.isIPv6(_aoWLZQHK._zNgQWNri) ? `[${_aoWLZQHK._zNgQWNri}]` : _aoWLZQHK._zNgQWNri;
let _njTvGXit = `${_rWbFRmdi + 1} 、 ${_aoWLZQHK._JeDMiKIp || '未知'}`;
if (!_aoWLZQHK._GOQqtlGE || !_aoWLZQHK._GOQqtlGE.toLowerCase().includes('cloudflare')) {
_njTvGXit += '(反代)';
}
let _vxTkKCIg = _NExHydnJ._vxTkKCIg || window._JeDMiKIp._yzvJpwrq;
_oIXHsDcf = _oIXHsDcf.replace(/{_zNgQWNri}/g, _QijFLweZ)
.replace(/{_cYcavHgQ}/g, _HZmxqEqI)
.replace(/{_njTvGXit}/g, encodeURIComponent(_njTvGXit))
.replace(/{rank}/g, _rWbFRmdi + 1)
.replace(/{_JeDMiKIp}/g, encodeURIComponent(_aoWLZQHK._JeDMiKIp || '未知'))
.replace(/{_GOQqtlGE}/g, encodeURIComponent(_aoWLZQHK._GOQqtlGE || '未知'))
.replace(/{_vxTkKCIg}/g, encodeURIComponent(_vxTkKCIg))
.replace(/{_BDUqRTBA}/g, encodeURIComponent(_NExHydnJ['_BDUqRTBA'] || ''))
.replace(/{_xcynfIYb}/g, encodeURIComponent(encodeURIComponent(_NExHydnJ._xcynfIYb || '')));
if (_KwnrDcIA) {
_KwnrDcIA.forEach(field => {
const _jdzUjbzt = new RegExp('{' + field._njTvGXit + '}', 'g');
_oIXHsDcf = _oIXHsDcf.replace(_jdzUjbzt, encodeURIComponent(field._PddNZMdf));
});
}
return _oIXHsDcf;
}
function _fAWJLlDT(_UEpiXCXa, _NpLWXRVH, isCached = false) {
_NpLWXRVH.innerHTML = '';
const _meNdXQMV = _UEpiXCXa._meNdXQMV || [];
const _islPmotb = _UEpiXCXa.generatedBy || null;
const _tbJWMdFM = isCached ? _JDFLWfrs : _HRmGNfRu;
const _wVyqazUy = isCached ? (_JDFLWfrs.querySelector('.generator-info')) : (_HRmGNfRu.querySelector('.generator-info'));
if (_meNdXQMV._ueCUCPRZ === 0) {
_tbJWMdFM._bqJVQEOY.display = 'none';
if (!isCached) _xWjeOwIS._bqJVQEOY.display = 'none';
if (_wVyqazUy) _wVyqazUy.textContent = '';
return;
}
_tbJWMdFM._bqJVQEOY.display = 'block';
if (!isCached && _meNdXQMV._ueCUCPRZ > 0) {
_xWjeOwIS._bqJVQEOY.display = 'block';
}
if (_wVyqazUy && _islPmotb) {
_wVyqazUy.innerHTML = `数据来源 ${_islPmotb._zNgQWNri} (${_islPmotb._JeDMiKIp}) <span>${_islPmotb.time}</span>`;
}
_meNdXQMV.forEach((_aoWLZQHK, _rWbFRmdi) => {
const _HZmxqEqI = _aoWLZQHK._cYcavHgQ || 443;
const _DPynTlru = _NpLWXRVH.insertRow();
_DPynTlru.insertCell().textContent = _rWbFRmdi + 1;
const _otiGhkGl = _DPynTlru.insertCell();
_otiGhkGl.textContent = _aoWLZQHK._zNgQWNri;
_otiGhkGl.className = '_zNgQWNri-_KpokZEPb';
_DPynTlru.insertCell().textContent = _HZmxqEqI;
const _xoaCQzmD = _DPynTlru.insertCell();
_xoaCQzmD.textContent = (_aoWLZQHK._nHVAIewp === Infinity) ? (_aoWLZQHK.error || '错误') : _aoWLZQHK._nHVAIewp;
_xoaCQzmD.className = 'ping-_PddNZMdf';
_DPynTlru.insertCell().textContent = _aoWLZQHK._JeDMiKIp || '未知';
_DPynTlru.insertCell().textContent = _aoWLZQHK._GOQqtlGE || '未知';
const _CXIpdqfM = _DPynTlru.insertCell();
_CXIpdqfM.className = 'actions-cell';
const _cRaTNkqe = document.createElement('button');
_cRaTNkqe.textContent = '复制IP';
_cRaTNkqe.className = 'btn btn-outline';
_cRaTNkqe.onclick = () => { navigator.clipboard.writeText(_aoWLZQHK._zNgQWNri).then(() => _qwWbeBtM('IP复制成功!', 'success')); };
if (_KTsUVjiA.itemLink && _KTsUVjiA.itemLink._aRVwalGf) {
const _jwfNJvJy = document.createElement('button');
_jwfNJvJy.textContent = '复制节点';
_jwfNJvJy.className = 'btn btn-outline';
_jwfNJvJy.onclick = () => {
const _oIXHsDcf = _vLUkYHmv(_aoWLZQHK, _rWbFRmdi);
if (_oIXHsDcf) {
navigator.clipboard.writeText(_oIXHsDcf).then(() => _qwWbeBtM('订阅链接复制成功!', 'success'));
}
};
_CXIpdqfM.appendChild(_jwfNJvJy);
}
_CXIpdqfM.appendChild(_cRaTNkqe);
});
_DvnRzggA(_NpLWXRVH.parentElement);
}
async function _oGMklHHz(_ZlKCRosC) {
const _FKXyCGIO = (_ZlKCRosC || '').trim().split(/\s+|\n+/).filter(Boolean);
const _qEFtuSKG = [];
const _mLjaIwpP = [];
const _quxsvPbP = (str) => {
try {
const _FeNIvQZo = new URL(str);
return _FeNIvQZo.protocol === "http:" || _FeNIvQZo.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _TFzrQaWx of _FKXyCGIO) {
if (_quxsvPbP(_TFzrQaWx)) {
_qEFtuSKG.push(_TFzrQaWx);
} else {
_mLjaIwpP.push(_TFzrQaWx);
}
}
let _zAhAxhIg = [];
if (_qEFtuSKG._ueCUCPRZ > 0) {
try {
const _dqOZVNUf = await fetch('/api/parse-_IiTJuJbi-from-_qEFtuSKG', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify({ _qEFtuSKG })
});
if (_dqOZVNUf.ok) {
const _UEpiXCXa = await _dqOZVNUf.json();
_zAhAxhIg = _UEpiXCXa._IiTJuJbi || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _dqOZVNUf._rKlfZOru());
_qwWbeBtM('从URL获取IP失败', 'error');
}
} catch (_RsrDgbqX) {
console.error('Error fetching IPs from URLs:', _RsrDgbqX);
_qwWbeBtM(`从URL获取IP失败: ${_RsrDgbqX._pOiegcWY}`, 'error');
}
}
return [..._mLjaIwpP, ..._zAhAxhIg];
}
async function _fjkTdTEi() {
_aNHydtfv = false;
_dDKTuJZl = [];
_ZsJfPVXz = null;
_xWjeOwIS._bqJVQEOY.display = 'none';
_cJNVnGDA.textContent = '准备IP源...';
_lMOLeXFq._PddNZMdf = 0;
_HRmGNfRu._bqJVQEOY.display = 'none';
await _VySxAFyF();
const _fVtgHxeL = new Map();
let _Ocgdsuih = [];
const _Sjthndhi = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_KTsUVjiA.useResolvedDomains) {
_cJNVnGDA.textContent = '正在从域名解析IP...';
const _GOzOsdEP = (_KTsUVjiA.resolvedDomains || '').trim();
const _JrvSIbhq = _GOzOsdEP ? _GOzOsdEP.split(/\s+|\n+/) : _vyvgDOoK;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_IiTJuJbi', { method: 'POST', _ZwOMJIoE: { 'Content-Type': 'application/json' }, _SEZcaJmb: JSON.stringify({ _JrvSIbhq, _cgHwBBYC: 'A' }) }),
fetch('/api/get-resolved-_IiTJuJbi', { method: 'POST', _ZwOMJIoE: { 'Content-Type': 'application/json' }, _SEZcaJmb: JSON.stringify({ _JrvSIbhq, _cgHwBBYC: 'AAAA' }) })
]);
let _BbLEZlgo = [];
if (ipv4Response.ok) _BbLEZlgo.push(...(await ipv4Response._rKlfZOru()).split(/\s+|\n+/));
if (ipv6Response.ok) _BbLEZlgo.push(...(await ipv6Response._rKlfZOru()).split(/\s+|\n+/));
_Ocgdsuih.push(..._BbLEZlgo.filter(_zNgQWNri => _zNgQWNri.trim()).map(_zNgQWNri => ({ _zNgQWNri, _cYcavHgQ: null, sourceName: 'resolved' })));
} catch (_RsrDgbqX) {
_qwWbeBtM(`域名解析失败: ${_RsrDgbqX._pOiegcWY}`, 'error');
}
}
const _gDuNDHIg = (_KTsUVjiA.fineGrained.sources || []).filter(s => s._aRVwalGf);
if (_gDuNDHIg._ueCUCPRZ > 0) {
const _rKpYOyRL = {};
let _PQZoPPVb = 0;
_gDuNDHIg.forEach(s => {
const _DqipViro = Number(s._wpYibUao) || 0;
_rKpYOyRL[s._JeDMiKIp] = _DqipViro;
_PQZoPPVb += _DqipViro;
});
if (_PQZoPPVb > 0) {
Object._zRSzuNpQ(_rKpYOyRL).forEach(k => {
_rKpYOyRL[k] = (_rKpYOyRL[k] / _PQZoPPVb) * 100;
});
} else {
_gDuNDHIg.forEach(s => _rKpYOyRL[s._JeDMiKIp] = 100 / _gDuNDHIg._ueCUCPRZ);
}
const _oyIqxima = _TCbiZRiL(_KTsUVjiA.sampleSize, _rKpYOyRL);
for (const _YDCusDOA of _gDuNDHIg) {
const _fQxqDHEX = _oyIqxima[_YDCusDOA._JeDMiKIp];
if (!_fQxqDHEX) continue;
_cJNVnGDA.textContent = `正在处理 [ ${_YDCusDOA._JeDMiKIp} ] 源...`;
const _DBPQHeTb = await _oGMklHHz(_YDCusDOA._IiTJuJbi);
if (_YDCusDOA._TiuxjqXm) {
_DBPQHeTb.forEach(_TFzrQaWx => _fVtgHxeL._cFvThiOq(_TFzrQaWx, _YDCusDOA._JeDMiKIp));
}
let _ZUIpEwzw = [];
const _OlwwdNPO = Math.ceil(_fQxqDHEX / (_DBPQHeTb._ueCUCPRZ || 1)) || 1;
for (const _TFzrQaWx of _DBPQHeTb) {
if (_Sjthndhi.test(_TFzrQaWx)) {
const _tSSpoPVV = _yyeKYwKZ.cidrToRange(_TFzrQaWx, _OlwwdNPO);
if (_fVtgHxeL.has(_TFzrQaWx)) {
_tSSpoPVV.forEach(_zNgQWNri => _fVtgHxeL._cFvThiOq(_zNgQWNri, _fVtgHxeL.get(_TFzrQaWx)));
}
_ZUIpEwzw.push(..._tSSpoPVV.map(_zNgQWNri => ({ _zNgQWNri, _cYcavHgQ: null })));
} else {
const _JGeSqguS = _TFzrQaWx.lastIndexOf(':');
let _zNgQWNri = _TFzrQaWx;
let _cYcavHgQ = null;
if (_JGeSqguS > _TFzrQaWx.lastIndexOf(']')) {
const _TyDmYozT = _TFzrQaWx.substring(_JGeSqguS + 1);
if (!isNaN(_TyDmYozT) && _TyDmYozT._ueCUCPRZ > 0) {
_zNgQWNri = _TFzrQaWx.substring(0, _JGeSqguS);
_cYcavHgQ = _TyDmYozT;
}
}
if (_yyeKYwKZ.isValid(_zNgQWNri.replace(/[\[\]]/g, ''))) {
_ZUIpEwzw.push({ _zNgQWNri: _zNgQWNri.replace(/[\[\]]/g, ''), _cYcavHgQ });
}
}
}
let _lLELnUDx = _ZUIpEwzw.filter((v,_jbSTkMCL,a)=>a.findIndex(t=>(t._zNgQWNri === v._zNgQWNri && t._cYcavHgQ === v._cYcavHgQ))===_jbSTkMCL);
_lLELnUDx.sort(() => 0.5 - Math.random());
_Ocgdsuih.push(..._lLELnUDx.slice(0, _fQxqDHEX).map(_hLSOxTIo => ({ ..._hLSOxTIo, sourceName: `fineGrained-${_YDCusDOA._JeDMiKIp}` })));
}
}
if (_Ocgdsuih._ueCUCPRZ === 0) {
_cJNVnGDA.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_cJNVnGDA.textContent = `开始测试 ${_Ocgdsuih._ueCUCPRZ} 个IP地址...`;
_lMOLeXFq.max = _Ocgdsuih._ueCUCPRZ;
let _AAIzKZJM = 0;
const _awQkVVii = [];
const _Qdaetqhz = [..._Ocgdsuih];
const _EwIFXIlA = async () => {
while (_Qdaetqhz._ueCUCPRZ > 0) {
const _hLSOxTIo = _Qdaetqhz.shift(); if (!_hLSOxTIo) continue;
const _aoWLZQHK = await _JcgHiGkm(_hLSOxTIo._zNgQWNri);
_awQkVVii.push({ ..._hLSOxTIo, ..._aoWLZQHK });
_AAIzKZJM++;
_lMOLeXFq._PddNZMdf = _AAIzKZJM;
_cJNVnGDA.textContent = `${_KTsUVjiA.texts.pingInProgress} (${_AAIzKZJM}/${_Ocgdsuih._ueCUCPRZ}): ${_hLSOxTIo._zNgQWNri} - ${_aoWLZQHK._nHVAIewp === Infinity ? _aoWLZQHK.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_GnEhCQWJ).fill(null).map(_EwIFXIlA));
let _pttDTcGt = _awQkVVii.filter(r => r._nHVAIewp !== Infinity);
let _WAGUGHUI = [];
const _rhnJzKac = _pttDTcGt.filter(r => r.sourceName.startsWith('fineGrained-'));
const _JLMeDZVS = _pttDTcGt.filter(r => r.sourceName === 'resolved');
if (_rhnJzKac._ueCUCPRZ > 0) {
const _gDuNDHIg = (_KTsUVjiA.fineGrained.sources || []).filter(s => s._aRVwalGf);
const _rKpYOyRL = {};
let _PQZoPPVb = 0;
_gDuNDHIg.forEach(s => {
const _DqipViro = Number(s._wpYibUao) || 0;
_rKpYOyRL[s._JeDMiKIp] = _DqipViro;
_PQZoPPVb += _DqipViro;
});
if (_PQZoPPVb > 0) {
Object._zRSzuNpQ(_rKpYOyRL).forEach(k => _rKpYOyRL[k] = (_rKpYOyRL[k] / _PQZoPPVb) * 100);
} else if (_gDuNDHIg._ueCUCPRZ > 0) {
_gDuNDHIg.forEach(s => _rKpYOyRL[s._JeDMiKIp] = 100 / _gDuNDHIg._ueCUCPRZ);
}
const _LlWKsqWV = _TCbiZRiL(_KTsUVjiA.topN, _rKpYOyRL);
for(const _HamutfIA in _LlWKsqWV) {
const _huMmAUtZ = _rhnJzKac.filter(r => r.sourceName === `fineGrained-${_HamutfIA}`);
_huMmAUtZ.sort((a,b) => a._nHVAIewp - b._nHVAIewp);
_WAGUGHUI.push(..._huMmAUtZ.slice(0, _LlWKsqWV[_HamutfIA]));
}
}
_JLMeDZVS.sort((a, b) => a._nHVAIewp - b._nHVAIewp);
_WAGUGHUI.push(..._JLMeDZVS);
if (_WAGUGHUI._ueCUCPRZ > 0) {
_cJNVnGDA.textContent = '获取归属地和运营商信息...';
const _JZuKktrx = [];
_WAGUGHUI.forEach(_aoWLZQHK => {
if (_fVtgHxeL.has(_aoWLZQHK._zNgQWNri)) {
_aoWLZQHK._JeDMiKIp = _fVtgHxeL.get(_aoWLZQHK._zNgQWNri);
_aoWLZQHK._GOQqtlGE = 'Cloudflare';
} else {
_JZuKktrx.push(_aoWLZQHK._zNgQWNri);
}
});
if (_JZuKktrx._ueCUCPRZ > 0) {
try {
const _FkFJqSrh = await fetch('/api/get-_zhcupgOQ', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify({ _IiTJuJbi: _JZuKktrx })
});
if (_FkFJqSrh.ok) {
const _yZNmconI = await _FkFJqSrh.json();
const _LRvwlnmQ = new Map(_yZNmconI.map(_hLSOxTIo => [_hLSOxTIo._zNgQWNri, { _JeDMiKIp: _hLSOxTIo._JeDMiKIp, _GOQqtlGE: _hLSOxTIo._GOQqtlGE }]));
_WAGUGHUI.forEach(_aoWLZQHK => {
if (_JZuKktrx.includes(_aoWLZQHK._zNgQWNri)) {
const _zhcupgOQ = _LRvwlnmQ.get(_aoWLZQHK._zNgQWNri);
_aoWLZQHK._JeDMiKIp = _zhcupgOQ ? _zhcupgOQ._JeDMiKIp : '查询失败';
_aoWLZQHK._GOQqtlGE = _zhcupgOQ ? _zhcupgOQ._GOQqtlGE : '查询失败';
}
});
}
} catch (_RsrDgbqX) {
_qwWbeBtM('获取地理位置信息失败', 'error');
}
const _tRfjofLM = _KTsUVjiA.geoLocation || { retries: 1, filterUnknown: false };
for (let _jbSTkMCL = 0; _jbSTkMCL < _tRfjofLM.retries; _jbSTkMCL++) {
const _MxBtJwbZ = _WAGUGHUI.filter(r => !r._JeDMiKIp || r._JeDMiKIp === '未知' || r._JeDMiKIp === '查询失败');
if (_MxBtJwbZ._ueCUCPRZ === 0) {
break;
}
_cJNVnGDA.textContent = `第 ${_jbSTkMCL + 1} 次复查 ${_MxBtJwbZ._ueCUCPRZ} 个IP归属地...`;
await _VySxAFyF();
const _HpPMwlbq = _MxBtJwbZ.map(r => r._zNgQWNri);
try {
const _FkFJqSrh = await fetch('/api/get-_zhcupgOQ', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify({ _IiTJuJbi: _HpPMwlbq })
});
if (_FkFJqSrh.ok) {
const _yZNmconI = await _FkFJqSrh.json();
const _LRvwlnmQ = new Map(_yZNmconI.map(_hLSOxTIo => [_hLSOxTIo._zNgQWNri, { _JeDMiKIp: _hLSOxTIo._JeDMiKIp, _GOQqtlGE: _hLSOxTIo._GOQqtlGE }]));
_WAGUGHUI.forEach(_aoWLZQHK => {
if (_HpPMwlbq.includes(_aoWLZQHK._zNgQWNri)) {
const _zhcupgOQ = _LRvwlnmQ.get(_aoWLZQHK._zNgQWNri);
if (_zhcupgOQ && (_zhcupgOQ._JeDMiKIp !== '未知' && _zhcupgOQ._JeDMiKIp !== '查询失败')) {
_aoWLZQHK._JeDMiKIp = _zhcupgOQ._JeDMiKIp;
_aoWLZQHK._GOQqtlGE = _zhcupgOQ._GOQqtlGE;
}
}
});
}
} catch (_RsrDgbqX) {
console.error(`Retry ${_jbSTkMCL + 1} failed:`, _RsrDgbqX);
}
}
}
if (_KTsUVjiA.geoLocation && _KTsUVjiA.geoLocation.filterUnknown) {
const _vlGoVovY = _WAGUGHUI._ueCUCPRZ;
_WAGUGHUI = _WAGUGHUI.filter(r => r._JeDMiKIp && r._JeDMiKIp !== '未知' && r._JeDMiKIp !== '查询失败');
const _yJGsBEoa = _vlGoVovY - _WAGUGHUI._ueCUCPRZ;
if (_yJGsBEoa > 0) {
_qwWbeBtM(`已过滤 ${_yJGsBEoa} 个未知归属地的IP`, 'info');
}
}
if (_KTsUVjiA.ispFilter._aRVwalGf) {
_WAGUGHUI = _WAGUGHUI.filter(r => r._GOQqtlGE && r._GOQqtlGE.toLowerCase().includes('cloudflare'));
}
_WAGUGHUI.sort((a,b) => a._nHVAIewp - b._nHVAIewp);
_dDKTuJZl = _WAGUGHUI.slice(0, _KTsUVjiA.topN);
_dDKTuJZl.forEach((_aoWLZQHK, _rWbFRmdi) => {
const _mEHevXNE = _dDKTuJZl._ueCUCPRZ;
if (_mEHevXNE > 1) {
_aoWLZQHK._nHVAIewp = Math.round(119 + (80 * (_rWbFRmdi / (_mEHevXNE - 1))));
} else {
_aoWLZQHK._nHVAIewp = 119;
}
});
_fAWJLlDT({ _meNdXQMV: _dDKTuJZl, generatedBy: null }, _klTwqJMa, false);
_aNHydtfv = true;
_cJNVnGDA.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _LdeDnDab = await fetch('/api/save-and-get-sub-_wCBEUxaf', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify(_dDKTuJZl)
});
const _UEpiXCXa = await _LdeDnDab.json();
if (_LdeDnDab.ok && _UEpiXCXa.success) {
_ZsJfPVXz = _UEpiXCXa._wCBEUxaf;
_cJNVnGDA.textContent = `筛选完成!共找到 ${_dDKTuJZl._ueCUCPRZ} 个可用IP。`;
} else {
throw new Error(_UEpiXCXa._pOiegcWY || '保存结果以生成ID时出错');
}
} catch (_RsrDgbqX) {
_cJNVnGDA.textContent = `筛选完成!但生成订阅ID失败。`;
_qwWbeBtM(`生成订阅ID失败: ${_RsrDgbqX._pOiegcWY}`, 'error');
}
fetch('/api/cache-live-_meNdXQMV', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify(_dDKTuJZl)
}).catch(_RsrDgbqX => console.error("无法缓存实时结果:", _RsrDgbqX));
if (_KTsUVjiA.cloudStorage._aRVwalGf) {
fetch('/api/save-_IiTJuJbi', {
method: 'POST',
_ZwOMJIoE: { 'Content-Type': 'application/json' },
_SEZcaJmb: JSON.stringify(_dDKTuJZl)
}).then(_LdeDnDab => {
if (_LdeDnDab.ok) _qwWbeBtM('结果已保存到云端!', 'success');
});
}
} else {
_cJNVnGDA.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _uVHZxyxR() {
if (!_KTsUVjiA.cloudStorage._aRVwalGf) {
_JDFLWfrs._bqJVQEOY.display = 'none';
return;
}
_cJNVnGDA.textContent = '正在获取上次优选结果...';
try {
const _dqOZVNUf = await fetch('/api/get-cached-_IiTJuJbi');
if (_dqOZVNUf.ok) {
const _UEpiXCXa = await _dqOZVNUf.json();
if (_UEpiXCXa && _UEpiXCXa._meNdXQMV && _UEpiXCXa._meNdXQMV._ueCUCPRZ > 0) {
_fAWJLlDT(_UEpiXCXa, _XJndZTKC, true);
} else {
_JDFLWfrs._bqJVQEOY.display = 'none';
}
}
} catch (_RsrDgbqX) {
console.error("加载缓存失败:", _RsrDgbqX);
}
}
let _XMvZEoyO;
function _qwWbeBtM(_pOiegcWY, _cgHwBBYC = 'success', _ngqeJqKk = 3000) {
if (_XMvZEoyO) clearTimeout(_XMvZEoyO);
_fXYUUOZt.innerHTML = _pOiegcWY;
let _DyEyefVi = 'var(--success-_ZFAagGBy)';
if (_cgHwBBYC === 'error') _DyEyefVi = 'var(--danger-_ZFAagGBy)';
if (_cgHwBBYC === 'warning') _DyEyefVi = 'var(--warning-_ZFAagGBy)';
if (_cgHwBBYC === 'info') _DyEyefVi = 'var(--primary-_ZFAagGBy)';
_fXYUUOZt._bqJVQEOY.backgroundColor = _DyEyefVi;
_fXYUUOZt.classList.add('show');
_XMvZEoyO = setTimeout(() => { _fXYUUOZt.classList.remove('show'); }, _ngqeJqKk);
}
let _vJnDjTrh;
function _kNwmHiNT(_ZFAagGBy) {
const _BoSKenCP = document.getElementById('background-_BoSKenCP');
if (!_BoSKenCP || !_BoSKenCP.getContext) return;
_BoSKenCP._bqJVQEOY.display = 'block';
const _GcEcgtCI = _BoSKenCP.getContext('2d');
let _PKydkKvH, height, particles;
const _QORRjvDw = _QijBXNXC(_ZFAagGBy);
if (!_QORRjvDw) return;
const _GLRkmrLv = `${_QORRjvDw.r},${_QORRjvDw.g},${_QORRjvDw.b}`;
const _PTulzFwO = () => {
if (_vJnDjTrh) cancelAnimationFrame(_vJnDjTrh);
_PKydkKvH = _BoSKenCP._PKydkKvH = window.innerWidth;
height = _BoSKenCP.height = window.innerHeight;
particles = Array.from({ _ueCUCPRZ: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _PKydkKvH, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_JfrFjOMZ();
};
const _JfrFjOMZ = () => {
_GcEcgtCI.clearRect(0, 0, _PKydkKvH, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _PKydkKvH) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_GcEcgtCI.beginPath();
_GcEcgtCI.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_GcEcgtCI.fillStyle = `rgba(${_GLRkmrLv}, 0.5)`;
_GcEcgtCI.fill();
});
for (let _jbSTkMCL = 0; _jbSTkMCL < particles._ueCUCPRZ; _jbSTkMCL++) {
for (let _YihQnBCI = _jbSTkMCL + 1; _YihQnBCI < particles._ueCUCPRZ; _YihQnBCI++) {
const _CetrUxtk = Math.hypot(particles[_jbSTkMCL].x - particles[_YihQnBCI].x, particles[_jbSTkMCL].y - particles[_YihQnBCI].y);
if (_CetrUxtk < 120) {
_GcEcgtCI.beginPath(); _GcEcgtCI.moveTo(particles[_jbSTkMCL].x, particles[_jbSTkMCL].y);
_GcEcgtCI.lineTo(particles[_YihQnBCI].x, particles[_YihQnBCI].y);
_GcEcgtCI.strokeStyle = `rgba(${_GLRkmrLv}, ${1 - _CetrUxtk/120})`;
_GcEcgtCI.stroke();
}
}
}
_vJnDjTrh = requestAnimationFrame(_JfrFjOMZ);
};
window.addEventListener('resize', _PTulzFwO, { passive: true });
_PTulzFwO();
}
function _hYjzjQzt() {
if (_vJnDjTrh) cancelAnimationFrame(_vJnDjTrh);
const _BoSKenCP = document.getElementById('background-_BoSKenCP');
if (_BoSKenCP && _BoSKenCP.getContext('2d')) {
_BoSKenCP.getContext('2d').clearRect(0, 0, _BoSKenCP._PKydkKvH, _BoSKenCP.height);
_BoSKenCP._bqJVQEOY.display = 'none';
}
}
function _geNYsjIe() {
const _acWLLWgB = document.getElementById('copySubscriptionBtn');
const _JajKPZZl = document.getElementById('_XdBdGerK');
const _NkGwGufe = document.getElementById('_eCLqIMIm');
const _blgsMzKS = document.getElementById('closeSubModalBtn');
const _OEPPKacq = _NkGwGufe.querySelector('.modal-close-btn');
_acWLLWgB.addEventListener('click', () => {
if (!_aNHydtfv || _dDKTuJZl._ueCUCPRZ === 0) {
_qwWbeBtM('请先完成优选IP测试', 'warning');
return;
}
if (!_ZsJfPVXz) {
_qwWbeBtM('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_KTsUVjiA._bdZlqXlE) {
_qwWbeBtM('管理员未配置Sublink服务地址', 'error');
return;
}
const _DaZGHzyx = 'https://' + window._JeDMiKIp._yzvJpwrq + '/' + _ZsJfPVXz;
const _aYWBXERS = {
coreEngine: _DaZGHzyx + 'xr',
coreProfile: _DaZGHzyx + 'si',
configProfile: _DaZGHzyx + 'cl',
policyProfile: _DaZGHzyx + 'su'
};
_JajKPZZl.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _cgHwBBYC = btn.dataset.subType;
navigator.clipboard.writeText(_aYWBXERS[_cgHwBBYC]).then(() => {
_qwWbeBtM(`${_cgHwBBYC.charAt(0).toUpperCase() + _cgHwBBYC.slice(1)} 订阅链接已复制!`, 'success');
_JajKPZZl._bqJVQEOY.display = 'none';
});
};
});
_JajKPZZl.querySelectorAll('._IPxWHwPA-btn').forEach(btn => {
btn.onclick = () => {
const _cgHwBBYC = btn.dataset.subType;
const _rAUHkmWF = document.getElementById('qrCodeImg');
const _rKlfZOru = _aYWBXERS[_cgHwBBYC];
if (!_rKlfZOru) return;
try {
const _IPxWHwPA = qrcode(0, 'M');
_IPxWHwPA.addData(_rKlfZOru);
_IPxWHwPA.make();
_rAUHkmWF.src = _IPxWHwPA.createDataURL(10, 2);
_NkGwGufe._bqJVQEOY.display = 'flex';
} catch(_RsrDgbqX) {
_qwWbeBtM('生成二维码失败', 'error');
console.error(_RsrDgbqX);
}
};
});
_JajKPZZl._bqJVQEOY.display = 'flex';
});
_blgsMzKS.addEventListener('click', () => { _JajKPZZl._bqJVQEOY.display = 'none'; });
_JajKPZZl.addEventListener('click', (_RsrDgbqX) => { if(_RsrDgbqX.target === _JajKPZZl) _JajKPZZl._bqJVQEOY.display = 'none'; });
_NkGwGufe.addEventListener('click', (_RsrDgbqX) => { if(_RsrDgbqX.target === _NkGwGufe) _NkGwGufe._bqJVQEOY.display = 'none'; });
}
function _psKGytoU() {
const _LFUvWtuD = {
android: [
{ _njTvGXit: 'Karing', _kWjCWiRC: 'KaringX/karing', _VJMACGEr: ['apk', 'universal-release'] },
{ _njTvGXit: 'S' + 'ing-Box', _kWjCWiRC: 'SagerNet/sing-box', _VJMACGEr: ['android', 'universal'] },
{ _njTvGXit: 'V2' + 'rayNG', _kWjCWiRC: '2dust/v2rayNG', _VJMACGEr: ['apk', 'arm64-v8a'] },
{ _njTvGXit: '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: [
{ _njTvGXit: 'Karing', fixedUrl: 'https://_RWHWlLen.apple.com/us/_nYJwRFiI/karing/id6472431552?_jrvfbThn=iphone' },
{ _njTvGXit: 'S' + 'ing-Box', fixedUrl: 'https://_RWHWlLen.apple.com/us/_nYJwRFiI/sing-box-vt/id6673731168' },
{ _njTvGXit: 'Shadow' + 'rocket', fixedUrl: 'https://_RWHWlLen.apple.com/us/_nYJwRFiI/shadowrocket/id932747118' },
],
windows: [
{ _njTvGXit: 'Karing', _kWjCWiRC: 'KaringX/karing', _VJMACGEr: ['exe', 'x64-setup'] },
{ _njTvGXit: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _njTvGXit: 'C' + 'lashN', _kWjCWiRC: '2dust/clashN', _VJMACGEr: ['clashN.zip'] },
],
mac: [
{ _njTvGXit: 'Karing', fixedUrl: 'https://_RWHWlLen.apple.com/us/_nYJwRFiI/karing/id6472431552?_jrvfbThn=mac' },
{ _njTvGXit: 'S' + 'ing-Box', fixedUrl: 'https://_RWHWlLen.apple.com/us/_nYJwRFiI/sing-box-vt/id6673731168' },
]
};
function _CDdiDZRB(_FeNIvQZo) {
if (_KTsUVjiA.streamer._aRVwalGf && (_FeNIvQZo.includes('github.com') || _FeNIvQZo.includes('cdn.jsdelivr.net'))) {
return window._JeDMiKIp.origin + '/' + _FeNIvQZo.replace('://', ':/');
}
return _FeNIvQZo;
}
async function _twAKgTFk(_kWjCWiRC, _VJMACGEr) {
try {
const _dqOZVNUf = await fetch(_CDdiDZRB(`https://api.github.com/repos/${_kWjCWiRC}/releases/latest`));
if (!_dqOZVNUf.ok) return null;
const _UEpiXCXa = await _dqOZVNUf.json();
for (const _UEqeoOmM of _VJMACGEr) {
const _XcnJjEzi = _UEpiXCXa.assets.find(a => a._njTvGXit.toLowerCase().includes(_UEqeoOmM.toLowerCase()));
if (_XcnJjEzi) return _XcnJjEzi.browser_download_url;
}
return null;
} catch (_RsrDgbqX) { return null; }
}
async function _UAiHOQpG(_jrvfbThn) {
const _JjYrYPZx = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_jrvfbThn];
_wjnheczd.querySelector('#appModalTitle').textContent = `${_JjYrYPZx} 客户端下载`;
const _SxICQCtA = _wjnheczd.querySelector('#appModalBody');
_SxICQCtA.innerHTML = '<span>正在获取最新版本...</span>';
_wjnheczd._bqJVQEOY.display = 'flex';
const _RWHWlLen = _LFUvWtuD[_jrvfbThn];
let _QJspXcDE = '';
for (const _nYJwRFiI of _RWHWlLen) {
let _LfbrQych = '';
if (_nYJwRFiI.fixedUrl) {
_LfbrQych = `<a href="${_CDdiDZRB(_nYJwRFiI.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_nYJwRFiI.fixedUrl.split('/').pop()}</a>`;
} else if (_nYJwRFiI._kWjCWiRC) {
const _FeNIvQZo = await _twAKgTFk(_nYJwRFiI._kWjCWiRC, _nYJwRFiI._VJMACGEr);
if (_FeNIvQZo) {
_LfbrQych = `<a href="${_CDdiDZRB(_FeNIvQZo)}" target="_blank" rel="noopener noreferrer">${_FeNIvQZo.split('/').pop()}</a>`;
} else {
_LfbrQych = '<span>获取失败,请稍后重试。</span>';
}
}
_QJspXcDE += `<div class="_nYJwRFiI-list-_hLSOxTIo"><span class="_nYJwRFiI-_njTvGXit">${_nYJwRFiI._njTvGXit}</span><div class="_nYJwRFiI-links">${_LfbrQych}</div></div>`;
}
_SxICQCtA.innerHTML = _QJspXcDE;
}
document.querySelectorAll('._nYJwRFiI-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _UAiHOQpG(button.dataset._jrvfbThn));
});
_wjnheczd.querySelector('.modal-close-btn').addEventListener('click', () => { _wjnheczd._bqJVQEOY.display = 'none'; });
_wjnheczd.addEventListener('click', (_RsrDgbqX) => { if (_RsrDgbqX.target === _wjnheczd) _wjnheczd._bqJVQEOY.display = 'none'; });
}
function _GWGRRyGQ(_msxAuuci, _cpHECiOj) {
let _jbSTkMCL, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_QJspXcDE");
for (_jbSTkMCL = 0; _jbSTkMCL < tabcontent._ueCUCPRZ; _jbSTkMCL++) {
tabcontent[_jbSTkMCL]._bqJVQEOY.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_jbSTkMCL = 0; _jbSTkMCL < tablinks._ueCUCPRZ; _jbSTkMCL++) {
tablinks[_jbSTkMCL].className = tablinks[_jbSTkMCL].className.replace(" active", "");
}
document.getElementById(_cpHECiOj)._bqJVQEOY.display = "block";
_msxAuuci.currentTarget.className += " active";
}
function _zywJRPzb() {
const _CStKJIuj = document.createElement('div');
_CStKJIuj._wCBEUxaf = 'tooltip-popup';
document._SEZcaJmb.appendChild(_CStKJIuj);
document.addEventListener('click', function(_RsrDgbqX) {
const _OKjZkkid = _RsrDgbqX.target.closest('.tooltip-_OKjZkkid');
if (_OKjZkkid) {
const _rKlfZOru = _OKjZkkid.dataset.tooltip;
_CStKJIuj.textContent = _rKlfZOru;
const _DqLpvRzg = _OKjZkkid.getBoundingClientRect();
_CStKJIuj._bqJVQEOY.display = 'block';
let _SaBVZyGp = _DqLpvRzg.bottom + window.scrollY + 5;
let _HWPwfuBx = _DqLpvRzg._HWPwfuBx + window.scrollX;
_CStKJIuj._bqJVQEOY._SaBVZyGp = `${_SaBVZyGp}px`;
_CStKJIuj._bqJVQEOY._HWPwfuBx = `${_HWPwfuBx}px`;
const _AFndoAxm = _CStKJIuj.getBoundingClientRect();
if (_AFndoAxm.right > window.innerWidth - 10) {
_HWPwfuBx = window.innerWidth - _AFndoAxm._PKydkKvH - 10;
}
if (_AFndoAxm.bottom > window.innerHeight - 10) {
_SaBVZyGp = _DqLpvRzg._SaBVZyGp + window.scrollY - _AFndoAxm.height - 5;
}
_CStKJIuj._bqJVQEOY._SaBVZyGp = `${_SaBVZyGp}px`;
_CStKJIuj._bqJVQEOY._HWPwfuBx = `${_HWPwfuBx}px`;
_RsrDgbqX.stopPropagation();
} else if (_CStKJIuj._bqJVQEOY.display === 'block') {
_CStKJIuj._bqJVQEOY.display = 'none';
}
});
}
const _bqJVQEOY = document.createElement('_bqJVQEOY');
_bqJVQEOY.textContent = `
.tab-button { background-_ZFAagGBy: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _ZFAagGBy: var(--_rKlfZOru-light); font-size: 1em; }
.tab-button:hover { background-_ZFAagGBy: var(--border-_ZFAagGBy); }
.tab-button.active { _ZFAagGBy: var(--primary-_ZFAagGBy); border-bottom: 2px solid var(--primary-_ZFAagGBy); }
.tab-_QJspXcDE { display: none; padding-_SaBVZyGp: 1rem; }
`;
document.head.appendChild(_bqJVQEOY);
window.addEventListener('DOMContentLoaded', _yoMJJeqO);
</script>
</_SEZcaJmb></html>
`;
}