[{"content":"Hugo 使用指南 适用版本：Hugo v0.168.0（Extended）。命令以 macOS/Linux 的 shell 为例。根据 Hugo 官方文档整理，主题私有配置以实际主题仓库为准。\n1. 安装与版本检查 macOS（Homebrew）：\nbrew install hugo hugo version hugo env Linux 可使用对应发行版软件包或 Hugo 官方发布的二进制文件。使用 SCSS/Sass 或某些主题资产管道时，需要确认安装版本包含 Extended 功能。\n2. 创建项目 hugo new project myblog cd myblog git init 典型目录结构：\nmyblog/ ├── archetypes/ # 新文章模板 ├── assets/ # 需通过资源管道处理的资源 ├── content/ # Markdown 内容 ├── data/ # 数据文件 ├── i18n/ # 主题界面翻译 ├── layouts/ # 自定义模板，可覆盖主题模板 ├── static/ # 原样复制到网站根路径 ├── themes/ # 本地主题或 Git 子模块 ├── hugo.toml # 网站配置（也可使用 YAML 等格式） └── public/ # 构建产物（运行 hugo 后生成） Hugo 本体不附带完整博客外观。若没有可用主题或自定义布局，可能出现 found no layout file for \u0026quot;html\u0026quot; 的警告。\n3. 使用现成主题（Git 子模块） 以下以官方快速入门采用的 Ananke 主题为例：\ngit submodule add https://github.com/gohugo-ananke/ananke themes/ananke 在 hugo.toml 中配置（不要重复声明同一个 TOML 键）：\nbaseURL = \u0026#39;https://example.com/\u0026#39; title = \u0026#39;我的博客\u0026#39; theme = \u0026#39;ananke\u0026#39; 启动预览：\nhugo server -D 不同主题的菜单、主页、参数、Hugo 版本和资产编译依赖不同。迁移配置时优先参考主题 README 和示例站点，不应把另一款主题的 [params] 原样照搬。\nGit 子模块维护 新机器克隆：\ngit clone --recurse-submodules \u0026lt;仓库URL\u0026gt; 已有克隆补齐子模块：\ngit submodule sync --recursive git submodule update --init --recursive 更新子模块（会跟踪其配置的远端分支，应检查变更后提交）：\ngit submodule update --remote --merge git diff --submodule git add .gitmodules themes/ git commit -m \u0026#39;Update Hugo theme\u0026#39; 对子模块的 Git URL 做迁移时：先修改 .gitmodules 中的 url，然后执行 git submodule sync --recursive。CI 网络不稳定时可以改用可访问的 Git 镜像，但要保证镜像具有所需提交对象；也可以在克隆主仓库后自行初始化子模块。\n4. 创建和编辑文章 hugo new content posts/hello-world.md 示例文章：\n--- title: \u0026#34;Hello World\u0026#34; date: 2026-10-17T12:00:00+08:00 draft: false description: \u0026#34;文章简介\u0026#34; tags: [\u0026#34;Hugo\u0026#34;, \u0026#34;博客\u0026#34;] categories: [\u0026#34;技术\u0026#34;] --- 这是正文。 ## 一级章节 **加粗**、*斜体*、[外部链接](https://gohugo.io)。 重点字段：\n字段 用途 title 标题 date 文章时间 draft true 表示草稿，默认生产构建不发布 description 简介，是否展示由主题决定 tags、categories 分类法，具体页面展示由主题决定 slug 自定义 URL 末段（实际路径也受 permalink 配置影响） 注意：未来日期文章默认也可能不会纳入生产构建；需要检查日期、时区及 --buildFuture。\n图片与静态文件 全站静态文件放 static/images/logo.png，文章引用：\n![Logo](/images/logo.png) 页面资源包（page bundle）可使用：\ncontent/posts/hello/ ├── index.md └── cover.jpg index.md 中写 ![封面](cover.jpg)。若要用主题的图片处理、缩略图等功能，仍需遵循该主题的页面资源约定。\n5. 本地开发与构建 hugo server # 预览已发布内容 hugo server -D # 包含草稿 hugo server --bind 0.0.0.0 # 允许其他设备连接；注意网络访问控制 hugo # 输出到 public/ hugo --gc --minify # 常用生产构建 hugo -d dist # 输出到 dist/ Hugo 的构建命令不会在构建前自动清空输出目录。如果删除文章、修改 URL 或切换语言，旧文件可能保留。推荐在 CI 的临时构建目录中清空产物再执行构建，而非不加检查地清理任意路径。\nrm -rf public hugo --gc --minify 只有确认 public/ 是纯构建产物、没有用户数据时，才执行上述删除操作。\n6. 多语言站点 以下展示中文与英文的基本配置，支持的具体语言菜单和切换方式取决于主题：\nbaseURL = \u0026#39;https://example.com/\u0026#39; title = \u0026#39;我的博客\u0026#39; defaultContentLanguage = \u0026#39;zh-cn\u0026#39; defaultContentLanguageInSubdir = false [languages] [languages.zh-cn] languageName = \u0026#39;简体中文\u0026#39; languageCode = \u0026#39;zh-CN\u0026#39; weight = 1 title = \u0026#39;我的博客\u0026#39; [languages.en] languageName = \u0026#39;English\u0026#39; languageCode = \u0026#39;en-US\u0026#39; weight = 2 title = \u0026#39;My Blog\u0026#39; 按语言目录划分内容的一种组织方式：\ncontent/ ├── zh-cn/ │ └── posts/hello.md └── en/ └── posts/hello.md 使用上述语言目录布局前，应结合多语言内容目录配置或语言挂载确认内容正确归属。更简便、无需额外挂载的方式是同目录使用翻译文件名 hello.zh-cn.md 和 hello.en.md；默认语言也可按项目配置安排 URL。\n推荐：对于已经存在 content/posts/ 的站点，先采用文件名后缀法：\ncontent/posts/ ├── hello.zh-cn.md └── hello.en.md 翻译页面最好设置一致的 translationKey（仅在无法通过文件路径直接关联时需要），避免多语言菜单指向错误页面。\n7. Markdown 中使用 HTML Hugo 默认使用 Goldmark。若日志出现 Raw HTML omitted while rendering，说明 Markdown 中的原始 HTML 未被渲染。只有信任文章内容时才在 hugo.toml 中开启：\n[markup.goldmark.renderer] unsafe = true 开启后，文章内嵌 HTML 将参与输出；如果内容来自不可信投稿源，需考虑脚本注入风险。\n8. Git 与 Gitea Actions 发布 推荐将源码仓库（包括 .gitmodules、content/、hugo.toml 等）与静态发布仓库或分支分开。CI 的典型流程：\npush 到源码 main │ ▼ 拉取源码与主题子模块 │ ▼ 安装指定版本 Hugo │ ▼ 清理临时构建输出，执行 hugo --gc --minify │ ▼ 将 public/ 文件提交到发布仓库 main 或发布分支 │ ▼ Caddy / Nginx 对静态目录提供服务 可先在构建容器中验证这些命令：\ngit submodule sync --recursive git submodule update --init --recursive rm -rf public hugo --gc --minify find public -maxdepth 2 -type f | head Gitea Actions 示例工作流必须根据 act_runner 的标签、容器镜像、Git 认证、权限、Hugo 安装路径与目标分支 单独配置。不要假设 GITHUB_SHA 或自定义 COMMIT_SHA 在所有 shell 步骤中自动存在；脚本采用 set -u 时，未定义变量会直接导致构建失败。获取源码提交值可在已 checkout 的 Git 仓库中执行：\nSOURCE_SHA=\u0026#34;$(git rev-parse HEAD)\u0026#34; 目标发布仓库使用单独的工作目录，防止误删除源文件；推送前检查分支的非快进冲突，不建议将无检查的 git push --force 作为通用发布策略。\n9. 常见故障排查 9.1 found no layout file for \u0026quot;html\u0026quot; 原因通常是主题没有被正确加载、主题缺少对应模板，或者配置文件中的 theme 名称和 themes/ 目录不匹配。\nls -la themes/ cat .gitmodules hugo config | grep -i theme hugo --logLevel debug 确认主题目录内实际存在 layouts/ 等模板文件，并检查主题自己的使用说明。不要通过忽略警告解决空白站点。\n9.2 Raw HTML omitted 按第 7 节检查 markup.goldmark.renderer.unsafe，也可尽量将原始 HTML 改为 Markdown 或 Hugo shortcode。\n9.3 Git 子模块目录为空 git submodule status --recursive git submodule update --init --recursive 若报网络错误，检查 .gitmodules 中 URL、认证和构建容器内 DNS/代理，而不仅是宿主机网络。\n9.4 页面没发布 核对文章的 draft、日期、过期时间、语言以及目标主题路由；检查：\nhugo list all hugo list drafts hugo list future hugo list published 9.5 CI 构建成功但发布内容未变化 检查 public/ 是否包含预期 HTML、发布分支是否更新、Web 根目录是否指向最新部署位置，以及浏览器/CDN 是否缓存旧内容。不要先认定是 Hugo 缓存问题。\n10. 推荐的日常工作流 # 1. 拉取更新（包括子模块） git pull --ff-only git submodule update --init --recursive # 2. 新建文章 hugo new content posts/new-post.md # 3. 编辑并本地预览 hugo server -D # 4. 将文章 front matter 中 draft 改为 false # 5. 提交推送（CI 自动构建/发布） git add content/ git commit -m \u0026#39;Add new post\u0026#39; git push 11. 参考资料 Hugo 官方文档 快速开始 命令行参考 基本用法 Markdown 渲染配置 Hugo Modules ","permalink":"https://blog.imcaoxuan.cn/posts/2026-10-17-hugo-usage-guide/","summary":"\u003ch1 id=\"hugo-使用指南\"\u003eHugo 使用指南\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e适用版本：Hugo v0.168.0（Extended）。命令以 macOS/Linux 的 shell 为例。根据 Hugo 官方文档整理，主题私有配置以实际主题仓库为准。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"1-安装与版本检查\"\u003e1. 安装与版本检查\u003c/h2\u003e\n\u003cp\u003emacOS（Homebrew）：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebrew install hugo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo version\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo env\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLinux 可使用对应发行版软件包或 Hugo 官方发布的二进制文件。使用 SCSS/Sass 或某些主题资产管道时，需要确认安装版本包含 Extended 功能。\u003c/p\u003e\n\u003ch2 id=\"2-创建项目\"\u003e2. 创建项目\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo new project myblog\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd myblog\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit init\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e典型目录结构：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emyblog/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── archetypes/       # 新文章模板\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── assets/           # 需通过资源管道处理的资源\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── content/          # Markdown 内容\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── data/             # 数据文件\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── i18n/             # 主题界面翻译\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── layouts/          # 自定义模板，可覆盖主题模板\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── static/           # 原样复制到网站根路径\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── themes/           # 本地主题或 Git 子模块\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e├── hugo.toml         # 网站配置（也可使用 YAML 等格式）\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e└── public/           # 构建产物（运行 hugo 后生成）\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHugo 本体不附带完整博客外观。若没有可用主题或自定义布局，可能出现 \u003ccode\u003efound no layout file for \u0026quot;html\u0026quot;\u003c/code\u003e 的警告。\u003c/p\u003e","title":"Hugo 使用指南"},{"content":"在一台用作旁路由的 Armbian 上同时运行 sing-box 和 WireGuard。旁路由本机可以解析内网域名，下游终端将其设为 DNS 服务器却始终超时。最终发现问题不在 DNS 匹配规则，而在 sing-box 向上游 DNS 发出的流量选错了出口接口。\n本文示例地址均为重写后的示意值，不是原始网络配置；保留了私有网络的拓扑关系与协议行为。\n网络拓扑与现象 角色 示例地址 作用 下游终端 192.168.10.20 DNS 客户端 旁路由 LAN 192.168.10.254 / eth0 sing-box DNS 监听地址 旁路由 WireGuard 10.77.0.11 / wg0 隧道客户端 内网 DNS 10.77.0.1:53 WireGuard 对端 DNS 拓扑如下：\n终端 192.168.10.20 │ DNS 查询 ▼ 旁路由 192.168.10.254:53 (sing-box DNS 入站) │ 期望：由 wg0 向 10.77.0.1:53 查询 ▼ WireGuard 对端 DNS 10.77.0.1:53 内网测试域名采用 service.home.arpa（示例）。现象是：\n旁路由本机解析该域名正常； 下游明确指定旁路由的 LAN IP 为 DNS 时，连续超时； sing-box 监听 UDP 53，相关入站路由规则已确认正常。 第一步：确认入站请求到达 在旁路由抓下游终端的 DNS 流量：\nsudo tcpdump -i eth0 -nn -K -l \\ \u0026#39;host 192.168.10.20 and udp port 53\u0026#39; 观察到同一个 DNS Transaction ID 的请求每隔几秒重试，但没有对应的成功响应。这说明客户端确实把查询交给了旁路由，但处理链路没有完成。\n检查监听端口：\nsudo ss -lnup | grep \u0026#39;:53 \u0026#39; 可以确认 sing-box 监听旁路由 LAN IP 的 UDP 53。\n第二步：分别观察 LAN 和 WireGuard 出口 不要一开始就打印所有 DNS 流量。可以开两个终端，分别观察：\n# LAN：只看该下游终端 sudo tcpdump -i eth0 -nn -K -l \u0026#39;host 192.168.10.20 and udp port 53\u0026#39; # WireGuard：只看目标 DNS sudo tcpdump -i wg0 -nn -K -l \u0026#39;host 10.77.0.1 and udp port 53\u0026#39; 然后从下游发起一次明确的查询：\nnslookup -type=A service.home.arpa 192.168.10.254 本案例中发现：下游的请求确实到达了 LAN，但 sing-box 对 DNS 上游的新查询却从 eth0 发出，源地址是 LAN IP，而不是从 wg0 使用 WireGuard IP 发出。\n关键区别： DNS 规则“选择某个上游服务器”与操作系统/应用“通过哪个接口连接那个服务器”是两件事。即使规则命中正确，只要实际出口错误，请求仍可能超时。\n第三步：为 sing-box DNS 上游绑定接口 故障时的上游配置类似：\n{ \u0026#34;type\u0026#34;: \u0026#34;udp\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;internal-dns\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;10.77.0.1\u0026#34; } 修复后：\n{ \u0026#34;type\u0026#34;: \u0026#34;udp\u0026#34;, \u0026#34;tag\u0026#34;: \u0026#34;internal-dns\u0026#34;, \u0026#34;server\u0026#34;: \u0026#34;10.77.0.1\u0026#34;, \u0026#34;bind_interface\u0026#34;: \u0026#34;wg0\u0026#34; } bind_interface 作用于该 DNS 服务器的网络拨号，使它使用指定接口。在有 TUN、策略路由和 WireGuard 的环境中，比单纯依赖系统自动选路更明确。\n检查配置、重启服务（修改为自己实际的配置路径）：\nsudo sing-box check -c /etc/sing-box/config.json sudo systemctl restart sing-box 之后再次查询并抓 wg0：\nsudo tcpdump -i wg0 -nn -K -l \u0026#39;host 10.77.0.1 and udp port 53\u0026#39; 应看到 wg0 上的请求及对应响应。本案例实际加上 bind_interface 后，下游 DNS 查询恢复正常。\n旁支现象：A 记录成功后又出现 NXDOMAIN 排查时还遇到另一类现象：某个内网名称通过 CNAME 最终指向单标签主机名，A 查询正常返回地址，但随后对终点主机名发起的 AAAA 查询返回 NXDOMAIN。这属于另一个尚需单独定位的解析异常，不能把它当成此次下游查询超时的原因。\n如果看到类似现象，应分别执行：\ndig @\u0026lt;DNS服务器地址\u0026gt; service.home.arpa A dig @\u0026lt;DNS服务器地址\u0026gt; service.home.arpa AAAA 并检查 CNAME 是否指向意料之外的单标签名称，以及本地解析器与上游 DNS 的返回是否一致。\n排障要点 按 客户端 → 旁路由入站 → 上游出口 → 上游响应 → 客户端响应 分段抓包。 验证的是报文的实际出口接口和源 IP，不能只看 DNS 配置中的 server 字段。 只收到客户端请求、不见匹配的响应时，优先检查上游出口；不必立即修改已经验证正确的路由规则。 若 TCPdump 提示 bad udp cksum，本机发包时可能是网卡 checksum offload 的结果；-K 可关闭抓包时的校验和检查。 home.arpa 是家庭网络使用的特殊用途域名；不要把实际公网域名、设备名称、内网地址和隧道拓扑原样发布到公开博客。 结论： 最终故障点是 sing-box 对内网 DNS 的上游 UDP 查询从 LAN 接口发出，未走 WireGuard。给相应的 DNS 上游服务器设置 bind_interface: \u0026quot;wg0\u0026quot; 后修复。\n","permalink":"https://blog.imcaoxuan.cn/posts/2026-10-23-troubleshooting-dns-timeouts-on-a-bypass-router-sing-box-upstream-queries-leave-through-the-wrong-network-interface/","summary":"\u003cp\u003e在一台用作旁路由的 Armbian 上同时运行 sing-box 和 WireGuard。旁路由本机可以解析内网域名，下游终端将其设为 DNS 服务器却始终超时。最终发现问题不在 DNS 匹配规则，而在 \u003cstrong\u003esing-box 向上游 DNS 发出的流量选错了出口接口\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e本文示例地址均为\u003cstrong\u003e重写后的示意值\u003c/strong\u003e，不是原始网络配置；保留了私有网络的拓扑关系与协议行为。\u003c/p\u003e\n\u003ch2 id=\"网络拓扑与现象\"\u003e网络拓扑与现象\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e角色\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e示例地址\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e作用\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e下游终端\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003e192.168.10.20\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDNS 客户端\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e旁路由 LAN\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003e192.168.10.254\u003c/code\u003e / \u003ccode\u003eeth0\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003esing-box DNS 监听地址\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e旁路由 WireGuard\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003e10.77.0.11\u003c/code\u003e / \u003ccode\u003ewg0\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e隧道客户端\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e内网 DNS\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003e10.77.0.1:53\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eWireGuard 对端 DNS\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e拓扑如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e终端 192.168.10.20\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  │ DNS 查询\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ▼\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e旁路由 192.168.10.254:53 (sing-box DNS 入站)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  │ 期望：由 wg0 向 10.77.0.1:53 查询\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ▼\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWireGuard 对端 DNS 10.77.0.1:53\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e内网测试域名采用 \u003ccode\u003eservice.home.arpa\u003c/code\u003e（示例）。现象是：\u003c/p\u003e","title":"排查旁路由 DNS 超时：sing-box 上游查询走错网络接口"},{"content":"在 Armbian 上部署 sing-box TUN 后，我遇到了一个不太直观的问题：IPv6 ping 能通，但开启 auto_redirect 后，IPv6 HTTPS 连接超时。\n最终发现，故障并不在 IPv6 公网路由或代理节点，而是 Linux 回环接口 lo 缺少 ::1/128 地址。本文记录定位过程和修复方法。\n环境 Linux：Armbian，ARM64，6.18 系列内核 sing-box：1.14.x 网络管理：Netplan + NetworkManager 透明代理：TUN，auto_route: true，auto_redirect: true IPv6：上游自动配置，接口已有全局 IPv6 地址和 RA 默认路由 为保护隐私，本文省略了真实公网地址、MAC、路由器地址、域名及自定义内部路由表编号。以下示例中的 ULA 地址和测试目标用于演示。\n故障现象 直接测试 IPv6 HTTPS：\ncurl --noproxy \u0026#39;*\u0026#39; -6 -v --connect-timeout 5 \\ --resolve \u0026#39;cloudflare.com:443:[2606:4700::6810:85e5]\u0026#39; \\ https://cloudflare.com/ 开启 sing-box 后：\n* Trying [2606:4700::6810:85e5]:443... * Connection timed out after 5002 milliseconds curl: (28) Connection timed out 对照实验：\n状态 IPv6 HTTPS 停止 sing-box 正常 auto_redirect: true 超时 auto_redirect: false 正常 单纯的 ping -6 测试却可能成功。ICMP 连通不能替代 TCP/HTTPS 测试。\n排查过程 1. 排除 IPv6 地址与默认路由问题 ip -6 addr show dev eth0 scope global ip -6 route show default 接口已有全局 IPv6 地址，默认路由由 RA 学到，形如：\ndefault via fe80::... dev eth0 proto ra NetworkManager 管理 IPv6 时，不应仅凭 net.ipv6.conf.eth0.accept_ra 的值判断 RA 是否正常；需要结合实际地址及路由观察。\n2. 发现 TCP 未直接出现在 tun0 或 eth0 通过抓包观察 HTTPS 目标：\nsudo tcpdump -ni tun0 \u0026#39;ip6 and tcp port 443\u0026#39; sudo tcpdump -ni eth0 \u0026#39;ip6 and tcp port 443\u0026#39; 在启用 auto_redirect 的情况下，未看到预期的目标 IPv6 TCP SYN。这不一定是丢包：sing-box 的 nftables 规则可能先将 TCP 重定向到本地端口。\n3. 检查 nftables 的本地 REDIRECT sudo nft -a list table inet sing-box 规则中可见类似内容：\nmeta l4proto tcp ... queue flags bypass to 100 meta l4proto tcp ... redirect to :23457 return 其中端口为本次排查环境中的内部监听端口，其他版本或配置可能不同。检查 IPv6 监听：\nsudo ss -6 -lntp \u0026#39;( sport = :23457 )\u0026#39; sing-box 确实在监听该端口。\n继续抓回环接口：\nsudo tcpdump -ni lo -vv \u0026#39;tcp port 23457\u0026#39; 此时看到的关键报文形如：\nIP6 2001:db8::1234.4210 \u0026gt; ::1.23457: Flags [S] IP6 2001:db8::1234.4210 \u0026gt; ::1.23457: Flags [S] IP6 2001:db8::1234.4210 \u0026gt; ::1.23457: Flags [S] 上面的 2001:db8::/32 是文档专用 IPv6 示例前缀，不是真实公网地址。\nSYN 不断重传，没有 SYN-ACK，说明连接已经重定向到本机 ::1，但本地 TCP 握手没有完成。\n4. 找到根因：回环接口缺失 IPv6 地址 ip -6 addr show dev lo 输出竟然为空。正常情况下，回环接口应该有：\ninet6 ::1/128 scope host 由于缺少 ::1/128，IPv6 TCP REDIRECT 指向本地 ::1 后无法正常建立连接。这与抓到的重复 SYN、无 SYN-ACK 现象吻合。\n修复方法 先检查 lo 的 IPv6 状态：\nip link show lo sysctl net.ipv6.conf.lo.disable_ipv6 ip -6 addr show dev lo 如果禁用了 IPv6：\nsudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0 确保回环接口已启用：\nsudo ip link set lo up 如果 ::1/128 仍没有出现，手动补充：\nsudo ip -6 addr add ::1/128 dev lo 验证：\nip -6 addr show dev lo ping -6 -c 2 ::1 curl --noproxy \u0026#39;*\u0026#39; -6 --connect-timeout 5 https://api6.ipify.org 确认 auto_redirect: true 时 HTTPS 也正常，才算解决了该故障。\n如果问题发生在重启后，检查 /etc/sysctl.d/ 是否存在禁用 lo IPv6 的配置，可在 sysctl 配置文件中明确设置：\nnet.ipv6.conf.lo.disable_ipv6 = 0 需要注意：这项配置只是保证没有禁用 lo 的 IPv6，不等于自动保证 ::1/128 永远存在。如果重启后地址再次消失，应继续追查启动顺序或管理 lo 的服务。\n总结 IPv6 ping 成功不能说明 IPv6 TCP 代理正常，必须使用真实 HTTPS 请求验证。 开启 sing-box auto_redirect 后，部分 TCP 流量会被 nftables 重定向到本地端口；只抓 eth0 或 tun0 可能看不到预期目标流量。 通过 ss 确认监听、通过 tcpdump -i lo 发现 SYN 重传，是本次定位的关键。 最终故障点是 lo 缺少 IPv6 回环地址 ::1/128。 临时关闭 auto_redirect 能绕开问题，但修复回环接口才是针对本次故障的解决办法。 诊断命令速查 ip -6 addr show dev lo sysctl net.ipv6.conf.lo.disable_ipv6 ip -6 route show default sudo nft -a list table inet sing-box sudo ss -6 -lntp \u0026#39;( sport = :23457 )\u0026#39; sudo tcpdump -ni lo \u0026#39;tcp port 23457\u0026#39; 后续补充：启用 UFW 后下游设备无法联网 在解决 IPv6 回环问题之后，为 Armbian 启用 UFW，又遇到新的现象：Armbian 本机访问网络正常，下游通过它联网的设备却无法正常访问网络。\n首先查看 UFW 拦截日志：\nsudo ufw logging medium sudo journalctl -k -f -o cat | grep --line-buffered \u0026#39;UFW BLOCK\u0026#39; 以下为经过脱敏的代表性日志，IP 使用 RFC 5737 文档示例地址，不能直接照抄到真实网络配置：\n[UFW BLOCK] IN=eth0 OUT= SRC=192.0.2.20 DST=192.0.2.254 PROTO=TCP DPT=9091 SYN [UFW BLOCK] IN=eth0 OUT= SRC=192.0.2.20 DST=192.0.2.254 PROTO=TCP DPT=22703 SYN 这里 OUT= 为空，目标是本机地址，因此这些请求被识别为 INPUT（访问 Armbian 本机），而不是常规的 FORWARD。此前直接怀疑 deny routed 并不完整。\n随后用以下命令确认监听进程：\nsudo ss -lntup | grep -E \u0026#39;:(9091|22703)\\b\u0026#39; 结果显示两个 TCP 端口都由 sing-box 监听，其中一个绑定到 LAN IPv4，另一个绑定到通配地址。将对应入站端口放行后，下游设备恢复联网。需要强调：这能证明端口可达性与故障有关，但不能仅凭监听结果推断它们就是 TUN 端口或某项特定功能。应检查 sing-box 配置确定具体用途。\n如果服务只供 LAN 使用，UFW 可以将规则限制到实际 LAN 地址和网段。下面仅是使用 RFC 5737 示例网段的规则模板，必须替换为自己的真实值：\nsudo ufw allow in on eth0 from 192.0.2.0/24 to 192.0.2.254 port 9091 proto tcp sudo ufw allow in on eth0 from 192.0.2.0/24 to 192.0.2.254 port 22703 proto tcp 安全提示：不建议直接执行没有来源限制的 ufw allow 22703/tcp；如果端口监听通配地址，还应特别检查公网 IPv6 是否被意外开放。也不应为了下游恢复联网，长期把全部 routed 流量改为默认允许。\n本次补充的排障要点是：先按 IN / OUT 区分 INPUT 和 FORWARD，再确认监听进程，最后按实际来源精确放行。UFW 的状态页面也不能代替 nft list ruleset，因为 sing-box 的 auto_redirect 另有 nftables 规则。\n","permalink":"https://blog.imcaoxuan.cn/posts/2026-10-23-ipv6-https-timeouts-after-enabling-sing-box-auto-redirect-on-armbian-troubleshooting-a-missing-loopback-address/","summary":"\u003cp\u003e在 Armbian 上部署 sing-box TUN 后，我遇到了一个不太直观的问题：\u003cstrong\u003eIPv6 ping 能通，但开启 \u003ccode\u003eauto_redirect\u003c/code\u003e 后，IPv6 HTTPS 连接超时\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e最终发现，故障并不在 IPv6 公网路由或代理节点，而是 \u003cstrong\u003eLinux 回环接口 \u003ccode\u003elo\u003c/code\u003e 缺少 \u003ccode\u003e::1/128\u003c/code\u003e 地址\u003c/strong\u003e。本文记录定位过程和修复方法。\u003c/p\u003e\n\u003ch2 id=\"环境\"\u003e环境\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLinux：Armbian，ARM64，6.18 系列内核\u003c/li\u003e\n\u003cli\u003esing-box：1.14.x\u003c/li\u003e\n\u003cli\u003e网络管理：Netplan + NetworkManager\u003c/li\u003e\n\u003cli\u003e透明代理：TUN，\u003ccode\u003eauto_route: true\u003c/code\u003e，\u003ccode\u003eauto_redirect: true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIPv6：上游自动配置，接口已有全局 IPv6 地址和 RA 默认路由\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e为保护隐私，本文省略了真实公网地址、MAC、路由器地址、域名及自定义内部路由表编号。以下示例中的 ULA 地址和测试目标用于演示。\u003c/p\u003e\n\u003ch2 id=\"故障现象\"\u003e故障现象\u003c/h2\u003e\n\u003cp\u003e直接测试 IPv6 HTTPS：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl --noproxy \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;*\u0026#39;\u003c/span\u003e -6 -v --connect-timeout \u003cspan style=\"color:#ae81ff\"\u003e5\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --resolve \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;cloudflare.com:443:[2606:4700::6810:85e5]\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  https://cloudflare.com/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e开启 sing-box 后：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* Trying [2606:4700::6810:85e5]:443...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* Connection timed out after 5002 milliseconds\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl: (28) Connection timed out\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e对照实验：\u003c/p\u003e","title":"Armbian 上 sing-box 开启 auto_redirect 后 IPv6 HTTPS 超时：一次回环地址缺失的排查"},{"content":"在 Linux 旁路由上同时运行 UFW 和 sing-box TUN 时，可能出现一种容易误判的故障：sing-box 本机运行正常，但局域网设备通过旁路由访问互联网失败。即使放行了当时被拦截的 TCP 端口，重启 sing-box 后问题也可能再次出现。\n本文记录一种实际观察到的原因和待回归验证的修复方式。示例均使用文档保留地址，不对应真实网络。\n环境和症状 Linux 旁路由，LAN 接口为 eth0，地址 192.0.2.1（仅作示例）。 下游终端 192.0.2.20，使用旁路由作为 IPv4 网关。 sing-box 的 TUN 接口名为 tun0，开启 auto_route 和 auto_redirect。 UFW 默认拒绝未经允许的入站流量。 sing-box 的关键配置：\n{ \u0026#34;type\u0026#34;: \u0026#34;tun\u0026#34;, \u0026#34;interface_name\u0026#34;: \u0026#34;tun0\u0026#34;, \u0026#34;auto_route\u0026#34;: true, \u0026#34;auto_redirect\u0026#34;: true } 故障期间日志类似：\n[UFW BLOCK] IN=eth0 OUT= SRC=192.0.2.20 DST=192.0.2.1 PROTO=TCP DPT=24461 SYN DPT=24461 只是一次运行时观察到的动态端口，不应该把它永久写死在 UFW 里。OUT= 为空，提示包正在进入本机的 INPUT 路径，而不只是穿过 FORWARD 路径。\n追踪 NAT 重定向 检查 sing-box 监听：\nsudo ss -lntup | grep sing-box 检查 nftables：\nsudo nft -a list ruleset | grep -n -C 8 -E \u0026#39;redirect|tproxy\u0026#39; 故障场景中能看到类似规则：\nmeta l4proto tcp redirect to :24461 # 内部端口不允许直接连接 tcp dport 24461 ct status ! dnat reject with tcp reset 也就是说，sing-box 先将目标 TCP 连接重定向到本机监听端口，再由 UFW 的 INPUT 规则决定是否允许。将这一类流量当成普通 FORWARD 包去放行，通常无法消除观察到的 INPUT 拦截。\n修复思路：匹配 DNAT 连接，而不是动态端口 对于明确可信的单个下游终端，可以临时尝试：\nsudo iptables -I ufw-before-input 1 \\ -i eth0 \\ -s 192.0.2.20/32 \\ -d 192.0.2.1 \\ -p tcp \\ -m conntrack --ctstate DNAT \\ -j ACCEPT 注意把示例 IP 和接口替换为实际值。DNAT 属于 --ctstate 的有效虚拟状态；不是 --ctstatus，后者会报错 Bad ctstatus \u0026quot;DNAT\u0026quot;。\n这条规则仍有安全边界：它匹配符合条件的 DNAT TCP 连接，而不仅是 sing-box 创建的连接。因此应该限制来源和入口接口，不要为了省事全局放行 INPUT。\n验证 在下游设备运行：\ncurl -4 -v --connect-timeout 5 https://www.cloudflare.com/ 在旁路由观察规则计数和拦截日志：\nsudo iptables -L ufw-before-input -n -v --line-numbers sudo journalctl -k --since \u0026#39;10 minutes ago\u0026#39; --grep=\u0026#39;UFW BLOCK\u0026#39; --no-pager 如计数上升、联网恢复，并且 sing-box 重启、内部端口发生变化后仍正常，才可认为此方法适用于当前部署。\n持久化 确认验证成功后，先备份：\nsudo cp -a /etc/ufw/before.rules /etc/ufw/before.rules.bak sudo nano /etc/ufw/before.rules 在 *filter 区域中，所有链定义之后、现有 ufw-before-input 处理规则之前添加：\n-A ufw-before-input -i eth0 -s 192.0.2.20/32 -d 192.0.2.1 -p tcp -m conntrack --ctstate DNAT -j ACCEPT 检查并重载：\nsudo iptables-restore --test \u0026lt; /etc/ufw/before.rules sudo ufw reload 回滚时用备份恢复文件并 sudo ufw reload。临时测试规则也可以通过 iptables -D 携带与插入时完全一致的匹配参数删除。\n注意事项 不要直接使用 ufw default allow routed 或关闭整个 UFW 作为长期方案。 此方案主要针对 IPv4 TCP 重定向后的 INPUT 拦截，不是对所有 UDP、IPv6 或 WireGuard 故障的通用修复。 其他明确配置的 API、DNS、SOCKS 等监听端口，应继续按实际用途限制访问来源。 UFW 与 sing-box 都可能修改 nftables；如果规则匹配计数增加但连接仍失败，还应检查其他 base chain 的 hook 优先级及后续丢弃规则。 参考 sing-box 官方 TUN 文档 iptables-extensions：conntrack 匹配说明 ","permalink":"https://blog.imcaoxuan.cn/posts/2026-10-23-troubleshooting-ufw-and-sing-box-tun-auto-redirect-conflicts/","summary":"\u003cp\u003e在 Linux 旁路由上同时运行 UFW 和 sing-box TUN 时，可能出现一种容易误判的故障：sing-box 本机运行正常，但局域网设备通过旁路由访问互联网失败。即使放行了当时被拦截的 TCP 端口，重启 sing-box 后问题也可能再次出现。\u003c/p\u003e\n\u003cp\u003e本文记录一种实际观察到的原因和\u003cstrong\u003e待回归验证\u003c/strong\u003e的修复方式。示例均使用文档保留地址，不对应真实网络。\u003c/p\u003e\n\u003ch2 id=\"环境和症状\"\u003e环境和症状\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLinux 旁路由，LAN 接口为 \u003ccode\u003eeth0\u003c/code\u003e，地址 \u003ccode\u003e192.0.2.1\u003c/code\u003e（仅作示例）。\u003c/li\u003e\n\u003cli\u003e下游终端 \u003ccode\u003e192.0.2.20\u003c/code\u003e，使用旁路由作为 IPv4 网关。\u003c/li\u003e\n\u003cli\u003esing-box 的 TUN 接口名为 \u003ccode\u003etun0\u003c/code\u003e，开启 \u003ccode\u003eauto_route\u003c/code\u003e 和 \u003ccode\u003eauto_redirect\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003eUFW 默认拒绝未经允许的入站流量。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003esing-box 的关键配置：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;tun\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003e\u0026#34;interface_name\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;tun0\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003e\u0026#34;auto_route\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003e\u0026#34;auto_redirect\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e故障期间日志类似：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[UFW BLOCK] IN=eth0 OUT= SRC=192.0.2.20 DST=192.0.2.1 PROTO=TCP DPT=24461 SYN\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eDPT=24461\u003c/code\u003e 只是一次运行时观察到的动态端口，\u003cstrong\u003e不应该把它永久写死在 UFW 里\u003c/strong\u003e。\u003ccode\u003eOUT=\u003c/code\u003e 为空，提示包正在进入本机的 INPUT 路径，而不只是穿过 FORWARD 路径。\u003c/p\u003e\n\u003ch2 id=\"追踪-nat-重定向\"\u003e追踪 NAT 重定向\u003c/h2\u003e\n\u003cp\u003e检查 sing-box 监听：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo ss -lntup | grep sing-box\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e检查 nftables：\u003c/p\u003e","title":"UFW 与 sing-box TUN auto_redirect 冲突：动态端口被拦截的排查"},{"content":"使用 CrowdSec 为 Debian 服务器实现恶意 IP 自动封禁 公网服务器每天都会遇到各种自动化扫描。\n即使没有主动公开服务地址，SSH 端口也经常会收到针对 root、admin、test 等用户名的登录尝试。Web 服务则可能遭遇针对 .env、wp-admin、phpinfo.php 等路径的探测。\n这些请求大多来自自动化扫描程序。虽然不一定构成实际入侵，但会产生大量无意义的日志，同时增加服务暴露面。\n单纯依靠防火墙静态规则，难以根据攻击行为动态调整封禁名单。\n因此，我选择尝试 CrowdSec，通过服务器日志识别恶意行为，再联动 nftables 自动封禁攻击来源。\n本文记录在 Debian 12 上部署 CrowdSec 的过程，以及它如何判断一个 IP 是否应该被封禁。\n一、CrowdSec 是什么？ CrowdSec 是一个开源的入侵检测与安全响应系统。\n它通过分析 SSH、Web Server 等服务产生的日志，检测暴力破解、漏洞扫描、恶意爬虫等行为。\n与传统的静态 IP 黑名单不同，CrowdSec 主要根据行为特征决定是否封禁，并且可以利用社区威胁情报。\nCrowdSec 的工作可以分为两部分：\nSecurity Engine：读取日志，识别攻击，生成封禁决策。 Remediation Component（Bouncer）：执行封禁决策，例如修改防火墙规则。 两者相互独立。\n也就是说，仅安装 CrowdSec Security Engine，并不会自动阻止网络连接。\n1.1 工作流程 SSH / Caddy / Nginx | v Application Logs | v CrowdSec Parser | v Detection Scenarios | v Security Alerts | v Decision Profiles | v Local API | v Firewall Bouncer | v nftables | v Block IP CrowdSec 将日志分析与防火墙执行解耦，意味着它既可以在单台服务器上使用，也能通过中心 API 向多台服务器下发封禁决策。\n1.2 CrowdSec 与 Fail2ban Fail2ban 是 Linux 上常见的自动封禁工具。\n两者都能通过日志检测 SSH 暴力破解，但设计思路存在差异。\n特性 CrowdSec Fail2ban SSH 暴力破解检测 支持 支持 Web 攻击检测 支持 支持，通常需要对应过滤规则 社区威胁情报 支持 通常需要额外集成 分布式部署 原生支持 通常需要自行集成 封禁方式 Bouncer Action 检测规则 Parser + Scenario Filter + Jail 配置复杂度 相对较高 相对较低 如果只需要封禁 SSH 登录失败的 IP，Fail2ban 已经足够。\n如果希望同时保护多个 Web 服务、SSH 和其他网络服务，CrowdSec 的模块化架构更有扩展空间。\n二、部署环境 本文使用以下环境：\n项目 配置 操作系统 Debian 12 Bookworm CrowdSec 1.8.x 防火墙 nftables 安装方式 APT 检测目标 SSH、Caddy、Nginx 封禁方式 Firewall Bouncer 采用原生安装，而不是 Docker。\n主要原因是 CrowdSec 需要读取宿主机的 systemd journal，并通过 Bouncer 操作系统防火墙。原生安装能够减少额外的权限、网络和挂载配置。\n三、安装 CrowdSec 3.1 添加官方 APT 仓库 首先安装依赖：\nsudo apt update sudo apt install -y \\ debian-archive-keyring \\ ca-certificates \\ curl \\ gnupg 创建密钥目录：\nsudo install -d -m 0755 /etc/apt/keyrings 导入 CrowdSec 软件源的签名密钥：\ncurl -fsSL \\ https://packagecloud.io/crowdsec/crowdsec/gpgkey | sudo gpg --dearmor \\ -o /etc/apt/keyrings/crowdsec.gpg 添加软件源：\necho \\ \u0026#34;deb [signed-by=/etc/apt/keyrings/crowdsec.gpg] https://packagecloud.io/crowdsec/crowdsec/any any main\u0026#34; | sudo tee /etc/apt/sources.list.d/crowdsec.list 更新 APT 缓存：\nsudo apt update 检查软件包来源：\napt-cache policy crowdsec 确认使用的是官方仓库后安装：\nsudo apt install -y crowdsec 检查版本：\nsudo cscli version 查看服务：\nsudo systemctl status crowdsec 3.2 安装 Firewall Bouncer CrowdSec 本身负责检测，但不直接执行防火墙封禁。\n因此，需要额外安装 Firewall Bouncer。\n本文采用 nftables：\nsudo apt install -y \\ crowdsec-firewall-bouncer-nftables 设置服务自启：\nsudo systemctl enable --now \\ crowdsec-firewall-bouncer 检查状态：\nsudo systemctl status \\ crowdsec-firewall-bouncer 检查 Bouncer 是否注册到 CrowdSec：\nsudo cscli bouncers list 正常情况下应看到：\nName Valid Type firewall-bouncer true crowdsec-firewall-bouncer 名称只是示例，实际名称可能包含安装时自动生成的后缀。\nBouncer 的配置文件一般位于：\n/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml 其中需要重点关注：\nmode: nftables api_url: http://127.0.0.1:8080/ 此外还包含 API Key。\n通过 APT 安装时通常会自动完成 API 注册，因此不建议直接覆盖整个配置文件。\n四、配置 SSH 攻击检测 SSH 是公网服务器最常见的攻击入口之一。\n即使已经禁用密码登录，仍然可能收到大量无效用户名探测和公钥认证尝试。\n4.1 安装 SSH Collection CrowdSec Hub 提供了预定义的 SSH 检测规则。\n安装：\nsudo cscli collections install \\ crowdsecurity/sshd 查看：\nsudo cscli collections list Collection 是一组 Parser 和 Scenario 的集合。\n其中：\nParser 负责理解 SSH 日志。 Scenario 负责判断是否构成攻击。 4.2 配置 journald Debian 12 默认使用 systemd，因此可以直接从 journald 获取 SSH 日志。\n首先检查：\nsudo journalctl -u ssh.service \\ -n 20 --no-pager 如果能看到 SSH 登录记录，就可以配置 CrowdSec 读取对应的日志。\n创建文件：\n/etc/crowdsec/acquis.d/ssh.yaml 写入：\nsource: journalctl journalctl_filter: - \u0026#34;_SYSTEMD_UNIT=ssh.service\u0026#34; labels: type: syslog 这里需要注意两个细节。\n第一，journalctl_filter 必须匹配实际的日志字段。\n第二，type: syslog 告诉 CrowdSec 采用相应的日志解析流程，不应随意改为 sshd。\n如果安装时自动发现的日志源已经包含 SSH，应避免重复采集。\n验证配置：\nsudo crowdsec -t 重启服务：\nsudo systemctl restart crowdsec 检查采集情况：\nsudo cscli metrics show acquisition SSH 出现新的日志事件后，应该可以在采集统计中看到对应来源。\n4.3 验证 SSH 日志解析 可以利用 cscli explain 测试日志解析器。\n下面使用文档保留 IP，避免暴露真实攻击来源：\nsudo cscli explain \\ --log \u0026#39;Oct 19 18:48:40 server sshd[1234]: Invalid user test from 203.0.113.10 port 51878\u0026#39; \\ --type syslog 如果解析成功，应能看到相应的 syslog 和 SSH 解析流程。\n注意：cscli explain 是日志解析诊断工具，不会因为这一条测试记录就自动封禁 IP。\n五、配置 Caddy 日志检测 除了 SSH，CrowdSec 还可以根据反向代理的访问日志识别恶意 HTTP 请求。\n这里以 Caddy 为例。\n5.1 安装 Caddy Collection sudo cscli collections install \\ crowdsecurity/caddy 如果还使用 Nginx，可以额外安装：\nsudo cscli collections install \\ crowdsecurity/nginx 5.2 配置日志采集 假设 Caddy 的访问日志存放在：\n/var/log/caddy/ 并使用 JSON 格式。\n创建：\n/etc/crowdsec/acquis.d/caddy.yaml 内容：\nfilenames: - /var/log/caddy/*.log labels: type: caddy 重启 CrowdSec：\nsudo crowdsec -t sudo systemctl restart crowdsec 检查：\nsudo cscli metrics show acquisition 如果显示日志被读取和解析，说明采集器与解析器已经正常工作。\n不过，这还不代表已经检测到了恶意请求。\n5.3 CrowdSec 如何判断 HTTP 攻击？ CrowdSec 可以根据不同 Scenario 判断：\n是否连续访问敏感文件。 是否尝试探测大量不存在的路径。 是否存在已知漏洞探测行为。 是否出现异常 HTTP 请求频率。 是否匹配恶意 HTTP 客户端行为特征。 例如，访问以下路径：\n/.env /wp-admin/ /phpinfo.php /.git/config 这些路径经常出现在自动化扫描中。\n但并非访问一次就一定触发封禁。\nCrowdSec 会结合具体 Scenario 的规则判断，避免将正常访问误判为攻击。\n六、CrowdSec 什么时候自动封禁 IP？ 这是使用 CrowdSec 时最值得理解的问题。\nCrowdSec 并不是检测到一次 SSH 登录失败就立即封禁，而是在行为达到 Scenario 的检测条件后生成告警与封禁决策。\n6.1 Leaky Bucket 算法 CrowdSec 的许多 Scenario 使用 Leaky Bucket（漏桶）算法。\n可以把每个 IP 想象成一个独立的水桶：\n每次符合条件的攻击事件向桶中加入一个单位。 桶会按照设定速度持续泄漏。 如果事件积累速度超过泄漏速度，导致桶溢出，就会触发攻击告警。 例如，一个假设的规则：\ntype: leaky capacity: 5 leakspeed: \u0026#34;10s\u0026#34; 表示：\n桶容量为 5。 每 10 秒泄漏一个事件。 当积累事件超出容量时触发溢出。 如果攻击者在短时间内不断尝试登录，就可能触发封禁。\n如果每隔几分钟才尝试一次，事件可能在积累到阈值之前就已经泄漏。\n这也是为什么某些 IP 明明连续扫描了多个用户名，却没有立即被封禁。\n6.2 查看实际检测阈值 不要凭印象判断 CrowdSec 的默认阈值。\n不同 Scenario、Hub 版本以及本地自定义规则，可能使用不同参数。\n查看 SSH 暴力破解规则：\nsudo cscli scenarios inspect \\ crowdsecurity/ssh-bf 也可以直接查看已安装的规则文件：\ncat /etc/crowdsec/scenarios/ssh-bf.yaml 重点关注：\ncapacity: leakspeed: groupby: distinct: 其中：\ncapacity 决定桶的容量。 leakspeed 决定事件消退速度。 groupby 通常用来源 IP 分组。 distinct 用来避免重复事件被反复计数。 因此，CrowdSec 不能简单理解为“10 分钟内失败 5 次就封禁”。\n真正触发条件应以 Scenario 的完整规则为准。\n6.3 封禁持续多久？ CrowdSec 在产生 Alert 后，通过 Profile 决定是否生成封禁 Decision。\n查看：\ncat /etc/crowdsec/profiles.yaml 常见的 IP 封禁策略如下：\nname: default_ip_remediation filters: - Alert.Remediation == true \u0026amp;\u0026amp; Alert.GetScope() == \u0026#34;Ip\u0026#34; decisions: - type: ban duration: 4h on_success: break 其中：\nduration: 4h 表示封禁持续 4 小时。\n实际安装的 Profile 可能还有其他条件或策略，因此修改前应该检查完整配置，避免重复定义同名规则。\n6.4 从告警到真正封禁 即使 Scenario 已经触发，还需要满足后续条件：\n检测场景产生 Alert。 Profile 将 Alert 转换为 Decision。 Firewall Bouncer 拉取 Decision。 nftables 将来源 IP 加入封禁集合。 实际防火墙规则命中该来源 IP。 如果其中某一步失败，就可能出现 CrowdSec 显示了攻击告警，但网络连接并没有被阻止的情况。\n七、验证自动封禁是否生效 安装成功并不意味着整个封禁链路已经验证成功。\n建议分成两个部分：先验证防火墙执行，再验证攻击检测。\n7.1 检查 Bouncer sudo cscli bouncers list 确认：\nBouncer 已注册。 API 认证有效。 最近仍在拉取 Decision。 7.2 创建测试封禁 使用 RFC 5737 保留的文档示例 IP：\nsudo cscli decisions add \\ --ip 203.0.113.10 \\ --type ban \\ --duration 5m \\ --reason manual-test 查看决策：\nsudo cscli decisions list 接下来检查 nftables：\nsudo nft list ruleset | grep -i crowdsec 确认封禁 IP 是否进入对应集合：\nsudo nft list ruleset | grep \u0026#39;203.0.113.10\u0026#39; 如果可以看到测试 IP，并且该集合被有效的防火墙规则引用，就说明 Bouncer 已经将封禁决策同步到防火墙。\n测试完毕后解除：\nsudo cscli decisions delete \\ --ip 203.0.113.10 注意，203.0.113.10 是文档测试地址，适合验证决策同步，不适合测试真实网络连接是否被阻断。\n7.3 查看真实攻击告警 sudo cscli alerts list 查看封禁决策：\nsudo cscli decisions list 查看 Scenario 指标：\nsudo cscli metrics show scenarios 若某个 Scenario 的 Overflow 计数增加，说明攻击检测规则曾触发。\n但是否产生封禁，还要结合 Profile、Simulation 和 Decision 一起判断。\n检查 Simulation 状态：\nsudo cscli simulation status 如果 Scenario 处于模拟模式，可能只产生检测结果，不执行封禁。\n7.4 避免误封自己的管理 IP 公网服务器测试封禁时，最重要的是不要把唯一的管理入口封掉。\n建议：\n提前准备云平台提供的控制台。 不要直接封禁当前 SSH 客户端的出口 IP。 对可信的固定管理地址设置必要的 AllowList。 调整策略前先确认 nftables 规则优先级。 使用另一台受控设备进行真实连接测试。 八、CrowdSec 会检查旧日志吗？ 默认情况下，CrowdSec 主要以实时日志分析为主，并不保证启动时自动扫描安装之前的所有历史日志。\n例如，在部署 CrowdSec 前，SSH 日志中可能已经记录了几百次失败登录。\n这些事件不会仅仅因为安装了 CrowdSec 就全部变成当前的封禁决策。\n8.1 常规运行方式 情况 处理方式 新产生的 SSH 日志 实时检测 新产生的 Caddy 日志 实时检测 安装前的历史日志 通常不自动完整回溯 需要重新分析旧日志 使用 Replay Mode 实际读取起点仍可能受到数据源及其配置影响。\n8.2 导出历史 SSH 日志 例如导出过去 24 小时：\nsudo journalctl -u ssh.service \\ --since \u0026#34;24 hours ago\u0026#34; \\ --output=short \\ --no-pager \\ \u0026gt; /tmp/ssh-history.log CrowdSec 支持通过 Replay Mode 分析已有的日志文件。\n它能够根据日志中的原始时间戳重放事件，判断当时是否达到检测阈值。\n但需要注意，Replay 可能向 API 提交告警，因此不应随意在生产环境直接回放大量历史攻击日志。\n更稳妥的方式是使用独立配置和测试环境，避免影响实际封禁决策。\n官方文档：\nhttps://docs.crowdsec.net/u/user_guides/replay_mode/\n九、日常管理 CrowdSec 提供了命令行工具 cscli，大部分日常维护都可以在终端完成。\n9.1 查看服务状态 systemctl status crowdsec systemctl status crowdsec-firewall-bouncer 9.2 查看日志采集情况 sudo cscli metrics show acquisition 9.3 查看 Parser 指标 sudo cscli metrics show parsers 9.4 查看 Scenario 指标 sudo cscli metrics show scenarios 9.5 查看封禁 IP sudo cscli decisions list 9.6 手动封禁 sudo cscli decisions add \\ --ip 203.0.113.10 \\ --duration 4h \\ --reason manual-ban 9.7 手动解除 sudo cscli decisions delete \\ --ip 203.0.113.10 9.8 查看 CrowdSec 日志 sudo journalctl -u crowdsec -f 查看 Bouncer 日志：\nsudo journalctl \\ -u crowdsec-firewall-bouncer -f 9.9 更新规则 CrowdSec Hub 的规则可以独立更新：\nsudo cscli hub update sudo cscli hub upgrade 更新检测规则不等同于升级 CrowdSec 软件本身。软件更新仍通过 APT 管理。\n十、常见问题 CrowdSec 已经运行，但没有封禁任何 IP 先检查日志采集：\nsudo cscli metrics show acquisition 然后检查解析器：\nsudo cscli metrics show parsers 再检查：\nsudo cscli metrics show scenarios sudo cscli alerts list sudo cscli decisions list 最后检查 Bouncer 与 nftables：\nsudo cscli bouncers list sudo nft list ruleset 正常的排查顺序应该是：\nLog Acquisition ↓ Parser ↓ Scenario ↓ Alert ↓ Decision ↓ Bouncer ↓ Firewall 不要在尚未确认日志被正确读取时就急于修改封禁阈值。\n为什么攻击日志很多，却没有生成封禁？ 因为日志数量不等于符合检测条件的事件数量。\n部分日志可能没有被正确解析，也可能不符合 Scenario 的 filter。\n另外，即使同一个 IP 多次失败登录，如果两次事件的间隔足够长，Leaky Bucket 也可能不会溢出。\n为什么显示已经封禁，但仍然能访问？ 可能原因包括：\nBouncer 尚未同步 Decision。 nftables 规则没有正确挂载到流量经过的 Hook。 防火墙规则顺序不正确。 IPv4 和 IPv6 没有同时覆盖。 实际流量经过反向代理，日志中的 IP 并非真实客户端地址。 被拦截的连接与当前测试连接不是同一来源。 因此，cscli decisions list 只能证明 CrowdSec 生成了决策，不能单独证明网络层拦截成功。\nCrowdSec 会自动解封吗？ 会。\n当封禁 Decision 到期后，Bouncer 应同步更新防火墙集合，移除对应 IP。\n不过，如果相同 IP 同时被其他防火墙规则封禁，CrowdSec 解封并不会自动移除那些独立规则。\n十一、总结 CrowdSec 的核心价值不仅是自动封禁 IP，而是将日志解析、行为检测和封禁执行拆分为独立组件。\n这使得它能够从最基础的 SSH 防暴力破解，逐步扩展到 Web 服务、反向代理和多服务器集中防护。\n实际部署时，需要重点理解三个问题：\n第一，CrowdSec 不是根据固定的失败次数直接封禁。 它通过 Scenario 判断行为是否异常，许多规则采用 Leaky Bucket 算法，因此攻击的频率和持续时间都会影响检测结果。\n第二，检测成功不等于封禁成功。 Alert、Decision、Bouncer 和防火墙规则是不同阶段，排查问题时应逐层确认。\n第三，CrowdSec 更适合持续监控新产生的安全事件。 如果需要分析历史攻击，可以使用 Replay Mode，但应避免让历史告警意外影响生产封禁。\n对于已经使用 Debian、systemd、Caddy 或 Nginx 的服务器而言，CrowdSec 配合 nftables 是一种值得考虑的自动化安全防护方案。\n它不能替代及时更新软件、安全配置、SSH 公钥认证和最小权限原则，但能够减少大量重复的自动化扫描和暴力破解请求。\n参考资料 CrowdSec 官方网站 CrowdSec 官方文档 Linux 安装指南 Firewall Bouncer Scenario 检测机制 Replay Mode CrowdSec GitHub ","permalink":"https://blog.imcaoxuan.cn/posts/2026-10-19-automatically-banning-malicious-ips-on-a-debian-server-with-crowdsec/","summary":"\u003ch1 id=\"使用-crowdsec-为-debian-服务器实现恶意-ip-自动封禁\"\u003e使用 CrowdSec 为 Debian 服务器实现恶意 IP 自动封禁\u003c/h1\u003e\n\u003cp\u003e公网服务器每天都会遇到各种自动化扫描。\u003c/p\u003e\n\u003cp\u003e即使没有主动公开服务地址，SSH 端口也经常会收到针对 \u003ccode\u003eroot\u003c/code\u003e、\u003ccode\u003eadmin\u003c/code\u003e、\u003ccode\u003etest\u003c/code\u003e 等用户名的登录尝试。Web 服务则可能遭遇针对 \u003ccode\u003e.env\u003c/code\u003e、\u003ccode\u003ewp-admin\u003c/code\u003e、\u003ccode\u003ephpinfo.php\u003c/code\u003e 等路径的探测。\u003c/p\u003e\n\u003cp\u003e这些请求大多来自自动化扫描程序。虽然不一定构成实际入侵，但会产生大量无意义的日志，同时增加服务暴露面。\u003c/p\u003e\n\u003cp\u003e单纯依靠防火墙静态规则，难以根据攻击行为动态调整封禁名单。\u003c/p\u003e\n\u003cp\u003e因此，我选择尝试 \u003ca href=\"https://www.crowdsec.net/\"\u003eCrowdSec\u003c/a\u003e，通过服务器日志识别恶意行为，再联动 nftables 自动封禁攻击来源。\u003c/p\u003e\n\u003cp\u003e本文记录在 Debian 12 上部署 CrowdSec 的过程，以及它如何判断一个 IP 是否应该被封禁。\u003c/p\u003e\n\u003ch2 id=\"一crowdsec-是什么\"\u003e一、CrowdSec 是什么？\u003c/h2\u003e\n\u003cp\u003eCrowdSec 是一个开源的入侵检测与安全响应系统。\u003c/p\u003e\n\u003cp\u003e它通过分析 SSH、Web Server 等服务产生的日志，检测暴力破解、漏洞扫描、恶意爬虫等行为。\u003c/p\u003e\n\u003cp\u003e与传统的静态 IP 黑名单不同，CrowdSec 主要根据行为特征决定是否封禁，并且可以利用社区威胁情报。\u003c/p\u003e\n\u003cp\u003eCrowdSec 的工作可以分为两部分：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSecurity Engine\u003c/strong\u003e：读取日志，识别攻击，生成封禁决策。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRemediation Component（Bouncer）\u003c/strong\u003e：执行封禁决策，例如修改防火墙规则。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e两者相互独立。\u003c/p\u003e\n\u003cp\u003e也就是说，仅安装 CrowdSec Security Engine，并不会自动阻止网络连接。\u003c/p\u003e\n\u003ch3 id=\"11-工作流程\"\u003e1.1 工作流程\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSSH / Caddy / Nginx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Application Logs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   CrowdSec Parser\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Detection Scenarios\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Security Alerts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Decision Profiles\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      Local API\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Firewall Bouncer\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       nftables\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      Block IP\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCrowdSec 将日志分析与防火墙执行解耦，意味着它既可以在单台服务器上使用，也能通过中心 API 向多台服务器下发封禁决策。\u003c/p\u003e","title":"使用 CrowdSec 为 Debian 服务器实现恶意 IP 自动封禁"},{"content":"中国秸秆禁烧政策的历史，实际上是中国农业现代化、农村能源转型、环境治理和基层行政管理方式演变的一个缩影。\n最关键的历史结论是：中国并非自古存在大规模秸秆焚烧问题，也不是近年来才开始禁止烧秸秆。现代秸秆禁烧制度在20世纪90年代逐步建立，1999年形成全国性的管理规定，2008年前后明显强化，2013年以后进一步纳入大气污染防治体系。\n更值得研究的，是政策治理目标与执行方式之间的变化：\n最初的重点是公共安全。 尤其是机场、铁路、公路附近的焚烧风险，同时兼顾大气污染。 后来逐渐转向区域空气质量管理。 秸秆焚烧与城市雾霾、PM2.5治理建立了更紧密的政策联系。 再后来出现基层执行范围扩大和管理方式强化的问题。 一些地方采取全面禁烧、网格巡查和责任追究，导致政策成本与农民生产需求之间的矛盾。 政策争论的核心不是焚烧是否产生污染，而是应当禁止到什么程度，以及由谁承担处理秸秆的经济成本。 一、历史时间线：秸秆禁烧如何一步步形成 20世纪80年代以前\n秸秆是有使用价值的农业资源\n主要用于烧饭取暖、牲畜饲料、垫圈积肥、堆肥和建材。露天焚烧存在，但大量秸秆并非没有用途。\n1980年代末—1990年代\n大规模集中焚烧成为社会问题\n农业机械化、农村生活燃料转型、粮食增产及农业劳动力转移，使部分地区秸秆集中剩余，焚烧逐渐成为快速清田的方式。\n1999—2000年\n全国性禁烧管理制度确立\n1999年六部门发布《秸秆禁烧和综合利用管理办法》；2000年修订《大气污染防治法》，明确特定区域的秸秆露天焚烧禁令。\n2008年\n奥运空气质量保障推动强化禁烧\n京津冀及周边多个省份实施重点时段严格禁烧，城市及重点区域管控范围扩大。\n2013—2017年\n与PM2.5及大气污染防治绑定\n大气污染防治行动全面推进。2015年修订《大气污染防治法》，规定由省级人民政府划定禁烧区域，并明确相关法律责任。\n2018年至今\n基层精细化监管与政策争议并存\n网格监管、卫星火点监测及秸秆综合利用持续推进，部分地区也探索分区、分时段的焚烧管理。\n上面的阶段划分依据国家层面的重要政策节点，而非认为每一年全国都同步改变。\n二、1949—1980年代：为什么过去农民很少需要大规模集中烧秸秆？ 要解释今天的禁烧政策，必须先理解一个历史变化：\n秸秆从过去的生产生活资源，逐渐变成了部分地区需要付费处理的农业副产物。\n1. 传统农村社会有较完整的秸秆利用体系 过去的小农经济中，秸秆具有多种实际用途。\n用途 农村的典型做法 生活燃料 使用麦秸、稻草、玉米秆烧饭取暖 牲畜饲料 秸秆切碎后喂牛、羊等反刍动物 农业肥料 堆肥、沤肥、垫圈积肥、直接还田 生活材料 编织草席、制作草绳、屋顶覆盖 农业辅助 覆盖地面、保墒、防止部分土壤侵蚀 这并不意味着过去不存在焚烧。农民同样会焚烧残茬、杂草，或通过草木灰补充部分矿质养分。\n但在物资匮乏的年代，秸秆具有燃料和生产价值，通常不会被整体视作废弃物。\n2. 1980年代后的变化是决定性的 随着农村经济发展，几种变化叠加：\n第一，农村能源结构改变。 煤炭、液化气、电力及后来的天然气逐渐替代直接燃烧秸秆，减少了家庭燃料需求。\n第二，农业生产机械化。 联合收割机提高了收割效率，同时使大量秸秆在短时间内集中留在田间。\n第三，农民收入与就业结构变化。 农村劳动力向非农产业转移，收集、晾晒、运输、存放秸秆的机会成本提高。\n第四，农业种植制度具有严格的时间要求。 特别是稻麦轮作、麦玉轮作地区，收获与下茬播种间隔可能很短。\n因此，农民面对的是一个经济选择：\n农田需要迅速清理，但秸秆卖不出去，运走需要花钱，留在田间又可能妨碍播种。\n露天焚烧于是成为部分地区成本最低、速度最快的处理方法。\n3. 历史文件能够证实这种转变 2000年6月，全国秸秆禁烧和综合利用工作会议上，国家环保总局局长解振华给出了一组当时的估计：\n全国每年产生农作物秸秆约6.5亿吨。 约50%用于肥料和饲料。 约30%用于燃料和工业原料。 约20%没有得到有效利用。 部分经济发达地区和大城市郊区，秸秆剩余比例甚至高达70%—80%。 这些数字是当时政府对秸秆资源利用状况的估计，不应直接当作今天的数据。\n由此可以得出一个重要结论：\n现代中国大规模秸秆焚烧问题，很大程度上是农业生产效率提高、农村传统资源利用体系衰退，而新的机械化收储和资源化利用体系没有同步建立的结果。\n三、1990年代：秸秆禁烧真正开始制度化 1. 早期治理并不只是出于环保考虑 1990年代，秸秆焚烧问题已经引起政府关注，其中很重要的原因是交通安全。\n集中焚烧会导致局部短时烟雾浓度快速升高，直接威胁：\n民航飞机起飞、降落时的能见度； 高速公路车辆行驶安全； 铁路交通安全； 高压输电、森林防火及相关设施安全。 因而秸秆禁烧具有明显的公共安全治理背景。\n2. 1999年：第一份标志性全国管理文件 1999年4月12日，国家环保总局联合农业部、财政部、铁道部、交通部、中国民用航空总局发布：\n《秸秆禁烧和综合利用管理办法》（环发〔1999〕98号）。\n这份文件是研究中国现代秸秆禁烧史最重要的原始资料之一。\n尤其值得注意的是：1999年的管理办法，并没有简单规定全国所有农田一律不能焚烧。\n其第四条明确规定了重点禁烧区域：\n1999年规定的重点禁烧范围 15 km 机场中心半径\n2 km 高速公路、铁路两侧各\n1 km 国道、省道两侧各\n同时涵盖高压输电线路附近、地方政府依法划定的其他区域，并允许根据自然和气候特点调整相应范围。\n依据环发〔1999〕98号第四条。\n这说明最早的制度设计主要采用重点区域禁止 + 地方划区管理 + 综合利用推广的方式，而不是全国所有农田一律全域禁烧。\n还有一个特别值得注意的历史细节：1999年的管理办法第八条规定，对于禁烧区内违法焚烧行为，可以对直接责任人处以20元以下罚款。这反映出当时的管理制度与后来的处罚标准存在明显差异。\n原始文件可直接查阅：生态环境部：1999年《秸秆禁烧和综合利用管理办法》。\n四、2000—2007年：从部门管理到法律明确禁止 2000年修订的《中华人民共和国大气污染防治法》第四十一条，将秸秆禁烧明确纳入大气污染防治法律制度。\n其重点仍然是：\n人口集中地区； 机场周围； 交通干线附近； 当地人民政府划定的其他禁烧区域。 这一时期，秸秆禁烧逐渐从环境保护部门的专项管理，转为地方政府需要承担的常态化工作。\n但禁烧效果并不稳定。\n2008年环境保护部文件回顾了2007年5—6月卫星监测的火点情况：\n省份 2007年5—6月监测火点 河南 1,013 江苏 592 安徽 577 山东 357 河北 280 数据来源：环境保护部环发〔2008〕22号。这些是特定监测期的卫星火点数，不等同于全年焚烧事件总数。\n这说明到2007年，虽然禁烧制度已实施多年，但在黄淮海等农业主产区，焚烧仍然普遍。\n尤其是河南、安徽、江苏等地，夏收以后需要迅速组织下茬农业生产，集中焚烧问题具有鲜明的季节性。\n五、2008年：北京奥运会为什么是关键转折点？ 2008年是秸秆禁烧政策史上一个非常清晰的转折点。\n2008年4月21日，环境保护部发布《关于进一步加强秸秆禁烧工作的通知》（环发〔2008〕22号）。\n文件明确提出，为保障奥运城市空气质量：\n2008年5月初至9月底，北京、天津、河北、河南、山东、山西、安徽、江苏、辽宁九个省市列为重点禁烧区域，实行全面禁烧。\n这与1999年的重点区域禁烧明显不同。\n1. 治理范围显著扩大 1999年的思路主要是保护机场、公路、铁路等重点场所。\n而2008年，空气污染的跨区域传输开始更明显地影响政策设计。\n一块河南或河北农田产生的烟雾，并不一定只影响田地附近。如果气象条件允许，污染物可以跨越行政边界，影响区域空气质量。\n因此，2008年的禁烧管理已经体现出区域联防联控的理念。\n2. 行政责任机制进一步强化 2008年的政策强调地方政府对本辖区秸秆禁烧工作负总责，并将禁烧情况纳入环保目标考核。\n同时加强：\n专项巡查和督查； 卫星遥感火点监测； 违法行为查处； 对禁烧工作落实情况的考核和责任追究。 这意味着秸秆焚烧不再只是单纯的农民生产行为问题，也成为地方政府环境治理绩效的问题。\n3. 2008年还出台了综合利用政策 同年，国务院办公厅印发《关于加快推进农作物秸秆综合利用的意见》（国办发〔2008〕105号）。\n它强调将秸秆转化为资源，提高利用水平，推动机械化还田、饲料化及能源化等技术发展。\n从制度设计看，2008年其实同时存在两条政策路线：加强禁烧约束，以及发展替代利用方式。\n真正的问题在于，行政禁止能够快速执行，而秸秆利用产业、机械设备和收储运输网络往往需要更长时间建设。\n这一时间差成为此后矛盾反复出现的重要原因。\n六、2013—2017年：雾霾治理改变了秸秆禁烧的政策定位 1. 2013年的大气污染防治行动 2013年，中国进入更高强度的大气污染治理阶段。\n国务院于2013年9月发布《大气污染防治行动计划》（国发〔2013〕37号），即通常所说的“大气十条”。\n它将PM2.5等细颗粒物污染及区域性空气质量问题提升到国家环境治理的重要位置。\n同年，国家有关部门推进秸秆综合利用与禁烧工作。环境保护部在2013年冬季大气污染防治通知中，甚至提出了“不着一把火、不冒一股烟”的严格执行要求。\n不过，必须区分：这样的工作要求不等于全国每一块农田在法律上都被统一划入禁烧区。\n2. 卫星监控使秸秆禁烧变得可以考核 2008年之前已经使用卫星遥感监测。根据环境保护部后来的答复，自2009年起，全国夏秋收期间建立了常态化火点卫星监测与日报公开机制；2014年进一步强化月报、火点强度排名及信息公开。\n这对地方政府管理方式有很大影响。\n过去，田间焚烧属于分散的农业行为，上级部门很难持续掌握每个地方的情况。\n卫星遥感使火点具有可定位、可汇总、可比较的特点。\n行政管理逻辑的变化\n农民在田间焚烧\n卫星监测火点、地方核查\n按行政区域统计、通报、排名\n地方政府加强责任分解、巡查和考核\n这种制度有一个明显优点：提高了环境违法行为的发现效率。\n但也带来潜在问题：如果考核过度依赖火点数量，地方可能更加关注“不出现火点”，而不是秸秆是否得到真正有效的处理。\n后者是一种基于行政激励机制的分析，不能据此认为所有地方都存在这种偏差。\n3. 实际监测数据出现明显变化 环境保护部2015年披露：\n2013年数字根据官方公布的2014年5034个、同比减少2844个计算。\n2013—2014年同比下降\n36.3% 统计采用当时卫星遥感与核查口径。它说明监测到的火点减少，不足以单独证明减少全部由禁烧政策造成，也不能直接推算PM2.5改善比例。\n4. 2015年修订《大气污染防治法》 2015年修订、2016年起实施的《大气污染防治法》进一步明确：\n第七十六条：鼓励和支持秸秆资源化利用，并建设收储运与利用服务体系。 第七十七条：由省级人民政府划定禁止露天焚烧的区域。 第一百一十九条：规定有关违法焚烧行为的行政处罚。 其中，第一百一十九条对规定情形下的秸秆露天焚烧，明确了500—2000元的罚款区间。其具体适用还需结合违法地点和当时法律条文判断。\n对比1999年管理办法中的20元以下罚款，可以看出法律约束明显加强。\n七、2018—2024年：全面禁烧、网格化管理与基层治理矛盾 2018年，国务院发布《打赢蓝天保卫战三年行动计划》。\n文件特别要求：\n强化地方政府禁烧主体责任； 重点区域建立网格化监管制度； 夏秋收期间开展专项巡查； 东北地区制定针对集中焚烧的专项方案； 坚持堵疏结合，到2020年全国秸秆综合利用率达到85%。 注意，文件也明确要求东北地区加强科学有序疏导，说明中央层面的政策并非始终主张不加区分地禁止一切焚烧。\n1. 为什么一些地方采取了更严格的全面禁烧？ 可以从三个方面解释。\n行政执行成本： 分区、分时段管理需要分析地理位置、气象条件、焚烧规模与污染扩散方向，管理复杂度较高。\n责任考核压力： 对基层管理者来说，严格禁止所有田间火点，往往比证明某一次焚烧风险可控更容易操作。\n农业替代方案不足： 秸秆收储和综合利用尚未充分覆盖时，禁止焚烧成为能够立即执行的政策工具。\n这些因素共同促进了部分地方采取全域禁烧、网格巡查、定点值守等措施。\n但应当区分：地方禁烧区划定、巡查管理和行政处罚，需要分别符合相应法律依据与法定权限。不能把基层宣传口号直接视为全国统一法律。\n2. 矛盾在东北地区尤其明显 东北是全国最典型的地区之一。\n与黄淮海夏收地区相比，东北还面临冬季寒冷、春季土壤化冻较晚、部分秸秆分解较慢、农田面积大等条件。\n秸秆还田本身具有保护土壤、增加有机质等价值，但如果机械作业、秸秆量、土壤水分和耕作制度不匹配，也可能影响下茬播种和出苗。\n2024年《半月谈》报道东北一些地区面临的现实困境，包括秸秆离田成本较高、还田腐解不充分以及基层巡查投入较大等问题。\n这类报道反映了地方治理面临的实际困难，但个别农户观察到病虫害变化，并不能单独证明秸秆还田普遍造成病虫害加重。\n3. 这种矛盾可以归纳为四类成本 成本类型 主要承担者 典型问题 空气污染与健康损害 农村和城市居民 露天焚烧释放烟尘，形成区域污染 秸秆处理成本 农民、合作社 粉碎、打捆、运输、还田需要投入 基层监管成本 地方政府 巡查、值守、核查和执法占用资源 资源化产业成本 企业与财政 收储运网络、生产设备和稳定市场 政策冲突的实质在于：禁止焚烧能够降低一部分社会环境成本，但不会自动消除秸秆处理成本，而是要求通过其他方式承担这些成本。\n如果后续处理方式不经济，禁烧就可能长期依靠高强度行政监督维持。\n八、2025年：政策开始明确纠正“一刀切”问题 2025年，是中国秸秆禁烧政策史上的又一个重要转折点。\n2025年中央一号文件《中共中央 国务院关于进一步深化农村改革 扎实推进乡村全面振兴的意见》明确提出：\n支持秸秆综合利用，精准划定禁烧范围，依法依规落实禁烧管控要求。\n这里最值得关注的不是“支持秸秆利用”，因为过去多年一直如此，而是精准划定禁烧范围。\n这意味着在国家政策层面，开始更明确地要求兼顾空气环境、农业生产和治理成本，避免以全域全面禁烧替代科学管理。\n两个有代表性的地方政策变化 吉林：从全域禁烧转向计划烧除\n吉林省生态环境厅2025年公开答复证实：当地自2018年以来实行过“两区”管控、全域禁烧等不同方式，2023年秋季重新调整为秸秆残茬计划烧除。\n2024年进一步明确，在优先综合利用的基础上，针对部分剩余秸秆和难以机械化作业的地块，在适当条件下组织计划烧除。\n湖南：实行禁烧区和限烧区分类管理\n2025年6月，湖南省发布《秸秆禁烧区和限烧区划定方案》，强调根据地理环境、污染扩散特征及农田情况，分区域、分类别、分级别、分时段管理。\n方案明确提出防止简单“一刀切”，但并不意味着限烧区能够随时任意焚烧。\n这类地方政策变化说明，全国并不存在完全同步、完全一致的秸秆焚烧管理模式。\n事实上，1999年的重点区域管理思路、后来一些地方的全域禁烧实践，以及2025年的精准划区要求，构成了一条清晰的政策演进轨迹。\n九、2026年：生态环境法典正式改变法律框架 这是截至2026年10月，研究秸秆禁烧历史时不能忽略的最新节点。\n2026年3月12日，全国人大通过《中华人民共和国生态环境法典》，于2026年8月15日起施行。原《大气污染防治法》等法律同时废止，由法典承接和调整相关制度。\n法典第二百四十六条明确规定，地方政府应当科学精准加强秸秆等焚烧的组织、指导和管理，同时明确人口集中地区、机场周围、交通干线附近，以及省级以上人民政府划定的其他区域和规定的时段的禁烧要求。\n第一千一百三十一条则规定，对符合违法构成要件的焚烧行为，可以处500—2000元罚款。\n全国人大常委会法工委负责人对这一修改的说明尤其重要：针对以往简单化、一刀切的问题，在明确重点区域禁止焚烧的同时，要求其他区域的禁烧划定更加规范。\n三个时期的法律理念对比 时期 主要法律和政策思路 1999—2007 重点区域禁烧，地方划区管理，鼓励综合利用 2008—2024 区域空气质量考核强化，部分地方实行全域禁烧 2025—2026 精准划区、依法管控，因地制宜探索限烧和计划烧除 2026年8月，吉林出台新的综合利用政策，明确将部分道路、机场周边、林地附近等划为禁烧区，其他区域实行限烧管理，并配套秸秆还田、离田利用等措施。这是新法律框架在地方落实的具体案例。\n需要强调的是，2026年的政策调整不是全国恢复自由烧秸秆。 不在某个禁烧区内，不等于可以无条件点火；还需要遵守当地依法制定的时段、组织管理和消防安全要求。\n十、秸秆禁烧到底有没有科学依据？ 这个问题需要把环境污染、农业生产与治理成本分开判断。\n1. 秸秆露天焚烧确实产生显著空气污染 在燃烧过程中，秸秆会排放PM2.5、一氧化碳、氮氧化物、挥发性有机物和黑碳等污染物。\n2015年发表于 Atmospheric Environment 的研究对中国东部田间秸秆焚烧进行实地测量，证实不同作物残余物的露天焚烧会释放颗粒物和多种气态污染物。\n不过，不能据此说中国全部雾霾主要由秸秆造成。\n举一个定量研究的例子：\n河北秸秆焚烧对京津冀PM2.5的模拟贡献 基于2014年排放清单和大气模型的研究结果\n6月月均贡献比例\n4.2% 10月月均贡献比例\n5.5% 研究还发现，在特定污染日，河北秸秆焚烧对北京PM2.5日均浓度的模拟贡献比例最高可达25.7%。\n这是河北焚烧源对京津冀特定年份、月份和污染日的模拟结果，不是全国平均贡献，也不代表所有重污染天气。\n这说明秸秆焚烧通常不是所有季节最主要的污染源，但在收获期、大规模集中焚烧和不利气象条件叠加时，确实可能成为区域空气污染的重要推手。\n2. 焚烧也不是完全没有农业作用 传统上农民使用焚烧清田，有明确的实际原因。\n焚烧能够迅速去除地表残留物，并在一定条件下减少部分杂草种子和病虫害载体。灰分还能够保留部分钾、钙等矿质成分。\n但燃烧同时损失大量有机碳和部分养分，释放污染物，并可能损害土壤表层环境。\n相比之下，科学还田能增加土壤有机物输入，但分解过程、病虫害风险与播种效果都依赖具体的土壤、气候和作业条件。\n因此，两种极端说法都不准确：\n“烧秸秆对环境和土地完全没有危害。” “秸秆全部还田，在任何地方都一定比其他处理方式更好。” 农业科学院相关研究综述已经明确讨论了秸秆还田的长期土壤收益，以及腐解缓慢、病虫害和作物生长影响等适用性问题。\n十一、禁烧政策在经济上究竟改变了什么？ 一个容易被忽略的问题是：秸秆禁烧并不只影响空气，还改变农业经营成本，进而影响土地流转和机械化投入。\n2026年发表于 Journal of Agricultural Economics 的研究，利用2009—2015年的农村住户面板数据，分析了不同省份严格禁烧政策实施时间的差异。\n研究发现，在其识别条件和样本范围内，禁烧政策促进了村内土地流转，生产效率较高的农户扩大了经营面积，效率较低的农户则倾向于退出部分土地经营。研究估计，样本村级农业总产出和生产率分别提高约5%和3%。\n研究还发现，附近有生物质发电厂的村庄，禁烧之后的土地流转和生产调整更加明显。\n这提供了一个较复杂的结论：\n禁烧政策可能同时推动规模化农业发展，也可能对资金、机械和劳动能力不足的小农户造成更大的相对负担。\n上述5%和3%是特定样本与计量模型的估计结果，不能当作全国所有年份禁烧政策的确定效果，更不能直接等同于农民个人收入增长。\n全国秸秆综合利用已经达到什么水平？ 根据农业农村部公布的数据，2024年：\n秸秆总量\n8.7亿吨 可收集量\n7.3亿吨 可收集秸秆综合利用率\n88%以上 统计口径为可收集秸秆的综合利用率，而非秸秆总产量的直接利用比例。\n经过多年发展，中国形成了以肥料化、饲料化为主，辅以能源化、基料化、原料化的利用格局。\n但综合利用率并不是唯一应当考核的指标。还需要判断处理成本、实际利用质量、长期土壤效益，以及相关产业是否需要持续高额补贴才能维持。\n十二、综合评价：这段历史反映了什么？ 从公共政策史的角度，中国秸秆禁烧经历了三个值得关注的转变。\n1. 从资源利用问题转变为环境治理问题 早期政府更关注如何利用秸秆，20世纪90年代以后，集中露天焚烧的污染和公共安全风险越来越突出，禁烧逐渐成为独立的重要政策目标。\n1998年的一条历史新闻尤其有代表性。\n《人民日报》1998年5月19日报道，成都双流机场因附近农民焚烧秸秆造成浓烟，在24小时内被迫三次关闭，17个航班延误、返航或备降。报道还指出，自1996年起，该机场连续三年发生类似事件。\n这类事例能够具体解释，为什么1999年最早的全国性管理规定特别强调机场及交通干线附近的禁烧。\n2. 从解决具体污染，发展到考核整个行政区域 1999年主要是重点区域管控。\n2008年则体现出较大范围的联防联控要求。\n2013年以后，监测、排名、目标考核和基层责任机制不断加强。\n当公共治理问题被转化成可考核的指标时，确实可能提高执行效率，但也会产生指标简单化的风险。\n秸秆禁烧的历史因此具有典型的行政管理研究价值：政策目标合理，并不保证每一种执行方法都合理。\n3. 从单纯禁止，逐步重新重视农业经济规律 秸秆是农作物生产的必然副产物。\n农民并不会因为行政禁令而停止产生秸秆；只有当还田、收储或其他利用方式在实际生产中可行时，露天焚烧的经济动机才会持续下降。\n这也是2025—2026年政策更加重视精准划区、科学管理及综合利用的深层原因。\n从国际经验看，美国、英国、加拿大等国也曾使用许可证、烟雾管理计划、特定区域和时段限制等手段管理农业焚烧，并非简单地只在全面禁止与完全放开之间选择。\n最终结论 把近30年的中国秸秆禁烧史放在一起看，可以得到以下判断：\n第一，禁烧不是凭空出现的政策。 它有真实的污染防治和公共安全基础，尤其是1990年代机场受秸秆焚烧烟雾影响的案例。\n第二，禁烧范围的强化是分阶段发生的。 1999年建立全国性重点区域管理制度，2008年奥运期间强化全面禁烧，2013年以后在大气污染防治体系下进一步加强考核，地方执行存在明显差异。\n第三，全面禁止和合理禁止不是同一个概念。 严格管控高风险区域具有充分依据，但要求所有农田在任何条件下都不允许焚烧，必须同时考虑农业生产、治理成本、替代技术和法律授权。\n第四，2025—2026年的政策调整具有实质性历史意义。 它并非否定此前的禁烧目标，而是在保留环境保护和公共安全约束的基础上，开始更明确地解决长期存在的执行僵化问题。\n最终，这段历史的核心可以概括为：\n中国秸秆禁烧政策经历了从“重点区域禁止”，到“部分地区全面禁烧”，再到“依法精准划区、综合利用优先、科学有序管控”的演变。它反映的不只是环保政策变化，也是行政管理逐步适应农业生产规律的过程。\n如果继续深入研究，我认为最值得单独考察的是2008—2015年间，中央政策、地方立法、卫星火点考核和基层禁烧执行如何相互作用。这是理解为什么一些地方会从最初的区域管制走向全域禁烧，以及后来为什么重新调整政策的关键时期。\n","permalink":"https://blog.imcaoxuan.cn/posts/2026-10-17-the-history-of-china-s-straw-burning-ban-policy-from-traditional-farming-to-modern-environmental-governance/","summary":"\u003cp\u003e中国秸秆禁烧政策的历史，实际上是中国农业现代化、农村能源转型、环境治理和基层行政管理方式演变的一个缩影。\u003c/p\u003e\n\u003cp\u003e最关键的历史结论是：中国并非自古存在大规模秸秆焚烧问题，也不是近年来才开始禁止烧秸秆。现代秸秆禁烧制度在20世纪90年代逐步建立，1999年形成全国性的管理规定，2008年前后明显强化，2013年以后进一步纳入大气污染防治体系。\u003c/p\u003e\n\u003cp\u003e更值得研究的，是政策治理目标与执行方式之间的变化：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e最初的重点是公共安全。 尤其是机场、铁路、公路附近的焚烧风险，同时兼顾大气污染。\u003c/li\u003e\n\u003cli\u003e后来逐渐转向区域空气质量管理。 秸秆焚烧与城市雾霾、PM2.5治理建立了更紧密的政策联系。\u003c/li\u003e\n\u003cli\u003e再后来出现基层执行范围扩大和管理方式强化的问题。 一些地方采取全面禁烧、网格巡查和责任追究，导致政策成本与农民生产需求之间的矛盾。\u003c/li\u003e\n\u003cli\u003e政策争论的核心不是焚烧是否产生污染，而是应当禁止到什么程度，以及由谁承担处理秸秆的经济成本。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"一历史时间线秸秆禁烧如何一步步形成\"\u003e一、历史时间线：秸秆禁烧如何一步步形成\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"看五六十年前泉州市孩子们的课余任务 -泉州网|泉州晚报社 泉州新闻门户网站\" loading=\"lazy\" src=\"https://blog-images.imcaoxuan.cn/2026/10/17/1792229387.jpeg\"\u003e\u003c/p\u003e\n\u003cp\u003e20世纪80年代以前\u003c/p\u003e\n\u003cp\u003e秸秆是有使用价值的农业资源\u003c/p\u003e\n\u003cp\u003e主要用于烧饭取暖、牲畜饲料、垫圈积肥、堆肥和建材。露天焚烧存在，但大量秸秆并非没有用途。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"CHINA-AGRICULTURE-HARVEST3\" loading=\"lazy\" src=\"https://blog-images.imcaoxuan.cn/2026/10/17/1792229401.jpeg\"\u003e\u003c/p\u003e\n\u003cp\u003e1980年代末—1990年代\u003c/p\u003e\n\u003cp\u003e大规模集中焚烧成为社会问题\u003c/p\u003e\n\u003cp\u003e农业机械化、农村生活燃料转型、粮食增产及农业劳动力转移，使部分地区秸秆集中剩余，焚烧逐渐成为快速清田的方式。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"CHINA-HEALTH-ENVIRONMENT-POLLUTION\" loading=\"lazy\" src=\"https://blog-images.imcaoxuan.cn/2026/10/17/1792229413.jpeg\"\u003e\u003c/p\u003e\n\u003cp\u003e1999—2000年\u003c/p\u003e\n\u003cp\u003e全国性禁烧管理制度确立\u003c/p\u003e\n\u003cp\u003e1999年六部门发布《秸秆禁烧和综合利用管理办法》；2000年修订《大气污染防治法》，明确特定区域的秸秆露天焚烧禁令。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"This aerial picture shows the National S\" loading=\"lazy\" src=\"https://blog-images.imcaoxuan.cn/2026/10/17/1792229422.jpeg\"\u003e\u003c/p\u003e\n\u003cp\u003e2008年\u003c/p\u003e\n\u003cp\u003e奥运空气质量保障推动强化禁烧\u003c/p\u003e\n\u003cp\u003e京津冀及周边多个省份实施重点时段严格禁烧，城市及重点区域管控范围扩大。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Place Tiananmen sous la pollution, Pékin, janvier 2014  - Espace mondial : l\u0026rsquo;Atlas\" loading=\"lazy\" src=\"https://blog-images.imcaoxuan.cn/2026/10/17/1792229431.jpeg\"\u003e\u003c/p\u003e\n\u003cp\u003e2013—2017年\u003c/p\u003e\n\u003cp\u003e与PM2.5及大气污染防治绑定\u003c/p\u003e\n\u003cp\u003e大气污染防治行动全面推进。2015年修订《大气污染防治法》，规定由省级人民政府划定禁烧区域，并明确相关法律责任。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"一文读懂 秸秆为什么不让烧\" loading=\"lazy\" src=\"https://blog-images.imcaoxuan.cn/2026/10/17/1792229439.jpeg\"\u003e\u003c/p\u003e\n\u003cp\u003e2018年至今\u003c/p\u003e\n\u003cp\u003e基层精细化监管与政策争议并存\u003c/p\u003e\n\u003cp\u003e网格监管、卫星火点监测及秸秆综合利用持续推进，部分地区也探索分区、分时段的焚烧管理。\u003c/p\u003e\n\u003cp\u003e上面的阶段划分依据国家层面的重要政策节点，而非认为每一年全国都同步改变。\u003c/p\u003e\n\u003ch2 id=\"二19491980年代为什么过去农民很少需要大规模集中烧秸秆\"\u003e二、1949—1980年代：为什么过去农民很少需要大规模集中烧秸秆？\u003c/h2\u003e\n\u003cp\u003e要解释今天的禁烧政策，必须先理解一个历史变化：\u003c/p\u003e\n\u003cp\u003e秸秆从过去的生产生活资源，逐渐变成了部分地区需要付费处理的农业副产物。\u003c/p\u003e\n\u003ch3 id=\"1-传统农村社会有较完整的秸秆利用体系\"\u003e1. 传统农村社会有较完整的秸秆利用体系\u003c/h3\u003e\n\u003cp\u003e过去的小农经济中，秸秆具有多种实际用途。\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e用途\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e农村的典型做法\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e生活燃料\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e使用麦秸、稻草、玉米秆烧饭取暖\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e牲畜饲料\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e秸秆切碎后喂牛、羊等反刍动物\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e农业肥料\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e堆肥、沤肥、垫圈积肥、直接还田\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e生活材料\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e编织草席、制作草绳、屋顶覆盖\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e农业辅助\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e覆盖地面、保墒、防止部分土壤侵蚀\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e这并不意味着过去不存在焚烧。农民同样会焚烧残茬、杂草，或通过草木灰补充部分矿质养分。\u003c/p\u003e","title":"中国秸秆禁烧政策的历史：从传统农耕到现代环境治理"},{"content":"1999年，中国建立了以重点区域为核心的秸秆禁烧管理制度：机场周围、交通干线附近、人口集中地区成为重点管控对象。到了2010年代，一些省份却开始对整个行政区域实施严格禁烧。\n为什么一项最初以重点区域管理为主的政策，会逐步走向部分地方的全域禁烧？\n答案并不只是“雾霾越来越严重”。梳理2008—2015年的政策文件会发现，禁烧范围的扩大、地方责任的强化、卫星遥感的普及，以及财政奖补和行政考核的结合，共同改变了秸秆禁烧的治理方式。\n尤其值得注意：江苏早在2009年就提出，到2012年底实现全行政区域禁止露天焚烧秸秆的目标。 因而，将全面禁烧简单理解为2013年雾霾治理之后才出现的政策，并不符合历史事实。12\n本文重点讨论2008—2015年这一阶段的制度演变，并区分政策原文、地方实践与由此产生的治理激励。\n一、2008—2015年：禁烧政策如何层层落实？ 现代秸秆禁烧并非由某一个部门独立完成，而是通过一套逐级分解的治理结构展开：\n国家有关部门提出环境治理、综合利用和责任落实的政策目标。 省级政府与地方立法机关制定禁烧范围、地方制度、财政支持及考核方式。 市县政府划分责任区域、安排奖补资金、组织巡查并核查焚烧火点。 乡镇、村组和农业经营者直接面对清田、机械化还田、秸秆收储及现场管理等实际任务。 这套结构与其他公共政策的执行模式并无根本不同，但秸秆焚烧具有几个特殊之处：发生地点高度分散、主要集中在农忙时节，同时又能被卫星监测到一部分火点。\n这让它逐渐从一种分散的农业生产行为，变成了可统计、可通报、可排名的行政管理对象。\n二、2008年：奥运保障推动大范围严格禁烧 2008年4月21日，原环境保护部发布《关于进一步加强秸秆禁烧工作的通知》（环发〔2008〕22号）。1\n文件不仅要求直辖市、省会城市和副省级城市所辖区域全部列入禁烧范围，还特别提出：为确保奥运期间空气质量，2008年5月初至9月底，北京、天津、河北、河南、山东、山西、安徽、江苏和辽宁九省市作为重点禁烧区域，实行全面禁烧。\n文件同时要求利用卫星遥感监测秸秆焚烧，并组织专项督查、通报情况。\n这一变化意味着什么？ 1999年《秸秆禁烧和综合利用管理办法》强调机场、道路等重点范围，具有鲜明的公共安全和局地污染防治特点。2008年的奥运保障则更加突出区域空气质量：不同省份的污染排放，可能通过大气传输影响城市空气质量。\n由此，较大范围、较长时间的统一禁烧得到了实践上的先例。\n但需要明确：2008年针对奥运保障的临时全面禁烧要求，并不等于全国从这一年起永久实行全域禁烧。 后续长期全面禁烧，还要考察地方立法和具体政策。\n三、江苏：2009年就明确提出全域禁烧目标 江苏是研究秸秆禁烧制度扩张的重要案例。\n2009年5月20日，江苏省人大常委会通过《关于促进农作物秸秆综合利用的决定》。决定最初划定了以下重点禁烧范围：23\n区域类型 当时规定的禁烧范围 南京市 全行政区域 其他设区市 城市建成区周围30公里 县级政府所在地等 建成区周围5公里 机场 周边20公里 高速公路、国省道和铁路 两侧各5公里 其他区域 设区市、县（市）政府根据实际划定 更重要的是，这份决定要求地方逐步扩大禁烧区域，到2012年底实行全行政区域禁止露天焚烧秸秆。同年公布的《江苏省农作物秸秆综合利用规划（2010—2015年）》再次明确了这一时间目标。23\n这说明至少在江苏，全域禁烧并非单纯的基层宣传口号，而有明确的省级制度和规划依据。\n江苏为什么较早扩大管控范围？ 这与江苏的经济地理及农业生产特点密切相关。\n一方面，城市、人口居住区、交通干线和机场分布较密集。当对这些区域分别设置禁烧保护范围时，实际覆盖的农田可能已经很广。\n另一方面，江苏稻麦轮作普遍，收获与下茬播种之间存在时间压力；农民需要快速处理大量留在田间的秸秆。\n因此，江苏采取的并不是单独禁止焚烧，而是试图把禁烧、机械化还田、财政补助和秸秆收储结合起来。\n2014年环境保护部通报显示，江苏省安排秸秆还田作业补助专项资金5.2亿元，地方配套1.7亿元，补助标准由每亩10元提高到20元。同时，江苏使用卫星遥感、地面巡查和PM2.5自动监测，并探索无人机、直升机巡查。4\n这种模式体现了两个政策方向：一是通过管理措施抑制焚烧，二是通过财政资金降低农民采用替代处理方式的成本。\n真正困难的问题在于：不同地区、不同农户的秸秆处理成本并不一样，统一补助标准未必能够覆盖所有实际支出。\n四、安徽：2014年将卫星火点与财政奖补挂钩 如果说江苏代表禁烧空间范围的制度化扩大，那么安徽2014年的实践，则清楚展示了一个更重要的变化：焚烧火点开始直接影响地方政府能够获得的奖补资金。\n环境保护部2014年9月发布的夏季秸秆禁烧工作通报记载：4\n安徽省级财政新安排11.45亿元奖补资金，支持主产区秸秆机械化还田及其他综合利用项目。 以县为单位，重点区域每发现一个焚烧火点，扣减5%的省级奖补资金。 非重点区域每发现一个火点，扣减2%的省级奖补资金。 每日公布各市及省直管县的火点情况，每周通过电视新闻进行排序通报。 当年夏收结束后，蚌埠、淮北、滁州三个排名靠后的城市，其政府主要负责人在电视新闻中说明相关情况。 注意：5%和2%是当时安徽对有关地方奖补资金的扣减规则，不是农民个人的罚款标准，也不是全国统一规则。\n这为什么是一个关键转折？ 原本，某块农田发生焚烧，主要涉及现场行为人、附近居民和相关监管部门。\n但当焚烧火点与财政奖补、公开排名和行政责任发生联系后，一次火点就可能影响整个县的政策考核和资金安排。\n由此形成了更强的行政激励：\n火点越少，地方在财政奖补和行政考核方面面临的风险越小；反过来，发现火点也可能触发额外的督查和责任追究。\n这可以解释一些地方为什么倾向于扩大巡查、提高预防强度。\n但这种制度也有潜在风险：如果考核过度依赖火点数量，管理者可能更关注“有没有火点”，而不是秸秆是否以经济、环保和可持续的方式得到处理。\n这是对激励机制的分析，并不能仅凭上述规则断言当时存在普遍的违法执法或不当处罚。\n五、2013—2015年：禁烧与政府绩效考核进一步结合 2013年5月14日，国家发展改革委、农业部、环境保护部联合印发《关于加强农作物秸秆综合利用和禁烧工作的通知》（发改环资〔2013〕930号）。5\n文件提出了三个值得注意的要求。\n1. 明确地方责任 地方政府对本行政区域秸秆综合利用负总责，政府主要领导是第一责任人，并需要建立目标责任制，将责任落实到相关部门。\n2. 形成“倒逼机制” 文件要求将禁烧与项目审批、大气污染物总量减排考核、农村环保目标责任制考核等挂钩。\n3. 加强卫星监测和基层监管 文件提出建设基于卫星应用平台的禁烧监管信息系统，同时推动秸秆粉碎、打捆、还田及收储运体系建设。\n2014年，《大气污染防治行动计划》实施情况考核进一步纳入秸秆禁烧工作。环境保护部在2014年官方通报及2016年答复全国人大代表建议时，均确认了这一变化。46\n至此，秸秆禁烧不仅是农业生产和环境保护问题，也更加直接地进入地方政府的绩效考核体系。\n为什么更严格的管理方式容易出现？ 从执行成本看，精准区分禁烧区、非禁烧区、具体地块、特殊时段及管理条件，需要更加细致的调查和管理能力。\n而使用简单统一的全面禁烧规则，往往更容易宣传、检查和追究责任。\n比较项目 精准分区管理 简单全面禁烧 规则复杂度 较高 较低 地块和时段判定 需要具体判断 判断相对简单 农业生产灵活性 相对较高 相对较低 基层沟通成本 可能较高 初期可能较低 环境风险管理 更依赖技术和执行能力 更强调事前全面预防 这种行政激励可以解释部分地方管理范围扩张的动力，但行政便利性本身不能替代依法划定禁烧范围、实施处罚的法定依据。\n更重要的是，单纯加大监管并不能解决秸秆的最终去向。\n2015年6月，环境保护部在全国人大代表建议答复中明确指出，秸秆禁烧存在取证难、处罚难、基层执法力量不足等问题。一些地方基层人员在农忙季节进行24小时轮流巡查，仍不能及时发现和制止所有违法焚烧行为。该答复将重要原因归结为：大量剩余秸秆的出路尚未得到及时有效解决。7\n这是一段非常重要的官方判断：当时主管部门已经认识到，仅依靠巡查和处罚不能从根本上解决问题。\n六、湖北：2015年正式推行全省禁烧 2015年2月1日，湖北省第十二届人民代表大会第三次会议通过《关于农作物秸秆露天禁烧和综合利用的决定》。文件确定：自2015年5月1日起，湖北全省行政区域禁止露天焚烧秸秆。8\n这一决定同时要求地方完善防控机制、推进综合利用，并通过宣传、村规民约、责任分解等方式落实禁烧。\n有意思的是，湖北省人大公布的草案修改说明还记录了立法讨论中的不同意见。9\n当时，多数代表同意全面禁烧的时间安排和2020年秸秆综合利用率力争达到95%以上的目标，但也有代表提出，实施时间及目标能否进一步斟酌。\n最终，立法机关仍选择在2015年5月1日起实行全省禁烧。\n这说明，地方全面禁烧在形成过程中并非完全不存在讨论。政策制定者也必须在空气质量、农业生产周期、综合利用能力和实施时机之间作出选择。\n七、2014—2015年：火点真的减少了吗？ 根据环境保护部连续两年的夏季通报，在5月20日至7月31日这一监测时段内：410\n年份 全国卫星监测秸秆焚烧火点 2014年 2,119个 2015年 1,158个 2015年较2014年减少961个，下降45.35%。\n部分省份变化更为明显：\n省份 2014年夏季 2015年夏季 同比变化 安徽 644 32 -95.0% 湖北 79 14 -82.3% 河南 815 512 -37.2% 河北 106 196 +84.9% 安徽和湖北出现大幅下降，而河北却明显增加。\n这些官方数据说明：在相应监测条件下，全国夏季被发现的秸秆焚烧火点确实明显减少，但地区差异很大。\n为什么不能只用火点数量评价全部效果？ 首先，卫星火点并非对所有焚烧行为的完整记录。\n云层可能遮挡火点。 规模较小、燃烧时间较短的事件可能未被捕捉。 热异常点仍需地面核查，排除误判。 一个火点并不等于一个农户，也不能直接换算为燃烧面积或污染排放量。 其次，火点变化同时可能受天气、种植面积、收获进度、机械化水平、执法力度和政策激励等因素影响。\n最后，即便某一地区火点下降，也不能直接断言当地PM2.5浓度同比下降了相同百分比。\n因此，评价禁烧效果，理想情况下还应结合空气质量监测、农业生产成本、秸秆实际处理量及治理支出。\n八、江苏政策目标的时间变化：制度要求与实际实现并不是一回事 江苏在2009年的省人大决定和随后发布的规划中，都提出了到2012年底全面禁止露天焚烧秸秆的目标。23\n但2014年12月20日，江苏省政府《关于全面推进农作物秸秆综合利用的意见》又提出新的阶段性目标：11\n到2015年，秸秆综合利用率达到90%，基本杜绝露天焚烧。 到2017年，秸秆综合利用率提高到95%以上，实现全面禁止露天焚烧秸秆的目标。 这一变化值得重视。\n它并不直接证明此前所有地方都执行失败，但表明作出全域禁烧的制度安排，不等于在现实中已经形成足够的替代处理能力。\n秸秆收集、打捆、运输、储存、加工和销售，涉及机械设备、农村劳动力、季节性物流及产业市场，不可能仅通过发布行政命令立即建成。\n政策要求与技术、产业能力之间的时间差，是理解秸秆禁烧反复受到争议的关键。\n九、禁烧政策到底是在解决污染，还是转移成本？ 这两个问题不能混为一谈。\n首先，露天焚烧确实产生大气污染和公共安全风险。 在人口密集区、机场和交通干线附近实施严格管制，有明确的公共利益基础。\n其次，秸秆需要被处理的现实不会因为禁令而消失。 如果缺少市场化收储和经济可行的替代方式，农民就必须承担机械化还田、打捆、运输或其他清田成本。\n最后，监管本身也有成本。 卫星监测、基层巡查、值守、通报及现场核查都需要公共资源。\n可以把各方承担的成本粗略区分为：\n成本 可能承担的主体 主要表现 焚烧污染与公共安全损害 居民、交通使用者及社会 烟尘、健康风险、能见度降低 秸秆处理成本 农户、合作社、农业企业 粉碎、还田、打捆、清运、储存 监管与执行成本 各级政府 监测、巡查、核查、执法 资源化利用投资 企业、合作社与财政 收储运输网络、加工设施、补贴 禁烧有可能降低污染造成的社会成本，但不会自动消除秸秆处理成本。\n2016年发表于《资源科学》的《苏、浙、皖农户秸秆处理行为分析》，对473户农户开展调查。研究发现，禁烧补助、农户认知、还田技术指导和附近有无秸秆收购站点等因素，与焚烧、还田及出售秸秆的选择存在重要关联。12\n这意味着政策是否能够长期有效，既与监管强度有关，也与替代处理方式是否实际可行有关。\n2015年11月，国家发展改革委等四部门进一步发布《关于进一步加快推进农作物秸秆综合利用和禁烧工作的通知》，强调**“疏堵结合、以疏为主”**，提出到2020年全国秸秆综合利用率力争达到85%以上的目标。13\n这不是否定禁烧，而是表明行政禁止需要与农业技术、收储体系和市场需求一起发挥作用。\n十、2008—2015年的历史，究竟说明了什么？ 把几个关键节点放在一起看，政策变化的脉络十分清晰。\n时间 关键变化 历史意义 2008年 奥运期间九省市全面禁烧 大范围统一严格管控的重要先例 2009年 江苏制定到2012年底全域禁烧的目标 全域禁烧开始在地方制度化 2013年 国家文件强调政府责任和倒逼机制 禁烧与行政考核进一步结合 2014年 安徽把火点与财政奖补扣减挂钩 监测指标直接影响地方财政激励 2014年 禁烧纳入大气污染防治行动计划考核 环境治理绩效进一步强化 2015年 湖北通过全省禁烧决定 全域禁烧在更多地区制度化 2015年 国家进一步强化综合利用和收储政策 更明确回应单纯依赖禁烧的局限 这段历史最重要的变化，不是人们到2008年才发现秸秆焚烧污染空气，而是原本分散的农业生产行为，逐渐被纳入可监测、可排名、可考核、可追究责任的公共治理体系。\n这套制度能够在短期内动员地方资源，减少被监测到的焚烧火点，但也会引出新的问题：当行政目标与农户经济条件、当地农业技术水平不完全匹配时，禁烧成本究竟由谁承担？\n一项政策的治理目标具有正当性，并不意味着所有执行方式都同样合理。判断秸秆禁烧政策的成效，既要看环境改善，也要看农业生产条件和实施成本。\n从2008年奥运保障，到2015年的全面禁烧和综合利用并进，中国秸秆禁烧进入了由区域防控向系统性行政管理转变的关键时期。 这也为此后出现的全域禁烧争议、综合利用政策调整和精准划区讨论埋下伏笔。\n参考资料 以下主要采用政府原始政策文件、官方通报及学术研究。文中数字均以所列资料的相应年份与统计口径为准。\n环境保护部：《关于进一步加强秸秆禁烧工作的通知》（环发〔2008〕22号），2008年4月21日 江苏省人民政府：《江苏省农作物秸秆综合利用规划（2010—2015年）》，2009年12月2日 《江苏省人民代表大会常务委员会关于促进农作物秸秆综合利用的决定》，2009年5月20日（法规转载） 环境保护部：《关于2014年夏季秸秆禁烧工作情况的通报》，2014年9月15日 国家发展改革委等：《关于加强农作物秸秆综合利用和禁烧工作的通知》（发改环资〔2013〕930号） 环境保护部：《对十二届全国人大四次会议第7232号建议的答复》，2016年 环境保护部：《对十二届全国人大三次会议第5677号建议的答复》，2015年6月23日 《湖北省人民代表大会关于农作物秸秆露天禁烧和综合利用的决定》，2015年2月1日 湖北省人大：《关于〈湖北省人民代表大会关于农作物秸秆露天禁烧和综合利用的决定（草案）〉修改情况的说明》 环境保护部：《关于2015年夏季秸秆焚烧污染防控工作情况的通报》，2015年10月8日 江苏省人民政府：《关于全面推进农作物秸秆综合利用的意见》（苏政发〔2014〕126号） 漆军等：《苏、浙、皖农户秸秆处理行为分析》，《资源科学》，2016年第38卷第6期 国家发展改革委等：《关于进一步加快推进农作物秸秆综合利用和禁烧工作的通知》（发改环资〔2015〕2651号） 说明：本文重点回顾2008—2015年的政策演变。相关文件的历史内容不等于2026年现行法律的完整规定；当前具体禁烧范围、时段及处罚，应以现行法律和当地最新规定为准。\n","permalink":"https://blog.imcaoxuan.cn/posts/straw-burning-ban-history-part-2/","summary":"2008年的奥运保障是全面禁烧的重要先例，江苏2009年已提出全域禁烧目标。2013年以后，卫星火点、绩效考核与财政奖补共同改变了政策的执行逻辑。","title":"一把火，三十年：中国秸秆禁烧为何从重点管控走向全域禁烧？（二）"},{"content":"","permalink":"https://blog.imcaoxuan.cn/posts/2025-03-22-my-first-post/","summary":"","title":"My First Post"},{"content":"阅读前提：了解国内外云服务（如阿里云、Amazon Web Services），并有一定的使用经验 注册 注册一个微软账户即可，具体步骤可以参考知乎的这篇文章（如何白嫖微软Azure12个月及避坑指南 - 知乎 (zhihu.com)），\n注意：这篇文章写了有很久了，azure的策略可能已经更改，由此可能产生费用，大家实践的时候一定要看清收费策略，或者提前咨询客服，避免不必要的损失。\nAzure服务 以下是常用的azure服务：\n以下表格是Azure、阿里云和AWS的云服务的对应关系\nAzure 阿里云 AWS 备注 订阅（Subscriptions） 资源组（Resource groups） 资源组 虚拟机（Virtual machine） 云服务器ECS EC2 磁盘（Disk） 云盘 卷（Volume） 虚拟网络（Virtual network） 专有网络 VPC 网络接口（Network Interface） 交换机 网络接口（Network interface） 网络安全组（Network security group） 安全组 安全组（Security Group） 公共 IP 地址（Public IP address） 公网IP 公有 IPv4 /IPv6地址（Public IPv4/IPv6 address） SSH 密钥（SSH key） 密钥对 密钥对（Key Pair） 虚拟机 创建 基本 项目详情信息 订阅（一个 Azure 订阅中的所有资源在一起计费。）：默认。\n资源组（资源组是共享相同生命周期、权限和策略的资源的集合。）：一般按环境（dev、test、prod）或产品或地域来划分资源组，根据实际情况选择。\n实例详细信息 虚拟机名称（Azure 中的虚拟机有两个不同的名称: 用作 Azure 资源标识符的虚拟机名称，以及来宾主机名称中的名称。在门户中创建 VM 时，虚拟机名称和主机名称相同。创建 VM 后，不可更改虚拟机名称。但可在登录虚拟机时更改主机名称。）：根据实际情况命名。\n区域（选择适合你和你的客户的 Azure 区域。并非所有 VM 大小在所有区域中可用。）：根据实际情况选择。如访问者在国内居多，建议使用（(Asia Paciffic) Japan East 日本东京 、 (Asia Paciffic) East Asia 香港 、 (Asia Paciffic) Korea South 韩国首尔），实测日本东京效果最好，实际情况可能还会因地域、电信运营商、网络环境、时间等因素而产生差异。\n可用性选项（Azure 提供一系列用于管理应用可用性和复原性的选项。构建自己的解决方案，在可用性区域或可用性集中使用复制的虚拟机，以便在数据中心运行中断和维护时为应用和数据提供保护。了解详细信息）：根据实际情况选择。\n安全类型（安全类型是指可用于虚拟机的不同安全功能。受信任的启动和机密虚拟机等安全功能有助于提高 Azure 第 2 代虚拟机的安全性。但是，其他安全功能有一些限制，包括不支持备份、托管磁盘和临时 OS 磁盘。详细了解受信任的启动虚拟机和机密虚拟机。）：默认\n映像（为 VM 选择基本操作系统或应用程序）：根据实际情况选择。如果选择内存较小的虚拟机，建议使用Debian系列映像。\nVM 体系结构（Azure 提供了基于 x64 或 Arm64 的虚拟机选项来运行你的应用程序。基于 x64 的 VM 提供最强的软件兼容性，而基于 Arm64 的 VM 的性价比相比可比较的 x64 VM 最多高出 50%。基于 Arm64 的 VM 还可帮助开发人员无需进行交叉编译即可构建与 Arm 兼容的软件。了解更多信息）：根据实际情况选择。一般选择x64。\n使用 Azure 现成虚拟机折扣运行（Azure 现成 VM 分别按折扣费率和即用即付价格来提供未使用的 Azure 容量。工作负载应能够容忍基础结构丢失，因为 Azure 可能会撤回即用即付工作负载的容量。详细了解 Azure 现成 VM 实例。）：这是为了防止你的用量超过免费额度。根据实际情况选择。\n大小：如果要使用免费额度，就选择Standard_B1s，否则根据实际情况选择。\n管理员帐户 身份验证类型（选择管理员帐户是使用用户名/密码还是 SSH 密钥进行身份验证。）：建议使用SSH公钥而非密码。\n用户名（VM 的管理员用户名）：自定义。\nSSH公钥源：①如果你的Azure已有密钥对，直接选择使用Azure中存储的现有密钥对；②如果你确保你的上网环境及设备是安全的，就选择生成新密钥对，在完成创建虚拟机后，你有一次下载私钥的机会，公钥将由Azure-SSH密钥保管；③如果你无法确保你的上网环境是安全的或者你在本地已经拥有密钥，建议选择使用现有公钥，并输入你的公钥。\n入站端口规则 公共入站端口 （默认情况下，对虚拟机的访问仅限于同一虚拟网络中的源和 Azure 负载均衡解决方案中的流量。选择“无”以确认，或选择允许通信流从公共 Internet 到达这些常用端口中的一个。）：建议选择允许选定的端口\n选择入站端口： 选择SSH（22），并根据实际需求尽量少地添加入站端口。\n磁盘 VM磁盘加密 主机加密（主机加密通过平台管理的密钥、OS 和数据磁盘缓存，使用密钥管理下拉列表中指定的密钥加密临时磁盘和临时 OS 磁盘，并将加密内容流动到存储服务。了解更多信息）： 默认。\nOS磁盘 OS磁盘大小（通过 Azure 免费帐户可能免费获得特定的 OS 磁盘大小。了解详细信息）：如果要使用免费额度，那就选择重设大小为64GB（P6）免费账户可用。否则根据实际情况选择。\nOS磁盘类型（可以选择用于支持工作负荷或方案的 Azure 托管磁盘类型。了解托管磁盘的类型）：如果要使用免费额度，那就选择高级SSD（本地冗余存储）。\n使用 VM 删除（磁盘独立于虚拟机继续存在。当删除关联的虚拟机时，可以选择自动删除磁盘。了解详细信息）：根据实际情况选择。\n密钥管理（磁盘加密集存储客户密钥，磁盘或快照将使用该密钥加密其数据。在此步骤中必须选择现有磁盘加密集。磁盘加密集需要访问密钥保管库和密钥。详细了解磁盘加密集。）：取决于SSH公钥源。\n启用超级磁盘兼容性（Azure 超级磁盘可为 Azure IaaS VM 提供高吞吐量、高 IOPS 和一致的低延迟磁盘存储。超级磁盘适用于数据密集型工作负载(如 SAP HANA)、顶层数据库和事务繁重型工作负载。添加此功能会产生保留费用，但只有在 VM 上启用超级磁盘功能而不附加超级磁盘时，才会收取该保留费用。了解详细信息）：默认。\n数据磁盘：根据实际需求而定。\n网络 网络接口 虚拟网络：根据实际情况选择。如果没有，则新建。\n公用IP：根据实际情况选择。如果没有，则新建。\n创建公共IP地址\n名称：自定义。建议命名方式“{虚拟机名称}-ip-{第几个}”\nSKU（公共 IP 的 SKU 必须与搭配使用的负载均衡器的 SKU 一致。了解详细信息）：选择标准。\n分配（标准 SKU 仅支持静态分配。）：静态。\n路由首选项（确定流量在 Azure 和 Internet 之间的路由方式。选择 Microsoft 全球网络可通过距离用户最近的 Microsoft 全局网络传递流量。Internet 路由选项使用中转 ISP 网络。流出数据传输价格因选择的路由方式而异。公共 IP 的路由首选项一旦创建就不能更改了。详细了解路由首选项）：\n管理 缺省。\n监视 缺省。\n高级 缺省。\n标记 缺省。\n查看 + 创建 连接 以 WSL on Windows 为例：\n打开WSL，进入~/.ssh目录（如果不存在则创建），将下载好的私钥文件拷贝到WSL下。` cd ~/.ssh cp /mnt/c/Users/CaoXuan/Downloads/my-zure.key . 上面的命令将会把C:\\Users\\CaoXuan\\Downloads\\my-zure.key拷贝到WSL下。\n在~/.ssh/config文件（如果不存在则创建）中追加以下内容（根据你的情况进行修改）： Host my-azure Hostname 0.0.0.0(你的虚拟机的公网IP) Port 22 User azureuser(你的用户名) IdentityFile ~/.ssh/my-azure.pem(你的私钥) 连接虚拟机 ssh my-azure ","permalink":"https://blog.imcaoxuan.cn/posts/2023-06-18-getting-started-with-azure-part-1/","summary":"\u003c!--markdown--\u003e\u003cmark\u003e阅读前提：了解国内外云服务（如阿里云、Amazon Web Services），并有一定的使用经验\u003c/mark\u003e\n\u003ch2 id=\"注册\"\u003e注册\u003c/h2\u003e\n\u003cp\u003e注册一个微软账户即可，具体步骤可以参考知乎的这篇文章（\u003ca href=\"https://zhuanlan.zhihu.com/p/157632464\"\u003e如何白嫖微软Azure12个月及避坑指南 - 知乎 (zhihu.com)\u003c/a\u003e），\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e注意：这篇文章写了有很久了，azure的策略可能已经更改，由此可能产生费用，大家实践的时候一定要看清收费策略，或者提前咨询客服，避免不必要的损失。\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"azure服务\"\u003eAzure服务\u003c/h2\u003e\n\u003cp\u003e以下是常用的azure服务：\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"1.png\" loading=\"lazy\" src=\"https://www.caoxuan.top/usr/uploads/2023/06/109458117.png\"\u003e\u003c/p\u003e\n\u003cp\u003e以下表格是Azure、阿里云和AWS的云服务的对应关系\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eAzure\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e阿里云\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eAWS\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e备注\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e订阅（Subscriptions）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e资源组（Resource groups）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e资源组\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e虚拟机（Virtual machine）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e云服务器ECS\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEC2\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e磁盘（Disk）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e云盘\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e卷（Volume）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e虚拟网络（Virtual network）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e专有网络\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eVPC\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e网络接口（Network Interface）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e交换机\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e网络接口（Network interface）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e网络安全组（Network security group）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e安全组\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e安全组（Security Group）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e公共 IP 地址（Public IP address）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e公网IP\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e公有 IPv4 /IPv6地址（Public IPv4/IPv6 address）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSSH 密钥（SSH key）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e密钥对\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e密钥对（Key Pair）\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"虚拟机\"\u003e虚拟机\u003c/h3\u003e\n\u003ch4 id=\"创建\"\u003e创建\u003c/h4\u003e\n\u003ch5 id=\"基本\"\u003e基本\u003c/h5\u003e\n\u003cp\u003e\u003cimg alt=\"createvm1png\" loading=\"lazy\" src=\"https://www.caoxuan.top/usr/uploads/2023/06/340238780.png\"\u003e\u003c/p\u003e","title":"Azure入门指南（一）"},{"content":" 下载或打开 PDF\nChatGPT接入微信 from flask import Flask, request, make_response import requests import hashlib import xml.etree.cElementTree as ET import time # from WXBizMsgCrypt import WXBizMsgCrypt import base64 import redis app = Flask(__name__) # 见下图 headers={\u0026#39;Authorization\u0026#39;: \u0026#39;Bearer **-********************\u0026#39;} appid = \u0026#39;***********\u0026#39; token = \u0026#39;*******************\u0026#39; encodingAESKey = \u0026#39;************************\u0026#39; r = redis.Redis() @app.get(\u0026#39;/completions\u0026#39;) def sig(): args = request.args print(args) signature = args[\u0026#39;signature\u0026#39;] echostr = args[\u0026#39;echostr\u0026#39;] timestamp = args[\u0026#39;timestamp\u0026#39;] nonce = args[\u0026#39;nonce\u0026#39;] arr = [token, timestamp, nonce] arr.sort() s = \u0026#39;\u0026#39;.join(arr) sha1 = hashlib.sha1(s.encode(\u0026#39;utf-8\u0026#39;)).hexdigest() if sha1 == signature: return echostr, 200 return \u0026#39;error\u0026#39;, 500 @app.post(\u0026#39;/completions\u0026#39;) def completions(): t0 = time.time() xmlStr = request.stream.read() print(f\u0026#39;xmlStr = {xmlStr}\u0026#39;) xmlData = None try: xmlData = ET.fromstring(xmlStr) except Exception: return \u0026#39;\u0026#39;, 200 msg_type = xmlData.find(\u0026#39;MsgType\u0026#39;).text if msg_type == \u0026#39;text\u0026#39;: ToUserName = xmlData.find(\u0026#39;ToUserName\u0026#39;).text FromUserName = xmlData.find(\u0026#39;FromUserName\u0026#39;).text Content = xmlData.find(\u0026#39;Content\u0026#39;).text json = { \u0026#34;model\u0026#34;: \u0026#34;text-davinci-003\u0026#34;, \u0026#34;prompt\u0026#34;: Content.strip(), \u0026#34;max_tokens\u0026#34;: 4000, \u0026#34;temperature\u0026#34;: 1.0 } key = str(FromUserName + \u0026#39;:\u0026#39; + Content.strip()) print(f\u0026#39;question:{key}\u0026#39;) reply = \u0026#39;\u0026#39;\u0026#39; \u0026lt;xml\u0026gt; \u0026lt;ToUserName\u0026gt;\u0026lt;![CDATA[%s]]\u0026gt;\u0026lt;/ToUserName\u0026gt; \u0026lt;FromUserName\u0026gt;\u0026lt;![CDATA[%s]]\u0026gt;\u0026lt;/FromUserName\u0026gt; \u0026lt;CreateTime\u0026gt;%s\u0026lt;/CreateTime\u0026gt; \u0026lt;MsgType\u0026gt;\u0026lt;![CDATA[text]]\u0026gt;\u0026lt;/MsgType\u0026gt; \u0026lt;Content\u0026gt;\u0026lt;![CDATA[%s]]\u0026gt;\u0026lt;/Content\u0026gt; \u0026lt;/xml\u0026gt; \u0026#39;\u0026#39;\u0026#39; answer = \u0026#39;没听清，再说一遍\u0026#39; cache = r.get(key) if cache: answer = cache.decode(\u0026#39;utf-8\u0026#39;) r.delete(key) elif cache is None: r.set(key, \u0026#39;\u0026#39;, ex=60) text = \u0026#39;\u0026#39; try: res = requests.post(\u0026#39;https://api.openai.com/v1/completions\u0026#39;, headers=headers, json=json).json() text = res[\u0026#39;choices\u0026#39;][0][\u0026#39;text\u0026#39;] print(f\u0026#39;res = {res}\u0026#39;) except Exception as e: print(f\u0026#39;error:{e}\u0026#39;) r.set(key, None) return \u0026#39;\u0026#39;, 555 t1 = time.time() if t1 - t0 \u0026gt; 4.5: r.set(key, text, ex=3600) return \u0026#39;\u0026#39;, 555 else: answer = res[\u0026#39;choices\u0026#39;][0][\u0026#39;text\u0026#39;] elif cache.decode(\u0026#39;utf-8\u0026#39;) == \u0026#39;\u0026#39;: print(\u0026#39;sleep\u0026#39;) time.sleep(4.5) answer = f\u0026#39;思考中...\\n过会儿再对我说一遍[{Content.strip()}]\u0026#39; else: return \u0026#39;success\u0026#39; response = make_response(reply % (FromUserName, ToUserName, str(int(time.time())), answer.strip())) response.content_type = \u0026#39;application/xml\u0026#39; return response else: return \u0026#39;success\u0026#39; if __name__ == \u0026#39;__main__\u0026#39;: app.run(port = 9999) appid：必填 token：必填 encodingAESKey：选填（当需要加密时必填）\nSECRET KEY：必填（{\u0026lsquo;Authorization\u0026rsquo;: \u0026lsquo;Bearer空格SECRET KEY‘）\n","permalink":"https://blog.imcaoxuan.cn/posts/2023-02-08-integrate-chatgpt-with-wechat/","summary":"\u003c!--markdown--\u003e\n\u003cp\u003e\u003ca href=\"https://blog-images.imcaoxuan.cn/2026/10/23/1792748921.pdf\"\u003e下载或打开 PDF\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"chatgpt接入微信\"\u003eChatGPT接入微信\u003c/h1\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003efrom\u003c/span\u003e flask \u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e Flask, request, make_response\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e requests\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e hashlib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e xml.etree.cElementTree \u003cspan style=\"color:#66d9ef\"\u003eas\u003c/span\u003e ET\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e time\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# from WXBizMsgCrypt import WXBizMsgCrypt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e base64\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e redis\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapp \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Flask(__name__)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 见下图\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eheaders\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e{\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Authorization\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Bearer **-********************\u0026#39;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eappid \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;***********\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etoken \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;*******************\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eencodingAESKey \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;************************\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003er \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e redis\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eRedis()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003e@app.get\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;/completions\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003esig\u003c/span\u003e():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    args \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e request\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eargs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(args)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    signature \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e args[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;signature\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    echostr \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e args[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;echostr\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    timestamp \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e args[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;timestamp\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    nonce \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e args[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;nonce\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    arr \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e [token, timestamp, nonce]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    arr\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esort()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    s \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ejoin(arr)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    sha1 \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e hashlib\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esha1(s\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eencode(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e))\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ehexdigest()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e sha1 \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e signature:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e echostr, \u003cspan style=\"color:#ae81ff\"\u003e200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;error\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e500\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003e@app.post\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;/completions\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ecompletions\u003c/span\u003e():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    t0 \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e time\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etime()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    xmlStr \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e request\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003estream\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eread()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#e6db74\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;xmlStr = \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003exmlStr\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    xmlData \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eNone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003etry\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        xmlData \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e ET\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003efromstring(xmlStr)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eexcept\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eException\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    msg_type \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e xmlData\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003efind(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;MsgType\u0026#39;\u003c/span\u003e)\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etext\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e msg_type \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;text\u0026#39;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ToUserName \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e xmlData\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003efind(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;ToUserName\u0026#39;\u003c/span\u003e)\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etext\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        FromUserName \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e xmlData\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003efind(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;FromUserName\u0026#39;\u003c/span\u003e)\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etext\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        Content \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e xmlData\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003efind(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Content\u0026#39;\u003c/span\u003e)\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etext\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        json \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;model\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;text-davinci-003\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;prompt\u0026#34;\u003c/span\u003e: Content\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003estrip(),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;max_tokens\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e4000\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;temperature\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e1.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        key \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e str(FromUserName \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;:\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e Content\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003estrip())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#e6db74\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;question:\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003ekey\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        reply \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e                    \u0026lt;xml\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e                    \u0026lt;ToUserName\u0026gt;\u0026lt;![CDATA[\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e%s\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e]]\u0026gt;\u0026lt;/ToUserName\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e                    \u0026lt;FromUserName\u0026gt;\u0026lt;![CDATA[\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e%s\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e]]\u0026gt;\u0026lt;/FromUserName\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e                    \u0026lt;CreateTime\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e%s\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026lt;/CreateTime\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e                    \u0026lt;MsgType\u0026gt;\u0026lt;![CDATA[text]]\u0026gt;\u0026lt;/MsgType\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e                    \u0026lt;Content\u0026gt;\u0026lt;![CDATA[\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e%s\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e]]\u0026gt;\u0026lt;/Content\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e                    \u0026lt;/xml\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e                    \u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        answer \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;没听清，再说一遍\u0026#39;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        cache \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e r\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eget(key)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e cache:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            answer \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e cache\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003edecode(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            r\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003edelete(key)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eelif\u003c/span\u003e cache \u003cspan style=\"color:#f92672\"\u003eis\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eNone\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            r\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eset(key, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e, ex\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e60\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            text \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003etry\u003c/span\u003e: \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                res \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e requests\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003epost(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;https://api.openai.com/v1/completions\u0026#39;\u003c/span\u003e, headers\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eheaders, json\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ejson)\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ejson()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                text \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e res[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;choices\u0026#39;\u003c/span\u003e][\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;text\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                print(\u003cspan style=\"color:#e6db74\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;res = \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003eres\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eexcept\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eException\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eas\u003c/span\u003e e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                print(\u003cspan style=\"color:#e6db74\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;error:\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003ee\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                r\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eset(key, \u003cspan style=\"color:#66d9ef\"\u003eNone\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e555\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            t1 \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e time\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etime()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e t1 \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e t0 \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e4.5\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                r\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eset(key, text, ex\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e3600\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e555\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                answer \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e res[\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;choices\u0026#39;\u003c/span\u003e][\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;text\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eelif\u003c/span\u003e cache\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003edecode(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            print(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;sleep\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            time\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esleep(\u003cspan style=\"color:#ae81ff\"\u003e4.5\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            answer \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;思考中...\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e过会儿再对我说一遍[\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003eContent\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003estrip()\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e]\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;success\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        response \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e make_response(reply \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e (FromUserName, ToUserName, str(int(time\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etime())), answer\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003estrip()))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        response\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003econtent_type \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;application/xml\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e response\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;success\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e __name__ \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;__main__\u0026#39;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    app\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003erun(port \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e9999\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eappid\u003c/strong\u003e：必填\n\u003cstrong\u003etoken\u003c/strong\u003e：必填\n\u003cstrong\u003eencodingAESKey\u003c/strong\u003e：选填（当需要加密时必填）\u003c/p\u003e","title":"ChatGPT接入微信"},{"content":"# Debian/Ubuntu使用Nexus的私有镜像源 以Debian11为例 修改**/etc/apt/source.list**\nvim /etc/apt/source.list # deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main #deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main deb http://deb.debian.org/debian/ bullseye main deb-src http://deb.debian.org/debian/ bullseye main deb http://security.debian.org/debian-security bullseye-security main contrib deb-src http://security.debian.org/debian-security bullseye-security main contrib # bullseye-updates, to get updates before a point release is made; # see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports deb http://deb.debian.org/debian/ bullseye-updates main contrib deb-src http://deb.debian.org/debian/ bullseye-updates main contrib 把其中的地址替换成你的私有镜像源地址\n# deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main #deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main deb http://mirror.nfools.org:8081/repository/debian-bullseye/ bullseye main deb-src http://mirror.nfools.org:8081/repository/debian-bullseye/ bullseye main deb http://security.debian.org/debian-security bullseye-security main contrib deb-src http://security.debian.org/debian-security bullseye-security main contrib # bullseye-updates, to get updates before a point release is made; # see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports deb http://deb.debian.org/debian/ bullseye-updates main contrib deb-src http://deb.debian.org/debian/ bullseye-updates main contrib 保存并退出\n创建**/etc/apt/auth.conf.d/nexus.local.intranet.conf**（如果你的仓库允许匿名访问，则忽略这一步）\nvim /etc/apt/auth.conf.d/nexus.local.intranet.conf 配置你的镜像源地址、登录名和密码\nmachine http://mirror.nfools.org:8081/ login public password public 保存并退出\n更新apt\napt update 以Ubuntu为例 同上，略。\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-10-27-use-a-private-nexus-apt-mirror-on-debian-and-ubuntu/","summary":"\u003c!--markdown--\u003e# Debian/Ubuntu使用Nexus的私有镜像源\n\u003ch3 id=\"以debian11为例\"\u003e以Debian11为例\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e修改**/etc/apt/source.list**\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim /etc/apt/source.list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://deb.debian.org/debian/ bullseye main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://deb.debian.org/debian/ bullseye main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://security.debian.org/debian-security bullseye-security main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://security.debian.org/debian-security bullseye-security main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# bullseye-updates, to get updates before a point release is made;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://deb.debian.org/debian/ bullseye-updates main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://deb.debian.org/debian/ bullseye-updates main contrib\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e把其中的地址替换成你的私有镜像源地址\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://mirror.nfools.org:8081/repository/debian-bullseye/ bullseye main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://mirror.nfools.org:8081/repository/debian-bullseye/ bullseye main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://security.debian.org/debian-security bullseye-security main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://security.debian.org/debian-security bullseye-security main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# bullseye-updates, to get updates before a point release is made;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://deb.debian.org/debian/ bullseye-updates main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://deb.debian.org/debian/ bullseye-updates main contrib\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e保存并退出\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e创建**/etc/apt/auth.conf.d/nexus.local.intranet.conf**（如果你的仓库允许匿名访问，则忽略这一步）\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim /etc/apt/auth.conf.d/nexus.local.intranet.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e配置你的镜像源地址、登录名和密码\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emachine http://mirror.nfools.org:8081/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elogin public\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epassword public\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e保存并退出\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e更新apt\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt update\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ol\u003e","title":"Debian-Ubuntu使用Nexus的私有镜像源"},{"content":"假如你要使用**if**语句判断**Query**类的成员变量**in**是否为**null**，你可能会这么写： ``````（错误） 正确的做法是把Query类的in变量名改成其它名字，比如改成contains \u0026lt;if test=\u0026quot;null != query.contains\u0026quot;\u0026gt;\u0026lt;/if\u0026gt;（正确）\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-10-11-avoid-reserved-keywords-in-mybatis-xml-expressions/","summary":"\u003c!--markdown--\u003e假如你要使用**if**语句判断**Query**类的成员变量**in**是否为**null**，你可能会这么写： ```\u003cif test=\"null != query.in\"\u003e\u003c/if\u003e```（错误）\n\u003chr\u003e\n\u003cp\u003e正确的做法是把\u003cstrong\u003eQuery\u003c/strong\u003e类的\u003cstrong\u003ein\u003c/strong\u003e变量名改成其它名字，比如改成\u003cem\u003econtains\u003c/em\u003e \u003ccode\u003e\u0026lt;if test=\u0026quot;null != query.contains\u0026quot;\u0026gt;\u0026lt;/if\u0026gt;\u003c/code\u003e（正确）\u003c/p\u003e","title":"mybatis xml的字符串表达式中不要包含in（因为in是关键字，除此之外，还有很多关键字都不要放在这里）！！！"},{"content":"1.在套件中心停用Gitlab。 2.打开docker，右键编辑synology_gitlab，在端口设置中将本地端口44333（自定义）， 映射到容器端口443，然后在环境变量中新增GITLAB_HTTPS true 完成以上步骤后，重启Gitlab，就可以在浏览器上使用https访问Gitlab了。 但是当使用克隆代码时，仍然是使用原来的端口。 3.在环境变量中修改GITLAB_PORT的值为44333（自定义） 然后重启Gitlab就完事了。\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-10-07-enable-https-for-gitlab-on-synology/","summary":"\u003c!--markdown--\u003e1.在套件中心停用Gitlab。\n\u003cp\u003e\u003cimg alt=\"屏幕截图 2022-10-07 225900.png\" loading=\"lazy\" src=\"https://www.caoxuan.top/usr/uploads/2022/10/3894530090.png\"\u003e\n2.打开docker，右键编辑synology_gitlab，在端口设置中将本地端口44333（自定义）， 映射到容器端口443，然后在环境变量中新增\u003ccode\u003eGITLAB_HTTPS true\u003c/code\u003e\n\u003cimg alt=\"屏幕截图 2022-10-07 230252.png\" loading=\"lazy\" src=\"https://www.caoxuan.top/usr/uploads/2022/10/15891951.png\"\u003e\n\u003cimg alt=\"屏幕截图 2022-10-07 230325.png\" loading=\"lazy\" src=\"https://www.caoxuan.top/usr/uploads/2022/10/2058308897.png\"\u003e\n完成以上步骤后，重启Gitlab，就可以在浏览器上使用https访问Gitlab了。\n但是当使用克隆代码时，仍然是使用原来的端口。\n3.在环境变量中修改GITLAB_PORT的值为44333（自定义）\n\u003cimg alt=\"屏幕截图 2022-10-07 230713.png\" loading=\"lazy\" src=\"https://www.caoxuan.top/usr/uploads/2022/10/4025217960.png\"\u003e\n然后重启Gitlab就完事了。\u003c/p\u003e","title":"群晖Gitlab开启https"},{"content":"Debian/Ubuntu使用Nexus的私有镜像源 以Debian11为例 修改**/etc/apt/source.list**\nvim /etc/apt/source.list # deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main #deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main deb http://deb.debian.org/debian/ bullseye main deb-src http://deb.debian.org/debian/ bullseye main deb http://security.debian.org/debian-security bullseye-security main contrib deb-src http://security.debian.org/debian-security bullseye-security main contrib # bullseye-updates, to get updates before a point release is made; # see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports deb http://deb.debian.org/debian/ bullseye-updates main contrib deb-src http://deb.debian.org/debian/ bullseye-updates main contrib 把其中的地址替换成你的私有镜像源地址\n# deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main #deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main deb http://mirror.nfools.org:8081/repository/debian-bullseye/ bullseye main deb-src http://mirror.nfools.org:8081/repository/debian-bullseye/ bullseye main deb http://security.debian.org/debian-security bullseye-security main contrib deb-src http://security.debian.org/debian-security bullseye-security main contrib # bullseye-updates, to get updates before a point release is made; # see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports deb http://deb.debian.org/debian/ bullseye-updates main contrib deb-src http://deb.debian.org/debian/ bullseye-updates main contrib 保存并退出\n创建**/etc/apt/auth.conf.d/nexus.local.intranet.conf**（如果你的仓库允许匿名访问，则忽略这一步）\nvim /etc/apt/auth.conf.d/nexus.local.intranet.conf 配置你的镜像源地址、登录名和密码\nmachine http://mirror.nfools.org:8081/ login public password public 保存并退出\n更新apt\napt update 以Ubuntu为例 同上，略。\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-09-23-use-a-private-nexus-apt-mirror-on-debian-and-ubuntu/","summary":"\u003ch1 id=\"debianubuntu使用nexus的私有镜像源\"\u003eDebian/Ubuntu使用Nexus的私有镜像源\u003c/h1\u003e\n\u003ch3 id=\"以debian11为例\"\u003e以Debian11为例\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e修改**/etc/apt/source.list**\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim /etc/apt/source.list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://deb.debian.org/debian/ bullseye main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://deb.debian.org/debian/ bullseye main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://security.debian.org/debian-security bullseye-security main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://security.debian.org/debian-security bullseye-security main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# bullseye-updates, to get updates before a point release is made;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://deb.debian.org/debian/ bullseye-updates main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://deb.debian.org/debian/ bullseye-updates main contrib\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e把其中的地址替换成你的私有镜像源地址\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#deb cdrom:[Debian GNU/Linux 11.2.0 _Bullseye_ - Official amd64 DVD Binary-1 20211218-11:13]/ bullseye contrib main\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://mirror.nfools.org:8081/repository/debian-bullseye/ bullseye main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://mirror.nfools.org:8081/repository/debian-bullseye/ bullseye main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://security.debian.org/debian-security bullseye-security main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://security.debian.org/debian-security bullseye-security main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# bullseye-updates, to get updates before a point release is made;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb http://deb.debian.org/debian/ bullseye-updates main contrib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeb-src http://deb.debian.org/debian/ bullseye-updates main contrib\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e保存并退出\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e创建**/etc/apt/auth.conf.d/nexus.local.intranet.conf**（如果你的仓库允许匿名访问，则忽略这一步）\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim /etc/apt/auth.conf.d/nexus.local.intranet.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e配置你的镜像源地址、登录名和密码\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emachine http://mirror.nfools.org:8081/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elogin public\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epassword public\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e保存并退出\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e更新apt\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt update\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ol\u003e","title":"Debian/Ubuntu使用Nexus的私有镜像源"},{"content":"# MySQL8.0主从同步 参考：https://www.cnblogs.com/kylinlin/p/5258719.html\n一、 主数据库 1.修改配置文件 vim /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] log-bin=mysql-bin server-id=1 2.锁表 mysql \u0026gt; flush tables with read lock; 3.备份 mysqldump -u root -p \u0026#39;root\u0026#39; -S /var/run/mysqld/mysqld.sock kpc | gzip \u0026gt; /tmp/mysql_bak.$(date +%F).sql.gz 4.创建用户并授权 CREATE USER \u0026#39;rep\u0026#39;@\u0026#39;%\u0026#39; IDENTIFIED WITH mysql_native_password BY \u0026#39;rep\u0026#39;; GRANT REPLICATION SLAVE ON *.* TO \u0026#39;rep\u0026#39;@\u0026#39;%\u0026#39;; 5.记录信息 mysql \u0026gt; show master status; 6.重启 sudo systemctl restart mysql 二、从数据库 1.修改配置文件 vim /etc/mysql/mysql.conf.d/mysqld.cnf [server-id != 1](# 1.修改配置文件)\n[mysqld] server-id=2 2.配置Master [MASTER_USER](# 4.创建用户)\n[MASTER_PASSWORD](# 4.创建用户)\n[MASTER_LOG_FILE](# 5.记录信息)\n[MASTER_LOG_POS](# 5.记录信息)\nmysql\u0026gt; CHANGE MASTER TO -\u0026gt; MASTER_HOST=\u0026#39;master_host_name\u0026#39;, -\u0026gt; MASTER_USER=\u0026#39;rep\u0026#39;, -\u0026gt; MASTER_PASSWORD=\u0026#39;rep\u0026#39;, -\u0026gt; MASTER_LOG_FILE=\u0026#39;mysql-bin.000001\u0026#39;, -\u0026gt; MASTER_LOG_POS=156 3.运行 mysql \u0026gt; start slave; ","permalink":"https://blog.imcaoxuan.cn/posts/2022-09-09-configure-mysql-8-0-primary-replica-replication/","summary":"\u003c!--markdown--\u003e# MySQL8.0主从同步\n\u003cp\u003e参考：https://www.cnblogs.com/kylinlin/p/5258719.html\u003c/p\u003e\n\u003ch2 id=\"一-主数据库\"\u003e一、 主数据库\u003c/h2\u003e\n\u003ch4 id=\"1修改配置文件\"\u003e1.修改配置文件\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim /etc/mysql/mysql.conf.d/mysqld.cnf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003emysqld\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elog-bin\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003emysql-bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eserver-id\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"2锁表\"\u003e2.锁表\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emysql \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eflush\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003etables\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eread\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003elock\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"3备份\"\u003e3.备份\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emysqldump -u root -p \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;root\u0026#39;\u003c/span\u003e -S /var/run/mysqld/mysqld.sock kpc | gzip \u0026gt; /tmp/mysql_bak.\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003edate +%F\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e.sql.gz\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"4创建用户并授权\"\u003e4.创建用户并授权\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eCREATE\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eUSER\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;rep\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e@\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eIDENTIFIED\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eWITH\u003c/span\u003e mysql_native_password \u003cspan style=\"color:#66d9ef\"\u003eBY\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;rep\u0026#39;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eGRANT\u003c/span\u003e REPLICATION SLAVE \u003cspan style=\"color:#66d9ef\"\u003eON\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e.\u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eTO\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;rep\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e@\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"5记录信息\"\u003e5.记录信息\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emysql \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eshow\u003c/span\u003e master status;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"c:\\\\Users\\\\caoxuan\\\\Desktop\\\\3.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"6重启\"\u003e6.重启\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo systemctl restart mysql\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"二从数据库\"\u003e二、从数据库\u003c/h2\u003e\n\u003ch4 id=\"1修改配置文件-1\"\u003e1.修改配置文件\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim /etc/mysql/mysql.conf.d/mysqld.cnf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e[server-id != 1](# 1.修改配置文件)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003emysqld\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eserver-id\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"2配置master\"\u003e2.配置Master\u003c/h4\u003e\n\u003cp\u003e[MASTER_USER](# 4.创建用户)\u003c/p\u003e\n\u003cp\u003e[MASTER_PASSWORD](# 4.创建用户)\u003c/p\u003e\n\u003cp\u003e[MASTER_LOG_FILE](# 5.记录信息)\u003c/p\u003e\n\u003cp\u003e[MASTER_LOG_POS](# 5.记录信息)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emysql\u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eCHANGE\u003c/span\u003e MASTER \u003cspan style=\"color:#66d9ef\"\u003eTO\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003e MASTER_HOST\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;master_host_name\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003e MASTER_USER\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;rep\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003e MASTER_PASSWORD\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;rep\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003e MASTER_LOG_FILE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;mysql-bin.000001\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003e MASTER_LOG_POS\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e156\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"3运行\"\u003e3.运行\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emysql \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e start slave;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"MySQL8.0主从同步"},{"content":"我打算把**Spring Cloud Alibaba**升级个版本，看看有什么新特性，结果升级后死活启动不了。 事情是这样的，跟往常一样，我先去Spring官网找到Spring Cloud Alibaba的最新的版本号，如下图所示：\n可以看到最新的版本是2021.0.1.0\n我默默记下这个版本号\u0026hellip; 然后点了右上角的那只章鱼猫 在Wiki里找到版本说明，如下图所示： 现在我知道了Spring Cloud Alibaba Version、Spring Cloud Version和Spring Boot Version三者版本对应关系了！\n我再次回到Spring官网，然后打开Spring Cloud Alibaba的Reference，根据文档，一顿操作。 其实大概就只有三步：\n添加依赖 \u0026lt;!--在父工程添加以下依赖--\u0026gt; \u0026lt;properties\u0026gt; \u0026lt;spring.cloud.version\u0026gt;2021.0.1\u0026lt;/spring.cloud.version\u0026gt; \u0026lt;spring-boot-dependencies.version\u0026gt;2.6.3\u0026lt;/spring-boot-dependencies.version\u0026gt; \u0026lt;com.alibaba.cloud.spring-cloud-alibaba-dependencies.version\u0026gt;2021.0.1.0 \u0026lt;/com.alibaba.cloud.spring-cloud-alibaba-dependencies.version\u0026gt; \u0026lt;/properties\u0026gt; \u0026lt;dependencyManagement\u0026gt; \u0026lt;dependencies\u0026gt; \u0026lt;!--官网里使用spring-boot-starter-parent作为父工程而没有导入这条依赖，实际作用相同--\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-boot-dependencies\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;${spring-boot-dependencies.version}\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.springframework.cloud\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-cloud-dependencies\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;${spring.cloud.version}\u0026lt;/version\u0026gt; \u0026lt;type\u0026gt;pom\u0026lt;/type\u0026gt; \u0026lt;scope\u0026gt;import\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;com.alibaba.cloud\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-cloud-alibaba-dependencies\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;${com.alibaba.cloud.spring-cloud-alibaba-dependencies.version}\u0026lt;/version\u0026gt; \u0026lt;type\u0026gt;pom\u0026lt;/type\u0026gt; \u0026lt;scope\u0026gt;import\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;/dependencies\u0026gt; \u0026lt;/dependencyManagement\u0026gt; \u0026lt;!--在module中添加以下依赖--\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;com.alibaba.cloud\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-cloud-starter-alibaba-nacos-discovery\u0026lt;/artifactId\u0026gt; \u0026lt;/dependency\u0026gt; 配置yaml spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 在主类上添加**@EnableDiscoveryClient**注解 激动的心，颤抖的手，点击运行！（提前启动好了Nacos） 2022-09-05 00:04:32.047 INFO 37828 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-09-05 00:04:32.047 INFO 37828 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56] 2022-09-05 00:04:32.109 INFO 37828 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2022-09-05 00:04:32.109 INFO 37828 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1320 ms 2022-09-05 00:04:32.504 WARN 37828 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;requestMappingHandlerAdapter\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method \u0026#39;requestMappingHandlerAdapter\u0026#39; threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;messageConverters\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.http.HttpMessageConverters]: Factory method \u0026#39;messageConverters\u0026#39; threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.class]: Unsatisfied dependency expressed through method \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;jacksonObjectMapper\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.fasterxml.jackson.databind.ObjectMapper] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] 2022-09-05 00:04:32.507 INFO 37828 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2022-09-05 00:04:32.523 INFO 37828 --- [ restartedMain] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with \u0026#39;debug\u0026#39; enabled. 2022-09-05 00:04:32.551 ERROR 37828 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;requestMappingHandlerAdapter\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method \u0026#39;requestMappingHandlerAdapter\u0026#39; threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;messageConverters\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.http.HttpMessageConverters]: Factory method \u0026#39;messageConverters\u0026#39; threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.class]: Unsatisfied dependency expressed through method \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;jacksonObjectMapper\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.fasterxml.jackson.databind.ObjectMapper] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.15.jar:5.3.15] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.15.jar:5.3.15] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.6.3.jar:2.6.3] at cn.imcaoxuan.FileManagerApplication.main(FileManagerApplication.java:11) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.6.3.jar:2.6.3] Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method \u0026#39;requestMappingHandlerAdapter\u0026#39; threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;messageConverters\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.http.HttpMessageConverters]: Factory method \u0026#39;messageConverters\u0026#39; threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.class]: Unsatisfied dependency expressed through method \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;jacksonObjectMapper\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.fasterxml.jackson.databind.ObjectMapper] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.15.jar:5.3.15] ... 24 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;messageConverters\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.http.HttpMessageConverters]: Factory method \u0026#39;messageConverters\u0026#39; threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.class]: Unsatisfied dependency expressed through method \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;jacksonObjectMapper\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.fasterxml.jackson.databind.ObjectMapper] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1389) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.getIfAvailable(DefaultListableBeanFactory.java:2030) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.ifAvailable(DefaultListableBeanFactory.java:2041) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.configureMessageConverters(WebMvcAutoConfiguration.java:232) ~[spring-boot-autoconfigure-2.6.3.jar:2.6.3] at org.springframework.web.servlet.config.annotation.WebMvcConfigurerComposite.configureMessageConverters(WebMvcConfigurerComposite.java:137) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration.configureMessageConverters(DelegatingWebMvcConfiguration.java:118) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.getMessageConverters(WebMvcConfigurationSupport.java:865) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.requestMappingHandlerAdapter(WebMvcConfigurationSupport.java:673) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.requestMappingHandlerAdapter(WebMvcAutoConfiguration.java:419) ~[spring-boot-autoconfigure-2.6.3.jar:2.6.3] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.15.jar:5.3.15] ... 25 common frames omitted Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.http.HttpMessageConverters]: Factory method \u0026#39;messageConverters\u0026#39; threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.class]: Unsatisfied dependency expressed through method \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;jacksonObjectMapper\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.fasterxml.jackson.databind.ObjectMapper] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.15.jar:5.3.15] ... 49 common frames omitted Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/http/JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.class]: Unsatisfied dependency expressed through method \u0026#39;mappingJackson2HttpMessageConverter\u0026#39; parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;jacksonObjectMapper\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.fasterxml.jackson.databind.ObjectMapper] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1614) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1571) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeans(DefaultListableBeanFactory.java:1415) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1347) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.resolveStream(DefaultListableBeanFactory.java:2117) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.orderedStream(DefaultListableBeanFactory.java:2111) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration.messageConverters(HttpMessageConvertersAutoConfiguration.java:70) ~[spring-boot-autoconfigure-2.6.3.jar:2.6.3] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.15.jar:5.3.15] ... 50 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name \u0026#39;jacksonObjectMapper\u0026#39; defined in class path resource [org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.fasterxml.jackson.databind.ObjectMapper] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:597) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1389) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.15.jar:5.3.15] ... 72 common frames omitted Caused by: java.lang.IllegalStateException: Failed to introspect Class [com.fasterxml.jackson.databind.ObjectMapper] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:481) ~[spring-core-5.3.15.jar:5.3.15] at org.springframework.util.ReflectionUtils.doWithLocalMethods(ReflectionUtils.java:321) ~[spring-core-5.3.15.jar:5.3.15] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.buildLifecycleMetadata(InitDestroyAnnotationBeanPostProcessor.java:232) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.findLifecycleMetadata(InitDestroyAnnotationBeanPostProcessor.java:210) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(InitDestroyAnnotationBeanPostProcessor.java:149) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(CommonAnnotationBeanPostProcessor.java:305) ~[spring-context-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:1116) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.3.15.jar:5.3.15] ... 82 common frames omitted Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/exc/StreamWriteException at java.base/java.lang.Class.getDeclaredMethods0(Native Method) ~[na:na] at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3167) ~[na:na] at java.base/java.lang.Class.getDeclaredMethods(Class.java:2310) ~[na:na] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:463) ~[spring-core-5.3.15.jar:5.3.15] ... 89 common frames omitted Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.exc.StreamWriteException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] ... 93 common frames omitted Disconnected from the target VM, address: \u0026#39;127.0.0.1:59002\u0026#39;, transport: \u0026#39;socket\u0026#39; Process finished with exit code 0 报错提示ClassNotFoundException，很明显，这种问题一般都是出现在缺少依赖的情况下的，但是jackson这个东西，我之前一直用的好好的啊！怎么突然就说找不到了呢？ 我在密密麻麻的POM文件中看了半天，也没发现什么问题。我也没做多大改动啊，怎么就跑不起来了呢？ 我想了下，问题会不会是依赖冲突导致的？ 我去看看External Libraries：\n卧槽，怎么会有两个jackson-core?版本还不一致！ 终于找到原因了！ 接下来，我修改了nacos的依赖：\n\u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;com.alibaba.cloud\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-cloud-starter-alibaba-nacos-discovery\u0026lt;/artifactId\u0026gt; \u0026lt;!--排除此依赖对jackson-core的依赖--\u0026gt; \u0026lt;exclusions\u0026gt; \u0026lt;exclusion\u0026gt; \u0026lt;groupId\u0026gt;com.fasterxml.jackson.core\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;jackson-core\u0026lt;/artifactId\u0026gt; \u0026lt;/exclusion\u0026gt; \u0026lt;/exclusions\u0026gt; \u0026lt;/dependency\u0026gt; 改完后External Libraries里就只剩下一个jackson-core-2.13.1了 刷新一下Maven，再次运行，终于Run起来了！\n2022-09-05 00:26:59.919 INFO 20320 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-09-05 00:26:59.919 INFO 20320 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56] 2022-09-05 00:26:59.980 INFO 20320 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2022-09-05 00:26:59.981 INFO 20320 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1282 ms 2022-09-05 00:27:01.624 INFO 20320 --- [ restartedMain] o.s.cloud.commons.util.InetUtils : Cannot determine local hostname 2022-09-05 00:27:01.911 INFO 20320 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2022-09-05 00:27:03.091 INFO 20320 --- [ restartedMain] o.s.cloud.commons.util.InetUtils : Cannot determine local hostname 2022-09-05 00:27:03.113 INFO 20320 --- [ restartedMain] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path \u0026#39;/actuator\u0026#39; 2022-09-05 00:27:03.404 INFO 20320 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8002 (http) with context path \u0026#39;\u0026#39; 2022-09-05 00:27:03.437 INFO 20320 --- [ restartedMain] c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP file-manager 192.168.133.1:8002 register finished 2022-09-05 00:27:04.212 INFO 20320 --- [ restartedMain] cn.imcaoxuan.FileManagerApplication : Started FileManagerApplication in 7.241 seconds (JVM running for 8.147) 2022-09-05 00:27:04.688 INFO 20320 --- [(1)-192.168.2.2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2022-09-05 00:27:04.841 INFO 20320 --- [(1)-192.168.2.2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2022-09-05 00:27:04.901 INFO 20320 --- [(3)-192.168.2.2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet \u0026#39;dispatcherServlet\u0026#39; 2022-09-05 00:27:04.901 INFO 20320 --- [(3)-192.168.2.2] o.s.web.servlet.DispatcherServlet : Initializing Servlet \u0026#39;dispatcherServlet\u0026#39; 2022-09-05 00:27:04.903 INFO 20320 --- [(3)-192.168.2.2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms ","permalink":"https://blog.imcaoxuan.cn/posts/2022-09-04-troubleshooting-spring-cloud-alibaba-2021-0-1-0/","summary":"\u003c!--markdown--\u003e我打算把**Spring Cloud Alibaba**升级个版本，看看有什么新特性，结果升级后死活启动不了。\n\u003chr\u003e\n\u003cp\u003e事情是这样的，跟往常一样，我先去\u003ca href=\"https://spring.io/\"\u003e\u003cem\u003eSpring官网\u003c/em\u003e\u003c/a\u003e找到\u003ca href=\"https://spring.io/projects/spring-cloud-alibaba#learn\"\u003e\u003cem\u003eSpring Cloud Alibaba\u003c/em\u003e\u003c/a\u003e的最新的版本号，如下图所示：\u003c/p\u003e\n\u003cp\u003e可以看到最新的版本是\u003cstrong\u003e2021.0.1.0\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"https://blog-images.imcaoxuan.cn/2026/10/23/1792754209.png\" loading=\"lazy\" src=\"https://blog-images.imcaoxuan.cn/2026/10/23/1792754209.png\"\u003e\u003c/p\u003e\n\u003cp\u003e我默默记下这个版本号\u0026hellip;\n然后点了右上角的那只\u003ca href=\"https://cn.bing.com/search?q=%E7%AB%A0%E9%B1%BC%E7%8C%AB\"\u003e\u003cstrong\u003e章鱼猫\u003c/strong\u003e\u003c/a\u003e\n在\u003cstrong\u003eWiki\u003c/strong\u003e里找到\u003cstrong\u003e版本说明\u003c/strong\u003e，如下图所示：\n现在我知道了Spring Cloud Alibaba Version、Spring Cloud Version和Spring Boot Version三者版本对应关系了！\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"https://blog-images.imcaoxuan.cn/2026/10/23/1792754187.png\" loading=\"lazy\" src=\"https://blog-images.imcaoxuan.cn/2026/10/23/1792754187.png\"\u003e\u003c/p\u003e\n\u003cp\u003e我再次回到\u003ca href=\"https://spring.io/projects/spring-cloud-alibaba#learn\"\u003eSpring官网\u003c/a\u003e，然后打开\u003ca href=\"https://spring-cloud-alibaba-group.github.io/github-pages/2021/en-us/index.html\"\u003eSpring Cloud Alibaba的Reference\u003c/a\u003e，根据文档，一顿操作。\n其实大概就只有三步：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e添加依赖\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u0026lt;!--在父工程添加以下依赖--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;properties\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e\u0026lt;spring.cloud.version\u0026gt;\u003c/span\u003e2021.0.1\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/spring.cloud.version\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e\u0026lt;spring-boot-dependencies.version\u0026gt;\u003c/span\u003e2.6.3\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/spring-boot-dependencies.version\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e\u0026lt;com.alibaba.cloud.spring-cloud-alibaba-dependencies.version\u0026gt;\u003c/span\u003e2021.0.1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e\u0026lt;/com.alibaba.cloud.spring-cloud-alibaba-dependencies.version\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/properties\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;dependencyManagement\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e\u0026lt;dependencies\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#75715e\"\u003e\u0026lt;!--官网里使用spring-boot-starter-parent作为父工程而没有导入这条依赖，实际作用相同--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e\u0026lt;dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;groupId\u0026gt;\u003c/span\u003eorg.springframework.boot\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/groupId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;artifactId\u0026gt;\u003c/span\u003espring-boot-dependencies\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/artifactId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;version\u0026gt;\u003c/span\u003e${spring-boot-dependencies.version}\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/version\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e\u0026lt;/dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e\u0026lt;dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;groupId\u0026gt;\u003c/span\u003eorg.springframework.cloud\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/groupId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;artifactId\u0026gt;\u003c/span\u003espring-cloud-dependencies\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/artifactId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;version\u0026gt;\u003c/span\u003e${spring.cloud.version}\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/version\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;type\u0026gt;\u003c/span\u003epom\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/type\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;scope\u0026gt;\u003c/span\u003eimport\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/scope\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e\u0026lt;/dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e\u0026lt;dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;groupId\u0026gt;\u003c/span\u003ecom.alibaba.cloud\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/groupId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;artifactId\u0026gt;\u003c/span\u003espring-cloud-alibaba-dependencies\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/artifactId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;version\u0026gt;\u003c/span\u003e${com.alibaba.cloud.spring-cloud-alibaba-dependencies.version}\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/version\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;type\u0026gt;\u003c/span\u003epom\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/type\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e\u0026lt;scope\u0026gt;\u003c/span\u003eimport\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/scope\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e\u0026lt;/dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e\u0026lt;/dependencies\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/dependencyManagement\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u0026lt;!--在module中添加以下依赖--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e\u0026lt;groupId\u0026gt;\u003c/span\u003ecom.alibaba.cloud\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/groupId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e\u0026lt;artifactId\u0026gt;\u003c/span\u003espring-cloud-starter-alibaba-nacos-discovery\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/artifactId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e配置yaml\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003espring\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003ecloud\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003enacos\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003ediscovery\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003eserver-addr\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e127.0.0.1\u003c/span\u003e:\u003cspan style=\"color:#ae81ff\"\u003e8848\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e在主类上添加**@EnableDiscoveryClient**注解\n激动的心，颤抖的手，点击运行！（提前启动好了\u003cem\u003eNacos\u003c/em\u003e）\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2022\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e09\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e05 00:04:32.\u003cspan style=\"color:#a6e22e\"\u003e047\u003c/span\u003e  INFO 37828 \u003cspan style=\"color:#f92672\"\u003e---\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e  restartedMain\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e o.\u003cspan style=\"color:#a6e22e\"\u003eapache\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecatalina\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecore\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eStandardService\u003c/span\u003e   : Starting service \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eTomcat\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2022\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e09\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e05 00:04:32.\u003cspan style=\"color:#a6e22e\"\u003e047\u003c/span\u003e  INFO 37828 \u003cspan style=\"color:#f92672\"\u003e---\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e  restartedMain\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e org.\u003cspan style=\"color:#a6e22e\"\u003eapache\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecatalina\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecore\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eStandardEngine\u003c/span\u003e  : Starting Servlet engine: \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eApache Tomcat\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e9.\u003cspan style=\"color:#a6e22e\"\u003e0\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e56\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2022\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e09\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e05 00:04:32.\u003cspan style=\"color:#a6e22e\"\u003e109\u003c/span\u003e  INFO 37828 \u003cspan style=\"color:#f92672\"\u003e---\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e  restartedMain\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e o.\u003cspan style=\"color:#a6e22e\"\u003ea\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ec\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ec\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eC\u003c/span\u003e.\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eTomcat\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e.\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003elocalhost\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e.\u003cspan style=\"color:#f92672\"\u003e[/]\u003c/span\u003e       : Initializing Spring embedded WebApplicationContext\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2022\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e09\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e05 00:04:32.\u003cspan style=\"color:#a6e22e\"\u003e109\u003c/span\u003e  INFO 37828 \u003cspan style=\"color:#f92672\"\u003e---\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e  restartedMain\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e w.\u003cspan style=\"color:#a6e22e\"\u003es\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ec\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eServletWebServerApplicationContext\u003c/span\u003e : Root WebApplicationContext: initialization completed in 1320 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2022\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e09\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e05 00:04:32.\u003cspan style=\"color:#a6e22e\"\u003e504\u003c/span\u003e  WARN 37828 \u003cspan style=\"color:#f92672\"\u003e---\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e  restartedMain\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e ConfigServletWebServerApplicationContext : Exception encountered during context initialization \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e cancelling refresh attempt: org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003erequestMappingHandlerAdapter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eweb\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eservlet\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eWebMvcAutoConfiguration$EnableWebMvcConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Bean instantiation via factory method failed; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanInstantiationException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e instantiate \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emvc\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emethod\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eRequestMappingHandlerAdapter\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Factory method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003erequestMappingHandlerAdapter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e threw exception; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emessageConverters\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eHttpMessageConvertersAutoConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Bean instantiation via factory method failed; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanInstantiationException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e instantiate \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eautoconfigure\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ehttp\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eHttpMessageConverters\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Factory method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emessageConverters\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e threw exception; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eUnsatisfiedDependencyException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Unsatisfied dependency expressed through method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e parameter 0; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003ejacksonObjectMapper\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejackson\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonAutoConfiguration$JacksonObjectMapperConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Post\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eprocessing of merged bean definition failed; nested exception is java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eIllegalStateException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e introspect Class \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ecom.\u003cspan style=\"color:#a6e22e\"\u003efasterxml\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejackson\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edatabind\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eObjectMapper\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e from ClassLoader \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoaders$AppClassLoader\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e@2437c6dc\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2022\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e09\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e05 00:04:32.\u003cspan style=\"color:#a6e22e\"\u003e507\u003c/span\u003e  INFO 37828 \u003cspan style=\"color:#f92672\"\u003e---\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e  restartedMain\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e o.\u003cspan style=\"color:#a6e22e\"\u003eapache\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecatalina\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecore\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eStandardService\u003c/span\u003e   : Stopping service \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eTomcat\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2022\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e09\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e05 00:04:32.\u003cspan style=\"color:#a6e22e\"\u003e523\u003c/span\u003e  INFO 37828 \u003cspan style=\"color:#f92672\"\u003e---\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e  restartedMain\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e ConditionEvaluationReportLoggingListener : \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eError starting ApplicationContext. To display the conditions report re\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003erun your application \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003edebug\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e enabled.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2022\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e09\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e05 00:04:32.\u003cspan style=\"color:#a6e22e\"\u003e551\u003c/span\u003e ERROR 37828 \u003cspan style=\"color:#f92672\"\u003e---\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e  restartedMain\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e o.\u003cspan style=\"color:#a6e22e\"\u003es\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSpringApplication\u003c/span\u003e               : Application run failed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eorg.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003erequestMappingHandlerAdapter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eweb\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eservlet\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eWebMvcAutoConfiguration$EnableWebMvcConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Bean instantiation via factory method failed; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanInstantiationException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e instantiate \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emvc\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emethod\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eRequestMappingHandlerAdapter\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Factory method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003erequestMappingHandlerAdapter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e threw exception; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emessageConverters\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eHttpMessageConvertersAutoConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Bean instantiation via factory method failed; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanInstantiationException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e instantiate \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eautoconfigure\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ehttp\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eHttpMessageConverters\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Factory method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emessageConverters\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e threw exception; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eUnsatisfiedDependencyException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Unsatisfied dependency expressed through method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e parameter 0; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003ejacksonObjectMapper\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejackson\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonAutoConfiguration$JacksonObjectMapperConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Post\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eprocessing of merged bean definition failed; nested exception is java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eIllegalStateException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e introspect Class \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ecom.\u003cspan style=\"color:#a6e22e\"\u003efasterxml\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejackson\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edatabind\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eObjectMapper\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e from ClassLoader \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoaders$AppClassLoader\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e@2437c6dc\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiate\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:658) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiateUsingFactoryMethod\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:638) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiateUsingFactoryMethod\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1352) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecreateBeanInstance\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1195) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoCreateBean\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:582) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecreateBean\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:542) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elambda$doGetBean$0\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:335) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultSingletonBeanRegistry\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetSingleton\u003c/span\u003e(DefaultSingletonBeanRegistry.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:234) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoGetBean\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:333) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetBean\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:208) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003epreInstantiateSingletons\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:953) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econtext\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractApplicationContext\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efinishBeanFactoryInitialization\u003c/span\u003e(AbstractApplicationContext.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:918) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003econtext\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econtext\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractApplicationContext\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erefresh\u003c/span\u003e(AbstractApplicationContext.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:583) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003econtext\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econtext\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eServletWebServerApplicationContext\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erefresh\u003c/span\u003e(ServletWebServerApplicationContext.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:145) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSpringApplication\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erefresh\u003c/span\u003e(SpringApplication.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:732) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSpringApplication\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erefreshContext\u003c/span\u003e(SpringApplication.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:414) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSpringApplication\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erun\u003c/span\u003e(SpringApplication.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:302) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSpringApplication\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erun\u003c/span\u003e(SpringApplication.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1303) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSpringApplication\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erun\u003c/span\u003e(SpringApplication.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1292) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat cn.\u003cspan style=\"color:#a6e22e\"\u003eimcaoxuan\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eFileManagerApplication\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e(FileManagerApplication.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:11) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003eclasses\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eNativeMethodAccessorImpl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke0\u003c/span\u003e(Native Method) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eNativeMethodAccessorImpl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke\u003c/span\u003e(NativeMethodAccessorImpl.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:62) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDelegatingMethodAccessorImpl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke\u003c/span\u003e(DelegatingMethodAccessorImpl.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:43) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejava.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eMethod\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke\u003c/span\u003e(Method.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:566) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edevtools\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erestart\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eRestartLauncher\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erun\u003c/span\u003e(RestartLauncher.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:49) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003edevtools\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCaused by: org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanInstantiationException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e instantiate \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emvc\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emethod\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eRequestMappingHandlerAdapter\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Factory method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003erequestMappingHandlerAdapter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e threw exception; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emessageConverters\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eHttpMessageConvertersAutoConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Bean instantiation via factory method failed; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanInstantiationException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e instantiate \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eautoconfigure\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ehttp\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eHttpMessageConverters\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Factory method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emessageConverters\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e threw exception; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eUnsatisfiedDependencyException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Unsatisfied dependency expressed through method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e parameter 0; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003ejacksonObjectMapper\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejackson\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonAutoConfiguration$JacksonObjectMapperConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Post\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eprocessing of merged bean definition failed; nested exception is java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eIllegalStateException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e introspect Class \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ecom.\u003cspan style=\"color:#a6e22e\"\u003efasterxml\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejackson\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edatabind\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eObjectMapper\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e from ClassLoader \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoaders$AppClassLoader\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e@2437c6dc\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSimpleInstantiationStrategy\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiate\u003c/span\u003e(SimpleInstantiationStrategy.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:185) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiate\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:653) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t... 24 common frames omitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCaused by: org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emessageConverters\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eHttpMessageConvertersAutoConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Bean instantiation via factory method failed; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanInstantiationException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e instantiate \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eautoconfigure\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ehttp\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eHttpMessageConverters\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Factory method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emessageConverters\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e threw exception; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eUnsatisfiedDependencyException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Unsatisfied dependency expressed through method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e parameter 0; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003ejacksonObjectMapper\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejackson\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonAutoConfiguration$JacksonObjectMapperConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Post\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eprocessing of merged bean definition failed; nested exception is java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eIllegalStateException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e introspect Class \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ecom.\u003cspan style=\"color:#a6e22e\"\u003efasterxml\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejackson\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edatabind\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eObjectMapper\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e from ClassLoader \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoaders$AppClassLoader\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e@2437c6dc\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiate\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:658) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiateUsingFactoryMethod\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:638) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiateUsingFactoryMethod\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1352) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecreateBeanInstance\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1195) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoCreateBean\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:582) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecreateBean\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:542) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elambda$doGetBean$0\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:335) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultSingletonBeanRegistry\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetSingleton\u003c/span\u003e(DefaultSingletonBeanRegistry.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:234) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoGetBean\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:333) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetBean\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:208) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfig\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDependencyDescriptor\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eresolveCandidate\u003c/span\u003e(DependencyDescriptor.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:276) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoResolveDependency\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1389) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory$DependencyObjectProvider\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetIfAvailable\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:2030) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory$DependencyObjectProvider\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eifAvailable\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:2041) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eautoconfigure\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eWebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfigureMessageConverters\u003c/span\u003e(WebMvcAutoConfiguration.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:232) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfig\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eWebMvcConfigurerComposite\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfigureMessageConverters\u003c/span\u003e(WebMvcConfigurerComposite.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:137) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ewebmvc\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfig\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDelegatingWebMvcConfiguration\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfigureMessageConverters\u003c/span\u003e(DelegatingWebMvcConfiguration.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:118) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ewebmvc\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfig\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eWebMvcConfigurationSupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetMessageConverters\u003c/span\u003e(WebMvcConfigurationSupport.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:865) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ewebmvc\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfig\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eWebMvcConfigurationSupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erequestMappingHandlerAdapter\u003c/span\u003e(WebMvcConfigurationSupport.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:673) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ewebmvc\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eautoconfigure\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eweb\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eservlet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eWebMvcAutoConfiguration$EnableWebMvcConfiguration\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003erequestMappingHandlerAdapter\u003c/span\u003e(WebMvcAutoConfiguration.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:419) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eNativeMethodAccessorImpl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke0\u003c/span\u003e(Native Method) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eNativeMethodAccessorImpl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke\u003c/span\u003e(NativeMethodAccessorImpl.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:62) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDelegatingMethodAccessorImpl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke\u003c/span\u003e(DelegatingMethodAccessorImpl.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:43) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejava.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eMethod\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke\u003c/span\u003e(Method.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:566) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSimpleInstantiationStrategy\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiate\u003c/span\u003e(SimpleInstantiationStrategy.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:154) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t... 25 common frames omitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCaused by: org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanInstantiationException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e instantiate \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eautoconfigure\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ehttp\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eHttpMessageConverters\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Factory method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emessageConverters\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e threw exception; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eUnsatisfiedDependencyException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Unsatisfied dependency expressed through method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e parameter 0; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003ejacksonObjectMapper\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejackson\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonAutoConfiguration$JacksonObjectMapperConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Post\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eprocessing of merged bean definition failed; nested exception is java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eIllegalStateException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e introspect Class \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ecom.\u003cspan style=\"color:#a6e22e\"\u003efasterxml\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejackson\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edatabind\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eObjectMapper\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e from ClassLoader \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoaders$AppClassLoader\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e@2437c6dc\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSimpleInstantiationStrategy\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiate\u003c/span\u003e(SimpleInstantiationStrategy.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:185) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiate\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:653) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t... 49 common frames omitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCaused by: org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eUnsatisfiedDependencyException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ehttp\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Unsatisfied dependency expressed through method \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003emappingJackson2HttpMessageConverter\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e parameter 0; nested exception is org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003ejacksonObjectMapper\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejackson\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonAutoConfiguration$JacksonObjectMapperConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Post\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eprocessing of merged bean definition failed; nested exception is java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eIllegalStateException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e introspect Class \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ecom.\u003cspan style=\"color:#a6e22e\"\u003efasterxml\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejackson\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edatabind\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eObjectMapper\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e from ClassLoader \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoaders$AppClassLoader\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e@2437c6dc\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecreateArgumentArray\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:800) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiateUsingFactoryMethod\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:541) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiateUsingFactoryMethod\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1352) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecreateBeanInstance\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1195) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoCreateBean\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:582) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecreateBean\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:542) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elambda$doGetBean$0\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:335) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultSingletonBeanRegistry\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetSingleton\u003c/span\u003e(DefaultSingletonBeanRegistry.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:234) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoGetBean\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:333) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetBean\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:208) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfig\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDependencyDescriptor\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eresolveCandidate\u003c/span\u003e(DependencyDescriptor.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:276) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eaddCandidateEntry\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1614) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efindAutowireCandidates\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1571) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eresolveMultipleBeans\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1415) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoResolveDependency\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1347) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory$DependencyObjectProvider\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eresolveStream\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:2117) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory$DependencyObjectProvider\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eorderedStream\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:2111) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eboot\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eautoconfigure\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ehttp\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eHttpMessageConvertersAutoConfiguration\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emessageConverters\u003c/span\u003e(HttpMessageConvertersAutoConfiguration.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:70) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:2.\u003cspan style=\"color:#a6e22e\"\u003e6\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eNativeMethodAccessorImpl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke0\u003c/span\u003e(Native Method) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eNativeMethodAccessorImpl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke\u003c/span\u003e(NativeMethodAccessorImpl.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:62) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDelegatingMethodAccessorImpl\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke\u003c/span\u003e(DelegatingMethodAccessorImpl.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:43) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejava.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereflect\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eMethod\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einvoke\u003c/span\u003e(Method.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:566) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eSimpleInstantiationStrategy\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003einstantiate\u003c/span\u003e(SimpleInstantiationStrategy.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:154) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t... 50 common frames omitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCaused by: org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBeanCreationException\u003c/span\u003e: Error creating bean \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e name \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003ejacksonObjectMapper\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e defined in \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003epath\u003c/span\u003e resource \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eorg\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003espringframework\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eboot\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eautoconfigure\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejackson\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eJacksonAutoConfiguration$JacksonObjectMapperConfiguration.\u003cspan style=\"color:#a6e22e\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e: Post\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003eprocessing of merged bean definition failed; nested exception is java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eIllegalStateException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e introspect Class \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ecom.\u003cspan style=\"color:#a6e22e\"\u003efasterxml\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejackson\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edatabind\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eObjectMapper\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e from ClassLoader \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoaders$AppClassLoader\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e@2437c6dc\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoCreateBean\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:597) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecreateBean\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:542) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elambda$doGetBean$0\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:335) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultSingletonBeanRegistry\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetSingleton\u003c/span\u003e(DefaultSingletonBeanRegistry.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:234) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoGetBean\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:333) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetBean\u003c/span\u003e(AbstractBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:208) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econfig\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDependencyDescriptor\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eresolveCandidate\u003c/span\u003e(DependencyDescriptor.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:276) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoResolveDependency\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1389) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eDefaultListableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eresolveDependency\u003c/span\u003e(DefaultListableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1309) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eresolveAutowiredArgument\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:887) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eConstructorResolver\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecreateArgumentArray\u003c/span\u003e(ConstructorResolver.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:791) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t... 72 common frames omitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCaused by: java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eIllegalStateException\u003c/span\u003e: Failed \u003cspan style=\"color:#66d9ef\"\u003eto\u003c/span\u003e introspect Class \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ecom.\u003cspan style=\"color:#a6e22e\"\u003efasterxml\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejackson\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edatabind\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eObjectMapper\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e from ClassLoader \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoaders$AppClassLoader\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e@2437c6dc\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eutil\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eReflectionUtils\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetDeclaredMethods\u003c/span\u003e(ReflectionUtils.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:481) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ecore\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eutil\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eReflectionUtils\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoWithLocalMethods\u003c/span\u003e(ReflectionUtils.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:321) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ecore\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eInitDestroyAnnotationBeanPostProcessor\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebuildLifecycleMetadata\u003c/span\u003e(InitDestroyAnnotationBeanPostProcessor.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:232) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eInitDestroyAnnotationBeanPostProcessor\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efindLifecycleMetadata\u003c/span\u003e(InitDestroyAnnotationBeanPostProcessor.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:210) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eInitDestroyAnnotationBeanPostProcessor\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003epostProcessMergedBeanDefinition\u003c/span\u003e(InitDestroyAnnotationBeanPostProcessor.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:149) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003econtext\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eannotation\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eCommonAnnotationBeanPostProcessor\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003epostProcessMergedBeanDefinition\u003c/span\u003e(CommonAnnotationBeanPostProcessor.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:305) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003econtext\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eapplyMergedBeanDefinitionPostProcessors\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:1116) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebeans\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003esupport\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eAbstractAutowireCapableBeanFactory\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edoCreateBean\u003c/span\u003e(AbstractAutowireCapableBeanFactory.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:594) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ebeans\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t... 82 common frames omitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCaused by: java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eNoClassDefFoundError\u003c/span\u003e: com\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003efasterxml\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejackson\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ecore\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eexc\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003eStreamWriteException\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejava.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClass\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetDeclaredMethods0\u003c/span\u003e(Native Method) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejava.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClass\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eprivateGetDeclaredMethods\u003c/span\u003e(Class.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:3167) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejava.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClass\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetDeclaredMethods\u003c/span\u003e(Class.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:2310) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat org.\u003cspan style=\"color:#a6e22e\"\u003espringframework\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eutil\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eReflectionUtils\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetDeclaredMethods\u003c/span\u003e(ReflectionUtils.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:463) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003espring\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ecore\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejar\u003c/span\u003e:5.\u003cspan style=\"color:#a6e22e\"\u003e3\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t... 89 common frames omitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCaused by: java.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassNotFoundException\u003c/span\u003e: com.\u003cspan style=\"color:#a6e22e\"\u003efasterxml\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ejackson\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecore\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eexc\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eStreamWriteException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eBuiltinClassLoader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloadClass\u003c/span\u003e(BuiltinClassLoader.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:582) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejdk.\u003cspan style=\"color:#a6e22e\"\u003einternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoaders$AppClassLoader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloadClass\u003c/span\u003e(ClassLoaders.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:178) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tat java.\u003cspan style=\"color:#a6e22e\"\u003ebase\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ejava.\u003cspan style=\"color:#a6e22e\"\u003elang\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eClassLoader\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eloadClass\u003c/span\u003e(ClassLoader.\u003cspan style=\"color:#a6e22e\"\u003ejava\u003c/span\u003e:521) \u003cspan style=\"color:#f92672\"\u003e~[\u003c/span\u003ena:na\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t... 93 common frames omitted\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDisconnected from the target VM, address: \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e127.\u003cspan style=\"color:#a6e22e\"\u003e0\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e0\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003e1\u003c/span\u003e:59002\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e, transport: \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003esocket\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eProcess finished \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e exit code 0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e报错提示\u003cstrong\u003eClassNotFoundException\u003c/strong\u003e，很明显，这种问题一般都是出现在缺少依赖的情况下的，但是\u003cstrong\u003ejackson\u003c/strong\u003e这个东西，我之前一直用的好好的啊！怎么突然就说找不到了呢？\n我在密密麻麻的POM文件中看了半天，也没发现什么问题。我也没做多大改动啊，怎么就跑不起来了呢？\n我想了下，问题会不会是依赖冲突导致的？\n我去看看\u003cstrong\u003eExternal Libraries\u003c/strong\u003e：\u003c/p\u003e","title":"Spring Cloud Alibaba 2021.0.1.0 踩坑记录"},{"content":"Gradle 添加私有仓库 以Android Studio为例 在build.gradle(Project)中添加maven{\u0026hellip;}，如下所示：\nbuildscript { repositories { maven { url \u0026#34;https://maven.imcaoxuan.cn:8443/repository/public/\u0026#34; credentials { username = \u0026#39;public\u0026#39; password = \u0026#39;public\u0026#39; } } google() mavenCentral() } dependencies { classpath \u0026#39;com.android.tools.build:gradle:7.0.4\u0026#39; // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } 在settings.gradle(Project)中添加maven{\u0026hellip;}，如下所示：\ndependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { maven { url \u0026#34;https://maven.imcaoxuan.cn:8443/repository/public/\u0026#34; credentials { username = \u0026#39;public\u0026#39; password = \u0026#39;public\u0026#39; } } google() mavenCentral() jcenter() // Warning: this repository is going to shut down soon } } 3.Sync now!\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-08-25-configure-a-private-nexus-repository-for-gradle/","summary":"\u003ch1 id=\"gradle-添加私有仓库\"\u003eGradle 添加私有仓库\u003c/h1\u003e\n\u003ch2 id=\"以android-studio为例\"\u003e以Android Studio为例\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e在\u003ccode\u003ebuild.gradle\u003c/code\u003e(Project)中添加maven{\u0026hellip;}，如下所示：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-groovy\" data-lang=\"groovy\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebuildscript \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    repositories \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        maven \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            url \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;https://maven.imcaoxuan.cn:8443/repository/public/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            credentials \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                username \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;public\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                password \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;public\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        google\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        mavenCentral\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    dependencies \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        classpath \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;com.android.tools.build:gradle:7.0.4\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// NOTE: Do not place your application dependencies here; they belong\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// in the individual module build.gradle files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e在\u003ccode\u003esettings.gradle\u003c/code\u003e(Project)中添加maven{\u0026hellip;}，如下所示：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-groovy\" data-lang=\"groovy\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edependencyResolutionManagement \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    repositoriesMode\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eset\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003eRepositoriesMode\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eFAIL_ON_PROJECT_REPOS\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    repositories \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        maven \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            url \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;https://maven.imcaoxuan.cn:8443/repository/public/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            credentials \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                username \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;public\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                password \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;public\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        google\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        mavenCentral\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        jcenter\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e// Warning: this repository is going to shut down soon\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e3.Sync now!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"Gradle 添加私有仓库"},{"content":"# Gradle 添加私有仓库 以Android Studio为例 在build.gradle(Project)中添加maven{\u0026hellip;}，如下所示：\nbuildscript { repositories { maven { url \u0026#34;https://maven.imcaoxuan.cn:8443/repository/public/\u0026#34; credentials { username = \u0026#39;public\u0026#39; password = \u0026#39;public\u0026#39; } } google() mavenCentral() } dependencies { classpath \u0026#39;com.android.tools.build:gradle:7.0.4\u0026#39; // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } 在settings.gradle(Project)中添加maven{\u0026hellip;}，如下所示：\ndependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { maven { url \u0026#34;https://maven.imcaoxuan.cn:8443/repository/public/\u0026#34; credentials { username = \u0026#39;public\u0026#39; password = \u0026#39;public\u0026#39; } } google() mavenCentral() jcenter() // Warning: this repository is going to shut down soon } } 3.Sync now!\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-08-25-add-a-private-maven-repository-to-gradle/","summary":"\u003c!--markdown--\u003e# Gradle 添加私有仓库\n\u003ch2 id=\"以android-studio为例\"\u003e以Android Studio为例\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e在\u003ccode\u003ebuild.gradle\u003c/code\u003e(Project)中添加maven{\u0026hellip;}，如下所示：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-groovy\" data-lang=\"groovy\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebuildscript \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    repositories \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        maven \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            url \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;https://maven.imcaoxuan.cn:8443/repository/public/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            credentials \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                username \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;public\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                password \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;public\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        google\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        mavenCentral\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    dependencies \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        classpath \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;com.android.tools.build:gradle:7.0.4\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// NOTE: Do not place your application dependencies here; they belong\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// in the individual module build.gradle files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e在\u003ccode\u003esettings.gradle\u003c/code\u003e(Project)中添加maven{\u0026hellip;}，如下所示：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-groovy\" data-lang=\"groovy\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edependencyResolutionManagement \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    repositoriesMode\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eset\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003eRepositoriesMode\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eFAIL_ON_PROJECT_REPOS\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    repositories \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        maven \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            url \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;https://maven.imcaoxuan.cn:8443/repository/public/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            credentials \u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                username \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;public\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                password \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;public\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        google\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        mavenCentral\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        jcenter\u003cspan style=\"color:#f92672\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e// Warning: this repository is going to shut down soon\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e3.Sync now!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"Gradle 添加私有仓库"},{"content":"[https://blog.csdn.net/chenxijie1985/article/details/107759826][1] 在windows下add代码时一直提示：warning: LF will be replaced by CRLF in，虽然没多大影响，但是看得不爽。\n解决办法：\ngit config \u0026ndash;global core.autocrlf false\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-08-21-fix-git-lf-will-be-replaced-by-crlf-warnings/","summary":"\u003c!--markdown--\u003e[https://blog.csdn.net/chenxijie1985/article/details/107759826][1]\n\u003cp\u003e在windows下add代码时一直提示：warning: LF will be replaced by CRLF in，虽然没多大影响，但是看得不爽。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e解决办法：\u003c/p\u003e\n\u003cp\u003egit config \u0026ndash;global core.autocrlf false\u003c/p\u003e\n\u003c/blockquote\u003e","title":"转发：解决warning: LF will be replaced by CRLF in方法"},{"content":"转发：https://www.jianshu.com/p/3e6d5da2db81 # 列出所有磁盘信息 $ sudo fdisk -l # 建立分区 $ sudo fdisk /dev/sdb # 然后依次输入 $ n (新建分区表) $ p (主分区，然后根据提示操作) $ w (保存分区信息) $ sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store \u0026#39;/boot\u0026#39; on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 mdadm: size set to 20953088K Continue creating array? y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. ","permalink":"https://blog.imcaoxuan.cn/posts/2022-07-24-create-a-raid1-array-on-ubuntu/","summary":"\u003c!--markdown--\u003e转发：https://www.jianshu.com/p/3e6d5da2db81\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 列出所有磁盘信息\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo fdisk -l \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 建立分区\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo fdisk /dev/sdb\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 然后依次输入\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ n \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e新建分区表\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ p \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e主分区，然后根据提示操作\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ w \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e保存分区信息\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo mdadm --create  --verbose /dev/md0 --level\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e --raid-devices\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e /dev/sdb1 /dev/sdc1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emdadm: Note: this array has metadata at the start and\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    may not be suitable as a boot device.  If you plan to\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    store \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;/boot\u0026#39;\u003c/span\u003e on this device please ensure that\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    your boot-loader understands md/v1.x metadata, or use\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    --metadata\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e0.90\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emdadm: size set to 20953088K\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eContinue creating array? y\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emdadm: Defaulting to version 1.2 metadata\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emdadm: array /dev/md0 started.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"转发：Ubuntu 创建 RAID1 阵列"},{"content":"# JAVA_HOME #JAVA_HOME export JAVA_HOME=/opt/jdk1.8.0_201 export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH ","permalink":"https://blog.imcaoxuan.cn/posts/2022-07-17-java-home/","summary":"\u003c!--markdown--\u003e# JAVA_HOME\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#JAVA_HOME\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexport JAVA_HOME\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e/opt/jdk1.8.0_201\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexport CLASSPATH\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e.:\u003cspan style=\"color:#e6db74\"\u003e${\u003c/span\u003eJAVA_HOME\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e/lib:\u003cspan style=\"color:#e6db74\"\u003e${\u003c/span\u003eJRE_HOME\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e/lib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexport PATH\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e${\u003c/span\u003eJAVA_HOME\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e/bin:$PATH\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"JAVA_HOME"},{"content":"# 定时任务 example:\n*/1 * * * * /home/admin/traffic.sh echo \u0026gt; /home/admin/log/traffic.log ","permalink":"https://blog.imcaoxuan.cn/posts/2022-07-17-schedule-tasks-with-cron/","summary":"\u003c!--markdown--\u003e# 定时任务\n\u003cp\u003eexample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e*/1 * * * *  /home/admin/traffic.sh echo \u0026gt; /home/admin/log/traffic.log\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"定时任务"},{"content":"# Ubuntu修改代理 vim /etc/apt/apt.conf.d/90curtin-aptproxy 然后\u0026hellip;\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-07-17-configure-an-apt-proxy-on-ubuntu/","summary":"\u003c!--markdown--\u003e# Ubuntu修改代理\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim /etc/apt/apt.conf.d/90curtin-aptproxy\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后\u0026hellip;\u003c/p\u003e","title":"Ubuntu修改代理"},{"content":"代码引用：org.apache.commons.codec.binary.Base32, org.apache.commons.codec.binary.Hex, TOTP(Johan Rydell, PortWise, Inc) import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.lang.reflect.UndeclaredThrowableException; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; import java.util.Arrays; public class TotpDemo { private static final int[] DIGITS_POWER // 0 1 2 3 4 5 6 7 8 = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000}; public static void main(String[] args) { // todo String secretKey = \u0026#34;\u0026#34;; Base32 base32 = new Base32(); byte[] bytes = base32.decode(secretKey.toUpperCase()); // [-84, -88, -126, -19, 116, -72, -61, -58, 117, 53] String hexKey = Hex.encodeHexString(bytes); String hexTime = Long.toHexString(System.currentTimeMillis() / 30 / 1000); System.out.println(generateTOTP(hexKey, hexTime, \u0026#34;6\u0026#34;)); } static class Hex { public static String encodeHexString(final byte[] data) { return new String(encodeHex(data)); } public static char[] encodeHex(final byte[] data) { return encodeHex(data, true); } public static char[] encodeHex(final byte[] data, final boolean toLowerCase) { return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); } protected static char[] encodeHex(final byte[] data, final char[] toDigits) { final int l = data.length; final char[] out = new char[l \u0026lt;\u0026lt; 1]; // two characters form the hex value. for (int i = 0, j = 0; i \u0026lt; l; i++) { out[j++] = toDigits[(0xF0 \u0026amp; data[i]) \u0026gt;\u0026gt;\u0026gt; 4]; out[j++] = toDigits[0x0F \u0026amp; data[i]]; } return out; } private static final char[] DIGITS_LOWER = {\u0026#39;0\u0026#39;, \u0026#39;1\u0026#39;, \u0026#39;2\u0026#39;, \u0026#39;3\u0026#39;, \u0026#39;4\u0026#39;, \u0026#39;5\u0026#39;, \u0026#39;6\u0026#39;, \u0026#39;7\u0026#39;, \u0026#39;8\u0026#39;, \u0026#39;9\u0026#39;, \u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;d\u0026#39;, \u0026#39;e\u0026#39;, \u0026#39;f\u0026#39;}; /** * Used to build output as Hex */ private static final char[] DIGITS_UPPER = {\u0026#39;0\u0026#39;, \u0026#39;1\u0026#39;, \u0026#39;2\u0026#39;, \u0026#39;3\u0026#39;, \u0026#39;4\u0026#39;, \u0026#39;5\u0026#39;, \u0026#39;6\u0026#39;, \u0026#39;7\u0026#39;, \u0026#39;8\u0026#39;, \u0026#39;9\u0026#39;, \u0026#39;A\u0026#39;, \u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;D\u0026#39;, \u0026#39;E\u0026#39;, \u0026#39;F\u0026#39;}; } public static String generateTOTP(String key, String time, String returnDigits) { return generateTOTP(key, time, returnDigits, \u0026#34;HmacSHA1\u0026#34;); } private static byte[] hmac_sha1(String crypto, byte[] keyBytes, byte[] text) { try { Mac hmac; hmac = Mac.getInstance(crypto); SecretKeySpec macKey = new SecretKeySpec(keyBytes, \u0026#34;RAW\u0026#34;); hmac.init(macKey); return hmac.doFinal(text); } catch (GeneralSecurityException gse) { throw new UndeclaredThrowableException(gse); } } private static byte[] hexStr2Bytes(String hex) { // Adding one byte to get the right conversion // values starting with \u0026#34;0\u0026#34; can be converted byte[] bArray = new BigInteger(\u0026#34;10\u0026#34; + hex, 16).toByteArray(); // Copy all the REAL bytes, not the \u0026#34;first\u0026#34; byte[] ret = new byte[bArray.length - 1]; for (int i = 0; i \u0026lt; ret.length; i++) ret[i] = bArray[i + 1]; return ret; } private static String generateTOTP(String key, String time, String returnDigits, String crypto) { int codeDigits = Integer.decode(returnDigits).intValue(); String result; byte[] hash; // Using the counter // First 8 bytes are for the movingFactor // Complaint with base RFC 4226 (HOTP) while (time.length() \u0026lt; 16) time = \u0026#34;0\u0026#34; + time; // Get the HEX in a Byte[] byte[] msg = hexStr2Bytes(time); // Adding one byte to get the right conversion byte[] k = hexStr2Bytes(key); hash = hmac_sha1(crypto, k, msg); // put selected bytes into result int int offset = hash[hash.length - 1] \u0026amp; 0xf; int binary = ((hash[offset] \u0026amp; 0x7f) \u0026lt;\u0026lt; 24) | ((hash[offset + 1] \u0026amp; 0xff) \u0026lt;\u0026lt; 16) | ((hash[offset + 2] \u0026amp; 0xff) \u0026lt;\u0026lt; 8) | (hash[offset + 3] \u0026amp; 0xff); int otp = binary % DIGITS_POWER[codeDigits]; result = Integer.toString(otp); while (result.length() \u0026lt; codeDigits) { result = \u0026#34;0\u0026#34; + result; } return result; } static abstract class BaseNCodec { static final int EOF = -1; protected final byte pad; protected static final int MASK_8BITS = 0xff; protected static final byte PAD_DEFAULT = \u0026#39;=\u0026#39;; // Allow static access to default private final int unencodedBlockSize; /** * Number of bytes in each full block of encoded data, e.g. 3 for Base64 and 8 for Base32 */ private final int encodedBlockSize; protected final int lineLength; /** * Size of chunk separator. Not used unless {@link #lineLength} \u0026amp;gt; 0. */ private final int chunkSeparatorLength; protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength, final int chunkSeparatorLength, final byte pad) { this.unencodedBlockSize = unencodedBlockSize; this.encodedBlockSize = encodedBlockSize; final boolean useChunking = lineLength \u0026gt; 0 \u0026amp;\u0026amp; chunkSeparatorLength \u0026gt; 0; this.lineLength = useChunking ? (lineLength / encodedBlockSize) * encodedBlockSize : 0; this.chunkSeparatorLength = chunkSeparatorLength; this.pad = pad; } public byte[] decode(final String pArray) { return decode(pArray.getBytes(StandardCharsets.UTF_8)); } public byte[] decode(final byte[] pArray) { if (pArray == null || pArray.length == 0) { return pArray; } final Context context = new Context(); decode(pArray, 0, pArray.length, context); decode(pArray, 0, EOF, context); // Notify decoder of EOF. final byte[] result = new byte[context.pos]; readResults(result, 0, result.length, context); return result; } abstract void decode(byte[] pArray, int i, int length, Context context); int readResults(final byte[] b, final int bPos, final int bAvail, final Context context) { if (context.buffer != null) { final int len = Math.min(available(context), bAvail); System.arraycopy(context.buffer, context.readPos, b, bPos, len); context.readPos += len; if (context.readPos \u0026gt;= context.pos) { context.buffer = null; // so hasData() will return false, and this method can return -1 } return len; } return context.eof ? EOF : 0; } int available(final Context context) { // package protected for access from I/O streams return context.buffer != null ? context.pos - context.readPos : 0; } protected byte[] ensureBufferSize(int size, Context context) { if (context.buffer == null) { context.buffer = new byte[this.getDefaultBufferSize()]; context.pos = 0; context.readPos = 0; } else if (context.pos + size - context.buffer.length \u0026gt; 0) { return resizeBuffer(context, context.pos + size); } return context.buffer; } protected int getDefaultBufferSize() { return 8192; } private static byte[] resizeBuffer(Context context, int minCapacity) { int oldCapacity = context.buffer.length; int newCapacity = oldCapacity * 2; if (compareUnsigned(newCapacity, minCapacity) \u0026lt; 0) { newCapacity = minCapacity; } if (compareUnsigned(newCapacity, 2147483639) \u0026gt; 0) { newCapacity = createPositiveCapacity(minCapacity); } byte[] b = new byte[newCapacity]; System.arraycopy(context.buffer, 0, b, 0, context.buffer.length); context.buffer = b; return b; } private static int compareUnsigned(int x, int y) { return Integer.compare(x + -2147483648, y + -2147483648); } private static int createPositiveCapacity(int minCapacity) { if (minCapacity \u0026lt; 0) { throw new OutOfMemoryError(\u0026#34;Unable to allocate array size: \u0026#34; + ((long) minCapacity \u0026amp; 4294967295L)); } else { return minCapacity \u0026gt; 2147483639 ? minCapacity : 2147483639; } } protected boolean containsAlphabetOrPad(final byte[] arrayOctet) { if (arrayOctet == null) { return false; } for (final byte element : arrayOctet) { if (pad == element || isInAlphabet(element)) { return true; } } return false; } protected abstract boolean isInAlphabet(byte value); protected static boolean isWhiteSpace(final byte byteToCheck) { switch (byteToCheck) { case \u0026#39; \u0026#39;: case \u0026#39;\\n\u0026#39;: case \u0026#39;\\r\u0026#39;: case \u0026#39;\\t\u0026#39;: return true; default: return false; } } static class Context { int ibitWorkArea; long lbitWorkArea; byte[] buffer; int pos; int readPos; boolean eof; int currentLinePos; int modulus; Context() { } public String toString() { return String.format(\u0026#34;%s[buffer=%s, currentLinePos=%s, eof=%s, ibitWorkArea=%s, lbitWorkArea=%s, modulus=%s, pos=%s, readPos=%s]\u0026#34;, this.getClass().getSimpleName(), Arrays.toString(this.buffer), this.currentLinePos, this.eof, this.ibitWorkArea, this.lbitWorkArea, this.modulus, this.pos, this.readPos); } } } static class Base32 extends TotpForXuandembp.BaseNCodec { private final int decodeSize; private final int encodeSize; private final byte[] decodeTable; private final byte[] encodeTable; private final byte[] lineSeparator; private static final int BITS_PER_ENCODED_BYTE = 5; private static final int BYTES_PER_ENCODED_BLOCK = 8; private static final int BYTES_PER_UNENCODED_BLOCK = 5; private static final long MASK_2BITS = 0x03L; private static final long MASK_7BITS = 0x7fL; /** * Mask used to extract 6 bits, used when decoding final trailing character. */ private static final long MASK_6BITS = 0x3fL; /** * Mask used to extract 5 bits, used when encoding Base32 bytes */ private static final int MASK_5BITS = 0x1f; /** * Mask used to extract 4 bits, used when decoding final trailing character. */ private static final long MASK_4BITS = 0x0fL; /** * Mask used to extract 3 bits, used when decoding final trailing character. */ private static final long MASK_3BITS = 0x07L; /** Mask used to extract 2 bits, used when decoding final trailing character. */ /** * Mask used to extract 1 bits, used when decoding final trailing character. */ private static final long MASK_1BITS = 0x01L; public Base32() { this(false); } public Base32(final boolean useHex) { this(0, null, useHex, PAD_DEFAULT); } public Base32(final int lineLength, final byte[] lineSeparator, final boolean useHex, final byte pad) { super(BYTES_PER_UNENCODED_BLOCK, BYTES_PER_ENCODED_BLOCK, lineLength, lineSeparator == null ? 0 : lineSeparator.length, pad); if (useHex) { this.encodeTable = HEX_ENCODE_TABLE; this.decodeTable = HEX_DECODE_TABLE; } else { this.encodeTable = ENCODE_TABLE; this.decodeTable = DECODE_TABLE; } if (lineLength \u0026gt; 0) { if (lineSeparator == null) { throw new IllegalArgumentException(\u0026#34;lineLength \u0026#34; + lineLength + \u0026#34; \u0026gt; 0, but lineSeparator is null\u0026#34;); } // Must be done after initializing the tables if (containsAlphabetOrPad(lineSeparator)) { final String sep = new String(lineSeparator, StandardCharsets.UTF_8); throw new IllegalArgumentException(\u0026#34;lineSeparator must not contain Base32 characters: [\u0026#34; + sep + \u0026#34;]\u0026#34;); } this.encodeSize = BYTES_PER_ENCODED_BLOCK + lineSeparator.length; this.lineSeparator = new byte[lineSeparator.length]; System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length); } else { this.encodeSize = BYTES_PER_ENCODED_BLOCK; this.lineSeparator = null; } this.decodeSize = this.encodeSize - 1; if (isInAlphabet(pad) || isWhiteSpace(pad)) { throw new IllegalArgumentException(\u0026#34;pad must not be in alphabet or whitespace\u0026#34;); } } private static final byte[] HEX_DECODE_TABLE = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 00-0f -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 10-1f -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 20-2f 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, // 30-3f 2-7 -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // 40-4f A-O 25, 26, 27, 28, 29, 30, 31, // 50-56 P-V -1, -1, -1, -1, -1, -1, -1, -1, -1, // 57-5f Z-_ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // 60-6f `-o 25, 26, 27, 28, 29, 30, 31 // 70-76 p-v }; /** * This array is a lookup table that translates 5-bit positive integer index values into their * \u0026#34;Base32 Hex Alphabet\u0026#34; equivalents as specified in Table 4 of RFC 4648. */ private static final byte[] HEX_ENCODE_TABLE = { \u0026#39;0\u0026#39;, \u0026#39;1\u0026#39;, \u0026#39;2\u0026#39;, \u0026#39;3\u0026#39;, \u0026#39;4\u0026#39;, \u0026#39;5\u0026#39;, \u0026#39;6\u0026#39;, \u0026#39;7\u0026#39;, \u0026#39;8\u0026#39;, \u0026#39;9\u0026#39;, \u0026#39;A\u0026#39;, \u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;D\u0026#39;, \u0026#39;E\u0026#39;, \u0026#39;F\u0026#39;, \u0026#39;G\u0026#39;, \u0026#39;H\u0026#39;, \u0026#39;I\u0026#39;, \u0026#39;J\u0026#39;, \u0026#39;K\u0026#39;, \u0026#39;L\u0026#39;, \u0026#39;M\u0026#39;, \u0026#39;N\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;P\u0026#39;, \u0026#39;Q\u0026#39;, \u0026#39;R\u0026#39;, \u0026#39;S\u0026#39;, \u0026#39;T\u0026#39;, \u0026#39;U\u0026#39;, \u0026#39;V\u0026#39;, }; private static final byte[] DECODE_TABLE = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 00-0f -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 10-1f -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 20-2f -1, -1, 26, 27, 28, 29, 30, 31, -1, -1, -1, -1, -1, -1, -1, -1, // 30-3f 2-7 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 40-4f A-O 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 50-5a P-Z -1, -1, -1, -1, -1, // 5b - 5f -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 60 - 6f a-o 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 70 - 7a p-z/**/ }; /** * This array is a lookup table that translates 5-bit positive integer index values into their \u0026#34;Base32 Alphabet\u0026#34; * equivalents as specified in Table 3 of RFC 4648. */ private static final byte[] ENCODE_TABLE = { \u0026#39;A\u0026#39;, \u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;D\u0026#39;, \u0026#39;E\u0026#39;, \u0026#39;F\u0026#39;, \u0026#39;G\u0026#39;, \u0026#39;H\u0026#39;, \u0026#39;I\u0026#39;, \u0026#39;J\u0026#39;, \u0026#39;K\u0026#39;, \u0026#39;L\u0026#39;, \u0026#39;M\u0026#39;, \u0026#39;N\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;P\u0026#39;, \u0026#39;Q\u0026#39;, \u0026#39;R\u0026#39;, \u0026#39;S\u0026#39;, \u0026#39;T\u0026#39;, \u0026#39;U\u0026#39;, \u0026#39;V\u0026#39;, \u0026#39;W\u0026#39;, \u0026#39;X\u0026#39;, \u0026#39;Y\u0026#39;, \u0026#39;Z\u0026#39;, \u0026#39;2\u0026#39;, \u0026#39;3\u0026#39;, \u0026#39;4\u0026#39;, \u0026#39;5\u0026#39;, \u0026#39;6\u0026#39;, \u0026#39;7\u0026#39;, }; private static void validateCharacter(final long emptyBitsMask, final Context context) { // Use the long bit work area if ((context.lbitWorkArea \u0026amp; emptyBitsMask) != 0) { throw new IllegalArgumentException( \u0026#34;Last encoded character (before the paddings if any) is a valid base 32 alphabet but not a possible value. \u0026#34; + \u0026#34;Expected the discarded bits to be zero.\u0026#34;); } } void decode(final byte[] input, int inPos, final int inAvail, final Context context) { // package protected for access from I/O streams if (context.eof) { return; } if (inAvail \u0026lt; 0) { context.eof = true; } for (int i = 0; i \u0026lt; inAvail; i++) { final byte b = input[inPos++]; if (b == pad) { // We\u0026#39;re done. context.eof = true; break; } final byte[] buffer = ensureBufferSize(decodeSize, context); if (b \u0026gt;= 0 \u0026amp;\u0026amp; b \u0026lt; this.decodeTable.length) { final int result = this.decodeTable[b]; if (result \u0026gt;= 0) { context.modulus = (context.modulus + 1) % BYTES_PER_ENCODED_BLOCK; // collect decoded bytes context.lbitWorkArea = (context.lbitWorkArea \u0026lt;\u0026lt; BITS_PER_ENCODED_BYTE) + result; if (context.modulus == 0) { // we can output the 5 bytes buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 32) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 24) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 16) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 8) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) (context.lbitWorkArea \u0026amp; MASK_8BITS); } } } } // Two forms of EOF as far as Base32 decoder is concerned: actual // EOF (-1) and first time \u0026#39;=\u0026#39; character is encountered in stream. // This approach makes the \u0026#39;=\u0026#39; padding characters completely optional. if (context.eof \u0026amp;\u0026amp; context.modulus \u0026gt;= 2) { // if modulus \u0026lt; 2, nothing to do final byte[] buffer = ensureBufferSize(decodeSize, context); // we ignore partial bytes, i.e. only multiples of 8 count switch (context.modulus) { case 2: // 10 bits, drop 2 and output one byte validateCharacter(MASK_2BITS, context); buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 2) \u0026amp; MASK_8BITS); break; case 3: // 15 bits, drop 7 and output 1 byte validateCharacter(MASK_7BITS, context); buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 7) \u0026amp; MASK_8BITS); break; case 4: // 20 bits = 2*8 + 4 validateCharacter(MASK_4BITS, context); context.lbitWorkArea = context.lbitWorkArea \u0026gt;\u0026gt; 4; // drop 4 bits buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 8) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea) \u0026amp; MASK_8BITS); break; case 5: // 25bits = 3*8 + 1 validateCharacter(MASK_1BITS, context); context.lbitWorkArea = context.lbitWorkArea \u0026gt;\u0026gt; 1; buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 16) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 8) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea) \u0026amp; MASK_8BITS); break; case 6: // 30bits = 3*8 + 6 validateCharacter(MASK_6BITS, context); context.lbitWorkArea = context.lbitWorkArea \u0026gt;\u0026gt; 6; buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 16) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 8) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea) \u0026amp; MASK_8BITS); break; case 7: // 35 = 4*8 +3 validateCharacter(MASK_3BITS, context); context.lbitWorkArea = context.lbitWorkArea \u0026gt;\u0026gt; 3; buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 24) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 16) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea \u0026gt;\u0026gt; 8) \u0026amp; MASK_8BITS); buffer[context.pos++] = (byte) ((context.lbitWorkArea) \u0026amp; MASK_8BITS); break; default: // modulus can be 0-7, and we excluded 0,1 already throw new IllegalStateException(\u0026#34;Impossible modulus \u0026#34; + context.modulus); } } } @Override protected boolean isInAlphabet(byte octet) { return octet \u0026gt;= 0 \u0026amp;\u0026amp; octet \u0026lt; decodeTable.length \u0026amp;\u0026amp; decodeTable[octet] != -1; } } } ","permalink":"https://blog.imcaoxuan.cn/posts/2022-03-22-implement-totp-with-hex-and-base32-in-java/","summary":"\u003c!--markdown--\u003e代码引用：org.apache.commons.codec.binary.Base32, org.apache.commons.codec.binary.Hex, TOTP(Johan Rydell, PortWise, Inc)\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e javax.crypto.Mac;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e javax.crypto.spec.SecretKeySpec;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e java.lang.reflect.UndeclaredThrowableException;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e java.math.BigInteger;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e java.nio.charset.StandardCharsets;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e java.security.GeneralSecurityException;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e java.util.Arrays;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eTotpDemo\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e DIGITS_POWER\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#75715e\"\u003e// 0 1  2   3    4     5      6       7        8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e(String\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e args) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// todo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        String secretKey \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        Base32 base32 \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e Base32();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e bytes \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e base32.\u003cspan style=\"color:#a6e22e\"\u003edecode\u003c/span\u003e(secretKey.\u003cspan style=\"color:#a6e22e\"\u003etoUpperCase\u003c/span\u003e());\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// [-84, -88, -126, -19, 116, -72, -61, -58, 117, 53]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        String hexKey \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Hex.\u003cspan style=\"color:#a6e22e\"\u003eencodeHexString\u003c/span\u003e(bytes);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        String hexTime \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Long.\u003cspan style=\"color:#a6e22e\"\u003etoHexString\u003c/span\u003e(System.\u003cspan style=\"color:#a6e22e\"\u003ecurrentTimeMillis\u003c/span\u003e() \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e 30 \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e 1000);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        System.\u003cspan style=\"color:#a6e22e\"\u003eout\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eprintln\u003c/span\u003e(generateTOTP(hexKey, hexTime, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;6\u0026#34;\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eHex\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e String \u003cspan style=\"color:#a6e22e\"\u003eencodeHexString\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e data) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e String(encodeHex(data));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eencodeHex\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e data) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e encodeHex(data, \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eencodeHex\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e data, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eboolean\u003c/span\u003e toLowerCase) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e encodeHex(data, toLowerCase \u003cspan style=\"color:#f92672\"\u003e?\u003c/span\u003e DIGITS_LOWER : DIGITS_UPPER);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eencodeHex\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e data, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e toDigits) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e l \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e data.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e out \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003el \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e 1\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#75715e\"\u003e// two characters form the hex value.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0, j \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0; i \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e l; i\u003cspan style=\"color:#f92672\"\u003e++\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                out\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ej\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e toDigits\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e(0xF0 \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e data\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ei\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e 4\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                out\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ej\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e toDigits\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e0x0F \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e data\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ei\u003cspan style=\"color:#f92672\"\u003e]]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e out;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e DIGITS_LOWER \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;2\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;3\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;4\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;5\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;6\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;7\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;8\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;9\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e};\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * Used to build output as Hex\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e DIGITS_UPPER \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;2\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;3\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;4\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;5\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;6\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;7\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;8\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;9\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;A\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;B\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;F\u0026#39;\u003c/span\u003e};\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e String \u003cspan style=\"color:#a6e22e\"\u003egenerateTOTP\u003c/span\u003e(String key,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                      String time,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                      String returnDigits) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e generateTOTP(key, time, returnDigits, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;HmacSHA1\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ehmac_sha1\u003c/span\u003e(String crypto, \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e keyBytes,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                    \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e text) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003etry\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            Mac hmac;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            hmac \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Mac.\u003cspan style=\"color:#a6e22e\"\u003egetInstance\u003c/span\u003e(crypto);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            SecretKeySpec macKey \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e SecretKeySpec(keyBytes, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;RAW\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            hmac.\u003cspan style=\"color:#a6e22e\"\u003einit\u003c/span\u003e(macKey);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e hmac.\u003cspan style=\"color:#a6e22e\"\u003edoFinal\u003c/span\u003e(text);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        } \u003cspan style=\"color:#66d9ef\"\u003ecatch\u003c/span\u003e (GeneralSecurityException gse) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ethrow\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e UndeclaredThrowableException(gse);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ehexStr2Bytes\u003c/span\u003e(String hex) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// Adding one byte to get the right conversion\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// values starting with \u0026#34;0\u0026#34; can be converted\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e bArray \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e BigInteger(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;10\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e hex, 16).\u003cspan style=\"color:#a6e22e\"\u003etoByteArray\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// Copy all the REAL bytes, not the \u0026#34;first\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e ret \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ebArray.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e 1\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0; i \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e ret.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e; i\u003cspan style=\"color:#f92672\"\u003e++\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            ret\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ei\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e bArray\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ei \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e 1\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e ret;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e String \u003cspan style=\"color:#a6e22e\"\u003egenerateTOTP\u003c/span\u003e(String key,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                       String time,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                       String returnDigits,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                       String crypto) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e codeDigits \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Integer.\u003cspan style=\"color:#a6e22e\"\u003edecode\u003c/span\u003e(returnDigits).\u003cspan style=\"color:#a6e22e\"\u003eintValue\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        String result;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e hash;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// Using the counter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// First 8 bytes are for the movingFactor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// Complaint with base RFC 4226 (HOTP)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ewhile\u003c/span\u003e (time.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e() \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e 16)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            time \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e time;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// Get the HEX in a Byte[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e msg \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e hexStr2Bytes(time);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// Adding one byte to get the right conversion\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e k \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e hexStr2Bytes(key);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        hash \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e hmac_sha1(crypto, k, msg);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e// put selected bytes into result int\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e offset \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e hash\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ehash.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e 1\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e 0xf;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e binary \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                ((hash\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eoffset\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e 0x7f) \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e 24) \u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        ((hash\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eoffset \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e 1\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e 0xff) \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e 16) \u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        ((hash\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eoffset \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e 2\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e 0xff) \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e 8) \u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        (hash\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eoffset \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e 3\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e 0xff);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e otp \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e binary \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e DIGITS_POWER\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003ecodeDigits\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        result \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Integer.\u003cspan style=\"color:#a6e22e\"\u003etoString\u003c/span\u003e(otp);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ewhile\u003c/span\u003e (result.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e() \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e codeDigits) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            result \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e result;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e result;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eabstract\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eBaseNCodec\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e EOF \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e pad;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e MASK_8BITS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0xff;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e PAD_DEFAULT \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;=\u0026#39;\u003c/span\u003e; \u003cspan style=\"color:#75715e\"\u003e// Allow static access to default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e unencodedBlockSize;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * Number of bytes in each full block of encoded data, e.g. 3 for Base64 and 8 for Base32\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e encodedBlockSize;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e lineLength;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * Size of chunk separator. Not used unless {@link #lineLength} \u0026amp;gt; 0.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e chunkSeparatorLength;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eBaseNCodec\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e unencodedBlockSize, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e encodedBlockSize,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e lineLength, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e chunkSeparatorLength, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e pad) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eunencodedBlockSize\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e unencodedBlockSize;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eencodedBlockSize\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e encodedBlockSize;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eboolean\u003c/span\u003e useChunking \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e lineLength \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e 0 \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e chunkSeparatorLength \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e 0;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elineLength\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e useChunking \u003cspan style=\"color:#f92672\"\u003e?\u003c/span\u003e (lineLength \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e encodedBlockSize) \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e encodedBlockSize : 0;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003echunkSeparatorLength\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e chunkSeparatorLength;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003epad\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e pad;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003edecode\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e String pArray) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e decode(pArray.\u003cspan style=\"color:#a6e22e\"\u003egetBytes\u003c/span\u003e(StandardCharsets.\u003cspan style=\"color:#a6e22e\"\u003eUTF_8\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003edecode\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e pArray) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (pArray \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e||\u003c/span\u003e pArray.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e 0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e pArray;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e Context context \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e Context();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            decode(pArray, 0, pArray.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            decode(pArray, 0, EOF, context); \u003cspan style=\"color:#75715e\"\u003e// Notify decoder of EOF.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e result \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            readResults(result, 0, result.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e result;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eabstract\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003edecode\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e pArray, \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e i, \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e length, Context context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ereadResults\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e b, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e bPos, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e bAvail, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e Context context) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e len \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Math.\u003cspan style=\"color:#a6e22e\"\u003emin\u003c/span\u003e(available(context), bAvail);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                System.\u003cspan style=\"color:#a6e22e\"\u003earraycopy\u003c/span\u003e(context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e, context.\u003cspan style=\"color:#a6e22e\"\u003ereadPos\u003c/span\u003e, b, bPos, len);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                context.\u003cspan style=\"color:#a6e22e\"\u003ereadPos\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+=\u003c/span\u003e len;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003ereadPos\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;=\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e; \u003cspan style=\"color:#75715e\"\u003e// so hasData() will return false, and this method can return -1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e len;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003eeof\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e?\u003c/span\u003e EOF : 0;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eavailable\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e Context context) {  \u003cspan style=\"color:#75715e\"\u003e// package protected for access from I/O streams\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e?\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003ereadPos\u003c/span\u003e : 0;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eensureBufferSize\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e size, Context context) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetDefaultBufferSize\u003c/span\u003e()\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                context.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                context.\u003cspan style=\"color:#a6e22e\"\u003ereadPos\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            } \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e size \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e 0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e resizeBuffer(context, context.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e size);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003egetDefaultBufferSize\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e 8192;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eresizeBuffer\u003c/span\u003e(Context context, \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e minCapacity) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e oldCapacity \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e newCapacity \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e oldCapacity \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e 2;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (compareUnsigned(newCapacity, minCapacity) \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e 0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                newCapacity \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e minCapacity;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (compareUnsigned(newCapacity, 2147483639) \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e 0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                newCapacity \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e createPositiveCapacity(minCapacity);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e b \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003enewCapacity\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            System.\u003cspan style=\"color:#a6e22e\"\u003earraycopy\u003c/span\u003e(context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e, 0, b, 0, context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            context.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e b;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e b;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ecompareUnsigned\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e x, \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e y) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e Integer.\u003cspan style=\"color:#a6e22e\"\u003ecompare\u003c/span\u003e(x \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2147483648, y \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e2147483648);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ecreatePositiveCapacity\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e minCapacity) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (minCapacity \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e 0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethrow\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e OutOfMemoryError(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Unable to allocate array size: \u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e ((\u003cspan style=\"color:#66d9ef\"\u003elong\u003c/span\u003e) minCapacity \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e 4294967295L));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            } \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e minCapacity \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e 2147483639 \u003cspan style=\"color:#f92672\"\u003e?\u003c/span\u003e minCapacity : 2147483639;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eboolean\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003econtainsAlphabetOrPad\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e arrayOctet) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (arrayOctet \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e element : arrayOctet) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (pad \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e element \u003cspan style=\"color:#f92672\"\u003e||\u003c/span\u003e isInAlphabet(element)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eabstract\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eboolean\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eisInAlphabet\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e value);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eboolean\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eisWhiteSpace\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e byteToCheck) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eswitch\u003c/span\u003e (byteToCheck) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\\n\u0026#39;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\\r\u0026#39;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\\t\u0026#39;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003edefault\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eContext\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e ibitWorkArea;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003elong\u003c/span\u003e lbitWorkArea;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e buffer;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e pos;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e readPos;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eboolean\u003c/span\u003e eof;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e currentLinePos;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e modulus;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            Context() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e String \u003cspan style=\"color:#a6e22e\"\u003etoString\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e String.\u003cspan style=\"color:#a6e22e\"\u003eformat\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;%s[buffer=%s, currentLinePos=%s, eof=%s, ibitWorkArea=%s, lbitWorkArea=%s, modulus=%s, pos=%s, readPos=%s]\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetClass\u003c/span\u003e().\u003cspan style=\"color:#a6e22e\"\u003egetSimpleName\u003c/span\u003e(), Arrays.\u003cspan style=\"color:#a6e22e\"\u003etoString\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ebuffer\u003c/span\u003e), \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ecurrentLinePos\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eeof\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eibitWorkArea\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emodulus\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003ereadPos\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eBase32\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eextends\u003c/span\u003e TotpForXuandembp.\u003cspan style=\"color:#a6e22e\"\u003eBaseNCodec\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e decodeSize;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e encodeSize;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e decodeTable;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e encodeTable;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e lineSeparator;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e BITS_PER_ENCODED_BYTE \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 5;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e BYTES_PER_ENCODED_BLOCK \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 8;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e BYTES_PER_UNENCODED_BLOCK \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 5;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003elong\u003c/span\u003e MASK_2BITS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0x03L;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003elong\u003c/span\u003e MASK_7BITS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0x7fL;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * Mask used to extract 6 bits, used when decoding final trailing character.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003elong\u003c/span\u003e MASK_6BITS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0x3fL;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * Mask used to extract 5 bits, used when encoding Base32 bytes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e MASK_5BITS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0x1f;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * Mask used to extract 4 bits, used when decoding final trailing character.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003elong\u003c/span\u003e MASK_4BITS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0x0fL;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * Mask used to extract 3 bits, used when decoding final trailing character.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003elong\u003c/span\u003e MASK_3BITS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0x07L;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/** Mask used to extract 2 bits, used when decoding final trailing character. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * Mask used to extract 1 bits, used when decoding final trailing character.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003elong\u003c/span\u003e MASK_1BITS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0x01L;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eBase32\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efalse\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eBase32\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eboolean\u003c/span\u003e useHex) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e(0, \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e, useHex, PAD_DEFAULT);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eBase32\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e lineLength, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e lineSeparator, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eboolean\u003c/span\u003e useHex, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e pad) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003esuper\u003c/span\u003e(BYTES_PER_UNENCODED_BLOCK, BYTES_PER_ENCODED_BLOCK, lineLength,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    lineSeparator \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e?\u003c/span\u003e 0 : lineSeparator.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e, pad);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (useHex) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eencodeTable\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e HEX_ENCODE_TABLE;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edecodeTable\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e HEX_DECODE_TABLE;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            } \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eencodeTable\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e ENCODE_TABLE;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edecodeTable\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e DECODE_TABLE;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (lineLength \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e 0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (lineSeparator \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ethrow\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e IllegalArgumentException(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;lineLength \u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e lineLength \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34; \u0026gt; 0, but lineSeparator is null\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#75715e\"\u003e// Must be done after initializing the tables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (containsAlphabetOrPad(lineSeparator)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e String sep \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e String(lineSeparator, StandardCharsets.\u003cspan style=\"color:#a6e22e\"\u003eUTF_8\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ethrow\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e IllegalArgumentException(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;lineSeparator must not contain Base32 characters: [\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e sep \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;]\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eencodeSize\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e BYTES_PER_ENCODED_BLOCK \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e lineSeparator.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elineSeparator\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003elineSeparator.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                System.\u003cspan style=\"color:#a6e22e\"\u003earraycopy\u003c/span\u003e(lineSeparator, 0, \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elineSeparator\u003c/span\u003e, 0, lineSeparator.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            } \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eencodeSize\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e BYTES_PER_ENCODED_BLOCK;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elineSeparator\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enull\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edecodeSize\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eencodeSize\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (isInAlphabet(pad) \u003cspan style=\"color:#f92672\"\u003e||\u003c/span\u003e isWhiteSpace(pad)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethrow\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e IllegalArgumentException(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;pad must not be in alphabet or whitespace\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e HEX_DECODE_TABLE \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#75715e\"\u003e//  0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 00-0f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 10-1f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 20-2f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 30-3f 2-7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, \u003cspan style=\"color:#75715e\"\u003e// 40-4f A-O\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                25, 26, 27, 28, 29, 30, 31,                                     \u003cspan style=\"color:#75715e\"\u003e// 50-56 P-V\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 57-5f Z-_\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, \u003cspan style=\"color:#75715e\"\u003e// 60-6f `-o\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                25, 26, 27, 28, 29, 30, 31                                      \u003cspan style=\"color:#75715e\"\u003e// 70-76 p-v\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * This array is a lookup table that translates 5-bit positive integer index values into their\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * \u0026#34;Base32 Hex Alphabet\u0026#34; equivalents as specified in Table 4 of RFC 4648.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e HEX_ENCODE_TABLE \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;2\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;3\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;4\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;5\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;6\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;7\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;8\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;9\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;A\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;B\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;F\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;G\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;H\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;I\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;J\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;K\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;L\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;M\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;N\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;O\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;P\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Q\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;R\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;S\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;T\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;U\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;V\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e DECODE_TABLE \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#75715e\"\u003e//  0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 00-0f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 10-1f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 20-2f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, 26, 27, 28, 29, 30, 31, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 30-3f 2-7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, \u003cspan style=\"color:#75715e\"\u003e// 40-4f A-O\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,                     \u003cspan style=\"color:#75715e\"\u003e// 50-5a P-Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, \u003cspan style=\"color:#75715e\"\u003e// 5b - 5f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, \u003cspan style=\"color:#75715e\"\u003e// 60 - 6f a-o\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,                     \u003cspan style=\"color:#75715e\"\u003e// 70 - 7a p-z/**/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * This array is a lookup table that translates 5-bit positive integer index values into their \u0026#34;Base32 Alphabet\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         * equivalents as specified in Table 3 of RFC 4648.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e         */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e ENCODE_TABLE \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;A\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;B\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;F\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;G\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;H\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;I\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;J\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;K\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;L\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;M\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;N\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;O\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;P\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Q\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;R\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;S\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;T\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;U\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;V\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;W\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;X\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Y\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Z\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;2\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;3\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;4\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;5\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;6\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;7\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprivate\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003evalidateCharacter\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003elong\u003c/span\u003e emptyBitsMask, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e Context context) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#75715e\"\u003e// Use the long bit work area\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e emptyBitsMask) \u003cspan style=\"color:#f92672\"\u003e!=\u003c/span\u003e 0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ethrow\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e IllegalArgumentException(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Last encoded character (before the paddings if any) is a valid base 32 alphabet but not a possible value. \u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Expected the discarded bits to be zero.\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003edecode\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e input, \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e inPos, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e inAvail, \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e Context context) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#75715e\"\u003e// package protected for access from I/O streams\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003eeof\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (inAvail \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e 0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                context.\u003cspan style=\"color:#a6e22e\"\u003eeof\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0; i \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e inAvail; i\u003cspan style=\"color:#f92672\"\u003e++\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e b \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e input\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003einPos\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (b \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e pad) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#75715e\"\u003e// We\u0026#39;re done.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    context.\u003cspan style=\"color:#a6e22e\"\u003eeof\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e buffer \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e ensureBufferSize(decodeSize, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (b \u003cspan style=\"color:#f92672\"\u003e\u0026gt;=\u003c/span\u003e 0 \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e b \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edecodeTable\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e result \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003edecodeTable\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eb\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (result \u003cspan style=\"color:#f92672\"\u003e\u0026gt;=\u003c/span\u003e 0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        context.\u003cspan style=\"color:#a6e22e\"\u003emodulus\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003emodulus\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e 1) \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e BYTES_PER_ENCODED_BLOCK;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#75715e\"\u003e// collect decoded bytes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e BITS_PER_ENCODED_BYTE) \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e result;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003emodulus\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e 0) { \u003cspan style=\"color:#75715e\"\u003e// we can output the 5 bytes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 32) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 24) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 16) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 8) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) (context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#75715e\"\u003e// Two forms of EOF as far as Base32 decoder is concerned: actual\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#75715e\"\u003e// EOF (-1) and first time \u0026#39;=\u0026#39; character is encountered in stream.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#75715e\"\u003e// This approach makes the \u0026#39;=\u0026#39; padding characters completely optional.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003eeof\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003emodulus\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;=\u003c/span\u003e 2) { \u003cspan style=\"color:#75715e\"\u003e// if modulus \u0026lt; 2, nothing to do\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003efinal\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e buffer \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e ensureBufferSize(decodeSize, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#75715e\"\u003e//  we ignore partial bytes, i.e. only multiples of 8 count\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#66d9ef\"\u003eswitch\u003c/span\u003e (context.\u003cspan style=\"color:#a6e22e\"\u003emodulus\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e 2: \u003cspan style=\"color:#75715e\"\u003e// 10 bits, drop 2 and output one byte\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        validateCharacter(MASK_2BITS, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 2) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#66d9ef\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e 3: \u003cspan style=\"color:#75715e\"\u003e// 15 bits, drop 7 and output 1 byte\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        validateCharacter(MASK_7BITS, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 7) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#66d9ef\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e 4: \u003cspan style=\"color:#75715e\"\u003e// 20 bits = 2*8 + 4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        validateCharacter(MASK_4BITS, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 4; \u003cspan style=\"color:#75715e\"\u003e// drop 4 bits\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 8) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#66d9ef\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e 5: \u003cspan style=\"color:#75715e\"\u003e// 25bits = 3*8 + 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        validateCharacter(MASK_1BITS, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 16) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 8) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#66d9ef\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e 6: \u003cspan style=\"color:#75715e\"\u003e// 30bits = 3*8 + 6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        validateCharacter(MASK_6BITS, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 6;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 16) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 8) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#66d9ef\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003ecase\u003c/span\u003e 7: \u003cspan style=\"color:#75715e\"\u003e// 35 = 4*8 +3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        validateCharacter(MASK_3BITS, context);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 3;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 24) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 16) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e 8) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        buffer\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003econtext.\u003cspan style=\"color:#a6e22e\"\u003epos\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e++]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e) ((context.\u003cspan style=\"color:#a6e22e\"\u003elbitWorkArea\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e MASK_8BITS);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#66d9ef\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#66d9ef\"\u003edefault\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#75715e\"\u003e// modulus can be 0-7, and we excluded 0,1 already\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#66d9ef\"\u003ethrow\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e IllegalStateException(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Impossible modulus \u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e context.\u003cspan style=\"color:#a6e22e\"\u003emodulus\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#a6e22e\"\u003e@Override\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eprotected\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eboolean\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eisInAlphabet\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003ebyte\u003c/span\u003e octet) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e octet \u003cspan style=\"color:#f92672\"\u003e\u0026gt;=\u003c/span\u003e 0 \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e octet \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e decodeTable.\u003cspan style=\"color:#a6e22e\"\u003elength\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e decodeTable\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eoctet\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"整合代码：TOTP+Hex+Base32"},{"content":"原文：[Solution of nginx reverse proxy websocket response 403][1] The log accessed through nginx has the following entry:\nDEBUG ... o.s.w.s.s.s.OriginHandshakeInterceptor : Handshake request rejected, Origin header value https://some-host.com not allowed Then Google queries related solutions to find the issue on GitHub, so you only need to modify the configuration of nginx and addproxy_set_header Origin \u0026ldquo;\u0026quot;;That’s it.\nhttp { //SSL related configuration\nmap $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 8020; location /ws { proxy_pass http://some-ip:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Origin \u0026quot;\u0026quot;; } } 在我的access.log中并未发现关于“Origin”的信息，但是按照此方案修改配置文件后却可以解决问题。 [1]: https://developpaper.com/solution-of-nginx-reverse-proxy-websocket-response-403/\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-02-09-fix-websocket-403-errors-behind-an-nginx-reverse-proxy/","summary":"\u003c!--markdown--\u003e原文：[Solution of nginx reverse proxy websocket response 403][1]\n\u003cblockquote\u003e\n\u003cp\u003eThe log accessed through nginx has the following entry:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre\u003e\u003ccode\u003eDEBUG ... o.s.w.s.s.s.OriginHandshakeInterceptor   : Handshake request rejected, Origin header value https://some-host.com not allowed\n\u003c/code\u003e\u003c/pre\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThen Google queries related solutions to find the issue on GitHub, so\nyou only need to modify the configuration of nginx and\naddproxy_set_header Origin \u0026ldquo;\u0026quot;;That’s it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ehttp {\n//SSL related configuration\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap $http_upgrade $connection_upgrade {\n    default upgrade;\n    '' close;\n}\n\nserver {\n    listen 8020;\n    location /ws {\n        proxy_pass http://some-ip:8080;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection $connection_upgrade;\n        proxy_set_header Origin \u0026quot;\u0026quot;;\n    }\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e在我的access.log中并未发现关于“Origin”的信息，但是按照此方案修改配置文件后却可以解决问题。\n[1]: \u003ca href=\"https://developpaper.com/solution-of-nginx-reverse-proxy-websocket-response-403/\"\u003ehttps://developpaper.com/solution-of-nginx-reverse-proxy-websocket-response-403/\u003c/a\u003e\u003c/p\u003e","title":"转发：nginx反向代理websocket返回403"},{"content":"今天在解析一个5M的文本文件时，耗时两分多钟，找了半天才发现原因是使用String += s的方式拼接字符串导致的。 换成StringBuilder后速度提升了4个数量级！\n至于原因，大家应该都懂，我就不再赘述了。 基础不能忘！！！ 基础不能忘！！！ 基础不能忘！！！\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-01-23-stringbuilder-vs-string-concatenation-performance-in-java/","summary":"\u003c!--markdown--\u003e今天在解析一个5M的文本文件时，耗时两分多钟，找了半天才发现原因是使用String += s的方式拼接字符串导致的。\n\u003cp\u003e\u003cimg alt=\"123-1.png\" loading=\"lazy\" src=\"https://www.caoxuan.top/usr/uploads/2022/01/2676324333.png\"\u003e\u003c/p\u003e\n\u003cp\u003e换成StringBuilder后速度提升了4个数量级！\u003cimg alt=\"123-2.png\" loading=\"lazy\" src=\"https://www.caoxuan.top/usr/uploads/2022/01/534282834.png\"\u003e\u003c/p\u003e\n\u003cp\u003e至于原因，大家应该都懂，我就不再赘述了。\n\u003cstrong\u003e基础不能忘！！！\u003c/strong\u003e\n\u003cstrong\u003e基础不能忘！！！\u003c/strong\u003e\n\u003cstrong\u003e基础不能忘！！！\u003c/strong\u003e\u003c/p\u003e","title":"复习：StringBuilder和String拼接字符串效率差距真大"},{"content":"原文：[what-is-a-good-java-library-to-zip-unzip-files][1] Demo：@user2003470\nimport net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.core.ZipFile; public static void unzip(){ String source = \u0026#34;some/compressed/file.zip\u0026#34;; String destination = \u0026#34;some/destination/folder\u0026#34;; String password = \u0026#34;password\u0026#34;; try { ZipFile zipFile = new ZipFile(source); if (zipFile.isEncrypted()) { zipFile.setPassword(password); } zipFile.extractAll(destination); } catch (ZipException e) { e.printStackTrace(); } } The Maven dependency is:\n\u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;net.lingala.zip4j\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;zip4j\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;1.3.2\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; ","permalink":"https://blog.imcaoxuan.cn/posts/2022-01-23-extract-password-protected-zip-archives-with-zip4j/","summary":"\u003c!--markdown--\u003e原文：[what-is-a-good-java-library-to-zip-unzip-files][1]\n\u003cp\u003eDemo：@user2003470\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e net.lingala.zip4j.exception.ZipException;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e net.lingala.zip4j.core.ZipFile;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eunzip\u003c/span\u003e(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    String source \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some/compressed/file.zip\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    String destination \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some/destination/folder\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    String password \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;password\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003etry\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         ZipFile zipFile \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e ZipFile(source);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e (zipFile.\u003cspan style=\"color:#a6e22e\"\u003eisEncrypted\u003c/span\u003e()) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            zipFile.\u003cspan style=\"color:#a6e22e\"\u003esetPassword\u003c/span\u003e(password);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         zipFile.\u003cspan style=\"color:#a6e22e\"\u003eextractAll\u003c/span\u003e(destination);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    } \u003cspan style=\"color:#66d9ef\"\u003ecatch\u003c/span\u003e (ZipException e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        e.\u003cspan style=\"color:#a6e22e\"\u003eprintStackTrace\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe Maven dependency is:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e\u0026lt;groupId\u0026gt;\u003c/span\u003enet.lingala.zip4j\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/groupId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e\u0026lt;artifactId\u0026gt;\u003c/span\u003ezip4j\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/artifactId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e\u0026lt;version\u0026gt;\u003c/span\u003e1.3.2\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/version\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;/dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"转载：一个好用的zip库zip4j"},{"content":"如图：![cs.png][1] 通过 systemctl status snap.docker.dockerd.service 命令，可以找到daemon.json的路径\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-01-16-configure-registry-mirrors-for-snap-docker-on-ubuntu-20-04/","summary":"\u003c!--markdown--\u003e如图：![cs.png][1]\n\u003cp\u003e通过 \u003ccode\u003esystemctl status snap.docker.dockerd.service\u003c/code\u003e 命令，可以找到daemon.json的路径\u003c/p\u003e","title":"Ubuntu20.04中使用snap安装的docker如何修改registry-mirrors"},{"content":"转发：https://superuser.com/questions/1431826/expose-api-over-tcp-of-snap-installed-docker-on-ubuntu-18-04 @Rumdex\nBy running: systemctl status snap.docker.dockerd.service I was able to see which was the loaded service file: /etc/systemd/system/snap.docker.dockerd.service Just looked inside this file looking for the ExecStart directive. It was there. So just had to add -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock to that line, so it ended up looking like: ExecStart=/usr/bin/snap run docker.dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock Rebooted. Works.\n","permalink":"https://blog.imcaoxuan.cn/posts/2022-01-16-enable-remote-access-for-snap-docker-on-ubuntu-20-04/","summary":"\u003c!--markdown--\u003e转发：https://superuser.com/questions/1431826/expose-api-over-tcp-of-snap-installed-docker-on-ubuntu-18-04\n\u003cp\u003e@Rumdex\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBy running: \u003ccode\u003esystemctl status snap.docker.dockerd.service\u003c/code\u003e I was able\nto see which was the loaded service file:\n\u003ccode\u003e/etc/systemd/system/snap.docker.dockerd.service\u003c/code\u003e Just looked inside\nthis file looking for the \u003ccode\u003eExecStart\u003c/code\u003e directive. It was there. So just\nhad to add \u003ccode\u003e-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock\u003c/code\u003e to\nthat line, so it ended up looking like:\n\u003ccode\u003eExecStart=/usr/bin/snap run docker.dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock\u003c/code\u003e\nRebooted. Works.\u003c/p\u003e\n\u003c/blockquote\u003e","title":"Ubuntu20.04中使用snap安装的docker如何开启远程访问？"},{"content":"问题如图所示: 解决方案：vi filename打开文件，执行 : set ff=unix 设置文件为unix，然后执行:wq，保存成unix格式 参考：https://blog.csdn.net/ygy162/article/details/105364096/\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-11-16-fix-java-filenotfoundexception-caused-by-carriage-returns-in-filenames/","summary":"\u003c!--markdown--\u003e问题如图所示:\n\u003cp\u003e\u003cimg alt=\"微信图片_20211116093924.jpg\" loading=\"lazy\" src=\"https://www.caoxuan.top/usr/uploads/2021/11/3340062974.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e解决方案：vi filename打开文件，执行 : set ff=unix 设置文件为unix，然后执行:wq，保存成unix格式\n参考：https://blog.csdn.net/ygy162/article/details/105364096/\u003c/p\u003e","title":"文件名中出现^M导致java.io.FileNotFoundException"},{"content":" 思想借鉴：https://www.zhihu.com/question/266180268\n从严格意义上来说， 这并不是某个加密算法，能够同时允许多个密钥解密。 而是对称加密和非对称加密算法配合，实现将数据加密分发给多个人，能够让不同人使用自己的密钥解密数据\n在线测试：Secret (caoxuan.top)\nDemo（AES+RSA）:\npackage t20210921; import util.AESUtil; import util.RSAUtil; import java.util.ArrayList; import java.util.List; /** * @author Cao Xuan * @date 2021/9/21 17:15 */ public class Test { public static void main(String[] args) throws Exception { String publicKey = \u0026#34;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrfQnSoLWLyob3d7PgZySgzRtAHCxyJaYs+Mqc2WeqwaxAlYV1vunmoadaVX00XzCqZej9HOxUbyxIJswrbKsK39mlj6LQ0VIVRngYgaYF5M7JsshiNnY0BCdmA39TzGtmdUDxppKQjyVT6MeUfqFO5NV9emWcrBKCad1Hql16AQIDAQAB\u0026#34;; String privateKey = \u0026#34;MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKt9CdKgtYvKhvd3s+BnJKDNG0AcLHIlpiz4ypzZZ6rBrECVhXW+6eahp1pVfTRfMKpl6P0c7FRvLEgmzCtsqwrf2aWPotDRUhVGeBiBpgXkzsmyyGI2djQEJ2YDf1PMa2Z1QPGmkpCPJVPox5R+oU7k1X16ZZysEoJp3UeqXXoBAgMBAAECgYBK/wrtr1TWBsNRtGrZB6KQJEL3nZqebPKolkFdqQJaPgrLz9gm71AxiZ67tclkvwB0dM8Y6q48GsZ942HE1+hQx/AUXiQH/TyTy6ZtgIV3zwNFD/fhlD57gpdxblFpoOvRrZGhwWEyut97DL8dugdBe6dMM5vBmtR3N+RG7/AsAQJBAOf2hULHYrYG45CfrxKG/dd8SVS4d2b/s192Y0WMYFkzOJcO9aRGz82Mg8q/8ET3QylYwLvdZR/rBKh1jYWtDyECQQC9QkIWh3fZWkewoIgrZim2Yu08yDTNTQGze7aZTWx1Msdlh7X5GvTbH2jxF2uM6R549rR7plDflmGt1KwXY27hAkA817agi3fi0u/BsYDUVUAj01/QrwnypENCWOU1CtsCyqKfTLc1vbUn7yFqfungzRJ6t+Ll4+5wbs6r+RmD5J7BAkEAnq4DAyipz87l9K1j/h82MflXt3KU8tzx5C6Btp83pDvi+rmCVU3Ipj/7mMhuIEMEjZ8rS9DyVcScOUbq0uFHgQJAdv7l4FlSd/MMBPGKKEe0fxJivn6+Laf3x+ZJNFOl7G5vFmzOSkA7Q8nlUebrBUpuxliGXlf06E9EQui2Z0ETVQ==\u0026#34;; String secretKey = \u0026#34;60479f43-b296-4199-8d97-de472e1d37bd\u0026#34;; String plainText = \u0026#34;cxnb\u0026#34;; String secretText = AESUtil.encrypt(plainText, secretKey); System.out.println(\u0026#34;原文：\u0026#34; + plainText); System.out.println(\u0026#34;密文：\u0026#34; + secretText); List\u0026lt;String\u0026gt; mySecretList = new ArrayList\u0026lt;\u0026gt;(); for (int i = 0; i \u0026lt; 10; i++) { mySecretList.add(RSAUtil.encrypt(secretKey, publicKey)); } System.out.println(\u0026#34;多密钥\u0026#34; + mySecretList); mySecretList.forEach(e -\u0026gt; { System.out.println(\u0026#34;使用密钥\u0026#34; + e + \u0026#34;解密\u0026#34;); try { String s = AESUtil.decrypt(secretText, RSAUtil.decrypt(e, privateKey)); System.out.println(\u0026#34;解密成功\u0026#34; + s); } catch (Exception exception) { exception.printStackTrace(); } }); } } ","permalink":"https://blog.imcaoxuan.cn/posts/2021-09-21-decrypt-the-same-message-with-multiple-keys-using-aes-and-rsa/","summary":"\u003c!--markdown--\u003e\n\u003cp\u003e思想借鉴：https://www.zhihu.com/question/266180268\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e从严格意义上来说， 这并不是某个加密算法，能够同时允许多个密钥解密。 而是对称加密和非对称加密算法配合，实现将数据加密分发给多个人，能够让不同人使用自己的密钥解密数据\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e在线测试：\u003ca href=\"https://tool.caoxuan.top/ui/secret/\"\u003eSecret (caoxuan.top)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDemo（AES+RSA）:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003epackage\u003c/span\u003e t20210921;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e util.AESUtil;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e util.RSAUtil;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e java.util.ArrayList;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e java.util.List;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e * @author Cao Xuan\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e * @date 2021/9/21 17:15\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eTest\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estatic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e(String\u003cspan style=\"color:#f92672\"\u003e[]\u003c/span\u003e args) \u003cspan style=\"color:#66d9ef\"\u003ethrows\u003c/span\u003e Exception {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        String publicKey \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrfQnSoLWLyob3d7PgZySgzRtAHCxyJaYs+Mqc2WeqwaxAlYV1vunmoadaVX00XzCqZej9HOxUbyxIJswrbKsK39mlj6LQ0VIVRngYgaYF5M7JsshiNnY0BCdmA39TzGtmdUDxppKQjyVT6MeUfqFO5NV9emWcrBKCad1Hql16AQIDAQAB\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        String privateKey \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKt9CdKgtYvKhvd3s+BnJKDNG0AcLHIlpiz4ypzZZ6rBrECVhXW+6eahp1pVfTRfMKpl6P0c7FRvLEgmzCtsqwrf2aWPotDRUhVGeBiBpgXkzsmyyGI2djQEJ2YDf1PMa2Z1QPGmkpCPJVPox5R+oU7k1X16ZZysEoJp3UeqXXoBAgMBAAECgYBK/wrtr1TWBsNRtGrZB6KQJEL3nZqebPKolkFdqQJaPgrLz9gm71AxiZ67tclkvwB0dM8Y6q48GsZ942HE1+hQx/AUXiQH/TyTy6ZtgIV3zwNFD/fhlD57gpdxblFpoOvRrZGhwWEyut97DL8dugdBe6dMM5vBmtR3N+RG7/AsAQJBAOf2hULHYrYG45CfrxKG/dd8SVS4d2b/s192Y0WMYFkzOJcO9aRGz82Mg8q/8ET3QylYwLvdZR/rBKh1jYWtDyECQQC9QkIWh3fZWkewoIgrZim2Yu08yDTNTQGze7aZTWx1Msdlh7X5GvTbH2jxF2uM6R549rR7plDflmGt1KwXY27hAkA817agi3fi0u/BsYDUVUAj01/QrwnypENCWOU1CtsCyqKfTLc1vbUn7yFqfungzRJ6t+Ll4+5wbs6r+RmD5J7BAkEAnq4DAyipz87l9K1j/h82MflXt3KU8tzx5C6Btp83pDvi+rmCVU3Ipj/7mMhuIEMEjZ8rS9DyVcScOUbq0uFHgQJAdv7l4FlSd/MMBPGKKEe0fxJivn6+Laf3x+ZJNFOl7G5vFmzOSkA7Q8nlUebrBUpuxliGXlf06E9EQui2Z0ETVQ==\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        String secretKey \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;60479f43-b296-4199-8d97-de472e1d37bd\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        String plainText \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;cxnb\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        String secretText \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e AESUtil.\u003cspan style=\"color:#a6e22e\"\u003eencrypt\u003c/span\u003e(plainText, secretKey);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        System.\u003cspan style=\"color:#a6e22e\"\u003eout\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eprintln\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;原文：\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e plainText);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        System.\u003cspan style=\"color:#a6e22e\"\u003eout\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eprintln\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;密文：\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e secretText);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        List\u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003eString\u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e mySecretList \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e ArrayList\u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u0026gt;\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e (\u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e 0; i \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e 10; i\u003cspan style=\"color:#f92672\"\u003e++\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            mySecretList.\u003cspan style=\"color:#a6e22e\"\u003eadd\u003c/span\u003e(RSAUtil.\u003cspan style=\"color:#a6e22e\"\u003eencrypt\u003c/span\u003e(secretKey, publicKey));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        System.\u003cspan style=\"color:#a6e22e\"\u003eout\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eprintln\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;多密钥\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e mySecretList);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        mySecretList.\u003cspan style=\"color:#a6e22e\"\u003eforEach\u003c/span\u003e(e \u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            System.\u003cspan style=\"color:#a6e22e\"\u003eout\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eprintln\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;使用密钥\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;解密\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#66d9ef\"\u003etry\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                String s \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e AESUtil.\u003cspan style=\"color:#a6e22e\"\u003edecrypt\u003c/span\u003e(secretText, RSAUtil.\u003cspan style=\"color:#a6e22e\"\u003edecrypt\u003c/span\u003e(e, privateKey));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                System.\u003cspan style=\"color:#a6e22e\"\u003eout\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eprintln\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;解密成功\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e s);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            } \u003cspan style=\"color:#66d9ef\"\u003ecatch\u003c/span\u003e (Exception exception) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                exception.\u003cspan style=\"color:#a6e22e\"\u003eprintStackTrace\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"用多个密钥解密同一个密文"},{"content":"\u003e 打了断点一路追到底层，发现真tmd返回0跟1，后斜眼一看object的id改变了，妈的好神奇。 原文：https://blog.csdn.net/a5601564/article/details/77945958/\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-08-22-understanding-mybatis-usegeneratedkeys-and-generated-ids/","summary":"\u003c!--markdown--\u003e\u003e 打了断点一路追到底层，发现真tmd返回0跟1，后斜眼一看object的id改变了，妈的好神奇。\n\u003cp\u003e原文：\u003ca href=\"https://blog.csdn.net/a5601564/article/details/77945958/\"\u003ehttps://blog.csdn.net/a5601564/article/details/77945958/\u003c/a\u003e\u003c/p\u003e","title":"转发：mybatis 大坑之 useGeneratedKeys 返回值不是id，而是0跟1"},{"content":"解决方案： 解决：if标签的test里面的表达式的and不能写成大写AND。（具体的原因本人没有详细探究过，估计是mybatis的语法不允许吧）\n原文：mybatis报错：Error evaluating expression\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-08-21-fix-mybatis-error-evaluating-expression/","summary":"\u003c!--markdown--\u003e解决方案：\n\u003cblockquote\u003e\n\u003cp\u003e解决：if标签的test里面的表达式的and不能写成大写AND。（具体的原因本人没有详细探究过，估计是mybatis的语法不允许吧）\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e原文：\u003ca href=\"https://blog.csdn.net/csdnyq/article/details/106841550\"\u003emybatis报错：Error evaluating expression\u003c/a\u003e\u003c/p\u003e","title":"转发：mybatis报错：Error evaluating expression"},{"content":"**摘要：** Bitmap.compress方法确实可以压缩图片，但压缩的是存储大小，即你放到disk上的大小\n我尝试过把品质设置为10，decode出来的Bitmap大小没变，但显示照片的质量非常差\nBitmapFactory.decodeByteArray方法对压缩后的byte[]解码后，得到的Bitmap大小依然和未压缩过一样\n如果你想要显示的Bitmap占用的内存少一点，还是需要去设置加载的像素长度和宽度（变成缩略图）\n原文地址：https://blog.csdn.net/T3/article/details/79665077\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-08-15-understanding-android-bitmap-compression-and-memory-usage/","summary":"\u003c!--markdown--\u003e**摘要：**\n\u003cblockquote\u003e\n\u003cp\u003eBitmap.compress方法确实可以压缩图片，但压缩的是存储大小，即你放到disk上的大小\u003c/p\u003e\n\u003cp\u003e我尝试过把品质设置为10，decode出来的Bitmap大小没变，但显示照片的质量非常差\u003c/p\u003e\n\u003cp\u003eBitmapFactory.decodeByteArray方法对压缩后的byte[]解码后，得到的Bitmap大小依然和未压缩过一样\u003c/p\u003e\n\u003cp\u003e如果你想要显示的Bitmap占用的内存少一点，还是需要去设置加载的像素长度和宽度（变成缩略图）\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e原文地址：\u003c/strong\u003e\u003ca href=\"https://blog.csdn.net/T3/article/details/79665077\"\u003ehttps://blog.csdn.net/T3/article/details/79665077\u003c/a\u003e\u003c/p\u003e","title":"转发：Android Bitmap压缩图像的正确方法(compress的误区)"},{"content":"# 问题：Linux下使用jps命令报错java.lang.Error: Properties init: Could not determine current working directory. ![QQ截图20210814141543.png][1]\n解决方案 ![QQ截图20210814141703.png][2]\ncd .. 发现是因为刚才在xftp中删除了此目录导致的![QQ截图20210814141831.png][3]\ncd / cd到根目录，再尝试使用jps，发现问题已解决 [1]: https://www.caoxuan.top/usr/uploads/2021/08/1556106767.png [2]: https://www.caoxuan.top/usr/uploads/2021/08/3988254530.png [3]: https://www.caoxuan.top/usr/uploads/2021/08/2498345376.png\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-08-14-fix-jps-current-working-directory-error-on-linux/","summary":"\u003c!--markdown--\u003e# 问题：Linux下使用jps命令报错java.lang.Error: Properties init: Could not determine current working directory.\n\u003cp\u003e![QQ截图20210814141543.png][1]\u003c/p\u003e\n\u003ch1 id=\"解决方案\"\u003e解决方案\u003c/h1\u003e\n\u003cp\u003e![QQ截图20210814141703.png][2]\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ecd ..\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e发现是因为刚才在xftp中删除了此目录导致的![QQ截图20210814141831.png][3]\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ecd /\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003ecd到根目录，再尝试使用jps，发现问题已解决\n[1]: \u003ca href=\"https://www.caoxuan.top/usr/uploads/2021/08/1556106767.png\"\u003ehttps://www.caoxuan.top/usr/uploads/2021/08/1556106767.png\u003c/a\u003e\n[2]: \u003ca href=\"https://www.caoxuan.top/usr/uploads/2021/08/3988254530.png\"\u003ehttps://www.caoxuan.top/usr/uploads/2021/08/3988254530.png\u003c/a\u003e\n[3]: \u003ca href=\"https://www.caoxuan.top/usr/uploads/2021/08/2498345376.png\"\u003ehttps://www.caoxuan.top/usr/uploads/2021/08/2498345376.png\u003c/a\u003e\u003c/p\u003e","title":"Linux下使用jps命令报错"},{"content":"公元二〇二一年七月二十日星期二 六月十一 辛丑年 牛 乙未月 己巳日\n2021/7/20\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-07-20-a-personal-update-after-a-long-break/","summary":"\u003c!--markdown--\u003e公元二〇二一年七月二十日星期二\n\u003cp\u003e六月十一\n辛丑年 牛\n乙未月 己巳日\u003c/p\u003e\n\u003cp\u003e2021/7/20\u003c/p\u003e","title":"好久没写了，随便水一贴吧"},{"content":"# 关于在Nginx中配置顶级域名与www域名之间跳转以及https和如何搭配CDN的综合解决方案 方案一 方案二（不推荐） 方案三 使用场景 一般情况 顶级域名存在邮件服务 顶级域名存在邮件服务 相对复杂度 低 中 高 终点 https://www.example.com https://www.example.com https://www.example.com 隐藏源站IP 是 是 是 相对可用性 高 低 高 缺点 无法在顶级域名存在邮件服务的情况下使用 无法直接访问https://example.com 成本略高，配置麻烦 特殊要求 无 要求DNS服务商支持显性URL转发 需要一台代理服务器 方案一 源站配置（以Nginx为例） ​\t关于www和naked域名的重新向以及https的解决方案（以Nginx为例） - 西叉的代码屋 (caoxuan.top)\nCDN配置（以腾讯云为例） 基础配置 ​\t加速域名：www.example.com\n​\t源站类型：自有源\n​\t回源协议：协议跟随\n​\t源站地址：1.1.1.1（源站IP）\n​\t回源HOST：www.example.com\nHTTPS配置 强制跳转 ​\t跳转配置：开\n​\t跳转类型：http-\u0026gt;https\n​\t跳转方式：301跳转\n​\t携带头部：否\nDNS配置（以阿里云为例） ​\n记录类型 主机记录 解析线路 记录值 TTL CNAME www 默认 www.example.com.cdn.dnsv1.com（示例；实际以CDN控制台的为准） 10分钟 CNAME @ 默认 www.example.com 10分钟 路径表 起点 过程 浏览器请求次数 http://example.com\n或\nexample.com 起点 -\u0026gt; CDN（301 https://example.com）\nhttps://example.com -\u0026gt; CDN -\u0026gt; 源站（301 https://www.example.com）\nhttps://www.example.com -\u0026gt; CDN -\u0026gt; 源站资源 3 http://www.example.com\n或\nwww.example.com 起点 -\u0026gt; CDN（301 https://www.example.com）\nhttps://www.example.com -\u0026gt; CDN -\u0026gt; 源站资源 2 https://example.com 起点 -\u0026gt; CDN -\u0026gt; 源站（301 https://www.example.com）\nhttps://www.example.com -\u0026gt; CDN -\u0026gt; 源站资源 2 https://www.example.com 起点 -\u0026gt; CDN -\u0026gt; 源站资源 1 应急解决方案（保证可用性；前提：Nginx配置与本方案的源站配置相同） SSL出现问题 步骤一：修改CDN的HTTPS配置 ​\t关闭强制跳转\n步骤二：修改 /etc/nginx/conf.d/default.conf ​\t先注释return 301 https://$server_name$request_uri;，然后再将关于资源的配置（比如location, proxy等等）从server4拷贝到server2\n​\t示例：\n#server2 http://www.example.com server { listen 80; server_name www.example.com; #return 301 https://$server_name$request_uri; location / { root /usr/share/nginx/html; index index.html index.htm; } } ​\t通过以上两步，即可使源站恢复正常工作。\nCDN出现问题 步骤一：修改域名解析记录 记录类型 主机记录 解析线路 记录值 TTL CNAME www 默认 www.example.com.cdn.dnsv1.com（示例；实际以CDN控制台的为准） 10分钟 CNAME @ 默认 www.example.com 10分钟 A www 默认 1.1.1.1（源站IP） 10分钟 ​\t仅需一步，即可使源站恢复正常工作。\n方案二 源站配置（以Nginx为例） ​\t关于www和naked域名的重新向以及https的解决方案（以Nginx为例） - 西叉的代码屋 (caoxuan.top)\nCDN配置（以腾讯云为例） 基础配置（同方案一） ​\t加速域名：www.example.com\n​\t源站类型：自有源\n​\t回源协议：协议跟随\n​\t源站地址：1.1.1.1（源站IP）\n​\t回源HOST：www.example.com\nHTTPS配置 强制跳转 ​\t跳转配置：开\n​\t跳转类型：http-\u0026gt;https\n​\t跳转方式：301跳转\n​\t携带头部：否\nDNS配置（以阿里云为例） 记录类型 主机记录 解析线路 记录值 TTL CNAME www 默认 www.example.com.cdn.dnsv1.com（示例；实际以CDN控制台的为准） 10分钟 显性URL @ 默认 301 http://www.example.com 10分钟 路径表 起点 过程 浏览器请求次数 http://example.com或example.com 起点 -\u0026gt; CDN（301 https://example.com） https://example.com -\u0026gt; CDN -\u0026gt; 源站（301 https://www.example.com）\nhttps://www.example.com -\u0026gt; CDN -\u0026gt; 源站资源 3 http://www.example.com或www.example.com 起点 -\u0026gt; CDN（301 https://www.example.com）\nhttps://www.example.com -\u0026gt; CDN -\u0026gt; 源站资源 2 https://example.com 无法访问 0 https://www.example.com 起点 -\u0026gt; CDN -\u0026gt; 源站资源 1 应急解决方案（保证可用性；前提：Nginx配置与本方案的源站配置相同） SSL出现问题 步骤一：修改CDN的HTTPS配置 ​\t关闭强制跳转\n步骤二：修改 /etc/nginx/conf.d/default.conf ​\t先注释return 301 https://$server_name$request_uri;，然后再将关于资源的配置（比如location, proxy等等）从server4拷贝到server2\n​\t示例：\n#server2 http://www.example.com server { listen 80; server_name www.example.com; #return 301 https://$server_name$request_uri; location / { root /usr/share/nginx/html; index index.html index.htm; } } ​\t通过以上两步，即可使源站恢复正常工作。\nCDN出现问题 步骤一：修改域名解析记录 记录类型 主机记录 解析线路 记录值 TTL CNAME www 默认 www.example.com.cdn.dnsv1.com（示例；实际以CDN控制台的为准） 10分钟 显性URL @ 默认 301 http://www.example.com 10分钟 A www 默认 1.1.1.1（源站IP） 10分钟 ​\t仅需一步，即可使源站恢复正常工作。\n方案三 源站配置（以Nginx为例） ​\t关于www和naked域名的重新向以及https的解决方案（以Nginx为例） - 西叉的代码屋 (caoxuan.top)\nCDN配置（以腾讯云为例） 基础配置（同方案一） ​\t加速域名：www.example.com\n​\t源站类型：自有源\n​\t回源协议：协议跟随\n​\t源站地址：1.1.1.1（源站IP）\n​\t回源HOST：www.example.com\nHTTPS配置 强制跳转 ​\t跳转配置：开\n​\t跳转类型：http-\u0026gt;https\n​\t跳转方式：301跳转\n​\t携带头部：否\nDNS配置（以阿里云为例） 记录类型 主机记录 解析线路 记录值 TTL CNAME www 默认 www.example.com.cdn.dnsv1.com（示例值；实际以CDN控制台的为准） 10分钟 A @ 默认 0.0.0.0（中转服务器的IP） 10分钟 中转服务器配置（以Nginx为例） ​\tvim /etc/nginx/conf.d/default.conf\n#http://example.com server { listen 80; server_name example.com; return 301 http://www.example.com$request_uri; } #https://example.com server { listen 443; server_name example.com; ssl_certificate 0000000_example.com.pem; ssl_certificate_key 0000000_example.com.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; return 301 https://www.example.com$request_uri; } 路径表 起点 过程 浏览器请求次数 http://example.com\n或\nexample.com 起点 -\u0026gt; 中转服务器（301 http://www.example.com） http://www.example.com \u0026ndash;CDN（301 https://www.example.com） https://www.example.com -\u0026gt; CDN -\u0026gt; 源站资源 3 http://www.example.com\n或\nwww.example.com 起点 -\u0026gt; CDN（301 https://www.example.com）\nhttps://www.example.com -\u0026gt; CDN -\u0026gt; 源站资源 2 https://example.com 起点 -\u0026gt; 中转服务器（301 https://www.example.com）\nhttps://www.example.com -\u0026gt; CDN -\u0026gt; 源站资源 2 https://www.example.com 起点 -\u0026gt; CDN -\u0026gt; 源站资源 1 应急解决方案（保证可用性；前提：Nginx配置与本方案的源站配置相同） SSL出现问题 步骤一：修改CDN的HTTPS配置 ​\t关闭强制跳转\n步骤二：修改 /etc/nginx/conf.d/default.conf ​\t先注释return 301 https://$server_name$request_uri;，然后再将关于资源的配置（比如location, proxy等等）从server4拷贝到server2\n​\t示例：\n#server2 http://www.example.com server { listen 80; server_name www.example.com; #return 301 https://$server_name$request_uri; location / { root /usr/share/nginx/html; index index.html index.htm; } } ​\t通过以上两步，即可使源站恢复正常工作。\nCDN出现问题 步骤一：修改域名解析记录 记录类型 主机记录 解析线路 记录值 TTL CNAME www 默认 www.example.com.cdn.dnsv1.com（示例值；实际以CDN控制台的为准） 10分钟 A @ 默认 0.0.0.0（中转服务器的IP） 10分钟 A www 默认 1.1.1.1（源站IP） 10分钟 ​\t仅需一步，即可使源站恢复正常工作。\n鄙人才疏学浅，如有错误，欢迎指出。\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-05-04-configure-nginx-domain-redirects-https-and-cdn/","summary":"\u003c!--markdown--\u003e# 关于在Nginx中配置顶级域名与www域名之间跳转以及https和如何搭配CDN的综合解决方案\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003e方案一\u003c/strong\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003e方案二\u003c/strong\u003e（不推荐）\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003e方案三\u003c/strong\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e使用场景\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e一般情况\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e顶级域名存在邮件服务\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e顶级域名存在邮件服务\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e相对复杂度\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e低\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e中\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e高\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e终点\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e\u003ccode\u003ehttps://www.example.com\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e\u003ccode\u003ehttps://www.example.com\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e\u003ccode\u003ehttps://www.example.com\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e隐藏源站IP\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e是\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e是\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e是\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e相对可用性\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e高\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e低\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e高\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e缺点\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e无法在顶级域名存在邮件服务的情况下使用\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e无法直接访问\u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e成本略高，配置麻烦\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e特殊要求\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e无\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e要求DNS服务商支持显性URL转发\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e需要一台代理服务器\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"方案一\"\u003e方案一\u003c/h2\u003e\n\u003ch3 id=\"源站配置以nginx为例\"\u003e源站配置（以Nginx为例）\u003c/h3\u003e\n\u003cp\u003e​\t\t\u003ca href=\"https://www.caoxuan.top/index.php/archives/20/\"\u003e关于www和naked域名的重新向以及https的解决方案（以Nginx为例） - 西叉的代码屋 (caoxuan.top)\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"cdn配置以腾讯云为例\"\u003eCDN配置（以腾讯云为例）\u003c/h3\u003e\n\u003ch4 id=\"基础配置\"\u003e基础配置\u003c/h4\u003e\n\u003cp\u003e​\t\t\t\u003cstrong\u003e加速域名\u003c/strong\u003e：\u003ccode\u003ewww.example.com\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e​\t\t\t\u003cstrong\u003e源站类型\u003c/strong\u003e：自有源\u003c/p\u003e\n\u003cp\u003e​\t\t\t\u003cstrong\u003e回源协议\u003c/strong\u003e：协议跟随\u003c/p\u003e\n\u003cp\u003e​\t\t\t\u003cstrong\u003e源站地址\u003c/strong\u003e：1.1.1.1（源站IP）\u003c/p\u003e\n\u003cp\u003e​\t\t\t\u003cstrong\u003e回源HOST\u003c/strong\u003e：\u003ccode\u003ewww.example.com\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"https配置\"\u003eHTTPS配置\u003c/h4\u003e\n\u003ch5 id=\"强制跳转\"\u003e强制跳转\u003c/h5\u003e\n\u003cp\u003e​\t\t\t\t\u003cstrong\u003e跳转配置\u003c/strong\u003e：开\u003c/p\u003e\n\u003cp\u003e​\t\t\t\t\u003cstrong\u003e跳转类型\u003c/strong\u003e：http-\u0026gt;https\u003c/p\u003e\n\u003cp\u003e​\t\t\t\t\u003cstrong\u003e跳转方式\u003c/strong\u003e：301跳转\u003c/p\u003e\n\u003cp\u003e​\t\t\t\t\u003cstrong\u003e携带头部\u003c/strong\u003e：否\u003c/p\u003e\n\u003ch3 id=\"dns配置以阿里云为例\"\u003eDNS配置（以阿里云为例）\u003c/h3\u003e\n\u003cp\u003e​\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003e记录类型\u003c/strong\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003e主机记录\u003c/strong\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003e解析线路\u003c/strong\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003e记录值\u003c/strong\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003eTTL\u003c/strong\u003e\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eCNAME\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003ewww\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e默认\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e\u003ccode\u003ewww.example.com.cdn.dnsv1.com\u003c/code\u003e（示例；实际以CDN控制台的为准）\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e10分钟\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eCNAME\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e@\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e默认\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e\u003ccode\u003ewww.example.com\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e10分钟\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3\u003e\u003c/h3\u003e\n\u003chr\u003e\n\u003ch3 id=\"路径表\"\u003e路径表\u003c/h3\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003e起点\u003c/strong\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e\u003cstrong\u003e过程\u003c/strong\u003e\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e浏览器请求次数\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e\u003ccode\u003ehttp://example.com\u003c/code\u003e\u003cbr /\u003e或\u003cbr /\u003e\u003ccode\u003eexample.com\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e起点 -\u0026gt; CDN（301 \u003ccode\u003ehttps://example.com\u003c/code\u003e）\u003cbr /\u003e\u003ccode\u003ehttps://example.com\u003c/code\u003e -\u0026gt; CDN -\u0026gt; 源站（301 \u003ccode\u003ehttps://www.example.com\u003c/code\u003e）\u003cbr /\u003e\u003ccode\u003ehttps://www.example.com\u003c/code\u003e -\u0026gt; CDN -\u0026gt; 源站资源\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e3\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e\u003ccode\u003ehttp://www.example.com\u003c/code\u003e\u003cbr /\u003e或\u003cbr /\u003e\u003ccode\u003ewww.example.com\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e起点 -\u0026gt; CDN（301 \u003ccode\u003ehttps://www.example.com\u003c/code\u003e）\u003cbr /\u003e\u003ccode\u003ehttps://www.example.com\u003c/code\u003e -\u0026gt; CDN -\u0026gt; 源站资源\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e\u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e起点 -\u0026gt; CDN -\u0026gt; 源站（301 \u003ccode\u003ehttps://www.example.com\u003c/code\u003e）\u003cbr /\u003e\u003ccode\u003ehttps://www.example.com\u003c/code\u003e -\u0026gt; CDN -\u0026gt; 源站资源\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e\u003ccode\u003ehttps://www.example.com\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003e起点 -\u0026gt; CDN -\u0026gt;  源站资源\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e1\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3\u003e\u003c/h3\u003e\n\u003ch3 id=\"应急解决方案保证可用性前提nginx配置与本方案的源站配置相同\"\u003e应急解决方案（保证可用性；前提：Nginx配置与本方案的源站配置相同）\u003c/h3\u003e\n\u003ch4 id=\"ssl出现问题\"\u003eSSL出现问题\u003c/h4\u003e\n\u003ch5 id=\"步骤一修改cdn的https配置\"\u003e步骤一：修改CDN的HTTPS配置\u003c/h5\u003e\n\u003cp\u003e​\t\t\t关闭强制跳转\u003c/p\u003e","title":"关于在Nginx中配置顶级域名与www域名之间跳转以及https和如何搭配CDN的综合解决方案"},{"content":"以下是nginx的相关配置 #server1 http://example.com server { listen 80; server_name example.com; return 301 http://www.example.com$request_uri; } #server2 http://www.example.com server { listen 80; server_name www.example.com; return 301 https://$server_name$request_uri; } #server3 https://example.com server { listen 443 ssl http2; server_name example.com; ssl_certificate 0000000_example.com.pem; ssl_certificate_key 0000000_example.com.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; return 301 https://www.example.com$request_uri; } #server4 https://www.example.com server { listen 443 ssl ; server_name www.example.com; ssl_certificate 0000000_example.com.pem; ssl_certificate_key 0000000_example.com.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; location / { root /usr/share/nginx/html; index index.html index.htm; }\t} FAQs Q：为什么要重定向多次？而不直接重定向到 https://www.example.com ？\nA：为了降低出错后的维护成本，当ssl出现问题时，只需修改一个server（server2）即可以http的方式访问，从而恢复正常工作。\nQ：这样做对SEO有影响吗？\nA：鄙人才疏学浅，请自行查阅资料了解。目前看来，使用Google可以搜索到本站的内容，但是某度却不行。\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-05-04-configure-www-and-apex-domain-https-redirects-with-nginx/","summary":"\u003c!--markdown--\u003e以下是nginx的相关配置\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#server1 http://example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eserver\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003elisten\u003c/span\u003e       \u003cspan style=\"color:#ae81ff\"\u003e80\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003eserver_name\u003c/span\u003e  \u003cspan style=\"color:#e6db74\"\u003eexample.com\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e301\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003ehttp://www.example.com\u003c/span\u003e$request_uri;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#server2 http://www.example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eserver\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003elisten\u003c/span\u003e       \u003cspan style=\"color:#ae81ff\"\u003e80\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003eserver_name\u003c/span\u003e  \u003cspan style=\"color:#e6db74\"\u003ewww.example.com\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e301\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003ehttps://\u003c/span\u003e$server_name$request_uri;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#server3 https://example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eserver\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003elisten\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e443\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003essl\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003ehttp2\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003eserver_name\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eexample.com\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003essl_certificate\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e0000000_example.com.pem\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003essl_certificate_key\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e0000000_example.com.key\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003essl_session_cache\u003c/span\u003e   \u003cspan style=\"color:#e6db74\"\u003eshared:SSL:10m\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003essl_session_timeout\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e10m\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003essl_protocols\u003c/span\u003e  \u003cspan style=\"color:#e6db74\"\u003eTLSv1.2\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eTLSv1.3\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e301\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003ehttps://www.example.com\u003c/span\u003e$request_uri;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#server4 https://www.example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eserver\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003elisten\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e443\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003essl\u003c/span\u003e ;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003eserver_name\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003ewww.example.com\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003essl_certificate\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e0000000_example.com.pem\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003essl_certificate_key\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e0000000_example.com.key\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003essl_session_cache\u003c/span\u003e   \u003cspan style=\"color:#e6db74\"\u003eshared:SSL:10m\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003essl_session_timeout\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e10m\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003essl_protocols\u003c/span\u003e  \u003cspan style=\"color:#e6db74\"\u003eTLSv1.2\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eTLSv1.3\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#f92672\"\u003elocation\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e/\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#f92672\"\u003eroot\u003c/span\u003e   \u003cspan style=\"color:#e6db74\"\u003e/usr/share/nginx/html\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003eindex\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eindex.html\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eindex.htm\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"faqs\"\u003eFAQs\u003c/h2\u003e\n\u003cp\u003eQ：为什么要重定向多次？而不直接重定向到 \u003ca href=\"https://www.example.com\"\u003ehttps://www.example.com\u003c/a\u003e ？\u003c/p\u003e\n\u003cp\u003eA：为了降低出错后的维护成本，当ssl出现问题时，只需修改一个server（server2）即可以http的方式访问，从而恢复正常工作。\u003c/p\u003e\n\u003cp\u003eQ：这样做对SEO有影响吗？\u003c/p\u003e\n\u003cp\u003eA：鄙人才疏学浅，请自行查阅资料了解。目前看来，使用Google可以搜索到本站的内容，但是某度却不行。\u003c/p\u003e","title":"关于www和naked域名的重新向以及https的解决方案（以Nginx为例）"},{"content":"**原因分析**：fastjson在反序列化时用的默认使用无参构造方法和getter与setter来构造对象，如果缺少无参构造方法，则会使用当前存在的构造方法（这个构造方法的参数可能不齐全）来构造对象。 解决方案：如果使用了Lombok，就在相应的实体类上添加注解*@NoArgsConstructor*；否则就手动重写无参构造方法。\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-04-19-fix-missing-property-values-after-fastjson-deserialization/","summary":"\u003c!--markdown--\u003e**原因分析**：fastjson在反序列化时用的默认使用无参构造方法和getter与setter来构造对象，如果缺少无参构造方法，则会使用当前存在的构造方法（这个构造方法的参数可能不齐全）来构造对象。\n\u003cp\u003e\u003cstrong\u003e解决方案\u003c/strong\u003e：如果使用了Lombok，就在相应的实体类上添加注解*@NoArgsConstructor*；否则就手动重写无参构造方法。\u003c/p\u003e","title":"fastjson反序列化后缺失属性值"},{"content":"![QQ截图20210415162531.png][1] 检查对应的item，将android:layout_height=\u0026ldquo;match_parent\u0026quot;改为android:layout_height=\u0026ldquo;wrap_content\u0026rdquo;。\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-04-15-fix-recyclerview-showing-only-one-item/","summary":"\u003c!--markdown--\u003e![QQ截图20210415162531.png][1]\n\u003cp\u003e检查对应的item，将android:layout_height=\u0026ldquo;match_parent\u0026quot;改为android:layout_height=\u0026ldquo;wrap_content\u0026rdquo;。\u003c/p\u003e","title":"RecyclerView只显示一条数据"},{"content":"```java package algorithm.loadbalance;\nimport com.alibaba.fastjson.JSON;\nimport java.util.*;\n/**\n@author Cao Xuan\n@date 2021/3/21 20:04\n@update 2021/5/5 */ public class LoadBalanceDemo {\nprivate final List serverList = new ArrayList\u0026lt;\u0026gt;();\n/**\nclient -\u0026gt; server */ private final Map\u0026lt;Client, Server\u0026gt; clientServerMap = new HashMap\u0026lt;\u0026gt;(); /**\n\u0026lt;\u0026mdash;head\u0026mdash;tail\u0026mdash;\u0026gt; \u0026lt;\u0026mdash;light\u0026mdash;weight\u0026mdash;\u0026gt; \u0026lt;\u0026mdash;former\u0026mdash;latter\u0026ndash;\u0026gt; */ @Deprecated private void sort() { for (int i = serverList.size() - 1; i \u0026gt; 0; i\u0026ndash;) { for (int j = i - 1; j \u0026gt; -1; j\u0026ndash;) { Server latter = new Server(serverList.get(i)); Server former = new Server(serverList.get(j)); if (latter.getCurrentLoad().size() \u0026gt; former.getCurrentLoad().size()) { serverList.set(i, former); serverList.set(j, latter); } } } System.out.println(\u0026ldquo;sorting\u0026hellip;\u0026rdquo;); } /**\n\u0026lt;\u0026mdash;head\u0026mdash;tail\u0026mdash;\u0026gt; \u0026lt;\u0026mdash;light\u0026mdash;weight\u0026mdash;\u0026gt; \u0026lt;\u0026mdash;former\u0026mdash;latter\u0026ndash;\u0026gt; */ private void leafShift() { int size = serverList.size(); for (int i = size - 2; i \u0026gt;= 0; i\u0026ndash;) { Server latter = new Server(serverList.get(size - 1)); Server former = new Server(serverList.get(i)); if (latter.getCurrentLoad().size() \u0026gt; former.getCurrentLoad().size()) { serverList.set(size - 1, former); serverList.set(i, latter); System.out.println(\u0026ldquo;leaf shift\u0026rdquo;); } } } private void rightShift(int index) { int size = serverList.size(); for (int i = index + 1; i \u0026lt; size; i++) { Server former = new Server(serverList.get(index)); Server latter = new Server(serverList.get(i)); if (former.getCurrentLoad().size() \u0026lt; latter.getCurrentLoad().size()) { serverList.set(i, former); serverList.set(index, latter); System.out.println(\u0026ldquo;right shift\u0026rdquo;); } } }\npublic Server addClient(Client client) { if (serverList.size() \u0026gt; 0) { Server server = new Server(serverList.get(serverList.size() - 1)); String serverName = server.getName(); serverList.get(serverList.size() - 1).updateCurrentLoad(client); System.out.println(\u0026ldquo;Hi,[\u0026rdquo; + client.getUsername() + \u0026ldquo;]. Assign [\u0026rdquo; + serverName + \u0026ldquo;] to you\u0026rdquo;); leafShift(); show(); return server; } else { System.err.println(\u0026ldquo;no server\u0026rdquo;); return null; } }\npublic void removeClient(String clientName) { Server server = clientServerMap.get(new Client(clientName)); int index = serverList.indexOf(server); if (-1 != index) { server.currentLoad.remove(new Client(clientName)); rightShift(index); System.out.println(\u0026ldquo;remove a client [\u0026rdquo; + clientName + \u0026ldquo;]\u0026rdquo;); } else { System.err.println(\u0026ldquo;index = -1\u0026rdquo;); }\nshow(); }\npublic void addServer(String name) { Server server = new Server(name, new HashSet\u0026lt;\u0026gt;()); if (serverList.contains(server)) { System.err.println(\u0026ldquo;The server [\u0026rdquo; + name + \u0026ldquo;] already exists\u0026rdquo;); show(); return; } serverList.add(server); System.out.println(\u0026ldquo;add a server [\u0026rdquo; + name + \u0026ldquo;]\u0026rdquo;); show(); }\npublic void removeServer(String serverName) { serverList.remove(new Server(serverName)); System.out.println(\u0026ldquo;add a server [\u0026rdquo; + serverName + \u0026ldquo;]\u0026rdquo;); show(); }\nprivate static class Client {\nprivate String username; public Client(String username) { this.username = username; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public boolean equals(Object obj) { if (!(obj instanceof Client)) { return false; } Client client = (Client) obj; return this.getUsername().equals(client.getUsername()); } @Override public int hashCode() { return Objects.hash(username); } @Override public String toString() { return JSON.toJSONString(this); } }\nprivate static class Server {\nprivate String name; private Set\u0026lt;Client\u0026gt; currentLoad; public Server(String name) { this.name = name; } public Server(Server server) { this.name = server.name; this.currentLoad = server.currentLoad; } public Server(String name, Set\u0026lt;Client\u0026gt; currentLoad) { this.name = name; this.currentLoad = currentLoad; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set\u0026lt;Client\u0026gt; getCurrentLoad() { return currentLoad; } public void setCurrentLoad(Set\u0026lt;Client\u0026gt; currentLoad) { this.currentLoad = currentLoad; } public void updateCurrentLoad(Client client) { this.currentLoad.add(client); } @Override public boolean equals(Object obj) { if (!(obj instanceof Server)) { return false; } Server server = (Server) obj; return this.getName().equals(server.getName()); } @Override public String toString() { return JSON.toJSONString(this); } }\npublic static void main(String[] args) {\nLoadBalanceDemo loadBalanceDemo = new LoadBalanceDemo(); System.out.println(\u0026quot;---------------USAGE--------------\u0026quot;); System.out.println(\u0026quot;Add a server: [s+${serverName}]\u0026quot;); System.out.println(\u0026quot;Add a client: [c+${clientName}]\u0026quot;); System.out.println(\u0026quot;Remove a server: [s-${serverName}]\u0026quot;); System.out.println(\u0026quot;Remove a client: [c-${clientName}]\u0026quot;); System.out.println(\u0026quot;Show Current Load: [show]\u0026quot;); System.out.println(\u0026quot;---------------USAGE--------------\u0026quot;); while (true) { System.out.println(\u0026quot;ready\u0026quot;); System.out.println(); Scanner scanner = new Scanner(System.in); String s = scanner.next(); if (\u0026quot;show\u0026quot;.equals(s)) { loadBalanceDemo.show(); } else if (s.startsWith(\u0026quot;c+\u0026quot;)) { String clientName = s.substring(2); Client client = new Client(clientName); Server server = loadBalanceDemo.addClient(client); loadBalanceDemo.clientServerMap.put(client, server); } else if (s.startsWith(\u0026quot;s+\u0026quot;)) { String serverName = s.substring(2); loadBalanceDemo.addServer(serverName); } else if (s.startsWith(\u0026quot;c-\u0026quot;)) { String clientName = s.substring(2); loadBalanceDemo.removeClient(clientName); } else if (s.startsWith(\u0026quot;s-\u0026quot;)) { String serverName = s.substring(2); loadBalanceDemo.removeServer(serverName); } else { System.out.println(\u0026quot;?\u0026quot;); } System.out.println(\u0026quot;----------------------------------\u0026quot;); } }\nprivate void show() { System.out.println(\u0026ldquo;current load \u0026quot; + serverList); } }\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-03-21-a-simple-load-balancing-implementation/","summary":"\u003c!--markdown--\u003e```java\n\u003cp\u003epackage algorithm.loadbalance;\u003c/p\u003e\n\u003cp\u003eimport com.alibaba.fastjson.JSON;\u003c/p\u003e\n\u003cp\u003eimport java.util.*;\u003c/p\u003e\n\u003cp\u003e/**\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e@author Cao Xuan\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@date 2021/3/21 20:04\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e@update 2021/5/5\n*/\npublic class LoadBalanceDemo {\u003c/p\u003e\n\u003cp\u003eprivate final List\u003cServer\u003e serverList = new ArrayList\u0026lt;\u0026gt;();\u003c/p\u003e\n\u003cp\u003e/**\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eclient -\u0026gt; server\n*/\nprivate final Map\u0026lt;Client, Server\u0026gt; clientServerMap = new HashMap\u0026lt;\u0026gt;();\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e/**\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026lt;\u0026mdash;head\u0026mdash;tail\u0026mdash;\u0026gt;\u003c/li\u003e\n\u003cli\u003e\u0026lt;\u0026mdash;light\u0026mdash;weight\u0026mdash;\u0026gt;\u003c/li\u003e\n\u003cli\u003e\u0026lt;\u0026mdash;former\u0026mdash;latter\u0026ndash;\u0026gt;\n*/\n@Deprecated\nprivate void sort() {\nfor (int i = serverList.size() - 1; i \u0026gt; 0; i\u0026ndash;) {\nfor (int j = i - 1; j \u0026gt; -1; j\u0026ndash;) {\nServer latter = new Server(serverList.get(i));\nServer former = new Server(serverList.get(j));\nif (latter.getCurrentLoad().size() \u0026gt; former.getCurrentLoad().size()) {\nserverList.set(i, former);\nserverList.set(j, latter);\n}\n}\n}\nSystem.out.println(\u0026ldquo;sorting\u0026hellip;\u0026rdquo;);\n}\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e/**\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026lt;\u0026mdash;head\u0026mdash;tail\u0026mdash;\u0026gt;\u003c/li\u003e\n\u003cli\u003e\u0026lt;\u0026mdash;light\u0026mdash;weight\u0026mdash;\u0026gt;\u003c/li\u003e\n\u003cli\u003e\u0026lt;\u0026mdash;former\u0026mdash;latter\u0026ndash;\u0026gt;\n*/\nprivate void leafShift() {\nint size = serverList.size();\nfor (int i = size - 2; i \u0026gt;= 0; i\u0026ndash;) {\nServer latter = new Server(serverList.get(size - 1));\nServer former = new Server(serverList.get(i));\nif (latter.getCurrentLoad().size() \u0026gt; former.getCurrentLoad().size()) {\nserverList.set(size - 1, former);\nserverList.set(i, latter);\nSystem.out.println(\u0026ldquo;leaf shift\u0026rdquo;);\n}\n}\n}\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eprivate void rightShift(int index) {\nint size = serverList.size();\nfor (int i = index + 1; i \u0026lt; size; i++) {\nServer former = new Server(serverList.get(index));\nServer latter = new Server(serverList.get(i));\nif (former.getCurrentLoad().size() \u0026lt; latter.getCurrentLoad().size()) {\nserverList.set(i, former);\nserverList.set(index, latter);\nSystem.out.println(\u0026ldquo;right shift\u0026rdquo;);\n}\n}\n}\u003c/p\u003e\n\u003cp\u003epublic Server addClient(Client client) {\nif (serverList.size() \u0026gt; 0) {\nServer server = new Server(serverList.get(serverList.size() - 1));\nString serverName = server.getName();\nserverList.get(serverList.size() - 1).updateCurrentLoad(client);\nSystem.out.println(\u0026ldquo;Hi,[\u0026rdquo; + client.getUsername() + \u0026ldquo;]. Assign [\u0026rdquo; + serverName + \u0026ldquo;] to you\u0026rdquo;);\nleafShift();\nshow();\nreturn server;\n} else {\nSystem.err.println(\u0026ldquo;no server\u0026rdquo;);\nreturn null;\n}\n}\u003c/p\u003e\n\u003cp\u003epublic void removeClient(String clientName) {\nServer server = clientServerMap.get(new Client(clientName));\nint index = serverList.indexOf(server);\nif (-1 != index) {\nserver.currentLoad.remove(new Client(clientName));\nrightShift(index);\nSystem.out.println(\u0026ldquo;remove a client [\u0026rdquo; + clientName + \u0026ldquo;]\u0026rdquo;);\n} else {\nSystem.err.println(\u0026ldquo;index = -1\u0026rdquo;);\n}\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e show();\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003epublic void addServer(String name) {\nServer server = new Server(name, new HashSet\u0026lt;\u0026gt;());\nif (serverList.contains(server)) {\nSystem.err.println(\u0026ldquo;The server [\u0026rdquo; + name + \u0026ldquo;] already exists\u0026rdquo;);\nshow();\nreturn;\n}\nserverList.add(server);\nSystem.out.println(\u0026ldquo;add a server [\u0026rdquo; + name + \u0026ldquo;]\u0026rdquo;);\nshow();\n}\u003c/p\u003e\n\u003cp\u003epublic void removeServer(String serverName) {\nserverList.remove(new Server(serverName));\nSystem.out.println(\u0026ldquo;add a server [\u0026rdquo; + serverName + \u0026ldquo;]\u0026rdquo;);\nshow();\n}\u003c/p\u003e\n\u003cp\u003eprivate static class Client {\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e private String username;\n\n public Client(String username) {\n     this.username = username;\n }\n\n public String getUsername() {\n     return username;\n }\n\n public void setUsername(String username) {\n     this.username = username;\n }\n\n @Override\n public boolean equals(Object obj) {\n     if (!(obj instanceof Client)) {\n         return false;\n     }\n     Client client = (Client) obj;\n     return this.getUsername().equals(client.getUsername());\n }\n\n @Override\n public int hashCode() {\n     return Objects.hash(username);\n }\n\n @Override\n public String toString() {\n     return JSON.toJSONString(this);\n }\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003eprivate static class Server {\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e private String name;\n\n private Set\u0026lt;Client\u0026gt; currentLoad;\n\n public Server(String name) {\n     this.name = name;\n }\n\n public Server(Server server) {\n     this.name = server.name;\n     this.currentLoad = server.currentLoad;\n }\n\n public Server(String name, Set\u0026lt;Client\u0026gt; currentLoad) {\n     this.name = name;\n     this.currentLoad = currentLoad;\n }\n\n public String getName() {\n     return name;\n }\n\n public void setName(String name) {\n     this.name = name;\n }\n\n public Set\u0026lt;Client\u0026gt; getCurrentLoad() {\n     return currentLoad;\n }\n\n public void setCurrentLoad(Set\u0026lt;Client\u0026gt; currentLoad) {\n     this.currentLoad = currentLoad;\n }\n\n public void updateCurrentLoad(Client client) {\n     this.currentLoad.add(client);\n }\n\n @Override\n public boolean equals(Object obj) {\n     if (!(obj instanceof Server)) {\n         return false;\n     }\n     Server server = (Server) obj;\n     return this.getName().equals(server.getName());\n }\n\n @Override\n public String toString() {\n     return JSON.toJSONString(this);\n }\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003epublic static void main(String[] args) {\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e LoadBalanceDemo loadBalanceDemo = new LoadBalanceDemo();\n\n System.out.println(\u0026quot;---------------USAGE--------------\u0026quot;);\n System.out.println(\u0026quot;Add a server: [s+${serverName}]\u0026quot;);\n System.out.println(\u0026quot;Add a client: [c+${clientName}]\u0026quot;);\n System.out.println(\u0026quot;Remove a server: [s-${serverName}]\u0026quot;);\n System.out.println(\u0026quot;Remove a client: [c-${clientName}]\u0026quot;);\n System.out.println(\u0026quot;Show Current Load: [show]\u0026quot;);\n System.out.println(\u0026quot;---------------USAGE--------------\u0026quot;);\n\n while (true) {\n     System.out.println(\u0026quot;ready\u0026quot;);\n     System.out.println();\n     Scanner scanner = new Scanner(System.in);\n     String s = scanner.next();\n     if (\u0026quot;show\u0026quot;.equals(s)) {\n         loadBalanceDemo.show();\n     } else if (s.startsWith(\u0026quot;c+\u0026quot;)) {\n         String clientName = s.substring(2);\n         Client client = new Client(clientName);\n         Server server = loadBalanceDemo.addClient(client);\n         loadBalanceDemo.clientServerMap.put(client, server);\n     } else if (s.startsWith(\u0026quot;s+\u0026quot;)) {\n         String serverName = s.substring(2);\n         loadBalanceDemo.addServer(serverName);\n     } else if (s.startsWith(\u0026quot;c-\u0026quot;)) {\n         String clientName = s.substring(2);\n         loadBalanceDemo.removeClient(clientName);\n     } else if (s.startsWith(\u0026quot;s-\u0026quot;)) {\n         String serverName = s.substring(2);\n         loadBalanceDemo.removeServer(serverName);\n     } else {\n         System.out.println(\u0026quot;?\u0026quot;);\n     }\n     System.out.println(\u0026quot;----------------------------------\u0026quot;);\n }\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003eprivate void show() {\nSystem.out.println(\u0026ldquo;current load \u0026quot; + serverList);\n}\n}\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"简单实现负载均衡"},{"content":"参考https://chaolucky.com/blog/12/03-927.html sudo cp /var/packages/Git/target/webapi/SYNO.Git.lib /var/packages/Git/target/webapi/SYNO.Git.lib.bak sudo vi /var/packages/Git/target/webapi/SYNO.Git.lib 删掉appPriv 之后的SYNO.SDS.GIT.Instance 保存退出\n","permalink":"https://blog.imcaoxuan.cn/posts/2021-02-26-fix-empty-user-list-in-synology-git-server/","summary":"\u003c!--markdown--\u003e参考https://chaolucky.com/blog/12/03-927.html\n\u003cp\u003esudo cp /var/packages/Git/target/webapi/SYNO.Git.lib /var/packages/Git/target/webapi/SYNO.Git.lib.bak\nsudo vi /var/packages/Git/target/webapi/SYNO.Git.lib\n删掉appPriv 之后的SYNO.SDS.GIT.Instance\n保存退出\u003c/p\u003e","title":"群晖 GitServer用户为空的解决办法"},{"content":"如果您看到这篇文章,表示您的 blog 已经安装成功.","permalink":"https://blog.imcaoxuan.cn/posts/2020-12-17-welcome-to-typecho/","summary":"\u003c!--markdown--\u003e如果您看到这篇文章,表示您的 blog 已经安装成功.","title":"欢迎使用 Typecho"}]