@geekmidas/emailkit 0.0.6 → 0.1.0
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/{client-BPSe9rim.mjs → client-BkN5BGeJ.mjs} +6 -6
- package/dist/client-BkN5BGeJ.mjs.map +1 -0
- package/dist/{client-DBPPXw0Q.cjs → client-sZNHPYYg.cjs} +6 -6
- package/dist/client-sZNHPYYg.cjs.map +1 -0
- package/dist/client.cjs +1 -1
- package/dist/client.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +7 -2
- package/src/client.ts +5 -5
- package/dist/client-BPSe9rim.mjs.map +0 -1
- package/dist/client-DBPPXw0Q.cjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { render } from "@react-email/components";
|
|
1
2
|
import nodemailer from "nodemailer";
|
|
2
|
-
import { renderToStaticMarkup } from "react-dom/server";
|
|
3
3
|
|
|
4
4
|
//#region src/client.ts
|
|
5
5
|
var SMTPClient = class {
|
|
@@ -25,10 +25,10 @@ var SMTPClient = class {
|
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
async sendTemplate(template, options) {
|
|
28
|
-
const
|
|
29
|
-
if (!
|
|
30
|
-
const element =
|
|
31
|
-
const html =
|
|
28
|
+
const Component = this.config.templates[template];
|
|
29
|
+
if (!Component) throw new Error(`Template "${String(template)}" not found`);
|
|
30
|
+
const element = Component(options.props);
|
|
31
|
+
const html = await render(element);
|
|
32
32
|
return this.send({
|
|
33
33
|
...options,
|
|
34
34
|
html
|
|
@@ -55,4 +55,4 @@ function createEmailClient(config) {
|
|
|
55
55
|
|
|
56
56
|
//#endregion
|
|
57
57
|
export { SMTPClient, createEmailClient };
|
|
58
|
-
//# sourceMappingURL=client-
|
|
58
|
+
//# sourceMappingURL=client-BkN5BGeJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-BkN5BGeJ.mjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n }"],"sources":["../src/client.ts"],"sourcesContent":["import { render } from '@react-email/components';\nimport nodemailer, { type Transporter } from 'nodemailer';\nimport type {\n EmailClient,\n EmailClientConfig,\n SendOptions,\n SendResult,\n TemplateNames,\n TemplatePropsFor,\n TemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n private transporter: Transporter;\n private config: EmailClientConfig<T>;\n\n constructor(config: EmailClientConfig<T>) {\n this.config = config;\n this.transporter = nodemailer.createTransport(config.smtp as any);\n }\n\n async send(options: SendOptions): Promise<SendResult> {\n const mailOptions = {\n ...this.config.defaults,\n ...options,\n };\n\n if (!mailOptions.from) {\n throw new Error(\n 'The \"from\" field is required in email options or defaults',\n );\n }\n\n if (!mailOptions.text && !mailOptions.html) {\n throw new Error('Either text or html content must be provided');\n }\n\n const info = await this.transporter.sendMail(mailOptions);\n\n return {\n messageId: info.messageId,\n accepted: info.accepted || [],\n rejected: info.rejected || [],\n response: info.response,\n };\n }\n\n async sendTemplate<K extends TemplateNames<T>>(\n template: K,\n options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n },\n ): Promise<SendResult> {\n const Component = this.config.templates[template];\n if (!Component) {\n throw new Error(`Template \"${String(template)}\" not found`);\n }\n\n const element = Component(options.props);\n const html = await render(element);\n\n return this.send({\n ...options,\n html,\n });\n }\n\n async verify(): Promise<boolean> {\n try {\n await this.transporter.verify();\n return true;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n this.transporter.close();\n }\n\n getTemplateNames(): TemplateNames<T>[] {\n return Object.keys(this.config.templates) as TemplateNames<T>[];\n }\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n config: EmailClientConfig<T>,\n): SMTPClient<T> {\n return new SMTPClient(config);\n}\n"],"mappings":";;;;AAYA,IAAa,aAAb,MAA4E;CAC1E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,SAAS;AACd,OAAK,cAAc,WAAW,gBAAgB,OAAO,KAAY;CAClE;CAED,MAAM,KAAKC,SAA2C;EACpD,MAAM,cAAc;GAClB,GAAG,KAAK,OAAO;GACf,GAAG;EACJ;AAED,OAAK,YAAY,KACf,OAAM,IAAI,MACR;AAIJ,OAAK,YAAY,SAAS,YAAY,KACpC,OAAM,IAAI,MAAM;EAGlB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACL,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EAChB;CACF;CAED,MAAM,aACJC,UACAC,SAGqB;EACrB,MAAM,YAAY,KAAK,OAAO,UAAU;AACxC,OAAK,UACH,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAGhD,MAAM,UAAU,UAAU,QAAQ,MAAM;EACxC,MAAM,OAAO,MAAM,OAAO,QAAQ;AAElC,SAAO,KAAK,KAAK;GACf,GAAG;GACH;EACD,EAAC;CACH;CAED,MAAM,SAA2B;AAC/B,MAAI;AACF,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACR,QAAO;AACN,UAAO;EACR;CACF;CAED,MAAM,QAAuB;AAC3B,OAAK,YAAY,OAAO;CACzB;CAED,mBAAuC;AACrC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CAC1C;AACF;AAED,SAAgB,kBACdH,QACe;AACf,QAAO,IAAI,WAAW;AACvB"}
|
|
@@ -21,8 +21,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
21
21
|
}) : target, mod));
|
|
22
22
|
|
|
23
23
|
//#endregion
|
|
24
|
+
const __react_email_components = __toESM(require("@react-email/components"));
|
|
24
25
|
const nodemailer = __toESM(require("nodemailer"));
|
|
25
|
-
const react_dom_server = __toESM(require("react-dom/server"));
|
|
26
26
|
|
|
27
27
|
//#region src/client.ts
|
|
28
28
|
var SMTPClient = class {
|
|
@@ -48,10 +48,10 @@ var SMTPClient = class {
|
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
async sendTemplate(template, options) {
|
|
51
|
-
const
|
|
52
|
-
if (!
|
|
53
|
-
const element =
|
|
54
|
-
const html = (0,
|
|
51
|
+
const Component = this.config.templates[template];
|
|
52
|
+
if (!Component) throw new Error(`Template "${String(template)}" not found`);
|
|
53
|
+
const element = Component(options.props);
|
|
54
|
+
const html = await (0, __react_email_components.render)(element);
|
|
55
55
|
return this.send({
|
|
56
56
|
...options,
|
|
57
57
|
html
|
|
@@ -89,4 +89,4 @@ Object.defineProperty(exports, 'createEmailClient', {
|
|
|
89
89
|
return createEmailClient;
|
|
90
90
|
}
|
|
91
91
|
});
|
|
92
|
-
//# sourceMappingURL=client-
|
|
92
|
+
//# sourceMappingURL=client-sZNHPYYg.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-sZNHPYYg.cjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n }"],"sources":["../src/client.ts"],"sourcesContent":["import { render } from '@react-email/components';\nimport nodemailer, { type Transporter } from 'nodemailer';\nimport type {\n EmailClient,\n EmailClientConfig,\n SendOptions,\n SendResult,\n TemplateNames,\n TemplatePropsFor,\n TemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n private transporter: Transporter;\n private config: EmailClientConfig<T>;\n\n constructor(config: EmailClientConfig<T>) {\n this.config = config;\n this.transporter = nodemailer.createTransport(config.smtp as any);\n }\n\n async send(options: SendOptions): Promise<SendResult> {\n const mailOptions = {\n ...this.config.defaults,\n ...options,\n };\n\n if (!mailOptions.from) {\n throw new Error(\n 'The \"from\" field is required in email options or defaults',\n );\n }\n\n if (!mailOptions.text && !mailOptions.html) {\n throw new Error('Either text or html content must be provided');\n }\n\n const info = await this.transporter.sendMail(mailOptions);\n\n return {\n messageId: info.messageId,\n accepted: info.accepted || [],\n rejected: info.rejected || [],\n response: info.response,\n };\n }\n\n async sendTemplate<K extends TemplateNames<T>>(\n template: K,\n options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n },\n ): Promise<SendResult> {\n const Component = this.config.templates[template];\n if (!Component) {\n throw new Error(`Template \"${String(template)}\" not found`);\n }\n\n const element = Component(options.props);\n const html = await render(element);\n\n return this.send({\n ...options,\n html,\n });\n }\n\n async verify(): Promise<boolean> {\n try {\n await this.transporter.verify();\n return true;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n this.transporter.close();\n }\n\n getTemplateNames(): TemplateNames<T>[] {\n return Object.keys(this.config.templates) as TemplateNames<T>[];\n }\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n config: EmailClientConfig<T>,\n): SMTPClient<T> {\n return new SMTPClient(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,IAAa,aAAb,MAA4E;CAC1E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,SAAS;AACd,OAAK,cAAc,mBAAW,gBAAgB,OAAO,KAAY;CAClE;CAED,MAAM,KAAKC,SAA2C;EACpD,MAAM,cAAc;GAClB,GAAG,KAAK,OAAO;GACf,GAAG;EACJ;AAED,OAAK,YAAY,KACf,OAAM,IAAI,MACR;AAIJ,OAAK,YAAY,SAAS,YAAY,KACpC,OAAM,IAAI,MAAM;EAGlB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACL,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EAChB;CACF;CAED,MAAM,aACJC,UACAC,SAGqB;EACrB,MAAM,YAAY,KAAK,OAAO,UAAU;AACxC,OAAK,UACH,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAGhD,MAAM,UAAU,UAAU,QAAQ,MAAM;EACxC,MAAM,OAAO,MAAM,qCAAO,QAAQ;AAElC,SAAO,KAAK,KAAK;GACf,GAAG;GACH;EACD,EAAC;CACH;CAED,MAAM,SAA2B;AAC/B,MAAI;AACF,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACR,QAAO;AACN,UAAO;EACR;CACF;CAED,MAAM,QAAuB;AAC3B,OAAK,YAAY,OAAO;CACzB;CAED,mBAAuC;AACrC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CAC1C;AACF;AAED,SAAgB,kBACdH,QACe;AACf,QAAO,IAAI,WAAW;AACvB"}
|
package/dist/client.cjs
CHANGED
package/dist/client.mjs
CHANGED
package/dist/index.cjs
CHANGED
package/dist/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geekmidas/emailkit",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Type-safe email client with SMTP support and React templates",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
"require": "./dist/*.cjs"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/geekmidas/toolbox"
|
|
17
|
+
},
|
|
14
18
|
"publishConfig": {
|
|
15
19
|
"registry": "https://registry.npmjs.org/",
|
|
16
20
|
"access": "public"
|
|
@@ -28,7 +32,8 @@
|
|
|
28
32
|
},
|
|
29
33
|
"peerDependencies": {
|
|
30
34
|
"react": ">=18.0.0",
|
|
31
|
-
"react-dom": ">=18.0.0"
|
|
35
|
+
"react-dom": ">=18.0.0",
|
|
36
|
+
"@react-email/components": "~1.0.1"
|
|
32
37
|
},
|
|
33
38
|
"engines": {
|
|
34
39
|
"node": ">=22.0.0"
|
package/src/client.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { render } from '@react-email/components';
|
|
1
2
|
import nodemailer, { type Transporter } from 'nodemailer';
|
|
2
|
-
import { renderToStaticMarkup } from 'react-dom/server';
|
|
3
3
|
import type {
|
|
4
4
|
EmailClient,
|
|
5
5
|
EmailClientConfig,
|
|
@@ -51,13 +51,13 @@ export class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {
|
|
|
51
51
|
props: TemplatePropsFor<T, K>;
|
|
52
52
|
},
|
|
53
53
|
): Promise<SendResult> {
|
|
54
|
-
const
|
|
55
|
-
if (!
|
|
54
|
+
const Component = this.config.templates[template];
|
|
55
|
+
if (!Component) {
|
|
56
56
|
throw new Error(`Template "${String(template)}" not found`);
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
const element =
|
|
60
|
-
const html =
|
|
59
|
+
const element = Component(options.props);
|
|
60
|
+
const html = await render(element);
|
|
61
61
|
|
|
62
62
|
return this.send({
|
|
63
63
|
...options,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-BPSe9rim.mjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n }"],"sources":["../src/client.ts"],"sourcesContent":["import nodemailer, { type Transporter } from 'nodemailer';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type {\n EmailClient,\n EmailClientConfig,\n SendOptions,\n SendResult,\n TemplateNames,\n TemplatePropsFor,\n TemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n private transporter: Transporter;\n private config: EmailClientConfig<T>;\n\n constructor(config: EmailClientConfig<T>) {\n this.config = config;\n this.transporter = nodemailer.createTransport(config.smtp as any);\n }\n\n async send(options: SendOptions): Promise<SendResult> {\n const mailOptions = {\n ...this.config.defaults,\n ...options,\n };\n\n if (!mailOptions.from) {\n throw new Error(\n 'The \"from\" field is required in email options or defaults',\n );\n }\n\n if (!mailOptions.text && !mailOptions.html) {\n throw new Error('Either text or html content must be provided');\n }\n\n const info = await this.transporter.sendMail(mailOptions);\n\n return {\n messageId: info.messageId,\n accepted: info.accepted || [],\n rejected: info.rejected || [],\n response: info.response,\n };\n }\n\n async sendTemplate<K extends TemplateNames<T>>(\n template: K,\n options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n },\n ): Promise<SendResult> {\n const templateFn = this.config.templates[template];\n if (!templateFn) {\n throw new Error(`Template \"${String(template)}\" not found`);\n }\n\n const element = templateFn(options.props);\n const html = renderToStaticMarkup(element);\n\n return this.send({\n ...options,\n html,\n });\n }\n\n async verify(): Promise<boolean> {\n try {\n await this.transporter.verify();\n return true;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n this.transporter.close();\n }\n\n getTemplateNames(): TemplateNames<T>[] {\n return Object.keys(this.config.templates) as TemplateNames<T>[];\n }\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n config: EmailClientConfig<T>,\n): SMTPClient<T> {\n return new SMTPClient(config);\n}\n"],"mappings":";;;;AAYA,IAAa,aAAb,MAA4E;CAC1E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,SAAS;AACd,OAAK,cAAc,WAAW,gBAAgB,OAAO,KAAY;CAClE;CAED,MAAM,KAAKC,SAA2C;EACpD,MAAM,cAAc;GAClB,GAAG,KAAK,OAAO;GACf,GAAG;EACJ;AAED,OAAK,YAAY,KACf,OAAM,IAAI,MACR;AAIJ,OAAK,YAAY,SAAS,YAAY,KACpC,OAAM,IAAI,MAAM;EAGlB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACL,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EAChB;CACF;CAED,MAAM,aACJC,UACAC,SAGqB;EACrB,MAAM,aAAa,KAAK,OAAO,UAAU;AACzC,OAAK,WACH,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAGhD,MAAM,UAAU,WAAW,QAAQ,MAAM;EACzC,MAAM,OAAO,qBAAqB,QAAQ;AAE1C,SAAO,KAAK,KAAK;GACf,GAAG;GACH;EACD,EAAC;CACH;CAED,MAAM,SAA2B;AAC/B,MAAI;AACF,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACR,QAAO;AACN,UAAO;EACR;CACF;CAED,MAAM,QAAuB;AAC3B,OAAK,YAAY,OAAO;CACzB;CAED,mBAAuC;AACrC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CAC1C;AACF;AAED,SAAgB,kBACdH,QACe;AACf,QAAO,IAAI,WAAW;AACvB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-DBPPXw0Q.cjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n }"],"sources":["../src/client.ts"],"sourcesContent":["import nodemailer, { type Transporter } from 'nodemailer';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type {\n EmailClient,\n EmailClientConfig,\n SendOptions,\n SendResult,\n TemplateNames,\n TemplatePropsFor,\n TemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n private transporter: Transporter;\n private config: EmailClientConfig<T>;\n\n constructor(config: EmailClientConfig<T>) {\n this.config = config;\n this.transporter = nodemailer.createTransport(config.smtp as any);\n }\n\n async send(options: SendOptions): Promise<SendResult> {\n const mailOptions = {\n ...this.config.defaults,\n ...options,\n };\n\n if (!mailOptions.from) {\n throw new Error(\n 'The \"from\" field is required in email options or defaults',\n );\n }\n\n if (!mailOptions.text && !mailOptions.html) {\n throw new Error('Either text or html content must be provided');\n }\n\n const info = await this.transporter.sendMail(mailOptions);\n\n return {\n messageId: info.messageId,\n accepted: info.accepted || [],\n rejected: info.rejected || [],\n response: info.response,\n };\n }\n\n async sendTemplate<K extends TemplateNames<T>>(\n template: K,\n options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n },\n ): Promise<SendResult> {\n const templateFn = this.config.templates[template];\n if (!templateFn) {\n throw new Error(`Template \"${String(template)}\" not found`);\n }\n\n const element = templateFn(options.props);\n const html = renderToStaticMarkup(element);\n\n return this.send({\n ...options,\n html,\n });\n }\n\n async verify(): Promise<boolean> {\n try {\n await this.transporter.verify();\n return true;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n this.transporter.close();\n }\n\n getTemplateNames(): TemplateNames<T>[] {\n return Object.keys(this.config.templates) as TemplateNames<T>[];\n }\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n config: EmailClientConfig<T>,\n): SMTPClient<T> {\n return new SMTPClient(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,IAAa,aAAb,MAA4E;CAC1E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,SAAS;AACd,OAAK,cAAc,mBAAW,gBAAgB,OAAO,KAAY;CAClE;CAED,MAAM,KAAKC,SAA2C;EACpD,MAAM,cAAc;GAClB,GAAG,KAAK,OAAO;GACf,GAAG;EACJ;AAED,OAAK,YAAY,KACf,OAAM,IAAI,MACR;AAIJ,OAAK,YAAY,SAAS,YAAY,KACpC,OAAM,IAAI,MAAM;EAGlB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACL,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EAChB;CACF;CAED,MAAM,aACJC,UACAC,SAGqB;EACrB,MAAM,aAAa,KAAK,OAAO,UAAU;AACzC,OAAK,WACH,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAGhD,MAAM,UAAU,WAAW,QAAQ,MAAM;EACzC,MAAM,OAAO,2CAAqB,QAAQ;AAE1C,SAAO,KAAK,KAAK;GACf,GAAG;GACH;EACD,EAAC;CACH;CAED,MAAM,SAA2B;AAC/B,MAAI;AACF,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACR,QAAO;AACN,UAAO;EACR;CACF;CAED,MAAM,QAAuB;AAC3B,OAAK,YAAY,OAAO;CACzB;CAED,mBAAuC;AACrC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CAC1C;AACF;AAED,SAAgB,kBACdH,QACe;AACf,QAAO,IAAI,WAAW;AACvB"}
|