From 5c1399bb96d075ba88066e069ef2e855aa49c9e6 Mon Sep 17 00:00:00 2001
From: bluish <734499798@qq.com>
Date: Wed, 7 Jan 2026 16:24:34 +0000
Subject: [PATCH] first commit
---
.gitattributes | 1 +
.github/FUNDING.yml | 13 +
.github/ISSUE_TEMPLATE/01-bug_report.yml | 58 +
.github/ISSUE_TEMPLATE/02-feature_request.yml | 41 +
.github/ISSUE_TEMPLATE/03-custom_issue.yml | 11 +
.github/dependabot.yml | 22 +
.github/pull_request_template.md | 37 +
.github/workflows/biome.yml | 20 +
.github/workflows/build.yml | 67 +
.github/workflows/deploy.yml | 47 +
.gitignore | 38 +
.npmrc | 1 +
CONTRIBUTING.md | 20 +
LICENSE | 22 +
README.en.md | 284 +
README.md | 289 +
_frontmatter.json | 67 +
astro.config.mjs | 204 +
biome.json | 63 +
docs/README.ja.md | 284 +
docs/README.ru.md | 284 +
docs/README.zh-TW.md | 284 +
docs/images/1.webp | Bin 0 -> 223964 bytes
docs/images/1131.png | Bin 0 -> 697821 bytes
docs/images/sponsor/afdian.png | Bin 0 -> 10656 bytes
docs/images/sponsor/alipay.png | Bin 0 -> 4292 bytes
docs/images/sponsor/wechat.png | Bin 0 -> 4467 bytes
package.json | 91 +
pagefind.yml | 6 +
pnpm-lock.yaml | 11467 ++++++++++++++++
postcss.config.mjs | 11 +
public/assets/css/APlayer.custom.css | 480 +
public/assets/css/APlayer.min.css | 3 +
public/assets/css/APlayer.min.css.map | 1 +
.../assets/css/highlight-github-dark.min.css | 10 +
public/assets/images/avatar.webp | Bin 0 -> 106528 bytes
public/assets/images/cover.webp | Bin 0 -> 164982 bytes
public/assets/images/d1.webp | Bin 0 -> 432628 bytes
public/assets/images/d2.webp | Bin 0 -> 415700 bytes
public/assets/images/favicon.ico | Bin 0 -> 4542 bytes
public/assets/images/firefly.png | Bin 0 -> 27339 bytes
public/assets/images/loading.gif | Bin 0 -> 833458 bytes
public/assets/images/m1.webp | Bin 0 -> 879598 bytes
public/assets/images/sakura.png | Bin 0 -> 43921 bytes
public/assets/images/sponsor/afdian.png | Bin 0 -> 10656 bytes
public/assets/images/sponsor/alipay.png | Bin 0 -> 4292 bytes
public/assets/images/sponsor/wechat.png | Bin 0 -> 4467 bytes
public/assets/js/APlayer.min.js | 2 +
public/assets/js/APlayer.min.js.map | 1 +
.../js/firefly-twikoo-1.6.44.all.min.js | 2 +
public/assets/js/highlight.min.js | 1213 ++
public/assets/js/marked.min.js | 74 +
.../assets/music/cover/109951169585655912.jpg | Bin 0 -> 799293 bytes
public/assets/music/使一颗心免于哀伤-哼唱.wav | Bin 0 -> 7488044 bytes
public/favicon/favicon-dark-128.png | Bin 0 -> 1745 bytes
public/favicon/favicon-dark-180.png | Bin 0 -> 2382 bytes
public/favicon/favicon-dark-192.png | Bin 0 -> 2513 bytes
public/favicon/favicon-dark-32.png | Bin 0 -> 426 bytes
public/favicon/favicon-light-128.png | Bin 0 -> 2054 bytes
public/favicon/favicon-light-180.png | Bin 0 -> 2786 bytes
public/favicon/favicon-light-192.png | Bin 0 -> 2942 bytes
public/favicon/favicon-light-32.png | Bin 0 -> 554 bytes
public/pio/README.md | 135 +
.../models/live2d/illyasviel/illyasviel.moc | Bin 0 -> 393386 bytes
.../live2d/illyasviel/illyasviel.model.json | 40 +
.../live2d/illyasviel/motions/Ylia_01.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_02.mtn | 76 +
.../live2d/illyasviel/motions/Ylia_03.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_04.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_05.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_06.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_07.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_08.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_09.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_10.mtn | 78 +
.../live2d/illyasviel/motions/Ylia_11.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_12.mtn | 83 +
.../live2d/illyasviel/motions/Ylia_13.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_14.mtn | 57 +
.../live2d/illyasviel/motions/Ylia_15.mtn | 88 +
.../live2d/illyasviel/textures/texture_00.png | Bin 0 -> 1173235 bytes
public/pio/models/live2d/snow_miku/model.json | 23 +
public/pio/models/live2d/snow_miku/model.moc | Bin 0 -> 315236 bytes
.../live2d/snow_miku/motions/idle/idle.mtn | 54 +
.../live2d/snow_miku/textures/texture_00.png | Bin 0 -> 5661607 bytes
public/pio/models/spine/firefly/1310.atlas | 212 +
public/pio/models/spine/firefly/1310.json | 10640 ++++++++++++++
public/pio/models/spine/firefly/1310.png | Bin 0 -> 411762 bytes
public/pio/models/spine/firefly/1310.spine | Bin 0 -> 143368 bytes
.../firefly/audio/使一颗心免于哀伤-哼唱.wav | Bin 0 -> 7488044 bytes
.../pio/models/spine/firefly/images/E眉毛.png | Bin 0 -> 876 bytes
.../pio/models/spine/firefly/images/E眼珠.png | Bin 0 -> 5733 bytes
.../pio/models/spine/firefly/images/E眼白.png | Bin 0 -> 2480 bytes
.../pio/models/spine/firefly/images/E眼皮.png | Bin 0 -> 456 bytes
.../pio/models/spine/firefly/images/E眼角.png | Bin 0 -> 1018 bytes
.../pio/models/spine/firefly/images/E睫毛.png | Bin 0 -> 3819 bytes
.../pio/models/spine/firefly/images/E脸1.png | Bin 0 -> 9414 bytes
.../pio/models/spine/firefly/images/E脸2.png | Bin 0 -> 9203 bytes
.../pio/models/spine/firefly/images/L大臂.png | Bin 0 -> 1078 bytes
.../models/spine/firefly/images/L大臂衣袖.png | Bin 0 -> 4674 bytes
.../spine/firefly/images/L大臂衣袖后.png | Bin 0 -> 3107 bytes
.../spine/firefly/images/L正常左小臂.png | Bin 0 -> 5361 bytes
.../models/spine/firefly/images/L正常左手.png | Bin 0 -> 1610 bytes
.../spine/firefly/images/L正常左袖口.png | Bin 0 -> 1129 bytes
.../pio/models/spine/firefly/images/M嘴巴.png | Bin 0 -> 283 bytes
.../pio/models/spine/firefly/images/M笑口.png | Bin 0 -> 684 bytes
.../pio/models/spine/firefly/images/M说话.png | Bin 0 -> 649 bytes
.../pio/models/spine/firefly/images/R大臂.png | Bin 0 -> 1242 bytes
.../models/spine/firefly/images/R大臂衣袖.png | Bin 0 -> 3456 bytes
.../spine/firefly/images/R大臂衣袖后.png | Bin 0 -> 2237 bytes
.../spine/firefly/images/R正常右小臂.png | Bin 0 -> 2116 bytes
.../models/spine/firefly/images/R正常右手.png | Bin 0 -> 1220 bytes
.../pio/models/spine/firefly/images/X眼.png | Bin 0 -> 4507 bytes
.../pio/models/spine/firefly/images/发1.png | Bin 0 -> 17284 bytes
.../pio/models/spine/firefly/images/发10.png | Bin 0 -> 4438 bytes
.../spine/firefly/images/发11内阴影.png | Bin 0 -> 1799 bytes
.../pio/models/spine/firefly/images/发2.png | Bin 0 -> 10045 bytes
.../pio/models/spine/firefly/images/发3.png | Bin 0 -> 24865 bytes
.../pio/models/spine/firefly/images/发4.png | Bin 0 -> 12808 bytes
.../pio/models/spine/firefly/images/发5.png | Bin 0 -> 4472 bytes
.../pio/models/spine/firefly/images/发6.png | Bin 0 -> 3102 bytes
.../pio/models/spine/firefly/images/发7.png | Bin 0 -> 6280 bytes
.../pio/models/spine/firefly/images/发8.png | Bin 0 -> 8427 bytes
.../pio/models/spine/firefly/images/发9.png | Bin 0 -> 7675 bytes
.../pio/models/spine/firefly/images/发带.png | Bin 0 -> 9893 bytes
.../models/spine/firefly/images/发影子.png | Bin 0 -> 4579 bytes
.../pio/models/spine/firefly/images/发饰1.png | Bin 0 -> 6223 bytes
.../pio/models/spine/firefly/images/发饰2.png | Bin 0 -> 3847 bytes
.../pio/models/spine/firefly/images/发饰3.png | Bin 0 -> 2591 bytes
.../models/spine/firefly/images/可爱花朵.png | Bin 0 -> 31475 bytes
.../models/spine/firefly/images/右大腿.png | Bin 0 -> 2541 bytes
.../models/spine/firefly/images/右小腿.png | Bin 0 -> 6298 bytes
.../pio/models/spine/firefly/images/后发1.png | Bin 0 -> 13004 bytes
.../pio/models/spine/firefly/images/后发2.png | Bin 0 -> 24305 bytes
.../pio/models/spine/firefly/images/后发3.png | Bin 0 -> 29135 bytes
.../pio/models/spine/firefly/images/后发4.png | Bin 0 -> 33673 bytes
.../pio/models/spine/firefly/images/后摆.png | Bin 0 -> 23913 bytes
.../models/spine/firefly/images/后脑勺.png | Bin 0 -> 9607 bytes
.../models/spine/firefly/images/左大腿.png | Bin 0 -> 2927 bytes
.../models/spine/firefly/images/左小腿.png | Bin 0 -> 7723 bytes
.../pio/models/spine/firefly/images/星星1.png | Bin 0 -> 3785 bytes
.../pio/models/spine/firefly/images/星星2.png | Bin 0 -> 8901 bytes
.../pio/models/spine/firefly/images/星星3.png | Bin 0 -> 7122 bytes
.../pio/models/spine/firefly/images/星星4.png | Bin 0 -> 6740 bytes
.../models/spine/firefly/images/生气符号1.png | Bin 0 -> 4555 bytes
.../models/spine/firefly/images/生气符号2.png | Bin 0 -> 1674 bytes
.../pio/models/spine/firefly/images/胸饰.png | Bin 0 -> 1956 bytes
.../pio/models/spine/firefly/images/脸红.png | Bin 0 -> 5609 bytes
.../pio/models/spine/firefly/images/裙边.png | Bin 0 -> 1411 bytes
.../pio/models/spine/firefly/images/身体.png | Bin 0 -> 23474 bytes
.../pio/models/spine/firefly/images/问号.png | Bin 0 -> 3363 bytes
.../pio/models/spine/firefly/images/领子.png | Bin 0 -> 4596 bytes
.../pio/models/spine/firefly/images/领结.png | Bin 0 -> 5036 bytes
.../pio/models/spine/firefly/images/鼻子.png | Bin 0 -> 132 bytes
.../pio/static/live2d-sdk/live2d-wrapper.js | 317 +
public/pio/static/live2d-sdk/live2d.min.js | 5 +
public/pio/static/spine-player.min.css | 1 +
public/pio/static/spine-player.min.js | 142 +
scripts/new-post.js | 59 +
src/components/README.md | 134 +
.../analytics/GoogleAnalytics.astro | 19 +
.../analytics/MicrosoftClarity.astro | 15 +
src/components/comment/Artalk.astro | 50 +
src/components/comment/Disqus.astro | 37 +
src/components/comment/Giscus.astro | 63 +
src/components/comment/Twikoo.astro | 88 +
src/components/comment/Waline.astro | 25 +
src/components/comment/index.astro | 70 +
src/components/common/README.md | 196 +
src/components/common/base/DropdownItem.astro | 41 +
.../common/base/DropdownItem.svelte | 44 +
.../common/base/DropdownPanel.astro | 15 +
.../common/base/DropdownPanel.svelte | 20 +
.../common/controls/BackToTop.astro | 223 +
.../common/controls/ButtonLink.astro | 43 +
.../common/controls/ButtonTag.astro | 13 +
.../common/controls/ClientPagination.astro | 404 +
.../common/controls/FloatingTOC.astro | 480 +
.../common/controls/Pagination.astro | 123 +
src/components/common/styles/TOCStyles.astro | 114 +
src/components/content/PostCard.astro | 259 +
src/components/content/PostMeta.astro | 223 +
src/components/content/Profile.astro | 106 +
src/components/content/StatCard.astro | 171 +
src/components/content/TypewriterText.astro | 176 +
src/components/effects/FancyboxManager.astro | 105 +
src/components/effects/KatexManager.astro | 16 +
src/components/effects/SakuraEffect.astro | 357 +
.../interactive/ArchivePanel.svelte | 156 +
.../interactive/DisplaySettings.svelte | 93 +
src/components/interactive/FontManager.astro | 173 +
.../interactive/LayoutSwitchButton.svelte | 159 +
.../interactive/LightDarkSwitch.svelte | 154 +
.../interactive/OverlayWallpaper.astro | 68 +
src/components/interactive/Search.svelte | 291 +
.../interactive/WallpaperSwitch.svelte | 71 +
src/components/layout/ConfigCarrier.astro | 11 +
src/components/layout/DropdownMenu.astro | 201 +
src/components/layout/Footer.astro | 69 +
src/components/layout/GlobalStyles.astro | 3 +
src/components/layout/LeftSideBar.astro | 148 +
src/components/layout/NavMenuPanel.astro | 129 +
src/components/layout/Navbar.astro | 261 +
src/components/layout/PostPage.astro | 452 +
src/components/layout/RightSideBar.astro | 201 +
src/components/layout/SideBar.astro | 275 +
src/components/misc/Icon.astro | 105 +
src/components/misc/IconifyLoader.astro | 270 +
src/components/misc/ImageWrapper.astro | 53 +
src/components/misc/License.astro | 70 +
src/components/misc/Markdown.astro | 23 +
src/components/misc/RandomCoverImage.astro | 755 +
src/components/misc/SharePoster.svelte | 536 +
src/components/pages/AdvancedSearch.svelte | 191 +
.../pages/bangumi/BangumiSection.astro | 149 +
src/components/pages/bangumi/Card.astro | 135 +
.../pages/bangumi/FilterControls.astro | 97 +
src/components/pages/bangumi/TabNav.astro | 79 +
src/components/widget/Advertisement.astro | 376 +
src/components/widget/Announcement.astro | 89 +
src/components/widget/Calendar.astro | 496 +
src/components/widget/Categories.astro | 43 +
src/components/widget/Live2DWidget.astro | 453 +
src/components/widget/MusicPlayer.astro | 547 +
src/components/widget/PioMessageBox.astro | 309 +
src/components/widget/SidebarTOC.astro | 122 +
src/components/widget/SiteStats.astro | 180 +
src/components/widget/SpineModel.astro | 399 +
src/components/widget/Tags.astro | 40 +
src/components/widget/WidgetLayout.astro | 63 +
src/config/FooterConfig.html | 1 +
src/config/README.md | 66 +
src/config/adConfig.ts | 63 +
src/config/announcementConfig.ts | 23 +
src/config/backgroundWallpaper.ts | 110 +
src/config/commentConfig.ts | 72 +
src/config/coverImageConfig.ts | 79 +
src/config/expressiveCodeConfig.ts | 12 +
src/config/fontConfig.ts | 69 +
src/config/footerConfig.ts | 8 +
src/config/friendsConfig.ts | 47 +
src/config/index.ts | 47 +
src/config/licenseConfig.ts | 10 +
src/config/musicConfig.ts | 89 +
src/config/navBarConfig.ts | 91 +
src/config/pioConfig.ts | 138 +
src/config/profileConfig.ts | 45 +
src/config/sakuraConfig.ts | 53 +
src/config/sidebarConfig.ts | 201 +
src/config/siteConfig.ts | 145 +
src/config/sponsorConfig.ts | 74 +
src/constants/constants.ts | 25 +
src/constants/icon.ts | 44 +
src/constants/link-presets.ts | 41 +
src/content.config.ts | 40 +
src/content/posts/agent.md | 228 +
src/content/posts/code-examples.md | 313 +
src/content/posts/docker.md | 150 +
src/content/posts/draft.md | 22 +
src/content/posts/firefly-layout-system.md | 272 +
src/content/posts/firefly.md | 44 +
src/content/posts/guide/cover.webp | Bin 0 -> 424254 bytes
src/content/posts/guide/index.md | 112 +
src/content/posts/images/1.webp | Bin 0 -> 223964 bytes
src/content/posts/images/both-grid.webp | Bin 0 -> 176388 bytes
src/content/posts/images/both-list.webp | Bin 0 -> 154124 bytes
src/content/posts/images/firefly1.webp | Bin 0 -> 242462 bytes
src/content/posts/images/firefly2.webp | Bin 0 -> 52336 bytes
src/content/posts/images/firefly3.webp | Bin 0 -> 164982 bytes
src/content/posts/images/left-grid2.webp | Bin 0 -> 168520 bytes
src/content/posts/images/left-grid3.webp | Bin 0 -> 191444 bytes
src/content/posts/images/left-list.webp | Bin 0 -> 143614 bytes
src/content/posts/images/masonry.webp | Bin 0 -> 195254 bytes
src/content/posts/katex-math-example.md | 91 +
src/content/posts/markdown-extended.md | 93 +
src/content/posts/markdown-mermaid.md | 192 +
src/content/posts/markdown-tutorial.md | 1003 ++
src/content/posts/mdx-example.mdx | 69 +
src/content/posts/opendevin.md | 133 +
src/content/posts/prompt.md | 170 +
src/content/posts/ragflow.md | 179 +
src/content/posts/video.md | 27 +
src/content/spec/about.md | 37 +
src/content/spec/friends.md | 48 +
src/content/spec/guestbook.md | 9 +
src/env.d.ts | 40 +
src/global.d.ts | 57 +
src/i18n/i18nKey.ts | 236 +
src/i18n/languages/en.ts | 249 +
src/i18n/languages/ja.ts | 248 +
src/i18n/languages/ru.ts | 250 +
src/i18n/languages/zh_CN.ts | 240 +
src/i18n/languages/zh_TW.ts | 242 +
src/i18n/translation.ts | 35 +
src/integrations/searchIndex.mts | 48 +
src/layouts/Layout.astro | 1015 ++
src/layouts/MainGridLayout.astro | 496 +
src/pages/404.astro | 73 +
src/pages/[...page].astro | 70 +
src/pages/about.astro | 25 +
src/pages/api/calendar.json.ts | 13 +
src/pages/archive.astro | 13 +
src/pages/bangumi.astro | 251 +
src/pages/friends.astro | 212 +
src/pages/guestbook.astro | 90 +
src/pages/og/[...slug].png.ts | 354 +
src/pages/posts/[...slug].astro | 393 +
src/pages/robots.txt.ts | 16 +
src/pages/rss.astro | 159 +
src/pages/rss.xml.ts | 50 +
src/pages/search.astro | 42 +
src/pages/sponsor.astro | 185 +
.../expressive-code/custom-copy-button.ts | 90 +
src/plugins/expressive-code/language-badge.ts | 49 +
src/plugins/mermaid-render-script.js | 344 +
src/plugins/rehype-component-admonition.mjs | 33 +
src/plugins/rehype-component-github-card.mjs | 95 +
src/plugins/rehype-email-protection.mjs | 129 +
src/plugins/rehype-figure.mjs | 46 +
src/plugins/rehype-mermaid.mjs | 52 +
src/plugins/remark-directive-rehype.js | 30 +
src/plugins/remark-excerpt.js | 17 +
src/plugins/remark-mermaid.js | 19 +
src/plugins/remark-reading-time.mjs | 15 +
src/scripts/index-to-meilisearch.mts | 145 +
src/scripts/theme-manager.js | 92 +
src/styles/animation-enhancements.css | 252 +
src/styles/expressive-code.css | 9 +
src/styles/fancybox-custom.css | 121 +
src/styles/layout-styles.css | 730 +
src/styles/main.css | 534 +
src/styles/markdown-extend.styl | 331 +
src/styles/markdown.css | 147 +
src/styles/navbar.css | 804 ++
src/styles/photoswipe.css | 15 +
src/styles/scrollbar.css | 84 +
src/styles/transition.css | 270 +
src/styles/twikoo.css | 297 +
src/styles/variables-unified.styl | 366 +
src/styles/waves.css | 80 +
src/styles/widget-responsive.css | 488 +
src/types/bangumi.ts | 56 +
src/types/config.ts | 730 +
src/utils/code-copy-utils.ts | 151 +
src/utils/content-utils.ts | 119 +
src/utils/date-utils.ts | 55 +
src/utils/icon-loader.ts | 121 +
src/utils/image-utils.ts | 164 +
src/utils/language-utils.ts | 40 +
src/utils/layout-utils.ts | 88 +
src/utils/navigation-utils.ts | 172 +
src/utils/responsive-utils.ts | 296 +
src/utils/sakura-manager.ts | 395 +
src/utils/setting-utils.ts | 665 +
src/utils/tocUtils.ts | 398 +
src/utils/url-utils.ts | 60 +
src/utils/widget-manager.ts | 378 +
svelte.config.js | 5 +
tailwind.config.cjs | 16 +
tsconfig.json | 45 +
vercel.json | 39 +
wrangler.jsonc | 7 +
362 files changed, 59794 insertions(+)
create mode 100644 .gitattributes
create mode 100644 .github/FUNDING.yml
create mode 100644 .github/ISSUE_TEMPLATE/01-bug_report.yml
create mode 100644 .github/ISSUE_TEMPLATE/02-feature_request.yml
create mode 100644 .github/ISSUE_TEMPLATE/03-custom_issue.yml
create mode 100644 .github/dependabot.yml
create mode 100644 .github/pull_request_template.md
create mode 100644 .github/workflows/biome.yml
create mode 100644 .github/workflows/build.yml
create mode 100644 .github/workflows/deploy.yml
create mode 100644 .gitignore
create mode 100644 .npmrc
create mode 100644 CONTRIBUTING.md
create mode 100644 LICENSE
create mode 100644 README.en.md
create mode 100644 README.md
create mode 100644 _frontmatter.json
create mode 100644 astro.config.mjs
create mode 100644 biome.json
create mode 100644 docs/README.ja.md
create mode 100644 docs/README.ru.md
create mode 100644 docs/README.zh-TW.md
create mode 100644 docs/images/1.webp
create mode 100644 docs/images/1131.png
create mode 100644 docs/images/sponsor/afdian.png
create mode 100644 docs/images/sponsor/alipay.png
create mode 100644 docs/images/sponsor/wechat.png
create mode 100644 package.json
create mode 100644 pagefind.yml
create mode 100644 pnpm-lock.yaml
create mode 100644 postcss.config.mjs
create mode 100644 public/assets/css/APlayer.custom.css
create mode 100644 public/assets/css/APlayer.min.css
create mode 100644 public/assets/css/APlayer.min.css.map
create mode 100644 public/assets/css/highlight-github-dark.min.css
create mode 100644 public/assets/images/avatar.webp
create mode 100644 public/assets/images/cover.webp
create mode 100644 public/assets/images/d1.webp
create mode 100644 public/assets/images/d2.webp
create mode 100644 public/assets/images/favicon.ico
create mode 100644 public/assets/images/firefly.png
create mode 100644 public/assets/images/loading.gif
create mode 100644 public/assets/images/m1.webp
create mode 100644 public/assets/images/sakura.png
create mode 100644 public/assets/images/sponsor/afdian.png
create mode 100644 public/assets/images/sponsor/alipay.png
create mode 100644 public/assets/images/sponsor/wechat.png
create mode 100644 public/assets/js/APlayer.min.js
create mode 100644 public/assets/js/APlayer.min.js.map
create mode 100644 public/assets/js/firefly-twikoo-1.6.44.all.min.js
create mode 100644 public/assets/js/highlight.min.js
create mode 100644 public/assets/js/marked.min.js
create mode 100644 public/assets/music/cover/109951169585655912.jpg
create mode 100644 public/assets/music/使一颗心免于哀伤-哼唱.wav
create mode 100644 public/favicon/favicon-dark-128.png
create mode 100644 public/favicon/favicon-dark-180.png
create mode 100644 public/favicon/favicon-dark-192.png
create mode 100644 public/favicon/favicon-dark-32.png
create mode 100644 public/favicon/favicon-light-128.png
create mode 100644 public/favicon/favicon-light-180.png
create mode 100644 public/favicon/favicon-light-192.png
create mode 100644 public/favicon/favicon-light-32.png
create mode 100644 public/pio/README.md
create mode 100644 public/pio/models/live2d/illyasviel/illyasviel.moc
create mode 100644 public/pio/models/live2d/illyasviel/illyasviel.model.json
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_01.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_02.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_03.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_04.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_05.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_06.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_07.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_08.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_09.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_10.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_11.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_12.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_13.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_14.mtn
create mode 100644 public/pio/models/live2d/illyasviel/motions/Ylia_15.mtn
create mode 100644 public/pio/models/live2d/illyasviel/textures/texture_00.png
create mode 100644 public/pio/models/live2d/snow_miku/model.json
create mode 100644 public/pio/models/live2d/snow_miku/model.moc
create mode 100644 public/pio/models/live2d/snow_miku/motions/idle/idle.mtn
create mode 100644 public/pio/models/live2d/snow_miku/textures/texture_00.png
create mode 100644 public/pio/models/spine/firefly/1310.atlas
create mode 100644 public/pio/models/spine/firefly/1310.json
create mode 100644 public/pio/models/spine/firefly/1310.png
create mode 100644 public/pio/models/spine/firefly/1310.spine
create mode 100644 public/pio/models/spine/firefly/audio/使一颗心免于哀伤-哼唱.wav
create mode 100644 public/pio/models/spine/firefly/images/E眉毛.png
create mode 100644 public/pio/models/spine/firefly/images/E眼珠.png
create mode 100644 public/pio/models/spine/firefly/images/E眼白.png
create mode 100644 public/pio/models/spine/firefly/images/E眼皮.png
create mode 100644 public/pio/models/spine/firefly/images/E眼角.png
create mode 100644 public/pio/models/spine/firefly/images/E睫毛.png
create mode 100644 public/pio/models/spine/firefly/images/E脸1.png
create mode 100644 public/pio/models/spine/firefly/images/E脸2.png
create mode 100644 public/pio/models/spine/firefly/images/L大臂.png
create mode 100644 public/pio/models/spine/firefly/images/L大臂衣袖.png
create mode 100644 public/pio/models/spine/firefly/images/L大臂衣袖后.png
create mode 100644 public/pio/models/spine/firefly/images/L正常左小臂.png
create mode 100644 public/pio/models/spine/firefly/images/L正常左手.png
create mode 100644 public/pio/models/spine/firefly/images/L正常左袖口.png
create mode 100644 public/pio/models/spine/firefly/images/M嘴巴.png
create mode 100644 public/pio/models/spine/firefly/images/M笑口.png
create mode 100644 public/pio/models/spine/firefly/images/M说话.png
create mode 100644 public/pio/models/spine/firefly/images/R大臂.png
create mode 100644 public/pio/models/spine/firefly/images/R大臂衣袖.png
create mode 100644 public/pio/models/spine/firefly/images/R大臂衣袖后.png
create mode 100644 public/pio/models/spine/firefly/images/R正常右小臂.png
create mode 100644 public/pio/models/spine/firefly/images/R正常右手.png
create mode 100644 public/pio/models/spine/firefly/images/X眼.png
create mode 100644 public/pio/models/spine/firefly/images/发1.png
create mode 100644 public/pio/models/spine/firefly/images/发10.png
create mode 100644 public/pio/models/spine/firefly/images/发11内阴影.png
create mode 100644 public/pio/models/spine/firefly/images/发2.png
create mode 100644 public/pio/models/spine/firefly/images/发3.png
create mode 100644 public/pio/models/spine/firefly/images/发4.png
create mode 100644 public/pio/models/spine/firefly/images/发5.png
create mode 100644 public/pio/models/spine/firefly/images/发6.png
create mode 100644 public/pio/models/spine/firefly/images/发7.png
create mode 100644 public/pio/models/spine/firefly/images/发8.png
create mode 100644 public/pio/models/spine/firefly/images/发9.png
create mode 100644 public/pio/models/spine/firefly/images/发带.png
create mode 100644 public/pio/models/spine/firefly/images/发影子.png
create mode 100644 public/pio/models/spine/firefly/images/发饰1.png
create mode 100644 public/pio/models/spine/firefly/images/发饰2.png
create mode 100644 public/pio/models/spine/firefly/images/发饰3.png
create mode 100644 public/pio/models/spine/firefly/images/可爱花朵.png
create mode 100644 public/pio/models/spine/firefly/images/右大腿.png
create mode 100644 public/pio/models/spine/firefly/images/右小腿.png
create mode 100644 public/pio/models/spine/firefly/images/后发1.png
create mode 100644 public/pio/models/spine/firefly/images/后发2.png
create mode 100644 public/pio/models/spine/firefly/images/后发3.png
create mode 100644 public/pio/models/spine/firefly/images/后发4.png
create mode 100644 public/pio/models/spine/firefly/images/后摆.png
create mode 100644 public/pio/models/spine/firefly/images/后脑勺.png
create mode 100644 public/pio/models/spine/firefly/images/左大腿.png
create mode 100644 public/pio/models/spine/firefly/images/左小腿.png
create mode 100644 public/pio/models/spine/firefly/images/星星1.png
create mode 100644 public/pio/models/spine/firefly/images/星星2.png
create mode 100644 public/pio/models/spine/firefly/images/星星3.png
create mode 100644 public/pio/models/spine/firefly/images/星星4.png
create mode 100644 public/pio/models/spine/firefly/images/生气符号1.png
create mode 100644 public/pio/models/spine/firefly/images/生气符号2.png
create mode 100644 public/pio/models/spine/firefly/images/胸饰.png
create mode 100644 public/pio/models/spine/firefly/images/脸红.png
create mode 100644 public/pio/models/spine/firefly/images/裙边.png
create mode 100644 public/pio/models/spine/firefly/images/身体.png
create mode 100644 public/pio/models/spine/firefly/images/问号.png
create mode 100644 public/pio/models/spine/firefly/images/领子.png
create mode 100644 public/pio/models/spine/firefly/images/领结.png
create mode 100644 public/pio/models/spine/firefly/images/鼻子.png
create mode 100644 public/pio/static/live2d-sdk/live2d-wrapper.js
create mode 100644 public/pio/static/live2d-sdk/live2d.min.js
create mode 100644 public/pio/static/spine-player.min.css
create mode 100644 public/pio/static/spine-player.min.js
create mode 100644 scripts/new-post.js
create mode 100644 src/components/README.md
create mode 100644 src/components/analytics/GoogleAnalytics.astro
create mode 100644 src/components/analytics/MicrosoftClarity.astro
create mode 100644 src/components/comment/Artalk.astro
create mode 100644 src/components/comment/Disqus.astro
create mode 100644 src/components/comment/Giscus.astro
create mode 100644 src/components/comment/Twikoo.astro
create mode 100644 src/components/comment/Waline.astro
create mode 100644 src/components/comment/index.astro
create mode 100644 src/components/common/README.md
create mode 100644 src/components/common/base/DropdownItem.astro
create mode 100644 src/components/common/base/DropdownItem.svelte
create mode 100644 src/components/common/base/DropdownPanel.astro
create mode 100644 src/components/common/base/DropdownPanel.svelte
create mode 100644 src/components/common/controls/BackToTop.astro
create mode 100644 src/components/common/controls/ButtonLink.astro
create mode 100644 src/components/common/controls/ButtonTag.astro
create mode 100644 src/components/common/controls/ClientPagination.astro
create mode 100644 src/components/common/controls/FloatingTOC.astro
create mode 100644 src/components/common/controls/Pagination.astro
create mode 100644 src/components/common/styles/TOCStyles.astro
create mode 100644 src/components/content/PostCard.astro
create mode 100644 src/components/content/PostMeta.astro
create mode 100644 src/components/content/Profile.astro
create mode 100644 src/components/content/StatCard.astro
create mode 100644 src/components/content/TypewriterText.astro
create mode 100644 src/components/effects/FancyboxManager.astro
create mode 100644 src/components/effects/KatexManager.astro
create mode 100644 src/components/effects/SakuraEffect.astro
create mode 100644 src/components/interactive/ArchivePanel.svelte
create mode 100644 src/components/interactive/DisplaySettings.svelte
create mode 100644 src/components/interactive/FontManager.astro
create mode 100644 src/components/interactive/LayoutSwitchButton.svelte
create mode 100644 src/components/interactive/LightDarkSwitch.svelte
create mode 100644 src/components/interactive/OverlayWallpaper.astro
create mode 100644 src/components/interactive/Search.svelte
create mode 100644 src/components/interactive/WallpaperSwitch.svelte
create mode 100644 src/components/layout/ConfigCarrier.astro
create mode 100644 src/components/layout/DropdownMenu.astro
create mode 100644 src/components/layout/Footer.astro
create mode 100644 src/components/layout/GlobalStyles.astro
create mode 100644 src/components/layout/LeftSideBar.astro
create mode 100644 src/components/layout/NavMenuPanel.astro
create mode 100644 src/components/layout/Navbar.astro
create mode 100644 src/components/layout/PostPage.astro
create mode 100644 src/components/layout/RightSideBar.astro
create mode 100644 src/components/layout/SideBar.astro
create mode 100644 src/components/misc/Icon.astro
create mode 100644 src/components/misc/IconifyLoader.astro
create mode 100644 src/components/misc/ImageWrapper.astro
create mode 100644 src/components/misc/License.astro
create mode 100644 src/components/misc/Markdown.astro
create mode 100644 src/components/misc/RandomCoverImage.astro
create mode 100644 src/components/misc/SharePoster.svelte
create mode 100644 src/components/pages/AdvancedSearch.svelte
create mode 100644 src/components/pages/bangumi/BangumiSection.astro
create mode 100644 src/components/pages/bangumi/Card.astro
create mode 100644 src/components/pages/bangumi/FilterControls.astro
create mode 100644 src/components/pages/bangumi/TabNav.astro
create mode 100644 src/components/widget/Advertisement.astro
create mode 100644 src/components/widget/Announcement.astro
create mode 100644 src/components/widget/Calendar.astro
create mode 100644 src/components/widget/Categories.astro
create mode 100644 src/components/widget/Live2DWidget.astro
create mode 100644 src/components/widget/MusicPlayer.astro
create mode 100644 src/components/widget/PioMessageBox.astro
create mode 100644 src/components/widget/SidebarTOC.astro
create mode 100644 src/components/widget/SiteStats.astro
create mode 100644 src/components/widget/SpineModel.astro
create mode 100644 src/components/widget/Tags.astro
create mode 100644 src/components/widget/WidgetLayout.astro
create mode 100644 src/config/FooterConfig.html
create mode 100644 src/config/README.md
create mode 100644 src/config/adConfig.ts
create mode 100644 src/config/announcementConfig.ts
create mode 100644 src/config/backgroundWallpaper.ts
create mode 100644 src/config/commentConfig.ts
create mode 100644 src/config/coverImageConfig.ts
create mode 100644 src/config/expressiveCodeConfig.ts
create mode 100644 src/config/fontConfig.ts
create mode 100644 src/config/footerConfig.ts
create mode 100644 src/config/friendsConfig.ts
create mode 100644 src/config/index.ts
create mode 100644 src/config/licenseConfig.ts
create mode 100644 src/config/musicConfig.ts
create mode 100644 src/config/navBarConfig.ts
create mode 100644 src/config/pioConfig.ts
create mode 100644 src/config/profileConfig.ts
create mode 100644 src/config/sakuraConfig.ts
create mode 100644 src/config/sidebarConfig.ts
create mode 100644 src/config/siteConfig.ts
create mode 100644 src/config/sponsorConfig.ts
create mode 100644 src/constants/constants.ts
create mode 100644 src/constants/icon.ts
create mode 100644 src/constants/link-presets.ts
create mode 100644 src/content.config.ts
create mode 100644 src/content/posts/agent.md
create mode 100644 src/content/posts/code-examples.md
create mode 100644 src/content/posts/docker.md
create mode 100644 src/content/posts/draft.md
create mode 100644 src/content/posts/firefly-layout-system.md
create mode 100644 src/content/posts/firefly.md
create mode 100644 src/content/posts/guide/cover.webp
create mode 100644 src/content/posts/guide/index.md
create mode 100644 src/content/posts/images/1.webp
create mode 100644 src/content/posts/images/both-grid.webp
create mode 100644 src/content/posts/images/both-list.webp
create mode 100644 src/content/posts/images/firefly1.webp
create mode 100644 src/content/posts/images/firefly2.webp
create mode 100644 src/content/posts/images/firefly3.webp
create mode 100644 src/content/posts/images/left-grid2.webp
create mode 100644 src/content/posts/images/left-grid3.webp
create mode 100644 src/content/posts/images/left-list.webp
create mode 100644 src/content/posts/images/masonry.webp
create mode 100644 src/content/posts/katex-math-example.md
create mode 100644 src/content/posts/markdown-extended.md
create mode 100644 src/content/posts/markdown-mermaid.md
create mode 100644 src/content/posts/markdown-tutorial.md
create mode 100644 src/content/posts/mdx-example.mdx
create mode 100644 src/content/posts/opendevin.md
create mode 100644 src/content/posts/prompt.md
create mode 100644 src/content/posts/ragflow.md
create mode 100644 src/content/posts/video.md
create mode 100644 src/content/spec/about.md
create mode 100644 src/content/spec/friends.md
create mode 100644 src/content/spec/guestbook.md
create mode 100644 src/env.d.ts
create mode 100644 src/global.d.ts
create mode 100644 src/i18n/i18nKey.ts
create mode 100644 src/i18n/languages/en.ts
create mode 100644 src/i18n/languages/ja.ts
create mode 100644 src/i18n/languages/ru.ts
create mode 100644 src/i18n/languages/zh_CN.ts
create mode 100644 src/i18n/languages/zh_TW.ts
create mode 100644 src/i18n/translation.ts
create mode 100644 src/integrations/searchIndex.mts
create mode 100644 src/layouts/Layout.astro
create mode 100644 src/layouts/MainGridLayout.astro
create mode 100644 src/pages/404.astro
create mode 100644 src/pages/[...page].astro
create mode 100644 src/pages/about.astro
create mode 100644 src/pages/api/calendar.json.ts
create mode 100644 src/pages/archive.astro
create mode 100644 src/pages/bangumi.astro
create mode 100644 src/pages/friends.astro
create mode 100644 src/pages/guestbook.astro
create mode 100644 src/pages/og/[...slug].png.ts
create mode 100644 src/pages/posts/[...slug].astro
create mode 100644 src/pages/robots.txt.ts
create mode 100644 src/pages/rss.astro
create mode 100644 src/pages/rss.xml.ts
create mode 100644 src/pages/search.astro
create mode 100644 src/pages/sponsor.astro
create mode 100644 src/plugins/expressive-code/custom-copy-button.ts
create mode 100644 src/plugins/expressive-code/language-badge.ts
create mode 100644 src/plugins/mermaid-render-script.js
create mode 100644 src/plugins/rehype-component-admonition.mjs
create mode 100644 src/plugins/rehype-component-github-card.mjs
create mode 100644 src/plugins/rehype-email-protection.mjs
create mode 100644 src/plugins/rehype-figure.mjs
create mode 100644 src/plugins/rehype-mermaid.mjs
create mode 100644 src/plugins/remark-directive-rehype.js
create mode 100644 src/plugins/remark-excerpt.js
create mode 100644 src/plugins/remark-mermaid.js
create mode 100644 src/plugins/remark-reading-time.mjs
create mode 100644 src/scripts/index-to-meilisearch.mts
create mode 100644 src/scripts/theme-manager.js
create mode 100644 src/styles/animation-enhancements.css
create mode 100644 src/styles/expressive-code.css
create mode 100644 src/styles/fancybox-custom.css
create mode 100644 src/styles/layout-styles.css
create mode 100644 src/styles/main.css
create mode 100644 src/styles/markdown-extend.styl
create mode 100644 src/styles/markdown.css
create mode 100644 src/styles/navbar.css
create mode 100644 src/styles/photoswipe.css
create mode 100644 src/styles/scrollbar.css
create mode 100644 src/styles/transition.css
create mode 100644 src/styles/twikoo.css
create mode 100644 src/styles/variables-unified.styl
create mode 100644 src/styles/waves.css
create mode 100644 src/styles/widget-responsive.css
create mode 100644 src/types/bangumi.ts
create mode 100644 src/types/config.ts
create mode 100644 src/utils/code-copy-utils.ts
create mode 100644 src/utils/content-utils.ts
create mode 100644 src/utils/date-utils.ts
create mode 100644 src/utils/icon-loader.ts
create mode 100644 src/utils/image-utils.ts
create mode 100644 src/utils/language-utils.ts
create mode 100644 src/utils/layout-utils.ts
create mode 100644 src/utils/navigation-utils.ts
create mode 100644 src/utils/responsive-utils.ts
create mode 100644 src/utils/sakura-manager.ts
create mode 100644 src/utils/setting-utils.ts
create mode 100644 src/utils/tocUtils.ts
create mode 100644 src/utils/url-utils.ts
create mode 100644 src/utils/widget-manager.ts
create mode 100644 svelte.config.js
create mode 100644 tailwind.config.cjs
create mode 100644 tsconfig.json
create mode 100644 vercel.json
create mode 100644 wrangler.jsonc
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..c944400
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.js linguist-language=astro
\ No newline at end of file
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..2fc026d
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,13 @@
+# GitHub 赞助配置
+# 这将在项目页面显示"Sponsor"按钮
+
+# 爱发电(推荐国内用户)
+custom: ['https://afdian.com/a/cuteleaf']
+
+# 如果之后开通 GitHub Sponsors,取消下面的注释
+# github: [CuteLeaf]
+
+# 其他平台示例(按需添加)
+# patreon: username
+# ko_fi: username
+# open_collective: project-name
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/01-bug_report.yml b/.github/ISSUE_TEMPLATE/01-bug_report.yml
new file mode 100644
index 0000000..5e97dab
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/01-bug_report.yml
@@ -0,0 +1,58 @@
+name: Bug Report
+description: Create a report to help us improve
+title: "[Bug]: "
+labels: ["bug"]
+assignees:
+ - CuteLeaf
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for taking the time to fill out this bug report!
+ - type: textarea
+ id: bug-description
+ attributes:
+ label: Describe the bug
+ description: A clear and concise description of what the bug is.
+ validations:
+ required: true
+ - type: textarea
+ id: to-reproduce
+ attributes:
+ label: To Reproduce
+ description: Steps to reproduce the behavior.
+ placeholder: |
+ 1. Go to '...'
+ 2. Click on '....'
+ 3. Scroll down to '....'
+ 4. See error
+ validations:
+ required: true
+ - type: textarea
+ id: expected-behavior
+ attributes:
+ label: Expected behavior
+ description: A clear and concise description of what you expected to happen.
+ validations:
+ required: true
+ - type: dropdown
+ id: os
+ attributes:
+ label: OS
+ multiple: true
+ options:
+ - Windows
+ - macOS
+ - Linux
+ - Android
+ - iOS
+ - type: input
+ id: browser
+ attributes:
+ label: Browser
+ placeholder: e.g. chrome, safari
+ - type: textarea
+ id: additional-context
+ attributes:
+ label: Additional context
+ description: Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/02-feature_request.yml b/.github/ISSUE_TEMPLATE/02-feature_request.yml
new file mode 100644
index 0000000..5ba8520
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/02-feature_request.yml
@@ -0,0 +1,41 @@
+name: Feature Request
+description: Suggest an idea for this project
+title: "[Feature]: "
+labels: ["enhancement"]
+assignees:
+ - CuteLeaf
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for taking the time to fill out this feature request!
+ - type: textarea
+ id: related-problem
+ attributes:
+ label: Is your feature request related to a problem?
+ description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+ validations:
+ required: true
+ - type: textarea
+ id: solution
+ attributes:
+ label: Describe the solution you'd like
+ description: A clear and concise description of what you want to happen.
+ validations:
+ required: true
+ - type: textarea
+ id: alternatives
+ attributes:
+ label: Describe alternatives you've considered
+ description: A clear and concise description of any alternative solutions or features you've considered.
+ - type: textarea
+ id: additional-context
+ attributes:
+ label: Additional context
+ description: Add any other context or screenshots about the feature request here.
+ - type: markdown
+ attributes:
+ value: |
+ **Disclaimer**
+
+ Please note that this feature request is at the discretion of the repository owner, @saicaca, and its implementation is not guaranteed.
diff --git a/.github/ISSUE_TEMPLATE/03-custom_issue.yml b/.github/ISSUE_TEMPLATE/03-custom_issue.yml
new file mode 100644
index 0000000..945b721
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/03-custom_issue.yml
@@ -0,0 +1,11 @@
+name: Custom Issue
+description: Describe your issue here.
+title: "[Other]: "
+body:
+ - type: textarea
+ id: issue-description
+ attributes:
+ label: Issue Description
+ description: Please describe your issue.
+ validations:
+ required: true
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..6f36d0a
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,22 @@
+version: 2
+updates:
+ - package-ecosystem: "npm"
+ directory: "/"
+ schedule:
+ interval: "daily"
+ groups:
+ patch-updates:
+ patterns:
+ - "*"
+ update-types:
+ - "patch"
+ minor-updates:
+ patterns:
+ - "*"
+ update-types:
+ - "minor"
+ pull-request-branch-name:
+ separator: "-"
+ ignore:
+ - dependency-name: "*"
+ update-types: ["version-update:semver-major"]
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..2465212
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,37 @@
+## Type of change
+
+- [ ] Bug fix (a non-breaking change that fixes an issue)
+- [ ] New feature (a non-breaking change that adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
+- [ ] Other (please describe):
+
+## Checklist
+
+- [ ] I have read the [**CONTRIBUTING**](https://github.com/CuteLeaf/Firefly/blob/master/CONTRIBUTING.md) document.
+- [ ] I have checked to ensure that this Pull Request is not for personal changes.
+- [ ] I have performed a self-review of my own code.
+- [ ] My changes generate no new warnings.
+
+## Related Issue
+
+
+
+
+## Changes
+
+
+
+
+## How To Test
+
+
+
+
+## Screenshots (if applicable)
+
+
+
+
+## Additional Notes
+
+
diff --git a/.github/workflows/biome.yml b/.github/workflows/biome.yml
new file mode 100644
index 0000000..53f1047
--- /dev/null
+++ b/.github/workflows/biome.yml
@@ -0,0 +1,20 @@
+name: Code quality
+
+on:
+ push:
+ branches: [ master ] # Adjust branches as needed
+ pull_request:
+ branches: [ master ] # Adjust branches as needed
+
+jobs:
+ quality:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+ - name: Setup Biome
+ uses: biomejs/setup-biome@f382a98e582959e6aaac8e5f8b17b31749018780 # v2.5.0
+ with:
+ version: latest
+ - name: Run Biome
+ run: biome ci ./src --reporter=github
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..3fb1004
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,67 @@
+name: Build and Check
+
+on:
+ push:
+ branches: [ master ] # Adjust branches as needed
+ pull_request:
+ branches: [ master ] # Adjust branches as needed
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ check:
+ strategy:
+ matrix:
+ node: [ 22, 23 ]
+ runs-on: ubuntu-latest
+ name: Astro Check for Node.js ${{ matrix.node }}
+ steps:
+ - name: Setup Node.js
+ uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
+ with:
+ node-version: ${{ matrix.node }} # Use LTS
+
+ - name: Checkout
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
+ with:
+ run_install: false # Disable auto-install
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Run Astro Check
+ run: pnpm astro check
+
+ build:
+ strategy:
+ matrix:
+ node: [ 22, 23 ]
+ runs-on: ubuntu-latest
+ name: Astro Build for Node.js ${{ matrix.node }} # Corrected job name
+ steps:
+ - name: Setup Node.js
+ uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
+ with:
+ node-version: ${{ matrix.node }}
+
+ - name: Checkout
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
+ with:
+ run_install: false # Disable auto-install
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Run Astro Build
+ run: pnpm astro build
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..11ab3f7
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,47 @@
+name: Deploy to Pages Branch
+
+on:
+ # 每次推送到 `master` 分支时触发这个"工作流程"
+ # 如果你使用了别的分支名,请按需将 `master` 替换成你的分支名
+ push:
+ branches: [ master ]
+ # 允许你在 GitHub 上的 Actions 标签中手动触发此"工作流程"
+ workflow_dispatch:
+
+# 需要写入权限来推送到pages分支
+permissions:
+ contents: write
+
+jobs:
+ build-and-deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout your repository using git
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 9.14.4
+ run_install: false
+
+ - name: Install dependencies
+ run: pnpm install --no-frozen-lockfile
+
+ - name: Build site
+ run: pnpm run build
+
+ - name: Create .nojekyll file
+ run: touch dist/.nojekyll
+
+ - name: Deploy to pages branch
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ branch: pages # 部署到pages分支
+ folder: dist # Astro默认构建输出目录
+ clean: true # 清理目标分支中的旧文件
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6683403
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+# build output
+dist/
+
+# generated types
+.astro/
+
+# dependencies
+node_modules/
+
+# logs
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# environment variables
+.env
+.env.production
+
+# macOS-specific files
+.DS_Store
+
+.vercel
+
+package-lock.json
+bun.lockb
+yarn.lock
+
+# ide
+.idea
+*.iml
+
+# docs
+Docs-Firefly/
+
+cache/
+package/
+.obsidian/
\ No newline at end of file
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..6baea02
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+manage-package-manager-versions = true
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..405f774
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,20 @@
+# Contributing
+
+Thank you for your interest in contributing!
+
+## Before You Start
+
+If you plan to make major changes (especially new features or design changes), please open an issue or discussion before starting work. This helps ensure your effort aligns with the project's direction.
+
+## Submitting Code
+
+Please keep each pull request focused on a single purpose. Avoid mixing unrelated changes in one PR, as this can make reviewing and merging code more difficult.
+
+Please use the [Conventional Commits](https://www.conventionalcommits.org/) format for your commit messages whenever possible. This keeps our history clear and consistent.
+
+Before submitting code, please run the appropriate commands to check for errors and format your code.
+
+```bash
+pnpm check
+pnpm format
+```
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d6685ce
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2024 saicaca
+Copyright (c) 2025 CuteLeaf
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.en.md b/README.en.md
new file mode 100644
index 0000000..802fc6c
--- /dev/null
+++ b/README.en.md
@@ -0,0 +1,284 @@
+
+
+
+
+
+>[!TIP]
+>In important layouts, Firefly innovatively adds dual sidebars, article grid (multi-column) layout, masonry layout,
+>
+>Includes site statistics, calendar component, table of contents and other widgets to enrich the sidebar,
+>
+>While also retaining fuwari layout system, freely switchable in the configuration file.
+>
+>**For more layout configurations and demos, please see: [Firefly Layout System Details](https://firefly.cuteleaf.cn/posts/firefly-layout-system/)**
+
+## ✨ Features
+
+### Core Features
+
+- [x] **Astro + Tailwind CSS** - Ultra-fast static site generation based on modern tech stack
+- [x] **Smooth Animations** - Swup page transition animations for silky smooth browsing experience
+- [x] **Responsive Design** - Perfect adaptation for desktop, tablet and mobile devices
+- [x] **Multi-language Support** - i18n internationalization, supports Simplified Chinese, Traditional Chinese, English, Japanese, Russian
+- [x] **Full-text Search** - Client-side search based on Pagefind, supports article content indexing. Also supports MeiliSearch search engine
+
+### Personalization
+- [x] **Sidebar** - Supports single sidebar, dual sidebar configuration, freely switchable in frontend
+- [x] **Article Layout** - Supports list (single column) and grid (multi-column/masonry) layout, freely switchable in frontend
+- [x] **Font Management** - Custom font support with rich font selector
+- [x] **Footer Configuration** - HTML content injection, fully customizable
+- [x] **Navbar Customization** - Logo, title, links fully customizable
+- [x] **Wallpaper Mode Switching** - Banner wallpaper, fullscreen wallpaper, solid background, freely switchable in frontend
+- [x] **Theme Color Customization** - 360° hue adjustment, supports light/dark/system three modes, freely switchable in frontend
+
+### Page Components
+- [x] **Guestbook** - Supports guestbook page with integrated comment system
+- [x] **Announcement Bar** - Top announcement notification, supports closing and custom styles
+- [x] **Mascot** - Supports both Spine and Live2D animation engines
+- [x] **Site Statistics** - Displays article, category, tag counts, total word count, running time, last update time
+- [x] **Site Calendar** - Displays current month calendar and published articles for the month
+- [x] **Sponsor Page** - Multiple payment methods, payment QR codes, sponsor list, in-article sponsor button
+- [x] **Share Poster** - Supports generating beautiful article share posters containing article summary, QR code, etc.
+- [x] **Sakura Effect** - Supports sakura effect, fullscreen sakura animation
+- [x] **Friend Links** - Beautiful friend link display cards
+- [x] **Ad Component** - Supports custom sidebar advertising content
+- [x] **Bangumi** - Display anime and game tracking based on Bangumi API
+- [x] **Comment System** - Integrates Twikoo, Waline, Giscus, Disqus, Artalk comment systems
+- [x] **Visit Counter** - Supports calling Waline, Twikoo built-in visit tracking
+- [x] **Music Player** - Based on APlayer, supports local music and Meting API online music
+
+### Content Enhancement
+- [x] **Image Lightbox** - Fancybox image preview functionality
+- [x] **Floating TOC** - Dynamically displays article table of contents, supports anchor jumping, shown when sidebar TOC is hidden
+- [x] **Email Protection** - Prevent automated crawlers from directly scraping email addresses to avoid spam
+- [x] **Sidebar TOC** - Dynamically displays article table of contents, supports anchor jumping
+- [x] **Enhanced Code Blocks** - Based on Expressive Code, supports code folding, line numbers, language identification
+- [x] **Math Formula Support** - KaTeX rendering engine, supports inline and block formulas
+- [x] **Markdown Extensions** - [Markdown extended features](https://github.com/saicaca/fuwari?tab=readme-ov-file#-markdown-extended-syntax), also includes [Admonitions](https://firefly.cuteleaf.cn/posts/markdown-extended/#%E6%8F%90%E9%86%92%E6%A1%86), [GitHub repository cards](https://firefly.cuteleaf.cn/posts/markdown-extended/#github-%E4%BB%93%E5%BA%93%E5%8D%A1%E7%89%87), [Expressive Code](http://firefly.cuteleaf.cn/posts/code-examples/)
+- [x] **Random Cover Images** - Supports fetching random cover images via API
+
+### SEO
+- [x] **SEO Optimization** - Complete meta tags and structured data
+- [x] **RSS Feed** - Automatically generates RSS Feed
+- [x] **Sitemap** - Automatically generates XML Sitemap with page filtering configuration
+
+
+## 📝 Planned...
+
+- [ ] **Refactor Live2D Mascot**
+- [ ] **Continuous Animation Smoothness Optimization**
+- [ ] More features in continuous development...
+
+If you have useful features and optimizations, please submit a [Pull Request](https://github.com/CuteLeaf/Firefly/pulls)
+
+## 🚀 Quick Start
+
+### Requirements
+
+- Node.js ≤ 22
+- pnpm ≤ 9
+
+### Local Development
+
+1. **Clone the repository:**
+ ```bash
+ git clone https://github.com/Cuteleaf/Firefly.git
+ cd Firefly
+ ```
+ **First [Fork](https://github.com/CuteLeaf/Firefly/fork) to your own repository then clone (recommended)**
+ ```bash
+ git clone https://github.com/you-github-name/Firefly.git
+ cd Firefly
+ ```
+3. **Install dependencies:**
+ ```bash
+ # Install pnpm if not installed
+ npm install -g pnpm
+
+ # Install project dependencies
+ pnpm install
+ ```
+
+4. **Configure blog:**
+ - Edit configuration files in `src/config/` directory to customize blog settings
+
+5. **Start development server:**
+ ```bash
+ pnpm dev
+ ```
+ Blog will be available at `http://localhost:4321`
+
+### Platform Hosting Deployment
+- **Refer to the [official guide](https://docs.astro.build/en/guides/deploy/) to deploy your blog to Vercel, Netlify, GitHub Pages, Cloudflare Pages, EdgeOne Pages, etc.**
+
+ Framework Preset: `Astro`
+
+ Root Directory: `./`
+
+ Output Directory: `dist`
+
+ Build Command: `pnpm run build`
+
+ Install Command: `pnpm install`
+
+## 📖 Configuration
+
+> 📚 **Detailed Configuration Documentation**: Check [Firefly Documentation](https://docs-firefly.cuteleaf.cn/) for complete configuration guide
+
+### Setting Website Language
+
+To set the default language for your blog, edit the `src/config/siteConfig.ts` file:
+
+```typescript
+// Define site language
+const SITE_LANG = "zh_CN";
+```
+
+**Supported language codes:**
+- `zh_CN` - Simplified Chinese
+- `zh_TW` - Traditional Chinese
+- `en` - English
+- `ja` - Japanese
+- `ru` - Russian
+
+
+### Configuration File Structure
+
+```
+src/
+├── config/
+│ ├── index.ts # Configuration index file
+│ ├── siteConfig.ts # Site basic configuration
+│ ├── backgroundWallpaper.ts # Background wallpaper configuration
+│ ├── profileConfig.ts # User profile configuration
+│ ├── commentConfig.ts # Comment system configuration
+│ ├── announcementConfig.ts # Announcement configuration
+│ ├── licenseConfig.ts # License configuration
+│ ├── footerConfig.ts # Footer configuration
+│ ├── FooterConfig.html # Footer HTML content
+│ ├── expressiveCodeConfig.ts # Code highlighting configuration
+│ ├── sakuraConfig.ts # Sakura effect configuration
+│ ├── fontConfig.ts # Font configuration
+│ ├── sidebarConfig.ts # Sidebar layout configuration
+│ ├── navBarConfig.ts # Navbar configuration
+│ ├── musicConfig.ts # Music player configuration
+│ ├── pioConfig.ts # Mascot configuration
+│ ├── adConfig.ts # Ad configuration
+│ ├── friendsConfig.ts # Friend links configuration
+│ ├── sponsorConfig.ts # Sponsor configuration
+│ └── coverImageConfig.ts # Article cover image configuration
+```
+
+
+## ⚙️ Article Frontmatter
+
+```yaml
+---
+title: My First Blog Post
+published: 2023-09-09
+description: This is the first post of my new Astro blog.
+image: ./cover.jpg # Or use "api" to enable random cover images
+tags: [Foo, Bar]
+category: Front-end
+draft: false
+lang: zh-CN # Only set when article language differs from site language in `siteConfig.ts`
+---
+```
+
+## 🧞 Commands
+
+All commands need to be executed in the project root directory:
+
+| Command | Action |
+|:---------------------------|:----------------------------------------------------|
+| `pnpm install` | Install dependencies |
+| `pnpm dev` | Start local development server at `localhost:4321` |
+| `pnpm build` | Build site to `./dist/` |
+| `pnpm preview` | Preview built site locally |
+| `pnpm check` | Check for errors in code |
+| `pnpm format` | Format your code using Biome |
+| `pnpm new-post
+
+
+
+>[!TIP]
+>在重要的布局上,Firefly 创新性地增加了左右双侧边栏、文章网格(多列)布局、瀑布流布局,
+>
+>增加了站点统计、日历组件、文章目录等小组件,让侧边栏更加丰富,
+>
+>同时也保留了 fuwari 的布局,可在配置文件中自由切换。
+>
+>**更多布局配置及演示请查看:[Firefly 布局系统详解](https://firefly.cuteleaf.cn/posts/firefly-layout-system/)**
+
+## ✨ 功能特性
+
+### 核心功能
+
+- [x] **Astro + Tailwind CSS** - 基于现代技术栈的超快静态站点生成
+- [x] **流畅动画** - Swup 页面过渡动画,提供丝滑的浏览体验
+- [x] **响应式设计** - 完美适配桌面端、平板和移动设备
+- [x] **多语言支持** - i18n 国际化,支持简体中文、繁体中文、英文、日文、俄语
+- [x] **全文搜索** - 基于 Pagefind 的客户端搜索,支持文章内容索引。同时支持 MeiliSearch 搜索引擎
+
+### 个性化
+- [x] **侧边栏** - 支持配置单侧边栏、双侧边栏,支持前台自由切换
+- [x] **文章布局** - 支持配置(单列)列表、网格(多列/瀑布流)布局、支持前台自由切换
+- [x] **字体管理** - 支持自定义字体,丰富的字体选择器
+- [x] **页脚配置** - HTML 内容注入,完全自定义
+- [x] **导航栏自定义** - Logo、标题、链接全面自定义
+- [x] **壁纸模式切换** - 横幅壁纸、全屏壁纸、纯色背景,支持前台自由切换
+- [x] **主题色自定义** - 360° 色相调节,支持亮色/暗色/跟随系统三种模式,支持前台自由切换
+
+### 页面组件
+- [x] **留言板** - 支持留言页面,集成评论系统
+- [x] **公告栏** - 顶部公告提示,支持关闭和自定义样式
+- [x] **看板娘** - 支持 Spine 和 Live2D 两种动画引擎
+- [x] **站点统计** - 显示文章、分类、标签数目、文章总字数、运行时长、最后更新时间
+- [x] **站点日历** - 显示当月日历,以及当月的发布文章
+- [x] **赞助页面** - 多种支付方式、收款码展示、赞助者列表、文章内赞助按钮
+- [x] **分享海报** - 支持生成精美的文章分享海报,包含文章摘要、二维码等信息
+- [x] **樱花特效** - 支持樱花特效,全屏樱花效果
+- [x] **友情链接** - 精美的友链展示卡片
+- [x] **广告组件** - 支持自定义侧边栏广告内容
+- [x] **番组计划** - 基于 Bangumi API 的追番和游戏记录展示
+- [x] **评论系统** - 集成 Twikoo、Waline、Giscus、Disqus、Artalk 评论系统
+- [x] **访问量统计** - 支持调用 Waline、Twikoo 自带的访问量追踪
+- [x] **音乐播放器** - 基于 APlayer,支持本地音乐和 Meting API 在线音乐
+
+### 内容增强
+- [x] **图片灯箱** - Fancybox 图片预览功能
+- [x] **浮动目录** - 动态显示文章目录,支持锚点跳转,在侧边栏目录隐藏后显示
+- [x] **邮箱保护** - 让自动化爬虫程序无法直接爬到邮箱地址,被垃圾邮件骚扰
+- [x] **侧边栏目录** - 动态显示文章目录,支持锚点跳转
+- [x] **增强代码块** - 基于 Expressive Code,支持代码折叠、行号、语言标识
+- [x] **数学公式支持** - KaTeX 渲染引擎,支持行内和块级公式
+- [x] **Markdown扩展** - 默认支持[GitHub Flavored Markdown](https://github.github.com/gfm/),还包括了[Admonitions](https://firefly.cuteleaf.cn/posts/markdown-extended/#%E6%8F%90%E9%86%92%E6%A1%86)、[GitHub repository cards](https://firefly.cuteleaf.cn/posts/markdown-extended/#github-%E4%BB%93%E5%BA%93%E5%8D%A1%E7%89%87)、[Expressive Code](http://firefly.cuteleaf.cn/posts/code-examples/)
+- [x] **文章随机封面图** - 支持通过 API 获取随机封面图
+
+### SEO
+- [x] **SEO 优化** - 完整的 meta 标签和结构化数据
+- [x] **RSS 订阅** - 自动生成 RSS Feed
+- [x] **站点地图** - 自动生成 XML Sitemap,支持页面过滤配置
+
+
+## 📝计划中...
+
+- [ ] **重构 Live2D 看板娘**
+- [ ] **持续优化动画流畅度**
+- [ ] 更多功能持续完善中...
+
+如果你有好用的功能和优化,请提交 [Pull Request](https://github.com/CuteLeaf/Firefly/pulls)
+
+## 🚀 快速开始
+
+### 环境要求
+
+- Node.js ≤ 22
+- pnpm ≤ 9
+
+### 本地开发部署
+
+1. **克隆仓库:**
+ ```bash
+ git clone https://github.com/Cuteleaf/Firefly.git
+ cd Firefly
+ ```
+ **先 [Fork](https://github.com/CuteLeaf/Firefly/fork) 到自己仓库在克隆(推荐)**
+ ```bash
+ git clone https://github.com/you-github-name/Firefly.git
+ cd Firefly
+ ```
+3. **安装依赖:**
+ ```bash
+ # 如果没有安装 pnpm,先安装
+ npm install -g pnpm
+
+ # 安装项目依赖
+ pnpm install
+ ```
+
+4. **配置博客:**
+ - 编辑 `src/config/` 目录下的配置文件自定义博客设置
+
+5. **启动开发服务器:**
+ ```bash
+ pnpm dev
+ ```
+ 博客将在 `http://localhost:4321` 可用
+
+### 平台托管部署
+- **参考[官方指南](https://docs.astro.build/zh-cn/guides/deploy/)将博客部署至 Vercel, Netlify, GitHub Pages, Cloudflare Pages, EdgeOne Pages 等。**
+
+ 框架预设: `Astro`
+
+ 根目录: `./`
+
+ 输出目录: `dist`
+
+ 构建命令: `pnpm run build`
+
+ 安装命令: `pnpm install`
+
+
+## 📖 配置说明
+
+> 📚 **详细配置文档**: 查看 [Firefly使用文档](https://docs-firefly.cuteleaf.cn/) 获取完整的配置指南
+
+### 设置网站语言
+
+要设置博客的默认语言,请编辑 `src/config/siteConfig.ts` 文件:
+
+```typescript
+// 定义站点语言
+const SITE_LANG = "zh_CN";
+```
+
+**支持的语言代码:**
+- `zh_CN` - 简体中文
+- `zh_TW` - 繁体中文
+- `en` - 英文
+- `ja` - 日文
+- `ru` - 俄文
+
+
+### 配置文件结构
+
+```
+src/
+├── config/
+│ ├── index.ts # 配置索引文件
+│ ├── siteConfig.ts # 站点基础配置
+│ ├── backgroundWallpaper.ts # 背景壁纸配置
+│ ├── profileConfig.ts # 用户资料配置
+│ ├── commentConfig.ts # 评论系统配置
+│ ├── announcementConfig.ts # 公告配置
+│ ├── licenseConfig.ts # 许可证配置
+│ ├── footerConfig.ts # 页脚配置
+│ ├── FooterConfig.html # 页脚HTML内容
+│ ├── expressiveCodeConfig.ts # 代码高亮配置
+│ ├── sakuraConfig.ts # 樱花特效配置
+│ ├── fontConfig.ts # 字体配置
+│ ├── sidebarConfig.ts # 侧边栏布局配置
+│ ├── navBarConfig.ts # 导航栏配置
+│ ├── musicConfig.ts # 音乐播放器配置
+│ ├── pioConfig.ts # 看板娘配置
+│ ├── adConfig.ts # 广告配置
+│ ├── friendsConfig.ts # 友链配置
+│ ├── sponsorConfig.ts # 赞助配置
+│ └── coverImageConfig.ts # 文章封面图配置
+```
+
+
+## ⚙️ 文章 Frontmatter
+
+```yaml
+---
+title: My First Blog Post
+published: 2023-09-09
+description: This is the first post of my new Astro blog.
+image: ./cover.jpg # 或使用 "api" 来启用随机封面图
+tags: [Foo, Bar]
+category: Front-end
+draft: false
+lang: zh-CN # 仅当文章语言与 `siteConfig.ts` 中的网站语言不同时需要设置
+---
+```
+
+## 🧞 指令
+
+下列指令均需要在项目根目录执行:
+
+| Command | Action |
+|:---------------------------|:----------------------------------------------------|
+| `pnpm install` | 安装依赖 |
+| `pnpm dev` | 在 `localhost:4321` 启动本地开发服务器 |
+| `pnpm build` | 构建网站至 `./dist/` |
+| `pnpm preview` | 本地预览已构建的网站 |
+| `pnpm check` | 检查代码中的错误 |
+| `pnpm format` | 使用Biome格式化您的代码 |
+| `pnpm new-post
+
+
+
+>[!TIP]
+>重要なレイアウトでは、Fireflyは革新的に左右のデュアルサイドバー、記事グリッド(多列)レイアウト、メーソンリーレイアウトを追加し、
+>
+>サイト統計、カレンダーコンポーネント、記事目次などの小さなウィジェットを追加してサイドバーをより豊かにし、
+>
+>同時にfuwariのレイアウトシステムも保持しており、設定ファイルで自由に切り替えられます。
+>
+>**レイアウト設定とデモの詳細については、[Fireflyレイアウトシステム詳細](https://firefly.cuteleaf.cn/posts/firefly-layout-system/)をご覧ください**
+
+## ✨ 機能
+
+### コア機能
+
+- [x] **Astro + Tailwind CSS** - モダンな技術スタックベースの超高速静的サイト生成
+- [x] **スムーズなアニメーション** - Swupページトランジションアニメーションで滑らかなブラウジング体験
+- [x] **レスポンシブデザイン** - デスクトップ、タブレット、モバイルデバイスに完璧に対応
+- [x] **多言語サポート** - i18n国際化、簡体字中国語、繁体字中国語、英語、日本語、ロシア語をサポート
+- [x] **全文検索** - Pagefindベースのクライアントサイド検索、記事コンテンツのインデックスをサポート。MeiliSearch検索エンジンもサポート
+
+### パーソナライゼーション
+- [x] **サイドバー** - シングルサイドバー、デュアルサイドバー設定をサポート、フロントエンドで自由に切り替え可能
+- [x] **記事レイアウト** - リスト(単列)、グリッド(多列/メーソンリー)レイアウトをサポート、フロントエンドで自由に切り替え可能
+- [x] **フォント管理** - カスタムフォントをサポート、豊富なフォントセレクター
+- [x] **フッター設定** - HTMLコンテンツ注入、完全カスタマイズ可能
+- [x] **ナビゲーションバーのカスタマイズ** - ロゴ、タイトル、リンクを完全カスタマイズ
+- [x] **壁紙モード切り替え** - バナー壁紙、フルスクリーン壁紙、単色背景、フロントエンドで自由に切り替え可能
+- [x] **テーマカラーのカスタマイズ** - 360°色相調整、ライト/ダーク/システム追従の3モードをサポート、フロントエンドで自由に切り替え可能
+
+### ページコンポーネント
+- [x] **ゲストブック** - ゲストブックページをサポート、コメントシステム統合
+- [x] **お知らせバー** - トップお知らせ通知、閉じる機能とカスタムスタイルをサポート
+- [x] **マスコット** - SpineとLive2Dの2つのアニメーションエンジンをサポート
+- [x] **サイト統計** - 記事、カテゴリ、タグ数、総文字数、稼働時間、最終更新時刻を表示
+- [x] **サイトカレンダー** - 今月のカレンダーと今月公開された記事を表示
+- [x] **スポンサーページ** - 複数の支払い方法、支払いQRコード、スポンサーリスト、記事内スポンサーボタン
+- [x] **シェアポスター** - 記事の要約やQRコードなどを含む美しい記事シェアポスターの生成をサポート
+- [x] **桜エフェクト** - 桜エフェクトをサポート、フルスクリーン桜アニメーション
+- [x] **友人リンク** - 美しい友人リンク表示カード
+- [x] **広告コンポーネント** - カスタムサイドバー広告コンテンツをサポート
+- [x] **Bangumi** - Bangumi APIベースのアニメとゲーム記録表示
+- [x] **コメントシステム** - Twikoo、Waline、Giscus、Disqus、Artalkコメントシステムを統合
+- [x] **訪問者数統計** - Waline、Twikoo組み込みの訪問追跡を呼び出し可能
+- [x] **音楽プレーヤー** - APlayerベース、ローカル音楽とMeting APIオンライン音楽をサポート
+
+### コンテンツ拡張
+- [x] **画像ライトボックス** - Fancybox画像プレビュー機能
+- [x] **フローティング目次** - 記事の目次を動的に表示、アンカージャンプをサポート、サイドバー目次非表示時に表示
+- [x] **メールアドレス保護** - 自動クローラーによるメールアドレスの収集を防ぎ、スパムメールを回避
+- [x] **サイドバー目次** - 記事の目次を動的に表示、アンカージャンプをサポート
+- [x] **強化されたコードブロック** - Expressive Codeベース、コード折りたたみ、行番号、言語識別をサポート
+- [x] **数式サポート** - KaTeXレンダリングエンジン、インラインとブロック数式をサポート
+- [x] **Markdown拡張** - [Markdown拡張機能](https://github.com/saicaca/fuwari?tab=readme-ov-file#-markdown-extended-syntax)、[Admonitions](https://firefly.cuteleaf.cn/posts/markdown-extended/#%E6%8F%90%E9%86%92%E6%A1%86)、[GitHubリポジトリカード](https://firefly.cuteleaf.cn/posts/markdown-extended/#github-%E4%BB%93%E5%BA%93%E5%8D%A1%E7%89%87)、[Expressive Code](http://firefly.cuteleaf.cn/posts/code-examples/)も含まれています
+- [x] **ランダムカバー画像** - APIを介してランダムカバー画像の取得をサポート
+
+### SEO
+- [x] **SEO最適化** - 完全なメタタグと構造化データ
+- [x] **RSS購読** - RSSフィードを自動生成
+- [x] **サイトマップ** - XMLサイトマップを自動生成、ページフィルタリング設定をサポート
+
+
+## 📝 予定...
+
+- [ ] **Live2Dマスコットのリファクタリング**
+- [ ] **アニメーションの滑らかさの継続的な最適化**
+- [ ] より多くの機能が継続的に改善中...
+
+便利な機能や最適化があれば、[Pull Request](https://github.com/CuteLeaf/Firefly/pulls)を提出してください
+
+## 🚀 クイックスタート
+
+### 環境要件
+
+- Node.js ≤ 22
+- pnpm ≤ 9
+
+### ローカル開発
+
+1. **リポジトリのクローン:**
+ ```bash
+ git clone https://github.com/Cuteleaf/Firefly.git
+ cd Firefly
+ ```
+ **まず自分のリポジトリに[Fork](https://github.com/CuteLeaf/Firefly/fork)してからクローン(推奨)**
+ ```bash
+ git clone https://github.com/you-github-name/Firefly.git
+ cd Firefly
+ ```
+3. **依存関係のインストール:**
+ ```bash
+ # pnpmがインストールされていない場合、まずインストール
+ npm install -g pnpm
+
+ # プロジェクトの依存関係をインストール
+ pnpm install
+ ```
+
+4. **ブログの設定:**
+ - `src/config/`ディレクトリ内の設定ファイルを編集してブログをカスタマイズ
+
+5. **開発サーバーの起動:**
+ ```bash
+ pnpm dev
+ ```
+ ブログは`http://localhost:4321`で利用可能になります
+
+### プラットフォームホスティングデプロイ
+- **[公式ガイド](https://docs.astro.build/ja/guides/deploy/)を参照して、Vercel、Netlify、GitHub Pages、Cloudflare Pages、EdgeOne Pagesなどにブログをデプロイしてください。**
+
+ フレームワークプリセット: `Astro`
+
+ ルートディレクトリ: `./`
+
+ 出力ディレクトリ: `dist`
+
+ ビルドコマンド: `pnpm run build`
+
+ インストールコマンド: `pnpm install`
+
+## 📖 設定説明
+
+> 📚 **詳細な設定ドキュメント**:[Fireflyドキュメント](https://docs-firefly.cuteleaf.cn/)で完全な設定ガイドを確認してください
+
+### ウェブサイトの言語設定
+
+ブログのデフォルト言語を設定するには、`src/config/siteConfig.ts`ファイルを編集します:
+
+```typescript
+// サイト言語を定義
+const SITE_LANG = "zh_CN";
+```
+
+**サポートされている言語コード:**
+- `zh_CN` - 簡体字中国語
+- `zh_TW` - 繁体字中国語
+- `en` - 英語
+- `ja` - 日本語
+- `ru` - ロシア語
+
+
+### 設定ファイル構造
+
+```
+src/
+├── config/
+│ ├── index.ts # 設定インデックスファイル
+│ ├── siteConfig.ts # サイト基本設定
+│ ├── backgroundWallpaper.ts # 背景壁紙設定
+│ ├── profileConfig.ts # ユーザープロフィール設定
+│ ├── commentConfig.ts # コメントシステム設定
+│ ├── announcementConfig.ts # お知らせ設定
+│ ├── licenseConfig.ts # ライセンス設定
+│ ├── footerConfig.ts # フッター設定
+│ ├── FooterConfig.html # フッターHTMLコンテンツ
+│ ├── expressiveCodeConfig.ts # コードハイライト設定
+│ ├── sakuraConfig.ts # 桜エフェクト設定
+│ ├── fontConfig.ts # フォント設定
+│ ├── sidebarConfig.ts # サイドバーレイアウト設定
+│ ├── navBarConfig.ts # ナビゲーションバー設定
+│ ├── musicConfig.ts # 音楽プレーヤー設定
+│ ├── pioConfig.ts # マスコット設定
+│ ├── adConfig.ts # 広告設定
+│ ├── friendsConfig.ts # 友人リンク設定
+│ ├── sponsorConfig.ts # スポンサー設定
+│ └── coverImageConfig.ts # 記事カバー画像設定
+```
+
+
+## ⚙️ 記事のFrontmatter
+
+```yaml
+---
+title: My First Blog Post
+published: 2023-09-09
+description: This is the first post of my new Astro blog.
+image: ./cover.jpg # または「api」を使用してランダムカバー画像を有効化
+tags: [Foo, Bar]
+category: Front-end
+draft: false
+lang: zh-CN # 記事の言語が`siteConfig.ts`のサイト言語と異なる場合のみ設定
+---
+```
+
+## 🧞 コマンド
+
+すべてのコマンドはプロジェクトルートディレクトリで実行する必要があります:
+
+| Command | Action |
+|:---------------------------|:----------------------------------------------------|
+| `pnpm install` | 依存関係をインストール |
+| `pnpm dev` | `localhost:4321`でローカル開発サーバーを起動 |
+| `pnpm build` | `./dist/`にサイトをビルド |
+| `pnpm preview` | ビルドされたサイトをローカルでプレビュー |
+| `pnpm check` | コード内のエラーをチェック |
+| `pnpm format` | Biomeを使用してコードをフォーマット |
+| `pnpm new-post
+
+
+
+>[!TIP]
+>В важных макетах Firefly инновационно добавляет двойные боковые панели, сеточный макет статей (многоколонный), макет Masonry,
+>
+>Включает статистику сайта, календарный компонент, оглавление статей и другие виджеты для обогащения боковой панели,
+>
+>При этом сохраняется система макетов fuwari, свободно переключаемая в конфигурационном файле.
+>
+>**Подробнее о настройках макета и демонстрациях см.: [Детали системы макетов Firefly](https://firefly.cuteleaf.cn/posts/firefly-layout-system/)**
+
+## ✨ Возможности
+
+### Основные функции
+
+- [x] **Astro + Tailwind CSS** - Сверхбыстрая генерация статических сайтов на основе современного технологического стека
+- [x] **Плавная анимация** - Анимация переходов между страницами Swup для шелковисто-плавного просмотра
+- [x] **Адаптивный дизайн** - Идеальная адаптация для настольных компьютеров, планшетов и мобильных устройств
+- [x] **Многоязычная поддержка** - Интернационализация i18n, поддержка упрощенного китайского, традиционного китайского, английского, японского, русского
+- [x] **Полнотекстовый поиск** - Клиентский поиск на основе Pagefind, поддержка индексации содержимого статей. Также поддержка поисковой системы MeiliSearch
+
+### Персонализация
+- [x] **Боковая панель** - Поддержка одиночной и двойной боковой панели, свободное переключение на фронтенде
+- [x] **Макет статей** - Поддержка списка (один столбец) и сетки (многоколонный/Masonry), свободное переключение на фронтенде
+- [x] **Управление шрифтами** - Поддержка пользовательских шрифтов с богатым выбором шрифтов
+- [x] **Настройка подвала** - Внедрение HTML-контента, полная настраиваемость
+- [x] **Настройка навигации** - Логотип, заголовок, ссылки полностью настраиваются
+- [x] **Переключение режимов обоев** - Баннерные обои, полноэкранные обои, однотонный фон, свободное переключение на фронтенде
+- [x] **Настройка цвета темы** - Регулировка оттенка на 360°, поддержка светлого/темного/системного режимов, свободное переключение на фронтенде
+
+### Компоненты страницы
+- [x] **Гостевая книга** - Поддержка страницы гостевой книги с интегрированной системой комментариев
+- [x] **Панель объявлений** - Верхнее уведомление с объявлениями, поддержка закрытия и пользовательских стилей
+- [x] **Маскот** - Поддержка двух анимационных движков: Spine и Live2D
+- [x] **Статистика сайта** - Отображение количества статей, категорий, тегов, общего количества слов, времени работы, времени последнего обновления
+- [x] **Календарь сайта** - Отображение календаря текущего месяца и опубликованных статей за месяц
+- [x] **Страница спонсоров** - Несколько способов оплаты, QR-коды для платежей, список спонсоров, кнопка спонсорства в статьях
+- [x] **Постер для публикации** - Поддержка создания красивых постеров для публикации статей, содержащих краткое содержание статьи, QR-код и т.д.
+- [x] **Эффект сакуры** - Поддержка эффекта сакуры, полноэкранная анимация сакуры
+- [x] **Дружественные ссылки** - Красивые карточки отображения дружественных ссылок
+- [x] **Рекламный компонент** - Поддержка пользовательского рекламного контента на боковой панели
+- [x] **Bangumi** - Отображение отслеживания аниме и игр на основе Bangumi API
+- [x] **Система комментариев** - Интеграция систем комментариев Twikoo, Waline, Giscus, Disqus, Artalk
+- [x] **Счетчик посещений** - Поддержка вызова встроенного отслеживания посещений Waline, Twikoo
+- [x] **Музыкальный плеер** - На основе APlayer, поддержка локальной музыки и онлайн-музыки через Meting API
+
+### Улучшение контента
+- [x] **Лайтбокс изображений** - Функция предварительного просмотра изображений Fancybox
+- [x] **Плавающее оглавление** - Динамическое отображение оглавления статьи, поддержка якорных переходов, показывается при скрытии оглавления боковой панели
+- [x] **Защита электронной почты** - Предотвращает сбор адресов электронной почты автоматическими сканерами во избежание спама
+- [x] **Оглавление боковой панели** - Динамическое отображение оглавления статьи, поддержка якорных переходов
+- [x] **Улучшенные блоки кода** - На основе Expressive Code, поддержка сворачивания кода, номеров строк, идентификации языка
+- [x] **Поддержка математических формул** - Движок рендеринга KaTeX, поддержка встроенных и блочных формул
+- [x] **Расширения Markdown** - [Расширенные возможности Markdown](https://github.com/saicaca/fuwari?tab=readme-ov-file#-markdown-extended-syntax), также включает [Admonitions](https://firefly.cuteleaf.cn/posts/markdown-extended/#%E6%8F%90%E9%86%92%E6%A1%86), [карточки репозиториев GitHub](https://firefly.cuteleaf.cn/posts/markdown-extended/#github-%E4%BB%93%E5%BA%93%E5%8D%A1%E7%89%87), [Expressive Code](http://firefly.cuteleaf.cn/posts/code-examples/)
+- [x] **Случайные обложки статей** - Поддержка получения случайных обложек через API
+
+### SEO
+- [x] **SEO-оптимизация** - Полные мета-теги и структурированные данные
+- [x] **RSS-лента** - Автоматическая генерация RSS-ленты
+- [x] **Карта сайта** - Автоматическая генерация XML-карты сайта с настройкой фильтрации страниц
+
+
+## 📝 Планы...
+
+- [ ] **Рефакторинг маскота Live2D**
+- [ ] **Непрерывная оптимизация плавности анимации**
+- [ ] Больше функций в разработке...
+
+Если у вас есть полезные функции и оптимизации, пожалуйста, отправьте [Pull Request](https://github.com/CuteLeaf/Firefly/pulls)
+
+## 🚀 Быстрый старт
+
+### Требования
+
+- Node.js ≤ 22
+- pnpm ≤ 9
+
+### Локальная разработка
+
+1. **Клонировать репозиторий:**
+ ```bash
+ git clone https://github.com/Cuteleaf/Firefly.git
+ cd Firefly
+ ```
+ **Сначала создайте [Fork](https://github.com/CuteLeaf/Firefly/fork) в свой репозиторий, затем клонируйте (рекомендуется)**
+ ```bash
+ git clone https://github.com/you-github-name/Firefly.git
+ cd Firefly
+ ```
+3. **Установить зависимости:**
+ ```bash
+ # Установите pnpm, если еще не установлен
+ npm install -g pnpm
+
+ # Установить зависимости проекта
+ pnpm install
+ ```
+
+4. **Настроить блог:**
+ - Отредактируйте конфигурационные файлы в каталоге `src/config/` для настройки блога
+
+5. **Запустить сервер разработки:**
+ ```bash
+ pnpm dev
+ ```
+ Блог будет доступен по адресу `http://localhost:4321`
+
+### Развертывание на платформе хостинга
+- **См. [официальное руководство](https://docs.astro.build/ru/guides/deploy/) для развертывания блога на Vercel, Netlify, GitHub Pages, Cloudflare Pages, EdgeOne Pages и т.д.**
+
+ Пресет фреймворка: `Astro`
+
+ Корневой каталог: `./`
+
+ Каталог вывода: `dist`
+
+ Команда сборки: `pnpm run build`
+
+ Команда установки: `pnpm install`
+
+## 📖 Настройка
+
+> 📚 **Подробная документация по настройке**: См. [документацию Firefly](https://docs-firefly.cuteleaf.cn/) для полного руководства по настройке
+
+### Установка языка сайта
+
+Чтобы установить язык по умолчанию для вашего блога, отредактируйте файл `src/config/siteConfig.ts`:
+
+```typescript
+// Определить язык сайта
+const SITE_LANG = "zh_CN";
+```
+
+**Поддерживаемые коды языков:**
+- `zh_CN` - Упрощенный китайский
+- `zh_TW` - Традиционный китайский
+- `en` - Английский
+- `ja` - Японский
+- `ru` - Русский
+
+
+### Структура конфигурационных файлов
+
+```
+src/
+├── config/
+│ ├── index.ts # Индексный файл конфигурации
+│ ├── siteConfig.ts # Базовая конфигурация сайта
+│ ├── backgroundWallpaper.ts # Конфигурация фоновых обоев
+│ ├── profileConfig.ts # Конфигурация профиля пользователя
+│ ├── commentConfig.ts # Конфигурация системы комментариев
+│ ├── announcementConfig.ts # Конфигурация объявлений
+│ ├── licenseConfig.ts # Конфигурация лицензии
+│ ├── footerConfig.ts # Конфигурация подвала
+│ ├── FooterConfig.html # HTML-контент подвала
+│ ├── expressiveCodeConfig.ts # Конфигурация подсветки кода
+│ ├── sakuraConfig.ts # Конфигурация эффекта сакуры
+│ ├── fontConfig.ts # Конфигурация шрифтов
+│ ├── sidebarConfig.ts # Конфигурация макета боковой панели
+│ ├── navBarConfig.ts # Конфигурация навигационной панели
+│ ├── musicConfig.ts # Конфигурация музыкального плеера
+│ ├── pioConfig.ts # Конфигурация маскота
+│ ├── adConfig.ts # Конфигурация рекламы
+│ ├── friendsConfig.ts # Конфигурация дружественных ссылок
+│ ├── sponsorConfig.ts # Конфигурация спонсоров
+│ └── coverImageConfig.ts # Конфигурация обложек статей
+```
+
+
+## ⚙️ Frontmatter статьи
+
+```yaml
+---
+title: My First Blog Post
+published: 2023-09-09
+description: This is the first post of my new Astro blog.
+image: ./cover.jpg # Или используйте "api" для включения случайных обложек
+tags: [Foo, Bar]
+category: Front-end
+draft: false
+lang: zh-CN # Устанавливайте только если язык статьи отличается от языка сайта в `siteConfig.ts`
+---
+```
+
+## 🧞 Команды
+
+Все команды должны выполняться в корневом каталоге проекта:
+
+| Команда | Действие |
+|:---------------------------|:----------------------------------------------------|
+| `pnpm install` | Установить зависимости |
+| `pnpm dev` | Запустить локальный сервер разработки на `localhost:4321` |
+| `pnpm build` | Собрать сайт в `./dist/` |
+| `pnpm preview` | Локальный предварительный просмотр собранного сайта |
+| `pnpm check` | Проверить код на наличие ошибок |
+| `pnpm format` | Отформатировать код с помощью Biome |
+| `pnpm new-post
+
+
+
+>[!TIP]
+>在重要的版面配置上,Firefly創新性地增加了左右雙側邊欄、文章網格(多列)版面配置,
+>
+>增加了站點統計、日曆元件、文章目錄等小元件,讓側邊欄更加豐富,
+>
+>同時也保留了 fuwari 的版面配置系統,可在配置檔案中自由切換。
+>
+>**更多版面配置及示範請查看:[Firefly 版面配置系統詳解](https://firefly.cuteleaf.cn/posts/firefly-layout-system/)**
+
+## ✨ 功能特性
+
+### 核心功能
+
+- [x] **Astro + Tailwind CSS** - 基於現代技術堆疊的超快靜態站點生成
+- [x] **流暢動畫** - Swup 頁面過渡動畫,提供絲滑的瀏覽體驗
+- [x] **響應式設計** - 完美適配桌面端、平板和行動裝置
+- [x] **多語言支援** - i18n 國際化,支援簡體中文、繁體中文、英文、日文、俄語
+- [x] **全文搜尋** - 基於 Pagefind 的客戶端搜尋,支援文章內容索引。同時支援 MeiliSearch 搜尋引擎
+
+### 個性化
+- [x] **側邊欄** - 支援配置單側邊欄、雙側邊欄,支援前台自由切換
+- [x] **文章版面配置** - 支援配置(單列)列表、網格(多列/瀑布流)版面配置,支援前台自由切換
+- [x] **字型管理** - 支援自訂字型,豐富的字型選擇器
+- [x] **頁尾配置** - HTML 內容注入,完全自訂
+- [x] **導覽列自訂** - Logo、標題、連結全面自訂
+- [x] **桌布模式切換** - 橫幅桌布、全螢幕桌布、純色背景,支援前台自由切換
+- [x] **主題色自訂** - 360° 色相調節,支援亮色/暗色/跟隨系統三種模式,支援前台自由切換
+
+### 頁面元件
+- [x] **留言板** - 支援留言頁面,整合留言系統
+- [x] **公告欄** - 頂部公告提示,支援關閉和自訂樣式
+- [x] **看板娘** - 支援 Spine 和 Live2D 兩種動畫引擎
+- [x] **站點統計** - 顯示文章、分類、標籤數目、文章總字數、執行時長、最後更新時間
+- [x] **站點日曆** - 顯示當月日曆,以及當月的發布文章
+- [x] **贊助頁面** - 多種支付方式、收款碼展示、贊助者列表、文章內贊助按鈕
+- [x] **分享海報** - 支援生成精美的文章分享海報,包含文章摘要、二維碼等資訊
+- [x] **櫻花特效** - 支援櫻花特效,全螢幕櫻花效果
+- [x] **友情連結** - 精美的友鏈展示卡片
+- [x] **廣告元件** - 支援自訂側邊欄廣告內容
+- [x] **番組計畫** - 基於 Bangumi API 的追番和遊戲記錄展示
+- [x] **留言系統** - 整合 Twikoo、Waline、Giscus、Disqus、Artalk 留言系統
+- [x] **訪問量統計** - 支援呼叫 Waline、Twikoo 自帶的訪問量追蹤
+- [x] **音樂播放器** - 基於 APlayer,支援本地音樂和 Meting API 線上音樂
+
+### 內容增強
+- [x] **圖片燈箱** - Fancybox 圖片預覽功能
+- [x] **浮動目錄** - 動態顯示文章目錄,支援錨點跳轉,在側邊欄目錄隱藏後顯示
+- [x] **信箱保護** - 讓自動化爬蟲程式無法直接爬取信箱地址,避免垃圾郵件騷擾
+- [x] **側邊欄目錄** - 動態顯示文章目錄,支援錨點跳轉
+- [x] **增強程式碼區塊** - 基於 Expressive Code,支援程式碼摺疊、行號、語言標識
+- [x] **數學公式支援** - KaTeX 渲染引擎,支援行內和區塊級公式
+- [x] **Markdown擴充** - 預設支援[GitHub Flavored Markdown](https://github.github.com/gfm/),還包括了[Admonitions](https://firefly.cuteleaf.cn/posts/markdown-extended/#%E6%8F%90%E9%86%92%E6%A1%86)、[GitHub repository cards](https://firefly.cuteleaf.cn/posts/markdown-extended/#github-%E4%BB%93%E5%BA%93%E5%8D%A1%E7%89%87)、[Expressive Code](http://firefly.cuteleaf.cn/posts/code-examples/)
+- [x] **文章隨機封面圖** - 支援透過 API 獲取隨機封面圖
+
+### SEO
+- [x] **SEO 優化** - 完整的 meta 標籤和結構化資料
+- [x] **RSS 訂閱** - 自動生成 RSS Feed
+- [x] **站點地圖** - 自動生成 XML Sitemap,支援頁面篩選配置
+
+
+## 📝計畫中...
+
+- [ ] **重構 Live2D 看板娘**
+- [ ] **持續優化動畫流暢度**
+- [ ] 更多功能持續完善中...
+
+如果你有好用的功能和優化,請提交 [Pull Request](https://github.com/CuteLeaf/Firefly/pulls)
+
+## 🚀 快速開始
+
+### 環境要求
+
+- Node.js ≤ 22
+- pnpm ≤ 9
+
+### 本地開發部署
+
+1. **克隆儲存庫:**
+ ```bash
+ git clone https://github.com/Cuteleaf/Firefly.git
+ cd Firefly
+ ```
+ **先 [Fork](https://github.com/CuteLeaf/Firefly/fork) 到自己儲存庫再克隆(推薦)**
+ ```bash
+ git clone https://github.com/you-github-name/Firefly.git
+ cd Firefly
+ ```
+3. **安裝依賴:**
+ ```bash
+ # 如果沒有安裝 pnpm,先安裝
+ npm install -g pnpm
+
+ # 安裝專案依賴
+ pnpm install
+ ```
+
+4. **配置部落格:**
+ - 編輯 `src/config/` 目錄下的配置檔案自訂部落格設定
+
+5. **啟動開發伺服器:**
+ ```bash
+ pnpm dev
+ ```
+ 部落格將在 `http://localhost:4321` 可用
+
+### 平台託管部署
+- **參考[官方指南](https://docs.astro.build/zh-cn/guides/deploy/)將部落格部署至 Vercel, Netlify, GitHub Pages, Cloudflare Pages, EdgeOne Pages 等。**
+
+ 框架預設: `Astro`
+
+ 根目錄: `./`
+
+ 輸出目錄: `dist`
+
+ 建置命令: `pnpm run build`
+
+ 安裝命令: `pnpm install`
+
+## 📖 配置說明
+
+> 📚 **詳細配置文檔**: 查看 [Firefly使用文檔](https://docs-firefly.cuteleaf.cn/) 獲取完整的配置指南
+
+### 設定網站語言
+
+要設定部落格的預設語言,請編輯 `src/config/siteConfig.ts` 檔案:
+
+```typescript
+// 定義站點語言
+const SITE_LANG = "zh_CN";
+```
+
+**支援的語言代碼:**
+- `zh_CN` - 簡體中文
+- `zh_TW` - 繁體中文
+- `en` - 英文
+- `ja` - 日文
+- `ru` - 俄文
+
+
+### 配置檔案結構
+
+```
+src/
+├── config/
+│ ├── index.ts # 配置索引檔案
+│ ├── siteConfig.ts # 站點基礎配置
+│ ├── backgroundWallpaper.ts # 背景桌布配置
+│ ├── profileConfig.ts # 使用者資料配置
+│ ├── commentConfig.ts # 留言系統配置
+│ ├── announcementConfig.ts # 公告配置
+│ ├── licenseConfig.ts # 授權配置
+│ ├── footerConfig.ts # 頁尾配置
+│ ├── FooterConfig.html # 頁尾HTML內容
+│ ├── expressiveCodeConfig.ts # 程式碼高亮配置
+│ ├── sakuraConfig.ts # 櫻花特效配置
+│ ├── fontConfig.ts # 字型配置
+│ ├── sidebarConfig.ts # 側邊欄版面配置配置
+│ ├── navBarConfig.ts # 導覽列配置
+│ ├── musicConfig.ts # 音樂播放器配置
+│ ├── pioConfig.ts # 看板娘配置
+│ ├── adConfig.ts # 廣告配置
+│ ├── friendsConfig.ts # 友鏈配置
+│ ├── sponsorConfig.ts # 贊助配置
+│ └── coverImageConfig.ts # 文章隨機封面圖配置
+```
+
+
+## ⚙️ 文章 Frontmatter
+
+```yaml
+---
+title: My First Blog Post
+published: 2023-09-09
+description: This is the first post of my new Astro blog.
+image: ./cover.jpg # 或使用 "api" 來啟用隨機封面圖
+tags: [Foo, Bar]
+category: Front-end
+draft: false
+lang: zh-CN # 僅當文章語言與 `siteConfig.ts` 中的網站語言不同時需要設定
+---
+```
+
+## 🧞 指令
+
+下列指令均需要在專案根目錄執行:
+
+| Command | Action |
+|:---------------------------|:----------------------------------------------------|
+| `pnpm install` | 安裝依賴 |
+| `pnpm dev` | 在 `localhost:4321` 啟動本地開發伺服器 |
+| `pnpm build` | 建置網站至 `./dist/` |
+| `pnpm preview` | 本地預覽已建置的網站 |
+| `pnpm check` | 檢查程式碼中的錯誤 |
+| `pnpm format` | 使用 Biome 格式化您的程式碼 |
+| `pnpm new-post HnN297o;S@(JGLSs3u27BNAs5<>(xfKC{vHvK3nV~lC(XzOAtNHfE|BM%3up7WRv=R& zKh+P?nvbq2S90+%tq!gS9@^eA<0@Bd-VtP1<{Ui-)7s|L8%BvtcE6GGn2roF94-w2 ztR$V^i1w|XgFfN{^M5|fUCey|fjiZ}DMc?Yue)!bMnMFL3yCuWu~UB{5Gp80oxlTU zd0PF-H2y|kHf*5j5Gro5K-gu@)qV^iMs5I`zuxUM3%I2^G1?4U92n#Hi~a0aGYYj} zfXnXCn(XLjOsNjYP`lJjqRX{i5m62~sk4$GR`}M&@u=}0utNUpb30sqrbWb8es3K$ zZ|TD>g$i6Xw98BfC40}=@%|2?Qtu|Ee7DE3M#C}pFZms|Z>9OCl4usHO?4{aoo-tC zQz=6g!#&8#ca&3GZs_XLs;2A^&WUZ#a_0P^Rs au_?-|KBYk9|f!W_~-l;I|*x*Jt ztmewd^5!U8sn1T2Tpk$71Hdm`)Mx|oE$K}c==QmxYy^lWbv3iDu7|+Wv-A`5R-9 $o_ILu8Bf2l+|Cfu!@&5swY5E%i+>cVQ^-kL$=#gW{s94lT{ z{wI%v-$5LORbt#HpQB?wy2oSnSF)!5y8nt%S2`|T-@W;x;Aw>Gv8?-mqJNN@N~3X$ zNyW?a-BIa 2hV!+f)axtMo!Fg%<7 8tOi4puA#aLYC}6^!!tNwr?wnnh_sdp`IrgXEW(HGTYMG1d$7x8){O zj^3Pme8k~kQ_kq9xsNHgS~C(&&UL33C?AxgS9s0X6 zH6H7r__Y&@*tGW!@;6>hmUM$>uzXkqpIiQFab!8@d|@0S+>&+v`wr7skW#LvL}h3k zO)Vd7*zu@y!cA=UaU?3ikQr08YTRfd@Rz}Jr7fwNhmTxCPz|apqH)?UfuwmTui`j3 z#;E9Zv0P!WHDAUvS8 Nki3+o=Y>H)+?OYmvK zj$cpwpR7;25m&NEgp(_kH(Vd#U$_>GThwM453|EWzoCXpj3(KYu|3=!>q^tD`mTw+ zl|i)JW@P7o1=xfDa`zVFt;0{&l?-r^+__i}%R8A~Wl)#Al`hf9Af5)^4%9s$Q34{; z7lkgub+EwV=DX#42T)+x!^L_qYO}=oLo9meM6!Pz<8>dTd@H{_@$I`zR>u#g7(&Q> zThQpXW#*1UWI~b{oV1r(&OhR0+WQihLoFRfNtC4=eWaKrrO2*^=Tz#rWUx)8$Bqys zZJmXKlp_vR9Y!7Ssp+uKqRcK8)l ( X;_U&PGjVW!24@ z?b@2=rnAfSN;HPf7`YxNrhHuX*PGkA5(A8<5q);yx1Qj^Xif2!Y`&qhnLApDND;PW zC3>9gA77%X-hOkP3A{k$oNiM>8%l7?lF@(57?H*d!ZZiGI1SQBb<&UE&4V&Gu{>M9 zEU4BO)4O}~6eV^~0dw_ss7v4 -kJ{8`UM z7+zE+lF_t`izLg`)y6|LQ!q0sg?-!+19Wt0y8u15%xUM?+!6o#o7N8D#C1Dk^Y;tg z3t?uz4lcZ1*aWESo7~R3apO$qq1$hhZr`k^HljaFi<~f`)-36Z>0le~Yns}rFwvrS zlqYRlj5E?bczts!<_7C4Wurwl^?;H2qFnZ%2(9~PfyX=MhWXF(KvkQMpZyIjYazH2 z-ybaO2cy5*bs1 f5>cSSx9Gp2HTj~zqU#rKm45mp>uc; zj!1rj^8Hg(FA0Ozd3D~<;_NnX{@LN&|DEZWYAyDy`14y}32P)DerpBEoP3};EE0O} z5L3a@?-M3jG#Zl1mAqQ`0OqH5jrn%s_#(PoeWEk4Phj+eQ>6d`&ObaMkUOW1AQmUR z$MnYWlQ+||$jkZ1tO9}o+ ctzDUH2%Y`7`Msbs5S^X?R7()Jk9LRR_Q|@a zxc8M9ny%)6idzboT3`?7T#nt+O$3|X-y!gg)7yyofvlYKD8y4$puf2V2i8hk&11ph z2No@C8d|SR7?q<#8zv@_)j7e-q-9p!0QVO70kJs^S1sd?1x`NOACd4?jcZ;Ohc}XP zFq*N%p5)+3qDJRmp55?S9st0KU{MP{v)&E*>h^IlR$LQA7QYny&XpSXlQdt0e`&;O z(Kh%xe)BBA%!RN*H}Pq5Mr$0atQN7DAsz}q3Sa*g772WgkAk$8tKXo`Whz}-m9{&? zD){wKzLLK#zW$k6+LqYA*b8qa=!oFAv@r$wJHa|128Tt%i#R>R=>$R#hLaq|mU#$) z4*m-!y4Ilj^{#U$R<04zDWA*q5ri~>Vq{&O@rH~{mu-QkUe@5jfl PkHwY-MP%SMS)&c_VY9IjezzU3lwq*x7LHs;p|b9vbg#n#>zvK zuSTjz`L(}@uQN-4*G(|P7p}WuR8W>|TIyCmy*(2!F|I|Eiz1yrUC9PIZA<7089kEh zVu#F4bycIlPERy>(v{hJvkiChwVLdSsFH>_x^@r(=!LDZ$SK0EK|&+=rk79KlVEQ$ z-n!4ZaPMl|3fnO4pLYyAkpK5#*7jxgs2PSFc|~v;CZg_PM-EwMRwo0yt;eb?HF1p8 zXC;)E#wPJa`tSKm73|3Lp##}3DyD0Llm0`yI_*2!tA{HC @5$PWsj?nkFENz+ z&Adh%3cJ(tM4w?OseQ-HAY1HOp;#~_T2EEt^^bD{{^KmKoVvEmsb_g59 zHd |_%az^x=Ihx)SxKIIYCc|yq{vY{9~3c}SrQR9+e@=5(>T(R8OTtA&jNZ+qe zLVSQYW5wBwe}A8eBR8uss3(e_2%s5Y5B42>E;PnJ->N1LwCf!`NgT$!vv+n|yy9ki zGRXarzlC)~bs$6k_A772$=W5(dFW6TokkJc94(S2!q#dwJfU`dL{$tv_&%mrn<$PE zzTrKxm0-@ieg-S0_?*cZ={KC=iDnUEaA)_J`QzHQLkTO%s%im2`aGwAU3!bree^B| zt5|V^#P20p*0Z2Ii@+O14T2JO+vt=&1m?2Si`EJ;9OA@Q<{t0o$h;`-zwADkrw%wj zv1v~Zea<^aQLv3FTtiu+#Ce4&tDBo!{BDMW*b7+Hx{DTn_D}PbS6Py?DZeBC`Fw#Y zIq{wCKK1crLvMZaX6%%6Z<5gEsQz-BqGrIOKP^y7ajBP1SN`_Dx$?_D^jJ1%Ex8~n z!fe)MIk(b@q(u>w3Ye2gMv}>HJc4N#5FYAEW%`tB{gBN1G^9915mG32h83uG86-DL z3Mf;3+{;qzsG1QN$vBj(8P|s7td?TA jTTLT5|qdeZdMDgEyN5gu){_V>8r;)S!+6E$8D4bVlkhfF*n0I z=H7Y$+HcLYuq0jh{lv)eG_+3oFOUdkPA*GgzrkJK82v8(NQc-LTPaXkBBBTtvyL_O zd+Lye#GXg$j%%^D%Rlj;+h^%#oSMrNNuwH_z3>GzquCK}WW9Ym>WZGFqLoUQ$S!wy zm)oL6!!nua4IqpR*YQkNS}SbfOAYN>5D %FDk<&wFnA2-+@H$lAlXzQ z$$581{nj@;@?QRQVV7G~+ep!>2!zF(d<}#ZY!s(jx4-zdWq#NZjN!?bMg^?TTC06V zQ;96?#KA}PLBlj2{`(R3^_#Zr9Bhky>I~#CYCjQzO*{0**A$+I1x>P!Wm62;Zsgs8 zFeh5&fl` @fSVHb)j&C73B!AFUcl!z3=VGe}o6x|LeKr5T?MWoAXu}4mFPmV>w zbM62j%`(4WQa(Z|5lKIPPTU-0!q;bFPNkLa1uGQvt(>>c+;A%Khkqs-Mh6j0kx1 )EgAGpM-bD=@2+^b7+UF74DaoLR|EuDXZwSk z?$D6+tNtG?67Nk8`vOK_js5r>;#cbQIzH`VhRL`YijHgVB47@2LR0XXMbAWy7I1@&U3vjOaRf1b1L;{SWBEEiMoZCS>HCg zzjev@1= phB>lu(`L*7@CzC6OSXiOl@o~zZU9#n+iRgj^lvtXl zw!BaBgI2p>MZ++`^!gE0J@%y##e6WQ;Bhcpp_-tQdfnj0Zk7d6x&iKqM>qVb>FlCs z6vq~DrZ`{Ss8ywQc@ECme!gL%kg@M!AQWl5Q+m)VvHH9aGnXdVjOVFyNrsmloWuPh zq|pTb13&f5?OC-B%m4b1b<<+L!%M4R!%w)X;+av8m=#NQluqNEiAccRmJ5RtNqD~W*v-`#Uf4iL$ zu-1P5IJg&4)AFVtYYLCAKgu<)HROy$3nW(Zw)ahY1O?44eakCS8*>((L8m|Ga$IlA zHA2PGHs`IKUDT*G_BnQopU{1Ccw9S~)uFgZS8A5QO)mQBQCY2~h$5e|xM@Mk+X-9i z6pa?SHAl9`;;veX*^J))2eDo#4@e;199tAGarvfODyaOW*}g+Oy%ml%WH{)MZ?VGh zbVcCglvrX>R^1SuE&;3Pv;M14V#z4LNWfE2hVMWpta)%#5lkniOX2EA3ilikp=az! zj|jW-jO6WJ>Z1Ya%lxF1$p@B%g7hk8G)s{;m=Uh4zyP^pd^*AFvCf5n8qNSzvsR$k z&_Qy)X9va7wayH-g#VCaS0)(-VU#6oNxIb}WPwagc3uG66O%X7OFIYPn_yta+y@(7 zReEJbSTttFW|)MTaK0V37P&(DeyfAC81WKFTAOy =&7K(# zT2;JnZYjAzGn^JI TGX=(BjTF@zf^fW1j5UJ&HBi(^)kUmHNTSWmXN*24V(JxB} z?rGLap*-zF%LVC99JO=y0A@I0x!WaR)4+oFbAqWY!vI2jWhzVrRMi>ox)L78l$g%0 zSjgCViTE-1XGisq(e_oUw&h<{AgR>sI%M!$sr$hu6kO@>4|i>Z +<>Y!_{E?6CXkMztkw}ivJ|lL6EIXkl60=2rZI&CwczpqhanaoYDB^ z?~gp9!wbw*BVO0fICA%n`go {DU(wKOg1wpAfIg zum*p+vKA%;q~ZsCScTp?kBj*a&W85^+)?{oZ(9D}v%_yW0OH@?-f8JkK|_+WNgu zFsW9hfd
my(&fmH5K_0s#@w|;l0*;if(|UB%Im-+z+(&r5MU;(ziRAi& z5yGfYU>nGm1?{;!x*%*$``^L23OxZMKR42#_b#7X@bvlwqx%d$mADIyS6aq0RaRuw z;{QMIDpTP@z$*^-5(D 1xCxS|FsY+ob z0EKSXyNwmv1RgtG^c&|_#wbZsmS)6>Xi-UGd=YUpKIVPAqrXogKc5oPH!kpZZKwQ% zKB29}Ar$YT!^w-H6pt%x-AzPMnAR4~!+_d<7JRdh(_o}W-az%1UQdNR{}4r1^FblL zho-AG+%Z#lT?`s?Ly XNJF#gOxyH0UErHS zHKKawYZ4Pf@r|jTPpvv45)t=p8u^d||0kpWce-SUf^l96(T?k{kVM0@(^Asf3KMBV zEn#53Z0YnM5F(B0p;&q`6(K$6P-{m$j8A+qzbtOl9*2MK5CETRw4{N^(7jYaVkx*r zH;~(4eV$!^WQDCp(TUzbyeNen_=2KU%!`J8>r5fYtlJuqSzEeCDY-&+)(|_xMa2O8 zjJ7}T^g3=q$5b6Q%RDQR{IU!&d3m)68l~S6r!Zfo_Fl8s-t8{-JxnrK4mKG5Dq-|i z6TY?7T^yhw=wnHHmqmy+@Gi6_6lk+Y&E(P>A_o}tY#paQ$sfiu@`8tZ;zjNGvuUBx z0tj~8cPbfV{Edvr$Z;tmK@li`8iKyL4S%;yj2Hsqx{qZ4uBziH>F6qw#>uX`t5cwi zYi^QpE=XC0gN7mq(uTh|S1aFoaJhQ<(#Qs${#=kf)}CI>R!1K}MynL$$>@A^)M$BW zm`@~Mry%a^txA62?_v#5DtEqEwK@*>%L>g7=7$8?6EfY`fNe8or1kprLC|Jg(Rhuw zx=YTy)3Sl(a)gOT&~)wSoqa=D{vEg0nP1u8p-SN@02^JIiXHLqp;pzCt1u;|ko>Rx z{C7~H#epW!HW!jQbO_A{$*L*|E^Z`yI#@5ejI~XIl|f)Hl$D|u-}Iuw@3%b{M;kWI zE5-tT*#@4cbgJ3{B3rmnSt-172~c|XRi}nKqb^^&HB37r0B*OARozPW6|8bZlX=+O z%AgDNA!@jk2GDyvVnv{FcBdtICnAGOHjLUUh$oV)eff$aWS60XI;%->-|G%;g$SUJ z1(d(|zIO^O4p^zaR-X)wyS=U6*s7b>)^+YDx+XLCrB!7>C!(%9DG{ H)o>*rmlLXjqm!W=?X;8YL_+2726S~U*1>O4xEq6A{KQTMv!#ulzkSXOPv zC_{jXu>5~~ePeVb+tzk$+fK)}ZM$RJ>Dabybl6G9w(WFmJL%Z?(ns$(_n!Ox+Zbby zs$Hw*d^A@9Ia%9?n0Wha;-guefhVoAO0XjxTGA|l?LM)6W$f<23=f}S9Bu88mvMMz z77_;M{f?49)nE 76iRCd{rE|2=FjCAF_qtG~Q&e|E?22B8rZMwt*Xyrhvd>vD~?_b2f?jheyiHM z5S5aNCA9_>h304WnRZrS?1FwP4|R74g~fFkuyC; uZhnCni$@x2RSPgh@OaJ-G!(b(Xl42Yw|)!{-EB}Q^Qi6Ww>B9FxEln;!d?lx?s zbtsCDEQvAGO_N7YU93coPrNH;5bj?+G4E;L{#bhu^@+Vn+6M3GJ>Z@Hwgw>;M(m Qkr=E=1RhmqKjM#`Nd{}`c~AzkeGQV64}A4e0Im{I?JZ> z;wpGhPE+L?DC#01d?a?b(ScOewvq596dbe2&p?9jTwd{ik{TJ$!}Zw5xS7Jn-C$bY z59l%`PL}KUR&kO-O^EKmTsysiVNJBJs7=JNSzxv$?X0=rQxQKy7=>4-UL)UTDafEN znPZtixgluj0f|hE X0H7=PN<46L?u^wb`P=h&kI_A$mJF z?N!Q$rbN|}*wQ9KU2`;~zOQ*;s&Q7ng+ro@#Y%WuQ+7Z!>4qil b@CL+j7Ko#5^MWS9&qC=2^UpFUTHW@SWt e@poTq0QmudDZp&_x%eCLl<@2 zvU`qIs7^{tOehZR?Lk68UmTt^x13SJJ~cu5^mGM-$}X04BF3ocBUv-@fQV(n zLV`yo5yR1d95Kd^ pwr+qqUSqx^r!r* z_gVz5mhBX% ZLaqqgPCn`~xV&`LO7yOI0B;3g3R;Ok+ff9?kUceh5D~jh z4ec9c9Sxwlt?kz${C -XP2-0rOr*jlp-iqq2PdduJgz<4rPXN^ z>sVpVb+;y^wxk?=b+oWT=@m`#J~5=rVk|R*cpO5DqoyvYIc_3{r2I~{yzf$sXAhsk zCc&l=&!O0g(Y+J_!L6UHOWj~N8bMk>d^Kl$0IA$fqU85X>i*`(EDW}}&}|H5O KsWmE8{M`}K0yZn;T0$$=i ztr}@m>RW)69H4hUpf^ieKKjOQ-+Zh*DsTPptIjT{_j~~e2y49w(6);#R!ZSSkJ$z2 zlXFbMGDQ_6X-j-&ChU~aW^RuFSaJhLhtoI%n;;I*oby5YZiscX *5;wCgBpUG- zUzssqB&PV&U8s1D;V5zDDeN9D@$-5r?9$;vU~4@Zxp{i*8Qk8~)~2(gkb_|wT@Z9s zM%v8NWg)T%n3nTXJPLFU8wj@+Ws&yScHq;-tF=Cxk-d!A2^tojzsu!OmxY`)dRSO8 zh+0amIljD3{`9sjh9ahiklk5bYEl!TH1seOdiUA<1fxV4CO4CS6A z`KQr7YUgmPr6MpAG5+Qt-z>UjRJl}ek8>QYCt|V%kTqcH$Vp2bR } z+SkZ8{%dq=_*EbC(^zDp$^~a%>>b`mNJsO7pY!qvfJAI}5+(-*y|SrDZN7%<<415? zSDxlG%7WT;R)vFHCc>125K*~T@jKk{$yZDA{%Qs96eSUu*9-^I$jY`Os2w6M!`P=7 z0>Gd%jO$Z#8M`e&v7*28y=}?=V^DtsTLzN3;n2%cvwn{j?jvNY+~sG8j9<@+O{N*z z5puY-pV_S3P}(Q;KcLY^ZwE7od~?t{S|_0w}=4krf)VeXEX^)cXYVAD=9_STlgJ zZ6(j8%_6ew7Ls?>Cix6M#%I`&DfwKL?O!tH3*!2Fe^`cHjJB@h>J)Mg-|59c7tX<$ z7*jMwd&&=8B=AFzR3%8;bgu}1VnQKH(7G#ZD4eklzbO=;Xho~s?^BKU$f%?l4)Mb! zebo%Kwd#oB?k2cq43BF2k?F~3i*EdU9VeS=Gt8=!HjlJDOHs(^o{%3~x(Z@Zfic>< zQPOOgkr<*Du+{GPx(Fy#Le1G|Gri@%-QDx@ofXPQX<1>$gR;*od=ZA^+n8E=U_2>N z6IP&ToU2{Z8^C)fT-FQx6~8GM&EP h e70b80D!d!p#Hij?Tp+k5lTTd+!U!cBN?rX3w1hI<}@6Po$To0a>+yWIn%bM|iti zLO^BH(`SjdS`<3^&Kp+t2f%ef-zHK|thS!opQsF&>6 >~hYrx*0S N+fhFlDL-7-62@tc6X&Duf2vU&svCEV8wY^~V@wlfE&WU^dsV)h z8SCYc;Z<3TqEP0b)iqt(t%%=eUCT(hi{Dg5Is6tM5l8Y3-mIGlAGc)`W)IcKawv{D zDgQmbqhx2I8JKcZ%ge;?s|B0;C*oTv -BA^tFoG9hOD6sA%F3VcC)Tg3?~Xfg8A}X10RBRnA9hJf z16FdPjo8;!5sr?@TxUAsDs}TH1(<-`3D0CQ57Ca9=k9u-b9{6i{;_UjM_sVIz7f@4 zVs+db8
QMg*8cqLgih+wOXEl#ADD@1urH=|Fu<=cvphkcm zGEL`7Jpl8fa-&rIdAZF|+sqZ0pRhPannT)ULHk|7k_pU!n4E<$7bD{uOK;`Jk49tC z>#POr-Lr6In?E!q{a-50-)hVsZ5k4lj>qM5PEqp}RX9Vor@bsPNVAJjvFiJ5PA~kr z9#v4(CZu(UR~q$62L9u1Jimnv;Q9PFeoDFb`;4(yqln$_F6@2qtQ>UQ4(wIBt9%|} zvr^K*pD{po2#B=g?43|y@82%WN})wi0dVt{lKrx&+GMq;4N@V4=_!J$eX|=TtQt)e z&89lYQY=SLCcC>=QsC919vHMI8;x6mLr~lC$o4xvo6W-|mj$S{b~tem0f}Q1cnXUA zI+r46A*g!SSLFF}L3r?Mdn=^&Z}(8V= 47u6uz+1F8~EhL<8y!|lboe4hK;bZa)@}vdKlx;Zfe8cfo zK-6C!5;)IEO@f^j8J4ht6qwv(l+%EZ66n-fgy~Dj=X=i)%!$hIOLv$(!eenHzefY+ zD}`~y_T-=1o4+t2m3ct$o&DU-HJ|3sim921X_$F+z_o|<8^9c+q?P`_Wu<(J8U9=D z&yUY_g2D&AgcPQVPSz@mjrNSYz?R>wLDjOkN$y?q&3d9WzZZ{8j0nL$!j>XS7fPF- zwV>>;8nK4?>7D_n+J6`HIGXdHp9fbG9qsmLf8f hDvb@@;_-AQuNbu zL_+U=O``|1oUu*J3Z*3$qX;22981;OLPoK>3yx%O025^z3p{U#-ssYkbI-mKx_&vs zU4f7CW?zAk`qZFpT48q!0&ZE)!i_8U?kY=5>wLq!Y>e}I!<1?pQP573`t7UeaOX=5 zCa@{}dvQXJD=cn4X;^fv>vwdf_&2iN#7z4cTjX18WJPM8;r@`n?(IJ%$=??Hr}VTq z{~2Ics 6H4|AGWe=*N zoZX6khBmEUz7qes3P4^%%wUWrcifS$E)dAZao#@{U*PR6*NZt)YJay`iT5c5S5(Hf zwE!Xs7M3*PLz>zb!c=8i#Rj+l7X(Sz6 9*+ldT&saL*G6*er`x8mXVdPR1g=S2uZ)wQ=lqq03TO&WcR z%5JDeRQc|SRzS^4PF^H|=elV(kXmIYK?j %mC7zi9rkpaD+wf2Y7Y~ki z|Ku1T=FM;aBL(vmF2y_Q4!s)y+`wuX+S^Ed*6qaO+_+itB7^0Z_Wp+k`dfSadTcC2 z2&`{spwRxFIunzR1GTKZtzMend<5`d!(*GlzN4KG6)RBTon5WI xrhe(luwG&6?9FVj~&J) zsI%;&{( qJX0B02wrcq$b<{-FgwENN8~XjXH>kpZe)wH7sdFAJtu z4so2s_r2I@ZEN>{9~O<=HI@OL{)&*mg;wCYg@}xih$T5qT{M*)D$PMYUB#jhm1j)C z#VY1TDxl{aISTXJUbeSYg;$OhEY;+ >-nVhZ_iL;_msLhCkTHmKy{xJf=anBF>Y5(^_r#9bs8yyjSshiK_`#oWM)C z4W-iXGfhZW_oW`|lg}+}%^=)`P2DjK8P4?b2etYy>K^-AF)rtuPIoirLPih!Ex+ Izi{0`lYC12c(9Kwgn>y0ohXC z)4d9Y#j*x0>t_(LidTs@LRnuBx89Guy)}Jzuo{xeZ=S?oYn1SJYKUZ;WJktY2#SON zLTM_Y2ITy#G4&jJ@ry(L^F(QLG9Zjsm4L{!*L*DC-|FD&nTa>1&WF>=#KNWb;}Fu) z0;(aXtM
gaBQa2JMfpiB0_k!fAHV$MLqbh)Jp0(T zb6|gkh=MPmLn`-AftdXAFAMAM#W(;jUBW+u&}qB-IR3 jZmy8-sA!MT&`^&5> z3z~5@Lg)jyTqdZU_v-&~YQDaunhXMd&y &MLhjQ?bgNpU1;wi6#gMk0zhpN5y*op10J4r*G 2^2U&9n=DF9W7W0;d*Uu1{W5XhFH|eQ4ng0StmK6e(qh1Zo^lr$nhpCpvL5=c zl0sB0PaEE(SSq=)( fM~85oyhvQNadD zfP?BZ6Vq9ocSqUX0m?rMf74dnpW59mGpX_!$ZV*ABYn55qIc;VA&ApCBT@@J{~YBx z2C7a5vS^SZjCLCW#PiBBKJ_e)h_*1GZ_;Iq!H8F>|4Ed#dK)pT{@VBH0BY7XPA~ zP||0NeoHch&xufSsM7-M^dPIw55ra%DMX;8IhY7hLIn&Y>%ChE`wJoChAZ#|&_(OP znap$XPOW |)aIVW+# z;)wB{!;HMZnX0B?QOU+;TdQAz$P&Q%i6ZcYDx#=-wC=@>3C@n*B?OcRJq}H?Z>u-L zE*3!IEBsmNTF`}7z}NoW@o?>bZN-2(k@bP;y|EOo{@^?Fu}JyL5^q^fjU97`X} }s6!z{+vN&A%+6n7nw%P2tyN^*JscB9lDN2!-9k203%SP>WRgDSKi`X2 z7K)a}Ux5*rvgLu86`1C4A4ooO&*M d~@Q~@dIOCBI1G@Hk^euNj`=q*$9Yv1^! zi#-CV2Y2n*0dh49eWDK>HXjBsu5INIu52kdpACeVBB-Hkv3xj3u`#-KH|E_!jxrQv za`|kQqt|*@QNbBiy%lXil1*{P@ qVEV6&P &xzH6EZqx51m$n3>1kU}D;Myw-Q?pzvSVql+}aP}-| zBFcV|2BL{P4n|UA$*3A7^Tl*gJ&Nt9I-#!tCYUMDc*^XVF?c`f%)g&k$C72=vlpXd z9)px@7^K2{6!d1qxGFJvgxWoU=u&~Ni)fk-2zM=0yA@$yycpnCQ4knR V%Yl8)&B+45I(pXkwb;BL&`oPkN@12CV zxcV^ER##dRG8>S|CeH*FN53h1Dm3gG)#pH~sc4=j9ozqdOn KYVdEgVt76&zg{{m(uH;R57IANJTad|c*093`q&6%!Z4jkNT&{glq{7?ln zvxJ%iw=7M0Yt?*G9YfA_%CUHv>(@@D*;vc67?=$^aiFiO{umxhR~Bzajo!0t4d>R8 z@cxifr}4vQ&1NkO?{z@u2Nvkz>4Uyma{j+T VS~e*<1OAbI z!YWrKNHeBV-k#ED2 q!LnF7js+ZYo@VJ8+4jhjzRti{DRI^j%C>llOBx?nrv*D?0b-)}rgx*@r5Z zrv|9|E_!ylpvpy&TR9Ay$qK<6zqy~0`zLGu2M;5lI>e_MOx)*1s;F&xMByMsOLhC$ z)M`- xgHN I4 zeY^)HCf@;hkPz9^_WKumd}J8&k=U|Nl6k8qYT
#KILyw%4<%38T3@;lz)e z8g>@rx;w#_F!uc}3R=W(V=Dadq)m$I=8qCpgiR|tF2HRUBX+BB+WXH2f|%W3)Vp2J z4K;iS#ek@dJ?b=@tmc4*8`!+Y_)UT*-#yi#pfhMH&dJih6X{=xpO#`m{HZ?tRT=Nr zE&HN?`X%Nb0KOU4;4Q$1BOk7`nh2>XITlcgmIgwpVP}a$D-@sRQHeS%w9ys-Ry{PV zJ(#0RZcYs+ZmOj3uKXle0WR2XFckxP%T8O&-;pf*X^U&4TqSn_zC(lpQKplp5FhWW zfs})QvWb?&u2ui&MJmm(A)6q9v&^M%=lwU=2l(f!X5^v@Rz)WMt!bcT0sie?qI= G<+s zt8gDXgDyWRo7my)+P|i`3t{uZ|KR|(0U|&_~?}SQ9`r)**o-HTmm$2iFNHoGzLR=hsV$AhDqQ8{cJx!;Yk_g30_@P%O z*F~v7q8z}zHWXf_;-#ls@*1f*bZ_oMuP{LAJQUTk;pzDI1(0jOikAJr&m9_MnvFgC zdmiJj#bAc(g^&&R!Kg@%v1JA+0JO)AG5YK>Scrs(5 |gNFsKIpp90 z9K`M+5<@Mrniv&DipCM=IQymK1PVI@YUW9opoFUdPfkxKZ0C}dR1X^;kb&Bb%w7n+ zuWW3Q4gD0P+d%NFr4{Ykpdt>LVUw}b5R!|?o-2Go0~?ptvs5#k0$&e#f+e^`K#IG% zvO>Cp_<25ASBc$?<~M_89UJ+D-U^0_zloliGk0Ao6x4 )mYWM z(SxMtw@`x%`(HRNQqaObYBHa*ogOkv1{PN3&;AyD6YS5SO}hCX)n)gvowlK$hUh76 z1>O+DZQ+rpz;WV+-R Z!mS zP;;1kuv(3THQ{vG+X-LL=vk5Q+b@hQv_ZZo4t3ov{oLcaK7&6Wa6*u;`O70+$7s+! zF^ioSt-pI0VDOt80sWRIRJj=3$66Bhd!Fw Kxmg?UJokidn|#FyT+PjpZG9z$dks?*GT zB)1%~`Ldf=NzptRAKX@Sz$=M$mGM76CKJmG)YlBCE0Z|$TUt07yn;S+9GPoDQXVlN z_$P(@EyeXwHPoK|vXxg>A7r5)?*B_{g1>j;0KWUw{q~cLz`JjeZ*6xM%w$-HCVurx zk A#Fdt{5XP*F5V#s9wSyOPNYF&1YKR15JAh}$^(E=2W$l9g z>IuwvP=33AhX*uRr?_7`(Il(rC!^M=yxI*v`0vwM1PagHqyrBG)|Q~KRepR){LG@%z>k{=`5NVG{96L+*M+;bX(niA>%p50tgz0`S-a1#bJL_({1!#&Fo!wVu4aJxK zMhjxk_SUqt^`a9ZKbVhM3n{l`lZHnH2ylc|9gj`)8mkY?bT~~rp@X$pI7TJ0z9f!c zvgOtgyW~tL01f~#%5n*vx_m;N7AcH0WpcRp|5p#pw=ORBH%GKh$KdM{U;( >y>qg5$kK`7H8ZnO3 zH~tgZfmi}?0+R ($)l;8(G1bAt} ;cu3>n)JvvhsTrmdTOKA6LOw-PbquFZu)lG?iPqKXBLGUZI#3t|xum)dIr$okk z>tpuFyg@9RcqPnw=5D4!!>YFJUO(|rn1Ej!S`^Z(m6}+=|MKELPjS3!9g$?Ue^!(I zm3$5o!ht8OT!QAe06-6X6j{&nm=r)SEG53o6cg6uD#G?&H+HgKk=-y9%`n#7LpY44 zS%Tl4g%9X=c5axmJY!cS^|2QL>p3_jPu6Srfo*2LiFF9ZD@yk8e?eq~^K|si)=(Li zb ^|<~~z&tA@m&O78cO+d~iU!Y0Ar3Sj2)=YmQpC714FmNwio|3#2jsFTt7YUP zpPyd4W%iP)QV+pYi||_J-g$~ c3)ck2W-trurMi%h{bXR#QC0W(jy43mVyf(I9ol zii*CUkxFc 0sYdJx1 zj9(``Y!OvSJP+c0zg9Kj0DE7SWy8(0y27HHUwzvI7I5FtkNBc?3Y(SO1I2V&XNJ3% z=16>}6~@VO`xGpWa+;AtcwOqEy_27(`Tq7mbDkVd>&A7*6+A;k!s)TGt{yGi9)@2T z(uT|==WIV%a|Q+y*OZ2$!CXu^1!>3TxjodI&A)s&Evx{!d?Kk~eYrk# -F_gHPy z`Bl1eAV~1DCn55CW;eirQxg@m8*>4+c{*a9;Hnc1Frd_{J*{GR34`ZwQqk_;E8E(* z16ktyy^pulW^$+6;%eyW+2_SKk^uGdDoC%OZ=-(`@md0`h(KTfid;oa9Rdc?_>*F_ zx`!Kf-`nZgTP=55GoJ!7IL9bwxouRsh(EI^sM{*Yn4m^44LqUa^a{TC!o6#N GO>{}0uz<7ezjwn_M!6^E?81C#J zWGIO8CSc+8{PS!sq(DdiefGC_9HO;nHU5b|L;&v+=y|6Z?m*6(Vm)^s4#VU=seAeq z&?(4$t>$D=Kcup|v`>UFiD3jKs$!B9UT?p0;7&Efb6X~8T1Bl->qrBm00(1gnP_)X zaBN46dl$oSOK%F@esO=?SYq-9sz(ypo$BT*N=Yw$U5CmFHY1>D>iRu<__@`Yw ByAIQ6?v+`JRM+3%A#|Ka`#Cc68quFw#F2UtF@tmimsfHKxG0wO +xXFcS7DmNpx2E8zHRgAB4WGFrcw3b9jz&yL{IWC?cwhU+7&P{!H%z)D| za{EY$B3DT7-{OdWz`S20ELdD4Q?kW>TxjM8B$z}fy2FD~r;6-+raF!^2&19zh2HH5 zpr{*F6F3Cp6T+a+LY*ud2(qa%Bmmv+?sfCY!2;Dg%?%txOXZ=YuXhMNiyW84PTFjm zBQzdQtPS^%;-nu>H`4sd`gBYeG9Y^v1q=>1qJQ7~zMNu3F|{FoRfK7G1TiKCE*N+P z8G8T>5Oc1^6_@L2*P}E&vnr?8#MM5UyIZf=a`_{!RDl6YU4Z?pq9$Dz9B~A=a>=om zfT1cUT~91omcSD%BH5}*5mZ6yTbvI5H5uhfuzdLz0ot4nXKx5BBwy(ba4P{4|D=%G zLDtLkDS9Tb6YTB-uuHm0(PD#6=1Rn4Y^9;sbbHYzAgBYEPq57hm4%IaGjtsC80#5e z_LyqHO<@GGC#|~yTW%GSR;?G_Aj}qbOI)|&vonc)&j0cnK}BIXnFUd2sA{)oeP=0+ zNp58cybZQsRqi~}fI5CRs}v=2abUX*rX!@tBkL>$Nxz-8bw8AYENKb1WhNQAX^cL| z@e;H?2m7tBqO<4(#g5o5FgZnoV{O{2aLYVUBQTACT8{y3^C|Wy+k8ww9&9ZHI85v7 zk#i|$0k~@}O}KM&S;8;Uc`J^w1cmawYDSb6rI<@s!5c=x>ub2c@_d;=Q`gpNv&QAN z5q( H&j46w(azZi;B8=D^NhTI?FIor&5t!5i2BxVp}pY+nU(m8fE{Ze zYnsX9^HT%AViF=7=bAtjBaf7?d`5z+*3rpp6h9SR?e289ccMG?%C$siyjJo7cWg>x zpuqmz{_w6?>puMEv{||0mG!f5#PE-BnQyPTEUp|3ArJU4lkwbkty?#0Z5AVi_*?8D zHn9(aL*XLd(QBaPfRBi9Rh9WJ|FwrOvM99jJi$WILvlxcA%_EA_nfrfD|Vi<5~ZTq z W--PPVE} k&FTF1Ig@}cymXuz!&1&FpLV4$=_ys2J&de<3ntRxlO-jR-~LTf zR%8@HUxSHCD`OX~?EL?5?>;5WePulR1S-A~Kh#wvk#BFy#8XLk?7QNaL?CY6QdW(^ zOM~{B>x{>Xwd%zQ5+)7&giM}5`Y~*GeDV0DIbq%gthtuKwwM*(!p3TS9(jKVT$E?y zeShj_(fHqrFf;Wk+@vaTY8aCS)D(u~#xk^#MFHK+A$-EtlkGNrs{yz%25XHD%qgpe zxN`rZA-FbxW2nb0+T$7Kw^zyhQ+&Z@0 !G%suzqmcl@hG-Nus_cmw%L^OAHBL?Pl~B@_ zjO~IVd>Gue?>GVQQGX-K_&=^9y|fjR4QP7nuq3bvFkwKzIup}ozy?YT3ymQ7>aKJc z_4dBXjuEg5gVzuHu_>5Q7?5N6@W*bTw=C`-0tjW&^g`^|{Rnd?Gr(V!^RM@N;f_3> z>Lq&Jfp8yi`9dNbUg}`vB}8f-n?w~aW-$5_SmdiPW0)2py4C-XKyJ?!@}2a>o_en- z2Q>7738SoytKQ8Ftq~_%^WW-Z4&;$`VMyHoL_lYJ534qQXUg!48Q>qC+V2@z@7*OK zW_sJuCHsp1XC|+*t%r}zw-SY3L{5Wqw%$3=s8AGb>Di44TE@SrsDI+GkzjEjT%5?c zM1X0)d#h{V@Ru!7Ne)>5_;JBCLiA#_rU79!V0N&RBgEpbUZK5puQYqfpw-MVoAi%u z6+*|YBjsu2y8Zs{SoA89V~u2;ibVe(72)riLl8K!TcGrML$$DDNOxFrx)?x-1&m1M zp(--R0KhEks@ME;vGE0ez&K XHhU*m7j0<{6T5@IP&l1?#Y zT}wYunX%|c*B2_w_yweN%x0uySH86D-RhbCQJMcE{B+7z9=BsiIujh M*x7 z@=W5DB@ozsV|$m@C$kc=DQIPDL`(D5s@DUd^ROtfZ aiiiCgo%TEvnL$?_qk`=;yt$(+`bica)lz z0S7t_ja%+8E)-bFqU_8TOV#w10#AzHXr?4ttuf->3QEk-7_~G3Y8O91e$>h-+U#GY za|sgiuWCRSp0u;QUvjZw>+$%ZDpGG`1TAGLgrNeQ4fq3`4^hgvzlz4e(JqJRIz~)t z%`PJ=nbI829*OvDAQU;ot=z_Bm4weq81!71l4z2=VO+kiudol&nFv fOBrwqgwpa3 zC<5(glj%q8=YFB_L+`M$MhWOMRb=jppv$4-1by90{lHHuZscS3DBTHacRf*vtFn%= zLlXDmz4QW)^r*9eXnaY4b(|1T=3X$vuiyW@?kCa AQIfPAK_Lo3@{IW&Wj`q-}a JdFUJ3joBfeniE)0tZD?f?Yk&bRQ?WS>+KFSp)X-)3@Y8Pu5Er)?gV0C6l|lo) z{6;Pm%TLg5I9)~C!c9~~C;puG<|BaFb!k!voQGEXwoRsr>ssp>&m}swSP~rYMad|= zQF1p;C`Had$J18^YsWhUSep%+ bbj11Y?^qy~3dAZM$-f|Ba)=KC6 zw>^Aqn4b{A!?8dLBhtDxJCjH(({lq7yyoJ1FAspzcGPlPfQXxZlV7JGS2QwL!p;1D zyUOMTVE2yM$a{>)1M`7pWNM&{RNNAo$6uUj6gla>g}RAM&69ZPvE;9SluUN$=P*LX z!EjQc=LaY6wi0}CkWy1*sJt`U&E-o%DXBSo_KbO$u=r%~G)<&AdQI%`_P{S0W4!av zy$AmADooAxIMZ&de;5O%u}3tC-!ayt=vycWEJsn-qYbmImzYzDT|ke#0HN8&8(k`* z>>8`RwiVYuz|C2a0K7|m3WnLdW9b?JrQyR}S!r3}KFXkGFG&bN@1UoTf5AiN&y3ws zZx?jwEK$st>9gTY(v_B+iL){u&@7k#bjX4=<@4*H+ILieKpH8^n~hmuK>NnO7FbUc zPd<3lvCPX~ w z9EDLFdx|Dyo_?M@7%b&=ESsl4+Up&p0P;y~=>yYFosLOcdOu1vTfObGmSWI6Mu-zC z=^%4t1`B`QE9a~5#nHU-*VOmhy=MzN^ncd-0k>_@vs*!r&5`~;hI+s{D|DVRsY^uj zM>jY60mexTz(>upDl6qRHyr2ncz#%-*)$~DUNK;-r{Y^PA+O3Xb+9+QuvH?MpTXF! zS>UCw1cV2&;GP%eO#c?9q?yN(6iKf)#f}K?B8@=&k+T1a;bim{b!OI6+OVne0yq#Z zmh!An!t!nvjvwDFy7_g1Pv$$QwovU0WOqlqD#XJ@s;B)yIa3R~w0mDML}U9jH9AU` zp~(n%U%rj8(t*;htSiW7(!YiNFnq<=nKhKbEG+2SL6FD5f}4*!LcXW2$sL#0`(M%c zKjSh(n3+r<_4H?c0&;<_#dy@X)Qbi(He50KCS$r}^0O?ug5H~LnCj><(OZhzyWd}H ze7zF_2IGp3EYb>H{K9aq-}L5%!9j9a )8zG^r=v(IHJjb3Ju<~wcQDEqeYlr~5{&xH9ZOrFJe=R0SL p6Sab7Ct3^e;)s3p4W=GY0spm);tk`^?d?^6^#!iz0hy@1X; z w7yiRwC}j0k{{H+?~$739t)+`D)?JdB)&V)ZSqn>--fYdcl&ePOko8 zE-fi!GW_SWfX)VT^uR6=pA4~k7ZTL@RF37?I3lx)2H%j6vxPYl0v}A!&UcxHR!UsT zwAELSsp=oTbsNZy>fA*$D**>1`a&;`6{j5_&BF>nNQ1TjHVn5vKRnRCS&}9H6*>N` z2PB>WUiPMM4@4x{y{G;znRt$vpJPuSpk%9jC$-MbCFIPL#f-`~g-cl#8d2&PutfW5 z#K(vX(78hv9?FbP=;tQu&Hwq9gRC;ZL+BXsguAU8g#e^CWKOTqB 30wM@ )M4lvlaJ7j|HGaWXrr*$L^f9u0%dp~} zRk$eKy*cI=2A%+GOG3LC8hV+Bf^-eF2f&|d7E&QQIRCj@#$V}-KXJ@Y4w`?4;PI3n z#uQ*LoL9g+K<_nh)yPf8GmGgJ-bo4=VL7L)dJ*hgCh=LwKk51}^>;Db5#~VqBd^d2 z>BaE*hv1{Jo_j;owYX0UkF1xgb|)k%=Dk2BYNA{&iO?}%D;F!&9?2N?6MLjOz``gw zfI*4^ZJDvN_C|ZlwK%JU7cy#X?JM%7Nb40O4sOn}dqylK?dVJm1X-L01b2j(zGcEj zN bf&$)6FnZEtCot-o9mDXEre{0ty$nu+D;L9D6Cm? z9$UD2;yKvlP&Vt9(D$Vtld%2*r9@lQe*pXBG4ViyVl`+q2To`=Zs}k4>iJJ^|BsPr z0d_J eeqQHfGuVkSP5!02CJ4S8Cey)$ z5cKmcnL&Pk^H*i)^~ y4m@O^W#aVchOM}+vJYz z!{5J%q*y>#a1%@5g7Ly=A&m|u_zE5dRgVEqDOx%{2U6rLmKP$T6Dx`Nxkkz0WKE8} zg5+wcE`W^{F-a2uCr4pZX}~H>jQlyb<}qNlnF6zBE>N#@(FcXmZl44}L4y?BFXN>^ z2UX1K7c=Jf$vkG63~#6NedA$G+ (9VO-~hi8!U4n#wf{l zUh04tKoAj*F4s$;ZUvbFGY)JpH26Q*@4uTTe{3aV(zH*6Fu^U{84V!NrVw3xYF&Qg znHx#xR>8&-@(qb+$KQiv%fBb0(!kW&p8`(){#w6H@P(Q + zH=~D{`gkz{6JO``b$v2~&{30NvYQ`CB+NF^`7;M@;?zs24Z)XHkiw&m=(HCz<0Ukv z?GY5eahyV$0 *pszu%l7yPbH}cjn)r~~RP1H`_#;==0~LiTDntvG z=rRPQ2t&pVW|{@SVB?6Fxj@u-6NE`%X;H!T-{Y|VH@N@zHPEk*AbVfBte9P*tIf4! zwM3G=Rq*LgD~_vI?f~NwUhXHq&da%Q-TN%58|Aq_mzDEU@# Y)Vp1oXA?{Gtc+}eCpZ4e3~^>`RQA$Ts}gQH0Qj;)@b1rvg1b=Akm-$4%|RbG|`v4cOf z4aCp_fO{$tWbKldXK28TP326>0?emNXNfy^$`37shBB}y2gdyT$}?9r>7>FgjowFM zXY44rp=m%|9f7;&S>h~hP|VKP4+Iy;Q>0!cjIqIzgz5mw<(#5S& ()G E!8Y;yc)07sp2;@<4>dr_ zzr~sZQaY{i&n-9XNq>VXMwkQi{CxIos;kJLL@qda1cz*LNn65ZCmtZ);IP9D6L4&v z%1j1&JpZRik`6W}&U{8(M#Y*Y!|78URi-fnB#q9m_6Lp($n#YtmMP-nmb*gSsfgiV zL8fl1{KFfw+*?xQRVl+I4<2g_(#1$Hdt5+%d2{8f7e!~(RoR~JZN=xn^XXq!)lis+ zIj7K+UIrG!Pde3cQVzxZKMJTZ;NmVyVXx{;|Np=Y>6g^ltZh@pL$tTa?TxplW=+J5 z%Vh WRxjgc5KZYV_-6wNkl7)%`kc$~ArW_xHM zMhdH$!)-ftBmHemLm7mC`NwcC14s~hvYe)utw4Pui}QWLPpHpci(enLs~0cI;tZ6K z@?X2`otUucM PtX}gj`cI>SLFNC24ATH{ru0k2e}(#@+e{e%(_QgF!Z=6w^$#o zsgi0t43XZIuH5F49Ci^Yv+t5icry=Lx7$NL`5`Gbd~SebUKU@}(D7uFWy&1|@zr<` zBqva{9_UIlJ;SM TLfRr+60uxcL`DTY2r-vXva#UTY978p4|LnWU^9fModV4;^H2nJ|3EYR ziJUGIRcYPkvyv|^y{&iFNX1JB@X}uM?AnNEg9k8i7f{(wVQpwI{@t?jOyUsnUlNtw zo{GkS=yhJ}$?nKtEaJ=r{QsDegXx`GK@qR(>EpX}<<(;@cPCkQEFaT%fjX$hm9B7U zPWrz@S=TY*#(#i{{Se^vWlx*qKlD=z)%2$^&X^lH*QB{ps}Ft*SiA1ge*+P3=)N^k z;qkc)0ix*bX_fg|;~^F)cXvmTo}uRCgBwEmF89w%hW)C69muB*PP{Iem~+d$>Lz?i zu(XFaBMjw8I8lLhuQT}n# A#htFS^M3K~{ lwcYU4#a z&cIBninzX%UWTm-!)tqw#e;)oo6W#&nGSIfO@6GvzmG}5!TY!4M2q5IErnHM(v8Q% zYxt6O;O4PttSBQ2BRA}5s3h_QrgoGBN3GabL)bBpdyJ8^3ki=&-WGWTp-(Qaceq=8 z{QYackvTjacyy0&vl0?0)SxGu|9{2dp%sJ@;QyS>65!bq9Q^!kJlF*X0%AyQh`vt= z84ttX%5jW2Vpf(I+DG=6a9GvNM73>PZqc)PqQR7?R6Wx{C&ISN$`;miOeoT|q9eN< zC{$s;Jibw~RvKaeNlnB8wWf{s2-eIZnmFj_LOY^co7BHUm0Th1;zEAypYZ~PQ*BCe zSbEjM&X~V6A=FzjNlyEpA|-hK@6Vsswxr01JcF~HWt;W;{p)?Gi>kG0bO!m49^M}8 zQ|JtxoBq_@Cpn#Lkpwk+IV -;>YIxC$=_U4b~;z{>-i%r~TaFqrOnuh3T81kfI=LOwEv$V)H zR3HSXhF&c~H4;5COz+*+EKX$&Q|37^FA3;!PaYE|^tyRfpa5g#Qf2-FT}eHgHS2@X z**M!lwWwpsiKTx}uF y4cH)ft|BZut2#&e@Oio<(Nm zgsK>Q7IB=0ZkX=eRhVH}+2eprc99?~H9t`WaGvMnXDlIv##RHoY=s38k;M+b0Z-7a zLaObplzNk9G)ZDuxC@gwAruPNsAuU30Wgx1Pez^(w~8=9H+C>)*Z~aJ? zwd+KF#L+>bl9$|7hSpbM!WOPUxGyhymL;MEC`rN+e6Ex a#`szs+eV3cxjX{#?!QnsV0M}C{Y1?Ixi5tjP{F+a_BtTzfo{G3 zs&V?V(+Z*&;|NXdG^>3a_D=@d>_>=~B^((WBG3@+zpv2ojr~V|rW_6-8yk>S1)>Od z_OEpBb6WG`Vj_;X<~-6E){GV2$9WvQLwTdpiq74|lTPRmUt0Qs6Fk!iP8IC17P}Qe ztdj>`n_8HSc?y1wPSaEisH8mSLAvVG9)FI-53@`-7lUFZDp>@g)pip`{3U)(aETS1 zlCOP4qj-yY(q})c43e7l_1RRFYCmw+IF)|K>Gu)5_-xD8F5>a7E+DvsrQ%dd3LZYh zQC;@Pu=QO?VYXYwZ#D?VM4 |UNTA9(ISO!;NxNV&Qk{9&Dd zm!uKOhp#6>I&DS%4uqZ%rS!YiFfZi&5q}GbWl}HxF0CiDoZkZNNRjUS6jAAIb*4YK zB#F<8+==xdkF|Ga`QPPcXih1O;l}M H}Z((Z+$CKQmmkJ-M^F^~b_=iwKB`*ZGjg}@)a1pZRH z&DG~nJUl%g-X-TdvP|_RyN+?Ot;!rcqN6ht9Ad+}G4g$Q>xE%&?F82=xqPVjtMCJ! zyKNDKEBHiCD?%S9 tw=2bYf8}I${PG$UIQJ8~F?O z2=whyqIM!AYK05X1A|tr2@_mJponQ~&qWRS_3QMNYR%!vjJ^vt#_sn{+4 zF=~)`{^uG(84+bthC%HJUn3%^?lBv`{A63i#@oL53~o&Sj4F6bw!j97y4`v+U18yQ zJIgwtj{8!KeEowXp8E>mN#Z$&L6FKs@y5U<{J^u^vlAW%81Sf(6H2nED9pWcfiOq{ z4yGu`TD?d$<7;i1EaIbQ-i_lQDoPj}mOBh1=}hJaZd^R_i|gfcw(9NRD_!TJf!)wB zKtsIJnlrKNjzFgynQh %5?ZJ5 -4 ze|x4M=O{@9EwI7&^yL=;rQZ0FQh6wbMbI|O;SW5)21ZlG(0Seqnt3}Lzz?%#l%NK+ zI>^61Yt3rBweNaIKtMq2cbAmw`RjUxF6Efy9=f-jTLmRm&Cs{Gtyyv^bKYR-k4&6J z%>Q=x`y2v9!FptAt;+*LFs9$PPgZ{u=TEGHWu5tS?>s07vwG*qy6ifuZU8E~BPgA8 zA-7l&wk2QwCv=uo^f3#wP@^{u6x^W4 v%^S#46y9FNE8aDGhJ z%XY{*mf@=W>ci35aA7pikNLcls2_7V%oIt>V?0>^59wl!3Y)r+Z#O+ZepD3i9p+?q zp7?j~pX4N`&C-$F*3e5tW48r{Qk8lN_6y9}Bsy&X7@Pi&`U8ickFi~#ftr!BS~`X9 zu }zX qzQ*e&3~VZ9Ftg93bi&PGQEXeey8ChVmThzgjiiWCf{AZ-@y#k|=deLV7oeg<%+Y z_Tj}^UPy!VOK~jhF&;Kdei1an^j+%G6GBL0_HY1ZxqZ(shpiBacP?U+J@lb1fRr2l z12oos4-oC;$9K7Tv0FRP!h+MimRcY#^9Hj**X`mDWhuk4&k PBy3lOp+GY zCiN=vq7OhaO!_?@1`;+0$ap9YqGPo+q~T!E0~e?&YYIxFLq4CCWDQke)OZKY>?QKU z;3wSsP#b0U_f^JqSl%dGHCYCnCeX&qqZy#PYj($#{C%@Yv|H)U0GCvn(Bv}Jy(R4_%=+;i!t#>hO2d;Ve(_3QoZ3=pT~P13Q)Vj?r-nJ zB|xVn9__F=@TS#&jq8K}|3)BU#D=kwXghQ&myWuju&KbgV fXIcj@Rf*^# z;6|SuM8Mc-jnAS*wvmJj-AQMO5&%H*G#Y3)4q!0O+}dM@srvB9$z{Gqk?eP@>a-Wj z&XR5lWzwplfSRlvuZ2~Uzx+O*6nXAKO2*PbmNM?fn(Ec)FYBPuz%3z`S%rA5Cy50c zMb{|3GwbECVezAEk5Drc#AZthTO?Z6LHRug8anE(Be6uJKfUp=MI2RPb2`?&BSy4Q zTe8q5C<$PLoj4 eflO`V~$!T(gQs-jEv?Mbp8MJn2Y;dU_o!gXRX~u6W!pgNsxG@4* z%>FSi%=$>ppj@QGobc~oMY2$dHTn0U5=kyFhip~mYAavtB%caT_7#Q1*()ZE5A&U} zDLd=_Hd=*L(#IteaWS_a{VnnZhAcOxJd2KS9j{N@TTw1!&zo?lk)-xF9Nepm`Lehj z(b;NCQ3b{$-0SHleiIS6n@o%78=9A*pMkCjtR@VgF^|_3zSvvVjwpN*3VOj!=pkK! z133D>=VWq+N67Vc76a{OfBPXQcv6*!iLJZZJ!Ya?sty&q(P_RN;5u2RyBBV8>ZtTD zq$YKBZV%hs4{Mntu#eHpA{!c0<>0r*EZlr0eS`o!*I$iMH+Rj}XiL!Uda6NX9ux+M zaK`p&Hop^I9#ACfFjW|$z4P+H=G)CMXT+cmsrqryM)Ynq=xRm=fh0J;C(dLlnnD_y z07SbXTjzP_8Bu joH3guopN1W7G z3$B?7`nt9_ecr_^C4rX-d {cy}+l3oq&c9 JWgBvYxbQL zLd1Zkgh0Y}7=WccC>vMBYdl=bC5pm+>e$5A*H0iZ4G0@7fzz4u^@U;m0zp!H+!GjA z&X5@3Ro~3XAyT?zK}_r(nrQY|2apE0TlLNM!=PY;`xxz6qN?GpxXbn1eVd%~90bvK z>SBy03*oL)&bXgGKG<%2Qnk#OS?WoRdFxC^Q!c?tGVQohcCQOZry9(Ao^f%k_}O<) zP}F_zL8%ZTEzwKUU4u$XJSN$YQOw3Y1JeNI(_oSe<$BLMk4_PYh_%GfjkY;Q4&>sB z O=O>yJ^iQYG78hBA7!jv xnMv+47g;571|QsIhL={kczK8u@{zre@~g<0v-quNWmA00 zuzZ8Yy2$2s3p)7j=M;o3>z3Hvm6o%S@Rf9ky84>ad_O~XQ0}~L455uo=n#SNaeZNj z!ihEja#~KOT-NneO=~Ujb&cXE@VR%2E0Q@Y#V_`d7Y~uUzwzK{RasA0p`d;3|4hT{ zMI7r;Vx}&v^6WiMMU>;OM=6d14j>N=8Y5OpqHrPC`tV$3+hW6*n3Y R$304o19yMh?Fapox(W+`Oy-39#BZB5g0iuE~OpUlD1T2mo$df6{F;;Pdw^UbVR_ z`oAcRcynOh!hrm422 _4nf;8XRBDAf z|A?Tg5W)v&N4>Mz$o9 ksPu#{m=qq(?260>MhMa1cH gb^Hqu|1*~SjV_4cAQflXPIdDZWLh_@qf?Ii0|H}Swn9zK}AnHhg4k-rV^7PUnY zJ`?=T;_QE=?KC2wk6T37aTOQQux72 2Nc9T1}x^tVvBB1;g~GUKym~phQhWr}rec+;2}e{Pj>=vIKQa zwwNG{@a@*Zu5nna-5TEO{?d3q4-C@V?P=u%kpYU<8uE&T!r@2Wo7feI@lSmv@2axx z$ R;U^ik|zl?ew?0aw(EUotO=4cMsvZoTLjg+^d>qH4}h`=XKTN($1;1Q5c zCg%4Qp{>8zrQoM)Z%{;mzN_k&d=;$&_!1E1&uF;Lsg3aIGrI*CT0?cJDz}TJ_gm$c zOkO;E7w!9ghrNPm4a*|INggVf6t@YQ)vYKVRryxqnqNXo25mM}S3Nbda<+3Sj@q#I z1<6n{=$X%crd23MCyjolr(o3ARTCkbEkZ0&k9Gm1$PoT~cm^bmuF8=LkouTtqe4o2 z@P7Zbn3W(hskvc2k~*FQ Y#qhede*<`l z^RX#;ftbeLbId5hmN5!6aJz~rH|C|6{ut~e$A4t;x=(y!y41U!y(9m(FoVGLVtuqa zT#e&UsF7OsABt=UutbQ!=&7Og`@`kkWuhE^8I!=Y&`D3eHZ3z9B_k1vxb6ui=+4N| zZTOUA>$cH3uUJx2gq(I{Y*=%@Sw8lg0mltzjG!w(qITqU(LZH!Krcx%F$_j0VuPE9 zlx#&Ii>LkVck<-NKDtOAQYSRkEuK?xJkmz@Q1P09Sc8`y+KFJF7_;&R&{ XCcv^Je1D=TOcxp3Z-YTE$giU9 zFKC?=EF~lddGIo &+5T%ypx~($3c`LxUd9((V#0GY$IonH)#9A%~uH%+b)5_3_Z|#8|)Ot zn@J-ieJ8Ek#&P8f@XRK6pA08DRGCrw&XmO}{GY1X(v*_vrj8kYdwCU1!2>RfjG!@S zih!#d?mQiS<3+bWt&9aQrVU+ulWUOUpbK(@^(YVutXM8Y>#kX6tQWTzghy=&Ml?R= zH5#I`sB2Sb<-jF_!sL?IRjMF;Al!k3`2Y<0i$n6^YrCATAhHw3BF9lb;nYT&qL{l$ zZiSL1>duR$J%*OF5oy?c^2FkJwAj$~av(4HhNlf+{xt|d#Q<&FrJLmRapc~Y)}O?L zHKqAsE!fh ==pJ`cvu0YW#H)0El!IO82~qQKYi-iw>`K JnXgvglod^{rY8Ygoa@s9%J5s#7| zL+GjDo9{+5^fn!qpv-i}aowZ@mBr*{Oyi?A!f*k#IU8&&r*o~8mCnqZ;P3o)q9)XL zw_eOn3ax0xccz34TC`rYKt@F$OiNOxK>3cupp+r?wrhRO3m-4BqttrS^(8}zX8q^d zD@E2~10{;oGY%yO0pm4V$=W}M61BPaI$3Oj=DA4?Qqf3|&@*o<2Ua9}DpWF_dGn(^ z*vY>_YRLG=U $5~DuJ;c_HN9aVenE}!`h5%d69i7QP z(*Nj FNRKbB{{(Mk)|3h>b&X%?it1C_1s@RUx{D9wQDfA+415SpavP#+R2XZ> H=K;N< 5+6|&Y*H3vSa}0RUGX$IH z@Qc{O+KgS)(@P(&D!2H1PuZXf`O;O=4;#?o-XAXLsg!Av=)U_O)IS##TQd6h%Cx0= zbvg-_G;7@OqUnVfPZwDrz$=`;F4>v>6x%MBpfpMFgqRpF-AGP53ompIhn}Tq`4Y*# zOLu=h%q%lAob{*olsAubE|N5t>^b$?iQax|RFqDj;NmU`ViB;XxShHrB~%bX#tH4W z62#`ksG!BQoPrFc9_7EQp=Y&V!SV!OKGT)rcAm4QU5!ULvwJmQNxU~~SU;E}6Y#6k z|NK@REA0?mCiRU9iTe<)lMmn~>7rH5)?@(5e9Wo({V^f&Ug` >?Wjp1- F_RQ_EKlut#m4CvW7XcorG5`(q zAfv=oVll&o-!L#_4A`qVl7f{#wkq2W3>6I0BiyZtuiDQXlx94O8C4449=V75QP!ma z9$Btyvqg&w0RS@x<*|UCII6QGZ$**E4pn^|aR~U^UC^4k5#0IC92||3h+D=B{MbhG z oR9xq+u%OKeaP(fLk#_zFI6hY$(!9|%5X4vfV`3^(wB1Kc@88BT5 z#)VyY7jo{DZTRQr;VwKLJt NrZR$@tH(AP#sJGW= zu x|1J)KTg9FKSr&0|t7UvQh-jRB)9Z;zVBN6GK zQI^9zU~1F0v_?ERLXpiJZU>il!tG=Q%7~fs#CK%ha(6-FI8!L4qDCdZ7#-w80`7k^ z9Qf|3eqz+Lu@C&@ZU8kPl`a5<52D>TY$z6=pli;3GrEPG1>NqiXBw1?NR;ez%G@C= zU8i*O%#fTcN(viISiqy~lkjGgdn-@13T;qR1L@q-ul#(fJ6@{Gev^!mr0p#}UM3jA zLP8@Zn?-6UfZ2}4vw!)V_;7SiWxQK6O8rJwpnfISJZATfOQC~u1Doh2RN=_C$E-@% z%#*Ca{1ie@u <3Pz(FM_9y;wfuH~zZ_ZDI; zp^q>L@R{^VPx-g+wFSJGk-umyn%jry1g9(iIWmH}XY&(Pk%GXz!1R=)VmFfB;H}W1 zAF3nu3lid=)j(|ikiT1l)_RZUZhBsO=#b^C0x>KclbO&8@Pnd$)jCEseR-n)Ha~>x ztz1}by;LbQ^S?{!XCaK(sd@)*vDX6E7-P~UuiT(mD?c_R-lwy4**j+IL7*Qrw&i2G z%1iTT>+afAqUoMUpWqSO@Q$-K?~_VjjZcOlob(EUN0(F~TQqegsz)8I^W`m_pS1_7 zZUTq;MA&20G(nlwypt`)nWTpPk@T|{dCM84&je!*-XLES^{)}`FaeVz>gu{LJ4e94 z=eWdbNkS{ufJ#P6%Lf7B5H@j8KCl5~=gSh_HyBdzI8!mM64p;8opTGD(<}kEUhR^= zp{mdgQQZ7*eX*srx9q1g7Uf1#z;8s8Mp9Cz9Yq%$v%N%>VEM7LWF2m`%L?x@m0b zUy&OB1qYkX%>s4;WDiJOfDv&Ilf}OQom5oyPaZw>@D{v_U5@P_nd&PK5B|Q!(R*4Q z?xeynMfoprecgQEtp2ySawkG=Nbe+A!&-5U!Q%3}!zs5-_gG(2t#Gl{sFvlgEmgv- zv)JCgoich^V@*lgxcQP+ak94G4u&m2tr0~kj-zuMm2S7V##iVDTxD?06UjJg0Dc%aJK%bE# z3!mqhfTAg`&PQ7Z$Uta|Gy$Axisfe_rZnGXK4uuYh>T9r{V98L ar6S}fKVyX0p=M#m zN(Fu&x_zT&V31g|qY!mw-KRDxOoM?uso}QIeQj)B2(hEWl5b>{TZ!sPu9*`-7bfBL z%OLEmJ6XvEIP60d O@-4TNtc5@s8EwKBm5GdNK|f%H`((4AFcrJb;xe^@DB zk7j*%x4y>sg>$WxY$Nl&g-dG5_m?~Ju&aUad!rMgmpWQ+P=-RXV8ZDOGy9Zf(s5zB*gfs+e&Tu1u01CT}xc5GssJ3d&hM88>r zj`cMT>J`EI)mi& Nckt_S%qqLHv+2J z(;{zV5RT&7hffd-F{-?YCuDDDWv9(p%m}#wS?PD<4z)K1YpZ2xzmaQR8LGk2IS$AG zN`L33e|pBXQGyXNbYXDyQY7*NhEA5W2{w&;7>?Pq5%`{|=R$|brsSL6zf|JoK*6Of z t6ycGs)`xn1sbIE!j-w;$c{#CuOuotw+K;-2_>WWuTvX1 zJ`%|{lLqc$k&=89mXuWjtGc{LD_wzb9)0BZdi&Yw3J|3a4%6``kn7)2CIyjYii*8- zmg^-H@dO=qGsUui1gt!J`LjxXk)6!eaKoD9l&!c<`|V^%v)eZwTnOo}Su zFiz^(*%8h4dP7s6>4H3vuALj{OIvw1wjHMk!w&a@Y#oKrEO{29^y(mL8x1o#A8Abj zc&+5K8)+2=5z-2L{a_G24ppJ8{Q;i+JkY>Y|6z!_9==}y?1+vX1>5u)ua$@>PyYh- z?n>?G v&w z)YA06=kW$(lSzVw3o<&Pqn^GwF179o&^13R@ZkK*GHLQKJPjE>z@U)VA=Zth1sFRq z7JSwA&)f?dyXKmp@9-`d4gGef*%_c1aYj-hld~4=A-b11bWk_o4?fH<+`E%x;{o-u zRg-Ac!n;<66&iVJ@65#3r*YLf){T~ M5(xphXvRz;j+b4I5+DkX zFr;)GTTYnxS&mNEZVwG4?n~m-S_47x>p5pB=tTHUe*1T{X@oCcq{NH{*MY-XwZRxq zznOBby5h@1F{aZHz3XGPhJa&AlMR>b;TSld5%V{Xsd^M6(S;xD!Q4ULw}mzlfGN9a zi>&VY7(=8Z8@BR)**u?jXK9mKs*0DlU-a)igdwF+qZSwS8#3+%>r++25Ig4Zv?mG2 z4re4y=?AD{_TLuHd%aI(;?q9Ix{c%qsFe3j`!aIqObdbB2_3kF(H|yleLf(Th>a1{ zgDEW)1977vPtpiSbZ4a(KPJwS_@@ZDQE4wtE~Sp32%E44nM{jr05q+~zpXlwcLKHq zQplWnk(|DM{BfWu`)xY5XoFL9O$$_&ru;E?$$mZDH!%n;9=9Hn08n;wD_ubw=W^QA z9Z0Bh1#f1y!_pwpaRazdBvstiEl(K}Q^;nwaI3X!`YBhN(y)PYQ)w5Ph4jT7aAF)y zhscy8$a!kU@tHc-tUna{o#U4Q+416s28+7hEafbSh4ivqEg!UsuohA7phX`019Pon z<;;&bMF)fDfKJ%lff2_HmNojz)m@SSL2z4CQ!o{Jv!bQA3E@(WrA6$We*~15;t9q% zvM>1#u4r&E?a}2QR!SDa?AKw1Ij8=1zWWpaFO)vd(F=3%7-sc+Ku8M|VV_z3@G3Ro zVdh{;UR+I0rP8J`E9*S^dkzsQ#3Ig)^WNsZE$Yt8ofzID0spq2OOC70CMs~=;kU%I zgS%R79ExO?ql>b5mGi=(=VfscPq=yhf`sj%DUOLqMIvhyyAO^*;Bs^O-w+ WteTszj7@ 9V^RsZJ^CI4g`O*~^Pb;>}-+{n{zF5Mxa*yvSFaEM0eVQtD9Y7pm) zO~zHBWY=20=UbQ_&;QDu!2yQ`CTeC5ptkkZ^x45fuv&B6go+J|Tjhb|Eb=?d@r$In z!R&R;xKNt??2YAhM^l5Aec||E;xnF$y_n9ge$_buOZoCj;dlXJPq)hE#svK{$xlFi zWr%9%)wY1COozFI((7LXVS$VqrWZS*cg0_v9`ZD7nYX#bNsQi#R0J}rf#zQ)xpvo; zTsNX%4Zz4gI!5ijsdU+T(WXTw$!Z4(2Gj8;hKbafxz@RPTVwpZ{V&^{J%++OQdp1j zj-t>)sHJ^TK%6~2p)fx7_)N7DGh;-jpD#hzz0QvGr{-LW4fYAk3Cvj_dgW*29jAJg zvZhGf*^E;)u_V+HZ{4Y~ws?Zz6q_qR5JUxkdY@&Mp91j50d4(|Pm$pT_AUSJl6k@n zO6i6jm&PcP9s$t(o%!J~F3ZQWn>VLe)^<2{{mWzsD}7Tg11K(>o`GaLa#BlNiKCDu z)${~ $_tfHY)BeZ14dJTtzD>-#F{vYq`4Fy%?+y~(iqpdw3h%92cmsk=m}O< z=JpY-L&8GB^(pE1ya&(&pkjh2(P5-dg`^ry#-c}cU%=sw1_s6_iv4mNbKi`Cb-GFu zHMAz}5+5aNW8jz^u_F6KW|D7s6D@=>hPMJX(oI>7+lQ3?FKzm*0vMy3Kw$j5bA2 zOACV?v@89vx~6f}%q6IHYGw@}XzwJrzu>XxnBd1^hgN#6elB)lv3$(CASn6B@+&~A z0j*3Z>2j>Z;7p27mGm8%#1ls4H6F5Z!9QErInHvj#138{{A>fc`YNz|a|wRLf$DF$ z(CtM !H>|mDxQH#I;!}y3N=&%`!dA 7(*q$~N_XCL5^R_UKgQ9{rdvn~McmE+``0y_Lja9eS?TN4rvSPBOnIK*}w zYQ tF@2-KY8xDp%lqN3v~fss98Mdg-B0BMB`t}1o% z2Ej2@O)=)A2Xucwp99W!96_b%B!ZyMC9P>sO@oALOL4I03Hqr|d~A05`6|=WAAWqA z0R4{T)Cbsctuv4fe^bC!4q_E*!1mc_Tvs2Q>^Z4&=g}te(KBLyOw>dnzLP6g4Y(>H zWb) BU!J61@#2#i< AZ4eJH K*? zkbO|IPl4Ex4a)?!spMS@IIU+M)gFk;CQZtmYbC>mo7<8M$Sq1N#HQ=ynxDY*jp>Z} zBaS!`apbEn4Dbt0c6Qw8=8=76KZy%Nsdd+^wv^ndm`1EuFJRdWJ+9f%@?KqG4Qf4E zRPf&0Yz)&>QqaQb;%I9>P|?~Zv)IFGr3j8eD>udHtJbuTz2@l&tVo5%iG6V&-ICDE zXB0WfJ&R$?6Cp-u4a;%LkqBz*LKV-lfz?lm4K-ng9B^4NmzkiI4A~eD7s?zV>J@I! z#$QnD2FbNA9(Jwfa)r^v^7i(%-KB$$gabuA3u!OzUQJoM?mHfW3If`SE FCc)Q4eu6SSSutC6QG${8MgBPYWHl+jkKuGmb(IxLbnd_DQo z%~hmUg+rZLWKLYl5|uc;tM__!-ackAJLgpy*v9BSE+AB-uFv!yOTHT1b2mXDhhvHk zLl FyU-r!Y$SR!MkO;9jt1v&Y1;q#4fs$wrzH^pHgpjXC;GL z|HHlOG-c*;+Ezu!ls!7ycg~aUyxl8a^#!-RQ-fqPYh 74qt|{Np?`2+UaWE`R2U5sBF^$0dEX!%od~bNPpi35y&{ zsDq$>S*)AF@do>W(@mKql?5d>TIG^1J*+Y}X}S~C{Z_7azy~>3usjue_GFVw({6u| zp)oJip}_1J8%}Ee2U)e9`U$q>mp-Lds^7dr0zds5b%~0eFrUQcYBa?HAzF=)J6i44 zmZOOk3Bs@PXp8nE3{fLT;gEF##4v<~E!Qo^ohs3+x)VnTSZScw9 G8wsO;or%CL~37JQZ z;Y}6}X)WnBWUGP5T;sNB&_lCaMI;YBv3O0~6Fq2E6Q8>0DH*rKVOP%qHc=x$fPXv# z)pzG1Ds&8Zz+~;FbG&>v-Q4C~y~x{F8{R5xmFE-Uqxnxy8D=|9`hlj7M_4v7OdaRh zB`6w3bO6P~%oxpw9ju3!+0`5J=NTy9q)fuT)Q7Lf(vn2N7kTo%#%d)`#3hy6 Veob(Hfw&}IB+Jm%(lSThA4exTWvBvB} zFX=nwwWwh@u`RMLam7c7z7{tdP)C~t{(pn)hnkw0rpoz9Osf^(k937q3OWWVIaFvb z8biTO{I|@#(kT^zhxXSqM(jtUVx34u6aMp0JH5+rKNEy>n0WF2@eeXEIg0sebS4G) z!oJxHoderTgrX8}Bcj1VnQeU?`eEPk3Xriz^Gc!x6Yy9`e8f)3GhvZfC`};<3Dsd- z)<6u=LidAxmo9RQnLZ7)VIlr;9T5ejckx>yS&&p`9efoYX5gm1^-Sp2N6f4N(P!Lb z-e-H5N0l}p_!ATj O4A7qU1l$3LXQ_{8bB2m(0Oj=!duJ}% zAQ$0kmVAuxg%+TaQq@VK?#CnOw^6pSc-K%tO#c^^tt$X<#-~Ytrf`@j)v(9=0L_{u zIBh+XK^*dM$Mkpmz?NcH0DEqz-HdwBN3jAW IFI6-PRVmstOdV}QN4?g5Ly)p zctjwQQe96+_ZBqN^U_lBHxF}vpRnbh1nit{Y|k9laKH&!vBn@_&B{Z-YT-9IHE1P` zDF>vFZs>#VomEYgB$$u(ASCfZ;;sP{8*~c9duqW44(sn&WGBetOV=RJu-!L~Z-$R3 zw%UDM)~`H>3dbEgg8$#(Y01&7?Xc9e3*D!80)7)7fk{SD6Ae6T4ww8jl!)3~qNW?G z?BcCc`GY9<1A~&IYIf7jIFz)-^Y+4K)%zCnV0v}$&+tWLCi<0m#|a!=jOZ`156m0} zKvfbrtr#x^adQ@{%q+O~&rDF~fe~-Rf|c$0qegqAmwUH++Htjh#Z_8Q^cg&8B0w?A zocWLcGm0Dl>;3zAR+fxl4swQhf6V8IIn~TRB`NB~Fb)4vZd$#dq-bw@(trXk$f>?P z7*nkk5)_dIb9i