From 7e28fcbd7a701932b698885c035e270c1b134516 Mon Sep 17 00:00:00 2001 From: Jason Lee Date: Mon, 27 May 2024 11:33:39 +0800 Subject: [PATCH] Update website to add install on Windows and Zed extension --- autocorrect-website/index.html | 2 +- autocorrect-website/src/AppEditor.tsx | 48 ++-- autocorrect-website/src/docs/usage.md | 42 ++-- autocorrect-website/src/markdown.scss | 312 +++++++++++++------------- autocorrect-website/src/style.scss | 110 ++++----- autocorrect-website/src/tabs.scss | 59 +++++ autocorrect-website/src/welcome.tsx | 135 +++++++---- bun.lockb | Bin 112272 -> 106512 bytes 8 files changed, 418 insertions(+), 290 deletions(-) create mode 100644 autocorrect-website/src/tabs.scss diff --git a/autocorrect-website/index.html b/autocorrect-website/index.html index 3ffc6a5c..705ca82b 100644 --- a/autocorrect-website/index.html +++ b/autocorrect-website/index.html @@ -79,4 +79,4 @@

AutoCorrect

- \ No newline at end of file + diff --git a/autocorrect-website/src/AppEditor.tsx b/autocorrect-website/src/AppEditor.tsx index a5682650..bf5b0ee3 100644 --- a/autocorrect-website/src/AppEditor.tsx +++ b/autocorrect-website/src/AppEditor.tsx @@ -1,16 +1,18 @@ -import Editor from '@monaco-editor/react'; -import * as monaco from 'monaco-editor'; -import { useEffect, useState } from 'react'; -import examples from './examples'; -import './style.scss'; -export const autocorrectLib = import('@huacnlee/autocorrect'); +import Editor from "@monaco-editor/react"; +import * as monaco from "monaco-editor"; +import { useEffect, useState } from "react"; +import examples from "./examples"; +import "./style.scss"; +import "./tabs.scss"; + +export const autocorrectLib = import("@huacnlee/autocorrect"); export let config = { rules: { spellcheck: 2, }, spellcheck: { - words: ['WebAssembly', 'Rust', 'NPM', 'Web', 'JavaScript'], + words: ["WebAssembly", "Rust", "NPM", "Web", "JavaScript"], }, }; @@ -28,7 +30,7 @@ export const createMarkers = (result: any) => { endColumn: lineResult.c + lineResult.old.length, message: `AutoCorrect: ${lineResult.new}`, }; - } + }, ); return markers; @@ -41,9 +43,9 @@ autocorrectLib.then((ac) => { }); const editorOptions: monaco.editor.IStandaloneEditorConstructionOptions = { - theme: window.matchMedia('(prefers-color-scheme: dark)').matches - ? 'vs-dark' - : 'vs', + theme: window.matchMedia("(prefers-color-scheme: dark)").matches + ? "vs-dark" + : "vs", tabSize: 2, useTabStops: false, scrollbar: { @@ -51,7 +53,7 @@ const editorOptions: monaco.editor.IStandaloneEditorConstructionOptions = { horizontalScrollbarSize: 5, useShadows: false, }, - renderLineHighlight: 'none', + renderLineHighlight: "none", minimap: { enabled: false, }, @@ -64,8 +66,8 @@ const editorOptions: monaco.editor.IStandaloneEditorConstructionOptions = { export const AppEditor = () => { const [monaco, setMonaco] = useState(); const [editor, setEditor] = useState(); - const [message, showMessage] = useState(''); - const [fileType, setFileType] = useState('markdown'); + const [message, showMessage] = useState(""); + const [fileType, setFileType] = useState("markdown"); // @ts-ignore const autocorrect = window.autocorrect; @@ -73,19 +75,19 @@ export const AppEditor = () => { useEffect(() => { if (monaco) { // Get media query is dark mode - const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); // Watch dark mode change - mediaQuery.addEventListener('change', (e) => { - const newTheme = e.matches ? 'vs-dark' : 'vs'; + mediaQuery.addEventListener("change", (e) => { + const newTheme = e.matches ? "vs-dark" : "vs"; monaco?.editor?.setTheme(newTheme); }); - monaco.editor.defineTheme('vs-dark', { - base: 'vs-dark', + monaco.editor.defineTheme("vs-dark", { + base: "vs-dark", inherit: true, rules: [], colors: { - 'editor.background': '#030712', + "editor.background": "#030712", }, }); } @@ -108,8 +110,8 @@ export const AppEditor = () => { monaco.editor.setModelMarkers( // @ts-ignore editor.getModel(), - 'autocorrect', - createMarkers(result) + "autocorrect", + createMarkers(result), ); return false; @@ -172,7 +174,7 @@ export const AppEditor = () => { const onEditorMounted = ( editor: monaco.editor.IStandaloneCodeEditor, - monaco: any + monaco: any, ) => { setEditor(editor); setMonaco(monaco); diff --git a/autocorrect-website/src/docs/usage.md b/autocorrect-website/src/docs/usage.md index f9f8d447..bfd77622 100644 --- a/autocorrect-website/src/docs/usage.md +++ b/autocorrect-website/src/docs/usage.md @@ -2,11 +2,19 @@ ## Installation +You can install AutoCorrect via [Homebrew](https://brew.sh) on macOS: + ```bash $ brew install autocorrect ``` -Or you can just install it via this: +For Windows, you can use [Scoop](https://scoop.sh): + +```bash +$ scoop install autocorrect +``` + +Or you can just install it via this on Unix-like system: ```bash $ curl -sSL https://git.io/JcGER | sh @@ -213,10 +221,10 @@ For example, in JavaScript: ```js function hello() { // autocorrect-disable - console.log('现在这行开始autocorrect会暂时禁用'); - console.log('这行也是disable的状态'); + console.log("现在这行开始autocorrect会暂时禁用"); + console.log("这行也是disable的状态"); // autocorrect-enable - let a = '现在起autocorrect回到了启用的状态'; + let a = "现在起autocorrect回到了启用的状态"; } ``` @@ -225,10 +233,10 @@ The output will: ```js function hello() { // autocorrect-disable - console.log('现在这行开始autocorrect会暂时禁用'); - console.log('这行也是disable的状态'); + console.log("现在这行开始autocorrect会暂时禁用"); + console.log("这行也是disable的状态"); // autocorrect-enable - let a = '现在起 autocorrect 回到了启用的状态'; + let a = "现在起 autocorrect 回到了启用的状态"; } ``` @@ -243,11 +251,11 @@ You can use `autocorrect-disable ` in a comment to disable some rules. ```js function hello() { // autocorrect-disable space-word - console.log('现在这行开始autocorrect会暂时禁用.'); + console.log("现在这行开始autocorrect会暂时禁用."); // autocorrect-disable fullwidth - console.log('这行也是disable的状态.'); + console.log("这行也是disable的状态."); // autocorrect-enable - let a = '现在起autocorrect回到了启用的状态.'; + let a = "现在起autocorrect回到了启用的状态."; } ``` @@ -256,11 +264,11 @@ Will get: ```js function hello() { // autocorrect-disable space-word - console.log('现在这行开始autocorrect会暂时禁用。'); + console.log("现在这行开始autocorrect会暂时禁用。"); // autocorrect-disable fullwidth, space-word - console.log('这行也是disable的状态.'); + console.log("这行也是disable的状态."); // autocorrect-enable - let a = '现在起 autocorrect 回到了启用的状态。'; + let a = "现在起 autocorrect 回到了启用的状态。"; } ``` @@ -278,7 +286,13 @@ https://marketplace.visualstudio.com/items?itemName=huacnlee.autocorrect AutoCorrect for VS Code Extension -### Intellij Platform Plugin +### Zed Extension + +https://github.com/huacnlee/zed-autocorrect + +image + +### Intellij Plugin [![](https://img.shields.io/badge/Plugin-Intellij%20Platform-brightgreen)](https://plugins.jetbrains.com/plugin/20244-autocorrect) diff --git a/autocorrect-website/src/markdown.scss b/autocorrect-website/src/markdown.scss index bec9c116..310eabda 100644 --- a/autocorrect-website/src/markdown.scss +++ b/autocorrect-website/src/markdown.scss @@ -1,35 +1,35 @@ .markdown-toc { - max-height: calc(100vh - 160px); - @apply hidden lg:block ml-10 top-12 md:top-40 w-[300px] self-start sticky overflow-auto; - @apply text-gray-600 dark:text-gray-400; + max-height: calc(100vh - 160px); + @apply hidden lg:block ml-10 top-12 md:top-40 w-[360px] self-start sticky overflow-auto; + @apply text-gray-600 dark:text-gray-400; - ul { - @apply leading-6; + ul { + @apply leading-6; - li.active { - & > a { - @apply text-blue-500; - } - } + li.active { + & > a { + @apply text-black font-semibold; + } + } - ul { - @apply pl-3; - } + ul { + @apply pl-3; + } - li > li { - @apply text-sm; + li > li { + @apply text-sm; + } } - } } .markdown-body { - background: transparent !important; - @apply pb-10; + background: transparent !important; + @apply pb-10; } .hljs { - color: #24292e; - background: transparent; + color: #24292e; + background: transparent; } .hljs-doctag, @@ -39,16 +39,16 @@ .hljs-template-variable, .hljs-type, .hljs-variable.language_ { - /* prettylights-syntax-keyword */ - color: #d73a49; + /* prettylights-syntax-keyword */ + color: #d73a49; } .hljs-title, .hljs-title.class_, .hljs-title.class_.inherited__, .hljs-title.function_ { - /* prettylights-syntax-entity */ - color: #6f42c1; + /* prettylights-syntax-entity */ + color: #6f42c1; } .hljs-attr, @@ -61,76 +61,76 @@ .hljs-selector-attr, .hljs-selector-class, .hljs-selector-id { - /* prettylights-syntax-constant */ - color: #005cc5; + /* prettylights-syntax-constant */ + color: #005cc5; } .hljs-regexp, .hljs-string, .hljs-meta .hljs-string { - /* prettylights-syntax-string */ - color: #032f62; + /* prettylights-syntax-string */ + color: #032f62; } .hljs-built_in, .hljs-symbol { - /* prettylights-syntax-variable */ - color: #e36209; + /* prettylights-syntax-variable */ + color: #e36209; } .hljs-comment, .hljs-code, .hljs-formula { - /* prettylights-syntax-comment */ - color: #6a737d; + /* prettylights-syntax-comment */ + color: #6a737d; } .hljs-name, .hljs-quote, .hljs-selector-tag, .hljs-selector-pseudo { - /* prettylights-syntax-entity-tag */ - color: #22863a; + /* prettylights-syntax-entity-tag */ + color: #22863a; } .hljs-subst { - /* prettylights-syntax-storage-modifier-import */ - color: #24292e; + /* prettylights-syntax-storage-modifier-import */ + color: #24292e; } .hljs-section { - /* prettylights-syntax-markup-heading */ - color: #005cc5; - font-weight: bold; + /* prettylights-syntax-markup-heading */ + color: #005cc5; + font-weight: bold; } .hljs-bullet { - /* prettylights-syntax-markup-list */ - color: #735c0f; + /* prettylights-syntax-markup-list */ + color: #735c0f; } .hljs-emphasis { - /* prettylights-syntax-markup-italic */ - color: #24292e; - font-style: italic; + /* prettylights-syntax-markup-italic */ + color: #24292e; + font-style: italic; } .hljs-strong { - /* prettylights-syntax-markup-bold */ - color: #24292e; - font-weight: bold; + /* prettylights-syntax-markup-bold */ + color: #24292e; + font-weight: bold; } .hljs-addition { - /* prettylights-syntax-markup-inserted */ - color: #22863a; - background-color: #f0fff4; + /* prettylights-syntax-markup-inserted */ + color: #22863a; + background-color: #f0fff4; } .hljs-deletion { - /* prettylights-syntax-markup-deleted */ - color: #b31d28; - background-color: #ffeef0; + /* prettylights-syntax-markup-deleted */ + color: #b31d28; + background-color: #ffeef0; } .hljs-char.escape_, @@ -139,123 +139,123 @@ .hljs-property, .hljs-punctuation, .hljs-tag { - /* purposely ignored */ + /* purposely ignored */ } // dark mode @media (prefers-color-scheme: dark) { - .hljs { - color: #c9d1d9; - background: transparent; - } - - .hljs-doctag, - .hljs-keyword, - .hljs-meta .hljs-keyword, - .hljs-template-tag, - .hljs-template-variable, - .hljs-type, - .hljs-variable.language_ { - /* prettylights-syntax-keyword */ - color: #ff7b72; - } + .hljs { + color: #c9d1d9; + background: transparent; + } - .hljs-title, - .hljs-title.class_, - .hljs-title.class_.inherited__, - .hljs-title.function_ { - /* prettylights-syntax-entity */ - color: #d2a8ff; - } - - .hljs-attr, - .hljs-attribute, - .hljs-literal, - .hljs-meta, - .hljs-number, - .hljs-operator, - .hljs-variable, - .hljs-selector-attr, - .hljs-selector-class, - .hljs-selector-id { - /* prettylights-syntax-constant */ - color: #79c0ff; - } + .hljs-doctag, + .hljs-keyword, + .hljs-meta .hljs-keyword, + .hljs-template-tag, + .hljs-template-variable, + .hljs-type, + .hljs-variable.language_ { + /* prettylights-syntax-keyword */ + color: #ff7b72; + } - .hljs-regexp, - .hljs-string, - .hljs-meta .hljs-string { - /* prettylights-syntax-string */ - color: #a5d6ff; - } + .hljs-title, + .hljs-title.class_, + .hljs-title.class_.inherited__, + .hljs-title.function_ { + /* prettylights-syntax-entity */ + color: #d2a8ff; + } - .hljs-built_in, - .hljs-symbol { - /* prettylights-syntax-variable */ - color: #ffa657; - } + .hljs-attr, + .hljs-attribute, + .hljs-literal, + .hljs-meta, + .hljs-number, + .hljs-operator, + .hljs-variable, + .hljs-selector-attr, + .hljs-selector-class, + .hljs-selector-id { + /* prettylights-syntax-constant */ + color: #79c0ff; + } - .hljs-comment, - .hljs-code, - .hljs-formula { - /* prettylights-syntax-comment */ - color: #5c636c; - } + .hljs-regexp, + .hljs-string, + .hljs-meta .hljs-string { + /* prettylights-syntax-string */ + color: #a5d6ff; + } - .hljs-name, - .hljs-quote, - .hljs-selector-tag, - .hljs-selector-pseudo { - /* prettylights-syntax-entity-tag */ - color: #7ee787; - } + .hljs-built_in, + .hljs-symbol { + /* prettylights-syntax-variable */ + color: #ffa657; + } - .hljs-subst { - /* prettylights-syntax-storage-modifier-import */ - color: #c9d1d9; - } + .hljs-comment, + .hljs-code, + .hljs-formula { + /* prettylights-syntax-comment */ + color: #5c636c; + } - .hljs-section { - /* prettylights-syntax-markup-heading */ - color: #1f6feb; - font-weight: bold; - } + .hljs-name, + .hljs-quote, + .hljs-selector-tag, + .hljs-selector-pseudo { + /* prettylights-syntax-entity-tag */ + color: #7ee787; + } - .hljs-bullet { - /* prettylights-syntax-markup-list */ - color: #f2cc60; - } + .hljs-subst { + /* prettylights-syntax-storage-modifier-import */ + color: #c9d1d9; + } - .hljs-emphasis { - /* prettylights-syntax-markup-italic */ - color: #c9d1d9; - font-style: italic; - } + .hljs-section { + /* prettylights-syntax-markup-heading */ + color: #1f6feb; + font-weight: bold; + } - .hljs-strong { - /* prettylights-syntax-markup-bold */ - color: #c9d1d9; - font-weight: bold; - } + .hljs-bullet { + /* prettylights-syntax-markup-list */ + color: #f2cc60; + } - .hljs-addition { - /* prettylights-syntax-markup-inserted */ - color: #aff5b4; - background-color: #033a16; - } + .hljs-emphasis { + /* prettylights-syntax-markup-italic */ + color: #c9d1d9; + font-style: italic; + } - .hljs-deletion { - /* prettylights-syntax-markup-deleted */ - color: #ffdcd7; - background-color: #67060c; - } - - .hljs-char.escape_, - .hljs-link, - .hljs-params, - .hljs-property, - .hljs-punctuation, - .hljs-tag { - /* purposely ignored */ - } + .hljs-strong { + /* prettylights-syntax-markup-bold */ + color: #c9d1d9; + font-weight: bold; + } + + .hljs-addition { + /* prettylights-syntax-markup-inserted */ + color: #aff5b4; + background-color: #033a16; + } + + .hljs-deletion { + /* prettylights-syntax-markup-deleted */ + color: #ffdcd7; + background-color: #67060c; + } + + .hljs-char.escape_, + .hljs-link, + .hljs-params, + .hljs-property, + .hljs-punctuation, + .hljs-tag { + /* purposely ignored */ + } } diff --git a/autocorrect-website/src/style.scss b/autocorrect-website/src/style.scss index 3d6ea327..6f3e9ce5 100644 --- a/autocorrect-website/src/style.scss +++ b/autocorrect-website/src/style.scss @@ -3,105 +3,109 @@ @tailwind utilities; html { - overscroll-behavior: none; + overscroll-behavior: none; } body { - @apply text-sm text-center pt-12; - @apply bg-white text-black; - @apply dark:bg-black dark:text-white; + @apply text-sm text-center pt-12; + @apply bg-white text-black; + @apply dark:bg-black dark:text-white; } .navbar { - @apply bg-white shadow fixed top-0 left-0 right-0 z-50; - @apply dark:bg-gray-950 dark:border-b dark:border-gray-800; + @apply bg-white shadow fixed top-0 left-0 right-0 z-50; + @apply dark:bg-gray-950 dark:border-b dark:border-gray-800; - .navbar-brand { - @apply flex items-center flex-shrink-0 py-2; - } + .navbar-brand { + @apply flex items-center flex-shrink-0 py-2; + } - .navbar-item { - @apply inline-flex items-center px-2 md:px-4 py-2 h-8 space-x-1 text-sm rounded font-medium text-gray-900; - @apply dark:text-gray-200; + .navbar-item { + @apply inline-flex items-center px-2 md:px-4 py-2 h-8 space-x-1 text-sm rounded font-medium text-gray-900; + @apply dark:text-gray-200; - &-active { - @apply bg-gray-200; - @apply dark:bg-gray-800; + &-active { + @apply bg-gray-200; + @apply dark:bg-gray-800; + } } - } } .container { - @apply max-w-5xl w-full my-8 px-4 mx-auto text-left; + @apply max-w-5xl w-full my-8 px-4 mx-auto text-left; } .intro { - @apply text-base text-left; + @apply text-base text-left; - p { - @apply mb-4; - } + p { + @apply mb-4; + } } .editor-wraper { - @apply rounded-sm border border-gray-300 shadow; - @apply dark:border-gray-700; + @apply rounded-sm border border-gray-300 shadow; + @apply dark:border-gray-700; } select { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); - background-position: right 0.5rem center; - background-repeat: no-repeat; - background-size: 1.5em 1.5em; - padding-right: 2.5rem; - -webkit-print-color-adjust: exact; - color-adjust: exact; - appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 0.5rem center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; + padding-right: 2.5rem; + -webkit-print-color-adjust: exact; + color-adjust: exact; + appearance: none; } select { - @apply block pl-3 pr-4 py-1.5 text-base shadow-sm border border-gray-300 focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm rounded-md; - @apply dark:bg-gray-950 dark:border-gray-700 dark:focus:ring-blue-700 dark:focus:border-blue-700; + @apply block pl-3 pr-4 py-1.5 text-base shadow-sm border border-gray-300 focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm rounded-md; + @apply dark:bg-gray-950 dark:border-gray-700 dark:focus:ring-blue-700 dark:focus:border-blue-700; } button { - @apply rounded bg-white px-4 py-1.5 text-sm text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50; - @apply dark:bg-gray-950 dark:text-gray-100 dark:ring-gray-700 dark:hover:bg-gray-900 dark:active:bg-gray-950; + @apply rounded bg-white px-4 py-1.5 text-sm text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50; + @apply dark:bg-gray-950 dark:text-gray-100 dark:ring-gray-700 dark:hover:bg-gray-900 dark:active:bg-gray-950; - &.btn-primary { - @apply bg-blue-600 ring-blue-800 hover:bg-blue-500 text-white active:bg-blue-700; - @apply dark:bg-blue-950 dark:ring-blue-700 dark:hover:bg-opacity-40 dark:text-white dark:active:bg-blue-950; - } + &.btn-primary { + @apply bg-blue-600 ring-blue-800 hover:bg-blue-500 text-white active:bg-blue-700; + @apply dark:bg-blue-950 dark:ring-blue-700 dark:hover:bg-opacity-40 dark:text-white dark:active:bg-blue-950; + } } .btn { - @apply border-0 text-lg shadow bg-gray-700 text-white rounded-md leading-none py-2 px-6 lg:py-3 lg:px-12 block whitespace-nowrap; + @apply border-0 text-lg shadow bg-gray-700 text-white rounded-md leading-none py-2 px-6 lg:py-3 lg:px-12 block whitespace-nowrap; } -.btn-install { - @apply bg-blue-600 border border-blue-600 shadow-sm; - @apply dark:bg-blue-950 dark:border-blue-800; +.btn-install-vscode { + @apply bg-sky-600 border border-sky-600 shadow-sm hover:bg-sky-500; + @apply dark:bg-sky-950 dark:border-sky-700 dark:hover:bg-sky-900; } -.btn-install2 { - @apply bg-gray-800 border border-gray-800 shadow-sm; - @apply dark:bg-gray-900 dark:border-gray-700; +.btn-install-intellij { + @apply bg-gray-800 border border-gray-800 shadow-sm hover:bg-gray-700; + @apply dark:bg-gray-950 dark:border-gray-700 dark:hover:bg-gray-900; } .btn-download { - @apply bg-green-600 border border-green-600 shadow-sm; - @apply dark:bg-green-950 dark:border-green-800; + @apply bg-green-600 border border-green-600 shadow-sm hover:bg-green-500; + @apply dark:bg-green-950 dark:border-green-800 dark:hover:bg-green-900; +} +.btn-install-zed { + @apply bg-blue-800 border border-blue-800 shadow-sm hover:bg-blue-700; + @apply dark:bg-blue-950 dark:border-blue-800 dark:hover:bg-blue-900; } .btn-github { } .message { - @apply ml-3 text-green-600; - @apply dark:text-green-700; + @apply ml-3 text-green-600; + @apply dark:text-green-700; } .codeblock-wrap { - @apply space-y-2; + @apply space-y-2; } .codeblock { - @apply p-4 text-gray-800 bg-gray-100 rounded hover:select-all; - @apply dark:text-gray-200 dark:bg-gray-900; + @apply p-4 text-gray-800 bg-gray-100 rounded hover:select-all; + @apply dark:text-gray-200 dark:bg-gray-900; } diff --git a/autocorrect-website/src/tabs.scss b/autocorrect-website/src/tabs.scss new file mode 100644 index 00000000..bfc31199 --- /dev/null +++ b/autocorrect-website/src/tabs.scss @@ -0,0 +1,59 @@ +.tabs > input[type="radio"] { + position: absolute; + left: -200vw; +} + +.tabs .tab-panel { + display: none; +} + +.tabs > input:first-child:checked ~ .tab-panels > .tab-panel:first-child, +.tabs > input:nth-child(3):checked ~ .tab-panels > .tab-panel:nth-child(2), +.tabs > input:nth-child(5):checked ~ .tab-panels > .tab-panel:nth-child(3), +.tabs > input:nth-child(7):checked ~ .tab-panels > .tab-panel:nth-child(4), +.tabs > input:nth-child(9):checked ~ .tab-panels > .tab-panel:nth-child(5), +.tabs > input:nth-child(11):checked ~ .tab-panels > .tab-panel:nth-child(6) { + display: block; +} + +.tabs > label { + @apply relative inline-block py-2 px-4 border border-transparent border-b-0 cursor-pointer rounded-tl rounded-tr; + @apply ml-3 select-none; + + &:hover { + @apply bg-gray-100; + } +} + +.tabs input:focus-visible + label { + outline: 2px solid rgba(0, 102, 204, 1); + border-radius: 3px; +} + +.tabs > input:checked + label { + @apply text-blue-600 bg-transparent; +} + +.tabs > label:hover::after, +.tabs > input:focus + label::after, +.tabs > input:checked + label::after { + background: #06c; +} + +.tabs > input:checked + label { + @apply border-gray-300; + border-bottom: 1px solid #fff; + margin-bottom: -1px; +} + +.tabs .tab-panel { + @apply border-gray-300 border-t py-4 px-2 md:w-[640px] mx-auto; + + p { + @apply mb-4; + } + + pre { + @apply bg-gray-100 p-3 rounded-sm; + } +} diff --git a/autocorrect-website/src/welcome.tsx b/autocorrect-website/src/welcome.tsx index 2baf918d..6fc8bfba 100644 --- a/autocorrect-website/src/welcome.tsx +++ b/autocorrect-website/src/welcome.tsx @@ -1,53 +1,55 @@ const USE_CASES = [ { - name: 'MDN Web Docs', - url: 'https://developer.mozilla.org', - className: 'dark:invert-1', + name: "MDN Web Docs", + url: "https://developer.mozilla.org", + className: "dark:invert-1", image: - 'https://github.com/huacnlee/autocorrect/assets/5518/72fd3ebf-43e4-4cd2-b0ab-08a6700f63b2', + "https://github.com/huacnlee/autocorrect/assets/5518/72fd3ebf-43e4-4cd2-b0ab-08a6700f63b2", }, { - name: 'Apache APISIX', - url: 'https://apisix.apache.org', + name: "Apache APISIX", + url: "https://apisix.apache.org", image: - 'https://github.com/huacnlee/autocorrect/assets/5518/2b286775-e619-4d7e-9c81-37479b93b18e', + "https://github.com/huacnlee/autocorrect/assets/5518/2b286775-e619-4d7e-9c81-37479b93b18e", }, { - name: 'Longbridge', - url: 'https://open.longportapp.com', - className: 'scale-[1.2]', + name: "Longbridge", + url: "https://open.longportapp.com", + className: "scale-[1.2]", image: - 'https://github.com/huacnlee/autocorrect/assets/5518/4d43712d-30ac-4bad-95bc-9b571cd43660', + "https://github.com/huacnlee/autocorrect/assets/5518/4d43712d-30ac-4bad-95bc-9b571cd43660", }, { - name: 'JuiceFS', - url: 'https://juicefs.com', + name: "JuiceFS", + url: "https://juicefs.com", image: - 'https://github.com/huacnlee/autocorrect/assets/5518/788634f6-080f-4c0e-8e13-0da22a5d3ae7', + "https://github.com/huacnlee/autocorrect/assets/5518/788634f6-080f-4c0e-8e13-0da22a5d3ae7", }, { - name: 'Lowcode Engine', - url: 'https://lowcode-engine.cn', - className: 'scale-[0.8]', + name: "Lowcode Engine", + url: "https://lowcode-engine.cn", + className: "scale-[0.8]", image: - 'https://github.com/huacnlee/autocorrect/assets/5518/89c60e49-cda2-4e9a-a739-ef4d769c7457', + "https://github.com/huacnlee/autocorrect/assets/5518/89c60e49-cda2-4e9a-a739-ef4d769c7457", }, { - name: 'Envd', - url: 'https://envd.tensorchord.ai', - className: 'scale-[1.2]', + name: "Envd", + url: "https://envd.tensorchord.ai", + className: "scale-[1.2]", image: - 'https://github.com/huacnlee/autocorrect/assets/5518/bd055496-62aa-4d6e-accb-775c26014f15', + "https://github.com/huacnlee/autocorrect/assets/5518/bd055496-62aa-4d6e-accb-775c26014f15", }, { - name: 'MatrixOne', - url: 'https://matrixorigin.cn', - className: 'scale-[1.1]', + name: "MatrixOne", + url: "https://matrixorigin.cn", + className: "scale-[1.1]", image: - 'https://github.com/huacnlee/autocorrect/assets/5518/4959c8d2-cec4-4115-8556-faca6b32c405', + "https://github.com/huacnlee/autocorrect/assets/5518/4959c8d2-cec4-4115-8556-faca6b32c405", }, ]; +import { Tabs } from "./tabs"; + export const Welcome = () => { return (
@@ -121,28 +123,75 @@ export const Welcome = () => { -
Install Extension
-
Visual Studio Code
+
VS Code
+
VS Code Extension
+
+ +
Zed
+
Zed Extension
-
Install Plugin
-
Intellij Platform
+
Intellij Plugin
+
JetBrains Plugin
-
-
-            brew install autocorrect
-          
-
Or just install via this:
-
-            curl -sSL https://git.io/JcGER | sh
-          
+ +
+ + + + + + + +
+
+

You can install AutoCorrect via Homebrew on macOS:

+
+                brew install autocorrect
+              
+
+
+

You can install AutoCorrect via Scoop on Windows:

+
+                scoop install autocorrect
+              
+
+
+

Or you can install by this script on any Unix-like system:

+
+                curl -sSL https://git.io/JcGER | sh
+              
+
+

@@ -182,11 +231,11 @@ export const Welcome = () => {

Use cases

- {USE_CASES.map((item) => { + {USE_CASES.map((item, idx) => { return ( - + H%z60Ktw?6b1DtB7zka4kmUn>Q={!Ek-P{ z#DWrg5+kwPs7Y=#k;Ix9m8drsNFd*{rU-LibHDd~-~IjG_m7M|XYJK?TWjwb&diym zkE$;{Reh;vyA1cwu4m0U(#4TQUlsbaST@A%x5h7~y|}Y@e#pmz8}%7&-N*zw9G4Aj zDt2tVe_C6Xy%wUHf?&O4CkVAbmw`8erX{9lBzug{NK2WVPCi#)RG;MIMth8$kUA%#quPpozE;1-_{20pXd!GtEp_4e z0+cG~gpM=>P4h^elAJn8ILmv8P1#6p5eH_kY@l>*!yAGCGwX=-#F5Dvf?y8^;)jA# zr}l!a=8dj82&_LKxLZv6~HfJ;+BTW=xuh!KEip&ajM{EC=;vM@$}#ipOWr+zEmiqo#`I zI4TYMsy>?#Po5=NrJEoJfdO!y{*#RM({L%#h^5klR>FtZ9viSY-`5k zk?DyU$wHC4nm?9wq+fI=m5l$MDoJz4?s`BeVk(<^d@S~2%i30lwPh~(8 zQb#6}|J3xvw6y7h5CAz1z|=v>jdh@Q6q;NVDETa@W0KP?lQJx+qf#uR$4v5o15NE- zG(e84L8<5Sys;8NQ$P`3>o1@r9|%e#M_x@xnUXAY_7#Mt-~&M^B<`Tp&X~ju>X$Ik z4Sv}WT=G*CBQr9RGe!zRdo)CbX%jLgK_*=5sEqUl9H^qy#MB8EOtmBI-T*&6aeN9@ zcpG}^XkEz3Zmmi2V`_b!0u*@~O(PCZ@Yz^#)`xJc2|Cs?$wCTk`6Z=HAy&8sJyn>P zPHRIDiojD6%Oe2o1-=%j36$zd7$K&21?@|0!riTqRN9nsl%S26xpY(lmOiWB_3%xX?j|+&@xt$ zHvp{M9=K$*V+Ve)JH-yf){YhVky^0_^6NU- zFatl`)O6tG8@5zrjZDV8>ezEpj}4D-H1TN;-Ix0X9w>FFR*jkYtVSWW=o2DkHSio5 zd({+#AaJ(C8ODMOfKjk<3rb$H6)F*L*W{URnvEXlHu4=clWPXJF5qg&trmdu2Und( z*qe;ikgC)Nxe*q@kGg~zvmqnz>auqMII>sjda2qo(lLL2v}u?z4eQrOspCzPaX+|j zioJb+Ely0z5Kp_9jN#xgcj}0if}@I+$@m*M8lQnCgBkhs=3&N;^{{RsGjir&GNyy8 z9Mn#5)QrG$nwyM|!BJguw~Vb39i?U({t$3jgX#cQgCjqAz+!QIp4rlDY>aeAR#`=A z+&CN@b|GtRp3@Rh0!O2h$1i@-fM>QcGaG)iRhTgVtAYAljUsE@4o+z&qOr+%8=Rl4 zqrNvszL8D|!8mXf5M|^?z)>wVXiCMW4S8m3v(XC+Oqq4o#AHkZNABofLlfK01KWg& z6^(di8#D9fN85z4(Y&-xnDIzsC1WrP9RqBU>NHTsPd79fqQQmn(8j^W#VFAg zA~^AqnPS)sE`XOi1&h}lcwq;#u_o47d#FX8)7oS-fr|l$c(gJZ zSAy#pNHTm$+7ydDY&#$_7q!r zs$#$?mMkd177Wdsyk{9sf%B7_`V}RrfXPd>bt`4mwloLgxK_L@$Sm$@#e;&g#QUzi zFxYJD-C7WW;m|;yrj6iyHO_DaTsRMP4>r2vf=p=+VG@(u@UjrIVH1QA{CIG%@g_g`s9~N?TqQYBuh~HCZ3%FhHcIT{~?msG^v5ywGemz6&AcEJp2a5^uEQ zL1AX&A~z+PSk#!)M0Z{oW)^R_^D^i>k?(3=HZh4w?RjRn*?0g#3O_m#U^14gCd!`R z>!ImrUMGU<1WQa_LzD3UIEn`rC{|24I4^M6AU-J%((cg4=;ns2!wT%+zG1s z9Jmmfi*PWBHh#RYi`mcvqw?g(+XRbK{diDUv++9!UUl5yhP_x$GD8ANU3huJU~x-F z9@NcjyaxeIs4~K~2#r!X#W>xcm%-$H2r0%k^1AuepJzszjjc?|2$hAA0FL}*6XSMp zR3{diOMoqyu3+l&(}4lDn7&u_8|Q<=M8S?idjwppTn94VU>k_}q;(<21@gikX5(xU zKwVv49;d(|eCRfvyGp>R)#7yHhM6ZF&JEZ(2Z4)_Ia;%8zzvjZIgNCG9K9yIgJ7_<1RnHR>G4R^2>yYk~P!G?BdHBv66 zq0~bz9YsmeR=ko$Vx|?lB`7J{t0*ZR&YcAzTK2V|q{u!*skba+ND)OFgOXCqN|Y44 zVw9BnS|WgoECnUS<0wjs2W4z8xxQW~DRwJRQtWPOGSMxPXZACTgClt%$f8JI2685n z2lY3LVt1a|-)t~r;?2CgTd+8@J1^^xodE*M9;A|!$@mhSvV+q~2*lMdr5SRdwaG98 zTnsO_4>lH|q@>m94kkk>xF9)^e0%c3fo5Y8mK&{2geB5s$O9M4XT2G0c!83M&l((J zgHvlfpEW4hV0~4(hEkj?bBjg>p%h}H7J?1mpwwShdSIRORa{YumP;2=lC{Pbz0m?% z#@^D_WQ+$#+c!@4SnDf#^USx*;@^Ao!ne#uU!)`LlJd?gT4H(75VN=|mS+y>la1Yx z&J#in0C_JTRcSRykd*=hkb&~??@;m&2Z$n5}- z=~Dq}Fb$xFCaN@Dr5T`f5GDO2f%hEKAe&sKs-kJ2bPy$ZCP1b$06MBtlFyW-3MKn2 zm9I+4P6@q2iMOhDpnTmhqpY3}8R-_NbRj4mL`lAg7##l{O7@FoYds}-t|})=eSVj^ zRSkvZs-h|-gB7a$-=VhfS+DvLrG_`CJW=BFR6dWUhZ@?X3W$=yW|jYcp^f2N0MJtU z2%rI;0I1%RDm?{C$0>evY)v^2K2`(*QL_9*<%v=c&#L_ED5cH>Yj%W8sS2H6_}P;Htopa*(L87kGGri z&XRL%cAw<3&edCPoZl~a^0(o$Yp>6_lhNo|a`ZlZu=e&q^DJ zHolfWJttCmuKZanfBL7BWQqKFPyRG#kYttoSt5USn?#a4`SZE_88ewA@5`SRlkKxh z4gMF4mqdlx51QR+{EO=gYRr2U^CExY+N|7(_lKsecU|oul}(KEOY@sn_d?vo(`{zv z9%?rD%P`-whd%!Pv2Y@?%IF(uLkG2)5VGd0UqU{zqIVh?(bVV#dW#WIQGu+5vyj;iu$R|xoShN92vW0+?D*jjPIGEn_T;< z)vuo#)a&`<7VUaEe>vQ}{PwDPKQ)`$?)Iu?pSO1wV}fFi*PPjNu3_+~`L*^ee3;NL zCScukX?^6%Ir%%<-)y`(JNI426QU*vZfBR;=4} zeoMrq=3BmrFbgMoge+TrsVt#?X3MjMzYcJ9*c{X__e4@|^Xl1$LvB==U)-#Cb=btL z`h9faZ$l41G6Y?C*4@HGuKN^Pul2vsdx|*E-?hLnH7qmg=kL9oq=Ub_S9B$2k?&XU z36lq{D~TNQ`K4cm-!8`d7SFWj(X(_tZ^zfnqMk3AWzWm?DtF!^i&W+;d;UR|&dYzTB8YstTya=jgmT@}sh9PmVo* zbGA-p;+EOul`z|$U(~Atx#QcUs`IuzpY^uRE0`C_suNIoyrWZv^6Br8SL!?V{Dxi? z#@o#ymCGD^o;ye96~V8`s!LFX&ef?p^96IsD{C%tMz8A11Lu*-bDlllFi+r_4Xn)&3lWIp1hSM}mO7Ldxk0P$L&^NQxBvZ@5Cp$m1Y-h9VG^2%F?crDVY z;&}WbQpGGny!5KR+_;!j6;O>|tn=#6kIJe&ixIC}ooXPr@tpS!dDQ#aLr*3|ag%*|oVuavIc8@ewx z_(G>!Uk&Q{{b{})zGOng&sO#ssw@TgG zM7#EW5Hsk@XYVu^8C?Eptuuq~`kh;lGrO&&P5J0E=N^9Pb+33!$mHF;fv>Y`pXk~^*;Rn{_$W{u7( znHR|_&*ezswK~;kK7B2D6+?AHud?uV>qxbPBZ=4PyvFfsvdX*yNxWXC8qXK3C$AEy z9_dvRc;E(7<*h^#Z_s&7to=%m)*W{5`1ytpF)nwjdBdPXCNaBq;uc^FL zRwb-P5^vI}rt=+}$g9p8B=KgQY6g$r9Hs5mbkR4H@2?cl8GjZxZXxH?wFui5opUxn zDyv-9A#7W9svK_FN?w99|@=JU1Y0+jOdVeEK%>Du(KY zUbTR?d!JNG@({N7bzY0q>k{)ugl)S{mCF}wC$AEy9_dx@^1ysjis+l4{Qugl(tJOX8)nDq$dcQHhuqQ&x2ugsh z+;K0dvbG~$dv#vhc#*8~%(v$qm+Dm8dCpSuDu(K=UbTZa-$$w?JM8(&Wje22{N^%J znRnXruFG|*5BRd>q$+{xnO?P*M{rW*?Xu@{_UXL#^UHEuF}u;j{W{eFp0l64DxkWn zR~_QsAChX%2k7C4I|R5A}^Qy_S|q-r#j8!4wLEs?T`h5%MaA>QlX{h}S<#swD^Q`Q)QIuk-x0tTG?6=dOi1)kQwBki1Hu`bw|* z8*ly*sqzjZULWbaF7wN>Dy9JOI;K-y%9KXZ_28K zqlniDo$4B2c7nX>6e3=F)wew2B&kk7we6(N>jr-!t5QEgyiVy<-}B9<$jjvz;&oc5 zy2;~CtNW~AYsEf$i|^0`wgL%mb9P3xu#p9Kc)TVMY{Ox3m+!9>G=tzCH-7x8Qt-l$ zJh4(x4}zcg(N_YI1owIUPc#>LYF7A}TQq@H7ChjmHG%wirtpwEeyVeM#3yP3TiK9waXWeoK=mf33b0cuJ@e-+uq54!)DM@GK_5Y^UtAx^yTPg(< zmYV!@rGPT17I*wYbx|_8HlL^o1Y5GG!;AESy1e;i)kTSQJwClsV1-M4e)%$WG3Fxn zfh)S+zrk~^kg5WzyLwe4?tPV1doE!gxT^EA=QppaO)7KjzyrS|+nh#j{D*H12M&Gd zUV}F)j>RK`Hp`1`ZPz&|k5d<1wqq|vlJZ(NZJkH7Ql6Hk?~GFu)8rfXd5~e8R$Oez z?&8AMeD2LGTT5G|3doZVq}>|BQ2#+{jNiCj!}dO&+rXDgxcC@*;;#?yIY`A&4K#G?HOt8vp zhm86F=OeFi4ic06dC&Vn|Fy5LX?-`7+8$zFQkz4}TmC5c!H&5*V$8*|LSYXyE8fcN zrZvXG#9`|oHEP8|vn&2k4wBLBR?_Yv28YH|zw5{n+}%=b=nEzXRYtdE$&Zq>i7GRw zGP(`tuF9&bGP(!trO2{{8mf@)aMK@Nbl9pg+MY(LGP<`*MI(@`%Is7bVkRU5@+whf z^z9+yEFZMwX%KV|5YZH<19c#)Mt5LqgQ*XO8Y7DT@@VN{9jc@O1ms*7K+t3v-76+L zT4P}V9dw_VW(ALB(*s3vV-Bia1Mm?5**ii;^}PXfa#V$Ma~S`H0P?_*?=0c8ZZo7?fUUqb;C)~_kPqwtb^^PA-M|L`1#vI157-ZU2pj+o0*8RZlA$fz z>q=ig(vQRz0Cc;Q?#=cA`U1THx+U9RI_<`qW+$LH3>XejRFVLS#3*1iFb1#y^xbV& zpc_EnXrD!Ep8@B9Pkn3Z@MB4R{2U z0KWi_fhWLI;3wcd@G~$GSO5$HdIQsesQ^6?LO1(=NBJf2EARkF2jYRw06j+a40sL< z2D+eqp$J$7WC6)QEZ`4JMrE|9>4|}H;Av6QA`S$C09vRORrnB;!+{8(6F|IXOXY8z zQ4t+26>1kU*;hK!o;gq_b41>ET(LB1KI+urCAGB5&21V#ed zPLP7~1b|j2c*0ofFW|_oWlcs?{ylICAlnzfbKsfe?ZcX6m!S9v zcnCZIeg^IXKLI}i_kg>=9pE-_3!vsH&3*u?Hcw4b>S;|At=jx=&}s9cW<<6wC91Q^ zj4+@~lh+-nni16SIp8cnr#3AkD!{J?{s6S#&^AaLI$a*pDUf`rQv*Pionc7j)krLRVb0Y14U>&Zl&#M(0zyjH?OIWglG*Qf0IV>6(cyH0aXSOWm0LdP%9ithKb- zmrV<4%MyG%z5P8q3W-w^(Fjh%)yCE;u=~edXgYd&dwOHr7&#$56`E@=-c2gpbmxi4 z5&}E}Jbk1nKjvKx?vmAyWuxFF)r)7&l1oR{p;`dA*pBRqkM>LS{L`Dh9ylOyFuc7z zy{KO8H|y5OX3p0S8K*+i5gIQk)t@;rzwHbB8LI|~R4)v*=9^fgJ!1=Y(tp4(N}5vN=+#wg!!;! zX+j8dbk<%oFd*)HOk%x*pP_0KrVX8ZSxb5^ghe&cUO3QUyZO|;IU{DN699`XQq552 zD88s8wGM^hS#-pRzT|)Zj~|~LdF-vuhYvPwDL0hmu$59`Jad%VnpsQ}^-TcQMM*36 zAG==kJ&X|mj7XR*Ei*Gmwp`j}X1;8L^u3uyGkeJ+j5#*Z-b-LJ$fw`M>N`JGo4^$9 zl@i04ue0`I0=o@2ufJ2{wy#{RoCOaWN&CWB6ib)NQBz0l%>?smw9AX$`r&pM!pt)e z<8G`>X>il-37N}#_L4O|)U!{dUg79csFWR!VZ7IwIf-)|rBj`mgV@ALy55=jh^?HY zI$gkfI7w~0uu)>DleCoh@0_HaU7%moL@EaFuf0~F{FC-WTO5dMDmNnMhW28C{aM4m z`nhD@Ie7$f7L0b0+IK}A`(32rUD-ir?N{M>b3f{wUtZ^Zk!4ZFqoZA$OJ3bz*|)ir z)D69eZy{aihF*ZLh-VH`MK|W>to?M@sgY~_oR)nr*kT4KKYje4wvu8ZVJ^B#ViLNDoY^_UeS-!*e`tKTe}I{5`#~h6L^92xSc(HfeCULAb~e zY+qVhom)!_)jCd~4rlE(3*z4=TBQgdcho_7foxyZT6zl0*gv<>Ud`}R{=&Lne_cII zWDVNLe;Hc;+{dT2G^rBFO9Nj}LPsuLv zp__#J0}kQ~H>pk>vaRP}EEMK0Rgkc*yJQ`VdDebW-@EkVL&t1Jtd&P0r+IsKDJmM4 z1Kp%kv2f3dMzU(}dRW(};Af{f$Hu|j3#o@e?{$|hMI#B0xJzOT22$iM#l|2RwAWH> zdp<3xZ=JKX;eq~AkF^(7^jYxr9+yEq?JAqjZ!hJ=Ft=7u+RK0BTmQTc4^QbKwHDwh z1@%Vj5uQ?NZ*U&xE;u^K-#}Og#(fz*^l8z}DxK;e zrFOy^(_UI}v*O~Owtlr&s}{)A6mRJmnsC-$cQO6Rp>MtoJC+3tnhNY(zj#ZJ$wGS( zMrr-zaTR_S*T{AFd3yT^?!J=qTbSEGU&)NQ6+8P%v2U>^QbsKEcGg~dvBmf6n2p;? zO={C}Vo@lfw1_%uFTimBYHRxCaUTw;w7l&mb&A7|v(_Z-jKjQm21v!o0kKnn^fHdE z{TFQ*L!>=@@Yk01Zi>w(c7GA^ee&{p%q2wm%1?U}%F-XdDRx}?$%=Z+9hx_B#?juD zGQ%Ob%rdXvs7j6YW{Zi@QL871FQgL&Wr06l$AAr~Hl2fCwR4Tyv4=?evahX;rCy}5 zY+5~bFjN}Sm(3R|LZy3snN_qiOJn*mH@j|TC7%7vQokpAQZpb-a_NtR)?R6m*Tk#v>iv;} zD=oB_UU+p{JFK93U9nQLJWNV~ue0`=j59(>Wb6B4c%{X$FliIjuDw{}+qXw`^ImoR zbfv{D^z04vY|DO)LzZ>f|ZTP&>VtBZe1`GdmSWx@(ZFY|tRzGN3rNtc8mj^#= zIW~9g{7TK5aOnj3?outzJ-0TU`CflsX>n4m)waIb{Rmrep;B`tT&gutiSd$wNMSYR zQl~+z!9NGQ;p+k}EgZy}{WsRiYqwsy@WHMd-Q+elXu6vEAKG!n*KZX*&e|(c)~)&6 zY2x@JHRTm0Uv*&Z=e@;7{d<>oj$%nqY5ow}DtbxBh9D!fSDh4hjGI2xX+sDaz#_pF zzR;zY^cWWY+RIUP1g=c$hp_lg>Y1ZHWx=m5&CoQk?{Bku77Twh7F~&e{vt^f*pMNreZo zH{;vcHd1~9i*1nu7dxbcRN>nxWnZrb|9n=@ag&^eF_#uW?#iDR-}ayJ-oRbW9J_+A z1-~5o{&oIn=vN%)E)5>W%;NJ%X)Wv{|L^tc+kG6R^zerb3dL7t0p@1-Gs+idK>OkB zjG-gNqo8;=J8D1~;gi;nV!fH4-k!!J>9Pe5SF%`Oqk`+xSv4k^SFjodcQRQ4D;U0lHE3qnEKli= zSDrNUAZz7}ZyMy+-IPXYufLh5T6~j7bK8mA1h<#(quAMQR9u^FlwGB{hnSPy7*%N9 KDD6DN?)@Kr$_t_Z delta 22895 zcmeHv2UJwoyYD#zC}TmzGE`|Q2!af4Ky&~*iYO`;RCH*HA|fD)1;$;AjU{Sg)I_|$?-b$WpL^fC_pSBTTkHML@;Bf9+AiPz_C9CE!=C$P zmAOx=%=K%^mwmrzUQ1`;-IE_}@@knKm$X>fb8X{;w|uz<*FQbcb0)W!=jigB*V{!? zz0s~QUc7BihAC$VWW`Wb=QwkN>TEOLu+Xvw$JGIwHEghN@`%hd0lW?PwDimr-%(kd zcTLIMMW$K486%QSxv8M(!_#v)7Z_7@Gf=IT>hT?J%0e^OAg=|!DLzQwx*EsT6ZNTi zshPRl8^~eLI%w?qh0LVs9sQN9RKumZ90y}_Qno2MHHYJ(;YR!%Q0mz|P-^J}?5O7S z9N)niBa*nq^(DLAjJMDgIyc}r7?{gIF(k9MPU_EE2y25+NzWGDUPDf`rKJxZm5t^` z*h&3N#o%&Nv-49@GboZ=cKYyaQyRyKO@Y5*FV!<5GdY#?qq9v}S@|4y0dmw=Xg=>C zHR$gsb;});x}TmoBsDudHzz$aEhByKklbT%pke$ya7hR#V*W9J-C#%l?PU8FGNleB z<#SxGhEhE#sY#;-b1comwy?8{)W<-1$}L$=%Qn)n6YJF}E9LeCKj&rk$Srblv>G7H6`aFvfY|VGx!jcPZ>N-_8)G_9+sNIaU;PaCCtbCq~=n=*8txglrke66q9d$>Mf48(3~?WIop(z z%FWTsshXaRM9<-dk3}zVWd=xL$sLlKnVy!<^^$oLD9uy>{HP;JipZ&89tAmdJQ0){ zycfiAm^||-P$Y#pI+)~zoOu@n)MMn~h>W~cZg~jDA;e||N-JP0D5bynm z*ee651HO>v=6!Ri!l$5Q;E6e+2JT{xD8$JTQiQxBr3P)Gr-*4l$v!VVS6q!bCJYn4S7 z5CEDwIaxoZNTrk*F*=juro~8sQcW!aq0Fo@L&|1*8ug-ObH`XIQ2n}c95yaEee#hZ(&IE9w<4U1*L)S1*LwkkmU^yw`uN)i<5_+||M6eZCg!YF#@1(t2i_s(03` zZdLD-TleG7pIqnoX;8WI{w|K8oz6ZBSn4pQ=-WYs&Y2&sUHtJ-*5aby@05Dg=%%rD z(cDjrd-g1=^t6qgC2z^x^oCNqy4F-IaW!aHRN*)y`fS16A`NV@t|PBu_Z(qjXKBF) zuKU}lz+nxWHO!epZi zPDbrO1dU8AMfY{!kh*Zc*Cx~&ObD1N%+$c34aPd5PKoXCIc$k@gmxEXpJOHj*B#kFbx8f{BXd&piomsm zP8z{kaO5ZIG_`G6g1b@M5v#2egi=W7gTpRsuE|X92JK~VG%V3wqp8ahJdAt@TjCL+ z9g4+BeYFtBe-oV4j;X#uTOauyBEvqZej&Um6~6J!>z%L{ei2F>Gxrm zZLPI6u)O^sMLN|rXcNIz40=8|f9Q~R&^-XxQLGK^TKPFZ$G#5^*CwJwKIk+8H6I-H z$AXy}8#K2aSaD0Ewgql{G<;6%avnH}p5$;491TaqN}3q7FJ%rogw5MYm95}DPNcRN z97P8WVHMp4hdopdgS)fjhdPn1gTPUH2pH;ITUl4Mh=W8o7+fhjR!2s zq3UAwCUCUO#Qf5%Y{(p%8nss-Y$gdC8?^7i#ezdVdl5t$j+pWcZ)N86(y0s0p21ApBdqQBSC72+wrGqGu zzm&*Nz_k?p(UL~*%@Tr)np|&I98{p$;lmt)joSK1mvETaig}p|E>Ph#i<_}qFnIx? z)D$I$k1tCIFcT`QrUcb3Tj}w>D~N2(%?2ZIHIHEto?aqqYD- z8k%&g+K(dni6&Ye$wA@5zGWY34W=EKT4Fw~2luf7?R{_*J5+)w+d|PztOS{7l>|MD%(B8OJehL6bu*AbjlE!`@o$U5v(v^>D!iJEpTES*>2dW*H( zL*{idGKUUE?JU$Qw~Vdz7PyXLKagEockHX=j=9IIt&U(09gS8$LD+_F8&;7>VFz81{6X}HFwHFM}>)Wo)C37w2q zM$A|{HlS0u)nt@9h^4bAMT@1nh@zzJgOVgGK}oWE_)+VN%#pNtD0LBikAIZa=)iGZ zMOi9G7C{k+^P?BV)P?9|AMk^i(D0LR=TZfWl_Y5V;E*v>6$~03t zF^6tO&F)St0pzDntQf?pGrI-SzcX`)Gg>X~Orc!fI$U$3Gb@fWYHQ;5f?-ia?G4)Q z;H2FX`LAW*D914W*d?xmlTwss+@p(2EiO962l7ca`Dqtrw4 zMX3u)EiJK|iAwEwl(159kGO}2gi>%=0CdN|Du33UIrKJa^gUQYZ=-g04`nwZ-SHmm z7IaoUnM0rMh1d}(5L{IN{^C`cT0nvn=6C>kDqjB`O8y8fM-<@~>p}jA6#0Q(<3d4v z(!f-U*FRB9Xb@e|5wR67qSP@2R=kL6m~WB`Ynx=pdM4S`A#J>*6e-V!C%F`AAW4v= zM9He3O#91p04QCRDcL0g{I#e`Fl?6n}F-_+GD{2Ls zVY1ynQPO7t)L=HivkA#A=~R0jalmMRE}~?W50HE;Ko?Pxj|WIT0idfgC3%4;l_=Sp ziDxxabcLjy2~+{*0CW*0`CMXf5hZ>eK;8_X>z^p;7m8YmlHVeLohElMlVo_`no15YFSLY5Pyh7ZX+QQ{BFJW&n1&|fD8_NXlV z@6ZPD`39gBd>f$QlmXPr9hu$*rRy$0@_PUc?+1V`P-)ftDDfOoGI${K|3qmu`~px1 zc+^UJoHf<{H%c9<4mqi65M{#?b!>d1HD84d7_2KKy$*6}&z_9_6H0bYvc57Uk+Uo( zO7*zNd}T^<`URQlX(a1G#lTk`S?4JuQrz+09RrHK21lBl^X|F0;S_{(+`RBB(P zpoRiu!+)aGaEPoYO7@{LUzw693?J1&+k(=_JIHoKso0Tr6q>?BS@D0H7XF_!NF$>S zm`0W%(-HDODpMNZR9R2|lSC#nC0fYMA`TZ(3T=_h{}ZL8XV6o~7lPIREs^d2XB3YE z|CJ-vy&4}h!gX>(A1SM2^7!{N#=oC2#C-nuGlm$3Rahu=tpfi2j6sq3_cO-7pD`#8 z{{4*cKYGad|NR-`W_o{m%Hg^4TIF~E;n|h5UD@2B@qH@^>FGqdEPw0h{r*ne^NIRx zL*1MoFIe~_x#oWR#s$e1@tg0iVw*1f>h`XE?d|U`^xwbLame_UeY`%+xck>V&o2iJ z&+NLOO2c0`W*pX==h!0g^O^YBK7%AH#Lw5_XY6p2tQSAa#m`=uB-t*0RvAI%MDcU4 z_-T_xk~H!2aF(v{$<~Ae9ioYZU7BoJgyAY7sjmzj)bd!?>y)nR-g+D>e{6g8 z_p-WIfB!SaZ^+qM3;%l0o%FhMEaUXfBEX@ zsVPneZ{|<%9dTgxc$e|E`^KC+-ESCknRTh%D94MDch8%11Kn>{3Swgxofm^9p5^J- zw!Fy70r0FGfIkj>zump>5xZ$&HnAZ`O`!vi?+ZL1dTvnl0V&lM`m{{0J85&?miL2> z`)@ut-N!KDerdbDKbkrWSX3kM=Gf`mpWj3ljn>7?9XE~zJnVcuD)skfGd4c|A%Dvs zy^G&=39IYA*7nw>XRrFX*cbP@=WW>YVobZi4yC?>?&=+Oo>=I0=;8Jg=BGLIV4=)@ zQ?_X|bv$;Aj@29!S$VDau)bqRRSwl5waS-i^GUTmU&n^$tGt@C1EMN%td2R4RjKqW zeJpv|jMK3TYE>Y!A4jUgP)!)8@(N~WL{;W^9rGQpQW;qOc=BpELC3yVtHM~*38cCR z)$9o>uW)u#R23BHSgQh+sui1AKwf@@I`&kpieO=dq$-1Id7;WHiaiolMP?oAVpgfz zuq9^lGEUU7_i9x;7Cn(v&!E~iQRUTvy%kj}Ch6FKNh(z|+cb&1Vkcw1CaYAPS>MT| zDu?QjTGfSVr;uv<6wKEYl~-4GKvX48#e7Xwsp44rRPwT!hWS#fdNBKGq&f`MglQ_T zcy>lqWlqO@O;@RUv;67g)o=#pOReh5n$95A#TmMotR zVdDIp#UnxwdK@nCnEKb1`X2L|#ojUp7)?tLjB2`}naAeQvD>(xUM1eM$u|C3DZTr# zn_{&EGj)ZX%b%V5j)Yae`5 zdUxgJkSEz^>u+yRa`)Pi(5Bx%c-Hvt<4V;IsJx~R?BJ(v9vIQOXQNd|E)2|e%DPd$ z^I@&JZ_@1l&_uTQQ19Kuq907zNe<~xCJqk!w%5aZsq^Z-?dUXo@!V&}M<;BsE=Io1 z(iJvdqSY_q?Bcpcq>c2;3{r3FZvZ9^3TK9jS zbZgy7ZNF+uKgoAKG5P!I+n8&m?hUNmy=6Uf&mZi0(_Gxa$;*1_xksIkxg@na9pCYY z<++{HUtg;}eZjd#7JW<(U2YovdTDn*>a*|mySzUGYYl4OepTmpjjH{QoS&s*R%=vK zX<~6}XugU*(Xl;iR2yD$<<>n9jxDQ~q-hx(r1w7_|M@2cmSa*AhkcdyMc(VBS3Wrx z*Q(#_m*YGyJ+joKn7R!6>B`9aZTI_+y|}sDyt$($y>otP)3Y%V`bxnbR(ZI0i@qM+ zW$1wsSJqE=3Enz2H$LUY+U={IEuR$MZo7Q!vI)TrZKt-mWbF{LqxPWmm6)xAHD zJ6U4ma4Ix%Ro`Vp#=dg;DJ&(d)H~RxevfT)l7nwLy!WU(r{y#*ZdB4Qt|tcD_SNgE zIOJOYRr?yYkU6@-`em+MgYq*+&5Jktz4*apx6h_d-ftH=4K18Dx%`jZtX7+ICZ7Ac zbdC0x=>bRTtTAuYZCIWlLS z-@BkTfBCe0zO+`}$Z-xAj<~P*uKLC|OC4JN(Yw%GGk4wSZIk^DRH@=NY{aFjNei4W z)W<{9TwP(i&+^N|re=NJIx9GT%{OeB?U}#E1@;|K>v`UHZ+gF3-u#y)5sTCPW;l8k zHE%b>YHGO z3EOw?Jo4!BOsCmVmJycw>=I6&s}#K)HghJW^x=89U(Hl4gi$PP7O67l<9;PS_p47-s(iNO6Y{zU)qAyS9E<)mrt(~KN^$aTKr7G11mcEp{R;l0=0;4`DwWqh_DEDU+=R(0QK=5FB_-r_5vuoU)#ogFHK__VW3pDOybdv5 zyyy9C(XmnMRjMQGsCZ*5gR1ccmFg%Pxq&Jy+NxvM)vDvnZ6m3S+jMN|MwQn|c12V@ zgDQBFO7#_+xQV=0Y}c`$)T%Q~znN6AJ9KQ}W|h}Dc2885L)C7JN_BzF+d^L3ck0;h zYSkqcwUtzfyL4>bR+ZNk_Ci$Ie5PaZ+f=HrS;;o?It-Q7c9rTni`!1B%u+nGs8!!E zeg~-)J$TwstG;J-c9F_&FXn5P%Igk0Dyqt$ zYW$f>b&rkwOts10XJ^!cADCOI%Hl_suNM5ouBZhMSkv7qm!H{0wcsJUsTMq9`aLR_ z$84rr@C&=A7Cd2LdsQw^**vx28GED_JZDk+WEalbjE(VEwnPzFb0m1dUMK=fQSg#Q z@Bio$35!>(q(a~d!Efwsg#bMFJBvH;(WN#7ui2)L0u2fNVEjSFg5JaD-mt!kz$^;h zvR#Tmd?TNG$F!fTT>fMxMPMzu{KXC^0!vZwp4It6cF~A}a+a1o*wm;ZSEu!dcU;gXdYcBC!xxKUW}%>A(J1s_N(c{Wy&;6MK$ zvEtd)!<~_z&yHh_ABmLOkRE!f@@&!((ycgwMXuIqc^2@cT(@Lhjc2pelIlFWua?x{ zS&O48ubMoYf3$Pu#|azu=%^eXsp48J>X=GUn=Mfb>aZ8bXpPyN#x8JNwUFwvlH;U0 z43*Uhm8w3AJ3*?i`NjZ_QV*%`IKgSnkixin(= zYC&UmMJ;H;@a2YHbuV3Y*1sxSb=Iny{D*x>>6z^AZM)KLfBw$nJ$TD%%3sNuTuc3~ zR@L zZ)aJJ#rvYwSlspA)s(-#IvmEf-@IkDswG|lDAiwWF1E|Qylt&ZCH)N{ zHL3jRQk&M2_2+-H4yatMdszz&noTU5^|AIHeCe{gOC2!2!Io^Ii2pNrnR)ZO! zQM$?Ybx@uv%iLv|E%<2wT^_QmE{%UM1XK~t3;xmHREcjWf^dx?pvLI;Y$THy4Nu4@ z^z;TrGn8rM^zsY-(cfipzOu|mmeF)HMVX>O_V_1Ghbsy-DgNX@LIW!g4!)N4y?I%5{3XWDT$upjTTmfZ;$UFchHoXtIE8AP1ne zFbc>6MgwDjd|)gvPAGBUUBp*<27xsJG#3xh%+J6>;75SoPx}s__tw4zz65pydw_kw zL0}uO9oP!20!o0@z#3pJunt%cYyegQ6M@OV6w2~xC=>uR-)X=QfHu@5AQ>og@ zGzZ9oBP}6XGW34gCjh;;))1HqOarC^JfHzA0879Mr~*_4Is(x^C!jMB19Smmfv)s+ zTsI&N=nnJ%dIIr4FJYuTW{8sf4*HP|(62S6zz$$1um#u*Yy=hq6Mz&T5$FT-1-b&= zfLI_37!8a8XeG}8Xj7~YGyrM>HUMqBwE=9lh2ri?+dXaX)qos0Zvqm4IA9!*571a< z0yv_I&}RAw^f9m(SOJ)UslZ^$i=ilV2SS0lFs99l z_9oiAW&y4ME$0Z}SJ=D)Xdj||ryTeI(B85Tm;nq2B7jIB9B2v97C^f>?bMYqoJL3j z+HuK%oEHHC@F}2FU_`k!&<1D=5MNn$nR<;YC6KlXck$J0S|lXZ040D0unJfS%myeD z%YkJ84PXgCk)sIC1?B)nz;uA3g#{%}?Bⅇ z0E#dzpg_O}XbN}&jfDx${K~>6D0%_jfG^MtXb$)R{(v3`0F?DdZ7FMz0!)FXxR8v} zlh!M(Tgn2;j@|&pn^Kiz(Lg7Fx`Q=dNPih8E_x-WdxEFT=mC&(JkSfEyr)L`0V9Dd zfP6*(nE+)}BG3pJ2&4l;fWd&W=?p?S2}l9bfK*CFlPnwtN|}%WWCMR64OL8ePaDW2 zU?N}!P=&bLjR&PQGX@w7i~}YBlYwc#Cjh1DEMO*J56mWKO1Z@Vg@wXIsYoNE++F}M zfWjpJB%|_Dz=Owa5}=h%>GlAiMNK;tEmB(8v|~Mn{1NaIunX7;>;Sd`h1>A41y~2H z1=awYflYuSTaWTanWypwfGF9K4OO&VrayxI0Ne-e0iOYPfjhu_pbYpPpgj4Gf=460 z4SWqm12n>0z$M@Ua09poTmjAlXMhtxDR2Zh415864(tW?0K0($z(HUiuwUlWL6w|1 zgtCbyZx9M8z;WOx@Fj3eE`J4j3OEUz2F?Lz0qO*G?lM3fy$H|%t^)LcO}gs<(VM_G z0Ck%9Zvh&#SQpLz&%gsf3HL*p{{{3pKu*s92FQ=^AD&byD>4f2Q-C@{wsgm$I~U!- z=uXB1v^RYKDF@yIb^gM~pTIldE$~K|>Bf5&QXc)iO=^d7OKFd2VNq6FhEs=5PI zo^rY?Vamn9(~X1z_V*d5b}{3H;*`_vN}2K+D3`*4ZfDAjD7Q6R$mlx+Ia8;4!|v~U z4&4fAG0?tGHy0OxZuxZUr@I_I;yVCzKd|E)Nw++zj8<6_fNmCzfW?9Mz?G0FRP*4Q zSfD60_u%teTJwnke)<4Ef6kO=5=}BJhSu0u?bT1v1o;K}1tQ^+M`UM0ck_=qDF;{m z_(H=chWZ)&^umuGyxv0Z=P%eb;tMVO{q&1Mc_(3SBfhysAk+^V@mFJ%!)lbH5#Su+ zr}xuiACr%>*?4r-jo!V&5}-j9sE$((zA<-jb-J}jI~tlGKj?%fjd=%NzoBXqp67!E zYfnB^Zy*IdL5bfV%q2q&d%k)*_5)l3p~1~SIb=vVsX>_H$-D8v!b3g!dd!pe^S z%Lh}FCcqLkk>xdEL^IxA)3lZ_iwxzniOd`Cy!!dY{$KSl42EF$cFI`4W5zrn*vIWwozn==_!&)4*XCAL~hp*P+_{~%au ze1y3{yj_TLoY02Nw-ye_YhFieJ%lVheWc@UHh1wn^5N6kC!h)P!%W~Q+D9mZuak1D zl*7suZGBG1nPCy^haAA(>m%3(BYet%R3A#-O-r)95(^9L++;D$M;JsF%F$Qj?84ur zPw$xq3yg_oX{C>_Js5l08z13(2&lH1aQ~k?YV*cc`VhZRtjK19KUwx~CUgqH7-il` zIY#T@##yy)+^CYJ;lFJr?OKY5)JBZvn4jQafalZZLaYJNQ4VKXb>(2z6`RZ=F$VsA zA(%0Yp$4|_%(r20x(w~^C~86|I?n#WGWh<>9MtB6;8PbqbNq$N2F&Y9ESpe1K-ydF zksrfC`7VyixkY1~(l6hek@yld%lrQ&;ZS=dkdzj7PRbEfv$BUC8qn#{DHzK4q(lBf zjSd*bSN=j|2L$B0zmOG%E-6POb$xq$&li?S#qw~Ft1tb9BCa}O=N|7V7#K6MqVE5EkJ}X_jBklC zD@TsKt&=*eJm|s_(KiTdn7bDw?1V*#bQl?D9u%Ei-F;^KEm+7&`k(m*aZ^Kta`|X-@1kfnma`c2I8e7o3cIn&!6_ z!W1JGf^x9fx|ypyykl1z(F=JyT^24}HS)zuwL_H?!M^TtJBAzhL#aF>L|QpBtmN?4 z%Taey=hx=PL`a8YDJRR#{rTH6`?)6;)aIu`(iuJrQs<@ zwfS6MlYM2_XZIcq5Z?*$1Hhd9JUC5uDG>O7KI5^4iK|@ z_fFsaY)EQ_#R>S58 zS4wI-pYVFrwL&w#jqn%sOgV2YW6DMrH4>yw~TfP!^6Y>6FcTV z?+5{!X)!_~?GRY+V>~}5NQ$N%BUai+ z+i(7`$!S;XTCkwK7`yp`SYc;0CRsU|?nQL$fXy``CR_4&jKtRG&naiuZ3E3jvu$S_ZCfouP6Ls-6AL<2_>A=?p ze==-fkBGb$-{jJ{l(@e9v);Pw1#^Y2F}zzsx6YE&l+fVw{1}_^TvK|+Xq-FSq2JXe z&wO@y{=F0bt4`Vtl17@eTR0oT|7<0GrQWx<3xB{0W%@Rf+k@{af3f68@UFtc9()|W zlA05Fk9`Ar@;xntO#^uwK2Veh9}4-Z!v5a;65b$OnZh>`^7`;~Vg8~&%(wO7N7oRm z)eB8idBGCtrWZ;Qc()LI4R7w-9G|}8w{O4P!D9#0VYX?bGJMl=a9(YeDR+o(^5_($ zn4X!Fo+7;H&O6nSz9Ye1D)Z%<7}t-t z5#|j*=f3F2yQAmSIpIPtzM&+o*&pBH1B8jwc@H;LbE#-UEkIjGQ+W?ZMT!nqvH|BS z)#FlWFfgdZ`O