@jcheesepkg/nanobot 0.8.8 → 0.8.9
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/dist/_virtual/_rolldown/runtime.mjs +7 -0
- package/dist/agent/tools/flex.test.d.mts +1 -0
- package/dist/agent/tools/flex.test.mjs +258 -0
- package/dist/agent/tools/flex.test.mjs.map +1 -0
- package/dist/channels/line.d.mts +3 -1
- package/dist/channels/line.d.mts.map +1 -1
- package/dist/channels/line.mjs +56 -6
- package/dist/channels/line.mjs.map +1 -1
- package/dist/channels/line.test.d.mts +1 -0
- package/dist/channels/line.test.mjs +202 -0
- package/dist/channels/line.test.mjs.map +1 -0
- package/dist/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs +78 -0
- package/dist/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +1 -0
- package/dist/node_modules/@vitest/expect/dist/index.mjs +1257 -0
- package/dist/node_modules/@vitest/expect/dist/index.mjs.map +1 -0
- package/dist/node_modules/@vitest/pretty-format/dist/index.mjs +815 -0
- package/dist/node_modules/@vitest/pretty-format/dist/index.mjs.map +1 -0
- package/dist/node_modules/@vitest/runner/dist/chunk-tasks.mjs +43 -0
- package/dist/node_modules/@vitest/runner/dist/chunk-tasks.mjs.map +1 -0
- package/dist/node_modules/@vitest/runner/dist/index.mjs +563 -0
- package/dist/node_modules/@vitest/runner/dist/index.mjs.map +1 -0
- package/dist/node_modules/@vitest/runner/dist/utils.mjs +3 -0
- package/dist/node_modules/@vitest/snapshot/dist/index.mjs +1736 -0
- package/dist/node_modules/@vitest/snapshot/dist/index.mjs.map +1 -0
- package/dist/node_modules/@vitest/snapshot/node_modules/pathe/dist/shared/pathe.ff20891b.mjs +82 -0
- package/dist/node_modules/@vitest/snapshot/node_modules/pathe/dist/shared/pathe.ff20891b.mjs.map +1 -0
- package/dist/node_modules/@vitest/spy/dist/index.mjs +139 -0
- package/dist/node_modules/@vitest/spy/dist/index.mjs.map +1 -0
- package/dist/node_modules/@vitest/utils/dist/chunk-_commonjsHelpers.mjs +119 -0
- package/dist/node_modules/@vitest/utils/dist/chunk-_commonjsHelpers.mjs.map +1 -0
- package/dist/node_modules/@vitest/utils/dist/diff.mjs +1227 -0
- package/dist/node_modules/@vitest/utils/dist/diff.mjs.map +1 -0
- package/dist/node_modules/@vitest/utils/dist/error.mjs +92 -0
- package/dist/node_modules/@vitest/utils/dist/error.mjs.map +1 -0
- package/dist/node_modules/@vitest/utils/dist/helpers.mjs +113 -0
- package/dist/node_modules/@vitest/utils/dist/helpers.mjs.map +1 -0
- package/dist/node_modules/@vitest/utils/dist/index.mjs +455 -0
- package/dist/node_modules/@vitest/utils/dist/index.mjs.map +1 -0
- package/dist/node_modules/@vitest/utils/dist/source-map.mjs +164 -0
- package/dist/node_modules/@vitest/utils/dist/source-map.mjs.map +1 -0
- package/dist/node_modules/chai/index.mjs +3088 -0
- package/dist/node_modules/chai/index.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/arguments.mjs +12 -0
- package/dist/node_modules/loupe/lib/arguments.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/array.mjs +17 -0
- package/dist/node_modules/loupe/lib/array.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/bigint.mjs +12 -0
- package/dist/node_modules/loupe/lib/bigint.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/class.mjs +16 -0
- package/dist/node_modules/loupe/lib/class.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/date.mjs +14 -0
- package/dist/node_modules/loupe/lib/date.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/error.mjs +35 -0
- package/dist/node_modules/loupe/lib/error.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/function.mjs +13 -0
- package/dist/node_modules/loupe/lib/function.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/helpers.mjs +123 -0
- package/dist/node_modules/loupe/lib/helpers.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/html.mjs +40 -0
- package/dist/node_modules/loupe/lib/html.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/index.mjs +100 -0
- package/dist/node_modules/loupe/lib/index.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/map.mjs +26 -0
- package/dist/node_modules/loupe/lib/map.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/number.mjs +15 -0
- package/dist/node_modules/loupe/lib/number.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/object.mjs +22 -0
- package/dist/node_modules/loupe/lib/object.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/promise.mjs +6 -0
- package/dist/node_modules/loupe/lib/promise.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/regexp.mjs +13 -0
- package/dist/node_modules/loupe/lib/regexp.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/set.mjs +19 -0
- package/dist/node_modules/loupe/lib/set.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/string.mjs +26 -0
- package/dist/node_modules/loupe/lib/string.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/symbol.mjs +9 -0
- package/dist/node_modules/loupe/lib/symbol.mjs.map +1 -0
- package/dist/node_modules/loupe/lib/typedarray.mjs +31 -0
- package/dist/node_modules/loupe/lib/typedarray.mjs.map +1 -0
- package/dist/node_modules/magic-string/dist/magic-string.es.mjs +940 -0
- package/dist/node_modules/magic-string/dist/magic-string.es.mjs.map +1 -0
- package/dist/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.mjs +82 -0
- package/dist/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.mjs.map +1 -0
- package/dist/node_modules/tinyrainbow/dist/node.mjs +9 -0
- package/dist/node_modules/tinyrainbow/dist/node.mjs.map +1 -0
- package/dist/node_modules/tinyspy/dist/index.mjs +79 -0
- package/dist/node_modules/tinyspy/dist/index.mjs.map +1 -0
- package/dist/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.mjs +9 -0
- package/dist/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.mjs.map +1 -0
- package/dist/node_modules/vitest/dist/chunks/date.W2xKR2qe.mjs +51 -0
- package/dist/node_modules/vitest/dist/chunks/date.W2xKR2qe.mjs.map +1 -0
- package/dist/node_modules/vitest/dist/chunks/utils.C8RiOc4B.mjs +49 -0
- package/dist/node_modules/vitest/dist/chunks/utils.C8RiOc4B.mjs.map +1 -0
- package/dist/node_modules/vitest/dist/chunks/vi.DgezovHB.mjs +2425 -0
- package/dist/node_modules/vitest/dist/chunks/vi.DgezovHB.mjs.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { __require } from "../_virtual/_rolldown/runtime.mjs";
|
|
2
|
+
import { MessageBus } from "../bus/queue.mjs";
|
|
3
|
+
import { LineChannel, verifyLineSignature } from "./line.mjs";
|
|
4
|
+
import { describe, it } from "../node_modules/@vitest/runner/dist/index.mjs";
|
|
5
|
+
import { globalExpect } from "../node_modules/vitest/dist/chunks/vi.DgezovHB.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/channels/line.test.ts
|
|
8
|
+
const ch = new LineChannel({
|
|
9
|
+
enabled: false,
|
|
10
|
+
channelSecret: "test",
|
|
11
|
+
channelAccessToken: "test",
|
|
12
|
+
allowFrom: []
|
|
13
|
+
}, new MessageBus());
|
|
14
|
+
describe("findJsonEnd", () => {
|
|
15
|
+
it("finds end of simple object", () => {
|
|
16
|
+
globalExpect(ch.findJsonEnd("{\"a\":1}")).toBe(7);
|
|
17
|
+
});
|
|
18
|
+
it("finds end of nested object", () => {
|
|
19
|
+
globalExpect(ch.findJsonEnd("{\"a\":{\"b\":{\"c\":1}}}")).toBe(19);
|
|
20
|
+
});
|
|
21
|
+
it("finds end with trailing text", () => {
|
|
22
|
+
globalExpect(ch.findJsonEnd("{\"type\":\"bubble\"} some trailing text")).toBe(17);
|
|
23
|
+
});
|
|
24
|
+
it("handles strings with escaped quotes", () => {
|
|
25
|
+
globalExpect(ch.findJsonEnd("{\"text\":\"say \\\"hello\\\"\"}")).toBe(24);
|
|
26
|
+
});
|
|
27
|
+
it("handles strings with braces inside", () => {
|
|
28
|
+
globalExpect(ch.findJsonEnd("{\"text\":\"{ not a real brace }\"}")).toBe(31);
|
|
29
|
+
});
|
|
30
|
+
it("handles escaped backslash before quote", () => {
|
|
31
|
+
globalExpect(ch.findJsonEnd("{\"path\":\"C:\\\\\"}")).toBe(15);
|
|
32
|
+
});
|
|
33
|
+
it("returns -1 for non-object string", () => {
|
|
34
|
+
globalExpect(ch.findJsonEnd("hello")).toBe(-1);
|
|
35
|
+
});
|
|
36
|
+
it("returns -1 for unclosed object", () => {
|
|
37
|
+
globalExpect(ch.findJsonEnd("{\"a\":1")).toBe(-1);
|
|
38
|
+
});
|
|
39
|
+
it("handles empty object", () => {
|
|
40
|
+
globalExpect(ch.findJsonEnd("{}")).toBe(2);
|
|
41
|
+
});
|
|
42
|
+
it("handles arrays inside objects", () => {
|
|
43
|
+
globalExpect(ch.findJsonEnd("{\"items\":[1,2,3]}")).toBe(17);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe("extractAltText", () => {
|
|
47
|
+
it("extracts text from a simple bubble", () => {
|
|
48
|
+
globalExpect(ch.extractAltText({
|
|
49
|
+
type: "bubble",
|
|
50
|
+
body: {
|
|
51
|
+
type: "box",
|
|
52
|
+
contents: [{
|
|
53
|
+
type: "text",
|
|
54
|
+
text: "Hello World"
|
|
55
|
+
}]
|
|
56
|
+
}
|
|
57
|
+
})).toBe("Hello World");
|
|
58
|
+
});
|
|
59
|
+
it("extracts title when present", () => {
|
|
60
|
+
globalExpect(ch.extractAltText({
|
|
61
|
+
type: "bubble",
|
|
62
|
+
title: "Card Title",
|
|
63
|
+
body: {
|
|
64
|
+
type: "box",
|
|
65
|
+
contents: []
|
|
66
|
+
}
|
|
67
|
+
})).toBe("Card Title");
|
|
68
|
+
});
|
|
69
|
+
it("falls back to 'Flex Message' when no text found", () => {
|
|
70
|
+
globalExpect(ch.extractAltText({ type: "bubble" })).toBe("Flex Message");
|
|
71
|
+
});
|
|
72
|
+
it("truncates long text to 100 chars", () => {
|
|
73
|
+
const longText = "x".repeat(200);
|
|
74
|
+
globalExpect(ch.extractAltText({
|
|
75
|
+
type: "bubble",
|
|
76
|
+
body: {
|
|
77
|
+
type: "box",
|
|
78
|
+
contents: [{
|
|
79
|
+
type: "text",
|
|
80
|
+
text: longText
|
|
81
|
+
}]
|
|
82
|
+
}
|
|
83
|
+
}).length).toBe(100);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe("parseMessage", () => {
|
|
87
|
+
it("returns plain text for normal messages", () => {
|
|
88
|
+
const result = ch.parseMessage("Hello, world!");
|
|
89
|
+
globalExpect(result).toHaveLength(1);
|
|
90
|
+
globalExpect(result[0].type).toBe("text");
|
|
91
|
+
globalExpect(result[0].text).toBe("Hello, world!");
|
|
92
|
+
});
|
|
93
|
+
it("returns (empty) for empty string", () => {
|
|
94
|
+
const result = ch.parseMessage("");
|
|
95
|
+
globalExpect(result).toHaveLength(1);
|
|
96
|
+
globalExpect(result[0].text).toBe("(empty)");
|
|
97
|
+
});
|
|
98
|
+
it("parses pure JSON flex message", () => {
|
|
99
|
+
const flex = JSON.stringify({
|
|
100
|
+
type: "bubble",
|
|
101
|
+
body: {
|
|
102
|
+
type: "box",
|
|
103
|
+
layout: "vertical",
|
|
104
|
+
contents: [{
|
|
105
|
+
type: "text",
|
|
106
|
+
text: "Test"
|
|
107
|
+
}]
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
const result = ch.parseMessage(flex);
|
|
111
|
+
globalExpect(result).toHaveLength(1);
|
|
112
|
+
globalExpect(result[0].type).toBe("flex");
|
|
113
|
+
globalExpect(result[0].altText).toBe("Test");
|
|
114
|
+
});
|
|
115
|
+
it("handles JSON with trailing text", () => {
|
|
116
|
+
const input = JSON.stringify({
|
|
117
|
+
type: "bubble",
|
|
118
|
+
body: {
|
|
119
|
+
type: "box",
|
|
120
|
+
layout: "vertical",
|
|
121
|
+
contents: [{
|
|
122
|
+
type: "text",
|
|
123
|
+
text: "Card"
|
|
124
|
+
}]
|
|
125
|
+
}
|
|
126
|
+
}) + "\n\nHere is some extra text!";
|
|
127
|
+
const result = ch.parseMessage(input);
|
|
128
|
+
globalExpect(result).toHaveLength(2);
|
|
129
|
+
globalExpect(result[0].type).toBe("flex");
|
|
130
|
+
globalExpect(result[1].type).toBe("text");
|
|
131
|
+
globalExpect(result[1].text).toBe("Here is some extra text!");
|
|
132
|
+
});
|
|
133
|
+
it("handles JSON with Japanese trailing text", () => {
|
|
134
|
+
const input = JSON.stringify({
|
|
135
|
+
type: "bubble",
|
|
136
|
+
body: {
|
|
137
|
+
type: "box",
|
|
138
|
+
layout: "vertical",
|
|
139
|
+
contents: [{
|
|
140
|
+
type: "text",
|
|
141
|
+
text: "運勢"
|
|
142
|
+
}]
|
|
143
|
+
}
|
|
144
|
+
}) + "\n\n記録できた!今日もがんばろう。";
|
|
145
|
+
const result = ch.parseMessage(input);
|
|
146
|
+
globalExpect(result).toHaveLength(2);
|
|
147
|
+
globalExpect(result[0].type).toBe("flex");
|
|
148
|
+
globalExpect(result[1].type).toBe("text");
|
|
149
|
+
globalExpect(result[1].text).toBe("記録できた!今日もがんばろう。");
|
|
150
|
+
});
|
|
151
|
+
it("handles whitespace around JSON", () => {
|
|
152
|
+
const flex = JSON.stringify({
|
|
153
|
+
type: "bubble",
|
|
154
|
+
body: {
|
|
155
|
+
type: "box",
|
|
156
|
+
contents: [{
|
|
157
|
+
type: "text",
|
|
158
|
+
text: "OK"
|
|
159
|
+
}]
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
const result = ch.parseMessage(" " + flex + " ");
|
|
163
|
+
globalExpect(result).toHaveLength(1);
|
|
164
|
+
globalExpect(result[0].type).toBe("flex");
|
|
165
|
+
});
|
|
166
|
+
it("falls back to text for invalid JSON starting with {", () => {
|
|
167
|
+
const result = ch.parseMessage("{not valid json at all}");
|
|
168
|
+
globalExpect(result).toHaveLength(1);
|
|
169
|
+
globalExpect(result[0].type).toBe("text");
|
|
170
|
+
globalExpect(result[0].text).toBe("{not valid json at all}");
|
|
171
|
+
});
|
|
172
|
+
it("falls back to text for non-JSON curly brace text", () => {
|
|
173
|
+
const result = ch.parseMessage("{incomplete json");
|
|
174
|
+
globalExpect(result).toHaveLength(1);
|
|
175
|
+
globalExpect(result[0].type).toBe("text");
|
|
176
|
+
});
|
|
177
|
+
it("splits real-world flex JSON with trailing Japanese text", () => {
|
|
178
|
+
const result = ch.parseMessage(`{"type":"bubble","body":{"type":"box","layout":"vertical","contents":[{"type":"box","layout":"vertical","contents":[{"type": "text","text":"🌱 水やり記録","size": "xl" ,"weight":"bold"},{"type": "text","text":"前回: 今日\\n植物たち元気?", "color":"#666666","margin":"md"}]},{"type": "separator","margin":"lg"},{"type": "box","layout":"horizontal","margin":"md","spacing":"md","contents":[{"type": "button","style": "primary","color": "#4CAF50","action":{"type": "message","label": "水やりした!", "text": "水やりした"}},{"type": "button","style": "secondary","action":{"type": "message","label": "最後にいつ?", "text": "水やり確認"}}]}]}}\n\n記録できた!今日水やりしたことになってる。緑色のボタンがカワイイでしょ。`);
|
|
179
|
+
globalExpect(result).toHaveLength(2);
|
|
180
|
+
globalExpect(result[0].type).toBe("flex");
|
|
181
|
+
globalExpect(result[1].type).toBe("text");
|
|
182
|
+
globalExpect(result[1].text).toBe("記録できた!今日水やりしたことになってる。緑色のボタンがカワイイでしょ。");
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe("verifyLineSignature", () => {
|
|
186
|
+
it("returns true for valid signature", () => {
|
|
187
|
+
const secret = "test-secret";
|
|
188
|
+
const body = "{\"events\":[]}";
|
|
189
|
+
const { createHmac } = __require("node:crypto");
|
|
190
|
+
globalExpect(verifyLineSignature(secret, body, createHmac("sha256", secret).update(body).digest("base64"))).toBe(true);
|
|
191
|
+
});
|
|
192
|
+
it("returns false for invalid signature", () => {
|
|
193
|
+
globalExpect(verifyLineSignature("secret", "body", "bad-sig")).toBe(false);
|
|
194
|
+
});
|
|
195
|
+
it("returns false for empty signature", () => {
|
|
196
|
+
globalExpect(verifyLineSignature("secret", "body", "")).toBe(false);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
//#endregion
|
|
201
|
+
export { };
|
|
202
|
+
//# sourceMappingURL=line.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line.test.mjs","names":[],"sources":["../../src/channels/line.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { LineChannel } from \"./line.js\";\nimport { MessageBus } from \"../bus/queue.js\";\n\n// Construct a minimal LineChannel for testing private methods\nconst bus = new MessageBus();\nconst channel = new LineChannel(\n { enabled: false, channelSecret: \"test\", channelAccessToken: \"test\", allowFrom: [] },\n bus,\n);\n\n// Access private methods via any\nconst ch = channel as unknown as {\n parseMessage(text: string): Array<{ type: string; text?: string; altText?: string; contents?: unknown }>;\n findJsonEnd(str: string): number;\n extractAltText(contents: Record<string, unknown>): string;\n returnFlexMessage(message: string): Array<{ type: string; altText?: string; contents?: unknown }>;\n};\n\n// ---------------------------------------------------------------------------\n// findJsonEnd\n// ---------------------------------------------------------------------------\ndescribe(\"findJsonEnd\", () => {\n it(\"finds end of simple object\", () => {\n expect(ch.findJsonEnd('{\"a\":1}')).toBe(7);\n });\n\n it(\"finds end of nested object\", () => {\n const json = '{\"a\":{\"b\":{\"c\":1}}}';\n expect(ch.findJsonEnd(json)).toBe(json.length);\n });\n\n it(\"finds end with trailing text\", () => {\n const str = '{\"type\":\"bubble\"} some trailing text';\n expect(ch.findJsonEnd(str)).toBe(17);\n });\n\n it(\"handles strings with escaped quotes\", () => {\n const json = '{\"text\":\"say \\\\\"hello\\\\\"\"}';\n expect(ch.findJsonEnd(json)).toBe(json.length);\n });\n\n it(\"handles strings with braces inside\", () => {\n const json = '{\"text\":\"{ not a real brace }\"}';\n expect(ch.findJsonEnd(json)).toBe(json.length);\n });\n\n it(\"handles escaped backslash before quote\", () => {\n // The string value is: path\\\\ (backslash is escaped, quote is not)\n const json = '{\"path\":\"C:\\\\\\\\\"}';\n expect(ch.findJsonEnd(json)).toBe(json.length);\n });\n\n it(\"returns -1 for non-object string\", () => {\n expect(ch.findJsonEnd(\"hello\")).toBe(-1);\n });\n\n it(\"returns -1 for unclosed object\", () => {\n expect(ch.findJsonEnd('{\"a\":1')).toBe(-1);\n });\n\n it(\"handles empty object\", () => {\n expect(ch.findJsonEnd(\"{}\")).toBe(2);\n });\n\n it(\"handles arrays inside objects\", () => {\n const json = '{\"items\":[1,2,3]}';\n expect(ch.findJsonEnd(json)).toBe(json.length);\n });\n});\n\n// ---------------------------------------------------------------------------\n// extractAltText\n// ---------------------------------------------------------------------------\ndescribe(\"extractAltText\", () => {\n it(\"extracts text from a simple bubble\", () => {\n const result = ch.extractAltText({\n type: \"bubble\",\n body: { type: \"box\", contents: [{ type: \"text\", text: \"Hello World\" }] },\n });\n expect(result).toBe(\"Hello World\");\n });\n\n it(\"extracts title when present\", () => {\n const result = ch.extractAltText({\n type: \"bubble\",\n title: \"Card Title\",\n body: { type: \"box\", contents: [] },\n });\n expect(result).toBe(\"Card Title\");\n });\n\n it(\"falls back to 'Flex Message' when no text found\", () => {\n const result = ch.extractAltText({ type: \"bubble\" });\n expect(result).toBe(\"Flex Message\");\n });\n\n it(\"truncates long text to 100 chars\", () => {\n const longText = \"x\".repeat(200);\n const result = ch.extractAltText({\n type: \"bubble\",\n body: { type: \"box\", contents: [{ type: \"text\", text: longText }] },\n });\n expect(result.length).toBe(100);\n });\n});\n\n// ---------------------------------------------------------------------------\n// parseMessage\n// ---------------------------------------------------------------------------\ndescribe(\"parseMessage\", () => {\n it(\"returns plain text for normal messages\", () => {\n const result = ch.parseMessage(\"Hello, world!\");\n expect(result).toHaveLength(1);\n expect(result[0].type).toBe(\"text\");\n expect(result[0].text).toBe(\"Hello, world!\");\n });\n\n it(\"returns (empty) for empty string\", () => {\n const result = ch.parseMessage(\"\");\n expect(result).toHaveLength(1);\n expect(result[0].text).toBe(\"(empty)\");\n });\n\n it(\"parses pure JSON flex message\", () => {\n const flex = JSON.stringify({\n type: \"bubble\",\n body: { type: \"box\", layout: \"vertical\", contents: [{ type: \"text\", text: \"Test\" }] },\n });\n const result = ch.parseMessage(flex);\n expect(result).toHaveLength(1);\n expect(result[0].type).toBe(\"flex\");\n expect(result[0].altText).toBe(\"Test\");\n });\n\n it(\"handles JSON with trailing text\", () => {\n const flex = JSON.stringify({\n type: \"bubble\",\n body: { type: \"box\", layout: \"vertical\", contents: [{ type: \"text\", text: \"Card\" }] },\n });\n const input = flex + \"\\n\\nHere is some extra text!\";\n const result = ch.parseMessage(input);\n expect(result).toHaveLength(2);\n expect(result[0].type).toBe(\"flex\");\n expect(result[1].type).toBe(\"text\");\n expect(result[1].text).toBe(\"Here is some extra text!\");\n });\n\n it(\"handles JSON with Japanese trailing text\", () => {\n const flex = JSON.stringify({\n type: \"bubble\",\n body: { type: \"box\", layout: \"vertical\", contents: [{ type: \"text\", text: \"運勢\" }] },\n });\n const input = flex + \"\\n\\n記録できた!今日もがんばろう。\";\n const result = ch.parseMessage(input);\n expect(result).toHaveLength(2);\n expect(result[0].type).toBe(\"flex\");\n expect(result[1].type).toBe(\"text\");\n expect(result[1].text).toBe(\"記録できた!今日もがんばろう。\");\n });\n\n it(\"handles whitespace around JSON\", () => {\n const flex = JSON.stringify({ type: \"bubble\", body: { type: \"box\", contents: [{ type: \"text\", text: \"OK\" }] } });\n const result = ch.parseMessage(\" \" + flex + \" \");\n expect(result).toHaveLength(1);\n expect(result[0].type).toBe(\"flex\");\n });\n\n it(\"falls back to text for invalid JSON starting with {\", () => {\n const result = ch.parseMessage(\"{not valid json at all}\");\n expect(result).toHaveLength(1);\n expect(result[0].type).toBe(\"text\");\n expect(result[0].text).toBe(\"{not valid json at all}\");\n });\n\n it(\"falls back to text for non-JSON curly brace text\", () => {\n const result = ch.parseMessage(\"{incomplete json\");\n expect(result).toHaveLength(1);\n expect(result[0].type).toBe(\"text\");\n });\n\n it(\"splits real-world flex JSON with trailing Japanese text\", () => {\n const input = `{\"type\":\"bubble\",\"body\":{\"type\":\"box\",\"layout\":\"vertical\",\"contents\":[{\"type\":\"box\",\"layout\":\"vertical\",\"contents\":[{\"type\": \"text\",\"text\":\"🌱 水やり記録\",\"size\": \"xl\" ,\"weight\":\"bold\"},{\"type\": \"text\",\"text\":\"前回: 今日\\\\n植物たち元気?\", \"color\":\"#666666\",\"margin\":\"md\"}]},{\"type\": \"separator\",\"margin\":\"lg\"},{\"type\": \"box\",\"layout\":\"horizontal\",\"margin\":\"md\",\"spacing\":\"md\",\"contents\":[{\"type\": \"button\",\"style\": \"primary\",\"color\": \"#4CAF50\",\"action\":{\"type\": \"message\",\"label\": \"水やりした!\", \"text\": \"水やりした\"}},{\"type\": \"button\",\"style\": \"secondary\",\"action\":{\"type\": \"message\",\"label\": \"最後にいつ?\", \"text\": \"水やり確認\"}}]}]}}\\n\\n記録できた!今日水やりしたことになってる。緑色のボタンがカワイイでしょ。`;\n const result = ch.parseMessage(input);\n expect(result).toHaveLength(2);\n expect(result[0].type).toBe(\"flex\");\n expect(result[1].type).toBe(\"text\");\n expect(result[1].text).toBe(\"記録できた!今日水やりしたことになってる。緑色のボタンがカワイイでしょ。\");\n });\n});\n\n// ---------------------------------------------------------------------------\n// verifyLineSignature (exported function)\n// ---------------------------------------------------------------------------\nimport { verifyLineSignature } from \"./line.js\";\n\ndescribe(\"verifyLineSignature\", () => {\n it(\"returns true for valid signature\", () => {\n const secret = \"test-secret\";\n const body = '{\"events\":[]}';\n // Compute the expected signature\n const { createHmac } = require(\"node:crypto\");\n const expected = createHmac(\"sha256\", secret).update(body).digest(\"base64\");\n expect(verifyLineSignature(secret, body, expected)).toBe(true);\n });\n\n it(\"returns false for invalid signature\", () => {\n expect(verifyLineSignature(\"secret\", \"body\", \"bad-sig\")).toBe(false);\n });\n\n it(\"returns false for empty signature\", () => {\n expect(verifyLineSignature(\"secret\", \"body\", \"\")).toBe(false);\n });\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
//#region node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
|
|
2
|
+
var comma = ",".charCodeAt(0);
|
|
3
|
+
var semicolon = ";".charCodeAt(0);
|
|
4
|
+
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
5
|
+
var intToChar = new Uint8Array(64);
|
|
6
|
+
var charToInt = new Uint8Array(128);
|
|
7
|
+
for (let i = 0; i < chars.length; i++) {
|
|
8
|
+
const c = chars.charCodeAt(i);
|
|
9
|
+
intToChar[i] = c;
|
|
10
|
+
charToInt[c] = i;
|
|
11
|
+
}
|
|
12
|
+
function encodeInteger(builder, num, relative) {
|
|
13
|
+
let delta = num - relative;
|
|
14
|
+
delta = delta < 0 ? -delta << 1 | 1 : delta << 1;
|
|
15
|
+
do {
|
|
16
|
+
let clamped = delta & 31;
|
|
17
|
+
delta >>>= 5;
|
|
18
|
+
if (delta > 0) clamped |= 32;
|
|
19
|
+
builder.write(intToChar[clamped]);
|
|
20
|
+
} while (delta > 0);
|
|
21
|
+
return num;
|
|
22
|
+
}
|
|
23
|
+
var bufLength = 1024 * 16;
|
|
24
|
+
var td = typeof TextDecoder !== "undefined" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== "undefined" ? { decode(buf) {
|
|
25
|
+
return Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength).toString();
|
|
26
|
+
} } : { decode(buf) {
|
|
27
|
+
let out = "";
|
|
28
|
+
for (let i = 0; i < buf.length; i++) out += String.fromCharCode(buf[i]);
|
|
29
|
+
return out;
|
|
30
|
+
} };
|
|
31
|
+
var StringWriter = class {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.pos = 0;
|
|
34
|
+
this.out = "";
|
|
35
|
+
this.buffer = new Uint8Array(bufLength);
|
|
36
|
+
}
|
|
37
|
+
write(v) {
|
|
38
|
+
const { buffer } = this;
|
|
39
|
+
buffer[this.pos++] = v;
|
|
40
|
+
if (this.pos === bufLength) {
|
|
41
|
+
this.out += td.decode(buffer);
|
|
42
|
+
this.pos = 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
flush() {
|
|
46
|
+
const { buffer, out, pos } = this;
|
|
47
|
+
return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
function encode(decoded) {
|
|
51
|
+
const writer = new StringWriter();
|
|
52
|
+
let sourcesIndex = 0;
|
|
53
|
+
let sourceLine = 0;
|
|
54
|
+
let sourceColumn = 0;
|
|
55
|
+
let namesIndex = 0;
|
|
56
|
+
for (let i = 0; i < decoded.length; i++) {
|
|
57
|
+
const line = decoded[i];
|
|
58
|
+
if (i > 0) writer.write(semicolon);
|
|
59
|
+
if (line.length === 0) continue;
|
|
60
|
+
let genColumn = 0;
|
|
61
|
+
for (let j = 0; j < line.length; j++) {
|
|
62
|
+
const segment = line[j];
|
|
63
|
+
if (j > 0) writer.write(comma);
|
|
64
|
+
genColumn = encodeInteger(writer, segment[0], genColumn);
|
|
65
|
+
if (segment.length === 1) continue;
|
|
66
|
+
sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);
|
|
67
|
+
sourceLine = encodeInteger(writer, segment[2], sourceLine);
|
|
68
|
+
sourceColumn = encodeInteger(writer, segment[3], sourceColumn);
|
|
69
|
+
if (segment.length === 4) continue;
|
|
70
|
+
namesIndex = encodeInteger(writer, segment[4], namesIndex);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return writer.flush();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//#endregion
|
|
77
|
+
export { encode };
|
|
78
|
+
//# sourceMappingURL=sourcemap-codec.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourcemap-codec.mjs","names":[],"sources":["../../../../../node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs"],"sourcesContent":["// src/vlq.ts\nvar comma = \",\".charCodeAt(0);\nvar semicolon = \";\".charCodeAt(0);\nvar chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar intToChar = new Uint8Array(64);\nvar charToInt = new Uint8Array(128);\nfor (let i = 0; i < chars.length; i++) {\n const c = chars.charCodeAt(i);\n intToChar[i] = c;\n charToInt[c] = i;\n}\nfunction decodeInteger(reader, relative) {\n let value = 0;\n let shift = 0;\n let integer = 0;\n do {\n const c = reader.next();\n integer = charToInt[c];\n value |= (integer & 31) << shift;\n shift += 5;\n } while (integer & 32);\n const shouldNegate = value & 1;\n value >>>= 1;\n if (shouldNegate) {\n value = -2147483648 | -value;\n }\n return relative + value;\n}\nfunction encodeInteger(builder, num, relative) {\n let delta = num - relative;\n delta = delta < 0 ? -delta << 1 | 1 : delta << 1;\n do {\n let clamped = delta & 31;\n delta >>>= 5;\n if (delta > 0) clamped |= 32;\n builder.write(intToChar[clamped]);\n } while (delta > 0);\n return num;\n}\nfunction hasMoreVlq(reader, max) {\n if (reader.pos >= max) return false;\n return reader.peek() !== comma;\n}\n\n// src/strings.ts\nvar bufLength = 1024 * 16;\nvar td = typeof TextDecoder !== \"undefined\" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== \"undefined\" ? {\n decode(buf) {\n const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n return out.toString();\n }\n} : {\n decode(buf) {\n let out = \"\";\n for (let i = 0; i < buf.length; i++) {\n out += String.fromCharCode(buf[i]);\n }\n return out;\n }\n};\nvar StringWriter = class {\n constructor() {\n this.pos = 0;\n this.out = \"\";\n this.buffer = new Uint8Array(bufLength);\n }\n write(v) {\n const { buffer } = this;\n buffer[this.pos++] = v;\n if (this.pos === bufLength) {\n this.out += td.decode(buffer);\n this.pos = 0;\n }\n }\n flush() {\n const { buffer, out, pos } = this;\n return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;\n }\n};\nvar StringReader = class {\n constructor(buffer) {\n this.pos = 0;\n this.buffer = buffer;\n }\n next() {\n return this.buffer.charCodeAt(this.pos++);\n }\n peek() {\n return this.buffer.charCodeAt(this.pos);\n }\n indexOf(char) {\n const { buffer, pos } = this;\n const idx = buffer.indexOf(char, pos);\n return idx === -1 ? buffer.length : idx;\n }\n};\n\n// src/scopes.ts\nvar EMPTY = [];\nfunction decodeOriginalScopes(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const scopes = [];\n const stack = [];\n let line = 0;\n for (; reader.pos < length; reader.pos++) {\n line = decodeInteger(reader, line);\n const column = decodeInteger(reader, 0);\n if (!hasMoreVlq(reader, length)) {\n const last = stack.pop();\n last[2] = line;\n last[3] = column;\n continue;\n }\n const kind = decodeInteger(reader, 0);\n const fields = decodeInteger(reader, 0);\n const hasName = fields & 1;\n const scope = hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind];\n let vars = EMPTY;\n if (hasMoreVlq(reader, length)) {\n vars = [];\n do {\n const varsIndex = decodeInteger(reader, 0);\n vars.push(varsIndex);\n } while (hasMoreVlq(reader, length));\n }\n scope.vars = vars;\n scopes.push(scope);\n stack.push(scope);\n }\n return scopes;\n}\nfunction encodeOriginalScopes(scopes) {\n const writer = new StringWriter();\n for (let i = 0; i < scopes.length; ) {\n i = _encodeOriginalScopes(scopes, i, writer, [0]);\n }\n return writer.flush();\n}\nfunction _encodeOriginalScopes(scopes, index, writer, state) {\n const scope = scopes[index];\n const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope;\n if (index > 0) writer.write(comma);\n state[0] = encodeInteger(writer, startLine, state[0]);\n encodeInteger(writer, startColumn, 0);\n encodeInteger(writer, kind, 0);\n const fields = scope.length === 6 ? 1 : 0;\n encodeInteger(writer, fields, 0);\n if (scope.length === 6) encodeInteger(writer, scope[5], 0);\n for (const v of vars) {\n encodeInteger(writer, v, 0);\n }\n for (index++; index < scopes.length; ) {\n const next = scopes[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || l === endLine && c >= endColumn) {\n break;\n }\n index = _encodeOriginalScopes(scopes, index, writer, state);\n }\n writer.write(comma);\n state[0] = encodeInteger(writer, endLine, state[0]);\n encodeInteger(writer, endColumn, 0);\n return index;\n}\nfunction decodeGeneratedRanges(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const ranges = [];\n const stack = [];\n let genLine = 0;\n let definitionSourcesIndex = 0;\n let definitionScopeIndex = 0;\n let callsiteSourcesIndex = 0;\n let callsiteLine = 0;\n let callsiteColumn = 0;\n let bindingLine = 0;\n let bindingColumn = 0;\n do {\n const semi = reader.indexOf(\";\");\n let genColumn = 0;\n for (; reader.pos < semi; reader.pos++) {\n genColumn = decodeInteger(reader, genColumn);\n if (!hasMoreVlq(reader, semi)) {\n const last = stack.pop();\n last[2] = genLine;\n last[3] = genColumn;\n continue;\n }\n const fields = decodeInteger(reader, 0);\n const hasDefinition = fields & 1;\n const hasCallsite = fields & 2;\n const hasScope = fields & 4;\n let callsite = null;\n let bindings = EMPTY;\n let range;\n if (hasDefinition) {\n const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex);\n definitionScopeIndex = decodeInteger(\n reader,\n definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0\n );\n definitionSourcesIndex = defSourcesIndex;\n range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex];\n } else {\n range = [genLine, genColumn, 0, 0];\n }\n range.isScope = !!hasScope;\n if (hasCallsite) {\n const prevCsi = callsiteSourcesIndex;\n const prevLine = callsiteLine;\n callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex);\n const sameSource = prevCsi === callsiteSourcesIndex;\n callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0);\n callsiteColumn = decodeInteger(\n reader,\n sameSource && prevLine === callsiteLine ? callsiteColumn : 0\n );\n callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn];\n }\n range.callsite = callsite;\n if (hasMoreVlq(reader, semi)) {\n bindings = [];\n do {\n bindingLine = genLine;\n bindingColumn = genColumn;\n const expressionsCount = decodeInteger(reader, 0);\n let expressionRanges;\n if (expressionsCount < -1) {\n expressionRanges = [[decodeInteger(reader, 0)]];\n for (let i = -1; i > expressionsCount; i--) {\n const prevBl = bindingLine;\n bindingLine = decodeInteger(reader, bindingLine);\n bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0);\n const expression = decodeInteger(reader, 0);\n expressionRanges.push([expression, bindingLine, bindingColumn]);\n }\n } else {\n expressionRanges = [[expressionsCount]];\n }\n bindings.push(expressionRanges);\n } while (hasMoreVlq(reader, semi));\n }\n range.bindings = bindings;\n ranges.push(range);\n stack.push(range);\n }\n genLine++;\n reader.pos = semi + 1;\n } while (reader.pos < length);\n return ranges;\n}\nfunction encodeGeneratedRanges(ranges) {\n if (ranges.length === 0) return \"\";\n const writer = new StringWriter();\n for (let i = 0; i < ranges.length; ) {\n i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]);\n }\n return writer.flush();\n}\nfunction _encodeGeneratedRanges(ranges, index, writer, state) {\n const range = ranges[index];\n const {\n 0: startLine,\n 1: startColumn,\n 2: endLine,\n 3: endColumn,\n isScope,\n callsite,\n bindings\n } = range;\n if (state[0] < startLine) {\n catchupLine(writer, state[0], startLine);\n state[0] = startLine;\n state[1] = 0;\n } else if (index > 0) {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, range[1], state[1]);\n const fields = (range.length === 6 ? 1 : 0) | (callsite ? 2 : 0) | (isScope ? 4 : 0);\n encodeInteger(writer, fields, 0);\n if (range.length === 6) {\n const { 4: sourcesIndex, 5: scopesIndex } = range;\n if (sourcesIndex !== state[2]) {\n state[3] = 0;\n }\n state[2] = encodeInteger(writer, sourcesIndex, state[2]);\n state[3] = encodeInteger(writer, scopesIndex, state[3]);\n }\n if (callsite) {\n const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite;\n if (sourcesIndex !== state[4]) {\n state[5] = 0;\n state[6] = 0;\n } else if (callLine !== state[5]) {\n state[6] = 0;\n }\n state[4] = encodeInteger(writer, sourcesIndex, state[4]);\n state[5] = encodeInteger(writer, callLine, state[5]);\n state[6] = encodeInteger(writer, callColumn, state[6]);\n }\n if (bindings) {\n for (const binding of bindings) {\n if (binding.length > 1) encodeInteger(writer, -binding.length, 0);\n const expression = binding[0][0];\n encodeInteger(writer, expression, 0);\n let bindingStartLine = startLine;\n let bindingStartColumn = startColumn;\n for (let i = 1; i < binding.length; i++) {\n const expRange = binding[i];\n bindingStartLine = encodeInteger(writer, expRange[1], bindingStartLine);\n bindingStartColumn = encodeInteger(writer, expRange[2], bindingStartColumn);\n encodeInteger(writer, expRange[0], 0);\n }\n }\n }\n for (index++; index < ranges.length; ) {\n const next = ranges[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || l === endLine && c >= endColumn) {\n break;\n }\n index = _encodeGeneratedRanges(ranges, index, writer, state);\n }\n if (state[0] < endLine) {\n catchupLine(writer, state[0], endLine);\n state[0] = endLine;\n state[1] = 0;\n } else {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, endColumn, state[1]);\n return index;\n}\nfunction catchupLine(writer, lastLine, line) {\n do {\n writer.write(semicolon);\n } while (++lastLine < line);\n}\n\n// src/sourcemap-codec.ts\nfunction decode(mappings) {\n const { length } = mappings;\n const reader = new StringReader(mappings);\n const decoded = [];\n let genColumn = 0;\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n do {\n const semi = reader.indexOf(\";\");\n const line = [];\n let sorted = true;\n let lastCol = 0;\n genColumn = 0;\n while (reader.pos < semi) {\n let seg;\n genColumn = decodeInteger(reader, genColumn);\n if (genColumn < lastCol) sorted = false;\n lastCol = genColumn;\n if (hasMoreVlq(reader, semi)) {\n sourcesIndex = decodeInteger(reader, sourcesIndex);\n sourceLine = decodeInteger(reader, sourceLine);\n sourceColumn = decodeInteger(reader, sourceColumn);\n if (hasMoreVlq(reader, semi)) {\n namesIndex = decodeInteger(reader, namesIndex);\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];\n } else {\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];\n }\n } else {\n seg = [genColumn];\n }\n line.push(seg);\n reader.pos++;\n }\n if (!sorted) sort(line);\n decoded.push(line);\n reader.pos = semi + 1;\n } while (reader.pos <= length);\n return decoded;\n}\nfunction sort(line) {\n line.sort(sortComparator);\n}\nfunction sortComparator(a, b) {\n return a[0] - b[0];\n}\nfunction encode(decoded) {\n const writer = new StringWriter();\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n for (let i = 0; i < decoded.length; i++) {\n const line = decoded[i];\n if (i > 0) writer.write(semicolon);\n if (line.length === 0) continue;\n let genColumn = 0;\n for (let j = 0; j < line.length; j++) {\n const segment = line[j];\n if (j > 0) writer.write(comma);\n genColumn = encodeInteger(writer, segment[0], genColumn);\n if (segment.length === 1) continue;\n sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);\n sourceLine = encodeInteger(writer, segment[2], sourceLine);\n sourceColumn = encodeInteger(writer, segment[3], sourceColumn);\n if (segment.length === 4) continue;\n namesIndex = encodeInteger(writer, segment[4], namesIndex);\n }\n }\n return writer.flush();\n}\nexport {\n decode,\n decodeGeneratedRanges,\n decodeOriginalScopes,\n encode,\n encodeGeneratedRanges,\n encodeOriginalScopes\n};\n//# sourceMappingURL=sourcemap-codec.mjs.map\n"],"x_google_ignoreList":[0],"mappings":";AACA,IAAI,QAAQ,IAAI,WAAW,EAAE;AAC7B,IAAI,YAAY,IAAI,WAAW,EAAE;AACjC,IAAI,QAAQ;AACZ,IAAI,YAAY,IAAI,WAAW,GAAG;AAClC,IAAI,YAAY,IAAI,WAAW,IAAI;AACnC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;CACrC,MAAM,IAAI,MAAM,WAAW,EAAE;AAC7B,WAAU,KAAK;AACf,WAAU,KAAK;;AAmBjB,SAAS,cAAc,SAAS,KAAK,UAAU;CAC7C,IAAI,QAAQ,MAAM;AAClB,SAAQ,QAAQ,IAAI,CAAC,SAAS,IAAI,IAAI,SAAS;AAC/C,IAAG;EACD,IAAI,UAAU,QAAQ;AACtB,aAAW;AACX,MAAI,QAAQ,EAAG,YAAW;AAC1B,UAAQ,MAAM,UAAU,SAAS;UAC1B,QAAQ;AACjB,QAAO;;AAQT,IAAI,YAAY,OAAO;AACvB,IAAI,KAAK,OAAO,gBAAgB,8BAA8B,IAAI,aAAa,GAAG,OAAO,WAAW,cAAc,EAChH,OAAO,KAAK;AAEV,QADY,OAAO,KAAK,IAAI,QAAQ,IAAI,YAAY,IAAI,WAAW,CACxD,UAAU;GAExB,GAAG,EACF,OAAO,KAAK;CACV,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,IAC9B,QAAO,OAAO,aAAa,IAAI,GAAG;AAEpC,QAAO;GAEV;AACD,IAAI,eAAe,MAAM;CACvB,cAAc;AACZ,OAAK,MAAM;AACX,OAAK,MAAM;AACX,OAAK,SAAS,IAAI,WAAW,UAAU;;CAEzC,MAAM,GAAG;EACP,MAAM,EAAE,WAAW;AACnB,SAAO,KAAK,SAAS;AACrB,MAAI,KAAK,QAAQ,WAAW;AAC1B,QAAK,OAAO,GAAG,OAAO,OAAO;AAC7B,QAAK,MAAM;;;CAGf,QAAQ;EACN,MAAM,EAAE,QAAQ,KAAK,QAAQ;AAC7B,SAAO,MAAM,IAAI,MAAM,GAAG,OAAO,OAAO,SAAS,GAAG,IAAI,CAAC,GAAG;;;AAyThE,SAAS,OAAO,SAAS;CACvB,MAAM,SAAS,IAAI,cAAc;CACjC,IAAI,eAAe;CACnB,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAI,aAAa;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,OAAO,QAAQ;AACrB,MAAI,IAAI,EAAG,QAAO,MAAM,UAAU;AAClC,MAAI,KAAK,WAAW,EAAG;EACvB,IAAI,YAAY;AAChB,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,UAAU,KAAK;AACrB,OAAI,IAAI,EAAG,QAAO,MAAM,MAAM;AAC9B,eAAY,cAAc,QAAQ,QAAQ,IAAI,UAAU;AACxD,OAAI,QAAQ,WAAW,EAAG;AAC1B,kBAAe,cAAc,QAAQ,QAAQ,IAAI,aAAa;AAC9D,gBAAa,cAAc,QAAQ,QAAQ,IAAI,WAAW;AAC1D,kBAAe,cAAc,QAAQ,QAAQ,IAAI,aAAa;AAC9D,OAAI,QAAQ,WAAW,EAAG;AAC1B,gBAAa,cAAc,QAAQ,QAAQ,IAAI,WAAW;;;AAG9D,QAAO,OAAO,OAAO"}
|