@atikk-co-jp/notion-mcp-server 0.7.0 → 0.8.1

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.
Files changed (134) hide show
  1. package/README.ja.md +3 -2
  2. package/README.md +3 -2
  3. package/dist/src/converters/__tests__/block-to-markdown.test.js +482 -111
  4. package/dist/src/converters/__tests__/markdown-to-blocks.test.js +116 -13
  5. package/dist/src/converters/__tests__/page-to-markdown.test.js +83 -70
  6. package/dist/src/converters/__tests__/rich-text-to-markdown.test.js +23 -26
  7. package/dist/src/converters/block-to-markdown.d.ts +4 -13
  8. package/dist/src/converters/block-to-markdown.d.ts.map +1 -1
  9. package/dist/src/converters/block-to-markdown.js +117 -120
  10. package/dist/src/converters/index.d.ts +3 -3
  11. package/dist/src/converters/index.d.ts.map +1 -1
  12. package/dist/src/converters/index.js +1 -1
  13. package/dist/src/converters/markdown-to-blocks.d.ts +21 -7
  14. package/dist/src/converters/markdown-to-blocks.d.ts.map +1 -1
  15. package/dist/src/converters/markdown-to-blocks.js +56 -0
  16. package/dist/src/converters/page-to-markdown.d.ts +5 -20
  17. package/dist/src/converters/page-to-markdown.d.ts.map +1 -1
  18. package/dist/src/converters/page-to-markdown.js +47 -37
  19. package/dist/src/converters/rich-text-to-markdown.d.ts +3 -47
  20. package/dist/src/converters/rich-text-to-markdown.d.ts.map +1 -1
  21. package/dist/src/converters/rich-text-to-markdown.js +15 -14
  22. package/dist/src/notion-client.d.ts +5 -177
  23. package/dist/src/notion-client.d.ts.map +1 -1
  24. package/dist/src/notion-client.js +6 -172
  25. package/dist/src/schemas/descriptions/examples.d.ts +14 -0
  26. package/dist/src/schemas/descriptions/examples.d.ts.map +1 -0
  27. package/dist/src/schemas/descriptions/examples.js +87 -0
  28. package/dist/src/schemas/descriptions/fields.d.ts +146 -0
  29. package/dist/src/schemas/descriptions/fields.d.ts.map +1 -0
  30. package/dist/src/schemas/descriptions/fields.js +184 -0
  31. package/dist/src/schemas/descriptions/index.d.ts +3 -0
  32. package/dist/src/schemas/descriptions/index.d.ts.map +1 -0
  33. package/dist/src/schemas/descriptions/index.js +2 -0
  34. package/dist/src/schemas/index.d.ts +1 -5
  35. package/dist/src/schemas/index.d.ts.map +1 -1
  36. package/dist/src/schemas/index.js +2 -10
  37. package/dist/src/tools/__tests__/context-size.test.d.ts +2 -0
  38. package/dist/src/tools/__tests__/context-size.test.d.ts.map +1 -0
  39. package/dist/src/tools/__tests__/context-size.test.js +143 -0
  40. package/dist/src/tools/__tests__/error-handler.test.d.ts +2 -0
  41. package/dist/src/tools/__tests__/error-handler.test.d.ts.map +1 -0
  42. package/dist/src/tools/__tests__/error-handler.test.js +125 -0
  43. package/dist/src/tools/append-block-children.d.ts.map +1 -1
  44. package/dist/src/tools/append-block-children.js +8 -5
  45. package/dist/src/tools/append-blocks-simple.d.ts.map +1 -1
  46. package/dist/src/tools/append-blocks-simple.js +9 -13
  47. package/dist/src/tools/archive-database.d.ts.map +1 -1
  48. package/dist/src/tools/archive-database.js +3 -2
  49. package/dist/src/tools/archive-page.d.ts.map +1 -1
  50. package/dist/src/tools/archive-page.js +2 -1
  51. package/dist/src/tools/create-comment-simple.d.ts.map +1 -1
  52. package/dist/src/tools/create-comment-simple.js +5 -4
  53. package/dist/src/tools/create-comment.d.ts.map +1 -1
  54. package/dist/src/tools/create-comment.js +9 -6
  55. package/dist/src/tools/create-database.d.ts.map +1 -1
  56. package/dist/src/tools/create-database.js +19 -25
  57. package/dist/src/tools/create-page-simple.d.ts +1 -1
  58. package/dist/src/tools/create-page-simple.d.ts.map +1 -1
  59. package/dist/src/tools/create-page-simple.js +26 -27
  60. package/dist/src/tools/create-page.d.ts.map +1 -1
  61. package/dist/src/tools/create-page.js +10 -6
  62. package/dist/src/tools/delete-block.d.ts.map +1 -1
  63. package/dist/src/tools/delete-block.js +2 -1
  64. package/dist/src/tools/get-block-children.d.ts +1 -1
  65. package/dist/src/tools/get-block-children.d.ts.map +1 -1
  66. package/dist/src/tools/get-block-children.js +13 -27
  67. package/dist/src/tools/index.d.ts +2 -2
  68. package/dist/src/tools/index.d.ts.map +1 -1
  69. package/dist/src/tools/index.js +2 -2
  70. package/dist/src/tools/list-comments.d.ts +1 -1
  71. package/dist/src/tools/list-comments.d.ts.map +1 -1
  72. package/dist/src/tools/list-comments.js +11 -10
  73. package/dist/src/tools/list-users.d.ts.map +1 -1
  74. package/dist/src/tools/list-users.js +4 -3
  75. package/dist/src/tools/move-page.d.ts.map +1 -1
  76. package/dist/src/tools/move-page.js +5 -4
  77. package/dist/src/tools/query-data-source.d.ts +1 -1
  78. package/dist/src/tools/query-data-source.d.ts.map +1 -1
  79. package/dist/src/tools/query-data-source.js +23 -30
  80. package/dist/src/tools/retrieve-block.d.ts +1 -1
  81. package/dist/src/tools/retrieve-block.d.ts.map +1 -1
  82. package/dist/src/tools/retrieve-block.js +13 -10
  83. package/dist/src/tools/retrieve-bot-user.js +1 -1
  84. package/dist/src/tools/retrieve-data-source.d.ts +1 -1
  85. package/dist/src/tools/retrieve-data-source.d.ts.map +1 -1
  86. package/dist/src/tools/retrieve-data-source.js +15 -11
  87. package/dist/src/tools/retrieve-database.d.ts +1 -1
  88. package/dist/src/tools/retrieve-database.d.ts.map +1 -1
  89. package/dist/src/tools/retrieve-database.js +11 -6
  90. package/dist/src/tools/retrieve-page-property.d.ts.map +1 -1
  91. package/dist/src/tools/retrieve-page-property.js +6 -5
  92. package/dist/src/tools/retrieve-page.d.ts +1 -1
  93. package/dist/src/tools/retrieve-page.d.ts.map +1 -1
  94. package/dist/src/tools/retrieve-page.js +15 -20
  95. package/dist/src/tools/retrieve-user.d.ts.map +1 -1
  96. package/dist/src/tools/retrieve-user.js +2 -1
  97. package/dist/src/tools/search.d.ts.map +1 -1
  98. package/dist/src/tools/search.js +10 -17
  99. package/dist/src/tools/update-block-simple.d.ts +1 -1
  100. package/dist/src/tools/update-block-simple.d.ts.map +1 -1
  101. package/dist/src/tools/update-block-simple.js +14 -4
  102. package/dist/src/tools/update-block.d.ts.map +1 -1
  103. package/dist/src/tools/update-block.js +8 -5
  104. package/dist/src/tools/update-data-source.d.ts.map +1 -1
  105. package/dist/src/tools/update-data-source.js +7 -7
  106. package/dist/src/tools/update-database.d.ts.map +1 -1
  107. package/dist/src/tools/update-database.js +22 -32
  108. package/dist/src/tools/update-page.d.ts.map +1 -1
  109. package/dist/src/tools/update-page.js +11 -8
  110. package/dist/src/utils/error-handler.d.ts +16 -7
  111. package/dist/src/utils/error-handler.d.ts.map +1 -1
  112. package/dist/src/utils/error-handler.js +44 -17
  113. package/dist/src/utils/index.d.ts +1 -1
  114. package/dist/src/utils/index.d.ts.map +1 -1
  115. package/dist/src/utils/index.js +1 -1
  116. package/package.json +2 -1
  117. package/dist/src/schemas/block.d.ts +0 -3787
  118. package/dist/src/schemas/block.d.ts.map +0 -1
  119. package/dist/src/schemas/block.js +0 -402
  120. package/dist/src/schemas/common.d.ts +0 -638
  121. package/dist/src/schemas/common.d.ts.map +0 -1
  122. package/dist/src/schemas/common.js +0 -163
  123. package/dist/src/schemas/database.d.ts +0 -687
  124. package/dist/src/schemas/database.d.ts.map +0 -1
  125. package/dist/src/schemas/database.js +0 -258
  126. package/dist/src/schemas/filter.d.ts +0 -611
  127. package/dist/src/schemas/filter.d.ts.map +0 -1
  128. package/dist/src/schemas/filter.js +0 -222
  129. package/dist/src/schemas/page.d.ts +0 -2607
  130. package/dist/src/schemas/page.d.ts.map +0 -1
  131. package/dist/src/schemas/page.js +0 -328
  132. package/dist/src/schemas/schemas.test.d.ts +0 -2
  133. package/dist/src/schemas/schemas.test.d.ts.map +0 -1
  134. package/dist/src/schemas/schemas.test.js +0 -418
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import { richTextToMarkdown, richTextToPlain } from '../rich-text-to-markdown.js';
3
+ const asRichText = (items) => items;
3
4
  describe('richTextToMarkdown', () => {
4
5
  describe('basic text conversion', () => {
5
6
  it('converts plain text', () => {
@@ -10,7 +11,7 @@ describe('richTextToMarkdown', () => {
10
11
  plain_text: 'Hello World',
11
12
  },
12
13
  ];
13
- expect(richTextToMarkdown(input)).toBe('Hello World');
14
+ expect(richTextToMarkdown(asRichText(input))).toBe('Hello World');
14
15
  });
15
16
  it('handles empty array', () => {
16
17
  expect(richTextToMarkdown([])).toBe('');
@@ -26,7 +27,7 @@ describe('richTextToMarkdown', () => {
26
27
  { type: 'text', text: { content: 'Hello ' }, plain_text: 'Hello ' },
27
28
  { type: 'text', text: { content: 'World' }, plain_text: 'World' },
28
29
  ];
29
- expect(richTextToMarkdown(input)).toBe('Hello World');
30
+ expect(richTextToMarkdown(asRichText(input))).toBe('Hello World');
30
31
  });
31
32
  });
32
33
  describe('annotations', () => {
@@ -39,7 +40,7 @@ describe('richTextToMarkdown', () => {
39
40
  plain_text: 'bold',
40
41
  },
41
42
  ];
42
- expect(richTextToMarkdown(input)).toBe('**bold**');
43
+ expect(richTextToMarkdown(asRichText(input))).toBe('**bold**');
43
44
  });
44
45
  it('converts italic text', () => {
45
46
  const input = [
@@ -50,7 +51,7 @@ describe('richTextToMarkdown', () => {
50
51
  plain_text: 'italic',
51
52
  },
52
53
  ];
53
- expect(richTextToMarkdown(input)).toBe('*italic*');
54
+ expect(richTextToMarkdown(asRichText(input))).toBe('*italic*');
54
55
  });
55
56
  it('converts strikethrough text', () => {
56
57
  const input = [
@@ -61,7 +62,7 @@ describe('richTextToMarkdown', () => {
61
62
  plain_text: 'strikethrough',
62
63
  },
63
64
  ];
64
- expect(richTextToMarkdown(input)).toBe('~~strikethrough~~');
65
+ expect(richTextToMarkdown(asRichText(input))).toBe('~~strikethrough~~');
65
66
  });
66
67
  it('converts code text', () => {
67
68
  const input = [
@@ -72,7 +73,7 @@ describe('richTextToMarkdown', () => {
72
73
  plain_text: 'code',
73
74
  },
74
75
  ];
75
- expect(richTextToMarkdown(input)).toBe('`code`');
76
+ expect(richTextToMarkdown(asRichText(input))).toBe('`code`');
76
77
  });
77
78
  it('converts underline text with HTML tag', () => {
78
79
  const input = [
@@ -83,7 +84,7 @@ describe('richTextToMarkdown', () => {
83
84
  plain_text: 'underline',
84
85
  },
85
86
  ];
86
- expect(richTextToMarkdown(input)).toBe('<u>underline</u>');
87
+ expect(richTextToMarkdown(asRichText(input))).toBe('<u>underline</u>');
87
88
  });
88
89
  it('handles nested annotations (bold + italic)', () => {
89
90
  const input = [
@@ -94,7 +95,7 @@ describe('richTextToMarkdown', () => {
94
95
  plain_text: 'bold italic',
95
96
  },
96
97
  ];
97
- expect(richTextToMarkdown(input)).toBe('***bold italic***');
98
+ expect(richTextToMarkdown(asRichText(input))).toBe('***bold italic***');
98
99
  });
99
100
  it('handles all annotations combined', () => {
100
101
  const input = [
@@ -112,7 +113,7 @@ describe('richTextToMarkdown', () => {
112
113
  ];
113
114
  // code -> strikethrough -> italic -> bold の順で適用
114
115
  // bold + italic が *** として結合される
115
- expect(richTextToMarkdown(input)).toBe('***~~`all`~~***');
116
+ expect(richTextToMarkdown(asRichText(input))).toBe('***~~`all`~~***');
116
117
  });
117
118
  });
118
119
  describe('links', () => {
@@ -127,7 +128,7 @@ describe('richTextToMarkdown', () => {
127
128
  plain_text: 'link text',
128
129
  },
129
130
  ];
130
- expect(richTextToMarkdown(input)).toBe('[link text](https://example.com)');
131
+ expect(richTextToMarkdown(asRichText(input))).toBe('[link text](https://example.com)');
131
132
  });
132
133
  it('converts text with link (href)', () => {
133
134
  const input = [
@@ -138,7 +139,7 @@ describe('richTextToMarkdown', () => {
138
139
  plain_text: 'link text',
139
140
  },
140
141
  ];
141
- expect(richTextToMarkdown(input)).toBe('[link text](https://example.com)');
142
+ expect(richTextToMarkdown(asRichText(input))).toBe('[link text](https://example.com)');
142
143
  });
143
144
  it('handles code annotation with link (ignores link)', () => {
144
145
  const input = [
@@ -153,7 +154,7 @@ describe('richTextToMarkdown', () => {
153
154
  },
154
155
  ];
155
156
  // コード内のリンクは無視される
156
- expect(richTextToMarkdown(input)).toBe('`code`');
157
+ expect(richTextToMarkdown(asRichText(input))).toBe('`code`');
157
158
  });
158
159
  it('handles bold link', () => {
159
160
  const input = [
@@ -167,7 +168,7 @@ describe('richTextToMarkdown', () => {
167
168
  plain_text: 'bold link',
168
169
  },
169
170
  ];
170
- expect(richTextToMarkdown(input)).toBe('[**bold link**](https://example.com)');
171
+ expect(richTextToMarkdown(asRichText(input))).toBe('[**bold link**](https://example.com)');
171
172
  });
172
173
  });
173
174
  describe('mention types', () => {
@@ -182,7 +183,7 @@ describe('richTextToMarkdown', () => {
182
183
  plain_text: '@John Doe',
183
184
  },
184
185
  ];
185
- expect(richTextToMarkdown(input)).toBe('@John Doe');
186
+ expect(richTextToMarkdown(asRichText(input))).toBe('@John Doe');
186
187
  });
187
188
  it('converts page mention', () => {
188
189
  const input = [
@@ -195,7 +196,7 @@ describe('richTextToMarkdown', () => {
195
196
  plain_text: 'My Page',
196
197
  },
197
198
  ];
198
- expect(richTextToMarkdown(input)).toBe('My Page');
199
+ expect(richTextToMarkdown(asRichText(input))).toBe('My Page');
199
200
  });
200
201
  it('converts date mention', () => {
201
202
  const input = [
@@ -208,7 +209,7 @@ describe('richTextToMarkdown', () => {
208
209
  plain_text: '@January 1, 2024',
209
210
  },
210
211
  ];
211
- expect(richTextToMarkdown(input)).toBe('2024-01-01');
212
+ expect(richTextToMarkdown(asRichText(input))).toBe('2024-01-01');
212
213
  });
213
214
  it('converts date range mention', () => {
214
215
  const input = [
@@ -221,7 +222,7 @@ describe('richTextToMarkdown', () => {
221
222
  plain_text: '@January 1, 2024 → January 31, 2024',
222
223
  },
223
224
  ];
224
- expect(richTextToMarkdown(input)).toBe('2024-01-01 → 2024-01-31');
225
+ expect(richTextToMarkdown(asRichText(input))).toBe('2024-01-01 → 2024-01-31');
225
226
  });
226
227
  });
227
228
  describe('equation types', () => {
@@ -233,7 +234,7 @@ describe('richTextToMarkdown', () => {
233
234
  plain_text: 'E = mc^2',
234
235
  },
235
236
  ];
236
- expect(richTextToMarkdown(input)).toBe('$E = mc^2$');
237
+ expect(richTextToMarkdown(asRichText(input))).toBe('$E = mc^2$');
237
238
  });
238
239
  });
239
240
  describe('mixed content', () => {
@@ -255,7 +256,7 @@ describe('richTextToMarkdown', () => {
255
256
  },
256
257
  { type: 'text', text: { content: ' text.' }, plain_text: ' text.' },
257
258
  ];
258
- expect(richTextToMarkdown(input)).toBe('This is **bold** and *italic* text.');
259
+ expect(richTextToMarkdown(asRichText(input))).toBe('This is **bold** and *italic* text.');
259
260
  });
260
261
  it('handles real-world Notion data', () => {
261
262
  // 実際のNotionから取得したデータ形式
@@ -269,7 +270,6 @@ describe('richTextToMarkdown', () => {
269
270
  strikethrough: false,
270
271
  underline: false,
271
272
  code: false,
272
- color: 'default',
273
273
  },
274
274
  plain_text: '以下のパッケージで ',
275
275
  href: null,
@@ -283,7 +283,6 @@ describe('richTextToMarkdown', () => {
283
283
  strikethrough: false,
284
284
  underline: false,
285
285
  code: true,
286
- color: 'default',
287
286
  },
288
287
  plain_text: 'exports',
289
288
  href: null,
@@ -297,7 +296,6 @@ describe('richTextToMarkdown', () => {
297
296
  strikethrough: false,
298
297
  underline: false,
299
298
  code: false,
300
- color: 'default',
301
299
  },
302
300
  plain_text: ' と ',
303
301
  href: null,
@@ -311,13 +309,12 @@ describe('richTextToMarkdown', () => {
311
309
  strikethrough: false,
312
310
  underline: false,
313
311
  code: true,
314
- color: 'default',
315
312
  },
316
313
  plain_text: 'main',
317
314
  href: null,
318
315
  },
319
316
  ];
320
- expect(richTextToMarkdown(input)).toBe('以下のパッケージで `exports` と `main`');
317
+ expect(richTextToMarkdown(asRichText(input))).toBe('以下のパッケージで `exports` と `main`');
321
318
  });
322
319
  });
323
320
  });
@@ -332,7 +329,7 @@ describe('richTextToPlain', () => {
332
329
  },
333
330
  { type: 'text', text: { content: ' World' }, plain_text: ' World' },
334
331
  ];
335
- expect(richTextToPlain(input)).toBe('Hello World');
332
+ expect(richTextToPlain(asRichText(input))).toBe('Hello World');
336
333
  });
337
334
  it('handles empty array', () => {
338
335
  expect(richTextToPlain([])).toBe('');
@@ -348,6 +345,6 @@ describe('richTextToPlain', () => {
348
345
  plain_text: 'plain',
349
346
  },
350
347
  ];
351
- expect(richTextToPlain(input)).toBe('plain');
348
+ expect(richTextToPlain(asRichText(input))).toBe('plain');
352
349
  });
353
350
  });
@@ -1,16 +1,7 @@
1
1
  /**
2
2
  * Notionブロックをマークダウン文字列に変換するモジュール
3
3
  */
4
- /**
5
- * Notionブロックの基本型
6
- */
7
- export interface NotionBlock {
8
- object?: string;
9
- id?: string;
10
- type: string;
11
- has_children?: boolean;
12
- [key: string]: unknown;
13
- }
4
+ import type { BlockObjectResponse } from '../notion-client.js';
14
5
  /**
15
6
  * ブロック変換オプション
16
7
  */
@@ -20,7 +11,7 @@ export interface ConvertOptions {
20
11
  /** 番号付きリストのインデックス */
21
12
  listIndex?: number;
22
13
  /** 子ブロック取得関数(ネストされたブロックの再帰的取得用) */
23
- fetchChildren?: (blockId: string) => Promise<NotionBlock[]>;
14
+ fetchChildren?: (blockId: string) => Promise<BlockObjectResponse[]>;
24
15
  }
25
16
  /**
26
17
  * ブロック配列をマークダウン文字列に変換
@@ -28,11 +19,11 @@ export interface ConvertOptions {
28
19
  * @param options - 変換オプション
29
20
  * @returns マークダウン文字列
30
21
  */
31
- export declare function blocksToMarkdown(blocks: NotionBlock[], options?: ConvertOptions): Promise<string>;
22
+ export declare function blocksToMarkdown(blocks: BlockObjectResponse[], options?: ConvertOptions): Promise<string>;
32
23
  /**
33
24
  * ブロック配列をマークダウン文字列に変換(同期版、子ブロック取得なし)
34
25
  * @param blocks - Notion APIから取得したブロック配列
35
26
  * @returns マークダウン文字列
36
27
  */
37
- export declare function blocksToMarkdownSync(blocks: NotionBlock[]): string;
28
+ export declare function blocksToMarkdownSync(blocks: BlockObjectResponse[]): string;
38
29
  //# sourceMappingURL=block-to-markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"block-to-markdown.d.ts","sourceRoot":"","sources":["../../../src/converters/block-to-markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mCAAmC;IACnC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;CAC5D;AA2UD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAsMlE"}
1
+ {"version":3,"file":"block-to-markdown.d.ts","sourceRoot":"","sources":["../../../src/converters/block-to-markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAG9D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mCAAmC;IACnC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAA;CACpE;AAkUD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,mBAAmB,EAAE,EAC7B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAoM1E"}