Spaces:
Running
Running
| <html lang="zh-CN"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Lisp 方言大比拼:谁最好用?</title> | |
| <!-- 引入 FontAwesome 图标库 --> | |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
| <style> | |
| /* | |
| * 全局变量定义 | |
| * 使用 CSS 变量方便统一管理主题颜色 | |
| */ | |
| :root { | |
| --bg-color: #0f172a; | |
| --card-bg: #1e293b; | |
| --text-main: #f1f5f9; | |
| --text-muted: #94a3b8; | |
| --accent-primary: #3b82f6; | |
| --accent-secondary: #8b5cf6; | |
| --border-color: #334155; | |
| /* 方言主题色 */ | |
| --cl-color: #ef4444; /* Common Lisp - Red */ | |
| --clojure-color: #5eead4; /* Clojure - Teal */ | |
| --scheme-color: #f59e0b; /* Scheme - Amber */ | |
| --elisp-color: #d946ef; /* Emacs Lisp - Fuchsia */ | |
| --spacing-sm: 0.5rem; | |
| --spacing-md: 1rem; | |
| --spacing-lg: 2rem; | |
| --radius: 12px; | |
| --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); | |
| --shadow-hover: 0 20px 25px -5px rgba(0, 0, 0, 0.2), 0 10px 10px -5px rgba(0, 0, 0, 0.1); | |
| } | |
| /* | |
| * 基础重置与排版 | |
| */ | |
| * { | |
| box-sizing: border-box; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| body { | |
| font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; | |
| background-color: var(--bg-color); | |
| color: var(--text-main); | |
| line-height: 1.6; | |
| overflow-x: hidden; | |
| } | |
| a { | |
| text-decoration: none; | |
| color: inherit; | |
| transition: color 0.3s ease; | |
| } | |
| /* | |
| * 布局容器 | |
| */ | |
| .container { | |
| max-width: 1200px; | |
| margin: 0 auto; | |
| padding: 0 var(--spacing-md); | |
| } | |
| /* | |
| * Header / 导航栏 | |
| */ | |
| header { | |
| background-color: rgba(15, 23, 42, 0.9); | |
| backdrop-filter: blur(10px); | |
| border-bottom: 1px solid var(--border-color); | |
| position: sticky; | |
| top: 0; | |
| z-index: 100; | |
| padding: var(--spacing-md) 0; | |
| } | |
| .header-content { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .logo { | |
| font-size: 1.5rem; | |
| font-weight: 700; | |
| background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| display: flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| } | |
| .anycoder-link { | |
| font-size: 0.875rem; | |
| color: var(--text-muted); | |
| border: 1px solid var(--border-color); | |
| padding: 0.25rem 0.75rem; | |
| border-radius: 20px; | |
| transition: all 0.3s ease; | |
| } | |
| .anycoder-link:hover { | |
| color: var(--text-main); | |
| border-color: var(--accent-primary); | |
| background-color: rgba(59, 130, 246, 0.1); | |
| } | |
| /* | |
| * Hero Section | |
| */ | |
| .hero { | |
| text-align: center; | |
| padding: 5rem 0 3rem; | |
| } | |
| .hero h1 { | |
| font-size: 3rem; | |
| margin-bottom: var(--spacing-md); | |
| line-height: 1.2; | |
| } | |
| .hero p { | |
| font-size: 1.25rem; | |
| color: var(--text-muted); | |
| max-width: 700px; | |
| margin: 0 auto var(--spacing-lg); | |
| } | |
| .highlight { | |
| color: var(--accent-primary); | |
| font-weight: bold; | |
| } | |
| /* | |
| * 方言卡片网格 | |
| */ | |
| .dialect-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); | |
| gap: var(--spacing-lg); | |
| padding-bottom: 5rem; | |
| } | |
| /* | |
| * 卡片组件样式 | |
| */ | |
| .card { | |
| background-color: var(--card-bg); | |
| border-radius: var(--radius); | |
| border: 1px solid var(--border-color); | |
| overflow: hidden; | |
| transition: transform 0.3s ease, box-shadow 0.3s ease; | |
| display: flex; | |
| flex-direction: column; | |
| position: relative; | |
| } | |
| .card:hover { | |
| transform: translateY(-5px); | |
| box-shadow: var(--shadow-hover); | |
| border-color: var(--accent-primary); | |
| } | |
| .card-header { | |
| padding: var(--spacing-lg); | |
| border-bottom: 1px solid var(--border-color); | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .card-title { | |
| font-size: 1.5rem; | |
| font-weight: 700; | |
| display: flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| } | |
| .card-badge { | |
| font-size: 0.75rem; | |
| padding: 0.25rem 0.5rem; | |
| border-radius: 4px; | |
| background-color: rgba(255, 255, 255, 0.1); | |
| font-weight: 600; | |
| } | |
| /* | |
| * 标签页导航 | |
| */ | |
| .card-tabs { | |
| display: flex; | |
| background-color: rgba(0, 0, 0, 0.2); | |
| } | |
| .tab-btn { | |
| flex: 1; | |
| padding: var(--spacing-sm); | |
| background: none; | |
| border: none; | |
| color: var(--text-muted); | |
| cursor: pointer; | |
| border-bottom: 2px solid transparent; | |
| transition: all 0.2s; | |
| font-size: 0.9rem; | |
| } | |
| .tab-btn:hover { | |
| color: var(--text-main); | |
| background-color: rgba(255, 255, 255, 0.05); | |
| } | |
| .tab-btn.active { | |
| color: var(--text-main); | |
| border-bottom-color: var(--accent-primary); | |
| } | |
| /* | |
| * 标签页内容 | |
| */ | |
| .card-body { | |
| padding: var(--spacing-lg); | |
| flex-grow: 1; | |
| } | |
| .tab-content { | |
| display: none; | |
| animation: fadeIn 0.3s ease; | |
| } | |
| .tab-content.active { | |
| display: block; | |
| } | |
| @keyframes fadeIn { | |
| from { opacity: 0; transform: translateY(5px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| .feature-list { | |
| list-style: none; | |
| } | |
| .feature-list li { | |
| margin-bottom: 0.5rem; | |
| display: flex; | |
| align-items: flex-start; | |
| gap: 0.5rem; | |
| font-size: 0.95rem; | |
| color: var(--text-muted); | |
| } | |
| .feature-list i { | |
| margin-top: 4px; | |
| color: var(--accent-primary); | |
| } | |
| /* 代码块样式 */ | |
| .code-block { | |
| background-color: #0d1117; | |
| padding: var(--spacing-md); | |
| border-radius: 6px; | |
| font-family: 'Fira Code', monospace; | |
| font-size: 0.85rem; | |
| color: #e6edf3; | |
| overflow-x: auto; | |
| border: 1px solid var(--border-color); | |
| } | |
| .code-keyword { color: #ff7b72; } | |
| .code-func { color: #d2a8ff; } | |
| .code-string { color: #a5d6ff; } | |
| .code-comment { color: #8b949e; font-style: italic; } | |
| /* | |
| * 评分/结论区域 | |
| */ | |
| .verdict-section { | |
| background-color: var(--card-bg); | |
| border-radius: var(--radius); | |
| padding: var(--spacing-lg); | |
| margin-bottom: 5rem; | |
| border: 1px solid var(--border-color); | |
| } | |
| .verdict-title { | |
| text-align: center; | |
| margin-bottom: var(--spacing-lg); | |
| font-size: 2rem; | |
| } | |
| .comparison-table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| } | |
| .comparison-table th, .comparison-table td { | |
| text-align: left; | |
| padding: var(--spacing-md); | |
| border-bottom: 1px solid var(--border-color); | |
| } | |
| .comparison-table th { | |
| color: var(--text-muted); | |
| font-weight: 600; | |
| font-size: 0.9rem; | |
| text-transform: uppercase; | |
| } | |
| .comparison-table tr:last-child td { | |
| border-bottom: none; | |
| } | |
| /* | |
| * Footer | |
| */ | |
| footer { | |
| text-align: center; | |
| padding: 2rem 0; | |
| border-top: 1px solid var(--border-color); | |
| color: var(--text-muted); | |
| font-size: 0.9rem; | |
| } | |
| /* | |
| * 响应式调整 | |
| */ | |
| @media (max-width: 768px) { | |
| .hero h1 { | |
| font-size: 2rem; | |
| } | |
| .comparison-table { | |
| display: block; | |
| overflow-x: auto; | |
| white-space: nowrap; | |
| } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <!-- 顶部导航 --> | |
| <header> | |
| <div class="container header-content"> | |
| <a href="#" class="logo"> | |
| <i class="fa-solid fa-brackets-curly"></i> Lisp 战场 | |
| </a> | |
| <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="anycoder-link"> | |
| Built with anycoder <i class="fa-solid fa-arrow-up-right-from-square" style="font-size: 0.7em;"></i> | |
| </a> | |
| </div> | |
| </header> | |
| <main class="container"> | |
| <!-- 英雄区域:标题与介绍 --> | |
| <section class="hero"> | |
| <h1>现在 Lisp 方言中<br><span class="highlight">谁最好用?</span></h1> | |
| <p> | |
| Lisp 家族历史悠久,方言众多。没有绝对的“最好”,只有“最适合”。 | |
| 无论是追求工业级性能、现代并发体验,还是极简主义美学,这里都有你的选择。 | |
| </p> | |
| </section> | |
| <!-- 方言对比卡片区域 --> | |
| <section class="dialect-grid"> | |
| <!-- Common Lisp 卡片 --> | |
| <article class="card" style="--accent-primary: var(--cl-color);"> | |
| <div class="card-header"> | |
| <div class="card-title" style="color: var(--cl-color);"> | |
| <i class="fa-solid fa-server"></i> Common Lisp | |
| </div> | |
| <span class="card-badge">工业标准</span> | |
| </div> | |
| <div class="card-tabs"> | |
| <button class="tab-btn active" onclick="switchTab(this, 'cl-overview')">简介</button> | |
| <button class="tab-btn" onclick="switchTab(this, 'cl-code')">代码</button> | |
| <button class="tab-btn" onclick="switchTab(this, 'cl-verdict')">评价</button> | |
| </div> | |
| <div class="card-body"> | |
| <div id="cl-overview" class="tab-content active"> | |
| <p style="margin-bottom: 1rem;">Common Lisp (CL) 是经过 ANSI 标准化的 Lisp 方言。它庞大、多范式,旨在成为通用的工业级语言。</p> | |
| <ul class="feature-list"> | |
| <li><i class="fa-solid fa-check"></i> 编译速度快,性能接近 C++</li> | |
| <li><i class="fa-solid fa-check"></i> 极其强大的宏系统</li> | |
| <li><i class="fa-solid fa-check"></i> 丰富的内置库和面向对象系统 (CLOS)</li> | |
| </ul> | |
| </div> | |
| <div id="cl-code" class="tab-content"> | |
| <div class="code-block"> | |
| <span class="code-comment">; 定义一个类和通用方法</span> | |
| <span class="code-keyword">(defclass</span> dog () ((name :initarg :name :accessor dog-name))) | |
| <span class="code-keyword">(defmethod</span> bark ((d dog)) | |
| (<span class="code-func">format</span> t <span class="code-string">"~A says Woof!~%"</span> (dog-name d))) | |
| <span class="code-comment">; 使用</span> | |
| <span class="code-keyword">(let</span> ((my-dog (<span class="code-func">make-instance</span> 'dog :name <span class="code-string">"Spot"</span>))) | |
| (bark my-dog)) | |
| </div> | |
| </div> | |
| <div id="cl-verdict" class="tab-content"> | |
| <p><strong>适合人群:</strong> 需要构建复杂系统、追求极致性能和控制力的开发者。</p> | |
| <p style="margin-top: 0.5rem; font-size: 0.9rem; color: var(--text-muted);"> | |
| 它是 Lisp 世界的“重型坦克”,虽然上手曲线较陡,但一旦掌握,威力无穷。 | |
| </p> | |
| </div> | |
| </div> | |
| </article> | |
| <!-- Clojure 卡片 --> | |
| <article class="card" style="--accent-primary: var(--clojure-color);"> | |
| <div class="card-header"> | |
| <div class="card-title" style="color: var(--clojure-color);"> | |
| <i class="fa-solid fa-cube"></i> Clojure | |
| </div> | |
| <span class="card-badge">现代实用</span> | |
| </div> | |
| <div class="card-tabs"> | |
| <button class="tab-btn active" onclick="switchTab(this, 'clojure-overview')">简介</button> | |
| <button class="tab-btn" onclick="switchTab(this, 'clojure-code')">代码</button> | |
| <button class="tab-btn" onclick="switchTab(this, 'clojure-verdict')">评价</button> | |
| </div> | |
| <div class="card-body"> | |
| <div id="clojure-overview" class="tab-content active"> | |
| <p style="margin-bottom: 1rem;">运行在 JVM (Java 虚拟机) 上的现代 Lisp。它强调不可变性和函数式编程,解决了传统 Lisp 在并发处理上的痛点。</p> | |
| <ul class="feature-list"> | |
| <li><i class="fa-solid fa-check"></i> 天生支持并发</li> | |
| <li><i class="fa-solid fa-check"></i> 不可变数据结构</li> | |
| <li><i class="fa-solid fa-check"></i> 可以无缝调用 Java 库</li> | |
| </ul> | |
| </div> | |
| <div id="clojure-code" class="tab-content"> | |
| <div class="code-block"> | |
| <span class="code-comment">; 现代函数式风格</span> | |
| <span class="code-keyword">(defn</span> process-data [data] | |
| (<span class="code-func">-></span> data | |
| (<span class="code-func">filter</span> odd?) | |
| (<span class="code-func">map</span> inc) | |
| (<span class="code-func">reduce</span> + 0))) | |
| <span class="code-comment">; 调用</span> | |
| (println (process-data [1 2 3 4 5])) | |
| <span class="code-comment">; => 9 (2+4+6)</span> | |
| </div> | |
| </div> | |
| <div id="clojure-verdict" class="tab-content"> | |
| <p><strong>适合人群:</strong> 后端开发者、大数据处理、以及在 Java 环境中寻求更简洁语言的人。</p> | |
| <p style="margin-top: 0.5rem; font-size: 0.9rem; color: var(--text-muted);"> | |
| 目前最流行的 Lisp 方言,就业机会最多,生态最活跃。 | |
| </p> | |
| </div> | |
| </div> | |
| </article> | |
| <!-- Scheme / Racket 卡片 --> | |
| <article class="card" style="--accent-primary: var(--scheme-color);"> | |
| <div class="card-header"> | |
| <div class="card-title" style="color: var(--scheme-color);"> | |
| <i class="fa-solid fa-graduation-cap"></i> Scheme / Racket | |
| </div> | |
| <span class="card-badge">极简主义</span> | |
| </div> | |
| <div class="card-tabs"> | |
| <button class="tab-btn active" onclick="switchTab(this, 'scheme-overview')">简介</button> | |
| <button class="tab-btn" onclick="switchTab(this, 'scheme-code')">代码</button> | |
| <button class="tab-btn" onclick="switchTab(this, 'scheme-verdict')">评价</button> | |
| </div> | |
| <div class="card-body"> | |
| <div id="scheme-overview" class="tab-content active"> | |
| <p style="margin-bottom: 1rem;">Scheme 以其极简的内核著称。Racket 是 Scheme 的一个现代衍生版,不仅是编程语言,更是创建编程语言的平台 (PLT)。</p> | |
| <ul class="feature-list"> | |
| <li><i class="fa-solid fa-check"></i> 语法极其干净,正交性高</li> | |
| <li><i class="fa-solid fa-check"></i> 宏系统卫生</li> | |
| <li><i class="fa-solid fa-check"></i> 编程语言教育的首选</li> | |
| </ul> | |
| </div> | |
| <div id="scheme-code" class="tab-content"> | |
| <div class="code-block"> | |
| <span class="code-comment">; 递归计算阶乘</span> | |
| <span class="code-keyword">(define</span> (factorial n) | |
| (<span class="code-keyword">if</span> (= n 0) | |
| 1 | |
| (* n (factorial (- n 1))))) | |
| <span class="code-comment">; 简单的列表操作</span> | |
| <span class="code-keyword">(define</span> squares | |
| (<span class="code-func">map</span> (lambda (x) (* x x)) '(1 2 3 4))) | |
| </div> | |
| </div> | |
| <div id="scheme-verdict" class="tab-content"> | |
| <p><strong>适合人群:</strong> 计算机科学学生、语言设计师、喜欢极简美学的人。</p> | |
| <p style="margin-top: 0.5rem; font-size: 0.9rem; color: var(--text-muted);"> | |
| 如果你想理解编程的本质,或者想快速发明一个 DSL,Racket 是最佳选择。 | |
| </p> | |
| </div> | |
| </div> | |
| </article> | |
| <!-- Emacs Lisp 卡片 --> | |
| <article class="card" style="--accent-primary: var(--elisp-color);"> | |
| <div class="card-header"> | |
| <div class="card-title" style="color: var(--elisp-color);"> | |
| <i class="fa-brands fa-linux"></i> Emacs Lisp | |
| </div> | |
| <span class="card-badge">编辑器之神</span> | |
| </div> | |
| <div class="card-tabs"> | |
| <button class="tab-btn active" onclick="switchTab(this, 'elisp-overview')">简介</button> | |
| <button class="tab-btn" onclick="switchTab(this, 'elisp-code')">代码</button> | |
| <button class="tab-btn" onclick="switchTab(this, 'elisp-verdict')">评价</button> | |
| </div> | |
| <div class="card-body"> | |
| <div id="elisp-overview" class="tab-content active"> | |
| <p style="margin-bottom: 1rem;">Emacs 编辑器的扩展语言。如果你是 Emacs 用户,Elisp 是你必须掌握的工具,它让编辑器变成了操作系统。</p> | |
| <ul class="feature-list"> | |
| <li><i class="fa-solid fa-check"></i> 与 Emacs 编辑器深度集成</li> | |
| <li><i class="fa-solid fa-check"></i> 交互式开发体验极强</li> | |
| <li><i class="fa-solid fa-check"></i> 动态作用域 (默认)</li> | |
| </ul> | |
| </div> | |
| <div id="elisp-code" class="tab-content"> | |
| <div class="code-block"> | |
| <span class="code-comment">; 定义一个简单的交互式函数</span> | |
| <span class="code-keyword">(defun</span> insert-current-date () | |
| <span class="code-string">"Insert current date at point."</span> | |
| (<span class="code-keyword">interactive</span>) | |
| (<span class="code-func">insert</span> (<span class="code-func">format-time-string</span> <span class="code-string">"%Y-%m-%d"</span>))) | |
| <span class="code-comment">; 绑定快捷键</span> | |
| (<span class="code-func">global-set-key</span> (kbd <span class="code-string">"C-c d"</span>) 'insert-current-date) | |
| </div> | |
| </div> | |
| <div id="elisp-verdict" class="tab-content"> | |
| <p><strong>适合人群:</strong> 重度 Emacs 用户、想要定制自己编辑工作流的人。</p> | |
| <p style="margin-top: 0.5rem; font-size: 0.9rem; color: var(--text-muted);"> | |
| 它的用途非常垂直,但在那个领域它是不可替代的王者。 | |
| </p> | |
| </div> | |
| </div> | |
| </article> | |
| </section> | |
| <!-- 总结对比表 --> | |
| <section class="verdict-section"> | |
| <h2 class="verdict-title"><i class="fa-solid fa-scale-balanced"></i> 综合对比</h2> | |
| <div style="overflow-x: auto;"> | |
| <table class="comparison-table"> | |
| <thead> | |
| <tr> | |
| <th>特性</th> | |
| <th style="color: var(--cl-color);">Common Lisp</th> | |
| <th style="color: var(--clojure-color);">Clojure</th> | |
| <th style="color: var(--scheme-color);">Scheme/Racket</th> | |
| <th style="color: var(--elisp-color);">Emacs Lisp</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td><strong>学习曲线</strong></td> | |
| <td>中等偏难</td> | |
| <td>中等</td> | |
| <td>简单 (入门难精通)</td> | |
| <td>中等 (需懂 Emacs)</td> | |
| </tr> | |
| <tr> | |
| <td><strong>运行速度</strong></td> | |
| <td><i class="fa-solid fa-rocket"></i> 极快</td> | |
| <td>快 (JVM 优化)</td> | |
| <td>中等</td> | |
| <td>解释型,较慢</td> | |
| </tr> | |
| <tr> | |
| <td><strong>并发能力</strong></td> | |
| <td>依赖实现</td> | |
| <td><i class="fa-solid fa-bolt"></i> 核心优势</td> | |
| <td>支持良好 (Racket)</td> | |
| <td>较弱</td> | |
| </tr> | |
| <tr> | |
| <td><strong>主要用途</strong></td> | |
| <td>系统开发、AI 传统应用</td> | |
| <td>后端、大数据、Web</td> | |
| <td>教育、脚本、语言设计</td> | |
| <td>编辑器扩展</td> | |
| </tr> | |
| <tr> | |
| <td><strong>生态活跃度</strong></td> | |
| <td>稳定,经典</td> | |
| <td><i class="fa-solid fa-fire"></i> 非常活跃</td> | |
| <td>活跃 (学术界)</td> | |
| <td>特定圈子活跃</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </section> | |
| </main> | |
| <footer> | |
| <p>© 2023 Lisp Dialect Showcase. Designed with <i class="fa-solid fa-heart" style="color: var(--cl-color);"></i> & Code.</p> | |
| </footer> | |
| <!-- 交互脚本 --> | |
| <script> | |
| /** | |
| * 切换标签页的函数 | |
| * @param {HTMLElement} btn - 被点击的按钮元素 | |
| * @param {string} targetId - 目标内容区域的 ID | |
| */ | |
| function switchTab(btn, targetId) { | |
| // 1. 找到当前按钮所在的卡片容器 | |
| const cardBody = btn.closest('.card').querySelector('.card-body'); | |
| // 2. 移除该卡片下所有按钮的 active 类 | |
| const buttons = btn.parentElement.querySelectorAll('.tab-btn'); | |
| buttons.forEach(b => b.classList.remove('active')); | |
| // 3. 隐藏该卡片下所有内容区域 | |
| const contents = cardBody.querySelectorAll('.tab-content'); | |
| contents.forEach(c => c.classList.remove('active')); | |
| // 4. 激活当前按钮和目标内容 | |
| btn.classList.add('active'); | |
| document.getElementById(targetId).classList.add('active'); | |
| } | |
| // 添加简单的滚动动画效果 | |
| document.addEventListener('DOMContentLoaded', () => { | |
| const cards = document.querySelectorAll('.card'); | |
| const observer = new IntersectionObserver((entries) => { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| entry.target.style.opacity = '1'; | |
| entry.target.style.transform = 'translateY(0)'; | |
| } | |
| }); | |
| }, { threshold: 0.1 }); | |
| cards.forEach((card, index) => { | |
| // 初始化状态,用于动画 | |
| card.style.opacity = '0'; | |
| card.style.transform = 'translateY(20px)'; | |
| card.style.transition = `all 0.6s ease ${index * 0.1}s`; // 阶梯式延迟 | |
| observer.observe(card); | |
| }); | |
| }); | |
| </script> | |
| </body> | |
| </html> |