<!doctype html><html translate="no" lang="zh-CN"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,viewport-fit=cover"><title></title><meta name="description" content=""><meta name="keywords" content="体育, 赛事数据, 实时比分, 球队分析, 数据中心"><meta http-equiv="Pragma" content="cache"><meta http-equiv="Cache-control" content="cache"><meta http-equiv="Cache" content="cache"><meta name="google" content="notranslate"><meta http-equiv="window-target" content="_top"><meta name="format-detection" content="telephone=no"><meta name="robots" content="index,follow"><meta name="referrer" content="no-referrer-when-downgrade"><meta property="og:title" content="Sports Data Center - 实时赛事与动态分析"><meta property="og:description" content="聚合全球体育赛事数据与表现分析，探索运动趋势与统计洞察。"><meta property="og:type" content="website"><meta property="og:site-name" content="SportsDataHub"><meta name="mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="apple-mobile-web-app-orientation" content="any"><meta name="msapplication-TileColor" content=""><meta name="theme-color" content=""><meta name="version" content="5.7.8"><meta name="build-time" content="2026/6/11 05:07:14"><meta name="build-timestamp" content="1781125634828"><base href="/"><link rel="preload" as="image" href="/pageLoading.png" fetchpriority="high"><script src="/cdn-monitor.js" defer="defer"></script><style>html,
    body {
      height: 100%;
      background: #e8f5ff;
      margin: 0;
      padding: 0;
      max-width: 500px;
      margin: 0 auto;
    }

    html {
      padding-top: var(--status-bar-height);
    }

    .page-loading {
      position: fixed;
      inset: 0;
      background: #E8F5FF;
      z-index: 999999999;
      transform: translate3d(0, 0, 0);
      will-change: transform;
      transition: transform 0.9s cubic-bezier(0.22, 1, 0.36, 1);
      overflow: hidden;
      max-width: 500px;
      margin: 0 auto;
    }

    .page-loading.exit {
      transform: translate3d(0, -100vh, 0);
      pointer-events: none;
    }

    .loading-box {
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 18px;
      color: #179CFF;
      font-size: 14px;
    }

    .loading-box img {
      width: 154px;
      height: 23px;
    }

    .loading-text {
      position: relative;
      font-weight: 500;
      line-height: 1.4;
      height: 20px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 14px;
      overflow: hidden;
      color: #179CFF;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      width: 140px;
      opacity: 0;
    }

    .char {
      display: inline-block;
      position: relative;
      color: #179CFF;
      opacity: 0;
      transform: translateX(-50px) scale(1.2);
      will-change: transform, opacity;
    }

    /* 隐藏的输入框容器 */
    .hidden-inputs {
      height: 0;
      overflow: hidden;
      opacity: 0;
      position: absolute;
      pointer-events: none;
    }

    .appVersion {
      position: absolute;
      bottom: 10px;
      font-size: 12px;
      color: #999;
      text-align: center;
      width: 100%;
    }</style><script src="./boot-error-state.js"></script><script src="/network-speed.js" defer="defer"></script><script src="/boot-runtime.js" defer="defer"></script><script defer="defer" src="/js/runtime.ef63288b.js"></script><script defer="defer" src="/js/vendor-framework.ef63288b.js"></script><script defer="defer" src="/js/vendors.ef63288b.js"></script><script defer="defer" src="/js/app.ef63288b.js"></script><link href="/css/app.ef63288b.css" rel="stylesheet"></head><body><div class="page-loading"><div class="loading-box"><img src="./pageLoading.png" alt="加载中" width="154" height="23" id="pageLoadingImg"><div class="loading-text" id="loadingText"></div></div><div class="appVersion" id="appVersion"></div></div><div class="hidden-inputs"><input> <input type="password"></div><div id="root" style="position: relative; min-height: 100%"></div><div id="tenantsys" style="display: none" title=""></div><script>// -------------------------------
    // 全局回调函数接口
    // -------------------------------
    // 使用方式：
    // window.onLoadingFinished = () => { console.log('动画完成'); doSomething(); }

    window.onLoadingFinished = null; // 默认没有回调
    const animation = {
      shouldExit: false,
      textFinished: false,
      minTimeReached: false,
      totalChars: 0
    };

    const CONFIG = {
      text: '一站式系统解决方案',
      charInterval: 150,
      charDuration: 400,
      lastCharExtraDelay: 120,
      minStayAfterText: 500
    };

    function isLowEndDevice() {
      const cores = navigator.hardwareConcurrency || 4;
      return cores < 4;
    }

    function easeOutCubic(t) {
      return 1 - Math.pow(1 - t, 3);
    }

    function startTextAnimation() {
      const container = document.getElementById('loadingText');
      if (!container) return;
      if (window.__BOOT_ERROR_STATE__ && window.__BOOT_ERROR_STATE__.hasError) {
        window.__showLoadingError(window.__BOOT_ERROR_STATE__.message);
        return;
      }
      container.innerHTML = '';

      const chars = CONFIG.text.split('');
      animation.totalChars = chars.length;

      if (isLowEndDevice()) {
        chars.forEach(char => {
          const span = document.createElement('span');
          span.className = 'char';
          span.textContent = char;
          span.style.opacity = '1';
          span.style.transform = 'translate3d(0,0,0) scale(1)';
          container.appendChild(span);
        });
        animation.textFinished = true;
        animation.minTimeReached = true;
        checkCanExit();
        return;
      }

      const spans = chars.map(char => {
        const span = document.createElement('span');
        span.className = 'char';
        span.textContent = char;
        span.style.opacity = '0';
        span.style.transform = 'translate3d(-16px,0,0) scale(1.05)';
        span.style.willChange = 'transform, opacity';
        container.appendChild(span);
        return span;
      });

      let startTime = null;

      function step(timestamp) {
        if (!startTime) startTime = timestamp;
        const t = timestamp - startTime;
        let allDone = true;

        for (let i = 0; i < spans.length; i++) {
          const span = spans[i];
          const charStart = i * CONFIG.charInterval;
          const charEnd = charStart + CONFIG.charDuration + (i === spans.length - 1 ? CONFIG.lastCharExtraDelay : 0);

          if (t >= charStart && t <= charEnd) {
            const elapsed = t - charStart;
            const progress = Math.min(elapsed / CONFIG.charDuration, 1);
            const eased = easeOutCubic(progress);

            const x = -16 * (1 - eased) + 2 * eased - (progress > 0.44 ? 1 : 0);
            span.style.transform = `translate3d(${x}px,0,0) scale(${1 + 0.05 * (1 - eased)})`;
            span.style.opacity = eased;
            allDone = false;
          } else if (t > charEnd && !span.dataset.done) {
            span.style.transform = 'translate3d(0,0,0) scale(1)';
            span.style.opacity = '1';
            span.dataset.done = 'true';
          } else if (!span.dataset.done) {
            allDone = false;
          }
        }

        if (!animation.textFinished && allDone) {
          animation.textFinished = true;
          setTimeout(() => {
            animation.minTimeReached = true;
            checkCanExit();
            // -------------------------------
            // 动画完成时触发全局回调
            // -------------------------------
            if (typeof window.onLoadingFinished === 'function') {
              window.onLoadingFinished();
            }
          }, CONFIG.minStayAfterText);
        }

        if (!animation.shouldExit && !animation.textFinished) {
          requestAnimationFrame(step);
        }
      }

      requestAnimationFrame(step);
    }

    function checkCanExit() {
      const root = document.getElementById('root');
      if (!root) return;
      if (animation.textFinished && animation.minTimeReached && root.children.length > 0) {
        exitLoading();
      }
    }

    function exitLoading() {
      if (animation.shouldExit) return;
      animation.shouldExit = true;
      if (window.__BOOT_ERROR_STATE__) {
        window.__BOOT_ERROR_STATE__.active = false;
      }
      const loading = document.querySelector('.page-loading');
      if (!loading) return;
      loading.classList.add('exit');
      setTimeout(() => {
        loading.style.display = 'none';
      }, 900);
    }

    window.forceExitLoading = function () {
      animation.textFinished = true;
      animation.minTimeReached = true;
      exitLoading();
      if (typeof window.onLoadingFinished === 'function') {
        window.onLoadingFinished();
      }
    };

    (function init() {
      try {
        const root = document.getElementById('root');
        if (!root) return;
        startTextAnimation();
        const observer = new MutationObserver(() => {
          checkCanExit();
        });
        observer.observe(root, { childList: true });
        checkCanExit();
      } catch (error) {
        console.error('[boot-ui] loading init failed:', error);
      }
    })();</script></body></html>