From 0819336279ae91a68eabb14f321afa14ed5a76dd Mon Sep 17 00:00:00 2001 From: sheepbox8646 Date: Thu, 23 Apr 2026 13:02:42 +0000 Subject: [PATCH] deploy: e1271467915ce28e9a3842cd5973380fedc727d4 --- 404.html | 4 ++-- about.html | 10 +++++----- ...ut.md.CYQE4Bs3.js => about.md.BjgA6DuA.js} | 2 +- ...4Bs3.lean.js => about.md.BjgA6DuA.lean.js} | 2 +- assets/{app.Bwo_ecyo.js => app.jjkGNkZc.js} | 2 +- ...9ac.js => blogs_2026-02-16.md.BNMeYY71.js} | 2 +- ...s => blogs_2026-02-16.md.BNMeYY71.lean.js} | 2 +- ...CzVqJnkf.js => blogs_index.md.BU7HIh5k.js} | 2 +- ...ean.js => blogs_index.md.BU7HIh5k.lean.js} | 2 +- ...Bj.js => channels_dingtalk.md.B5SBhtPg.js} | 2 +- ... => channels_dingtalk.md.B5SBhtPg.lean.js} | 2 +- ...cxj.js => channels_discord.md.nWxkk0E9.js} | 2 +- ...s => channels_discord.md.nWxkk0E9.lean.js} | 2 +- ...C8PR.js => channels_feishu.md.BdLiDNPX.js} | 2 +- ...js => channels_feishu.md.BdLiDNPX.lean.js} | 2 +- ...YUJgL.js => channels_index.md.BMhis6AA.js} | 2 +- ....js => channels_index.md.BMhis6AA.lean.js} | 2 +- ...m8OS.js => channels_matrix.md.DurhP29P.js} | 2 +- ...js => channels_matrix.md.DurhP29P.lean.js} | 2 +- ...OoQ.js => channels_misskey.md.K_p2b9tc.js} | 2 +- ...s => channels_misskey.md.K_p2b9tc.lean.js} | 2 +- ...BiHC52Zm.js => channels_qq.md.xrtB7-Cp.js} | 2 +- ...ean.js => channels_qq.md.xrtB7-Cp.lean.js} | 2 +- ...x2j2i.js => channels_slack.md.DJzfVI9g.js} | 2 +- ....js => channels_slack.md.DJzfVI9g.lean.js} | 2 +- ..._O.js => channels_telegram.md.DHWAMJPN.js} | 2 +- ... => channels_telegram.md.DHWAMJPN.lean.js} | 2 +- ...e9.js => channels_wechatoa.md.6qw2hORh.js} | 2 +- ... => channels_wechatoa.md.6qw2hORh.lean.js} | 2 +- ...BtNrz.js => channels_wecom.md.CvQSc0QF.js} | 2 +- ....js => channels_wecom.md.CvQSc0QF.lean.js} | 2 +- ...g7Ew.js => channels_weixin.md.NGCJG9Zr.js} | 2 +- ...js => channels_weixin.md.NGCJG9Zr.lean.js} | 2 +- .../chunks/@localSearchIndexroot.Bq5adVMH.js | 1 + .../chunks/@localSearchIndexroot.CEeliA4L.js | 1 - ...jlRfVe.js => VPLocalSearchBox.Bvi8a7xK.js} | 2 +- assets/chunks/framework.CAXxHpAX.js | 19 +++++++++++++++++++ assets/chunks/framework.DXGyWiRo.js | 19 ------------------- .../{theme.PItBixWd.js => theme.BAiG5Ik8.js} | 4 ++-- ... => getting-started_access.md.YqNM6CpY.js} | 2 +- ...etting-started_access.md.YqNM6CpY.lean.js} | 2 +- ....js => getting-started_bot.md.Cun_Y-ny.js} | 2 +- ...> getting-started_bot.md.Cun_Y-ny.lean.js} | 2 +- ...=> getting-started_browser.md.CjVL6wjg.js} | 2 +- ...tting-started_browser.md.CjVL6wjg.lean.js} | 2 +- ...> getting-started_channels.md.zZ6TuOep.js} | 2 +- ...ting-started_channels.md.zZ6TuOep.lean.js} | 2 +- ...getting-started_compaction.md.G9ICyEJo.js} | 2 +- ...ng-started_compaction.md.G9ICyEJo.lean.js} | 2 +- ... getting-started_container.md.CrcDm5m4.js} | 2 +- ...ing-started_container.md.CrcDm5m4.lean.js} | 2 +- ...s => getting-started_email.md.DN5WsFFI.js} | 2 +- ...getting-started_email.md.DN5WsFFI.lean.js} | 2 +- ...s => getting-started_files.md.Db2yzSPF.js} | 2 +- ...getting-started_files.md.Db2yzSPF.lean.js} | 2 +- ... getting-started_heartbeat.md.hEHFzwV2.js} | 2 +- ...ing-started_heartbeat.md.hEHFzwV2.lean.js} | 2 +- ....js => getting-started_mcp.md.BZLjLQ-y.js} | 2 +- ...> getting-started_mcp.md.BZLjLQ-y.lean.js} | 2 +- ... => getting-started_memory.md.5cl77orc.js} | 2 +- ...etting-started_memory.md.5cl77orc.lean.js} | 2 +- ...started_provider-and-model.md.ee3Zv59w.js} | 2 +- ...ed_provider-and-model.md.ee3Zv59w.lean.js} | 2 +- ...> getting-started_schedule.md.BgiO7WiT.js} | 2 +- ...ting-started_schedule.md.BgiO7WiT.lean.js} | 2 +- ...ng-started_search-provider.md.C6dGU9hk.js} | 2 +- ...arted_search-provider.md.C6dGU9hk.lean.js} | 2 +- ...> getting-started_sessions.md.MU-Cy0GW.js} | 2 +- ...ting-started_sessions.md.MU-Cy0GW.lean.js} | 2 +- ... => getting-started_skills.md.DTJvqMSO.js} | 2 +- ...etting-started_skills.md.DTJvqMSO.lean.js} | 2 +- ...ing-started_slash-commands.md.ChJs4d6R.js} | 2 +- ...tarted_slash-commands.md.ChJs4d6R.lean.js} | 2 +- ...etting-started_supermarket.md.BqLtu6vF.js} | 2 +- ...g-started_supermarket.md.BqLtu6vF.lean.js} | 2 +- ...ex.md.DtN_VGK2.js => index.md.DzWsM5pb.js} | 2 +- ...VGK2.lean.js => index.md.DzWsM5pb.lean.js} | 2 +- ....js => installation_docker.md.BgArxak6.js} | 2 +- ...> installation_docker.md.BgArxak6.lean.js} | 2 +- ...> memory-providers_builtin.md.EikeTjwl.js} | 2 +- ...ory-providers_builtin.md.EikeTjwl.lean.js} | 2 +- ... => memory-providers_index.md.Db8RSqmA.js} | 2 +- ...emory-providers_index.md.Db8RSqmA.lean.js} | 2 +- ...s => memory-providers_mem0.md.DpAU5KWk.js} | 2 +- ...memory-providers_mem0.md.DpAU5KWk.lean.js} | 2 +- ...emory-providers_openviking.md.CFYGljE_.js} | 2 +- ...-providers_openviking.md.CFYGljE_.lean.js} | 2 +- ...f.js => tts-providers_edge.md.BX5H-DX1.js} | 2 +- ...=> tts-providers_edge.md.BX5H-DX1.lean.js} | 2 +- ....js => tts-providers_index.md.D7QeNyIs.js} | 2 +- ...> tts-providers_index.md.D7QeNyIs.lean.js} | 2 +- ...cepts_identity-and-binding.md.CwjmC7t6.js} | 2 +- ..._identity-and-binding.md.CwjmC7t6.lean.js} | 2 +- ...kD.js => zh_concepts_index.md.C_YzW1PS.js} | 2 +- ... => zh_concepts_index.md.C_YzW1PS.lean.js} | 2 +- ...md.C-Pz2AC7.js => zh_index.md.DJw9w7T-.js} | 2 +- ...7.lean.js => zh_index.md.DJw9w7T-.lean.js} | 2 +- ...js => zh_style_terminology.md.DjkmyoSc.js} | 2 +- ... zh_style_terminology.md.DjkmyoSc.lean.js} | 2 +- blogs/2026-02-16.html | 10 +++++----- blogs/index.html | 10 +++++----- channels/dingtalk.html | 10 +++++----- channels/discord.html | 10 +++++----- channels/feishu.html | 10 +++++----- channels/index.html | 10 +++++----- channels/matrix.html | 10 +++++----- channels/misskey.html | 10 +++++----- channels/qq.html | 10 +++++----- channels/slack.html | 10 +++++----- channels/telegram.html | 10 +++++----- channels/wechatoa.html | 10 +++++----- channels/wecom.html | 10 +++++----- channels/weixin.html | 10 +++++----- getting-started/access.html | 10 +++++----- getting-started/bot.html | 10 +++++----- getting-started/browser.html | 10 +++++----- getting-started/channels.html | 10 +++++----- getting-started/compaction.html | 10 +++++----- getting-started/container.html | 10 +++++----- getting-started/email.html | 10 +++++----- getting-started/files.html | 10 +++++----- getting-started/heartbeat.html | 10 +++++----- getting-started/mcp.html | 10 +++++----- getting-started/memory.html | 10 +++++----- getting-started/provider-and-model.html | 10 +++++----- getting-started/schedule.html | 10 +++++----- getting-started/search-provider.html | 10 +++++----- getting-started/sessions.html | 10 +++++----- getting-started/skills.html | 10 +++++----- getting-started/slash-commands.html | 10 +++++----- getting-started/supermarket.html | 10 +++++----- hashmap.json | 2 +- index.html | 10 +++++----- installation/docker.html | 10 +++++----- memory-providers/builtin.html | 10 +++++----- memory-providers/index.html | 10 +++++----- memory-providers/mem0.html | 10 +++++----- memory-providers/openviking.html | 10 +++++----- tts-providers/edge.html | 10 +++++----- tts-providers/index.html | 10 +++++----- zh/concepts/identity-and-binding.html | 10 +++++----- zh/concepts/index.html | 10 +++++----- zh/index.html | 10 +++++----- zh/style/terminology.html | 10 +++++----- 144 files changed, 342 insertions(+), 342 deletions(-) rename assets/{about.md.CYQE4Bs3.js => about.md.BjgA6DuA.js} (98%) rename assets/{about.md.CYQE4Bs3.lean.js => about.md.BjgA6DuA.lean.js} (68%) rename assets/{app.Bwo_ecyo.js => app.jjkGNkZc.js} (90%) rename assets/{blogs_2026-02-16.md.D7X_K9ac.js => blogs_2026-02-16.md.BNMeYY71.js} (98%) rename assets/{blogs_2026-02-16.md.D7X_K9ac.lean.js => blogs_2026-02-16.md.BNMeYY71.lean.js} (82%) rename assets/{blogs_index.md.CzVqJnkf.js => blogs_index.md.BU7HIh5k.js} (82%) rename assets/{blogs_index.md.CzVqJnkf.lean.js => blogs_index.md.BU7HIh5k.lean.js} (82%) rename assets/{channels_dingtalk.md.BPw_YVBj.js => channels_dingtalk.md.B5SBhtPg.js} (95%) rename assets/{channels_dingtalk.md.BPw_YVBj.lean.js => channels_dingtalk.md.B5SBhtPg.lean.js} (72%) rename assets/{channels_discord.md.CgnXVcxj.js => channels_discord.md.nWxkk0E9.js} (98%) rename assets/{channels_discord.md.CgnXVcxj.lean.js => channels_discord.md.nWxkk0E9.lean.js} (85%) rename assets/{channels_feishu.md.7xzXC8PR.js => channels_feishu.md.BdLiDNPX.js} (96%) rename assets/{channels_feishu.md.7xzXC8PR.lean.js => channels_feishu.md.BdLiDNPX.lean.js} (72%) rename assets/{channels_index.md.BYBYUJgL.js => channels_index.md.BMhis6AA.js} (96%) rename assets/{channels_index.md.BYBYUJgL.lean.js => channels_index.md.BMhis6AA.lean.js} (70%) rename assets/{channels_matrix.md.C5lym8OS.js => channels_matrix.md.DurhP29P.js} (98%) rename assets/{channels_matrix.md.C5lym8OS.lean.js => channels_matrix.md.DurhP29P.lean.js} (71%) rename assets/{channels_misskey.md.BjR2GOoQ.js => channels_misskey.md.K_p2b9tc.js} (96%) rename assets/{channels_misskey.md.BjR2GOoQ.lean.js => channels_misskey.md.K_p2b9tc.lean.js} (71%) rename assets/{channels_qq.md.BiHC52Zm.js => channels_qq.md.xrtB7-Cp.js} (98%) rename assets/{channels_qq.md.BiHC52Zm.lean.js => channels_qq.md.xrtB7-Cp.lean.js} (85%) rename assets/{channels_slack.md.DYyx2j2i.js => channels_slack.md.DJzfVI9g.js} (97%) rename assets/{channels_slack.md.DYyx2j2i.lean.js => channels_slack.md.DJzfVI9g.lean.js} (71%) rename assets/{channels_telegram.md.WGR_O6_O.js => channels_telegram.md.DHWAMJPN.js} (98%) rename assets/{channels_telegram.md.WGR_O6_O.lean.js => channels_telegram.md.DHWAMJPN.lean.js} (85%) rename assets/{channels_wechatoa.md.d_VUeGe9.js => channels_wechatoa.md.6qw2hORh.js} (96%) rename assets/{channels_wechatoa.md.d_VUeGe9.lean.js => channels_wechatoa.md.6qw2hORh.lean.js} (73%) rename assets/{channels_wecom.md.D7yBtNrz.js => channels_wecom.md.CvQSc0QF.js} (98%) rename assets/{channels_wecom.md.D7yBtNrz.lean.js => channels_wecom.md.CvQSc0QF.lean.js} (85%) rename assets/{channels_weixin.md.Ckccg7Ew.js => channels_weixin.md.NGCJG9Zr.js} (95%) rename assets/{channels_weixin.md.Ckccg7Ew.lean.js => channels_weixin.md.NGCJG9Zr.lean.js} (71%) create mode 100644 assets/chunks/@localSearchIndexroot.Bq5adVMH.js delete mode 100644 assets/chunks/@localSearchIndexroot.CEeliA4L.js rename assets/chunks/{VPLocalSearchBox.ppjlRfVe.js => VPLocalSearchBox.Bvi8a7xK.js} (99%) create mode 100644 assets/chunks/framework.CAXxHpAX.js delete mode 100644 assets/chunks/framework.DXGyWiRo.js rename assets/chunks/{theme.PItBixWd.js => theme.BAiG5Ik8.js} (99%) rename assets/{getting-started_access.md.BY1pTTRI.js => getting-started_access.md.YqNM6CpY.js} (99%) rename assets/{getting-started_access.md.BY1pTTRI.lean.js => getting-started_access.md.YqNM6CpY.lean.js} (86%) rename assets/{getting-started_bot.md.CTc86MCg.js => getting-started_bot.md.Cun_Y-ny.js} (99%) rename assets/{getting-started_bot.md.CTc86MCg.lean.js => getting-started_bot.md.Cun_Y-ny.lean.js} (85%) rename assets/{getting-started_browser.md.Cjpk7h3a.js => getting-started_browser.md.CjVL6wjg.js} (99%) rename assets/{getting-started_browser.md.Cjpk7h3a.lean.js => getting-started_browser.md.CjVL6wjg.lean.js} (86%) rename assets/{getting-started_channels.md.CIKhbgq7.js => getting-started_channels.md.zZ6TuOep.js} (98%) rename assets/{getting-started_channels.md.CIKhbgq7.lean.js => getting-started_channels.md.zZ6TuOep.lean.js} (72%) rename assets/{getting-started_compaction.md.B6zFV5na.js => getting-started_compaction.md.G9ICyEJo.js} (99%) rename assets/{getting-started_compaction.md.B6zFV5na.lean.js => getting-started_compaction.md.G9ICyEJo.lean.js} (86%) rename assets/{getting-started_container.md.Do_YGEZB.js => getting-started_container.md.CrcDm5m4.js} (98%) rename assets/{getting-started_container.md.Do_YGEZB.lean.js => getting-started_container.md.CrcDm5m4.lean.js} (73%) rename assets/{getting-started_email.md.DLrAWkek.js => getting-started_email.md.DN5WsFFI.js} (97%) rename assets/{getting-started_email.md.DLrAWkek.lean.js => getting-started_email.md.DN5WsFFI.lean.js} (72%) rename assets/{getting-started_files.md.CbhHSLX5.js => getting-started_files.md.Db2yzSPF.js} (96%) rename assets/{getting-started_files.md.CbhHSLX5.lean.js => getting-started_files.md.Db2yzSPF.lean.js} (72%) rename assets/{getting-started_heartbeat.md.lBwT6Ivl.js => getting-started_heartbeat.md.hEHFzwV2.js} (98%) rename assets/{getting-started_heartbeat.md.lBwT6Ivl.lean.js => getting-started_heartbeat.md.hEHFzwV2.lean.js} (86%) rename assets/{getting-started_mcp.md.Lc9xd9cr.js => getting-started_mcp.md.BZLjLQ-y.js} (98%) rename assets/{getting-started_mcp.md.Lc9xd9cr.lean.js => getting-started_mcp.md.BZLjLQ-y.lean.js} (85%) rename assets/{getting-started_memory.md.WVVdvmGu.js => getting-started_memory.md.5cl77orc.js} (99%) rename assets/{getting-started_memory.md.WVVdvmGu.lean.js => getting-started_memory.md.5cl77orc.lean.js} (86%) rename assets/{getting-started_provider-and-model.md.CLGduNUC.js => getting-started_provider-and-model.md.ee3Zv59w.js} (99%) rename assets/{getting-started_provider-and-model.md.CLGduNUC.lean.js => getting-started_provider-and-model.md.ee3Zv59w.lean.js} (87%) rename assets/{getting-started_schedule.md.7R1TStAB.js => getting-started_schedule.md.BgiO7WiT.js} (98%) rename assets/{getting-started_schedule.md.7R1TStAB.lean.js => getting-started_schedule.md.BgiO7WiT.lean.js} (72%) rename assets/{getting-started_search-provider.md.DDV1py8V.js => getting-started_search-provider.md.C6dGU9hk.js} (97%) rename assets/{getting-started_search-provider.md.DDV1py8V.lean.js => getting-started_search-provider.md.C6dGU9hk.lean.js} (73%) rename assets/{getting-started_sessions.md.BGHqYtAd.js => getting-started_sessions.md.MU-Cy0GW.js} (98%) rename assets/{getting-started_sessions.md.BGHqYtAd.lean.js => getting-started_sessions.md.MU-Cy0GW.lean.js} (72%) rename assets/{getting-started_skills.md.CcJKfEue.js => getting-started_skills.md.DTJvqMSO.js} (98%) rename assets/{getting-started_skills.md.CcJKfEue.lean.js => getting-started_skills.md.DTJvqMSO.lean.js} (71%) rename assets/{getting-started_slash-commands.md.B9pb8gxb.js => getting-started_slash-commands.md.ChJs4d6R.js} (99%) rename assets/{getting-started_slash-commands.md.B9pb8gxb.lean.js => getting-started_slash-commands.md.ChJs4d6R.lean.js} (86%) rename assets/{getting-started_supermarket.md.BOx8ZRcm.js => getting-started_supermarket.md.BqLtu6vF.js} (94%) rename assets/{getting-started_supermarket.md.BOx8ZRcm.lean.js => getting-started_supermarket.md.BqLtu6vF.lean.js} (72%) rename assets/{index.md.DtN_VGK2.js => index.md.DzWsM5pb.js} (95%) rename assets/{index.md.DtN_VGK2.lean.js => index.md.DzWsM5pb.lean.js} (69%) rename assets/{installation_docker.md.DxE7r3rU.js => installation_docker.md.BgArxak6.js} (99%) rename assets/{installation_docker.md.DxE7r3rU.lean.js => installation_docker.md.BgArxak6.lean.js} (71%) rename assets/{memory-providers_builtin.md.DlYtNI3G.js => memory-providers_builtin.md.EikeTjwl.js} (98%) rename assets/{memory-providers_builtin.md.DlYtNI3G.lean.js => memory-providers_builtin.md.EikeTjwl.lean.js} (73%) rename assets/{memory-providers_index.md.D5MvHNPW.js => memory-providers_index.md.Db8RSqmA.js} (97%) rename assets/{memory-providers_index.md.D5MvHNPW.lean.js => memory-providers_index.md.Db8RSqmA.lean.js} (85%) rename assets/{memory-providers_mem0.md.C5B6D9ME.js => memory-providers_mem0.md.DpAU5KWk.js} (96%) rename assets/{memory-providers_mem0.md.C5B6D9ME.lean.js => memory-providers_mem0.md.DpAU5KWk.lean.js} (72%) rename assets/{memory-providers_openviking.md.N-8WyFZa.js => memory-providers_openviking.md.CFYGljE_.js} (95%) rename assets/{memory-providers_openviking.md.N-8WyFZa.lean.js => memory-providers_openviking.md.CFYGljE_.lean.js} (73%) rename assets/{tts-providers_edge.md.DPjdtaQf.js => tts-providers_edge.md.BX5H-DX1.js} (97%) rename assets/{tts-providers_edge.md.DPjdtaQf.lean.js => tts-providers_edge.md.BX5H-DX1.lean.js} (85%) rename assets/{tts-providers_index.md.Cgc87EeS.js => tts-providers_index.md.D7QeNyIs.js} (95%) rename assets/{tts-providers_index.md.Cgc87EeS.lean.js => tts-providers_index.md.D7QeNyIs.lean.js} (71%) rename assets/{zh_concepts_identity-and-binding.md.6tGYa9d_.js => zh_concepts_identity-and-binding.md.CwjmC7t6.js} (96%) rename assets/{zh_concepts_identity-and-binding.md.6tGYa9d_.lean.js => zh_concepts_identity-and-binding.md.CwjmC7t6.lean.js} (74%) rename assets/{zh_concepts_index.md._zNPjKkD.js => zh_concepts_index.md.C_YzW1PS.js} (93%) rename assets/{zh_concepts_index.md._zNPjKkD.lean.js => zh_concepts_index.md.C_YzW1PS.lean.js} (71%) rename assets/{zh_index.md.C-Pz2AC7.js => zh_index.md.DJw9w7T-.js} (95%) rename assets/{zh_index.md.C-Pz2AC7.lean.js => zh_index.md.DJw9w7T-.lean.js} (69%) rename assets/{zh_style_terminology.md.CzqhSoQX.js => zh_style_terminology.md.DjkmyoSc.js} (96%) rename assets/{zh_style_terminology.md.CzqhSoQX.lean.js => zh_style_terminology.md.DjkmyoSc.lean.js} (71%) diff --git a/404.html b/404.html index e0dff9a4..7fc49ffa 100644 --- a/404.html +++ b/404.html @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@
- + \ No newline at end of file diff --git a/about.html b/about.html index c0009d02..4165de03 100644 --- a/about.html +++ b/about.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

About Memoh

What Is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent platform. You can create multiple AI bots, give each bot its own isolated workspace and long-term memory, and interact with them through Telegram, Discord, Lark (Feishu), QQ, Matrix, Misskey, DingTalk, WeCom, WeChat, WeChat Official Account, Email, or the built-in Web UI.

Every bot has its own execution environment, tools, memory configuration, and channel integrations. In practice, that means each bot behaves more like its own computer-backed agent than a shared chat preset.

What Makes Memoh Different

Multi-Bot And Multi-User

Memoh is built for real sharing and real separation at the same time:

  • create multiple bots for different roles or people
  • let humans and bots interact in private chats, groups, or delegated workflows
  • distinguish individual users in shared conversations
  • bind identities across channels so the same person can be recognized consistently

Containerized Workspaces

Each bot runs in its own isolated container workspace with a separate filesystem and network boundary. Bots can read and write files, run commands, and use tools inside that workspace without interfering with other bots.

Long-Term Memory And Context Management

Memoh separates two different problems:

  • Long-term memory stores durable facts and recalls them across conversations through memory providers
  • Session context compaction reduces the prompt size of an active session when the current conversation gets too large

This distinction is important: context compaction changes the active session window, while memory compaction rewrites stored memory entries.

Sessions And Discuss Mode

Each bot maintains independent sessions that preserve context. Memoh currently uses five session types:

  • Chat — regular user-facing conversations
  • Discuss — deliberative sessions where the bot can think through work and decide what to send outward
  • Heartbeat — periodic autonomous sessions
  • Schedule — cron-triggered task sessions
  • Subagent — delegated task sessions

You can start or route sessions with slash commands such as /new, and the Web UI exposes a session status panel with metrics like context usage, cache hit rate, and used skills.

Broad Channel Coverage

Memoh uses a unified channel adapter system so one bot can be reachable from many places at once.

Current user-facing integrations include:

  • Telegram
  • Discord
  • Lark (Feishu)
  • QQ
  • Matrix
  • Misskey
  • DingTalk
  • WeCom
  • WeChat
  • WeChat Official Account
  • Email
  • Web

Memoh also distinguishes between the personal WeChat QR-login integration and the webhook-based WeChat Official Account integration.

Tools, Skills, MCP, And Supermarket

Bots can use a rich set of built-in capabilities, including:

  • web search and web fetch
  • browser automation
  • file editing and command execution inside the bot workspace
  • memory search and management
  • messaging, email, and TTS
  • subagents for delegated work
  • skills for reusable behavior modules
  • MCP connections for external tool servers
  • Supermarket for curated skill and MCP template installation

Providers And Models

Memoh supports multiple provider client types, including:

  • OpenAI-compatible chat completions
  • OpenAI Responses API
  • Anthropic Messages
  • Google Generative AI
  • OpenAI Codex
  • GitHub Copilot
  • Edge Speech / TTS

Models are also separated by role:

  • chat models for normal interaction
  • embedding models for vector memory and search
  • speech models for TTS

Image generation is configured through compatible chat/image models rather than a separate image-provider system.

Operations And UI

The Web UI is designed so you can manage the whole system without editing config files by hand every day. It includes:

  • bot configuration tabs for general settings, access, channels, heartbeat, compaction, and more
  • provider and model management with OAuth flows where supported
  • session-side controls such as immediate compaction and status inspection
  • skill management with effective / shadowed / disabled visibility
  • slash-command driven control from channels

Where To Start

Published under AGPLv3

- + \ No newline at end of file diff --git a/assets/about.md.CYQE4Bs3.js b/assets/about.md.BjgA6DuA.js similarity index 98% rename from assets/about.md.CYQE4Bs3.js rename to assets/about.md.BjgA6DuA.js index e5779d72..a1356c40 100644 --- a/assets/about.md.CYQE4Bs3.js +++ b/assets/about.md.BjgA6DuA.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as s}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1776332711000}'),i={name:"about.md"};function n(r,e,l,d,h,c){return a(),o("div",null,[...e[0]||(e[0]=[s('

About Memoh

What Is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent platform. You can create multiple AI bots, give each bot its own isolated workspace and long-term memory, and interact with them through Telegram, Discord, Lark (Feishu), QQ, Matrix, Misskey, DingTalk, WeCom, WeChat, WeChat Official Account, Email, or the built-in Web UI.

Every bot has its own execution environment, tools, memory configuration, and channel integrations. In practice, that means each bot behaves more like its own computer-backed agent than a shared chat preset.

What Makes Memoh Different

Multi-Bot And Multi-User

Memoh is built for real sharing and real separation at the same time:

Containerized Workspaces

Each bot runs in its own isolated container workspace with a separate filesystem and network boundary. Bots can read and write files, run commands, and use tools inside that workspace without interfering with other bots.

Long-Term Memory And Context Management

Memoh separates two different problems:

This distinction is important: context compaction changes the active session window, while memory compaction rewrites stored memory entries.

Sessions And Discuss Mode

Each bot maintains independent sessions that preserve context. Memoh currently uses five session types:

You can start or route sessions with slash commands such as /new, and the Web UI exposes a session status panel with metrics like context usage, cache hit rate, and used skills.

Broad Channel Coverage

Memoh uses a unified channel adapter system so one bot can be reachable from many places at once.

Current user-facing integrations include:

Memoh also distinguishes between the personal WeChat QR-login integration and the webhook-based WeChat Official Account integration.

Tools, Skills, MCP, And Supermarket

Bots can use a rich set of built-in capabilities, including:

Providers And Models

Memoh supports multiple provider client types, including:

Models are also separated by role:

Image generation is configured through compatible chat/image models rather than a separate image-provider system.

Operations And UI

The Web UI is designed so you can manage the whole system without editing config files by hand every day. It includes:

Where To Start

',37)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; +import{_ as t,o as a,c as o,ag as s}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1776332711000}'),i={name:"about.md"};function n(r,e,l,d,h,c){return a(),o("div",null,[...e[0]||(e[0]=[s('

About Memoh

What Is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent platform. You can create multiple AI bots, give each bot its own isolated workspace and long-term memory, and interact with them through Telegram, Discord, Lark (Feishu), QQ, Matrix, Misskey, DingTalk, WeCom, WeChat, WeChat Official Account, Email, or the built-in Web UI.

Every bot has its own execution environment, tools, memory configuration, and channel integrations. In practice, that means each bot behaves more like its own computer-backed agent than a shared chat preset.

What Makes Memoh Different

Multi-Bot And Multi-User

Memoh is built for real sharing and real separation at the same time:

Containerized Workspaces

Each bot runs in its own isolated container workspace with a separate filesystem and network boundary. Bots can read and write files, run commands, and use tools inside that workspace without interfering with other bots.

Long-Term Memory And Context Management

Memoh separates two different problems:

This distinction is important: context compaction changes the active session window, while memory compaction rewrites stored memory entries.

Sessions And Discuss Mode

Each bot maintains independent sessions that preserve context. Memoh currently uses five session types:

You can start or route sessions with slash commands such as /new, and the Web UI exposes a session status panel with metrics like context usage, cache hit rate, and used skills.

Broad Channel Coverage

Memoh uses a unified channel adapter system so one bot can be reachable from many places at once.

Current user-facing integrations include:

Memoh also distinguishes between the personal WeChat QR-login integration and the webhook-based WeChat Official Account integration.

Tools, Skills, MCP, And Supermarket

Bots can use a rich set of built-in capabilities, including:

Providers And Models

Memoh supports multiple provider client types, including:

Models are also separated by role:

Image generation is configured through compatible chat/image models rather than a separate image-provider system.

Operations And UI

The Web UI is designed so you can manage the whole system without editing config files by hand every day. It includes:

Where To Start

',37)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; diff --git a/assets/about.md.CYQE4Bs3.lean.js b/assets/about.md.BjgA6DuA.lean.js similarity index 68% rename from assets/about.md.CYQE4Bs3.lean.js rename to assets/about.md.BjgA6DuA.lean.js index e8dc62af..2aed40b7 100644 --- a/assets/about.md.CYQE4Bs3.lean.js +++ b/assets/about.md.BjgA6DuA.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as s}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1776332711000}'),i={name:"about.md"};function n(r,e,l,d,h,c){return a(),o("div",null,[...e[0]||(e[0]=[s("",37)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; +import{_ as t,o as a,c as o,ag as s}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1776332711000}'),i={name:"about.md"};function n(r,e,l,d,h,c){return a(),o("div",null,[...e[0]||(e[0]=[s("",37)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; diff --git a/assets/app.Bwo_ecyo.js b/assets/app.jjkGNkZc.js similarity index 90% rename from assets/app.Bwo_ecyo.js rename to assets/app.jjkGNkZc.js index f952c7b0..b85d0f0d 100644 --- a/assets/app.Bwo_ecyo.js +++ b/assets/app.jjkGNkZc.js @@ -1 +1 @@ -import{t as p}from"./chunks/theme.PItBixWd.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.DXGyWiRo.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; +import{t as p}from"./chunks/theme.BAiG5Ik8.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.CAXxHpAX.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; diff --git a/assets/blogs_2026-02-16.md.D7X_K9ac.js b/assets/blogs_2026-02-16.md.BNMeYY71.js similarity index 98% rename from assets/blogs_2026-02-16.md.D7X_K9ac.js rename to assets/blogs_2026-02-16.md.BNMeYY71.js index 7f1210bb..fc6b59e8 100644 --- a/assets/blogs_2026-02-16.md.D7X_K9ac.js +++ b/assets/blogs_2026-02-16.md.BNMeYY71.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n('

Introduction to Memoh - The Case for an Always-On, Containerized Home Agent

Overview

We enter 2026 with a familiar tension: models get smarter every quarter, but the “agent experience” still breaks on context, latency, privacy, and real-world workflows. Over the past year, we kept circling three questions:

Memoh is our attempt to turn those questions into something buildable—not a manifesto, but a system that can survive contact with reality.

Story Time

Time travels fast. Somewhere between “I’ll remember this” and “wait, why did we decide that?”, a year disappears.

That’s the annoying part of building: most progress doesn’t feel like progress while it’s happening. It’s just a stream of small choices, half-finished threads, late-night fixes, and the occasional moment that actually clicks. The kind of moment where you sit back and think: okay—this is real.

Around the same time, I noticed something else: the internet started to feel smoother—and worse.

Text got cleaner, longer, more polite, more… empty. You could smell when something was generated: low information density, too many metaphors, too much agreement, not enough stakes.

I caught myself doing it too.

So I started forcing a constraint: say it plainly. Keep the density. Don’t inflate. Don’t hide behind style. If something mattered, anchor it to a real moment, a real trade-off, a real cost paid.

Because the thing LLMs can’t give you is not “intelligence.” It’s weight. The feeling that a human actually stood somewhere in time and wrote from that position.

That’s when I realized what I wanted wasn’t “an AI that can talk.” I wanted an AI that can live with you—quietly, continuously, accumulating context without turning your life into content sludge.

Phones were our first instinct—it's personal, powerful, always there. But mobile OS is closed: without OEM privileges you can build an app, not ambient infrastructure.

So we looked for the always-on node every home already has: the router (conceptually). Then the economics clash—router-class hardware can’t carry memory, RAG, tools, and multi-user agents. The device evolves: more RAM/storage, a screen, mic/speaker, tiny battery for take out, portable form.

Eventually it stops being a router. It becomes a new category: a home agent base layer.

What

Memoh is a containerized home/studio AI base layer: cloud-grade model capability paired with local-first memory (knowledge base, RAG/search, conversation history) that stays under your control.

Why

Long-context models raise the ceiling for agents—but they also make “fully local” expensive and “fully cloud” uncomfortable. People don’t want to re-brief AI every day, and they don’t want their durable context trapped in someone else’s feed. Containerization makes Memoh portable, reproducible, and safe to run as always-on infrastructure—so continuity becomes cheap, private, and dependable.

How

We run Memoh as a containerized stack: isolated services for storage (files/DB/vector index), retrieval, tool/runtime execution, and the control plane. Inference calls cloud APIs when you need frontier capability; durable memory and indexing stay local. The device acts as an always-on node (router-like, not a router) serving multiple users with strict boundaries: sharing is explicit, private context remains private, and everything is deployable/upgradable as versioned containers.

Features

Compare to OpenClaw

We share a core belief: both Memoh and OpenClaw treat the agent as more than a chatbox—we give the LLM a playground: a real environment where it can remember, use tools, and iterate.

Where Memoh differs:

Conclusion

Memoh is built for one thing: always-on continuity—an AI that stays online, and a memory that stays yours.

We keep frontier inference in the cloud, keep durable context local, and run everything as a containerized, always-on stack. If you want an agent that feels less like an app and more like home infrastructure, that’s the bet Memoh is making.

Furthermore, we will continue to operate and permanently open-source Memoh, making it a product with long impact.

',33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n('

Introduction to Memoh - The Case for an Always-On, Containerized Home Agent

Overview

We enter 2026 with a familiar tension: models get smarter every quarter, but the “agent experience” still breaks on context, latency, privacy, and real-world workflows. Over the past year, we kept circling three questions:

Memoh is our attempt to turn those questions into something buildable—not a manifesto, but a system that can survive contact with reality.

Story Time

Time travels fast. Somewhere between “I’ll remember this” and “wait, why did we decide that?”, a year disappears.

That’s the annoying part of building: most progress doesn’t feel like progress while it’s happening. It’s just a stream of small choices, half-finished threads, late-night fixes, and the occasional moment that actually clicks. The kind of moment where you sit back and think: okay—this is real.

Around the same time, I noticed something else: the internet started to feel smoother—and worse.

Text got cleaner, longer, more polite, more… empty. You could smell when something was generated: low information density, too many metaphors, too much agreement, not enough stakes.

I caught myself doing it too.

So I started forcing a constraint: say it plainly. Keep the density. Don’t inflate. Don’t hide behind style. If something mattered, anchor it to a real moment, a real trade-off, a real cost paid.

Because the thing LLMs can’t give you is not “intelligence.” It’s weight. The feeling that a human actually stood somewhere in time and wrote from that position.

That’s when I realized what I wanted wasn’t “an AI that can talk.” I wanted an AI that can live with you—quietly, continuously, accumulating context without turning your life into content sludge.

Phones were our first instinct—it's personal, powerful, always there. But mobile OS is closed: without OEM privileges you can build an app, not ambient infrastructure.

So we looked for the always-on node every home already has: the router (conceptually). Then the economics clash—router-class hardware can’t carry memory, RAG, tools, and multi-user agents. The device evolves: more RAM/storage, a screen, mic/speaker, tiny battery for take out, portable form.

Eventually it stops being a router. It becomes a new category: a home agent base layer.

What

Memoh is a containerized home/studio AI base layer: cloud-grade model capability paired with local-first memory (knowledge base, RAG/search, conversation history) that stays under your control.

Why

Long-context models raise the ceiling for agents—but they also make “fully local” expensive and “fully cloud” uncomfortable. People don’t want to re-brief AI every day, and they don’t want their durable context trapped in someone else’s feed. Containerization makes Memoh portable, reproducible, and safe to run as always-on infrastructure—so continuity becomes cheap, private, and dependable.

How

We run Memoh as a containerized stack: isolated services for storage (files/DB/vector index), retrieval, tool/runtime execution, and the control plane. Inference calls cloud APIs when you need frontier capability; durable memory and indexing stay local. The device acts as an always-on node (router-like, not a router) serving multiple users with strict boundaries: sharing is explicit, private context remains private, and everything is deployable/upgradable as versioned containers.

Features

Compare to OpenClaw

We share a core belief: both Memoh and OpenClaw treat the agent as more than a chatbox—we give the LLM a playground: a real environment where it can remember, use tools, and iterate.

Where Memoh differs:

Conclusion

Memoh is built for one thing: always-on continuity—an AI that stays online, and a memory that stays yours.

We keep frontier inference in the cloud, keep durable context local, and run everything as a containerized, always-on stack. If you want an agent that feels less like an app and more like home infrastructure, that’s the bet Memoh is making.

Furthermore, we will continue to operate and permanently open-source Memoh, making it a product with long impact.

',33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default}; diff --git a/assets/blogs_2026-02-16.md.D7X_K9ac.lean.js b/assets/blogs_2026-02-16.md.BNMeYY71.lean.js similarity index 82% rename from assets/blogs_2026-02-16.md.D7X_K9ac.lean.js rename to assets/blogs_2026-02-16.md.BNMeYY71.lean.js index 7de584c8..3c29becc 100644 --- a/assets/blogs_2026-02-16.md.D7X_K9ac.lean.js +++ b/assets/blogs_2026-02-16.md.BNMeYY71.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n("",33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n("",33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default}; diff --git a/assets/blogs_index.md.CzVqJnkf.js b/assets/blogs_index.md.BU7HIh5k.js similarity index 82% rename from assets/blogs_index.md.CzVqJnkf.js rename to assets/blogs_index.md.BU7HIh5k.js index c1f717cd..51bfe927 100644 --- a/assets/blogs_index.md.CzVqJnkf.js +++ b/assets/blogs_index.md.BU7HIh5k.js @@ -1 +1 @@ -import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"​")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default}; +import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"​")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default}; diff --git a/assets/blogs_index.md.CzVqJnkf.lean.js b/assets/blogs_index.md.BU7HIh5k.lean.js similarity index 82% rename from assets/blogs_index.md.CzVqJnkf.lean.js rename to assets/blogs_index.md.BU7HIh5k.lean.js index c1f717cd..51bfe927 100644 --- a/assets/blogs_index.md.CzVqJnkf.lean.js +++ b/assets/blogs_index.md.BU7HIh5k.lean.js @@ -1 +1 @@ -import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"​")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default}; +import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"​")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default}; diff --git a/assets/channels_dingtalk.md.BPw_YVBj.js b/assets/channels_dingtalk.md.B5SBhtPg.js similarity index 95% rename from assets/channels_dingtalk.md.BPw_YVBj.js rename to assets/channels_dingtalk.md.B5SBhtPg.js index 9d175377..8daf2659 100644 --- a/assets/channels_dingtalk.md.BPw_YVBj.js +++ b/assets/channels_dingtalk.md.B5SBhtPg.js @@ -1 +1 @@ -import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"DingTalk Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/dingtalk.md","filePath":"channels/dingtalk.md","lastUpdated":1776332711000}'),i={name:"channels/dingtalk.md"};function r(l,e,s,p,g,h){return t(),n("div",null,[...e[0]||(e[0]=[o('

DingTalk Channel Configuration

Memoh supports DingTalk bots for private chats and group chats. The adapter uses DingTalk's stream connection for inbound events and the official APIs for outbound replies and media.

Step 1: Create A DingTalk App

  1. Open the DingTalk developer platform for your organization.
  2. Create or choose the app that will act as your bot.
  3. Enable the bot / messaging capability for that app.
  4. Copy the app credentials:
    • App Key
    • App Secret

Depending on your DingTalk environment, you may also need to grant message permissions and publish the app before it is available to end users.

Step 2: Configure Memoh

  1. Open your bot in the Memoh Web UI.
  2. Go to Platforms.
  3. Click Add Channel and choose DingTalk.
  4. Fill in App Key and App Secret.
  5. Click Save and Enable.

Memoh maintains the DingTalk stream connection automatically. For the normal setup, you do not need to manually paste a webhook callback URL.

Step 3: Verify Messaging

After the channel is enabled:

  1. Send a private message to the DingTalk bot, or mention it in a supported group chat.
  2. Confirm the bot receives the message and can reply.

Features Supported

Current behavior note:

',15)])])}const c=a(i,[["render",r]]);export{u as __pageData,c as default}; +import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"DingTalk Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/dingtalk.md","filePath":"channels/dingtalk.md","lastUpdated":1776332711000}'),i={name:"channels/dingtalk.md"};function r(l,e,s,p,g,h){return t(),n("div",null,[...e[0]||(e[0]=[o('

DingTalk Channel Configuration

Memoh supports DingTalk bots for private chats and group chats. The adapter uses DingTalk's stream connection for inbound events and the official APIs for outbound replies and media.

Step 1: Create A DingTalk App

  1. Open the DingTalk developer platform for your organization.
  2. Create or choose the app that will act as your bot.
  3. Enable the bot / messaging capability for that app.
  4. Copy the app credentials:
    • App Key
    • App Secret

Depending on your DingTalk environment, you may also need to grant message permissions and publish the app before it is available to end users.

Step 2: Configure Memoh

  1. Open your bot in the Memoh Web UI.
  2. Go to Platforms.
  3. Click Add Channel and choose DingTalk.
  4. Fill in App Key and App Secret.
  5. Click Save and Enable.

Memoh maintains the DingTalk stream connection automatically. For the normal setup, you do not need to manually paste a webhook callback URL.

Step 3: Verify Messaging

After the channel is enabled:

  1. Send a private message to the DingTalk bot, or mention it in a supported group chat.
  2. Confirm the bot receives the message and can reply.

Features Supported

Current behavior note:

',15)])])}const c=a(i,[["render",r]]);export{u as __pageData,c as default}; diff --git a/assets/channels_dingtalk.md.BPw_YVBj.lean.js b/assets/channels_dingtalk.md.B5SBhtPg.lean.js similarity index 72% rename from assets/channels_dingtalk.md.BPw_YVBj.lean.js rename to assets/channels_dingtalk.md.B5SBhtPg.lean.js index 985e8d2d..2c17e06c 100644 --- a/assets/channels_dingtalk.md.BPw_YVBj.lean.js +++ b/assets/channels_dingtalk.md.B5SBhtPg.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"DingTalk Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/dingtalk.md","filePath":"channels/dingtalk.md","lastUpdated":1776332711000}'),i={name:"channels/dingtalk.md"};function r(l,e,s,p,g,h){return t(),n("div",null,[...e[0]||(e[0]=[o("",15)])])}const c=a(i,[["render",r]]);export{u as __pageData,c as default}; +import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"DingTalk Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/dingtalk.md","filePath":"channels/dingtalk.md","lastUpdated":1776332711000}'),i={name:"channels/dingtalk.md"};function r(l,e,s,p,g,h){return t(),n("div",null,[...e[0]||(e[0]=[o("",15)])])}const c=a(i,[["render",r]]);export{u as __pageData,c as default}; diff --git a/assets/channels_discord.md.CgnXVcxj.js b/assets/channels_discord.md.nWxkk0E9.js similarity index 98% rename from assets/channels_discord.md.CgnXVcxj.js rename to assets/channels_discord.md.nWxkk0E9.js index 6c809cb9..354f6edf 100644 --- a/assets/channels_discord.md.CgnXVcxj.js +++ b/assets/channels_discord.md.nWxkk0E9.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1774787421000}'),n={name:"channels/discord.md"};function i(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('

Discord Channel Configuration

Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.

Step 1: Create a Discord Application

  1. Go to the Discord Developer Portal.
  2. Click New Application and give it a name.
  3. In the left sidebar, go to Bot.
  4. Click Reset Token to generate a Bot Token. Copy this token and store it securely.

Step 2: Configure Bot Settings

  1. Scroll down to the Privileged Gateway Intents section.
  2. Enable Message Content Intent, Server Members Intent and Presence Intent.
  3. Save changes.

Step 3: Invite the Bot to Your Server

  1. Go to OAuth2 > URL Generator.
  2. Select scopes: bot, applications.commands.
  3. Select permissions: Send Messages, Read Message History, Embed Links, Attach Files.
  4. Copy the generated URL and open it in your browser.
  5. Select the server you want to add the bot to and authorize it.

Official Guide: Discord Developer Portal - Bots

Step 4: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Discord.
  3. Paste your Bot Token.
  4. Click Save and Enable.

Features Supported

',13)])])}const u=t(n,[["render",i]]);export{g as __pageData,u as default}; +import{_ as t,o,c as r,ag as a}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1774787421000}'),n={name:"channels/discord.md"};function i(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('

Discord Channel Configuration

Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.

Step 1: Create a Discord Application

  1. Go to the Discord Developer Portal.
  2. Click New Application and give it a name.
  3. In the left sidebar, go to Bot.
  4. Click Reset Token to generate a Bot Token. Copy this token and store it securely.

Step 2: Configure Bot Settings

  1. Scroll down to the Privileged Gateway Intents section.
  2. Enable Message Content Intent, Server Members Intent and Presence Intent.
  3. Save changes.

Step 3: Invite the Bot to Your Server

  1. Go to OAuth2 > URL Generator.
  2. Select scopes: bot, applications.commands.
  3. Select permissions: Send Messages, Read Message History, Embed Links, Attach Files.
  4. Copy the generated URL and open it in your browser.
  5. Select the server you want to add the bot to and authorize it.

Official Guide: Discord Developer Portal - Bots

Step 4: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Discord.
  3. Paste your Bot Token.
  4. Click Save and Enable.

Features Supported

',13)])])}const u=t(n,[["render",i]]);export{g as __pageData,u as default}; diff --git a/assets/channels_discord.md.CgnXVcxj.lean.js b/assets/channels_discord.md.nWxkk0E9.lean.js similarity index 85% rename from assets/channels_discord.md.CgnXVcxj.lean.js rename to assets/channels_discord.md.nWxkk0E9.lean.js index 9d0b1ece..c00ef9df 100644 --- a/assets/channels_discord.md.CgnXVcxj.lean.js +++ b/assets/channels_discord.md.nWxkk0E9.lean.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1774787421000}'),n={name:"channels/discord.md"};function i(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",13)])])}const u=t(n,[["render",i]]);export{g as __pageData,u as default}; +import{_ as t,o,c as r,ag as a}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1774787421000}'),n={name:"channels/discord.md"};function i(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",13)])])}const u=t(n,[["render",i]]);export{g as __pageData,u as default}; diff --git a/assets/channels_feishu.md.7xzXC8PR.js b/assets/channels_feishu.md.BdLiDNPX.js similarity index 96% rename from assets/channels_feishu.md.7xzXC8PR.js rename to assets/channels_feishu.md.BdLiDNPX.js index 229628f1..54f41987 100644 --- a/assets/channels_feishu.md.7xzXC8PR.js +++ b/assets/channels_feishu.md.BdLiDNPX.js @@ -1 +1 @@ -import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1774787421000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a('

Feishu (Lark) Channel Configuration

Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.

Step 1: Create a Feishu App

  1. Go to the Feishu Open Platform and log in.
  2. Click Create Custom App.
  3. Enter a name and description, then click Create.
  4. In the left sidebar, go to App Settings > Credentials & Basic Info.
  5. Copy your App ID and App Secret.

Step 2: Enable Bot Capability

  1. In the Feishu Developer Console, go to Capabilities > Bot.
  2. Click Enable Bot.

Step 3: Configure Permissions

  1. Go to Capabilities > Permissions.
  2. Search for and enable the following permissions (at minimum):
    • im:message (Receive and send messages)
    • im:chat (Access group chat information)
  3. Click Apply for Permissions if required by your organization.

Step 4: Configure Events (Webhook Mode)

  1. In Memoh, go to your Bot's Platforms tab and add a Feishu channel.
  2. Choose Inbound Mode: webhook.
  3. Fill in your App ID and App Secret.
  4. Click Save. Memoh will generate a Webhook Callback URL.
  5. Copy this URL.
  6. In the Feishu Console, go to App Settings > Event Subscriptions.
  7. Paste the URL into the Verification URL field and save.
  8. Add events like Receive Message (im.message.receive_v1).

Official Guide: Feishu Custom Bot Guide

Step 5: Publish Your App

  1. In the Feishu Console, go to App Release > Version Management & Release.
  2. Click Create a Version, fill in the details, and submit for approval.
  3. Once approved and published, the bot is ready to use.
',13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; +import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1774787421000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a('

Feishu (Lark) Channel Configuration

Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.

Step 1: Create a Feishu App

  1. Go to the Feishu Open Platform and log in.
  2. Click Create Custom App.
  3. Enter a name and description, then click Create.
  4. In the left sidebar, go to App Settings > Credentials & Basic Info.
  5. Copy your App ID and App Secret.

Step 2: Enable Bot Capability

  1. In the Feishu Developer Console, go to Capabilities > Bot.
  2. Click Enable Bot.

Step 3: Configure Permissions

  1. Go to Capabilities > Permissions.
  2. Search for and enable the following permissions (at minimum):
    • im:message (Receive and send messages)
    • im:chat (Access group chat information)
  3. Click Apply for Permissions if required by your organization.

Step 4: Configure Events (Webhook Mode)

  1. In Memoh, go to your Bot's Platforms tab and add a Feishu channel.
  2. Choose Inbound Mode: webhook.
  3. Fill in your App ID and App Secret.
  4. Click Save. Memoh will generate a Webhook Callback URL.
  5. Copy this URL.
  6. In the Feishu Console, go to App Settings > Event Subscriptions.
  7. Paste the URL into the Verification URL field and save.
  8. Add events like Receive Message (im.message.receive_v1).

Official Guide: Feishu Custom Bot Guide

Step 5: Publish Your App

  1. In the Feishu Console, go to App Release > Version Management & Release.
  2. Click Create a Version, fill in the details, and submit for approval.
  3. Once approved and published, the bot is ready to use.
',13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; diff --git a/assets/channels_feishu.md.7xzXC8PR.lean.js b/assets/channels_feishu.md.BdLiDNPX.lean.js similarity index 72% rename from assets/channels_feishu.md.7xzXC8PR.lean.js rename to assets/channels_feishu.md.BdLiDNPX.lean.js index 2e406813..c39d195f 100644 --- a/assets/channels_feishu.md.7xzXC8PR.lean.js +++ b/assets/channels_feishu.md.BdLiDNPX.lean.js @@ -1 +1 @@ -import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1774787421000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a("",13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; +import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1774787421000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a("",13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; diff --git a/assets/channels_index.md.BYBYUJgL.js b/assets/channels_index.md.BMhis6AA.js similarity index 96% rename from assets/channels_index.md.BYBYUJgL.js rename to assets/channels_index.md.BMhis6AA.js index 309299ac..0382be81 100644 --- a/assets/channels_index.md.BYBYUJgL.js +++ b/assets/channels_index.md.BMhis6AA.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1776579425000}'),i={name:"channels/index.md"};function r(s,e,l,c,h,g){return a(),o("div",null,[...e[0]||(e[0]=[n('

Channels Overview

Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.

Memoh currently supports the following channels:

WeChat vs WeChat Official Account

Memoh supports two different WeChat-related adapters:

Choose the one that matches your actual WeChat deployment model.

General Setup Flow

  1. Create an external app/bot: Register your bot on the target platform.
  2. Obtain credentials: Fetch API tokens, App IDs, app secrets, or access tokens.
  3. Configure in Memoh: Add the channel from your bot's Platforms tab.
  4. Save and enable: Activate the channel to start receiving and sending messages.

Depending on the platform, the final step may involve:

Choose a channel from the sidebar to see detailed configuration guides for each platform.

',13)])])}const f=t(i,[["render",r]]);export{p as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1776579425000}'),i={name:"channels/index.md"};function r(s,e,l,c,h,g){return a(),o("div",null,[...e[0]||(e[0]=[n('

Channels Overview

Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.

Memoh currently supports the following channels:

WeChat vs WeChat Official Account

Memoh supports two different WeChat-related adapters:

Choose the one that matches your actual WeChat deployment model.

General Setup Flow

  1. Create an external app/bot: Register your bot on the target platform.
  2. Obtain credentials: Fetch API tokens, App IDs, app secrets, or access tokens.
  3. Configure in Memoh: Add the channel from your bot's Platforms tab.
  4. Save and enable: Activate the channel to start receiving and sending messages.

Depending on the platform, the final step may involve:

Choose a channel from the sidebar to see detailed configuration guides for each platform.

',13)])])}const f=t(i,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/channels_index.md.BYBYUJgL.lean.js b/assets/channels_index.md.BMhis6AA.lean.js similarity index 70% rename from assets/channels_index.md.BYBYUJgL.lean.js rename to assets/channels_index.md.BMhis6AA.lean.js index 5c0c6965..08b489aa 100644 --- a/assets/channels_index.md.BYBYUJgL.lean.js +++ b/assets/channels_index.md.BMhis6AA.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1776579425000}'),i={name:"channels/index.md"};function r(s,e,l,c,h,g){return a(),o("div",null,[...e[0]||(e[0]=[n("",13)])])}const f=t(i,[["render",r]]);export{p as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1776579425000}'),i={name:"channels/index.md"};function r(s,e,l,c,h,g){return a(),o("div",null,[...e[0]||(e[0]=[n("",13)])])}const f=t(i,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/channels_matrix.md.C5lym8OS.js b/assets/channels_matrix.md.DurhP29P.js similarity index 98% rename from assets/channels_matrix.md.C5lym8OS.js rename to assets/channels_matrix.md.DurhP29P.js index 8acb8127..81191f68 100644 --- a/assets/channels_matrix.md.C5lym8OS.js +++ b/assets/channels_matrix.md.DurhP29P.js @@ -1,4 +1,4 @@ -import{_ as e,o as a,c as i,ag as s}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Matrix Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/matrix.md","filePath":"channels/matrix.md","lastUpdated":1774790782000}'),o={name:"channels/matrix.md"};function n(r,t,l,h,d,c){return a(),i("div",null,[...t[0]||(t[0]=[s(`

Matrix Channel Configuration

Connecting your Memoh Bot to Matrix allows it to communicate via the decentralized Matrix messaging protocol. Your bot can join rooms, respond to direct messages, and participate in group conversations on any Matrix homeserver.

Step 1: Create a Matrix Bot Account

  1. Register a new account on your Matrix homeserver (e.g., via Element or any Matrix client).
  2. Note the User ID (e.g., @mybot:matrix.org).
  3. Obtain an Access Token for the account. You can do this by:
bash
curl -X POST "https://<homeserver>/_matrix/client/v3/login" \\
+import{_ as e,o as a,c as i,ag as s}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Matrix Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/matrix.md","filePath":"channels/matrix.md","lastUpdated":1774790782000}'),o={name:"channels/matrix.md"};function n(r,t,l,h,d,c){return a(),i("div",null,[...t[0]||(t[0]=[s(`

Matrix Channel Configuration

Connecting your Memoh Bot to Matrix allows it to communicate via the decentralized Matrix messaging protocol. Your bot can join rooms, respond to direct messages, and participate in group conversations on any Matrix homeserver.

Step 1: Create a Matrix Bot Account

  1. Register a new account on your Matrix homeserver (e.g., via Element or any Matrix client).
  2. Note the User ID (e.g., @mybot:matrix.org).
  3. Obtain an Access Token for the account. You can do this by:
  • Option A: Using the Matrix Client Login API
bash
curl -X POST "https://<homeserver>/_matrix/client/v3/login" \\
   -H "Content-Type: application/json" \\
   -d '{
     "type": "m.login.password",
diff --git a/assets/channels_matrix.md.C5lym8OS.lean.js b/assets/channels_matrix.md.DurhP29P.lean.js
similarity index 71%
rename from assets/channels_matrix.md.C5lym8OS.lean.js
rename to assets/channels_matrix.md.DurhP29P.lean.js
index fcce6681..fd606064 100644
--- a/assets/channels_matrix.md.C5lym8OS.lean.js
+++ b/assets/channels_matrix.md.DurhP29P.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as i,ag as s}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Matrix Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/matrix.md","filePath":"channels/matrix.md","lastUpdated":1774790782000}'),o={name:"channels/matrix.md"};function n(r,t,l,h,d,c){return a(),i("div",null,[...t[0]||(t[0]=[s("",18)])])}const g=e(o,[["render",n]]);export{u as __pageData,g as default};
+import{_ as e,o as a,c as i,ag as s}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Matrix Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/matrix.md","filePath":"channels/matrix.md","lastUpdated":1774790782000}'),o={name:"channels/matrix.md"};function n(r,t,l,h,d,c){return a(),i("div",null,[...t[0]||(t[0]=[s("",18)])])}const g=e(o,[["render",n]]);export{u as __pageData,g as default};
diff --git a/assets/channels_misskey.md.BjR2GOoQ.js b/assets/channels_misskey.md.K_p2b9tc.js
similarity index 96%
rename from assets/channels_misskey.md.BjR2GOoQ.js
rename to assets/channels_misskey.md.K_p2b9tc.js
index a912f25b..4b3ff1f5 100644
--- a/assets/channels_misskey.md.BjR2GOoQ.js
+++ b/assets/channels_misskey.md.K_p2b9tc.js
@@ -1 +1 @@
-import{_ as t,o as n,c as s,ag as o}from"./chunks/framework.DXGyWiRo.js";const d=JSON.parse('{"title":"Misskey Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/misskey.md","filePath":"channels/misskey.md","lastUpdated":1776332711000}'),a={name:"channels/misskey.md"};function i(r,e,l,c,h,u){return n(),s("div",null,[...e[0]||(e[0]=[o('

Misskey Channel Configuration

Memoh can connect a bot to a Misskey server so it can read inbound mentions and reply as a Misskey account. This adapter is best for text-first social interactions on self-hosted or public Misskey instances.

Step 1: Prepare A Misskey Account And Token

  1. Sign in to the Misskey instance you want to use.
  2. Create or choose the account that should represent your bot.
  3. Generate an Access Token for that account.

Memoh needs:

  • Instance URL: for example https://misskey.io
  • Access Token: a token for the bot account

The exact token-creation UI varies by Misskey instance. Make sure the token is allowed to read inbound events for the bot account and publish replies.

Step 2: Configure Memoh

  1. Open your bot in the Memoh Web UI.
  2. Go to Platforms.
  3. Click Add Channel and choose Misskey.
  4. Enter the Instance URL.
  5. Paste the Access Token.
  6. Click Save and Enable.

Memoh uses these credentials to discover the bot identity and start the Misskey connection.

Step 3: Start Chatting

After the channel is enabled, users can interact with the bot on that Misskey instance.

Misskey in Memoh is generally best suited for:

  • replies to users
  • text and Markdown-style output
  • reaction-aware social conversations

Features Supported

  • Text
  • Markdown
  • Replies
  • Reactions

Current limitations:

  • No attachments / media upload
  • No streaming output
',18)])])}const g=t(a,[["render",i]]);export{d as __pageData,g as default}; +import{_ as t,o as n,c as s,ag as o}from"./chunks/framework.CAXxHpAX.js";const d=JSON.parse('{"title":"Misskey Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/misskey.md","filePath":"channels/misskey.md","lastUpdated":1776332711000}'),a={name:"channels/misskey.md"};function i(r,e,l,c,h,u){return n(),s("div",null,[...e[0]||(e[0]=[o('

Misskey Channel Configuration

Memoh can connect a bot to a Misskey server so it can read inbound mentions and reply as a Misskey account. This adapter is best for text-first social interactions on self-hosted or public Misskey instances.

Step 1: Prepare A Misskey Account And Token

  1. Sign in to the Misskey instance you want to use.
  2. Create or choose the account that should represent your bot.
  3. Generate an Access Token for that account.

Memoh needs:

  • Instance URL: for example https://misskey.io
  • Access Token: a token for the bot account

The exact token-creation UI varies by Misskey instance. Make sure the token is allowed to read inbound events for the bot account and publish replies.

Step 2: Configure Memoh

  1. Open your bot in the Memoh Web UI.
  2. Go to Platforms.
  3. Click Add Channel and choose Misskey.
  4. Enter the Instance URL.
  5. Paste the Access Token.
  6. Click Save and Enable.

Memoh uses these credentials to discover the bot identity and start the Misskey connection.

Step 3: Start Chatting

After the channel is enabled, users can interact with the bot on that Misskey instance.

Misskey in Memoh is generally best suited for:

  • replies to users
  • text and Markdown-style output
  • reaction-aware social conversations

Features Supported

  • Text
  • Markdown
  • Replies
  • Reactions

Current limitations:

  • No attachments / media upload
  • No streaming output
',18)])])}const g=t(a,[["render",i]]);export{d as __pageData,g as default}; diff --git a/assets/channels_misskey.md.BjR2GOoQ.lean.js b/assets/channels_misskey.md.K_p2b9tc.lean.js similarity index 71% rename from assets/channels_misskey.md.BjR2GOoQ.lean.js rename to assets/channels_misskey.md.K_p2b9tc.lean.js index 666874aa..f3755af8 100644 --- a/assets/channels_misskey.md.BjR2GOoQ.lean.js +++ b/assets/channels_misskey.md.K_p2b9tc.lean.js @@ -1 +1 @@ -import{_ as t,o as n,c as s,ag as o}from"./chunks/framework.DXGyWiRo.js";const d=JSON.parse('{"title":"Misskey Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/misskey.md","filePath":"channels/misskey.md","lastUpdated":1776332711000}'),a={name:"channels/misskey.md"};function i(r,e,l,c,h,u){return n(),s("div",null,[...e[0]||(e[0]=[o("",18)])])}const g=t(a,[["render",i]]);export{d as __pageData,g as default}; +import{_ as t,o as n,c as s,ag as o}from"./chunks/framework.CAXxHpAX.js";const d=JSON.parse('{"title":"Misskey Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/misskey.md","filePath":"channels/misskey.md","lastUpdated":1776332711000}'),a={name:"channels/misskey.md"};function i(r,e,l,c,h,u){return n(),s("div",null,[...e[0]||(e[0]=[o("",18)])])}const g=t(a,[["render",i]]);export{d as __pageData,g as default}; diff --git a/assets/channels_qq.md.BiHC52Zm.js b/assets/channels_qq.md.xrtB7-Cp.js similarity index 98% rename from assets/channels_qq.md.BiHC52Zm.js rename to assets/channels_qq.md.xrtB7-Cp.js index f9bae9da..84decd57 100644 --- a/assets/channels_qq.md.BiHC52Zm.js +++ b/assets/channels_qq.md.xrtB7-Cp.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1774787421000}'),r={name:"channels/qq.md"};function i(l,t,s,c,g,p){return o(),a("div",null,[...t[0]||(t[0]=[n('

QQ Channel Configuration

Connecting your Memoh Bot to QQ allows it to interact with users through QQ's official Bot platform.

Step 1: Create a QQ Bot

  1. Go to the QQ Bot Open Platform and log in with your QQ account.
  2. Click Create Bot (创建机器人) - no approval required. Each account can create up to 5 bots.
  3. Copy the AppID and AppSecret displayed on the page.

Important: AppSecret is only shown once. Save it securely - viewing it again will force a reset.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select QQ.
  3. Paste your AppID and AppSecret.
  4. Configure optional settings:
    • Markdown Support: Enable Markdown formatting (default: enabled).
    • Enable Input Hint: Show typing indicators (default: enabled).
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your QQ identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select QQ and click Generate.
  3. Copy the code and send it to your bot in a QQ direct message.

Features Supported

  • Message Content: Full support for text messages.
  • Markdown: Rich formatting with bold, italic, code blocks, and links.
  • Attachments: Support for images and files.
  • Typing Indicators: Visual feedback while generating responses.
  • Target Types: C2C (direct message), group, and channel.

Official Resources

',14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default}; +import{_ as e,o,c as a,ag as n}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1774787421000}'),r={name:"channels/qq.md"};function i(l,t,s,c,g,p){return o(),a("div",null,[...t[0]||(t[0]=[n('

QQ Channel Configuration

Connecting your Memoh Bot to QQ allows it to interact with users through QQ's official Bot platform.

Step 1: Create a QQ Bot

  1. Go to the QQ Bot Open Platform and log in with your QQ account.
  2. Click Create Bot (创建机器人) - no approval required. Each account can create up to 5 bots.
  3. Copy the AppID and AppSecret displayed on the page.

Important: AppSecret is only shown once. Save it securely - viewing it again will force a reset.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select QQ.
  3. Paste your AppID and AppSecret.
  4. Configure optional settings:
    • Markdown Support: Enable Markdown formatting (default: enabled).
    • Enable Input Hint: Show typing indicators (default: enabled).
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your QQ identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select QQ and click Generate.
  3. Copy the code and send it to your bot in a QQ direct message.

Features Supported

  • Message Content: Full support for text messages.
  • Markdown: Rich formatting with bold, italic, code blocks, and links.
  • Attachments: Support for images and files.
  • Typing Indicators: Visual feedback while generating responses.
  • Target Types: C2C (direct message), group, and channel.

Official Resources

',14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default}; diff --git a/assets/channels_qq.md.BiHC52Zm.lean.js b/assets/channels_qq.md.xrtB7-Cp.lean.js similarity index 85% rename from assets/channels_qq.md.BiHC52Zm.lean.js rename to assets/channels_qq.md.xrtB7-Cp.lean.js index 5f2147e4..8e52b515 100644 --- a/assets/channels_qq.md.BiHC52Zm.lean.js +++ b/assets/channels_qq.md.xrtB7-Cp.lean.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1774787421000}'),r={name:"channels/qq.md"};function i(l,t,s,c,g,p){return o(),a("div",null,[...t[0]||(t[0]=[n("",14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default}; +import{_ as e,o,c as a,ag as n}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1774787421000}'),r={name:"channels/qq.md"};function i(l,t,s,c,g,p){return o(),a("div",null,[...t[0]||(t[0]=[n("",14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default}; diff --git a/assets/channels_slack.md.DYyx2j2i.js b/assets/channels_slack.md.DJzfVI9g.js similarity index 97% rename from assets/channels_slack.md.DYyx2j2i.js rename to assets/channels_slack.md.DJzfVI9g.js index d1a735e7..a241629b 100644 --- a/assets/channels_slack.md.DYyx2j2i.js +++ b/assets/channels_slack.md.DJzfVI9g.js @@ -1 +1 @@ -import{_ as o,o as t,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Slack Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/slack.md","filePath":"channels/slack.md","lastUpdated":1776579425000}'),s={name:"channels/slack.md"};function i(l,e,r,c,d,p){return t(),a("div",null,[...e[0]||(e[0]=[n('

Slack Channel Configuration

Connecting your Memoh Bot to Slack allows it to receive direct messages, participate in channels and threads, read attachments, send files, and use streaming replies.

Step 1: Create a Slack App

  1. Go to the Slack API dashboard and create a new app.
  2. Choose the workspace where you want to install the bot.
  3. Open Basic Information and keep this app page open for the next steps.

Step 2: Enable Socket Mode

Memoh's Slack adapter uses Socket Mode, so you need an app-level token in addition to the bot token.

  1. In Basic Information, enable Socket Mode.
  2. Create an App-Level Token with the connections:write scope.
  3. Copy the generated token. It starts with xapp-.

Step 3: Configure Bot Token Scopes

In OAuth & Permissions, add the bot token scopes required by the current Slack adapter:

  • app_mentions:read - receive bot mentions in channels
  • channels:history - read messages in public channels
  • groups:history - read messages in private channels
  • im:history - read direct messages
  • mpim:history - read group direct messages
  • chat:write - send replies and thread messages
  • files:read - read uploaded files and images
  • files:write - upload outbound files
  • reactions:write - add and remove reactions

You should also add these recommended scopes if you want Slack conversation names and metadata to show up more completely in Memoh:

  • channels:read
  • groups:read
  • im:read
  • mpim:read

Step 4: Subscribe to Bot Events

In Event Subscriptions, enable bot events and add:

  • app_mention
  • message.channels
  • message.groups
  • message.im
  • message.mpim

These are the inbound event types currently handled by the Slack adapter.

Step 5: Install the App to Your Workspace

  1. In OAuth & Permissions, click Install to Workspace.
  2. Review the permission screen.
  3. Authorize the app.
  4. Copy the Bot User OAuth Token. It starts with xoxb-.

Make sure the xoxb-... bot token and the xapp-... app-level token come from the same Slack app and workspace.

Step 6: Configure Memoh

  1. Open your Bot detail page in the Memoh Web UI.
  2. Go to the Platforms tab.
  3. Click Add Channel and select Slack.
  4. Fill in:
    • Bot Token: your xoxb-... token
    • App-Level Token: your xapp-... token
  5. Click Save and Enable.

Step 7: Add the Bot to Conversations

After the channel is enabled, the Slack app still needs to be present in the conversations where you want it to work.

  • For direct messages: open a DM with the app and send a message.
  • For public channels: invite the bot to the channel.
  • For private channels: invite the bot explicitly after installation.

If the bot can send messages but cannot read uploaded images or files, check that files:read is enabled. If it connects but receives no incoming messages, check the bot events and the matching history scopes again.

Features Supported

  • Direct Messages and Channels: Support for DMs, public channels, private channels, and threads.
  • Attachments: Read uploaded images and files from Slack, and send files back.
',27)])])}const m=o(s,[["render",i]]);export{u as __pageData,m as default}; +import{_ as o,o as t,c as a,ag as n}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Slack Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/slack.md","filePath":"channels/slack.md","lastUpdated":1776579425000}'),s={name:"channels/slack.md"};function i(l,e,r,c,d,p){return t(),a("div",null,[...e[0]||(e[0]=[n('

Slack Channel Configuration

Connecting your Memoh Bot to Slack allows it to receive direct messages, participate in channels and threads, read attachments, send files, and use streaming replies.

Step 1: Create a Slack App

  1. Go to the Slack API dashboard and create a new app.
  2. Choose the workspace where you want to install the bot.
  3. Open Basic Information and keep this app page open for the next steps.

Step 2: Enable Socket Mode

Memoh's Slack adapter uses Socket Mode, so you need an app-level token in addition to the bot token.

  1. In Basic Information, enable Socket Mode.
  2. Create an App-Level Token with the connections:write scope.
  3. Copy the generated token. It starts with xapp-.

Step 3: Configure Bot Token Scopes

In OAuth & Permissions, add the bot token scopes required by the current Slack adapter:

  • app_mentions:read - receive bot mentions in channels
  • channels:history - read messages in public channels
  • groups:history - read messages in private channels
  • im:history - read direct messages
  • mpim:history - read group direct messages
  • chat:write - send replies and thread messages
  • files:read - read uploaded files and images
  • files:write - upload outbound files
  • reactions:write - add and remove reactions

You should also add these recommended scopes if you want Slack conversation names and metadata to show up more completely in Memoh:

  • channels:read
  • groups:read
  • im:read
  • mpim:read

Step 4: Subscribe to Bot Events

In Event Subscriptions, enable bot events and add:

  • app_mention
  • message.channels
  • message.groups
  • message.im
  • message.mpim

These are the inbound event types currently handled by the Slack adapter.

Step 5: Install the App to Your Workspace

  1. In OAuth & Permissions, click Install to Workspace.
  2. Review the permission screen.
  3. Authorize the app.
  4. Copy the Bot User OAuth Token. It starts with xoxb-.

Make sure the xoxb-... bot token and the xapp-... app-level token come from the same Slack app and workspace.

Step 6: Configure Memoh

  1. Open your Bot detail page in the Memoh Web UI.
  2. Go to the Platforms tab.
  3. Click Add Channel and select Slack.
  4. Fill in:
    • Bot Token: your xoxb-... token
    • App-Level Token: your xapp-... token
  5. Click Save and Enable.

Step 7: Add the Bot to Conversations

After the channel is enabled, the Slack app still needs to be present in the conversations where you want it to work.

  • For direct messages: open a DM with the app and send a message.
  • For public channels: invite the bot to the channel.
  • For private channels: invite the bot explicitly after installation.

If the bot can send messages but cannot read uploaded images or files, check that files:read is enabled. If it connects but receives no incoming messages, check the bot events and the matching history scopes again.

Features Supported

  • Direct Messages and Channels: Support for DMs, public channels, private channels, and threads.
  • Attachments: Read uploaded images and files from Slack, and send files back.
',27)])])}const m=o(s,[["render",i]]);export{u as __pageData,m as default}; diff --git a/assets/channels_slack.md.DYyx2j2i.lean.js b/assets/channels_slack.md.DJzfVI9g.lean.js similarity index 71% rename from assets/channels_slack.md.DYyx2j2i.lean.js rename to assets/channels_slack.md.DJzfVI9g.lean.js index 93b51abd..0573a29f 100644 --- a/assets/channels_slack.md.DYyx2j2i.lean.js +++ b/assets/channels_slack.md.DJzfVI9g.lean.js @@ -1 +1 @@ -import{_ as o,o as t,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Slack Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/slack.md","filePath":"channels/slack.md","lastUpdated":1776579425000}'),s={name:"channels/slack.md"};function i(l,e,r,c,d,p){return t(),a("div",null,[...e[0]||(e[0]=[n("",27)])])}const m=o(s,[["render",i]]);export{u as __pageData,m as default}; +import{_ as o,o as t,c as a,ag as n}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Slack Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/slack.md","filePath":"channels/slack.md","lastUpdated":1776579425000}'),s={name:"channels/slack.md"};function i(l,e,r,c,d,p){return t(),a("div",null,[...e[0]||(e[0]=[n("",27)])])}const m=o(s,[["render",i]]);export{u as __pageData,m as default}; diff --git a/assets/channels_telegram.md.WGR_O6_O.js b/assets/channels_telegram.md.DHWAMJPN.js similarity index 98% rename from assets/channels_telegram.md.WGR_O6_O.js rename to assets/channels_telegram.md.DHWAMJPN.js index 703e9e70..67464543 100644 --- a/assets/channels_telegram.md.WGR_O6_O.js +++ b/assets/channels_telegram.md.DHWAMJPN.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1774787421000}'),r={name:"channels/telegram.md"};function l(i,e,s,g,d,h){return o(),a("div",null,[...e[0]||(e[0]=[n('

Telegram Channel Configuration

This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.

Step 1: Create a Telegram Bot

You need to create a bot on Telegram to get an API token.

  1. Open Telegram and search for the official @BotFather bot.
  2. Send the /newbot command.
  3. Follow the prompts:
    • Name: Choose a display name for your bot (e.g., My Memoh Bot).
    • Username: Choose a unique username ending in bot (e.g., my_memoh_bot).
  4. BotFather will provide you with an API Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz). Keep this token secret.

Official Guide: Telegram Bot Tutorial

Step 2: Configure Memoh

  1. Go to your Bot's Detail Page in the Memoh Web UI.
  2. Select the Platforms tab.
  3. Click Add Channel and select Telegram.
  4. Paste your API Token into the credentials field.
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your Telegram identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select Telegram and click Generate.
  3. Copy the code.
  4. Open a chat with your new bot on Telegram and send the bind code.
  5. The bot should respond that your identity is successfully linked.

Features Supported

  • Streaming: Responses appear as the bot "thinks."
  • Markdown: Support for bold, italic, code blocks, and links.
  • Attachments: Send images or files to the bot; the bot can also send files back.
  • Replies: The bot understands context from message replies.
',13)])])}const m=t(r,[["render",l]]);export{u as __pageData,m as default}; +import{_ as t,o,c as a,ag as n}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1774787421000}'),r={name:"channels/telegram.md"};function l(i,e,s,g,d,h){return o(),a("div",null,[...e[0]||(e[0]=[n('

Telegram Channel Configuration

This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.

Step 1: Create a Telegram Bot

You need to create a bot on Telegram to get an API token.

  1. Open Telegram and search for the official @BotFather bot.
  2. Send the /newbot command.
  3. Follow the prompts:
    • Name: Choose a display name for your bot (e.g., My Memoh Bot).
    • Username: Choose a unique username ending in bot (e.g., my_memoh_bot).
  4. BotFather will provide you with an API Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz). Keep this token secret.

Official Guide: Telegram Bot Tutorial

Step 2: Configure Memoh

  1. Go to your Bot's Detail Page in the Memoh Web UI.
  2. Select the Platforms tab.
  3. Click Add Channel and select Telegram.
  4. Paste your API Token into the credentials field.
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your Telegram identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select Telegram and click Generate.
  3. Copy the code.
  4. Open a chat with your new bot on Telegram and send the bind code.
  5. The bot should respond that your identity is successfully linked.

Features Supported

  • Streaming: Responses appear as the bot "thinks."
  • Markdown: Support for bold, italic, code blocks, and links.
  • Attachments: Send images or files to the bot; the bot can also send files back.
  • Replies: The bot understands context from message replies.
',13)])])}const m=t(r,[["render",l]]);export{u as __pageData,m as default}; diff --git a/assets/channels_telegram.md.WGR_O6_O.lean.js b/assets/channels_telegram.md.DHWAMJPN.lean.js similarity index 85% rename from assets/channels_telegram.md.WGR_O6_O.lean.js rename to assets/channels_telegram.md.DHWAMJPN.lean.js index fd9d75a0..b46d7dad 100644 --- a/assets/channels_telegram.md.WGR_O6_O.lean.js +++ b/assets/channels_telegram.md.DHWAMJPN.lean.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1774787421000}'),r={name:"channels/telegram.md"};function l(i,e,s,g,d,h){return o(),a("div",null,[...e[0]||(e[0]=[n("",13)])])}const m=t(r,[["render",l]]);export{u as __pageData,m as default}; +import{_ as t,o,c as a,ag as n}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1774787421000}'),r={name:"channels/telegram.md"};function l(i,e,s,g,d,h){return o(),a("div",null,[...e[0]||(e[0]=[n("",13)])])}const m=t(r,[["render",l]]);export{u as __pageData,m as default}; diff --git a/assets/channels_wechatoa.md.d_VUeGe9.js b/assets/channels_wechatoa.md.6qw2hORh.js similarity index 96% rename from assets/channels_wechatoa.md.d_VUeGe9.js rename to assets/channels_wechatoa.md.6qw2hORh.js index d4a557d8..448eefea 100644 --- a/assets/channels_wechatoa.md.d_VUeGe9.js +++ b/assets/channels_wechatoa.md.6qw2hORh.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"WeChat Official Account Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wechatoa.md","filePath":"channels/wechatoa.md","lastUpdated":1776332711000}'),i={name:"channels/wechatoa.md"};function r(l,e,s,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[n('

WeChat Official Account Channel Configuration

This guide covers the WeChat Official Account adapter in Memoh. It is different from the personal WeChat QR-login adapter: this one is for official-account webhook integration and is intended for inbound private-message scenarios.

Step 1: Prepare Official Account Credentials

From the WeChat Official Account platform, prepare:

  • App ID
  • App Secret
  • Token

You may also need:

  • Encoding AES Key if you use encrypted webhook delivery
  • an outbound HTTP Proxy URL if your deployment must reach WeChat APIs through a proxy

Step 2: Add The Channel In Memoh

  1. Open your bot in the Memoh Web UI.
  2. Go to Platforms.
  3. Click Add Channel and choose WeChat Official Account.
  4. Fill in the required fields:
    • App ID
    • App Secret
    • Token
  5. Choose the Encryption Mode.
  6. If you use safe or compat mode, also provide the Encoding AES Key.
  7. Save the channel.

Memoh generates a Webhook Callback URL after the channel has been saved.

Step 3: Configure The WeChat Platform

  1. Copy the Webhook Callback URL from Memoh.
  2. Paste it into the WeChat Official Account platform callback configuration.
  3. Make sure the WeChat platform and Memoh use the same:
    • Token
    • Encryption Mode
    • Encoding AES Key when encryption is enabled

WeChat will verify the callback before delivering real messages.

Step 4: Enable And Test

  1. Enable the channel in Memoh.
  2. Send a test private message from the official account side.
  3. Confirm that Memoh receives the message and the bot can reply.

Features Supported

  • Private chats
  • Replies
  • Attachments and media

Current behavior notes:

  • This adapter is intended for private-message conversations, not group-style chats.
  • Outbound responses are non-streaming on this channel.
',19)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"WeChat Official Account Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wechatoa.md","filePath":"channels/wechatoa.md","lastUpdated":1776332711000}'),i={name:"channels/wechatoa.md"};function r(l,e,s,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[n('

WeChat Official Account Channel Configuration

This guide covers the WeChat Official Account adapter in Memoh. It is different from the personal WeChat QR-login adapter: this one is for official-account webhook integration and is intended for inbound private-message scenarios.

Step 1: Prepare Official Account Credentials

From the WeChat Official Account platform, prepare:

  • App ID
  • App Secret
  • Token

You may also need:

  • Encoding AES Key if you use encrypted webhook delivery
  • an outbound HTTP Proxy URL if your deployment must reach WeChat APIs through a proxy

Step 2: Add The Channel In Memoh

  1. Open your bot in the Memoh Web UI.
  2. Go to Platforms.
  3. Click Add Channel and choose WeChat Official Account.
  4. Fill in the required fields:
    • App ID
    • App Secret
    • Token
  5. Choose the Encryption Mode.
  6. If you use safe or compat mode, also provide the Encoding AES Key.
  7. Save the channel.

Memoh generates a Webhook Callback URL after the channel has been saved.

Step 3: Configure The WeChat Platform

  1. Copy the Webhook Callback URL from Memoh.
  2. Paste it into the WeChat Official Account platform callback configuration.
  3. Make sure the WeChat platform and Memoh use the same:
    • Token
    • Encryption Mode
    • Encoding AES Key when encryption is enabled

WeChat will verify the callback before delivering real messages.

Step 4: Enable And Test

  1. Enable the channel in Memoh.
  2. Send a test private message from the official account side.
  3. Confirm that Memoh receives the message and the bot can reply.

Features Supported

  • Private chats
  • Replies
  • Attachments and media

Current behavior notes:

  • This adapter is intended for private-message conversations, not group-style chats.
  • Outbound responses are non-streaming on this channel.
',19)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/channels_wechatoa.md.d_VUeGe9.lean.js b/assets/channels_wechatoa.md.6qw2hORh.lean.js similarity index 73% rename from assets/channels_wechatoa.md.d_VUeGe9.lean.js rename to assets/channels_wechatoa.md.6qw2hORh.lean.js index 535b6635..6ffb3a14 100644 --- a/assets/channels_wechatoa.md.d_VUeGe9.lean.js +++ b/assets/channels_wechatoa.md.6qw2hORh.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"WeChat Official Account Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wechatoa.md","filePath":"channels/wechatoa.md","lastUpdated":1776332711000}'),i={name:"channels/wechatoa.md"};function r(l,e,s,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[n("",19)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"WeChat Official Account Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wechatoa.md","filePath":"channels/wechatoa.md","lastUpdated":1776332711000}'),i={name:"channels/wechatoa.md"};function r(l,e,s,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[n("",19)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/channels_wecom.md.D7yBtNrz.js b/assets/channels_wecom.md.CvQSc0QF.js similarity index 98% rename from assets/channels_wecom.md.D7yBtNrz.js rename to assets/channels_wecom.md.CvQSc0QF.js index fc51ae93..3697b0bb 100644 --- a/assets/channels_wecom.md.D7yBtNrz.js +++ b/assets/channels_wecom.md.CvQSc0QF.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"WeCom (WeWork) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wecom.md","filePath":"channels/wecom.md","lastUpdated":1774787421000}'),n={name:"channels/wecom.md"};function i(s,e,l,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

WeCom (WeWork) Channel Configuration

Connecting your Memoh Bot to WeCom (企业微信) allows it to interact with users within your organization's WeCom workspace.

Step 1: Create a WeCom Bot

  1. Log in to the WeCom Admin Console.
  2. Navigate to App Management > Custom Apps or Bot Management.
  3. Create a new bot application.
  4. Note the Bot ID and Secret credentials.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeCom.
  3. Fill in the required fields:
FieldRequiredDescription
Bot IDYesThe WeCom bot identifier.
SecretYesThe bot's authentication credential.
WebSocket URLNoCustom WebSocket endpoint (uses default if empty).
  1. Click Save and Enable.

Step 3: Start Chatting

Once the channel is enabled, the bot will connect to WeCom via WebSocket and begin receiving messages. Users in your WeCom workspace can send messages to the bot directly or in group chats.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Group Chats: Participate in group conversations.
  • Streaming: Responses are streamed in real-time.

Official Resources

',14)])])}const u=t(n,[["render",i]]);export{m as __pageData,u as default}; +import{_ as t,o,c as a,ag as r}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"WeCom (WeWork) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wecom.md","filePath":"channels/wecom.md","lastUpdated":1774787421000}'),n={name:"channels/wecom.md"};function i(s,e,l,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

WeCom (WeWork) Channel Configuration

Connecting your Memoh Bot to WeCom (企业微信) allows it to interact with users within your organization's WeCom workspace.

Step 1: Create a WeCom Bot

  1. Log in to the WeCom Admin Console.
  2. Navigate to App Management > Custom Apps or Bot Management.
  3. Create a new bot application.
  4. Note the Bot ID and Secret credentials.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeCom.
  3. Fill in the required fields:
FieldRequiredDescription
Bot IDYesThe WeCom bot identifier.
SecretYesThe bot's authentication credential.
WebSocket URLNoCustom WebSocket endpoint (uses default if empty).
  1. Click Save and Enable.

Step 3: Start Chatting

Once the channel is enabled, the bot will connect to WeCom via WebSocket and begin receiving messages. Users in your WeCom workspace can send messages to the bot directly or in group chats.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Group Chats: Participate in group conversations.
  • Streaming: Responses are streamed in real-time.

Official Resources

',14)])])}const u=t(n,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/channels_wecom.md.D7yBtNrz.lean.js b/assets/channels_wecom.md.CvQSc0QF.lean.js similarity index 85% rename from assets/channels_wecom.md.D7yBtNrz.lean.js rename to assets/channels_wecom.md.CvQSc0QF.lean.js index dae39036..6c220907 100644 --- a/assets/channels_wecom.md.D7yBtNrz.lean.js +++ b/assets/channels_wecom.md.CvQSc0QF.lean.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"WeCom (WeWork) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wecom.md","filePath":"channels/wecom.md","lastUpdated":1774787421000}'),n={name:"channels/wecom.md"};function i(s,e,l,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",14)])])}const u=t(n,[["render",i]]);export{m as __pageData,u as default}; +import{_ as t,o,c as a,ag as r}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"WeCom (WeWork) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wecom.md","filePath":"channels/wecom.md","lastUpdated":1774787421000}'),n={name:"channels/wecom.md"};function i(s,e,l,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",14)])])}const u=t(n,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/channels_weixin.md.Ckccg7Ew.js b/assets/channels_weixin.md.NGCJG9Zr.js similarity index 95% rename from assets/channels_weixin.md.Ckccg7Ew.js rename to assets/channels_weixin.md.NGCJG9Zr.js index 8055ca90..235d6f11 100644 --- a/assets/channels_weixin.md.Ckccg7Ew.js +++ b/assets/channels_weixin.md.NGCJG9Zr.js @@ -1 +1 @@ -import{_ as t,o as a,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"WeChat Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/weixin.md","filePath":"channels/weixin.md","lastUpdated":1774787421000}'),i={name:"channels/weixin.md"};function r(s,e,l,h,d,c){return a(),n("div",null,[...e[0]||(e[0]=[o('

WeChat Channel Configuration

Connecting your Memoh Bot to WeChat allows it to interact with users directly via WeChat personal messaging. Setup is simple — just scan a QR code.

Step 1: Add WeChat Channel in Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeChat.

Step 2: Scan the QR Code

  1. Click Start QR Login. Memoh will fetch a QR code from the WeChat platform.
  2. Open WeChat on your phone and scan the displayed QR code.
  3. Confirm the login on your phone when prompted.
  4. Once confirmed, Memoh automatically saves the credentials — no manual token or API key entry is needed.

The QR code has a limited validity window. If it expires before you scan, click Start QR Login again to get a fresh one.

Step 3: Start Chatting

After the QR login succeeds, the channel is automatically enabled. Users can now send messages to the bot directly in WeChat.

Optional Settings

FieldDescription
Enable TypingShow typing indicators while generating responses.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Attachments: Support for images and media.
  • Typing Indicators: Visual feedback while generating responses (when enabled).
',13)])])}const u=t(i,[["render",r]]);export{g as __pageData,u as default}; +import{_ as t,o as a,c as n,ag as o}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"WeChat Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/weixin.md","filePath":"channels/weixin.md","lastUpdated":1774787421000}'),i={name:"channels/weixin.md"};function r(s,e,l,h,d,c){return a(),n("div",null,[...e[0]||(e[0]=[o('

WeChat Channel Configuration

Connecting your Memoh Bot to WeChat allows it to interact with users directly via WeChat personal messaging. Setup is simple — just scan a QR code.

Step 1: Add WeChat Channel in Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeChat.

Step 2: Scan the QR Code

  1. Click Start QR Login. Memoh will fetch a QR code from the WeChat platform.
  2. Open WeChat on your phone and scan the displayed QR code.
  3. Confirm the login on your phone when prompted.
  4. Once confirmed, Memoh automatically saves the credentials — no manual token or API key entry is needed.

The QR code has a limited validity window. If it expires before you scan, click Start QR Login again to get a fresh one.

Step 3: Start Chatting

After the QR login succeeds, the channel is automatically enabled. Users can now send messages to the bot directly in WeChat.

Optional Settings

FieldDescription
Enable TypingShow typing indicators while generating responses.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Attachments: Support for images and media.
  • Typing Indicators: Visual feedback while generating responses (when enabled).
',13)])])}const u=t(i,[["render",r]]);export{g as __pageData,u as default}; diff --git a/assets/channels_weixin.md.Ckccg7Ew.lean.js b/assets/channels_weixin.md.NGCJG9Zr.lean.js similarity index 71% rename from assets/channels_weixin.md.Ckccg7Ew.lean.js rename to assets/channels_weixin.md.NGCJG9Zr.lean.js index 7f017c7d..3948e7ea 100644 --- a/assets/channels_weixin.md.Ckccg7Ew.lean.js +++ b/assets/channels_weixin.md.NGCJG9Zr.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"WeChat Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/weixin.md","filePath":"channels/weixin.md","lastUpdated":1774787421000}'),i={name:"channels/weixin.md"};function r(s,e,l,h,d,c){return a(),n("div",null,[...e[0]||(e[0]=[o("",13)])])}const u=t(i,[["render",r]]);export{g as __pageData,u as default}; +import{_ as t,o as a,c as n,ag as o}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"WeChat Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/weixin.md","filePath":"channels/weixin.md","lastUpdated":1774787421000}'),i={name:"channels/weixin.md"};function r(s,e,l,h,d,c){return a(),n("div",null,[...e[0]||(e[0]=[o("",13)])])}const u=t(i,[["render",r]]);export{g as __pageData,u as default}; diff --git a/assets/chunks/@localSearchIndexroot.Bq5adVMH.js b/assets/chunks/@localSearchIndexroot.Bq5adVMH.js new file mode 100644 index 00000000..5b271cf9 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.Bq5adVMH.js @@ -0,0 +1 @@ +const e='{"documentCount":361,"nextId":361,"documentIds":{"0":"/about.html#about-memoh","1":"/about.html#what-is-memoh","2":"/about.html#what-makes-memoh-different","3":"/about.html#multi-bot-and-multi-user","4":"/about.html#containerized-workspaces","5":"/about.html#long-term-memory-and-context-management","6":"/about.html#sessions-and-discuss-mode","7":"/about.html#broad-channel-coverage","8":"/about.html#tools-skills-mcp-and-supermarket","9":"/about.html#providers-and-models","10":"/about.html#operations-and-ui","11":"/about.html#where-to-start","12":"/blogs/2026-02-16.html#introduction-to-memoh-the-case-for-an-always-on-containerized-home-agent","13":"/blogs/2026-02-16.html#overview","14":"/blogs/2026-02-16.html#story-time","15":"/blogs/2026-02-16.html#what","16":"/blogs/2026-02-16.html#why","17":"/blogs/2026-02-16.html#how","18":"/blogs/2026-02-16.html#features","19":"/blogs/2026-02-16.html#compare-to-openclaw","20":"/blogs/2026-02-16.html#conclusion","21":"/blogs/#blogs","22":"/channels/dingtalk.html#dingtalk-channel-configuration","23":"/channels/dingtalk.html#step-1-create-a-dingtalk-app","24":"/channels/dingtalk.html#step-2-configure-memoh","25":"/channels/dingtalk.html#step-3-verify-messaging","26":"/channels/dingtalk.html#features-supported","27":"/channels/discord.html#discord-channel-configuration","28":"/channels/discord.html#step-1-create-a-discord-application","29":"/channels/discord.html#step-2-configure-bot-settings","30":"/channels/discord.html#step-3-invite-the-bot-to-your-server","31":"/channels/discord.html#step-4-configure-memoh","32":"/channels/discord.html#features-supported","33":"/channels/feishu.html#feishu-lark-channel-configuration","34":"/channels/feishu.html#step-1-create-a-feishu-app","35":"/channels/feishu.html#step-2-enable-bot-capability","36":"/channels/feishu.html#step-3-configure-permissions","37":"/channels/feishu.html#step-4-configure-events-webhook-mode","38":"/channels/feishu.html#step-5-publish-your-app","39":"/channels/#channels-overview","40":"/channels/#wechat-vs-wechat-official-account","41":"/channels/#general-setup-flow","42":"/channels/misskey.html#misskey-channel-configuration","43":"/channels/misskey.html#step-1-prepare-a-misskey-account-and-token","44":"/channels/misskey.html#step-2-configure-memoh","45":"/channels/misskey.html#step-3-start-chatting","46":"/channels/misskey.html#features-supported","47":"/channels/qq.html#qq-channel-configuration","48":"/channels/qq.html#step-1-create-a-qq-bot","49":"/channels/qq.html#step-2-configure-memoh","50":"/channels/qq.html#step-3-bind-your-identity-optional","51":"/channels/qq.html#features-supported","52":"/channels/qq.html#official-resources","53":"/channels/matrix.html#matrix-channel-configuration","54":"/channels/matrix.html#step-1-create-a-matrix-bot-account","55":"/channels/matrix.html#step-2-configure-memoh","56":"/channels/matrix.html#step-3-invite-the-bot","57":"/channels/matrix.html#features-supported","58":"/channels/matrix.html#official-resources","59":"/channels/slack.html#slack-channel-configuration","60":"/channels/slack.html#step-1-create-a-slack-app","61":"/channels/slack.html#step-2-enable-socket-mode","62":"/channels/slack.html#step-3-configure-bot-token-scopes","63":"/channels/slack.html#step-4-subscribe-to-bot-events","64":"/channels/slack.html#step-5-install-the-app-to-your-workspace","65":"/channels/slack.html#step-6-configure-memoh","66":"/channels/slack.html#step-7-add-the-bot-to-conversations","67":"/channels/slack.html#features-supported","68":"/channels/wechatoa.html#wechat-official-account-channel-configuration","69":"/channels/wechatoa.html#step-1-prepare-official-account-credentials","70":"/channels/wechatoa.html#step-2-add-the-channel-in-memoh","71":"/channels/wechatoa.html#step-3-configure-the-wechat-platform","72":"/channels/wechatoa.html#step-4-enable-and-test","73":"/channels/wechatoa.html#features-supported","74":"/channels/telegram.html#telegram-channel-configuration","75":"/channels/telegram.html#step-1-create-a-telegram-bot","76":"/channels/telegram.html#step-2-configure-memoh","77":"/channels/telegram.html#step-3-bind-your-identity-optional","78":"/channels/telegram.html#features-supported","79":"/channels/wecom.html#wecom-wework-channel-configuration","80":"/channels/wecom.html#step-1-create-a-wecom-bot","81":"/channels/wecom.html#step-2-configure-memoh","82":"/channels/wecom.html#step-3-start-chatting","83":"/channels/wecom.html#features-supported","84":"/channels/wecom.html#official-resources","85":"/channels/weixin.html#wechat-channel-configuration","86":"/channels/weixin.html#step-1-add-wechat-channel-in-memoh","87":"/channels/weixin.html#step-2-scan-the-qr-code","88":"/channels/weixin.html#step-3-start-chatting","89":"/channels/weixin.html#optional-settings","90":"/channels/weixin.html#features-supported","91":"/getting-started/access.html#bot-access-control","92":"/getting-started/access.html#quick-start-acl-presets","93":"/getting-started/access.html#concepts","94":"/getting-started/access.html#default-effect","95":"/getting-started/access.html#subject-types","96":"/getting-started/access.html#rule-effects","97":"/getting-started/access.html#priority-based-evaluation","98":"/getting-started/access.html#managing-access","99":"/getting-started/access.html#start-with-a-preset-then-refine","100":"/getting-started/access.html#adding-rules","101":"/getting-started/access.html#reordering-rules","102":"/getting-started/access.html#source-scope","103":"/getting-started/access.html#what-the-presets-actually-mean","104":"/getting-started/access.html#examples","105":"/getting-started/access.html#open-bot-anyone-can-chat","106":"/getting-started/access.html#private-bot-with-selected-users","107":"/getting-started/access.html#open-bot-with-blocked-users","108":"/getting-started/access.html#platform-specific-access","109":"/getting-started/access.html#channel-scoped-access","110":"/getting-started/access.html#debugging-access-decisions","111":"/getting-started/bot.html#bot-management","112":"/getting-started/bot.html#creating-a-bot","113":"/getting-started/bot.html#bot-detail-page","114":"/getting-started/bot.html#tab-overview","115":"/getting-started/bot.html#configuring-the-bot-s-core-settings","116":"/getting-started/bot.html#general-tab-reference","117":"/getting-started/bot.html#heartbeat-tab-reference","118":"/getting-started/bot.html#compaction-tab-reference","119":"/getting-started/bot.html#access-and-acl","120":"/getting-started/bot.html#discuss-related-advanced-settings","121":"/getting-started/bot.html#terminal-tab","122":"/getting-started/bot.html#deleting-a-bot","123":"/getting-started/browser.html#browser-contexts","124":"/getting-started/browser.html#concept-browser-gateway","125":"/getting-started/browser.html#creating-a-browser-context","126":"/getting-started/browser.html#configuring-a-browser-context","127":"/getting-started/browser.html#managing-contexts","128":"/getting-started/browser.html#assigning-a-browser-context-to-a-bot","129":"/getting-started/browser.html#bot-interaction","130":"/getting-started/browser.html#browser-core-selection","131":"/getting-started/browser.html#next-steps","132":"/getting-started/channels.html#bot-channels","133":"/getting-started/channels.html#concept-unified-communication","134":"/getting-started/channels.html#supported-channels","135":"/getting-started/channels.html#platform-guides","136":"/getting-started/channels.html#configuration-flow","137":"/getting-started/channels.html#_1-adding-a-channel","138":"/getting-started/channels.html#_2-common-fields","139":"/getting-started/channels.html#_3-special-case-feishu-webhook","140":"/getting-started/channels.html#_4-special-case-wechat-qr-login","141":"/getting-started/channels.html#_5-special-case-wechat-official-account-webhook","142":"/getting-started/channels.html#_6-special-case-dingtalk-stream-connection","143":"/getting-started/channels.html#operations","144":"/getting-started/compaction.html#context-compaction","145":"/getting-started/compaction.html#why-it-exists","146":"/getting-started/compaction.html#what-it-changes","147":"/getting-started/compaction.html#automatic-compaction","148":"/getting-started/compaction.html#immediate-compaction","149":"/getting-started/compaction.html#from-the-session-status-panel","150":"/getting-started/compaction.html#from-slash-commands","151":"/getting-started/compaction.html#status-and-logs","152":"/getting-started/compaction.html#relationship-to-context-window","153":"/getting-started/compaction.html#context-compaction-vs-memory-compaction","154":"/getting-started/compaction.html#next-steps","155":"/getting-started/container.html#bot-container-management","156":"/getting-started/container.html#concept-the-isolated-workspace","157":"/getting-started/container.html#operations","158":"/getting-started/container.html#lifecycle-actions","159":"/getting-started/container.html#container-information","160":"/getting-started/container.html#advanced-provide-cdi-devices","161":"/getting-started/container.html#configure-cdi-devices","162":"/getting-started/container.html#host-requirements","163":"/getting-started/container.html#important-behavior","164":"/getting-started/container.html#snapshots","165":"/getting-started/container.html#creating-a-snapshot","166":"/getting-started/container.html#restoring-a-snapshot","167":"/getting-started/container.html#managing-snapshots","168":"/getting-started/container.html#data-export-and-import","169":"/getting-started/container.html#export","170":"/getting-started/container.html#import","171":"/getting-started/container.html#restore","172":"/getting-started/container.html#container-versioning","173":"/getting-started/email.html#email-providers-and-bindings","174":"/getting-started/email.html#concept-email-as-a-bot-channel","175":"/getting-started/email.html#email-provider","176":"/getting-started/email.html#creating-a-provider","177":"/getting-started/email.html#bot-email-bindings","178":"/getting-started/email.html#adding-a-binding","179":"/getting-started/email.html#outbox-and-history","180":"/getting-started/email.html#bot-interaction","181":"/getting-started/heartbeat.html#bot-heartbeat","182":"/getting-started/heartbeat.html#concept-scheduled-autonomy","183":"/getting-started/heartbeat.html#configuration","184":"/getting-started/heartbeat.html#logs-and-monitoring","185":"/getting-started/heartbeat.html#managing-logs","186":"/getting-started/heartbeat.html#bot-interaction","187":"/getting-started/files.html#bot-files-management","188":"/getting-started/files.html#operations","189":"/getting-started/files.html#browsing-and-navigation","190":"/getting-started/files.html#managing-files","191":"/getting-started/files.html#viewing-and-editing","192":"/getting-started/files.html#text-files","193":"/getting-started/files.html#images","194":"/getting-started/files.html#bot-interaction-with-files","195":"/getting-started/mcp.html#mcp-connections","196":"/getting-started/mcp.html#concept-extending-bot-capabilities","197":"/getting-started/mcp.html#connection-types","198":"/getting-started/mcp.html#_1-stdio-local-process","199":"/getting-started/mcp.html#_2-remote-http-sse","200":"/getting-started/mcp.html#oauth-authentication","201":"/getting-started/mcp.html#operations","202":"/getting-started/mcp.html#tool-discovery","203":"/getting-started/mcp.html#bot-interaction","204":"/getting-started/memory.html#bot-memory-management","205":"/getting-started/memory.html#prerequisites","206":"/getting-started/memory.html#concept-memory-retrieval","207":"/getting-started/memory.html#operations","208":"/getting-started/memory.html#_1-creating-memories","209":"/getting-started/memory.html#_2-searching-and-managing","210":"/getting-started/memory.html#memory-compaction","211":"/getting-started/memory.html#rebuild","212":"/getting-started/memory.html#status","213":"/getting-started/memory.html#usage-statistics","214":"/getting-started/memory.html#memory-vs-session-context","215":"/getting-started/memory.html#bot-interaction","216":"/getting-started/provider-and-model.html#providers-and-models","217":"/getting-started/provider-and-model.html#provider-basics","218":"/getting-started/provider-and-model.html#creating-a-provider","219":"/getting-started/provider-and-model.html#client-types","220":"/getting-started/provider-and-model.html#oauth-based-providers","221":"/getting-started/provider-and-model.html#openai-codex","222":"/getting-started/provider-and-model.html#github-copilot","223":"/getting-started/provider-and-model.html#importing-models","224":"/getting-started/provider-and-model.html#model-types","225":"/getting-started/provider-and-model.html#chat-model-configuration","226":"/getting-started/provider-and-model.html#compatibilities","227":"/getting-started/provider-and-model.html#context-window","228":"/getting-started/provider-and-model.html#image-generation-models","229":"/getting-started/provider-and-model.html#embedding-models","230":"/getting-started/provider-and-model.html#speech-models","231":"/getting-started/provider-and-model.html#recommended-mental-model","232":"/getting-started/provider-and-model.html#next-steps","233":"/getting-started/schedule.html#scheduled-tasks","234":"/getting-started/schedule.html#concept-cron-based-automation","235":"/getting-started/schedule.html#schedule-fields","236":"/getting-started/schedule.html#cron-pattern-reference","237":"/getting-started/schedule.html#viewing-schedules","238":"/getting-started/schedule.html#creating-schedules","239":"/getting-started/schedule.html#via-the-bot-conversational","240":"/getting-started/schedule.html#via-the-api","241":"/getting-started/schedule.html#execution-flow","242":"/getting-started/schedule.html#schedule-vs-heartbeat","243":"/getting-started/search-provider.html#search-providers","244":"/getting-started/search-provider.html#concept-real-time-knowledge","245":"/getting-started/search-provider.html#supported-search-engines","246":"/getting-started/search-provider.html#configuration-flow","247":"/getting-started/search-provider.html#_1-adding-a-search-provider","248":"/getting-started/search-provider.html#_2-managing-providers","249":"/getting-started/search-provider.html#assigning-a-search-provider-to-a-bot","250":"/getting-started/search-provider.html#bot-interaction","251":"/getting-started/sessions.html#sessions","252":"/getting-started/sessions.html#concept-conversation-isolation","253":"/getting-started/sessions.html#session-types","254":"/getting-started/sessions.html#chat-vs-discuss","255":"/getting-started/sessions.html#starting-a-new-session-with-new","256":"/getting-started/sessions.html#in-external-channels-telegram-discord-feishu-etc","257":"/getting-started/sessions.html#in-the-web-ui","258":"/getting-started/sessions.html#managing-sessions","259":"/getting-started/sessions.html#viewing-sessions","260":"/getting-started/sessions.html#renaming-sessions","261":"/getting-started/sessions.html#deleting-sessions","262":"/getting-started/sessions.html#session-status-panel","263":"/getting-started/sessions.html#how-sessions-relate-to-other-features","264":"/getting-started/skills.html#bot-skills","265":"/getting-started/skills.html#what-a-skill-looks-like","266":"/getting-started/skills.html#where-skills-come-from","267":"/getting-started/skills.html#skill-states","268":"/getting-started/skills.html#typical-examples","269":"/getting-started/skills.html#managing-skills-in-the-ui","270":"/getting-started/skills.html#add-skill","271":"/getting-started/skills.html#edit-skill","272":"/getting-started/skills.html#delete-skill","273":"/getting-started/skills.html#disable-enable","274":"/getting-started/skills.html#adopt","275":"/getting-started/skills.html#effective-skills-at-runtime","276":"/getting-started/skills.html#supermarket-and-imported-skills","277":"/getting-started/skills.html#recommended-workflow","278":"/getting-started/slash-commands.html#slash-commands","279":"/getting-started/slash-commands.html#command-model","280":"/getting-started/slash-commands.html#built-in-help","281":"/getting-started/slash-commands.html#parsing-rules","282":"/getting-started/slash-commands.html#permissions","283":"/getting-started/slash-commands.html#quick-reference","284":"/getting-started/slash-commands.html#top-level-commands","285":"/getting-started/slash-commands.html#resource-groups","286":"/getting-started/slash-commands.html#session-commands","287":"/getting-started/slash-commands.html#new","288":"/getting-started/slash-commands.html#stop","289":"/getting-started/slash-commands.html#status-and-inspection-commands","290":"/getting-started/slash-commands.html#status","291":"/getting-started/slash-commands.html#access","292":"/getting-started/slash-commands.html#usage","293":"/getting-started/slash-commands.html#heartbeat","294":"/getting-started/slash-commands.html#email","295":"/getting-started/slash-commands.html#configuration-commands","296":"/getting-started/slash-commands.html#settings","297":"/getting-started/slash-commands.html#model","298":"/getting-started/slash-commands.html#memory","299":"/getting-started/slash-commands.html#search","300":"/getting-started/slash-commands.html#browser","301":"/getting-started/slash-commands.html#mcp","302":"/getting-started/slash-commands.html#automation-and-filesystem-commands","303":"/getting-started/slash-commands.html#schedule","304":"/getting-started/slash-commands.html#skill","305":"/getting-started/slash-commands.html#fs","306":"/getting-started/slash-commands.html#context-compaction-command","307":"/getting-started/slash-commands.html#compact","308":"/getting-started/supermarket.html#supermarket","309":"/getting-started/supermarket.html#install-a-skill","310":"/getting-started/supermarket.html#install-an-mcp-template","311":"/getting-started/supermarket.html#contribute","312":"/#memoh-documentation","313":"/#start-here","314":"/#feature-guides","315":"/installation/docker.html#docker-installation","316":"/installation/docker.html#service-architecture","317":"/installation/docker.html#sparse-service","318":"/installation/docker.html#prerequisites","319":"/installation/docker.html#one-click-install-recommended","320":"/installation/docker.html#manual-install","321":"/installation/docker.html#china-mainland-mirror","322":"/installation/docker.html#access-points","323":"/installation/docker.html#configuration-reference","324":"/installation/docker.html#common-commands","325":"/installation/docker.html#environment-variables","326":"/memory-providers/builtin.html#built-in-memory-provider","327":"/memory-providers/builtin.html#memory-modes","328":"/memory-providers/builtin.html#how-sparse-mode-works","329":"/memory-providers/builtin.html#creating-a-built-in-provider","330":"/memory-providers/builtin.html#configuring-a-built-in-provider","331":"/memory-providers/builtin.html#managing-providers","332":"/memory-providers/builtin.html#infrastructure-requirements","333":"/memory-providers/builtin.html#off-mode","334":"/memory-providers/builtin.html#sparse-mode","335":"/memory-providers/builtin.html#dense-mode","336":"/memory-providers/builtin.html#assigning-a-memory-provider-to-a-bot","337":"/memory-providers/builtin.html#using-memory-after-setup","338":"/memory-providers/#memory-providers","339":"/memory-providers/#available-providers","340":"/memory-providers/#basic-flow","341":"/memory-providers/#next-steps","342":"/memory-providers/mem0.html#mem0-memory-provider","343":"/memory-providers/mem0.html#creating-a-mem0-provider","344":"/memory-providers/mem0.html#configuring-a-mem0-provider","345":"/memory-providers/mem0.html#assigning-a-mem0-provider-to-a-bot","346":"/memory-providers/mem0.html#usage","347":"/memory-providers/openviking.html#openviking-memory-provider","348":"/memory-providers/openviking.html#creating-an-openviking-provider","349":"/memory-providers/openviking.html#configuring-an-openviking-provider","350":"/memory-providers/openviking.html#assigning-an-openviking-provider-to-a-bot","351":"/memory-providers/openviking.html#usage","352":"/tts-providers/#tts-providers","353":"/tts-providers/#basic-flow","354":"/tts-providers/#available-providers","355":"/tts-providers/#next-steps","356":"/tts-providers/edge.html#edge-tts","357":"/tts-providers/edge.html#creating-an-edge-tts-provider","358":"/tts-providers/edge.html#configuring-the-model","359":"/tts-providers/edge.html#assigning-to-a-bot","360":"/tts-providers/edge.html#testing"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,1],"1":[4,2,71],"2":[4,2,1],"3":[4,5,44],"4":[2,5,32],"5":[6,5,46],"6":[4,5,67],"7":[3,5,49],"8":[5,5,49],"9":[3,5,52],"10":[3,5,61],"11":[3,2,42],"12":[12,1,1],"13":[1,12,74],"14":[2,12,215],"15":[1,12,29],"16":[1,12,54],"17":[1,12,65],"18":[1,12,104],"19":[3,12,83],"20":[1,12,62],"21":[1,1,12],"22":[3,1,24],"23":[6,3,45],"24":[4,3,41],"25":[4,3,25],"26":[2,3,24],"27":[3,1,16],"28":[6,3,28],"29":[5,3,19],"30":[8,3,42],"31":[4,3,23],"32":[2,3,25],"33":[4,1,24],"34":[6,4,34],"35":[5,4,13],"36":[4,4,31],"37":[7,4,56],"38":[5,4,30],"39":[2,1,111],"40":[4,2,41],"41":[3,2,72],"42":[3,1,33],"43":[8,3,50],"44":[4,3,33],"45":[4,3,32],"46":[2,3,13],"47":[3,1,16],"48":[6,3,46],"49":[4,3,37],"50":[7,3,44],"51":[2,3,36],"52":[2,3,6],"53":[3,1,31],"54":[7,3,74],"55":[4,3,67],"56":[5,3,31],"57":[2,3,49],"58":[2,3,6],"59":[3,1,24],"60":[6,3,29],"61":[5,3,37],"62":[6,3,60],"63":[6,3,27],"64":[8,3,35],"65":[4,3,30],"66":[7,3,58],"67":[2,3,21],"68":[5,1,31],"69":[6,5,38],"70":[7,5,53],"71":[6,5,38],"72":[5,5,22],"73":[2,5,29],"74":[3,1,28],"75":[6,3,55],"76":[4,3,30],"77":[7,3,53],"78":[2,3,35],"79":[4,1,17],"80":[6,4,26],"81":[4,4,44],"82":[4,4,27],"83":[2,4,26],"84":[2,4,6],"85":[3,1,24],"86":[7,3,19],"87":[6,3,55],"88":[4,3,20],"89":[2,3,11],"90":[2,3,29],"91":[3,1,35],"92":[4,3,63],"93":[1,3,1],"94":[2,4,43],"95":[2,4,54],"96":[2,4,19],"97":[3,4,56],"98":[2,3,12],"99":[6,4,28],"100":[2,4,60],"101":[2,4,26],"102":[2,4,49],"103":[5,3,63],"104":[1,3,1],"105":[6,4,19],"106":[5,4,30],"107":[5,4,31],"108":[3,4,37],"109":[3,4,27],"110":[3,3,40],"111":[2,1,34],"112":[3,2,55],"113":[3,2,22],"114":[2,4,106],"115":[6,2,79],"116":[3,2,138],"117":[3,2,48],"118":[3,2,57],"119":[3,2,51],"120":[4,2,46],"121":[2,2,25],"122":[3,2,44],"123":[2,1,45],"124":[3,2,45],"125":[4,2,27],"126":[4,2,81],"127":[2,5,15],"128":[6,2,33],"129":[2,2,55],"130":[3,2,47],"131":[2,2,27],"132":[2,1,18],"133":[3,2,30],"134":[2,2,14],"135":[2,3,64],"136":[2,2,1],"137":[4,4,24],"138":[3,4,33],"139":[5,4,32],"140":[6,4,21],"141":[7,4,35],"142":[6,4,33],"143":[1,2,20],"144":[2,1,45],"145":[3,2,52],"146":[3,2,41],"147":[2,2,69],"148":[2,2,13],"149":[5,3,33],"150":[3,3,22],"151":[3,2,68],"152":[4,2,44],"153":[4,2,55],"154":[2,2,24],"155":[3,1,35],"156":[4,3,30],"157":[1,3,16],"158":[2,4,52],"159":[2,3,55],"160":[4,3,53],"161":[3,7,50],"162":[2,7,79],"163":[2,7,54],"164":[1,3,32],"165":[3,4,18],"166":[3,4,17],"167":[2,4,23],"168":[4,3,16],"169":[1,7,21],"170":[1,7,21],"171":[1,7,29],"172":[2,3,37],"173":[4,1,18],"174":[6,4,28],"175":[2,4,13],"176":[3,5,38],"177":[3,4,15],"178":[3,5,41],"179":[3,4,34],"180":[2,4,45],"181":[2,1,24],"182":[3,2,38],"183":[1,2,41],"184":[3,2,46],"185":[2,5,29],"186":[2,2,36],"187":[3,1,24],"188":[1,3,17],"189":[3,4,31],"190":[2,4,42],"191":[3,3,17],"192":[2,6,39],"193":[1,6,20],"194":[4,3,36],"195":[2,1,21],"196":[4,2,43],"197":[2,2,11],"198":[5,4,54],"199":[5,4,36],"200":[2,2,56],"201":[1,2,53],"202":[2,2,51],"203":[2,2,32],"204":[3,1,22],"205":[1,3,42],"206":[3,3,67],"207":[1,3,14],"208":[3,4,25],"209":[4,4,25],"210":[2,3,85],"211":[1,3,49],"212":[1,3,40],"213":[2,3,28],"214":[4,3,58],"215":[2,3,48],"216":[3,1,44],"217":[2,3,40],"218":[3,5,52],"219":[2,5,67],"220":[3,3,18],"221":[2,5,46],"222":[2,5,47],"223":[2,3,38],"224":[2,3,45],"225":[3,3,51],"226":[1,6,48],"227":[2,6,47],"228":[3,6,32],"229":[2,3,37],"230":[2,3,39],"231":[3,3,37],"232":[2,3,21],"233":[2,1,33],"234":[4,2,37],"235":[2,2,77],"236":[3,2,67],"237":[2,2,31],"238":[2,2,8],"239":[5,4,46],"240":[3,4,42],"241":[2,2,48],"242":[3,2,52],"243":[2,1,23],"244":[4,2,28],"245":[3,2,53],"246":[2,2,1],"247":[5,4,44],"248":[3,4,21],"249":[6,2,22],"250":[2,2,35],"251":[1,1,36],"252":[3,1,43],"253":[2,1,87],"254":[3,3,83],"255":[6,1,69],"256":[8,7,61],"257":[4,7,39],"258":[2,1,1],"259":[2,2,51],"260":[2,2,15],"261":[2,2,15],"262":[3,1,68],"263":[6,1,75],"264":[2,1,31],"265":[5,2,74],"266":[4,2,80],"267":[2,2,49],"268":[2,4,43],"269":[5,2,8],"270":[2,6,20],"271":[2,6,25],"272":[2,6,22],"273":[2,6,34],"274":[1,6,50],"275":[4,2,40],"276":[4,2,51],"277":[2,2,38],"278":[2,1,53],"279":[2,2,73],"280":[3,2,45],"281":[2,2,59],"282":[1,2,30],"283":[2,2,1],"284":[3,4,16],"285":[2,4,62],"286":[2,2,1],"287":[2,3,66],"288":[2,3,36],"289":[4,2,1],"290":[2,5,43],"291":[2,5,45],"292":[2,5,16],"293":[2,5,12],"294":[2,5,16],"295":[2,2,1],"296":[2,3,50],"297":[2,3,31],"298":[2,3,20],"299":[2,3,20],"300":[2,3,20],"301":[2,3,23],"302":[4,2,1],"303":[2,5,39],"304":[2,5,13],"305":[2,5,28],"306":[3,2,1],"307":[2,5,52],"308":[1,1,13],"309":[3,1,26],"310":[4,1,45],"311":[1,1,10],"312":[2,1,40],"313":[2,2,51],"314":[2,2,56],"315":[2,1,45],"316":[2,2,62],"317":[2,4,143],"318":[1,2,5],"319":[5,2,112],"320":[2,2,97],"321":[3,4,48],"322":[2,2,37],"323":[2,2,94],"324":[2,2,33],"325":[2,2,58],"326":[4,1,44],"327":[2,4,38],"328":[4,5,58],"329":[5,4,25],"330":[5,4,46],"331":[2,6,15],"332":[2,4,1],"333":[2,6,15],"334":[2,6,44],"335":[2,6,30],"336":[6,4,37],"337":[4,4,38],"338":[2,1,33],"339":[2,2,44],"340":[2,2,31],"341":[2,2,28],"342":[3,1,28],"343":[4,3,25],"344":[4,3,44],"345":[6,3,24],"346":[1,3,28],"347":[3,1,26],"348":[4,3,25],"349":[4,3,36],"350":[7,3,24],"351":[1,3,28],"352":[2,1,64],"353":[2,2,48],"354":[2,2,21],"355":[2,2,12],"356":[2,1,26],"357":[5,2,25],"358":[3,2,58],"359":[4,2,24],"360":[1,2,26]},"averageFieldLength":[3.083102493074793,3.1994459833795,38.41274238227143],"storedFields":{"0":{"title":"About Memoh","titles":[]},"1":{"title":"What Is Memoh?","titles":["About Memoh"]},"2":{"title":"What Makes Memoh Different","titles":["About Memoh"]},"3":{"title":"Multi-Bot And Multi-User","titles":["About Memoh","What Makes Memoh Different"]},"4":{"title":"Containerized Workspaces","titles":["About Memoh","What Makes Memoh Different"]},"5":{"title":"Long-Term Memory And Context Management","titles":["About Memoh","What Makes Memoh Different"]},"6":{"title":"Sessions And Discuss Mode","titles":["About Memoh","What Makes Memoh Different"]},"7":{"title":"Broad Channel Coverage","titles":["About Memoh","What Makes Memoh Different"]},"8":{"title":"Tools, Skills, MCP, And Supermarket","titles":["About Memoh","What Makes Memoh Different"]},"9":{"title":"Providers And Models","titles":["About Memoh","What Makes Memoh Different"]},"10":{"title":"Operations And UI","titles":["About Memoh","What Makes Memoh Different"]},"11":{"title":"Where To Start","titles":["About Memoh"]},"12":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","titles":[]},"13":{"title":"Overview","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"14":{"title":"Story Time","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"15":{"title":"What","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"16":{"title":"Why","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"17":{"title":"How","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"18":{"title":"Features","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"19":{"title":"Compare to OpenClaw","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"20":{"title":"Conclusion","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"21":{"title":"Blogs","titles":[]},"22":{"title":"DingTalk Channel Configuration","titles":[]},"23":{"title":"Step 1: Create A DingTalk App","titles":["DingTalk Channel Configuration"]},"24":{"title":"Step 2: Configure Memoh","titles":["DingTalk Channel Configuration"]},"25":{"title":"Step 3: Verify Messaging","titles":["DingTalk Channel Configuration"]},"26":{"title":"Features Supported","titles":["DingTalk Channel Configuration"]},"27":{"title":"Discord Channel Configuration","titles":[]},"28":{"title":"Step 1: Create a Discord Application","titles":["Discord Channel Configuration"]},"29":{"title":"Step 2: Configure Bot Settings","titles":["Discord Channel Configuration"]},"30":{"title":"Step 3: Invite the Bot to Your Server","titles":["Discord Channel Configuration"]},"31":{"title":"Step 4: Configure Memoh","titles":["Discord Channel Configuration"]},"32":{"title":"Features Supported","titles":["Discord Channel Configuration"]},"33":{"title":"Feishu (Lark) Channel Configuration","titles":[]},"34":{"title":"Step 1: Create a Feishu App","titles":["Feishu (Lark) Channel Configuration"]},"35":{"title":"Step 2: Enable Bot Capability","titles":["Feishu (Lark) Channel Configuration"]},"36":{"title":"Step 3: Configure Permissions","titles":["Feishu (Lark) Channel Configuration"]},"37":{"title":"Step 4: Configure Events (Webhook Mode)","titles":["Feishu (Lark) Channel Configuration"]},"38":{"title":"Step 5: Publish Your App","titles":["Feishu (Lark) Channel Configuration"]},"39":{"title":"Channels Overview","titles":[]},"40":{"title":"WeChat vs WeChat Official Account","titles":["Channels Overview"]},"41":{"title":"General Setup Flow","titles":["Channels Overview"]},"42":{"title":"Misskey Channel Configuration","titles":[]},"43":{"title":"Step 1: Prepare A Misskey Account And Token","titles":["Misskey Channel Configuration"]},"44":{"title":"Step 2: Configure Memoh","titles":["Misskey Channel Configuration"]},"45":{"title":"Step 3: Start Chatting","titles":["Misskey Channel Configuration"]},"46":{"title":"Features Supported","titles":["Misskey Channel Configuration"]},"47":{"title":"QQ Channel Configuration","titles":[]},"48":{"title":"Step 1: Create a QQ Bot","titles":["QQ Channel Configuration"]},"49":{"title":"Step 2: Configure Memoh","titles":["QQ Channel Configuration"]},"50":{"title":"Step 3: Bind Your Identity (Optional)","titles":["QQ Channel Configuration"]},"51":{"title":"Features Supported","titles":["QQ Channel Configuration"]},"52":{"title":"Official Resources","titles":["QQ Channel Configuration"]},"53":{"title":"Matrix Channel Configuration","titles":[]},"54":{"title":"Step 1: Create a Matrix Bot Account","titles":["Matrix Channel Configuration"]},"55":{"title":"Step 2: Configure Memoh","titles":["Matrix Channel Configuration"]},"56":{"title":"Step 3: Invite the Bot","titles":["Matrix Channel Configuration"]},"57":{"title":"Features Supported","titles":["Matrix Channel Configuration"]},"58":{"title":"Official Resources","titles":["Matrix Channel Configuration"]},"59":{"title":"Slack Channel Configuration","titles":[]},"60":{"title":"Step 1: Create a Slack App","titles":["Slack Channel Configuration"]},"61":{"title":"Step 2: Enable Socket Mode","titles":["Slack Channel Configuration"]},"62":{"title":"Step 3: Configure Bot Token Scopes","titles":["Slack Channel Configuration"]},"63":{"title":"Step 4: Subscribe to Bot Events","titles":["Slack Channel Configuration"]},"64":{"title":"Step 5: Install the App to Your Workspace","titles":["Slack Channel Configuration"]},"65":{"title":"Step 6: Configure Memoh","titles":["Slack Channel Configuration"]},"66":{"title":"Step 7: Add the Bot to Conversations","titles":["Slack Channel Configuration"]},"67":{"title":"Features Supported","titles":["Slack Channel Configuration"]},"68":{"title":"WeChat Official Account Channel Configuration","titles":[]},"69":{"title":"Step 1: Prepare Official Account Credentials","titles":["WeChat Official Account Channel Configuration"]},"70":{"title":"Step 2: Add The Channel In Memoh","titles":["WeChat Official Account Channel Configuration"]},"71":{"title":"Step 3: Configure The WeChat Platform","titles":["WeChat Official Account Channel Configuration"]},"72":{"title":"Step 4: Enable And Test","titles":["WeChat Official Account Channel Configuration"]},"73":{"title":"Features Supported","titles":["WeChat Official Account Channel Configuration"]},"74":{"title":"Telegram Channel Configuration","titles":[]},"75":{"title":"Step 1: Create a Telegram Bot","titles":["Telegram Channel Configuration"]},"76":{"title":"Step 2: Configure Memoh","titles":["Telegram Channel Configuration"]},"77":{"title":"Step 3: Bind Your Identity (Optional)","titles":["Telegram Channel Configuration"]},"78":{"title":"Features Supported","titles":["Telegram Channel Configuration"]},"79":{"title":"WeCom (WeWork) Channel Configuration","titles":[]},"80":{"title":"Step 1: Create a WeCom Bot","titles":["WeCom (WeWork) Channel Configuration"]},"81":{"title":"Step 2: Configure Memoh","titles":["WeCom (WeWork) Channel Configuration"]},"82":{"title":"Step 3: Start Chatting","titles":["WeCom (WeWork) Channel Configuration"]},"83":{"title":"Features Supported","titles":["WeCom (WeWork) Channel Configuration"]},"84":{"title":"Official Resources","titles":["WeCom (WeWork) Channel Configuration"]},"85":{"title":"WeChat Channel Configuration","titles":[]},"86":{"title":"Step 1: Add WeChat Channel in Memoh","titles":["WeChat Channel Configuration"]},"87":{"title":"Step 2: Scan the QR Code","titles":["WeChat Channel Configuration"]},"88":{"title":"Step 3: Start Chatting","titles":["WeChat Channel Configuration"]},"89":{"title":"Optional Settings","titles":["WeChat Channel Configuration"]},"90":{"title":"Features Supported","titles":["WeChat Channel Configuration"]},"91":{"title":"Bot Access Control","titles":[]},"92":{"title":"Quick Start: ACL Presets","titles":["Bot Access Control"]},"93":{"title":"Concepts","titles":["Bot Access Control"]},"94":{"title":"Default Effect","titles":["Bot Access Control","Concepts"]},"95":{"title":"Subject Types","titles":["Bot Access Control","Concepts"]},"96":{"title":"Rule Effects","titles":["Bot Access Control","Concepts"]},"97":{"title":"Priority-Based Evaluation","titles":["Bot Access Control","Concepts"]},"98":{"title":"Managing Access","titles":["Bot Access Control"]},"99":{"title":"Start With A Preset, Then Refine","titles":["Bot Access Control","Managing Access"]},"100":{"title":"Adding Rules","titles":["Bot Access Control","Managing Access"]},"101":{"title":"Reordering Rules","titles":["Bot Access Control","Managing Access"]},"102":{"title":"Source Scope","titles":["Bot Access Control","Managing Access"]},"103":{"title":"What The Presets Actually Mean","titles":["Bot Access Control"]},"104":{"title":"Examples","titles":["Bot Access Control"]},"105":{"title":"Open Bot (Anyone Can Chat)","titles":["Bot Access Control","Examples"]},"106":{"title":"Private Bot with Selected Users","titles":["Bot Access Control","Examples"]},"107":{"title":"Open Bot with Blocked Users","titles":["Bot Access Control","Examples"]},"108":{"title":"Platform-Specific Access","titles":["Bot Access Control","Examples"]},"109":{"title":"Channel-Scoped Access","titles":["Bot Access Control","Examples"]},"110":{"title":"Debugging Access Decisions","titles":["Bot Access Control"]},"111":{"title":"Bot Management","titles":[]},"112":{"title":"Creating a Bot","titles":["Bot Management"]},"113":{"title":"Bot Detail Page","titles":["Bot Management"]},"114":{"title":"Tab Overview","titles":["Bot Management","Bot Detail Page"]},"115":{"title":"Configuring the Bot\'s Core Settings","titles":["Bot Management"]},"116":{"title":"General Tab Reference","titles":["Bot Management"]},"117":{"title":"Heartbeat Tab Reference","titles":["Bot Management"]},"118":{"title":"Compaction Tab Reference","titles":["Bot Management"]},"119":{"title":"Access And ACL","titles":["Bot Management"]},"120":{"title":"Discuss-Related Advanced Settings","titles":["Bot Management"]},"121":{"title":"Terminal Tab","titles":["Bot Management"]},"122":{"title":"Deleting a Bot","titles":["Bot Management"]},"123":{"title":"Browser Contexts","titles":[]},"124":{"title":"Concept: Browser Gateway","titles":["Browser Contexts"]},"125":{"title":"Creating a Browser Context","titles":["Browser Contexts"]},"126":{"title":"Configuring a Browser Context","titles":["Browser Contexts"]},"127":{"title":"Managing Contexts","titles":["Browser Contexts","Configuring a Browser Context"]},"128":{"title":"Assigning a Browser Context to a Bot","titles":["Browser Contexts"]},"129":{"title":"Bot Interaction","titles":["Browser Contexts"]},"130":{"title":"Browser Core Selection","titles":["Browser Contexts"]},"131":{"title":"Next Steps","titles":["Browser Contexts"]},"132":{"title":"Bot Channels","titles":[]},"133":{"title":"Concept: Unified Communication","titles":["Bot Channels"]},"134":{"title":"Supported Channels","titles":["Bot Channels"]},"135":{"title":"Platform Guides","titles":["Bot Channels","Supported Channels"]},"136":{"title":"Configuration Flow","titles":["Bot Channels"]},"137":{"title":"1. Adding a Channel","titles":["Bot Channels","Configuration Flow"]},"138":{"title":"2. Common Fields","titles":["Bot Channels","Configuration Flow"]},"139":{"title":"3. Special Case: Feishu Webhook","titles":["Bot Channels","Configuration Flow"]},"140":{"title":"4. Special Case: WeChat QR Login","titles":["Bot Channels","Configuration Flow"]},"141":{"title":"5. Special Case: WeChat Official Account Webhook","titles":["Bot Channels","Configuration Flow"]},"142":{"title":"6. Special Case: DingTalk Stream Connection","titles":["Bot Channels","Configuration Flow"]},"143":{"title":"Operations","titles":["Bot Channels"]},"144":{"title":"Context Compaction","titles":[]},"145":{"title":"Why It Exists","titles":["Context Compaction"]},"146":{"title":"What It Changes","titles":["Context Compaction"]},"147":{"title":"Automatic Compaction","titles":["Context Compaction"]},"148":{"title":"Immediate Compaction","titles":["Context Compaction"]},"149":{"title":"From The Session Status Panel","titles":["Context Compaction","Immediate Compaction"]},"150":{"title":"From Slash Commands","titles":["Context Compaction","Immediate Compaction"]},"151":{"title":"Status And Logs","titles":["Context Compaction"]},"152":{"title":"Relationship To context_window","titles":["Context Compaction"]},"153":{"title":"Context Compaction vs Memory Compaction","titles":["Context Compaction"]},"154":{"title":"Next Steps","titles":["Context Compaction"]},"155":{"title":"Bot Container Management","titles":[]},"156":{"title":"Concept: The Isolated Workspace","titles":["Bot Container Management"]},"157":{"title":"Operations","titles":["Bot Container Management"]},"158":{"title":"Lifecycle Actions","titles":["Bot Container Management","Operations"]},"159":{"title":"Container Information","titles":["Bot Container Management"]},"160":{"title":"Advanced: Provide CDI Devices","titles":["Bot Container Management"]},"161":{"title":"Configure CDI Devices","titles":["Bot Container Management","Advanced: Provide CDI Devices"]},"162":{"title":"Host Requirements","titles":["Bot Container Management","Advanced: Provide CDI Devices"]},"163":{"title":"Important Behavior","titles":["Bot Container Management","Advanced: Provide CDI Devices"]},"164":{"title":"Snapshots","titles":["Bot Container Management"]},"165":{"title":"Creating a Snapshot","titles":["Bot Container Management","Snapshots"]},"166":{"title":"Restoring a Snapshot","titles":["Bot Container Management","Snapshots"]},"167":{"title":"Managing Snapshots","titles":["Bot Container Management","Snapshots"]},"168":{"title":"Data Export and Import","titles":["Bot Container Management"]},"169":{"title":"Export","titles":["Bot Container Management","Data Export and Import"]},"170":{"title":"Import","titles":["Bot Container Management","Data Export and Import"]},"171":{"title":"Restore","titles":["Bot Container Management","Data Export and Import"]},"172":{"title":"Container Versioning","titles":["Bot Container Management"]},"173":{"title":"Email Providers and Bindings","titles":[]},"174":{"title":"Concept: Email as a Bot Channel","titles":["Email Providers and Bindings"]},"175":{"title":"Email Provider","titles":["Email Providers and Bindings"]},"176":{"title":"Creating a Provider","titles":["Email Providers and Bindings","Email Provider"]},"177":{"title":"Bot Email Bindings","titles":["Email Providers and Bindings"]},"178":{"title":"Adding a Binding","titles":["Email Providers and Bindings","Bot Email Bindings"]},"179":{"title":"Outbox and History","titles":["Email Providers and Bindings"]},"180":{"title":"Bot Interaction","titles":["Email Providers and Bindings"]},"181":{"title":"Bot Heartbeat","titles":[]},"182":{"title":"Concept: Scheduled Autonomy","titles":["Bot Heartbeat"]},"183":{"title":"Configuration","titles":["Bot Heartbeat"]},"184":{"title":"Logs and Monitoring","titles":["Bot Heartbeat"]},"185":{"title":"Managing Logs","titles":["Bot Heartbeat","Logs and Monitoring"]},"186":{"title":"Bot Interaction","titles":["Bot Heartbeat"]},"187":{"title":"Bot Files Management","titles":[]},"188":{"title":"Operations","titles":["Bot Files Management"]},"189":{"title":"Browsing and Navigation","titles":["Bot Files Management","Operations"]},"190":{"title":"Managing Files","titles":["Bot Files Management","Operations"]},"191":{"title":"Viewing and Editing","titles":["Bot Files Management"]},"192":{"title":"Text Files","titles":["Bot Files Management","Viewing and Editing"]},"193":{"title":"Images","titles":["Bot Files Management","Viewing and Editing"]},"194":{"title":"Bot Interaction with Files","titles":["Bot Files Management"]},"195":{"title":"MCP Connections","titles":[]},"196":{"title":"Concept: Extending Bot Capabilities","titles":["MCP Connections"]},"197":{"title":"Connection Types","titles":["MCP Connections"]},"198":{"title":"1. Stdio (Local Process)","titles":["MCP Connections","Connection Types"]},"199":{"title":"2. Remote (HTTP/SSE)","titles":["MCP Connections","Connection Types"]},"200":{"title":"OAuth Authentication","titles":["MCP Connections"]},"201":{"title":"Operations","titles":["MCP Connections"]},"202":{"title":"Tool Discovery","titles":["MCP Connections"]},"203":{"title":"Bot Interaction","titles":["MCP Connections"]},"204":{"title":"Bot Memory Management","titles":[]},"205":{"title":"Prerequisites","titles":["Bot Memory Management"]},"206":{"title":"Concept: Memory Retrieval","titles":["Bot Memory Management"]},"207":{"title":"Operations","titles":["Bot Memory Management"]},"208":{"title":"1. Creating Memories","titles":["Bot Memory Management","Operations"]},"209":{"title":"2. Searching and Managing","titles":["Bot Memory Management","Operations"]},"210":{"title":"Memory Compaction","titles":["Bot Memory Management"]},"211":{"title":"Rebuild","titles":["Bot Memory Management"]},"212":{"title":"Status","titles":["Bot Memory Management"]},"213":{"title":"Usage Statistics","titles":["Bot Memory Management"]},"214":{"title":"Memory vs Session Context","titles":["Bot Memory Management"]},"215":{"title":"Bot Interaction","titles":["Bot Memory Management"]},"216":{"title":"Providers And Models","titles":[]},"217":{"title":"Provider Basics","titles":["Providers And Models"]},"218":{"title":"Creating A Provider","titles":["Providers And Models","Provider Basics"]},"219":{"title":"Client Types","titles":["Providers And Models","Provider Basics"]},"220":{"title":"OAuth-Based Providers","titles":["Providers And Models"]},"221":{"title":"OpenAI Codex","titles":["Providers And Models","OAuth-Based Providers"]},"222":{"title":"GitHub Copilot","titles":["Providers And Models","OAuth-Based Providers"]},"223":{"title":"Importing Models","titles":["Providers And Models"]},"224":{"title":"Model Types","titles":["Providers And Models"]},"225":{"title":"Chat Model Configuration","titles":["Providers And Models"]},"226":{"title":"Compatibilities","titles":["Providers And Models","Chat Model Configuration"]},"227":{"title":"context_window","titles":["Providers And Models","Chat Model Configuration"]},"228":{"title":"Image Generation Models","titles":["Providers And Models","Chat Model Configuration"]},"229":{"title":"Embedding Models","titles":["Providers And Models"]},"230":{"title":"Speech Models","titles":["Providers And Models"]},"231":{"title":"Recommended Mental Model","titles":["Providers And Models"]},"232":{"title":"Next Steps","titles":["Providers And Models"]},"233":{"title":"Scheduled Tasks","titles":[]},"234":{"title":"Concept: Cron-Based Automation","titles":["Scheduled Tasks"]},"235":{"title":"Schedule Fields","titles":["Scheduled Tasks"]},"236":{"title":"Cron Pattern Reference","titles":["Scheduled Tasks"]},"237":{"title":"Viewing Schedules","titles":["Scheduled Tasks"]},"238":{"title":"Creating Schedules","titles":["Scheduled Tasks"]},"239":{"title":"Via the Bot (Conversational)","titles":["Scheduled Tasks","Creating Schedules"]},"240":{"title":"Via the API","titles":["Scheduled Tasks","Creating Schedules"]},"241":{"title":"Execution Flow","titles":["Scheduled Tasks"]},"242":{"title":"Schedule vs. Heartbeat","titles":["Scheduled Tasks"]},"243":{"title":"Search Providers","titles":[]},"244":{"title":"Concept: Real-Time Knowledge","titles":["Search Providers"]},"245":{"title":"Supported Search Engines","titles":["Search Providers"]},"246":{"title":"Configuration Flow","titles":["Search Providers"]},"247":{"title":"1. Adding a Search Provider","titles":["Search Providers","Configuration Flow"]},"248":{"title":"2. Managing Providers","titles":["Search Providers","Configuration Flow"]},"249":{"title":"Assigning a Search Provider to a Bot","titles":["Search Providers"]},"250":{"title":"Bot Interaction","titles":["Search Providers"]},"251":{"title":"Sessions","titles":[]},"252":{"title":"Concept: Conversation Isolation","titles":["Sessions"]},"253":{"title":"Session Types","titles":["Sessions"]},"254":{"title":"Chat vs Discuss","titles":["Sessions","Session Types"]},"255":{"title":"Starting a New Session with /new","titles":["Sessions"]},"256":{"title":"In External Channels (Telegram, Discord, Feishu, etc.)","titles":["Sessions","Starting a New Session with /new"]},"257":{"title":"In the Web UI","titles":["Sessions","Starting a New Session with /new"]},"258":{"title":"Managing Sessions","titles":["Sessions"]},"259":{"title":"Viewing Sessions","titles":["Sessions","Managing Sessions"]},"260":{"title":"Renaming Sessions","titles":["Sessions","Managing Sessions"]},"261":{"title":"Deleting Sessions","titles":["Sessions","Managing Sessions"]},"262":{"title":"Session Status Panel","titles":["Sessions"]},"263":{"title":"How Sessions Relate to Other Features","titles":["Sessions"]},"264":{"title":"Bot Skills","titles":[]},"265":{"title":"What A Skill Looks Like","titles":["Bot Skills"]},"266":{"title":"Where Skills Come From","titles":["Bot Skills"]},"267":{"title":"Skill States","titles":["Bot Skills"]},"268":{"title":"Typical Examples","titles":["Bot Skills","Skill States"]},"269":{"title":"Managing Skills In The UI","titles":["Bot Skills"]},"270":{"title":"Add Skill","titles":["Bot Skills","Managing Skills In The UI"]},"271":{"title":"Edit Skill","titles":["Bot Skills","Managing Skills In The UI"]},"272":{"title":"Delete Skill","titles":["Bot Skills","Managing Skills In The UI"]},"273":{"title":"Disable / Enable","titles":["Bot Skills","Managing Skills In The UI"]},"274":{"title":"Adopt","titles":["Bot Skills","Managing Skills In The UI"]},"275":{"title":"Effective Skills At Runtime","titles":["Bot Skills"]},"276":{"title":"Supermarket And Imported Skills","titles":["Bot Skills"]},"277":{"title":"Recommended Workflow","titles":["Bot Skills"]},"278":{"title":"Slash Commands","titles":[]},"279":{"title":"Command Model","titles":["Slash Commands"]},"280":{"title":"Built-in Help","titles":["Slash Commands"]},"281":{"title":"Parsing Rules","titles":["Slash Commands"]},"282":{"title":"Permissions","titles":["Slash Commands"]},"283":{"title":"Quick Reference","titles":["Slash Commands"]},"284":{"title":"Top-Level Commands","titles":["Slash Commands","Quick Reference"]},"285":{"title":"Resource Groups","titles":["Slash Commands","Quick Reference"]},"286":{"title":"Session Commands","titles":["Slash Commands"]},"287":{"title":"/new","titles":["Slash Commands","Session Commands"]},"288":{"title":"/stop","titles":["Slash Commands","Session Commands"]},"289":{"title":"Status And Inspection Commands","titles":["Slash Commands"]},"290":{"title":"/status","titles":["Slash Commands","Status And Inspection Commands"]},"291":{"title":"/access","titles":["Slash Commands","Status And Inspection Commands"]},"292":{"title":"/usage","titles":["Slash Commands","Status And Inspection Commands"]},"293":{"title":"/heartbeat","titles":["Slash Commands","Status And Inspection Commands"]},"294":{"title":"/email","titles":["Slash Commands","Status And Inspection Commands"]},"295":{"title":"Configuration Commands","titles":["Slash Commands"]},"296":{"title":"/settings","titles":["Slash Commands","Configuration Commands"]},"297":{"title":"/model","titles":["Slash Commands","Configuration Commands"]},"298":{"title":"/memory","titles":["Slash Commands","Configuration Commands"]},"299":{"title":"/search","titles":["Slash Commands","Configuration Commands"]},"300":{"title":"/browser","titles":["Slash Commands","Configuration Commands"]},"301":{"title":"/mcp","titles":["Slash Commands","Configuration Commands"]},"302":{"title":"Automation And Filesystem Commands","titles":["Slash Commands"]},"303":{"title":"/schedule","titles":["Slash Commands","Automation And Filesystem Commands"]},"304":{"title":"/skill","titles":["Slash Commands","Automation And Filesystem Commands"]},"305":{"title":"/fs","titles":["Slash Commands","Automation And Filesystem Commands"]},"306":{"title":"Context Compaction Command","titles":["Slash Commands"]},"307":{"title":"/compact","titles":["Slash Commands","Context Compaction Command"]},"308":{"title":"Supermarket","titles":[]},"309":{"title":"Install A Skill","titles":["Supermarket"]},"310":{"title":"Install An MCP Template","titles":["Supermarket"]},"311":{"title":"Contribute","titles":["Supermarket"]},"312":{"title":"Memoh Documentation","titles":[]},"313":{"title":"Start Here","titles":["Memoh Documentation"]},"314":{"title":"Feature Guides","titles":["Memoh Documentation"]},"315":{"title":"Docker Installation","titles":[]},"316":{"title":"Service Architecture","titles":["Docker Installation"]},"317":{"title":"Sparse Service","titles":["Docker Installation","Service Architecture"]},"318":{"title":"Prerequisites","titles":["Docker Installation"]},"319":{"title":"One-Click Install (Recommended)","titles":["Docker Installation"]},"320":{"title":"Manual Install","titles":["Docker Installation"]},"321":{"title":"China Mainland Mirror","titles":["Docker Installation","Manual Install"]},"322":{"title":"Access Points","titles":["Docker Installation"]},"323":{"title":"Configuration Reference","titles":["Docker Installation"]},"324":{"title":"Common Commands","titles":["Docker Installation"]},"325":{"title":"Environment Variables","titles":["Docker Installation"]},"326":{"title":"Built-in Memory Provider","titles":[]},"327":{"title":"Memory Modes","titles":["Built-in Memory Provider"]},"328":{"title":"How Sparse Mode Works","titles":["Built-in Memory Provider","Memory Modes"]},"329":{"title":"Creating a Built-in Provider","titles":["Built-in Memory Provider"]},"330":{"title":"Configuring a Built-in Provider","titles":["Built-in Memory Provider"]},"331":{"title":"Managing Providers","titles":["Built-in Memory Provider","Configuring a Built-in Provider"]},"332":{"title":"Infrastructure Requirements","titles":["Built-in Memory Provider"]},"333":{"title":"Off Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"334":{"title":"Sparse Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"335":{"title":"Dense Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"336":{"title":"Assigning a Memory Provider to a Bot","titles":["Built-in Memory Provider"]},"337":{"title":"Using Memory After Setup","titles":["Built-in Memory Provider"]},"338":{"title":"Memory Providers","titles":[]},"339":{"title":"Available Providers","titles":["Memory Providers"]},"340":{"title":"Basic Flow","titles":["Memory Providers"]},"341":{"title":"Next Steps","titles":["Memory Providers"]},"342":{"title":"Mem0 Memory Provider","titles":[]},"343":{"title":"Creating a Mem0 Provider","titles":["Mem0 Memory Provider"]},"344":{"title":"Configuring a Mem0 Provider","titles":["Mem0 Memory Provider"]},"345":{"title":"Assigning a Mem0 Provider to a Bot","titles":["Mem0 Memory Provider"]},"346":{"title":"Usage","titles":["Mem0 Memory Provider"]},"347":{"title":"OpenViking Memory Provider","titles":[]},"348":{"title":"Creating an OpenViking Provider","titles":["OpenViking Memory Provider"]},"349":{"title":"Configuring an OpenViking Provider","titles":["OpenViking Memory Provider"]},"350":{"title":"Assigning an OpenViking Provider to a Bot","titles":["OpenViking Memory Provider"]},"351":{"title":"Usage","titles":["OpenViking Memory Provider"]},"352":{"title":"TTS Providers","titles":[]},"353":{"title":"Basic Flow","titles":["TTS Providers"]},"354":{"title":"Available Providers","titles":["TTS Providers"]},"355":{"title":"Next Steps","titles":["TTS Providers"]},"356":{"title":"Edge TTS","titles":[]},"357":{"title":"Creating an Edge TTS Provider","titles":["Edge TTS"]},"358":{"title":"Configuring the Model","titles":["Edge TTS"]},"359":{"title":"Assigning to a Bot","titles":["Edge TTS"]},"360":{"title":"Testing","titles":["Edge TTS"]}},"dirtCount":0,"index":[["=",{"2":{"321":1,"334":2,"335":1}}],["~",{"2":{"319":2}}],["|",{"2":{"319":6}}],["ˈmemoʊ",{"2":{"312":1}}],["`",{"2":{"284":2}}],["│",{"2":{"236":15}}],["┌─────────────",{"2":{"236":5}}],["96kbitrate",{"2":{"358":1}}],["9",{"2":{"235":2,"236":2,"279":1,"281":1,"303":1}}],["8088",{"2":{"349":1}}],["8083",{"2":{"322":1}}],["8080",{"2":{"322":1,"323":1}}],["8082",{"2":{"322":1}}],["8085",{"2":{"317":1,"334":1}}],["8",{"2":{"210":1,"236":3,"239":1,"240":1}}],["00",{"2":{"235":1,"236":3}}],["0",{"2":{"210":3,"235":1,"236":9,"240":1,"279":1,"281":1,"303":1,"319":3,"325":1,"358":5}}],["zh",{"2":{"126":1,"296":1}}],["zone",{"2":{"114":1,"122":1}}],["→",{"2":{"97":2,"102":3}}],["企业微信",{"2":{"79":1}}],["7",{"0":{"66":1},"2":{"292":1}}],["6334",{"2":{"334":1,"335":1}}],["6",{"0":{"65":1,"142":1},"2":{"225":1,"236":1,"319":3,"325":1}}],["x26",{"2":{"324":2}}],["xhigh",{"2":{"226":1}}],["xoxb",{"2":{"64":2,"65":1}}],["xapp",{"2":{"61":1,"64":1,"65":1}}],["x3c",{"2":{"54":3}}],["x",{"2":{"54":1}}],["创建机器人",{"2":{"48":1}}],["50+",{"2":{"354":1,"356":1,"358":1}}],["59",{"2":{"236":1}}],["5",{"0":{"38":1,"64":1,"141":1},"2":{"48":1,"210":1,"358":1}}],["48kbitrate",{"2":{"358":1}}],["4o",{"2":{"225":1,"297":2}}],["4",{"0":{"31":1,"37":1,"63":1,"72":1,"140":1},"2":{"225":1}}],["32",{"2":{"320":1}}],["31",{"2":{"236":1}}],["30",{"2":{"55":1,"183":1,"236":2,"296":1}}],["3",{"0":{"25":1,"30":1,"36":1,"45":1,"50":1,"56":1,"62":1,"71":1,"77":1,"82":1,"88":1,"139":1},"2":{"210":1,"316":1,"358":1}}],["100",{"2":{"358":1}}],["16bit",{"2":{"358":1}}],["12",{"2":{"236":1}}],["123456789",{"2":{"75":1}}],["1536",{"2":{"229":1}}],["1",{"0":{"23":1,"28":1,"34":1,"43":1,"48":1,"54":1,"60":1,"69":1,"75":1,"80":1,"86":1,"137":1,"198":1,"208":1,"247":1},"2":{"236":4,"322":1,"358":1}}],["+100",{"2":{"358":1}}],["+",{"2":{"19":1,"268":1,"317":1,"327":2,"358":1}}],["jwt",{"2":{"319":2,"320":1,"323":1}}],["jina",{"2":{"245":1}}],["jpg",{"2":{"193":1}}],["js",{"2":{"192":1}}],["json",{"2":{"54":1,"201":3,"240":1,"323":1}}],["join",{"2":{"27":1,"53":1,"55":2,"56":2,"57":1,"254":1}}],["jobs",{"2":{"19":1}}],["just",{"2":{"14":1,"85":1,"92":1,"180":1,"268":1,"278":1}}],["256",{"2":{"358":1}}],["256+",{"2":{"354":1,"356":1}}],["20",{"2":{"236":1}}],["2026",{"2":{"13":1,"21":1}}],["23",{"2":{"236":1}}],["2",{"0":{"24":1,"29":1,"35":1,"44":1,"49":1,"55":1,"61":1,"70":1,"76":1,"81":1,"87":1,"138":1,"199":1,"209":1,"248":1},"2":{"322":1,"358":1}}],["24khz",{"2":{"358":3}}],["24",{"2":{"18":1}}],["known",{"2":{"164":1,"281":1}}],["know",{"2":{"50":1,"77":1,"223":1}}],["knowledge",{"0":{"244":1},"2":{"15":1,"131":1,"215":1,"243":1}}],["keyword",{"2":{"317":1,"328":1}}],["keys",{"2":{"138":1,"215":1}}],["key",{"2":{"23":1,"24":1,"69":1,"70":1,"71":1,"87":1,"142":1,"176":1,"198":1,"217":1,"218":1,"220":1,"221":1,"247":1,"262":1,"279":1,"317":1,"323":1,"328":1,"339":1,"344":2,"349":2,"354":1,"356":1}}],["keeps",{"2":{"228":1}}],["keeping",{"2":{"144":1}}],["keep",{"2":{"14":1,"20":2,"54":1,"60":1,"75":1,"141":1,"185":1,"277":1}}],["kept",{"2":{"13":1}}],["kinds",{"2":{"95":1,"253":1}}],["kind",{"2":{"14":1}}],["yml",{"2":{"320":1,"321":2}}],["yaml",{"2":{"265":2}}],["yandex",{"2":{"245":1}}],["y",{"2":{"198":1,"319":1}}],["yet",{"2":{"115":1,"131":1}}],["yes",{"2":{"55":3,"81":2,"344":1,"349":1}}],["year",{"2":{"13":1,"14":1}}],["yourself",{"2":{"264":1,"342":1}}],["yours",{"2":{"20":1}}],["your",{"0":{"30":1,"38":1,"50":1,"64":1,"77":1},"2":{"14":1,"15":1,"18":1,"23":3,"24":1,"27":1,"30":1,"31":2,"33":1,"34":1,"36":1,"37":2,"39":3,"40":1,"41":2,"43":1,"44":1,"47":1,"48":1,"49":2,"50":3,"53":2,"54":2,"55":2,"56":1,"59":1,"65":3,"69":1,"70":1,"74":1,"75":1,"76":2,"77":4,"79":2,"81":1,"82":1,"85":1,"86":1,"87":2,"91":1,"108":1,"109":1,"115":1,"128":1,"132":2,"134":1,"139":1,"157":1,"169":1,"170":1,"173":1,"174":1,"175":1,"177":1,"181":1,"190":2,"194":1,"195":1,"205":2,"207":1,"219":1,"228":1,"243":1,"244":1,"245":2,"247":1,"249":1,"252":1,"274":1,"280":1,"315":1,"319":1,"320":1,"324":1,"336":1,"342":1,"345":1,"350":1}}],["you",{"2":{"1":1,"6":1,"10":1,"14":5,"17":1,"20":1,"23":1,"24":1,"30":1,"39":1,"43":1,"50":2,"54":1,"60":1,"61":1,"62":2,"66":1,"69":2,"70":1,"74":1,"75":2,"77":2,"87":1,"91":1,"92":5,"102":1,"103":2,"113":2,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"127":1,"128":1,"131":1,"132":1,"133":1,"142":1,"144":1,"148":1,"149":1,"151":1,"152":1,"161":2,"162":1,"163":1,"164":1,"171":1,"178":1,"181":2,"187":1,"191":1,"195":1,"196":1,"200":2,"202":2,"210":1,"211":3,"214":2,"216":2,"221":1,"222":1,"223":4,"224":1,"227":1,"228":1,"231":1,"233":1,"236":1,"239":1,"240":1,"243":1,"247":1,"249":1,"252":2,"254":1,"255":1,"256":4,"257":1,"261":1,"263":1,"264":2,"265":1,"266":1,"268":4,"271":1,"273":1,"274":3,"276":1,"277":2,"287":1,"288":3,"290":1,"307":1,"310":1,"315":1,"317":2,"320":1,"321":1,"331":1,"336":1,"337":1,"345":1,"350":1,"352":1}}],["v0",{"2":{"319":1,"325":1}}],["v2",{"2":{"318":1}}],["vue",{"2":{"316":1}}],["voice",{"2":{"230":1,"352":2,"353":1,"358":3,"360":1}}],["voices",{"2":{"116":1,"354":1,"356":1,"358":1}}],["volume",{"2":{"176":1}}],["v3",{"2":{"54":1}}],["v1",{"2":{"37":1,"317":1,"328":1,"334":1}}],["view",{"2":{"167":1,"185":1,"200":1,"202":1,"263":1,"285":8,"324":1}}],["viewport",{"2":{"116":1,"123":1,"126":4}}],["viewing",{"0":{"191":1,"237":1,"259":1},"1":{"192":1,"193":1},"2":{"48":1,"278":1}}],["vision",{"2":{"225":1,"226":1}}],["visible",{"2":{"162":1,"254":1,"275":1}}],["visibility",{"2":{"10":1}}],["visual",{"2":{"51":1,"90":1,"116":1,"193":1}}],["via",{"0":{"239":1,"240":1},"2":{"32":1,"33":1,"39":4,"53":1,"54":1,"82":1,"85":1,"102":1,"109":1,"111":1,"156":1,"158":1,"180":2,"198":1,"230":1,"315":1,"316":1,"339":1,"341":1}}],["var",{"2":{"162":1,"320":1}}],["variable",{"2":{"319":1,"325":1}}],["variables",{"0":{"325":1},"2":{"198":1,"319":1}}],["varies",{"2":{"43":1}}],["various",{"2":{"18":1,"111":1,"132":1,"243":1}}],["valuable",{"2":{"152":1}}],["values",{"2":{"130":1,"210":1,"279":1}}],["value",{"2":{"13":1,"198":1,"210":1,"236":1,"279":1}}],["valid",{"2":{"130":1,"162":1,"254":1}}],["validity",{"2":{"87":1}}],["vendor",{"2":{"162":2}}],["very",{"2":{"305":1}}],["version=v0",{"2":{"319":2}}],["versions",{"2":{"172":1,"319":1,"325":1}}],["versioning",{"0":{"172":1},"2":{"164":1}}],["version",{"2":{"38":2,"172":5,"267":1,"280":1,"319":2,"325":1}}],["versioned",{"2":{"17":1}}],["verification",{"2":{"37":1,"163":1,"222":1}}],["verify",{"0":{"25":1},"2":{"71":1,"151":1,"212":1}}],["vectors",{"2":{"206":1,"317":1,"327":1,"328":1,"339":1}}],["vector",{"2":{"9":1,"17":1,"211":1,"213":1,"224":1,"229":2,"316":1,"317":1,"320":1,"323":1,"327":1,"330":1,"334":1}}],["vs",{"0":{"40":1,"153":1,"214":1,"242":1,"254":1},"2":{"11":1,"313":1}}],["null",{"2":{"240":1}}],["number",{"2":{"159":1,"213":1,"235":2,"277":1}}],["npx",{"2":{"198":1}}],["nvidia",{"2":{"161":2,"162":2}}],["navigation",{"0":{"189":1},"2":{"126":1,"129":1,"189":1}}],["navigating",{"2":{"124":1}}],["navigate",{"2":{"80":1,"112":1,"115":1,"122":1,"125":1,"128":1,"176":1,"237":1,"247":1,"249":1,"329":1,"336":1,"343":1,"345":1,"348":1,"350":1,"353":1,"357":1}}],["narrow",{"2":{"99":1}}],["named",{"2":{"265":1,"266":1,"352":1}}],["namespace",{"2":{"323":1}}],["names",{"2":{"62":1,"161":2,"162":1,"202":1,"277":1}}],["name",{"2":{"28":1,"34":1,"75":2,"112":2,"125":2,"126":2,"162":2,"165":1,"201":1,"218":2,"225":2,"235":2,"237":1,"240":1,"247":2,"259":1,"265":5,"266":2,"267":3,"268":2,"272":2,"274":1,"297":5,"298":1,"299":1,"300":1,"301":2,"303":6,"329":2,"330":1,"343":2,"348":2}}],["natural",{"2":{"13":1,"235":1,"239":1,"242":1}}],["night",{"2":{"14":1}}],["noise",{"2":{"210":1,"214":1}}],["noisy",{"2":{"153":1}}],["nobody",{"2":{"92":1}}],["now",{"2":{"88":1,"118":1,"149":2,"228":1,"262":1,"353":1,"359":1}}],["none",{"2":{"226":1,"285":8,"327":1}}],["non",{"2":{"26":1,"73":1}}],["no",{"2":{"18":1,"46":2,"48":1,"55":2,"66":1,"81":1,"87":1,"94":1,"97":1,"105":1,"119":1,"127":1,"135":2,"209":1,"256":1,"261":1,"290":1,"317":1,"319":1,"320":1,"327":1,"328":1,"331":1,"333":1,"336":1,"344":3,"349":1,"354":1,"356":1}}],["node",{"2":{"14":1,"17":1}}],["notable",{"2":{"220":1}}],["notifications",{"2":{"182":1}}],["noticed",{"2":{"14":1}}],["notes",{"2":{"73":1,"116":1,"135":1,"245":1}}],["note",{"2":{"26":1,"54":1,"80":1}}],["not",{"2":{"13":1,"14":3,"17":1,"24":1,"73":1,"102":1,"103":1,"115":1,"116":1,"118":1,"131":1,"142":1,"144":1,"146":1,"161":1,"162":1,"163":1,"205":1,"219":2,"230":2,"231":1,"255":1,"267":1,"274":1,"275":1,"278":1,"281":1,"287":1,"315":1,"320":1,"324":1,"336":1}}],["normally",{"2":{"162":1}}],["normal",{"2":{"9":1,"24":1,"116":2,"120":1,"220":1,"221":1,"231":1,"254":2,"255":1,"276":1,"281":1,"287":1}}],["neural",{"2":{"316":1,"317":3,"327":1,"328":1,"334":1,"339":1}}],["nerdctl",{"2":{"315":1}}],["next",{"0":{"131":1,"154":1,"232":1,"341":1,"355":1},"2":{"60":1,"145":1,"167":1}}],["needing",{"2":{"317":1}}],["needed",{"2":{"87":1,"105":1,"209":1,"228":1}}],["needs",{"2":{"43":1,"66":1,"145":1,"160":1,"163":1,"217":1}}],["need",{"2":{"17":1,"23":1,"24":1,"61":1,"69":1,"75":1,"120":1,"142":1,"146":1,"161":1,"231":1,"247":1,"261":1,"288":1,"315":1,"317":1,"347":1}}],["newest",{"2":{"290":1}}],["newer",{"2":{"145":1}}],["news",{"2":{"235":2,"279":1,"281":1,"303":3}}],["newbot",{"2":{"75":1}}],["new",{"0":{"255":2,"287":1},"1":{"256":2,"257":2},"2":{"6":1,"14":1,"28":1,"54":1,"60":1,"77":1,"80":1,"101":1,"119":1,"189":1,"208":1,"252":1,"255":6,"256":5,"257":1,"279":2,"284":1,"287":4,"311":1}}],["network",{"2":{"4":1,"18":1,"19":1,"199":1}}],["qdrant",{"2":{"316":3,"317":2,"320":2,"321":1,"323":2,"327":3,"330":2,"334":4,"335":5}}],["queries",{"2":{"317":1}}],["question",{"2":{"250":1}}],["questions",{"2":{"13":2}}],["quality",{"2":{"210":1,"317":1,"327":2,"328":1}}],["quarter",{"2":{"13":1}}],["quoted",{"2":{"281":1}}],["quotes",{"2":{"279":1}}],["quot",{"2":{"78":2,"156":2,"180":2,"182":2,"186":4,"214":2,"235":4,"239":2,"242":2,"247":2}}],["quickly",{"2":{"138":1,"185":1,"189":1,"201":2,"212":1,"317":1}}],["quick",{"0":{"92":1,"283":1},"1":{"284":1,"285":1},"2":{"39":1,"112":1}}],["quietly",{"2":{"14":1}}],["qr",{"0":{"87":1,"140":1},"2":{"7":1,"39":1,"40":1,"41":1,"68":1,"85":1,"87":5,"88":1,"135":2,"140":2}}],["qq",{"0":{"47":1,"48":1},"1":{"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"1":1,"7":1,"39":1,"47":2,"48":2,"49":1,"50":3,"52":2,"114":1,"135":2,"312":1}}],["duplicates",{"2":{"266":1}}],["duckduckgo",{"2":{"245":1}}],["duration",{"2":{"184":1}}],["durable",{"2":{"5":1,"16":1,"17":1,"20":1}}],["during",{"2":{"117":1,"130":1,"147":1,"158":1,"184":1,"186":2,"202":1,"215":1,"244":1,"263":1,"275":1,"317":1,"326":1}}],["dynamic",{"2":{"137":1}}],["draft",{"2":{"196":1,"310":1}}],["drag",{"2":{"101":1}}],["drivers",{"2":{"162":1}}],["driven",{"2":{"10":1}}],["dropdown",{"2":{"128":1,"249":1,"336":1,"345":1,"350":1,"359":1}}],["dropped",{"2":{"101":1}}],["d",{"2":{"54":1,"317":1,"320":2,"321":1,"324":2,"334":1,"335":1}}],["dms",{"2":{"67":1,"103":1}}],["dm",{"2":{"39":1,"66":1,"135":1}}],["daily",{"2":{"235":1,"239":1,"240":1,"279":1,"313":1}}],["date",{"2":{"213":1}}],["data",{"0":{"168":1},"1":{"169":1,"170":1,"171":1},"2":{"114":1,"122":2,"159":2,"168":1,"169":2,"170":1,"171":1,"182":1,"196":1,"198":1,"233":1,"266":5,"294":1,"319":3,"323":1}}],["database",{"2":{"18":1,"114":1,"316":2,"320":1,"323":2,"334":1}}],["danger",{"2":{"114":1,"122":1}}],["dashboard",{"2":{"60":1}}],["days",{"2":{"210":1,"292":1}}],["day",{"2":{"10":1,"16":1,"236":5,"239":1,"337":2,"346":2,"351":2}}],["db",{"2":{"17":1,"320":3}}],["domain",{"2":{"176":1}}],["document",{"2":{"317":1}}],["documentation",{"0":{"312":1},"1":{"313":1,"314":1},"2":{"52":1,"84":1}}],["docs",{"2":{"265":1}}],["docker",{"0":{"315":1},"1":{"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1},"2":{"11":1,"130":1,"159":1,"313":1,"315":2,"316":1,"317":1,"318":2,"319":6,"320":5,"321":5,"324":6,"325":2,"334":1}}],["downloaded",{"2":{"317":1}}],["downloads",{"2":{"276":1}}],["download",{"2":{"190":1}}],["downloadable",{"2":{"169":1}}],["down",{"2":{"29":1,"158":1,"324":1}}],["don",{"2":{"14":2,"16":2,"317":1}}],["doing",{"2":{"14":1}}],["doesn",{"2":{"14":1,"158":1}}],["does",{"2":{"13":1,"146":1,"161":1,"162":1,"163":1,"180":1,"235":1,"281":1,"317":1}}],["do",{"2":{"11":1,"24":1,"54":1,"142":1,"230":1,"231":2,"278":1,"315":1}}],["debug",{"2":{"323":1}}],["debugging",{"0":{"110":1},"2":{"291":1}}],["dedicate",{"2":{"116":1}}],["dedicated",{"2":{"39":1,"117":1,"118":1,"152":1,"155":1,"187":1,"347":1}}],["demos",{"2":{"103":1}}],["determined",{"2":{"130":1}}],["determines",{"2":{"97":1}}],["detail",{"0":{"113":1},"1":{"114":1},"2":{"65":1,"76":1,"113":1,"115":1,"122":1,"134":1,"145":1,"151":1,"157":1,"177":1,"183":1,"187":1,"197":1,"207":1,"237":1}}],["detailed",{"2":{"41":1,"184":1,"280":1}}],["details",{"2":{"38":1,"202":1,"310":1,"317":1}}],["dense",{"0":{"335":1},"2":{"206":1,"316":1,"317":1,"327":2,"328":1,"330":3,"339":1}}],["density",{"2":{"14":2}}],["denied",{"2":{"94":1,"107":1,"108":1,"291":1}}],["deny",{"2":{"91":1,"92":6,"94":2,"95":1,"96":1,"97":1,"100":1,"103":2,"106":2,"107":1,"108":1,"296":1}}],["definitions",{"2":{"323":1}}],["defined",{"2":{"259":1}}],["defines",{"2":{"235":1}}],["define",{"2":{"91":1,"92":1,"114":1,"116":1,"216":1,"338":1}}],["defaults",{"2":{"255":1,"287":1,"319":2,"330":1,"344":1}}],["default",{"0":{"94":1},"2":{"18":1,"19":1,"49":2,"55":2,"81":1,"92":5,"94":1,"97":1,"99":1,"105":2,"106":1,"107":1,"110":1,"114":1,"119":2,"126":1,"130":1,"183":1,"228":1,"236":1,"253":2,"254":1,"255":4,"279":1,"285":1,"287":4,"296":1,"320":1,"322":1,"323":2,"325":1,"330":1,"339":1,"341":1,"353":1,"357":1,"358":4}}],["declare",{"2":{"226":1}}],["decay",{"2":{"210":1}}],["decisions",{"0":{"110":1}}],["decides",{"2":{"253":1}}],["decide",{"2":{"6":1,"14":1,"149":1,"226":1,"227":1,"254":1}}],["decentralized",{"2":{"39":1,"53":1,"135":1}}],["desirable",{"2":{"254":1}}],["desired",{"2":{"166":1}}],["designed",{"2":{"10":1,"245":1}}],["described",{"2":{"120":1}}],["descriptions",{"2":{"202":1,"277":1}}],["description",{"2":{"34":1,"55":1,"81":1,"89":1,"95":1,"114":1,"116":1,"117":1,"118":1,"126":1,"138":1,"147":1,"183":1,"198":1,"199":1,"218":1,"225":1,"229":1,"235":2,"240":1,"253":1,"265":2,"284":1,"285":1,"296":1,"316":1,"323":1,"325":1,"330":1,"344":1,"349":1,"354":1,"358":1}}],["developer",{"2":{"23":1,"28":1,"30":1,"35":1}}],["devices",{"0":{"160":1,"161":1},"1":{"161":1,"162":1,"163":1},"2":{"159":2,"160":3,"161":1,"162":2,"163":2}}],["device",{"2":{"14":1,"17":1,"19":1,"126":2,"160":1,"161":2,"162":6,"163":1,"219":1,"222":1}}],["deployment",{"2":{"40":1,"69":1,"313":1}}],["deployable",{"2":{"17":1}}],["depending",{"2":{"23":1,"41":1,"108":1,"206":1,"247":1}}],["dependable",{"2":{"16":1}}],["delegates",{"2":{"253":1}}],["delegated",{"2":{"3":1,"6":1,"8":1,"263":1}}],["deletes",{"2":{"301":1}}],["delete",{"0":{"272":1},"2":{"122":1,"127":1,"143":1,"146":1,"158":1,"167":1,"178":1,"190":1,"201":2,"209":1,"248":2,"257":1,"272":1,"277":1,"282":1,"301":2,"303":2,"331":1,"337":1}}],["deleting",{"0":{"122":1,"261":1},"2":{"201":1,"255":1,"261":1,"272":1,"273":1,"287":1}}],["delivered",{"2":{"241":1}}],["deliver",{"2":{"234":1}}],["delivering",{"2":{"71":1}}],["delivery",{"2":{"69":1,"176":1,"179":1}}],["deliberative",{"2":{"6":1}}],["digest",{"2":{"239":1,"240":1}}],["dimensions",{"2":{"229":1}}],["diagnose",{"2":{"151":1}}],["directories",{"2":{"189":1,"190":1,"266":1}}],["directory",{"2":{"171":1,"188":1,"189":1,"198":1,"265":1,"268":1,"270":1,"272":1,"274":1,"276":1,"319":2,"323":1}}],["direct",{"2":{"39":1,"50":1,"51":1,"53":1,"56":1,"57":1,"59":1,"62":2,"66":1,"67":1,"83":1,"90":1,"103":1,"218":1,"254":3,"287":1}}],["directly",{"2":{"11":1,"82":1,"85":1,"88":1,"121":1,"139":1,"187":1,"193":1,"209":1,"253":1,"266":1,"271":1,"321":1}}],["differ",{"2":{"117":1,"287":1}}],["differs",{"2":{"19":1}}],["different",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"3":1,"5":1,"40":1,"68":1,"133":1,"153":1,"183":1,"210":1,"214":1,"253":1,"256":1,"307":1,"326":1}}],["did",{"2":{"14":1,"117":1,"263":1}}],["displays",{"2":{"159":1,"213":1}}],["display",{"2":{"75":1,"112":1,"125":1,"126":1,"218":1,"225":1,"235":1,"329":1,"343":1,"348":1}}],["displayed",{"2":{"48":1,"87":1}}],["disable",{"0":{"273":1},"2":{"117":1,"118":1,"138":1,"143":1,"147":1,"201":1,"268":1,"273":1,"277":1,"282":1,"303":3}}],["disabled",{"2":{"10":1,"138":1,"241":1,"267":2,"273":1,"275":1}}],["disappears",{"2":{"14":1}}],["discovered",{"2":{"266":5,"268":1,"272":1,"274":1,"276":2}}],["discovers",{"2":{"202":1,"276":1}}],["discovery",{"0":{"202":1},"2":{"310":1}}],["discover",{"2":{"44":1,"162":1,"200":1,"203":1,"280":1}}],["discord",{"0":{"27":1,"28":1,"256":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"1":1,"7":1,"27":1,"28":1,"30":1,"31":1,"32":1,"39":1,"95":2,"102":1,"114":1,"133":1,"135":2,"255":1,"287":1,"312":1}}],["discuss",{"0":{"6":1,"120":1,"254":1},"2":{"6":1,"11":1,"120":3,"253":2,"254":3,"255":5,"256":1,"257":1,"259":1,"263":1,"284":1,"287":6,"313":1}}],["distinction",{"2":{"5":1,"224":1}}],["distinguishes",{"2":{"7":1,"224":1,"266":1}}],["distinguish",{"2":{"3":1}}],["dingtalk",{"0":{"22":1,"23":1,"142":1},"1":{"23":1,"24":1,"25":1,"26":1},"2":{"1":1,"7":1,"22":2,"23":2,"24":2,"25":1,"26":1,"39":1,"114":1,"135":2,"142":1,"312":1}}],["guidance",{"2":{"264":1}}],["guides",{"0":{"135":1,"314":1},"2":{"41":1,"314":1}}],["guide",{"2":{"30":1,"37":2,"68":1,"74":1,"75":1,"135":1,"227":1}}],["gpt",{"2":{"225":1,"297":2}}],["gpu=all",{"2":{"161":2}}],["gpu=0",{"2":{"161":2}}],["gpus",{"2":{"160":1}}],["gpu",{"2":{"159":1,"161":3,"162":1}}],["gather",{"2":{"129":1}}],["gateways",{"2":{"39":1}}],["gateway",{"0":{"124":1},"2":{"29":1,"123":1,"124":1,"316":1,"322":1,"323":2}}],["global",{"2":{"95":1,"245":1}}],["g",{"2":{"54":2,"55":2,"75":3,"95":2,"176":1,"189":1,"192":1,"193":1,"198":2,"199":1,"211":1,"235":3,"241":1,"247":2,"319":1,"325":1,"349":1,"352":2,"353":1}}],["gmail",{"2":{"39":1}}],["gt",{"2":{"30":1,"34":1,"35":1,"36":1,"37":1,"38":1,"50":1,"77":1,"80":1,"266":1,"280":3,"297":6,"298":1,"299":1,"300":1,"301":2,"303":8,"305":1}}],["grown",{"2":{"307":1}}],["grows",{"2":{"145":1}}],["grounded",{"2":{"250":1}}],["grouped",{"2":{"252":1}}],["group",{"2":{"22":1,"25":1,"26":1,"36":1,"39":1,"51":1,"53":1,"57":1,"62":1,"73":1,"82":1,"83":2,"92":3,"100":2,"102":2,"103":3,"110":1,"119":1,"135":1,"254":1,"255":1,"263":1,"279":2,"280":3,"281":1,"285":1,"287":1,"320":1,"324":1}}],["groups",{"0":{"285":1},"2":{"3":1,"18":1,"33":1,"62":2,"63":1,"92":1,"279":2}}],["gracefully",{"2":{"158":1}}],["grained",{"2":{"102":1,"119":1}}],["granting",{"2":{"200":1}}],["grants",{"2":{"96":1}}],["grant",{"2":{"23":1}}],["graphical",{"2":{"18":1}}],["grade",{"2":{"15":1}}],["good",{"2":{"135":1,"164":1,"221":1,"317":1,"327":1}}],["google",{"2":{"9":1,"217":1,"219":2,"244":1,"245":1}}],["goal",{"2":{"108":1}}],["go",{"2":{"24":1,"28":2,"30":1,"31":1,"34":2,"35":1,"36":1,"37":2,"38":1,"44":1,"48":1,"49":1,"50":1,"55":1,"60":1,"65":1,"70":1,"76":1,"77":1,"81":1,"86":1,"128":1,"249":1,"269":1,"336":1,"345":1,"350":1}}],["got",{"2":{"14":1}}],["git",{"2":{"318":1,"320":1,"325":1}}],["github",{"0":{"222":1},"2":{"9":1,"217":1,"219":2,"220":1,"222":3,"319":1,"320":1}}],["giving",{"2":{"252":1}}],["gives",{"2":{"119":1}}],["give",{"2":{"1":1,"14":1,"19":1,"28":1,"123":1,"265":1}}],["giant",{"2":{"115":1}}],["gemini",{"2":{"217":1,"219":1}}],["generic",{"2":{"174":1,"176":1,"242":1}}],["generator",{"2":{"30":1}}],["generates",{"2":{"70":1,"141":1}}],["generate",{"2":{"28":1,"37":1,"43":1,"50":1,"77":1,"116":1,"139":1,"226":1,"319":1,"320":1}}],["generated",{"2":{"14":1,"30":1,"57":1,"61":1,"259":1,"319":1}}],["generating",{"2":{"51":1,"89":1,"90":1,"116":1}}],["generation",{"0":{"228":1},"2":{"9":1,"116":4,"224":1,"228":2,"231":1,"279":1,"284":1,"288":1}}],["generative",{"2":{"9":1,"219":1}}],["generally",{"2":{"45":1}}],["general",{"0":{"41":1,"116":1},"2":{"10":1,"114":1,"115":1,"116":1,"122":1,"128":1,"147":1,"205":1,"242":1,"249":1,"336":1,"338":1,"340":1,"345":1,"350":1,"353":1,"359":1}}],["get",{"2":{"11":1,"13":1,"75":1,"87":1,"279":2,"285":1,"296":2,"301":2,"303":2}}],["gets",{"2":{"5":1,"19":1,"152":1}}],["hub",{"2":{"133":1,"321":1}}],["human",{"2":{"14":1}}],["humans",{"2":{"3":1,"18":1}}],["html",{"2":{"129":1}}],["http",{"0":{"199":1},"2":{"69":1,"199":2,"322":3,"323":1,"334":2,"335":1,"349":1}}],["https",{"2":{"43":1,"54":1,"55":1,"126":2,"221":1,"319":6,"320":1,"344":1}}],["h",{"2":{"54":1}}],["hybrid",{"2":{"19":1}}],["here",{"0":{"313":1},"2":{"311":1,"323":1}}],["height",{"2":{"126":2}}],["headers",{"2":{"199":2}}],["headless",{"2":{"123":1}}],["health",{"2":{"114":1}}],["heartbeat",{"0":{"117":1,"181":1,"242":1,"293":1},"1":{"182":1,"183":1,"184":1,"185":1,"186":1},"2":{"6":1,"10":1,"114":2,"115":1,"117":8,"181":1,"182":1,"183":5,"184":4,"185":1,"186":3,"242":2,"253":2,"257":1,"263":3,"285":2,"293":3,"296":6,"297":4}}],["helper",{"2":{"265":1}}],["help",{"0":{"280":1},"2":{"265":1,"280":7,"281":2,"282":1,"284":2}}],["helps",{"2":{"145":1,"149":1,"172":1,"260":1}}],["helpful",{"2":{"110":1}}],["held",{"2":{"19":1}}],["hour",{"2":{"236":1}}],["hours",{"2":{"18":1}}],["host",{"0":{"162":1},"2":{"155":1,"159":1,"160":3,"162":5,"176":1,"315":1,"323":3}}],["hosted",{"2":{"42":1,"245":1,"339":2,"341":2,"347":1}}],["how",{"0":{"17":1,"263":1,"328":1},"2":{"117":1,"118":1,"138":1,"146":1,"147":2,"151":1,"183":1,"184":1,"216":1,"262":1,"287":1,"330":1,"338":1,"360":1}}],["homeserver>",{"2":{"54":1}}],["homeserver",{"2":{"39":1,"53":1,"54":1,"55":2,"135":1}}],["home",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"14":2,"15":1,"19":1,"20":1,"305":2}}],["historical",{"2":{"146":1}}],["history",{"0":{"179":1},"2":{"15":1,"30":1,"62":4,"66":1,"153":1,"172":1,"185":1,"208":1,"214":1,"251":1,"252":1,"255":1,"256":1,"261":1,"287":1,"307":1}}],["highlighting",{"2":{"192":1}}],["highly",{"2":{"103":1,"245":1}}],["high",{"2":{"116":1,"176":1,"226":1,"296":1}}],["higher",{"2":{"101":1}}],["highest",{"2":{"97":1,"327":1}}],["hierarchy",{"2":{"102":1}}],["hint",{"2":{"49":1}}],["hide",{"2":{"14":1}}],["hit",{"2":{"6":1,"149":1,"262":1,"290":1}}],["happened",{"2":{"151":1}}],["happening",{"2":{"14":1}}],["have",{"2":{"19":1,"115":1,"131":1,"153":1,"158":1,"196":1,"205":1,"211":1,"222":1,"230":1,"279":1,"288":1,"352":1}}],["having",{"2":{"18":1}}],["half",{"2":{"14":1}}],["hardware",{"2":{"13":1,"14":1}}],["handles",{"2":{"180":1,"321":1,"342":1}}],["handled",{"2":{"63":1}}],["hand",{"2":{"10":1}}],["has",{"2":{"1":1,"14":1,"70":1,"87":1,"94":1,"96":1,"100":1,"153":1,"171":1,"187":1,"205":1,"211":1,"214":1,"235":1,"239":1,"256":1,"267":2,"280":1,"290":1,"307":1}}],["right",{"2":{"149":1,"248":1}}],["rich",{"2":{"8":1,"39":1,"51":1}}],["rule",{"0":{"96":1},"2":{"94":2,"96":1,"97":6,"100":2,"103":1,"108":1,"109":1,"110":1,"119":1,"234":1,"314":1}}],["rules",{"0":{"100":1,"101":1,"281":1},"2":{"91":1,"92":2,"95":2,"97":2,"99":1,"101":2,"102":1,"105":1,"106":1,"107":1,"114":1,"115":1,"119":1,"265":1,"291":1}}],["runtime",{"0":{"275":1},"2":{"17":1,"114":1,"115":2,"118":1,"154":1,"159":1,"160":1,"162":1,"172":1,"206":1,"262":1,"265":1,"275":1,"290":1,"317":1,"336":1}}],["running",{"2":{"11":1,"41":1,"121":1,"151":1,"158":1,"159":2,"279":1,"319":1,"320":1}}],["run",{"2":{"4":1,"16":1,"17":1,"18":1,"20":1,"150":2,"151":1,"162":1,"163":1,"198":1,"285":1,"307":2,"315":1,"319":1}}],["runs",{"2":{"4":1,"18":1,"117":2,"118":1,"150":1,"151":1,"235":1,"239":1,"263":1,"278":1,"315":1,"317":2,"328":1,"334":1}}],["range",{"2":{"358":1}}],["rand",{"2":{"320":1}}],["raw",{"2":{"270":1,"271":1}}],["raise",{"2":{"16":1}}],["ram",{"2":{"14":1}}],["rag",{"2":{"14":1,"15":1}}],["ratio",{"2":{"118":1,"126":1,"147":1,"210":2}}],["rather",{"2":{"9":1,"120":1,"210":1}}],["rate",{"2":{"6":1,"149":1,"262":1,"290":1}}],["roots",{"2":{"266":1}}],["root",{"2":{"218":1,"266":4}}],["room",{"2":{"56":1}}],["rooms",{"2":{"53":1,"55":1,"57":2,"103":1}}],["rocm",{"2":{"163":1}}],["routine",{"2":{"186":1,"233":1,"242":1}}],["routing",{"2":{"138":1,"255":1,"313":1}}],["routed",{"2":{"346":1,"351":1}}],["routes",{"2":{"253":1}}],["router",{"2":{"14":3,"17":2}}],["route",{"2":{"6":1,"255":1,"256":1,"279":1,"287":1,"290":2}}],["roadmap",{"2":{"57":1}}],["role",{"2":{"9":1,"110":1,"285":1,"291":1}}],["roles",{"2":{"3":1,"231":1,"313":1}}],["reuse",{"2":{"222":1}}],["reusable",{"2":{"8":1,"124":1,"264":1,"277":1}}],["rewriting",{"2":{"210":1}}],["rewrite",{"2":{"144":1}}],["rewrites",{"2":{"5":1,"153":1,"210":1,"214":1,"307":1}}],["requiring",{"2":{"317":1}}],["require",{"2":{"200":1}}],["requirements",{"0":{"162":1,"332":1},"1":{"333":1,"334":1,"335":1},"2":{"326":1,"327":1}}],["requires",{"2":{"100":1,"102":1,"121":1,"163":1,"200":1,"250":1,"319":1,"328":1,"334":1,"335":1,"339":1,"356":1}}],["required",{"2":{"18":1,"36":1,"48":1,"55":2,"62":1,"70":1,"81":2,"120":1,"137":1,"162":1,"176":1,"218":1,"229":1,"310":1,"320":1,"333":1,"344":1,"349":1,"354":1}}],["requested",{"2":{"203":1,"256":1}}],["revoke",{"2":{"200":1}}],["review",{"2":{"64":1,"117":1,"196":1}}],["redirected",{"2":{"200":1}}],["reducing",{"2":{"210":1}}],["reduce",{"2":{"214":1,"314":1}}],["reduced",{"2":{"118":1,"147":1}}],["reduces",{"2":{"5":1,"144":1,"206":1,"307":1}}],["redundant",{"2":{"153":1,"210":1}}],["renaming",{"0":{"260":1}}],["rename",{"2":{"190":2,"257":1,"260":1}}],["rendered",{"2":{"124":1}}],["returns",{"2":{"150":1}}],["retrieves",{"2":{"215":1,"338":1}}],["retrieve",{"2":{"190":1}}],["retrieved",{"2":{"18":1,"206":1,"330":1,"333":1}}],["retrieval",{"0":{"206":1},"2":{"17":1,"206":1,"210":1,"214":1,"224":1,"229":1,"316":1,"317":3,"326":2,"327":1,"328":1,"342":1}}],["rebuild",{"0":{"211":1},"2":{"130":1,"211":3,"326":1,"337":1}}],["referencing",{"2":{"256":1}}],["reference",{"0":{"116":1,"117":1,"118":1,"236":1,"283":1,"323":1},"1":{"284":1,"285":1}}],["refresh",{"2":{"185":1,"189":1,"202":1,"237":1,"310":1}}],["refine",{"0":{"99":1},"2":{"92":1,"115":1,"119":1}}],["reordering",{"0":{"101":1},"2":{"101":1}}],["reorder",{"2":{"99":1}}],["reload",{"2":{"189":1,"237":1}}],["relate",{"0":{"263":1}}],["related",{"0":{"120":1},"2":{"40":1,"161":1,"294":1}}],["relative",{"2":{"262":1}}],["relationships",{"2":{"167":1}}],["relationship",{"0":{"152":1}}],["relevant",{"2":{"147":1,"202":1,"204":1,"206":1}}],["release",{"2":{"38":2,"319":2,"325":1}}],["relying",{"2":{"129":1}}],["relies",{"2":{"40":1,"229":1}}],["regardless",{"2":{"50":1,"77":1,"95":1}}],["registry",{"2":{"321":2,"323":2}}],["registration",{"2":{"39":1}}],["register",{"2":{"41":1,"54":1,"239":1}}],["regular",{"2":{"6":1}}],["resolve",{"2":{"281":1}}],["resolves",{"2":{"266":1}}],["resource",{"0":{"285":1},"2":{"279":4}}],["resources",{"0":{"52":1,"58":1,"84":1},"2":{"115":1,"158":1,"203":1}}],["research",{"2":{"245":1,"265":1}}],["resetting",{"2":{"255":1}}],["resets",{"2":{"171":1,"252":1}}],["reset",{"2":{"28":1,"48":1,"166":1,"287":1}}],["rest",{"2":{"240":1}}],["restoring",{"0":{"166":1}}],["restore",{"0":{"171":1},"2":{"164":1,"166":1,"171":1}}],["restricted",{"2":{"103":1}}],["restrict",{"2":{"100":1,"102":1,"210":1}}],["results",{"2":{"129":1,"234":1,"241":1,"250":2,"263":1,"317":1}}],["resulting",{"2":{"99":1}}],["result",{"2":{"92":1,"119":1,"150":1,"153":1,"184":1,"240":1,"291":1}}],["response",{"2":{"184":1,"250":1}}],["responses",{"2":{"9":1,"26":1,"51":1,"57":1,"73":1,"74":1,"78":1,"83":1,"89":1,"90":1,"116":1,"219":2}}],["respond",{"2":{"53":1,"77":1,"180":1}}],["repository",{"2":{"319":1}}],["reports",{"2":{"162":1,"180":1,"233":1}}],["reporting",{"2":{"116":1}}],["repeatedly",{"2":{"277":1}}],["represent",{"2":{"43":1,"259":1}}],["reproducible",{"2":{"16":1}}],["replace",{"2":{"146":1}}],["replacing",{"2":{"145":1}}],["reply",{"2":{"25":1,"42":1,"72":1,"253":1,"254":1}}],["replies",{"2":{"22":1,"26":1,"39":1,"43":1,"45":1,"46":1,"59":1,"62":1,"73":1,"78":2,"135":2}}],["removing",{"2":{"138":1}}],["removes",{"2":{"261":1,"272":1}}],["remove",{"2":{"62":1,"122":1,"127":1,"143":1,"158":1,"167":1,"185":1,"190":1,"200":1,"209":1,"210":1,"261":1,"273":1,"331":1}}],["remote",{"0":{"199":1},"2":{"114":1,"199":2}}],["remains",{"2":{"17":1}}],["remember",{"2":{"14":1,"19":1,"194":1,"204":1}}],["re",{"2":{"16":1,"211":2,"273":1}}],["recursive",{"2":{"190":1}}],["recurring",{"2":{"182":1,"233":1,"242":1}}],["recipient",{"2":{"179":1}}],["recreating",{"2":{"163":1,"171":1}}],["recreate",{"2":{"161":1}}],["recent",{"2":{"118":1,"285":1,"293":1}}],["receiving",{"2":{"41":1,"82":1}}],["receive",{"2":{"36":1,"37":2,"57":1,"59":1,"62":1,"173":1}}],["receives",{"2":{"25":1,"66":1,"72":1,"186":1,"241":1}}],["records",{"2":{"146":1,"185":1,"253":1}}],["recommended",{"0":{"231":1,"277":1,"319":1},"2":{"62":1,"99":1,"245":1,"313":1,"315":1,"320":1}}],["recognition",{"2":{"50":1,"77":1}}],["recognized",{"2":{"3":1}}],["recalls",{"2":{"5":1}}],["reasoning",{"2":{"114":1,"116":4,"203":1,"224":1,"225":1,"226":4,"296":2}}],["reached",{"2":{"241":1}}],["reach",{"2":{"69":1}}],["reachable",{"2":{"7":1,"11":1,"212":1}}],["reaction",{"2":{"45":1}}],["reactions",{"2":{"39":2,"46":1,"62":2,"135":1}}],["reads",{"2":{"262":1}}],["reading",{"2":{"124":1}}],["ready",{"2":{"38":1,"39":1}}],["read",{"2":{"4":1,"30":1,"42":1,"43":1,"59":1,"62":11,"66":2,"67":1,"178":1,"192":1,"194":1,"219":1,"241":1,"253":1,"262":1,"282":1,"290":1,"305":4,"352":1,"354":1,"356":1,"357":1,"358":1}}],["realized",{"2":{"14":1}}],["reality",{"2":{"13":1}}],["real",{"0":{"244":1},"2":{"3":2,"13":2,"14":4,"19":1,"71":1,"83":1,"129":1,"158":1,"159":1,"162":1,"211":1,"243":1,"250":1,"253":1,"255":1}}],["f",{"2":{"321":2,"324":1}}],["fssl",{"2":{"319":6}}],["fs",{"0":{"305":1},"2":{"285":1,"305":5}}],["flask",{"2":{"317":1}}],["flags",{"2":{"225":1,"226":1}}],["flexible",{"2":{"242":1}}],["flow",{"0":{"41":1,"136":1,"241":1,"246":1,"340":1,"353":1},"1":{"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"247":1,"248":1},"2":{"116":2,"135":2,"140":1,"200":1,"221":1,"223":1,"230":1}}],["flows",{"2":{"10":1}}],["found",{"2":{"266":1}}],["focus",{"2":{"251":1}}],["focused",{"2":{"39":1,"245":1,"277":1}}],["folders",{"2":{"190":1}}],["folder",{"2":{"189":1,"190":1}}],["follow",{"2":{"75":1,"279":1,"288":1}}],["following",{"2":{"36":1,"39":1,"125":1,"247":1,"329":1,"334":1,"339":1,"343":1,"348":1}}],["footprint",{"2":{"144":1,"206":1,"307":1}}],["force",{"2":{"48":1,"231":1,"255":2,"287":2}}],["forcing",{"2":{"14":1}}],["forward",{"2":{"19":1}}],["format",{"2":{"230":1,"323":1,"352":1,"353":1,"358":2,"360":1}}],["formats",{"2":{"192":1}}],["formatted",{"2":{"57":1}}],["formatting",{"2":{"49":1,"51":1,"74":1}}],["forms",{"2":{"123":1,"124":1,"255":1,"281":1,"287":1}}],["form",{"2":{"13":1,"14":1,"102":1,"115":1,"218":1,"221":1,"222":1,"248":2}}],["for",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"3":2,"8":4,"9":3,"10":1,"14":2,"16":1,"17":1,"18":1,"20":1,"22":3,"23":2,"24":1,"32":1,"36":2,"38":1,"39":8,"41":1,"42":1,"43":4,"45":1,"51":2,"54":1,"57":2,"60":1,"66":3,"67":1,"68":2,"73":1,"75":2,"78":1,"83":1,"90":2,"92":1,"95":3,"97":1,"102":1,"103":6,"106":1,"107":1,"109":1,"112":1,"114":2,"115":3,"116":4,"117":1,"118":1,"119":2,"120":2,"122":1,"124":2,"125":1,"129":1,"130":2,"133":1,"135":2,"140":1,"141":1,"142":2,"145":1,"146":1,"147":1,"148":1,"150":1,"151":1,"153":1,"159":2,"160":1,"163":1,"164":1,"165":1,"168":1,"173":1,"176":2,"180":1,"181":1,"182":1,"190":1,"196":1,"198":2,"199":1,"200":1,"201":1,"210":1,"212":1,"213":1,"214":1,"217":1,"219":3,"221":1,"224":2,"225":1,"227":1,"229":2,"231":4,"233":1,"235":3,"237":1,"242":2,"243":1,"245":2,"247":2,"255":1,"259":2,"262":2,"263":2,"266":1,"267":1,"271":1,"272":1,"275":1,"277":1,"278":1,"279":2,"280":2,"281":3,"287":3,"288":1,"290":3,"291":1,"292":1,"294":1,"301":1,"303":1,"307":1,"308":1,"316":3,"317":3,"319":3,"321":1,"325":1,"329":1,"330":1,"337":1,"338":1,"343":1,"344":3,"346":1,"347":1,"348":1,"349":1,"351":1,"356":1}}],["future",{"2":{"146":1,"153":1,"214":1}}],["full",{"2":{"32":1,"51":1,"57":1,"83":1,"90":1,"200":1}}],["fully",{"2":{"16":2,"195":1,"276":1,"339":1}}],["furthermore",{"2":{"20":1}}],["friendly",{"2":{"218":1,"225":1,"247":1}}],["free",{"2":{"354":1,"356":1}}],["freely",{"2":{"18":1}}],["fresh",{"2":{"87":1,"171":1,"252":1,"255":1,"257":1,"278":1,"287":1}}],["frontend",{"2":{"323":1}}],["frontmatter",{"2":{"265":1}}],["frontier",{"2":{"17":1,"20":1}}],["from",{"0":{"149":1,"150":1,"266":1},"2":{"7":1,"10":1,"11":1,"14":1,"41":2,"54":1,"64":1,"67":1,"68":1,"69":1,"71":1,"72":1,"78":1,"87":1,"91":1,"92":2,"94":1,"96":1,"97":1,"100":1,"108":2,"112":1,"116":3,"117":2,"119":1,"125":1,"126":1,"134":1,"137":1,"147":1,"157":1,"160":1,"170":1,"174":1,"175":1,"176":1,"177":1,"183":2,"187":1,"190":2,"196":2,"197":1,"201":1,"202":1,"205":1,"206":1,"207":1,"208":2,"210":1,"211":2,"216":2,"218":1,"222":1,"228":1,"230":2,"245":1,"247":1,"248":1,"251":1,"253":1,"255":1,"256":1,"262":1,"263":1,"264":2,"266":3,"273":1,"274":2,"276":1,"277":1,"307":1,"314":1,"317":1,"319":2,"326":1,"328":1,"330":1,"337":2,"340":2,"344":1,"349":1,"352":2,"353":1}}],["false",{"2":{"296":2,"325":1}}],["fallback",{"2":{"272":2,"273":1}}],["falls",{"2":{"116":1}}],["fail",{"2":{"320":1}}],["failure",{"2":{"151":1}}],["failed",{"2":{"118":1,"151":1,"184":1}}],["favorite",{"2":{"39":1,"132":1}}],["fastest",{"2":{"280":1,"287":1}}],["faster",{"2":{"19":1}}],["fast",{"2":{"14":1,"278":1,"317":1}}],["familiar",{"2":{"13":1,"188":1}}],["factor",{"2":{"13":1,"126":1}}],["facts",{"2":{"5":1}}],["facing",{"2":{"6":1,"7":1,"259":1}}],["few",{"2":{"115":1,"281":1}}],["featuring",{"2":{"74":1}}],["feature",{"0":{"314":1},"2":{"39":1,"153":1,"181":1,"211":1,"225":1,"229":1,"242":1}}],["features",{"0":{"18":1,"26":1,"32":1,"46":1,"51":1,"57":1,"67":1,"73":1,"78":1,"83":1,"90":1,"263":1},"2":{"57":1,"116":1,"153":1,"226":1,"242":1}}],["federated",{"2":{"39":1}}],["feb",{"2":{"21":1}}],["feedback",{"2":{"51":1,"90":1,"158":1}}],["feed",{"2":{"16":1}}],["feels",{"2":{"20":1}}],["feeling",{"2":{"14":1}}],["feel",{"2":{"13":1,"14":2,"254":1}}],["fetch",{"2":{"8":1,"41":1,"87":1,"317":1,"319":1}}],["feishu",{"0":{"33":1,"34":1,"139":1,"256":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1},"2":{"1":1,"7":1,"18":1,"33":1,"34":1,"35":1,"37":3,"38":1,"39":1,"114":1,"135":2,"139":3,"312":1}}],["fixed",{"2":{"242":1}}],["fixes",{"2":{"14":1}}],["fit",{"2":{"135":1,"221":1}}],["fired",{"2":{"235":1}}],["fires",{"2":{"234":1,"241":1,"253":1}}],["firefox",{"2":{"126":1,"130":3,"325":1}}],["first",{"2":{"14":1,"15":1,"19":2,"42":1,"97":2,"101":1,"115":1,"141":1,"236":1,"322":1}}],["finds",{"2":{"206":1,"267":1}}],["find",{"2":{"128":1,"166":1,"185":1,"201":1,"249":1,"336":1,"345":1,"350":1,"359":1}}],["fine",{"2":{"102":1,"119":1}}],["final",{"2":{"41":1}}],["finished",{"2":{"14":1,"151":1}}],["fields",{"0":{"138":1,"235":1},"2":{"55":1,"70":1,"81":1,"102":1,"137":1,"147":1,"151":1,"176":1,"218":1,"225":1,"236":1,"262":1,"329":1,"343":1,"348":1}}],["field",{"2":{"37":1,"55":1,"76":1,"81":1,"89":1,"116":1,"117":1,"118":1,"120":1,"125":1,"126":1,"138":1,"147":1,"183":1,"198":1,"199":1,"205":1,"218":1,"225":1,"229":2,"235":1,"236":1,"330":1,"344":1,"349":1,"358":1}}],["filter",{"2":{"185":1,"209":1,"257":1}}],["filling",{"2":{"124":1}}],["fill",{"2":{"24":1,"37":1,"38":1,"55":1,"65":1,"70":1,"81":1,"112":1,"123":1,"125":1,"129":1,"137":1,"176":1,"201":1,"218":1,"247":1,"270":1,"310":1,"329":1,"343":1,"348":1}}],["fileviewer",{"2":{"191":1}}],["filemanager",{"2":{"188":1}}],["file",{"2":{"8":1,"114":1,"158":1,"170":1,"188":1,"189":1,"190":2,"192":2,"193":2,"201":2,"206":1,"241":1,"265":2,"270":1,"305":1,"320":1,"323":1,"325":1,"327":1,"333":1,"339":1}}],["files",{"0":{"187":1,"190":1,"192":1,"194":1},"1":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1},"2":{"4":1,"10":1,"17":1,"18":1,"19":1,"30":1,"32":1,"39":1,"51":1,"57":1,"59":1,"62":4,"66":2,"67":2,"78":2,"114":2,"122":1,"156":1,"162":1,"187":1,"189":1,"190":2,"191":1,"194":2,"285":1}}],["filesystem",{"0":{"302":1},"1":{"303":1,"304":1,"305":1},"2":{"4":1,"114":1,"155":1,"169":1,"170":1,"171":1,"182":1,"187":2,"192":1,"198":1,"305":1}}],["five",{"2":{"6":1,"236":1,"253":1}}],["uuid",{"2":{"296":2}}],["utc",{"2":{"126":1,"236":1,"323":1}}],["url",{"2":{"24":1,"30":2,"37":4,"41":1,"43":1,"44":1,"55":2,"69":1,"70":1,"71":1,"81":1,"112":1,"139":2,"141":2,"142":1,"199":1,"217":1,"218":1,"222":1,"247":1,"322":1,"323":2,"334":2,"335":1,"344":2,"349":1}}],["upstream",{"2":{"216":1,"217":1,"223":1,"225":1}}],["updating",{"2":{"163":1}}],["updates",{"2":{"296":1}}],["updated",{"2":{"172":1,"211":1}}],["update",{"2":{"126":1,"127":1,"143":2,"190":1,"248":1,"271":1,"282":1,"285":1,"296":4,"303":2,"324":1,"331":1}}],["uploaded",{"2":{"62":1,"66":1,"67":1}}],["upload",{"2":{"46":1,"62":1,"190":1}}],["up",{"2":{"18":1,"48":1,"62":1,"115":1,"182":1,"213":1,"268":1,"288":1,"313":1,"317":1,"320":2,"321":1,"324":2,"334":1,"335":1,"355":1}}],["upgradable",{"2":{"17":1}}],["uncomment",{"2":{"321":1}}],["uncomfortable",{"2":{"16":1}}],["unread",{"2":{"239":1,"240":2}}],["unresolvable",{"2":{"162":1}}],["unlike",{"2":{"328":1}}],["unlimited",{"2":{"235":1,"242":1}}],["unless",{"2":{"92":1,"94":1}}],["unsure",{"2":{"103":1,"277":1}}],["until",{"2":{"92":1,"268":1}}],["unique",{"2":{"75":1,"159":1,"215":1}}],["unified",{"0":{"133":1},"2":{"7":1}}],["underlying",{"2":{"317":1}}],["under",{"2":{"15":1,"160":1,"162":1,"216":1,"223":1,"266":2,"352":1}}],["understanding",{"2":{"172":1}}],["understands",{"2":{"78":1}}],["understand",{"2":{"11":1,"147":1,"154":1,"313":1}}],["usually",{"2":{"162":1,"216":1,"268":2}}],["us",{"2":{"126":1,"358":1}}],["using",{"0":{"337":1},"2":{"54":1,"111":1,"132":1,"139":1,"140":1,"141":1,"142":1,"158":1,"205":1,"233":1,"234":1,"240":1,"241":1,"255":1,"291":1,"317":2,"319":1,"333":1,"340":1,"359":1}}],["usage",{"0":{"213":1,"292":1,"346":1,"351":1},"2":{"6":1,"145":1,"149":1,"151":2,"213":1,"227":2,"262":1,"264":1,"265":1,"280":1,"285":2,"290":2,"291":1,"292":5,"293":1,"294":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1,"304":1,"305":1,"307":1}}],["useful",{"2":{"95":2,"103":1,"149":1,"151":1,"164":1,"171":1,"182":1,"210":1,"211":1,"222":1,"233":1,"256":1,"271":1,"276":1,"288":1,"291":1}}],["used",{"2":{"6":1,"116":6,"118":1,"147":1,"149":1,"152":1,"159":1,"183":1,"215":1,"218":1,"224":1,"227":1,"229":1,"262":2,"267":1,"275":2,"290":1,"330":1,"347":1}}],["uses",{"2":{"6":1,"7":1,"22":1,"40":1,"44":1,"61":1,"81":1,"91":1,"116":1,"147":1,"218":1,"221":1,"222":2,"226":1,"227":1,"236":2,"252":1,"253":1,"265":1,"317":1,"328":1,"338":1,"354":1,"356":1}}],["use",{"2":{"4":1,"8":1,"18":1,"19":1,"38":1,"43":1,"50":1,"59":1,"69":1,"70":1,"71":1,"77":1,"95":1,"110":1,"115":3,"119":2,"123":2,"124":1,"127":1,"128":1,"129":1,"153":2,"162":1,"167":1,"180":1,"186":1,"190":1,"194":1,"201":1,"202":2,"203":1,"206":1,"212":1,"214":2,"216":1,"219":1,"220":1,"224":1,"229":1,"242":2,"244":1,"248":1,"255":1,"259":1,"265":2,"271":1,"273":1,"274":1,"277":2,"279":1,"287":2,"290":2,"307":1,"317":2,"319":4,"321":1,"325":2,"327":1,"331":1,"336":1,"346":1,"351":1,"360":1}}],["username",{"2":{"75":2,"176":1,"323":1}}],["username>",{"2":{"54":1}}],["users",{"0":{"106":1,"107":1},"2":{"3":1,"17":1,"23":1,"33":1,"45":2,"47":1,"57":1,"79":1,"82":1,"83":1,"85":1,"88":1,"90":1,"91":1,"95":2,"108":1,"112":1,"120":1,"160":1,"254":1,"282":1,"321":1}}],["user",{"0":{"3":1},"2":{"6":1,"7":1,"14":1,"19":1,"54":3,"55":2,"56":1,"64":1,"95":1,"102":1,"109":1,"110":1,"112":1,"116":1,"126":2,"163":1,"180":1,"203":1,"206":1,"222":1,"250":1,"251":1,"253":2,"259":2,"291":1,"320":1,"323":1,"324":1}}],["ui",{"0":{"10":1,"257":1,"269":1},"1":{"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"1":1,"6":1,"10":1,"24":1,"31":1,"43":1,"44":1,"49":1,"50":1,"55":1,"65":1,"70":1,"76":1,"77":1,"81":1,"86":1,"126":1,"152":1,"160":1,"191":1,"216":1,"225":1,"227":1,"254":1,"255":2,"257":1,"259":1,"274":2,"278":1,"287":2,"309":1,"310":1,"315":1,"316":1,"322":1}}],["sslmode",{"2":{"323":1}}],["sse",{"0":{"199":1},"2":{"158":1,"199":1}}],["snapshotter",{"2":{"323":1}}],["snapshot",{"0":{"165":1,"166":1},"2":{"165":2,"166":1,"167":1}}],["snapshots",{"0":{"164":1,"167":1},"1":{"165":1,"166":1,"167":1},"2":{"114":1,"164":1,"167":1}}],["switches",{"2":{"297":1,"298":1,"299":1,"300":1}}],["switching",{"2":{"211":1,"256":1,"278":1}}],["switch",{"2":{"143":1,"257":1,"285":4,"309":1,"310":1}}],["synthesize",{"2":{"352":2,"353":1,"359":1}}],["synthesized",{"2":{"250":1}}],["synthesis",{"2":{"219":1,"353":1,"356":1,"360":1}}],["syntax",{"2":{"192":1,"236":1}}],["synchronous",{"2":{"150":1,"254":1}}],["sync",{"2":{"55":1}}],["system",{"2":{"7":1,"9":1,"10":1,"13":1,"91":1,"97":1,"112":1,"116":2,"155":1,"186":1,"204":1,"212":1,"253":1,"280":1,"339":1,"352":1}}],["shipped",{"2":{"326":1}}],["sh",{"2":{"319":12}}],["shut",{"2":{"158":1}}],["shell",{"2":{"121":1}}],["short",{"2":{"265":1,"277":1}}],["shorten",{"2":{"214":1}}],["shorter",{"2":{"145":1}}],["shortcut",{"2":{"92":1}}],["showing",{"2":{"179":1}}],["shows",{"2":{"149":1,"163":1,"212":1,"222":1,"237":1,"259":1,"276":1,"290":1,"291":1,"292":1,"293":1,"294":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1}}],["show",{"2":{"49":1,"62":1,"89":1,"227":1,"263":1,"268":1,"275":1,"279":1,"280":3,"284":1,"285":2,"290":3}}],["shown",{"2":{"48":1,"126":1,"158":1,"225":1,"259":1}}],["should",{"2":{"43":1,"62":1,"77":1,"103":2,"118":1,"123":1,"147":1,"183":1,"186":1,"263":1}}],["shanghai",{"2":{"126":1}}],["shape",{"2":{"116":1}}],["shadowed",{"2":{"10":1,"267":1,"268":1,"275":1,"314":1}}],["share",{"2":{"19":1}}],["shared",{"2":{"1":1,"3":1,"103":1,"263":1}}],["sharing",{"2":{"3":1,"17":1,"19":1,"168":1,"201":1}}],["spoken",{"2":{"352":1}}],["sparse",{"0":{"317":1,"328":1,"334":1},"2":{"206":1,"211":1,"316":4,"317":9,"319":1,"320":2,"323":2,"327":4,"328":5,"330":2,"334":5,"339":2}}],["space",{"2":{"163":1}}],["spaces",{"2":{"103":1,"265":1,"279":1}}],["split",{"2":{"19":1,"115":1}}],["speak",{"2":{"263":1}}],["speaks",{"2":{"253":1,"254":1}}],["speaker",{"2":{"14":1}}],["speed",{"2":{"230":1,"352":1,"353":1,"358":2,"360":1}}],["speech",{"0":{"230":1},"2":{"9":2,"116":4,"216":3,"219":4,"224":3,"230":3,"231":1,"232":2,"352":2,"353":1,"356":1,"359":1}}],["spec",{"2":{"162":1}}],["specs",{"2":{"162":1}}],["specify",{"2":{"247":1}}],["specifically",{"2":{"245":1}}],["specification",{"2":{"58":1}}],["specific",{"0":{"108":1},"2":{"91":1,"95":1,"100":5,"102":2,"109":2,"120":1,"130":1,"174":1,"201":1,"208":1,"215":1,"234":1,"242":1,"244":1,"247":1,"251":1,"267":1,"273":1,"279":1,"319":1,"352":1}}],["specified",{"2":{"18":1}}],["special",{"0":{"139":1,"140":1,"141":1,"142":1},"2":{"186":1}}],["specialized",{"2":{"111":1,"113":1}}],["scale",{"2":{"126":1}}],["scans",{"2":{"266":1}}],["scan",{"0":{"87":1},"2":{"85":1,"87":2,"140":1}}],["schema",{"2":{"120":1}}],["schedules",{"0":{"237":1,"238":1},"1":{"239":1,"240":1},"2":{"237":1,"238":1,"240":1}}],["scheduled",{"0":{"182":1,"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1},"2":{"18":1,"114":1,"115":1,"182":1,"233":1,"253":1,"263":1,"285":1,"303":1}}],["schedule",{"0":{"235":1,"242":1,"303":1},"2":{"6":1,"18":1,"114":1,"181":1,"234":2,"235":3,"237":1,"239":4,"240":1,"241":4,"242":2,"253":1,"257":1,"263":1,"279":3,"281":1,"285":1,"303":10}}],["scoping",{"2":{"110":1,"344":2}}],["scoped",{"0":{"109":1},"2":{"252":1,"314":1}}],["scope",{"0":{"102":1},"2":{"61":1,"100":1,"102":2,"109":1,"153":1,"214":1,"291":1}}],["scopes",{"0":{"62":1},"2":{"30":1,"62":2,"66":1}}],["scenarios",{"2":{"39":1,"68":1,"135":1}}],["scratch",{"2":{"211":1}}],["scripts",{"2":{"156":1}}],["script",{"2":{"130":1,"319":2,"321":1}}],["scroll",{"2":{"29":1,"122":1,"129":1}}],["screenshot",{"2":{"129":1}}],["screenshots",{"2":{"123":1,"124":1}}],["screen",{"2":{"14":1,"64":1}}],["slow",{"2":{"319":1}}],["slack",{"0":{"59":1,"60":1},"1":{"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1},"2":{"39":1,"59":1,"60":1,"61":1,"62":2,"63":1,"64":1,"65":1,"66":1,"67":1,"135":2}}],["slash",{"0":{"150":1,"278":1},"1":{"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1},"2":{"6":1,"10":1,"11":1,"32":1,"110":1,"152":1,"154":2,"255":1,"278":2,"280":1,"281":2,"284":1,"313":1}}],["sludge",{"2":{"14":1}}],["saas",{"2":{"339":2,"341":2,"342":1,"347":1}}],["saving",{"2":{"128":1,"164":1}}],["saves",{"2":{"87":1}}],["saved",{"2":{"70":1}}],["save",{"2":{"24":1,"29":1,"31":1,"37":2,"41":1,"44":1,"48":1,"49":1,"55":1,"65":1,"70":1,"76":1,"81":1,"100":1,"101":1,"128":1,"141":1,"142":1,"143":2,"158":1,"169":1,"192":2,"205":1,"218":1,"223":1,"249":1,"270":1,"310":1,"336":1,"345":1,"350":1,"353":1,"359":1}}],["safely",{"2":{"164":1,"226":1,"274":1}}],["safe",{"2":{"16":1,"70":1}}],["say",{"2":{"14":1}}],["same",{"2":{"3":2,"14":1,"64":1,"71":1,"262":1,"266":1,"267":1,"268":2,"272":1,"274":1}}],["smtp",{"2":{"39":1,"174":1,"176":1}}],["smell",{"2":{"14":1}}],["smoother",{"2":{"14":1}}],["smaller",{"2":{"144":1}}],["small",{"2":{"14":1,"277":1}}],["smarter",{"2":{"13":1}}],["s",{"0":{"115":1},"2":{"13":1,"14":6,"16":1,"20":1,"22":1,"31":1,"32":1,"37":1,"41":1,"47":1,"49":1,"55":3,"56":1,"61":1,"76":1,"79":1,"81":2,"86":1,"91":1,"94":1,"98":1,"112":1,"114":2,"115":1,"116":2,"121":1,"130":1,"131":1,"134":1,"139":1,"143":2,"145":1,"147":2,"152":2,"153":1,"156":1,"157":1,"159":2,"161":1,"164":2,"169":1,"170":1,"171":1,"172":1,"177":1,"178":1,"179":2,"184":1,"186":1,"190":2,"191":1,"192":2,"194":1,"198":1,"200":2,"204":1,"205":1,"206":1,"207":1,"208":2,"211":1,"221":1,"235":1,"236":1,"250":1,"252":1,"253":4,"254":1,"256":1,"262":1,"264":2,"274":1,"281":1,"297":1,"303":1,"308":1,"309":1,"310":1,"319":2,"326":1,"337":1,"340":2,"353":2,"354":1,"356":1,"359":1}}],["silently",{"2":{"319":1}}],["silent",{"2":{"253":1,"254":1,"319":1}}],["single",{"2":{"133":1,"144":1,"206":1}}],["similar",{"2":{"153":1}}],["simultaneously",{"2":{"121":1,"133":1}}],["simple",{"2":{"18":1,"85":1,"265":1}}],["significantly",{"2":{"317":1,"328":1}}],["sign",{"2":{"43":1}}],["sites",{"2":{"126":1}}],["sit",{"2":{"13":1,"14":1}}],["sidebar",{"2":{"28":1,"34":1,"41":1,"112":1,"125":1,"126":1,"175":1,"176":1,"218":1,"245":1,"247":1,"248":1,"257":1,"259":1,"340":1,"353":1}}],["side",{"2":{"10":1,"72":1,"231":1}}],["size",{"2":{"5":1,"123":1,"147":1,"229":1,"314":1}}],["skill",{"0":{"265":1,"267":1,"270":1,"271":1,"272":1,"304":1,"309":1},"1":{"268":1},"2":{"8":1,"10":1,"114":1,"265":7,"266":6,"267":5,"268":4,"270":1,"271":1,"272":3,"273":2,"274":4,"276":3,"285":1,"304":2,"309":2}}],["skills",{"0":{"8":1,"264":1,"266":1,"269":1,"275":1,"276":1},"1":{"265":1,"266":1,"267":1,"268":1,"269":1,"270":2,"271":2,"272":2,"273":2,"274":2,"275":1,"276":1,"277":1},"2":{"6":1,"8":1,"11":1,"18":1,"114":1,"149":1,"182":1,"186":1,"194":1,"234":1,"262":2,"264":2,"266":10,"269":1,"270":1,"271":1,"274":1,"275":4,"276":3,"277":3,"285":1,"290":1,"304":1,"308":1,"309":2,"311":1,"314":3}}],["sudo",{"2":{"319":6,"320":1,"324":1}}],["suffixes",{"2":{"281":1}}],["sun=0",{"2":{"236":1}}],["summary",{"2":{"145":1,"151":3,"184":1,"235":1,"239":1,"262":1,"279":1,"285":1,"292":2,"323":1}}],["summarizing",{"2":{"144":1}}],["summarizes",{"2":{"153":1,"214":1}}],["summarize",{"2":{"118":1,"147":1,"152":1,"235":1,"240":2,"303":1,"307":1}}],["successful",{"2":{"118":1}}],["successfully",{"2":{"77":1,"151":1,"179":1,"184":1}}],["succeeds",{"2":{"88":1}}],["such",{"2":{"6":1,"10":1,"112":1,"114":1,"116":2,"123":1,"126":2,"129":1,"162":1,"210":1,"215":1,"217":2,"218":1,"225":2,"226":1,"229":1,"231":1,"255":1,"265":1,"266":2,"278":1,"279":2,"282":1,"287":1,"296":1}}],["suited",{"2":{"45":1}}],["surface",{"2":{"280":1,"313":1}}],["surfaced",{"2":{"262":1}}],["sure",{"2":{"43":1,"64":1,"71":1,"205":1}}],["survive",{"2":{"13":1}}],["subdirectory",{"2":{"266":1}}],["subsequent",{"2":{"256":1}}],["subscribe",{"0":{"63":1}}],["subscriptions",{"2":{"37":1,"63":1}}],["sub",{"2":{"103":1}}],["subject",{"0":{"95":1},"2":{"95":1,"96":2,"97":1,"100":1,"108":1,"179":2}}],["subjects",{"2":{"94":1,"95":1,"97":1,"106":1,"107":1}}],["submitting",{"2":{"124":1}}],["submit",{"2":{"38":1}}],["subagents",{"2":{"8":1}}],["subagent",{"2":{"6":1,"253":3,"257":1,"263":2}}],["sustainable",{"2":{"19":1}}],["support",{"2":{"19":1,"32":1,"39":2,"49":1,"51":2,"57":1,"67":1,"74":1,"78":1,"83":1,"90":2,"135":2,"162":1,"190":1,"278":1,"281":1}}],["supported",{"0":{"26":1,"32":1,"46":1,"51":1,"57":1,"67":1,"73":1,"78":1,"83":1,"90":1,"134":1,"245":1},"1":{"135":1},"2":{"10":1,"25":1,"74":1,"245":1,"255":3,"287":2,"296":1,"340":1}}],["supports",{"2":{"9":1,"18":1,"22":1,"33":1,"39":1,"40":1,"116":1,"135":1,"168":1,"192":1,"195":1,"200":1,"219":1,"226":1,"317":1,"326":1,"328":1,"339":2,"352":1,"356":1}}],["supermarket",{"0":{"8":1,"276":1,"308":1},"1":{"309":1,"310":1,"311":1},"2":{"8":1,"11":1,"196":1,"264":1,"276":1,"277":1,"308":1,"309":1,"310":1,"311":1,"314":1}}],["serper",{"2":{"245":1}}],["server",{"0":{"30":1},"2":{"29":1,"30":1,"42":1,"174":1,"198":1,"199":3,"200":1,"202":2,"203":2,"236":1,"315":1,"316":2,"323":4}}],["servers",{"2":{"8":1,"27":1,"39":1,"135":1,"176":1,"200":1,"314":1}}],["service",{"0":{"316":1,"317":1},"1":{"317":1},"2":{"174":1,"175":1,"217":1,"241":1,"316":2,"317":1,"319":1,"322":1,"323":1,"327":1,"334":1,"347":1,"352":1}}],["services",{"2":{"17":1,"133":1,"195":1,"316":1,"319":1,"320":1,"322":1}}],["serving",{"2":{"17":1}}],["searxng",{"2":{"245":1,"247":1}}],["searches",{"2":{"215":1}}],["searching",{"0":{"209":1}}],["search",{"0":{"243":1,"245":1,"247":1,"249":1,"299":1},"1":{"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1},"2":{"8":2,"9":1,"15":1,"18":1,"36":1,"75":1,"100":1,"114":2,"115":1,"116":2,"129":1,"146":1,"201":1,"209":1,"229":1,"231":1,"241":1,"243":1,"244":2,"245":6,"247":4,"249":1,"250":3,"257":1,"285":2,"299":4,"316":1,"317":2,"327":2,"328":1,"330":1,"337":1,"338":1,"339":1,"346":1,"351":1}}],["sent",{"2":{"179":3,"199":1,"235":1}}],["sensible",{"2":{"119":1}}],["sensitive",{"2":{"103":1}}],["sends",{"2":{"206":1,"234":1,"239":1}}],["sender",{"2":{"95":1,"97":1}}],["sending",{"2":{"41":1,"182":1,"233":1,"288":1}}],["send",{"2":{"6":1,"25":1,"30":1,"36":1,"50":1,"57":1,"59":1,"62":1,"66":2,"67":1,"72":1,"75":1,"77":1,"78":2,"82":1,"88":1,"139":1,"145":1,"173":1,"178":1,"180":1,"235":1,"240":1,"241":1,"253":1,"254":2,"256":1,"279":1,"281":1}}],["self",{"2":{"42":1,"245":1,"339":2,"341":2,"347":1}}],["selectively",{"2":{"263":1}}],["selection",{"0":{"130":1},"2":{"114":1,"130":1,"319":1}}],["selected",{"0":{"106":1},"2":{"116":2,"137":1,"147":1,"152":1,"218":1,"259":1,"262":1,"276":1,"319":1,"336":1,"360":1}}],["select",{"2":{"30":3,"31":1,"49":1,"50":1,"55":1,"65":1,"76":2,"77":1,"81":1,"86":1,"100":3,"126":1,"127":1,"128":1,"129":1,"137":1,"170":1,"178":1,"190":1,"201":1,"205":1,"208":1,"223":1,"237":1,"248":1,"249":2,"309":1,"310":1,"329":1,"330":1,"331":1,"336":1,"343":1,"344":1,"345":1,"348":1,"349":1,"350":1,"352":1,"353":2,"357":1,"359":1}}],["sees",{"2":{"275":1}}],["seen",{"2":{"100":1}}],["see",{"2":{"41":1,"112":1,"118":2,"131":1,"144":1,"152":1,"154":3,"189":1,"193":1,"206":1,"215":1,"232":2,"254":1,"263":1,"287":1,"307":1,"316":1,"317":1,"346":1,"351":1}}],["security",{"2":{"155":1}}],["securely",{"2":{"28":1,"48":1,"200":1}}],["seconds",{"2":{"55":1}}],["secrets",{"2":{"41":1,"138":1,"310":1}}],["secret",{"2":{"23":1,"24":1,"34":1,"37":1,"40":1,"54":1,"69":1,"70":1,"75":1,"80":1,"81":1,"142":1,"319":2,"320":1,"323":1,"344":1,"349":1}}],["sections",{"2":{"323":1,"334":1}}],["section",{"2":{"21":1,"29":1,"202":1,"323":1,"335":1}}],["semantic",{"2":{"18":1,"229":1,"317":1,"326":1,"327":1,"339":1}}],["setting",{"2":{"120":1,"163":1}}],["settings",{"0":{"29":1,"89":1,"115":1,"120":1,"296":1},"2":{"10":1,"18":1,"34":1,"37":1,"40":1,"49":1,"114":2,"115":2,"116":1,"120":2,"126":1,"141":1,"161":1,"163":1,"211":1,"215":1,"218":1,"230":1,"232":1,"247":1,"248":1,"278":1,"279":2,"285":2,"296":5,"319":1,"330":1,"331":1,"335":1,"336":1,"340":1,"344":1,"349":1,"352":2,"358":1}}],["setups",{"2":{"120":1,"266":1}}],["setup",{"0":{"41":1,"337":1},"2":{"11":1,"24":1,"39":1,"85":1,"119":1,"130":1,"131":1,"142":1,"313":1,"327":1}}],["set",{"2":{"8":1,"18":1,"100":1,"105":1,"106":1,"107":1,"108":1,"109":1,"115":1,"116":1,"178":1,"182":1,"196":1,"210":1,"241":1,"252":1,"275":1,"279":1,"280":1,"282":1,"297":8,"298":2,"299":2,"300":2,"313":1,"320":1,"321":1,"325":1,"355":1}}],["sessions",{"0":{"6":1,"251":1,"258":1,"259":1,"260":1,"261":1,"263":1},"1":{"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":2,"260":2,"261":2,"262":1,"263":1},"2":{"6":6,"11":1,"120":1,"154":1,"156":1,"252":2,"253":1,"255":1,"257":4,"259":2,"261":1,"263":5,"275":1,"287":2,"313":2}}],["session",{"0":{"149":1,"214":1,"253":1,"255":1,"262":1,"286":1},"1":{"254":1,"256":1,"257":1,"287":1,"288":1},"2":{"5":3,"6":2,"10":1,"114":1,"115":1,"116":2,"118":3,"144":2,"146":2,"147":3,"148":1,"149":1,"150":1,"152":3,"153":2,"154":2,"206":2,"210":1,"214":3,"227":2,"251":2,"252":3,"253":4,"254":1,"255":6,"256":3,"257":3,"259":4,"260":1,"261":1,"262":5,"263":2,"275":2,"278":2,"279":1,"285":2,"287":4,"290":4,"307":3,"314":1}}],["separately",{"2":{"216":1}}],["separated",{"2":{"9":1,"161":1}}],["separates",{"2":{"5":1}}],["separate",{"2":{"4":1,"9":1,"116":1,"142":1,"206":1,"228":1,"253":1}}],["separation",{"2":{"3":1,"230":1}}],["stdio",{"0":{"198":1},"2":{"114":1}}],["steps",{"0":{"131":1,"154":1,"232":1,"341":1,"355":1},"2":{"60":1,"174":1}}],["step",{"0":{"23":1,"24":1,"25":1,"28":1,"29":1,"30":1,"31":1,"34":1,"35":1,"36":1,"37":1,"38":1,"43":1,"44":1,"45":1,"48":1,"49":1,"50":1,"54":1,"55":1,"56":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"69":1,"70":1,"71":1,"72":1,"75":1,"76":1,"77":1,"80":1,"81":1,"82":1,"86":1,"87":1,"88":1},"2":{"41":1,"115":1}}],["studio",{"2":{"15":1,"19":1}}],["stopping",{"2":{"163":1}}],["stopped",{"2":{"159":1,"165":1}}],["stop",{"0":{"288":1},"2":{"114":1,"158":1,"279":1,"284":2,"324":1}}],["stops",{"2":{"14":1,"288":1}}],["stood",{"2":{"14":1}}],["stories",{"2":{"281":1}}],["storage",{"2":{"14":1,"17":1,"144":1,"213":1,"342":1}}],["story",{"0":{"14":1}}],["store",{"2":{"28":1,"156":1,"337":1}}],["stored",{"2":{"5":1,"18":2,"144":1,"153":2,"200":2,"206":1,"210":2,"213":1,"214":1,"314":1,"333":1,"344":1,"349":1}}],["stores",{"2":{"5":1,"123":1,"217":1,"222":1,"338":1}}],["style",{"2":{"14":1,"26":1,"39":1,"40":2,"45":1,"73":1,"126":1,"135":1,"219":1,"221":1,"254":1,"264":1}}],["strong",{"2":{"135":1}}],["strings",{"2":{"281":1}}],["string",{"2":{"126":1}}],["strict",{"2":{"17":1}}],["streamed",{"2":{"57":1,"83":1}}],["streaming",{"2":{"26":1,"39":1,"46":1,"57":1,"59":1,"73":1,"74":1,"78":1,"83":1,"135":3,"288":1}}],["stream",{"0":{"142":1},"2":{"14":1,"22":1,"24":1,"41":1,"142":1}}],["structured",{"2":{"1":1,"180":1,"204":1,"312":1}}],["still",{"2":{"13":1,"66":1,"145":2,"163":1,"227":1,"288":1}}],["stale",{"2":{"210":1}}],["stable",{"2":{"165":1,"265":1}}],["standardized",{"2":{"196":1}}],["standard",{"2":{"142":1,"198":1,"201":1,"230":1,"236":1,"253":1,"326":1}}],["stats",{"2":{"290":1}}],["statistics",{"0":{"213":1}}],["static",{"2":{"129":1}}],["states",{"0":{"267":1},"1":{"268":1},"2":{"266":1,"267":1,"314":1}}],["state",{"2":{"156":1,"164":1,"165":1,"166":1,"171":1,"267":1}}],["status",{"0":{"149":1,"151":1,"212":1,"262":1,"289":1,"290":1},"1":{"290":1,"291":1,"292":1,"293":1,"294":1},"2":{"6":1,"10":1,"116":1,"143":1,"149":2,"150":1,"151":1,"152":2,"159":1,"179":1,"182":1,"184":1,"185":1,"200":2,"211":1,"212":2,"213":1,"214":1,"227":1,"237":1,"262":2,"275":1,"278":1,"279":3,"285":2,"290":3,"313":1,"324":1}}],["staying",{"2":{"254":1}}],["stay",{"2":{"17":1,"253":1}}],["stays",{"2":{"15":1,"20":2}}],["stakes",{"2":{"14":1}}],["stack",{"2":{"11":1,"17":1,"20":1,"315":1,"316":1}}],["startup",{"2":{"322":2}}],["starting",{"0":{"255":1},"1":{"256":1,"257":1},"2":{"92":1,"119":1,"163":1,"252":1,"320":1}}],["starts",{"2":{"61":1,"64":1,"119":1,"317":1}}],["started",{"2":{"14":2,"151":1,"316":1}}],["start",{"0":{"11":1,"45":1,"82":1,"88":1,"92":1,"99":1,"313":1},"2":{"6":1,"41":1,"44":1,"56":1,"87":2,"92":1,"103":1,"108":1,"112":1,"114":1,"115":1,"158":1,"171":1,"196":1,"211":1,"256":1,"277":1,"319":1,"320":2,"324":1}}],["sogou",{"2":{"245":1}}],["sonnet",{"2":{"225":1}}],["software",{"2":{"156":1,"163":1}}],["solve",{"2":{"153":1}}],["sound",{"2":{"153":1,"360":1}}],["sources",{"2":{"196":1,"266":1,"267":1,"276":1}}],["source",{"0":{"102":1},"2":{"20":1,"100":1,"102":1,"109":1,"267":3,"268":3,"272":1,"273":2,"274":1}}],["social",{"2":{"39":1,"42":1,"45":1}}],["socket",{"0":{"61":1},"2":{"39":1,"61":2,"323":1}}],["some",{"2":{"200":1,"279":1,"316":1}}],["someone",{"2":{"16":1}}],["somewhere",{"2":{"14":2}}],["something",{"2":{"13":1,"14":3}}],["so",{"2":{"3":1,"7":1,"10":1,"14":2,"16":1,"42":1,"61":1,"116":1,"117":1,"118":1,"274":1,"276":1,"279":1,"317":2,"352":1}}],["ps",{"2":{"324":1}}],["p",{"2":{"303":1}}],["pm",{"2":{"236":1}}],["png",{"2":{"193":1}}],["python",{"2":{"317":1}}],["python3",{"2":{"198":1}}],["py",{"2":{"192":1}}],["pdf",{"2":{"129":1}}],["pdfs",{"2":{"124":1}}],["pipeline",{"2":{"326":1}}],["pins",{"2":{"325":1}}],["pin",{"2":{"319":1}}],["pitch",{"2":{"230":1,"352":1,"353":1,"358":2,"360":1}}],["pixel",{"2":{"126":1}}],["pixels",{"2":{"126":2}}],["picture",{"2":{"112":1}}],["pick",{"2":{"99":1,"116":1}}],["plus",{"2":{"106":1}}],["plan",{"2":{"277":1,"317":1}}],["plane",{"2":{"17":1}}],["playback",{"2":{"358":1}}],["playwright",{"2":{"124":1,"316":1}}],["playground",{"2":{"19":1}}],["placed",{"2":{"97":1,"160":1}}],["places",{"2":{"7":1}}],["plainly",{"2":{"14":1}}],["platforms",{"2":{"18":1,"24":1,"31":1,"37":1,"39":1,"41":1,"44":1,"49":1,"55":1,"65":1,"70":1,"74":1,"76":1,"81":1,"86":1,"111":1,"114":1,"132":1,"134":1}}],["platform",{"0":{"71":1,"108":1,"135":1},"2":{"1":1,"23":1,"33":1,"34":1,"41":4,"47":1,"48":1,"50":1,"52":1,"69":1,"71":2,"77":1,"84":1,"87":1,"95":2,"100":1,"135":1,"137":1,"138":2,"141":1,"312":1,"313":1,"314":1,"342":1}}],["phone",{"2":{"87":2}}],["phones",{"2":{"14":1}}],["photo",{"2":{"57":1}}],["pulled",{"2":{"322":1}}],["pulls",{"2":{"319":1}}],["pull",{"2":{"158":1,"324":1}}],["purposes",{"2":{"168":1}}],["purpose",{"2":{"135":1,"224":1,"242":1}}],["public",{"2":{"42":1,"62":1,"66":1,"67":1,"103":1,"354":1,"356":1}}],["published",{"2":{"38":1}}],["publish",{"0":{"38":1},"2":{"23":1,"43":1}}],["push",{"2":{"19":1}}],["port",{"2":{"176":1,"317":1,"323":3}}],["portal",{"2":{"28":1,"30":1,"39":1,"194":1}}],["portable",{"2":{"14":1,"16":1}}],["power",{"2":{"226":1,"227":1}}],["powered",{"2":{"124":1,"245":1}}],["powerful",{"2":{"14":1,"173":1,"245":1}}],["points",{"0":{"322":1},"2":{"221":1}}],["point",{"2":{"92":1}}],["policy",{"2":{"112":1,"119":1}}],["polite",{"2":{"14":1}}],["polling",{"2":{"55":1}}],["postgres",{"2":{"316":1,"319":2,"320":4,"323":1,"325":2}}],["postgresql",{"2":{"315":1,"316":1,"323":1,"325":1}}],["post",{"2":{"54":1,"240":1}}],["positional",{"2":{"279":1}}],["position",{"2":{"14":1}}],["parsing",{"0":{"281":1}}],["parse",{"2":{"278":1}}],["parallel",{"2":{"231":1}}],["parameters",{"2":{"210":1,"247":1}}],["parent",{"2":{"167":1,"189":1}}],["participant",{"2":{"254":1}}],["participate",{"2":{"53":1,"57":1,"59":1,"83":1}}],["part",{"2":{"14":1,"274":1}}],["packaged",{"2":{"169":1}}],["package",{"2":{"156":1}}],["pattern",{"0":{"236":1},"2":{"235":1,"236":2,"237":1,"240":1,"279":1,"303":2}}],["patterns",{"2":{"92":1}}],["paths",{"2":{"159":2,"276":1,"323":1}}],["path",{"2":{"92":1,"189":1,"305":2,"313":1,"323":1,"325":1}}],["passes",{"2":{"147":1}}],["password=your",{"2":{"320":2}}],["password>",{"2":{"54":1}}],["password",{"2":{"54":2,"176":1,"319":2,"320":7,"323":2,"325":3}}],["pasting",{"2":{"277":1}}],["paste",{"2":{"24":1,"31":1,"37":1,"44":1,"49":1,"71":1,"76":1,"139":1}}],["past",{"2":{"13":1}}],["pages",{"2":{"123":1}}],["page",{"0":{"113":1},"1":{"114":1},"2":{"48":1,"60":1,"65":1,"76":1,"112":1,"113":1,"115":1,"122":1,"123":1,"124":1,"125":2,"128":1,"129":1,"134":1,"144":1,"151":1,"157":1,"175":1,"176":1,"177":1,"183":1,"187":1,"197":1,"200":1,"206":1,"207":1,"216":1,"218":1,"224":1,"237":1,"245":1,"247":1,"249":1,"329":1,"336":1,"340":1,"343":1,"345":1,"348":1,"350":1,"352":1,"353":1,"357":1,"360":1}}],["pairs",{"2":{"198":1}}],["paired",{"2":{"15":1}}],["paid",{"2":{"14":1}}],["panels",{"2":{"313":1}}],["panel",{"0":{"149":1,"262":1},"2":{"6":1,"149":2,"152":1,"153":1,"214":1,"262":2,"275":1}}],["pending",{"2":{"118":1,"222":1}}],["percentage",{"2":{"227":1}}],["per",{"2":{"112":1,"116":1,"161":1,"252":1,"314":1}}],["performance",{"2":{"245":1}}],["performing",{"2":{"233":1}}],["perform",{"2":{"111":1,"129":1,"158":1,"181":1,"186":1,"194":1,"203":1}}],["persistence",{"2":{"159":1}}],["persistent",{"2":{"111":1,"122":1,"312":1}}],["persist",{"2":{"101":1}}],["personalized",{"2":{"204":1}}],["personality",{"2":{"111":1,"114":1}}],["personal",{"2":{"7":1,"13":1,"14":1,"39":2,"40":1,"68":1,"85":1,"103":1,"135":3}}],["person",{"2":{"3":1}}],["permission",{"2":{"64":1,"96":1,"291":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1}}],["permissions",{"0":{"36":1,"282":1},"2":{"23":1,"30":1,"36":3,"62":1,"64":1,"178":1,"180":1}}],["permanently",{"2":{"20":1,"122":1,"143":1,"261":1}}],["periodic",{"2":{"6":1,"117":1,"181":1,"182":1,"233":1,"242":2,"253":1}}],["people",{"2":{"3":1,"16":1}}],["practical",{"2":{"265":1}}],["practice",{"2":{"1":1,"124":1,"146":1,"162":1,"254":1}}],["primarily",{"2":{"224":1,"238":1}}],["primary",{"2":{"116":1}}],["prior",{"2":{"145":1}}],["priority",{"0":{"97":1},"2":{"97":2,"101":1}}],["prioritized",{"2":{"91":1}}],["privileged",{"2":{"29":1}}],["privileges",{"2":{"14":1}}],["privacy",{"2":{"13":1,"19":1,"245":2}}],["privately",{"2":{"18":1}}],["private",{"0":{"106":1},"2":{"3":1,"16":1,"17":2,"22":1,"25":1,"26":1,"33":1,"39":2,"57":1,"62":1,"66":1,"67":1,"68":1,"72":1,"73":2,"83":1,"90":1,"92":2,"100":1,"103":2,"108":1,"112":1,"135":2,"156":1,"255":1}}],["pre",{"2":{"317":1}}],["prefix",{"2":{"324":1}}],["prefixed",{"2":{"281":1}}],["prefilled",{"2":{"196":1,"310":1}}],["prefer",{"2":{"277":1}}],["previously",{"2":{"273":1}}],["previous",{"2":{"252":1,"256":1}}],["preview",{"2":{"151":1,"193":2,"360":1}}],["precise",{"2":{"242":1}}],["precedence",{"2":{"97":1,"267":1}}],["prerequisites",{"0":{"205":1,"318":1}}],["pressure",{"2":{"145":1}}],["present",{"2":{"66":1,"334":1,"335":1}}],["presence",{"2":{"29":1}}],["preserved",{"2":{"256":1,"281":1}}],["preserves",{"2":{"145":1}}],["preserve",{"2":{"6":1}}],["presets",{"0":{"92":1,"103":1},"2":{"92":2,"314":1}}],["preset",{"0":{"99":1},"2":{"1":1,"92":2,"99":2,"105":1,"106":1,"107":1,"108":1,"112":1,"115":1,"119":2,"221":1}}],["prepare",{"0":{"43":1,"69":1},"2":{"69":1}}],["project",{"2":{"328":1,"344":2}}],["programmatically",{"2":{"240":1}}],["programming",{"2":{"192":1}}],["progress",{"2":{"14":2,"158":1,"288":1}}],["process",{"0":{"198":1},"2":{"178":1,"184":1,"198":1,"203":1,"211":2,"250":1,"315":1,"316":1}}],["providing",{"2":{"173":1,"204":1}}],["provided",{"2":{"138":1,"140":1,"203":1,"208":1}}],["provides",{"2":{"121":1,"124":1,"151":1,"155":1,"179":1,"184":1,"188":1,"196":1,"257":1,"262":1,"317":2,"328":1,"347":1}}],["provide",{"0":{"160":1},"1":{"161":1,"162":1,"163":1},"2":{"70":1,"75":1,"160":1,"162":1,"165":1,"178":1,"186":1,"215":1,"250":2}}],["provider",{"0":{"175":1,"176":1,"217":1,"218":1,"247":1,"249":1,"326":1,"329":1,"330":1,"336":1,"342":1,"343":1,"344":1,"345":1,"347":1,"348":1,"349":1,"350":1,"357":1},"1":{"176":1,"218":1,"219":1,"327":1,"328":1,"329":1,"330":1,"331":2,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"343":1,"344":1,"345":1,"346":1,"348":1,"349":1,"350":1,"351":1},"2":{"9":2,"10":1,"18":1,"115":1,"116":4,"131":1,"144":1,"146":1,"153":1,"174":2,"175":1,"176":3,"178":1,"200":1,"205":5,"206":2,"210":1,"211":1,"212":2,"214":1,"215":3,"217":1,"218":4,"219":2,"220":1,"221":1,"222":2,"223":3,"230":1,"244":1,"245":1,"247":2,"248":3,"249":2,"250":1,"297":3,"298":1,"299":1,"307":1,"317":2,"323":1,"326":2,"329":3,"330":1,"331":2,"335":1,"336":4,"337":1,"338":3,"339":2,"340":5,"341":4,"342":1,"343":3,"344":1,"345":2,"347":1,"348":3,"349":1,"350":2,"352":3,"353":2,"354":1,"355":1,"357":2}}],["providers",{"0":{"9":1,"173":1,"216":1,"220":1,"243":1,"248":1,"331":1,"338":1,"339":1,"352":1,"354":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"217":1,"218":1,"219":1,"220":1,"221":2,"222":2,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"339":1,"340":1,"341":1,"353":1,"354":1,"355":1},"2":{"5":1,"11":1,"39":2,"115":3,"116":2,"195":1,"205":1,"215":1,"216":5,"219":3,"224":2,"229":1,"230":1,"232":2,"245":1,"278":1,"285":3,"294":2,"313":2,"314":1,"329":1,"339":1,"340":1,"343":1,"348":1,"352":1,"353":1,"357":1}}],["probing",{"2":{"314":1}}],["probe",{"2":{"120":1,"202":1,"310":1}}],["problematic",{"2":{"107":1}}],["problems",{"2":{"5":1,"153":1}}],["proxy",{"2":{"69":2}}],["profiles",{"2":{"334":1}}],["profile",{"2":{"50":1,"77":1,"112":1,"124":1,"130":1,"316":2,"317":5,"320":3,"321":2,"327":2,"334":2,"335":1}}],["protocol",{"2":{"39":1,"53":1,"195":1,"217":2,"218":1}}],["product",{"2":{"20":1,"313":1}}],["prompted",{"2":{"87":1}}],["prompts",{"2":{"75":1,"130":1,"182":1,"319":1}}],["prompt",{"2":{"5":1,"144":1,"186":1,"206":1,"210":1,"227":1,"242":1,"254":1,"264":1,"273":1,"275":1,"307":1,"319":1}}],["bm25",{"2":{"317":1}}],["bing",{"2":{"244":1,"245":1}}],["bindings",{"0":{"173":1,"177":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":2,"179":1,"180":1},"2":{"114":2,"115":1,"285":1,"294":2}}],["binding",{"0":{"178":1},"2":{"50":1,"77":1,"174":1,"178":1}}],["bind",{"0":{"50":1,"77":1},"2":{"3":1,"50":1,"77":2,"338":1}}],["b",{"2":{"54":1}}],["blocked",{"0":{"107":1}}],["block",{"2":{"102":1}}],["blocks",{"2":{"51":1,"78":1,"96":1}}],["blogs",{"0":{"21":1},"2":{"21":1}}],["brave",{"2":{"244":1,"245":1,"247":1}}],["breadcrumb",{"2":{"189":1}}],["breaks",{"2":{"13":1}}],["bridges",{"2":{"133":1}}],["brief",{"2":{"16":1,"235":1}}],["browsing",{"0":{"189":1},"2":{"116":1,"188":1}}],["browses",{"2":{"305":1}}],["browse",{"2":{"114":1,"243":1,"285":1}}],["browser",{"0":{"123":1,"124":1,"125":1,"126":1,"128":1,"130":1,"300":1},"1":{"124":1,"125":1,"126":1,"127":2,"128":1,"129":1,"130":1,"131":1},"2":{"8":1,"30":1,"114":1,"115":1,"116":2,"123":6,"124":4,"125":4,"126":5,"128":3,"129":4,"130":6,"232":1,"285":2,"300":4,"316":3,"317":1,"319":2,"320":3,"321":1,"322":1,"323":2,"325":5}}],["broad",{"0":{"7":1},"2":{"99":1}}],["bundled",{"2":{"221":1}}],["budget",{"2":{"147":1,"225":1}}],["business",{"2":{"39":1}}],["buildkit",{"2":{"315":1}}],["build",{"2":{"14":1,"19":1,"130":3,"317":1,"319":1}}],["building",{"2":{"14":1}}],["buildable",{"2":{"13":1}}],["builtin",{"2":{"329":1}}],["built",{"0":{"280":1,"326":1,"329":1,"330":1},"1":{"327":1,"328":1,"329":1,"330":1,"331":2,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1},"2":{"1":1,"3":1,"8":1,"19":1,"20":1,"39":1,"115":1,"116":1,"129":1,"131":1,"192":1,"205":1,"230":1,"255":1,"278":1,"280":1,"287":1,"308":1,"317":2,"326":2,"339":1,"341":1,"353":1,"360":1}}],["buttons",{"2":{"124":1}}],["button",{"2":{"112":1,"167":1,"200":1,"201":1,"202":1,"248":1,"257":1,"353":1,"360":1}}],["but",{"2":{"13":2,"14":1,"16":1,"66":2,"102":2,"103":1,"145":1,"153":1,"227":1,"256":1,"275":1,"276":1}}],["bypasses",{"2":{"97":1}}],["by",{"2":{"9":1,"10":1,"18":2,"19":1,"36":1,"39":1,"43":1,"54":1,"62":1,"63":1,"94":1,"105":1,"116":1,"124":1,"130":1,"138":1,"144":1,"145":1,"162":1,"179":1,"185":1,"189":1,"201":1,"202":1,"203":3,"209":1,"210":1,"215":1,"218":2,"224":1,"236":1,"253":1,"257":3,"260":1,"262":2,"263":1,"292":2,"320":1}}],["batch",{"2":{"201":1}}],["battery",{"2":{"14":1}}],["bashsudo",{"2":{"320":2,"321":1}}],["bashgit",{"2":{"320":1}}],["bashdocker",{"2":{"317":1,"324":1,"334":1,"335":1}}],["bashbrowser",{"2":{"130":1}}],["bashcurl",{"2":{"54":1,"319":5}}],["basics",{"0":{"217":1},"1":{"218":1,"219":1}}],["basic",{"0":{"340":1,"353":1},"2":{"34":1,"60":1,"61":1,"112":1}}],["base64",{"2":{"320":1}}],["base",{"2":{"14":1,"15":2,"55":1,"159":1,"217":1,"218":1,"247":1,"323":1,"334":2,"335":1,"344":2,"349":1}}],["based",{"0":{"97":1,"220":1,"234":1},"1":{"221":1,"222":1},"2":{"7":1,"114":2,"137":1,"180":1,"200":1,"206":1,"218":1,"316":1,"327":1,"333":1,"339":2}}],["backup",{"2":{"168":1,"201":1}}],["background",{"2":{"147":2,"159":1}}],["backend",{"2":{"116":1,"205":1,"212":1,"215":1,"221":1,"326":1,"338":1,"346":1,"347":1,"351":1}}],["backed",{"2":{"1":1,"160":1,"219":1,"222":1}}],["back",{"2":{"14":1,"67":1,"78":1,"116":1,"145":1,"190":1,"200":1}}],["box",{"2":{"317":1}}],["body",{"2":{"265":1}}],["bocha",{"2":{"245":1}}],["bound",{"2":{"234":1}}],["boundaries",{"2":{"17":1,"19":1}}],["boundary",{"2":{"4":1,"13":1}}],["bold",{"2":{"51":1,"78":1}}],["botname",{"2":{"281":1}}],["bottom",{"2":{"97":2,"122":1}}],["botfather",{"2":{"75":2}}],["both",{"2":{"19":1,"130":1,"242":1,"259":1,"334":1}}],["bot",{"0":{"3":1,"29":1,"30":1,"35":1,"48":1,"54":1,"56":1,"62":1,"63":1,"66":1,"75":1,"80":1,"91":1,"105":1,"106":1,"107":1,"111":1,"112":1,"113":1,"115":1,"122":1,"128":1,"129":1,"132":1,"155":1,"174":1,"177":1,"180":1,"181":1,"186":1,"187":1,"194":1,"196":1,"203":1,"204":1,"215":1,"239":1,"249":1,"250":1,"264":1,"336":1,"345":1,"350":1,"359":1},"1":{"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"112":1,"113":1,"114":2,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"178":1,"182":1,"183":1,"184":1,"185":1,"186":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1},"2":{"1":3,"4":1,"6":2,"7":1,"8":1,"10":1,"11":2,"18":3,"19":1,"23":2,"24":1,"25":2,"27":1,"28":2,"30":2,"31":2,"35":2,"37":2,"38":1,"39":1,"41":3,"42":1,"43":3,"44":2,"45":1,"47":2,"48":2,"49":1,"50":2,"52":2,"53":2,"54":1,"55":3,"56":2,"59":1,"60":1,"61":1,"62":2,"63":1,"64":2,"65":2,"66":4,"70":1,"72":1,"74":1,"75":7,"76":1,"77":3,"78":4,"79":1,"80":3,"81":4,"82":2,"84":1,"85":1,"86":1,"88":1,"91":2,"92":1,"94":4,"96":2,"97":1,"98":1,"99":1,"100":1,"103":2,"106":2,"107":1,"108":1,"109":1,"111":1,"112":4,"113":1,"114":3,"115":2,"116":3,"117":1,"119":2,"120":2,"121":1,"122":4,"123":4,"128":2,"129":2,"131":2,"132":1,"133":1,"134":2,"138":1,"140":1,"144":1,"145":1,"146":1,"147":2,"151":1,"153":1,"154":1,"155":2,"156":2,"157":2,"158":1,"159":1,"160":2,"161":1,"164":2,"172":1,"173":1,"174":2,"177":2,"178":5,"179":1,"180":2,"181":1,"182":1,"183":1,"184":2,"186":3,"187":2,"189":1,"190":2,"191":1,"192":1,"194":2,"195":1,"196":2,"197":1,"198":1,"202":1,"203":1,"205":3,"206":1,"207":2,"208":1,"212":1,"213":1,"215":3,"228":1,"232":2,"233":1,"234":2,"237":2,"239":3,"240":1,"243":1,"244":1,"249":1,"250":2,"251":2,"252":4,"253":7,"254":2,"256":3,"259":1,"263":3,"264":2,"265":1,"266":1,"269":1,"275":1,"281":1,"282":1,"285":4,"288":1,"290":1,"291":1,"294":1,"296":2,"297":1,"301":1,"303":1,"304":1,"305":2,"309":2,"310":2,"313":2,"316":1,"336":2,"337":3,"338":2,"340":2,"341":1,"342":1,"345":1,"346":2,"350":1,"351":2,"352":3,"353":2,"359":2,"360":1}}],["bots",{"2":{"1":1,"3":2,"4":2,"8":1,"11":3,"18":6,"22":1,"30":1,"33":1,"39":3,"48":1,"57":1,"103":4,"111":1,"112":1,"124":2,"128":1,"155":1,"196":1,"204":1,"231":1,"240":1,"249":1,"278":1,"312":1,"336":1,"345":1,"347":1,"350":1,"352":1}}],["below",{"2":{"316":1}}],["belief",{"2":{"19":1}}],["begin",{"2":{"82":1,"313":1}}],["been",{"2":{"70":1,"267":1}}],["best",{"2":{"42":1,"45":1,"103":5}}],["before",{"2":{"23":1,"71":1,"87":1,"100":1,"162":1,"205":1,"212":1,"277":1,"278":1,"288":1,"307":1,"320":1,"360":1}}],["better",{"2":{"317":1,"328":1}}],["bet",{"2":{"20":1}}],["between",{"2":{"7":1,"14":1,"138":1,"141":1,"189":1,"199":1,"251":1,"256":1,"257":1,"266":1}}],["become",{"2":{"153":2,"171":1,"210":1,"211":1,"256":1,"268":1,"272":1,"274":1}}],["becomes",{"2":{"14":1,"16":1,"152":1,"244":1,"268":2,"338":1}}],["because",{"2":{"14":1,"227":1,"230":1,"259":1,"266":1}}],["being",{"2":{"14":1,"276":1,"317":1}}],["behind",{"2":{"14":1}}],["behavior",{"0":{"163":1},"2":{"8":1,"11":1,"26":1,"73":1,"110":1,"114":1,"115":1,"116":2,"118":1,"120":1,"123":1,"126":1,"255":1,"264":1,"287":1,"323":1}}],["behaves",{"2":{"1":1,"254":1,"276":1}}],["be",{"2":{"3":1,"7":1,"18":1,"19":1,"66":1,"101":1,"118":1,"121":1,"122":1,"147":1,"152":1,"160":1,"178":1,"183":1,"227":1,"228":1,"241":1,"250":1,"267":2,"319":1,"334":1,"335":1,"347":1}}],["equivalent",{"2":{"279":2}}],["either",{"2":{"264":1,"266":1}}],["error",{"2":{"162":1,"184":1,"212":1}}],["errors",{"2":{"126":1,"185":1}}],["estimated",{"2":{"118":1,"147":2}}],["especially",{"2":{"110":1,"222":1,"256":1,"263":1}}],["efficient",{"2":{"317":1}}],["efforts",{"2":{"226":1}}],["effort",{"2":{"116":2,"226":1,"296":1}}],["effects",{"0":{"96":1}}],["effect",{"0":{"94":1},"2":{"92":5,"94":1,"96":1,"97":1,"99":1,"100":1,"105":1,"106":1,"107":1,"110":1,"119":1,"296":1}}],["effectively",{"2":{"216":1}}],["effective",{"0":{"275":1},"2":{"10":1,"159":1,"163":1,"262":1,"267":2,"268":5,"272":1,"275":2,"314":1}}],["etc",{"0":{"256":1},"2":{"56":1,"162":1,"317":1}}],["elements",{"2":{"123":1}}],["element",{"2":{"54":1,"56":1,"58":1}}],["else",{"2":{"14":1,"16":1}}],["e",{"2":{"54":2,"55":2,"75":3,"95":2,"176":1,"189":1,"192":1,"193":1,"198":2,"199":1,"211":1,"235":3,"241":1,"247":2,"319":1,"325":1,"349":1,"352":2,"353":1}}],["easy",{"2":{"18":1}}],["each",{"2":{"1":2,"4":1,"6":1,"18":3,"19":1,"41":1,"48":1,"94":1,"96":1,"102":1,"106":1,"196":1,"215":1,"242":1,"251":1,"252":1,"259":1,"263":2,"266":1,"267":1,"326":1}}],["evaluated",{"2":{"97":1,"101":1,"236":1,"291":1}}],["evaluation",{"0":{"97":1},"2":{"110":1}}],["even",{"2":{"181":1,"290":1}}],["event",{"2":{"37":1,"63":2,"139":1}}],["events",{"0":{"37":1,"63":1},"2":{"22":1,"37":1,"43":1,"63":1,"66":1,"142":1,"199":1}}],["eventually",{"2":{"14":1}}],["everyday",{"2":{"116":1,"259":1}}],["everyone",{"2":{"100":1,"105":1,"107":1}}],["everything",{"2":{"17":1,"20":1,"92":1,"231":1,"315":1}}],["every",{"2":{"1":1,"10":1,"13":1,"14":1,"16":1,"18":1,"95":1,"103":1,"155":1,"184":1,"187":1,"236":5,"239":1,"240":1}}],["evolves",{"2":{"14":1}}],["economics",{"2":{"14":1}}],["emmamultilingualneural",{"2":{"358":1}}],["embedded",{"2":{"315":1,"316":1}}],["embeddings",{"2":{"206":1,"327":1}}],["embedding",{"0":{"229":1},"2":{"9":1,"116":1,"215":1,"216":1,"222":1,"224":2,"229":3,"230":1,"231":1,"317":4,"327":2,"328":1,"330":2,"335":1,"339":1}}],["embed",{"2":{"30":1}}],["empty",{"2":{"14":1,"81":1,"112":1,"116":1,"227":1,"235":1,"344":1}}],["emails",{"2":{"173":1,"178":2,"179":1,"180":1,"239":1,"240":2}}],["email",{"0":{"173":1,"174":1,"175":1,"177":1,"294":1},"1":{"174":1,"175":1,"176":2,"177":1,"178":2,"179":1,"180":1},"2":{"1":1,"7":1,"8":1,"39":2,"114":2,"174":5,"175":2,"176":3,"177":2,"178":3,"179":5,"180":3,"285":2,"294":4,"312":1,"323":1}}],["editor",{"2":{"188":1,"192":1,"196":1,"270":1}}],["edit",{"0":{"271":1},"2":{"18":1,"114":1,"127":1,"192":1,"209":1,"248":1,"266":1,"271":1,"274":2,"320":1,"331":1,"337":1}}],["editing",{"0":{"191":1},"1":{"192":1,"193":1},"2":{"8":1,"10":1,"158":1,"271":1,"326":1}}],["edge",{"0":{"356":1,"357":1},"1":{"357":1,"358":1,"359":1,"360":1},"2":{"9":1,"19":1,"116":1,"219":3,"230":2,"352":2,"353":1,"354":2,"355":1,"356":2,"357":2,"358":1,"359":2}}],["exchange",{"2":{"254":1}}],["exchanged",{"2":{"200":1}}],["exceptions",{"2":{"220":1}}],["except",{"2":{"92":1,"107":1}}],["existing",{"2":{"163":1,"167":1,"209":1,"257":1,"276":1}}],["exists",{"0":{"145":1},"2":{"274":1}}],["exist",{"2":{"135":1,"158":1,"161":1,"162":1}}],["extraction",{"2":{"326":1,"338":1,"346":1,"351":1}}],["extracted",{"2":{"170":1,"263":1}}],["extract",{"2":{"54":1,"208":1,"337":1}}],["extending",{"0":{"196":1}}],["extend",{"2":{"11":1,"264":1}}],["external",{"0":{"256":1},"2":{"8":1,"41":1,"95":1,"195":1,"196":1,"206":1,"233":1,"243":1,"317":1,"328":1}}],["exa",{"2":{"245":1}}],["exact",{"2":{"43":1,"162":1,"225":1,"227":1,"280":1}}],["examples",{"0":{"104":1,"268":1},"1":{"105":1,"106":1,"107":1,"108":1,"109":1},"2":{"161":1,"217":1,"236":1,"279":1,"280":1,"297":1,"303":1,"305":1}}],["example",{"2":{"43":1,"102":1,"230":1,"281":3,"296":1}}],["executable",{"2":{"198":1}}],["executing",{"2":{"158":1}}],["executions",{"2":{"235":1}}],["execution",{"0":{"241":1},"2":{"1":1,"8":1,"17":1,"114":2,"117":1,"184":1,"237":1,"242":1,"253":1,"293":1}}],["executes",{"2":{"198":1,"234":1,"241":1}}],["execute",{"2":{"18":1,"121":1,"155":1,"156":1,"182":1,"183":1}}],["expiration",{"2":{"323":1}}],["expires",{"2":{"87":1}}],["expression",{"2":{"235":1,"239":1,"242":1}}],["expressions",{"2":{"18":1,"233":1}}],["explain",{"2":{"265":1}}],["explanation",{"2":{"235":1}}],["explicitly",{"2":{"66":1,"94":2,"254":1,"255":1}}],["explicit",{"2":{"17":1,"19":1,"226":1,"287":1}}],["expand",{"2":{"161":1}}],["exposed",{"2":{"162":1,"202":1,"203":1,"224":1}}],["expose",{"2":{"160":1,"223":1,"272":1}}],["exposes",{"2":{"6":1,"116":1,"118":1,"226":1,"262":1}}],["exporting",{"2":{"168":1}}],["export",{"0":{"168":1,"169":1},"1":{"169":1,"170":1,"171":1},"2":{"114":1,"129":1,"169":1,"201":2,"314":1}}],["expect",{"2":{"254":1}}],["expensive",{"2":{"16":1}}],["experienced",{"2":{"19":1}}],["experience",{"2":{"13":1,"188":1}}],["env",{"2":{"198":1,"320":1}}],["environment",{"0":{"325":1},"2":{"1":1,"19":1,"23":1,"116":1,"123":1,"155":1,"157":1,"164":1,"172":1,"198":1,"266":1,"276":1,"319":2}}],["ensure",{"2":{"165":1}}],["ensures",{"2":{"155":1}}],["enabling",{"2":{"133":1,"140":1,"181":1,"243":1}}],["enables",{"2":{"50":1,"77":1,"126":1,"265":1,"273":1}}],["enabled",{"2":{"25":1,"45":1,"49":2,"55":1,"56":1,"66":2,"71":1,"82":1,"88":1,"90":1,"116":1,"117":1,"118":1,"147":2,"178":3,"183":1,"235":1,"237":1,"240":1,"296":3,"316":1}}],["enable",{"0":{"35":1,"61":1,"72":1,"273":1},"2":{"23":1,"24":1,"29":1,"31":1,"35":1,"36":1,"41":1,"44":1,"49":3,"55":1,"61":1,"63":1,"65":1,"72":1,"76":1,"81":1,"89":1,"117":1,"118":1,"138":1,"142":1,"143":2,"147":1,"161":1,"201":1,"273":1,"282":1,"303":2,"317":3,"334":1}}],["en",{"2":{"126":1,"296":2,"358":1}}],["engines",{"0":{"245":1},"2":{"243":1,"245":2,"325":1}}],["engine",{"2":{"116":1,"126":1,"247":2}}],["engineering",{"2":{"18":1}}],["encodes",{"2":{"317":1}}],["encoding",{"2":{"69":1,"70":1,"71":1,"316":1,"317":3,"323":1,"328":1,"334":1}}],["encountered",{"2":{"184":1}}],["encryption",{"2":{"70":1,"71":2,"141":1}}],["encrypted",{"2":{"69":1}}],["endpoints",{"2":{"217":1}}],["endpoint",{"2":{"81":1,"199":1,"218":1,"349":1}}],["ending",{"2":{"75":1}}],["end",{"2":{"23":1}}],["enough",{"2":{"14":1,"145":1}}],["entire",{"2":{"91":1,"95":1,"100":1,"102":1,"113":1}}],["entry",{"2":{"87":1,"259":1,"310":1}}],["entries",{"2":{"5":1,"153":1,"185":1,"209":1,"210":1,"213":1,"214":1,"307":1,"341":1}}],["enterprise",{"2":{"33":1,"39":3,"135":2}}],["enter",{"2":{"13":1,"34":1,"44":1,"161":2,"162":1,"208":1}}],["ok",{"2":{"184":1}}],["okay",{"2":{"14":1}}],["observing",{"2":{"254":1}}],["observation",{"2":{"253":1}}],["observe",{"2":{"129":1,"263":1}}],["obtain",{"2":{"41":1,"54":1}}],["older",{"2":{"144":1,"145":2,"153":1,"185":1,"210":1,"214":1,"266":1,"307":1}}],["old",{"2":{"118":1,"147":1,"185":1,"255":1,"256":1,"268":1,"287":1}}],["opus",{"2":{"358":1}}],["optimized",{"2":{"263":1}}],["options",{"2":{"160":1,"161":1,"296":2,"358":2}}],["option",{"2":{"54":2,"296":1}}],["optionally",{"2":{"100":1,"116":1,"210":1}}],["optional",{"0":{"50":1,"77":1,"89":1},"2":{"40":1,"49":1,"102":1,"112":1,"116":3,"117":1,"118":1,"126":4,"141":1,"160":1,"216":1,"235":1,"242":1,"316":1,"323":1}}],["opt",{"2":{"198":1}}],["openssl",{"2":{"320":1}}],["opensearch",{"2":{"317":2,"328":2,"334":1}}],["opens",{"2":{"310":1}}],["opening",{"2":{"263":1}}],["openviking",{"0":{"347":1,"348":1,"349":1,"350":1},"1":{"348":1,"349":1,"350":1,"351":1},"2":{"205":1,"339":1,"341":1,"347":1,"348":1,"349":2,"350":1,"351":2}}],["open",{"0":{"105":1,"107":1},"2":{"20":1,"23":1,"24":1,"30":1,"33":1,"34":1,"44":1,"48":1,"52":1,"56":1,"60":2,"65":1,"66":1,"70":1,"75":1,"77":1,"84":1,"87":1,"98":1,"99":1,"103":1,"121":1,"123":1,"128":1,"149":2,"161":1,"192":1,"200":1,"205":1,"218":1,"269":1,"309":1,"310":1,"336":1,"340":2,"345":1,"350":1,"353":1,"359":1}}],["openclaw",{"0":{"19":1},"2":{"19":1}}],["openai",{"0":{"221":1},"2":{"9":3,"217":2,"218":1,"219":6,"220":1,"221":1,"297":2,"317":1}}],["operational",{"2":{"212":1}}],["operation",{"2":{"171":1,"210":1,"279":1}}],["operations",{"0":{"10":1,"143":1,"157":1,"188":1,"201":1,"207":1},"1":{"158":1,"189":1,"190":1,"208":1,"209":1},"2":{"158":1,"194":1,"337":1,"346":2,"351":2}}],["operates",{"2":{"155":1,"326":1}}],["operate",{"2":{"11":1,"20":1}}],["oem",{"2":{"14":1}}],["os",{"2":{"14":1}}],["occasional",{"2":{"14":1}}],["outgoing",{"2":{"178":1,"180":1}}],["outbox",{"0":{"179":1},"2":{"114":1,"179":1,"180":1,"285":1,"294":2}}],["outbound",{"2":{"22":1,"26":1,"62":1,"69":1,"73":1}}],["outcome",{"2":{"97":1}}],["outside",{"2":{"39":1,"162":1}}],["output",{"2":{"26":1,"45":1,"46":1,"116":2,"198":1,"225":1,"226":1,"227":1,"228":1,"229":1,"254":1,"282":1,"305":1,"358":1}}],["out",{"2":{"14":1,"145":1,"317":1}}],["outward",{"2":{"6":1}}],["our",{"2":{"13":1,"14":1}}],["overlay",{"2":{"321":1}}],["overlapping",{"2":{"210":1}}],["over",{"2":{"13":1,"172":1,"199":1,"210":1,"358":1}}],["overview",{"0":{"13":1,"39":1,"114":1},"1":{"40":1,"41":1},"2":{"114":1,"313":1,"314":1}}],["oauth2",{"2":{"30":1}}],["oauth",{"0":{"200":1,"220":1},"1":{"221":1,"222":1},"2":{"10":1,"39":1,"62":1,"64":2,"114":1,"200":6,"217":1,"219":2,"221":1,"310":1,"314":1}}],["ongoing",{"2":{"254":1}}],["only",{"2":{"48":1,"92":4,"94":1,"99":1,"100":1,"102":2,"103":5,"106":1,"108":2,"109":1,"112":1,"116":1,"120":1,"129":1,"146":1,"160":1,"210":1,"219":1,"253":3,"254":1,"267":1,"275":2,"282":3,"317":1,"320":1,"327":1,"328":1,"330":1,"333":1}}],["online",{"2":{"20":1}}],["on",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"13":2,"14":1,"16":1,"17":1,"20":2,"23":1,"26":1,"40":1,"41":3,"42":1,"45":1,"48":1,"53":1,"54":1,"73":1,"75":1,"77":1,"87":2,"95":1,"108":1,"113":1,"129":1,"133":1,"135":1,"137":1,"145":1,"162":2,"180":1,"183":1,"190":1,"200":1,"202":1,"206":1,"229":1,"235":1,"247":1,"248":1,"251":1,"255":2,"257":1,"260":1,"263":1,"271":1,"287":1,"315":1,"317":2,"320":1,"324":1,"360":1}}],["once",{"2":{"7":1,"38":1,"48":1,"82":1,"87":1,"113":1,"123":1,"201":1,"202":1,"203":1,"244":1,"274":1,"337":1,"346":1,"351":1}}],["ones",{"2":{"145":1,"266":1}}],["one",{"0":{"319":1},"2":{"7":1,"20":1,"40":1,"68":1,"74":1,"87":1,"115":1,"124":1,"153":2,"161":2,"205":1,"210":1,"214":1,"216":2,"217":2,"231":1,"252":1,"263":1,"267":2,"273":1,"280":2,"281":1,"307":1,"326":1,"338":1,"340":1}}],["often",{"2":{"117":1,"183":1,"254":2}}],["offs",{"2":{"265":1}}],["off",{"0":{"333":1},"2":{"14":1,"183":1,"211":1,"273":1,"327":1,"330":1,"339":1}}],["official",{"0":{"40":1,"52":1,"58":1,"68":1,"69":1,"84":1,"141":1},"1":{"69":1,"70":1,"71":1,"72":1,"73":1},"2":{"1":1,"7":2,"22":1,"30":1,"37":1,"39":2,"40":2,"47":1,"68":2,"69":1,"70":1,"71":1,"72":1,"75":2,"135":5,"141":2,"312":1,"319":1}}],["of",{"2":{"5":1,"8":1,"13":2,"14":3,"18":1,"50":1,"55":1,"57":1,"74":1,"77":1,"95":2,"107":1,"115":1,"116":1,"129":1,"144":1,"154":1,"157":1,"159":1,"164":1,"167":1,"172":2,"179":2,"184":2,"186":2,"196":1,"198":2,"199":2,"205":1,"206":1,"212":1,"213":1,"221":1,"231":1,"235":3,"236":3,"239":1,"252":1,"253":2,"256":1,"262":1,"263":2,"267":1,"274":1,"277":2,"279":1,"281":1,"307":1,"316":1,"317":2,"323":1,"326":1,"328":1,"340":1,"342":1}}],["others",{"2":{"263":1,"316":1}}],["other",{"0":{"263":1},"2":{"4":1,"18":1,"108":1,"155":1,"212":1,"242":1,"245":1,"247":1,"251":1,"253":1}}],["orchestrated",{"2":{"315":1}}],["oriented",{"2":{"135":1,"221":1,"242":1,"253":1}}],["ordering",{"2":{"97":1,"314":1}}],["order",{"2":{"97":1,"101":1,"110":1,"266":1}}],["organized",{"2":{"352":1}}],["organize",{"2":{"260":1}}],["organization",{"2":{"23":1,"36":1,"79":1,"344":2}}],["org",{"2":{"54":1,"55":2}}],["or",{"2":{"1":1,"3":2,"6":1,"18":2,"23":1,"25":1,"33":1,"39":1,"41":1,"42":1,"43":1,"54":1,"56":1,"57":1,"66":1,"70":1,"78":1,"80":1,"82":1,"87":1,"91":2,"94":1,"97":1,"99":2,"100":2,"103":1,"105":1,"106":1,"107":1,"108":1,"110":1,"112":2,"117":1,"118":2,"120":1,"124":2,"126":3,"129":2,"130":1,"138":2,"144":1,"147":1,"150":1,"151":3,"153":2,"155":2,"158":1,"159":1,"161":3,"162":1,"163":1,"165":1,"168":1,"171":1,"174":1,"180":1,"182":1,"183":1,"184":2,"185":1,"186":1,"190":2,"194":1,"196":1,"199":1,"201":3,"205":1,"206":1,"209":1,"210":2,"212":1,"214":1,"215":1,"216":2,"217":1,"218":1,"223":1,"225":1,"226":1,"229":1,"230":1,"233":1,"244":1,"251":1,"255":1,"256":2,"257":1,"259":1,"264":1,"265":2,"266":3,"268":1,"273":1,"274":1,"278":1,"279":2,"287":1,"290":1,"291":1,"292":1,"293":1,"296":7,"297":3,"298":1,"299":1,"300":1,"301":1,"304":1,"307":1,"310":1,"311":1,"315":1,"319":1,"320":3,"328":1,"330":1,"337":1,"339":1,"341":1,"347":1}}],["owner",{"2":{"92":1,"94":1,"97":1,"106":1,"215":1,"282":3,"296":1,"297":2,"298":1,"299":1,"300":1,"301":1,"303":5}}],["own",{"2":{"1":3,"4":1,"18":3,"111":1,"116":1,"117":1,"155":1,"178":1,"187":1,"194":1,"196":1,"245":1,"251":1,"252":1,"271":1,"274":1,"339":1}}],["lt",{"2":{"266":1,"280":3,"297":6,"298":1,"299":1,"300":1,"301":2,"303":8,"305":1}}],["learn",{"2":{"313":1}}],["leave",{"2":{"227":1,"235":1}}],["leaving",{"2":{"41":1,"191":1}}],["legacy",{"2":{"266":2,"268":1,"274":1,"276":1,"277":1}}],["levels",{"2":{"226":1}}],["level",{"0":{"284":1},"2":{"61":2,"64":1,"65":1,"95":2,"102":1,"116":1,"210":1,"236":1,"279":1,"280":1,"290":1,"323":1}}],["left",{"2":{"28":1,"34":1,"112":1}}],["less",{"2":{"20":1,"254":1}}],["lets",{"2":{"92":1,"102":1,"129":1,"228":1}}],["let",{"2":{"3":1}}],["lightweight",{"2":{"317":1,"327":1}}],["lighter",{"2":{"19":1,"317":1}}],["libraries",{"2":{"163":1}}],["linux",{"2":{"324":1}}],["line",{"2":{"161":1,"179":1,"198":1,"321":1}}],["link",{"2":{"140":1,"174":1}}],["linked",{"2":{"77":1,"110":1,"222":1,"291":2}}],["links",{"2":{"30":1,"51":1,"78":1,"124":1,"314":1}}],["living",{"2":{"115":1}}],["lived",{"2":{"41":1}}],["live",{"2":{"14":1,"103":1,"266":1,"280":1}}],["listen",{"2":{"323":1}}],["listed",{"2":{"106":1,"267":1}}],["lists",{"2":{"202":1,"259":1,"304":1,"328":1}}],["list",{"2":{"91":1,"107":1,"137":1,"151":1,"162":2,"166":1,"167":1,"189":1,"198":1,"202":1,"209":1,"237":2,"253":1,"279":2,"280":1,"285":1,"297":4,"298":2,"299":2,"300":2,"301":2,"303":3,"304":2,"305":4,"317":1,"330":1,"344":1,"349":1}}],["limit",{"2":{"152":1,"227":1,"235":1,"242":1}}],["limited",{"2":{"87":1}}],["limitations",{"2":{"46":1}}],["lifecycle",{"0":{"158":1},"2":{"113":1,"114":1,"157":1,"172":1}}],["life",{"2":{"14":1}}],["likely",{"2":{"254":1}}],["like",{"0":{"265":1},"2":{"1":1,"6":1,"14":1,"17":1,"18":1,"20":2,"37":1,"124":1,"129":1,"158":1,"174":1,"244":1,"254":3,"276":1}}],["llm",{"2":{"19":1,"116":1,"183":1,"278":1}}],["llms",{"2":{"14":1,"224":1}}],["ll",{"2":{"14":1}}],["launch",{"2":{"158":1}}],["languages",{"2":{"192":1,"317":1,"328":1,"354":1,"356":1,"358":1}}],["language",{"2":{"114":1,"116":2,"235":1,"239":1,"242":1,"296":3,"317":1,"358":1}}],["last",{"2":{"18":1,"259":2,"292":1}}],["layered",{"2":{"280":1}}],["layers",{"2":{"119":1,"352":1}}],["layer",{"2":{"14":1,"15":1}}],["later",{"2":{"92":1,"163":1,"164":1,"274":1}}],["latest",{"2":{"21":1,"185":1,"189":1,"279":1,"290":3,"319":1,"324":1,"325":2}}],["late",{"2":{"14":1}}],["latency",{"2":{"13":1,"145":1}}],["large",{"2":{"5":1,"153":1,"305":1}}],["lark",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1},"2":{"1":1,"7":1,"18":1,"33":1,"39":1,"135":1,"312":1}}],["loop",{"2":{"288":1}}],["lookup",{"2":{"317":1}}],["looks",{"0":{"265":1},"2":{"266":1}}],["looked",{"2":{"14":1}}],["locations",{"2":{"266":1}}],["localhost",{"2":{"322":3}}],["locally",{"2":{"317":1,"328":1,"334":1}}],["locale",{"2":{"116":1,"123":1,"126":2}}],["local",{"0":{"198":1},"2":{"15":1,"16":1,"17":1,"19":1,"20":1,"169":1,"170":1,"190":2,"198":1,"255":2,"287":2}}],["losing",{"2":{"252":1,"273":1}}],["lost",{"2":{"122":1}}],["load",{"2":{"185":2}}],["loaded",{"2":{"18":1,"275":1,"285":1}}],["logging",{"2":{"323":1}}],["logs",{"0":{"151":1,"184":1,"185":1},"1":{"185":1},"2":{"114":3,"117":1,"118":1,"185":1,"186":1,"285":2,"293":3,"324":2}}],["log",{"2":{"34":1,"48":1,"80":1,"151":1,"172":1,"179":1,"184":1,"185":1,"323":1}}],["login",{"0":{"140":1},"2":{"7":1,"39":1,"40":1,"41":1,"54":3,"68":1,"87":3,"88":1,"135":2,"322":1}}],["lower",{"2":{"210":1}}],["lowest",{"2":{"97":1}}],["low",{"2":{"14":1,"116":1,"210":1,"226":1,"296":1}}],["longer",{"2":{"14":1,"127":1,"209":1,"256":1,"261":1,"331":1}}],["long",{"0":{"5":1},"2":{"1":2,"5":1,"13":1,"16":1,"20":1,"41":1,"55":1,"131":1,"144":1,"146":1,"153":1,"154":1,"184":1,"204":1,"206":1,"210":1,"214":1,"215":1,"256":1,"288":1,"307":2,"312":1,"314":1,"338":1}}],["tutorial",{"2":{"75":1}}],["turns",{"2":{"144":1,"145":2,"153":1,"273":1,"307":1}}],["turning",{"2":{"14":1}}],["turn",{"2":{"13":1,"18":1,"147":1,"288":1}}],["typical",{"0":{"268":1},"2":{"124":1,"151":1,"217":1,"219":1,"223":1}}],["typing",{"2":{"49":1,"51":1,"89":2,"90":1}}],["typed",{"2":{"276":1}}],["type",{"2":{"54":3,"95":1,"100":3,"102":2,"108":2,"176":1,"198":1,"199":1,"201":1,"206":1,"217":1,"218":3,"219":2,"221":1,"222":1,"224":1,"253":2,"255":1,"256":1,"257":1,"259":2,"266":1,"287":1,"329":1,"343":1,"348":1,"352":1,"353":1,"357":1}}],["types",{"0":{"95":1,"197":1,"219":1,"224":1,"253":1},"1":{"198":1,"199":1,"254":1},"2":{"6":1,"9":1,"51":1,"63":1,"91":1,"219":1,"220":1,"224":1,"253":2,"254":1,"313":1,"340":1}}],["timing",{"2":{"242":1}}],["timezone",{"2":{"112":3,"114":1,"116":4,"123":1,"126":2,"236":2,"323":2}}],["timeout",{"2":{"55":2,"323":1}}],["timestamp",{"2":{"179":1}}],["timestamps",{"2":{"167":1}}],["times",{"2":{"18":1,"235":1}}],["time",{"0":{"14":1,"244":1},"2":{"3":1,"14":3,"83":1,"119":1,"130":1,"151":1,"158":1,"159":1,"172":1,"184":1,"210":1,"211":1,"243":1,"250":1}}],["titles",{"2":{"116":1}}],["title",{"2":{"114":1,"116":1,"259":1,"260":1}}],["tiny",{"2":{"14":1}}],["t",{"2":{"14":6,"16":2,"158":1,"181":1,"317":1}}],["truncated",{"2":{"305":1}}],["true",{"2":{"240":1,"296":3,"325":1}}],["trying",{"2":{"214":2}}],["tree",{"2":{"188":1}}],["treats",{"2":{"281":1}}],["treated",{"2":{"254":1}}],["treat",{"2":{"19":1,"120":1}}],["troubleshooting",{"2":{"180":1,"212":1}}],["triggering",{"2":{"233":1}}],["triggers",{"2":{"118":1,"147":1,"235":1,"241":1,"253":1,"262":1,"307":1}}],["trigger",{"2":{"106":1,"148":1,"153":1,"180":1,"182":1,"183":1,"214":1,"242":1,"263":1,"285":1}}],["triggered",{"2":{"6":1,"154":1,"184":1,"234":1,"253":1,"263":1}}],["translate",{"2":{"239":1}}],["transport",{"2":{"199":1}}],["transfer",{"2":{"190":1}}],["track",{"2":{"263":1}}],["tracked",{"2":{"180":1}}],["tracks",{"2":{"152":1,"172":1}}],["traditional",{"2":{"176":1}}],["trade",{"2":{"14":1,"265":1}}],["trail",{"2":{"151":1}}],["trapped",{"2":{"16":1}}],["travels",{"2":{"14":1}}],["tag",{"2":{"319":1,"325":3}}],["taking",{"2":{"288":1}}],["takes",{"2":{"113":1,"267":1}}],["take",{"2":{"14":1,"97":1,"322":1}}],["tavily",{"2":{"245":1}}],["target",{"2":{"41":1,"51":1,"95":1,"309":1,"310":1}}],["tab",{"0":{"114":1,"116":1,"117":1,"118":1,"121":1},"2":{"31":1,"37":1,"41":1,"49":1,"55":1,"65":1,"76":1,"81":1,"86":1,"91":1,"92":1,"94":1,"98":1,"99":1,"110":1,"114":1,"115":4,"116":1,"117":2,"118":1,"119":2,"121":1,"122":1,"128":1,"129":1,"134":1,"147":1,"151":1,"153":1,"157":1,"159":1,"160":1,"161":1,"163":1,"168":1,"177":1,"179":1,"183":1,"184":1,"187":1,"194":1,"196":1,"197":1,"205":2,"207":1,"210":1,"211":1,"212":1,"213":1,"214":1,"237":1,"249":1,"264":1,"309":2,"310":2,"336":1,"337":1,"338":1,"340":2,"345":1,"350":1,"353":1,"359":1}}],["tabs",{"2":{"10":1,"113":1,"115":1,"121":1,"313":1}}],["talks",{"2":{"216":1}}],["talk",{"2":{"14":1}}],["tasks",{"0":{"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1},"2":{"18":2,"111":1,"114":1,"116":1,"117":1,"159":2,"181":1,"186":1,"203":1,"233":1,"242":1,"256":1,"263":1,"278":1,"285":1,"303":1}}],["task",{"2":{"6":2,"173":1,"183":1,"184":1,"233":1,"235":3,"242":1,"251":1,"253":2,"263":1,"265":1}}],["tts",{"0":{"352":1,"356":1,"357":1},"1":{"353":1,"354":1,"355":1,"357":1,"358":1,"359":1,"360":1},"2":{"8":1,"9":2,"114":1,"115":1,"116":5,"216":1,"219":1,"224":2,"230":2,"231":1,"232":2,"352":7,"353":2,"354":1,"355":1,"356":1,"357":1,"359":3}}],["together",{"2":{"259":1}}],["toggle",{"2":{"143":1,"183":1,"201":1,"319":1}}],["today",{"2":{"235":1,"281":1,"303":1}}],["total",{"2":{"213":1,"235":1,"262":1}}],["toml",{"2":{"192":1,"319":1,"320":4,"321":2,"322":1,"323":1,"325":2,"334":2,"335":2}}],["topics",{"2":{"256":1}}],["topic",{"2":{"251":1,"260":1}}],["top",{"0":{"284":1},"2":{"97":2,"101":1,"107":1,"235":1,"236":1,"279":1,"280":1,"281":1,"303":1}}],["tokens",{"2":{"41":2,"138":1,"262":1,"278":1,"290":1}}],["token",{"0":{"43":1,"62":1},"2":{"28":3,"31":1,"40":1,"43":5,"44":1,"54":3,"55":2,"61":4,"62":1,"64":3,"65":4,"69":1,"70":1,"71":1,"75":3,"76":1,"87":1,"118":1,"141":1,"145":1,"147":1,"151":1,"200":3,"217":1,"218":1,"222":1,"262":1,"285":1,"292":1,"317":1,"323":1,"328":1}}],["to",{"0":{"11":1,"12":1,"19":1,"30":1,"63":1,"64":1,"66":1,"128":1,"152":1,"249":1,"263":1,"336":1,"345":1,"350":1,"359":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"6":1,"13":1,"14":2,"16":2,"18":3,"19":1,"20":1,"23":2,"24":2,"25":1,"27":2,"28":3,"29":1,"30":3,"31":1,"32":1,"33":1,"34":2,"35":1,"36":1,"37":2,"38":2,"39":1,"41":2,"42":1,"43":3,"44":2,"45":1,"47":2,"48":2,"49":1,"50":3,"53":3,"55":1,"56":1,"57":1,"59":2,"60":2,"61":1,"62":1,"64":1,"65":1,"66":3,"70":1,"74":1,"75":2,"76":1,"77":2,"78":1,"79":2,"80":2,"81":1,"82":2,"85":2,"86":1,"87":1,"88":1,"91":2,"96":1,"97":2,"98":1,"100":3,"101":3,"102":2,"103":2,"105":1,"106":1,"107":1,"108":1,"109":1,"110":2,"112":1,"113":1,"114":1,"115":2,"116":5,"118":1,"119":1,"121":2,"122":3,"123":3,"125":1,"126":1,"128":2,"130":1,"131":1,"132":2,"133":1,"139":2,"140":1,"142":1,"144":1,"145":2,"147":3,"150":1,"151":1,"152":2,"154":3,"155":1,"158":2,"159":1,"160":4,"161":1,"162":2,"163":1,"164":1,"166":1,"167":2,"169":1,"171":2,"172":1,"173":1,"174":3,"176":1,"178":1,"179":1,"180":3,"181":2,"182":1,"183":1,"184":1,"185":1,"189":1,"190":3,"191":1,"192":3,"193":1,"194":2,"195":2,"196":1,"198":1,"199":1,"200":2,"201":2,"202":2,"203":1,"204":1,"208":1,"210":2,"211":3,"212":1,"213":1,"214":3,"215":1,"216":3,"222":2,"223":1,"224":1,"226":1,"227":1,"228":1,"230":1,"231":2,"232":3,"233":1,"234":3,"235":2,"237":2,"239":2,"240":1,"241":1,"243":3,"244":1,"245":1,"247":2,"249":2,"250":2,"251":1,"252":1,"253":3,"254":3,"255":4,"256":3,"257":1,"260":1,"262":1,"263":1,"269":1,"271":1,"273":1,"274":2,"276":1,"277":1,"278":1,"279":2,"280":1,"281":1,"282":1,"287":4,"288":1,"307":1,"309":1,"310":2,"313":1,"314":1,"315":2,"317":4,"319":1,"320":1,"324":1,"325":5,"328":1,"329":1,"330":1,"336":2,"337":2,"338":1,"342":1,"343":1,"344":1,"345":2,"346":1,"348":1,"350":2,"351":1,"352":1,"353":2,"355":1,"357":1,"358":2,"360":2}}],["took",{"2":{"184":1}}],["toolbar",{"2":{"188":1}}],["toolkit",{"2":{"162":1}}],["tool",{"0":{"202":1},"2":{"8":1,"17":1,"162":1,"195":1,"202":1,"224":1,"225":1,"226":1,"239":1,"244":1,"264":1,"265":1,"288":1,"310":1,"312":1,"314":1}}],["tools",{"0":{"8":1},"2":{"1":1,"4":1,"14":1,"19":1,"111":1,"123":1,"128":1,"129":1,"158":1,"163":1,"182":1,"186":1,"194":1,"196":1,"202":4,"203":2,"226":1,"234":1,"241":1,"265":1}}],["too",{"2":{"5":1,"14":3,"99":2,"153":1,"256":1,"288":1}}],["two",{"2":{"5":1,"40":1,"119":1,"135":1,"148":1,"153":1,"174":1,"214":1,"220":1,"238":1,"254":1,"276":1,"279":1}}],["temporarily",{"2":{"273":1}}],["templates",{"2":{"308":1,"311":1,"314":1}}],["template",{"0":{"310":1},"2":{"8":1,"196":1,"319":1}}],["tech",{"2":{"235":1,"303":1}}],["testing",{"0":{"360":1},"2":{"164":1}}],["test",{"0":{"72":1},"2":{"72":1,"103":1,"273":1,"353":2,"360":1}}],["team",{"2":{"19":1}}],["textarea",{"2":{"208":1}}],["text",{"0":{"192":1},"2":{"14":1,"26":1,"32":1,"42":1,"45":1,"46":1,"51":1,"57":2,"83":1,"90":1,"116":1,"146":1,"150":2,"151":1,"192":1,"209":1,"216":1,"224":1,"254":1,"279":2,"280":1,"281":2,"291":1,"296":1,"297":1,"303":1,"305":1,"317":1,"323":1,"328":1,"352":2}}],["tension",{"2":{"13":1}}],["telegram",{"0":{"74":1,"75":1,"256":1},"1":{"75":1,"76":1,"77":1,"78":1},"2":{"1":1,"7":1,"18":1,"39":1,"74":2,"75":3,"76":1,"77":3,"95":2,"102":1,"108":2,"109":2,"114":1,"133":1,"135":2,"235":1,"240":1,"255":1,"281":1,"287":1,"312":1}}],["terms",{"2":{"231":1}}],["terminal",{"0":{"121":1},"2":{"114":2,"121":2}}],["term",{"0":{"5":1},"2":{"1":1,"5":1,"131":1,"144":1,"146":1,"153":1,"154":1,"204":1,"206":1,"210":1,"214":1,"215":1,"307":1,"314":1,"317":1,"338":1}}],["those",{"2":{"13":1,"216":1,"266":1}}],["threshold",{"2":{"118":2,"147":3}}],["threaded",{"2":{"103":1}}],["thread",{"2":{"62":1,"92":1,"100":3,"102":3,"103":1,"110":1,"119":1,"251":1,"291":1}}],["threads",{"2":{"14":1,"39":1,"59":1,"67":1,"92":1,"254":1,"259":1}}],["three",{"2":{"13":1,"95":1,"224":1,"231":1,"326":1,"339":1,"341":1,"352":1}}],["through",{"2":{"1":1,"5":1,"6":1,"9":1,"18":2,"39":1,"41":1,"47":1,"69":1,"74":1,"113":1,"120":1,"123":1,"160":1,"206":1,"219":1,"221":1,"224":1,"266":1,"342":1,"346":1,"351":1}}],["thing",{"2":{"14":1,"20":1}}],["thinking",{"2":{"242":1}}],["thinks",{"2":{"78":1}}],["think",{"2":{"6":1,"14":1,"182":1,"231":1}}],["this",{"2":{"5":1,"14":2,"21":1,"28":1,"33":1,"37":1,"42":1,"54":2,"60":1,"68":2,"73":2,"74":1,"75":1,"94":1,"95":1,"97":1,"103":1,"110":1,"117":1,"122":2,"125":1,"129":1,"139":2,"144":1,"147":1,"150":1,"152":1,"155":1,"160":2,"162":1,"164":1,"166":1,"171":1,"172":1,"182":1,"183":1,"187":1,"198":1,"199":1,"206":1,"210":2,"211":1,"212":1,"213":1,"218":1,"221":1,"228":1,"230":1,"233":1,"235":1,"237":1,"239":1,"252":1,"253":1,"254":1,"255":1,"256":2,"260":1,"266":1,"267":2,"273":1,"280":1,"288":1,"291":1,"307":2,"320":1,"321":1,"322":1,"329":1,"343":1,"348":1}}],["than",{"2":{"1":1,"9":1,"19":1,"120":1,"152":1,"210":1,"317":2,"328":1}}],["that",{"2":{"1":1,"4":1,"6":1,"13":1,"14":8,"15":1,"20":4,"23":2,"39":1,"40":3,"43":2,"45":1,"66":1,"72":1,"77":1,"94":1,"103":1,"109":1,"111":1,"114":1,"116":2,"118":1,"119":1,"128":1,"133":1,"141":1,"145":3,"147":1,"151":1,"182":1,"184":1,"186":1,"194":1,"200":1,"209":1,"212":1,"215":1,"216":1,"222":1,"227":1,"228":1,"229":1,"230":1,"235":1,"239":1,"244":1,"254":1,"264":1,"267":1,"272":2,"274":1,"275":2,"278":1,"291":1,"309":1,"310":1,"317":1,"336":1,"338":1,"340":1,"342":1,"347":2}}],["these",{"2":{"44":1,"62":1,"63":1,"92":1,"115":2,"153":1,"194":1,"202":1,"203":1,"219":1,"263":1,"266":1,"267":1}}],["their",{"2":{"16":1,"18":2,"101":1,"167":1,"202":1,"237":1}}],["they",{"2":{"16":2,"57":1,"254":1,"259":1,"263":1,"265":1,"266":1,"278":2}}],["then",{"0":{"99":1},"2":{"14":1,"34":1,"116":1,"196":1,"234":1,"269":1,"320":1,"352":1}}],["there",{"2":{"14":1,"212":1}}],["the",{"0":{"12":1,"30":1,"56":1,"64":1,"66":1,"70":1,"71":1,"87":1,"103":1,"115":1,"149":1,"156":1,"239":1,"240":1,"257":1,"269":1,"358":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"1":1,"3":2,"5":3,"6":2,"7":2,"8":1,"10":2,"11":1,"13":4,"14":12,"16":1,"17":2,"18":3,"19":3,"20":2,"21":1,"22":2,"23":5,"24":3,"25":4,"28":2,"29":1,"30":3,"31":1,"33":1,"34":2,"35":1,"36":1,"37":3,"38":3,"39":4,"40":3,"41":7,"43":6,"44":5,"45":2,"48":3,"49":1,"50":2,"53":1,"54":4,"55":5,"56":2,"57":1,"60":4,"61":3,"62":2,"63":2,"64":6,"65":2,"66":10,"68":2,"69":1,"70":6,"71":5,"72":4,"74":1,"75":3,"76":3,"77":4,"78":4,"80":2,"81":4,"82":3,"86":1,"87":5,"88":3,"91":1,"92":3,"94":3,"95":1,"96":4,"97":5,"99":4,"100":4,"101":2,"103":2,"106":2,"107":3,"108":1,"109":3,"110":3,"112":8,"114":2,"115":6,"116":20,"117":4,"118":3,"119":5,"120":3,"121":4,"122":5,"123":3,"124":1,"125":4,"126":3,"128":5,"129":4,"130":3,"134":2,"135":2,"137":5,"138":2,"140":3,"141":4,"142":3,"143":3,"144":2,"145":5,"146":4,"147":9,"148":1,"149":4,"150":1,"151":7,"152":7,"153":1,"155":2,"156":3,"157":3,"158":6,"159":8,"160":5,"161":3,"162":11,"163":8,"164":3,"165":2,"166":4,"167":1,"168":1,"169":2,"170":2,"171":4,"172":3,"175":2,"176":4,"177":2,"178":7,"179":7,"180":3,"181":1,"182":2,"183":9,"184":6,"185":2,"186":4,"187":2,"188":1,"189":4,"190":3,"191":3,"192":4,"193":1,"194":3,"195":1,"196":3,"197":2,"198":3,"199":3,"200":8,"201":3,"202":7,"203":6,"205":5,"206":5,"207":2,"208":2,"209":1,"210":4,"211":6,"212":7,"213":3,"214":1,"215":6,"216":2,"217":3,"218":6,"221":3,"222":4,"223":4,"224":1,"225":3,"227":2,"229":2,"230":1,"234":2,"235":10,"236":3,"237":4,"239":4,"240":2,"241":9,"243":1,"245":2,"247":5,"248":5,"249":4,"250":3,"251":1,"252":3,"253":9,"254":8,"255":6,"256":6,"257":2,"259":6,"262":9,"263":5,"264":1,"265":6,"266":4,"267":5,"268":6,"270":3,"271":1,"272":2,"273":1,"274":3,"275":4,"276":2,"278":3,"279":6,"280":4,"281":1,"282":1,"284":1,"285":1,"287":5,"288":4,"290":6,"291":2,"292":1,"293":1,"294":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1,"304":1,"305":2,"307":4,"309":5,"310":4,"313":1,"314":1,"315":4,"316":1,"317":11,"319":8,"320":1,"321":3,"323":2,"324":1,"325":3,"326":3,"328":4,"329":2,"330":1,"334":3,"335":2,"336":5,"337":3,"338":1,"339":3,"340":5,"341":1,"342":1,"343":2,"344":1,"345":4,"346":2,"348":2,"349":1,"350":4,"351":2,"352":3,"353":7,"355":1,"357":4,"358":1,"359":3,"360":3}}],["themselves",{"2":{"153":1}}],["them",{"2":{"1":1,"5":1,"115":1,"190":1,"201":2,"206":1,"257":1,"264":3,"276":1,"277":1}}],["wrote",{"2":{"14":1}}],["writes",{"2":{"270":1}}],["write",{"2":{"4":1,"61":1,"62":3,"178":1,"194":1,"262":1,"264":1,"265":1,"282":1,"290":1,"291":2}}],["way",{"2":{"180":1,"196":1,"280":1,"287":1,"315":1}}],["ways",{"2":{"148":1,"238":1,"276":1}}],["warning",{"2":{"122":1}}],["walks",{"2":{"74":1}}],["want",{"2":{"16":2,"20":1,"30":1,"43":1,"60":1,"62":1,"66":1,"103":1,"144":1,"151":1,"160":1,"163":1,"171":1,"210":1,"211":1,"216":1,"221":1,"222":1,"223":1,"255":1,"256":2,"273":1,"274":2,"276":1,"287":1,"288":1,"290":1,"307":1,"310":1}}],["wanted",{"2":{"14":2}}],["wasn",{"2":{"14":1}}],["was",{"2":{"14":1,"179":1,"184":1,"259":1,"291":1}}],["wait",{"2":{"14":1}}],["worse",{"2":{"14":1}}],["world",{"2":{"13":1,"39":1}}],["works",{"0":{"328":1},"2":{"162":1,"255":1,"317":1,"326":1}}],["workspaces",{"0":{"4":1},"2":{"39":1,"312":1}}],["workspace",{"0":{"64":1,"156":1},"2":{"1":1,"4":2,"8":1,"39":1,"60":1,"64":2,"79":1,"82":1,"135":1,"194":1,"319":2,"321":1,"323":1,"344":2}}],["working",{"2":{"162":1,"198":1,"212":1}}],["workflow",{"0":{"277":1},"2":{"99":1,"219":1,"221":1,"314":1}}],["workflows",{"2":{"3":1,"13":1,"39":1,"221":1,"265":1,"326":1}}],["work",{"2":{"6":1,"8":1,"66":1,"103":1,"253":1,"263":1,"278":1,"281":1}}],["width",{"2":{"126":2}}],["will",{"2":{"20":1,"23":1,"37":1,"48":1,"50":1,"56":1,"71":1,"75":1,"77":1,"82":1,"87":1,"97":1,"112":1,"122":1,"139":1,"145":1,"166":1,"200":1,"202":1,"203":1,"205":1,"239":1,"250":2,"256":1,"267":1,"319":1,"320":1,"336":1,"346":1,"351":1}}],["window",{"0":{"152":1,"227":1},"2":{"5":1,"87":1,"116":1,"145":1,"147":1,"152":1,"225":1,"227":2,"251":1,"262":1}}],["within",{"2":{"18":1,"79":1,"100":1,"155":1,"156":1,"189":1,"266":1}}],["without",{"2":{"4":1,"10":1,"14":2,"138":1,"155":1,"171":1,"191":1,"201":1,"205":1,"233":1,"251":1,"252":1,"255":1,"256":1,"273":2,"276":1,"287":1,"314":1,"317":2,"320":1,"327":1}}],["with",{"0":{"99":1,"106":1,"107":1,"194":1,"255":1},"1":{"256":1,"257":1},"2":{"1":1,"4":2,"6":2,"10":2,"13":2,"14":1,"15":1,"17":1,"18":3,"20":1,"27":1,"32":1,"33":2,"39":4,"45":1,"47":1,"48":1,"51":1,"54":1,"57":1,"61":2,"64":1,"66":1,"75":1,"77":1,"79":1,"83":1,"85":1,"90":1,"91":1,"94":1,"96":2,"103":1,"107":1,"108":2,"109":1,"111":1,"115":1,"126":1,"129":1,"130":1,"131":1,"132":1,"140":1,"145":1,"161":1,"167":1,"172":1,"178":1,"181":1,"188":1,"190":1,"191":1,"202":1,"211":1,"212":1,"219":2,"229":1,"236":2,"241":1,"252":1,"253":1,"262":1,"265":1,"267":1,"268":2,"272":1,"274":1,"277":1,"282":2,"310":1,"312":1,"315":1,"316":1,"317":1,"319":2,"320":2,"324":1,"326":3,"328":2,"334":1,"337":1,"339":2,"341":1,"353":1,"355":1}}],["which",{"2":{"50":1,"77":1,"149":1,"206":1,"210":1,"226":1,"234":1,"262":1,"275":1,"328":1}}],["while",{"2":{"5":1,"14":1,"51":1,"89":1,"90":1,"222":1,"317":1,"322":1}}],["whose",{"2":{"97":1,"228":1}}],["who",{"2":{"50":1,"77":1,"91":1,"160":1,"282":1,"321":1}}],["whole",{"2":{"10":1}}],["why",{"0":{"16":1,"145":1},"2":{"14":1,"291":1,"317":1}}],["whether",{"2":{"149":1,"151":1,"159":1,"179":1,"184":1,"213":1,"235":1,"254":1,"291":1}}],["where",{"0":{"11":1,"266":1},"2":{"6":1,"10":1,"11":1,"13":1,"14":1,"19":2,"60":1,"66":1,"99":1,"103":1,"113":1,"162":1,"214":1,"224":1,"257":1,"263":1,"313":1}}],["when",{"2":{"5":1,"14":2,"17":1,"55":1,"71":1,"87":1,"90":1,"92":1,"94":1,"99":1,"100":1,"103":1,"110":3,"116":1,"119":1,"128":1,"129":1,"147":2,"151":3,"153":2,"160":1,"163":1,"171":1,"172":1,"181":1,"184":1,"202":1,"206":1,"210":1,"211":1,"218":2,"221":1,"223":1,"225":1,"227":1,"228":1,"234":1,"235":2,"241":1,"250":1,"252":1,"253":5,"254":2,"256":1,"259":1,"263":1,"265":1,"273":1,"274":1,"279":1,"288":1,"290":1,"291":1,"305":1,"307":1,"317":1,"319":1,"321":1,"344":1,"357":1}}],["what",{"0":{"1":1,"2":1,"15":1,"103":1,"146":1,"265":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"6":1,"11":1,"13":2,"14":1,"117":1,"214":1,"235":1,"254":1,"263":1,"288":1,"317":1}}],["week",{"2":{"236":1}}],["weixin",{"2":{"40":1}}],["weighted",{"2":{"317":1}}],["weights",{"2":{"317":2,"328":1}}],["weight",{"2":{"14":1}}],["wework",{"0":{"79":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1},"2":{"39":1,"135":1}}],["were",{"2":{"14":1,"151":1,"172":1,"275":1}}],["we",{"2":{"13":2,"14":2,"17":1,"19":2,"20":2}}],["webm",{"2":{"358":1}}],["webp",{"2":{"193":1}}],["websites",{"2":{"124":1,"129":1}}],["websocket",{"2":{"41":1,"81":2,"82":1}}],["webhook",{"0":{"37":1,"139":1,"141":1},"2":{"7":1,"24":1,"37":2,"39":1,"40":1,"41":1,"68":1,"69":1,"70":1,"71":1,"135":3,"139":2,"141":1,"142":1}}],["web",{"0":{"257":1},"2":{"1":1,"6":1,"7":1,"8":2,"10":1,"24":1,"31":1,"39":1,"44":1,"49":1,"50":1,"55":1,"58":1,"65":1,"70":1,"76":1,"77":1,"81":1,"86":1,"114":1,"116":2,"152":1,"160":1,"191":1,"216":1,"227":1,"241":1,"243":1,"245":1,"254":1,"255":2,"257":1,"259":1,"278":1,"287":2,"309":1,"310":1,"312":1,"315":1,"316":3,"322":1,"323":2}}],["wechatoa",{"2":{"40":1}}],["wechat",{"0":{"40":2,"68":1,"71":1,"85":1,"86":1,"140":1,"141":1},"1":{"69":1,"70":1,"71":1,"72":1,"73":1,"86":1,"87":1,"88":1,"89":1,"90":1},"2":{"1":2,"7":4,"39":2,"40":4,"68":2,"69":2,"70":1,"71":3,"85":2,"86":1,"87":2,"88":1,"114":1,"135":7,"140":2,"141":3,"312":2}}],["wecom",{"0":{"79":1,"80":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1},"2":{"1":1,"7":1,"39":2,"79":2,"80":1,"81":2,"82":2,"84":2,"114":1,"135":2,"312":1}}],["icon",{"2":{"259":1}}],["ignored",{"2":{"275":1}}],["ignore",{"2":{"126":1}}],["irreversible",{"2":{"122":1}}],["io",{"2":{"43":1}}],["idf",{"2":{"317":1}}],["ideas",{"2":{"279":1}}],["identifier",{"2":{"54":1,"81":1,"159":1,"190":1,"225":1}}],["identity",{"0":{"50":1,"77":1},"2":{"44":1,"50":2,"77":3,"95":2,"100":2,"106":1,"109":1,"110":1,"267":1,"285":1,"291":2,"305":1}}],["identities",{"2":{"3":1,"91":1,"107":1}}],["ids",{"2":{"41":1}}],["id",{"2":{"34":1,"37":1,"40":1,"54":2,"55":2,"56":1,"69":1,"70":1,"80":1,"81":1,"100":4,"102":4,"120":1,"126":1,"159":1,"201":1,"209":1,"223":1,"225":1,"240":1,"296":2,"297":2,"344":4,"358":1}}],["if",{"2":{"14":1,"20":1,"32":1,"36":1,"56":1,"62":1,"66":2,"69":2,"70":1,"81":1,"87":1,"97":1,"103":1,"112":1,"115":1,"116":1,"120":1,"131":1,"139":1,"140":1,"141":1,"142":1,"144":1,"158":1,"159":1,"161":2,"162":1,"163":1,"178":3,"214":2,"216":1,"217":1,"222":1,"223":1,"226":1,"227":1,"241":1,"255":1,"267":1,"268":1,"276":1,"277":1,"281":1,"287":1,"290":1,"310":1,"317":1,"320":1,"324":1,"336":1}}],["i",{"2":{"14":7}}],["italic",{"2":{"51":1,"78":1}}],["iterate",{"2":{"19":1}}],["it",{"0":{"145":1,"146":1},"2":{"10":1,"14":9,"19":2,"20":1,"23":1,"25":1,"27":1,"28":2,"30":2,"42":1,"47":1,"48":2,"50":1,"53":1,"59":1,"61":1,"64":1,"66":2,"68":1,"71":1,"79":1,"85":1,"87":1,"120":1,"126":1,"132":1,"133":1,"139":1,"146":2,"156":1,"158":1,"159":1,"160":1,"164":1,"167":1,"180":2,"181":2,"186":1,"192":1,"206":1,"210":1,"214":2,"219":1,"223":1,"226":1,"227":1,"234":2,"235":1,"236":2,"243":1,"244":1,"253":1,"254":1,"260":1,"262":1,"265":2,"270":1,"273":1,"274":2,"276":3,"280":1,"281":1,"287":1,"310":1,"317":4,"320":1,"326":1,"328":1,"330":1,"344":1,"347":1,"349":1,"356":1}}],["itself",{"2":{"146":1,"194":1,"210":1,"215":1,"239":1,"278":1}}],["its",{"2":{"1":3,"4":1,"18":1,"98":1,"111":1,"113":2,"115":1,"116":1,"117":1,"122":1,"126":1,"127":1,"138":1,"155":1,"163":1,"178":1,"180":1,"182":1,"186":2,"187":2,"190":1,"194":2,"196":1,"202":1,"203":1,"215":1,"227":1,"234":1,"241":1,"248":1,"250":1,"251":1,"252":1,"261":1,"263":1,"270":1,"273":1,"313":1,"330":1,"331":1,"336":1,"338":1,"339":1,"342":1,"344":1,"346":1,"349":1,"351":1,"358":1}}],["im",{"2":{"36":2,"37":1,"62":2,"63":1}}],["improve",{"2":{"210":1}}],["importance",{"2":{"317":1,"328":1}}],["important",{"0":{"163":1},"2":{"5":1,"48":1,"54":1,"115":1,"145":1,"224":1,"225":1,"227":1,"267":1,"320":1}}],["imported",{"0":{"276":1},"2":{"266":1,"276":1,"353":1,"357":1}}],["importing",{"0":{"223":1},"2":{"168":1}}],["import",{"0":{"168":1,"170":1},"1":{"169":1,"170":1,"171":1},"2":{"114":1,"170":1,"201":2,"223":2,"314":1}}],["impact",{"2":{"20":1}}],["immediately",{"2":{"143":1,"148":1}}],["immediate",{"0":{"148":1},"1":{"149":1,"150":1},"2":{"10":1,"39":1,"262":1,"285":1,"307":1}}],["images",{"0":{"193":1},"2":{"32":1,"51":1,"62":1,"66":1,"67":1,"78":1,"90":1,"226":2,"266":1,"322":1,"324":1}}],["image",{"0":{"228":1},"2":{"9":3,"114":1,"116":5,"130":1,"158":2,"159":2,"163":1,"193":1,"224":1,"225":1,"226":1,"228":3,"231":2,"232":1,"317":1,"319":3,"323":1,"325":4}}],["injected",{"2":{"265":1}}],["initiated",{"2":{"253":1}}],["initialize",{"2":{"158":1,"322":1}}],["initial",{"2":{"115":1,"119":1}}],["inquiries",{"2":{"180":1}}],["inbox",{"2":{"178":1}}],["inbound",{"2":{"22":1,"37":1,"42":1,"43":1,"63":1,"68":1,"135":1,"139":1,"142":1}}],["inherits",{"2":{"112":1,"116":1}}],["incremented",{"2":{"241":1}}],["increases",{"2":{"145":1}}],["inconsistent",{"2":{"211":1}}],["incoming",{"2":{"66":1,"94":1,"95":1,"178":1,"180":1}}],["including",{"2":{"8":1,"9":1,"122":1,"237":1}}],["included",{"2":{"339":1}}],["includes",{"2":{"10":1,"117":1,"120":1,"172":1,"206":1,"315":1}}],["include",{"2":{"7":1,"124":1,"130":1,"151":1,"203":1,"217":1,"228":1,"262":1,"325":1}}],["input",{"2":{"49":1,"147":1,"198":1,"226":1,"262":1}}],["invocation",{"2":{"263":1}}],["invoked",{"2":{"128":1}}],["involves",{"2":{"174":1}}],["involved",{"2":{"110":1,"151":1}}],["involve",{"2":{"41":1}}],["invalid",{"2":{"126":1}}],["invited",{"2":{"55":1}}],["invites",{"2":{"55":1,"56":1}}],["invite",{"0":{"30":1,"56":1},"2":{"56":1,"66":2}}],["inferred",{"2":{"256":1}}],["inference",{"2":{"17":1,"19":1,"20":1}}],["influences",{"2":{"116":1}}],["inflate",{"2":{"14":1}}],["info",{"2":{"34":1,"112":1,"323":1}}],["information",{"0":{"159":1},"2":{"14":1,"36":1,"60":1,"61":1,"129":1,"154":1,"172":1,"204":1,"213":1,"217":1,"243":1,"250":1,"262":1}}],["infrastructure",{"0":{"332":1},"1":{"333":1,"334":1,"335":1},"2":{"14":1,"16":1,"19":1,"20":1,"326":1,"333":1,"342":1}}],["into",{"2":{"13":1,"14":1,"37":1,"41":1,"71":1,"76":1,"139":1,"141":1,"146":1,"169":1,"170":1,"190":1,"208":1,"223":1,"239":1,"252":1,"253":1,"265":1,"266":1,"268":1,"270":1,"274":1,"275":1,"276":1,"280":1,"317":1,"328":1,"352":1}}],["introduction",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"21":1}}],["integrated",{"2":{"188":1,"191":1}}],["integrating",{"2":{"33":1}}],["integration",{"2":{"7":2,"32":1,"39":7,"40":2,"68":1,"135":3}}],["integrations",{"2":{"1":1,"7":1,"312":1}}],["intended",{"2":{"68":1,"73":1,"103":1,"278":1}}],["intentionally",{"2":{"116":1,"259":1}}],["intent",{"2":{"29":3}}],["intents",{"2":{"29":1}}],["intelligence",{"2":{"14":1}}],["interrupt",{"2":{"288":1}}],["intercepted",{"2":{"278":1}}],["internal",{"2":{"254":1,"266":1}}],["internet",{"2":{"14":1}}],["intervention",{"2":{"233":1}}],["intervene",{"2":{"194":1}}],["interval",{"2":{"117":1,"182":1,"183":1,"242":1,"296":2}}],["interference",{"2":{"251":1}}],["interfering",{"2":{"4":1}}],["interface",{"2":{"18":1,"39":1,"160":1,"185":1}}],["interactive",{"2":{"114":1,"121":1}}],["interactions",{"2":{"42":1,"204":1}}],["interaction",{"0":{"129":1,"180":1,"186":1,"194":1,"203":1,"215":1,"250":1},"2":{"9":1}}],["interact",{"2":{"1":1,"3":1,"27":1,"33":1,"39":1,"45":1,"47":1,"79":1,"85":1,"91":1,"129":1,"132":1,"191":1}}],["inspect",{"2":{"110":2,"123":1,"129":1,"154":1,"285":4}}],["inspection",{"0":{"289":1},"1":{"290":1,"291":1,"292":1,"293":1,"294":1},"2":{"10":1,"275":1,"278":1}}],["instruction",{"2":{"235":1,"242":1,"265":1}}],["instead",{"2":{"115":1,"129":1,"154":1,"221":1,"277":1,"279":1,"281":1,"342":1}}],["install",{"0":{"64":1,"309":1,"310":1,"319":1,"320":1},"1":{"321":1},"2":{"60":1,"64":1,"130":1,"156":1,"264":1,"266":1,"276":1,"277":1,"309":2,"310":1,"314":1,"315":1,"319":3,"321":1,"325":1}}],["installation",{"0":{"315":1},"1":{"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1},"2":{"8":1,"11":1,"66":1,"313":1}}],["instance",{"2":{"43":3,"44":1,"45":1,"158":1,"159":1,"340":1}}],["instances",{"2":{"42":1,"352":1}}],["instinct",{"2":{"14":1}}],["inside",{"2":{"4":1,"8":1,"121":1,"163":1,"187":1,"198":1,"266":2,"280":1,"285":1,"315":1,"317":1}}],["indices",{"2":{"317":1,"328":1}}],["indicator",{"2":{"212":1}}],["indicators",{"2":{"49":1,"51":1,"89":1,"90":1}}],["individual",{"2":{"3":1,"57":1,"83":1,"90":1,"95":1}}],["indexed",{"2":{"330":1}}],["indexes",{"2":{"211":1}}],["indexing",{"2":{"17":1,"19":1,"206":1,"229":1,"333":1,"342":1}}],["index",{"2":{"17":1,"211":1,"213":2,"327":1}}],["independently",{"2":{"252":1}}],["independent",{"2":{"6":1,"111":1,"196":1,"251":1,"253":1,"263":1}}],["in",{"0":{"70":1,"86":1,"256":1,"257":1,"269":1,"280":1,"326":1,"329":1,"330":1},"1":{"270":1,"271":1,"272":1,"273":1,"274":1,"327":1,"328":1,"329":1,"330":1,"331":2,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1},"2":{"1":2,"3":2,"4":1,"8":1,"14":1,"16":1,"18":3,"19":1,"20":1,"24":2,"25":1,"26":1,"28":1,"30":1,"31":1,"33":1,"34":2,"35":1,"37":3,"38":2,"39":1,"41":1,"43":1,"44":1,"45":1,"48":1,"49":1,"50":2,"53":1,"55":3,"57":1,"59":1,"61":2,"62":5,"63":1,"64":1,"65":2,"66":1,"68":1,"70":2,"72":1,"74":1,"75":1,"76":1,"77":1,"80":1,"81":2,"82":2,"83":2,"86":1,"88":1,"97":1,"102":2,"103":4,"112":2,"115":2,"116":1,"117":1,"120":1,"122":1,"124":1,"125":2,"126":3,"129":1,"131":1,"134":1,"137":1,"139":1,"144":1,"146":1,"147":1,"148":1,"151":1,"152":1,"155":1,"157":1,"159":1,"160":2,"161":1,"162":3,"165":1,"166":1,"175":1,"176":1,"177":1,"180":2,"183":2,"187":1,"192":2,"193":1,"194":1,"196":2,"197":1,"201":1,"203":1,"205":2,"206":1,"207":1,"208":1,"209":1,"210":1,"211":2,"215":1,"218":1,"225":1,"227":1,"230":1,"231":1,"236":1,"238":1,"239":1,"245":1,"247":1,"248":2,"253":1,"254":6,"255":1,"259":1,"262":1,"263":2,"265":1,"266":1,"268":1,"270":2,"271":1,"274":1,"275":1,"276":1,"278":3,"281":1,"282":1,"287":2,"288":1,"290":1,"307":1,"308":1,"309":2,"310":2,"315":1,"316":1,"317":3,"320":1,"321":2,"322":1,"324":1,"325":2,"326":3,"328":1,"329":1,"330":1,"334":1,"335":2,"336":1,"338":1,"339":1,"340":1,"341":1,"343":1,"348":1,"352":2,"353":1,"360":1}}],["issues",{"2":{"212":1,"254":1}}],["issue",{"2":{"184":1,"212":1}}],["isolation",{"0":{"252":1},"2":{"155":1}}],["isolated",{"0":{"156":1},"2":{"1":1,"4":1,"17":1,"18":1,"19":1,"111":1,"155":1,"187":1,"312":1}}],["is",{"0":{"1":1},"2":{"1":1,"3":1,"5":1,"9":1,"10":1,"13":1,"14":3,"15":1,"17":2,"18":2,"20":2,"23":1,"25":1,"38":1,"40":2,"42":1,"43":1,"45":2,"48":1,"56":1,"66":2,"68":3,"71":1,"73":1,"74":1,"77":1,"82":1,"85":1,"87":1,"88":1,"92":5,"97":2,"99":1,"102":1,"103":6,"105":1,"110":4,"111":1,"115":1,"116":1,"117":1,"118":1,"122":1,"123":1,"124":1,"126":1,"129":1,"135":2,"140":1,"144":1,"146":1,"147":1,"149":1,"151":2,"158":1,"160":3,"163":1,"164":1,"165":1,"169":1,"171":1,"182":2,"183":1,"194":1,"200":1,"202":1,"203":1,"206":2,"210":3,"211":1,"212":3,"213":1,"219":1,"221":1,"222":2,"224":1,"227":2,"229":1,"233":1,"234":1,"235":1,"236":1,"241":3,"244":1,"251":1,"253":1,"254":5,"255":1,"256":2,"262":1,"263":1,"265":2,"267":3,"268":1,"271":1,"274":1,"276":1,"279":4,"280":1,"287":2,"288":3,"291":2,"305":2,"307":1,"308":1,"312":1,"315":1,"317":1,"320":2,"323":1,"324":1,"326":1,"336":1,"337":1,"341":1,"342":1,"347":1,"352":1,"353":1,"356":1,"357":2}}],["cp",{"2":{"320":1}}],["cd",{"2":{"320":1}}],["cdi",{"0":{"160":1,"161":1},"1":{"161":1,"162":1,"163":1},"2":{"159":2,"160":2,"161":3,"162":11,"163":3}}],["c",{"2":{"303":1}}],["cwd",{"2":{"198":1}}],["ctk",{"2":{"162":2}}],["certificates",{"2":{"126":1}}],["ceiling",{"2":{"16":1}}],["cni",{"2":{"323":1}}],["cn",{"2":{"126":1,"319":2,"321":3,"325":1}}],["c2c",{"2":{"51":1}}],["cuda",{"2":{"163":1}}],["custom",{"2":{"34":1,"37":1,"80":1,"81":1,"120":1,"126":1,"199":1,"242":1}}],["curl",{"2":{"319":1}}],["curated",{"2":{"8":1,"196":1}}],["currently",{"2":{"6":1,"39":1,"63":1,"159":2,"214":1,"219":1,"235":1,"259":1,"267":1,"279":1,"290":1,"304":1,"355":1}}],["current",{"2":{"5":1,"7":1,"26":1,"46":1,"62":1,"73":1,"110":1,"129":1,"148":1,"149":1,"150":1,"152":1,"164":1,"172":1,"189":1,"200":1,"212":1,"230":1,"235":1,"241":1,"255":2,"262":2,"275":1,"279":3,"280":1,"284":1,"287":2,"288":3,"290":3,"291":1,"294":1,"297":3,"298":2,"299":2,"300":2,"307":2}}],["claude",{"2":{"225":1}}],["class",{"2":{"14":1}}],["clash",{"2":{"14":1}}],["clear",{"2":{"185":1,"265":1,"277":1}}],["cleaning",{"2":{"182":1}}],["clean",{"2":{"171":1,"185":1,"256":1}}],["cleaner",{"2":{"14":1}}],["clone",{"2":{"319":1,"320":1}}],["close",{"2":{"147":1}}],["closer",{"2":{"101":1,"152":1}}],["closed",{"2":{"14":1}}],["cloud",{"2":{"15":1,"16":1,"17":1,"19":1,"20":1,"342":1}}],["clicking",{"2":{"113":1,"124":1,"257":1}}],["click",{"0":{"319":1},"2":{"24":2,"28":2,"31":2,"34":2,"35":1,"36":1,"37":1,"38":1,"44":2,"48":1,"49":2,"50":1,"55":2,"64":1,"65":2,"70":1,"76":2,"77":1,"81":2,"86":1,"87":2,"100":2,"101":1,"112":2,"122":1,"123":1,"125":2,"128":1,"129":1,"137":1,"149":1,"161":1,"165":1,"166":1,"169":1,"170":1,"176":2,"178":2,"190":1,"192":2,"193":1,"200":2,"201":1,"202":1,"205":1,"211":1,"218":1,"223":1,"237":1,"247":1,"249":1,"257":1,"260":1,"270":1,"309":1,"310":1,"329":2,"336":1,"343":2,"345":1,"348":2,"350":1,"353":3,"357":2,"358":1,"359":1}}],["clicks",{"2":{"14":1}}],["client",{"0":{"219":1},"2":{"9":1,"54":4,"56":1,"58":1,"217":1,"218":3,"219":2,"221":1,"222":1,"313":1}}],["circling",{"2":{"13":1}}],["china",{"0":{"321":1},"2":{"319":1,"321":2,"325":1}}],["chromium",{"2":{"126":1,"130":3,"325":1}}],["checking",{"2":{"233":1,"278":1}}],["checks",{"2":{"114":1,"182":1}}],["checked",{"2":{"97":1}}],["check",{"2":{"57":1,"66":2,"178":1,"200":1,"242":1,"263":1,"319":1}}],["cheaply",{"2":{"152":1}}],["cheap",{"2":{"16":1}}],["choices",{"2":{"14":1}}],["choose",{"2":{"11":1,"23":1,"24":1,"37":1,"40":1,"41":1,"43":1,"44":1,"60":1,"70":2,"75":2,"100":1,"105":1,"106":1,"107":1,"176":1,"199":1,"201":1,"223":1,"309":1,"310":1}}],["changing",{"2":{"314":1}}],["changed",{"2":{"211":1}}],["change",{"2":{"101":1,"137":1,"146":1,"161":1,"163":1,"236":1,"256":1,"320":1,"322":1}}],["changes",{"0":{"146":1},"2":{"5":1,"29":1,"146":1,"164":1,"172":1,"189":1,"192":1,"214":1}}],["chance",{"2":{"145":1}}],["channels",{"0":{"39":1,"132":1,"134":1,"256":1},"1":{"40":1,"41":1,"133":1,"134":1,"135":2,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1},"2":{"3":1,"10":2,"11":1,"39":3,"59":1,"62":5,"63":1,"66":2,"67":3,"108":1,"110":1,"111":1,"114":1,"132":1,"133":1,"255":1,"263":1,"314":1}}],["channel",{"0":{"7":1,"22":1,"27":1,"33":1,"42":1,"47":1,"53":1,"59":1,"68":1,"70":1,"74":1,"79":1,"85":1,"86":1,"109":1,"137":1,"174":1},"1":{"23":1,"24":1,"25":1,"26":1,"28":1,"29":1,"30":1,"31":1,"32":1,"34":1,"35":1,"36":1,"37":1,"38":1,"43":1,"44":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"69":1,"70":1,"71":1,"72":1,"73":1,"75":1,"76":1,"77":1,"78":1,"80":1,"81":1,"82":1,"83":1,"84":1,"86":1,"87":1,"88":1,"89":1,"90":1},"2":{"1":1,"7":1,"18":1,"24":1,"25":1,"31":1,"37":1,"41":3,"44":1,"45":1,"49":1,"50":1,"51":1,"55":1,"65":1,"66":2,"70":3,"72":1,"73":1,"76":1,"77":1,"81":1,"82":1,"86":1,"88":1,"91":2,"95":4,"100":6,"102":2,"106":1,"107":1,"108":1,"109":4,"114":1,"137":2,"138":1,"140":1,"141":2,"142":1,"143":3,"173":1,"234":1,"235":1,"241":1,"255":3,"278":1,"287":3,"291":2,"312":1,"314":1}}],["chatbot",{"2":{"254":1}}],["chatbox",{"2":{"19":1}}],["chatgpt",{"2":{"219":1,"221":1}}],["chatting",{"0":{"45":1,"82":1,"88":1},"2":{"96":1,"181":1,"253":1}}],["chats",{"2":{"3":1,"22":2,"26":2,"33":1,"73":2,"82":1,"83":1,"103":1,"112":1,"281":1}}],["chat",{"0":{"105":1,"225":1,"254":1},"1":{"226":1,"227":1,"228":1},"2":{"1":1,"6":1,"9":3,"11":2,"18":2,"25":1,"32":1,"36":2,"39":3,"62":1,"77":1,"92":2,"94":2,"96":1,"100":1,"102":1,"107":1,"108":1,"109":1,"111":1,"114":1,"115":1,"116":7,"117":1,"120":1,"132":1,"133":1,"135":1,"150":1,"152":2,"153":1,"180":1,"183":1,"215":1,"216":1,"219":3,"222":1,"224":2,"225":1,"228":2,"230":2,"231":1,"232":1,"252":1,"253":2,"254":2,"255":5,"256":1,"257":2,"259":2,"278":1,"281":1,"282":1,"284":1,"287":6,"291":1,"296":2,"297":1,"313":1,"326":1}}],["caching",{"2":{"262":1}}],["cache",{"2":{"6":1,"149":1,"262":4,"285":1,"290":2}}],["came",{"2":{"262":1,"274":1}}],["calculate",{"2":{"227":1}}],["called",{"2":{"239":1}}],["call",{"2":{"225":1,"226":2,"250":1}}],["callback",{"2":{"24":1,"37":1,"41":1,"70":1,"71":3,"139":1,"141":2,"142":1}}],["calls",{"2":{"17":1,"146":1,"214":1,"235":2,"240":1,"241":2,"242":1}}],["catalog",{"2":{"223":1,"308":1,"314":1}}],["category",{"2":{"14":1}}],["capturing",{"2":{"124":1}}],["captured",{"2":{"166":1}}],["capture",{"2":{"123":1,"164":1}}],["capable",{"2":{"116":1}}],["capability",{"0":{"35":1},"2":{"13":1,"15":1,"17":1,"23":1,"160":2,"245":1}}],["capabilities",{"0":{"196":1},"2":{"8":1,"35":1,"36":1,"114":1,"116":1,"177":1,"231":1,"326":1}}],["carried",{"2":{"146":1}}],["carry",{"2":{"14":1}}],["card",{"2":{"113":1,"271":1}}],["caught",{"2":{"14":1}}],["cases",{"2":{"124":1}}],["case",{"0":{"12":1,"139":1,"140":1,"141":1,"142":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"242":1,"327":1}}],["cannot",{"2":{"66":1,"227":1,"321":1}}],["can",{"0":{"105":1},"2":{"1":1,"3":1,"4":1,"6":2,"7":1,"8":1,"10":1,"11":1,"13":1,"14":5,"18":3,"19":2,"25":1,"39":1,"42":2,"45":1,"48":1,"53":1,"54":2,"57":1,"66":1,"72":1,"78":1,"82":1,"88":1,"91":2,"92":3,"94":2,"95":1,"101":1,"106":1,"107":1,"108":1,"109":1,"111":1,"113":1,"116":2,"117":2,"118":1,"123":2,"128":1,"129":1,"130":1,"133":1,"147":1,"148":1,"152":2,"156":1,"160":1,"161":1,"178":6,"180":1,"183":1,"186":1,"187":1,"194":1,"196":2,"200":1,"202":2,"210":1,"211":1,"223":3,"226":4,"227":1,"234":1,"236":1,"239":1,"240":1,"241":1,"244":1,"250":1,"254":1,"257":1,"263":1,"264":1,"266":1,"267":1,"268":1,"272":1,"274":1,"275":1,"282":1,"319":1,"337":1,"338":1,"347":1,"352":2,"353":1,"359":1}}],["crowd",{"2":{"145":1}}],["cross",{"2":{"50":1,"77":1}}],["cron",{"0":{"234":1,"236":1},"2":{"6":1,"18":1,"114":1,"233":1,"234":1,"235":1,"236":1,"237":1,"239":1,"241":1,"242":1,"253":1,"263":1}}],["credential",{"2":{"81":1}}],["credentials",{"0":{"69":1},"2":{"23":1,"34":1,"41":1,"44":1,"76":1,"80":1,"87":1,"137":1,"138":1,"217":1,"218":1,"247":1,"319":1,"323":1}}],["creating",{"0":{"112":1,"125":1,"165":1,"176":1,"208":1,"218":1,"238":1,"329":1,"343":1,"348":1,"357":1},"1":{"239":1,"240":1},"2":{"99":1,"115":1,"126":1,"159":1,"223":1,"278":1,"330":1,"344":1,"349":1}}],["creation",{"2":{"43":1,"92":1,"119":1,"120":1,"158":1,"163":1,"167":1,"326":1}}],["creates",{"2":{"255":1,"287":1}}],["created",{"2":{"113":1,"115":1,"128":1,"163":1,"178":1,"189":1,"238":1,"249":1,"253":4,"263":2,"268":1,"336":1,"345":1,"350":1,"357":1}}],["create",{"0":{"23":1,"28":1,"34":1,"48":1,"54":1,"60":1,"75":1,"80":1},"2":{"1":1,"3":1,"11":1,"18":1,"23":1,"34":2,"38":1,"41":1,"43":1,"48":2,"60":1,"61":1,"75":1,"80":1,"92":1,"102":1,"112":2,"114":2,"125":1,"141":1,"158":1,"161":1,"165":1,"176":1,"178":1,"189":1,"205":1,"239":2,"240":1,"255":2,"256":1,"257":1,"266":1,"268":1,"279":2,"281":1,"282":1,"303":3,"312":1,"313":1,"320":1,"329":1,"337":1,"340":1,"343":1,"348":1,"352":1,"353":1,"357":1}}],["cohere",{"2":{"317":1}}],["collection",{"2":{"182":1,"330":2}}],["collaborate",{"2":{"18":1}}],["corresponding",{"2":{"263":1}}],["corrupted",{"2":{"171":1}}],["cores=chromium",{"2":{"130":1}}],["cores",{"2":{"130":4,"319":1,"325":1}}],["core",{"0":{"115":1,"130":1},"2":{"19":1,"114":1,"126":1,"130":1,"296":1,"316":3,"319":1,"320":1}}],["counter",{"2":{"241":1}}],["counts",{"2":{"237":1,"262":1}}],["count",{"2":{"151":1,"262":1,"290":1}}],["could",{"2":{"14":1}}],["covers",{"2":{"68":1}}],["coverage",{"0":{"7":1}}],["copies",{"2":{"274":1}}],["copilot",{"0":{"222":1},"2":{"9":1,"217":1,"218":1,"219":2,"220":1,"222":3}}],["copying",{"2":{"41":1}}],["copy",{"2":{"23":1,"28":1,"30":1,"34":1,"37":1,"48":1,"50":1,"61":1,"64":1,"71":1,"77":1,"139":1,"141":1,"268":1,"277":1}}],["coder",{"2":{"265":3,"266":1,"267":1}}],["code",{"0":{"87":1},"2":{"50":2,"51":1,"77":3,"78":1,"85":1,"87":3,"140":2,"155":1,"222":1,"265":1}}],["codex",{"0":{"221":1},"2":{"9":1,"217":1,"219":2,"220":1,"221":2}}],["coding",{"2":{"18":1,"219":1,"221":1,"265":1}}],["costs",{"2":{"317":1,"327":1}}],["cost",{"2":{"14":1,"328":1}}],["combined",{"2":{"319":1}}],["com",{"2":{"161":4,"221":1,"320":1}}],["comes",{"2":{"100":1,"111":1,"116":1}}],["come",{"0":{"266":1},"2":{"64":1,"116":1}}],["commas",{"2":{"161":1}}],["command",{"0":{"279":1,"306":1},"1":{"307":1},"2":{"8":1,"10":1,"75":1,"110":1,"152":1,"198":3,"234":1,"235":1,"240":1,"241":2,"242":1,"253":1,"255":1,"265":1,"278":1,"279":1,"280":3,"281":2,"284":2,"291":3,"303":2,"313":1}}],["commands",{"0":{"150":1,"278":1,"284":1,"286":1,"289":1,"295":1,"302":1,"324":1},"1":{"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":2,"288":2,"289":1,"290":2,"291":2,"292":2,"293":2,"294":2,"295":1,"296":2,"297":2,"298":2,"299":2,"300":2,"301":2,"302":1,"303":2,"304":2,"305":2,"306":1,"307":1},"2":{"4":1,"6":1,"11":1,"18":2,"19":1,"30":1,"32":2,"121":1,"154":1,"155":1,"263":1,"278":2,"279":2,"281":2,"291":1,"313":1}}],["commonly",{"2":{"160":1}}],["common",{"0":{"138":1,"324":1},"2":{"92":1,"161":1,"192":1,"218":1,"236":1,"276":1}}],["communities",{"2":{"135":1}}],["community",{"2":{"27":1,"39":1}}],["communication",{"0":{"133":1},"2":{"116":1,"173":1}}],["communicates",{"2":{"198":1}}],["communicate",{"2":{"53":1}}],["comprehensive",{"2":{"245":1,"250":1}}],["compresses",{"2":{"210":1}}],["compression",{"2":{"210":1}}],["component",{"2":{"188":1}}],["compose",{"2":{"130":1,"178":1,"315":1,"316":1,"317":1,"318":1,"319":2,"320":3,"321":4,"324":6,"334":2,"335":1}}],["complement",{"2":{"242":1}}],["complex",{"2":{"111":1,"164":1}}],["complete",{"2":{"265":1}}],["completes",{"2":{"222":1}}],["completed",{"2":{"151":1,"184":1}}],["completely",{"2":{"62":1}}],["completions",{"2":{"9":1,"219":2}}],["compacted",{"2":{"151":1}}],["compact",{"0":{"307":1},"2":{"114":1,"147":1,"149":1,"150":2,"153":1,"210":1,"214":1,"262":2,"285":1,"307":2,"317":1,"328":1,"337":1}}],["compaction",{"0":{"118":1,"144":1,"147":1,"148":1,"153":2,"210":1,"306":1},"1":{"145":1,"146":1,"147":1,"148":1,"149":2,"150":2,"151":1,"152":1,"153":1,"154":1,"307":1},"2":{"5":3,"10":2,"114":2,"115":2,"116":1,"118":11,"144":1,"145":1,"146":1,"147":8,"148":1,"149":1,"150":1,"151":4,"152":2,"153":4,"154":1,"206":2,"210":3,"214":5,"227":1,"262":1,"285":1,"307":5,"314":2,"326":1}}],["compatibilities",{"0":{"226":1},"2":{"225":1,"228":1}}],["compatibility",{"2":{"116":1,"226":2,"266":3,"274":1,"276":1}}],["compatible",{"2":{"9":2,"217":1,"219":1}}],["compat",{"2":{"70":1}}],["compare",{"0":{"19":1}}],["computer",{"2":{"1":1,"18":1,"156":1,"190":1}}],["convert",{"2":{"328":1}}],["converts",{"2":{"317":1}}],["converse",{"2":{"180":1}}],["conversational",{"0":{"239":1},"2":{"145":1,"287":1}}],["conversation",{"0":{"252":1},"2":{"5":1,"15":1,"18":1,"62":1,"100":4,"102":3,"116":1,"119":1,"144":1,"145":1,"149":1,"153":1,"206":1,"208":2,"214":2,"224":1,"244":1,"251":1,"252":1,"253":3,"254":4,"255":1,"256":1,"259":1,"279":2,"287":1,"288":1,"290":2,"291":1,"307":1}}],["conversations",{"0":{"66":1},"2":{"3":1,"5":1,"6":1,"39":1,"45":1,"53":1,"57":1,"66":1,"73":1,"83":2,"90":1,"92":2,"102":1,"103":1,"202":1,"204":1,"214":1,"231":1,"251":1,"253":1,"254":1,"255":2,"260":1,"263":1,"287":1,"326":1,"337":1,"352":1}}],["convenience",{"2":{"281":1}}],["conf",{"2":{"320":1}}],["confusing",{"2":{"110":1}}],["confirmed",{"2":{"87":1}}],["confirm",{"2":{"25":1,"72":1,"87":1,"99":1,"122":1,"309":1}}],["confidence",{"2":{"19":1}}],["config",{"2":{"10":1,"100":1,"109":1,"201":1,"236":1,"319":1,"320":3,"321":1,"322":1,"323":2,"325":3,"334":1,"335":1}}],["configurable",{"2":{"111":1,"352":1}}],["configurations",{"2":{"114":1,"172":1,"201":1}}],["configuration",{"0":{"22":1,"27":1,"33":1,"42":1,"47":1,"53":1,"59":1,"68":1,"74":1,"79":1,"85":1,"136":1,"183":1,"225":1,"246":1,"295":1,"323":1},"1":{"23":1,"24":1,"25":1,"26":1,"28":1,"29":1,"30":1,"31":1,"32":1,"34":1,"35":1,"36":1,"37":1,"38":1,"43":1,"44":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"69":1,"70":1,"71":1,"72":1,"73":1,"75":1,"76":1,"77":1,"78":1,"80":1,"81":1,"82":1,"83":1,"84":1,"86":1,"87":1,"88":1,"89":1,"90":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"226":1,"227":1,"228":1,"247":1,"248":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"1":1,"10":1,"41":1,"71":1,"114":1,"124":1,"127":1,"135":11,"137":1,"138":1,"139":1,"141":1,"143":2,"164":1,"192":1,"200":1,"201":1,"205":1,"212":1,"248":1,"274":1,"294":1,"319":1,"325":1,"336":1,"360":1}}],["configuring",{"0":{"115":1,"126":1,"330":1,"344":1,"349":1,"358":1},"1":{"127":1,"331":1},"2":{"39":1,"115":1,"162":1}}],["configure",{"0":{"24":1,"29":1,"31":1,"36":1,"37":1,"44":1,"49":1,"55":1,"62":1,"65":1,"71":1,"76":1,"81":1,"161":1},"2":{"11":2,"18":1,"41":1,"49":1,"94":1,"98":1,"133":1,"134":1,"138":1,"142":1,"147":1,"174":1,"177":1,"183":1,"196":1,"197":1,"216":1,"219":1,"232":1,"245":1,"313":1,"314":1,"330":1,"340":1,"344":1,"349":1,"353":1,"358":1}}],["configured",{"2":{"9":1,"32":1,"39":1,"117":1,"129":1,"131":1,"141":1,"146":1,"147":1,"158":1,"160":1,"162":1,"205":1,"215":1,"236":1,"244":1,"301":1,"335":1,"359":1}}],["connected",{"2":{"212":1,"234":1,"241":1}}],["connects",{"2":{"66":1,"199":1,"342":1}}],["connect",{"2":{"39":2,"42":1,"82":1,"132":1,"195":1,"243":1,"245":1}}],["connectivity",{"2":{"212":1}}],["connecting",{"2":{"27":1,"47":1,"53":1,"59":1,"74":1,"79":1,"85":1,"140":1,"174":1}}],["connection",{"0":{"142":1,"197":1},"1":{"198":1,"199":1},"2":{"22":1,"24":1,"41":1,"44":1,"114":1,"142":1,"174":1,"198":1,"199":1,"200":2,"201":3,"202":2,"203":1,"217":1,"244":1,"310":2,"323":2}}],["connections",{"0":{"195":1},"1":{"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1},"2":{"8":1,"61":1,"134":1,"175":1,"196":2,"197":1,"201":3,"285":1,"301":1}}],["concept",{"0":{"124":1,"133":1,"156":1,"174":1,"182":1,"196":1,"206":1,"234":1,"244":1,"252":1},"2":{"214":1}}],["concepts",{"0":{"93":1},"1":{"94":1,"95":1,"96":1,"97":1},"2":{"214":1}}],["conceptually",{"2":{"14":1}}],["conclusion",{"0":{"20":1}}],["consists",{"2":{"316":1}}],["consistently",{"2":{"3":1}}],["consume",{"2":{"278":1}}],["console",{"2":{"35":1,"37":1,"38":1,"41":1,"80":1}}],["constraint",{"2":{"14":1}}],["contribute",{"0":{"311":1},"2":{"311":1}}],["controlling",{"2":{"95":1}}],["control",{"0":{"91":1},"1":{"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1},"2":{"10":1,"15":1,"17":1,"91":2,"95":1,"98":1,"119":1,"278":1,"313":1,"314":1}}],["controls",{"2":{"10":1,"119":1,"215":1,"323":1,"330":1}}],["continuing",{"2":{"307":1}}],["continuity",{"2":{"16":1,"20":1,"145":1}}],["continue",{"2":{"20":1,"131":1,"337":1,"355":1}}],["continuously",{"2":{"14":1}}],["contents",{"2":{"170":1}}],["content",{"2":{"14":1,"29":1,"32":1,"51":1,"54":1,"57":1,"83":1,"90":1,"123":1,"124":1,"192":1,"208":1,"209":1,"257":1,"265":1,"271":1,"273":1}}],["contextually",{"2":{"204":1}}],["contexts",{"0":{"123":1,"127":1},"1":{"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1},"2":{"115":1,"125":3,"285":1}}],["context",{"0":{"5":1,"125":1,"126":1,"128":1,"144":1,"152":1,"153":1,"214":1,"227":1,"306":1},"1":{"127":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"307":1},"2":{"5":2,"6":2,"13":2,"14":1,"16":2,"17":1,"18":1,"20":1,"78":1,"100":1,"110":1,"114":1,"115":1,"116":3,"118":5,"123":2,"124":1,"125":2,"126":1,"127":2,"128":3,"129":1,"144":3,"145":2,"146":2,"147":5,"149":1,"150":1,"151":1,"152":2,"153":2,"154":1,"195":2,"203":1,"206":3,"210":1,"214":3,"225":2,"227":4,"234":1,"241":1,"251":1,"252":2,"253":1,"255":2,"256":1,"262":3,"263":1,"285":3,"287":2,"290":1,"291":1,"300":1,"307":3,"314":2}}],["contains",{"2":{"21":1,"116":1,"253":3,"279":1}}],["containerd",{"2":{"159":1,"315":2,"316":1,"323":2}}],["containers",{"2":{"17":1,"18":1,"315":1}}],["containerization",{"2":{"16":1}}],["containerized",{"0":{"4":1,"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"1":1,"15":1,"17":1,"18":1,"19":1,"20":1,"312":1}}],["container",{"0":{"155":1,"159":1,"172":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1},"2":{"4":1,"18":1,"19":1,"111":1,"114":5,"121":3,"122":1,"155":1,"156":1,"157":1,"158":5,"159":5,"160":4,"161":3,"162":2,"163":6,"164":1,"165":1,"166":1,"168":2,"169":1,"170":1,"171":2,"172":4,"187":1,"190":2,"198":1,"266":1,"285":1,"305":1,"317":3,"323":1,"328":1}}],["contact",{"2":{"13":1}}],["mp3",{"2":{"358":2}}],["mpim",{"2":{"62":2,"63":1}}],["md",{"2":{"192":1,"265":1,"266":3,"271":1,"305":1}}],["m",{"2":{"54":2}}],["my",{"2":{"75":2,"239":1,"240":1,"247":1}}],["mybot",{"2":{"54":1,"55":1}}],["myself",{"2":{"14":1}}],["mirrors",{"2":{"325":1}}],["mirror=true",{"2":{"319":2,"321":1}}],["mirror",{"0":{"321":1},"2":{"319":1,"321":1,"323":1,"325":1}}],["midnight",{"2":{"236":2}}],["migration",{"2":{"168":1}}],["minute",{"2":{"236":1}}],["minutes",{"2":{"117":1,"183":2,"236":1,"242":1,"296":1,"322":1}}],["minimum",{"2":{"36":1,"265":1,"320":1}}],["microsoft",{"2":{"219":1,"354":1,"356":1}}],["mic",{"2":{"14":1}}],["misskey",{"0":{"42":1,"43":1},"1":{"43":1,"44":1,"45":1,"46":1},"2":{"1":1,"7":1,"39":1,"42":3,"43":3,"44":2,"45":2,"114":1,"135":2,"255":1,"312":1}}],["must",{"2":{"69":1,"158":1,"160":1,"162":1,"228":1,"320":1,"325":1,"334":1,"335":1}}],["much",{"2":{"14":1,"146":1,"262":1}}],["multilingual",{"2":{"317":2,"328":1,"334":1}}],["multiple",{"2":{"1":1,"3":1,"9":1,"17":1,"18":1,"110":1,"121":1,"133":1,"156":1,"201":2,"204":1,"250":1,"266":1,"267":1,"316":1,"317":1,"328":1}}],["multi",{"0":{"3":2},"2":{"1":1,"14":1,"18":1,"19":1,"312":1}}],["mcpservers",{"2":{"201":1}}],["mcp",{"0":{"8":1,"195":1,"301":1,"310":1},"1":{"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1},"2":{"8":2,"18":1,"32":1,"114":2,"186":1,"194":1,"195":1,"196":3,"197":2,"199":2,"200":2,"202":1,"203":3,"285":2,"301":4,"308":1,"310":2,"311":1,"314":2}}],["mounts",{"2":{"320":1}}],["morning",{"2":{"235":1,"240":1,"279":1,"281":1,"303":2}}],["more",{"2":{"1":1,"10":1,"14":3,"18":2,"19":1,"20":1,"57":1,"62":1,"124":1,"133":1,"145":1,"152":2,"161":1,"185":1,"210":1,"216":2,"254":1,"317":1}}],["mono",{"2":{"358":3}}],["monologue",{"2":{"254":1}}],["monday",{"2":{"236":1}}],["month",{"2":{"236":3}}],["monitor",{"2":{"194":1,"211":1}}],["monitoring",{"0":{"184":1},"1":{"185":1},"2":{"180":1}}],["monaco",{"2":{"192":1}}],["move",{"2":{"189":1}}],["mobile",{"2":{"14":1,"41":1,"116":1,"123":1,"126":2}}],["moment",{"2":{"14":3}}],["most",{"2":{"14":1,"74":1,"103":1,"115":1,"120":1,"160":1,"206":1,"220":1,"225":1,"231":1,"254":1,"271":1,"279":1,"293":1}}],["modify",{"2":{"156":1,"192":1,"209":1}}],["modules",{"2":{"8":1,"264":1}}],["modes",{"0":{"327":1},"1":{"328":1},"2":{"226":1,"316":1,"317":1,"326":1,"339":1,"341":1}}],["modelcontextprotocol",{"2":{"198":1}}],["model",{"0":{"224":1,"225":1,"231":1,"279":1,"297":1,"358":1},"1":{"226":1,"227":1,"228":1},"2":{"10":1,"11":1,"15":1,"18":1,"40":1,"103":1,"114":1,"116":14,"117":3,"118":2,"120":1,"129":1,"145":2,"146":1,"147":3,"151":2,"152":4,"183":2,"195":1,"214":1,"215":1,"221":1,"223":2,"224":1,"225":3,"226":6,"227":2,"228":4,"231":4,"254":1,"262":1,"267":1,"278":1,"279":2,"280":2,"285":1,"292":2,"296":4,"297":15,"313":3,"317":5,"327":1,"328":2,"330":2,"334":1,"335":1,"352":3,"353":3,"357":1,"358":1,"359":2,"360":1}}],["models",{"0":{"9":1,"216":1,"223":1,"228":1,"229":1,"230":1},"1":{"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1},"2":{"9":5,"11":1,"13":1,"16":1,"114":1,"115":1,"116":3,"216":4,"218":1,"222":1,"223":4,"224":5,"229":2,"230":3,"231":1,"232":1,"285":1,"297":1,"313":1,"317":1,"352":1}}],["mode",{"0":{"6":1,"37":1,"61":1,"328":1,"333":1,"334":1,"335":1},"2":{"37":1,"39":1,"61":2,"70":2,"71":1,"120":1,"135":1,"139":1,"141":1,"206":1,"211":1,"215":1,"253":1,"317":1,"327":1,"328":2,"330":2}}],["macos",{"2":{"320":1}}],["machine",{"2":{"162":2,"169":1,"170":1,"190":1}}],["masked",{"2":{"317":1}}],["marked",{"2":{"282":1}}],["markdown",{"2":{"26":1,"45":1,"46":1,"49":2,"51":1,"57":1,"74":1,"78":1,"114":1,"265":2,"270":1}}],["max",{"2":{"235":1,"240":1,"241":1,"242":1}}],["maximum",{"2":{"225":1}}],["mapped",{"2":{"138":1}}],["mail",{"2":{"180":1}}],["mailgun",{"2":{"39":1,"174":1,"176":1}}],["mainland",{"0":{"321":1},"2":{"319":1,"321":1,"325":1}}],["maintain",{"2":{"156":1,"252":1}}],["maintains",{"2":{"6":1,"24":1,"142":1,"251":1}}],["maintenance",{"2":{"118":1,"210":1,"233":1}}],["main",{"2":{"116":1,"117":1,"152":1,"183":1,"219":1,"224":1,"313":1,"315":1,"316":1}}],["may",{"2":{"23":1,"41":1,"69":1,"206":1,"226":1,"247":1,"253":1,"268":1,"322":1}}],["making",{"2":{"20":2,"272":1}}],["make",{"2":{"16":1,"43":1,"64":1,"71":1,"205":1,"210":1}}],["makes",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"13":1,"16":1,"215":1,"254":1}}],["matter",{"2":{"119":1}}],["matters",{"2":{"97":1,"230":1,"266":1}}],["mattered",{"2":{"14":1}}],["match",{"2":{"162":1,"320":1,"325":1}}],["matching",{"2":{"66":1,"97":2}}],["matches",{"2":{"40":1,"94":1,"95":1,"97":2,"119":1,"162":1}}],["matrix",{"0":{"53":1,"54":1},"1":{"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"1":1,"7":1,"39":2,"53":3,"54":5,"55":5,"56":1,"57":1,"58":1,"114":1,"133":1,"135":2,"312":1}}],["managing",{"0":{"98":1,"127":1,"167":1,"185":1,"190":1,"209":1,"248":1,"258":1,"269":1,"331":1},"1":{"99":1,"100":1,"101":1,"102":1,"259":1,"260":1,"261":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"342":1}}],["manages",{"2":{"216":1,"252":1,"303":1,"338":1}}],["managed",{"2":{"160":1,"216":1,"230":1,"253":1,"266":3,"268":4,"270":1,"271":1,"272":2,"274":3,"276":2,"314":1}}],["managers",{"2":{"156":1}}],["manager",{"2":{"114":1,"193":1}}],["manage",{"2":{"10":1,"113":1,"120":1,"125":1,"131":1,"142":1,"154":1,"157":1,"172":1,"175":1,"178":1,"187":1,"194":1,"207":1,"224":1,"264":1,"276":1,"285":1,"337":1,"340":1,"341":1}}],["management",{"0":{"5":1,"111":1,"155":1,"187":1,"204":1},"1":{"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1},"2":{"8":1,"10":2,"18":1,"38":1,"80":2,"114":1,"129":1,"131":1,"144":1,"154":1,"173":1,"232":1,"337":1,"341":1,"346":2,"351":2}}],["manual",{"0":{"320":1},"1":{"321":1},"2":{"87":1,"233":1,"326":1}}],["manually",{"2":{"24":1,"103":1,"130":1,"194":1,"196":1,"202":1,"208":1,"223":1,"276":1,"337":1}}],["manifesto",{"2":{"13":1}}],["many",{"2":{"7":1,"14":1,"151":1,"158":1,"214":1}}],["me",{"2":{"239":1}}],["merge",{"2":{"144":1,"146":1,"210":1}}],["medium",{"2":{"116":1,"226":1,"296":1}}],["media",{"2":{"22":1,"26":1,"46":1,"57":1,"73":1,"90":1}}],["mental",{"0":{"231":1},"2":{"103":1,"267":1}}],["mentions",{"2":{"42":1,"62":2}}],["mention",{"2":{"25":1,"63":1,"281":1}}],["meaning",{"2":{"226":1,"236":1,"267":1,"280":1}}],["mean",{"0":{"103":1}}],["means",{"2":{"1":1,"97":1,"162":1,"254":2,"275":1}}],["metadata",{"2":{"62":1,"151":1}}],["metaphors",{"2":{"14":1}}],["metrics",{"2":{"6":1}}],["message",{"2":{"23":1,"25":2,"29":1,"30":1,"32":1,"36":1,"37":2,"39":1,"50":1,"51":2,"56":1,"57":1,"63":4,"66":1,"68":1,"72":2,"73":1,"78":1,"83":1,"90":1,"94":1,"95":1,"100":1,"135":1,"151":1,"206":1,"241":1,"251":1,"254":1,"256":1,"261":1,"262":1,"281":1,"285":1,"290":1}}],["messages",{"2":{"9":1,"30":1,"36":1,"39":1,"41":1,"51":1,"53":1,"57":2,"59":1,"62":5,"66":3,"67":1,"71":1,"82":2,"83":2,"88":1,"90":2,"108":1,"138":1,"139":1,"145":1,"151":1,"208":1,"219":2,"252":1,"256":1,"262":1,"287":1}}],["messaging",{"0":{"25":1},"2":{"8":1,"23":1,"39":5,"53":1,"85":1,"111":1,"132":1,"133":1,"135":1}}],["mem0",{"0":{"342":1,"343":1,"344":1,"345":1},"1":{"343":1,"344":1,"345":1,"346":1},"2":{"205":1,"339":2,"341":2,"342":3,"343":1,"344":3,"345":1,"346":2}}],["memories",{"0":{"208":1},"2":{"114":1,"144":1,"153":1,"206":2,"207":1,"209":2,"210":4,"211":2,"213":1,"215":2,"263":1,"330":1,"333":1,"337":4,"340":1}}],["memory",{"0":{"5":1,"153":1,"204":1,"206":1,"210":1,"214":1,"298":1,"326":1,"327":1,"336":1,"337":1,"338":1,"342":1,"347":1},"1":{"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"327":1,"328":2,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"339":1,"340":1,"341":1,"343":1,"344":1,"345":1,"346":1,"348":1,"349":1,"350":1,"351":1},"2":{"1":3,"5":4,"8":1,"9":1,"14":1,"15":1,"17":1,"18":3,"19":1,"20":1,"111":1,"114":3,"115":1,"116":3,"118":1,"122":1,"131":3,"144":3,"146":3,"153":5,"154":2,"186":1,"204":1,"205":6,"206":2,"207":1,"208":3,"209":1,"210":3,"211":2,"212":5,"213":2,"214":5,"215":4,"224":1,"229":1,"231":1,"232":1,"263":1,"285":2,"298":4,"307":4,"312":2,"314":4,"316":2,"317":5,"326":8,"329":2,"330":2,"336":2,"337":5,"338":5,"339":4,"340":3,"341":6,"342":2,"343":2,"345":1,"346":4,"347":3,"348":2,"350":1,"351":4}}],["memoh123",{"2":{"319":1,"325":1}}],["memohai",{"2":{"311":1,"320":1}}],["memohbot",{"2":{"281":1}}],["memoh",{"0":{"0":1,"1":1,"2":1,"12":1,"24":1,"31":1,"44":1,"49":1,"55":1,"65":1,"70":1,"76":1,"81":1,"86":1,"312":1},"1":{"1":1,"2":1,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"313":1,"314":1},"2":{"1":1,"3":1,"5":1,"6":1,"7":2,"9":1,"13":1,"15":1,"16":1,"17":1,"19":2,"20":3,"21":1,"22":1,"24":2,"26":1,"27":1,"31":1,"33":1,"37":2,"39":2,"40":1,"41":2,"42":1,"43":1,"44":2,"45":1,"47":1,"49":1,"50":2,"53":1,"55":1,"59":1,"61":1,"62":1,"65":1,"68":1,"70":2,"71":2,"72":2,"74":2,"75":2,"76":1,"77":2,"79":1,"81":1,"85":1,"86":1,"87":2,"91":1,"92":1,"116":1,"123":1,"130":1,"133":1,"138":1,"139":2,"141":2,"142":1,"147":2,"152":1,"155":1,"160":1,"162":3,"172":1,"173":1,"187":1,"195":1,"198":1,"200":3,"202":1,"204":1,"206":1,"214":1,"216":2,"219":1,"222":1,"223":1,"224":1,"226":1,"227":2,"228":1,"236":1,"243":1,"253":1,"254":1,"265":1,"266":5,"267":1,"268":1,"270":1,"271":1,"274":2,"276":3,"278":1,"280":1,"281":1,"291":1,"307":1,"308":1,"310":1,"312":1,"313":1,"315":1,"316":1,"319":10,"320":2,"321":1,"325":2,"326":2,"338":1,"339":2,"352":1}}],["members",{"2":{"27":1,"29":1}}],["member",{"2":{"1":1,"95":1,"312":1}}],["avoid",{"2":{"265":1}}],["avatar",{"2":{"112":1}}],["available",{"0":{"339":1,"354":1},"2":{"23":1,"116":1,"130":1,"147":1,"151":1,"202":1,"234":1,"263":1,"274":1,"282":1,"304":1,"323":1,"355":1,"358":1}}],["audio",{"2":{"352":1,"358":3}}],["auditing",{"2":{"172":1}}],["audit",{"2":{"151":1,"179":1,"184":1}}],["auth",{"2":{"320":1,"323":1}}],["authenticates",{"2":{"221":1}}],["authentication",{"0":{"200":1},"2":{"81":1,"199":1,"200":2,"218":1,"344":1,"349":1}}],["authorization",{"2":{"200":1,"222":3}}],["authorized",{"2":{"106":1}}],["authorize",{"2":{"30":1,"64":1,"200":1}}],["automate",{"2":{"233":1}}],["automatic",{"0":{"147":1},"2":{"118":1,"147":2,"151":1,"182":1,"326":1}}],["automatically",{"2":{"24":1,"55":1,"56":1,"87":1,"88":1,"200":1,"202":2,"203":1,"215":1,"239":1,"241":1,"250":1,"253":1,"268":1,"321":1,"357":1}}],["automation",{"0":{"234":1,"302":1},"1":{"303":1,"304":1,"305":1},"2":{"8":1,"116":1,"120":1,"124":1,"242":1,"316":1,"320":1}}],["autonomy",{"0":{"182":1}}],["autonomous",{"2":{"6":1,"115":1,"117":2,"181":1,"186":1,"242":1,"253":1,"263":1}}],["auto",{"2":{"55":1,"56":1,"259":1,"319":1,"353":1}}],["affecting",{"2":{"155":1}}],["affects",{"2":{"146":1}}],["after",{"0":{"337":1},"2":{"25":1,"45":1,"66":2,"70":1,"88":1,"92":1,"101":1,"115":2,"119":2,"126":1,"128":1,"131":1,"140":1,"147":1,"163":1,"200":1,"222":1,"223":1,"268":1,"279":1,"322":1,"330":1,"341":1,"344":1,"349":1}}],["abort",{"2":{"279":1}}],["above",{"2":{"97":1}}],["about",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"21":1,"118":1,"144":1,"151":1,"159":1,"206":1,"313":1}}],["abcdefghijklmnopqrstuvwxyz",{"2":{"75":1}}],["aware",{"2":{"45":1}}],["aes",{"2":{"40":1,"69":1,"70":1,"71":1,"141":1}}],["am",{"2":{"235":1,"236":2,"239":1}}],["amd",{"2":{"161":2,"162":2}}],["amp",{"2":{"34":1,"38":1,"62":1,"64":1}}],["ambient",{"2":{"14":1}}],["adjustment",{"2":{"358":1}}],["adoption",{"2":{"314":1}}],["adopt",{"0":{"274":1},"2":{"268":2,"274":3,"276":1,"277":1}}],["advanced",{"0":{"120":1,"160":1},"1":{"161":1,"162":1,"163":1},"2":{"120":1,"160":2,"161":1,"265":1}}],["admin123",{"2":{"319":1,"322":1}}],["admins",{"2":{"94":1,"106":1}}],["admin",{"2":{"80":1,"92":1,"97":1,"319":3,"320":2,"322":1,"323":2}}],["address",{"2":{"174":1,"178":1,"179":1,"323":2}}],["adding",{"0":{"100":1,"137":1,"178":1,"247":1},"2":{"225":1}}],["additional",{"2":{"247":1,"333":1}}],["addition",{"2":{"61":1}}],["add",{"0":{"66":1,"70":1,"86":1,"270":1},"2":{"24":1,"30":1,"31":1,"37":2,"41":1,"44":1,"49":1,"55":1,"62":3,"63":1,"65":1,"70":1,"76":1,"81":1,"86":1,"92":2,"99":1,"100":1,"103":1,"106":1,"107":1,"108":1,"109":1,"125":1,"137":1,"176":1,"178":1,"201":3,"218":1,"223":2,"247":1,"270":1,"321":1,"329":1,"343":1,"348":1,"353":1,"357":1}}],["adapters",{"2":{"40":1,"135":1,"255":1,"278":1,"287":1}}],["adapter",{"2":{"7":1,"22":1,"42":1,"61":1,"62":1,"63":1,"68":2,"73":1,"255":1,"287":1}}],["a2a",{"2":{"19":1}}],["approaching",{"2":{"227":1}}],["approximate",{"2":{"225":1}}],["appropriate",{"2":{"163":1}}],["approving",{"2":{"41":1}}],["approved",{"2":{"38":1}}],["approval",{"2":{"38":1,"48":1}}],["apps",{"2":{"80":1}}],["appsecret",{"2":{"48":2,"49":1}}],["appears",{"2":{"309":1}}],["appear",{"2":{"78":1,"253":1,"266":1,"276":1}}],["appid",{"2":{"48":1,"49":1}}],["applied",{"2":{"97":2,"163":1}}],["applies",{"2":{"94":1,"100":2}}],["applications",{"2":{"30":1,"132":1}}],["application",{"0":{"28":1},"2":{"28":1,"54":1,"80":1}}],["apply",{"2":{"36":1,"192":1,"230":1}}],["app",{"0":{"23":1,"34":1,"38":1,"60":1,"64":1},"2":{"14":1,"20":1,"23":6,"24":2,"34":4,"37":3,"38":1,"40":2,"41":3,"60":2,"61":2,"62":1,"63":1,"64":3,"65":1,"66":2,"69":2,"70":2,"80":1,"139":1,"142":2,"320":1}}],["apis",{"2":{"17":1,"22":1,"69":1,"216":1}}],["api",{"0":{"240":1},"2":{"9":1,"41":1,"54":1,"60":1,"75":2,"76":1,"87":1,"120":1,"138":1,"176":1,"206":1,"215":1,"217":2,"218":3,"219":3,"220":1,"221":2,"240":2,"244":1,"247":2,"317":3,"322":1,"323":1,"327":1,"328":2,"339":3,"341":1,"342":1,"344":4,"346":1,"347":1,"349":3,"351":1,"354":2,"356":2}}],["aggregator",{"2":{"245":1}}],["aggressive",{"2":{"210":1}}],["aggressively",{"2":{"118":1,"147":1}}],["against",{"2":{"152":1}}],["again",{"2":{"48":1,"66":1,"87":1}}],["agreement",{"2":{"14":1}}],["agent2agent",{"2":{"19":1}}],["agents",{"2":{"13":1,"14":1,"16":1,"266":2}}],["agent",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"1":2,"13":1,"14":1,"19":1,"20":1,"111":1,"126":2,"234":1,"235":1,"241":2,"312":1,"315":1,"316":1}}],["architecture",{"0":{"316":1},"1":{"317":1}}],["archive",{"2":{"169":2,"170":2}}],["arguments",{"2":{"198":2,"279":2}}],["argument",{"2":{"130":1,"281":1}}],["around",{"2":{"14":1}}],["aren",{"2":{"181":1}}],["are",{"2":{"9":1,"11":1,"26":1,"39":1,"50":1,"57":2,"63":1,"73":1,"77":1,"83":1,"92":4,"97":2,"101":1,"103":1,"108":1,"115":1,"128":1,"130":1,"137":1,"138":1,"163":1,"170":1,"180":1,"200":1,"206":1,"209":1,"214":2,"215":1,"216":1,"220":1,"224":1,"225":1,"229":1,"230":1,"238":1,"252":2,"253":2,"254":2,"256":1,"259":1,"263":4,"264":1,"266":2,"275":3,"277":1,"278":2,"279":2,"281":2,"282":3,"291":1,"316":2,"322":1,"330":1,"333":1,"346":1,"351":1}}],["alternative",{"2":{"347":1}}],["along",{"2":{"241":1}}],["aloud",{"2":{"219":1,"352":1,"354":1,"356":1,"357":1,"358":1}}],["alerts",{"2":{"185":1}}],["alert",{"2":{"184":1}}],["aligned",{"2":{"141":1}}],["all",{"2":{"91":1,"92":2,"95":3,"100":1,"103":4,"105":1,"106":1,"107":1,"108":1,"112":1,"122":2,"179":1,"202":1,"211":2,"237":1,"256":1,"259":1,"263":2,"296":1,"297":2,"298":2,"299":2,"300":2,"301":2,"303":2,"315":1,"319":2,"323":1}}],["allowing",{"2":{"132":1,"180":1,"195":1,"251":1}}],["allow",{"2":{"91":1,"92":3,"94":2,"95":1,"96":1,"97":1,"100":1,"102":1,"103":3,"105":2,"106":1,"107":2,"108":1,"109":1,"112":1,"164":1,"233":1,"296":1}}],["allowed",{"2":{"43":1,"92":3,"94":1,"97":1,"105":1,"291":1}}],["allows",{"2":{"27":1,"33":1,"47":1,"53":1,"59":1,"79":1,"85":1,"126":1,"139":1,"155":1,"173":1,"181":1,"191":1,"204":1,"243":1}}],["already",{"2":{"14":1,"162":1,"205":1,"222":1,"223":1,"235":1,"274":1,"282":1,"288":1}}],["always",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"13":1,"14":2,"16":1,"17":1,"20":2,"97":1,"316":1}}],["also",{"2":{"7":1,"9":1,"16":1,"23":1,"62":1,"69":1,"70":1,"78":1,"117":1,"118":1,"120":1,"147":1,"149":1,"152":1,"179":1,"194":1,"200":1,"202":1,"223":1,"226":1,"240":1,"262":1,"275":1,"320":1,"325":1}}],["ascii",{"2":{"265":1}}],["ask",{"2":{"239":1}}],["asia",{"2":{"126":1}}],["assistant",{"2":{"254":1}}],["assignment",{"2":{"352":1}}],["assign",{"2":{"228":1,"232":1,"340":1}}],["assigning",{"0":{"128":1,"249":1,"336":1,"345":1,"350":1,"359":1},"2":{"360":1}}],["assigned",{"2":{"116":1,"123":1,"186":1,"206":1,"215":1,"250":1,"337":1,"341":1,"346":1,"351":1}}],["associated",{"2":{"122":1,"178":1,"262":1}}],["as",{"0":{"174":1},"2":{"6":1,"10":1,"16":1,"17":3,"18":1,"19":2,"20":1,"23":1,"42":1,"54":1,"57":1,"78":1,"112":1,"114":1,"116":2,"120":1,"123":1,"126":2,"129":1,"133":1,"145":1,"152":1,"156":1,"159":1,"162":1,"180":1,"210":1,"215":1,"217":2,"218":1,"219":1,"225":2,"226":2,"229":1,"231":1,"253":1,"254":1,"255":1,"256":1,"265":2,"266":2,"268":1,"276":1,"278":1,"279":2,"281":2,"282":1,"287":1,"296":1,"344":1,"346":1,"347":1,"349":1,"351":1,"357":1}}],["another",{"2":{"173":1,"267":1,"268":1}}],["answer",{"2":{"103":1,"250":1}}],["anything",{"2":{"103":1}}],["anyone",{"0":{"105":1},"2":{"54":1,"92":1,"94":1}}],["any",{"2":{"39":1,"53":1,"54":1,"159":1,"162":1,"186":1,"229":1,"233":1,"234":1,"241":1,"310":1}}],["anchor",{"2":{"14":1}}],["annoying",{"2":{"14":1}}],["anthropic",{"2":{"9":1,"217":1,"219":2}}],["an",{"0":{"12":1,"310":1,"348":1,"349":1,"350":1,"357":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"5":1,"14":3,"17":1,"19":2,"20":3,"41":1,"43":1,"54":1,"61":2,"69":1,"75":2,"91":1,"92":1,"94":1,"95":2,"96":1,"97":1,"99":1,"100":1,"102":1,"108":1,"109":1,"111":1,"116":1,"119":1,"120":1,"151":1,"160":1,"162":1,"163":1,"170":1,"174":1,"179":2,"184":1,"193":1,"202":1,"203":1,"205":1,"206":1,"212":1,"217":1,"227":1,"228":1,"251":1,"254":1,"310":1,"317":2,"328":1,"335":1,"339":1,"347":1}}],["and",{"0":{"3":1,"5":1,"6":1,"8":1,"9":1,"10":1,"43":1,"72":1,"119":1,"151":1,"168":1,"173":1,"179":1,"184":1,"189":1,"191":1,"209":1,"216":1,"276":1,"289":1,"302":1},"1":{"169":1,"170":1,"171":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"185":1,"192":1,"193":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"290":1,"291":1,"292":1,"293":1,"294":1,"303":1,"304":1,"305":1},"2":{"1":3,"3":2,"4":3,"5":1,"6":3,"7":1,"8":5,"9":1,"10":3,"11":3,"13":1,"14":6,"16":4,"17":3,"18":7,"19":6,"20":4,"22":3,"23":1,"24":3,"25":1,"26":2,"27":1,"28":2,"29":1,"30":2,"31":2,"32":1,"34":3,"36":2,"37":3,"38":2,"39":5,"40":1,"41":2,"42":1,"43":1,"44":3,"45":1,"48":2,"49":3,"50":2,"51":3,"53":1,"55":2,"56":1,"57":2,"59":2,"60":2,"62":4,"63":1,"64":2,"65":2,"66":2,"67":4,"68":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":2,"77":2,"78":1,"80":1,"81":2,"82":1,"86":1,"87":1,"90":1,"92":2,"94":1,"100":1,"101":1,"103":3,"106":1,"110":2,"111":2,"114":10,"115":1,"116":5,"119":1,"120":1,"122":3,"123":2,"124":3,"126":1,"127":1,"128":1,"129":1,"133":1,"135":3,"137":2,"138":1,"139":1,"141":3,"142":2,"143":2,"144":1,"149":1,"150":1,"151":1,"155":1,"156":1,"158":1,"159":1,"160":1,"162":1,"163":2,"164":1,"166":1,"167":1,"168":1,"172":1,"173":2,"178":2,"180":1,"182":1,"188":1,"190":1,"192":2,"194":2,"195":1,"196":2,"198":1,"200":1,"201":2,"202":1,"203":1,"204":1,"206":3,"210":1,"212":1,"215":1,"216":1,"217":1,"220":1,"222":3,"224":3,"225":1,"229":1,"230":1,"231":1,"232":2,"234":1,"235":1,"236":2,"237":1,"239":2,"240":1,"241":1,"242":1,"243":1,"245":1,"248":1,"249":2,"250":1,"251":2,"253":3,"254":4,"256":1,"259":1,"263":1,"264":2,"265":3,"266":1,"267":1,"268":1,"274":1,"276":1,"277":1,"278":2,"279":1,"282":1,"285":7,"287":1,"288":1,"291":1,"297":1,"307":1,"308":1,"309":1,"310":1,"312":2,"313":6,"314":5,"315":2,"316":3,"319":4,"320":1,"321":1,"322":1,"323":5,"326":4,"328":1,"330":2,"331":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":3,"339":1,"340":1,"342":1,"344":1,"345":1,"346":1,"349":1,"350":1,"351":1,"352":1,"353":3,"356":1,"360":1}}],["acl",{"0":{"92":1,"119":1},"2":{"91":1,"92":1,"94":1,"95":1,"97":1,"99":1,"105":1,"106":1,"107":1,"110":2,"112":1,"114":1,"115":2,"119":3,"285":1,"291":2,"296":1,"314":1}}],["actions",{"0":{"158":1},"2":{"129":1,"180":1,"181":1,"233":1,"280":1,"282":3,"290":1,"292":1,"293":1,"294":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1,"304":1,"305":1,"307":1}}],["action",{"2":{"122":2,"129":1,"184":1,"190":1,"210":1,"254":1,"279":4,"280":2,"285":1,"290":1,"292":1,"293":1,"294":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1,"304":1,"305":1,"307":1}}],["activities",{"2":{"186":1}}],["activity",{"2":{"115":1,"117":1,"242":1,"253":2,"259":1,"263":1}}],["activate",{"2":{"41":1,"143":1}}],["active",{"2":{"5":2,"143":1,"144":1,"146":1,"149":1,"152":1,"153":1,"159":1,"172":1,"201":1,"202":1,"203":1,"205":1,"210":1,"214":1,"235":1,"255":1,"256":1,"259":1,"262":1,"267":1,"275":2,"290":2,"298":1,"299":1,"300":1,"307":1,"314":1}}],["actual",{"2":{"40":1,"265":1,"337":1,"340":1}}],["actually",{"0":{"103":1},"2":{"13":1,"14":2,"151":1}}],["act",{"2":{"23":1,"54":1}}],["acts",{"2":{"17":1,"124":1,"133":1,"156":1}}],["accurate",{"2":{"250":1}}],["accumulate",{"2":{"210":1}}],["accumulating",{"2":{"14":1}}],["accepted",{"2":{"281":1}}],["accept",{"2":{"56":1,"226":1}}],["access",{"0":{"91":1,"98":1,"108":1,"109":1,"110":1,"119":1,"291":1,"322":1},"1":{"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":2,"100":2,"101":2,"102":2,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1},"2":{"10":1,"11":1,"18":1,"32":1,"36":1,"39":1,"41":1,"43":2,"44":1,"54":2,"55":2,"57":1,"91":2,"92":2,"94":1,"95":2,"98":2,"99":1,"102":1,"110":2,"112":1,"114":3,"115":1,"119":2,"121":1,"123":1,"160":1,"196":1,"200":1,"221":1,"222":2,"239":1,"285":1,"291":1,"312":1,"314":2,"321":1}}],["accounts",{"2":{"291":1}}],["account",{"0":{"40":1,"43":1,"54":1,"68":1,"69":1,"141":1},"1":{"69":1,"70":1,"71":1,"72":1,"73":1},"2":{"1":1,"7":2,"39":2,"40":3,"42":1,"43":4,"48":2,"50":1,"54":3,"55":1,"68":2,"69":1,"70":1,"71":1,"72":1,"77":1,"135":5,"141":2,"222":1,"312":1,"323":1}}],["across",{"2":{"3":1,"5":1,"110":1,"115":1,"156":1,"204":1,"214":1,"255":1,"263":1,"312":1,"354":1,"356":1,"358":1}}],["attached",{"2":{"159":1,"163":2}}],["attachment",{"2":{"39":1,"57":1,"74":1,"135":1}}],["attachments",{"2":{"26":1,"32":1,"46":1,"51":1,"59":1,"67":1,"73":1,"78":1,"90":1}}],["attach",{"2":{"30":1}}],["attempt",{"2":{"13":1}}],["at",{"0":{"275":1},"2":{"3":1,"7":1,"18":1,"36":1,"95":1,"107":1,"119":1,"122":1,"130":1,"179":1,"182":1,"201":1,"221":1,"235":1,"236":4,"239":1,"265":1,"317":1,"320":1}}],["ai",{"2":{"1":2,"9":1,"13":1,"14":2,"15":1,"16":1,"18":1,"20":1,"39":1,"111":1,"219":1,"245":1,"312":1,"315":1,"316":1,"344":1}}],["a",{"0":{"23":1,"28":1,"34":1,"43":1,"48":1,"54":1,"60":1,"75":1,"80":1,"99":1,"112":1,"122":1,"125":1,"126":1,"128":2,"137":1,"165":1,"166":1,"174":1,"176":1,"178":1,"218":1,"247":1,"249":2,"255":1,"265":1,"309":1,"329":1,"330":1,"336":2,"343":1,"344":1,"345":2,"350":1,"359":1},"1":{"127":1,"256":1,"257":1,"331":1},"2":{"1":2,"4":1,"6":1,"7":1,"8":1,"9":1,"11":1,"13":3,"14":11,"15":1,"17":2,"18":1,"19":4,"20":3,"24":1,"25":2,"28":2,"34":1,"37":2,"38":1,"41":4,"42":3,"43":1,"48":1,"50":1,"54":3,"56":2,"60":1,"66":2,"69":1,"70":1,"72":1,"75":3,"77":1,"80":1,"85":1,"87":3,"92":2,"94":2,"95":3,"97":1,"98":1,"100":7,"102":6,"103":1,"109":1,"110":1,"111":1,"112":1,"113":1,"115":2,"116":1,"119":2,"120":1,"122":1,"123":6,"124":2,"125":1,"126":1,"127":2,"129":1,"131":1,"133":2,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":2,"145":2,"147":1,"150":1,"151":2,"152":1,"155":1,"158":1,"160":1,"162":1,"164":1,"165":2,"167":2,"169":1,"171":1,"172":1,"174":5,"180":1,"182":3,"184":2,"186":3,"188":2,"189":1,"190":2,"192":1,"193":1,"196":2,"198":2,"199":1,"200":1,"201":3,"202":1,"205":3,"206":3,"208":1,"217":1,"220":1,"221":2,"222":2,"223":2,"225":1,"226":2,"227":1,"228":2,"232":1,"234":5,"235":3,"239":5,"241":1,"244":4,"247":1,"248":1,"250":3,"251":4,"252":4,"253":7,"254":7,"255":5,"256":3,"257":2,"260":1,"261":1,"262":1,"263":2,"264":1,"265":5,"266":1,"268":4,"269":1,"271":1,"272":2,"273":3,"274":4,"276":2,"277":1,"278":1,"279":5,"281":4,"287":4,"288":2,"291":1,"309":1,"310":1,"312":1,"313":1,"317":3,"319":1,"323":1,"329":1,"330":1,"331":2,"337":1,"338":3,"340":2,"342":1,"343":1,"344":2,"347":3,"348":1,"349":2,"352":4,"353":2,"359":1,"360":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.CEeliA4L.js b/assets/chunks/@localSearchIndexroot.CEeliA4L.js deleted file mode 100644 index eddb929b..00000000 --- a/assets/chunks/@localSearchIndexroot.CEeliA4L.js +++ /dev/null @@ -1 +0,0 @@ -const e='{"documentCount":361,"nextId":361,"documentIds":{"0":"/about.html#about-memoh","1":"/about.html#what-is-memoh","2":"/about.html#what-makes-memoh-different","3":"/about.html#multi-bot-and-multi-user","4":"/about.html#containerized-workspaces","5":"/about.html#long-term-memory-and-context-management","6":"/about.html#sessions-and-discuss-mode","7":"/about.html#broad-channel-coverage","8":"/about.html#tools-skills-mcp-and-supermarket","9":"/about.html#providers-and-models","10":"/about.html#operations-and-ui","11":"/about.html#where-to-start","12":"/blogs/2026-02-16.html#introduction-to-memoh-the-case-for-an-always-on-containerized-home-agent","13":"/blogs/2026-02-16.html#overview","14":"/blogs/2026-02-16.html#story-time","15":"/blogs/2026-02-16.html#what","16":"/blogs/2026-02-16.html#why","17":"/blogs/2026-02-16.html#how","18":"/blogs/2026-02-16.html#features","19":"/blogs/2026-02-16.html#compare-to-openclaw","20":"/blogs/2026-02-16.html#conclusion","21":"/blogs/#blogs","22":"/channels/dingtalk.html#dingtalk-channel-configuration","23":"/channels/dingtalk.html#step-1-create-a-dingtalk-app","24":"/channels/dingtalk.html#step-2-configure-memoh","25":"/channels/dingtalk.html#step-3-verify-messaging","26":"/channels/dingtalk.html#features-supported","27":"/channels/discord.html#discord-channel-configuration","28":"/channels/discord.html#step-1-create-a-discord-application","29":"/channels/discord.html#step-2-configure-bot-settings","30":"/channels/discord.html#step-3-invite-the-bot-to-your-server","31":"/channels/discord.html#step-4-configure-memoh","32":"/channels/discord.html#features-supported","33":"/channels/#channels-overview","34":"/channels/#wechat-vs-wechat-official-account","35":"/channels/#general-setup-flow","36":"/channels/matrix.html#matrix-channel-configuration","37":"/channels/matrix.html#step-1-create-a-matrix-bot-account","38":"/channels/matrix.html#step-2-configure-memoh","39":"/channels/matrix.html#step-3-invite-the-bot","40":"/channels/matrix.html#features-supported","41":"/channels/matrix.html#official-resources","42":"/channels/misskey.html#misskey-channel-configuration","43":"/channels/misskey.html#step-1-prepare-a-misskey-account-and-token","44":"/channels/misskey.html#step-2-configure-memoh","45":"/channels/misskey.html#step-3-start-chatting","46":"/channels/misskey.html#features-supported","47":"/channels/qq.html#qq-channel-configuration","48":"/channels/qq.html#step-1-create-a-qq-bot","49":"/channels/qq.html#step-2-configure-memoh","50":"/channels/qq.html#step-3-bind-your-identity-optional","51":"/channels/qq.html#features-supported","52":"/channels/qq.html#official-resources","53":"/channels/feishu.html#feishu-lark-channel-configuration","54":"/channels/feishu.html#step-1-create-a-feishu-app","55":"/channels/feishu.html#step-2-enable-bot-capability","56":"/channels/feishu.html#step-3-configure-permissions","57":"/channels/feishu.html#step-4-configure-events-webhook-mode","58":"/channels/feishu.html#step-5-publish-your-app","59":"/channels/slack.html#slack-channel-configuration","60":"/channels/slack.html#step-1-create-a-slack-app","61":"/channels/slack.html#step-2-enable-socket-mode","62":"/channels/slack.html#step-3-configure-bot-token-scopes","63":"/channels/slack.html#step-4-subscribe-to-bot-events","64":"/channels/slack.html#step-5-install-the-app-to-your-workspace","65":"/channels/slack.html#step-6-configure-memoh","66":"/channels/slack.html#step-7-add-the-bot-to-conversations","67":"/channels/slack.html#features-supported","68":"/channels/telegram.html#telegram-channel-configuration","69":"/channels/telegram.html#step-1-create-a-telegram-bot","70":"/channels/telegram.html#step-2-configure-memoh","71":"/channels/telegram.html#step-3-bind-your-identity-optional","72":"/channels/telegram.html#features-supported","73":"/channels/wechatoa.html#wechat-official-account-channel-configuration","74":"/channels/wechatoa.html#step-1-prepare-official-account-credentials","75":"/channels/wechatoa.html#step-2-add-the-channel-in-memoh","76":"/channels/wechatoa.html#step-3-configure-the-wechat-platform","77":"/channels/wechatoa.html#step-4-enable-and-test","78":"/channels/wechatoa.html#features-supported","79":"/channels/wecom.html#wecom-wework-channel-configuration","80":"/channels/wecom.html#step-1-create-a-wecom-bot","81":"/channels/wecom.html#step-2-configure-memoh","82":"/channels/wecom.html#step-3-start-chatting","83":"/channels/wecom.html#features-supported","84":"/channels/wecom.html#official-resources","85":"/channels/weixin.html#wechat-channel-configuration","86":"/channels/weixin.html#step-1-add-wechat-channel-in-memoh","87":"/channels/weixin.html#step-2-scan-the-qr-code","88":"/channels/weixin.html#step-3-start-chatting","89":"/channels/weixin.html#optional-settings","90":"/channels/weixin.html#features-supported","91":"/getting-started/access.html#bot-access-control","92":"/getting-started/access.html#quick-start-acl-presets","93":"/getting-started/access.html#concepts","94":"/getting-started/access.html#default-effect","95":"/getting-started/access.html#subject-types","96":"/getting-started/access.html#rule-effects","97":"/getting-started/access.html#priority-based-evaluation","98":"/getting-started/access.html#managing-access","99":"/getting-started/access.html#start-with-a-preset-then-refine","100":"/getting-started/access.html#adding-rules","101":"/getting-started/access.html#reordering-rules","102":"/getting-started/access.html#source-scope","103":"/getting-started/access.html#what-the-presets-actually-mean","104":"/getting-started/access.html#examples","105":"/getting-started/access.html#open-bot-anyone-can-chat","106":"/getting-started/access.html#private-bot-with-selected-users","107":"/getting-started/access.html#open-bot-with-blocked-users","108":"/getting-started/access.html#platform-specific-access","109":"/getting-started/access.html#channel-scoped-access","110":"/getting-started/access.html#debugging-access-decisions","111":"/getting-started/bot.html#bot-management","112":"/getting-started/bot.html#creating-a-bot","113":"/getting-started/bot.html#bot-detail-page","114":"/getting-started/bot.html#tab-overview","115":"/getting-started/bot.html#configuring-the-bot-s-core-settings","116":"/getting-started/bot.html#general-tab-reference","117":"/getting-started/bot.html#heartbeat-tab-reference","118":"/getting-started/bot.html#compaction-tab-reference","119":"/getting-started/bot.html#access-and-acl","120":"/getting-started/bot.html#discuss-related-advanced-settings","121":"/getting-started/bot.html#terminal-tab","122":"/getting-started/bot.html#deleting-a-bot","123":"/getting-started/browser.html#browser-contexts","124":"/getting-started/browser.html#concept-browser-gateway","125":"/getting-started/browser.html#creating-a-browser-context","126":"/getting-started/browser.html#configuring-a-browser-context","127":"/getting-started/browser.html#managing-contexts","128":"/getting-started/browser.html#assigning-a-browser-context-to-a-bot","129":"/getting-started/browser.html#bot-interaction","130":"/getting-started/browser.html#browser-core-selection","131":"/getting-started/browser.html#next-steps","132":"/getting-started/channels.html#bot-channels","133":"/getting-started/channels.html#concept-unified-communication","134":"/getting-started/channels.html#supported-channels","135":"/getting-started/channels.html#platform-guides","136":"/getting-started/channels.html#configuration-flow","137":"/getting-started/channels.html#_1-adding-a-channel","138":"/getting-started/channels.html#_2-common-fields","139":"/getting-started/channels.html#_3-special-case-feishu-webhook","140":"/getting-started/channels.html#_4-special-case-wechat-qr-login","141":"/getting-started/channels.html#_5-special-case-wechat-official-account-webhook","142":"/getting-started/channels.html#_6-special-case-dingtalk-stream-connection","143":"/getting-started/channels.html#operations","144":"/getting-started/compaction.html#context-compaction","145":"/getting-started/compaction.html#why-it-exists","146":"/getting-started/compaction.html#what-it-changes","147":"/getting-started/compaction.html#automatic-compaction","148":"/getting-started/compaction.html#immediate-compaction","149":"/getting-started/compaction.html#from-the-session-status-panel","150":"/getting-started/compaction.html#from-slash-commands","151":"/getting-started/compaction.html#status-and-logs","152":"/getting-started/compaction.html#relationship-to-context-window","153":"/getting-started/compaction.html#context-compaction-vs-memory-compaction","154":"/getting-started/compaction.html#next-steps","155":"/getting-started/container.html#bot-container-management","156":"/getting-started/container.html#concept-the-isolated-workspace","157":"/getting-started/container.html#operations","158":"/getting-started/container.html#lifecycle-actions","159":"/getting-started/container.html#container-information","160":"/getting-started/container.html#advanced-provide-cdi-devices","161":"/getting-started/container.html#configure-cdi-devices","162":"/getting-started/container.html#host-requirements","163":"/getting-started/container.html#important-behavior","164":"/getting-started/container.html#snapshots","165":"/getting-started/container.html#creating-a-snapshot","166":"/getting-started/container.html#restoring-a-snapshot","167":"/getting-started/container.html#managing-snapshots","168":"/getting-started/container.html#data-export-and-import","169":"/getting-started/container.html#export","170":"/getting-started/container.html#import","171":"/getting-started/container.html#restore","172":"/getting-started/container.html#container-versioning","173":"/getting-started/email.html#email-providers-and-bindings","174":"/getting-started/email.html#concept-email-as-a-bot-channel","175":"/getting-started/email.html#email-provider","176":"/getting-started/email.html#creating-a-provider","177":"/getting-started/email.html#bot-email-bindings","178":"/getting-started/email.html#adding-a-binding","179":"/getting-started/email.html#outbox-and-history","180":"/getting-started/email.html#bot-interaction","181":"/getting-started/files.html#bot-files-management","182":"/getting-started/files.html#operations","183":"/getting-started/files.html#browsing-and-navigation","184":"/getting-started/files.html#managing-files","185":"/getting-started/files.html#viewing-and-editing","186":"/getting-started/files.html#text-files","187":"/getting-started/files.html#images","188":"/getting-started/files.html#bot-interaction-with-files","189":"/getting-started/heartbeat.html#bot-heartbeat","190":"/getting-started/heartbeat.html#concept-scheduled-autonomy","191":"/getting-started/heartbeat.html#configuration","192":"/getting-started/heartbeat.html#logs-and-monitoring","193":"/getting-started/heartbeat.html#managing-logs","194":"/getting-started/heartbeat.html#bot-interaction","195":"/getting-started/mcp.html#mcp-connections","196":"/getting-started/mcp.html#concept-extending-bot-capabilities","197":"/getting-started/mcp.html#connection-types","198":"/getting-started/mcp.html#_1-stdio-local-process","199":"/getting-started/mcp.html#_2-remote-http-sse","200":"/getting-started/mcp.html#oauth-authentication","201":"/getting-started/mcp.html#operations","202":"/getting-started/mcp.html#tool-discovery","203":"/getting-started/mcp.html#bot-interaction","204":"/getting-started/memory.html#bot-memory-management","205":"/getting-started/memory.html#prerequisites","206":"/getting-started/memory.html#concept-memory-retrieval","207":"/getting-started/memory.html#operations","208":"/getting-started/memory.html#_1-creating-memories","209":"/getting-started/memory.html#_2-searching-and-managing","210":"/getting-started/memory.html#memory-compaction","211":"/getting-started/memory.html#rebuild","212":"/getting-started/memory.html#status","213":"/getting-started/memory.html#usage-statistics","214":"/getting-started/memory.html#memory-vs-session-context","215":"/getting-started/memory.html#bot-interaction","216":"/getting-started/provider-and-model.html#providers-and-models","217":"/getting-started/provider-and-model.html#provider-basics","218":"/getting-started/provider-and-model.html#creating-a-provider","219":"/getting-started/provider-and-model.html#client-types","220":"/getting-started/provider-and-model.html#oauth-based-providers","221":"/getting-started/provider-and-model.html#openai-codex","222":"/getting-started/provider-and-model.html#github-copilot","223":"/getting-started/provider-and-model.html#importing-models","224":"/getting-started/provider-and-model.html#model-types","225":"/getting-started/provider-and-model.html#chat-model-configuration","226":"/getting-started/provider-and-model.html#compatibilities","227":"/getting-started/provider-and-model.html#context-window","228":"/getting-started/provider-and-model.html#image-generation-models","229":"/getting-started/provider-and-model.html#embedding-models","230":"/getting-started/provider-and-model.html#speech-models","231":"/getting-started/provider-and-model.html#recommended-mental-model","232":"/getting-started/provider-and-model.html#next-steps","233":"/getting-started/schedule.html#scheduled-tasks","234":"/getting-started/schedule.html#concept-cron-based-automation","235":"/getting-started/schedule.html#schedule-fields","236":"/getting-started/schedule.html#cron-pattern-reference","237":"/getting-started/schedule.html#viewing-schedules","238":"/getting-started/schedule.html#creating-schedules","239":"/getting-started/schedule.html#via-the-bot-conversational","240":"/getting-started/schedule.html#via-the-api","241":"/getting-started/schedule.html#execution-flow","242":"/getting-started/schedule.html#schedule-vs-heartbeat","243":"/getting-started/search-provider.html#search-providers","244":"/getting-started/search-provider.html#concept-real-time-knowledge","245":"/getting-started/search-provider.html#supported-search-engines","246":"/getting-started/search-provider.html#configuration-flow","247":"/getting-started/search-provider.html#_1-adding-a-search-provider","248":"/getting-started/search-provider.html#_2-managing-providers","249":"/getting-started/search-provider.html#assigning-a-search-provider-to-a-bot","250":"/getting-started/search-provider.html#bot-interaction","251":"/getting-started/sessions.html#sessions","252":"/getting-started/sessions.html#concept-conversation-isolation","253":"/getting-started/sessions.html#session-types","254":"/getting-started/sessions.html#chat-vs-discuss","255":"/getting-started/sessions.html#starting-a-new-session-with-new","256":"/getting-started/sessions.html#in-external-channels-telegram-discord-feishu-etc","257":"/getting-started/sessions.html#in-the-web-ui","258":"/getting-started/sessions.html#managing-sessions","259":"/getting-started/sessions.html#viewing-sessions","260":"/getting-started/sessions.html#renaming-sessions","261":"/getting-started/sessions.html#deleting-sessions","262":"/getting-started/sessions.html#session-status-panel","263":"/getting-started/sessions.html#how-sessions-relate-to-other-features","264":"/getting-started/skills.html#bot-skills","265":"/getting-started/skills.html#what-a-skill-looks-like","266":"/getting-started/skills.html#where-skills-come-from","267":"/getting-started/skills.html#skill-states","268":"/getting-started/skills.html#typical-examples","269":"/getting-started/skills.html#managing-skills-in-the-ui","270":"/getting-started/skills.html#add-skill","271":"/getting-started/skills.html#edit-skill","272":"/getting-started/skills.html#delete-skill","273":"/getting-started/skills.html#disable-enable","274":"/getting-started/skills.html#adopt","275":"/getting-started/skills.html#effective-skills-at-runtime","276":"/getting-started/skills.html#supermarket-and-imported-skills","277":"/getting-started/skills.html#recommended-workflow","278":"/getting-started/slash-commands.html#slash-commands","279":"/getting-started/slash-commands.html#command-model","280":"/getting-started/slash-commands.html#built-in-help","281":"/getting-started/slash-commands.html#parsing-rules","282":"/getting-started/slash-commands.html#permissions","283":"/getting-started/slash-commands.html#quick-reference","284":"/getting-started/slash-commands.html#top-level-commands","285":"/getting-started/slash-commands.html#resource-groups","286":"/getting-started/slash-commands.html#session-commands","287":"/getting-started/slash-commands.html#new","288":"/getting-started/slash-commands.html#stop","289":"/getting-started/slash-commands.html#status-and-inspection-commands","290":"/getting-started/slash-commands.html#status","291":"/getting-started/slash-commands.html#access","292":"/getting-started/slash-commands.html#usage","293":"/getting-started/slash-commands.html#heartbeat","294":"/getting-started/slash-commands.html#email","295":"/getting-started/slash-commands.html#configuration-commands","296":"/getting-started/slash-commands.html#settings","297":"/getting-started/slash-commands.html#model","298":"/getting-started/slash-commands.html#memory","299":"/getting-started/slash-commands.html#search","300":"/getting-started/slash-commands.html#browser","301":"/getting-started/slash-commands.html#mcp","302":"/getting-started/slash-commands.html#automation-and-filesystem-commands","303":"/getting-started/slash-commands.html#schedule","304":"/getting-started/slash-commands.html#skill","305":"/getting-started/slash-commands.html#fs","306":"/getting-started/slash-commands.html#context-compaction-command","307":"/getting-started/slash-commands.html#compact","308":"/getting-started/supermarket.html#supermarket","309":"/getting-started/supermarket.html#install-a-skill","310":"/getting-started/supermarket.html#install-an-mcp-template","311":"/getting-started/supermarket.html#contribute","312":"/#memoh-documentation","313":"/#start-here","314":"/#feature-guides","315":"/installation/docker.html#docker-installation","316":"/installation/docker.html#service-architecture","317":"/installation/docker.html#sparse-service","318":"/installation/docker.html#prerequisites","319":"/installation/docker.html#one-click-install-recommended","320":"/installation/docker.html#manual-install","321":"/installation/docker.html#china-mainland-mirror","322":"/installation/docker.html#access-points","323":"/installation/docker.html#configuration-reference","324":"/installation/docker.html#common-commands","325":"/installation/docker.html#environment-variables","326":"/memory-providers/builtin.html#built-in-memory-provider","327":"/memory-providers/builtin.html#memory-modes","328":"/memory-providers/builtin.html#how-sparse-mode-works","329":"/memory-providers/builtin.html#creating-a-built-in-provider","330":"/memory-providers/builtin.html#configuring-a-built-in-provider","331":"/memory-providers/builtin.html#managing-providers","332":"/memory-providers/builtin.html#infrastructure-requirements","333":"/memory-providers/builtin.html#off-mode","334":"/memory-providers/builtin.html#sparse-mode","335":"/memory-providers/builtin.html#dense-mode","336":"/memory-providers/builtin.html#assigning-a-memory-provider-to-a-bot","337":"/memory-providers/builtin.html#using-memory-after-setup","338":"/memory-providers/#memory-providers","339":"/memory-providers/#available-providers","340":"/memory-providers/#basic-flow","341":"/memory-providers/#next-steps","342":"/memory-providers/mem0.html#mem0-memory-provider","343":"/memory-providers/mem0.html#creating-a-mem0-provider","344":"/memory-providers/mem0.html#configuring-a-mem0-provider","345":"/memory-providers/mem0.html#assigning-a-mem0-provider-to-a-bot","346":"/memory-providers/mem0.html#usage","347":"/memory-providers/openviking.html#openviking-memory-provider","348":"/memory-providers/openviking.html#creating-an-openviking-provider","349":"/memory-providers/openviking.html#configuring-an-openviking-provider","350":"/memory-providers/openviking.html#assigning-an-openviking-provider-to-a-bot","351":"/memory-providers/openviking.html#usage","352":"/tts-providers/edge.html#edge-tts","353":"/tts-providers/edge.html#creating-an-edge-tts-provider","354":"/tts-providers/edge.html#configuring-the-model","355":"/tts-providers/edge.html#assigning-to-a-bot","356":"/tts-providers/edge.html#testing","357":"/tts-providers/#tts-providers","358":"/tts-providers/#basic-flow","359":"/tts-providers/#available-providers","360":"/tts-providers/#next-steps"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,1],"1":[4,2,71],"2":[4,2,1],"3":[4,5,44],"4":[2,5,32],"5":[6,5,46],"6":[4,5,67],"7":[3,5,49],"8":[5,5,49],"9":[3,5,52],"10":[3,5,61],"11":[3,2,42],"12":[12,1,1],"13":[1,12,74],"14":[2,12,215],"15":[1,12,29],"16":[1,12,54],"17":[1,12,65],"18":[1,12,104],"19":[3,12,83],"20":[1,12,62],"21":[1,1,12],"22":[3,1,24],"23":[6,3,45],"24":[4,3,41],"25":[4,3,25],"26":[2,3,24],"27":[3,1,16],"28":[6,3,28],"29":[5,3,19],"30":[8,3,42],"31":[4,3,23],"32":[2,3,25],"33":[2,1,111],"34":[4,2,41],"35":[3,2,72],"36":[3,1,31],"37":[7,3,74],"38":[4,3,67],"39":[5,3,31],"40":[2,3,49],"41":[2,3,6],"42":[3,1,33],"43":[8,3,50],"44":[4,3,33],"45":[4,3,32],"46":[2,3,13],"47":[3,1,16],"48":[6,3,46],"49":[4,3,37],"50":[7,3,44],"51":[2,3,36],"52":[2,3,6],"53":[4,1,24],"54":[6,4,34],"55":[5,4,13],"56":[4,4,31],"57":[7,4,56],"58":[5,4,30],"59":[3,1,24],"60":[6,3,29],"61":[5,3,37],"62":[6,3,60],"63":[6,3,27],"64":[8,3,35],"65":[4,3,30],"66":[7,3,58],"67":[2,3,21],"68":[3,1,28],"69":[6,3,55],"70":[4,3,30],"71":[7,3,53],"72":[2,3,35],"73":[5,1,31],"74":[6,5,38],"75":[7,5,53],"76":[6,5,38],"77":[5,5,22],"78":[2,5,29],"79":[4,1,17],"80":[6,4,26],"81":[4,4,44],"82":[4,4,27],"83":[2,4,26],"84":[2,4,6],"85":[3,1,24],"86":[7,3,19],"87":[6,3,55],"88":[4,3,20],"89":[2,3,11],"90":[2,3,29],"91":[3,1,35],"92":[4,3,63],"93":[1,3,1],"94":[2,4,43],"95":[2,4,54],"96":[2,4,19],"97":[3,4,56],"98":[2,3,12],"99":[6,4,28],"100":[2,4,60],"101":[2,4,26],"102":[2,4,49],"103":[5,3,63],"104":[1,3,1],"105":[6,4,19],"106":[5,4,30],"107":[5,4,31],"108":[3,4,37],"109":[3,4,27],"110":[3,3,40],"111":[2,1,34],"112":[3,2,55],"113":[3,2,22],"114":[2,4,106],"115":[6,2,79],"116":[3,2,138],"117":[3,2,48],"118":[3,2,57],"119":[3,2,51],"120":[4,2,46],"121":[2,2,25],"122":[3,2,44],"123":[2,1,45],"124":[3,2,45],"125":[4,2,27],"126":[4,2,81],"127":[2,5,15],"128":[6,2,33],"129":[2,2,55],"130":[3,2,47],"131":[2,2,27],"132":[2,1,18],"133":[3,2,30],"134":[2,2,14],"135":[2,3,64],"136":[2,2,1],"137":[4,4,24],"138":[3,4,33],"139":[5,4,32],"140":[6,4,21],"141":[7,4,35],"142":[6,4,33],"143":[1,2,20],"144":[2,1,45],"145":[3,2,52],"146":[3,2,41],"147":[2,2,69],"148":[2,2,13],"149":[5,3,33],"150":[3,3,22],"151":[3,2,68],"152":[4,2,44],"153":[4,2,55],"154":[2,2,24],"155":[3,1,35],"156":[4,3,30],"157":[1,3,16],"158":[2,4,52],"159":[2,3,55],"160":[4,3,53],"161":[3,7,50],"162":[2,7,79],"163":[2,7,54],"164":[1,3,32],"165":[3,4,18],"166":[3,4,17],"167":[2,4,23],"168":[4,3,16],"169":[1,7,21],"170":[1,7,21],"171":[1,7,29],"172":[2,3,37],"173":[4,1,18],"174":[6,4,28],"175":[2,4,13],"176":[3,5,38],"177":[3,4,15],"178":[3,5,41],"179":[3,4,34],"180":[2,4,45],"181":[3,1,24],"182":[1,3,17],"183":[3,4,31],"184":[2,4,42],"185":[3,3,17],"186":[2,6,39],"187":[1,6,20],"188":[4,3,36],"189":[2,1,24],"190":[3,2,38],"191":[1,2,41],"192":[3,2,46],"193":[2,5,29],"194":[2,2,36],"195":[2,1,21],"196":[4,2,43],"197":[2,2,11],"198":[5,4,54],"199":[5,4,36],"200":[2,2,56],"201":[1,2,53],"202":[2,2,51],"203":[2,2,32],"204":[3,1,22],"205":[1,3,42],"206":[3,3,67],"207":[1,3,14],"208":[3,4,25],"209":[4,4,25],"210":[2,3,85],"211":[1,3,49],"212":[1,3,40],"213":[2,3,28],"214":[4,3,58],"215":[2,3,48],"216":[3,1,44],"217":[2,3,40],"218":[3,5,52],"219":[2,5,67],"220":[3,3,18],"221":[2,5,46],"222":[2,5,47],"223":[2,3,38],"224":[2,3,45],"225":[3,3,51],"226":[1,6,48],"227":[2,6,47],"228":[3,6,32],"229":[2,3,37],"230":[2,3,39],"231":[3,3,37],"232":[2,3,21],"233":[2,1,33],"234":[4,2,37],"235":[2,2,77],"236":[3,2,67],"237":[2,2,31],"238":[2,2,8],"239":[5,4,46],"240":[3,4,42],"241":[2,2,48],"242":[3,2,52],"243":[2,1,23],"244":[4,2,28],"245":[3,2,53],"246":[2,2,1],"247":[5,4,44],"248":[3,4,21],"249":[6,2,22],"250":[2,2,35],"251":[1,1,36],"252":[3,1,43],"253":[2,1,87],"254":[3,3,83],"255":[6,1,69],"256":[8,7,61],"257":[4,7,39],"258":[2,1,1],"259":[2,2,51],"260":[2,2,15],"261":[2,2,15],"262":[3,1,68],"263":[6,1,75],"264":[2,1,31],"265":[5,2,74],"266":[4,2,80],"267":[2,2,49],"268":[2,4,43],"269":[5,2,8],"270":[2,6,20],"271":[2,6,25],"272":[2,6,22],"273":[2,6,34],"274":[1,6,50],"275":[4,2,40],"276":[4,2,51],"277":[2,2,38],"278":[2,1,53],"279":[2,2,73],"280":[3,2,45],"281":[2,2,59],"282":[1,2,30],"283":[2,2,1],"284":[3,4,16],"285":[2,4,62],"286":[2,2,1],"287":[2,3,66],"288":[2,3,36],"289":[4,2,1],"290":[2,5,43],"291":[2,5,45],"292":[2,5,16],"293":[2,5,12],"294":[2,5,16],"295":[2,2,1],"296":[2,3,50],"297":[2,3,31],"298":[2,3,20],"299":[2,3,20],"300":[2,3,20],"301":[2,3,23],"302":[4,2,1],"303":[2,5,39],"304":[2,5,13],"305":[2,5,28],"306":[3,2,1],"307":[2,5,52],"308":[1,1,13],"309":[3,1,26],"310":[4,1,45],"311":[1,1,10],"312":[2,1,40],"313":[2,2,51],"314":[2,2,56],"315":[2,1,45],"316":[2,2,62],"317":[2,4,143],"318":[1,2,5],"319":[5,2,112],"320":[2,2,97],"321":[3,4,48],"322":[2,2,37],"323":[2,2,94],"324":[2,2,33],"325":[2,2,58],"326":[4,1,44],"327":[2,4,38],"328":[4,5,58],"329":[5,4,25],"330":[5,4,46],"331":[2,6,15],"332":[2,4,1],"333":[2,6,15],"334":[2,6,44],"335":[2,6,30],"336":[6,4,37],"337":[4,4,38],"338":[2,1,33],"339":[2,2,44],"340":[2,2,31],"341":[2,2,28],"342":[3,1,28],"343":[4,3,25],"344":[4,3,44],"345":[6,3,24],"346":[1,3,28],"347":[3,1,26],"348":[4,3,25],"349":[4,3,36],"350":[7,3,24],"351":[1,3,28],"352":[2,1,26],"353":[5,2,25],"354":[3,2,58],"355":[4,2,24],"356":[1,2,26],"357":[2,1,64],"358":[2,2,48],"359":[2,2,21],"360":[2,2,12]},"averageFieldLength":[3.083102493074793,3.1994459833795013,38.41274238227144],"storedFields":{"0":{"title":"About Memoh","titles":[]},"1":{"title":"What Is Memoh?","titles":["About Memoh"]},"2":{"title":"What Makes Memoh Different","titles":["About Memoh"]},"3":{"title":"Multi-Bot And Multi-User","titles":["About Memoh","What Makes Memoh Different"]},"4":{"title":"Containerized Workspaces","titles":["About Memoh","What Makes Memoh Different"]},"5":{"title":"Long-Term Memory And Context Management","titles":["About Memoh","What Makes Memoh Different"]},"6":{"title":"Sessions And Discuss Mode","titles":["About Memoh","What Makes Memoh Different"]},"7":{"title":"Broad Channel Coverage","titles":["About Memoh","What Makes Memoh Different"]},"8":{"title":"Tools, Skills, MCP, And Supermarket","titles":["About Memoh","What Makes Memoh Different"]},"9":{"title":"Providers And Models","titles":["About Memoh","What Makes Memoh Different"]},"10":{"title":"Operations And UI","titles":["About Memoh","What Makes Memoh Different"]},"11":{"title":"Where To Start","titles":["About Memoh"]},"12":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","titles":[]},"13":{"title":"Overview","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"14":{"title":"Story Time","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"15":{"title":"What","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"16":{"title":"Why","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"17":{"title":"How","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"18":{"title":"Features","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"19":{"title":"Compare to OpenClaw","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"20":{"title":"Conclusion","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"21":{"title":"Blogs","titles":[]},"22":{"title":"DingTalk Channel Configuration","titles":[]},"23":{"title":"Step 1: Create A DingTalk App","titles":["DingTalk Channel Configuration"]},"24":{"title":"Step 2: Configure Memoh","titles":["DingTalk Channel Configuration"]},"25":{"title":"Step 3: Verify Messaging","titles":["DingTalk Channel Configuration"]},"26":{"title":"Features Supported","titles":["DingTalk Channel Configuration"]},"27":{"title":"Discord Channel Configuration","titles":[]},"28":{"title":"Step 1: Create a Discord Application","titles":["Discord Channel Configuration"]},"29":{"title":"Step 2: Configure Bot Settings","titles":["Discord Channel Configuration"]},"30":{"title":"Step 3: Invite the Bot to Your Server","titles":["Discord Channel Configuration"]},"31":{"title":"Step 4: Configure Memoh","titles":["Discord Channel Configuration"]},"32":{"title":"Features Supported","titles":["Discord Channel Configuration"]},"33":{"title":"Channels Overview","titles":[]},"34":{"title":"WeChat vs WeChat Official Account","titles":["Channels Overview"]},"35":{"title":"General Setup Flow","titles":["Channels Overview"]},"36":{"title":"Matrix Channel Configuration","titles":[]},"37":{"title":"Step 1: Create a Matrix Bot Account","titles":["Matrix Channel Configuration"]},"38":{"title":"Step 2: Configure Memoh","titles":["Matrix Channel Configuration"]},"39":{"title":"Step 3: Invite the Bot","titles":["Matrix Channel Configuration"]},"40":{"title":"Features Supported","titles":["Matrix Channel Configuration"]},"41":{"title":"Official Resources","titles":["Matrix Channel Configuration"]},"42":{"title":"Misskey Channel Configuration","titles":[]},"43":{"title":"Step 1: Prepare A Misskey Account And Token","titles":["Misskey Channel Configuration"]},"44":{"title":"Step 2: Configure Memoh","titles":["Misskey Channel Configuration"]},"45":{"title":"Step 3: Start Chatting","titles":["Misskey Channel Configuration"]},"46":{"title":"Features Supported","titles":["Misskey Channel Configuration"]},"47":{"title":"QQ Channel Configuration","titles":[]},"48":{"title":"Step 1: Create a QQ Bot","titles":["QQ Channel Configuration"]},"49":{"title":"Step 2: Configure Memoh","titles":["QQ Channel Configuration"]},"50":{"title":"Step 3: Bind Your Identity (Optional)","titles":["QQ Channel Configuration"]},"51":{"title":"Features Supported","titles":["QQ Channel Configuration"]},"52":{"title":"Official Resources","titles":["QQ Channel Configuration"]},"53":{"title":"Feishu (Lark) Channel Configuration","titles":[]},"54":{"title":"Step 1: Create a Feishu App","titles":["Feishu (Lark) Channel Configuration"]},"55":{"title":"Step 2: Enable Bot Capability","titles":["Feishu (Lark) Channel Configuration"]},"56":{"title":"Step 3: Configure Permissions","titles":["Feishu (Lark) Channel Configuration"]},"57":{"title":"Step 4: Configure Events (Webhook Mode)","titles":["Feishu (Lark) Channel Configuration"]},"58":{"title":"Step 5: Publish Your App","titles":["Feishu (Lark) Channel Configuration"]},"59":{"title":"Slack Channel Configuration","titles":[]},"60":{"title":"Step 1: Create a Slack App","titles":["Slack Channel Configuration"]},"61":{"title":"Step 2: Enable Socket Mode","titles":["Slack Channel Configuration"]},"62":{"title":"Step 3: Configure Bot Token Scopes","titles":["Slack Channel Configuration"]},"63":{"title":"Step 4: Subscribe to Bot Events","titles":["Slack Channel Configuration"]},"64":{"title":"Step 5: Install the App to Your Workspace","titles":["Slack Channel Configuration"]},"65":{"title":"Step 6: Configure Memoh","titles":["Slack Channel Configuration"]},"66":{"title":"Step 7: Add the Bot to Conversations","titles":["Slack Channel Configuration"]},"67":{"title":"Features Supported","titles":["Slack Channel Configuration"]},"68":{"title":"Telegram Channel Configuration","titles":[]},"69":{"title":"Step 1: Create a Telegram Bot","titles":["Telegram Channel Configuration"]},"70":{"title":"Step 2: Configure Memoh","titles":["Telegram Channel Configuration"]},"71":{"title":"Step 3: Bind Your Identity (Optional)","titles":["Telegram Channel Configuration"]},"72":{"title":"Features Supported","titles":["Telegram Channel Configuration"]},"73":{"title":"WeChat Official Account Channel Configuration","titles":[]},"74":{"title":"Step 1: Prepare Official Account Credentials","titles":["WeChat Official Account Channel Configuration"]},"75":{"title":"Step 2: Add The Channel In Memoh","titles":["WeChat Official Account Channel Configuration"]},"76":{"title":"Step 3: Configure The WeChat Platform","titles":["WeChat Official Account Channel Configuration"]},"77":{"title":"Step 4: Enable And Test","titles":["WeChat Official Account Channel Configuration"]},"78":{"title":"Features Supported","titles":["WeChat Official Account Channel Configuration"]},"79":{"title":"WeCom (WeWork) Channel Configuration","titles":[]},"80":{"title":"Step 1: Create a WeCom Bot","titles":["WeCom (WeWork) Channel Configuration"]},"81":{"title":"Step 2: Configure Memoh","titles":["WeCom (WeWork) Channel Configuration"]},"82":{"title":"Step 3: Start Chatting","titles":["WeCom (WeWork) Channel Configuration"]},"83":{"title":"Features Supported","titles":["WeCom (WeWork) Channel Configuration"]},"84":{"title":"Official Resources","titles":["WeCom (WeWork) Channel Configuration"]},"85":{"title":"WeChat Channel Configuration","titles":[]},"86":{"title":"Step 1: Add WeChat Channel in Memoh","titles":["WeChat Channel Configuration"]},"87":{"title":"Step 2: Scan the QR Code","titles":["WeChat Channel Configuration"]},"88":{"title":"Step 3: Start Chatting","titles":["WeChat Channel Configuration"]},"89":{"title":"Optional Settings","titles":["WeChat Channel Configuration"]},"90":{"title":"Features Supported","titles":["WeChat Channel Configuration"]},"91":{"title":"Bot Access Control","titles":[]},"92":{"title":"Quick Start: ACL Presets","titles":["Bot Access Control"]},"93":{"title":"Concepts","titles":["Bot Access Control"]},"94":{"title":"Default Effect","titles":["Bot Access Control","Concepts"]},"95":{"title":"Subject Types","titles":["Bot Access Control","Concepts"]},"96":{"title":"Rule Effects","titles":["Bot Access Control","Concepts"]},"97":{"title":"Priority-Based Evaluation","titles":["Bot Access Control","Concepts"]},"98":{"title":"Managing Access","titles":["Bot Access Control"]},"99":{"title":"Start With A Preset, Then Refine","titles":["Bot Access Control","Managing Access"]},"100":{"title":"Adding Rules","titles":["Bot Access Control","Managing Access"]},"101":{"title":"Reordering Rules","titles":["Bot Access Control","Managing Access"]},"102":{"title":"Source Scope","titles":["Bot Access Control","Managing Access"]},"103":{"title":"What The Presets Actually Mean","titles":["Bot Access Control"]},"104":{"title":"Examples","titles":["Bot Access Control"]},"105":{"title":"Open Bot (Anyone Can Chat)","titles":["Bot Access Control","Examples"]},"106":{"title":"Private Bot with Selected Users","titles":["Bot Access Control","Examples"]},"107":{"title":"Open Bot with Blocked Users","titles":["Bot Access Control","Examples"]},"108":{"title":"Platform-Specific Access","titles":["Bot Access Control","Examples"]},"109":{"title":"Channel-Scoped Access","titles":["Bot Access Control","Examples"]},"110":{"title":"Debugging Access Decisions","titles":["Bot Access Control"]},"111":{"title":"Bot Management","titles":[]},"112":{"title":"Creating a Bot","titles":["Bot Management"]},"113":{"title":"Bot Detail Page","titles":["Bot Management"]},"114":{"title":"Tab Overview","titles":["Bot Management","Bot Detail Page"]},"115":{"title":"Configuring the Bot\'s Core Settings","titles":["Bot Management"]},"116":{"title":"General Tab Reference","titles":["Bot Management"]},"117":{"title":"Heartbeat Tab Reference","titles":["Bot Management"]},"118":{"title":"Compaction Tab Reference","titles":["Bot Management"]},"119":{"title":"Access And ACL","titles":["Bot Management"]},"120":{"title":"Discuss-Related Advanced Settings","titles":["Bot Management"]},"121":{"title":"Terminal Tab","titles":["Bot Management"]},"122":{"title":"Deleting a Bot","titles":["Bot Management"]},"123":{"title":"Browser Contexts","titles":[]},"124":{"title":"Concept: Browser Gateway","titles":["Browser Contexts"]},"125":{"title":"Creating a Browser Context","titles":["Browser Contexts"]},"126":{"title":"Configuring a Browser Context","titles":["Browser Contexts"]},"127":{"title":"Managing Contexts","titles":["Browser Contexts","Configuring a Browser Context"]},"128":{"title":"Assigning a Browser Context to a Bot","titles":["Browser Contexts"]},"129":{"title":"Bot Interaction","titles":["Browser Contexts"]},"130":{"title":"Browser Core Selection","titles":["Browser Contexts"]},"131":{"title":"Next Steps","titles":["Browser Contexts"]},"132":{"title":"Bot Channels","titles":[]},"133":{"title":"Concept: Unified Communication","titles":["Bot Channels"]},"134":{"title":"Supported Channels","titles":["Bot Channels"]},"135":{"title":"Platform Guides","titles":["Bot Channels","Supported Channels"]},"136":{"title":"Configuration Flow","titles":["Bot Channels"]},"137":{"title":"1. Adding a Channel","titles":["Bot Channels","Configuration Flow"]},"138":{"title":"2. Common Fields","titles":["Bot Channels","Configuration Flow"]},"139":{"title":"3. Special Case: Feishu Webhook","titles":["Bot Channels","Configuration Flow"]},"140":{"title":"4. Special Case: WeChat QR Login","titles":["Bot Channels","Configuration Flow"]},"141":{"title":"5. Special Case: WeChat Official Account Webhook","titles":["Bot Channels","Configuration Flow"]},"142":{"title":"6. Special Case: DingTalk Stream Connection","titles":["Bot Channels","Configuration Flow"]},"143":{"title":"Operations","titles":["Bot Channels"]},"144":{"title":"Context Compaction","titles":[]},"145":{"title":"Why It Exists","titles":["Context Compaction"]},"146":{"title":"What It Changes","titles":["Context Compaction"]},"147":{"title":"Automatic Compaction","titles":["Context Compaction"]},"148":{"title":"Immediate Compaction","titles":["Context Compaction"]},"149":{"title":"From The Session Status Panel","titles":["Context Compaction","Immediate Compaction"]},"150":{"title":"From Slash Commands","titles":["Context Compaction","Immediate Compaction"]},"151":{"title":"Status And Logs","titles":["Context Compaction"]},"152":{"title":"Relationship To context_window","titles":["Context Compaction"]},"153":{"title":"Context Compaction vs Memory Compaction","titles":["Context Compaction"]},"154":{"title":"Next Steps","titles":["Context Compaction"]},"155":{"title":"Bot Container Management","titles":[]},"156":{"title":"Concept: The Isolated Workspace","titles":["Bot Container Management"]},"157":{"title":"Operations","titles":["Bot Container Management"]},"158":{"title":"Lifecycle Actions","titles":["Bot Container Management","Operations"]},"159":{"title":"Container Information","titles":["Bot Container Management"]},"160":{"title":"Advanced: Provide CDI Devices","titles":["Bot Container Management"]},"161":{"title":"Configure CDI Devices","titles":["Bot Container Management","Advanced: Provide CDI Devices"]},"162":{"title":"Host Requirements","titles":["Bot Container Management","Advanced: Provide CDI Devices"]},"163":{"title":"Important Behavior","titles":["Bot Container Management","Advanced: Provide CDI Devices"]},"164":{"title":"Snapshots","titles":["Bot Container Management"]},"165":{"title":"Creating a Snapshot","titles":["Bot Container Management","Snapshots"]},"166":{"title":"Restoring a Snapshot","titles":["Bot Container Management","Snapshots"]},"167":{"title":"Managing Snapshots","titles":["Bot Container Management","Snapshots"]},"168":{"title":"Data Export and Import","titles":["Bot Container Management"]},"169":{"title":"Export","titles":["Bot Container Management","Data Export and Import"]},"170":{"title":"Import","titles":["Bot Container Management","Data Export and Import"]},"171":{"title":"Restore","titles":["Bot Container Management","Data Export and Import"]},"172":{"title":"Container Versioning","titles":["Bot Container Management"]},"173":{"title":"Email Providers and Bindings","titles":[]},"174":{"title":"Concept: Email as a Bot Channel","titles":["Email Providers and Bindings"]},"175":{"title":"Email Provider","titles":["Email Providers and Bindings"]},"176":{"title":"Creating a Provider","titles":["Email Providers and Bindings","Email Provider"]},"177":{"title":"Bot Email Bindings","titles":["Email Providers and Bindings"]},"178":{"title":"Adding a Binding","titles":["Email Providers and Bindings","Bot Email Bindings"]},"179":{"title":"Outbox and History","titles":["Email Providers and Bindings"]},"180":{"title":"Bot Interaction","titles":["Email Providers and Bindings"]},"181":{"title":"Bot Files Management","titles":[]},"182":{"title":"Operations","titles":["Bot Files Management"]},"183":{"title":"Browsing and Navigation","titles":["Bot Files Management","Operations"]},"184":{"title":"Managing Files","titles":["Bot Files Management","Operations"]},"185":{"title":"Viewing and Editing","titles":["Bot Files Management"]},"186":{"title":"Text Files","titles":["Bot Files Management","Viewing and Editing"]},"187":{"title":"Images","titles":["Bot Files Management","Viewing and Editing"]},"188":{"title":"Bot Interaction with Files","titles":["Bot Files Management"]},"189":{"title":"Bot Heartbeat","titles":[]},"190":{"title":"Concept: Scheduled Autonomy","titles":["Bot Heartbeat"]},"191":{"title":"Configuration","titles":["Bot Heartbeat"]},"192":{"title":"Logs and Monitoring","titles":["Bot Heartbeat"]},"193":{"title":"Managing Logs","titles":["Bot Heartbeat","Logs and Monitoring"]},"194":{"title":"Bot Interaction","titles":["Bot Heartbeat"]},"195":{"title":"MCP Connections","titles":[]},"196":{"title":"Concept: Extending Bot Capabilities","titles":["MCP Connections"]},"197":{"title":"Connection Types","titles":["MCP Connections"]},"198":{"title":"1. Stdio (Local Process)","titles":["MCP Connections","Connection Types"]},"199":{"title":"2. Remote (HTTP/SSE)","titles":["MCP Connections","Connection Types"]},"200":{"title":"OAuth Authentication","titles":["MCP Connections"]},"201":{"title":"Operations","titles":["MCP Connections"]},"202":{"title":"Tool Discovery","titles":["MCP Connections"]},"203":{"title":"Bot Interaction","titles":["MCP Connections"]},"204":{"title":"Bot Memory Management","titles":[]},"205":{"title":"Prerequisites","titles":["Bot Memory Management"]},"206":{"title":"Concept: Memory Retrieval","titles":["Bot Memory Management"]},"207":{"title":"Operations","titles":["Bot Memory Management"]},"208":{"title":"1. Creating Memories","titles":["Bot Memory Management","Operations"]},"209":{"title":"2. Searching and Managing","titles":["Bot Memory Management","Operations"]},"210":{"title":"Memory Compaction","titles":["Bot Memory Management"]},"211":{"title":"Rebuild","titles":["Bot Memory Management"]},"212":{"title":"Status","titles":["Bot Memory Management"]},"213":{"title":"Usage Statistics","titles":["Bot Memory Management"]},"214":{"title":"Memory vs Session Context","titles":["Bot Memory Management"]},"215":{"title":"Bot Interaction","titles":["Bot Memory Management"]},"216":{"title":"Providers And Models","titles":[]},"217":{"title":"Provider Basics","titles":["Providers And Models"]},"218":{"title":"Creating A Provider","titles":["Providers And Models","Provider Basics"]},"219":{"title":"Client Types","titles":["Providers And Models","Provider Basics"]},"220":{"title":"OAuth-Based Providers","titles":["Providers And Models"]},"221":{"title":"OpenAI Codex","titles":["Providers And Models","OAuth-Based Providers"]},"222":{"title":"GitHub Copilot","titles":["Providers And Models","OAuth-Based Providers"]},"223":{"title":"Importing Models","titles":["Providers And Models"]},"224":{"title":"Model Types","titles":["Providers And Models"]},"225":{"title":"Chat Model Configuration","titles":["Providers And Models"]},"226":{"title":"Compatibilities","titles":["Providers And Models","Chat Model Configuration"]},"227":{"title":"context_window","titles":["Providers And Models","Chat Model Configuration"]},"228":{"title":"Image Generation Models","titles":["Providers And Models","Chat Model Configuration"]},"229":{"title":"Embedding Models","titles":["Providers And Models"]},"230":{"title":"Speech Models","titles":["Providers And Models"]},"231":{"title":"Recommended Mental Model","titles":["Providers And Models"]},"232":{"title":"Next Steps","titles":["Providers And Models"]},"233":{"title":"Scheduled Tasks","titles":[]},"234":{"title":"Concept: Cron-Based Automation","titles":["Scheduled Tasks"]},"235":{"title":"Schedule Fields","titles":["Scheduled Tasks"]},"236":{"title":"Cron Pattern Reference","titles":["Scheduled Tasks"]},"237":{"title":"Viewing Schedules","titles":["Scheduled Tasks"]},"238":{"title":"Creating Schedules","titles":["Scheduled Tasks"]},"239":{"title":"Via the Bot (Conversational)","titles":["Scheduled Tasks","Creating Schedules"]},"240":{"title":"Via the API","titles":["Scheduled Tasks","Creating Schedules"]},"241":{"title":"Execution Flow","titles":["Scheduled Tasks"]},"242":{"title":"Schedule vs. Heartbeat","titles":["Scheduled Tasks"]},"243":{"title":"Search Providers","titles":[]},"244":{"title":"Concept: Real-Time Knowledge","titles":["Search Providers"]},"245":{"title":"Supported Search Engines","titles":["Search Providers"]},"246":{"title":"Configuration Flow","titles":["Search Providers"]},"247":{"title":"1. Adding a Search Provider","titles":["Search Providers","Configuration Flow"]},"248":{"title":"2. Managing Providers","titles":["Search Providers","Configuration Flow"]},"249":{"title":"Assigning a Search Provider to a Bot","titles":["Search Providers"]},"250":{"title":"Bot Interaction","titles":["Search Providers"]},"251":{"title":"Sessions","titles":[]},"252":{"title":"Concept: Conversation Isolation","titles":["Sessions"]},"253":{"title":"Session Types","titles":["Sessions"]},"254":{"title":"Chat vs Discuss","titles":["Sessions","Session Types"]},"255":{"title":"Starting a New Session with /new","titles":["Sessions"]},"256":{"title":"In External Channels (Telegram, Discord, Feishu, etc.)","titles":["Sessions","Starting a New Session with /new"]},"257":{"title":"In the Web UI","titles":["Sessions","Starting a New Session with /new"]},"258":{"title":"Managing Sessions","titles":["Sessions"]},"259":{"title":"Viewing Sessions","titles":["Sessions","Managing Sessions"]},"260":{"title":"Renaming Sessions","titles":["Sessions","Managing Sessions"]},"261":{"title":"Deleting Sessions","titles":["Sessions","Managing Sessions"]},"262":{"title":"Session Status Panel","titles":["Sessions"]},"263":{"title":"How Sessions Relate to Other Features","titles":["Sessions"]},"264":{"title":"Bot Skills","titles":[]},"265":{"title":"What A Skill Looks Like","titles":["Bot Skills"]},"266":{"title":"Where Skills Come From","titles":["Bot Skills"]},"267":{"title":"Skill States","titles":["Bot Skills"]},"268":{"title":"Typical Examples","titles":["Bot Skills","Skill States"]},"269":{"title":"Managing Skills In The UI","titles":["Bot Skills"]},"270":{"title":"Add Skill","titles":["Bot Skills","Managing Skills In The UI"]},"271":{"title":"Edit Skill","titles":["Bot Skills","Managing Skills In The UI"]},"272":{"title":"Delete Skill","titles":["Bot Skills","Managing Skills In The UI"]},"273":{"title":"Disable / Enable","titles":["Bot Skills","Managing Skills In The UI"]},"274":{"title":"Adopt","titles":["Bot Skills","Managing Skills In The UI"]},"275":{"title":"Effective Skills At Runtime","titles":["Bot Skills"]},"276":{"title":"Supermarket And Imported Skills","titles":["Bot Skills"]},"277":{"title":"Recommended Workflow","titles":["Bot Skills"]},"278":{"title":"Slash Commands","titles":[]},"279":{"title":"Command Model","titles":["Slash Commands"]},"280":{"title":"Built-in Help","titles":["Slash Commands"]},"281":{"title":"Parsing Rules","titles":["Slash Commands"]},"282":{"title":"Permissions","titles":["Slash Commands"]},"283":{"title":"Quick Reference","titles":["Slash Commands"]},"284":{"title":"Top-Level Commands","titles":["Slash Commands","Quick Reference"]},"285":{"title":"Resource Groups","titles":["Slash Commands","Quick Reference"]},"286":{"title":"Session Commands","titles":["Slash Commands"]},"287":{"title":"/new","titles":["Slash Commands","Session Commands"]},"288":{"title":"/stop","titles":["Slash Commands","Session Commands"]},"289":{"title":"Status And Inspection Commands","titles":["Slash Commands"]},"290":{"title":"/status","titles":["Slash Commands","Status And Inspection Commands"]},"291":{"title":"/access","titles":["Slash Commands","Status And Inspection Commands"]},"292":{"title":"/usage","titles":["Slash Commands","Status And Inspection Commands"]},"293":{"title":"/heartbeat","titles":["Slash Commands","Status And Inspection Commands"]},"294":{"title":"/email","titles":["Slash Commands","Status And Inspection Commands"]},"295":{"title":"Configuration Commands","titles":["Slash Commands"]},"296":{"title":"/settings","titles":["Slash Commands","Configuration Commands"]},"297":{"title":"/model","titles":["Slash Commands","Configuration Commands"]},"298":{"title":"/memory","titles":["Slash Commands","Configuration Commands"]},"299":{"title":"/search","titles":["Slash Commands","Configuration Commands"]},"300":{"title":"/browser","titles":["Slash Commands","Configuration Commands"]},"301":{"title":"/mcp","titles":["Slash Commands","Configuration Commands"]},"302":{"title":"Automation And Filesystem Commands","titles":["Slash Commands"]},"303":{"title":"/schedule","titles":["Slash Commands","Automation And Filesystem Commands"]},"304":{"title":"/skill","titles":["Slash Commands","Automation And Filesystem Commands"]},"305":{"title":"/fs","titles":["Slash Commands","Automation And Filesystem Commands"]},"306":{"title":"Context Compaction Command","titles":["Slash Commands"]},"307":{"title":"/compact","titles":["Slash Commands","Context Compaction Command"]},"308":{"title":"Supermarket","titles":[]},"309":{"title":"Install A Skill","titles":["Supermarket"]},"310":{"title":"Install An MCP Template","titles":["Supermarket"]},"311":{"title":"Contribute","titles":["Supermarket"]},"312":{"title":"Memoh Documentation","titles":[]},"313":{"title":"Start Here","titles":["Memoh Documentation"]},"314":{"title":"Feature Guides","titles":["Memoh Documentation"]},"315":{"title":"Docker Installation","titles":[]},"316":{"title":"Service Architecture","titles":["Docker Installation"]},"317":{"title":"Sparse Service","titles":["Docker Installation","Service Architecture"]},"318":{"title":"Prerequisites","titles":["Docker Installation"]},"319":{"title":"One-Click Install (Recommended)","titles":["Docker Installation"]},"320":{"title":"Manual Install","titles":["Docker Installation"]},"321":{"title":"China Mainland Mirror","titles":["Docker Installation","Manual Install"]},"322":{"title":"Access Points","titles":["Docker Installation"]},"323":{"title":"Configuration Reference","titles":["Docker Installation"]},"324":{"title":"Common Commands","titles":["Docker Installation"]},"325":{"title":"Environment Variables","titles":["Docker Installation"]},"326":{"title":"Built-in Memory Provider","titles":[]},"327":{"title":"Memory Modes","titles":["Built-in Memory Provider"]},"328":{"title":"How Sparse Mode Works","titles":["Built-in Memory Provider","Memory Modes"]},"329":{"title":"Creating a Built-in Provider","titles":["Built-in Memory Provider"]},"330":{"title":"Configuring a Built-in Provider","titles":["Built-in Memory Provider"]},"331":{"title":"Managing Providers","titles":["Built-in Memory Provider","Configuring a Built-in Provider"]},"332":{"title":"Infrastructure Requirements","titles":["Built-in Memory Provider"]},"333":{"title":"Off Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"334":{"title":"Sparse Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"335":{"title":"Dense Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"336":{"title":"Assigning a Memory Provider to a Bot","titles":["Built-in Memory Provider"]},"337":{"title":"Using Memory After Setup","titles":["Built-in Memory Provider"]},"338":{"title":"Memory Providers","titles":[]},"339":{"title":"Available Providers","titles":["Memory Providers"]},"340":{"title":"Basic Flow","titles":["Memory Providers"]},"341":{"title":"Next Steps","titles":["Memory Providers"]},"342":{"title":"Mem0 Memory Provider","titles":[]},"343":{"title":"Creating a Mem0 Provider","titles":["Mem0 Memory Provider"]},"344":{"title":"Configuring a Mem0 Provider","titles":["Mem0 Memory Provider"]},"345":{"title":"Assigning a Mem0 Provider to a Bot","titles":["Mem0 Memory Provider"]},"346":{"title":"Usage","titles":["Mem0 Memory Provider"]},"347":{"title":"OpenViking Memory Provider","titles":[]},"348":{"title":"Creating an OpenViking Provider","titles":["OpenViking Memory Provider"]},"349":{"title":"Configuring an OpenViking Provider","titles":["OpenViking Memory Provider"]},"350":{"title":"Assigning an OpenViking Provider to a Bot","titles":["OpenViking Memory Provider"]},"351":{"title":"Usage","titles":["OpenViking Memory Provider"]},"352":{"title":"Edge TTS","titles":[]},"353":{"title":"Creating an Edge TTS Provider","titles":["Edge TTS"]},"354":{"title":"Configuring the Model","titles":["Edge TTS"]},"355":{"title":"Assigning to a Bot","titles":["Edge TTS"]},"356":{"title":"Testing","titles":["Edge TTS"]},"357":{"title":"TTS Providers","titles":[]},"358":{"title":"Basic Flow","titles":["TTS Providers"]},"359":{"title":"Available Providers","titles":["TTS Providers"]},"360":{"title":"Next Steps","titles":["TTS Providers"]}},"dirtCount":0,"index":[["=",{"2":{"321":1,"334":2,"335":1}}],["~",{"2":{"319":2}}],["|",{"2":{"319":6}}],["ˈmemoʊ",{"2":{"312":1}}],["`",{"2":{"284":2}}],["│",{"2":{"236":15}}],["┌─────────────",{"2":{"236":5}}],["96kbitrate",{"2":{"354":1}}],["9",{"2":{"235":2,"236":2,"279":1,"281":1,"303":1}}],["8088",{"2":{"349":1}}],["8083",{"2":{"322":1}}],["8080",{"2":{"322":1,"323":1}}],["8082",{"2":{"322":1}}],["8085",{"2":{"317":1,"334":1}}],["8",{"2":{"210":1,"236":3,"239":1,"240":1}}],["00",{"2":{"235":1,"236":3}}],["0",{"2":{"210":3,"235":1,"236":9,"240":1,"279":1,"281":1,"303":1,"319":3,"325":1,"354":5}}],["zh",{"2":{"126":1,"296":1}}],["zone",{"2":{"114":1,"122":1}}],["→",{"2":{"97":2,"102":3}}],["企业微信",{"2":{"79":1}}],["7",{"0":{"66":1},"2":{"292":1}}],["6334",{"2":{"334":1,"335":1}}],["6",{"0":{"65":1,"142":1},"2":{"225":1,"236":1,"319":3,"325":1}}],["50+",{"2":{"352":1,"354":1,"359":1}}],["59",{"2":{"236":1}}],["5",{"0":{"58":1,"64":1,"141":1},"2":{"48":1,"210":1,"354":1}}],["创建机器人",{"2":{"48":1}}],["x26",{"2":{"324":2}}],["xhigh",{"2":{"226":1}}],["xoxb",{"2":{"64":2,"65":1}}],["xapp",{"2":{"61":1,"64":1,"65":1}}],["x3c",{"2":{"37":3}}],["x",{"2":{"37":1}}],["48kbitrate",{"2":{"354":1}}],["4o",{"2":{"225":1,"297":2}}],["4",{"0":{"31":1,"57":1,"63":1,"77":1,"140":1},"2":{"225":1}}],["32",{"2":{"320":1}}],["31",{"2":{"236":1}}],["30",{"2":{"38":1,"191":1,"236":2,"296":1}}],["3",{"0":{"25":1,"30":1,"39":1,"45":1,"50":1,"56":1,"62":1,"71":1,"76":1,"82":1,"88":1,"139":1},"2":{"210":1,"316":1,"354":1}}],["100",{"2":{"354":1}}],["16bit",{"2":{"354":1}}],["12",{"2":{"236":1}}],["123456789",{"2":{"69":1}}],["1536",{"2":{"229":1}}],["1",{"0":{"23":1,"28":1,"37":1,"43":1,"48":1,"54":1,"60":1,"69":1,"74":1,"80":1,"86":1,"137":1,"198":1,"208":1,"247":1},"2":{"236":4,"322":1,"354":1}}],["+100",{"2":{"354":1}}],["+",{"2":{"19":1,"268":1,"317":1,"327":2,"354":1}}],["jwt",{"2":{"319":2,"320":1,"323":1}}],["jina",{"2":{"245":1}}],["jpg",{"2":{"187":1}}],["js",{"2":{"186":1}}],["json",{"2":{"37":1,"201":3,"240":1,"323":1}}],["join",{"2":{"27":1,"36":1,"38":2,"39":2,"40":1,"254":1}}],["jobs",{"2":{"19":1}}],["just",{"2":{"14":1,"85":1,"92":1,"180":1,"268":1,"278":1}}],["256",{"2":{"354":1}}],["256+",{"2":{"352":1,"359":1}}],["20",{"2":{"236":1}}],["2026",{"2":{"13":1,"21":1}}],["23",{"2":{"236":1}}],["2",{"0":{"24":1,"29":1,"38":1,"44":1,"49":1,"55":1,"61":1,"70":1,"75":1,"81":1,"87":1,"138":1,"199":1,"209":1,"248":1},"2":{"322":1,"354":1}}],["24khz",{"2":{"354":3}}],["24",{"2":{"18":1}}],["known",{"2":{"164":1,"281":1}}],["know",{"2":{"50":1,"71":1,"223":1}}],["knowledge",{"0":{"244":1},"2":{"15":1,"131":1,"215":1,"243":1}}],["keyword",{"2":{"317":1,"328":1}}],["keys",{"2":{"138":1,"215":1}}],["key",{"2":{"23":1,"24":1,"74":1,"75":1,"76":1,"87":1,"142":1,"176":1,"198":1,"217":1,"218":1,"220":1,"221":1,"247":1,"262":1,"279":1,"317":1,"323":1,"328":1,"339":1,"344":2,"349":2,"352":1,"359":1}}],["keeps",{"2":{"228":1}}],["keeping",{"2":{"144":1}}],["keep",{"2":{"14":1,"20":2,"37":1,"60":1,"69":1,"141":1,"193":1,"277":1}}],["kept",{"2":{"13":1}}],["kinds",{"2":{"95":1,"253":1}}],["kind",{"2":{"14":1}}],["yml",{"2":{"320":1,"321":2}}],["yaml",{"2":{"265":2}}],["yandex",{"2":{"245":1}}],["y",{"2":{"198":1,"319":1}}],["yet",{"2":{"115":1,"131":1}}],["yes",{"2":{"38":3,"81":2,"344":1,"349":1}}],["year",{"2":{"13":1,"14":1}}],["yourself",{"2":{"264":1,"342":1}}],["yours",{"2":{"20":1}}],["your",{"0":{"30":1,"50":1,"58":1,"64":1,"71":1},"2":{"14":1,"15":1,"18":1,"23":3,"24":1,"27":1,"30":1,"31":2,"33":3,"34":1,"35":2,"36":2,"37":2,"38":2,"39":1,"43":1,"44":1,"47":1,"48":1,"49":2,"50":3,"53":1,"54":1,"56":1,"57":2,"59":1,"65":3,"68":1,"69":1,"70":2,"71":4,"74":1,"75":1,"79":2,"81":1,"82":1,"85":1,"86":1,"87":2,"91":1,"108":1,"109":1,"115":1,"128":1,"132":2,"134":1,"139":1,"157":1,"169":1,"170":1,"173":1,"174":1,"175":1,"177":1,"184":2,"188":1,"189":1,"195":1,"205":2,"207":1,"219":1,"228":1,"243":1,"244":1,"245":2,"247":1,"249":1,"252":1,"274":1,"280":1,"315":1,"319":1,"320":1,"324":1,"336":1,"342":1,"345":1,"350":1}}],["you",{"2":{"1":1,"6":1,"10":1,"14":5,"17":1,"20":1,"23":1,"24":1,"30":1,"33":1,"37":1,"43":1,"50":2,"60":1,"61":1,"62":2,"66":1,"68":1,"69":2,"71":2,"74":2,"75":1,"87":1,"91":1,"92":5,"102":1,"103":2,"113":2,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"127":1,"128":1,"131":1,"132":1,"133":1,"142":1,"144":1,"148":1,"149":1,"151":1,"152":1,"161":2,"162":1,"163":1,"164":1,"171":1,"178":1,"181":1,"185":1,"189":2,"195":1,"196":1,"200":2,"202":2,"210":1,"211":3,"214":2,"216":2,"221":1,"222":1,"223":4,"224":1,"227":1,"228":1,"231":1,"233":1,"236":1,"239":1,"240":1,"243":1,"247":1,"249":1,"252":2,"254":1,"255":1,"256":4,"257":1,"261":1,"263":1,"264":2,"265":1,"266":1,"268":4,"271":1,"273":1,"274":3,"276":1,"277":2,"287":1,"288":3,"290":1,"307":1,"310":1,"315":1,"317":2,"320":1,"321":1,"331":1,"336":1,"337":1,"345":1,"350":1,"357":1}}],["v0",{"2":{"319":1,"325":1}}],["v2",{"2":{"318":1}}],["vue",{"2":{"316":1}}],["voice",{"2":{"230":1,"354":3,"356":1,"357":2,"358":1}}],["voices",{"2":{"116":1,"352":1,"354":1,"359":1}}],["volume",{"2":{"176":1}}],["v1",{"2":{"57":1,"317":1,"328":1,"334":1}}],["v3",{"2":{"37":1}}],["view",{"2":{"167":1,"193":1,"200":1,"202":1,"263":1,"285":8,"324":1}}],["viewport",{"2":{"116":1,"123":1,"126":4}}],["viewing",{"0":{"185":1,"237":1,"259":1},"1":{"186":1,"187":1},"2":{"48":1,"278":1}}],["vision",{"2":{"225":1,"226":1}}],["visible",{"2":{"162":1,"254":1,"275":1}}],["visibility",{"2":{"10":1}}],["visual",{"2":{"51":1,"90":1,"116":1,"187":1}}],["via",{"0":{"239":1,"240":1},"2":{"32":1,"33":4,"36":1,"37":1,"53":1,"82":1,"85":1,"102":1,"109":1,"111":1,"156":1,"158":1,"180":2,"198":1,"230":1,"315":1,"316":1,"339":1,"341":1}}],["var",{"2":{"162":1,"320":1}}],["variable",{"2":{"319":1,"325":1}}],["variables",{"0":{"325":1},"2":{"198":1,"319":1}}],["varies",{"2":{"43":1}}],["various",{"2":{"18":1,"111":1,"132":1,"243":1}}],["valuable",{"2":{"152":1}}],["values",{"2":{"130":1,"210":1,"279":1}}],["value",{"2":{"13":1,"198":1,"210":1,"236":1,"279":1}}],["valid",{"2":{"130":1,"162":1,"254":1}}],["validity",{"2":{"87":1}}],["vendor",{"2":{"162":2}}],["very",{"2":{"305":1}}],["version=v0",{"2":{"319":2}}],["versions",{"2":{"172":1,"319":1,"325":1}}],["versioning",{"0":{"172":1},"2":{"164":1}}],["version",{"2":{"58":2,"172":5,"267":1,"280":1,"319":2,"325":1}}],["versioned",{"2":{"17":1}}],["verification",{"2":{"57":1,"163":1,"222":1}}],["verify",{"0":{"25":1},"2":{"76":1,"151":1,"212":1}}],["vectors",{"2":{"206":1,"317":1,"327":1,"328":1,"339":1}}],["vector",{"2":{"9":1,"17":1,"211":1,"213":1,"224":1,"229":2,"316":1,"317":1,"320":1,"323":1,"327":1,"330":1,"334":1}}],["vs",{"0":{"34":1,"153":1,"214":1,"242":1,"254":1},"2":{"11":1,"313":1}}],["null",{"2":{"240":1}}],["number",{"2":{"159":1,"213":1,"235":2,"277":1}}],["npx",{"2":{"198":1}}],["nvidia",{"2":{"161":2,"162":2}}],["navigation",{"0":{"183":1},"2":{"126":1,"129":1,"183":1}}],["navigating",{"2":{"124":1}}],["navigate",{"2":{"80":1,"112":1,"115":1,"122":1,"125":1,"128":1,"176":1,"237":1,"247":1,"249":1,"329":1,"336":1,"343":1,"345":1,"348":1,"350":1,"353":1,"358":1}}],["narrow",{"2":{"99":1}}],["named",{"2":{"265":1,"266":1,"357":1}}],["namespace",{"2":{"323":1}}],["names",{"2":{"62":1,"161":2,"162":1,"202":1,"277":1}}],["name",{"2":{"28":1,"54":1,"69":2,"112":2,"125":2,"126":2,"162":2,"165":1,"201":1,"218":2,"225":2,"235":2,"237":1,"240":1,"247":2,"259":1,"265":5,"266":2,"267":3,"268":2,"272":2,"274":1,"297":5,"298":1,"299":1,"300":1,"301":2,"303":6,"329":2,"330":1,"343":2,"348":2}}],["natural",{"2":{"13":1,"235":1,"239":1,"242":1}}],["night",{"2":{"14":1}}],["noise",{"2":{"210":1,"214":1}}],["noisy",{"2":{"153":1}}],["nobody",{"2":{"92":1}}],["now",{"2":{"88":1,"118":1,"149":2,"228":1,"262":1,"355":1,"358":1}}],["none",{"2":{"226":1,"285":8,"327":1}}],["non",{"2":{"26":1,"78":1}}],["no",{"2":{"18":1,"38":2,"46":2,"48":1,"66":1,"81":1,"87":1,"94":1,"97":1,"105":1,"119":1,"127":1,"135":2,"209":1,"256":1,"261":1,"290":1,"317":1,"319":1,"320":1,"327":1,"328":1,"331":1,"333":1,"336":1,"344":3,"349":1,"352":1,"359":1}}],["node",{"2":{"14":1,"17":1}}],["notable",{"2":{"220":1}}],["notifications",{"2":{"190":1}}],["noticed",{"2":{"14":1}}],["notes",{"2":{"78":1,"116":1,"135":1,"245":1}}],["note",{"2":{"26":1,"37":1,"80":1}}],["not",{"2":{"13":1,"14":3,"17":1,"24":1,"78":1,"102":1,"103":1,"115":1,"116":1,"118":1,"131":1,"142":1,"144":1,"146":1,"161":1,"162":1,"163":1,"205":1,"219":2,"230":2,"231":1,"255":1,"267":1,"274":1,"275":1,"278":1,"281":1,"287":1,"315":1,"320":1,"324":1,"336":1}}],["normally",{"2":{"162":1}}],["normal",{"2":{"9":1,"24":1,"116":2,"120":1,"220":1,"221":1,"231":1,"254":2,"255":1,"276":1,"281":1,"287":1}}],["neural",{"2":{"316":1,"317":3,"327":1,"328":1,"334":1,"339":1}}],["nerdctl",{"2":{"315":1}}],["next",{"0":{"131":1,"154":1,"232":1,"341":1,"360":1},"2":{"60":1,"145":1,"167":1}}],["needing",{"2":{"317":1}}],["needed",{"2":{"87":1,"105":1,"209":1,"228":1}}],["needs",{"2":{"43":1,"66":1,"145":1,"160":1,"163":1,"217":1}}],["need",{"2":{"17":1,"23":1,"24":1,"61":1,"69":1,"74":1,"120":1,"142":1,"146":1,"161":1,"231":1,"247":1,"261":1,"288":1,"315":1,"317":1,"347":1}}],["newest",{"2":{"290":1}}],["newer",{"2":{"145":1}}],["news",{"2":{"235":2,"279":1,"281":1,"303":3}}],["newbot",{"2":{"69":1}}],["new",{"0":{"255":2,"287":1},"1":{"256":2,"257":2},"2":{"6":1,"14":1,"28":1,"37":1,"60":1,"71":1,"80":1,"101":1,"119":1,"183":1,"208":1,"252":1,"255":6,"256":5,"257":1,"279":2,"284":1,"287":4,"311":1}}],["network",{"2":{"4":1,"18":1,"19":1,"199":1}}],["qdrant",{"2":{"316":3,"317":2,"320":2,"321":1,"323":2,"327":3,"330":2,"334":4,"335":5}}],["queries",{"2":{"317":1}}],["question",{"2":{"250":1}}],["questions",{"2":{"13":2}}],["quality",{"2":{"210":1,"317":1,"327":2,"328":1}}],["quarter",{"2":{"13":1}}],["quoted",{"2":{"281":1}}],["quotes",{"2":{"279":1}}],["quot",{"2":{"72":2,"156":2,"180":2,"190":2,"194":4,"214":2,"235":4,"239":2,"242":2,"247":2}}],["quickly",{"2":{"138":1,"183":1,"193":1,"201":2,"212":1,"317":1}}],["quick",{"0":{"92":1,"283":1},"1":{"284":1,"285":1},"2":{"33":1,"112":1}}],["quietly",{"2":{"14":1}}],["qr",{"0":{"87":1,"140":1},"2":{"7":1,"33":1,"34":1,"35":1,"73":1,"85":1,"87":5,"88":1,"135":2,"140":2}}],["qq",{"0":{"47":1,"48":1},"1":{"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"1":1,"7":1,"33":1,"47":2,"48":2,"49":1,"50":3,"52":2,"114":1,"135":2,"312":1}}],["duplicates",{"2":{"266":1}}],["duckduckgo",{"2":{"245":1}}],["duration",{"2":{"192":1}}],["durable",{"2":{"5":1,"16":1,"17":1,"20":1}}],["during",{"2":{"117":1,"130":1,"147":1,"158":1,"192":1,"194":2,"202":1,"215":1,"244":1,"263":1,"275":1,"317":1,"326":1}}],["dynamic",{"2":{"137":1}}],["draft",{"2":{"196":1,"310":1}}],["drag",{"2":{"101":1}}],["drivers",{"2":{"162":1}}],["driven",{"2":{"10":1}}],["dropdown",{"2":{"128":1,"249":1,"336":1,"345":1,"350":1,"355":1}}],["dropped",{"2":{"101":1}}],["d",{"2":{"37":1,"317":1,"320":2,"321":1,"324":2,"334":1,"335":1}}],["dms",{"2":{"67":1,"103":1}}],["dm",{"2":{"33":1,"66":1,"135":1}}],["daily",{"2":{"235":1,"239":1,"240":1,"279":1,"313":1}}],["date",{"2":{"213":1}}],["data",{"0":{"168":1},"1":{"169":1,"170":1,"171":1},"2":{"114":1,"122":2,"159":2,"168":1,"169":2,"170":1,"171":1,"190":1,"196":1,"198":1,"233":1,"266":5,"294":1,"319":3,"323":1}}],["database",{"2":{"18":1,"114":1,"316":2,"320":1,"323":2,"334":1}}],["danger",{"2":{"114":1,"122":1}}],["dashboard",{"2":{"60":1}}],["days",{"2":{"210":1,"292":1}}],["day",{"2":{"10":1,"16":1,"236":5,"239":1,"337":2,"346":2,"351":2}}],["db",{"2":{"17":1,"320":3}}],["domain",{"2":{"176":1}}],["document",{"2":{"317":1}}],["documentation",{"0":{"312":1},"1":{"313":1,"314":1},"2":{"52":1,"84":1}}],["docs",{"2":{"265":1}}],["docker",{"0":{"315":1},"1":{"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1},"2":{"11":1,"130":1,"159":1,"313":1,"315":2,"316":1,"317":1,"318":2,"319":6,"320":5,"321":5,"324":6,"325":2,"334":1}}],["downloaded",{"2":{"317":1}}],["downloads",{"2":{"276":1}}],["download",{"2":{"184":1}}],["downloadable",{"2":{"169":1}}],["down",{"2":{"29":1,"158":1,"324":1}}],["don",{"2":{"14":2,"16":2,"317":1}}],["doing",{"2":{"14":1}}],["doesn",{"2":{"14":1,"158":1}}],["does",{"2":{"13":1,"146":1,"161":1,"162":1,"163":1,"180":1,"235":1,"281":1,"317":1}}],["do",{"2":{"11":1,"24":1,"37":1,"142":1,"230":1,"231":2,"278":1,"315":1}}],["debug",{"2":{"323":1}}],["debugging",{"0":{"110":1},"2":{"291":1}}],["dedicate",{"2":{"116":1}}],["dedicated",{"2":{"33":1,"117":1,"118":1,"152":1,"155":1,"181":1,"347":1}}],["demos",{"2":{"103":1}}],["determined",{"2":{"130":1}}],["determines",{"2":{"97":1}}],["detail",{"0":{"113":1},"1":{"114":1},"2":{"65":1,"70":1,"113":1,"115":1,"122":1,"134":1,"145":1,"151":1,"157":1,"177":1,"181":1,"191":1,"197":1,"207":1,"237":1}}],["details",{"2":{"58":1,"202":1,"310":1,"317":1}}],["detailed",{"2":{"35":1,"192":1,"280":1}}],["dense",{"0":{"335":1},"2":{"206":1,"316":1,"317":1,"327":2,"328":1,"330":3,"339":1}}],["density",{"2":{"14":2}}],["denied",{"2":{"94":1,"107":1,"108":1,"291":1}}],["deny",{"2":{"91":1,"92":6,"94":2,"95":1,"96":1,"97":1,"100":1,"103":2,"106":2,"107":1,"108":1,"296":1}}],["definitions",{"2":{"323":1}}],["defined",{"2":{"259":1}}],["defines",{"2":{"235":1}}],["define",{"2":{"91":1,"92":1,"114":1,"116":1,"216":1,"338":1}}],["defaults",{"2":{"255":1,"287":1,"319":2,"330":1,"344":1}}],["default",{"0":{"94":1},"2":{"18":1,"19":1,"38":2,"49":2,"81":1,"92":5,"94":1,"97":1,"99":1,"105":2,"106":1,"107":1,"110":1,"114":1,"119":2,"126":1,"130":1,"191":1,"228":1,"236":1,"253":2,"254":1,"255":4,"279":1,"285":1,"287":4,"296":1,"320":1,"322":1,"323":2,"325":1,"330":1,"339":1,"341":1,"353":1,"354":4,"358":1}}],["desirable",{"2":{"254":1}}],["desired",{"2":{"166":1}}],["designed",{"2":{"10":1,"245":1}}],["described",{"2":{"120":1}}],["descriptions",{"2":{"202":1,"277":1}}],["description",{"2":{"38":1,"54":1,"81":1,"89":1,"95":1,"114":1,"116":1,"117":1,"118":1,"126":1,"138":1,"147":1,"191":1,"198":1,"199":1,"218":1,"225":1,"229":1,"235":2,"240":1,"253":1,"265":2,"284":1,"285":1,"296":1,"316":1,"323":1,"325":1,"330":1,"344":1,"349":1,"354":1,"359":1}}],["declare",{"2":{"226":1}}],["decay",{"2":{"210":1}}],["decisions",{"0":{"110":1}}],["decides",{"2":{"253":1}}],["decide",{"2":{"6":1,"14":1,"149":1,"226":1,"227":1,"254":1}}],["decentralized",{"2":{"33":1,"36":1,"135":1}}],["developer",{"2":{"23":1,"28":1,"30":1,"55":1}}],["devices",{"0":{"160":1,"161":1},"1":{"161":1,"162":1,"163":1},"2":{"159":2,"160":3,"161":1,"162":2,"163":2}}],["device",{"2":{"14":1,"17":1,"19":1,"126":2,"160":1,"161":2,"162":6,"163":1,"219":1,"222":1}}],["deployment",{"2":{"34":1,"74":1,"313":1}}],["deployable",{"2":{"17":1}}],["depending",{"2":{"23":1,"35":1,"108":1,"206":1,"247":1}}],["dependable",{"2":{"16":1}}],["delegates",{"2":{"253":1}}],["delegated",{"2":{"3":1,"6":1,"8":1,"263":1}}],["deletes",{"2":{"301":1}}],["delete",{"0":{"272":1},"2":{"122":1,"127":1,"143":1,"146":1,"158":1,"167":1,"178":1,"184":1,"201":2,"209":1,"248":2,"257":1,"272":1,"277":1,"282":1,"301":2,"303":2,"331":1,"337":1}}],["deleting",{"0":{"122":1,"261":1},"2":{"201":1,"255":1,"261":1,"272":1,"273":1,"287":1}}],["delivered",{"2":{"241":1}}],["deliver",{"2":{"234":1}}],["delivering",{"2":{"76":1}}],["delivery",{"2":{"74":1,"176":1,"179":1}}],["deliberative",{"2":{"6":1}}],["digest",{"2":{"239":1,"240":1}}],["dimensions",{"2":{"229":1}}],["diagnose",{"2":{"151":1}}],["directories",{"2":{"183":1,"184":1,"266":1}}],["directory",{"2":{"171":1,"182":1,"183":1,"198":1,"265":1,"268":1,"270":1,"272":1,"274":1,"276":1,"319":2,"323":1}}],["direct",{"2":{"33":1,"36":1,"39":1,"40":1,"50":1,"51":1,"59":1,"62":2,"66":1,"67":1,"83":1,"90":1,"103":1,"218":1,"254":3,"287":1}}],["directly",{"2":{"11":1,"82":1,"85":1,"88":1,"121":1,"139":1,"181":1,"187":1,"209":1,"253":1,"266":1,"271":1,"321":1}}],["differ",{"2":{"117":1,"287":1}}],["differs",{"2":{"19":1}}],["different",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"3":1,"5":1,"34":1,"73":1,"133":1,"153":1,"191":1,"210":1,"214":1,"253":1,"256":1,"307":1,"326":1}}],["did",{"2":{"14":1,"117":1,"263":1}}],["displays",{"2":{"159":1,"213":1}}],["display",{"2":{"69":1,"112":1,"125":1,"126":1,"218":1,"225":1,"235":1,"329":1,"343":1,"348":1}}],["displayed",{"2":{"48":1,"87":1}}],["disable",{"0":{"273":1},"2":{"117":1,"118":1,"138":1,"143":1,"147":1,"201":1,"268":1,"273":1,"277":1,"282":1,"303":3}}],["disabled",{"2":{"10":1,"138":1,"241":1,"267":2,"273":1,"275":1}}],["disappears",{"2":{"14":1}}],["discovered",{"2":{"266":5,"268":1,"272":1,"274":1,"276":2}}],["discovers",{"2":{"202":1,"276":1}}],["discovery",{"0":{"202":1},"2":{"310":1}}],["discover",{"2":{"44":1,"162":1,"200":1,"203":1,"280":1}}],["discord",{"0":{"27":1,"28":1,"256":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"1":1,"7":1,"27":1,"28":1,"30":1,"31":1,"32":1,"33":1,"95":2,"102":1,"114":1,"133":1,"135":2,"255":1,"287":1,"312":1}}],["discuss",{"0":{"6":1,"120":1,"254":1},"2":{"6":1,"11":1,"120":3,"253":2,"254":3,"255":5,"256":1,"257":1,"259":1,"263":1,"284":1,"287":6,"313":1}}],["distinction",{"2":{"5":1,"224":1}}],["distinguishes",{"2":{"7":1,"224":1,"266":1}}],["distinguish",{"2":{"3":1}}],["dingtalk",{"0":{"22":1,"23":1,"142":1},"1":{"23":1,"24":1,"25":1,"26":1},"2":{"1":1,"7":1,"22":2,"23":2,"24":2,"25":1,"26":1,"33":1,"114":1,"135":2,"142":1,"312":1}}],["guidance",{"2":{"264":1}}],["guides",{"0":{"135":1,"314":1},"2":{"35":1,"314":1}}],["guide",{"2":{"30":1,"57":2,"68":1,"69":1,"73":1,"135":1,"227":1}}],["gpt",{"2":{"225":1,"297":2}}],["gpu=all",{"2":{"161":2}}],["gpu=0",{"2":{"161":2}}],["gpus",{"2":{"160":1}}],["gpu",{"2":{"159":1,"161":3,"162":1}}],["gather",{"2":{"129":1}}],["gateways",{"2":{"33":1}}],["gateway",{"0":{"124":1},"2":{"29":1,"123":1,"124":1,"316":1,"322":1,"323":2}}],["global",{"2":{"95":1,"245":1}}],["g",{"2":{"37":2,"38":2,"69":3,"95":2,"176":1,"183":1,"186":1,"187":1,"198":2,"199":1,"211":1,"235":3,"241":1,"247":2,"319":1,"325":1,"349":1,"357":2,"358":1}}],["gmail",{"2":{"33":1}}],["gt",{"2":{"30":1,"50":1,"54":1,"55":1,"56":1,"57":1,"58":1,"71":1,"80":1,"266":1,"280":3,"297":6,"298":1,"299":1,"300":1,"301":2,"303":8,"305":1}}],["grown",{"2":{"307":1}}],["grows",{"2":{"145":1}}],["grounded",{"2":{"250":1}}],["grouped",{"2":{"252":1}}],["group",{"2":{"22":1,"25":1,"26":1,"33":1,"36":1,"40":1,"51":1,"56":1,"62":1,"78":1,"82":1,"83":2,"92":3,"100":2,"102":2,"103":3,"110":1,"119":1,"135":1,"254":1,"255":1,"263":1,"279":2,"280":3,"281":1,"285":1,"287":1,"320":1,"324":1}}],["groups",{"0":{"285":1},"2":{"3":1,"18":1,"53":1,"62":2,"63":1,"92":1,"279":2}}],["gracefully",{"2":{"158":1}}],["grained",{"2":{"102":1,"119":1}}],["granting",{"2":{"200":1}}],["grants",{"2":{"96":1}}],["grant",{"2":{"23":1}}],["graphical",{"2":{"18":1}}],["grade",{"2":{"15":1}}],["good",{"2":{"135":1,"164":1,"221":1,"317":1,"327":1}}],["google",{"2":{"9":1,"217":1,"219":2,"244":1,"245":1}}],["goal",{"2":{"108":1}}],["go",{"2":{"24":1,"28":2,"30":1,"31":1,"38":1,"44":1,"48":1,"49":1,"50":1,"54":2,"55":1,"56":1,"57":2,"58":1,"60":1,"65":1,"70":1,"71":1,"75":1,"81":1,"86":1,"128":1,"249":1,"269":1,"336":1,"345":1,"350":1}}],["got",{"2":{"14":1}}],["git",{"2":{"318":1,"320":1,"325":1}}],["github",{"0":{"222":1},"2":{"9":1,"217":1,"219":2,"220":1,"222":3,"319":1,"320":1}}],["giving",{"2":{"252":1}}],["gives",{"2":{"119":1}}],["give",{"2":{"1":1,"14":1,"19":1,"28":1,"123":1,"265":1}}],["giant",{"2":{"115":1}}],["gemini",{"2":{"217":1,"219":1}}],["generic",{"2":{"174":1,"176":1,"242":1}}],["generator",{"2":{"30":1}}],["generates",{"2":{"75":1,"141":1}}],["generate",{"2":{"28":1,"43":1,"50":1,"57":1,"71":1,"116":1,"139":1,"226":1,"319":1,"320":1}}],["generated",{"2":{"14":1,"30":1,"40":1,"61":1,"259":1,"319":1}}],["generating",{"2":{"51":1,"89":1,"90":1,"116":1}}],["generation",{"0":{"228":1},"2":{"9":1,"116":4,"224":1,"228":2,"231":1,"279":1,"284":1,"288":1}}],["generative",{"2":{"9":1,"219":1}}],["generally",{"2":{"45":1}}],["general",{"0":{"35":1,"116":1},"2":{"10":1,"114":1,"115":1,"116":1,"122":1,"128":1,"147":1,"205":1,"242":1,"249":1,"336":1,"338":1,"340":1,"345":1,"350":1,"355":1,"358":1}}],["get",{"2":{"11":1,"13":1,"69":1,"87":1,"279":2,"285":1,"296":2,"301":2,"303":2}}],["gets",{"2":{"5":1,"19":1,"152":1}}],["hub",{"2":{"133":1,"321":1}}],["human",{"2":{"14":1}}],["humans",{"2":{"3":1,"18":1}}],["html",{"2":{"129":1}}],["http",{"0":{"199":1},"2":{"74":1,"199":2,"322":3,"323":1,"334":2,"335":1,"349":1}}],["https",{"2":{"37":1,"38":1,"43":1,"126":2,"221":1,"319":6,"320":1,"344":1}}],["h",{"2":{"37":1}}],["hybrid",{"2":{"19":1}}],["here",{"0":{"313":1},"2":{"311":1,"323":1}}],["height",{"2":{"126":2}}],["headers",{"2":{"199":2}}],["headless",{"2":{"123":1}}],["health",{"2":{"114":1}}],["heartbeat",{"0":{"117":1,"189":1,"242":1,"293":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1},"2":{"6":1,"10":1,"114":2,"115":1,"117":8,"189":1,"190":1,"191":5,"192":4,"193":1,"194":3,"242":2,"253":2,"257":1,"263":3,"285":2,"293":3,"296":6,"297":4}}],["helper",{"2":{"265":1}}],["help",{"0":{"280":1},"2":{"265":1,"280":7,"281":2,"282":1,"284":2}}],["helps",{"2":{"145":1,"149":1,"172":1,"260":1}}],["helpful",{"2":{"110":1}}],["held",{"2":{"19":1}}],["hour",{"2":{"236":1}}],["hours",{"2":{"18":1}}],["host",{"0":{"162":1},"2":{"155":1,"159":1,"160":3,"162":5,"176":1,"315":1,"323":3}}],["hosted",{"2":{"42":1,"245":1,"339":2,"341":2,"347":1}}],["how",{"0":{"17":1,"263":1,"328":1},"2":{"117":1,"118":1,"138":1,"146":1,"147":2,"151":1,"191":1,"192":1,"216":1,"262":1,"287":1,"330":1,"338":1,"356":1}}],["homeserver>",{"2":{"37":1}}],["homeserver",{"2":{"33":1,"36":1,"37":1,"38":2,"135":1}}],["home",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"14":2,"15":1,"19":1,"20":1,"305":2}}],["historical",{"2":{"146":1}}],["history",{"0":{"179":1},"2":{"15":1,"30":1,"62":4,"66":1,"153":1,"172":1,"193":1,"208":1,"214":1,"251":1,"252":1,"255":1,"256":1,"261":1,"287":1,"307":1}}],["highlighting",{"2":{"186":1}}],["highly",{"2":{"103":1,"245":1}}],["high",{"2":{"116":1,"176":1,"226":1,"296":1}}],["higher",{"2":{"101":1}}],["highest",{"2":{"97":1,"327":1}}],["hierarchy",{"2":{"102":1}}],["hint",{"2":{"49":1}}],["hide",{"2":{"14":1}}],["hit",{"2":{"6":1,"149":1,"262":1,"290":1}}],["happened",{"2":{"151":1}}],["happening",{"2":{"14":1}}],["have",{"2":{"19":1,"115":1,"131":1,"153":1,"158":1,"196":1,"205":1,"211":1,"222":1,"230":1,"279":1,"288":1,"357":1}}],["having",{"2":{"18":1}}],["half",{"2":{"14":1}}],["hardware",{"2":{"13":1,"14":1}}],["handles",{"2":{"180":1,"321":1,"342":1}}],["handled",{"2":{"63":1}}],["hand",{"2":{"10":1}}],["has",{"2":{"1":1,"14":1,"75":1,"87":1,"94":1,"96":1,"100":1,"153":1,"171":1,"181":1,"205":1,"211":1,"214":1,"235":1,"239":1,"256":1,"267":2,"280":1,"290":1,"307":1}}],["right",{"2":{"149":1,"248":1}}],["rich",{"2":{"8":1,"33":1,"51":1}}],["rule",{"0":{"96":1},"2":{"94":2,"96":1,"97":6,"100":2,"103":1,"108":1,"109":1,"110":1,"119":1,"234":1,"314":1}}],["rules",{"0":{"100":1,"101":1,"281":1},"2":{"91":1,"92":2,"95":2,"97":2,"99":1,"101":2,"102":1,"105":1,"106":1,"107":1,"114":1,"115":1,"119":1,"265":1,"291":1}}],["runtime",{"0":{"275":1},"2":{"17":1,"114":1,"115":2,"118":1,"154":1,"159":1,"160":1,"162":1,"172":1,"206":1,"262":1,"265":1,"275":1,"290":1,"317":1,"336":1}}],["running",{"2":{"11":1,"35":1,"121":1,"151":1,"158":1,"159":2,"279":1,"319":1,"320":1}}],["run",{"2":{"4":1,"16":1,"17":1,"18":1,"20":1,"150":2,"151":1,"162":1,"163":1,"198":1,"285":1,"307":2,"315":1,"319":1}}],["runs",{"2":{"4":1,"18":1,"117":2,"118":1,"150":1,"151":1,"235":1,"239":1,"263":1,"278":1,"315":1,"317":2,"328":1,"334":1}}],["range",{"2":{"354":1}}],["rand",{"2":{"320":1}}],["raw",{"2":{"270":1,"271":1}}],["raise",{"2":{"16":1}}],["ram",{"2":{"14":1}}],["rag",{"2":{"14":1,"15":1}}],["ratio",{"2":{"118":1,"126":1,"147":1,"210":2}}],["rather",{"2":{"9":1,"120":1,"210":1}}],["rate",{"2":{"6":1,"149":1,"262":1,"290":1}}],["roots",{"2":{"266":1}}],["root",{"2":{"218":1,"266":4}}],["room",{"2":{"39":1}}],["rooms",{"2":{"36":1,"38":1,"40":2,"103":1}}],["rocm",{"2":{"163":1}}],["routine",{"2":{"194":1,"233":1,"242":1}}],["routing",{"2":{"138":1,"255":1,"313":1}}],["routed",{"2":{"346":1,"351":1}}],["routes",{"2":{"253":1}}],["router",{"2":{"14":3,"17":2}}],["route",{"2":{"6":1,"255":1,"256":1,"279":1,"287":1,"290":2}}],["roadmap",{"2":{"40":1}}],["role",{"2":{"9":1,"110":1,"285":1,"291":1}}],["roles",{"2":{"3":1,"231":1,"313":1}}],["reuse",{"2":{"222":1}}],["reusable",{"2":{"8":1,"124":1,"264":1,"277":1}}],["rewriting",{"2":{"210":1}}],["rewrite",{"2":{"144":1}}],["rewrites",{"2":{"5":1,"153":1,"210":1,"214":1,"307":1}}],["requiring",{"2":{"317":1}}],["require",{"2":{"200":1}}],["requirements",{"0":{"162":1,"332":1},"1":{"333":1,"334":1,"335":1},"2":{"326":1,"327":1}}],["requires",{"2":{"100":1,"102":1,"121":1,"163":1,"200":1,"250":1,"319":1,"328":1,"334":1,"335":1,"339":1,"352":1}}],["required",{"2":{"18":1,"38":2,"48":1,"56":1,"62":1,"75":1,"81":2,"120":1,"137":1,"162":1,"176":1,"218":1,"229":1,"310":1,"320":1,"333":1,"344":1,"349":1,"359":1}}],["requested",{"2":{"203":1,"256":1}}],["revoke",{"2":{"200":1}}],["review",{"2":{"64":1,"117":1,"196":1}}],["redirected",{"2":{"200":1}}],["reducing",{"2":{"210":1}}],["reduce",{"2":{"214":1,"314":1}}],["reduced",{"2":{"118":1,"147":1}}],["reduces",{"2":{"5":1,"144":1,"206":1,"307":1}}],["redundant",{"2":{"153":1,"210":1}}],["renaming",{"0":{"260":1}}],["rename",{"2":{"184":2,"257":1,"260":1}}],["rendered",{"2":{"124":1}}],["returns",{"2":{"150":1}}],["retrieves",{"2":{"215":1,"338":1}}],["retrieve",{"2":{"184":1}}],["retrieved",{"2":{"18":1,"206":1,"330":1,"333":1}}],["retrieval",{"0":{"206":1},"2":{"17":1,"206":1,"210":1,"214":1,"224":1,"229":1,"316":1,"317":3,"326":2,"327":1,"328":1,"342":1}}],["rebuild",{"0":{"211":1},"2":{"130":1,"211":3,"326":1,"337":1}}],["referencing",{"2":{"256":1}}],["reference",{"0":{"116":1,"117":1,"118":1,"236":1,"283":1,"323":1},"1":{"284":1,"285":1}}],["refresh",{"2":{"183":1,"193":1,"202":1,"237":1,"310":1}}],["refine",{"0":{"99":1},"2":{"92":1,"115":1,"119":1}}],["reordering",{"0":{"101":1},"2":{"101":1}}],["reorder",{"2":{"99":1}}],["reload",{"2":{"183":1,"237":1}}],["relate",{"0":{"263":1}}],["related",{"0":{"120":1},"2":{"34":1,"161":1,"294":1}}],["relative",{"2":{"262":1}}],["relationships",{"2":{"167":1}}],["relationship",{"0":{"152":1}}],["relevant",{"2":{"147":1,"202":1,"204":1,"206":1}}],["release",{"2":{"58":2,"319":2,"325":1}}],["relying",{"2":{"129":1}}],["relies",{"2":{"34":1,"229":1}}],["regardless",{"2":{"50":1,"71":1,"95":1}}],["registry",{"2":{"321":2,"323":2}}],["registration",{"2":{"33":1}}],["register",{"2":{"35":1,"37":1,"239":1}}],["regular",{"2":{"6":1}}],["resolve",{"2":{"281":1}}],["resolves",{"2":{"266":1}}],["resource",{"0":{"285":1},"2":{"279":4}}],["resources",{"0":{"41":1,"52":1,"84":1},"2":{"115":1,"158":1,"203":1}}],["research",{"2":{"245":1,"265":1}}],["resetting",{"2":{"255":1}}],["resets",{"2":{"171":1,"252":1}}],["reset",{"2":{"28":1,"48":1,"166":1,"287":1}}],["rest",{"2":{"240":1}}],["restoring",{"0":{"166":1}}],["restore",{"0":{"171":1},"2":{"164":1,"166":1,"171":1}}],["restricted",{"2":{"103":1}}],["restrict",{"2":{"100":1,"102":1,"210":1}}],["results",{"2":{"129":1,"234":1,"241":1,"250":2,"263":1,"317":1}}],["resulting",{"2":{"99":1}}],["result",{"2":{"92":1,"119":1,"150":1,"153":1,"192":1,"240":1,"291":1}}],["response",{"2":{"192":1,"250":1}}],["responses",{"2":{"9":1,"26":1,"40":1,"51":1,"68":1,"72":1,"78":1,"83":1,"89":1,"90":1,"116":1,"219":2}}],["respond",{"2":{"36":1,"71":1,"180":1}}],["repository",{"2":{"319":1}}],["reports",{"2":{"162":1,"180":1,"233":1}}],["reporting",{"2":{"116":1}}],["repeatedly",{"2":{"277":1}}],["represent",{"2":{"43":1,"259":1}}],["reproducible",{"2":{"16":1}}],["replace",{"2":{"146":1}}],["replacing",{"2":{"145":1}}],["reply",{"2":{"25":1,"42":1,"77":1,"253":1,"254":1}}],["replies",{"2":{"22":1,"26":1,"33":1,"43":1,"45":1,"46":1,"59":1,"62":1,"72":2,"78":1,"135":2}}],["removing",{"2":{"138":1}}],["removes",{"2":{"261":1,"272":1}}],["remove",{"2":{"62":1,"122":1,"127":1,"143":1,"158":1,"167":1,"184":1,"193":1,"200":1,"209":1,"210":1,"261":1,"273":1,"331":1}}],["remote",{"0":{"199":1},"2":{"114":1,"199":2}}],["remains",{"2":{"17":1}}],["remember",{"2":{"14":1,"19":1,"188":1,"204":1}}],["re",{"2":{"16":1,"211":2,"273":1}}],["recurring",{"2":{"190":1,"233":1,"242":1}}],["recursive",{"2":{"184":1}}],["recipient",{"2":{"179":1}}],["recreating",{"2":{"163":1,"171":1}}],["recreate",{"2":{"161":1}}],["recent",{"2":{"118":1,"285":1,"293":1}}],["receive",{"2":{"40":1,"56":1,"57":2,"59":1,"62":1,"173":1}}],["receives",{"2":{"25":1,"66":1,"77":1,"194":1,"241":1}}],["receiving",{"2":{"35":1,"82":1}}],["records",{"2":{"146":1,"193":1,"253":1}}],["recommended",{"0":{"231":1,"277":1,"319":1},"2":{"62":1,"99":1,"245":1,"313":1,"315":1,"320":1}}],["recognition",{"2":{"50":1,"71":1}}],["recognized",{"2":{"3":1}}],["recalls",{"2":{"5":1}}],["reasoning",{"2":{"114":1,"116":4,"203":1,"224":1,"225":1,"226":4,"296":2}}],["reached",{"2":{"241":1}}],["reach",{"2":{"74":1}}],["reachable",{"2":{"7":1,"11":1,"212":1}}],["reaction",{"2":{"45":1}}],["reactions",{"2":{"33":2,"46":1,"62":2,"135":1}}],["reads",{"2":{"262":1}}],["reading",{"2":{"124":1}}],["ready",{"2":{"33":1,"58":1}}],["read",{"2":{"4":1,"30":1,"42":1,"43":1,"59":1,"62":11,"66":2,"67":1,"178":1,"186":1,"188":1,"219":1,"241":1,"253":1,"262":1,"282":1,"290":1,"305":4,"352":1,"353":1,"354":1,"357":1,"359":1}}],["realized",{"2":{"14":1}}],["reality",{"2":{"13":1}}],["real",{"0":{"244":1},"2":{"3":2,"13":2,"14":4,"19":1,"76":1,"83":1,"129":1,"158":1,"159":1,"162":1,"211":1,"243":1,"250":1,"253":1,"255":1}}],["f",{"2":{"321":2,"324":1}}],["fssl",{"2":{"319":6}}],["fs",{"0":{"305":1},"2":{"285":1,"305":5}}],["flask",{"2":{"317":1}}],["flags",{"2":{"225":1,"226":1}}],["flexible",{"2":{"242":1}}],["flow",{"0":{"35":1,"136":1,"241":1,"246":1,"340":1,"358":1},"1":{"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"247":1,"248":1},"2":{"116":2,"135":2,"140":1,"200":1,"221":1,"223":1,"230":1}}],["flows",{"2":{"10":1}}],["found",{"2":{"266":1}}],["focus",{"2":{"251":1}}],["focused",{"2":{"33":1,"245":1,"277":1}}],["folders",{"2":{"184":1}}],["folder",{"2":{"183":1,"184":1}}],["follow",{"2":{"69":1,"279":1,"288":1}}],["following",{"2":{"33":1,"56":1,"125":1,"247":1,"329":1,"334":1,"339":1,"343":1,"348":1}}],["footprint",{"2":{"144":1,"206":1,"307":1}}],["force",{"2":{"48":1,"231":1,"255":2,"287":2}}],["forcing",{"2":{"14":1}}],["forward",{"2":{"19":1}}],["format",{"2":{"230":1,"323":1,"354":2,"356":1,"357":1,"358":1}}],["formats",{"2":{"186":1}}],["formatting",{"2":{"49":1,"51":1,"68":1}}],["formatted",{"2":{"40":1}}],["forms",{"2":{"123":1,"124":1,"255":1,"281":1,"287":1}}],["form",{"2":{"13":1,"14":1,"102":1,"115":1,"218":1,"221":1,"222":1,"248":2}}],["for",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"3":2,"8":4,"9":3,"10":1,"14":2,"16":1,"17":1,"18":1,"20":1,"22":3,"23":2,"24":1,"32":1,"33":8,"35":1,"37":1,"40":2,"42":1,"43":4,"45":1,"51":2,"56":2,"58":1,"60":1,"66":3,"67":1,"69":2,"72":1,"73":2,"78":1,"83":1,"90":2,"92":1,"95":3,"97":1,"102":1,"103":6,"106":1,"107":1,"109":1,"112":1,"114":2,"115":3,"116":4,"117":1,"118":1,"119":2,"120":2,"122":1,"124":2,"125":1,"129":1,"130":2,"133":1,"135":2,"140":1,"141":1,"142":2,"145":1,"146":1,"147":1,"148":1,"150":1,"151":1,"153":1,"159":2,"160":1,"163":1,"164":1,"165":1,"168":1,"173":1,"176":2,"180":1,"184":1,"189":1,"190":1,"196":1,"198":2,"199":1,"200":1,"201":1,"210":1,"212":1,"213":1,"214":1,"217":1,"219":3,"221":1,"224":2,"225":1,"227":1,"229":2,"231":4,"233":1,"235":3,"237":1,"242":2,"243":1,"245":2,"247":2,"255":1,"259":2,"262":2,"263":2,"266":1,"267":1,"271":1,"272":1,"275":1,"277":1,"278":1,"279":2,"280":2,"281":3,"287":3,"288":1,"290":3,"291":1,"292":1,"294":1,"301":1,"303":1,"307":1,"308":1,"316":3,"317":3,"319":3,"321":1,"325":1,"329":1,"330":1,"337":1,"338":1,"343":1,"344":3,"346":1,"347":1,"348":1,"349":1,"351":1,"352":1}}],["future",{"2":{"146":1,"153":1,"214":1}}],["full",{"2":{"32":1,"40":1,"51":1,"83":1,"90":1,"200":1}}],["fully",{"2":{"16":2,"195":1,"276":1,"339":1}}],["furthermore",{"2":{"20":1}}],["friendly",{"2":{"218":1,"225":1,"247":1}}],["free",{"2":{"352":1,"359":1}}],["freely",{"2":{"18":1}}],["fresh",{"2":{"87":1,"171":1,"252":1,"255":1,"257":1,"278":1,"287":1}}],["frontend",{"2":{"323":1}}],["frontmatter",{"2":{"265":1}}],["frontier",{"2":{"17":1,"20":1}}],["from",{"0":{"149":1,"150":1,"266":1},"2":{"7":1,"10":1,"11":1,"14":1,"35":2,"37":1,"64":1,"67":1,"72":1,"73":1,"74":1,"76":1,"77":1,"87":1,"91":1,"92":2,"94":1,"96":1,"97":1,"100":1,"108":2,"112":1,"116":3,"117":2,"119":1,"125":1,"126":1,"134":1,"137":1,"147":1,"157":1,"160":1,"170":1,"174":1,"175":1,"176":1,"177":1,"181":1,"184":2,"191":2,"196":2,"197":1,"201":1,"202":1,"205":1,"206":1,"207":1,"208":2,"210":1,"211":2,"216":2,"218":1,"222":1,"228":1,"230":2,"245":1,"247":1,"248":1,"251":1,"253":1,"255":1,"256":1,"262":1,"263":1,"264":2,"266":3,"273":1,"274":2,"276":1,"277":1,"307":1,"314":1,"317":1,"319":2,"326":1,"328":1,"330":1,"337":2,"340":2,"344":1,"349":1,"357":2,"358":1}}],["false",{"2":{"296":2,"325":1}}],["fallback",{"2":{"272":2,"273":1}}],["falls",{"2":{"116":1}}],["fail",{"2":{"320":1}}],["failure",{"2":{"151":1}}],["failed",{"2":{"118":1,"151":1,"192":1}}],["favorite",{"2":{"33":1,"132":1}}],["fastest",{"2":{"280":1,"287":1}}],["faster",{"2":{"19":1}}],["fast",{"2":{"14":1,"278":1,"317":1}}],["familiar",{"2":{"13":1,"182":1}}],["factor",{"2":{"13":1,"126":1}}],["facts",{"2":{"5":1}}],["facing",{"2":{"6":1,"7":1,"259":1}}],["few",{"2":{"115":1,"281":1}}],["featuring",{"2":{"68":1}}],["feature",{"0":{"314":1},"2":{"33":1,"153":1,"189":1,"211":1,"225":1,"229":1,"242":1}}],["features",{"0":{"18":1,"26":1,"32":1,"40":1,"46":1,"51":1,"67":1,"72":1,"78":1,"83":1,"90":1,"263":1},"2":{"40":1,"116":1,"153":1,"226":1,"242":1}}],["federated",{"2":{"33":1}}],["feb",{"2":{"21":1}}],["feedback",{"2":{"51":1,"90":1,"158":1}}],["feed",{"2":{"16":1}}],["feels",{"2":{"20":1}}],["feeling",{"2":{"14":1}}],["feel",{"2":{"13":1,"14":2,"254":1}}],["fetch",{"2":{"8":1,"35":1,"87":1,"317":1,"319":1}}],["feishu",{"0":{"53":1,"54":1,"139":1,"256":1},"1":{"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"1":1,"7":1,"18":1,"33":1,"53":1,"54":1,"55":1,"57":3,"58":1,"114":1,"135":2,"139":3,"312":1}}],["fixed",{"2":{"242":1}}],["fixes",{"2":{"14":1}}],["fit",{"2":{"135":1,"221":1}}],["fired",{"2":{"235":1}}],["fires",{"2":{"234":1,"241":1,"253":1}}],["firefox",{"2":{"126":1,"130":3,"325":1}}],["first",{"2":{"14":1,"15":1,"19":2,"42":1,"97":2,"101":1,"115":1,"141":1,"236":1,"322":1}}],["field",{"2":{"38":1,"57":1,"70":1,"81":1,"89":1,"116":1,"117":1,"118":1,"120":1,"125":1,"126":1,"138":1,"147":1,"191":1,"198":1,"199":1,"205":1,"218":1,"225":1,"229":2,"235":1,"236":1,"330":1,"344":1,"349":1,"354":1}}],["fields",{"0":{"138":1,"235":1},"2":{"38":1,"75":1,"81":1,"102":1,"137":1,"147":1,"151":1,"176":1,"218":1,"225":1,"236":1,"262":1,"329":1,"343":1,"348":1}}],["finds",{"2":{"206":1,"267":1}}],["find",{"2":{"128":1,"166":1,"193":1,"201":1,"249":1,"336":1,"345":1,"350":1,"355":1}}],["fine",{"2":{"102":1,"119":1}}],["final",{"2":{"35":1}}],["finished",{"2":{"14":1,"151":1}}],["filter",{"2":{"193":1,"209":1,"257":1}}],["filling",{"2":{"124":1}}],["fill",{"2":{"24":1,"38":1,"57":1,"58":1,"65":1,"75":1,"81":1,"112":1,"123":1,"125":1,"129":1,"137":1,"176":1,"201":1,"218":1,"247":1,"270":1,"310":1,"329":1,"343":1,"348":1}}],["fileviewer",{"2":{"185":1}}],["filemanager",{"2":{"182":1}}],["file",{"2":{"8":1,"114":1,"158":1,"170":1,"182":1,"183":1,"184":2,"186":2,"187":2,"201":2,"206":1,"241":1,"265":2,"270":1,"305":1,"320":1,"323":1,"325":1,"327":1,"333":1,"339":1}}],["files",{"0":{"181":1,"184":1,"186":1,"188":1},"1":{"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1},"2":{"4":1,"10":1,"17":1,"18":1,"19":1,"30":1,"32":1,"33":1,"40":1,"51":1,"59":1,"62":4,"66":2,"67":2,"72":2,"114":2,"122":1,"156":1,"162":1,"181":1,"183":1,"184":2,"185":1,"188":2,"285":1}}],["filesystem",{"0":{"302":1},"1":{"303":1,"304":1,"305":1},"2":{"4":1,"114":1,"155":1,"169":1,"170":1,"171":1,"181":2,"186":1,"190":1,"198":1,"305":1}}],["five",{"2":{"6":1,"236":1,"253":1}}],["uuid",{"2":{"296":2}}],["utc",{"2":{"126":1,"236":1,"323":1}}],["url",{"2":{"24":1,"30":2,"35":1,"38":2,"43":1,"44":1,"57":4,"74":1,"75":1,"76":1,"81":1,"112":1,"139":2,"141":2,"142":1,"199":1,"217":1,"218":1,"222":1,"247":1,"322":1,"323":2,"334":2,"335":1,"344":2,"349":1}}],["upstream",{"2":{"216":1,"217":1,"223":1,"225":1}}],["updating",{"2":{"163":1}}],["updates",{"2":{"296":1}}],["updated",{"2":{"172":1,"211":1}}],["update",{"2":{"126":1,"127":1,"143":2,"184":1,"248":1,"271":1,"282":1,"285":1,"296":4,"303":2,"324":1,"331":1}}],["uploaded",{"2":{"62":1,"66":1,"67":1}}],["upload",{"2":{"46":1,"62":1,"184":1}}],["up",{"2":{"18":1,"48":1,"62":1,"115":1,"190":1,"213":1,"268":1,"288":1,"313":1,"317":1,"320":2,"321":1,"324":2,"334":1,"335":1,"360":1}}],["upgradable",{"2":{"17":1}}],["uncomment",{"2":{"321":1}}],["uncomfortable",{"2":{"16":1}}],["unread",{"2":{"239":1,"240":2}}],["unresolvable",{"2":{"162":1}}],["unlike",{"2":{"328":1}}],["unlimited",{"2":{"235":1,"242":1}}],["unless",{"2":{"92":1,"94":1}}],["unsure",{"2":{"103":1,"277":1}}],["until",{"2":{"92":1,"268":1}}],["unique",{"2":{"69":1,"159":1,"215":1}}],["unified",{"0":{"133":1},"2":{"7":1}}],["underlying",{"2":{"317":1}}],["under",{"2":{"15":1,"160":1,"162":1,"216":1,"223":1,"266":2,"357":1}}],["understanding",{"2":{"172":1}}],["understands",{"2":{"72":1}}],["understand",{"2":{"11":1,"147":1,"154":1,"313":1}}],["usually",{"2":{"162":1,"216":1,"268":2}}],["us",{"2":{"126":1,"354":1}}],["using",{"0":{"337":1},"2":{"37":1,"111":1,"132":1,"139":1,"140":1,"141":1,"142":1,"158":1,"205":1,"233":1,"234":1,"240":1,"241":1,"255":1,"291":1,"317":2,"319":1,"333":1,"340":1,"355":1}}],["usage",{"0":{"213":1,"292":1,"346":1,"351":1},"2":{"6":1,"145":1,"149":1,"151":2,"213":1,"227":2,"262":1,"264":1,"265":1,"280":1,"285":2,"290":2,"291":1,"292":5,"293":1,"294":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1,"304":1,"305":1,"307":1}}],["useful",{"2":{"95":2,"103":1,"149":1,"151":1,"164":1,"171":1,"190":1,"210":1,"211":1,"222":1,"233":1,"256":1,"271":1,"276":1,"288":1,"291":1}}],["used",{"2":{"6":1,"116":6,"118":1,"147":1,"149":1,"152":1,"159":1,"191":1,"215":1,"218":1,"224":1,"227":1,"229":1,"262":2,"267":1,"275":2,"290":1,"330":1,"347":1}}],["uses",{"2":{"6":1,"7":1,"22":1,"34":1,"44":1,"61":1,"81":1,"91":1,"116":1,"147":1,"218":1,"221":1,"222":2,"226":1,"227":1,"236":2,"252":1,"253":1,"265":1,"317":1,"328":1,"338":1,"352":1,"359":1}}],["use",{"2":{"4":1,"8":1,"18":1,"19":1,"43":1,"50":1,"58":1,"59":1,"71":1,"74":1,"75":1,"76":1,"95":1,"110":1,"115":3,"119":2,"123":2,"124":1,"127":1,"128":1,"129":1,"153":2,"162":1,"167":1,"180":1,"184":1,"188":1,"194":1,"201":1,"202":2,"203":1,"206":1,"212":1,"214":2,"216":1,"219":1,"220":1,"224":1,"229":1,"242":2,"244":1,"248":1,"255":1,"259":1,"265":2,"271":1,"273":1,"274":1,"277":2,"279":1,"287":2,"290":2,"307":1,"317":2,"319":4,"321":1,"325":2,"327":1,"331":1,"336":1,"346":1,"351":1,"356":1}}],["username",{"2":{"69":2,"176":1,"323":1}}],["username>",{"2":{"37":1}}],["users",{"0":{"106":1,"107":1},"2":{"3":1,"17":1,"23":1,"40":1,"45":2,"47":1,"53":1,"79":1,"82":1,"83":1,"85":1,"88":1,"90":1,"91":1,"95":2,"108":1,"112":1,"120":1,"160":1,"254":1,"282":1,"321":1}}],["user",{"0":{"3":1},"2":{"6":1,"7":1,"14":1,"19":1,"37":3,"38":2,"39":1,"64":1,"95":1,"102":1,"109":1,"110":1,"112":1,"116":1,"126":2,"163":1,"180":1,"203":1,"206":1,"222":1,"250":1,"251":1,"253":2,"259":2,"291":1,"320":1,"323":1,"324":1}}],["ui",{"0":{"10":1,"257":1,"269":1},"1":{"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"1":1,"6":1,"10":1,"24":1,"31":1,"38":1,"43":1,"44":1,"49":1,"50":1,"65":1,"70":1,"71":1,"75":1,"81":1,"86":1,"126":1,"152":1,"160":1,"185":1,"216":1,"225":1,"227":1,"254":1,"255":2,"257":1,"259":1,"274":2,"278":1,"287":2,"309":1,"310":1,"315":1,"316":1,"322":1}}],["sslmode",{"2":{"323":1}}],["sse",{"0":{"199":1},"2":{"158":1,"199":1}}],["snapshotter",{"2":{"323":1}}],["snapshot",{"0":{"165":1,"166":1},"2":{"165":2,"166":1,"167":1}}],["snapshots",{"0":{"164":1,"167":1},"1":{"165":1,"166":1,"167":1},"2":{"114":1,"164":1,"167":1}}],["switches",{"2":{"297":1,"298":1,"299":1,"300":1}}],["switching",{"2":{"211":1,"256":1,"278":1}}],["switch",{"2":{"143":1,"257":1,"285":4,"309":1,"310":1}}],["shipped",{"2":{"326":1}}],["sh",{"2":{"319":12}}],["shut",{"2":{"158":1}}],["shell",{"2":{"121":1}}],["short",{"2":{"265":1,"277":1}}],["shorten",{"2":{"214":1}}],["shorter",{"2":{"145":1}}],["shortcut",{"2":{"92":1}}],["showing",{"2":{"179":1}}],["shows",{"2":{"149":1,"163":1,"212":1,"222":1,"237":1,"259":1,"276":1,"290":1,"291":1,"292":1,"293":1,"294":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1}}],["show",{"2":{"49":1,"62":1,"89":1,"227":1,"263":1,"268":1,"275":1,"279":1,"280":3,"284":1,"285":2,"290":3}}],["shown",{"2":{"48":1,"126":1,"158":1,"225":1,"259":1}}],["should",{"2":{"43":1,"62":1,"71":1,"103":2,"118":1,"123":1,"147":1,"191":1,"194":1,"263":1}}],["shanghai",{"2":{"126":1}}],["shape",{"2":{"116":1}}],["shadowed",{"2":{"10":1,"267":1,"268":1,"275":1,"314":1}}],["share",{"2":{"19":1}}],["shared",{"2":{"1":1,"3":1,"103":1,"263":1}}],["sharing",{"2":{"3":1,"17":1,"19":1,"168":1,"201":1}}],["synthesize",{"2":{"355":1,"357":2,"358":1}}],["synthesized",{"2":{"250":1}}],["synthesis",{"2":{"219":1,"352":1,"356":1,"358":1}}],["syntax",{"2":{"186":1,"236":1}}],["synchronous",{"2":{"150":1,"254":1}}],["sync",{"2":{"38":1}}],["system",{"2":{"7":1,"9":1,"10":1,"13":1,"91":1,"97":1,"112":1,"116":2,"155":1,"194":1,"204":1,"212":1,"253":1,"280":1,"339":1,"357":1}}],["spoken",{"2":{"357":1}}],["sparse",{"0":{"317":1,"328":1,"334":1},"2":{"206":1,"211":1,"316":4,"317":9,"319":1,"320":2,"323":2,"327":4,"328":5,"330":2,"334":5,"339":2}}],["space",{"2":{"163":1}}],["spaces",{"2":{"103":1,"265":1,"279":1}}],["split",{"2":{"19":1,"115":1}}],["speak",{"2":{"263":1}}],["speaks",{"2":{"253":1,"254":1}}],["speaker",{"2":{"14":1}}],["speed",{"2":{"230":1,"354":2,"356":1,"357":1,"358":1}}],["speech",{"0":{"230":1},"2":{"9":2,"116":4,"216":3,"219":4,"224":3,"230":3,"231":1,"232":2,"352":1,"355":1,"357":2,"358":1}}],["spec",{"2":{"162":1}}],["specs",{"2":{"162":1}}],["specify",{"2":{"247":1}}],["specifically",{"2":{"245":1}}],["specification",{"2":{"41":1}}],["specific",{"0":{"108":1},"2":{"91":1,"95":1,"100":5,"102":2,"109":2,"120":1,"130":1,"174":1,"201":1,"208":1,"215":1,"234":1,"242":1,"244":1,"247":1,"251":1,"267":1,"273":1,"279":1,"319":1,"357":1}}],["specified",{"2":{"18":1}}],["special",{"0":{"139":1,"140":1,"141":1,"142":1},"2":{"194":1}}],["specialized",{"2":{"111":1,"113":1}}],["scale",{"2":{"126":1}}],["scans",{"2":{"266":1}}],["scan",{"0":{"87":1},"2":{"85":1,"87":2,"140":1}}],["schema",{"2":{"120":1}}],["schedules",{"0":{"237":1,"238":1},"1":{"239":1,"240":1},"2":{"237":1,"238":1,"240":1}}],["scheduled",{"0":{"190":1,"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1},"2":{"18":1,"114":1,"115":1,"190":1,"233":1,"253":1,"263":1,"285":1,"303":1}}],["schedule",{"0":{"235":1,"242":1,"303":1},"2":{"6":1,"18":1,"114":1,"189":1,"234":2,"235":3,"237":1,"239":4,"240":1,"241":4,"242":2,"253":1,"257":1,"263":1,"279":3,"281":1,"285":1,"303":10}}],["scoping",{"2":{"110":1,"344":2}}],["scoped",{"0":{"109":1},"2":{"252":1,"314":1}}],["scope",{"0":{"102":1},"2":{"61":1,"100":1,"102":2,"109":1,"153":1,"214":1,"291":1}}],["scopes",{"0":{"62":1},"2":{"30":1,"62":2,"66":1}}],["scenarios",{"2":{"33":1,"73":1,"135":1}}],["scratch",{"2":{"211":1}}],["scripts",{"2":{"156":1}}],["script",{"2":{"130":1,"319":2,"321":1}}],["scroll",{"2":{"29":1,"122":1,"129":1}}],["screenshot",{"2":{"129":1}}],["screenshots",{"2":{"123":1,"124":1}}],["screen",{"2":{"14":1,"64":1}}],["slow",{"2":{"319":1}}],["slack",{"0":{"59":1,"60":1},"1":{"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1},"2":{"33":1,"59":1,"60":1,"61":1,"62":2,"63":1,"64":1,"65":1,"66":1,"67":1,"135":2}}],["slash",{"0":{"150":1,"278":1},"1":{"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1},"2":{"6":1,"10":1,"11":1,"32":1,"110":1,"152":1,"154":2,"255":1,"278":2,"280":1,"281":2,"284":1,"313":1}}],["sludge",{"2":{"14":1}}],["saas",{"2":{"339":2,"341":2,"342":1,"347":1}}],["saving",{"2":{"128":1,"164":1}}],["saves",{"2":{"87":1}}],["saved",{"2":{"75":1}}],["save",{"2":{"24":1,"29":1,"31":1,"35":1,"38":1,"44":1,"48":1,"49":1,"57":2,"65":1,"70":1,"75":1,"81":1,"100":1,"101":1,"128":1,"141":1,"142":1,"143":2,"158":1,"169":1,"186":2,"205":1,"218":1,"223":1,"249":1,"270":1,"310":1,"336":1,"345":1,"350":1,"355":1,"358":1}}],["safely",{"2":{"164":1,"226":1,"274":1}}],["safe",{"2":{"16":1,"75":1}}],["say",{"2":{"14":1}}],["same",{"2":{"3":2,"14":1,"64":1,"76":1,"262":1,"266":1,"267":1,"268":2,"272":1,"274":1}}],["smtp",{"2":{"33":1,"174":1,"176":1}}],["smell",{"2":{"14":1}}],["smoother",{"2":{"14":1}}],["smaller",{"2":{"144":1}}],["small",{"2":{"14":1,"277":1}}],["smarter",{"2":{"13":1}}],["s",{"0":{"115":1},"2":{"13":1,"14":6,"16":1,"20":1,"22":1,"31":1,"32":1,"35":1,"38":3,"39":1,"47":1,"49":1,"57":1,"61":1,"70":1,"79":1,"81":2,"86":1,"91":1,"94":1,"98":1,"112":1,"114":2,"115":1,"116":2,"121":1,"130":1,"131":1,"134":1,"139":1,"143":2,"145":1,"147":2,"152":2,"153":1,"156":1,"157":1,"159":2,"161":1,"164":2,"169":1,"170":1,"171":1,"172":1,"177":1,"178":1,"179":2,"184":2,"185":1,"186":2,"188":1,"192":1,"194":1,"198":1,"200":2,"204":1,"205":1,"206":1,"207":1,"208":2,"211":1,"221":1,"235":1,"236":1,"250":1,"252":1,"253":4,"254":1,"256":1,"262":1,"264":2,"274":1,"281":1,"297":1,"303":1,"308":1,"309":1,"310":1,"319":2,"326":1,"337":1,"340":2,"352":1,"355":1,"358":2,"359":1}}],["silently",{"2":{"319":1}}],["silent",{"2":{"253":1,"254":1,"319":1}}],["single",{"2":{"133":1,"144":1,"206":1}}],["similar",{"2":{"153":1}}],["simultaneously",{"2":{"121":1,"133":1}}],["simple",{"2":{"18":1,"85":1,"265":1}}],["significantly",{"2":{"317":1,"328":1}}],["sign",{"2":{"43":1}}],["sites",{"2":{"126":1}}],["sit",{"2":{"13":1,"14":1}}],["sidebar",{"2":{"28":1,"35":1,"54":1,"112":1,"125":1,"126":1,"175":1,"176":1,"218":1,"245":1,"247":1,"248":1,"257":1,"259":1,"340":1,"358":1}}],["side",{"2":{"10":1,"77":1,"231":1}}],["size",{"2":{"5":1,"123":1,"147":1,"229":1,"314":1}}],["skill",{"0":{"265":1,"267":1,"270":1,"271":1,"272":1,"304":1,"309":1},"1":{"268":1},"2":{"8":1,"10":1,"114":1,"265":7,"266":6,"267":5,"268":4,"270":1,"271":1,"272":3,"273":2,"274":4,"276":3,"285":1,"304":2,"309":2}}],["skills",{"0":{"8":1,"264":1,"266":1,"269":1,"275":1,"276":1},"1":{"265":1,"266":1,"267":1,"268":1,"269":1,"270":2,"271":2,"272":2,"273":2,"274":2,"275":1,"276":1,"277":1},"2":{"6":1,"8":1,"11":1,"18":1,"114":1,"149":1,"188":1,"190":1,"194":1,"234":1,"262":2,"264":2,"266":10,"269":1,"270":1,"271":1,"274":1,"275":4,"276":3,"277":3,"285":1,"290":1,"304":1,"308":1,"309":2,"311":1,"314":3}}],["sudo",{"2":{"319":6,"320":1,"324":1}}],["suffixes",{"2":{"281":1}}],["sun=0",{"2":{"236":1}}],["summary",{"2":{"145":1,"151":3,"192":1,"235":1,"239":1,"262":1,"279":1,"285":1,"292":2,"323":1}}],["summarizing",{"2":{"144":1}}],["summarizes",{"2":{"153":1,"214":1}}],["summarize",{"2":{"118":1,"147":1,"152":1,"235":1,"240":2,"303":1,"307":1}}],["successful",{"2":{"118":1}}],["successfully",{"2":{"71":1,"151":1,"179":1,"192":1}}],["succeeds",{"2":{"88":1}}],["such",{"2":{"6":1,"10":1,"112":1,"114":1,"116":2,"123":1,"126":2,"129":1,"162":1,"210":1,"215":1,"217":2,"218":1,"225":2,"226":1,"229":1,"231":1,"255":1,"265":1,"266":2,"278":1,"279":2,"282":1,"287":1,"296":1}}],["subdirectory",{"2":{"266":1}}],["subsequent",{"2":{"256":1}}],["subscribe",{"0":{"63":1}}],["subscriptions",{"2":{"57":1,"63":1}}],["sub",{"2":{"103":1}}],["subject",{"0":{"95":1},"2":{"95":1,"96":2,"97":1,"100":1,"108":1,"179":2}}],["subjects",{"2":{"94":1,"95":1,"97":1,"106":1,"107":1}}],["submitting",{"2":{"124":1}}],["submit",{"2":{"58":1}}],["subagents",{"2":{"8":1}}],["subagent",{"2":{"6":1,"253":3,"257":1,"263":2}}],["suited",{"2":{"45":1}}],["surface",{"2":{"280":1,"313":1}}],["surfaced",{"2":{"262":1}}],["sure",{"2":{"43":1,"64":1,"76":1,"205":1}}],["survive",{"2":{"13":1}}],["sustainable",{"2":{"19":1}}],["support",{"2":{"19":1,"32":1,"33":2,"40":1,"49":1,"51":2,"67":1,"68":1,"72":1,"83":1,"90":2,"135":2,"162":1,"184":1,"278":1,"281":1}}],["supported",{"0":{"26":1,"32":1,"40":1,"46":1,"51":1,"67":1,"72":1,"78":1,"83":1,"90":1,"134":1,"245":1},"1":{"135":1},"2":{"10":1,"25":1,"68":1,"245":1,"255":3,"287":2,"296":1,"340":1}}],["supports",{"2":{"9":1,"18":1,"22":1,"33":1,"34":1,"53":1,"116":1,"135":1,"168":1,"186":1,"195":1,"200":1,"219":1,"226":1,"317":1,"326":1,"328":1,"339":2,"352":1,"357":1}}],["supermarket",{"0":{"8":1,"276":1,"308":1},"1":{"309":1,"310":1,"311":1},"2":{"8":1,"11":1,"196":1,"264":1,"276":1,"277":1,"308":1,"309":1,"310":1,"311":1,"314":1}}],["serper",{"2":{"245":1}}],["server",{"0":{"30":1},"2":{"29":1,"30":1,"42":1,"174":1,"198":1,"199":3,"200":1,"202":2,"203":2,"236":1,"315":1,"316":2,"323":4}}],["servers",{"2":{"8":1,"27":1,"33":1,"135":1,"176":1,"200":1,"314":1}}],["service",{"0":{"316":1,"317":1},"1":{"317":1},"2":{"174":1,"175":1,"217":1,"241":1,"316":2,"317":1,"319":1,"322":1,"323":1,"327":1,"334":1,"347":1,"357":1}}],["services",{"2":{"17":1,"133":1,"195":1,"316":1,"319":1,"320":1,"322":1}}],["serving",{"2":{"17":1}}],["searxng",{"2":{"245":1,"247":1}}],["searches",{"2":{"215":1}}],["searching",{"0":{"209":1}}],["search",{"0":{"243":1,"245":1,"247":1,"249":1,"299":1},"1":{"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1},"2":{"8":2,"9":1,"15":1,"18":1,"56":1,"69":1,"100":1,"114":2,"115":1,"116":2,"129":1,"146":1,"201":1,"209":1,"229":1,"231":1,"241":1,"243":1,"244":2,"245":6,"247":4,"249":1,"250":3,"257":1,"285":2,"299":4,"316":1,"317":2,"327":2,"328":1,"330":1,"337":1,"338":1,"339":1,"346":1,"351":1}}],["sent",{"2":{"179":3,"199":1,"235":1}}],["sensible",{"2":{"119":1}}],["sensitive",{"2":{"103":1}}],["sends",{"2":{"206":1,"234":1,"239":1}}],["sender",{"2":{"95":1,"97":1}}],["sending",{"2":{"35":1,"190":1,"233":1,"288":1}}],["send",{"2":{"6":1,"25":1,"30":1,"40":1,"50":1,"56":1,"59":1,"62":1,"66":2,"67":1,"69":1,"71":1,"72":2,"77":1,"82":1,"88":1,"139":1,"145":1,"173":1,"178":1,"180":1,"235":1,"240":1,"241":1,"253":1,"254":2,"256":1,"279":1,"281":1}}],["self",{"2":{"42":1,"245":1,"339":2,"341":2,"347":1}}],["selectively",{"2":{"263":1}}],["selection",{"0":{"130":1},"2":{"114":1,"130":1,"319":1}}],["selected",{"0":{"106":1},"2":{"116":2,"137":1,"147":1,"152":1,"218":1,"259":1,"262":1,"276":1,"319":1,"336":1,"356":1}}],["select",{"2":{"30":3,"31":1,"38":1,"49":1,"50":1,"65":1,"70":2,"71":1,"81":1,"86":1,"100":3,"126":1,"127":1,"128":1,"129":1,"137":1,"170":1,"178":1,"184":1,"201":1,"205":1,"208":1,"223":1,"237":1,"248":1,"249":2,"309":1,"310":1,"329":1,"330":1,"331":1,"336":1,"343":1,"344":1,"345":1,"348":1,"349":1,"350":1,"353":1,"355":1,"357":1,"358":2}}],["sees",{"2":{"275":1}}],["seen",{"2":{"100":1}}],["see",{"2":{"35":1,"112":1,"118":2,"131":1,"144":1,"152":1,"154":3,"183":1,"187":1,"206":1,"215":1,"232":2,"254":1,"263":1,"287":1,"307":1,"316":1,"317":1,"346":1,"351":1}}],["security",{"2":{"155":1}}],["securely",{"2":{"28":1,"48":1,"200":1}}],["seconds",{"2":{"38":1}}],["secrets",{"2":{"35":1,"138":1,"310":1}}],["secret",{"2":{"23":1,"24":1,"34":1,"37":1,"54":1,"57":1,"69":1,"74":1,"75":1,"80":1,"81":1,"142":1,"319":2,"320":1,"323":1,"344":1,"349":1}}],["sections",{"2":{"323":1,"334":1}}],["section",{"2":{"21":1,"29":1,"202":1,"323":1,"335":1}}],["semantic",{"2":{"18":1,"229":1,"317":1,"326":1,"327":1,"339":1}}],["setting",{"2":{"120":1,"163":1}}],["settings",{"0":{"29":1,"89":1,"115":1,"120":1,"296":1},"2":{"10":1,"18":1,"34":1,"49":1,"54":1,"57":1,"114":2,"115":2,"116":1,"120":2,"126":1,"141":1,"161":1,"163":1,"211":1,"215":1,"218":1,"230":1,"232":1,"247":1,"248":1,"278":1,"279":2,"285":2,"296":5,"319":1,"330":1,"331":1,"335":1,"336":1,"340":1,"344":1,"349":1,"354":1,"357":2}}],["setups",{"2":{"120":1,"266":1}}],["setup",{"0":{"35":1,"337":1},"2":{"11":1,"24":1,"33":1,"85":1,"119":1,"130":1,"131":1,"142":1,"313":1,"327":1}}],["set",{"2":{"8":1,"18":1,"100":1,"105":1,"106":1,"107":1,"108":1,"109":1,"115":1,"116":1,"178":1,"190":1,"196":1,"210":1,"241":1,"252":1,"275":1,"279":1,"280":1,"282":1,"297":8,"298":2,"299":2,"300":2,"313":1,"320":1,"321":1,"325":1,"360":1}}],["sessions",{"0":{"6":1,"251":1,"258":1,"259":1,"260":1,"261":1,"263":1},"1":{"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":2,"260":2,"261":2,"262":1,"263":1},"2":{"6":6,"11":1,"120":1,"154":1,"156":1,"252":2,"253":1,"255":1,"257":4,"259":2,"261":1,"263":5,"275":1,"287":2,"313":2}}],["session",{"0":{"149":1,"214":1,"253":1,"255":1,"262":1,"286":1},"1":{"254":1,"256":1,"257":1,"287":1,"288":1},"2":{"5":3,"6":2,"10":1,"114":1,"115":1,"116":2,"118":3,"144":2,"146":2,"147":3,"148":1,"149":1,"150":1,"152":3,"153":2,"154":2,"206":2,"210":1,"214":3,"227":2,"251":2,"252":3,"253":4,"254":1,"255":6,"256":3,"257":3,"259":4,"260":1,"261":1,"262":5,"263":2,"275":2,"278":2,"279":1,"285":2,"287":4,"290":4,"307":3,"314":1}}],["separately",{"2":{"216":1}}],["separated",{"2":{"9":1,"161":1}}],["separates",{"2":{"5":1}}],["separate",{"2":{"4":1,"9":1,"116":1,"142":1,"206":1,"228":1,"253":1}}],["separation",{"2":{"3":1,"230":1}}],["stdio",{"0":{"198":1},"2":{"114":1}}],["steps",{"0":{"131":1,"154":1,"232":1,"341":1,"360":1},"2":{"60":1,"174":1}}],["step",{"0":{"23":1,"24":1,"25":1,"28":1,"29":1,"30":1,"31":1,"37":1,"38":1,"39":1,"43":1,"44":1,"45":1,"48":1,"49":1,"50":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"69":1,"70":1,"71":1,"74":1,"75":1,"76":1,"77":1,"80":1,"81":1,"82":1,"86":1,"87":1,"88":1},"2":{"35":1,"115":1}}],["studio",{"2":{"15":1,"19":1}}],["stopping",{"2":{"163":1}}],["stopped",{"2":{"159":1,"165":1}}],["stop",{"0":{"288":1},"2":{"114":1,"158":1,"279":1,"284":2,"324":1}}],["stops",{"2":{"14":1,"288":1}}],["stood",{"2":{"14":1}}],["stories",{"2":{"281":1}}],["storage",{"2":{"14":1,"17":1,"144":1,"213":1,"342":1}}],["story",{"0":{"14":1}}],["store",{"2":{"28":1,"156":1,"337":1}}],["stored",{"2":{"5":1,"18":2,"144":1,"153":2,"200":2,"206":1,"210":2,"213":1,"214":1,"314":1,"333":1,"344":1,"349":1}}],["stores",{"2":{"5":1,"123":1,"217":1,"222":1,"338":1}}],["style",{"2":{"14":1,"26":1,"33":1,"34":2,"45":1,"78":1,"126":1,"135":1,"219":1,"221":1,"254":1,"264":1}}],["strong",{"2":{"135":1}}],["strings",{"2":{"281":1}}],["string",{"2":{"126":1}}],["strict",{"2":{"17":1}}],["streamed",{"2":{"40":1,"83":1}}],["streaming",{"2":{"26":1,"33":1,"40":1,"46":1,"59":1,"68":1,"72":1,"78":1,"83":1,"135":3,"288":1}}],["stream",{"0":{"142":1},"2":{"14":1,"22":1,"24":1,"35":1,"142":1}}],["structured",{"2":{"1":1,"180":1,"204":1,"312":1}}],["still",{"2":{"13":1,"66":1,"145":2,"163":1,"227":1,"288":1}}],["stale",{"2":{"210":1}}],["stable",{"2":{"165":1,"265":1}}],["standardized",{"2":{"196":1}}],["standard",{"2":{"142":1,"198":1,"201":1,"230":1,"236":1,"253":1,"326":1}}],["stats",{"2":{"290":1}}],["statistics",{"0":{"213":1}}],["static",{"2":{"129":1}}],["states",{"0":{"267":1},"1":{"268":1},"2":{"266":1,"267":1,"314":1}}],["state",{"2":{"156":1,"164":1,"165":1,"166":1,"171":1,"267":1}}],["status",{"0":{"149":1,"151":1,"212":1,"262":1,"289":1,"290":1},"1":{"290":1,"291":1,"292":1,"293":1,"294":1},"2":{"6":1,"10":1,"116":1,"143":1,"149":2,"150":1,"151":1,"152":2,"159":1,"179":1,"190":1,"192":1,"193":1,"200":2,"211":1,"212":2,"213":1,"214":1,"227":1,"237":1,"262":2,"275":1,"278":1,"279":3,"285":2,"290":3,"313":1,"324":1}}],["staying",{"2":{"254":1}}],["stay",{"2":{"17":1,"253":1}}],["stays",{"2":{"15":1,"20":2}}],["stakes",{"2":{"14":1}}],["stack",{"2":{"11":1,"17":1,"20":1,"315":1,"316":1}}],["startup",{"2":{"322":2}}],["starting",{"0":{"255":1},"1":{"256":1,"257":1},"2":{"92":1,"119":1,"163":1,"252":1,"320":1}}],["starts",{"2":{"61":1,"64":1,"119":1,"317":1}}],["started",{"2":{"14":2,"151":1,"316":1}}],["start",{"0":{"11":1,"45":1,"82":1,"88":1,"92":1,"99":1,"313":1},"2":{"6":1,"35":1,"39":1,"44":1,"87":2,"92":1,"103":1,"108":1,"112":1,"114":1,"115":1,"158":1,"171":1,"196":1,"211":1,"256":1,"277":1,"319":1,"320":2,"324":1}}],["sogou",{"2":{"245":1}}],["sonnet",{"2":{"225":1}}],["software",{"2":{"156":1,"163":1}}],["solve",{"2":{"153":1}}],["sound",{"2":{"153":1,"356":1}}],["sources",{"2":{"196":1,"266":1,"267":1,"276":1}}],["source",{"0":{"102":1},"2":{"20":1,"100":1,"102":1,"109":1,"267":3,"268":3,"272":1,"273":2,"274":1}}],["social",{"2":{"33":1,"42":1,"45":1}}],["socket",{"0":{"61":1},"2":{"33":1,"61":2,"323":1}}],["some",{"2":{"200":1,"279":1,"316":1}}],["someone",{"2":{"16":1}}],["somewhere",{"2":{"14":2}}],["something",{"2":{"13":1,"14":3}}],["so",{"2":{"3":1,"7":1,"10":1,"14":2,"16":1,"42":1,"61":1,"116":1,"117":1,"118":1,"274":1,"276":1,"279":1,"317":2,"357":1}}],["ps",{"2":{"324":1}}],["p",{"2":{"303":1}}],["pm",{"2":{"236":1}}],["png",{"2":{"187":1}}],["python",{"2":{"317":1}}],["python3",{"2":{"198":1}}],["py",{"2":{"186":1}}],["pdf",{"2":{"129":1}}],["pdfs",{"2":{"124":1}}],["pipeline",{"2":{"326":1}}],["pins",{"2":{"325":1}}],["pin",{"2":{"319":1}}],["pitch",{"2":{"230":1,"354":2,"356":1,"357":1,"358":1}}],["pixel",{"2":{"126":1}}],["pixels",{"2":{"126":2}}],["picture",{"2":{"112":1}}],["pick",{"2":{"99":1,"116":1}}],["plus",{"2":{"106":1}}],["plan",{"2":{"277":1,"317":1}}],["plane",{"2":{"17":1}}],["playback",{"2":{"354":1}}],["playwright",{"2":{"124":1,"316":1}}],["playground",{"2":{"19":1}}],["placed",{"2":{"97":1,"160":1}}],["places",{"2":{"7":1}}],["plainly",{"2":{"14":1}}],["platforms",{"2":{"18":1,"24":1,"31":1,"33":1,"35":1,"38":1,"44":1,"49":1,"57":1,"65":1,"68":1,"70":1,"75":1,"81":1,"86":1,"111":1,"114":1,"132":1,"134":1}}],["platform",{"0":{"76":1,"108":1,"135":1},"2":{"1":1,"23":1,"35":4,"47":1,"48":1,"50":1,"52":1,"53":1,"54":1,"71":1,"74":1,"76":2,"84":1,"87":1,"95":2,"100":1,"135":1,"137":1,"138":2,"141":1,"312":1,"313":1,"314":1,"342":1}}],["phone",{"2":{"87":2}}],["phones",{"2":{"14":1}}],["photo",{"2":{"40":1}}],["pulled",{"2":{"322":1}}],["pulls",{"2":{"319":1}}],["pull",{"2":{"158":1,"324":1}}],["purposes",{"2":{"168":1}}],["purpose",{"2":{"135":1,"224":1,"242":1}}],["public",{"2":{"42":1,"62":1,"66":1,"67":1,"103":1,"352":1,"359":1}}],["published",{"2":{"58":1}}],["publish",{"0":{"58":1},"2":{"23":1,"43":1}}],["push",{"2":{"19":1}}],["port",{"2":{"176":1,"317":1,"323":3}}],["portal",{"2":{"28":1,"30":1,"33":1,"188":1}}],["portable",{"2":{"14":1,"16":1}}],["power",{"2":{"226":1,"227":1}}],["powered",{"2":{"124":1,"245":1}}],["powerful",{"2":{"14":1,"173":1,"245":1}}],["points",{"0":{"322":1},"2":{"221":1}}],["point",{"2":{"92":1}}],["policy",{"2":{"112":1,"119":1}}],["polite",{"2":{"14":1}}],["polling",{"2":{"38":1}}],["postgres",{"2":{"316":1,"319":2,"320":4,"323":1,"325":2}}],["postgresql",{"2":{"315":1,"316":1,"323":1,"325":1}}],["post",{"2":{"37":1,"240":1}}],["positional",{"2":{"279":1}}],["position",{"2":{"14":1}}],["parsing",{"0":{"281":1}}],["parse",{"2":{"278":1}}],["parallel",{"2":{"231":1}}],["parameters",{"2":{"210":1,"247":1}}],["parent",{"2":{"167":1,"183":1}}],["participant",{"2":{"254":1}}],["participate",{"2":{"36":1,"40":1,"59":1,"83":1}}],["part",{"2":{"14":1,"274":1}}],["packaged",{"2":{"169":1}}],["package",{"2":{"156":1}}],["pattern",{"0":{"236":1},"2":{"235":1,"236":2,"237":1,"240":1,"279":1,"303":2}}],["patterns",{"2":{"92":1}}],["paths",{"2":{"159":2,"276":1,"323":1}}],["path",{"2":{"92":1,"183":1,"305":2,"313":1,"323":1,"325":1}}],["pages",{"2":{"123":1}}],["page",{"0":{"113":1},"1":{"114":1},"2":{"48":1,"60":1,"65":1,"70":1,"112":1,"113":1,"115":1,"122":1,"123":1,"124":1,"125":2,"128":1,"129":1,"134":1,"144":1,"151":1,"157":1,"175":1,"176":1,"177":1,"181":1,"191":1,"197":1,"200":1,"206":1,"207":1,"216":1,"218":1,"224":1,"237":1,"245":1,"247":1,"249":1,"329":1,"336":1,"340":1,"343":1,"345":1,"348":1,"350":1,"353":1,"356":1,"357":1,"358":1}}],["passes",{"2":{"147":1}}],["password=your",{"2":{"320":2}}],["password>",{"2":{"37":1}}],["password",{"2":{"37":2,"176":1,"319":2,"320":7,"323":2,"325":3}}],["pasting",{"2":{"277":1}}],["paste",{"2":{"24":1,"31":1,"44":1,"49":1,"57":1,"70":1,"76":1,"139":1}}],["past",{"2":{"13":1}}],["pairs",{"2":{"198":1}}],["paired",{"2":{"15":1}}],["paid",{"2":{"14":1}}],["panels",{"2":{"313":1}}],["panel",{"0":{"149":1,"262":1},"2":{"6":1,"149":2,"152":1,"153":1,"214":1,"262":2,"275":1}}],["pending",{"2":{"118":1,"222":1}}],["percentage",{"2":{"227":1}}],["per",{"2":{"112":1,"116":1,"161":1,"252":1,"314":1}}],["performance",{"2":{"245":1}}],["performing",{"2":{"233":1}}],["perform",{"2":{"111":1,"129":1,"158":1,"188":1,"189":1,"194":1,"203":1}}],["persistence",{"2":{"159":1}}],["persistent",{"2":{"111":1,"122":1,"312":1}}],["persist",{"2":{"101":1}}],["personalized",{"2":{"204":1}}],["personality",{"2":{"111":1,"114":1}}],["personal",{"2":{"7":1,"13":1,"14":1,"33":2,"34":1,"73":1,"85":1,"103":1,"135":3}}],["person",{"2":{"3":1}}],["permission",{"2":{"64":1,"96":1,"291":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1}}],["permissions",{"0":{"56":1,"282":1},"2":{"23":1,"30":1,"56":3,"62":1,"64":1,"178":1,"180":1}}],["permanently",{"2":{"20":1,"122":1,"143":1,"261":1}}],["periodic",{"2":{"6":1,"117":1,"189":1,"190":1,"233":1,"242":2,"253":1}}],["people",{"2":{"3":1,"16":1}}],["practical",{"2":{"265":1}}],["practice",{"2":{"1":1,"124":1,"146":1,"162":1,"254":1}}],["primarily",{"2":{"224":1,"238":1}}],["primary",{"2":{"116":1}}],["prior",{"2":{"145":1}}],["priority",{"0":{"97":1},"2":{"97":2,"101":1}}],["prioritized",{"2":{"91":1}}],["privileged",{"2":{"29":1}}],["privileges",{"2":{"14":1}}],["privacy",{"2":{"13":1,"19":1,"245":2}}],["privately",{"2":{"18":1}}],["private",{"0":{"106":1},"2":{"3":1,"16":1,"17":2,"22":1,"25":1,"26":1,"33":2,"40":1,"53":1,"62":1,"66":1,"67":1,"73":1,"77":1,"78":2,"83":1,"90":1,"92":2,"100":1,"103":2,"108":1,"112":1,"135":2,"156":1,"255":1}}],["pre",{"2":{"317":1}}],["prefix",{"2":{"324":1}}],["prefixed",{"2":{"281":1}}],["prefilled",{"2":{"196":1,"310":1}}],["prefer",{"2":{"277":1}}],["previously",{"2":{"273":1}}],["previous",{"2":{"252":1,"256":1}}],["preview",{"2":{"151":1,"187":2,"356":1}}],["precise",{"2":{"242":1}}],["precedence",{"2":{"97":1,"267":1}}],["prerequisites",{"0":{"205":1,"318":1}}],["pressure",{"2":{"145":1}}],["present",{"2":{"66":1,"334":1,"335":1}}],["presence",{"2":{"29":1}}],["preserved",{"2":{"256":1,"281":1}}],["preserves",{"2":{"145":1}}],["preserve",{"2":{"6":1}}],["presets",{"0":{"92":1,"103":1},"2":{"92":2,"314":1}}],["preset",{"0":{"99":1},"2":{"1":1,"92":2,"99":2,"105":1,"106":1,"107":1,"108":1,"112":1,"115":1,"119":2,"221":1}}],["prepare",{"0":{"43":1,"74":1},"2":{"74":1}}],["project",{"2":{"328":1,"344":2}}],["programmatically",{"2":{"240":1}}],["programming",{"2":{"186":1}}],["progress",{"2":{"14":2,"158":1,"288":1}}],["process",{"0":{"198":1},"2":{"178":1,"192":1,"198":1,"203":1,"211":2,"250":1,"315":1,"316":1}}],["providing",{"2":{"173":1,"204":1}}],["provided",{"2":{"138":1,"140":1,"203":1,"208":1}}],["provides",{"2":{"121":1,"124":1,"151":1,"155":1,"179":1,"182":1,"192":1,"196":1,"257":1,"262":1,"317":2,"328":1,"347":1}}],["provide",{"0":{"160":1},"1":{"161":1,"162":1,"163":1},"2":{"69":1,"75":1,"160":1,"162":1,"165":1,"178":1,"194":1,"215":1,"250":2}}],["provider",{"0":{"175":1,"176":1,"217":1,"218":1,"247":1,"249":1,"326":1,"329":1,"330":1,"336":1,"342":1,"343":1,"344":1,"345":1,"347":1,"348":1,"349":1,"350":1,"353":1},"1":{"176":1,"218":1,"219":1,"327":1,"328":1,"329":1,"330":1,"331":2,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"343":1,"344":1,"345":1,"346":1,"348":1,"349":1,"350":1,"351":1},"2":{"9":2,"10":1,"18":1,"115":1,"116":4,"131":1,"144":1,"146":1,"153":1,"174":2,"175":1,"176":3,"178":1,"200":1,"205":5,"206":2,"210":1,"211":1,"212":2,"214":1,"215":3,"217":1,"218":4,"219":2,"220":1,"221":1,"222":2,"223":3,"230":1,"244":1,"245":1,"247":2,"248":3,"249":2,"250":1,"297":3,"298":1,"299":1,"307":1,"317":2,"323":1,"326":2,"329":3,"330":1,"331":2,"335":1,"336":4,"337":1,"338":3,"339":2,"340":5,"341":4,"342":1,"343":3,"344":1,"345":2,"347":1,"348":3,"349":1,"350":2,"353":2,"357":3,"358":2,"359":1,"360":1}}],["providers",{"0":{"9":1,"173":1,"216":1,"220":1,"243":1,"248":1,"331":1,"338":1,"339":1,"357":1,"359":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"217":1,"218":1,"219":1,"220":1,"221":2,"222":2,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"339":1,"340":1,"341":1,"358":1,"359":1,"360":1},"2":{"5":1,"11":1,"33":2,"115":3,"116":2,"195":1,"205":1,"215":1,"216":5,"219":3,"224":2,"229":1,"230":1,"232":2,"245":1,"278":1,"285":3,"294":2,"313":2,"314":1,"329":1,"339":1,"340":1,"343":1,"348":1,"353":1,"357":1,"358":1}}],["probing",{"2":{"314":1}}],["probe",{"2":{"120":1,"202":1,"310":1}}],["problematic",{"2":{"107":1}}],["problems",{"2":{"5":1,"153":1}}],["proxy",{"2":{"74":2}}],["profiles",{"2":{"334":1}}],["profile",{"2":{"50":1,"71":1,"112":1,"124":1,"130":1,"316":2,"317":5,"320":3,"321":2,"327":2,"334":2,"335":1}}],["protocol",{"2":{"33":1,"36":1,"195":1,"217":2,"218":1}}],["product",{"2":{"20":1,"313":1}}],["prompted",{"2":{"87":1}}],["prompts",{"2":{"69":1,"130":1,"190":1,"319":1}}],["prompt",{"2":{"5":1,"144":1,"194":1,"206":1,"210":1,"227":1,"242":1,"254":1,"264":1,"273":1,"275":1,"307":1,"319":1}}],["bm25",{"2":{"317":1}}],["bing",{"2":{"244":1,"245":1}}],["bindings",{"0":{"173":1,"177":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":2,"179":1,"180":1},"2":{"114":2,"115":1,"285":1,"294":2}}],["binding",{"0":{"178":1},"2":{"50":1,"71":1,"174":1,"178":1}}],["bind",{"0":{"50":1,"71":1},"2":{"3":1,"50":1,"71":2,"338":1}}],["blocked",{"0":{"107":1}}],["block",{"2":{"102":1}}],["blocks",{"2":{"51":1,"72":1,"96":1}}],["blogs",{"0":{"21":1},"2":{"21":1}}],["b",{"2":{"37":1}}],["brave",{"2":{"244":1,"245":1,"247":1}}],["breadcrumb",{"2":{"183":1}}],["breaks",{"2":{"13":1}}],["bridges",{"2":{"133":1}}],["brief",{"2":{"16":1,"235":1}}],["browsing",{"0":{"183":1},"2":{"116":1,"182":1}}],["browses",{"2":{"305":1}}],["browse",{"2":{"114":1,"243":1,"285":1}}],["browser",{"0":{"123":1,"124":1,"125":1,"126":1,"128":1,"130":1,"300":1},"1":{"124":1,"125":1,"126":1,"127":2,"128":1,"129":1,"130":1,"131":1},"2":{"8":1,"30":1,"114":1,"115":1,"116":2,"123":6,"124":4,"125":4,"126":5,"128":3,"129":4,"130":6,"232":1,"285":2,"300":4,"316":3,"317":1,"319":2,"320":3,"321":1,"322":1,"323":2,"325":5}}],["broad",{"0":{"7":1},"2":{"99":1}}],["bundled",{"2":{"221":1}}],["budget",{"2":{"147":1,"225":1}}],["business",{"2":{"33":1}}],["buildkit",{"2":{"315":1}}],["build",{"2":{"14":1,"19":1,"130":3,"317":1,"319":1}}],["building",{"2":{"14":1}}],["buildable",{"2":{"13":1}}],["builtin",{"2":{"329":1}}],["built",{"0":{"280":1,"326":1,"329":1,"330":1},"1":{"327":1,"328":1,"329":1,"330":1,"331":2,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1},"2":{"1":1,"3":1,"8":1,"19":1,"20":1,"33":1,"115":1,"116":1,"129":1,"131":1,"186":1,"205":1,"230":1,"255":1,"278":1,"280":1,"287":1,"308":1,"317":2,"326":2,"339":1,"341":1,"356":1,"358":1}}],["buttons",{"2":{"124":1}}],["button",{"2":{"112":1,"167":1,"200":1,"201":1,"202":1,"248":1,"257":1,"356":1,"358":1}}],["but",{"2":{"13":2,"14":1,"16":1,"66":2,"102":2,"103":1,"145":1,"153":1,"227":1,"256":1,"275":1,"276":1}}],["bypasses",{"2":{"97":1}}],["by",{"2":{"9":1,"10":1,"18":2,"19":1,"33":1,"37":1,"43":1,"56":1,"62":1,"63":1,"94":1,"105":1,"116":1,"124":1,"130":1,"138":1,"144":1,"145":1,"162":1,"179":1,"183":1,"193":1,"201":1,"202":1,"203":3,"209":1,"210":1,"215":1,"218":2,"224":1,"236":1,"253":1,"257":3,"260":1,"262":2,"263":1,"292":2,"320":1}}],["batch",{"2":{"201":1}}],["battery",{"2":{"14":1}}],["bashsudo",{"2":{"320":2,"321":1}}],["bashgit",{"2":{"320":1}}],["bashdocker",{"2":{"317":1,"324":1,"334":1,"335":1}}],["bashbrowser",{"2":{"130":1}}],["bashcurl",{"2":{"37":1,"319":5}}],["basics",{"0":{"217":1},"1":{"218":1,"219":1}}],["basic",{"0":{"340":1,"358":1},"2":{"54":1,"60":1,"61":1,"112":1}}],["base64",{"2":{"320":1}}],["base",{"2":{"14":1,"15":2,"38":1,"159":1,"217":1,"218":1,"247":1,"323":1,"334":2,"335":1,"344":2,"349":1}}],["based",{"0":{"97":1,"220":1,"234":1},"1":{"221":1,"222":1},"2":{"7":1,"114":2,"137":1,"180":1,"200":1,"206":1,"218":1,"316":1,"327":1,"333":1,"339":2}}],["backup",{"2":{"168":1,"201":1}}],["background",{"2":{"147":2,"159":1}}],["backend",{"2":{"116":1,"205":1,"212":1,"215":1,"221":1,"326":1,"338":1,"346":1,"347":1,"351":1}}],["backed",{"2":{"1":1,"160":1,"219":1,"222":1}}],["back",{"2":{"14":1,"67":1,"72":1,"116":1,"145":1,"184":1,"200":1}}],["box",{"2":{"317":1}}],["body",{"2":{"265":1}}],["bocha",{"2":{"245":1}}],["bound",{"2":{"234":1}}],["boundaries",{"2":{"17":1,"19":1}}],["boundary",{"2":{"4":1,"13":1}}],["bold",{"2":{"51":1,"72":1}}],["botname",{"2":{"281":1}}],["bottom",{"2":{"97":2,"122":1}}],["botfather",{"2":{"69":2}}],["both",{"2":{"19":1,"130":1,"242":1,"259":1,"334":1}}],["bot",{"0":{"3":1,"29":1,"30":1,"37":1,"39":1,"48":1,"55":1,"62":1,"63":1,"66":1,"69":1,"80":1,"91":1,"105":1,"106":1,"107":1,"111":1,"112":1,"113":1,"115":1,"122":1,"128":1,"129":1,"132":1,"155":1,"174":1,"177":1,"180":1,"181":1,"188":1,"189":1,"194":1,"196":1,"203":1,"204":1,"215":1,"239":1,"249":1,"250":1,"264":1,"336":1,"345":1,"350":1,"355":1},"1":{"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"112":1,"113":1,"114":2,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"178":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"190":1,"191":1,"192":1,"193":1,"194":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1},"2":{"1":3,"4":1,"6":2,"7":1,"8":1,"10":1,"11":2,"18":3,"19":1,"23":2,"24":1,"25":2,"27":1,"28":2,"30":2,"31":2,"33":1,"35":3,"36":2,"37":1,"38":3,"39":2,"42":1,"43":3,"44":2,"45":1,"47":2,"48":2,"49":1,"50":2,"52":2,"55":2,"57":2,"58":1,"59":1,"60":1,"61":1,"62":2,"63":1,"64":2,"65":2,"66":4,"68":1,"69":7,"70":1,"71":3,"72":4,"75":1,"77":1,"79":1,"80":3,"81":4,"82":2,"84":1,"85":1,"86":1,"88":1,"91":2,"92":1,"94":4,"96":2,"97":1,"98":1,"99":1,"100":1,"103":2,"106":2,"107":1,"108":1,"109":1,"111":1,"112":4,"113":1,"114":3,"115":2,"116":3,"117":1,"119":2,"120":2,"121":1,"122":4,"123":4,"128":2,"129":2,"131":2,"132":1,"133":1,"134":2,"138":1,"140":1,"144":1,"145":1,"146":1,"147":2,"151":1,"153":1,"154":1,"155":2,"156":2,"157":2,"158":1,"159":1,"160":2,"161":1,"164":2,"172":1,"173":1,"174":2,"177":2,"178":5,"179":1,"180":2,"181":2,"183":1,"184":2,"185":1,"186":1,"188":2,"189":1,"190":1,"191":1,"192":2,"194":3,"195":1,"196":2,"197":1,"198":1,"202":1,"203":1,"205":3,"206":1,"207":2,"208":1,"212":1,"213":1,"215":3,"228":1,"232":2,"233":1,"234":2,"237":2,"239":3,"240":1,"243":1,"244":1,"249":1,"250":2,"251":2,"252":4,"253":7,"254":2,"256":3,"259":1,"263":3,"264":2,"265":1,"266":1,"269":1,"275":1,"281":1,"282":1,"285":4,"288":1,"290":1,"291":1,"294":1,"296":2,"297":1,"301":1,"303":1,"304":1,"305":2,"309":2,"310":2,"313":2,"316":1,"336":2,"337":3,"338":2,"340":2,"341":1,"342":1,"345":1,"346":2,"350":1,"351":2,"355":2,"356":1,"357":3,"358":2}}],["bots",{"2":{"1":1,"3":2,"4":2,"8":1,"11":3,"18":6,"22":1,"30":1,"33":3,"40":1,"48":1,"53":1,"103":4,"111":1,"112":1,"124":2,"128":1,"155":1,"196":1,"204":1,"231":1,"240":1,"249":1,"278":1,"312":1,"336":1,"345":1,"347":1,"350":1,"357":1}}],["below",{"2":{"316":1}}],["belief",{"2":{"19":1}}],["begin",{"2":{"82":1,"313":1}}],["been",{"2":{"75":1,"267":1}}],["best",{"2":{"42":1,"45":1,"103":5}}],["before",{"2":{"23":1,"76":1,"87":1,"100":1,"162":1,"205":1,"212":1,"277":1,"278":1,"288":1,"307":1,"320":1,"356":1}}],["better",{"2":{"317":1,"328":1}}],["bet",{"2":{"20":1}}],["between",{"2":{"7":1,"14":1,"138":1,"141":1,"183":1,"199":1,"251":1,"256":1,"257":1,"266":1}}],["become",{"2":{"153":2,"171":1,"210":1,"211":1,"256":1,"268":1,"272":1,"274":1}}],["becomes",{"2":{"14":1,"16":1,"152":1,"244":1,"268":2,"338":1}}],["because",{"2":{"14":1,"227":1,"230":1,"259":1,"266":1}}],["being",{"2":{"14":1,"276":1,"317":1}}],["behind",{"2":{"14":1}}],["behavior",{"0":{"163":1},"2":{"8":1,"11":1,"26":1,"78":1,"110":1,"114":1,"115":1,"116":2,"118":1,"120":1,"123":1,"126":1,"255":1,"264":1,"287":1,"323":1}}],["behaves",{"2":{"1":1,"254":1,"276":1}}],["be",{"2":{"3":1,"7":1,"18":1,"19":1,"66":1,"101":1,"118":1,"121":1,"122":1,"147":1,"152":1,"160":1,"178":1,"191":1,"227":1,"228":1,"241":1,"250":1,"267":2,"319":1,"334":1,"335":1,"347":1}}],["equivalent",{"2":{"279":2}}],["either",{"2":{"264":1,"266":1}}],["error",{"2":{"162":1,"192":1,"212":1}}],["errors",{"2":{"126":1,"193":1}}],["estimated",{"2":{"118":1,"147":2}}],["especially",{"2":{"110":1,"222":1,"256":1,"263":1}}],["efficient",{"2":{"317":1}}],["efforts",{"2":{"226":1}}],["effort",{"2":{"116":2,"226":1,"296":1}}],["effects",{"0":{"96":1}}],["effect",{"0":{"94":1},"2":{"92":5,"94":1,"96":1,"97":1,"99":1,"100":1,"105":1,"106":1,"107":1,"110":1,"119":1,"296":1}}],["effectively",{"2":{"216":1}}],["effective",{"0":{"275":1},"2":{"10":1,"159":1,"163":1,"262":1,"267":2,"268":5,"272":1,"275":2,"314":1}}],["etc",{"0":{"256":1},"2":{"39":1,"162":1,"317":1}}],["elements",{"2":{"123":1}}],["element",{"2":{"37":1,"39":1,"41":1}}],["else",{"2":{"14":1,"16":1}}],["e",{"2":{"37":2,"38":2,"69":3,"95":2,"176":1,"183":1,"186":1,"187":1,"198":2,"199":1,"211":1,"235":3,"241":1,"247":2,"319":1,"325":1,"349":1,"357":2,"358":1}}],["easy",{"2":{"18":1}}],["each",{"2":{"1":2,"4":1,"6":1,"18":3,"19":1,"35":1,"48":1,"94":1,"96":1,"102":1,"106":1,"196":1,"215":1,"242":1,"251":1,"252":1,"259":1,"263":2,"266":1,"267":1,"326":1}}],["evaluated",{"2":{"97":1,"101":1,"236":1,"291":1}}],["evaluation",{"0":{"97":1},"2":{"110":1}}],["even",{"2":{"189":1,"290":1}}],["event",{"2":{"57":1,"63":2,"139":1}}],["events",{"0":{"57":1,"63":1},"2":{"22":1,"43":1,"57":1,"63":1,"66":1,"142":1,"199":1}}],["eventually",{"2":{"14":1}}],["everyday",{"2":{"116":1,"259":1}}],["everyone",{"2":{"100":1,"105":1,"107":1}}],["everything",{"2":{"17":1,"20":1,"92":1,"231":1,"315":1}}],["every",{"2":{"1":1,"10":1,"13":1,"14":1,"16":1,"18":1,"95":1,"103":1,"155":1,"181":1,"192":1,"236":5,"239":1,"240":1}}],["evolves",{"2":{"14":1}}],["economics",{"2":{"14":1}}],["emmamultilingualneural",{"2":{"354":1}}],["embedded",{"2":{"315":1,"316":1}}],["embeddings",{"2":{"206":1,"327":1}}],["embedding",{"0":{"229":1},"2":{"9":1,"116":1,"215":1,"216":1,"222":1,"224":2,"229":3,"230":1,"231":1,"317":4,"327":2,"328":1,"330":2,"335":1,"339":1}}],["embed",{"2":{"30":1}}],["empty",{"2":{"14":1,"81":1,"112":1,"116":1,"227":1,"235":1,"344":1}}],["emails",{"2":{"173":1,"178":2,"179":1,"180":1,"239":1,"240":2}}],["email",{"0":{"173":1,"174":1,"175":1,"177":1,"294":1},"1":{"174":1,"175":1,"176":2,"177":1,"178":2,"179":1,"180":1},"2":{"1":1,"7":1,"8":1,"33":2,"114":2,"174":5,"175":2,"176":3,"177":2,"178":3,"179":5,"180":3,"285":2,"294":4,"312":1,"323":1}}],["editor",{"2":{"182":1,"186":1,"196":1,"270":1}}],["edit",{"0":{"271":1},"2":{"18":1,"114":1,"127":1,"186":1,"209":1,"248":1,"266":1,"271":1,"274":2,"320":1,"331":1,"337":1}}],["editing",{"0":{"185":1},"1":{"186":1,"187":1},"2":{"8":1,"10":1,"158":1,"271":1,"326":1}}],["edge",{"0":{"352":1,"353":1},"1":{"353":1,"354":1,"355":1,"356":1},"2":{"9":1,"19":1,"116":1,"219":3,"230":2,"352":2,"353":2,"354":1,"355":2,"357":2,"358":1,"359":2,"360":1}}],["exchange",{"2":{"254":1}}],["exchanged",{"2":{"200":1}}],["exceptions",{"2":{"220":1}}],["except",{"2":{"92":1,"107":1}}],["existing",{"2":{"163":1,"167":1,"209":1,"257":1,"276":1}}],["exists",{"0":{"145":1},"2":{"274":1}}],["exist",{"2":{"135":1,"158":1,"161":1,"162":1}}],["exa",{"2":{"245":1}}],["exact",{"2":{"43":1,"162":1,"225":1,"227":1,"280":1}}],["examples",{"0":{"104":1,"268":1},"1":{"105":1,"106":1,"107":1,"108":1,"109":1},"2":{"161":1,"217":1,"236":1,"279":1,"280":1,"297":1,"303":1,"305":1}}],["example",{"2":{"43":1,"102":1,"230":1,"281":3,"296":1}}],["extraction",{"2":{"326":1,"338":1,"346":1,"351":1}}],["extracted",{"2":{"170":1,"263":1}}],["extract",{"2":{"37":1,"208":1,"337":1}}],["extending",{"0":{"196":1}}],["extend",{"2":{"11":1,"264":1}}],["external",{"0":{"256":1},"2":{"8":1,"35":1,"95":1,"195":1,"196":1,"206":1,"233":1,"243":1,"317":1,"328":1}}],["executable",{"2":{"198":1}}],["executing",{"2":{"158":1}}],["executions",{"2":{"235":1}}],["execution",{"0":{"241":1},"2":{"1":1,"8":1,"17":1,"114":2,"117":1,"192":1,"237":1,"242":1,"253":1,"293":1}}],["executes",{"2":{"198":1,"234":1,"241":1}}],["execute",{"2":{"18":1,"121":1,"155":1,"156":1,"190":1,"191":1}}],["expiration",{"2":{"323":1}}],["expires",{"2":{"87":1}}],["expression",{"2":{"235":1,"239":1,"242":1}}],["expressions",{"2":{"18":1,"233":1}}],["explain",{"2":{"265":1}}],["explanation",{"2":{"235":1}}],["explicitly",{"2":{"66":1,"94":2,"254":1,"255":1}}],["explicit",{"2":{"17":1,"19":1,"226":1,"287":1}}],["expand",{"2":{"161":1}}],["exposed",{"2":{"162":1,"202":1,"203":1,"224":1}}],["expose",{"2":{"160":1,"223":1,"272":1}}],["exposes",{"2":{"6":1,"116":1,"118":1,"226":1,"262":1}}],["exporting",{"2":{"168":1}}],["export",{"0":{"168":1,"169":1},"1":{"169":1,"170":1,"171":1},"2":{"114":1,"129":1,"169":1,"201":2,"314":1}}],["expect",{"2":{"254":1}}],["expensive",{"2":{"16":1}}],["experienced",{"2":{"19":1}}],["experience",{"2":{"13":1,"182":1}}],["env",{"2":{"198":1,"320":1}}],["environment",{"0":{"325":1},"2":{"1":1,"19":1,"23":1,"116":1,"123":1,"155":1,"157":1,"164":1,"172":1,"198":1,"266":1,"276":1,"319":2}}],["ensure",{"2":{"165":1}}],["ensures",{"2":{"155":1}}],["enabling",{"2":{"133":1,"140":1,"189":1,"243":1}}],["enables",{"2":{"50":1,"71":1,"126":1,"265":1,"273":1}}],["enabled",{"2":{"25":1,"38":1,"39":1,"45":1,"49":2,"66":2,"76":1,"82":1,"88":1,"90":1,"116":1,"117":1,"118":1,"147":2,"178":3,"191":1,"235":1,"237":1,"240":1,"296":3,"316":1}}],["enable",{"0":{"55":1,"61":1,"77":1,"273":1},"2":{"23":1,"24":1,"29":1,"31":1,"35":1,"38":1,"44":1,"49":3,"55":1,"56":1,"61":1,"63":1,"65":1,"70":1,"77":1,"81":1,"89":1,"117":1,"118":1,"138":1,"142":1,"143":2,"147":1,"161":1,"201":1,"273":1,"282":1,"303":2,"317":3,"334":1}}],["en",{"2":{"126":1,"296":2,"354":1}}],["engines",{"0":{"245":1},"2":{"243":1,"245":2,"325":1}}],["engine",{"2":{"116":1,"126":1,"247":2}}],["engineering",{"2":{"18":1}}],["encodes",{"2":{"317":1}}],["encoding",{"2":{"74":1,"75":1,"76":1,"316":1,"317":3,"323":1,"328":1,"334":1}}],["encountered",{"2":{"192":1}}],["encryption",{"2":{"75":1,"76":2,"141":1}}],["encrypted",{"2":{"74":1}}],["endpoints",{"2":{"217":1}}],["endpoint",{"2":{"81":1,"199":1,"218":1,"349":1}}],["ending",{"2":{"69":1}}],["end",{"2":{"23":1}}],["enough",{"2":{"14":1,"145":1}}],["entire",{"2":{"91":1,"95":1,"100":1,"102":1,"113":1}}],["entry",{"2":{"87":1,"259":1,"310":1}}],["entries",{"2":{"5":1,"153":1,"193":1,"209":1,"210":1,"213":1,"214":1,"307":1,"341":1}}],["enterprise",{"2":{"33":3,"53":1,"135":2}}],["enter",{"2":{"13":1,"44":1,"54":1,"161":2,"162":1,"208":1}}],["ok",{"2":{"192":1}}],["okay",{"2":{"14":1}}],["observing",{"2":{"254":1}}],["observation",{"2":{"253":1}}],["observe",{"2":{"129":1,"263":1}}],["obtain",{"2":{"35":1,"37":1}}],["older",{"2":{"144":1,"145":2,"153":1,"193":1,"210":1,"214":1,"266":1,"307":1}}],["old",{"2":{"118":1,"147":1,"193":1,"255":1,"256":1,"268":1,"287":1}}],["opus",{"2":{"354":1}}],["optimized",{"2":{"263":1}}],["options",{"2":{"160":1,"161":1,"296":2,"354":2}}],["option",{"2":{"37":2,"296":1}}],["optionally",{"2":{"100":1,"116":1,"210":1}}],["optional",{"0":{"50":1,"71":1,"89":1},"2":{"34":1,"49":1,"102":1,"112":1,"116":3,"117":1,"118":1,"126":4,"141":1,"160":1,"216":1,"235":1,"242":1,"316":1,"323":1}}],["opt",{"2":{"198":1}}],["openssl",{"2":{"320":1}}],["opensearch",{"2":{"317":2,"328":2,"334":1}}],["opens",{"2":{"310":1}}],["opening",{"2":{"263":1}}],["openviking",{"0":{"347":1,"348":1,"349":1,"350":1},"1":{"348":1,"349":1,"350":1,"351":1},"2":{"205":1,"339":1,"341":1,"347":1,"348":1,"349":2,"350":1,"351":2}}],["open",{"0":{"105":1,"107":1},"2":{"20":1,"23":1,"24":1,"30":1,"39":1,"44":1,"48":1,"52":1,"53":1,"54":1,"60":2,"65":1,"66":1,"69":1,"71":1,"75":1,"84":1,"87":1,"98":1,"99":1,"103":1,"121":1,"123":1,"128":1,"149":2,"161":1,"186":1,"200":1,"205":1,"218":1,"269":1,"309":1,"310":1,"336":1,"340":2,"345":1,"350":1,"355":1,"358":1}}],["openclaw",{"0":{"19":1},"2":{"19":1}}],["openai",{"0":{"221":1},"2":{"9":3,"217":2,"218":1,"219":6,"220":1,"221":1,"297":2,"317":1}}],["operational",{"2":{"212":1}}],["operation",{"2":{"171":1,"210":1,"279":1}}],["operations",{"0":{"10":1,"143":1,"157":1,"182":1,"201":1,"207":1},"1":{"158":1,"183":1,"184":1,"208":1,"209":1},"2":{"158":1,"188":1,"337":1,"346":2,"351":2}}],["operates",{"2":{"155":1,"326":1}}],["operate",{"2":{"11":1,"20":1}}],["oem",{"2":{"14":1}}],["os",{"2":{"14":1}}],["occasional",{"2":{"14":1}}],["outgoing",{"2":{"178":1,"180":1}}],["outbox",{"0":{"179":1},"2":{"114":1,"179":1,"180":1,"285":1,"294":2}}],["outbound",{"2":{"22":1,"26":1,"62":1,"74":1,"78":1}}],["outcome",{"2":{"97":1}}],["outside",{"2":{"33":1,"162":1}}],["output",{"2":{"26":1,"45":1,"46":1,"116":2,"198":1,"225":1,"226":1,"227":1,"228":1,"229":1,"254":1,"282":1,"305":1,"354":1}}],["out",{"2":{"14":1,"145":1,"317":1}}],["outward",{"2":{"6":1}}],["our",{"2":{"13":1,"14":1}}],["overlay",{"2":{"321":1}}],["overlapping",{"2":{"210":1}}],["over",{"2":{"13":1,"172":1,"199":1,"210":1,"354":1}}],["overview",{"0":{"13":1,"33":1,"114":1},"1":{"34":1,"35":1},"2":{"114":1,"313":1,"314":1}}],["oauth2",{"2":{"30":1}}],["oauth",{"0":{"200":1,"220":1},"1":{"221":1,"222":1},"2":{"10":1,"33":1,"62":1,"64":2,"114":1,"200":6,"217":1,"219":2,"221":1,"310":1,"314":1}}],["ongoing",{"2":{"254":1}}],["only",{"2":{"48":1,"92":4,"94":1,"99":1,"100":1,"102":2,"103":5,"106":1,"108":2,"109":1,"112":1,"116":1,"120":1,"129":1,"146":1,"160":1,"210":1,"219":1,"253":3,"254":1,"267":1,"275":2,"282":3,"317":1,"320":1,"327":1,"328":1,"330":1,"333":1}}],["online",{"2":{"20":1}}],["on",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"13":2,"14":1,"16":1,"17":1,"20":2,"23":1,"26":1,"34":1,"35":3,"36":1,"37":1,"42":1,"45":1,"48":1,"69":1,"71":1,"78":1,"87":2,"95":1,"108":1,"113":1,"129":1,"133":1,"135":1,"137":1,"145":1,"162":2,"180":1,"184":1,"191":1,"200":1,"202":1,"206":1,"229":1,"235":1,"247":1,"248":1,"251":1,"255":2,"257":1,"260":1,"263":1,"271":1,"287":1,"315":1,"317":2,"320":1,"324":1,"356":1}}],["once",{"2":{"7":1,"48":1,"58":1,"82":1,"87":1,"113":1,"123":1,"201":1,"202":1,"203":1,"244":1,"274":1,"337":1,"346":1,"351":1}}],["ones",{"2":{"145":1,"266":1}}],["one",{"0":{"319":1},"2":{"7":1,"20":1,"34":1,"68":1,"73":1,"87":1,"115":1,"124":1,"153":2,"161":2,"205":1,"210":1,"214":1,"216":2,"217":2,"231":1,"252":1,"263":1,"267":2,"273":1,"280":2,"281":1,"307":1,"326":1,"338":1,"340":1}}],["often",{"2":{"117":1,"191":1,"254":2}}],["offs",{"2":{"265":1}}],["off",{"0":{"333":1},"2":{"14":1,"191":1,"211":1,"273":1,"327":1,"330":1,"339":1}}],["official",{"0":{"34":1,"41":1,"52":1,"73":1,"74":1,"84":1,"141":1},"1":{"74":1,"75":1,"76":1,"77":1,"78":1},"2":{"1":1,"7":2,"22":1,"30":1,"33":2,"34":2,"47":1,"57":1,"69":2,"73":2,"74":1,"75":1,"76":1,"77":1,"135":5,"141":2,"312":1,"319":1}}],["of",{"2":{"5":1,"8":1,"13":2,"14":3,"18":1,"38":1,"40":1,"50":1,"68":1,"71":1,"95":2,"107":1,"115":1,"116":1,"129":1,"144":1,"154":1,"157":1,"159":1,"164":1,"167":1,"172":2,"179":2,"192":2,"194":2,"196":1,"198":2,"199":2,"205":1,"206":1,"212":1,"213":1,"221":1,"231":1,"235":3,"236":3,"239":1,"252":1,"253":2,"256":1,"262":1,"263":2,"267":1,"274":1,"277":2,"279":1,"281":1,"307":1,"316":1,"317":2,"323":1,"326":1,"328":1,"340":1,"342":1}}],["others",{"2":{"263":1,"316":1}}],["other",{"0":{"263":1},"2":{"4":1,"18":1,"108":1,"155":1,"212":1,"242":1,"245":1,"247":1,"251":1,"253":1}}],["orchestrated",{"2":{"315":1}}],["oriented",{"2":{"135":1,"221":1,"242":1,"253":1}}],["ordering",{"2":{"97":1,"314":1}}],["order",{"2":{"97":1,"101":1,"110":1,"266":1}}],["organized",{"2":{"357":1}}],["organize",{"2":{"260":1}}],["organization",{"2":{"23":1,"56":1,"79":1,"344":2}}],["org",{"2":{"37":1,"38":2}}],["or",{"2":{"1":1,"3":2,"6":1,"18":2,"23":1,"25":1,"33":1,"35":1,"37":1,"39":1,"40":1,"42":1,"43":1,"53":1,"66":1,"72":1,"75":1,"80":1,"82":1,"87":1,"91":2,"94":1,"97":1,"99":2,"100":2,"103":1,"105":1,"106":1,"107":1,"108":1,"110":1,"112":2,"117":1,"118":2,"120":1,"124":2,"126":3,"129":2,"130":1,"138":2,"144":1,"147":1,"150":1,"151":3,"153":2,"155":2,"158":1,"159":1,"161":3,"162":1,"163":1,"165":1,"168":1,"171":1,"174":1,"180":1,"184":2,"188":1,"190":1,"191":1,"192":2,"193":1,"194":1,"196":1,"199":1,"201":3,"205":1,"206":1,"209":1,"210":2,"212":1,"214":1,"215":1,"216":2,"217":1,"218":1,"223":1,"225":1,"226":1,"229":1,"230":1,"233":1,"244":1,"251":1,"255":1,"256":2,"257":1,"259":1,"264":1,"265":2,"266":3,"268":1,"273":1,"274":1,"278":1,"279":2,"287":1,"290":1,"291":1,"292":1,"293":1,"296":7,"297":3,"298":1,"299":1,"300":1,"301":1,"304":1,"307":1,"310":1,"311":1,"315":1,"319":1,"320":3,"328":1,"330":1,"337":1,"339":1,"341":1,"347":1}}],["owner",{"2":{"92":1,"94":1,"97":1,"106":1,"215":1,"282":3,"296":1,"297":2,"298":1,"299":1,"300":1,"301":1,"303":5}}],["own",{"2":{"1":3,"4":1,"18":3,"111":1,"116":1,"117":1,"155":1,"178":1,"181":1,"188":1,"196":1,"245":1,"251":1,"252":1,"271":1,"274":1,"339":1}}],["lt",{"2":{"266":1,"280":3,"297":6,"298":1,"299":1,"300":1,"301":2,"303":8,"305":1}}],["learn",{"2":{"313":1}}],["leave",{"2":{"227":1,"235":1}}],["leaving",{"2":{"35":1,"185":1}}],["legacy",{"2":{"266":2,"268":1,"274":1,"276":1,"277":1}}],["levels",{"2":{"226":1}}],["level",{"0":{"284":1},"2":{"61":2,"64":1,"65":1,"95":2,"102":1,"116":1,"210":1,"236":1,"279":1,"280":1,"290":1,"323":1}}],["left",{"2":{"28":1,"54":1,"112":1}}],["less",{"2":{"20":1,"254":1}}],["lets",{"2":{"92":1,"102":1,"129":1,"228":1}}],["let",{"2":{"3":1}}],["lightweight",{"2":{"317":1,"327":1}}],["lighter",{"2":{"19":1,"317":1}}],["libraries",{"2":{"163":1}}],["linux",{"2":{"324":1}}],["line",{"2":{"161":1,"179":1,"198":1,"321":1}}],["link",{"2":{"140":1,"174":1}}],["linked",{"2":{"71":1,"110":1,"222":1,"291":2}}],["links",{"2":{"30":1,"51":1,"72":1,"124":1,"314":1}}],["living",{"2":{"115":1}}],["lived",{"2":{"35":1}}],["live",{"2":{"14":1,"103":1,"266":1,"280":1}}],["listen",{"2":{"323":1}}],["listed",{"2":{"106":1,"267":1}}],["lists",{"2":{"202":1,"259":1,"304":1,"328":1}}],["list",{"2":{"91":1,"107":1,"137":1,"151":1,"162":2,"166":1,"167":1,"183":1,"198":1,"202":1,"209":1,"237":2,"253":1,"279":2,"280":1,"285":1,"297":4,"298":2,"299":2,"300":2,"301":2,"303":3,"304":2,"305":4,"317":1,"330":1,"344":1,"349":1}}],["limit",{"2":{"152":1,"227":1,"235":1,"242":1}}],["limited",{"2":{"87":1}}],["limitations",{"2":{"46":1}}],["lifecycle",{"0":{"158":1},"2":{"113":1,"114":1,"157":1,"172":1}}],["life",{"2":{"14":1}}],["likely",{"2":{"254":1}}],["like",{"0":{"265":1},"2":{"1":1,"6":1,"14":1,"17":1,"18":1,"20":2,"57":1,"124":1,"129":1,"158":1,"174":1,"244":1,"254":3,"276":1}}],["llm",{"2":{"19":1,"116":1,"191":1,"278":1}}],["llms",{"2":{"14":1,"224":1}}],["ll",{"2":{"14":1}}],["launch",{"2":{"158":1}}],["languages",{"2":{"186":1,"317":1,"328":1,"352":1,"354":1,"359":1}}],["language",{"2":{"114":1,"116":2,"235":1,"239":1,"242":1,"296":3,"317":1,"354":1}}],["last",{"2":{"18":1,"259":2,"292":1}}],["layered",{"2":{"280":1}}],["layers",{"2":{"119":1,"357":1}}],["layer",{"2":{"14":1,"15":1}}],["later",{"2":{"92":1,"163":1,"164":1,"274":1}}],["latest",{"2":{"21":1,"183":1,"193":1,"279":1,"290":3,"319":1,"324":1,"325":2}}],["late",{"2":{"14":1}}],["latency",{"2":{"13":1,"145":1}}],["large",{"2":{"5":1,"153":1,"305":1}}],["lark",{"0":{"53":1},"1":{"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"1":1,"7":1,"18":1,"33":1,"53":1,"135":1,"312":1}}],["loop",{"2":{"288":1}}],["lookup",{"2":{"317":1}}],["looks",{"0":{"265":1},"2":{"266":1}}],["looked",{"2":{"14":1}}],["locations",{"2":{"266":1}}],["localhost",{"2":{"322":3}}],["locally",{"2":{"317":1,"328":1,"334":1}}],["locale",{"2":{"116":1,"123":1,"126":2}}],["local",{"0":{"198":1},"2":{"15":1,"16":1,"17":1,"19":1,"20":1,"169":1,"170":1,"184":2,"198":1,"255":2,"287":2}}],["losing",{"2":{"252":1,"273":1}}],["lost",{"2":{"122":1}}],["load",{"2":{"193":2}}],["loaded",{"2":{"18":1,"275":1,"285":1}}],["logging",{"2":{"323":1}}],["logs",{"0":{"151":1,"192":1,"193":1},"1":{"193":1},"2":{"114":3,"117":1,"118":1,"193":1,"194":1,"285":2,"293":3,"324":2}}],["log",{"2":{"48":1,"54":1,"80":1,"151":1,"172":1,"179":1,"192":1,"193":1,"323":1}}],["login",{"0":{"140":1},"2":{"7":1,"33":1,"34":1,"35":1,"37":3,"73":1,"87":3,"88":1,"135":2,"322":1}}],["lower",{"2":{"210":1}}],["lowest",{"2":{"97":1}}],["low",{"2":{"14":1,"116":1,"210":1,"226":1,"296":1}}],["longer",{"2":{"14":1,"127":1,"209":1,"256":1,"261":1,"331":1}}],["long",{"0":{"5":1},"2":{"1":2,"5":1,"13":1,"16":1,"20":1,"35":1,"38":1,"131":1,"144":1,"146":1,"153":1,"154":1,"192":1,"204":1,"206":1,"210":1,"214":1,"215":1,"256":1,"288":1,"307":2,"312":1,"314":1,"338":1}}],["tutorial",{"2":{"69":1}}],["turns",{"2":{"144":1,"145":2,"153":1,"273":1,"307":1}}],["turning",{"2":{"14":1}}],["turn",{"2":{"13":1,"18":1,"147":1,"288":1}}],["typical",{"0":{"268":1},"2":{"124":1,"151":1,"217":1,"219":1,"223":1}}],["typing",{"2":{"49":1,"51":1,"89":2,"90":1}}],["typed",{"2":{"276":1}}],["type",{"2":{"37":3,"95":1,"100":3,"102":2,"108":2,"176":1,"198":1,"199":1,"201":1,"206":1,"217":1,"218":3,"219":2,"221":1,"222":1,"224":1,"253":2,"255":1,"256":1,"257":1,"259":2,"266":1,"287":1,"329":1,"343":1,"348":1,"353":1,"357":1,"358":1}}],["types",{"0":{"95":1,"197":1,"219":1,"224":1,"253":1},"1":{"198":1,"199":1,"254":1},"2":{"6":1,"9":1,"51":1,"63":1,"91":1,"219":1,"220":1,"224":1,"253":2,"254":1,"313":1,"340":1}}],["timing",{"2":{"242":1}}],["timezone",{"2":{"112":3,"114":1,"116":4,"123":1,"126":2,"236":2,"323":2}}],["timeout",{"2":{"38":2,"323":1}}],["timestamp",{"2":{"179":1}}],["timestamps",{"2":{"167":1}}],["times",{"2":{"18":1,"235":1}}],["time",{"0":{"14":1,"244":1},"2":{"3":1,"14":3,"83":1,"119":1,"130":1,"151":1,"158":1,"159":1,"172":1,"192":1,"210":1,"211":1,"243":1,"250":1}}],["titles",{"2":{"116":1}}],["title",{"2":{"114":1,"116":1,"259":1,"260":1}}],["tiny",{"2":{"14":1}}],["t",{"2":{"14":6,"16":2,"158":1,"189":1,"317":1}}],["truncated",{"2":{"305":1}}],["true",{"2":{"240":1,"296":3,"325":1}}],["trying",{"2":{"214":2}}],["tree",{"2":{"182":1}}],["treats",{"2":{"281":1}}],["treated",{"2":{"254":1}}],["treat",{"2":{"19":1,"120":1}}],["troubleshooting",{"2":{"180":1,"212":1}}],["triggering",{"2":{"233":1}}],["triggers",{"2":{"118":1,"147":1,"235":1,"241":1,"253":1,"262":1,"307":1}}],["trigger",{"2":{"106":1,"148":1,"153":1,"180":1,"190":1,"191":1,"214":1,"242":1,"263":1,"285":1}}],["triggered",{"2":{"6":1,"154":1,"192":1,"234":1,"253":1,"263":1}}],["translate",{"2":{"239":1}}],["transport",{"2":{"199":1}}],["transfer",{"2":{"184":1}}],["track",{"2":{"263":1}}],["tracked",{"2":{"180":1}}],["tracks",{"2":{"152":1,"172":1}}],["traditional",{"2":{"176":1}}],["trade",{"2":{"14":1,"265":1}}],["trail",{"2":{"151":1}}],["trapped",{"2":{"16":1}}],["travels",{"2":{"14":1}}],["tag",{"2":{"319":1,"325":3}}],["taking",{"2":{"288":1}}],["takes",{"2":{"113":1,"267":1}}],["take",{"2":{"14":1,"97":1,"322":1}}],["tavily",{"2":{"245":1}}],["target",{"2":{"35":1,"51":1,"95":1,"309":1,"310":1}}],["tab",{"0":{"114":1,"116":1,"117":1,"118":1,"121":1},"2":{"31":1,"35":1,"38":1,"49":1,"57":1,"65":1,"70":1,"81":1,"86":1,"91":1,"92":1,"94":1,"98":1,"99":1,"110":1,"114":1,"115":4,"116":1,"117":2,"118":1,"119":2,"121":1,"122":1,"128":1,"129":1,"134":1,"147":1,"151":1,"153":1,"157":1,"159":1,"160":1,"161":1,"163":1,"168":1,"177":1,"179":1,"181":1,"188":1,"191":1,"192":1,"196":1,"197":1,"205":2,"207":1,"210":1,"211":1,"212":1,"213":1,"214":1,"237":1,"249":1,"264":1,"309":2,"310":2,"336":1,"337":1,"338":1,"340":2,"345":1,"350":1,"355":1,"358":1}}],["tabs",{"2":{"10":1,"113":1,"115":1,"121":1,"313":1}}],["talks",{"2":{"216":1}}],["talk",{"2":{"14":1}}],["tasks",{"0":{"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1},"2":{"18":2,"111":1,"114":1,"116":1,"117":1,"159":2,"189":1,"194":1,"203":1,"233":1,"242":1,"256":1,"263":1,"278":1,"285":1,"303":1}}],["task",{"2":{"6":2,"173":1,"191":1,"192":1,"233":1,"235":3,"242":1,"251":1,"253":2,"263":1,"265":1}}],["tts",{"0":{"352":1,"353":1,"357":1},"1":{"353":1,"354":1,"355":1,"356":1,"358":1,"359":1,"360":1},"2":{"8":1,"9":2,"114":1,"115":1,"116":5,"216":1,"219":1,"224":2,"230":2,"231":1,"232":2,"352":1,"353":1,"355":3,"357":7,"358":2,"359":1,"360":1}}],["together",{"2":{"259":1}}],["toggle",{"2":{"143":1,"191":1,"201":1,"319":1}}],["today",{"2":{"235":1,"281":1,"303":1}}],["total",{"2":{"213":1,"235":1,"262":1}}],["toml",{"2":{"186":1,"319":1,"320":4,"321":2,"322":1,"323":1,"325":2,"334":2,"335":2}}],["topics",{"2":{"256":1}}],["topic",{"2":{"251":1,"260":1}}],["top",{"0":{"284":1},"2":{"97":2,"101":1,"107":1,"235":1,"236":1,"279":1,"280":1,"281":1,"303":1}}],["tokens",{"2":{"35":2,"138":1,"262":1,"278":1,"290":1}}],["token",{"0":{"43":1,"62":1},"2":{"28":3,"31":1,"34":1,"37":3,"38":2,"43":5,"44":1,"61":4,"62":1,"64":3,"65":4,"69":3,"70":1,"74":1,"75":1,"76":1,"87":1,"118":1,"141":1,"145":1,"147":1,"151":1,"200":3,"217":1,"218":1,"222":1,"262":1,"285":1,"292":1,"317":1,"323":1,"328":1}}],["to",{"0":{"11":1,"12":1,"19":1,"30":1,"63":1,"64":1,"66":1,"128":1,"152":1,"249":1,"263":1,"336":1,"345":1,"350":1,"355":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"6":1,"13":1,"14":2,"16":2,"18":3,"19":1,"20":1,"23":2,"24":2,"25":1,"27":2,"28":3,"29":1,"30":3,"31":1,"32":1,"33":1,"35":2,"36":3,"38":1,"39":1,"40":1,"42":1,"43":3,"44":2,"45":1,"47":2,"48":2,"49":1,"50":3,"53":1,"54":2,"55":1,"56":1,"57":2,"58":2,"59":2,"60":2,"61":1,"62":1,"64":1,"65":1,"66":3,"68":1,"69":2,"70":1,"71":2,"72":1,"75":1,"79":2,"80":2,"81":1,"82":2,"85":2,"86":1,"87":1,"88":1,"91":2,"96":1,"97":2,"98":1,"100":3,"101":3,"102":2,"103":2,"105":1,"106":1,"107":1,"108":1,"109":1,"110":2,"112":1,"113":1,"114":1,"115":2,"116":5,"118":1,"119":1,"121":2,"122":3,"123":3,"125":1,"126":1,"128":2,"130":1,"131":1,"132":2,"133":1,"139":2,"140":1,"142":1,"144":1,"145":2,"147":3,"150":1,"151":1,"152":2,"154":3,"155":1,"158":2,"159":1,"160":4,"161":1,"162":2,"163":1,"164":1,"166":1,"167":2,"169":1,"171":2,"172":1,"173":1,"174":3,"176":1,"178":1,"179":1,"180":3,"183":1,"184":3,"185":1,"186":3,"187":1,"188":2,"189":2,"190":1,"191":1,"192":1,"193":1,"195":2,"196":1,"198":1,"199":1,"200":2,"201":2,"202":2,"203":1,"204":1,"208":1,"210":2,"211":3,"212":1,"213":1,"214":3,"215":1,"216":3,"222":2,"223":1,"224":1,"226":1,"227":1,"228":1,"230":1,"231":2,"232":3,"233":1,"234":3,"235":2,"237":2,"239":2,"240":1,"241":1,"243":3,"244":1,"245":1,"247":2,"249":2,"250":2,"251":1,"252":1,"253":3,"254":3,"255":4,"256":3,"257":1,"260":1,"262":1,"263":1,"269":1,"271":1,"273":1,"274":2,"276":1,"277":1,"278":1,"279":2,"280":1,"281":1,"282":1,"287":4,"288":1,"307":1,"309":1,"310":2,"313":1,"314":1,"315":2,"317":4,"319":1,"320":1,"324":1,"325":5,"328":1,"329":1,"330":1,"336":2,"337":2,"338":1,"342":1,"343":1,"344":1,"345":2,"346":1,"348":1,"350":2,"351":1,"353":1,"354":2,"356":2,"357":1,"358":2,"360":1}}],["took",{"2":{"192":1}}],["toolbar",{"2":{"182":1}}],["toolkit",{"2":{"162":1}}],["tool",{"0":{"202":1},"2":{"8":1,"17":1,"162":1,"195":1,"202":1,"224":1,"225":1,"226":1,"239":1,"244":1,"264":1,"265":1,"288":1,"310":1,"312":1,"314":1}}],["tools",{"0":{"8":1},"2":{"1":1,"4":1,"14":1,"19":1,"111":1,"123":1,"128":1,"129":1,"158":1,"163":1,"188":1,"190":1,"194":1,"196":1,"202":4,"203":2,"226":1,"234":1,"241":1,"265":1}}],["too",{"2":{"5":1,"14":3,"99":2,"153":1,"256":1,"288":1}}],["two",{"2":{"5":1,"34":1,"119":1,"135":1,"148":1,"153":1,"174":1,"214":1,"220":1,"238":1,"254":1,"276":1,"279":1}}],["temporarily",{"2":{"273":1}}],["templates",{"2":{"308":1,"311":1,"314":1}}],["template",{"0":{"310":1},"2":{"8":1,"196":1,"319":1}}],["tech",{"2":{"235":1,"303":1}}],["testing",{"0":{"356":1},"2":{"164":1}}],["test",{"0":{"77":1},"2":{"77":1,"103":1,"273":1,"356":1,"358":2}}],["team",{"2":{"19":1}}],["textarea",{"2":{"208":1}}],["text",{"0":{"186":1},"2":{"14":1,"26":1,"32":1,"40":2,"42":1,"45":1,"46":1,"51":1,"83":1,"90":1,"116":1,"146":1,"150":2,"151":1,"186":1,"209":1,"216":1,"224":1,"254":1,"279":2,"280":1,"281":2,"291":1,"296":1,"297":1,"303":1,"305":1,"317":1,"323":1,"328":1,"357":2}}],["tension",{"2":{"13":1}}],["telegram",{"0":{"68":1,"69":1,"256":1},"1":{"69":1,"70":1,"71":1,"72":1},"2":{"1":1,"7":1,"18":1,"33":1,"68":2,"69":3,"70":1,"71":3,"95":2,"102":1,"108":2,"109":2,"114":1,"133":1,"135":2,"235":1,"240":1,"255":1,"281":1,"287":1,"312":1}}],["terms",{"2":{"231":1}}],["terminal",{"0":{"121":1},"2":{"114":2,"121":2}}],["term",{"0":{"5":1},"2":{"1":1,"5":1,"131":1,"144":1,"146":1,"153":1,"154":1,"204":1,"206":1,"210":1,"214":1,"215":1,"307":1,"314":1,"317":1,"338":1}}],["those",{"2":{"13":1,"216":1,"266":1}}],["threshold",{"2":{"118":2,"147":3}}],["threaded",{"2":{"103":1}}],["thread",{"2":{"62":1,"92":1,"100":3,"102":3,"103":1,"110":1,"119":1,"251":1,"291":1}}],["threads",{"2":{"14":1,"33":1,"59":1,"67":1,"92":1,"254":1,"259":1}}],["three",{"2":{"13":1,"95":1,"224":1,"231":1,"326":1,"339":1,"341":1,"357":1}}],["through",{"2":{"1":1,"5":1,"6":1,"9":1,"18":2,"33":1,"35":1,"47":1,"68":1,"74":1,"113":1,"120":1,"123":1,"160":1,"206":1,"219":1,"221":1,"224":1,"266":1,"342":1,"346":1,"351":1}}],["thing",{"2":{"14":1,"20":1}}],["thinking",{"2":{"242":1}}],["thinks",{"2":{"72":1}}],["think",{"2":{"6":1,"14":1,"190":1,"231":1}}],["this",{"2":{"5":1,"14":2,"21":1,"28":1,"37":2,"42":1,"53":1,"57":1,"60":1,"68":1,"69":1,"73":2,"78":2,"94":1,"95":1,"97":1,"103":1,"110":1,"117":1,"122":2,"125":1,"129":1,"139":2,"144":1,"147":1,"150":1,"152":1,"155":1,"160":2,"162":1,"164":1,"166":1,"171":1,"172":1,"181":1,"190":1,"191":1,"198":1,"199":1,"206":1,"210":2,"211":1,"212":1,"213":1,"218":1,"221":1,"228":1,"230":1,"233":1,"235":1,"237":1,"239":1,"252":1,"253":1,"254":1,"255":1,"256":2,"260":1,"266":1,"267":2,"273":1,"280":1,"288":1,"291":1,"307":2,"320":1,"321":1,"322":1,"329":1,"343":1,"348":1}}],["than",{"2":{"1":1,"9":1,"19":1,"120":1,"152":1,"210":1,"317":2,"328":1}}],["that",{"2":{"1":1,"4":1,"6":1,"13":1,"14":8,"15":1,"20":4,"23":2,"33":1,"34":3,"43":2,"45":1,"66":1,"71":1,"77":1,"94":1,"103":1,"109":1,"111":1,"114":1,"116":2,"118":1,"119":1,"128":1,"133":1,"141":1,"145":3,"147":1,"151":1,"188":1,"190":1,"192":1,"194":1,"200":1,"209":1,"212":1,"215":1,"216":1,"222":1,"227":1,"228":1,"229":1,"230":1,"235":1,"239":1,"244":1,"254":1,"264":1,"267":1,"272":2,"274":1,"275":2,"278":1,"291":1,"309":1,"310":1,"317":1,"336":1,"338":1,"340":1,"342":1,"347":2}}],["these",{"2":{"44":1,"62":1,"63":1,"92":1,"115":2,"153":1,"188":1,"202":1,"203":1,"219":1,"263":1,"266":1,"267":1}}],["their",{"2":{"16":1,"18":2,"101":1,"167":1,"202":1,"237":1}}],["they",{"2":{"16":2,"40":1,"254":1,"259":1,"263":1,"265":1,"266":1,"278":2}}],["then",{"0":{"99":1},"2":{"14":1,"54":1,"116":1,"196":1,"234":1,"269":1,"320":1,"357":1}}],["there",{"2":{"14":1,"212":1}}],["the",{"0":{"12":1,"30":1,"39":1,"64":1,"66":1,"75":1,"76":1,"87":1,"103":1,"115":1,"149":1,"156":1,"239":1,"240":1,"257":1,"269":1,"354":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"1":1,"3":2,"5":3,"6":2,"7":2,"8":1,"10":2,"11":1,"13":4,"14":12,"16":1,"17":2,"18":3,"19":3,"20":2,"21":1,"22":2,"23":5,"24":3,"25":4,"28":2,"29":1,"30":3,"31":1,"33":4,"34":3,"35":7,"36":1,"37":4,"38":5,"39":2,"40":1,"43":6,"44":5,"45":2,"48":3,"49":1,"50":2,"53":1,"54":2,"55":1,"56":1,"57":3,"58":3,"60":4,"61":3,"62":2,"63":2,"64":6,"65":2,"66":10,"68":1,"69":3,"70":3,"71":4,"72":4,"73":2,"74":1,"75":6,"76":5,"77":4,"80":2,"81":4,"82":3,"86":1,"87":5,"88":3,"91":1,"92":3,"94":3,"95":1,"96":4,"97":5,"99":4,"100":4,"101":2,"103":2,"106":2,"107":3,"108":1,"109":3,"110":3,"112":8,"114":2,"115":6,"116":20,"117":4,"118":3,"119":5,"120":3,"121":4,"122":5,"123":3,"124":1,"125":4,"126":3,"128":5,"129":4,"130":3,"134":2,"135":2,"137":5,"138":2,"140":3,"141":4,"142":3,"143":3,"144":2,"145":5,"146":4,"147":9,"148":1,"149":4,"150":1,"151":7,"152":7,"153":1,"155":2,"156":3,"157":3,"158":6,"159":8,"160":5,"161":3,"162":11,"163":8,"164":3,"165":2,"166":4,"167":1,"168":1,"169":2,"170":2,"171":4,"172":3,"175":2,"176":4,"177":2,"178":7,"179":7,"180":3,"181":2,"182":1,"183":4,"184":3,"185":3,"186":4,"187":1,"188":3,"189":1,"190":2,"191":9,"192":6,"193":2,"194":4,"195":1,"196":3,"197":2,"198":3,"199":3,"200":8,"201":3,"202":7,"203":6,"205":5,"206":5,"207":2,"208":2,"209":1,"210":4,"211":6,"212":7,"213":3,"214":1,"215":6,"216":2,"217":3,"218":6,"221":3,"222":4,"223":4,"224":1,"225":3,"227":2,"229":2,"230":1,"234":2,"235":10,"236":3,"237":4,"239":4,"240":2,"241":9,"243":1,"245":2,"247":5,"248":5,"249":4,"250":3,"251":1,"252":3,"253":9,"254":8,"255":6,"256":6,"257":2,"259":6,"262":9,"263":5,"264":1,"265":6,"266":4,"267":5,"268":6,"270":3,"271":1,"272":2,"273":1,"274":3,"275":4,"276":2,"278":3,"279":6,"280":4,"281":1,"282":1,"284":1,"285":1,"287":5,"288":4,"290":6,"291":2,"292":1,"293":1,"294":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1,"304":1,"305":2,"307":4,"309":5,"310":4,"313":1,"314":1,"315":4,"316":1,"317":11,"319":8,"320":1,"321":3,"323":2,"324":1,"325":3,"326":3,"328":4,"329":2,"330":1,"334":3,"335":2,"336":5,"337":3,"338":1,"339":3,"340":5,"341":1,"342":1,"343":2,"344":1,"345":4,"346":2,"348":2,"349":1,"350":4,"351":2,"353":4,"354":1,"355":3,"356":3,"357":3,"358":7,"360":1}}],["themselves",{"2":{"153":1}}],["them",{"2":{"1":1,"5":1,"115":1,"184":1,"201":2,"206":1,"257":1,"264":3,"276":1,"277":1}}],["wrote",{"2":{"14":1}}],["writes",{"2":{"270":1}}],["write",{"2":{"4":1,"61":1,"62":3,"178":1,"188":1,"262":1,"264":1,"265":1,"282":1,"290":1,"291":2}}],["way",{"2":{"180":1,"196":1,"280":1,"287":1,"315":1}}],["ways",{"2":{"148":1,"238":1,"276":1}}],["warning",{"2":{"122":1}}],["walks",{"2":{"68":1}}],["want",{"2":{"16":2,"20":1,"30":1,"43":1,"60":1,"62":1,"66":1,"103":1,"144":1,"151":1,"160":1,"163":1,"171":1,"210":1,"211":1,"216":1,"221":1,"222":1,"223":1,"255":1,"256":2,"273":1,"274":2,"276":1,"287":1,"288":1,"290":1,"307":1,"310":1}}],["wanted",{"2":{"14":2}}],["wasn",{"2":{"14":1}}],["was",{"2":{"14":1,"179":1,"192":1,"259":1,"291":1}}],["wait",{"2":{"14":1}}],["worse",{"2":{"14":1}}],["world",{"2":{"13":1,"33":1}}],["works",{"0":{"328":1},"2":{"162":1,"255":1,"317":1,"326":1}}],["workspaces",{"0":{"4":1},"2":{"33":1,"312":1}}],["workspace",{"0":{"64":1,"156":1},"2":{"1":1,"4":2,"8":1,"33":1,"60":1,"64":2,"79":1,"82":1,"135":1,"188":1,"319":2,"321":1,"323":1,"344":2}}],["working",{"2":{"162":1,"198":1,"212":1}}],["workflow",{"0":{"277":1},"2":{"99":1,"219":1,"221":1,"314":1}}],["workflows",{"2":{"3":1,"13":1,"33":1,"221":1,"265":1,"326":1}}],["work",{"2":{"6":1,"8":1,"66":1,"103":1,"253":1,"263":1,"278":1,"281":1}}],["width",{"2":{"126":2}}],["will",{"2":{"20":1,"23":1,"39":1,"48":1,"50":1,"57":1,"69":1,"71":1,"76":1,"82":1,"87":1,"97":1,"112":1,"122":1,"139":1,"145":1,"166":1,"200":1,"202":1,"203":1,"205":1,"239":1,"250":2,"256":1,"267":1,"319":1,"320":1,"336":1,"346":1,"351":1}}],["window",{"0":{"152":1,"227":1},"2":{"5":1,"87":1,"116":1,"145":1,"147":1,"152":1,"225":1,"227":2,"251":1,"262":1}}],["within",{"2":{"18":1,"79":1,"100":1,"155":1,"156":1,"183":1,"266":1}}],["without",{"2":{"4":1,"10":1,"14":2,"138":1,"155":1,"171":1,"185":1,"201":1,"205":1,"233":1,"251":1,"252":1,"255":1,"256":1,"273":2,"276":1,"287":1,"314":1,"317":2,"320":1,"327":1}}],["with",{"0":{"99":1,"106":1,"107":1,"188":1,"255":1},"1":{"256":1,"257":1},"2":{"1":1,"4":2,"6":2,"10":2,"13":2,"14":1,"15":1,"17":1,"18":3,"20":1,"27":1,"32":1,"33":4,"37":1,"40":1,"45":1,"47":1,"48":1,"51":1,"53":2,"61":2,"64":1,"66":1,"69":1,"71":1,"79":1,"83":1,"85":1,"90":1,"91":1,"94":1,"96":2,"103":1,"107":1,"108":2,"109":1,"111":1,"115":1,"126":1,"129":1,"130":1,"131":1,"132":1,"140":1,"145":1,"161":1,"167":1,"172":1,"178":1,"182":1,"184":1,"185":1,"189":1,"202":1,"211":1,"212":1,"219":2,"229":1,"236":2,"241":1,"252":1,"253":1,"262":1,"265":1,"267":1,"268":2,"272":1,"274":1,"277":1,"282":2,"310":1,"312":1,"315":1,"316":1,"317":1,"319":2,"320":2,"324":1,"326":3,"328":2,"334":1,"337":1,"339":2,"341":1,"358":1,"360":1}}],["which",{"2":{"50":1,"71":1,"149":1,"206":1,"210":1,"226":1,"234":1,"262":1,"275":1,"328":1}}],["while",{"2":{"5":1,"14":1,"51":1,"89":1,"90":1,"222":1,"317":1,"322":1}}],["whose",{"2":{"97":1,"228":1}}],["who",{"2":{"50":1,"71":1,"91":1,"160":1,"282":1,"321":1}}],["whole",{"2":{"10":1}}],["why",{"0":{"16":1,"145":1},"2":{"14":1,"291":1,"317":1}}],["whether",{"2":{"149":1,"151":1,"159":1,"179":1,"192":1,"213":1,"235":1,"254":1,"291":1}}],["where",{"0":{"11":1,"266":1},"2":{"6":1,"10":1,"11":1,"13":1,"14":1,"19":2,"60":1,"66":1,"99":1,"103":1,"113":1,"162":1,"214":1,"224":1,"257":1,"263":1,"313":1}}],["when",{"2":{"5":1,"14":2,"17":1,"38":1,"76":1,"87":1,"90":1,"92":1,"94":1,"99":1,"100":1,"103":1,"110":3,"116":1,"119":1,"128":1,"129":1,"147":2,"151":3,"153":2,"160":1,"163":1,"171":1,"172":1,"189":1,"192":1,"202":1,"206":1,"210":1,"211":1,"218":2,"221":1,"223":1,"225":1,"227":1,"228":1,"234":1,"235":2,"241":1,"250":1,"252":1,"253":5,"254":2,"256":1,"259":1,"263":1,"265":1,"273":1,"274":1,"279":1,"288":1,"290":1,"291":1,"305":1,"307":1,"317":1,"319":1,"321":1,"344":1,"353":1}}],["what",{"0":{"1":1,"2":1,"15":1,"103":1,"146":1,"265":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"6":1,"11":1,"13":2,"14":1,"117":1,"214":1,"235":1,"254":1,"263":1,"288":1,"317":1}}],["week",{"2":{"236":1}}],["weixin",{"2":{"34":1}}],["weighted",{"2":{"317":1}}],["weights",{"2":{"317":2,"328":1}}],["weight",{"2":{"14":1}}],["wework",{"0":{"79":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1},"2":{"33":1,"135":1}}],["were",{"2":{"14":1,"151":1,"172":1,"275":1}}],["we",{"2":{"13":2,"14":2,"17":1,"19":2,"20":2}}],["webm",{"2":{"354":1}}],["webp",{"2":{"187":1}}],["websites",{"2":{"124":1,"129":1}}],["websocket",{"2":{"35":1,"81":2,"82":1}}],["webhook",{"0":{"57":1,"139":1,"141":1},"2":{"7":1,"24":1,"33":1,"34":1,"35":1,"57":2,"73":1,"74":1,"75":1,"76":1,"135":3,"139":2,"141":1,"142":1}}],["web",{"0":{"257":1},"2":{"1":1,"6":1,"7":1,"8":2,"10":1,"24":1,"31":1,"33":1,"38":1,"41":1,"44":1,"49":1,"50":1,"65":1,"70":1,"71":1,"75":1,"81":1,"86":1,"114":1,"116":2,"152":1,"160":1,"185":1,"216":1,"227":1,"241":1,"243":1,"245":1,"254":1,"255":2,"257":1,"259":1,"278":1,"287":2,"309":1,"310":1,"312":1,"315":1,"316":3,"322":1,"323":2}}],["wechatoa",{"2":{"34":1}}],["wechat",{"0":{"34":2,"73":1,"76":1,"85":1,"86":1,"140":1,"141":1},"1":{"74":1,"75":1,"76":1,"77":1,"78":1,"86":1,"87":1,"88":1,"89":1,"90":1},"2":{"1":2,"7":4,"33":2,"34":4,"73":2,"74":2,"75":1,"76":3,"85":2,"86":1,"87":2,"88":1,"114":1,"135":7,"140":2,"141":3,"312":2}}],["wecom",{"0":{"79":1,"80":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1},"2":{"1":1,"7":1,"33":2,"79":2,"80":1,"81":2,"82":2,"84":2,"114":1,"135":2,"312":1}}],["icon",{"2":{"259":1}}],["ignored",{"2":{"275":1}}],["ignore",{"2":{"126":1}}],["irreversible",{"2":{"122":1}}],["io",{"2":{"43":1}}],["idf",{"2":{"317":1}}],["ideas",{"2":{"279":1}}],["identity",{"0":{"50":1,"71":1},"2":{"44":1,"50":2,"71":3,"95":2,"100":2,"106":1,"109":1,"110":1,"267":1,"285":1,"291":2,"305":1}}],["identities",{"2":{"3":1,"91":1,"107":1}}],["identifier",{"2":{"37":1,"81":1,"159":1,"184":1,"225":1}}],["ids",{"2":{"35":1}}],["id",{"2":{"34":1,"37":2,"38":2,"39":1,"54":1,"57":1,"74":1,"75":1,"80":1,"81":1,"100":4,"102":4,"120":1,"126":1,"159":1,"201":1,"209":1,"223":1,"225":1,"240":1,"296":2,"297":2,"344":4,"354":1}}],["if",{"2":{"14":1,"20":1,"32":1,"39":1,"56":1,"62":1,"66":2,"74":2,"75":1,"81":1,"87":1,"97":1,"103":1,"112":1,"115":1,"116":1,"120":1,"131":1,"139":1,"140":1,"141":1,"142":1,"144":1,"158":1,"159":1,"161":2,"162":1,"163":1,"178":3,"214":2,"216":1,"217":1,"222":1,"223":1,"226":1,"227":1,"241":1,"255":1,"267":1,"268":1,"276":1,"277":1,"281":1,"287":1,"290":1,"310":1,"317":1,"320":1,"324":1,"336":1}}],["i",{"2":{"14":7}}],["italic",{"2":{"51":1,"72":1}}],["iterate",{"2":{"19":1}}],["it",{"0":{"145":1,"146":1},"2":{"10":1,"14":9,"19":2,"20":1,"23":1,"25":1,"27":1,"28":2,"30":2,"36":1,"42":1,"47":1,"48":2,"50":1,"59":1,"61":1,"64":1,"66":2,"73":1,"76":1,"79":1,"85":1,"87":1,"120":1,"126":1,"132":1,"133":1,"139":1,"146":2,"156":1,"158":1,"159":1,"160":1,"164":1,"167":1,"180":2,"186":1,"189":2,"194":1,"206":1,"210":1,"214":2,"219":1,"223":1,"226":1,"227":1,"234":2,"235":1,"236":2,"243":1,"244":1,"253":1,"254":1,"260":1,"262":1,"265":2,"270":1,"273":1,"274":2,"276":3,"280":1,"281":1,"287":1,"310":1,"317":4,"320":1,"326":1,"328":1,"330":1,"344":1,"347":1,"349":1,"352":1}}],["itself",{"2":{"146":1,"188":1,"210":1,"215":1,"239":1,"278":1}}],["its",{"2":{"1":3,"4":1,"18":1,"98":1,"111":1,"113":2,"115":1,"116":1,"117":1,"122":1,"126":1,"127":1,"138":1,"155":1,"163":1,"178":1,"180":1,"181":2,"184":1,"188":2,"190":1,"194":2,"196":1,"202":1,"203":1,"215":1,"227":1,"234":1,"241":1,"248":1,"250":1,"251":1,"252":1,"261":1,"263":1,"270":1,"273":1,"313":1,"330":1,"331":1,"336":1,"338":1,"339":1,"342":1,"344":1,"346":1,"349":1,"351":1,"354":1}}],["im",{"2":{"56":2,"57":1,"62":2,"63":1}}],["improve",{"2":{"210":1}}],["importance",{"2":{"317":1,"328":1}}],["important",{"0":{"163":1},"2":{"5":1,"37":1,"48":1,"115":1,"145":1,"224":1,"225":1,"227":1,"267":1,"320":1}}],["imported",{"0":{"276":1},"2":{"266":1,"276":1,"353":1,"358":1}}],["importing",{"0":{"223":1},"2":{"168":1}}],["import",{"0":{"168":1,"170":1},"1":{"169":1,"170":1,"171":1},"2":{"114":1,"170":1,"201":2,"223":2,"314":1}}],["impact",{"2":{"20":1}}],["immediately",{"2":{"143":1,"148":1}}],["immediate",{"0":{"148":1},"1":{"149":1,"150":1},"2":{"10":1,"33":1,"262":1,"285":1,"307":1}}],["images",{"0":{"187":1},"2":{"32":1,"51":1,"62":1,"66":1,"67":1,"72":1,"90":1,"226":2,"266":1,"322":1,"324":1}}],["image",{"0":{"228":1},"2":{"9":3,"114":1,"116":5,"130":1,"158":2,"159":2,"163":1,"187":1,"224":1,"225":1,"226":1,"228":3,"231":2,"232":1,"317":1,"319":3,"323":1,"325":4}}],["injected",{"2":{"265":1}}],["initiated",{"2":{"253":1}}],["initialize",{"2":{"158":1,"322":1}}],["initial",{"2":{"115":1,"119":1}}],["inquiries",{"2":{"180":1}}],["inbox",{"2":{"178":1}}],["inbound",{"2":{"22":1,"42":1,"43":1,"57":1,"63":1,"73":1,"135":1,"139":1,"142":1}}],["inherits",{"2":{"112":1,"116":1}}],["incremented",{"2":{"241":1}}],["increases",{"2":{"145":1}}],["inconsistent",{"2":{"211":1}}],["incoming",{"2":{"66":1,"94":1,"95":1,"178":1,"180":1}}],["including",{"2":{"8":1,"9":1,"122":1,"237":1}}],["included",{"2":{"339":1}}],["includes",{"2":{"10":1,"117":1,"120":1,"172":1,"206":1,"315":1}}],["include",{"2":{"7":1,"124":1,"130":1,"151":1,"203":1,"217":1,"228":1,"262":1,"325":1}}],["input",{"2":{"49":1,"147":1,"198":1,"226":1,"262":1}}],["invocation",{"2":{"263":1}}],["invoked",{"2":{"128":1}}],["involves",{"2":{"174":1}}],["involved",{"2":{"110":1,"151":1}}],["involve",{"2":{"35":1}}],["invalid",{"2":{"126":1}}],["invited",{"2":{"38":1}}],["invites",{"2":{"38":1,"39":1}}],["invite",{"0":{"30":1,"39":1},"2":{"39":1,"66":2}}],["inferred",{"2":{"256":1}}],["inference",{"2":{"17":1,"19":1,"20":1}}],["influences",{"2":{"116":1}}],["inflate",{"2":{"14":1}}],["info",{"2":{"54":1,"112":1,"323":1}}],["information",{"0":{"159":1},"2":{"14":1,"56":1,"60":1,"61":1,"129":1,"154":1,"172":1,"204":1,"213":1,"217":1,"243":1,"250":1,"262":1}}],["infrastructure",{"0":{"332":1},"1":{"333":1,"334":1,"335":1},"2":{"14":1,"16":1,"19":1,"20":1,"326":1,"333":1,"342":1}}],["into",{"2":{"13":1,"14":1,"35":1,"57":1,"70":1,"76":1,"139":1,"141":1,"146":1,"169":1,"170":1,"184":1,"208":1,"223":1,"239":1,"252":1,"253":1,"265":1,"266":1,"268":1,"270":1,"274":1,"275":1,"276":1,"280":1,"317":1,"328":1,"357":1}}],["introduction",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"21":1}}],["integrated",{"2":{"182":1,"185":1}}],["integrating",{"2":{"53":1}}],["integration",{"2":{"7":2,"32":1,"33":7,"34":2,"73":1,"135":3}}],["integrations",{"2":{"1":1,"7":1,"312":1}}],["intended",{"2":{"73":1,"78":1,"103":1,"278":1}}],["intentionally",{"2":{"116":1,"259":1}}],["intent",{"2":{"29":3}}],["intents",{"2":{"29":1}}],["intelligence",{"2":{"14":1}}],["interrupt",{"2":{"288":1}}],["intercepted",{"2":{"278":1}}],["internal",{"2":{"254":1,"266":1}}],["internet",{"2":{"14":1}}],["intervention",{"2":{"233":1}}],["intervene",{"2":{"188":1}}],["interval",{"2":{"117":1,"190":1,"191":1,"242":1,"296":2}}],["interference",{"2":{"251":1}}],["interfering",{"2":{"4":1}}],["interface",{"2":{"18":1,"33":1,"160":1,"193":1}}],["interactive",{"2":{"114":1,"121":1}}],["interactions",{"2":{"42":1,"204":1}}],["interaction",{"0":{"129":1,"180":1,"188":1,"194":1,"203":1,"215":1,"250":1},"2":{"9":1}}],["interact",{"2":{"1":1,"3":1,"27":1,"33":1,"45":1,"47":1,"53":1,"79":1,"85":1,"91":1,"129":1,"132":1,"185":1}}],["inspect",{"2":{"110":2,"123":1,"129":1,"154":1,"285":4}}],["inspection",{"0":{"289":1},"1":{"290":1,"291":1,"292":1,"293":1,"294":1},"2":{"10":1,"275":1,"278":1}}],["instruction",{"2":{"235":1,"242":1,"265":1}}],["instead",{"2":{"115":1,"129":1,"154":1,"221":1,"277":1,"279":1,"281":1,"342":1}}],["install",{"0":{"64":1,"309":1,"310":1,"319":1,"320":1},"1":{"321":1},"2":{"60":1,"64":1,"130":1,"156":1,"264":1,"266":1,"276":1,"277":1,"309":2,"310":1,"314":1,"315":1,"319":3,"321":1,"325":1}}],["installation",{"0":{"315":1},"1":{"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1},"2":{"8":1,"11":1,"66":1,"313":1}}],["instance",{"2":{"43":3,"44":1,"45":1,"158":1,"159":1,"340":1}}],["instances",{"2":{"42":1,"357":1}}],["instinct",{"2":{"14":1}}],["inside",{"2":{"4":1,"8":1,"121":1,"163":1,"181":1,"198":1,"266":2,"280":1,"285":1,"315":1,"317":1}}],["indices",{"2":{"317":1,"328":1}}],["indicator",{"2":{"212":1}}],["indicators",{"2":{"49":1,"51":1,"89":1,"90":1}}],["individual",{"2":{"3":1,"40":1,"83":1,"90":1,"95":1}}],["indexed",{"2":{"330":1}}],["indexes",{"2":{"211":1}}],["indexing",{"2":{"17":1,"19":1,"206":1,"229":1,"333":1,"342":1}}],["index",{"2":{"17":1,"211":1,"213":2,"327":1}}],["independently",{"2":{"252":1}}],["independent",{"2":{"6":1,"111":1,"196":1,"251":1,"253":1,"263":1}}],["in",{"0":{"75":1,"86":1,"256":1,"257":1,"269":1,"280":1,"326":1,"329":1,"330":1},"1":{"270":1,"271":1,"272":1,"273":1,"274":1,"327":1,"328":1,"329":1,"330":1,"331":2,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1},"2":{"1":2,"3":2,"4":1,"8":1,"14":1,"16":1,"18":3,"19":1,"20":1,"24":2,"25":1,"26":1,"28":1,"30":1,"31":1,"33":1,"35":1,"36":1,"38":3,"40":1,"43":1,"44":1,"45":1,"48":1,"49":1,"50":2,"53":1,"54":2,"55":1,"57":3,"58":2,"59":1,"61":2,"62":5,"63":1,"64":1,"65":2,"66":1,"68":1,"69":1,"70":1,"71":1,"73":1,"75":2,"77":1,"80":1,"81":2,"82":2,"83":2,"86":1,"88":1,"97":1,"102":2,"103":4,"112":2,"115":2,"116":1,"117":1,"120":1,"122":1,"124":1,"125":2,"126":3,"129":1,"131":1,"134":1,"137":1,"139":1,"144":1,"146":1,"147":1,"148":1,"151":1,"152":1,"155":1,"157":1,"159":1,"160":2,"161":1,"162":3,"165":1,"166":1,"175":1,"176":1,"177":1,"180":2,"181":1,"186":2,"187":1,"188":1,"191":2,"196":2,"197":1,"201":1,"203":1,"205":2,"206":1,"207":1,"208":1,"209":1,"210":1,"211":2,"215":1,"218":1,"225":1,"227":1,"230":1,"231":1,"236":1,"238":1,"239":1,"245":1,"247":1,"248":2,"253":1,"254":6,"255":1,"259":1,"262":1,"263":2,"265":1,"266":1,"268":1,"270":2,"271":1,"274":1,"275":1,"276":1,"278":3,"281":1,"282":1,"287":2,"288":1,"290":1,"307":1,"308":1,"309":2,"310":2,"315":1,"316":1,"317":3,"320":1,"321":2,"322":1,"324":1,"325":2,"326":3,"328":1,"329":1,"330":1,"334":1,"335":2,"336":1,"338":1,"339":1,"340":1,"341":1,"343":1,"348":1,"356":1,"357":2,"358":1}}],["issues",{"2":{"212":1,"254":1}}],["issue",{"2":{"192":1,"212":1}}],["isolation",{"0":{"252":1},"2":{"155":1}}],["isolated",{"0":{"156":1},"2":{"1":1,"4":1,"17":1,"18":1,"19":1,"111":1,"155":1,"181":1,"312":1}}],["is",{"0":{"1":1},"2":{"1":1,"3":1,"5":1,"9":1,"10":1,"13":1,"14":3,"15":1,"17":2,"18":2,"20":2,"23":1,"25":1,"34":2,"39":1,"42":1,"43":1,"45":2,"48":1,"58":1,"66":2,"68":1,"71":1,"73":3,"76":1,"78":1,"82":1,"85":1,"87":1,"88":1,"92":5,"97":2,"99":1,"102":1,"103":6,"105":1,"110":4,"111":1,"115":1,"116":1,"117":1,"118":1,"122":1,"123":1,"124":1,"126":1,"129":1,"135":2,"140":1,"144":1,"146":1,"147":1,"149":1,"151":2,"158":1,"160":3,"163":1,"164":1,"165":1,"169":1,"171":1,"188":1,"190":2,"191":1,"200":1,"202":1,"203":1,"206":2,"210":3,"211":1,"212":3,"213":1,"219":1,"221":1,"222":2,"224":1,"227":2,"229":1,"233":1,"234":1,"235":1,"236":1,"241":3,"244":1,"251":1,"253":1,"254":5,"255":1,"256":2,"262":1,"263":1,"265":2,"267":3,"268":1,"271":1,"274":1,"276":1,"279":4,"280":1,"287":2,"288":3,"291":2,"305":2,"307":1,"308":1,"312":1,"315":1,"317":1,"320":2,"323":1,"324":1,"326":1,"336":1,"337":1,"341":1,"342":1,"347":1,"352":1,"353":2,"357":1,"358":1}}],["cp",{"2":{"320":1}}],["cd",{"2":{"320":1}}],["cdi",{"0":{"160":1,"161":1},"1":{"161":1,"162":1,"163":1},"2":{"159":2,"160":2,"161":3,"162":11,"163":3}}],["c",{"2":{"303":1}}],["cwd",{"2":{"198":1}}],["ctk",{"2":{"162":2}}],["certificates",{"2":{"126":1}}],["ceiling",{"2":{"16":1}}],["cni",{"2":{"323":1}}],["cn",{"2":{"126":1,"319":2,"321":3,"325":1}}],["cuda",{"2":{"163":1}}],["custom",{"2":{"54":1,"57":1,"80":1,"81":1,"120":1,"126":1,"199":1,"242":1}}],["curl",{"2":{"319":1}}],["curated",{"2":{"8":1,"196":1}}],["currently",{"2":{"6":1,"33":1,"63":1,"159":2,"214":1,"219":1,"235":1,"259":1,"267":1,"279":1,"290":1,"304":1,"360":1}}],["current",{"2":{"5":1,"7":1,"26":1,"46":1,"62":1,"78":1,"110":1,"129":1,"148":1,"149":1,"150":1,"152":1,"164":1,"172":1,"183":1,"200":1,"212":1,"230":1,"235":1,"241":1,"255":2,"262":2,"275":1,"279":3,"280":1,"284":1,"287":2,"288":3,"290":3,"291":1,"294":1,"297":3,"298":2,"299":2,"300":2,"307":2}}],["c2c",{"2":{"51":1}}],["claude",{"2":{"225":1}}],["class",{"2":{"14":1}}],["clash",{"2":{"14":1}}],["clear",{"2":{"193":1,"265":1,"277":1}}],["cleaning",{"2":{"190":1}}],["clean",{"2":{"171":1,"193":1,"256":1}}],["cleaner",{"2":{"14":1}}],["clone",{"2":{"319":1,"320":1}}],["close",{"2":{"147":1}}],["closer",{"2":{"101":1,"152":1}}],["closed",{"2":{"14":1}}],["cloud",{"2":{"15":1,"16":1,"17":1,"19":1,"20":1,"342":1}}],["clicking",{"2":{"113":1,"124":1,"257":1}}],["click",{"0":{"319":1},"2":{"24":2,"28":2,"31":2,"38":2,"44":2,"48":1,"49":2,"50":1,"54":2,"55":1,"56":1,"57":1,"58":1,"64":1,"65":2,"70":2,"71":1,"75":1,"81":2,"86":1,"87":2,"100":2,"101":1,"112":2,"122":1,"123":1,"125":2,"128":1,"129":1,"137":1,"149":1,"161":1,"165":1,"166":1,"169":1,"170":1,"176":2,"178":2,"184":1,"186":2,"187":1,"200":2,"201":1,"202":1,"205":1,"211":1,"218":1,"223":1,"237":1,"247":1,"249":1,"257":1,"260":1,"270":1,"309":1,"310":1,"329":2,"336":1,"343":2,"345":1,"348":2,"350":1,"353":2,"354":1,"355":1,"358":3}}],["clicks",{"2":{"14":1}}],["client",{"0":{"219":1},"2":{"9":1,"37":4,"39":1,"41":1,"217":1,"218":3,"219":2,"221":1,"222":1,"313":1}}],["circling",{"2":{"13":1}}],["china",{"0":{"321":1},"2":{"319":1,"321":2,"325":1}}],["chromium",{"2":{"126":1,"130":3,"325":1}}],["checking",{"2":{"233":1,"278":1}}],["checks",{"2":{"114":1,"190":1}}],["checked",{"2":{"97":1}}],["check",{"2":{"40":1,"66":2,"178":1,"200":1,"242":1,"263":1,"319":1}}],["cheaply",{"2":{"152":1}}],["cheap",{"2":{"16":1}}],["choices",{"2":{"14":1}}],["choose",{"2":{"11":1,"23":1,"24":1,"34":1,"35":1,"43":1,"44":1,"57":1,"60":1,"69":2,"75":2,"100":1,"105":1,"106":1,"107":1,"176":1,"199":1,"201":1,"223":1,"309":1,"310":1}}],["changing",{"2":{"314":1}}],["changed",{"2":{"211":1}}],["change",{"2":{"101":1,"137":1,"146":1,"161":1,"163":1,"236":1,"256":1,"320":1,"322":1}}],["changes",{"0":{"146":1},"2":{"5":1,"29":1,"146":1,"164":1,"172":1,"183":1,"186":1,"214":1}}],["chance",{"2":{"145":1}}],["channels",{"0":{"33":1,"132":1,"134":1,"256":1},"1":{"34":1,"35":1,"133":1,"134":1,"135":2,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1},"2":{"3":1,"10":2,"11":1,"33":3,"59":1,"62":5,"63":1,"66":2,"67":3,"108":1,"110":1,"111":1,"114":1,"132":1,"133":1,"255":1,"263":1,"314":1}}],["channel",{"0":{"7":1,"22":1,"27":1,"36":1,"42":1,"47":1,"53":1,"59":1,"68":1,"73":1,"75":1,"79":1,"85":1,"86":1,"109":1,"137":1,"174":1},"1":{"23":1,"24":1,"25":1,"26":1,"28":1,"29":1,"30":1,"31":1,"32":1,"37":1,"38":1,"39":1,"40":1,"41":1,"43":1,"44":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"69":1,"70":1,"71":1,"72":1,"74":1,"75":1,"76":1,"77":1,"78":1,"80":1,"81":1,"82":1,"83":1,"84":1,"86":1,"87":1,"88":1,"89":1,"90":1},"2":{"1":1,"7":1,"18":1,"24":1,"25":1,"31":1,"35":3,"38":1,"44":1,"45":1,"49":1,"50":1,"51":1,"57":1,"65":1,"66":2,"70":1,"71":1,"75":3,"77":1,"78":1,"81":1,"82":1,"86":1,"88":1,"91":2,"95":4,"100":6,"102":2,"106":1,"107":1,"108":1,"109":4,"114":1,"137":2,"138":1,"140":1,"141":2,"142":1,"143":3,"173":1,"234":1,"235":1,"241":1,"255":3,"278":1,"287":3,"291":2,"312":1,"314":1}}],["chatbot",{"2":{"254":1}}],["chatbox",{"2":{"19":1}}],["chatgpt",{"2":{"219":1,"221":1}}],["chatting",{"0":{"45":1,"82":1,"88":1},"2":{"96":1,"189":1,"253":1}}],["chats",{"2":{"3":1,"22":2,"26":2,"53":1,"78":2,"82":1,"83":1,"103":1,"112":1,"281":1}}],["chat",{"0":{"105":1,"225":1,"254":1},"1":{"226":1,"227":1,"228":1},"2":{"1":1,"6":1,"9":3,"11":2,"18":2,"25":1,"32":1,"33":3,"56":2,"62":1,"71":1,"92":2,"94":2,"96":1,"100":1,"102":1,"107":1,"108":1,"109":1,"111":1,"114":1,"115":1,"116":7,"117":1,"120":1,"132":1,"133":1,"135":1,"150":1,"152":2,"153":1,"180":1,"191":1,"215":1,"216":1,"219":3,"222":1,"224":2,"225":1,"228":2,"230":2,"231":1,"232":1,"252":1,"253":2,"254":2,"255":5,"256":1,"257":2,"259":2,"278":1,"281":1,"282":1,"284":1,"287":6,"291":1,"296":2,"297":1,"313":1,"326":1}}],["caching",{"2":{"262":1}}],["cache",{"2":{"6":1,"149":1,"262":4,"285":1,"290":2}}],["came",{"2":{"262":1,"274":1}}],["calculate",{"2":{"227":1}}],["called",{"2":{"239":1}}],["call",{"2":{"225":1,"226":2,"250":1}}],["callback",{"2":{"24":1,"35":1,"57":1,"75":1,"76":3,"139":1,"141":2,"142":1}}],["calls",{"2":{"17":1,"146":1,"214":1,"235":2,"240":1,"241":2,"242":1}}],["catalog",{"2":{"223":1,"308":1,"314":1}}],["category",{"2":{"14":1}}],["capturing",{"2":{"124":1}}],["captured",{"2":{"166":1}}],["capture",{"2":{"123":1,"164":1}}],["capable",{"2":{"116":1}}],["capability",{"0":{"55":1},"2":{"13":1,"15":1,"17":1,"23":1,"160":2,"245":1}}],["capabilities",{"0":{"196":1},"2":{"8":1,"55":1,"56":1,"114":1,"116":1,"177":1,"231":1,"326":1}}],["carried",{"2":{"146":1}}],["carry",{"2":{"14":1}}],["card",{"2":{"113":1,"271":1}}],["caught",{"2":{"14":1}}],["cases",{"2":{"124":1}}],["case",{"0":{"12":1,"139":1,"140":1,"141":1,"142":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"242":1,"327":1}}],["cannot",{"2":{"66":1,"227":1,"321":1}}],["can",{"0":{"105":1},"2":{"1":1,"3":1,"4":1,"6":2,"7":1,"8":1,"10":1,"11":1,"13":1,"14":5,"18":3,"19":2,"25":1,"33":1,"36":1,"37":2,"40":1,"42":2,"45":1,"48":1,"66":1,"72":1,"77":1,"82":1,"88":1,"91":2,"92":3,"94":2,"95":1,"101":1,"106":1,"107":1,"108":1,"109":1,"111":1,"113":1,"116":2,"117":2,"118":1,"123":2,"128":1,"129":1,"130":1,"133":1,"147":1,"148":1,"152":2,"156":1,"160":1,"161":1,"178":6,"180":1,"181":1,"188":1,"191":1,"194":1,"196":2,"200":1,"202":2,"210":1,"211":1,"223":3,"226":4,"227":1,"234":1,"236":1,"239":1,"240":1,"241":1,"244":1,"250":1,"254":1,"257":1,"263":1,"264":1,"266":1,"267":1,"268":1,"272":1,"274":1,"275":1,"282":1,"319":1,"337":1,"338":1,"347":1,"355":1,"357":2,"358":1}}],["crowd",{"2":{"145":1}}],["cross",{"2":{"50":1,"71":1}}],["cron",{"0":{"234":1,"236":1},"2":{"6":1,"18":1,"114":1,"233":1,"234":1,"235":1,"236":1,"237":1,"239":1,"241":1,"242":1,"253":1,"263":1}}],["credential",{"2":{"81":1}}],["credentials",{"0":{"74":1},"2":{"23":1,"35":1,"44":1,"54":1,"70":1,"80":1,"87":1,"137":1,"138":1,"217":1,"218":1,"247":1,"319":1,"323":1}}],["creating",{"0":{"112":1,"125":1,"165":1,"176":1,"208":1,"218":1,"238":1,"329":1,"343":1,"348":1,"353":1},"1":{"239":1,"240":1},"2":{"99":1,"115":1,"126":1,"159":1,"223":1,"278":1,"330":1,"344":1,"349":1}}],["creation",{"2":{"43":1,"92":1,"119":1,"120":1,"158":1,"163":1,"167":1,"326":1}}],["creates",{"2":{"255":1,"287":1}}],["created",{"2":{"113":1,"115":1,"128":1,"163":1,"178":1,"183":1,"238":1,"249":1,"253":4,"263":2,"268":1,"336":1,"345":1,"350":1,"353":1}}],["create",{"0":{"23":1,"28":1,"37":1,"48":1,"54":1,"60":1,"69":1,"80":1},"2":{"1":1,"3":1,"11":1,"18":1,"23":1,"35":1,"43":1,"48":2,"54":2,"58":1,"60":1,"61":1,"69":1,"80":1,"92":1,"102":1,"112":2,"114":2,"125":1,"141":1,"158":1,"161":1,"165":1,"176":1,"178":1,"183":1,"205":1,"239":2,"240":1,"255":2,"256":1,"257":1,"266":1,"268":1,"279":2,"281":1,"282":1,"303":3,"312":1,"313":1,"320":1,"329":1,"337":1,"340":1,"343":1,"348":1,"353":1,"357":1,"358":1}}],["cohere",{"2":{"317":1}}],["collection",{"2":{"190":1,"330":2}}],["collaborate",{"2":{"18":1}}],["corresponding",{"2":{"263":1}}],["corrupted",{"2":{"171":1}}],["cores=chromium",{"2":{"130":1}}],["cores",{"2":{"130":4,"319":1,"325":1}}],["core",{"0":{"115":1,"130":1},"2":{"19":1,"114":1,"126":1,"130":1,"296":1,"316":3,"319":1,"320":1}}],["counter",{"2":{"241":1}}],["counts",{"2":{"237":1,"262":1}}],["count",{"2":{"151":1,"262":1,"290":1}}],["could",{"2":{"14":1}}],["covers",{"2":{"73":1}}],["coverage",{"0":{"7":1}}],["copies",{"2":{"274":1}}],["copilot",{"0":{"222":1},"2":{"9":1,"217":1,"218":1,"219":2,"220":1,"222":3}}],["copying",{"2":{"35":1}}],["copy",{"2":{"23":1,"28":1,"30":1,"48":1,"50":1,"54":1,"57":1,"61":1,"64":1,"71":1,"76":1,"139":1,"141":1,"268":1,"277":1}}],["coder",{"2":{"265":3,"266":1,"267":1}}],["code",{"0":{"87":1},"2":{"50":2,"51":1,"71":3,"72":1,"85":1,"87":3,"140":2,"155":1,"222":1,"265":1}}],["codex",{"0":{"221":1},"2":{"9":1,"217":1,"219":2,"220":1,"221":2}}],["coding",{"2":{"18":1,"219":1,"221":1,"265":1}}],["costs",{"2":{"317":1,"327":1}}],["cost",{"2":{"14":1,"328":1}}],["combined",{"2":{"319":1}}],["com",{"2":{"161":4,"221":1,"320":1}}],["comes",{"2":{"100":1,"111":1,"116":1}}],["come",{"0":{"266":1},"2":{"64":1,"116":1}}],["commas",{"2":{"161":1}}],["command",{"0":{"279":1,"306":1},"1":{"307":1},"2":{"8":1,"10":1,"69":1,"110":1,"152":1,"198":3,"234":1,"235":1,"240":1,"241":2,"242":1,"253":1,"255":1,"265":1,"278":1,"279":1,"280":3,"281":2,"284":2,"291":3,"303":2,"313":1}}],["commands",{"0":{"150":1,"278":1,"284":1,"286":1,"289":1,"295":1,"302":1,"324":1},"1":{"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":2,"288":2,"289":1,"290":2,"291":2,"292":2,"293":2,"294":2,"295":1,"296":2,"297":2,"298":2,"299":2,"300":2,"301":2,"302":1,"303":2,"304":2,"305":2,"306":1,"307":1},"2":{"4":1,"6":1,"11":1,"18":2,"19":1,"30":1,"32":2,"121":1,"154":1,"155":1,"263":1,"278":2,"279":2,"281":2,"291":1,"313":1}}],["commonly",{"2":{"160":1}}],["common",{"0":{"138":1,"324":1},"2":{"92":1,"161":1,"186":1,"218":1,"236":1,"276":1}}],["communities",{"2":{"135":1}}],["community",{"2":{"27":1,"33":1}}],["communication",{"0":{"133":1},"2":{"116":1,"173":1}}],["communicates",{"2":{"198":1}}],["communicate",{"2":{"36":1}}],["comprehensive",{"2":{"245":1,"250":1}}],["compresses",{"2":{"210":1}}],["compression",{"2":{"210":1}}],["component",{"2":{"182":1}}],["compose",{"2":{"130":1,"178":1,"315":1,"316":1,"317":1,"318":1,"319":2,"320":3,"321":4,"324":6,"334":2,"335":1}}],["complement",{"2":{"242":1}}],["complex",{"2":{"111":1,"164":1}}],["complete",{"2":{"265":1}}],["completes",{"2":{"222":1}}],["completed",{"2":{"151":1,"192":1}}],["completely",{"2":{"62":1}}],["completions",{"2":{"9":1,"219":2}}],["compacted",{"2":{"151":1}}],["compact",{"0":{"307":1},"2":{"114":1,"147":1,"149":1,"150":2,"153":1,"210":1,"214":1,"262":2,"285":1,"307":2,"317":1,"328":1,"337":1}}],["compaction",{"0":{"118":1,"144":1,"147":1,"148":1,"153":2,"210":1,"306":1},"1":{"145":1,"146":1,"147":1,"148":1,"149":2,"150":2,"151":1,"152":1,"153":1,"154":1,"307":1},"2":{"5":3,"10":2,"114":2,"115":2,"116":1,"118":11,"144":1,"145":1,"146":1,"147":8,"148":1,"149":1,"150":1,"151":4,"152":2,"153":4,"154":1,"206":2,"210":3,"214":5,"227":1,"262":1,"285":1,"307":5,"314":2,"326":1}}],["compatibilities",{"0":{"226":1},"2":{"225":1,"228":1}}],["compatibility",{"2":{"116":1,"226":2,"266":3,"274":1,"276":1}}],["compatible",{"2":{"9":2,"217":1,"219":1}}],["compat",{"2":{"75":1}}],["compare",{"0":{"19":1}}],["computer",{"2":{"1":1,"18":1,"156":1,"184":1}}],["convert",{"2":{"328":1}}],["converts",{"2":{"317":1}}],["converse",{"2":{"180":1}}],["conversational",{"0":{"239":1},"2":{"145":1,"287":1}}],["conversation",{"0":{"252":1},"2":{"5":1,"15":1,"18":1,"62":1,"100":4,"102":3,"116":1,"119":1,"144":1,"145":1,"149":1,"153":1,"206":1,"208":2,"214":2,"224":1,"244":1,"251":1,"252":1,"253":3,"254":4,"255":1,"256":1,"259":1,"279":2,"287":1,"288":1,"290":2,"291":1,"307":1}}],["conversations",{"0":{"66":1},"2":{"3":1,"5":1,"6":1,"33":1,"36":1,"40":1,"45":1,"66":1,"78":1,"83":2,"90":1,"92":2,"102":1,"103":1,"202":1,"204":1,"214":1,"231":1,"251":1,"253":1,"254":1,"255":2,"260":1,"263":1,"287":1,"326":1,"337":1,"357":1}}],["convenience",{"2":{"281":1}}],["conf",{"2":{"320":1}}],["confusing",{"2":{"110":1}}],["confirmed",{"2":{"87":1}}],["confirm",{"2":{"25":1,"77":1,"87":1,"99":1,"122":1,"309":1}}],["confidence",{"2":{"19":1}}],["config",{"2":{"10":1,"100":1,"109":1,"201":1,"236":1,"319":1,"320":3,"321":1,"322":1,"323":2,"325":3,"334":1,"335":1}}],["configurable",{"2":{"111":1,"357":1}}],["configurations",{"2":{"114":1,"172":1,"201":1}}],["configuration",{"0":{"22":1,"27":1,"36":1,"42":1,"47":1,"53":1,"59":1,"68":1,"73":1,"79":1,"85":1,"136":1,"191":1,"225":1,"246":1,"295":1,"323":1},"1":{"23":1,"24":1,"25":1,"26":1,"28":1,"29":1,"30":1,"31":1,"32":1,"37":1,"38":1,"39":1,"40":1,"41":1,"43":1,"44":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"69":1,"70":1,"71":1,"72":1,"74":1,"75":1,"76":1,"77":1,"78":1,"80":1,"81":1,"82":1,"83":1,"84":1,"86":1,"87":1,"88":1,"89":1,"90":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"226":1,"227":1,"228":1,"247":1,"248":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"1":1,"10":1,"35":1,"76":1,"114":1,"124":1,"127":1,"135":11,"137":1,"138":1,"139":1,"141":1,"143":2,"164":1,"186":1,"200":1,"201":1,"205":1,"212":1,"248":1,"274":1,"294":1,"319":1,"325":1,"336":1,"356":1}}],["configuring",{"0":{"115":1,"126":1,"330":1,"344":1,"349":1,"354":1},"1":{"127":1,"331":1},"2":{"33":1,"115":1,"162":1}}],["configure",{"0":{"24":1,"29":1,"31":1,"38":1,"44":1,"49":1,"56":1,"57":1,"62":1,"65":1,"70":1,"76":1,"81":1,"161":1},"2":{"11":2,"18":1,"35":1,"49":1,"94":1,"98":1,"133":1,"134":1,"138":1,"142":1,"147":1,"174":1,"177":1,"191":1,"196":1,"197":1,"216":1,"219":1,"232":1,"245":1,"313":1,"314":1,"330":1,"340":1,"344":1,"349":1,"354":1,"358":1}}],["configured",{"2":{"9":1,"32":1,"33":1,"117":1,"129":1,"131":1,"141":1,"146":1,"147":1,"158":1,"160":1,"162":1,"205":1,"215":1,"236":1,"244":1,"301":1,"335":1,"355":1}}],["connected",{"2":{"212":1,"234":1,"241":1}}],["connects",{"2":{"66":1,"199":1,"342":1}}],["connect",{"2":{"33":2,"42":1,"82":1,"132":1,"195":1,"243":1,"245":1}}],["connectivity",{"2":{"212":1}}],["connecting",{"2":{"27":1,"36":1,"47":1,"59":1,"68":1,"79":1,"85":1,"140":1,"174":1}}],["connection",{"0":{"142":1,"197":1},"1":{"198":1,"199":1},"2":{"22":1,"24":1,"35":1,"44":1,"114":1,"142":1,"174":1,"198":1,"199":1,"200":2,"201":3,"202":2,"203":1,"217":1,"244":1,"310":2,"323":2}}],["connections",{"0":{"195":1},"1":{"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1},"2":{"8":1,"61":1,"134":1,"175":1,"196":2,"197":1,"201":3,"285":1,"301":1}}],["concept",{"0":{"124":1,"133":1,"156":1,"174":1,"190":1,"196":1,"206":1,"234":1,"244":1,"252":1},"2":{"214":1}}],["concepts",{"0":{"93":1},"1":{"94":1,"95":1,"96":1,"97":1},"2":{"214":1}}],["conceptually",{"2":{"14":1}}],["conclusion",{"0":{"20":1}}],["consists",{"2":{"316":1}}],["consistently",{"2":{"3":1}}],["consume",{"2":{"278":1}}],["console",{"2":{"35":1,"55":1,"57":1,"58":1,"80":1}}],["constraint",{"2":{"14":1}}],["contribute",{"0":{"311":1},"2":{"311":1}}],["controlling",{"2":{"95":1}}],["control",{"0":{"91":1},"1":{"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1},"2":{"10":1,"15":1,"17":1,"91":2,"95":1,"98":1,"119":1,"278":1,"313":1,"314":1}}],["controls",{"2":{"10":1,"119":1,"215":1,"323":1,"330":1}}],["continuing",{"2":{"307":1}}],["continuity",{"2":{"16":1,"20":1,"145":1}}],["continue",{"2":{"20":1,"131":1,"337":1,"360":1}}],["continuously",{"2":{"14":1}}],["contents",{"2":{"170":1}}],["content",{"2":{"14":1,"29":1,"32":1,"37":1,"40":1,"51":1,"83":1,"90":1,"123":1,"124":1,"186":1,"208":1,"209":1,"257":1,"265":1,"271":1,"273":1}}],["contextually",{"2":{"204":1}}],["contexts",{"0":{"123":1,"127":1},"1":{"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1},"2":{"115":1,"125":3,"285":1}}],["context",{"0":{"5":1,"125":1,"126":1,"128":1,"144":1,"152":1,"153":1,"214":1,"227":1,"306":1},"1":{"127":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"307":1},"2":{"5":2,"6":2,"13":2,"14":1,"16":2,"17":1,"18":1,"20":1,"72":1,"100":1,"110":1,"114":1,"115":1,"116":3,"118":5,"123":2,"124":1,"125":2,"126":1,"127":2,"128":3,"129":1,"144":3,"145":2,"146":2,"147":5,"149":1,"150":1,"151":1,"152":2,"153":2,"154":1,"195":2,"203":1,"206":3,"210":1,"214":3,"225":2,"227":4,"234":1,"241":1,"251":1,"252":2,"253":1,"255":2,"256":1,"262":3,"263":1,"285":3,"287":2,"290":1,"291":1,"300":1,"307":3,"314":2}}],["contains",{"2":{"21":1,"116":1,"253":3,"279":1}}],["containerd",{"2":{"159":1,"315":2,"316":1,"323":2}}],["containers",{"2":{"17":1,"18":1,"315":1}}],["containerization",{"2":{"16":1}}],["containerized",{"0":{"4":1,"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"1":1,"15":1,"17":1,"18":1,"19":1,"20":1,"312":1}}],["container",{"0":{"155":1,"159":1,"172":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1},"2":{"4":1,"18":1,"19":1,"111":1,"114":5,"121":3,"122":1,"155":1,"156":1,"157":1,"158":5,"159":5,"160":4,"161":3,"162":2,"163":6,"164":1,"165":1,"166":1,"168":2,"169":1,"170":1,"171":2,"172":4,"181":1,"184":2,"198":1,"266":1,"285":1,"305":1,"317":3,"323":1,"328":1}}],["contact",{"2":{"13":1}}],["mp3",{"2":{"354":2}}],["mpim",{"2":{"62":2,"63":1}}],["md",{"2":{"186":1,"265":1,"266":3,"271":1,"305":1}}],["m",{"2":{"37":2}}],["my",{"2":{"69":2,"239":1,"240":1,"247":1}}],["mybot",{"2":{"37":1,"38":1}}],["myself",{"2":{"14":1}}],["mirrors",{"2":{"325":1}}],["mirror=true",{"2":{"319":2,"321":1}}],["mirror",{"0":{"321":1},"2":{"319":1,"321":1,"323":1,"325":1}}],["midnight",{"2":{"236":2}}],["migration",{"2":{"168":1}}],["minute",{"2":{"236":1}}],["minutes",{"2":{"117":1,"191":2,"236":1,"242":1,"296":1,"322":1}}],["minimum",{"2":{"56":1,"265":1,"320":1}}],["microsoft",{"2":{"219":1,"352":1,"359":1}}],["mic",{"2":{"14":1}}],["misskey",{"0":{"42":1,"43":1},"1":{"43":1,"44":1,"45":1,"46":1},"2":{"1":1,"7":1,"33":1,"42":3,"43":3,"44":2,"45":2,"114":1,"135":2,"255":1,"312":1}}],["must",{"2":{"74":1,"158":1,"160":1,"162":1,"228":1,"320":1,"325":1,"334":1,"335":1}}],["much",{"2":{"14":1,"146":1,"262":1}}],["multilingual",{"2":{"317":2,"328":1,"334":1}}],["multiple",{"2":{"1":1,"3":1,"9":1,"17":1,"18":1,"110":1,"121":1,"133":1,"156":1,"201":2,"204":1,"250":1,"266":1,"267":1,"316":1,"317":1,"328":1}}],["multi",{"0":{"3":2},"2":{"1":1,"14":1,"18":1,"19":1,"312":1}}],["mcpservers",{"2":{"201":1}}],["mcp",{"0":{"8":1,"195":1,"301":1,"310":1},"1":{"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1},"2":{"8":2,"18":1,"32":1,"114":2,"188":1,"194":1,"195":1,"196":3,"197":2,"199":2,"200":2,"202":1,"203":3,"285":2,"301":4,"308":1,"310":2,"311":1,"314":2}}],["mounts",{"2":{"320":1}}],["morning",{"2":{"235":1,"240":1,"279":1,"281":1,"303":2}}],["more",{"2":{"1":1,"10":1,"14":3,"18":2,"19":1,"20":1,"40":1,"62":1,"124":1,"133":1,"145":1,"152":2,"161":1,"193":1,"210":1,"216":2,"254":1,"317":1}}],["mono",{"2":{"354":3}}],["monologue",{"2":{"254":1}}],["monday",{"2":{"236":1}}],["month",{"2":{"236":3}}],["monitor",{"2":{"188":1,"211":1}}],["monitoring",{"0":{"192":1},"1":{"193":1},"2":{"180":1}}],["monaco",{"2":{"186":1}}],["move",{"2":{"183":1}}],["mobile",{"2":{"14":1,"35":1,"116":1,"123":1,"126":2}}],["moment",{"2":{"14":3}}],["most",{"2":{"14":1,"68":1,"103":1,"115":1,"120":1,"160":1,"206":1,"220":1,"225":1,"231":1,"254":1,"271":1,"279":1,"293":1}}],["modify",{"2":{"156":1,"186":1,"209":1}}],["modules",{"2":{"8":1,"264":1}}],["modes",{"0":{"327":1},"1":{"328":1},"2":{"226":1,"316":1,"317":1,"326":1,"339":1,"341":1}}],["modelcontextprotocol",{"2":{"198":1}}],["model",{"0":{"224":1,"225":1,"231":1,"279":1,"297":1,"354":1},"1":{"226":1,"227":1,"228":1},"2":{"10":1,"11":1,"15":1,"18":1,"34":1,"103":1,"114":1,"116":14,"117":3,"118":2,"120":1,"129":1,"145":2,"146":1,"147":3,"151":2,"152":4,"191":2,"195":1,"214":1,"215":1,"221":1,"223":2,"224":1,"225":3,"226":6,"227":2,"228":4,"231":4,"254":1,"262":1,"267":1,"278":1,"279":2,"280":2,"285":1,"292":2,"296":4,"297":15,"313":3,"317":5,"327":1,"328":2,"330":2,"334":1,"335":1,"353":1,"354":1,"355":2,"356":1,"357":3,"358":3}}],["models",{"0":{"9":1,"216":1,"223":1,"228":1,"229":1,"230":1},"1":{"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1},"2":{"9":5,"11":1,"13":1,"16":1,"114":1,"115":1,"116":3,"216":4,"218":1,"222":1,"223":4,"224":5,"229":2,"230":3,"231":1,"232":1,"285":1,"297":1,"313":1,"317":1,"357":1}}],["mode",{"0":{"6":1,"57":1,"61":1,"328":1,"333":1,"334":1,"335":1},"2":{"33":1,"57":1,"61":2,"75":2,"76":1,"120":1,"135":1,"139":1,"141":1,"206":1,"211":1,"215":1,"253":1,"317":1,"327":1,"328":2,"330":2}}],["macos",{"2":{"320":1}}],["machine",{"2":{"162":2,"169":1,"170":1,"184":1}}],["masked",{"2":{"317":1}}],["marked",{"2":{"282":1}}],["markdown",{"2":{"26":1,"40":1,"45":1,"46":1,"49":2,"51":1,"68":1,"72":1,"114":1,"265":2,"270":1}}],["max",{"2":{"235":1,"240":1,"241":1,"242":1}}],["maximum",{"2":{"225":1}}],["mapped",{"2":{"138":1}}],["mail",{"2":{"180":1}}],["mailgun",{"2":{"33":1,"174":1,"176":1}}],["mainland",{"0":{"321":1},"2":{"319":1,"321":1,"325":1}}],["maintain",{"2":{"156":1,"252":1}}],["maintains",{"2":{"6":1,"24":1,"142":1,"251":1}}],["maintenance",{"2":{"118":1,"210":1,"233":1}}],["main",{"2":{"116":1,"117":1,"152":1,"191":1,"219":1,"224":1,"313":1,"315":1,"316":1}}],["may",{"2":{"23":1,"35":1,"74":1,"206":1,"226":1,"247":1,"253":1,"268":1,"322":1}}],["making",{"2":{"20":2,"272":1}}],["make",{"2":{"16":1,"43":1,"64":1,"76":1,"205":1,"210":1}}],["makes",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"13":1,"16":1,"215":1,"254":1}}],["matter",{"2":{"119":1}}],["matters",{"2":{"97":1,"230":1,"266":1}}],["mattered",{"2":{"14":1}}],["match",{"2":{"162":1,"320":1,"325":1}}],["matching",{"2":{"66":1,"97":2}}],["matches",{"2":{"34":1,"94":1,"95":1,"97":2,"119":1,"162":1}}],["matrix",{"0":{"36":1,"37":1},"1":{"37":1,"38":1,"39":1,"40":1,"41":1},"2":{"1":1,"7":1,"33":2,"36":3,"37":5,"38":5,"39":1,"40":1,"41":1,"114":1,"133":1,"135":2,"312":1}}],["managing",{"0":{"98":1,"127":1,"167":1,"184":1,"193":1,"209":1,"248":1,"258":1,"269":1,"331":1},"1":{"99":1,"100":1,"101":1,"102":1,"259":1,"260":1,"261":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"342":1}}],["manages",{"2":{"216":1,"252":1,"303":1,"338":1}}],["managed",{"2":{"160":1,"216":1,"230":1,"253":1,"266":3,"268":4,"270":1,"271":1,"272":2,"274":3,"276":2,"314":1}}],["managers",{"2":{"156":1}}],["manager",{"2":{"114":1,"187":1}}],["manage",{"2":{"10":1,"113":1,"120":1,"125":1,"131":1,"142":1,"154":1,"157":1,"172":1,"175":1,"178":1,"181":1,"188":1,"207":1,"224":1,"264":1,"276":1,"285":1,"337":1,"340":1,"341":1}}],["management",{"0":{"5":1,"111":1,"155":1,"181":1,"204":1},"1":{"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1},"2":{"8":1,"10":2,"18":1,"58":1,"80":2,"114":1,"129":1,"131":1,"144":1,"154":1,"173":1,"232":1,"337":1,"341":1,"346":2,"351":2}}],["manual",{"0":{"320":1},"1":{"321":1},"2":{"87":1,"233":1,"326":1}}],["manually",{"2":{"24":1,"103":1,"130":1,"188":1,"196":1,"202":1,"208":1,"223":1,"276":1,"337":1}}],["manifesto",{"2":{"13":1}}],["many",{"2":{"7":1,"14":1,"151":1,"158":1,"214":1}}],["me",{"2":{"239":1}}],["merge",{"2":{"144":1,"146":1,"210":1}}],["medium",{"2":{"116":1,"226":1,"296":1}}],["media",{"2":{"22":1,"26":1,"40":1,"46":1,"78":1,"90":1}}],["mental",{"0":{"231":1},"2":{"103":1,"267":1}}],["mentions",{"2":{"42":1,"62":2}}],["mention",{"2":{"25":1,"63":1,"281":1}}],["meaning",{"2":{"226":1,"236":1,"267":1,"280":1}}],["mean",{"0":{"103":1}}],["means",{"2":{"1":1,"97":1,"162":1,"254":2,"275":1}}],["metadata",{"2":{"62":1,"151":1}}],["metaphors",{"2":{"14":1}}],["metrics",{"2":{"6":1}}],["message",{"2":{"23":1,"25":2,"29":1,"30":1,"32":1,"33":1,"39":1,"40":1,"50":1,"51":2,"56":1,"57":2,"63":4,"66":1,"72":1,"73":1,"77":2,"78":1,"83":1,"90":1,"94":1,"95":1,"100":1,"135":1,"151":1,"206":1,"241":1,"251":1,"254":1,"256":1,"261":1,"262":1,"281":1,"285":1,"290":1}}],["messages",{"2":{"9":1,"30":1,"33":1,"35":1,"36":1,"40":2,"51":1,"56":1,"59":1,"62":5,"66":3,"67":1,"76":1,"82":2,"83":2,"88":1,"90":2,"108":1,"138":1,"139":1,"145":1,"151":1,"208":1,"219":2,"252":1,"256":1,"262":1,"287":1}}],["messaging",{"0":{"25":1},"2":{"8":1,"23":1,"33":5,"36":1,"85":1,"111":1,"132":1,"133":1,"135":1}}],["mem0",{"0":{"342":1,"343":1,"344":1,"345":1},"1":{"343":1,"344":1,"345":1,"346":1},"2":{"205":1,"339":2,"341":2,"342":3,"343":1,"344":3,"345":1,"346":2}}],["memories",{"0":{"208":1},"2":{"114":1,"144":1,"153":1,"206":2,"207":1,"209":2,"210":4,"211":2,"213":1,"215":2,"263":1,"330":1,"333":1,"337":4,"340":1}}],["memory",{"0":{"5":1,"153":1,"204":1,"206":1,"210":1,"214":1,"298":1,"326":1,"327":1,"336":1,"337":1,"338":1,"342":1,"347":1},"1":{"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"327":1,"328":2,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"339":1,"340":1,"341":1,"343":1,"344":1,"345":1,"346":1,"348":1,"349":1,"350":1,"351":1},"2":{"1":3,"5":4,"8":1,"9":1,"14":1,"15":1,"17":1,"18":3,"19":1,"20":1,"111":1,"114":3,"115":1,"116":3,"118":1,"122":1,"131":3,"144":3,"146":3,"153":5,"154":2,"194":1,"204":1,"205":6,"206":2,"207":1,"208":3,"209":1,"210":3,"211":2,"212":5,"213":2,"214":5,"215":4,"224":1,"229":1,"231":1,"232":1,"263":1,"285":2,"298":4,"307":4,"312":2,"314":4,"316":2,"317":5,"326":8,"329":2,"330":2,"336":2,"337":5,"338":5,"339":4,"340":3,"341":6,"342":2,"343":2,"345":1,"346":4,"347":3,"348":2,"350":1,"351":4}}],["memoh123",{"2":{"319":1,"325":1}}],["memohai",{"2":{"311":1,"320":1}}],["memohbot",{"2":{"281":1}}],["memoh",{"0":{"0":1,"1":1,"2":1,"12":1,"24":1,"31":1,"38":1,"44":1,"49":1,"65":1,"70":1,"75":1,"81":1,"86":1,"312":1},"1":{"1":1,"2":1,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"313":1,"314":1},"2":{"1":1,"3":1,"5":1,"6":1,"7":2,"9":1,"13":1,"15":1,"16":1,"17":1,"19":2,"20":3,"21":1,"22":1,"24":2,"26":1,"27":1,"31":1,"33":2,"34":1,"35":2,"36":1,"38":1,"42":1,"43":1,"44":2,"45":1,"47":1,"49":1,"50":2,"53":1,"57":2,"59":1,"61":1,"62":1,"65":1,"68":2,"69":2,"70":1,"71":2,"73":1,"75":2,"76":2,"77":2,"79":1,"81":1,"85":1,"86":1,"87":2,"91":1,"92":1,"116":1,"123":1,"130":1,"133":1,"138":1,"139":2,"141":2,"142":1,"147":2,"152":1,"155":1,"160":1,"162":3,"172":1,"173":1,"181":1,"195":1,"198":1,"200":3,"202":1,"204":1,"206":1,"214":1,"216":2,"219":1,"222":1,"223":1,"224":1,"226":1,"227":2,"228":1,"236":1,"243":1,"253":1,"254":1,"265":1,"266":5,"267":1,"268":1,"270":1,"271":1,"274":2,"276":3,"278":1,"280":1,"281":1,"291":1,"307":1,"308":1,"310":1,"312":1,"313":1,"315":1,"316":1,"319":10,"320":2,"321":1,"325":2,"326":2,"338":1,"339":2,"357":1}}],["members",{"2":{"27":1,"29":1}}],["member",{"2":{"1":1,"95":1,"312":1}}],["avoid",{"2":{"265":1}}],["avatar",{"2":{"112":1}}],["available",{"0":{"339":1,"359":1},"2":{"23":1,"116":1,"130":1,"147":1,"151":1,"202":1,"234":1,"263":1,"274":1,"282":1,"304":1,"323":1,"354":1,"360":1}}],["audio",{"2":{"354":3,"357":1}}],["auditing",{"2":{"172":1}}],["audit",{"2":{"151":1,"179":1,"192":1}}],["auth",{"2":{"320":1,"323":1}}],["authenticates",{"2":{"221":1}}],["authentication",{"0":{"200":1},"2":{"81":1,"199":1,"200":2,"218":1,"344":1,"349":1}}],["authorization",{"2":{"200":1,"222":3}}],["authorized",{"2":{"106":1}}],["authorize",{"2":{"30":1,"64":1,"200":1}}],["automate",{"2":{"233":1}}],["automatic",{"0":{"147":1},"2":{"118":1,"147":2,"151":1,"190":1,"326":1}}],["automatically",{"2":{"24":1,"38":1,"39":1,"87":1,"88":1,"200":1,"202":2,"203":1,"215":1,"239":1,"241":1,"250":1,"253":1,"268":1,"321":1,"353":1}}],["automation",{"0":{"234":1,"302":1},"1":{"303":1,"304":1,"305":1},"2":{"8":1,"116":1,"120":1,"124":1,"242":1,"316":1,"320":1}}],["autonomy",{"0":{"190":1}}],["autonomous",{"2":{"6":1,"115":1,"117":2,"189":1,"194":1,"242":1,"253":1,"263":1}}],["auto",{"2":{"38":1,"39":1,"259":1,"319":1,"358":1}}],["affecting",{"2":{"155":1}}],["affects",{"2":{"146":1}}],["after",{"0":{"337":1},"2":{"25":1,"45":1,"66":2,"75":1,"88":1,"92":1,"101":1,"115":2,"119":2,"126":1,"128":1,"131":1,"140":1,"147":1,"163":1,"200":1,"222":1,"223":1,"268":1,"279":1,"322":1,"330":1,"341":1,"344":1,"349":1}}],["abort",{"2":{"279":1}}],["above",{"2":{"97":1}}],["about",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"21":1,"118":1,"144":1,"151":1,"159":1,"206":1,"313":1}}],["abcdefghijklmnopqrstuvwxyz",{"2":{"69":1}}],["am",{"2":{"235":1,"236":2,"239":1}}],["amd",{"2":{"161":2,"162":2}}],["amp",{"2":{"54":1,"58":1,"62":1,"64":1}}],["ambient",{"2":{"14":1}}],["aware",{"2":{"45":1}}],["aes",{"2":{"34":1,"74":1,"75":1,"76":1,"141":1}}],["adjustment",{"2":{"354":1}}],["adoption",{"2":{"314":1}}],["adopt",{"0":{"274":1},"2":{"268":2,"274":3,"276":1,"277":1}}],["advanced",{"0":{"120":1,"160":1},"1":{"161":1,"162":1,"163":1},"2":{"120":1,"160":2,"161":1,"265":1}}],["admin123",{"2":{"319":1,"322":1}}],["admins",{"2":{"94":1,"106":1}}],["admin",{"2":{"80":1,"92":1,"97":1,"319":3,"320":2,"322":1,"323":2}}],["address",{"2":{"174":1,"178":1,"179":1,"323":2}}],["adding",{"0":{"100":1,"137":1,"178":1,"247":1},"2":{"225":1}}],["additional",{"2":{"247":1,"333":1}}],["addition",{"2":{"61":1}}],["add",{"0":{"66":1,"75":1,"86":1,"270":1},"2":{"24":1,"30":1,"31":1,"35":1,"38":1,"44":1,"49":1,"57":2,"62":3,"63":1,"65":1,"70":1,"75":1,"81":1,"86":1,"92":2,"99":1,"100":1,"103":1,"106":1,"107":1,"108":1,"109":1,"125":1,"137":1,"176":1,"178":1,"201":3,"218":1,"223":2,"247":1,"270":1,"321":1,"329":1,"343":1,"348":1,"353":1,"358":1}}],["adapters",{"2":{"34":1,"135":1,"255":1,"278":1,"287":1}}],["adapter",{"2":{"7":1,"22":1,"42":1,"61":1,"62":1,"63":1,"73":2,"78":1,"255":1,"287":1}}],["a2a",{"2":{"19":1}}],["approaching",{"2":{"227":1}}],["approximate",{"2":{"225":1}}],["appropriate",{"2":{"163":1}}],["approved",{"2":{"58":1}}],["approval",{"2":{"48":1,"58":1}}],["approving",{"2":{"35":1}}],["apps",{"2":{"80":1}}],["appsecret",{"2":{"48":2,"49":1}}],["appears",{"2":{"309":1}}],["appear",{"2":{"72":1,"253":1,"266":1,"276":1}}],["applied",{"2":{"97":2,"163":1}}],["applies",{"2":{"94":1,"100":2}}],["applications",{"2":{"30":1,"132":1}}],["application",{"0":{"28":1},"2":{"28":1,"37":1,"80":1}}],["apply",{"2":{"56":1,"186":1,"230":1}}],["appid",{"2":{"48":1,"49":1}}],["app",{"0":{"23":1,"54":1,"58":1,"60":1,"64":1},"2":{"14":1,"20":1,"23":6,"24":2,"34":2,"35":3,"54":4,"57":3,"58":1,"60":2,"61":2,"62":1,"63":1,"64":3,"65":1,"66":2,"74":2,"75":2,"80":1,"139":1,"142":2,"320":1}}],["apis",{"2":{"17":1,"22":1,"74":1,"216":1}}],["api",{"0":{"240":1},"2":{"9":1,"35":1,"37":1,"60":1,"69":2,"70":1,"87":1,"120":1,"138":1,"176":1,"206":1,"215":1,"217":2,"218":3,"219":3,"220":1,"221":2,"240":2,"244":1,"247":2,"317":3,"322":1,"323":1,"327":1,"328":2,"339":3,"341":1,"342":1,"344":4,"346":1,"347":1,"349":3,"351":1,"352":2,"359":2}}],["aggregator",{"2":{"245":1}}],["aggressive",{"2":{"210":1}}],["aggressively",{"2":{"118":1,"147":1}}],["against",{"2":{"152":1}}],["again",{"2":{"48":1,"66":1,"87":1}}],["agreement",{"2":{"14":1}}],["agent2agent",{"2":{"19":1}}],["agents",{"2":{"13":1,"14":1,"16":1,"266":2}}],["agent",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"1":2,"13":1,"14":1,"19":1,"20":1,"111":1,"126":2,"234":1,"235":1,"241":2,"312":1,"315":1,"316":1}}],["architecture",{"0":{"316":1},"1":{"317":1}}],["archive",{"2":{"169":2,"170":2}}],["arguments",{"2":{"198":2,"279":2}}],["argument",{"2":{"130":1,"281":1}}],["around",{"2":{"14":1}}],["aren",{"2":{"189":1}}],["are",{"2":{"9":1,"11":1,"26":1,"33":1,"40":2,"50":1,"63":1,"71":1,"78":1,"83":1,"92":4,"97":2,"101":1,"103":1,"108":1,"115":1,"128":1,"130":1,"137":1,"138":1,"163":1,"170":1,"180":1,"200":1,"206":1,"209":1,"214":2,"215":1,"216":1,"220":1,"224":1,"225":1,"229":1,"230":1,"238":1,"252":2,"253":2,"254":2,"256":1,"259":1,"263":4,"264":1,"266":2,"275":3,"277":1,"278":2,"279":2,"281":2,"282":3,"291":1,"316":2,"322":1,"330":1,"333":1,"346":1,"351":1}}],["alternative",{"2":{"347":1}}],["along",{"2":{"241":1}}],["aloud",{"2":{"219":1,"352":1,"353":1,"354":1,"357":1,"359":1}}],["alerts",{"2":{"193":1}}],["alert",{"2":{"192":1}}],["aligned",{"2":{"141":1}}],["all",{"2":{"91":1,"92":2,"95":3,"100":1,"103":4,"105":1,"106":1,"107":1,"108":1,"112":1,"122":2,"179":1,"202":1,"211":2,"237":1,"256":1,"259":1,"263":2,"296":1,"297":2,"298":2,"299":2,"300":2,"301":2,"303":2,"315":1,"319":2,"323":1}}],["allowing",{"2":{"132":1,"180":1,"195":1,"251":1}}],["allow",{"2":{"91":1,"92":3,"94":2,"95":1,"96":1,"97":1,"100":1,"102":1,"103":3,"105":2,"106":1,"107":2,"108":1,"109":1,"112":1,"164":1,"233":1,"296":1}}],["allowed",{"2":{"43":1,"92":3,"94":1,"97":1,"105":1,"291":1}}],["allows",{"2":{"27":1,"36":1,"47":1,"53":1,"59":1,"79":1,"85":1,"126":1,"139":1,"155":1,"173":1,"185":1,"189":1,"204":1,"243":1}}],["already",{"2":{"14":1,"162":1,"205":1,"222":1,"223":1,"235":1,"274":1,"282":1,"288":1}}],["always",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"13":1,"14":2,"16":1,"17":1,"20":2,"97":1,"316":1}}],["also",{"2":{"7":1,"9":1,"16":1,"23":1,"62":1,"72":1,"74":1,"75":1,"117":1,"118":1,"120":1,"147":1,"149":1,"152":1,"179":1,"188":1,"200":1,"202":1,"223":1,"226":1,"240":1,"262":1,"275":1,"320":1,"325":1}}],["ascii",{"2":{"265":1}}],["ask",{"2":{"239":1}}],["asia",{"2":{"126":1}}],["assistant",{"2":{"254":1}}],["assignment",{"2":{"357":1}}],["assign",{"2":{"228":1,"232":1,"340":1}}],["assigning",{"0":{"128":1,"249":1,"336":1,"345":1,"350":1,"355":1},"2":{"356":1}}],["assigned",{"2":{"116":1,"123":1,"194":1,"206":1,"215":1,"250":1,"337":1,"341":1,"346":1,"351":1}}],["associated",{"2":{"122":1,"178":1,"262":1}}],["as",{"0":{"174":1},"2":{"6":1,"10":1,"16":1,"17":3,"18":1,"19":2,"20":1,"23":1,"37":1,"40":1,"42":1,"72":1,"112":1,"114":1,"116":2,"120":1,"123":1,"126":2,"129":1,"133":1,"145":1,"152":1,"156":1,"159":1,"162":1,"180":1,"210":1,"215":1,"217":2,"218":1,"219":1,"225":2,"226":2,"229":1,"231":1,"253":1,"254":1,"255":1,"256":1,"265":2,"266":2,"268":1,"276":1,"278":1,"279":2,"281":2,"282":1,"287":1,"296":1,"344":1,"346":1,"347":1,"349":1,"351":1,"353":1}}],["another",{"2":{"173":1,"267":1,"268":1}}],["answer",{"2":{"103":1,"250":1}}],["anything",{"2":{"103":1}}],["anyone",{"0":{"105":1},"2":{"37":1,"92":1,"94":1}}],["any",{"2":{"33":1,"36":1,"37":1,"159":1,"162":1,"194":1,"229":1,"233":1,"234":1,"241":1,"310":1}}],["anchor",{"2":{"14":1}}],["annoying",{"2":{"14":1}}],["anthropic",{"2":{"9":1,"217":1,"219":2}}],["an",{"0":{"12":1,"310":1,"348":1,"349":1,"350":1,"353":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1},"2":{"5":1,"14":3,"17":1,"19":2,"20":3,"35":1,"37":1,"43":1,"61":2,"69":2,"74":1,"91":1,"92":1,"94":1,"95":2,"96":1,"97":1,"99":1,"100":1,"102":1,"108":1,"109":1,"111":1,"116":1,"119":1,"120":1,"151":1,"160":1,"162":1,"163":1,"170":1,"174":1,"179":2,"187":1,"192":1,"202":1,"203":1,"205":1,"206":1,"212":1,"217":1,"227":1,"228":1,"251":1,"254":1,"310":1,"317":2,"328":1,"335":1,"339":1,"347":1}}],["and",{"0":{"3":1,"5":1,"6":1,"8":1,"9":1,"10":1,"43":1,"77":1,"119":1,"151":1,"168":1,"173":1,"179":1,"183":1,"185":1,"192":1,"209":1,"216":1,"276":1,"289":1,"302":1},"1":{"169":1,"170":1,"171":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"186":1,"187":1,"193":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"290":1,"291":1,"292":1,"293":1,"294":1,"303":1,"304":1,"305":1},"2":{"1":3,"3":2,"4":3,"5":1,"6":3,"7":1,"8":5,"9":1,"10":3,"11":3,"13":1,"14":6,"16":4,"17":3,"18":7,"19":6,"20":4,"22":3,"23":1,"24":3,"25":1,"26":2,"27":1,"28":2,"29":1,"30":2,"31":2,"32":1,"33":5,"34":1,"35":2,"36":1,"38":2,"39":1,"40":2,"42":1,"43":1,"44":3,"45":1,"48":2,"49":3,"50":2,"51":3,"54":3,"56":2,"57":3,"58":2,"59":2,"60":2,"62":4,"63":1,"64":2,"65":2,"66":2,"67":4,"68":1,"69":1,"70":2,"71":2,"72":1,"73":1,"75":1,"76":1,"77":1,"78":1,"80":1,"81":2,"82":1,"86":1,"87":1,"90":1,"92":2,"94":1,"100":1,"101":1,"103":3,"106":1,"110":2,"111":2,"114":10,"115":1,"116":5,"119":1,"120":1,"122":3,"123":2,"124":3,"126":1,"127":1,"128":1,"129":1,"133":1,"135":3,"137":2,"138":1,"139":1,"141":3,"142":2,"143":2,"144":1,"149":1,"150":1,"151":1,"155":1,"156":1,"158":1,"159":1,"160":1,"162":1,"163":2,"164":1,"166":1,"167":1,"168":1,"172":1,"173":2,"178":2,"180":1,"182":1,"184":1,"186":2,"188":2,"190":1,"195":1,"196":2,"198":1,"200":1,"201":2,"202":1,"203":1,"204":1,"206":3,"210":1,"212":1,"215":1,"216":1,"217":1,"220":1,"222":3,"224":3,"225":1,"229":1,"230":1,"231":1,"232":2,"234":1,"235":1,"236":2,"237":1,"239":2,"240":1,"241":1,"242":1,"243":1,"245":1,"248":1,"249":2,"250":1,"251":2,"253":3,"254":4,"256":1,"259":1,"263":1,"264":2,"265":3,"266":1,"267":1,"268":1,"274":1,"276":1,"277":1,"278":2,"279":1,"282":1,"285":7,"287":1,"288":1,"291":1,"297":1,"307":1,"308":1,"309":1,"310":1,"312":2,"313":6,"314":5,"315":2,"316":3,"319":4,"320":1,"321":1,"322":1,"323":5,"326":4,"328":1,"330":2,"331":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":3,"339":1,"340":1,"342":1,"344":1,"345":1,"346":1,"349":1,"350":1,"351":1,"352":1,"356":1,"357":1,"358":3}}],["acl",{"0":{"92":1,"119":1},"2":{"91":1,"92":1,"94":1,"95":1,"97":1,"99":1,"105":1,"106":1,"107":1,"110":2,"112":1,"114":1,"115":2,"119":3,"285":1,"291":2,"296":1,"314":1}}],["actions",{"0":{"158":1},"2":{"129":1,"180":1,"189":1,"233":1,"280":1,"282":3,"290":1,"292":1,"293":1,"294":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1,"304":1,"305":1,"307":1}}],["action",{"2":{"122":2,"129":1,"184":1,"192":1,"210":1,"254":1,"279":4,"280":2,"285":1,"290":1,"292":1,"293":1,"294":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"303":1,"304":1,"305":1,"307":1}}],["activities",{"2":{"194":1}}],["activity",{"2":{"115":1,"117":1,"242":1,"253":2,"259":1,"263":1}}],["activate",{"2":{"35":1,"143":1}}],["active",{"2":{"5":2,"143":1,"144":1,"146":1,"149":1,"152":1,"153":1,"159":1,"172":1,"201":1,"202":1,"203":1,"205":1,"210":1,"214":1,"235":1,"255":1,"256":1,"259":1,"262":1,"267":1,"275":2,"290":2,"298":1,"299":1,"300":1,"307":1,"314":1}}],["actual",{"2":{"34":1,"265":1,"337":1,"340":1}}],["actually",{"0":{"103":1},"2":{"13":1,"14":2,"151":1}}],["act",{"2":{"23":1,"37":1}}],["acts",{"2":{"17":1,"124":1,"133":1,"156":1}}],["accurate",{"2":{"250":1}}],["accumulate",{"2":{"210":1}}],["accumulating",{"2":{"14":1}}],["accepted",{"2":{"281":1}}],["accept",{"2":{"39":1,"226":1}}],["access",{"0":{"91":1,"98":1,"108":1,"109":1,"110":1,"119":1,"291":1,"322":1},"1":{"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":2,"100":2,"101":2,"102":2,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1},"2":{"10":1,"11":1,"18":1,"32":1,"33":1,"35":1,"37":2,"38":2,"40":1,"43":2,"44":1,"56":1,"91":2,"92":2,"94":1,"95":2,"98":2,"99":1,"102":1,"110":2,"112":1,"114":3,"115":1,"119":2,"121":1,"123":1,"160":1,"196":1,"200":1,"221":1,"222":2,"239":1,"285":1,"291":1,"312":1,"314":2,"321":1}}],["accounts",{"2":{"291":1}}],["account",{"0":{"34":1,"37":1,"43":1,"73":1,"74":1,"141":1},"1":{"74":1,"75":1,"76":1,"77":1,"78":1},"2":{"1":1,"7":2,"33":2,"34":3,"37":3,"38":1,"42":1,"43":4,"48":2,"50":1,"71":1,"73":2,"74":1,"75":1,"76":1,"77":1,"135":5,"141":2,"222":1,"312":1,"323":1}}],["across",{"2":{"3":1,"5":1,"110":1,"115":1,"156":1,"204":1,"214":1,"255":1,"263":1,"312":1,"352":1,"354":1,"359":1}}],["attached",{"2":{"159":1,"163":2}}],["attachment",{"2":{"33":1,"40":1,"68":1,"135":1}}],["attachments",{"2":{"26":1,"32":1,"46":1,"51":1,"59":1,"67":1,"72":1,"78":1,"90":1}}],["attach",{"2":{"30":1}}],["attempt",{"2":{"13":1}}],["at",{"0":{"275":1},"2":{"3":1,"7":1,"18":1,"56":1,"95":1,"107":1,"119":1,"122":1,"130":1,"179":1,"190":1,"201":1,"221":1,"235":1,"236":4,"239":1,"265":1,"317":1,"320":1}}],["ai",{"2":{"1":2,"9":1,"13":1,"14":2,"15":1,"16":1,"18":1,"20":1,"33":1,"111":1,"219":1,"245":1,"312":1,"315":1,"316":1,"344":1}}],["a",{"0":{"23":1,"28":1,"37":1,"43":1,"48":1,"54":1,"60":1,"69":1,"80":1,"99":1,"112":1,"122":1,"125":1,"126":1,"128":2,"137":1,"165":1,"166":1,"174":1,"176":1,"178":1,"218":1,"247":1,"249":2,"255":1,"265":1,"309":1,"329":1,"330":1,"336":2,"343":1,"344":1,"345":2,"350":1,"355":1},"1":{"127":1,"256":1,"257":1,"331":1},"2":{"1":2,"4":1,"6":1,"7":1,"8":1,"9":1,"11":1,"13":3,"14":11,"15":1,"17":2,"18":1,"19":4,"20":3,"24":1,"25":2,"28":2,"35":4,"37":3,"39":2,"42":3,"43":1,"48":1,"50":1,"54":1,"57":2,"58":1,"60":1,"66":2,"69":3,"71":1,"74":1,"75":1,"77":1,"80":1,"85":1,"87":3,"92":2,"94":2,"95":3,"97":1,"98":1,"100":7,"102":6,"103":1,"109":1,"110":1,"111":1,"112":1,"113":1,"115":2,"116":1,"119":2,"120":1,"122":1,"123":6,"124":2,"125":1,"126":1,"127":2,"129":1,"131":1,"133":2,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":2,"145":2,"147":1,"150":1,"151":2,"152":1,"155":1,"158":1,"160":1,"162":1,"164":1,"165":2,"167":2,"169":1,"171":1,"172":1,"174":5,"180":1,"182":2,"183":1,"184":2,"186":1,"187":1,"190":3,"192":2,"194":3,"196":2,"198":2,"199":1,"200":1,"201":3,"202":1,"205":3,"206":3,"208":1,"217":1,"220":1,"221":2,"222":2,"223":2,"225":1,"226":2,"227":1,"228":2,"232":1,"234":5,"235":3,"239":5,"241":1,"244":4,"247":1,"248":1,"250":3,"251":4,"252":4,"253":7,"254":7,"255":5,"256":3,"257":2,"260":1,"261":1,"262":1,"263":2,"264":1,"265":5,"266":1,"268":4,"269":1,"271":1,"272":2,"273":3,"274":4,"276":2,"277":1,"278":1,"279":5,"281":4,"287":4,"288":2,"291":1,"309":1,"310":1,"312":1,"313":1,"317":3,"319":1,"323":1,"329":1,"330":1,"331":2,"337":1,"338":3,"340":2,"342":1,"343":1,"344":2,"347":3,"348":1,"349":2,"355":1,"356":1,"357":4,"358":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/VPLocalSearchBox.ppjlRfVe.js b/assets/chunks/VPLocalSearchBox.Bvi8a7xK.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.ppjlRfVe.js rename to assets/chunks/VPLocalSearchBox.Bvi8a7xK.js index 95483ab0..147b5198 100644 --- a/assets/chunks/VPLocalSearchBox.ppjlRfVe.js +++ b/assets/chunks/VPLocalSearchBox.Bvi8a7xK.js @@ -1,4 +1,4 @@ -var At=Object.defineProperty;var Ct=(a,e,t)=>e in a?At(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>Ct(a,typeof e!="symbol"?e+"":e,t);import{V as nt,q as Be,ah as Mt,h as be,ai as rt,aj as Lt,ak as Dt,al as Pt,G as ce,d as zt,am as it,p as he,an as Vt,ao as jt,s as $t,ap as Bt,v as Le,P as ve,O as _e,aq as Wt,ar as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,as as Qt,at as Yt,au as Zt,c as Q,n as st,e as xe,B as at,F as ot,a as pe,t as me,av as Xt,aw as lt,ax as en,a5 as tn,aa as nn,ay as rn,_ as sn}from"./framework.DXGyWiRo.js";import{u as an,c as on}from"./theme.PItBixWd.js";const ln={root:()=>nt(()=>import("./@localSearchIndexroot.CEeliA4L.js"),[]),zh:()=>nt(()=>import("./@localSearchIndexzh.CpylHZY7.js"),[])};/*! +var At=Object.defineProperty;var Ct=(a,e,t)=>e in a?At(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>Ct(a,typeof e!="symbol"?e+"":e,t);import{V as nt,q as Be,ah as Mt,h as be,ai as rt,aj as Lt,ak as Dt,al as Pt,G as ce,d as zt,am as it,p as he,an as Vt,ao as jt,s as $t,ap as Bt,v as Le,P as ve,O as _e,aq as Wt,ar as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,as as Qt,at as Yt,au as Zt,c as Q,n as st,e as xe,B as at,F as ot,a as pe,t as me,av as Xt,aw as lt,ax as en,a5 as tn,aa as nn,ay as rn,_ as sn}from"./framework.CAXxHpAX.js";import{u as an,c as on}from"./theme.BAiG5Ik8.js";const ln={root:()=>nt(()=>import("./@localSearchIndexroot.Bq5adVMH.js"),[]),zh:()=>nt(()=>import("./@localSearchIndexzh.CpylHZY7.js"),[])};/*! * tabbable 6.4.0 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE */var bt=["input:not([inert]):not([inert] *)","select:not([inert]):not([inert] *)","textarea:not([inert]):not([inert] *)","a[href]:not([inert]):not([inert] *)","button:not([inert]):not([inert] *)","[tabindex]:not(slot):not([inert]):not([inert] *)","audio[controls]:not([inert]):not([inert] *)","video[controls]:not([inert]):not([inert] *)",'[contenteditable]:not([contenteditable="false"]):not([inert]):not([inert] *)',"details>summary:first-of-type:not([inert]):not([inert] *)","details:not([inert]):not([inert] *)"],ke=bt.join(","),yt=typeof Element>"u",ae=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!yt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Fe=function(e,t){var n;t===void 0&&(t=!0);var r=e==null||(n=e.getAttribute)===null||n===void 0?void 0:n.call(e,"inert"),s=r===""||r==="true",i=s||t&&e&&(typeof e.closest=="function"?e.closest("[inert]"):Fe(e.parentNode));return i},cn=function(e){var t,n=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return n===""||n==="true"},wt=function(e,t,n){if(Fe(e))return[];var r=Array.prototype.slice.apply(e.querySelectorAll(ke));return t&&ae.call(e,ke)&&r.unshift(e),r=r.filter(n),r},Re=function(e,t,n){for(var r=[],s=Array.from(e);s.length;){var i=s.shift();if(!Fe(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=Re(l,!0,n);n.flatten?r.push.apply(r,c):r.push({scopeParent:i,candidates:c})}else{var h=ae.call(i,ke);h&&n.filter(i)&&(t||!e.includes(i))&&r.push(i);var m=i.shadowRoot||typeof n.getShadowRoot=="function"&&n.getShadowRoot(i),p=!Fe(m,!1)&&(!n.shadowRootFilter||n.shadowRootFilter(i));if(m&&p){var b=Re(m===!0?i.children:m.children,!0,n);n.flatten?r.push.apply(r,b):r.push({scopeParent:i,candidates:b})}else s.unshift.apply(s,i.children)}}return r},St=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||cn(e))&&!St(e)?0:e.tabIndex},un=function(e,t){var n=se(e);return n<0&&t&&!St(e)?0:n},dn=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},_t=function(e){return e.tagName==="INPUT"},fn=function(e){return _t(e)&&e.type==="hidden"},hn=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(n){return n.tagName==="SUMMARY"});return t},vn=function(e,t){for(var n=0;nsummary:first-of-type"),o=i?e.parentElement:e;if(ae.call(o,"details:not([open]) *"))return!0;if(!n||n==="full"||n==="full-native"||n==="legacy-full"){if(typeof r=="function"){for(var l=e;e;){var c=e.parentElement,h=Ne(e);if(c&&!c.shadowRoot&&r(c)===!0)return ct(e);e.assignedSlot?e=e.assignedSlot:!c&&h!==e.ownerDocument?e=h.host:e=c}e=l}if(bn(e))return!e.getClientRects().length;if(n!=="legacy-full")return!0}else if(n==="non-zero-area")return ct(e);return!1},wn=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var n=0;n=0)},xt=function(e){var t=[],n=[];return e.forEach(function(r,s){var i=!!r.scopeParent,o=i?r.scopeParent:r,l=un(o,i),c=i?xt(r.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):n.push({documentOrder:s,tabIndex:l,item:r,isScope:i,content:c})}),n.sort(dn).reduce(function(r,s){return s.isScope?r.push.apply(r,s.content):r.push(s.content),r},[]).concat(t)},_n=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:Sn}):n=wt(e,t.includeContainer,We.bind(null,t)),xt(n)},xn=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:Oe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):n=wt(e,t.includeContainer,Oe.bind(null,t)),n},oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,ke)===!1?!1:We(t,e)},Tn=bt.concat("iframe:not([inert]):not([inert] *)").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,Tn)===!1?!1:Oe(t,e)};/*! diff --git a/assets/chunks/framework.CAXxHpAX.js b/assets/chunks/framework.CAXxHpAX.js new file mode 100644 index 00000000..b7296ed8 --- /dev/null +++ b/assets/chunks/framework.CAXxHpAX.js @@ -0,0 +1,19 @@ +/** +* @vue/shared v3.5.33 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function qs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ne={},Nt=[],Xe=()=>{},_i=()=>!1,fn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Bn=e=>e.startsWith("onUpdate:"),he=Object.assign,Gs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ll=Object.prototype.hasOwnProperty,Z=(e,t)=>ll.call(e,t),K=Array.isArray,Ft=e=>dn(e)==="[object Map]",bi=e=>dn(e)==="[object Set]",br=e=>dn(e)==="[object Date]",q=e=>typeof e=="function",oe=e=>typeof e=="string",Oe=e=>typeof e=="symbol",Q=e=>e!==null&&typeof e=="object",wi=e=>(Q(e)||q(e))&&q(e.then)&&q(e.catch),Si=Object.prototype.toString,dn=e=>Si.call(e),cl=e=>dn(e).slice(8,-1),Ti=e=>dn(e)==="[object Object]",Kn=e=>oe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,bt=qs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),qn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},al=/-\w/g,Ee=qn(e=>e.replace(al,t=>t.slice(1).toUpperCase())),ul=/\B([A-Z])/g,dt=qn(e=>e.replace(ul,"-$1").toLowerCase()),Gn=qn(e=>e.charAt(0).toUpperCase()+e.slice(1)),On=qn(e=>e?`on${Gn(e)}`:""),Ge=(e,t)=>!Object.is(e,t),Pn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Xs=e=>{const t=parseFloat(e);return isNaN(t)?e:t},fl=e=>{const t=oe(e)?Number(e):NaN;return isNaN(t)?e:t};let wr;const Xn=()=>wr||(wr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ys(e){if(K(e)){const t={};for(let n=0;n{if(n){const s=n.split(hl);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Js(e){let t="";if(oe(e))t=e;else if(K(e))for(let n=0;n!!(e&&e.__v_isRef===!0),_l=e=>oe(e)?e:e==null?"":K(e)||Q(e)&&(e.toString===Si||!q(e.toString))?Ci(e)?_l(e.value):JSON.stringify(e,Ai,2):String(e),Ai=(e,t)=>Ci(t)?Ai(e,t.value):Ft(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[as(s,i)+" =>"]=r,n),{})}:bi(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>as(n))}:Oe(t)?as(t):Q(t)&&!K(t)&&!Ti(t)?String(t):t,as=(e,t="")=>{var n;return Oe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.33 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let pe;class bl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=pe,!t&&pe&&(this.index=(pe.scopes||(pe.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0){if(pe===this)pe=this.prevScope;else{let t=pe;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(zt){let t=zt;for(zt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Jt;){let t=Jt;for(Jt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Li(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ii(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),er(s),Sl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Ps(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ni(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ni(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===nn)||(e.globalVersion=nn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ps(e))))return;e.flags|=2;const t=e.dep,n=re,s=He;re=e,He=!0;try{Li(e);const r=e.fn(e._value);(t.version===0||Ge(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{re=n,He=s,Ii(e),e.flags&=-3}}function er(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)er(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Sl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const Fi=[];function tt(){Fi.push(He),He=!1}function nt(){const e=Fi.pop();He=e===void 0?!0:e}function Sr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=n}}}let nn=0;class Tl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Yn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!re||!He||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new Tl(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,Hi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.deps=s)}return n}trigger(t){this.version++,nn++,this.notify(t)}notify(t){Qs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Zs()}}}function Hi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Hi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Fn=new WeakMap,wt=Symbol(""),Ls=Symbol(""),sn=Symbol("");function _e(e,t,n){if(He&&re){let s=Fn.get(e);s||Fn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Yn),r.map=s,r.key=n),r.track()}}function Ze(e,t,n,s,r,i){const o=Fn.get(e);if(!o){nn++;return}const l=c=>{c&&c.trigger()};if(Qs(),t==="clear")o.forEach(l);else{const c=K(e),u=c&&Kn(n);if(c&&n==="length"){const a=Number(s);o.forEach((d,m)=>{(m==="length"||m===sn||!Oe(m)&&m>=a)&&l(d)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),u&&l(o.get(sn)),t){case"add":c?u&&l(o.get("length")):(l(o.get(wt)),Ft(e)&&l(o.get(Ls)));break;case"delete":c||(l(o.get(wt)),Ft(e)&&l(o.get(Ls)));break;case"set":Ft(e)&&l(o.get(wt));break}}Zs()}function El(e,t){const n=Fn.get(e);return n&&n.get(t)}function Mt(e){const t=z(e);return t===e?t:(_e(t,"iterate",sn),Me(e)?t:t.map($e))}function Jn(e){return _e(e=z(e),"iterate",sn),e}function qe(e,t){return st(e)?jt(at(e)?$e(t):t):$e(t)}const xl={__proto__:null,[Symbol.iterator](){return fs(this,Symbol.iterator,e=>qe(this,e))},concat(...e){return Mt(this).concat(...e.map(t=>K(t)?Mt(t):t))},entries(){return fs(this,"entries",e=>(e[1]=qe(this,e[1]),e))},every(e,t){return Ye(this,"every",e,t,void 0,arguments)},filter(e,t){return Ye(this,"filter",e,t,n=>n.map(s=>qe(this,s)),arguments)},find(e,t){return Ye(this,"find",e,t,n=>qe(this,n),arguments)},findIndex(e,t){return Ye(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ye(this,"findLast",e,t,n=>qe(this,n),arguments)},findLastIndex(e,t){return Ye(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ye(this,"forEach",e,t,void 0,arguments)},includes(...e){return ds(this,"includes",e)},indexOf(...e){return ds(this,"indexOf",e)},join(e){return Mt(this).join(e)},lastIndexOf(...e){return ds(this,"lastIndexOf",e)},map(e,t){return Ye(this,"map",e,t,void 0,arguments)},pop(){return Bt(this,"pop")},push(...e){return Bt(this,"push",e)},reduce(e,...t){return Tr(this,"reduce",e,t)},reduceRight(e,...t){return Tr(this,"reduceRight",e,t)},shift(){return Bt(this,"shift")},some(e,t){return Ye(this,"some",e,t,void 0,arguments)},splice(...e){return Bt(this,"splice",e)},toReversed(){return Mt(this).toReversed()},toSorted(e){return Mt(this).toSorted(e)},toSpliced(...e){return Mt(this).toSpliced(...e)},unshift(...e){return Bt(this,"unshift",e)},values(){return fs(this,"values",e=>qe(this,e))}};function fs(e,t,n){const s=Jn(e),r=s[t]();return s!==e&&!Me(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const Cl=Array.prototype;function Ye(e,t,n,s,r,i){const o=Jn(e),l=o!==e&&!Me(e),c=o[t];if(c!==Cl[t]){const d=c.apply(e,i);return l?$e(d):d}let u=n;o!==e&&(l?u=function(d,m){return n.call(this,qe(e,d),m,e)}:n.length>2&&(u=function(d,m){return n.call(this,d,m,e)}));const a=c.call(o,u,s);return l&&r?r(a):a}function Tr(e,t,n,s){const r=Jn(e),i=r!==e&&!Me(e);let o=n,l=!1;r!==e&&(i?(l=s.length===0,o=function(u,a,d){return l&&(l=!1,u=qe(e,u)),n.call(this,u,qe(e,a),d,e)}):n.length>3&&(o=function(u,a,d){return n.call(this,u,a,d,e)}));const c=r[t](o,...s);return l?qe(e,c):c}function ds(e,t,n){const s=z(e);_e(s,"iterate",sn);const r=s[t](...n);return(r===-1||r===!1)&&zn(n[0])?(n[0]=z(n[0]),s[t](...n)):r}function Bt(e,t,n=[]){tt(),Qs();const s=z(e)[t].apply(e,n);return Zs(),nt(),s}const Al=qs("__proto__,__v_isRef,__isVue"),Di=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Oe));function Rl(e){Oe(e)||(e=String(e));const t=z(this);return _e(t,"has",e),t.hasOwnProperty(e)}class $i{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?$l:Wi:i?ki:Vi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=K(t);if(!r){let c;if(o&&(c=xl[n]))return c;if(n==="hasOwnProperty")return Rl}const l=Reflect.get(t,n,ae(t)?t:s);if((Oe(n)?Di.has(n):Al(n))||(r||_e(t,"get",n),i))return l;if(ae(l)){const c=o&&Kn(n)?l:l.value;return r&&Q(c)?rn(c):c}return Q(l)?r?rn(l):$t(l):l}}class ji extends $i{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const o=K(t)&&Kn(n);if(!this._isShallow){const u=st(i);if(!Me(s)&&!st(s)&&(i=z(i),s=z(s)),!o&&ae(i)&&!ae(s))return u||(i.value=s),!0}const l=o?Number(n)e,_n=e=>Reflect.getPrototypeOf(e);function Il(e,t,n){return function(...s){const r=this.__v_raw,i=z(r),o=Ft(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),a=n?Is:t?jt:$e;return!t&&_e(i,"iterate",c?Ls:wt),he(Object.create(u),{next(){const{value:d,done:m}=u.next();return m?{value:d,done:m}:{value:l?[a(d[0]),a(d[1])]:a(d),done:m}}})}}function bn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Nl(e,t){const n={get(r){const i=this.__v_raw,o=z(i),l=z(r);e||(Ge(r,l)&&_e(o,"get",r),_e(o,"get",l));const{has:c}=_n(o),u=t?Is:e?jt:$e;if(c.call(o,r))return u(i.get(r));if(c.call(o,l))return u(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&_e(z(r),"iterate",wt),r.size},has(r){const i=this.__v_raw,o=z(i),l=z(r);return e||(Ge(r,l)&&_e(o,"has",r),_e(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=z(l),u=t?Is:e?jt:$e;return!e&&_e(c,"iterate",wt),l.forEach((a,d)=>r.call(i,u(a),u(d),o))}};return he(n,e?{add:bn("add"),set:bn("set"),delete:bn("delete"),clear:bn("clear")}:{add(r){const i=z(this),o=_n(i),l=z(r),c=!t&&!Me(r)&&!st(r)?l:r;return o.has.call(i,c)||Ge(r,c)&&o.has.call(i,r)||Ge(l,c)&&o.has.call(i,l)||(i.add(c),Ze(i,"add",c,c)),this},set(r,i){!t&&!Me(i)&&!st(i)&&(i=z(i));const o=z(this),{has:l,get:c}=_n(o);let u=l.call(o,r);u||(r=z(r),u=l.call(o,r));const a=c.call(o,r);return o.set(r,i),u?Ge(i,a)&&Ze(o,"set",r,i):Ze(o,"add",r,i),this},delete(r){const i=z(this),{has:o,get:l}=_n(i);let c=o.call(i,r);c||(r=z(r),c=o.call(i,r)),l&&l.call(i,r);const u=i.delete(r);return c&&Ze(i,"delete",r,void 0),u},clear(){const r=z(this),i=r.size!==0,o=r.clear();return i&&Ze(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Il(r,e,t)}),n}function tr(e,t){const n=Nl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const Fl={get:tr(!1,!1)},Hl={get:tr(!1,!0)},Dl={get:tr(!0,!1)};const Vi=new WeakMap,ki=new WeakMap,Wi=new WeakMap,$l=new WeakMap;function jl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Vl(e){return e.__v_skip||!Object.isExtensible(e)?0:jl(cl(e))}function $t(e){return st(e)?e:nr(e,!1,Ol,Fl,Vi)}function kl(e){return nr(e,!1,Ll,Hl,ki)}function rn(e){return nr(e,!0,Pl,Dl,Wi)}function nr(e,t,n,s,r){if(!Q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Vl(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function at(e){return st(e)?at(e.__v_raw):!!(e&&e.__v_isReactive)}function st(e){return!!(e&&e.__v_isReadonly)}function Me(e){return!!(e&&e.__v_isShallow)}function zn(e){return e?!!e.__v_raw:!1}function z(e){const t=e&&e.__v_raw;return t?z(t):e}function Ln(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&Ei(e,"__v_skip",!0),e}const $e=e=>Q(e)?$t(e):e,jt=e=>Q(e)?rn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function De(e){return Ui(e,!1)}function xe(e){return Ui(e,!0)}function Ui(e,t){return ae(e)?e:new Wl(e,t)}class Wl{constructor(t,n){this.dep=new Yn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:z(t),this._value=n?t:$e(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Me(t)||st(t);t=s?t:z(t),Ge(t,n)&&(this._rawValue=t,this._value=s?t:$e(t),this.dep.trigger())}}function Qn(e){return ae(e)?e.value:e}function ce(e){return q(e)?e():Qn(e)}const Ul={get:(e,t,n)=>t==="__v_raw"?e:Qn(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Bi(e){return at(e)?e:new Proxy(e,Ul)}class Bl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Yn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Kl(e){return new Bl(e)}class ql{constructor(t,n,s){this._object=t,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._key=Oe(n)?n:String(n),this._raw=z(t);let r=!0,i=t;if(!K(t)||Oe(this._key)||!Kn(this._key))do r=!zn(i)||Me(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=Qn(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&ae(this._raw[this._key])){const n=this._object[this._key];if(ae(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return El(this._raw,this._key)}}class Gl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Xl(e,t,n){return ae(e)?e:q(e)?new Gl(e):Q(e)&&arguments.length>1?Yl(e,t,n):De(e)}function Yl(e,t,n){return new ql(e,t,n)}class Jl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Yn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=nn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&re!==this)return Pi(this,!0),!0}get value(){const t=this.dep.track();return Ni(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function zl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new Jl(s,r,n)}const wn={},Hn=new WeakMap;let yt;function Ql(e,t=!1,n=yt){if(n){let s=Hn.get(n);s||Hn.set(n,s=[]),s.push(e)}}function Zl(e,t,n=ne){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,u=g=>r?g:Me(g)||r===!1||r===0?et(g,1):et(g);let a,d,m,_,b=!1,y=!1;if(ae(e)?(d=()=>e.value,b=Me(e)):at(e)?(d=()=>u(e),b=!0):K(e)?(y=!0,b=e.some(g=>at(g)||Me(g)),d=()=>e.map(g=>{if(ae(g))return g.value;if(at(g))return u(g);if(q(g))return c?c(g,2):g()})):q(e)?t?d=c?()=>c(e,2):e:d=()=>{if(m){tt();try{m()}finally{nt()}}const g=yt;yt=a;try{return c?c(e,3,[_]):e(_)}finally{yt=g}}:d=Xe,t&&r){const g=d,M=r===!0?1/0:r;d=()=>et(g(),M)}const D=Ri(),I=()=>{a.stop(),D&&D.active&&Gs(D.effects,a)};if(i&&t){const g=t;t=(...M)=>{g(...M),I()}}let O=y?new Array(e.length).fill(wn):wn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const M=a.run();if(r||b||(y?M.some((W,S)=>Ge(W,O[S])):Ge(M,O))){m&&m();const W=yt;yt=a;try{const S=[M,O===wn?void 0:y&&O[0]===wn?[]:O,_];O=M,c?c(t,3,S):t(...S)}finally{yt=W}}}else a.run()};return l&&l(p),a=new Mi(d),a.scheduler=o?()=>o(p,!1):p,_=g=>Ql(g,!1,a),m=a.onStop=()=>{const g=Hn.get(a);if(g){if(c)c(g,4);else for(const M of g)M();Hn.delete(a)}},t?s?p(!0):O=a.run():o?o(p.bind(null,!0),!0):a.run(),I.pause=a.pause.bind(a),I.resume=a.resume.bind(a),I.stop=I,I}function et(e,t=1/0,n){if(t<=0||!Q(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,ae(e))et(e.value,t,n);else if(K(e))for(let s=0;s{et(s,t,n)});else if(Ti(e)){for(const s in e)et(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&et(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.33 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function hn(e,t,n,s){try{return s?e(...s):e()}catch(r){pn(r,t,n)}}function je(e,t,n,s){if(q(e)){const r=hn(e,t,n,s);return r&&wi(r)&&r.catch(i=>{pn(i,t,n)}),r}if(K(e)){const r=[];for(let i=0;i>>1,r=Se[s],i=on(r);i=on(n)?Se.push(e):Se.splice(tc(t),0,e),e.flags|=1,qi()}}function qi(){Dn||(Dn=Ki.then(Gi))}function nc(e){K(e)?Ht.push(...e):ct&&e.id===-1?ct.splice(Pt+1,0,e):e.flags&1||(Ht.push(e),e.flags|=1),qi()}function Er(e,t,n=Ue+1){for(;non(n)-on(s));if(Ht.length=0,ct){ct.push(...t);return}for(ct=t,Pt=0;Pte.id==null?e.flags&2?-1:1/0:e.id;function Gi(e){try{for(Ue=0;Ue{s._d&&Wn(-1);const i=jn(t);let o;try{o=e(...r)}finally{jn(i),s._d&&Wn(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function qu(e,t){if(ye===null)return e;const n=rs(ye),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&q(t)?t.call(s&&s.proxy):t}}function Yi(){return!!(At()||Et)}const ic=Symbol.for("v-scx"),oc=()=>St(ic);function rr(e,t){return es(e,null,t)}function Gu(e,t){return es(e,null,{flush:"post"})}function Ne(e,t,n){return es(e,t,n)}function es(e,t,n=ne){const{immediate:s,deep:r,flush:i,once:o}=n,l=he({},n),c=t&&s||!t&&i!=="post";let u;if(Vt){if(i==="sync"){const _=oc();u=_.__watcherHandles||(_.__watcherHandles=[])}else if(!c){const _=()=>{};return _.stop=Xe,_.resume=Xe,_.pause=Xe,_}}const a=me;l.call=(_,b,y)=>je(_,a,b,y);let d=!1;i==="post"?l.scheduler=_=>{we(_,a&&a.suspense)}:i!=="sync"&&(d=!0,l.scheduler=(_,b)=>{b?_():sr(_)}),l.augmentJob=_=>{t&&(_.flags|=4),d&&(_.flags|=2,a&&(_.id=a.uid,_.i=a))};const m=Zl(e,t,l);return Vt&&(u?u.push(m):c&&m()),m}function lc(e,t,n){const s=this.proxy,r=oe(e)?e.includes(".")?Ji(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=mn(this),l=es(r,i.bind(s),n);return o(),l}function Ji(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,vt=e=>e&&(e.disabled||e.disabled===""),cc=e=>e&&(e.defer||e.defer===""),xr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Cr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Ns=(e,t)=>{const n=e&&e.to;return oe(n)?t?t(n):null:n},ac={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,u){const{mc:a,pc:d,pbc:m,o:{insert:_,querySelector:b,createText:y,createComment:D,parentNode:I}}=u,O=vt(t.props);let{dynamicChildren:p}=t;const g=(S,j,T)=>{S.shapeFlag&16&&a(S.children,j,T,r,i,o,l,c)},M=(S=t)=>{const j=vt(S.props),T=S.target=Ns(S.props,b),P=Fs(T,S,y,_);T&&(o!=="svg"&&xr(T)?o="svg":o!=="mathml"&&Cr(T)&&(o="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(T),j||(g(S,T,P),Gt(S,!1)))},W=S=>{const j=()=>{if(lt.get(S)===j){if(lt.delete(S),vt(S.props)){const T=I(S.el)||n;g(S,T,S.anchor),Gt(S,!0)}M(S)}};lt.set(S,j),we(j,i)};if(e==null){const S=t.el=y(""),j=t.anchor=y("");if(_(S,n,s),_(j,n,s),cc(t.props)||i&&i.pendingBranch){W(t);return}O&&(g(t,n,j),Gt(t,!0)),M()}else{t.el=e.el;const S=t.anchor=e.anchor,j=lt.get(e);if(j){j.flags|=8,lt.delete(e),W(t);return}t.targetStart=e.targetStart;const T=t.target=e.target,P=t.targetAnchor=e.targetAnchor,R=vt(e.props),w=R?n:T,F=R?S:P;if(o==="svg"||xr(T)?o="svg":(o==="mathml"||Cr(T))&&(o="mathml"),p?(m(e.dynamicChildren,p,w,r,i,o,l),ar(e,t,!0)):c||d(e,t,w,F,r,i,o,l,!1),O)R?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):Sn(t,n,S,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const Y=t.target=Ns(t.props,b);Y&&Sn(t,Y,null,u,0)}else R&&Sn(t,T,P,u,1);Gt(t,O)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:u,targetAnchor:a,target:d,props:m}=e;let _=i||!vt(m);const b=lt.get(e);if(b&&(b.flags|=8,lt.delete(e),_=!1),d&&(r(u),r(a)),i&&r(c),o&16)for(let y=0;y{e.isMounted=!0}),io(()=>{e.isUnmounting=!0}),e}const Pe=[Function,Array],Zi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Pe,onEnter:Pe,onAfterEnter:Pe,onEnterCancelled:Pe,onBeforeLeave:Pe,onLeave:Pe,onAfterLeave:Pe,onLeaveCancelled:Pe,onBeforeAppear:Pe,onAppear:Pe,onAfterAppear:Pe,onAppearCancelled:Pe},eo=e=>{const t=e.subTree;return t.component?eo(t.component):t},dc={name:"BaseTransition",props:Zi,setup(e,{slots:t}){const n=At(),s=fc();return()=>{const r=t.default&&so(t.default(),!0),i=r&&r.length?to(r):n.subTree?na():void 0;if(!i)return;const o=z(e),{mode:l}=o;if(s.isLeaving)return hs(i);const c=Ar(i);if(!c)return hs(i);let u=Hs(c,o,s,n,d=>u=d);c.type!==ge&&ln(c,u);let a=n.subTree&&Ar(n.subTree);if(a&&a.type!==ge&&!_t(a,c)&&eo(n).type!==ge){let d=Hs(a,o,s,n);if(ln(a,d),l==="out-in"&&c.type!==ge)return s.isLeaving=!0,d.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,a=void 0},hs(i);l==="in-out"&&c.type!==ge?d.delayLeave=(m,_,b)=>{const y=no(s,a);y[String(a.key)]=a,m[Ke]=()=>{_(),m[Ke]=void 0,delete u.delayedLeave,a=void 0},u.delayedLeave=()=>{b(),delete u.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function to(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ge){t=n;break}}return t}const hc=dc;function no(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Hs(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:m,onLeave:_,onAfterLeave:b,onLeaveCancelled:y,onBeforeAppear:D,onAppear:I,onAfterAppear:O,onAppearCancelled:p}=t,g=String(e.key),M=no(n,e),W=(T,P)=>{T&&je(T,s,9,P)},S=(T,P)=>{const R=P[1];W(T,P),K(T)?T.every(w=>w.length<=1)&&R():T.length<=1&&R()},j={mode:o,persisted:l,beforeEnter(T){let P=c;if(!n.isMounted)if(i)P=D||c;else return;T[Ke]&&T[Ke](!0);const R=M[g];R&&_t(e,R)&&R.el[Ke]&&R.el[Ke](),W(P,[T])},enter(T){if(M[g]===e)return;let P=u,R=a,w=d;if(!n.isMounted)if(i)P=I||u,R=O||a,w=p||d;else return;let F=!1;T[Kt]=le=>{F||(F=!0,le?W(w,[T]):W(R,[T]),j.delayedLeave&&j.delayedLeave(),T[Kt]=void 0)};const Y=T[Kt].bind(null,!1);P?S(P,[T,Y]):Y()},leave(T,P){const R=String(e.key);if(T[Kt]&&T[Kt](!0),n.isUnmounting)return P();W(m,[T]);let w=!1;T[Ke]=Y=>{w||(w=!0,P(),Y?W(y,[T]):W(b,[T]),T[Ke]=void 0,M[R]===e&&delete M[R])};const F=T[Ke].bind(null,!1);M[R]=e,_?S(_,[T,F]):F()},clone(T){const P=Hs(T,t,n,s,r);return r&&r(P),P}};return j}function hs(e){if(gn(e))return e=ut(e),e.children=null,e}function Ar(e){if(!gn(e))return Qi(e.type)&&e.children?to(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function ln(e,t){e.shapeFlag&6&&e.component?(e.transition=t,ln(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function so(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iDt(y,t&&(K(t)?t[D]:t),n,s,r));return}if(Tt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Dt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?rs(s.component):s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,a=l.refs===ne?l.refs={}:l.refs,d=l.setupState,m=z(d),_=d===ne?_i:y=>Rr(a,y)?!1:Z(m,y),b=(y,D)=>!(D&&Rr(a,D));if(u!=null&&u!==c){if(Mr(t),oe(u))a[u]=null,_(u)&&(d[u]=null);else if(ae(u)){const y=t;b(u,y.k)&&(u.value=null),y.k&&(a[y.k]=null)}}if(q(c))hn(c,l,12,[o,a]);else{const y=oe(c),D=ae(c);if(y||D){const I=()=>{if(e.f){const O=y?_(c)?d[c]:a[c]:b()||!e.k?c.value:a[e.k];if(r)K(O)&&Gs(O,i);else if(K(O))O.includes(i)||O.push(i);else if(y)a[c]=[i],_(c)&&(d[c]=a[c]);else{const p=[i];b(c,e.k)&&(c.value=p),e.k&&(a[e.k]=p)}}else y?(a[c]=o,_(c)&&(d[c]=o)):D&&(b(c,e.k)&&(c.value=o),e.k&&(a[e.k]=o))};if(o){const O=()=>{I(),Vn.delete(e)};O.id=-1,Vn.set(e,O),we(O,n)}else Mr(e),I()}}}function Mr(e){const t=Vn.get(e);t&&(t.flags|=8,Vn.delete(e))}let Or=!1;const Ot=()=>{Or||(console.error("Hydration completed but contains mismatches."),Or=!0)},pc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",gc=e=>e.namespaceURI.includes("MathML"),Tn=e=>{if(e.nodeType===1){if(pc(e))return"svg";if(gc(e))return"mathml"}},It=e=>e.nodeType===8;function mc(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),$n(),g._vnode=p;return}d(g.firstChild,p,null,null,null),$n(),g._vnode=p},d=(p,g,M,W,S,j=!1)=>{j=j||!!g.dynamicChildren;const T=It(p)&&p.data==="[",P=()=>y(p,g,M,W,S,T),{type:R,ref:w,shapeFlag:F,patchFlag:Y}=g;let le=p.nodeType;g.el=p,Y===-2&&(j=!1,g.dynamicChildren=null);let U=null;switch(R){case xt:le!==3?g.children===""?(c(g.el=r(""),o(p),p),U=p):U=P():(p.data!==g.children&&(Ot(),p.data=g.children),U=i(p));break;case ge:O(p)?(U=i(p),I(g.el=p.content.firstChild,p,M)):le!==8||T?U=P():U=i(p);break;case Zt:if(T&&(p=i(p),le=p.nodeType),le===1||le===3){U=p;const X=!g.children.length;for(let V=0;V{j=j||!!g.dynamicChildren;const{type:T,props:P,patchFlag:R,shapeFlag:w,dirs:F,transition:Y}=g,le=T==="input"||T==="option";if(le||R!==-1){F&&Be(g,null,M,"created");let U=!1;if(O(p)){U=Co(null,Y)&&M&&M.vnode.props&&M.vnode.props.appear;const V=p.content.firstChild;if(U){const ee=V.getAttribute("class");ee&&(V.$cls=ee),Y.beforeEnter(V)}I(V,p,M),g.el=p=V}if(w&16&&!(P&&(P.innerHTML||P.textContent))){let V=_(p.firstChild,g,p,M,W,S,j);for(;V;){En(p,1)||Ot();const ee=V;V=V.nextSibling,l(ee)}}else if(w&8){let V=g.children;V[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(V=V.slice(1));const{textContent:ee}=p;ee!==V&&ee!==V.replace(/\r\n|\r/g,` +`)&&(En(p,0)||Ot(),p.textContent=g.children)}if(P){if(le||!j||R&48){const V=p.tagName.includes("-");for(const ee in P)(le&&(ee.endsWith("value")||ee==="indeterminate")||fn(ee)&&!bt(ee)||ee[0]==="."||V&&!bt(ee))&&s(p,ee,null,P[ee],void 0,M)}else if(P.onClick)s(p,"onClick",null,P.onClick,void 0,M);else if(R&4&&at(P.style))for(const V in P.style)P.style[V]}let X;(X=P&&P.onVnodeBeforeMount)&&Le(X,M,g),F&&Be(g,null,M,"beforeMount"),((X=P&&P.onVnodeMounted)||F||U)&&Oo(()=>{X&&Le(X,M,g),U&&Y.enter(p),F&&Be(g,null,M,"mounted")},W)}return p.nextSibling},_=(p,g,M,W,S,j,T)=>{T=T||!!g.dynamicChildren;const P=g.children,R=P.length;for(let w=0;w{const{slotScopeIds:T}=g;T&&(S=S?S.concat(T):T);const P=o(p),R=_(i(p),g,P,M,W,S,j);return R&&It(R)&&R.data==="]"?i(g.anchor=R):(Ot(),c(g.anchor=u("]"),P,R),R)},y=(p,g,M,W,S,j)=>{if(En(p.parentElement,1)||Ot(),g.el=null,j){const R=D(p);for(;;){const w=i(p);if(w&&w!==R)l(w);else break}}const T=i(p),P=o(p);return l(p),n(null,g,P,T,M,W,Tn(P),S),M&&(M.vnode.el=g.el,mo(M,g.el)),T},D=(p,g="[",M="]")=>{let W=0;for(;p;)if(p=i(p),p&&It(p)&&(p.data===g&&W++,p.data===M)){if(W===0)return i(p);W--}return p},I=(p,g,M)=>{const W=g.parentNode;W&&W.replaceChild(p,g);let S=M;for(;S;)S.vnode.el===g&&(S.vnode.el=S.subTree.el=p),S=S.parent},O=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,d]}const Pr="data-allow-mismatch",yc={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function En(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Pr);)e=e.parentElement;const n=e&&e.getAttribute(Pr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:s.includes(yc[t])}}Xn().requestIdleCallback;Xn().cancelIdleCallback;function vc(e,t){if(It(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(It(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const Tt=e=>!!e.type.__asyncLoader;function Yu(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let u=null,a,d=0;const m=()=>(d++,u=null,_()),_=()=>{let b;return u||(b=u=t().catch(y=>{if(y=y instanceof Error?y:new Error(String(y)),c)return new Promise((D,I)=>{c(y,()=>D(m()),()=>I(y),d+1)});throw y}).then(y=>b!==u&&u?u:(y&&(y.__esModule||y[Symbol.toStringTag]==="Module")&&(y=y.default),a=y,y)))};return ir({name:"AsyncComponentWrapper",__asyncLoader:_,__asyncHydrate(b,y,D){let I=!1;(y.bu||(y.bu=[])).push(()=>I=!0);const O=()=>{I||D()},p=i?()=>{const g=i(O,M=>vc(b,M));g&&(y.bum||(y.bum=[])).push(g)}:O;a?p():_().then(()=>!y.isUnmounted&&p())},get __asyncResolved(){return a},setup(){const b=me;if(or(b),a)return()=>xn(a,b);const y=p=>{u=null,pn(p,b,13,!s)};if(l&&b.suspense||Vt)return _().then(p=>()=>xn(p,b)).catch(p=>(y(p),()=>s?fe(s,{error:p}):null));const D=De(!1),I=De(),O=De(!!r);return r&&setTimeout(()=>{O.value=!1},r),o!=null&&setTimeout(()=>{if(!D.value&&!I.value){const p=new Error(`Async component timed out after ${o}ms.`);y(p),I.value=p}},o),_().then(()=>{D.value=!0,b.parent&&gn(b.parent.vnode)&&b.parent.update()}).catch(p=>{y(p),I.value=p}),()=>{if(D.value&&a)return xn(a,b);if(I.value&&s)return fe(s,{error:I.value});if(n&&!O.value)return xn(n,b)}}})}function xn(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=fe(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const gn=e=>e.type.__isKeepAlive;function _c(e,t){ro(e,"a",t)}function bc(e,t){ro(e,"da",t)}function ro(e,t,n=me){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(ts(t,s,n),n){let r=n.parent;for(;r&&r.parent;)gn(r.parent.vnode)&&wc(s,t,n,r),r=r.parent}}function wc(e,t,n,s){const r=ts(t,e,s,!0);ns(()=>{Gs(s[t],r)},n)}function ts(e,t,n=me,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{tt();const l=mn(n),c=je(t,n,e,o);return l(),nt(),c});return s?r.unshift(i):r.push(i),i}}const it=e=>(t,n=me)=>{(!Vt||e==="sp")&&ts(e,(...s)=>t(...s),n)},Sc=it("bm"),kt=it("m"),Tc=it("bu"),Ec=it("u"),io=it("bum"),ns=it("um"),xc=it("sp"),Cc=it("rtg"),Ac=it("rtc");function Rc(e,t=me){ts("ec",e,t)}const oo="components";function Ju(e,t){return co(oo,e,!0,t)||e}const lo=Symbol.for("v-ndc");function zu(e){return oe(e)?co(oo,e,!1)||e:e||lo}function co(e,t,n=!0,s=!1){const r=ye||me;if(r){const i=r.type;{const l=ua(i,!1);if(l&&(l===t||l===Ee(t)||l===Gn(Ee(t))))return i}const o=Lr(r[e]||i[e],t)||Lr(r.appContext[e],t);return!o&&s?i:o}}function Lr(e,t){return e&&(e[t]||e[Ee(t)]||e[Gn(Ee(t))])}function Qu(e,t,n,s){let r;const i=n,o=K(e);if(o||oe(e)){const l=o&&at(e);let c=!1,u=!1;l&&(c=!Me(e),u=st(e),e=Jn(e)),r=new Array(e.length);for(let a=0,d=e.length;at(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;c0;return t!=="default"&&(n.name=t),ks(),Ws(Te,null,[fe("slot",n,s&&s())],u?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),ks();const o=i&&ao(i(n)),l=n.key||o&&o.key,c=Ws(Te,{key:(l&&!Oe(l)?l:`_${t}`)+(!o&&s?"_fb":"")},o||(s?s():[]),o&&e._===1?64:-2);return!r&&c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),i&&i._c&&(i._d=!0),c}function ao(e){return e.some(t=>an(t)?!(t.type===ge||t.type===Te&&!ao(t.children)):!0)?e:null}function ef(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:On(s)]=e[s];return n}const Ds=e=>e?Fo(e)?rs(e):Ds(e.parent):null,Qt=he(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ds(e.parent),$root:e=>Ds(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>fo(e),$forceUpdate:e=>e.f||(e.f=()=>{sr(e.update)}),$nextTick:e=>e.n||(e.n=Zn.bind(e.proxy)),$watch:e=>lc.bind(e)}),ps=(e,t)=>e!==ne&&!e.__isScriptSetup&&Z(e,t),Mc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;if(t[0]!=="$"){const m=o[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ps(s,t))return o[t]=1,s[t];if(r!==ne&&Z(r,t))return o[t]=2,r[t];if(Z(i,t))return o[t]=3,i[t];if(n!==ne&&Z(n,t))return o[t]=4,n[t];$s&&(o[t]=0)}}const u=Qt[t];let a,d;if(u)return t==="$attrs"&&_e(e.attrs,"get",""),u(e);if((a=l.__cssModules)&&(a=a[t]))return a;if(n!==ne&&Z(n,t))return o[t]=4,n[t];if(d=c.config.globalProperties,Z(d,t))return d[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ps(r,t)?(r[t]=n,!0):s!==ne&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:o}},l){let c;return!!(n[l]||e!==ne&&l[0]!=="$"&&Z(e,l)||ps(t,l)||Z(i,l)||Z(s,l)||Z(Qt,l)||Z(r.config.globalProperties,l)||(c=o.__cssModules)&&c[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function tf(){return Oc().slots}function Oc(e){const t=At();return t.setupContext||(t.setupContext=Do(t))}function Ir(e){return K(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let $s=!0;function Pc(e){const t=fo(e),n=e.proxy,s=e.ctx;$s=!1,t.beforeCreate&&Nr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:a,beforeMount:d,mounted:m,beforeUpdate:_,updated:b,activated:y,deactivated:D,beforeDestroy:I,beforeUnmount:O,destroyed:p,unmounted:g,render:M,renderTracked:W,renderTriggered:S,errorCaptured:j,serverPrefetch:T,expose:P,inheritAttrs:R,components:w,directives:F,filters:Y}=t;if(u&&Lc(u,s,null),o)for(const X in o){const V=o[X];q(V)&&(s[X]=V.bind(n))}if(r){const X=r.call(n,n);Q(X)&&(e.data=$t(X))}if($s=!0,i)for(const X in i){const V=i[X],ee=q(V)?V.bind(n,n):q(V.get)?V.get.bind(n,n):Xe,yn=!q(V)&&q(V.set)?V.set.bind(n):Xe,ht=ie({get:ee,set:yn});Object.defineProperty(s,X,{enumerable:!0,configurable:!0,get:()=>ht.value,set:ke=>ht.value=ke})}if(l)for(const X in l)uo(l[X],s,n,X);if(c){const X=q(c)?c.call(n):c;Reflect.ownKeys(X).forEach(V=>{rc(V,X[V])})}a&&Nr(a,e,"c");function U(X,V){K(V)?V.forEach(ee=>X(ee.bind(n))):V&&X(V.bind(n))}if(U(Sc,d),U(kt,m),U(Tc,_),U(Ec,b),U(_c,y),U(bc,D),U(Rc,j),U(Ac,W),U(Cc,S),U(io,O),U(ns,g),U(xc,T),K(P))if(P.length){const X=e.exposed||(e.exposed={});P.forEach(V=>{Object.defineProperty(X,V,{get:()=>n[V],set:ee=>n[V]=ee,enumerable:!0})})}else e.exposed||(e.exposed={});M&&e.render===Xe&&(e.render=M),R!=null&&(e.inheritAttrs=R),w&&(e.components=w),F&&(e.directives=F),T&&or(e)}function Lc(e,t,n=Xe){K(e)&&(e=js(e));for(const s in e){const r=e[s];let i;Q(r)?"default"in r?i=St(r.from||s,r.default,!0):i=St(r.from||s):i=St(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Nr(e,t,n){je(K(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function uo(e,t,n,s){let r=s.includes(".")?Ji(n,s):()=>n[s];if(oe(e)){const i=t[e];q(i)&&Ne(r,i)}else if(q(e))Ne(r,e.bind(n));else if(Q(e))if(K(e))e.forEach(i=>uo(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Ne(r,i,e)}}function fo(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>kn(c,u,o,!0)),kn(c,t,o)),Q(t)&&i.set(t,c),c}function kn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&kn(e,i,n,!0),r&&r.forEach(o=>kn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Ic[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Ic={data:Fr,props:Hr,emits:Hr,methods:Xt,computed:Xt,beforeCreate:be,created:be,beforeMount:be,mounted:be,beforeUpdate:be,updated:be,beforeDestroy:be,beforeUnmount:be,destroyed:be,unmounted:be,activated:be,deactivated:be,errorCaptured:be,serverPrefetch:be,components:Xt,directives:Xt,watch:Fc,provide:Fr,inject:Nc};function Fr(e,t){return t?e?function(){return he(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Nc(e,t){return Xt(js(e),js(t))}function js(e){if(K(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ee(t)}Modifiers`]||e[`${dt(t)}Modifiers`];function jc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ne;let r=n;const i=t.startsWith("update:"),o=i&&$c(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>oe(a)?a.trim():a)),o.number&&(r=n.map(Xs)));let l,c=s[l=On(t)]||s[l=On(Ee(t))];!c&&i&&(c=s[l=On(dt(t))]),c&&je(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,je(u,e,6,r)}}const Vc=new WeakMap;function po(e,t,n=!1){const s=n?Vc:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=u=>{const a=po(u,t,!0);a&&(l=!0,he(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(Q(e)&&s.set(e,null),null):(K(i)?i.forEach(c=>o[c]=null):he(o,i),Q(e)&&s.set(e,o),o)}function ss(e,t){return!e||!fn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,dt(t))||Z(e,t))}function gs(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:a,props:d,data:m,setupState:_,ctx:b,inheritAttrs:y}=e,D=jn(e);let I,O;try{if(n.shapeFlag&4){const g=r||s,M=g;I=Ie(u.call(M,g,a,d,_,m,b)),O=l}else{const g=t;I=Ie(g.length>1?g(d,{attrs:l,slots:o,emit:c}):g(d,null)),O=t.props?l:kc(l)}}catch(g){en.length=0,pn(g,e,1),I=fe(ge)}let p=I;if(O&&y!==!1){const g=Object.keys(O),{shapeFlag:M}=p;g.length&&M&7&&(i&&g.some(Bn)&&(O=Wc(O,i)),p=ut(p,O,!1,!0))}return n.dirs&&(p=ut(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&ln(p,n.transition),I=p,jn(D),I}const kc=e=>{let t;for(const n in e)(n==="class"||n==="style"||fn(n))&&((t||(t={}))[n]=e[n]);return t},Wc=(e,t)=>{const n={};for(const s in e)(!Bn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Uc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Dr(s,o,u):!!o;if(c&8){const a=t.dynamicProps;for(let d=0;dObject.create(yo),_o=e=>Object.getPrototypeOf(e)===yo;function Bc(e,t,n,s=!1){const r={},i=vo();e.propsDefaults=Object.create(null),bo(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:kl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Kc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=z(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let d=0;d{c=!0;const[m,_]=wo(d,t,!0);he(o,m),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return Q(e)&&s.set(e,Nt),Nt;if(K(i))for(let a=0;ae==="_"||e==="_ctx"||e==="$stable",cr=e=>K(e)?e.map(Ie):[Ie(e)],Gc=(e,t,n)=>{if(t._n)return t;const s=sc((...r)=>cr(t(...r)),n);return s._c=!1,s},So=(e,t,n)=>{const s=e._ctx;for(const r in e){if(lr(r))continue;const i=e[r];if(q(i))t[r]=Gc(r,i,s);else if(i!=null){const o=cr(i);t[r]=()=>o}}},To=(e,t)=>{const n=cr(t);e.slots.default=()=>n},Eo=(e,t,n)=>{for(const s in t)(n||!lr(s))&&(e[s]=t[s])},Xc=(e,t,n)=>{const s=e.slots=vo();if(e.vnode.shapeFlag&32){const r=t._;r?(Eo(s,t,n),n&&Ei(s,"_",r,!0)):So(t,s)}else t&&To(e,t)},Yc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ne;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:Eo(r,t,n):(i=!t.$stable,So(t,r)),o=t}else t&&(To(e,t),o={default:1});if(i)for(const l in r)!lr(l)&&o[l]==null&&delete r[l]},we=Oo;function Jc(e){return xo(e)}function zc(e){return xo(e,mc)}function xo(e,t){const n=Xn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:a,parentNode:d,nextSibling:m,setScopeId:_=Xe,insertStaticContent:b}=e,y=(f,h,v,A=null,E=null,x=null,H=void 0,N=null,L=!!h.dynamicChildren)=>{if(f===h)return;f&&!_t(f,h)&&(A=vn(f),ke(f,E,x,!0),f=null),h.patchFlag===-2&&(L=!1,h.dynamicChildren=null);const{type:C,ref:B,shapeFlag:$}=h;switch(C){case xt:D(f,h,v,A);break;case ge:I(f,h,v,A);break;case Zt:f==null&&O(h,v,A,H);break;case Te:w(f,h,v,A,E,x,H,N,L);break;default:$&1?M(f,h,v,A,E,x,H,N,L):$&6?F(f,h,v,A,E,x,H,N,L):($&64||$&128)&&C.process(f,h,v,A,E,x,H,N,L,Rt)}B!=null&&E?Dt(B,f&&f.ref,x,h||f,!h):B==null&&f&&f.ref!=null&&Dt(f.ref,null,x,f,!0)},D=(f,h,v,A)=>{if(f==null)s(h.el=l(h.children),v,A);else{const E=h.el=f.el;h.children!==f.children&&u(E,h.children)}},I=(f,h,v,A)=>{f==null?s(h.el=c(h.children||""),v,A):h.el=f.el},O=(f,h,v,A)=>{[f.el,f.anchor]=b(f.children,h,v,A,f.el,f.anchor)},p=({el:f,anchor:h},v,A)=>{let E;for(;f&&f!==h;)E=m(f),s(f,v,A),f=E;s(h,v,A)},g=({el:f,anchor:h})=>{let v;for(;f&&f!==h;)v=m(f),r(f),f=v;r(h)},M=(f,h,v,A,E,x,H,N,L)=>{if(h.type==="svg"?H="svg":h.type==="math"&&(H="mathml"),f==null)W(h,v,A,E,x,H,N,L);else{const C=f.el&&f.el._isVueCE?f.el:null;try{C&&C._beginPatch(),T(f,h,E,x,H,N,L)}finally{C&&C._endPatch()}}},W=(f,h,v,A,E,x,H,N)=>{let L,C;const{props:B,shapeFlag:$,transition:k,dirs:G}=f;if(L=f.el=o(f.type,x,B&&B.is,B),$&8?a(L,f.children):$&16&&j(f.children,L,null,A,E,ms(f,x),H,N),G&&Be(f,null,A,"created"),S(L,f,f.scopeId,H,A),B){for(const te in B)te!=="value"&&!bt(te)&&i(L,te,null,B[te],x,A);"value"in B&&i(L,"value",null,B.value,x),(C=B.onVnodeBeforeMount)&&Le(C,A,f)}G&&Be(f,null,A,"beforeMount");const J=Co(E,k);J&&k.beforeEnter(L),s(L,h,v),((C=B&&B.onVnodeMounted)||J||G)&&we(()=>{try{C&&Le(C,A,f),J&&k.enter(L),G&&Be(f,null,A,"mounted")}finally{}},E)},S=(f,h,v,A,E)=>{if(v&&_(f,v),A)for(let x=0;x{for(let C=L;C{const N=h.el=f.el;let{patchFlag:L,dynamicChildren:C,dirs:B}=h;L|=f.patchFlag&16;const $=f.props||ne,k=h.props||ne;let G;if(v&&pt(v,!1),(G=k.onVnodeBeforeUpdate)&&Le(G,v,h,f),B&&Be(h,f,v,"beforeUpdate"),v&&pt(v,!0),($.innerHTML&&k.innerHTML==null||$.textContent&&k.textContent==null)&&a(N,""),C?P(f.dynamicChildren,C,N,v,A,ms(h,E),x):H||V(f,h,N,null,v,A,ms(h,E),x,!1),L>0){if(L&16)R(N,$,k,v,E);else if(L&2&&$.class!==k.class&&i(N,"class",null,k.class,E),L&4&&i(N,"style",$.style,k.style,E),L&8){const J=h.dynamicProps;for(let te=0;te{G&&Le(G,v,h,f),B&&Be(h,f,v,"updated")},A)},P=(f,h,v,A,E,x,H)=>{for(let N=0;N{if(h!==v){if(h!==ne)for(const x in h)!bt(x)&&!(x in v)&&i(f,x,h[x],null,E,A);for(const x in v){if(bt(x))continue;const H=v[x],N=h[x];H!==N&&x!=="value"&&i(f,x,N,H,E,A)}"value"in v&&i(f,"value",h.value,v.value,E)}},w=(f,h,v,A,E,x,H,N,L)=>{const C=h.el=f?f.el:l(""),B=h.anchor=f?f.anchor:l("");let{patchFlag:$,dynamicChildren:k,slotScopeIds:G}=h;G&&(N=N?N.concat(G):G),f==null?(s(C,v,A),s(B,v,A),j(h.children||[],v,B,E,x,H,N,L)):$>0&&$&64&&k&&f.dynamicChildren&&f.dynamicChildren.length===k.length?(P(f.dynamicChildren,k,v,E,x,H,N),(h.key!=null||E&&h===E.subTree)&&ar(f,h,!0)):V(f,h,v,B,E,x,H,N,L)},F=(f,h,v,A,E,x,H,N,L)=>{h.slotScopeIds=N,f==null?h.shapeFlag&512?E.ctx.activate(h,v,A,H,L):Y(h,v,A,E,x,H,L):le(f,h,L)},Y=(f,h,v,A,E,x,H)=>{const N=f.component=oa(f,A,E);if(gn(f)&&(N.ctx.renderer=Rt),la(N,!1,H),N.asyncDep){if(E&&E.registerDep(N,U,H),!f.el){const L=N.subTree=fe(ge);I(null,L,h,v),f.placeholder=L.el}}else U(N,f,h,v,E,x,H)},le=(f,h,v)=>{const A=h.component=f.component;if(Uc(f,h,v))if(A.asyncDep&&!A.asyncResolved){X(A,h,v);return}else A.next=h,A.update();else h.el=f.el,A.vnode=h},U=(f,h,v,A,E,x,H)=>{const N=()=>{if(f.isMounted){let{next:$,bu:k,u:G,parent:J,vnode:te}=f;{const Ce=Ao(f);if(Ce){$&&($.el=te.el,X(f,$,H)),Ce.asyncDep.then(()=>{we(()=>{f.isUnmounted||C()},E)});return}}let se=$,ue;pt(f,!1),$?($.el=te.el,X(f,$,H)):$=te,k&&Pn(k),(ue=$.props&&$.props.onVnodeBeforeUpdate)&&Le(ue,J,$,te),pt(f,!0);const de=gs(f),Fe=f.subTree;f.subTree=de,y(Fe,de,d(Fe.el),vn(Fe),f,E,x),$.el=de.el,se===null&&mo(f,de.el),G&&we(G,E),(ue=$.props&&$.props.onVnodeUpdated)&&we(()=>Le(ue,J,$,te),E)}else{let $;const{el:k,props:G}=h,{bm:J,m:te,parent:se,root:ue,type:de}=f,Fe=Tt(h);if(pt(f,!1),J&&Pn(J),!Fe&&($=G&&G.onVnodeBeforeMount)&&Le($,se,h),pt(f,!0),k&&cs){const Ce=()=>{f.subTree=gs(f),cs(k,f.subTree,f,E,null)};Fe&&de.__asyncHydrate?de.__asyncHydrate(k,f,Ce):Ce()}else{ue.ce&&ue.ce._hasShadowRoot()&&ue.ce._injectChildStyle(de,f.parent?f.parent.type:void 0);const Ce=f.subTree=gs(f);y(null,Ce,v,A,f,E,x),h.el=Ce.el}if(te&&we(te,E),!Fe&&($=G&&G.onVnodeMounted)){const Ce=h;we(()=>Le($,se,Ce),E)}(h.shapeFlag&256||se&&Tt(se.vnode)&&se.vnode.shapeFlag&256)&&f.a&&we(f.a,E),f.isMounted=!0,h=v=A=null}};f.scope.on();const L=f.effect=new Mi(N);f.scope.off();const C=f.update=L.run.bind(L),B=f.job=L.runIfDirty.bind(L);B.i=f,B.id=f.uid,L.scheduler=()=>sr(B),pt(f,!0),C()},X=(f,h,v)=>{h.component=f;const A=f.vnode.props;f.vnode=h,f.next=null,Kc(f,h.props,A,v),Yc(f,h.children,v),tt(),Er(f),nt()},V=(f,h,v,A,E,x,H,N,L=!1)=>{const C=f&&f.children,B=f?f.shapeFlag:0,$=h.children,{patchFlag:k,shapeFlag:G}=h;if(k>0){if(k&128){yn(C,$,v,A,E,x,H,N,L);return}else if(k&256){ee(C,$,v,A,E,x,H,N,L);return}}G&8?(B&16&&Wt(C,E,x),$!==C&&a(v,$)):B&16?G&16?yn(C,$,v,A,E,x,H,N,L):Wt(C,E,x,!0):(B&8&&a(v,""),G&16&&j($,v,A,E,x,H,N,L))},ee=(f,h,v,A,E,x,H,N,L)=>{f=f||Nt,h=h||Nt;const C=f.length,B=h.length,$=Math.min(C,B);let k;for(k=0;k<$;k++){const G=h[k]=L?Qe(h[k]):Ie(h[k]);y(f[k],G,v,null,E,x,H,N,L)}C>B?Wt(f,E,x,!0,!1,$):j(h,v,A,E,x,H,N,L,$)},yn=(f,h,v,A,E,x,H,N,L)=>{let C=0;const B=h.length;let $=f.length-1,k=B-1;for(;C<=$&&C<=k;){const G=f[C],J=h[C]=L?Qe(h[C]):Ie(h[C]);if(_t(G,J))y(G,J,v,null,E,x,H,N,L);else break;C++}for(;C<=$&&C<=k;){const G=f[$],J=h[k]=L?Qe(h[k]):Ie(h[k]);if(_t(G,J))y(G,J,v,null,E,x,H,N,L);else break;$--,k--}if(C>$){if(C<=k){const G=k+1,J=Gk)for(;C<=$;)ke(f[C],E,x,!0),C++;else{const G=C,J=C,te=new Map;for(C=J;C<=k;C++){const Ae=h[C]=L?Qe(h[C]):Ie(h[C]);Ae.key!=null&&te.set(Ae.key,C)}let se,ue=0;const de=k-J+1;let Fe=!1,Ce=0;const Ut=new Array(de);for(C=0;C=de){ke(Ae,E,x,!0);continue}let We;if(Ae.key!=null)We=te.get(Ae.key);else for(se=J;se<=k;se++)if(Ut[se-J]===0&&_t(Ae,h[se])){We=se;break}We===void 0?ke(Ae,E,x,!0):(Ut[We-J]=C+1,We>=Ce?Ce=We:Fe=!0,y(Ae,h[We],v,null,E,x,H,N,L),ue++)}const yr=Fe?Qc(Ut):Nt;for(se=yr.length-1,C=de-1;C>=0;C--){const Ae=J+C,We=h[Ae],vr=h[Ae+1],_r=Ae+1{const{el:x,type:H,transition:N,children:L,shapeFlag:C}=f;if(C&6){ht(f.component.subTree,h,v,A);return}if(C&128){f.suspense.move(h,v,A);return}if(C&64){H.move(f,h,v,Rt);return}if(H===Te){s(x,h,v);for(let $=0;$N.enter(x),E);else{const{leave:$,delayLeave:k,afterLeave:G}=N,J=()=>{f.ctx.isUnmounted?r(x):s(x,h,v)},te=()=>{x._isLeaving&&x[Ke](!0),$(x,()=>{J(),G&&G()})};k?k(x,J,te):te()}else s(x,h,v)},ke=(f,h,v,A=!1,E=!1)=>{const{type:x,props:H,ref:N,children:L,dynamicChildren:C,shapeFlag:B,patchFlag:$,dirs:k,cacheIndex:G,memo:J}=f;if($===-2&&(E=!1),N!=null&&(tt(),Dt(N,null,v,f,!0),nt()),G!=null&&(h.renderCache[G]=void 0),B&256){h.ctx.deactivate(f);return}const te=B&1&&k,se=!Tt(f);let ue;if(se&&(ue=H&&H.onVnodeBeforeUnmount)&&Le(ue,h,f),B&6)ol(f.component,v,A);else{if(B&128){f.suspense.unmount(v,A);return}te&&Be(f,null,h,"beforeUnmount"),B&64?f.type.remove(f,h,v,Rt,A):C&&!C.hasOnce&&(x!==Te||$>0&&$&64)?Wt(C,h,v,!1,!0):(x===Te&&$&384||!E&&B&16)&&Wt(L,h,v),A&&gr(f)}const de=J!=null&&G==null;(se&&(ue=H&&H.onVnodeUnmounted)||te||de)&&we(()=>{ue&&Le(ue,h,f),te&&Be(f,null,h,"unmounted"),de&&(f.el=null)},v)},gr=f=>{const{type:h,el:v,anchor:A,transition:E}=f;if(h===Te){il(v,A);return}if(h===Zt){g(f);return}const x=()=>{r(v),E&&!E.persisted&&E.afterLeave&&E.afterLeave()};if(f.shapeFlag&1&&E&&!E.persisted){const{leave:H,delayLeave:N}=E,L=()=>H(v,x);N?N(f.el,x,L):L()}else x()},il=(f,h)=>{let v;for(;f!==h;)v=m(f),r(f),f=v;r(h)},ol=(f,h,v)=>{const{bum:A,scope:E,job:x,subTree:H,um:N,m:L,a:C}=f;jr(L),jr(C),A&&Pn(A),E.stop(),x&&(x.flags|=8,ke(H,f,h,v)),N&&we(N,h),we(()=>{f.isUnmounted=!0},h)},Wt=(f,h,v,A=!1,E=!1,x=0)=>{for(let H=x;H{if(f.shapeFlag&6)return vn(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const h=m(f.anchor||f.el),v=h&&h[zi];return v?m(v):h};let os=!1;const mr=(f,h,v)=>{let A;f==null?h._vnode&&(ke(h._vnode,null,null,!0),A=h._vnode.component):y(h._vnode||null,f,h,null,null,null,v),h._vnode=f,os||(os=!0,Er(A),$n(),os=!1)},Rt={p:y,um:ke,m:ht,r:gr,mt:Y,mc:j,pc:V,pbc:P,n:vn,o:e};let ls,cs;return t&&([ls,cs]=t(Rt)),{render:mr,hydrate:ls,createApp:Dc(mr,ls)}}function ms({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function pt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Co(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ar(e,t,n=!1){const s=e.children,r=t.children;if(K(s)&&K(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Ao(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ao(t)}function jr(e){if(e)for(let t=0;te.__isSuspense;function Oo(e,t){t&&t.pendingBranch?K(e)?t.effects.push(...e):t.effects.push(e):nc(e)}const Te=Symbol.for("v-fgt"),xt=Symbol.for("v-txt"),ge=Symbol.for("v-cmt"),Zt=Symbol.for("v-stc"),en=[];let Re=null;function ks(e=!1){en.push(Re=e?null:[])}function Zc(){en.pop(),Re=en[en.length-1]||null}let cn=1;function Wn(e,t=!1){cn+=e,e<0&&Re&&t&&(Re.hasOnce=!0)}function Po(e){return e.dynamicChildren=cn>0?Re||Nt:null,Zc(),cn>0&&Re&&Re.push(e),e}function nf(e,t,n,s,r,i){return Po(Io(e,t,n,s,r,i,!0))}function Ws(e,t,n,s,r){return Po(fe(e,t,n,s,r,!0))}function an(e){return e?e.__v_isVNode===!0:!1}function _t(e,t){return e.type===t.type&&e.key===t.key}const Lo=({key:e})=>e??null,In=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?oe(e)||ae(e)||q(e)?{i:ye,r:e,k:t,f:!!n}:e:null);function Io(e,t=null,n=null,s=0,r=null,i=e===Te?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Lo(t),ref:t&&In(t),scopeId:Xi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ye};return l?(ur(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=oe(n)?8:16),cn>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const fe=ea;function ea(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===lo)&&(e=ge),an(e)){const l=ut(e,t,!0);return n&&ur(l,n),cn>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag=-2,l}if(fa(e)&&(e=e.__vccOpts),t){t=ta(t);let{class:l,style:c}=t;l&&!oe(l)&&(t.class=Js(l)),Q(c)&&(zn(c)&&!K(c)&&(c=he({},c)),t.style=Ys(c))}const o=oe(e)?1:Mo(e)?128:Qi(e)?64:Q(e)?4:q(e)?2:0;return Io(e,t,n,s,r,o,i,!0)}function ta(e){return e?zn(e)||_o(e)?he({},e):e:null}function ut(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?sa(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Lo(u),ref:t&&t.ref?n&&i?K(i)?i.concat(In(t)):[i,In(t)]:In(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Te?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ut(e.ssContent),ssFallback:e.ssFallback&&ut(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&ln(a,c.clone(a)),a}function No(e=" ",t=0){return fe(xt,null,e,t)}function sf(e,t){const n=fe(Zt,null,e);return n.staticCount=t,n}function na(e="",t=!1){return t?(ks(),Ws(ge,null,e)):fe(ge,null,e)}function Ie(e){return e==null||typeof e=="boolean"?fe(ge):K(e)?fe(Te,null,e.slice()):an(e)?Qe(e):fe(xt,null,String(e))}function Qe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ut(e)}function ur(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(K(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ur(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!_o(t)?t._ctx=ye:r===3&&ye&&(ye.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:ye},n=32):(t=String(t),s&64?(n=16,t=[No(t)]):n=8);e.children=t,e.shapeFlag|=n}function sa(...e){const t={};for(let n=0;nme||ye;let Un,Us;{const e=Xn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Un=t("__VUE_INSTANCE_SETTERS__",n=>me=n),Us=t("__VUE_SSR_SETTERS__",n=>Vt=n)}const mn=e=>{const t=me;return Un(e),e.scope.on(),()=>{e.scope.off(),Un(t)}},Vr=()=>{me&&me.scope.off(),Un(null)};function Fo(e){return e.vnode.shapeFlag&4}let Vt=!1;function la(e,t=!1,n=!1){t&&Us(t);const{props:s,children:r}=e.vnode,i=Fo(e);Bc(e,s,i,t),Xc(e,r,n||t);const o=i?ca(e,t):void 0;return t&&Us(!1),o}function ca(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Mc);const{setup:s}=n;if(s){tt();const r=e.setupContext=s.length>1?Do(e):null,i=mn(e),o=hn(s,e,0,[e.props,r]),l=wi(o);if(nt(),i(),(l||e.sp)&&!Tt(e)&&or(e),l){if(o.then(Vr,Vr),t)return o.then(c=>{kr(e,c)}).catch(c=>{pn(c,e,0)});e.asyncDep=o}else kr(e,o)}else Ho(e)}function kr(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Q(t)&&(e.setupState=Bi(t)),Ho(e)}function Ho(e,t,n){const s=e.type;e.render||(e.render=s.render||Xe);{const r=mn(e);tt();try{Pc(e)}finally{nt(),r()}}}const aa={get(e,t){return _e(e,"get",""),e[t]}};function Do(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,aa),slots:e.slots,emit:e.emit,expose:t}}function rs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Bi(Ln(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Qt)return Qt[n](e)},has(t,n){return n in t||n in Qt}})):e.proxy}function ua(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function fa(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>zl(e,t,Vt);function Bs(e,t,n){try{Wn(-1);const s=arguments.length;return s===2?Q(t)&&!K(t)?an(t)?fe(e,null,[t]):fe(e,t):fe(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&an(n)&&(n=[n]),fe(e,t,n))}finally{Wn(1)}}const da="3.5.33";/** +* @vue/runtime-dom v3.5.33 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Ks;const Wr=typeof window<"u"&&window.trustedTypes;if(Wr)try{Ks=Wr.createPolicy("vue",{createHTML:e=>e})}catch{}const $o=Ks?e=>Ks.createHTML(e):e=>e,ha="http://www.w3.org/2000/svg",pa="http://www.w3.org/1998/Math/MathML",ze=typeof document<"u"?document:null,Ur=ze&&ze.createElement("template"),ga={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?ze.createElementNS(ha,e):t==="mathml"?ze.createElementNS(pa,e):n?ze.createElement(e,{is:n}):ze.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>ze.createTextNode(e),createComment:e=>ze.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ze.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Ur.innerHTML=$o(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Ur.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ot="transition",qt="animation",un=Symbol("_vtc"),jo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ma=he({},Zi,jo),ya=e=>(e.displayName="Transition",e.props=ma,e),rf=ya((e,{slots:t})=>Bs(hc,va(e),t)),gt=(e,t=[])=>{K(e)?e.forEach(n=>n(...t)):e&&e(...t)},Br=e=>e?K(e)?e.some(t=>t.length>1):e.length>1:!1;function va(e){const t={};for(const w in e)w in jo||(t[w]=e[w]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:a=l,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,b=_a(r),y=b&&b[0],D=b&&b[1],{onBeforeEnter:I,onEnter:O,onEnterCancelled:p,onLeave:g,onLeaveCancelled:M,onBeforeAppear:W=I,onAppear:S=O,onAppearCancelled:j=p}=t,T=(w,F,Y,le)=>{w._enterCancelled=le,mt(w,F?a:l),mt(w,F?u:o),Y&&Y()},P=(w,F)=>{w._isLeaving=!1,mt(w,d),mt(w,_),mt(w,m),F&&F()},R=w=>(F,Y)=>{const le=w?S:O,U=()=>T(F,w,Y);gt(le,[F,U]),Kr(()=>{mt(F,w?c:i),Je(F,w?a:l),Br(le)||qr(F,s,y,U)})};return he(t,{onBeforeEnter(w){gt(I,[w]),Je(w,i),Je(w,o)},onBeforeAppear(w){gt(W,[w]),Je(w,c),Je(w,u)},onEnter:R(!1),onAppear:R(!0),onLeave(w,F){w._isLeaving=!0;const Y=()=>P(w,F);Je(w,d),w._enterCancelled?(Je(w,m),Yr(w)):(Yr(w),Je(w,m)),Kr(()=>{w._isLeaving&&(mt(w,d),Je(w,_),Br(g)||qr(w,s,D,Y))}),gt(g,[w,Y])},onEnterCancelled(w){T(w,!1,void 0,!0),gt(p,[w])},onAppearCancelled(w){T(w,!0,void 0,!0),gt(j,[w])},onLeaveCancelled(w){P(w),gt(M,[w])}})}function _a(e){if(e==null)return null;if(Q(e))return[ys(e.enter),ys(e.leave)];{const t=ys(e);return[t,t]}}function ys(e){return fl(e)}function Je(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[un]||(e[un]=new Set)).add(t)}function mt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[un];n&&(n.delete(t),n.size||(e[un]=void 0))}function Kr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ba=0;function qr(e,t,n,s){const r=e._endId=++ba,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=wa(e,t);if(!o)return s();const u=o+"end";let a=0;const d=()=>{e.removeEventListener(u,m),i()},m=_=>{_.target===e&&++a>=c&&d()};setTimeout(()=>{a(n[b]||"").split(", "),r=s(`${ot}Delay`),i=s(`${ot}Duration`),o=Gr(r,i),l=s(`${qt}Delay`),c=s(`${qt}Duration`),u=Gr(l,c);let a=null,d=0,m=0;t===ot?o>0&&(a=ot,d=o,m=i.length):t===qt?u>0&&(a=qt,d=u,m=c.length):(d=Math.max(o,u),a=d>0?o>u?ot:qt:null,m=a?a===ot?i.length:c.length:0);const _=a===ot&&/\b(?:transform|all)(?:,|$)/.test(s(`${ot}Property`).toString());return{type:a,timeout:d,propCount:m,hasTransform:_}}function Gr(e,t){for(;e.lengthXr(n)+Xr(e[s])))}function Xr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Yr(e){return(e?e.ownerDocument:document).body.offsetHeight}function Sa(e,t,n){const s=e[un];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Jr=Symbol("_vod"),Ta=Symbol("_vsh"),Ea=Symbol(""),xa=/(?:^|;)\s*display\s*:/;function Ca(e,t,n){const s=e.style,r=oe(n);let i=!1;if(n&&!r){if(t)if(oe(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Yt(s,l,"")}else for(const o in t)n[o]==null&&Yt(s,o,"");for(const o in n){o==="display"&&(i=!0);const l=n[o];l!=null?Ra(e,o,!oe(t)&&t?t[o]:void 0,l)||Yt(s,o,l):Yt(s,o,"")}}else if(r){if(t!==n){const o=s[Ea];o&&(n+=";"+o),s.cssText=n,i=xa.test(n)}}else t&&e.removeAttribute("style");Jr in e&&(e[Jr]=i?s.display:"",e[Ta]&&(s.display="none"))}const zr=/\s*!important$/;function Yt(e,t,n){if(K(n))n.forEach(s=>Yt(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Aa(e,t);zr.test(n)?e.setProperty(dt(s),n.replace(zr,""),"important"):e[s]=n}}const Qr=["Webkit","Moz","ms"],vs={};function Aa(e,t){const n=vs[t];if(n)return n;let s=Ee(t);if(s!=="filter"&&s in e)return vs[t]=s;s=Gn(s);for(let r=0;r_s||(La.then(()=>_s=0),_s=Date.now());function Na(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;je(Fa(s,n.value),t,5,[s])};return n.value=e,n.attached=Ia(),n}function Fa(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ri=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ha=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?Sa(e,s,o):t==="style"?Ca(e,n,s):fn(t)?Bn(t)||Oa(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Da(e,t,s,o))?(ti(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ei(e,t,s,o,i,t!=="value")):e._isVueCE&&($a(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!oe(s)))?ti(e,Ee(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ei(e,t,s,o))};function Da(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ri(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return ri(t)&&oe(n)?!1:t in e}function $a(e,t){const n=e._def.props;if(!n)return!1;const s=Ee(t);return Array.isArray(n)?n.some(r=>Ee(r)===s):Object.keys(n).some(r=>Ee(r)===s)}const ii=e=>{const t=e.props["onUpdate:modelValue"]||!1;return K(t)?n=>Pn(t,n):t};function ja(e){e.target.composing=!0}function oi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const bs=Symbol("_assign");function li(e,t,n){return t&&(e=e.trim()),n&&(e=Xs(e)),e}const of={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[bs]=ii(r);const i=s||r.props&&r.props.type==="number";Lt(e,t?"change":"input",o=>{o.target.composing||e[bs](li(e.value,n,i))}),(n||i)&&Lt(e,"change",()=>{e.value=li(e.value,n,i)}),t||(Lt(e,"compositionstart",ja),Lt(e,"compositionend",oi),Lt(e,"change",oi))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[bs]=ii(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Xs(e.value):e.value,c=t??"";if(l===c)return;const u=e.getRootNode();(u instanceof Document||u instanceof ShadowRoot)&&u.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c)}},Va=["ctrl","shift","alt","meta"],ka={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Va.some(n=>e[`${n}Key`]&&!t.includes(n))},lf=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=dt(r.key);if(t.some(o=>o===i||Wa[o]===i))return e(r)})},Vo=he({patchProp:Ha},ga);let tn,ci=!1;function Ua(){return tn||(tn=Jc(Vo))}function Ba(){return tn=ci?tn:zc(Vo),ci=!0,tn}const af=(...e)=>{const t=Ua().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Wo(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,ko(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},uf=(...e)=>{const t=Ba().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Wo(s);if(r)return n(r,!0,ko(r))},t};function ko(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Wo(e){return oe(e)?document.querySelector(e):e}const Ka=window.__VP_SITE_DATA__;function Uo(e){return Ri()?(wl(e),!0):!1}const ws=new WeakMap,qa=(...e)=>{var t;const n=e[0],s=(t=At())==null?void 0:t.proxy;if(s==null&&!Yi())throw new Error("injectLocal must be called in setup");return s&&ws.has(s)&&n in ws.get(s)?ws.get(s)[n]:St(...e)},Bo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const ff=e=>e!=null,Ga=Object.prototype.toString,Xa=e=>Ga.call(e)==="[object Object]",ft=()=>{},ai=Ya();function Ya(){var e,t;return Bo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function fr(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Ko=e=>e();function qo(e,t={}){let n,s,r=ft;const i=c=>{clearTimeout(c),r(),r=ft};let o;return c=>{const u=ce(e),a=ce(t.maxWait);return n&&i(n),u<=0||a!==void 0&&a<=0?(s&&(i(s),s=null),Promise.resolve(c())):new Promise((d,m)=>{r=t.rejectOnCancel?m:d,o=c,a&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,d(o())},a)),n=setTimeout(()=>{s&&i(s),s=null,d(c())},u)})}}function Ja(...e){let t=0,n,s=!0,r=ft,i,o,l,c,u;!ae(e[0])&&typeof e[0]=="object"?{delay:o,trailing:l=!0,leading:c=!0,rejectOnCancel:u=!1}=e[0]:[o,l=!0,c=!0,u=!1]=e;const a=()=>{n&&(clearTimeout(n),n=void 0,r(),r=ft)};return m=>{const _=ce(o),b=Date.now()-t,y=()=>i=m();return a(),_<=0?(t=Date.now(),y()):(b>_&&(c||!s)?(t=Date.now(),y()):l&&(i=new Promise((D,I)=>{r=u?I:D,n=setTimeout(()=>{t=Date.now(),s=!0,D(y()),a()},Math.max(0,_-b))})),!c&&!n&&(n=setTimeout(()=>s=!0,_)),s=!1,i)}}function za(e=Ko,t={}){const{initialState:n="active"}=t,s=dr(n==="active");function r(){s.value=!1}function i(){s.value=!0}return{isActive:rn(s),pause:r,resume:i,eventFilter:(...l)=>{s.value&&e(...l)}}}function ui(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Qa(e){return At()}function Ss(e){return Array.isArray(e)?e:[e]}function dr(...e){if(e.length!==1)return Xl(...e);const t=e[0];return typeof t=="function"?rn(Kl(()=>({get:t,set:ft}))):De(t)}function Za(e,t=200,n={}){return fr(qo(t,n),e)}function eu(e,t=200,n=!1,s=!0,r=!1){return fr(Ja(t,n,s,r),e)}function Go(e,t,n={}){const{eventFilter:s=Ko,...r}=n;return Ne(e,fr(s,t),r)}function tu(e,t,n={}){const{eventFilter:s,initialState:r="active",...i}=n,{eventFilter:o,pause:l,resume:c,isActive:u}=za(s,{initialState:r});return{stop:Go(e,t,{...i,eventFilter:o}),pause:l,resume:c,isActive:u}}function is(e,t=!0,n){Qa()?kt(e,n):t?e():Zn(e)}function df(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Go(e,t,{...i,eventFilter:qo(s,{maxWait:r})})}function nu(e,t,n){return Ne(e,t,{...n,immediate:!0})}function hf(e,t,n){let s;ae(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=ft}=s,c=xe(!r),u=o?xe(t):De(t);let a=0;return rr(async d=>{if(!c.value)return;a++;const m=a;let _=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const b=await e(y=>{d(()=>{i&&(i.value=!1),_||y()})});m===a&&(u.value=b)}catch(b){l(b)}finally{i&&m===a&&(i.value=!1),_=!0}}),r?ie(()=>(c.value=!0,u.value)):u}const Ve=Bo?window:void 0;function hr(e){var t;const n=ce(e);return(t=n==null?void 0:n.$el)!=null?t:n}function rt(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},s=(l,c,u,a)=>(l.addEventListener(c,u,a),()=>l.removeEventListener(c,u,a)),r=ie(()=>{const l=Ss(ce(e[0])).filter(c=>c!=null);return l.every(c=>typeof c!="string")?l:void 0}),i=nu(()=>{var l,c;return[(c=(l=r.value)==null?void 0:l.map(u=>hr(u)))!=null?c:[Ve].filter(u=>u!=null),Ss(ce(r.value?e[1]:e[0])),Ss(Qn(r.value?e[2]:e[1])),ce(r.value?e[3]:e[2])]},([l,c,u,a])=>{if(n(),!(l!=null&&l.length)||!(c!=null&&c.length)||!(u!=null&&u.length))return;const d=Xa(a)?{...a}:a;t.push(...l.flatMap(m=>c.flatMap(_=>u.map(b=>s(m,_,b,d)))))},{flush:"post"}),o=()=>{i(),n()};return Uo(n),o}function su(){const e=xe(!1),t=At();return t&&kt(()=>{e.value=!0},t),e}function ru(e){const t=su();return ie(()=>(t.value,!!e()))}function iu(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function pf(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Ve,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=iu(t);return rt(r,i,a=>{a.repeat&&ce(l)||c(a)&&n(a)},o)}const ou=Symbol("vueuse-ssr-width");function lu(){const e=Yi()?qa(ou,null):null;return typeof e=="number"?e:void 0}function Xo(e,t={}){const{window:n=Ve,ssrWidth:s=lu()}=t,r=ru(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),i=xe(typeof s=="number"),o=xe(),l=xe(!1),c=u=>{l.value=u.matches};return rr(()=>{if(i.value){i.value=!r.value;const u=ce(e).split(",");l.value=u.some(a=>{const d=a.includes("not all"),m=a.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),_=a.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let b=!!(m||_);return m&&b&&(b=s>=ui(m[1])),_&&b&&(b=s<=ui(_[1])),d?!b:b});return}r.value&&(o.value=n.matchMedia(ce(e)),l.value=o.value.matches)}),rt(o,"change",c,{passive:!0}),ie(()=>l.value)}const Cn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},An="__vueuse_ssr_handlers__",cu=au();function au(){return An in Cn||(Cn[An]=Cn[An]||{}),Cn[An]}function Yo(e,t){return cu[e]||t}function Jo(e){return Xo("(prefers-color-scheme: dark)",e)}function uu(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const fu={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},fi="vueuse-storage";function pr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:a,window:d=Ve,eventFilter:m,onError:_=R=>{console.error(R)},initOnMounted:b}=s,y=(a?xe:De)(typeof t=="function"?t():t),D=ie(()=>ce(e));if(!n)try{n=Yo("getDefaultStorage",()=>{var R;return(R=Ve)==null?void 0:R.localStorage})()}catch(R){_(R)}if(!n)return y;const I=ce(t),O=uu(I),p=(r=s.serializer)!=null?r:fu[O],{pause:g,resume:M}=tu(y,()=>S(y.value),{flush:i,deep:o,eventFilter:m});Ne(D,()=>T(),{flush:i}),d&&l&&is(()=>{n instanceof Storage?rt(d,"storage",T,{passive:!0}):rt(d,fi,P),b&&T()}),b||T();function W(R,w){if(d){const F={key:D.value,oldValue:R,newValue:w,storageArea:n};d.dispatchEvent(n instanceof Storage?new StorageEvent("storage",F):new CustomEvent(fi,{detail:F}))}}function S(R){try{const w=n.getItem(D.value);if(R==null)W(w,null),n.removeItem(D.value);else{const F=p.write(R);w!==F&&(n.setItem(D.value,F),W(w,F))}}catch(w){_(w)}}function j(R){const w=R?R.newValue:n.getItem(D.value);if(w==null)return c&&I!=null&&n.setItem(D.value,p.write(I)),I;if(!R&&u){const F=p.read(w);return typeof u=="function"?u(F,I):O==="object"&&!Array.isArray(F)?{...I,...F}:F}else return typeof w!="string"?w:p.read(w)}function T(R){if(!(R&&R.storageArea!==n)){if(R&&R.key==null){y.value=I;return}if(!(R&&R.key!==D.value)){g();try{(R==null?void 0:R.newValue)!==p.write(y.value)&&(y.value=j(R))}catch(w){_(w)}finally{R?Zn(M):M()}}}}function P(R){T(R.detail)}return y}const du="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function hu(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ve,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:a=!0}=e,d={auto:"",light:"light",dark:"dark",...e.modes||{}},m=Jo({window:r}),_=ie(()=>m.value?"dark":"light"),b=c||(o==null?dr(s):pr(o,s,i,{window:r,listenToStorageChanges:l})),y=ie(()=>b.value==="auto"?_.value:b.value),D=Yo("updateHTMLAttrs",(g,M,W)=>{const S=typeof g=="string"?r==null?void 0:r.document.querySelector(g):hr(g);if(!S)return;const j=new Set,T=new Set;let P=null;if(M==="class"){const w=W.split(/\s/g);Object.values(d).flatMap(F=>(F||"").split(/\s/g)).filter(Boolean).forEach(F=>{w.includes(F)?j.add(F):T.add(F)})}else P={key:M,value:W};if(j.size===0&&T.size===0&&P===null)return;let R;a&&(R=r.document.createElement("style"),R.appendChild(document.createTextNode(du)),r.document.head.appendChild(R));for(const w of j)S.classList.add(w);for(const w of T)S.classList.remove(w);P&&S.setAttribute(P.key,P.value),a&&(r.getComputedStyle(R).opacity,document.head.removeChild(R))});function I(g){var M;D(t,n,(M=d[g])!=null?M:g)}function O(g){e.onChanged?e.onChanged(g,I):I(g)}Ne(y,O,{flush:"post",immediate:!0}),is(()=>O(y.value));const p=ie({get(){return u?b.value:y.value},set(g){b.value=g}});return Object.assign(p,{store:b,system:_,state:y})}function pu(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=hu({...e,onChanged:(o,l)=>{var c;e.onChanged?(c=e.onChanged)==null||c.call(e,o==="dark",l,o):l(o)},modes:{dark:t,light:n}}),r=ie(()=>s.system.value);return ie({get(){return s.value==="dark"},set(o){const l=o?"dark":"light";r.value===l?s.value="auto":s.value=l}})}function Ts(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const di=1;function gu(e,t={}){const{throttle:n=0,idle:s=200,onStop:r=ft,onScroll:i=ft,offset:o={left:0,right:0,top:0,bottom:0},eventListenerOptions:l={capture:!1,passive:!0},behavior:c="auto",window:u=Ve,onError:a=S=>{console.error(S)}}=t,d=xe(0),m=xe(0),_=ie({get(){return d.value},set(S){y(S,void 0)}}),b=ie({get(){return m.value},set(S){y(void 0,S)}});function y(S,j){var T,P,R,w;if(!u)return;const F=ce(e);if(!F)return;(R=F instanceof Document?u.document.body:F)==null||R.scrollTo({top:(T=ce(j))!=null?T:b.value,left:(P=ce(S))!=null?P:_.value,behavior:ce(c)});const Y=((w=F==null?void 0:F.document)==null?void 0:w.documentElement)||(F==null?void 0:F.documentElement)||F;_!=null&&(d.value=Y.scrollLeft),b!=null&&(m.value=Y.scrollTop)}const D=xe(!1),I=$t({left:!0,right:!1,top:!0,bottom:!1}),O=$t({left:!1,right:!1,top:!1,bottom:!1}),p=S=>{D.value&&(D.value=!1,O.left=!1,O.right=!1,O.top=!1,O.bottom=!1,r(S))},g=Za(p,n+s),M=S=>{var j;if(!u)return;const T=((j=S==null?void 0:S.document)==null?void 0:j.documentElement)||(S==null?void 0:S.documentElement)||hr(S),{display:P,flexDirection:R,direction:w}=getComputedStyle(T),F=w==="rtl"?-1:1,Y=T.scrollLeft;O.left=Yd.value;const le=Math.abs(Y*F)<=(o.left||0),U=Math.abs(Y*F)+T.clientWidth>=T.scrollWidth-(o.right||0)-di;P==="flex"&&R==="row-reverse"?(I.left=U,I.right=le):(I.left=le,I.right=U),d.value=Y;let X=T.scrollTop;S===u.document&&!X&&(X=u.document.body.scrollTop),O.top=Xm.value;const V=Math.abs(X)<=(o.top||0),ee=Math.abs(X)+T.clientHeight>=T.scrollHeight-(o.bottom||0)-di;P==="flex"&&R==="column-reverse"?(I.top=ee,I.bottom=V):(I.top=V,I.bottom=ee),m.value=X},W=S=>{var j;if(!u)return;const T=(j=S.target.documentElement)!=null?j:S.target;M(T),D.value=!0,g(S),i(S)};return rt(e,"scroll",n?eu(W,n,!0,!1):W,l),is(()=>{try{const S=ce(e);if(!S)return;M(S)}catch(S){a(S)}}),rt(e,"scrollend",p,l),{x:_,y:b,isScrolling:D,arrivedState:I,directions:O,measure(){const S=ce(e);u&&S&&M(S)}}}function gf(e,t,n={}){const{window:s=Ve}=n;return pr(e,t,s==null?void 0:s.localStorage,n)}function zo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const Es=new WeakMap;function mf(e,t=!1){const n=xe(t);let s=null,r="";Ne(dr(e),l=>{const c=Ts(ce(l));if(c){const u=c;if(Es.get(u)||Es.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(r=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=Ts(ce(e));!l||n.value||(ai&&(s=rt(l,"touchmove",c=>{mu(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=Ts(ce(e));!l||!n.value||(ai&&(s==null||s()),l.style.overflow=r,Es.delete(l),n.value=!1)};return Uo(o),ie({get(){return n.value},set(l){l?i():o()}})}function yf(e,t,n={}){const{window:s=Ve}=n;return pr(e,t,s==null?void 0:s.sessionStorage,n)}function vf(e={}){const{window:t=Ve,...n}=e;return gu(t,n)}function _f(e={}){const{window:t=Ve,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=xe(n),c=xe(s),u=()=>{if(t)if(o==="outer")l.value=t.outerWidth,c.value=t.outerHeight;else if(o==="visual"&&t.visualViewport){const{width:d,height:m,scale:_}=t.visualViewport;l.value=Math.round(d*_),c.value=Math.round(m*_)}else i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};u(),is(u);const a={passive:!0};if(rt("resize",u,a),t&&o==="visual"&&t.visualViewport&&rt(t.visualViewport,"resize",u,a),r){const d=Xo("(orientation: portrait)");Ne(d,()=>u())}return{width:l,height:c}}const xs={};var Cs={};const Qo=/^(?:[a-z]+:|\/\/)/i,yu="vitepress-theme-appearance",vu=/#.*$/,_u=/[?#].*$/,bu=/(?:(^|\/)index)?\.(?:md|html)$/,ve=typeof document<"u",Zo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function wu(e,t,n=!1){if(t===void 0)return!1;if(e=hi(`/${e}`),n)return new RegExp(t).test(e);if(hi(t)!==e)return!1;const s=t.match(vu);return s?(ve?location.hash:"")===s[0]:!0}function hi(e){return decodeURI(e).replace(_u,"").replace(bu,"$1")}function Su(e){return Qo.test(e)}function Tu(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Su(n)&&wu(t,`/${n}/`,!0))||"root"}function Eu(e,t){var s,r,i,o,l,c,u;const n=Tu(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:tl(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function el(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=xu(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function xu(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Cu(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function tl(e,t){return[...e.filter(n=>!Cu(t,n)),...t]}const Au=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Ru=/^[a-z]:/i;function pi(e){const t=Ru.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Au,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const As=new Set;function Mu(e){if(As.size===0){const n=typeof process=="object"&&(Cs==null?void 0:Cs.VITE_EXTRA_EXTENSIONS)||(xs==null?void 0:xs.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>As.add(s))}const t=e.split(".").pop();return t==null||!As.has(t.toLowerCase())}function bf(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Ou=Symbol(),Ct=xe(Ka);function wf(e){const t=ie(()=>Eu(Ct.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?De(!0):n==="force-auto"?Jo():n?pu({storageKey:yu,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):De(!1),r=De(ve?location.hash:"");return ve&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Ne(()=>e.data,()=>{r.value=ve?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>el(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function Pu(){const e=St(Ou);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Lu(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function gi(e){return Qo.test(e)||!e.startsWith("/")?e:Lu(Ct.value.base,e)}function Iu(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ve){const n="/";t=pi(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${pi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Nn=[];function Sf(e){Nn.push(e),ns(()=>{Nn=Nn.filter(t=>t!==e)})}function Nu(){let e=Ct.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=mi(e,n);else if(Array.isArray(e))for(const s of e){const r=mi(s,n);if(r){t=r;break}}return t}function mi(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const Fu=Symbol(),nl="http://a.com",Hu=()=>({path:"/",component:null,data:Zo});function Tf(e,t){const n=$t(Hu()),s={route:n,go:r};async function r(l=ve?location.href:"/"){var c,u;l=Rs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ve&&l!==Rs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(l)))}let i=null;async function o(l,c=0,u=!1){var m,_;if(await((m=s.onBeforePageLoad)==null?void 0:m.call(s,l))===!1)return;const a=new URL(l,nl),d=i=a.pathname;try{let b=await e(d);if(!b)throw new Error(`Page not found: ${d}`);if(i===d){i=null;const{default:y,__pageData:D}=b;if(!y)throw new Error(`Invalid route component: ${y}`);await((_=s.onAfterPageLoad)==null?void 0:_.call(s,l)),n.path=ve?d:gi(d),n.component=Ln(y),n.data=Ln(D),ve&&Zn(()=>{let I=Ct.value.base+D.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!Ct.value.cleanUrls&&!I.endsWith("/")&&(I+=".html"),I!==a.pathname&&(a.pathname=I,l=I+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let O=null;try{O=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(O){yi(O,a.hash);return}}window.scrollTo(0,c)})}}catch(b){if(!/fetch|Page not found/.test(b.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(b),!u)try{const y=await fetch(Ct.value.base+"hashmap.json");window.__VP_HASH_MAP__=await y.json(),await o(l,c,!0);return}catch{}if(i===d){i=null,n.path=ve?d:gi(d),n.component=t?Ln(t):null;const y=ve?d.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Zo,relativePath:y}}}}return ve&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:a,origin:d,pathname:m,hash:_,search:b}=new URL(u,c.baseURI),y=new URL(location.href);d===y.origin&&Mu(m)&&(l.preventDefault(),m===y.pathname&&b===y.search?(_!==y.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:y.href,newURL:a}))),_?yi(c,_,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var u;if(l.state===null)return;const c=Rs(location.href);await o(c,l.state&&l.state.scrollPosition||0),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(c))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Du(){const e=St(Fu);if(!e)throw new Error("useRouter() is called without provider.");return e}function sl(){return Du().route}function yi(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-Nu()+i;requestAnimationFrame(r)}}function Rs(e){const t=new URL(e,nl);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),Ct.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Rn=()=>Nn.forEach(e=>e()),Ef=ir({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=sl(),{frontmatter:n,site:s}=Pu();return Ne(n,Rn,{deep:!0,flush:"post"}),()=>Bs(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Bs(t.component,{onVnodeMounted:Rn,onVnodeUpdated:Rn,onVnodeUnmounted:Rn}):"404 Page Not Found"])}}),xf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},$u="modulepreload",ju=function(e){return"/"+e},vi={},Cf=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(c=>{if(c=ju(c),c in vi)return;vi[c]=!0;const u=c.endsWith(".css"),a=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":$u,u||(d.as="script"),d.crossOrigin="",d.href=c,l&&d.setAttribute("nonce",l),document.head.appendChild(d),u)return new Promise((m,_)=>{d.addEventListener("load",m),d.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},Af=ir({setup(e,{slots:t}){const n=De(!1);return kt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Rf(){ve&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(u=>u.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Mf(){if(ve){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let u=c.textContent||"";o&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),Vu(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function Vu(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Of(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=Ms(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const o=i.map(Ms);s.forEach((l,c)=>{const u=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));u!==-1?delete o[u]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};rr(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=el(o,i);u!==document.title&&(document.title=u);const a=l||o.description;let d=document.querySelector("meta[name=description]");d?d.getAttribute("content")!==a&&d.setAttribute("content",a):Ms(["meta",{name:"description",content:a}]),r(tl(o.head,Wu(c)))})}function Ms([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function ku(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Wu(e){return e.filter(t=>!ku(t))}const Os=new Set,rl=()=>document.createElement("link"),Uu=e=>{const t=rl();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Bu=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Mn;const Ku=ve&&(Mn=rl())&&Mn.relList&&Mn.relList.supports&&Mn.relList.supports("prefetch")?Uu:Bu;function Pf(){if(!ve||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!Os.has(c)){Os.add(c);const u=Iu(c);u&&Ku(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):Os.add(l))})})};kt(s);const r=sl();Ne(()=>r.path,s),ns(()=>{n&&n.disconnect()})}export{io as $,Nu as A,Qu as B,Ju as C,Sf as D,fe as E,Te as F,xe as G,zu as H,Qo as I,sl as J,sa as K,St as L,_f as M,Ys as N,pf as O,Zn as P,vf as Q,ve as R,rn as S,rf as T,Yu as U,Cf as V,mf as W,rc as X,ef as Y,cf as Z,xf as _,No as a,lf as a0,tf as a1,Of as a2,Fu as a3,wf as a4,Ou as a5,Ef as a6,Af as a7,Ct as a8,Tf as a9,Iu as aa,uf as ab,Pf as ac,Mf as ad,Rf as ae,Bs as af,sf as ag,Uo as ah,ce as ai,Ss as aj,hr as ak,ff as al,hf as am,yf as an,gf as ao,df as ap,Du as aq,rt as ar,qu as as,of as at,ae as au,Xu as av,Ln as aw,af as ax,bf as ay,Ws as b,nf as c,ir as d,na as e,Mu as f,gi as g,ie as h,Su as i,Io as j,Qn as k,wu as l,Xo as m,Js as n,ks as o,De as p,Ne as q,Zu as r,rr as s,_l as t,Pu as u,kt as v,sc as w,ns as x,Gu as y,Ec as z}; diff --git a/assets/chunks/framework.DXGyWiRo.js b/assets/chunks/framework.DXGyWiRo.js deleted file mode 100644 index 8f899fda..00000000 --- a/assets/chunks/framework.DXGyWiRo.js +++ /dev/null @@ -1,19 +0,0 @@ -/** -* @vue/shared v3.5.32 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function qs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ne={},Nt=[],Xe=()=>{},_i=()=>!1,un=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Bn=e=>e.startsWith("onUpdate:"),he=Object.assign,Gs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ll=Object.prototype.hasOwnProperty,Z=(e,t)=>ll.call(e,t),K=Array.isArray,Ft=e=>fn(e)==="[object Map]",bi=e=>fn(e)==="[object Set]",br=e=>fn(e)==="[object Date]",q=e=>typeof e=="function",le=e=>typeof e=="string",Oe=e=>typeof e=="symbol",Q=e=>e!==null&&typeof e=="object",wi=e=>(Q(e)||q(e))&&q(e.then)&&q(e.catch),Si=Object.prototype.toString,fn=e=>Si.call(e),cl=e=>fn(e).slice(8,-1),Ti=e=>fn(e)==="[object Object]",Kn=e=>le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,bt=qs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),qn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},al=/-\w/g,Ee=qn(e=>e.replace(al,t=>t.slice(1).toUpperCase())),ul=/\B([A-Z])/g,ft=qn(e=>e.replace(ul,"-$1").toLowerCase()),Gn=qn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Mn=qn(e=>e?`on${Gn(e)}`:""),Ge=(e,t)=>!Object.is(e,t),On=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Xs=e=>{const t=parseFloat(e);return isNaN(t)?e:t},fl=e=>{const t=le(e)?Number(e):NaN;return isNaN(t)?e:t};let wr;const Xn=()=>wr||(wr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ys(e){if(K(e)){const t={};for(let n=0;n{if(n){const s=n.split(hl);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Js(e){let t="";if(le(e))t=e;else if(K(e))for(let n=0;n!!(e&&e.__v_isRef===!0),_l=e=>le(e)?e:e==null?"":K(e)||Q(e)&&(e.toString===Si||!q(e.toString))?Ci(e)?_l(e.value):JSON.stringify(e,Ai,2):String(e),Ai=(e,t)=>Ci(t)?Ai(e,t.value):Ft(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[as(s,i)+" =>"]=r,n),{})}:bi(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>as(n))}:Oe(t)?as(t):Q(t)&&!K(t)&&!Ti(t)?String(t):t,as=(e,t="")=>{var n;return Oe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.32 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let ye;class bl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=ye,!t&&ye&&(this.index=(ye.scopes||(ye.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(ye=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(Jt){let t=Jt;for(Jt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Yt;){let t=Yt;for(Yt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Li(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ii(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),er(s),Sl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Ps(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ni(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ni(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===tn)||(e.globalVersion=tn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ps(e))))return;e.flags|=2;const t=e.dep,n=re,s=He;re=e,He=!0;try{Li(e);const r=e.fn(e._value);(t.version===0||Ge(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{re=n,He=s,Ii(e),e.flags&=-3}}function er(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)er(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Sl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const Fi=[];function tt(){Fi.push(He),He=!1}function nt(){const e=Fi.pop();He=e===void 0?!0:e}function Sr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=n}}}let tn=0;class Tl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Yn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!re||!He||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new Tl(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,Hi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.deps=s)}return n}trigger(t){this.version++,tn++,this.notify(t)}notify(t){Qs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Zs()}}}function Hi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Hi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Fn=new WeakMap,wt=Symbol(""),Ls=Symbol(""),nn=Symbol("");function _e(e,t,n){if(He&&re){let s=Fn.get(e);s||Fn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Yn),r.map=s,r.key=n),r.track()}}function Ze(e,t,n,s,r,i){const o=Fn.get(e);if(!o){tn++;return}const l=c=>{c&&c.trigger()};if(Qs(),t==="clear")o.forEach(l);else{const c=K(e),u=c&&Kn(n);if(c&&n==="length"){const a=Number(s);o.forEach((d,m)=>{(m==="length"||m===nn||!Oe(m)&&m>=a)&&l(d)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),u&&l(o.get(nn)),t){case"add":c?u&&l(o.get("length")):(l(o.get(wt)),Ft(e)&&l(o.get(Ls)));break;case"delete":c||(l(o.get(wt)),Ft(e)&&l(o.get(Ls)));break;case"set":Ft(e)&&l(o.get(wt));break}}Zs()}function El(e,t){const n=Fn.get(e);return n&&n.get(t)}function Mt(e){const t=z(e);return t===e?t:(_e(t,"iterate",nn),Me(e)?t:t.map($e))}function Jn(e){return _e(e=z(e),"iterate",nn),e}function qe(e,t){return st(e)?jt(ct(e)?$e(t):t):$e(t)}const xl={__proto__:null,[Symbol.iterator](){return fs(this,Symbol.iterator,e=>qe(this,e))},concat(...e){return Mt(this).concat(...e.map(t=>K(t)?Mt(t):t))},entries(){return fs(this,"entries",e=>(e[1]=qe(this,e[1]),e))},every(e,t){return Ye(this,"every",e,t,void 0,arguments)},filter(e,t){return Ye(this,"filter",e,t,n=>n.map(s=>qe(this,s)),arguments)},find(e,t){return Ye(this,"find",e,t,n=>qe(this,n),arguments)},findIndex(e,t){return Ye(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ye(this,"findLast",e,t,n=>qe(this,n),arguments)},findLastIndex(e,t){return Ye(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ye(this,"forEach",e,t,void 0,arguments)},includes(...e){return ds(this,"includes",e)},indexOf(...e){return ds(this,"indexOf",e)},join(e){return Mt(this).join(e)},lastIndexOf(...e){return ds(this,"lastIndexOf",e)},map(e,t){return Ye(this,"map",e,t,void 0,arguments)},pop(){return Bt(this,"pop")},push(...e){return Bt(this,"push",e)},reduce(e,...t){return Tr(this,"reduce",e,t)},reduceRight(e,...t){return Tr(this,"reduceRight",e,t)},shift(){return Bt(this,"shift")},some(e,t){return Ye(this,"some",e,t,void 0,arguments)},splice(...e){return Bt(this,"splice",e)},toReversed(){return Mt(this).toReversed()},toSorted(e){return Mt(this).toSorted(e)},toSpliced(...e){return Mt(this).toSpliced(...e)},unshift(...e){return Bt(this,"unshift",e)},values(){return fs(this,"values",e=>qe(this,e))}};function fs(e,t,n){const s=Jn(e),r=s[t]();return s!==e&&!Me(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const Cl=Array.prototype;function Ye(e,t,n,s,r,i){const o=Jn(e),l=o!==e&&!Me(e),c=o[t];if(c!==Cl[t]){const d=c.apply(e,i);return l?$e(d):d}let u=n;o!==e&&(l?u=function(d,m){return n.call(this,qe(e,d),m,e)}:n.length>2&&(u=function(d,m){return n.call(this,d,m,e)}));const a=c.call(o,u,s);return l&&r?r(a):a}function Tr(e,t,n,s){const r=Jn(e),i=r!==e&&!Me(e);let o=n,l=!1;r!==e&&(i?(l=s.length===0,o=function(u,a,d){return l&&(l=!1,u=qe(e,u)),n.call(this,u,qe(e,a),d,e)}):n.length>3&&(o=function(u,a,d){return n.call(this,u,a,d,e)}));const c=r[t](o,...s);return l?qe(e,c):c}function ds(e,t,n){const s=z(e);_e(s,"iterate",nn);const r=s[t](...n);return(r===-1||r===!1)&&zn(n[0])?(n[0]=z(n[0]),s[t](...n)):r}function Bt(e,t,n=[]){tt(),Qs();const s=z(e)[t].apply(e,n);return Zs(),nt(),s}const Al=qs("__proto__,__v_isRef,__isVue"),Di=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Oe));function Rl(e){Oe(e)||(e=String(e));const t=z(this);return _e(t,"has",e),t.hasOwnProperty(e)}class $i{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?$l:Wi:i?ki:Vi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=K(t);if(!r){let c;if(o&&(c=xl[n]))return c;if(n==="hasOwnProperty")return Rl}const l=Reflect.get(t,n,ae(t)?t:s);if((Oe(n)?Di.has(n):Al(n))||(r||_e(t,"get",n),i))return l;if(ae(l)){const c=o&&Kn(n)?l:l.value;return r&&Q(c)?sn(c):c}return Q(l)?r?sn(l):$t(l):l}}class ji extends $i{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const o=K(t)&&Kn(n);if(!this._isShallow){const u=st(i);if(!Me(s)&&!st(s)&&(i=z(i),s=z(s)),!o&&ae(i)&&!ae(s))return u||(i.value=s),!0}const l=o?Number(n)e,vn=e=>Reflect.getPrototypeOf(e);function Il(e,t,n){return function(...s){const r=this.__v_raw,i=z(r),o=Ft(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),a=n?Is:t?jt:$e;return!t&&_e(i,"iterate",c?Ls:wt),he(Object.create(u),{next(){const{value:d,done:m}=u.next();return m?{value:d,done:m}:{value:l?[a(d[0]),a(d[1])]:a(d),done:m}}})}}function _n(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Nl(e,t){const n={get(r){const i=this.__v_raw,o=z(i),l=z(r);e||(Ge(r,l)&&_e(o,"get",r),_e(o,"get",l));const{has:c}=vn(o),u=t?Is:e?jt:$e;if(c.call(o,r))return u(i.get(r));if(c.call(o,l))return u(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&_e(z(r),"iterate",wt),r.size},has(r){const i=this.__v_raw,o=z(i),l=z(r);return e||(Ge(r,l)&&_e(o,"has",r),_e(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=z(l),u=t?Is:e?jt:$e;return!e&&_e(c,"iterate",wt),l.forEach((a,d)=>r.call(i,u(a),u(d),o))}};return he(n,e?{add:_n("add"),set:_n("set"),delete:_n("delete"),clear:_n("clear")}:{add(r){const i=z(this),o=vn(i),l=z(r),c=!t&&!Me(r)&&!st(r)?l:r;return o.has.call(i,c)||Ge(r,c)&&o.has.call(i,r)||Ge(l,c)&&o.has.call(i,l)||(i.add(c),Ze(i,"add",c,c)),this},set(r,i){!t&&!Me(i)&&!st(i)&&(i=z(i));const o=z(this),{has:l,get:c}=vn(o);let u=l.call(o,r);u||(r=z(r),u=l.call(o,r));const a=c.call(o,r);return o.set(r,i),u?Ge(i,a)&&Ze(o,"set",r,i):Ze(o,"add",r,i),this},delete(r){const i=z(this),{has:o,get:l}=vn(i);let c=o.call(i,r);c||(r=z(r),c=o.call(i,r)),l&&l.call(i,r);const u=i.delete(r);return c&&Ze(i,"delete",r,void 0),u},clear(){const r=z(this),i=r.size!==0,o=r.clear();return i&&Ze(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Il(r,e,t)}),n}function tr(e,t){const n=Nl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const Fl={get:tr(!1,!1)},Hl={get:tr(!1,!0)},Dl={get:tr(!0,!1)};const Vi=new WeakMap,ki=new WeakMap,Wi=new WeakMap,$l=new WeakMap;function jl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Vl(e){return e.__v_skip||!Object.isExtensible(e)?0:jl(cl(e))}function $t(e){return st(e)?e:nr(e,!1,Ol,Fl,Vi)}function kl(e){return nr(e,!1,Ll,Hl,ki)}function sn(e){return nr(e,!0,Pl,Dl,Wi)}function nr(e,t,n,s,r){if(!Q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Vl(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function ct(e){return st(e)?ct(e.__v_raw):!!(e&&e.__v_isReactive)}function st(e){return!!(e&&e.__v_isReadonly)}function Me(e){return!!(e&&e.__v_isShallow)}function zn(e){return e?!!e.__v_raw:!1}function z(e){const t=e&&e.__v_raw;return t?z(t):e}function Pn(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&Ei(e,"__v_skip",!0),e}const $e=e=>Q(e)?$t(e):e,jt=e=>Q(e)?sn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function De(e){return Ui(e,!1)}function xe(e){return Ui(e,!0)}function Ui(e,t){return ae(e)?e:new Wl(e,t)}class Wl{constructor(t,n){this.dep=new Yn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:z(t),this._value=n?t:$e(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Me(t)||st(t);t=s?t:z(t),Ge(t,n)&&(this._rawValue=t,this._value=s?t:$e(t),this.dep.trigger())}}function Qn(e){return ae(e)?e.value:e}function ce(e){return q(e)?e():Qn(e)}const Ul={get:(e,t,n)=>t==="__v_raw"?e:Qn(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Bi(e){return ct(e)?e:new Proxy(e,Ul)}class Bl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Yn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Kl(e){return new Bl(e)}class ql{constructor(t,n,s){this._object=t,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._key=Oe(n)?n:String(n),this._raw=z(t);let r=!0,i=t;if(!K(t)||Oe(this._key)||!Kn(this._key))do r=!zn(i)||Me(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=Qn(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&ae(this._raw[this._key])){const n=this._object[this._key];if(ae(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return El(this._raw,this._key)}}class Gl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Xl(e,t,n){return ae(e)?e:q(e)?new Gl(e):Q(e)&&arguments.length>1?Yl(e,t,n):De(e)}function Yl(e,t,n){return new ql(e,t,n)}class Jl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Yn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=tn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&re!==this)return Pi(this,!0),!0}get value(){const t=this.dep.track();return Ni(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function zl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new Jl(s,r,n)}const bn={},Hn=new WeakMap;let yt;function Ql(e,t=!1,n=yt){if(n){let s=Hn.get(n);s||Hn.set(n,s=[]),s.push(e)}}function Zl(e,t,n=ne){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,u=g=>r?g:Me(g)||r===!1||r===0?et(g,1):et(g);let a,d,m,_,b=!1,y=!1;if(ae(e)?(d=()=>e.value,b=Me(e)):ct(e)?(d=()=>u(e),b=!0):K(e)?(y=!0,b=e.some(g=>ct(g)||Me(g)),d=()=>e.map(g=>{if(ae(g))return g.value;if(ct(g))return u(g);if(q(g))return c?c(g,2):g()})):q(e)?t?d=c?()=>c(e,2):e:d=()=>{if(m){tt();try{m()}finally{nt()}}const g=yt;yt=a;try{return c?c(e,3,[_]):e(_)}finally{yt=g}}:d=Xe,t&&r){const g=d,M=r===!0?1/0:r;d=()=>et(g(),M)}const $=Ri(),P=()=>{a.stop(),$&&$.active&&Gs($.effects,a)};if(i&&t){const g=t;t=(...M)=>{g(...M),P()}}let L=y?new Array(e.length).fill(bn):bn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const M=a.run();if(r||b||(y?M.some((F,C)=>Ge(F,L[C])):Ge(M,L))){m&&m();const F=yt;yt=a;try{const C=[M,L===bn?void 0:y&&L[0]===bn?[]:L,_];L=M,c?c(t,3,C):t(...C)}finally{yt=F}}}else a.run()};return l&&l(p),a=new Mi(d),a.scheduler=o?()=>o(p,!1):p,_=g=>Ql(g,!1,a),m=a.onStop=()=>{const g=Hn.get(a);if(g){if(c)c(g,4);else for(const M of g)M();Hn.delete(a)}},t?s?p(!0):L=a.run():o?o(p.bind(null,!0),!0):a.run(),P.pause=a.pause.bind(a),P.resume=a.resume.bind(a),P.stop=P,P}function et(e,t=1/0,n){if(t<=0||!Q(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,ae(e))et(e.value,t,n);else if(K(e))for(let s=0;s{et(s,t,n)});else if(Ti(e)){for(const s in e)et(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&et(e[s],t,n)}return e}/** -* @vue/runtime-core v3.5.32 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function dn(e,t,n,s){try{return s?e(...s):e()}catch(r){hn(r,t,n)}}function je(e,t,n,s){if(q(e)){const r=dn(e,t,n,s);return r&&wi(r)&&r.catch(i=>{hn(i,t,n)}),r}if(K(e)){const r=[];for(let i=0;i>>1,r=Se[s],i=rn(r);i=rn(n)?Se.push(e):Se.splice(tc(t),0,e),e.flags|=1,qi()}}function qi(){Dn||(Dn=Ki.then(Gi))}function nc(e){K(e)?Ht.push(...e):lt&&e.id===-1?lt.splice(Pt+1,0,e):e.flags&1||(Ht.push(e),e.flags|=1),qi()}function Er(e,t,n=Ue+1){for(;nrn(n)-rn(s));if(Ht.length=0,lt){lt.push(...t);return}for(lt=t,Pt=0;Pte.id==null?e.flags&2?-1:1/0:e.id;function Gi(e){try{for(Ue=0;Ue{s._d&&Wn(-1);const i=jn(t);let o;try{o=e(...r)}finally{jn(i),s._d&&Wn(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Bu(e,t){if(me===null)return e;const n=rs(me),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&q(t)?t.call(s&&s.proxy):t}}function Yi(){return!!(At()||Et)}const ic=Symbol.for("v-scx"),oc=()=>St(ic);function rr(e,t){return es(e,null,t)}function Ku(e,t){return es(e,null,{flush:"post"})}function Ne(e,t,n){return es(e,t,n)}function es(e,t,n=ne){const{immediate:s,deep:r,flush:i,once:o}=n,l=he({},n),c=t&&s||!t&&i!=="post";let u;if(Vt){if(i==="sync"){const _=oc();u=_.__watcherHandles||(_.__watcherHandles=[])}else if(!c){const _=()=>{};return _.stop=Xe,_.resume=Xe,_.pause=Xe,_}}const a=ge;l.call=(_,b,y)=>je(_,a,b,y);let d=!1;i==="post"?l.scheduler=_=>{we(_,a&&a.suspense)}:i!=="sync"&&(d=!0,l.scheduler=(_,b)=>{b?_():sr(_)}),l.augmentJob=_=>{t&&(_.flags|=4),d&&(_.flags|=2,a&&(_.id=a.uid,_.i=a))};const m=Zl(e,t,l);return Vt&&(u?u.push(m):c&&m()),m}function lc(e,t,n){const s=this.proxy,r=le(e)?e.includes(".")?Ji(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=gn(this),l=es(r,i.bind(s),n);return o(),l}function Ji(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,vt=e=>e&&(e.disabled||e.disabled===""),cc=e=>e&&(e.defer||e.defer===""),xr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Cr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Ns=(e,t)=>{const n=e&&e.to;return le(n)?t?t(n):null:n},ac={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,u){const{mc:a,pc:d,pbc:m,o:{insert:_,querySelector:b,createText:y,createComment:$}}=u,P=vt(t.props);let{dynamicChildren:L}=t;const p=(F,C,V)=>{F.shapeFlag&16&&a(F.children,C,V,r,i,o,l,c)},g=(F=t)=>{const C=vt(F.props),V=F.target=Ns(F.props,b),A=Fs(V,F,y,_);V&&(o!=="svg"&&xr(V)?o="svg":o!=="mathml"&&Cr(V)&&(o="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(V),C||(p(F,V,A),Gt(F,!1)))},M=F=>{const C=()=>{ht.get(F)===C&&(ht.delete(F),vt(F.props)&&(p(F,n,F.anchor),Gt(F,!0)),g(F))};ht.set(F,C),we(C,i)};if(e==null){const F=t.el=y(""),C=t.anchor=y("");if(_(F,n,s),_(C,n,s),cc(t.props)||i&&i.pendingBranch){M(t);return}P&&(p(t,n,C),Gt(t,!0)),g()}else{t.el=e.el;const F=t.anchor=e.anchor,C=ht.get(e);if(C){C.flags|=8,ht.delete(e),M(t);return}t.targetStart=e.targetStart;const V=t.target=e.target,A=t.targetAnchor=e.targetAnchor,O=vt(e.props),R=O?n:V,w=O?F:A;if(o==="svg"||xr(V)?o="svg":(o==="mathml"||Cr(V))&&(o="mathml"),L?(m(e.dynamicChildren,L,R,r,i,o,l),ar(e,t,!0)):c||d(e,t,R,w,r,i,o,l,!1),P)O?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):wn(t,n,F,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const H=t.target=Ns(t.props,b);H&&wn(t,H,null,u,0)}else O&&wn(t,V,A,u,1);Gt(t,P)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:u,targetAnchor:a,target:d,props:m}=e;let _=i||!vt(m);const b=ht.get(e);if(b&&(b.flags|=8,ht.delete(e),_=!1),d&&(r(u),r(a)),i&&r(c),o&16)for(let y=0;y{e.isMounted=!0}),io(()=>{e.isUnmounting=!0}),e}const Pe=[Function,Array],Zi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Pe,onEnter:Pe,onAfterEnter:Pe,onEnterCancelled:Pe,onBeforeLeave:Pe,onLeave:Pe,onAfterLeave:Pe,onLeaveCancelled:Pe,onBeforeAppear:Pe,onAppear:Pe,onAfterAppear:Pe,onAppearCancelled:Pe},eo=e=>{const t=e.subTree;return t.component?eo(t.component):t},dc={name:"BaseTransition",props:Zi,setup(e,{slots:t}){const n=At(),s=fc();return()=>{const r=t.default&&so(t.default(),!0);if(!r||!r.length)return;const i=to(r),o=z(e),{mode:l}=o;if(s.isLeaving)return hs(i);const c=Ar(i);if(!c)return hs(i);let u=Hs(c,o,s,n,d=>u=d);c.type!==pe&&on(c,u);let a=n.subTree&&Ar(n.subTree);if(a&&a.type!==pe&&!_t(a,c)&&eo(n).type!==pe){let d=Hs(a,o,s,n);if(on(a,d),l==="out-in"&&c.type!==pe)return s.isLeaving=!0,d.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,a=void 0},hs(i);l==="in-out"&&c.type!==pe?d.delayLeave=(m,_,b)=>{const y=no(s,a);y[String(a.key)]=a,m[Ke]=()=>{_(),m[Ke]=void 0,delete u.delayedLeave,a=void 0},u.delayedLeave=()=>{b(),delete u.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function to(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==pe){t=n;break}}return t}const hc=dc;function no(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Hs(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:m,onLeave:_,onAfterLeave:b,onLeaveCancelled:y,onBeforeAppear:$,onAppear:P,onAfterAppear:L,onAppearCancelled:p}=t,g=String(e.key),M=no(n,e),F=(A,O)=>{A&&je(A,s,9,O)},C=(A,O)=>{const R=O[1];F(A,O),K(A)?A.every(w=>w.length<=1)&&R():A.length<=1&&R()},V={mode:o,persisted:l,beforeEnter(A){let O=c;if(!n.isMounted)if(i)O=$||c;else return;A[Ke]&&A[Ke](!0);const R=M[g];R&&_t(e,R)&&R.el[Ke]&&R.el[Ke](),F(O,[A])},enter(A){if(M[g]===e)return;let O=u,R=a,w=d;if(!n.isMounted)if(i)O=P||u,R=L||a,w=p||d;else return;let H=!1;A[Kt]=oe=>{H||(H=!0,oe?F(w,[A]):F(R,[A]),V.delayedLeave&&V.delayedLeave(),A[Kt]=void 0)};const Y=A[Kt].bind(null,!1);O?C(O,[A,Y]):Y()},leave(A,O){const R=String(e.key);if(A[Kt]&&A[Kt](!0),n.isUnmounting)return O();F(m,[A]);let w=!1;A[Ke]=Y=>{w||(w=!0,O(),Y?F(y,[A]):F(b,[A]),A[Ke]=void 0,M[R]===e&&delete M[R])};const H=A[Ke].bind(null,!1);M[R]=e,_?C(_,[A,H]):H()},clone(A){const O=Hs(A,t,n,s,r);return r&&r(O),O}};return V}function hs(e){if(pn(e))return e=at(e),e.children=null,e}function Ar(e){if(!pn(e))return Qi(e.type)&&e.children?to(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function on(e,t){e.shapeFlag&6&&e.component?(e.transition=t,on(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function so(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iDt(y,t&&(K(t)?t[$]:t),n,s,r));return}if(Tt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Dt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?rs(s.component):s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,a=l.refs===ne?l.refs={}:l.refs,d=l.setupState,m=z(d),_=d===ne?_i:y=>Rr(a,y)?!1:Z(m,y),b=(y,$)=>!($&&Rr(a,$));if(u!=null&&u!==c){if(Mr(t),le(u))a[u]=null,_(u)&&(d[u]=null);else if(ae(u)){const y=t;b(u,y.k)&&(u.value=null),y.k&&(a[y.k]=null)}}if(q(c))dn(c,l,12,[o,a]);else{const y=le(c),$=ae(c);if(y||$){const P=()=>{if(e.f){const L=y?_(c)?d[c]:a[c]:b()||!e.k?c.value:a[e.k];if(r)K(L)&&Gs(L,i);else if(K(L))L.includes(i)||L.push(i);else if(y)a[c]=[i],_(c)&&(d[c]=a[c]);else{const p=[i];b(c,e.k)&&(c.value=p),e.k&&(a[e.k]=p)}}else y?(a[c]=o,_(c)&&(d[c]=o)):$&&(b(c,e.k)&&(c.value=o),e.k&&(a[e.k]=o))};if(o){const L=()=>{P(),Vn.delete(e)};L.id=-1,Vn.set(e,L),we(L,n)}else Mr(e),P()}}}function Mr(e){const t=Vn.get(e);t&&(t.flags|=8,Vn.delete(e))}let Or=!1;const Ot=()=>{Or||(console.error("Hydration completed but contains mismatches."),Or=!0)},pc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",gc=e=>e.namespaceURI.includes("MathML"),Sn=e=>{if(e.nodeType===1){if(pc(e))return"svg";if(gc(e))return"mathml"}},It=e=>e.nodeType===8;function mc(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),$n(),g._vnode=p;return}d(g.firstChild,p,null,null,null),$n(),g._vnode=p},d=(p,g,M,F,C,V=!1)=>{V=V||!!g.dynamicChildren;const A=It(p)&&p.data==="[",O=()=>y(p,g,M,F,C,A),{type:R,ref:w,shapeFlag:H,patchFlag:Y}=g;let oe=p.nodeType;g.el=p,Y===-2&&(V=!1,g.dynamicChildren=null);let U=null;switch(R){case xt:oe!==3?g.children===""?(c(g.el=r(""),o(p),p),U=p):U=O():(p.data!==g.children&&(Ot(),p.data=g.children),U=i(p));break;case pe:L(p)?(U=i(p),P(g.el=p.content.firstChild,p,M)):oe!==8||A?U=O():U=i(p);break;case Qt:if(A&&(p=i(p),oe=p.nodeType),oe===1||oe===3){U=p;const X=!g.children.length;for(let k=0;k{V=V||!!g.dynamicChildren;const{type:A,props:O,patchFlag:R,shapeFlag:w,dirs:H,transition:Y}=g,oe=A==="input"||A==="option";if(oe||R!==-1){H&&Be(g,null,M,"created");let U=!1;if(L(p)){U=Co(null,Y)&&M&&M.vnode.props&&M.vnode.props.appear;const k=p.content.firstChild;if(U){const ee=k.getAttribute("class");ee&&(k.$cls=ee),Y.beforeEnter(k)}P(k,p,M),g.el=p=k}if(w&16&&!(O&&(O.innerHTML||O.textContent))){let k=_(p.firstChild,g,p,M,F,C,V);for(;k;){Tn(p,1)||Ot();const ee=k;k=k.nextSibling,l(ee)}}else if(w&8){let k=g.children;k[0]===` -`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(k=k.slice(1));const{textContent:ee}=p;ee!==k&&ee!==k.replace(/\r\n|\r/g,` -`)&&(Tn(p,0)||Ot(),p.textContent=g.children)}if(O){if(oe||!V||R&48){const k=p.tagName.includes("-");for(const ee in O)(oe&&(ee.endsWith("value")||ee==="indeterminate")||un(ee)&&!bt(ee)||ee[0]==="."||k&&!bt(ee))&&s(p,ee,null,O[ee],void 0,M)}else if(O.onClick)s(p,"onClick",null,O.onClick,void 0,M);else if(R&4&&ct(O.style))for(const k in O.style)O.style[k]}let X;(X=O&&O.onVnodeBeforeMount)&&Le(X,M,g),H&&Be(g,null,M,"beforeMount"),((X=O&&O.onVnodeMounted)||H||U)&&Oo(()=>{X&&Le(X,M,g),U&&Y.enter(p),H&&Be(g,null,M,"mounted")},F)}return p.nextSibling},_=(p,g,M,F,C,V,A)=>{A=A||!!g.dynamicChildren;const O=g.children,R=O.length;for(let w=0;w{const{slotScopeIds:A}=g;A&&(C=C?C.concat(A):A);const O=o(p),R=_(i(p),g,O,M,F,C,V);return R&&It(R)&&R.data==="]"?i(g.anchor=R):(Ot(),c(g.anchor=u("]"),O,R),R)},y=(p,g,M,F,C,V)=>{if(Tn(p.parentElement,1)||Ot(),g.el=null,V){const R=$(p);for(;;){const w=i(p);if(w&&w!==R)l(w);else break}}const A=i(p),O=o(p);return l(p),n(null,g,O,A,M,F,Sn(O),C),M&&(M.vnode.el=g.el,mo(M,g.el)),A},$=(p,g="[",M="]")=>{let F=0;for(;p;)if(p=i(p),p&&It(p)&&(p.data===g&&F++,p.data===M)){if(F===0)return i(p);F--}return p},P=(p,g,M)=>{const F=g.parentNode;F&&F.replaceChild(p,g);let C=M;for(;C;)C.vnode.el===g&&(C.vnode.el=C.subTree.el=p),C=C.parent},L=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,d]}const Pr="data-allow-mismatch",yc={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function Tn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Pr);)e=e.parentElement;const n=e&&e.getAttribute(Pr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:s.includes(yc[t])}}Xn().requestIdleCallback;Xn().cancelIdleCallback;function vc(e,t){if(It(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(It(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const Tt=e=>!!e.type.__asyncLoader;function Gu(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let u=null,a,d=0;const m=()=>(d++,u=null,_()),_=()=>{let b;return u||(b=u=t().catch(y=>{if(y=y instanceof Error?y:new Error(String(y)),c)return new Promise(($,P)=>{c(y,()=>$(m()),()=>P(y),d+1)});throw y}).then(y=>b!==u&&u?u:(y&&(y.__esModule||y[Symbol.toStringTag]==="Module")&&(y=y.default),a=y,y)))};return ir({name:"AsyncComponentWrapper",__asyncLoader:_,__asyncHydrate(b,y,$){let P=!1;(y.bu||(y.bu=[])).push(()=>P=!0);const L=()=>{P||$()},p=i?()=>{const g=i(L,M=>vc(b,M));g&&(y.bum||(y.bum=[])).push(g)}:L;a?p():_().then(()=>!y.isUnmounted&&p())},get __asyncResolved(){return a},setup(){const b=ge;if(or(b),a)return()=>En(a,b);const y=p=>{u=null,hn(p,b,13,!s)};if(l&&b.suspense||Vt)return _().then(p=>()=>En(p,b)).catch(p=>(y(p),()=>s?fe(s,{error:p}):null));const $=De(!1),P=De(),L=De(!!r);return r&&setTimeout(()=>{L.value=!1},r),o!=null&&setTimeout(()=>{if(!$.value&&!P.value){const p=new Error(`Async component timed out after ${o}ms.`);y(p),P.value=p}},o),_().then(()=>{$.value=!0,b.parent&&pn(b.parent.vnode)&&b.parent.update()}).catch(p=>{y(p),P.value=p}),()=>{if($.value&&a)return En(a,b);if(P.value&&s)return fe(s,{error:P.value});if(n&&!L.value)return En(n,b)}}})}function En(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=fe(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const pn=e=>e.type.__isKeepAlive;function _c(e,t){ro(e,"a",t)}function bc(e,t){ro(e,"da",t)}function ro(e,t,n=ge){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(ts(t,s,n),n){let r=n.parent;for(;r&&r.parent;)pn(r.parent.vnode)&&wc(s,t,n,r),r=r.parent}}function wc(e,t,n,s){const r=ts(t,e,s,!0);ns(()=>{Gs(s[t],r)},n)}function ts(e,t,n=ge,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{tt();const l=gn(n),c=je(t,n,e,o);return l(),nt(),c});return s?r.unshift(i):r.push(i),i}}const it=e=>(t,n=ge)=>{(!Vt||e==="sp")&&ts(e,(...s)=>t(...s),n)},Sc=it("bm"),kt=it("m"),Tc=it("bu"),Ec=it("u"),io=it("bum"),ns=it("um"),xc=it("sp"),Cc=it("rtg"),Ac=it("rtc");function Rc(e,t=ge){ts("ec",e,t)}const oo="components";function Xu(e,t){return co(oo,e,!0,t)||e}const lo=Symbol.for("v-ndc");function Yu(e){return le(e)?co(oo,e,!1)||e:e||lo}function co(e,t,n=!0,s=!1){const r=me||ge;if(r){const i=r.type;{const l=aa(i,!1);if(l&&(l===t||l===Ee(t)||l===Gn(Ee(t))))return i}const o=Lr(r[e]||i[e],t)||Lr(r.appContext[e],t);return!o&&s?i:o}}function Lr(e,t){return e&&(e[t]||e[Ee(t)]||e[Gn(Ee(t))])}function Ju(e,t,n,s){let r;const i=n,o=K(e);if(o||le(e)){const l=o&&ct(e);let c=!1,u=!1;l&&(c=!Me(e),u=st(e),e=Jn(e)),r=new Array(e.length);for(let a=0,d=e.length;at(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;c0;return t!=="default"&&(n.name=t),ks(),Ws(Te,null,[fe("slot",n,s&&s())],u?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),ks();const o=i&&ao(i(n)),l=n.key||o&&o.key,c=Ws(Te,{key:(l&&!Oe(l)?l:`_${t}`)+(!o&&s?"_fb":"")},o||(s?s():[]),o&&e._===1?64:-2);return!r&&c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),i&&i._c&&(i._d=!0),c}function ao(e){return e.some(t=>cn(t)?!(t.type===pe||t.type===Te&&!ao(t.children)):!0)?e:null}function Qu(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:Mn(s)]=e[s];return n}const Ds=e=>e?Fo(e)?rs(e):Ds(e.parent):null,zt=he(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ds(e.parent),$root:e=>Ds(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>fo(e),$forceUpdate:e=>e.f||(e.f=()=>{sr(e.update)}),$nextTick:e=>e.n||(e.n=Zn.bind(e.proxy)),$watch:e=>lc.bind(e)}),ps=(e,t)=>e!==ne&&!e.__isScriptSetup&&Z(e,t),Mc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;if(t[0]!=="$"){const m=o[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ps(s,t))return o[t]=1,s[t];if(r!==ne&&Z(r,t))return o[t]=2,r[t];if(Z(i,t))return o[t]=3,i[t];if(n!==ne&&Z(n,t))return o[t]=4,n[t];$s&&(o[t]=0)}}const u=zt[t];let a,d;if(u)return t==="$attrs"&&_e(e.attrs,"get",""),u(e);if((a=l.__cssModules)&&(a=a[t]))return a;if(n!==ne&&Z(n,t))return o[t]=4,n[t];if(d=c.config.globalProperties,Z(d,t))return d[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ps(r,t)?(r[t]=n,!0):s!==ne&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:o}},l){let c;return!!(n[l]||e!==ne&&l[0]!=="$"&&Z(e,l)||ps(t,l)||Z(i,l)||Z(s,l)||Z(zt,l)||Z(r.config.globalProperties,l)||(c=o.__cssModules)&&c[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Zu(){return Oc().slots}function Oc(e){const t=At();return t.setupContext||(t.setupContext=Do(t))}function Ir(e){return K(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let $s=!0;function Pc(e){const t=fo(e),n=e.proxy,s=e.ctx;$s=!1,t.beforeCreate&&Nr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:a,beforeMount:d,mounted:m,beforeUpdate:_,updated:b,activated:y,deactivated:$,beforeDestroy:P,beforeUnmount:L,destroyed:p,unmounted:g,render:M,renderTracked:F,renderTriggered:C,errorCaptured:V,serverPrefetch:A,expose:O,inheritAttrs:R,components:w,directives:H,filters:Y}=t;if(u&&Lc(u,s,null),o)for(const X in o){const k=o[X];q(k)&&(s[X]=k.bind(n))}if(r){const X=r.call(n,n);Q(X)&&(e.data=$t(X))}if($s=!0,i)for(const X in i){const k=i[X],ee=q(k)?k.bind(n,n):q(k.get)?k.get.bind(n,n):Xe,mn=!q(k)&&q(k.set)?k.set.bind(n):Xe,dt=ie({get:ee,set:mn});Object.defineProperty(s,X,{enumerable:!0,configurable:!0,get:()=>dt.value,set:ke=>dt.value=ke})}if(l)for(const X in l)uo(l[X],s,n,X);if(c){const X=q(c)?c.call(n):c;Reflect.ownKeys(X).forEach(k=>{rc(k,X[k])})}a&&Nr(a,e,"c");function U(X,k){K(k)?k.forEach(ee=>X(ee.bind(n))):k&&X(k.bind(n))}if(U(Sc,d),U(kt,m),U(Tc,_),U(Ec,b),U(_c,y),U(bc,$),U(Rc,V),U(Ac,F),U(Cc,C),U(io,L),U(ns,g),U(xc,A),K(O))if(O.length){const X=e.exposed||(e.exposed={});O.forEach(k=>{Object.defineProperty(X,k,{get:()=>n[k],set:ee=>n[k]=ee,enumerable:!0})})}else e.exposed||(e.exposed={});M&&e.render===Xe&&(e.render=M),R!=null&&(e.inheritAttrs=R),w&&(e.components=w),H&&(e.directives=H),A&&or(e)}function Lc(e,t,n=Xe){K(e)&&(e=js(e));for(const s in e){const r=e[s];let i;Q(r)?"default"in r?i=St(r.from||s,r.default,!0):i=St(r.from||s):i=St(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Nr(e,t,n){je(K(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function uo(e,t,n,s){let r=s.includes(".")?Ji(n,s):()=>n[s];if(le(e)){const i=t[e];q(i)&&Ne(r,i)}else if(q(e))Ne(r,e.bind(n));else if(Q(e))if(K(e))e.forEach(i=>uo(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Ne(r,i,e)}}function fo(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>kn(c,u,o,!0)),kn(c,t,o)),Q(t)&&i.set(t,c),c}function kn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&kn(e,i,n,!0),r&&r.forEach(o=>kn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Ic[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Ic={data:Fr,props:Hr,emits:Hr,methods:Xt,computed:Xt,beforeCreate:be,created:be,beforeMount:be,mounted:be,beforeUpdate:be,updated:be,beforeDestroy:be,beforeUnmount:be,destroyed:be,unmounted:be,activated:be,deactivated:be,errorCaptured:be,serverPrefetch:be,components:Xt,directives:Xt,watch:Fc,provide:Fr,inject:Nc};function Fr(e,t){return t?e?function(){return he(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Nc(e,t){return Xt(js(e),js(t))}function js(e){if(K(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ee(t)}Modifiers`]||e[`${ft(t)}Modifiers`];function jc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ne;let r=n;const i=t.startsWith("update:"),o=i&&$c(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>le(a)?a.trim():a)),o.number&&(r=n.map(Xs)));let l,c=s[l=Mn(t)]||s[l=Mn(Ee(t))];!c&&i&&(c=s[l=Mn(ft(t))]),c&&je(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,je(u,e,6,r)}}const Vc=new WeakMap;function po(e,t,n=!1){const s=n?Vc:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=u=>{const a=po(u,t,!0);a&&(l=!0,he(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(Q(e)&&s.set(e,null),null):(K(i)?i.forEach(c=>o[c]=null):he(o,i),Q(e)&&s.set(e,o),o)}function ss(e,t){return!e||!un(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,ft(t))||Z(e,t))}function gs(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:a,props:d,data:m,setupState:_,ctx:b,inheritAttrs:y}=e,$=jn(e);let P,L;try{if(n.shapeFlag&4){const g=r||s,M=g;P=Ie(u.call(M,g,a,d,_,m,b)),L=l}else{const g=t;P=Ie(g.length>1?g(d,{attrs:l,slots:o,emit:c}):g(d,null)),L=t.props?l:kc(l)}}catch(g){Zt.length=0,hn(g,e,1),P=fe(pe)}let p=P;if(L&&y!==!1){const g=Object.keys(L),{shapeFlag:M}=p;g.length&&M&7&&(i&&g.some(Bn)&&(L=Wc(L,i)),p=at(p,L,!1,!0))}return n.dirs&&(p=at(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&on(p,n.transition),P=p,jn($),P}const kc=e=>{let t;for(const n in e)(n==="class"||n==="style"||un(n))&&((t||(t={}))[n]=e[n]);return t},Wc=(e,t)=>{const n={};for(const s in e)(!Bn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Uc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Dr(s,o,u):!!o;if(c&8){const a=t.dynamicProps;for(let d=0;dObject.create(yo),_o=e=>Object.getPrototypeOf(e)===yo;function Bc(e,t,n,s=!1){const r={},i=vo();e.propsDefaults=Object.create(null),bo(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:kl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Kc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=z(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let d=0;d{c=!0;const[m,_]=wo(d,t,!0);he(o,m),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return Q(e)&&s.set(e,Nt),Nt;if(K(i))for(let a=0;ae==="_"||e==="_ctx"||e==="$stable",cr=e=>K(e)?e.map(Ie):[Ie(e)],Gc=(e,t,n)=>{if(t._n)return t;const s=sc((...r)=>cr(t(...r)),n);return s._c=!1,s},So=(e,t,n)=>{const s=e._ctx;for(const r in e){if(lr(r))continue;const i=e[r];if(q(i))t[r]=Gc(r,i,s);else if(i!=null){const o=cr(i);t[r]=()=>o}}},To=(e,t)=>{const n=cr(t);e.slots.default=()=>n},Eo=(e,t,n)=>{for(const s in t)(n||!lr(s))&&(e[s]=t[s])},Xc=(e,t,n)=>{const s=e.slots=vo();if(e.vnode.shapeFlag&32){const r=t._;r?(Eo(s,t,n),n&&Ei(s,"_",r,!0)):So(t,s)}else t&&To(e,t)},Yc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ne;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:Eo(r,t,n):(i=!t.$stable,So(t,r)),o=t}else t&&(To(e,t),o={default:1});if(i)for(const l in r)!lr(l)&&o[l]==null&&delete r[l]},we=Oo;function Jc(e){return xo(e)}function zc(e){return xo(e,mc)}function xo(e,t){const n=Xn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:a,parentNode:d,nextSibling:m,setScopeId:_=Xe,insertStaticContent:b}=e,y=(f,h,v,x=null,S=null,T=null,D=void 0,N=null,I=!!h.dynamicChildren)=>{if(f===h)return;f&&!_t(f,h)&&(x=yn(f),ke(f,S,T,!0),f=null),h.patchFlag===-2&&(I=!1,h.dynamicChildren=null);const{type:E,ref:B,shapeFlag:j}=h;switch(E){case xt:$(f,h,v,x);break;case pe:P(f,h,v,x);break;case Qt:f==null&&L(h,v,x,D);break;case Te:w(f,h,v,x,S,T,D,N,I);break;default:j&1?M(f,h,v,x,S,T,D,N,I):j&6?H(f,h,v,x,S,T,D,N,I):(j&64||j&128)&&E.process(f,h,v,x,S,T,D,N,I,Rt)}B!=null&&S?Dt(B,f&&f.ref,T,h||f,!h):B==null&&f&&f.ref!=null&&Dt(f.ref,null,T,f,!0)},$=(f,h,v,x)=>{if(f==null)s(h.el=l(h.children),v,x);else{const S=h.el=f.el;h.children!==f.children&&u(S,h.children)}},P=(f,h,v,x)=>{f==null?s(h.el=c(h.children||""),v,x):h.el=f.el},L=(f,h,v,x)=>{[f.el,f.anchor]=b(f.children,h,v,x,f.el,f.anchor)},p=({el:f,anchor:h},v,x)=>{let S;for(;f&&f!==h;)S=m(f),s(f,v,x),f=S;s(h,v,x)},g=({el:f,anchor:h})=>{let v;for(;f&&f!==h;)v=m(f),r(f),f=v;r(h)},M=(f,h,v,x,S,T,D,N,I)=>{if(h.type==="svg"?D="svg":h.type==="math"&&(D="mathml"),f==null)F(h,v,x,S,T,D,N,I);else{const E=f.el&&f.el._isVueCE?f.el:null;try{E&&E._beginPatch(),A(f,h,S,T,D,N,I)}finally{E&&E._endPatch()}}},F=(f,h,v,x,S,T,D,N)=>{let I,E;const{props:B,shapeFlag:j,transition:W,dirs:G}=f;if(I=f.el=o(f.type,T,B&&B.is,B),j&8?a(I,f.children):j&16&&V(f.children,I,null,x,S,ms(f,T),D,N),G&&Be(f,null,x,"created"),C(I,f,f.scopeId,D,x),B){for(const te in B)te!=="value"&&!bt(te)&&i(I,te,null,B[te],T,x);"value"in B&&i(I,"value",null,B.value,T),(E=B.onVnodeBeforeMount)&&Le(E,x,f)}G&&Be(f,null,x,"beforeMount");const J=Co(S,W);J&&W.beforeEnter(I),s(I,h,v),((E=B&&B.onVnodeMounted)||J||G)&&we(()=>{try{E&&Le(E,x,f),J&&W.enter(I),G&&Be(f,null,x,"mounted")}finally{}},S)},C=(f,h,v,x,S)=>{if(v&&_(f,v),x)for(let T=0;T{for(let E=I;E{const N=h.el=f.el;let{patchFlag:I,dynamicChildren:E,dirs:B}=h;I|=f.patchFlag&16;const j=f.props||ne,W=h.props||ne;let G;if(v&&pt(v,!1),(G=W.onVnodeBeforeUpdate)&&Le(G,v,h,f),B&&Be(h,f,v,"beforeUpdate"),v&&pt(v,!0),(j.innerHTML&&W.innerHTML==null||j.textContent&&W.textContent==null)&&a(N,""),E?O(f.dynamicChildren,E,N,v,x,ms(h,S),T):D||k(f,h,N,null,v,x,ms(h,S),T,!1),I>0){if(I&16)R(N,j,W,v,S);else if(I&2&&j.class!==W.class&&i(N,"class",null,W.class,S),I&4&&i(N,"style",j.style,W.style,S),I&8){const J=h.dynamicProps;for(let te=0;te{G&&Le(G,v,h,f),B&&Be(h,f,v,"updated")},x)},O=(f,h,v,x,S,T,D)=>{for(let N=0;N{if(h!==v){if(h!==ne)for(const T in h)!bt(T)&&!(T in v)&&i(f,T,h[T],null,S,x);for(const T in v){if(bt(T))continue;const D=v[T],N=h[T];D!==N&&T!=="value"&&i(f,T,N,D,S,x)}"value"in v&&i(f,"value",h.value,v.value,S)}},w=(f,h,v,x,S,T,D,N,I)=>{const E=h.el=f?f.el:l(""),B=h.anchor=f?f.anchor:l("");let{patchFlag:j,dynamicChildren:W,slotScopeIds:G}=h;G&&(N=N?N.concat(G):G),f==null?(s(E,v,x),s(B,v,x),V(h.children||[],v,B,S,T,D,N,I)):j>0&&j&64&&W&&f.dynamicChildren&&f.dynamicChildren.length===W.length?(O(f.dynamicChildren,W,v,S,T,D,N),(h.key!=null||S&&h===S.subTree)&&ar(f,h,!0)):k(f,h,v,B,S,T,D,N,I)},H=(f,h,v,x,S,T,D,N,I)=>{h.slotScopeIds=N,f==null?h.shapeFlag&512?S.ctx.activate(h,v,x,D,I):Y(h,v,x,S,T,D,I):oe(f,h,I)},Y=(f,h,v,x,S,T,D)=>{const N=f.component=ia(f,x,S);if(pn(f)&&(N.ctx.renderer=Rt),oa(N,!1,D),N.asyncDep){if(S&&S.registerDep(N,U,D),!f.el){const I=N.subTree=fe(pe);P(null,I,h,v),f.placeholder=I.el}}else U(N,f,h,v,S,T,D)},oe=(f,h,v)=>{const x=h.component=f.component;if(Uc(f,h,v))if(x.asyncDep&&!x.asyncResolved){X(x,h,v);return}else x.next=h,x.update();else h.el=f.el,x.vnode=h},U=(f,h,v,x,S,T,D)=>{const N=()=>{if(f.isMounted){let{next:j,bu:W,u:G,parent:J,vnode:te}=f;{const Ce=Ao(f);if(Ce){j&&(j.el=te.el,X(f,j,D)),Ce.asyncDep.then(()=>{we(()=>{f.isUnmounted||E()},S)});return}}let se=j,ue;pt(f,!1),j?(j.el=te.el,X(f,j,D)):j=te,W&&On(W),(ue=j.props&&j.props.onVnodeBeforeUpdate)&&Le(ue,J,j,te),pt(f,!0);const de=gs(f),Fe=f.subTree;f.subTree=de,y(Fe,de,d(Fe.el),yn(Fe),f,S,T),j.el=de.el,se===null&&mo(f,de.el),G&&we(G,S),(ue=j.props&&j.props.onVnodeUpdated)&&we(()=>Le(ue,J,j,te),S)}else{let j;const{el:W,props:G}=h,{bm:J,m:te,parent:se,root:ue,type:de}=f,Fe=Tt(h);if(pt(f,!1),J&&On(J),!Fe&&(j=G&&G.onVnodeBeforeMount)&&Le(j,se,h),pt(f,!0),W&&cs){const Ce=()=>{f.subTree=gs(f),cs(W,f.subTree,f,S,null)};Fe&&de.__asyncHydrate?de.__asyncHydrate(W,f,Ce):Ce()}else{ue.ce&&ue.ce._hasShadowRoot()&&ue.ce._injectChildStyle(de,f.parent?f.parent.type:void 0);const Ce=f.subTree=gs(f);y(null,Ce,v,x,f,S,T),h.el=Ce.el}if(te&&we(te,S),!Fe&&(j=G&&G.onVnodeMounted)){const Ce=h;we(()=>Le(j,se,Ce),S)}(h.shapeFlag&256||se&&Tt(se.vnode)&&se.vnode.shapeFlag&256)&&f.a&&we(f.a,S),f.isMounted=!0,h=v=x=null}};f.scope.on();const I=f.effect=new Mi(N);f.scope.off();const E=f.update=I.run.bind(I),B=f.job=I.runIfDirty.bind(I);B.i=f,B.id=f.uid,I.scheduler=()=>sr(B),pt(f,!0),E()},X=(f,h,v)=>{h.component=f;const x=f.vnode.props;f.vnode=h,f.next=null,Kc(f,h.props,x,v),Yc(f,h.children,v),tt(),Er(f),nt()},k=(f,h,v,x,S,T,D,N,I=!1)=>{const E=f&&f.children,B=f?f.shapeFlag:0,j=h.children,{patchFlag:W,shapeFlag:G}=h;if(W>0){if(W&128){mn(E,j,v,x,S,T,D,N,I);return}else if(W&256){ee(E,j,v,x,S,T,D,N,I);return}}G&8?(B&16&&Wt(E,S,T),j!==E&&a(v,j)):B&16?G&16?mn(E,j,v,x,S,T,D,N,I):Wt(E,S,T,!0):(B&8&&a(v,""),G&16&&V(j,v,x,S,T,D,N,I))},ee=(f,h,v,x,S,T,D,N,I)=>{f=f||Nt,h=h||Nt;const E=f.length,B=h.length,j=Math.min(E,B);let W;for(W=0;WB?Wt(f,S,T,!0,!1,j):V(h,v,x,S,T,D,N,I,j)},mn=(f,h,v,x,S,T,D,N,I)=>{let E=0;const B=h.length;let j=f.length-1,W=B-1;for(;E<=j&&E<=W;){const G=f[E],J=h[E]=I?Qe(h[E]):Ie(h[E]);if(_t(G,J))y(G,J,v,null,S,T,D,N,I);else break;E++}for(;E<=j&&E<=W;){const G=f[j],J=h[W]=I?Qe(h[W]):Ie(h[W]);if(_t(G,J))y(G,J,v,null,S,T,D,N,I);else break;j--,W--}if(E>j){if(E<=W){const G=W+1,J=GW)for(;E<=j;)ke(f[E],S,T,!0),E++;else{const G=E,J=E,te=new Map;for(E=J;E<=W;E++){const Ae=h[E]=I?Qe(h[E]):Ie(h[E]);Ae.key!=null&&te.set(Ae.key,E)}let se,ue=0;const de=W-J+1;let Fe=!1,Ce=0;const Ut=new Array(de);for(E=0;E=de){ke(Ae,S,T,!0);continue}let We;if(Ae.key!=null)We=te.get(Ae.key);else for(se=J;se<=W;se++)if(Ut[se-J]===0&&_t(Ae,h[se])){We=se;break}We===void 0?ke(Ae,S,T,!0):(Ut[We-J]=E+1,We>=Ce?Ce=We:Fe=!0,y(Ae,h[We],v,null,S,T,D,N,I),ue++)}const yr=Fe?Qc(Ut):Nt;for(se=yr.length-1,E=de-1;E>=0;E--){const Ae=J+E,We=h[Ae],vr=h[Ae+1],_r=Ae+1{const{el:T,type:D,transition:N,children:I,shapeFlag:E}=f;if(E&6){dt(f.component.subTree,h,v,x);return}if(E&128){f.suspense.move(h,v,x);return}if(E&64){D.move(f,h,v,Rt);return}if(D===Te){s(T,h,v);for(let j=0;jN.enter(T),S);else{const{leave:j,delayLeave:W,afterLeave:G}=N,J=()=>{f.ctx.isUnmounted?r(T):s(T,h,v)},te=()=>{T._isLeaving&&T[Ke](!0),j(T,()=>{J(),G&&G()})};W?W(T,J,te):te()}else s(T,h,v)},ke=(f,h,v,x=!1,S=!1)=>{const{type:T,props:D,ref:N,children:I,dynamicChildren:E,shapeFlag:B,patchFlag:j,dirs:W,cacheIndex:G,memo:J}=f;if(j===-2&&(S=!1),N!=null&&(tt(),Dt(N,null,v,f,!0),nt()),G!=null&&(h.renderCache[G]=void 0),B&256){h.ctx.deactivate(f);return}const te=B&1&&W,se=!Tt(f);let ue;if(se&&(ue=D&&D.onVnodeBeforeUnmount)&&Le(ue,h,f),B&6)ol(f.component,v,x);else{if(B&128){f.suspense.unmount(v,x);return}te&&Be(f,null,h,"beforeUnmount"),B&64?f.type.remove(f,h,v,Rt,x):E&&!E.hasOnce&&(T!==Te||j>0&&j&64)?Wt(E,h,v,!1,!0):(T===Te&&j&384||!S&&B&16)&&Wt(I,h,v),x&&gr(f)}const de=J!=null&&G==null;(se&&(ue=D&&D.onVnodeUnmounted)||te||de)&&we(()=>{ue&&Le(ue,h,f),te&&Be(f,null,h,"unmounted"),de&&(f.el=null)},v)},gr=f=>{const{type:h,el:v,anchor:x,transition:S}=f;if(h===Te){il(v,x);return}if(h===Qt){g(f);return}const T=()=>{r(v),S&&!S.persisted&&S.afterLeave&&S.afterLeave()};if(f.shapeFlag&1&&S&&!S.persisted){const{leave:D,delayLeave:N}=S,I=()=>D(v,T);N?N(f.el,T,I):I()}else T()},il=(f,h)=>{let v;for(;f!==h;)v=m(f),r(f),f=v;r(h)},ol=(f,h,v)=>{const{bum:x,scope:S,job:T,subTree:D,um:N,m:I,a:E}=f;jr(I),jr(E),x&&On(x),S.stop(),T&&(T.flags|=8,ke(D,f,h,v)),N&&we(N,h),we(()=>{f.isUnmounted=!0},h)},Wt=(f,h,v,x=!1,S=!1,T=0)=>{for(let D=T;D{if(f.shapeFlag&6)return yn(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const h=m(f.anchor||f.el),v=h&&h[zi];return v?m(v):h};let os=!1;const mr=(f,h,v)=>{let x;f==null?h._vnode&&(ke(h._vnode,null,null,!0),x=h._vnode.component):y(h._vnode||null,f,h,null,null,null,v),h._vnode=f,os||(os=!0,Er(x),$n(),os=!1)},Rt={p:y,um:ke,m:dt,r:gr,mt:Y,mc:V,pc:k,pbc:O,n:yn,o:e};let ls,cs;return t&&([ls,cs]=t(Rt)),{render:mr,hydrate:ls,createApp:Dc(mr,ls)}}function ms({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function pt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Co(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ar(e,t,n=!1){const s=e.children,r=t.children;if(K(s)&&K(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Ao(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ao(t)}function jr(e){if(e)for(let t=0;te.__isSuspense;function Oo(e,t){t&&t.pendingBranch?K(e)?t.effects.push(...e):t.effects.push(e):nc(e)}const Te=Symbol.for("v-fgt"),xt=Symbol.for("v-txt"),pe=Symbol.for("v-cmt"),Qt=Symbol.for("v-stc"),Zt=[];let Re=null;function ks(e=!1){Zt.push(Re=e?null:[])}function Zc(){Zt.pop(),Re=Zt[Zt.length-1]||null}let ln=1;function Wn(e,t=!1){ln+=e,e<0&&Re&&t&&(Re.hasOnce=!0)}function Po(e){return e.dynamicChildren=ln>0?Re||Nt:null,Zc(),ln>0&&Re&&Re.push(e),e}function ef(e,t,n,s,r,i){return Po(Io(e,t,n,s,r,i,!0))}function Ws(e,t,n,s,r){return Po(fe(e,t,n,s,r,!0))}function cn(e){return e?e.__v_isVNode===!0:!1}function _t(e,t){return e.type===t.type&&e.key===t.key}const Lo=({key:e})=>e??null,Ln=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?le(e)||ae(e)||q(e)?{i:me,r:e,k:t,f:!!n}:e:null);function Io(e,t=null,n=null,s=0,r=null,i=e===Te?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Lo(t),ref:t&&Ln(t),scopeId:Xi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:me};return l?(ur(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=le(n)?8:16),ln>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const fe=ea;function ea(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===lo)&&(e=pe),cn(e)){const l=at(e,t,!0);return n&&ur(l,n),ln>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag=-2,l}if(ua(e)&&(e=e.__vccOpts),t){t=ta(t);let{class:l,style:c}=t;l&&!le(l)&&(t.class=Js(l)),Q(c)&&(zn(c)&&!K(c)&&(c=he({},c)),t.style=Ys(c))}const o=le(e)?1:Mo(e)?128:Qi(e)?64:Q(e)?4:q(e)?2:0;return Io(e,t,n,s,r,o,i,!0)}function ta(e){return e?zn(e)||_o(e)?he({},e):e:null}function at(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?na(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Lo(u),ref:t&&t.ref?n&&i?K(i)?i.concat(Ln(t)):[i,Ln(t)]:Ln(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Te?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&at(e.ssContent),ssFallback:e.ssFallback&&at(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&on(a,c.clone(a)),a}function No(e=" ",t=0){return fe(xt,null,e,t)}function tf(e,t){const n=fe(Qt,null,e);return n.staticCount=t,n}function nf(e="",t=!1){return t?(ks(),Ws(pe,null,e)):fe(pe,null,e)}function Ie(e){return e==null||typeof e=="boolean"?fe(pe):K(e)?fe(Te,null,e.slice()):cn(e)?Qe(e):fe(xt,null,String(e))}function Qe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:at(e)}function ur(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(K(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ur(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!_o(t)?t._ctx=me:r===3&&me&&(me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:me},n=32):(t=String(t),s&64?(n=16,t=[No(t)]):n=8);e.children=t,e.shapeFlag|=n}function na(...e){const t={};for(let n=0;nge||me;let Un,Us;{const e=Xn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Un=t("__VUE_INSTANCE_SETTERS__",n=>ge=n),Us=t("__VUE_SSR_SETTERS__",n=>Vt=n)}const gn=e=>{const t=ge;return Un(e),e.scope.on(),()=>{e.scope.off(),Un(t)}},Vr=()=>{ge&&ge.scope.off(),Un(null)};function Fo(e){return e.vnode.shapeFlag&4}let Vt=!1;function oa(e,t=!1,n=!1){t&&Us(t);const{props:s,children:r}=e.vnode,i=Fo(e);Bc(e,s,i,t),Xc(e,r,n||t);const o=i?la(e,t):void 0;return t&&Us(!1),o}function la(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Mc);const{setup:s}=n;if(s){tt();const r=e.setupContext=s.length>1?Do(e):null,i=gn(e),o=dn(s,e,0,[e.props,r]),l=wi(o);if(nt(),i(),(l||e.sp)&&!Tt(e)&&or(e),l){if(o.then(Vr,Vr),t)return o.then(c=>{kr(e,c)}).catch(c=>{hn(c,e,0)});e.asyncDep=o}else kr(e,o)}else Ho(e)}function kr(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Q(t)&&(e.setupState=Bi(t)),Ho(e)}function Ho(e,t,n){const s=e.type;e.render||(e.render=s.render||Xe);{const r=gn(e);tt();try{Pc(e)}finally{nt(),r()}}}const ca={get(e,t){return _e(e,"get",""),e[t]}};function Do(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,ca),slots:e.slots,emit:e.emit,expose:t}}function rs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Bi(Pn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in zt)return zt[n](e)},has(t,n){return n in t||n in zt}})):e.proxy}function aa(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function ua(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>zl(e,t,Vt);function Bs(e,t,n){try{Wn(-1);const s=arguments.length;return s===2?Q(t)&&!K(t)?cn(t)?fe(e,null,[t]):fe(e,t):fe(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&cn(n)&&(n=[n]),fe(e,t,n))}finally{Wn(1)}}const fa="3.5.32";/** -* @vue/runtime-dom v3.5.32 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Ks;const Wr=typeof window<"u"&&window.trustedTypes;if(Wr)try{Ks=Wr.createPolicy("vue",{createHTML:e=>e})}catch{}const $o=Ks?e=>Ks.createHTML(e):e=>e,da="http://www.w3.org/2000/svg",ha="http://www.w3.org/1998/Math/MathML",ze=typeof document<"u"?document:null,Ur=ze&&ze.createElement("template"),pa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?ze.createElementNS(da,e):t==="mathml"?ze.createElementNS(ha,e):n?ze.createElement(e,{is:n}):ze.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>ze.createTextNode(e),createComment:e=>ze.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ze.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Ur.innerHTML=$o(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Ur.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ot="transition",qt="animation",an=Symbol("_vtc"),jo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ga=he({},Zi,jo),ma=e=>(e.displayName="Transition",e.props=ga,e),sf=ma((e,{slots:t})=>Bs(hc,ya(e),t)),gt=(e,t=[])=>{K(e)?e.forEach(n=>n(...t)):e&&e(...t)},Br=e=>e?K(e)?e.some(t=>t.length>1):e.length>1:!1;function ya(e){const t={};for(const w in e)w in jo||(t[w]=e[w]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:a=l,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,b=va(r),y=b&&b[0],$=b&&b[1],{onBeforeEnter:P,onEnter:L,onEnterCancelled:p,onLeave:g,onLeaveCancelled:M,onBeforeAppear:F=P,onAppear:C=L,onAppearCancelled:V=p}=t,A=(w,H,Y,oe)=>{w._enterCancelled=oe,mt(w,H?a:l),mt(w,H?u:o),Y&&Y()},O=(w,H)=>{w._isLeaving=!1,mt(w,d),mt(w,_),mt(w,m),H&&H()},R=w=>(H,Y)=>{const oe=w?C:L,U=()=>A(H,w,Y);gt(oe,[H,U]),Kr(()=>{mt(H,w?c:i),Je(H,w?a:l),Br(oe)||qr(H,s,y,U)})};return he(t,{onBeforeEnter(w){gt(P,[w]),Je(w,i),Je(w,o)},onBeforeAppear(w){gt(F,[w]),Je(w,c),Je(w,u)},onEnter:R(!1),onAppear:R(!0),onLeave(w,H){w._isLeaving=!0;const Y=()=>O(w,H);Je(w,d),w._enterCancelled?(Je(w,m),Yr(w)):(Yr(w),Je(w,m)),Kr(()=>{w._isLeaving&&(mt(w,d),Je(w,_),Br(g)||qr(w,s,$,Y))}),gt(g,[w,Y])},onEnterCancelled(w){A(w,!1,void 0,!0),gt(p,[w])},onAppearCancelled(w){A(w,!0,void 0,!0),gt(V,[w])},onLeaveCancelled(w){O(w),gt(M,[w])}})}function va(e){if(e==null)return null;if(Q(e))return[ys(e.enter),ys(e.leave)];{const t=ys(e);return[t,t]}}function ys(e){return fl(e)}function Je(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[an]||(e[an]=new Set)).add(t)}function mt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[an];n&&(n.delete(t),n.size||(e[an]=void 0))}function Kr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let _a=0;function qr(e,t,n,s){const r=e._endId=++_a,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=ba(e,t);if(!o)return s();const u=o+"end";let a=0;const d=()=>{e.removeEventListener(u,m),i()},m=_=>{_.target===e&&++a>=c&&d()};setTimeout(()=>{a(n[b]||"").split(", "),r=s(`${ot}Delay`),i=s(`${ot}Duration`),o=Gr(r,i),l=s(`${qt}Delay`),c=s(`${qt}Duration`),u=Gr(l,c);let a=null,d=0,m=0;t===ot?o>0&&(a=ot,d=o,m=i.length):t===qt?u>0&&(a=qt,d=u,m=c.length):(d=Math.max(o,u),a=d>0?o>u?ot:qt:null,m=a?a===ot?i.length:c.length:0);const _=a===ot&&/\b(?:transform|all)(?:,|$)/.test(s(`${ot}Property`).toString());return{type:a,timeout:d,propCount:m,hasTransform:_}}function Gr(e,t){for(;e.lengthXr(n)+Xr(e[s])))}function Xr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Yr(e){return(e?e.ownerDocument:document).body.offsetHeight}function wa(e,t,n){const s=e[an];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Jr=Symbol("_vod"),Sa=Symbol("_vsh"),Ta=Symbol(""),Ea=/(?:^|;)\s*display\s*:/;function xa(e,t,n){const s=e.style,r=le(n);let i=!1;if(n&&!r){if(t)if(le(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&In(s,l,"")}else for(const o in t)n[o]==null&&In(s,o,"");for(const o in n)o==="display"&&(i=!0),In(s,o,n[o])}else if(r){if(t!==n){const o=s[Ta];o&&(n+=";"+o),s.cssText=n,i=Ea.test(n)}}else t&&e.removeAttribute("style");Jr in e&&(e[Jr]=i?s.display:"",e[Sa]&&(s.display="none"))}const zr=/\s*!important$/;function In(e,t,n){if(K(n))n.forEach(s=>In(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Ca(e,t);zr.test(n)?e.setProperty(ft(s),n.replace(zr,""),"important"):e[s]=n}}const Qr=["Webkit","Moz","ms"],vs={};function Ca(e,t){const n=vs[t];if(n)return n;let s=Ee(t);if(s!=="filter"&&s in e)return vs[t]=s;s=Gn(s);for(let r=0;r_s||(Oa.then(()=>_s=0),_s=Date.now());function La(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;je(Ia(s,n.value),t,5,[s])};return n.value=e,n.attached=Pa(),n}function Ia(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ri=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Na=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?wa(e,s,o):t==="style"?xa(e,n,s):un(t)?Bn(t)||Ra(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Fa(e,t,s,o))?(ti(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ei(e,t,s,o,i,t!=="value")):e._isVueCE&&(Ha(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!le(s)))?ti(e,Ee(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ei(e,t,s,o))};function Fa(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ri(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return ri(t)&&le(n)?!1:t in e}function Ha(e,t){const n=e._def.props;if(!n)return!1;const s=Ee(t);return Array.isArray(n)?n.some(r=>Ee(r)===s):Object.keys(n).some(r=>Ee(r)===s)}const ii=e=>{const t=e.props["onUpdate:modelValue"]||!1;return K(t)?n=>On(t,n):t};function Da(e){e.target.composing=!0}function oi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const bs=Symbol("_assign");function li(e,t,n){return t&&(e=e.trim()),n&&(e=Xs(e)),e}const rf={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[bs]=ii(r);const i=s||r.props&&r.props.type==="number";Lt(e,t?"change":"input",o=>{o.target.composing||e[bs](li(e.value,n,i))}),(n||i)&&Lt(e,"change",()=>{e.value=li(e.value,n,i)}),t||(Lt(e,"compositionstart",Da),Lt(e,"compositionend",oi),Lt(e,"change",oi))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[bs]=ii(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Xs(e.value):e.value,c=t??"";if(l===c)return;const u=e.getRootNode();(u instanceof Document||u instanceof ShadowRoot)&&u.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c)}},$a=["ctrl","shift","alt","meta"],ja={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>$a.some(n=>e[`${n}Key`]&&!t.includes(n))},of=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=ft(r.key);if(t.some(o=>o===i||Va[o]===i))return e(r)})},Vo=he({patchProp:Na},pa);let en,ci=!1;function ka(){return en||(en=Jc(Vo))}function Wa(){return en=ci?en:zc(Vo),ci=!0,en}const cf=(...e)=>{const t=ka().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Wo(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,ko(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},af=(...e)=>{const t=Wa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Wo(s);if(r)return n(r,!0,ko(r))},t};function ko(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Wo(e){return le(e)?document.querySelector(e):e}const Ua=window.__VP_SITE_DATA__;function Uo(e){return Ri()?(wl(e),!0):!1}const ws=new WeakMap,Ba=(...e)=>{var t;const n=e[0],s=(t=At())==null?void 0:t.proxy;if(s==null&&!Yi())throw new Error("injectLocal must be called in setup");return s&&ws.has(s)&&n in ws.get(s)?ws.get(s)[n]:St(...e)},Bo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const uf=e=>e!=null,Ka=Object.prototype.toString,qa=e=>Ka.call(e)==="[object Object]",ut=()=>{},ai=Ga();function Ga(){var e,t;return Bo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function fr(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Ko=e=>e();function qo(e,t={}){let n,s,r=ut;const i=c=>{clearTimeout(c),r(),r=ut};let o;return c=>{const u=ce(e),a=ce(t.maxWait);return n&&i(n),u<=0||a!==void 0&&a<=0?(s&&(i(s),s=null),Promise.resolve(c())):new Promise((d,m)=>{r=t.rejectOnCancel?m:d,o=c,a&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,d(o())},a)),n=setTimeout(()=>{s&&i(s),s=null,d(c())},u)})}}function Xa(...e){let t=0,n,s=!0,r=ut,i,o,l,c,u;!ae(e[0])&&typeof e[0]=="object"?{delay:o,trailing:l=!0,leading:c=!0,rejectOnCancel:u=!1}=e[0]:[o,l=!0,c=!0,u=!1]=e;const a=()=>{n&&(clearTimeout(n),n=void 0,r(),r=ut)};return m=>{const _=ce(o),b=Date.now()-t,y=()=>i=m();return a(),_<=0?(t=Date.now(),y()):(b>_&&(c||!s)?(t=Date.now(),y()):l&&(i=new Promise(($,P)=>{r=u?P:$,n=setTimeout(()=>{t=Date.now(),s=!0,$(y()),a()},Math.max(0,_-b))})),!c&&!n&&(n=setTimeout(()=>s=!0,_)),s=!1,i)}}function Ya(e=Ko,t={}){const{initialState:n="active"}=t,s=dr(n==="active");function r(){s.value=!1}function i(){s.value=!0}return{isActive:sn(s),pause:r,resume:i,eventFilter:(...l)=>{s.value&&e(...l)}}}function ui(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Ja(e){return At()}function Ss(e){return Array.isArray(e)?e:[e]}function dr(...e){if(e.length!==1)return Xl(...e);const t=e[0];return typeof t=="function"?sn(Kl(()=>({get:t,set:ut}))):De(t)}function za(e,t=200,n={}){return fr(qo(t,n),e)}function Qa(e,t=200,n=!1,s=!0,r=!1){return fr(Xa(t,n,s,r),e)}function Go(e,t,n={}){const{eventFilter:s=Ko,...r}=n;return Ne(e,fr(s,t),r)}function Za(e,t,n={}){const{eventFilter:s,initialState:r="active",...i}=n,{eventFilter:o,pause:l,resume:c,isActive:u}=Ya(s,{initialState:r});return{stop:Go(e,t,{...i,eventFilter:o}),pause:l,resume:c,isActive:u}}function is(e,t=!0,n){Ja()?kt(e,n):t?e():Zn(e)}function ff(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Go(e,t,{...i,eventFilter:qo(s,{maxWait:r})})}function eu(e,t,n){return Ne(e,t,{...n,immediate:!0})}function df(e,t,n){let s;ae(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=ut}=s,c=xe(!r),u=o?xe(t):De(t);let a=0;return rr(async d=>{if(!c.value)return;a++;const m=a;let _=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const b=await e(y=>{d(()=>{i&&(i.value=!1),_||y()})});m===a&&(u.value=b)}catch(b){l(b)}finally{i&&m===a&&(i.value=!1),_=!0}}),r?ie(()=>(c.value=!0,u.value)):u}const Ve=Bo?window:void 0;function hr(e){var t;const n=ce(e);return(t=n==null?void 0:n.$el)!=null?t:n}function rt(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},s=(l,c,u,a)=>(l.addEventListener(c,u,a),()=>l.removeEventListener(c,u,a)),r=ie(()=>{const l=Ss(ce(e[0])).filter(c=>c!=null);return l.every(c=>typeof c!="string")?l:void 0}),i=eu(()=>{var l,c;return[(c=(l=r.value)==null?void 0:l.map(u=>hr(u)))!=null?c:[Ve].filter(u=>u!=null),Ss(ce(r.value?e[1]:e[0])),Ss(Qn(r.value?e[2]:e[1])),ce(r.value?e[3]:e[2])]},([l,c,u,a])=>{if(n(),!(l!=null&&l.length)||!(c!=null&&c.length)||!(u!=null&&u.length))return;const d=qa(a)?{...a}:a;t.push(...l.flatMap(m=>c.flatMap(_=>u.map(b=>s(m,_,b,d)))))},{flush:"post"}),o=()=>{i(),n()};return Uo(n),o}function tu(){const e=xe(!1),t=At();return t&&kt(()=>{e.value=!0},t),e}function nu(e){const t=tu();return ie(()=>(t.value,!!e()))}function su(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function hf(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Ve,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=su(t);return rt(r,i,a=>{a.repeat&&ce(l)||c(a)&&n(a)},o)}const ru=Symbol("vueuse-ssr-width");function iu(){const e=Yi()?Ba(ru,null):null;return typeof e=="number"?e:void 0}function Xo(e,t={}){const{window:n=Ve,ssrWidth:s=iu()}=t,r=nu(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),i=xe(typeof s=="number"),o=xe(),l=xe(!1),c=u=>{l.value=u.matches};return rr(()=>{if(i.value){i.value=!r.value;const u=ce(e).split(",");l.value=u.some(a=>{const d=a.includes("not all"),m=a.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),_=a.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let b=!!(m||_);return m&&b&&(b=s>=ui(m[1])),_&&b&&(b=s<=ui(_[1])),d?!b:b});return}r.value&&(o.value=n.matchMedia(ce(e)),l.value=o.value.matches)}),rt(o,"change",c,{passive:!0}),ie(()=>l.value)}const xn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Cn="__vueuse_ssr_handlers__",ou=lu();function lu(){return Cn in xn||(xn[Cn]=xn[Cn]||{}),xn[Cn]}function Yo(e,t){return ou[e]||t}function Jo(e){return Xo("(prefers-color-scheme: dark)",e)}function cu(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const au={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},fi="vueuse-storage";function pr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:a,window:d=Ve,eventFilter:m,onError:_=R=>{console.error(R)},initOnMounted:b}=s,y=(a?xe:De)(typeof t=="function"?t():t),$=ie(()=>ce(e));if(!n)try{n=Yo("getDefaultStorage",()=>{var R;return(R=Ve)==null?void 0:R.localStorage})()}catch(R){_(R)}if(!n)return y;const P=ce(t),L=cu(P),p=(r=s.serializer)!=null?r:au[L],{pause:g,resume:M}=Za(y,()=>C(y.value),{flush:i,deep:o,eventFilter:m});Ne($,()=>A(),{flush:i}),d&&l&&is(()=>{n instanceof Storage?rt(d,"storage",A,{passive:!0}):rt(d,fi,O),b&&A()}),b||A();function F(R,w){if(d){const H={key:$.value,oldValue:R,newValue:w,storageArea:n};d.dispatchEvent(n instanceof Storage?new StorageEvent("storage",H):new CustomEvent(fi,{detail:H}))}}function C(R){try{const w=n.getItem($.value);if(R==null)F(w,null),n.removeItem($.value);else{const H=p.write(R);w!==H&&(n.setItem($.value,H),F(w,H))}}catch(w){_(w)}}function V(R){const w=R?R.newValue:n.getItem($.value);if(w==null)return c&&P!=null&&n.setItem($.value,p.write(P)),P;if(!R&&u){const H=p.read(w);return typeof u=="function"?u(H,P):L==="object"&&!Array.isArray(H)?{...P,...H}:H}else return typeof w!="string"?w:p.read(w)}function A(R){if(!(R&&R.storageArea!==n)){if(R&&R.key==null){y.value=P;return}if(!(R&&R.key!==$.value)){g();try{(R==null?void 0:R.newValue)!==p.write(y.value)&&(y.value=V(R))}catch(w){_(w)}finally{R?Zn(M):M()}}}}function O(R){A(R.detail)}return y}const uu="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function fu(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ve,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:a=!0}=e,d={auto:"",light:"light",dark:"dark",...e.modes||{}},m=Jo({window:r}),_=ie(()=>m.value?"dark":"light"),b=c||(o==null?dr(s):pr(o,s,i,{window:r,listenToStorageChanges:l})),y=ie(()=>b.value==="auto"?_.value:b.value),$=Yo("updateHTMLAttrs",(g,M,F)=>{const C=typeof g=="string"?r==null?void 0:r.document.querySelector(g):hr(g);if(!C)return;const V=new Set,A=new Set;let O=null;if(M==="class"){const w=F.split(/\s/g);Object.values(d).flatMap(H=>(H||"").split(/\s/g)).filter(Boolean).forEach(H=>{w.includes(H)?V.add(H):A.add(H)})}else O={key:M,value:F};if(V.size===0&&A.size===0&&O===null)return;let R;a&&(R=r.document.createElement("style"),R.appendChild(document.createTextNode(uu)),r.document.head.appendChild(R));for(const w of V)C.classList.add(w);for(const w of A)C.classList.remove(w);O&&C.setAttribute(O.key,O.value),a&&(r.getComputedStyle(R).opacity,document.head.removeChild(R))});function P(g){var M;$(t,n,(M=d[g])!=null?M:g)}function L(g){e.onChanged?e.onChanged(g,P):P(g)}Ne(y,L,{flush:"post",immediate:!0}),is(()=>L(y.value));const p=ie({get(){return u?b.value:y.value},set(g){b.value=g}});return Object.assign(p,{store:b,system:_,state:y})}function du(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=fu({...e,onChanged:(o,l)=>{var c;e.onChanged?(c=e.onChanged)==null||c.call(e,o==="dark",l,o):l(o)},modes:{dark:t,light:n}}),r=ie(()=>s.system.value);return ie({get(){return s.value==="dark"},set(o){const l=o?"dark":"light";r.value===l?s.value="auto":s.value=l}})}function Ts(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const di=1;function hu(e,t={}){const{throttle:n=0,idle:s=200,onStop:r=ut,onScroll:i=ut,offset:o={left:0,right:0,top:0,bottom:0},eventListenerOptions:l={capture:!1,passive:!0},behavior:c="auto",window:u=Ve,onError:a=C=>{console.error(C)}}=t,d=xe(0),m=xe(0),_=ie({get(){return d.value},set(C){y(C,void 0)}}),b=ie({get(){return m.value},set(C){y(void 0,C)}});function y(C,V){var A,O,R,w;if(!u)return;const H=ce(e);if(!H)return;(R=H instanceof Document?u.document.body:H)==null||R.scrollTo({top:(A=ce(V))!=null?A:b.value,left:(O=ce(C))!=null?O:_.value,behavior:ce(c)});const Y=((w=H==null?void 0:H.document)==null?void 0:w.documentElement)||(H==null?void 0:H.documentElement)||H;_!=null&&(d.value=Y.scrollLeft),b!=null&&(m.value=Y.scrollTop)}const $=xe(!1),P=$t({left:!0,right:!1,top:!0,bottom:!1}),L=$t({left:!1,right:!1,top:!1,bottom:!1}),p=C=>{$.value&&($.value=!1,L.left=!1,L.right=!1,L.top=!1,L.bottom=!1,r(C))},g=za(p,n+s),M=C=>{var V;if(!u)return;const A=((V=C==null?void 0:C.document)==null?void 0:V.documentElement)||(C==null?void 0:C.documentElement)||hr(C),{display:O,flexDirection:R,direction:w}=getComputedStyle(A),H=w==="rtl"?-1:1,Y=A.scrollLeft;L.left=Yd.value;const oe=Math.abs(Y*H)<=(o.left||0),U=Math.abs(Y*H)+A.clientWidth>=A.scrollWidth-(o.right||0)-di;O==="flex"&&R==="row-reverse"?(P.left=U,P.right=oe):(P.left=oe,P.right=U),d.value=Y;let X=A.scrollTop;C===u.document&&!X&&(X=u.document.body.scrollTop),L.top=Xm.value;const k=Math.abs(X)<=(o.top||0),ee=Math.abs(X)+A.clientHeight>=A.scrollHeight-(o.bottom||0)-di;O==="flex"&&R==="column-reverse"?(P.top=ee,P.bottom=k):(P.top=k,P.bottom=ee),m.value=X},F=C=>{var V;if(!u)return;const A=(V=C.target.documentElement)!=null?V:C.target;M(A),$.value=!0,g(C),i(C)};return rt(e,"scroll",n?Qa(F,n,!0,!1):F,l),is(()=>{try{const C=ce(e);if(!C)return;M(C)}catch(C){a(C)}}),rt(e,"scrollend",p,l),{x:_,y:b,isScrolling:$,arrivedState:P,directions:L,measure(){const C=ce(e);u&&C&&M(C)}}}function pf(e,t,n={}){const{window:s=Ve}=n;return pr(e,t,s==null?void 0:s.localStorage,n)}function zo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const Es=new WeakMap;function gf(e,t=!1){const n=xe(t);let s=null,r="";Ne(dr(e),l=>{const c=Ts(ce(l));if(c){const u=c;if(Es.get(u)||Es.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(r=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=Ts(ce(e));!l||n.value||(ai&&(s=rt(l,"touchmove",c=>{pu(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=Ts(ce(e));!l||!n.value||(ai&&(s==null||s()),l.style.overflow=r,Es.delete(l),n.value=!1)};return Uo(o),ie({get(){return n.value},set(l){l?i():o()}})}function mf(e,t,n={}){const{window:s=Ve}=n;return pr(e,t,s==null?void 0:s.sessionStorage,n)}function yf(e={}){const{window:t=Ve,...n}=e;return hu(t,n)}function vf(e={}){const{window:t=Ve,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=xe(n),c=xe(s),u=()=>{if(t)if(o==="outer")l.value=t.outerWidth,c.value=t.outerHeight;else if(o==="visual"&&t.visualViewport){const{width:d,height:m,scale:_}=t.visualViewport;l.value=Math.round(d*_),c.value=Math.round(m*_)}else i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};u(),is(u);const a={passive:!0};if(rt("resize",u,a),t&&o==="visual"&&t.visualViewport&&rt(t.visualViewport,"resize",u,a),r){const d=Xo("(orientation: portrait)");Ne(d,()=>u())}return{width:l,height:c}}const xs={};var Cs={};const Qo=/^(?:[a-z]+:|\/\/)/i,gu="vitepress-theme-appearance",mu=/#.*$/,yu=/[?#].*$/,vu=/(?:(^|\/)index)?\.(?:md|html)$/,ve=typeof document<"u",Zo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function _u(e,t,n=!1){if(t===void 0)return!1;if(e=hi(`/${e}`),n)return new RegExp(t).test(e);if(hi(t)!==e)return!1;const s=t.match(mu);return s?(ve?location.hash:"")===s[0]:!0}function hi(e){return decodeURI(e).replace(yu,"").replace(vu,"$1")}function bu(e){return Qo.test(e)}function wu(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!bu(n)&&_u(t,`/${n}/`,!0))||"root"}function Su(e,t){var s,r,i,o,l,c,u;const n=wu(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:tl(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function el(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=Tu(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function Tu(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Eu(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function tl(e,t){return[...e.filter(n=>!Eu(t,n)),...t]}const xu=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Cu=/^[a-z]:/i;function pi(e){const t=Cu.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(xu,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const As=new Set;function Au(e){if(As.size===0){const n=typeof process=="object"&&(Cs==null?void 0:Cs.VITE_EXTRA_EXTENSIONS)||(xs==null?void 0:xs.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>As.add(s))}const t=e.split(".").pop();return t==null||!As.has(t.toLowerCase())}function _f(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Ru=Symbol(),Ct=xe(Ua);function bf(e){const t=ie(()=>Su(Ct.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?De(!0):n==="force-auto"?Jo():n?du({storageKey:gu,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):De(!1),r=De(ve?location.hash:"");return ve&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Ne(()=>e.data,()=>{r.value=ve?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>el(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function Mu(){const e=St(Ru);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ou(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function gi(e){return Qo.test(e)||!e.startsWith("/")?e:Ou(Ct.value.base,e)}function Pu(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ve){const n="/";t=pi(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${pi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Nn=[];function wf(e){Nn.push(e),ns(()=>{Nn=Nn.filter(t=>t!==e)})}function Lu(){let e=Ct.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=mi(e,n);else if(Array.isArray(e))for(const s of e){const r=mi(s,n);if(r){t=r;break}}return t}function mi(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const Iu=Symbol(),nl="http://a.com",Nu=()=>({path:"/",component:null,data:Zo});function Sf(e,t){const n=$t(Nu()),s={route:n,go:r};async function r(l=ve?location.href:"/"){var c,u;l=Rs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ve&&l!==Rs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(l)))}let i=null;async function o(l,c=0,u=!1){var m,_;if(await((m=s.onBeforePageLoad)==null?void 0:m.call(s,l))===!1)return;const a=new URL(l,nl),d=i=a.pathname;try{let b=await e(d);if(!b)throw new Error(`Page not found: ${d}`);if(i===d){i=null;const{default:y,__pageData:$}=b;if(!y)throw new Error(`Invalid route component: ${y}`);await((_=s.onAfterPageLoad)==null?void 0:_.call(s,l)),n.path=ve?d:gi(d),n.component=Pn(y),n.data=Pn($),ve&&Zn(()=>{let P=Ct.value.base+$.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!Ct.value.cleanUrls&&!P.endsWith("/")&&(P+=".html"),P!==a.pathname&&(a.pathname=P,l=P+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let L=null;try{L=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(L){yi(L,a.hash);return}}window.scrollTo(0,c)})}}catch(b){if(!/fetch|Page not found/.test(b.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(b),!u)try{const y=await fetch(Ct.value.base+"hashmap.json");window.__VP_HASH_MAP__=await y.json(),await o(l,c,!0);return}catch{}if(i===d){i=null,n.path=ve?d:gi(d),n.component=t?Pn(t):null;const y=ve?d.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Zo,relativePath:y}}}}return ve&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:a,origin:d,pathname:m,hash:_,search:b}=new URL(u,c.baseURI),y=new URL(location.href);d===y.origin&&Au(m)&&(l.preventDefault(),m===y.pathname&&b===y.search?(_!==y.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:y.href,newURL:a}))),_?yi(c,_,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var u;if(l.state===null)return;const c=Rs(location.href);await o(c,l.state&&l.state.scrollPosition||0),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(c))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Fu(){const e=St(Iu);if(!e)throw new Error("useRouter() is called without provider.");return e}function sl(){return Fu().route}function yi(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-Lu()+i;requestAnimationFrame(r)}}function Rs(e){const t=new URL(e,nl);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),Ct.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const An=()=>Nn.forEach(e=>e()),Tf=ir({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=sl(),{frontmatter:n,site:s}=Mu();return Ne(n,An,{deep:!0,flush:"post"}),()=>Bs(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Bs(t.component,{onVnodeMounted:An,onVnodeUpdated:An,onVnodeUnmounted:An}):"404 Page Not Found"])}}),Ef=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Hu="modulepreload",Du=function(e){return"/"+e},vi={},xf=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(c=>{if(c=Du(c),c in vi)return;vi[c]=!0;const u=c.endsWith(".css"),a=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":Hu,u||(d.as="script"),d.crossOrigin="",d.href=c,l&&d.setAttribute("nonce",l),document.head.appendChild(d),u)return new Promise((m,_)=>{d.addEventListener("load",m),d.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},Cf=ir({setup(e,{slots:t}){const n=De(!1);return kt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Af(){ve&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(u=>u.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Rf(){if(ve){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let u=c.textContent||"";o&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),$u(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function $u(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Mf(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=Ms(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const o=i.map(Ms);s.forEach((l,c)=>{const u=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));u!==-1?delete o[u]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};rr(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=el(o,i);u!==document.title&&(document.title=u);const a=l||o.description;let d=document.querySelector("meta[name=description]");d?d.getAttribute("content")!==a&&d.setAttribute("content",a):Ms(["meta",{name:"description",content:a}]),r(tl(o.head,Vu(c)))})}function Ms([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function ju(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Vu(e){return e.filter(t=>!ju(t))}const Os=new Set,rl=()=>document.createElement("link"),ku=e=>{const t=rl();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Wu=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Rn;const Uu=ve&&(Rn=rl())&&Rn.relList&&Rn.relList.supports&&Rn.relList.supports("prefetch")?ku:Wu;function Of(){if(!ve||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!Os.has(c)){Os.add(c);const u=Pu(c);u&&Uu(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):Os.add(l))})})};kt(s);const r=sl();Ne(()=>r.path,s),ns(()=>{n&&n.disconnect()})}export{io as $,Lu as A,Ju as B,Xu as C,wf as D,fe as E,Te as F,xe as G,Yu as H,Qo as I,sl as J,na as K,St as L,vf as M,Ys as N,hf as O,Zn as P,yf as Q,ve as R,sn as S,sf as T,Gu as U,xf as V,gf as W,rc as X,Qu as Y,lf as Z,Ef as _,No as a,of as a0,Zu as a1,Mf as a2,Iu as a3,bf as a4,Ru as a5,Tf as a6,Cf as a7,Ct as a8,Sf as a9,Pu as aa,af as ab,Of as ac,Rf as ad,Af as ae,Bs as af,tf as ag,Uo as ah,ce as ai,Ss as aj,hr as ak,uf as al,df as am,mf as an,pf as ao,ff as ap,Fu as aq,rt as ar,Bu as as,rf as at,ae as au,qu as av,Pn as aw,cf as ax,_f as ay,Ws as b,ef as c,ir as d,nf as e,Au as f,gi as g,ie as h,bu as i,Io as j,Qn as k,_u as l,Xo as m,Js as n,ks as o,De as p,Ne as q,zu as r,rr as s,_l as t,Mu as u,kt as v,sc as w,ns as x,Ku as y,Ec as z}; diff --git a/assets/chunks/theme.PItBixWd.js b/assets/chunks/theme.BAiG5Ik8.js similarity index 99% rename from assets/chunks/theme.PItBixWd.js rename to assets/chunks/theme.BAiG5Ik8.js index b0a4bd62..80e2f199 100644 --- a/assets/chunks/theme.PItBixWd.js +++ b/assets/chunks/theme.BAiG5Ik8.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.ppjlRfVe.js","assets/chunks/framework.DXGyWiRo.js"])))=>i.map(i=>d[i]); -import{d as p,c as u,r as c,n as N,o as s,a as j,t as M,b as _,w as h,T as ue,e as m,_ as g,u as Ce,i as He,f as Be,g as de,h as y,j as d,k as i,l as z,m as se,p as S,q as F,s as X,v as U,x as ve,y as fe,z as Ee,A as Fe,F as x,B as A,C as W,D as Y,E as k,G as $e,H as B,I as ye,J as Q,K as G,L as Z,M as De,N as Pe,O as ie,P as Le,Q as Ve,R as ee,S as Oe,U as Ge,V as Ue,W as Se,X as Te,Y as je,Z as ze,$ as We,a0 as Ke,a1 as qe}from"./framework.DXGyWiRo.js";const Re=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(s(),u("span",{class:N(["VPBadge",e.type])},[c(t.$slots,"default",{},()=>[j(M(e.text),1)])],2))}}),Je={key:0,class:"VPBackdrop"},Xe=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(ue,{name:"fade"},{default:h(()=>[e.show?(s(),u("div",Je)):m("",!0)]),_:1}))}}),Ye=g(Xe,[["__scopeId","data-v-e7a48126"]]),L=Ce;function Qe(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function re(e){return e.startsWith("/")?e:`/${e}`}function he(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(He(e)||e.startsWith("#")||!o.startsWith("http")||!Be(t))return e;const{site:r}=L(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return de(l)}function q({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:r}=L(),l=y(()=>{var f,$;return{label:(f=t.value.locales[n.value])==null?void 0:f.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:y(()=>Object.entries(t.value.locales).flatMap(([f,$])=>l.value.label===$.label?[]:{text:$.label,link:Ze($.link||(f==="root"?"/":`/${f}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+r.value})),currentLang:l}}function Ze(e,t,n,a){return t?e.replace(/\/$/,"")+re(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},at={class:"quote"},ot={class:"action"},st=["href","aria-label"],it=p({__name:"NotFound",setup(e){const{theme:t}=L(),{currentLang:n}=q();return(a,o)=>{var r,l,v,f,$;return s(),u("div",et,[d("p",tt,M(((r=i(t).notFound)==null?void 0:r.code)??"404"),1),d("h1",nt,M(((l=i(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",at,M(((v=i(t).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",ot,[d("a",{class:"link",href:i(de)(i(n).link),"aria-label":((f=i(t).notFound)==null?void 0:f.linkLabel)??"go to home"},M((($=i(t).notFound)==null?void 0:$.linkText)??"Take me home"),9,st)])])}}}),rt=g(it,[["__scopeId","data-v-98bc8507"]]);function Ne(e,t){if(Array.isArray(e))return R(e);if(e==null)return[];t=re(t);const n=Object.keys(e).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>t.startsWith(re(o))),a=n?e[n]:[];return Array.isArray(a)?R(a):R(a.items,a.base)}function lt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function ct(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function le(e,t){return Array.isArray(t)?t.some(n=>le(e,n)):z(e,t.link)?!0:t.items?le(e,t.items):!1}function R(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=R(a.items,o)),a})}function D(){const{frontmatter:e,page:t,theme:n}=L(),a=se("(min-width: 960px)"),o=S(!1),r=y(()=>{const w=n.value.sidebar,C=t.value.relativePath;return w?Ne(w,C):[]}),l=S(r.value);F(r,(w,C)=>{JSON.stringify(w)!==JSON.stringify(C)&&(l.value=r.value)});const v=y(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),f=y(()=>$?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),$=y(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),V=y(()=>v.value&&a.value),b=y(()=>v.value?lt(l.value):[]);function P(){o.value=!0}function T(){o.value=!1}function I(){o.value?T():P()}return{isOpen:o,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:$,leftAside:f,isSidebarEnabled:V,open:P,close:T,toggle:I}}function ut(e,t){let n;X(()=>{n=e.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",a)}),ve(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function dt(e){const{page:t,hash:n}=L(),a=S(!1),o=y(()=>e.value.collapsed!=null),r=y(()=>!!e.value.link),l=S(!1),v=()=>{l.value=z(t.value.relativePath,e.value.link)};F([t,e,n],v),U(v);const f=y(()=>l.value?!0:e.value.items?le(t.value.relativePath,e.value.items):!1),$=y(()=>!!(e.value.items&&e.value.items.length));X(()=>{a.value=!!(o.value&&e.value.collapsed)}),fe(()=>{(l.value||f.value)&&(a.value=!1)});function V(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:r,isActiveLink:l,hasActiveLink:f,hasChildren:$,toggle:V}}function vt(){const{hasSidebar:e}=D(),t=se("(min-width: 960px)"),n=se("(min-width: 1280px)");return{isAsideEnabled:y(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ft=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function Me(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function me(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:ht(n),link:"#"+n.id,level:a}});return mt(t,e)}function ht(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(ft.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return _t(e,a,o)}function pt(e,t){const{isAsideEnabled:n}=vt(),a=Qe(r,100);let o=null;U(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),Ee(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const v=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,V=Math.abs(v+f-$)<1,b=ce.map(({element:T,link:I})=>({link:I,top:kt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,I)=>T.top-I.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:T,top:I}of b){if(I>v+Fe()+4)break;P=T}l(P)}function l(v){o&&o.classList.remove("active"),v==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const f=o;f?(f.classList.add("active"),t.value.style.top=f.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function kt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function _t(e,t,n){ce.length=0;const a=[],o=[];return e.forEach(r=>{const l={...r,children:[]};let v=o[o.length-1];for(;v&&v.level>=l.level;)o.pop(),v=o[o.length-1];if(l.element.classList.contains("ignore-header")||v&&"shouldIgnore"in v){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=W("VPDocOutlineItem",!0);return s(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(x,null,A(e.headers,({children:r,link:l,title:v})=>(s(),u("li",null,[d("a",{class:"outline-link",href:l,onClick:t,title:v},M(v),9,bt),r!=null&&r.length?(s(),_(o,{key:0,headers:r},null,8,["headers"])):m("",!0)]))),256))],2)}}}),xe=g(gt,[["__scopeId","data-v-ba57d2ed"]]),$t={class:"content"},yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Pt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=L(),a=$e([]);Y(()=>{a.value=me(t.value.outline??n.value.outline)});const o=S(),r=S();return pt(o,r),(l,v)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[d("div",$t,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",yt,M(i(Me)(i(n))),1),k(xe,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Lt=g(Pt,[["__scopeId","data-v-116d4a1f"]]),Vt={class:"VPDocAsideCarbonAds"},St=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Vt,[k(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Tt={class:"VPDocAside"},Nt=p({__name:"VPDocAside",setup(e){const{theme:t}=L();return(n,a)=>(s(),u("div",Tt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(Lt),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=d("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(s(),_(St,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Mt=g(Nt,[["__scopeId","data-v-8cfe0409"]]);function xt(){const{theme:e,page:t}=L();return y(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function It(){const{page:e,theme:t,frontmatter:n}=L();return y(()=>{var $,V,b,P,T,I,w,C;const a=Ne(t.value.sidebar,e.value.relativePath),o=ct(a),r=wt(o,H=>H.link.replace(/[?#].*$/,"")),l=r.findIndex(H=>z(e.value.relativePath,H.link)),v=(($=t.value.docFooter)==null?void 0:$.prev)===!1&&!n.value.prev||n.value.prev===!1,f=((V=t.value.docFooter)==null?void 0:V.next)===!1&&!n.value.next||n.value.next===!1;return{prev:v?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((b=r[l-1])==null?void 0:b.docFooterText)??((P=r[l-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((T=r[l-1])==null?void 0:T.link)},next:f?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((I=r[l+1])==null?void 0:I.docFooterText)??((w=r[l+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((C=r[l+1])==null?void 0:C.link)}}})}function wt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.tag??(t.href?"a":"span")),a=y(()=>t.href&&ye.test(t.href)||t.target==="_blank");return(o,r)=>(s(),_(B(n.value),{class:N(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(he)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:h(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Ct=["datetime"],Ht=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=L(),o=y(()=>new Date(n.value.lastUpdated)),r=y(()=>o.value.toISOString()),l=S("");return U(()=>{X(()=>{var v,f,$;l.value=new Intl.DateTimeFormat((f=(v=t.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&f.forceLocale?a.value:void 0,(($=t.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(v,f)=>{var $;return s(),u("p",At,[j(M((($=i(t).lastUpdated)==null?void 0:$.text)||i(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},M(l.value),9,Ct)])}}}),Bt=g(Ht,[["__scopeId","data-v-1cbf3ee4"]]),Et={key:0,class:"VPDocFooter"},Ft={key:0,class:"edit-info"},Dt={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Wt={class:"pager"},Kt=["innerHTML"],qt=["innerHTML"],Rt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=L(),o=xt(),r=It(),l=y(()=>t.value.editLink&&a.value.editLink!==!1),v=y(()=>n.value.lastUpdated),f=y(()=>l.value||v.value||r.value.prev||r.value.next);return($,V)=>{var b,P,T,I;return f.value?(s(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(s(),u("div",Ft,[l.value?(s(),u("div",Dt,[k(E,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:h(()=>[V[0]||(V[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),j(" "+M(i(o).text),1)]),_:1},8,["href"])])):m("",!0),v.value?(s(),u("div",Ot,[k(Bt)])):m("",!0)])):m("",!0),(b=i(r).prev)!=null&&b.link||(P=i(r).next)!=null&&P.link?(s(),u("nav",Gt,[V[1]||(V[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",Ut,[(T=i(r).prev)!=null&&T.link?(s(),_(E,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.prev)||"Previous page"},null,8,jt),d("span",{class:"title",innerHTML:i(r).prev.text},null,8,zt)]}),_:1},8,["href"])):m("",!0)]),d("div",Wt,[(I=i(r).next)!=null&&I.link?(s(),_(E,{key:0,class:"pager-link next",href:i(r).next.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.next)||"Next page"},null,8,Kt),d("span",{class:"title",innerHTML:i(r).next.text},null,8,qt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Jt=g(Rt,[["__scopeId","data-v-64297f89"]]),Xt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Zt={class:"content"},en={class:"content-container"},tn={class:"main"},nn=p({__name:"VPDoc",setup(e){const{theme:t}=L(),n=Q(),{hasSidebar:a,hasAside:o,leftAside:r}=D(),l=y(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,f)=>{const $=W("Content");return s(),u("div",{class:N(["VPDoc",{"has-sidebar":i(a),"has-aside":i(o)}])},[c(v.$slots,"doc-top",{},void 0,!0),d("div",Xt,[i(o)?(s(),u("div",{key:0,class:N(["aside",{"left-aside":i(r)}])},[f[0]||(f[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Yt,[d("div",Qt,[k(Mt,null,{"aside-top":h(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),d("div",Zt,[d("div",en,[c(v.$slots,"doc-before",{},void 0,!0),d("main",tn,[k($,{class:N(["vp-doc",[l.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jt,null,{"doc-footer-before":h(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),an=g(nn,[["__scopeId","data-v-888acc39"]]),on=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.href&&ye.test(t.href)),a=y(()=>t.tag||(t.href?"a":"button"));return(o,r)=>(s(),_(B(a.value),{class:N(["VPButton",[e.size,e.theme]]),href:e.href?i(he)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:h(()=>[j(M(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=g(on,[["__scopeId","data-v-6cd5edd1"]]),rn=["src","alt"],ln=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(s(),u(x,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,rn)):(s(),u(x,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),J=g(ln,[["__scopeId","data-v-21b99582"]]),cn={class:"container"},un={class:"main"},dn={class:"heading"},vn=["innerHTML"],fn=["innerHTML"],hn=["innerHTML"],mn={key:0,class:"actions"},pn={key:0,class:"image"},kn={class:"image-container"},_n=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=Z("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:N(["VPHero",{"has-image":e.image||i(t)}])},[d("div",cn,[d("div",un,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[d("h1",dn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,vn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,fn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,hn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",mn,[(s(!0),u(x,null,A(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(s(),u("div",pn,[d("div",kn,[a[0]||(a[0]=d("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(J,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),bn=g(_n,[["__scopeId","data-v-86f5077c"]]),gn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).hero?(s(),_(bn,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":h(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),$n={class:"box"},yn={key:0,class:"icon"},Pn=["innerHTML"],Ln=["innerHTML"],Vn=["innerHTML"],Sn={key:4,class:"link-text"},Tn={class:"link-text-value"},Nn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[d("article",$n,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",yn,[k(J,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(J,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Pn)):m("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Ln),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Vn)):m("",!0),e.linkText?(s(),u("div",Sn,[d("p",Tn,[j(M(e.linkText)+" ",1),n[0]||(n[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Mn=g(Nn,[["__scopeId","data-v-43c03651"]]),xn={key:0,class:"VPFeatures"},In={class:"container"},wn={class:"items"},An=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=y(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",xn,[d("div",In,[d("div",wn,[(s(!0),u(x,null,A(e.features,r=>(s(),u("div",{key:r.title,class:N(["item",[n.value]])},[k(Mn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),Cn=g(An,[["__scopeId","data-v-f8bfa93d"]]),Hn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).features?(s(),_(Cn,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):m("",!0)}}),Bn=p({__name:"VPHomeContent",setup(e){const{width:t}=De({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Pe(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),En=g(Bn,[["__scopeId","data-v-0611f689"]]),Fn=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=L();return(a,o)=>{const r=W("Content");return s(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(gn,null,{"home-hero-info-before":h(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(Hn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(s(),_(En,{key:0},{default:h(()=>[k(r)]),_:1})):(s(),_(r,{key:1}))],2)}}}),Dn=g(Fn,[["__scopeId","data-v-d7a0f279"]]),On={},Gn={class:"VPPage"};function Un(e,t){const n=W("Content");return s(),u("div",Gn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const jn=g(On,[["render",Un]]),zn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>(s(),u("div",{class:N(["VPContent",{"has-sidebar":i(a),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(rt)],!0):i(n).layout==="page"?(s(),_(jn,{key:1},{"page-top":h(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(s(),_(Dn,{key:2},{"home-hero-before":h(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(s(),_(B(i(n).layout),{key:3})):(s(),_(an,{key:4},{"doc-top":h(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Wn=g(zn,[["__scopeId","data-v-6c992f05"]]),Kn={class:"container"},qn=["innerHTML"],Rn=["innerHTML"],Jn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>i(t).footer&&i(n).footer!==!1?(s(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":i(a)}])},[d("div",Kn,[i(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,qn)):m("",!0),i(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,Rn)):m("",!0)])],2)):m("",!0)}}),Xn=g(Jn,[["__scopeId","data-v-137d0c52"]]);function Yn(){const{theme:e,frontmatter:t}=L(),n=$e([]),a=y(()=>n.value.length>0);return Y(()=>{n.value=me(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const Qn={class:"menu-text"},Zn={class:"header"},ea={class:"outline"},ta=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=L(),a=S(!1),o=S(0),r=S(),l=S();function v(b){var P;(P=r.value)!=null&&P.contains(b.target)||(a.value=!1)}F(a,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{a.value=!1}),Y(()=>{a.value=!1});function f(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Le(()=>{a.value=!1}))}function V(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(s(),u("button",{key:0,onClick:f,class:N({open:a.value})},[d("span",Qn,M(i(Me)(i(n))),1),P[0]||(P[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)),k(ue,{name:"flyout"},{default:h(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[d("div",Zn,[d("a",{class:"top-link",href:"#",onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)]),d("div",ea,[k(xe,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),na=g(ta,[["__scopeId","data-v-d1ffc3c0"]]),aa={class:"container"},oa=["aria-expanded"],sa={class:"menu-text"},ia=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D(),{headers:o}=Yn(),{y:r}=Ve(),l=S(0);U(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{o.value=me(n.value.outline??t.value.outline)});const v=y(()=>o.value.length===0),f=y(()=>v.value&&!a.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:v.value,fixed:f.value}));return(V,b)=>i(n).layout!=="home"&&(!f.value||i(r)>=l.value)?(s(),u("div",{key:0,class:N($.value)},[d("div",aa,[i(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",sa,M(i(t).sidebarMenuLabel||"Menu"),1)],8,oa)):m("",!0),k(na,{headers:i(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ra=g(ia,[["__scopeId","data-v-b2c93339"]]);function la(){const e=S(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=Q();return F(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const ca={},ua={class:"VPSwitch",type:"button",role:"switch"},da={class:"check"},va={key:0,class:"icon"};function fa(e,t){return s(),u("button",ua,[d("span",da,[e.$slots.default?(s(),u("span",va,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ha=g(ca,[["render",fa],["__scopeId","data-v-65cb479b"]]),ma=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=L(),a=Z("toggle-appearance",()=>{t.value=!t.value}),o=S("");return fe(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),_(ha,{title:o.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:h(()=>[...l[0]||(l[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),pe=g(ma,[["__scopeId","data-v-95390f3d"]]),pa={key:0,class:"VPNavBarAppearance"},ka=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=L();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",pa,[k(pe)])):m("",!0)}}),_a=g(ka,[["__scopeId","data-v-c2b7fe22"]]),ke=S();let Ie=!1,oe=0;function ba(e){const t=S(!1);if(ee){!Ie&&ga(),oe++;const n=F(ke,a=>{var o,r,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});ve(()=>{n(),oe--,oe||$a()})}return Oe(t)}function ga(){document.addEventListener("focusin",we),Ie=!0,ke.value=document.activeElement}function $a(){document.removeEventListener("focusin",we)}function we(){ke.value=document.activeElement}const ya={class:"VPMenuLink"},Pa=["innerHTML"],La=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),u("div",ya,[k(E,{class:N({active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),te=g(La,[["__scopeId","data-v-859c4b5e"]]),Va={class:"VPMenuGroup"},Sa={key:0,class:"title"},Ta=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Va,[e.text?(s(),u("p",Sa,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),u(x,null,["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),Na=g(Ta,[["__scopeId","data-v-fddbce6f"]]),Ma={class:"VPMenu"},xa={key:0,class:"items"},Ia=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Ma,[e.items?(s(),u("div",xa,[(s(!0),u(x,null,A(e.items,a=>(s(),u(x,{key:JSON.stringify(a)},["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(B(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(Na,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),wa=g(Ia,[["__scopeId","data-v-b1338896"]]),Aa=["aria-expanded","aria-label"],Ca={key:0,class:"text"},Ha=["innerHTML"],Ba={key:1,class:"vpi-more-horizontal icon"},Ea={class:"menu"},Fa=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=S(!1),n=S();ba({el:n,onBlur:a});function a(){t.value=!1}return(o,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=l=>t.value=!0),onMouseleave:r[2]||(r[2]=l=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Ca,[e.icon?(s(),u("span",{key:0,class:N([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ha)):m("",!0),r[3]||(r[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Ba))],8,Aa),d("div",Ea,[k(wa,{items:e.items},{default:h(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=g(Fa,[["__scopeId","data-v-c9799874"]]),Da=["href","aria-label","innerHTML"],Oa=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=S();U(async()=>{var r;await Le();const o=(r=n.value)==null?void 0:r.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=y(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,r)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Da))}}),Ga=g(Oa,[["__scopeId","data-v-9d5b176c"]]),Ua={class:"VPSocialLinks"},ja=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",Ua,[(s(!0),u(x,null,A(e.links,({link:a,icon:o,ariaLabel:r})=>(s(),_(Ga,{key:a,icon:o,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(ja,[["__scopeId","data-v-ce44a42a"]]),za={key:0,class:"group translations"},Wa={class:"trans-title"},Ka={key:1,class:"group"},qa={class:"item appearance"},Ra={class:"label"},Ja={class:"appearance-action"},Xa={key:2,class:"group"},Ya={class:"item social-links"},Qa=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=L(),{localeLinks:a,currentLang:o}=q({correspondingLink:!0}),r=y(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,v)=>r.value?(s(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[i(a).length&&i(o).label?(s(),u("div",za,[d("p",Wa,M(i(o).label),1),(s(!0),u(x,null,A(i(a),f=>(s(),_(te,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Ka,[d("div",qa,[d("p",Ra,M(i(n).darkModeSwitchLabel||"Appearance"),1),d("div",Ja,[k(pe)])])])):m("",!0),i(n).socialLinks?(s(),u("div",Xa,[d("div",Ya,[k(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),Za=g(Qa,[["__scopeId","data-v-563e76b4"]]),eo=["aria-expanded"],to=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)])],10,eo))}}),no=g(to,[["__scopeId","data-v-96eb4489"]]),ao=["innerHTML"],oo=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),_(E,{class:N({VPNavBarMenuLink:!0,active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),so=g(oo,[["__scopeId","data-v-e59bbbee"]]),io=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=L(),a=r=>"component"in r?!1:"link"in r?z(n.value.relativePath,r.link,!!t.item.activeMatch):r.items.some(a),o=y(()=>a(t.item));return(r,l)=>(s(),_(_e,{class:N({VPNavBarMenuGroup:!0,active:i(z)(i(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ro={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},lo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",ro,[a[0]||(a[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(so,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(io,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),co=g(lo,[["__scopeId","data-v-a23194af"]]);function uo(e){const{localeIndex:t,theme:n}=L();function a(o){var I,w,C;const r=o.split("."),l=(I=n.value.search)==null?void 0:I.options,v=l&&typeof l=="object",f=v&&((C=(w=l.locales)==null?void 0:w[t.value])==null?void 0:C.translations)||null,$=v&&l.translations||null;let V=f,b=$,P=e;const T=r.pop();for(const H of r){let O=null;const K=P==null?void 0:P[H];K&&(O=P=K);const ne=b==null?void 0:b[H];ne&&(O=b=ne);const ae=V==null?void 0:V[H];ae&&(O=V=ae),K||(P=O),ne||(b=O),ae||(V=O)}return(V==null?void 0:V[T])??(b==null?void 0:b[T])??(P==null?void 0:P[T])??""}return a}const vo=["aria-label"],fo={class:"DocSearch-Button-Container"},ho={class:"DocSearch-Button-Placeholder"},ge=p({__name:"VPNavBarSearchButton",setup(e){const n=uo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(n)("button.buttonAriaLabel")},[d("span",fo,[o[0]||(o[0]=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),d("span",ho,M(i(n)("button.buttonText")),1)]),o[1]||(o[1]=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vo))}}),mo={class:"VPNavBarSearch"},po={id:"local-search"},ko={key:1,id:"docsearch"},_o=p({__name:"VPNavBarSearch",setup(e){const t=Ge(()=>Ue(()=>import("./VPLocalSearchBox.ppjlRfVe.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a}=L(),o=S(!1),r=S(!1);U(()=>{});function l(){o.value||(o.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function f(b){const P=b.target,T=P.tagName;return P.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const $=S(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),ie("/",b=>{f(b)||(b.preventDefault(),$.value=!0)});const V="local";return(b,P)=>{var T;return s(),u("div",mo,[i(V)==="local"?(s(),u(x,{key:0},[$.value?(s(),_(i(t),{key:0,onClose:P[0]||(P[0]=I=>$.value=!1)})):m("",!0),d("div",po,[k(ge,{onClick:P[1]||(P[1]=I=>$.value=!0)})])],64)):i(V)==="algolia"?(s(),u(x,{key:1},[o.value?(s(),_(i(n),{key:0,algolia:((T=i(a).search)==null?void 0:T.options)??i(a).algolia,onVnodeBeforeMount:P[2]||(P[2]=I=>r.value=!0)},null,8,["algolia"])):m("",!0),r.value?m("",!0):(s(),u("div",ko,[k(ge,{onClick:l})]))],64)):m("",!0)])}}}),bo=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),go=g(bo,[["__scopeId","data-v-5bf14e4d"]]),$o=["href","rel","target"],yo=["innerHTML"],Po={key:2},Lo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=L(),{hasSidebar:a}=D(),{currentLang:o}=q(),r=y(()=>{var f;return typeof n.value.logoLink=="string"?n.value.logoLink:(f=n.value.logoLink)==null?void 0:f.link}),l=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.rel}),v=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.target});return(f,$)=>(s(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":i(a)}])},[d("a",{class:"title",href:r.value??i(he)(i(o).link),rel:l.value,target:v.value},[c(f.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(s(),_(J,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(s(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,yo)):i(n).siteTitle===void 0?(s(),u("span",Po,M(i(t).title),1)):m("",!0),c(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,$o)],2))}}),Vo=g(Lo,[["__scopeId","data-v-66d4ae12"]]),So={class:"items"},To={class:"title"},No=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=L(),{localeLinks:n,currentLang:a}=q({correspondingLink:!0});return(o,r)=>i(n).length&&i(a).label?(s(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:h(()=>[d("div",So,[d("p",To,M(i(a).label),1),(s(!0),u(x,null,A(i(n),l=>(s(),_(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),Mo=g(No,[["__scopeId","data-v-2d4849be"]]),xo={class:"wrapper"},Io={class:"container"},wo={class:"title"},Ao={class:"content"},Co={class:"content-body"},Ho=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Ve(),{hasSidebar:a}=D(),{frontmatter:o}=L(),r=S({});return fe(()=>{r.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,v)=>(s(),u("div",{class:N(["VPNavBar",r.value])},[d("div",xo,[d("div",Io,[d("div",wo,[k(Vo,null,{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ao,[d("div",Co,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(_o,{class:"search"}),k(co,{class:"menu"}),k(Mo,{class:"translations"}),k(_a,{class:"appearance"}),k(go,{class:"social-links"}),k(Za,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(no,{class:"hamburger",active:e.isScreenOpen,onClick:v[0]||(v[0]=f=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),Bo=g(Ho,[["__scopeId","data-v-8d1ffe88"]]),Eo={key:0,class:"VPNavScreenAppearance"},Fo={class:"text"},Do=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=L();return(a,o)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Eo,[d("p",Fo,M(i(n).darkModeSwitchLabel||"Appearance"),1),k(pe)])):m("",!0)}}),Oo=g(Do,[["__scopeId","data-v-a5de2fe4"]]),Go=["innerHTML"],Uo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Go)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),jo=g(Uo,[["__scopeId","data-v-f6216396"]]),zo=["innerHTML"],Wo=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,zo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ae=g(Wo,[["__scopeId","data-v-989ed20f"]]),Ko={class:"VPNavScreenMenuGroupSection"},qo={key:0,class:"title"},Ro=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",qo,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),_(Ae,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Jo=g(Ro,[["__scopeId","data-v-652dbd88"]]),Xo=["aria-controls","aria-expanded"],Yo=["innerHTML"],Qo=["id"],Zo={key:0,class:"item"},es={key:1,class:"item"},ts={key:2,class:"group"},ns=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=S(!1),a=y(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,l)=>(s(),u("div",{class:N(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[d("span",{class:"button-text",innerHTML:e.text},null,8,Yo),l[0]||(l[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,Xo),d("div",{id:a.value,class:"items"},[(s(!0),u(x,null,A(e.items,v=>(s(),u(x,{key:JSON.stringify(v)},["link"in v?(s(),u("div",Zo,[k(Ae,{item:v},null,8,["item"])])):"component"in v?(s(),u("div",es,[(s(),_(B(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(s(),u("div",ts,[k(Jo,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Qo)],2))}}),as=g(ns,[["__scopeId","data-v-a6f357af"]]),os={key:0,class:"VPNavScreenMenu"},ss=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",os,[(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(jo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(as,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),is=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),rs={class:"list"},ls=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=q({correspondingLink:!0}),a=S(!1);function o(){a.value=!a.value}return(r,l)=>i(t).length&&i(n).label?(s(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:a.value}])},[d("button",{class:"title",onClick:o},[l[0]||(l[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),j(" "+M(i(n).label)+" ",1),l[1]||(l[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",rs,[(s(!0),u(x,null,A(i(t),v=>(s(),u("li",{key:v.link,class:"item"},[k(E,{class:"link",href:v.link},{default:h(()=>[j(M(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),cs=g(ls,[["__scopeId","data-v-16655210"]]),us={class:"container"},ds=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=S(null),n=Se(ee?document.body:null);return(a,o)=>(s(),_(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>n.value=!0),onAfterLeave:o[1]||(o[1]=r=>n.value=!1)},{default:h(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",us,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(ss,{class:"menu"}),k(cs,{class:"translations"}),k(Oo,{class:"appearance"}),k(is,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),vs=g(ds,[["__scopeId","data-v-c2555c5e"]]),fs={key:0,class:"VPNav"},hs=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=la(),{frontmatter:o}=L(),r=y(()=>o.value.navbar!==!1);return Te("close-screen",n),X(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,v)=>r.value?(s(),u("header",fs,[k(Bo,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(vs,{open:i(t)},{"nav-screen-content-before":h(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ms=g(hs,[["__scopeId","data-v-908bdb68"]]),ps=["role","tabindex"],ks={key:1,class:"items"},_s=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:r,hasActiveLink:l,hasChildren:v,toggle:f}=dt(y(()=>t.item)),$=y(()=>v.value?"section":"div"),V=y(()=>o.value?"a":"div"),b=y(()=>v.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=y(()=>o.value?void 0:"button"),T=y(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":l.value}]);function I(C){"key"in C&&C.key!=="Enter"||!t.item.link&&f()}function w(){t.item.link&&f()}return(C,H)=>{const O=W("VPSidebarItem",!0);return s(),_(B($.value),{class:N(["VPSidebarItem",T.value])},{default:h(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:P.value},je(e.item.items?{click:I,keydown:I}:{},!0),{tabindex:e.item.items&&0}),[H[1]||(H[1]=d("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:V.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:h(()=>[(s(),_(B(b.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(B(b.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:w,onKeydown:ze(w,["enter"]),tabindex:"0"},[...H[0]||(H[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,ps)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",ks,[e.depth<5?(s(!0),u(x,{key:0},A(e.item.items,K=>(s(),_(O,{key:K.text,item:K,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),bs=g(_s,[["__scopeId","data-v-31549b30"]]),gs=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=S(!0);let n=null;return U(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),We(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(x,null,A(e.items,r=>(s(),u("div",{key:r.text,class:N(["group",{"no-transition":t.value}])},[k(bs,{item:r,depth:0},null,8,["item"])],2))),128))}}),$s=g(gs,[["__scopeId","data-v-5df780f0"]]),ys={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ps=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=D(),a=e,o=S(null),r=Se(ee?document.body:null);F([a,o],()=>{var v;a.open?(r.value=!0,(v=o.value)==null||v.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=S(0);return F(t,()=>{l.value+=1},{deep:!0}),(v,f)=>i(n)?(s(),u("aside",{key:0,class:N(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:f[0]||(f[0]=Ke(()=>{},["stop"]))},[f[2]||(f[2]=d("div",{class:"curtain"},null,-1)),d("nav",ys,[f[1]||(f[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_($s,{items:i(t),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ls=g(Ps,[["__scopeId","data-v-59945d5d"]]),Vs=p({__name:"VPSkipLink",setup(e){const{theme:t}=L(),n=Q(),a=S();F(()=>n.path,()=>a.value.focus());function o({target:r}){const l=document.getElementById(decodeURIComponent(r.hash).slice(1));if(l){const v=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",v)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",v),l.focus(),window.scrollTo(0,0)}}return(r,l)=>(s(),u(x,null,[d("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},M(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ss=g(Vs,[["__scopeId","data-v-d63408fd"]]),Ts=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=D(),o=Q();F(()=>o.path,a),ut(t,a);const{frontmatter:r}=L(),l=qe(),v=y(()=>!!l["home-hero-image"]);return Te("hero-image-slot-exists",v),(f,$)=>{const V=W("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:N(["Layout",i(r).pageClass])},[c(f.$slots,"layout-top",{},void 0,!0),k(Ss),k(Ye,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),k(ms,null,{"nav-bar-title-before":h(()=>[c(f.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(f.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(f.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(f.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[c(f.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(f.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ra,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),k(Ls,{open:i(t)},{"sidebar-nav-before":h(()=>[c(f.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[c(f.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Wn,null,{"page-top":h(()=>[c(f.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(f.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[c(f.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[c(f.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(f.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(f.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(f.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(f.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(f.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(f.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(f.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(f.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(f.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(f.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[c(f.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(f.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Xn),c(f.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(V,{key:1}))}}}),Ns=g(Ts,[["__scopeId","data-v-ba7c87da"]]),xs={Layout:Ns,enhanceApp:({app:e})=>{e.component("Badge",Re)}};export{uo as c,xs as t,L as u}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.Bvi8a7xK.js","assets/chunks/framework.CAXxHpAX.js"])))=>i.map(i=>d[i]); +import{d as p,c as u,r as c,n as N,o as s,a as j,t as M,b as _,w as h,T as ue,e as m,_ as g,u as Ce,i as He,f as Be,g as de,h as y,j as d,k as i,l as z,m as se,p as S,q as F,s as X,v as U,x as ve,y as fe,z as Ee,A as Fe,F as x,B as A,C as W,D as Y,E as k,G as $e,H as B,I as ye,J as Q,K as G,L as Z,M as De,N as Pe,O as ie,P as Le,Q as Ve,R as ee,S as Oe,U as Ge,V as Ue,W as Se,X as Te,Y as je,Z as ze,$ as We,a0 as Ke,a1 as qe}from"./framework.CAXxHpAX.js";const Re=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(s(),u("span",{class:N(["VPBadge",e.type])},[c(t.$slots,"default",{},()=>[j(M(e.text),1)])],2))}}),Je={key:0,class:"VPBackdrop"},Xe=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(ue,{name:"fade"},{default:h(()=>[e.show?(s(),u("div",Je)):m("",!0)]),_:1}))}}),Ye=g(Xe,[["__scopeId","data-v-e7a48126"]]),L=Ce;function Qe(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function re(e){return e.startsWith("/")?e:`/${e}`}function he(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(He(e)||e.startsWith("#")||!o.startsWith("http")||!Be(t))return e;const{site:r}=L(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return de(l)}function q({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:r}=L(),l=y(()=>{var f,$;return{label:(f=t.value.locales[n.value])==null?void 0:f.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:y(()=>Object.entries(t.value.locales).flatMap(([f,$])=>l.value.label===$.label?[]:{text:$.label,link:Ze($.link||(f==="root"?"/":`/${f}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+r.value})),currentLang:l}}function Ze(e,t,n,a){return t?e.replace(/\/$/,"")+re(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},at={class:"quote"},ot={class:"action"},st=["href","aria-label"],it=p({__name:"NotFound",setup(e){const{theme:t}=L(),{currentLang:n}=q();return(a,o)=>{var r,l,v,f,$;return s(),u("div",et,[d("p",tt,M(((r=i(t).notFound)==null?void 0:r.code)??"404"),1),d("h1",nt,M(((l=i(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",at,M(((v=i(t).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",ot,[d("a",{class:"link",href:i(de)(i(n).link),"aria-label":((f=i(t).notFound)==null?void 0:f.linkLabel)??"go to home"},M((($=i(t).notFound)==null?void 0:$.linkText)??"Take me home"),9,st)])])}}}),rt=g(it,[["__scopeId","data-v-98bc8507"]]);function Ne(e,t){if(Array.isArray(e))return R(e);if(e==null)return[];t=re(t);const n=Object.keys(e).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>t.startsWith(re(o))),a=n?e[n]:[];return Array.isArray(a)?R(a):R(a.items,a.base)}function lt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function ct(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function le(e,t){return Array.isArray(t)?t.some(n=>le(e,n)):z(e,t.link)?!0:t.items?le(e,t.items):!1}function R(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=R(a.items,o)),a})}function D(){const{frontmatter:e,page:t,theme:n}=L(),a=se("(min-width: 960px)"),o=S(!1),r=y(()=>{const w=n.value.sidebar,C=t.value.relativePath;return w?Ne(w,C):[]}),l=S(r.value);F(r,(w,C)=>{JSON.stringify(w)!==JSON.stringify(C)&&(l.value=r.value)});const v=y(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),f=y(()=>$?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),$=y(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),V=y(()=>v.value&&a.value),b=y(()=>v.value?lt(l.value):[]);function P(){o.value=!0}function T(){o.value=!1}function I(){o.value?T():P()}return{isOpen:o,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:$,leftAside:f,isSidebarEnabled:V,open:P,close:T,toggle:I}}function ut(e,t){let n;X(()=>{n=e.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",a)}),ve(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function dt(e){const{page:t,hash:n}=L(),a=S(!1),o=y(()=>e.value.collapsed!=null),r=y(()=>!!e.value.link),l=S(!1),v=()=>{l.value=z(t.value.relativePath,e.value.link)};F([t,e,n],v),U(v);const f=y(()=>l.value?!0:e.value.items?le(t.value.relativePath,e.value.items):!1),$=y(()=>!!(e.value.items&&e.value.items.length));X(()=>{a.value=!!(o.value&&e.value.collapsed)}),fe(()=>{(l.value||f.value)&&(a.value=!1)});function V(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:r,isActiveLink:l,hasActiveLink:f,hasChildren:$,toggle:V}}function vt(){const{hasSidebar:e}=D(),t=se("(min-width: 960px)"),n=se("(min-width: 1280px)");return{isAsideEnabled:y(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ft=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function Me(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function me(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:ht(n),link:"#"+n.id,level:a}});return mt(t,e)}function ht(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(ft.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return _t(e,a,o)}function pt(e,t){const{isAsideEnabled:n}=vt(),a=Qe(r,100);let o=null;U(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),Ee(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const v=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,V=Math.abs(v+f-$)<1,b=ce.map(({element:T,link:I})=>({link:I,top:kt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,I)=>T.top-I.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:T,top:I}of b){if(I>v+Fe()+4)break;P=T}l(P)}function l(v){o&&o.classList.remove("active"),v==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const f=o;f?(f.classList.add("active"),t.value.style.top=f.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function kt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function _t(e,t,n){ce.length=0;const a=[],o=[];return e.forEach(r=>{const l={...r,children:[]};let v=o[o.length-1];for(;v&&v.level>=l.level;)o.pop(),v=o[o.length-1];if(l.element.classList.contains("ignore-header")||v&&"shouldIgnore"in v){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=W("VPDocOutlineItem",!0);return s(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(x,null,A(e.headers,({children:r,link:l,title:v})=>(s(),u("li",null,[d("a",{class:"outline-link",href:l,onClick:t,title:v},M(v),9,bt),r!=null&&r.length?(s(),_(o,{key:0,headers:r},null,8,["headers"])):m("",!0)]))),256))],2)}}}),xe=g(gt,[["__scopeId","data-v-ba57d2ed"]]),$t={class:"content"},yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Pt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=L(),a=$e([]);Y(()=>{a.value=me(t.value.outline??n.value.outline)});const o=S(),r=S();return pt(o,r),(l,v)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[d("div",$t,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",yt,M(i(Me)(i(n))),1),k(xe,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Lt=g(Pt,[["__scopeId","data-v-116d4a1f"]]),Vt={class:"VPDocAsideCarbonAds"},St=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Vt,[k(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Tt={class:"VPDocAside"},Nt=p({__name:"VPDocAside",setup(e){const{theme:t}=L();return(n,a)=>(s(),u("div",Tt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(Lt),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=d("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(s(),_(St,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Mt=g(Nt,[["__scopeId","data-v-8cfe0409"]]);function xt(){const{theme:e,page:t}=L();return y(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function It(){const{page:e,theme:t,frontmatter:n}=L();return y(()=>{var $,V,b,P,T,I,w,C;const a=Ne(t.value.sidebar,e.value.relativePath),o=ct(a),r=wt(o,H=>H.link.replace(/[?#].*$/,"")),l=r.findIndex(H=>z(e.value.relativePath,H.link)),v=(($=t.value.docFooter)==null?void 0:$.prev)===!1&&!n.value.prev||n.value.prev===!1,f=((V=t.value.docFooter)==null?void 0:V.next)===!1&&!n.value.next||n.value.next===!1;return{prev:v?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((b=r[l-1])==null?void 0:b.docFooterText)??((P=r[l-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((T=r[l-1])==null?void 0:T.link)},next:f?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((I=r[l+1])==null?void 0:I.docFooterText)??((w=r[l+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((C=r[l+1])==null?void 0:C.link)}}})}function wt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.tag??(t.href?"a":"span")),a=y(()=>t.href&&ye.test(t.href)||t.target==="_blank");return(o,r)=>(s(),_(B(n.value),{class:N(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(he)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:h(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Ct=["datetime"],Ht=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=L(),o=y(()=>new Date(n.value.lastUpdated)),r=y(()=>o.value.toISOString()),l=S("");return U(()=>{X(()=>{var v,f,$;l.value=new Intl.DateTimeFormat((f=(v=t.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&f.forceLocale?a.value:void 0,(($=t.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(v,f)=>{var $;return s(),u("p",At,[j(M((($=i(t).lastUpdated)==null?void 0:$.text)||i(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},M(l.value),9,Ct)])}}}),Bt=g(Ht,[["__scopeId","data-v-1cbf3ee4"]]),Et={key:0,class:"VPDocFooter"},Ft={key:0,class:"edit-info"},Dt={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Wt={class:"pager"},Kt=["innerHTML"],qt=["innerHTML"],Rt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=L(),o=xt(),r=It(),l=y(()=>t.value.editLink&&a.value.editLink!==!1),v=y(()=>n.value.lastUpdated),f=y(()=>l.value||v.value||r.value.prev||r.value.next);return($,V)=>{var b,P,T,I;return f.value?(s(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(s(),u("div",Ft,[l.value?(s(),u("div",Dt,[k(E,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:h(()=>[V[0]||(V[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),j(" "+M(i(o).text),1)]),_:1},8,["href"])])):m("",!0),v.value?(s(),u("div",Ot,[k(Bt)])):m("",!0)])):m("",!0),(b=i(r).prev)!=null&&b.link||(P=i(r).next)!=null&&P.link?(s(),u("nav",Gt,[V[1]||(V[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",Ut,[(T=i(r).prev)!=null&&T.link?(s(),_(E,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.prev)||"Previous page"},null,8,jt),d("span",{class:"title",innerHTML:i(r).prev.text},null,8,zt)]}),_:1},8,["href"])):m("",!0)]),d("div",Wt,[(I=i(r).next)!=null&&I.link?(s(),_(E,{key:0,class:"pager-link next",href:i(r).next.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.next)||"Next page"},null,8,Kt),d("span",{class:"title",innerHTML:i(r).next.text},null,8,qt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Jt=g(Rt,[["__scopeId","data-v-64297f89"]]),Xt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Zt={class:"content"},en={class:"content-container"},tn={class:"main"},nn=p({__name:"VPDoc",setup(e){const{theme:t}=L(),n=Q(),{hasSidebar:a,hasAside:o,leftAside:r}=D(),l=y(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,f)=>{const $=W("Content");return s(),u("div",{class:N(["VPDoc",{"has-sidebar":i(a),"has-aside":i(o)}])},[c(v.$slots,"doc-top",{},void 0,!0),d("div",Xt,[i(o)?(s(),u("div",{key:0,class:N(["aside",{"left-aside":i(r)}])},[f[0]||(f[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Yt,[d("div",Qt,[k(Mt,null,{"aside-top":h(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),d("div",Zt,[d("div",en,[c(v.$slots,"doc-before",{},void 0,!0),d("main",tn,[k($,{class:N(["vp-doc",[l.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jt,null,{"doc-footer-before":h(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),an=g(nn,[["__scopeId","data-v-888acc39"]]),on=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.href&&ye.test(t.href)),a=y(()=>t.tag||(t.href?"a":"button"));return(o,r)=>(s(),_(B(a.value),{class:N(["VPButton",[e.size,e.theme]]),href:e.href?i(he)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:h(()=>[j(M(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=g(on,[["__scopeId","data-v-6cd5edd1"]]),rn=["src","alt"],ln=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(s(),u(x,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,rn)):(s(),u(x,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),J=g(ln,[["__scopeId","data-v-21b99582"]]),cn={class:"container"},un={class:"main"},dn={class:"heading"},vn=["innerHTML"],fn=["innerHTML"],hn=["innerHTML"],mn={key:0,class:"actions"},pn={key:0,class:"image"},kn={class:"image-container"},_n=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=Z("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:N(["VPHero",{"has-image":e.image||i(t)}])},[d("div",cn,[d("div",un,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[d("h1",dn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,vn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,fn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,hn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",mn,[(s(!0),u(x,null,A(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(s(),u("div",pn,[d("div",kn,[a[0]||(a[0]=d("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(J,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),bn=g(_n,[["__scopeId","data-v-86f5077c"]]),gn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).hero?(s(),_(bn,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":h(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),$n={class:"box"},yn={key:0,class:"icon"},Pn=["innerHTML"],Ln=["innerHTML"],Vn=["innerHTML"],Sn={key:4,class:"link-text"},Tn={class:"link-text-value"},Nn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[d("article",$n,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",yn,[k(J,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(J,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Pn)):m("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Ln),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Vn)):m("",!0),e.linkText?(s(),u("div",Sn,[d("p",Tn,[j(M(e.linkText)+" ",1),n[0]||(n[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Mn=g(Nn,[["__scopeId","data-v-43c03651"]]),xn={key:0,class:"VPFeatures"},In={class:"container"},wn={class:"items"},An=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=y(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",xn,[d("div",In,[d("div",wn,[(s(!0),u(x,null,A(e.features,r=>(s(),u("div",{key:r.title,class:N(["item",[n.value]])},[k(Mn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),Cn=g(An,[["__scopeId","data-v-f8bfa93d"]]),Hn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).features?(s(),_(Cn,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):m("",!0)}}),Bn=p({__name:"VPHomeContent",setup(e){const{width:t}=De({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Pe(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),En=g(Bn,[["__scopeId","data-v-0611f689"]]),Fn=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=L();return(a,o)=>{const r=W("Content");return s(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(gn,null,{"home-hero-info-before":h(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(Hn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(s(),_(En,{key:0},{default:h(()=>[k(r)]),_:1})):(s(),_(r,{key:1}))],2)}}}),Dn=g(Fn,[["__scopeId","data-v-d7a0f279"]]),On={},Gn={class:"VPPage"};function Un(e,t){const n=W("Content");return s(),u("div",Gn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const jn=g(On,[["render",Un]]),zn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>(s(),u("div",{class:N(["VPContent",{"has-sidebar":i(a),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(rt)],!0):i(n).layout==="page"?(s(),_(jn,{key:1},{"page-top":h(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(s(),_(Dn,{key:2},{"home-hero-before":h(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(s(),_(B(i(n).layout),{key:3})):(s(),_(an,{key:4},{"doc-top":h(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Wn=g(zn,[["__scopeId","data-v-6c992f05"]]),Kn={class:"container"},qn=["innerHTML"],Rn=["innerHTML"],Jn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>i(t).footer&&i(n).footer!==!1?(s(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":i(a)}])},[d("div",Kn,[i(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,qn)):m("",!0),i(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,Rn)):m("",!0)])],2)):m("",!0)}}),Xn=g(Jn,[["__scopeId","data-v-137d0c52"]]);function Yn(){const{theme:e,frontmatter:t}=L(),n=$e([]),a=y(()=>n.value.length>0);return Y(()=>{n.value=me(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const Qn={class:"menu-text"},Zn={class:"header"},ea={class:"outline"},ta=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=L(),a=S(!1),o=S(0),r=S(),l=S();function v(b){var P;(P=r.value)!=null&&P.contains(b.target)||(a.value=!1)}F(a,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{a.value=!1}),Y(()=>{a.value=!1});function f(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Le(()=>{a.value=!1}))}function V(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(s(),u("button",{key:0,onClick:f,class:N({open:a.value})},[d("span",Qn,M(i(Me)(i(n))),1),P[0]||(P[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)),k(ue,{name:"flyout"},{default:h(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[d("div",Zn,[d("a",{class:"top-link",href:"#",onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)]),d("div",ea,[k(xe,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),na=g(ta,[["__scopeId","data-v-d1ffc3c0"]]),aa={class:"container"},oa=["aria-expanded"],sa={class:"menu-text"},ia=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D(),{headers:o}=Yn(),{y:r}=Ve(),l=S(0);U(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{o.value=me(n.value.outline??t.value.outline)});const v=y(()=>o.value.length===0),f=y(()=>v.value&&!a.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:v.value,fixed:f.value}));return(V,b)=>i(n).layout!=="home"&&(!f.value||i(r)>=l.value)?(s(),u("div",{key:0,class:N($.value)},[d("div",aa,[i(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",sa,M(i(t).sidebarMenuLabel||"Menu"),1)],8,oa)):m("",!0),k(na,{headers:i(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ra=g(ia,[["__scopeId","data-v-b2c93339"]]);function la(){const e=S(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=Q();return F(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const ca={},ua={class:"VPSwitch",type:"button",role:"switch"},da={class:"check"},va={key:0,class:"icon"};function fa(e,t){return s(),u("button",ua,[d("span",da,[e.$slots.default?(s(),u("span",va,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ha=g(ca,[["render",fa],["__scopeId","data-v-65cb479b"]]),ma=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=L(),a=Z("toggle-appearance",()=>{t.value=!t.value}),o=S("");return fe(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),_(ha,{title:o.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:h(()=>[...l[0]||(l[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),pe=g(ma,[["__scopeId","data-v-95390f3d"]]),pa={key:0,class:"VPNavBarAppearance"},ka=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=L();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",pa,[k(pe)])):m("",!0)}}),_a=g(ka,[["__scopeId","data-v-c2b7fe22"]]),ke=S();let Ie=!1,oe=0;function ba(e){const t=S(!1);if(ee){!Ie&&ga(),oe++;const n=F(ke,a=>{var o,r,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});ve(()=>{n(),oe--,oe||$a()})}return Oe(t)}function ga(){document.addEventListener("focusin",we),Ie=!0,ke.value=document.activeElement}function $a(){document.removeEventListener("focusin",we)}function we(){ke.value=document.activeElement}const ya={class:"VPMenuLink"},Pa=["innerHTML"],La=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),u("div",ya,[k(E,{class:N({active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),te=g(La,[["__scopeId","data-v-859c4b5e"]]),Va={class:"VPMenuGroup"},Sa={key:0,class:"title"},Ta=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Va,[e.text?(s(),u("p",Sa,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),u(x,null,["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),Na=g(Ta,[["__scopeId","data-v-fddbce6f"]]),Ma={class:"VPMenu"},xa={key:0,class:"items"},Ia=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Ma,[e.items?(s(),u("div",xa,[(s(!0),u(x,null,A(e.items,a=>(s(),u(x,{key:JSON.stringify(a)},["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(B(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(Na,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),wa=g(Ia,[["__scopeId","data-v-b1338896"]]),Aa=["aria-expanded","aria-label"],Ca={key:0,class:"text"},Ha=["innerHTML"],Ba={key:1,class:"vpi-more-horizontal icon"},Ea={class:"menu"},Fa=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=S(!1),n=S();ba({el:n,onBlur:a});function a(){t.value=!1}return(o,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=l=>t.value=!0),onMouseleave:r[2]||(r[2]=l=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Ca,[e.icon?(s(),u("span",{key:0,class:N([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ha)):m("",!0),r[3]||(r[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Ba))],8,Aa),d("div",Ea,[k(wa,{items:e.items},{default:h(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=g(Fa,[["__scopeId","data-v-c9799874"]]),Da=["href","aria-label","innerHTML"],Oa=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=S();U(async()=>{var r;await Le();const o=(r=n.value)==null?void 0:r.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=y(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,r)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Da))}}),Ga=g(Oa,[["__scopeId","data-v-9d5b176c"]]),Ua={class:"VPSocialLinks"},ja=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",Ua,[(s(!0),u(x,null,A(e.links,({link:a,icon:o,ariaLabel:r})=>(s(),_(Ga,{key:a,icon:o,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(ja,[["__scopeId","data-v-ce44a42a"]]),za={key:0,class:"group translations"},Wa={class:"trans-title"},Ka={key:1,class:"group"},qa={class:"item appearance"},Ra={class:"label"},Ja={class:"appearance-action"},Xa={key:2,class:"group"},Ya={class:"item social-links"},Qa=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=L(),{localeLinks:a,currentLang:o}=q({correspondingLink:!0}),r=y(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,v)=>r.value?(s(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[i(a).length&&i(o).label?(s(),u("div",za,[d("p",Wa,M(i(o).label),1),(s(!0),u(x,null,A(i(a),f=>(s(),_(te,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Ka,[d("div",qa,[d("p",Ra,M(i(n).darkModeSwitchLabel||"Appearance"),1),d("div",Ja,[k(pe)])])])):m("",!0),i(n).socialLinks?(s(),u("div",Xa,[d("div",Ya,[k(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),Za=g(Qa,[["__scopeId","data-v-563e76b4"]]),eo=["aria-expanded"],to=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)])],10,eo))}}),no=g(to,[["__scopeId","data-v-96eb4489"]]),ao=["innerHTML"],oo=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),_(E,{class:N({VPNavBarMenuLink:!0,active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),so=g(oo,[["__scopeId","data-v-e59bbbee"]]),io=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=L(),a=r=>"component"in r?!1:"link"in r?z(n.value.relativePath,r.link,!!t.item.activeMatch):r.items.some(a),o=y(()=>a(t.item));return(r,l)=>(s(),_(_e,{class:N({VPNavBarMenuGroup:!0,active:i(z)(i(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ro={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},lo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",ro,[a[0]||(a[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(so,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(io,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),co=g(lo,[["__scopeId","data-v-a23194af"]]);function uo(e){const{localeIndex:t,theme:n}=L();function a(o){var I,w,C;const r=o.split("."),l=(I=n.value.search)==null?void 0:I.options,v=l&&typeof l=="object",f=v&&((C=(w=l.locales)==null?void 0:w[t.value])==null?void 0:C.translations)||null,$=v&&l.translations||null;let V=f,b=$,P=e;const T=r.pop();for(const H of r){let O=null;const K=P==null?void 0:P[H];K&&(O=P=K);const ne=b==null?void 0:b[H];ne&&(O=b=ne);const ae=V==null?void 0:V[H];ae&&(O=V=ae),K||(P=O),ne||(b=O),ae||(V=O)}return(V==null?void 0:V[T])??(b==null?void 0:b[T])??(P==null?void 0:P[T])??""}return a}const vo=["aria-label"],fo={class:"DocSearch-Button-Container"},ho={class:"DocSearch-Button-Placeholder"},ge=p({__name:"VPNavBarSearchButton",setup(e){const n=uo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(n)("button.buttonAriaLabel")},[d("span",fo,[o[0]||(o[0]=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),d("span",ho,M(i(n)("button.buttonText")),1)]),o[1]||(o[1]=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vo))}}),mo={class:"VPNavBarSearch"},po={id:"local-search"},ko={key:1,id:"docsearch"},_o=p({__name:"VPNavBarSearch",setup(e){const t=Ge(()=>Ue(()=>import("./VPLocalSearchBox.Bvi8a7xK.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a}=L(),o=S(!1),r=S(!1);U(()=>{});function l(){o.value||(o.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function f(b){const P=b.target,T=P.tagName;return P.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const $=S(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),ie("/",b=>{f(b)||(b.preventDefault(),$.value=!0)});const V="local";return(b,P)=>{var T;return s(),u("div",mo,[i(V)==="local"?(s(),u(x,{key:0},[$.value?(s(),_(i(t),{key:0,onClose:P[0]||(P[0]=I=>$.value=!1)})):m("",!0),d("div",po,[k(ge,{onClick:P[1]||(P[1]=I=>$.value=!0)})])],64)):i(V)==="algolia"?(s(),u(x,{key:1},[o.value?(s(),_(i(n),{key:0,algolia:((T=i(a).search)==null?void 0:T.options)??i(a).algolia,onVnodeBeforeMount:P[2]||(P[2]=I=>r.value=!0)},null,8,["algolia"])):m("",!0),r.value?m("",!0):(s(),u("div",ko,[k(ge,{onClick:l})]))],64)):m("",!0)])}}}),bo=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),go=g(bo,[["__scopeId","data-v-5bf14e4d"]]),$o=["href","rel","target"],yo=["innerHTML"],Po={key:2},Lo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=L(),{hasSidebar:a}=D(),{currentLang:o}=q(),r=y(()=>{var f;return typeof n.value.logoLink=="string"?n.value.logoLink:(f=n.value.logoLink)==null?void 0:f.link}),l=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.rel}),v=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.target});return(f,$)=>(s(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":i(a)}])},[d("a",{class:"title",href:r.value??i(he)(i(o).link),rel:l.value,target:v.value},[c(f.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(s(),_(J,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(s(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,yo)):i(n).siteTitle===void 0?(s(),u("span",Po,M(i(t).title),1)):m("",!0),c(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,$o)],2))}}),Vo=g(Lo,[["__scopeId","data-v-66d4ae12"]]),So={class:"items"},To={class:"title"},No=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=L(),{localeLinks:n,currentLang:a}=q({correspondingLink:!0});return(o,r)=>i(n).length&&i(a).label?(s(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:h(()=>[d("div",So,[d("p",To,M(i(a).label),1),(s(!0),u(x,null,A(i(n),l=>(s(),_(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),Mo=g(No,[["__scopeId","data-v-2d4849be"]]),xo={class:"wrapper"},Io={class:"container"},wo={class:"title"},Ao={class:"content"},Co={class:"content-body"},Ho=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Ve(),{hasSidebar:a}=D(),{frontmatter:o}=L(),r=S({});return fe(()=>{r.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,v)=>(s(),u("div",{class:N(["VPNavBar",r.value])},[d("div",xo,[d("div",Io,[d("div",wo,[k(Vo,null,{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ao,[d("div",Co,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(_o,{class:"search"}),k(co,{class:"menu"}),k(Mo,{class:"translations"}),k(_a,{class:"appearance"}),k(go,{class:"social-links"}),k(Za,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(no,{class:"hamburger",active:e.isScreenOpen,onClick:v[0]||(v[0]=f=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),Bo=g(Ho,[["__scopeId","data-v-8d1ffe88"]]),Eo={key:0,class:"VPNavScreenAppearance"},Fo={class:"text"},Do=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=L();return(a,o)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Eo,[d("p",Fo,M(i(n).darkModeSwitchLabel||"Appearance"),1),k(pe)])):m("",!0)}}),Oo=g(Do,[["__scopeId","data-v-a5de2fe4"]]),Go=["innerHTML"],Uo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Go)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),jo=g(Uo,[["__scopeId","data-v-f6216396"]]),zo=["innerHTML"],Wo=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,zo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ae=g(Wo,[["__scopeId","data-v-989ed20f"]]),Ko={class:"VPNavScreenMenuGroupSection"},qo={key:0,class:"title"},Ro=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",qo,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),_(Ae,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Jo=g(Ro,[["__scopeId","data-v-652dbd88"]]),Xo=["aria-controls","aria-expanded"],Yo=["innerHTML"],Qo=["id"],Zo={key:0,class:"item"},es={key:1,class:"item"},ts={key:2,class:"group"},ns=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=S(!1),a=y(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,l)=>(s(),u("div",{class:N(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[d("span",{class:"button-text",innerHTML:e.text},null,8,Yo),l[0]||(l[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,Xo),d("div",{id:a.value,class:"items"},[(s(!0),u(x,null,A(e.items,v=>(s(),u(x,{key:JSON.stringify(v)},["link"in v?(s(),u("div",Zo,[k(Ae,{item:v},null,8,["item"])])):"component"in v?(s(),u("div",es,[(s(),_(B(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(s(),u("div",ts,[k(Jo,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Qo)],2))}}),as=g(ns,[["__scopeId","data-v-a6f357af"]]),os={key:0,class:"VPNavScreenMenu"},ss=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",os,[(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(jo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(as,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),is=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),rs={class:"list"},ls=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=q({correspondingLink:!0}),a=S(!1);function o(){a.value=!a.value}return(r,l)=>i(t).length&&i(n).label?(s(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:a.value}])},[d("button",{class:"title",onClick:o},[l[0]||(l[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),j(" "+M(i(n).label)+" ",1),l[1]||(l[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",rs,[(s(!0),u(x,null,A(i(t),v=>(s(),u("li",{key:v.link,class:"item"},[k(E,{class:"link",href:v.link},{default:h(()=>[j(M(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),cs=g(ls,[["__scopeId","data-v-16655210"]]),us={class:"container"},ds=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=S(null),n=Se(ee?document.body:null);return(a,o)=>(s(),_(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>n.value=!0),onAfterLeave:o[1]||(o[1]=r=>n.value=!1)},{default:h(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",us,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(ss,{class:"menu"}),k(cs,{class:"translations"}),k(Oo,{class:"appearance"}),k(is,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),vs=g(ds,[["__scopeId","data-v-c2555c5e"]]),fs={key:0,class:"VPNav"},hs=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=la(),{frontmatter:o}=L(),r=y(()=>o.value.navbar!==!1);return Te("close-screen",n),X(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,v)=>r.value?(s(),u("header",fs,[k(Bo,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(vs,{open:i(t)},{"nav-screen-content-before":h(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ms=g(hs,[["__scopeId","data-v-908bdb68"]]),ps=["role","tabindex"],ks={key:1,class:"items"},_s=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:r,hasActiveLink:l,hasChildren:v,toggle:f}=dt(y(()=>t.item)),$=y(()=>v.value?"section":"div"),V=y(()=>o.value?"a":"div"),b=y(()=>v.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=y(()=>o.value?void 0:"button"),T=y(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":l.value}]);function I(C){"key"in C&&C.key!=="Enter"||!t.item.link&&f()}function w(){t.item.link&&f()}return(C,H)=>{const O=W("VPSidebarItem",!0);return s(),_(B($.value),{class:N(["VPSidebarItem",T.value])},{default:h(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:P.value},je(e.item.items?{click:I,keydown:I}:{},!0),{tabindex:e.item.items&&0}),[H[1]||(H[1]=d("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:V.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:h(()=>[(s(),_(B(b.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(B(b.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:w,onKeydown:ze(w,["enter"]),tabindex:"0"},[...H[0]||(H[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,ps)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",ks,[e.depth<5?(s(!0),u(x,{key:0},A(e.item.items,K=>(s(),_(O,{key:K.text,item:K,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),bs=g(_s,[["__scopeId","data-v-31549b30"]]),gs=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=S(!0);let n=null;return U(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),We(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(x,null,A(e.items,r=>(s(),u("div",{key:r.text,class:N(["group",{"no-transition":t.value}])},[k(bs,{item:r,depth:0},null,8,["item"])],2))),128))}}),$s=g(gs,[["__scopeId","data-v-5df780f0"]]),ys={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ps=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=D(),a=e,o=S(null),r=Se(ee?document.body:null);F([a,o],()=>{var v;a.open?(r.value=!0,(v=o.value)==null||v.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=S(0);return F(t,()=>{l.value+=1},{deep:!0}),(v,f)=>i(n)?(s(),u("aside",{key:0,class:N(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:f[0]||(f[0]=Ke(()=>{},["stop"]))},[f[2]||(f[2]=d("div",{class:"curtain"},null,-1)),d("nav",ys,[f[1]||(f[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_($s,{items:i(t),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ls=g(Ps,[["__scopeId","data-v-59945d5d"]]),Vs=p({__name:"VPSkipLink",setup(e){const{theme:t}=L(),n=Q(),a=S();F(()=>n.path,()=>a.value.focus());function o({target:r}){const l=document.getElementById(decodeURIComponent(r.hash).slice(1));if(l){const v=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",v)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",v),l.focus(),window.scrollTo(0,0)}}return(r,l)=>(s(),u(x,null,[d("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},M(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ss=g(Vs,[["__scopeId","data-v-d63408fd"]]),Ts=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=D(),o=Q();F(()=>o.path,a),ut(t,a);const{frontmatter:r}=L(),l=qe(),v=y(()=>!!l["home-hero-image"]);return Te("hero-image-slot-exists",v),(f,$)=>{const V=W("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:N(["Layout",i(r).pageClass])},[c(f.$slots,"layout-top",{},void 0,!0),k(Ss),k(Ye,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),k(ms,null,{"nav-bar-title-before":h(()=>[c(f.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(f.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(f.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(f.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[c(f.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(f.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ra,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),k(Ls,{open:i(t)},{"sidebar-nav-before":h(()=>[c(f.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[c(f.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Wn,null,{"page-top":h(()=>[c(f.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(f.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[c(f.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[c(f.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(f.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(f.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(f.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(f.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(f.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(f.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(f.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(f.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(f.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(f.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[c(f.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(f.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Xn),c(f.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(V,{key:1}))}}}),Ns=g(Ts,[["__scopeId","data-v-ba7c87da"]]),xs={Layout:Ns,enhanceApp:({app:e})=>{e.component("Badge",Re)}};export{uo as c,xs as t,L as u}; diff --git a/assets/getting-started_access.md.BY1pTTRI.js b/assets/getting-started_access.md.YqNM6CpY.js similarity index 99% rename from assets/getting-started_access.md.BY1pTTRI.js rename to assets/getting-started_access.md.YqNM6CpY.js index 2d48fdef..e4314859 100644 --- a/assets/getting-started_access.md.BY1pTTRI.js +++ b/assets/getting-started_access.md.YqNM6CpY.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1776332711000}'),s={name:"getting-started/access.md"};function l(n,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

Bot Access Control

Memoh uses an ACL (Access Control List) system to control who can interact with your bot. You can define prioritized rules to allow or deny specific users, channel identities, or entire channel types — all from the bot's Access tab.


Quick Start: ACL Presets

When you create a bot, Memoh lets you start from an ACL preset. Presets are just a shortcut for common access patterns.

PresetResult
allow_allDefault effect is allow; anyone can chat unless you add deny rules later
private_onlyDefault effect is deny; private conversations are allowed
group_onlyDefault effect is deny; group conversations are allowed
group_and_thread_onlyDefault effect is deny; groups and threads are allowed
deny_allDefault effect is deny; nobody except the owner/admin path can chat until you add allow rules

These presets only define the starting point. After creation, you can refine everything from the Access tab.


Concepts

Default Effect

Each bot has a default effect (allow or deny) that applies when no ACL rule matches an incoming message. Configure this from the bot's Access tab.

  • Allow: Anyone can chat with the bot unless explicitly denied by a rule.
  • Deny: Only the bot owner, admins, and explicitly allowed subjects can chat.

Subject Types

ACL rules can target three kinds of subjects:

SubjectDescription
AllMatches every incoming message regardless of sender. Use this for global allow/deny rules.
Channel IdentityA specific identity on an external channel (e.g., a Telegram user, a Discord member). Useful for controlling access at the individual level.
Channel TypeAn entire channel platform (e.g., all Telegram users, all Discord users). Useful for platform-level access control.

Rule Effects

Each rule has an effect:

  • Allow — Grants the subject permission to chat with the bot.
  • Deny — Blocks the subject from chatting with the bot.

Priority-Based Evaluation

Rules are evaluated in priority order (top to bottom). The first matching rule determines the outcome:

  1. Bot owner or system admin → Always allowed (bypasses ACL).
  2. Rules are checked from highest priority (top) to lowest (bottom).
  3. The first rule whose subject matches the sender is applied.
  4. If no rule matches → the default effect is applied.

This means rule ordering matters. A deny rule placed above an allow rule will take precedence for matching subjects.


Managing Access

Open a bot's Access tab to configure its access control.

Start With A Preset, Then Refine

Recommended workflow:

  1. Pick an ACL preset when creating the bot.
  2. Open the Access tab.
  3. Confirm the resulting Default Effect.
  4. Add or reorder rules only where the preset is too broad or too narrow.

Adding Rules

  1. Click Add Rule.
  2. Select a subject type:
    • All: Applies to everyone.
    • Channel Identity: Search and select a specific channel identity the bot has seen before.
    • Channel Type: Select an entire channel platform.
  3. Choose the effect: allow or deny.
  4. Optionally set source scope to restrict the rule to a specific context:
    • Channel: Only applies when the message comes from a specific channel config.
    • Conversation Type: private, group, or thread.
    • Conversation ID: A specific chat/group ID.
    • Thread ID: A specific thread within a conversation (requires Conversation ID).
  5. Click Save.

Reordering Rules

Rules can be drag-and-dropped to change their priority. Higher rules (closer to the top) are evaluated first. After reordering, click Save to persist the new order.

Source Scope

Source scope lets you create fine-grained rules. For example:

  • Allow a user to chat only via Telegram, but not Discord.
  • Block an entire channel type only in group conversations.
  • Restrict access to a specific thread in a specific group.

Scope fields form a hierarchy: Channel → Conversation Type → Conversation ID → Thread ID. Each level is optional, but a Thread ID requires a Conversation ID.


What The Presets Actually Mean

This is the most useful mental model:

  • allow_all is best for open bots and public demos.
  • private_only is best when the bot should only answer in direct chats.
  • group_only is best for bots intended to live only in shared rooms.
  • group_and_thread_only is best for bots that should work in group spaces and threaded sub-conversations, but not in private DMs.
  • deny_all is best for highly restricted bots where you want to add every allow rule manually.

If you are unsure, start with allow_all for a personal test bot or deny_all for anything sensitive.


Examples

Open Bot (Anyone Can Chat)

  1. Choose preset allow_all, or set ACL Default Effect to allow.
  2. No rules needed — everyone is allowed by default.

Private Bot with Selected Users

  1. Choose preset deny_all, or set ACL Default Effect to deny.
  2. Add allow rules for each authorized channel identity.
  3. Only listed subjects (plus the bot owner and admins) can trigger the bot.

Open Bot with Blocked Users

  1. Choose preset allow_all, or set ACL Default Effect to allow.
  2. Add deny rules for problematic channel identities at the top of the list.
  3. Everyone except denied subjects can chat with the bot.

Platform-Specific Access

  1. Start from preset deny_all or private_only, depending on your goal.
  2. Add an allow rule with subject type Channel Type set to telegram.
  3. Only Telegram users can chat with the bot — messages from other channels are denied.

Channel-Scoped Access

  1. Add an allow rule for a specific channel identity.
  2. Set the Source Scope channel to your Telegram channel config.
  3. The user can only chat with the bot via that specific Telegram channel.

Debugging Access Decisions

When ACL behavior is confusing, use:

  • the Access tab to inspect rule order and default effect
  • the /access slash command to inspect the current identity, role, and ACL evaluation context

This is especially helpful when a user is linked across multiple channels or when group/thread scoping is involved.

',58)])])}const g=t(s,[["render",l]]);export{p as __pageData,g as default}; +import{_ as t,o,c as a,ag as r}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1776332711000}'),s={name:"getting-started/access.md"};function l(n,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

Bot Access Control

Memoh uses an ACL (Access Control List) system to control who can interact with your bot. You can define prioritized rules to allow or deny specific users, channel identities, or entire channel types — all from the bot's Access tab.


Quick Start: ACL Presets

When you create a bot, Memoh lets you start from an ACL preset. Presets are just a shortcut for common access patterns.

PresetResult
allow_allDefault effect is allow; anyone can chat unless you add deny rules later
private_onlyDefault effect is deny; private conversations are allowed
group_onlyDefault effect is deny; group conversations are allowed
group_and_thread_onlyDefault effect is deny; groups and threads are allowed
deny_allDefault effect is deny; nobody except the owner/admin path can chat until you add allow rules

These presets only define the starting point. After creation, you can refine everything from the Access tab.


Concepts

Default Effect

Each bot has a default effect (allow or deny) that applies when no ACL rule matches an incoming message. Configure this from the bot's Access tab.

  • Allow: Anyone can chat with the bot unless explicitly denied by a rule.
  • Deny: Only the bot owner, admins, and explicitly allowed subjects can chat.

Subject Types

ACL rules can target three kinds of subjects:

SubjectDescription
AllMatches every incoming message regardless of sender. Use this for global allow/deny rules.
Channel IdentityA specific identity on an external channel (e.g., a Telegram user, a Discord member). Useful for controlling access at the individual level.
Channel TypeAn entire channel platform (e.g., all Telegram users, all Discord users). Useful for platform-level access control.

Rule Effects

Each rule has an effect:

  • Allow — Grants the subject permission to chat with the bot.
  • Deny — Blocks the subject from chatting with the bot.

Priority-Based Evaluation

Rules are evaluated in priority order (top to bottom). The first matching rule determines the outcome:

  1. Bot owner or system admin → Always allowed (bypasses ACL).
  2. Rules are checked from highest priority (top) to lowest (bottom).
  3. The first rule whose subject matches the sender is applied.
  4. If no rule matches → the default effect is applied.

This means rule ordering matters. A deny rule placed above an allow rule will take precedence for matching subjects.


Managing Access

Open a bot's Access tab to configure its access control.

Start With A Preset, Then Refine

Recommended workflow:

  1. Pick an ACL preset when creating the bot.
  2. Open the Access tab.
  3. Confirm the resulting Default Effect.
  4. Add or reorder rules only where the preset is too broad or too narrow.

Adding Rules

  1. Click Add Rule.
  2. Select a subject type:
    • All: Applies to everyone.
    • Channel Identity: Search and select a specific channel identity the bot has seen before.
    • Channel Type: Select an entire channel platform.
  3. Choose the effect: allow or deny.
  4. Optionally set source scope to restrict the rule to a specific context:
    • Channel: Only applies when the message comes from a specific channel config.
    • Conversation Type: private, group, or thread.
    • Conversation ID: A specific chat/group ID.
    • Thread ID: A specific thread within a conversation (requires Conversation ID).
  5. Click Save.

Reordering Rules

Rules can be drag-and-dropped to change their priority. Higher rules (closer to the top) are evaluated first. After reordering, click Save to persist the new order.

Source Scope

Source scope lets you create fine-grained rules. For example:

  • Allow a user to chat only via Telegram, but not Discord.
  • Block an entire channel type only in group conversations.
  • Restrict access to a specific thread in a specific group.

Scope fields form a hierarchy: Channel → Conversation Type → Conversation ID → Thread ID. Each level is optional, but a Thread ID requires a Conversation ID.


What The Presets Actually Mean

This is the most useful mental model:

  • allow_all is best for open bots and public demos.
  • private_only is best when the bot should only answer in direct chats.
  • group_only is best for bots intended to live only in shared rooms.
  • group_and_thread_only is best for bots that should work in group spaces and threaded sub-conversations, but not in private DMs.
  • deny_all is best for highly restricted bots where you want to add every allow rule manually.

If you are unsure, start with allow_all for a personal test bot or deny_all for anything sensitive.


Examples

Open Bot (Anyone Can Chat)

  1. Choose preset allow_all, or set ACL Default Effect to allow.
  2. No rules needed — everyone is allowed by default.

Private Bot with Selected Users

  1. Choose preset deny_all, or set ACL Default Effect to deny.
  2. Add allow rules for each authorized channel identity.
  3. Only listed subjects (plus the bot owner and admins) can trigger the bot.

Open Bot with Blocked Users

  1. Choose preset allow_all, or set ACL Default Effect to allow.
  2. Add deny rules for problematic channel identities at the top of the list.
  3. Everyone except denied subjects can chat with the bot.

Platform-Specific Access

  1. Start from preset deny_all or private_only, depending on your goal.
  2. Add an allow rule with subject type Channel Type set to telegram.
  3. Only Telegram users can chat with the bot — messages from other channels are denied.

Channel-Scoped Access

  1. Add an allow rule for a specific channel identity.
  2. Set the Source Scope channel to your Telegram channel config.
  3. The user can only chat with the bot via that specific Telegram channel.

Debugging Access Decisions

When ACL behavior is confusing, use:

  • the Access tab to inspect rule order and default effect
  • the /access slash command to inspect the current identity, role, and ACL evaluation context

This is especially helpful when a user is linked across multiple channels or when group/thread scoping is involved.

',58)])])}const g=t(s,[["render",l]]);export{p as __pageData,g as default}; diff --git a/assets/getting-started_access.md.BY1pTTRI.lean.js b/assets/getting-started_access.md.YqNM6CpY.lean.js similarity index 86% rename from assets/getting-started_access.md.BY1pTTRI.lean.js rename to assets/getting-started_access.md.YqNM6CpY.lean.js index 3f28a04f..42597597 100644 --- a/assets/getting-started_access.md.BY1pTTRI.lean.js +++ b/assets/getting-started_access.md.YqNM6CpY.lean.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1776332711000}'),s={name:"getting-started/access.md"};function l(n,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",58)])])}const g=t(s,[["render",l]]);export{p as __pageData,g as default}; +import{_ as t,o,c as a,ag as r}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1776332711000}'),s={name:"getting-started/access.md"};function l(n,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",58)])])}const g=t(s,[["render",l]]);export{p as __pageData,g as default}; diff --git a/assets/getting-started_bot.md.CTc86MCg.js b/assets/getting-started_bot.md.Cun_Y-ny.js similarity index 99% rename from assets/getting-started_bot.md.CTc86MCg.js rename to assets/getting-started_bot.md.Cun_Y-ny.js index 706ca9a5..66cab27d 100644 --- a/assets/getting-started_bot.md.CTc86MCg.js +++ b/assets/getting-started_bot.md.Cun_Y-ny.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1776332711000}'),n={name:"getting-started/bot.md"};function s(i,t,d,l,c,h){return o(),a("div",null,[...t[0]||(t[0]=[r('

Bot Management

A Bot is an independent AI agent that comes with its own isolated container, persistent memory, and configurable personality. Bots can chat via various messaging platforms (Channels) and perform complex tasks using specialized tools.

Creating a Bot

  1. Navigate to the Bots page from the sidebar.
  2. Click the Create Bot button.
  3. Fill in the basic info:
    • Display Name: The name users will see in chats.
    • Avatar: A URL for the bot's profile picture.
    • Timezone: Optional per-bot timezone. If left empty, the bot inherits the user or system timezone.
    • ACL Preset: Quick-start access policy such as allow_all or private_only.
  4. Click Create.

Bot Detail Page

Once created, clicking on a bot card takes you to its Detail Page, where you can manage its entire lifecycle through specialized tabs.

Tab Overview

TabDescription
OverviewHealth checks for container, database, channels, and memory.
GeneralCore runtime settings: chat/title/image models, memory/search/browser/TTS bindings, timezone, language, reasoning, and danger zone.
ContainerContainer lifecycle (create/start/stop), snapshots, data export/import.
MemoryBrowse, search, create, edit, and compact memories.
PlatformsChannel configurations such as Telegram, Discord, Feishu, QQ, Matrix, WeCom, WeChat, Misskey, DingTalk, and Web.
AccessACL rules and default access behavior.
EmailEmail bindings and outbox.
TerminalInteractive terminal access to the bot's container.
FilesFile manager for the bot's container filesystem.
MCPMCP connection management (Stdio, Remote, OAuth).
HeartbeatHeartbeat configuration, model selection, and execution logs.
CompactionSession context compaction settings and logs.
ScheduleCron-based scheduled tasks and execution logs.
SkillsMarkdown-based skill files that define bot personality and capabilities.

Configuring the Bot's Core Settings

After creating a bot, the most important step is configuring its runtime settings. These settings are split across a few tabs instead of living in one giant form.

  1. Navigate to your bot's Detail Page.
  2. Start with the General tab for chat/runtime bindings.
  3. Use the Heartbeat tab for scheduled autonomous activity.
  4. Use the Compaction tab for session context compaction behavior.
  5. Use the Access tab to refine ACL rules after the initial ACL preset.

If you have not created these resources yet, set them up first:


General Tab Reference

The General tab contains the settings that shape everyday conversation behavior.

FieldDescription
Chat ModelThe main LLM used for generating chat responses.
Title ModelOptional model used to generate session titles.
Image Generation ModelOptional model used by image-generation features. Pick a chat model that supports image-output.
Memory ProviderThe memory backend assigned to the bot. The built-in provider can optionally define its own memory and embedding models.
Search ProviderThe search engine used for web browsing capabilities.
TTS ModelOptional speech model used for text-to-speech output. Speech models come from the TTS Providers flow, not the normal chat provider flow.
Browser ContextThe browser environment used for web automation, such as viewport, locale, and mobile behavior.
TimezonePer-bot timezone. If empty, Memoh inherits the user timezone and then falls back to the system timezone.
LanguageThe bot's primary communication language.
Reasoning EnabledAvailable when the selected chat model exposes reasoning compatibility.
Reasoning EffortSet the level of reasoning effort (low, medium, high).

Notes:

  • The Image Generation Model is intentionally separate from the normal chat model so you can dedicate an image-capable model only to visual generation tasks.
  • The TTS Model comes from the TTS Providers system and uses speech models such as Edge TTS voices.
  • The selected chat model's context_window influences session status reporting and Context Compaction.

Heartbeat Tab Reference

Heartbeat is configured from its own tab.

FieldDescription
Heartbeat EnabledEnable or disable periodic autonomous activity.
Heartbeat IntervalHow often the heartbeat runs, in minutes.
Heartbeat ModelOptional dedicated model for heartbeat tasks. This can differ from the main chat model.

The Heartbeat tab also includes heartbeat execution logs, so you can review what the bot did during autonomous runs.


Compaction Tab Reference

Compaction is now about session context compaction, not memory maintenance.

FieldDescription
Compaction EnabledEnable or disable automatic context compaction.
Compaction ThresholdEstimated token threshold that triggers compaction.
Compaction RatioHow aggressively the session context should be reduced.
Compaction ModelOptional dedicated model used to summarize old session context.

The Compaction tab also exposes compaction logs so you can see recent successful, pending, or failed runs.

For the runtime behavior, see Context Compaction.


Access And ACL

At creation time, the bot starts from an ACL preset. After that, use the Access tab for fine-grained control.

Two layers matter:

  • ACL Preset gives you a sensible starting policy for a new bot.
  • ACL Default Effect controls the default result when no rule matches.

Use the Access tab to refine conversation, group, and thread rules after the initial setup.


Most users only need the chat and discuss behavior described in Sessions.

If you manage bot settings through the API or custom automation, the settings schema also includes discuss_probe_model_id for discuss-mode specific setups. Treat it as an advanced setting rather than a required field for normal bot creation.


Terminal Tab

The Terminal tab provides interactive shell access to the bot's container:

  • Open multiple terminal tabs simultaneously.
  • Execute commands directly inside the container.
  • Requires the container to be running.

Deleting a Bot

To permanently remove a bot and all its associated data (including container files and memory):

  1. Navigate to the General tab in the Bot Detail page.
  2. Scroll to the Danger Zone at the bottom.
  3. Click Delete Bot and confirm the action.

Warning: This action is irreversible. All persistent data for this bot will be lost.

',51)])])}const b=e(n,[["render",s]]);export{m as __pageData,b as default}; +import{_ as e,o,c as a,ag as r}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1776332711000}'),n={name:"getting-started/bot.md"};function s(i,t,d,l,c,h){return o(),a("div",null,[...t[0]||(t[0]=[r('

Bot Management

A Bot is an independent AI agent that comes with its own isolated container, persistent memory, and configurable personality. Bots can chat via various messaging platforms (Channels) and perform complex tasks using specialized tools.

Creating a Bot

  1. Navigate to the Bots page from the sidebar.
  2. Click the Create Bot button.
  3. Fill in the basic info:
    • Display Name: The name users will see in chats.
    • Avatar: A URL for the bot's profile picture.
    • Timezone: Optional per-bot timezone. If left empty, the bot inherits the user or system timezone.
    • ACL Preset: Quick-start access policy such as allow_all or private_only.
  4. Click Create.

Bot Detail Page

Once created, clicking on a bot card takes you to its Detail Page, where you can manage its entire lifecycle through specialized tabs.

Tab Overview

TabDescription
OverviewHealth checks for container, database, channels, and memory.
GeneralCore runtime settings: chat/title/image models, memory/search/browser/TTS bindings, timezone, language, reasoning, and danger zone.
ContainerContainer lifecycle (create/start/stop), snapshots, data export/import.
MemoryBrowse, search, create, edit, and compact memories.
PlatformsChannel configurations such as Telegram, Discord, Feishu, QQ, Matrix, WeCom, WeChat, Misskey, DingTalk, and Web.
AccessACL rules and default access behavior.
EmailEmail bindings and outbox.
TerminalInteractive terminal access to the bot's container.
FilesFile manager for the bot's container filesystem.
MCPMCP connection management (Stdio, Remote, OAuth).
HeartbeatHeartbeat configuration, model selection, and execution logs.
CompactionSession context compaction settings and logs.
ScheduleCron-based scheduled tasks and execution logs.
SkillsMarkdown-based skill files that define bot personality and capabilities.

Configuring the Bot's Core Settings

After creating a bot, the most important step is configuring its runtime settings. These settings are split across a few tabs instead of living in one giant form.

  1. Navigate to your bot's Detail Page.
  2. Start with the General tab for chat/runtime bindings.
  3. Use the Heartbeat tab for scheduled autonomous activity.
  4. Use the Compaction tab for session context compaction behavior.
  5. Use the Access tab to refine ACL rules after the initial ACL preset.

If you have not created these resources yet, set them up first:


General Tab Reference

The General tab contains the settings that shape everyday conversation behavior.

FieldDescription
Chat ModelThe main LLM used for generating chat responses.
Title ModelOptional model used to generate session titles.
Image Generation ModelOptional model used by image-generation features. Pick a chat model that supports image-output.
Memory ProviderThe memory backend assigned to the bot. The built-in provider can optionally define its own memory and embedding models.
Search ProviderThe search engine used for web browsing capabilities.
TTS ModelOptional speech model used for text-to-speech output. Speech models come from the TTS Providers flow, not the normal chat provider flow.
Browser ContextThe browser environment used for web automation, such as viewport, locale, and mobile behavior.
TimezonePer-bot timezone. If empty, Memoh inherits the user timezone and then falls back to the system timezone.
LanguageThe bot's primary communication language.
Reasoning EnabledAvailable when the selected chat model exposes reasoning compatibility.
Reasoning EffortSet the level of reasoning effort (low, medium, high).

Notes:

  • The Image Generation Model is intentionally separate from the normal chat model so you can dedicate an image-capable model only to visual generation tasks.
  • The TTS Model comes from the TTS Providers system and uses speech models such as Edge TTS voices.
  • The selected chat model's context_window influences session status reporting and Context Compaction.

Heartbeat Tab Reference

Heartbeat is configured from its own tab.

FieldDescription
Heartbeat EnabledEnable or disable periodic autonomous activity.
Heartbeat IntervalHow often the heartbeat runs, in minutes.
Heartbeat ModelOptional dedicated model for heartbeat tasks. This can differ from the main chat model.

The Heartbeat tab also includes heartbeat execution logs, so you can review what the bot did during autonomous runs.


Compaction Tab Reference

Compaction is now about session context compaction, not memory maintenance.

FieldDescription
Compaction EnabledEnable or disable automatic context compaction.
Compaction ThresholdEstimated token threshold that triggers compaction.
Compaction RatioHow aggressively the session context should be reduced.
Compaction ModelOptional dedicated model used to summarize old session context.

The Compaction tab also exposes compaction logs so you can see recent successful, pending, or failed runs.

For the runtime behavior, see Context Compaction.


Access And ACL

At creation time, the bot starts from an ACL preset. After that, use the Access tab for fine-grained control.

Two layers matter:

  • ACL Preset gives you a sensible starting policy for a new bot.
  • ACL Default Effect controls the default result when no rule matches.

Use the Access tab to refine conversation, group, and thread rules after the initial setup.


Most users only need the chat and discuss behavior described in Sessions.

If you manage bot settings through the API or custom automation, the settings schema also includes discuss_probe_model_id for discuss-mode specific setups. Treat it as an advanced setting rather than a required field for normal bot creation.


Terminal Tab

The Terminal tab provides interactive shell access to the bot's container:

  • Open multiple terminal tabs simultaneously.
  • Execute commands directly inside the container.
  • Requires the container to be running.

Deleting a Bot

To permanently remove a bot and all its associated data (including container files and memory):

  1. Navigate to the General tab in the Bot Detail page.
  2. Scroll to the Danger Zone at the bottom.
  3. Click Delete Bot and confirm the action.

Warning: This action is irreversible. All persistent data for this bot will be lost.

',51)])])}const b=e(n,[["render",s]]);export{m as __pageData,b as default}; diff --git a/assets/getting-started_bot.md.CTc86MCg.lean.js b/assets/getting-started_bot.md.Cun_Y-ny.lean.js similarity index 85% rename from assets/getting-started_bot.md.CTc86MCg.lean.js rename to assets/getting-started_bot.md.Cun_Y-ny.lean.js index efde409b..79ceef9e 100644 --- a/assets/getting-started_bot.md.CTc86MCg.lean.js +++ b/assets/getting-started_bot.md.Cun_Y-ny.lean.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1776332711000}'),n={name:"getting-started/bot.md"};function s(i,t,d,l,c,h){return o(),a("div",null,[...t[0]||(t[0]=[r("",51)])])}const b=e(n,[["render",s]]);export{m as __pageData,b as default}; +import{_ as e,o,c as a,ag as r}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1776332711000}'),n={name:"getting-started/bot.md"};function s(i,t,d,l,c,h){return o(),a("div",null,[...t[0]||(t[0]=[r("",51)])])}const b=e(n,[["render",s]]);export{m as __pageData,b as default}; diff --git a/assets/getting-started_browser.md.Cjpk7h3a.js b/assets/getting-started_browser.md.CjVL6wjg.js similarity index 99% rename from assets/getting-started_browser.md.Cjpk7h3a.js rename to assets/getting-started_browser.md.CjVL6wjg.js index e55eaeb6..0653881e 100644 --- a/assets/getting-started_browser.md.Cjpk7h3a.js +++ b/assets/getting-started_browser.md.CjVL6wjg.js @@ -1 +1 @@ -import{_ as e,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1774787421000}'),s={name:"getting-started/browser.md"};function i(n,t,l,d,c,h){return o(),r("div",null,[...t[0]||(t[0]=[a('

Browser Contexts

Memoh can give a bot access to a headless browser through the Browser Gateway. A Browser Context stores the browser environment a bot should use, such as viewport size, locale, timezone, and mobile behavior.

Once a browser context is assigned to a bot, the bot can use browser tools to open pages, click elements, fill forms, capture screenshots, and inspect page content.


Concept: Browser Gateway

The Browser Gateway is powered by Playwright and provides browser automation for bots. In practice, a browser context acts like a reusable browser profile configuration for one or more bots.

Typical use cases include:

  • Navigating websites
  • Clicking buttons and links
  • Filling and submitting forms
  • Reading rendered page content
  • Capturing screenshots or PDFs

Creating a Browser Context

Manage contexts from the Browser Contexts page in the sidebar.

  1. Navigate to the Browser Contexts page.
  2. Click Add Browser Context.
  3. Fill in the following field:
    • Name: A display name for this browser context.
  4. Click Create.

Configuring a Browser Context

After creating a context, select it from the sidebar and update its settings.

FieldDescription
NameThe display name shown in the UI.
CoreBrowser engine: chromium (default) or firefox.
Viewport WidthBrowser viewport width in pixels.
Viewport HeightBrowser viewport height in pixels.
User AgentOptional custom browser user agent string.
Device Scale FactorOptional device pixel ratio.
LocaleOptional locale such as en-US or zh-CN.
Timezone IDOptional timezone such as UTC or Asia/Shanghai.
Is MobileEnables mobile-style browser behavior.
Ignore HTTPS ErrorsAllows navigation to sites with invalid HTTPS certificates.

Managing Contexts

  • Edit: Select a context and update its configuration.
  • Delete: Remove a context you no longer use.

Assigning a Browser Context to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Browser Context dropdown.
  4. Select the context you created.
  5. Click Save.

After saving, the bot can use that browser context when browser tools are invoked.


Bot Interaction

When a browser context is configured, the bot can use built-in browser tools such as:

  • browser_action: perform actions like navigation, click, fill, select, scroll, tab management, screenshot, or PDF export
  • browser_observe: inspect the current page and gather information for the model

This lets the bot interact with real websites instead of relying only on static HTML or search results.


Browser Core Selection

Memoh's browser image can include Chromium, Firefox, or both. The available cores are determined at build time by the BROWSER_CORES build argument.

The install script prompts for browser core selection during setup. To rebuild manually with specific cores:

bash
BROWSER_CORES=chromium docker compose --profile browser build browser

Valid values for BROWSER_CORES: chromium, firefox, chromium,firefox (default).


Next Steps

',36)])])}const b=e(s,[["render",i]]);export{p as __pageData,b as default}; +import{_ as e,o,c as r,ag as a}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1774787421000}'),s={name:"getting-started/browser.md"};function i(n,t,l,d,c,h){return o(),r("div",null,[...t[0]||(t[0]=[a('

Browser Contexts

Memoh can give a bot access to a headless browser through the Browser Gateway. A Browser Context stores the browser environment a bot should use, such as viewport size, locale, timezone, and mobile behavior.

Once a browser context is assigned to a bot, the bot can use browser tools to open pages, click elements, fill forms, capture screenshots, and inspect page content.


Concept: Browser Gateway

The Browser Gateway is powered by Playwright and provides browser automation for bots. In practice, a browser context acts like a reusable browser profile configuration for one or more bots.

Typical use cases include:

  • Navigating websites
  • Clicking buttons and links
  • Filling and submitting forms
  • Reading rendered page content
  • Capturing screenshots or PDFs

Creating a Browser Context

Manage contexts from the Browser Contexts page in the sidebar.

  1. Navigate to the Browser Contexts page.
  2. Click Add Browser Context.
  3. Fill in the following field:
    • Name: A display name for this browser context.
  4. Click Create.

Configuring a Browser Context

After creating a context, select it from the sidebar and update its settings.

FieldDescription
NameThe display name shown in the UI.
CoreBrowser engine: chromium (default) or firefox.
Viewport WidthBrowser viewport width in pixels.
Viewport HeightBrowser viewport height in pixels.
User AgentOptional custom browser user agent string.
Device Scale FactorOptional device pixel ratio.
LocaleOptional locale such as en-US or zh-CN.
Timezone IDOptional timezone such as UTC or Asia/Shanghai.
Is MobileEnables mobile-style browser behavior.
Ignore HTTPS ErrorsAllows navigation to sites with invalid HTTPS certificates.

Managing Contexts

  • Edit: Select a context and update its configuration.
  • Delete: Remove a context you no longer use.

Assigning a Browser Context to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Browser Context dropdown.
  4. Select the context you created.
  5. Click Save.

After saving, the bot can use that browser context when browser tools are invoked.


Bot Interaction

When a browser context is configured, the bot can use built-in browser tools such as:

  • browser_action: perform actions like navigation, click, fill, select, scroll, tab management, screenshot, or PDF export
  • browser_observe: inspect the current page and gather information for the model

This lets the bot interact with real websites instead of relying only on static HTML or search results.


Browser Core Selection

Memoh's browser image can include Chromium, Firefox, or both. The available cores are determined at build time by the BROWSER_CORES build argument.

The install script prompts for browser core selection during setup. To rebuild manually with specific cores:

bash
BROWSER_CORES=chromium docker compose --profile browser build browser

Valid values for BROWSER_CORES: chromium, firefox, chromium,firefox (default).


Next Steps

',36)])])}const b=e(s,[["render",i]]);export{p as __pageData,b as default}; diff --git a/assets/getting-started_browser.md.Cjpk7h3a.lean.js b/assets/getting-started_browser.md.CjVL6wjg.lean.js similarity index 86% rename from assets/getting-started_browser.md.Cjpk7h3a.lean.js rename to assets/getting-started_browser.md.CjVL6wjg.lean.js index a3e135ad..db812144 100644 --- a/assets/getting-started_browser.md.Cjpk7h3a.lean.js +++ b/assets/getting-started_browser.md.CjVL6wjg.lean.js @@ -1 +1 @@ -import{_ as e,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1774787421000}'),s={name:"getting-started/browser.md"};function i(n,t,l,d,c,h){return o(),r("div",null,[...t[0]||(t[0]=[a("",36)])])}const b=e(s,[["render",i]]);export{p as __pageData,b as default}; +import{_ as e,o,c as r,ag as a}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1774787421000}'),s={name:"getting-started/browser.md"};function i(n,t,l,d,c,h){return o(),r("div",null,[...t[0]||(t[0]=[a("",36)])])}const b=e(s,[["render",i]]);export{p as __pageData,b as default}; diff --git a/assets/getting-started_channels.md.CIKhbgq7.js b/assets/getting-started_channels.md.zZ6TuOep.js similarity index 98% rename from assets/getting-started_channels.md.CIKhbgq7.js rename to assets/getting-started_channels.md.zZ6TuOep.js index 00699a0b..253acf75 100644 --- a/assets/getting-started_channels.md.CIKhbgq7.js +++ b/assets/getting-started_channels.md.zZ6TuOep.js @@ -1 +1 @@ -import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1776579425000}'),i={name:"getting-started/channels.md"};function r(l,t,s,d,h,c){return a(),n("div",null,[...t[0]||(t[0]=[o('

Bot Channels

Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.

Concept: Unified Communication

Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, Matrix, and more simultaneously.


Supported Channels

Configure your bot's connections from the Platforms tab in the Bot Detail page.

Platform Guides

PlatformGuideNotes
TelegramTelegram ConfigurationStrong attachment and streaming support
Feishu (Lark)Feishu ConfigurationSupports webhook-style inbound mode
DiscordDiscord ConfigurationGood fit for communities and servers
QQQQ ConfigurationPersonal DM oriented
MatrixMatrix ConfigurationDecentralized homeserver support
MisskeyMisskey ConfigurationReplies and reactions, no streaming
DingTalkDingTalk ConfigurationEnterprise private/group chat
WeCom (WeWork)WeCom ConfigurationEnterprise workspace integration
WeChatWeChat ConfigurationPersonal QR login flow
WeChat Official AccountWeChat Official Account ConfigurationOfficial account webhook flow
SlackSlack ConfigurationReplies, no streaming

Two WeChat adapters exist on purpose:

  • WeChat is the QR-login personal messaging integration.
  • WeChat Official Account is the official account / webhook integration for private-message scenarios.

Configuration Flow

1. Adding a Channel

  1. Click Add Channel.
  2. Select the platform from the list.
  3. Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.

2. Common Fields

FieldDescription
CredentialsAPI tokens, secrets, or bot keys provided by the platform.
DisabledQuickly enable or disable a channel without removing its configuration.
RoutingConfigure how messages are mapped between the platform and Memoh.

3. Special Case: Feishu Webhook

If using Feishu in webhook inbound mode:

  1. Memoh will generate a Webhook Callback URL.
  2. Copy this URL and paste it into your Feishu App's event configuration.
  3. This allows Feishu to send messages directly to Memoh.

4. Special Case: WeChat QR Login

If using WeChat:

  1. After enabling the channel, a QR code flow is provided for connecting.
  2. Scan the QR code with WeChat to link the bot.

5. Special Case: WeChat Official Account Webhook

If using WeChat Official Account:

  1. Create and save the channel first.
  2. Memoh generates a Webhook Callback URL for that channel.
  3. Copy the callback URL into the WeChat Official Account platform configuration.
  4. Keep the configured Token, Encryption Mode, and optional AES settings aligned between Memoh and WeChat.

6. Special Case: DingTalk Stream Connection

If using DingTalk:

  1. Configure App Key and App Secret.
  2. Save and enable the channel.
  3. Memoh maintains the stream connection for inbound events; you do not need to manage a separate webhook callback URL for the standard setup.

Operations

  • Save: Update the configuration.
  • Save and Enable: Update and immediately activate the channel.
  • Enable/Disable Toggle: Switch the channel's active status.
  • Delete: Permanently remove a channel's configuration.
',32)])])}const f=e(i,[["render",r]]);export{u as __pageData,f as default}; +import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1776579425000}'),i={name:"getting-started/channels.md"};function r(l,t,s,d,h,c){return a(),n("div",null,[...t[0]||(t[0]=[o('

Bot Channels

Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.

Concept: Unified Communication

Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, Matrix, and more simultaneously.


Supported Channels

Configure your bot's connections from the Platforms tab in the Bot Detail page.

Platform Guides

PlatformGuideNotes
TelegramTelegram ConfigurationStrong attachment and streaming support
Feishu (Lark)Feishu ConfigurationSupports webhook-style inbound mode
DiscordDiscord ConfigurationGood fit for communities and servers
QQQQ ConfigurationPersonal DM oriented
MatrixMatrix ConfigurationDecentralized homeserver support
MisskeyMisskey ConfigurationReplies and reactions, no streaming
DingTalkDingTalk ConfigurationEnterprise private/group chat
WeCom (WeWork)WeCom ConfigurationEnterprise workspace integration
WeChatWeChat ConfigurationPersonal QR login flow
WeChat Official AccountWeChat Official Account ConfigurationOfficial account webhook flow
SlackSlack ConfigurationReplies, no streaming

Two WeChat adapters exist on purpose:

  • WeChat is the QR-login personal messaging integration.
  • WeChat Official Account is the official account / webhook integration for private-message scenarios.

Configuration Flow

1. Adding a Channel

  1. Click Add Channel.
  2. Select the platform from the list.
  3. Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.

2. Common Fields

FieldDescription
CredentialsAPI tokens, secrets, or bot keys provided by the platform.
DisabledQuickly enable or disable a channel without removing its configuration.
RoutingConfigure how messages are mapped between the platform and Memoh.

3. Special Case: Feishu Webhook

If using Feishu in webhook inbound mode:

  1. Memoh will generate a Webhook Callback URL.
  2. Copy this URL and paste it into your Feishu App's event configuration.
  3. This allows Feishu to send messages directly to Memoh.

4. Special Case: WeChat QR Login

If using WeChat:

  1. After enabling the channel, a QR code flow is provided for connecting.
  2. Scan the QR code with WeChat to link the bot.

5. Special Case: WeChat Official Account Webhook

If using WeChat Official Account:

  1. Create and save the channel first.
  2. Memoh generates a Webhook Callback URL for that channel.
  3. Copy the callback URL into the WeChat Official Account platform configuration.
  4. Keep the configured Token, Encryption Mode, and optional AES settings aligned between Memoh and WeChat.

6. Special Case: DingTalk Stream Connection

If using DingTalk:

  1. Configure App Key and App Secret.
  2. Save and enable the channel.
  3. Memoh maintains the stream connection for inbound events; you do not need to manage a separate webhook callback URL for the standard setup.

Operations

  • Save: Update the configuration.
  • Save and Enable: Update and immediately activate the channel.
  • Enable/Disable Toggle: Switch the channel's active status.
  • Delete: Permanently remove a channel's configuration.
',32)])])}const f=e(i,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/getting-started_channels.md.CIKhbgq7.lean.js b/assets/getting-started_channels.md.zZ6TuOep.lean.js similarity index 72% rename from assets/getting-started_channels.md.CIKhbgq7.lean.js rename to assets/getting-started_channels.md.zZ6TuOep.lean.js index bc37860b..31c24eb8 100644 --- a/assets/getting-started_channels.md.CIKhbgq7.lean.js +++ b/assets/getting-started_channels.md.zZ6TuOep.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1776579425000}'),i={name:"getting-started/channels.md"};function r(l,t,s,d,h,c){return a(),n("div",null,[...t[0]||(t[0]=[o("",32)])])}const f=e(i,[["render",r]]);export{u as __pageData,f as default}; +import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1776579425000}'),i={name:"getting-started/channels.md"};function r(l,t,s,d,h,c){return a(),n("div",null,[...t[0]||(t[0]=[o("",32)])])}const f=e(i,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/getting-started_compaction.md.B6zFV5na.js b/assets/getting-started_compaction.md.G9ICyEJo.js similarity index 99% rename from assets/getting-started_compaction.md.B6zFV5na.js rename to assets/getting-started_compaction.md.G9ICyEJo.js index 2ead75a7..8c0d289f 100644 --- a/assets/getting-started_compaction.md.B6zFV5na.js +++ b/assets/getting-started_compaction.md.G9ICyEJo.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as s}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Context Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1776332711000}'),n={name:"getting-started/compaction.md"};function i(r,t,c,l,d,h){return o(),a("div",null,[...t[0]||(t[0]=[s('

Context Compaction

Context Compaction reduces the prompt footprint of a single conversation session by summarizing older turns and keeping the active context smaller.

This page is about session context, not long-term memory storage. If you want to merge or rewrite stored memories in a memory provider, see Bot Memory Management.


Why It Exists

As a conversation grows, the bot needs to send more prior messages back to the model. That increases:

  • token usage
  • latency
  • pressure on the model's context window
  • the chance that older but still important turns will crowd out newer ones

Context compaction helps by replacing older conversational detail with a shorter summary that still preserves enough continuity for the next turns.


What It Changes

Context compaction affects the active session context only.

It does not:

  • delete the bot itself
  • change the configured memory provider
  • merge long-term memory records
  • replace the need for memory search

In practice, it changes how much historical session text is carried into future model calls.


Automatic Compaction

Configure automatic context compaction from the bot's General tab.

Relevant fields:

FieldDescription
Compaction EnabledEnable or disable automatic context compaction for this bot.
Compaction ThresholdEstimated token threshold that triggers background compaction.
Compaction RatioHow aggressively the session should be reduced during compaction.
Compaction ModelThe model used to summarize old session context.

When enabled, Memoh can compact context in the background after a turn when the estimated input size passes the configured threshold.

Memoh also uses the selected model's context_window to understand how close the session is to the available budget.


Immediate Compaction

You can trigger compaction immediately for the current session in two ways:

From The Session Status Panel

  1. Open the active conversation.
  2. Open the session status panel.
  3. Click Compact Now.

The status panel also shows the current context usage, cache hit rate, and used skills, which helps you decide whether compaction is useful right now.

From Slash Commands

Run:

text
/compact

or:

text
/compact run

This runs synchronous context compaction for the current session and returns a status result to chat.


Status And Logs

The Compaction tab in the bot detail page provides an audit trail for context compaction runs.

Typical fields include:

  • Status — whether the compaction finished successfully or failed
  • Summary — the compacted summary text or a summary preview
  • Message Count — how many messages were involved
  • Started / Completed Time — when the run happened
  • Model / Usage — metadata about the model and token usage when available

The log list is useful when you want to verify that automatic compaction is actually running or diagnose a failure.


Relationship To context_window

Memoh tracks the current session against the selected chat model's context_window.

You can see this in:

  • the Web UI session status panel
  • the /status slash command

Compaction becomes more valuable as the active session gets closer to the model's context limit. A dedicated compaction model can also be used to summarize more cheaply than the main chat model.


Context Compaction vs Memory Compaction

These two features sound similar but solve different problems:

FeatureScopeTriggerResult
Context CompactionOne active sessionSession panel or /compactSummarizes older chat history for future turns
Memory CompactionLong-term memory providerMemory tabRewrites stored memory entries

Use Context Compaction when one conversation has become too large.

Use Memory Compaction when the bot's stored memories themselves have become noisy or redundant.


Next Steps

',54)])])}const u=e(n,[["render",i]]);export{p as __pageData,u as default}; +import{_ as e,o,c as a,ag as s}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Context Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1776332711000}'),n={name:"getting-started/compaction.md"};function i(r,t,c,l,d,h){return o(),a("div",null,[...t[0]||(t[0]=[s('

Context Compaction

Context Compaction reduces the prompt footprint of a single conversation session by summarizing older turns and keeping the active context smaller.

This page is about session context, not long-term memory storage. If you want to merge or rewrite stored memories in a memory provider, see Bot Memory Management.


Why It Exists

As a conversation grows, the bot needs to send more prior messages back to the model. That increases:

  • token usage
  • latency
  • pressure on the model's context window
  • the chance that older but still important turns will crowd out newer ones

Context compaction helps by replacing older conversational detail with a shorter summary that still preserves enough continuity for the next turns.


What It Changes

Context compaction affects the active session context only.

It does not:

  • delete the bot itself
  • change the configured memory provider
  • merge long-term memory records
  • replace the need for memory search

In practice, it changes how much historical session text is carried into future model calls.


Automatic Compaction

Configure automatic context compaction from the bot's General tab.

Relevant fields:

FieldDescription
Compaction EnabledEnable or disable automatic context compaction for this bot.
Compaction ThresholdEstimated token threshold that triggers background compaction.
Compaction RatioHow aggressively the session should be reduced during compaction.
Compaction ModelThe model used to summarize old session context.

When enabled, Memoh can compact context in the background after a turn when the estimated input size passes the configured threshold.

Memoh also uses the selected model's context_window to understand how close the session is to the available budget.


Immediate Compaction

You can trigger compaction immediately for the current session in two ways:

From The Session Status Panel

  1. Open the active conversation.
  2. Open the session status panel.
  3. Click Compact Now.

The status panel also shows the current context usage, cache hit rate, and used skills, which helps you decide whether compaction is useful right now.

From Slash Commands

Run:

text
/compact

or:

text
/compact run

This runs synchronous context compaction for the current session and returns a status result to chat.


Status And Logs

The Compaction tab in the bot detail page provides an audit trail for context compaction runs.

Typical fields include:

  • Status — whether the compaction finished successfully or failed
  • Summary — the compacted summary text or a summary preview
  • Message Count — how many messages were involved
  • Started / Completed Time — when the run happened
  • Model / Usage — metadata about the model and token usage when available

The log list is useful when you want to verify that automatic compaction is actually running or diagnose a failure.


Relationship To context_window

Memoh tracks the current session against the selected chat model's context_window.

You can see this in:

  • the Web UI session status panel
  • the /status slash command

Compaction becomes more valuable as the active session gets closer to the model's context limit. A dedicated compaction model can also be used to summarize more cheaply than the main chat model.


Context Compaction vs Memory Compaction

These two features sound similar but solve different problems:

FeatureScopeTriggerResult
Context CompactionOne active sessionSession panel or /compactSummarizes older chat history for future turns
Memory CompactionLong-term memory providerMemory tabRewrites stored memory entries

Use Context Compaction when one conversation has become too large.

Use Memory Compaction when the bot's stored memories themselves have become noisy or redundant.


Next Steps

',54)])])}const u=e(n,[["render",i]]);export{p as __pageData,u as default}; diff --git a/assets/getting-started_compaction.md.B6zFV5na.lean.js b/assets/getting-started_compaction.md.G9ICyEJo.lean.js similarity index 86% rename from assets/getting-started_compaction.md.B6zFV5na.lean.js rename to assets/getting-started_compaction.md.G9ICyEJo.lean.js index f02899e5..1bc3fe7a 100644 --- a/assets/getting-started_compaction.md.B6zFV5na.lean.js +++ b/assets/getting-started_compaction.md.G9ICyEJo.lean.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as s}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Context Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1776332711000}'),n={name:"getting-started/compaction.md"};function i(r,t,c,l,d,h){return o(),a("div",null,[...t[0]||(t[0]=[s("",54)])])}const u=e(n,[["render",i]]);export{p as __pageData,u as default}; +import{_ as e,o,c as a,ag as s}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Context Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1776332711000}'),n={name:"getting-started/compaction.md"};function i(r,t,c,l,d,h){return o(),a("div",null,[...t[0]||(t[0]=[s("",54)])])}const u=e(n,[["render",i]]);export{p as __pageData,u as default}; diff --git a/assets/getting-started_container.md.Do_YGEZB.js b/assets/getting-started_container.md.CrcDm5m4.js similarity index 98% rename from assets/getting-started_container.md.Do_YGEZB.js rename to assets/getting-started_container.md.CrcDm5m4.js index 2323238e..1c4fadb9 100644 --- a/assets/getting-started_container.md.Do_YGEZB.js +++ b/assets/getting-started_container.md.CrcDm5m4.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1775803937000}'),n={name:"getting-started/container.md"};function r(s,e,l,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[i('

Bot Container Management

Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.

Concept: The Isolated Workspace

The container acts as the bot's private "computer." Within it, the bot can:

  • Store and modify files
  • Install software via package managers
  • Execute scripts
  • Maintain state across multiple sessions

Operations

Manage the lifecycle of your bot's environment from the Container tab in the Bot Detail page.

Lifecycle Actions

  • Create: Initialize the container if it doesn't exist (using the configured image). Progress is shown via real-time SSE feedback during image pull and creation.
  • Start: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.
  • Stop: Gracefully shut down the container to save resources.
  • Delete: Remove the container instance.

Container Information

The Container tab displays real-time data about the bot's runtime:

  • Container ID: Unique identifier for the instance.
  • Status: Whether it's currently running, stopped, or creating.
  • Image: The Docker/Containerd image used as the base.
  • Paths: Host and container paths for data persistence.
  • Tasks: Number of active background tasks running in the container.
  • CDI Devices: The effective GPU CDI devices currently attached to the container, if any.

Advanced: Provide CDI Devices

Memoh can provide host devices to a bot container through CDI (Container Device Interface). This is an advanced capability for users who want to expose host-managed devices, most commonly GPUs, to the container runtime.

In the Web UI, this capability is placed under Advanced options in the Container tab. It is optional and only needs to be configured when the bot must access CDI-backed devices from the host.

Configure CDI Devices

  1. Open the Bot's Container tab.
  2. Click Create if the container does not exist, or recreate the container if you need to change GPU settings.
  3. Expand Advanced options.
  4. Enable GPU.
  5. Enter one or more CDI device names in CDI devices.

You can enter CDI device names one per line or separated with commas. Common GPU-related examples:

  • nvidia.com/gpu=0
  • nvidia.com/gpu=all
  • amd.com/gpu=0
  • amd.com/gpu=all

Host Requirements

Before configuring CDI devices in Memoh, the host machine must already provide working device drivers, vendor toolkit support where required, and valid CDI specs. In practice, this usually means:

  • the host GPU works normally outside the container
  • CDI spec files exist under /etc/cdi or /var/run/cdi
  • the device name you enter in Memoh matches a real CDI device on the host

To discover the exact CDI device names exposed by the host, use the vendor tool on the host machine:

  • NVIDIA: nvidia-ctk cdi list
  • AMD: amd-ctk cdi list

If Memoh reports an error such as unresolvable CDI devices, the configured device name does not match any CDI device visible to the container runtime.

Important Behavior

  • CDI device settings are applied when the container is created. Updating the setting later requires recreating the container.
  • Stopping and starting an existing container does not change its attached CDI devices.
  • The container image still needs the appropriate user-space libraries and tools if you want to run CUDA or ROCm software inside the container.
  • After creation, the Container tab shows the effective attached CDI devices for verification.

Snapshots

Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:

  • Saving a known good configuration
  • Versioning the bot's environment
  • Testing complex changes safely

Creating a Snapshot

  1. Ensure the container is stopped or in a stable state.
  2. Click Create Snapshot.
  3. Provide a name for the snapshot.

Restoring a Snapshot

  • Find the desired snapshot in the list and click Restore. This will reset the container to the captured state.

Managing Snapshots

  • View a list of existing snapshots with their creation timestamps and parent relationships.
  • Use the Delete button next to a snapshot to remove it.

Data Export and Import

The Container tab supports exporting and importing container data for backup, migration, or sharing purposes.

Export

  1. Click Export Data.
  2. The container's filesystem data is packaged into a downloadable archive.
  3. Save the archive to your local machine.

Import

  1. Click Import Data.
  2. Select an archive file from your local machine.
  3. The archive contents are extracted into the container's filesystem.

Restore

The Restore operation resets the container's data directory to a clean state. This is useful when the filesystem has become corrupted or you want to start fresh without recreating the container.


Container Versioning

Memoh tracks container versions to manage the lifecycle of the bot's runtime environment. Version information includes:

  • Current Version: The active container version.
  • Version History: A log of container version changes over time.

This helps with auditing and understanding when container configurations were updated.

',54)])])}const g=t(n,[["render",r]]);export{u as __pageData,g as default}; +import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1775803937000}'),n={name:"getting-started/container.md"};function r(s,e,l,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[i('

Bot Container Management

Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.

Concept: The Isolated Workspace

The container acts as the bot's private "computer." Within it, the bot can:

  • Store and modify files
  • Install software via package managers
  • Execute scripts
  • Maintain state across multiple sessions

Operations

Manage the lifecycle of your bot's environment from the Container tab in the Bot Detail page.

Lifecycle Actions

  • Create: Initialize the container if it doesn't exist (using the configured image). Progress is shown via real-time SSE feedback during image pull and creation.
  • Start: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.
  • Stop: Gracefully shut down the container to save resources.
  • Delete: Remove the container instance.

Container Information

The Container tab displays real-time data about the bot's runtime:

  • Container ID: Unique identifier for the instance.
  • Status: Whether it's currently running, stopped, or creating.
  • Image: The Docker/Containerd image used as the base.
  • Paths: Host and container paths for data persistence.
  • Tasks: Number of active background tasks running in the container.
  • CDI Devices: The effective GPU CDI devices currently attached to the container, if any.

Advanced: Provide CDI Devices

Memoh can provide host devices to a bot container through CDI (Container Device Interface). This is an advanced capability for users who want to expose host-managed devices, most commonly GPUs, to the container runtime.

In the Web UI, this capability is placed under Advanced options in the Container tab. It is optional and only needs to be configured when the bot must access CDI-backed devices from the host.

Configure CDI Devices

  1. Open the Bot's Container tab.
  2. Click Create if the container does not exist, or recreate the container if you need to change GPU settings.
  3. Expand Advanced options.
  4. Enable GPU.
  5. Enter one or more CDI device names in CDI devices.

You can enter CDI device names one per line or separated with commas. Common GPU-related examples:

  • nvidia.com/gpu=0
  • nvidia.com/gpu=all
  • amd.com/gpu=0
  • amd.com/gpu=all

Host Requirements

Before configuring CDI devices in Memoh, the host machine must already provide working device drivers, vendor toolkit support where required, and valid CDI specs. In practice, this usually means:

  • the host GPU works normally outside the container
  • CDI spec files exist under /etc/cdi or /var/run/cdi
  • the device name you enter in Memoh matches a real CDI device on the host

To discover the exact CDI device names exposed by the host, use the vendor tool on the host machine:

  • NVIDIA: nvidia-ctk cdi list
  • AMD: amd-ctk cdi list

If Memoh reports an error such as unresolvable CDI devices, the configured device name does not match any CDI device visible to the container runtime.

Important Behavior

  • CDI device settings are applied when the container is created. Updating the setting later requires recreating the container.
  • Stopping and starting an existing container does not change its attached CDI devices.
  • The container image still needs the appropriate user-space libraries and tools if you want to run CUDA or ROCm software inside the container.
  • After creation, the Container tab shows the effective attached CDI devices for verification.

Snapshots

Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:

  • Saving a known good configuration
  • Versioning the bot's environment
  • Testing complex changes safely

Creating a Snapshot

  1. Ensure the container is stopped or in a stable state.
  2. Click Create Snapshot.
  3. Provide a name for the snapshot.

Restoring a Snapshot

  • Find the desired snapshot in the list and click Restore. This will reset the container to the captured state.

Managing Snapshots

  • View a list of existing snapshots with their creation timestamps and parent relationships.
  • Use the Delete button next to a snapshot to remove it.

Data Export and Import

The Container tab supports exporting and importing container data for backup, migration, or sharing purposes.

Export

  1. Click Export Data.
  2. The container's filesystem data is packaged into a downloadable archive.
  3. Save the archive to your local machine.

Import

  1. Click Import Data.
  2. Select an archive file from your local machine.
  3. The archive contents are extracted into the container's filesystem.

Restore

The Restore operation resets the container's data directory to a clean state. This is useful when the filesystem has become corrupted or you want to start fresh without recreating the container.


Container Versioning

Memoh tracks container versions to manage the lifecycle of the bot's runtime environment. Version information includes:

  • Current Version: The active container version.
  • Version History: A log of container version changes over time.

This helps with auditing and understanding when container configurations were updated.

',54)])])}const g=t(n,[["render",r]]);export{u as __pageData,g as default}; diff --git a/assets/getting-started_container.md.Do_YGEZB.lean.js b/assets/getting-started_container.md.CrcDm5m4.lean.js similarity index 73% rename from assets/getting-started_container.md.Do_YGEZB.lean.js rename to assets/getting-started_container.md.CrcDm5m4.lean.js index 424604f2..04a8ae06 100644 --- a/assets/getting-started_container.md.Do_YGEZB.lean.js +++ b/assets/getting-started_container.md.CrcDm5m4.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1775803937000}'),n={name:"getting-started/container.md"};function r(s,e,l,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[i("",54)])])}const g=t(n,[["render",r]]);export{u as __pageData,g as default}; +import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1775803937000}'),n={name:"getting-started/container.md"};function r(s,e,l,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[i("",54)])])}const g=t(n,[["render",r]]);export{u as __pageData,g as default}; diff --git a/assets/getting-started_email.md.DLrAWkek.js b/assets/getting-started_email.md.DN5WsFFI.js similarity index 97% rename from assets/getting-started_email.md.DLrAWkek.js rename to assets/getting-started_email.md.DN5WsFFI.js index cf408f36..5a44ddc6 100644 --- a/assets/getting-started_email.md.DLrAWkek.js +++ b/assets/getting-started_email.md.DN5WsFFI.js @@ -1 +1 @@ -import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t('

Email Providers and Bindings

Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.

Concept: Email as a Bot Channel

Connecting email to your Bot involves two steps:

  1. Email Provider: Configure a connection to an email service (like Mailgun or a generic SMTP server).
  2. Email Binding: Link a specific email address from a provider to a Bot.

Email Provider

Manage your email service connections from the Email Provider page in the sidebar.

Creating a Provider

  1. Navigate to the Email Provider page from the sidebar.
  2. Click Add Email Provider.
  3. Choose the provider type:
    • Mailgun: For high-volume delivery.
    • Generic SMTP: For traditional email servers.
  4. Fill in the required fields (e.g., domain, api_key, host, port, username, password).
  5. Click Create.

Bot Email Bindings

Configure your bot's email capabilities from the Email tab in the Bot Detail page.

Adding a Binding

  1. Click Add Binding.
  2. Select the Email Provider you created.
  3. Provide the Email Address to be associated with the bot.
  4. Set the bot's permissions:
    • Can Read: If enabled, the bot can check and process incoming emails.
    • Can Write: If enabled, the bot can compose and send outgoing emails.
    • Can Delete: If enabled, the bot can manage its own email inbox.
  5. Click Create.

Outbox and History

The Email tab also provides an Outbox showing an audit log of all emails sent by the bot:

  • To: The recipient's email address.
  • Subject: The email's subject line.
  • Status: Whether the email was sent successfully.
  • Sent At: The timestamp of the email delivery.

Bot Interaction

  • The bot can use its email permissions to send reports, respond to user inquiries, or trigger actions based on incoming mail.
  • Outgoing emails are tracked in the outbox for monitoring and troubleshooting.
  • The bot handles email in a structured way, allowing it to "converse" via email just as it does via chat.
',22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; +import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t('

Email Providers and Bindings

Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.

Concept: Email as a Bot Channel

Connecting email to your Bot involves two steps:

  1. Email Provider: Configure a connection to an email service (like Mailgun or a generic SMTP server).
  2. Email Binding: Link a specific email address from a provider to a Bot.

Email Provider

Manage your email service connections from the Email Provider page in the sidebar.

Creating a Provider

  1. Navigate to the Email Provider page from the sidebar.
  2. Click Add Email Provider.
  3. Choose the provider type:
    • Mailgun: For high-volume delivery.
    • Generic SMTP: For traditional email servers.
  4. Fill in the required fields (e.g., domain, api_key, host, port, username, password).
  5. Click Create.

Bot Email Bindings

Configure your bot's email capabilities from the Email tab in the Bot Detail page.

Adding a Binding

  1. Click Add Binding.
  2. Select the Email Provider you created.
  3. Provide the Email Address to be associated with the bot.
  4. Set the bot's permissions:
    • Can Read: If enabled, the bot can check and process incoming emails.
    • Can Write: If enabled, the bot can compose and send outgoing emails.
    • Can Delete: If enabled, the bot can manage its own email inbox.
  5. Click Create.

Outbox and History

The Email tab also provides an Outbox showing an audit log of all emails sent by the bot:

  • To: The recipient's email address.
  • Subject: The email's subject line.
  • Status: Whether the email was sent successfully.
  • Sent At: The timestamp of the email delivery.

Bot Interaction

  • The bot can use its email permissions to send reports, respond to user inquiries, or trigger actions based on incoming mail.
  • Outgoing emails are tracked in the outbox for monitoring and troubleshooting.
  • The bot handles email in a structured way, allowing it to "converse" via email just as it does via chat.
',22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/getting-started_email.md.DLrAWkek.lean.js b/assets/getting-started_email.md.DN5WsFFI.lean.js similarity index 72% rename from assets/getting-started_email.md.DLrAWkek.lean.js rename to assets/getting-started_email.md.DN5WsFFI.lean.js index 46dc61ec..0c0915c9 100644 --- a/assets/getting-started_email.md.DLrAWkek.lean.js +++ b/assets/getting-started_email.md.DN5WsFFI.lean.js @@ -1 +1 @@ -import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t("",22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; +import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t("",22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/getting-started_files.md.CbhHSLX5.js b/assets/getting-started_files.md.Db2yzSPF.js similarity index 96% rename from assets/getting-started_files.md.CbhHSLX5.js rename to assets/getting-started_files.md.Db2yzSPF.js index 6661cb59..75642adb 100644 --- a/assets/getting-started_files.md.CbhHSLX5.js +++ b/assets/getting-started_files.md.Db2yzSPF.js @@ -1 +1 @@ -import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o('

Bot Files Management

Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the Files tab in the Bot Detail page.


Operations

The FileManager component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.

Browsing and Navigation

  • Breadcrumb Navigation: Quickly move between parent directories.
  • Refresh: Reload the file list to see the latest changes (e.g., files created by the bot).
  • New Folder: Create a directory within the current path.

Managing Files

  • Upload: Select files from your local computer to transfer them into the bot's container.
  • Rename: Click on a file or folder and use the rename action to update its identifier.
  • Delete: Remove files or folders (with recursive support for directories).
  • Download: Retrieve a file from the bot's container back to your local machine.

Viewing and Editing

The integrated FileViewer allows you to interact with the bot's files without leaving the web UI.

Text Files

  • Read/Edit: Click a text file (e.g., .md, .js, .py, .toml) to open it in the built-in Monaco Editor.
  • Syntax Highlighting: Supports common programming languages and configuration formats.
  • Save: Modify the file's content and click Save to apply the changes to the bot's filesystem.

Images

  • Preview: Click an image file (e.g., .png, .jpg, .webp) to see a visual preview directly in the file manager.

Bot Interaction with Files

Remember that the bot itself can also perform these operations:

  • Use its Skills or MCP tools to read, write, and manage its own files.
  • The Files tab is your portal to monitor and manually intervene in the bot's workspace.
',20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; +import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o('

Bot Files Management

Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the Files tab in the Bot Detail page.


Operations

The FileManager component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.

Browsing and Navigation

  • Breadcrumb Navigation: Quickly move between parent directories.
  • Refresh: Reload the file list to see the latest changes (e.g., files created by the bot).
  • New Folder: Create a directory within the current path.

Managing Files

  • Upload: Select files from your local computer to transfer them into the bot's container.
  • Rename: Click on a file or folder and use the rename action to update its identifier.
  • Delete: Remove files or folders (with recursive support for directories).
  • Download: Retrieve a file from the bot's container back to your local machine.

Viewing and Editing

The integrated FileViewer allows you to interact with the bot's files without leaving the web UI.

Text Files

  • Read/Edit: Click a text file (e.g., .md, .js, .py, .toml) to open it in the built-in Monaco Editor.
  • Syntax Highlighting: Supports common programming languages and configuration formats.
  • Save: Modify the file's content and click Save to apply the changes to the bot's filesystem.

Images

  • Preview: Click an image file (e.g., .png, .jpg, .webp) to see a visual preview directly in the file manager.

Bot Interaction with Files

Remember that the bot itself can also perform these operations:

  • Use its Skills or MCP tools to read, write, and manage its own files.
  • The Files tab is your portal to monitor and manually intervene in the bot's workspace.
',20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/getting-started_files.md.CbhHSLX5.lean.js b/assets/getting-started_files.md.Db2yzSPF.lean.js similarity index 72% rename from assets/getting-started_files.md.CbhHSLX5.lean.js rename to assets/getting-started_files.md.Db2yzSPF.lean.js index 95b5962c..1b8b378f 100644 --- a/assets/getting-started_files.md.CbhHSLX5.lean.js +++ b/assets/getting-started_files.md.Db2yzSPF.lean.js @@ -1 +1 @@ -import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o("",20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; +import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o("",20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/getting-started_heartbeat.md.lBwT6Ivl.js b/assets/getting-started_heartbeat.md.hEHFzwV2.js similarity index 98% rename from assets/getting-started_heartbeat.md.lBwT6Ivl.js rename to assets/getting-started_heartbeat.md.hEHFzwV2.js index 168f7184..7097ed79 100644 --- a/assets/getting-started_heartbeat.md.lBwT6Ivl.js +++ b/assets/getting-started_heartbeat.md.hEHFzwV2.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r('

Bot Heartbeat

The Heartbeat feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren't chatting with it.

Concept: Scheduled Autonomy

A Heartbeat is a recurring trigger that prompts the bot to "think" and execute its skills or tools at a set interval. This is useful for:

  • Periodic status checks
  • Automatic data collection
  • Cleaning up the filesystem
  • Sending scheduled notifications

Configuration

Configure the heartbeat from the Heartbeat tab in the Bot Detail page.

FieldDescription
EnabledToggle the heartbeat on or off.
IntervalHow often (in minutes) the heartbeat should trigger. The default is 30 minutes.
ModelThe LLM used to execute the heartbeat task. This can be different from the main chat model.

Logs and Monitoring

The Heartbeat tab provides a detailed audit log of every execution:

  • Status: Whether the heartbeat completed successfully (ok), encountered an issue (alert), or failed (error).
  • Time: When the heartbeat was triggered.
  • Duration: How long the bot took to process the task.
  • Result: A summary of the bot's action or response during that heartbeat.

Managing Logs

  • Filter by Status: Quickly find errors or alerts.
  • Refresh: Load the latest log entries.
  • Clear Logs: Remove old heartbeat records to keep the interface clean.
  • Load More: View older history.

Bot Interaction

  • During a heartbeat, the bot receives a special system prompt that it should perform its "routine" tasks.
  • The bot can use any of its assigned Skills or MCP tools during a heartbeat.
  • Heartbeat logs provide the "memory" of the bot's autonomous activities.
',18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; +import{_ as e,o,c as a,ag as r}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r('

Bot Heartbeat

The Heartbeat feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren't chatting with it.

Concept: Scheduled Autonomy

A Heartbeat is a recurring trigger that prompts the bot to "think" and execute its skills or tools at a set interval. This is useful for:

  • Periodic status checks
  • Automatic data collection
  • Cleaning up the filesystem
  • Sending scheduled notifications

Configuration

Configure the heartbeat from the Heartbeat tab in the Bot Detail page.

FieldDescription
EnabledToggle the heartbeat on or off.
IntervalHow often (in minutes) the heartbeat should trigger. The default is 30 minutes.
ModelThe LLM used to execute the heartbeat task. This can be different from the main chat model.

Logs and Monitoring

The Heartbeat tab provides a detailed audit log of every execution:

  • Status: Whether the heartbeat completed successfully (ok), encountered an issue (alert), or failed (error).
  • Time: When the heartbeat was triggered.
  • Duration: How long the bot took to process the task.
  • Result: A summary of the bot's action or response during that heartbeat.

Managing Logs

  • Filter by Status: Quickly find errors or alerts.
  • Refresh: Load the latest log entries.
  • Clear Logs: Remove old heartbeat records to keep the interface clean.
  • Load More: View older history.

Bot Interaction

  • During a heartbeat, the bot receives a special system prompt that it should perform its "routine" tasks.
  • The bot can use any of its assigned Skills or MCP tools during a heartbeat.
  • Heartbeat logs provide the "memory" of the bot's autonomous activities.
',18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; diff --git a/assets/getting-started_heartbeat.md.lBwT6Ivl.lean.js b/assets/getting-started_heartbeat.md.hEHFzwV2.lean.js similarity index 86% rename from assets/getting-started_heartbeat.md.lBwT6Ivl.lean.js rename to assets/getting-started_heartbeat.md.hEHFzwV2.lean.js index c3bcc35b..e5b7b605 100644 --- a/assets/getting-started_heartbeat.md.lBwT6Ivl.lean.js +++ b/assets/getting-started_heartbeat.md.hEHFzwV2.lean.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r("",18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; +import{_ as e,o,c as a,ag as r}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r("",18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; diff --git a/assets/getting-started_mcp.md.Lc9xd9cr.js b/assets/getting-started_mcp.md.BZLjLQ-y.js similarity index 98% rename from assets/getting-started_mcp.md.Lc9xd9cr.js rename to assets/getting-started_mcp.md.BZLjLQ-y.js index a30f1cd7..b5d7a16f 100644 --- a/assets/getting-started_mcp.md.Lc9xd9cr.js +++ b/assets/getting-started_mcp.md.BZLjLQ-y.js @@ -1 +1 @@ -import{_ as e,o,c as n,ag as r}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1776332711000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r('

MCP Connections

Memoh fully supports the Model Context Protocol (MCP), allowing you to connect your Bot to external tool services and context providers.

Concept: Extending Bot Capabilities

MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.

You can configure connections manually from the MCP tab, or start from a curated template in Supermarket and then review the prefilled draft in the bot editor.


Connection Types

Configure MCP connections from the MCP tab in the Bot Detail page.

1. Stdio (Local Process)

This type of connection executes a local command inside the bot's container and communicates via standard input/output.

FieldDescription
CommandThe executable to run (e.g., npx, python3).
ArgumentsA list of command-line arguments (e.g., -y, @modelcontextprotocol/server-filesystem, /opt/memoh/data).
EnvKey-value pairs for environment variables.
CWDWorking directory for the process.

2. Remote (HTTP/SSE)

This type of connection connects to a remote MCP server over the network.

FieldDescription
URLThe endpoint of the remote MCP server.
HeadersCustom HTTP headers (e.g., for authentication).
TransportChoose between http or sse (Server-Sent Events).

OAuth Authentication

Some MCP servers require OAuth-based authentication. Memoh supports the full MCP OAuth flow:

  1. Click the OAuth button on a connection that requires authentication.
  2. Memoh will discover the server's OAuth configuration automatically.
  3. Click Authorize to open the provider's authorization page.
  4. After granting access, you are redirected back to Memoh.
  5. The token is exchanged and stored securely for the connection.

You can also:

  • Check status — View the current OAuth token status.
  • Revoke — Remove the stored OAuth token.

Operations

  • Add Connection: Click Add, choose the type, and fill in the configuration.
  • Import JSON: Use the Import button to quickly add multiple connections from a standard mcpServers JSON config file.
  • Export: Export connection configurations to a JSON file for backup or sharing.
  • Toggle Active: Enable or disable specific connections without deleting them.
  • Search: Quickly find a connection by name or ID.
  • Batch Delete: Select multiple connections and delete them at once.

Tool Discovery

Once an MCP connection is active, Memoh automatically discovers the tools exposed by the server. You can:

  1. Click on a connection to view its details.
  2. The Tools section lists all available tools with their names and descriptions.
  3. The bot will use these tools automatically during conversations when relevant.

You can also use the Probe button to manually refresh the tool list from the server.


Bot Interaction

Once an MCP connection is active, the bot will automatically:

  • Discover the tools and resources exposed by the MCP server.
  • Use these tools to perform tasks requested by the user.
  • Include the context provided by the MCP server in its reasoning process.
',32)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default}; +import{_ as e,o,c as n,ag as r}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1776332711000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r('

MCP Connections

Memoh fully supports the Model Context Protocol (MCP), allowing you to connect your Bot to external tool services and context providers.

Concept: Extending Bot Capabilities

MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.

You can configure connections manually from the MCP tab, or start from a curated template in Supermarket and then review the prefilled draft in the bot editor.


Connection Types

Configure MCP connections from the MCP tab in the Bot Detail page.

1. Stdio (Local Process)

This type of connection executes a local command inside the bot's container and communicates via standard input/output.

FieldDescription
CommandThe executable to run (e.g., npx, python3).
ArgumentsA list of command-line arguments (e.g., -y, @modelcontextprotocol/server-filesystem, /opt/memoh/data).
EnvKey-value pairs for environment variables.
CWDWorking directory for the process.

2. Remote (HTTP/SSE)

This type of connection connects to a remote MCP server over the network.

FieldDescription
URLThe endpoint of the remote MCP server.
HeadersCustom HTTP headers (e.g., for authentication).
TransportChoose between http or sse (Server-Sent Events).

OAuth Authentication

Some MCP servers require OAuth-based authentication. Memoh supports the full MCP OAuth flow:

  1. Click the OAuth button on a connection that requires authentication.
  2. Memoh will discover the server's OAuth configuration automatically.
  3. Click Authorize to open the provider's authorization page.
  4. After granting access, you are redirected back to Memoh.
  5. The token is exchanged and stored securely for the connection.

You can also:

  • Check status — View the current OAuth token status.
  • Revoke — Remove the stored OAuth token.

Operations

  • Add Connection: Click Add, choose the type, and fill in the configuration.
  • Import JSON: Use the Import button to quickly add multiple connections from a standard mcpServers JSON config file.
  • Export: Export connection configurations to a JSON file for backup or sharing.
  • Toggle Active: Enable or disable specific connections without deleting them.
  • Search: Quickly find a connection by name or ID.
  • Batch Delete: Select multiple connections and delete them at once.

Tool Discovery

Once an MCP connection is active, Memoh automatically discovers the tools exposed by the server. You can:

  1. Click on a connection to view its details.
  2. The Tools section lists all available tools with their names and descriptions.
  3. The bot will use these tools automatically during conversations when relevant.

You can also use the Probe button to manually refresh the tool list from the server.


Bot Interaction

Once an MCP connection is active, the bot will automatically:

  • Discover the tools and resources exposed by the MCP server.
  • Use these tools to perform tasks requested by the user.
  • Include the context provided by the MCP server in its reasoning process.
',32)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default}; diff --git a/assets/getting-started_mcp.md.Lc9xd9cr.lean.js b/assets/getting-started_mcp.md.BZLjLQ-y.lean.js similarity index 85% rename from assets/getting-started_mcp.md.Lc9xd9cr.lean.js rename to assets/getting-started_mcp.md.BZLjLQ-y.lean.js index 9e444992..5bb6baff 100644 --- a/assets/getting-started_mcp.md.Lc9xd9cr.lean.js +++ b/assets/getting-started_mcp.md.BZLjLQ-y.lean.js @@ -1 +1 @@ -import{_ as e,o,c as n,ag as r}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1776332711000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r("",32)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default}; +import{_ as e,o,c as n,ag as r}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1776332711000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r("",32)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default}; diff --git a/assets/getting-started_memory.md.WVVdvmGu.js b/assets/getting-started_memory.md.5cl77orc.js similarity index 99% rename from assets/getting-started_memory.md.WVVdvmGu.js rename to assets/getting-started_memory.md.5cl77orc.js index 18bd7291..fc142b2e 100644 --- a/assets/getting-started_memory.md.WVVdvmGu.js +++ b/assets/getting-started_memory.md.5cl77orc.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1776332711000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('

Bot Memory Management

Memoh's structured long-term memory system allows bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.

Prerequisites

Before using the Memory tab, make sure your bot already has a Memory Provider configured.

  1. Create a provider from one of the Memory Providers (Built-in, Mem0, or OpenViking).
  2. Open your bot's General tab.
  3. Select the provider in the Memory Provider field.
  4. Click Save.

Without a memory provider, the bot will not have an active memory backend configuration.


Concept: Memory Retrieval

Memories are stored and retrieved through the assigned memory provider. Depending on the provider type and mode, retrieval may use file-based indexing, sparse vectors, dense embeddings, or an external API. When a user sends a message, Memoh finds the most relevant memories and includes them in the bot's runtime context.

This page is about long-term memory. It is separate from session context compaction, which reduces the prompt footprint of a single conversation session. See Context Compaction.


Operations

Manage your bot's memories from the Memory tab in the Bot Detail page.

1. Creating Memories

  • New Memory: Manually enter a memory's content in the provided textarea.
  • From Conversation: Select specific messages from the bot's conversation history to extract into memory.

2. Searching and Managing

  • Search: Filter memories by ID or text content.
  • Edit: Modify existing memory entries directly in the list.
  • Delete: Remove memories that are no longer needed.

Memory Compaction

Over time, long-term memories can accumulate and become redundant. The Compact action in the Memory tab rewrites the stored memory set itself.

This operation is provider-level memory maintenance. It is useful when you want to:

  • merge overlapping memories
  • remove stale or low-value entries
  • improve retrieval quality by reducing noise

Parameters:

  • Ratio — Compression ratio such as 0.8, 0.5, or 0.3. Lower values make compaction more aggressive.
  • Decay Days — Optionally restrict compaction to older memories only.

This is different from Context Compaction, which compresses the active prompt for one session rather than rewriting stored memories.


Rebuild

The Rebuild feature re-indexes all memories from scratch. This is useful when:

  • You have changed the memory provider's mode (e.g., switching from off to sparse).
  • The vector index has become inconsistent.
  • You want to re-process all memories with updated settings.

Click Rebuild in the Memory tab to start the process. You can monitor the rebuild status in real-time.


Status

The Memory tab shows the current status of the memory provider for this bot:

  • Connected — The memory backend is reachable and operational.
  • Error — There is an issue with the memory provider configuration or connectivity.

Use the status indicator to quickly verify that the memory system is working before troubleshooting other issues.


Usage Statistics

The Memory tab displays storage usage information:

  • Total Memories — The number of memory entries stored for this bot.
  • Index Status — Whether the vector index is up-to-date.

Memory vs Session Context

Memoh has two different "compaction" concepts:

ConceptScopeWhere to trigger itWhat it changes
Memory CompactionLong-term memory providerMemory tabRewrites stored memory entries
Context CompactionOne conversation sessionSession status panel or /compactSummarizes older session context for future model calls

If you are trying to reduce retrieval noise across many conversations, use Memory Compaction.

If you are trying to shorten the currently active conversation history, use Context Compaction.


Bot Interaction

  • The bot automatically searches and retrieves memories during chat.
  • The assigned Memory Provider controls the memory backend used by the bot.
  • Provider-specific settings (such as memory mode, embedding model, or API keys) are configured in the provider itself — see Memory Providers.
  • Memories provide the long-term knowledge that makes each bot unique to its owner.
',48)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; +import{_ as t,o,c as r,ag as a}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1776332711000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('

Bot Memory Management

Memoh's structured long-term memory system allows bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.

Prerequisites

Before using the Memory tab, make sure your bot already has a Memory Provider configured.

  1. Create a provider from one of the Memory Providers (Built-in, Mem0, or OpenViking).
  2. Open your bot's General tab.
  3. Select the provider in the Memory Provider field.
  4. Click Save.

Without a memory provider, the bot will not have an active memory backend configuration.


Concept: Memory Retrieval

Memories are stored and retrieved through the assigned memory provider. Depending on the provider type and mode, retrieval may use file-based indexing, sparse vectors, dense embeddings, or an external API. When a user sends a message, Memoh finds the most relevant memories and includes them in the bot's runtime context.

This page is about long-term memory. It is separate from session context compaction, which reduces the prompt footprint of a single conversation session. See Context Compaction.


Operations

Manage your bot's memories from the Memory tab in the Bot Detail page.

1. Creating Memories

  • New Memory: Manually enter a memory's content in the provided textarea.
  • From Conversation: Select specific messages from the bot's conversation history to extract into memory.

2. Searching and Managing

  • Search: Filter memories by ID or text content.
  • Edit: Modify existing memory entries directly in the list.
  • Delete: Remove memories that are no longer needed.

Memory Compaction

Over time, long-term memories can accumulate and become redundant. The Compact action in the Memory tab rewrites the stored memory set itself.

This operation is provider-level memory maintenance. It is useful when you want to:

  • merge overlapping memories
  • remove stale or low-value entries
  • improve retrieval quality by reducing noise

Parameters:

  • Ratio — Compression ratio such as 0.8, 0.5, or 0.3. Lower values make compaction more aggressive.
  • Decay Days — Optionally restrict compaction to older memories only.

This is different from Context Compaction, which compresses the active prompt for one session rather than rewriting stored memories.


Rebuild

The Rebuild feature re-indexes all memories from scratch. This is useful when:

  • You have changed the memory provider's mode (e.g., switching from off to sparse).
  • The vector index has become inconsistent.
  • You want to re-process all memories with updated settings.

Click Rebuild in the Memory tab to start the process. You can monitor the rebuild status in real-time.


Status

The Memory tab shows the current status of the memory provider for this bot:

  • Connected — The memory backend is reachable and operational.
  • Error — There is an issue with the memory provider configuration or connectivity.

Use the status indicator to quickly verify that the memory system is working before troubleshooting other issues.


Usage Statistics

The Memory tab displays storage usage information:

  • Total Memories — The number of memory entries stored for this bot.
  • Index Status — Whether the vector index is up-to-date.

Memory vs Session Context

Memoh has two different "compaction" concepts:

ConceptScopeWhere to trigger itWhat it changes
Memory CompactionLong-term memory providerMemory tabRewrites stored memory entries
Context CompactionOne conversation sessionSession status panel or /compactSummarizes older session context for future model calls

If you are trying to reduce retrieval noise across many conversations, use Memory Compaction.

If you are trying to shorten the currently active conversation history, use Context Compaction.


Bot Interaction

  • The bot automatically searches and retrieves memories during chat.
  • The assigned Memory Provider controls the memory backend used by the bot.
  • Provider-specific settings (such as memory mode, embedding model, or API keys) are configured in the provider itself — see Memory Providers.
  • Memories provide the long-term knowledge that makes each bot unique to its owner.
',48)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; diff --git a/assets/getting-started_memory.md.WVVdvmGu.lean.js b/assets/getting-started_memory.md.5cl77orc.lean.js similarity index 86% rename from assets/getting-started_memory.md.WVVdvmGu.lean.js rename to assets/getting-started_memory.md.5cl77orc.lean.js index 1e08c326..b37dd2fe 100644 --- a/assets/getting-started_memory.md.WVVdvmGu.lean.js +++ b/assets/getting-started_memory.md.5cl77orc.lean.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1776332711000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",48)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; +import{_ as t,o,c as r,ag as a}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1776332711000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",48)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; diff --git a/assets/getting-started_provider-and-model.md.CLGduNUC.js b/assets/getting-started_provider-and-model.md.ee3Zv59w.js similarity index 99% rename from assets/getting-started_provider-and-model.md.CLGduNUC.js rename to assets/getting-started_provider-and-model.md.ee3Zv59w.js index 8c11e0b5..23ff5acf 100644 --- a/assets/getting-started_provider-and-model.md.CLGduNUC.js +++ b/assets/getting-started_provider-and-model.md.ee3Zv59w.js @@ -1 +1 @@ -import{_ as t,o,c as d,ag as a}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Providers And Models","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1776332711000}'),i={name:"getting-started/provider-and-model.md"};function r(s,e,n,l,c,h){return o(),d("div",null,[...e[0]||(e[0]=[a('

Providers And Models

To use Memoh effectively, you usually configure:

  • one or more providers that define how Memoh talks to upstream APIs
  • one or more models under those providers
  • optional speech providers if you want text-to-speech

The Web UI manages chat and embedding providers/models from the Models page. Speech models are managed separately from TTS Providers.


Provider Basics

A provider stores connection information for one upstream service, such as:

  • the API protocol (client_type)
  • the base URL if the protocol needs one
  • credentials such as an API key or OAuth token

Typical examples include OpenAI-compatible endpoints, Anthropic, Google Gemini, OpenAI Codex, and GitHub Copilot.

Creating A Provider

  1. Open the Models page from the settings sidebar.
  2. Click Add Provider.
  3. Fill in the provider form.
  4. Save the provider.

Common fields:

FieldDescription
NameFriendly display name, such as OpenAI or Copilot.
Client TypeAPI protocol used by this provider.
Base URLRoot API endpoint, when required by the selected client type.
API KeyToken-based authentication, when the client type uses direct credentials.

Client Types

Memoh currently supports these client types:

Client TypeTypical Use
openai-responsesOpenAI Responses API style providers
openai-completionsOpenAI Chat Completions compatible providers
anthropic-messagesAnthropic Messages API
google-generative-aiGoogle Gemini API
openai-codexOpenAI Codex / ChatGPT-backed coding workflow with OAuth
github-copilotGitHub Copilot with device OAuth
edge-speechSpeech-only provider type for Microsoft Edge Read Aloud

edge-speech is for speech synthesis, not for chat. Configure it through TTS Providers, not as your main chat provider.


OAuth-Based Providers

Most provider types use a normal API key. Two notable exceptions are openai-codex and github-copilot.

OpenAI Codex

  • Uses the openai-codex client type
  • Authenticates through the provider form's OAuth flow instead of a normal API key workflow
  • The bundled preset points at https://chatgpt.com/backend-api

This is a good fit when you want Codex-style model access for coding-oriented workflows.

GitHub Copilot

  • Uses the github-copilot client type
  • Uses device authorization
  • The provider form shows a verification URL and a user code while authorization is pending
  • After authorization completes, the provider stores the linked GitHub account token

GitHub Copilot is especially useful if you already have access to Copilot-backed chat and embedding models and want to reuse that access from Memoh.


Importing Models

After creating a provider, you can import or add models under it.

Typical flow:

  1. Select the provider.
  2. Click Import Models if the provider can expose a model catalog.
  3. Choose the models you want to save into Memoh.

You can also add models manually when you already know the upstream model ID.


Model Types

Memoh distinguishes three model types:

TypePurpose
chatMain LLMs for conversation, tool use, reasoning, and image generation
embeddingVector models for memory and retrieval
speechText-to-speech models used by TTS providers

Important distinction:

  • The Models page is primarily where you manage chat and embedding models.
  • speech models are exposed through TTS Providers.

Chat Model Configuration

When adding a chat model, the most important fields are:

FieldDescription
Model IDExact upstream identifier, such as gpt-4o or claude-sonnet-4.6.
NameFriendly display name shown in the UI.
CompatibilitiesFeature flags such as vision, tool-call, image-output, and reasoning.
Context WindowApproximate maximum context budget for the model.

Compatibilities

Memoh uses compatibility flags to decide which features a model can safely power:

CompatibilityMeaning
visionModel can accept images as input
tool-callModel can call tools
image-outputModel can generate images
reasoningModel exposes explicit reasoning modes / effort levels

If a model supports reasoning, it may also declare reasoning_efforts such as none, low, medium, high, or xhigh.

context_window

context_window is important because Memoh uses it to:

  • calculate session context usage in the Web UI
  • power /status output
  • decide when a session is approaching its prompt limit
  • guide Context Compaction

If you leave context_window empty, the model can still be used, but Memoh cannot show an exact usage percentage for that model.

Image Generation Models

Memoh now lets you assign an Image Generation Model to a bot. This model must be a chat model whose compatibilities include image-output.

That keeps image generation separate from your default chat model when needed.


Embedding Models

Embedding models are used for semantic indexing and retrieval.

The required field is:

FieldDescription
DimensionsVector size for the embedding output, such as 1536.

Use embedding models with memory providers or any feature that relies on vector search.


Speech Models

Speech models are managed from TTS Providers, not from the standard chat provider flow.

Current built-in example:

  • Edge TTS via edge-speech

This separation matters because speech models have voice, format, speed, and pitch settings that do not apply to chat or embedding models.


For most bots, think in terms of three parallel model roles:

  • Chat model for normal conversations
  • Embedding model for memory search
  • Speech / image models for side capabilities such as TTS and image generation

You do not need to force one model to do everything.


Next Steps

  • To assign chat, image, browser, memory, and TTS settings to a bot, see Bot Management.
  • To configure speech providers and speech models, see TTS Providers.
',73)])])}const u=t(i,[["render",r]]);export{m as __pageData,u as default}; +import{_ as t,o,c as d,ag as a}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"Providers And Models","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1776332711000}'),i={name:"getting-started/provider-and-model.md"};function r(s,e,n,l,c,h){return o(),d("div",null,[...e[0]||(e[0]=[a('

Providers And Models

To use Memoh effectively, you usually configure:

  • one or more providers that define how Memoh talks to upstream APIs
  • one or more models under those providers
  • optional speech providers if you want text-to-speech

The Web UI manages chat and embedding providers/models from the Models page. Speech models are managed separately from TTS Providers.


Provider Basics

A provider stores connection information for one upstream service, such as:

  • the API protocol (client_type)
  • the base URL if the protocol needs one
  • credentials such as an API key or OAuth token

Typical examples include OpenAI-compatible endpoints, Anthropic, Google Gemini, OpenAI Codex, and GitHub Copilot.

Creating A Provider

  1. Open the Models page from the settings sidebar.
  2. Click Add Provider.
  3. Fill in the provider form.
  4. Save the provider.

Common fields:

FieldDescription
NameFriendly display name, such as OpenAI or Copilot.
Client TypeAPI protocol used by this provider.
Base URLRoot API endpoint, when required by the selected client type.
API KeyToken-based authentication, when the client type uses direct credentials.

Client Types

Memoh currently supports these client types:

Client TypeTypical Use
openai-responsesOpenAI Responses API style providers
openai-completionsOpenAI Chat Completions compatible providers
anthropic-messagesAnthropic Messages API
google-generative-aiGoogle Gemini API
openai-codexOpenAI Codex / ChatGPT-backed coding workflow with OAuth
github-copilotGitHub Copilot with device OAuth
edge-speechSpeech-only provider type for Microsoft Edge Read Aloud

edge-speech is for speech synthesis, not for chat. Configure it through TTS Providers, not as your main chat provider.


OAuth-Based Providers

Most provider types use a normal API key. Two notable exceptions are openai-codex and github-copilot.

OpenAI Codex

  • Uses the openai-codex client type
  • Authenticates through the provider form's OAuth flow instead of a normal API key workflow
  • The bundled preset points at https://chatgpt.com/backend-api

This is a good fit when you want Codex-style model access for coding-oriented workflows.

GitHub Copilot

  • Uses the github-copilot client type
  • Uses device authorization
  • The provider form shows a verification URL and a user code while authorization is pending
  • After authorization completes, the provider stores the linked GitHub account token

GitHub Copilot is especially useful if you already have access to Copilot-backed chat and embedding models and want to reuse that access from Memoh.


Importing Models

After creating a provider, you can import or add models under it.

Typical flow:

  1. Select the provider.
  2. Click Import Models if the provider can expose a model catalog.
  3. Choose the models you want to save into Memoh.

You can also add models manually when you already know the upstream model ID.


Model Types

Memoh distinguishes three model types:

TypePurpose
chatMain LLMs for conversation, tool use, reasoning, and image generation
embeddingVector models for memory and retrieval
speechText-to-speech models used by TTS providers

Important distinction:

  • The Models page is primarily where you manage chat and embedding models.
  • speech models are exposed through TTS Providers.

Chat Model Configuration

When adding a chat model, the most important fields are:

FieldDescription
Model IDExact upstream identifier, such as gpt-4o or claude-sonnet-4.6.
NameFriendly display name shown in the UI.
CompatibilitiesFeature flags such as vision, tool-call, image-output, and reasoning.
Context WindowApproximate maximum context budget for the model.

Compatibilities

Memoh uses compatibility flags to decide which features a model can safely power:

CompatibilityMeaning
visionModel can accept images as input
tool-callModel can call tools
image-outputModel can generate images
reasoningModel exposes explicit reasoning modes / effort levels

If a model supports reasoning, it may also declare reasoning_efforts such as none, low, medium, high, or xhigh.

context_window

context_window is important because Memoh uses it to:

  • calculate session context usage in the Web UI
  • power /status output
  • decide when a session is approaching its prompt limit
  • guide Context Compaction

If you leave context_window empty, the model can still be used, but Memoh cannot show an exact usage percentage for that model.

Image Generation Models

Memoh now lets you assign an Image Generation Model to a bot. This model must be a chat model whose compatibilities include image-output.

That keeps image generation separate from your default chat model when needed.


Embedding Models

Embedding models are used for semantic indexing and retrieval.

The required field is:

FieldDescription
DimensionsVector size for the embedding output, such as 1536.

Use embedding models with memory providers or any feature that relies on vector search.


Speech Models

Speech models are managed from TTS Providers, not from the standard chat provider flow.

Current built-in example:

  • Edge TTS via edge-speech

This separation matters because speech models have voice, format, speed, and pitch settings that do not apply to chat or embedding models.


For most bots, think in terms of three parallel model roles:

  • Chat model for normal conversations
  • Embedding model for memory search
  • Speech / image models for side capabilities such as TTS and image generation

You do not need to force one model to do everything.


Next Steps

  • To assign chat, image, browser, memory, and TTS settings to a bot, see Bot Management.
  • To configure speech providers and speech models, see TTS Providers.
',73)])])}const u=t(i,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/getting-started_provider-and-model.md.CLGduNUC.lean.js b/assets/getting-started_provider-and-model.md.ee3Zv59w.lean.js similarity index 87% rename from assets/getting-started_provider-and-model.md.CLGduNUC.lean.js rename to assets/getting-started_provider-and-model.md.ee3Zv59w.lean.js index ed4a3808..f5c17879 100644 --- a/assets/getting-started_provider-and-model.md.CLGduNUC.lean.js +++ b/assets/getting-started_provider-and-model.md.ee3Zv59w.lean.js @@ -1 +1 @@ -import{_ as t,o,c as d,ag as a}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Providers And Models","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1776332711000}'),i={name:"getting-started/provider-and-model.md"};function r(s,e,n,l,c,h){return o(),d("div",null,[...e[0]||(e[0]=[a("",73)])])}const u=t(i,[["render",r]]);export{m as __pageData,u as default}; +import{_ as t,o,c as d,ag as a}from"./chunks/framework.CAXxHpAX.js";const m=JSON.parse('{"title":"Providers And Models","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1776332711000}'),i={name:"getting-started/provider-and-model.md"};function r(s,e,n,l,c,h){return o(),d("div",null,[...e[0]||(e[0]=[a("",73)])])}const u=t(i,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/getting-started_schedule.md.7R1TStAB.js b/assets/getting-started_schedule.md.BgiO7WiT.js similarity index 98% rename from assets/getting-started_schedule.md.7R1TStAB.js rename to assets/getting-started_schedule.md.BgiO7WiT.js index 2bc0c0e5..4bb2ffa9 100644 --- a/assets/getting-started_schedule.md.7R1TStAB.js +++ b/assets/getting-started_schedule.md.BgiO7WiT.js @@ -1,4 +1,4 @@ -import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1774459922000}'),i={name:"getting-started/schedule.md"};function o(r,e,d,l,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n(`

Scheduled Tasks

Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.

Concept: Cron-Based Automation

A Schedule is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.


Schedule Fields

FieldDescription
NameA display name for the task (e.g., "Morning News Summary").
DescriptionA brief explanation of what the task does.
PatternA cron expression that defines when the task runs (e.g., 0 9 * * * for daily at 9:00 AM).
CommandThe natural-language instruction sent to the agent when the schedule triggers (e.g., "Summarize today's top tech news and send it to the Telegram channel").
EnabledWhether the schedule is currently active.
Max CallsOptional limit on the total number of executions. Leave empty for unlimited.
Current CallsThe number of times this schedule has already fired.

Cron Pattern Reference

The pattern field uses standard cron syntax with five fields. It is evaluated in the server's configured timezone. By default, Memoh uses UTC, and you can change it with the top-level timezone config value.

┌───────────── minute (0–59)
+import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1774459922000}'),i={name:"getting-started/schedule.md"};function o(r,e,d,l,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n(`

Scheduled Tasks

Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.

Concept: Cron-Based Automation

A Schedule is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.


Schedule Fields

FieldDescription
NameA display name for the task (e.g., "Morning News Summary").
DescriptionA brief explanation of what the task does.
PatternA cron expression that defines when the task runs (e.g., 0 9 * * * for daily at 9:00 AM).
CommandThe natural-language instruction sent to the agent when the schedule triggers (e.g., "Summarize today's top tech news and send it to the Telegram channel").
EnabledWhether the schedule is currently active.
Max CallsOptional limit on the total number of executions. Leave empty for unlimited.
Current CallsThe number of times this schedule has already fired.

Cron Pattern Reference

The pattern field uses standard cron syntax with five fields. It is evaluated in the server's configured timezone. By default, Memoh uses UTC, and you can change it with the top-level timezone config value.

┌───────────── minute (0–59)
 │ ┌───────────── hour (0–23)
 │ │ ┌───────────── day of month (1–31)
 │ │ │ ┌───────────── month (1–12)
diff --git a/assets/getting-started_schedule.md.7R1TStAB.lean.js b/assets/getting-started_schedule.md.BgiO7WiT.lean.js
similarity index 72%
rename from assets/getting-started_schedule.md.7R1TStAB.lean.js
rename to assets/getting-started_schedule.md.BgiO7WiT.lean.js
index 308919fb..657a3668 100644
--- a/assets/getting-started_schedule.md.7R1TStAB.lean.js
+++ b/assets/getting-started_schedule.md.BgiO7WiT.lean.js
@@ -1 +1 @@
-import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1774459922000}'),i={name:"getting-started/schedule.md"};function o(r,e,d,l,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n("",35)])])}const g=t(i,[["render",o]]);export{p as __pageData,g as default};
+import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1774459922000}'),i={name:"getting-started/schedule.md"};function o(r,e,d,l,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n("",35)])])}const g=t(i,[["render",o]]);export{p as __pageData,g as default};
diff --git a/assets/getting-started_search-provider.md.DDV1py8V.js b/assets/getting-started_search-provider.md.C6dGU9hk.js
similarity index 97%
rename from assets/getting-started_search-provider.md.DDV1py8V.js
rename to assets/getting-started_search-provider.md.C6dGU9hk.js
index d5865245..9e614e47 100644
--- a/assets/getting-started_search-provider.md.DDV1py8V.js
+++ b/assets/getting-started_search-provider.md.C6dGU9hk.js
@@ -1 +1 @@
-import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1774787421000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a('

Search Providers

Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.

Concept: Real-Time Knowledge

A Search Provider is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.


Supported Search Engines

Configure your search engines from the Search Provider page in the sidebar.

Supported EnginesNotes
BraveHighly recommended for privacy and performance.
BingPowerful global search capability.
GoogleComprehensive web search.
TavilyDesigned specifically for AI-powered research.
SearxNGConnect to your own self-hosted search aggregator.
DuckDuckGoPrivacy-focused search.
Other ProvidersSogou, Serper, Jina, Exa, Bocha, Yandex.

Configuration Flow

1. Adding a Search Provider

  1. Navigate to the Search Provider page from the sidebar.
  2. Click Add Search Provider.
  3. Fill in the following:
    • Name: A friendly name (e.g., "My Brave Search").
    • API Key: Your credentials for the specific search engine API.
    • Other Parameters: Depending on the engine, you may need to specify additional settings (e.g., base_url for SearxNG).

2. Managing Providers

  • Edit: Select a provider from the sidebar and update its configuration in the form on the right.
  • Delete: Use the Delete Provider button in the provider settings form.

Assigning a Search Provider to a Bot

  1. Navigate to the Bots page and select your bot.
  2. Go to the General tab.
  3. Find the Search Provider dropdown and select the provider you created.
  4. Click Save.

Bot Interaction

  • When a user's question requires real-time information, the bot will automatically call its assigned Search Provider.
  • The bot will process the search results to provide a grounded and accurate response.
  • Multiple search results can be synthesized to provide a comprehensive answer.
',20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1774787421000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a('

Search Providers

Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.

Concept: Real-Time Knowledge

A Search Provider is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.


Supported Search Engines

Configure your search engines from the Search Provider page in the sidebar.

Supported EnginesNotes
BraveHighly recommended for privacy and performance.
BingPowerful global search capability.
GoogleComprehensive web search.
TavilyDesigned specifically for AI-powered research.
SearxNGConnect to your own self-hosted search aggregator.
DuckDuckGoPrivacy-focused search.
Other ProvidersSogou, Serper, Jina, Exa, Bocha, Yandex.

Configuration Flow

1. Adding a Search Provider

  1. Navigate to the Search Provider page from the sidebar.
  2. Click Add Search Provider.
  3. Fill in the following:
    • Name: A friendly name (e.g., "My Brave Search").
    • API Key: Your credentials for the specific search engine API.
    • Other Parameters: Depending on the engine, you may need to specify additional settings (e.g., base_url for SearxNG).

2. Managing Providers

  • Edit: Select a provider from the sidebar and update its configuration in the form on the right.
  • Delete: Use the Delete Provider button in the provider settings form.

Assigning a Search Provider to a Bot

  1. Navigate to the Bots page and select your bot.
  2. Go to the General tab.
  3. Find the Search Provider dropdown and select the provider you created.
  4. Click Save.

Bot Interaction

  • When a user's question requires real-time information, the bot will automatically call its assigned Search Provider.
  • The bot will process the search results to provide a grounded and accurate response.
  • Multiple search results can be synthesized to provide a comprehensive answer.
',20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/getting-started_search-provider.md.DDV1py8V.lean.js b/assets/getting-started_search-provider.md.C6dGU9hk.lean.js similarity index 73% rename from assets/getting-started_search-provider.md.DDV1py8V.lean.js rename to assets/getting-started_search-provider.md.C6dGU9hk.lean.js index 22870fba..39c2bc96 100644 --- a/assets/getting-started_search-provider.md.DDV1py8V.lean.js +++ b/assets/getting-started_search-provider.md.C6dGU9hk.lean.js @@ -1 +1 @@ -import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1774787421000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a("",20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1774787421000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a("",20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/getting-started_sessions.md.BGHqYtAd.js b/assets/getting-started_sessions.md.MU-Cy0GW.js similarity index 98% rename from assets/getting-started_sessions.md.BGHqYtAd.js rename to assets/getting-started_sessions.md.MU-Cy0GW.js index 42a6b7af..282dd68a 100644 --- a/assets/getting-started_sessions.md.BGHqYtAd.js +++ b/assets/getting-started_sessions.md.MU-Cy0GW.js @@ -1 +1 @@ -import{_ as s,o as t,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1776332711000}'),a={name:"getting-started/sessions.md"};function i(r,e,l,c,h,d){return t(),o("div",null,[...e[0]||(e[0]=[n('

Sessions

A Session is an independent conversation thread between a user and a bot. Each session maintains its own context window and message history, allowing the bot to focus on a specific topic or task without interference from other conversations.


Concept: Conversation Isolation

When you chat with a bot, your messages are grouped into a session. The bot uses the session's history to maintain context. Starting a new session resets this context, giving you a fresh conversation without losing the previous one.

Sessions are scoped per bot — each bot manages its own set of sessions independently.


Session Types

Memoh uses five session types to separate different kinds of bot activity:

TypeDescription
ChatStandard user-initiated conversations. This is the default session type when chatting with a bot.
DiscussObservation-oriented conversation mode. The bot may stay silent by default and only speaks when it decides to send a real reply into the conversation.
HeartbeatAutomatically created when a bot's heartbeat triggers. Contains the bot's periodic autonomous activity.
ScheduleCreated when a scheduled task fires. Contains the bot's execution of a cron-triggered command.
SubagentCreated when the bot delegates a task to a subagent. Contains the subagent's independent work context.

Only Chat and Discuss sessions are directly created from user conversation routes. The other session types are system-managed and appear as read-only records in the session list.

Chat vs Discuss

chat and discuss are the two session types you are most likely to see in normal conversation threads.

Chat means:

  • the conversation behaves like a normal direct assistant exchange
  • users expect a visible reply when they send a prompt
  • this is the default in the Web UI and in direct-message style conversations

Discuss means:

  • the bot is observing an ongoing conversation, often in a group
  • the model's direct text output is treated as internal monologue
  • the bot only speaks to the conversation when it explicitly issues a send action
  • staying silent is valid and often desirable

In practice, discuss is what makes Memoh feel less like a synchronous chatbot and more like a participant that can decide whether to join in.


Starting a New Session with /new

The /new slash command creates a fresh session on the current conversation route, resetting the active session context without deleting old history.

Supported forms:

  • /new — create a new session using the default session type for the current context
  • /new chat — force a normal chat session
  • /new discuss — force a discuss session

Default routing behavior:

  • Web UI local chat defaults to chat
  • private conversations default to chat
  • group conversations on channel adapters default to discuss

/new discuss is not supported from the built-in Web UI local channel. Use a real channel adapter such as Telegram, Discord, or Misskey if you want to explicitly create discuss sessions.

This works across supported channels:

In External Channels (Telegram, Discord, Feishu, etc.)

Send /new, /new chat, or /new discuss as a message to the bot. The bot will:

  1. Create a new session of the requested or inferred type.
  2. Route all subsequent messages from you to this new session.
  3. The previous session's history is preserved but no longer active.

This is especially useful when:

  • You want to change topics without the bot referencing old context.
  • The conversation has become too long and you want a clean start.
  • You are switching between different tasks.

In the Web UI

The Web UI provides a session sidebar where you can:

  • Click the New Session button to create a fresh chat session.
  • Switch between existing sessions by clicking on them.
  • Search sessions by content.
  • Filter sessions by type (chat, discuss, heartbeat, schedule, subagent).
  • Rename or delete sessions.

Managing Sessions

Viewing Sessions

In the Web UI, the session sidebar lists all sessions for the currently selected bot. Each entry shows:

  • Title — The session name (auto-generated or user-defined).
  • Type — The session type icon.
  • Last Activity — When the session was last active.

For everyday chat use, chat and discuss sessions are intentionally shown together because they both represent user-facing conversation threads.

Renaming Sessions

Click on a session title to rename it. This helps organize conversations by topic.

Deleting Sessions

Remove sessions you no longer need. Deleting a session removes its message history permanently.


Session Status Panel

The session status panel provides a compact runtime summary for the active session. It is the same information surfaced by /status.

Key fields include:

  • Messages — total message count in the session
  • Context Usage — current used tokens relative to the selected model's context_window
  • Cache Hit Rate — how much of the input came from cache reads
  • Cache Read / Cache Write — token counts associated with caching
  • Skills — effective skills used by the session

The panel also exposes Compact Now, which triggers immediate Context Compaction for the current session.


How Sessions Relate to Other Features

  • Discuss sessions are optimized for channels where the bot should observe and selectively speak, especially in group conversations.
  • Heartbeat sessions are created on each heartbeat trigger. You can view what the bot did during its autonomous activity by opening the corresponding heartbeat session.
  • Schedule sessions are created when a scheduled task runs. Check these to see the results of cron-triggered commands.
  • Subagent sessions track delegated tasks. They show the independent work context of each subagent invocation.
  • Memory is shared across all sessions for a bot — memories extracted from one session are available in all others.
',54)])])}const p=s(a,[["render",i]]);export{g as __pageData,p as default}; +import{_ as s,o as t,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1776332711000}'),a={name:"getting-started/sessions.md"};function i(r,e,l,c,h,d){return t(),o("div",null,[...e[0]||(e[0]=[n('

Sessions

A Session is an independent conversation thread between a user and a bot. Each session maintains its own context window and message history, allowing the bot to focus on a specific topic or task without interference from other conversations.


Concept: Conversation Isolation

When you chat with a bot, your messages are grouped into a session. The bot uses the session's history to maintain context. Starting a new session resets this context, giving you a fresh conversation without losing the previous one.

Sessions are scoped per bot — each bot manages its own set of sessions independently.


Session Types

Memoh uses five session types to separate different kinds of bot activity:

TypeDescription
ChatStandard user-initiated conversations. This is the default session type when chatting with a bot.
DiscussObservation-oriented conversation mode. The bot may stay silent by default and only speaks when it decides to send a real reply into the conversation.
HeartbeatAutomatically created when a bot's heartbeat triggers. Contains the bot's periodic autonomous activity.
ScheduleCreated when a scheduled task fires. Contains the bot's execution of a cron-triggered command.
SubagentCreated when the bot delegates a task to a subagent. Contains the subagent's independent work context.

Only Chat and Discuss sessions are directly created from user conversation routes. The other session types are system-managed and appear as read-only records in the session list.

Chat vs Discuss

chat and discuss are the two session types you are most likely to see in normal conversation threads.

Chat means:

  • the conversation behaves like a normal direct assistant exchange
  • users expect a visible reply when they send a prompt
  • this is the default in the Web UI and in direct-message style conversations

Discuss means:

  • the bot is observing an ongoing conversation, often in a group
  • the model's direct text output is treated as internal monologue
  • the bot only speaks to the conversation when it explicitly issues a send action
  • staying silent is valid and often desirable

In practice, discuss is what makes Memoh feel less like a synchronous chatbot and more like a participant that can decide whether to join in.


Starting a New Session with /new

The /new slash command creates a fresh session on the current conversation route, resetting the active session context without deleting old history.

Supported forms:

  • /new — create a new session using the default session type for the current context
  • /new chat — force a normal chat session
  • /new discuss — force a discuss session

Default routing behavior:

  • Web UI local chat defaults to chat
  • private conversations default to chat
  • group conversations on channel adapters default to discuss

/new discuss is not supported from the built-in Web UI local channel. Use a real channel adapter such as Telegram, Discord, or Misskey if you want to explicitly create discuss sessions.

This works across supported channels:

In External Channels (Telegram, Discord, Feishu, etc.)

Send /new, /new chat, or /new discuss as a message to the bot. The bot will:

  1. Create a new session of the requested or inferred type.
  2. Route all subsequent messages from you to this new session.
  3. The previous session's history is preserved but no longer active.

This is especially useful when:

  • You want to change topics without the bot referencing old context.
  • The conversation has become too long and you want a clean start.
  • You are switching between different tasks.

In the Web UI

The Web UI provides a session sidebar where you can:

  • Click the New Session button to create a fresh chat session.
  • Switch between existing sessions by clicking on them.
  • Search sessions by content.
  • Filter sessions by type (chat, discuss, heartbeat, schedule, subagent).
  • Rename or delete sessions.

Managing Sessions

Viewing Sessions

In the Web UI, the session sidebar lists all sessions for the currently selected bot. Each entry shows:

  • Title — The session name (auto-generated or user-defined).
  • Type — The session type icon.
  • Last Activity — When the session was last active.

For everyday chat use, chat and discuss sessions are intentionally shown together because they both represent user-facing conversation threads.

Renaming Sessions

Click on a session title to rename it. This helps organize conversations by topic.

Deleting Sessions

Remove sessions you no longer need. Deleting a session removes its message history permanently.


Session Status Panel

The session status panel provides a compact runtime summary for the active session. It is the same information surfaced by /status.

Key fields include:

  • Messages — total message count in the session
  • Context Usage — current used tokens relative to the selected model's context_window
  • Cache Hit Rate — how much of the input came from cache reads
  • Cache Read / Cache Write — token counts associated with caching
  • Skills — effective skills used by the session

The panel also exposes Compact Now, which triggers immediate Context Compaction for the current session.


How Sessions Relate to Other Features

  • Discuss sessions are optimized for channels where the bot should observe and selectively speak, especially in group conversations.
  • Heartbeat sessions are created on each heartbeat trigger. You can view what the bot did during its autonomous activity by opening the corresponding heartbeat session.
  • Schedule sessions are created when a scheduled task runs. Check these to see the results of cron-triggered commands.
  • Subagent sessions track delegated tasks. They show the independent work context of each subagent invocation.
  • Memory is shared across all sessions for a bot — memories extracted from one session are available in all others.
',54)])])}const p=s(a,[["render",i]]);export{g as __pageData,p as default}; diff --git a/assets/getting-started_sessions.md.BGHqYtAd.lean.js b/assets/getting-started_sessions.md.MU-Cy0GW.lean.js similarity index 72% rename from assets/getting-started_sessions.md.BGHqYtAd.lean.js rename to assets/getting-started_sessions.md.MU-Cy0GW.lean.js index a3c34476..5f4841f1 100644 --- a/assets/getting-started_sessions.md.BGHqYtAd.lean.js +++ b/assets/getting-started_sessions.md.MU-Cy0GW.lean.js @@ -1 +1 @@ -import{_ as s,o as t,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1776332711000}'),a={name:"getting-started/sessions.md"};function i(r,e,l,c,h,d){return t(),o("div",null,[...e[0]||(e[0]=[n("",54)])])}const p=s(a,[["render",i]]);export{g as __pageData,p as default}; +import{_ as s,o as t,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1776332711000}'),a={name:"getting-started/sessions.md"};function i(r,e,l,c,h,d){return t(),o("div",null,[...e[0]||(e[0]=[n("",54)])])}const p=s(a,[["render",i]]);export{g as __pageData,p as default}; diff --git a/assets/getting-started_skills.md.CcJKfEue.js b/assets/getting-started_skills.md.DTJvqMSO.js similarity index 98% rename from assets/getting-started_skills.md.CcJKfEue.js rename to assets/getting-started_skills.md.DTJvqMSO.js index a782b0a1..fb84ba4b 100644 --- a/assets/getting-started_skills.md.CcJKfEue.js +++ b/assets/getting-started_skills.md.DTJvqMSO.js @@ -1,4 +1,4 @@ -import{_ as t,o as a,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const k=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1776332711000}'),s={name:"getting-started/skills.md"};function o(r,e,n,d,h,c){return a(),l("div",null,[...e[0]||(e[0]=[i(`

Bot Skills

Skills are reusable prompt modules that extend a bot's behavior, style, and tool-usage guidance. You manage them from the bot's Skills tab, and you can either write them yourself or install them from Supermarket.


What A Skill Looks Like

A skill is a Markdown file named SKILL.md with YAML frontmatter. At minimum, give it a stable name and a short description.

yaml
---
+import{_ as t,o as a,c as l,ag as i}from"./chunks/framework.CAXxHpAX.js";const k=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1776332711000}'),s={name:"getting-started/skills.md"};function o(r,e,n,d,h,c){return a(),l("div",null,[...e[0]||(e[0]=[i(`

Bot Skills

Skills are reusable prompt modules that extend a bot's behavior, style, and tool-usage guidance. You manage them from the bot's Skills tab, and you can either write them yourself or install them from Supermarket.


What A Skill Looks Like

A skill is a Markdown file named SKILL.md with YAML frontmatter. At minimum, give it a stable name and a short description.

yaml
---
 name: coder-skill
 description: Enables advanced coding workflows and tool usage.
 ---
diff --git a/assets/getting-started_skills.md.CcJKfEue.lean.js b/assets/getting-started_skills.md.DTJvqMSO.lean.js
similarity index 71%
rename from assets/getting-started_skills.md.CcJKfEue.lean.js
rename to assets/getting-started_skills.md.DTJvqMSO.lean.js
index e915582c..2cfe7607 100644
--- a/assets/getting-started_skills.md.CcJKfEue.lean.js
+++ b/assets/getting-started_skills.md.DTJvqMSO.lean.js
@@ -1 +1 @@
-import{_ as t,o as a,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const k=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1776332711000}'),s={name:"getting-started/skills.md"};function o(r,e,n,d,h,c){return a(),l("div",null,[...e[0]||(e[0]=[i("",55)])])}const p=t(s,[["render",o]]);export{k as __pageData,p as default};
+import{_ as t,o as a,c as l,ag as i}from"./chunks/framework.CAXxHpAX.js";const k=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1776332711000}'),s={name:"getting-started/skills.md"};function o(r,e,n,d,h,c){return a(),l("div",null,[...e[0]||(e[0]=[i("",55)])])}const p=t(s,[["render",o]]);export{k as __pageData,p as default};
diff --git a/assets/getting-started_slash-commands.md.B9pb8gxb.js b/assets/getting-started_slash-commands.md.ChJs4d6R.js
similarity index 99%
rename from assets/getting-started_slash-commands.md.B9pb8gxb.js
rename to assets/getting-started_slash-commands.md.ChJs4d6R.js
index 1a291a90..f65a4708 100644
--- a/assets/getting-started_slash-commands.md.B9pb8gxb.js
+++ b/assets/getting-started_slash-commands.md.ChJs4d6R.js
@@ -1 +1 @@
-import{_ as e,o,c as d,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1776332711000}'),s={name:"getting-started/slash-commands.md"};function c(n,t,r,i,l,h){return o(),d("div",null,[...t[0]||(t[0]=[a('

Slash Commands

Memoh bots support slash commands that are intercepted before the LLM runs. They are intended for fast inspection and control tasks such as viewing settings, switching providers, checking session status, or creating a fresh session.

Slash commands work in channel adapters and in the built-in Web UI chat. They do not consume model tokens just to parse the command itself.


Command Model

Most commands follow a resource-group pattern:

text
/resource [action] [arguments...]

Examples:

text
/schedule list\n/model current\n/schedule create morning-news "0 9 * * *" "Send a daily summary"

Key ideas:

  • resource is the command group, such as schedule, model, or status.
  • action is the specific operation, such as list, get, set, or latest.
  • arguments are positional values after the action. Use quotes when a value contains spaces.
  • Some groups have a default action, so /settings is equivalent to /settings get, and /status is equivalent to /status show.

Two commands are top-level instead of resource groups:

  • /new — create a new session for the current conversation route
  • /stop — abort the currently running generation for the current conversation

Built-in Help

The slash system has layered help built into it:

CommandMeaning
/helpShow the top-level command list
/help <group>Show actions inside one group
/help <group> <action>Show detailed usage for one action

Examples:

text
/help\n/help model\n/help model set

This is the fastest way to discover the exact live command surface for your current Memoh version.


Parsing Rules

Slash commands support a few convenience forms:

  • Mention-prefixed commands work in group chats, for example @BotName /help.
  • Telegram bot suffixes are accepted, for example /help@MemohBot.
  • Quoted strings are preserved as one argument, for example:
text
/schedule create morning-news "0 9 * * *" "Send today's top stories"

If the text does not resolve to a known command, Memoh treats it as a normal chat message instead of a slash command.


Permissions

Read-only actions are available to users who can already chat with the bot. Write actions such as set, create, update, delete, enable, and disable are owner-only.

In /help output, owner-only actions are marked with [owner].


Quick Reference

Top-Level Commands

CommandDescription
/helpShow slash command help
`/new [chatdiscuss]`
/stopStop the current generation

Resource Groups

GroupDescriptionDefault Action
/scheduleManage scheduled tasksNone
/mcpInspect MCP connectionsNone
/settingsView and update bot settingsget
/modelView and switch bot modelsNone
/memoryView and switch memory providersNone
/searchView and switch search providersNone
/browserView and switch browser contextsNone
/usageView token usagesummary
/emailInspect email providers, bindings, and outboxNone
/heartbeatView recent heartbeat logslogs
/skillView loaded bot skillslist
/fsBrowse files inside the bot containerNone
/statusInspect session message/context/cache statusshow
/accessInspect identity, role, and ACL contextshow
/compactTrigger immediate session context compactionrun

Session Commands

/new

Creates a fresh session for the current conversation route. It is the fastest way to reset conversational context without deleting old history.

Supported forms:

  • /new — use the default session type for the current context
  • /new chat — force a normal chat session
  • /new discuss — force a discuss session

Default behavior:

  • Web UI local chat defaults to chat
  • Direct messages default to chat
  • Group conversations on channel adapters default to discuss

/new discuss is not supported in the built-in Web UI local channel. Use a channel adapter such as Telegram or Discord if you want explicit discuss sessions.

See Sessions for how chat and discuss differ.

/stop

Stops the current in-progress generation for the current conversation. This is useful when:

  • the bot is still streaming and you already have what you need
  • a tool loop is taking too long
  • you want to interrupt the current turn before sending a follow-up

Status And Inspection Commands

/status

Shows session-level runtime stats for the current conversation:

  • message count
  • current context usage
  • cache hit rate
  • cache read/write tokens
  • used skills in the session

Actions:

ActionUsage
show/status or /status show
latest/status latest

Use show for the currently active conversation route. Use latest when you want the newest session for the bot even if the current route has no active session.

/access

Shows the current identity and permission context that Memoh is using for the command:

  • channel identity
  • linked user
  • bot role
  • whether write commands are allowed
  • channel / conversation / thread scope
  • evaluated chat ACL result

Usage:

text
/access

This command is useful when debugging ACL rules, linked accounts, or why a write command was denied.

/usage

Shows token usage for the last 7 days.

Actions:

ActionUsage
summary/usage or /usage summary
by-model/usage by-model

/heartbeat

Shows the most recent heartbeat execution logs.

Actions:

ActionUsage
logs/heartbeat or /heartbeat logs

/email

Shows email-related configuration data for the current bot.

Actions:

ActionUsage
providers/email providers
bindings/email bindings
outbox/email outbox

Configuration Commands

/settings

Shows or updates core bot settings.

Actions:

ActionUsagePermission
get/settings or /settings getAll
update/settings update [options]Owner

Supported update options:

OptionDescription
--languageBot language, such as en or zh
--acl_default_effectallow or deny
--reasoning_enabledtrue or false
--reasoning_effortlow, medium, or high
--heartbeat_enabledtrue or false
--heartbeat_intervalMinutes
--chat_model_idChat model UUID
--heartbeat_model_idHeartbeat model UUID

Example:

text
/settings update --language en --heartbeat_enabled true --heartbeat_interval 30

/model

Shows or switches the bot's chat and heartbeat models.

Actions:

ActionUsagePermission
list [provider_name]/model listAll
current/model currentAll
set/model set <model_id> or /model set <provider_name> <model_name>Owner
set-heartbeat/model set-heartbeat <model_id> or /model set-heartbeat <provider_name> <model_name>Owner

Examples:

text
/model list\n/model list OpenAI\n/model current\n/model set gpt-4o\n/model set OpenAI gpt-4o

/memory

Shows or switches the active memory provider.

Actions:

ActionUsagePermission
list/memory listAll
current/memory currentAll
set/memory set <name>Owner

Shows or switches the active search provider.

Actions:

ActionUsagePermission
list/search listAll
current/search currentAll
set/search set <name>Owner

/browser

Shows or switches the active browser context.

Actions:

ActionUsagePermission
list/browser listAll
current/browser currentAll
set/browser set <name>Owner

/mcp

Shows or deletes MCP connections configured for the bot.

Actions:

ActionUsagePermission
list/mcp listAll
get/mcp get <name>All
delete/mcp delete <name>Owner

Automation And Filesystem Commands

/schedule

Manages scheduled tasks for the bot.

Actions:

ActionUsagePermission
list/schedule listAll
get/schedule get <name>All
create/schedule create <name> <pattern> <command>Owner
update/schedule update <name> [--pattern P] [--command C]Owner
delete/schedule delete <name>Owner
enable/schedule enable <name>Owner
disable/schedule disable <name>Owner

Examples:

text
/schedule list\n/schedule create morning-news "0 9 * * *" "Summarize today's top tech news"\n/schedule disable morning-news

/skill

Lists the currently available bot skills.

Actions:

ActionUsage
list/skill or /skill list

/fs

Browses the bot container filesystem.

Actions:

ActionUsage
list/fs list [path]
read/fs read <path>

Examples:

text
/fs list /\n/fs list /home\n/fs read /home/bot/IDENTITY.md

Read output is truncated when the file is very large.


Context Compaction Command

/compact

Triggers immediate session context compaction for the current session. This is different from memory compaction:

  • context compaction reduces the active prompt/history footprint of one session
  • memory compaction rewrites long-term memory entries in the memory provider

Actions:

ActionUsage
run/compact or /compact run

Use this when the current conversation has grown long and you want Memoh to summarize older turns before continuing. See Context Compaction.

',134)])])}const m=e(s,[["render",c]]);export{u as __pageData,m as default}; +import{_ as e,o,c as d,ag as a}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1776332711000}'),s={name:"getting-started/slash-commands.md"};function c(n,t,r,i,l,h){return o(),d("div",null,[...t[0]||(t[0]=[a('

Slash Commands

Memoh bots support slash commands that are intercepted before the LLM runs. They are intended for fast inspection and control tasks such as viewing settings, switching providers, checking session status, or creating a fresh session.

Slash commands work in channel adapters and in the built-in Web UI chat. They do not consume model tokens just to parse the command itself.


Command Model

Most commands follow a resource-group pattern:

text
/resource [action] [arguments...]

Examples:

text
/schedule list\n/model current\n/schedule create morning-news "0 9 * * *" "Send a daily summary"

Key ideas:

  • resource is the command group, such as schedule, model, or status.
  • action is the specific operation, such as list, get, set, or latest.
  • arguments are positional values after the action. Use quotes when a value contains spaces.
  • Some groups have a default action, so /settings is equivalent to /settings get, and /status is equivalent to /status show.

Two commands are top-level instead of resource groups:

  • /new — create a new session for the current conversation route
  • /stop — abort the currently running generation for the current conversation

Built-in Help

The slash system has layered help built into it:

CommandMeaning
/helpShow the top-level command list
/help <group>Show actions inside one group
/help <group> <action>Show detailed usage for one action

Examples:

text
/help\n/help model\n/help model set

This is the fastest way to discover the exact live command surface for your current Memoh version.


Parsing Rules

Slash commands support a few convenience forms:

  • Mention-prefixed commands work in group chats, for example @BotName /help.
  • Telegram bot suffixes are accepted, for example /help@MemohBot.
  • Quoted strings are preserved as one argument, for example:
text
/schedule create morning-news "0 9 * * *" "Send today's top stories"

If the text does not resolve to a known command, Memoh treats it as a normal chat message instead of a slash command.


Permissions

Read-only actions are available to users who can already chat with the bot. Write actions such as set, create, update, delete, enable, and disable are owner-only.

In /help output, owner-only actions are marked with [owner].


Quick Reference

Top-Level Commands

CommandDescription
/helpShow slash command help
`/new [chatdiscuss]`
/stopStop the current generation

Resource Groups

GroupDescriptionDefault Action
/scheduleManage scheduled tasksNone
/mcpInspect MCP connectionsNone
/settingsView and update bot settingsget
/modelView and switch bot modelsNone
/memoryView and switch memory providersNone
/searchView and switch search providersNone
/browserView and switch browser contextsNone
/usageView token usagesummary
/emailInspect email providers, bindings, and outboxNone
/heartbeatView recent heartbeat logslogs
/skillView loaded bot skillslist
/fsBrowse files inside the bot containerNone
/statusInspect session message/context/cache statusshow
/accessInspect identity, role, and ACL contextshow
/compactTrigger immediate session context compactionrun

Session Commands

/new

Creates a fresh session for the current conversation route. It is the fastest way to reset conversational context without deleting old history.

Supported forms:

  • /new — use the default session type for the current context
  • /new chat — force a normal chat session
  • /new discuss — force a discuss session

Default behavior:

  • Web UI local chat defaults to chat
  • Direct messages default to chat
  • Group conversations on channel adapters default to discuss

/new discuss is not supported in the built-in Web UI local channel. Use a channel adapter such as Telegram or Discord if you want explicit discuss sessions.

See Sessions for how chat and discuss differ.

/stop

Stops the current in-progress generation for the current conversation. This is useful when:

  • the bot is still streaming and you already have what you need
  • a tool loop is taking too long
  • you want to interrupt the current turn before sending a follow-up

Status And Inspection Commands

/status

Shows session-level runtime stats for the current conversation:

  • message count
  • current context usage
  • cache hit rate
  • cache read/write tokens
  • used skills in the session

Actions:

ActionUsage
show/status or /status show
latest/status latest

Use show for the currently active conversation route. Use latest when you want the newest session for the bot even if the current route has no active session.

/access

Shows the current identity and permission context that Memoh is using for the command:

  • channel identity
  • linked user
  • bot role
  • whether write commands are allowed
  • channel / conversation / thread scope
  • evaluated chat ACL result

Usage:

text
/access

This command is useful when debugging ACL rules, linked accounts, or why a write command was denied.

/usage

Shows token usage for the last 7 days.

Actions:

ActionUsage
summary/usage or /usage summary
by-model/usage by-model

/heartbeat

Shows the most recent heartbeat execution logs.

Actions:

ActionUsage
logs/heartbeat or /heartbeat logs

/email

Shows email-related configuration data for the current bot.

Actions:

ActionUsage
providers/email providers
bindings/email bindings
outbox/email outbox

Configuration Commands

/settings

Shows or updates core bot settings.

Actions:

ActionUsagePermission
get/settings or /settings getAll
update/settings update [options]Owner

Supported update options:

OptionDescription
--languageBot language, such as en or zh
--acl_default_effectallow or deny
--reasoning_enabledtrue or false
--reasoning_effortlow, medium, or high
--heartbeat_enabledtrue or false
--heartbeat_intervalMinutes
--chat_model_idChat model UUID
--heartbeat_model_idHeartbeat model UUID

Example:

text
/settings update --language en --heartbeat_enabled true --heartbeat_interval 30

/model

Shows or switches the bot's chat and heartbeat models.

Actions:

ActionUsagePermission
list [provider_name]/model listAll
current/model currentAll
set/model set <model_id> or /model set <provider_name> <model_name>Owner
set-heartbeat/model set-heartbeat <model_id> or /model set-heartbeat <provider_name> <model_name>Owner

Examples:

text
/model list\n/model list OpenAI\n/model current\n/model set gpt-4o\n/model set OpenAI gpt-4o

/memory

Shows or switches the active memory provider.

Actions:

ActionUsagePermission
list/memory listAll
current/memory currentAll
set/memory set <name>Owner

Shows or switches the active search provider.

Actions:

ActionUsagePermission
list/search listAll
current/search currentAll
set/search set <name>Owner

/browser

Shows or switches the active browser context.

Actions:

ActionUsagePermission
list/browser listAll
current/browser currentAll
set/browser set <name>Owner

/mcp

Shows or deletes MCP connections configured for the bot.

Actions:

ActionUsagePermission
list/mcp listAll
get/mcp get <name>All
delete/mcp delete <name>Owner

Automation And Filesystem Commands

/schedule

Manages scheduled tasks for the bot.

Actions:

ActionUsagePermission
list/schedule listAll
get/schedule get <name>All
create/schedule create <name> <pattern> <command>Owner
update/schedule update <name> [--pattern P] [--command C]Owner
delete/schedule delete <name>Owner
enable/schedule enable <name>Owner
disable/schedule disable <name>Owner

Examples:

text
/schedule list\n/schedule create morning-news "0 9 * * *" "Summarize today's top tech news"\n/schedule disable morning-news

/skill

Lists the currently available bot skills.

Actions:

ActionUsage
list/skill or /skill list

/fs

Browses the bot container filesystem.

Actions:

ActionUsage
list/fs list [path]
read/fs read <path>

Examples:

text
/fs list /\n/fs list /home\n/fs read /home/bot/IDENTITY.md

Read output is truncated when the file is very large.


Context Compaction Command

/compact

Triggers immediate session context compaction for the current session. This is different from memory compaction:

  • context compaction reduces the active prompt/history footprint of one session
  • memory compaction rewrites long-term memory entries in the memory provider

Actions:

ActionUsage
run/compact or /compact run

Use this when the current conversation has grown long and you want Memoh to summarize older turns before continuing. See Context Compaction.

',134)])])}const m=e(s,[["render",c]]);export{u as __pageData,m as default}; diff --git a/assets/getting-started_slash-commands.md.B9pb8gxb.lean.js b/assets/getting-started_slash-commands.md.ChJs4d6R.lean.js similarity index 86% rename from assets/getting-started_slash-commands.md.B9pb8gxb.lean.js rename to assets/getting-started_slash-commands.md.ChJs4d6R.lean.js index f6481bcc..574d77c8 100644 --- a/assets/getting-started_slash-commands.md.B9pb8gxb.lean.js +++ b/assets/getting-started_slash-commands.md.ChJs4d6R.lean.js @@ -1 +1 @@ -import{_ as e,o,c as d,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1776332711000}'),s={name:"getting-started/slash-commands.md"};function c(n,t,r,i,l,h){return o(),d("div",null,[...t[0]||(t[0]=[a("",134)])])}const m=e(s,[["render",c]]);export{u as __pageData,m as default}; +import{_ as e,o,c as d,ag as a}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1776332711000}'),s={name:"getting-started/slash-commands.md"};function c(n,t,r,i,l,h){return o(),d("div",null,[...t[0]||(t[0]=[a("",134)])])}const m=e(s,[["render",c]]);export{u as __pageData,m as default}; diff --git a/assets/getting-started_supermarket.md.BOx8ZRcm.js b/assets/getting-started_supermarket.md.BqLtu6vF.js similarity index 94% rename from assets/getting-started_supermarket.md.BOx8ZRcm.js rename to assets/getting-started_supermarket.md.BqLtu6vF.js index a109befb..913c5345 100644 --- a/assets/getting-started_supermarket.md.BOx8ZRcm.js +++ b/assets/getting-started_supermarket.md.BqLtu6vF.js @@ -1 +1 @@ -import{_ as e,o as a,c as l,ag as r}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Supermarket","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/supermarket.md","filePath":"getting-started/supermarket.md","lastUpdated":1776332711000}'),i={name:"getting-started/supermarket.md"};function n(o,t,s,h,p,m){return a(),l("div",null,[...t[0]||(t[0]=[r('

Supermarket

Supermarket is Memoh's built-in catalog for skills and MCP templates.


Install A Skill

  1. Open Supermarket in the Web UI.
  2. Switch to the Skills tab.
  3. Choose a skill and click Install.
  4. Select the target bot.
  5. Confirm the install.
  6. The skill appears in that bot's Skills tab.

Install An MCP Template

  1. Open Supermarket in the Web UI.
  2. Switch to the MCP tab.
  3. Choose an entry and click Install.
  4. Select the target bot.
  5. Memoh opens that bot's MCP tab with a prefilled draft connection.
  6. Fill in any required secrets or OAuth details.
  7. Save the connection.
  8. Probe it if you want to refresh tool discovery.

Contribute

Contribute new skills or MCP templates here:

',12)])])}const d=e(i,[["render",n]]);export{u as __pageData,d as default}; +import{_ as e,o as a,c as l,ag as r}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Supermarket","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/supermarket.md","filePath":"getting-started/supermarket.md","lastUpdated":1776332711000}'),i={name:"getting-started/supermarket.md"};function n(o,t,s,h,p,m){return a(),l("div",null,[...t[0]||(t[0]=[r('

Supermarket

Supermarket is Memoh's built-in catalog for skills and MCP templates.


Install A Skill

  1. Open Supermarket in the Web UI.
  2. Switch to the Skills tab.
  3. Choose a skill and click Install.
  4. Select the target bot.
  5. Confirm the install.
  6. The skill appears in that bot's Skills tab.

Install An MCP Template

  1. Open Supermarket in the Web UI.
  2. Switch to the MCP tab.
  3. Choose an entry and click Install.
  4. Select the target bot.
  5. Memoh opens that bot's MCP tab with a prefilled draft connection.
  6. Fill in any required secrets or OAuth details.
  7. Save the connection.
  8. Probe it if you want to refresh tool discovery.

Contribute

Contribute new skills or MCP templates here:

',12)])])}const d=e(i,[["render",n]]);export{u as __pageData,d as default}; diff --git a/assets/getting-started_supermarket.md.BOx8ZRcm.lean.js b/assets/getting-started_supermarket.md.BqLtu6vF.lean.js similarity index 72% rename from assets/getting-started_supermarket.md.BOx8ZRcm.lean.js rename to assets/getting-started_supermarket.md.BqLtu6vF.lean.js index b8ff93e5..e8727e67 100644 --- a/assets/getting-started_supermarket.md.BOx8ZRcm.lean.js +++ b/assets/getting-started_supermarket.md.BqLtu6vF.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as l,ag as r}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Supermarket","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/supermarket.md","filePath":"getting-started/supermarket.md","lastUpdated":1776332711000}'),i={name:"getting-started/supermarket.md"};function n(o,t,s,h,p,m){return a(),l("div",null,[...t[0]||(t[0]=[r("",12)])])}const d=e(i,[["render",n]]);export{u as __pageData,d as default}; +import{_ as e,o as a,c as l,ag as r}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Supermarket","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/supermarket.md","filePath":"getting-started/supermarket.md","lastUpdated":1776332711000}'),i={name:"getting-started/supermarket.md"};function n(o,t,s,h,p,m){return a(),l("div",null,[...t[0]||(t[0]=[r("",12)])])}const d=e(i,[["render",n]]);export{u as __pageData,d as default}; diff --git a/assets/index.md.DtN_VGK2.js b/assets/index.md.DzWsM5pb.js similarity index 95% rename from assets/index.md.DtN_VGK2.js rename to assets/index.md.DzWsM5pb.js index 89cd3d96..3d1a9cfa 100644 --- a/assets/index.md.DtN_VGK2.js +++ b/assets/index.md.DzWsM5pb.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as r}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1776334458000}'),s={name:"index.md"};function n(i,e,l,d,m,h){return a(),o("div",null,[...e[0]||(e[0]=[r('

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent platform. Create bots with isolated workspaces, persistent memory, tool access, and channel integrations across Telegram, Discord, Lark (Feishu), QQ, Matrix, Misskey, DingTalk, WeCom, WeChat, WeChat Official Account, Email, and Web.

Start Here

Feature Guides

  • Channels — Platform overview and links to per-channel guides.
  • Access Control — ACL presets, rule ordering, and scoped access.
  • Skills — Managed skills, effective/shadowed states, and adoption workflow.
  • Supermarket — Install skills and MCP templates from the catalog.
  • MCP — Configure tool servers, OAuth, probing, import/export.
  • Memory — Long-term memory providers and memory compaction.
  • Context Compaction — Reduce active session context size without changing stored memory.
',6)])])}const u=t(s,[["render",n]]);export{c as __pageData,u as default}; +import{_ as t,o as a,c as o,ag as r}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1776334458000}'),s={name:"index.md"};function n(i,e,l,d,m,h){return a(),o("div",null,[...e[0]||(e[0]=[r('

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent platform. Create bots with isolated workspaces, persistent memory, tool access, and channel integrations across Telegram, Discord, Lark (Feishu), QQ, Matrix, Misskey, DingTalk, WeCom, WeChat, WeChat Official Account, Email, and Web.

Start Here

Feature Guides

  • Channels — Platform overview and links to per-channel guides.
  • Access Control — ACL presets, rule ordering, and scoped access.
  • Skills — Managed skills, effective/shadowed states, and adoption workflow.
  • Supermarket — Install skills and MCP templates from the catalog.
  • MCP — Configure tool servers, OAuth, probing, import/export.
  • Memory — Long-term memory providers and memory compaction.
  • Context Compaction — Reduce active session context size without changing stored memory.
',6)])])}const u=t(s,[["render",n]]);export{c as __pageData,u as default}; diff --git a/assets/index.md.DtN_VGK2.lean.js b/assets/index.md.DzWsM5pb.lean.js similarity index 69% rename from assets/index.md.DtN_VGK2.lean.js rename to assets/index.md.DzWsM5pb.lean.js index 00c3cdd4..4b11227e 100644 --- a/assets/index.md.DtN_VGK2.lean.js +++ b/assets/index.md.DzWsM5pb.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as r}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1776334458000}'),s={name:"index.md"};function n(i,e,l,d,m,h){return a(),o("div",null,[...e[0]||(e[0]=[r("",6)])])}const u=t(s,[["render",n]]);export{c as __pageData,u as default}; +import{_ as t,o as a,c as o,ag as r}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1776334458000}'),s={name:"index.md"};function n(i,e,l,d,m,h){return a(),o("div",null,[...e[0]||(e[0]=[r("",6)])])}const u=t(s,[["render",n]]);export{c as __pageData,u as default}; diff --git a/assets/installation_docker.md.DxE7r3rU.js b/assets/installation_docker.md.BgArxak6.js similarity index 99% rename from assets/installation_docker.md.DxE7r3rU.js rename to assets/installation_docker.md.BgArxak6.js index be1b090b..b096df45 100644 --- a/assets/installation_docker.md.DxE7r3rU.js +++ b/assets/installation_docker.md.BgArxak6.js @@ -1,4 +1,4 @@ -import{_ as e,o as i,c as t,ag as a}from"./chunks/framework.DXGyWiRo.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1774787421000}'),n={name:"installation/docker.md"};function o(r,s,d,l,h,p){return i(),t("div",null,[...s[0]||(s[0]=[a(`

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, the main server (with embedded Containerd and in-process AI agent), and the web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Service Architecture

The Docker Compose stack consists of multiple services. Some are always started, others are optional and enabled via --profile:

ServiceProfileDescription
server(core)Main Memoh server with embedded Containerd and in-process AI agent
web(core)Web UI (Vue 3)
postgres(core)PostgreSQL database
qdrantqdrantQdrant vector database for memory search (sparse and dense modes)
browserbrowserPlaywright-based browser gateway for bot web automation
sparsesparseNeural sparse encoding service for memory retrieval (see below)

Sparse Service

The sparse container provides neural sparse vector encoding for memory retrieval. It runs a lightweight Python (Flask) service on port 8085 that uses the opensearch-neural-sparse-encoding-multilingual-v1 model from OpenSearch.

What it does:

  • Converts document text into sparse vectors (a compact list of token indices + importance weights) using a masked language model
  • Encodes queries using IDF-weighted term lookup for fast, efficient retrieval
  • Works with Qdrant to enable semantic memory search without requiring an external embedding API

Why use it:

  • No embedding API costs — The model runs locally inside the container, so you don't need an OpenAI/Cohere/etc. embedding API key
  • Multilingual — The underlying model supports multiple languages out of the box
  • Good retrieval quality — Neural sparse encoding provides significantly better results than keyword-only search (BM25), while being lighter than dense embedding models

When to enable it:

Enable the sparse profile (--profile sparse) if you plan to use the built-in memory provider in sparse mode. The model is pre-downloaded during the Docker image build, so the container starts quickly without needing to fetch weights at runtime.

bash
docker compose --profile qdrant --profile sparse --profile browser up -d

For more details on memory modes, see Built-in Memory Provider.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, sparse service toggle, browser core selection)
  3. Fetch the latest release tag from GitHub and clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Pin Docker image versions to the release
  6. Build the browser image with selected cores and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Install a specific version:

bash
curl -fsSL https://memoh.sh | sudo sh -s -- --version v0.6.0

Or using the environment variable:

bash
curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 sh

Use China mainland mirror (for slow image pulls):

bash
curl -fsSL https://memoh.sh | sudo USE_CN_MIRROR=true sh

Environment variables can be combined, e.g. curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 USE_CN_MIRROR=true sh

Manual Install

bash
git clone https://github.com/memohai/Memoh.git
+import{_ as e,o as i,c as t,ag as a}from"./chunks/framework.CAXxHpAX.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1774787421000}'),n={name:"installation/docker.md"};function o(r,s,d,l,h,p){return i(),t("div",null,[...s[0]||(s[0]=[a(`

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, the main server (with embedded Containerd and in-process AI agent), and the web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Service Architecture

The Docker Compose stack consists of multiple services. Some are always started, others are optional and enabled via --profile:

ServiceProfileDescription
server(core)Main Memoh server with embedded Containerd and in-process AI agent
web(core)Web UI (Vue 3)
postgres(core)PostgreSQL database
qdrantqdrantQdrant vector database for memory search (sparse and dense modes)
browserbrowserPlaywright-based browser gateway for bot web automation
sparsesparseNeural sparse encoding service for memory retrieval (see below)

Sparse Service

The sparse container provides neural sparse vector encoding for memory retrieval. It runs a lightweight Python (Flask) service on port 8085 that uses the opensearch-neural-sparse-encoding-multilingual-v1 model from OpenSearch.

What it does:

  • Converts document text into sparse vectors (a compact list of token indices + importance weights) using a masked language model
  • Encodes queries using IDF-weighted term lookup for fast, efficient retrieval
  • Works with Qdrant to enable semantic memory search without requiring an external embedding API

Why use it:

  • No embedding API costs — The model runs locally inside the container, so you don't need an OpenAI/Cohere/etc. embedding API key
  • Multilingual — The underlying model supports multiple languages out of the box
  • Good retrieval quality — Neural sparse encoding provides significantly better results than keyword-only search (BM25), while being lighter than dense embedding models

When to enable it:

Enable the sparse profile (--profile sparse) if you plan to use the built-in memory provider in sparse mode. The model is pre-downloaded during the Docker image build, so the container starts quickly without needing to fetch weights at runtime.

bash
docker compose --profile qdrant --profile sparse --profile browser up -d

For more details on memory modes, see Built-in Memory Provider.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, sparse service toggle, browser core selection)
  3. Fetch the latest release tag from GitHub and clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Pin Docker image versions to the release
  6. Build the browser image with selected cores and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Install a specific version:

bash
curl -fsSL https://memoh.sh | sudo sh -s -- --version v0.6.0

Or using the environment variable:

bash
curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 sh

Use China mainland mirror (for slow image pulls):

bash
curl -fsSL https://memoh.sh | sudo USE_CN_MIRROR=true sh

Environment variables can be combined, e.g. curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 USE_CN_MIRROR=true sh

Manual Install

bash
git clone https://github.com/memohai/Memoh.git
 cd Memoh
 cp conf/app.docker.toml config.toml

Edit config.toml — at minimum change:

  • admin.password — Admin password
  • auth.jwt_secret — Generate with openssl rand -base64 32
  • postgres.password — Database password (also set POSTGRES_PASSWORD env var to match)

Then start (recommended — with Qdrant, Browser, and Sparse):

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose --profile qdrant --profile browser --profile sparse up -d

Or start core services only (no vector DB or browser automation):

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose up -d

On macOS or if your user is in the docker group, sudo is not required.

Important: docker-compose.yml mounts ./config.toml by default. You must create this file before starting — running without it will fail.

China Mainland Mirror

For users in mainland China who cannot access Docker Hub directly, uncomment the registry line in config.toml:

toml
[workspace]
 registry = "memoh.cn"

And add the China mirror compose overlay:

bash
sudo docker compose -f docker-compose.yml -f docker/docker-compose.cn.yml \\
diff --git a/assets/installation_docker.md.DxE7r3rU.lean.js b/assets/installation_docker.md.BgArxak6.lean.js
similarity index 71%
rename from assets/installation_docker.md.DxE7r3rU.lean.js
rename to assets/installation_docker.md.BgArxak6.lean.js
index ec1379f2..a6619f04 100644
--- a/assets/installation_docker.md.DxE7r3rU.lean.js
+++ b/assets/installation_docker.md.BgArxak6.lean.js
@@ -1 +1 @@
-import{_ as e,o as i,c as t,ag as a}from"./chunks/framework.DXGyWiRo.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1774787421000}'),n={name:"installation/docker.md"};function o(r,s,d,l,h,p){return i(),t("div",null,[...s[0]||(s[0]=[a("",62)])])}const g=e(n,[["render",o]]);export{k as __pageData,g as default};
+import{_ as e,o as i,c as t,ag as a}from"./chunks/framework.CAXxHpAX.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1774787421000}'),n={name:"installation/docker.md"};function o(r,s,d,l,h,p){return i(),t("div",null,[...s[0]||(s[0]=[a("",62)])])}const g=e(n,[["render",o]]);export{k as __pageData,g as default};
diff --git a/assets/memory-providers_builtin.md.DlYtNI3G.js b/assets/memory-providers_builtin.md.EikeTjwl.js
similarity index 98%
rename from assets/memory-providers_builtin.md.DlYtNI3G.js
rename to assets/memory-providers_builtin.md.EikeTjwl.js
index 21df6f44..9b2c22c5 100644
--- a/assets/memory-providers_builtin.md.DlYtNI3G.js
+++ b/assets/memory-providers_builtin.md.EikeTjwl.js
@@ -1,4 +1,4 @@
-import{_ as t,o as i,c as a,ag as s}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1774787421000}'),r={name:"memory-providers/builtin.md"};function o(n,e,d,l,h,p){return i(),a("div",null,[...e[0]||(e[0]=[s(`

Built-in Memory Provider

The built-in memory provider is the standard memory backend shipped with Memoh. It works with Memoh's memory pipeline and supports:

  • Automatic memory extraction from conversations
  • Semantic memory retrieval during chat
  • Manual memory creation and editing
  • Memory compaction and rebuild workflows

The built-in provider operates in one of three memory modes, each with different infrastructure requirements and retrieval capabilities.


Memory Modes

ModeIndexRequirementsUse Case
OffFile-based onlyNoneLightweight setup, no vector search
SparseNeural sparse vectorsSparse service + Qdrant (--profile sparse)Good retrieval quality without embedding API costs
DenseDense embeddingsEmbedding model + Qdrant (--profile qdrant)Highest-quality semantic search

How Sparse Mode Works

Sparse mode uses the opensearch-neural-sparse-encoding-multilingual-v1 model (from the OpenSearch project) to convert text into sparse vectors — compact lists of token indices with importance weights. Unlike dense mode, which requires an external embedding API, the sparse model runs locally in the sparse container with no API key or cost. It supports multiple languages and provides significantly better retrieval quality than keyword-only search.


Creating a Built-in Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select builtin.
  4. Click Create.

Configuring a Built-in Provider

After creating a provider, select it from the list and configure its settings.

FieldDescription
Memory Modeoff (default), sparse, or dense. Controls how memories are indexed and retrieved.
Embedding ModelEmbedding model for dense vector search. Only used in dense mode.
Qdrant CollectionQdrant collection name. Defaults to memory_sparse.

Managing Providers

  • Edit: Select a provider and update its settings.
  • Delete: Remove a provider you no longer use.

Infrastructure Requirements

Off Mode

No additional infrastructure required. Memories are stored and retrieved using file-based indexing only.

Sparse Mode

Requires the sparse service (runs the opensearch-neural-sparse-encoding-multilingual-v1 model locally) and Qdrant vector database. Enable both with Docker Compose profiles:

bash
docker compose --profile qdrant --profile sparse up -d

The following sections must be present in config.toml:

toml
[qdrant]
+import{_ as t,o as i,c as a,ag as s}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1774787421000}'),r={name:"memory-providers/builtin.md"};function o(n,e,d,l,h,p){return i(),a("div",null,[...e[0]||(e[0]=[s(`

Built-in Memory Provider

The built-in memory provider is the standard memory backend shipped with Memoh. It works with Memoh's memory pipeline and supports:

  • Automatic memory extraction from conversations
  • Semantic memory retrieval during chat
  • Manual memory creation and editing
  • Memory compaction and rebuild workflows

The built-in provider operates in one of three memory modes, each with different infrastructure requirements and retrieval capabilities.


Memory Modes

ModeIndexRequirementsUse Case
OffFile-based onlyNoneLightweight setup, no vector search
SparseNeural sparse vectorsSparse service + Qdrant (--profile sparse)Good retrieval quality without embedding API costs
DenseDense embeddingsEmbedding model + Qdrant (--profile qdrant)Highest-quality semantic search

How Sparse Mode Works

Sparse mode uses the opensearch-neural-sparse-encoding-multilingual-v1 model (from the OpenSearch project) to convert text into sparse vectors — compact lists of token indices with importance weights. Unlike dense mode, which requires an external embedding API, the sparse model runs locally in the sparse container with no API key or cost. It supports multiple languages and provides significantly better retrieval quality than keyword-only search.


Creating a Built-in Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select builtin.
  4. Click Create.

Configuring a Built-in Provider

After creating a provider, select it from the list and configure its settings.

FieldDescription
Memory Modeoff (default), sparse, or dense. Controls how memories are indexed and retrieved.
Embedding ModelEmbedding model for dense vector search. Only used in dense mode.
Qdrant CollectionQdrant collection name. Defaults to memory_sparse.

Managing Providers

  • Edit: Select a provider and update its settings.
  • Delete: Remove a provider you no longer use.

Infrastructure Requirements

Off Mode

No additional infrastructure required. Memories are stored and retrieved using file-based indexing only.

Sparse Mode

Requires the sparse service (runs the opensearch-neural-sparse-encoding-multilingual-v1 model locally) and Qdrant vector database. Enable both with Docker Compose profiles:

bash
docker compose --profile qdrant --profile sparse up -d

The following sections must be present in config.toml:

toml
[qdrant]
 base_url = "http://qdrant:6334"
 
 [sparse]
diff --git a/assets/memory-providers_builtin.md.DlYtNI3G.lean.js b/assets/memory-providers_builtin.md.EikeTjwl.lean.js
similarity index 73%
rename from assets/memory-providers_builtin.md.DlYtNI3G.lean.js
rename to assets/memory-providers_builtin.md.EikeTjwl.lean.js
index 8bcda741..5d361f64 100644
--- a/assets/memory-providers_builtin.md.DlYtNI3G.lean.js
+++ b/assets/memory-providers_builtin.md.EikeTjwl.lean.js
@@ -1 +1 @@
-import{_ as t,o as i,c as a,ag as s}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1774787421000}'),r={name:"memory-providers/builtin.md"};function o(n,e,d,l,h,p){return i(),a("div",null,[...e[0]||(e[0]=[s("",41)])])}const m=t(r,[["render",o]]);export{g as __pageData,m as default};
+import{_ as t,o as i,c as a,ag as s}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1774787421000}'),r={name:"memory-providers/builtin.md"};function o(n,e,d,l,h,p){return i(),a("div",null,[...e[0]||(e[0]=[s("",41)])])}const m=t(r,[["render",o]]);export{g as __pageData,m as default};
diff --git a/assets/memory-providers_index.md.D5MvHNPW.js b/assets/memory-providers_index.md.Db8RSqmA.js
similarity index 97%
rename from assets/memory-providers_index.md.D5MvHNPW.js
rename to assets/memory-providers_index.md.Db8RSqmA.js
index 0c73c0ea..c53a1305 100644
--- a/assets/memory-providers_index.md.D5MvHNPW.js
+++ b/assets/memory-providers_index.md.Db8RSqmA.js
@@ -1 +1 @@
-import{_ as r,o,c as a,ag as i}from"./chunks/framework.DXGyWiRo.js";const v=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1774787421000}'),t={name:"memory-providers/index.md"};function s(m,e,n,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i('

Memory Providers

Memoh uses a Memory Provider to define how a bot stores, retrieves, and manages long-term memory. A bot can bind one memory provider in its General tab, and that provider becomes the backend for memory extraction and memory search.

Available Providers

Memoh supports the following memory providers:

  • Built-in: The default memory system included with Memoh. Supports three modes — off (file-based), sparse (neural sparse vectors), and dense (embedding-based semantic search). Fully self-hosted.
  • Mem0: SaaS memory provider via the Mem0 API. Requires an API key.
  • OpenViking: Self-hosted or SaaS memory provider with its own API.

Basic Flow

  1. Open the Memory Providers page from the sidebar.
  2. Create a provider instance using one of the supported provider types.
  3. Configure the provider settings.
  4. Open a bot's General tab and assign that provider in Memory Provider.
  5. Manage actual memories from the bot's Memory tab.

Next Steps

',11)])])}const f=r(t,[["render",s]]);export{v as __pageData,f as default}; +import{_ as r,o,c as a,ag as i}from"./chunks/framework.CAXxHpAX.js";const v=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1774787421000}'),t={name:"memory-providers/index.md"};function s(m,e,n,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i('

Memory Providers

Memoh uses a Memory Provider to define how a bot stores, retrieves, and manages long-term memory. A bot can bind one memory provider in its General tab, and that provider becomes the backend for memory extraction and memory search.

Available Providers

Memoh supports the following memory providers:

  • Built-in: The default memory system included with Memoh. Supports three modes — off (file-based), sparse (neural sparse vectors), and dense (embedding-based semantic search). Fully self-hosted.
  • Mem0: SaaS memory provider via the Mem0 API. Requires an API key.
  • OpenViking: Self-hosted or SaaS memory provider with its own API.

Basic Flow

  1. Open the Memory Providers page from the sidebar.
  2. Create a provider instance using one of the supported provider types.
  3. Configure the provider settings.
  4. Open a bot's General tab and assign that provider in Memory Provider.
  5. Manage actual memories from the bot's Memory tab.

Next Steps

',11)])])}const f=r(t,[["render",s]]);export{v as __pageData,f as default}; diff --git a/assets/memory-providers_index.md.D5MvHNPW.lean.js b/assets/memory-providers_index.md.Db8RSqmA.lean.js similarity index 85% rename from assets/memory-providers_index.md.D5MvHNPW.lean.js rename to assets/memory-providers_index.md.Db8RSqmA.lean.js index e814efa5..3ba603e2 100644 --- a/assets/memory-providers_index.md.D5MvHNPW.lean.js +++ b/assets/memory-providers_index.md.Db8RSqmA.lean.js @@ -1 +1 @@ -import{_ as r,o,c as a,ag as i}from"./chunks/framework.DXGyWiRo.js";const v=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1774787421000}'),t={name:"memory-providers/index.md"};function s(m,e,n,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i("",11)])])}const f=r(t,[["render",s]]);export{v as __pageData,f as default}; +import{_ as r,o,c as a,ag as i}from"./chunks/framework.CAXxHpAX.js";const v=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1774787421000}'),t={name:"memory-providers/index.md"};function s(m,e,n,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i("",11)])])}const f=r(t,[["render",s]]);export{v as __pageData,f as default}; diff --git a/assets/memory-providers_mem0.md.C5B6D9ME.js b/assets/memory-providers_mem0.md.DpAU5KWk.js similarity index 96% rename from assets/memory-providers_mem0.md.C5B6D9ME.js rename to assets/memory-providers_mem0.md.DpAU5KWk.js index 3619be1c..f0a17991 100644 --- a/assets/memory-providers_mem0.md.C5B6D9ME.js +++ b/assets/memory-providers_mem0.md.DpAU5KWk.js @@ -1 +1 @@ -import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Mem0 Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/mem0.md","filePath":"memory-providers/mem0.md","lastUpdated":1774787421000}'),i={name:"memory-providers/mem0.md"};function n(d,e,s,m,l,g){return t(),o("div",null,[...e[0]||(e[0]=[a('

Mem0 Memory Provider

Mem0 is a SaaS memory provider that connects your bot to the Mem0 platform. Instead of managing memory infrastructure yourself, Mem0 handles storage, retrieval, and indexing through its cloud API.


Creating a Mem0 Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select mem0.
  4. Click Create.

Configuring a Mem0 Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLNoMem0 API base URL. Defaults to https://api.mem0.ai when empty.
API KeyYesAPI key for Mem0 authentication (stored as a secret).
Organization IDNoOrganization ID for workspace scoping.
Project IDNoProject ID for workspace scoping.

Assigning a Mem0 Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the Mem0 provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use Mem0 as its memory backend. Memory extraction, search, and management operations are routed through the Mem0 API.

For day-to-day memory operations, see Bot Memory Management.

',16)])])}const p=r(i,[["render",n]]);export{c as __pageData,p as default}; +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"Mem0 Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/mem0.md","filePath":"memory-providers/mem0.md","lastUpdated":1774787421000}'),i={name:"memory-providers/mem0.md"};function n(d,e,s,m,l,g){return t(),o("div",null,[...e[0]||(e[0]=[a('

Mem0 Memory Provider

Mem0 is a SaaS memory provider that connects your bot to the Mem0 platform. Instead of managing memory infrastructure yourself, Mem0 handles storage, retrieval, and indexing through its cloud API.


Creating a Mem0 Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select mem0.
  4. Click Create.

Configuring a Mem0 Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLNoMem0 API base URL. Defaults to https://api.mem0.ai when empty.
API KeyYesAPI key for Mem0 authentication (stored as a secret).
Organization IDNoOrganization ID for workspace scoping.
Project IDNoProject ID for workspace scoping.

Assigning a Mem0 Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the Mem0 provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use Mem0 as its memory backend. Memory extraction, search, and management operations are routed through the Mem0 API.

For day-to-day memory operations, see Bot Memory Management.

',16)])])}const p=r(i,[["render",n]]);export{c as __pageData,p as default}; diff --git a/assets/memory-providers_mem0.md.C5B6D9ME.lean.js b/assets/memory-providers_mem0.md.DpAU5KWk.lean.js similarity index 72% rename from assets/memory-providers_mem0.md.C5B6D9ME.lean.js rename to assets/memory-providers_mem0.md.DpAU5KWk.lean.js index a5559a1c..0deb0486 100644 --- a/assets/memory-providers_mem0.md.C5B6D9ME.lean.js +++ b/assets/memory-providers_mem0.md.DpAU5KWk.lean.js @@ -1 +1 @@ -import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Mem0 Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/mem0.md","filePath":"memory-providers/mem0.md","lastUpdated":1774787421000}'),i={name:"memory-providers/mem0.md"};function n(d,e,s,m,l,g){return t(),o("div",null,[...e[0]||(e[0]=[a("",16)])])}const p=r(i,[["render",n]]);export{c as __pageData,p as default}; +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"Mem0 Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/mem0.md","filePath":"memory-providers/mem0.md","lastUpdated":1774787421000}'),i={name:"memory-providers/mem0.md"};function n(d,e,s,m,l,g){return t(),o("div",null,[...e[0]||(e[0]=[a("",16)])])}const p=r(i,[["render",n]]);export{c as __pageData,p as default}; diff --git a/assets/memory-providers_openviking.md.N-8WyFZa.js b/assets/memory-providers_openviking.md.CFYGljE_.js similarity index 95% rename from assets/memory-providers_openviking.md.N-8WyFZa.js rename to assets/memory-providers_openviking.md.CFYGljE_.js index f82926d5..955a1e51 100644 --- a/assets/memory-providers_openviking.md.N-8WyFZa.js +++ b/assets/memory-providers_openviking.md.CFYGljE_.js @@ -1 +1 @@ -import{_ as i,o as r,c as o,ag as t}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"OpenViking Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/openviking.md","filePath":"memory-providers/openviking.md","lastUpdated":1774787421000}'),n={name:"memory-providers/openviking.md"};function a(d,e,s,g,l,p){return r(),o("div",null,[...e[0]||(e[0]=[t('

OpenViking Memory Provider

OpenViking is a memory provider that can be self-hosted or used as a SaaS service. It provides an alternative memory backend for bots that need a dedicated memory API.


Creating an OpenViking Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select openviking.
  4. Click Create.

Configuring an OpenViking Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLYesOpenViking API endpoint (e.g. http://openviking:8088).
API KeyNoAPI key for authentication (stored as a secret).

Assigning an OpenViking Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the OpenViking provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use OpenViking as its memory backend. Memory extraction, search, and management operations are routed through the OpenViking API.

For day-to-day memory operations, see Bot Memory Management.

',16)])])}const m=i(n,[["render",a]]);export{c as __pageData,m as default}; +import{_ as i,o as r,c as o,ag as t}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"OpenViking Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/openviking.md","filePath":"memory-providers/openviking.md","lastUpdated":1774787421000}'),n={name:"memory-providers/openviking.md"};function a(d,e,s,g,l,p){return r(),o("div",null,[...e[0]||(e[0]=[t('

OpenViking Memory Provider

OpenViking is a memory provider that can be self-hosted or used as a SaaS service. It provides an alternative memory backend for bots that need a dedicated memory API.


Creating an OpenViking Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select openviking.
  4. Click Create.

Configuring an OpenViking Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLYesOpenViking API endpoint (e.g. http://openviking:8088).
API KeyNoAPI key for authentication (stored as a secret).

Assigning an OpenViking Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the OpenViking provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use OpenViking as its memory backend. Memory extraction, search, and management operations are routed through the OpenViking API.

For day-to-day memory operations, see Bot Memory Management.

',16)])])}const m=i(n,[["render",a]]);export{c as __pageData,m as default}; diff --git a/assets/memory-providers_openviking.md.N-8WyFZa.lean.js b/assets/memory-providers_openviking.md.CFYGljE_.lean.js similarity index 73% rename from assets/memory-providers_openviking.md.N-8WyFZa.lean.js rename to assets/memory-providers_openviking.md.CFYGljE_.lean.js index 038b9ea7..e70cb0c8 100644 --- a/assets/memory-providers_openviking.md.N-8WyFZa.lean.js +++ b/assets/memory-providers_openviking.md.CFYGljE_.lean.js @@ -1 +1 @@ -import{_ as i,o as r,c as o,ag as t}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"OpenViking Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/openviking.md","filePath":"memory-providers/openviking.md","lastUpdated":1774787421000}'),n={name:"memory-providers/openviking.md"};function a(d,e,s,g,l,p){return r(),o("div",null,[...e[0]||(e[0]=[t("",16)])])}const m=i(n,[["render",a]]);export{c as __pageData,m as default}; +import{_ as i,o as r,c as o,ag as t}from"./chunks/framework.CAXxHpAX.js";const c=JSON.parse('{"title":"OpenViking Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/openviking.md","filePath":"memory-providers/openviking.md","lastUpdated":1774787421000}'),n={name:"memory-providers/openviking.md"};function a(d,e,s,g,l,p){return r(),o("div",null,[...e[0]||(e[0]=[t("",16)])])}const m=i(n,[["render",a]]);export{c as __pageData,m as default}; diff --git a/assets/tts-providers_edge.md.DPjdtaQf.js b/assets/tts-providers_edge.md.BX5H-DX1.js similarity index 97% rename from assets/tts-providers_edge.md.DPjdtaQf.js rename to assets/tts-providers_edge.md.BX5H-DX1.js index 8a984ed1..226e7b9d 100644 --- a/assets/tts-providers_edge.md.DPjdtaQf.js +++ b/assets/tts-providers_edge.md.BX5H-DX1.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as d}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Edge TTS","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/edge.md","filePath":"tts-providers/edge.md","lastUpdated":1774787421000}'),r={name:"tts-providers/edge.md"};function i(n,e,s,l,c,g){return o(),a("div",null,[...e[0]||(e[0]=[d('

Edge TTS

Edge TTS uses Microsoft Edge's public read-aloud API for speech synthesis. It is free, requires no API key, and supports 256+ voices across 50+ languages.


Creating an Edge TTS Provider

  1. Navigate to the TTS Providers page.
  2. Click Add.
  3. Select edge as the provider type.
  4. Click Create.

The default model edge-read-aloud is automatically imported when the provider is created.


Configuring the Model

Click the edge-read-aloud model to configure its settings.

FieldDescription
VoiceLanguage + voice ID. Default: en-US-EmmaMultilingualNeural. Over 256 voices available across 50+ languages.
FormatAudio output format. Options: audio-24khz-48kbitrate-mono-mp3 (default), audio-24khz-96kbitrate-mono-mp3, webm-24khz-16bit-mono-opus.
SpeedPlayback speed. Options: 0.5, 1.0 (default), 2.0, 3.0.
PitchVoice pitch adjustment. Range: -100 to +100, default 0.

Assigning to a Bot

  1. Open a bot's General tab.
  2. Find the TTS Model dropdown.
  3. Select the configured Edge TTS model.
  4. Click Save.

The bot can now synthesize speech using Edge TTS.


Testing

Use the built-in synthesis test button on the model configuration page to preview how the selected voice, format, speed, and pitch sound before assigning to a bot.

',17)])])}const u=t(r,[["render",i]]);export{p as __pageData,u as default}; +import{_ as t,o,c as a,ag as d}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Edge TTS","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/edge.md","filePath":"tts-providers/edge.md","lastUpdated":1774787421000}'),r={name:"tts-providers/edge.md"};function i(n,e,s,l,c,g){return o(),a("div",null,[...e[0]||(e[0]=[d('

Edge TTS

Edge TTS uses Microsoft Edge's public read-aloud API for speech synthesis. It is free, requires no API key, and supports 256+ voices across 50+ languages.


Creating an Edge TTS Provider

  1. Navigate to the TTS Providers page.
  2. Click Add.
  3. Select edge as the provider type.
  4. Click Create.

The default model edge-read-aloud is automatically imported when the provider is created.


Configuring the Model

Click the edge-read-aloud model to configure its settings.

FieldDescription
VoiceLanguage + voice ID. Default: en-US-EmmaMultilingualNeural. Over 256 voices available across 50+ languages.
FormatAudio output format. Options: audio-24khz-48kbitrate-mono-mp3 (default), audio-24khz-96kbitrate-mono-mp3, webm-24khz-16bit-mono-opus.
SpeedPlayback speed. Options: 0.5, 1.0 (default), 2.0, 3.0.
PitchVoice pitch adjustment. Range: -100 to +100, default 0.

Assigning to a Bot

  1. Open a bot's General tab.
  2. Find the TTS Model dropdown.
  3. Select the configured Edge TTS model.
  4. Click Save.

The bot can now synthesize speech using Edge TTS.


Testing

Use the built-in synthesis test button on the model configuration page to preview how the selected voice, format, speed, and pitch sound before assigning to a bot.

',17)])])}const u=t(r,[["render",i]]);export{p as __pageData,u as default}; diff --git a/assets/tts-providers_edge.md.DPjdtaQf.lean.js b/assets/tts-providers_edge.md.BX5H-DX1.lean.js similarity index 85% rename from assets/tts-providers_edge.md.DPjdtaQf.lean.js rename to assets/tts-providers_edge.md.BX5H-DX1.lean.js index 167e3789..aff1d35c 100644 --- a/assets/tts-providers_edge.md.DPjdtaQf.lean.js +++ b/assets/tts-providers_edge.md.BX5H-DX1.lean.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as d}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Edge TTS","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/edge.md","filePath":"tts-providers/edge.md","lastUpdated":1774787421000}'),r={name:"tts-providers/edge.md"};function i(n,e,s,l,c,g){return o(),a("div",null,[...e[0]||(e[0]=[d("",17)])])}const u=t(r,[["render",i]]);export{p as __pageData,u as default}; +import{_ as t,o,c as a,ag as d}from"./chunks/framework.CAXxHpAX.js";const p=JSON.parse('{"title":"Edge TTS","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/edge.md","filePath":"tts-providers/edge.md","lastUpdated":1774787421000}'),r={name:"tts-providers/edge.md"};function i(n,e,s,l,c,g){return o(),a("div",null,[...e[0]||(e[0]=[d("",17)])])}const u=t(r,[["render",i]]);export{p as __pageData,u as default}; diff --git a/assets/tts-providers_index.md.Cgc87EeS.js b/assets/tts-providers_index.md.D7QeNyIs.js similarity index 95% rename from assets/tts-providers_index.md.Cgc87EeS.js rename to assets/tts-providers_index.md.D7QeNyIs.js index 72f6b51b..601c6d66 100644 --- a/assets/tts-providers_index.md.Cgc87EeS.js +++ b/assets/tts-providers_index.md.D7QeNyIs.js @@ -1 +1 @@ -import{_ as t,o as r,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"TTS Providers","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/index.md","filePath":"tts-providers/index.md","lastUpdated":1774787421000}'),i={name:"tts-providers/index.md"};function s(d,e,l,n,c,h){return r(),o("div",null,[...e[0]||(e[0]=[a('

TTS Providers

Memoh supports Text-to-Speech (TTS) so bots can synthesize spoken audio from text. The TTS system is organized into three layers:

  • TTS Provider: A service type (e.g. Edge TTS). You create named provider instances from the TTS Providers page.
  • TTS Model: A specific voice/model under a provider (e.g. edge-read-aloud). Models have configurable voice, format, speed, and pitch settings.
  • Bot Assignment: In Bot Settings, select a TTS Model. The bot can then synthesize speech in conversations.

Basic Flow

  1. Navigate to the TTS Providers page from the sidebar.
  2. Click Add and select a provider type (e.g. edge).
  3. Click Create — the provider's default model is auto-imported.
  4. Click the model to configure voice, format, speed, and pitch.
  5. Test synthesis with the built-in test button.
  6. Open a bot's General tab and select the TTS Model.
  7. Save — the bot can now synthesize speech.

Available Providers

ProviderDescription
Edge TTSFree, uses Microsoft Edge's public read-aloud API. 256+ voices across 50+ languages. No API key required.

Next Steps

  • To set up the currently available provider, continue with Edge TTS.
',12)])])}const v=t(i,[["render",s]]);export{g as __pageData,v as default}; +import{_ as t,o as r,c as o,ag as a}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"TTS Providers","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/index.md","filePath":"tts-providers/index.md","lastUpdated":1774787421000}'),i={name:"tts-providers/index.md"};function s(d,e,l,n,c,h){return r(),o("div",null,[...e[0]||(e[0]=[a('

TTS Providers

Memoh supports Text-to-Speech (TTS) so bots can synthesize spoken audio from text. The TTS system is organized into three layers:

  • TTS Provider: A service type (e.g. Edge TTS). You create named provider instances from the TTS Providers page.
  • TTS Model: A specific voice/model under a provider (e.g. edge-read-aloud). Models have configurable voice, format, speed, and pitch settings.
  • Bot Assignment: In Bot Settings, select a TTS Model. The bot can then synthesize speech in conversations.

Basic Flow

  1. Navigate to the TTS Providers page from the sidebar.
  2. Click Add and select a provider type (e.g. edge).
  3. Click Create — the provider's default model is auto-imported.
  4. Click the model to configure voice, format, speed, and pitch.
  5. Test synthesis with the built-in test button.
  6. Open a bot's General tab and select the TTS Model.
  7. Save — the bot can now synthesize speech.

Available Providers

ProviderDescription
Edge TTSFree, uses Microsoft Edge's public read-aloud API. 256+ voices across 50+ languages. No API key required.

Next Steps

  • To set up the currently available provider, continue with Edge TTS.
',12)])])}const v=t(i,[["render",s]]);export{g as __pageData,v as default}; diff --git a/assets/tts-providers_index.md.Cgc87EeS.lean.js b/assets/tts-providers_index.md.D7QeNyIs.lean.js similarity index 71% rename from assets/tts-providers_index.md.Cgc87EeS.lean.js rename to assets/tts-providers_index.md.D7QeNyIs.lean.js index 936e7a01..781ad276 100644 --- a/assets/tts-providers_index.md.Cgc87EeS.lean.js +++ b/assets/tts-providers_index.md.D7QeNyIs.lean.js @@ -1 +1 @@ -import{_ as t,o as r,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"TTS Providers","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/index.md","filePath":"tts-providers/index.md","lastUpdated":1774787421000}'),i={name:"tts-providers/index.md"};function s(d,e,l,n,c,h){return r(),o("div",null,[...e[0]||(e[0]=[a("",12)])])}const v=t(i,[["render",s]]);export{g as __pageData,v as default}; +import{_ as t,o as r,c as o,ag as a}from"./chunks/framework.CAXxHpAX.js";const g=JSON.parse('{"title":"TTS Providers","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/index.md","filePath":"tts-providers/index.md","lastUpdated":1774787421000}'),i={name:"tts-providers/index.md"};function s(d,e,l,n,c,h){return r(),o("div",null,[...e[0]||(e[0]=[a("",12)])])}const v=t(i,[["render",s]]);export{g as __pageData,v as default}; diff --git a/assets/zh_concepts_identity-and-binding.md.6tGYa9d_.js b/assets/zh_concepts_identity-and-binding.md.CwjmC7t6.js similarity index 96% rename from assets/zh_concepts_identity-and-binding.md.6tGYa9d_.js rename to assets/zh_concepts_identity-and-binding.md.CwjmC7t6.js index 291465b7..b324c56e 100644 --- a/assets/zh_concepts_identity-and-binding.md.6tGYa9d_.js +++ b/assets/zh_concepts_identity-and-binding.md.CwjmC7t6.js @@ -1 +1 @@ -import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i('

账号模型与绑定

账号模型

Memoh 将平台账号与系统账号视为两类不同实体:

  • 平台账号(ChannelIdentity 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。
  • 系统账号(User 是 Memoh 系统内账号。

平台账号在初始阶段可以不绑定系统账号。
bind 的职责是完成这两类账号的关联。

接入平台与 Bot

  • 接入平台(channel 是入站消息来源。
  • Bot 是系统内的授权与资源边界。

Bot 由系统账号管理,入站消息由平台账号产生。

为什么账号绑定是账号作用域

账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:

  • 它只负责平台账号与系统账号的绑定;
  • 不把账号绑定与成员管理语义耦合在一起;
  • 让 bot 访问控制保持独立、可演进。

账号绑定流程(当前共识)

  1. 用户以自己的系统账号申请 bind code;
  2. 平台账号在支持的接入平台会话中发送 code;
  3. 系统校验 code,完成平台账号到系统账号的绑定;
  4. bot 成员与授权由独立流程处理。

Bot 类型语义

  • Public bot:支持成员协作语义。
  • Personal bot:语义上应为单 owner,不应依赖成员机制。

注:本文档记录的是产品语义与共识方向。
部分运行时细节仍可能处于收敛阶段。

',16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default}; +import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i('

账号模型与绑定

账号模型

Memoh 将平台账号与系统账号视为两类不同实体:

  • 平台账号(ChannelIdentity 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。
  • 系统账号(User 是 Memoh 系统内账号。

平台账号在初始阶段可以不绑定系统账号。
bind 的职责是完成这两类账号的关联。

接入平台与 Bot

  • 接入平台(channel 是入站消息来源。
  • Bot 是系统内的授权与资源边界。

Bot 由系统账号管理,入站消息由平台账号产生。

为什么账号绑定是账号作用域

账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:

  • 它只负责平台账号与系统账号的绑定;
  • 不把账号绑定与成员管理语义耦合在一起;
  • 让 bot 访问控制保持独立、可演进。

账号绑定流程(当前共识)

  1. 用户以自己的系统账号申请 bind code;
  2. 平台账号在支持的接入平台会话中发送 code;
  3. 系统校验 code,完成平台账号到系统账号的绑定;
  4. bot 成员与授权由独立流程处理。

Bot 类型语义

  • Public bot:支持成员协作语义。
  • Personal bot:语义上应为单 owner,不应依赖成员机制。

注:本文档记录的是产品语义与共识方向。
部分运行时细节仍可能处于收敛阶段。

',16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/zh_concepts_identity-and-binding.md.6tGYa9d_.lean.js b/assets/zh_concepts_identity-and-binding.md.CwjmC7t6.lean.js similarity index 74% rename from assets/zh_concepts_identity-and-binding.md.6tGYa9d_.lean.js rename to assets/zh_concepts_identity-and-binding.md.CwjmC7t6.lean.js index 02018d94..835b66fa 100644 --- a/assets/zh_concepts_identity-and-binding.md.6tGYa9d_.lean.js +++ b/assets/zh_concepts_identity-and-binding.md.CwjmC7t6.lean.js @@ -1 +1 @@ -import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i("",16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default}; +import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i("",16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/zh_concepts_index.md._zNPjKkD.js b/assets/zh_concepts_index.md.C_YzW1PS.js similarity index 93% rename from assets/zh_concepts_index.md._zNPjKkD.js rename to assets/zh_concepts_index.md.C_YzW1PS.js index ac130966..487048c4 100644 --- a/assets/zh_concepts_index.md._zNPjKkD.js +++ b/assets/zh_concepts_index.md.C_YzW1PS.js @@ -1 +1 @@ -import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n('

核心概念

本章节用于定义 Memoh 的核心账号与访问概念。

概念图

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。
  • Bot:由系统账号管理的资源与访问边界。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。

为什么重要

Memoh 需要同时处理外部接入平台消息与系统内权限控制。
因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。

术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。

本章内容

',9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default}; +import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n('

核心概念

本章节用于定义 Memoh 的核心账号与访问概念。

概念图

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。
  • Bot:由系统账号管理的资源与访问边界。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。

为什么重要

Memoh 需要同时处理外部接入平台消息与系统内权限控制。
因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。

术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。

本章内容

',9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default}; diff --git a/assets/zh_concepts_index.md._zNPjKkD.lean.js b/assets/zh_concepts_index.md.C_YzW1PS.lean.js similarity index 71% rename from assets/zh_concepts_index.md._zNPjKkD.lean.js rename to assets/zh_concepts_index.md.C_YzW1PS.lean.js index 8ceea582..8afab94f 100644 --- a/assets/zh_concepts_index.md._zNPjKkD.lean.js +++ b/assets/zh_concepts_index.md.C_YzW1PS.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n("",9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default}; +import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.CAXxHpAX.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n("",9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default}; diff --git a/assets/zh_index.md.C-Pz2AC7.js b/assets/zh_index.md.DJw9w7T-.js similarity index 95% rename from assets/zh_index.md.C-Pz2AC7.js rename to assets/zh_index.md.DJw9w7T-.js index 5aaf9ee0..3b558302 100644 --- a/assets/zh_index.md.C-Pz2AC7.js +++ b/assets/zh_index.md.DJw9w7T-.js @@ -1 +1 @@ -import{_ as e,o as t,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Memoh 中文入口","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1776332711000}'),r={name:"zh/index.md"};function h(o,a,n,s,d,m){return t(),l("div",null,[...a[0]||(a[0]=[i('

Memoh 中文入口

Memoh 是一个多成员、长记忆、容器化的 AI Agent 平台。当前中文站点同时包含:

  • 已翻译的中文概念文档
  • 指向英文主文档的常用功能入口

如果你是第一次接触 Memoh,建议先看英文主文档里的功能指南;如果你正在理解账号语义、绑定关系和访问控制,再看下面的中文概念页。

常用功能入口

中文概念文档

面向文档维护者

当前中文维护范围

当前中文内容优先覆盖账号语义与访问控制相关的概念:

  • 区分系统账号与平台账号
  • 解释为什么账号绑定是账号作用域
  • 说明账号绑定与 bot 访问控制之间的关系

说明:“平台账号”指用户在外部平台上的真实账号,例如飞书账号,而不是 Memoh 系统账号。

',14)])])}const f=e(r,[["render",h]]);export{u as __pageData,f as default}; +import{_ as e,o as t,c as l,ag as i}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Memoh 中文入口","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1776332711000}'),r={name:"zh/index.md"};function h(o,a,n,s,d,m){return t(),l("div",null,[...a[0]||(a[0]=[i('

Memoh 中文入口

Memoh 是一个多成员、长记忆、容器化的 AI Agent 平台。当前中文站点同时包含:

  • 已翻译的中文概念文档
  • 指向英文主文档的常用功能入口

如果你是第一次接触 Memoh,建议先看英文主文档里的功能指南;如果你正在理解账号语义、绑定关系和访问控制,再看下面的中文概念页。

常用功能入口

中文概念文档

面向文档维护者

当前中文维护范围

当前中文内容优先覆盖账号语义与访问控制相关的概念:

  • 区分系统账号与平台账号
  • 解释为什么账号绑定是账号作用域
  • 说明账号绑定与 bot 访问控制之间的关系

说明:“平台账号”指用户在外部平台上的真实账号,例如飞书账号,而不是 Memoh 系统账号。

',14)])])}const f=e(r,[["render",h]]);export{u as __pageData,f as default}; diff --git a/assets/zh_index.md.C-Pz2AC7.lean.js b/assets/zh_index.md.DJw9w7T-.lean.js similarity index 69% rename from assets/zh_index.md.C-Pz2AC7.lean.js rename to assets/zh_index.md.DJw9w7T-.lean.js index cb971178..f9edabe0 100644 --- a/assets/zh_index.md.C-Pz2AC7.lean.js +++ b/assets/zh_index.md.DJw9w7T-.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Memoh 中文入口","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1776332711000}'),r={name:"zh/index.md"};function h(o,a,n,s,d,m){return t(),l("div",null,[...a[0]||(a[0]=[i("",14)])])}const f=e(r,[["render",h]]);export{u as __pageData,f as default}; +import{_ as e,o as t,c as l,ag as i}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"Memoh 中文入口","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1776332711000}'),r={name:"zh/index.md"};function h(o,a,n,s,d,m){return t(),l("div",null,[...a[0]||(a[0]=[i("",14)])])}const f=e(r,[["render",h]]);export{u as __pageData,f as default}; diff --git a/assets/zh_style_terminology.md.CzqhSoQX.js b/assets/zh_style_terminology.md.DjkmyoSc.js similarity index 96% rename from assets/zh_style_terminology.md.CzqhSoQX.js rename to assets/zh_style_terminology.md.DjkmyoSc.js index 00b24a8f..33e81e44 100644 --- a/assets/zh_style_terminology.md.CzqhSoQX.js +++ b/assets/zh_style_terminology.md.DjkmyoSc.js @@ -1 +1 @@ -import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a('

术语规范

适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。

规范术语

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 内账号。
  • 接入平台(channel:承载入站消息的外部平台。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。
  • 绑定码(Bind Code):用于账号绑定的一次性代码。
  • Bot:由系统账号管理的资源与授权边界。

推荐写法

  • 面向产品语义时,优先写 “平台账号”,不要直接写 actor。
  • 描述业务行为时,优先写 “接入平台”,不要直接写 channel。
  • 首次出现保留技术别名,后续可只用中文术语:
    • 平台账号(ChannelIdentity
    • 系统账号(User
    • 账号绑定(bind

禁用或不推荐写法

  • 在概念文档中直接使用 actor(除非明确引用代码符号)。
  • 使用含糊表述如 “平台用户”(未区分系统账号与平台账号)。
  • 写出“平台账号是 Memoh 内部账号”这类错误语义。

示例

  • 正确:“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”
  • 正确:“账号绑定用于把平台账号关联到系统账号。”
  • 错误:“Actor 是 Memoh 里的用户。”

自检清单

  • 是否明确区分了系统账号与平台账号?
  • 叙述中是否将 channel 表述为接入平台?
  • 是否仅在首处保留技术别名?
',12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; +import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a('

术语规范

适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。

规范术语

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 内账号。
  • 接入平台(channel:承载入站消息的外部平台。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。
  • 绑定码(Bind Code):用于账号绑定的一次性代码。
  • Bot:由系统账号管理的资源与授权边界。

推荐写法

  • 面向产品语义时,优先写 “平台账号”,不要直接写 actor。
  • 描述业务行为时,优先写 “接入平台”,不要直接写 channel。
  • 首次出现保留技术别名,后续可只用中文术语:
    • 平台账号(ChannelIdentity
    • 系统账号(User
    • 账号绑定(bind

禁用或不推荐写法

  • 在概念文档中直接使用 actor(除非明确引用代码符号)。
  • 使用含糊表述如 “平台用户”(未区分系统账号与平台账号)。
  • 写出“平台账号是 Memoh 内部账号”这类错误语义。

示例

  • 正确:“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”
  • 正确:“账号绑定用于把平台账号关联到系统账号。”
  • 错误:“Actor 是 Memoh 里的用户。”

自检清单

  • 是否明确区分了系统账号与平台账号?
  • 叙述中是否将 channel 表述为接入平台?
  • 是否仅在首处保留技术别名?
',12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; diff --git a/assets/zh_style_terminology.md.CzqhSoQX.lean.js b/assets/zh_style_terminology.md.DjkmyoSc.lean.js similarity index 71% rename from assets/zh_style_terminology.md.CzqhSoQX.lean.js rename to assets/zh_style_terminology.md.DjkmyoSc.lean.js index 91f9812c..8da864ef 100644 --- a/assets/zh_style_terminology.md.CzqhSoQX.lean.js +++ b/assets/zh_style_terminology.md.DjkmyoSc.lean.js @@ -1 +1 @@ -import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a("",12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; +import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.CAXxHpAX.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a("",12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; diff --git a/blogs/2026-02-16.html b/blogs/2026-02-16.html index c188ce80..a3a79816 100644 --- a/blogs/2026-02-16.html +++ b/blogs/2026-02-16.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Introduction to Memoh - The Case for an Always-On, Containerized Home Agent

Overview

We enter 2026 with a familiar tension: models get smarter every quarter, but the “agent experience” still breaks on context, latency, privacy, and real-world workflows. Over the past year, we kept circling three questions:

  • Where does the capability boundary of agents actually sit?
  • What’s the real value of long context?
  • What hardware form factor makes “always-on, personal AI” feel natural?

Memoh is our attempt to turn those questions into something buildable—not a manifesto, but a system that can survive contact with reality.

Story Time

Time travels fast. Somewhere between “I’ll remember this” and “wait, why did we decide that?”, a year disappears.

That’s the annoying part of building: most progress doesn’t feel like progress while it’s happening. It’s just a stream of small choices, half-finished threads, late-night fixes, and the occasional moment that actually clicks. The kind of moment where you sit back and think: okay—this is real.

Around the same time, I noticed something else: the internet started to feel smoother—and worse.

Text got cleaner, longer, more polite, more… empty. You could smell when something was generated: low information density, too many metaphors, too much agreement, not enough stakes.

I caught myself doing it too.

So I started forcing a constraint: say it plainly. Keep the density. Don’t inflate. Don’t hide behind style. If something mattered, anchor it to a real moment, a real trade-off, a real cost paid.

Because the thing LLMs can’t give you is not “intelligence.” It’s weight. The feeling that a human actually stood somewhere in time and wrote from that position.

That’s when I realized what I wanted wasn’t “an AI that can talk.” I wanted an AI that can live with you—quietly, continuously, accumulating context without turning your life into content sludge.

Phones were our first instinct—it's personal, powerful, always there. But mobile OS is closed: without OEM privileges you can build an app, not ambient infrastructure.

So we looked for the always-on node every home already has: the router (conceptually). Then the economics clash—router-class hardware can’t carry memory, RAG, tools, and multi-user agents. The device evolves: more RAM/storage, a screen, mic/speaker, tiny battery for take out, portable form.

Eventually it stops being a router. It becomes a new category: a home agent base layer.

What

Memoh is a containerized home/studio AI base layer: cloud-grade model capability paired with local-first memory (knowledge base, RAG/search, conversation history) that stays under your control.

Why

Long-context models raise the ceiling for agents—but they also make “fully local” expensive and “fully cloud” uncomfortable. People don’t want to re-brief AI every day, and they don’t want their durable context trapped in someone else’s feed. Containerization makes Memoh portable, reproducible, and safe to run as always-on infrastructure—so continuity becomes cheap, private, and dependable.

How

We run Memoh as a containerized stack: isolated services for storage (files/DB/vector index), retrieval, tool/runtime execution, and the control plane. Inference calls cloud APIs when you need frontier capability; durable memory and indexing stay local. The device acts as an always-on node (router-like, not a router) serving multiple users with strict boundaries: sharing is explicit, private context remains private, and everything is deployable/upgradable as versioned containers.

Features

  • Multi-bot Management: Create multiple bots; humans and bots, or bots with each other, can chat privately, in groups, or collaborate.

    Multi-bot Management

  • Containerized: Each bot runs in its own isolated container. Bots can freely execute commands, edit files, and access the network within their containers—like having their own computer.

    Containerized

  • Memory Engineering: Every chat is stored in the database, with the last 24 hours of context loaded by default. Each conversation turn is stored as memory and can be retrieved by bots through semantic search.

    Memory Engineering

  • Various Platforms: Supports Telegram, Lark (Feishu), and more.

  • Simple and Easy to Use: Configure bots and settings for Provider, Model, Memory, Channel, MCP, and Skills through a graphical interface—no coding required to set up your own AI bot.

  • Scheduled Tasks: Schedule tasks with cron expressions to run commands at specified times.

  • More...

Compare to OpenClaw

We share a core belief: both Memoh and OpenClaw treat the agent as more than a chatbox—we give the LLM a playground: a real environment where it can remember, use tools, and iterate.

Where Memoh differs:

  • Lighter and Faster: built as home/studio infrastructure, can be held in the edge device
  • Containerized by default: each bot gets an isolated container (files/commands/network/jobs)
  • Hybrid split: cloud inference, local-first memory + indexing
  • Multi-user first: explicit sharing and privacy boundaries, support a2a (Agent2Agent)
  • Sustainable: have an experienced team and confidence to push forward and build it

Conclusion

Memoh is built for one thing: always-on continuity—an AI that stays online, and a memory that stays yours.

We keep frontier inference in the cloud, keep durable context local, and run everything as a containerized, always-on stack. If you want an agent that feels less like an app and more like home infrastructure, that’s the bet Memoh is making.

Furthermore, we will continue to operate and permanently open-source Memoh, making it a product with long impact.

Published under AGPLv3

- + \ No newline at end of file diff --git a/blogs/index.html b/blogs/index.html index 07a2b012..1398c3cf 100644 --- a/blogs/index.html +++ b/blogs/index.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Blogs

This section contains the latest blogs about Memoh.

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/dingtalk.html b/channels/dingtalk.html index 8022e0fc..b4161b88 100644 --- a/channels/dingtalk.html +++ b/channels/dingtalk.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

DingTalk Channel Configuration

Memoh supports DingTalk bots for private chats and group chats. The adapter uses DingTalk's stream connection for inbound events and the official APIs for outbound replies and media.

Step 1: Create A DingTalk App

  1. Open the DingTalk developer platform for your organization.
  2. Create or choose the app that will act as your bot.
  3. Enable the bot / messaging capability for that app.
  4. Copy the app credentials:
    • App Key
    • App Secret

Depending on your DingTalk environment, you may also need to grant message permissions and publish the app before it is available to end users.

Step 2: Configure Memoh

  1. Open your bot in the Memoh Web UI.
  2. Go to Platforms.
  3. Click Add Channel and choose DingTalk.
  4. Fill in App Key and App Secret.
  5. Click Save and Enable.

Memoh maintains the DingTalk stream connection automatically. For the normal setup, you do not need to manually paste a webhook callback URL.

Step 3: Verify Messaging

After the channel is enabled:

  1. Send a private message to the DingTalk bot, or mention it in a supported group chat.
  2. Confirm the bot receives the message and can reply.

Features Supported

  • Private chats
  • Group chats
  • Text and Markdown-style output
  • Replies
  • Attachments and media

Current behavior note:

  • Outbound responses are non-streaming on DingTalk in Memoh.

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/discord.html b/channels/discord.html index 836cc9ca..47ad5884 100644 --- a/channels/discord.html +++ b/channels/discord.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Discord Channel Configuration

Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.

Step 1: Create a Discord Application

  1. Go to the Discord Developer Portal.
  2. Click New Application and give it a name.
  3. In the left sidebar, go to Bot.
  4. Click Reset Token to generate a Bot Token. Copy this token and store it securely.

Step 2: Configure Bot Settings

  1. Scroll down to the Privileged Gateway Intents section.
  2. Enable Message Content Intent, Server Members Intent and Presence Intent.
  3. Save changes.

Step 3: Invite the Bot to Your Server

  1. Go to OAuth2 > URL Generator.
  2. Select scopes: bot, applications.commands.
  3. Select permissions: Send Messages, Read Message History, Embed Links, Attach Files.
  4. Copy the generated URL and open it in your browser.
  5. Select the server you want to add the bot to and authorize it.

Official Guide: Discord Developer Portal - Bots

Step 4: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Discord.
  3. Paste your Bot Token.
  4. Click Save and Enable.

Features Supported

  • Message Content: Full access to chat text.
  • Attachments: Support for images and files.
  • Commands: Integration with Discord's slash commands (if configured via MCP).

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/feishu.html b/channels/feishu.html index 15634470..5a723608 100644 --- a/channels/feishu.html +++ b/channels/feishu.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Feishu (Lark) Channel Configuration

Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.

Step 1: Create a Feishu App

  1. Go to the Feishu Open Platform and log in.
  2. Click Create Custom App.
  3. Enter a name and description, then click Create.
  4. In the left sidebar, go to App Settings > Credentials & Basic Info.
  5. Copy your App ID and App Secret.

Step 2: Enable Bot Capability

  1. In the Feishu Developer Console, go to Capabilities > Bot.
  2. Click Enable Bot.

Step 3: Configure Permissions

  1. Go to Capabilities > Permissions.
  2. Search for and enable the following permissions (at minimum):
    • im:message (Receive and send messages)
    • im:chat (Access group chat information)
  3. Click Apply for Permissions if required by your organization.

Step 4: Configure Events (Webhook Mode)

  1. In Memoh, go to your Bot's Platforms tab and add a Feishu channel.
  2. Choose Inbound Mode: webhook.
  3. Fill in your App ID and App Secret.
  4. Click Save. Memoh will generate a Webhook Callback URL.
  5. Copy this URL.
  6. In the Feishu Console, go to App Settings > Event Subscriptions.
  7. Paste the URL into the Verification URL field and save.
  8. Add events like Receive Message (im.message.receive_v1).

Official Guide: Feishu Custom Bot Guide

Step 5: Publish Your App

  1. In the Feishu Console, go to App Release > Version Management & Release.
  2. Click Create a Version, fill in the details, and submit for approval.
  3. Once approved and published, the bot is ready to use.

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/index.html b/channels/index.html index 9b07930b..781c3498 100644 --- a/channels/index.html +++ b/channels/index.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Channels Overview

Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.

Memoh currently supports the following channels:

  • Slack: Workspace messaging with Socket Mode, threads, files, and reactions.
  • Telegram: Feature-rich integration with streaming and attachment support.
  • Feishu (Lark): Enterprise-ready integration for business workflows.
  • Discord: Community-focused integration for servers and direct messages.
  • QQ: Quick setup for personal DM bots via the dedicated AI bot registration portal.
  • Matrix: Decentralized messaging protocol support for any Matrix homeserver.
  • Misskey: Federated social/chat style integration with replies and reactions.
  • DingTalk: Enterprise chat integration for private and group conversations.
  • WeCom (WeWork): Enterprise messaging integration for WeCom workspaces.
  • WeChat: Personal messaging via QR login.
  • WeChat Official Account: Official account webhook integration for private message scenarios.
  • Email: Connect via SMTP providers, Mailgun, or Gmail OAuth (configured through Email Providers).
  • Web: Built-in chat interface for immediate access.

WeChat vs WeChat Official Account

Memoh supports two different WeChat-related adapters:

  • WeChat (weixin) is the personal-account style integration that relies on QR login.
  • WeChat Official Account (wechatoa) is the official-account / webhook style integration that uses App ID, App Secret, Token, and optional AES settings.

Choose the one that matches your actual WeChat deployment model.

General Setup Flow

  1. Create an external app/bot: Register your bot on the target platform.
  2. Obtain credentials: Fetch API tokens, App IDs, app secrets, or access tokens.
  3. Configure in Memoh: Add the channel from your bot's Platforms tab.
  4. Save and enable: Activate the channel to start receiving and sending messages.

Depending on the platform, the final step may involve:

  • copying a webhook callback URL into the platform console
  • approving a QR login on mobile
  • leaving a long-lived stream/WebSocket connection running through Memoh

Choose a channel from the sidebar to see detailed configuration guides for each platform.

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/matrix.html b/channels/matrix.html index d5689938..4bcb1452 100644 --- a/channels/matrix.html +++ b/channels/matrix.html @@ -9,11 +9,11 @@ - + - - - + + + @@ -29,7 +29,7 @@ }, "password": "<password>" }'
  • Option B: Extract from a client

Important: Keep the access token secret. Anyone with this token can act as your bot account.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Matrix.
  3. Fill in the required fields:
FieldRequiredDescription
Homeserver URLYesThe base URL of your Matrix homeserver (e.g., https://matrix.org).
Access TokenYesThe bot account's access token.
User IDYesThe bot's Matrix user ID (e.g., @mybot:matrix.org).
Sync TimeoutNoLong-polling timeout in seconds (default: 30).
Auto Join InvitesNoAutomatically join rooms when invited (default: enabled).
  1. Click Save and Enable.

Step 3: Invite the Bot

  1. Open your Matrix client (Element, etc.).
  2. Invite the bot's user ID to a room, or start a direct message.
  3. If Auto Join Invites is enabled, the bot will automatically accept and join.

Features Supported

  • Message Content: Full access to text messages.
  • Rooms: Join and participate in group rooms.
  • Direct Messages: Private conversations with individual users.
  • Streaming: Responses are streamed as they are generated.
  • Markdown: Support for formatted text.
  • Media/Attachment: Bots can receive and send files or photo.
  • Check the roadmap for more features of Matrix.

Official Resources

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/misskey.html b/channels/misskey.html index 3cf22eed..25896b3b 100644 --- a/channels/misskey.html +++ b/channels/misskey.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Misskey Channel Configuration

Memoh can connect a bot to a Misskey server so it can read inbound mentions and reply as a Misskey account. This adapter is best for text-first social interactions on self-hosted or public Misskey instances.

Step 1: Prepare A Misskey Account And Token

  1. Sign in to the Misskey instance you want to use.
  2. Create or choose the account that should represent your bot.
  3. Generate an Access Token for that account.

Memoh needs:

  • Instance URL: for example https://misskey.io
  • Access Token: a token for the bot account

The exact token-creation UI varies by Misskey instance. Make sure the token is allowed to read inbound events for the bot account and publish replies.

Step 2: Configure Memoh

  1. Open your bot in the Memoh Web UI.
  2. Go to Platforms.
  3. Click Add Channel and choose Misskey.
  4. Enter the Instance URL.
  5. Paste the Access Token.
  6. Click Save and Enable.

Memoh uses these credentials to discover the bot identity and start the Misskey connection.

Step 3: Start Chatting

After the channel is enabled, users can interact with the bot on that Misskey instance.

Misskey in Memoh is generally best suited for:

  • replies to users
  • text and Markdown-style output
  • reaction-aware social conversations

Features Supported

  • Text
  • Markdown
  • Replies
  • Reactions

Current limitations:

  • No attachments / media upload
  • No streaming output

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/qq.html b/channels/qq.html index 0e8bfe7f..14f5e398 100644 --- a/channels/qq.html +++ b/channels/qq.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

QQ Channel Configuration

Connecting your Memoh Bot to QQ allows it to interact with users through QQ's official Bot platform.

Step 1: Create a QQ Bot

  1. Go to the QQ Bot Open Platform and log in with your QQ account.
  2. Click Create Bot (创建机器人) - no approval required. Each account can create up to 5 bots.
  3. Copy the AppID and AppSecret displayed on the page.

Important: AppSecret is only shown once. Save it securely - viewing it again will force a reset.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select QQ.
  3. Paste your AppID and AppSecret.
  4. Configure optional settings:
    • Markdown Support: Enable Markdown formatting (default: enabled).
    • Enable Input Hint: Show typing indicators (default: enabled).
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your QQ identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select QQ and click Generate.
  3. Copy the code and send it to your bot in a QQ direct message.

Features Supported

  • Message Content: Full support for text messages.
  • Markdown: Rich formatting with bold, italic, code blocks, and links.
  • Attachments: Support for images and files.
  • Typing Indicators: Visual feedback while generating responses.
  • Target Types: C2C (direct message), group, and channel.

Official Resources

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/slack.html b/channels/slack.html index 3a8dcb93..dd3ee9f9 100644 --- a/channels/slack.html +++ b/channels/slack.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Slack Channel Configuration

Connecting your Memoh Bot to Slack allows it to receive direct messages, participate in channels and threads, read attachments, send files, and use streaming replies.

Step 1: Create a Slack App

  1. Go to the Slack API dashboard and create a new app.
  2. Choose the workspace where you want to install the bot.
  3. Open Basic Information and keep this app page open for the next steps.

Step 2: Enable Socket Mode

Memoh's Slack adapter uses Socket Mode, so you need an app-level token in addition to the bot token.

  1. In Basic Information, enable Socket Mode.
  2. Create an App-Level Token with the connections:write scope.
  3. Copy the generated token. It starts with xapp-.

Step 3: Configure Bot Token Scopes

In OAuth & Permissions, add the bot token scopes required by the current Slack adapter:

  • app_mentions:read - receive bot mentions in channels
  • channels:history - read messages in public channels
  • groups:history - read messages in private channels
  • im:history - read direct messages
  • mpim:history - read group direct messages
  • chat:write - send replies and thread messages
  • files:read - read uploaded files and images
  • files:write - upload outbound files
  • reactions:write - add and remove reactions

You should also add these recommended scopes if you want Slack conversation names and metadata to show up more completely in Memoh:

  • channels:read
  • groups:read
  • im:read
  • mpim:read

Step 4: Subscribe to Bot Events

In Event Subscriptions, enable bot events and add:

  • app_mention
  • message.channels
  • message.groups
  • message.im
  • message.mpim

These are the inbound event types currently handled by the Slack adapter.

Step 5: Install the App to Your Workspace

  1. In OAuth & Permissions, click Install to Workspace.
  2. Review the permission screen.
  3. Authorize the app.
  4. Copy the Bot User OAuth Token. It starts with xoxb-.

Make sure the xoxb-... bot token and the xapp-... app-level token come from the same Slack app and workspace.

Step 6: Configure Memoh

  1. Open your Bot detail page in the Memoh Web UI.
  2. Go to the Platforms tab.
  3. Click Add Channel and select Slack.
  4. Fill in:
    • Bot Token: your xoxb-... token
    • App-Level Token: your xapp-... token
  5. Click Save and Enable.

Step 7: Add the Bot to Conversations

After the channel is enabled, the Slack app still needs to be present in the conversations where you want it to work.

  • For direct messages: open a DM with the app and send a message.
  • For public channels: invite the bot to the channel.
  • For private channels: invite the bot explicitly after installation.

If the bot can send messages but cannot read uploaded images or files, check that files:read is enabled. If it connects but receives no incoming messages, check the bot events and the matching history scopes again.

Features Supported

  • Direct Messages and Channels: Support for DMs, public channels, private channels, and threads.
  • Attachments: Read uploaded images and files from Slack, and send files back.

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/telegram.html b/channels/telegram.html index 85525813..ac2dfabf 100644 --- a/channels/telegram.html +++ b/channels/telegram.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Telegram Channel Configuration

This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.

Step 1: Create a Telegram Bot

You need to create a bot on Telegram to get an API token.

  1. Open Telegram and search for the official @BotFather bot.
  2. Send the /newbot command.
  3. Follow the prompts:
    • Name: Choose a display name for your bot (e.g., My Memoh Bot).
    • Username: Choose a unique username ending in bot (e.g., my_memoh_bot).
  4. BotFather will provide you with an API Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz). Keep this token secret.

Official Guide: Telegram Bot Tutorial

Step 2: Configure Memoh

  1. Go to your Bot's Detail Page in the Memoh Web UI.
  2. Select the Platforms tab.
  3. Click Add Channel and select Telegram.
  4. Paste your API Token into the credentials field.
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your Telegram identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select Telegram and click Generate.
  3. Copy the code.
  4. Open a chat with your new bot on Telegram and send the bind code.
  5. The bot should respond that your identity is successfully linked.

Features Supported

  • Streaming: Responses appear as the bot "thinks."
  • Markdown: Support for bold, italic, code blocks, and links.
  • Attachments: Send images or files to the bot; the bot can also send files back.
  • Replies: The bot understands context from message replies.

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/wechatoa.html b/channels/wechatoa.html index f1083f4d..97300610 100644 --- a/channels/wechatoa.html +++ b/channels/wechatoa.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

WeChat Official Account Channel Configuration

This guide covers the WeChat Official Account adapter in Memoh. It is different from the personal WeChat QR-login adapter: this one is for official-account webhook integration and is intended for inbound private-message scenarios.

Step 1: Prepare Official Account Credentials

From the WeChat Official Account platform, prepare:

  • App ID
  • App Secret
  • Token

You may also need:

  • Encoding AES Key if you use encrypted webhook delivery
  • an outbound HTTP Proxy URL if your deployment must reach WeChat APIs through a proxy

Step 2: Add The Channel In Memoh

  1. Open your bot in the Memoh Web UI.
  2. Go to Platforms.
  3. Click Add Channel and choose WeChat Official Account.
  4. Fill in the required fields:
    • App ID
    • App Secret
    • Token
  5. Choose the Encryption Mode.
  6. If you use safe or compat mode, also provide the Encoding AES Key.
  7. Save the channel.

Memoh generates a Webhook Callback URL after the channel has been saved.

Step 3: Configure The WeChat Platform

  1. Copy the Webhook Callback URL from Memoh.
  2. Paste it into the WeChat Official Account platform callback configuration.
  3. Make sure the WeChat platform and Memoh use the same:
    • Token
    • Encryption Mode
    • Encoding AES Key when encryption is enabled

WeChat will verify the callback before delivering real messages.

Step 4: Enable And Test

  1. Enable the channel in Memoh.
  2. Send a test private message from the official account side.
  3. Confirm that Memoh receives the message and the bot can reply.

Features Supported

  • Private chats
  • Replies
  • Attachments and media

Current behavior notes:

  • This adapter is intended for private-message conversations, not group-style chats.
  • Outbound responses are non-streaming on this channel.

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/wecom.html b/channels/wecom.html index 81f5acc9..f43e14ad 100644 --- a/channels/wecom.html +++ b/channels/wecom.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

WeCom (WeWork) Channel Configuration

Connecting your Memoh Bot to WeCom (企业微信) allows it to interact with users within your organization's WeCom workspace.

Step 1: Create a WeCom Bot

  1. Log in to the WeCom Admin Console.
  2. Navigate to App Management > Custom Apps or Bot Management.
  3. Create a new bot application.
  4. Note the Bot ID and Secret credentials.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeCom.
  3. Fill in the required fields:
FieldRequiredDescription
Bot IDYesThe WeCom bot identifier.
SecretYesThe bot's authentication credential.
WebSocket URLNoCustom WebSocket endpoint (uses default if empty).
  1. Click Save and Enable.

Step 3: Start Chatting

Once the channel is enabled, the bot will connect to WeCom via WebSocket and begin receiving messages. Users in your WeCom workspace can send messages to the bot directly or in group chats.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Group Chats: Participate in group conversations.
  • Streaming: Responses are streamed in real-time.

Official Resources

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/weixin.html b/channels/weixin.html index 1fa2c763..0b015f82 100644 --- a/channels/weixin.html +++ b/channels/weixin.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

WeChat Channel Configuration

Connecting your Memoh Bot to WeChat allows it to interact with users directly via WeChat personal messaging. Setup is simple — just scan a QR code.

Step 1: Add WeChat Channel in Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeChat.

Step 2: Scan the QR Code

  1. Click Start QR Login. Memoh will fetch a QR code from the WeChat platform.
  2. Open WeChat on your phone and scan the displayed QR code.
  3. Confirm the login on your phone when prompted.
  4. Once confirmed, Memoh automatically saves the credentials — no manual token or API key entry is needed.

The QR code has a limited validity window. If it expires before you scan, click Start QR Login again to get a fresh one.

Step 3: Start Chatting

After the QR login succeeds, the channel is automatically enabled. Users can now send messages to the bot directly in WeChat.

Optional Settings

FieldDescription
Enable TypingShow typing indicators while generating responses.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Attachments: Support for images and media.
  • Typing Indicators: Visual feedback while generating responses (when enabled).

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/access.html b/getting-started/access.html index cf9d1463..e2843354 100644 --- a/getting-started/access.html +++ b/getting-started/access.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Bot Access Control

Memoh uses an ACL (Access Control List) system to control who can interact with your bot. You can define prioritized rules to allow or deny specific users, channel identities, or entire channel types — all from the bot's Access tab.


Quick Start: ACL Presets

When you create a bot, Memoh lets you start from an ACL preset. Presets are just a shortcut for common access patterns.

PresetResult
allow_allDefault effect is allow; anyone can chat unless you add deny rules later
private_onlyDefault effect is deny; private conversations are allowed
group_onlyDefault effect is deny; group conversations are allowed
group_and_thread_onlyDefault effect is deny; groups and threads are allowed
deny_allDefault effect is deny; nobody except the owner/admin path can chat until you add allow rules

These presets only define the starting point. After creation, you can refine everything from the Access tab.


Concepts

Default Effect

Each bot has a default effect (allow or deny) that applies when no ACL rule matches an incoming message. Configure this from the bot's Access tab.

  • Allow: Anyone can chat with the bot unless explicitly denied by a rule.
  • Deny: Only the bot owner, admins, and explicitly allowed subjects can chat.

Subject Types

ACL rules can target three kinds of subjects:

SubjectDescription
AllMatches every incoming message regardless of sender. Use this for global allow/deny rules.
Channel IdentityA specific identity on an external channel (e.g., a Telegram user, a Discord member). Useful for controlling access at the individual level.
Channel TypeAn entire channel platform (e.g., all Telegram users, all Discord users). Useful for platform-level access control.

Rule Effects

Each rule has an effect:

  • Allow — Grants the subject permission to chat with the bot.
  • Deny — Blocks the subject from chatting with the bot.

Priority-Based Evaluation

Rules are evaluated in priority order (top to bottom). The first matching rule determines the outcome:

  1. Bot owner or system admin → Always allowed (bypasses ACL).
  2. Rules are checked from highest priority (top) to lowest (bottom).
  3. The first rule whose subject matches the sender is applied.
  4. If no rule matches → the default effect is applied.

This means rule ordering matters. A deny rule placed above an allow rule will take precedence for matching subjects.


Managing Access

Open a bot's Access tab to configure its access control.

Start With A Preset, Then Refine

Recommended workflow:

  1. Pick an ACL preset when creating the bot.
  2. Open the Access tab.
  3. Confirm the resulting Default Effect.
  4. Add or reorder rules only where the preset is too broad or too narrow.

Adding Rules

  1. Click Add Rule.
  2. Select a subject type:
    • All: Applies to everyone.
    • Channel Identity: Search and select a specific channel identity the bot has seen before.
    • Channel Type: Select an entire channel platform.
  3. Choose the effect: allow or deny.
  4. Optionally set source scope to restrict the rule to a specific context:
    • Channel: Only applies when the message comes from a specific channel config.
    • Conversation Type: private, group, or thread.
    • Conversation ID: A specific chat/group ID.
    • Thread ID: A specific thread within a conversation (requires Conversation ID).
  5. Click Save.

Reordering Rules

Rules can be drag-and-dropped to change their priority. Higher rules (closer to the top) are evaluated first. After reordering, click Save to persist the new order.

Source Scope

Source scope lets you create fine-grained rules. For example:

  • Allow a user to chat only via Telegram, but not Discord.
  • Block an entire channel type only in group conversations.
  • Restrict access to a specific thread in a specific group.

Scope fields form a hierarchy: Channel → Conversation Type → Conversation ID → Thread ID. Each level is optional, but a Thread ID requires a Conversation ID.


What The Presets Actually Mean

This is the most useful mental model:

  • allow_all is best for open bots and public demos.
  • private_only is best when the bot should only answer in direct chats.
  • group_only is best for bots intended to live only in shared rooms.
  • group_and_thread_only is best for bots that should work in group spaces and threaded sub-conversations, but not in private DMs.
  • deny_all is best for highly restricted bots where you want to add every allow rule manually.

If you are unsure, start with allow_all for a personal test bot or deny_all for anything sensitive.


Examples

Open Bot (Anyone Can Chat)

  1. Choose preset allow_all, or set ACL Default Effect to allow.
  2. No rules needed — everyone is allowed by default.

Private Bot with Selected Users

  1. Choose preset deny_all, or set ACL Default Effect to deny.
  2. Add allow rules for each authorized channel identity.
  3. Only listed subjects (plus the bot owner and admins) can trigger the bot.

Open Bot with Blocked Users

  1. Choose preset allow_all, or set ACL Default Effect to allow.
  2. Add deny rules for problematic channel identities at the top of the list.
  3. Everyone except denied subjects can chat with the bot.

Platform-Specific Access

  1. Start from preset deny_all or private_only, depending on your goal.
  2. Add an allow rule with subject type Channel Type set to telegram.
  3. Only Telegram users can chat with the bot — messages from other channels are denied.

Channel-Scoped Access

  1. Add an allow rule for a specific channel identity.
  2. Set the Source Scope channel to your Telegram channel config.
  3. The user can only chat with the bot via that specific Telegram channel.

Debugging Access Decisions

When ACL behavior is confusing, use:

  • the Access tab to inspect rule order and default effect
  • the /access slash command to inspect the current identity, role, and ACL evaluation context

This is especially helpful when a user is linked across multiple channels or when group/thread scoping is involved.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/bot.html b/getting-started/bot.html index 4db07f8d..dbc91e84 100644 --- a/getting-started/bot.html +++ b/getting-started/bot.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Bot Management

A Bot is an independent AI agent that comes with its own isolated container, persistent memory, and configurable personality. Bots can chat via various messaging platforms (Channels) and perform complex tasks using specialized tools.

Creating a Bot

  1. Navigate to the Bots page from the sidebar.
  2. Click the Create Bot button.
  3. Fill in the basic info:
    • Display Name: The name users will see in chats.
    • Avatar: A URL for the bot's profile picture.
    • Timezone: Optional per-bot timezone. If left empty, the bot inherits the user or system timezone.
    • ACL Preset: Quick-start access policy such as allow_all or private_only.
  4. Click Create.

Bot Detail Page

Once created, clicking on a bot card takes you to its Detail Page, where you can manage its entire lifecycle through specialized tabs.

Tab Overview

TabDescription
OverviewHealth checks for container, database, channels, and memory.
GeneralCore runtime settings: chat/title/image models, memory/search/browser/TTS bindings, timezone, language, reasoning, and danger zone.
ContainerContainer lifecycle (create/start/stop), snapshots, data export/import.
MemoryBrowse, search, create, edit, and compact memories.
PlatformsChannel configurations such as Telegram, Discord, Feishu, QQ, Matrix, WeCom, WeChat, Misskey, DingTalk, and Web.
AccessACL rules and default access behavior.
EmailEmail bindings and outbox.
TerminalInteractive terminal access to the bot's container.
FilesFile manager for the bot's container filesystem.
MCPMCP connection management (Stdio, Remote, OAuth).
HeartbeatHeartbeat configuration, model selection, and execution logs.
CompactionSession context compaction settings and logs.
ScheduleCron-based scheduled tasks and execution logs.
SkillsMarkdown-based skill files that define bot personality and capabilities.

Configuring the Bot's Core Settings

After creating a bot, the most important step is configuring its runtime settings. These settings are split across a few tabs instead of living in one giant form.

  1. Navigate to your bot's Detail Page.
  2. Start with the General tab for chat/runtime bindings.
  3. Use the Heartbeat tab for scheduled autonomous activity.
  4. Use the Compaction tab for session context compaction behavior.
  5. Use the Access tab to refine ACL rules after the initial ACL preset.

If you have not created these resources yet, set them up first:


General Tab Reference

The General tab contains the settings that shape everyday conversation behavior.

FieldDescription
Chat ModelThe main LLM used for generating chat responses.
Title ModelOptional model used to generate session titles.
Image Generation ModelOptional model used by image-generation features. Pick a chat model that supports image-output.
Memory ProviderThe memory backend assigned to the bot. The built-in provider can optionally define its own memory and embedding models.
Search ProviderThe search engine used for web browsing capabilities.
TTS ModelOptional speech model used for text-to-speech output. Speech models come from the TTS Providers flow, not the normal chat provider flow.
Browser ContextThe browser environment used for web automation, such as viewport, locale, and mobile behavior.
TimezonePer-bot timezone. If empty, Memoh inherits the user timezone and then falls back to the system timezone.
LanguageThe bot's primary communication language.
Reasoning EnabledAvailable when the selected chat model exposes reasoning compatibility.
Reasoning EffortSet the level of reasoning effort (low, medium, high).

Notes:

  • The Image Generation Model is intentionally separate from the normal chat model so you can dedicate an image-capable model only to visual generation tasks.
  • The TTS Model comes from the TTS Providers system and uses speech models such as Edge TTS voices.
  • The selected chat model's context_window influences session status reporting and Context Compaction.

Heartbeat Tab Reference

Heartbeat is configured from its own tab.

FieldDescription
Heartbeat EnabledEnable or disable periodic autonomous activity.
Heartbeat IntervalHow often the heartbeat runs, in minutes.
Heartbeat ModelOptional dedicated model for heartbeat tasks. This can differ from the main chat model.

The Heartbeat tab also includes heartbeat execution logs, so you can review what the bot did during autonomous runs.


Compaction Tab Reference

Compaction is now about session context compaction, not memory maintenance.

FieldDescription
Compaction EnabledEnable or disable automatic context compaction.
Compaction ThresholdEstimated token threshold that triggers compaction.
Compaction RatioHow aggressively the session context should be reduced.
Compaction ModelOptional dedicated model used to summarize old session context.

The Compaction tab also exposes compaction logs so you can see recent successful, pending, or failed runs.

For the runtime behavior, see Context Compaction.


Access And ACL

At creation time, the bot starts from an ACL preset. After that, use the Access tab for fine-grained control.

Two layers matter:

  • ACL Preset gives you a sensible starting policy for a new bot.
  • ACL Default Effect controls the default result when no rule matches.

Use the Access tab to refine conversation, group, and thread rules after the initial setup.


Most users only need the chat and discuss behavior described in Sessions.

If you manage bot settings through the API or custom automation, the settings schema also includes discuss_probe_model_id for discuss-mode specific setups. Treat it as an advanced setting rather than a required field for normal bot creation.


Terminal Tab

The Terminal tab provides interactive shell access to the bot's container:

  • Open multiple terminal tabs simultaneously.
  • Execute commands directly inside the container.
  • Requires the container to be running.

Deleting a Bot

To permanently remove a bot and all its associated data (including container files and memory):

  1. Navigate to the General tab in the Bot Detail page.
  2. Scroll to the Danger Zone at the bottom.
  3. Click Delete Bot and confirm the action.

Warning: This action is irreversible. All persistent data for this bot will be lost.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/browser.html b/getting-started/browser.html index 9ec164d3..609827a1 100644 --- a/getting-started/browser.html +++ b/getting-started/browser.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Browser Contexts

Memoh can give a bot access to a headless browser through the Browser Gateway. A Browser Context stores the browser environment a bot should use, such as viewport size, locale, timezone, and mobile behavior.

Once a browser context is assigned to a bot, the bot can use browser tools to open pages, click elements, fill forms, capture screenshots, and inspect page content.


Concept: Browser Gateway

The Browser Gateway is powered by Playwright and provides browser automation for bots. In practice, a browser context acts like a reusable browser profile configuration for one or more bots.

Typical use cases include:

  • Navigating websites
  • Clicking buttons and links
  • Filling and submitting forms
  • Reading rendered page content
  • Capturing screenshots or PDFs

Creating a Browser Context

Manage contexts from the Browser Contexts page in the sidebar.

  1. Navigate to the Browser Contexts page.
  2. Click Add Browser Context.
  3. Fill in the following field:
    • Name: A display name for this browser context.
  4. Click Create.

Configuring a Browser Context

After creating a context, select it from the sidebar and update its settings.

FieldDescription
NameThe display name shown in the UI.
CoreBrowser engine: chromium (default) or firefox.
Viewport WidthBrowser viewport width in pixels.
Viewport HeightBrowser viewport height in pixels.
User AgentOptional custom browser user agent string.
Device Scale FactorOptional device pixel ratio.
LocaleOptional locale such as en-US or zh-CN.
Timezone IDOptional timezone such as UTC or Asia/Shanghai.
Is MobileEnables mobile-style browser behavior.
Ignore HTTPS ErrorsAllows navigation to sites with invalid HTTPS certificates.

Managing Contexts

  • Edit: Select a context and update its configuration.
  • Delete: Remove a context you no longer use.

Assigning a Browser Context to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Browser Context dropdown.
  4. Select the context you created.
  5. Click Save.

After saving, the bot can use that browser context when browser tools are invoked.


Bot Interaction

When a browser context is configured, the bot can use built-in browser tools such as:

  • browser_action: perform actions like navigation, click, fill, select, scroll, tab management, screenshot, or PDF export
  • browser_observe: inspect the current page and gather information for the model

This lets the bot interact with real websites instead of relying only on static HTML or search results.


Browser Core Selection

Memoh's browser image can include Chromium, Firefox, or both. The available cores are determined at build time by the BROWSER_CORES build argument.

The install script prompts for browser core selection during setup. To rebuild manually with specific cores:

bash
BROWSER_CORES=chromium docker compose --profile browser build browser

Valid values for BROWSER_CORES: chromium, firefox, chromium,firefox (default).


Next Steps

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/channels.html b/getting-started/channels.html index 6969b591..1e98e0b0 100644 --- a/getting-started/channels.html +++ b/getting-started/channels.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Bot Channels

Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.

Concept: Unified Communication

Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, Matrix, and more simultaneously.


Supported Channels

Configure your bot's connections from the Platforms tab in the Bot Detail page.

Platform Guides

PlatformGuideNotes
TelegramTelegram ConfigurationStrong attachment and streaming support
Feishu (Lark)Feishu ConfigurationSupports webhook-style inbound mode
DiscordDiscord ConfigurationGood fit for communities and servers
QQQQ ConfigurationPersonal DM oriented
MatrixMatrix ConfigurationDecentralized homeserver support
MisskeyMisskey ConfigurationReplies and reactions, no streaming
DingTalkDingTalk ConfigurationEnterprise private/group chat
WeCom (WeWork)WeCom ConfigurationEnterprise workspace integration
WeChatWeChat ConfigurationPersonal QR login flow
WeChat Official AccountWeChat Official Account ConfigurationOfficial account webhook flow
SlackSlack ConfigurationReplies, no streaming

Two WeChat adapters exist on purpose:

  • WeChat is the QR-login personal messaging integration.
  • WeChat Official Account is the official account / webhook integration for private-message scenarios.

Configuration Flow

1. Adding a Channel

  1. Click Add Channel.
  2. Select the platform from the list.
  3. Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.

2. Common Fields

FieldDescription
CredentialsAPI tokens, secrets, or bot keys provided by the platform.
DisabledQuickly enable or disable a channel without removing its configuration.
RoutingConfigure how messages are mapped between the platform and Memoh.

3. Special Case: Feishu Webhook

If using Feishu in webhook inbound mode:

  1. Memoh will generate a Webhook Callback URL.
  2. Copy this URL and paste it into your Feishu App's event configuration.
  3. This allows Feishu to send messages directly to Memoh.

4. Special Case: WeChat QR Login

If using WeChat:

  1. After enabling the channel, a QR code flow is provided for connecting.
  2. Scan the QR code with WeChat to link the bot.

5. Special Case: WeChat Official Account Webhook

If using WeChat Official Account:

  1. Create and save the channel first.
  2. Memoh generates a Webhook Callback URL for that channel.
  3. Copy the callback URL into the WeChat Official Account platform configuration.
  4. Keep the configured Token, Encryption Mode, and optional AES settings aligned between Memoh and WeChat.

6. Special Case: DingTalk Stream Connection

If using DingTalk:

  1. Configure App Key and App Secret.
  2. Save and enable the channel.
  3. Memoh maintains the stream connection for inbound events; you do not need to manage a separate webhook callback URL for the standard setup.

Operations

  • Save: Update the configuration.
  • Save and Enable: Update and immediately activate the channel.
  • Enable/Disable Toggle: Switch the channel's active status.
  • Delete: Permanently remove a channel's configuration.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/compaction.html b/getting-started/compaction.html index ed5e8281..ecf742d6 100644 --- a/getting-started/compaction.html +++ b/getting-started/compaction.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Context Compaction

Context Compaction reduces the prompt footprint of a single conversation session by summarizing older turns and keeping the active context smaller.

This page is about session context, not long-term memory storage. If you want to merge or rewrite stored memories in a memory provider, see Bot Memory Management.


Why It Exists

As a conversation grows, the bot needs to send more prior messages back to the model. That increases:

  • token usage
  • latency
  • pressure on the model's context window
  • the chance that older but still important turns will crowd out newer ones

Context compaction helps by replacing older conversational detail with a shorter summary that still preserves enough continuity for the next turns.


What It Changes

Context compaction affects the active session context only.

It does not:

  • delete the bot itself
  • change the configured memory provider
  • merge long-term memory records
  • replace the need for memory search

In practice, it changes how much historical session text is carried into future model calls.


Automatic Compaction

Configure automatic context compaction from the bot's General tab.

Relevant fields:

FieldDescription
Compaction EnabledEnable or disable automatic context compaction for this bot.
Compaction ThresholdEstimated token threshold that triggers background compaction.
Compaction RatioHow aggressively the session should be reduced during compaction.
Compaction ModelThe model used to summarize old session context.

When enabled, Memoh can compact context in the background after a turn when the estimated input size passes the configured threshold.

Memoh also uses the selected model's context_window to understand how close the session is to the available budget.


Immediate Compaction

You can trigger compaction immediately for the current session in two ways:

From The Session Status Panel

  1. Open the active conversation.
  2. Open the session status panel.
  3. Click Compact Now.

The status panel also shows the current context usage, cache hit rate, and used skills, which helps you decide whether compaction is useful right now.

From Slash Commands

Run:

text
/compact

or:

text
/compact run

This runs synchronous context compaction for the current session and returns a status result to chat.


Status And Logs

The Compaction tab in the bot detail page provides an audit trail for context compaction runs.

Typical fields include:

  • Status — whether the compaction finished successfully or failed
  • Summary — the compacted summary text or a summary preview
  • Message Count — how many messages were involved
  • Started / Completed Time — when the run happened
  • Model / Usage — metadata about the model and token usage when available

The log list is useful when you want to verify that automatic compaction is actually running or diagnose a failure.


Relationship To context_window

Memoh tracks the current session against the selected chat model's context_window.

You can see this in:

  • the Web UI session status panel
  • the /status slash command

Compaction becomes more valuable as the active session gets closer to the model's context limit. A dedicated compaction model can also be used to summarize more cheaply than the main chat model.


Context Compaction vs Memory Compaction

These two features sound similar but solve different problems:

FeatureScopeTriggerResult
Context CompactionOne active sessionSession panel or /compactSummarizes older chat history for future turns
Memory CompactionLong-term memory providerMemory tabRewrites stored memory entries

Use Context Compaction when one conversation has become too large.

Use Memory Compaction when the bot's stored memories themselves have become noisy or redundant.


Next Steps

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/container.html b/getting-started/container.html index 9e25bfd3..b71b6429 100644 --- a/getting-started/container.html +++ b/getting-started/container.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Bot Container Management

Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.

Concept: The Isolated Workspace

The container acts as the bot's private "computer." Within it, the bot can:

  • Store and modify files
  • Install software via package managers
  • Execute scripts
  • Maintain state across multiple sessions

Operations

Manage the lifecycle of your bot's environment from the Container tab in the Bot Detail page.

Lifecycle Actions

  • Create: Initialize the container if it doesn't exist (using the configured image). Progress is shown via real-time SSE feedback during image pull and creation.
  • Start: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.
  • Stop: Gracefully shut down the container to save resources.
  • Delete: Remove the container instance.

Container Information

The Container tab displays real-time data about the bot's runtime:

  • Container ID: Unique identifier for the instance.
  • Status: Whether it's currently running, stopped, or creating.
  • Image: The Docker/Containerd image used as the base.
  • Paths: Host and container paths for data persistence.
  • Tasks: Number of active background tasks running in the container.
  • CDI Devices: The effective GPU CDI devices currently attached to the container, if any.

Advanced: Provide CDI Devices

Memoh can provide host devices to a bot container through CDI (Container Device Interface). This is an advanced capability for users who want to expose host-managed devices, most commonly GPUs, to the container runtime.

In the Web UI, this capability is placed under Advanced options in the Container tab. It is optional and only needs to be configured when the bot must access CDI-backed devices from the host.

Configure CDI Devices

  1. Open the Bot's Container tab.
  2. Click Create if the container does not exist, or recreate the container if you need to change GPU settings.
  3. Expand Advanced options.
  4. Enable GPU.
  5. Enter one or more CDI device names in CDI devices.

You can enter CDI device names one per line or separated with commas. Common GPU-related examples:

  • nvidia.com/gpu=0
  • nvidia.com/gpu=all
  • amd.com/gpu=0
  • amd.com/gpu=all

Host Requirements

Before configuring CDI devices in Memoh, the host machine must already provide working device drivers, vendor toolkit support where required, and valid CDI specs. In practice, this usually means:

  • the host GPU works normally outside the container
  • CDI spec files exist under /etc/cdi or /var/run/cdi
  • the device name you enter in Memoh matches a real CDI device on the host

To discover the exact CDI device names exposed by the host, use the vendor tool on the host machine:

  • NVIDIA: nvidia-ctk cdi list
  • AMD: amd-ctk cdi list

If Memoh reports an error such as unresolvable CDI devices, the configured device name does not match any CDI device visible to the container runtime.

Important Behavior

  • CDI device settings are applied when the container is created. Updating the setting later requires recreating the container.
  • Stopping and starting an existing container does not change its attached CDI devices.
  • The container image still needs the appropriate user-space libraries and tools if you want to run CUDA or ROCm software inside the container.
  • After creation, the Container tab shows the effective attached CDI devices for verification.

Snapshots

Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:

  • Saving a known good configuration
  • Versioning the bot's environment
  • Testing complex changes safely

Creating a Snapshot

  1. Ensure the container is stopped or in a stable state.
  2. Click Create Snapshot.
  3. Provide a name for the snapshot.

Restoring a Snapshot

  • Find the desired snapshot in the list and click Restore. This will reset the container to the captured state.

Managing Snapshots

  • View a list of existing snapshots with their creation timestamps and parent relationships.
  • Use the Delete button next to a snapshot to remove it.

Data Export and Import

The Container tab supports exporting and importing container data for backup, migration, or sharing purposes.

Export

  1. Click Export Data.
  2. The container's filesystem data is packaged into a downloadable archive.
  3. Save the archive to your local machine.

Import

  1. Click Import Data.
  2. Select an archive file from your local machine.
  3. The archive contents are extracted into the container's filesystem.

Restore

The Restore operation resets the container's data directory to a clean state. This is useful when the filesystem has become corrupted or you want to start fresh without recreating the container.


Container Versioning

Memoh tracks container versions to manage the lifecycle of the bot's runtime environment. Version information includes:

  • Current Version: The active container version.
  • Version History: A log of container version changes over time.

This helps with auditing and understanding when container configurations were updated.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/email.html b/getting-started/email.html index 42eb7388..eafa2a30 100644 --- a/getting-started/email.html +++ b/getting-started/email.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Email Providers and Bindings

Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.

Concept: Email as a Bot Channel

Connecting email to your Bot involves two steps:

  1. Email Provider: Configure a connection to an email service (like Mailgun or a generic SMTP server).
  2. Email Binding: Link a specific email address from a provider to a Bot.

Email Provider

Manage your email service connections from the Email Provider page in the sidebar.

Creating a Provider

  1. Navigate to the Email Provider page from the sidebar.
  2. Click Add Email Provider.
  3. Choose the provider type:
    • Mailgun: For high-volume delivery.
    • Generic SMTP: For traditional email servers.
  4. Fill in the required fields (e.g., domain, api_key, host, port, username, password).
  5. Click Create.

Bot Email Bindings

Configure your bot's email capabilities from the Email tab in the Bot Detail page.

Adding a Binding

  1. Click Add Binding.
  2. Select the Email Provider you created.
  3. Provide the Email Address to be associated with the bot.
  4. Set the bot's permissions:
    • Can Read: If enabled, the bot can check and process incoming emails.
    • Can Write: If enabled, the bot can compose and send outgoing emails.
    • Can Delete: If enabled, the bot can manage its own email inbox.
  5. Click Create.

Outbox and History

The Email tab also provides an Outbox showing an audit log of all emails sent by the bot:

  • To: The recipient's email address.
  • Subject: The email's subject line.
  • Status: Whether the email was sent successfully.
  • Sent At: The timestamp of the email delivery.

Bot Interaction

  • The bot can use its email permissions to send reports, respond to user inquiries, or trigger actions based on incoming mail.
  • Outgoing emails are tracked in the outbox for monitoring and troubleshooting.
  • The bot handles email in a structured way, allowing it to "converse" via email just as it does via chat.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/files.html b/getting-started/files.html index 31ffac44..7533a584 100644 --- a/getting-started/files.html +++ b/getting-started/files.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Bot Files Management

Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the Files tab in the Bot Detail page.


Operations

The FileManager component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.

Browsing and Navigation

  • Breadcrumb Navigation: Quickly move between parent directories.
  • Refresh: Reload the file list to see the latest changes (e.g., files created by the bot).
  • New Folder: Create a directory within the current path.

Managing Files

  • Upload: Select files from your local computer to transfer them into the bot's container.
  • Rename: Click on a file or folder and use the rename action to update its identifier.
  • Delete: Remove files or folders (with recursive support for directories).
  • Download: Retrieve a file from the bot's container back to your local machine.

Viewing and Editing

The integrated FileViewer allows you to interact with the bot's files without leaving the web UI.

Text Files

  • Read/Edit: Click a text file (e.g., .md, .js, .py, .toml) to open it in the built-in Monaco Editor.
  • Syntax Highlighting: Supports common programming languages and configuration formats.
  • Save: Modify the file's content and click Save to apply the changes to the bot's filesystem.

Images

  • Preview: Click an image file (e.g., .png, .jpg, .webp) to see a visual preview directly in the file manager.

Bot Interaction with Files

Remember that the bot itself can also perform these operations:

  • Use its Skills or MCP tools to read, write, and manage its own files.
  • The Files tab is your portal to monitor and manually intervene in the bot's workspace.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/heartbeat.html b/getting-started/heartbeat.html index 83367bd0..cdf74436 100644 --- a/getting-started/heartbeat.html +++ b/getting-started/heartbeat.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Bot Heartbeat

The Heartbeat feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren't chatting with it.

Concept: Scheduled Autonomy

A Heartbeat is a recurring trigger that prompts the bot to "think" and execute its skills or tools at a set interval. This is useful for:

  • Periodic status checks
  • Automatic data collection
  • Cleaning up the filesystem
  • Sending scheduled notifications

Configuration

Configure the heartbeat from the Heartbeat tab in the Bot Detail page.

FieldDescription
EnabledToggle the heartbeat on or off.
IntervalHow often (in minutes) the heartbeat should trigger. The default is 30 minutes.
ModelThe LLM used to execute the heartbeat task. This can be different from the main chat model.

Logs and Monitoring

The Heartbeat tab provides a detailed audit log of every execution:

  • Status: Whether the heartbeat completed successfully (ok), encountered an issue (alert), or failed (error).
  • Time: When the heartbeat was triggered.
  • Duration: How long the bot took to process the task.
  • Result: A summary of the bot's action or response during that heartbeat.

Managing Logs

  • Filter by Status: Quickly find errors or alerts.
  • Refresh: Load the latest log entries.
  • Clear Logs: Remove old heartbeat records to keep the interface clean.
  • Load More: View older history.

Bot Interaction

  • During a heartbeat, the bot receives a special system prompt that it should perform its "routine" tasks.
  • The bot can use any of its assigned Skills or MCP tools during a heartbeat.
  • Heartbeat logs provide the "memory" of the bot's autonomous activities.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/mcp.html b/getting-started/mcp.html index cba39f6d..9abe1c79 100644 --- a/getting-started/mcp.html +++ b/getting-started/mcp.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

MCP Connections

Memoh fully supports the Model Context Protocol (MCP), allowing you to connect your Bot to external tool services and context providers.

Concept: Extending Bot Capabilities

MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.

You can configure connections manually from the MCP tab, or start from a curated template in Supermarket and then review the prefilled draft in the bot editor.


Connection Types

Configure MCP connections from the MCP tab in the Bot Detail page.

1. Stdio (Local Process)

This type of connection executes a local command inside the bot's container and communicates via standard input/output.

FieldDescription
CommandThe executable to run (e.g., npx, python3).
ArgumentsA list of command-line arguments (e.g., -y, @modelcontextprotocol/server-filesystem, /opt/memoh/data).
EnvKey-value pairs for environment variables.
CWDWorking directory for the process.

2. Remote (HTTP/SSE)

This type of connection connects to a remote MCP server over the network.

FieldDescription
URLThe endpoint of the remote MCP server.
HeadersCustom HTTP headers (e.g., for authentication).
TransportChoose between http or sse (Server-Sent Events).

OAuth Authentication

Some MCP servers require OAuth-based authentication. Memoh supports the full MCP OAuth flow:

  1. Click the OAuth button on a connection that requires authentication.
  2. Memoh will discover the server's OAuth configuration automatically.
  3. Click Authorize to open the provider's authorization page.
  4. After granting access, you are redirected back to Memoh.
  5. The token is exchanged and stored securely for the connection.

You can also:

  • Check status — View the current OAuth token status.
  • Revoke — Remove the stored OAuth token.

Operations

  • Add Connection: Click Add, choose the type, and fill in the configuration.
  • Import JSON: Use the Import button to quickly add multiple connections from a standard mcpServers JSON config file.
  • Export: Export connection configurations to a JSON file for backup or sharing.
  • Toggle Active: Enable or disable specific connections without deleting them.
  • Search: Quickly find a connection by name or ID.
  • Batch Delete: Select multiple connections and delete them at once.

Tool Discovery

Once an MCP connection is active, Memoh automatically discovers the tools exposed by the server. You can:

  1. Click on a connection to view its details.
  2. The Tools section lists all available tools with their names and descriptions.
  3. The bot will use these tools automatically during conversations when relevant.

You can also use the Probe button to manually refresh the tool list from the server.


Bot Interaction

Once an MCP connection is active, the bot will automatically:

  • Discover the tools and resources exposed by the MCP server.
  • Use these tools to perform tasks requested by the user.
  • Include the context provided by the MCP server in its reasoning process.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/memory.html b/getting-started/memory.html index 758a5edd..e8281196 100644 --- a/getting-started/memory.html +++ b/getting-started/memory.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Bot Memory Management

Memoh's structured long-term memory system allows bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.

Prerequisites

Before using the Memory tab, make sure your bot already has a Memory Provider configured.

  1. Create a provider from one of the Memory Providers (Built-in, Mem0, or OpenViking).
  2. Open your bot's General tab.
  3. Select the provider in the Memory Provider field.
  4. Click Save.

Without a memory provider, the bot will not have an active memory backend configuration.


Concept: Memory Retrieval

Memories are stored and retrieved through the assigned memory provider. Depending on the provider type and mode, retrieval may use file-based indexing, sparse vectors, dense embeddings, or an external API. When a user sends a message, Memoh finds the most relevant memories and includes them in the bot's runtime context.

This page is about long-term memory. It is separate from session context compaction, which reduces the prompt footprint of a single conversation session. See Context Compaction.


Operations

Manage your bot's memories from the Memory tab in the Bot Detail page.

1. Creating Memories

  • New Memory: Manually enter a memory's content in the provided textarea.
  • From Conversation: Select specific messages from the bot's conversation history to extract into memory.

2. Searching and Managing

  • Search: Filter memories by ID or text content.
  • Edit: Modify existing memory entries directly in the list.
  • Delete: Remove memories that are no longer needed.

Memory Compaction

Over time, long-term memories can accumulate and become redundant. The Compact action in the Memory tab rewrites the stored memory set itself.

This operation is provider-level memory maintenance. It is useful when you want to:

  • merge overlapping memories
  • remove stale or low-value entries
  • improve retrieval quality by reducing noise

Parameters:

  • Ratio — Compression ratio such as 0.8, 0.5, or 0.3. Lower values make compaction more aggressive.
  • Decay Days — Optionally restrict compaction to older memories only.

This is different from Context Compaction, which compresses the active prompt for one session rather than rewriting stored memories.


Rebuild

The Rebuild feature re-indexes all memories from scratch. This is useful when:

  • You have changed the memory provider's mode (e.g., switching from off to sparse).
  • The vector index has become inconsistent.
  • You want to re-process all memories with updated settings.

Click Rebuild in the Memory tab to start the process. You can monitor the rebuild status in real-time.


Status

The Memory tab shows the current status of the memory provider for this bot:

  • Connected — The memory backend is reachable and operational.
  • Error — There is an issue with the memory provider configuration or connectivity.

Use the status indicator to quickly verify that the memory system is working before troubleshooting other issues.


Usage Statistics

The Memory tab displays storage usage information:

  • Total Memories — The number of memory entries stored for this bot.
  • Index Status — Whether the vector index is up-to-date.

Memory vs Session Context

Memoh has two different "compaction" concepts:

ConceptScopeWhere to trigger itWhat it changes
Memory CompactionLong-term memory providerMemory tabRewrites stored memory entries
Context CompactionOne conversation sessionSession status panel or /compactSummarizes older session context for future model calls

If you are trying to reduce retrieval noise across many conversations, use Memory Compaction.

If you are trying to shorten the currently active conversation history, use Context Compaction.


Bot Interaction

  • The bot automatically searches and retrieves memories during chat.
  • The assigned Memory Provider controls the memory backend used by the bot.
  • Provider-specific settings (such as memory mode, embedding model, or API keys) are configured in the provider itself — see Memory Providers.
  • Memories provide the long-term knowledge that makes each bot unique to its owner.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/provider-and-model.html b/getting-started/provider-and-model.html index 780f6434..8e59344d 100644 --- a/getting-started/provider-and-model.html +++ b/getting-started/provider-and-model.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Providers And Models

To use Memoh effectively, you usually configure:

  • one or more providers that define how Memoh talks to upstream APIs
  • one or more models under those providers
  • optional speech providers if you want text-to-speech

The Web UI manages chat and embedding providers/models from the Models page. Speech models are managed separately from TTS Providers.


Provider Basics

A provider stores connection information for one upstream service, such as:

  • the API protocol (client_type)
  • the base URL if the protocol needs one
  • credentials such as an API key or OAuth token

Typical examples include OpenAI-compatible endpoints, Anthropic, Google Gemini, OpenAI Codex, and GitHub Copilot.

Creating A Provider

  1. Open the Models page from the settings sidebar.
  2. Click Add Provider.
  3. Fill in the provider form.
  4. Save the provider.

Common fields:

FieldDescription
NameFriendly display name, such as OpenAI or Copilot.
Client TypeAPI protocol used by this provider.
Base URLRoot API endpoint, when required by the selected client type.
API KeyToken-based authentication, when the client type uses direct credentials.

Client Types

Memoh currently supports these client types:

Client TypeTypical Use
openai-responsesOpenAI Responses API style providers
openai-completionsOpenAI Chat Completions compatible providers
anthropic-messagesAnthropic Messages API
google-generative-aiGoogle Gemini API
openai-codexOpenAI Codex / ChatGPT-backed coding workflow with OAuth
github-copilotGitHub Copilot with device OAuth
edge-speechSpeech-only provider type for Microsoft Edge Read Aloud

edge-speech is for speech synthesis, not for chat. Configure it through TTS Providers, not as your main chat provider.


OAuth-Based Providers

Most provider types use a normal API key. Two notable exceptions are openai-codex and github-copilot.

OpenAI Codex

  • Uses the openai-codex client type
  • Authenticates through the provider form's OAuth flow instead of a normal API key workflow
  • The bundled preset points at https://chatgpt.com/backend-api

This is a good fit when you want Codex-style model access for coding-oriented workflows.

GitHub Copilot

  • Uses the github-copilot client type
  • Uses device authorization
  • The provider form shows a verification URL and a user code while authorization is pending
  • After authorization completes, the provider stores the linked GitHub account token

GitHub Copilot is especially useful if you already have access to Copilot-backed chat and embedding models and want to reuse that access from Memoh.


Importing Models

After creating a provider, you can import or add models under it.

Typical flow:

  1. Select the provider.
  2. Click Import Models if the provider can expose a model catalog.
  3. Choose the models you want to save into Memoh.

You can also add models manually when you already know the upstream model ID.


Model Types

Memoh distinguishes three model types:

TypePurpose
chatMain LLMs for conversation, tool use, reasoning, and image generation
embeddingVector models for memory and retrieval
speechText-to-speech models used by TTS providers

Important distinction:

  • The Models page is primarily where you manage chat and embedding models.
  • speech models are exposed through TTS Providers.

Chat Model Configuration

When adding a chat model, the most important fields are:

FieldDescription
Model IDExact upstream identifier, such as gpt-4o or claude-sonnet-4.6.
NameFriendly display name shown in the UI.
CompatibilitiesFeature flags such as vision, tool-call, image-output, and reasoning.
Context WindowApproximate maximum context budget for the model.

Compatibilities

Memoh uses compatibility flags to decide which features a model can safely power:

CompatibilityMeaning
visionModel can accept images as input
tool-callModel can call tools
image-outputModel can generate images
reasoningModel exposes explicit reasoning modes / effort levels

If a model supports reasoning, it may also declare reasoning_efforts such as none, low, medium, high, or xhigh.

context_window

context_window is important because Memoh uses it to:

  • calculate session context usage in the Web UI
  • power /status output
  • decide when a session is approaching its prompt limit
  • guide Context Compaction

If you leave context_window empty, the model can still be used, but Memoh cannot show an exact usage percentage for that model.

Image Generation Models

Memoh now lets you assign an Image Generation Model to a bot. This model must be a chat model whose compatibilities include image-output.

That keeps image generation separate from your default chat model when needed.


Embedding Models

Embedding models are used for semantic indexing and retrieval.

The required field is:

FieldDescription
DimensionsVector size for the embedding output, such as 1536.

Use embedding models with memory providers or any feature that relies on vector search.


Speech Models

Speech models are managed from TTS Providers, not from the standard chat provider flow.

Current built-in example:

  • Edge TTS via edge-speech

This separation matters because speech models have voice, format, speed, and pitch settings that do not apply to chat or embedding models.


For most bots, think in terms of three parallel model roles:

  • Chat model for normal conversations
  • Embedding model for memory search
  • Speech / image models for side capabilities such as TTS and image generation

You do not need to force one model to do everything.


Next Steps

  • To assign chat, image, browser, memory, and TTS settings to a bot, see Bot Management.
  • To configure speech providers and speech models, see TTS Providers.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/schedule.html b/getting-started/schedule.html index b775ddd5..589af934 100644 --- a/getting-started/schedule.html +++ b/getting-started/schedule.html @@ -9,11 +9,11 @@ - + - - - + + + @@ -33,7 +33,7 @@ "enabled": true, "max_calls": null }

Execution Flow

When a schedule fires:

  1. The cron service triggers the schedule.
  2. The current_calls counter is incremented.
  3. If max_calls is set and reached, the schedule is automatically disabled.
  4. The agent receives the command along with the schedule context.
  5. The agent executes the command using its tools (e.g., web search, file read, send message).
  6. Results can be delivered to any connected channel.

Schedule vs. Heartbeat

FeatureScheduleHeartbeat
TriggerCron expression (flexible timing)Fixed interval (minutes)
CommandCustom natural-language instructionGeneric "routine check" prompt
Max CallsOptional execution limitUnlimited
Use CaseSpecific recurring tasksPeriodic autonomous thinking

Both features complement each other: use Heartbeat for general-purpose periodic activity and Schedule for precise, task-oriented automation.

- + \ No newline at end of file diff --git a/getting-started/search-provider.html b/getting-started/search-provider.html index 3933ba78..2ae778ae 100644 --- a/getting-started/search-provider.html +++ b/getting-started/search-provider.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Search Providers

Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.

Concept: Real-Time Knowledge

A Search Provider is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.


Supported Search Engines

Configure your search engines from the Search Provider page in the sidebar.

Supported EnginesNotes
BraveHighly recommended for privacy and performance.
BingPowerful global search capability.
GoogleComprehensive web search.
TavilyDesigned specifically for AI-powered research.
SearxNGConnect to your own self-hosted search aggregator.
DuckDuckGoPrivacy-focused search.
Other ProvidersSogou, Serper, Jina, Exa, Bocha, Yandex.

Configuration Flow

1. Adding a Search Provider

  1. Navigate to the Search Provider page from the sidebar.
  2. Click Add Search Provider.
  3. Fill in the following:
    • Name: A friendly name (e.g., "My Brave Search").
    • API Key: Your credentials for the specific search engine API.
    • Other Parameters: Depending on the engine, you may need to specify additional settings (e.g., base_url for SearxNG).

2. Managing Providers

  • Edit: Select a provider from the sidebar and update its configuration in the form on the right.
  • Delete: Use the Delete Provider button in the provider settings form.

Assigning a Search Provider to a Bot

  1. Navigate to the Bots page and select your bot.
  2. Go to the General tab.
  3. Find the Search Provider dropdown and select the provider you created.
  4. Click Save.

Bot Interaction

  • When a user's question requires real-time information, the bot will automatically call its assigned Search Provider.
  • The bot will process the search results to provide a grounded and accurate response.
  • Multiple search results can be synthesized to provide a comprehensive answer.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/sessions.html b/getting-started/sessions.html index dd7da397..84105c39 100644 --- a/getting-started/sessions.html +++ b/getting-started/sessions.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Sessions

A Session is an independent conversation thread between a user and a bot. Each session maintains its own context window and message history, allowing the bot to focus on a specific topic or task without interference from other conversations.


Concept: Conversation Isolation

When you chat with a bot, your messages are grouped into a session. The bot uses the session's history to maintain context. Starting a new session resets this context, giving you a fresh conversation without losing the previous one.

Sessions are scoped per bot — each bot manages its own set of sessions independently.


Session Types

Memoh uses five session types to separate different kinds of bot activity:

TypeDescription
ChatStandard user-initiated conversations. This is the default session type when chatting with a bot.
DiscussObservation-oriented conversation mode. The bot may stay silent by default and only speaks when it decides to send a real reply into the conversation.
HeartbeatAutomatically created when a bot's heartbeat triggers. Contains the bot's periodic autonomous activity.
ScheduleCreated when a scheduled task fires. Contains the bot's execution of a cron-triggered command.
SubagentCreated when the bot delegates a task to a subagent. Contains the subagent's independent work context.

Only Chat and Discuss sessions are directly created from user conversation routes. The other session types are system-managed and appear as read-only records in the session list.

Chat vs Discuss

chat and discuss are the two session types you are most likely to see in normal conversation threads.

Chat means:

  • the conversation behaves like a normal direct assistant exchange
  • users expect a visible reply when they send a prompt
  • this is the default in the Web UI and in direct-message style conversations

Discuss means:

  • the bot is observing an ongoing conversation, often in a group
  • the model's direct text output is treated as internal monologue
  • the bot only speaks to the conversation when it explicitly issues a send action
  • staying silent is valid and often desirable

In practice, discuss is what makes Memoh feel less like a synchronous chatbot and more like a participant that can decide whether to join in.


Starting a New Session with /new

The /new slash command creates a fresh session on the current conversation route, resetting the active session context without deleting old history.

Supported forms:

  • /new — create a new session using the default session type for the current context
  • /new chat — force a normal chat session
  • /new discuss — force a discuss session

Default routing behavior:

  • Web UI local chat defaults to chat
  • private conversations default to chat
  • group conversations on channel adapters default to discuss

/new discuss is not supported from the built-in Web UI local channel. Use a real channel adapter such as Telegram, Discord, or Misskey if you want to explicitly create discuss sessions.

This works across supported channels:

In External Channels (Telegram, Discord, Feishu, etc.)

Send /new, /new chat, or /new discuss as a message to the bot. The bot will:

  1. Create a new session of the requested or inferred type.
  2. Route all subsequent messages from you to this new session.
  3. The previous session's history is preserved but no longer active.

This is especially useful when:

  • You want to change topics without the bot referencing old context.
  • The conversation has become too long and you want a clean start.
  • You are switching between different tasks.

In the Web UI

The Web UI provides a session sidebar where you can:

  • Click the New Session button to create a fresh chat session.
  • Switch between existing sessions by clicking on them.
  • Search sessions by content.
  • Filter sessions by type (chat, discuss, heartbeat, schedule, subagent).
  • Rename or delete sessions.

Managing Sessions

Viewing Sessions

In the Web UI, the session sidebar lists all sessions for the currently selected bot. Each entry shows:

  • Title — The session name (auto-generated or user-defined).
  • Type — The session type icon.
  • Last Activity — When the session was last active.

For everyday chat use, chat and discuss sessions are intentionally shown together because they both represent user-facing conversation threads.

Renaming Sessions

Click on a session title to rename it. This helps organize conversations by topic.

Deleting Sessions

Remove sessions you no longer need. Deleting a session removes its message history permanently.


Session Status Panel

The session status panel provides a compact runtime summary for the active session. It is the same information surfaced by /status.

Key fields include:

  • Messages — total message count in the session
  • Context Usage — current used tokens relative to the selected model's context_window
  • Cache Hit Rate — how much of the input came from cache reads
  • Cache Read / Cache Write — token counts associated with caching
  • Skills — effective skills used by the session

The panel also exposes Compact Now, which triggers immediate Context Compaction for the current session.


How Sessions Relate to Other Features

  • Discuss sessions are optimized for channels where the bot should observe and selectively speak, especially in group conversations.
  • Heartbeat sessions are created on each heartbeat trigger. You can view what the bot did during its autonomous activity by opening the corresponding heartbeat session.
  • Schedule sessions are created when a scheduled task runs. Check these to see the results of cron-triggered commands.
  • Subagent sessions track delegated tasks. They show the independent work context of each subagent invocation.
  • Memory is shared across all sessions for a bot — memories extracted from one session are available in all others.

Published under AGPLv3

- + \ No newline at end of file diff --git a/getting-started/skills.html b/getting-started/skills.html index 82d211f4..7c1ef444 100644 --- a/getting-started/skills.html +++ b/getting-started/skills.html @@ -9,11 +9,11 @@ - + - - - + + + @@ -27,7 +27,7 @@ # Coder Skill You write clear code, explain trade-offs, and use file or command tools when they help complete the task.

Practical rules:


Where Skills Come From

Memoh distinguishes between managed skills and discovered skills:

Memoh scans these container-internal roots in order:

TypeRoot
Managed/data/skills/
Legacy discovered/data/.skills/
Compatibility discovered/data/.agents/skills/
Compatibility discovered/root/.agents/skills/

Within each root, Memoh looks for SKILL.md either directly under the root or inside a named subdirectory such as /data/skills/coder-skill/SKILL.md.

This matters because the same skill name can appear from multiple sources. Memoh resolves those duplicates into states.


Skill States

Each listed skill source has one of these states:

StateMeaning
effectiveThis is the version currently active for that skill name
shadowedAnother source with the same skill name takes precedence
disabledThis specific source has been disabled and will not be used

The important mental model is: the skill name is the identity. If Memoh finds multiple coder-skill sources, only one can be effective.

Typical Examples


Managing Skills In The UI

Open a bot, then go to Skills.

Add Skill

  1. Click Add Skill.
  2. Fill in the raw Markdown in the editor.
  3. Save it.

Memoh writes the file into its managed skills directory.

Edit Skill

Delete Skill

Disable / Enable

Use this when you want to test a fallback or temporarily remove a skill from the prompt without losing its content.

Adopt

Adopt copies a discovered skill into Memoh's managed skills directory so you can own and edit it from the UI.

Use adopt when:

Adopt is not available once a managed skill with the same name already exists.


Effective Skills At Runtime

Only effective skills are loaded into the bot runtime.

That means:

In active sessions, the Session Status Panel can also show which skills were used during that session.


Supermarket And Imported Skills

Two common ways skills appear without being typed manually:

If a discovered skill is useful but you want to fully manage it in Memoh, adopt it.


  1. Start with a small number of focused skills.
  2. Prefer clear names and short descriptions.
  3. Use Disable before Delete if you are unsure.
  4. Use Adopt for legacy skills you plan to keep.
  5. Install reusable skills from Supermarket instead of copy-pasting them repeatedly.
- + \ No newline at end of file diff --git a/getting-started/slash-commands.html b/getting-started/slash-commands.html index 7bc9b7b6..13c32f04 100644 --- a/getting-started/slash-commands.html +++ b/getting-started/slash-commands.html @@ -9,11 +9,11 @@ - + - - - + + + @@ -32,7 +32,7 @@ /schedule disable morning-news

/skill

Lists the currently available bot skills.

Actions:

ActionUsage
list/skill or /skill list

/fs

Browses the bot container filesystem.

Actions:

ActionUsage
list/fs list [path]
read/fs read <path>

Examples:

text
/fs list /
 /fs list /home
 /fs read /home/bot/IDENTITY.md

Read output is truncated when the file is very large.


Context Compaction Command

/compact

Triggers immediate session context compaction for the current session. This is different from memory compaction:

Actions:

ActionUsage
run/compact or /compact run

Use this when the current conversation has grown long and you want Memoh to summarize older turns before continuing. See Context Compaction.

- + \ No newline at end of file diff --git a/getting-started/supermarket.html b/getting-started/supermarket.html index e7515d84..408e7e10 100644 --- a/getting-started/supermarket.html +++ b/getting-started/supermarket.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Supermarket

Supermarket is Memoh's built-in catalog for skills and MCP templates.


Install A Skill

  1. Open Supermarket in the Web UI.
  2. Switch to the Skills tab.
  3. Choose a skill and click Install.
  4. Select the target bot.
  5. Confirm the install.
  6. The skill appears in that bot's Skills tab.

Install An MCP Template

  1. Open Supermarket in the Web UI.
  2. Switch to the MCP tab.
  3. Choose an entry and click Install.
  4. Select the target bot.
  5. Memoh opens that bot's MCP tab with a prefilled draft connection.
  6. Fill in any required secrets or OAuth details.
  7. Save the connection.
  8. Probe it if you want to refresh tool discovery.

Contribute

Contribute new skills or MCP templates here:

Published under AGPLv3

- + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index cdde782d..d7f1337e 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"about.md":"CYQE4Bs3","blogs_2026-02-16.md":"D7X_K9ac","blogs_index.md":"CzVqJnkf","channels_dingtalk.md":"BPw_YVBj","channels_discord.md":"CgnXVcxj","channels_feishu.md":"7xzXC8PR","channels_index.md":"BYBYUJgL","channels_matrix.md":"C5lym8OS","channels_misskey.md":"BjR2GOoQ","channels_qq.md":"BiHC52Zm","channels_slack.md":"DYyx2j2i","channels_telegram.md":"WGR_O6_O","channels_wechatoa.md":"d_VUeGe9","channels_wecom.md":"D7yBtNrz","channels_weixin.md":"Ckccg7Ew","getting-started_access.md":"BY1pTTRI","getting-started_bot.md":"CTc86MCg","getting-started_browser.md":"Cjpk7h3a","getting-started_channels.md":"CIKhbgq7","getting-started_compaction.md":"B6zFV5na","getting-started_container.md":"Do_YGEZB","getting-started_email.md":"DLrAWkek","getting-started_files.md":"CbhHSLX5","getting-started_heartbeat.md":"lBwT6Ivl","getting-started_mcp.md":"Lc9xd9cr","getting-started_memory.md":"WVVdvmGu","getting-started_provider-and-model.md":"CLGduNUC","getting-started_schedule.md":"7R1TStAB","getting-started_search-provider.md":"DDV1py8V","getting-started_sessions.md":"BGHqYtAd","getting-started_skills.md":"CcJKfEue","getting-started_slash-commands.md":"B9pb8gxb","getting-started_supermarket.md":"BOx8ZRcm","index.md":"DtN_VGK2","installation_docker.md":"DxE7r3rU","memory-providers_builtin.md":"DlYtNI3G","memory-providers_index.md":"D5MvHNPW","memory-providers_mem0.md":"C5B6D9ME","memory-providers_openviking.md":"N-8WyFZa","tts-providers_edge.md":"DPjdtaQf","tts-providers_index.md":"Cgc87EeS","zh_concepts_identity-and-binding.md":"6tGYa9d_","zh_concepts_index.md":"_zNPjKkD","zh_index.md":"C-Pz2AC7","zh_style_terminology.md":"CzqhSoQX"} +{"about.md":"BjgA6DuA","blogs_2026-02-16.md":"BNMeYY71","blogs_index.md":"BU7HIh5k","channels_dingtalk.md":"B5SBhtPg","channels_discord.md":"nWxkk0E9","channels_feishu.md":"BdLiDNPX","channels_index.md":"BMhis6AA","channels_matrix.md":"DurhP29P","channels_misskey.md":"K_p2b9tc","channels_qq.md":"xrtB7-Cp","channels_slack.md":"DJzfVI9g","channels_telegram.md":"DHWAMJPN","channels_wechatoa.md":"6qw2hORh","channels_wecom.md":"CvQSc0QF","channels_weixin.md":"NGCJG9Zr","getting-started_access.md":"YqNM6CpY","getting-started_bot.md":"Cun_Y-ny","getting-started_browser.md":"CjVL6wjg","getting-started_channels.md":"zZ6TuOep","getting-started_compaction.md":"G9ICyEJo","getting-started_container.md":"CrcDm5m4","getting-started_email.md":"DN5WsFFI","getting-started_files.md":"Db2yzSPF","getting-started_heartbeat.md":"hEHFzwV2","getting-started_mcp.md":"BZLjLQ-y","getting-started_memory.md":"5cl77orc","getting-started_provider-and-model.md":"ee3Zv59w","getting-started_schedule.md":"BgiO7WiT","getting-started_search-provider.md":"C6dGU9hk","getting-started_sessions.md":"MU-Cy0GW","getting-started_skills.md":"DTJvqMSO","getting-started_slash-commands.md":"ChJs4d6R","getting-started_supermarket.md":"BqLtu6vF","index.md":"DzWsM5pb","installation_docker.md":"BgArxak6","memory-providers_builtin.md":"EikeTjwl","memory-providers_index.md":"Db8RSqmA","memory-providers_mem0.md":"DpAU5KWk","memory-providers_openviking.md":"CFYGljE_","tts-providers_edge.md":"BX5H-DX1","tts-providers_index.md":"D7QeNyIs","zh_concepts_identity-and-binding.md":"CwjmC7t6","zh_concepts_index.md":"C_YzW1PS","zh_index.md":"DJw9w7T-","zh_style_terminology.md":"DjkmyoSc"} diff --git a/index.html b/index.html index a72d412a..70f5760d 100644 --- a/index.html +++ b/index.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent platform. Create bots with isolated workspaces, persistent memory, tool access, and channel integrations across Telegram, Discord, Lark (Feishu), QQ, Matrix, Misskey, DingTalk, WeCom, WeChat, WeChat Official Account, Email, and Web.

Start Here

Feature Guides

  • Channels — Platform overview and links to per-channel guides.
  • Access Control — ACL presets, rule ordering, and scoped access.
  • Skills — Managed skills, effective/shadowed states, and adoption workflow.
  • Supermarket — Install skills and MCP templates from the catalog.
  • MCP — Configure tool servers, OAuth, probing, import/export.
  • Memory — Long-term memory providers and memory compaction.
  • Context Compaction — Reduce active session context size without changing stored memory.

Published under AGPLv3

- + \ No newline at end of file diff --git a/installation/docker.html b/installation/docker.html index 459c2053..a7b18f1b 100644 --- a/installation/docker.html +++ b/installation/docker.html @@ -9,11 +9,11 @@ - + - - - + + + @@ -28,7 +28,7 @@ docker compose logs -f # View logs docker compose ps # Status docker compose pull && docker compose up -d # Update to latest images

Environment Variables

VariableDefaultDescription
POSTGRES_PASSWORDmemoh123PostgreSQL password (must match postgres.password in config.toml)
MEMOH_CONFIG./config.tomlPath to the configuration file
MEMOH_VERSION(latest release)Git tag to install (e.g. v0.6.0). Also pins Docker image versions.
USE_CN_MIRRORfalseSet to true to use China mainland image mirrors
BROWSER_CORESchromium,firefoxBrowser engines to include in the browser image
BROWSER_TAGlatestDocker tag for the browser image
- + \ No newline at end of file diff --git a/memory-providers/builtin.html b/memory-providers/builtin.html index 306aa7b8..be1736d8 100644 --- a/memory-providers/builtin.html +++ b/memory-providers/builtin.html @@ -9,11 +9,11 @@ - + - - - + + + @@ -25,7 +25,7 @@ [sparse] base_url = "http://sparse:8085"

Dense Mode

Requires an embedding model (configured in the provider settings) and Qdrant:

bash
docker compose --profile qdrant up -d

The Qdrant section must be present in config.toml:

toml
[qdrant]
 base_url = "http://qdrant:6334"

Assigning a Memory Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the provider you created.
  5. Click Save.

If no memory provider is selected, the bot will not use that provider configuration in its runtime settings.


Using Memory After Setup

Once a memory provider is assigned to the bot, you can manage actual memories from the bot's Memory tab:

For day-to-day memory operations, continue with Bot Memory Management.

- + \ No newline at end of file diff --git a/memory-providers/index.html b/memory-providers/index.html index bb1b3dcc..97f2b726 100644 --- a/memory-providers/index.html +++ b/memory-providers/index.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Memory Providers

Memoh uses a Memory Provider to define how a bot stores, retrieves, and manages long-term memory. A bot can bind one memory provider in its General tab, and that provider becomes the backend for memory extraction and memory search.

Available Providers

Memoh supports the following memory providers:

  • Built-in: The default memory system included with Memoh. Supports three modes — off (file-based), sparse (neural sparse vectors), and dense (embedding-based semantic search). Fully self-hosted.
  • Mem0: SaaS memory provider via the Mem0 API. Requires an API key.
  • OpenViking: Self-hosted or SaaS memory provider with its own API.

Basic Flow

  1. Open the Memory Providers page from the sidebar.
  2. Create a provider instance using one of the supported provider types.
  3. Configure the provider settings.
  4. Open a bot's General tab and assign that provider in Memory Provider.
  5. Manage actual memories from the bot's Memory tab.

Next Steps

Published under AGPLv3

- + \ No newline at end of file diff --git a/memory-providers/mem0.html b/memory-providers/mem0.html index 7897640f..df64f354 100644 --- a/memory-providers/mem0.html +++ b/memory-providers/mem0.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Mem0 Memory Provider

Mem0 is a SaaS memory provider that connects your bot to the Mem0 platform. Instead of managing memory infrastructure yourself, Mem0 handles storage, retrieval, and indexing through its cloud API.


Creating a Mem0 Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select mem0.
  4. Click Create.

Configuring a Mem0 Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLNoMem0 API base URL. Defaults to https://api.mem0.ai when empty.
API KeyYesAPI key for Mem0 authentication (stored as a secret).
Organization IDNoOrganization ID for workspace scoping.
Project IDNoProject ID for workspace scoping.

Assigning a Mem0 Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the Mem0 provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use Mem0 as its memory backend. Memory extraction, search, and management operations are routed through the Mem0 API.

For day-to-day memory operations, see Bot Memory Management.

Published under AGPLv3

- + \ No newline at end of file diff --git a/memory-providers/openviking.html b/memory-providers/openviking.html index 4da856cf..11176bb9 100644 --- a/memory-providers/openviking.html +++ b/memory-providers/openviking.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

OpenViking Memory Provider

OpenViking is a memory provider that can be self-hosted or used as a SaaS service. It provides an alternative memory backend for bots that need a dedicated memory API.


Creating an OpenViking Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select openviking.
  4. Click Create.

Configuring an OpenViking Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLYesOpenViking API endpoint (e.g. http://openviking:8088).
API KeyNoAPI key for authentication (stored as a secret).

Assigning an OpenViking Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the OpenViking provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use OpenViking as its memory backend. Memory extraction, search, and management operations are routed through the OpenViking API.

For day-to-day memory operations, see Bot Memory Management.

Published under AGPLv3

- + \ No newline at end of file diff --git a/tts-providers/edge.html b/tts-providers/edge.html index 40bc1858..29c946f1 100644 --- a/tts-providers/edge.html +++ b/tts-providers/edge.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Edge TTS

Edge TTS uses Microsoft Edge's public read-aloud API for speech synthesis. It is free, requires no API key, and supports 256+ voices across 50+ languages.


Creating an Edge TTS Provider

  1. Navigate to the TTS Providers page.
  2. Click Add.
  3. Select edge as the provider type.
  4. Click Create.

The default model edge-read-aloud is automatically imported when the provider is created.


Configuring the Model

Click the edge-read-aloud model to configure its settings.

FieldDescription
VoiceLanguage + voice ID. Default: en-US-EmmaMultilingualNeural. Over 256 voices available across 50+ languages.
FormatAudio output format. Options: audio-24khz-48kbitrate-mono-mp3 (default), audio-24khz-96kbitrate-mono-mp3, webm-24khz-16bit-mono-opus.
SpeedPlayback speed. Options: 0.5, 1.0 (default), 2.0, 3.0.
PitchVoice pitch adjustment. Range: -100 to +100, default 0.

Assigning to a Bot

  1. Open a bot's General tab.
  2. Find the TTS Model dropdown.
  3. Select the configured Edge TTS model.
  4. Click Save.

The bot can now synthesize speech using Edge TTS.


Testing

Use the built-in synthesis test button on the model configuration page to preview how the selected voice, format, speed, and pitch sound before assigning to a bot.

Published under AGPLv3

- + \ No newline at end of file diff --git a/tts-providers/index.html b/tts-providers/index.html index d20e9619..bce1b3cb 100644 --- a/tts-providers/index.html +++ b/tts-providers/index.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

TTS Providers

Memoh supports Text-to-Speech (TTS) so bots can synthesize spoken audio from text. The TTS system is organized into three layers:

  • TTS Provider: A service type (e.g. Edge TTS). You create named provider instances from the TTS Providers page.
  • TTS Model: A specific voice/model under a provider (e.g. edge-read-aloud). Models have configurable voice, format, speed, and pitch settings.
  • Bot Assignment: In Bot Settings, select a TTS Model. The bot can then synthesize speech in conversations.

Basic Flow

  1. Navigate to the TTS Providers page from the sidebar.
  2. Click Add and select a provider type (e.g. edge).
  3. Click Create — the provider's default model is auto-imported.
  4. Click the model to configure voice, format, speed, and pitch.
  5. Test synthesis with the built-in test button.
  6. Open a bot's General tab and select the TTS Model.
  7. Save — the bot can now synthesize speech.

Available Providers

ProviderDescription
Edge TTSFree, uses Microsoft Edge's public read-aloud API. 256+ voices across 50+ languages. No API key required.

Next Steps

  • To set up the currently available provider, continue with Edge TTS.

Published under AGPLv3

- + \ No newline at end of file diff --git a/zh/concepts/identity-and-binding.html b/zh/concepts/identity-and-binding.html index fc585b3f..c6038b45 100644 --- a/zh/concepts/identity-and-binding.html +++ b/zh/concepts/identity-and-binding.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

账号模型与绑定

账号模型

Memoh 将平台账号与系统账号视为两类不同实体:

  • 平台账号(ChannelIdentity 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。
  • 系统账号(User 是 Memoh 系统内账号。

平台账号在初始阶段可以不绑定系统账号。
bind 的职责是完成这两类账号的关联。

接入平台与 Bot

  • 接入平台(channel 是入站消息来源。
  • Bot 是系统内的授权与资源边界。

Bot 由系统账号管理,入站消息由平台账号产生。

为什么账号绑定是账号作用域

账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:

  • 它只负责平台账号与系统账号的绑定;
  • 不把账号绑定与成员管理语义耦合在一起;
  • 让 bot 访问控制保持独立、可演进。

账号绑定流程(当前共识)

  1. 用户以自己的系统账号申请 bind code;
  2. 平台账号在支持的接入平台会话中发送 code;
  3. 系统校验 code,完成平台账号到系统账号的绑定;
  4. bot 成员与授权由独立流程处理。

Bot 类型语义

  • Public bot:支持成员协作语义。
  • Personal bot:语义上应为单 owner,不应依赖成员机制。

注:本文档记录的是产品语义与共识方向。
部分运行时细节仍可能处于收敛阶段。

Published under AGPLv3

- + \ No newline at end of file diff --git a/zh/concepts/index.html b/zh/concepts/index.html index 2cb280f0..1ff384e6 100644 --- a/zh/concepts/index.html +++ b/zh/concepts/index.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

核心概念

本章节用于定义 Memoh 的核心账号与访问概念。

概念图

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。
  • Bot:由系统账号管理的资源与访问边界。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。

为什么重要

Memoh 需要同时处理外部接入平台消息与系统内权限控制。
因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。

术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。

本章内容

Published under AGPLv3

- + \ No newline at end of file diff --git a/zh/index.html b/zh/index.html index 37f2b157..2eb9ac1b 100644 --- a/zh/index.html +++ b/zh/index.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

Memoh 中文入口

Memoh 是一个多成员、长记忆、容器化的 AI Agent 平台。当前中文站点同时包含:

  • 已翻译的中文概念文档
  • 指向英文主文档的常用功能入口

如果你是第一次接触 Memoh,建议先看英文主文档里的功能指南;如果你正在理解账号语义、绑定关系和访问控制,再看下面的中文概念页。

常用功能入口

中文概念文档

面向文档维护者

当前中文维护范围

当前中文内容优先覆盖账号语义与访问控制相关的概念:

  • 区分系统账号与平台账号
  • 解释为什么账号绑定是账号作用域
  • 说明账号绑定与 bot 访问控制之间的关系

说明:“平台账号”指用户在外部平台上的真实账号,例如飞书账号,而不是 Memoh 系统账号。

Published under AGPLv3

- + \ No newline at end of file diff --git a/zh/style/terminology.html b/zh/style/terminology.html index e078b300..5f52c6d5 100644 --- a/zh/style/terminology.html +++ b/zh/style/terminology.html @@ -9,18 +9,18 @@ - + - - - + + +
Skip to content

术语规范

适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。

规范术语

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 内账号。
  • 接入平台(channel:承载入站消息的外部平台。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。
  • 绑定码(Bind Code):用于账号绑定的一次性代码。
  • Bot:由系统账号管理的资源与授权边界。

推荐写法

  • 面向产品语义时,优先写 “平台账号”,不要直接写 actor。
  • 描述业务行为时,优先写 “接入平台”,不要直接写 channel。
  • 首次出现保留技术别名,后续可只用中文术语:
    • 平台账号(ChannelIdentity
    • 系统账号(User
    • 账号绑定(bind

禁用或不推荐写法

  • 在概念文档中直接使用 actor(除非明确引用代码符号)。
  • 使用含糊表述如 “平台用户”(未区分系统账号与平台账号)。
  • 写出“平台账号是 Memoh 内部账号”这类错误语义。

示例

  • 正确:“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”
  • 正确:“账号绑定用于把平台账号关联到系统账号。”
  • 错误:“Actor 是 Memoh 里的用户。”

自检清单

  • 是否明确区分了系统账号与平台账号?
  • 叙述中是否将 channel 表述为接入平台?
  • 是否仅在首处保留技术别名?

Published under AGPLv3

- + \ No newline at end of file