@eclipse-lyra/extension-webllm 0.7.57 → 0.7.58
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/i18n.de-CQxA5kmG.js +11 -0
- package/dist/i18n.de-CQxA5kmG.js.map +1 -0
- package/dist/i18n.en-BIC1ZmXn.js +11 -0
- package/dist/i18n.en-BIC1ZmXn.js.map +1 -0
- package/dist/index.js +15 -9
- package/dist/index.js.map +1 -1
- package/dist/webllmservice-DO8ETODg.js +50 -0
- package/dist/webllmservice-DO8ETODg.js.map +1 -0
- package/package.json +3 -3
- package/dist/i18n.de-Zh6IDMrM.js +0 -12
- package/dist/i18n.de-Zh6IDMrM.js.map +0 -1
- package/dist/i18n.en-DGw3X1Kw.js +0 -12
- package/dist/i18n.en-DGw3X1Kw.js.map +0 -1
- package/dist/webllmservice-Birv3OKf.js +0 -63
- package/dist/webllmservice-Birv3OKf.js.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/i18n.de.json
|
|
2
|
+
var EXT_WEBLLM_NAME = "WebLLM";
|
|
3
|
+
var EXT_WEBLLM_DESC = "LLM-Inferenz im Browser";
|
|
4
|
+
var i18n_de_default = {
|
|
5
|
+
EXT_WEBLLM_NAME,
|
|
6
|
+
EXT_WEBLLM_DESC
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { EXT_WEBLLM_DESC, EXT_WEBLLM_NAME, i18n_de_default as default };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=i18n.de-CQxA5kmG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.de-CQxA5kmG.js","names":[],"sources":["../src/i18n.de.json"],"sourcesContent":["{\n \"EXT_WEBLLM_NAME\": \"WebLLM\",\n \"EXT_WEBLLM_DESC\": \"LLM-Inferenz im Browser\"\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/i18n.en.json
|
|
2
|
+
var EXT_WEBLLM_NAME = "WebLLM";
|
|
3
|
+
var EXT_WEBLLM_DESC = "In-Browser LLM inference";
|
|
4
|
+
var i18n_en_default = {
|
|
5
|
+
EXT_WEBLLM_NAME,
|
|
6
|
+
EXT_WEBLLM_DESC
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { EXT_WEBLLM_DESC, EXT_WEBLLM_NAME, i18n_en_default as default };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=i18n.en-BIC1ZmXn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.en-BIC1ZmXn.js","names":[],"sources":["../src/i18n.en.json"],"sourcesContent":["{\n \"EXT_WEBLLM_NAME\": \"WebLLM\",\n \"EXT_WEBLLM_DESC\": \"In-Browser LLM inference\"\n}\n"],"mappings":""}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { extensionRegistry, i18n } from "@eclipse-lyra/core";
|
|
2
2
|
import pkg from "../package.json";
|
|
3
|
-
|
|
3
|
+
//#region src/index.ts
|
|
4
|
+
var t = await i18n(/* @__PURE__ */ Object.assign({
|
|
5
|
+
"./i18n.de.json": () => import("./i18n.de-CQxA5kmG.js"),
|
|
6
|
+
"./i18n.en.json": () => import("./i18n.en-BIC1ZmXn.js")
|
|
7
|
+
}), true);
|
|
4
8
|
extensionRegistry.registerExtension({
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
id: pkg.name,
|
|
10
|
+
name: t.EXT_WEBLLM_NAME,
|
|
11
|
+
description: t.EXT_WEBLLM_DESC,
|
|
12
|
+
loader: () => import("./webllmservice-DO8ETODg.js"),
|
|
13
|
+
icon: "robot",
|
|
14
|
+
experimental: true
|
|
11
15
|
});
|
|
12
|
-
//#
|
|
16
|
+
//#endregion
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-lyra/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_WEBLLM_NAME,\n description: t.EXT_WEBLLM_DESC,\n loader: () => import(\"./webllmservice\"),\n icon: \"robot\",\n experimental: true,\n\n});\n"],"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-lyra/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_WEBLLM_NAME,\n description: t.EXT_WEBLLM_DESC,\n loader: () => import(\"./webllmservice\"),\n icon: \"robot\",\n experimental: true,\n\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,OAAO;CACrB,MAAM;CACN,cAAc;CAEf,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createLogger } from "@eclipse-lyra/core";
|
|
2
|
+
import { MLCEngine } from "@mlc-ai/web-llm";
|
|
3
|
+
import { aiService } from "@eclipse-lyra/extension-ai-system/api";
|
|
4
|
+
//#region src/webllmservice.ts
|
|
5
|
+
var logger = createLogger("WebLLM");
|
|
6
|
+
var WebLLMProvider = class {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.name = "webllm";
|
|
9
|
+
}
|
|
10
|
+
canHandle(chatProvider) {
|
|
11
|
+
return chatProvider.name === "webllm";
|
|
12
|
+
}
|
|
13
|
+
async init(model, parameters) {
|
|
14
|
+
if (this.engine) return;
|
|
15
|
+
const initProgressCallback = (progress) => {
|
|
16
|
+
logger.debug("Model loading progress:", progress);
|
|
17
|
+
};
|
|
18
|
+
this.engine = new MLCEngine({ initProgressCallback });
|
|
19
|
+
await this.engine.reload(model, parameters);
|
|
20
|
+
}
|
|
21
|
+
async *stream(params) {
|
|
22
|
+
if (!this.engine) await this.init(params.model, params.chatConfig.parameters);
|
|
23
|
+
const internalMessages = params.messages.map((message) => {
|
|
24
|
+
return { ...message };
|
|
25
|
+
});
|
|
26
|
+
const message = (await this.engine.chat.completions.create({ messages: internalMessages })).choices[0].message;
|
|
27
|
+
if (message.content) for (const char of message.content) yield {
|
|
28
|
+
type: "token",
|
|
29
|
+
content: char
|
|
30
|
+
};
|
|
31
|
+
yield {
|
|
32
|
+
type: "done",
|
|
33
|
+
content: ""
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async complete(params) {
|
|
37
|
+
if (!this.engine) await this.init(params.model, params.chatConfig.parameters);
|
|
38
|
+
const internalMessages = params.messages.map((message) => {
|
|
39
|
+
return { ...message };
|
|
40
|
+
});
|
|
41
|
+
return (await this.engine.chat.completions.create({ messages: internalMessages })).choices[0].message;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var webllmservice_default = () => {
|
|
45
|
+
aiService.registerStreamingFetcher(new WebLLMProvider());
|
|
46
|
+
};
|
|
47
|
+
//#endregion
|
|
48
|
+
export { webllmservice_default as default };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=webllmservice-DO8ETODg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webllmservice-DO8ETODg.js","names":[],"sources":["../src/webllmservice.ts"],"sourcesContent":["import {ChatCompletionMessageParam, MLCEngine} from \"@mlc-ai/web-llm\";\nimport { createLogger } from \"@eclipse-lyra/core\";\nimport type {ChatMessage, ChatProvider, StreamChunk} from \"@eclipse-lyra/extension-ai-system/api\";\n\nconst logger = createLogger('WebLLM');\nimport type {IProvider, StreamingParams, CompletionParams} from \"@eclipse-lyra/extension-ai-system/api\";\nimport {aiService} from \"@eclipse-lyra/extension-ai-system/api\";\n\nclass WebLLMProvider implements IProvider {\n name = \"webllm\";\n private engine?: MLCEngine;\n\n canHandle(chatProvider: ChatProvider): boolean {\n return chatProvider.name === \"webllm\";\n }\n\n private async init(model: string, parameters?: any): Promise<void> {\n if (this.engine) return;\n \n const initProgressCallback = (progress: any) => {\n logger.debug(\"Model loading progress:\", progress);\n };\n\n this.engine = new MLCEngine({initProgressCallback});\n await this.engine.reload(model, parameters);\n }\n\n async *stream(params: StreamingParams): AsyncIterable<StreamChunk> {\n if (!this.engine) {\n await this.init(params.model, params.chatConfig.parameters);\n }\n \n const internalMessages = params.messages.map((message) => {\n return {...message} as ChatCompletionMessageParam;\n });\n \n const result = await this.engine!.chat.completions.create({\n messages: internalMessages\n });\n \n const message = result.choices[0].message as ChatMessage;\n \n if (message.content) {\n for (const char of message.content) {\n yield {\n type: 'token',\n content: char\n };\n }\n }\n \n yield {\n type: 'done',\n content: ''\n };\n }\n\n async complete(params: CompletionParams): Promise<ChatMessage> {\n if (!this.engine) {\n await this.init(params.model, params.chatConfig.parameters);\n }\n \n const internalMessages = params.messages.map((message) => {\n return {...message} as ChatCompletionMessageParam;\n });\n \n const result = await this.engine!.chat.completions.create({\n messages: internalMessages\n });\n \n return result.choices[0].message as ChatMessage;\n }\n}\n\nexport default () => {\n aiService.registerStreamingFetcher(new WebLLMProvider());\n}"],"mappings":";;;;AAIA,IAAM,SAAS,aAAa,SAAS;AAIrC,IAAM,iBAAN,MAA0C;;cAC/B;;CAGP,UAAU,cAAqC;AAC3C,SAAO,aAAa,SAAS;;CAGjC,MAAc,KAAK,OAAe,YAAiC;AAC/D,MAAI,KAAK,OAAQ;EAEjB,MAAM,wBAAwB,aAAkB;AAC5C,UAAO,MAAM,2BAA2B,SAAS;;AAGrD,OAAK,SAAS,IAAI,UAAU,EAAC,sBAAqB,CAAC;AACnD,QAAM,KAAK,OAAO,OAAO,OAAO,WAAW;;CAG/C,OAAO,OAAO,QAAqD;AAC/D,MAAI,CAAC,KAAK,OACN,OAAM,KAAK,KAAK,OAAO,OAAO,OAAO,WAAW,WAAW;EAG/D,MAAM,mBAAmB,OAAO,SAAS,KAAK,YAAY;AACtD,UAAO,EAAC,GAAG,SAAQ;IACrB;EAMF,MAAM,WAJS,MAAM,KAAK,OAAQ,KAAK,YAAY,OAAO,EACtD,UAAU,kBACb,CAAC,EAEqB,QAAQ,GAAG;AAElC,MAAI,QAAQ,QACR,MAAK,MAAM,QAAQ,QAAQ,QACvB,OAAM;GACF,MAAM;GACN,SAAS;GACZ;AAIT,QAAM;GACF,MAAM;GACN,SAAS;GACZ;;CAGL,MAAM,SAAS,QAAgD;AAC3D,MAAI,CAAC,KAAK,OACN,OAAM,KAAK,KAAK,OAAO,OAAO,OAAO,WAAW,WAAW;EAG/D,MAAM,mBAAmB,OAAO,SAAS,KAAK,YAAY;AACtD,UAAO,EAAC,GAAG,SAAQ;IACrB;AAMF,UAJe,MAAM,KAAK,OAAQ,KAAK,YAAY,OAAO,EACtD,UAAU,kBACb,CAAC,EAEY,QAAQ,GAAG;;;AAIjC,IAAA,8BAAqB;AACjB,WAAU,yBAAyB,IAAI,gBAAgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eclipse-lyra/extension-webllm",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.58",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"@mlc-ai/web-llm": "^0.2.79"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"typescript": "^
|
|
19
|
-
"vite": "^
|
|
18
|
+
"typescript": "^6.0.0",
|
|
19
|
+
"vite": "^8.0.0",
|
|
20
20
|
"vite-plugin-dts": "^4.5.4"
|
|
21
21
|
},
|
|
22
22
|
"module": "./dist/index.js",
|
package/dist/i18n.de-Zh6IDMrM.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
const EXT_WEBLLM_NAME = "WebLLM";
|
|
2
|
-
const EXT_WEBLLM_DESC = "LLM-Inferenz im Browser";
|
|
3
|
-
const i18n_de = {
|
|
4
|
-
EXT_WEBLLM_NAME,
|
|
5
|
-
EXT_WEBLLM_DESC
|
|
6
|
-
};
|
|
7
|
-
export {
|
|
8
|
-
EXT_WEBLLM_DESC,
|
|
9
|
-
EXT_WEBLLM_NAME,
|
|
10
|
-
i18n_de as default
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=i18n.de-Zh6IDMrM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.de-Zh6IDMrM.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
package/dist/i18n.en-DGw3X1Kw.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
const EXT_WEBLLM_NAME = "WebLLM";
|
|
2
|
-
const EXT_WEBLLM_DESC = "In-Browser LLM inference";
|
|
3
|
-
const i18n_en = {
|
|
4
|
-
EXT_WEBLLM_NAME,
|
|
5
|
-
EXT_WEBLLM_DESC
|
|
6
|
-
};
|
|
7
|
-
export {
|
|
8
|
-
EXT_WEBLLM_DESC,
|
|
9
|
-
EXT_WEBLLM_NAME,
|
|
10
|
-
i18n_en as default
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=i18n.en-DGw3X1Kw.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.en-DGw3X1Kw.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { MLCEngine } from "@mlc-ai/web-llm";
|
|
2
|
-
import { createLogger } from "@eclipse-lyra/core";
|
|
3
|
-
import { aiService } from "@eclipse-lyra/extension-ai-system/api";
|
|
4
|
-
const logger = createLogger("WebLLM");
|
|
5
|
-
class WebLLMProvider {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.name = "webllm";
|
|
8
|
-
}
|
|
9
|
-
canHandle(chatProvider) {
|
|
10
|
-
return chatProvider.name === "webllm";
|
|
11
|
-
}
|
|
12
|
-
async init(model, parameters) {
|
|
13
|
-
if (this.engine) return;
|
|
14
|
-
const initProgressCallback = (progress) => {
|
|
15
|
-
logger.debug("Model loading progress:", progress);
|
|
16
|
-
};
|
|
17
|
-
this.engine = new MLCEngine({ initProgressCallback });
|
|
18
|
-
await this.engine.reload(model, parameters);
|
|
19
|
-
}
|
|
20
|
-
async *stream(params) {
|
|
21
|
-
if (!this.engine) {
|
|
22
|
-
await this.init(params.model, params.chatConfig.parameters);
|
|
23
|
-
}
|
|
24
|
-
const internalMessages = params.messages.map((message2) => {
|
|
25
|
-
return { ...message2 };
|
|
26
|
-
});
|
|
27
|
-
const result = await this.engine.chat.completions.create({
|
|
28
|
-
messages: internalMessages
|
|
29
|
-
});
|
|
30
|
-
const message = result.choices[0].message;
|
|
31
|
-
if (message.content) {
|
|
32
|
-
for (const char of message.content) {
|
|
33
|
-
yield {
|
|
34
|
-
type: "token",
|
|
35
|
-
content: char
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
yield {
|
|
40
|
-
type: "done",
|
|
41
|
-
content: ""
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
async complete(params) {
|
|
45
|
-
if (!this.engine) {
|
|
46
|
-
await this.init(params.model, params.chatConfig.parameters);
|
|
47
|
-
}
|
|
48
|
-
const internalMessages = params.messages.map((message) => {
|
|
49
|
-
return { ...message };
|
|
50
|
-
});
|
|
51
|
-
const result = await this.engine.chat.completions.create({
|
|
52
|
-
messages: internalMessages
|
|
53
|
-
});
|
|
54
|
-
return result.choices[0].message;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
const webllmservice = () => {
|
|
58
|
-
aiService.registerStreamingFetcher(new WebLLMProvider());
|
|
59
|
-
};
|
|
60
|
-
export {
|
|
61
|
-
webllmservice as default
|
|
62
|
-
};
|
|
63
|
-
//# sourceMappingURL=webllmservice-Birv3OKf.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webllmservice-Birv3OKf.js","sources":["../src/webllmservice.ts"],"sourcesContent":["import {ChatCompletionMessageParam, MLCEngine} from \"@mlc-ai/web-llm\";\nimport { createLogger } from \"@eclipse-lyra/core\";\nimport type {ChatMessage, ChatProvider, StreamChunk} from \"@eclipse-lyra/extension-ai-system/api\";\n\nconst logger = createLogger('WebLLM');\nimport type {IProvider, StreamingParams, CompletionParams} from \"@eclipse-lyra/extension-ai-system/api\";\nimport {aiService} from \"@eclipse-lyra/extension-ai-system/api\";\n\nclass WebLLMProvider implements IProvider {\n name = \"webllm\";\n private engine?: MLCEngine;\n\n canHandle(chatProvider: ChatProvider): boolean {\n return chatProvider.name === \"webllm\";\n }\n\n private async init(model: string, parameters?: any): Promise<void> {\n if (this.engine) return;\n \n const initProgressCallback = (progress: any) => {\n logger.debug(\"Model loading progress:\", progress);\n };\n\n this.engine = new MLCEngine({initProgressCallback});\n await this.engine.reload(model, parameters);\n }\n\n async *stream(params: StreamingParams): AsyncIterable<StreamChunk> {\n if (!this.engine) {\n await this.init(params.model, params.chatConfig.parameters);\n }\n \n const internalMessages = params.messages.map((message) => {\n return {...message} as ChatCompletionMessageParam;\n });\n \n const result = await this.engine!.chat.completions.create({\n messages: internalMessages\n });\n \n const message = result.choices[0].message as ChatMessage;\n \n if (message.content) {\n for (const char of message.content) {\n yield {\n type: 'token',\n content: char\n };\n }\n }\n \n yield {\n type: 'done',\n content: ''\n };\n }\n\n async complete(params: CompletionParams): Promise<ChatMessage> {\n if (!this.engine) {\n await this.init(params.model, params.chatConfig.parameters);\n }\n \n const internalMessages = params.messages.map((message) => {\n return {...message} as ChatCompletionMessageParam;\n });\n \n const result = await this.engine!.chat.completions.create({\n messages: internalMessages\n });\n \n return result.choices[0].message as ChatMessage;\n }\n}\n\nexport default () => {\n aiService.registerStreamingFetcher(new WebLLMProvider());\n}"],"names":["message"],"mappings":";;;AAIA,MAAM,SAAS,aAAa,QAAQ;AAIpC,MAAM,eAAoC;AAAA,EAA1C,cAAA;AACI,SAAA,OAAO;AAAA,EAAA;AAAA,EAGP,UAAU,cAAqC;AAC3C,WAAO,aAAa,SAAS;AAAA,EACjC;AAAA,EAEA,MAAc,KAAK,OAAe,YAAiC;AAC/D,QAAI,KAAK,OAAQ;AAEjB,UAAM,uBAAuB,CAAC,aAAkB;AAC5C,aAAO,MAAM,2BAA2B,QAAQ;AAAA,IACpD;AAEA,SAAK,SAAS,IAAI,UAAU,EAAC,sBAAqB;AAClD,UAAM,KAAK,OAAO,OAAO,OAAO,UAAU;AAAA,EAC9C;AAAA,EAEA,OAAO,OAAO,QAAqD;AAC/D,QAAI,CAAC,KAAK,QAAQ;AACd,YAAM,KAAK,KAAK,OAAO,OAAO,OAAO,WAAW,UAAU;AAAA,IAC9D;AAEA,UAAM,mBAAmB,OAAO,SAAS,IAAI,CAACA,aAAY;AACtD,aAAO,EAAC,GAAGA,SAAAA;AAAAA,IACf,CAAC;AAED,UAAM,SAAS,MAAM,KAAK,OAAQ,KAAK,YAAY,OAAO;AAAA,MACtD,UAAU;AAAA,IAAA,CACb;AAED,UAAM,UAAU,OAAO,QAAQ,CAAC,EAAE;AAElC,QAAI,QAAQ,SAAS;AACjB,iBAAW,QAAQ,QAAQ,SAAS;AAChC,cAAM;AAAA,UACF,MAAM;AAAA,UACN,SAAS;AAAA,QAAA;AAAA,MAEjB;AAAA,IACJ;AAEA,UAAM;AAAA,MACF,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,EAEjB;AAAA,EAEA,MAAM,SAAS,QAAgD;AAC3D,QAAI,CAAC,KAAK,QAAQ;AACd,YAAM,KAAK,KAAK,OAAO,OAAO,OAAO,WAAW,UAAU;AAAA,IAC9D;AAEA,UAAM,mBAAmB,OAAO,SAAS,IAAI,CAAC,YAAY;AACtD,aAAO,EAAC,GAAG,QAAA;AAAA,IACf,CAAC;AAED,UAAM,SAAS,MAAM,KAAK,OAAQ,KAAK,YAAY,OAAO;AAAA,MACtD,UAAU;AAAA,IAAA,CACb;AAED,WAAO,OAAO,QAAQ,CAAC,EAAE;AAAA,EAC7B;AACJ;AAEA,MAAA,gBAAe,MAAM;AACjB,YAAU,yBAAyB,IAAI,gBAAgB;AAC3D;"}
|