@bernierllc/email-sender 0.2.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.
Files changed (39) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +430 -0
  3. package/dist/core/email-sender.d.ts +71 -0
  4. package/dist/core/email-sender.d.ts.map +1 -0
  5. package/dist/core/email-sender.js +125 -0
  6. package/dist/core/email-sender.js.map +1 -0
  7. package/dist/index.d.ts +14 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +47 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/providers/base.d.ts +63 -0
  12. package/dist/providers/base.d.ts.map +1 -0
  13. package/dist/providers/base.js +132 -0
  14. package/dist/providers/base.js.map +1 -0
  15. package/dist/providers/mailgun.d.ts +40 -0
  16. package/dist/providers/mailgun.d.ts.map +1 -0
  17. package/dist/providers/mailgun.js +525 -0
  18. package/dist/providers/mailgun.js.map +1 -0
  19. package/dist/providers/postmark.d.ts +37 -0
  20. package/dist/providers/postmark.d.ts.map +1 -0
  21. package/dist/providers/postmark.js +482 -0
  22. package/dist/providers/postmark.js.map +1 -0
  23. package/dist/providers/sendgrid.d.ts +80 -0
  24. package/dist/providers/sendgrid.d.ts.map +1 -0
  25. package/dist/providers/sendgrid.js +407 -0
  26. package/dist/providers/sendgrid.js.map +1 -0
  27. package/dist/providers/ses.d.ts +38 -0
  28. package/dist/providers/ses.d.ts.map +1 -0
  29. package/dist/providers/ses.js +404 -0
  30. package/dist/providers/ses.js.map +1 -0
  31. package/dist/providers/smtp.d.ts +61 -0
  32. package/dist/providers/smtp.d.ts.map +1 -0
  33. package/dist/providers/smtp.js +201 -0
  34. package/dist/providers/smtp.js.map +1 -0
  35. package/dist/types/index.d.ts +99 -0
  36. package/dist/types/index.d.ts.map +1 -0
  37. package/dist/types/index.js +10 -0
  38. package/dist/types/index.js.map +1 -0
  39. package/package.json +55 -0
@@ -0,0 +1,482 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (c) 2025 Bernier LLC
4
+
5
+ This file is licensed to the client under a limited-use license.
6
+ The client may use and modify this code *only within the scope of the project it was delivered for*.
7
+ Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.PostmarkProvider = void 0;
11
+ /**
12
+ * Postmark Email Provider
13
+ * Handles email sending through Postmark API
14
+ */
15
+ const base_1 = require("./base");
16
+ class PostmarkProvider extends base_1.EmailProvider {
17
+ constructor(config) {
18
+ super(config);
19
+ this.baseUrl = this.config.endpoint || 'https://api.postmarkapp.com';
20
+ }
21
+ async sendEmail(message) {
22
+ try {
23
+ const postmarkMessage = this.convertToPostmarkMessage(message);
24
+ const response = await fetch(`${this.baseUrl}/email`, {
25
+ method: 'POST',
26
+ headers: {
27
+ 'Content-Type': 'application/json',
28
+ 'X-Postmark-Server-Token': this.config.apiKey
29
+ },
30
+ body: JSON.stringify(postmarkMessage)
31
+ });
32
+ if (!response.ok) {
33
+ const errorData = await response.json();
34
+ throw new Error(`Postmark API error: ${response.status} - ${JSON.stringify(errorData)}`);
35
+ }
36
+ const result = await response.json();
37
+ return {
38
+ success: true,
39
+ messageId: result.MessageID,
40
+ providerResponse: result,
41
+ metadata: {
42
+ provider: 'postmark',
43
+ submittedAt: result.SubmittedAt,
44
+ timestamp: new Date().toISOString()
45
+ }
46
+ };
47
+ }
48
+ catch (error) {
49
+ return {
50
+ success: false,
51
+ errorMessage: this.formatPostmarkError(error),
52
+ providerResponse: error,
53
+ metadata: {
54
+ provider: 'postmark',
55
+ timestamp: new Date().toISOString()
56
+ }
57
+ };
58
+ }
59
+ }
60
+ async sendBatch(emails) {
61
+ try {
62
+ const batchSize = Math.min(emails.length, this.getCapabilities().maxBatchSize);
63
+ const results = [];
64
+ // Process emails in batches
65
+ for (let i = 0; i < emails.length; i += batchSize) {
66
+ const batch = emails.slice(i, i + batchSize);
67
+ const batchResults = await this.sendBatchChunk(batch);
68
+ results.push(...batchResults);
69
+ }
70
+ return results;
71
+ }
72
+ catch (error) {
73
+ // If batch fails, return individual error results
74
+ return emails.map(() => ({
75
+ success: false,
76
+ errorMessage: this.formatPostmarkError(error),
77
+ metadata: {
78
+ provider: 'postmark',
79
+ timestamp: new Date().toISOString()
80
+ }
81
+ }));
82
+ }
83
+ }
84
+ async sendBatchChunk(emails) {
85
+ try {
86
+ const postmarkMessages = emails.map(email => this.convertToPostmarkMessage(email));
87
+ const response = await fetch(`${this.baseUrl}/email/batch`, {
88
+ method: 'POST',
89
+ headers: {
90
+ 'Content-Type': 'application/json',
91
+ 'X-Postmark-Server-Token': this.config.apiKey
92
+ },
93
+ body: JSON.stringify(postmarkMessages)
94
+ });
95
+ if (!response.ok) {
96
+ const errorData = await response.json();
97
+ throw new Error(`Postmark batch API error: ${response.status} - ${JSON.stringify(errorData)}`);
98
+ }
99
+ const results = await response.json();
100
+ return results.map((result) => ({
101
+ success: result.ErrorCode === 0,
102
+ messageId: result.MessageID,
103
+ errorMessage: result.ErrorCode !== 0 ? result.Message : undefined,
104
+ providerResponse: result,
105
+ metadata: {
106
+ provider: 'postmark',
107
+ submittedAt: result.SubmittedAt,
108
+ timestamp: new Date().toISOString()
109
+ }
110
+ }));
111
+ }
112
+ catch (error) {
113
+ return emails.map(() => ({
114
+ success: false,
115
+ errorMessage: this.formatPostmarkError(error),
116
+ metadata: {
117
+ provider: 'postmark',
118
+ timestamp: new Date().toISOString()
119
+ }
120
+ }));
121
+ }
122
+ }
123
+ async sendTemplateEmail(templateId, toEmail, variables) {
124
+ try {
125
+ const postmarkMessage = {
126
+ From: this.config.fromEmail,
127
+ To: toEmail,
128
+ TemplateId: parseInt(templateId),
129
+ TemplateModel: variables,
130
+ MessageStream: 'outbound'
131
+ };
132
+ const response = await fetch(`${this.baseUrl}/email/withTemplate`, {
133
+ method: 'POST',
134
+ headers: {
135
+ 'Content-Type': 'application/json',
136
+ 'X-Postmark-Server-Token': this.config.apiKey
137
+ },
138
+ body: JSON.stringify(postmarkMessage)
139
+ });
140
+ if (!response.ok) {
141
+ const errorData = await response.json();
142
+ throw new Error(`Postmark template API error: ${response.status} - ${JSON.stringify(errorData)}`);
143
+ }
144
+ const result = await response.json();
145
+ return {
146
+ success: true,
147
+ messageId: result.MessageID,
148
+ providerResponse: result,
149
+ metadata: {
150
+ provider: 'postmark',
151
+ templateId,
152
+ submittedAt: result.SubmittedAt,
153
+ timestamp: new Date().toISOString()
154
+ }
155
+ };
156
+ }
157
+ catch (error) {
158
+ return {
159
+ success: false,
160
+ errorMessage: this.formatPostmarkError(error),
161
+ providerResponse: error,
162
+ metadata: {
163
+ provider: 'postmark',
164
+ templateId,
165
+ timestamp: new Date().toISOString()
166
+ }
167
+ };
168
+ }
169
+ }
170
+ async createTemplate(template) {
171
+ try {
172
+ const postmarkTemplate = {
173
+ Name: template.name,
174
+ Subject: template.subject,
175
+ HtmlBody: template.htmlContent,
176
+ TextBody: template.textContent,
177
+ AssociatedServerId: 0 // Use default server
178
+ };
179
+ const response = await fetch(`${this.baseUrl}/templates`, {
180
+ method: 'POST',
181
+ headers: {
182
+ 'Content-Type': 'application/json',
183
+ 'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
184
+ },
185
+ body: JSON.stringify(postmarkTemplate)
186
+ });
187
+ if (!response.ok) {
188
+ const errorData = await response.json();
189
+ throw new Error(`Postmark template creation error: ${response.status} - ${JSON.stringify(errorData)}`);
190
+ }
191
+ const result = await response.json();
192
+ return result.TemplateID.toString();
193
+ }
194
+ catch (error) {
195
+ throw new Error(`Failed to create Postmark template: ${this.formatPostmarkError(error)}`);
196
+ }
197
+ }
198
+ async updateTemplate(template) {
199
+ try {
200
+ const postmarkTemplate = {
201
+ Name: template.name,
202
+ Subject: template.subject,
203
+ HtmlBody: template.htmlContent,
204
+ TextBody: template.textContent
205
+ };
206
+ const response = await fetch(`${this.baseUrl}/templates/${template.id}`, {
207
+ method: 'PUT',
208
+ headers: {
209
+ 'Content-Type': 'application/json',
210
+ 'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
211
+ },
212
+ body: JSON.stringify(postmarkTemplate)
213
+ });
214
+ if (!response.ok) {
215
+ const errorData = await response.json();
216
+ throw new Error(`Postmark template update error: ${response.status} - ${JSON.stringify(errorData)}`);
217
+ }
218
+ }
219
+ catch (error) {
220
+ throw new Error(`Failed to update Postmark template: ${this.formatPostmarkError(error)}`);
221
+ }
222
+ }
223
+ async deleteTemplate(templateId) {
224
+ try {
225
+ const response = await fetch(`${this.baseUrl}/templates/${templateId}`, {
226
+ method: 'DELETE',
227
+ headers: {
228
+ 'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
229
+ }
230
+ });
231
+ if (!response.ok) {
232
+ const errorData = await response.json();
233
+ throw new Error(`Postmark template deletion error: ${response.status} - ${JSON.stringify(errorData)}`);
234
+ }
235
+ }
236
+ catch (error) {
237
+ throw new Error(`Failed to delete Postmark template: ${this.formatPostmarkError(error)}`);
238
+ }
239
+ }
240
+ async getTemplate(templateId) {
241
+ try {
242
+ const response = await fetch(`${this.baseUrl}/templates/${templateId}`, {
243
+ method: 'GET',
244
+ headers: {
245
+ 'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
246
+ }
247
+ });
248
+ if (!response.ok) {
249
+ if (response.status === 404) {
250
+ return null;
251
+ }
252
+ const errorData = await response.json();
253
+ throw new Error(`Postmark template fetch error: ${response.status} - ${JSON.stringify(errorData)}`);
254
+ }
255
+ const result = await response.json();
256
+ const template = result;
257
+ return {
258
+ id: template.TemplateID.toString(),
259
+ name: template.Name,
260
+ subject: template.Subject,
261
+ htmlContent: template.HtmlBody,
262
+ textContent: template.TextBody,
263
+ variables: [], // Postmark doesn't provide variable list
264
+ createdAt: new Date(template.CreatedAt),
265
+ updatedAt: new Date(template.UpdatedAt)
266
+ };
267
+ }
268
+ catch (error) {
269
+ throw new Error(`Failed to get Postmark template: ${this.formatPostmarkError(error)}`);
270
+ }
271
+ }
272
+ async listTemplates() {
273
+ try {
274
+ const response = await fetch(`${this.baseUrl}/templates`, {
275
+ method: 'GET',
276
+ headers: {
277
+ 'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
278
+ }
279
+ });
280
+ if (!response.ok) {
281
+ const errorData = await response.json();
282
+ throw new Error(`Postmark templates list error: ${response.status} - ${JSON.stringify(errorData)}`);
283
+ }
284
+ const result = await response.json();
285
+ const templates = [];
286
+ for (const template of result.Templates || []) {
287
+ const fullTemplate = await this.getTemplate(template.TemplateID.toString());
288
+ if (fullTemplate) {
289
+ templates.push(fullTemplate);
290
+ }
291
+ }
292
+ return templates;
293
+ }
294
+ catch (error) {
295
+ throw new Error(`Failed to list Postmark templates: ${this.formatPostmarkError(error)}`);
296
+ }
297
+ }
298
+ async getDeliveryStatus(messageId) {
299
+ try {
300
+ const response = await fetch(`${this.baseUrl}/messages/outbound/${messageId}/details`, {
301
+ method: 'GET',
302
+ headers: {
303
+ 'X-Postmark-Server-Token': this.config.apiKey
304
+ }
305
+ });
306
+ if (!response.ok) {
307
+ return null;
308
+ }
309
+ const result = await response.json();
310
+ const message = result;
311
+ const status = this.mapPostmarkStatusToDeliveryStatus(message.Status);
312
+ return {
313
+ messageId,
314
+ status,
315
+ ...(status === 'delivered' && { deliveredAt: new Date(message.DeliveredAt) }),
316
+ metadata: {
317
+ provider: 'postmark',
318
+ status: message.Status,
319
+ recipient: message.Recipient
320
+ }
321
+ };
322
+ }
323
+ catch (error) {
324
+ return null;
325
+ }
326
+ }
327
+ async processWebhook(_payload, _signature) {
328
+ // Implement Postmark webhook processing
329
+ // This would validate the signature and parse the webhook payload
330
+ return [];
331
+ }
332
+ async testConnection() {
333
+ try {
334
+ // Test by getting server info
335
+ const response = await fetch(`${this.baseUrl}/server`, {
336
+ method: 'GET',
337
+ headers: {
338
+ 'X-Postmark-Server-Token': this.config.apiKey
339
+ }
340
+ });
341
+ return response.ok;
342
+ }
343
+ catch (error) {
344
+ return false;
345
+ }
346
+ }
347
+ validateConfiguration() {
348
+ const errors = [];
349
+ const warnings = [];
350
+ if (!this.config.apiKey) {
351
+ errors.push('Postmark API key is required');
352
+ }
353
+ if (!this.config.fromEmail) {
354
+ errors.push('From email is required');
355
+ }
356
+ if (!this.config.accountToken && this.config.apiKey) {
357
+ warnings.push('Account token not provided - template operations may be limited');
358
+ }
359
+ return {
360
+ isValid: errors.length === 0,
361
+ errors,
362
+ warnings
363
+ };
364
+ }
365
+ validateEmailMessage(message) {
366
+ const errors = [];
367
+ const warnings = [];
368
+ if (!message.toEmail) {
369
+ errors.push('Recipient email is required');
370
+ }
371
+ else if (!this.isValidEmail(message.toEmail)) {
372
+ errors.push('Invalid recipient email format');
373
+ }
374
+ if (!message.subject) {
375
+ errors.push('Email subject is required');
376
+ }
377
+ if (!message.htmlContent && !message.textContent) {
378
+ errors.push('Either HTML or text content is required');
379
+ }
380
+ if (message.attachments && message.attachments.length > 0) {
381
+ const totalSize = message.attachments.reduce((sum, attachment) => {
382
+ return sum + (attachment.content ? Buffer.from(attachment.content, 'base64').length : 0);
383
+ }, 0);
384
+ if (totalSize > this.getCapabilities().maxAttachmentSize) {
385
+ errors.push(`Total attachment size exceeds maximum allowed size`);
386
+ }
387
+ }
388
+ return {
389
+ isValid: errors.length === 0,
390
+ errors,
391
+ warnings
392
+ };
393
+ }
394
+ getCapabilities() {
395
+ return {
396
+ supportsBatch: true,
397
+ supportsTemplates: true,
398
+ supportsWebhooks: true,
399
+ supportsAttachments: true,
400
+ supportsDeliveryTracking: true,
401
+ maxBatchSize: 500,
402
+ maxAttachmentSize: 10 * 1024 * 1024 // 10MB
403
+ };
404
+ }
405
+ convertToPostmarkMessage(message) {
406
+ const postmarkMessage = {
407
+ From: message.fromEmail || this.config.fromEmail,
408
+ To: message.toEmail,
409
+ Subject: message.subject
410
+ };
411
+ if (message.htmlContent) {
412
+ postmarkMessage.HtmlBody = message.htmlContent;
413
+ }
414
+ if (message.textContent) {
415
+ postmarkMessage.TextBody = message.textContent;
416
+ }
417
+ if (message.replyTo) {
418
+ postmarkMessage.ReplyTo = message.replyTo;
419
+ }
420
+ if (message.headers) {
421
+ postmarkMessage.Headers = Object.entries(message.headers).map(([key, value]) => ({
422
+ Name: key,
423
+ Value: value
424
+ }));
425
+ }
426
+ if (message.attachments && message.attachments.length > 0) {
427
+ postmarkMessage.Attachments = message.attachments.map(attachment => ({
428
+ Name: attachment.filename,
429
+ Content: attachment.content,
430
+ ContentType: attachment.contentType || 'application/octet-stream'
431
+ }));
432
+ }
433
+ if (message.metadata) {
434
+ postmarkMessage.Metadata = message.metadata;
435
+ }
436
+ return postmarkMessage;
437
+ }
438
+ mapPostmarkStatusToDeliveryStatus(status) {
439
+ switch (status?.toLowerCase()) {
440
+ case 'delivered':
441
+ return 'delivered';
442
+ case 'bounced':
443
+ return 'bounced';
444
+ case 'failed':
445
+ return 'failed';
446
+ case 'pending':
447
+ return 'pending';
448
+ case 'sent':
449
+ return 'sent';
450
+ case 'opened':
451
+ return 'opened';
452
+ case 'clicked':
453
+ return 'clicked';
454
+ case 'spam':
455
+ return 'spam';
456
+ case 'unsubscribed':
457
+ return 'unsubscribed';
458
+ default:
459
+ return 'sent';
460
+ }
461
+ }
462
+ formatPostmarkError(error) {
463
+ if (error.message) {
464
+ if (error.message.includes('401')) {
465
+ return 'Invalid Postmark API key';
466
+ }
467
+ if (error.message.includes('403')) {
468
+ return 'Access denied - check API key permissions';
469
+ }
470
+ if (error.message.includes('422')) {
471
+ return 'Invalid email parameters';
472
+ }
473
+ if (error.message.includes('429')) {
474
+ return 'Rate limit exceeded';
475
+ }
476
+ return error.message;
477
+ }
478
+ return 'Unknown Postmark error';
479
+ }
480
+ }
481
+ exports.PostmarkProvider = PostmarkProvider;
482
+ //# sourceMappingURL=postmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmark.js","sourceRoot":"","sources":["../../src/providers/postmark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * SendGrid Email Provider implementation
3
+ */
4
+ import { EmailProvider } from './base';
5
+ import { EmailMessage, SendResult, DeliveryStatus, WebhookEvent, EmailProviderConfig } from '../types';
6
+ export declare class SendGridProvider extends EmailProvider {
7
+ private apiKey;
8
+ private baseUrl;
9
+ constructor(config: EmailProviderConfig);
10
+ /**
11
+ * Send a single email
12
+ */
13
+ sendEmail(email: EmailMessage): Promise<SendResult>;
14
+ /**
15
+ * Send multiple emails
16
+ */
17
+ sendBatch(emails: EmailMessage[]): Promise<SendResult[]>;
18
+ /**
19
+ * Get delivery status for a message
20
+ */
21
+ getDeliveryStatus(messageId: string): Promise<DeliveryStatus | null>;
22
+ /**
23
+ * Process webhook events from SendGrid
24
+ */
25
+ processWebhook(payload: any, signature: string): Promise<WebhookEvent[]>;
26
+ /**
27
+ * Override capabilities for SendGrid
28
+ */
29
+ getCapabilities(): {
30
+ supportsBatch: boolean;
31
+ supportsTemplates: boolean;
32
+ supportsWebhooks: boolean;
33
+ supportsAttachments: boolean;
34
+ supportsDeliveryTracking: boolean;
35
+ maxBatchSize: number;
36
+ maxAttachmentSize: number;
37
+ };
38
+ /**
39
+ * Create a template in SendGrid
40
+ */
41
+ createTemplate(templateData: {
42
+ name: string;
43
+ subject: string;
44
+ htmlContent: string;
45
+ textContent?: string;
46
+ }): Promise<string>;
47
+ /**
48
+ * Send an email using a SendGrid template
49
+ */
50
+ sendTemplateEmail(templateId: string, toEmail: string, templateData: Record<string, any>, toName?: string): Promise<SendResult>;
51
+ /**
52
+ * Test the SendGrid connection
53
+ */
54
+ testConnection(): Promise<boolean>;
55
+ /**
56
+ * Override configuration validation for SendGrid
57
+ */
58
+ validateConfiguration(): {
59
+ isValid: boolean;
60
+ errors: string[];
61
+ warnings: string[];
62
+ };
63
+ /**
64
+ * Make API request to SendGrid
65
+ */
66
+ private makeApiRequest;
67
+ /**
68
+ * Verify webhook signature
69
+ */
70
+ private verifyWebhookSignature;
71
+ /**
72
+ * Map SendGrid status to our status enum
73
+ */
74
+ private mapSendGridStatus;
75
+ /**
76
+ * Generate a message ID for tracking
77
+ */
78
+ private generateMessageId;
79
+ }
80
+ //# sourceMappingURL=sendgrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendgrid.d.ts","sourceRoot":"","sources":["../../src/providers/sendgrid.ts"],"names":[],"mappings":"AAQA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA0BvG,qBAAa,gBAAiB,SAAQ,aAAa;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiC;gBAEpC,MAAM,EAAE,mBAAmB;IAUvC;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAqHzD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAW9D;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAuC1E;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiC9E;;OAEG;IACM,eAAe;;;;;;;;;IAYxB;;OAEG;IACY,cAAc,CAAC,YAAY,EAAE;QAC1C,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmCnB;;OAEG;IACY,iBAAiB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC;IAoDtB;;OAEG;IACY,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAWjD;;OAEG;IACM,qBAAqB;;;;;IAmB9B;;OAEG;YACW,cAAc;IAwB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}