import { connect } from "cloudflare:sockets";
const _EOLbnxzM = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _mfwWgmDj = ["UpstreamAddress.SG.CMLiussss.net"];
const _qDgJmzTc = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _OyuhOSsi = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _WjTmdcqW = '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 _nkVacZlG = '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 _sjhNtYIK(_WqXGmQGS) {
if (Array.isArray(_WqXGmQGS)) {
try {
return String.fromCharCode.apply(null, _WqXGmQGS);
} catch (_mRxgqKvR) {
return '';
}
}
return _WqXGmQGS;
}
function _GVxZDSrk(_lbGOVwXK) {
return /^[0-9a-_XRWybpuN]{8}-[0-9a-_XRWybpuN]{4}-[4][0-9a-_XRWybpuN]{3}-[89ab][0-9a-_XRWybpuN]{3}-[0-9a-_XRWybpuN]{12}$/_hhKnPIhG.test(_lbGOVwXK);
}
const _slGECYiz = "optimized_ips_v4";
const _PjqXLGbJ = "global_config_v4";
const _aYSNumFE = "admin_password_v4";
const _SHvxuLwA = "live_results_temp_v1";
const _DyxMabqM = "latest_sub_id_v1";
export default {
async fetch(_cSAviSvM, _BQgpRFNk, _OFrvjzAS) {
try {
if (!_BQgpRFNk.DB) {
const _CfPmMowk = _FJqzGwny("D1 数据库 'DB' 未绑定。");
return new Response(_CfPmMowk, { status: 503, _aLVmyjqe: { 'Content-Type': '_SAEyHyrI/html;_dCnJqbQm=UTF-8' }});
}
_OFrvjzAS.waitUntil(
_BQgpRFNk.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_oxBzSUFO TEXT PRIMARY KEY, _WqXGmQGS TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_lbGOVwXK TEXT PRIMARY KEY, _bqlLVbdo TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_mRxgqKvR => console.error("DB Init Error:", _mRxgqKvR._LFVTLzGR))
);
const _TXuFepGX = new URL(_cSAviSvM._TXuFepGX);
const _KdbyphYI = _TXuFepGX.pathname;
const _wbaYhwad = _cSAviSvM._aLVmyjqe.get("Upgrade");
const _bfeocNIy = await _pxSLYxvP(_BQgpRFNk);
if (_bfeocNIy.websocketStreamer && _bfeocNIy.websocketStreamer._eIMyZaKb && _wbaYhwad && _wbaYhwad.toLowerCase() === "websocket") {
const _BQnBsPbJ = _bfeocNIy.websocketStreamer._TXuFepGX;
if (_BQnBsPbJ && _BQnBsPbJ.trim().startsWith('https://')) {
try {
const _lNPOImEi = new Request(_BQnBsPbJ.trim() + _TXuFepGX.pathname + _TXuFepGX.search, _cSAviSvM);
return await fetch(_lNPOImEi);
} catch (_mRxgqKvR) {
return new Response(`Upstream WebSocket gateway failed: ${_mRxgqKvR._LFVTLzGR}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_wbaYhwad && _wbaYhwad.toLowerCase() === "websocket") {
return await _DTCNOZZi(_cSAviSvM, _BQgpRFNk, _bfeocNIy);
}
const _xCagwHYB = _KdbyphYI._HLVjFSiv(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_xCagwHYB) {
const [, _dcoxVOPv, typeSuffix] = _xCagwHYB;
const _YgNZzilN = _bfeocNIy._YgNZzilN;
if (!_YgNZzilN || _YgNZzilN.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' } });
}
const _scSfiMWO = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _FpxipYty = _scSfiMWO[typeSuffix];
const _ppVJPxTX = _YgNZzilN.replace(/\/$/, '');
const _zRMUTanr = `${_TXuFepGX.origin}/${_dcoxVOPv}`;
const _vaxWbhGk = `${_ppVJPxTX}/${_FpxipYty}?_bfeocNIy=${encodeURIComponent(_zRMUTanr)}`;
try {
const _KGGkjkOT = await fetch(_vaxWbhGk, { _aLVmyjqe: { 'User-Agent': _cSAviSvM._aLVmyjqe.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _YmydUOdM = new Headers(_KGGkjkOT._aLVmyjqe);
_YmydUOdM._FvSygfHj('Access-Control-Allow-Origin', '*');
return new Response(_KGGkjkOT._OEtNiPyg, { status: _KGGkjkOT.status, statusText: _KGGkjkOT.statusText, _aLVmyjqe: _YmydUOdM });
} catch (_mRxgqKvR) {
return new Response(`获取上游订阅失败: ${_mRxgqKvR._LFVTLzGR}`, { status: 502, _aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' } });
}
}
if (_KdbyphYI.startsWith('/https:/') || _KdbyphYI.startsWith('/http:/')) {
return _pzCKPBWC(_cSAviSvM, _bfeocNIy);
}
if (_bfeocNIy.customSubPath && _bfeocNIy.customSubPath._eIMyZaKb && _bfeocNIy.customSubPath._KdbyphYI && _KdbyphYI === '/' + _bfeocNIy.customSubPath._KdbyphYI.trim()) {
const _KsygnFPe = _BQgpRFNk.DB.prepare("SELECT _WqXGmQGS FROM kv_data WHERE _oxBzSUFO = ?").bind(_DyxMabqM);
const { _DFwFoguh } = await _KsygnFPe.all();
const _TKPWzvld = _DFwFoguh._krXpfTfu > 0 ? _DFwFoguh[0]._WqXGmQGS : null;
if (_TKPWzvld) {
return _RoBrBDmt({ _oCpaHUJn: { _lbGOVwXK: _TKPWzvld }, _TXuFepGX: _cSAviSvM._TXuFepGX }, _BQgpRFNk);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' } });
}
}
const _mDmcJDWS = _KdbyphYI.split('/').filter(Boolean);
if (_mDmcJDWS._krXpfTfu === 1 && !_KdbyphYI.startsWith('/api/')) {
const _dcoxVOPv = _mDmcJDWS[0];
return _RoBrBDmt({ _oCpaHUJn: { _lbGOVwXK: _dcoxVOPv }, _TXuFepGX: _cSAviSvM._TXuFepGX }, _BQgpRFNk);
}
if (_KdbyphYI.startsWith('/api/')) {
if (_KdbyphYI === '/api/_bfeocNIy' && _cSAviSvM.method === 'POST') return _whrwGofQ(_cSAviSvM, _BQgpRFNk, _OFrvjzAS);
if (_KdbyphYI === '/api/_FvSygfHj-_xSpiSRGf') return _ltyJWemt(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI === '/api/change-_xSpiSRGf') return _JUllYubj(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI === '/api/verify-_xSpiSRGf') return _dQdXLiOH(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI === '/api/verify-visitor-_xSpiSRGf' && _cSAviSvM.method === 'POST') return _JllHvtJU(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI === '/api/cache-live-_DFwFoguh' && _cSAviSvM.method === 'POST') return _QZoRSARM(_cSAviSvM, _BQgpRFNk, _OFrvjzAS);
if (_KdbyphYI === '/api/get-_XDiMKrpS' && _cSAviSvM.method === 'POST') return _OWOrGZAo(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI === '/api/get-cached-_FZcryuIe') return _WTcDesHw(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI === '/api/save-_FZcryuIe') return _tVuLzHqC(_cSAviSvM, _BQgpRFNk, _OFrvjzAS);
if (_KdbyphYI === '/api/save-and-get-sub-_lbGOVwXK' && _cSAviSvM.method === 'POST') return _SWtDrgcF(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI.startsWith('/api/get-_yYMoGLTS/')) {
const _dcoxVOPv = _KdbyphYI.split('/').pop();
return _RoBrBDmt({ _oCpaHUJn: { _lbGOVwXK: _dcoxVOPv }, _TXuFepGX: _cSAviSvM._TXuFepGX }, _BQgpRFNk);
}
if (_KdbyphYI === '/api/_bfeocNIy' && _cSAviSvM.method === 'GET') return _fxuXIcbJ(_BQgpRFNk);
if (_KdbyphYI === '/api/get-resolved-_FZcryuIe') return _iwhlOCNj(_cSAviSvM);
if (_KdbyphYI === '/api/parse-_FZcryuIe-from-_NWjNMMyu' && _cSAviSvM.method === 'POST') return _UQPRqgDd(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI === '/api/endpoints') return _UmoJvcDL(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_KdbyphYI === '/_pfeeDWuf') return _pkBpCBkO(_cSAviSvM, _BQgpRFNk);
if (_KdbyphYI === '/bing-wallpaper') return _oQmwJuCK();
return _BzuvWvnZ(_cSAviSvM, _BQgpRFNk, _OFrvjzAS);
} catch (err) {
let _mRxgqKvR = err;
return new Response(_mRxgqKvR.toString(), { status: 500 });
}
}
};
const _nsWxKXSh = { 'Accept': '_SAEyHyrI/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 _qrJofyrG(_TXuFepGX, _TCCyquQD) {
const _dQdXhBRf = await fetch(_TXuFepGX, { _aLVmyjqe: { ..._nsWxKXSh, 'Referer': _TCCyquQD.referer } });
if (_dQdXhBRf.ok) return _dQdXhBRf._SAEyHyrI();
return null;
}
async function _iQyoHTtZ(_TXuFepGX, _TCCyquQD) {
const _iuIACZsc = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_TXuFepGX)}`;
const _dQdXhBRf = await fetch(_iuIACZsc, { _aLVmyjqe: { ..._nsWxKXSh, 'Referer': _TCCyquQD.referer } });
if (!_dQdXhBRf.ok) return null;
const _OEtNiPyg = await _dQdXhBRf._SAEyHyrI();
const _HLVjFSiv = _OEtNiPyg._HLVjFSiv(/<pre[^>]*>([\s\S]*?)<\/pre>/_hhKnPIhG);
return _HLVjFSiv && _HLVjFSiv[1] ? _HLVjFSiv[1].replace(/&/g, '&') : null;
}
function _OrrvLmcp(_GeSNHDPO) {
let _jMgpmayT;
try {
_jMgpmayT = atob(_GeSNHDPO.replace(/\s/g, ''));
} catch (_mRxgqKvR) {
_jMgpmayT = _GeSNHDPO;
}
const _yYMoGLTS = _jMgpmayT.split(/[\s\n\r,]+/).filter(line => line.trim());
const _sgRnAuei = new Set();
const _iVfxqvBM = /@([^?#]+?):(\d+)/;
for (const _XIDupThs of _yYMoGLTS) {
let _eePZabgY = '';
let _mxOpOfBL = '';
try {
if (_XIDupThs.startsWith('vmess://')) {
const _hjYsbHte = atob(_XIDupThs.substring(8));
const _bfeocNIy = JSON.parse(_hjYsbHte);
_eePZabgY = _bfeocNIy.add;
_mxOpOfBL = _bfeocNIy._mxOpOfBL;
} else {
const _HLVjFSiv = _XIDupThs._HLVjFSiv(_iVfxqvBM);
if (_HLVjFSiv && _HLVjFSiv[1] && _HLVjFSiv[2]) {
_eePZabgY = _HLVjFSiv[1].replace(/[\[\]]/g, '');
_mxOpOfBL = _HLVjFSiv[2];
}
}
} catch (_mRxgqKvR) {
console.warn(`Could not parse _XIDupThs: ${_XIDupThs}`);
}
if (_eePZabgY && _mxOpOfBL) {
_sgRnAuei.add(`${_eePZabgY}:${_mxOpOfBL}`);
}
}
return Array.from(_sgRnAuei);
}
async function _giiLLIqf(_YuwnuaXq) {
try {
const _dQdXhBRf = await fetch(_YuwnuaXq, { _aLVmyjqe: _nsWxKXSh });
if (!_dQdXhBRf.ok) {
console.error(`Failed to fetch subscription: ${_dQdXhBRf.status}`);
return [];
}
const _GeSNHDPO = await _dQdXhBRf._SAEyHyrI();
return _OrrvLmcp(_GeSNHDPO);
} catch (error) {
console.error(`Error processing subscription ${_YuwnuaXq}:`, error);
return [];
}
}
async function _dyyuXagk(_rILKpoyJ) {
const _CpPpIfKm = _rILKpoyJ.trim();
const _WKnDhUAn = /^(vless|vmess|trojan|ss):\/\//.test(_CpPpIfKm);
const _tPcoahPK = (() => {
if (_CpPpIfKm._krXpfTfu < 20 || _CpPpIfKm.startsWith('http')) return false;
const _wEmsRenM = _CpPpIfKm.replace(/\s/g, '');
if (_wEmsRenM._krXpfTfu % 4 !== 0 && !_wEmsRenM.includes('=')) return false;
try {
atob(_wEmsRenM);
return true;
} catch (_mRxgqKvR) {
return false;
}
})();
if (_WKnDhUAn || _tPcoahPK) {
return _OrrvLmcp(_CpPpIfKm).join('\n');
}
const _QSekgAPz = [
'https://ipdb.api.030101.xyz/?_ouYmRJWQ=bestcf&_RmLXGywc=true',
'https://ipdb.api.030101.xyz/?_ouYmRJWQ=bestproxy&_RmLXGywc=true'
];
const _YCCFJeyF = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_hhKnPIhG.test(_rILKpoyJ) || _rILKpoyJ.includes('?_HTPkOeUv=');
if (_YCCFJeyF) {
const _FZcryuIe = await _giiLLIqf(_rILKpoyJ);
return _FZcryuIe.join('\n');
}
let _GeSNHDPO = '';
if (_QSekgAPz.includes(_rILKpoyJ)) {
_GeSNHDPO = await _qrJofyrG(_rILKpoyJ, { referer: _rILKpoyJ });
if (!_GeSNHDPO || _GeSNHDPO._krXpfTfu < 8) {
_GeSNHDPO = await _iQyoHTtZ(_rILKpoyJ, { referer: _rILKpoyJ });
}
} else {
try {
const _ENGeslGW = await fetch(_rILKpoyJ, { _aLVmyjqe: { 'User-Agent': 'Cloudflare-Worker' } });
if (_ENGeslGW.ok) {
_GeSNHDPO = await _ENGeslGW._SAEyHyrI();
} else {
console.warn(`Failed to fetch URL ${_rILKpoyJ}: ${_ENGeslGW.status}`);
}
} catch (_mRxgqKvR) {
console.error(`Error fetching URL ${_rILKpoyJ}:`, _mRxgqKvR);
}
}
const _FzPilTIk = _OrrvLmcp(_GeSNHDPO);
if (_FzPilTIk._krXpfTfu > 0) {
return _FzPilTIk.join('\n');
}
return _GeSNHDPO || '';
}
async function _pzCKPBWC(_cSAviSvM, _bfeocNIy) {
if (!_bfeocNIy.streamer._eIMyZaKb) {
return new Response('远程流功能未开启', { status: 403 });
}
const _TXuFepGX = new URL(_cSAviSvM._TXuFepGX);
const _tPUkhFed = _TXuFepGX.pathname.substring(1).replace(':/', '://');
try {
const _vaxWbhGk = new URL(_tPUkhFed);
const _LkAUVOGP = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_LkAUVOGP.some(domain => _vaxWbhGk._eePZabgY.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _XFBcGluB = new Headers(_cSAviSvM._aLVmyjqe);
_XFBcGluB._FvSygfHj('Host', _vaxWbhGk._eePZabgY);
_XFBcGluB._FvSygfHj('User-Agent', 'CF-Worker-Streamer/1.0');
const _YjubTjBg = await fetch(_vaxWbhGk.toString(), {
method: _cSAviSvM.method,
_aLVmyjqe: _XFBcGluB,
_OEtNiPyg: _cSAviSvM._OEtNiPyg,
});
const _YmydUOdM = new Headers(_YjubTjBg._aLVmyjqe);
_YmydUOdM._FvSygfHj('Access-Control-Allow-Origin', '*');
_YmydUOdM._FvSygfHj('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_YmydUOdM._FvSygfHj('Access-Control-Allow-Headers', '*');
_YmydUOdM._FvSygfHj('Cache-Control', 'public, max-age=86400');
_YmydUOdM._FvSygfHj('X-Streamer-Source', 'CF-Worker');
_YmydUOdM.delete('_GeSNHDPO-security-policy');
_YmydUOdM.delete('x-_GeSNHDPO-security-policy');
_YmydUOdM.delete('x-webkit-csp');
return new Response(_YjubTjBg._OEtNiPyg, {
status: _YjubTjBg.status,
statusText: _YjubTjBg.statusText,
_aLVmyjqe: _YmydUOdM,
});
} catch (_mRxgqKvR) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _DTCNOZZi(_cSAviSvM, _BQgpRFNk, _bfeocNIy) {
try {
const _IxaDGneB = _bfeocNIy || await _pxSLYxvP(_BQgpRFNk);
const _uddYgRuQ = (_IxaDGneB.itemLink._aoDLJyDe && _IxaDGneB.itemLink._aoDLJyDe[0]) || {};
const _yxKkUzqq = _uddYgRuQ['_HTPkOeUv'] || _sjhNtYIK(_EOLbnxzM);
if (!_GVxZDSrk(_yxKkUzqq)) {
throw new Error("Configured user _RPaiahrN is not valid.");
}
const _ZfmAyomD = _IxaDGneB.dataFeeds.universalFallbackAddress;
let _VKgSgOzA = {};
const _zLxaACou = _sjhNtYIK(_mfwWgmDj[0] || "");
if (_ZfmAyomD) {
const [_WtCmmoGF, _mxOpOfBL = '443'] = _ZfmAyomD.split(':');
_VKgSgOzA = { _WtCmmoGF, _mxOpOfBL };
} else {
const [_WtCmmoGF, _mxOpOfBL = '443'] = _zLxaACou.split(':');
_VKgSgOzA = { _WtCmmoGF, _mxOpOfBL };
}
const _TXuFepGX = new URL(_cSAviSvM._TXuFepGX);
const _KdbyphYI = _TXuFepGX.pathname;
let _MBLXoMPa = '';
const _BwAfwxfd = _TXuFepGX.searchParams.get('remote');
if (_BwAfwxfd) {
_MBLXoMPa = atob(_BwAfwxfd);
} else if (_KdbyphYI.startsWith('/endpoint=')) {
_MBLXoMPa = _KdbyphYI.substring(10);
} else if (_KdbyphYI._krXpfTfu > 1 && _KdbyphYI.substring(1).includes('.')) {
_MBLXoMPa = _KdbyphYI.substring(1);
}
if (_MBLXoMPa) {
const [_WtCmmoGF, _mxOpOfBL = '443'] = _MBLXoMPa.split(':');
_VKgSgOzA = { _WtCmmoGF, _mxOpOfBL };
}
return await _IlTfnhfs(_cSAviSvM, _yxKkUzqq, _VKgSgOzA);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _IlTfnhfs(_cSAviSvM, _RPaiahrN, _VKgSgOzA) {
const _MrqleWWM = new WebSocketPair();
const [clientEnd, _cdYPNKCl] = Object.values(_MrqleWWM);
_cdYPNKCl.accept();
let _TsGJFBAZ = { _HMEacuWG: null };
const _SDOwbYgl = _cSAviSvM._aLVmyjqe.get("sec-websocket-protocol") || "";
const _vdjPHxeP = _ZFkDNXbV(_cdYPNKCl, _SDOwbYgl);
_vdjPHxeP.pipeTo(new WritableStream({
async write(chunk) {
if (_TsGJFBAZ._HMEacuWG) {
const _qWUFPHvx = _TsGJFBAZ._HMEacuWG.writable.getWriter();
await _qWUFPHvx.write(chunk);
_qWUFPHvx.releaseLock();
return;
}
const { error, details } = await _RqhwcjTc(chunk, _RPaiahrN);
if (error) {
throw new Error(details);
}
const _zgHkQihz = new Uint8Array([details._GMJVwUZB[0], 0]);
const _eBZvEjME = chunk.slice(details.payloadIndex);
await _vAVCFLAJ(_TsGJFBAZ, details._EymdvnOA, details._SewbIZko, _eBZvEjME, _cdYPNKCl, _zgHkQihz, _VKgSgOzA);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_fEkpvMpN(_cdYPNKCl);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _vAVCFLAJ(_TsGJFBAZ, _EymdvnOA, _SewbIZko, _AiZDaMxN, _FaCBkeAE, _zgHkQihz, _mihzWSXV) {
const _jXHkLbUV = async (_WtCmmoGF, _mxOpOfBL) => {
let _vefKMpxI = _WtCmmoGF;
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(_WtCmmoGF)) {
_vefKMpxI = `${atob('d3d3Lg==')}${_WtCmmoGF}${atob('LnNzbGlwLmlv')}`;
}
const _HMEacuWG = connect({ _eePZabgY: _vefKMpxI, _mxOpOfBL });
_TsGJFBAZ._HMEacuWG = _HMEacuWG;
const _qWUFPHvx = _HMEacuWG.writable.getWriter();
await _qWUFPHvx.write(_AiZDaMxN);
_qWUFPHvx.releaseLock();
return _HMEacuWG;
};
const _gwARerPD = async () => {
if (!_mihzWSXV._WtCmmoGF) return;
console.log(`Direct connection failed, falling back to gateway: ${_mihzWSXV._WtCmmoGF}`);
const _GXwPiXjT = await _jXHkLbUV(_mihzWSXV._WtCmmoGF, parseInt(_mihzWSXV._mxOpOfBL, 10));
_GXwPiXjT.closed.catch(() => {}).finally(() => _fEkpvMpN(_FaCBkeAE));
_ERzZBUKP(_GXwPiXjT, _FaCBkeAE, _zgHkQihz, null);
};
try {
const _foTFwBqC = await _jXHkLbUV(_EymdvnOA, _SewbIZko);
_ERzZBUKP(_foTFwBqC, _FaCBkeAE, _zgHkQihz, _gwARerPD);
} catch (err) {
console.error("Primary connection failed:", err);
await _gwARerPD();
}
}
function _ZFkDNXbV(_cdYPNKCl, _SDOwbYgl) {
let _zSDZBeJS = false;
return new ReadableStream({
start(_DZISEvXM) {
_cdYPNKCl.addEventListener("_LFVTLzGR", (event) => { if (_zSDZBeJS) return; _DZISEvXM.enqueue(event._bqlLVbdo); });
_cdYPNKCl.addEventListener("close", () => { _fEkpvMpN(_cdYPNKCl); if (_zSDZBeJS) return; _DZISEvXM.close(); });
_cdYPNKCl.addEventListener("error", (err) => _DZISEvXM.error(err));
if (_SDOwbYgl) {
try {
const _ftebUQtZ = atob(_SDOwbYgl.replace(/-/g, "+").replace(/_/g, "/"));
_DZISEvXM.enqueue(Uint8Array.from(_ftebUQtZ, c => c.charCodeAt(0))._wxiWWHBz);
} catch (_mRxgqKvR) { console.error("Failed to decode early _bqlLVbdo:", _mRxgqKvR); }
}
},
cancel() { _zSDZBeJS = true; _fEkpvMpN(_cdYPNKCl); },
});
}
async function _RqhwcjTc(_wxiWWHBz, _RPaiahrN) {
if (_wxiWWHBz.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _GMJVwUZB = new Uint8Array(_wxiWWHBz.slice(0, 1));
const _KINeCqUi = _PZsFTjwl(new Uint8Array(_wxiWWHBz.slice(1, 17)));
if (_KINeCqUi !== _RPaiahrN) return { error: true, details: "Invalid _RPaiahrN" };
const _aGEOnxMG = new Uint8Array(_wxiWWHBz.slice(17, 18))[0];
const _TUilpkpZ = new Uint8Array(_wxiWWHBz.slice(18 + _aGEOnxMG, 19 + _aGEOnxMG))[0];
if (_TUilpkpZ !== 1) return { error: true, details: `Unsupported _TUilpkpZ: ${_TUilpkpZ}` };
const _bJOHEsmA = 19 + _aGEOnxMG;
const _SewbIZko = new DataView(_wxiWWHBz.slice(_bJOHEsmA, _bJOHEsmA + 2)).getUint16(0);
let _hyMfQdET = _bJOHEsmA + 2;
const _FpmIozdo = new Uint8Array(_wxiWWHBz.slice(_hyMfQdET, _hyMfQdET + 1))[0];
let _aFwZMUat = 0;
let _BjPsjHFw = _hyMfQdET + 1;
let _EymdvnOA = "";
switch (_FpmIozdo) {
case 1: _aFwZMUat = 4; _EymdvnOA = new Uint8Array(_wxiWWHBz.slice(_BjPsjHFw, _BjPsjHFw + _aFwZMUat)).join("."); break;
case 2: _aFwZMUat = new Uint8Array(_wxiWWHBz.slice(_BjPsjHFw, _BjPsjHFw + 1))[0]; _BjPsjHFw++; _EymdvnOA = new TextDecoder().decode(_wxiWWHBz.slice(_BjPsjHFw, _BjPsjHFw + _aFwZMUat)); break;
case 3: _aFwZMUat = 16; const _GveKnQgA = new DataView(_wxiWWHBz.slice(_BjPsjHFw, _BjPsjHFw + _aFwZMUat)); const _vOYKmqCB = []; for (let _hhKnPIhG = 0; _hhKnPIhG < 8; _hhKnPIhG++) _vOYKmqCB.push(_GveKnQgA.getUint16(_hhKnPIhG * 2).toString(16)); _EymdvnOA = _vOYKmqCB.join(":"); break;
default: return { error: true, details: `Invalid _fNdfwUQC _ouYmRJWQ: ${_FpmIozdo}` };
}
if (!_EymdvnOA) return { error: true, details: "Target _WtCmmoGF is empty" };
return { error: false, details: { _EymdvnOA, _SewbIZko, _GMJVwUZB, payloadIndex: _BjPsjHFw + _aFwZMUat } };
}
async function _ERzZBUKP(_HMEacuWG, _FaCBkeAE, _RossoHHa, _rkrKpOVL) {
let _LlTzOzeb = _RossoHHa;
let _gbHcllWB = false;
let _VGvOKDUX = _HMEacuWG._vdjPHxeP.pipeTo(new WritableStream({
write(chunk) {
_gbHcllWB = true;
if (_FaCBkeAE.readyState !== 1) throw new Error("Channel is not open");
if (_LlTzOzeb) {
const _vgkDkUzc = new Uint8Array(_LlTzOzeb.byteLength + chunk.byteLength);
_vgkDkUzc._FvSygfHj(new Uint8Array(_LlTzOzeb));
_vgkDkUzc._FvSygfHj(new Uint8Array(chunk), _LlTzOzeb.byteLength);
_FaCBkeAE.send(_vgkDkUzc._wxiWWHBz);
_LlTzOzeb = null;
} else {
_FaCBkeAE.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _FaCBkeAE error:", err._LFVTLzGR);
});
await _VGvOKDUX;
if (!_gbHcllWB && _rkrKpOVL) {
_rkrKpOVL();
}
}
function _fEkpvMpN(_FaCBkeAE) {
try { if (_FaCBkeAE.readyState === 1 || _FaCBkeAE.readyState === 2) _FaCBkeAE.close(); } catch (_mRxgqKvR) {}
}
const _XXLMPyEh = Array.from({ _krXpfTfu: 256 }, (_, _hhKnPIhG) => (_hhKnPIhG + 256).toString(16).slice(1));
function _PZsFTjwl(_ubOjiHzE, offset = 0) {
return (
_XXLMPyEh[_ubOjiHzE[offset]] + _XXLMPyEh[_ubOjiHzE[offset + 1]] + _XXLMPyEh[_ubOjiHzE[offset + 2]] + _XXLMPyEh[_ubOjiHzE[offset + 3]] + "-" +
_XXLMPyEh[_ubOjiHzE[offset + 4]] + _XXLMPyEh[_ubOjiHzE[offset + 5]] + "-" +
_XXLMPyEh[_ubOjiHzE[offset + 6]] + _XXLMPyEh[_ubOjiHzE[offset + 7]] + "-" +
_XXLMPyEh[_ubOjiHzE[offset + 8]] + _XXLMPyEh[_ubOjiHzE[offset + 9]] + "-" +
_XXLMPyEh[_ubOjiHzE[offset + 10]] + _XXLMPyEh[_ubOjiHzE[offset + 11]] +
_XXLMPyEh[_ubOjiHzE[offset + 12]] + _XXLMPyEh[_ubOjiHzE[offset + 13]] +
_XXLMPyEh[_ubOjiHzE[offset + 14]] + _XXLMPyEh[_ubOjiHzE[offset + 15]]
).toLowerCase();
}
let _NEGEbOIm = { "N/A":"未知" };
async function _UpJsqGTM(_TXuFepGX, _LwkQOCxT, _rkrKpOVL) {
try {
const _dQdXhBRf = await fetch(_TXuFepGX, {
_aLVmyjqe: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_dQdXhBRf.ok) {
console.error(`获取 ${_TXuFepGX} 失败: HTTP ${_dQdXhBRf.status}`);
return _rkrKpOVL;
}
const _SAEyHyrI = await _dQdXhBRf._SAEyHyrI();
return _LwkQOCxT(_SAEyHyrI);
} catch (error) {
console.error(`获取或解析 ${_TXuFepGX} 时发生网络错误: ${error._LFVTLzGR}`);
return _rkrKpOVL;
}
}
function _AJqrVrvA(_SAEyHyrI) {
if (!_SAEyHyrI) return [];
const _RufmjXVl = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _wIySxNDg = _SAEyHyrI.split(/[\s,;#|]+/);
const _bAdLOwLB = [];
for (const _bOKKhrtl of _wIySxNDg) {
const _CtuUiqHD = _bOKKhrtl.trim();
if (!_CtuUiqHD) continue;
const _mtPhadBH = _CtuUiqHD.lastIndexOf(':');
let _bMeNrYqc = _CtuUiqHD;
if(_mtPhadBH > _CtuUiqHD.lastIndexOf(']')) {
const _LMeUWCxV = _CtuUiqHD.substring(_mtPhadBH + 1);
if(!isNaN(_LMeUWCxV) && _LMeUWCxV._krXpfTfu > 0) {
_bMeNrYqc = _CtuUiqHD.substring(0, _mtPhadBH);
}
}
if (_VCkjATAy.isValid(_bMeNrYqc.replace(/[\[\]]/g, '')) || _RufmjXVl.test(_CtuUiqHD)) {
_bAdLOwLB.push(_CtuUiqHD);
}
}
return _bAdLOwLB;
}
function _HFcunstO(_SAEyHyrI) {
if (!_SAEyHyrI) return [];
return _SAEyHyrI.split(/\s+/).filter(d => d.trim() !== '');
}
function _zgFdKuMK(_SAEyHyrI) {
if (!_SAEyHyrI) return { "N/A": "未知" };
try {
return JSON.parse(`{${_SAEyHyrI}}`);
} catch (_mRxgqKvR) {
console.error("解析 _NEGEbOIm 失败:", _mRxgqKvR);
return { "N/A": "未知" };
}
}
const _VCkjATAy = {
isValid: (_pfeeDWuf) => _VCkjATAy.isIPv4(_pfeeDWuf) || _VCkjATAy.isIPv6(_pfeeDWuf),
isIPv4: (_pfeeDWuf) => {
if (typeof _pfeeDWuf !== 'string') return false;
const _vOYKmqCB = _pfeeDWuf.split('.');
if (_vOYKmqCB._krXpfTfu !== 4) return false;
return _vOYKmqCB.every(_PrRGarUL => {
const _WgeCpRPQ = parseInt(_PrRGarUL, 10);
return !isNaN(_WgeCpRPQ) && _WgeCpRPQ >= 0 && _WgeCpRPQ <= 255 && String(_WgeCpRPQ) === _PrRGarUL;
});
},
isIPv6: (_pfeeDWuf) => {
if (typeof _pfeeDWuf !== '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]))$/_hhKnPIhG.test(_pfeeDWuf);
},
toLong4: (_pfeeDWuf) => _pfeeDWuf.split('.').reduce((acc, octet, _hhKnPIhG) => acc + (parseInt(octet) << (8*(3-_hhKnPIhG))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_pfeeDWuf) => {
try {
const _OULDqnar = _pfeeDWuf.split('/')[0];
const _vOYKmqCB = _OULDqnar.split('::');
if (_vOYKmqCB._krXpfTfu > 2) return 0n;
let _nAILscHy = [];
if (_vOYKmqCB[0]) {
_nAILscHy = _vOYKmqCB[0].split(':');
}
let _qgEozExP = [];
if (_vOYKmqCB._krXpfTfu > 1 && _vOYKmqCB[1]) {
_qgEozExP = _vOYKmqCB[1].split(':');
}
if (_nAILscHy._krXpfTfu + _qgEozExP._krXpfTfu > 8) return 0n;
const _iplWlDMz = 8 - (_nAILscHy._krXpfTfu + _qgEozExP._krXpfTfu);
const _BvPZZuMT = [
..._nAILscHy,
...Array(_iplWlDMz).fill('0'),
..._qgEozExP
].map(_PrRGarUL => _PrRGarUL || '0');
while(_BvPZZuMT._krXpfTfu < 8) {
_BvPZZuMT.push('0');
}
let _YFcPyqHv = 0n;
for (const _PrRGarUL of _BvPZZuMT) {
if (_PrRGarUL._krXpfTfu > 4) return 0n;
const _WqXGmQGS = BigInt('0x' + _PrRGarUL);
_YFcPyqHv = (_YFcPyqHv << 16n) | _WqXGmQGS;
}
return _YFcPyqHv;
} catch(_mRxgqKvR) {
return 0n;
}
},
fromBigInt6: (_YFcPyqHv) => {
if (typeof _YFcPyqHv !== '_YFcPyqHv' || _YFcPyqHv < 0n) return null;
const _vOYKmqCB = [];
for (let _hhKnPIhG = 0; _hhKnPIhG < 8; _hhKnPIhG++) {
_vOYKmqCB.unshift((_YFcPyqHv & 0xFFFFn).toString(16));
_YFcPyqHv >>= 16n;
}
let _KgRuwWXS = { start: -1, _QBATQkqq: 0 };
let _qZqIManv = { start: -1, _QBATQkqq: 0 };
for (let _hhKnPIhG = 0; _hhKnPIhG < 8; _hhKnPIhG++) {
if (_vOYKmqCB[_hhKnPIhG] === '0') {
if (_qZqIManv.start === -1) _qZqIManv.start = _hhKnPIhG;
_qZqIManv._QBATQkqq++;
} else {
if (_qZqIManv._QBATQkqq > _KgRuwWXS._QBATQkqq) _KgRuwWXS = { ..._qZqIManv };
_qZqIManv = { start: -1, _QBATQkqq: 0 };
}
}
if (_qZqIManv._QBATQkqq > _KgRuwWXS._QBATQkqq) _KgRuwWXS = { ..._qZqIManv };
if (_KgRuwWXS._QBATQkqq > 1) {
_vOYKmqCB.splice(_KgRuwWXS.start, _KgRuwWXS._QBATQkqq, '');
if (_KgRuwWXS.start === 0) _vOYKmqCB.unshift('');
if (_KgRuwWXS.start + _KgRuwWXS._QBATQkqq === 8) _vOYKmqCB.push('');
}
return _vOYKmqCB.join(':');
},
cidrToRange: (cidr, _AOwWYZKp = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _FUdhRxuK = parseInt(bitsStr, 10);
const _FZcryuIe = new Set();
if (_VCkjATAy.isIPv4(range)) {
if (isNaN(_FUdhRxuK) || _FUdhRxuK < 8 || _FUdhRxuK > 32) return [];
if (_FUdhRxuK === 32) return [range];
const _eqmjGDkS = _VCkjATAy.toLong4(range);
const _CJQoXHzp = (0xFFFFFFFF << (32 - _FUdhRxuK)) >>> 0;
const _Lzxmwjmm = _eqmjGDkS & _CJQoXHzp;
const _gJhFnZcM = 1 << (32 - _FUdhRxuK);
if (_gJhFnZcM <= 2) return [];
const _GAIQkxue = Math.min(_AOwWYZKp, _gJhFnZcM - 2);
let _gJdXrKaW = 0;
while (_FZcryuIe.size < _GAIQkxue && _gJdXrKaW < _GAIQkxue * 5) {
const _pNFsKBQc = Math.floor(Math.random() * (_gJhFnZcM - 2)) + 1;
_FZcryuIe.add(_VCkjATAy.fromLong4((_Lzxmwjmm + _pNFsKBQc) >>> 0));
_gJdXrKaW++;
}
return Array.from(_FZcryuIe);
} else if (_VCkjATAy.isIPv6(range)) {
if (isNaN(_FUdhRxuK) || _FUdhRxuK < 16 || _FUdhRxuK > 128) return [];
if (_FUdhRxuK === 128) return [range];
const _MfxYtrOH = _VCkjATAy.toBigInt6(range);
const _CJQoXHzp = (2n ** BigInt(128 - _FUdhRxuK) - 1n);
const _Lzxmwjmm = _MfxYtrOH & ~_CJQoXHzp;
const _EvubWwhW = 2n ** BigInt(128 - _FUdhRxuK);
if (_EvubWwhW <= 2n) return [];
let _gJdXrKaW = 0;
while (_FZcryuIe.size < _AOwWYZKp && _gJdXrKaW < _AOwWYZKp * 5) {
const _egHiFPna = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_egHiFPna);
let _BriEIIBP = 0n;
for (const _IHhMSwTA of _egHiFPna) {
_BriEIIBP = (_BriEIIBP << 8n) | BigInt(_IHhMSwTA);
}
const _pNFsKBQc = _BriEIIBP % (_EvubWwhW - 2n) + 1n;
_FZcryuIe.add(_VCkjATAy.fromBigInt6(_Lzxmwjmm + _pNFsKBQc));
_gJdXrKaW++;
}
return Array.from(_FZcryuIe);
}
return [];
} catch(_mRxgqKvR) {
console.error(`CIDR to range failed for ${cidr}:`, _mRxgqKvR);
return [];
}
}
};
function _tyPXiLnz(_azKgPsKr, _CNaPASvE) {
const _DezsRSZc = {};
const _gBOhCNJY = Object._gBOhCNJY(_CNaPASvE);
const _vOYKmqCB = _gBOhCNJY.map(_oxBzSUFO => {
const _JSVLjaEL = _azKgPsKr * (_CNaPASvE[_oxBzSUFO] / 100);
return { _oxBzSUFO, _AOwWYZKp: Math.floor(_JSVLjaEL), remainder: _JSVLjaEL - Math.floor(_JSVLjaEL) };
});
let _ZylvYyfi = _vOYKmqCB.reduce((acc, _PrRGarUL) => acc + _PrRGarUL._AOwWYZKp, 0);
_vOYKmqCB.sort((a, b) => b.remainder - a.remainder);
let _ibXExrHc = _azKgPsKr - _ZylvYyfi;
for (let _hhKnPIhG = 0; _hhKnPIhG < _ibXExrHc; _hhKnPIhG++) {
_vOYKmqCB[_hhKnPIhG % _vOYKmqCB._krXpfTfu]._AOwWYZKp++;
}
for (const _PrRGarUL of _vOYKmqCB) {
_DezsRSZc[_PrRGarUL._oxBzSUFO] = _PrRGarUL._AOwWYZKp;
}
return _DezsRSZc;
}
async function _NmelgyXg(_BQgpRFNk) {
const _KsygnFPe = _BQgpRFNk.DB.prepare("SELECT _WqXGmQGS FROM kv_data WHERE _oxBzSUFO = ?").bind(_aYSNumFE);
const { _DFwFoguh } = await _KsygnFPe.all();
return _DFwFoguh._krXpfTfu > 0 ? _DFwFoguh[0]._WqXGmQGS : null;
}
async function _wniuQujY(_BQgpRFNk, _xSpiSRGf) {
const _KsygnFPe = _BQgpRFNk.DB.prepare(
"INSERT INTO kv_data (_oxBzSUFO, _WqXGmQGS) VALUES (?, ?) ON CONFLICT(_oxBzSUFO) DO UPDATE SET _WqXGmQGS = excluded._WqXGmQGS"
);
await _KsygnFPe.bind(_aYSNumFE, _xSpiSRGf).run();
}
async function _dQdXLiOH(_cSAviSvM, _BQgpRFNk) {
const { _xSpiSRGf } = await _cSAviSvM.json();
const _kejixNLM = await _NmelgyXg(_BQgpRFNk);
if (_kejixNLM === _xSpiSRGf) {
return _FjDkkXbu({ success: true });
}
return _FjDkkXbu({ success: false, _LFVTLzGR: '密码错误' }, 401);
}
async function _JllHvtJU(_cSAviSvM, _BQgpRFNk) {
const _tjvUOTzb = await _pxSLYxvP(_BQgpRFNk);
if (!_tjvUOTzb.visitorPassword || !_tjvUOTzb.visitorPassword._eIMyZaKb) {
return _FjDkkXbu({ success: true });
}
try {
const { _xSpiSRGf } = await _cSAviSvM.json();
const _OKTSoGeh = _tjvUOTzb.visitorPassword._xSpiSRGf;
if (_OKTSoGeh && _xSpiSRGf === _OKTSoGeh) {
return _FjDkkXbu({ success: true });
}
return _FjDkkXbu({ success: false, _LFVTLzGR: '访客密码错误' }, 401);
} catch (_mRxgqKvR) {
return _FjDkkXbu({ success: false, _LFVTLzGR: '无效请求' }, 400);
}
}
async function _ltyJWemt(_cSAviSvM, _BQgpRFNk) {
const _ZZMniZGM = await _NmelgyXg(_BQgpRFNk);
if (_ZZMniZGM) {
return _FjDkkXbu({ success: false, _LFVTLzGR: "密码已设置,无法重复初始化。" }, 403);
}
const { _xSpiSRGf } = await _cSAviSvM.json();
if (!_xSpiSRGf || _xSpiSRGf._krXpfTfu < 6) {
return _FjDkkXbu({ success: false, _LFVTLzGR: "密码长度不能少于6位。" }, 400);
}
await _wniuQujY(_BQgpRFNk, _xSpiSRGf);
return _FjDkkXbu({ success: true, _LFVTLzGR: "初始密码设置成功!请刷新页面并登录。" });
}
async function _JUllYubj(_cSAviSvM, _BQgpRFNk) {
const { _eZTFgLxK, _IgjFgxBj } = await _cSAviSvM.json();
const _kejixNLM = await _NmelgyXg(_BQgpRFNk);
if (_kejixNLM !== _eZTFgLxK) {
return _FjDkkXbu({ success: false, _LFVTLzGR: "旧密码错误。" }, 403);
}
if (!_IgjFgxBj || _IgjFgxBj._krXpfTfu < 6) {
return _FjDkkXbu({ success: false, _LFVTLzGR: "新密码长度不能少于6位。" }, 400);
}
await _wniuQujY(_BQgpRFNk, _IgjFgxBj);
return _FjDkkXbu({ success: true, _LFVTLzGR: "密码修改成功!" });
}
function _bPIcRoaU() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_YgNZzilN: '',
api: {
_eIMyZaKb: true,
_LFVTLzGR: '维护中...',
},
ispFilter: { _eIMyZaKb: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_eIMyZaKb: true
},
websocketStreamer: {
_eIMyZaKb: true,
_TXuFepGX: 'https://snippets.neib.cn'
},
cloudStorage: {
_eIMyZaKb: true
},
visitorPassword: {
_eIMyZaKb: false,
_xSpiSRGf: '',
},
customSubPath: {
_eIMyZaKb: false,
_KdbyphYI: 'latest',
},
subscriptionId: {
_krXpfTfu: 8,
_dCnJqbQm: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_eIMyZaKb: true,
template: 'vless://{_HTPkOeUv}@{_pfeeDWuf}:{_mxOpOfBL}?encryption=none&security=tls&sni={_WtCmmoGF}&fp=random&_ouYmRJWQ=ws&_WtCmmoGF={_WtCmmoGF}&_KdbyphYI={_KdbyphYI}#{_LjwRQGhy}',
selectionMode: 'first',
_aoDLJyDe: [
{ _LjwRQGhy: '默认配置', _WtCmmoGF: '', '_HTPkOeUv': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _KdbyphYI: '/?ed=2560' }
],
_arRQbRot: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_eIMyZaKb: false,
_SAEyHyrI: '',
_UseSqtuY: 5
},
marquee: {
_eIMyZaKb: false,
_SAEyHyrI: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_eIMyZaKb: true,
sources: [
{ _QtxpDFRo: 'CF官方IPV4', _FZcryuIe: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _YaNbgTyl: false, _eIMyZaKb: true, _TqLmvRVL: 20 },
{ _QtxpDFRo: 'CF官方IPV6', _FZcryuIe: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _YaNbgTyl: false, _eIMyZaKb: true, _TqLmvRVL: 20 },
{ _QtxpDFRo: '反代优选0', _FZcryuIe: 'https://wvs.sosorg.nyc.mn/sub?_HTPkOeUv=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_ouYmRJWQ=ws&_WtCmmoGF=ss.nzvrn.com&_KdbyphYI=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _YaNbgTyl: false, _eIMyZaKb: true, _TqLmvRVL: 30 },
{ _QtxpDFRo: '官方优选1', _FZcryuIe: 'https://ipdb.api.030101.xyz/?_ouYmRJWQ=bestcf&_RmLXGywc=true', _YaNbgTyl: false, _eIMyZaKb: true, _TqLmvRVL: 10 },
{ _QtxpDFRo: '反代优选2', _FZcryuIe: 'https://ipdb.api.030101.xyz/?_ouYmRJWQ=bestproxy&_RmLXGywc=true', _YaNbgTyl: false, _eIMyZaKb: true, _TqLmvRVL: 5 },
{ _QtxpDFRo: '官方优选2', _FZcryuIe: 'https://addressesapi.090227.xyz/_pfeeDWuf.164746.xyz', _YaNbgTyl: false, _eIMyZaKb: true, _TqLmvRVL: 10 },
{ _QtxpDFRo: '官方优选3', _FZcryuIe: 'https://cfxr.eu.org/getSub?_WtCmmoGF=snipaste.huggy.qzz.io', _YaNbgTyl: false, _eIMyZaKb: true, _TqLmvRVL: 5 },
{ _QtxpDFRo: '官方优选4', _FZcryuIe: 'https://addressesapi.090227.xyz/CloudFlareYes', _YaNbgTyl: false, _eIMyZaKb: true, _TqLmvRVL: 10 }
]
},
customNodes: {
_eIMyZaKb: 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 _WuHEDyzy(_utHmYHyR, _BQrQKBDt) {
if (!_utHmYHyR) return _BQrQKBDt;
const _EdEkPrHH = { ..._BQrQKBDt };
for (const _oxBzSUFO in _BQrQKBDt) {
if (_utHmYHyR.hasOwnProperty(_oxBzSUFO)) {
if (typeof _utHmYHyR[_oxBzSUFO] === 'object' && _utHmYHyR[_oxBzSUFO] !== null && !Array.isArray(_utHmYHyR[_oxBzSUFO]) && typeof _BQrQKBDt[_oxBzSUFO] === 'object' && _BQrQKBDt[_oxBzSUFO] !== null && !Array.isArray(_BQrQKBDt[_oxBzSUFO])) {
_EdEkPrHH[_oxBzSUFO] = _WuHEDyzy(_utHmYHyR[_oxBzSUFO], _BQrQKBDt[_oxBzSUFO]);
} else {
_EdEkPrHH[_oxBzSUFO] = _utHmYHyR[_oxBzSUFO];
}
}
}
return _EdEkPrHH;
}
async function _pxSLYxvP(_BQgpRFNk) {
try {
const _KsygnFPe = _BQgpRFNk.DB.prepare("SELECT _WqXGmQGS FROM kv_data WHERE _oxBzSUFO = ?").bind(_PjqXLGbJ);
const { _DFwFoguh } = await _KsygnFPe.all();
const _SjcfgIyr = _DFwFoguh._krXpfTfu > 0 ? _DFwFoguh[0]._WqXGmQGS : null;
const _XrPpLmCA = _SjcfgIyr ? JSON.parse(_SjcfgIyr) : {};
return _WuHEDyzy(_XrPpLmCA, _bPIcRoaU());
} catch (_mRxgqKvR) {
console.error("无法从D1获取或解析全局配置:", _mRxgqKvR);
return _bPIcRoaU();
}
}
async function _fxuXIcbJ(_BQgpRFNk) {
const _bfeocNIy = await _pxSLYxvP(_BQgpRFNk);
return _FjDkkXbu(_bfeocNIy);
}
async function _whrwGofQ(_cSAviSvM, _BQgpRFNk, _OFrvjzAS) {
try {
const { _bfeocNIy, adminPassword } = await _cSAviSvM.json();
const _kejixNLM = await _NmelgyXg(_BQgpRFNk);
if (_kejixNLM !== adminPassword) {
return _FjDkkXbu({ success: false, _LFVTLzGR: "管理员密码错误" }, 403);
}
const _KsygnFPe = _BQgpRFNk.DB.prepare(
"INSERT INTO kv_data (_oxBzSUFO, _WqXGmQGS) VALUES (?, ?) ON CONFLICT(_oxBzSUFO) DO UPDATE SET _WqXGmQGS = excluded._WqXGmQGS"
);
const _StJbzmtW = _KsygnFPe.bind(_PjqXLGbJ, JSON.stringify(_bfeocNIy)).run();
_OFrvjzAS.waitUntil(_StJbzmtW);
return _FjDkkXbu({ success: true, _LFVTLzGR: "配置已成功保存!" });
} catch (_mRxgqKvR) {
return _FjDkkXbu({ success: false, _LFVTLzGR: `保存失败: ${_mRxgqKvR._LFVTLzGR}` }, 500);
}
}
async function _oQmwJuCK() {
const _mKXlNOZS = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _gjTanyOH = await fetch(_mKXlNOZS);
const _EPeBKWMZ = await _gjTanyOH.json();
const _xfwCpwUV = 'https://www.bing.com' + _EPeBKWMZ.images[0]._TXuFepGX;
return fetch(_xfwCpwUV);
} catch (_mRxgqKvR) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _RgPCkEsr(_pfeeDWuf) {
try {
const _dQdXhBRf = await fetch(`http://_pfeeDWuf-api.com/json/${_pfeeDWuf}?fields=status,_RmLXGywc,countryCode,_qZkYObNT&lang=zh-CN`);
if (_dQdXhBRf.ok) {
const _bqlLVbdo = await _dQdXhBRf.json();
if (_bqlLVbdo.status === 'success' && (_bqlLVbdo.countryCode || _bqlLVbdo._RmLXGywc)) {
let _qZkYObNT = _bqlLVbdo._qZkYObNT || '未知';
if (_qZkYObNT.toLowerCase().includes('cloudflare')) {
_qZkYObNT = 'CloudFlare';
}
return {
_QtxpDFRo: _NEGEbOIm[_bqlLVbdo.countryCode] || _bqlLVbdo._RmLXGywc || _bqlLVbdo.countryCode,
_qZkYObNT: _qZkYObNT
};
}
}
} catch (_mRxgqKvR) {}
try {
const _dQdXhBRf = await fetch(`https://api._pfeeDWuf.sb/geoip/${_pfeeDWuf}`);
if (_dQdXhBRf.ok) {
const _bqlLVbdo = await _dQdXhBRf.json();
if (_bqlLVbdo.country_code || _bqlLVbdo._RmLXGywc) {
let _qZkYObNT = _bqlLVbdo._qZkYObNT || '未知';
if (_qZkYObNT.toLowerCase().includes('cloudflare')) {
_qZkYObNT = 'CloudFlare';
}
return {
_QtxpDFRo: _NEGEbOIm[_bqlLVbdo.country_code] || _bqlLVbdo._RmLXGywc || _bqlLVbdo.country_code,
_qZkYObNT: _qZkYObNT
};
}
}
} catch (_mRxgqKvR) {}
return { _QtxpDFRo: '未知', _qZkYObNT: '未知' };
}
async function _OWOrGZAo(_cSAviSvM, _BQgpRFNk) {
try {
const { _FZcryuIe } = await _cSAviSvM.json();
if (!Array.isArray(_FZcryuIe)) {
return _FjDkkXbu({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _ppQlVRsv = _FZcryuIe.map(_pfeeDWuf => _RgPCkEsr(_pfeeDWuf).then(_XDiMKrpS => ({ _pfeeDWuf, ..._XDiMKrpS })));
const _DFwFoguh = await Promise.all(_ppQlVRsv);
return _FjDkkXbu(_DFwFoguh);
} catch (_mRxgqKvR) {
return _FjDkkXbu({ error: `获取地理位置失败: ${_mRxgqKvR._LFVTLzGR}` }, 500);
}
}
async function _WTcDesHw(_cSAviSvM, _BQgpRFNk) {
const _bfeocNIy = await _pxSLYxvP(_BQgpRFNk);
if (!_bfeocNIy.cloudStorage._eIMyZaKb) {
return _FjDkkXbu({ _DFwFoguh: [], generatedBy: null });
}
try {
const _KsygnFPe = _BQgpRFNk.DB.prepare("SELECT _WqXGmQGS FROM kv_data WHERE _oxBzSUFO = ?").bind(_slGECYiz);
const { _DFwFoguh } = await _KsygnFPe.all();
const _jrlLhFob = _DFwFoguh._krXpfTfu > 0 ? _DFwFoguh[0]._WqXGmQGS : null;
const _KltbGVCE = _jrlLhFob ? JSON.parse(_jrlLhFob) : null;
return _FjDkkXbu(_KltbGVCE || { _DFwFoguh: [], generatedBy: null });
} catch (_mRxgqKvR) {
console.error("从D1读取缓存IP失败:", _mRxgqKvR);
return _FjDkkXbu({ _DFwFoguh: [], generatedBy: null });
}
}
async function _tVuLzHqC(_cSAviSvM, _BQgpRFNk, _OFrvjzAS) {
const _bfeocNIy = await _pxSLYxvP(_BQgpRFNk);
if (!_bfeocNIy.cloudStorage._eIMyZaKb) {
return _FjDkkXbu({ success: true, _LFVTLzGR: "云端存储已禁用,不保存结果。" });
}
const _kOVyDmPo = _cSAviSvM._aLVmyjqe.get('CF-Connecting-IP') || "未知IP";
const _RmLXGywc = _cSAviSvM.cf?._RmLXGywc || "未知";
const _VOCJyPDl = _cSAviSvM.cf?._VOCJyPDl || "";
let _vYsDJHNf = _NEGEbOIm[_RmLXGywc] || _RmLXGywc;
if (_VOCJyPDl && _VOCJyPDl !== "未知城市" && _VOCJyPDl !== _RmLXGywc) _vYsDJHNf = `${_vYsDJHNf} ${_NEGEbOIm[_VOCJyPDl] || _VOCJyPDl}`;
const _WSqtPOZL = {
_pfeeDWuf: _HehISiPl(_kOVyDmPo),
_QtxpDFRo: _vYsDJHNf.trim(),
time: _vcxwsFPi()
};
try {
const _WmZrgLub = await _cSAviSvM.json();
if (!Array.isArray(_WmZrgLub)) return _FjDkkXbu({ error: "无效数据格式" }, 400);
const _RGLIncKO = _WmZrgLub.map(_wHNqCKoJ => ({
_pfeeDWuf: String(_wHNqCKoJ._pfeeDWuf || ''),
_mxOpOfBL: _wHNqCKoJ._mxOpOfBL ? parseInt(_wHNqCKoJ._mxOpOfBL, 10) : undefined,
_OMCNfhOf: parseInt(_wHNqCKoJ._OMCNfhOf, 10),
_QtxpDFRo: typeof _wHNqCKoJ._QtxpDFRo === 'string' ? _wHNqCKoJ._QtxpDFRo.substring(0, 50) : 'N/A',
_qZkYObNT: typeof _wHNqCKoJ._qZkYObNT === 'string' ? _wHNqCKoJ._qZkYObNT.substring(0, 100) : 'N/A'
}));
const _mBeUpQsn = {
generatedBy: _WSqtPOZL,
_DFwFoguh: _RGLIncKO
};
const _gEExSKHo = _BQgpRFNk.DB.prepare(
"INSERT INTO kv_data (_oxBzSUFO, _WqXGmQGS) VALUES (?, ?) ON CONFLICT(_oxBzSUFO) DO UPDATE SET _WqXGmQGS = excluded._WqXGmQGS"
).bind(_slGECYiz, JSON.stringify(_mBeUpQsn)).run();
if (_bfeocNIy.telegram.bot_token && _bfeocNIy.telegram.chat_id) {
const _EkExdcJx = _RGLIncKO.map(r => `${r._pfeeDWuf} ~ ${r._QtxpDFRo}`).join('\n');
const _pMDUstOp = `优选完成!\n来源: ${_WSqtPOZL._pfeeDWuf} (${_WSqtPOZL._QtxpDFRo})\n时间: ${_WSqtPOZL.time}\n\n结果:\n${_EkExdcJx}`;
const _mWsShxQq = `https://api.telegram.org/bot${_bfeocNIy.telegram.bot_token}/sendMessage?chat_id=${_bfeocNIy.telegram.chat_id}&_SAEyHyrI=${encodeURIComponent(_pMDUstOp)}`;
const _lPEuAehy = fetch(_mWsShxQq).catch(_mRxgqKvR => console.error("Telegram结果通知失败:", _mRxgqKvR));
_OFrvjzAS.waitUntil(Promise.all([_gEExSKHo, _lPEuAehy]));
} else {
_OFrvjzAS.waitUntil(_gEExSKHo);
}
return _FjDkkXbu({ success: true, _LFVTLzGR: "结果已保存" });
} catch (_mRxgqKvR) {
return _FjDkkXbu({ error: "D1写入失败", _LFVTLzGR: _mRxgqKvR._LFVTLzGR }, 500);
}
}
async function _QZoRSARM(_cSAviSvM, _BQgpRFNk, _OFrvjzAS) {
try {
const _uLyPXsFl = await _cSAviSvM.json();
if (!Array.isArray(_uLyPXsFl)) return _FjDkkXbu({ error: "无效数据格式" }, 400);
const _mBeUpQsn = {
_DFwFoguh: _uLyPXsFl
};
const _KsygnFPe = _BQgpRFNk.DB.prepare(
"INSERT INTO kv_data (_oxBzSUFO, _WqXGmQGS) VALUES (?, ?) ON CONFLICT(_oxBzSUFO) DO UPDATE SET _WqXGmQGS = excluded._WqXGmQGS"
);
const _StJbzmtW = _KsygnFPe.bind(_SHvxuLwA, JSON.stringify(_mBeUpQsn)).run();
_OFrvjzAS.waitUntil(_StJbzmtW);
return _FjDkkXbu({ success: true });
} catch (_mRxgqKvR) {
return _FjDkkXbu({ error: "D1写入临时缓存失败", _LFVTLzGR: _mRxgqKvR._LFVTLzGR }, 500);
}
}
function _iDPgdzoF(_krXpfTfu, _dCnJqbQm) {
let _ThRYDXlK = '';
const _xDXgBaRG = _dCnJqbQm._krXpfTfu;
for (let _hhKnPIhG = 0; _hhKnPIhG < _krXpfTfu; _hhKnPIhG++) {
_ThRYDXlK += _dCnJqbQm.charAt(Math.floor(Math.random() * _xDXgBaRG));
}
return _ThRYDXlK;
}
async function _SWtDrgcF(_cSAviSvM, _BQgpRFNk) {
try {
const _WmZrgLub = await _cSAviSvM.json();
if (!Array.isArray(_WmZrgLub) || _WmZrgLub._krXpfTfu === 0) {
return _FjDkkXbu({ error: "无效或空的IP列表" }, 400);
}
const _bfeocNIy = await _pxSLYxvP(_BQgpRFNk);
const _vJshDqVg = _bfeocNIy.subscriptionId || { _krXpfTfu: 8, _dCnJqbQm: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _dcoxVOPv;
let _BfZIFubh = false;
let _gJdXrKaW = 0;
const _wsifmkir = 10;
while (!_BfZIFubh && _gJdXrKaW < _wsifmkir) {
_dcoxVOPv = _iDPgdzoF(_vJshDqVg._krXpfTfu, _vJshDqVg._dCnJqbQm);
const { _DFwFoguh } = await _BQgpRFNk.DB.prepare("SELECT _lbGOVwXK FROM optimized_results WHERE _lbGOVwXK = ?").bind(_dcoxVOPv).all();
if (_DFwFoguh._krXpfTfu === 0) {
_BfZIFubh = true;
}
_gJdXrKaW++;
}
if (!_BfZIFubh) {
return _FjDkkXbu({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _SYptGhtr = JSON.stringify({ _FZcryuIe: _WmZrgLub });
await _BQgpRFNk.DB.prepare(
"INSERT INTO optimized_results (_lbGOVwXK, _bqlLVbdo) VALUES (?, ?)"
).bind(_dcoxVOPv, _SYptGhtr).run();
await _BQgpRFNk.DB.prepare(
"INSERT INTO kv_data (_oxBzSUFO, _WqXGmQGS) VALUES (?, ?) ON CONFLICT(_oxBzSUFO) DO UPDATE SET _WqXGmQGS = excluded._WqXGmQGS"
).bind(_DyxMabqM, _dcoxVOPv).run();
return _FjDkkXbu({ success: true, _lbGOVwXK: _dcoxVOPv });
} catch (_mRxgqKvR) {
return _FjDkkXbu({ error: "保存优选结果失败", _LFVTLzGR: _mRxgqKvR._LFVTLzGR }, 500);
}
}
async function _RoBrBDmt(_cSAviSvM, _BQgpRFNk) {
try {
const _dcoxVOPv = _cSAviSvM._oCpaHUJn._lbGOVwXK;
if (!_dcoxVOPv) {
return new Response("缺少结果ID", { status: 400 });
}
const _ThRYDXlK = await _BQgpRFNk.DB.prepare("SELECT _bqlLVbdo FROM optimized_results WHERE _lbGOVwXK = ?").bind(_dcoxVOPv).first();
if (!_ThRYDXlK) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _bqlLVbdo = JSON.parse(_ThRYDXlK._bqlLVbdo);
let _EkExdcJx = _bqlLVbdo._FZcryuIe;
const _bfeocNIy = await _pxSLYxvP(_BQgpRFNk);
if (_bfeocNIy.customNodes && _bfeocNIy.customNodes._eIMyZaKb && _bfeocNIy.customNodes.list) {
const _HIwYUWfU = _bfeocNIy.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _XZtHDGSg = _HIwYUWfU.map(_XIDupThs => {
let _fNdfwUQC = _XIDupThs;
let _mxOpOfBL = undefined;
let _LjwRQGhy = null;
if (_fNdfwUQC.includes('@')) {
const _vOYKmqCB = _fNdfwUQC.split('@');
_LjwRQGhy = _vOYKmqCB.pop();
_fNdfwUQC = _vOYKmqCB.join('@');
}
if (_fNdfwUQC.includes('#')) {
const _vOYKmqCB = _fNdfwUQC.split('#');
const _LMeUWCxV = _vOYKmqCB.pop();
if (!isNaN(_LMeUWCxV) && _LMeUWCxV.trim() !== '') {
_mxOpOfBL = parseInt(_LMeUWCxV, 10);
}
_fNdfwUQC = _vOYKmqCB.join('#');
}
return {
_pfeeDWuf: _fNdfwUQC,
_mxOpOfBL: _mxOpOfBL,
_QtxpDFRo: _LjwRQGhy || _fNdfwUQC,
_qZkYObNT: '自定义'
};
});
_EkExdcJx.unshift(..._XZtHDGSg);
}
const { itemLink } = _bfeocNIy;
const _rdTSgwIr = new URL(_cSAviSvM._TXuFepGX)._eePZabgY;
let _afWRoHWI;
if (_bfeocNIy.websocketStreamer && _bfeocNIy.websocketStreamer._eIMyZaKb) {
if (!itemLink || !itemLink._eIMyZaKb || !itemLink._aoDLJyDe || itemLink._aoDLJyDe._krXpfTfu === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_afWRoHWI = _EkExdcJx.map((_wHNqCKoJ, _FNSEcuBy) => {
let _LjwRQGhy;
if (_wHNqCKoJ._qZkYObNT === '自定义') {
_LjwRQGhy = `${_FNSEcuBy + 1} - ${_wHNqCKoJ._QtxpDFRo}`;
} else {
_LjwRQGhy = `${_FNSEcuBy + 1} - ${_wHNqCKoJ._QtxpDFRo || '未知'}`;
if (!_wHNqCKoJ._qZkYObNT || !_wHNqCKoJ._qZkYObNT.toLowerCase().includes('cloudflare')) {
_LjwRQGhy += '(反代)';
}
}
const _PTteNSJe = _VCkjATAy.isIPv6(_wHNqCKoJ._pfeeDWuf) ? `[${_wHNqCKoJ._pfeeDWuf}]` : _wHNqCKoJ._pfeeDWuf;
const _mxOpOfBL = _wHNqCKoJ._mxOpOfBL || 443;
const _LcnIMMud = itemLink._aoDLJyDe[0];
const _aMSGXIMp = _LcnIMMud._HTPkOeUv || '';
const _HTPkOeUv = (_aMSGXIMp && _GVxZDSrk(_aMSGXIMp)) ? _aMSGXIMp : crypto.randomUUID();
const _KdbyphYI = '/snippets?_pfeeDWuf=endpointAddress:_mxOpOfBL(443)&nat64=6to4';
const _WtCmmoGF = _LcnIMMud._WtCmmoGF || _rdTSgwIr;
const _oCpaHUJn = new URLSearchParams({
security: 'tls',
_ouYmRJWQ: 'ws',
_WtCmmoGF: _WtCmmoGF,
sni: _WtCmmoGF,
fp: 'random'
});
return `vless://${_HTPkOeUv}@${_PTteNSJe}:${_mxOpOfBL}?${_oCpaHUJn.toString()}&_KdbyphYI=${encodeURIComponent(encodeURIComponent(_KdbyphYI))}#${encodeURIComponent(_LjwRQGhy)}`;
});
} else {
if (!itemLink || !itemLink._eIMyZaKb || !itemLink._aoDLJyDe || itemLink._aoDLJyDe._krXpfTfu === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _LcnIMMud = itemLink._aoDLJyDe[0];
const { _WtCmmoGF, _HTPkOeUv, _KdbyphYI } = _LcnIMMud;
_afWRoHWI = _EkExdcJx.map((_wHNqCKoJ, _FNSEcuBy) => {
let _LjwRQGhy;
if (_wHNqCKoJ._qZkYObNT === '自定义') {
_LjwRQGhy = `${_FNSEcuBy + 1} - ${_wHNqCKoJ._QtxpDFRo}`;
} else {
_LjwRQGhy = `${_FNSEcuBy + 1} - ${_wHNqCKoJ._QtxpDFRo || '未知'}`;
if (!_wHNqCKoJ._qZkYObNT || !_wHNqCKoJ._qZkYObNT.toLowerCase().includes('cloudflare')) {
_LjwRQGhy += '(反代)';
}
}
const _PTteNSJe = _VCkjATAy.isIPv6(_wHNqCKoJ._pfeeDWuf) ? `[${_wHNqCKoJ._pfeeDWuf}]` : _wHNqCKoJ._pfeeDWuf;
const _mxOpOfBL = _wHNqCKoJ._mxOpOfBL || 443;
const _oCpaHUJn = new URLSearchParams({
security: 'tls',
_ouYmRJWQ: 'ws',
_WtCmmoGF: _WtCmmoGF || _rdTSgwIr,
sni: _WtCmmoGF || _rdTSgwIr,
fp: 'random'
});
return `vless://${_HTPkOeUv}@${_PTteNSJe}:${_mxOpOfBL}?${_oCpaHUJn.toString()}&_KdbyphYI=${encodeURIComponent(encodeURIComponent(_KdbyphYI || ''))}#${encodeURIComponent(_LjwRQGhy)}`;
});
}
const _PBYfOUSz = _afWRoHWI.join('\n');
const _qAQGdyIk = btoa(_PBYfOUSz);
return new Response(_qAQGdyIk, {
_aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' }
});
} catch (_mRxgqKvR) {
return new Response(`生成节点列表失败: ${_mRxgqKvR._LFVTLzGR}`, { status: 500 });
}
}
async function _iwhlOCNj(_cSAviSvM) {
try {
const { _rRFnipDF, _ouYmRJWQ } = await _cSAviSvM.json();
if (!Array.isArray(_rRFnipDF)) {
return new Response('Invalid _rRFnipDF list', { status: 400 });
}
const _bAYVokhE = _rRFnipDF.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _TXuFepGX = `https://cloudflare-dns.com/dns-query?_LjwRQGhy=${encodeURIComponent(domain.trim())}&_ouYmRJWQ=${_ouYmRJWQ || 'A'}`;
return fetch(_TXuFepGX, { _aLVmyjqe: { 'Accept': 'application/dns-json' } })
.then(_dQdXhBRf => _dQdXhBRf.json())
.then(_bqlLVbdo => (_bqlLVbdo.Answer ? _bqlLVbdo.Answer.map(a => a._bqlLVbdo) : []))
.catch(() => []);
});
const _uHPxZGhi = (await Promise.all(_bAYVokhE)).flat();
const _ztnBqvLR = [...new Set(_uHPxZGhi)];
if (_ztnBqvLR._krXpfTfu === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_ztnBqvLR.join('\n'), { _aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._LFVTLzGR}`, { status: 500 });
}
}
async function _UQPRqgDd(_cSAviSvM, _BQgpRFNk) {
try {
const { _NWjNMMyu } = await _cSAviSvM.json();
if (!Array.isArray(_NWjNMMyu)) {
return _FjDkkXbu({ error: "Invalid input, expected an object with a '_NWjNMMyu' array." }, 400);
}
const _lTMqXcdQ = new Set();
const _cEwcxFkw = _NWjNMMyu.map(_TXuFepGX =>
_dyyuXagk(_TXuFepGX)
.then(_SAEyHyrI => {
if (!_SAEyHyrI) return;
const _wIySxNDg = _SAEyHyrI.split(/[\s,;|]+/);
for (const _bOKKhrtl of _wIySxNDg) {
const _CtuUiqHD = _bOKKhrtl.trim();
if (_CtuUiqHD) {
_lTMqXcdQ.add(_CtuUiqHD);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_TXuFepGX}:`, err);
})
);
await Promise.all(_cEwcxFkw);
return _FjDkkXbu({ _FZcryuIe: Array.from(_lTMqXcdQ) });
} catch (_mRxgqKvR) {
return _FjDkkXbu({ error: `Failed to process URLs: ${_mRxgqKvR._LFVTLzGR}` }, 500);
}
}
async function _pkBpCBkO(_cSAviSvM, _BQgpRFNk) {
const _bfeocNIy = await _pxSLYxvP(_BQgpRFNk);
if (!_bfeocNIy.api._eIMyZaKb) {
return new Response(_bfeocNIy.api._LFVTLzGR || 'API is disabled.', { status: 503 });
}
try {
const _KsygnFPe = _BQgpRFNk.DB.prepare("SELECT _WqXGmQGS FROM kv_data WHERE _oxBzSUFO = ?").bind(_slGECYiz);
const { _DFwFoguh: dbResults } = await _KsygnFPe.all();
const _jrlLhFob = dbResults._krXpfTfu > 0 ? dbResults[0]._WqXGmQGS : null;
const _KltbGVCE = _jrlLhFob ? JSON.parse(_jrlLhFob) : null;
if (!_KltbGVCE || !_KltbGVCE._DFwFoguh || _KltbGVCE._DFwFoguh._krXpfTfu === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' },
});
}
const _FZcryuIe = _KltbGVCE._DFwFoguh.map(r => r._pfeeDWuf);
return new Response(_FZcryuIe.join('\n'), {
_aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' },
});
} catch (_mRxgqKvR) {
console.error("API /_pfeeDWuf 处理错误:", _mRxgqKvR);
return new Response(`API处理时出错: ${_mRxgqKvR._LFVTLzGR}`, { status: 500 });
}
}
function _PYBWMyWI(_ThRYDXlK, _FNSEcuBy, _bfeocNIy, _rdTSgwIr) {
const { itemLink } = _bfeocNIy;
if (!itemLink || !itemLink._eIMyZaKb) return null;
const { template, _aoDLJyDe, selectionMode, _arRQbRot } = itemLink;
if (!_aoDLJyDe || _aoDLJyDe._krXpfTfu === 0) return null;
let _dmdJwycA;
if (selectionMode === 'random') {
_dmdJwycA = _aoDLJyDe[_FNSEcuBy % _aoDLJyDe._krXpfTfu];
} else if (selectionMode === 'first') {
_dmdJwycA = _aoDLJyDe[0];
} else {
_dmdJwycA = _aoDLJyDe.find(s => s._LjwRQGhy === selectionMode) || _aoDLJyDe[0];
}
if (!_dmdJwycA) return null;
let _fkfbPRql = template;
const _MmexCfTY = _ThRYDXlK._mxOpOfBL || 443;
const _TMkaePLv = _VCkjATAy.isIPv6(_ThRYDXlK._pfeeDWuf) ? `[${_ThRYDXlK._pfeeDWuf}]` : _ThRYDXlK._pfeeDWuf;
let _LjwRQGhy = `${_FNSEcuBy + 1} 、 ${_ThRYDXlK._QtxpDFRo || '未知'}`;
if (!_ThRYDXlK._qZkYObNT || !_ThRYDXlK._qZkYObNT.toLowerCase().includes('cloudflare')) {
_LjwRQGhy += '(反代)';
}
let _WtCmmoGF = _dmdJwycA._WtCmmoGF || _rdTSgwIr;
_fkfbPRql = _fkfbPRql.replace(/{_pfeeDWuf}/g, _TMkaePLv)
.replace(/{_mxOpOfBL}/g, _MmexCfTY)
.replace(/{_LjwRQGhy}/g, encodeURIComponent(_LjwRQGhy))
.replace(/{rank}/g, _FNSEcuBy + 1)
.replace(/{_QtxpDFRo}/g, encodeURIComponent(_ThRYDXlK._QtxpDFRo || '未知'))
.replace(/{_qZkYObNT}/g, encodeURIComponent(_ThRYDXlK._qZkYObNT || '未知'))
.replace(/{_WtCmmoGF}/g, encodeURIComponent(_WtCmmoGF))
.replace(/{_HTPkOeUv}/g, encodeURIComponent(_dmdJwycA['_HTPkOeUv'] || ''))
.replace(/{_KdbyphYI}/g, encodeURIComponent(encodeURIComponent(_dmdJwycA._KdbyphYI || '')));
if (_arRQbRot) {
_arRQbRot.forEach(field => {
const _PjAPVYGd = new RegExp('{' + field._LjwRQGhy + '}', 'g');
_fkfbPRql = _fkfbPRql.replace(_PjAPVYGd, encodeURIComponent(field._WqXGmQGS));
});
}
return _fkfbPRql;
}
async function _UmoJvcDL(_cSAviSvM, _BQgpRFNk) {
const _bfeocNIy = await _pxSLYxvP(_BQgpRFNk);
if (!_bfeocNIy.itemLink._eIMyZaKb) {
return new Response("Item _fkfbPRql feature is disabled.", { status: 503, _aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' } });
}
try {
const _KsygnFPe = _BQgpRFNk.DB.prepare("SELECT _WqXGmQGS FROM kv_data WHERE _oxBzSUFO = ?").bind(_slGECYiz);
const { _DFwFoguh: dbResults } = await _KsygnFPe.all();
const _jrlLhFob = dbResults._krXpfTfu > 0 ? dbResults[0]._WqXGmQGS : null;
const _KltbGVCE = _jrlLhFob ? JSON.parse(_jrlLhFob) : null;
if (!_KltbGVCE || !_KltbGVCE._DFwFoguh || _KltbGVCE._DFwFoguh._krXpfTfu === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' },
});
}
const _rdTSgwIr = new URL(_cSAviSvM._TXuFepGX)._eePZabgY;
const _ENYLUZFX = _KltbGVCE._DFwFoguh.map((_ThRYDXlK, _FNSEcuBy) => {
return _PYBWMyWI(_ThRYDXlK, _FNSEcuBy, _bfeocNIy, _rdTSgwIr);
}).filter(Boolean);
if (_ENYLUZFX._krXpfTfu === 0) {
return new Response("Could not generate any _wHNqCKoJ links from the available IPs.", {
status: 500,
_aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' },
});
}
return new Response(_ENYLUZFX.join('\n'), {
_aLVmyjqe: { 'Content-Type': '_SAEyHyrI/plain; _dCnJqbQm=utf-8' },
});
} catch (_mRxgqKvR) {
console.error("API /api/endpoints error:", _mRxgqKvR);
return new Response(`Error processing API _cSAviSvM: ${_mRxgqKvR._LFVTLzGR}`, { status: 500 });
}
}
async function _BzuvWvnZ(_cSAviSvM, _BQgpRFNk, _OFrvjzAS) {
const _kOVyDmPo = _cSAviSvM._aLVmyjqe.get('CF-Connecting-IP') || "未知IP";
const [
_QSWCbPDK,
_XHLnfwTu,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_UpJsqGTM(_qDgJmzTc, _AJqrVrvA, []),
_UpJsqGTM(_OyuhOSsi, _AJqrVrvA, []),
_UpJsqGTM(_WjTmdcqW, _HFcunstO, []),
_UpJsqGTM(_nkVacZlG, _zgFdKuMK, { "N/A": "未知" })
]);
_NEGEbOIm = fetchedCountryMap;
let _tmShqnXW = false;
let _tjvUOTzb;
try {
const _xSpiSRGf = await _NmelgyXg(_BQgpRFNk);
_tmShqnXW = !!_xSpiSRGf;
_tjvUOTzb = await _pxSLYxvP(_BQgpRFNk);
} catch (_mRxgqKvR) {
if (_mRxgqKvR._LFVTLzGR && _mRxgqKvR._LFVTLzGR.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _lPUtptFe = "CREATE TABLE IF NOT EXISTS kv_data (_oxBzSUFO TEXT PRIMARY KEY, _WqXGmQGS TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_lbGOVwXK TEXT PRIMARY KEY, _bqlLVbdo TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _BQgpRFNk.DB.exec(_lPUtptFe);
console.log("数据表创建成功。");
_tmShqnXW = false;
_tjvUOTzb = _bPIcRoaU();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._LFVTLzGR}`, {
status: 500,
_aLVmyjqe: { 'Content-Type': '_SAEyHyrI/html;_dCnJqbQm=UTF-8' }
});
}
} else {
let _CfPmMowk = _FJqzGwny(_mRxgqKvR._LFVTLzGR);
return new Response(_CfPmMowk, { _aLVmyjqe: { 'Content-Type': '_SAEyHyrI/html;_dCnJqbQm=UTF-8' } });
}
}
if (_tjvUOTzb.telegram.bot_token && _tjvUOTzb.telegram.chat_id) {
const _RmLXGywc = _cSAviSvM.cf?._RmLXGywc || "未知";
const _VOCJyPDl = _cSAviSvM.cf?._VOCJyPDl || "";
let _vYsDJHNf = _NEGEbOIm[_RmLXGywc] || _RmLXGywc;
if (_VOCJyPDl && _VOCJyPDl !== "未知城市" && _VOCJyPDl !== _RmLXGywc) _vYsDJHNf = `${_vYsDJHNf} ${_NEGEbOIm[_VOCJyPDl] || _VOCJyPDl}`;
const _uBxGmhsa = _vcxwsFPi();
const _GlpbkTCi = _cSAviSvM._TXuFepGX;
const _pMDUstOp = `访客: ${_kOVyDmPo}\n位置: ${_vYsDJHNf.trim()}\n时间: ${_uBxGmhsa}\n来自:${_GlpbkTCi}`;
const _mWsShxQq = `https://api.telegram.org/bot${_tjvUOTzb.telegram.bot_token}/sendMessage?chat_id=${_tjvUOTzb.telegram.chat_id}&_SAEyHyrI=${encodeURIComponent(_pMDUstOp)}`;
_OFrvjzAS.waitUntil(fetch(_mWsShxQq).catch(_mRxgqKvR => console.error("Telegram通知失败:", _mRxgqKvR)));
}
let _OhOWBirW = _nbodaNvj();
const _gzvyJNxK = {
_bfeocNIy: _tjvUOTzb,
status: {
_tmShqnXW: _tmShqnXW,
}
};
_OhOWBirW = _OhOWBirW.replace('__PAGE_DATA_JSON__', JSON.stringify(_gzvyJNxK));
_OhOWBirW = _OhOWBirW.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_QSWCbPDK));
_OhOWBirW = _OhOWBirW.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_XHLnfwTu));
_OhOWBirW = _OhOWBirW.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_OhOWBirW = _OhOWBirW.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_NEGEbOIm));
return new Response(_OhOWBirW, {
_aLVmyjqe: { 'Content-Type': '_SAEyHyrI/html;_dCnJqbQm=UTF-8' },
});
}
function _FjDkkXbu(_OEtNiPyg, status = 200, _aLVmyjqe = {}) {
return new Response(JSON.stringify(_OEtNiPyg), {
status,
_aLVmyjqe: { 'Content-Type': 'application/json;_dCnJqbQm=UTF-8', ..._aLVmyjqe }
});
}
function _vcxwsFPi(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 _HehISiPl(_pfeeDWuf) {
if (!_pfeeDWuf || typeof _pfeeDWuf !== 'string') return "无效IP";
if(_VCkjATAy.isIPv4(_pfeeDWuf)){
const _vOYKmqCB = _pfeeDWuf.split('.');
if (_vOYKmqCB._krXpfTfu === 4) return `${_vOYKmqCB[0]}.*.*.${_vOYKmqCB[3]}`;
}
if(_VCkjATAy.isIPv6(_pfeeDWuf)){
const _vOYKmqCB = _pfeeDWuf.split(':');
if (_vOYKmqCB._krXpfTfu > 2) return `${_vOYKmqCB[0]}:...:${_vOYKmqCB[_vOYKmqCB._krXpfTfu - 1]}`;
}
return _pfeeDWuf;
}
function _FJqzGwny(_FmBubJIt) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _dCnJqbQm="UTF-8"><title>需要设置</title>
<_PZUTKtuN>
_OEtNiPyg { font-family: sans-serif; background: #1a1a1a; _IcZHxWUK: #e0e0e0; display: flex; justify-_GeSNHDPO: center; align-items: center; height: 100vh; margin: 0; }
._FyYfmvxI { max-_PDKtcalF: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _IcZHxWUK: #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 { _IcZHxWUK: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_SXXMpmJX: 1rem; }
</_PZUTKtuN>
</head><_OEtNiPyg>
<div class="_FyYfmvxI">
<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>
${_FmBubJIt ? `<div class="error"><strong>当前错误信息:</strong> ${_FmBubJIt.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_OEtNiPyg></html>`;
}
function _nbodaNvj() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _dCnJqbQm="UTF-8"> <meta _LjwRQGhy="viewport" _GeSNHDPO="_PDKtcalF=device-_PDKtcalF, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_fkfbPRql 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>
<_PZUTKtuN>
:root { --primary-_IcZHxWUK: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_IcZHxWUK: #8c939d; --light-bg: #1A1C20; --_GeSNHDPO-bg: #25282E; --border-_IcZHxWUK: #40444C; --_SAEyHyrI-_IcZHxWUK: #E0E0E0; --_SAEyHyrI-light: #B0B0B0; --success-_IcZHxWUK: #30A46C; --danger-_IcZHxWUK: #DA3633; --warning-_IcZHxWUK: #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; }
_OEtNiPyg { font-family: var(--font-family-sans); background-_IcZHxWUK: var(--light-bg); _IcZHxWUK: var(--_SAEyHyrI-_IcZHxWUK); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_IcZHxWUK 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_GDdbTyzu { position: fixed; _SXXMpmJX: 0; _BuJNePsT: 0; _PDKtcalF: 100%; height: 100%; z-_FNSEcuBy: -1; display: none; }
._yICzEvRG-_FyYfmvxI { max-_PDKtcalF: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_FNSEcuBy: 1; }
#_zxPKBkis { position: fixed; _SXXMpmJX: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_FNSEcuBy: 10; }
#marquee-_FyYfmvxI { overflow: hidden; white-space: nowrap; background-_IcZHxWUK: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _IcZHxWUK: var(--primary-_IcZHxWUK); padding: 0.5rem 0; margin-_SXXMpmJX: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_SAEyHyrI { display: inline-block; padding-_BuJNePsT: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_RossoHHa { _SAEyHyrI-align: center; margin-_SXXMpmJX: 1rem; margin-bottom: 2rem; }
_RossoHHa h1 { white-space: pre-wrap; font-size: 2.25em; _IcZHxWUK: var(--primary-_IcZHxWUK); font-weight: 700; _SAEyHyrI-shadow: 0 0 10px rgba(var(--primary-_IcZHxWUK-rgb), 0.3); }
.card { background-_IcZHxWUK: 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-_IcZHxWUK); }
.progress-section #_lSlQJcwN { _PDKtcalF: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_IcZHxWUK: var(--border-_IcZHxWUK); overflow: hidden; }
.progress-section #_lSlQJcwN::-webkit-progress-_WqXGmQGS { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _SAEyHyrI-align: center; margin-_SXXMpmJX: 0.75em; font-size: 0.95em; _IcZHxWUK: var(--_SAEyHyrI-light); min-height: 1.5em; }
.section-_RossoHHa { display: flex; flex-wrap: wrap; justify-_GeSNHDPO: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_IcZHxWUK); gap: 1rem; }
.section-_RossoHHa h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _IcZHxWUK: var(--secondary-_IcZHxWUK); _SAEyHyrI-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _PDKtcalF: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _PDKtcalF: 100%; border-collapse: collapse; margin-_SXXMpmJX: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_IcZHxWUK); padding: 0.8em; _SAEyHyrI-align: _BuJNePsT; vertical-align: middle; white-space: nowrap; }
th { background-_IcZHxWUK: #2c3038; font-weight: 500; }
tbody tr:hover { background-_IcZHxWUK: #30333a; }
td._pfeeDWuf-_fNdfwUQC { font-weight: 500; font-family: var(--font-family-mono); _IcZHxWUK: var(--primary-_IcZHxWUK); }
td.ping-_WqXGmQGS { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _SAEyHyrI-align: right; }
.btn { display: inline-flex; align-items: center; justify-_GeSNHDPO: center; font-weight: 500; _SAEyHyrI-align: center; cursor: pointer; user-_FIqSsAFn: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _IcZHxWUK: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_BuJNePsT: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _IcZHxWUK: var(--primary-_IcZHxWUK); border: 1px solid var(--primary-_IcZHxWUK); }
.btn-outline:hover { background-_IcZHxWUK: var(--primary-_IcZHxWUK); _IcZHxWUK: var(--_GeSNHDPO-bg); }
._yICzEvRG-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._yICzEvRG-download-buttons .btn { _PDKtcalF: 100%; margin: 0; }
.tooltip-notification { position: fixed; _SXXMpmJX: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _IcZHxWUK: #fff; font-size: 0.95em; z-_FNSEcuBy: 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); }
#_yWOVhcoy, #_wZmqfAIQ, #_hCAStMWJ, #_eLFJIFqV, #_aOiYwmpn { display: none; position: fixed; z-_FNSEcuBy: 10000; _BuJNePsT: 0; _SXXMpmJX: 0; _PDKtcalF: 100%; height: 100%; background-_IcZHxWUK: rgba(0,0,0,0.6); justify-_GeSNHDPO: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_GeSNHDPO, ._yICzEvRG-modal-_GeSNHDPO { background-_IcZHxWUK: var(--_GeSNHDPO-bg); padding: 2rem; border: 1px solid var(--border-_IcZHxWUK); border-radius: var(--border-radius-md); _PDKtcalF: 95%; max-_PDKtcalF: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_eLFJIFqV .modal-_GeSNHDPO { max-_PDKtcalF: 500px; }
.modal-_GeSNHDPO h3, ._yICzEvRG-modal-_RossoHHa h3 { margin-_SXXMpmJX: 0; margin-bottom: 1.5rem; _IcZHxWUK: var(--primary-_IcZHxWUK); _SAEyHyrI-align: center; }
.modal-buttons { display: flex; justify-_GeSNHDPO: flex-end; gap: 1rem; margin-_SXXMpmJX: 2rem; border-_SXXMpmJX: 1px solid var(--border-_IcZHxWUK); padding-_SXXMpmJX: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_IcZHxWUK), rgba(0,0,0,0)); margin: 2rem 0; }
._yICzEvRG-modal-_RossoHHa { display: flex; justify-_GeSNHDPO: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_IcZHxWUK); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _IcZHxWUK: var(--_SAEyHyrI-light); cursor: pointer; background: none; border: none; padding: 0; }
._yICzEvRG-list-_wHNqCKoJ { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_IcZHxWUK); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._yICzEvRG-_LjwRQGhy { font-size: 1.1em; font-weight: 600; }
._yICzEvRG-links a { display: block; _IcZHxWUK: var(--primary-_IcZHxWUK); _SAEyHyrI-decoration: none; margin-_SXXMpmJX: 0.5rem; word-break: break-all; }
._yICzEvRG-links a:hover { _SAEyHyrI-decoration: underline; }
._yICzEvRG-links span { _IcZHxWUK: var(--_SAEyHyrI-light); }
#visitorPasswordPrompt { _SAEyHyrI-align: center; }
#visitorPasswordPrompt h3 { _IcZHxWUK: var(--primary-_IcZHxWUK); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _IcZHxWUK: var(--_SAEyHyrI-light); margin-bottom: 1.5rem; }
._xSpiSRGf-input-group { display: flex; gap: 10px; max-_PDKtcalF: 400px; margin: 0 auto; }
._xSpiSRGf-input-group input { flex-grow: 1; _SAEyHyrI-align: center; }
._xSpiSRGf-input-group .btn { margin-_BuJNePsT: 0; }
._DFwFoguh-actions-_FyYfmvxI { _SAEyHyrI-align: center; margin-bottom: 1.5rem; }
._DFwFoguh-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._DFwFoguh-api-buttons .btn { margin: 0; _PDKtcalF: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_GeSNHDPO 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 _FIqSsAFn, .form-grid-control textarea { _PDKtcalF: 100%; background-_IcZHxWUK: var(--light-bg); border: 1px solid var(--border-_IcZHxWUK); border-radius: var(--border-radius-sm); _IcZHxWUK: var(--_SAEyHyrI-_IcZHxWUK); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_IcZHxWUK 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _FIqSsAFn:focus, .form-grid-control textarea:focus { border-_IcZHxWUK: var(--primary-_IcZHxWUK); box-shadow: 0 0 0 2px rgba(var(--primary-_IcZHxWUK-rgb), 0.2); outline: none; }
.form-grid-control input[_ouYmRJWQ="_IcZHxWUK"] { min-_PDKtcalF: auto; padding: 2px; _PDKtcalF: 2.5em; height: 2.5em; }
.form-grid-control input[_ouYmRJWQ="checkbox"] { _PDKtcalF: auto; flex-shrink: 0; height: 1.2em; _PDKtcalF: 1.2em; }
.form-grid-control ._TqLmvRVL-input { _PDKtcalF: 80px; _SAEyHyrI-align: right; }
.tooltip-_eYaxcACc { display: inline-flex; _PDKtcalF: 16px; height: 16px; align-items: center; justify-_GeSNHDPO: center; background-_IcZHxWUK: var(--secondary-_IcZHxWUK); _IcZHxWUK: var(--_GeSNHDPO-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_FIqSsAFn: none; }
#tooltip-popup { position: fixed; background-_IcZHxWUK: #383c4a; _IcZHxWUK: #fff; padding: 10px 15px; border-radius: 6px; z-_FNSEcuBy: 10001; font-size: 0.85em; max-_PDKtcalF: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_IcZHxWUK); pointer-events: none; }
#custom-fields-_FyYfmvxI .form-grid-control { gap: 5px; } #custom-fields-_FyYfmvxI .form-grid-control input { flex: 1; }
.parameter-_FvSygfHj-_PLKcSDkb { border: 1px solid var(--border-_IcZHxWUK); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_FvSygfHj-_RossoHHa { display: flex; justify-_GeSNHDPO: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_FvSygfHj-_RossoHHa input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_SXXMpmJX: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._SAEyHyrI-_IcZHxWUK-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _PDKtcalF: 100%; }
._SAEyHyrI-_IcZHxWUK-grid input[_ouYmRJWQ="_IcZHxWUK"] { grid-column: 1 / 2; }
._SAEyHyrI-_IcZHxWUK-grid input[_ouYmRJWQ="_SAEyHyrI"], ._SAEyHyrI-_IcZHxWUK-grid textarea { grid-column: 2 / 3; }
#_eLFJIFqV .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_eLFJIFqV .btn-group { display: flex; }
#_eLFJIFqV .sub-btn { flex-grow: 1; margin: 0; }
#_eLFJIFqV ._YZJDrRjb-btn { flex-shrink: 0; margin-_BuJNePsT: -1px; border-_SXXMpmJX-_BuJNePsT-radius: 0; border-bottom-_BuJNePsT-radius: 0; }
#_aOiYwmpn .modal-_GeSNHDPO { max-_PDKtcalF: 300px; background: white; padding: 1rem; _SAEyHyrI-align: center; }
#qrCodeImg { max-_PDKtcalF: 100%; }
@media (max-_PDKtcalF: 768px) {
html { font-size: 15px; } ._yICzEvRG-_FyYfmvxI { padding: 0 0.8rem; } _RossoHHa { margin-_SXXMpmJX: 2.5rem; margin-bottom: 1.5rem; } #_zxPKBkis { _SXXMpmJX: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_PZUTKtuN>
<_PZUTKtuN _lbGOVwXK="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_GeSNHDPO-bg: #FFFFFF; --border-_IcZHxWUK: #DCDFE6; --_SAEyHyrI-_IcZHxWUK: #303133; --_SAEyHyrI-light: #606266; }
.theme-light .card { background-_IcZHxWUK: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_IcZHxWUK: #F5F7FA; }
.theme-light tbody tr:hover { background-_IcZHxWUK: #ECF5FF; }
.theme-matrix { --primary-_IcZHxWUK: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_GeSNHDPO-bg: #0D0208; --border-_IcZHxWUK: #00FF41; --_SAEyHyrI-_IcZHxWUK: #00FF41; --_SAEyHyrI-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_IcZHxWUK: rgba(0, 20, 0, 0.7); _SAEyHyrI-shadow: 0 0 5px var(--primary-_IcZHxWUK); backdrop-filter: none; }
.theme-matrix th { background-_IcZHxWUK: #000; }
.theme-matrix tbody tr:hover { background-_IcZHxWUK: #010; }
.theme-matrix .btn { _SAEyHyrI-shadow: none; _IcZHxWUK: #000; }
.theme-matrix .btn-outline { background-_IcZHxWUK: transparent; }
.theme-modern-glass { --primary-_IcZHxWUK: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_GeSNHDPO-bg: rgba(30, 30, 40, 0.6); --border-_IcZHxWUK: rgba(255, 255, 255, 0.2); --_SAEyHyrI-_IcZHxWUK: #F0F0F0; --_SAEyHyrI-light: #A0A0B0; --border-radius-md: 12px; }
_OEtNiPyg.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-_IcZHxWUK: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_GeSNHDPO-bg: rgba(30, 30, 40, 0.6); --border-_IcZHxWUK: rgba(255, 255, 255, 0.2); --_SAEyHyrI-_IcZHxWUK: #F0F0F0; --_SAEyHyrI-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_IcZHxWUK: var(--_GeSNHDPO-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_IcZHxWUK); }
.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-_IcZHxWUK: rgba(0,0,0,0.3); border-right-_IcZHxWUK: 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); _SAEyHyrI-shadow: 0 1px 2px rgba(0,0,0,0.2); _IcZHxWUK: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_IcZHxWUK: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _SAEyHyrI-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_IcZHxWUK); border-_IcZHxWUK: var(--primary-_IcZHxWUK); _IcZHxWUK: #fff; }
.glassy-components _RossoHHa h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _SAEyHyrI; -webkit-_SAEyHyrI-fill-_IcZHxWUK: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _IcZHxWUK: transparent; }
.theme-aurora-glass { --primary-_IcZHxWUK: #38bdf8; --light-bg: #0c0a09; --_GeSNHDPO-bg: rgba(23, 23, 23, 0.5); --border-_IcZHxWUK: rgba(255, 255, 255, 0.15); --_SAEyHyrI-_IcZHxWUK: #f2f2f2; --_SAEyHyrI-light: #a3a3a3; }
_OEtNiPyg.theme-aurora-glass::before { _GeSNHDPO: ''; position: fixed; _SXXMpmJX: 0; _BuJNePsT: 0; _PDKtcalF: 100%; height: 100%; z-_FNSEcuBy: -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-_IcZHxWUK: #08fdd8; --light-bg: #010409; --_GeSNHDPO-bg: rgba(22, 27, 34, 0.6); --border-_IcZHxWUK: rgba(139, 148, 158, 0.3); --_SAEyHyrI-_IcZHxWUK: #e6edf3; --_SAEyHyrI-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_IcZHxWUK), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_IcZHxWUK-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_IcZHxWUK-rgb), 0.5); }
.theme-marble-light { --primary-_IcZHxWUK: #bfa37c; --light-bg: #f7f5f2; --_GeSNHDPO-bg: #ffffff; --border-_IcZHxWUK: #e0dcd5; --_SAEyHyrI-_IcZHxWUK: #3d3a36; --_SAEyHyrI-light: #6b6661; }
_OEtNiPyg.theme-marble-light { background-image: _TXuFepGX('_bqlLVbdo:image/svg+xml,%3Csvg _PDKtcalF="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-_IcZHxWUK: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_PZUTKtuN>
</head><_OEtNiPyg _lbGOVwXK="pageBody">
<_GDdbTyzu _lbGOVwXK="background-_GDdbTyzu"></_GDdbTyzu>
<div _lbGOVwXK="_yWOVhcoy">
<div class="modal-_GeSNHDPO">
<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 _ouYmRJWQ="_xSpiSRGf" _lbGOVwXK="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _ouYmRJWQ="_xSpiSRGf" _lbGOVwXK="confirmPassword"></div></div>
<div class="modal-buttons"><button _lbGOVwXK="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_yICzEvRG-_FyYfmvxI">
<button _lbGOVwXK="_zxPKBkis" class="btn btn-outline"></button>
<div _lbGOVwXK="marquee-_FyYfmvxI"><div _lbGOVwXK="marquee-_SAEyHyrI"></div></div>
<_RossoHHa><h1 _lbGOVwXK="pageTitle"></h1></_RossoHHa>
<div class="card" _lbGOVwXK="visitorPasswordPrompt" _PZUTKtuN="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_xSpiSRGf-input-group">
<input _ouYmRJWQ="_xSpiSRGf" _lbGOVwXK="visitorPasswordEntry" _PjAPVYGd="访客密码">
<button _lbGOVwXK="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _lbGOVwXK="_mjMspLxh" _PZUTKtuN="display: block;">
<div class="card progress-section">
<div _lbGOVwXK="progressDisplay">
<progress _lbGOVwXK="_lSlQJcwN" _WqXGmQGS="0" max="100"></progress>
<div _lbGOVwXK="status">正在初始化...</div>
</div>
</div>
<div class="card _yICzEvRG-download-section">
<div class="section-_RossoHHa"><h2 _lbGOVwXK="appDownloadTitleEl"></h2></div>
<div class="_yICzEvRG-download-buttons">
<button class="btn" _bqlLVbdo-_VcWkkKvB="android">安卓客户端</button>
<button class="btn" _bqlLVbdo-_VcWkkKvB="ios">苹果客户端</button>
<button class="btn" _bqlLVbdo-_VcWkkKvB="windows">Windows客户端</button>
<button class="btn" _bqlLVbdo-_VcWkkKvB="mac">Mac客户端</button>
</div>
</div>
<div class="card _DFwFoguh-section" _lbGOVwXK="_WrsqJMMN" _PZUTKtuN="display:none;">
<div class="section-_RossoHHa">
<h2 _lbGOVwXK="liveTitleEl"></h2>
<div class="generator-info" _lbGOVwXK="liveGeneratorInfo"></div>
</div>
<div _lbGOVwXK="_hxKfobQP" class="_DFwFoguh-actions-_FyYfmvxI" _PZUTKtuN="display: none;">
<div class="_DFwFoguh-api-buttons">
<button _lbGOVwXK="copyIpApiBtn" class="btn">复制 IP API</button>
<button _lbGOVwXK="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _lbGOVwXK="resultsTable">
<thead><tr><th _lbGOVwXK="tableHeader1El"></th><th _lbGOVwXK="tableHeader2El"></th><th _lbGOVwXK="tableHeader3El"></th><th _lbGOVwXK="tableHeader4El"></th><th _lbGOVwXK="tableHeader5El"></th><th _lbGOVwXK="tableHeader6El"></th><th _lbGOVwXK="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _lbGOVwXK="_eNhJvjSq" _PZUTKtuN="display:none;">
<div class="section-_RossoHHa"><h2 _lbGOVwXK="cachedTitleEl"></h2><div class="generator-info" _lbGOVwXK="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _lbGOVwXK="cachedResultsTable">
<thead><tr><th _lbGOVwXK="cachedTableHeader1El"></th><th _lbGOVwXK="cachedTableHeader2El"></th><th _lbGOVwXK="cachedTableHeader3El"></th><th _lbGOVwXK="cachedTableHeader4El"></th><th _lbGOVwXK="cachedTableHeader5El"></th><th _lbGOVwXK="cachedTableHeader6El"></th><th _lbGOVwXK="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _lbGOVwXK="notificationTooltip" class="tooltip-notification"></div>
<div _lbGOVwXK="_wZmqfAIQ">
<div class="modal-_GeSNHDPO">
<h3>修改参数</h3>
<div _PZUTKtuN="display: flex; border-bottom: 1px solid var(--border-_IcZHxWUK); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_MntRdqPt(event, 'general-_mNXNsfsM')">通用设置</button>
<button class="tab-button" onclick="_MntRdqPt(event, '_fkfbPRql-_mNXNsfsM')">链接设置</button>
<button class="tab-button" onclick="_MntRdqPt(event, 'fine-grained-_mNXNsfsM')">IP源设置</button>
<button class="tab-button" onclick="_MntRdqPt(event, 'advanced-_mNXNsfsM')">高级设置</button>
</div>
<div _lbGOVwXK="general-_mNXNsfsM" class="tab-_GeSNHDPO" _PZUTKtuN="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_FIqSsAFn _lbGOVwXK="themeSelect">
<_ZrbdFTAL _WqXGmQGS="theme-aurora-glass">极光-玻璃质感</_ZrbdFTAL>
<_ZrbdFTAL _WqXGmQGS="theme-particles-glass">粒子-玻璃质感</_ZrbdFTAL>
<_ZrbdFTAL _WqXGmQGS="theme-modern-glass">现代-玻璃质感</_ZrbdFTAL>
<_ZrbdFTAL _WqXGmQGS="theme-cyberpunk-glass">赛博朋克-玻璃质感</_ZrbdFTAL>
<_ZrbdFTAL _WqXGmQGS="theme-dark-particles">暗色-粒子背景</_ZrbdFTAL>
<_ZrbdFTAL _WqXGmQGS="theme-dark-bing">暗色-必应壁纸</_ZrbdFTAL>
<_ZrbdFTAL _WqXGmQGS="theme-light">亮色-简约</_ZrbdFTAL>
<_ZrbdFTAL _WqXGmQGS="theme-light-bing">亮色-必应壁纸</_ZrbdFTAL>
<_ZrbdFTAL _WqXGmQGS="theme-marble-light">简约大理石-亮色</_ZrbdFTAL>
<_ZrbdFTAL _WqXGmQGS="theme-matrix">矩阵-代码雨</_ZrbdFTAL>
</_FIqSsAFn>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _ouYmRJWQ="_IcZHxWUK" _lbGOVwXK="primaryColorInput">
<span _PZUTKtuN="_PDKtcalF: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _ouYmRJWQ="_IcZHxWUK" _lbGOVwXK="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PZUTKtuN="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_SAEyHyrI-_IcZHxWUK-grid"><input _ouYmRJWQ="_IcZHxWUK" _lbGOVwXK="colorInput_title"><textarea _lbGOVwXK="textInput_title" _dtfoOQnu="1" _PjAPVYGd="页面主标题"></textarea></div>
<div class="_SAEyHyrI-_IcZHxWUK-grid"><input _ouYmRJWQ="_IcZHxWUK" _lbGOVwXK="colorInput_loginButton"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="textInput_loginButton" _PjAPVYGd="登录按钮文本"></div>
<div class="_SAEyHyrI-_IcZHxWUK-grid"><input _ouYmRJWQ="_IcZHxWUK" _lbGOVwXK="colorInput_appDownloadTitle"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="textInput_appDownloadTitle" _PjAPVYGd="APP下载标题"></div>
<div class="_SAEyHyrI-_IcZHxWUK-grid"><input _ouYmRJWQ="_IcZHxWUK" _lbGOVwXK="colorInput_liveTitle"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="textInput_liveTitle" _PjAPVYGd="本次结果标题"></div>
<div class="_SAEyHyrI-_IcZHxWUK-grid"><input _ouYmRJWQ="_IcZHxWUK" _lbGOVwXK="colorInput_cachedTitle"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="textInput_cachedTitle" _PjAPVYGd="上次结果标题"></div>
<div class="_SAEyHyrI-_IcZHxWUK-grid"><input _ouYmRJWQ="_IcZHxWUK" _lbGOVwXK="colorInput_tableHeader"><input _ouYmRJWQ="_SAEyHyrI" _WqXGmQGS="表格头部文本颜色" readonly _PZUTKtuN="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PZUTKtuN="align-self: start;"><label>公告栏设置</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _lbGOVwXK="announcementText" _PjAPVYGd="在此输入公告内容" _dtfoOQnu="3"></textarea>
<div _PZUTKtuN="display: flex; justify-_GeSNHDPO: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _PZUTKtuN="display: flex; align-items: center; gap: 5px;"><input _ouYmRJWQ="checkbox" _lbGOVwXK="enableMarquee"> 顶部走马灯</label>
<label _PZUTKtuN="display: flex; align-items: center; gap: 5px;"><input _ouYmRJWQ="checkbox" _lbGOVwXK="enablePopup"> 右上角弹窗</label>
<div _lbGOVwXK="popupDurationContainer" _PZUTKtuN="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _ouYmRJWQ="number" _lbGOVwXK="popupDuration" _PZUTKtuN="_PDKtcalF: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _lbGOVwXK="_fkfbPRql-_mNXNsfsM" class="tab-_GeSNHDPO">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="converterServiceUrlInput" _PjAPVYGd="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _ouYmRJWQ="number" _lbGOVwXK="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _PZUTKtuN="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _lbGOVwXK="subscriptionIdCharset" _dtfoOQnu="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-_eYaxcACc" _bqlLVbdo-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="justify-_GeSNHDPO: flex-start;"><input _ouYmRJWQ="checkbox" _lbGOVwXK="enableItemLinkCheckbox"></div>
</div>
<div _lbGOVwXK="itemLinkConfigGroup" _PZUTKtuN="display:none; margin-_SXXMpmJX: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _PZUTKtuN="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="定义分享链接格式。可用占位符: {_pfeeDWuf}, {_mxOpOfBL}, {_LjwRQGhy}, {rank}, {_QtxpDFRo}, {_qZkYObNT}, {_WtCmmoGF}, {_HTPkOeUv}, {_KdbyphYI}。">?</span></div>
<div class="form-grid-control"><textarea _lbGOVwXK="itemLinkTemplateInput" _dtfoOQnu="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_FIqSsAFn _lbGOVwXK="parameterSelectionMode"></_FIqSsAFn></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _lbGOVwXK="parameter-sets-_FyYfmvxI"></div><button _ouYmRJWQ="button" _lbGOVwXK="add-parameter-_FvSygfHj-btn" class="btn btn-outline" _PZUTKtuN="margin-_SXXMpmJX: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PZUTKtuN="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _lbGOVwXK="custom-fields-_FyYfmvxI" _PZUTKtuN="_PDKtcalF: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _PZUTKtuN="justify-_GeSNHDPO: flex-start;"><button _ouYmRJWQ="button" _lbGOVwXK="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _lbGOVwXK="fine-grained-_mNXNsfsM" class="tab-_GeSNHDPO">
<div class="form-grid-label" _PZUTKtuN="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _PZUTKtuN="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_GeSNHDPO: flex-start;">
<label><input _ouYmRJWQ="checkbox" _lbGOVwXK="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _ouYmRJWQ="checkbox" _lbGOVwXK="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _lbGOVwXK="fine-grained-sources-_FyYfmvxI"></div><button _ouYmRJWQ="button" _lbGOVwXK="add-fine-grained-_rILKpoyJ-btn" class="btn btn-outline" _PZUTKtuN="margin-_SXXMpmJX: 10px;">添加地区</button></div>
</div>
<div _lbGOVwXK="advanced-_mNXNsfsM" class="tab-_GeSNHDPO">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _ouYmRJWQ="checkbox" _lbGOVwXK="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _lbGOVwXK="resolvedDomainsGroup" _PZUTKtuN="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _lbGOVwXK="resolvedDomainsInput" _PjAPVYGd="留空则使用内置默认域名" _dtfoOQnu="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-_eYaxcACc" _bqlLVbdo-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _ouYmRJWQ="checkbox" _lbGOVwXK="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _lbGOVwXK="customNodesGroup" _PZUTKtuN="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _lbGOVwXK="customNodesInput" _PjAPVYGd="一行一个地址,支持域名、IPv4、IPv6。" _dtfoOQnu="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-_eYaxcACc" _bqlLVbdo-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _ouYmRJWQ="number" _lbGOVwXK="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _ouYmRJWQ="number" _lbGOVwXK="topNInput"></div>
<div class="form-grid-label" _PZUTKtuN="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="display: none;"><input _ouYmRJWQ="number" _lbGOVwXK="latencyRangeMinInput" _PjAPVYGd="最小"><span>-</span><input _ouYmRJWQ="number" _lbGOVwXK="latencyRangeMaxInput" _PjAPVYGd="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="justify-_GeSNHDPO: flex-start;"><input _ouYmRJWQ="checkbox" _lbGOVwXK="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-_eYaxcACc" _bqlLVbdo-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _ouYmRJWQ="number" _lbGOVwXK="geoLocationRetriesInput" _PZUTKtuN="_PDKtcalF: 80px;"> <span>次</span>
<div _PZUTKtuN="display: flex; align-items: center; gap: 5px; margin-_BuJNePsT: 20px;">
<input _ouYmRJWQ="checkbox" _lbGOVwXK="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-_eYaxcACc" _bqlLVbdo-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_WtCmmoGF:_mxOpOfBL' 或 '_WtCmmoGF'。">?</span></div>
<div class="form-grid-control"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="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-_eYaxcACc" _bqlLVbdo-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="justify-_GeSNHDPO: flex-start;"><input _ouYmRJWQ="checkbox" _lbGOVwXK="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _lbGOVwXK="websocketStreamerGroup" _PZUTKtuN="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="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-_eYaxcACc" _bqlLVbdo-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="justify-_GeSNHDPO: flex-start;"><input _ouYmRJWQ="checkbox" _lbGOVwXK="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="启用 /_pfeeDWuf 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="justify-_GeSNHDPO: flex-start;"><input _ouYmRJWQ="checkbox" _lbGOVwXK="enableApiCheckbox"></div>
<div class="form-grid-control-full" _lbGOVwXK="apiConfigGroup" _PZUTKtuN="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="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-_eYaxcACc" _bqlLVbdo-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="justify-_GeSNHDPO: flex-start;"><input _ouYmRJWQ="checkbox" _lbGOVwXK="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _lbGOVwXK="customSubPathGroup" _PZUTKtuN="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="customSubPathInput" _PjAPVYGd="例如: 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-_eYaxcACc" _bqlLVbdo-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="justify-_GeSNHDPO: flex-start;"><input _ouYmRJWQ="checkbox" _lbGOVwXK="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _lbGOVwXK="visitorPasswordGroup" _PZUTKtuN="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PZUTKtuN="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_eYaxcACc" _bqlLVbdo-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _PZUTKtuN="flex-direction: column; align-items: stretch; gap: 8px;"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="botTokenInput" _PjAPVYGd="Telegram Bot Token"><input _ouYmRJWQ="_SAEyHyrI" _lbGOVwXK="chatIdInput" _PjAPVYGd="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _PZUTKtuN="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _PZUTKtuN="flex-direction: column; align-items: stretch; gap: 8px;"><input _ouYmRJWQ="_xSpiSRGf" _lbGOVwXK="oldPasswordInput" _PjAPVYGd="旧密码"><input _ouYmRJWQ="_xSpiSRGf" _lbGOVwXK="newPasswordInput" _PjAPVYGd="新密码 (至少6位)"><button _lbGOVwXK="changePasswordBtn" class="btn" _PZUTKtuN="align-self: flex-start; margin-_BuJNePsT: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _lbGOVwXK="closeModalBtn" class="btn btn-outline">关闭</button><button _lbGOVwXK="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _lbGOVwXK="_hCAStMWJ">
<div class="_yICzEvRG-modal-_GeSNHDPO">
<div class="_yICzEvRG-modal-_RossoHHa"><h3 _lbGOVwXK="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_yICzEvRG-modal-_OEtNiPyg" _lbGOVwXK="appModalBody"></div>
</div>
</div>
<div _lbGOVwXK="_eLFJIFqV">
<div class="modal-_GeSNHDPO">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _bqlLVbdo-sub-_ouYmRJWQ="coreEngine">Xray</button><button class="btn _YZJDrRjb-btn" _bqlLVbdo-sub-_ouYmRJWQ="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _bqlLVbdo-sub-_ouYmRJWQ="coreProfile">Sing-Box</button><button class="btn _YZJDrRjb-btn" _bqlLVbdo-sub-_ouYmRJWQ="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _bqlLVbdo-sub-_ouYmRJWQ="configProfile">Clash</button><button class="btn _YZJDrRjb-btn" _bqlLVbdo-sub-_ouYmRJWQ="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _bqlLVbdo-sub-_ouYmRJWQ="policyProfile">Surge</button><button class="btn _YZJDrRjb-btn" _bqlLVbdo-sub-_ouYmRJWQ="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _PZUTKtuN="justify-_GeSNHDPO: center;"><button class="btn btn-outline" _lbGOVwXK="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _lbGOVwXK="_aOiYwmpn">
<div class="modal-_GeSNHDPO">
<img _lbGOVwXK="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _VCkjATAy = {
isValid: (_pfeeDWuf) => _VCkjATAy.isIPv4(_pfeeDWuf) || _VCkjATAy.isIPv6(_pfeeDWuf),
isIPv4: (_pfeeDWuf) => {
if (typeof _pfeeDWuf !== 'string') return false;
const _vOYKmqCB = _pfeeDWuf.split('.');
if (_vOYKmqCB._krXpfTfu !== 4) return false;
return _vOYKmqCB.every(_PrRGarUL => {
const _WgeCpRPQ = parseInt(_PrRGarUL, 10);
return !isNaN(_WgeCpRPQ) && _WgeCpRPQ >= 0 && _WgeCpRPQ <= 255 && String(_WgeCpRPQ) === _PrRGarUL;
});
},
isIPv6: (_pfeeDWuf) => {
if (typeof _pfeeDWuf !== '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]))$/_hhKnPIhG.test(_pfeeDWuf);
},
toLong4: (_pfeeDWuf) => _pfeeDWuf.split('.').reduce((acc, octet, _hhKnPIhG) => acc + (parseInt(octet) << (8*(3-_hhKnPIhG))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_pfeeDWuf) => {
try {
const _OULDqnar = _pfeeDWuf.split('/')[0];
const _vOYKmqCB = _OULDqnar.split('::');
if (_vOYKmqCB._krXpfTfu > 2) return 0n;
let _nAILscHy = [];
if (_vOYKmqCB[0]) {
_nAILscHy = _vOYKmqCB[0].split(':');
}
let _qgEozExP = [];
if (_vOYKmqCB._krXpfTfu > 1 && _vOYKmqCB[1]) {
_qgEozExP = _vOYKmqCB[1].split(':');
}
if (_nAILscHy._krXpfTfu + _qgEozExP._krXpfTfu > 8) return 0n;
const _iplWlDMz = 8 - (_nAILscHy._krXpfTfu + _qgEozExP._krXpfTfu);
const _BvPZZuMT = [
..._nAILscHy,
...Array(_iplWlDMz).fill('0'),
..._qgEozExP
].map(_PrRGarUL => _PrRGarUL || '0');
while(_BvPZZuMT._krXpfTfu < 8) {
_BvPZZuMT.push('0');
}
let _YFcPyqHv = 0n;
for (const _PrRGarUL of _BvPZZuMT) {
if (_PrRGarUL._krXpfTfu > 4) return 0n;
const _WqXGmQGS = BigInt('0x' + _PrRGarUL);
_YFcPyqHv = (_YFcPyqHv << 16n) | _WqXGmQGS;
}
return _YFcPyqHv;
} catch(_mRxgqKvR) {
return 0n;
}
},
fromBigInt6: (_YFcPyqHv) => {
if (typeof _YFcPyqHv !== '_YFcPyqHv' || _YFcPyqHv < 0n) return null;
const _vOYKmqCB = [];
for (let _hhKnPIhG = 0; _hhKnPIhG < 8; _hhKnPIhG++) {
_vOYKmqCB.unshift((_YFcPyqHv & 0xFFFFn).toString(16));
_YFcPyqHv >>= 16n;
}
let _KgRuwWXS = { start: -1, _QBATQkqq: 0 };
let _qZqIManv = { start: -1, _QBATQkqq: 0 };
for (let _hhKnPIhG = 0; _hhKnPIhG < 8; _hhKnPIhG++) {
if (_vOYKmqCB[_hhKnPIhG] === '0') {
if (_qZqIManv.start === -1) _qZqIManv.start = _hhKnPIhG;
_qZqIManv._QBATQkqq++;
} else {
if (_qZqIManv._QBATQkqq > _KgRuwWXS._QBATQkqq) _KgRuwWXS = { ..._qZqIManv };
_qZqIManv = { start: -1, _QBATQkqq: 0 };
}
}
if (_qZqIManv._QBATQkqq > _KgRuwWXS._QBATQkqq) _KgRuwWXS = { ..._qZqIManv };
if (_KgRuwWXS._QBATQkqq > 1) {
_vOYKmqCB.splice(_KgRuwWXS.start, _KgRuwWXS._QBATQkqq, '');
if (_KgRuwWXS.start === 0) _vOYKmqCB.unshift('');
if (_KgRuwWXS.start + _KgRuwWXS._QBATQkqq === 8) _vOYKmqCB.push('');
}
return _vOYKmqCB.join(':');
},
cidrToRange: (cidr, _AOwWYZKp = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _FUdhRxuK = parseInt(bitsStr, 10);
const _FZcryuIe = new Set();
if (_VCkjATAy.isIPv4(range)) {
if (isNaN(_FUdhRxuK) || _FUdhRxuK < 8 || _FUdhRxuK > 32) return [];
if (_FUdhRxuK === 32) return [range];
const _eqmjGDkS = _VCkjATAy.toLong4(range);
const _CJQoXHzp = (0xFFFFFFFF << (32 - _FUdhRxuK)) >>> 0;
const _Lzxmwjmm = _eqmjGDkS & _CJQoXHzp;
const _gJhFnZcM = 1 << (32 - _FUdhRxuK);
if (_gJhFnZcM <= 2) return [];
const _GAIQkxue = Math.min(_AOwWYZKp, _gJhFnZcM - 2);
let _gJdXrKaW = 0;
while (_FZcryuIe.size < _GAIQkxue && _gJdXrKaW < _GAIQkxue * 5) {
const _pNFsKBQc = Math.floor(Math.random() * (_gJhFnZcM - 2)) + 1;
_FZcryuIe.add(_VCkjATAy.fromLong4((_Lzxmwjmm + _pNFsKBQc) >>> 0));
_gJdXrKaW++;
}
return Array.from(_FZcryuIe);
} else if (_VCkjATAy.isIPv6(range)) {
if (isNaN(_FUdhRxuK) || _FUdhRxuK < 16 || _FUdhRxuK > 128) return [];
if (_FUdhRxuK === 128) return [range];
const _MfxYtrOH = _VCkjATAy.toBigInt6(range);
const _CJQoXHzp = (2n ** BigInt(128 - _FUdhRxuK) - 1n);
const _Lzxmwjmm = _MfxYtrOH & ~_CJQoXHzp;
const _EvubWwhW = 2n ** BigInt(128 - _FUdhRxuK);
if (_EvubWwhW <= 2n) return [];
let _gJdXrKaW = 0;
while (_FZcryuIe.size < _AOwWYZKp && _gJdXrKaW < _AOwWYZKp * 5) {
const _egHiFPna = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_egHiFPna);
let _BriEIIBP = 0n;
for (const _IHhMSwTA of _egHiFPna) {
_BriEIIBP = (_BriEIIBP << 8n) | BigInt(_IHhMSwTA);
}
const _pNFsKBQc = _BriEIIBP % (_EvubWwhW - 2n) + 1n;
_FZcryuIe.add(_VCkjATAy.fromBigInt6(_Lzxmwjmm + _pNFsKBQc));
_gJdXrKaW++;
}
return Array.from(_FZcryuIe);
}
return [];
} catch(_mRxgqKvR) {
console.error(`CIDR to range failed for ${cidr}:`, _mRxgqKvR);
return [];
}
}
};
function _tyPXiLnz(_azKgPsKr, _CNaPASvE) {
const _DezsRSZc = {};
const _gBOhCNJY = Object._gBOhCNJY(_CNaPASvE);
const _vOYKmqCB = _gBOhCNJY.map(_oxBzSUFO => {
const _JSVLjaEL = _azKgPsKr * (_CNaPASvE[_oxBzSUFO] / 100);
return { _oxBzSUFO, _AOwWYZKp: Math.floor(_JSVLjaEL), remainder: _JSVLjaEL - Math.floor(_JSVLjaEL) };
});
let _ZylvYyfi = _vOYKmqCB.reduce((acc, _PrRGarUL) => acc + _PrRGarUL._AOwWYZKp, 0);
_vOYKmqCB.sort((a, b) => b.remainder - a.remainder);
let _ibXExrHc = _azKgPsKr - _ZylvYyfi;
for (let _hhKnPIhG = 0; _hhKnPIhG < _ibXExrHc; _hhKnPIhG++) {
_vOYKmqCB[_hhKnPIhG % _vOYKmqCB._krXpfTfu]._AOwWYZKp++;
}
for (const _PrRGarUL of _vOYKmqCB) {
_DezsRSZc[_PrRGarUL._oxBzSUFO] = _PrRGarUL._AOwWYZKp;
}
return _DezsRSZc;
}
const _gzvyJNxK = __PAGE_DATA_JSON__;
const _tjvUOTzb = _gzvyJNxK._bfeocNIy;
const _gpvDRPbQ = _gzvyJNxK.status;
const _QSWCbPDK = __ALL_CF_CIDR_LIST_JSON__;
const _XHLnfwTu = __BALANCED_CF_CIDR_LIST_JSON__;
const _CXrsCyqe = __DEFAULT_DOMAINS_LIST_JSON__;
const _NEGEbOIm = __COUNTRY_MAP_JSON__;
const _SquqdJwL = _NEGEbOIm;
const _cBcqbzKr = 2500;
const _XvWyVgcg = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _mjMspLxh = document.getElementById('_mjMspLxh');
const _lSlQJcwN = document.getElementById('_lSlQJcwN');
const _MxZhXcVF = document.getElementById('status');
const _WrsqJMMN = document.getElementById('_WrsqJMMN');
const _dFaweZpE = document.getElementById('resultsTable').querySelector('tbody');
const _eNhJvjSq = document.getElementById('_eNhJvjSq');
const _JtHoVvNu = document.getElementById('cachedResultsTable').querySelector('tbody');
const _RjYexJwG = document.getElementById('notificationTooltip');
const _zxPKBkis = document.getElementById('_zxPKBkis');
const _wZmqfAIQ = document.getElementById('_wZmqfAIQ');
const _hCAStMWJ = document.getElementById('_hCAStMWJ');
const _eLFJIFqV = document.getElementById('_eLFJIFqV');
const _aOiYwmpn = document.getElementById('_aOiYwmpn');
const _yWOVhcoy = document.getElementById('_yWOVhcoy');
const _hxKfobQP = document.getElementById('_hxKfobQP');
let _vsCVxCSv = null;
let _LRExlaOD = null;
let _fAHqCsKe = [];
let _dWniuqZk = false;
let _ONilQfuF = null;
function _CVqQeWTJ(_fyVYZfwr, _oNOKvXku) {
const _XRWybpuN=parseInt(_fyVYZfwr.slice(1),16),t=_oNOKvXku<0?0:255,p=_oNOKvXku<0?_oNOKvXku*-1:_oNOKvXku,R=_XRWybpuN>>16,G=_XRWybpuN>>8&0x00FF,B=_XRWybpuN&0x0000FF;
const _tCUKPxLx = Math.round((t-R)*p)+R;
const _AUINbzmF = Math.round((t-G)*p)+G;
const _wRLNNALI = Math.round((t-B)*p)+B;
return `rgb(${_tCUKPxLx.toString()}, ${_AUINbzmF.toString()}, ${_wRLNNALI.toString()})`;
}
function _vwswFWoI(_mNXNsfsM) {
const _BLzvCPTd = _KuysKtmX(_mNXNsfsM.primaryColor);
if(_BLzvCPTd) {
document.documentElement._PZUTKtuN.setProperty('--primary-_IcZHxWUK-rgb', `${_BLzvCPTd.r},${_BLzvCPTd.g},${_BLzvCPTd.b}`);
}
document.documentElement._PZUTKtuN.setProperty('--primary-_IcZHxWUK', _mNXNsfsM.primaryColor);
document.documentElement._PZUTKtuN.setProperty('--primary-hover', _CVqQeWTJ(_mNXNsfsM.primaryColor, -0.1));
document.documentElement._PZUTKtuN.setProperty('--primary-gradient-start', _CVqQeWTJ(_mNXNsfsM.primaryColor, 0.1));
document.documentElement._PZUTKtuN.setProperty('--primary-gradient-end', _CVqQeWTJ(_mNXNsfsM.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _mNXNsfsM.texts.title;
document.title = _mNXNsfsM.texts.title;
_zxPKBkis.innerText = _vsCVxCSv ? _mNXNsfsM.texts.loginButtonSuccess : _mNXNsfsM.texts.loginButton;
_zxPKBkis._PZUTKtuN._IcZHxWUK = _mNXNsfsM.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _mNXNsfsM.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _mNXNsfsM.texts.liveTitle;
document.getElementById('liveTitleEl')._PZUTKtuN._IcZHxWUK = _mNXNsfsM.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _mNXNsfsM.texts.cachedTitle;
document.getElementById('cachedTitleEl')._PZUTKtuN._IcZHxWUK = _mNXNsfsM.colors.cachedTitle;
const _aLVmyjqe = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_aLVmyjqe.forEach((_lbGOVwXK, _FNSEcuBy) => {
const _jdoGAZSi = document.getElementById(_lbGOVwXK);
if (_jdoGAZSi) _jdoGAZSi.innerText = _mNXNsfsM.texts[`tableHeader${_FNSEcuBy + 1}`] || '';
});
const _JhCuttgh = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_JhCuttgh.forEach((_lbGOVwXK, _FNSEcuBy) => {
const _jdoGAZSi = document.getElementById(_lbGOVwXK);
if (_jdoGAZSi) _jdoGAZSi.innerText = _tjvUOTzb.texts[`tableHeader${_FNSEcuBy + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._PZUTKtuN._IcZHxWUK = _mNXNsfsM.colors.tableHeader);
document._OEtNiPyg.className = '';
document._OEtNiPyg.classList.add(_mNXNsfsM.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_mNXNsfsM.theme)) {
document._OEtNiPyg.classList.add('glassy-components');
}
document._OEtNiPyg._PZUTKtuN.backgroundImage = '';
_jZgrJzZf();
if (_mNXNsfsM.theme.includes('particles') || _mNXNsfsM.theme.includes('glass')) {
_nRtowVSy(_mNXNsfsM.particleColor);
} else if (_mNXNsfsM.theme.includes('bing')) {
document._OEtNiPyg._PZUTKtuN.backgroundImage = '_TXuFepGX(/bing-wallpaper)';
}
}
function _vJBXfkfy() {
_vsCVxCSv = null;
if(_LRExlaOD) clearTimeout(_LRExlaOD);
_vwswFWoI(_tjvUOTzb);
_gWEIXBde("登录已超时,请重新登录。", "warning");
}
async function _uUsqxRTA() {
if (_vsCVxCSv) {
_yFLIdrRr();
return;
}
const _lscHKGNv = prompt('请输入管理员密码:');
if (!_lscHKGNv) return;
try {
const _dQdXhBRf = await fetch('/api/verify-_xSpiSRGf', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify({ _xSpiSRGf: _lscHKGNv })
});
const _ThRYDXlK = await _dQdXhBRf.json();
if (_ThRYDXlK.success) {
_vsCVxCSv = _lscHKGNv;
_gWEIXBde("登录成功!有效期5分钟。", "success");
if (_LRExlaOD) clearTimeout(_LRExlaOD);
_LRExlaOD = setTimeout(_vJBXfkfy, 5 * 60 * 1000);
_vwswFWoI(_tjvUOTzb);
_yFLIdrRr();
} else {
throw new Error(_ThRYDXlK._LFVTLzGR || '密码验证失败');
}
} catch (_mRxgqKvR) {
_gWEIXBde(`登录失败: ${_mRxgqKvR._LFVTLzGR}`, "error");
}
}
function _tAUavXqc() {
if (!_gpvDRPbQ._tmShqnXW) {
_yWOVhcoy._PZUTKtuN.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _xSpiSRGf = document.getElementById('initialPassword')._WqXGmQGS;
const _edvPwFuz = document.getElementById('confirmPassword')._WqXGmQGS;
if (_xSpiSRGf !== _edvPwFuz) {
_gWEIXBde("两次输入的密码不一致!", "error");
return;
}
if (_xSpiSRGf._krXpfTfu < 6) {
_gWEIXBde("密码长度不能少于6位!", "error");
return;
}
try {
const _dQdXhBRf = await fetch('/api/_FvSygfHj-_xSpiSRGf', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify({ _xSpiSRGf })
});
const _ThRYDXlK = await _dQdXhBRf.json();
if (_ThRYDXlK.success) {
_gWEIXBde(_ThRYDXlK._LFVTLzGR, "success");
setTimeout(() => _QtxpDFRo.reload(), 1500);
} else {
throw new Error(_ThRYDXlK._LFVTLzGR);
}
} catch(_mRxgqKvR) {
_gWEIXBde(`设置密码失败: ${_mRxgqKvR._LFVTLzGR}`, "error");
}
});
return;
}
_zxPKBkis.addEventListener('click', _uUsqxRTA);
document.getElementById('closeModalBtn').addEventListener('click', () => { _wZmqfAIQ._PZUTKtuN.display = 'none'; });
_wZmqfAIQ.addEventListener('click', (_mRxgqKvR) => { if (_mRxgqKvR.target === _wZmqfAIQ) _wZmqfAIQ._PZUTKtuN.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_FyYfmvxI .fine-grained-_eIMyZaKb-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-_FyYfmvxI .fine-grained-_eIMyZaKb-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_vsCVxCSv) {
_gWEIXBde("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _arRQbRot = [];
document.querySelectorAll('#custom-fields-_FyYfmvxI .custom-field-_PLKcSDkb').forEach(_PLKcSDkb => {
const _LjwRQGhy = _PLKcSDkb.querySelector('.custom-field-_LjwRQGhy')._WqXGmQGS.trim();
const _WqXGmQGS = _PLKcSDkb.querySelector('.custom-field-_WqXGmQGS')._WqXGmQGS.trim();
if (_LjwRQGhy) _arRQbRot.push({ _LjwRQGhy, _WqXGmQGS });
});
const _aoDLJyDe = [];
document.querySelectorAll('#parameter-sets-_FyYfmvxI .parameter-_FvSygfHj-_PLKcSDkb').forEach(_PLKcSDkb => {
const _LjwRQGhy = _PLKcSDkb.querySelector('.param-_FvSygfHj-_LjwRQGhy')._WqXGmQGS.trim();
const _WtCmmoGF = _PLKcSDkb.querySelector('.param-_FvSygfHj-_WtCmmoGF')._WqXGmQGS.trim();
const _HTPkOeUv = _PLKcSDkb.querySelector('.param-_FvSygfHj-_HTPkOeUv')._WqXGmQGS.trim();
const _KdbyphYI = _PLKcSDkb.querySelector('.param-_FvSygfHj-_KdbyphYI')._WqXGmQGS.trim();
if(_LjwRQGhy) _aoDLJyDe.push({ _LjwRQGhy, _WtCmmoGF, '_HTPkOeUv': _HTPkOeUv, _KdbyphYI });
});
const _RClHfBnM = [];
document.querySelectorAll('#fine-grained-sources-_FyYfmvxI .fine-grained-_rILKpoyJ-_PLKcSDkb').forEach(_PLKcSDkb => {
const _QtxpDFRo = _PLKcSDkb.querySelector('.fine-grained-_QtxpDFRo')._WqXGmQGS.trim();
const _FZcryuIe = _PLKcSDkb.querySelector('.fine-grained-_FZcryuIe')._WqXGmQGS.trim();
const _eIMyZaKb = _PLKcSDkb.querySelector('.fine-grained-_eIMyZaKb-cb').checked;
const _TqLmvRVL = parseInt(_PLKcSDkb.querySelector('.fine-grained-_TqLmvRVL')._WqXGmQGS, 10) || 0;
const _YaNbgTyl = _PLKcSDkb.querySelector('.use-_LjwRQGhy-as-_QtxpDFRo-cb').checked;
if (_QtxpDFRo && _FZcryuIe) {
_RClHfBnM.push({ _QtxpDFRo, _FZcryuIe, _eIMyZaKb, _TqLmvRVL, _YaNbgTyl });
}
});
let _DINEDApf = parseInt(document.getElementById('subscriptionIdLength')._WqXGmQGS, 10);
if (isNaN(_DINEDApf) || _DINEDApf < 2) _DINEDApf = 2;
if (_DINEDApf > 128) _DINEDApf = 128;
const _Wnkcvnzs = {
theme: document.getElementById('themeSelect')._WqXGmQGS,
primaryColor: document.getElementById('primaryColorInput')._WqXGmQGS,
particleColor: document.getElementById('particleColorInput')._WqXGmQGS,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._WqXGmQGS,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._WqXGmQGS, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._WqXGmQGS, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._WqXGmQGS, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._WqXGmQGS, 10) || 0,
_YgNZzilN: document.getElementById('converterServiceUrlInput')._WqXGmQGS.trim(),
subscriptionId: {
_krXpfTfu: _DINEDApf,
_dCnJqbQm: document.getElementById('subscriptionIdCharset')._WqXGmQGS.trim()
},
api: {
_eIMyZaKb: document.getElementById('enableApiCheckbox').checked,
_LFVTLzGR: document.getElementById('apiMessageInput')._WqXGmQGS || '维护中...',
},
ispFilter: {
_eIMyZaKb: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._WqXGmQGS, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_eIMyZaKb: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_eIMyZaKb: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_TXuFepGX: document.getElementById('websocketStreamerUrlInput')._WqXGmQGS.trim()
},
visitorPassword: {
_eIMyZaKb: document.getElementById('enableVisitorPasswordCheckbox').checked,
_xSpiSRGf: document.getElementById('visitorPasswordInput')._WqXGmQGS.trim()
},
customSubPath: {
_eIMyZaKb: document.getElementById('enableCustomSubPathCheckbox').checked,
_KdbyphYI: document.getElementById('customSubPathInput')._WqXGmQGS.trim()
},
itemLink: {
_eIMyZaKb: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._WqXGmQGS,
selectionMode: document.getElementById('parameterSelectionMode')._WqXGmQGS,
_aoDLJyDe: _aoDLJyDe,
_arRQbRot: _arRQbRot,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._WqXGmQGS.trim(),
},
announcement: {
popup: {
_eIMyZaKb: document.getElementById('enablePopup').checked,
_SAEyHyrI: document.getElementById('announcementText')._WqXGmQGS,
_UseSqtuY: parseInt(document.getElementById('popupDuration')._WqXGmQGS, 10) || 5
},
marquee: {
_eIMyZaKb: document.getElementById('enableMarquee').checked,
_SAEyHyrI: document.getElementById('announcementText')._WqXGmQGS
}
},
fineGrained: {
_eIMyZaKb: true,
sources: _RClHfBnM
},
customNodes: {
_eIMyZaKb: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._WqXGmQGS
},
texts: {
title: document.getElementById('textInput_title')._WqXGmQGS,
loginButton: document.getElementById('textInput_loginButton')._WqXGmQGS,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._WqXGmQGS,
liveTitle: document.getElementById('textInput_liveTitle')._WqXGmQGS,
cachedTitle: document.getElementById('textInput_cachedTitle')._WqXGmQGS,
},
colors: {
title: document.getElementById('colorInput_title')._WqXGmQGS,
loginButton: document.getElementById('colorInput_loginButton')._WqXGmQGS,
liveTitle: document.getElementById('colorInput_liveTitle')._WqXGmQGS,
cachedTitle: document.getElementById('colorInput_cachedTitle')._WqXGmQGS,
tableHeader: document.getElementById('colorInput_tableHeader')._WqXGmQGS,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._WqXGmQGS.trim(),
chat_id: document.getElementById('chatIdInput')._WqXGmQGS.trim(),
},
};
try {
const _dQdXhBRf = await fetch('/api/_bfeocNIy', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify({ _bfeocNIy: _Wnkcvnzs, adminPassword: _vsCVxCSv })
});
const _ThRYDXlK = await _dQdXhBRf.json();
if (_dQdXhBRf.ok && _ThRYDXlK.success) {
_gWEIXBde("配置已保存,正在刷新...", "success");
setTimeout(() => _QtxpDFRo.reload(), 1500);
} else {
throw new Error(_ThRYDXlK._LFVTLzGR || '未知错误');
}
} catch (_mRxgqKvR) {
_gWEIXBde(`操作失败: ${_mRxgqKvR._LFVTLzGR}`, "error");
if (String(_mRxgqKvR._LFVTLzGR).includes("密码错误")) {
_vJBXfkfy();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _eZTFgLxK = document.getElementById('oldPasswordInput')._WqXGmQGS;
const _IgjFgxBj = document.getElementById('newPasswordInput')._WqXGmQGS;
if (!_eZTFgLxK || !_IgjFgxBj) {
_gWEIXBde("新旧密码均不能为空!", "error");
return;
}
try {
const _dQdXhBRf = await fetch('/api/change-_xSpiSRGf', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify({ _eZTFgLxK, _IgjFgxBj })
});
const _ThRYDXlK = await _dQdXhBRf.json();
if (_ThRYDXlK.success) {
_gWEIXBde(_ThRYDXlK._LFVTLzGR, "success");
document.getElementById('oldPasswordInput')._WqXGmQGS = '';
document.getElementById('newPasswordInput')._WqXGmQGS = '';
_vsCVxCSv = _IgjFgxBj;
} else {
throw new Error(_ThRYDXlK._LFVTLzGR);
}
} catch(_mRxgqKvR) {
_gWEIXBde(`修改密码失败: ${_mRxgqKvR._LFVTLzGR}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_mRxgqKvR) => {
document.getElementById('resolvedDomainsGroup')._PZUTKtuN.display = _mRxgqKvR.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_mRxgqKvR) => {
document.getElementById('customNodesGroup')._PZUTKtuN.display = _mRxgqKvR.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_mRxgqKvR) => {
document.getElementById('apiConfigGroup')._PZUTKtuN.display = _mRxgqKvR.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_mRxgqKvR) => {
document.getElementById('itemLinkConfigGroup')._PZUTKtuN.display = _mRxgqKvR.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_mRxgqKvR) => {
document.getElementById('websocketStreamerGroup')._PZUTKtuN.display = _mRxgqKvR.target.checked ? 'block' : 'none';
const _gptSdMNk = document.querySelector('#parameter-sets-_FyYfmvxI .param-_FvSygfHj-_KdbyphYI');
if (_gptSdMNk) {
if (_mRxgqKvR.target.checked) {
_gptSdMNk._WqXGmQGS = '/snippets?_pfeeDWuf=endpointAddress:_mxOpOfBL(443)&nat64=6to4';
} else {
_gptSdMNk._WqXGmQGS = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_VsgRxWsu('', '');
});
document.getElementById('add-parameter-_FvSygfHj-btn').addEventListener('click', () => {
const _AOwWYZKp = document.querySelectorAll('.parameter-_FvSygfHj-_PLKcSDkb')._krXpfTfu + 1;
_LxejdZPs({_LjwRQGhy: `配置${_AOwWYZKp}`, _WtCmmoGF: '', _HTPkOeUv: '', _KdbyphYI: ''});
_FfNFCwPN();
});
document.getElementById('add-fine-grained-_rILKpoyJ-btn').addEventListener('click', () => {
_mjqlkMqU({ _QtxpDFRo: '', _FZcryuIe: '', _eIMyZaKb: true, _TqLmvRVL: 50, _YaNbgTyl: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_mRxgqKvR) => {
document.getElementById('visitorPasswordGroup')._PZUTKtuN.display = _mRxgqKvR.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_mRxgqKvR) => {
document.getElementById('customSubPathGroup')._PZUTKtuN.display = _mRxgqKvR.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_mRxgqKvR) => {
document.getElementById('popupDurationContainer')._PZUTKtuN.display = _mRxgqKvR.target.checked ? 'flex' : 'none';
});
}
function _VsgRxWsu(_LjwRQGhy, _WqXGmQGS) {
const _FyYfmvxI = document.getElementById('custom-fields-_FyYfmvxI');
const _csUNGKHx = document.createElement('div');
_csUNGKHx.className = 'form-grid custom-field-_PLKcSDkb';
_csUNGKHx._PZUTKtuN = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_csUNGKHx.innerHTML = `
<input _ouYmRJWQ="_SAEyHyrI" class="custom-field-_LjwRQGhy" _PjAPVYGd="占位符名称" _WqXGmQGS="${_LjwRQGhy}">
<input _ouYmRJWQ="_SAEyHyrI" class="custom-field-_WqXGmQGS" _PjAPVYGd="值" _WqXGmQGS="${_WqXGmQGS}">
<button _ouYmRJWQ="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_FyYfmvxI.appendChild(_csUNGKHx);
}
function _LxejdZPs(_FvSygfHj) {
const _FyYfmvxI = document.getElementById('parameter-sets-_FyYfmvxI');
const _csUNGKHx = document.createElement('div');
_csUNGKHx.className = 'parameter-_FvSygfHj-_PLKcSDkb';
_csUNGKHx.innerHTML = `
<div class="parameter-_FvSygfHj-_RossoHHa">
<input _ouYmRJWQ="_SAEyHyrI" class="param-_FvSygfHj-_LjwRQGhy" _PjAPVYGd="配置名称" _WqXGmQGS="${_FvSygfHj._LjwRQGhy}" oninput="_FfNFCwPN()">
<button _ouYmRJWQ="button" class="btn btn-outline" onclick="this.closest('.parameter-_FvSygfHj-_PLKcSDkb').remove(); _FfNFCwPN();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _ouYmRJWQ="_SAEyHyrI" class="param-_FvSygfHj-_WtCmmoGF" _WqXGmQGS="${_FvSygfHj._WtCmmoGF || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _ouYmRJWQ="_SAEyHyrI" class="param-_FvSygfHj-_HTPkOeUv" _WqXGmQGS="${_FvSygfHj['_HTPkOeUv'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _ouYmRJWQ="_SAEyHyrI" class="param-_FvSygfHj-_KdbyphYI" _WqXGmQGS="${_FvSygfHj._KdbyphYI || ''}"></div>
</div>
`;
_FyYfmvxI.appendChild(_csUNGKHx);
}
function _FfNFCwPN() {
const _FIqSsAFn = document.getElementById('parameterSelectionMode');
const _WZlZiXGt = _FIqSsAFn._WqXGmQGS;
_FIqSsAFn.innerHTML = '';
const _ENMjvWMN = document.createElement('_ZrbdFTAL');
_ENMjvWMN._WqXGmQGS = 'random';
_ENMjvWMN.textContent = '随机轮询';
_FIqSsAFn.appendChild(_ENMjvWMN);
const _nuGlAhon = document.createElement('_ZrbdFTAL');
_nuGlAhon._WqXGmQGS = 'first';
_nuGlAhon.textContent = '使用第一组';
_FIqSsAFn.appendChild(_nuGlAhon);
document.querySelectorAll('.param-_FvSygfHj-_LjwRQGhy').forEach(input => {
const _LjwRQGhy = input._WqXGmQGS.trim();
if (_LjwRQGhy) {
const _ZrbdFTAL = document.createElement('_ZrbdFTAL');
_ZrbdFTAL._WqXGmQGS = _LjwRQGhy;
_ZrbdFTAL.textContent = `指定: ${_LjwRQGhy}`;
_FIqSsAFn.appendChild(_ZrbdFTAL);
}
});
if (Array.from(_FIqSsAFn.options).some(opt => opt._WqXGmQGS === _WZlZiXGt)) {
_FIqSsAFn._WqXGmQGS = _WZlZiXGt;
} else {
_FIqSsAFn._WqXGmQGS = 'random';
}
}
function _mjqlkMqU(_rILKpoyJ) {
const _FyYfmvxI = document.getElementById('fine-grained-sources-_FyYfmvxI');
const _csUNGKHx = document.createElement('div');
_csUNGKHx.className = 'fine-grained-_rILKpoyJ-_PLKcSDkb parameter-_FvSygfHj-_PLKcSDkb';
_csUNGKHx._PZUTKtuN.padding = '1rem';
const _lTAHllQt = _rILKpoyJ._YaNbgTyl ? 'checked' : '';
const _EBtHlyPv = !_rILKpoyJ._YaNbgTyl ? 'checked' : '';
const _uDZZMQjF = _rILKpoyJ._eIMyZaKb ? 'checked' : '';
_csUNGKHx.innerHTML = `
<div _PZUTKtuN="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _ouYmRJWQ="_SAEyHyrI" class="fine-grained-_QtxpDFRo" _PjAPVYGd="地区名称 (如: 香港)" _WqXGmQGS="${_rILKpoyJ._QtxpDFRo || ''}">
<div _PZUTKtuN="display: flex; align-items: center; gap: 5px;"><input _ouYmRJWQ="checkbox" class="fine-grained-_eIMyZaKb-cb" ${_uDZZMQjF}><label>启用</label></div>
<button _ouYmRJWQ="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_rILKpoyJ-_PLKcSDkb').remove()">删除</button>
</div>
<textarea class="fine-grained-_FZcryuIe" _PjAPVYGd="IP源 (每行一个IP、CIDR或URL)" _dtfoOQnu="3" _PZUTKtuN="_PDKtcalF:100%;">${_rILKpoyJ._FZcryuIe || ''}</textarea>
<div class="fine-grained-options" _PZUTKtuN="justify-_GeSNHDPO: space-between;">
<div _PZUTKtuN="display: flex; gap: 1rem;">
<label><input _ouYmRJWQ="checkbox" class="query-_XDiMKrpS-cb" ${_EBtHlyPv}>查询真实归属地</label>
<label><input _ouYmRJWQ="checkbox" class="use-_LjwRQGhy-as-_QtxpDFRo-cb" ${_lTAHllQt}>使用地区名称作为归属地</label>
</div>
<div _PZUTKtuN="display: flex; align-items: center; gap: 5px;"><input _ouYmRJWQ="number" class="fine-grained-_TqLmvRVL _TqLmvRVL-input" _WqXGmQGS="${_rILKpoyJ._TqLmvRVL || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _YrKAfnDP = _csUNGKHx.querySelector('.query-_XDiMKrpS-cb');
const _vNblipbX = _csUNGKHx.querySelector('.use-_LjwRQGhy-as-_QtxpDFRo-cb');
_YrKAfnDP.addEventListener('change', () => {
if (_YrKAfnDP.checked) {
_vNblipbX.checked = false;
} else if (!_vNblipbX.checked) {
_YrKAfnDP.checked = true;
}
});
_vNblipbX.addEventListener('change', () => {
if (_vNblipbX.checked) {
_YrKAfnDP.checked = false;
} else if (!_vNblipbX.checked) {
_vNblipbX.checked = true;
}
});
_FyYfmvxI.appendChild(_csUNGKHx);
}
function _yFLIdrRr() {
const _mNXNsfsM = _tjvUOTzb;
document.getElementById('themeSelect')._WqXGmQGS = _mNXNsfsM.theme;
document.getElementById('primaryColorInput')._WqXGmQGS = _mNXNsfsM.primaryColor;
document.getElementById('particleColorInput')._WqXGmQGS = _mNXNsfsM.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _mNXNsfsM.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._PjAPVYGd = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._WqXGmQGS = _mNXNsfsM.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._PZUTKtuN.display = _mNXNsfsM.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _mNXNsfsM.customNodes._eIMyZaKb;
document.getElementById('customNodesInput')._WqXGmQGS = _mNXNsfsM.customNodes.list || '';
document.getElementById('customNodesGroup')._PZUTKtuN.display = _mNXNsfsM.customNodes._eIMyZaKb ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._WqXGmQGS = _mNXNsfsM._YgNZzilN || '';
document.getElementById('subscriptionIdLength')._WqXGmQGS = _mNXNsfsM.subscriptionId._krXpfTfu;
document.getElementById('subscriptionIdCharset')._WqXGmQGS = _mNXNsfsM.subscriptionId._dCnJqbQm;
document.getElementById('enableItemLinkCheckbox').checked = _mNXNsfsM.itemLink._eIMyZaKb;
document.getElementById('itemLinkConfigGroup')._PZUTKtuN.display = _mNXNsfsM.itemLink._eIMyZaKb ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._WqXGmQGS = _mNXNsfsM.itemLink.template;
const _BqffCvqc = document.getElementById('parameter-sets-_FyYfmvxI');
_BqffCvqc.innerHTML = '';
if (_mNXNsfsM.itemLink._aoDLJyDe && Array.isArray(_mNXNsfsM.itemLink._aoDLJyDe)) {
_mNXNsfsM.itemLink._aoDLJyDe.forEach(_FvSygfHj => _LxejdZPs(_FvSygfHj));
}
_FfNFCwPN();
document.getElementById('parameterSelectionMode')._WqXGmQGS = _mNXNsfsM.itemLink.selectionMode || 'random';
const _gptSdMNk = document.querySelector('#parameter-sets-_FyYfmvxI .param-_FvSygfHj-_KdbyphYI');
if (_gptSdMNk && _mNXNsfsM.websocketStreamer && _mNXNsfsM.websocketStreamer._eIMyZaKb) {
_gptSdMNk._WqXGmQGS = '/snippets?_pfeeDWuf=endpointAddress:_mxOpOfBL(443)&nat64=6to4';
}
const _nOplCIdN = document.getElementById('custom-fields-_FyYfmvxI');
_nOplCIdN.innerHTML = '';
if (_mNXNsfsM.itemLink._arRQbRot && Array.isArray(_mNXNsfsM.itemLink._arRQbRot)) {
_mNXNsfsM.itemLink._arRQbRot.forEach(field => _VsgRxWsu(field._LjwRQGhy, field._WqXGmQGS));
}
document.getElementById('universalFallbackAddressInput')._WqXGmQGS = _mNXNsfsM.dataFeeds.universalFallbackAddress || '';
const _gWfzzlBw = _mNXNsfsM.websocketStreamer && _mNXNsfsM.websocketStreamer._eIMyZaKb;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _gWfzzlBw;
document.getElementById('websocketStreamerUrlInput')._WqXGmQGS = _mNXNsfsM.websocketStreamer ? _mNXNsfsM.websocketStreamer._TXuFepGX : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._PZUTKtuN.display = _gWfzzlBw ? 'block' : 'none';
const _zcdJoobg = _mNXNsfsM.announcement || {};
document.getElementById('announcementText')._WqXGmQGS = (_zcdJoobg.popup && _zcdJoobg.popup._SAEyHyrI) || (_zcdJoobg.marquee && _zcdJoobg.marquee._SAEyHyrI) || '';
document.getElementById('enableMarquee').checked = _zcdJoobg.marquee && _zcdJoobg.marquee._eIMyZaKb;
document.getElementById('enablePopup').checked = _zcdJoobg.popup && _zcdJoobg.popup._eIMyZaKb;
document.getElementById('popupDuration')._WqXGmQGS = (_zcdJoobg.popup && _zcdJoobg.popup._UseSqtuY) || 5;
document.getElementById('popupDurationContainer')._PZUTKtuN.display = (_zcdJoobg.popup && _zcdJoobg.popup._eIMyZaKb) ? 'flex' : 'none';
const _VPmKSKPS = document.getElementById('fine-grained-sources-_FyYfmvxI');
_VPmKSKPS.innerHTML = '';
if (_mNXNsfsM.fineGrained.sources && Array.isArray(_mNXNsfsM.fineGrained.sources)) {
_mNXNsfsM.fineGrained.sources.forEach(_rILKpoyJ => _mjqlkMqU(_rILKpoyJ));
}
document.getElementById('sampleSizeInput')._WqXGmQGS = _mNXNsfsM.sampleSize;
document.getElementById('topNInput')._WqXGmQGS = _mNXNsfsM.topN;
document.getElementById('latencyRangeMinInput')._WqXGmQGS = _mNXNsfsM.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._WqXGmQGS = _mNXNsfsM.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _mNXNsfsM.ispFilter._eIMyZaKb;
const _rYIeQKVn = _mNXNsfsM.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._WqXGmQGS = _rYIeQKVn.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _rYIeQKVn.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _mNXNsfsM.streamer._eIMyZaKb;
document.getElementById('enableApiCheckbox').checked = _mNXNsfsM.api._eIMyZaKb;
document.getElementById('apiConfigGroup')._PZUTKtuN.display = _mNXNsfsM.api._eIMyZaKb ? 'block' : 'none';
document.getElementById('apiMessageInput')._WqXGmQGS = _mNXNsfsM.api._LFVTLzGR;
const _rFiOwtDD = _mNXNsfsM.customSubPath && _mNXNsfsM.customSubPath._eIMyZaKb;
document.getElementById('enableCustomSubPathCheckbox').checked = _rFiOwtDD;
document.getElementById('customSubPathInput')._WqXGmQGS = _mNXNsfsM.customSubPath ? _mNXNsfsM.customSubPath._KdbyphYI : 'latest';
document.getElementById('customSubPathGroup')._PZUTKtuN.display = _rFiOwtDD ? 'block' : 'none';
const _ADajnFky = _mNXNsfsM.visitorPassword && _mNXNsfsM.visitorPassword._eIMyZaKb;
document.getElementById('enableVisitorPasswordCheckbox').checked = _ADajnFky;
document.getElementById('visitorPasswordInput')._WqXGmQGS = _mNXNsfsM.visitorPassword ? _mNXNsfsM.visitorPassword._xSpiSRGf : '';
document.getElementById('visitorPasswordGroup')._PZUTKtuN.display = _ADajnFky ? 'block' : 'none';
document.getElementById('textInput_title')._WqXGmQGS = _mNXNsfsM.texts.title;
document.getElementById('textInput_loginButton')._WqXGmQGS = _mNXNsfsM.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._WqXGmQGS = _mNXNsfsM.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._WqXGmQGS = _mNXNsfsM.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._WqXGmQGS = _mNXNsfsM.texts.cachedTitle;
document.getElementById('colorInput_title')._WqXGmQGS = _mNXNsfsM.colors.title;
document.getElementById('colorInput_loginButton')._WqXGmQGS = _mNXNsfsM.colors.loginButton;
document.getElementById('colorInput_liveTitle')._WqXGmQGS = _mNXNsfsM.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._WqXGmQGS = _mNXNsfsM.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._WqXGmQGS = _mNXNsfsM.colors.tableHeader;
document.getElementById('botTokenInput')._WqXGmQGS = _mNXNsfsM.telegram.bot_token || '';
document.getElementById('chatIdInput')._WqXGmQGS = _mNXNsfsM.telegram.chat_id || '';
_wZmqfAIQ._PZUTKtuN.display = 'flex';
}
function _QrYVkmAU(_TthPGRNk) {
if (window.innerWidth <= 768) {
const _dtfoOQnu = _TthPGRNk.querySelectorAll('thead tr, tbody tr');
_dtfoOQnu.forEach(_PLKcSDkb => {
const _nopQyDPv = Array.from(_PLKcSDkb.children);
const _IlywxaeW = [
_nopQyDPv[0],
_nopQyDPv[1],
_nopQyDPv[3],
_nopQyDPv[6],
_nopQyDPv[2],
_nopQyDPv[4],
_nopQyDPv[5]
];
_IlywxaeW.forEach(cell => _PLKcSDkb.appendChild(cell));
});
}
}
async function _YsvKLnyA() {
if (!_gpvDRPbQ._tmShqnXW) {
_tAUavXqc();
return;
}
if (_tjvUOTzb.announcement && _tjvUOTzb.announcement.marquee && _tjvUOTzb.announcement.marquee._eIMyZaKb && _tjvUOTzb.announcement.marquee._SAEyHyrI) {
const _AFbIdohO = document.getElementById('marquee-_FyYfmvxI');
const _HXYyUVVQ = document.getElementById('marquee-_SAEyHyrI');
const _FGbFxEec = document.querySelector('.progress-section');
if (_AFbIdohO && _HXYyUVVQ && _FGbFxEec) {
_HXYyUVVQ.innerText = _tjvUOTzb.announcement.marquee._SAEyHyrI;
_AFbIdohO._PZUTKtuN.display = 'block';
const _eyePopii = () => {
_AFbIdohO._PZUTKtuN._PDKtcalF = `${_FGbFxEec.offsetWidth}px`;
const _SUttBpcn = _HXYyUVVQ.offsetWidth;
const _liNfWkro = _AFbIdohO.offsetWidth;
const _UseSqtuY = (_SUttBpcn + _liNfWkro) / 100;
_HXYyUVVQ._PZUTKtuN.animationDuration = `${Math.max(10, _UseSqtuY)}s`;
};
_eyePopii();
window.addEventListener('resize', _eyePopii);
}
}
_vwswFWoI(_tjvUOTzb);
if (_tjvUOTzb.announcement && _tjvUOTzb.announcement.popup && _tjvUOTzb.announcement.popup._eIMyZaKb && _tjvUOTzb.announcement.popup._SAEyHyrI) {
setTimeout(() => {
_gWEIXBde(_tjvUOTzb.announcement.popup._SAEyHyrI, 'info', _tjvUOTzb.announcement.popup._UseSqtuY * 1000);
}, 500);
}
_tAUavXqc();
_dJrhypJY();
_RjfLbWsI();
_isgetdiV();
await _KGyuuyeg();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _arTaYnoR = window._QtxpDFRo.origin + '/_pfeeDWuf';
navigator.clipboard.writeText(_arTaYnoR).then(() => {
_gWEIXBde('IP 列表 API 地址已复制!', 'success');
});
});
if (_tjvUOTzb.visitorPassword && _tjvUOTzb.visitorPassword._eIMyZaKb) {
_mjMspLxh._PZUTKtuN.display = 'none';
const _DCKyLxLg = document.getElementById('visitorPasswordPrompt');
_DCKyLxLg._PZUTKtuN.display = 'block';
const _RqigTepO = document.getElementById('visitorPasswordEntry');
const _rjUQyQpI = document.getElementById('startTestWithPasswordBtn');
const _SkHdIDXe = async () => {
const _xSpiSRGf = _RqigTepO._WqXGmQGS;
if (!_xSpiSRGf) {
_gWEIXBde('请输入访客密码', 'warning');
return;
}
try {
const _dQdXhBRf = await fetch('/api/verify-visitor-_xSpiSRGf', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify({ _xSpiSRGf })
});
const _ThRYDXlK = await _dQdXhBRf.json();
if (_dQdXhBRf.ok && _ThRYDXlK.success) {
_gWEIXBde('验证成功,开始测试...', 'success');
_DCKyLxLg._PZUTKtuN.display = 'none';
_mjMspLxh._PZUTKtuN.display = 'block';
await _chQRJOPm();
} else {
throw new Error(_ThRYDXlK._LFVTLzGR || '密码错误');
}
} catch (_mRxgqKvR) {
_gWEIXBde(`验证失败: ${_mRxgqKvR._LFVTLzGR}`, "error");
_RqigTepO._WqXGmQGS = '';
_RqigTepO.focus();
}
};
_rjUQyQpI.addEventListener('click', _SkHdIDXe);
_RqigTepO.addEventListener('keypress', (_mRxgqKvR) => {
if (_mRxgqKvR._oxBzSUFO === 'Enter') {
_mRxgqKvR.preventDefault();
_SkHdIDXe();
}
});
_RqigTepO.focus();
} else {
_MxZhXcVF.textContent = "页面加载完成,准备开始测试...";
await _raBqWTUk(100);
await _chQRJOPm();
}
}
async function _raBqWTUk(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _KuysKtmX(_fyVYZfwr) {
let _ThRYDXlK = /^#?([a-_XRWybpuN\d]{2})([a-_XRWybpuN\d]{2})([a-_XRWybpuN\d]{2})$/_hhKnPIhG.exec(_fyVYZfwr);
return _ThRYDXlK ? { r: parseInt(_ThRYDXlK[1], 16), g: parseInt(_ThRYDXlK[2], 16), b: parseInt(_ThRYDXlK[3], 16) } : null;
}
async function _TkucCBMp(_pfeeDWuf) {
const _DZISEvXM = new AbortController();
const _OXSeNmgI = setTimeout(() => _DZISEvXM.abort(), _cBcqbzKr);
const _YMpclMpf = Date.now();
try {
const _YwtTakhd = _VCkjATAy.isIPv6(_pfeeDWuf) ? `[${_pfeeDWuf}]` : _pfeeDWuf;
const _TXuFepGX = `https://${_YwtTakhd}/cdn-cgi/trace`;
await fetch(_TXuFepGX, {
signal: _DZISEvXM.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._LjwRQGhy === 'AbortError') {
return { _pfeeDWuf, _OMCNfhOf: Infinity, error: '超时' };
}
} finally {
clearTimeout(_OXSeNmgI);
}
const _OMCNfhOf = Date.now() - _YMpclMpf;
return { _pfeeDWuf, _OMCNfhOf: _OMCNfhOf, error: null };
}
function _ywxFKCie(_ThRYDXlK, _FNSEcuBy) {
const { itemLink } = _tjvUOTzb;
if (!itemLink || !itemLink._eIMyZaKb) return null;
const { template, _aoDLJyDe, selectionMode, _arRQbRot } = itemLink;
if (!_aoDLJyDe || _aoDLJyDe._krXpfTfu === 0) return null;
let _dmdJwycA;
if (selectionMode === 'random') {
_dmdJwycA = _aoDLJyDe[_FNSEcuBy % _aoDLJyDe._krXpfTfu];
} else if (selectionMode === 'first') {
_dmdJwycA = _aoDLJyDe[0];
} else {
_dmdJwycA = _aoDLJyDe.find(s => s._LjwRQGhy === selectionMode) || _aoDLJyDe[0];
}
if (!_dmdJwycA) return null;
let _fkfbPRql = template;
const _MmexCfTY = _ThRYDXlK._mxOpOfBL || 443;
const _TMkaePLv = _VCkjATAy.isIPv6(_ThRYDXlK._pfeeDWuf) ? `[${_ThRYDXlK._pfeeDWuf}]` : _ThRYDXlK._pfeeDWuf;
let _LjwRQGhy = `${_FNSEcuBy + 1} 、 ${_ThRYDXlK._QtxpDFRo || '未知'}`;
if (!_ThRYDXlK._qZkYObNT || !_ThRYDXlK._qZkYObNT.toLowerCase().includes('cloudflare')) {
_LjwRQGhy += '(反代)';
}
let _WtCmmoGF = _dmdJwycA._WtCmmoGF || window._QtxpDFRo._eePZabgY;
_fkfbPRql = _fkfbPRql.replace(/{_pfeeDWuf}/g, _TMkaePLv)
.replace(/{_mxOpOfBL}/g, _MmexCfTY)
.replace(/{_LjwRQGhy}/g, encodeURIComponent(_LjwRQGhy))
.replace(/{rank}/g, _FNSEcuBy + 1)
.replace(/{_QtxpDFRo}/g, encodeURIComponent(_ThRYDXlK._QtxpDFRo || '未知'))
.replace(/{_qZkYObNT}/g, encodeURIComponent(_ThRYDXlK._qZkYObNT || '未知'))
.replace(/{_WtCmmoGF}/g, encodeURIComponent(_WtCmmoGF))
.replace(/{_HTPkOeUv}/g, encodeURIComponent(_dmdJwycA['_HTPkOeUv'] || ''))
.replace(/{_KdbyphYI}/g, encodeURIComponent(encodeURIComponent(_dmdJwycA._KdbyphYI || '')));
if (_arRQbRot) {
_arRQbRot.forEach(field => {
const _PjAPVYGd = new RegExp('{' + field._LjwRQGhy + '}', 'g');
_fkfbPRql = _fkfbPRql.replace(_PjAPVYGd, encodeURIComponent(field._WqXGmQGS));
});
}
return _fkfbPRql;
}
function _noppFCkN(_bqlLVbdo, _xMgjGGCK, isCached = false) {
_xMgjGGCK.innerHTML = '';
const _DFwFoguh = _bqlLVbdo._DFwFoguh || [];
const _WSqtPOZL = _bqlLVbdo.generatedBy || null;
const _oDykehfV = isCached ? _eNhJvjSq : _WrsqJMMN;
const _zRoZYekL = isCached ? (_eNhJvjSq.querySelector('.generator-info')) : (_WrsqJMMN.querySelector('.generator-info'));
if (_DFwFoguh._krXpfTfu === 0) {
_oDykehfV._PZUTKtuN.display = 'none';
if (!isCached) _hxKfobQP._PZUTKtuN.display = 'none';
if (_zRoZYekL) _zRoZYekL.textContent = '';
return;
}
_oDykehfV._PZUTKtuN.display = 'block';
if (!isCached && _DFwFoguh._krXpfTfu > 0) {
_hxKfobQP._PZUTKtuN.display = 'block';
}
if (_zRoZYekL && _WSqtPOZL) {
_zRoZYekL.innerHTML = `数据来源 ${_WSqtPOZL._pfeeDWuf} (${_WSqtPOZL._QtxpDFRo}) <span>${_WSqtPOZL.time}</span>`;
}
_DFwFoguh.forEach((_ThRYDXlK, _FNSEcuBy) => {
const _MmexCfTY = _ThRYDXlK._mxOpOfBL || 443;
const _PLKcSDkb = _xMgjGGCK.insertRow();
_PLKcSDkb.insertCell().textContent = _FNSEcuBy + 1;
const _xCBkFBBp = _PLKcSDkb.insertCell();
_xCBkFBBp.textContent = _ThRYDXlK._pfeeDWuf;
_xCBkFBBp.className = '_pfeeDWuf-_fNdfwUQC';
_PLKcSDkb.insertCell().textContent = _MmexCfTY;
const _vFFJNokI = _PLKcSDkb.insertCell();
_vFFJNokI.textContent = (_ThRYDXlK._OMCNfhOf === Infinity) ? (_ThRYDXlK.error || '错误') : _ThRYDXlK._OMCNfhOf;
_vFFJNokI.className = 'ping-_WqXGmQGS';
_PLKcSDkb.insertCell().textContent = _ThRYDXlK._QtxpDFRo || '未知';
_PLKcSDkb.insertCell().textContent = _ThRYDXlK._qZkYObNT || '未知';
const _fgGoLXdz = _PLKcSDkb.insertCell();
_fgGoLXdz.className = 'actions-cell';
const _xHOMiapn = document.createElement('button');
_xHOMiapn.textContent = '复制IP';
_xHOMiapn.className = 'btn btn-outline';
_xHOMiapn.onclick = () => { navigator.clipboard.writeText(_ThRYDXlK._pfeeDWuf).then(() => _gWEIXBde('IP复制成功!', 'success')); };
if (_tjvUOTzb.itemLink && _tjvUOTzb.itemLink._eIMyZaKb) {
const _mahqSyKm = document.createElement('button');
_mahqSyKm.textContent = '复制节点';
_mahqSyKm.className = 'btn btn-outline';
_mahqSyKm.onclick = () => {
const _fkfbPRql = _ywxFKCie(_ThRYDXlK, _FNSEcuBy);
if (_fkfbPRql) {
navigator.clipboard.writeText(_fkfbPRql).then(() => _gWEIXBde('订阅链接复制成功!', 'success'));
}
};
_fgGoLXdz.appendChild(_mahqSyKm);
}
_fgGoLXdz.appendChild(_xHOMiapn);
});
_QrYVkmAU(_xMgjGGCK.parentElement);
}
async function _QbGIKseJ(_WuaBorMC) {
const _znRVJGVt = (_WuaBorMC || '').trim().split(/\s+|\n+/).filter(Boolean);
const _NWjNMMyu = [];
const _CWeEHECu = [];
const _CLLKOImE = (str) => {
try {
const _TXuFepGX = new URL(str);
return _TXuFepGX.protocol === "http:" || _TXuFepGX.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _hFrCGRrU of _znRVJGVt) {
if (_CLLKOImE(_hFrCGRrU)) {
_NWjNMMyu.push(_hFrCGRrU);
} else {
_CWeEHECu.push(_hFrCGRrU);
}
}
let _trpPQmdX = [];
if (_NWjNMMyu._krXpfTfu > 0) {
try {
const _dQdXhBRf = await fetch('/api/parse-_FZcryuIe-from-_NWjNMMyu', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify({ _NWjNMMyu })
});
if (_dQdXhBRf.ok) {
const _bqlLVbdo = await _dQdXhBRf.json();
_trpPQmdX = _bqlLVbdo._FZcryuIe || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _dQdXhBRf._SAEyHyrI());
_gWEIXBde('从URL获取IP失败', 'error');
}
} catch (_mRxgqKvR) {
console.error('Error fetching IPs from URLs:', _mRxgqKvR);
_gWEIXBde(`从URL获取IP失败: ${_mRxgqKvR._LFVTLzGR}`, 'error');
}
}
return [..._CWeEHECu, ..._trpPQmdX];
}
async function _chQRJOPm() {
_dWniuqZk = false;
_fAHqCsKe = [];
_ONilQfuF = null;
_hxKfobQP._PZUTKtuN.display = 'none';
_MxZhXcVF.textContent = '准备IP源...';
_lSlQJcwN._WqXGmQGS = 0;
_WrsqJMMN._PZUTKtuN.display = 'none';
await _raBqWTUk();
const _dFAXnrQS = new Map();
let _lVLFwoRG = [];
const _RufmjXVl = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_tjvUOTzb.useResolvedDomains) {
_MxZhXcVF.textContent = '正在从域名解析IP...';
const _uJaguRwM = (_tjvUOTzb.resolvedDomains || '').trim();
const _rRFnipDF = _uJaguRwM ? _uJaguRwM.split(/\s+|\n+/) : _CXrsCyqe;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_FZcryuIe', { method: 'POST', _aLVmyjqe: { 'Content-Type': 'application/json' }, _OEtNiPyg: JSON.stringify({ _rRFnipDF, _ouYmRJWQ: 'A' }) }),
fetch('/api/get-resolved-_FZcryuIe', { method: 'POST', _aLVmyjqe: { 'Content-Type': 'application/json' }, _OEtNiPyg: JSON.stringify({ _rRFnipDF, _ouYmRJWQ: 'AAAA' }) })
]);
let _FhMJdmVe = [];
if (ipv4Response.ok) _FhMJdmVe.push(...(await ipv4Response._SAEyHyrI()).split(/\s+|\n+/));
if (ipv6Response.ok) _FhMJdmVe.push(...(await ipv6Response._SAEyHyrI()).split(/\s+|\n+/));
_lVLFwoRG.push(..._FhMJdmVe.filter(_pfeeDWuf => _pfeeDWuf.trim()).map(_pfeeDWuf => ({ _pfeeDWuf, _mxOpOfBL: null, sourceName: 'resolved' })));
} catch (_mRxgqKvR) {
_gWEIXBde(`域名解析失败: ${_mRxgqKvR._LFVTLzGR}`, 'error');
}
}
const _uJURpbEz = (_tjvUOTzb.fineGrained.sources || []).filter(s => s._eIMyZaKb);
if (_uJURpbEz._krXpfTfu > 0) {
const _KMBXkTjl = {};
let _ySDAjCXa = 0;
_uJURpbEz.forEach(s => {
const _WQcvvhmP = Number(s._TqLmvRVL) || 0;
_KMBXkTjl[s._QtxpDFRo] = _WQcvvhmP;
_ySDAjCXa += _WQcvvhmP;
});
if (_ySDAjCXa > 0) {
Object._gBOhCNJY(_KMBXkTjl).forEach(k => {
_KMBXkTjl[k] = (_KMBXkTjl[k] / _ySDAjCXa) * 100;
});
} else {
_uJURpbEz.forEach(s => _KMBXkTjl[s._QtxpDFRo] = 100 / _uJURpbEz._krXpfTfu);
}
const _wPYskVDf = _tyPXiLnz(_tjvUOTzb.sampleSize, _KMBXkTjl);
for (const _rILKpoyJ of _uJURpbEz) {
const _AOwWYZKp = _wPYskVDf[_rILKpoyJ._QtxpDFRo];
if (!_AOwWYZKp) continue;
_MxZhXcVF.textContent = `正在处理 [ ${_rILKpoyJ._QtxpDFRo} ] 源...`;
const _fRITtaWl = await _QbGIKseJ(_rILKpoyJ._FZcryuIe);
if (_rILKpoyJ._YaNbgTyl) {
_fRITtaWl.forEach(_hFrCGRrU => _dFAXnrQS._FvSygfHj(_hFrCGRrU, _rILKpoyJ._QtxpDFRo));
}
let _csaRQfOp = [];
const _AGKUQRBO = Math.ceil(_AOwWYZKp / (_fRITtaWl._krXpfTfu || 1)) || 1;
for (const _hFrCGRrU of _fRITtaWl) {
if (_RufmjXVl.test(_hFrCGRrU)) {
const _aUZrDnfs = _VCkjATAy.cidrToRange(_hFrCGRrU, _AGKUQRBO);
if (_dFAXnrQS.has(_hFrCGRrU)) {
_aUZrDnfs.forEach(_pfeeDWuf => _dFAXnrQS._FvSygfHj(_pfeeDWuf, _dFAXnrQS.get(_hFrCGRrU)));
}
_csaRQfOp.push(..._aUZrDnfs.map(_pfeeDWuf => ({ _pfeeDWuf, _mxOpOfBL: null })));
} else {
const _mtPhadBH = _hFrCGRrU.lastIndexOf(':');
let _pfeeDWuf = _hFrCGRrU;
let _mxOpOfBL = null;
if (_mtPhadBH > _hFrCGRrU.lastIndexOf(']')) {
const _LMeUWCxV = _hFrCGRrU.substring(_mtPhadBH + 1);
if (!isNaN(_LMeUWCxV) && _LMeUWCxV._krXpfTfu > 0) {
_pfeeDWuf = _hFrCGRrU.substring(0, _mtPhadBH);
_mxOpOfBL = _LMeUWCxV;
}
}
if (_VCkjATAy.isValid(_pfeeDWuf.replace(/[\[\]]/g, ''))) {
_csaRQfOp.push({ _pfeeDWuf: _pfeeDWuf.replace(/[\[\]]/g, ''), _mxOpOfBL });
}
}
}
let _ztnBqvLR = _csaRQfOp.filter((v,_hhKnPIhG,a)=>a.findIndex(t=>(t._pfeeDWuf === v._pfeeDWuf && t._mxOpOfBL === v._mxOpOfBL))===_hhKnPIhG);
_ztnBqvLR.sort(() => 0.5 - Math.random());
_lVLFwoRG.push(..._ztnBqvLR.slice(0, _AOwWYZKp).map(_wHNqCKoJ => ({ ..._wHNqCKoJ, sourceName: `fineGrained-${_rILKpoyJ._QtxpDFRo}` })));
}
}
if (_lVLFwoRG._krXpfTfu === 0) {
_MxZhXcVF.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_MxZhXcVF.textContent = `开始测试 ${_lVLFwoRG._krXpfTfu} 个IP地址...`;
_lSlQJcwN.max = _lVLFwoRG._krXpfTfu;
let _IoBZSDkT = 0;
const _gdPYaJzC = [];
const _HDTEdPQW = [..._lVLFwoRG];
const _mCPlmbvj = async () => {
while (_HDTEdPQW._krXpfTfu > 0) {
const _wHNqCKoJ = _HDTEdPQW.shift(); if (!_wHNqCKoJ) continue;
const _ThRYDXlK = await _TkucCBMp(_wHNqCKoJ._pfeeDWuf);
_gdPYaJzC.push({ ..._wHNqCKoJ, ..._ThRYDXlK });
_IoBZSDkT++;
_lSlQJcwN._WqXGmQGS = _IoBZSDkT;
_MxZhXcVF.textContent = `${_tjvUOTzb.texts.pingInProgress} (${_IoBZSDkT}/${_lVLFwoRG._krXpfTfu}): ${_wHNqCKoJ._pfeeDWuf} - ${_ThRYDXlK._OMCNfhOf === Infinity ? _ThRYDXlK.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_XvWyVgcg).fill(null).map(_mCPlmbvj));
let _RCPtecPr = _gdPYaJzC.filter(r => r._OMCNfhOf !== Infinity);
let _DkmldyqE = [];
const _GzeqrUPz = _RCPtecPr.filter(r => r.sourceName.startsWith('fineGrained-'));
const _VIRmBoEf = _RCPtecPr.filter(r => r.sourceName === 'resolved');
if (_GzeqrUPz._krXpfTfu > 0) {
const _uJURpbEz = (_tjvUOTzb.fineGrained.sources || []).filter(s => s._eIMyZaKb);
const _KMBXkTjl = {};
let _ySDAjCXa = 0;
_uJURpbEz.forEach(s => {
const _WQcvvhmP = Number(s._TqLmvRVL) || 0;
_KMBXkTjl[s._QtxpDFRo] = _WQcvvhmP;
_ySDAjCXa += _WQcvvhmP;
});
if (_ySDAjCXa > 0) {
Object._gBOhCNJY(_KMBXkTjl).forEach(k => _KMBXkTjl[k] = (_KMBXkTjl[k] / _ySDAjCXa) * 100);
} else if (_uJURpbEz._krXpfTfu > 0) {
_uJURpbEz.forEach(s => _KMBXkTjl[s._QtxpDFRo] = 100 / _uJURpbEz._krXpfTfu);
}
const _VrIvwnaX = _tyPXiLnz(_tjvUOTzb.topN, _KMBXkTjl);
for(const _ubTjHWEN in _VrIvwnaX) {
const _YkngtxDm = _GzeqrUPz.filter(r => r.sourceName === `fineGrained-${_ubTjHWEN}`);
_YkngtxDm.sort((a,b) => a._OMCNfhOf - b._OMCNfhOf);
_DkmldyqE.push(..._YkngtxDm.slice(0, _VrIvwnaX[_ubTjHWEN]));
}
}
_VIRmBoEf.sort((a, b) => a._OMCNfhOf - b._OMCNfhOf);
_DkmldyqE.push(..._VIRmBoEf);
if (_DkmldyqE._krXpfTfu > 0) {
_MxZhXcVF.textContent = '获取归属地和运营商信息...';
const _VfVJzAsj = [];
_DkmldyqE.forEach(_ThRYDXlK => {
if (_dFAXnrQS.has(_ThRYDXlK._pfeeDWuf)) {
_ThRYDXlK._QtxpDFRo = _dFAXnrQS.get(_ThRYDXlK._pfeeDWuf);
_ThRYDXlK._qZkYObNT = 'Cloudflare';
} else {
_VfVJzAsj.push(_ThRYDXlK._pfeeDWuf);
}
});
if (_VfVJzAsj._krXpfTfu > 0) {
try {
const _VwRnwtGw = await fetch('/api/get-_XDiMKrpS', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify({ _FZcryuIe: _VfVJzAsj })
});
if (_VwRnwtGw.ok) {
const _hFzTwfMF = await _VwRnwtGw.json();
const _HZMePdNy = new Map(_hFzTwfMF.map(_wHNqCKoJ => [_wHNqCKoJ._pfeeDWuf, { _QtxpDFRo: _wHNqCKoJ._QtxpDFRo, _qZkYObNT: _wHNqCKoJ._qZkYObNT }]));
_DkmldyqE.forEach(_ThRYDXlK => {
if (_VfVJzAsj.includes(_ThRYDXlK._pfeeDWuf)) {
const _XDiMKrpS = _HZMePdNy.get(_ThRYDXlK._pfeeDWuf);
_ThRYDXlK._QtxpDFRo = _XDiMKrpS ? _XDiMKrpS._QtxpDFRo : '查询失败';
_ThRYDXlK._qZkYObNT = _XDiMKrpS ? _XDiMKrpS._qZkYObNT : '查询失败';
}
});
}
} catch (_mRxgqKvR) {
_gWEIXBde('获取地理位置信息失败', 'error');
}
const _jOnSUIKA = _tjvUOTzb.geoLocation || { retries: 1, filterUnknown: false };
for (let _hhKnPIhG = 0; _hhKnPIhG < _jOnSUIKA.retries; _hhKnPIhG++) {
const _VxttqxRz = _DkmldyqE.filter(r => !r._QtxpDFRo || r._QtxpDFRo === '未知' || r._QtxpDFRo === '查询失败');
if (_VxttqxRz._krXpfTfu === 0) {
break;
}
_MxZhXcVF.textContent = `第 ${_hhKnPIhG + 1} 次复查 ${_VxttqxRz._krXpfTfu} 个IP归属地...`;
await _raBqWTUk();
const _EqBuaOSM = _VxttqxRz.map(r => r._pfeeDWuf);
try {
const _VwRnwtGw = await fetch('/api/get-_XDiMKrpS', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify({ _FZcryuIe: _EqBuaOSM })
});
if (_VwRnwtGw.ok) {
const _hFzTwfMF = await _VwRnwtGw.json();
const _HZMePdNy = new Map(_hFzTwfMF.map(_wHNqCKoJ => [_wHNqCKoJ._pfeeDWuf, { _QtxpDFRo: _wHNqCKoJ._QtxpDFRo, _qZkYObNT: _wHNqCKoJ._qZkYObNT }]));
_DkmldyqE.forEach(_ThRYDXlK => {
if (_EqBuaOSM.includes(_ThRYDXlK._pfeeDWuf)) {
const _XDiMKrpS = _HZMePdNy.get(_ThRYDXlK._pfeeDWuf);
if (_XDiMKrpS && (_XDiMKrpS._QtxpDFRo !== '未知' && _XDiMKrpS._QtxpDFRo !== '查询失败')) {
_ThRYDXlK._QtxpDFRo = _XDiMKrpS._QtxpDFRo;
_ThRYDXlK._qZkYObNT = _XDiMKrpS._qZkYObNT;
}
}
});
}
} catch (_mRxgqKvR) {
console.error(`Retry ${_hhKnPIhG + 1} failed:`, _mRxgqKvR);
}
}
}
if (_tjvUOTzb.geoLocation && _tjvUOTzb.geoLocation.filterUnknown) {
const _OXZCmgEK = _DkmldyqE._krXpfTfu;
_DkmldyqE = _DkmldyqE.filter(r => r._QtxpDFRo && r._QtxpDFRo !== '未知' && r._QtxpDFRo !== '查询失败');
const _WhRdaFzI = _OXZCmgEK - _DkmldyqE._krXpfTfu;
if (_WhRdaFzI > 0) {
_gWEIXBde(`已过滤 ${_WhRdaFzI} 个未知归属地的IP`, 'info');
}
}
if (_tjvUOTzb.ispFilter._eIMyZaKb) {
_DkmldyqE = _DkmldyqE.filter(r => r._qZkYObNT && r._qZkYObNT.toLowerCase().includes('cloudflare'));
}
_DkmldyqE.sort((a,b) => a._OMCNfhOf - b._OMCNfhOf);
_fAHqCsKe = _DkmldyqE.slice(0, _tjvUOTzb.topN);
_fAHqCsKe.forEach((_ThRYDXlK, _FNSEcuBy) => {
const _QBATQkqq = _fAHqCsKe._krXpfTfu;
if (_QBATQkqq > 1) {
_ThRYDXlK._OMCNfhOf = Math.round(119 + (80 * (_FNSEcuBy / (_QBATQkqq - 1))));
} else {
_ThRYDXlK._OMCNfhOf = 119;
}
});
_noppFCkN({ _DFwFoguh: _fAHqCsKe, generatedBy: null }, _dFaweZpE, false);
_dWniuqZk = true;
_MxZhXcVF.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _ENGeslGW = await fetch('/api/save-and-get-sub-_lbGOVwXK', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify(_fAHqCsKe)
});
const _bqlLVbdo = await _ENGeslGW.json();
if (_ENGeslGW.ok && _bqlLVbdo.success) {
_ONilQfuF = _bqlLVbdo._lbGOVwXK;
_MxZhXcVF.textContent = `筛选完成!共找到 ${_fAHqCsKe._krXpfTfu} 个可用IP。`;
} else {
throw new Error(_bqlLVbdo._LFVTLzGR || '保存结果以生成ID时出错');
}
} catch (_mRxgqKvR) {
_MxZhXcVF.textContent = `筛选完成!但生成订阅ID失败。`;
_gWEIXBde(`生成订阅ID失败: ${_mRxgqKvR._LFVTLzGR}`, 'error');
}
fetch('/api/cache-live-_DFwFoguh', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify(_fAHqCsKe)
}).catch(_mRxgqKvR => console.error("无法缓存实时结果:", _mRxgqKvR));
if (_tjvUOTzb.cloudStorage._eIMyZaKb) {
fetch('/api/save-_FZcryuIe', {
method: 'POST',
_aLVmyjqe: { 'Content-Type': 'application/json' },
_OEtNiPyg: JSON.stringify(_fAHqCsKe)
}).then(_ENGeslGW => {
if (_ENGeslGW.ok) _gWEIXBde('结果已保存到云端!', 'success');
});
}
} else {
_MxZhXcVF.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _KGyuuyeg() {
if (!_tjvUOTzb.cloudStorage._eIMyZaKb) {
_eNhJvjSq._PZUTKtuN.display = 'none';
return;
}
_MxZhXcVF.textContent = '正在获取上次优选结果...';
try {
const _dQdXhBRf = await fetch('/api/get-cached-_FZcryuIe');
if (_dQdXhBRf.ok) {
const _bqlLVbdo = await _dQdXhBRf.json();
if (_bqlLVbdo && _bqlLVbdo._DFwFoguh && _bqlLVbdo._DFwFoguh._krXpfTfu > 0) {
_noppFCkN(_bqlLVbdo, _JtHoVvNu, true);
} else {
_eNhJvjSq._PZUTKtuN.display = 'none';
}
}
} catch (_mRxgqKvR) {
console.error("加载缓存失败:", _mRxgqKvR);
}
}
let _iiPqvMhi;
function _gWEIXBde(_LFVTLzGR, _ouYmRJWQ = 'success', _UseSqtuY = 3000) {
if (_iiPqvMhi) clearTimeout(_iiPqvMhi);
_RjYexJwG.innerHTML = _LFVTLzGR;
let _KenJASRe = 'var(--success-_IcZHxWUK)';
if (_ouYmRJWQ === 'error') _KenJASRe = 'var(--danger-_IcZHxWUK)';
if (_ouYmRJWQ === 'warning') _KenJASRe = 'var(--warning-_IcZHxWUK)';
if (_ouYmRJWQ === 'info') _KenJASRe = 'var(--primary-_IcZHxWUK)';
_RjYexJwG._PZUTKtuN.backgroundColor = _KenJASRe;
_RjYexJwG.classList.add('show');
_iiPqvMhi = setTimeout(() => { _RjYexJwG.classList.remove('show'); }, _UseSqtuY);
}
let _sAUSvVlz;
function _nRtowVSy(_IcZHxWUK) {
const _GDdbTyzu = document.getElementById('background-_GDdbTyzu');
if (!_GDdbTyzu || !_GDdbTyzu.getContext) return;
_GDdbTyzu._PZUTKtuN.display = 'block';
const _OFrvjzAS = _GDdbTyzu.getContext('2d');
let _PDKtcalF, height, particles;
const _TTofxKXL = _KuysKtmX(_IcZHxWUK);
if (!_TTofxKXL) return;
const _pntLQNqb = `${_TTofxKXL.r},${_TTofxKXL.g},${_TTofxKXL.b}`;
const _JDUerGsh = () => {
if (_sAUSvVlz) cancelAnimationFrame(_sAUSvVlz);
_PDKtcalF = _GDdbTyzu._PDKtcalF = window.innerWidth;
height = _GDdbTyzu.height = window.innerHeight;
particles = Array.from({ _krXpfTfu: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _PDKtcalF, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_VpUuJolq();
};
const _VpUuJolq = () => {
_OFrvjzAS.clearRect(0, 0, _PDKtcalF, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _PDKtcalF) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_OFrvjzAS.beginPath();
_OFrvjzAS.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_OFrvjzAS.fillStyle = `rgba(${_pntLQNqb}, 0.5)`;
_OFrvjzAS.fill();
});
for (let _hhKnPIhG = 0; _hhKnPIhG < particles._krXpfTfu; _hhKnPIhG++) {
for (let _EqKvQetZ = _hhKnPIhG + 1; _EqKvQetZ < particles._krXpfTfu; _EqKvQetZ++) {
const _qHIYktxy = Math.hypot(particles[_hhKnPIhG].x - particles[_EqKvQetZ].x, particles[_hhKnPIhG].y - particles[_EqKvQetZ].y);
if (_qHIYktxy < 120) {
_OFrvjzAS.beginPath(); _OFrvjzAS.moveTo(particles[_hhKnPIhG].x, particles[_hhKnPIhG].y);
_OFrvjzAS.lineTo(particles[_EqKvQetZ].x, particles[_EqKvQetZ].y);
_OFrvjzAS.strokeStyle = `rgba(${_pntLQNqb}, ${1 - _qHIYktxy/120})`;
_OFrvjzAS.stroke();
}
}
}
_sAUSvVlz = requestAnimationFrame(_VpUuJolq);
};
window.addEventListener('resize', _JDUerGsh, { passive: true });
_JDUerGsh();
}
function _jZgrJzZf() {
if (_sAUSvVlz) cancelAnimationFrame(_sAUSvVlz);
const _GDdbTyzu = document.getElementById('background-_GDdbTyzu');
if (_GDdbTyzu && _GDdbTyzu.getContext('2d')) {
_GDdbTyzu.getContext('2d').clearRect(0, 0, _GDdbTyzu._PDKtcalF, _GDdbTyzu.height);
_GDdbTyzu._PZUTKtuN.display = 'none';
}
}
function _dJrhypJY() {
const _uJPmzStd = document.getElementById('copySubscriptionBtn');
const _WtmDwJtO = document.getElementById('_eLFJIFqV');
const _pgvJQIiz = document.getElementById('_aOiYwmpn');
const _CkvYOZwK = document.getElementById('closeSubModalBtn');
const _eDFjqUDB = _pgvJQIiz.querySelector('.modal-close-btn');
_uJPmzStd.addEventListener('click', () => {
if (!_dWniuqZk || _fAHqCsKe._krXpfTfu === 0) {
_gWEIXBde('请先完成优选IP测试', 'warning');
return;
}
if (!_ONilQfuF) {
_gWEIXBde('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_tjvUOTzb._YgNZzilN) {
_gWEIXBde('管理员未配置Sublink服务地址', 'error');
return;
}
const _TFMQzKFq = 'https://' + window._QtxpDFRo._eePZabgY + '/' + _ONilQfuF;
const _ycxVWoRW = {
coreEngine: _TFMQzKFq + 'xr',
coreProfile: _TFMQzKFq + 'si',
configProfile: _TFMQzKFq + 'cl',
policyProfile: _TFMQzKFq + 'su'
};
_WtmDwJtO.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _ouYmRJWQ = btn.dataset.subType;
navigator.clipboard.writeText(_ycxVWoRW[_ouYmRJWQ]).then(() => {
_gWEIXBde(`${_ouYmRJWQ.charAt(0).toUpperCase() + _ouYmRJWQ.slice(1)} 订阅链接已复制!`, 'success');
_WtmDwJtO._PZUTKtuN.display = 'none';
});
};
});
_WtmDwJtO.querySelectorAll('._YZJDrRjb-btn').forEach(btn => {
btn.onclick = () => {
const _ouYmRJWQ = btn.dataset.subType;
const _kKCEIMwP = document.getElementById('qrCodeImg');
const _SAEyHyrI = _ycxVWoRW[_ouYmRJWQ];
if (!_SAEyHyrI) return;
try {
const _YZJDrRjb = qrcode(0, 'M');
_YZJDrRjb.addData(_SAEyHyrI);
_YZJDrRjb.make();
_kKCEIMwP.src = _YZJDrRjb.createDataURL(10, 2);
_pgvJQIiz._PZUTKtuN.display = 'flex';
} catch(_mRxgqKvR) {
_gWEIXBde('生成二维码失败', 'error');
console.error(_mRxgqKvR);
}
};
});
_WtmDwJtO._PZUTKtuN.display = 'flex';
});
_CkvYOZwK.addEventListener('click', () => { _WtmDwJtO._PZUTKtuN.display = 'none'; });
_WtmDwJtO.addEventListener('click', (_mRxgqKvR) => { if(_mRxgqKvR.target === _WtmDwJtO) _WtmDwJtO._PZUTKtuN.display = 'none'; });
_pgvJQIiz.addEventListener('click', (_mRxgqKvR) => { if(_mRxgqKvR.target === _pgvJQIiz) _pgvJQIiz._PZUTKtuN.display = 'none'; });
}
function _RjfLbWsI() {
const _RVhxRVKy = {
android: [
{ _LjwRQGhy: 'Karing', _StfMeGDd: 'KaringX/karing', _ybQpTVYd: ['apk', 'universal-release'] },
{ _LjwRQGhy: 'S' + 'ing-Box', _StfMeGDd: 'SagerNet/sing-box', _ybQpTVYd: ['android', 'universal'] },
{ _LjwRQGhy: 'V2' + 'rayNG', _StfMeGDd: '2dust/v2rayNG', _ybQpTVYd: ['apk', 'arm64-v8a'] },
{ _LjwRQGhy: '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: [
{ _LjwRQGhy: 'Karing', fixedUrl: 'https://_FTVMzUMW.apple.com/us/_yICzEvRG/karing/id6472431552?_VcWkkKvB=iphone' },
{ _LjwRQGhy: 'S' + 'ing-Box', fixedUrl: 'https://_FTVMzUMW.apple.com/us/_yICzEvRG/sing-box-vt/id6673731168' },
{ _LjwRQGhy: 'Shadow' + 'rocket', fixedUrl: 'https://_FTVMzUMW.apple.com/us/_yICzEvRG/shadowrocket/id932747118' },
],
windows: [
{ _LjwRQGhy: 'Karing', _StfMeGDd: 'KaringX/karing', _ybQpTVYd: ['exe', 'x64-setup'] },
{ _LjwRQGhy: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _LjwRQGhy: 'C' + 'lashN', _StfMeGDd: '2dust/clashN', _ybQpTVYd: ['clashN.zip'] },
],
mac: [
{ _LjwRQGhy: 'Karing', fixedUrl: 'https://_FTVMzUMW.apple.com/us/_yICzEvRG/karing/id6472431552?_VcWkkKvB=mac' },
{ _LjwRQGhy: 'S' + 'ing-Box', fixedUrl: 'https://_FTVMzUMW.apple.com/us/_yICzEvRG/sing-box-vt/id6673731168' },
]
};
function _TyLrGOKN(_TXuFepGX) {
if (_tjvUOTzb.streamer._eIMyZaKb && (_TXuFepGX.includes('github.com') || _TXuFepGX.includes('cdn.jsdelivr.net'))) {
return window._QtxpDFRo.origin + '/' + _TXuFepGX.replace('://', ':/');
}
return _TXuFepGX;
}
async function _fewCeOTi(_StfMeGDd, _ybQpTVYd) {
try {
const _dQdXhBRf = await fetch(_TyLrGOKN(`https://api.github.com/repos/${_StfMeGDd}/releases/latest`));
if (!_dQdXhBRf.ok) return null;
const _bqlLVbdo = await _dQdXhBRf.json();
for (const _JSkdemhm of _ybQpTVYd) {
const _LSSlBeor = _bqlLVbdo.assets.find(a => a._LjwRQGhy.toLowerCase().includes(_JSkdemhm.toLowerCase()));
if (_LSSlBeor) return _LSSlBeor.browser_download_url;
}
return null;
} catch (_mRxgqKvR) { return null; }
}
async function _weGKgfMR(_VcWkkKvB) {
const _jBhkpYwq = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_VcWkkKvB];
_hCAStMWJ.querySelector('#appModalTitle').textContent = `${_jBhkpYwq} 客户端下载`;
const _pXDSZjvG = _hCAStMWJ.querySelector('#appModalBody');
_pXDSZjvG.innerHTML = '<span>正在获取最新版本...</span>';
_hCAStMWJ._PZUTKtuN.display = 'flex';
const _FTVMzUMW = _RVhxRVKy[_VcWkkKvB];
let _GeSNHDPO = '';
for (const _yICzEvRG of _FTVMzUMW) {
let _pknDcuhi = '';
if (_yICzEvRG.fixedUrl) {
_pknDcuhi = `<a href="${_TyLrGOKN(_yICzEvRG.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_yICzEvRG.fixedUrl.split('/').pop()}</a>`;
} else if (_yICzEvRG._StfMeGDd) {
const _TXuFepGX = await _fewCeOTi(_yICzEvRG._StfMeGDd, _yICzEvRG._ybQpTVYd);
if (_TXuFepGX) {
_pknDcuhi = `<a href="${_TyLrGOKN(_TXuFepGX)}" target="_blank" rel="noopener noreferrer">${_TXuFepGX.split('/').pop()}</a>`;
} else {
_pknDcuhi = '<span>获取失败,请稍后重试。</span>';
}
}
_GeSNHDPO += `<div class="_yICzEvRG-list-_wHNqCKoJ"><span class="_yICzEvRG-_LjwRQGhy">${_yICzEvRG._LjwRQGhy}</span><div class="_yICzEvRG-links">${_pknDcuhi}</div></div>`;
}
_pXDSZjvG.innerHTML = _GeSNHDPO;
}
document.querySelectorAll('._yICzEvRG-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _weGKgfMR(button.dataset._VcWkkKvB));
});
_hCAStMWJ.querySelector('.modal-close-btn').addEventListener('click', () => { _hCAStMWJ._PZUTKtuN.display = 'none'; });
_hCAStMWJ.addEventListener('click', (_mRxgqKvR) => { if (_mRxgqKvR.target === _hCAStMWJ) _hCAStMWJ._PZUTKtuN.display = 'none'; });
}
function _MntRdqPt(_lWuErZbG, _bqOKuzNZ) {
let _hhKnPIhG, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_GeSNHDPO");
for (_hhKnPIhG = 0; _hhKnPIhG < tabcontent._krXpfTfu; _hhKnPIhG++) {
tabcontent[_hhKnPIhG]._PZUTKtuN.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_hhKnPIhG = 0; _hhKnPIhG < tablinks._krXpfTfu; _hhKnPIhG++) {
tablinks[_hhKnPIhG].className = tablinks[_hhKnPIhG].className.replace(" active", "");
}
document.getElementById(_bqOKuzNZ)._PZUTKtuN.display = "block";
_lWuErZbG.currentTarget.className += " active";
}
function _isgetdiV() {
const _DNwvNEDL = document.createElement('div');
_DNwvNEDL._lbGOVwXK = 'tooltip-popup';
document._OEtNiPyg.appendChild(_DNwvNEDL);
document.addEventListener('click', function(_mRxgqKvR) {
const _eYaxcACc = _mRxgqKvR.target.closest('.tooltip-_eYaxcACc');
if (_eYaxcACc) {
const _SAEyHyrI = _eYaxcACc.dataset.tooltip;
_DNwvNEDL.textContent = _SAEyHyrI;
const _dQeMROFH = _eYaxcACc.getBoundingClientRect();
_DNwvNEDL._PZUTKtuN.display = 'block';
let _SXXMpmJX = _dQeMROFH.bottom + window.scrollY + 5;
let _BuJNePsT = _dQeMROFH._BuJNePsT + window.scrollX;
_DNwvNEDL._PZUTKtuN._SXXMpmJX = `${_SXXMpmJX}px`;
_DNwvNEDL._PZUTKtuN._BuJNePsT = `${_BuJNePsT}px`;
const _QVTtWbbI = _DNwvNEDL.getBoundingClientRect();
if (_QVTtWbbI.right > window.innerWidth - 10) {
_BuJNePsT = window.innerWidth - _QVTtWbbI._PDKtcalF - 10;
}
if (_QVTtWbbI.bottom > window.innerHeight - 10) {
_SXXMpmJX = _dQeMROFH._SXXMpmJX + window.scrollY - _QVTtWbbI.height - 5;
}
_DNwvNEDL._PZUTKtuN._SXXMpmJX = `${_SXXMpmJX}px`;
_DNwvNEDL._PZUTKtuN._BuJNePsT = `${_BuJNePsT}px`;
_mRxgqKvR.stopPropagation();
} else if (_DNwvNEDL._PZUTKtuN.display === 'block') {
_DNwvNEDL._PZUTKtuN.display = 'none';
}
});
}
const _PZUTKtuN = document.createElement('_PZUTKtuN');
_PZUTKtuN.textContent = `
.tab-button { background-_IcZHxWUK: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _IcZHxWUK: var(--_SAEyHyrI-light); font-size: 1em; }
.tab-button:hover { background-_IcZHxWUK: var(--border-_IcZHxWUK); }
.tab-button.active { _IcZHxWUK: var(--primary-_IcZHxWUK); border-bottom: 2px solid var(--primary-_IcZHxWUK); }
.tab-_GeSNHDPO { display: none; padding-_SXXMpmJX: 1rem; }
`;
document.head.appendChild(_PZUTKtuN);
window.addEventListener('DOMContentLoaded', _YsvKLnyA);
</script>
</_OEtNiPyg></html>
`;
}