@dbx-tools/email 0.6.63 → 0.6.64
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/README.md +19 -3
- package/lib/src/outbox.d.ts +2 -1
- package/lib/src/outbox.js +4 -2
- package/lib/src/transport.d.ts +6 -0
- package/lib/src/transport.js +7 -2
- package/package.json +4 -4
- package/src/outbox.ts +4 -1
- package/src/transport.ts +12 -1
package/README.md
CHANGED
|
@@ -131,6 +131,21 @@ tools, so every path shares one connection pool, one sender policy, and one set
|
|
|
131
131
|
of caps. A third argument accepts an `AbortSignal` when the caller wants to stop
|
|
132
132
|
waiting on SMTP.
|
|
133
133
|
|
|
134
|
+
### Control the visible heading
|
|
135
|
+
|
|
136
|
+
The HTML card normally repeats the transport subject as its heading. Set
|
|
137
|
+
`heading` when the subject contains notification-specific context that should not
|
|
138
|
+
be repeated inside the opened message:
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
await transport.sendEmail(message, from, undefined, {
|
|
142
|
+
heading: "Verification code",
|
|
143
|
+
});
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
This keeps a code-bearing subject useful in inboxes and notifications while the
|
|
147
|
+
HTML body presents the code once.
|
|
148
|
+
|
|
134
149
|
### Control the plain-text part
|
|
135
150
|
|
|
136
151
|
By default both MIME alternatives are rendered from one React Email tree, so the
|
|
@@ -375,8 +390,9 @@ const path = await outbox.writeOutboxEmail(message, "bot@example.com", "tmp/emai
|
|
|
375
390
|
|
|
376
391
|
Outbox files are HTML previews with metadata in the header, written to
|
|
377
392
|
`<dir>/<from>/<timestamp>-<subject-slug>.html`. A fourth argument accepts an
|
|
378
|
-
`EmailBrand
|
|
379
|
-
|
|
393
|
+
`EmailBrand`; a fifth accepts the same `heading` and `preview` presentation used
|
|
394
|
+
by the transport. Attachments are listed in the preview, but attachment bytes
|
|
395
|
+
are not copied to disk.
|
|
380
396
|
|
|
381
397
|
## Limits
|
|
382
398
|
|
|
@@ -401,7 +417,7 @@ handed to SMTP. The constants and the plugin's interceptor settings live in the
|
|
|
401
417
|
`SEND_EMAIL_DESCRIPTION`.
|
|
402
418
|
- `transport` - shared runtime, `getEmailRuntime()`, `resetEmailRuntime()`,
|
|
403
419
|
`verifyEmailTransport()`, `sendEmail()`, its `SendEmailOptions` (an explicit
|
|
404
|
-
`text/plain` alternative and
|
|
420
|
+
HTML `heading`, `text/plain` alternative, and `preview` preheader), and the executor slot
|
|
405
421
|
(`setEmailExecutor()`, `executeWrite()`) that puts every send on AppKit's
|
|
406
422
|
interceptor chain.
|
|
407
423
|
- `config` - SMTP/outbox config types, sender policy, JSON schema, and
|
package/lib/src/outbox.d.ts
CHANGED
|
@@ -14,9 +14,10 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import type { EmailMessage } from "@dbx-tools/shared-email";
|
|
16
16
|
import type { EmailBrand } from "./brand.ts";
|
|
17
|
+
import { type EmailHtmlOptions } from "./email-html.ts";
|
|
17
18
|
/**
|
|
18
19
|
* Write one message as HTML under `<dir>/<from>/` and return the
|
|
19
20
|
* absolute path. The per-sender folder mirrors the SMTP `From`, so test
|
|
20
21
|
* output groups by who the message would have been sent as.
|
|
21
22
|
*/
|
|
22
|
-
export declare function writeOutboxEmail(message: EmailMessage, from: string, dir: string, brand?: EmailBrand): Promise<string>;
|
|
23
|
+
export declare function writeOutboxEmail(message: EmailMessage, from: string, dir: string, brand?: EmailBrand, presentation?: Pick<EmailHtmlOptions, "heading" | "preview">): Promise<string>;
|
package/lib/src/outbox.js
CHANGED
|
@@ -43,7 +43,7 @@ function headerRows(message, from) {
|
|
|
43
43
|
* absolute path. The per-sender folder mirrors the SMTP `From`, so test
|
|
44
44
|
* output groups by who the message would have been sent as.
|
|
45
45
|
*/
|
|
46
|
-
export async function writeOutboxEmail(message, from, dir, brand) {
|
|
46
|
+
export async function writeOutboxEmail(message, from, dir, brand, presentation) {
|
|
47
47
|
const folder = resolve(dir, from);
|
|
48
48
|
await mkdir(folder, { recursive: true });
|
|
49
49
|
const path = join(folder, `${Date.now()}-${subjectSlug(message.subject)}.html`);
|
|
@@ -53,8 +53,10 @@ export async function writeOutboxEmail(message, from, dir, brand) {
|
|
|
53
53
|
body: message.body,
|
|
54
54
|
footer: "Local outbox preview - written to disk, not sent (no SMTP credentials configured).",
|
|
55
55
|
...(brand ? { brand } : {}),
|
|
56
|
+
...(presentation?.heading !== undefined ? { heading: presentation.heading } : {}),
|
|
57
|
+
...(presentation?.preview !== undefined ? { preview: presentation.preview } : {}),
|
|
56
58
|
});
|
|
57
59
|
await writeFile(path, html, "utf8");
|
|
58
60
|
return path;
|
|
59
61
|
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0Ym94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL291dGJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsT0FBTyxFQUFFLGVBQWUsRUFBeUIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RTs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUVuQyw2REFBNkQ7QUFDN0QsU0FBUyxXQUFXLENBQUMsT0FBZTtJQUNsQyxPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQztBQUM5RixDQUFDO0FBRUQsa0VBQWtFO0FBQ2xFLFNBQVMsVUFBVSxDQUFDLE9BQXFCLEVBQUUsSUFBWTtJQUNyRCxNQUFNLElBQUksR0FBaUQ7UUFDekQsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2QsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUM1QixDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0tBQ25DLENBQUM7SUFDRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQTJCLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLE9BQXFCLEVBQ3JCLElBQVksRUFDWixHQUFXLEVBQ1gsS0FBa0IsRUFDbEIsWUFBNEQ7SUFFNUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sSUFBSSxHQUFHLE1BQU0sZUFBZSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7UUFDbEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLE1BQU0sRUFBRSxvRkFBb0Y7UUFDNUYsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakYsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNsRixDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmlsZXN5c3RlbSBvdXRib3ggZm9yIHRoZSBuby1TTVRQIGZhbGxiYWNrOiB7QGxpbmsgd3JpdGVPdXRib3hFbWFpbH1cbiAqIHBlcnNpc3RzIG9uZSBkcmFmdGVkIG1lc3NhZ2UgYXMgYSBzdGFuZGFsb25lIEhUTUwgZmlsZSB1bmRlclxuICogYDxkaXI+Lzxmcm9tPi88dGltZXN0YW1wPi08c3ViamVjdC1zbHVnPi5odG1sYCBpbnN0ZWFkIG9mIHNlbmRpbmcgaXQuXG4gKiBUaGlzIGxldHMgdGhlIGFwcHJvdmFsIGZsb3cgYW5kIGFnZW50cyBiZSBleGVyY2lzZWQgZW5kLXRvLWVuZCB3aXRoXG4gKiB6ZXJvIGVtYWlsIGNvbmZpZ3VyYXRpb24gLSBvcGVuIHRoZSBmaWxlIGluIGEgYnJvd3NlciB0byBzZWUgZXhhY3RseVxuICogd2hhdCB3b3VsZCBoYXZlIGdvbmUgb3V0ICh0aGUgSFRNTCBtYXRjaGVzIHRoZSBTTVRQIHNlbmQsIGhlYWRlcnNcbiAqIHRhYmxlIGFzaWRlKS4gVGhlIGJvZHkgaXMgcmVuZGVyZWQgKyBzdHlsZS1pbmxpbmVkIGJ5XG4gKiB7QGxpbmsgcmVuZGVyRW1haWxIdG1sfS4gQXR0YWNobWVudHMgYXJlIGxpc3RlZCBieSBmaWxlbmFtZSBpbiB0aGVcbiAqIGhlYWRlciB0YWJsZSBidXQgbm90IHdyaXR0ZW4gdG8gZGlzayAtIHRoZSBvdXRib3ggcHJldmlld3MgdGhlXG4gKiBlbnZlbG9wZSwgaXQgZG9lc24ndCByZXByb2R1Y2UgdGhlIHdpcmUgcGF5bG9hZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRW1haWxNZXNzYWdlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWVtYWlsXCI7XG5pbXBvcnQgdHlwZSB7IEVtYWlsQnJhbmQgfSBmcm9tIFwiLi9icmFuZC50c1wiO1xuaW1wb3J0IHsgcmVuZGVyRW1haWxIdG1sLCB0eXBlIEVtYWlsSHRtbE9wdGlvbnMgfSBmcm9tIFwiLi9lbWFpbC1odG1sLnRzXCI7XG5cbi8qKlxuICogTG9uZ2VzdCBzdWJqZWN0IHNsdWcga2VwdCBpbiBhbiBvdXRib3ggZmlsZSBuYW1lLCBsZWF2aW5nIHJvb20gZm9yIHRoZVxuICogdGltZXN0YW1wIHByZWZpeCBhbmQgZXh0ZW5zaW9uIGluc2lkZSBjb21tb24gZmlsZXN5c3RlbSBuYW1lIGxpbWl0cy5cbiAqL1xuY29uc3QgU1VCSkVDVF9TTFVHX01BWF9MRU5HVEggPSA0ODtcblxuLyoqIEZpbGVzeXN0ZW0tc2FmZSBzbHVnIG9mIHRoZSBzdWJqZWN0IGZvciB0aGUgZmlsZSBuYW1lLiAqL1xuZnVuY3Rpb24gc3ViamVjdFNsdWcoc3ViamVjdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZy50b1NsdWdXaXRoT3B0aW9ucyh7IG1heExlbmd0aDogU1VCSkVDVF9TTFVHX01BWF9MRU5HVEggfSwgc3ViamVjdCkgfHwgXCJlbWFpbFwiO1xufVxuXG4vKiogVGhlIGVudmVsb3BlIHJvd3Mgc2hvd24gYWJvdmUgdGhlIGJvZHkgaW4gdGhlIHByZXZpZXcgZmlsZS4gKi9cbmZ1bmN0aW9uIGhlYWRlclJvd3MobWVzc2FnZTogRW1haWxNZXNzYWdlLCBmcm9tOiBzdHJpbmcpOiBBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IHJvd3M6IEFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF0+ID0gW1xuICAgIFtcIkZyb21cIiwgZnJvbV0sXG4gICAgW1wiVG9cIiwgbWVzc2FnZS50by5qb2luKFwiLCBcIildLFxuICAgIFtcIkNjXCIsIG1lc3NhZ2UuY2M/LmpvaW4oXCIsIFwiKV0sXG4gICAgW1wiQmNjXCIsIG1lc3NhZ2UuYmNjPy5qb2luKFwiLCBcIildLFxuICAgIFtcIlN1YmplY3RcIiwgbWVzc2FnZS5zdWJqZWN0XSxcbiAgICBbXCJBdHRhY2htZW50c1wiLCBtZXNzYWdlLmF0dGFjaG1lbnRzPy5tYXAoKGF0dCkgPT4gYXR0LmZpbGVuYW1lKS5qb2luKFwiLCBcIildLFxuICAgIFtcIkRhdGVcIiwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpXSxcbiAgXTtcbiAgcmV0dXJuIHJvd3MuZmlsdGVyKChyb3cpOiByb3cgaXMgW3N0cmluZywgc3RyaW5nXSA9PiBCb29sZWFuKHJvd1sxXSkpO1xufVxuXG4vKipcbiAqIFdyaXRlIG9uZSBtZXNzYWdlIGFzIEhUTUwgdW5kZXIgYDxkaXI+Lzxmcm9tPi9gIGFuZCByZXR1cm4gdGhlXG4gKiBhYnNvbHV0ZSBwYXRoLiBUaGUgcGVyLXNlbmRlciBmb2xkZXIgbWlycm9ycyB0aGUgU01UUCBgRnJvbWAsIHNvIHRlc3RcbiAqIG91dHB1dCBncm91cHMgYnkgd2hvIHRoZSBtZXNzYWdlIHdvdWxkIGhhdmUgYmVlbiBzZW50IGFzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVPdXRib3hFbWFpbChcbiAgbWVzc2FnZTogRW1haWxNZXNzYWdlLFxuICBmcm9tOiBzdHJpbmcsXG4gIGRpcjogc3RyaW5nLFxuICBicmFuZD86IEVtYWlsQnJhbmQsXG4gIHByZXNlbnRhdGlvbj86IFBpY2s8RW1haWxIdG1sT3B0aW9ucywgXCJoZWFkaW5nXCIgfCBcInByZXZpZXdcIj4sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmb2xkZXIgPSByZXNvbHZlKGRpciwgZnJvbSk7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHBhdGggPSBqb2luKGZvbGRlciwgYCR7RGF0ZS5ub3coKX0tJHtzdWJqZWN0U2x1ZyhtZXNzYWdlLnN1YmplY3QpfS5odG1sYCk7XG4gIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJFbWFpbEh0bWwoe1xuICAgIHN1YmplY3Q6IG1lc3NhZ2Uuc3ViamVjdCxcbiAgICBoZWFkZXJzOiBoZWFkZXJSb3dzKG1lc3NhZ2UsIGZyb20pLFxuICAgIGJvZHk6IG1lc3NhZ2UuYm9keSxcbiAgICBmb290ZXI6IFwiTG9jYWwgb3V0Ym94IHByZXZpZXcgLSB3cml0dGVuIHRvIGRpc2ssIG5vdCBzZW50IChubyBTTVRQIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQpLlwiLFxuICAgIC4uLihicmFuZCA/IHsgYnJhbmQgfSA6IHt9KSxcbiAgICAuLi4ocHJlc2VudGF0aW9uPy5oZWFkaW5nICE9PSB1bmRlZmluZWQgPyB7IGhlYWRpbmc6IHByZXNlbnRhdGlvbi5oZWFkaW5nIH0gOiB7fSksXG4gICAgLi4uKHByZXNlbnRhdGlvbj8ucHJldmlldyAhPT0gdW5kZWZpbmVkID8geyBwcmV2aWV3OiBwcmVzZW50YXRpb24ucHJldmlldyB9IDoge30pLFxuICB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIGh0bWwsIFwidXRmOFwiKTtcbiAgcmV0dXJuIHBhdGg7XG59XG4iXX0=
|
package/lib/src/transport.d.ts
CHANGED
|
@@ -93,6 +93,12 @@ export declare function verifyEmailTransport(transporter: Transporter | undefine
|
|
|
93
93
|
* describe how a message is DELIVERED, so they are the caller's to supply.
|
|
94
94
|
*/
|
|
95
95
|
export interface SendEmailOptions {
|
|
96
|
+
/**
|
|
97
|
+
* Visible heading inside the branded HTML card. Defaults to the message
|
|
98
|
+
* subject. Use this when the transport subject carries notification-specific
|
|
99
|
+
* details that would be noisy if repeated inside the opened email.
|
|
100
|
+
*/
|
|
101
|
+
heading?: string;
|
|
96
102
|
/**
|
|
97
103
|
* An explicit `text/plain` alternative, replacing the one generated from the
|
|
98
104
|
* React Email tree. The HTML part is untouched, so the recipient still gets the
|
package/lib/src/transport.js
CHANGED
|
@@ -242,7 +242,10 @@ async function dispatch(message, from, signal, options) {
|
|
|
242
242
|
const recipient = recipientEcho(message.to);
|
|
243
243
|
signal?.throwIfAborted();
|
|
244
244
|
if (config.mode === "file") {
|
|
245
|
-
const path = await writeOutboxEmail(message, from, config.outDir, config.brand
|
|
245
|
+
const path = await writeOutboxEmail(message, from, config.outDir, config.brand, {
|
|
246
|
+
...(options?.heading !== undefined ? { heading: options.heading } : {}),
|
|
247
|
+
...(options?.preview !== undefined ? { preview: options.preview } : {}),
|
|
248
|
+
});
|
|
246
249
|
return { sent: true, recipient, from, messageId: path };
|
|
247
250
|
}
|
|
248
251
|
if (!transporter) {
|
|
@@ -253,6 +256,8 @@ async function dispatch(message, from, signal, options) {
|
|
|
253
256
|
subject: message.subject,
|
|
254
257
|
body: message.body,
|
|
255
258
|
brand: config.brand,
|
|
259
|
+
...(options?.heading !== undefined ? { heading: options.heading } : {}),
|
|
260
|
+
...(options?.preview !== undefined ? { preview: options.preview } : {}),
|
|
256
261
|
});
|
|
257
262
|
const info = await abortable(transporter.sendMail({
|
|
258
263
|
from,
|
|
@@ -298,4 +303,4 @@ export async function sendEmail(message, from, signal, options) {
|
|
|
298
303
|
assertSenderAllowed(from, getEmailRuntime().config.allowedSenders);
|
|
299
304
|
return executeWrite("send", EMAIL_SEND_SETTINGS, (executeSignal) => dispatch(message, from, executeSignal, options), signal);
|
|
300
305
|
}
|
|
301
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGVBQWUsR0FFaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXhELE9BQU8sVUFBc0QsTUFBTSxZQUFZLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFvRCxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLGNBQWMsR0FFZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFvQjdDOzs7O0dBSUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsY0FBYyxFQUEwQixDQUFDO0FBRXpFLElBQUksT0FBaUMsQ0FBQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsU0FBNkI7SUFDM0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsT0FBTyxHQUFHO1lBQ1IsTUFBTTtZQUNOLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLEdBQUcsQ0FBQyxNQUFN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QyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RFLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN4QyxDQUFDLEVBQ0YsTUFBTSxDQUNQLENBQUM7SUFDRixPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUk7UUFDVixTQUFTO1FBQ1QsSUFBSTtRQUNKLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN6RCxDQUFDO0FBQ0osQ0FBQztBQXlDRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsU0FBUyxDQUM3QixPQUFxQixFQUNyQixJQUFZLEVBQ1osTUFBb0IsRUFDcEIsT0FBMEI7SUFFMUIsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLG1CQUFtQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkUsT0FBTyxZQUFZLENBQ2pCLE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsRUFDbEUsTUFBTSxDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgZW1haWwgcnVudGltZTogYSBsYXppbHktYnVpbHQsIHByb2Nlc3Mtd2lkZSBkaXNwYXRjaGVyIHBsdXMgaXRzXG4gKiByZXNvbHZlZCBjb25maWcsIGFuZCB7QGxpbmsgc2VuZEVtYWlsfSB3aGljaCBzZW5kcyBvbmVcbiAqIHtAbGluayBFbWFpbE1lc3NhZ2V9IHRocm91Z2ggaXQuIEluIFNNVFAgbW9kZSB0aGUgcnVudGltZSBob2xkcyBhXG4gKiBtZW1vaXplZCBub2RlbWFpbGVyIHRyYW5zcG9ydCAoc2hhcmVkIGJ5IHRoZSBwbHVnaW4ncyBzZXR1cCBhbmQgdGhlXG4gKiBhZ2VudCB0b29sLCBzbyB0aGV5IHJldXNlIG9uZSBjb25uZWN0aW9uIHBvb2wpOyBpbiBmaWxlL291dGJveCBtb2RlIGl0XG4gKiBob2xkcyBubyB0cmFuc3BvcnQgYW5kIHtAbGluayBzZW5kRW1haWx9IHdyaXRlcyBIVE1MIHRvIGRpc2sgaW5zdGVhZC5cbiAqIFRoZSBmaXJzdCBjYWxsZXIgKG5vcm1hbGx5IHRoZSBwbHVnaW4gYXQgc2V0dXApIHByaW1lcyBpdCB3aXRoIHRoZVxuICogcGx1Z2luJ3MgY29uZmlnOyBsYXRlciBjYWxsZXJzIHJldXNlIGl0LlxuICpcbiAqIFRoZSBydW50aW1lIGFsc28gY2FycmllcyB0aGUge0BsaW5rIEVtYWlsRXhlY3V0b3J9IGV2ZXJ5IG91dGJvdW5kIHNlbmQgcnVuc1xuICogdGhyb3VnaC4gVGhlIHBsdWdpbiBpbnN0YWxscyBpdHMgb3duIGBleGVjdXRlKClgIHRoZXJlIGF0IHNldHVwLCB3aGljaCBpc1xuICogaG93IHRoZSBNYXN0cmEgdG9vbCAtIGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBubyBwbHVnaW4gaW5zdGFuY2UgaW4gc2NvcGUgLVxuICogc3RpbGwgZ2V0cyBBcHBLaXQncyByZXRyeSAvIHRpbWVvdXQgLyB0ZWxlbWV0cnkgY2hhaW4uIFdpdGhvdXQgYSByZWdpc3RlcmVkXG4gKiBwbHVnaW4gKGEgZGlyZWN0IGNhbGwgZnJvbSBhIHNjcmlwdCBvciBhIHRlc3QpIHRoZSBzZW5kIHN0aWxsIHJ1bnMsIGp1c3RcbiAqIHdpdGhvdXQgaW50ZXJjZXB0b3JzLlxuICpcbiAqIEV2ZXJ5IGVudHJ5IHBvaW50IHRha2VzIGFuIG9wdGlvbmFsIHtAbGluayBBYm9ydFNpZ25hbH0gc28gdGhlIHBsdWdpbidzXG4gKiBgZXhlY3V0ZSgpYCB0aW1lb3V0IGFuZCBhIGNsaWVudCBkaXNjb25uZWN0IGJvdGggc3RvcCB0aGUgY2FsbGVyIHdhaXRpbmdcbiAqIG9uIFNNVFAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgdHlwZSBFeGVjdXRpb25SZXN1bHQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGV4ZWN1dGlvbiwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRW1haWxBdHRhY2htZW50LCBFbWFpbE1lc3NhZ2UsIEVtYWlsUmVzdWx0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWVtYWlsXCI7XG5pbXBvcnQgbm9kZW1haWxlciwgeyB0eXBlIFNlbmRNYWlsT3B0aW9ucywgdHlwZSBUcmFuc3BvcnRlciB9IGZyb20gXCJub2RlbWFpbGVyXCI7XG5pbXBvcnQgeyByZXNvbHZlRW1haWxDb25maWcsIHR5cGUgRW1haWxQbHVnaW5Db25maWcsIHR5cGUgUmVzb2x2ZWRFbWFpbENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgRU1BSUxfU0VORF9TRVRUSU5HUyxcbiAgTUFYX0FUVEFDSE1FTlRfQllURVMsXG4gIE1BWF9BVFRBQ0hNRU5UX0NPVU5ULFxuICBNQVhfQVRUQUNITUVOVFNfVE9UQUxfQllURVMsXG4gIE1BWF9CT0RZX0NIQVJTLFxuICB0eXBlIEVtYWlsRXhlY3V0aW9uU2V0dGluZ3MsXG59IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5pbXBvcnQgeyByZW5kZXJFbWFpbCB9IGZyb20gXCIuL2VtYWlsLWh0bWwudHNcIjtcbmltcG9ydCB7IHdyaXRlT3V0Ym94RW1haWwgfSBmcm9tIFwiLi9vdXRib3gudHNcIjtcbmltcG9ydCB7IGFzc2VydFNlbmRlckFsbG93ZWQgfSBmcm9tIFwiLi9zZW5kZXIudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImVtYWlsL3RyYW5zcG9ydFwiKTtcblxuLyoqXG4gKiBSdW5zIG9uZSBvdXRib3VuZCBzZW5kIHRocm91Z2ggQXBwS2l0J3MgaW50ZXJjZXB0b3IgY2hhaW4uIE1hdGNoZXNcbiAqIGBQbHVnaW4uZXhlY3V0ZSgpYCwgd2hpY2ggbmV2ZXIgdGhyb3dzOiBhIGZhaWx1cmUgY29tZXMgYmFjayBhc1xuICogYHsgb2s6IGZhbHNlIH1gLlxuICovXG5leHBvcnQgdHlwZSBFbWFpbEV4ZWN1dG9yID0gPFQ+KFxuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICBzZXR0aW5nczogRW1haWxFeGVjdXRpb25TZXR0aW5ncyxcbikgPT4gUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8VD4+O1xuXG4vKiogVGhlIHNoYXJlZCBkaXNwYXRjaGVyLCBpdHMgcmVzb2x2ZWQgY29uZmlnLCBhbmQgdGhlIHNlbmQgZXhlY3V0b3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsUnVudGltZSB7XG4gIC8qKiBQcmVzZW50IG9ubHkgaW4gU01UUCBtb2RlLiAqL1xuICB0cmFuc3BvcnRlcj86IFRyYW5zcG9ydGVyO1xuICBjb25maWc6IFJlc29sdmVkRW1haWxDb25maWc7XG4gIGV4ZWN1dGU6IEVtYWlsRXhlY3V0b3I7XG59XG5cbi8qKlxuICogRXhlY3V0b3IgdXNlZCB1bnRpbCAob3IgdW5sZXNzKSB0aGUgcGx1Z2luIGluc3RhbGxzIGl0cyBvd246IHJ1biB0aGUgc2VuZFxuICogZGlyZWN0bHksIG1hcHBpbmcgYSB0aHJvdyBvbnRvIHRoZSBzYW1lIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IHNoYXBlIHNvXG4gKiBjYWxsIHNpdGVzIGJyYW5jaCBvbiBgb2tgIGVpdGhlciB3YXkuXG4gKi9cbmNvbnN0IGRpcmVjdEV4ZWN1dGUgPSBleGVjdXRpb24uZGlyZWN0RXhlY3V0b3I8RW1haWxFeGVjdXRpb25TZXR0aW5ncz4oKTtcblxubGV0IHJ1bnRpbWU6IEVtYWlsUnVudGltZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHNoYXJlZCBydW50aW1lLCBidWlsZGluZyBpdCBvbiBmaXJzdCB1c2UgYnkgcmVzb2x2aW5nXG4gKiBgb3ZlcnJpZGVzYCBvdmVyIHRoZSBlbnZpcm9ubWVudCAoYFNNVFBfSE9TVGAsIGBTTVRQX1BPUlRgLFxuICogYFNNVFBfU0VDVVJFYCwgYFNNVFBfVVNFUmAsIGBTTVRQX1BBU1NXT1JEYCwgYEVNQUlMX0RPTUFJTmAsXG4gKiBgRU1BSUxfRlJPTWAsIGBFTUFJTF9BTExPV0VEX1NFTkRFUlNgLCBgRU1BSUxfU0VOREVSX1BPTElDWWAsXG4gKiBgRU1BSUxfT1VUQk9YX01PREVgLCBgRU1BSUxfT1VUQk9YX0RJUmApIHRocm91Z2hcbiAqIHtAbGluayByZXNvbHZlRW1haWxDb25maWd9LiBXaXRoIFNNVFAgY3JlZGVudGlhbHMgcHJlc2VudCBpdCBob2xkcyBhXG4gKiBub2RlbWFpbGVyIHRyYW5zcG9ydCBhbmQgaXRzIGNvbm5lY3Rpb24gcG9vbDsgb3RoZXJ3aXNlIGl0IGlzIGluXG4gKiBmaWxlL291dGJveCBtb2RlIGFuZCBob2xkcyBub25lLlxuICpcbiAqIGBvdmVycmlkZXNgIGlzIHJlYWQgb25seSBvbiB0aGUgY2FsbCB0aGF0IGJ1aWxkcyB0aGUgcnVudGltZSwgc28gcHJpbWUgaXRcbiAqIGZyb20gdGhlIHBsdWdpbidzIGNvbmZpZyBhdCBzZXR1cDsgbGF0ZXIgY2FsbGVycyAodGhlIHRvb2wncyBgZXhlY3V0ZWAsXG4gKiB0aGUgc2VuZGVyLW9wdGlvbnMgcm91dGUpIHBhc3Mgbm90aGluZyBhbmQgZ2V0IHRoZSBzYW1lIGluc3RhbmNlLiBUaHJvd3NcbiAqIHdoYXRldmVyIHtAbGluayByZXNvbHZlRW1haWxDb25maWd9IHRocm93cyBmb3IgYW4gdW51c2FibGUgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVtYWlsUnVudGltZShvdmVycmlkZXM/OiBFbWFpbFBsdWdpbkNvbmZpZyk6IEVtYWlsUnVudGltZSB7XG4gIGlmICghcnVudGltZSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVFbWFpbENvbmZpZyhvdmVycmlkZXMpO1xuICAgIHJ1bnRpbWUgPSB7XG4gICAgICBjb25maWcsXG4gICAgICBleGVjdXRlOiBkaXJlY3RFeGVjdXRlLFxuICAgICAgLi4uKGNvbmZpZy5tb2RlID09PSBcInNtdHBcIlxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHRyYW5zcG9ydGVyOiBub2RlbWFpbGVyLmNyZWF0ZVRyYW5zcG9ydCh7XG4gICAgICAgICAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgICAgICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgICAgICAgICAgc2VjdXJlOiBjb25maWcuc2VjdXJlLFxuICAgICAgICAgICAgICBhdXRoOiBjb25maWcuYXV0aCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcnVudGltZTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBleGVjdXRvciBvdXRib3VuZCBzZW5kcyBydW4gdGhyb3VnaC4gVGhlIHBsdWdpbiBjYWxscyB0aGlzIGF0XG4gKiBzZXR1cCB3aXRoIGl0cyBvd24gYGV4ZWN1dGUoKWA7IGEgc2Vjb25kIGNhbGwgcmVwbGFjZXMgdGhlIHByZXZpb3VzIG9uZSwgc29cbiAqIGEgcmUtcmVnaXN0ZXJlZCBwbHVnaW4gZG9lcyBub3QgbGVhdmUgdGhlIHRvb2xzIGJvdW5kIHRvIGEgZGVhZCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEVtYWlsRXhlY3V0b3IoZXhlY3V0ZTogRW1haWxFeGVjdXRvcik6IHZvaWQge1xuICBnZXRFbWFpbFJ1bnRpbWUoKS5leGVjdXRlID0gZXhlY3V0ZTtcbn1cblxuLyoqXG4gKiBEcm9wIHRoZSBtZW1vaXplZCBydW50aW1lLCBjbG9zaW5nIHRoZSBTTVRQIGNvbm5lY3Rpb24gcG9vbCwgc28gdGhlIG5leHRcbiAqIHtAbGluayBnZXRFbWFpbFJ1bnRpbWV9IHJlYnVpbGRzIGl0IGZyb20gZnJlc2ggY29uZmlnIGFuZCBzdG9wcyBjYWxsaW5nXG4gKiB0aHJvdWdoIGEgdG9ybi1kb3duIHBsdWdpbidzIGBleGVjdXRlKClgLiBJZGVtcG90ZW50LCBhbmQgdGhlIHBsdWdpbidzXG4gKiBgc2h1dGRvd24oKWAgaG9vay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0RW1haWxSdW50aW1lKCk6IHZvaWQge1xuICBydW50aW1lPy50cmFuc3BvcnRlcj8uY2xvc2UoKTtcbiAgcnVudGltZSA9IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSdW4gb25lIG5vbi1pZGVtcG90ZW50IHdyaXRlIHRocm91Z2ggdGhlIHNoYXJlZCBleGVjdXRvciBhbmQgdW53cmFwIGl0LlxuICpcbiAqIGBleGVjdXRlKClgIG5ldmVyIHRocm93cywgc28gYSBmYWlsZWQgc2VuZCBhcnJpdmVzIGFzIGB7IG9rOiBmYWxzZSB9YCB3aXRoIGFcbiAqIHN0YXR1cyB0aGUgaW50ZXJjZXB0b3JzIGFscmVhZHkgc2FuaXRpemVkOyBpdCBpcyBsb2dnZWQgaGVyZSBhbmQgcmUtcmFpc2VkXG4gKiBhcyBhIHN0YWJsZSB7QGxpbmsgRXhlY3V0aW9uRXJyb3J9IHNvIGFuIHVwc3RyZWFtIG1lc3NhZ2UgbmV2ZXIgYmVjb21lcyB0aGVcbiAqIGNhbGxlcidzIGVycm9yIHRleHQuIGBzaWduYWxgIGlzIHRoZSBjYWxsZXIncyBvd24gY2FuY2VsbGF0aW9uIChhbiBhZ2VudFxuICogcnVuLCBhIHJlcXVlc3QgdGVhcmRvd24pOyBpdCBpcyBtZXJnZWQgd2l0aCB0aGUgc2lnbmFsIHRoZSB0aW1lb3V0XG4gKiBpbnRlcmNlcHRvciBzdXBwbGllcyBzbyBlaXRoZXIgb25lIHVud2luZHMgdGhlIEkvTy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVXcml0ZTxUPihcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHNldHRpbmdzOiBFbWFpbEV4ZWN1dGlvblNldHRpbmdzLFxuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCB7IGV4ZWN1dGUgfSA9IGdldEVtYWlsUnVudGltZSgpO1xuICByZXR1cm4gZXhlY3V0aW9uLnJ1bih7XG4gICAgb3BlcmF0aW9uLFxuICAgIHNldHRpbmdzLFxuICAgIGV4ZWN1dGUsXG4gICAgZm4sXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbGVkOiBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCxcbiAgICBmYWlsZWQ6IChmYWlsdXJlKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcImV4ZWN1dGlvbi1mYWlsZWRcIiwge1xuICAgICAgICBvcGVyYXRpb246IGZhaWx1cmUub3BlcmF0aW9uLFxuICAgICAgICBzdGF0dXM6IGZhaWx1cmUuc3RhdHVzLFxuICAgICAgICBlcnJvcjogZmFpbHVyZS5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IEV4ZWN1dGlvbkVycm9yKGBlbWFpbDogJHtmYWlsdXJlLm9wZXJhdGlvbn0gZmFpbGVkYCwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogZmFpbHVyZS5vcGVyYXRpb24sIHN0YXR1czogZmFpbHVyZS5zdGF0dXMgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIE9wZW4gYW5kIHRlYXIgZG93biBvbmUgU01UUCBjb25uZWN0aW9uIHRvIHByb3ZlIHRoZSBob3N0LCBwb3J0LCBhbmRcbiAqIGNyZWRlbnRpYWxzIHdvcmsuIENhbGxlZCBhdCBwbHVnaW4gc2V0dXAgc28gYSBiYWQgcmVsYXkgc2hvd3MgdXAgaW4gdGhlXG4gKiBib290IGxvZ3MgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0IGFwcHJvdmVkIHNlbmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlFbWFpbFRyYW5zcG9ydChcbiAgdHJhbnNwb3J0ZXI6IFRyYW5zcG9ydGVyIHwgdW5kZWZpbmVkLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXRyYW5zcG9ydGVyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgICAgXCJTTVRQXCIsXG4gICAgICBcIlRoZSBydW50aW1lIHJlc29sdmVkIHRvIG91dGJveCBtb2RlLCBzbyB0aGVyZSBpcyBubyB0cmFuc3BvcnQgdG8gdmVyaWZ5LlwiLFxuICAgICk7XG4gIH1cbiAgYXdhaXQgYWJvcnRhYmxlKHRyYW5zcG9ydGVyLnZlcmlmeSgpLCBzaWduYWwpO1xufVxuXG4vKipcbiAqIFN0b3AgYXdhaXRpbmcgYHByb21pc2VgIGFzIHNvb24gYXMgYHNpZ25hbGAgYWJvcnRzLiBub2RlbWFpbGVyIGV4cG9zZXMgbm9cbiAqIGNhbmNlbGxhdGlvbiBob29rLCBzbyB0aGUgU01UUCBjb252ZXJzYXRpb24gaXRzZWxmIGZpbmlzaGVzIG9uIGl0cyBvd25cbiAqIGNvbm5lY3Rpb247IHdoYXQgdW53aW5kcyBpcyB0aGUgY2FsbGVyIGFuZCBldmVyeXRoaW5nIGRvd25zdHJlYW0gb2YgaXQuXG4gKi9cbmZ1bmN0aW9uIGFib3J0YWJsZTxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxUPiB7XG4gIGlmICghc2lnbmFsKSByZXR1cm4gcHJvbWlzZTtcbiAgc2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIC8vIFRoZSBsaXN0ZW5lciBpcyBkZXRhY2hlZCBvbmNlIHRoZSByYWNlIHNldHRsZXMgc28gYSBsb25nLWxpdmVkIHJ1biBzaWduYWxcbiAgLy8gZG9lcyBub3QgYWNjdW11bGF0ZSBvbmUgcGVyIHNlbmQuXG4gIGNvbnN0IGxpc3RlbmVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBhYm9ydGVkID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHJlamVjdChzaWduYWwucmVhc29uKSwge1xuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogbGlzdGVuZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbcHJvbWlzZSwgYWJvcnRlZF0pLmZpbmFsbHkoKCkgPT4gbGlzdGVuZXIuYWJvcnQoKSk7XG59XG5cbi8qKiBUaGUgY29tbWEtam9pbmVkIHJlY2lwaWVudCBzdHJpbmcgZWNob2VkIGJhY2sgaW4ge0BsaW5rIEVtYWlsUmVzdWx0fS4gKi9cbmZ1bmN0aW9uIHJlY2lwaWVudEVjaG8odG86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvLmpvaW4oXCIsIFwiKTtcbn1cblxuLyoqXG4gKiBOb2RlIGJ1ZmZlciBlbmNvZGluZ3MgYSB3aXJlIGF0dGFjaG1lbnQgbWF5IG5hbWUgZm9yIGl0cyBpbmxpbmUgYGNvbnRlbnRgLlxuICogQW55dGhpbmcgZWxzZSBpcyBtZWFzdXJlZCBhcyBVVEYtOCwgd2hpY2ggb3Zlci1jb3VudHMgcmF0aGVyIHRoYW4gbGV0dGluZ1xuICogYW4gdW5yZWNvZ25pemVkIGVuY29kaW5nIHNsaXAgcGFzdCB0aGUgc2l6ZSBjYXAuXG4gKi9cbmNvbnN0IENPTlRFTlRfRU5DT0RJTkdTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiYXNjaWlcIixcbiAgXCJiYXNlNjRcIixcbiAgXCJiYXNlNjR1cmxcIixcbiAgXCJiaW5hcnlcIixcbiAgXCJoZXhcIixcbiAgXCJsYXRpbjFcIixcbiAgXCJ1Y3MyXCIsXG4gIFwidWNzLTJcIixcbiAgXCJ1dGY4XCIsXG4gIFwidXRmLThcIixcbiAgXCJ1dGYxNmxlXCIsXG4gIFwidXRmLTE2bGVcIixcbl0pO1xuXG4vKipcbiAqIERlY29kZWQgYnl0ZSBzaXplIG9mIG9uZSBhdHRhY2htZW50J3MgaW5saW5lIGNvbnRlbnQuIEEgYHBhdGhgIGF0dGFjaG1lbnRcbiAqIGNvbnRyaWJ1dGVzIG5vdGhpbmc6IG5vZGVtYWlsZXIgc3RyZWFtcyBpdCwgc28gaXRzIGJ5dGVzIG5ldmVyIHNpdCBpbiB0aGlzXG4gKiBwcm9jZXNzIGFuZCBjYW5ub3QgYmUgbWVhc3VyZWQgaGVyZS5cbiAqL1xuZnVuY3Rpb24gYXR0YWNobWVudEJ5dGVzKGF0dGFjaG1lbnQ6IEVtYWlsQXR0YWNobWVudCk6IG51bWJlciB7XG4gIGNvbnN0IHsgY29udGVudCwgZW5jb2RpbmcgfSA9IGF0dGFjaG1lbnQ7XG4gIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBjb25zdCBkZWNsYXJlZCA9IGVuY29kaW5nPy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCByZXNvbHZlZCA9XG4gICAgZGVjbGFyZWQgJiYgQ09OVEVOVF9FTkNPRElOR1MuaGFzKGRlY2xhcmVkKSA/IChkZWNsYXJlZCBhcyBCdWZmZXJFbmNvZGluZykgOiBcInV0ZjhcIjtcbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbnRlbnQsIHJlc29sdmVkKTtcbn1cblxuLyoqXG4gKiBSZWplY3QgYSBtZXNzYWdlIHdob3NlIGJvZHkgb3IgYXR0YWNobWVudHMgZXhjZWVkIHRoZSBwbHVnaW4ncyBjYXBzLiBUaGVcbiAqIGJvZHkgYW5kIGF0dGFjaG1lbnQgbGlzdCBhcnJpdmUgZnJvbSBhIG1vZGVsLCBzbyB0aGV5IGFyZSB1bmJvdW5kZWQgdW50aWxcbiAqIHNvbWV0aGluZyBib3VuZHMgdGhlbTsgbW9zdCBTTVRQIHJlbGF5cyBhbHNvIHJlamVjdCBhbiBvdmVyc2l6ZWQgbWVzc2FnZVxuICogb25seSBhZnRlciB0aGUgd2hvbGUgcGF5bG9hZCBoYXMgYmVlbiB1cGxvYWRlZC5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TWVzc2FnZVdpdGhpbkNhcHMobWVzc2FnZTogRW1haWxNZXNzYWdlKTogdm9pZCB7XG4gIGlmIChtZXNzYWdlLmJvZHkubGVuZ3RoID4gTUFYX0JPRFlfQ0hBUlMpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgXCJib2R5XCIsXG4gICAgICBtZXNzYWdlLmJvZHkubGVuZ3RoLFxuICAgICAgYGF0IG1vc3QgJHtNQVhfQk9EWV9DSEFSU30gY2hhcmFjdGVyc2AsXG4gICAgKTtcbiAgfVxuICBjb25zdCBhdHRhY2htZW50cyA9IG1lc3NhZ2UuYXR0YWNobWVudHMgPz8gW107XG4gIGlmIChhdHRhY2htZW50cy5sZW5ndGggPiBNQVhfQVRUQUNITUVOVF9DT1VOVCkge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICBcImF0dGFjaG1lbnRzXCIsXG4gICAgICBhdHRhY2htZW50cy5sZW5ndGgsXG4gICAgICBgYXQgbW9zdCAke01BWF9BVFRBQ0hNRU5UX0NPVU5UfSBmaWxlc2AsXG4gICAgKTtcbiAgfVxuICBsZXQgdG90YWwgPSAwO1xuICBmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgYXR0YWNobWVudHMpIHtcbiAgICBjb25zdCBieXRlcyA9IGF0dGFjaG1lbnRCeXRlcyhhdHRhY2htZW50KTtcbiAgICBpZiAoYnl0ZXMgPiBNQVhfQVRUQUNITUVOVF9CWVRFUykge1xuICAgICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgICAgXCJhdHRhY2htZW50c1tdLmNvbnRlbnRcIixcbiAgICAgICAgYnl0ZXMsXG4gICAgICAgIGBhdCBtb3N0ICR7TUFYX0FUVEFDSE1FTlRfQllURVN9IGJ5dGVzIHBlciBmaWxlYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRvdGFsICs9IGJ5dGVzO1xuICB9XG4gIGlmICh0b3RhbCA+IE1BWF9BVFRBQ0hNRU5UU19UT1RBTF9CWVRFUykge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICBcImF0dGFjaG1lbnRzXCIsXG4gICAgICB0b3RhbCxcbiAgICAgIGBhdCBtb3N0ICR7TUFYX0FUVEFDSE1FTlRTX1RPVEFMX0JZVEVTfSBieXRlcyBhY3Jvc3MgYWxsIGZpbGVzYCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTWFwIHRoZSB3aXJlLWZvcm1hdCB7QGxpbmsgRW1haWxBdHRhY2htZW50fXMgb250byBub2RlbWFpbGVyJ3NcbiAqIGF0dGFjaG1lbnQgc2hhcGUsIGRyb3BwaW5nIHVuc2V0IG9wdGlvbmFsIGtleXMgc28gbm9kZW1haWxlciBhcHBsaWVzXG4gKiBpdHMgb3duIGRlZmF1bHRzICh1dGYtOCBlbmNvZGluZywgZmlsZW5hbWUtaW5mZXJyZWQgY29udGVudCB0eXBlKS4gVGhlXG4gKiB3aXJlIGZpZWxkcyBhcmUgYSBkZWxpYmVyYXRlIHN1YnNldCBvZiBub2RlbWFpbGVyJ3MsIHNvIHRoaXMgaXMgYVxuICogc3RyYWlnaHQgc3RydWN0dXJhbCBwYXNzLXRocm91Z2guXG4gKi9cbmZ1bmN0aW9uIHRvTWFpbEF0dGFjaG1lbnRzKFxuICBhdHRhY2htZW50czogRW1haWxBdHRhY2htZW50W10gfCB1bmRlZmluZWQsXG4pOiBTZW5kTWFpbE9wdGlvbnNbXCJhdHRhY2htZW50c1wiXSB7XG4gIGlmICghYXR0YWNobWVudHMgfHwgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYXR0YWNobWVudHMubWFwKChhdHQpID0+ICh7XG4gICAgZmlsZW5hbWU6IGF0dC5maWxlbmFtZSxcbiAgICAuLi4oYXR0LmNvbnRlbnQgIT09IHVuZGVmaW5lZCA/IHsgY29udGVudDogYXR0LmNvbnRlbnQgfSA6IHt9KSxcbiAgICAuLi4oYXR0LmVuY29kaW5nICE9PSB1bmRlZmluZWQgPyB7IGVuY29kaW5nOiBhdHQuZW5jb2RpbmcgfSA6IHt9KSxcbiAgICAuLi4oYXR0LnBhdGggIT09IHVuZGVmaW5lZCA/IHsgcGF0aDogYXR0LnBhdGggfSA6IHt9KSxcbiAgICAuLi4oYXR0LmNvbnRlbnRUeXBlICE9PSB1bmRlZmluZWQgPyB7IGNvbnRlbnRUeXBlOiBhdHQuY29udGVudFR5cGUgfSA6IHt9KSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIEhhbmQgb25lIGFscmVhZHktdmFsaWRhdGVkIG1lc3NhZ2UgdG8gU01UUCwgb3Igd3JpdGUgaXQgdG8gdGhlIG91dGJveCB3aGVuXG4gKiBubyBjcmVkZW50aWFscyBhcmUgY29uZmlndXJlZC4gVGhlIGhhbGYgb2YgYSBzZW5kIHRoYXQgcGVyZm9ybXMgSS9PLCBzbyBpdFxuICogaXMgd2hhdCBydW5zIGluc2lkZSB0aGUgaW50ZXJjZXB0b3IgY2hhaW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoKFxuICBtZXNzYWdlOiBFbWFpbE1lc3NhZ2UsXG4gIGZyb206IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIG9wdGlvbnM/OiBTZW5kRW1haWxPcHRpb25zLFxuKTogUHJvbWlzZTxFbWFpbFJlc3VsdD4ge1xuICBjb25zdCB7IGNvbmZpZywgdHJhbnNwb3J0ZXIgfSA9IGdldEVtYWlsUnVudGltZSgpO1xuICBjb25zdCByZWNpcGllbnQgPSByZWNpcGllbnRFY2hvKG1lc3NhZ2UudG8pO1xuICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKGNvbmZpZy5tb2RlID09PSBcImZpbGVcIikge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZU91dGJveEVtYWlsKG1lc3NhZ2UsIGZyb20sIGNvbmZpZy5vdXREaXIsIGNvbmZpZy5icmFuZCk7XG4gICAgcmV0dXJuIHsgc2VudDogdHJ1ZSwgcmVjaXBpZW50LCBmcm9tLCBtZXNzYWdlSWQ6IHBhdGggfTtcbiAgfVxuXG4gIGlmICghdHJhbnNwb3J0ZXIpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIlNNVFBcIixcbiAgICAgIFwiTm8gdHJhbnNwb3J0IHdhcyBidWlsdCBmb3IgdGhlIHJlc29sdmVkIGNvbmZpZ3VyYXRpb24uXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBhdHRhY2htZW50cyA9IHRvTWFpbEF0dGFjaG1lbnRzKG1lc3NhZ2UuYXR0YWNobWVudHMpO1xuICBjb25zdCByZW5kZXJlZCA9IGF3YWl0IHJlbmRlckVtYWlsKHtcbiAgICBzdWJqZWN0OiBtZXNzYWdlLnN1YmplY3QsXG4gICAgYm9keTogbWVzc2FnZS5ib2R5LFxuICAgIGJyYW5kOiBjb25maWcuYnJhbmQsXG4gIH0pO1xuICBjb25zdCBpbmZvID0gYXdhaXQgYWJvcnRhYmxlKFxuICAgIHRyYW5zcG9ydGVyLnNlbmRNYWlsKHtcbiAgICAgIGZyb20sXG4gICAgICB0bzogbWVzc2FnZS50byxcbiAgICAgIHN1YmplY3Q6IG1lc3NhZ2Uuc3ViamVjdCxcbiAgICAgIC8vIEEgY2FsbGVyLXN1cHBsaWVkIHBsYWluLXRleHQgcGFydCBXSU5TIG92ZXIgdGhlIGdlbmVyYXRlZCBvbmUuIEJvdGggcGFydHNcbiAgICAgIC8vIHN0aWxsIGNvbWUgZnJvbSB0aGUgc2FtZSBjb250ZW50OyB0aGlzIG9ubHkgbGV0cyBhIGNhbGxlciBjb250cm9sIHRoZVxuICAgICAgLy8gdGV4dCBhbHRlcm5hdGl2ZSdzIGV4YWN0IGxpbmUgbGF5b3V0LCB3aGljaCBzb21lIGNsaWVudHMgcGFyc2UgKHNlZVxuICAgICAgLy8gYFNlbmRFbWFpbE9wdGlvbnMudGV4dGApLlxuICAgICAgdGV4dDogb3B0aW9ucz8udGV4dCA/PyByZW5kZXJlZC50ZXh0LFxuICAgICAgaHRtbDogcmVuZGVyZWQuaHRtbCxcbiAgICAgIC4uLihtZXNzYWdlLmNjICYmIG1lc3NhZ2UuY2MubGVuZ3RoID4gMCA/IHsgY2M6IG1lc3NhZ2UuY2MgfSA6IHt9KSxcbiAgICAgIC4uLihtZXNzYWdlLmJjYyAmJiBtZXNzYWdlLmJjYy5sZW5ndGggPiAwID8geyBiY2M6IG1lc3NhZ2UuYmNjIH0gOiB7fSksXG4gICAgICAuLi4oYXR0YWNobWVudHMgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgfSksXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4ge1xuICAgIHNlbnQ6IHRydWUsXG4gICAgcmVjaXBpZW50LFxuICAgIGZyb20sXG4gICAgLi4uKGluZm8ubWVzc2FnZUlkID8geyBtZXNzYWdlSWQ6IGluZm8ubWVzc2FnZUlkIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogRGVsaXZlcnktdGltZSBvcHRpb25zIHRoYXQgYXJlIE5PVCBwYXJ0IG9mIHRoZSBtZXNzYWdlIGEgbW9kZWwgY29tcG9zZXMuXG4gKlxuICogRGVsaWJlcmF0ZWx5IHNlcGFyYXRlIGZyb20ge0BsaW5rIEVtYWlsTWVzc2FnZX06IHRoYXQgc2NoZW1hIGlzIHRoZSBhZ2VudFxuICogdG9vbCdzIGlucHV0LCBzbyBhbnl0aGluZyBhZGRlZCB0byBpdCBiZWNvbWVzIGEgZmllbGQgYSBtb2RlbCBjYW4gc2V0LiBUaGVzZVxuICogZGVzY3JpYmUgaG93IGEgbWVzc2FnZSBpcyBERUxJVkVSRUQsIHNvIHRoZXkgYXJlIHRoZSBjYWxsZXIncyB0byBzdXBwbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZEVtYWlsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBleHBsaWNpdCBgdGV4dC9wbGFpbmAgYWx0ZXJuYXRpdmUsIHJlcGxhY2luZyB0aGUgb25lIGdlbmVyYXRlZCBmcm9tIHRoZVxuICAgKiBSZWFjdCBFbWFpbCB0cmVlLiBUaGUgSFRNTCBwYXJ0IGlzIHVudG91Y2hlZCwgc28gdGhlIHJlY2lwaWVudCBzdGlsbCBnZXRzIHRoZVxuICAgKiBmdWxsIGJyYW5kZWQgdGVtcGxhdGUuXG4gICAqXG4gICAqIFRoaXMgZXhpc3RzIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCB0ZXh0IHBhcnQgaXMgYSBSRU5ERVJJTkcgb2YgdGhlIEhUTUw6IGl0XG4gICAqIGNhcnJpZXMgdGhlIGJyYW5kIGhlYWRlciBhbmQgZm9vdGVyLCBhbmQgaXQgdHVybnMgQ1NTIG1hcmdpbiBpbnRvIGJsYW5rXG4gICAqIGxpbmVzLiBUaGF0IGlzIGZpbmUgZm9yIHByb3NlIGFuZCB3cm9uZyBmb3IgY29udGVudCBhIG1hY2hpbmUgcGFyc2VzLiBBXG4gICAqIG9uZS10aW1lLWNvZGUgZW1haWwgaXMgdGhlIGNhc2UgaW4gcG9pbnQgLSBjbGllbnRzIGxvb2sgZm9yIHRoZSBjb2RlIG9uIHRoZVxuICAgKiBsaW5lIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwcm9tcHQsIGFuZCBhIHN0eWxlZCBgPGgyPmAgY29kZSBsYW5kcyB0d28gYmxhbmtcbiAgICogbGluZXMgYmVsb3cgaXQsIHNvIGF1dG9maWxsIHN0b3BzIGJlaW5nIG9mZmVyZWQgZXZlbiB0aG91Z2ggdGhlIEhUTUwgbG9va3NcbiAgICogcGVyZmVjdC4gU3VwcGx5aW5nIHRoZSB0ZXh0IHBhcnQgZGlyZWN0bHkga2VlcHMgdGhlIG5pY2UgdGVtcGxhdGUgQU5EIHRoZVxuICAgKiBsYXlvdXQgdGhvc2UgY2xpZW50cyBleHBlY3QuXG4gICAqXG4gICAqIEtlZXAgdGhlIHNhbWUgaW5mb3JtYXRpb24gaW4gYm90aCBwYXJ0czsgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGlzYWdyZWVzXG4gICAqIHdpdGggdGhlIEhUTUwgcmVhZHMgYXMgcGhpc2hpbmcgdG8gc3BhbSBmaWx0ZXJzLlxuICAgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqXG4gICAqIFByZWhlYWRlciB0ZXh0IGZvciB0aGUgSFRNTCBwYXJ0IC0gdGhlIHNuaXBwZXQgc2hvd24gYmVzaWRlIHRoZSBzdWJqZWN0IGluIGFuXG4gICAqIGluYm94IGxpc3QsIGFuZCB0aGUgYm9keSBvZiB0aGUgUFVTSCBOT1RJRklDQVRJT04gYSBtb2JpbGUgbWFpbCBhcHAgcG9zdHMuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzdWJqZWN0LlxuICAgKlxuICAgKiBEZWxpdmVyeS10aW1lIHJhdGhlciB0aGFuIHBhcnQgb2Yge0BsaW5rIEVtYWlsTWVzc2FnZX0gZm9yIHRoZSBzYW1lIHJlYXNvbiBhc1xuICAgKiBgdGV4dGA6IGl0IGlzIHByZXNlbnRhdGlvbiB0aGUgc2VuZGluZyBDT0RFIGNob29zZXMsIG5vdCBjb250ZW50IGEgbW9kZWxcbiAgICogY29tcG9zZXMuIFRoZSBvbmUtdGltZS1jb2RlIHBhdGggc2V0cyBpdCBzbyB0aGUgY29kZSBpdHNlbGYgcmlkZXMgaW4gdGhlXG4gICAqIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXMgdGhlIG9ubHkgdGV4dCBpT1MgYXV0b2ZpbGwgZ2V0cyB0byByZWFkLlxuICAgKi9cbiAgcHJldmlldz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZW5kIChTTVRQIG1vZGUpIG9yIHBlcnNpc3QgKGZpbGUvb3V0Ym94IG1vZGUpIG9uZSBtZXNzYWdlIGZyb20gdGhlXG4gKiByZXNvbHZlZCBgZnJvbWAgYWRkcmVzcy4gYHRvYCAoYW5kIG9wdGlvbmFsIGBjY2AgLyBgYmNjYCkgZWFjaCBhY2NlcHRcbiAqIG9uZSBvciBtb3JlIGFkZHJlc3NlcywgYW5kIGBhdHRhY2htZW50c2AgYXJlIGZvcndhcmRlZCBhcyBmaWxlcy4gVGhlXG4gKiBib2R5IGlzIHJlbmRlcmVkIGJ5IFJlYWN0IEVtYWlsIGludG8gbWF0Y2hpbmcgcGxhaW4tdGV4dCBhbmQgSFRNTCBNSU1FXG4gKiBhbHRlcm5hdGl2ZXMsIGFuZCB0aGUgb3V0Ym94IGVtYmVkcyB0aGVcbiAqIHJlbmRlcmVkIEhUTUwgaW4gYSBkb2N1bWVudC4gSW4gZmlsZSBtb2RlIHRoZSByZXR1cm5lZCBgbWVzc2FnZUlkYCBpc1xuICogdGhlIHBhdGggd3JpdHRlbi4gVGhyb3dzIHdoZW4gYHRvYCBjYXJyaWVzIG5vIHJlY2lwaWVudCwgd2hlbiB0aGUgYm9keVxuICogb3IgYXR0YWNobWVudHMgZXhjZWVkIHRoZSBwbHVnaW4ncyBjYXBzLCBvciB3aGVuIGBmcm9tYCBpcyBub3QgcGVybWl0dGVkXG4gKiBieSB0aGUgZWZmZWN0aXZlIHNlbmRlciBhbGxvdy1saXN0LlxuICpcbiAqIFRoZSByZWNpcGllbnQsIGNhcCwgYW5kIHNlbmRlciBjaGVja3MgcnVuIGJlZm9yZSB0aGUgaW50ZXJjZXB0b3IgY2hhaW4gc29cbiAqIHRoZWlyIHNwZWNpZmljIHN0YXR1cyBhbmQgYWN0aW9uYWJsZSBtZXNzYWdlIHJlYWNoIHRoZSBjYWxsZXIgaW5zdGVhZCBvZlxuICogdGhlIGNoYWluJ3Mgc3RhYmxlIGZhaWx1cmUgdGV4dC4gYHNpZ25hbGAgY2FuY2VscyB0aGUgc2VuZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRFbWFpbChcbiAgbWVzc2FnZTogRW1haWxNZXNzYWdlLFxuICBmcm9tOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICBvcHRpb25zPzogU2VuZEVtYWlsT3B0aW9ucyxcbik6IFByb21pc2U8RW1haWxSZXN1bHQ+IHtcbiAgaWYgKG1lc3NhZ2UudG8ubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLm1pc3NpbmdGaWVsZChcInRvXCIpO1xuICB9XG4gIGFzc2VydE1lc3NhZ2VXaXRoaW5DYXBzKG1lc3NhZ2UpO1xuICBhc3NlcnRTZW5kZXJBbGxvd2VkKGZyb20sIGdldEVtYWlsUnVudGltZSgpLmNvbmZpZy5hbGxvd2VkU2VuZGVycyk7XG4gIHJldHVybiBleGVjdXRlV3JpdGUoXG4gICAgXCJzZW5kXCIsXG4gICAgRU1BSUxfU0VORF9TRVRUSU5HUyxcbiAgICAoZXhlY3V0ZVNpZ25hbCkgPT4gZGlzcGF0Y2gobWVzc2FnZSwgZnJvbSwgZXhlY3V0ZVNpZ25hbCwgb3B0aW9ucyksXG4gICAgc2lnbmFsLFxuICApO1xufVxuIl19
|
|
306
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGVBQWUsR0FFaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXhELE9BQU8sVUFBc0QsTUFBTSxZQUFZLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFvRCxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLGNBQWMsR0FFZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFvQjdDOzs7O0dBSUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsY0FBYyxFQUEwQixDQUFDO0FBRXpFLElBQUksT0FBaUMsQ0FBQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsU0FBNkI7SUFDM0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsT0FBTyxHQUFHO1lBQ1IsTUFBTTtZQUNOLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLEdBQUcsQ0FBQyxNQUFN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SUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLG1CQUFtQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkUsT0FBTyxZQUFZLENBQ2pCLE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsRUFDbEUsTUFBTSxDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgZW1haWwgcnVudGltZTogYSBsYXppbHktYnVpbHQsIHByb2Nlc3Mtd2lkZSBkaXNwYXRjaGVyIHBsdXMgaXRzXG4gKiByZXNvbHZlZCBjb25maWcsIGFuZCB7QGxpbmsgc2VuZEVtYWlsfSB3aGljaCBzZW5kcyBvbmVcbiAqIHtAbGluayBFbWFpbE1lc3NhZ2V9IHRocm91Z2ggaXQuIEluIFNNVFAgbW9kZSB0aGUgcnVudGltZSBob2xkcyBhXG4gKiBtZW1vaXplZCBub2RlbWFpbGVyIHRyYW5zcG9ydCAoc2hhcmVkIGJ5IHRoZSBwbHVnaW4ncyBzZXR1cCBhbmQgdGhlXG4gKiBhZ2VudCB0b29sLCBzbyB0aGV5IHJldXNlIG9uZSBjb25uZWN0aW9uIHBvb2wpOyBpbiBmaWxlL291dGJveCBtb2RlIGl0XG4gKiBob2xkcyBubyB0cmFuc3BvcnQgYW5kIHtAbGluayBzZW5kRW1haWx9IHdyaXRlcyBIVE1MIHRvIGRpc2sgaW5zdGVhZC5cbiAqIFRoZSBmaXJzdCBjYWxsZXIgKG5vcm1hbGx5IHRoZSBwbHVnaW4gYXQgc2V0dXApIHByaW1lcyBpdCB3aXRoIHRoZVxuICogcGx1Z2luJ3MgY29uZmlnOyBsYXRlciBjYWxsZXJzIHJldXNlIGl0LlxuICpcbiAqIFRoZSBydW50aW1lIGFsc28gY2FycmllcyB0aGUge0BsaW5rIEVtYWlsRXhlY3V0b3J9IGV2ZXJ5IG91dGJvdW5kIHNlbmQgcnVuc1xuICogdGhyb3VnaC4gVGhlIHBsdWdpbiBpbnN0YWxscyBpdHMgb3duIGBleGVjdXRlKClgIHRoZXJlIGF0IHNldHVwLCB3aGljaCBpc1xuICogaG93IHRoZSBNYXN0cmEgdG9vbCAtIGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBubyBwbHVnaW4gaW5zdGFuY2UgaW4gc2NvcGUgLVxuICogc3RpbGwgZ2V0cyBBcHBLaXQncyByZXRyeSAvIHRpbWVvdXQgLyB0ZWxlbWV0cnkgY2hhaW4uIFdpdGhvdXQgYSByZWdpc3RlcmVkXG4gKiBwbHVnaW4gKGEgZGlyZWN0IGNhbGwgZnJvbSBhIHNjcmlwdCBvciBhIHRlc3QpIHRoZSBzZW5kIHN0aWxsIHJ1bnMsIGp1c3RcbiAqIHdpdGhvdXQgaW50ZXJjZXB0b3JzLlxuICpcbiAqIEV2ZXJ5IGVudHJ5IHBvaW50IHRha2VzIGFuIG9wdGlvbmFsIHtAbGluayBBYm9ydFNpZ25hbH0gc28gdGhlIHBsdWdpbidzXG4gKiBgZXhlY3V0ZSgpYCB0aW1lb3V0IGFuZCBhIGNsaWVudCBkaXNjb25uZWN0IGJvdGggc3RvcCB0aGUgY2FsbGVyIHdhaXRpbmdcbiAqIG9uIFNNVFAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgdHlwZSBFeGVjdXRpb25SZXN1bHQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGV4ZWN1dGlvbiwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRW1haWxBdHRhY2htZW50LCBFbWFpbE1lc3NhZ2UsIEVtYWlsUmVzdWx0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWVtYWlsXCI7XG5pbXBvcnQgbm9kZW1haWxlciwgeyB0eXBlIFNlbmRNYWlsT3B0aW9ucywgdHlwZSBUcmFuc3BvcnRlciB9IGZyb20gXCJub2RlbWFpbGVyXCI7XG5pbXBvcnQgeyByZXNvbHZlRW1haWxDb25maWcsIHR5cGUgRW1haWxQbHVnaW5Db25maWcsIHR5cGUgUmVzb2x2ZWRFbWFpbENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgRU1BSUxfU0VORF9TRVRUSU5HUyxcbiAgTUFYX0FUVEFDSE1FTlRfQllURVMsXG4gIE1BWF9BVFRBQ0hNRU5UX0NPVU5ULFxuICBNQVhfQVRUQUNITUVOVFNfVE9UQUxfQllURVMsXG4gIE1BWF9CT0RZX0NIQVJTLFxuICB0eXBlIEVtYWlsRXhlY3V0aW9uU2V0dGluZ3MsXG59IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5pbXBvcnQgeyByZW5kZXJFbWFpbCB9IGZyb20gXCIuL2VtYWlsLWh0bWwudHNcIjtcbmltcG9ydCB7IHdyaXRlT3V0Ym94RW1haWwgfSBmcm9tIFwiLi9vdXRib3gudHNcIjtcbmltcG9ydCB7IGFzc2VydFNlbmRlckFsbG93ZWQgfSBmcm9tIFwiLi9zZW5kZXIudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImVtYWlsL3RyYW5zcG9ydFwiKTtcblxuLyoqXG4gKiBSdW5zIG9uZSBvdXRib3VuZCBzZW5kIHRocm91Z2ggQXBwS2l0J3MgaW50ZXJjZXB0b3IgY2hhaW4uIE1hdGNoZXNcbiAqIGBQbHVnaW4uZXhlY3V0ZSgpYCwgd2hpY2ggbmV2ZXIgdGhyb3dzOiBhIGZhaWx1cmUgY29tZXMgYmFjayBhc1xuICogYHsgb2s6IGZhbHNlIH1gLlxuICovXG5leHBvcnQgdHlwZSBFbWFpbEV4ZWN1dG9yID0gPFQ+KFxuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICBzZXR0aW5nczogRW1haWxFeGVjdXRpb25TZXR0aW5ncyxcbikgPT4gUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8VD4+O1xuXG4vKiogVGhlIHNoYXJlZCBkaXNwYXRjaGVyLCBpdHMgcmVzb2x2ZWQgY29uZmlnLCBhbmQgdGhlIHNlbmQgZXhlY3V0b3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsUnVudGltZSB7XG4gIC8qKiBQcmVzZW50IG9ubHkgaW4gU01UUCBtb2RlLiAqL1xuICB0cmFuc3BvcnRlcj86IFRyYW5zcG9ydGVyO1xuICBjb25maWc6IFJlc29sdmVkRW1haWxDb25maWc7XG4gIGV4ZWN1dGU6IEVtYWlsRXhlY3V0b3I7XG59XG5cbi8qKlxuICogRXhlY3V0b3IgdXNlZCB1bnRpbCAob3IgdW5sZXNzKSB0aGUgcGx1Z2luIGluc3RhbGxzIGl0cyBvd246IHJ1biB0aGUgc2VuZFxuICogZGlyZWN0bHksIG1hcHBpbmcgYSB0aHJvdyBvbnRvIHRoZSBzYW1lIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IHNoYXBlIHNvXG4gKiBjYWxsIHNpdGVzIGJyYW5jaCBvbiBgb2tgIGVpdGhlciB3YXkuXG4gKi9cbmNvbnN0IGRpcmVjdEV4ZWN1dGUgPSBleGVjdXRpb24uZGlyZWN0RXhlY3V0b3I8RW1haWxFeGVjdXRpb25TZXR0aW5ncz4oKTtcblxubGV0IHJ1bnRpbWU6IEVtYWlsUnVudGltZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHNoYXJlZCBydW50aW1lLCBidWlsZGluZyBpdCBvbiBmaXJzdCB1c2UgYnkgcmVzb2x2aW5nXG4gKiBgb3ZlcnJpZGVzYCBvdmVyIHRoZSBlbnZpcm9ubWVudCAoYFNNVFBfSE9TVGAsIGBTTVRQX1BPUlRgLFxuICogYFNNVFBfU0VDVVJFYCwgYFNNVFBfVVNFUmAsIGBTTVRQX1BBU1NXT1JEYCwgYEVNQUlMX0RPTUFJTmAsXG4gKiBgRU1BSUxfRlJPTWAsIGBFTUFJTF9BTExPV0VEX1NFTkRFUlNgLCBgRU1BSUxfU0VOREVSX1BPTElDWWAsXG4gKiBgRU1BSUxfT1VUQk9YX01PREVgLCBgRU1BSUxfT1VUQk9YX0RJUmApIHRocm91Z2hcbiAqIHtAbGluayByZXNvbHZlRW1haWxDb25maWd9LiBXaXRoIFNNVFAgY3JlZGVudGlhbHMgcHJlc2VudCBpdCBob2xkcyBhXG4gKiBub2RlbWFpbGVyIHRyYW5zcG9ydCBhbmQgaXRzIGNvbm5lY3Rpb24gcG9vbDsgb3RoZXJ3aXNlIGl0IGlzIGluXG4gKiBmaWxlL291dGJveCBtb2RlIGFuZCBob2xkcyBub25lLlxuICpcbiAqIGBvdmVycmlkZXNgIGlzIHJlYWQgb25seSBvbiB0aGUgY2FsbCB0aGF0IGJ1aWxkcyB0aGUgcnVudGltZSwgc28gcHJpbWUgaXRcbiAqIGZyb20gdGhlIHBsdWdpbidzIGNvbmZpZyBhdCBzZXR1cDsgbGF0ZXIgY2FsbGVycyAodGhlIHRvb2wncyBgZXhlY3V0ZWAsXG4gKiB0aGUgc2VuZGVyLW9wdGlvbnMgcm91dGUpIHBhc3Mgbm90aGluZyBhbmQgZ2V0IHRoZSBzYW1lIGluc3RhbmNlLiBUaHJvd3NcbiAqIHdoYXRldmVyIHtAbGluayByZXNvbHZlRW1haWxDb25maWd9IHRocm93cyBmb3IgYW4gdW51c2FibGUgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVtYWlsUnVudGltZShvdmVycmlkZXM/OiBFbWFpbFBsdWdpbkNvbmZpZyk6IEVtYWlsUnVudGltZSB7XG4gIGlmICghcnVudGltZSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVFbWFpbENvbmZpZyhvdmVycmlkZXMpO1xuICAgIHJ1bnRpbWUgPSB7XG4gICAgICBjb25maWcsXG4gICAgICBleGVjdXRlOiBkaXJlY3RFeGVjdXRlLFxuICAgICAgLi4uKGNvbmZpZy5tb2RlID09PSBcInNtdHBcIlxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHRyYW5zcG9ydGVyOiBub2RlbWFpbGVyLmNyZWF0ZVRyYW5zcG9ydCh7XG4gICAgICAgICAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgICAgICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgICAgICAgICAgc2VjdXJlOiBjb25maWcuc2VjdXJlLFxuICAgICAgICAgICAgICBhdXRoOiBjb25maWcuYXV0aCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcnVudGltZTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBleGVjdXRvciBvdXRib3VuZCBzZW5kcyBydW4gdGhyb3VnaC4gVGhlIHBsdWdpbiBjYWxscyB0aGlzIGF0XG4gKiBzZXR1cCB3aXRoIGl0cyBvd24gYGV4ZWN1dGUoKWA7IGEgc2Vjb25kIGNhbGwgcmVwbGFjZXMgdGhlIHByZXZpb3VzIG9uZSwgc29cbiAqIGEgcmUtcmVnaXN0ZXJlZCBwbHVnaW4gZG9lcyBub3QgbGVhdmUgdGhlIHRvb2xzIGJvdW5kIHRvIGEgZGVhZCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEVtYWlsRXhlY3V0b3IoZXhlY3V0ZTogRW1haWxFeGVjdXRvcik6IHZvaWQge1xuICBnZXRFbWFpbFJ1bnRpbWUoKS5leGVjdXRlID0gZXhlY3V0ZTtcbn1cblxuLyoqXG4gKiBEcm9wIHRoZSBtZW1vaXplZCBydW50aW1lLCBjbG9zaW5nIHRoZSBTTVRQIGNvbm5lY3Rpb24gcG9vbCwgc28gdGhlIG5leHRcbiAqIHtAbGluayBnZXRFbWFpbFJ1bnRpbWV9IHJlYnVpbGRzIGl0IGZyb20gZnJlc2ggY29uZmlnIGFuZCBzdG9wcyBjYWxsaW5nXG4gKiB0aHJvdWdoIGEgdG9ybi1kb3duIHBsdWdpbidzIGBleGVjdXRlKClgLiBJZGVtcG90ZW50LCBhbmQgdGhlIHBsdWdpbidzXG4gKiBgc2h1dGRvd24oKWAgaG9vay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0RW1haWxSdW50aW1lKCk6IHZvaWQge1xuICBydW50aW1lPy50cmFuc3BvcnRlcj8uY2xvc2UoKTtcbiAgcnVudGltZSA9IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSdW4gb25lIG5vbi1pZGVtcG90ZW50IHdyaXRlIHRocm91Z2ggdGhlIHNoYXJlZCBleGVjdXRvciBhbmQgdW53cmFwIGl0LlxuICpcbiAqIGBleGVjdXRlKClgIG5ldmVyIHRocm93cywgc28gYSBmYWlsZWQgc2VuZCBhcnJpdmVzIGFzIGB7IG9rOiBmYWxzZSB9YCB3aXRoIGFcbiAqIHN0YXR1cyB0aGUgaW50ZXJjZXB0b3JzIGFscmVhZHkgc2FuaXRpemVkOyBpdCBpcyBsb2dnZWQgaGVyZSBhbmQgcmUtcmFpc2VkXG4gKiBhcyBhIHN0YWJsZSB7QGxpbmsgRXhlY3V0aW9uRXJyb3J9IHNvIGFuIHVwc3RyZWFtIG1lc3NhZ2UgbmV2ZXIgYmVjb21lcyB0aGVcbiAqIGNhbGxlcidzIGVycm9yIHRleHQuIGBzaWduYWxgIGlzIHRoZSBjYWxsZXIncyBvd24gY2FuY2VsbGF0aW9uIChhbiBhZ2VudFxuICogcnVuLCBhIHJlcXVlc3QgdGVhcmRvd24pOyBpdCBpcyBtZXJnZWQgd2l0aCB0aGUgc2lnbmFsIHRoZSB0aW1lb3V0XG4gKiBpbnRlcmNlcHRvciBzdXBwbGllcyBzbyBlaXRoZXIgb25lIHVud2luZHMgdGhlIEkvTy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVXcml0ZTxUPihcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHNldHRpbmdzOiBFbWFpbEV4ZWN1dGlvblNldHRpbmdzLFxuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCB7IGV4ZWN1dGUgfSA9IGdldEVtYWlsUnVudGltZSgpO1xuICByZXR1cm4gZXhlY3V0aW9uLnJ1bih7XG4gICAgb3BlcmF0aW9uLFxuICAgIHNldHRpbmdzLFxuICAgIGV4ZWN1dGUsXG4gICAgZm4sXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbGVkOiBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCxcbiAgICBmYWlsZWQ6IChmYWlsdXJlKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcImV4ZWN1dGlvbi1mYWlsZWRcIiwge1xuICAgICAgICBvcGVyYXRpb246IGZhaWx1cmUub3BlcmF0aW9uLFxuICAgICAgICBzdGF0dXM6IGZhaWx1cmUuc3RhdHVzLFxuICAgICAgICBlcnJvcjogZmFpbHVyZS5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IEV4ZWN1dGlvbkVycm9yKGBlbWFpbDogJHtmYWlsdXJlLm9wZXJhdGlvbn0gZmFpbGVkYCwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogZmFpbHVyZS5vcGVyYXRpb24sIHN0YXR1czogZmFpbHVyZS5zdGF0dXMgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIE9wZW4gYW5kIHRlYXIgZG93biBvbmUgU01UUCBjb25uZWN0aW9uIHRvIHByb3ZlIHRoZSBob3N0LCBwb3J0LCBhbmRcbiAqIGNyZWRlbnRpYWxzIHdvcmsuIENhbGxlZCBhdCBwbHVnaW4gc2V0dXAgc28gYSBiYWQgcmVsYXkgc2hvd3MgdXAgaW4gdGhlXG4gKiBib290IGxvZ3MgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0IGFwcHJvdmVkIHNlbmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlFbWFpbFRyYW5zcG9ydChcbiAgdHJhbnNwb3J0ZXI6IFRyYW5zcG9ydGVyIHwgdW5kZWZpbmVkLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXRyYW5zcG9ydGVyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgICAgXCJTTVRQXCIsXG4gICAgICBcIlRoZSBydW50aW1lIHJlc29sdmVkIHRvIG91dGJveCBtb2RlLCBzbyB0aGVyZSBpcyBubyB0cmFuc3BvcnQgdG8gdmVyaWZ5LlwiLFxuICAgICk7XG4gIH1cbiAgYXdhaXQgYWJvcnRhYmxlKHRyYW5zcG9ydGVyLnZlcmlmeSgpLCBzaWduYWwpO1xufVxuXG4vKipcbiAqIFN0b3AgYXdhaXRpbmcgYHByb21pc2VgIGFzIHNvb24gYXMgYHNpZ25hbGAgYWJvcnRzLiBub2RlbWFpbGVyIGV4cG9zZXMgbm9cbiAqIGNhbmNlbGxhdGlvbiBob29rLCBzbyB0aGUgU01UUCBjb252ZXJzYXRpb24gaXRzZWxmIGZpbmlzaGVzIG9uIGl0cyBvd25cbiAqIGNvbm5lY3Rpb247IHdoYXQgdW53aW5kcyBpcyB0aGUgY2FsbGVyIGFuZCBldmVyeXRoaW5nIGRvd25zdHJlYW0gb2YgaXQuXG4gKi9cbmZ1bmN0aW9uIGFib3J0YWJsZTxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxUPiB7XG4gIGlmICghc2lnbmFsKSByZXR1cm4gcHJvbWlzZTtcbiAgc2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIC8vIFRoZSBsaXN0ZW5lciBpcyBkZXRhY2hlZCBvbmNlIHRoZSByYWNlIHNldHRsZXMgc28gYSBsb25nLWxpdmVkIHJ1biBzaWduYWxcbiAgLy8gZG9lcyBub3QgYWNjdW11bGF0ZSBvbmUgcGVyIHNlbmQuXG4gIGNvbnN0IGxpc3RlbmVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBhYm9ydGVkID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHJlamVjdChzaWduYWwucmVhc29uKSwge1xuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogbGlzdGVuZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbcHJvbWlzZSwgYWJvcnRlZF0pLmZpbmFsbHkoKCkgPT4gbGlzdGVuZXIuYWJvcnQoKSk7XG59XG5cbi8qKiBUaGUgY29tbWEtam9pbmVkIHJlY2lwaWVudCBzdHJpbmcgZWNob2VkIGJhY2sgaW4ge0BsaW5rIEVtYWlsUmVzdWx0fS4gKi9cbmZ1bmN0aW9uIHJlY2lwaWVudEVjaG8odG86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvLmpvaW4oXCIsIFwiKTtcbn1cblxuLyoqXG4gKiBOb2RlIGJ1ZmZlciBlbmNvZGluZ3MgYSB3aXJlIGF0dGFjaG1lbnQgbWF5IG5hbWUgZm9yIGl0cyBpbmxpbmUgYGNvbnRlbnRgLlxuICogQW55dGhpbmcgZWxzZSBpcyBtZWFzdXJlZCBhcyBVVEYtOCwgd2hpY2ggb3Zlci1jb3VudHMgcmF0aGVyIHRoYW4gbGV0dGluZ1xuICogYW4gdW5yZWNvZ25pemVkIGVuY29kaW5nIHNsaXAgcGFzdCB0aGUgc2l6ZSBjYXAuXG4gKi9cbmNvbnN0IENPTlRFTlRfRU5DT0RJTkdTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiYXNjaWlcIixcbiAgXCJiYXNlNjRcIixcbiAgXCJiYXNlNjR1cmxcIixcbiAgXCJiaW5hcnlcIixcbiAgXCJoZXhcIixcbiAgXCJsYXRpbjFcIixcbiAgXCJ1Y3MyXCIsXG4gIFwidWNzLTJcIixcbiAgXCJ1dGY4XCIsXG4gIFwidXRmLThcIixcbiAgXCJ1dGYxNmxlXCIsXG4gIFwidXRmLTE2bGVcIixcbl0pO1xuXG4vKipcbiAqIERlY29kZWQgYnl0ZSBzaXplIG9mIG9uZSBhdHRhY2htZW50J3MgaW5saW5lIGNvbnRlbnQuIEEgYHBhdGhgIGF0dGFjaG1lbnRcbiAqIGNvbnRyaWJ1dGVzIG5vdGhpbmc6IG5vZGVtYWlsZXIgc3RyZWFtcyBpdCwgc28gaXRzIGJ5dGVzIG5ldmVyIHNpdCBpbiB0aGlzXG4gKiBwcm9jZXNzIGFuZCBjYW5ub3QgYmUgbWVhc3VyZWQgaGVyZS5cbiAqL1xuZnVuY3Rpb24gYXR0YWNobWVudEJ5dGVzKGF0dGFjaG1lbnQ6IEVtYWlsQXR0YWNobWVudCk6IG51bWJlciB7XG4gIGNvbnN0IHsgY29udGVudCwgZW5jb2RpbmcgfSA9IGF0dGFjaG1lbnQ7XG4gIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBjb25zdCBkZWNsYXJlZCA9IGVuY29kaW5nPy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCByZXNvbHZlZCA9XG4gICAgZGVjbGFyZWQgJiYgQ09OVEVOVF9FTkNPRElOR1MuaGFzKGRlY2xhcmVkKSA/IChkZWNsYXJlZCBhcyBCdWZmZXJFbmNvZGluZykgOiBcInV0ZjhcIjtcbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbnRlbnQsIHJlc29sdmVkKTtcbn1cblxuLyoqXG4gKiBSZWplY3QgYSBtZXNzYWdlIHdob3NlIGJvZHkgb3IgYXR0YWNobWVudHMgZXhjZWVkIHRoZSBwbHVnaW4ncyBjYXBzLiBUaGVcbiAqIGJvZHkgYW5kIGF0dGFjaG1lbnQgbGlzdCBhcnJpdmUgZnJvbSBhIG1vZGVsLCBzbyB0aGV5IGFyZSB1bmJvdW5kZWQgdW50aWxcbiAqIHNvbWV0aGluZyBib3VuZHMgdGhlbTsgbW9zdCBTTVRQIHJlbGF5cyBhbHNvIHJlamVjdCBhbiBvdmVyc2l6ZWQgbWVzc2FnZVxuICogb25seSBhZnRlciB0aGUgd2hvbGUgcGF5bG9hZCBoYXMgYmVlbiB1cGxvYWRlZC5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TWVzc2FnZVdpdGhpbkNhcHMobWVzc2FnZTogRW1haWxNZXNzYWdlKTogdm9pZCB7XG4gIGlmIChtZXNzYWdlLmJvZHkubGVuZ3RoID4gTUFYX0JPRFlfQ0hBUlMpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgXCJib2R5XCIsXG4gICAgICBtZXNzYWdlLmJvZHkubGVuZ3RoLFxuICAgICAgYGF0IG1vc3QgJHtNQVhfQk9EWV9DSEFSU30gY2hhcmFjdGVyc2AsXG4gICAgKTtcbiAgfVxuICBjb25zdCBhdHRhY2htZW50cyA9IG1lc3NhZ2UuYXR0YWNobWVudHMgPz8gW107XG4gIGlmIChhdHRhY2htZW50cy5sZW5ndGggPiBNQVhfQVRUQUNITUVOVF9DT1VOVCkge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICBcImF0dGFjaG1lbnRzXCIsXG4gICAgICBhdHRhY2htZW50cy5sZW5ndGgsXG4gICAgICBgYXQgbW9zdCAke01BWF9BVFRBQ0hNRU5UX0NPVU5UfSBmaWxlc2AsXG4gICAgKTtcbiAgfVxuICBsZXQgdG90YWwgPSAwO1xuICBmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgYXR0YWNobWVudHMpIHtcbiAgICBjb25zdCBieXRlcyA9IGF0dGFjaG1lbnRCeXRlcyhhdHRhY2htZW50KTtcbiAgICBpZiAoYnl0ZXMgPiBNQVhfQVRUQUNITUVOVF9CWVRFUykge1xuICAgICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgICAgXCJhdHRhY2htZW50c1tdLmNvbnRlbnRcIixcbiAgICAgICAgYnl0ZXMsXG4gICAgICAgIGBhdCBtb3N0ICR7TUFYX0FUVEFDSE1FTlRfQllURVN9IGJ5dGVzIHBlciBmaWxlYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRvdGFsICs9IGJ5dGVzO1xuICB9XG4gIGlmICh0b3RhbCA+IE1BWF9BVFRBQ0hNRU5UU19UT1RBTF9CWVRFUykge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICBcImF0dGFjaG1lbnRzXCIsXG4gICAgICB0b3RhbCxcbiAgICAgIGBhdCBtb3N0ICR7TUFYX0FUVEFDSE1FTlRTX1RPVEFMX0JZVEVTfSBieXRlcyBhY3Jvc3MgYWxsIGZpbGVzYCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTWFwIHRoZSB3aXJlLWZvcm1hdCB7QGxpbmsgRW1haWxBdHRhY2htZW50fXMgb250byBub2RlbWFpbGVyJ3NcbiAqIGF0dGFjaG1lbnQgc2hhcGUsIGRyb3BwaW5nIHVuc2V0IG9wdGlvbmFsIGtleXMgc28gbm9kZW1haWxlciBhcHBsaWVzXG4gKiBpdHMgb3duIGRlZmF1bHRzICh1dGYtOCBlbmNvZGluZywgZmlsZW5hbWUtaW5mZXJyZWQgY29udGVudCB0eXBlKS4gVGhlXG4gKiB3aXJlIGZpZWxkcyBhcmUgYSBkZWxpYmVyYXRlIHN1YnNldCBvZiBub2RlbWFpbGVyJ3MsIHNvIHRoaXMgaXMgYVxuICogc3RyYWlnaHQgc3RydWN0dXJhbCBwYXNzLXRocm91Z2guXG4gKi9cbmZ1bmN0aW9uIHRvTWFpbEF0dGFjaG1lbnRzKFxuICBhdHRhY2htZW50czogRW1haWxBdHRhY2htZW50W10gfCB1bmRlZmluZWQsXG4pOiBTZW5kTWFpbE9wdGlvbnNbXCJhdHRhY2htZW50c1wiXSB7XG4gIGlmICghYXR0YWNobWVudHMgfHwgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYXR0YWNobWVudHMubWFwKChhdHQpID0+ICh7XG4gICAgZmlsZW5hbWU6IGF0dC5maWxlbmFtZSxcbiAgICAuLi4oYXR0LmNvbnRlbnQgIT09IHVuZGVmaW5lZCA/IHsgY29udGVudDogYXR0LmNvbnRlbnQgfSA6IHt9KSxcbiAgICAuLi4oYXR0LmVuY29kaW5nICE9PSB1bmRlZmluZWQgPyB7IGVuY29kaW5nOiBhdHQuZW5jb2RpbmcgfSA6IHt9KSxcbiAgICAuLi4oYXR0LnBhdGggIT09IHVuZGVmaW5lZCA/IHsgcGF0aDogYXR0LnBhdGggfSA6IHt9KSxcbiAgICAuLi4oYXR0LmNvbnRlbnRUeXBlICE9PSB1bmRlZmluZWQgPyB7IGNvbnRlbnRUeXBlOiBhdHQuY29udGVudFR5cGUgfSA6IHt9KSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIEhhbmQgb25lIGFscmVhZHktdmFsaWRhdGVkIG1lc3NhZ2UgdG8gU01UUCwgb3Igd3JpdGUgaXQgdG8gdGhlIG91dGJveCB3aGVuXG4gKiBubyBjcmVkZW50aWFscyBhcmUgY29uZmlndXJlZC4gVGhlIGhhbGYgb2YgYSBzZW5kIHRoYXQgcGVyZm9ybXMgSS9PLCBzbyBpdFxuICogaXMgd2hhdCBydW5zIGluc2lkZSB0aGUgaW50ZXJjZXB0b3IgY2hhaW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoKFxuICBtZXNzYWdlOiBFbWFpbE1lc3NhZ2UsXG4gIGZyb206IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIG9wdGlvbnM/OiBTZW5kRW1haWxPcHRpb25zLFxuKTogUHJvbWlzZTxFbWFpbFJlc3VsdD4ge1xuICBjb25zdCB7IGNvbmZpZywgdHJhbnNwb3J0ZXIgfSA9IGdldEVtYWlsUnVudGltZSgpO1xuICBjb25zdCByZWNpcGllbnQgPSByZWNpcGllbnRFY2hvKG1lc3NhZ2UudG8pO1xuICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKGNvbmZpZy5tb2RlID09PSBcImZpbGVcIikge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZU91dGJveEVtYWlsKG1lc3NhZ2UsIGZyb20sIGNvbmZpZy5vdXREaXIsIGNvbmZpZy5icmFuZCwge1xuICAgICAgLi4uKG9wdGlvbnM/LmhlYWRpbmcgIT09IHVuZGVmaW5lZCA/IHsgaGVhZGluZzogb3B0aW9ucy5oZWFkaW5nIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucz8ucHJldmlldyAhPT0gdW5kZWZpbmVkID8geyBwcmV2aWV3OiBvcHRpb25zLnByZXZpZXcgfSA6IHt9KSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBzZW50OiB0cnVlLCByZWNpcGllbnQsIGZyb20sIG1lc3NhZ2VJZDogcGF0aCB9O1xuICB9XG5cbiAgaWYgKCF0cmFuc3BvcnRlcikge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiU01UUFwiLFxuICAgICAgXCJObyB0cmFuc3BvcnQgd2FzIGJ1aWx0IGZvciB0aGUgcmVzb2x2ZWQgY29uZmlndXJhdGlvbi5cIixcbiAgICApO1xuICB9XG4gIGNvbnN0IGF0dGFjaG1lbnRzID0gdG9NYWlsQXR0YWNobWVudHMobWVzc2FnZS5hdHRhY2htZW50cyk7XG4gIGNvbnN0IHJlbmRlcmVkID0gYXdhaXQgcmVuZGVyRW1haWwoe1xuICAgIHN1YmplY3Q6IG1lc3NhZ2Uuc3ViamVjdCxcbiAgICBib2R5OiBtZXNzYWdlLmJvZHksXG4gICAgYnJhbmQ6IGNvbmZpZy5icmFuZCxcbiAgICAuLi4ob3B0aW9ucz8uaGVhZGluZyAhPT0gdW5kZWZpbmVkID8geyBoZWFkaW5nOiBvcHRpb25zLmhlYWRpbmcgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucz8ucHJldmlldyAhPT0gdW5kZWZpbmVkID8geyBwcmV2aWV3OiBvcHRpb25zLnByZXZpZXcgfSA6IHt9KSxcbiAgfSk7XG4gIGNvbnN0IGluZm8gPSBhd2FpdCBhYm9ydGFibGUoXG4gICAgdHJhbnNwb3J0ZXIuc2VuZE1haWwoe1xuICAgICAgZnJvbSxcbiAgICAgIHRvOiBtZXNzYWdlLnRvLFxuICAgICAgc3ViamVjdDogbWVzc2FnZS5zdWJqZWN0LFxuICAgICAgLy8gQSBjYWxsZXItc3VwcGxpZWQgcGxhaW4tdGV4dCBwYXJ0IFdJTlMgb3ZlciB0aGUgZ2VuZXJhdGVkIG9uZS4gQm90aCBwYXJ0c1xuICAgICAgLy8gc3RpbGwgY29tZSBmcm9tIHRoZSBzYW1lIGNvbnRlbnQ7IHRoaXMgb25seSBsZXRzIGEgY2FsbGVyIGNvbnRyb2wgdGhlXG4gICAgICAvLyB0ZXh0IGFsdGVybmF0aXZlJ3MgZXhhY3QgbGluZSBsYXlvdXQsIHdoaWNoIHNvbWUgY2xpZW50cyBwYXJzZSAoc2VlXG4gICAgICAvLyBgU2VuZEVtYWlsT3B0aW9ucy50ZXh0YCkuXG4gICAgICB0ZXh0OiBvcHRpb25zPy50ZXh0ID8/IHJlbmRlcmVkLnRleHQsXG4gICAgICBodG1sOiByZW5kZXJlZC5odG1sLFxuICAgICAgLi4uKG1lc3NhZ2UuY2MgJiYgbWVzc2FnZS5jYy5sZW5ndGggPiAwID8geyBjYzogbWVzc2FnZS5jYyB9IDoge30pLFxuICAgICAgLi4uKG1lc3NhZ2UuYmNjICYmIG1lc3NhZ2UuYmNjLmxlbmd0aCA+IDAgPyB7IGJjYzogbWVzc2FnZS5iY2MgfSA6IHt9KSxcbiAgICAgIC4uLihhdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICB9KSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiB7XG4gICAgc2VudDogdHJ1ZSxcbiAgICByZWNpcGllbnQsXG4gICAgZnJvbSxcbiAgICAuLi4oaW5mby5tZXNzYWdlSWQgPyB7IG1lc3NhZ2VJZDogaW5mby5tZXNzYWdlSWQgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWxpdmVyeS10aW1lIG9wdGlvbnMgdGhhdCBhcmUgTk9UIHBhcnQgb2YgdGhlIG1lc3NhZ2UgYSBtb2RlbCBjb21wb3Nlcy5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgc2VwYXJhdGUgZnJvbSB7QGxpbmsgRW1haWxNZXNzYWdlfTogdGhhdCBzY2hlbWEgaXMgdGhlIGFnZW50XG4gKiB0b29sJ3MgaW5wdXQsIHNvIGFueXRoaW5nIGFkZGVkIHRvIGl0IGJlY29tZXMgYSBmaWVsZCBhIG1vZGVsIGNhbiBzZXQuIFRoZXNlXG4gKiBkZXNjcmliZSBob3cgYSBtZXNzYWdlIGlzIERFTElWRVJFRCwgc28gdGhleSBhcmUgdGhlIGNhbGxlcidzIHRvIHN1cHBseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5kRW1haWxPcHRpb25zIHtcbiAgLyoqXG4gICAqIFZpc2libGUgaGVhZGluZyBpbnNpZGUgdGhlIGJyYW5kZWQgSFRNTCBjYXJkLiBEZWZhdWx0cyB0byB0aGUgbWVzc2FnZVxuICAgKiBzdWJqZWN0LiBVc2UgdGhpcyB3aGVuIHRoZSB0cmFuc3BvcnQgc3ViamVjdCBjYXJyaWVzIG5vdGlmaWNhdGlvbi1zcGVjaWZpY1xuICAgKiBkZXRhaWxzIHRoYXQgd291bGQgYmUgbm9pc3kgaWYgcmVwZWF0ZWQgaW5zaWRlIHRoZSBvcGVuZWQgZW1haWwuXG4gICAqL1xuICBoZWFkaW5nPzogc3RyaW5nO1xuICAvKipcbiAgICogQW4gZXhwbGljaXQgYHRleHQvcGxhaW5gIGFsdGVybmF0aXZlLCByZXBsYWNpbmcgdGhlIG9uZSBnZW5lcmF0ZWQgZnJvbSB0aGVcbiAgICogUmVhY3QgRW1haWwgdHJlZS4gVGhlIEhUTUwgcGFydCBpcyB1bnRvdWNoZWQsIHNvIHRoZSByZWNpcGllbnQgc3RpbGwgZ2V0cyB0aGVcbiAgICogZnVsbCBicmFuZGVkIHRlbXBsYXRlLlxuICAgKlxuICAgKiBUaGlzIGV4aXN0cyBiZWNhdXNlIHRoZSBnZW5lcmF0ZWQgdGV4dCBwYXJ0IGlzIGEgUkVOREVSSU5HIG9mIHRoZSBIVE1MOiBpdFxuICAgKiBjYXJyaWVzIHRoZSBicmFuZCBoZWFkZXIgYW5kIGZvb3RlciwgYW5kIGl0IHR1cm5zIENTUyBtYXJnaW4gaW50byBibGFua1xuICAgKiBsaW5lcy4gVGhhdCBpcyBmaW5lIGZvciBwcm9zZSBhbmQgd3JvbmcgZm9yIGNvbnRlbnQgYSBtYWNoaW5lIHBhcnNlcy4gQVxuICAgKiBvbmUtdGltZS1jb2RlIGVtYWlsIGlzIHRoZSBjYXNlIGluIHBvaW50IC0gY2xpZW50cyBsb29rIGZvciB0aGUgY29kZSBvbiB0aGVcbiAgICogbGluZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgcHJvbXB0LCBhbmQgYSBzdHlsZWQgYDxoMj5gIGNvZGUgbGFuZHMgdHdvIGJsYW5rXG4gICAqIGxpbmVzIGJlbG93IGl0LCBzbyBhdXRvZmlsbCBzdG9wcyBiZWluZyBvZmZlcmVkIGV2ZW4gdGhvdWdoIHRoZSBIVE1MIGxvb2tzXG4gICAqIHBlcmZlY3QuIFN1cHBseWluZyB0aGUgdGV4dCBwYXJ0IGRpcmVjdGx5IGtlZXBzIHRoZSBuaWNlIHRlbXBsYXRlIEFORCB0aGVcbiAgICogbGF5b3V0IHRob3NlIGNsaWVudHMgZXhwZWN0LlxuICAgKlxuICAgKiBLZWVwIHRoZSBzYW1lIGluZm9ybWF0aW9uIGluIGJvdGggcGFydHM7IGEgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRpc2FncmVlc1xuICAgKiB3aXRoIHRoZSBIVE1MIHJlYWRzIGFzIHBoaXNoaW5nIHRvIHNwYW0gZmlsdGVycy5cbiAgICovXG4gIHRleHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQcmVoZWFkZXIgdGV4dCBmb3IgdGhlIEhUTUwgcGFydCAtIHRoZSBzbmlwcGV0IHNob3duIGJlc2lkZSB0aGUgc3ViamVjdCBpbiBhblxuICAgKiBpbmJveCBsaXN0LCBhbmQgdGhlIGJvZHkgb2YgdGhlIFBVU0ggTk9USUZJQ0FUSU9OIGEgbW9iaWxlIG1haWwgYXBwIHBvc3RzLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3ViamVjdC5cbiAgICpcbiAgICogRGVsaXZlcnktdGltZSByYXRoZXIgdGhhbiBwYXJ0IG9mIHtAbGluayBFbWFpbE1lc3NhZ2V9IGZvciB0aGUgc2FtZSByZWFzb24gYXNcbiAgICogYHRleHRgOiBpdCBpcyBwcmVzZW50YXRpb24gdGhlIHNlbmRpbmcgQ09ERSBjaG9vc2VzLCBub3QgY29udGVudCBhIG1vZGVsXG4gICAqIGNvbXBvc2VzLiBUaGUgb25lLXRpbWUtY29kZSBwYXRoIHNldHMgaXQgc28gdGhlIGNvZGUgaXRzZWxmIHJpZGVzIGluIHRoZVxuICAgKiBub3RpZmljYXRpb24sIHdoaWNoIGlzIHRoZSBvbmx5IHRleHQgaU9TIGF1dG9maWxsIGdldHMgdG8gcmVhZC5cbiAgICovXG4gIHByZXZpZXc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2VuZCAoU01UUCBtb2RlKSBvciBwZXJzaXN0IChmaWxlL291dGJveCBtb2RlKSBvbmUgbWVzc2FnZSBmcm9tIHRoZVxuICogcmVzb2x2ZWQgYGZyb21gIGFkZHJlc3MuIGB0b2AgKGFuZCBvcHRpb25hbCBgY2NgIC8gYGJjY2ApIGVhY2ggYWNjZXB0XG4gKiBvbmUgb3IgbW9yZSBhZGRyZXNzZXMsIGFuZCBgYXR0YWNobWVudHNgIGFyZSBmb3J3YXJkZWQgYXMgZmlsZXMuIFRoZVxuICogYm9keSBpcyByZW5kZXJlZCBieSBSZWFjdCBFbWFpbCBpbnRvIG1hdGNoaW5nIHBsYWluLXRleHQgYW5kIEhUTUwgTUlNRVxuICogYWx0ZXJuYXRpdmVzLCBhbmQgdGhlIG91dGJveCBlbWJlZHMgdGhlXG4gKiByZW5kZXJlZCBIVE1MIGluIGEgZG9jdW1lbnQuIEluIGZpbGUgbW9kZSB0aGUgcmV0dXJuZWQgYG1lc3NhZ2VJZGAgaXNcbiAqIHRoZSBwYXRoIHdyaXR0ZW4uIFRocm93cyB3aGVuIGB0b2AgY2FycmllcyBubyByZWNpcGllbnQsIHdoZW4gdGhlIGJvZHlcbiAqIG9yIGF0dGFjaG1lbnRzIGV4Y2VlZCB0aGUgcGx1Z2luJ3MgY2Fwcywgb3Igd2hlbiBgZnJvbWAgaXMgbm90IHBlcm1pdHRlZFxuICogYnkgdGhlIGVmZmVjdGl2ZSBzZW5kZXIgYWxsb3ctbGlzdC5cbiAqXG4gKiBUaGUgcmVjaXBpZW50LCBjYXAsIGFuZCBzZW5kZXIgY2hlY2tzIHJ1biBiZWZvcmUgdGhlIGludGVyY2VwdG9yIGNoYWluIHNvXG4gKiB0aGVpciBzcGVjaWZpYyBzdGF0dXMgYW5kIGFjdGlvbmFibGUgbWVzc2FnZSByZWFjaCB0aGUgY2FsbGVyIGluc3RlYWQgb2ZcbiAqIHRoZSBjaGFpbidzIHN0YWJsZSBmYWlsdXJlIHRleHQuIGBzaWduYWxgIGNhbmNlbHMgdGhlIHNlbmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kRW1haWwoXG4gIG1lc3NhZ2U6IEVtYWlsTWVzc2FnZSxcbiAgZnJvbTogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgb3B0aW9ucz86IFNlbmRFbWFpbE9wdGlvbnMsXG4pOiBQcm9taXNlPEVtYWlsUmVzdWx0PiB7XG4gIGlmIChtZXNzYWdlLnRvLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5taXNzaW5nRmllbGQoXCJ0b1wiKTtcbiAgfVxuICBhc3NlcnRNZXNzYWdlV2l0aGluQ2FwcyhtZXNzYWdlKTtcbiAgYXNzZXJ0U2VuZGVyQWxsb3dlZChmcm9tLCBnZXRFbWFpbFJ1bnRpbWUoKS5jb25maWcuYWxsb3dlZFNlbmRlcnMpO1xuICByZXR1cm4gZXhlY3V0ZVdyaXRlKFxuICAgIFwic2VuZFwiLFxuICAgIEVNQUlMX1NFTkRfU0VUVElOR1MsXG4gICAgKGV4ZWN1dGVTaWduYWwpID0+IGRpc3BhdGNoKG1lc3NhZ2UsIGZyb20sIGV4ZWN1dGVTaWduYWwsIG9wdGlvbnMpLFxuICAgIHNpZ25hbCxcbiAgKTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "^0.43.0",
|
|
30
|
-
"@dbx-tools/shared-core": "0.6.
|
|
31
|
-
"@dbx-tools/shared-email": "0.6.
|
|
32
|
-
"@dbx-tools/shared-email-template": "0.6.
|
|
30
|
+
"@dbx-tools/shared-core": "0.6.64",
|
|
31
|
+
"@dbx-tools/shared-email": "0.6.64",
|
|
32
|
+
"@dbx-tools/shared-email-template": "0.6.64",
|
|
33
33
|
"@mastra/core": "^1.47.0",
|
|
34
34
|
"@react-email/render": "^2.1.0",
|
|
35
35
|
"nodemailer": "^7.0.13",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"./package.json": "./package.json"
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
|
-
"version": "0.6.
|
|
53
|
+
"version": "0.6.64",
|
|
54
54
|
"types": "./lib/index.d.ts",
|
|
55
55
|
"type": "module",
|
|
56
56
|
"exports": {
|
package/src/outbox.ts
CHANGED
|
@@ -18,7 +18,7 @@ import { join, resolve } from "node:path";
|
|
|
18
18
|
import { string } from "@dbx-tools/shared-core";
|
|
19
19
|
import type { EmailMessage } from "@dbx-tools/shared-email";
|
|
20
20
|
import type { EmailBrand } from "./brand.ts";
|
|
21
|
-
import { renderEmailHtml } from "./email-html.ts";
|
|
21
|
+
import { renderEmailHtml, type EmailHtmlOptions } from "./email-html.ts";
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Longest subject slug kept in an outbox file name, leaving room for the
|
|
@@ -55,6 +55,7 @@ export async function writeOutboxEmail(
|
|
|
55
55
|
from: string,
|
|
56
56
|
dir: string,
|
|
57
57
|
brand?: EmailBrand,
|
|
58
|
+
presentation?: Pick<EmailHtmlOptions, "heading" | "preview">,
|
|
58
59
|
): Promise<string> {
|
|
59
60
|
const folder = resolve(dir, from);
|
|
60
61
|
await mkdir(folder, { recursive: true });
|
|
@@ -65,6 +66,8 @@ export async function writeOutboxEmail(
|
|
|
65
66
|
body: message.body,
|
|
66
67
|
footer: "Local outbox preview - written to disk, not sent (no SMTP credentials configured).",
|
|
67
68
|
...(brand ? { brand } : {}),
|
|
69
|
+
...(presentation?.heading !== undefined ? { heading: presentation.heading } : {}),
|
|
70
|
+
...(presentation?.preview !== undefined ? { preview: presentation.preview } : {}),
|
|
68
71
|
});
|
|
69
72
|
await writeFile(path, html, "utf8");
|
|
70
73
|
return path;
|
package/src/transport.ts
CHANGED
|
@@ -322,7 +322,10 @@ async function dispatch(
|
|
|
322
322
|
signal?.throwIfAborted();
|
|
323
323
|
|
|
324
324
|
if (config.mode === "file") {
|
|
325
|
-
const path = await writeOutboxEmail(message, from, config.outDir, config.brand
|
|
325
|
+
const path = await writeOutboxEmail(message, from, config.outDir, config.brand, {
|
|
326
|
+
...(options?.heading !== undefined ? { heading: options.heading } : {}),
|
|
327
|
+
...(options?.preview !== undefined ? { preview: options.preview } : {}),
|
|
328
|
+
});
|
|
326
329
|
return { sent: true, recipient, from, messageId: path };
|
|
327
330
|
}
|
|
328
331
|
|
|
@@ -337,6 +340,8 @@ async function dispatch(
|
|
|
337
340
|
subject: message.subject,
|
|
338
341
|
body: message.body,
|
|
339
342
|
brand: config.brand,
|
|
343
|
+
...(options?.heading !== undefined ? { heading: options.heading } : {}),
|
|
344
|
+
...(options?.preview !== undefined ? { preview: options.preview } : {}),
|
|
340
345
|
});
|
|
341
346
|
const info = await abortable(
|
|
342
347
|
transporter.sendMail({
|
|
@@ -371,6 +376,12 @@ async function dispatch(
|
|
|
371
376
|
* describe how a message is DELIVERED, so they are the caller's to supply.
|
|
372
377
|
*/
|
|
373
378
|
export interface SendEmailOptions {
|
|
379
|
+
/**
|
|
380
|
+
* Visible heading inside the branded HTML card. Defaults to the message
|
|
381
|
+
* subject. Use this when the transport subject carries notification-specific
|
|
382
|
+
* details that would be noisy if repeated inside the opened email.
|
|
383
|
+
*/
|
|
384
|
+
heading?: string;
|
|
374
385
|
/**
|
|
375
386
|
* An explicit `text/plain` alternative, replacing the one generated from the
|
|
376
387
|
* React Email tree. The HTML part is untouched, so the recipient still gets the
|