@dbx-tools/shared-email-template 0.6.53 → 0.6.55

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 CHANGED
@@ -40,36 +40,6 @@ import { EmailDocument } from "@dbx-tools/shared-email-template";
40
40
  Node runtimes should pass this component to `@react-email/render`.
41
41
  `@dbx-tools/email` does that automatically for SMTP and local outbox delivery.
42
42
 
43
- ## Bind A One-Time Code To Your Domain
44
-
45
- Apple's AutoFill can tie a code to a specific website, so the keyboard offers it
46
- only on the matching domain - which is what stops a code phished from one site
47
- being autofilled into another. The format is `@<domain> #<code>` and iOS honours
48
- it only as the message's **final** line, so it is a document-level `trailer` prop
49
- rather than something a caller appends to `body` (the branded footer renders after
50
- the body).
51
-
52
- ```tsx
53
- import { autofillTrailer, EmailDocument } from "@dbx-tools/shared-email-template";
54
-
55
- <EmailDocument
56
- subject="Your verification code"
57
- body={"Your verification code is:\n\n## 123456"}
58
- trailer={autofillTrailer("demo.apps.dbx.tools", "123456")}
59
- />;
60
- ```
61
-
62
- `autofillTrailer()` normalizes a configured URL down to the bare host iOS matches
63
- on (scheme, `www.`, port, path, and trailing dot are stripped) and returns
64
- `undefined` when there is nothing to match - no domain, no code, or a hostless
65
- value like `localhost`. Passing `undefined` renders no trailer, so a deployment
66
- without a public domain simply omits it.
67
-
68
- This is a strict upgrade on top of the conventional layout, never a replacement:
69
- a prompt line followed by the bare code alone is what iOS, Gmail, Outlook, and
70
- Android already detect heuristically. `@dbx-tools/email` accepts the built string
71
- as a delivery option (`sendEmail(message, from, signal, { trailer })`).
72
-
73
43
  ## Reuse The Body Preview
74
44
 
75
45
  ```tsx
@@ -104,8 +74,8 @@ font, name, tagline, website, and fetchable logo URL.
104
74
 
105
75
  ## Modules
106
76
 
107
- - `.` - `EmailDocument`, `EmailCard`, `EmailBody`, `autofillTrailer()`, brand
108
- types/defaults, and content normalization.
77
+ - `.` - `EmailDocument`, `EmailCard`, `EmailBody`, brand types/defaults, and
78
+ content normalization.
109
79
 
110
80
  Pair this package with [`@dbx-tools/shared-email`](../email) for wire schemas,
111
81
  [`@dbx-tools/email`](../../node/email) for delivery, and
package/index.ts CHANGED
@@ -3,5 +3,5 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export * as template from "./src/template.tsx";
6
- export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, autofillTrailer, EmailCard, EmailDocument } from "./src/template.tsx";
6
+ export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, EmailCard, EmailDocument } from "./src/template.tsx";
7
7
  export type { EmailBrand, ResolvedEmailBrand, EmailBodyProps, EmailDocumentProps } from "./src/template.tsx";
package/lib/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export * as template from "./src/template.tsx";
2
- export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, autofillTrailer, EmailCard, EmailDocument } from "./src/template.tsx";
2
+ export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, EmailCard, EmailDocument } from "./src/template.tsx";
3
3
  export type { EmailBrand, ResolvedEmailBrand, EmailBodyProps, EmailDocumentProps } from "./src/template.tsx";
package/lib/index.js CHANGED
@@ -2,5 +2,5 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export * as template from "./src/template.js";
5
- export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, autofillTrailer, EmailCard, EmailDocument } from "./src/template.js";
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCAqIGFzIHRlbXBsYXRlIGZyb20gXCIuL3NyYy90ZW1wbGF0ZS50c3hcIjtcbmV4cG9ydCB7IGVtYWlsQnJhbmRGcm9tQ29udGV4dCwgZGVmYXVsdEVtYWlsQnJhbmQsIHJlc29sdmVFbWFpbEJyYW5kLCBub3JtYWxpemVFbWFpbE1hcmtkb3duLCBFbWFpbEJvZHksIGF1dG9maWxsVHJhaWxlciwgRW1haWxDYXJkLCBFbWFpbERvY3VtZW50IH0gZnJvbSBcIi4vc3JjL3RlbXBsYXRlLnRzeFwiO1xuZXhwb3J0IHR5cGUgeyBFbWFpbEJyYW5kLCBSZXNvbHZlZEVtYWlsQnJhbmQsIEVtYWlsQm9keVByb3BzLCBFbWFpbERvY3VtZW50UHJvcHMgfSBmcm9tIFwiLi9zcmMvdGVtcGxhdGUudHN4XCI7XG4iXX0=
5
+ export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, EmailCard, EmailDocument } from "./src/template.js";
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0ICogYXMgdGVtcGxhdGUgZnJvbSBcIi4vc3JjL3RlbXBsYXRlLnRzeFwiO1xuZXhwb3J0IHsgZW1haWxCcmFuZEZyb21Db250ZXh0LCBkZWZhdWx0RW1haWxCcmFuZCwgcmVzb2x2ZUVtYWlsQnJhbmQsIG5vcm1hbGl6ZUVtYWlsTWFya2Rvd24sIEVtYWlsQm9keSwgRW1haWxDYXJkLCBFbWFpbERvY3VtZW50IH0gZnJvbSBcIi4vc3JjL3RlbXBsYXRlLnRzeFwiO1xuZXhwb3J0IHR5cGUgeyBFbWFpbEJyYW5kLCBSZXNvbHZlZEVtYWlsQnJhbmQsIEVtYWlsQm9keVByb3BzLCBFbWFpbERvY3VtZW50UHJvcHMgfSBmcm9tIFwiLi9zcmMvdGVtcGxhdGUudHN4XCI7XG4iXX0=
@@ -5,11 +5,6 @@
5
5
  * the body component is reused directly by browser approval and compose views.
6
6
  * Both default to the repository brand while accepting a consumer override.
7
7
  *
8
- * {@link autofillTrailer} + the document's `trailer` prop cover Apple's
9
- * domain-bound one-time-code AutoFill, which requires `@<domain> #<code>` to be
10
- * the message's final line - hence a document-level prop rather than something a
11
- * caller can append to `body`.
12
- *
13
8
  * @module
14
9
  */
15
10
  import { type BrandContext } from "@dbx-tools/shared-core";
@@ -51,43 +46,7 @@ export interface EmailDocumentProps extends EmailBodyProps {
51
46
  subject?: string;
52
47
  headers?: ReadonlyArray<readonly [string, string]>;
53
48
  footer?: string;
54
- /**
55
- * A machine-read line emitted as the very LAST line of both MIME parts, after
56
- * the branded footer and outside the card.
57
- *
58
- * This exists for Apple's domain-bound one-time-code AutoFill, whose format is
59
- * `@<domain> #<code>` and which iOS only honours when it is the final line of
60
- * the message - so it cannot be appended to `body`, which the branded footer
61
- * would then follow. Rendered as visible-but-quiet text rather than hidden
62
- * (`display: none` content is a spam signal, and a client that ignores the
63
- * convention should show something innocuous rather than nothing).
64
- *
65
- * See {@link autofillTrailer}, which builds the string.
66
- */
67
- trailer?: string;
68
49
  }
69
- /**
70
- * Apple's domain-bound AutoFill trailer, `@<domain> #<code>`, or `undefined`
71
- * when either part is missing.
72
- *
73
- * iOS reads this to bind a code to a specific WEBSITE: with it, the keyboard
74
- * offers the code only for the matching domain, which is what stops a code
75
- * phished from one site being autofilled into another. Without it, iOS still
76
- * detects a code heuristically from the conventional layout (prompt line, bare
77
- * code alone on the next line), as do Gmail, Outlook, and Android - so this is a
78
- * strict upgrade on top of that baseline, never a replacement for it.
79
- *
80
- * The domain is normalized to bare host form: a scheme, a `www.` prefix, any
81
- * path, and a trailing dot are stripped, since iOS matches the host the site is
82
- * served from. A domain with no dot (`localhost`) is rejected - it cannot be the
83
- * public host of a real deployment, and a trailer iOS will never match is just a
84
- * confusing line in the email.
85
- *
86
- * @example
87
- * autofillTrailer("demo.apps.dbx.tools", "123456"); // "@demo.apps.dbx.tools #123456"
88
- * autofillTrailer("https://www.example.com/app", "123456"); // "@example.com #123456"
89
- */
90
- export declare const autofillTrailer: (domain: string | undefined, code: string | undefined) => string | undefined;
91
50
  /** Branded message card shared by the full document and browser previews. */
92
51
  export declare const EmailCard: ({ body, subject, headers, footer, brand: brandInput, }: EmailDocumentProps) => React.JSX.Element;
93
52
  /** Complete responsive, branded React Email document. */
@@ -6,11 +6,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  * the body component is reused directly by browser approval and compose views.
7
7
  * Both default to the repository brand while accepting a consumer override.
8
8
  *
9
- * {@link autofillTrailer} + the document's `trailer` prop cover Apple's
10
- * domain-bound one-time-code AutoFill, which requires `@<domain> #<code>` to be
11
- * the message's final line - hence a document-level prop rather than something a
12
- * caller can append to `body`.
13
- *
14
9
  * @module
15
10
  */
16
11
  import { brand } from "@dbx-tools/shared-core";
@@ -129,42 +124,6 @@ export const EmailBody = ({ body, brand: brandInput }) => {
129
124
  },
130
125
  }, children: normalizeEmailMarkdown(body) }));
131
126
  };
132
- /**
133
- * Apple's domain-bound AutoFill trailer, `@<domain> #<code>`, or `undefined`
134
- * when either part is missing.
135
- *
136
- * iOS reads this to bind a code to a specific WEBSITE: with it, the keyboard
137
- * offers the code only for the matching domain, which is what stops a code
138
- * phished from one site being autofilled into another. Without it, iOS still
139
- * detects a code heuristically from the conventional layout (prompt line, bare
140
- * code alone on the next line), as do Gmail, Outlook, and Android - so this is a
141
- * strict upgrade on top of that baseline, never a replacement for it.
142
- *
143
- * The domain is normalized to bare host form: a scheme, a `www.` prefix, any
144
- * path, and a trailing dot are stripped, since iOS matches the host the site is
145
- * served from. A domain with no dot (`localhost`) is rejected - it cannot be the
146
- * public host of a real deployment, and a trailer iOS will never match is just a
147
- * confusing line in the email.
148
- *
149
- * @example
150
- * autofillTrailer("demo.apps.dbx.tools", "123456"); // "@demo.apps.dbx.tools #123456"
151
- * autofillTrailer("https://www.example.com/app", "123456"); // "@example.com #123456"
152
- */
153
- export const autofillTrailer = (domain, code) => {
154
- if (!domain || !code)
155
- return undefined;
156
- const host = domain
157
- .trim()
158
- .toLowerCase()
159
- .replace(/^[a-z][a-z\d+.-]*:\/\//, "")
160
- .replace(/^www\./, "")
161
- .replace(/[/?#].*$/, "")
162
- .replace(/\.$/, "")
163
- .replace(/:\d+$/, "");
164
- if (!host.includes("."))
165
- return undefined;
166
- return `@${host} #${code.trim()}`;
167
- };
168
127
  function BrandMark({ theme }) {
169
128
  if (theme.logoUrl) {
170
129
  return (_jsx(Img, { src: theme.logoUrl, alt: theme.name, height: "34", style: { display: "block", height: "34px", width: "auto" } }));
@@ -221,26 +180,6 @@ export const EmailCard = ({ body, subject = "Message", headers, footer, brand: b
221
180
  textDecoration: "none",
222
181
  }, children: theme.name })) : null] }) })] }));
223
182
  };
224
- /**
225
- * The machine-read trailer line, rendered LAST and outside the card.
226
- *
227
- * Deliberately the final element of `<Body>`: iOS only binds a code to a domain
228
- * when `@<domain> #<code>` is the last line of the message, so nothing - not even
229
- * the branded footer - may follow it. Styled small and muted rather than hidden,
230
- * because `display: none` text is a spam-filter signal.
231
- */
232
- function AutofillTrailer({ trailer, theme, }) {
233
- if (!trailer)
234
- return null;
235
- return (_jsx(Text, { style: {
236
- color: theme.muted,
237
- fontFamily: theme.fontFamily,
238
- fontSize: "11px",
239
- margin: "16px auto 0",
240
- maxWidth: "620px",
241
- textAlign: "center",
242
- }, children: trailer }));
243
- }
244
183
  /** Complete responsive, branded React Email document. */
245
184
  export const EmailDocument = (props) => {
246
185
  const theme = resolveEmailBrand(props.brand);
@@ -250,6 +189,6 @@ export const EmailDocument = (props) => {
250
189
  margin: 0,
251
190
  padding: "28px 12px",
252
191
  };
253
- return (_jsxs(Html, { lang: "en", children: [_jsx(Head, {}), _jsx(Preview, { children: props.subject ?? "Message" }), _jsxs(Body, { style: pageStyle, children: [_jsx(EmailCard, { ...props }), _jsx(AutofillTrailer, { trailer: props.trailer, theme: theme })] })] }));
192
+ return (_jsxs(Html, { lang: "en", children: [_jsx(Head, {}), _jsx(Preview, { children: props.subject ?? "Message" }), _jsx(Body, { style: pageStyle, children: _jsx(EmailCard, { ...props }) })] }));
254
193
  };
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsT0FBTyxFQUFFLEtBQUssRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sRUFDUCxFQUFFLEVBQ0YsSUFBSSxFQUNKLEdBQUcsRUFDSCxJQUFJLEVBQ0osUUFBUSxFQUNSLE9BQU8sRUFDUCxHQUFHLEVBQ0gsT0FBTyxFQUNQLElBQUksR0FDTCxNQUFNLHlCQUF5QixDQUFDO0FBcUNqQyxTQUFTLG9CQUFvQixDQUFDLEtBQXlCO0lBQ3JELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsT0FBcUIsRUFBYyxFQUFFO0lBQ3pFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDbkUsT0FBTztRQUNMLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU87UUFDOUIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUNuQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTztRQUNsQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ2xDLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFD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TUFBTSxFQUFFLENBQUM7UUFDVCxPQUFPLEVBQUUsV0FBVztLQUNyQixDQUFDO0lBQ0YsT0FBTyxDQUNMLE1BQUMsSUFBSSxJQUFDLElBQUksRUFBQyxJQUFJLGFBQ2IsS0FBQyxJQUFJLEtBQUcsRUFDUixLQUFDLE9BQU8sY0FBRSxLQUFLLENBQUMsT0FBTyxJQUFJLFNBQVMsR0FBVyxFQUMvQyxNQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsU0FBUyxhQUNwQixLQUFDLFNBQVMsT0FBSyxLQUFLLEdBQUksRUFDeEIsS0FBQyxlQUFlLElBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBSSxJQUNwRCxJQUNGLENBQ1IsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pdmVyc2FsIFJlYWN0IEVtYWlsIHByZXNlbnRhdGlvbiBmb3IgZGJ4LXRvb2xzIGVtYWlsIGZsb3dzLlxuICpcbiAqIFRoZSBkb2N1bWVudCBjb21wb25lbnQgcmVuZGVycyBvbiB0aGUgc2VydmVyIHRocm91Z2ggYEByZWFjdC1lbWFpbC9yZW5kZXJgO1xuICogdGhlIGJvZHkgY29tcG9uZW50IGlzIHJldXNlZCBkaXJlY3RseSBieSBicm93c2VyIGFwcHJvdmFsIGFuZCBjb21wb3NlIHZpZXdzLlxuICogQm90aCBkZWZhdWx0IHRvIHRoZSByZXBvc2l0b3J5IGJyYW5kIHdoaWxlIGFjY2VwdGluZyBhIGNvbnN1bWVyIG92ZXJyaWRlLlxuICpcbiAqIHtAbGluayBhdXRvZmlsbFRyYWlsZXJ9ICsgdGhlIGRvY3VtZW50J3MgYHRyYWlsZXJgIHByb3AgY292ZXIgQXBwbGUnc1xuICogZG9tYWluLWJvdW5kIG9uZS10aW1lLWNvZGUgQXV0b0ZpbGwsIHdoaWNoIHJlcXVpcmVzIGBAPGRvbWFpbj4gIzxjb2RlPmAgdG8gYmVcbiAqIHRoZSBtZXNzYWdlJ3MgZmluYWwgbGluZSAtIGhlbmNlIGEgZG9jdW1lbnQtbGV2ZWwgcHJvcCByYXRoZXIgdGhhbiBzb21ldGhpbmcgYVxuICogY2FsbGVyIGNhbiBhcHBlbmQgdG8gYGJvZHlgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgYnJhbmQsIHR5cGUgQnJhbmRDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIEJvZHksXG4gIENvbHVtbixcbiAgQ29udGFpbmVyLFxuICBIZWFkLFxuICBIZWFkaW5nLFxuICBIcixcbiAgSHRtbCxcbiAgSW1nLFxuICBMaW5rLFxuICBNYXJrZG93bixcbiAgUHJldmlldyxcbiAgUm93LFxuICBTZWN0aW9uLFxuICBUZXh0LFxufSBmcm9tIFwiQHJlYWN0LWVtYWlsL2NvbXBvbmVudHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG4vKiogRW1haWwtc2FmZSBicmFuZCB2YWx1ZXMgdXNlZCBieSB0aGUgUmVhY3QgRW1haWwgdGVtcGxhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQnJhbmQge1xuICBhY2NlbnQ6IHN0cmluZztcbiAgb25BY2NlbnQ/OiBzdHJpbmc7XG4gIGZvbnRGYW1pbHk6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgbG9nb1VybD86IHN0cmluZztcbiAgYmFja2dyb3VuZD86IHN0cmluZztcbiAgc3VyZmFjZT86IHN0cmluZztcbiAgZm9yZWdyb3VuZD86IHN0cmluZztcbiAgbXV0ZWQ/OiBzdHJpbmc7XG4gIGJvcmRlcj86IHN0cmluZztcbiAgdGFnbGluZT86IHN0cmluZztcbiAgd2Vic2l0ZT86IHN0cmluZztcbn1cblxuLyoqIENvbXBsZXRlIHZhbHVlcyBhZnRlciBhcHBseWluZyB0aGUgZGJ4LXRvb2xzIGRlZmF1bHQgYnJhbmQuICovXG5leHBvcnQgdHlwZSBSZXNvbHZlZEVtYWlsQnJhbmQgPSBSZXF1aXJlZDxcbiAgUGljazxcbiAgICBFbWFpbEJyYW5kLFxuICAgIHwgXCJhY2NlbnRcIlxuICAgIHwgXCJvbkFjY2VudFwiXG4gICAgfCBcImZvbnRGYW1pbHlcIlxuICAgIHwgXCJuYW1lXCJcbiAgICB8IFwiYmFja2dyb3VuZFwiXG4gICAgfCBcInN1cmZhY2VcIlxuICAgIHwgXCJmb3JlZ3JvdW5kXCJcbiAgICB8IFwibXV0ZWRcIlxuICAgIHwgXCJib3JkZXJcIlxuICAgIHwgXCJ0YWdsaW5lXCJcbiAgPlxuPiAmXG4gIFBpY2s8RW1haWxCcmFuZCwgXCJsb2dvVXJsXCIgfCBcIndlYnNpdGVcIj47XG5cbmZ1bmN0aW9uIGlzUmVuZGVyYWJsZUltYWdlVXJsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIC9eKD86aHR0cHM/OnxkYXRhOnxjaWQ6KS9pLnRlc3QodmFsdWUpO1xufVxuXG4vKiogUHJvamVjdCBhIHBvcnRhYmxlIGJyYW5kIGNvbnRleHQgaW50byBlbWFpbC1zYWZlIHZhbHVlcy4gKi9cbmV4cG9ydCBjb25zdCBlbWFpbEJyYW5kRnJvbUNvbnRleHQgPSAoY29udGV4dDogQnJhbmRDb250ZXh0KTogRW1haWxCcmFuZCA9PiB7XG4gIGNvbnN0IGxvZ28gPSBjb250ZXh0LmFzc2V0cy5sb2dvLmRhcmsgPz8gY29udGV4dC5hc3NldHMubG9nby5saWdodDtcbiAgcmV0dXJuIHtcbiAgICBhY2NlbnQ6IGNvbnRleHQuY29sb3JzLnByaW1hcnksXG4gICAgb25BY2NlbnQ6IFwiI2ZmZmZmZlwiLFxuICAgIGZvbnRGYW1pbHk6IGNvbnRleHQudHlwb2dyYXBoeS5zYW5zLFxuICAgIG5hbWU6IGNvbnRleHQubmFtZSxcbiAgICBiYWNrZ3JvdW5kOiBjb250ZXh0LmNvbG9ycy5zdXJmYWNlLFxuICAgIHN1cmZhY2U6IGNvbnRleHQuY29sb3JzLmJhY2tncm91bmQsXG4gICAgZm9yZWdyb3VuZDogY29udGV4dC5jb2xvcnMuZm9yZWdyb3VuZCxcbiAgICBtdXRlZDogY29udGV4dC5jb2xvcnMubXV0ZWQsXG4gICAgYm9yZGVyOiBjb250ZXh0LmNvbG9ycy5ib3JkZXIsXG4gICAgdGFnbGluZTogY29udGV4dC50YWdsaW5lLFxuICAgIHdlYnNpdGU6IGNvbnRleHQubGlua3Mud2Vic2l0ZSxcbiAgICAuLi4oaXNSZW5kZXJhYmxlSW1hZ2VVcmwobG9nbykgPyB7IGxvZ29Vcmw6IGxvZ28gfSA6IHt9KSxcbiAgfTtcbn07XG5cbi8qKiBUaGUgcmVwb3NpdG9yeSBicmFuZCB1c2VkIGJ5IGV2ZXJ5IGVtYWlsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4uICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEVtYWlsQnJhbmQ6IEVtYWlsQnJhbmQgPSBlbWFpbEJyYW5kRnJvbUNvbnRleHQoYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dCk7XG5cbi8qKiBNZXJnZSBhIHBhcnRpYWwgY29uc3VtZXIgYnJhbmQgb3ZlciB0aGUgcmVwb3NpdG9yeSBkZWZhdWx0LiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVFbWFpbEJyYW5kID0gKGlucHV0PzogRW1haWxCcmFuZCk6IFJlc29sdmVkRW1haWxCcmFuZCA9PiB7XG4gIGNvbnN0IG1lcmdlZCA9IHsgLi4uZGVmYXVsdEVtYWlsQnJhbmQsIC4uLmlucHV0IH07XG4gIHJldHVybiB7XG4gICAgYWNjZW50OiBtZXJnZWQuYWNjZW50LFxuICAgIG9uQWNjZW50OiBtZXJnZWQub25BY2NlbnQgPz8gXCIjZmZmZmZmXCIsXG4gICAgZm9udEZhbWlseTogbWVyZ2VkLmZvbnRGYW1pbHksXG4gICAgbmFtZTogbWVyZ2VkLm5hbWUgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5uYW1lLFxuICAgIGJhY2tncm91bmQ6IG1lcmdlZC5iYWNrZ3JvdW5kID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQuY29sb3JzLnN1cmZhY2UsXG4gICAgc3VyZmFjZTogbWVyZ2VkLnN1cmZhY2UgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMuYmFja2dyb3VuZCxcbiAgICBmb3JlZ3JvdW5kOiBtZXJnZWQuZm9yZWdyb3VuZCA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LmNvbG9ycy5mb3JlZ3JvdW5kLFxuICAgIG11dGVkOiBtZXJnZWQubXV0ZWQgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMubXV0ZWQsXG4gICAgYm9yZGVyOiBtZXJnZWQuYm9yZGVyID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQuY29sb3JzLmJvcmRlcixcbiAgICB0YWdsaW5lOiBtZXJnZWQudGFnbGluZSA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LnRhZ2xpbmUsXG4gICAgLi4uKG1lcmdlZC5sb2dvVXJsID8geyBsb2dvVXJsOiBtZXJnZWQubG9nb1VybCB9IDoge30pLFxuICAgIC4uLihtZXJnZWQud2Vic2l0ZSA/IHsgd2Vic2l0ZTogbWVyZ2VkLndlYnNpdGUgfSA6IHt9KSxcbiAgfTtcbn07XG5cbi8qKiBOb3JtYWxpemUgaW5kZW50YXRpb24gaW4gYXV0aG9yZWQgY29udGVudCB3aXRob3V0IGNvbnN0cmFpbmluZyBpdHMgc3RydWN0dXJlLiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUVtYWlsTWFya2Rvd24gPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKS5zcGxpdChcIlxcblwiKTtcbiAgd2hpbGUgKGxpbmVzWzBdPy50cmltKCkgPT09IFwiXCIpIGxpbmVzLnNoaWZ0KCk7XG4gIHdoaWxlIChsaW5lcy5hdCgtMSk/LnRyaW0oKSA9PT0gXCJcIikgbGluZXMucG9wKCk7XG4gIGNvbnN0IG5vbkJsYW5rID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgY29uc3QgaW5kZW50ID0gbm9uQmxhbmsucmVkdWNlKChtaW5pbXVtLCBsaW5lKSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSBsaW5lLm1hdGNoKC9eXFxzKi8pPy5bMF0ubGVuZ3RoID8/IDA7XG4gICAgcmV0dXJuIE1hdGgubWluKG1pbmltdW0sIHdpZHRoKTtcbiAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5kZW50KSB8fCBpbmRlbnQgPT09IDApIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKE1hdGgubWluKGluZGVudCwgbGluZS5sZW5ndGgpKSkuam9pbihcIlxcblwiKTtcbn07XG5cbi8qKiBQcm9wcyBmb3IgdGhlIHJldXNhYmxlIG1lc3NhZ2UtYm9keSBjb21wb25lbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQm9keVByb3BzIHtcbiAgYm9keTogc3RyaW5nO1xuICBicmFuZD86IEVtYWlsQnJhbmQ7XG59XG5cbi8qKiBSZW5kZXIgcmljaCBtZXNzYWdlIGNvbnRlbnQgd2l0aCBlbWFpbC1jbGllbnQtc2FmZSBpbmxpbmUgc3R5bGVzLiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsQm9keSA9ICh7IGJvZHksIGJyYW5kOiBicmFuZElucHV0IH06IEVtYWlsQm9keVByb3BzKSA9PiB7XG4gIGNvbnN0IHRoZW1lID0gcmVzb2x2ZUVtYWlsQnJhbmQoYnJhbmRJbnB1dCk7XG4gIHJldHVybiAoXG4gICAgPE1hcmtkb3duXG4gICAgICBtYXJrZG93bkNvbnRhaW5lclN0eWxlcz17e1xuICAgICAgICBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCxcbiAgICAgICAgZm9udEZhbWlseTogdGhlbWUuZm9udEZhbWlseSxcbiAgICAgICAgZm9udFNpemU6IFwiMTVweFwiLFxuICAgICAgICBsaW5lSGVpZ2h0OiBcIjEuNjVcIixcbiAgICAgIH19XG4gICAgICBtYXJrZG93bkN1c3RvbVN0eWxlcz17e1xuICAgICAgICBoMTogeyBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCwgZm9udFNpemU6IFwiMzBweFwiLCBsaW5lSGVpZ2h0OiBcIjEuMlwiLCBtYXJnaW46IFwiMCAwIDIwcHhcIiB9LFxuICAgICAgICBoMjogeyBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCwgZm9udFNpemU6IFwiMjNweFwiLCBsaW5lSGVpZ2h0OiBcIjEuM1wiLCBtYXJnaW46IFwiMjhweCAwIDEycHhcIiB9LFxuICAgICAgICBoMzogeyBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCwgZm9udFNpemU6IFwiMThweFwiLCBsaW5lSGVpZ2h0OiBcIjEuNFwiLCBtYXJnaW46IFwiMjRweCAwIDEwcHhcIiB9LFxuICAgICAgICBwOiB7IG1hcmdpbjogXCIwIDAgMTZweFwiIH0sXG4gICAgICAgIGxpbms6IHsgY29sb3I6IHRoZW1lLmFjY2VudCwgZm9udFdlaWdodDogNjAwLCB0ZXh0RGVjb3JhdGlvbjogXCJ1bmRlcmxpbmVcIiB9LFxuICAgICAgICBibG9ja1F1b3RlOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5iYWNrZ3JvdW5kLFxuICAgICAgICAgIGJvcmRlckxlZnQ6IGA0cHggc29saWQgJHt0aGVtZS5hY2NlbnR9YCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMCAxMHB4IDEwcHggMFwiLFxuICAgICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgIG1hcmdpbjogXCIyMHB4IDBcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjE0cHggMThweFwiLFxuICAgICAgICB9LFxuICAgICAgICBjb2RlSW5saW5lOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5iYWNrZ3JvdW5kLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1cHhcIixcbiAgICAgICAgICBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCxcbiAgICAgICAgICBmb250RmFtaWx5OiBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LnR5cG9ncmFwaHkubW9ubyxcbiAgICAgICAgICBmb250U2l6ZTogXCIxM3B4XCIsXG4gICAgICAgICAgcGFkZGluZzogXCIycHggNXB4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVCbG9jazoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuZm9yZWdyb3VuZCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTBweFwiLFxuICAgICAgICAgIGNvbG9yOiB0aGVtZS5zdXJmYWNlLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQudHlwb2dyYXBoeS5tb25vLFxuICAgICAgICAgIGZvbnRTaXplOiBcIjEzcHhcIixcbiAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjEuNTVcIixcbiAgICAgICAgICBtYXJnaW46IFwiMjBweCAwXCIsXG4gICAgICAgICAgcGFkZGluZzogXCIxNnB4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGhyOiB7IGJvcmRlckNvbG9yOiB0aGVtZS5ib3JkZXIsIG1hcmdpbjogXCIyOHB4IDBcIiB9LFxuICAgICAgICBpbWFnZTogeyBib3JkZXJSYWRpdXM6IFwiMTBweFwiLCBoZWlnaHQ6IFwiYXV0b1wiLCBtYXhXaWR0aDogXCIxMDAlXCIgfSxcbiAgICAgICAgbGk6IHsgbWFyZ2luOiBcIjZweCAwXCIgfSxcbiAgICAgICAgdGFibGU6IHsgYm9yZGVyQ29sbGFwc2U6IFwiY29sbGFwc2VcIiwgbWFyZ2luOiBcIjIwcHggMFwiLCB3aWR0aDogXCIxMDAlXCIgfSxcbiAgICAgICAgdGg6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhlbWUuYm9yZGVyfWAsXG4gICAgICAgICAgcGFkZGluZzogXCI5cHggMTJweFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHRkOiB7XG4gICAgICAgICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhlbWUuYm9yZGVyfWAsXG4gICAgICAgICAgcGFkZGluZzogXCI5cHggMTJweFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgID5cbiAgICAgIHtub3JtYWxpemVFbWFpbE1hcmtkb3duKGJvZHkpfVxuICAgIDwvTWFya2Rvd24+XG4gICk7XG59O1xuXG4vKiogUHJvcHMgZm9yIHRoZSBjb21wbGV0ZSBSZWFjdCBFbWFpbCBkb2N1bWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxEb2N1bWVudFByb3BzIGV4dGVuZHMgRW1haWxCb2R5UHJvcHMge1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICBoZWFkZXJzPzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPjtcbiAgZm9vdGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBtYWNoaW5lLXJlYWQgbGluZSBlbWl0dGVkIGFzIHRoZSB2ZXJ5IExBU1QgbGluZSBvZiBib3RoIE1JTUUgcGFydHMsIGFmdGVyXG4gICAqIHRoZSBicmFuZGVkIGZvb3RlciBhbmQgb3V0c2lkZSB0aGUgY2FyZC5cbiAgICpcbiAgICogVGhpcyBleGlzdHMgZm9yIEFwcGxlJ3MgZG9tYWluLWJvdW5kIG9uZS10aW1lLWNvZGUgQXV0b0ZpbGwsIHdob3NlIGZvcm1hdCBpc1xuICAgKiBgQDxkb21haW4+ICM8Y29kZT5gIGFuZCB3aGljaCBpT1Mgb25seSBob25vdXJzIHdoZW4gaXQgaXMgdGhlIGZpbmFsIGxpbmUgb2ZcbiAgICogdGhlIG1lc3NhZ2UgLSBzbyBpdCBjYW5ub3QgYmUgYXBwZW5kZWQgdG8gYGJvZHlgLCB3aGljaCB0aGUgYnJhbmRlZCBmb290ZXJcbiAgICogd291bGQgdGhlbiBmb2xsb3cuIFJlbmRlcmVkIGFzIHZpc2libGUtYnV0LXF1aWV0IHRleHQgcmF0aGVyIHRoYW4gaGlkZGVuXG4gICAqIChgZGlzcGxheTogbm9uZWAgY29udGVudCBpcyBhIHNwYW0gc2lnbmFsLCBhbmQgYSBjbGllbnQgdGhhdCBpZ25vcmVzIHRoZVxuICAgKiBjb252ZW50aW9uIHNob3VsZCBzaG93IHNvbWV0aGluZyBpbm5vY3VvdXMgcmF0aGVyIHRoYW4gbm90aGluZykuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgYXV0b2ZpbGxUcmFpbGVyfSwgd2hpY2ggYnVpbGRzIHRoZSBzdHJpbmcuXG4gICAqL1xuICB0cmFpbGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFwcGxlJ3MgZG9tYWluLWJvdW5kIEF1dG9GaWxsIHRyYWlsZXIsIGBAPGRvbWFpbj4gIzxjb2RlPmAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGVpdGhlciBwYXJ0IGlzIG1pc3NpbmcuXG4gKlxuICogaU9TIHJlYWRzIHRoaXMgdG8gYmluZCBhIGNvZGUgdG8gYSBzcGVjaWZpYyBXRUJTSVRFOiB3aXRoIGl0LCB0aGUga2V5Ym9hcmRcbiAqIG9mZmVycyB0aGUgY29kZSBvbmx5IGZvciB0aGUgbWF0Y2hpbmcgZG9tYWluLCB3aGljaCBpcyB3aGF0IHN0b3BzIGEgY29kZVxuICogcGhpc2hlZCBmcm9tIG9uZSBzaXRlIGJlaW5nIGF1dG9maWxsZWQgaW50byBhbm90aGVyLiBXaXRob3V0IGl0LCBpT1Mgc3RpbGxcbiAqIGRldGVjdHMgYSBjb2RlIGhldXJpc3RpY2FsbHkgZnJvbSB0aGUgY29udmVudGlvbmFsIGxheW91dCAocHJvbXB0IGxpbmUsIGJhcmVcbiAqIGNvZGUgYWxvbmUgb24gdGhlIG5leHQgbGluZSksIGFzIGRvIEdtYWlsLCBPdXRsb29rLCBhbmQgQW5kcm9pZCAtIHNvIHRoaXMgaXMgYVxuICogc3RyaWN0IHVwZ3JhZGUgb24gdG9wIG9mIHRoYXQgYmFzZWxpbmUsIG5ldmVyIGEgcmVwbGFjZW1lbnQgZm9yIGl0LlxuICpcbiAqIFRoZSBkb21haW4gaXMgbm9ybWFsaXplZCB0byBiYXJlIGhvc3QgZm9ybTogYSBzY2hlbWUsIGEgYHd3dy5gIHByZWZpeCwgYW55XG4gKiBwYXRoLCBhbmQgYSB0cmFpbGluZyBkb3QgYXJlIHN0cmlwcGVkLCBzaW5jZSBpT1MgbWF0Y2hlcyB0aGUgaG9zdCB0aGUgc2l0ZSBpc1xuICogc2VydmVkIGZyb20uIEEgZG9tYWluIHdpdGggbm8gZG90IChgbG9jYWxob3N0YCkgaXMgcmVqZWN0ZWQgLSBpdCBjYW5ub3QgYmUgdGhlXG4gKiBwdWJsaWMgaG9zdCBvZiBhIHJlYWwgZGVwbG95bWVudCwgYW5kIGEgdHJhaWxlciBpT1Mgd2lsbCBuZXZlciBtYXRjaCBpcyBqdXN0IGFcbiAqIGNvbmZ1c2luZyBsaW5lIGluIHRoZSBlbWFpbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYXV0b2ZpbGxUcmFpbGVyKFwiZGVtby5hcHBzLmRieC50b29sc1wiLCBcIjEyMzQ1NlwiKTsgLy8gXCJAZGVtby5hcHBzLmRieC50b29scyAjMTIzNDU2XCJcbiAqIGF1dG9maWxsVHJhaWxlcihcImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2FwcFwiLCBcIjEyMzQ1NlwiKTsgLy8gXCJAZXhhbXBsZS5jb20gIzEyMzQ1NlwiXG4gKi9cbmV4cG9ydCBjb25zdCBhdXRvZmlsbFRyYWlsZXIgPSAoXG4gIGRvbWFpbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWRvbWFpbiB8fCAhY29kZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaG9zdCA9IGRvbWFpblxuICAgIC50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9eW2Etel1bYS16XFxkKy4tXSo6XFwvXFwvLywgXCJcIilcbiAgICAucmVwbGFjZSgvXnd3d1xcLi8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1svPyNdLiokLywgXCJcIilcbiAgICAucmVwbGFjZSgvXFwuJC8sIFwiXCIpXG4gICAgLnJlcGxhY2UoLzpcXGQrJC8sIFwiXCIpO1xuICBpZiAoIWhvc3QuaW5jbHVkZXMoXCIuXCIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYEAke2hvc3R9ICMke2NvZGUudHJpbSgpfWA7XG59O1xuXG5mdW5jdGlvbiBCcmFuZE1hcmsoeyB0aGVtZSB9OiB7IHRoZW1lOiBSZXNvbHZlZEVtYWlsQnJhbmQgfSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICh0aGVtZS5sb2dvVXJsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxJbWdcbiAgICAgICAgc3JjPXt0aGVtZS5sb2dvVXJsfVxuICAgICAgICBhbHQ9e3RoZW1lLm5hbWV9XG4gICAgICAgIGhlaWdodD1cIjM0XCJcbiAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogXCJibG9ja1wiLCBoZWlnaHQ6IFwiMzRweFwiLCB3aWR0aDogXCJhdXRvXCIgfX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxUZXh0XG4gICAgICBzdHlsZT17e1xuICAgICAgICBjb2xvcjogdGhlbWUub25BY2NlbnQsXG4gICAgICAgIGZvbnRTaXplOiBcIjIwcHhcIixcbiAgICAgICAgZm9udFdlaWdodDogODAwLFxuICAgICAgICBsZXR0ZXJTcGFjaW5nOiBcIi0wLjNweFwiLFxuICAgICAgICBtYXJnaW46IDAsXG4gICAgICB9fVxuICAgID5cbiAgICAgIHt0aGVtZS5uYW1lfVxuICAgIDwvVGV4dD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gRW52ZWxvcGVIZWFkZXJzKHtcbiAgaGVhZGVycyxcbiAgdGhlbWUsXG59OiB7XG4gIGhlYWRlcnM6IEVtYWlsRG9jdW1lbnRQcm9wc1tcImhlYWRlcnNcIl07XG4gIHRoZW1lOiBSZXNvbHZlZEVtYWlsQnJhbmQ7XG59KSB7XG4gIGlmICghaGVhZGVycz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChcbiAgICA8U2VjdGlvblxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5iYWNrZ3JvdW5kLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTBweFwiLFxuICAgICAgICBtYXJnaW46IFwiMCAwIDI0cHhcIixcbiAgICAgICAgcGFkZGluZzogXCIxNHB4IDE2cHhcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAge2hlYWRlcnMubWFwKChbbGFiZWwsIHZhbHVlXSkgPT4gKFxuICAgICAgICA8Um93IGtleT17YCR7bGFiZWx9OiR7dmFsdWV9YH0+XG4gICAgICAgICAgPENvbHVtblxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgY29sb3I6IHRoZW1lLm11dGVkLFxuICAgICAgICAgICAgICBmb250U2l6ZTogXCIxMnB4XCIsXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDcwMCxcbiAgICAgICAgICAgICAgcGFkZGluZzogXCIzcHggMTJweCAzcHggMFwiLFxuICAgICAgICAgICAgICB3aWR0aDogXCI3MHB4XCIsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICA8Q29sdW1uIHN0eWxlPXt7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIxM3B4XCIsIHBhZGRpbmc6IFwiM3B4IDBcIiB9fT5cbiAgICAgICAgICAgIHt2YWx1ZX1cbiAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgPC9Sb3c+XG4gICAgICApKX1cbiAgICA8L1NlY3Rpb24+XG4gICk7XG59XG5cbi8qKiBCcmFuZGVkIG1lc3NhZ2UgY2FyZCBzaGFyZWQgYnkgdGhlIGZ1bGwgZG9jdW1lbnQgYW5kIGJyb3dzZXIgcHJldmlld3MuICovXG5leHBvcnQgY29uc3QgRW1haWxDYXJkID0gKHtcbiAgYm9keSxcbiAgc3ViamVjdCA9IFwiTWVzc2FnZVwiLFxuICBoZWFkZXJzLFxuICBmb290ZXIsXG4gIGJyYW5kOiBicmFuZElucHV0LFxufTogRW1haWxEb2N1bWVudFByb3BzKSA9PiB7XG4gIGNvbnN0IHRoZW1lID0gcmVzb2x2ZUVtYWlsQnJhbmQoYnJhbmRJbnB1dCk7XG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lclxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5zdXJmYWNlLFxuICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHt0aGVtZS5ib3JkZXJ9YCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjE2cHhcIixcbiAgICAgICAgYm94U2hhZG93OiBcIjAgOHB4IDMwcHggcmdiYSgyNyw0OSw1NywwLjA4KVwiLFxuICAgICAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgICAgICBtYXJnaW46IFwiMCBhdXRvXCIsXG4gICAgICAgIG1heFdpZHRoOiBcIjYyMHB4XCIsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8U2VjdGlvbiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmFjY2VudCwgcGFkZGluZzogXCIyMnB4IDMwcHhcIiB9fT5cbiAgICAgICAgPEJyYW5kTWFyayB0aGVtZT17dGhlbWV9IC8+XG4gICAgICA8L1NlY3Rpb24+XG4gICAgICA8U2VjdGlvbiBzdHlsZT17eyBwYWRkaW5nOiBcIjM0cHggMzRweCAyNHB4XCIgfX0+XG4gICAgICAgIDxIZWFkaW5nXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgICAgZm9udFNpemU6IFwiMjhweFwiLFxuICAgICAgICAgICAgbGV0dGVyU3BhY2luZzogXCItMC41cHhcIixcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMS4yXCIsXG4gICAgICAgICAgICBtYXJnaW46IFwiMCAwIDI0cHhcIixcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3N1YmplY3R9XG4gICAgICAgIDwvSGVhZGluZz5cbiAgICAgICAgPEVudmVsb3BlSGVhZGVycyBoZWFkZXJzPXtoZWFkZXJzfSB0aGVtZT17dGhlbWV9IC8+XG4gICAgICAgIDxFbWFpbEJvZHkgYm9keT17Ym9keX0gYnJhbmQ9e3RoZW1lfSAvPlxuICAgICAgPC9TZWN0aW9uPlxuICAgICAgPEhyIHN0eWxlPXt7IGJvcmRlckNvbG9yOiB0aGVtZS5ib3JkZXIsIG1hcmdpbjogMCB9fSAvPlxuICAgICAgPFNlY3Rpb24gc3R5bGU9e3sgcGFkZGluZzogXCIyMHB4IDM0cHggMjZweFwiIH19PlxuICAgICAgICA8VGV4dFxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBjb2xvcjogdGhlbWUubXV0ZWQsXG4gICAgICAgICAgICBmb250U2l6ZTogXCIxMnB4XCIsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjEuNTVcIixcbiAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge2Zvb3RlciA/PyB0aGVtZS50YWdsaW5lfXtcIiBcIn1cbiAgICAgICAgICB7dGhlbWUud2Vic2l0ZSA/IChcbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9e3RoZW1lLndlYnNpdGV9XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgY29sb3I6IHRoZW1lLmFjY2VudCxcbiAgICAgICAgICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJub25lXCIsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0aGVtZS5uYW1lfVxuICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L1NlY3Rpb24+XG4gICAgPC9Db250YWluZXI+XG4gICk7XG59O1xuXG4vKipcbiAqIFRoZSBtYWNoaW5lLXJlYWQgdHJhaWxlciBsaW5lLCByZW5kZXJlZCBMQVNUIGFuZCBvdXRzaWRlIHRoZSBjYXJkLlxuICpcbiAqIERlbGliZXJhdGVseSB0aGUgZmluYWwgZWxlbWVudCBvZiBgPEJvZHk+YDogaU9TIG9ubHkgYmluZHMgYSBjb2RlIHRvIGEgZG9tYWluXG4gKiB3aGVuIGBAPGRvbWFpbj4gIzxjb2RlPmAgaXMgdGhlIGxhc3QgbGluZSBvZiB0aGUgbWVzc2FnZSwgc28gbm90aGluZyAtIG5vdCBldmVuXG4gKiB0aGUgYnJhbmRlZCBmb290ZXIgLSBtYXkgZm9sbG93IGl0LiBTdHlsZWQgc21hbGwgYW5kIG11dGVkIHJhdGhlciB0aGFuIGhpZGRlbixcbiAqIGJlY2F1c2UgYGRpc3BsYXk6IG5vbmVgIHRleHQgaXMgYSBzcGFtLWZpbHRlciBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIEF1dG9maWxsVHJhaWxlcih7XG4gIHRyYWlsZXIsXG4gIHRoZW1lLFxufToge1xuICB0cmFpbGVyPzogc3RyaW5nO1xuICB0aGVtZTogUmVzb2x2ZWRFbWFpbEJyYW5kO1xufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICghdHJhaWxlcikgcmV0dXJuIG51bGw7XG4gIHJldHVybiAoXG4gICAgPFRleHRcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5tdXRlZCxcbiAgICAgICAgZm9udEZhbWlseTogdGhlbWUuZm9udEZhbWlseSxcbiAgICAgICAgZm9udFNpemU6IFwiMTFweFwiLFxuICAgICAgICBtYXJnaW46IFwiMTZweCBhdXRvIDBcIixcbiAgICAgICAgbWF4V2lkdGg6IFwiNjIwcHhcIixcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7dHJhaWxlcn1cbiAgICA8L1RleHQ+XG4gICk7XG59XG5cbi8qKiBDb21wbGV0ZSByZXNwb25zaXZlLCBicmFuZGVkIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsRG9jdW1lbnQgPSAocHJvcHM6IEVtYWlsRG9jdW1lbnRQcm9wcykgPT4ge1xuICBjb25zdCB0aGVtZSA9IHJlc29sdmVFbWFpbEJyYW5kKHByb3BzLmJyYW5kKTtcbiAgY29uc3QgcGFnZVN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuYmFja2dyb3VuZCxcbiAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiBcIjI4cHggMTJweFwiLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxIdG1sIGxhbmc9XCJlblwiPlxuICAgICAgPEhlYWQgLz5cbiAgICAgIDxQcmV2aWV3Pntwcm9wcy5zdWJqZWN0ID8/IFwiTWVzc2FnZVwifTwvUHJldmlldz5cbiAgICAgIDxCb2R5IHN0eWxlPXtwYWdlU3R5bGV9PlxuICAgICAgICA8RW1haWxDYXJkIHsuLi5wcm9wc30gLz5cbiAgICAgICAgPEF1dG9maWxsVHJhaWxlciB0cmFpbGVyPXtwcm9wcy50cmFpbGVyfSB0aGVtZT17dGhlbWV9IC8+XG4gICAgICA8L0JvZHk+XG4gICAgPC9IdG1sPlxuICApO1xufTtcbiJdfQ==
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxLQUFLLEVBQXFCLE1BQU0sd0JBQXdCLENBQUM7QUFDbEUsT0FBTyxFQUNMLElBQUksRUFDSixNQUFNLEVBQ04sU0FBUyxFQUNULElBQUksRUFDSixPQUFPLEVBQ1AsRUFBRSxFQUNGLElBQUksRUFDSixHQUFHLEVBQ0gsSUFBSSxFQUNKLFFBQVEsRUFDUixPQUFPLEVBQ1AsR0FBRyxFQUNILE9BQU8sRUFDUCxJQUFJLEdBQ0wsTUFBTSx5QkFBeUIsQ0FBQztBQXFDakMsU0FBUyxvQkFBb0IsQ0FBQyxLQUF5QjtJQUNyRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLE9BQXFCLEVBQWMsRUFBRTtJQUN6RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ25FLE9BQU87UUFDTCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQzlCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDbkMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU87UUFDbEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUNsQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ3JDLEtB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akMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1FBQzVCLE1BQU0sRUFBRSxDQUFDO1FBQ1QsT0FBTyxFQUFFLFdBQVc7S0FDckIsQ0FBQztJQUNGLE9BQU8sQ0FDTCxNQUFDLElBQUksSUFBQyxJQUFJLEVBQUMsSUFBSSxhQUNiLEtBQUMsSUFBSSxLQUFHLEVBQ1IsS0FBQyxPQUFPLGNBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLEdBQVcsRUFDL0MsS0FBQyxJQUFJLElBQUMsS0FBSyxFQUFFLFNBQVMsWUFDcEIsS0FBQyxTQUFTLE9BQUssS0FBSyxHQUFJLEdBQ25CLElBQ0YsQ0FDUixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVbml2ZXJzYWwgUmVhY3QgRW1haWwgcHJlc2VudGF0aW9uIGZvciBkYngtdG9vbHMgZW1haWwgZmxvd3MuXG4gKlxuICogVGhlIGRvY3VtZW50IGNvbXBvbmVudCByZW5kZXJzIG9uIHRoZSBzZXJ2ZXIgdGhyb3VnaCBgQHJlYWN0LWVtYWlsL3JlbmRlcmA7XG4gKiB0aGUgYm9keSBjb21wb25lbnQgaXMgcmV1c2VkIGRpcmVjdGx5IGJ5IGJyb3dzZXIgYXBwcm92YWwgYW5kIGNvbXBvc2Ugdmlld3MuXG4gKiBCb3RoIGRlZmF1bHQgdG8gdGhlIHJlcG9zaXRvcnkgYnJhbmQgd2hpbGUgYWNjZXB0aW5nIGEgY29uc3VtZXIgb3ZlcnJpZGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBicmFuZCwgdHlwZSBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgQm9keSxcbiAgQ29sdW1uLFxuICBDb250YWluZXIsXG4gIEhlYWQsXG4gIEhlYWRpbmcsXG4gIEhyLFxuICBIdG1sLFxuICBJbWcsXG4gIExpbmssXG4gIE1hcmtkb3duLFxuICBQcmV2aWV3LFxuICBSb3csXG4gIFNlY3Rpb24sXG4gIFRleHQsXG59IGZyb20gXCJAcmVhY3QtZW1haWwvY29tcG9uZW50c1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbi8qKiBFbWFpbC1zYWZlIGJyYW5kIHZhbHVlcyB1c2VkIGJ5IHRoZSBSZWFjdCBFbWFpbCB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxCcmFuZCB7XG4gIGFjY2VudDogc3RyaW5nO1xuICBvbkFjY2VudD86IHN0cmluZztcbiAgZm9udEZhbWlseTogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICBsb2dvVXJsPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBzdXJmYWNlPzogc3RyaW5nO1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBtdXRlZD86IHN0cmluZztcbiAgYm9yZGVyPzogc3RyaW5nO1xuICB0YWdsaW5lPzogc3RyaW5nO1xuICB3ZWJzaXRlPzogc3RyaW5nO1xufVxuXG4vKiogQ29tcGxldGUgdmFsdWVzIGFmdGVyIGFwcGx5aW5nIHRoZSBkYngtdG9vbHMgZGVmYXVsdCBicmFuZC4gKi9cbmV4cG9ydCB0eXBlIFJlc29sdmVkRW1haWxCcmFuZCA9IFJlcXVpcmVkPFxuICBQaWNrPFxuICAgIEVtYWlsQnJhbmQsXG4gICAgfCBcImFjY2VudFwiXG4gICAgfCBcIm9uQWNjZW50XCJcbiAgICB8IFwiZm9udEZhbWlseVwiXG4gICAgfCBcIm5hbWVcIlxuICAgIHwgXCJiYWNrZ3JvdW5kXCJcbiAgICB8IFwic3VyZmFjZVwiXG4gICAgfCBcImZvcmVncm91bmRcIlxuICAgIHwgXCJtdXRlZFwiXG4gICAgfCBcImJvcmRlclwiXG4gICAgfCBcInRhZ2xpbmVcIlxuICA+XG4+ICZcbiAgUGljazxFbWFpbEJyYW5kLCBcImxvZ29VcmxcIiB8IFwid2Vic2l0ZVwiPjtcblxuZnVuY3Rpb24gaXNSZW5kZXJhYmxlSW1hZ2VVcmwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgL14oPzpodHRwcz86fGRhdGE6fGNpZDopL2kudGVzdCh2YWx1ZSk7XG59XG5cbi8qKiBQcm9qZWN0IGEgcG9ydGFibGUgYnJhbmQgY29udGV4dCBpbnRvIGVtYWlsLXNhZmUgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IGVtYWlsQnJhbmRGcm9tQ29udGV4dCA9IChjb250ZXh0OiBCcmFuZENvbnRleHQpOiBFbWFpbEJyYW5kID0+IHtcbiAgY29uc3QgbG9nbyA9IGNvbnRleHQuYXNzZXRzLmxvZ28uZGFyayA/PyBjb250ZXh0LmFzc2V0cy5sb2dvLmxpZ2h0O1xuICByZXR1cm4ge1xuICAgIGFjY2VudDogY29udGV4dC5jb2xvcnMucHJpbWFyeSxcbiAgICBvbkFjY2VudDogXCIjZmZmZmZmXCIsXG4gICAgZm9udEZhbWlseTogY29udGV4dC50eXBvZ3JhcGh5LnNhbnMsXG4gICAgbmFtZTogY29udGV4dC5uYW1lLFxuICAgIGJhY2tncm91bmQ6IGNvbnRleHQuY29sb3JzLnN1cmZhY2UsXG4gICAgc3VyZmFjZTogY29udGV4dC5jb2xvcnMuYmFja2dyb3VuZCxcbiAgICBmb3JlZ3JvdW5kOiBjb250ZXh0LmNvbG9ycy5mb3JlZ3JvdW5kLFxuICAgIG11dGVkOiBjb250ZXh0LmNvbG9ycy5tdXRlZCxcbiAgICBib3JkZXI6IGNvbnRleHQuY29sb3JzLmJvcmRlcixcbiAgICB0YWdsaW5lOiBjb250ZXh0LnRhZ2xpbmUsXG4gICAgd2Vic2l0ZTogY29udGV4dC5saW5rcy53ZWJzaXRlLFxuICAgIC4uLihpc1JlbmRlcmFibGVJbWFnZVVybChsb2dvKSA/IHsgbG9nb1VybDogbG9nbyB9IDoge30pLFxuICB9O1xufTtcblxuLyoqIFRoZSByZXBvc2l0b3J5IGJyYW5kIHVzZWQgYnkgZXZlcnkgZW1haWwgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbi4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RW1haWxCcmFuZDogRW1haWxCcmFuZCA9IGVtYWlsQnJhbmRGcm9tQ29udGV4dChicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0KTtcblxuLyoqIE1lcmdlIGEgcGFydGlhbCBjb25zdW1lciBicmFuZCBvdmVyIHRoZSByZXBvc2l0b3J5IGRlZmF1bHQuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUVtYWlsQnJhbmQgPSAoaW5wdXQ/OiBFbWFpbEJyYW5kKTogUmVzb2x2ZWRFbWFpbEJyYW5kID0+IHtcbiAgY29uc3QgbWVyZ2VkID0geyAuLi5kZWZhdWx0RW1haWxCcmFuZCwgLi4uaW5wdXQgfTtcbiAgcmV0dXJuIHtcbiAgICBhY2NlbnQ6IG1lcmdlZC5hY2NlbnQsXG4gICAgb25BY2NlbnQ6IG1lcmdlZC5vbkFjY2VudCA/PyBcIiNmZmZmZmZcIixcbiAgICBmb250RmFtaWx5OiBtZXJnZWQuZm9udEZhbWlseSxcbiAgICBuYW1lOiBtZXJnZWQubmFtZSA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0Lm5hbWUsXG4gICAgYmFja2dyb3VuZDogbWVyZ2VkLmJhY2tncm91bmQgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMuc3VyZmFjZSxcbiAgICBzdXJmYWNlOiBtZXJnZWQuc3VyZmFjZSA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LmNvbG9ycy5iYWNrZ3JvdW5kLFxuICAgIGZvcmVncm91bmQ6IG1lcmdlZC5mb3JlZ3JvdW5kID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQuY29sb3JzLmZvcmVncm91bmQsXG4gICAgbXV0ZWQ6IG1lcmdlZC5tdXRlZCA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LmNvbG9ycy5tdXRlZCxcbiAgICBib3JkZXI6IG1lcmdlZC5ib3JkZXIgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMuYm9yZGVyLFxuICAgIHRhZ2xpbmU6IG1lcmdlZC50YWdsaW5lID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQudGFnbGluZSxcbiAgICAuLi4obWVyZ2VkLmxvZ29VcmwgPyB7IGxvZ29Vcmw6IG1lcmdlZC5sb2dvVXJsIH0gOiB7fSksXG4gICAgLi4uKG1lcmdlZC53ZWJzaXRlID8geyB3ZWJzaXRlOiBtZXJnZWQud2Vic2l0ZSB9IDoge30pLFxuICB9O1xufTtcblxuLyoqIE5vcm1hbGl6ZSBpbmRlbnRhdGlvbiBpbiBhdXRob3JlZCBjb250ZW50IHdpdGhvdXQgY29uc3RyYWluaW5nIGl0cyBzdHJ1Y3R1cmUuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplRW1haWxNYXJrZG93biA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpLnNwbGl0KFwiXFxuXCIpO1xuICB3aGlsZSAobGluZXNbMF0/LnRyaW0oKSA9PT0gXCJcIikgbGluZXMuc2hpZnQoKTtcbiAgd2hpbGUgKGxpbmVzLmF0KC0xKT8udHJpbSgpID09PSBcIlwiKSBsaW5lcy5wb3AoKTtcbiAgY29uc3Qgbm9uQmxhbmsgPSBsaW5lcy5maWx0ZXIoKGxpbmUpID0+IGxpbmUudHJpbSgpLmxlbmd0aCA+IDApO1xuICBjb25zdCBpbmRlbnQgPSBub25CbGFuay5yZWR1Y2UoKG1pbmltdW0sIGxpbmUpID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IGxpbmUubWF0Y2goL15cXHMqLyk/LlswXS5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gTWF0aC5taW4obWluaW11bSwgd2lkdGgpO1xuICB9LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbmRlbnQpIHx8IGluZGVudCA9PT0gMCkgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIHJldHVybiBsaW5lcy5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoTWF0aC5taW4oaW5kZW50LCBsaW5lLmxlbmd0aCkpKS5qb2luKFwiXFxuXCIpO1xufTtcblxuLyoqIFByb3BzIGZvciB0aGUgcmV1c2FibGUgbWVzc2FnZS1ib2R5IGNvbXBvbmVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxCb2R5UHJvcHMge1xuICBib2R5OiBzdHJpbmc7XG4gIGJyYW5kPzogRW1haWxCcmFuZDtcbn1cblxuLyoqIFJlbmRlciByaWNoIG1lc3NhZ2UgY29udGVudCB3aXRoIGVtYWlsLWNsaWVudC1zYWZlIGlubGluZSBzdHlsZXMuICovXG5leHBvcnQgY29uc3QgRW1haWxCb2R5ID0gKHsgYm9keSwgYnJhbmQ6IGJyYW5kSW5wdXQgfTogRW1haWxCb2R5UHJvcHMpID0+IHtcbiAgY29uc3QgdGhlbWUgPSByZXNvbHZlRW1haWxCcmFuZChicmFuZElucHV0KTtcbiAgcmV0dXJuIChcbiAgICA8TWFya2Rvd25cbiAgICAgIG1hcmtkb3duQ29udGFpbmVyU3R5bGVzPXt7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgICAgICBmb250U2l6ZTogXCIxNXB4XCIsXG4gICAgICAgIGxpbmVIZWlnaHQ6IFwiMS42NVwiLFxuICAgICAgfX1cbiAgICAgIG1hcmtkb3duQ3VzdG9tU3R5bGVzPXt7XG4gICAgICAgIGgxOiB7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIzMHB4XCIsIGxpbmVIZWlnaHQ6IFwiMS4yXCIsIG1hcmdpbjogXCIwIDAgMjBweFwiIH0sXG4gICAgICAgIGgyOiB7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIyM3B4XCIsIGxpbmVIZWlnaHQ6IFwiMS4zXCIsIG1hcmdpbjogXCIyOHB4IDAgMTJweFwiIH0sXG4gICAgICAgIGgzOiB7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIxOHB4XCIsIGxpbmVIZWlnaHQ6IFwiMS40XCIsIG1hcmdpbjogXCIyNHB4IDAgMTBweFwiIH0sXG4gICAgICAgIHA6IHsgbWFyZ2luOiBcIjAgMCAxNnB4XCIgfSxcbiAgICAgICAgbGluazogeyBjb2xvcjogdGhlbWUuYWNjZW50LCBmb250V2VpZ2h0OiA2MDAsIHRleHREZWNvcmF0aW9uOiBcInVuZGVybGluZVwiIH0sXG4gICAgICAgIGJsb2NrUXVvdGU6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgICAgYm9yZGVyTGVmdDogYDRweCBzb2xpZCAke3RoZW1lLmFjY2VudH1gLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCIwIDEwcHggMTBweCAwXCIsXG4gICAgICAgICAgY29sb3I6IHRoZW1lLmZvcmVncm91bmQsXG4gICAgICAgICAgbWFyZ2luOiBcIjIwcHggMFwiLFxuICAgICAgICAgIHBhZGRpbmc6IFwiMTRweCAxOHB4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVJbmxpbmU6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiLFxuICAgICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQudHlwb2dyYXBoeS5tb25vLFxuICAgICAgICAgIGZvbnRTaXplOiBcIjEzcHhcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjJweCA1cHhcIixcbiAgICAgICAgfSxcbiAgICAgICAgY29kZUJsb2NrOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCIxMHB4XCIsXG4gICAgICAgICAgY29sb3I6IHRoZW1lLnN1cmZhY2UsXG4gICAgICAgICAgZm9udEZhbWlseTogYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC50eXBvZ3JhcGh5Lm1vbm8sXG4gICAgICAgICAgZm9udFNpemU6IFwiMTNweFwiLFxuICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMS41NVwiLFxuICAgICAgICAgIG1hcmdpbjogXCIyMHB4IDBcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjE2cHhcIixcbiAgICAgICAgfSxcbiAgICAgICAgaHI6IHsgYm9yZGVyQ29sb3I6IHRoZW1lLmJvcmRlciwgbWFyZ2luOiBcIjI4cHggMFwiIH0sXG4gICAgICAgIGltYWdlOiB7IGJvcmRlclJhZGl1czogXCIxMHB4XCIsIGhlaWdodDogXCJhdXRvXCIsIG1heFdpZHRoOiBcIjEwMCVcIiB9LFxuICAgICAgICBsaTogeyBtYXJnaW46IFwiNnB4IDBcIiB9LFxuICAgICAgICB0YWJsZTogeyBib3JkZXJDb2xsYXBzZTogXCJjb2xsYXBzZVwiLCBtYXJnaW46IFwiMjBweCAwXCIsIHdpZHRoOiBcIjEwMCVcIiB9LFxuICAgICAgICB0aDoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuYmFja2dyb3VuZCxcbiAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHt0aGVtZS5ib3JkZXJ9YCxcbiAgICAgICAgICBwYWRkaW5nOiBcIjlweCAxMnB4XCIsXG4gICAgICAgICAgdGV4dEFsaWduOiBcImxlZnRcIixcbiAgICAgICAgfSxcbiAgICAgICAgdGQ6IHtcbiAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHt0aGVtZS5ib3JkZXJ9YCxcbiAgICAgICAgICBwYWRkaW5nOiBcIjlweCAxMnB4XCIsXG4gICAgICAgICAgdGV4dEFsaWduOiBcImxlZnRcIixcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge25vcm1hbGl6ZUVtYWlsTWFya2Rvd24oYm9keSl9XG4gICAgPC9NYXJrZG93bj5cbiAgKTtcbn07XG5cbi8qKiBQcm9wcyBmb3IgdGhlIGNvbXBsZXRlIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbERvY3VtZW50UHJvcHMgZXh0ZW5kcyBFbWFpbEJvZHlQcm9wcyB7XG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZ10+O1xuICBmb290ZXI/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIEJyYW5kTWFyayh7IHRoZW1lIH06IHsgdGhlbWU6IFJlc29sdmVkRW1haWxCcmFuZCB9KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgaWYgKHRoZW1lLmxvZ29VcmwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEltZ1xuICAgICAgICBzcmM9e3RoZW1lLmxvZ29Vcmx9XG4gICAgICAgIGFsdD17dGhlbWUubmFtZX1cbiAgICAgICAgaGVpZ2h0PVwiMzRcIlxuICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiBcImJsb2NrXCIsIGhlaWdodDogXCIzNHB4XCIsIHdpZHRoOiBcImF1dG9cIiB9fVxuICAgICAgLz5cbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgPFRleHRcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5vbkFjY2VudCxcbiAgICAgICAgZm9udFNpemU6IFwiMjBweFwiLFxuICAgICAgICBmb250V2VpZ2h0OiA4MDAsXG4gICAgICAgIGxldHRlclNwYWNpbmc6IFwiLTAuM3B4XCIsXG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgIH19XG4gICAgPlxuICAgICAge3RoZW1lLm5hbWV9XG4gICAgPC9UZXh0PlxuICApO1xufVxuXG5mdW5jdGlvbiBFbnZlbG9wZUhlYWRlcnMoe1xuICBoZWFkZXJzLFxuICB0aGVtZSxcbn06IHtcbiAgaGVhZGVyczogRW1haWxEb2N1bWVudFByb3BzW1wiaGVhZGVyc1wiXTtcbiAgdGhlbWU6IFJlc29sdmVkRW1haWxCcmFuZDtcbn0pIHtcbiAgaWYgKCFoZWFkZXJzPy5sZW5ndGgpIHJldHVybiBudWxsO1xuICByZXR1cm4gKFxuICAgIDxTZWN0aW9uXG4gICAgICBzdHlsZT17e1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIxMHB4XCIsXG4gICAgICAgIG1hcmdpbjogXCIwIDAgMjRweFwiLFxuICAgICAgICBwYWRkaW5nOiBcIjE0cHggMTZweFwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7aGVhZGVycy5tYXAoKFtsYWJlbCwgdmFsdWVdKSA9PiAoXG4gICAgICAgIDxSb3cga2V5PXtgJHtsYWJlbH06JHt2YWx1ZX1gfT5cbiAgICAgICAgICA8Q29sdW1uXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBjb2xvcjogdGhlbWUubXV0ZWQsXG4gICAgICAgICAgICAgIGZvbnRTaXplOiBcIjEycHhcIixcbiAgICAgICAgICAgICAgZm9udFdlaWdodDogNzAwLFxuICAgICAgICAgICAgICBwYWRkaW5nOiBcIjNweCAxMnB4IDNweCAwXCIsXG4gICAgICAgICAgICAgIHdpZHRoOiBcIjcwcHhcIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2xhYmVsfVxuICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgIDxDb2x1bW4gc3R5bGU9e3sgY29sb3I6IHRoZW1lLmZvcmVncm91bmQsIGZvbnRTaXplOiBcIjEzcHhcIiwgcGFkZGluZzogXCIzcHggMFwiIH19PlxuICAgICAgICAgICAge3ZhbHVlfVxuICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICA8L1Jvdz5cbiAgICAgICkpfVxuICAgIDwvU2VjdGlvbj5cbiAgKTtcbn1cblxuLyoqIEJyYW5kZWQgbWVzc2FnZSBjYXJkIHNoYXJlZCBieSB0aGUgZnVsbCBkb2N1bWVudCBhbmQgYnJvd3NlciBwcmV2aWV3cy4gKi9cbmV4cG9ydCBjb25zdCBFbWFpbENhcmQgPSAoe1xuICBib2R5LFxuICBzdWJqZWN0ID0gXCJNZXNzYWdlXCIsXG4gIGhlYWRlcnMsXG4gIGZvb3RlcixcbiAgYnJhbmQ6IGJyYW5kSW5wdXQsXG59OiBFbWFpbERvY3VtZW50UHJvcHMpID0+IHtcbiAgY29uc3QgdGhlbWUgPSByZXNvbHZlRW1haWxCcmFuZChicmFuZElucHV0KTtcbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyXG4gICAgICBzdHlsZT17e1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnN1cmZhY2UsXG4gICAgICAgIGJvcmRlcjogYDFweCBzb2xpZCAke3RoZW1lLmJvcmRlcn1gLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTZweFwiLFxuICAgICAgICBib3hTaGFkb3c6IFwiMCA4cHggMzBweCByZ2JhKDI3LDQ5LDU3LDAuMDgpXCIsXG4gICAgICAgIGZvbnRGYW1pbHk6IHRoZW1lLmZvbnRGYW1pbHksXG4gICAgICAgIG1hcmdpbjogXCIwIGF1dG9cIixcbiAgICAgICAgbWF4V2lkdGg6IFwiNjIwcHhcIixcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxTZWN0aW9uIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogdGhlbWUuYWNjZW50LCBwYWRkaW5nOiBcIjIycHggMzBweFwiIH19PlxuICAgICAgICA8QnJhbmRNYXJrIHRoZW1lPXt0aGVtZX0gLz5cbiAgICAgIDwvU2VjdGlvbj5cbiAgICAgIDxTZWN0aW9uIHN0eWxlPXt7IHBhZGRpbmc6IFwiMzRweCAzNHB4IDI0cHhcIiB9fT5cbiAgICAgICAgPEhlYWRpbmdcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgY29sb3I6IHRoZW1lLmZvcmVncm91bmQsXG4gICAgICAgICAgICBmb250U2l6ZTogXCIyOHB4XCIsXG4gICAgICAgICAgICBsZXR0ZXJTcGFjaW5nOiBcIi0wLjVweFwiLFxuICAgICAgICAgICAgbGluZUhlaWdodDogXCIxLjJcIixcbiAgICAgICAgICAgIG1hcmdpbjogXCIwIDAgMjRweFwiLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7c3ViamVjdH1cbiAgICAgICAgPC9IZWFkaW5nPlxuICAgICAgICA8RW52ZWxvcGVIZWFkZXJzIGhlYWRlcnM9e2hlYWRlcnN9IHRoZW1lPXt0aGVtZX0gLz5cbiAgICAgICAgPEVtYWlsQm9keSBib2R5PXtib2R5fSBicmFuZD17dGhlbWV9IC8+XG4gICAgICA8L1NlY3Rpb24+XG4gICAgICA8SHIgc3R5bGU9e3sgYm9yZGVyQ29sb3I6IHRoZW1lLmJvcmRlciwgbWFyZ2luOiAwIH19IC8+XG4gICAgICA8U2VjdGlvbiBzdHlsZT17eyBwYWRkaW5nOiBcIjIwcHggMzRweCAyNnB4XCIgfX0+XG4gICAgICAgIDxUZXh0XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5tdXRlZCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBcIjEycHhcIixcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMS41NVwiLFxuICAgICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7Zm9vdGVyID8/IHRoZW1lLnRhZ2xpbmV9e1wiIFwifVxuICAgICAgICAgIHt0aGVtZS53ZWJzaXRlID8gKFxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj17dGhlbWUud2Vic2l0ZX1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUuYWNjZW50LFxuICAgICAgICAgICAgICAgIHRleHREZWNvcmF0aW9uOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3RoZW1lLm5hbWV9XG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvU2VjdGlvbj5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKTtcbn07XG5cbi8qKiBDb21wbGV0ZSByZXNwb25zaXZlLCBicmFuZGVkIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsRG9jdW1lbnQgPSAocHJvcHM6IEVtYWlsRG9jdW1lbnRQcm9wcykgPT4ge1xuICBjb25zdCB0aGVtZSA9IHJlc29sdmVFbWFpbEJyYW5kKHByb3BzLmJyYW5kKTtcbiAgY29uc3QgcGFnZVN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuYmFja2dyb3VuZCxcbiAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiBcIjI4cHggMTJweFwiLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxIdG1sIGxhbmc9XCJlblwiPlxuICAgICAgPEhlYWQgLz5cbiAgICAgIDxQcmV2aWV3Pntwcm9wcy5zdWJqZWN0ID8/IFwiTWVzc2FnZVwifTwvUHJldmlldz5cbiAgICAgIDxCb2R5IHN0eWxlPXtwYWdlU3R5bGV9PlxuICAgICAgICA8RW1haWxDYXJkIHsuLi5wcm9wc30gLz5cbiAgICAgIDwvQm9keT5cbiAgICA8L0h0bWw+XG4gICk7XG59O1xuIl19
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "typescript": "^5.9.3"
25
25
  },
26
26
  "dependencies": {
27
- "@dbx-tools/shared-core": "0.6.53",
27
+ "@dbx-tools/shared-core": "0.6.55",
28
28
  "@react-email/components": "^1.0.12",
29
29
  "react": "^19.2.4"
30
30
  },
@@ -42,7 +42,7 @@
42
42
  "./package.json": "./package.json"
43
43
  }
44
44
  },
45
- "version": "0.6.53",
45
+ "version": "0.6.55",
46
46
  "types": "./lib/index.d.ts",
47
47
  "type": "module",
48
48
  "exports": {
package/src/template.tsx CHANGED
@@ -5,11 +5,6 @@
5
5
  * the body component is reused directly by browser approval and compose views.
6
6
  * Both default to the repository brand while accepting a consumer override.
7
7
  *
8
- * {@link autofillTrailer} + the document's `trailer` prop cover Apple's
9
- * domain-bound one-time-code AutoFill, which requires `@<domain> #<code>` to be
10
- * the message's final line - hence a document-level prop rather than something a
11
- * caller can append to `body`.
12
- *
13
8
  * @module
14
9
  */
15
10
  import { brand, type BrandContext } from "@dbx-tools/shared-core";
@@ -200,60 +195,8 @@ export interface EmailDocumentProps extends EmailBodyProps {
200
195
  subject?: string;
201
196
  headers?: ReadonlyArray<readonly [string, string]>;
202
197
  footer?: string;
203
- /**
204
- * A machine-read line emitted as the very LAST line of both MIME parts, after
205
- * the branded footer and outside the card.
206
- *
207
- * This exists for Apple's domain-bound one-time-code AutoFill, whose format is
208
- * `@<domain> #<code>` and which iOS only honours when it is the final line of
209
- * the message - so it cannot be appended to `body`, which the branded footer
210
- * would then follow. Rendered as visible-but-quiet text rather than hidden
211
- * (`display: none` content is a spam signal, and a client that ignores the
212
- * convention should show something innocuous rather than nothing).
213
- *
214
- * See {@link autofillTrailer}, which builds the string.
215
- */
216
- trailer?: string;
217
198
  }
218
199
 
219
- /**
220
- * Apple's domain-bound AutoFill trailer, `@<domain> #<code>`, or `undefined`
221
- * when either part is missing.
222
- *
223
- * iOS reads this to bind a code to a specific WEBSITE: with it, the keyboard
224
- * offers the code only for the matching domain, which is what stops a code
225
- * phished from one site being autofilled into another. Without it, iOS still
226
- * detects a code heuristically from the conventional layout (prompt line, bare
227
- * code alone on the next line), as do Gmail, Outlook, and Android - so this is a
228
- * strict upgrade on top of that baseline, never a replacement for it.
229
- *
230
- * The domain is normalized to bare host form: a scheme, a `www.` prefix, any
231
- * path, and a trailing dot are stripped, since iOS matches the host the site is
232
- * served from. A domain with no dot (`localhost`) is rejected - it cannot be the
233
- * public host of a real deployment, and a trailer iOS will never match is just a
234
- * confusing line in the email.
235
- *
236
- * @example
237
- * autofillTrailer("demo.apps.dbx.tools", "123456"); // "@demo.apps.dbx.tools #123456"
238
- * autofillTrailer("https://www.example.com/app", "123456"); // "@example.com #123456"
239
- */
240
- export const autofillTrailer = (
241
- domain: string | undefined,
242
- code: string | undefined,
243
- ): string | undefined => {
244
- if (!domain || !code) return undefined;
245
- const host = domain
246
- .trim()
247
- .toLowerCase()
248
- .replace(/^[a-z][a-z\d+.-]*:\/\//, "")
249
- .replace(/^www\./, "")
250
- .replace(/[/?#].*$/, "")
251
- .replace(/\.$/, "")
252
- .replace(/:\d+$/, "");
253
- if (!host.includes(".")) return undefined;
254
- return `@${host} #${code.trim()}`;
255
- };
256
-
257
200
  function BrandMark({ theme }: { theme: ResolvedEmailBrand }): React.ReactNode {
258
201
  if (theme.logoUrl) {
259
202
  return (
@@ -387,38 +330,6 @@ export const EmailCard = ({
387
330
  );
388
331
  };
389
332
 
390
- /**
391
- * The machine-read trailer line, rendered LAST and outside the card.
392
- *
393
- * Deliberately the final element of `<Body>`: iOS only binds a code to a domain
394
- * when `@<domain> #<code>` is the last line of the message, so nothing - not even
395
- * the branded footer - may follow it. Styled small and muted rather than hidden,
396
- * because `display: none` text is a spam-filter signal.
397
- */
398
- function AutofillTrailer({
399
- trailer,
400
- theme,
401
- }: {
402
- trailer?: string;
403
- theme: ResolvedEmailBrand;
404
- }): React.ReactNode {
405
- if (!trailer) return null;
406
- return (
407
- <Text
408
- style={{
409
- color: theme.muted,
410
- fontFamily: theme.fontFamily,
411
- fontSize: "11px",
412
- margin: "16px auto 0",
413
- maxWidth: "620px",
414
- textAlign: "center",
415
- }}
416
- >
417
- {trailer}
418
- </Text>
419
- );
420
- }
421
-
422
333
  /** Complete responsive, branded React Email document. */
423
334
  export const EmailDocument = (props: EmailDocumentProps) => {
424
335
  const theme = resolveEmailBrand(props.brand);
@@ -434,7 +345,6 @@ export const EmailDocument = (props: EmailDocumentProps) => {
434
345
  <Preview>{props.subject ?? "Message"}</Preview>
435
346
  <Body style={pageStyle}>
436
347
  <EmailCard {...props} />
437
- <AutofillTrailer trailer={props.trailer} theme={theme} />
438
348
  </Body>
439
349
  </Html>
440
350
  );