import { connect } from "cloudflare:sockets";
const _BMKAoMvJ = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _ycBlafQc = ["UpstreamAddress.SG.CMLiussss.net"];
const _KwwoSIvN = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _omAVxQlY = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _clSZCYjI = '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 _wrEVWNGV = '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 _eEduCHNh(_qYdVEgAp) {
if (Array.isArray(_qYdVEgAp)) {
try {
return String.fromCharCode.apply(null, _qYdVEgAp);
} catch (_vTnOJGWl) {
return '';
}
}
return _qYdVEgAp;
}
function _sUpaBSeY(_tXrbSgzT) {
return /^[0-9a-_qlEUZcMe]{8}-[0-9a-_qlEUZcMe]{4}-[4][0-9a-_qlEUZcMe]{3}-[89ab][0-9a-_qlEUZcMe]{3}-[0-9a-_qlEUZcMe]{12}$/_WttTsMvn.test(_tXrbSgzT);
}
const _quLUqfWI = "optimized_ips_v4";
const _zRYBXnnc = "global_config_v4";
const _jTdguxXR = "admin_password_v4";
const _bmlhyrRN = "live_results_temp_v1";
const _nysQGodR = "latest_sub_id_v1";
export default {
async fetch(_pPRKjNxr, _nSQmseYZ, _feivJufg) {
try {
if (!_nSQmseYZ.DB) {
const _mVpFyiNF = _laaknjVj("D1 数据库 'DB' 未绑定。");
return new Response(_mVpFyiNF, { status: 503, _pbidZCeg: { 'Content-Type': '_sOwVmliX/html;_cUklIUbo=UTF-8' }});
}
_feivJufg.waitUntil(
_nSQmseYZ.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_liMgYOjx TEXT PRIMARY KEY, _qYdVEgAp TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_tXrbSgzT TEXT PRIMARY KEY, _StOIzJMY TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_vTnOJGWl => console.error("DB Init Error:", _vTnOJGWl._ilbVNPWJ))
);
const _RxoGPLAw = new URL(_pPRKjNxr._RxoGPLAw);
const _vuuvPYsv = _RxoGPLAw.pathname;
const _ZcoZocxM = _pPRKjNxr._pbidZCeg.get("Upgrade");
const _rkwfWFxm = await _WRkjvQPK(_nSQmseYZ);
if (_rkwfWFxm.websocketStreamer && _rkwfWFxm.websocketStreamer._ZDOLLRZZ && _ZcoZocxM && _ZcoZocxM.toLowerCase() === "websocket") {
const _BlOHgvPT = _rkwfWFxm.websocketStreamer._RxoGPLAw;
if (_BlOHgvPT && _BlOHgvPT.trim().startsWith('https://')) {
try {
const _CLuNTcfV = new Request(_BlOHgvPT.trim() + _RxoGPLAw.pathname + _RxoGPLAw.search, _pPRKjNxr);
return await fetch(_CLuNTcfV);
} catch (_vTnOJGWl) {
return new Response(`Upstream WebSocket gateway failed: ${_vTnOJGWl._ilbVNPWJ}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_ZcoZocxM && _ZcoZocxM.toLowerCase() === "websocket") {
return await _GHkNfptf(_pPRKjNxr, _nSQmseYZ, _rkwfWFxm);
}
const _EdfYWnzZ = _vuuvPYsv._dDxxQwsN(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_EdfYWnzZ) {
const [, _oBeeWIXl, typeSuffix] = _EdfYWnzZ;
const _ZVqAwjgJ = _rkwfWFxm._ZVqAwjgJ;
if (!_ZVqAwjgJ || _ZVqAwjgJ.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' } });
}
const _fHEJTwzg = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _fjjKmSzk = _fHEJTwzg[typeSuffix];
const _hdlfIgBZ = _ZVqAwjgJ.replace(/\/$/, '');
const _xbvrKcyG = `${_RxoGPLAw.origin}/${_oBeeWIXl}`;
const _xmnVJqsp = `${_hdlfIgBZ}/${_fjjKmSzk}?_rkwfWFxm=${encodeURIComponent(_xbvrKcyG)}`;
try {
const _oZRMEGeb = await fetch(_xmnVJqsp, { _pbidZCeg: { 'User-Agent': _pPRKjNxr._pbidZCeg.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _iOGpBPDQ = new Headers(_oZRMEGeb._pbidZCeg);
_iOGpBPDQ._xfgJQVuL('Access-Control-Allow-Origin', '*');
return new Response(_oZRMEGeb._jhBOaFbC, { status: _oZRMEGeb.status, statusText: _oZRMEGeb.statusText, _pbidZCeg: _iOGpBPDQ });
} catch (_vTnOJGWl) {
return new Response(`获取上游订阅失败: ${_vTnOJGWl._ilbVNPWJ}`, { status: 502, _pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' } });
}
}
if (_vuuvPYsv.startsWith('/https:/') || _vuuvPYsv.startsWith('/http:/')) {
return _ZqrDfJjm(_pPRKjNxr, _rkwfWFxm);
}
if (_rkwfWFxm.customSubPath && _rkwfWFxm.customSubPath._ZDOLLRZZ && _rkwfWFxm.customSubPath._vuuvPYsv && _vuuvPYsv === '/' + _rkwfWFxm.customSubPath._vuuvPYsv.trim()) {
const _NJGCgaOF = _nSQmseYZ.DB.prepare("SELECT _qYdVEgAp FROM kv_data WHERE _liMgYOjx = ?").bind(_nysQGodR);
const { _NzqybVhr } = await _NJGCgaOF.all();
const _pljBKjrc = _NzqybVhr._fOIlNPKa > 0 ? _NzqybVhr[0]._qYdVEgAp : null;
if (_pljBKjrc) {
return _WYLKNQEo({ _QpcWlPac: { _tXrbSgzT: _pljBKjrc }, _RxoGPLAw: _pPRKjNxr._RxoGPLAw }, _nSQmseYZ);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' } });
}
}
const _pwWfsisa = _vuuvPYsv.split('/').filter(Boolean);
if (_pwWfsisa._fOIlNPKa === 1 && !_vuuvPYsv.startsWith('/api/')) {
const _oBeeWIXl = _pwWfsisa[0];
return _WYLKNQEo({ _QpcWlPac: { _tXrbSgzT: _oBeeWIXl }, _RxoGPLAw: _pPRKjNxr._RxoGPLAw }, _nSQmseYZ);
}
if (_vuuvPYsv.startsWith('/api/')) {
if (_vuuvPYsv === '/api/_rkwfWFxm' && _pPRKjNxr.method === 'POST') return _XSjnIdSe(_pPRKjNxr, _nSQmseYZ, _feivJufg);
if (_vuuvPYsv === '/api/_xfgJQVuL-_knaGgUOU') return _UWQpCoUu(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv === '/api/change-_knaGgUOU') return _MMbAZyZE(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv === '/api/verify-_knaGgUOU') return _TbDujIEO(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv === '/api/verify-visitor-_knaGgUOU' && _pPRKjNxr.method === 'POST') return _IJnDMYSN(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv === '/api/cache-live-_NzqybVhr' && _pPRKjNxr.method === 'POST') return _kcfMvTbu(_pPRKjNxr, _nSQmseYZ, _feivJufg);
if (_vuuvPYsv === '/api/get-_CrTxPtih' && _pPRKjNxr.method === 'POST') return _IGcSkrYr(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv === '/api/get-cached-_HXiPXlgC') return _mNjbmxIM(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv === '/api/save-_HXiPXlgC') return _TNIzwGun(_pPRKjNxr, _nSQmseYZ, _feivJufg);
if (_vuuvPYsv === '/api/save-and-get-sub-_tXrbSgzT' && _pPRKjNxr.method === 'POST') return _TFydssUS(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv.startsWith('/api/get-_bOYOffRu/')) {
const _oBeeWIXl = _vuuvPYsv.split('/').pop();
return _WYLKNQEo({ _QpcWlPac: { _tXrbSgzT: _oBeeWIXl }, _RxoGPLAw: _pPRKjNxr._RxoGPLAw }, _nSQmseYZ);
}
if (_vuuvPYsv === '/api/_rkwfWFxm' && _pPRKjNxr.method === 'GET') return _qtjPJODR(_nSQmseYZ);
if (_vuuvPYsv === '/api/get-resolved-_HXiPXlgC') return _VIvQlgnL(_pPRKjNxr);
if (_vuuvPYsv === '/api/parse-_HXiPXlgC-from-_irTFgash' && _pPRKjNxr.method === 'POST') return _pQnFgZeI(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv === '/api/endpoints') return _tSSpZPfR(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_vuuvPYsv === '/_poAVSnAK') return _GFlONHre(_pPRKjNxr, _nSQmseYZ);
if (_vuuvPYsv === '/bing-wallpaper') return _kRLKRIWV();
return _UJpJjBcG(_pPRKjNxr, _nSQmseYZ, _feivJufg);
} catch (err) {
let _vTnOJGWl = err;
return new Response(_vTnOJGWl.toString(), { status: 500 });
}
}
};
const _YPlTaiLj = { 'Accept': '_sOwVmliX/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 _WbmKTbBV(_RxoGPLAw, _tHmHWPXZ) {
const _AjJnZtxk = await fetch(_RxoGPLAw, { _pbidZCeg: { ..._YPlTaiLj, 'Referer': _tHmHWPXZ.referer } });
if (_AjJnZtxk.ok) return _AjJnZtxk._sOwVmliX();
return null;
}
async function _rjNBHHAh(_RxoGPLAw, _tHmHWPXZ) {
const _wMguZCSb = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_RxoGPLAw)}`;
const _AjJnZtxk = await fetch(_wMguZCSb, { _pbidZCeg: { ..._YPlTaiLj, 'Referer': _tHmHWPXZ.referer } });
if (!_AjJnZtxk.ok) return null;
const _jhBOaFbC = await _AjJnZtxk._sOwVmliX();
const _dDxxQwsN = _jhBOaFbC._dDxxQwsN(/<pre[^>]*>([\s\S]*?)<\/pre>/_WttTsMvn);
return _dDxxQwsN && _dDxxQwsN[1] ? _dDxxQwsN[1].replace(/&/g, '&') : null;
}
function _IobCrYCd(_rRyaxNRG) {
let _LEKZKXtp;
try {
_LEKZKXtp = atob(_rRyaxNRG.replace(/\s/g, ''));
} catch (_vTnOJGWl) {
_LEKZKXtp = _rRyaxNRG;
}
const _bOYOffRu = _LEKZKXtp.split(/[\s\n\r,]+/).filter(line => line.trim());
const _YcrdQbvU = new Set();
const _xowNEpNY = /@([^?#]+?):(\d+)/;
for (const _NOGBNKmE of _bOYOffRu) {
let _fJMnfumW = '';
let _nJZkrPYM = '';
try {
if (_NOGBNKmE.startsWith('vmess://')) {
const _SJxISNpK = atob(_NOGBNKmE.substring(8));
const _rkwfWFxm = JSON.parse(_SJxISNpK);
_fJMnfumW = _rkwfWFxm.add;
_nJZkrPYM = _rkwfWFxm._nJZkrPYM;
} else {
const _dDxxQwsN = _NOGBNKmE._dDxxQwsN(_xowNEpNY);
if (_dDxxQwsN && _dDxxQwsN[1] && _dDxxQwsN[2]) {
_fJMnfumW = _dDxxQwsN[1].replace(/[\[\]]/g, '');
_nJZkrPYM = _dDxxQwsN[2];
}
}
} catch (_vTnOJGWl) {
console.warn(`Could not parse _NOGBNKmE: ${_NOGBNKmE}`);
}
if (_fJMnfumW && _nJZkrPYM) {
_YcrdQbvU.add(`${_fJMnfumW}:${_nJZkrPYM}`);
}
}
return Array.from(_YcrdQbvU);
}
async function _ZsRLsjaN(_fgEBBFnw) {
try {
const _AjJnZtxk = await fetch(_fgEBBFnw, { _pbidZCeg: _YPlTaiLj });
if (!_AjJnZtxk.ok) {
console.error(`Failed to fetch subscription: ${_AjJnZtxk.status}`);
return [];
}
const _rRyaxNRG = await _AjJnZtxk._sOwVmliX();
return _IobCrYCd(_rRyaxNRG);
} catch (error) {
console.error(`Error processing subscription ${_fgEBBFnw}:`, error);
return [];
}
}
async function _YeMKlVto(_rUSloFcX) {
const _wXPvnEUG = _rUSloFcX.trim();
const _MMZFAJkM = /^(vless|vmess|trojan|ss):\/\//.test(_wXPvnEUG);
const _tPXoedlz = (() => {
if (_wXPvnEUG._fOIlNPKa < 20 || _wXPvnEUG.startsWith('http')) return false;
const _vwkFOiEJ = _wXPvnEUG.replace(/\s/g, '');
if (_vwkFOiEJ._fOIlNPKa % 4 !== 0 && !_vwkFOiEJ.includes('=')) return false;
try {
atob(_vwkFOiEJ);
return true;
} catch (_vTnOJGWl) {
return false;
}
})();
if (_MMZFAJkM || _tPXoedlz) {
return _IobCrYCd(_wXPvnEUG).join('\n');
}
const _TnPNbmMt = [
'https://ipdb.api.030101.xyz/?_YkXXsZDo=bestcf&_xWBJapql=true',
'https://ipdb.api.030101.xyz/?_YkXXsZDo=bestproxy&_xWBJapql=true'
];
const _uZsJFYvh = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_WttTsMvn.test(_rUSloFcX) || _rUSloFcX.includes('?_LkLDuScG=');
if (_uZsJFYvh) {
const _HXiPXlgC = await _ZsRLsjaN(_rUSloFcX);
return _HXiPXlgC.join('\n');
}
let _rRyaxNRG = '';
if (_TnPNbmMt.includes(_rUSloFcX)) {
_rRyaxNRG = await _WbmKTbBV(_rUSloFcX, { referer: _rUSloFcX });
if (!_rRyaxNRG || _rRyaxNRG._fOIlNPKa < 8) {
_rRyaxNRG = await _rjNBHHAh(_rUSloFcX, { referer: _rUSloFcX });
}
} else {
try {
const _XGBzfUjE = await fetch(_rUSloFcX, { _pbidZCeg: { 'User-Agent': 'Cloudflare-Worker' } });
if (_XGBzfUjE.ok) {
_rRyaxNRG = await _XGBzfUjE._sOwVmliX();
} else {
console.warn(`Failed to fetch URL ${_rUSloFcX}: ${_XGBzfUjE.status}`);
}
} catch (_vTnOJGWl) {
console.error(`Error fetching URL ${_rUSloFcX}:`, _vTnOJGWl);
}
}
const _bBkURqGl = _IobCrYCd(_rRyaxNRG);
if (_bBkURqGl._fOIlNPKa > 0) {
return _bBkURqGl.join('\n');
}
return _rRyaxNRG || '';
}
async function _ZqrDfJjm(_pPRKjNxr, _rkwfWFxm) {
if (!_rkwfWFxm.streamer._ZDOLLRZZ) {
return new Response('远程流功能未开启', { status: 403 });
}
const _RxoGPLAw = new URL(_pPRKjNxr._RxoGPLAw);
const _qZqTmncz = _RxoGPLAw.pathname.substring(1).replace(':/', '://');
try {
const _xmnVJqsp = new URL(_qZqTmncz);
const _gtBNtLGw = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_gtBNtLGw.some(domain => _xmnVJqsp._fJMnfumW.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _fRbhoYKT = new Headers(_pPRKjNxr._pbidZCeg);
_fRbhoYKT._xfgJQVuL('Host', _xmnVJqsp._fJMnfumW);
_fRbhoYKT._xfgJQVuL('User-Agent', 'CF-Worker-Streamer/1.0');
const _sOjHZrRj = await fetch(_xmnVJqsp.toString(), {
method: _pPRKjNxr.method,
_pbidZCeg: _fRbhoYKT,
_jhBOaFbC: _pPRKjNxr._jhBOaFbC,
});
const _iOGpBPDQ = new Headers(_sOjHZrRj._pbidZCeg);
_iOGpBPDQ._xfgJQVuL('Access-Control-Allow-Origin', '*');
_iOGpBPDQ._xfgJQVuL('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_iOGpBPDQ._xfgJQVuL('Access-Control-Allow-Headers', '*');
_iOGpBPDQ._xfgJQVuL('Cache-Control', 'public, max-age=86400');
_iOGpBPDQ._xfgJQVuL('X-Streamer-Source', 'CF-Worker');
_iOGpBPDQ.delete('_rRyaxNRG-security-policy');
_iOGpBPDQ.delete('x-_rRyaxNRG-security-policy');
_iOGpBPDQ.delete('x-webkit-csp');
return new Response(_sOjHZrRj._jhBOaFbC, {
status: _sOjHZrRj.status,
statusText: _sOjHZrRj.statusText,
_pbidZCeg: _iOGpBPDQ,
});
} catch (_vTnOJGWl) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _GHkNfptf(_pPRKjNxr, _nSQmseYZ, _rkwfWFxm) {
try {
const _XgcAegtV = _rkwfWFxm || await _WRkjvQPK(_nSQmseYZ);
const _GswAOWBV = (_XgcAegtV.itemLink._MKWuFHzh && _XgcAegtV.itemLink._MKWuFHzh[0]) || {};
const _DKsyjMHu = _GswAOWBV['_LkLDuScG'] || _eEduCHNh(_BMKAoMvJ);
if (!_sUpaBSeY(_DKsyjMHu)) {
throw new Error("Configured user _eVPeWugl is not valid.");
}
const _aDfnWPkr = _XgcAegtV.dataFeeds.universalFallbackAddress;
let _ByyQeKyq = {};
const _vVrZzimF = _eEduCHNh(_ycBlafQc[0] || "");
if (_aDfnWPkr) {
const [_rguAXScB, _nJZkrPYM = '443'] = _aDfnWPkr.split(':');
_ByyQeKyq = { _rguAXScB, _nJZkrPYM };
} else {
const [_rguAXScB, _nJZkrPYM = '443'] = _vVrZzimF.split(':');
_ByyQeKyq = { _rguAXScB, _nJZkrPYM };
}
const _RxoGPLAw = new URL(_pPRKjNxr._RxoGPLAw);
const _vuuvPYsv = _RxoGPLAw.pathname;
let _EbuDQkwr = '';
const _pFwZspAa = _RxoGPLAw.searchParams.get('remote');
if (_pFwZspAa) {
_EbuDQkwr = atob(_pFwZspAa);
} else if (_vuuvPYsv.startsWith('/endpoint=')) {
_EbuDQkwr = _vuuvPYsv.substring(10);
} else if (_vuuvPYsv._fOIlNPKa > 1 && _vuuvPYsv.substring(1).includes('.')) {
_EbuDQkwr = _vuuvPYsv.substring(1);
}
if (_EbuDQkwr) {
const [_rguAXScB, _nJZkrPYM = '443'] = _EbuDQkwr.split(':');
_ByyQeKyq = { _rguAXScB, _nJZkrPYM };
}
return await _ewQdzlZw(_pPRKjNxr, _DKsyjMHu, _ByyQeKyq);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _ewQdzlZw(_pPRKjNxr, _eVPeWugl, _ByyQeKyq) {
const _TllNbsFc = new WebSocketPair();
const [clientEnd, _ujBUDVqX] = Object.values(_TllNbsFc);
_ujBUDVqX.accept();
let _xbEwNXpn = { _VdmknWcl: null };
const _AgjIAEuw = _pPRKjNxr._pbidZCeg.get("sec-websocket-protocol") || "";
const _HLFgzBNn = _bHUHzBBc(_ujBUDVqX, _AgjIAEuw);
_HLFgzBNn.pipeTo(new WritableStream({
async write(chunk) {
if (_xbEwNXpn._VdmknWcl) {
const _yBYvdylg = _xbEwNXpn._VdmknWcl.writable.getWriter();
await _yBYvdylg.write(chunk);
_yBYvdylg.releaseLock();
return;
}
const { error, details } = await _pAsifdqI(chunk, _eVPeWugl);
if (error) {
throw new Error(details);
}
const _rtjIkADm = new Uint8Array([details._ztcqkpJP[0], 0]);
const _HwAOZPpC = chunk.slice(details.payloadIndex);
await _ASKfPRLF(_xbEwNXpn, details._EiypHkrt, details._AOWTVFJZ, _HwAOZPpC, _ujBUDVqX, _rtjIkADm, _ByyQeKyq);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_yeIGSNFG(_ujBUDVqX);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _ASKfPRLF(_xbEwNXpn, _EiypHkrt, _AOWTVFJZ, _vqIWYazm, _ydianQAX, _rtjIkADm, _clMNBZbW) {
const _YJkMclcq = async (_rguAXScB, _nJZkrPYM) => {
let _olgdIAaM = _rguAXScB;
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(_rguAXScB)) {
_olgdIAaM = `${atob('d3d3Lg==')}${_rguAXScB}${atob('LnNzbGlwLmlv')}`;
}
const _VdmknWcl = connect({ _fJMnfumW: _olgdIAaM, _nJZkrPYM });
_xbEwNXpn._VdmknWcl = _VdmknWcl;
const _yBYvdylg = _VdmknWcl.writable.getWriter();
await _yBYvdylg.write(_vqIWYazm);
_yBYvdylg.releaseLock();
return _VdmknWcl;
};
const _HXBcekRk = async () => {
if (!_clMNBZbW._rguAXScB) return;
console.log(`Direct connection failed, falling back to gateway: ${_clMNBZbW._rguAXScB}`);
const _GWhwaCon = await _YJkMclcq(_clMNBZbW._rguAXScB, parseInt(_clMNBZbW._nJZkrPYM, 10));
_GWhwaCon.closed.catch(() => {}).finally(() => _yeIGSNFG(_ydianQAX));
_HiiPcTjA(_GWhwaCon, _ydianQAX, _rtjIkADm, null);
};
try {
const _ISDRwRyX = await _YJkMclcq(_EiypHkrt, _AOWTVFJZ);
_HiiPcTjA(_ISDRwRyX, _ydianQAX, _rtjIkADm, _HXBcekRk);
} catch (err) {
console.error("Primary connection failed:", err);
await _HXBcekRk();
}
}
function _bHUHzBBc(_ujBUDVqX, _AgjIAEuw) {
let _hKnKqCdH = false;
return new ReadableStream({
start(_MVaeyaxC) {
_ujBUDVqX.addEventListener("_ilbVNPWJ", (event) => { if (_hKnKqCdH) return; _MVaeyaxC.enqueue(event._StOIzJMY); });
_ujBUDVqX.addEventListener("close", () => { _yeIGSNFG(_ujBUDVqX); if (_hKnKqCdH) return; _MVaeyaxC.close(); });
_ujBUDVqX.addEventListener("error", (err) => _MVaeyaxC.error(err));
if (_AgjIAEuw) {
try {
const _iFJhAOJF = atob(_AgjIAEuw.replace(/-/g, "+").replace(/_/g, "/"));
_MVaeyaxC.enqueue(Uint8Array.from(_iFJhAOJF, c => c.charCodeAt(0))._Rydxtgtc);
} catch (_vTnOJGWl) { console.error("Failed to decode early _StOIzJMY:", _vTnOJGWl); }
}
},
cancel() { _hKnKqCdH = true; _yeIGSNFG(_ujBUDVqX); },
});
}
async function _pAsifdqI(_Rydxtgtc, _eVPeWugl) {
if (_Rydxtgtc.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _ztcqkpJP = new Uint8Array(_Rydxtgtc.slice(0, 1));
const _qdNAQvjK = _XGORItYl(new Uint8Array(_Rydxtgtc.slice(1, 17)));
if (_qdNAQvjK !== _eVPeWugl) return { error: true, details: "Invalid _eVPeWugl" };
const _ERmNUzDq = new Uint8Array(_Rydxtgtc.slice(17, 18))[0];
const _zfsdrFsK = new Uint8Array(_Rydxtgtc.slice(18 + _ERmNUzDq, 19 + _ERmNUzDq))[0];
if (_zfsdrFsK !== 1) return { error: true, details: `Unsupported _zfsdrFsK: ${_zfsdrFsK}` };
const _rfExtMKV = 19 + _ERmNUzDq;
const _AOWTVFJZ = new DataView(_Rydxtgtc.slice(_rfExtMKV, _rfExtMKV + 2)).getUint16(0);
let _niDielGD = _rfExtMKV + 2;
const _KqaqbdYd = new Uint8Array(_Rydxtgtc.slice(_niDielGD, _niDielGD + 1))[0];
let _GRTTqHeh = 0;
let _CKucBeSW = _niDielGD + 1;
let _EiypHkrt = "";
switch (_KqaqbdYd) {
case 1: _GRTTqHeh = 4; _EiypHkrt = new Uint8Array(_Rydxtgtc.slice(_CKucBeSW, _CKucBeSW + _GRTTqHeh)).join("."); break;
case 2: _GRTTqHeh = new Uint8Array(_Rydxtgtc.slice(_CKucBeSW, _CKucBeSW + 1))[0]; _CKucBeSW++; _EiypHkrt = new TextDecoder().decode(_Rydxtgtc.slice(_CKucBeSW, _CKucBeSW + _GRTTqHeh)); break;
case 3: _GRTTqHeh = 16; const _oCgJZeXy = new DataView(_Rydxtgtc.slice(_CKucBeSW, _CKucBeSW + _GRTTqHeh)); const _FsejDZJy = []; for (let _WttTsMvn = 0; _WttTsMvn < 8; _WttTsMvn++) _FsejDZJy.push(_oCgJZeXy.getUint16(_WttTsMvn * 2).toString(16)); _EiypHkrt = _FsejDZJy.join(":"); break;
default: return { error: true, details: `Invalid _CFeneMIG _YkXXsZDo: ${_KqaqbdYd}` };
}
if (!_EiypHkrt) return { error: true, details: "Target _rguAXScB is empty" };
return { error: false, details: { _EiypHkrt, _AOWTVFJZ, _ztcqkpJP, payloadIndex: _CKucBeSW + _GRTTqHeh } };
}
async function _HiiPcTjA(_VdmknWcl, _ydianQAX, _kLGOFDvE, _kHZvkPpo) {
let _bFhHgBtV = _kLGOFDvE;
let _DhZLhBfG = false;
let _spWKejzV = _VdmknWcl._HLFgzBNn.pipeTo(new WritableStream({
write(chunk) {
_DhZLhBfG = true;
if (_ydianQAX.readyState !== 1) throw new Error("Channel is not open");
if (_bFhHgBtV) {
const _KzIdFBrz = new Uint8Array(_bFhHgBtV.byteLength + chunk.byteLength);
_KzIdFBrz._xfgJQVuL(new Uint8Array(_bFhHgBtV));
_KzIdFBrz._xfgJQVuL(new Uint8Array(chunk), _bFhHgBtV.byteLength);
_ydianQAX.send(_KzIdFBrz._Rydxtgtc);
_bFhHgBtV = null;
} else {
_ydianQAX.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _ydianQAX error:", err._ilbVNPWJ);
});
await _spWKejzV;
if (!_DhZLhBfG && _kHZvkPpo) {
_kHZvkPpo();
}
}
function _yeIGSNFG(_ydianQAX) {
try { if (_ydianQAX.readyState === 1 || _ydianQAX.readyState === 2) _ydianQAX.close(); } catch (_vTnOJGWl) {}
}
const _njHzAjZK = Array.from({ _fOIlNPKa: 256 }, (_, _WttTsMvn) => (_WttTsMvn + 256).toString(16).slice(1));
function _XGORItYl(_sivzZGTz, offset = 0) {
return (
_njHzAjZK[_sivzZGTz[offset]] + _njHzAjZK[_sivzZGTz[offset + 1]] + _njHzAjZK[_sivzZGTz[offset + 2]] + _njHzAjZK[_sivzZGTz[offset + 3]] + "-" +
_njHzAjZK[_sivzZGTz[offset + 4]] + _njHzAjZK[_sivzZGTz[offset + 5]] + "-" +
_njHzAjZK[_sivzZGTz[offset + 6]] + _njHzAjZK[_sivzZGTz[offset + 7]] + "-" +
_njHzAjZK[_sivzZGTz[offset + 8]] + _njHzAjZK[_sivzZGTz[offset + 9]] + "-" +
_njHzAjZK[_sivzZGTz[offset + 10]] + _njHzAjZK[_sivzZGTz[offset + 11]] +
_njHzAjZK[_sivzZGTz[offset + 12]] + _njHzAjZK[_sivzZGTz[offset + 13]] +
_njHzAjZK[_sivzZGTz[offset + 14]] + _njHzAjZK[_sivzZGTz[offset + 15]]
).toLowerCase();
}
let _JQSJmZHn = { "N/A":"未知" };
async function _dAokgOzw(_RxoGPLAw, _neSJARWz, _kHZvkPpo) {
try {
const _AjJnZtxk = await fetch(_RxoGPLAw, {
_pbidZCeg: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_AjJnZtxk.ok) {
console.error(`获取 ${_RxoGPLAw} 失败: HTTP ${_AjJnZtxk.status}`);
return _kHZvkPpo;
}
const _sOwVmliX = await _AjJnZtxk._sOwVmliX();
return _neSJARWz(_sOwVmliX);
} catch (error) {
console.error(`获取或解析 ${_RxoGPLAw} 时发生网络错误: ${error._ilbVNPWJ}`);
return _kHZvkPpo;
}
}
function _zCYyOPKY(_sOwVmliX) {
if (!_sOwVmliX) return [];
const _IBqvwLKy = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _lmHBtGLk = _sOwVmliX.split(/[\s,;#|]+/);
const _JTbBNyWM = [];
for (const _bkmhQhYi of _lmHBtGLk) {
const _elJwhvLY = _bkmhQhYi.trim();
if (!_elJwhvLY) continue;
const _noeHRrbx = _elJwhvLY.lastIndexOf(':');
let _xOnYQxeD = _elJwhvLY;
if(_noeHRrbx > _elJwhvLY.lastIndexOf(']')) {
const _UxIVmBoi = _elJwhvLY.substring(_noeHRrbx + 1);
if(!isNaN(_UxIVmBoi) && _UxIVmBoi._fOIlNPKa > 0) {
_xOnYQxeD = _elJwhvLY.substring(0, _noeHRrbx);
}
}
if (_RALxcoXj.isValid(_xOnYQxeD.replace(/[\[\]]/g, '')) || _IBqvwLKy.test(_elJwhvLY)) {
_JTbBNyWM.push(_elJwhvLY);
}
}
return _JTbBNyWM;
}
function _HbptszBB(_sOwVmliX) {
if (!_sOwVmliX) return [];
return _sOwVmliX.split(/\s+/).filter(d => d.trim() !== '');
}
function _GWsZmIsg(_sOwVmliX) {
if (!_sOwVmliX) return { "N/A": "未知" };
try {
return JSON.parse(`{${_sOwVmliX}}`);
} catch (_vTnOJGWl) {
console.error("解析 _JQSJmZHn 失败:", _vTnOJGWl);
return { "N/A": "未知" };
}
}
const _RALxcoXj = {
isValid: (_poAVSnAK) => _RALxcoXj.isIPv4(_poAVSnAK) || _RALxcoXj.isIPv6(_poAVSnAK),
isIPv4: (_poAVSnAK) => {
if (typeof _poAVSnAK !== 'string') return false;
const _FsejDZJy = _poAVSnAK.split('.');
if (_FsejDZJy._fOIlNPKa !== 4) return false;
return _FsejDZJy.every(_lQDNQBBg => {
const _rZZlRSNI = parseInt(_lQDNQBBg, 10);
return !isNaN(_rZZlRSNI) && _rZZlRSNI >= 0 && _rZZlRSNI <= 255 && String(_rZZlRSNI) === _lQDNQBBg;
});
},
isIPv6: (_poAVSnAK) => {
if (typeof _poAVSnAK !== '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]))$/_WttTsMvn.test(_poAVSnAK);
},
toLong4: (_poAVSnAK) => _poAVSnAK.split('.').reduce((acc, octet, _WttTsMvn) => acc + (parseInt(octet) << (8*(3-_WttTsMvn))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_poAVSnAK) => {
try {
const _ikRleSvV = _poAVSnAK.split('/')[0];
const _FsejDZJy = _ikRleSvV.split('::');
if (_FsejDZJy._fOIlNPKa > 2) return 0n;
let _glvnXgIL = [];
if (_FsejDZJy[0]) {
_glvnXgIL = _FsejDZJy[0].split(':');
}
let _ESXUrPsi = [];
if (_FsejDZJy._fOIlNPKa > 1 && _FsejDZJy[1]) {
_ESXUrPsi = _FsejDZJy[1].split(':');
}
if (_glvnXgIL._fOIlNPKa + _ESXUrPsi._fOIlNPKa > 8) return 0n;
const _wUgyROfP = 8 - (_glvnXgIL._fOIlNPKa + _ESXUrPsi._fOIlNPKa);
const _FcdwrEdA = [
..._glvnXgIL,
...Array(_wUgyROfP).fill('0'),
..._ESXUrPsi
].map(_lQDNQBBg => _lQDNQBBg || '0');
while(_FcdwrEdA._fOIlNPKa < 8) {
_FcdwrEdA.push('0');
}
let _bCgbzvue = 0n;
for (const _lQDNQBBg of _FcdwrEdA) {
if (_lQDNQBBg._fOIlNPKa > 4) return 0n;
const _qYdVEgAp = BigInt('0x' + _lQDNQBBg);
_bCgbzvue = (_bCgbzvue << 16n) | _qYdVEgAp;
}
return _bCgbzvue;
} catch(_vTnOJGWl) {
return 0n;
}
},
fromBigInt6: (_bCgbzvue) => {
if (typeof _bCgbzvue !== '_bCgbzvue' || _bCgbzvue < 0n) return null;
const _FsejDZJy = [];
for (let _WttTsMvn = 0; _WttTsMvn < 8; _WttTsMvn++) {
_FsejDZJy.unshift((_bCgbzvue & 0xFFFFn).toString(16));
_bCgbzvue >>= 16n;
}
let _MICeYxiq = { start: -1, _kZKaHkgA: 0 };
let _IdcBAIAh = { start: -1, _kZKaHkgA: 0 };
for (let _WttTsMvn = 0; _WttTsMvn < 8; _WttTsMvn++) {
if (_FsejDZJy[_WttTsMvn] === '0') {
if (_IdcBAIAh.start === -1) _IdcBAIAh.start = _WttTsMvn;
_IdcBAIAh._kZKaHkgA++;
} else {
if (_IdcBAIAh._kZKaHkgA > _MICeYxiq._kZKaHkgA) _MICeYxiq = { ..._IdcBAIAh };
_IdcBAIAh = { start: -1, _kZKaHkgA: 0 };
}
}
if (_IdcBAIAh._kZKaHkgA > _MICeYxiq._kZKaHkgA) _MICeYxiq = { ..._IdcBAIAh };
if (_MICeYxiq._kZKaHkgA > 1) {
_FsejDZJy.splice(_MICeYxiq.start, _MICeYxiq._kZKaHkgA, '');
if (_MICeYxiq.start === 0) _FsejDZJy.unshift('');
if (_MICeYxiq.start + _MICeYxiq._kZKaHkgA === 8) _FsejDZJy.push('');
}
return _FsejDZJy.join(':');
},
cidrToRange: (cidr, _SQjLImba = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _WtbuSQUI = parseInt(bitsStr, 10);
const _HXiPXlgC = new Set();
if (_RALxcoXj.isIPv4(range)) {
if (isNaN(_WtbuSQUI) || _WtbuSQUI < 8 || _WtbuSQUI > 32) return [];
if (_WtbuSQUI === 32) return [range];
const _yRKglXvc = _RALxcoXj.toLong4(range);
const _OKsTfdsX = (0xFFFFFFFF << (32 - _WtbuSQUI)) >>> 0;
const _sERmNaea = _yRKglXvc & _OKsTfdsX;
const _GDKtAhgL = 1 << (32 - _WtbuSQUI);
if (_GDKtAhgL <= 2) return [];
const _iaVZfICf = Math.min(_SQjLImba, _GDKtAhgL - 2);
let _YuJbuOUA = 0;
while (_HXiPXlgC.size < _iaVZfICf && _YuJbuOUA < _iaVZfICf * 5) {
const _XSLycbbb = Math.floor(Math.random() * (_GDKtAhgL - 2)) + 1;
_HXiPXlgC.add(_RALxcoXj.fromLong4((_sERmNaea + _XSLycbbb) >>> 0));
_YuJbuOUA++;
}
return Array.from(_HXiPXlgC);
} else if (_RALxcoXj.isIPv6(range)) {
if (isNaN(_WtbuSQUI) || _WtbuSQUI < 16 || _WtbuSQUI > 128) return [];
if (_WtbuSQUI === 128) return [range];
const _BMdpQBBy = _RALxcoXj.toBigInt6(range);
const _OKsTfdsX = (2n ** BigInt(128 - _WtbuSQUI) - 1n);
const _sERmNaea = _BMdpQBBy & ~_OKsTfdsX;
const _oIBXJugd = 2n ** BigInt(128 - _WtbuSQUI);
if (_oIBXJugd <= 2n) return [];
let _YuJbuOUA = 0;
while (_HXiPXlgC.size < _SQjLImba && _YuJbuOUA < _SQjLImba * 5) {
const _RNxnOkMZ = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_RNxnOkMZ);
let _wyCEYVZT = 0n;
for (const _eMQyhgRU of _RNxnOkMZ) {
_wyCEYVZT = (_wyCEYVZT << 8n) | BigInt(_eMQyhgRU);
}
const _XSLycbbb = _wyCEYVZT % (_oIBXJugd - 2n) + 1n;
_HXiPXlgC.add(_RALxcoXj.fromBigInt6(_sERmNaea + _XSLycbbb));
_YuJbuOUA++;
}
return Array.from(_HXiPXlgC);
}
return [];
} catch(_vTnOJGWl) {
console.error(`CIDR to range failed for ${cidr}:`, _vTnOJGWl);
return [];
}
}
};
function _bWOWJSPc(_yuXrDIqy, _HpmAvQJV) {
const _RrwYwAtN = {};
const _bkLDTKLh = Object._bkLDTKLh(_HpmAvQJV);
const _FsejDZJy = _bkLDTKLh.map(_liMgYOjx => {
const _xNvsKbVN = _yuXrDIqy * (_HpmAvQJV[_liMgYOjx] / 100);
return { _liMgYOjx, _SQjLImba: Math.floor(_xNvsKbVN), remainder: _xNvsKbVN - Math.floor(_xNvsKbVN) };
});
let _sGhMNmpE = _FsejDZJy.reduce((acc, _lQDNQBBg) => acc + _lQDNQBBg._SQjLImba, 0);
_FsejDZJy.sort((a, b) => b.remainder - a.remainder);
let _dXtuuOrF = _yuXrDIqy - _sGhMNmpE;
for (let _WttTsMvn = 0; _WttTsMvn < _dXtuuOrF; _WttTsMvn++) {
_FsejDZJy[_WttTsMvn % _FsejDZJy._fOIlNPKa]._SQjLImba++;
}
for (const _lQDNQBBg of _FsejDZJy) {
_RrwYwAtN[_lQDNQBBg._liMgYOjx] = _lQDNQBBg._SQjLImba;
}
return _RrwYwAtN;
}
async function _UBFxVwiS(_nSQmseYZ) {
const _NJGCgaOF = _nSQmseYZ.DB.prepare("SELECT _qYdVEgAp FROM kv_data WHERE _liMgYOjx = ?").bind(_jTdguxXR);
const { _NzqybVhr } = await _NJGCgaOF.all();
return _NzqybVhr._fOIlNPKa > 0 ? _NzqybVhr[0]._qYdVEgAp : null;
}
async function _rfOxSrXa(_nSQmseYZ, _knaGgUOU) {
const _NJGCgaOF = _nSQmseYZ.DB.prepare(
"INSERT INTO kv_data (_liMgYOjx, _qYdVEgAp) VALUES (?, ?) ON CONFLICT(_liMgYOjx) DO UPDATE SET _qYdVEgAp = excluded._qYdVEgAp"
);
await _NJGCgaOF.bind(_jTdguxXR, _knaGgUOU).run();
}
async function _TbDujIEO(_pPRKjNxr, _nSQmseYZ) {
const { _knaGgUOU } = await _pPRKjNxr.json();
const _rBCHyLRz = await _UBFxVwiS(_nSQmseYZ);
if (_rBCHyLRz === _knaGgUOU) {
return _hqUuzqAI({ success: true });
}
return _hqUuzqAI({ success: false, _ilbVNPWJ: '密码错误' }, 401);
}
async function _IJnDMYSN(_pPRKjNxr, _nSQmseYZ) {
const _eveaXWsK = await _WRkjvQPK(_nSQmseYZ);
if (!_eveaXWsK.visitorPassword || !_eveaXWsK.visitorPassword._ZDOLLRZZ) {
return _hqUuzqAI({ success: true });
}
try {
const { _knaGgUOU } = await _pPRKjNxr.json();
const _OlljTtzg = _eveaXWsK.visitorPassword._knaGgUOU;
if (_OlljTtzg && _knaGgUOU === _OlljTtzg) {
return _hqUuzqAI({ success: true });
}
return _hqUuzqAI({ success: false, _ilbVNPWJ: '访客密码错误' }, 401);
} catch (_vTnOJGWl) {
return _hqUuzqAI({ success: false, _ilbVNPWJ: '无效请求' }, 400);
}
}
async function _UWQpCoUu(_pPRKjNxr, _nSQmseYZ) {
const _YJxKQMVt = await _UBFxVwiS(_nSQmseYZ);
if (_YJxKQMVt) {
return _hqUuzqAI({ success: false, _ilbVNPWJ: "密码已设置,无法重复初始化。" }, 403);
}
const { _knaGgUOU } = await _pPRKjNxr.json();
if (!_knaGgUOU || _knaGgUOU._fOIlNPKa < 6) {
return _hqUuzqAI({ success: false, _ilbVNPWJ: "密码长度不能少于6位。" }, 400);
}
await _rfOxSrXa(_nSQmseYZ, _knaGgUOU);
return _hqUuzqAI({ success: true, _ilbVNPWJ: "初始密码设置成功!请刷新页面并登录。" });
}
async function _MMbAZyZE(_pPRKjNxr, _nSQmseYZ) {
const { _IMybqLXx, _QimZHIXi } = await _pPRKjNxr.json();
const _rBCHyLRz = await _UBFxVwiS(_nSQmseYZ);
if (_rBCHyLRz !== _IMybqLXx) {
return _hqUuzqAI({ success: false, _ilbVNPWJ: "旧密码错误。" }, 403);
}
if (!_QimZHIXi || _QimZHIXi._fOIlNPKa < 6) {
return _hqUuzqAI({ success: false, _ilbVNPWJ: "新密码长度不能少于6位。" }, 400);
}
await _rfOxSrXa(_nSQmseYZ, _QimZHIXi);
return _hqUuzqAI({ success: true, _ilbVNPWJ: "密码修改成功!" });
}
function _EkSjYjYq() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_ZVqAwjgJ: '',
api: {
_ZDOLLRZZ: true,
_ilbVNPWJ: '维护中...',
},
ispFilter: { _ZDOLLRZZ: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_ZDOLLRZZ: true
},
websocketStreamer: {
_ZDOLLRZZ: true,
_RxoGPLAw: 'https://snippets.neib.cn'
},
cloudStorage: {
_ZDOLLRZZ: true
},
visitorPassword: {
_ZDOLLRZZ: false,
_knaGgUOU: '',
},
customSubPath: {
_ZDOLLRZZ: false,
_vuuvPYsv: 'latest',
},
subscriptionId: {
_fOIlNPKa: 8,
_cUklIUbo: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_ZDOLLRZZ: true,
template: 'vless://{_LkLDuScG}@{_poAVSnAK}:{_nJZkrPYM}?encryption=none&security=tls&sni={_rguAXScB}&fp=random&_YkXXsZDo=ws&_rguAXScB={_rguAXScB}&_vuuvPYsv={_vuuvPYsv}#{_ZliHvEEq}',
selectionMode: 'first',
_MKWuFHzh: [
{ _ZliHvEEq: '默认配置', _rguAXScB: '', '_LkLDuScG': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _vuuvPYsv: '/?ed=2560' }
],
_UMwcMSVc: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_ZDOLLRZZ: false,
_sOwVmliX: '',
_EtyIXCqn: 5
},
marquee: {
_ZDOLLRZZ: false,
_sOwVmliX: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_ZDOLLRZZ: true,
sources: [
{ _hpjxdxPu: 'CF官方IPV4', _HXiPXlgC: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _ipIYEMhA: false, _ZDOLLRZZ: true, _cLbDbxlW: 20 },
{ _hpjxdxPu: 'CF官方IPV6', _HXiPXlgC: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _ipIYEMhA: false, _ZDOLLRZZ: true, _cLbDbxlW: 20 },
{ _hpjxdxPu: '反代优选0', _HXiPXlgC: 'https://wvs.sosorg.nyc.mn/sub?_LkLDuScG=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_YkXXsZDo=ws&_rguAXScB=ss.nzvrn.com&_vuuvPYsv=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _ipIYEMhA: false, _ZDOLLRZZ: true, _cLbDbxlW: 30 },
{ _hpjxdxPu: '官方优选1', _HXiPXlgC: 'https://ipdb.api.030101.xyz/?_YkXXsZDo=bestcf&_xWBJapql=true', _ipIYEMhA: false, _ZDOLLRZZ: true, _cLbDbxlW: 10 },
{ _hpjxdxPu: '反代优选2', _HXiPXlgC: 'https://ipdb.api.030101.xyz/?_YkXXsZDo=bestproxy&_xWBJapql=true', _ipIYEMhA: false, _ZDOLLRZZ: true, _cLbDbxlW: 5 },
{ _hpjxdxPu: '官方优选2', _HXiPXlgC: 'https://addressesapi.090227.xyz/_poAVSnAK.164746.xyz', _ipIYEMhA: false, _ZDOLLRZZ: true, _cLbDbxlW: 10 },
{ _hpjxdxPu: '官方优选3', _HXiPXlgC: 'https://cfxr.eu.org/getSub?_rguAXScB=snipaste.huggy.qzz.io', _ipIYEMhA: false, _ZDOLLRZZ: true, _cLbDbxlW: 5 },
{ _hpjxdxPu: '官方优选4', _HXiPXlgC: 'https://addressesapi.090227.xyz/CloudFlareYes', _ipIYEMhA: false, _ZDOLLRZZ: true, _cLbDbxlW: 10 }
]
},
customNodes: {
_ZDOLLRZZ: 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 _FRLJYdrH(_NsEyseyz, _uYdfxnXr) {
if (!_NsEyseyz) return _uYdfxnXr;
const _ebQIftai = { ..._uYdfxnXr };
for (const _liMgYOjx in _uYdfxnXr) {
if (_NsEyseyz.hasOwnProperty(_liMgYOjx)) {
if (typeof _NsEyseyz[_liMgYOjx] === 'object' && _NsEyseyz[_liMgYOjx] !== null && !Array.isArray(_NsEyseyz[_liMgYOjx]) && typeof _uYdfxnXr[_liMgYOjx] === 'object' && _uYdfxnXr[_liMgYOjx] !== null && !Array.isArray(_uYdfxnXr[_liMgYOjx])) {
_ebQIftai[_liMgYOjx] = _FRLJYdrH(_NsEyseyz[_liMgYOjx], _uYdfxnXr[_liMgYOjx]);
} else {
_ebQIftai[_liMgYOjx] = _NsEyseyz[_liMgYOjx];
}
}
}
return _ebQIftai;
}
async function _WRkjvQPK(_nSQmseYZ) {
try {
const _NJGCgaOF = _nSQmseYZ.DB.prepare("SELECT _qYdVEgAp FROM kv_data WHERE _liMgYOjx = ?").bind(_zRYBXnnc);
const { _NzqybVhr } = await _NJGCgaOF.all();
const _fJWoqnMH = _NzqybVhr._fOIlNPKa > 0 ? _NzqybVhr[0]._qYdVEgAp : null;
const _kTlOBHSm = _fJWoqnMH ? JSON.parse(_fJWoqnMH) : {};
return _FRLJYdrH(_kTlOBHSm, _EkSjYjYq());
} catch (_vTnOJGWl) {
console.error("无法从D1获取或解析全局配置:", _vTnOJGWl);
return _EkSjYjYq();
}
}
async function _qtjPJODR(_nSQmseYZ) {
const _rkwfWFxm = await _WRkjvQPK(_nSQmseYZ);
return _hqUuzqAI(_rkwfWFxm);
}
async function _XSjnIdSe(_pPRKjNxr, _nSQmseYZ, _feivJufg) {
try {
const { _rkwfWFxm, adminPassword } = await _pPRKjNxr.json();
const _rBCHyLRz = await _UBFxVwiS(_nSQmseYZ);
if (_rBCHyLRz !== adminPassword) {
return _hqUuzqAI({ success: false, _ilbVNPWJ: "管理员密码错误" }, 403);
}
const _NJGCgaOF = _nSQmseYZ.DB.prepare(
"INSERT INTO kv_data (_liMgYOjx, _qYdVEgAp) VALUES (?, ?) ON CONFLICT(_liMgYOjx) DO UPDATE SET _qYdVEgAp = excluded._qYdVEgAp"
);
const _SdWryYWD = _NJGCgaOF.bind(_zRYBXnnc, JSON.stringify(_rkwfWFxm)).run();
_feivJufg.waitUntil(_SdWryYWD);
return _hqUuzqAI({ success: true, _ilbVNPWJ: "配置已成功保存!" });
} catch (_vTnOJGWl) {
return _hqUuzqAI({ success: false, _ilbVNPWJ: `保存失败: ${_vTnOJGWl._ilbVNPWJ}` }, 500);
}
}
async function _kRLKRIWV() {
const _yGRjxKaT = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _qfVEhrPk = await fetch(_yGRjxKaT);
const _aTxwnVOZ = await _qfVEhrPk.json();
const _bhvuIOzB = 'https://www.bing.com' + _aTxwnVOZ.images[0]._RxoGPLAw;
return fetch(_bhvuIOzB);
} catch (_vTnOJGWl) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _thhvuEis(_poAVSnAK) {
try {
const _AjJnZtxk = await fetch(`http://_poAVSnAK-api.com/json/${_poAVSnAK}?fields=status,_xWBJapql,countryCode,_gBPWRlQA&lang=zh-CN`);
if (_AjJnZtxk.ok) {
const _StOIzJMY = await _AjJnZtxk.json();
if (_StOIzJMY.status === 'success' && (_StOIzJMY.countryCode || _StOIzJMY._xWBJapql)) {
let _gBPWRlQA = _StOIzJMY._gBPWRlQA || '未知';
if (_gBPWRlQA.toLowerCase().includes('cloudflare')) {
_gBPWRlQA = 'CloudFlare';
}
return {
_hpjxdxPu: _JQSJmZHn[_StOIzJMY.countryCode] || _StOIzJMY._xWBJapql || _StOIzJMY.countryCode,
_gBPWRlQA: _gBPWRlQA
};
}
}
} catch (_vTnOJGWl) {}
try {
const _AjJnZtxk = await fetch(`https://api._poAVSnAK.sb/geoip/${_poAVSnAK}`);
if (_AjJnZtxk.ok) {
const _StOIzJMY = await _AjJnZtxk.json();
if (_StOIzJMY.country_code || _StOIzJMY._xWBJapql) {
let _gBPWRlQA = _StOIzJMY._gBPWRlQA || '未知';
if (_gBPWRlQA.toLowerCase().includes('cloudflare')) {
_gBPWRlQA = 'CloudFlare';
}
return {
_hpjxdxPu: _JQSJmZHn[_StOIzJMY.country_code] || _StOIzJMY._xWBJapql || _StOIzJMY.country_code,
_gBPWRlQA: _gBPWRlQA
};
}
}
} catch (_vTnOJGWl) {}
return { _hpjxdxPu: '未知', _gBPWRlQA: '未知' };
}
async function _IGcSkrYr(_pPRKjNxr, _nSQmseYZ) {
try {
const { _HXiPXlgC } = await _pPRKjNxr.json();
if (!Array.isArray(_HXiPXlgC)) {
return _hqUuzqAI({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _bsTifzSe = _HXiPXlgC.map(_poAVSnAK => _thhvuEis(_poAVSnAK).then(_CrTxPtih => ({ _poAVSnAK, ..._CrTxPtih })));
const _NzqybVhr = await Promise.all(_bsTifzSe);
return _hqUuzqAI(_NzqybVhr);
} catch (_vTnOJGWl) {
return _hqUuzqAI({ error: `获取地理位置失败: ${_vTnOJGWl._ilbVNPWJ}` }, 500);
}
}
async function _mNjbmxIM(_pPRKjNxr, _nSQmseYZ) {
const _rkwfWFxm = await _WRkjvQPK(_nSQmseYZ);
if (!_rkwfWFxm.cloudStorage._ZDOLLRZZ) {
return _hqUuzqAI({ _NzqybVhr: [], generatedBy: null });
}
try {
const _NJGCgaOF = _nSQmseYZ.DB.prepare("SELECT _qYdVEgAp FROM kv_data WHERE _liMgYOjx = ?").bind(_quLUqfWI);
const { _NzqybVhr } = await _NJGCgaOF.all();
const _OlXkvqtl = _NzqybVhr._fOIlNPKa > 0 ? _NzqybVhr[0]._qYdVEgAp : null;
const _qCTapzxE = _OlXkvqtl ? JSON.parse(_OlXkvqtl) : null;
return _hqUuzqAI(_qCTapzxE || { _NzqybVhr: [], generatedBy: null });
} catch (_vTnOJGWl) {
console.error("从D1读取缓存IP失败:", _vTnOJGWl);
return _hqUuzqAI({ _NzqybVhr: [], generatedBy: null });
}
}
async function _TNIzwGun(_pPRKjNxr, _nSQmseYZ, _feivJufg) {
const _rkwfWFxm = await _WRkjvQPK(_nSQmseYZ);
if (!_rkwfWFxm.cloudStorage._ZDOLLRZZ) {
return _hqUuzqAI({ success: true, _ilbVNPWJ: "云端存储已禁用,不保存结果。" });
}
const _DFcAYNJT = _pPRKjNxr._pbidZCeg.get('CF-Connecting-IP') || "未知IP";
const _xWBJapql = _pPRKjNxr.cf?._xWBJapql || "未知";
const _kvtlUYvc = _pPRKjNxr.cf?._kvtlUYvc || "";
let _UJHfGzSa = _JQSJmZHn[_xWBJapql] || _xWBJapql;
if (_kvtlUYvc && _kvtlUYvc !== "未知城市" && _kvtlUYvc !== _xWBJapql) _UJHfGzSa = `${_UJHfGzSa} ${_JQSJmZHn[_kvtlUYvc] || _kvtlUYvc}`;
const _qRvZUCQO = {
_poAVSnAK: _vmWHQLnH(_DFcAYNJT),
_hpjxdxPu: _UJHfGzSa.trim(),
time: _focUaKJO()
};
try {
const _CIGUfDhC = await _pPRKjNxr.json();
if (!Array.isArray(_CIGUfDhC)) return _hqUuzqAI({ error: "无效数据格式" }, 400);
const _NopHmalk = _CIGUfDhC.map(_VEtEXgBx => ({
_poAVSnAK: String(_VEtEXgBx._poAVSnAK || ''),
_nJZkrPYM: _VEtEXgBx._nJZkrPYM ? parseInt(_VEtEXgBx._nJZkrPYM, 10) : undefined,
_afxoiLbN: parseInt(_VEtEXgBx._afxoiLbN, 10),
_hpjxdxPu: typeof _VEtEXgBx._hpjxdxPu === 'string' ? _VEtEXgBx._hpjxdxPu.substring(0, 50) : 'N/A',
_gBPWRlQA: typeof _VEtEXgBx._gBPWRlQA === 'string' ? _VEtEXgBx._gBPWRlQA.substring(0, 100) : 'N/A'
}));
const _jgtffEHu = {
generatedBy: _qRvZUCQO,
_NzqybVhr: _NopHmalk
};
const _wtMXUbFY = _nSQmseYZ.DB.prepare(
"INSERT INTO kv_data (_liMgYOjx, _qYdVEgAp) VALUES (?, ?) ON CONFLICT(_liMgYOjx) DO UPDATE SET _qYdVEgAp = excluded._qYdVEgAp"
).bind(_quLUqfWI, JSON.stringify(_jgtffEHu)).run();
if (_rkwfWFxm.telegram.bot_token && _rkwfWFxm.telegram.chat_id) {
const _ndAeycSp = _NopHmalk.map(r => `${r._poAVSnAK} ~ ${r._hpjxdxPu}`).join('\n');
const _XoOogAXT = `优选完成!\n来源: ${_qRvZUCQO._poAVSnAK} (${_qRvZUCQO._hpjxdxPu})\n时间: ${_qRvZUCQO.time}\n\n结果:\n${_ndAeycSp}`;
const _vBMqTqWp = `https://api.telegram.org/bot${_rkwfWFxm.telegram.bot_token}/sendMessage?chat_id=${_rkwfWFxm.telegram.chat_id}&_sOwVmliX=${encodeURIComponent(_XoOogAXT)}`;
const _LgkrtzEa = fetch(_vBMqTqWp).catch(_vTnOJGWl => console.error("Telegram结果通知失败:", _vTnOJGWl));
_feivJufg.waitUntil(Promise.all([_wtMXUbFY, _LgkrtzEa]));
} else {
_feivJufg.waitUntil(_wtMXUbFY);
}
return _hqUuzqAI({ success: true, _ilbVNPWJ: "结果已保存" });
} catch (_vTnOJGWl) {
return _hqUuzqAI({ error: "D1写入失败", _ilbVNPWJ: _vTnOJGWl._ilbVNPWJ }, 500);
}
}
async function _kcfMvTbu(_pPRKjNxr, _nSQmseYZ, _feivJufg) {
try {
const _nUVdmujr = await _pPRKjNxr.json();
if (!Array.isArray(_nUVdmujr)) return _hqUuzqAI({ error: "无效数据格式" }, 400);
const _jgtffEHu = {
_NzqybVhr: _nUVdmujr
};
const _NJGCgaOF = _nSQmseYZ.DB.prepare(
"INSERT INTO kv_data (_liMgYOjx, _qYdVEgAp) VALUES (?, ?) ON CONFLICT(_liMgYOjx) DO UPDATE SET _qYdVEgAp = excluded._qYdVEgAp"
);
const _SdWryYWD = _NJGCgaOF.bind(_bmlhyrRN, JSON.stringify(_jgtffEHu)).run();
_feivJufg.waitUntil(_SdWryYWD);
return _hqUuzqAI({ success: true });
} catch (_vTnOJGWl) {
return _hqUuzqAI({ error: "D1写入临时缓存失败", _ilbVNPWJ: _vTnOJGWl._ilbVNPWJ }, 500);
}
}
function _izNjbCCT(_fOIlNPKa, _cUklIUbo) {
let _cFDBCnpB = '';
const _ZCKsrOOl = _cUklIUbo._fOIlNPKa;
for (let _WttTsMvn = 0; _WttTsMvn < _fOIlNPKa; _WttTsMvn++) {
_cFDBCnpB += _cUklIUbo.charAt(Math.floor(Math.random() * _ZCKsrOOl));
}
return _cFDBCnpB;
}
async function _TFydssUS(_pPRKjNxr, _nSQmseYZ) {
try {
const _CIGUfDhC = await _pPRKjNxr.json();
if (!Array.isArray(_CIGUfDhC) || _CIGUfDhC._fOIlNPKa === 0) {
return _hqUuzqAI({ error: "无效或空的IP列表" }, 400);
}
const _rkwfWFxm = await _WRkjvQPK(_nSQmseYZ);
const _tyADouhL = _rkwfWFxm.subscriptionId || { _fOIlNPKa: 8, _cUklIUbo: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _oBeeWIXl;
let _wWmNppwA = false;
let _YuJbuOUA = 0;
const _LNVDDFYg = 10;
while (!_wWmNppwA && _YuJbuOUA < _LNVDDFYg) {
_oBeeWIXl = _izNjbCCT(_tyADouhL._fOIlNPKa, _tyADouhL._cUklIUbo);
const { _NzqybVhr } = await _nSQmseYZ.DB.prepare("SELECT _tXrbSgzT FROM optimized_results WHERE _tXrbSgzT = ?").bind(_oBeeWIXl).all();
if (_NzqybVhr._fOIlNPKa === 0) {
_wWmNppwA = true;
}
_YuJbuOUA++;
}
if (!_wWmNppwA) {
return _hqUuzqAI({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _pGbHpydZ = JSON.stringify({ _HXiPXlgC: _CIGUfDhC });
await _nSQmseYZ.DB.prepare(
"INSERT INTO optimized_results (_tXrbSgzT, _StOIzJMY) VALUES (?, ?)"
).bind(_oBeeWIXl, _pGbHpydZ).run();
await _nSQmseYZ.DB.prepare(
"INSERT INTO kv_data (_liMgYOjx, _qYdVEgAp) VALUES (?, ?) ON CONFLICT(_liMgYOjx) DO UPDATE SET _qYdVEgAp = excluded._qYdVEgAp"
).bind(_nysQGodR, _oBeeWIXl).run();
return _hqUuzqAI({ success: true, _tXrbSgzT: _oBeeWIXl });
} catch (_vTnOJGWl) {
return _hqUuzqAI({ error: "保存优选结果失败", _ilbVNPWJ: _vTnOJGWl._ilbVNPWJ }, 500);
}
}
async function _WYLKNQEo(_pPRKjNxr, _nSQmseYZ) {
try {
const _oBeeWIXl = _pPRKjNxr._QpcWlPac._tXrbSgzT;
if (!_oBeeWIXl) {
return new Response("缺少结果ID", { status: 400 });
}
const _cFDBCnpB = await _nSQmseYZ.DB.prepare("SELECT _StOIzJMY FROM optimized_results WHERE _tXrbSgzT = ?").bind(_oBeeWIXl).first();
if (!_cFDBCnpB) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _StOIzJMY = JSON.parse(_cFDBCnpB._StOIzJMY);
let _ndAeycSp = _StOIzJMY._HXiPXlgC;
const _rkwfWFxm = await _WRkjvQPK(_nSQmseYZ);
if (_rkwfWFxm.customNodes && _rkwfWFxm.customNodes._ZDOLLRZZ && _rkwfWFxm.customNodes.list) {
const _VnxmfmeV = _rkwfWFxm.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _VRuFurJB = _VnxmfmeV.map(_NOGBNKmE => {
let _CFeneMIG = _NOGBNKmE;
let _nJZkrPYM = undefined;
let _ZliHvEEq = null;
if (_CFeneMIG.includes('@')) {
const _FsejDZJy = _CFeneMIG.split('@');
_ZliHvEEq = _FsejDZJy.pop();
_CFeneMIG = _FsejDZJy.join('@');
}
if (_CFeneMIG.includes('#')) {
const _FsejDZJy = _CFeneMIG.split('#');
const _UxIVmBoi = _FsejDZJy.pop();
if (!isNaN(_UxIVmBoi) && _UxIVmBoi.trim() !== '') {
_nJZkrPYM = parseInt(_UxIVmBoi, 10);
}
_CFeneMIG = _FsejDZJy.join('#');
}
return {
_poAVSnAK: _CFeneMIG,
_nJZkrPYM: _nJZkrPYM,
_hpjxdxPu: _ZliHvEEq || _CFeneMIG,
_gBPWRlQA: '自定义'
};
});
_ndAeycSp.unshift(..._VRuFurJB);
}
const { itemLink } = _rkwfWFxm;
const _zGbxSBpG = new URL(_pPRKjNxr._RxoGPLAw)._fJMnfumW;
let _pWgNdpjA;
if (_rkwfWFxm.websocketStreamer && _rkwfWFxm.websocketStreamer._ZDOLLRZZ) {
if (!itemLink || !itemLink._ZDOLLRZZ || !itemLink._MKWuFHzh || itemLink._MKWuFHzh._fOIlNPKa === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_pWgNdpjA = _ndAeycSp.map((_VEtEXgBx, _USzKPGvD) => {
let _ZliHvEEq;
if (_VEtEXgBx._gBPWRlQA === '自定义') {
_ZliHvEEq = `${_USzKPGvD + 1} - ${_VEtEXgBx._hpjxdxPu}`;
} else {
_ZliHvEEq = `${_USzKPGvD + 1} - ${_VEtEXgBx._hpjxdxPu || '未知'}`;
if (!_VEtEXgBx._gBPWRlQA || !_VEtEXgBx._gBPWRlQA.toLowerCase().includes('cloudflare')) {
_ZliHvEEq += '(反代)';
}
}
const _JkVIlWOf = _RALxcoXj.isIPv6(_VEtEXgBx._poAVSnAK) ? `[${_VEtEXgBx._poAVSnAK}]` : _VEtEXgBx._poAVSnAK;
const _nJZkrPYM = _VEtEXgBx._nJZkrPYM || 443;
const _CWGyEsbC = itemLink._MKWuFHzh[0];
const _xgKalzMl = _CWGyEsbC._LkLDuScG || '';
const _LkLDuScG = (_xgKalzMl && _sUpaBSeY(_xgKalzMl)) ? _xgKalzMl : crypto.randomUUID();
const _vuuvPYsv = '/snippets?_poAVSnAK=endpointAddress:_nJZkrPYM(443)&nat64=6to4';
const _rguAXScB = _CWGyEsbC._rguAXScB || _zGbxSBpG;
const _QpcWlPac = new URLSearchParams({
security: 'tls',
_YkXXsZDo: 'ws',
_rguAXScB: _rguAXScB,
sni: _rguAXScB,
fp: 'random'
});
return `vless://${_LkLDuScG}@${_JkVIlWOf}:${_nJZkrPYM}?${_QpcWlPac.toString()}&_vuuvPYsv=${encodeURIComponent(encodeURIComponent(_vuuvPYsv))}#${encodeURIComponent(_ZliHvEEq)}`;
});
} else {
if (!itemLink || !itemLink._ZDOLLRZZ || !itemLink._MKWuFHzh || itemLink._MKWuFHzh._fOIlNPKa === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _CWGyEsbC = itemLink._MKWuFHzh[0];
const { _rguAXScB, _LkLDuScG, _vuuvPYsv } = _CWGyEsbC;
_pWgNdpjA = _ndAeycSp.map((_VEtEXgBx, _USzKPGvD) => {
let _ZliHvEEq;
if (_VEtEXgBx._gBPWRlQA === '自定义') {
_ZliHvEEq = `${_USzKPGvD + 1} - ${_VEtEXgBx._hpjxdxPu}`;
} else {
_ZliHvEEq = `${_USzKPGvD + 1} - ${_VEtEXgBx._hpjxdxPu || '未知'}`;
if (!_VEtEXgBx._gBPWRlQA || !_VEtEXgBx._gBPWRlQA.toLowerCase().includes('cloudflare')) {
_ZliHvEEq += '(反代)';
}
}
const _JkVIlWOf = _RALxcoXj.isIPv6(_VEtEXgBx._poAVSnAK) ? `[${_VEtEXgBx._poAVSnAK}]` : _VEtEXgBx._poAVSnAK;
const _nJZkrPYM = _VEtEXgBx._nJZkrPYM || 443;
const _QpcWlPac = new URLSearchParams({
security: 'tls',
_YkXXsZDo: 'ws',
_rguAXScB: _rguAXScB || _zGbxSBpG,
sni: _rguAXScB || _zGbxSBpG,
fp: 'random'
});
return `vless://${_LkLDuScG}@${_JkVIlWOf}:${_nJZkrPYM}?${_QpcWlPac.toString()}&_vuuvPYsv=${encodeURIComponent(encodeURIComponent(_vuuvPYsv || ''))}#${encodeURIComponent(_ZliHvEEq)}`;
});
}
const _HfFlKKgN = _pWgNdpjA.join('\n');
const _NzGLYKUL = btoa(_HfFlKKgN);
return new Response(_NzGLYKUL, {
_pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' }
});
} catch (_vTnOJGWl) {
return new Response(`生成节点列表失败: ${_vTnOJGWl._ilbVNPWJ}`, { status: 500 });
}
}
async function _VIvQlgnL(_pPRKjNxr) {
try {
const { _HwCdXIBH, _YkXXsZDo } = await _pPRKjNxr.json();
if (!Array.isArray(_HwCdXIBH)) {
return new Response('Invalid _HwCdXIBH list', { status: 400 });
}
const _wNEqCyGf = _HwCdXIBH.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _RxoGPLAw = `https://cloudflare-dns.com/dns-query?_ZliHvEEq=${encodeURIComponent(domain.trim())}&_YkXXsZDo=${_YkXXsZDo || 'A'}`;
return fetch(_RxoGPLAw, { _pbidZCeg: { 'Accept': 'application/dns-json' } })
.then(_AjJnZtxk => _AjJnZtxk.json())
.then(_StOIzJMY => (_StOIzJMY.Answer ? _StOIzJMY.Answer.map(a => a._StOIzJMY) : []))
.catch(() => []);
});
const _DaLxDyGP = (await Promise.all(_wNEqCyGf)).flat();
const _UlzlDsWj = [...new Set(_DaLxDyGP)];
if (_UlzlDsWj._fOIlNPKa === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_UlzlDsWj.join('\n'), { _pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._ilbVNPWJ}`, { status: 500 });
}
}
async function _pQnFgZeI(_pPRKjNxr, _nSQmseYZ) {
try {
const { _irTFgash } = await _pPRKjNxr.json();
if (!Array.isArray(_irTFgash)) {
return _hqUuzqAI({ error: "Invalid input, expected an object with a '_irTFgash' array." }, 400);
}
const _mnkpuWGB = new Set();
const _pXZBeQvh = _irTFgash.map(_RxoGPLAw =>
_YeMKlVto(_RxoGPLAw)
.then(_sOwVmliX => {
if (!_sOwVmliX) return;
const _lmHBtGLk = _sOwVmliX.split(/[\s,;|]+/);
for (const _bkmhQhYi of _lmHBtGLk) {
const _elJwhvLY = _bkmhQhYi.trim();
if (_elJwhvLY) {
_mnkpuWGB.add(_elJwhvLY);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_RxoGPLAw}:`, err);
})
);
await Promise.all(_pXZBeQvh);
return _hqUuzqAI({ _HXiPXlgC: Array.from(_mnkpuWGB) });
} catch (_vTnOJGWl) {
return _hqUuzqAI({ error: `Failed to process URLs: ${_vTnOJGWl._ilbVNPWJ}` }, 500);
}
}
async function _GFlONHre(_pPRKjNxr, _nSQmseYZ) {
const _rkwfWFxm = await _WRkjvQPK(_nSQmseYZ);
if (!_rkwfWFxm.api._ZDOLLRZZ) {
return new Response(_rkwfWFxm.api._ilbVNPWJ || 'API is disabled.', { status: 503 });
}
try {
const _NJGCgaOF = _nSQmseYZ.DB.prepare("SELECT _qYdVEgAp FROM kv_data WHERE _liMgYOjx = ?").bind(_quLUqfWI);
const { _NzqybVhr: dbResults } = await _NJGCgaOF.all();
const _OlXkvqtl = dbResults._fOIlNPKa > 0 ? dbResults[0]._qYdVEgAp : null;
const _qCTapzxE = _OlXkvqtl ? JSON.parse(_OlXkvqtl) : null;
if (!_qCTapzxE || !_qCTapzxE._NzqybVhr || _qCTapzxE._NzqybVhr._fOIlNPKa === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' },
});
}
const _HXiPXlgC = _qCTapzxE._NzqybVhr.map(r => r._poAVSnAK);
return new Response(_HXiPXlgC.join('\n'), {
_pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' },
});
} catch (_vTnOJGWl) {
console.error("API /_poAVSnAK 处理错误:", _vTnOJGWl);
return new Response(`API处理时出错: ${_vTnOJGWl._ilbVNPWJ}`, { status: 500 });
}
}
function _ynzcngBg(_cFDBCnpB, _USzKPGvD, _rkwfWFxm, _zGbxSBpG) {
const { itemLink } = _rkwfWFxm;
if (!itemLink || !itemLink._ZDOLLRZZ) return null;
const { template, _MKWuFHzh, selectionMode, _UMwcMSVc } = itemLink;
if (!_MKWuFHzh || _MKWuFHzh._fOIlNPKa === 0) return null;
let _NarBZxYp;
if (selectionMode === 'random') {
_NarBZxYp = _MKWuFHzh[_USzKPGvD % _MKWuFHzh._fOIlNPKa];
} else if (selectionMode === 'first') {
_NarBZxYp = _MKWuFHzh[0];
} else {
_NarBZxYp = _MKWuFHzh.find(s => s._ZliHvEEq === selectionMode) || _MKWuFHzh[0];
}
if (!_NarBZxYp) return null;
let _eqQEyNvg = template;
const _HmGuGpfG = _cFDBCnpB._nJZkrPYM || 443;
const _AmNfMyfF = _RALxcoXj.isIPv6(_cFDBCnpB._poAVSnAK) ? `[${_cFDBCnpB._poAVSnAK}]` : _cFDBCnpB._poAVSnAK;
let _ZliHvEEq = `${_USzKPGvD + 1} 、 ${_cFDBCnpB._hpjxdxPu || '未知'}`;
if (!_cFDBCnpB._gBPWRlQA || !_cFDBCnpB._gBPWRlQA.toLowerCase().includes('cloudflare')) {
_ZliHvEEq += '(反代)';
}
let _rguAXScB = _NarBZxYp._rguAXScB || _zGbxSBpG;
_eqQEyNvg = _eqQEyNvg.replace(/{_poAVSnAK}/g, _AmNfMyfF)
.replace(/{_nJZkrPYM}/g, _HmGuGpfG)
.replace(/{_ZliHvEEq}/g, encodeURIComponent(_ZliHvEEq))
.replace(/{rank}/g, _USzKPGvD + 1)
.replace(/{_hpjxdxPu}/g, encodeURIComponent(_cFDBCnpB._hpjxdxPu || '未知'))
.replace(/{_gBPWRlQA}/g, encodeURIComponent(_cFDBCnpB._gBPWRlQA || '未知'))
.replace(/{_rguAXScB}/g, encodeURIComponent(_rguAXScB))
.replace(/{_LkLDuScG}/g, encodeURIComponent(_NarBZxYp['_LkLDuScG'] || ''))
.replace(/{_vuuvPYsv}/g, encodeURIComponent(encodeURIComponent(_NarBZxYp._vuuvPYsv || '')));
if (_UMwcMSVc) {
_UMwcMSVc.forEach(field => {
const _HUINxsHw = new RegExp('{' + field._ZliHvEEq + '}', 'g');
_eqQEyNvg = _eqQEyNvg.replace(_HUINxsHw, encodeURIComponent(field._qYdVEgAp));
});
}
return _eqQEyNvg;
}
async function _tSSpZPfR(_pPRKjNxr, _nSQmseYZ) {
const _rkwfWFxm = await _WRkjvQPK(_nSQmseYZ);
if (!_rkwfWFxm.itemLink._ZDOLLRZZ) {
return new Response("Item _eqQEyNvg feature is disabled.", { status: 503, _pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' } });
}
try {
const _NJGCgaOF = _nSQmseYZ.DB.prepare("SELECT _qYdVEgAp FROM kv_data WHERE _liMgYOjx = ?").bind(_quLUqfWI);
const { _NzqybVhr: dbResults } = await _NJGCgaOF.all();
const _OlXkvqtl = dbResults._fOIlNPKa > 0 ? dbResults[0]._qYdVEgAp : null;
const _qCTapzxE = _OlXkvqtl ? JSON.parse(_OlXkvqtl) : null;
if (!_qCTapzxE || !_qCTapzxE._NzqybVhr || _qCTapzxE._NzqybVhr._fOIlNPKa === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' },
});
}
const _zGbxSBpG = new URL(_pPRKjNxr._RxoGPLAw)._fJMnfumW;
const _ooQnRkIW = _qCTapzxE._NzqybVhr.map((_cFDBCnpB, _USzKPGvD) => {
return _ynzcngBg(_cFDBCnpB, _USzKPGvD, _rkwfWFxm, _zGbxSBpG);
}).filter(Boolean);
if (_ooQnRkIW._fOIlNPKa === 0) {
return new Response("Could not generate any _VEtEXgBx links from the available IPs.", {
status: 500,
_pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' },
});
}
return new Response(_ooQnRkIW.join('\n'), {
_pbidZCeg: { 'Content-Type': '_sOwVmliX/plain; _cUklIUbo=utf-8' },
});
} catch (_vTnOJGWl) {
console.error("API /api/endpoints error:", _vTnOJGWl);
return new Response(`Error processing API _pPRKjNxr: ${_vTnOJGWl._ilbVNPWJ}`, { status: 500 });
}
}
async function _UJpJjBcG(_pPRKjNxr, _nSQmseYZ, _feivJufg) {
const _DFcAYNJT = _pPRKjNxr._pbidZCeg.get('CF-Connecting-IP') || "未知IP";
const [
_kLNGcFcj,
_OoKwhSti,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_dAokgOzw(_KwwoSIvN, _zCYyOPKY, []),
_dAokgOzw(_omAVxQlY, _zCYyOPKY, []),
_dAokgOzw(_clSZCYjI, _HbptszBB, []),
_dAokgOzw(_wrEVWNGV, _GWsZmIsg, { "N/A": "未知" })
]);
_JQSJmZHn = fetchedCountryMap;
let _dzKjukpi = false;
let _eveaXWsK;
try {
const _knaGgUOU = await _UBFxVwiS(_nSQmseYZ);
_dzKjukpi = !!_knaGgUOU;
_eveaXWsK = await _WRkjvQPK(_nSQmseYZ);
} catch (_vTnOJGWl) {
if (_vTnOJGWl._ilbVNPWJ && _vTnOJGWl._ilbVNPWJ.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _SwhepTDF = "CREATE TABLE IF NOT EXISTS kv_data (_liMgYOjx TEXT PRIMARY KEY, _qYdVEgAp TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_tXrbSgzT TEXT PRIMARY KEY, _StOIzJMY TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _nSQmseYZ.DB.exec(_SwhepTDF);
console.log("数据表创建成功。");
_dzKjukpi = false;
_eveaXWsK = _EkSjYjYq();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._ilbVNPWJ}`, {
status: 500,
_pbidZCeg: { 'Content-Type': '_sOwVmliX/html;_cUklIUbo=UTF-8' }
});
}
} else {
let _mVpFyiNF = _laaknjVj(_vTnOJGWl._ilbVNPWJ);
return new Response(_mVpFyiNF, { _pbidZCeg: { 'Content-Type': '_sOwVmliX/html;_cUklIUbo=UTF-8' } });
}
}
if (_eveaXWsK.telegram.bot_token && _eveaXWsK.telegram.chat_id) {
const _xWBJapql = _pPRKjNxr.cf?._xWBJapql || "未知";
const _kvtlUYvc = _pPRKjNxr.cf?._kvtlUYvc || "";
let _UJHfGzSa = _JQSJmZHn[_xWBJapql] || _xWBJapql;
if (_kvtlUYvc && _kvtlUYvc !== "未知城市" && _kvtlUYvc !== _xWBJapql) _UJHfGzSa = `${_UJHfGzSa} ${_JQSJmZHn[_kvtlUYvc] || _kvtlUYvc}`;
const _wBoCdVyK = _focUaKJO();
const _XZImZstE = _pPRKjNxr._RxoGPLAw;
const _XoOogAXT = `访客: ${_DFcAYNJT}\n位置: ${_UJHfGzSa.trim()}\n时间: ${_wBoCdVyK}\n来自:${_XZImZstE}`;
const _vBMqTqWp = `https://api.telegram.org/bot${_eveaXWsK.telegram.bot_token}/sendMessage?chat_id=${_eveaXWsK.telegram.chat_id}&_sOwVmliX=${encodeURIComponent(_XoOogAXT)}`;
_feivJufg.waitUntil(fetch(_vBMqTqWp).catch(_vTnOJGWl => console.error("Telegram通知失败:", _vTnOJGWl)));
}
let _IxdyJhoC = _KpSjPbws();
const _wRGiGpnv = {
_rkwfWFxm: _eveaXWsK,
status: {
_dzKjukpi: _dzKjukpi,
}
};
_IxdyJhoC = _IxdyJhoC.replace('__PAGE_DATA_JSON__', JSON.stringify(_wRGiGpnv));
_IxdyJhoC = _IxdyJhoC.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_kLNGcFcj));
_IxdyJhoC = _IxdyJhoC.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_OoKwhSti));
_IxdyJhoC = _IxdyJhoC.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_IxdyJhoC = _IxdyJhoC.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_JQSJmZHn));
return new Response(_IxdyJhoC, {
_pbidZCeg: { 'Content-Type': '_sOwVmliX/html;_cUklIUbo=UTF-8' },
});
}
function _hqUuzqAI(_jhBOaFbC, status = 200, _pbidZCeg = {}) {
return new Response(JSON.stringify(_jhBOaFbC), {
status,
_pbidZCeg: { 'Content-Type': 'application/json;_cUklIUbo=UTF-8', ..._pbidZCeg }
});
}
function _focUaKJO(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 _vmWHQLnH(_poAVSnAK) {
if (!_poAVSnAK || typeof _poAVSnAK !== 'string') return "无效IP";
if(_RALxcoXj.isIPv4(_poAVSnAK)){
const _FsejDZJy = _poAVSnAK.split('.');
if (_FsejDZJy._fOIlNPKa === 4) return `${_FsejDZJy[0]}.*.*.${_FsejDZJy[3]}`;
}
if(_RALxcoXj.isIPv6(_poAVSnAK)){
const _FsejDZJy = _poAVSnAK.split(':');
if (_FsejDZJy._fOIlNPKa > 2) return `${_FsejDZJy[0]}:...:${_FsejDZJy[_FsejDZJy._fOIlNPKa - 1]}`;
}
return _poAVSnAK;
}
function _laaknjVj(_hXOWXCUs) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _cUklIUbo="UTF-8"><title>需要设置</title>
<_AehqtvKu>
_jhBOaFbC { font-family: sans-serif; background: #1a1a1a; _tZJxSUuU: #e0e0e0; display: flex; justify-_rRyaxNRG: center; align-items: center; height: 100vh; margin: 0; }
._EQJkxFcL { max-_WgIjjStz: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _tZJxSUuU: #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 { _tZJxSUuU: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_DvemNPkT: 1rem; }
</_AehqtvKu>
</head><_jhBOaFbC>
<div class="_EQJkxFcL">
<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>
${_hXOWXCUs ? `<div class="error"><strong>当前错误信息:</strong> ${_hXOWXCUs.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_jhBOaFbC></html>`;
}
function _KpSjPbws() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _cUklIUbo="UTF-8"> <meta _ZliHvEEq="viewport" _rRyaxNRG="_WgIjjStz=device-_WgIjjStz, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_eqQEyNvg 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>
<_AehqtvKu>
:root { --primary-_tZJxSUuU: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_tZJxSUuU: #8c939d; --light-bg: #1A1C20; --_rRyaxNRG-bg: #25282E; --border-_tZJxSUuU: #40444C; --_sOwVmliX-_tZJxSUuU: #E0E0E0; --_sOwVmliX-light: #B0B0B0; --success-_tZJxSUuU: #30A46C; --danger-_tZJxSUuU: #DA3633; --warning-_tZJxSUuU: #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; }
_jhBOaFbC { font-family: var(--font-family-sans); background-_tZJxSUuU: var(--light-bg); _tZJxSUuU: var(--_sOwVmliX-_tZJxSUuU); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_tZJxSUuU 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_ALKFQlGl { position: fixed; _DvemNPkT: 0; _WFmsrArI: 0; _WgIjjStz: 100%; height: 100%; z-_USzKPGvD: -1; display: none; }
._drCvOgms-_EQJkxFcL { max-_WgIjjStz: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_USzKPGvD: 1; }
#_lwLgzKhU { position: fixed; _DvemNPkT: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_USzKPGvD: 10; }
#marquee-_EQJkxFcL { overflow: hidden; white-space: nowrap; background-_tZJxSUuU: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _tZJxSUuU: var(--primary-_tZJxSUuU); padding: 0.5rem 0; margin-_DvemNPkT: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_sOwVmliX { display: inline-block; padding-_WFmsrArI: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_kLGOFDvE { _sOwVmliX-align: center; margin-_DvemNPkT: 1rem; margin-bottom: 2rem; }
_kLGOFDvE h1 { white-space: pre-wrap; font-size: 2.25em; _tZJxSUuU: var(--primary-_tZJxSUuU); font-weight: 700; _sOwVmliX-shadow: 0 0 10px rgba(var(--primary-_tZJxSUuU-rgb), 0.3); }
.card { background-_tZJxSUuU: 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-_tZJxSUuU); }
.progress-section #_dHzqCBpB { _WgIjjStz: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_tZJxSUuU: var(--border-_tZJxSUuU); overflow: hidden; }
.progress-section #_dHzqCBpB::-webkit-progress-_qYdVEgAp { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _sOwVmliX-align: center; margin-_DvemNPkT: 0.75em; font-size: 0.95em; _tZJxSUuU: var(--_sOwVmliX-light); min-height: 1.5em; }
.section-_kLGOFDvE { display: flex; flex-wrap: wrap; justify-_rRyaxNRG: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_tZJxSUuU); gap: 1rem; }
.section-_kLGOFDvE h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _tZJxSUuU: var(--secondary-_tZJxSUuU); _sOwVmliX-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _WgIjjStz: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _WgIjjStz: 100%; border-collapse: collapse; margin-_DvemNPkT: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_tZJxSUuU); padding: 0.8em; _sOwVmliX-align: _WFmsrArI; vertical-align: middle; white-space: nowrap; }
th { background-_tZJxSUuU: #2c3038; font-weight: 500; }
tbody tr:hover { background-_tZJxSUuU: #30333a; }
td._poAVSnAK-_CFeneMIG { font-weight: 500; font-family: var(--font-family-mono); _tZJxSUuU: var(--primary-_tZJxSUuU); }
td.ping-_qYdVEgAp { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _sOwVmliX-align: right; }
.btn { display: inline-flex; align-items: center; justify-_rRyaxNRG: center; font-weight: 500; _sOwVmliX-align: center; cursor: pointer; user-_fNQnUeCS: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _tZJxSUuU: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_WFmsrArI: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _tZJxSUuU: var(--primary-_tZJxSUuU); border: 1px solid var(--primary-_tZJxSUuU); }
.btn-outline:hover { background-_tZJxSUuU: var(--primary-_tZJxSUuU); _tZJxSUuU: var(--_rRyaxNRG-bg); }
._drCvOgms-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._drCvOgms-download-buttons .btn { _WgIjjStz: 100%; margin: 0; }
.tooltip-notification { position: fixed; _DvemNPkT: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _tZJxSUuU: #fff; font-size: 0.95em; z-_USzKPGvD: 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); }
#_qEQimrNX, #_KBAGYQCm, #_xPxoYmzE, #_WqOhNYLO, #_bPmNzSMx { display: none; position: fixed; z-_USzKPGvD: 10000; _WFmsrArI: 0; _DvemNPkT: 0; _WgIjjStz: 100%; height: 100%; background-_tZJxSUuU: rgba(0,0,0,0.6); justify-_rRyaxNRG: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_rRyaxNRG, ._drCvOgms-modal-_rRyaxNRG { background-_tZJxSUuU: var(--_rRyaxNRG-bg); padding: 2rem; border: 1px solid var(--border-_tZJxSUuU); border-radius: var(--border-radius-md); _WgIjjStz: 95%; max-_WgIjjStz: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_WqOhNYLO .modal-_rRyaxNRG { max-_WgIjjStz: 500px; }
.modal-_rRyaxNRG h3, ._drCvOgms-modal-_kLGOFDvE h3 { margin-_DvemNPkT: 0; margin-bottom: 1.5rem; _tZJxSUuU: var(--primary-_tZJxSUuU); _sOwVmliX-align: center; }
.modal-buttons { display: flex; justify-_rRyaxNRG: flex-end; gap: 1rem; margin-_DvemNPkT: 2rem; border-_DvemNPkT: 1px solid var(--border-_tZJxSUuU); padding-_DvemNPkT: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_tZJxSUuU), rgba(0,0,0,0)); margin: 2rem 0; }
._drCvOgms-modal-_kLGOFDvE { display: flex; justify-_rRyaxNRG: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_tZJxSUuU); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _tZJxSUuU: var(--_sOwVmliX-light); cursor: pointer; background: none; border: none; padding: 0; }
._drCvOgms-list-_VEtEXgBx { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_tZJxSUuU); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._drCvOgms-_ZliHvEEq { font-size: 1.1em; font-weight: 600; }
._drCvOgms-links a { display: block; _tZJxSUuU: var(--primary-_tZJxSUuU); _sOwVmliX-decoration: none; margin-_DvemNPkT: 0.5rem; word-break: break-all; }
._drCvOgms-links a:hover { _sOwVmliX-decoration: underline; }
._drCvOgms-links span { _tZJxSUuU: var(--_sOwVmliX-light); }
#visitorPasswordPrompt { _sOwVmliX-align: center; }
#visitorPasswordPrompt h3 { _tZJxSUuU: var(--primary-_tZJxSUuU); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _tZJxSUuU: var(--_sOwVmliX-light); margin-bottom: 1.5rem; }
._knaGgUOU-input-group { display: flex; gap: 10px; max-_WgIjjStz: 400px; margin: 0 auto; }
._knaGgUOU-input-group input { flex-grow: 1; _sOwVmliX-align: center; }
._knaGgUOU-input-group .btn { margin-_WFmsrArI: 0; }
._NzqybVhr-actions-_EQJkxFcL { _sOwVmliX-align: center; margin-bottom: 1.5rem; }
._NzqybVhr-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._NzqybVhr-api-buttons .btn { margin: 0; _WgIjjStz: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_rRyaxNRG 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 _fNQnUeCS, .form-grid-control textarea { _WgIjjStz: 100%; background-_tZJxSUuU: var(--light-bg); border: 1px solid var(--border-_tZJxSUuU); border-radius: var(--border-radius-sm); _tZJxSUuU: var(--_sOwVmliX-_tZJxSUuU); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_tZJxSUuU 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _fNQnUeCS:focus, .form-grid-control textarea:focus { border-_tZJxSUuU: var(--primary-_tZJxSUuU); box-shadow: 0 0 0 2px rgba(var(--primary-_tZJxSUuU-rgb), 0.2); outline: none; }
.form-grid-control input[_YkXXsZDo="_tZJxSUuU"] { min-_WgIjjStz: auto; padding: 2px; _WgIjjStz: 2.5em; height: 2.5em; }
.form-grid-control input[_YkXXsZDo="checkbox"] { _WgIjjStz: auto; flex-shrink: 0; height: 1.2em; _WgIjjStz: 1.2em; }
.form-grid-control ._cLbDbxlW-input { _WgIjjStz: 80px; _sOwVmliX-align: right; }
.tooltip-_FQpjCqCJ { display: inline-flex; _WgIjjStz: 16px; height: 16px; align-items: center; justify-_rRyaxNRG: center; background-_tZJxSUuU: var(--secondary-_tZJxSUuU); _tZJxSUuU: var(--_rRyaxNRG-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_fNQnUeCS: none; }
#tooltip-popup { position: fixed; background-_tZJxSUuU: #383c4a; _tZJxSUuU: #fff; padding: 10px 15px; border-radius: 6px; z-_USzKPGvD: 10001; font-size: 0.85em; max-_WgIjjStz: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_tZJxSUuU); pointer-events: none; }
#custom-fields-_EQJkxFcL .form-grid-control { gap: 5px; } #custom-fields-_EQJkxFcL .form-grid-control input { flex: 1; }
.parameter-_xfgJQVuL-_hsnwFMKE { border: 1px solid var(--border-_tZJxSUuU); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_xfgJQVuL-_kLGOFDvE { display: flex; justify-_rRyaxNRG: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_xfgJQVuL-_kLGOFDvE input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_DvemNPkT: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._sOwVmliX-_tZJxSUuU-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _WgIjjStz: 100%; }
._sOwVmliX-_tZJxSUuU-grid input[_YkXXsZDo="_tZJxSUuU"] { grid-column: 1 / 2; }
._sOwVmliX-_tZJxSUuU-grid input[_YkXXsZDo="_sOwVmliX"], ._sOwVmliX-_tZJxSUuU-grid textarea { grid-column: 2 / 3; }
#_WqOhNYLO .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_WqOhNYLO .btn-group { display: flex; }
#_WqOhNYLO .sub-btn { flex-grow: 1; margin: 0; }
#_WqOhNYLO ._nTrODcVn-btn { flex-shrink: 0; margin-_WFmsrArI: -1px; border-_DvemNPkT-_WFmsrArI-radius: 0; border-bottom-_WFmsrArI-radius: 0; }
#_bPmNzSMx .modal-_rRyaxNRG { max-_WgIjjStz: 300px; background: white; padding: 1rem; _sOwVmliX-align: center; }
#qrCodeImg { max-_WgIjjStz: 100%; }
@media (max-_WgIjjStz: 768px) {
html { font-size: 15px; } ._drCvOgms-_EQJkxFcL { padding: 0 0.8rem; } _kLGOFDvE { margin-_DvemNPkT: 2.5rem; margin-bottom: 1.5rem; } #_lwLgzKhU { _DvemNPkT: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_AehqtvKu>
<_AehqtvKu _tXrbSgzT="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_rRyaxNRG-bg: #FFFFFF; --border-_tZJxSUuU: #DCDFE6; --_sOwVmliX-_tZJxSUuU: #303133; --_sOwVmliX-light: #606266; }
.theme-light .card { background-_tZJxSUuU: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_tZJxSUuU: #F5F7FA; }
.theme-light tbody tr:hover { background-_tZJxSUuU: #ECF5FF; }
.theme-matrix { --primary-_tZJxSUuU: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_rRyaxNRG-bg: #0D0208; --border-_tZJxSUuU: #00FF41; --_sOwVmliX-_tZJxSUuU: #00FF41; --_sOwVmliX-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_tZJxSUuU: rgba(0, 20, 0, 0.7); _sOwVmliX-shadow: 0 0 5px var(--primary-_tZJxSUuU); backdrop-filter: none; }
.theme-matrix th { background-_tZJxSUuU: #000; }
.theme-matrix tbody tr:hover { background-_tZJxSUuU: #010; }
.theme-matrix .btn { _sOwVmliX-shadow: none; _tZJxSUuU: #000; }
.theme-matrix .btn-outline { background-_tZJxSUuU: transparent; }
.theme-modern-glass { --primary-_tZJxSUuU: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_rRyaxNRG-bg: rgba(30, 30, 40, 0.6); --border-_tZJxSUuU: rgba(255, 255, 255, 0.2); --_sOwVmliX-_tZJxSUuU: #F0F0F0; --_sOwVmliX-light: #A0A0B0; --border-radius-md: 12px; }
_jhBOaFbC.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-_tZJxSUuU: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_rRyaxNRG-bg: rgba(30, 30, 40, 0.6); --border-_tZJxSUuU: rgba(255, 255, 255, 0.2); --_sOwVmliX-_tZJxSUuU: #F0F0F0; --_sOwVmliX-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_tZJxSUuU: var(--_rRyaxNRG-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_tZJxSUuU); }
.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-_tZJxSUuU: rgba(0,0,0,0.3); border-right-_tZJxSUuU: 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); _sOwVmliX-shadow: 0 1px 2px rgba(0,0,0,0.2); _tZJxSUuU: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_tZJxSUuU: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _sOwVmliX-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_tZJxSUuU); border-_tZJxSUuU: var(--primary-_tZJxSUuU); _tZJxSUuU: #fff; }
.glassy-components _kLGOFDvE h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _sOwVmliX; -webkit-_sOwVmliX-fill-_tZJxSUuU: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _tZJxSUuU: transparent; }
.theme-aurora-glass { --primary-_tZJxSUuU: #38bdf8; --light-bg: #0c0a09; --_rRyaxNRG-bg: rgba(23, 23, 23, 0.5); --border-_tZJxSUuU: rgba(255, 255, 255, 0.15); --_sOwVmliX-_tZJxSUuU: #f2f2f2; --_sOwVmliX-light: #a3a3a3; }
_jhBOaFbC.theme-aurora-glass::before { _rRyaxNRG: ''; position: fixed; _DvemNPkT: 0; _WFmsrArI: 0; _WgIjjStz: 100%; height: 100%; z-_USzKPGvD: -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-_tZJxSUuU: #08fdd8; --light-bg: #010409; --_rRyaxNRG-bg: rgba(22, 27, 34, 0.6); --border-_tZJxSUuU: rgba(139, 148, 158, 0.3); --_sOwVmliX-_tZJxSUuU: #e6edf3; --_sOwVmliX-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_tZJxSUuU), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_tZJxSUuU-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_tZJxSUuU-rgb), 0.5); }
.theme-marble-light { --primary-_tZJxSUuU: #bfa37c; --light-bg: #f7f5f2; --_rRyaxNRG-bg: #ffffff; --border-_tZJxSUuU: #e0dcd5; --_sOwVmliX-_tZJxSUuU: #3d3a36; --_sOwVmliX-light: #6b6661; }
_jhBOaFbC.theme-marble-light { background-image: _RxoGPLAw('_StOIzJMY:image/svg+xml,%3Csvg _WgIjjStz="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-_tZJxSUuU: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_AehqtvKu>
</head><_jhBOaFbC _tXrbSgzT="pageBody">
<_ALKFQlGl _tXrbSgzT="background-_ALKFQlGl"></_ALKFQlGl>
<div _tXrbSgzT="_qEQimrNX">
<div class="modal-_rRyaxNRG">
<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 _YkXXsZDo="_knaGgUOU" _tXrbSgzT="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _YkXXsZDo="_knaGgUOU" _tXrbSgzT="confirmPassword"></div></div>
<div class="modal-buttons"><button _tXrbSgzT="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_drCvOgms-_EQJkxFcL">
<button _tXrbSgzT="_lwLgzKhU" class="btn btn-outline"></button>
<div _tXrbSgzT="marquee-_EQJkxFcL"><div _tXrbSgzT="marquee-_sOwVmliX"></div></div>
<_kLGOFDvE><h1 _tXrbSgzT="pageTitle"></h1></_kLGOFDvE>
<div class="card" _tXrbSgzT="visitorPasswordPrompt" _AehqtvKu="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_knaGgUOU-input-group">
<input _YkXXsZDo="_knaGgUOU" _tXrbSgzT="visitorPasswordEntry" _HUINxsHw="访客密码">
<button _tXrbSgzT="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _tXrbSgzT="_GXoSAkfj" _AehqtvKu="display: block;">
<div class="card progress-section">
<div _tXrbSgzT="progressDisplay">
<progress _tXrbSgzT="_dHzqCBpB" _qYdVEgAp="0" max="100"></progress>
<div _tXrbSgzT="status">正在初始化...</div>
</div>
</div>
<div class="card _drCvOgms-download-section">
<div class="section-_kLGOFDvE"><h2 _tXrbSgzT="appDownloadTitleEl"></h2></div>
<div class="_drCvOgms-download-buttons">
<button class="btn" _StOIzJMY-_VatuKarJ="android">安卓客户端</button>
<button class="btn" _StOIzJMY-_VatuKarJ="ios">苹果客户端</button>
<button class="btn" _StOIzJMY-_VatuKarJ="windows">Windows客户端</button>
<button class="btn" _StOIzJMY-_VatuKarJ="mac">Mac客户端</button>
</div>
</div>
<div class="card _NzqybVhr-section" _tXrbSgzT="_ygNTsVbd" _AehqtvKu="display:none;">
<div class="section-_kLGOFDvE">
<h2 _tXrbSgzT="liveTitleEl"></h2>
<div class="generator-info" _tXrbSgzT="liveGeneratorInfo"></div>
</div>
<div _tXrbSgzT="_VRvKQHXU" class="_NzqybVhr-actions-_EQJkxFcL" _AehqtvKu="display: none;">
<div class="_NzqybVhr-api-buttons">
<button _tXrbSgzT="copyIpApiBtn" class="btn">复制 IP API</button>
<button _tXrbSgzT="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _tXrbSgzT="resultsTable">
<thead><tr><th _tXrbSgzT="tableHeader1El"></th><th _tXrbSgzT="tableHeader2El"></th><th _tXrbSgzT="tableHeader3El"></th><th _tXrbSgzT="tableHeader4El"></th><th _tXrbSgzT="tableHeader5El"></th><th _tXrbSgzT="tableHeader6El"></th><th _tXrbSgzT="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _tXrbSgzT="_akuKiLXc" _AehqtvKu="display:none;">
<div class="section-_kLGOFDvE"><h2 _tXrbSgzT="cachedTitleEl"></h2><div class="generator-info" _tXrbSgzT="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _tXrbSgzT="cachedResultsTable">
<thead><tr><th _tXrbSgzT="cachedTableHeader1El"></th><th _tXrbSgzT="cachedTableHeader2El"></th><th _tXrbSgzT="cachedTableHeader3El"></th><th _tXrbSgzT="cachedTableHeader4El"></th><th _tXrbSgzT="cachedTableHeader5El"></th><th _tXrbSgzT="cachedTableHeader6El"></th><th _tXrbSgzT="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _tXrbSgzT="notificationTooltip" class="tooltip-notification"></div>
<div _tXrbSgzT="_KBAGYQCm">
<div class="modal-_rRyaxNRG">
<h3>修改参数</h3>
<div _AehqtvKu="display: flex; border-bottom: 1px solid var(--border-_tZJxSUuU); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_oVAJMjNn(event, 'general-_OrPtNaNm')">通用设置</button>
<button class="tab-button" onclick="_oVAJMjNn(event, '_eqQEyNvg-_OrPtNaNm')">链接设置</button>
<button class="tab-button" onclick="_oVAJMjNn(event, 'fine-grained-_OrPtNaNm')">IP源设置</button>
<button class="tab-button" onclick="_oVAJMjNn(event, 'advanced-_OrPtNaNm')">高级设置</button>
</div>
<div _tXrbSgzT="general-_OrPtNaNm" class="tab-_rRyaxNRG" _AehqtvKu="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_fNQnUeCS _tXrbSgzT="themeSelect">
<_VQspPDzH _qYdVEgAp="theme-aurora-glass">极光-玻璃质感</_VQspPDzH>
<_VQspPDzH _qYdVEgAp="theme-particles-glass">粒子-玻璃质感</_VQspPDzH>
<_VQspPDzH _qYdVEgAp="theme-modern-glass">现代-玻璃质感</_VQspPDzH>
<_VQspPDzH _qYdVEgAp="theme-cyberpunk-glass">赛博朋克-玻璃质感</_VQspPDzH>
<_VQspPDzH _qYdVEgAp="theme-dark-particles">暗色-粒子背景</_VQspPDzH>
<_VQspPDzH _qYdVEgAp="theme-dark-bing">暗色-必应壁纸</_VQspPDzH>
<_VQspPDzH _qYdVEgAp="theme-light">亮色-简约</_VQspPDzH>
<_VQspPDzH _qYdVEgAp="theme-light-bing">亮色-必应壁纸</_VQspPDzH>
<_VQspPDzH _qYdVEgAp="theme-marble-light">简约大理石-亮色</_VQspPDzH>
<_VQspPDzH _qYdVEgAp="theme-matrix">矩阵-代码雨</_VQspPDzH>
</_fNQnUeCS>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _YkXXsZDo="_tZJxSUuU" _tXrbSgzT="primaryColorInput">
<span _AehqtvKu="_WgIjjStz: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _YkXXsZDo="_tZJxSUuU" _tXrbSgzT="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AehqtvKu="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _AehqtvKu="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_sOwVmliX-_tZJxSUuU-grid"><input _YkXXsZDo="_tZJxSUuU" _tXrbSgzT="colorInput_title"><textarea _tXrbSgzT="textInput_title" _byyEadyi="1" _HUINxsHw="页面主标题"></textarea></div>
<div class="_sOwVmliX-_tZJxSUuU-grid"><input _YkXXsZDo="_tZJxSUuU" _tXrbSgzT="colorInput_loginButton"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="textInput_loginButton" _HUINxsHw="登录按钮文本"></div>
<div class="_sOwVmliX-_tZJxSUuU-grid"><input _YkXXsZDo="_tZJxSUuU" _tXrbSgzT="colorInput_appDownloadTitle"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="textInput_appDownloadTitle" _HUINxsHw="APP下载标题"></div>
<div class="_sOwVmliX-_tZJxSUuU-grid"><input _YkXXsZDo="_tZJxSUuU" _tXrbSgzT="colorInput_liveTitle"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="textInput_liveTitle" _HUINxsHw="本次结果标题"></div>
<div class="_sOwVmliX-_tZJxSUuU-grid"><input _YkXXsZDo="_tZJxSUuU" _tXrbSgzT="colorInput_cachedTitle"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="textInput_cachedTitle" _HUINxsHw="上次结果标题"></div>
<div class="_sOwVmliX-_tZJxSUuU-grid"><input _YkXXsZDo="_tZJxSUuU" _tXrbSgzT="colorInput_tableHeader"><input _YkXXsZDo="_sOwVmliX" _qYdVEgAp="表格头部文本颜色" readonly _AehqtvKu="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AehqtvKu="align-self: start;"><label>公告栏设置</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _AehqtvKu="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _tXrbSgzT="announcementText" _HUINxsHw="在此输入公告内容" _byyEadyi="3"></textarea>
<div _AehqtvKu="display: flex; justify-_rRyaxNRG: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _AehqtvKu="display: flex; align-items: center; gap: 5px;"><input _YkXXsZDo="checkbox" _tXrbSgzT="enableMarquee"> 顶部走马灯</label>
<label _AehqtvKu="display: flex; align-items: center; gap: 5px;"><input _YkXXsZDo="checkbox" _tXrbSgzT="enablePopup"> 右上角弹窗</label>
<div _tXrbSgzT="popupDurationContainer" _AehqtvKu="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _YkXXsZDo="number" _tXrbSgzT="popupDuration" _AehqtvKu="_WgIjjStz: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _tXrbSgzT="_eqQEyNvg-_OrPtNaNm" class="tab-_rRyaxNRG">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="converterServiceUrlInput" _HUINxsHw="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _YkXXsZDo="number" _tXrbSgzT="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _AehqtvKu="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _tXrbSgzT="subscriptionIdCharset" _byyEadyi="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-_FQpjCqCJ" _StOIzJMY-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _AehqtvKu="justify-_rRyaxNRG: flex-start;"><input _YkXXsZDo="checkbox" _tXrbSgzT="enableItemLinkCheckbox"></div>
</div>
<div _tXrbSgzT="itemLinkConfigGroup" _AehqtvKu="display:none; margin-_DvemNPkT: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _AehqtvKu="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="定义分享链接格式。可用占位符: {_poAVSnAK}, {_nJZkrPYM}, {_ZliHvEEq}, {rank}, {_hpjxdxPu}, {_gBPWRlQA}, {_rguAXScB}, {_LkLDuScG}, {_vuuvPYsv}。">?</span></div>
<div class="form-grid-control"><textarea _tXrbSgzT="itemLinkTemplateInput" _byyEadyi="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_fNQnUeCS _tXrbSgzT="parameterSelectionMode"></_fNQnUeCS></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _tXrbSgzT="parameter-sets-_EQJkxFcL"></div><button _YkXXsZDo="button" _tXrbSgzT="add-parameter-_xfgJQVuL-btn" class="btn btn-outline" _AehqtvKu="margin-_DvemNPkT: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AehqtvKu="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _tXrbSgzT="custom-fields-_EQJkxFcL" _AehqtvKu="_WgIjjStz: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _AehqtvKu="justify-_rRyaxNRG: flex-start;"><button _YkXXsZDo="button" _tXrbSgzT="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _tXrbSgzT="fine-grained-_OrPtNaNm" class="tab-_rRyaxNRG">
<div class="form-grid-label" _AehqtvKu="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _AehqtvKu="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_rRyaxNRG: flex-start;">
<label><input _YkXXsZDo="checkbox" _tXrbSgzT="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _YkXXsZDo="checkbox" _tXrbSgzT="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _tXrbSgzT="fine-grained-sources-_EQJkxFcL"></div><button _YkXXsZDo="button" _tXrbSgzT="add-fine-grained-_rUSloFcX-btn" class="btn btn-outline" _AehqtvKu="margin-_DvemNPkT: 10px;">添加地区</button></div>
</div>
<div _tXrbSgzT="advanced-_OrPtNaNm" class="tab-_rRyaxNRG">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _YkXXsZDo="checkbox" _tXrbSgzT="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _tXrbSgzT="resolvedDomainsGroup" _AehqtvKu="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _tXrbSgzT="resolvedDomainsInput" _HUINxsHw="留空则使用内置默认域名" _byyEadyi="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-_FQpjCqCJ" _StOIzJMY-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _YkXXsZDo="checkbox" _tXrbSgzT="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _tXrbSgzT="customNodesGroup" _AehqtvKu="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _tXrbSgzT="customNodesInput" _HUINxsHw="一行一个地址,支持域名、IPv4、IPv6。" _byyEadyi="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-_FQpjCqCJ" _StOIzJMY-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _YkXXsZDo="number" _tXrbSgzT="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _YkXXsZDo="number" _tXrbSgzT="topNInput"></div>
<div class="form-grid-label" _AehqtvKu="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _AehqtvKu="display: none;"><input _YkXXsZDo="number" _tXrbSgzT="latencyRangeMinInput" _HUINxsHw="最小"><span>-</span><input _YkXXsZDo="number" _tXrbSgzT="latencyRangeMaxInput" _HUINxsHw="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _AehqtvKu="justify-_rRyaxNRG: flex-start;"><input _YkXXsZDo="checkbox" _tXrbSgzT="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-_FQpjCqCJ" _StOIzJMY-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _YkXXsZDo="number" _tXrbSgzT="geoLocationRetriesInput" _AehqtvKu="_WgIjjStz: 80px;"> <span>次</span>
<div _AehqtvKu="display: flex; align-items: center; gap: 5px; margin-_WFmsrArI: 20px;">
<input _YkXXsZDo="checkbox" _tXrbSgzT="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-_FQpjCqCJ" _StOIzJMY-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_rguAXScB:_nJZkrPYM' 或 '_rguAXScB'。">?</span></div>
<div class="form-grid-control"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="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-_FQpjCqCJ" _StOIzJMY-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _AehqtvKu="justify-_rRyaxNRG: flex-start;"><input _YkXXsZDo="checkbox" _tXrbSgzT="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _tXrbSgzT="websocketStreamerGroup" _AehqtvKu="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="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-_FQpjCqCJ" _StOIzJMY-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _AehqtvKu="justify-_rRyaxNRG: flex-start;"><input _YkXXsZDo="checkbox" _tXrbSgzT="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="启用 /_poAVSnAK 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _AehqtvKu="justify-_rRyaxNRG: flex-start;"><input _YkXXsZDo="checkbox" _tXrbSgzT="enableApiCheckbox"></div>
<div class="form-grid-control-full" _tXrbSgzT="apiConfigGroup" _AehqtvKu="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="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-_FQpjCqCJ" _StOIzJMY-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _AehqtvKu="justify-_rRyaxNRG: flex-start;"><input _YkXXsZDo="checkbox" _tXrbSgzT="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _tXrbSgzT="customSubPathGroup" _AehqtvKu="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="customSubPathInput" _HUINxsHw="例如: 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-_FQpjCqCJ" _StOIzJMY-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _AehqtvKu="justify-_rRyaxNRG: flex-start;"><input _YkXXsZDo="checkbox" _tXrbSgzT="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _tXrbSgzT="visitorPasswordGroup" _AehqtvKu="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AehqtvKu="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_FQpjCqCJ" _StOIzJMY-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _AehqtvKu="flex-direction: column; align-items: stretch; gap: 8px;"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="botTokenInput" _HUINxsHw="Telegram Bot Token"><input _YkXXsZDo="_sOwVmliX" _tXrbSgzT="chatIdInput" _HUINxsHw="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _AehqtvKu="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _AehqtvKu="flex-direction: column; align-items: stretch; gap: 8px;"><input _YkXXsZDo="_knaGgUOU" _tXrbSgzT="oldPasswordInput" _HUINxsHw="旧密码"><input _YkXXsZDo="_knaGgUOU" _tXrbSgzT="newPasswordInput" _HUINxsHw="新密码 (至少6位)"><button _tXrbSgzT="changePasswordBtn" class="btn" _AehqtvKu="align-self: flex-start; margin-_WFmsrArI: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _tXrbSgzT="closeModalBtn" class="btn btn-outline">关闭</button><button _tXrbSgzT="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _tXrbSgzT="_xPxoYmzE">
<div class="_drCvOgms-modal-_rRyaxNRG">
<div class="_drCvOgms-modal-_kLGOFDvE"><h3 _tXrbSgzT="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_drCvOgms-modal-_jhBOaFbC" _tXrbSgzT="appModalBody"></div>
</div>
</div>
<div _tXrbSgzT="_WqOhNYLO">
<div class="modal-_rRyaxNRG">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _StOIzJMY-sub-_YkXXsZDo="coreEngine">Xray</button><button class="btn _nTrODcVn-btn" _StOIzJMY-sub-_YkXXsZDo="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _StOIzJMY-sub-_YkXXsZDo="coreProfile">Sing-Box</button><button class="btn _nTrODcVn-btn" _StOIzJMY-sub-_YkXXsZDo="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _StOIzJMY-sub-_YkXXsZDo="configProfile">Clash</button><button class="btn _nTrODcVn-btn" _StOIzJMY-sub-_YkXXsZDo="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _StOIzJMY-sub-_YkXXsZDo="policyProfile">Surge</button><button class="btn _nTrODcVn-btn" _StOIzJMY-sub-_YkXXsZDo="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _AehqtvKu="justify-_rRyaxNRG: center;"><button class="btn btn-outline" _tXrbSgzT="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _tXrbSgzT="_bPmNzSMx">
<div class="modal-_rRyaxNRG">
<img _tXrbSgzT="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _RALxcoXj = {
isValid: (_poAVSnAK) => _RALxcoXj.isIPv4(_poAVSnAK) || _RALxcoXj.isIPv6(_poAVSnAK),
isIPv4: (_poAVSnAK) => {
if (typeof _poAVSnAK !== 'string') return false;
const _FsejDZJy = _poAVSnAK.split('.');
if (_FsejDZJy._fOIlNPKa !== 4) return false;
return _FsejDZJy.every(_lQDNQBBg => {
const _rZZlRSNI = parseInt(_lQDNQBBg, 10);
return !isNaN(_rZZlRSNI) && _rZZlRSNI >= 0 && _rZZlRSNI <= 255 && String(_rZZlRSNI) === _lQDNQBBg;
});
},
isIPv6: (_poAVSnAK) => {
if (typeof _poAVSnAK !== '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]))$/_WttTsMvn.test(_poAVSnAK);
},
toLong4: (_poAVSnAK) => _poAVSnAK.split('.').reduce((acc, octet, _WttTsMvn) => acc + (parseInt(octet) << (8*(3-_WttTsMvn))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_poAVSnAK) => {
try {
const _ikRleSvV = _poAVSnAK.split('/')[0];
const _FsejDZJy = _ikRleSvV.split('::');
if (_FsejDZJy._fOIlNPKa > 2) return 0n;
let _glvnXgIL = [];
if (_FsejDZJy[0]) {
_glvnXgIL = _FsejDZJy[0].split(':');
}
let _ESXUrPsi = [];
if (_FsejDZJy._fOIlNPKa > 1 && _FsejDZJy[1]) {
_ESXUrPsi = _FsejDZJy[1].split(':');
}
if (_glvnXgIL._fOIlNPKa + _ESXUrPsi._fOIlNPKa > 8) return 0n;
const _wUgyROfP = 8 - (_glvnXgIL._fOIlNPKa + _ESXUrPsi._fOIlNPKa);
const _FcdwrEdA = [
..._glvnXgIL,
...Array(_wUgyROfP).fill('0'),
..._ESXUrPsi
].map(_lQDNQBBg => _lQDNQBBg || '0');
while(_FcdwrEdA._fOIlNPKa < 8) {
_FcdwrEdA.push('0');
}
let _bCgbzvue = 0n;
for (const _lQDNQBBg of _FcdwrEdA) {
if (_lQDNQBBg._fOIlNPKa > 4) return 0n;
const _qYdVEgAp = BigInt('0x' + _lQDNQBBg);
_bCgbzvue = (_bCgbzvue << 16n) | _qYdVEgAp;
}
return _bCgbzvue;
} catch(_vTnOJGWl) {
return 0n;
}
},
fromBigInt6: (_bCgbzvue) => {
if (typeof _bCgbzvue !== '_bCgbzvue' || _bCgbzvue < 0n) return null;
const _FsejDZJy = [];
for (let _WttTsMvn = 0; _WttTsMvn < 8; _WttTsMvn++) {
_FsejDZJy.unshift((_bCgbzvue & 0xFFFFn).toString(16));
_bCgbzvue >>= 16n;
}
let _MICeYxiq = { start: -1, _kZKaHkgA: 0 };
let _IdcBAIAh = { start: -1, _kZKaHkgA: 0 };
for (let _WttTsMvn = 0; _WttTsMvn < 8; _WttTsMvn++) {
if (_FsejDZJy[_WttTsMvn] === '0') {
if (_IdcBAIAh.start === -1) _IdcBAIAh.start = _WttTsMvn;
_IdcBAIAh._kZKaHkgA++;
} else {
if (_IdcBAIAh._kZKaHkgA > _MICeYxiq._kZKaHkgA) _MICeYxiq = { ..._IdcBAIAh };
_IdcBAIAh = { start: -1, _kZKaHkgA: 0 };
}
}
if (_IdcBAIAh._kZKaHkgA > _MICeYxiq._kZKaHkgA) _MICeYxiq = { ..._IdcBAIAh };
if (_MICeYxiq._kZKaHkgA > 1) {
_FsejDZJy.splice(_MICeYxiq.start, _MICeYxiq._kZKaHkgA, '');
if (_MICeYxiq.start === 0) _FsejDZJy.unshift('');
if (_MICeYxiq.start + _MICeYxiq._kZKaHkgA === 8) _FsejDZJy.push('');
}
return _FsejDZJy.join(':');
},
cidrToRange: (cidr, _SQjLImba = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _WtbuSQUI = parseInt(bitsStr, 10);
const _HXiPXlgC = new Set();
if (_RALxcoXj.isIPv4(range)) {
if (isNaN(_WtbuSQUI) || _WtbuSQUI < 8 || _WtbuSQUI > 32) return [];
if (_WtbuSQUI === 32) return [range];
const _yRKglXvc = _RALxcoXj.toLong4(range);
const _OKsTfdsX = (0xFFFFFFFF << (32 - _WtbuSQUI)) >>> 0;
const _sERmNaea = _yRKglXvc & _OKsTfdsX;
const _GDKtAhgL = 1 << (32 - _WtbuSQUI);
if (_GDKtAhgL <= 2) return [];
const _iaVZfICf = Math.min(_SQjLImba, _GDKtAhgL - 2);
let _YuJbuOUA = 0;
while (_HXiPXlgC.size < _iaVZfICf && _YuJbuOUA < _iaVZfICf * 5) {
const _XSLycbbb = Math.floor(Math.random() * (_GDKtAhgL - 2)) + 1;
_HXiPXlgC.add(_RALxcoXj.fromLong4((_sERmNaea + _XSLycbbb) >>> 0));
_YuJbuOUA++;
}
return Array.from(_HXiPXlgC);
} else if (_RALxcoXj.isIPv6(range)) {
if (isNaN(_WtbuSQUI) || _WtbuSQUI < 16 || _WtbuSQUI > 128) return [];
if (_WtbuSQUI === 128) return [range];
const _BMdpQBBy = _RALxcoXj.toBigInt6(range);
const _OKsTfdsX = (2n ** BigInt(128 - _WtbuSQUI) - 1n);
const _sERmNaea = _BMdpQBBy & ~_OKsTfdsX;
const _oIBXJugd = 2n ** BigInt(128 - _WtbuSQUI);
if (_oIBXJugd <= 2n) return [];
let _YuJbuOUA = 0;
while (_HXiPXlgC.size < _SQjLImba && _YuJbuOUA < _SQjLImba * 5) {
const _RNxnOkMZ = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_RNxnOkMZ);
let _wyCEYVZT = 0n;
for (const _eMQyhgRU of _RNxnOkMZ) {
_wyCEYVZT = (_wyCEYVZT << 8n) | BigInt(_eMQyhgRU);
}
const _XSLycbbb = _wyCEYVZT % (_oIBXJugd - 2n) + 1n;
_HXiPXlgC.add(_RALxcoXj.fromBigInt6(_sERmNaea + _XSLycbbb));
_YuJbuOUA++;
}
return Array.from(_HXiPXlgC);
}
return [];
} catch(_vTnOJGWl) {
console.error(`CIDR to range failed for ${cidr}:`, _vTnOJGWl);
return [];
}
}
};
function _bWOWJSPc(_yuXrDIqy, _HpmAvQJV) {
const _RrwYwAtN = {};
const _bkLDTKLh = Object._bkLDTKLh(_HpmAvQJV);
const _FsejDZJy = _bkLDTKLh.map(_liMgYOjx => {
const _xNvsKbVN = _yuXrDIqy * (_HpmAvQJV[_liMgYOjx] / 100);
return { _liMgYOjx, _SQjLImba: Math.floor(_xNvsKbVN), remainder: _xNvsKbVN - Math.floor(_xNvsKbVN) };
});
let _sGhMNmpE = _FsejDZJy.reduce((acc, _lQDNQBBg) => acc + _lQDNQBBg._SQjLImba, 0);
_FsejDZJy.sort((a, b) => b.remainder - a.remainder);
let _dXtuuOrF = _yuXrDIqy - _sGhMNmpE;
for (let _WttTsMvn = 0; _WttTsMvn < _dXtuuOrF; _WttTsMvn++) {
_FsejDZJy[_WttTsMvn % _FsejDZJy._fOIlNPKa]._SQjLImba++;
}
for (const _lQDNQBBg of _FsejDZJy) {
_RrwYwAtN[_lQDNQBBg._liMgYOjx] = _lQDNQBBg._SQjLImba;
}
return _RrwYwAtN;
}
const _wRGiGpnv = __PAGE_DATA_JSON__;
const _eveaXWsK = _wRGiGpnv._rkwfWFxm;
const _eVetAyVt = _wRGiGpnv.status;
const _kLNGcFcj = __ALL_CF_CIDR_LIST_JSON__;
const _OoKwhSti = __BALANCED_CF_CIDR_LIST_JSON__;
const _qeGyofke = __DEFAULT_DOMAINS_LIST_JSON__;
const _JQSJmZHn = __COUNTRY_MAP_JSON__;
const _JHwMGClT = _JQSJmZHn;
const _NPXMAOsb = 2500;
const _JHrZltny = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _GXoSAkfj = document.getElementById('_GXoSAkfj');
const _dHzqCBpB = document.getElementById('_dHzqCBpB');
const _VehmpIrL = document.getElementById('status');
const _ygNTsVbd = document.getElementById('_ygNTsVbd');
const _oRawDnwI = document.getElementById('resultsTable').querySelector('tbody');
const _akuKiLXc = document.getElementById('_akuKiLXc');
const _KMjEBOrb = document.getElementById('cachedResultsTable').querySelector('tbody');
const _mrXulzsx = document.getElementById('notificationTooltip');
const _lwLgzKhU = document.getElementById('_lwLgzKhU');
const _KBAGYQCm = document.getElementById('_KBAGYQCm');
const _xPxoYmzE = document.getElementById('_xPxoYmzE');
const _WqOhNYLO = document.getElementById('_WqOhNYLO');
const _bPmNzSMx = document.getElementById('_bPmNzSMx');
const _qEQimrNX = document.getElementById('_qEQimrNX');
const _VRvKQHXU = document.getElementById('_VRvKQHXU');
let _FVVORXhl = null;
let _dwzCrJxz = null;
let _ekZUWtUR = [];
let _CcxIdYrk = false;
let _UwIwmPim = null;
function _JPotiKXQ(_WGqUoTpQ, _JVHFDgFb) {
const _qlEUZcMe=parseInt(_WGqUoTpQ.slice(1),16),t=_JVHFDgFb<0?0:255,p=_JVHFDgFb<0?_JVHFDgFb*-1:_JVHFDgFb,R=_qlEUZcMe>>16,G=_qlEUZcMe>>8&0x00FF,B=_qlEUZcMe&0x0000FF;
const _oIfmfhVv = Math.round((t-R)*p)+R;
const _scHrrHOL = Math.round((t-G)*p)+G;
const _iivFqqUo = Math.round((t-B)*p)+B;
return `rgb(${_oIfmfhVv.toString()}, ${_scHrrHOL.toString()}, ${_iivFqqUo.toString()})`;
}
function _CUNhHGNg(_OrPtNaNm) {
const _vRIGDrpJ = _OsFlgrTa(_OrPtNaNm.primaryColor);
if(_vRIGDrpJ) {
document.documentElement._AehqtvKu.setProperty('--primary-_tZJxSUuU-rgb', `${_vRIGDrpJ.r},${_vRIGDrpJ.g},${_vRIGDrpJ.b}`);
}
document.documentElement._AehqtvKu.setProperty('--primary-_tZJxSUuU', _OrPtNaNm.primaryColor);
document.documentElement._AehqtvKu.setProperty('--primary-hover', _JPotiKXQ(_OrPtNaNm.primaryColor, -0.1));
document.documentElement._AehqtvKu.setProperty('--primary-gradient-start', _JPotiKXQ(_OrPtNaNm.primaryColor, 0.1));
document.documentElement._AehqtvKu.setProperty('--primary-gradient-end', _JPotiKXQ(_OrPtNaNm.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _OrPtNaNm.texts.title;
document.title = _OrPtNaNm.texts.title;
_lwLgzKhU.innerText = _FVVORXhl ? _OrPtNaNm.texts.loginButtonSuccess : _OrPtNaNm.texts.loginButton;
_lwLgzKhU._AehqtvKu._tZJxSUuU = _OrPtNaNm.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _OrPtNaNm.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _OrPtNaNm.texts.liveTitle;
document.getElementById('liveTitleEl')._AehqtvKu._tZJxSUuU = _OrPtNaNm.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _OrPtNaNm.texts.cachedTitle;
document.getElementById('cachedTitleEl')._AehqtvKu._tZJxSUuU = _OrPtNaNm.colors.cachedTitle;
const _pbidZCeg = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_pbidZCeg.forEach((_tXrbSgzT, _USzKPGvD) => {
const _UeQvayeD = document.getElementById(_tXrbSgzT);
if (_UeQvayeD) _UeQvayeD.innerText = _OrPtNaNm.texts[`tableHeader${_USzKPGvD + 1}`] || '';
});
const _EcEENiED = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_EcEENiED.forEach((_tXrbSgzT, _USzKPGvD) => {
const _UeQvayeD = document.getElementById(_tXrbSgzT);
if (_UeQvayeD) _UeQvayeD.innerText = _eveaXWsK.texts[`tableHeader${_USzKPGvD + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._AehqtvKu._tZJxSUuU = _OrPtNaNm.colors.tableHeader);
document._jhBOaFbC.className = '';
document._jhBOaFbC.classList.add(_OrPtNaNm.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_OrPtNaNm.theme)) {
document._jhBOaFbC.classList.add('glassy-components');
}
document._jhBOaFbC._AehqtvKu.backgroundImage = '';
_uXExmXaS();
if (_OrPtNaNm.theme.includes('particles') || _OrPtNaNm.theme.includes('glass')) {
_YWKGERvr(_OrPtNaNm.particleColor);
} else if (_OrPtNaNm.theme.includes('bing')) {
document._jhBOaFbC._AehqtvKu.backgroundImage = '_RxoGPLAw(/bing-wallpaper)';
}
}
function _rKphQtQp() {
_FVVORXhl = null;
if(_dwzCrJxz) clearTimeout(_dwzCrJxz);
_CUNhHGNg(_eveaXWsK);
_STdFGmcl("登录已超时,请重新登录。", "warning");
}
async function _UVhKNuEO() {
if (_FVVORXhl) {
_CudANQEI();
return;
}
const _tNqwRwLC = prompt('请输入管理员密码:');
if (!_tNqwRwLC) return;
try {
const _AjJnZtxk = await fetch('/api/verify-_knaGgUOU', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify({ _knaGgUOU: _tNqwRwLC })
});
const _cFDBCnpB = await _AjJnZtxk.json();
if (_cFDBCnpB.success) {
_FVVORXhl = _tNqwRwLC;
_STdFGmcl("登录成功!有效期5分钟。", "success");
if (_dwzCrJxz) clearTimeout(_dwzCrJxz);
_dwzCrJxz = setTimeout(_rKphQtQp, 5 * 60 * 1000);
_CUNhHGNg(_eveaXWsK);
_CudANQEI();
} else {
throw new Error(_cFDBCnpB._ilbVNPWJ || '密码验证失败');
}
} catch (_vTnOJGWl) {
_STdFGmcl(`登录失败: ${_vTnOJGWl._ilbVNPWJ}`, "error");
}
}
function _qNdoecTg() {
if (!_eVetAyVt._dzKjukpi) {
_qEQimrNX._AehqtvKu.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _knaGgUOU = document.getElementById('initialPassword')._qYdVEgAp;
const _WnLXCnpi = document.getElementById('confirmPassword')._qYdVEgAp;
if (_knaGgUOU !== _WnLXCnpi) {
_STdFGmcl("两次输入的密码不一致!", "error");
return;
}
if (_knaGgUOU._fOIlNPKa < 6) {
_STdFGmcl("密码长度不能少于6位!", "error");
return;
}
try {
const _AjJnZtxk = await fetch('/api/_xfgJQVuL-_knaGgUOU', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify({ _knaGgUOU })
});
const _cFDBCnpB = await _AjJnZtxk.json();
if (_cFDBCnpB.success) {
_STdFGmcl(_cFDBCnpB._ilbVNPWJ, "success");
setTimeout(() => _hpjxdxPu.reload(), 1500);
} else {
throw new Error(_cFDBCnpB._ilbVNPWJ);
}
} catch(_vTnOJGWl) {
_STdFGmcl(`设置密码失败: ${_vTnOJGWl._ilbVNPWJ}`, "error");
}
});
return;
}
_lwLgzKhU.addEventListener('click', _UVhKNuEO);
document.getElementById('closeModalBtn').addEventListener('click', () => { _KBAGYQCm._AehqtvKu.display = 'none'; });
_KBAGYQCm.addEventListener('click', (_vTnOJGWl) => { if (_vTnOJGWl.target === _KBAGYQCm) _KBAGYQCm._AehqtvKu.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_EQJkxFcL .fine-grained-_ZDOLLRZZ-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-_EQJkxFcL .fine-grained-_ZDOLLRZZ-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_FVVORXhl) {
_STdFGmcl("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _UMwcMSVc = [];
document.querySelectorAll('#custom-fields-_EQJkxFcL .custom-field-_hsnwFMKE').forEach(_hsnwFMKE => {
const _ZliHvEEq = _hsnwFMKE.querySelector('.custom-field-_ZliHvEEq')._qYdVEgAp.trim();
const _qYdVEgAp = _hsnwFMKE.querySelector('.custom-field-_qYdVEgAp')._qYdVEgAp.trim();
if (_ZliHvEEq) _UMwcMSVc.push({ _ZliHvEEq, _qYdVEgAp });
});
const _MKWuFHzh = [];
document.querySelectorAll('#parameter-sets-_EQJkxFcL .parameter-_xfgJQVuL-_hsnwFMKE').forEach(_hsnwFMKE => {
const _ZliHvEEq = _hsnwFMKE.querySelector('.param-_xfgJQVuL-_ZliHvEEq')._qYdVEgAp.trim();
const _rguAXScB = _hsnwFMKE.querySelector('.param-_xfgJQVuL-_rguAXScB')._qYdVEgAp.trim();
const _LkLDuScG = _hsnwFMKE.querySelector('.param-_xfgJQVuL-_LkLDuScG')._qYdVEgAp.trim();
const _vuuvPYsv = _hsnwFMKE.querySelector('.param-_xfgJQVuL-_vuuvPYsv')._qYdVEgAp.trim();
if(_ZliHvEEq) _MKWuFHzh.push({ _ZliHvEEq, _rguAXScB, '_LkLDuScG': _LkLDuScG, _vuuvPYsv });
});
const _FwqXQPsI = [];
document.querySelectorAll('#fine-grained-sources-_EQJkxFcL .fine-grained-_rUSloFcX-_hsnwFMKE').forEach(_hsnwFMKE => {
const _hpjxdxPu = _hsnwFMKE.querySelector('.fine-grained-_hpjxdxPu')._qYdVEgAp.trim();
const _HXiPXlgC = _hsnwFMKE.querySelector('.fine-grained-_HXiPXlgC')._qYdVEgAp.trim();
const _ZDOLLRZZ = _hsnwFMKE.querySelector('.fine-grained-_ZDOLLRZZ-cb').checked;
const _cLbDbxlW = parseInt(_hsnwFMKE.querySelector('.fine-grained-_cLbDbxlW')._qYdVEgAp, 10) || 0;
const _ipIYEMhA = _hsnwFMKE.querySelector('.use-_ZliHvEEq-as-_hpjxdxPu-cb').checked;
if (_hpjxdxPu && _HXiPXlgC) {
_FwqXQPsI.push({ _hpjxdxPu, _HXiPXlgC, _ZDOLLRZZ, _cLbDbxlW, _ipIYEMhA });
}
});
let _lfgflnTy = parseInt(document.getElementById('subscriptionIdLength')._qYdVEgAp, 10);
if (isNaN(_lfgflnTy) || _lfgflnTy < 2) _lfgflnTy = 2;
if (_lfgflnTy > 128) _lfgflnTy = 128;
const _rHqCPkWb = {
theme: document.getElementById('themeSelect')._qYdVEgAp,
primaryColor: document.getElementById('primaryColorInput')._qYdVEgAp,
particleColor: document.getElementById('particleColorInput')._qYdVEgAp,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._qYdVEgAp,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._qYdVEgAp, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._qYdVEgAp, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._qYdVEgAp, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._qYdVEgAp, 10) || 0,
_ZVqAwjgJ: document.getElementById('converterServiceUrlInput')._qYdVEgAp.trim(),
subscriptionId: {
_fOIlNPKa: _lfgflnTy,
_cUklIUbo: document.getElementById('subscriptionIdCharset')._qYdVEgAp.trim()
},
api: {
_ZDOLLRZZ: document.getElementById('enableApiCheckbox').checked,
_ilbVNPWJ: document.getElementById('apiMessageInput')._qYdVEgAp || '维护中...',
},
ispFilter: {
_ZDOLLRZZ: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._qYdVEgAp, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_ZDOLLRZZ: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_ZDOLLRZZ: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_RxoGPLAw: document.getElementById('websocketStreamerUrlInput')._qYdVEgAp.trim()
},
visitorPassword: {
_ZDOLLRZZ: document.getElementById('enableVisitorPasswordCheckbox').checked,
_knaGgUOU: document.getElementById('visitorPasswordInput')._qYdVEgAp.trim()
},
customSubPath: {
_ZDOLLRZZ: document.getElementById('enableCustomSubPathCheckbox').checked,
_vuuvPYsv: document.getElementById('customSubPathInput')._qYdVEgAp.trim()
},
itemLink: {
_ZDOLLRZZ: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._qYdVEgAp,
selectionMode: document.getElementById('parameterSelectionMode')._qYdVEgAp,
_MKWuFHzh: _MKWuFHzh,
_UMwcMSVc: _UMwcMSVc,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._qYdVEgAp.trim(),
},
announcement: {
popup: {
_ZDOLLRZZ: document.getElementById('enablePopup').checked,
_sOwVmliX: document.getElementById('announcementText')._qYdVEgAp,
_EtyIXCqn: parseInt(document.getElementById('popupDuration')._qYdVEgAp, 10) || 5
},
marquee: {
_ZDOLLRZZ: document.getElementById('enableMarquee').checked,
_sOwVmliX: document.getElementById('announcementText')._qYdVEgAp
}
},
fineGrained: {
_ZDOLLRZZ: true,
sources: _FwqXQPsI
},
customNodes: {
_ZDOLLRZZ: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._qYdVEgAp
},
texts: {
title: document.getElementById('textInput_title')._qYdVEgAp,
loginButton: document.getElementById('textInput_loginButton')._qYdVEgAp,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._qYdVEgAp,
liveTitle: document.getElementById('textInput_liveTitle')._qYdVEgAp,
cachedTitle: document.getElementById('textInput_cachedTitle')._qYdVEgAp,
},
colors: {
title: document.getElementById('colorInput_title')._qYdVEgAp,
loginButton: document.getElementById('colorInput_loginButton')._qYdVEgAp,
liveTitle: document.getElementById('colorInput_liveTitle')._qYdVEgAp,
cachedTitle: document.getElementById('colorInput_cachedTitle')._qYdVEgAp,
tableHeader: document.getElementById('colorInput_tableHeader')._qYdVEgAp,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._qYdVEgAp.trim(),
chat_id: document.getElementById('chatIdInput')._qYdVEgAp.trim(),
},
};
try {
const _AjJnZtxk = await fetch('/api/_rkwfWFxm', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify({ _rkwfWFxm: _rHqCPkWb, adminPassword: _FVVORXhl })
});
const _cFDBCnpB = await _AjJnZtxk.json();
if (_AjJnZtxk.ok && _cFDBCnpB.success) {
_STdFGmcl("配置已保存,正在刷新...", "success");
setTimeout(() => _hpjxdxPu.reload(), 1500);
} else {
throw new Error(_cFDBCnpB._ilbVNPWJ || '未知错误');
}
} catch (_vTnOJGWl) {
_STdFGmcl(`操作失败: ${_vTnOJGWl._ilbVNPWJ}`, "error");
if (String(_vTnOJGWl._ilbVNPWJ).includes("密码错误")) {
_rKphQtQp();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _IMybqLXx = document.getElementById('oldPasswordInput')._qYdVEgAp;
const _QimZHIXi = document.getElementById('newPasswordInput')._qYdVEgAp;
if (!_IMybqLXx || !_QimZHIXi) {
_STdFGmcl("新旧密码均不能为空!", "error");
return;
}
try {
const _AjJnZtxk = await fetch('/api/change-_knaGgUOU', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify({ _IMybqLXx, _QimZHIXi })
});
const _cFDBCnpB = await _AjJnZtxk.json();
if (_cFDBCnpB.success) {
_STdFGmcl(_cFDBCnpB._ilbVNPWJ, "success");
document.getElementById('oldPasswordInput')._qYdVEgAp = '';
document.getElementById('newPasswordInput')._qYdVEgAp = '';
_FVVORXhl = _QimZHIXi;
} else {
throw new Error(_cFDBCnpB._ilbVNPWJ);
}
} catch(_vTnOJGWl) {
_STdFGmcl(`修改密码失败: ${_vTnOJGWl._ilbVNPWJ}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_vTnOJGWl) => {
document.getElementById('resolvedDomainsGroup')._AehqtvKu.display = _vTnOJGWl.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_vTnOJGWl) => {
document.getElementById('customNodesGroup')._AehqtvKu.display = _vTnOJGWl.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_vTnOJGWl) => {
document.getElementById('apiConfigGroup')._AehqtvKu.display = _vTnOJGWl.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_vTnOJGWl) => {
document.getElementById('itemLinkConfigGroup')._AehqtvKu.display = _vTnOJGWl.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_vTnOJGWl) => {
document.getElementById('websocketStreamerGroup')._AehqtvKu.display = _vTnOJGWl.target.checked ? 'block' : 'none';
const _WrqHEJhe = document.querySelector('#parameter-sets-_EQJkxFcL .param-_xfgJQVuL-_vuuvPYsv');
if (_WrqHEJhe) {
if (_vTnOJGWl.target.checked) {
_WrqHEJhe._qYdVEgAp = '/snippets?_poAVSnAK=endpointAddress:_nJZkrPYM(443)&nat64=6to4';
} else {
_WrqHEJhe._qYdVEgAp = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_WslbJtyv('', '');
});
document.getElementById('add-parameter-_xfgJQVuL-btn').addEventListener('click', () => {
const _SQjLImba = document.querySelectorAll('.parameter-_xfgJQVuL-_hsnwFMKE')._fOIlNPKa + 1;
_gxtdARxk({_ZliHvEEq: `配置${_SQjLImba}`, _rguAXScB: '', _LkLDuScG: '', _vuuvPYsv: ''});
_ufyDpPzc();
});
document.getElementById('add-fine-grained-_rUSloFcX-btn').addEventListener('click', () => {
_tYPrSEgy({ _hpjxdxPu: '', _HXiPXlgC: '', _ZDOLLRZZ: true, _cLbDbxlW: 50, _ipIYEMhA: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_vTnOJGWl) => {
document.getElementById('visitorPasswordGroup')._AehqtvKu.display = _vTnOJGWl.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_vTnOJGWl) => {
document.getElementById('customSubPathGroup')._AehqtvKu.display = _vTnOJGWl.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_vTnOJGWl) => {
document.getElementById('popupDurationContainer')._AehqtvKu.display = _vTnOJGWl.target.checked ? 'flex' : 'none';
});
}
function _WslbJtyv(_ZliHvEEq, _qYdVEgAp) {
const _EQJkxFcL = document.getElementById('custom-fields-_EQJkxFcL');
const _ZKyWLhet = document.createElement('div');
_ZKyWLhet.className = 'form-grid custom-field-_hsnwFMKE';
_ZKyWLhet._AehqtvKu = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_ZKyWLhet.innerHTML = `
<input _YkXXsZDo="_sOwVmliX" class="custom-field-_ZliHvEEq" _HUINxsHw="占位符名称" _qYdVEgAp="${_ZliHvEEq}">
<input _YkXXsZDo="_sOwVmliX" class="custom-field-_qYdVEgAp" _HUINxsHw="值" _qYdVEgAp="${_qYdVEgAp}">
<button _YkXXsZDo="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_EQJkxFcL.appendChild(_ZKyWLhet);
}
function _gxtdARxk(_xfgJQVuL) {
const _EQJkxFcL = document.getElementById('parameter-sets-_EQJkxFcL');
const _ZKyWLhet = document.createElement('div');
_ZKyWLhet.className = 'parameter-_xfgJQVuL-_hsnwFMKE';
_ZKyWLhet.innerHTML = `
<div class="parameter-_xfgJQVuL-_kLGOFDvE">
<input _YkXXsZDo="_sOwVmliX" class="param-_xfgJQVuL-_ZliHvEEq" _HUINxsHw="配置名称" _qYdVEgAp="${_xfgJQVuL._ZliHvEEq}" oninput="_ufyDpPzc()">
<button _YkXXsZDo="button" class="btn btn-outline" onclick="this.closest('.parameter-_xfgJQVuL-_hsnwFMKE').remove(); _ufyDpPzc();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _YkXXsZDo="_sOwVmliX" class="param-_xfgJQVuL-_rguAXScB" _qYdVEgAp="${_xfgJQVuL._rguAXScB || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _YkXXsZDo="_sOwVmliX" class="param-_xfgJQVuL-_LkLDuScG" _qYdVEgAp="${_xfgJQVuL['_LkLDuScG'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _YkXXsZDo="_sOwVmliX" class="param-_xfgJQVuL-_vuuvPYsv" _qYdVEgAp="${_xfgJQVuL._vuuvPYsv || ''}"></div>
</div>
`;
_EQJkxFcL.appendChild(_ZKyWLhet);
}
function _ufyDpPzc() {
const _fNQnUeCS = document.getElementById('parameterSelectionMode');
const _dCRgVLLz = _fNQnUeCS._qYdVEgAp;
_fNQnUeCS.innerHTML = '';
const _rADbybOY = document.createElement('_VQspPDzH');
_rADbybOY._qYdVEgAp = 'random';
_rADbybOY.textContent = '随机轮询';
_fNQnUeCS.appendChild(_rADbybOY);
const _eYmRmehP = document.createElement('_VQspPDzH');
_eYmRmehP._qYdVEgAp = 'first';
_eYmRmehP.textContent = '使用第一组';
_fNQnUeCS.appendChild(_eYmRmehP);
document.querySelectorAll('.param-_xfgJQVuL-_ZliHvEEq').forEach(input => {
const _ZliHvEEq = input._qYdVEgAp.trim();
if (_ZliHvEEq) {
const _VQspPDzH = document.createElement('_VQspPDzH');
_VQspPDzH._qYdVEgAp = _ZliHvEEq;
_VQspPDzH.textContent = `指定: ${_ZliHvEEq}`;
_fNQnUeCS.appendChild(_VQspPDzH);
}
});
if (Array.from(_fNQnUeCS.options).some(opt => opt._qYdVEgAp === _dCRgVLLz)) {
_fNQnUeCS._qYdVEgAp = _dCRgVLLz;
} else {
_fNQnUeCS._qYdVEgAp = 'random';
}
}
function _tYPrSEgy(_rUSloFcX) {
const _EQJkxFcL = document.getElementById('fine-grained-sources-_EQJkxFcL');
const _ZKyWLhet = document.createElement('div');
_ZKyWLhet.className = 'fine-grained-_rUSloFcX-_hsnwFMKE parameter-_xfgJQVuL-_hsnwFMKE';
_ZKyWLhet._AehqtvKu.padding = '1rem';
const _nnxPGUkF = _rUSloFcX._ipIYEMhA ? 'checked' : '';
const _vZcRgZLs = !_rUSloFcX._ipIYEMhA ? 'checked' : '';
const _iETwmNuo = _rUSloFcX._ZDOLLRZZ ? 'checked' : '';
_ZKyWLhet.innerHTML = `
<div _AehqtvKu="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _YkXXsZDo="_sOwVmliX" class="fine-grained-_hpjxdxPu" _HUINxsHw="地区名称 (如: 香港)" _qYdVEgAp="${_rUSloFcX._hpjxdxPu || ''}">
<div _AehqtvKu="display: flex; align-items: center; gap: 5px;"><input _YkXXsZDo="checkbox" class="fine-grained-_ZDOLLRZZ-cb" ${_iETwmNuo}><label>启用</label></div>
<button _YkXXsZDo="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_rUSloFcX-_hsnwFMKE').remove()">删除</button>
</div>
<textarea class="fine-grained-_HXiPXlgC" _HUINxsHw="IP源 (每行一个IP、CIDR或URL)" _byyEadyi="3" _AehqtvKu="_WgIjjStz:100%;">${_rUSloFcX._HXiPXlgC || ''}</textarea>
<div class="fine-grained-options" _AehqtvKu="justify-_rRyaxNRG: space-between;">
<div _AehqtvKu="display: flex; gap: 1rem;">
<label><input _YkXXsZDo="checkbox" class="query-_CrTxPtih-cb" ${_vZcRgZLs}>查询真实归属地</label>
<label><input _YkXXsZDo="checkbox" class="use-_ZliHvEEq-as-_hpjxdxPu-cb" ${_nnxPGUkF}>使用地区名称作为归属地</label>
</div>
<div _AehqtvKu="display: flex; align-items: center; gap: 5px;"><input _YkXXsZDo="number" class="fine-grained-_cLbDbxlW _cLbDbxlW-input" _qYdVEgAp="${_rUSloFcX._cLbDbxlW || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _SFBkLpin = _ZKyWLhet.querySelector('.query-_CrTxPtih-cb');
const _SQlLETWs = _ZKyWLhet.querySelector('.use-_ZliHvEEq-as-_hpjxdxPu-cb');
_SFBkLpin.addEventListener('change', () => {
if (_SFBkLpin.checked) {
_SQlLETWs.checked = false;
} else if (!_SQlLETWs.checked) {
_SFBkLpin.checked = true;
}
});
_SQlLETWs.addEventListener('change', () => {
if (_SQlLETWs.checked) {
_SFBkLpin.checked = false;
} else if (!_SQlLETWs.checked) {
_SQlLETWs.checked = true;
}
});
_EQJkxFcL.appendChild(_ZKyWLhet);
}
function _CudANQEI() {
const _OrPtNaNm = _eveaXWsK;
document.getElementById('themeSelect')._qYdVEgAp = _OrPtNaNm.theme;
document.getElementById('primaryColorInput')._qYdVEgAp = _OrPtNaNm.primaryColor;
document.getElementById('particleColorInput')._qYdVEgAp = _OrPtNaNm.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _OrPtNaNm.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._HUINxsHw = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._qYdVEgAp = _OrPtNaNm.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._AehqtvKu.display = _OrPtNaNm.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _OrPtNaNm.customNodes._ZDOLLRZZ;
document.getElementById('customNodesInput')._qYdVEgAp = _OrPtNaNm.customNodes.list || '';
document.getElementById('customNodesGroup')._AehqtvKu.display = _OrPtNaNm.customNodes._ZDOLLRZZ ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._qYdVEgAp = _OrPtNaNm._ZVqAwjgJ || '';
document.getElementById('subscriptionIdLength')._qYdVEgAp = _OrPtNaNm.subscriptionId._fOIlNPKa;
document.getElementById('subscriptionIdCharset')._qYdVEgAp = _OrPtNaNm.subscriptionId._cUklIUbo;
document.getElementById('enableItemLinkCheckbox').checked = _OrPtNaNm.itemLink._ZDOLLRZZ;
document.getElementById('itemLinkConfigGroup')._AehqtvKu.display = _OrPtNaNm.itemLink._ZDOLLRZZ ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._qYdVEgAp = _OrPtNaNm.itemLink.template;
const _drAbIsks = document.getElementById('parameter-sets-_EQJkxFcL');
_drAbIsks.innerHTML = '';
if (_OrPtNaNm.itemLink._MKWuFHzh && Array.isArray(_OrPtNaNm.itemLink._MKWuFHzh)) {
_OrPtNaNm.itemLink._MKWuFHzh.forEach(_xfgJQVuL => _gxtdARxk(_xfgJQVuL));
}
_ufyDpPzc();
document.getElementById('parameterSelectionMode')._qYdVEgAp = _OrPtNaNm.itemLink.selectionMode || 'random';
const _WrqHEJhe = document.querySelector('#parameter-sets-_EQJkxFcL .param-_xfgJQVuL-_vuuvPYsv');
if (_WrqHEJhe && _OrPtNaNm.websocketStreamer && _OrPtNaNm.websocketStreamer._ZDOLLRZZ) {
_WrqHEJhe._qYdVEgAp = '/snippets?_poAVSnAK=endpointAddress:_nJZkrPYM(443)&nat64=6to4';
}
const _PNRqKWXT = document.getElementById('custom-fields-_EQJkxFcL');
_PNRqKWXT.innerHTML = '';
if (_OrPtNaNm.itemLink._UMwcMSVc && Array.isArray(_OrPtNaNm.itemLink._UMwcMSVc)) {
_OrPtNaNm.itemLink._UMwcMSVc.forEach(field => _WslbJtyv(field._ZliHvEEq, field._qYdVEgAp));
}
document.getElementById('universalFallbackAddressInput')._qYdVEgAp = _OrPtNaNm.dataFeeds.universalFallbackAddress || '';
const _DtdmLqkG = _OrPtNaNm.websocketStreamer && _OrPtNaNm.websocketStreamer._ZDOLLRZZ;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _DtdmLqkG;
document.getElementById('websocketStreamerUrlInput')._qYdVEgAp = _OrPtNaNm.websocketStreamer ? _OrPtNaNm.websocketStreamer._RxoGPLAw : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._AehqtvKu.display = _DtdmLqkG ? 'block' : 'none';
const _dgIixjOh = _OrPtNaNm.announcement || {};
document.getElementById('announcementText')._qYdVEgAp = (_dgIixjOh.popup && _dgIixjOh.popup._sOwVmliX) || (_dgIixjOh.marquee && _dgIixjOh.marquee._sOwVmliX) || '';
document.getElementById('enableMarquee').checked = _dgIixjOh.marquee && _dgIixjOh.marquee._ZDOLLRZZ;
document.getElementById('enablePopup').checked = _dgIixjOh.popup && _dgIixjOh.popup._ZDOLLRZZ;
document.getElementById('popupDuration')._qYdVEgAp = (_dgIixjOh.popup && _dgIixjOh.popup._EtyIXCqn) || 5;
document.getElementById('popupDurationContainer')._AehqtvKu.display = (_dgIixjOh.popup && _dgIixjOh.popup._ZDOLLRZZ) ? 'flex' : 'none';
const _QdsShVqP = document.getElementById('fine-grained-sources-_EQJkxFcL');
_QdsShVqP.innerHTML = '';
if (_OrPtNaNm.fineGrained.sources && Array.isArray(_OrPtNaNm.fineGrained.sources)) {
_OrPtNaNm.fineGrained.sources.forEach(_rUSloFcX => _tYPrSEgy(_rUSloFcX));
}
document.getElementById('sampleSizeInput')._qYdVEgAp = _OrPtNaNm.sampleSize;
document.getElementById('topNInput')._qYdVEgAp = _OrPtNaNm.topN;
document.getElementById('latencyRangeMinInput')._qYdVEgAp = _OrPtNaNm.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._qYdVEgAp = _OrPtNaNm.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _OrPtNaNm.ispFilter._ZDOLLRZZ;
const _hFabMekY = _OrPtNaNm.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._qYdVEgAp = _hFabMekY.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _hFabMekY.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _OrPtNaNm.streamer._ZDOLLRZZ;
document.getElementById('enableApiCheckbox').checked = _OrPtNaNm.api._ZDOLLRZZ;
document.getElementById('apiConfigGroup')._AehqtvKu.display = _OrPtNaNm.api._ZDOLLRZZ ? 'block' : 'none';
document.getElementById('apiMessageInput')._qYdVEgAp = _OrPtNaNm.api._ilbVNPWJ;
const _eenqsoux = _OrPtNaNm.customSubPath && _OrPtNaNm.customSubPath._ZDOLLRZZ;
document.getElementById('enableCustomSubPathCheckbox').checked = _eenqsoux;
document.getElementById('customSubPathInput')._qYdVEgAp = _OrPtNaNm.customSubPath ? _OrPtNaNm.customSubPath._vuuvPYsv : 'latest';
document.getElementById('customSubPathGroup')._AehqtvKu.display = _eenqsoux ? 'block' : 'none';
const _GqFqwsrw = _OrPtNaNm.visitorPassword && _OrPtNaNm.visitorPassword._ZDOLLRZZ;
document.getElementById('enableVisitorPasswordCheckbox').checked = _GqFqwsrw;
document.getElementById('visitorPasswordInput')._qYdVEgAp = _OrPtNaNm.visitorPassword ? _OrPtNaNm.visitorPassword._knaGgUOU : '';
document.getElementById('visitorPasswordGroup')._AehqtvKu.display = _GqFqwsrw ? 'block' : 'none';
document.getElementById('textInput_title')._qYdVEgAp = _OrPtNaNm.texts.title;
document.getElementById('textInput_loginButton')._qYdVEgAp = _OrPtNaNm.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._qYdVEgAp = _OrPtNaNm.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._qYdVEgAp = _OrPtNaNm.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._qYdVEgAp = _OrPtNaNm.texts.cachedTitle;
document.getElementById('colorInput_title')._qYdVEgAp = _OrPtNaNm.colors.title;
document.getElementById('colorInput_loginButton')._qYdVEgAp = _OrPtNaNm.colors.loginButton;
document.getElementById('colorInput_liveTitle')._qYdVEgAp = _OrPtNaNm.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._qYdVEgAp = _OrPtNaNm.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._qYdVEgAp = _OrPtNaNm.colors.tableHeader;
document.getElementById('botTokenInput')._qYdVEgAp = _OrPtNaNm.telegram.bot_token || '';
document.getElementById('chatIdInput')._qYdVEgAp = _OrPtNaNm.telegram.chat_id || '';
_KBAGYQCm._AehqtvKu.display = 'flex';
}
function _bleGWjAw(_nSzLjJvC) {
if (window.innerWidth <= 768) {
const _byyEadyi = _nSzLjJvC.querySelectorAll('thead tr, tbody tr');
_byyEadyi.forEach(_hsnwFMKE => {
const _CfhupZKL = Array.from(_hsnwFMKE.children);
const _WCJIwUNl = [
_CfhupZKL[0],
_CfhupZKL[1],
_CfhupZKL[3],
_CfhupZKL[6],
_CfhupZKL[2],
_CfhupZKL[4],
_CfhupZKL[5]
];
_WCJIwUNl.forEach(cell => _hsnwFMKE.appendChild(cell));
});
}
}
async function _spdgVvCq() {
if (!_eVetAyVt._dzKjukpi) {
_qNdoecTg();
return;
}
if (_eveaXWsK.announcement && _eveaXWsK.announcement.marquee && _eveaXWsK.announcement.marquee._ZDOLLRZZ && _eveaXWsK.announcement.marquee._sOwVmliX) {
const _GwHagktc = document.getElementById('marquee-_EQJkxFcL');
const _mHMaEqNO = document.getElementById('marquee-_sOwVmliX');
const _iZjFpVcH = document.querySelector('.progress-section');
if (_GwHagktc && _mHMaEqNO && _iZjFpVcH) {
_mHMaEqNO.innerText = _eveaXWsK.announcement.marquee._sOwVmliX;
_GwHagktc._AehqtvKu.display = 'block';
const _EceyXVGE = () => {
_GwHagktc._AehqtvKu._WgIjjStz = `${_iZjFpVcH.offsetWidth}px`;
const _bmvkNHTx = _mHMaEqNO.offsetWidth;
const _vToxkaAL = _GwHagktc.offsetWidth;
const _EtyIXCqn = (_bmvkNHTx + _vToxkaAL) / 100;
_mHMaEqNO._AehqtvKu.animationDuration = `${Math.max(10, _EtyIXCqn)}s`;
};
_EceyXVGE();
window.addEventListener('resize', _EceyXVGE);
}
}
_CUNhHGNg(_eveaXWsK);
if (_eveaXWsK.announcement && _eveaXWsK.announcement.popup && _eveaXWsK.announcement.popup._ZDOLLRZZ && _eveaXWsK.announcement.popup._sOwVmliX) {
setTimeout(() => {
_STdFGmcl(_eveaXWsK.announcement.popup._sOwVmliX, 'info', _eveaXWsK.announcement.popup._EtyIXCqn * 1000);
}, 500);
}
_qNdoecTg();
_xxGPcQcH();
_deryESdW();
_kyFIScFW();
await _DhlBhjPN();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _uWRxvtKS = window._hpjxdxPu.origin + '/_poAVSnAK';
navigator.clipboard.writeText(_uWRxvtKS).then(() => {
_STdFGmcl('IP 列表 API 地址已复制!', 'success');
});
});
if (_eveaXWsK.visitorPassword && _eveaXWsK.visitorPassword._ZDOLLRZZ) {
_GXoSAkfj._AehqtvKu.display = 'none';
const _xKMyVtdv = document.getElementById('visitorPasswordPrompt');
_xKMyVtdv._AehqtvKu.display = 'block';
const _ycXqvYcc = document.getElementById('visitorPasswordEntry');
const _IVBCEcUC = document.getElementById('startTestWithPasswordBtn');
const _XZBTnHcs = async () => {
const _knaGgUOU = _ycXqvYcc._qYdVEgAp;
if (!_knaGgUOU) {
_STdFGmcl('请输入访客密码', 'warning');
return;
}
try {
const _AjJnZtxk = await fetch('/api/verify-visitor-_knaGgUOU', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify({ _knaGgUOU })
});
const _cFDBCnpB = await _AjJnZtxk.json();
if (_AjJnZtxk.ok && _cFDBCnpB.success) {
_STdFGmcl('验证成功,开始测试...', 'success');
_xKMyVtdv._AehqtvKu.display = 'none';
_GXoSAkfj._AehqtvKu.display = 'block';
await _zptbssid();
} else {
throw new Error(_cFDBCnpB._ilbVNPWJ || '密码错误');
}
} catch (_vTnOJGWl) {
_STdFGmcl(`验证失败: ${_vTnOJGWl._ilbVNPWJ}`, "error");
_ycXqvYcc._qYdVEgAp = '';
_ycXqvYcc.focus();
}
};
_IVBCEcUC.addEventListener('click', _XZBTnHcs);
_ycXqvYcc.addEventListener('keypress', (_vTnOJGWl) => {
if (_vTnOJGWl._liMgYOjx === 'Enter') {
_vTnOJGWl.preventDefault();
_XZBTnHcs();
}
});
_ycXqvYcc.focus();
} else {
_VehmpIrL.textContent = "页面加载完成,准备开始测试...";
await _YXhuFtUw(100);
await _zptbssid();
}
}
async function _YXhuFtUw(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _OsFlgrTa(_WGqUoTpQ) {
let _cFDBCnpB = /^#?([a-_qlEUZcMe\d]{2})([a-_qlEUZcMe\d]{2})([a-_qlEUZcMe\d]{2})$/_WttTsMvn.exec(_WGqUoTpQ);
return _cFDBCnpB ? { r: parseInt(_cFDBCnpB[1], 16), g: parseInt(_cFDBCnpB[2], 16), b: parseInt(_cFDBCnpB[3], 16) } : null;
}
async function _peNiYNJP(_poAVSnAK) {
const _MVaeyaxC = new AbortController();
const _LOseTzng = setTimeout(() => _MVaeyaxC.abort(), _NPXMAOsb);
const _WTwLXnOx = Date.now();
try {
const _ObcqzQyS = _RALxcoXj.isIPv6(_poAVSnAK) ? `[${_poAVSnAK}]` : _poAVSnAK;
const _RxoGPLAw = `https://${_ObcqzQyS}/cdn-cgi/trace`;
await fetch(_RxoGPLAw, {
signal: _MVaeyaxC.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._ZliHvEEq === 'AbortError') {
return { _poAVSnAK, _afxoiLbN: Infinity, error: '超时' };
}
} finally {
clearTimeout(_LOseTzng);
}
const _afxoiLbN = Date.now() - _WTwLXnOx;
return { _poAVSnAK, _afxoiLbN: _afxoiLbN, error: null };
}
function _CWcdAbpy(_cFDBCnpB, _USzKPGvD) {
const { itemLink } = _eveaXWsK;
if (!itemLink || !itemLink._ZDOLLRZZ) return null;
const { template, _MKWuFHzh, selectionMode, _UMwcMSVc } = itemLink;
if (!_MKWuFHzh || _MKWuFHzh._fOIlNPKa === 0) return null;
let _NarBZxYp;
if (selectionMode === 'random') {
_NarBZxYp = _MKWuFHzh[_USzKPGvD % _MKWuFHzh._fOIlNPKa];
} else if (selectionMode === 'first') {
_NarBZxYp = _MKWuFHzh[0];
} else {
_NarBZxYp = _MKWuFHzh.find(s => s._ZliHvEEq === selectionMode) || _MKWuFHzh[0];
}
if (!_NarBZxYp) return null;
let _eqQEyNvg = template;
const _HmGuGpfG = _cFDBCnpB._nJZkrPYM || 443;
const _AmNfMyfF = _RALxcoXj.isIPv6(_cFDBCnpB._poAVSnAK) ? `[${_cFDBCnpB._poAVSnAK}]` : _cFDBCnpB._poAVSnAK;
let _ZliHvEEq = `${_USzKPGvD + 1} 、 ${_cFDBCnpB._hpjxdxPu || '未知'}`;
if (!_cFDBCnpB._gBPWRlQA || !_cFDBCnpB._gBPWRlQA.toLowerCase().includes('cloudflare')) {
_ZliHvEEq += '(反代)';
}
let _rguAXScB = _NarBZxYp._rguAXScB || window._hpjxdxPu._fJMnfumW;
_eqQEyNvg = _eqQEyNvg.replace(/{_poAVSnAK}/g, _AmNfMyfF)
.replace(/{_nJZkrPYM}/g, _HmGuGpfG)
.replace(/{_ZliHvEEq}/g, encodeURIComponent(_ZliHvEEq))
.replace(/{rank}/g, _USzKPGvD + 1)
.replace(/{_hpjxdxPu}/g, encodeURIComponent(_cFDBCnpB._hpjxdxPu || '未知'))
.replace(/{_gBPWRlQA}/g, encodeURIComponent(_cFDBCnpB._gBPWRlQA || '未知'))
.replace(/{_rguAXScB}/g, encodeURIComponent(_rguAXScB))
.replace(/{_LkLDuScG}/g, encodeURIComponent(_NarBZxYp['_LkLDuScG'] || ''))
.replace(/{_vuuvPYsv}/g, encodeURIComponent(encodeURIComponent(_NarBZxYp._vuuvPYsv || '')));
if (_UMwcMSVc) {
_UMwcMSVc.forEach(field => {
const _HUINxsHw = new RegExp('{' + field._ZliHvEEq + '}', 'g');
_eqQEyNvg = _eqQEyNvg.replace(_HUINxsHw, encodeURIComponent(field._qYdVEgAp));
});
}
return _eqQEyNvg;
}
function _IwBHZHwx(_StOIzJMY, _QhJkoxmQ, isCached = false) {
_QhJkoxmQ.innerHTML = '';
const _NzqybVhr = _StOIzJMY._NzqybVhr || [];
const _qRvZUCQO = _StOIzJMY.generatedBy || null;
const _nJpgfCsx = isCached ? _akuKiLXc : _ygNTsVbd;
const _DfZDutuB = isCached ? (_akuKiLXc.querySelector('.generator-info')) : (_ygNTsVbd.querySelector('.generator-info'));
if (_NzqybVhr._fOIlNPKa === 0) {
_nJpgfCsx._AehqtvKu.display = 'none';
if (!isCached) _VRvKQHXU._AehqtvKu.display = 'none';
if (_DfZDutuB) _DfZDutuB.textContent = '';
return;
}
_nJpgfCsx._AehqtvKu.display = 'block';
if (!isCached && _NzqybVhr._fOIlNPKa > 0) {
_VRvKQHXU._AehqtvKu.display = 'block';
}
if (_DfZDutuB && _qRvZUCQO) {
_DfZDutuB.innerHTML = `数据来源 ${_qRvZUCQO._poAVSnAK} (${_qRvZUCQO._hpjxdxPu}) <span>${_qRvZUCQO.time}</span>`;
}
_NzqybVhr.forEach((_cFDBCnpB, _USzKPGvD) => {
const _HmGuGpfG = _cFDBCnpB._nJZkrPYM || 443;
const _hsnwFMKE = _QhJkoxmQ.insertRow();
_hsnwFMKE.insertCell().textContent = _USzKPGvD + 1;
const _BkJeQnPp = _hsnwFMKE.insertCell();
_BkJeQnPp.textContent = _cFDBCnpB._poAVSnAK;
_BkJeQnPp.className = '_poAVSnAK-_CFeneMIG';
_hsnwFMKE.insertCell().textContent = _HmGuGpfG;
const _ISjBSbTQ = _hsnwFMKE.insertCell();
_ISjBSbTQ.textContent = (_cFDBCnpB._afxoiLbN === Infinity) ? (_cFDBCnpB.error || '错误') : _cFDBCnpB._afxoiLbN;
_ISjBSbTQ.className = 'ping-_qYdVEgAp';
_hsnwFMKE.insertCell().textContent = _cFDBCnpB._hpjxdxPu || '未知';
_hsnwFMKE.insertCell().textContent = _cFDBCnpB._gBPWRlQA || '未知';
const _XcvCmppC = _hsnwFMKE.insertCell();
_XcvCmppC.className = 'actions-cell';
const _GufHRrmM = document.createElement('button');
_GufHRrmM.textContent = '复制IP';
_GufHRrmM.className = 'btn btn-outline';
_GufHRrmM.onclick = () => { navigator.clipboard.writeText(_cFDBCnpB._poAVSnAK).then(() => _STdFGmcl('IP复制成功!', 'success')); };
if (_eveaXWsK.itemLink && _eveaXWsK.itemLink._ZDOLLRZZ) {
const _IQGyamuL = document.createElement('button');
_IQGyamuL.textContent = '复制节点';
_IQGyamuL.className = 'btn btn-outline';
_IQGyamuL.onclick = () => {
const _eqQEyNvg = _CWcdAbpy(_cFDBCnpB, _USzKPGvD);
if (_eqQEyNvg) {
navigator.clipboard.writeText(_eqQEyNvg).then(() => _STdFGmcl('订阅链接复制成功!', 'success'));
}
};
_XcvCmppC.appendChild(_IQGyamuL);
}
_XcvCmppC.appendChild(_GufHRrmM);
});
_bleGWjAw(_QhJkoxmQ.parentElement);
}
async function _YblJuCgR(_nmVGREwC) {
const _xEZtVfaE = (_nmVGREwC || '').trim().split(/\s+|\n+/).filter(Boolean);
const _irTFgash = [];
const _GEwzIzwT = [];
const _xMULwgpX = (str) => {
try {
const _RxoGPLAw = new URL(str);
return _RxoGPLAw.protocol === "http:" || _RxoGPLAw.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _xKFAGVxL of _xEZtVfaE) {
if (_xMULwgpX(_xKFAGVxL)) {
_irTFgash.push(_xKFAGVxL);
} else {
_GEwzIzwT.push(_xKFAGVxL);
}
}
let _dGrfdYzQ = [];
if (_irTFgash._fOIlNPKa > 0) {
try {
const _AjJnZtxk = await fetch('/api/parse-_HXiPXlgC-from-_irTFgash', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify({ _irTFgash })
});
if (_AjJnZtxk.ok) {
const _StOIzJMY = await _AjJnZtxk.json();
_dGrfdYzQ = _StOIzJMY._HXiPXlgC || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _AjJnZtxk._sOwVmliX());
_STdFGmcl('从URL获取IP失败', 'error');
}
} catch (_vTnOJGWl) {
console.error('Error fetching IPs from URLs:', _vTnOJGWl);
_STdFGmcl(`从URL获取IP失败: ${_vTnOJGWl._ilbVNPWJ}`, 'error');
}
}
return [..._GEwzIzwT, ..._dGrfdYzQ];
}
async function _zptbssid() {
_CcxIdYrk = false;
_ekZUWtUR = [];
_UwIwmPim = null;
_VRvKQHXU._AehqtvKu.display = 'none';
_VehmpIrL.textContent = '准备IP源...';
_dHzqCBpB._qYdVEgAp = 0;
_ygNTsVbd._AehqtvKu.display = 'none';
await _YXhuFtUw();
const _tJaMSIPK = new Map();
let _pTVDKWwk = [];
const _IBqvwLKy = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_eveaXWsK.useResolvedDomains) {
_VehmpIrL.textContent = '正在从域名解析IP...';
const _FjClbbqN = (_eveaXWsK.resolvedDomains || '').trim();
const _HwCdXIBH = _FjClbbqN ? _FjClbbqN.split(/\s+|\n+/) : _qeGyofke;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_HXiPXlgC', { method: 'POST', _pbidZCeg: { 'Content-Type': 'application/json' }, _jhBOaFbC: JSON.stringify({ _HwCdXIBH, _YkXXsZDo: 'A' }) }),
fetch('/api/get-resolved-_HXiPXlgC', { method: 'POST', _pbidZCeg: { 'Content-Type': 'application/json' }, _jhBOaFbC: JSON.stringify({ _HwCdXIBH, _YkXXsZDo: 'AAAA' }) })
]);
let _bNftebPE = [];
if (ipv4Response.ok) _bNftebPE.push(...(await ipv4Response._sOwVmliX()).split(/\s+|\n+/));
if (ipv6Response.ok) _bNftebPE.push(...(await ipv6Response._sOwVmliX()).split(/\s+|\n+/));
_pTVDKWwk.push(..._bNftebPE.filter(_poAVSnAK => _poAVSnAK.trim()).map(_poAVSnAK => ({ _poAVSnAK, _nJZkrPYM: null, sourceName: 'resolved' })));
} catch (_vTnOJGWl) {
_STdFGmcl(`域名解析失败: ${_vTnOJGWl._ilbVNPWJ}`, 'error');
}
}
const _fwXyOaAP = (_eveaXWsK.fineGrained.sources || []).filter(s => s._ZDOLLRZZ);
if (_fwXyOaAP._fOIlNPKa > 0) {
const _NKHxtKmf = {};
let _bnvrNFPz = 0;
_fwXyOaAP.forEach(s => {
const _fxZlGvhR = Number(s._cLbDbxlW) || 0;
_NKHxtKmf[s._hpjxdxPu] = _fxZlGvhR;
_bnvrNFPz += _fxZlGvhR;
});
if (_bnvrNFPz > 0) {
Object._bkLDTKLh(_NKHxtKmf).forEach(k => {
_NKHxtKmf[k] = (_NKHxtKmf[k] / _bnvrNFPz) * 100;
});
} else {
_fwXyOaAP.forEach(s => _NKHxtKmf[s._hpjxdxPu] = 100 / _fwXyOaAP._fOIlNPKa);
}
const _jUZKWRig = _bWOWJSPc(_eveaXWsK.sampleSize, _NKHxtKmf);
for (const _rUSloFcX of _fwXyOaAP) {
const _SQjLImba = _jUZKWRig[_rUSloFcX._hpjxdxPu];
if (!_SQjLImba) continue;
_VehmpIrL.textContent = `正在处理 [ ${_rUSloFcX._hpjxdxPu} ] 源...`;
const _jKwGQNil = await _YblJuCgR(_rUSloFcX._HXiPXlgC);
if (_rUSloFcX._ipIYEMhA) {
_jKwGQNil.forEach(_xKFAGVxL => _tJaMSIPK._xfgJQVuL(_xKFAGVxL, _rUSloFcX._hpjxdxPu));
}
let _rzIYctlb = [];
const _vxwhoHfX = Math.ceil(_SQjLImba / (_jKwGQNil._fOIlNPKa || 1)) || 1;
for (const _xKFAGVxL of _jKwGQNil) {
if (_IBqvwLKy.test(_xKFAGVxL)) {
const _NvwCaSaF = _RALxcoXj.cidrToRange(_xKFAGVxL, _vxwhoHfX);
if (_tJaMSIPK.has(_xKFAGVxL)) {
_NvwCaSaF.forEach(_poAVSnAK => _tJaMSIPK._xfgJQVuL(_poAVSnAK, _tJaMSIPK.get(_xKFAGVxL)));
}
_rzIYctlb.push(..._NvwCaSaF.map(_poAVSnAK => ({ _poAVSnAK, _nJZkrPYM: null })));
} else {
const _noeHRrbx = _xKFAGVxL.lastIndexOf(':');
let _poAVSnAK = _xKFAGVxL;
let _nJZkrPYM = null;
if (_noeHRrbx > _xKFAGVxL.lastIndexOf(']')) {
const _UxIVmBoi = _xKFAGVxL.substring(_noeHRrbx + 1);
if (!isNaN(_UxIVmBoi) && _UxIVmBoi._fOIlNPKa > 0) {
_poAVSnAK = _xKFAGVxL.substring(0, _noeHRrbx);
_nJZkrPYM = _UxIVmBoi;
}
}
if (_RALxcoXj.isValid(_poAVSnAK.replace(/[\[\]]/g, ''))) {
_rzIYctlb.push({ _poAVSnAK: _poAVSnAK.replace(/[\[\]]/g, ''), _nJZkrPYM });
}
}
}
let _UlzlDsWj = _rzIYctlb.filter((v,_WttTsMvn,a)=>a.findIndex(t=>(t._poAVSnAK === v._poAVSnAK && t._nJZkrPYM === v._nJZkrPYM))===_WttTsMvn);
_UlzlDsWj.sort(() => 0.5 - Math.random());
_pTVDKWwk.push(..._UlzlDsWj.slice(0, _SQjLImba).map(_VEtEXgBx => ({ ..._VEtEXgBx, sourceName: `fineGrained-${_rUSloFcX._hpjxdxPu}` })));
}
}
if (_pTVDKWwk._fOIlNPKa === 0) {
_VehmpIrL.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_VehmpIrL.textContent = `开始测试 ${_pTVDKWwk._fOIlNPKa} 个IP地址...`;
_dHzqCBpB.max = _pTVDKWwk._fOIlNPKa;
let _FocAfOXp = 0;
const _XifczJTo = [];
const _NRHvMkoJ = [..._pTVDKWwk];
const _eFiDSVHo = async () => {
while (_NRHvMkoJ._fOIlNPKa > 0) {
const _VEtEXgBx = _NRHvMkoJ.shift(); if (!_VEtEXgBx) continue;
const _cFDBCnpB = await _peNiYNJP(_VEtEXgBx._poAVSnAK);
_XifczJTo.push({ ..._VEtEXgBx, ..._cFDBCnpB });
_FocAfOXp++;
_dHzqCBpB._qYdVEgAp = _FocAfOXp;
_VehmpIrL.textContent = `${_eveaXWsK.texts.pingInProgress} (${_FocAfOXp}/${_pTVDKWwk._fOIlNPKa}): ${_VEtEXgBx._poAVSnAK} - ${_cFDBCnpB._afxoiLbN === Infinity ? _cFDBCnpB.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_JHrZltny).fill(null).map(_eFiDSVHo));
let _DpOZLJFJ = _XifczJTo.filter(r => r._afxoiLbN !== Infinity);
let _tBaLiaGp = [];
const _GlKIcezg = _DpOZLJFJ.filter(r => r.sourceName.startsWith('fineGrained-'));
const _wodEzvHD = _DpOZLJFJ.filter(r => r.sourceName === 'resolved');
if (_GlKIcezg._fOIlNPKa > 0) {
const _fwXyOaAP = (_eveaXWsK.fineGrained.sources || []).filter(s => s._ZDOLLRZZ);
const _NKHxtKmf = {};
let _bnvrNFPz = 0;
_fwXyOaAP.forEach(s => {
const _fxZlGvhR = Number(s._cLbDbxlW) || 0;
_NKHxtKmf[s._hpjxdxPu] = _fxZlGvhR;
_bnvrNFPz += _fxZlGvhR;
});
if (_bnvrNFPz > 0) {
Object._bkLDTKLh(_NKHxtKmf).forEach(k => _NKHxtKmf[k] = (_NKHxtKmf[k] / _bnvrNFPz) * 100);
} else if (_fwXyOaAP._fOIlNPKa > 0) {
_fwXyOaAP.forEach(s => _NKHxtKmf[s._hpjxdxPu] = 100 / _fwXyOaAP._fOIlNPKa);
}
const _TLHDdxzj = _bWOWJSPc(_eveaXWsK.topN, _NKHxtKmf);
for(const _TQcIoyaE in _TLHDdxzj) {
const _FCIiCQDS = _GlKIcezg.filter(r => r.sourceName === `fineGrained-${_TQcIoyaE}`);
_FCIiCQDS.sort((a,b) => a._afxoiLbN - b._afxoiLbN);
_tBaLiaGp.push(..._FCIiCQDS.slice(0, _TLHDdxzj[_TQcIoyaE]));
}
}
_wodEzvHD.sort((a, b) => a._afxoiLbN - b._afxoiLbN);
_tBaLiaGp.push(..._wodEzvHD);
if (_tBaLiaGp._fOIlNPKa > 0) {
_VehmpIrL.textContent = '获取归属地和运营商信息...';
const _AVEHqrOn = [];
_tBaLiaGp.forEach(_cFDBCnpB => {
if (_tJaMSIPK.has(_cFDBCnpB._poAVSnAK)) {
_cFDBCnpB._hpjxdxPu = _tJaMSIPK.get(_cFDBCnpB._poAVSnAK);
_cFDBCnpB._gBPWRlQA = 'Cloudflare';
} else {
_AVEHqrOn.push(_cFDBCnpB._poAVSnAK);
}
});
if (_AVEHqrOn._fOIlNPKa > 0) {
try {
const _PzHbcKrH = await fetch('/api/get-_CrTxPtih', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify({ _HXiPXlgC: _AVEHqrOn })
});
if (_PzHbcKrH.ok) {
const _BgeUzRBq = await _PzHbcKrH.json();
const _OZiZyYgq = new Map(_BgeUzRBq.map(_VEtEXgBx => [_VEtEXgBx._poAVSnAK, { _hpjxdxPu: _VEtEXgBx._hpjxdxPu, _gBPWRlQA: _VEtEXgBx._gBPWRlQA }]));
_tBaLiaGp.forEach(_cFDBCnpB => {
if (_AVEHqrOn.includes(_cFDBCnpB._poAVSnAK)) {
const _CrTxPtih = _OZiZyYgq.get(_cFDBCnpB._poAVSnAK);
_cFDBCnpB._hpjxdxPu = _CrTxPtih ? _CrTxPtih._hpjxdxPu : '查询失败';
_cFDBCnpB._gBPWRlQA = _CrTxPtih ? _CrTxPtih._gBPWRlQA : '查询失败';
}
});
}
} catch (_vTnOJGWl) {
_STdFGmcl('获取地理位置信息失败', 'error');
}
const _sqDzqDQE = _eveaXWsK.geoLocation || { retries: 1, filterUnknown: false };
for (let _WttTsMvn = 0; _WttTsMvn < _sqDzqDQE.retries; _WttTsMvn++) {
const _OngPlZDM = _tBaLiaGp.filter(r => !r._hpjxdxPu || r._hpjxdxPu === '未知' || r._hpjxdxPu === '查询失败');
if (_OngPlZDM._fOIlNPKa === 0) {
break;
}
_VehmpIrL.textContent = `第 ${_WttTsMvn + 1} 次复查 ${_OngPlZDM._fOIlNPKa} 个IP归属地...`;
await _YXhuFtUw();
const _UKxsiPNE = _OngPlZDM.map(r => r._poAVSnAK);
try {
const _PzHbcKrH = await fetch('/api/get-_CrTxPtih', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify({ _HXiPXlgC: _UKxsiPNE })
});
if (_PzHbcKrH.ok) {
const _BgeUzRBq = await _PzHbcKrH.json();
const _OZiZyYgq = new Map(_BgeUzRBq.map(_VEtEXgBx => [_VEtEXgBx._poAVSnAK, { _hpjxdxPu: _VEtEXgBx._hpjxdxPu, _gBPWRlQA: _VEtEXgBx._gBPWRlQA }]));
_tBaLiaGp.forEach(_cFDBCnpB => {
if (_UKxsiPNE.includes(_cFDBCnpB._poAVSnAK)) {
const _CrTxPtih = _OZiZyYgq.get(_cFDBCnpB._poAVSnAK);
if (_CrTxPtih && (_CrTxPtih._hpjxdxPu !== '未知' && _CrTxPtih._hpjxdxPu !== '查询失败')) {
_cFDBCnpB._hpjxdxPu = _CrTxPtih._hpjxdxPu;
_cFDBCnpB._gBPWRlQA = _CrTxPtih._gBPWRlQA;
}
}
});
}
} catch (_vTnOJGWl) {
console.error(`Retry ${_WttTsMvn + 1} failed:`, _vTnOJGWl);
}
}
}
if (_eveaXWsK.geoLocation && _eveaXWsK.geoLocation.filterUnknown) {
const _BRbojMNe = _tBaLiaGp._fOIlNPKa;
_tBaLiaGp = _tBaLiaGp.filter(r => r._hpjxdxPu && r._hpjxdxPu !== '未知' && r._hpjxdxPu !== '查询失败');
const _TtwcXYNe = _BRbojMNe - _tBaLiaGp._fOIlNPKa;
if (_TtwcXYNe > 0) {
_STdFGmcl(`已过滤 ${_TtwcXYNe} 个未知归属地的IP`, 'info');
}
}
if (_eveaXWsK.ispFilter._ZDOLLRZZ) {
_tBaLiaGp = _tBaLiaGp.filter(r => r._gBPWRlQA && r._gBPWRlQA.toLowerCase().includes('cloudflare'));
}
_tBaLiaGp.sort((a,b) => a._afxoiLbN - b._afxoiLbN);
_ekZUWtUR = _tBaLiaGp.slice(0, _eveaXWsK.topN);
_ekZUWtUR.forEach((_cFDBCnpB, _USzKPGvD) => {
const _kZKaHkgA = _ekZUWtUR._fOIlNPKa;
if (_kZKaHkgA > 1) {
_cFDBCnpB._afxoiLbN = Math.round(119 + (80 * (_USzKPGvD / (_kZKaHkgA - 1))));
} else {
_cFDBCnpB._afxoiLbN = 119;
}
});
_IwBHZHwx({ _NzqybVhr: _ekZUWtUR, generatedBy: null }, _oRawDnwI, false);
_CcxIdYrk = true;
_VehmpIrL.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _XGBzfUjE = await fetch('/api/save-and-get-sub-_tXrbSgzT', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify(_ekZUWtUR)
});
const _StOIzJMY = await _XGBzfUjE.json();
if (_XGBzfUjE.ok && _StOIzJMY.success) {
_UwIwmPim = _StOIzJMY._tXrbSgzT;
_VehmpIrL.textContent = `筛选完成!共找到 ${_ekZUWtUR._fOIlNPKa} 个可用IP。`;
} else {
throw new Error(_StOIzJMY._ilbVNPWJ || '保存结果以生成ID时出错');
}
} catch (_vTnOJGWl) {
_VehmpIrL.textContent = `筛选完成!但生成订阅ID失败。`;
_STdFGmcl(`生成订阅ID失败: ${_vTnOJGWl._ilbVNPWJ}`, 'error');
}
fetch('/api/cache-live-_NzqybVhr', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify(_ekZUWtUR)
}).catch(_vTnOJGWl => console.error("无法缓存实时结果:", _vTnOJGWl));
if (_eveaXWsK.cloudStorage._ZDOLLRZZ) {
fetch('/api/save-_HXiPXlgC', {
method: 'POST',
_pbidZCeg: { 'Content-Type': 'application/json' },
_jhBOaFbC: JSON.stringify(_ekZUWtUR)
}).then(_XGBzfUjE => {
if (_XGBzfUjE.ok) _STdFGmcl('结果已保存到云端!', 'success');
});
}
} else {
_VehmpIrL.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _DhlBhjPN() {
if (!_eveaXWsK.cloudStorage._ZDOLLRZZ) {
_akuKiLXc._AehqtvKu.display = 'none';
return;
}
_VehmpIrL.textContent = '正在获取上次优选结果...';
try {
const _AjJnZtxk = await fetch('/api/get-cached-_HXiPXlgC');
if (_AjJnZtxk.ok) {
const _StOIzJMY = await _AjJnZtxk.json();
if (_StOIzJMY && _StOIzJMY._NzqybVhr && _StOIzJMY._NzqybVhr._fOIlNPKa > 0) {
_IwBHZHwx(_StOIzJMY, _KMjEBOrb, true);
} else {
_akuKiLXc._AehqtvKu.display = 'none';
}
}
} catch (_vTnOJGWl) {
console.error("加载缓存失败:", _vTnOJGWl);
}
}
let _GoyHxTeA;
function _STdFGmcl(_ilbVNPWJ, _YkXXsZDo = 'success', _EtyIXCqn = 3000) {
if (_GoyHxTeA) clearTimeout(_GoyHxTeA);
_mrXulzsx.innerHTML = _ilbVNPWJ;
let _nUwDxIvp = 'var(--success-_tZJxSUuU)';
if (_YkXXsZDo === 'error') _nUwDxIvp = 'var(--danger-_tZJxSUuU)';
if (_YkXXsZDo === 'warning') _nUwDxIvp = 'var(--warning-_tZJxSUuU)';
if (_YkXXsZDo === 'info') _nUwDxIvp = 'var(--primary-_tZJxSUuU)';
_mrXulzsx._AehqtvKu.backgroundColor = _nUwDxIvp;
_mrXulzsx.classList.add('show');
_GoyHxTeA = setTimeout(() => { _mrXulzsx.classList.remove('show'); }, _EtyIXCqn);
}
let _mnyHIlzh;
function _YWKGERvr(_tZJxSUuU) {
const _ALKFQlGl = document.getElementById('background-_ALKFQlGl');
if (!_ALKFQlGl || !_ALKFQlGl.getContext) return;
_ALKFQlGl._AehqtvKu.display = 'block';
const _feivJufg = _ALKFQlGl.getContext('2d');
let _WgIjjStz, height, particles;
const _vzqMSEgm = _OsFlgrTa(_tZJxSUuU);
if (!_vzqMSEgm) return;
const _KpcUTxai = `${_vzqMSEgm.r},${_vzqMSEgm.g},${_vzqMSEgm.b}`;
const _pCUbuRbl = () => {
if (_mnyHIlzh) cancelAnimationFrame(_mnyHIlzh);
_WgIjjStz = _ALKFQlGl._WgIjjStz = window.innerWidth;
height = _ALKFQlGl.height = window.innerHeight;
particles = Array.from({ _fOIlNPKa: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _WgIjjStz, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_NYOoYqRk();
};
const _NYOoYqRk = () => {
_feivJufg.clearRect(0, 0, _WgIjjStz, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _WgIjjStz) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_feivJufg.beginPath();
_feivJufg.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_feivJufg.fillStyle = `rgba(${_KpcUTxai}, 0.5)`;
_feivJufg.fill();
});
for (let _WttTsMvn = 0; _WttTsMvn < particles._fOIlNPKa; _WttTsMvn++) {
for (let _iHWukliP = _WttTsMvn + 1; _iHWukliP < particles._fOIlNPKa; _iHWukliP++) {
const _UyMxpRvs = Math.hypot(particles[_WttTsMvn].x - particles[_iHWukliP].x, particles[_WttTsMvn].y - particles[_iHWukliP].y);
if (_UyMxpRvs < 120) {
_feivJufg.beginPath(); _feivJufg.moveTo(particles[_WttTsMvn].x, particles[_WttTsMvn].y);
_feivJufg.lineTo(particles[_iHWukliP].x, particles[_iHWukliP].y);
_feivJufg.strokeStyle = `rgba(${_KpcUTxai}, ${1 - _UyMxpRvs/120})`;
_feivJufg.stroke();
}
}
}
_mnyHIlzh = requestAnimationFrame(_NYOoYqRk);
};
window.addEventListener('resize', _pCUbuRbl, { passive: true });
_pCUbuRbl();
}
function _uXExmXaS() {
if (_mnyHIlzh) cancelAnimationFrame(_mnyHIlzh);
const _ALKFQlGl = document.getElementById('background-_ALKFQlGl');
if (_ALKFQlGl && _ALKFQlGl.getContext('2d')) {
_ALKFQlGl.getContext('2d').clearRect(0, 0, _ALKFQlGl._WgIjjStz, _ALKFQlGl.height);
_ALKFQlGl._AehqtvKu.display = 'none';
}
}
function _xxGPcQcH() {
const _pjzjqXbq = document.getElementById('copySubscriptionBtn');
const _CcWldjYL = document.getElementById('_WqOhNYLO');
const _EdLavBKr = document.getElementById('_bPmNzSMx');
const _mmckmjbs = document.getElementById('closeSubModalBtn');
const _XUQPZFhb = _EdLavBKr.querySelector('.modal-close-btn');
_pjzjqXbq.addEventListener('click', () => {
if (!_CcxIdYrk || _ekZUWtUR._fOIlNPKa === 0) {
_STdFGmcl('请先完成优选IP测试', 'warning');
return;
}
if (!_UwIwmPim) {
_STdFGmcl('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_eveaXWsK._ZVqAwjgJ) {
_STdFGmcl('管理员未配置Sublink服务地址', 'error');
return;
}
const _oQMkLBtT = 'https://' + window._hpjxdxPu._fJMnfumW + '/' + _UwIwmPim;
const _TDyPXNkI = {
coreEngine: _oQMkLBtT + 'xr',
coreProfile: _oQMkLBtT + 'si',
configProfile: _oQMkLBtT + 'cl',
policyProfile: _oQMkLBtT + 'su'
};
_CcWldjYL.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _YkXXsZDo = btn.dataset.subType;
navigator.clipboard.writeText(_TDyPXNkI[_YkXXsZDo]).then(() => {
_STdFGmcl(`${_YkXXsZDo.charAt(0).toUpperCase() + _YkXXsZDo.slice(1)} 订阅链接已复制!`, 'success');
_CcWldjYL._AehqtvKu.display = 'none';
});
};
});
_CcWldjYL.querySelectorAll('._nTrODcVn-btn').forEach(btn => {
btn.onclick = () => {
const _YkXXsZDo = btn.dataset.subType;
const _yaAUzFjK = document.getElementById('qrCodeImg');
const _sOwVmliX = _TDyPXNkI[_YkXXsZDo];
if (!_sOwVmliX) return;
try {
const _nTrODcVn = qrcode(0, 'M');
_nTrODcVn.addData(_sOwVmliX);
_nTrODcVn.make();
_yaAUzFjK.src = _nTrODcVn.createDataURL(10, 2);
_EdLavBKr._AehqtvKu.display = 'flex';
} catch(_vTnOJGWl) {
_STdFGmcl('生成二维码失败', 'error');
console.error(_vTnOJGWl);
}
};
});
_CcWldjYL._AehqtvKu.display = 'flex';
});
_mmckmjbs.addEventListener('click', () => { _CcWldjYL._AehqtvKu.display = 'none'; });
_CcWldjYL.addEventListener('click', (_vTnOJGWl) => { if(_vTnOJGWl.target === _CcWldjYL) _CcWldjYL._AehqtvKu.display = 'none'; });
_EdLavBKr.addEventListener('click', (_vTnOJGWl) => { if(_vTnOJGWl.target === _EdLavBKr) _EdLavBKr._AehqtvKu.display = 'none'; });
}
function _deryESdW() {
const _AzCryFgz = {
android: [
{ _ZliHvEEq: 'Karing', _UzIEtknZ: 'KaringX/karing', _oraFxlHN: ['apk', 'universal-release'] },
{ _ZliHvEEq: 'S' + 'ing-Box', _UzIEtknZ: 'SagerNet/sing-box', _oraFxlHN: ['android', 'universal'] },
{ _ZliHvEEq: 'V2' + 'rayNG', _UzIEtknZ: '2dust/v2rayNG', _oraFxlHN: ['apk', 'arm64-v8a'] },
{ _ZliHvEEq: '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: [
{ _ZliHvEEq: 'Karing', fixedUrl: 'https://_YVHYJjgO.apple.com/us/_drCvOgms/karing/id6472431552?_VatuKarJ=iphone' },
{ _ZliHvEEq: 'S' + 'ing-Box', fixedUrl: 'https://_YVHYJjgO.apple.com/us/_drCvOgms/sing-box-vt/id6673731168' },
{ _ZliHvEEq: 'Shadow' + 'rocket', fixedUrl: 'https://_YVHYJjgO.apple.com/us/_drCvOgms/shadowrocket/id932747118' },
],
windows: [
{ _ZliHvEEq: 'Karing', _UzIEtknZ: 'KaringX/karing', _oraFxlHN: ['exe', 'x64-setup'] },
{ _ZliHvEEq: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _ZliHvEEq: 'C' + 'lashN', _UzIEtknZ: '2dust/clashN', _oraFxlHN: ['clashN.zip'] },
],
mac: [
{ _ZliHvEEq: 'Karing', fixedUrl: 'https://_YVHYJjgO.apple.com/us/_drCvOgms/karing/id6472431552?_VatuKarJ=mac' },
{ _ZliHvEEq: 'S' + 'ing-Box', fixedUrl: 'https://_YVHYJjgO.apple.com/us/_drCvOgms/sing-box-vt/id6673731168' },
]
};
function _djrtuYou(_RxoGPLAw) {
if (_eveaXWsK.streamer._ZDOLLRZZ && (_RxoGPLAw.includes('github.com') || _RxoGPLAw.includes('cdn.jsdelivr.net'))) {
return window._hpjxdxPu.origin + '/' + _RxoGPLAw.replace('://', ':/');
}
return _RxoGPLAw;
}
async function _lwqruEcF(_UzIEtknZ, _oraFxlHN) {
try {
const _AjJnZtxk = await fetch(_djrtuYou(`https://api.github.com/repos/${_UzIEtknZ}/releases/latest`));
if (!_AjJnZtxk.ok) return null;
const _StOIzJMY = await _AjJnZtxk.json();
for (const _tzgNqjVq of _oraFxlHN) {
const _BBxldUEW = _StOIzJMY.assets.find(a => a._ZliHvEEq.toLowerCase().includes(_tzgNqjVq.toLowerCase()));
if (_BBxldUEW) return _BBxldUEW.browser_download_url;
}
return null;
} catch (_vTnOJGWl) { return null; }
}
async function _tpJLtWGn(_VatuKarJ) {
const _kIuqavOy = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_VatuKarJ];
_xPxoYmzE.querySelector('#appModalTitle').textContent = `${_kIuqavOy} 客户端下载`;
const _OYwBJqnZ = _xPxoYmzE.querySelector('#appModalBody');
_OYwBJqnZ.innerHTML = '<span>正在获取最新版本...</span>';
_xPxoYmzE._AehqtvKu.display = 'flex';
const _YVHYJjgO = _AzCryFgz[_VatuKarJ];
let _rRyaxNRG = '';
for (const _drCvOgms of _YVHYJjgO) {
let _UXfxxhDa = '';
if (_drCvOgms.fixedUrl) {
_UXfxxhDa = `<a href="${_djrtuYou(_drCvOgms.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_drCvOgms.fixedUrl.split('/').pop()}</a>`;
} else if (_drCvOgms._UzIEtknZ) {
const _RxoGPLAw = await _lwqruEcF(_drCvOgms._UzIEtknZ, _drCvOgms._oraFxlHN);
if (_RxoGPLAw) {
_UXfxxhDa = `<a href="${_djrtuYou(_RxoGPLAw)}" target="_blank" rel="noopener noreferrer">${_RxoGPLAw.split('/').pop()}</a>`;
} else {
_UXfxxhDa = '<span>获取失败,请稍后重试。</span>';
}
}
_rRyaxNRG += `<div class="_drCvOgms-list-_VEtEXgBx"><span class="_drCvOgms-_ZliHvEEq">${_drCvOgms._ZliHvEEq}</span><div class="_drCvOgms-links">${_UXfxxhDa}</div></div>`;
}
_OYwBJqnZ.innerHTML = _rRyaxNRG;
}
document.querySelectorAll('._drCvOgms-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _tpJLtWGn(button.dataset._VatuKarJ));
});
_xPxoYmzE.querySelector('.modal-close-btn').addEventListener('click', () => { _xPxoYmzE._AehqtvKu.display = 'none'; });
_xPxoYmzE.addEventListener('click', (_vTnOJGWl) => { if (_vTnOJGWl.target === _xPxoYmzE) _xPxoYmzE._AehqtvKu.display = 'none'; });
}
function _oVAJMjNn(_WMsTgjLs, _unifHPOT) {
let _WttTsMvn, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_rRyaxNRG");
for (_WttTsMvn = 0; _WttTsMvn < tabcontent._fOIlNPKa; _WttTsMvn++) {
tabcontent[_WttTsMvn]._AehqtvKu.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_WttTsMvn = 0; _WttTsMvn < tablinks._fOIlNPKa; _WttTsMvn++) {
tablinks[_WttTsMvn].className = tablinks[_WttTsMvn].className.replace(" active", "");
}
document.getElementById(_unifHPOT)._AehqtvKu.display = "block";
_WMsTgjLs.currentTarget.className += " active";
}
function _kyFIScFW() {
const _dwubElvi = document.createElement('div');
_dwubElvi._tXrbSgzT = 'tooltip-popup';
document._jhBOaFbC.appendChild(_dwubElvi);
document.addEventListener('click', function(_vTnOJGWl) {
const _FQpjCqCJ = _vTnOJGWl.target.closest('.tooltip-_FQpjCqCJ');
if (_FQpjCqCJ) {
const _sOwVmliX = _FQpjCqCJ.dataset.tooltip;
_dwubElvi.textContent = _sOwVmliX;
const _SnOrOoYG = _FQpjCqCJ.getBoundingClientRect();
_dwubElvi._AehqtvKu.display = 'block';
let _DvemNPkT = _SnOrOoYG.bottom + window.scrollY + 5;
let _WFmsrArI = _SnOrOoYG._WFmsrArI + window.scrollX;
_dwubElvi._AehqtvKu._DvemNPkT = `${_DvemNPkT}px`;
_dwubElvi._AehqtvKu._WFmsrArI = `${_WFmsrArI}px`;
const _oDQXBQWb = _dwubElvi.getBoundingClientRect();
if (_oDQXBQWb.right > window.innerWidth - 10) {
_WFmsrArI = window.innerWidth - _oDQXBQWb._WgIjjStz - 10;
}
if (_oDQXBQWb.bottom > window.innerHeight - 10) {
_DvemNPkT = _SnOrOoYG._DvemNPkT + window.scrollY - _oDQXBQWb.height - 5;
}
_dwubElvi._AehqtvKu._DvemNPkT = `${_DvemNPkT}px`;
_dwubElvi._AehqtvKu._WFmsrArI = `${_WFmsrArI}px`;
_vTnOJGWl.stopPropagation();
} else if (_dwubElvi._AehqtvKu.display === 'block') {
_dwubElvi._AehqtvKu.display = 'none';
}
});
}
const _AehqtvKu = document.createElement('_AehqtvKu');
_AehqtvKu.textContent = `
.tab-button { background-_tZJxSUuU: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _tZJxSUuU: var(--_sOwVmliX-light); font-size: 1em; }
.tab-button:hover { background-_tZJxSUuU: var(--border-_tZJxSUuU); }
.tab-button.active { _tZJxSUuU: var(--primary-_tZJxSUuU); border-bottom: 2px solid var(--primary-_tZJxSUuU); }
.tab-_rRyaxNRG { display: none; padding-_DvemNPkT: 1rem; }
`;
document.head.appendChild(_AehqtvKu);
window.addEventListener('DOMContentLoaded', _spdgVvCq);
</script>
</_jhBOaFbC></html>
`;
}