<!doctype html>
<html lang="<%= (typeof chainLang !== 'undefined' && chainLang === 'zh') ? 'zh-CN' : ((typeof chainLang !== 'undefined' && chainLang) || 'ko') %>">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title><%= ({ko:'plais Chain 상장 자료',en:'plais Chain Listing Materials',zh:'plais Chain 上市资料',ja:'plais Chain 上場資料'}[(typeof chainLang !== 'undefined' && chainLang) || 'ko']) %></title>
  <link rel="icon" type="image/png" href="/images/plai-symbol-mark-v1.png" />
  <link rel="apple-touch-icon" sizes="180x180" href="/images/plai-icon-180.png" />
  <link rel="manifest" href="/site.webmanifest" />
  <meta name="theme-color" content="#087b73" />
  <meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="apple-mobile-web-app-title" content="plais Chain" />
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
  <style>
    * { box-sizing: border-box; }
    body {
      margin: 0;
      color: #07111f;
      background: #eef5f8;
      font-family: Arial, "Noto Sans KR", sans-serif;
      letter-spacing: 0;
    }
    a { color: inherit; text-decoration: none; }
    .hero {
      color: #fff;
      background: linear-gradient(135deg, #087b73 0%, #1f65d9 68%, #253fb0 100%);
      padding: 34px 0 48px;
    }
    .wrap {
      width: min(1180px, calc(100% - 32px));
      margin: 0 auto;
    }
    .nav {
      display: flex;
      justify-content: space-between;
      gap: 12px;
      align-items: center;
      margin-bottom: 34px;
    }
    .brand {
      display: inline-flex;
      align-items: center;
      gap: 10px;
      font-size: 22px;
      font-weight: 900;
    }
    .brand-symbol {
      width: 42px;
      height: 42px;
      border-radius: 9px;
      border: 1px solid rgba(255,255,255,.3);
      object-fit: cover;
      flex: 0 0 auto;
    }
    .actions {
      display: flex;
      gap: 8px;
      flex-wrap: wrap;
      justify-content: flex-end;
    }
    .btn {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      min-height: 42px;
      padding: 10px 15px;
      border-radius: 8px;
      border: 1px solid rgba(255,255,255,.28);
      background: rgba(255,255,255,.12);
      color: #fff;
      font-weight: 900;
    }
    .btn.primary {
      background: #fff;
      color: #07111f;
      border-color: #fff;
    }
    .btn.dark {
      background: #07111f;
      color: #fff;
      border-color: #07111f;
    }
    h1 {
      margin: 0;
      max-width: 960px;
      font-size: clamp(34px, 5vw, 58px);
      line-height: 1.08;
      font-weight: 950;
    }
    .lead {
      max-width: 860px;
      margin: 16px 0 0;
      color: #dff7ff;
      font-size: 18px;
      line-height: 1.62;
      font-weight: 700;
    }
    .hero-grid {
      display: grid;
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 10px;
      margin-top: 26px;
    }
    .hero-stat {
      border: 1px solid rgba(255,255,255,.22);
      border-radius: 8px;
      padding: 14px;
      background: rgba(0,0,0,.16);
    }
    .hero-stat span {
      display: block;
      color: #bdeeff;
      font-size: 13px;
      font-weight: 800;
    }
    .hero-stat strong {
      display: block;
      margin-top: 6px;
      font-size: 24px;
      word-break: break-word;
    }
    main { padding: 26px 0 58px; }
    .grid {
      display: grid;
      grid-template-columns: minmax(0, 1fr) minmax(330px, .46fr);
      gap: 14px;
      align-items: start;
    }
    .panel {
      border: 1px solid #d8e3ee;
      background: #fff;
      border-radius: 8px;
      padding: 20px;
    }
    .panel h2 {
      margin: 0 0 12px;
      font-size: 24px;
      line-height: 1.2;
    }
    .panel h3 {
      margin: 0 0 8px;
      font-size: 17px;
    }
    .panel p,
    .panel li {
      color: #506178;
      line-height: 1.62;
      font-size: 15px;
    }
    .section { margin-top: 14px; }
    .two-col {
      display: grid;
      grid-template-columns: repeat(2, minmax(0, 1fr));
      gap: 14px;
    }
    .three-col {
      display: grid;
      grid-template-columns: repeat(3, minmax(0, 1fr));
      gap: 14px;
    }
    .card {
      border: 1px solid #d8e3ee;
      border-radius: 8px;
      background: #fbfdff;
      padding: 16px;
      min-height: 126px;
    }
    .card small {
      display: block;
      color: #00796b;
      font-weight: 900;
      text-transform: uppercase;
      letter-spacing: .04em;
    }
    .card strong {
      display: block;
      margin-top: 8px;
      font-size: 25px;
      word-break: break-word;
    }
    .side {
      background: #071421;
      color: #fff;
      border-color: #071421;
      position: sticky;
      top: 16px;
    }
    .side p,
    .side li {
      color: #bfd0e2;
    }
    .side .btn {
      width: 100%;
      margin-top: 10px;
    }
    .tag {
      display: inline-flex;
      width: fit-content;
      align-items: center;
      border-radius: 999px;
      padding: 5px 9px;
      background: #dffaf0;
      color: #006b57;
      font-size: 12px;
      font-weight: 900;
    }
    .warning {
      border-color: #e4bd49;
      background: #fff8db;
    }
    .warning p,
    .warning li {
      color: #6f4e00;
      font-weight: 700;
    }
    .roadmap {
      display: grid;
      gap: 10px;
    }
    .roadmap-row {
      display: grid;
      grid-template-columns: 150px 1fr;
      gap: 12px;
      border: 1px solid #d8e3ee;
      border-radius: 8px;
      background: #fbfdff;
      padding: 14px;
    }
    .link-list {
      display: grid;
      gap: 10px;
    }
    .link-list a {
      display: flex;
      justify-content: space-between;
      gap: 12px;
      border: 1px solid rgba(255,255,255,.16);
      border-radius: 8px;
      padding: 12px;
      color: #fff;
      background: rgba(255,255,255,.06);
      font-weight: 900;
    }
    .link-list span {
      color: #9fc0d8;
      font-weight: 700;
      text-align: right;
    }
    code {
      background: #eef5f8;
      border: 1px solid #d8e3ee;
      border-radius: 6px;
      padding: 2px 6px;
      color: #0f513e;
      word-break: break-word;
    }
    .status-code {
      display: block;
      margin-top: 8px;
      font-size: 11px;
      line-height: 1.45;
      overflow-wrap: anywhere;
    }
    .muted {
      color: #617188;
      font-size: 13px;
      line-height: 1.55;
    }
    @media (max-width: 900px) {
      .nav { align-items: flex-start; flex-direction: column; }
      .actions { justify-content: flex-start; }
      .grid,
      .two-col,
      .three-col,
      .hero-grid { grid-template-columns: 1fr; }
      .side { position: static; }
      .roadmap-row { grid-template-columns: 1fr; }
    }

    .lang-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 18px; }
    .lang-actions .btn.active { background: #fff; color: #07111f; border-color: #fff; }
    .side-note { margin-top: 8px; }
    @media (max-width: 640px) {
      .hero { padding: 30px 0 40px; }
      .brand { font-size: 21px; align-items: flex-start; }
      .brand-symbol { width: 52px; height: 52px; border-radius: 12px; }
      .actions .btn, .lang-actions .btn { min-height: 52px; padding: 12px 18px; font-size: 18px; }
      h1 { font-size: 38px; line-height: 1.16; }
      .lead { font-size: 22px; line-height: 1.55; }
      .hero-grid { gap: 14px; }
      .hero-stat { padding: 22px; }
      .hero-stat span { font-size: 20px; }
      .hero-stat strong { font-size: 34px; }
      .panel { padding: 24px; }
      .panel h2 { font-size: 34px; }
      .panel h3 { font-size: 25px; }
      .panel p, .panel li { font-size: 22px; }
      .card small { font-size: 17px; }
      .card strong { font-size: 31px; }
      .link-list a { font-size: 22px; padding: 18px; flex-direction: column; }
      .link-list span { text-align: left; }
    }
  </style>
</head>
<body>
  <%
    const lang = (typeof chainLang !== 'undefined' && chainLang) ? chainLang : 'ko';
    const L = {
      ko: {
        htmlLang: 'ko',
        pageTitle: 'plais Chain 상장 자료',
        brandTitle: 'plais Chain 상장 자료',
        navHome: '체인 홈', navExplorer: 'Explorer', navSource: 'Source', navWhitepaper: '백서', navPlaifor: 'PLAIFOR 홈',
        heroTitle: '상장 심사와 외부 검토를 위한 plais Chain 공식 자료 허브입니다.',
        heroLead: '프로젝트 개요, 코인 정책, 보상 구조, 노드 운영, 공개 소스, Explorer 원장, 백서와 로드맵을 한 곳에서 확인할 수 있게 정리했습니다.',
        network: '네트워크', symbol: '심볼', chainVerify: '체인 검증', readiness: '공개 활성화', approvalRequired: '별도 승인 필요',
        projectSummary: '프로젝트 요약', projectTitle: '프로젝트 개요',
        projectDesc: 'plais Chain은 PLAIFOR 생태계의 앱 사용 active 보상, 분산 저장 보상, 노드 active 보상, 감점/정정 기록을 지갑, 블록, 증명 원장으로 추적하는 AI 서비스형 블록체인입니다.',
        chain: '체인', totalSupply: '총 공급량', totalSupplyDesc: '정책 기준 최대 공급량', addressPrefix: '주소 접두어', addressPrefixDesc: '지갑 주소 접두어',
        policyTitle: '코인/원장 정책', issueTitle: '발행과 유통 통제', issueDesc: 'Canonical Besu QBFT 메인넷은 가동 중이지만 공개 유통량은 0이며, 외부 전송·운영자 서명·추가 발행은 별도 승인 전까지 잠겨 있습니다.',
        pointTitle: 'plais Point 분리', pointDesc: 'plais Point와 과거 테스트넷 기록은 canonical PLAIS 잔액이 아닙니다. 자동 전환과 1,000P 교환 비율은 적용하지 않으며 별도 승인 정책 없이는 전환되지 않습니다.',
        integrationTitle: '메인넷 연동 핵심 정보', chainIdLabel: 'Chain ID', consensusLabel: '합의', blockTimeLabel: '목표 블록 주기', launchControlLabel: '공개 활성화 통제', seconds: '초', transferLocked: '외부 전송 잠금',
        rewardTitle: '보상 구조', appReward: '앱 활동 보상', appRewardDesc: '메모, 녹음, 클라우드, PLAI펫 성장 등 사용자 활동 기록', storageReward: '분산 저장 보상', storageRewardDesc: '저장소 제공, chunk 저장/검증, 용량 제공 보상', nodeReward: '노드 운영 보상', nodeRewardDesc: 'PC 노드 온라인 유지와 네트워크 기여 기록',
        rewardSummary: '현재 Explorer 기준 순 보상', ledgerRecords: '원장 기록', tracking: '건을 추적 중입니다.',
        statusTitle: '운영 지표', latestBlock: '최신 블록', latestBlockDesc: '최근 블록 높이', wallets: '지갑', walletsDesc: '체인 지갑 수', nodes: '온라인 노드', nodesDesc: '현재 heartbeat가 확인된 참여 노드', validators: '검증자', validatorsDesc: 'QBFT 검증자 수', finalized: '확정 블록', finalizedDesc: '확정된 블록 수', circulating: '유통량', circulatingDesc: '지갑 원장 기준 유통량',
        transparencyTitle: '투명성 자료', sourceTitle: '공개 소스', sourceDesc: '민감정보 제거 후 공개 ZIP, 버전 기록, 파일 인덱스, SHA256 검증값을 제공합니다.', latestVersion: '최신 버전', files: '파일', generated: '생성', explorerLedgerTitle: 'Explorer 원장', explorerLedgerDesc: '보상, 감점, 지갑, 블록, Proof 흐름을 직접 조회할 수 있습니다.', searchable: '검색 가능한 항목: 주소, txHash, 블록 높이/hash, proof id/hash',
        roadmapTitle: '현재 단계와 다음 작업', now: '완료', testnetOps: '메인넷 기술 가동', testnetOpsDesc: 'QBFT 검증자 4대 독립 호스트, 블록 생존성, 키 보관 및 메인넷 기술 게이트 11/11을 확인했습니다.', preparing: '진행', mainnetCriteria: '거래소 연동·외부 검증', mainnetCriteriaDesc: '입출금 연동 규격, 장애 복구 시험, 독립 보안감사와 법률/KYB 자료를 준비합니다.', next: '승인 후', listingPack: '공개 활성화와 거래지원 신청', listingPackDesc: '필수 심사자료가 완성되고 명시적 승인을 받은 뒤 거래소별 공식 채널로 거래지원을 신청합니다.',
        noticeTitle: '심사 자료 사용 안내', noticeDesc: '이 페이지는 상장 보장을 의미하지 않습니다. 다만 외부 검토자가 프로젝트의 실제 운영 상태, 공개 소스, 백서, Explorer 원장을 확인할 수 있는 공식 근거 자료로 사용할 수 있습니다.',
        linksTitle: '심사 자료 링크', linksDesc: '외부 검토자가 가장 먼저 확인해야 할 핵심 자료입니다.', structure: '정책/구조', publicSource: '공개 소스', ledgerVerify: '원장 검증', status: '운영 상태', userReward: '사용자 보상', storageNode: '저장 노드', checkSource: '공개 소스 확인', openLedger: '원장 검증 열기'
      },
      en: {
        htmlLang: 'en', pageTitle: 'plais Chain Listing Materials', brandTitle: 'plais Chain Listing Materials',
        navHome: 'Chain Home', navExplorer: 'Explorer', navSource: 'Source', navWhitepaper: 'Whitepaper', navPlaifor: 'PLAIFOR Home',
        heroTitle: 'Official plais Chain materials hub for listing review and external due diligence.', heroLead: 'Project overview, coin policy, reward structure, node operation, public source, Explorer ledger, whitepaper, and roadmap are organized in one place.',
        network: 'Network', symbol: 'Symbol', chainVerify: 'Chain verification', readiness: 'Public Activation', approvalRequired: 'Approval Required', projectSummary: 'Project Summary', projectTitle: 'Project Overview',
        projectDesc: 'plais Chain is an AI service blockchain that tracks PLAIFOR ecosystem app activity rewards, distributed storage rewards, node activity rewards, and correction or penalty records through wallets, blocks, and proof ledgers.',
        chain: 'Chain', totalSupply: 'Total Supply', totalSupplyDesc: 'Maximum supply by policy', addressPrefix: 'Address Prefix', addressPrefixDesc: 'Wallet address prefix',
        policyTitle: 'Coin / Ledger Policy', issueTitle: 'Issuance and Circulation Controls', issueDesc: 'The canonical Besu QBFT mainnet is live, while public circulation remains zero. External transfers, operator signing, and additional issuance remain locked until separately approved.',
        pointTitle: 'plais Point Separation', pointDesc: 'plais Point and legacy testnet records are not canonical PLAIS balances. No automatic conversion or 1,000P exchange ratio applies without a separately approved policy.',
        integrationTitle: 'Mainnet Integration Essentials', chainIdLabel: 'Chain ID', consensusLabel: 'Consensus', blockTimeLabel: 'Target Block Period', launchControlLabel: 'Public Activation Control', seconds: 'seconds', transferLocked: 'External transfers locked',
        rewardTitle: 'Reward Structure', appReward: 'App Activity Reward', appRewardDesc: 'User activity records such as memo, recording, cloud use, and PLAI pet growth', storageReward: 'Distributed Storage Reward', storageRewardDesc: 'Rewards for storage contribution, chunk storage/verification, and capacity contribution', nodeReward: 'Node Operation Reward', nodeRewardDesc: 'PC node online uptime and network contribution records',
        rewardSummary: 'Current Explorer net reward', ledgerRecords: 'ledger records', tracking: 'are being tracked.', statusTitle: 'Operating Metrics', latestBlock: 'Latest Block', latestBlockDesc: 'Latest block height', wallets: 'Wallets', walletsDesc: 'Number of chain wallets', nodes: 'Online Nodes', nodesDesc: 'Participating nodes with a current heartbeat', validators: 'Validators', validatorsDesc: 'QBFT validator count', finalized: 'Finalized Blocks', finalizedDesc: 'Number of finalized blocks', circulating: 'Circulating', circulatingDesc: 'Circulating supply by wallet ledger',
        transparencyTitle: 'Transparency Materials', sourceTitle: 'Public Source', sourceDesc: 'Provides a public ZIP after removing sensitive data, version history, file index, and SHA256 verification value.', latestVersion: 'Latest version', files: 'files', generated: 'generated', explorerLedgerTitle: 'Explorer Ledger', explorerLedgerDesc: 'Rewards, penalties, wallets, blocks, and Proof flows can be viewed directly.', searchable: 'Searchable items: address, txHash, block height/hash, proof id/hash',
        roadmapTitle: 'Current Stage And Next Work', now: 'Complete', testnetOps: 'Technical Mainnet Operation', testnetOpsDesc: 'Four independently hosted QBFT validators, block liveness, key custody, and the 11/11 technical mainnet gate are verified.', preparing: 'In progress', mainnetCriteria: 'Exchange Integration And External Review', mainnetCriteriaDesc: 'Deposit/withdrawal specifications, recovery tests, independent security audit, and legal/KYB evidence are being prepared.', next: 'After approval', listingPack: 'Public Activation And Listing Application', listingPackDesc: 'After mandatory evidence and explicit approval, exchange support is requested through each exchange’s official channel.',
        noticeTitle: 'How To Use These Materials', noticeDesc: 'This page does not guarantee listing. It can be used as official evidence for external reviewers to check the project’s real operating status, public source, whitepaper, and Explorer ledger.',
        linksTitle: 'Review Material Links', linksDesc: 'Core materials external reviewers should check first.', structure: 'Policy / Structure', publicSource: 'Public source', ledgerVerify: 'Ledger verification', status: 'Operating status', userReward: 'User reward', storageNode: 'Storage nodes', checkSource: 'Check public source', openLedger: 'Open ledger verification'
      },
      zh: {
        htmlLang: 'zh-CN', pageTitle: 'plais Chain 上市资料', brandTitle: 'plais Chain 上市资料',
        navHome: '链首页', navExplorer: '浏览器', navSource: '源码', navWhitepaper: '白皮书', navPlaifor: 'PLAIFOR 首页',
        heroTitle: '用于上市审核和外部审查的 plais Chain 官方资料中心。', heroLead: '项目概览、代币政策、奖励结构、节点运营、公开源码、Explorer 账本、白皮书和路线图都整理在这里。',
        network: '网络', symbol: '符号', chainVerify: '链验证', readiness: '公开启用', approvalRequired: '需要单独批准', projectSummary: '项目摘要', projectTitle: '项目概览',
        projectDesc: 'plais Chain 是面向 PLAIFOR 生态的 AI 服务型区块链，用钱包、区块和证明账本追踪应用 active 奖励、分布式存储奖励、节点 active 奖励以及扣分/修正记录。',
        chain: '链', totalSupply: '总供应量', totalSupplyDesc: '按政策设定的最大供应量', addressPrefix: '地址前缀', addressPrefixDesc: '钱包地址前缀',
        policyTitle: '币 / 账本政策', issueTitle: '发行与流通控制', issueDesc: 'Canonical Besu QBFT 主网正在运行，但公开流通量仍为零。外部转账、运营者签名和增发在单独批准前保持锁定。',
        pointTitle: 'plais Point 分离', pointDesc: 'plais Point 和旧测试网记录不是 canonical PLAIS 余额。未经单独批准，不适用自动转换或 1,000P 兑换比例。',
        integrationTitle: '主网集成核心信息', chainIdLabel: 'Chain ID', consensusLabel: '共识', blockTimeLabel: '目标出块周期', launchControlLabel: '公开启用控制', seconds: '秒', transferLocked: '外部转账锁定',
        rewardTitle: '奖励结构', appReward: '应用活动奖励', appRewardDesc: '备忘录、录音、云端、PLAI 宠物成长等用户活动记录', storageReward: '分布式存储奖励', storageRewardDesc: '提供存储、chunk 存储/验证、容量贡献奖励', nodeReward: '节点运营奖励', nodeRewardDesc: 'PC 节点在线保持和网络贡献记录',
        rewardSummary: '当前 Explorer 净奖励', ledgerRecords: '账本记录', tracking: '正在追踪。', statusTitle: '运营指标', latestBlock: '最新区块', latestBlockDesc: '最近区块高度', wallets: '钱包', walletsDesc: '链钱包数量', nodes: '在线节点', nodesDesc: '当前 heartbeat 已确认的参与节点', validators: '验证者', validatorsDesc: 'QBFT 验证者数量', finalized: '已确认区块', finalizedDesc: '已确认区块数', circulating: '流通量', circulatingDesc: '基于钱包账本的流通量',
        transparencyTitle: '透明资料', sourceTitle: '公开源码', sourceDesc: '移除敏感信息后提供公开 ZIP、版本记录、文件索引和 SHA256 校验值。', latestVersion: '最新版本', files: '个文件', generated: '生成时间', explorerLedgerTitle: 'Explorer 账本', explorerLedgerDesc: '可直接查询奖励、扣分、钱包、区块和 Proof 流程。', searchable: '可搜索项目：地址、txHash、区块高度/hash、proof id/hash',
        roadmapTitle: '当前阶段与后续工作', now: '已完成', testnetOps: '主网技术运行', testnetOpsDesc: '已验证四个独立主机上的 QBFT 验证者、区块活性、密钥保管及 11/11 技术主网门槛。', preparing: '进行中', mainnetCriteria: '交易所集成与外部审查', mainnetCriteriaDesc: '准备充提规范、恢复测试、独立安全审计及法律/KYB资料。', next: '批准后', listingPack: '公开启用与上市申请', listingPackDesc: '必需证据和明确批准完成后，通过各交易所官方渠道申请交易支持。',
        noticeTitle: '审核资料使用说明', noticeDesc: '本页面不代表上市保证。但外部审核人员可将其作为官方依据，确认项目实际运营状态、公开源码、白皮书和 Explorer 账本。',
        linksTitle: '审核资料链接', linksDesc: '外部审核人员应首先查看的核心资料。', structure: '政策/结构', publicSource: '公开源码', ledgerVerify: '账本验证', status: '运营状态', userReward: '用户奖励', storageNode: '存储节点', checkSource: '查看公开源码', openLedger: '打开账本验证'
      },
      ja: {
        htmlLang: 'ja', pageTitle: 'plais Chain 上場資料', brandTitle: 'plais Chain 上場資料',
        navHome: 'チェーンホーム', navExplorer: 'Explorer', navSource: 'Source', navWhitepaper: 'ホワイトペーパー', navPlaifor: 'PLAIFORホーム',
        heroTitle: '上場審査と外部レビューのための plais Chain 公式資料ハブです。', heroLead: 'プロジェクト概要、コインポリシー、報酬構造、ノード運用、公開ソース、Explorer台帳、ホワイトペーパー、ロードマップを一か所で確認できます。',
        network: 'ネットワーク', symbol: 'シンボル', chainVerify: 'チェーン検証', readiness: '公開有効化', approvalRequired: '別途承認が必要', projectSummary: 'プロジェクト概要', projectTitle: 'プロジェクト概要',
        projectDesc: 'plais Chainは、PLAIFORエコシステムのアプリactive報酬、分散ストレージ報酬、ノードactive報酬、減点/訂正記録をウォレット、ブロック、証明台帳で追跡するAIサービス型ブロックチェーンです。',
        chain: 'チェーン', totalSupply: '総供給量', totalSupplyDesc: 'ポリシー上の最大供給量', addressPrefix: 'アドレス接頭辞', addressPrefixDesc: 'ウォレットアドレス接頭辞',
        policyTitle: 'コイン / 台帳ポリシー', issueTitle: '発行と流通の統制', issueDesc: 'Canonical Besu QBFTメインネットは稼働中ですが、公開流通量はゼロです。外部送金、運用者署名、追加発行は個別承認までロックされています。',
        pointTitle: 'plais Pointの分離', pointDesc: 'plais Pointと旧テストネット記録はcanonical PLAIS残高ではありません。別途承認されたポリシーなしに自動変換や1,000P交換比率は適用されません。',
        integrationTitle: 'メインネット連携の主要情報', chainIdLabel: 'Chain ID', consensusLabel: 'コンセンサス', blockTimeLabel: '目標ブロック周期', launchControlLabel: '公開有効化の統制', seconds: '秒', transferLocked: '外部送金ロック',
        rewardTitle: '報酬構造', appReward: 'アプリ活動報酬', appRewardDesc: 'メモ、録音、クラウド、PLAIペット成長などのユーザー活動記録', storageReward: '分散ストレージ報酬', storageRewardDesc: 'ストレージ提供、chunk保存/検証、容量提供への報酬', nodeReward: 'ノード運用報酬', nodeRewardDesc: 'PCノードのオンライン維持とネットワーク貢献記録',
        rewardSummary: '現在のExplorer基準の純報酬', ledgerRecords: '台帳記録', tracking: 'を追跡中です。', statusTitle: '運用指標', latestBlock: '最新ブロック', latestBlockDesc: '最新ブロック高', wallets: 'ウォレット', walletsDesc: 'チェーンウォレット数', nodes: 'オンラインノード', nodesDesc: '現在heartbeatが確認された参加ノード', validators: '検証者', validatorsDesc: 'QBFT検証者数', finalized: '確定ブロック', finalizedDesc: '確定済みブロック数', circulating: '流通量', circulatingDesc: 'ウォレット台帳基準の流通量',
        transparencyTitle: '透明性資料', sourceTitle: '公開ソース', sourceDesc: '機密情報を除去した公開ZIP、バージョン履歴、ファイルインデックス、SHA256検証値を提供します。', latestVersion: '最新バージョン', files: 'ファイル', generated: '生成日時', explorerLedgerTitle: 'Explorer台帳', explorerLedgerDesc: '報酬、減点、ウォレット、ブロック、Proofの流れを直接照会できます。', searchable: '検索可能項目: アドレス、txHash、ブロック高/hash、proof id/hash',
        roadmapTitle: '現在の段階と次の作業', now: '完了', testnetOps: 'メインネット技術運用', testnetOpsDesc: '4台の独立ホスト上のQBFT検証者、ブロック活性、キー保管、11/11技術ゲートを確認しました。', preparing: '進行中', mainnetCriteria: '取引所連携と外部レビュー', mainnetCriteriaDesc: '入出金仕様、復旧試験、独立セキュリティ監査、法務/KYB資料を準備します。', next: '承認後', listingPack: '公開有効化と上場申請', listingPackDesc: '必須証拠と明示的承認後、各取引所の公式チャネルから取引支援を申請します。',
        noticeTitle: '審査資料の利用案内', noticeDesc: 'このページは上場保証を意味しません。ただし外部レビュアーがプロジェクトの実運用状態、公開ソース、ホワイトペーパー、Explorer台帳を確認する公式根拠資料として利用できます。',
        linksTitle: '審査資料リンク', linksDesc: '外部レビュアーが最初に確認すべき主要資料です。', structure: 'ポリシー/構造', publicSource: '公開ソース', ledgerVerify: '台帳検証', status: '運用状態', userReward: 'ユーザー報酬', storageNode: 'ストレージノード', checkSource: '公開ソース確認', openLedger: '台帳検証を開く'
      }
    };
    const T = L[lang] || L.ko;
    const manifest = sourceManifest || {};
    const hasSource = !!manifest.ok;
    const sourceVersion = hasSource ? manifest.version : '-';
    const sourceSha = hasSource ? manifest.sha256 : '-';
    const sourceFileCount = hasSource ? Number(manifest.fileCount || 0).toLocaleString(lang === 'ko' ? 'ko-KR' : lang === 'ja' ? 'ja-JP' : lang === 'zh' ? 'zh-CN' : 'en-US') : '0';
    const sourceDate = hasSource && manifest.generatedAt ? new Date(manifest.generatedAt).toLocaleString(lang === 'ko' ? 'ko-KR' : lang === 'ja' ? 'ja-JP' : lang === 'zh' ? 'zh-CN' : 'en-US', { timeZone: 'Asia/Seoul' }) : '-';
    const rewardNet = formatNumber(rewardSummary?.net || 0, 2);
    const rewardCount = Number(rewardSummary?.count || 0).toLocaleString(lang === 'ko' ? 'ko-KR' : lang === 'ja' ? 'ja-JP' : lang === 'zh' ? 'zh-CN' : 'en-US');
    const langHref = (nextLang) => (typeof chainLangUrl === 'function' ? chainLangUrl(nextLang) : ('/listing?lang=' + nextLang));
  %>
  <section class="hero">
    <div class="wrap">
      <div class="nav">
        <a class="brand" href="/listing?lang=<%= lang %>"><img class="brand-symbol" src="/images/plai-symbol-mark-v1.png" alt="plais Chain symbol" /><%= T.brandTitle %></a>
        <div class="actions">
          <a class="btn" href="/?lang=<%= lang %>"><%= T.navHome %></a>
          <a class="btn" href="/explorer?lang=<%= lang %>"><%= T.navExplorer %></a>
          <a class="btn" href="/source?lang=<%= lang %>"><%= T.navSource %></a>
          <a class="btn" href="/whitepaper/<%= lang === 'ko' ? 'ko' : 'en' %>"><%= T.navWhitepaper %></a>
          <a class="btn" href="https://aisfor.kr/home"><%= T.navPlaifor %></a>
        </div>
      </div>
      <h1><%= T.heroTitle %></h1>
      <p class="lead"><%= T.heroLead %></p>
      <div class="lang-actions">
        <% ['ko','en','zh','ja'].forEach(function(code){ %>
          <a class="btn <%= lang === code ? 'active' : '' %>" href="<%= langHref(code) %>"><%= code.toUpperCase() %></a>
        <% }) %>
      </div>
      <div class="hero-grid">
        <div class="hero-stat"><span><%= T.network %></span><strong><%= chainStatus === 'OK' && chainId ? 'Canonical Mainnet' : 'CHECK' %></strong></div>
        <div class="hero-stat"><span><%= T.symbol %></span><strong><%= symbol %></strong></div>
        <div class="hero-stat"><span><%= T.chainVerify %></span><strong><%= chainStatus %></strong></div>
        <div class="hero-stat"><span><%= T.readiness %></span><strong><%= externalTransfersLocked ? 'LOCKED' : 'CHECK' %></strong></div>
      </div>
    </div>
  </section>

  <main>
    <div class="wrap grid">
      <div>
        <section class="panel">
          <span class="tag"><%= T.projectSummary %></span>
          <h2 style="margin-top:12px;"><%= T.projectTitle %></h2>
          <p><%= T.projectDesc %></p>
          <div class="three-col">
            <div class="card"><small><%= T.chain %></small><strong><%= chainStatus === 'OK' && chainId ? 'PLAIS Chain' : chainName %></strong><p><%= networkId %></p></div>
            <div class="card"><small><%= T.totalSupply %></small><strong><%= totalSupply %> <%= symbol %></strong><p><%= T.totalSupplyDesc %></p></div>
            <div class="card"><small><%= T.addressPrefix %></small><strong><%= addressPrefix %></strong><p><%= T.addressPrefixDesc %></p></div>
          </div>
        </section>

        <section class="panel section">
          <h2><%= T.integrationTitle %></h2>
          <div class="two-col">
            <div class="card"><small><%= T.chainIdLabel %></small><strong><%= chainId %></strong><p><%= networkId %></p></div>
            <div class="card"><small><%= T.consensusLabel %></small><strong><%= consensus %></strong><p><%= validatorCount %> validators</p></div>
            <div class="card"><small><%= T.blockTimeLabel %></small><strong><%= blockTimeTargetSec %> <%= T.seconds %></strong><p>QBFT deterministic finality</p></div>
            <div class="card"><small><%= T.launchControlLabel %></small><strong><%= externalTransfersLocked ? T.approvalRequired : 'CHECK' %></strong><p><%= externalTransfersLocked ? T.transferLocked : 'CHECK' %></p><code class="status-code"><%= launchControlStatus %></code></div>
          </div>
        </section>

        <section class="panel section">
          <h2><%= T.policyTitle %></h2>
          <div class="two-col">
            <div class="card"><h3><%= T.issueTitle %></h3><p><%= T.issueDesc %></p></div>
            <div class="card"><h3><%= T.pointTitle %></h3><p><%= T.pointDesc %></p></div>
          </div>
        </section>

        <section class="panel section">
          <h2><%= T.rewardTitle %></h2>
          <div class="three-col">
            <div class="card"><small>App Active</small><strong><%= T.appReward %></strong><p><%= T.appRewardDesc %></p></div>
            <div class="card"><small>Storage</small><strong><%= T.storageReward %></strong><p><%= T.storageRewardDesc %></p></div>
            <div class="card"><small>Node Active</small><strong><%= T.nodeReward %></strong><p><%= T.nodeRewardDesc %></p></div>
          </div>
          <p class="muted"><%= T.rewardSummary %> <strong><%= rewardNet %> <%= rewardUnit %></strong>, <%= T.ledgerRecords %> <strong><%= rewardCount %></strong> <%= T.tracking %></p>
        </section>

        <section class="panel section">
          <h2><%= T.statusTitle %></h2>
          <div class="three-col">
            <div class="card"><small><%= T.latestBlock %></small><strong>#<%= latestHeight %></strong><p><%= T.latestBlockDesc %></p></div>
            <div class="card"><small><%= T.wallets %></small><strong><%= walletCount %></strong><p><%= T.walletsDesc %></p></div>
            <div class="card"><small><%= T.nodes %></small><strong><%= onlineNodeCount %></strong><p><%= T.nodesDesc %></p></div>
            <div class="card"><small><%= T.validators %></small><strong><%= validatorCount %></strong><p><%= T.validatorsDesc %></p></div>
            <div class="card"><small><%= T.finalized %></small><strong><%= finalizedBlocks %></strong><p><%= T.finalizedDesc %></p></div>
            <div class="card"><small><%= T.circulating %></small><strong><%= circulating %> <%= symbol %></strong><p><%= T.circulatingDesc %></p></div>
          </div>
        </section>

        <section class="panel section">
          <h2><%= T.transparencyTitle %></h2>
          <div class="two-col">
            <div class="card">
              <h3><%= T.sourceTitle %></h3>
              <p><%= T.sourceDesc %></p>
              <p class="muted"><%= T.latestVersion %> <%= sourceVersion %> · <%= T.files %> <%= sourceFileCount %> · <%= T.generated %> <%= sourceDate %></p>
              <code><%= sourceSha %></code>
            </div>
            <div class="card">
              <h3><%= T.explorerLedgerTitle %></h3>
              <p><%= T.explorerLedgerDesc %></p>
              <p class="muted"><%= T.searchable %></p>
            </div>
          </div>
        </section>

        <section class="panel section">
          <h2><%= T.roadmapTitle %></h2>
          <div class="roadmap">
            <div class="roadmap-row"><span class="tag"><%= T.now %></span><div><h3><%= T.testnetOps %></h3><p><%= T.testnetOpsDesc %></p></div></div>
            <div class="roadmap-row"><span class="tag"><%= T.preparing %></span><div><h3><%= T.mainnetCriteria %></h3><p><%= T.mainnetCriteriaDesc %></p></div></div>
            <div class="roadmap-row"><span class="tag"><%= T.next %></span><div><h3><%= T.listingPack %></h3><p><%= T.listingPackDesc %></p></div></div>
          </div>
        </section>

        <section class="panel section warning">
          <h2><%= T.noticeTitle %></h2>
          <p><%= T.noticeDesc %></p>
        </section>
      </div>

      <aside class="panel side">
        <h2><%= T.linksTitle %></h2>
        <p><%= T.linksDesc %></p>
        <div class="link-list">
          <a href="/whitepaper/<%= lang === 'ko' ? 'ko' : 'en' %>">Whitepaper <span><%= T.structure %></span></a>
          <a href="/source?lang=<%= lang %>">Source <span><%= T.publicSource %></span></a>
          <a href="/explorer?lang=<%= lang %>">Explorer <span><%= T.ledgerVerify %></span></a>
          <a href="/status?lang=<%= lang %>">Status <span><%= T.status %></span></a>
          <a href="https://aisfor.kr/points">plais Point <span><%= T.userReward %></span></a>
          <a href="https://aisfor.kr/sync-client/pool">Node Pool <span><%= T.storageNode %></span></a>
        </div>
        <a class="btn primary" href="/source?lang=<%= lang %>"><%= T.checkSource %></a>
        <a class="btn" href="/explorer?lang=<%= lang %>"><%= T.openLedger %></a>
      </aside>
    </div>
  </main>
</body>
</html>
