@pi-flash-plugins/pf-wxbot 0.0.0-stage → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/assets/wx.svg ADDED
@@ -0,0 +1,5 @@
1
+ <svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- 微信通话图标:双气泡(微信意象),单色供宿主主题染色(勿写 fill="currentColor":usvg 会继承成不填充,gpui 染色失效=隐形) -->
3
+ <path d="M7 3C3.69 3 1 5.24 1 8c0 1.58.9 2.99 2.3 3.9L2.6 13.9a.4.4 0 0 0 .58.46l2.36-1.35c.47.11.96.17 1.46.18A4.98 4.98 0 0 1 7 11.5c0-2.76 2.46-5 5.5-5 .34 0 .67.03 1 .08C12.86 4.18 10.18 3 7 3Zm-2.2 3.1a.8.8 0 1 1 0 1.6.8.8 0 0 1 0-1.6Zm4.4 0a.8.8 0 1 1 0 1.6.8.8 0 0 1 0-1.6Z"/>
4
+ <path d="M12.5 7.5C10.01 7.5 8 9.21 8 11.3c0 2.1 2.01 3.8 4.5 3.8.4 0 .8-.05 1.17-.13l1.9 1.09a.33.33 0 0 0 .48-.38l-.57-1.62c1.13-.7 1.52-1.75 1.52-2.76 0-2.1-2.01-3.8-4.5-3.8Zm-1.5 2.6a.65.65 0 1 1 0 1.3.65.65 0 0 1 0-1.3Zm3 0a.65.65 0 1 1 0 1.3.65.65 0 0 1 0-1.3Z"/>
5
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@pi-flash-plugins/pf-wxbot",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.4",
4
+ "engines": {
5
+ "pf": ">=0.3.2"
6
+ },
7
+ "publishConfig": {
8
+ "access": "public",
9
+ "registry": "https://registry.npmjs.org/"
10
+ }
11
+ }
package/pf-plugin.toml ADDED
@@ -0,0 +1,18 @@
1
+ # PF 内层插件清单(契约 inner_package;正版门 090-5 L3)
2
+ schema = 5
3
+ id = "pf-wxbot"
4
+ title = { zh = "微信通信", en = "PF-WeChat" }
5
+ version = "0.1.4"
6
+
7
+ wasm = "plugin.wasm"
8
+
9
+ [[contributes.fn_bar]]
10
+ command = "bind"
11
+
12
+ [[contributes.popups]]
13
+ id = "qr"
14
+ title = { zh = "绑定微信", en = "Bind WeChat" }
15
+ size = "MD"
16
+
17
+ [[contributes.pi_extensions]]
18
+ path = "pi/index.mjs"
package/pi/config.mjs ADDED
@@ -0,0 +1,26 @@
1
+ // config —— 连接配置(transport 与 register 共用的连接面)。
2
+ // 自 wxprobe src/transport.rs 的 Config 段移植。
3
+
4
+ import * as state from "./state.mjs";
5
+
6
+ /** 状态盘缺 token 时的确定性错误(错误信息要指路:先跑扫码)。 */
7
+ export function require_token(st) {
8
+ const t = state.get_str(st, "bot_token");
9
+ if (!t) {
10
+ throw new Error("未扫码:先完成二维码绑定(register)");
11
+ }
12
+ return t;
13
+ }
14
+
15
+ /** 从状态盘解出连接配置,与 IO 解耦(可单测)。缺 token → throw。 */
16
+ export function config_from_state(st = state.load()) {
17
+ const token = require_token(st);
18
+ return {
19
+ token,
20
+ bot_id: state.get_str(st, "bot_id") ?? "",
21
+ bot_user: state.get_str(st, "bot_user_id"),
22
+ chat_user: state.get_str(st, "chat_id") ?? null,
23
+ context_token: state.get_str(st, "context_token") ?? null,
24
+ client_id: state.ensure_client_id(st),
25
+ };
26
+ }
@@ -0,0 +1,323 @@
1
+ // 002 设计逐条验收 —— 每一条设计条目一个可执行测试。
2
+ // 运行:node --test packages/pf-wxbot/design-002.test.mjs
3
+ //
4
+ // 规则:本文件只读设计(docs/插件设计/002-微信通信.md),不看实现。
5
+ // 失败 = 实现违背设计,改代码,不许改测试。
6
+ //
7
+ // 假宿主 = 契约 v3 能力面;假 ext = 004 §5.2 泵契约(门控 + 出码 + 扫码结果)。
8
+
9
+ import { test, beforeEach } from "node:test";
10
+ import assert from "node:assert/strict";
11
+ import { mkdtempSync, mkdirSync } from "node:fs";
12
+ import { tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+ import * as plugin from "../main.js";
15
+
16
+ const GRID = JSON.stringify({
17
+ size: 8,
18
+ rows: [[[0, 3]], [], [[2, 4]], [[0, 1], [5, 2]], [], [[1, 6]], [], [[3, 2]]],
19
+ });
20
+
21
+ let ctx, calls, handlers, files;
22
+
23
+ function makeCtx() {
24
+ files = {};
25
+ calls = { toasts: [], popups: [], badges: [] };
26
+ handlers = { command: {}, broadcast: {} };
27
+ const dir = mkdtempSync(join(tmpdir(), "wx002-"));
28
+ mkdirSync(dir, { recursive: true });
29
+ ctx = {
30
+ dir,
31
+ fs: {
32
+ read: (n) => files[n] ?? "",
33
+ write: (n, s) => void (files[n] = s),
34
+ list: () => Object.keys(files),
35
+ },
36
+ isExecutive: () => false,
37
+ fileIcon: () => "icons/file_icons/file.svg",
38
+ run() {}, edit() {}, revealInExplorer() {},
39
+ toast: (m) => calls.toasts.push(m),
40
+ act: { openPopup: (id) => calls.popups.push(id), closePopup: (id) => calls.popups.push(`close:${id}`) },
41
+ onMenu() {},
42
+ onCommand: (id, h) => void (handlers.command[id] = h),
43
+ onPanelOpen() {},
44
+ onBroadcast: (n, h) => void (handlers.broadcast[n] = h),
45
+ sessions: {
46
+ newDraft() {},
47
+ setBadge: (b) => calls.badges.push({ ...b, op: "set" }),
48
+ clearBadge: (b) => calls.badges.push({ ...b, op: "clear" }),
49
+ },
50
+ hostProof: () => ({ kid: "dev", proof: "PF-DEV-PLACEHOLDER", nonceTag: "dev" }),
51
+ };
52
+ plugin.activate(ctx);
53
+ }
54
+
55
+ const mirror = () => JSON.parse(files["wx-state.json"] ?? "{}");
56
+ const set_mirror = (m) => void (files["wx-state.json"] = JSON.stringify(m));
57
+
58
+ /** 一拍 ext:key = 该 ext 所属会话(门控 = 被绑定 或 被点名出码)。 */
59
+ function extTick(key) {
60
+ const m = mirror();
61
+ if (m.enabled === "0") return false;
62
+ const bound = !!key && (m.session_id === key || m.session_file === key);
63
+ const asked = !!key && m.qr_pending === key;
64
+ if (!bound && !asked) return false;
65
+ if (bound && m.bound_current !== "1") set_mirror({ ...mirror(), bound_current: "1", session_file: m.session_file ?? key });
66
+ if (m.qr_request === "1" || (!m.bot_token && !m.qrcode_grid && !m.qr_error && !m.qr_timeout)) {
67
+ set_mirror({ ...mirror(), qrcode_grid: GRID, qr_request: undefined, qr_timeout: undefined, qr_error: undefined });
68
+ }
69
+ return true;
70
+ }
71
+
72
+ /** 扫码成功(微信回调):ext 落 token + 绑定指针 + 收窗信号。 */
73
+ function scanOk(key) {
74
+ set_mirror({
75
+ ...mirror(),
76
+ session_id: key, session_file: key, bot_token: "TOK", bound_current: "1",
77
+ qr_pending: undefined, qr_request: undefined, qrcode_grid: undefined, bind_ok: "1",
78
+ });
79
+ }
80
+
81
+ const chrome = (key) => plugin.fn_bar(ctx, { session: { key } });
82
+ const popup = () => plugin.render_popup(ctx);
83
+ const flat = (n) => JSON.stringify(n ?? null);
84
+
85
+ beforeEach(makeCtx);
86
+
87
+ // ---------------------------------------------------------------- 功能说明
88
+ test("002·安装2 —— fn 槽只声明一颗微信 icon,样式交给宿主", () => {
89
+ const c = chrome("sA");
90
+ assert.equal(c.icon, "assets:wx.svg");
91
+ assert.ok(["accent", "text.faint"].includes(c.tone), "tone 只有绿/灰(无黄)");
92
+ assert.ok(c.tip?.zh);
93
+ });
94
+
95
+ // ---------------------------------------------------------------- 绑定
96
+ test("002·绑定1 —— 随意开一个会话,功能栏上是灰色 icon", () => {
97
+ assert.equal(chrome("sA").tone, "text.faint");
98
+ assert.equal(chrome("sB").tone, "text.faint");
99
+ });
100
+
101
+ test("002·绑定2 —— 点 icon 弹出二维码,此时仍属未启用(灯不亮、徽标不打)", () => {
102
+ handlers.command.bind({ session: { key: "sA" } });
103
+ assert.equal(calls.popups.at(-1), "qr");
104
+ extTick("sA");
105
+ const canvas = find(popup(), (n) => n.type === "canvas");
106
+ assert.ok(canvas && canvas.paint.some((p) => p.op === "rect" && p.fill === "#1f1f1f"), "码已画出");
107
+ assert.equal(chrome("sA").tone, "text.faint", "未扫码 → icon 仍灰");
108
+ assert.equal(plugin.session_list_render(ctx, { session: { key: "sA" } }), null, "未扫码 → 列表无徽标");
109
+ });
110
+
111
+ test("002·绑定3 —— 扫码成功 → icon 变绿", () => {
112
+ handlers.command.bind({ session: { key: "sA" } });
113
+ extTick("sA");
114
+ assert.equal(chrome("sA").tone, "text.faint", "扫码前灰");
115
+ scanOk("sA");
116
+ assert.equal(chrome("sA").tone, "accent", "扫码后绿");
117
+ assert.equal(popup(), null, "绑定成功 → 弹窗自动收起");
118
+ });
119
+
120
+ test("002·绑定4 —— 插件获得该 sessionId(= 扫码的那个会话)", () => {
121
+ handlers.command.bind({ session: { key: "sA" } });
122
+ extTick("sA");
123
+ scanOk("sA");
124
+ assert.equal(mirror().session_id, "sA");
125
+ });
126
+
127
+ // ---------------------------------------------------------------- 切换
128
+ test("002·切换1 —— 仅支持绑定一个会话(多会话点 icon 只留一条绑定)", () => {
129
+ handlers.command.bind({ session: { key: "sA" } });
130
+ extTick("sA");
131
+ scanOk("sA");
132
+ handlers.command.bind({ session: { key: "sB" } });
133
+ extTick("sB");
134
+ assert.equal(mirror().session_id, "sA", "未扫码前指针不动");
135
+ assert.equal(chrome("sB").tone, "text.faint");
136
+ assert.ok(plugin.session_list_render(ctx, { session: { key: "sA" } }), "被绑会话行有徽标");
137
+ assert.equal(plugin.session_list_render(ctx, { session: { key: "sB" } }), null, "未绑会话行无徽标");
138
+ });
139
+
140
+ test("002·切换2 —— 绑定会话的 icon 是绿色的", () => {
141
+ handlers.command.bind({ session: { key: "sA" } });
142
+ extTick("sA");
143
+ scanOk("sA");
144
+ assert.equal(chrome("sA").tone, "accent");
145
+ assert.equal(chrome("sB").tone, "text.faint");
146
+ });
147
+
148
+ test("002·切换3 —— 在另一个会话执行绑定后,持有的 sessionId 变更", () => {
149
+ handlers.command.bind({ session: { key: "sA" } });
150
+ extTick("sA");
151
+ scanOk("sA");
152
+ handlers.command.bind({ session: { key: "sB" } });
153
+ extTick("sB");
154
+ scanOk("sB");
155
+ assert.equal(mirror().session_id, "sB");
156
+ assert.equal(chrome("sB").tone, "accent");
157
+ assert.equal(chrome("sA").tone, "text.faint", "旧会话回到灰");
158
+ });
159
+
160
+ test("002·切换4 —— icon 只有 sessionId 核对正确 且 链接正常才变绿", () => {
161
+ set_mirror({ session_id: "sA", session_file: "sA" });
162
+ assert.equal(chrome("sA").tone, "text.faint", "无 token → 灰");
163
+ set_mirror({ session_id: "sA", session_file: "sA", bot_token: "TOK" });
164
+ assert.equal(chrome("sB").tone, "text.faint", "sessionId 不符 → 灰");
165
+ assert.equal(chrome("sA").tone, "accent", "两项都满足 → 绿");
166
+ });
167
+
168
+ // ---------------------------------------------------------------- 过期
169
+ test("002·过期2 —— 过期 → icon 灰 + 自动弹二维码弹窗 + 提示原文", () => {
170
+ handlers.command.bind({ session: { key: "sA" } });
171
+ extTick("sA");
172
+ scanOk("sA");
173
+ set_mirror({ ...mirror(), session_expired: "1" });
174
+ calls.toasts.length = 0;
175
+ calls.popups.length = 0;
176
+ handlers.broadcast.session({ key: "sA" });
177
+ assert.equal(chrome("sA").tone, "text.faint");
178
+ assert.equal(calls.popups.at(-1), "qr");
179
+ assert.ok(calls.toasts.includes("微信链接已过期请重新绑定"), "提示原文逐字");
180
+ });
181
+
182
+ // ---------------------------------------------------------------- 服务激活
183
+ test("002·激活2 —— 列表时间位置放微信 icon,标记已绑会话(icon size md)", () => {
184
+ handlers.command.bind({ session: { key: "sA" } });
185
+ extTick("sA");
186
+ scanOk("sA");
187
+ const row = plugin.session_list_render(ctx, { session: { key: "sA" } });
188
+ assert.equal(row?.icon, "assets:wx.svg");
189
+ assert.equal(row?.tone, "accent");
190
+ });
191
+
192
+ test("002·状态1 —— 用户未扫描:未启用(无绑定、无 token)", () => {
193
+ handlers.command.bind({ session: { key: "sA" } });
194
+ extTick("sA");
195
+ assert.equal(mirror().session_id, undefined, "未扫描不得写 sessionId");
196
+ assert.equal(mirror().bot_token, undefined, "未扫描不得有 token");
197
+ });
198
+
199
+ test("002·状态2 —— 扫码出错:二维码框内提示「绑定出错请重试」", () => {
200
+ handlers.command.bind({ session: { key: "sA" } });
201
+ set_mirror({ ...mirror(), qrcode_grid: GRID, qr_error: "微信侧拒绝" });
202
+ const canvas = find(popup(), (n) => n.type === "canvas");
203
+ const texts = canvas.paint.filter((p) => p.op === "text").map((p) => p.value);
204
+ assert.ok(texts.includes("【刷新二维码】"));
205
+ assert.ok(texts.includes("绑定出错请重试"));
206
+ });
207
+
208
+ test("002·状态3 —— 扫码正常返回:绑定 sessionId 并启用", () => {
209
+ handlers.command.bind({ session: { key: "sA" } });
210
+ extTick("sA");
211
+ scanOk("sA");
212
+ assert.equal(mirror().session_id, "sA");
213
+ assert.equal(mirror().bot_token, "TOK");
214
+ assert.equal(chrome("sA").tone, "accent");
215
+ });
216
+
217
+ // ---------------------------------------------------------------- 二维码展示区
218
+ test("002·码区1 —— 未启用:自动展示二维码,无提示信息", () => {
219
+ handlers.command.bind({ session: { key: "sA" } });
220
+ extTick("sA");
221
+ const canvas = find(popup(), (n) => n.type === "canvas");
222
+ assert.equal(canvas.paint.filter((p) => p.op === "text").length, 0, "态1 框内无提示");
223
+ assert.equal(canvas.command, undefined, "态1 画布不可点");
224
+ });
225
+
226
+ test("002·码区3 —— 扫码超时:白遮旧码 + 「扫描超时,刷新重新扫码」", () => {
227
+ handlers.command.bind({ session: { key: "sA" } });
228
+ set_mirror({ ...mirror(), qrcode_grid: GRID, qr_timeout: "1" });
229
+ const canvas = find(popup(), (n) => n.type === "canvas");
230
+ const texts = canvas.paint.filter((p) => p.op === "text").map((p) => p.value);
231
+ assert.ok(texts.includes("扫描超时,刷新重新扫码"), "超时文案逐字");
232
+ assert.ok(canvas.paint.some((p) => p.op === "rect" && p.fill === "#ffffff"), "主题蒙层遮旧码");
233
+ assert.equal(canvas.command, "refresh-qr", "框内可点重出码");
234
+ });
235
+
236
+ test("002·码区3(态分离)—— 链接过期不走扫码超时白遮(两条流程,不互相污染)", () => {
237
+ // 002 过期流程:灰灯 + 提示「微信链接已过期请重新绑定」;码区超时是另一态
238
+ handlers.command.bind({ session: { key: "sA" } });
239
+ set_mirror({ ...mirror(), qrcode_grid: GRID, session_expired: "1" });
240
+ const canvas = find(popup(), (n) => n.type === "canvas");
241
+ assert.ok(!canvas.paint.some((p) => p.op === "text" && /扫描超时/.test(p.value ?? "")), "过期不冒充扫码超时");
242
+
243
+ });
244
+
245
+ test("002·码区注 —— 提示信息显示在二维码方框内", () => {
246
+ handlers.command.bind({ session: { key: "sA" } });
247
+ set_mirror({ ...mirror(), qrcode_grid: GRID, qr_error: "x" });
248
+ const canvas = find(popup(), (n) => n.type === "canvas");
249
+ assert.ok(canvas.paint.some((p) => p.op === "text" && p.value === "【刷新二维码】"));
250
+ assert.equal(find(popup(), (n) => n.type === "text" && /【刷新二维码】/.test(n.value ?? "")), null, "框外无提示");
251
+ });
252
+
253
+ // ---------------------------------------------------------------- 提示信息区
254
+ test("002·提示区 —— 三条固定文案逐字", () => {
255
+ const s = flat(popup());
256
+ assert.ok(s.includes("1、在微信上安装「微信ClawBot」插件"));
257
+ assert.ok(s.includes("2、用微信扫描二维码绑定Pi-Flash会话"));
258
+ assert.ok(s.includes("3、绑定仅限一个会话,但可随时切换"));
259
+ });
260
+
261
+ test("002·提示区 switch —— 「开启/关闭微信通信」,扫码绑定后默认 on", () => {
262
+ handlers.command.bind({ session: { key: "sA" } });
263
+ extTick("sA");
264
+ scanOk("sA");
265
+ set_mirror({ ...mirror(), bind_ok: undefined });
266
+ const sw = find(popup(), (n) => n.type === "switch");
267
+ assert.ok(sw);
268
+ assert.equal(sw.value, true, "扫码绑定后默认 on");
269
+ // 文案与开关已拆成两个节点(文字 faint + switch 本体):整行里能搜到即可
270
+ assert.ok(JSON.stringify(popup()).includes("开启/关闭微信通信"), "switch 行文案");
271
+ });
272
+
273
+ // ---------------------------------------------------------------- 主动断开
274
+ test("002·断开 —— switch 到 off = 断开链接 + 关服务,icon 转灰", () => {
275
+ handlers.command.bind({ session: { key: "sA" } });
276
+ extTick("sA");
277
+ scanOk("sA");
278
+ handlers.command["toggle-enabled"]({ value: false });
279
+ assert.equal(mirror().enabled, "0");
280
+ assert.equal(chrome("sA").tone, "text.faint");
281
+ handlers.command["toggle-enabled"]({ value: true });
282
+ assert.notEqual(mirror().enabled, "0");
283
+ assert.equal(chrome("sA").tone, "accent");
284
+ });
285
+
286
+ test("002·断开1 —— 通信会话被删除:ext 清 sessionId 并关服", () => {
287
+ handlers.command.bind({ session: { key: "sA" } });
288
+ extTick("sA");
289
+ scanOk("sA");
290
+ set_mirror({ ...mirror(), session_id: undefined, session_file: undefined, bot_token: undefined });
291
+ assert.equal(chrome("sA").tone, "text.faint");
292
+ });
293
+
294
+ // ---------------------------------------------------------------- 会话管理
295
+ test("002·会话管理 —— 插件只保存当前 sessionId", () => {
296
+ handlers.command.bind({ session: { key: "sA" } });
297
+ extTick("sA");
298
+ scanOk("sA");
299
+ handlers.command.bind({ session: { key: "sB" } });
300
+ extTick("sB");
301
+ scanOk("sB");
302
+ const m = mirror();
303
+ assert.equal(m.session_id, "sB");
304
+ assert.equal(m.session_id_prev, undefined);
305
+ assert.equal(m.bindings, undefined);
306
+ });
307
+
308
+ // ---- 树遍历 ----
309
+ function find(node, pred) {
310
+ if (!node || typeof node !== "object") return null;
311
+ if (pred(node)) return node;
312
+ for (const c of node.children ?? []) {
313
+ const r = find(c, pred);
314
+ if (r) return r;
315
+ }
316
+ for (const v of Object.values(node)) {
317
+ if (v && typeof v === "object" && !Array.isArray(v)) {
318
+ const r = find(v, pred);
319
+ if (r) return r;
320
+ }
321
+ }
322
+ return null;
323
+ }
@@ -0,0 +1 @@
1
+ [{"data":[198,79,20,175,216,75,154,46,98,7],"ecc":[226,58,61,93,90,107,9,176,241,177],"n":10},{"data":[119,202,125,75,250,235,109,161,160,203,83,40,21,16,147,140,35,165,211,217,56,237,90,133,48,154,8,45,214,222],"ecc":[12,254,22,208,108,67,89,224,129,126],"n":10},{"data":[227,78,146,171,166,16,197,111,231,165,167,239,85,167,104,90,178,128,112,201,17,98,211,226,74,174,157,252,68,44,128,29,177,27,237,209,199,17,208,242,201,35,249,134,160,193,59,142,253,96,18,135,240,145,168,100,105,171,142,223,42,148,8,188],"ecc":[186,24,142,196,177,117,23,19,148,88],"n":10},{"data":[255,5,82,166,75,184,245,18,145,71,76,28,92,195,181,161,124,160,234,107,61,69,144,139,45,255,112,18,81,189,45,63,102,177,143,33,45,47,24,208,203,129,74,147,64,174,99,31,225,244,225,47,192,85,216,188,47,47,255,111,24,128,215,185,8,82,39,42,110,240,160,132,224,35,226,178,171,237,93,58,234,16,220,100,239,98,0,225,53,162,205,168,1,38,117,38,58,170,124,133],"ecc":[71,92,24,113,186,56,59,175,242,145],"n":10},{"data":[5,211,118,87,83,130,12,37,54,132],"ecc":[123,25,225,110,156,208,204,159,127,203,177,181,206,228,76,153],"n":16},{"data":[224,107,72,229,37,156,34,33,251,33,178,4,80,139,129,216,216,66,163,141,122,60,92,163,132,62,138,153,34,15],"ecc":[53,12,55,5,76,72,107,4,154,70,104,108,42,74,218,249],"n":16},{"data":[201,192,108,135,3,104,88,18,76,55,232,29,207,37,114,205,89,148,147,225,229,222,202,132,60,45,175,113,19,39,162,14,49,103,95,90,97,206,211,209,47,127,80,163,240,92,157,87,105,151,217,204,192,21,120,43,73,211,84,102,102,82,128,194],"ecc":[213,253,15,64,119,90,36,254,157,109,179,84,86,107,251,76],"n":16},{"data":[54,110,18,189,71,77,158,97,14,226,229,238,180,104,69,7,3,86,212,20,186,58,38,125,246,154,71,71,45,200,247,220,44,35,124,51,33,100,222,239,228,166,189,87,130,206,248,1,198,233,136,243,63,108,182,176,243,187,80,239,10,96,203,163,14,230,69,0,72,145,190,243,27,62,15,149,134,189,234,113,235,255,45,28,76,223,117,203,46,185,38,94,216,57,35,253,13,81,107,192],"ecc":[114,163,40,208,176,206,155,35,245,241,78,37,133,100,251,217],"n":16},{"data":[227,155,218,93,188,159,112,115,59,110],"ecc":[138,90,38,226,173,91,13,13,115,39,236,173,218,97,143,163,43,54,190,87,167,130,104,57,189,215],"n":26},{"data":[4,218,34,78,13,157,141,91,205,15,62,235,236,183,113,94,204,251,169,242,93,132,80,80,52,59,41,9,148,9],"ecc":[34,57,177,129,197,143,30,65,202,169,122,244,9,45,220,150,129,30,67,77,100,169,96,18,239,236],"n":26},{"data":[110,6,107,219,224,132,226,47,10,68,111,225,90,146,48,181,248,229,10,222,70,116,148,104,6,198,151,227,81,96,131,118,198,245,150,122,59,186,176,22,68,16,0,52,211,106,104,168,151,145,229,161,60,86,184,173,253,25,140,156,97,251,93,21],"ecc":[68,77,129,39,122,202,64,59,234,46,146,17,86,152,8,122,162,251,10,213,111,144,233,124,68,70],"n":26},{"data":[195,215,211,236,55,95,36,120,225,84,70,111,4,182,237,233,199,242,247,7,116,26,52,82,144,177,196,201,254,241,148,62,73,217,89,224,163,177,114,52,204,61,215,215,200,216,122,216,24,6,182,27,118,244,89,47,228,2,3,143,247,238,170,120,162,149,208,67,103,170,175,62,220,146,66,123,112,91,38,83,111,92,67,65,2,253,251,136,204,201,144,253,124,133,108,50,4,117,102,144],"ecc":[76,223,230,170,79,55,252,249,203,126,97,209,54,130,53,144,109,221,120,26,234,233,8,231,130,135],"n":26},{"data":[94,111,178,117,250,57,192,153,54,138],"ecc":[2,179,44,180,33,89,241,225,41,131,99,249,53,217,178,219,208,244],"n":18},{"data":[228,172,210,179,183,186,34,230,137,47,47,210,32,187,209,253,180,2,148,149,82,147,170,69,109,255,196,52,96,137],"ecc":[171,128,128,15,215,8,96,230,158,170,132,123,175,85,229,220,144,123],"n":18},{"data":[55,126,129,39,170,28,239,177,195,35,175,18,236,54,71,44,133,163,158,89,239,34,235,181,134,0,205,30,179,34,178,38,225,174,29,240,135,153,219,193,198,162,113,97,62,29,93,28,37,157,77,189,42,62,45,196,159,243,20,143,191,68,245,181],"ecc":[35,4,180,30,84,209,78,69,43,113,109,244,99,56,160,193,201,179],"n":18},{"data":[237,4,41,150,102,65,73,253,152,249,202,25,165,254,244,231,115,60,35,129,92,93,201,63,231,98,186,92,134,249,199,83,210,104,231,1,119,223,50,126,69,26,196,42,70,97,192,32,24,199,128,2,159,40,181,24,233,119,199,60,240,195,77,215,186,217,102,237,98,21,135,102,14,125,27,5,212,35,3,191,221,212,254,91,152,225,52,5,160,170,175,102,83,198,227,65,250,244,251,229],"ecc":[73,251,83,254,234,73,67,15,139,147,60,188,110,187,249,103,114,225],"n":18},{"data":[7,249,130,110,124,218,86,191,242,46],"ecc":[132,137,59,82,181,162,62,159,48,255,112,56,227,23,218,113,2,184,232,165,20,142,240,22],"n":24},{"data":[125,198,94,17,47,160,121,61,100,68,204,187,181,236,25,199,74,159,2,15,67,182,205,58,109,236,251,83,102,160],"ecc":[247,52,207,231,88,50,35,83,98,34,31,154,184,213,63,197,140,163,108,160,53,202,239,138],"n":24},{"data":[26,197,218,105,61,156,218,155,136,205,80,229,198,28,190,152,229,179,80,121,212,196,158,111,92,192,241,94,230,42,193,68,2,61,154,190,219,208,183,252,37,216,117,148,212,233,185,62,57,155,3,183,252,2,43,213,234,204,229,111,36,238,2,49],"ecc":[33,239,121,134,203,112,41,232,81,157,187,45,231,26,151,197,245,59,90,168,44,220,71,239],"n":24},{"data":[127,65,130,221,139,150,171,27,76,192,214,225,255,83,117,154,151,52,92,15,0,161,71,95,251,154,155,134,55,46,4,239,237,149,137,141,68,57,138,43,156,226,133,9,108,146,254,167,44,222,105,231,89,114,137,172,172,128,169,202,214,169,125,163,16,82,65,113,221,178,78,248,220,249,177,66,39,89,126,121,239,30,254,194,231,205,62,127,111,147,58,175,0,2,33,38,126,172,202,169],"ecc":[224,91,153,114,230,165,171,39,18,101,74,28,89,59,64,30,92,39,60,245,92,81,207,23],"n":24},{"data":[188,126,216,26,0,250,52,126,133,198],"ecc":[199,252,45,170,159,97,72,0,214,208,21,208,116,247,238,90,129,161,4,28,87,98],"n":22},{"data":[151,150,76,165,225,43,227,167,105,56,88,196,217,249,142,236,56,158,127,47,58,2,12,238,41,180,172,121,159,184],"ecc":[177,75,227,68,71,68,126,40,122,80,211,234,186,72,18,33,197,125,155,102,62,11],"n":22},{"data":[236,207,66,204,67,205,116,26,88,32,60,201,223,130,192,78,77,224,193,156,119,130,142,153,117,243,36,168,60,140,198,191,52,57,40,144,18,155,231,223,24,146,24,51,38,222,163,53,144,73,10,173,198,171,18,11,78,120,200,84,71,36,208,120],"ecc":[118,40,224,161,174,250,113,226,110,146,102,47,202,153,237,27,159,186,197,140,26,220],"n":22},{"data":[113,6,132,209,86,65,226,138,45,40,9,126,185,39,252,167,71,60,208,120,47,201,83,24,83,42,237,201,165,247,192,177,80,101,125,85,179,30,176,213,209,232,195,51,221,15,220,20,144,159,219,87,192,89,137,205,218,207,130,131,243,220,134,95,234,37,5,143,247,65,241,141,227,75,31,80,74,73,54,237,209,229,30,111,51,250,134,49,136,20,74,165,154,173,137,111,21,165,51,250],"ecc":[236,200,252,220,24,197,71,156,252,166,65,42,119,53,179,82,10,195,0,82,132,143],"n":22},{"data":[193,100,195,123,220,72,24,201,119,175],"ecc":[172,173,83,149,90,250,216,40,157,70,116,111,119,131,60,1,27,38,118,130,52,169,100,233,240,231,128,80],"n":28},{"data":[169,172,74,55,77,72,211,167,32,105,134,223,23,174,80,166,183,12,65,68,35,243,165,118,115,203,67,232,73,122],"ecc":[121,21,71,4,225,61,217,167,115,22,175,114,180,150,146,211,130,208,156,45,69,192,243,206,42,152,130,246],"n":28},{"data":[95,220,209,95,42,38,1,231,229,127,35,99,54,32,138,183,34,76,14,105,195,85,81,15,207,149,163,249,161,86,230,163,194,82,19,176,39,227,83,104,135,2,183,1,104,34,79,39,246,200,172,9,179,142,120,246,43,146,255,53,250,113,65,227],"ecc":[135,96,247,233,23,45,48,169,31,222,86,156,208,108,15,122,244,169,211,133,20,62,148,176,210,210,219,140],"n":28},{"data":[235,26,235,109,141,229,244,22,28,208,84,190,15,94,214,239,145,201,90,136,60,249,236,187,9,240,101,81,190,222,188,173,248,227,180,146,220,36,212,3,43,240,42,219,117,197,152,68,25,232,158,227,113,99,122,181,66,105,148,38,64,148,82,65,158,166,252,210,210,194,54,33,199,142,18,4,243,156,206,211,33,134,63,70,166,83,196,219,220,233,88,127,170,244,138,42,106,198,75,160],"ecc":[186,222,5,123,187,62,214,128,123,64,91,144,94,70,94,247,144,126,93,68,242,172,74,185,7,198,48,204],"n":28}]
@@ -0,0 +1,37 @@
1
+ {
2
+ "msgs": [
3
+ {
4
+ "seq": 2,
5
+ "message_id": 7513480159106982024,
6
+ "from_user_id": "user_sandbox@im.wechat",
7
+ "to_user_id": "bot_sandbox@im.bot",
8
+ "client_id": "client_sandbox",
9
+ "create_time_ms": 1791353263566,
10
+ "update_time_ms": 1791353263667,
11
+ "delete_time_ms": 0,
12
+ "session_id": "",
13
+ "group_id": "",
14
+ "message_type": 1,
15
+ "message_state": 2,
16
+ "item_list": [
17
+ {
18
+ "type": 1,
19
+ "create_time_ms": 1791353263566,
20
+ "update_time_ms": 1791353263566,
21
+ "is_completed": true,
22
+ "msg_id": "v1:7080285058697933325",
23
+ "button_item_list": [],
24
+ "at_bot_username_list": [],
25
+ "text_item": {
26
+ "text": "测试文本"
27
+ }
28
+ }
29
+ ],
30
+ "context_token": "SANITIZED_CONTEXT_TOKEN",
31
+ "root_id": 0,
32
+ "parent_id": 0
33
+ }
34
+ ],
35
+ "sync_buf": "CAIQxK3mp5E0GKf94KeRNA==",
36
+ "get_updates_buf": "ChAIAhDEreankTQYp/3gp5E0Ejo4NGUxNDQ3Y2ZmYTZAaW0uYm90OjA2MDAwMGJkNzkwMDUzMDVjMmZhY2JhNjE1NTYwNzcwNTNmMmZl"
37
+ }
@@ -0,0 +1 @@
1
+ {"grids":[{"cells":[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,true,false,false,false,false,false,false,true,true,true,true,false,false,true,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,false,true,true,false,false,false,true,true,false,true,false,true,true,true,false,false,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,true,true,true,false,true,true,true,false,true,false,false,true,true,true,true,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,true,true,true,false,false,false,false,true,true,true,true,false,false,true,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,true,false,true,true,true,true,true,true,false,true,false,true,true,true,true,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,true,false,true,false,true,true,true,false,false,true,false,false,true,true,false,false,true,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,true,false,true,false,true,false,true,true,true,true,true,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,true,true,true,true,true,false,false,false,true,false,false,true,true,false,false,true,true,false,false,false,true,true,true,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,false,true,true,false,true,false,true,true,false,false,false,false,true,false,false,true,true,true,true,true,true,false,true,false,false,true,true,false,true,true,false,true,false,false,false,false,false,false,false,false,true,true,true,false,true,false,true,false,true,false,false,false,true,true,true,true,true,false,true,false,false,true,false,false,true,true,false,false,true,false,true,true,false,false,false,false,false,false,false,false,false,true,false,false,false,true,false,false,true,true,true,false,false,false,true,false,false,true,false,false,false,false,true,true,true,false,false,false,false,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,true,false,false,true,false,false,true,false,true,true,true,true,true,false,false,true,false,false,false,false,true,true,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,false,true,false,true,false,false,true,false,false,false,false,true,false,true,false,true,false,false,true,true,false,false,true,false,false,true,false,true,true,false,false,false,false,false,false,false,false,false,true,false,true,false,false,true,true,true,true,true,false,false,false,false,true,true,true,false,false,false,true,false,false,false,true,true,false,true,false,false,true,false,false,false,false,false,false,false,false,false,true,false,false,true,true,true,false,false,false,true,false,true,false,true,false,true,false,false,true,true,true,true,true,true,false,true,true,false,true,true,true,false,false,false,false,false,false,false,false,false,false,true,false,true,true,false,true,true,true,true,true,false,true,true,false,true,true,false,true,false,false,true,false,false,true,true,true,false,true,true,false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,true,true,false,false,true,false,true,true,false,false,false,true,false,true,false,false,true,true,true,false,true,false,false,true,true,false,true,true,false,true,false,false,false,false,false,false,false,false,false,true,false,false,true,true,true,false,false,true,false,false,true,false,false,true,true,false,true,false,true,false,false,false,false,true,true,true,true,false,true,true,false,false,false,false,false,false,false,false,false,true,false,true,false,false,false,false,false,true,true,true,false,true,false,true,false,false,false,true,false,false,true,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,false,true,true,true,true,false,true,false,false,true,true,false,true,false,false,true,true,true,false,false,true,false,true,false,true,true,true,false,true,true,false,false,false,false,false,false,false,false,true,false,true,false,true,false,false,false,true,false,false,true,false,true,true,true,true,false,true,true,false,false,true,true,true,true,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,true,false,false,true,false,false,true,false,true,true,false,true,false,false,false,true,false,true,false,true,false,true,false,true,true,true,true,false,true,false,false,false,false,false,false,false,false,false,true,false,false,true,false,true,false,false,true,true,false,false,false,true,true,false,true,false,false,false,true,true,false,true,true,true,false,true,false,false,true,true,true,false,false,false,false,false,false,false,false,true,false,false,true,true,false,true,false,false,true,false,false,false,false,false,false,false,true,false,false,false,false,true,false,true,true,true,true,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,true,false,false,true,true,false,true,true,true,true,false,true,false,false,false,true,false,true,false,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,true,false,true,false,true,true,false,true,false,false,true,false,false,true,true,false,true,false,true,false,true,true,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,true,true,true,true,true,true,false,false,true,true,true,false,true,true,true,true,true,false,false,false,true,true,true,true,false,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,false,false,false,true,true,false,true,false,false,false,true,false,false,false,true,true,true,true,true,true,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,false,true,true,true,false,true,false,false,true,true,false,true,true,false,true,true,false,false,true,true,false,true,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,true,false,false,false,true,true,true,false,true,false,false,false,true,true,false,false,true,true,false,true,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,false,false,true,false,false,false,true,false,false,false,false,true,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,true,false,false,true,true,false,true,false,true,true,false,false,false,true,true,true,true,false,true,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"funcs":[true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"module_size":33,"quiet":4,"size":41,"url":"https://ilinkai.weixin.qq.com/ilink/bot/qr?x=1234567890"},{"cells":[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,true,false,false,true,false,true,true,false,true,false,false,false,false,true,true,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,true,false,true,false,false,false,false,true,true,false,true,false,false,true,false,true,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,false,false,true,true,false,true,true,false,false,false,false,true,false,false,true,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,false,true,false,false,true,true,false,true,true,false,true,false,true,false,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,false,false,true,false,true,false,false,false,true,true,true,false,true,true,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,true,true,true,false,false,false,false,false,true,false,true,true,false,true,true,false,true,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,true,false,true,true,true,true,true,false,false,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,true,false,true,true,true,true,false,false,true,false,false,false,false,true,true,true,false,true,true,false,true,true,true,true,true,true,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,false,true,false,false,false,false,true,true,true,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,true,true,false,true,false,false,true,true,true,true,false,false,true,false,false,true,false,true,false,false,false,true,true,true,true,true,false,false,false,true,false,true,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,true,true,true,true,true,false,false,true,false,true,true,true,true,true,true,false,false,false,true,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,true,false,false,false,false,true,true,false,false,true,false,true,false,true,true,false,false,false,true,false,true,true,false,true,true,false,true,false,true,true,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,false,true,false,true,true,true,false,false,false,false,false,false,true,true,false,true,false,false,true,true,false,true,false,true,false,true,true,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,true,true,false,false,true,true,false,false,false,false,true,false,true,true,false,true,false,true,true,true,true,true,false,true,false,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,true,true,true,true,false,true,true,false,false,true,false,true,true,true,false,true,false,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,true,false,true,true,false,true,false,true,false,true,true,true,false,true,false,false,true,true,true,false,true,false,true,false,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,true,true,false,true,false,true,false,true,true,true,true,false,true,false,false,true,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,false,true,true,true,false,false,false,false,true,true,false,false,true,false,false,true,false,false,false,true,true,false,true,false,true,false,true,false,true,false,false,false,false,false,false,false,false,false,true,false,true,false,false,true,false,true,true,false,false,true,false,false,true,false,false,false,false,true,true,true,true,false,false,true,false,true,false,false,false,true,false,false,false,false,false,false,false,false,false,false,true,true,false,true,false,true,true,false,false,false,false,false,false,true,true,true,false,false,false,true,true,false,false,true,false,true,false,true,true,false,true,true,false,false,false,false,false,false,false,false,true,false,false,true,true,true,false,true,true,true,true,true,false,true,false,false,false,false,true,true,true,true,true,true,false,true,false,true,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,true,true,true,true,true,false,false,false,false,true,false,false,false,false,true,true,true,true,true,true,false,true,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,true,true,false,true,false,false,true,true,true,false,true,false,false,true,true,true,true,false,true,true,false,false,false,true,true,false,true,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,false,true,true,true,false,false,false,false,true,true,true,false,false,true,false,true,true,true,true,false,true,true,true,true,true,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,false,false,true,false,false,false,true,true,true,false,false,false,true,false,true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,false,true,false,false,true,true,false,true,false,false,true,false,true,false,true,false,true,false,true,true,false,true,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,true,false,false,true,false,false,true,false,true,true,false,false,true,false,false,true,false,false,false,true,false,false,true,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,true,false,false,true,false,true,false,false,true,false,false,true,false,false,true,true,true,true,true,true,false,true,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,true,false,false,true,true,false,true,true,false,false,true,true,true,true,false,false,true,true,true,false,true,false,false,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,true,true,false,true,true,false,true,false,true,false,false,true,true,false,true,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,true,false,true,false,true,false,false,false,true,true,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,true,true,false,true,false,false,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"funcs":[true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"module_size":33,"quiet":4,"size":41,"url":"https://work.weixin.qq.com/ca/cawdeadbeefcafe12345"},{"cells":[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,true,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,true,true,true,false,false,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,true,false,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,false,false,true,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,false,true,false,true,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,true,false,true,false,true,false,false,false,true,true,false,false,false,false,true,false,false,true,false,false,false,false,false,false,false,false,false,true,true,false,true,true,false,false,true,false,false,true,false,false,false,true,false,false,false,true,false,false,false,false,false,false,false,false,false,false,true,false,true,false,true,true,true,false,true,false,true,false,true,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,false,true,false,false,false,false,false,true,true,false,false,false,true,false,false,true,true,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,true,true,false,false,false,true,false,true,false,true,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,true,false,true,false,true,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,true,true,false,true,true,true,false,true,true,true,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,false,true,true,true,true,false,true,true,true,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,true,true,false,true,true,true,false,false,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,true,false,false,false,true,false,false,false,true,true,false,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,false,false,true,false,false,false,true,false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,true,true,false,false,false,true,false,false,false,true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,true,false,true,false,true,false,true,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"funcs":[true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false],"module_size":21,"quiet":4,"size":29,"url":"短"}]}